From 80e2389dd8fbe88e4127f9df638bfd4fe8d10040 Mon Sep 17 00:00:00 2001 From: Gabriele Cosmo Date: Fri, 10 Dec 2021 14:46:44 +0100 Subject: [PATCH] Import Geant4 11.0.0 source tree --- CMakeLists.txt | 6 +- CONTRIBUTING.rst | 16 +- README.rst | 41 +- ReleaseNotes/Beta4.11.0-1.txt | 8 +- ReleaseNotes/Patch4.10.7-3.txt | 158 + ReleaseNotes/ReleaseNotes.11.0.html | 3404 ++ cmake/History | 88 +- cmake/Modules/FindAIDA.cmake | 55 - cmake/Modules/G4BuildSettings.cmake | 2 +- cmake/Modules/G4CPack.cmake | 154 +- cmake/Modules/G4CTest.cmake | 2 +- cmake/Modules/G4ClangFormat.cmake | 23 +- cmake/Modules/G4ConfigureCMakeHelpers.cmake | 2 +- cmake/Modules/G4ConfigureGNUMakeHelpers.cmake | 54 +- cmake/Modules/G4DatasetDefinitions.cmake | 12 +- cmake/Modules/G4DeveloperAPI.cmake | 33 +- cmake/Modules/G4GitUtilities.cmake | 97 + cmake/Modules/G4HDF5Shim.cmake | 16 +- cmake/Modules/G4InterfaceOptions.cmake | 93 +- cmake/Modules/G4OptionalComponents.cmake | 32 +- cmake/Modules/G4TestDriver.cmake | 8 +- cmake/Templates/CMakeCPackOptions.cmake.in | 19 +- cmake/Templates/Geant4Config.cmake.in | 128 +- cmake/Templates/UseGeant4_internal.cmake | 163 +- cmake/Templates/geant4-config.in | 9 +- .../geant4_validate_sources.cmake.in | 1 - cmake/Templates/geant4make-skeleton.in | 25 +- .../Templates/source_package_extras.cmake.in | 23 + config/G4UI_BUILD.gmk | 1 - config/G4UI_USE.gmk | 7 - config/G4VIS_BUILD.gmk | 16 - config/G4VIS_USE.gmk | 7 +- config/History | 115 +- config/architecture.gmk | 4 +- config/common.gmk | 7 +- config/sys/Darwin-clang.gmk | 2 +- config/sys/Darwin-g++.gmk | 2 +- config/sys/Linux-clang.gmk | 18 +- config/sys/Linux-g++.gmk | 18 +- config/sys/Linux-icc.gmk | 18 +- config/sys/WIN32-g++.gmk | 2 +- environments/History | 3 + environments/MOMO/000README | 22 - environments/MOMO/History | 66 - environments/MOMO/MOMO.jar | Bin 562892 -> 0 bytes environments/MOMO/PDG.xml | 423 - environments/MOMO/ReleaseNote | 57 - environments/MOMO/dicom.xml | 187 - environments/MOMO/momo-src.jar | Bin 532895 -> 0 bytes environments/g4py/CMakeLists.txt | 2 +- environments/g4py/G4PythonHelpers.cmake | 2 +- environments/g4py/History | 17 + environments/g4py/README.md | 78 - environments/g4py/examples/README | 33 - .../g4py/examples/education/lesson1/README | 54 - .../g4py/examples/education/lesson2/README | 82 - environments/g4py/source/__init__.py | 4 - .../g4py/source/geometry/pyG4Sphere.cc | 4 +- environments/g4py/source/geometry/pyG4Tubs.cc | 5 - .../source/materials/pyG4ElementVector.cc | 1 + .../g4py/source/materials/pymodG4materials.cc | 4 +- .../g4py/source/visualization/CMakeLists.txt | 4 +- .../g4py/source/visualization/pyG4HepRep.cc | 45 - .../source/visualization/pyG4VRML1File.cc | 45 - .../visualization/pymodG4visualization.cc | 6 +- environments/g4py/tests/CMakeLists.txt | 10 - environments/g4py/tests/History | 57 - environments/g4py/tests/README.md | 45 - .../g4py/tests/g4pytest/CMakeLists.txt | 35 - .../tests/g4pytest/EMSTDpl/CMakeLists.txt | 4 - .../g4pytest/EMSTDpl/PhysicsListEMstd.cc | 133 - .../g4py/tests/g4pytest/EMSTDpl/__init__.py | 1 - .../tests/g4pytest/ExN01geom/CMakeLists.txt | 4 - .../ExN01geom/ExN01DetectorConstruction.cc | 155 - .../ExN01geom/ExN01DetectorConstruction.hh | 73 - .../g4py/tests/g4pytest/ExN01geom/__init__.py | 1 - .../tests/g4pytest/ExN01geom/pyExN01geom.cc | 71 - .../tests/g4pytest/ExN01pl/CMakeLists.txt | 4 - .../g4pytest/ExN01pl/ExN01PhysicsList.cc | 77 - .../g4pytest/ExN01pl/ExN01PhysicsList.hh | 56 - .../g4py/tests/g4pytest/ExN01pl/__init__.py | 1 - .../g4py/tests/g4pytest/ExN01pl/pyExN01pl.cc | 75 - .../tests/g4pytest/ExN03geom/CMakeLists.txt | 4 - .../ExN03geom/ExN03DetectorConstruction.cc | 473 - .../ExN03geom/ExN03DetectorConstruction.hh | 157 - .../ExN03geom/ExN03DetectorMessenger.cc | 148 - .../g4py/tests/g4pytest/ExN03geom/__init__.py | 1 - .../tests/g4pytest/ExN03geom/pyExN03geom.cc | 101 - .../g4py/tests/g4pytest/MCScore/mcscore.py | 136 - .../tests/g4pytest/MCScore/mcscorerootio.py | 189 - .../g4py/tests/g4pytest/MCScore/reaction.dat | 1842 - .../tests/g4pytest/MedicalBeam/CMakeLists.txt | 4 - .../tests/g4pytest/MedicalBeam/MedicalBeam.cc | 136 - .../tests/g4pytest/MedicalBeam/MedicalBeam.hh | 143 - .../tests/g4pytest/MedicalBeam/__init__.py | 1 - .../g4pytest/MedicalBeam/pyMedicalBeam.cc | 162 - .../g4pytest/NISTmaterials/CMakeLists.txt | 4 - .../tests/g4pytest/NISTmaterials/__init__.py | 1 - .../g4pytest/NISTmaterials/pyNISTmaterials.cc | 49 - .../tests/g4pytest/ParticleGun/CMakeLists.txt | 4 - .../g4pytest/ParticleGun/ParticleGunAction.cc | 60 - .../tests/g4pytest/ParticleGun/__init__.py | 1 - .../g4pytest/ParticleGun/pyParticleGun.cc | 79 - .../g4py/tests/g4pytest/Qgeom/CMakeLists.txt | 4 - .../g4pytest/Qgeom/QDetectorConstruction.cc | 144 - .../g4pytest/Qgeom/QDetectorConstruction.hh | 52 - .../g4py/tests/g4pytest/Qgeom/__init__.py | 1 - .../g4py/tests/g4pytest/Qgeom/pyQgeom.cc | 71 - .../tests/g4pytest/Qmaterials/CMakeLists.txt | 4 - .../tests/g4pytest/Qmaterials/Qmaterials.cc | 142 - .../tests/g4pytest/Qmaterials/__init__.py | 1 - .../tests/g4pytest/Qmaterials/pyQmaterials.cc | 49 - environments/g4py/tests/g4pytest/__init__.py | 3 - .../g4pytest/emcalculator/emcalculator.py | 149 - .../g4py/tests/g4pytest/ezgeom/CMakeLists.txt | 10 - .../g4py/tests/g4pytest/ezgeom/G4EzVolume.cc | 311 - .../g4py/tests/g4pytest/ezgeom/G4EzVolume.hh | 165 - .../ezgeom/G4EzVoxelParameterization.cc | 89 - .../g4py/tests/g4pytest/ezgeom/G4EzWorld.cc | 137 - .../g4py/tests/g4pytest/ezgeom/G4EzWorld.hh | 75 - .../g4py/tests/g4pytest/ezgeom/__init__.py | 1 - .../g4py/tests/g4pytest/ezgeom/pyEzgeom.cc | 158 - .../g4py/tests/gtest01/CMakeLists.txt | 4 - environments/g4py/tests/gtest01/gun.mac | 8 - .../g4py/tests/gtest01/module/CMakeLists.txt | 16 - .../tests/gtest01/module/PhysicsListEMstd.cc | 121 - .../tests/gtest01/module/PhysicsListEMstd.hh | 53 - .../gtest01/module/QDetectorConstruction.cc | 144 - .../gtest01/module/QDetectorConstruction.hh | 52 - .../g4py/tests/gtest01/module/QMaterials.cc | 163 - .../g4py/tests/gtest01/module/QPhysicsList.cc | 72 - .../g4py/tests/gtest01/module/QPhysicsList.hh | 51 - .../gtest01/module/QPrimaryGeneratorAction.hh | 63 - .../g4py/tests/gtest01/module/gtest01.cc | 73 - environments/g4py/tests/gtest01/root_test.py | 143 - environments/g4py/tests/gtest01/run.py | 123 - environments/g4py/tests/gtest01/test.py | 118 - environments/g4py/tests/gtest01/vis.mac | 16 - environments/g4py/tests/gtest01/vrml.mac | 11 - .../g4py/tests/gtest02/CMakeLists.txt | 3 - environments/g4py/tests/gtest02/gun.mac | 8 - environments/g4py/tests/gtest02/run.py | 133 - environments/g4py/tests/gtest02/test.py | 133 - environments/g4py/tests/gtest02/vis.mac | 16 - .../g4py/tests/gtest03/CMakeLists.txt | 3 - environments/g4py/tests/gtest03/gun.mac | 8 - environments/g4py/tests/gtest03/run.py | 100 - environments/g4py/tests/gtest03/test.py | 100 - environments/g4py/tests/gtest03/test_voxel.py | 85 - environments/g4py/tests/gtest03/vis.mac | 15 - .../g4py/tests/gtest04/CMakeLists.txt | 3 - environments/g4py/tests/gtest04/test.py | 36 - .../g4py/tests/gtest05/CMakeLists.txt | 3 - environments/g4py/tests/gtest05/test.py | 311 - .../g4py/tests/gtest05/vrml/g4box.wrl | 102 - .../g4py/tests/gtest05/vrml/g4cons.wrl | 222 - .../g4py/tests/gtest05/vrml/g4ellipsoid.wrl | 403 - .../tests/gtest05/vrml/g4ellipticalcone.wrl | 210 - .../tests/gtest05/vrml/g4ellipticaltube.wrl | 210 - .../g4py/tests/gtest05/vrml/g4hype.wrl | 2392 -- .../g4py/tests/gtest05/vrml/g4orb.wrl | 643 - .../g4py/tests/gtest05/vrml/g4para.wrl | 102 - .../g4py/tests/gtest05/vrml/g4polycone.wrl | 505 - .../g4py/tests/gtest05/vrml/g4polyhedra.wrl | 160 - .../g4py/tests/gtest05/vrml/g4sphere.wrl | 690 - .../g4py/tests/gtest05/vrml/g4tet.wrl | 96 - .../g4py/tests/gtest05/vrml/g4torus.wrl | 760 - .../g4py/tests/gtest05/vrml/g4trap.wrl | 102 - .../g4py/tests/gtest05/vrml/g4trd.wrl | 102 - .../g4py/tests/gtest05/vrml/g4tubs.wrl | 190 - .../g4py/tests/gtest05/vrml/g4twistedbox.wrl | 198 - .../g4py/tests/gtest05/vrml/g4twistedtrap.wrl | 198 - .../g4py/tests/gtest05/vrml/g4twistedtrd.wrl | 198 - .../g4py/tests/gtest05/vrml/g4twistedtubs.wrl | 566 - .../g4py/tests/gtest06/CMakeLists.txt | 3 - .../g4py/tests/gtest06/jpg/intersection.jpg | Bin 18138 -> 0 bytes .../g4py/tests/gtest06/jpg/subtraction.jpg | Bin 31923 -> 0 bytes environments/g4py/tests/gtest06/jpg/union.jpg | Bin 30020 -> 0 bytes environments/g4py/tests/gtest06/test.py | 126 - .../g4py/tests/gtest07/CMakeLists.txt | 3 - environments/g4py/tests/gtest07/test.py | 80 - .../g4py/tests/gtest08/CMakeLists.txt | 3 - environments/g4py/tests/gtest08/test.py | 74 - environments/zmq/History | 3 + environments/zmq/README.md | 14 - environments/zmq/zmq/G4ZMQServer.cc | 6 +- examples/.README.HowToRun | 123 - examples/.README.HowToRun.txt | 123 - examples/.README.HowToRunMT | 92 - examples/.README.HowToRunMT.txt | 92 - examples/.doxygen/.README.HowToNavigate.txt | 24 - examples/.doxygen/.README.novice.txt | 25 - examples/.doxygen/Doxyfile | 102 +- examples/.doxygen/Doxymain.h | 2 +- examples/.doxygen/Doxymodules_analysis.h | 9 - examples/.doxygen/Doxymodules_basic.h | 157 +- .../.doxygen/Doxymodules_eventgenerator.h | 9 + examples/.doxygen/Doxymodules_geometry.h | 13 + examples/.doxygen/Doxymodules_hadronic.h | 18 + examples/.doxygen/Doxymodules_medical.h | 21 + examples/.doxygen/Doxymodules_runAndEvent.h | 11 + examples/.doxygen/History | 15 + examples/.doxygen/README | 25 - examples/.doxygen/generate_standalone.sh | 4 +- examples/CMakeLists.txt | 2 +- examples/History | 105 + examples/README | 180 - examples/README.HowToRun | 115 - examples/README.HowToRunMT | 87 - examples/advanced/CMakeLists.txt | 2 +- examples/advanced/CaTS/CMakeLists.txt | 123 + examples/advanced/CaTS/CaTS.cc | 236 + examples/advanced/CaTS/Examples.md | 31 + examples/advanced/CaTS/History | 14 + examples/advanced/CaTS/Instructions.md | 301 + examples/advanced/CaTS/authors.txt | 14 + .../advanced/CaTS/gdml/DiamondTarget.gdml | 41 + examples/advanced/CaTS/gdml/LArTPC.gdml | 466 + .../advanced/CaTS/gdml/SimpleExtension.xsd | 78 + .../advanced/CaTS/gdml/crystalcal_pbwo.gdml | 619 + .../gdml/homogeneous_pbwo_crystalcal.gdml | 84 + examples/advanced/CaTS/gdml/simpleLArTPC.gdml | 144 + examples/advanced/CaTS/images/CaTS.png | Bin 0 -> 75039 bytes examples/advanced/CaTS/images/CaloHistos.png | Bin 0 -> 112989 bytes examples/advanced/CaTS/images/display.png | Bin 0 -> 157701 bytes examples/advanced/CaTS/images/mscHistos.png | Bin 0 -> 147761 bytes examples/advanced/CaTS/images/position.png | Bin 0 -> 66753 bytes .../CaTS/include/ActionInitialization.hh | 55 + examples/advanced/CaTS/include/CaTSClasses.hh | 63 + examples/advanced/CaTS/include/CaTSVersion.hh | 63 + .../advanced/CaTS/include/CalorimeterHit.hh | 105 + .../advanced/CaTS/include/CalorimeterSD.hh | 64 + .../advanced/CaTS/include/ColorReader.hh | 56 +- .../CaTS/include/ConfigurationManager.hh | 105 + .../advanced/CaTS/include/DRCalorimeterHit.hh | 109 + .../advanced/CaTS/include/DRCalorimeterSD.hh | 67 + .../CaTS/include/DetectorConstruction.hh | 69 + examples/advanced/CaTS/include/Event.hh | 65 + .../advanced/CaTS/include/EventAction.hh | 53 +- .../advanced/CaTS/include/InteractionHit.hh | 97 + .../advanced/CaTS/include/InteractionSD.hh | 68 + examples/advanced/CaTS/include/MscHit.hh | 98 + examples/advanced/CaTS/include/MscSD.hh | 68 + .../advanced/CaTS/include/ParticleChange.hh | 50 +- examples/advanced/CaTS/include/PhotonHit.hh | 122 + examples/advanced/CaTS/include/PhotonSD.hh | 80 + .../CaTS/include/PhysicsConfigurator.hh | 49 +- .../CaTS/include/PrimaryGeneratorAction.hh | 111 + examples/advanced/CaTS/include/RadiatorSD.hh | 112 + .../advanced/CaTS/include/RootIO.hh | 73 +- examples/advanced/CaTS/include/RunAction.hh | 58 + .../advanced/CaTS/include/StackingAction.hh | 67 + .../include/TrackInfo.hh} | 35 +- examples/advanced/CaTS/include/TrackerHit.hh | 100 + examples/advanced/CaTS/include/TrackerSD.hh | 67 + examples/advanced/CaTS/include/lArTPCHit.hh | 102 + examples/advanced/CaTS/include/lArTPCSD.hh | 99 + .../CaTS/macros}/init_vis.mac | 4 +- examples/advanced/CaTS/macros/msc.mac | 12 + examples/advanced/CaTS/macros/pip_IO_Calo.mac | 16 + examples/advanced/CaTS/macros/pip_IO_DR.mac | 23 + examples/advanced/CaTS/macros/test_G4.mac | 18 + examples/advanced/CaTS/macros/time.mac | 25 + examples/advanced/CaTS/macros/time_G4.mac | 19 + examples/advanced/CaTS/macros/vis.mac | 82 + .../advanced/CaTS/modules/CaTSCXXFlags.cmake | 64 + examples/advanced/CaTS/readCalorimeterHits.cc | 131 + .../advanced/CaTS/readDRCalorimeterHits.cc | 140 + examples/advanced/CaTS/readMscHits.cc | 109 + examples/advanced/CaTS/readPhotonHits.cc | 125 + examples/advanced/CaTS/scripts/check.sh | 38 + examples/advanced/CaTS/scripts/hit.py | 39 + examples/advanced/CaTS/scripts/run.sh | 52 + .../advanced/CaTS/src/ActionInitialization.cc | 47 +- examples/advanced/CaTS/src/CalorimeterHit.cc | 106 + examples/advanced/CaTS/src/CalorimeterSD.cc | 128 + examples/advanced/CaTS/src/ColorReader.cc | 238 + .../advanced/CaTS/src/ConfigurationManager.cc | 137 + .../advanced/CaTS/src/DRCalorimeterHit.cc | 109 + examples/advanced/CaTS/src/DRCalorimeterSD.cc | 154 + .../advanced/CaTS/src/DetectorConstruction.cc | 309 + .../src/Event.cc} | 40 +- examples/advanced/CaTS/src/EventAction.cc | 266 + .../advanced/CaTS/src/InteractionHit.cc | 80 +- examples/advanced/CaTS/src/InteractionSD.cc | 138 + .../advanced/CaTS/src/MscHit.cc | 67 +- examples/advanced/CaTS/src/MscSD.cc | 101 + examples/advanced/CaTS/src/PhotonHit.cc | 118 + examples/advanced/CaTS/src/PhotonSD.cc | 154 + .../advanced/CaTS/src/PhysicsConfigurator.cc | 146 + .../CaTS/src/PrimaryGeneratorAction.cc | 103 + examples/advanced/CaTS/src/RadiatorSD.cc | 265 + examples/advanced/CaTS/src/RootIO.cc | 174 + examples/advanced/CaTS/src/RunAction.cc | 149 + examples/advanced/CaTS/src/StackingAction.cc | 124 + examples/advanced/CaTS/src/TrackerHit.cc | 96 + examples/advanced/CaTS/src/TrackerSD.cc | 95 + .../advanced/CaTS/src/lArTPCHit.cc | 86 +- examples/advanced/CaTS/src/lArTPCSD.cc | 324 + examples/advanced/CaTS/xml/selection.xml | 23 + .../advanced/ChargeExchangeMC/CMakeLists.txt | 2 +- .../ChargeExchangeMC/ChargeExchangeMC.out | 1202 +- examples/advanced/ChargeExchangeMC/History | 3 + examples/advanced/ChargeExchangeMC/README | 104 - .../ChargeExchangeMC/doc/CexmcSetupImages.pdf | Bin 721387 -> 0 bytes .../ChargeExchangeMC/doc/CexmcUsersManual.pdf | Bin 544235 -> 0 bytes .../ChargeExchangeMC/src/CexmcSetup.cc | 4 +- .../advanced/HGCal_testbeam/CMakeLists.txt | 2 +- examples/advanced/HGCal_testbeam/History | 12 + examples/advanced/HGCal_testbeam/README | 227 - .../include/PrimaryGeneratorAction.hh | 2 +- .../HGCal_testbeam/src/EventAction.cc | 2 +- .../advanced/HGCal_testbeam/src/RunAction.cc | 5 +- .../ICRP110_HumanPhantoms/CMakeLists.txt | 4 +- .../ICRP110_HumanPhantoms/ColourMap.dat | 76 +- .../advanced/ICRP110_HumanPhantoms/History | 24 + .../advanced/ICRP110_HumanPhantoms/README | 286 - .../advanced/ICRP110_HumanPhantoms/female.in | 5 +- .../ICRP110_HumanPhantoms/female_head.in | 5 +- .../ICRP110_HumanPhantoms/female_trunk.in | 6 +- .../g4views/g4_00.g4view | 14 +- .../g4views/g4_01.g4view | 14 +- .../ICRP110PhantomActionInitialization.hh | 3 +- .../include/ICRP110PhantomAnalysisManager.hh | 32 - .../include/ICRP110PhantomConstruction.hh | 13 +- .../include/ICRP110PhantomMessenger.hh | 4 +- .../ICRP110PhantomNestedParameterisation.hh | 2 +- .../ICRP110PhantomPrimaryGeneratorAction.hh | 4 +- .../include/ICRP110ScoreWriterMessenger.hh | 5 +- .../include/ICRP110UserScoreWriter.hh | 2 +- .../advanced/ICRP110_HumanPhantoms/male.in | 10 +- .../ICRP110_HumanPhantoms/male_head.in | 11 +- .../ICRP110_HumanPhantoms/male_trunk.in | 11 +- .../src/ICRP110PhantomConstruction.cc | 26 +- .../src/ICRP110PhantomMaterial_Female.cc | 2 +- .../src/ICRP110PhantomMaterial_Male.cc | 2 +- .../src/ICRP110UserScoreWriter.cc | 194 +- .../advanced/ICRP110_HumanPhantoms/vis.mac | 39 +- examples/advanced/README | 17 - examples/advanced/STCyclotron/CMakeLists.txt | 2 +- examples/advanced/STCyclotron/History | 14 + examples/advanced/STCyclotron/README | 323 - examples/advanced/STCyclotron/STCyclotron.cc | 1 - .../include/STCyclotronAnalysis.hh | 38 - .../STCyclotron/src/STCyclotronRun.cc | 7 +- .../STCyclotron/src/STCyclotronRunAction.cc | 4 +- .../src/STCyclotronSensitiveFoil.cc | 2 +- .../src/STCyclotronSensitiveTarget.cc | 2 +- examples/advanced/air_shower/CMakeLists.txt | 2 +- examples/advanced/air_shower/History | 18 + examples/advanced/air_shower/README | 121 - examples/advanced/air_shower/Ultra.cc | 5 +- examples/advanced/air_shower/air_shower.out | 253 +- .../air_shower/include/UltraPhysicsList.hh | 7 +- .../air_shower/src/UltraActionInitializer.cc | 11 +- .../src/UltraDetectorConstruction.cc | 298 +- .../air_shower/src/UltraEventAction.cc | 50 +- .../air_shower/src/UltraFresnelLens.cc | 61 +- .../src/UltraFresnelLensParameterisation.cc | 35 +- .../advanced/air_shower/src/UltraPMTSD.cc | 42 +- .../air_shower/src/UltraPhysicsList.cc | 26 +- .../src/UltraPrimaryGeneratorAction.cc | 32 +- .../advanced/air_shower/src/UltraRunAction.cc | 31 +- examples/advanced/amsEcal/CMakeLists.txt | 2 +- examples/advanced/amsEcal/History | 10 + examples/advanced/amsEcal/README | 132 - .../advanced/amsEcal/include/HistoManager.hh | 3 +- examples/advanced/amsEcal/run1.out | 216 +- examples/advanced/amsEcal/src/HistoManager.cc | 2 +- examples/advanced/brachytherapy/Brachy.cc | 3 - .../advanced/brachytherapy/CMakeLists.txt | 2 +- examples/advanced/brachytherapy/History | 16 + examples/advanced/brachytherapy/README | 192 - .../advanced/brachytherapy/brachytherapy.out | 299 +- .../src/BrachyPrimaryGeneratorAction.cc | 2 +- .../brachytherapy/src/BrachyRunAction.cc | 2 +- .../brachytherapy/src/BrachySteppingAction.cc | 4 +- .../src/BrachyUserScoreWriter.cc | 2 +- .../test_macro/FlexiSourceMacro_livermore.mac | 30 - .../test_macro/FlexiSourceMacro_opt0.mac | 30 - .../test_macro/FlexiSourceMacro_opt3.mac | 30 - .../test_macro/FlexiSourceMacro_opt4.mac | 30 - .../test_macro/FlexiSourceMacro_penelope.mac | 29 - .../test_macro/iridium_source_primary.mac | 129 - .../composite_calorimeter/CMakeLists.txt | 2 +- .../CompositeCalorimeter.cc | 3 +- .../advanced/composite_calorimeter/History | 16 + .../advanced/composite_calorimeter/README | 519 - .../composite_calorimeter.out | 458 +- .../include/CCalAnalysis.hh | 44 - .../src/CCalEventAction.cc | 5 +- .../src/CCalRotationMatrixFactory.cc | 2 +- .../src/CCalRunAction.cc | 4 +- .../src/CCalSteppingAction.cc | 4 +- .../composite_calorimeter/src/CCalutils.cc | 2 +- examples/advanced/doiPET/CMakeLists.txt | 196 +- examples/advanced/doiPET/History | 20 + examples/advanced/doiPET/README | 112 - examples/advanced/doiPET/analysis.cpp | 144 + examples/advanced/doiPET/doiPET.cc | 84 +- .../include/doiPETActionInitialization.hh | 6 +- .../advanced/doiPET/include/doiPETAnalysis.hh | 69 +- .../include/doiPETDetectorConstruction.hh | 340 +- .../doiPETDetectorConstructionMessenger.hh | 1 + .../doiPET/include/doiPETEventAction.hh | 12 +- examples/advanced/doiPET/include/doiPETRun.hh | 17 +- .../doiPET/include/doiPETRunAction.hh | 14 +- examples/advanced/doiPET/inputParameter.txt | 19 +- examples/advanced/doiPET/run.mac | 31 +- .../run_imageQualityPhantom_wholeBody.mac | 8 +- examples/advanced/doiPET/run_sensitivity.mac | 17 +- .../advanced/doiPET/run_spatialResolution.mac | 2 +- .../doiPET/src/doiPETActionInitialization.cc | 18 +- .../advanced/doiPET/src/doiPETAnalysis.cc | 519 +- .../doiPET/src/doiPETDetectorConstruction.cc | 995 +- .../doiPETDetectorConstructionMessenger.cc | 11 + examples/advanced/doiPET/src/doiPETRun.cc | 32 +- .../advanced/doiPET/src/doiPETRunAction.cc | 21 +- .../doiPET/src/doiPETSteppingAction.cc | 15 +- examples/advanced/eRosita/CMakeLists.txt | 5 +- examples/advanced/eRosita/History | 10 +- examples/advanced/eRosita/README.txt | 215 - .../advanced/eRosita/TrackerPhotonEnergy.out | 74 +- .../include/eRositaActionInitialization.hh | 45 + .../include/eRositaDetectorConstruction.hh | 7 +- .../application/include/eRositaEventAction.hh | 4 - .../application/include/eRositaPhysicsList.hh | 4 - .../include/eRositaPrimaryGeneratorAction.hh | 8 +- .../application/include/eRositaRunAction.hh | 7 - .../application/include/eRositaTrackerHit.hh | 23 +- .../src/eRositaActionInitialization.cc | 52 +- .../src/eRositaDetectorConstruction.cc | 24 +- .../application/src/eRositaEventAction.cc | 11 +- .../application/src/eRositaPhysicsList.cc | 2 +- .../src/eRositaPrimaryGeneratorAction.cc | 16 +- .../application/src/eRositaRunAction.cc | 57 +- .../application/src/eRositaSteppingAction.cc | 3 +- .../application/src/eRositaSteppingVerbose.cc | 6 +- .../application/src/eRositaTrackerHit.cc | 29 +- .../application/src/eRositaTrackerSD.cc | 36 +- examples/advanced/eRosita/eRosita.cc | 56 +- examples/advanced/eRosita/eRosita.in | 6 +- examples/advanced/eRosita/eRosita.out | 201 +- examples/advanced/eRosita/vis.mac | 2 +- examples/advanced/fastAerosol/CMakeLists.txt | 2 +- examples/advanced/fastAerosol/README.txt | 157 - examples/advanced/gammaknife/CMakeLists.txt | 2 +- examples/advanced/gammaknife/History | 2 + examples/advanced/gammaknife/README | 119 - examples/advanced/gammaknife/gammaknife.cc | 7 +- examples/advanced/gammaknife/gammaknife.out | 4246 +- .../gammaray_telescope/CMakeLists.txt | 4 +- .../gammaray_telescope/GammaRayTel.cc | 25 +- examples/advanced/gammaray_telescope/History | 22 + examples/advanced/gammaray_telescope/README | 309 - .../advanced/gammaray_telescope/emlowe.mac | 1 - .../advanced/gammaray_telescope/emstd.mac | 2 - .../gammaray_telescope/gammaraytel.in | 1 - .../gammaray_telescope/gammaraytel.out | 31887 ++++++++-------- .../gammaraytel_polarized.in | 33 - .../include/GammaRayTelAnalysis.hh | 6 +- .../include/GammaRayTelIonPhysics.hh | 67 - .../include/GammaRayTelMuonPhysics.hh | 95 - .../advanced/gammaray_telescope/macro2.mac | 1 - .../advanced/gammaray_telescope/macro6.mac | 5 +- ...physics_polarized.mac => physics_opt4.mac} | 2 +- .../physics_polarized_new.mac | 8 - .../gammaray_telescope/prerunGammaRayTel.mac | 12 +- .../src/GammaRayTelAnalysis.cc | 3 +- .../src/GammaRayTelEMlowePhysics.cc | 131 - .../src/GammaRayTelEMstdPhysics.cc | 102 - .../src/GammaRayTelHadronPhysics.cc | 310 - .../src/GammaRayTelIonPhysics.cc | 207 - .../src/GammaRayTelMuonPhysics.cc | 111 - .../src/GammaRayTelParticles.cc | 77 - .../src/GammaRayTelPhysicsList.cc | 2 +- .../src/GammaRayTelRunAction.cc | 16 +- examples/advanced/gorad/CMakeLists.txt | 2 +- examples/advanced/gorad/History | 16 + examples/advanced/gorad/README | 106 - .../gorad/include/GRActionInitialization.hh | 2 +- .../advanced/gorad/src/GRInitialization.cc | 2 + .../gorad/src/GRPrimGenActionMessenger.cc | 6 +- examples/advanced/gorad/src/GRRun.cc | 2 +- examples/advanced/gorad/src/GRRunAction.cc | 4 +- .../advanced/hadrontherapy/CMakeLists.txt | 2 +- examples/advanced/hadrontherapy/History | 13 + examples/advanced/hadrontherapy/README | 455 - .../experimentalData/proton/BraggPeak/README | 13 - .../hadrontherapy/include/HadrontherapyLet.hh | 1 - .../include/HadrontherapyMatrix.hh | 1 - .../hadrontherapy/src/HadrontherapyLet.cc | 3 +- .../hadrontherapy/src/HadrontherapyRBE.cc | 4 +- .../src/HadrontherapyRunAction.cc | 3 +- .../advanced/human_phantom/CMakeLists.txt | 2 +- examples/advanced/human_phantom/History | 15 + examples/advanced/human_phantom/README | 145 - .../advanced/human_phantom/human_phantom.out | 424 +- .../include/G4HumanPhantomAnalysisManager.hh | 2 +- .../src/G4HumanPhantomAnalysisManager.cc | 3 +- examples/advanced/iort_therapy/CMakeLists.txt | 2 +- examples/advanced/iort_therapy/README | 233 - .../advanced/iort_therapy/iort_therapy.out | 242 +- .../advanced/lAr_calorimeter/CMakeLists.txt | 2 +- examples/advanced/lAr_calorimeter/History | 13 + examples/advanced/lAr_calorimeter/README | 108 - examples/advanced/lAr_calorimeter/lArCal.cc | 23 +- .../lAr_calorimeter/lAr_calorimeter.out | 1103 +- .../lAr_calorimeter/src/FCALRunAction.cc | 7 +- .../lAr_calorimeter/src/FCALTBEventAction.cc | 2 +- .../advanced/medical_linac/CMakeLists.txt | 2 +- examples/advanced/medical_linac/README | 137 - .../advanced/medical_linac/medical_linac.out | 641 +- examples/advanced/medical_linac/totDose.txt | 394 +- examples/advanced/microbeam/CMakeLists.txt | 2 +- examples/advanced/microbeam/History | 14 + examples/advanced/microbeam/README | 173 - .../advanced/microbeam/include/Analysis.hh | 40 - examples/advanced/microbeam/microbeam.out | 268 +- .../advanced/microbeam/src/EventAction.cc | 2 +- examples/advanced/microbeam/src/RunAction.cc | 7 +- .../advanced/microbeam/src/SteppingAction.cc | 2 +- .../advanced/microelectronics/CMakeLists.txt | 2 +- examples/advanced/microelectronics/History | 26 + examples/advanced/microelectronics/README | 105 - .../microelectronics/include/Analysis.hh | 33 - .../include/DetectorConstruction.hh | 24 +- .../include/DetectorMessenger.hh} | 35 +- .../include/ElectronCapture.hh | 102 + .../include/MicroElecPhysics.hh | 81 + .../include/MicroElecSiPhysics.hh | 81 + .../microelectronics/microelectronics.cc | 45 +- .../microelectronics/microelectronics.in | 2 +- .../microelectronics/microelectronics.mac | 38 +- .../microelectronics/microelectronics.out | 239 +- examples/advanced/microelectronics/plot.C | 12 +- .../src/DetectorConstruction.cc | 109 +- .../src/DetectorMessenger.cc} | 69 +- .../microelectronics/src/ElectronCapture.cc | 133 + .../microelectronics/src/MicroElecPhysics.cc | 424 + .../src/MicroElecSiPhysics.cc | 317 + .../microelectronics/src/RunAction.cc | 10 +- .../microelectronics/src/SteppingAction.cc | 3 +- examples/advanced/nanobeam/CMakeLists.txt | 2 +- examples/advanced/nanobeam/History | 14 + examples/advanced/nanobeam/README | 137 - .../advanced/nanobeam/include/Analysis.hh | 34 - examples/advanced/nanobeam/nanobeam.out | 115 +- examples/advanced/nanobeam/results/README | 1 - examples/advanced/nanobeam/src/RunAction.cc | 7 +- .../advanced/nanobeam/src/SteppingAction.cc | 2 +- .../advanced/purging_magnet/CMakeLists.txt | 2 +- examples/advanced/purging_magnet/History | 10 + .../advanced/purging_magnet/MacroTesting.mac | 2 +- examples/advanced/purging_magnet/PurgMag.cc | 22 +- examples/advanced/purging_magnet/README | 122 - .../include/PurgMagPhysicsList.hh | 35 +- .../purging_magnet/purging_magnet.out | 535 +- .../purging_magnet/src/PurgMagEventAction.cc | 19 - .../purging_magnet/src/PurgMagPhysicsList.cc | 158 +- .../purging_magnet/src/PurgMagRunAction.cc | 4 +- .../src/PurgMagSteppingAction.cc | 2 +- .../advanced/radioprotection/CMakeLists.txt | 4 +- examples/advanced/radioprotection/History | 18 + .../advanced/radioprotection/LoadPlotNtuple.C | 14 +- .../advanced/radioprotection/ProcessMicro.C | 340 + examples/advanced/radioprotection/README | 134 - .../include/AnalysisManager.hh | 2 +- .../include/DetectorConstruction.hh | 1 + .../radioprotection/radioprotection.cc | 2 +- .../radioprotection/radioprotection.out | 494 +- .../radioprotection/src/AnalysisManager.cc | 6 +- .../src/DetectorConstruction.cc | 284 +- .../radioprotection/src/SensitiveDetector.cc | 2 +- .../radioprotection/src/SteppingAction.cc | 5 +- .../underground_physics/CMakeLists.txt | 2 +- examples/advanced/underground_physics/DMX.cc | 4 +- examples/advanced/underground_physics/History | 20 + examples/advanced/underground_physics/README | 214 - .../advanced/underground_physics/README_stt | 41 - .../underground_physics/src/DMXEventAction.cc | 3 +- .../src/DMXParticleSourceMessenger.cc | 4 +- .../underground_physics/src/DMXPhysicsList.cc | 4 +- .../src/DMXPrimaryGeneratorAction.cc | 3 +- .../underground_physics/src/DMXRunAction.cc | 4 +- .../src/DMXSteppingAction.cc | 2 +- .../underground_physics.out | 687 +- .../advanced/xray_fluorescence/CMakeLists.txt | 2 +- examples/advanced/xray_fluorescence/History | 26 + examples/advanced/xray_fluorescence/README | 83 - .../src/XrayFluoAnalysisManager.cc | 13 +- .../src/XrayFluoSimulation.cc | 20 +- .../xray_fluorescence/xray_fluorescence.out | 564 +- .../advanced/xray_telescope/CMakeLists.txt | 2 +- examples/advanced/xray_telescope/History | 14 + examples/advanced/xray_telescope/README | 89 - .../xray_telescope/include/XrayTelAnalysis.hh | 6 +- .../xray_telescope/src/XrayTelAnalysis.cc | 4 +- .../xray_telescope/xray_telescope.out | 196 +- examples/basic/.README.txt | 55 - examples/basic/B1/.README.txt | 197 - examples/basic/B1/CMakeLists.txt | 2 +- examples/basic/B1/History | 8 + examples/basic/B1/README | 172 - examples/basic/B1/exampleB1.cc | 10 +- examples/basic/B1/exampleB1.out | 440 +- ...tialization.hh => ActionInitialization.hh} | 21 +- ...onstruction.hh => DetectorConstruction.hh} | 20 +- .../{B1EventAction.hh => EventAction.hh} | 27 +- ...torAction.hh => PrimaryGeneratorAction.hh} | 21 +- .../include/{B1RunAction.hh => RunAction.hh} | 24 +- ...{B1SteppingAction.hh => SteppingAction.hh} | 25 +- ...tialization.cc => ActionInitialization.cc} | 58 +- ...onstruction.cc => DetectorConstruction.cc} | 27 +- .../src/{B1EventAction.cc => EventAction.cc} | 25 +- ...torAction.cc => PrimaryGeneratorAction.cc} | 23 +- .../B1/src/{B1RunAction.cc => RunAction.cc} | 40 +- ...{B1SteppingAction.cc => SteppingAction.cc} | 30 +- examples/basic/B2/.README.txt | 230 - examples/basic/B2/B2a/CMakeLists.txt | 2 +- examples/basic/B2/B2a/exampleB2a.cc | 8 +- examples/basic/B2/B2a/exampleB2a.out | 906 +- ...tialization.hh => ActionInitialization.hh} | 20 +- ...onstruction.hh => DetectorConstruction.hh} | 49 +- ...ectorMessenger.hh => DetectorMessenger.hh} | 40 +- .../{B2EventAction.hh => EventAction.hh} | 19 +- ...torAction.hh => PrimaryGeneratorAction.hh} | 19 +- .../include/{B2RunAction.hh => RunAction.hh} | 21 +- .../include/TrackerHit.hh} | 50 +- .../include/TrackerSD.hh} | 27 +- .../src/ActionInitialization.cc} | 35 +- ...onstruction.cc => DetectorConstruction.cc} | 55 +- ...ectorMessenger.cc => DetectorMessenger.cc} | 36 +- .../src/EventAction.cc} | 21 +- ...torAction.cc => PrimaryGeneratorAction.cc} | 20 +- .../B2RunAction.cc => B2a/src/RunAction.cc} | 21 +- .../src/{B2TrackerHit.cc => TrackerHit.cc} | 51 +- .../B2a/src/{B2TrackerSD.cc => TrackerSD.cc} | 31 +- examples/basic/B2/B2b/CMakeLists.txt | 2 +- examples/basic/B2/B2b/exampleB2b.cc | 8 +- examples/basic/B2/B2b/exampleB2b.out | 918 +- ...tialization.hh => ActionInitialization.hh} | 20 +- ...risation.hh => ChamberParameterisation.hh} | 43 +- ...onstruction.hh => DetectorConstruction.hh} | 45 +- ...ectorMessenger.hh => DetectorMessenger.hh} | 34 +- .../{B2EventAction.hh => EventAction.hh} | 19 +- ...torAction.hh => PrimaryGeneratorAction.hh} | 19 +- examples/basic/B2/B2b/include/RunAction.hh | 55 + .../include/TrackerHit.hh} | 50 +- .../include/TrackerSD.hh} | 27 +- .../basic/B2/B2b/src/ActionInitialization.cc | 67 + ...risation.cc => ChamberParameterisation.cc} | 22 +- ...onstruction.cc => DetectorConstruction.cc} | 52 +- ...ectorMessenger.cc => DetectorMessenger.cc} | 28 +- .../src/EventAction.cc} | 21 +- ...torAction.cc => PrimaryGeneratorAction.cc} | 20 +- .../B2RunAction.cc => B2b/src/RunAction.cc} | 21 +- .../src/{B2TrackerHit.cc => TrackerHit.cc} | 51 +- .../B2b/src/{B2TrackerSD.cc => TrackerSD.cc} | 38 +- examples/basic/B2/CMakeLists.txt | 2 +- examples/basic/B2/History | 4 + examples/basic/B2/README | 205 - examples/basic/B3/.README.txt | 221 - examples/basic/B3/B3a/CMakeLists.txt | 2 +- examples/basic/B3/B3a/exampleB3a.cc | 14 +- examples/basic/B3/B3a/exampleB3a.out | 332 +- ...tialization.hh => ActionInitialization.hh} | 26 +- examples/basic/B3/B3a/include/B3Analysis.hh | 37 - .../include/DetectorConstruction.hh} | 21 +- .../{B3aEventAction.hh => EventAction.hh} | 29 +- .../include/PhysicsList.hh} | 17 +- .../include/PrimaryGeneratorAction.hh} | 19 +- .../include/{B3aRunAction.hh => RunAction.hh} | 23 +- ...{B3StackingAction.hh => StackingAction.hh} | 17 +- .../basic/B3/B3a/src/ActionInitialization.cc | 73 + ...onstruction.cc => DetectorConstruction.cc} | 24 +- .../src/{B3aEventAction.cc => EventAction.cc} | 27 +- .../src/{B3PhysicsList.cc => PhysicsList.cc} | 21 +- .../src/PrimaryGeneratorAction.cc} | 20 +- .../B3a/src/{B3aRunAction.cc => RunAction.cc} | 31 +- .../src/StackingAction.cc} | 18 +- examples/basic/B3/B3b/CMakeLists.txt | 2 +- examples/basic/B3/B3b/exampleB3b.cc | 17 +- examples/basic/B3/B3b/exampleB3b.out | 334 +- ...tialization.hh => ActionInitialization.hh} | 24 +- .../include/DetectorConstruction.hh} | 21 +- .../include/PhysicsList.hh} | 17 +- .../include/PrimaryGeneratorAction.hh} | 19 +- .../B3/B3b/include/{B3bRun.hh => Run.hh} | 29 +- .../include/{B3bRunAction.hh => RunAction.hh} | 21 +- ...{B3StackingAction.hh => StackingAction.hh} | 17 +- .../B3b/src/ActionInitialization.cc} | 37 +- .../B3/B3b/src/B3bActionInitialization.cc | 62 - ...onstruction.cc => DetectorConstruction.cc} | 24 +- .../src/{B3PhysicsList.cc => PhysicsList.cc} | 21 +- .../src/PrimaryGeneratorAction.cc} | 20 +- .../basic/B3/B3b/src/{B3bRun.cc => Run.cc} | 29 +- .../B3b/src/{B3bRunAction.cc => RunAction.cc} | 37 +- .../src/StackingAction.cc} | 18 +- examples/basic/B3/CMakeLists.txt | 2 +- examples/basic/B3/History | 8 + examples/basic/B3/README | 202 - examples/basic/B4/.README.txt | 322 - examples/basic/B4/B4a/CMakeLists.txt | 2 +- examples/basic/B4/B4a/exampleB4a.cc | 8 +- examples/basic/B4/B4a/exampleB4a.out | 1266 +- ...tialization.hh => ActionInitialization.hh} | 28 +- examples/basic/B4/B4a/include/B4Analysis.hh | 40 - ...onstruction.hh => DetectorConstruction.hh} | 28 +- .../{B4aEventAction.hh => EventAction.hh} | 31 +- ...torAction.hh => PrimaryGeneratorAction.hh} | 19 +- .../include/RunAction.hh} | 21 +- ...B4aSteppingAction.hh => SteppingAction.hh} | 33 +- .../basic/B4/B4a/src/ActionInitialization.cc | 74 + ...onstruction.cc => DetectorConstruction.cc} | 32 +- .../src/{B4aEventAction.cc => EventAction.cc} | 28 +- .../src/PrimaryGeneratorAction.cc} | 20 +- .../B4RunAction.cc => B4a/src/RunAction.cc} | 35 +- ...B4aSteppingAction.cc => SteppingAction.cc} | 29 +- examples/basic/B4/B4b/CMakeLists.txt | 2 +- examples/basic/B4/B4b/exampleB4b.cc | 10 +- examples/basic/B4/B4b/exampleB4b.out | 1266 +- ...tialization.hh => ActionInitialization.hh} | 33 +- examples/basic/B4/B4b/include/B4Analysis.hh | 40 - ...onstruction.hh => DetectorConstruction.hh} | 28 +- .../{B4bEventAction.hh => EventAction.hh} | 21 +- ...torAction.hh => PrimaryGeneratorAction.hh} | 19 +- .../include/{B4bRunAction.hh => RunAction.hh} | 23 +- .../B4b/include/{B4bRunData.hh => RunData.hh} | 33 +- ...B4bSteppingAction.hh => SteppingAction.hh} | 26 +- .../basic/B4/B4b/src/ActionInitialization.cc | 74 + .../B4/B4b/src/B4bActionInitialization.cc | 68 - ...onstruction.cc => DetectorConstruction.cc} | 32 +- .../src/{B4bEventAction.cc => EventAction.cc} | 28 +- .../src/PrimaryGeneratorAction.cc} | 20 +- .../B4b/src/{B4bRunAction.cc => RunAction.cc} | 39 +- .../B4/B4b/src/{B4bRunData.cc => RunData.cc} | 36 +- ...B4bSteppingAction.cc => SteppingAction.cc} | 29 +- examples/basic/B4/B4c/CMakeLists.txt | 2 +- examples/basic/B4/B4c/exampleB4c.cc | 10 +- examples/basic/B4/B4c/exampleB4c.out | 1266 +- ...tialization.hh => ActionInitialization.hh} | 22 +- examples/basic/B4/B4c/include/B4Analysis.hh | 40 - .../include/{B4cCalorHit.hh => CalorHit.hh} | 55 +- .../{B4cCalorimeterSD.hh => CalorimeterSD.hh} | 31 +- ...onstruction.hh => DetectorConstruction.hh} | 25 +- .../{B4cEventAction.hh => EventAction.hh} | 27 +- ...torAction.hh => PrimaryGeneratorAction.hh} | 19 +- .../include/RunAction.hh} | 21 +- .../basic/B4/B4c/src/ActionInitialization.cc | 68 + .../B4/B4c/src/B4cActionInitialization.cc | 62 - .../B4c/src/{B4cCalorHit.cc => CalorHit.cc} | 62 +- .../{B4cCalorimeterSD.cc => CalorimeterSD.cc} | 33 +- ...onstruction.cc => DetectorConstruction.cc} | 36 +- .../src/{B4cEventAction.cc => EventAction.cc} | 38 +- .../src/PrimaryGeneratorAction.cc} | 20 +- .../B4RunAction.cc => B4c/src/RunAction.cc} | 35 +- examples/basic/B4/B4d/CMakeLists.txt | 4 +- examples/basic/B4/B4d/exampleB4d.cc | 12 +- examples/basic/B4/B4d/exampleB4d.out | 1268 +- ...tialization.hh => ActionInitialization.hh} | 22 +- examples/basic/B4/B4d/include/B4Analysis.hh | 40 - ...onstruction.hh => DetectorConstruction.hh} | 22 +- .../{B4dEventAction.hh => EventAction.hh} | 33 +- ...torAction.hh => PrimaryGeneratorAction.hh} | 19 +- .../include/RunAction.hh} | 22 +- .../basic/B4/B4d/src/ActionInitialization.cc | 68 + .../B4/B4d/src/B4dActionInitialization.cc | 62 - ...onstruction.cc => DetectorConstruction.cc} | 29 +- .../src/{B4dEventAction.cc => EventAction.cc} | 34 +- .../src/PrimaryGeneratorAction.cc} | 20 +- .../B4d/src/{B4RunAction.cc => RunAction.cc} | 35 +- examples/basic/B4/CMakeLists.txt | 2 +- examples/basic/B4/History | 16 +- examples/basic/B4/README | 269 - examples/basic/B5/.README.txt | 331 - examples/basic/B5/CMakeLists.txt | 3 +- examples/basic/B5/History | 46 + examples/basic/B5/README | 300 - examples/basic/B5/exampleB5.cc | 10 +- examples/basic/B5/exampleB5.out | 985 +- ...tialization.hh => ActionInitialization.hh} | 22 +- ...eterisation.hh => CellParameterisation.hh} | 21 +- .../include/{B5Constants.hh => Constants.hh} | 9 +- ...onstruction.hh => DetectorConstruction.hh} | 45 +- ...5DriftChamberHit.hh => DriftChamberHit.hh} | 51 +- ...{B5DriftChamberSD.hh => DriftChamberSD.hh} | 25 +- ...mCalorimeterHit.hh => EmCalorimeterHit.hh} | 53 +- ...5EmCalorimeterSD.hh => EmCalorimeterSD.hh} | 25 +- .../{B5EventAction.hh => EventAction.hh} | 35 +- ...CalorimeterHit.hh => HadCalorimeterHit.hh} | 53 +- ...adCalorimeterSD.hh => HadCalorimeterSD.hh} | 25 +- .../{B5HodoscopeHit.hh => HodoscopeHit.hh} | 51 +- .../{B5HodoscopeSD.hh => HodoscopeSD.hh} | 25 +- .../{B5MagneticField.hh => MagneticField.hh} | 23 +- ...torAction.hh => PrimaryGeneratorAction.hh} | 41 +- .../include/{B5RunAction.hh => RunAction.hh} | 25 +- examples/basic/B5/plotter.mac | 211 + examples/basic/B5/src/ActionInitialization.cc | 70 + ...eterisation.cc => CellParameterisation.cc} | 20 +- ...onstruction.cc => DetectorConstruction.cc} | 74 +- ...5DriftChamberHit.cc => DriftChamberHit.cc} | 104 +- ...{B5DriftChamberSD.cc => DriftChamberSD.cc} | 28 +- ...mCalorimeterHit.cc => EmCalorimeterHit.cc} | 110 +- ...5EmCalorimeterSD.cc => EmCalorimeterSD.cc} | 30 +- .../src/{B5EventAction.cc => EventAction.cc} | 68 +- ...CalorimeterHit.cc => HadCalorimeterHit.cc} | 122 +- ...adCalorimeterSD.cc => HadCalorimeterSD.cc} | 30 +- .../{B5HodoscopeHit.cc => HodoscopeHit.cc} | 96 +- .../src/{B5HodoscopeSD.cc => HodoscopeSD.cc} | 28 +- .../{B5MagneticField.cc => MagneticField.cc} | 23 +- ...torAction.cc => PrimaryGeneratorAction.cc} | 35 +- .../B5/src/{B5RunAction.cc => RunAction.cc} | 47 +- examples/basic/CMakeLists.txt | 2 +- examples/basic/History | 8 + examples/basic/README | 56 - examples/extended/.README.txt | 64 - examples/extended/CMakeLists.txt | 2 +- examples/extended/analysis/.README.txt | 27 - .../extended/analysis/AnaEx01/.README.txt | 145 - .../extended/analysis/AnaEx01/AnaEx01.out | 832 +- .../extended/analysis/AnaEx01/CMakeLists.txt | 2 +- examples/extended/analysis/AnaEx01/History | 18 + examples/extended/analysis/AnaEx01/README | 140 - .../analysis/AnaEx01/include/HistoManager.hh | 5 +- .../analysis/AnaEx01/shared/src/RunAction.cc | 6 +- .../analysis/AnaEx01/src/HistoManager.cc | 86 +- .../extended/analysis/AnaEx02/.README.txt | 149 - .../extended/analysis/AnaEx02/AnaEx02.out | 825 +- .../extended/analysis/AnaEx02/CMakeLists.txt | 2 +- examples/extended/analysis/AnaEx02/README | 145 - .../analysis/AnaEx03/.README.AIDA.txt | 73 - .../AnaEx03/.README.OpenScientist.txt | 55 - .../extended/analysis/AnaEx03/.README.txt | 160 - examples/extended/analysis/AnaEx03/AnaEx03.in | 28 - .../extended/analysis/AnaEx03/GNUmakefile | 33 - examples/extended/analysis/AnaEx03/History | 193 - examples/extended/analysis/AnaEx03/README | 153 - .../extended/analysis/AnaEx03/README.AIDA | 68 - .../analysis/AnaEx03/README.OpenScientist | 44 - examples/extended/analysis/AnaEx03/run.mac | 17 - .../extended/analysis/AnaEx03/shared/History | 43 - .../shared/include/DetectorConstruction.hh | 153 - .../AnaEx03/shared/scripts/clean_files.sh | 18 - .../AnaEx03/shared/scripts/copy_files.sh | 15 - .../shared/src/DetectorConstruction.cc | 348 - .../AnaEx03/shared/src/DetectorMessenger.cc | 137 - .../analysis/AnaEx03/shared/src/RunAction.cc | 136 - .../analysis/AnaEx03/src/HistoManager.cc | 219 - examples/extended/analysis/B1Con/.README.txt | 113 - .../extended/analysis/B1Con/CMakeLists.txt | 2 +- examples/extended/analysis/B1Con/README | 102 - examples/extended/analysis/B1Con/README.B1 | 167 - .../extended/analysis/B1Con/exampleB01Con.out | 568 +- examples/extended/analysis/CMakeLists.txt | 12 +- examples/extended/analysis/History | 5 +- examples/extended/analysis/README | 27 - examples/extended/biasing/.README.txt | 129 - examples/extended/biasing/B01/CMakeLists.txt | 2 +- examples/extended/biasing/B01/exampleB01.out | 464 +- examples/extended/biasing/B02/CMakeLists.txt | 2 +- examples/extended/biasing/B02/exampleB02.out | 464 +- examples/extended/biasing/B03/CMakeLists.txt | 2 +- examples/extended/biasing/B03/exampleB03.out | 309 +- examples/extended/biasing/CMakeLists.txt | 2 +- examples/extended/biasing/GB01/.README.txt | 49 - examples/extended/biasing/GB01/CMakeLists.txt | 2 +- examples/extended/biasing/GB01/README | 50 - .../extended/biasing/GB01/exampleGB01.out | 3786 +- examples/extended/biasing/GB02/.README.txt | 52 - examples/extended/biasing/GB02/CMakeLists.txt | 2 +- examples/extended/biasing/GB02/README | 49 - .../extended/biasing/GB02/exampleGB02.out | 5784 +-- examples/extended/biasing/GB03/.README.txt | 54 - examples/extended/biasing/GB03/CMakeLists.txt | 2 +- examples/extended/biasing/GB03/README | 45 - .../extended/biasing/GB03/exampleGB03.out | 453 +- examples/extended/biasing/GB04/.README.txt | 41 - examples/extended/biasing/GB04/CMakeLists.txt | 2 +- examples/extended/biasing/GB04/README | 36 - .../extended/biasing/GB04/exampleGB04.out | 5465 +-- examples/extended/biasing/GB05/.README.txt | 53 - examples/extended/biasing/GB05/CMakeLists.txt | 2 +- examples/extended/biasing/GB05/README | 47 - .../extended/biasing/GB05/exampleGB05.out | 3922 +- examples/extended/biasing/GB06/.README.txt | 108 - examples/extended/biasing/GB06/CMakeLists.txt | 2 +- examples/extended/biasing/GB06/README | 100 - .../extended/biasing/GB06/exampleGB06.out | 844 +- examples/extended/biasing/GB07/.README.txt | 88 - examples/extended/biasing/GB07/CMakeLists.txt | 2 +- examples/extended/biasing/GB07/README | 84 - examples/extended/biasing/README | 149 - .../extended/biasing/ReverseMC01/.README.txt | 487 - .../biasing/ReverseMC01/CMakeLists.txt | 2 +- examples/extended/biasing/ReverseMC01/History | 14 + examples/extended/biasing/ReverseMC01/README | 542 - .../include/RMC01AnalysisManager.hh | 3 +- .../run_adjoint_simulation_electron.out | 125 +- .../ReverseMC01/src/RMC01AnalysisManager.cc | 3 +- examples/extended/common/.README.txt | 24 - examples/extended/common/CMakeLists.txt | 2 +- examples/extended/common/README | 26 - examples/extended/electromagnetic/.README.txt | 119 - .../extended/electromagnetic/CMakeLists.txt | 2 +- examples/extended/electromagnetic/History | 4 + examples/extended/electromagnetic/README | 118 - .../electromagnetic/TestEm0/.README.txt | 41 - .../electromagnetic/TestEm0/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm0/History | 4 + .../extended/electromagnetic/TestEm0/README | 39 - .../electromagnetic/TestEm0/TestEm0.cc | 23 +- .../electromagnetic/TestEm0/TestEm0.out | 57 +- .../electromagnetic/TestEm0/src/RunAction.cc | 85 +- .../electromagnetic/TestEm1/.README.txt | 164 - .../electromagnetic/TestEm1/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm1/History | 12 + .../extended/electromagnetic/TestEm1/README | 157 - .../electromagnetic/TestEm1/TestEm1.out | 295 +- .../TestEm1/include/HistoManager.hh | 3 +- .../TestEm1/src/HistoManager.cc | 2 +- .../TestEm1/src/PhysicsList.cc | 4 +- .../electromagnetic/TestEm10/.README.txt | 103 - .../electromagnetic/TestEm10/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm10/History | 5 + .../electromagnetic/TestEm10/InstallAida.txt | 77 - .../extended/electromagnetic/TestEm10/README | 94 - .../electromagnetic/TestEm10/TestEm10.out | 405 +- .../TestEm10/include/Analysis.hh | 36 - .../electromagnetic/TestEm10/src/RunAction.cc | 3 +- .../TestEm10/src/SensitiveDetector.cc | 2 +- .../TestEm10/src/StackingAction.cc | 2 +- .../electromagnetic/TestEm11/.README.txt | 192 - .../electromagnetic/TestEm11/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm11/History | 14 +- .../extended/electromagnetic/TestEm11/README | 185 - .../electromagnetic/TestEm11/TestEm11.out | 787 +- .../TestEm11/include/HistoManager.hh | 3 +- .../TestEm11/sandia/EGSnrc/README | 26 - .../TestEm11/src/HistoManager.cc | 2 +- .../TestEm11/src/PhysicsList.cc | 4 +- .../electromagnetic/TestEm12/.README.txt | 174 - .../electromagnetic/TestEm12/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm12/History | 9 + .../extended/electromagnetic/TestEm12/README | 163 - .../electromagnetic/TestEm12/TestEm12.out | 812 +- .../TestEm12/berger/EGSnrc/README | 27 - .../TestEm12/include/HistoManager.hh | 3 +- .../TestEm12/src/HistoManager.cc | 2 +- .../electromagnetic/TestEm13/.README.txt | 84 - .../electromagnetic/TestEm13/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm13/README | 79 - .../electromagnetic/TestEm13/TestEm13.out | 24 +- .../electromagnetic/TestEm14/.README.txt | 132 - .../electromagnetic/TestEm14/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm14/History | 9 + .../extended/electromagnetic/TestEm14/README | 121 - .../electromagnetic/TestEm14/TestEm14.out | 26 +- .../TestEm14/include/HistoManager.hh | 4 +- .../TestEm14/src/HistoManager.cc | 2 +- .../electromagnetic/TestEm15/.README.txt | 124 - .../electromagnetic/TestEm15/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm15/History | 9 + .../extended/electromagnetic/TestEm15/README | 128 - .../electromagnetic/TestEm15/README.gamma | 48 - .../electromagnetic/TestEm15/TestEm15.out | 229 +- .../TestEm15/include/HistoManager.hh | 4 +- .../TestEm15/src/HistoManager.cc | 2 +- .../electromagnetic/TestEm16/.README.txt | 143 - .../electromagnetic/TestEm16/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm16/History | 9 + .../extended/electromagnetic/TestEm16/README | 124 - .../electromagnetic/TestEm16/TestEm16.out | 136 +- .../TestEm16/include/HistoManager.hh | 4 +- .../TestEm16/src/HistoManager.cc | 2 +- .../electromagnetic/TestEm17/.README.txt | 118 - .../electromagnetic/TestEm17/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm17/History | 13 + .../extended/electromagnetic/TestEm17/README | 112 - .../electromagnetic/TestEm17/TestEm17.out | 261 +- .../TestEm17/include/HistoManager.hh | 3 +- .../TestEm17/src/HistoManager.cc | 3 +- .../electromagnetic/TestEm18/.README.txt | 135 - .../electromagnetic/TestEm18/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm18/History | 9 + .../extended/electromagnetic/TestEm18/README | 123 - .../electromagnetic/TestEm18/TestEm18.out | 34 +- .../TestEm18/include/HistoManager.hh | 4 +- .../TestEm18/src/HistoManager.cc | 2 +- .../electromagnetic/TestEm2/.README.txt | 171 - .../electromagnetic/TestEm2/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm2/History | 7 + .../extended/electromagnetic/TestEm2/README | 161 - .../electromagnetic/TestEm2/TestEm2.out | 436 +- .../electromagnetic/TestEm2/include/Run.hh | 3 +- .../TestEm2/include/RunAction.hh | 3 +- .../electromagnetic/TestEm2/src/RunAction.cc | 3 + .../electromagnetic/TestEm3/.README.txt | 209 - .../electromagnetic/TestEm3/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm3/History | 9 + .../extended/electromagnetic/TestEm3/README | 195 - .../electromagnetic/TestEm3/TestEm3.out | 648 +- .../electromagnetic/TestEm3/geant3/README | 51 - .../TestEm3/geant3/g4mat/README | 23 - .../TestEm3/include/HistoManager.hh | 4 +- .../TestEm3/src/HistoManager.cc | 2 +- .../electromagnetic/TestEm4/.README.txt | 94 - .../electromagnetic/TestEm4/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm4/History | 10 + .../extended/electromagnetic/TestEm4/README | 86 - .../electromagnetic/TestEm4/TestEm4.out | 105 +- .../TestEm4/include/Analysis.hh | 36 - .../TestEm4/include/RunAction.hh | 3 +- .../TestEm4/src/EventAction.cc | 2 +- .../electromagnetic/TestEm4/src/RunAction.cc | 2 +- .../electromagnetic/TestEm5/.README.txt | 265 - .../electromagnetic/TestEm5/CMakeLists.txt | 4 +- .../extended/electromagnetic/TestEm5/History | 32 + .../extended/electromagnetic/TestEm5/README | 246 - .../electromagnetic/TestEm5/TestEm5.out | 1708 +- .../TestEm5/include/DetectorConstruction.hh | 10 +- .../TestEm5/include/HistoManager.hh | 3 +- .../TestEm5/include/StackingAction.hh | 31 +- .../electromagnetic/TestEm5/pixe_ANSTO.mac | 61 + .../TestEm5/src/DetectorConstruction.cc | 30 +- .../TestEm5/src/HistoManager.cc | 2 +- .../TestEm5/src/PrimaryGeneratorAction.cc | 12 +- .../TestEm5/src/StackingAction.cc | 100 +- .../electromagnetic/TestEm6/.README.txt | 140 - .../electromagnetic/TestEm6/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm6/History | 18 + .../extended/electromagnetic/TestEm6/README | 125 - .../electromagnetic/TestEm6/TestEm6.cc | 47 +- .../electromagnetic/TestEm6/TestEm6.out | 157 +- .../TestEm6/include/RunAction.hh | 5 +- .../electromagnetic/TestEm6/src/RunAction.cc | 103 +- .../electromagnetic/TestEm7/.README.txt | 177 - .../electromagnetic/TestEm7/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm7/History | 22 + .../extended/electromagnetic/TestEm7/README | 156 - .../electromagnetic/TestEm7/TestEm7.cc | 31 +- .../electromagnetic/TestEm7/TestEm7.out | 2011 +- .../TestEm7/include/RunAction.hh | 3 +- .../TestEm7/include/c2_function.hh | 2 +- .../electromagnetic/TestEm7/ionC12.mac | 10 +- .../electromagnetic/TestEm7/proton.mac | 12 +- .../TestEm7/src/G4ScreenedNuclearRecoil.cc | 4 +- .../electromagnetic/TestEm7/src/RunAction.cc | 3 +- .../extended/electromagnetic/TestEm7/tion.mac | 51 +- .../electromagnetic/TestEm8/.README.txt | 88 - .../electromagnetic/TestEm8/CMakeLists.txt | 2 +- .../extended/electromagnetic/TestEm8/History | 16 + .../extended/electromagnetic/TestEm8/README | 87 - .../electromagnetic/TestEm8/TestEm8.cc | 4 - .../electromagnetic/TestEm8/TestEm8.out | 53 +- .../electromagnetic/TestEm8/include/Run.hh | 3 +- .../TestEm8/include/RunAction.hh | 3 +- .../electromagnetic/TestEm8/src/RunAction.cc | 8 +- .../electromagnetic/TestEm9/.README.txt | 120 - .../electromagnetic/TestEm9/CMakeLists.txt | 2 +- .../electromagnetic/TestEm9/GNUmakefile | 2 +- .../extended/electromagnetic/TestEm9/History | 9 + .../extended/electromagnetic/TestEm9/README | 108 - .../electromagnetic/TestEm9/TestEm9.out | 1222 +- .../electromagnetic/TestEm9/src/Histo.cc | 4 +- .../extended/errorpropagation/.README.txt | 37 - .../extended/errorpropagation/CMakeLists.txt | 2 +- examples/extended/errorpropagation/README | 33 - .../extended/errorpropagation/errorprop.out | 145 +- examples/extended/eventgenerator/.README.txt | 49 - .../extended/eventgenerator/CMakeLists.txt | 2 +- .../eventgenerator/CMakeLists.txt.pythia6 | 2 +- .../extended/eventgenerator/HepMC/.README.txt | 120 - .../eventgenerator/HepMC/CMakeLists.txt | 2 +- .../HepMC/HepMCEx01/.README.txt | 56 - .../HepMC/HepMCEx01/CMakeLists.txt | 2 +- .../eventgenerator/HepMC/HepMCEx01/README | 57 - .../HepMC/HepMCEx01/data/CMakeLists.txt | 2 +- .../HepMCEx01/include/ExN04TrackerHit.hh | 1 + .../HepMC/HepMCEx02/.README.txt | 47 - .../HepMC/HepMCEx02/CMakeLists.txt | 2 +- .../eventgenerator/HepMC/HepMCEx02/README | 48 - .../HepMC/HepMCEx02/data/CMakeLists.txt | 2 +- .../eventgenerator/HepMC/MCTruth/.README.txt | 168 - .../HepMC/MCTruth/CMakeLists.txt | 2 +- .../eventgenerator/HepMC/MCTruth/README | 165 - examples/extended/eventgenerator/HepMC/README | 118 - examples/extended/eventgenerator/History | 3 + examples/extended/eventgenerator/README | 51 - .../extended/eventgenerator/exgps/.README.txt | 101 - .../eventgenerator/exgps/CMakeLists.txt | 4 +- .../eventgenerator/exgps/CTestsDefinition.txt | 92 +- .../extended/eventgenerator/exgps/History | 15 + examples/extended/eventgenerator/exgps/README | 92 - .../eventgenerator/exgps/exgps_batch.out | 4 +- .../exgps/include/HistoManager.hh | 4 +- .../eventgenerator/exgps/macros/README | 167 - .../eventgenerator/exgps/src/HistoManager.cc | 2 +- .../eventgenerator/particleGun/.README.txt | 158 - .../eventgenerator/particleGun/CMakeLists.txt | 2 +- .../eventgenerator/particleGun/History | 9 + .../eventgenerator/particleGun/README | 152 - .../particleGun/include/HistoManager.hh | 4 +- .../particleGun/particleGun_run1.out | 18 +- .../particleGun/particleGun_run2.out | 6 +- .../particleGun/particleGun_run3.out | 6 +- .../particleGun/particleGun_run4.out | 6 +- .../particleGun/src/HistoManager.cc | 2 +- .../eventgenerator/pythia/.README.txt | 23 - .../extended/eventgenerator/pythia/README | 16 - .../pythia/decayer6/.README.txt | 96 - .../pythia/decayer6/CMakeLists.txt | 2 +- .../eventgenerator/pythia/decayer6/README | 85 - .../pythia/decayer6/common/.README.txt | 24 - .../pythia/decayer6/common/CMakeLists.txt | 2 +- .../pythia/decayer6/common/README | 26 - .../pythia/py8decayer/.README.txt | 128 - .../pythia/py8decayer/CMakeLists.txt | 2 +- .../eventgenerator/pythia/py8decayer/README | 120 - .../userPrimaryGenerator/.README.txt | 47 - .../userPrimaryGenerator/CMakeLists.txt | 2 +- .../userPrimaryGenerator/README | 49 - .../userPrimaryGenerator.out | 4 +- examples/extended/exoticphysics/.README.txt | 33 - .../extended/exoticphysics/CMakeLists.txt | 3 +- examples/extended/exoticphysics/History | 3 + examples/extended/exoticphysics/README | 33 - .../exoticphysics/channeling/.README.txt | 92 - .../exoticphysics/channeling/CMakeLists.txt | 2 +- .../channeling/CTestDefinitions.txt | 9 - .../extended/exoticphysics/channeling/History | 13 + .../extended/exoticphysics/channeling/README | 71 - .../exoticphysics/channeling/channeling.out | 455 +- .../channeling/src/EventAction.cc | 3 +- .../exoticphysics/channeling/src/RunAction.cc | 10 +- .../exoticphysics/dmparticle/.README.txt | 70 - .../exoticphysics/dmparticle/CMakeLists.txt | 2 +- .../extended/exoticphysics/dmparticle/History | 13 + .../extended/exoticphysics/dmparticle/README | 79 - .../exoticphysics/dmparticle/dmparticle.out | 1308 +- .../exoticphysics/dmparticle/include/Run.hh | 3 +- .../dmparticle/include/RunAction.hh | 3 +- .../exoticphysics/dmparticle/src/RunAction.cc | 4 +- .../exoticphysics/monopole/.README.txt | 118 - .../exoticphysics/monopole/CMakeLists.txt | 2 +- .../extended/exoticphysics/monopole/History | 7 + .../extended/exoticphysics/monopole/README | 111 - .../exoticphysics/monopole/include/Run.hh | 2 +- .../exoticphysics/monopole/monopole.out | 527 +- .../exoticphysics/monopole/src/RunAction.cc | 4 +- .../extended/exoticphysics/phonon/.README.txt | 105 - .../exoticphysics/phonon/CMakeLists.txt | 7 +- .../exoticphysics/phonon/CTestDefinitions.txt | 47 +- .../extended/exoticphysics/phonon/History | 3 + examples/extended/exoticphysics/phonon/README | 99 - .../extended/exoticphysics/phonon/XGeBox.cc | 8 +- .../extended/exoticphysics/saxs/.README.txt | 254 - .../exoticphysics/saxs/CMakeLists.txt | 2 +- examples/extended/exoticphysics/saxs/History | 15 + examples/extended/exoticphysics/saxs/README | 218 - .../saxs/include/SAXSPhysicsList.hh | 11 +- .../saxs/include/SAXSRunAction.hh | 16 +- examples/extended/exoticphysics/saxs/saxs.cc | 96 +- examples/extended/exoticphysics/saxs/saxs.in | 2 +- .../extended/exoticphysics/saxs/saxs_slits.in | 2 +- .../saxs/src/G4EmPenelopePhysicsMI.cc | 1 - .../exoticphysics/saxs/src/SAXSEventAction.cc | 2 +- .../exoticphysics/saxs/src/SAXSPhysicsList.cc | 62 +- .../exoticphysics/saxs/src/SAXSRunAction.cc | 84 +- .../saxs/src/SAXSSteppingAction.cc | 2 +- .../extended/exoticphysics/ucn/.README.txt | 122 - .../extended/exoticphysics/ucn/CMakeLists.txt | 2 +- examples/extended/exoticphysics/ucn/ExUCN.out | 14 +- examples/extended/exoticphysics/ucn/README | 106 - examples/extended/field/.README.txt | 46 - .../extended/field/BlineTracer/.README.txt | 184 - .../extended/field/BlineTracer/CMakeLists.txt | 2 +- examples/extended/field/BlineTracer/README | 155 - examples/extended/field/CMakeLists.txt | 2 +- examples/extended/field/README | 41 - examples/extended/field/field01/.README.txt | 275 - .../extended/field/field01/CMakeLists.txt | 2 +- examples/extended/field/field01/README | 276 - examples/extended/field/field01/field01.out | 301 +- examples/extended/field/field02/.README.txt | 88 - .../extended/field/field02/CMakeLists.txt | 2 +- examples/extended/field/field02/README | 86 - examples/extended/field/field02/field02.out | 14441 ++++--- examples/extended/field/field03/.README.txt | 85 - .../extended/field/field03/CMakeLists.txt | 2 +- examples/extended/field/field03/README | 81 - examples/extended/field/field03/field03.out | 905 +- examples/extended/field/field04/.README.txt | 397 - .../extended/field/field04/CMakeLists.txt | 2 +- examples/extended/field/field04/History | 3 + examples/extended/field/field04/README | 377 - examples/extended/field/field04/field04.out | 12467 +++--- examples/extended/field/field04/random/README | 2 - .../field04/src/F04DetectorConstruction.cc | 2 +- .../field/field04/src/F04TrajectoryPoint.cc | 4 +- examples/extended/field/field05/.README.txt | 84 - .../extended/field/field05/CMakeLists.txt | 2 +- examples/extended/field/field05/README | 82 - examples/extended/field/field05/field05.out | 4 +- examples/extended/field/field06/.README.txt | 68 - .../extended/field/field06/CMakeLists.txt | 2 +- examples/extended/field/field06/README | 67 - examples/extended/field/field06/field06.out | 8 +- examples/extended/g3tog4/.README.txt | 16 - examples/extended/g3tog4/CMakeLists.txt | 2 +- examples/extended/g3tog4/README | 13 - .../extended/g3tog4/clGeometry/.README.txt | 40 - .../extended/g3tog4/clGeometry/CMakeLists.txt | 2 +- examples/extended/g3tog4/clGeometry/README | 31 - .../extended/g3tog4/clGeometry/clGeometry.out | 462 +- .../g3tog4/clGeometry/common/.README.txt | 24 - .../g3tog4/clGeometry/common/CMakeLists.txt | 2 +- .../g3tog4/clGeometry/common/GNUmakefile | 6 + .../extended/g3tog4/clGeometry/common/README | 26 - examples/extended/geometry/.README.txt | 14 - examples/extended/geometry/CMakeLists.txt | 2 +- examples/extended/geometry/History | 3 + examples/extended/geometry/README | 10 - .../extended/geometry/transforms/.README.txt | 104 - .../geometry/transforms/CMakeLists.txt | 5 +- examples/extended/geometry/transforms/README | 94 - .../extended/geometry/transforms/batch.out | 18 +- .../geometry/vecGeomNavigation/CMakeLists.txt | 6 +- .../geometry/vecGeomNavigation/History | 5 + .../geometry/vecGeomNavigation/README | 32 - .../include/VG01DetectorConstruction.hh | 25 + examples/extended/hadronic/.README.txt | 88 - examples/extended/hadronic/CMakeLists.txt | 3 +- .../hadronic/FissionFragment/.README.txt | 126 - .../hadronic/FissionFragment/CMakeLists.txt | 2 +- .../FissionFragment/FissionFragment.out | 1119 +- .../extended/hadronic/FissionFragment/README | 114 - examples/extended/hadronic/Hadr00/.README.txt | 113 - .../extended/hadronic/Hadr00/CMakeLists.txt | 2 +- examples/extended/hadronic/Hadr00/History | 15 +- examples/extended/hadronic/Hadr00/README | 91 - examples/extended/hadronic/Hadr00/hadr00.out | 447 +- .../hadronic/Hadr00/include/HistoManager.hh | 3 +- .../hadronic/Hadr00/src/HistoManager.cc | 2 +- examples/extended/hadronic/Hadr01/.README.txt | 160 - .../extended/hadronic/Hadr01/CMakeLists.txt | 2 +- examples/extended/hadronic/Hadr01/GNUmakefile | 2 +- examples/extended/hadronic/Hadr01/History | 13 + examples/extended/hadronic/Hadr01/README | 136 - examples/extended/hadronic/Hadr01/hadr01.out | 490 +- .../Hadr01/include/DetectorConstruction.hh | 10 +- .../hadronic/Hadr01/include/HistoManager.hh | 77 +- .../Hadr01/src/DetectorConstruction.cc | 24 +- .../hadronic/Hadr01/src/DetectorMessenger.cc | 4 +- .../extended/hadronic/Hadr01/src/Histo.cc | 4 +- .../hadronic/Hadr01/src/HistoManager.cc | 42 +- examples/extended/hadronic/Hadr02/.README.txt | 261 - .../extended/hadronic/Hadr02/CMakeLists.txt | 2 +- examples/extended/hadronic/Hadr02/History | 9 + examples/extended/hadronic/Hadr02/README | 238 - examples/extended/hadronic/Hadr02/hadr02.out | 462 +- .../hadronic/Hadr02/hijing1_383/README | 118 - .../extended/hadronic/Hadr02/src/Histo.cc | 4 +- examples/extended/hadronic/Hadr03/.README.txt | 158 - .../extended/hadronic/Hadr03/CMakeLists.txt | 2 +- examples/extended/hadronic/Hadr03/History | 12 + examples/extended/hadronic/Hadr03/README | 145 - examples/extended/hadronic/Hadr03/hadr03.out | 301 +- .../hadronic/Hadr03/include/HistoManager.hh | 4 +- .../hadronic/Hadr03/src/HistoManager.cc | 2 +- examples/extended/hadronic/Hadr03/src/Run.cc | 1 + examples/extended/hadronic/Hadr04/.README.txt | 132 - .../extended/hadronic/Hadr04/CMakeLists.txt | 2 +- examples/extended/hadronic/Hadr04/History | 15 + examples/extended/hadronic/Hadr04/README | 124 - .../extended/hadronic/Hadr04/graphite.mac | 5 +- examples/extended/hadronic/Hadr04/hadr04.out | 56 +- .../hadronic/Hadr04/include/HistoManager.hh | 4 +- .../Hadr04/include/NeutronHPphysics.hh | 15 +- examples/extended/hadronic/Hadr04/run01.mac | 6 +- .../hadronic/Hadr04/src/HistoManager.cc | 2 +- .../hadronic/Hadr04/src/NeutronHPMessenger.cc | 71 - .../hadronic/Hadr04/src/NeutronHPphysics.cc | 27 +- examples/extended/hadronic/Hadr04/src/Run.cc | 1 + .../Hadr05}/CMakeLists.txt | 40 +- examples/extended/hadronic/Hadr05/Cu-lAr.mac | 33 + examples/extended/hadronic/Hadr05/Fe-Sci.mac | 33 + examples/extended/hadronic/Hadr05/GNUmakefile | 18 + .../AnaEx03.cc => hadronic/Hadr05/Hadr05.cc} | 127 +- examples/extended/hadronic/Hadr05/History | 44 + .../extended/hadronic/Hadr05/Pb-lAr-em.mac | 33 + examples/extended/hadronic/Hadr05/Pb-lAr.mac | 33 + examples/extended/hadronic/Hadr05/W-lAr.mac | 33 + examples/extended/hadronic/Hadr05/emtest.mac | 23 + examples/extended/hadronic/Hadr05/emtutor.mac | 25 + examples/extended/hadronic/Hadr05/hadr05.in | 26 + .../Hadr05}/include/ActionInitialization.hh | 10 +- .../Hadr05/include/DetectorConstruction.hh | 136 + .../Hadr05}/include/DetectorMessenger.hh | 28 +- .../Hadr05/include/ElectromagneticPhysics.hh} | 26 +- .../Hadr05}/include/EventAction.hh | 34 +- .../Hadr05/include/GammaNuclearPhysics.hh | 54 + .../Hadr05/include/GammaNuclearPhysicsLEND.hh | 54 + .../Hadr05/include/HadronElasticPhysicsHP.hh | 58 + .../hadronic/Hadr05/include/HistoManager.hh | 58 + .../Hadr05/include/PhysicsList.hh} | 25 +- .../Hadr05/include/PrimaryGeneratorAction.hh | 70 + .../Hadr05/include/RadioactiveDecayPhysics.hh | 59 + .../Hadr05/include/Run.hh} | 70 +- .../hadronic/Hadr05/include/RunAction.hh} | 63 +- .../include/SteppingAction.hh} | 35 +- .../hadronic/Hadr05/include/TrackingAction.hh | 58 + .../AnaEx03 => hadronic/Hadr05}/plotHisto.C | 15 +- .../Hadr05}/src/ActionInitialization.cc | 42 +- .../Hadr05/src/DetectorConstruction.cc | 500 + .../hadronic/Hadr05/src/DetectorMessenger.cc | 195 + .../Hadr05/src/ElectromagneticPhysics.cc} | 88 +- .../Hadr05}/src/EventAction.cc | 59 +- .../Hadr05/src/GammaNuclearPhysics.cc | 88 + .../Hadr05/src/GammaNuclearPhysicsLEND.cc} | 69 +- .../Hadr05/src/HadronElasticPhysicsHP.cc | 102 + .../hadronic/Hadr05/src/HistoManager.cc | 84 + .../hadronic/Hadr05/src/PhysicsList.cc | 122 + .../Hadr05/src/PrimaryGeneratorAction.cc | 137 + .../Hadr05/src/RadioactiveDecayPhysics.cc | 106 + examples/extended/hadronic/Hadr05/src/Run.cc | 288 + .../extended/hadronic/Hadr05/src/RunAction.cc | 118 + .../hadronic/Hadr05/src/SteppingAction.cc | 141 + .../hadronic/Hadr05/src/TrackingAction.cc | 98 + .../AnaEx03 => hadronic/Hadr05}/vis.mac | 15 +- examples/extended/hadronic/Hadr06/.README.txt | 162 - .../extended/hadronic/Hadr06/CMakeLists.txt | 2 +- examples/extended/hadronic/Hadr06/History | 23 + examples/extended/hadronic/Hadr06/README | 152 - examples/extended/hadronic/Hadr06/hadr06.out | 269 +- .../Hadr06/include/HadronElasticPhysicsHP.hh | 15 +- .../hadronic/Hadr06/include/HistoManager.hh | 4 +- .../Hadr06/include/RadioactiveDecayPhysics.hh | 59 + .../Hadr06/src/ElectromagneticPhysics.cc | 18 +- .../Hadr06/src/HadronElasticPhysicsHP.cc | 29 +- .../hadronic/Hadr06/src/HistoManager.cc | 2 +- .../hadronic/Hadr06/src/PhysicsList.cc | 11 +- .../Hadr06/src/RadioactiveDecayPhysics.cc | 106 + examples/extended/hadronic/Hadr06/src/Run.cc | 4 +- .../hadronic/Hadr06/src/TrackingAction.cc | 3 +- examples/extended/hadronic/Hadr07/.README.txt | 170 - .../extended/hadronic/Hadr07/CMakeLists.txt | 2 +- examples/extended/hadronic/Hadr07/History | 22 + examples/extended/hadronic/Hadr07/README | 161 - examples/extended/hadronic/Hadr07/hadr07.out | 248 +- .../Hadr07/include/HadronElasticPhysicsHP.hh | 22 +- .../hadronic/Hadr07/include/HistoManager.hh | 4 +- .../Hadr07/include/RadioactiveDecayPhysics.hh | 59 + .../Hadr07/src/ElectromagneticPhysics.cc | 18 +- .../Hadr07/src/HadronElasticPhysicsHP.cc | 31 +- .../hadronic/Hadr07/src/HistoManager.cc | 2 +- .../hadronic/Hadr07/src/PhysicsList.cc | 7 +- .../Hadr07/src/RadioactiveDecayPhysics.cc | 106 + examples/extended/hadronic/Hadr07/src/Run.cc | 4 +- .../hadronic/Hadr07/src/TrackingAction.cc | 3 +- examples/extended/hadronic/Hadr08/.README.txt | 57 - .../extended/hadronic/Hadr08/CMakeLists.txt | 2 +- examples/extended/hadronic/Hadr08/README | 40 - examples/extended/hadronic/Hadr09/.README.txt | 53 - .../extended/hadronic/Hadr09/CMakeLists.txt | 2 +- examples/extended/hadronic/Hadr09/Hadr09.cc | 169 +- .../hadronic/Hadr09/Hadr09.cc-ION_PROJECTILE | 365 + examples/extended/hadronic/Hadr09/History | 4 + examples/extended/hadronic/Hadr09/README | 39 - .../Hadr09/include/HadronicGenerator.hh | 41 +- .../hadronic/Hadr09/src/HadronicGenerator.cc | 591 +- examples/extended/hadronic/Hadr10/.README.txt | 71 - .../extended/hadronic/Hadr10/CMakeLists.txt | 5 +- examples/extended/hadronic/Hadr10/README | 71 - examples/extended/hadronic/History | 9 + .../hadronic/NeutronSource/.README.txt | 154 - .../hadronic/NeutronSource/CMakeLists.txt | 2 +- .../extended/hadronic/NeutronSource/History | 22 + .../hadronic/NeutronSource/NeutronSource.out | 276 +- .../extended/hadronic/NeutronSource/README | 143 - .../include/HadronElasticPhysicsHP.hh | 22 +- .../NeutronSource/include/HistoManager.hh | 4 +- .../include/NeutronHPMessenger.hh | 62 - .../include/RadioactiveDecayPhysics.hh | 59 + .../src/ElectromagneticPhysics.cc | 18 +- .../src/HadronElasticPhysicsHP.cc | 35 +- .../NeutronSource/src/HistoManager.cc | 2 +- .../NeutronSource/src/NeutronHPMessenger.cc | 71 - .../hadronic/NeutronSource/src/PhysicsList.cc | 6 +- .../src/RadioactiveDecayPhysics.cc | 106 + .../hadronic/NeutronSource/src/Run.cc | 3 +- .../NeutronSource/src/TrackingAction.cc | 1 + examples/extended/hadronic/README | 94 - examples/extended/medical/.README.txt | 50 - examples/extended/medical/CMakeLists.txt | 2 +- examples/extended/medical/DICOM/.README.txt | 354 - .../extended/medical/DICOM/CMakeLists.txt | 2 +- examples/extended/medical/DICOM/History | 3 + examples/extended/medical/DICOM/README | 331 - .../medical/DICOM/dicomReader/CMakeLists.txt | 2 +- .../include/DicomFileCT_NOdcmrt.hh | 16 +- .../dicomReader/include/DicomVFileImage.hh | 16 +- .../DICOM/dicomReader/src/DicomFileCT.cc | 70 +- .../DICOM/dicomReader/src/DicomFilePET.cc | 24 +- .../DICOM/dicomReader/src/DicomVFileImage.cc | 46 +- .../include/DicomDetectorConstruction.hh | 4 +- .../DicomNestedPhantomParameterisation.hh | 2 +- .../DicomPartialDetectorConstruction.hh | 2 +- .../DICOM/include/DicomPhantomZSliceHeader.hh | 22 +- examples/extended/medical/DICOM/run.out | 489 +- .../DICOM/src/DicomDetectorConstruction.cc | 74 +- .../medical/DICOM/src/DicomHandler.cc | 6 +- .../medical/DICOM/src/DicomIntersectVolume.cc | 6 +- .../DicomNestedParamDetectorConstruction.cc | 14 +- .../src/DicomNestedPhantomParameterisation.cc | 2 +- .../src/DicomPartialDetectorConstruction.cc | 52 +- .../DICOM/src/DicomPhantomZSliceHeader.cc | 40 +- .../src/DicomRegularDetectorConstruction.cc | 4 +- examples/extended/medical/DICOM2/.README.txt | 69 - .../extended/medical/DICOM2/CMakeLists.txt | 2 +- examples/extended/medical/DICOM2/README | 65 - .../extended/medical/GammaTherapy/.README.txt | 70 - .../medical/GammaTherapy/CMakeLists.txt | 2 +- .../medical/GammaTherapy/GammaTherapy.out | 263 +- .../extended/medical/GammaTherapy/History | 9 + examples/extended/medical/GammaTherapy/README | 67 - .../GammaTherapy/include/HistoManager.hh | 4 +- .../medical/GammaTherapy/include/Run.hh | 2 +- .../GammaTherapy/src/DetectorMessenger.cc | 2 - .../medical/GammaTherapy/src/HistoManager.cc | 4 +- .../extended/medical/GammaTherapy/src/Run.cc | 3 - examples/extended/medical/README | 55 - examples/extended/medical/dna/.README.txt | 52 - .../extended/medical/dna/AuNP/.README.txt | 111 - .../extended/medical/dna/AuNP/CMakeLists.txt | 2 +- examples/extended/medical/dna/AuNP/History | 15 + examples/extended/medical/dna/AuNP/README | 84 - .../medical/dna/AuNP/include/HistoManager.hh | 3 +- .../dna/AuNP/include/TimeStepAction.hh | 1 - .../medical/dna/AuNP/src/HistoManager.cc | 2 +- examples/extended/medical/dna/AuNP/src/Run.cc | 2 +- .../medical/dna/AuNP/src/TimeStepAction.cc | 1 + examples/extended/medical/dna/CMakeLists.txt | 4 +- examples/extended/medical/dna/History | 7 + examples/extended/medical/dna/README | 87 - .../extended/medical/dna/chem1/.README.txt | 51 - .../extended/medical/dna/chem1/CMakeLists.txt | 2 +- examples/extended/medical/dna/chem1/README | 52 - examples/extended/medical/dna/chem1/chem1.out | 217 +- .../extended/medical/dna/chem2/.README.txt | 53 - .../extended/medical/dna/chem2/CMakeLists.txt | 2 +- examples/extended/medical/dna/chem2/README | 54 - examples/extended/medical/dna/chem2/chem2.out | 213 +- .../extended/medical/dna/chem3/.README.txt | 68 - .../extended/medical/dna/chem3/CMakeLists.txt | 2 +- examples/extended/medical/dna/chem3/History | 4 + examples/extended/medical/dna/chem3/README | 68 - examples/extended/medical/dna/chem3/chem3.out | 215 +- .../medical/dna/chem3/movie_chemistry.loop | 2 +- .../medical/dna/chem3/movie_physics.loop | 2 +- .../extended/medical/dna/chem4/.README.txt | 194 - .../extended/medical/dna/chem4/CMakeLists.txt | 2 +- examples/extended/medical/dna/chem4/History | 4 + examples/extended/medical/dna/chem4/README | 177 - examples/extended/medical/dna/chem4/chem4.out | 227 +- .../medical/dna/chem4/include/ScoreSpecies.hh | 4 +- .../medical/dna/chem4/plot/CMakeLists.txt | 2 +- .../medical/dna/chem4/src/ScoreSpecies.cc | 23 +- .../extended/medical/dna/chem5/.README.txt | 159 - .../extended/medical/dna/chem5/CMakeLists.txt | 2 +- examples/extended/medical/dna/chem5/README | 165 - .../extended/medical/dna/chem6/.README.txt | 218 - .../extended/medical/dna/chem6/CMakeLists.txt | 2 +- examples/extended/medical/dna/chem6/History | 11 + examples/extended/medical/dna/chem6/README | 213 - examples/extended/medical/dna/chem6/beam.in | 14 +- .../medical/dna/chem6/include/ScoreSpecies.hh | 4 +- .../medical/dna/chem6/src/ScoreSpecies.cc | 23 +- .../medical/dna/clustering/.README.txt | 127 - .../medical/dna/clustering/CMakeLists.txt | 2 +- .../extended/medical/dna/clustering/History | 10 + .../extended/medical/dna/clustering/README | 109 - .../medical/dna/clustering/clustering.out | 217 +- .../dna/clustering/include/Analysis.hh | 39 - .../medical/dna/clustering/src/EventAction.cc | 2 +- .../medical/dna/clustering/src/RunAction.cc | 4 +- .../medical/dna/dnadamage1/.README.txt | 95 - .../medical/dna/dnadamage1/CMakeLists.txt | 5 +- .../extended/medical/dna/dnadamage1/History | 14 + .../medical/dna/dnadamage1/README.txt | 90 - .../medical/dna/dnadamage1/molecule.C | 2 +- .../extended/medical/dna/dnadamage1/plot.C | 9 +- .../medical/dna/dnadamage1/src/RunAction.cc | 4 +- .../dna/dnadamage1/src/SteppingAction.cc | 2 +- .../dna/dnadamage1/src/TimeStepAction.cc | 2 +- .../medical/dna/dnaphysics/.README.txt | 183 - .../medical/dna/dnaphysics/CMakeLists.txt | 2 +- .../extended/medical/dna/dnaphysics/History | 10 + .../extended/medical/dna/dnaphysics/README | 181 - .../medical/dna/dnaphysics/dnaphysics.out | 257 +- .../dna/dnaphysics/include/Analysis.hh | 41 - .../medical/dna/dnaphysics/src/RunAction.cc | 10 +- .../dna/dnaphysics/src/SteppingAction.cc | 3 +- .../extended/medical/dna/icsd/.README.txt | 67 - .../extended/medical/dna/icsd/CMakeLists.txt | 2 +- examples/extended/medical/dna/icsd/History | 10 + examples/extended/medical/dna/icsd/README | 61 - examples/extended/medical/dna/icsd/icsd.out | 99 +- .../medical/dna/icsd/include/Analysis.hh | 41 - .../medical/dna/icsd/src/EventAction.cc | 2 +- .../medical/dna/icsd/src/RunAction.cc | 6 +- .../medical/dna/icsd/src/SteppingAction.cc | 2 +- examples/extended/medical/dna/mfp/.README.txt | 85 - .../extended/medical/dna/mfp/CMakeLists.txt | 2 +- examples/extended/medical/dna/mfp/History | 9 + examples/extended/medical/dna/mfp/README | 79 - .../medical/dna/mfp/include/HistoManager.hh | 3 +- examples/extended/medical/dna/mfp/mfp.out | 217 +- .../medical/dna/mfp/src/HistoManager.cc | 4 +- .../medical/dna/microdosimetry/.README.txt | 191 - .../medical/dna/microdosimetry/CMakeLists.txt | 2 +- .../medical/dna/microdosimetry/History | 14 + .../medical/dna/microdosimetry/README | 184 - .../dna/microdosimetry/include/Analysis.hh | 40 - .../dna/microdosimetry/microdosimetry.out | 260 +- .../dna/microdosimetry/src/RunAction.cc | 11 +- .../dna/microdosimetry/src/SteppingAction.cc | 3 +- .../medical/dna/microprox/.README.txt | 70 - .../medical/dna/microprox/CMakeLists.txt | 2 +- .../extended/medical/dna/microprox/History | 10 + .../extended/medical/dna/microprox/README | 52 - .../medical/dna/microprox/include/Analysis.hh | 44 - .../medical/dna/microprox/src/RunAction.cc | 6 +- .../medical/dna/microprox/src/TrackerSD.cc | 2 +- examples/extended/medical/dna/microyz/.README | 73 - .../extended/medical/dna/microyz/.README.txt | 73 - .../medical/dna/microyz/CMakeLists.txt | 2 +- examples/extended/medical/dna/microyz/History | 10 + examples/extended/medical/dna/microyz/README | 59 - .../medical/dna/microyz/include/Analysis.hh | 41 - .../extended/medical/dna/microyz/microyz.out | 239 +- .../medical/dna/microyz/src/RunAction.cc | 6 +- .../medical/dna/microyz/src/TrackerSD.cc | 2 +- examples/extended/medical/dna/neuron/.README | 164 - .../extended/medical/dna/neuron/.README.txt | 173 - .../medical/dna/neuron/CMakeLists.txt | 2 +- examples/extended/medical/dna/neuron/History | 13 + examples/extended/medical/dna/neuron/README | 165 - .../medical/dna/neuron/include/Analysis.hh | 39 - .../extended/medical/dna/neuron/neuron.out | 291 +- .../medical/dna/neuron/src/EventAction.cc | 2 +- .../extended/medical/dna/neuron/src/Run.cc | 2 +- .../medical/dna/neuron/src/RunAction.cc | 6 +- .../medical/dna/neuron/src/SteppingAction.cc | 2 +- examples/extended/medical/dna/neuron/vis.mac | 4 +- .../extended/medical/dna/pdb4dna/.README.txt | 134 - .../medical/dna/pdb4dna/CMakeLists.txt | 2 +- examples/extended/medical/dna/pdb4dna/History | 10 + examples/extended/medical/dna/pdb4dna/README | 133 - .../medical/dna/pdb4dna/include/Analysis.hh | 46 - .../extended/medical/dna/pdb4dna/pdb4dna.out | 217 +- .../medical/dna/pdb4dna/src/EventAction.cc | 2 +- .../medical/dna/pdb4dna/src/RunAction.cc | 5 +- .../extended/medical/dna/range/.README.txt | 97 - .../extended/medical/dna/range/CMakeLists.txt | 2 +- examples/extended/medical/dna/range/History | 9 + examples/extended/medical/dna/range/README | 93 - .../medical/dna/range/include/HistoManager.hh | 3 +- examples/extended/medical/dna/range/range.out | 215 +- .../medical/dna/range/src/HistoManager.cc | 2 +- .../medical/dna/scavenger/CMakeLists.txt | 63 + .../scripts => medical/dna/scavenger}/History | 13 +- .../medical/dna/scavenger/Rtable_NO2_NO3.txt | 41 + .../medical/dna/scavenger/Rtable_O2.txt | 38 + .../extended/medical/dna/scavenger/beam.in | 24 + .../scavenger/include/ActionInitialization.hh | 54 + .../scavenger/include/DetectorConstruction.hh | 59 + .../scavenger/include/EmDNAChemistry.hh} | 76 +- .../scavenger/include/ParserChemReaction.hh | 91 + .../dna/scavenger/include/PhysicsList.hh | 65 + .../include/PrimaryGeneratorAction.hh | 58 + .../dna/scavenger/include/PrimaryKiller.hh | 95 + .../medical/dna/scavenger/include/Run.hh | 64 + .../dna/scavenger/include/RunAction.hh} | 34 +- .../dna/scavenger/include/ScoreSpecies.hh | 132 + .../include/StackingAction.hh} | 40 +- .../dna/scavenger/include/TimeStepAction.hh | 75 + .../extended/medical/dna/scavenger/plotG.C | 235 + .../medical/dna/scavenger/scavenger.cc | 99 + .../dna/scavenger/src/ActionInitialization.cc | 74 + .../dna/scavenger/src/DetectorConstruction.cc | 115 + .../dna/scavenger/src/EmDNAChemistry.cc | 599 + .../dna/scavenger/src/ParserChemReaction.cc | 358 + .../medical/dna/scavenger/src/PhysicsList.cc | 89 + .../scavenger/src/PrimaryGeneratorAction.cc | 59 + .../dna/scavenger/src/PrimaryKiller.cc | 104 + .../extended/medical/dna/scavenger/src/Run.cc | 89 + .../medical/dna/scavenger/src/RunAction.cc | 99 + .../medical/dna/scavenger/src/ScoreSpecies.cc | 268 + .../dna/scavenger/src/StackingAction.cc | 51 + .../dna/scavenger/src/TimeStepAction.cc | 105 + .../extended/medical/dna/scavenger/vis.mac | 83 + .../extended/medical/dna/slowing/.README.txt | 75 - .../medical/dna/slowing/CMakeLists.txt | 2 +- examples/extended/medical/dna/slowing/History | 10 + examples/extended/medical/dna/slowing/README | 77 - .../medical/dna/slowing/include/Analysis.hh | 44 - .../dna/slowing/include/HistoManager.hh | 4 +- .../extended/medical/dna/slowing/slowing.out | 217 +- .../medical/dna/slowing/src/HistoManager.cc | 2 +- .../medical/dna/slowing/src/SteppingAction.cc | 2 +- .../medical/dna/splitting/.README.txt | 109 - .../medical/dna/splitting/CMakeLists.txt | 2 +- .../extended/medical/dna/splitting/History | 10 + .../extended/medical/dna/splitting/README | 100 - .../dna/splitting/include/HistoManager.hh | 4 +- .../medical/dna/splitting/src/EventAction.cc | 2 +- .../medical/dna/splitting/src/HistoManager.cc | 1 - .../medical/dna/splitting/src/RunAction.cc | 3 +- .../extended/medical/dna/spower/.README.txt | 87 - .../medical/dna/spower/CMakeLists.txt | 2 +- examples/extended/medical/dna/spower/README | 85 - .../extended/medical/dna/spower/spower.out | 213 +- .../extended/medical/dna/svalue/.README.txt | 82 - .../medical/dna/svalue/CMakeLists.txt | 2 +- examples/extended/medical/dna/svalue/History | 9 + examples/extended/medical/dna/svalue/README | 106 - .../dna/svalue/include/HistoManager.hh | 3 +- .../medical/dna/svalue/src/HistoManager.cc | 4 +- .../extended/medical/dna/svalue/svalue.out | 297 +- .../medical/dna/wholeNuclearDNA/.README.txt | 122 - .../dna/wholeNuclearDNA/CMakeLists.txt | 2 +- .../medical/dna/wholeNuclearDNA/History | 14 + .../medical/dna/wholeNuclearDNA/README | 103 - .../dna/wholeNuclearDNA/include/Analysis.hh | 40 - .../dna/wholeNuclearDNA/src/RunAction.cc | 11 +- .../dna/wholeNuclearDNA/src/SteppingAction.cc | 2 +- .../dna/wholeNuclearDNA/wholeNuclearDNA.out | 215 +- .../extended/medical/dna/wvalue/.README.txt | 98 - .../medical/dna/wvalue/CMakeLists.txt | 2 +- examples/extended/medical/dna/wvalue/History | 9 + examples/extended/medical/dna/wvalue/README | 97 - .../dna/wvalue/include/HistoManager.hh | 3 +- .../medical/dna/wvalue/src/HistoManager.cc | 2 +- .../extended/medical/dna/wvalue/wvalue.out | 231 +- .../medical/electronScattering/.README.txt | 139 - .../medical/electronScattering/CMakeLists.txt | 2 +- .../electronScattering/EGS_13MeV/README | 34 - .../medical/electronScattering/History | 15 + .../medical/electronScattering/README | 126 - .../electronScattering/electronScattering.cc | 28 +- .../electronScattering/electronScattering.out | 265 +- .../include/HistoManager.hh | 4 +- .../include/PhysListEmStandardGS.hh | 67 - .../electronScattering/include/PhysicsList.hh | 6 +- .../electronScattering/src/HistoManager.cc | 4 +- .../src/PhysListEmStandardGS.cc | 152 - .../src/PhysListEmStandardSS.cc | 136 - .../src/PhysListEmStandardWVI.cc | 170 - .../electronScattering/src/PhysicsList.cc | 40 +- .../medical/electronScattering2/.README.txt | 182 - .../electronScattering2/CMakeLists.txt | 2 +- .../medical/electronScattering2/README | 170 - .../electronScattering2.out | 693 +- .../extended/medical/fanoCavity/.README.txt | 181 - .../medical/fanoCavity/CMakeLists.txt | 2 +- examples/extended/medical/fanoCavity/History | 9 + examples/extended/medical/fanoCavity/README | 171 - .../medical/fanoCavity/fanoCavity.out | 129 +- .../fanoCavity/include/HistoManager.hh | 5 +- .../medical/fanoCavity/src/HistoManager.cc | 4 +- .../extended/medical/fanoCavity2/.README.txt | 157 - .../medical/fanoCavity2/CMakeLists.txt | 2 +- examples/extended/medical/fanoCavity2/History | 9 + examples/extended/medical/fanoCavity2/README | 146 - .../medical/fanoCavity2/fanoCavity2.out | 125 +- .../fanoCavity2/include/HistoManager.hh | 5 +- .../medical/fanoCavity2/src/HistoManager.cc | 4 +- examples/extended/optical/.README.txt | 35 - examples/extended/optical/CMakeLists.txt | 2 +- examples/extended/optical/LXe/.README.txt | 385 - examples/extended/optical/LXe/CMakeLists.txt | 2 +- examples/extended/optical/LXe/History | 9 + examples/extended/optical/LXe/LXe.out | 2799 +- examples/extended/optical/LXe/README | 356 - .../optical/LXe/include/LXeHistoManager.hh | 5 +- .../optical/LXe/src/LXeHistoManager.cc | 5 +- .../extended/optical/OpNovice/.README.txt | 124 - .../extended/optical/OpNovice/CMakeLists.txt | 2 +- examples/extended/optical/OpNovice/History | 14 + .../extended/optical/OpNovice/OpNovice.cc | 220 +- .../extended/optical/OpNovice/OpNovice.in | 4 +- .../extended/optical/OpNovice/OpNovice.out | 22054 ++++++----- examples/extended/optical/OpNovice/README | 124 - .../include/OpNoviceDetectorConstruction.hh | 34 +- ...senger.hh => OpNoviceDetectorMessenger.hh} | 28 +- .../OpNoviceGDMLDetectorConstruction.hh | 57 +- ...NoviceGDMLDetectorConstructionMessenger.hh | 55 - .../optical/OpNovice/include/OpNoviceRun.hh | 4 +- .../src/OpNoviceDetectorConstruction.cc | 186 +- ...senger.cc => OpNoviceDetectorMessenger.cc} | 88 +- .../src/OpNoviceGDMLDetectorConstruction.cc | 156 +- ...NoviceGDMLDetectorConstructionMessenger.cc | 87 - .../OpNovice/src/OpNoviceStackingAction.cc | 3 +- .../extended/optical/OpNovice2/.README.txt | 158 - .../extended/optical/OpNovice2/CMakeLists.txt | 2 +- examples/extended/optical/OpNovice2/History | 10 + .../extended/optical/OpNovice2/OpNovice2.out | 459 +- examples/extended/optical/OpNovice2/README | 137 - .../optical/OpNovice2/include/HistoManager.hh | 5 +- .../optical/OpNovice2/src/HistoManager.cc | 5 +- .../extended/optical/OpNovice2/src/Run.cc | 4 +- examples/extended/optical/README | 34 - examples/extended/optical/wls/.README.txt | 103 - examples/extended/optical/wls/CMakeLists.txt | 6 +- examples/extended/optical/wls/History | 18 + examples/extended/optical/wls/README | 99 - examples/extended/optical/wls/Sr90.mac | 27 - examples/extended/optical/wls/electron.mac | 50 + examples/extended/optical/wls/gui.mac | 24 +- .../wls/include/WLSDetectorConstruction.hh | 16 +- .../optical/wls/include/WLSEventAction.hh | 2 - .../optical/wls/include/WLSPhotonDetHit.hh | 9 +- .../optical/wls/include/WLSPhotonDetSD.hh | 4 +- .../extended/optical/wls/include/WLSRun.hh | 8 - .../wls/src/WLSDetectorConstruction.cc | 267 +- .../optical/wls/src/WLSEventAction.cc | 12 +- .../optical/wls/src/WLSPhotonDetHit.cc | 25 +- .../optical/wls/src/WLSPhotonDetSD.cc | 27 +- .../wls/src/WLSPrimaryGeneratorAction.cc | 2 +- examples/extended/optical/wls/src/WLSRun.cc | 13 - .../extended/optical/wls/src/WLSRunAction.cc | 43 +- .../optical/wls/src/WLSSteppingAction.cc | 32 +- .../optical/wls/src/WLSTrajectoryPoint.cc | 3 +- examples/extended/optical/wls/vis.mac | 42 +- examples/extended/optical/wls/wls.cc | 4 + examples/extended/optical/wls/wls.out | 326 +- examples/extended/parallel/.README.txt | 29 - examples/extended/parallel/CMakeLists.txt | 2 +- examples/extended/parallel/MPI/.README.txt | 238 - examples/extended/parallel/MPI/CMakeLists.txt | 2 +- examples/extended/parallel/MPI/History | 18 + examples/extended/parallel/MPI/README.md | 238 - .../parallel/MPI/ctests-definitions.cmake | 134 - .../parallel/MPI/examples/CMakeLists.txt | 2 +- .../parallel/MPI/examples/exMPI01/.README.txt | 46 - .../MPI/examples/exMPI01/CMakeLists.txt | 2 +- .../parallel/MPI/examples/exMPI01/README.html | 245 - .../parallel/MPI/examples/exMPI01/README.md | 37 - .../parallel/MPI/examples/exMPI02/.README.txt | 50 - .../MPI/examples/exMPI02/CMakeLists.txt | 2 +- .../parallel/MPI/examples/exMPI02/README.html | 246 - .../parallel/MPI/examples/exMPI02/README.md | 44 - .../parallel/MPI/examples/exMPI03/.README.txt | 59 - .../MPI/examples/exMPI03/CMakeLists.txt | 2 +- .../parallel/MPI/examples/exMPI03/README.html | 255 - .../parallel/MPI/examples/exMPI03/README.md | 54 - .../MPI/examples/exMPI03/src/Analysis.cc | 9 +- .../examples/exMPI03/src/RunActionMaster.cc | 29 +- .../parallel/MPI/examples/exMPI04/.README.txt | 58 - .../MPI/examples/exMPI04/CMakeLists.txt | 2 +- .../parallel/MPI/examples/exMPI04/README.md | 53 - .../MPI/examples/exMPI04/src/Analysis.cc | 9 +- .../examples/exMPI04/src/RunActionMaster.cc | 44 +- .../parallel/MPI/source/CMakeLists.txt | 2 +- .../include/G4RootMpiAnalysisManager.hh | 7 + .../include/G4RootMpiPNtupleManager.hh | 62 +- .../analysis/src/G4RootMpiAnalysisManager.cc | 31 +- .../src/G4RootMpiNtupleFileManager.cc | 75 +- .../analysis/src/G4RootMpiNtupleManager.cc | 2 +- .../analysis/src/G4RootMpiPNtupleManager.cc | 87 +- .../parallel/MPI/source/src/G4MPIbatch.cc | 18 +- .../MPI/source/src/G4MPIntupleMerger.cc | 1 + .../parallel/MPI/source/src/G4MPIsession.cc | 20 +- .../parallel/MPI/source/src/G4VMPIsession.cc | 24 +- examples/extended/parallel/README | 21 - examples/extended/parallel/TBB/.README.txt | 27 - .../extended/parallel/TBB/B2b/.README.txt | 51 - .../extended/parallel/TBB/B2b/CMakeLists.txt | 2 +- examples/extended/parallel/TBB/B2b/README | 47 - examples/extended/parallel/TBB/CMakeLists.txt | 2 +- examples/extended/parallel/TBB/README | 22 - .../parallel/ThreadsafeScorers/.README.txt | 202 - .../parallel/ThreadsafeScorers/CMakeLists.txt | 2 +- .../parallel/ThreadsafeScorers/README | 188 - .../ThreadsafeScorers/threadsafe-scorers.out | 1958 +- .../parallel/TopC/ParN02/.README.N02.txt | 124 - .../extended/parallel/TopC/ParN02/.README.txt | 199 - .../TopC/ParN02/AnnotatedFiles/000README | 47 - examples/extended/parallel/TopC/ParN02/README | 155 - .../extended/parallel/TopC/ParN02/README.N02 | 123 - .../extended/parallel/TopC/ParN04/.README.N04 | 47 - .../parallel/TopC/ParN04/.README.N04.txt | 47 - .../extended/parallel/TopC/ParN04/.README.txt | 200 - .../TopC/ParN04/AnnotatedFiles/000README | 47 - examples/extended/parallel/TopC/ParN04/README | 157 - .../extended/parallel/TopC/ParN04/README.N04 | 47 - .../parallel/TopC/info/NEW_APP_README | 46 - .../extended/parallel/TopC/info/README.html | 114 - .../extended/parameterisations/.README.txt | 33 - .../extended/parameterisations/CMakeLists.txt | 3 +- examples/extended/parameterisations/History | 3 + .../parameterisations/Par01/.README.txt | 76 - .../parameterisations/Par01/CMakeLists.txt | 2 +- .../extended/parameterisations/Par01/README | 72 - .../parameterisations/Par01/examplePar01.out | 3937 +- .../parameterisations/Par02/.README.txt | 250 - .../parameterisations/Par02/CMakeLists.txt | 2 +- .../extended/parameterisations/Par02/History | 9 + .../extended/parameterisations/Par02/README | 254 - .../parameterisations/Par02/examplePar02.out | 38 +- .../Par02/src/Par02FastSimModelEMCal.cc | 2 +- .../Par02/src/Par02FastSimModelHCal.cc | 2 +- .../Par02/src/Par02FastSimModelTracker.cc | 2 +- .../Par02/src/Par02Output.cc | 4 +- .../parameterisations/Par03/.README.txt | 134 - .../parameterisations/Par03/CMakeLists.txt | 2 +- .../extended/parameterisations/Par03/History | 12 + .../extended/parameterisations/Par03/README | 130 - .../Par03/src/Par03EventAction.cc | 2 +- .../Par03/src/Par03RunAction.cc | 9 +- .../parameterisations/Par04/CMakeLists.txt | 146 + .../extended/parameterisations/Par04/History | 18 + .../Par04/cmake/FindOnnxRuntime.cmake | 27 + .../parameterisations/Par04/examplePar04.cc | 153 + .../parameterisations/Par04/examplePar04.in | 30 + .../Par04/examplePar04_lwtnn.in | 47 + .../Par04/examplePar04_onnx.in | 49 + .../include/Par04ActionInitialisation.hh | 57 + .../Par04/include/Par04DefineMeshModel.hh | 65 + .../include/Par04DetectorConstruction.hh | 157 + .../Par04/include/Par04DetectorMessenger.hh | 91 + .../Par04/include/Par04EventAction.hh | 89 + .../Par04/include/Par04EventInformation.hh | 72 + .../Par04/include/Par04Hit.hh | 153 + .../Par04/include/Par04InferenceInterface.hh | 54 + .../Par04/include/Par04InferenceMessenger.hh | 92 + .../Par04/include/Par04InferenceSetup.hh | 189 + .../Par04/include/Par04LwtnnInference.hh} | 73 +- .../Par04/include/Par04MLFastSimModel.hh} | 69 +- .../Par04/include/Par04OnnxInference.hh | 70 +- .../include/Par04PrimaryGeneratorAction.hh | 41 +- .../Par04/include/Par04RunAction.hh | 77 + .../Par04/include/Par04SensitiveDetector.hh | 92 + .../Par04/src/Par04ActionInitialisation.cc} | 41 +- .../Par04/src/Par04DefineMeshModel.cc | 88 + .../Par04/src/Par04DetectorConstruction.cc | 266 + .../Par04/src/Par04DetectorMessenger.cc | 267 + .../Par04/src/Par04EventAction.cc | 203 + .../Par04/src/Par04EventInformation.cc | 50 + .../parameterisations/Par04/src/Par04Hit.cc | 168 + .../Par04/src/Par04InferenceMessenger.cc | 249 + .../Par04/src/Par04InferenceSetup.cc | 176 + .../Par04/src/Par04LwtnnInference.cc | 61 + .../Par04/src/Par04MLFastSimModel.cc | 101 + .../Par04/src/Par04OnnxInference.cc | 128 + .../Par04/src/Par04PrimaryGeneratorAction.cc | 67 + .../Par04/src/Par04RunAction.cc | 125 + .../Par04/src/Par04SensitiveDetector.cc | 206 + .../extended/parameterisations/Par04/vis.mac | 94 + examples/extended/parameterisations/README | 33 - .../parameterisations/gflash/.README.txt | 165 - .../parameterisations/gflash/CMakeLists.txt | 2 +- .../extended/parameterisations/gflash/History | 14 + .../extended/parameterisations/gflash/README | 175 - .../gflash/gflash1/CMakeLists.txt | 2 +- .../gflash/gflash2/CMakeLists.txt | 2 +- .../gflash/gflash3/CMakeLists.txt | 2 +- .../gflash/gflasha/.README.txt | 119 - .../gflash/gflasha/CMakeLists.txt | 4 +- .../gflash/gflasha/ExGflasha.cc | 44 +- .../parameterisations/gflash/gflasha/README | 110 - .../include/ExGflashActionInitialization.hh | 13 +- .../include/ExGflashDetectorConstruction.hh | 74 +- .../gflasha/include/ExGflashEventAction.hh | 20 +- .../gflasha/include/ExGflashHistoManager.hh | 23 +- .../gflash/gflasha/include/ExGflashHit.hh | 84 +- .../include/ExGflashHomoShowerTuning.hh | 141 +- .../gflasha/include/ExGflashMessenger.hh | 30 +- .../include/ExGflashPrimaryGeneratorAction.hh | 14 +- .../gflasha/include/ExGflashRunAction.hh | 14 +- .../include/ExGflashSensitiveDetector.hh | 24 +- .../gflash/gflasha/power-off.png | Bin 969 -> 0 bytes .../src/ExGflashActionInitialization.cc | 14 +- .../src/ExGflashDetectorConstruction.cc | 288 +- .../gflash/gflasha/src/ExGflashEventAction.cc | 187 +- .../gflasha/src/ExGflashHistoManager.cc | 59 +- .../gflash/gflasha/src/ExGflashHit.cc | 47 +- .../gflash/gflasha/src/ExGflashMessenger.cc | 70 +- .../src/ExGflashPrimaryGeneratorAction.cc | 8 +- .../gflash/gflasha/src/ExGflashRunAction.cc | 33 +- .../gflasha/src/ExGflashSensitiveDetector.cc | 69 +- .../parameterisations/gflash/gflasha/test.mac | 11 +- .../parameterisations/gflash/gflasha/vis.mac | 1 - examples/extended/persistency/.README.txt | 17 - examples/extended/persistency/CMakeLists.txt | 2 +- examples/extended/persistency/P01/.README.txt | 83 - .../extended/persistency/P01/CMakeLists.txt | 2 +- examples/extended/persistency/P01/README | 82 - .../extended/persistency/P01/p01-read.out | 703 +- .../extended/persistency/P01/p01-write.out | 2760 +- examples/extended/persistency/P02/.README.txt | 64 - .../extended/persistency/P02/CMakeLists.txt | 2 +- examples/extended/persistency/P02/README | 61 - examples/extended/persistency/P03/.README.txt | 133 - .../extended/persistency/P03/CMakeLists.txt | 2 +- examples/extended/persistency/P03/README | 117 - examples/extended/persistency/P03/batch.out | 239 +- examples/extended/persistency/README | 13 - .../extended/persistency/gdml/.README.txt | 24 - .../extended/persistency/gdml/CMakeLists.txt | 2 +- .../extended/persistency/gdml/G01/.README.txt | 58 - .../persistency/gdml/G01/CMakeLists.txt | 2 +- .../extended/persistency/gdml/G01/History | 3 + examples/extended/persistency/gdml/G01/README | 49 - .../persistency/gdml/G01/assembly.gdml | 2 +- .../extended/persistency/gdml/G01/axes.gdml | 12 +- .../extended/persistency/gdml/G01/block.gdml | 32 +- .../extended/persistency/gdml/G01/g01.out | 514 +- .../extended/persistency/gdml/G02/.README.txt | 57 - .../persistency/gdml/G02/CMakeLists.txt | 2 +- .../extended/persistency/gdml/G02/History | 3 + examples/extended/persistency/gdml/G02/README | 47 - .../persistency/gdml/G02/read_gdml.mac | 5 +- .../persistency/gdml/G02/read_step.mac | 5 +- .../extended/persistency/gdml/G02/vis.mac | 3 - .../persistency/gdml/G02/write_gdml.mac | 5 +- .../extended/persistency/gdml/G03/.README.txt | 49 - .../persistency/gdml/G03/CMakeLists.txt | 2 +- .../extended/persistency/gdml/G03/History | 3 + examples/extended/persistency/gdml/G03/README | 37 - .../persistency/gdml/G03/read_ext.mac | 3 - .../extended/persistency/gdml/G03/vis.mac | 3 - .../persistency/gdml/G03/write_ext.mac | 3 - .../extended/persistency/gdml/G04/.README.txt | 39 - .../persistency/gdml/G04/CMakeLists.txt | 2 +- examples/extended/persistency/gdml/G04/README | 34 - .../extended/persistency/gdml/G04/g04.out | 446 +- examples/extended/persistency/gdml/README | 17 - examples/extended/physicslists/.README.txt | 26 - examples/extended/physicslists/CMakeLists.txt | 2 +- examples/extended/physicslists/README | 26 - .../extensibleFactory/.README.txt | 95 - .../extensibleFactory/CMakeLists.txt | 2 +- .../physicslists/extensibleFactory/History | 10 + .../physicslists/extensibleFactory/README | 93 - .../extensibleFactory/extensibleFactory.out | 456 +- .../shared/include/Analysis.hh | 37 - .../shared/include/RunAction.hh | 3 +- .../extensibleFactory/shared/src/RunAction.cc | 8 +- .../extensibleFactory/shared/src/ScreenSD.cc | 2 +- .../extended/physicslists/factory/.README.txt | 69 - .../physicslists/factory/CMakeLists.txt | 2 +- .../extended/physicslists/factory/History | 10 + examples/extended/physicslists/factory/README | 69 - .../factory/factory-environment.out | 450 +- .../extended/physicslists/factory/factory.out | 452 +- .../factory/shared/include/Analysis.hh | 37 - .../factory/shared/include/RunAction.hh | 3 +- .../factory/shared/src/RunAction.cc | 8 +- .../factory/shared/src/ScreenSD.cc | 2 +- .../physicslists/genericPL/.README.txt | 86 - .../physicslists/genericPL/CMakeLists.txt | 2 +- .../extended/physicslists/genericPL/History | 10 + .../extended/physicslists/genericPL/README | 85 - .../physicslists/genericPL/genericPL.out | 452 +- .../genericPL/shared/include/Analysis.hh | 37 - .../genericPL/shared/include/RunAction.hh | 3 +- .../genericPL/shared/src/RunAction.cc | 8 +- .../genericPL/shared/src/ScreenSD.cc | 2 +- examples/extended/physicslists/shared/History | 10 + .../physicslists/shared/include/Analysis.hh | 37 - .../physicslists/shared/include/RunAction.hh | 3 +- .../physicslists/shared/src/RunAction.cc | 8 +- .../physicslists/shared/src/ScreenSD.cc | 2 +- examples/extended/polarisation/.README.txt | 16 - examples/extended/polarisation/CMakeLists.txt | 2 +- examples/extended/polarisation/History | 3 + .../extended/polarisation/Pol01/.README.txt | 145 - .../polarisation/Pol01/CMakeLists.txt | 2 +- examples/extended/polarisation/Pol01/History | 9 + examples/extended/polarisation/Pol01/README | 128 - .../polarisation/Pol01/include/RunAction.hh | 2 +- .../extended/polarisation/Pol01/pol01.out | 141 +- .../polarisation/Pol01/src/RunAction.cc | 3 +- examples/extended/polarisation/README | 13 - .../extended/radioactivedecay/.README.txt | 25 - .../radioactivedecay/Activation/.README.txt | 183 - .../radioactivedecay/Activation/Activation.in | 4 +- .../Activation/Activation.out | 490 +- .../radioactivedecay/Activation/Bi209.mac | 5 + .../Activation/CMakeLists.txt | 2 +- .../radioactivedecay/Activation/Co60.mac | 9 +- .../radioactivedecay/Activation/History | 25 + .../radioactivedecay/Activation/README | 163 - .../include/HadronElasticPhysicsHP.hh | 22 +- .../Activation/include/HistoManager.hh | 4 +- .../Activation/include/NeutronHPMessenger.hh | 62 - .../include/RadioactiveDecayPhysics.hh | 59 + .../radioactivedecay/Activation/plotHisto.C | 8 +- .../Activation/src/ElectromagneticPhysics.cc | 18 +- .../Activation/src/HadronElasticPhysicsHP.cc | 33 +- .../Activation/src/HistoManager.cc | 4 +- .../Activation/src/NeutronHPMessenger.cc | 71 - .../Activation/src/PhysicsList.cc | 5 +- .../Activation/src/RadioactiveDecayPhysics.cc | 106 + .../radioactivedecay/Activation/src/Run.cc | 3 +- .../Activation/src/TrackingAction.cc | 11 +- .../extended/radioactivedecay/CMakeLists.txt | 2 +- examples/extended/radioactivedecay/README | 24 - .../radioactivedecay/rdecay01/.README.txt | 163 - .../radioactivedecay/rdecay01/CMakeLists.txt | 2 +- .../radioactivedecay/rdecay01/History | 9 + .../extended/radioactivedecay/rdecay01/README | 153 - .../rdecay01/include/HistoManager.hh | 4 +- .../radioactivedecay/rdecay01/rdecay01.out | 42 +- .../rdecay01/src/HistoManager.cc | 4 +- .../radioactivedecay/rdecay02/.README.txt | 211 - .../radioactivedecay/rdecay02/CMakeLists.txt | 2 +- .../radioactivedecay/rdecay02/History | 13 + .../extended/radioactivedecay/rdecay02/README | 208 - .../rdecay02/include/HistoManager.hh | 4 +- .../radioactivedecay/rdecay02/rdecay02.in | 2 - .../radioactivedecay/rdecay02/rdecay02.out | 545 +- .../rdecay02/src/HistoManager.cc | 4 +- .../radioactivedecay/rdecay02/src/Run.cc | 2 +- examples/extended/runAndEvent/.README.txt | 57 - examples/extended/runAndEvent/CMakeLists.txt | 3 +- examples/extended/runAndEvent/History | 3 + .../extended/runAndEvent/RE01/.README.txt | 70 - .../extended/runAndEvent/RE01/CMakeLists.txt | 2 +- examples/extended/runAndEvent/RE01/README | 66 - examples/extended/runAndEvent/RE01/sample.out | 9388 +++-- .../extended/runAndEvent/RE02/.README.txt | 250 - .../extended/runAndEvent/RE02/CMakeLists.txt | 2 +- examples/extended/runAndEvent/RE02/README | 238 - examples/extended/runAndEvent/RE02/run.out | 1041 +- examples/extended/runAndEvent/RE02/run3.out | 866 +- examples/extended/runAndEvent/RE02/run4.out | 850 +- .../extended/runAndEvent/RE03/.README.txt | 59 - .../extended/runAndEvent/RE03/CMakeLists.txt | 2 +- examples/extended/runAndEvent/RE03/README | 55 - .../extended/runAndEvent/RE04/.README.txt | 97 - .../extended/runAndEvent/RE04/CMakeLists.txt | 2 +- examples/extended/runAndEvent/RE04/README | 92 - .../extended/runAndEvent/RE04/exampleRE04.out | 426 +- .../extended/runAndEvent/RE05/.README.txt | 64 - .../extended/runAndEvent/RE05/CMakeLists.txt | 2 +- examples/extended/runAndEvent/RE05/History | 3 + examples/extended/runAndEvent/RE05/README | 61 - .../extended/runAndEvent/RE05/exampleRE05.out | 502 +- .../RE05/src/RE05SteppingAction.cc | 4 +- .../extended/runAndEvent/RE06/.README.txt | 213 - .../extended/runAndEvent/RE06/CMakeLists.txt | 2 +- examples/extended/runAndEvent/RE06/History | 4 + examples/extended/runAndEvent/RE06/README | 222 - .../extended/runAndEvent/RE06/exampleRE06.cc | 2 +- .../extended/runAndEvent/RE06/exampleRE06.out | 2395 +- .../extended/runAndEvent/RE07/CMakeLists.txt | 55 + examples/extended/runAndEvent/RE07/History | 22 + .../extended/runAndEvent/RE07/exampleRE07.cc | 81 + .../RE07/include/ActionInitialization.hh | 53 + .../RE07/include/DetectorConstruction.hh | 124 + .../RE07/include/DetectorMessenger.hh | 71 + .../EmStandardPhysicsTrackingManager.hh} | 90 +- .../runAndEvent/RE07/include/EventAction.hh | 65 + .../runAndEvent/RE07/include/PhysicsList.hh | 62 + .../RE07/include/PhysicsListEmSpecialized.hh | 53 + .../include/PhysicsListEmStandardTracking.hh | 54 + .../RE07/include/PhysicsListMessenger.hh} | 40 +- .../RE07}/include/PrimaryGeneratorAction.hh | 28 +- .../extended/runAndEvent/RE07/include/Run.hh | 86 + .../RE07}/include/RunAction.hh | 38 +- .../include/SpecializedTrackingManager.hh} | 52 +- .../RE07}/include/SteppingAction.hh | 17 +- .../RE07/include/TrackingAction.hh | 53 + .../RE07/include/TrackingManagerHelper.hh | 110 + .../RE07/include/TrackingManagerHelper.icc | 596 + .../extended/runAndEvent/RE07/processes.mac | 5 + .../extended/runAndEvent/RE07/specialized.mac | 5 + .../RE07/src/ActionInitialization.cc | 74 + .../RE07/src/DetectorConstruction.cc | 379 + .../runAndEvent/RE07/src/DetectorMessenger.cc | 140 + .../src/EmStandardPhysicsTrackingManager.cc | 790 + .../runAndEvent/RE07/src/EventAction.cc} | 48 +- .../runAndEvent/RE07/src/PhysicsList.cc | 107 + .../RE07/src/PhysicsListEmSpecialized.cc | 57 + .../src/PhysicsListEmStandardTracking.cc} | 61 +- .../RE07/src/PhysicsListMessenger.cc | 66 + .../RE07}/src/PrimaryGeneratorAction.cc | 44 +- examples/extended/runAndEvent/RE07/src/Run.cc | 229 + .../runAndEvent/RE07/src/RunAction.cc | 98 + .../RE07/src/SpecializedTrackingManager.cc | 257 + .../runAndEvent/RE07/src/SteppingAction.cc | 98 + .../runAndEvent/RE07/src/TrackingAction.cc | 62 + .../extended/runAndEvent/RE07/tracking.mac | 5 + examples/extended/runAndEvent/README | 61 - examples/extended/visualization/.README.txt | 28 - .../extended/visualization/CMakeLists.txt | 2 +- examples/extended/visualization/README | 27 - .../extended/visualization/movies/.README.txt | 92 - .../visualization/movies/CMakeLists.txt | 2 +- .../extended/visualization/movies/History | 3 + examples/extended/visualization/movies/README | 91 - .../movies/visTutor/exN03Vis12.loop | 4 +- .../movies/visTutor/exN03Vis13.loop | 4 +- .../visualization/perspective/.README.txt | 28 - .../visualization/perspective/CMakeLists.txt | 2 +- .../visualization/perspective/History | 3 + .../extended/visualization/perspective/README | 25 - .../perspective/src/PerspectiveVisAction.cc | 8 +- .../visualization/standalone/.README.txt | 41 - .../visualization/standalone/CMakeLists.txt | 2 +- .../extended/visualization/standalone/README | 39 - .../visualization/userVisAction/.README.txt | 38 - .../userVisAction/CMakeLists.txt | 2 +- .../visualization/userVisAction/README | 33 - .../visualization/userVisAction/run1.out | 600 +- .../visualization/userVisAction/run2.out | 478 +- .../userVisAction/userVisAction.out | 440 +- source/GNUmakefile | 4 +- source/analysis/CMakeLists.txt | 1 - source/analysis/History | 182 + .../accumulables/include/G4Accumulable.hh | 16 +- .../accumulables/include/G4Accumulable.icc | 61 +- .../include/G4AccumulableManager.hh | 50 +- .../include/G4AccumulableManager.icc | 36 +- .../accumulables/include/G4MergeMode.hh | 14 +- .../accumulables/include/G4VAccumulable.hh | 14 +- .../accumulables/include/G4VAccumulable.icc | 15 +- .../accumulables/src/G4AccumulableManager.cc | 81 +- .../analysis/accumulables/src/G4MergeMode.cc | 10 +- .../csv/include/G4CsvAnalysisManager.hh | 50 +- .../csv/include/G4CsvAnalysisManager.icc | 142 +- .../csv/include/G4CsvAnalysisReader.hh | 67 +- .../csv/include/G4CsvAnalysisReader.icc | 5 +- .../analysis/csv/include/G4CsvFileManager.hh | 34 +- .../csv/include/G4CsvHnFileManager.hh | 12 +- .../csv/include/G4CsvHnFileManager.icc | 26 +- .../csv/include/G4CsvHnRFileManager.hh | 70 + .../csv/include/G4CsvHnRFileManager.icc | 98 + .../csv/include/G4CsvNtupleFileManager.hh | 18 +- .../csv/include/G4CsvNtupleManager.hh | 25 +- .../analysis/csv/include/G4CsvRFileManager.hh | 14 +- .../csv/include/G4CsvRNtupleManager.hh | 31 +- source/analysis/csv/include/g4csv_defs.hh | 16 +- source/analysis/csv/sources.cmake | 3 +- .../analysis/csv/src/G4CsvAnalysisManager.cc | 311 +- .../analysis/csv/src/G4CsvAnalysisReader.cc | 378 +- source/analysis/csv/src/G4CsvFileManager.cc | 116 +- .../csv/src/G4CsvNtupleFileManager.cc | 46 +- source/analysis/csv/src/G4CsvNtupleManager.cc | 33 +- source/analysis/csv/src/G4CsvRFileManager.cc | 60 +- .../analysis/csv/src/G4CsvRNtupleManager.cc | 62 +- source/analysis/exception_classification.txt | 36 +- .../include/G4AnalysisManager.hh} | 10 +- .../include/G4GenericAnalysisManager.hh | 62 +- .../include/G4GenericAnalysisManager.icc | 7 + .../factory/include/G4GenericFileManager.hh | 53 +- .../factory/include/G4GenericFileManager.icc | 120 +- source/analysis/factory/sources.cmake | 4 +- .../factory/src/G4GenericAnalysisManager.cc | 332 +- .../factory/src/G4GenericFileManager.cc | 317 +- source/analysis/factory/src/g4analysis.cc | 91 - .../hdf5/include/G4Hdf5AnalysisManager.hh | 55 +- .../hdf5/include/G4Hdf5AnalysisManager.icc | 94 +- .../hdf5/include/G4Hdf5AnalysisReader.hh | 75 +- .../hdf5/include/G4Hdf5AnalysisReader.icc | 90 +- .../hdf5/include/G4Hdf5FileManager.hh | 28 +- .../hdf5/include/G4Hdf5HnFileManager.hh | 15 +- .../hdf5/include/G4Hdf5HnFileManager.icc | 12 +- .../hdf5/include/G4Hdf5HnRFileManager.hh | 69 + .../hdf5/include/G4Hdf5HnRFileManager.icc | 89 + .../hdf5/include/G4Hdf5NtupleFileManager.hh | 19 +- .../hdf5/include/G4Hdf5NtupleManager.hh | 69 +- .../hdf5/include/G4Hdf5RFileManager.hh | 29 +- .../hdf5/include/G4Hdf5RNtupleManager.hh | 30 +- source/analysis/hdf5/include/g4hdf5.hh | 38 - source/analysis/hdf5/include/g4hdf5_defs.hh | 21 +- source/analysis/hdf5/sources.cmake | 3 +- .../hdf5/src/G4Hdf5AnalysisManager.cc | 295 +- .../analysis/hdf5/src/G4Hdf5AnalysisReader.cc | 231 +- source/analysis/hdf5/src/G4Hdf5FileManager.cc | 81 +- .../hdf5/src/G4Hdf5NtupleFileManager.cc | 60 +- .../analysis/hdf5/src/G4Hdf5NtupleManager.cc | 21 +- .../analysis/hdf5/src/G4Hdf5RFileManager.cc | 163 +- .../analysis/hdf5/src/G4Hdf5RNtupleManager.cc | 54 +- .../hntools/include/G4BaseHistoUtilities.hh | 4 +- .../hntools/include/G4H1ToolsManager.hh | 42 +- .../hntools/include/G4H2ToolsManager.hh | 72 +- .../hntools/include/G4H3ToolsManager.hh | 75 +- .../hntools/include/G4MPIToolsManager.hh | 217 +- .../hntools/include/G4MPIToolsManager.icc | 181 + .../hntools/include/G4P1ToolsManager.hh | 62 +- .../hntools/include/G4P2ToolsManager.hh | 76 +- .../hntools/include/G4ToolsAnalysisManager.hh | 82 +- .../include/G4ToolsAnalysisManager.icc | 138 +- .../include/G4ToolsAnalysisMessenger.hh | 84 +- .../hntools/include/G4ToolsAnalysisReader.hh | 62 +- .../hntools/include/G4ToolsAnalysisReader.icc | 52 +- .../hntools/include/g4hntools_defs.hh | 6 +- source/analysis/hntools/sources.cmake | 3 + .../hntools/src/G4BaseHistoUtilities.cc | 65 +- .../analysis/hntools/src/G4H1ToolsManager.cc | 316 +- .../analysis/hntools/src/G4H2ToolsManager.cc | 399 +- .../analysis/hntools/src/G4H3ToolsManager.cc | 446 +- .../analysis/hntools/src/G4P1ToolsManager.cc | 377 +- .../analysis/hntools/src/G4P2ToolsManager.cc | 462 +- .../hntools/src/G4ToolsAnalysisManager.cc | 182 +- .../hntools/src/G4ToolsAnalysisMessenger.cc | 98 + .../hntools/src/G4ToolsAnalysisReader.cc | 93 +- .../include/G4AnalysisManagerState.hh | 61 +- .../management/include/G4AnalysisMessenger.hh | 23 +- .../include/G4AnalysisMessengerHelper.hh | 62 +- .../management/include/G4AnalysisUtilities.hh | 84 +- .../management/include/G4AnalysisVerbose.hh | 32 +- .../include/G4BaseAnalysisManager.hh | 39 +- .../management/include/G4BaseFileManager.hh | 31 +- .../management/include/G4BaseNtupleManager.hh | 15 +- .../include/G4BaseRNtupleManager.hh | 58 +- .../management/include/G4BinScheme.hh | 10 +- source/analysis/management/include/G4Fcn.hh | 2 +- .../management/include/G4FileMessenger.hh | 13 +- .../management/include/G4H1Messenger.hh | 21 +- .../management/include/G4H2Messenger.hh | 26 +- .../management/include/G4H3Messenger.hh | 30 +- .../management/include/G4HnInformation.hh | 87 +- .../management/include/G4HnManager.hh | 27 +- .../management/include/G4HnMessenger.hh | 9 +- .../include/G4NtupleBookingManager.hh | 62 +- .../include/G4NtupleBookingManager.icc | 30 +- .../management/include/G4NtupleMessenger.hh | 20 +- .../management/include/G4P1Messenger.hh | 28 +- .../management/include/G4P2Messenger.hh | 30 +- .../management/include/G4PlotManager.hh | 52 +- .../management/include/G4PlotMessenger.hh | 15 +- .../management/include/G4PlotParameters.hh | 64 +- .../management/include/G4TFileInformation.hh | 20 +- .../management/include/G4TFileManager.hh | 22 +- .../management/include/G4TFileManager.icc | 179 +- .../management/include/G4THnManager.hh | 53 +- .../management/include/G4THnManager.icc | 221 +- .../include/G4TNtupleDescription.hh | 30 +- .../management/include/G4TNtupleManager.hh | 56 +- .../management/include/G4TNtupleManager.icc | 336 +- .../include/G4TRNtupleDescription.hh | 42 +- .../management/include/G4TRNtupleManager.hh | 67 +- .../management/include/G4TRNtupleManager.icc | 250 +- .../management/include/G4VAnalysisManager.hh | 222 +- .../management/include/G4VAnalysisManager.icc | 645 +- .../management/include/G4VAnalysisReader.hh | 101 +- .../management/include/G4VAnalysisReader.icc | 324 +- .../management/include/G4VFileManager.hh | 68 +- .../management/include/G4VH1Manager.hh | 8 +- .../management/include/G4VH2Manager.hh | 32 +- .../management/include/G4VH3Manager.hh | 32 +- .../include/G4VNtupleFileManager.hh | 36 +- .../management/include/G4VNtupleManager.hh | 47 +- .../management/include/G4VP1Manager.hh | 28 +- .../management/include/G4VP2Manager.hh | 36 +- .../management/include/G4VRFileManager.hh | 110 + .../management/include/G4VRNtupleManager.hh | 52 +- .../management/include/G4VTFileManager.hh | 18 +- .../management/include/G4VTHnFileManager.hh | 7 +- .../management/include/G4VTHnRFileManager.hh | 32 +- source/analysis/management/sources.cmake | 2 + .../management/src/G4AnalysisManagerState.cc | 82 +- .../management/src/G4AnalysisMessenger.cc | 77 +- .../src/G4AnalysisMessengerHelper.cc | 137 +- .../management/src/G4AnalysisUtilities.cc | 170 +- .../management/src/G4AnalysisVerbose.cc | 66 +- .../management/src/G4BaseAnalysisManager.cc | 27 +- .../management/src/G4BaseFileManager.cc | 34 +- .../management/src/G4BaseNtupleManager.cc | 9 +- .../management/src/G4BaseRNtupleManager.cc | 37 +- source/analysis/management/src/G4BinScheme.cc | 45 +- source/analysis/management/src/G4Fcn.cc | 17 +- .../management/src/G4FileMessenger.cc | 28 +- .../analysis/management/src/G4H1Messenger.cc | 85 +- .../analysis/management/src/G4H2Messenger.cc | 147 +- .../analysis/management/src/G4H3Messenger.cc | 173 +- source/analysis/management/src/G4HnManager.cc | 120 +- .../analysis/management/src/G4HnMessenger.cc | 56 +- .../management/src/G4NtupleBookingManager.cc | 120 +- .../management/src/G4NtupleMessenger.cc | 64 +- .../analysis/management/src/G4P1Messenger.cc | 151 +- .../analysis/management/src/G4P2Messenger.cc | 172 +- .../analysis/management/src/G4PlotManager.cc | 116 +- .../management/src/G4PlotMessenger.cc | 55 +- .../management/src/G4PlotParameters.cc | 63 +- .../management/src/G4VAnalysisManager.cc | 677 +- .../management/src/G4VAnalysisReader.cc | 357 +- .../analysis/management/src/G4VFileManager.cc | 56 +- .../management/src/G4VNtupleFileManager.cc | 35 +- .../root/include/G4RootAnalysisManager.hh | 46 +- .../root/include/G4RootAnalysisManager.icc | 56 +- .../root/include/G4RootAnalysisReader.hh | 75 +- .../root/include/G4RootAnalysisReader.icc | 4 +- .../root/include/G4RootFileManager.hh | 38 +- .../root/include/G4RootHnFileManager.hh | 14 +- .../root/include/G4RootHnFileManager.icc | 21 +- .../root/include/G4RootHnRFileManager.hh | 79 + .../root/include/G4RootHnRFileManager.icc | 169 + .../root/include/G4RootMainNtupleManager.hh | 24 +- .../root/include/G4RootNtupleFileManager.hh | 31 +- .../root/include/G4RootNtupleManager.hh | 28 +- .../root/include/G4RootNtupleManager.icc | 54 +- .../root/include/G4RootPNtupleDescription.hh | 17 +- .../root/include/G4RootPNtupleManager.hh | 51 +- .../root/include/G4RootPNtupleManager.icc | 119 +- .../root/include/G4RootRFileManager.hh | 22 +- .../root/include/G4RootRNtupleManager.hh | 30 +- source/analysis/root/include/g4root.hh | 38 - source/analysis/root/include/g4root_defs.hh | 20 +- source/analysis/root/sources.cmake | 3 +- .../root/src/G4RootAnalysisManager.cc | 377 +- .../analysis/root/src/G4RootAnalysisReader.cc | 392 +- source/analysis/root/src/G4RootFileManager.cc | 96 +- .../root/src/G4RootMainNtupleManager.cc | 65 +- .../root/src/G4RootNtupleFileManager.cc | 256 +- .../analysis/root/src/G4RootNtupleManager.cc | 118 +- .../analysis/root/src/G4RootPNtupleManager.cc | 203 +- .../analysis/root/src/G4RootRFileManager.cc | 62 +- .../analysis/root/src/G4RootRNtupleManager.cc | 119 +- .../xml/include/G4XmlAnalysisManager.hh | 50 +- .../xml/include/G4XmlAnalysisManager.icc | 58 +- .../xml/include/G4XmlAnalysisReader.hh | 67 +- .../xml/include/G4XmlAnalysisReader.icc | 14 +- .../analysis/xml/include/G4XmlFileManager.hh | 15 +- .../xml/include/G4XmlHnFileManager.hh | 11 +- .../xml/include/G4XmlHnFileManager.icc | 14 +- .../xml/include/G4XmlHnRFileManager.hh | 64 + .../xml/include/G4XmlHnRFileManager.icc | 32 +- .../xml/include/G4XmlNtupleFileManager.hh | 18 +- .../xml/include/G4XmlNtupleManager.hh | 22 +- .../analysis/xml/include/G4XmlRFileManager.hh | 31 +- .../xml/include/G4XmlRFileManager.icc | 84 +- .../xml/include/G4XmlRNtupleManager.hh | 56 +- source/analysis/xml/include/g4xml.hh | 38 - source/analysis/xml/include/g4xml_defs.hh | 21 +- source/analysis/xml/sources.cmake | 4 +- .../analysis/xml/src/G4XmlAnalysisManager.cc | 363 +- .../analysis/xml/src/G4XmlAnalysisReader.cc | 286 +- source/analysis/xml/src/G4XmlFileManager.cc | 86 +- .../xml/src/G4XmlNtupleFileManager.cc | 56 +- source/analysis/xml/src/G4XmlNtupleManager.cc | 24 +- source/analysis/xml/src/G4XmlRFileManager.cc | 70 +- .../analysis/xml/src/G4XmlRNtupleManager.cc | 194 +- source/digits_hits/History | 6 + source/digits_hits/detector/History | 5 + .../detector/include/G4TScoreHistFiller.hh | 1 - .../detector/include/G4TScoreHistFiller.icc | 8 +- source/digits_hits/detector/src/G4HCtable.cc | 2 +- .../digits_hits/detector/src/G4SDManager.cc | 14 +- .../digits_hits/detector/src/G4SDStructure.cc | 28 +- .../detector/src/G4VSensitiveDetector.cc | 10 +- source/digits_hits/scorer/History | 4 + .../include/G4PSCellFluxForCylinder3D.hh | 3 +- .../include/G4PSDoseDepositForCylinder3D.hh | 3 +- .../G4PSPassageCellFluxForCylinder3D.hh | 3 +- .../scorer/src/G4PSCellFluxForCylinder3D.cc | 17 +- .../src/G4PSDoseDepositForCylinder3D.cc | 25 +- .../src/G4PSPassageCellFluxForCylinder3D.cc | 25 +- source/digits_hits/utils/History | 18 +- .../utils/include/G4ScoringCylinder.hh | 5 +- .../utils/include/G4TScoreNtupleWriter.hh | 3 +- .../utils/include/G4TScoreNtupleWriter.icc | 29 +- .../utils/include/G4VScoringMesh.hh | 3 + .../utils/src/G4ScoreQuantityMessenger.cc | 11 +- .../utils/src/G4ScoringCylinder.cc | 5 +- .../utils/src/G4ScoringMessenger.cc | 2 +- .../digits_hits/utils/src/G4VScoringMesh.cc | 14 +- source/event/History | 16 + source/event/include/G4EventManager.hh | 5 +- source/event/src/G4AdjointStackingAction.cc | 2 +- source/event/src/G4EventManager.cc | 189 +- .../src/G4GeneralParticleSourceMessenger.cc | 8 +- source/event/src/G4ParticleGunMessenger.cc | 10 +- source/event/src/G4SPSEneDistribution.cc | 4 +- source/externals/History | 10 + source/externals/clhep/CMakeLists.txt | 5 + source/externals/clhep/History | 18 +- .../clhep/include/CLHEP/Random/Randomize.h | 1 + .../include/CLHEP/Random/RanluxppEngine.h | 104 + .../include/CLHEP/Random/ranluxpp/helpers.h | 151 + .../include/CLHEP/Random/ranluxpp/mulmod.h | 255 + .../CLHEP/Random/ranluxpp/ranlux_lcg.h | 88 + source/externals/clhep/src/EngineFactory.cc | 3 + source/externals/clhep/src/Ranlux64Engine.cc | 8 +- source/externals/clhep/src/RanluxppEngine.cc | 305 + source/externals/expat/README | 139 - source/externals/g4tools/CMakeLists.txt | 4 +- source/externals/g4tools/History | 38 + source/externals/g4tools/History_tools | 23 + .../g4tools/include/tools/Cocoa/session.hm | 215 - .../g4tools/include/tools/Cocoa/sg_viewer.hm | 163 - .../g4tools/include/tools/Qt/plots_glarea | 54 - .../g4tools/include/tools/Qt/sg_viewer | 3 +- .../g4tools/include/tools/Windows/WinTk | 810 - .../g4tools/include/tools/Windows/tools | 601 - .../g4tools/include/tools/Xt/OpenGLArea.c | 531 - .../g4tools/include/tools/Xt/OpenGLArea.h | 37 - .../g4tools/include/tools/Xt/OpenGLAreaP.h | 54 - .../externals/g4tools/include/tools/Xt/tools | 204 - source/externals/g4tools/include/tools/app | 191 - source/externals/g4tools/include/tools/cmp | 31 - .../externals/g4tools/include/tools/file_name | 74 - .../g4tools/include/tools/font/lato_license | 174 + .../include/tools/font/lato_regular_ttf | 6286 +++ .../include/tools/font/roboto_bold_ttf | 13969 +++++++ .../g4tools/include/tools/font/roboto_license | 205 + .../g4tools/include/tools/hdf5/ntuple | 399 +- .../g4tools/include/tools/hep/pbp.icc | 2802 -- .../g4tools/include/tools/hep/polyhedron | 993 - .../g4tools/include/tools/hep/polyhedron.icc | 2965 -- .../g4tools/include/tools/hep/sf_polyhedron | 116 - .../g4tools/include/tools/histo/histos | 49 - .../g4tools/include/tools/histo/htoc | 338 - .../g4tools/include/tools/histo/slice | 509 - .../g4tools/include/tools/histo/sliced | 121 - source/externals/g4tools/include/tools/image | 427 - .../g4tools/include/tools/image_reader | 72 - source/externals/g4tools/include/tools/jpeg | 702 - .../externals/g4tools/include/tools/lina/eqT | 97 - .../externals/g4tools/include/tools/lina/mat3 | 236 - .../g4tools/include/tools/lina/mat3d | 66 - .../g4tools/include/tools/lina/mat3f | 50 - .../g4tools/include/tools/lina/mat4d | 82 - .../externals/g4tools/include/tools/lina/rotd | 67 - .../g4tools/include/tools/lina/vec4d | 89 - .../externals/g4tools/include/tools/log_file | 60 - .../g4tools/include/tools/metal/render.hm | 1424 - .../g4tools/include/tools/metal/session.hm | 24 - .../g4tools/include/tools/metal/sg_viewer.hm | 147 - .../g4tools/include/tools/metal/ui_viewer | 31 - .../g4tools/include/tools/metal/view.hm | 185 - .../g4tools/include/tools/paper_format | 50 - .../externals/g4tools/include/tools/path_env | 56 - source/externals/g4tools/include/tools/png | 495 - .../externals/g4tools/include/tools/put_env | 45 - source/externals/g4tools/include/tools/randT | 239 - source/externals/g4tools/include/tools/randd | 206 - source/externals/g4tools/include/tools/randf | 74 - source/externals/g4tools/include/tools/random | 56 - .../g4tools/include/tools/rroot/member_reader | 99 - .../g4tools/include/tools/rroot/tree_manip | 190 - .../externals/g4tools/include/tools/rtausmed | 39 - source/externals/g4tools/include/tools/sargs | 35 - source/externals/g4tools/include/tools/serrno | 25 - .../g4tools/include/tools/sg/GL_plots_viewer | 75 - .../g4tools/include/tools/sg/GL_viewer | 15 +- .../g4tools/include/tools/sg/atb_vertices | 27 +- .../g4tools/include/tools/sg/base_freetype | 44 +- .../externals/g4tools/include/tools/sg/bcbk | 132 + .../externals/g4tools/include/tools/sg/cbks | 57 + .../externals/g4tools/include/tools/sg/color | 86 - .../externals/g4tools/include/tools/sg/ecbk | 118 + .../g4tools/include/tools/sg/event_dispatcher | 48 + .../g4tools/include/tools/sg/gl2ps_action | 1 + .../g4tools/include/tools/sg/light_off | 36 + .../g4tools/include/tools/sg/line_set | 114 - .../externals/g4tools/include/tools/sg/path | 169 + .../include/tools/sg/plotter_some_styles | 360 + .../g4tools/include/tools/sg/polyhedron | 499 - .../g4tools/include/tools/sg/render_action | 28 +- .../externals/g4tools/include/tools/sg/search | 150 + .../include/tools/sg/set_plotter_camera | 104 - .../g4tools/include/tools/sg/sf_vec2f | 37 - .../g4tools/include/tools/sg/tessellate | 532 - .../g4tools/include/tools/sg/text_freetype | 44 +- .../include/tools/sg/text_freetype_marker | 48 +- .../include/tools/sg/text_hershey_marker | 22 +- .../g4tools/include/tools/sg/write_paper | 128 + .../g4tools/include/tools/std_system | 28 - .../externals/g4tools/include/tools/svalues | 64 - .../externals/g4tools/include/tools/sys/dir | 140 - .../g4tools/include/tools/sys/process | 21 - source/externals/g4tools/include/tools/system | 209 - source/externals/g4tools/include/tools/test | 216 - .../externals/g4tools/include/tools/tokenize | 53 + source/externals/g4tools/include/tools/utest | 167 - .../externals/g4tools/include/tools/version | 8 +- .../g4tools/include/tools/waxml/ntuple | 13 + source/externals/g4tools/include/tools/xpm | 191 - source/externals/g4tools/src/csz_inflate.cc | 1155 - source/externals/g4tools/src/dummy.cc | 7 + source/externals/ptl/.clang-tidy | 40 - source/externals/ptl/History | 3 + source/externals/ptl/README.md | 2 - .../externals/ptl/include/PTL/TaskGroup.icc | 4 +- .../externals/ptl/include/PTL/ThreadPool.hh | 2 +- source/externals/zlib/History | 3 + source/externals/zlib/README | 157 - source/externals/zlib/sources.cmake | 4 - source/g3tog4/History | 12 + source/g3tog4/README | 105 - source/g3tog4/src/G3EleTable.cc | 20 +- source/g3tog4/src/G3VolTableEntry.cc | 4 +- source/g3tog4/src/G4gsdvn.cc | 3 +- source/g3tog4/src/G4gsmate.cc | 2 +- source/g3tog4/src/G4gsposp.cc | 6 +- source/g3tog4/src/clparse.cc | 6 +- source/geometry/biasing/History | 3 + .../biasing/include/G4ImportanceAlgorithm.hh | 1 + source/geometry/divisions/GNUmakefile | 3 +- source/geometry/divisions/History | 17 + .../divisions/include/G4PVDivision.hh | 7 +- .../include/G4ParameterisationTrd.hh | 16 +- .../divisions/include/G4ReplicatedSlice.hh | 9 +- source/geometry/divisions/sources.cmake | 2 +- source/geometry/divisions/src/G4PVDivision.cc | 21 +- .../divisions/src/G4ParameterisationCons.cc | 6 +- .../src/G4ParameterisationPolycone.cc | 31 +- .../src/G4ParameterisationPolyhedra.cc | 25 +- .../divisions/src/G4ParameterisationTrd.cc | 159 +- .../divisions/src/G4ParameterisationTubs.cc | 12 +- .../divisions/src/G4ReplicatedSlice.cc | 54 +- source/geometry/management/History | 12 + .../management/include/G4AffineTransform.hh | 4 +- .../management/include/G4AffineTransform.icc | 10 - .../management/include/G4BlockingList.hh | 6 +- .../management/include/G4BoundingEnvelope.hh | 4 +- .../include/G4ErrorCylSurfaceTarget.hh | 8 +- .../include/G4ErrorPlaneSurfaceTarget.hh | 9 +- .../include/G4ErrorSurfaceTarget.hh | 9 +- .../include/G4ErrorTanPlaneTarget.hh | 9 +- .../management/include/G4ErrorTarget.hh | 8 +- .../management/include/G4GeometryManager.hh | 11 +- .../include/G4IdentityTrajectoryFilter.hh | 12 +- .../management/include/G4LogicalSurface.hh | 16 +- .../management/include/G4LogicalVolume.hh | 16 +- .../geometry/management/include/G4Region.hh | 18 +- .../geometry/management/include/G4Region.icc | 7 +- .../management/include/G4RegionStore.hh | 2 +- .../management/include/G4SmartVoxelHeader.hh | 10 +- .../management/include/G4SmartVoxelNode.hh | 20 +- .../management/include/G4SmartVoxelNode.icc | 34 +- .../management/include/G4SmartVoxelProxy.hh | 16 +- .../management/include/G4SmartVoxelProxy.icc | 25 + .../geometry/management/include/G4UAdapter.hh | 12 +- .../include/G4VCurvedTrajectoryFilter.hh | 34 +- .../include/G4VNestedParameterisation.hh | 12 +- .../include/G4VPVDivisionFactory.hh | 13 +- .../include/G4VPVParameterisation.hh | 8 +- .../management/include/G4VPhysicalVolume.hh | 11 +- .../geometry/management/include/G4VSolid.hh | 32 +- .../management/include/G4VTouchable.hh | 14 +- .../include/G4VUserRegionInformation.hh | 10 +- .../management/include/G4VoxelLimits.hh | 8 +- .../geometry/management/src/G4BlockingList.cc | 6 - .../management/src/G4BoundingEnvelope.cc | 32 +- .../management/src/G4ErrorCylSurfaceTarget.cc | 6 - .../src/G4ErrorPlaneSurfaceTarget.cc | 6 - .../management/src/G4ErrorSurfaceTarget.cc | 3 +- .../management/src/G4ErrorTanPlaneTarget.cc | 3 +- .../geometry/management/src/G4ErrorTarget.cc | 2 - .../management/src/G4GeometryManager.cc | 11 +- .../src/G4IdentityTrajectoryFilter.cc | 8 - .../management/src/G4LogicalSurface.cc | 4 - source/geometry/management/src/G4Region.cc | 2 +- .../management/src/G4SmartVoxelHeader.cc | 11 +- .../management/src/G4SmartVoxelNode.cc | 13 +- .../management/src/G4SmartVoxelProxy.cc | 7 +- .../src/G4VCurvedTrajectoryFilter.cc | 10 +- .../src/G4VNestedParameterisation.cc | 14 +- .../management/src/G4VPVDivisionFactory.cc | 16 - .../management/src/G4VPVParameterisation.cc | 14 +- source/geometry/management/src/G4VSolid.cc | 72 +- .../geometry/management/src/G4VTouchable.cc | 17 +- .../geometry/management/src/G4VoxelLimits.cc | 12 - source/geometry/navigation/History | 5 + .../include/G4PhantomParameterisation.hh | 16 +- .../include/G4PhantomParameterisation.icc | 30 +- .../src/G4PartialPhantomParameterisation.cc | 38 +- .../src/G4PhantomParameterisation.cc | 128 +- .../navigation/src/G4RegularNavigation.cc | 2 +- source/geometry/solids/Boolean/History | 10 +- .../solids/Boolean/src/G4BooleanSolid.cc | 4 +- source/geometry/solids/CSG/History | 15 +- source/geometry/solids/CSG/include/G4Cons.hh | 10 - source/geometry/solids/CSG/include/G4Cons.icc | 58 +- .../geometry/solids/CSG/include/G4CutTubs.hh | 8 - .../geometry/solids/CSG/include/G4CutTubs.icc | 32 - .../geometry/solids/CSG/include/G4Sphere.hh | 10 - .../geometry/solids/CSG/include/G4Sphere.icc | 52 +- source/geometry/solids/CSG/include/G4Tubs.hh | 16 +- source/geometry/solids/CSG/include/G4Tubs.icc | 38 +- source/geometry/solids/CSG/include/G4UTrap.hh | 26 +- source/geometry/solids/CSG/include/G4UTubs.hh | 6 +- source/geometry/solids/CSG/src/G4UPara.cc | 2 +- source/geometry/solids/CSG/src/G4UTrap.cc | 183 +- source/geometry/solids/specific/History | 29 + .../specific/include/G4TessellatedSolid.hh | 2 + .../geometry/solids/specific/include/G4Tet.hh | 4 +- .../solids/specific/include/G4TwistedTubs.hh | 11 +- .../solids/specific/include/G4UTet.hh | 30 +- .../specific/include/G4VTwistedFaceted.hh | 8 +- .../solids/specific/src/G4TessellatedSolid.cc | 241 +- source/geometry/solids/specific/src/G4Tet.cc | 47 +- .../solids/specific/src/G4TriangularFacet.cc | 6 +- .../solids/specific/src/G4TwistedTubs.cc | 67 +- source/geometry/solids/specific/src/G4UTet.cc | 180 +- .../solids/specific/src/G4VTwistedFaceted.cc | 1 - source/geometry/volumes/History | 12 + .../volumes/include/G4GeometryWorkspace.hh | 17 +- .../geometry/volumes/include/G4PVReplica.hh | 79 +- .../volumes/src/G4GeometryWorkspace.cc | 138 +- source/geometry/volumes/src/G4PVPlacement.cc | 128 +- source/geometry/volumes/src/G4PVReplica.cc | 49 +- source/global/History | 89 + .../global/management/include/G4Backtrace.hh | 8 +- .../management/include/G4PhysicsFreeVector.hh | 85 +- .../include/G4PhysicsLinearVector.hh | 16 +- .../management/include/G4PhysicsLogVector.hh | 18 +- .../include/G4PhysicsModelCatalog.hh | 84 +- .../include/G4PhysicsOrderedFreeVector.hh | 9 +- .../management/include/G4PhysicsVector.hh | 234 +- .../management/include/G4PhysicsVector.icc | 284 +- .../management/include/G4PhysicsVectorType.hh | 29 +- source/global/management/include/G4String.hh | 296 +- source/global/management/include/G4String.icc | 478 +- .../global/management/include/G4Tokenizer.hh | 4 +- source/global/management/include/G4Version.hh | 8 +- source/global/management/sources.cmake | 1 + .../management/src/G4FilecoutDestination.cc | 2 +- .../management/src/G4PhysicsFreeVector.cc | 128 +- .../management/src/G4PhysicsLinearVector.cc | 61 +- .../management/src/G4PhysicsLogVector.cc | 64 +- .../management/src/G4PhysicsModelCatalog.cc | 741 +- .../global/management/src/G4PhysicsTable.cc | 9 +- .../global/management/src/G4PhysicsVector.cc | 518 +- source/global/management/src/G4UnitsTable.cc | 15 + source/graphics_reps/History | 33 + .../include/G4ConversionUtils.hh | 26 +- source/graphics_reps/include/G4Plotter.hh | 90 + source/graphics_reps/include/G4Scale.hh | 92 - source/graphics_reps/include/G4Scale.icc | 61 - source/graphics_reps/include/G4Text.hh | 8 +- .../graphics_reps/include/G4VGraphicsScene.hh | 6 +- source/graphics_reps/include/G4VMarker.hh | 7 +- source/graphics_reps/include/G4VMarker.icc | 3 + source/graphics_reps/include/G4VVisManager.hh | 4 - source/graphics_reps/include/G4Visible.hh | 2 + source/graphics_reps/sources.cmake | 5 +- source/graphics_reps/src/BooleanProcessor.src | 4 +- source/graphics_reps/src/G4AttCheck.cc | 6 +- source/graphics_reps/src/G4Colour.cc | 6 +- source/graphics_reps/src/G4Plotter.cc | 135 + source/graphics_reps/src/G4Scale.cc | 68 - source/graphics_reps/src/G4Text.cc | 19 - source/graphics_reps/src/G4VMarker.cc | 36 +- source/graphics_reps/src/G4Visible.cc | 17 + source/graphics_reps/src/HepPolyhedron.cc | 7 + source/intercoms/History | 31 + .../intercoms/include/G4GenericMessenger.hh | 4 + source/intercoms/include/G4UIcommand.hh | 18 + source/intercoms/include/G4UIcommandTree.hh | 4 +- source/intercoms/include/G4UIdirectory.hh | 6 + source/intercoms/include/G4UImanager.hh | 7 + source/intercoms/include/G4UImessenger.hh | 4 +- source/intercoms/src/G4GenericMessenger.cc | 92 +- source/intercoms/src/G4UIbatch.cc | 10 +- source/intercoms/src/G4UIbridge.cc | 4 +- source/intercoms/src/G4UIcmdWith3Vector.cc | 1 + .../src/G4UIcmdWith3VectorAndUnit.cc | 3 +- source/intercoms/src/G4UIcmdWithABool.cc | 1 + source/intercoms/src/G4UIcmdWithADouble.cc | 1 + .../src/G4UIcmdWithADoubleAndUnit.cc | 3 +- source/intercoms/src/G4UIcmdWithALongInt.cc | 1 + source/intercoms/src/G4UIcmdWithAString.cc | 1 + source/intercoms/src/G4UIcmdWithAnInteger.cc | 1 + .../intercoms/src/G4UIcmdWithoutParameter.cc | 1 + source/intercoms/src/G4UIcommand.cc | 92 +- source/intercoms/src/G4UIcommandTree.cc | 383 +- source/intercoms/src/G4UIcontrolMessenger.cc | 32 +- source/intercoms/src/G4UIdirectory.cc | 2 + source/intercoms/src/G4UImanager.cc | 104 +- source/intercoms/src/G4UImessenger.cc | 5 +- source/intercoms/src/G4UIparameter.cc | 34 +- source/interfaces/CMakeLists.txt | 1 - source/interfaces/GAG/GNUmakefile | 17 - source/interfaces/GAG/include/G4UIGAG.hh | 130 - .../interfaces/GAG/include/G4UIGainServer.hh | 171 - source/interfaces/GAG/sources.cmake | 12 - source/interfaces/GAG/src/G4UIGAG.cc | 970 - source/interfaces/GAG/src/G4UIGainServer.cc | 960 - source/interfaces/GNUmakefile | 2 - source/interfaces/History | 43 + source/interfaces/basic/GNUmakefile | 20 +- .../interfaces/basic/include/G4UIExecutive.hh | 11 +- source/interfaces/basic/include/G4UIQt.hh | 8 +- source/interfaces/basic/include/G4UIWin32.hh | 4 - source/interfaces/basic/include/G4UIXm.hh | 4 - source/interfaces/basic/sources.cmake | 16 +- .../interfaces/basic/src/G4UIArrayString.cc | 17 +- source/interfaces/basic/src/G4UIExecutive.cc | 46 +- source/interfaces/basic/src/G4UIQt.cc | 197 +- source/interfaces/basic/src/G4UIWin32.cc | 5 - source/interfaces/basic/src/G4UIXm.cc | 5 - source/interfaces/basic/src/G4UIcsh.cc | 8 +- source/interfaces/basic/src/G4UItcsh.cc | 61 +- source/interfaces/basic/src/G4UIterminal.cc | 21 +- source/interfaces/basic/src/G4VUIshell.cc | 40 +- source/interfaces/common/GNUmakefile | 15 + source/interfaces/common/include/G4Qt.hh | 4 - source/interfaces/common/include/G4Win32.hh | 4 - source/interfaces/common/include/G4Xt.hh | 4 - source/interfaces/common/sources.cmake | 17 +- .../common/src/G4InteractorMessenger.cc | 10 +- source/interfaces/common/src/G4Qt.cc | 14 +- source/interfaces/common/src/G4VBasicShell.cc | 74 +- source/interfaces/common/src/G4Win32.cc | 5 - source/interfaces/common/src/G4Xt.cc | 7 - source/materials/History | 74 + source/materials/include/G4Element.hh | 4 +- source/materials/include/G4ElementData.hh | 57 +- source/materials/include/G4ElementVector.hh | 5 +- .../materials/include/G4ExtendedMaterial.hh | 3 +- source/materials/include/G4Material.hh | 86 +- .../include/G4MaterialPropertiesTable.hh | 100 +- .../src/G4DensityEffectCalculator.cc | 55 +- source/materials/src/G4DensityEffectData.cc | 4 +- source/materials/src/G4Element.cc | 26 +- source/materials/src/G4ElementData.cc | 56 +- source/materials/src/G4ExtendedMaterial.cc | 1 - source/materials/src/G4IonisParamMat.cc | 46 +- source/materials/src/G4Material.cc | 460 +- .../src/G4MaterialPropertiesTable.cc | 472 +- .../src/G4MicroElecMaterialStructure.cc | 4 +- source/parameterisations/gflash/History | 9 +- .../GFlashSamplingShowerParameterisation.hh | 3 + .../gflash/include/GVFlashHomoShowerTuning.hh | 20 +- .../GFlashSamplingShowerParameterisation.cc | 100 +- .../gflash/src/GFlashShowerModelMessenger.cc | 2 +- source/particles/History | 46 + .../include/G4AntiDoubleHyperDoubleNeutron.hh | 53 + .../ions/include/G4AntiDoubleHyperH4.hh | 53 + .../hadrons/ions/include/G4AntiHyperAlpha.hh | 53 + .../hadrons/ions/include/G4AntiHyperH4.hh | 53 + .../hadrons/ions/include/G4AntiHyperHe5.hh | 53 + .../hadrons/ions/include/G4AntiHyperTriton.hh | 53 + .../include/G4DoubleHyperDoubleNeutron.hh | 53 + .../hadrons/ions/include/G4DoubleHyperH4.hh | 53 + .../hadrons/ions/include/G4HyperAlpha.hh | 53 + .../hadrons/ions/include/G4HyperH4.hh | 53 + .../hadrons/ions/include/G4HyperHe5.hh | 53 + .../hadrons/ions/include/G4HyperTriton.hh | 53 + .../hadrons/ions/include/G4IonConstructor.hh | 2 +- source/particles/hadrons/ions/sources.cmake | 24 + .../src/G4AntiDoubleHyperDoubleNeutron.cc | 101 + .../hadrons/ions/src/G4AntiDoubleHyperH4.cc | 105 + .../hadrons/ions/src/G4AntiHyperAlpha.cc | 124 + .../hadrons/ions/src/G4AntiHyperH4.cc | 124 + .../hadrons/ions/src/G4AntiHyperHe5.cc | 122 + .../hadrons/ions/src/G4AntiHyperTriton.cc | 105 + .../ions/src/G4DoubleHyperDoubleNeutron.cc | 101 + .../hadrons/ions/src/G4DoubleHyperH4.cc | 105 + .../hadrons/ions/src/G4HyperAlpha.cc | 124 + .../particles/hadrons/ions/src/G4HyperH4.cc | 124 + .../particles/hadrons/ions/src/G4HyperHe5.cc | 123 + .../hadrons/ions/src/G4HyperTriton.cc | 105 + .../hadrons/ions/src/G4IonConstructor.cc | 32 +- .../management/include/G4PDefManager.hh | 2 + .../include/G4ParticleDefinition.hh | 21 + .../include/G4ParticleDefinition.icc | 32 + .../include/G4ParticlePropertyMessenger.hh | 3 - .../include/G4PhaseSpaceDecayChannel.hh | 5 +- .../management/include/G4VDecayChannel.hh | 3 +- .../management/src/G4DecayTableMessenger.cc | 2 +- source/particles/management/src/G4IonTable.cc | 4 +- .../management/src/G4NuclideTable.cc | 2 +- .../particles/management/src/G4PDefManager.cc | 1 + .../management/src/G4ParticleDefinition.cc | 27 + .../src/G4ParticlePropertyMessenger.cc | 38 +- .../management/src/G4ParticleTable.cc | 11 +- .../src/G4PhaseSpaceDecayChannel.cc | 7 +- .../management/src/G4VDecayChannel.cc | 4 +- .../particles/utils/src/G4HtmlPPReporter.cc | 4 +- .../particles/utils/src/G4TextPPReporter.cc | 4 +- .../particles/utils/src/G4TextPPRetriever.cc | 4 +- source/persistency/History | 3 + source/persistency/ascii/History | 13 + .../ascii/include/G4tgbGeometryDumper.hh | 2 + .../ascii/include/G4tgrSolidMultiUnion.hh | 103 + .../ascii/include/G4tgrSolidScaled.hh | 62 +- source/persistency/ascii/sources.cmake | 6 +- .../ascii/src/G4tgbGeometryDumper.cc | 83 +- .../ascii/src/G4tgbMaterialSimple.cc | 2 +- source/persistency/ascii/src/G4tgbVolume.cc | 48 +- .../persistency/ascii/src/G4tgrEvaluator.cc | 72 +- source/persistency/ascii/src/G4tgrMaterial.cc | 2 +- .../ascii/src/G4tgrSolidMultiUnion.cc | 126 + .../persistency/ascii/src/G4tgrSolidScaled.cc | 94 + source/persistency/ascii/src/G4tgrUtils.cc | 2 +- .../persistency/ascii/src/G4tgrVolumeMgr.cc | 12 + source/persistency/gdml/History | 41 +- .../persistency/gdml/include/G4GDMLParser.hh | 1 + .../persistency/gdml/include/G4GDMLParser.icc | 6 + source/persistency/gdml/src/G4GDMLParser.cc | 46 +- source/persistency/gdml/src/G4GDMLRead.cc | 12 +- .../gdml/src/G4GDMLReadMaterials.cc | 4 +- .../persistency/gdml/src/G4GDMLReadSolids.cc | 4 +- source/persistency/gdml/src/G4GDMLWrite.cc | 2 +- .../gdml/src/G4GDMLWriteMaterials.cc | 58 +- .../persistency/gdml/src/G4GDMLWriteSolids.cc | 61 +- .../gdml/src/G4GDMLWriteStructure.cc | 29 +- .../src/G4PersistencyCenterMessenger.cc | 2 +- source/physics_lists/History | 4 + source/physics_lists/builders/History | 6 + .../builders/src/G4HadronicBuilder.cc | 4 + .../builders/src/G4QGSPNeutronBuilder.cc | 4 +- .../physics_lists/constructors/decay/History | 8 + .../physics_lists/constructors/decay/README | 14 - .../decay/src/G4RadioactiveDecayPhysics.cc | 6 +- .../constructors/electromagnetic/History | 40 +- .../constructors/electromagnetic/README | 91 - .../include/G4GammaGeneralProcess.hh | 22 +- .../include/G4OpticalPhysics.hh | 30 +- .../electromagnetic/src/G4EmBuilder.cc | 45 +- .../src/G4EmDNAPhysics_option1.cc | 1 - .../src/G4EmDNAPhysics_option2.cc | 1 - .../src/G4EmDNAPhysics_option3.cc | 1 - .../src/G4EmDNAPhysics_option4.cc | 1 - .../src/G4EmDNAPhysics_option5.cc | 1 - .../src/G4EmDNAPhysics_option6.cc | 1 - .../src/G4EmDNAPhysics_option7.cc | 1 - .../src/G4EmDNAPhysics_option8.cc | 1 - .../src/G4EmDNAPhysics_stationary_option2.cc | 14 +- .../src/G4EmDNAPhysics_stationary_option4.cc | 14 +- .../src/G4EmDNAPhysics_stationary_option6.cc | 14 +- .../electromagnetic/src/G4EmModelActivator.cc | 6 + .../src/G4EmStandardPhysicsWVI.cc | 65 +- .../src/G4GammaGeneralProcess.cc | 199 +- .../electromagnetic/src/G4OpticalPhysics.cc | 109 +- .../physics_lists/constructors/factory/README | 9 - .../constructors/gamma_lepto_nuclear/History | 16 + .../constructors/gamma_lepto_nuclear/README | 48 - .../src/G4EmExtraPhysics.cc | 55 +- .../constructors/hadron_elastic/README | 104 - .../constructors/hadron_inelastic/README | 282 - source/physics_lists/constructors/ions/README | 44 - .../constructors/limiters/README | 72 - .../constructors/stopping/README | 19 - source/physics_lists/lists/History | 7 + .../lists/include/INCLXXPhysicsListHelper.icc | 2 +- source/physics_lists/lists/src/LBE.cc | 4 +- source/physics_lists/util/History | 3 + .../util/include/G4HadParticles.hh | 6 + .../physics_lists/util/src/G4HadParticles.cc | 33 + source/processes/History | 9 + source/processes/biasing/generic/History | 4 + .../generic/src/G4BOptrForceCollision.cc | 10 +- source/processes/cuts/History | 21 + .../cuts/include/G4MCCIndexConversionTable.hh | 12 +- .../cuts/include/G4PhysicsTableHelper.hh | 8 +- .../cuts/include/G4RToEConvForElectron.hh | 19 +- .../cuts/include/G4RToEConvForGamma.hh | 51 +- .../cuts/include/G4RToEConvForPositron.hh | 20 +- .../cuts/include/G4RToEConvForProton.hh | 31 +- .../cuts/include/G4VRangeToEnergyConverter.hh | 127 +- .../cuts/src/G4PhysicsTableHelper.cc | 126 +- .../cuts/src/G4ProductionCutsTable.cc | 7 +- .../cuts/src/G4RToEConvForElectron.cc | 73 +- .../processes/cuts/src/G4RToEConvForGamma.cc | 128 +- .../cuts/src/G4RToEConvForPositron.cc | 74 +- .../processes/cuts/src/G4RToEConvForProton.cc | 89 +- .../cuts/src/G4VRangeToEnergyConverter.cc | 499 +- .../processes/electromagnetic/adjoint/History | 13 + .../G4AdjointForcedInteractionForGamma.hh | 2 +- .../adjoint/src/G4AdjointCSManager.cc | 32 +- .../src/G4AdjointForcedInteractionForGamma.cc | 19 +- .../adjoint/src/G4AdjointhIonisationModel.cc | 5 +- .../adjoint/src/G4ContinuousGainOfEnergy.cc | 6 +- .../adjoint/src/G4VEmAdjointModel.cc | 23 +- source/processes/electromagnetic/dna/History | 35 + .../management/include/G4DNABoundingBox.hh | 221 +- .../management/include/G4ITMultiNavigator.hh | 4 +- .../dna/management/include/G4ITPathFinder.hh | 6 +- .../dna/management/include/G4Scheduler.hh | 141 +- .../management/include/G4UserMeshAction.hh | 22 +- .../include/G4VDNAMolecularGeometry.hh | 55 + .../include/G4VScavengerMaterial.hh | 18 +- .../dna/management/sources.cmake | 3 + .../dna/management/src/G4DNABoundingBox.cc | 327 +- .../dna/management/src/G4ITModelProcessor.cc | 2 + .../dna/management/src/G4ITTransportation.cc | 3 +- .../dna/management/src/G4Scheduler.cc | 47 +- .../management/src/G4SchedulerMessenger.cc | 2 +- .../G4DNADiracRMatrixExcitationModel.hh | 22 +- .../models/include/G4DNAELSEPAElasticModel.hh | 35 +- .../dna/models/include/G4DNAEventScheduler.hh | 124 + .../include/G4DNAGillespieDirectMethod.hh | 76 + .../dna/models/include/G4DNAIRT.hh | 7 +- .../dna/models/include/G4DNAIRT_geometries.hh | 118 + .../G4DNAIndependentReactionTimeStepper.hh | 2 - .../G4DNAQuinnPlasmonExcitationModel.hh | 13 +- .../G4DNARelativisticIonisationModel.hh | 18 +- .../models/include/G4DNAUpdateSystemModel.hh | 70 +- .../models/include/G4VUpdateSystemModel.hh | 21 +- .../electromagnetic/dna/models/sources.cmake | 13 +- .../models/src/G4DNABornExcitationModel2.cc | 9 +- .../models/src/G4DNABornIonisationModel2.cc | 2 +- .../dna/models/src/G4DNAELSEPAElasticModel.cc | 318 +- .../dna/models/src/G4DNAEventScheduler.cc | 686 + .../models/src/G4DNAGillespieDirectMethod.cc | 344 + .../dna/models/src/G4DNAIRT.cc | 32 +- .../dna/models/src/G4DNAIRT_geometries.cc | 642 + .../dna/models/src/G4DNAUpdateSystemModel.cc | 275 + .../dna/models/src/G4VLEPTSModel.cc | 9 +- .../management/include/G4FakeParticleID.hh | 2 +- .../dna/molecules/management/sources.cmake | 1 - .../src/G4MolecularConfiguration.cc | 16 - .../include/G4DNAScavengerProcess.hh | 105 + .../dna/processes/sources.cmake | 4 +- .../dna/processes/src/G4DNAAttachment.cc | 3 +- .../src/G4DNABrownianTransportation.cc | 5 +- .../dna/processes/src/G4DNAChargeDecrease.cc | 3 +- .../dna/processes/src/G4DNAChargeIncrease.cc | 3 +- .../dna/processes/src/G4DNAElastic.cc | 3 +- .../src/G4DNAElectronHoleRecombination.cc | 3 +- .../processes/src/G4DNAElectronSolvation.cc | 3 +- .../dna/processes/src/G4DNAExcitation.cc | 3 +- .../dna/processes/src/G4DNAIonisation.cc | 3 +- .../src/G4DNAMolecularDissociation.cc | 5 +- .../processes/src/G4DNAPlasmonExcitation.cc | 3 +- .../processes/src/G4DNAScavengerProcess.cc | 354 + .../processes/src/G4DNASecondOrderReaction.cc | 3 +- .../dna/processes/src/G4DNAVibExcitation.cc | 3 +- .../dna/utils/include/G4DNAEventSet.hh | 124 + .../dna/utils/include/G4DNAMesh.hh | 156 + .../include/G4DNAMolecularReactionTable.hh | 5 + .../utils/include/G4DNAScavengerMaterial.hh | 122 + .../dna/utils/include/G4VChemistryWorld.hh} | 97 +- .../electromagnetic/dna/utils/sources.cmake | 11 +- .../dna/utils/src/G4DNAEventSet.cc | 127 + .../dna/utils/src/G4DNAMesh.cc | 351 + .../utils/src/G4DNAMolecularReactionTable.cc | 6 + .../dna/utils/src/G4DNAScavengerMaterial.cc | 475 + .../electromagnetic/highenergy/History | 13 + .../highenergy/include/G4AnnihiToMuPair.hh | 97 +- .../include/G4mplIonisationModel.hh | 12 +- .../include/G4mplIonisationWithDeltaModel.hh | 12 +- .../highenergy/src/G4AnnihiToMuPair.cc | 139 +- .../highenergy/src/G4mplIonisationModel.cc | 22 +- .../src/G4mplIonisationWithDeltaModel.cc | 24 +- .../electromagnetic/lowenergy/History | 56 + .../include/G4ANSTOecpssrKxsModel.hh | 61 +- .../include/G4ANSTOecpssrLixsModel.hh} | 59 +- .../include/G4ANSTOecpssrMixsModel.hh | 94 + .../include/G4LivermoreComptonModel.hh | 7 +- .../G4LivermoreComptonModifiedModel.hh | 91 - .../G4LivermoreGammaConversionModel.hh | 10 +- .../G4LivermoreGammaConversionModelRC.hh | 95 - .../include/G4LivermorePhotoElectricModel.hh | 12 +- .../G4LivermorePolarizedComptonModel.hh | 2 +- .../G4LivermorePolarizedRayleighModel.hh | 17 +- .../include/G4LivermoreRayleighModel.hh | 6 +- .../G4MicroElecCrossSectionDataSet_new.hh | 4 +- .../include/G4MicroElecElasticModel_new.hh | 4 +- .../include/G4PenelopeOscillatorManager.hh | 4 +- .../electromagnetic/lowenergy/sources.cmake | 10 +- .../lowenergy/src/G4ANSTOecpssrKxsModel.cc | 117 + .../lowenergy/src/G4ANSTOecpssrLixsModel.cc | 207 + .../lowenergy/src/G4ANSTOecpssrMixsModel.cc | 323 + .../src/G4AtomicTransitionManager.cc | 20 +- .../lowenergy/src/G4AugerData.cc | 24 +- .../lowenergy/src/G4FluoData.cc | 7 +- .../src/G4JAEAElasticScatteringModel.cc | 2 +- .../G4JAEAPolarizedElasticScatteringModel.cc | 2 +- .../lowenergy/src/G4LivermoreComptonModel.cc | 313 +- .../src/G4LivermoreComptonModifiedModel.cc | 403 - .../src/G4LivermoreGammaConversionModel.cc | 108 +- .../src/G4LivermoreGammaConversionModelRC.cc | 587 - .../src/G4LivermorePhotoElectricModel.cc | 93 +- .../src/G4LivermorePolarizedComptonModel.cc | 7 +- .../src/G4LivermorePolarizedRayleighModel.cc | 257 +- .../lowenergy/src/G4LivermoreRayleighModel.cc | 66 +- .../lowenergy/src/G4MicroElecElastic.cc | 3 +- .../lowenergy/src/G4MicroElecInelastic.cc | 3 +- .../src/G4MicroElecInelasticModel_new.cc | 14 +- .../src/G4MicroElecLOPhononScattering.cc | 3 +- .../lowenergy/src/G4MicroElecSurface.cc | 3 +- .../src/G4PenelopeBremsstrahlungAngular.cc | 17 +- .../src/G4PenelopeBremsstrahlungFS.cc | 28 +- .../lowenergy/src/G4PenelopeCrossSection.cc | 25 +- .../src/G4PenelopePhotoElectricModel.cc | 2 +- .../src/G4RayleighAngularGenerator.cc | 200 +- .../lowenergy/src/G4ShellData.cc | 2 +- .../lowenergy/src/G4ShellEMDataSet.cc | 10 +- .../lowenergy/src/G4UAtomicDeexcitation.cc | 4 + .../lowenergy/src/G4VCrossSectionHandler.cc | 6 +- .../lowenergy/src/G4eIonisationParameters.cc | 3 +- .../lowenergy/src/G4teoCrossSection.cc | 14 +- .../processes/electromagnetic/muons/History | 8 + .../muons/src/G4MuBremsstrahlung.cc | 1 + .../muons/src/G4MuPairProduction.cc | 1 + .../muons/src/G4TablesForExtrapolator.cc | 5 +- .../muons/src/G4ePairProduction.cc | 1 + source/processes/electromagnetic/pii/History | 3 + .../pii/src/G4PixeCrossSectionHandler.cc | 3 +- .../src/G4PolarizationMessenger.cc | 6 +- .../electromagnetic/standard/History | 79 + .../standard/include/G4ASTARStopping.hh | 14 +- .../include/G4AtimaEnergyLossModel.hh | 19 +- .../standard/include/G4AtimaFluctuations.hh | 12 +- .../standard/include/G4BetheBlochModel.hh | 63 +- .../standard/include/G4BraggIonModel.hh | 71 +- .../standard/include/G4BraggModel.hh | 3 + .../standard/include/G4ESTARStopping.hh | 11 +- .../standard/include/G4IonFluctuations.hh | 35 +- ...4alphaIonisation.hh => G4IonICRU73Data.hh} | 106 +- .../include/G4LindhardSorensenIonModel.hh | 30 +- .../standard/include/G4PAIModel.hh | 6 +- .../standard/include/G4PAIPhotModel.hh | 5 +- .../include/G4UniversalFluctuation.hh | 59 +- .../standard/include/G4UrbanMscModel.hh | 13 +- .../standard/include/G4eplusAnnihilation.hh | 2 +- .../electromagnetic/standard/sources.cmake | 4 +- .../standard/src/G4ASTARStopping.cc | 10 +- .../standard/src/G4AtimaEnergyLossModel.cc | 5 +- .../standard/src/G4AtimaFluctuations.cc | 18 +- .../standard/src/G4BetheBlochModel.cc | 165 +- .../standard/src/G4BraggIonModel.cc | 303 +- .../standard/src/G4BraggModel.cc | 80 +- .../standard/src/G4CoulombScattering.cc | 1 + .../standard/src/G4ESTARStopping.cc | 6 +- .../standard/src/G4ICRU73QOModel.cc | 53 +- .../standard/src/G4IonFluctuations.cc | 92 +- .../standard/src/G4IonICRU73Data.cc | 327 + .../src/G4LindhardSorensenIonModel.cc | 202 +- .../standard/src/G4PAIModel.cc | 19 +- .../standard/src/G4PAIModelData.cc | 4 +- .../standard/src/G4PAIPhotModel.cc | 32 +- .../standard/src/G4PEEffectFluoModel.cc | 20 +- .../standard/src/G4PairProductionRelModel.cc | 2 +- .../standard/src/G4UniversalFluctuation.cc | 189 +- .../standard/src/G4UrbanMscModel.cc | 237 +- .../standard/src/G4alphaIonisation.cc | 157 - .../standard/src/G4eplusAnnihilation.cc | 13 +- .../standard/src/G4hIonisation.cc | 29 +- .../standard/src/G4ionIonisation.cc | 24 +- .../processes/electromagnetic/utils/History | 83 + .../utils/include/G4DNAModelSubType.hh | 12 +- .../utils/include/G4EmCorrections.hh | 2 +- .../utils/include/G4EmLowEParameters.hh | 4 + .../include/G4EmLowEParametersMessenger.hh | 1 + .../utils/include/G4EmParameters.hh | 32 +- .../utils/include/G4EmProcessSubType.hh | 1 + .../include/G4EmSecondaryParticleType.hh | 73 + .../utils/include/G4LossTableBuilder.hh | 21 +- .../include/G4LowEnergyEmProcessSubType.hh} | 55 +- .../utils/include/G4OpticalParameters.hh | 182 +- .../include/G4OpticalParametersMessenger.hh | 92 +- .../utils/include/G4VAtomDeexcitation.hh | 7 +- .../utils/include/G4VEmFluctuationModel.hh | 12 +- .../utils/include/G4VEmModel.hh | 56 +- .../utils/include/G4VEmProcess.hh | 87 +- .../utils/include/G4VEnergyLossProcess.hh | 120 +- .../utils/include/G4VMscModel.hh | 36 +- .../utils/include/G4VMultipleScattering.hh | 11 +- .../electromagnetic/utils/sources.cmake | 2 + .../utils/src/G4EmCalculator.cc | 6 +- .../utils/src/G4EmCorrections.cc | 112 +- .../utils/src/G4EmElementSelector.cc | 45 +- .../utils/src/G4EmLowEParameters.cc | 11 + .../utils/src/G4EmLowEParametersMessenger.cc | 13 +- .../utils/src/G4EmParameters.cc | 59 +- .../utils/src/G4EmParametersMessenger.cc | 3 +- .../utils/src/G4LossTableBuilder.cc | 207 +- .../utils/src/G4LossTableManager.cc | 22 +- .../utils/src/G4OpticalParameters.cc | 232 +- .../utils/src/G4OpticalParametersMessenger.cc | 461 +- .../utils/src/G4VAtomDeexcitation.cc | 44 +- .../electromagnetic/utils/src/G4VEmModel.cc | 9 + .../electromagnetic/utils/src/G4VEmProcess.cc | 155 +- .../utils/src/G4VEnergyLossProcess.cc | 334 +- .../electromagnetic/utils/src/G4VMscModel.cc | 34 +- .../utils/src/G4VMultipleScattering.cc | 14 +- .../utils/src/G4ionEffectiveCharge.cc | 43 +- .../processes/electromagnetic/xrays/History | 20 + .../xrays/include/G4Cerenkov.hh | 10 +- .../xrays/include/G4ForwardXrayTR.hh | 2 + .../xrays/include/G4GaussXTRadiator.hh | 59 +- .../xrays/include/G4Scintillation.hh | 25 +- .../xrays/include/G4SynchrotronRadiation.hh | 2 + .../include/G4SynchrotronRadiationInMat.hh | 2 + .../xrays/include/G4VXTRenergyLoss.hh | 86 +- .../electromagnetic/xrays/sources.cmake | 2 + .../electromagnetic/xrays/src/G4Cerenkov.cc | 52 +- .../xrays/src/G4ForwardXrayTR.cc | 18 +- .../xrays/src/G4GaussXTRadiator.cc | 218 + .../xrays/src/G4Scintillation.cc | 81 +- .../xrays/src/G4SynchrotronRadiation.cc | 11 +- .../xrays/src/G4SynchrotronRadiationInMat.cc | 10 +- .../xrays/src/G4VXTRenergyLoss.cc | 79 +- .../processes/hadronic/cross_sections/History | 42 + .../include/G4CrossSectionDataSetRegistry.hh | 2 +- .../cross_sections/include/G4ElNucleusSFcs.hh | 81 + .../include/G4GammaNuclearXS.hh | 61 +- .../include/G4IonsShenCrossSection.hh} | 73 +- .../cross_sections/include/G4IsotopeList.hh | 46 +- .../include/G4PhotoNuclearCrossSection.hh | 38 +- .../hadronic/cross_sections/sources.cmake | 4 + .../src/G4BGGNucleonElasticXS.cc | 2 +- .../src/G4BGGNucleonInelasticXS.cc | 6 +- .../src/G4ComponentBarNucleonNucleusXsc.cc | 4 +- .../src/G4CrossSectionDataSetRegistry.cc | 19 +- .../cross_sections/src/G4ElNucleusSFcs.cc | 166 + .../cross_sections/src/G4GammaNuclearXS.cc | 315 +- .../src/G4IonsShenCrossSection.cc | 166 + .../cross_sections/src/G4NeutronCaptureXS.cc | 21 +- .../cross_sections/src/G4NeutronElasticXS.cc | 11 +- .../src/G4NeutronInelasticXS.cc | 19 +- .../src/G4NucleonNuclearCrossSection.cc | 5 - .../src/G4ParticleInelasticXS.cc | 14 +- .../src/G4PhotoNuclearCrossSection.cc | 126 +- source/processes/hadronic/management/History | 14 + .../management/include/G4HadronicProcess.hh | 2 - .../include/G4HadronicProcessType.hh | 3 +- .../management/src/G4HadronicProcess.cc | 11 +- .../management/src/G4HadronicProcessStore.cc | 3 + .../hadronic/models/abla/GNUmakefile | 1 + source/processes/hadronic/models/abla/History | 20 + .../models/abla/include/G4AblaInterface.hh | 45 +- .../hadronic/models/abla/src/G4Abla.cc | 89 +- .../models/abla/src/G4AblaInterface.cc | 195 +- .../hadronic/models/abrasion/History | 5 + .../abrasion/include/G4WilsonAbrasionModel.hh | 6 +- .../abrasion/src/G4WilsonAbrasionModel.cc | 29 +- .../hadronic/models/binary_cascade/History | 10 + .../binary_cascade/include/G4BinaryCascade.hh | 5 - .../include/G4BinaryLightIonReaction.hh | 4 - .../G4GeneratorPrecompoundInterface.hh | 2 + .../binary_cascade/src/G4BinaryCascade.cc | 51 +- .../src/G4BinaryLightIonReaction.cc | 24 +- .../src/G4GeneratorPrecompoundInterface.cc | 159 +- .../processes/hadronic/models/cascade/History | 11 +- .../cascade/include/G4CascadeInterface.hh | 3 +- .../cascade/include/G4CascadeInterpolator.icc | 2 +- .../include/G4CascadeParamMessenger.icc | 2 +- .../cascade/cascade/src/G4CascadeInterface.cc | 11 +- .../cascade/src/G4CascadeParamMessenger.cc | 4 +- .../src/G4ElementaryParticleCollider.cc | 16 +- .../hadronic/models/coherent_elastic/History | 7 + .../include/G4ChargeExchange.hh | 6 + .../include/G4HadronElastic.hh | 1 + .../include/G4LMsdGenerator.hh | 1 + .../include/G4NeutronElectronElModel.hh | 2 +- .../coherent_elastic/src/G4ChargeExchange.cc | 9 +- .../coherent_elastic/src/G4HadronElastic.cc | 7 +- .../src/G4LEHadronProtonElastic.cc | 5 +- .../models/coherent_elastic/src/G4LEnp.cc | 5 +- .../models/coherent_elastic/src/G4LEpp.cc | 6 +- .../coherent_elastic/src/G4LMsdGenerator.cc | 10 +- .../src/G4NeutrinoElectronNcModel.cc | 6 +- .../src/G4NeutronElectronElModel.cc | 5 +- .../hadronic/models/de_excitation/History | 26 + .../ablation/include/G4WilsonAblationModel.hh | 1 + .../ablation/src/G4WilsonAblationModel.cc | 9 +- .../include/G4EvaporationChannel.hh | 2 + .../include/G4UnstableFragmentBreakUp.hh | 2 + .../evaporation/src/G4EvaporationChannel.cc | 7 +- .../src/G4UnstableFragmentBreakUp.cc | 6 +- .../fermi_breakup/include/G4FermiBreakUpVI.hh | 2 + .../fermi_breakup/src/G4FermiBreakUpVI.cc | 5 +- .../fission/include/G4CompetitiveFission.hh | 3 +- .../fission/include/G4ParaFissionModel.hh | 128 - .../de_excitation/fission/sources.cmake | 3 - .../fission/src/G4CompetitiveFission.cc | 7 +- .../gem_evaporation/include/G4GEMChannel.hh | 3 + .../gem_evaporation/include/G4GEMChannelVI.hh | 3 +- .../gem_evaporation/src/G4GEMChannel.cc | 9 +- .../gem_evaporation/src/G4GEMChannelVI.cc | 10 +- .../handler/src/G4ExcitationHandler.cc | 10 +- .../include/G4DeexPrecoParameters.hh | 10 - .../management/src/G4DeexPrecoParameters.cc | 10 +- .../multifragmentation/include/G4StatMF.hh | 2 +- .../multifragmentation/src/G4StatMF.cc | 6 +- .../photon_evaporation/README-LevelGammaData | 81 - .../include/G4NeutronRadCapture.hh | 3 +- .../include/G4PhotonEvaporation.hh | 2 + .../src/G4NeutronRadCapture.cc | 15 +- .../src/G4PhotonEvaporation.cc | 68 +- .../hadronic/models/em_dissociation/History | 6 + .../include/G4EMDissociation.hh | 6 +- .../em_dissociation/src/G4EMDissociation.cc | 32 +- .../processes/hadronic/models/fission/History | 5 + .../fission/include/G4FissionLibrary.hh | 2 + .../models/fission/include/G4LFission.hh | 1 + .../models/fission/src/G4FissionLibrary.cc | 8 +- .../hadronic/models/fission/src/G4LFission.cc | 8 +- .../hadronic/models/gamma_nuclear/History | 5 + .../include/G4LENDorBERTModel.hh | 1 + .../gamma_nuclear/src/G4LENDorBERTModel.cc | 21 +- .../hadronic/models/im_r_matrix/README | 2 - .../processes/hadronic/models/inclxx/History | 20 + .../include/G4INCLBinaryCollisionAvatar.hh | 4 +- .../incl_physics/include/G4INCLCluster.hh | 4 +- .../include/G4INCLParticleSampler.hh | 5 +- .../incl_physics/include/G4INCLStore.hh | 2 +- .../src/G4INCLBinaryCollisionAvatar.cc | 2 +- .../inclxx/incl_physics/src/G4INCLCascade.cc | 3 + .../src/G4INCLEtaNElasticChannel.cc | 2 +- .../src/G4INCLNuclearDensityFactory.cc | 2 +- .../src/G4INCLNuclearPotentialIsospin.cc | 6 +- .../src/G4INCLOmegaNToPiNChannel.cc | 2 +- .../incl_physics/src/G4INCLParticleSampler.cc | 11 +- .../incl_physics/src/G4INCLPiNToEtaChannel.cc | 2 +- .../src/G4INCLProjectileRemnant.cc | 5 +- .../interface/include/G4INCLXXInterface.hh | 8 +- .../inclxx/interface/src/G4INCLXXInterface.cc | 136 +- .../src/G4INCLXXInterfaceMessenger.cc | 2 +- .../interface/src/G4INCLXXInterfaceStore.cc | 2 +- .../inclxx/utils/include/G4INCLGlobalInfo.hh | 3 + .../utils/include/G4INCLParticleTable.hh | 1 + .../inclxx/utils/include/G4INCLRandom.hh | 7 +- .../models/inclxx/utils/src/G4INCLHFB.cc | 15 +- .../utils/src/G4INCLNuclearMassTable.cc | 2 +- .../inclxx/utils/src/G4INCLParticleSpecies.cc | 180 +- .../inclxx/utils/src/G4INCLParticleTable.cc | 21 +- source/processes/hadronic/models/lend/History | 6 + .../models/lend/include/G4LENDModel.hh | 2 + .../hadronic/models/lend/src/G4LENDCapture.cc | 6 +- .../hadronic/models/lend/src/G4LENDElastic.cc | 2 +- .../hadronic/models/lend/src/G4LENDFission.cc | 2 +- .../models/lend/src/G4LENDInelastic.cc | 6 +- .../hadronic/models/lend/src/G4LENDModel.cc | 4 +- .../hadronic/models/lepto_nuclear/History | 11 + .../include/G4ANuElNucleusCcModel.hh | 2 +- .../include/G4ANuElNucleusNcModel.hh | 2 +- .../include/G4ANuMuNucleusCcModel.hh | 2 +- .../include/G4ElectroVDNuclearModel.hh | 2 + .../include/G4MuonVDNuclearModel.hh | 2 + .../include/G4NeutrinoElectronCcModel.hh | 3 +- .../include/G4NeutrinoNucleusModel.hh | 3 +- .../include/G4NuElNucleusCcModel.hh | 2 +- .../include/G4NuElNucleusNcModel.hh | 2 +- .../include/G4NuMuNucleusCcModel.hh | 2 +- .../src/G4ANuElNucleusCcModel.cc | 4 +- .../src/G4ANuElNucleusNcModel.cc | 4 +- .../src/G4ANuMuNucleusCcModel.cc | 4 +- .../src/G4ANuMuNucleusNcModel.cc | 4 +- .../src/G4ElectroVDNuclearModel.cc | 11 +- .../lepto_nuclear/src/G4MuonVDNuclearModel.cc | 9 + .../src/G4NeutrinoElectronCcModel.cc | 7 +- .../src/G4NeutrinoNucleusModel.cc | 21 +- .../lepto_nuclear/src/G4NuElNucleusCcModel.cc | 4 +- .../lepto_nuclear/src/G4NuElNucleusNcModel.cc | 4 +- .../lepto_nuclear/src/G4NuMuNucleusCcModel.cc | 4 +- .../lepto_nuclear/src/G4NuMuNucleusNcModel.cc | 4 +- .../hadronic/models/particle_hp/History | 19 + .../include/G4ParticleHP2AInelasticFS.hh | 2 +- .../include/G4ParticleHP2N2AInelasticFS.hh | 2 +- .../include/G4ParticleHP2NAInelasticFS.hh | 2 +- .../include/G4ParticleHP2NDInelasticFS.hh | 2 +- .../include/G4ParticleHP2NInelasticFS.hh | 2 +- .../include/G4ParticleHP2NPInelasticFS.hh | 2 +- .../include/G4ParticleHP2PInelasticFS.hh | 2 +- .../include/G4ParticleHP3AInelasticFS.hh | 2 +- .../include/G4ParticleHP3NAInelasticFS.hh | 2 +- .../include/G4ParticleHP3NInelasticFS.hh | 2 +- .../include/G4ParticleHP3NPInelasticFS.hh | 2 +- .../include/G4ParticleHP4NInelasticFS.hh | 2 +- .../include/G4ParticleHPAInelasticFS.hh | 2 +- .../include/G4ParticleHPCaptureFS.hh | 7 +- .../include/G4ParticleHPD2AInelasticFS.hh | 2 +- .../include/G4ParticleHPDAInelasticFS.hh | 2 +- .../include/G4ParticleHPDInelasticFS.hh | 2 +- .../include/G4ParticleHPElastic.hh | 1 + .../include/G4ParticleHPElasticFS.hh | 12 +- .../include/G4ParticleHPFinalState.hh | 3 + .../include/G4ParticleHPFissionFS.hh | 2 +- .../include/G4ParticleHPHe3InelasticFS.hh | 2 +- .../include/G4ParticleHPN2AInelasticFS.hh | 2 +- .../include/G4ParticleHPN2PInelasticFS.hh | 2 +- .../include/G4ParticleHPN3AInelasticFS.hh | 2 +- .../include/G4ParticleHPNAInelasticFS.hh | 2 +- .../include/G4ParticleHPND2AInelasticFS.hh | 2 +- .../include/G4ParticleHPNDInelasticFS.hh | 2 +- .../include/G4ParticleHPNHe3InelasticFS.hh | 2 +- .../include/G4ParticleHPNInelasticFS.hh | 2 +- .../include/G4ParticleHPNPAInelasticFS.hh | 2 +- .../include/G4ParticleHPNPInelasticFS.hh | 2 +- .../include/G4ParticleHPNT2AInelasticFS.hh | 2 +- .../include/G4ParticleHPNTInelasticFS.hh | 2 +- .../include/G4ParticleHPNXInelasticFS.hh | 2 +- .../include/G4ParticleHPPAInelasticFS.hh | 2 +- .../include/G4ParticleHPPDInelasticFS.hh | 2 +- .../include/G4ParticleHPPInelasticFS.hh | 2 +- .../include/G4ParticleHPPTInelasticFS.hh | 2 +- .../include/G4ParticleHPT2AInelasticFS.hh | 2 +- .../include/G4ParticleHPTInelasticFS.hh | 2 +- .../include/G4ParticleHPThermalScattering.hh | 10 +- .../G4WendtFissionFragmentGenerator.hh | 2 + .../src/G4ParticleHP2AInelasticFS.cc | 6 + .../src/G4ParticleHP2N2AInelasticFS.cc | 6 + .../src/G4ParticleHP2NAInelasticFS.cc | 6 + .../src/G4ParticleHP2NDInelasticFS.cc | 6 + .../src/G4ParticleHP2NInelasticFS.cc | 6 + .../src/G4ParticleHP2NPInelasticFS.cc | 6 + .../src/G4ParticleHP2PInelasticFS.cc | 6 + .../src/G4ParticleHP3AInelasticFS.cc | 6 + .../src/G4ParticleHP3NAInelasticFS.cc | 6 + .../src/G4ParticleHP3NInelasticFS.cc | 6 + .../src/G4ParticleHP3NPInelasticFS.cc | 6 + .../src/G4ParticleHP4NInelasticFS.cc | 6 + .../src/G4ParticleHPAInelasticFS.cc | 6 + .../particle_hp/src/G4ParticleHPCaptureFS.cc | 21 +- .../src/G4ParticleHPD2AInelasticFS.cc | 6 + .../src/G4ParticleHPDAInelasticFS.cc | 6 + .../src/G4ParticleHPDInelasticFS.cc | 6 + .../particle_hp/src/G4ParticleHPElastic.cc | 221 +- .../particle_hp/src/G4ParticleHPElasticFS.cc | 18 +- .../particle_hp/src/G4ParticleHPFinalState.cc | 10 +- .../particle_hp/src/G4ParticleHPFissionFS.cc | 24 +- .../src/G4ParticleHPHe3InelasticFS.cc | 6 + .../src/G4ParticleHPInelasticBaseFS.cc | 6 +- .../src/G4ParticleHPInelasticCompFS.cc | 14 +- .../src/G4ParticleHPLabAngularEnergy.cc | 151 +- .../src/G4ParticleHPN2AInelasticFS.cc | 6 + .../src/G4ParticleHPN2PInelasticFS.cc | 6 + .../src/G4ParticleHPN3AInelasticFS.cc | 6 + .../src/G4ParticleHPNAInelasticFS.cc | 6 + .../src/G4ParticleHPND2AInelasticFS.cc | 6 + .../src/G4ParticleHPNDInelasticFS.cc | 6 + .../src/G4ParticleHPNHe3InelasticFS.cc | 6 + .../src/G4ParticleHPNInelasticFS.cc | 6 + .../src/G4ParticleHPNPAInelasticFS.cc | 6 + .../src/G4ParticleHPNPInelasticFS.cc | 6 + .../src/G4ParticleHPNT2AInelasticFS.cc | 6 + .../src/G4ParticleHPNTInelasticFS.cc | 6 + .../src/G4ParticleHPNXInelasticFS.cc | 6 + .../src/G4ParticleHPPAInelasticFS.cc | 6 + .../src/G4ParticleHPPDInelasticFS.cc | 6 + .../src/G4ParticleHPPInelasticFS.cc | 6 + .../src/G4ParticleHPPTInelasticFS.cc | 6 + .../src/G4ParticleHPT2AInelasticFS.cc | 6 + .../src/G4ParticleHPTInelasticFS.cc | 6 + .../src/G4ParticleHPThermalScattering.cc | 548 +- .../src/G4ParticleHPThermalScatteringNames.cc | 84 +- .../src/G4WendtFissionFragmentGenerator.cc | 7 +- .../models/parton_string/diffraction/History | 18 +- .../diffraction/include/G4FTFModel.hh | 62 +- .../diffraction/include/G4FTFParameters.hh | 3 - .../diffraction/include/G4FTFParticipants.hh | 50 + .../diffraction/src/G4FTFModel.cc | 231 +- .../diffraction/src/G4FTFParameters.cc | 46 +- .../diffraction/src/G4FTFParticipants.cc | 65 +- .../models/parton_string/management/History | 6 +- .../management/include/G4VParticipants.hh | 3 +- .../management/src/G4VParticipants.cc | 5 +- .../management/src/G4VPartonStringModel.cc | 55 +- .../models/parton_string/qgsm/History | 4 + .../qgsm/src/G4QGSParticipants.cc | 58 +- .../hadronic/models/pre_equilibrium/History | 18 + .../include/G4LowEGammaNuclearModel.hh | 1 + .../include/G4LowEIonFragmentation.hh | 34 +- .../include/G4PreCompoundAlpha.hh | 23 +- .../include/G4PreCompoundDeuteron.hh | 33 +- .../include/G4PreCompoundEmission.hh | 2 + .../include/G4PreCompoundEmissionFactory.hh | 16 +- .../include/G4PreCompoundFragment.hh | 41 +- .../exciton_model/include/G4PreCompoundHe3.hh | 23 +- .../exciton_model/include/G4PreCompoundIon.hh | 26 +- .../include/G4PreCompoundModel.hh | 59 +- .../include/G4PreCompoundNeutron.hh | 21 +- .../include/G4PreCompoundNucleon.hh | 26 +- .../include/G4PreCompoundProton.hh | 21 +- .../include/G4PreCompoundTransitions.hh | 15 +- .../include/G4PreCompoundTriton.hh | 22 +- .../include/G4VPreCompoundEmissionFactory.hh | 26 +- .../include/G4VPreCompoundFragment.hh | 16 +- .../include/G4VPreCompoundTransitions.hh | 12 +- .../src/G4LowEGammaNuclearModel.cc | 8 +- .../src/G4LowEIonFragmentation.cc | 68 +- .../exciton_model/src/G4PreCompoundAlpha.cc | 11 +- .../src/G4PreCompoundDeuteron.cc | 6 +- .../src/G4PreCompoundEmission.cc | 14 +- .../src/G4PreCompoundEmissionFactory.cc | 1 - .../src/G4PreCompoundFragment.cc | 22 +- .../exciton_model/src/G4PreCompoundHe3.cc | 8 +- .../exciton_model/src/G4PreCompoundIon.cc | 2 +- .../exciton_model/src/G4PreCompoundModel.cc | 112 +- .../exciton_model/src/G4PreCompoundNucleon.cc | 2 +- .../src/G4PreCompoundTransitions.cc | 4 +- .../exciton_model/src/G4PreCompoundTriton.cc | 9 +- .../src/G4VPreCompoundEmissionFactory.cc | 9 +- source/processes/hadronic/models/qmd/History | 13 + .../models/qmd/include/G4QMDReaction.hh | 1 + .../hadronic/models/qmd/src/G4QMDNucleus.cc | 6 +- .../hadronic/models/qmd/src/G4QMDReaction.cc | 8 +- .../hadronic/models/quasi_elastic/History | 4 + .../quasi_elastic/src/G4QuasiElRatios.cc | 4 +- .../hadronic/models/radioactive_decay/History | 41 + .../models/radioactive_decay/README_RDM | 38 - .../include/G4Radioactivation.hh | 4 +- ...tiveDecayBase.hh => G4RadioactiveDecay.hh} | 21 +- ...nger.hh => G4RadioactiveDecayMessenger.hh} | 18 +- .../include/G4RadioactiveDecayMode.hh | 13 +- .../models/radioactive_decay/sources.cmake | 8 +- .../src/G4Radioactivation.cc | 69 +- ...tiveDecayBase.cc => G4RadioactiveDecay.cc} | 250 +- ...nger.cc => G4RadioactiveDecayMessenger.cc} | 12 +- .../hadronic/models/theo_high_energy/History | 5 + .../include/G4CRCoalescence.hh | 4 +- .../include/G4QuasiElasticChannel.hh | 1 + .../include/G4TheoFSGenerator.hh | 1 + .../theo_high_energy/src/G4CRCoalescence.cc | 7 +- .../src/G4QuasiElasticChannel.cc | 9 +- .../theo_high_energy/src/G4TheoFSGenerator.cc | 12 +- source/processes/hadronic/processes/History | 5 + .../processes/src/G4HadronElasticProcess.cc | 5 + source/processes/hadronic/stopping/History | 10 + .../stopping/include/G4ElementSelector.hh | 2 +- .../stopping/src/G4ElementSelector.cc | 8 +- .../stopping/src/G4HadronStoppingProcess.cc | 16 +- .../stopping/src/G4MuonicAtomDecay.cc | 2 +- source/processes/hadronic/util/History | 35 + .../hadronic/util/include/G4Fancy3DNucleus.hh | 17 +- .../hadronic/util/include/G4Fragment.hh | 44 +- .../hadronic/util/include/G4HadSecondary.hh | 4 +- .../util/include/G4HadronicParameters.hh | 10 + .../hadronic/util/include/G4KineticTrack.hh | 15 + .../hadronic/util/include/G4Nucleon.hh | 18 +- .../hadronic/util/include/G4Nucleus.hh | 36 +- .../util/include/G4ReactionProduct.hh | 4 +- .../hadronic/util/include/G4V3DNucleus.hh | 3 +- .../hadronic/util/src/G4DecayKineticTracks.cc | 8 +- .../util/src/G4DecayStrongResonances.cc | 1 + .../hadronic/util/src/G4Fancy3DNucleus.cc | 60 +- .../processes/hadronic/util/src/G4Fragment.cc | 38 +- .../hadronic/util/src/G4HadronicParameters.cc | 7 +- .../hadronic/util/src/G4KineticTrack.cc | 26 +- .../processes/hadronic/util/src/G4Nucleus.cc | 593 +- .../hadronic/util/src/G4SampleResonance.cc | 46 +- source/processes/management/History | 12 + .../management/include/G4NoProcess.hh | 85 + source/processes/management/sources.cmake | 1 + .../management/src/G4ProcessTableMessenger.cc | 4 +- source/processes/optical/History | 14 + .../optical/include/G4OpAbsorption.hh | 2 + .../optical/include/G4OpBoundaryProcess.hh | 137 +- source/processes/optical/include/G4OpMieHG.hh | 2 + .../processes/optical/include/G4OpRayleigh.hh | 2 + source/processes/optical/include/G4OpWLS.hh | 2 + source/processes/optical/include/G4OpWLS2.hh | 2 + .../processes/optical/src/G4OpAbsorption.cc | 7 + .../optical/src/G4OpBoundaryProcess.cc | 1021 +- source/processes/optical/src/G4OpMieHG.cc | 7 + source/processes/optical/src/G4OpRayleigh.cc | 7 + source/processes/optical/src/G4OpWLS.cc | 8 + source/processes/optical/src/G4OpWLS2.cc | 8 + source/processes/scoring/History | 4 + .../scoring/src/G4ParallelWorldProcess.cc | 3 +- .../processes/solidstate/channeling/History | 5 + .../solidstate/channeling/src/G4Channeling.cc | 13 +- .../src/G4ChannelingOptrChangeCrossSection.cc | 6 +- source/processes/solidstate/phonon/README | 38 - .../solidstate/phonon/src/G4LatticeReader.cc | 10 +- source/processes/transportation/History | 6 + .../include/G4TransportationProcessType.hh | 3 +- source/readout/History | 3 + source/readout/src/G4DCtable.cc | 2 +- source/run/GNUmakefile | 2 + source/run/History | 25 + source/run/README.TXT | 131 - source/run/include/G4RunManager.hh | 2 +- source/run/include/G4VUserPhysicsList.hh | 9 +- source/run/sources.cmake | 2 + source/run/src/G4AdjointSimManager.cc | 2 +- source/run/src/G4PhysicsListHelper.cc | 264 +- source/run/src/G4RunManager.cc | 2 +- source/run/src/G4RunMessenger.cc | 2 +- .../src/G4UserWorkerThreadInitialization.cc | 6 +- source/run/src/G4VModularPhysicsList.cc | 22 +- source/run/src/G4VUserPhysicsList.cc | 68 +- source/tasking/History | 4 + source/tasking/README.md | 226 - .../src/G4UserTaskThreadInitialization.cc | 4 +- source/track/History | 12 + source/track/include/G4Step.icc | 74 +- source/track/include/G4Track.hh | 23 +- source/track/include/G4Track.icc | 21 +- source/track/src/G4ParticleChangeForGamma.cc | 1 + source/track/src/G4ParticleChangeForLoss.cc | 1 + source/track/src/G4ParticleChangeForMSC.cc | 2 + .../track/src/G4ParticleChangeForTransport.cc | 2 + source/track/src/G4Track.cc | 30 +- source/track/src/G4VParticleChange.cc | 2 +- source/tracking/History | 36 +- source/tracking/include/G4SteppingManager.hh | 5 + source/tracking/include/G4VTrackingManager.hh | 71 + source/tracking/sources.cmake | 1 + .../tracking/src/G4AdjointTrackingAction.cc | 4 +- source/tracking/src/G4RichTrajectory.cc | 3 +- source/tracking/src/G4SteppingManager.cc | 2 + source/tracking/src/G4SteppingManager2.cc | 184 +- source/tracking/src/G4SteppingVerbose.cc | 8 +- .../src/G4SteppingVerboseWithUnits.cc | 8 +- source/tracking/src/G4TrackingMessenger.cc | 2 +- source/visualization/CMakeLists.txt | 5 + source/visualization/FukuiRenderer/History | 3 + source/visualization/FukuiRenderer/README | 30 - .../FukuiRenderer/include/G4DAWNFILE.hh | 28 +- .../include/G4DAWNFILESceneHandler.hh | 258 +- .../FukuiRenderer/include/G4DAWNFILEViewer.hh | 58 +- .../FukuiRenderer/include/G4FRClientServer.hh | 141 - .../FukuiRenderer/include/G4FRConst.hh | 254 +- .../FukuiRenderer/include/G4FRFeatures.hh | 58 - .../FukuiRenderer/include/G4FRSceneFunc.icc | 2454 +- .../FukuiRenderer/include/G4FRofstream.hh | 128 +- .../FukuiRenderer/include/G4FukuiRenderer.hh | 82 - .../include/G4FukuiRendererSceneHandler.hh | 238 - .../include/G4VisFeaturesOfDAWNFILE.hh | 2 +- .../include/G4VisFeaturesOfFukuiRenderer.hh | 37 - .../visualization/FukuiRenderer/sources.cmake | 52 +- .../FukuiRenderer/src/G4DAWNFILE.cc | 41 +- .../src/G4DAWNFILESceneHandler.cc | 355 +- .../FukuiRenderer/src/G4DAWNFILEViewer.cc | 530 +- .../FukuiRenderer/src/G4FRClientServer.cc | 319 - .../FukuiRenderer/src/G4FukuiRenderer.cc | 271 - .../src/G4FukuiRendererSceneHandler.cc | 214 - .../src/G4FukuiRendererViewer.cc | 311 - .../src/G4VisFeaturesOfDAWNFILE.cc | 2 + .../src/G4VisFeaturesOfFukuiRenderer.cc | 44 - source/visualization/GNUmakefile | 4 +- source/visualization/HepRep/History | 11 + source/visualization/HepRep/README | 152 - .../HepRep/include/G4HepRepFile.hh | 11 +- .../include/G4HepRepFileSceneHandler.hh | 43 +- .../HepRep/include/G4HepRepFileViewer.hh | 13 +- .../HepRep/include/G4HepRepFileXMLWriter.hh | 30 +- .../HepRep/include/G4HepRepMessenger.hh | 122 +- .../HepRep/include/G4HepRepSceneHandler.hh | 225 - .../HepRep/include/HEPREP/HasHepRep.h | 34 - .../HepRep/include/HEPREP/HepRep.h | 210 - .../HepRep/include/HEPREP/HepRepAction.h | 49 - .../HepRep/include/HEPREP/HepRepAttDef.h | 70 - .../HepRep/include/HEPREP/HepRepAttValue.h | 129 - .../HepRep/include/HEPREP/HepRepAttribute.h | 153 - .../include/HEPREP/HepRepAttributeListener.h | 103 - .../HepRep/include/HEPREP/HepRepConstants.h | 36 - .../HepRep/include/HEPREP/HepRepDefinition.h | 74 - .../HepRep/include/HEPREP/HepRepFactory.h | 148 - .../include/HEPREP/HepRepFrameListener.h | 34 - .../HepRep/include/HEPREP/HepRepInstance.h | 138 - .../include/HEPREP/HepRepInstanceTree.h | 92 - .../HepRep/include/HEPREP/HepRepIterator.h | 87 - .../HepRep/include/HEPREP/HepRepPoint.h | 168 - .../HepRep/include/HEPREP/HepRepReader.h | 124 - .../include/HEPREP/HepRepSelectFilter.h | 36 - .../HepRep/include/HEPREP/HepRepTreeID.h | 64 - .../HepRep/include/HEPREP/HepRepType.h | 109 - .../HepRep/include/HEPREP/HepRepTypeTree.h | 66 - .../HepRep/include/HEPREP/HepRepViewer.h | 34 - .../HepRep/include/HEPREP/HepRepWriter.h | 163 - .../HepRep/include/HEPREP/Types.h | 36 - .../include/HEPREP/freehep-heprep.version | 1 - source/visualization/HepRep/include/README | 23 - .../include/cheprep/AbstractXMLWriter.h | 47 - .../HepRep/include/cheprep/BHepRepWriter.h | 130 - .../HepRep/include/cheprep/DefaultHepRep.h | 62 - .../include/cheprep/DefaultHepRepAction.h | 34 - .../include/cheprep/DefaultHepRepAttDef.h | 36 - .../include/cheprep/DefaultHepRepAttValue.h | 75 - .../include/cheprep/DefaultHepRepAttribute.h | 50 - .../include/cheprep/DefaultHepRepDefinition.h | 42 - .../include/cheprep/DefaultHepRepFactory.h | 54 - .../include/cheprep/DefaultHepRepInstance.h | 58 - .../cheprep/DefaultHepRepInstanceTree.h | 49 - .../include/cheprep/DefaultHepRepPoint.h | 61 - .../include/cheprep/DefaultHepRepTreeID.h | 36 - .../include/cheprep/DefaultHepRepType.h | 55 - .../include/cheprep/DefaultHepRepTypeTree.h | 42 - .../cheprep/DeflateOutputStreamBuffer.h | 98 - .../HepRep/include/cheprep/GZIPOutputStream.h | 33 - .../include/cheprep/GZIPOutputStreamBuffer.h | 41 - .../include/cheprep/IndentPrintWriter.h | 54 - .../HepRep/include/cheprep/XMLHepRepFactory.h | 32 - .../HepRep/include/cheprep/XMLHepRepWriter.h | 72 - .../HepRep/include/cheprep/XMLWriter.h | 80 - .../HepRep/include/cheprep/ZipEntry.h | 36 - .../HepRep/include/cheprep/ZipOutputStream.h | 39 - .../include/cheprep/ZipOutputStreamBuffer.h | 57 - .../HepRep/include/cheprep/config.h | 62 - .../include/cheprep/freehep-cheprep.version | 1 - source/visualization/HepRep/sources.cmake | 36 +- .../visualization/HepRep/src/BHepRepWriter.cc | 544 - .../visualization/HepRep/src/DefaultHepRep.cc | 102 - .../HepRep/src/DefaultHepRepAction.cc | 35 - .../HepRep/src/DefaultHepRepAttDef.cc | 51 - .../HepRep/src/DefaultHepRepAttValue.cc | 271 - .../HepRep/src/DefaultHepRepAttribute.cc | 95 - .../HepRep/src/DefaultHepRepDefinition.cc | 52 - .../HepRep/src/DefaultHepRepFactory.cc | 89 - .../HepRep/src/DefaultHepRepInstance.cc | 87 - .../HepRep/src/DefaultHepRepInstanceTree.cc | 58 - .../HepRep/src/DefaultHepRepPoint.cc | 123 - .../HepRep/src/DefaultHepRepTreeID.cc | 38 - .../HepRep/src/DefaultHepRepType.cc | 112 - .../HepRep/src/DefaultHepRepTypeTree.cc | 45 - .../HepRep/src/DeflateOutputStreamBuffer.cc | 244 - source/visualization/HepRep/src/G4HepRep.cc | 87 - .../visualization/HepRep/src/G4HepRepFile.cc | 58 +- .../HepRep/src/G4HepRepFileSceneHandler.cc | 2924 +- .../HepRep/src/G4HepRepFileViewer.cc | 36 +- .../HepRep/src/G4HepRepFileXMLWriter.cc | 286 +- .../HepRep/src/G4HepRepMessenger.cc | 498 +- .../HepRep/src/G4HepRepSceneHandler.cc | 1761 - .../HepRep/src/G4HepRepViewer.cc | 130 - .../HepRep/src/GZIPOutputStream.cc | 38 - .../HepRep/src/GZIPOutputStreamBuffer.cc | 77 - .../HepRep/src/IndentPrintWriter.cc | 88 - source/visualization/HepRep/src/README | 25 - .../HepRep/src/XMLHepRepFactory.cc | 39 - .../HepRep/src/XMLHepRepWriter.cc | 288 - source/visualization/HepRep/src/XMLWriter.cc | 285 - .../HepRep/src/ZipOutputStream.cc | 43 - .../HepRep/src/ZipOutputStreamBuffer.cc | 143 - source/visualization/History | 261 +- source/visualization/OpenGL/GNUmakefile | 74 + source/visualization/OpenGL/History | 117 + .../visualization/OpenGL/include/G4OpenGL.hh | 3 - .../include/G4OpenGLImmediateQtViewer.hh | 4 - .../include/G4OpenGLImmediateSceneHandler.hh | 6 +- .../OpenGL/include/G4OpenGLImmediateViewer.hh | 4 - .../include/G4OpenGLImmediateWin32Viewer.hh | 4 - .../include/G4OpenGLImmediateXViewer.hh | 4 - .../include/G4OpenGLImmediateXmViewer.hh | 4 - .../OpenGL/include/G4OpenGLQtExportDialog.hh | 4 - .../OpenGL/include/G4OpenGLQtMovieDialog.hh | 4 - .../OpenGL/include/G4OpenGLQtViewer.hh | 4 - .../OpenGL/include/G4OpenGLSceneHandler.hh | 6 +- .../include/G4OpenGLStoredQtSceneHandler.hh | 4 - .../OpenGL/include/G4OpenGLStoredQtViewer.hh | 4 - .../include/G4OpenGLStoredSceneHandler.hh | 6 +- .../OpenGL/include/G4OpenGLStoredViewer.hh | 4 - .../include/G4OpenGLStoredWin32Viewer.hh | 4 - .../OpenGL/include/G4OpenGLStoredXViewer.hh | 5 - .../OpenGL/include/G4OpenGLStoredXmViewer.hh | 4 - .../OpenGL/include/G4OpenGLTransform3D.hh | 4 - .../OpenGL/include/G4OpenGLViewer.hh | 9 +- .../OpenGL/include/G4OpenGLViewerMessenger.hh | 1 - .../OpenGL/include/G4OpenGLWin32Viewer.hh | 4 - .../OpenGL/include/G4OpenGLXViewer.hh | 4 - .../OpenGL/include/G4OpenGLXmBox.hh | 4 - .../include/G4OpenGLXmFourArrowButtons.hh | 4 - .../OpenGL/include/G4OpenGLXmFramedBox.hh | 4 - .../OpenGL/include/G4OpenGLXmPushButton.hh | 4 - .../OpenGL/include/G4OpenGLXmRadioButton.hh | 4 - .../OpenGL/include/G4OpenGLXmResources.hh | 4 - .../OpenGL/include/G4OpenGLXmSeparator.hh | 4 - .../OpenGL/include/G4OpenGLXmSliderBar.hh | 4 - .../OpenGL/include/G4OpenGLXmTextField.hh | 4 - .../OpenGL/include/G4OpenGLXmTopLevelShell.hh | 4 - .../include/G4OpenGLXmVWidgetComponent.hh | 4 - .../include/G4OpenGLXmVWidgetContainer.hh | 4 - .../OpenGL/include/G4OpenGLXmVWidgetObject.hh | 4 - .../OpenGL/include/G4OpenGLXmVWidgetShell.hh | 4 - .../OpenGL/include/G4OpenGLXmViewer.hh | 4 - .../include/G4OpenGLXmViewerMessenger.hh | 5 - source/visualization/OpenGL/sources.cmake | 16 +- .../OpenGL/src/G4OpenGLImmediateQt.cc | 4 - .../OpenGL/src/G4OpenGLImmediateQtViewer.cc | 6 +- .../src/G4OpenGLImmediateSceneHandler.cc | 13 - .../OpenGL/src/G4OpenGLImmediateViewer.cc | 4 - .../OpenGL/src/G4OpenGLImmediateWin32.cc | 4 - .../src/G4OpenGLImmediateWin32Viewer.cc | 4 - .../OpenGL/src/G4OpenGLImmediateX.cc | 4 - .../OpenGL/src/G4OpenGLImmediateXViewer.cc | 10 +- .../OpenGL/src/G4OpenGLImmediateXm.cc | 4 - .../OpenGL/src/G4OpenGLImmediateXmViewer.cc | 10 +- source/visualization/OpenGL/src/G4OpenGLQt.cc | 4 - .../OpenGL/src/G4OpenGLQtExportDialog.cc | 5 - .../OpenGL/src/G4OpenGLQtMovieDialog.cc | 4 - .../OpenGL/src/G4OpenGLQtViewer.cc | 48 +- .../OpenGL/src/G4OpenGLSceneHandler.cc | 60 +- .../OpenGL/src/G4OpenGLStoredQt.cc | 4 - .../src/G4OpenGLStoredQtSceneHandler.cc | 4 - .../OpenGL/src/G4OpenGLStoredQtViewer.cc | 20 +- .../OpenGL/src/G4OpenGLStoredSceneHandler.cc | 13 +- .../OpenGL/src/G4OpenGLStoredViewer.cc | 18 +- .../OpenGL/src/G4OpenGLStoredWin32.cc | 5 - .../OpenGL/src/G4OpenGLStoredWin32Viewer.cc | 4 - .../OpenGL/src/G4OpenGLStoredX.cc | 5 - .../OpenGL/src/G4OpenGLStoredXViewer.cc | 11 +- .../OpenGL/src/G4OpenGLStoredXm.cc | 4 - .../OpenGL/src/G4OpenGLStoredXmViewer.cc | 13 +- .../OpenGL/src/G4OpenGLTransform3D.cc | 4 - .../OpenGL/src/G4OpenGLViewer.cc | 75 +- .../OpenGL/src/G4OpenGLViewerMessenger.cc | 27 +- .../OpenGL/src/G4OpenGLWin32Viewer.cc | 3 - .../OpenGL/src/G4OpenGLXViewer.cc | 12 +- source/visualization/OpenGL/src/G4OpenGLXm.cc | 4 - .../visualization/OpenGL/src/G4OpenGLXmBox.cc | 4 - .../src/G4OpenGLXmConvenienceRoutines.cc | 13 +- .../OpenGL/src/G4OpenGLXmFourArrowButtons.cc | 4 - .../OpenGL/src/G4OpenGLXmFramedBox.cc | 4 - .../src/G4OpenGLXmMainMenubarCallbacks.cc | 4 - .../OpenGL/src/G4OpenGLXmPanningCallbacks.cc | 6 - .../OpenGL/src/G4OpenGLXmPushButton.cc | 6 - .../OpenGL/src/G4OpenGLXmRadioButton.cc | 4 - .../OpenGL/src/G4OpenGLXmRotationCallbacks.cc | 3 - .../OpenGL/src/G4OpenGLXmSeparator.cc | 4 - .../OpenGL/src/G4OpenGLXmSliderBar.cc | 4 - .../OpenGL/src/G4OpenGLXmStyleCallbacks.cc | 5 - .../OpenGL/src/G4OpenGLXmTextField.cc | 4 - .../OpenGL/src/G4OpenGLXmTopLevelShell.cc | 4 - .../OpenGL/src/G4OpenGLXmVWidgetComponent.cc | 4 - .../OpenGL/src/G4OpenGLXmVWidgetContainer.cc | 4 - .../OpenGL/src/G4OpenGLXmVWidgetObject.cc | 4 - .../OpenGL/src/G4OpenGLXmVWidgetShell.cc | 4 - .../OpenGL/src/G4OpenGLXmViewer.cc | 9 +- .../OpenGL/src/G4OpenGLXmViewerMessenger.cc | 4 - .../src/G4OpenGLXmWindowHandlingCallbacks.cc | 6 +- source/visualization/OpenInventor/GNUmakefile | 48 + source/visualization/OpenInventor/History | 7 + .../OpenInventor/README.OIXExtendedViewer | 186 - .../OpenInventor/include/G4OpenInventorQt.hh | 4 - .../include/G4OpenInventorQtExaminerViewer.hh | 5 - .../include/G4OpenInventorQtViewer.hh | 4 - .../include/G4OpenInventorSceneHandler.hh | 4 - .../include/G4OpenInventorTransform3D.hh | 4 - .../include/G4OpenInventorViewer.hh | 4 - .../include/G4OpenInventorWinViewer.hh | 4 - ...G4OpenInventorXtExaminerViewerMessenger.hh | 4 - .../include/G4OpenInventorXtExtendedViewer.hh | 4 - .../include/G4OpenInventorXtViewer.hh | 4 - .../OpenInventor/include/G4SoQt.hh | 4 - .../OpenInventor/include/HEPVis/SbGL.h | 2 + .../visualization/OpenInventor/sources.cmake | 12 - .../OpenInventor/src/G4OpenInventor.cc | 4 - .../OpenInventor/src/G4OpenInventorQt.cc | 4 - .../src/G4OpenInventorQtExaminerViewer.cc | 12 - .../src/G4OpenInventorQtViewer.cc | 5 - .../src/G4OpenInventorSceneHandler.cc | 2 - .../src/G4OpenInventorTransform3D.cc | 4 - .../OpenInventor/src/G4OpenInventorViewer.cc | 4 - .../OpenInventor/src/G4OpenInventorWin.cc | 5 - .../src/G4OpenInventorWinViewer.cc | 4 - .../OpenInventor/src/G4OpenInventorXt.cc | 5 - .../src/G4OpenInventorXtExaminerViewer.cc | 4 - ...G4OpenInventorXtExaminerViewerMessenger.cc | 4 - .../src/G4OpenInventorXtExtended.cc | 5 - .../src/G4OpenInventorXtExtendedViewer.cc | 4 - .../src/G4OpenInventorXtViewer.cc | 4 - .../visualization/OpenInventor/src/G4SoQt.cc | 4 - .../OpenInventor/src/SbPainter.cc | 3 - .../OpenInventor/src/SbPainterPS.cc | 4 - .../OpenInventor/src/SoAlternateRepAction.cc | 4 - .../visualization/OpenInventor/src/SoBox.cc | 4 - .../visualization/OpenInventor/src/SoCons.cc | 4 - .../OpenInventor/src/SoCounterAction.cc | 3 - .../OpenInventor/src/SoDetectorTreeKit.cc | 4 - .../OpenInventor/src/SoGL2PSAction.cc | 3 - .../OpenInventor/src/SoImageWriter.cc | 3 - .../OpenInventor/src/SoMarkerSet.cc | 3 - .../OpenInventor/src/SoPolyhedron.cc | 4 - .../OpenInventor/src/SoStyleCache.cc | 4 - .../visualization/OpenInventor/src/SoTrap.cc | 4 - .../visualization/OpenInventor/src/SoTrd.cc | 4 - .../visualization/OpenInventor/src/SoTubs.cc | 4 - .../OpenInventor/src/wheelmouse.cc | 4 - source/visualization/Qt3D/GNUmakefile | 1 + source/visualization/Qt3D/History | 31 + source/visualization/Qt3D/include/G4Qt3D.hh | 4 - .../Qt3D/include/G4Qt3DQEntity.hh | 4 - .../Qt3D/include/G4Qt3DSceneHandler.hh | 6 +- .../visualization/Qt3D/include/G4Qt3DUtils.hh | 4 - .../Qt3D/include/G4Qt3DViewer.hh | 6 +- source/visualization/Qt3D/sources.cmake | 3 +- source/visualization/Qt3D/src/G4Qt3D.cc | 4 - .../Qt3D/src/G4Qt3DSceneHandler.cc | 221 +- source/visualization/Qt3D/src/G4Qt3DUtils.cc | 10 +- source/visualization/Qt3D/src/G4Qt3DViewer.cc | 107 +- source/visualization/RayTracer/GNUmakefile | 25 + source/visualization/RayTracer/History | 40 + source/visualization/RayTracer/README | 82 - .../RayTracer/include/G4RTXScanner.hh | 4 - .../include/G4RayTracerSceneHandler.hh | 2 +- .../RayTracer/include/G4RayTracerX.hh | 3 - .../RayTracer/include/G4RayTracerXViewer.hh | 4 - .../RayTracer/include/G4TheMTRayTracer.hh | 4 + .../RayTracer/include/G4TheRayTracer.hh | 4 +- source/visualization/RayTracer/sources.cmake | 4 - .../RayTracer/src/G4RTXScanner.cc | 4 - .../RayTracer/src/G4RayTracer.cc | 15 +- .../RayTracer/src/G4RayTracerViewer.cc | 13 +- .../RayTracer/src/G4RayTracerX.cc | 4 - .../RayTracer/src/G4RayTracerXViewer.cc | 7 +- .../RayTracer/src/G4TheMTRayTracer.cc | 17 + .../RayTracer/src/G4TheRayTracer.cc | 3 + source/visualization/ToolsSG/GNUmakefile | 12 +- source/visualization/ToolsSG/History | 110 +- .../ToolsSG/include/G4ToolsSGNode.hh | 4 - .../ToolsSG/include/G4ToolsSGQtGLES.hh | 4 - .../ToolsSG/include/G4ToolsSGQtViewer.hh | 87 +- .../ToolsSG/include/G4ToolsSGSceneHandler.hh | 93 +- .../ToolsSG/include/G4ToolsSGViewer.hh | 190 +- .../ToolsSG/include/G4ToolsSGWindowsGLES.hh | 4 - .../ToolsSG/include/G4ToolsSGX11GLES.hh | 4 - .../ToolsSG/include/G4ToolsSGXtGLES.hh | 4 - source/visualization/ToolsSG/sources.cmake | 17 +- .../ToolsSG/src/G4ToolsSGQtGLES.cc | 4 - .../ToolsSG/src/G4ToolsSGQtViewer.cc | 4 + .../ToolsSG/src/G4ToolsSGSceneHandler.cc | 612 +- .../ToolsSG/src/G4ToolsSGWindowsGLES.cc | 3 - .../ToolsSG/src/G4ToolsSGX11GLES.cc | 4 - .../ToolsSG/src/G4ToolsSGXtGLES.cc | 4 - source/visualization/Tree/History | 15 + .../Tree/include/G4VTreeSceneHandler.hh | 2 +- .../Tree/src/G4ASCIITreeSceneHandler.cc | 4 +- source/visualization/VRML/History | 9 + source/visualization/VRML/g4vrmlview/Makefile | 20 - source/visualization/VRML/g4vrmlview/README | 222 - .../visualization/VRML/g4vrmlview/g4mini.java | 81 - .../VRML/g4vrmlview/g4vrmlview.java | 245 - .../visualization/VRML/g4vrmlview/sample.wrl | 700 - .../visualization/VRML/include/G4FRClient.hh | 71 - source/visualization/VRML/include/G4VRML1.hh | 68 - .../VRML/include/G4VRML1FileSceneHandler.hh | 121 - .../VRML/include/G4VRML1SceneHandler.hh | 118 - source/visualization/VRML/include/G4VRML2.hh | 67 - .../visualization/VRML/include/G4VRML2File.hh | 16 +- .../VRML/include/G4VRML2FileSceneHandler.hh | 125 +- .../VRML/include/G4VRML2FileViewer.hh | 36 +- .../VRML/include/G4VRML2SceneHandler.hh | 127 - .../VRML/include/G4VRML2Viewer.hh | 67 - .../VRML/include/G4VRMLNetConfig.hh | 44 - source/visualization/VRML/sources.cmake | 56 +- source/visualization/VRML/src/FRClient.cc | 158 - source/visualization/VRML/src/G4FRClient.cc | 123 - .../VRML/src/G4VRML1FileSceneHandler.cc | 227 - .../VRML/src/G4VRML1FileViewer.cc | 105 - .../VRML/src/G4VRML1SceneHandler.cc | 142 - .../VRML/src/G4VRML1SceneHandlerFunc.icc | 747 - .../visualization/VRML/src/G4VRML1Viewer.cc | 104 - source/visualization/VRML/src/G4VRML2File.cc | 47 +- .../VRML/src/G4VRML2FileSceneHandler.cc | 322 +- .../VRML/src/G4VRML2FileViewer.cc | 122 +- .../VRML/src/G4VRML2SceneHandler.cc | 155 - .../VRML/src/G4VRML2SceneHandlerFunc.icc | 1129 +- .../visualization/VRML/src/G4VRML2Viewer.cc | 158 - source/visualization/Vtk/CMakeLists.txt | 4 + .../visualization/Vtk}/History | 24 +- .../G4VRML1File.hh => Vtk/include/G4Vtk.hh} | 25 +- .../include/G4VtkMessenger.hh} | 48 +- .../Vtk/include/G4VtkQt.hh} | 27 +- .../include/G4VtkQtSceneHandler.hh} | 41 +- .../include/G4VtkQtViewer.hh} | 43 +- .../Vtk/include/G4VtkSceneHandler.hh | 171 + .../visualization/Vtk/include/G4VtkViewer.hh | 193 + .../Vtk/include/vtkTensorGlyphColor.h | 261 + source/visualization/Vtk/sources.cmake | 73 + .../visualization/Vtk/src/G4Vtk.cc | 63 +- .../visualization/Vtk/src/G4VtkMessenger.cc | 131 + source/visualization/Vtk/src/G4VtkQt.cc | 90 + .../Vtk/src/G4VtkQtSceneHandler.cc | 47 +- .../G4VRML1.cc => Vtk/src/G4VtkQtViewer.cc} | 108 +- .../Vtk/src/G4VtkSceneHandler.cc | 876 + source/visualization/Vtk/src/G4VtkViewer.cc | 399 + .../Vtk/src/vtkTensorGlyphColor.cxx | 565 + source/visualization/externals/History | 12 + source/visualization/externals/gl2ps/History | 7 + .../externals/gl2ps/include/gl2ps.h | 36 +- .../externals/gl2ps/sources.cmake | 13 +- .../externals/gl2ps/src/G4OpenGL2PSAction.cc | 14 - .../externals/gl2ps/src/gl2ps.cc | 236 +- source/visualization/gMocren/History | 2 + source/visualization/gMocren/README | 13 - .../gMocren/src/G4GMocrenFileSceneHandler.cc | 6 +- source/visualization/management/GNUmakefile | 3 +- source/visualization/management/History | 182 + .../management/include/G4PlotterManager.hh | 136 + .../management/include/G4VSceneHandler.hh | 30 +- .../management/include/G4VSceneHandler.icc | 10 +- .../management/include/G4VUserVisAction.hh | 5 +- .../management/include/G4VVisCommand.hh | 23 +- .../include/G4VisCommandModelCreate.hh | 2 +- .../include/G4VisCommandsPlotter.hh | 50 +- .../management/include/G4VisCommandsScene.hh | 13 + .../include/G4VisCommandsSceneAdd.hh | 64 +- .../management/include/G4VisExecutive.icc | 145 +- .../management/include/G4VisFilterManager.hh | 5 +- .../management/include/G4VisListManager.hh | 2 +- .../management/include/G4VisManager.hh | 3 - source/visualization/management/sources.cmake | 7 +- .../management/src/G4PlotterManager.cc | 144 + .../visualization/management/src/G4Scene.cc | 83 +- .../management/src/G4VSceneHandler.cc | 174 +- .../visualization/management/src/G4VViewer.cc | 24 +- .../management/src/G4VVisCommand.cc | 48 +- .../management/src/G4ViewParameters.cc | 15 +- .../management/src/G4VisCommands.cc | 4 +- .../management/src/G4VisCommandsCompound.cc | 40 +- .../src/G4VisCommandsGeometrySet.cc | 11 + .../management/src/G4VisCommandsPlotter.cc | 398 + .../management/src/G4VisCommandsScene.cc | 113 +- .../management/src/G4VisCommandsSceneAdd.cc | 353 +- .../src/G4VisCommandsSceneHandler.cc | 52 +- .../management/src/G4VisCommandsSet.cc | 2 +- .../management/src/G4VisCommandsTouchable.cc | 7 +- .../management/src/G4VisCommandsViewer.cc | 44 +- .../management/src/G4VisCommandsViewerSet.cc | 13 +- .../management/src/G4VisManager.cc | 73 +- source/visualization/modeling/History | 61 + source/visualization/modeling/README | 6 - .../modeling/include/G4ArrowModel.hh | 9 +- .../modeling/include/G4AttValueFilterT.hh | 10 +- .../modeling/include/G4AttributeFilterT.hh | 2 +- .../modeling/include/G4AxesModel.hh | 20 +- .../modeling/include/G4CallbackModel.hh | 2 +- .../modeling/include/G4DigiModel.hh | 2 +- .../modeling/include/G4PhysicalVolumeModel.hh | 14 +- .../include/G4PlotterModel.hh} | 35 +- .../modeling/include/G4PseudoScene.hh | 3 +- .../modeling/include/G4TextModel.hh | 5 +- .../modeling/include/G4VModel.hh | 24 +- .../modeling/include/G4VModel.icc | 4 - source/visualization/modeling/sources.cmake | 4 +- .../modeling/src/G4ArrowModel.cc | 33 +- .../visualization/modeling/src/G4AxesModel.cc | 95 +- .../visualization/modeling/src/G4NullModel.cc | 2 +- .../modeling/src/G4PhysicalVolumeModel.cc | 23 +- .../src/G4PhysicalVolumesSearchScene.cc | 2 +- .../{G4ScaleModel.cc => G4PlotterModel.cc} | 49 +- .../visualization/modeling/src/G4TextModel.cc | 8 +- .../src/G4TouchablePropertiesScene.cc | 2 +- .../src/G4TrajectoryDrawByAttribute.cc | 2 +- .../G4TrajectoryDrawByEncounteredVolume.cc | 2 +- .../G4TrajectoryEncounteredVolumeFilter.cc | 2 +- source/visualization/modeling/src/G4VModel.cc | 25 +- 3932 files changed, 202519 insertions(+), 246221 deletions(-) create mode 100644 ReleaseNotes/Patch4.10.7-3.txt create mode 100644 ReleaseNotes/ReleaseNotes.11.0.html delete mode 100644 cmake/Modules/FindAIDA.cmake create mode 100644 cmake/Modules/G4GitUtilities.cmake create mode 100644 cmake/Templates/source_package_extras.cmake.in delete mode 100644 environments/MOMO/000README delete mode 100644 environments/MOMO/History delete mode 100644 environments/MOMO/MOMO.jar delete mode 100644 environments/MOMO/PDG.xml delete mode 100644 environments/MOMO/ReleaseNote delete mode 100644 environments/MOMO/dicom.xml delete mode 100644 environments/MOMO/momo-src.jar delete mode 100644 environments/g4py/README.md delete mode 100644 environments/g4py/examples/README delete mode 100644 environments/g4py/examples/education/lesson1/README delete mode 100644 environments/g4py/examples/education/lesson2/README delete mode 100644 environments/g4py/source/visualization/pyG4HepRep.cc delete mode 100644 environments/g4py/source/visualization/pyG4VRML1File.cc delete mode 100644 environments/g4py/tests/CMakeLists.txt delete mode 100644 environments/g4py/tests/History delete mode 100644 environments/g4py/tests/README.md delete mode 100644 environments/g4py/tests/g4pytest/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/EMSTDpl/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/EMSTDpl/PhysicsListEMstd.cc delete mode 100644 environments/g4py/tests/g4pytest/EMSTDpl/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/ExN01geom/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/ExN01geom/ExN01DetectorConstruction.cc delete mode 100644 environments/g4py/tests/g4pytest/ExN01geom/ExN01DetectorConstruction.hh delete mode 100644 environments/g4py/tests/g4pytest/ExN01geom/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/ExN01geom/pyExN01geom.cc delete mode 100644 environments/g4py/tests/g4pytest/ExN01pl/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/ExN01pl/ExN01PhysicsList.cc delete mode 100644 environments/g4py/tests/g4pytest/ExN01pl/ExN01PhysicsList.hh delete mode 100644 environments/g4py/tests/g4pytest/ExN01pl/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/ExN01pl/pyExN01pl.cc delete mode 100644 environments/g4py/tests/g4pytest/ExN03geom/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorConstruction.cc delete mode 100644 environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorConstruction.hh delete mode 100644 environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorMessenger.cc delete mode 100644 environments/g4py/tests/g4pytest/ExN03geom/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/ExN03geom/pyExN03geom.cc delete mode 100644 environments/g4py/tests/g4pytest/MCScore/mcscore.py delete mode 100644 environments/g4py/tests/g4pytest/MCScore/mcscorerootio.py delete mode 100644 environments/g4py/tests/g4pytest/MCScore/reaction.dat delete mode 100644 environments/g4py/tests/g4pytest/MedicalBeam/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/MedicalBeam/MedicalBeam.cc delete mode 100644 environments/g4py/tests/g4pytest/MedicalBeam/MedicalBeam.hh delete mode 100644 environments/g4py/tests/g4pytest/MedicalBeam/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/MedicalBeam/pyMedicalBeam.cc delete mode 100644 environments/g4py/tests/g4pytest/NISTmaterials/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/NISTmaterials/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/NISTmaterials/pyNISTmaterials.cc delete mode 100644 environments/g4py/tests/g4pytest/ParticleGun/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/ParticleGun/ParticleGunAction.cc delete mode 100644 environments/g4py/tests/g4pytest/ParticleGun/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/ParticleGun/pyParticleGun.cc delete mode 100644 environments/g4py/tests/g4pytest/Qgeom/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/Qgeom/QDetectorConstruction.cc delete mode 100644 environments/g4py/tests/g4pytest/Qgeom/QDetectorConstruction.hh delete mode 100644 environments/g4py/tests/g4pytest/Qgeom/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/Qgeom/pyQgeom.cc delete mode 100644 environments/g4py/tests/g4pytest/Qmaterials/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/Qmaterials/Qmaterials.cc delete mode 100644 environments/g4py/tests/g4pytest/Qmaterials/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/Qmaterials/pyQmaterials.cc delete mode 100644 environments/g4py/tests/g4pytest/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/emcalculator/emcalculator.py delete mode 100644 environments/g4py/tests/g4pytest/ezgeom/CMakeLists.txt delete mode 100644 environments/g4py/tests/g4pytest/ezgeom/G4EzVolume.cc delete mode 100644 environments/g4py/tests/g4pytest/ezgeom/G4EzVolume.hh delete mode 100644 environments/g4py/tests/g4pytest/ezgeom/G4EzVoxelParameterization.cc delete mode 100644 environments/g4py/tests/g4pytest/ezgeom/G4EzWorld.cc delete mode 100644 environments/g4py/tests/g4pytest/ezgeom/G4EzWorld.hh delete mode 100644 environments/g4py/tests/g4pytest/ezgeom/__init__.py delete mode 100644 environments/g4py/tests/g4pytest/ezgeom/pyEzgeom.cc delete mode 100644 environments/g4py/tests/gtest01/CMakeLists.txt delete mode 100644 environments/g4py/tests/gtest01/gun.mac delete mode 100644 environments/g4py/tests/gtest01/module/CMakeLists.txt delete mode 100644 environments/g4py/tests/gtest01/module/PhysicsListEMstd.cc delete mode 100644 environments/g4py/tests/gtest01/module/PhysicsListEMstd.hh delete mode 100644 environments/g4py/tests/gtest01/module/QDetectorConstruction.cc delete mode 100644 environments/g4py/tests/gtest01/module/QDetectorConstruction.hh delete mode 100644 environments/g4py/tests/gtest01/module/QMaterials.cc delete mode 100644 environments/g4py/tests/gtest01/module/QPhysicsList.cc delete mode 100644 environments/g4py/tests/gtest01/module/QPhysicsList.hh delete mode 100644 environments/g4py/tests/gtest01/module/QPrimaryGeneratorAction.hh delete mode 100644 environments/g4py/tests/gtest01/module/gtest01.cc delete mode 100755 environments/g4py/tests/gtest01/root_test.py delete mode 100755 environments/g4py/tests/gtest01/run.py delete mode 100755 environments/g4py/tests/gtest01/test.py delete mode 100644 environments/g4py/tests/gtest01/vis.mac delete mode 100644 environments/g4py/tests/gtest01/vrml.mac delete mode 100644 environments/g4py/tests/gtest02/CMakeLists.txt delete mode 100644 environments/g4py/tests/gtest02/gun.mac delete mode 100755 environments/g4py/tests/gtest02/run.py delete mode 100755 environments/g4py/tests/gtest02/test.py delete mode 100644 environments/g4py/tests/gtest02/vis.mac delete mode 100644 environments/g4py/tests/gtest03/CMakeLists.txt delete mode 100644 environments/g4py/tests/gtest03/gun.mac delete mode 100755 environments/g4py/tests/gtest03/run.py delete mode 100755 environments/g4py/tests/gtest03/test.py delete mode 100755 environments/g4py/tests/gtest03/test_voxel.py delete mode 100644 environments/g4py/tests/gtest03/vis.mac delete mode 100644 environments/g4py/tests/gtest04/CMakeLists.txt delete mode 100755 environments/g4py/tests/gtest04/test.py delete mode 100644 environments/g4py/tests/gtest05/CMakeLists.txt delete mode 100755 environments/g4py/tests/gtest05/test.py delete mode 100644 environments/g4py/tests/gtest05/vrml/g4box.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4cons.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4ellipsoid.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4ellipticalcone.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4ellipticaltube.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4hype.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4orb.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4para.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4polycone.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4polyhedra.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4sphere.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4tet.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4torus.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4trap.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4trd.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4tubs.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4twistedbox.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4twistedtrap.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4twistedtrd.wrl delete mode 100644 environments/g4py/tests/gtest05/vrml/g4twistedtubs.wrl delete mode 100644 environments/g4py/tests/gtest06/CMakeLists.txt delete mode 100644 environments/g4py/tests/gtest06/jpg/intersection.jpg delete mode 100644 environments/g4py/tests/gtest06/jpg/subtraction.jpg delete mode 100644 environments/g4py/tests/gtest06/jpg/union.jpg delete mode 100755 environments/g4py/tests/gtest06/test.py delete mode 100644 environments/g4py/tests/gtest07/CMakeLists.txt delete mode 100755 environments/g4py/tests/gtest07/test.py delete mode 100644 environments/g4py/tests/gtest08/CMakeLists.txt delete mode 100755 environments/g4py/tests/gtest08/test.py delete mode 100644 environments/zmq/README.md delete mode 100644 examples/.README.HowToRun delete mode 100644 examples/.README.HowToRun.txt delete mode 100644 examples/.README.HowToRunMT delete mode 100644 examples/.README.HowToRunMT.txt delete mode 100644 examples/.doxygen/.README.HowToNavigate.txt delete mode 100644 examples/.doxygen/.README.novice.txt delete mode 100644 examples/.doxygen/README delete mode 100644 examples/README delete mode 100644 examples/README.HowToRun delete mode 100644 examples/README.HowToRunMT create mode 100644 examples/advanced/CaTS/CMakeLists.txt create mode 100644 examples/advanced/CaTS/CaTS.cc create mode 100644 examples/advanced/CaTS/Examples.md create mode 100644 examples/advanced/CaTS/History create mode 100644 examples/advanced/CaTS/Instructions.md create mode 100644 examples/advanced/CaTS/authors.txt create mode 100644 examples/advanced/CaTS/gdml/DiamondTarget.gdml create mode 100644 examples/advanced/CaTS/gdml/LArTPC.gdml create mode 100644 examples/advanced/CaTS/gdml/SimpleExtension.xsd create mode 100644 examples/advanced/CaTS/gdml/crystalcal_pbwo.gdml create mode 100644 examples/advanced/CaTS/gdml/homogeneous_pbwo_crystalcal.gdml create mode 100644 examples/advanced/CaTS/gdml/simpleLArTPC.gdml create mode 100644 examples/advanced/CaTS/images/CaTS.png create mode 100644 examples/advanced/CaTS/images/CaloHistos.png create mode 100644 examples/advanced/CaTS/images/display.png create mode 100644 examples/advanced/CaTS/images/mscHistos.png create mode 100644 examples/advanced/CaTS/images/position.png create mode 100644 examples/advanced/CaTS/include/ActionInitialization.hh create mode 100644 examples/advanced/CaTS/include/CaTSClasses.hh create mode 100644 examples/advanced/CaTS/include/CaTSVersion.hh create mode 100644 examples/advanced/CaTS/include/CalorimeterHit.hh create mode 100644 examples/advanced/CaTS/include/CalorimeterSD.hh rename environments/g4py/tests/g4pytest/ezgeom/EzDetectorConstruction.cc => examples/advanced/CaTS/include/ColorReader.hh (62%) create mode 100644 examples/advanced/CaTS/include/ConfigurationManager.hh create mode 100644 examples/advanced/CaTS/include/DRCalorimeterHit.hh create mode 100644 examples/advanced/CaTS/include/DRCalorimeterSD.hh create mode 100644 examples/advanced/CaTS/include/DetectorConstruction.hh create mode 100644 examples/advanced/CaTS/include/Event.hh rename environments/g4py/tests/gtest01/module/QEventAction.hh => examples/advanced/CaTS/include/EventAction.hh (64%) create mode 100644 examples/advanced/CaTS/include/InteractionHit.hh create mode 100644 examples/advanced/CaTS/include/InteractionSD.hh create mode 100644 examples/advanced/CaTS/include/MscHit.hh create mode 100644 examples/advanced/CaTS/include/MscSD.hh rename environments/g4py/tests/gtest01/module/Particles.hh => examples/advanced/CaTS/include/ParticleChange.hh (67%) create mode 100644 examples/advanced/CaTS/include/PhotonHit.hh create mode 100644 examples/advanced/CaTS/include/PhotonSD.hh rename environments/g4py/tests/g4pytest/EMSTDpl/PhysicsListEMstd.hh => examples/advanced/CaTS/include/PhysicsConfigurator.hh (68%) create mode 100644 examples/advanced/CaTS/include/PrimaryGeneratorAction.hh create mode 100644 examples/advanced/CaTS/include/RadiatorSD.hh rename environments/g4py/tests/g4pytest/ParticleGun/ParticleGunAction.hh => examples/advanced/CaTS/include/RootIO.hh (61%) create mode 100644 examples/advanced/CaTS/include/RunAction.hh create mode 100644 examples/advanced/CaTS/include/StackingAction.hh rename examples/advanced/{gorad/include/GRAnalysis.hh => CaTS/include/TrackInfo.hh} (78%) create mode 100644 examples/advanced/CaTS/include/TrackerHit.hh create mode 100644 examples/advanced/CaTS/include/TrackerSD.hh create mode 100644 examples/advanced/CaTS/include/lArTPCHit.hh create mode 100644 examples/advanced/CaTS/include/lArTPCSD.hh rename examples/{extended/analysis/AnaEx03 => advanced/CaTS/macros}/init_vis.mac (77%) create mode 100644 examples/advanced/CaTS/macros/msc.mac create mode 100644 examples/advanced/CaTS/macros/pip_IO_Calo.mac create mode 100644 examples/advanced/CaTS/macros/pip_IO_DR.mac create mode 100644 examples/advanced/CaTS/macros/test_G4.mac create mode 100644 examples/advanced/CaTS/macros/time.mac create mode 100644 examples/advanced/CaTS/macros/time_G4.mac create mode 100644 examples/advanced/CaTS/macros/vis.mac create mode 100644 examples/advanced/CaTS/modules/CaTSCXXFlags.cmake create mode 100644 examples/advanced/CaTS/readCalorimeterHits.cc create mode 100644 examples/advanced/CaTS/readDRCalorimeterHits.cc create mode 100644 examples/advanced/CaTS/readMscHits.cc create mode 100644 examples/advanced/CaTS/readPhotonHits.cc create mode 100755 examples/advanced/CaTS/scripts/check.sh create mode 100644 examples/advanced/CaTS/scripts/hit.py create mode 100755 examples/advanced/CaTS/scripts/run.sh rename source/analysis/factory/include/g4analysis_defs.hh => examples/advanced/CaTS/src/ActionInitialization.cc (62%) create mode 100644 examples/advanced/CaTS/src/CalorimeterHit.cc create mode 100644 examples/advanced/CaTS/src/CalorimeterSD.cc create mode 100644 examples/advanced/CaTS/src/ColorReader.cc create mode 100644 examples/advanced/CaTS/src/ConfigurationManager.cc create mode 100644 examples/advanced/CaTS/src/DRCalorimeterHit.cc create mode 100644 examples/advanced/CaTS/src/DRCalorimeterSD.cc create mode 100644 examples/advanced/CaTS/src/DetectorConstruction.cc rename examples/advanced/{air_shower/include/UltraAnalysisManager.hh => CaTS/src/Event.cc} (68%) create mode 100644 examples/advanced/CaTS/src/EventAction.cc rename environments/g4py/tests/gtest01/module/Particles.cc => examples/advanced/CaTS/src/InteractionHit.cc (54%) create mode 100644 examples/advanced/CaTS/src/InteractionSD.cc rename environments/g4py/tests/gtest01/module/QEventAction.cc => examples/advanced/CaTS/src/MscHit.cc (59%) create mode 100644 examples/advanced/CaTS/src/MscSD.cc create mode 100644 examples/advanced/CaTS/src/PhotonHit.cc create mode 100644 examples/advanced/CaTS/src/PhotonSD.cc create mode 100644 examples/advanced/CaTS/src/PhysicsConfigurator.cc create mode 100644 examples/advanced/CaTS/src/PrimaryGeneratorAction.cc create mode 100644 examples/advanced/CaTS/src/RadiatorSD.cc create mode 100644 examples/advanced/CaTS/src/RootIO.cc create mode 100644 examples/advanced/CaTS/src/RunAction.cc create mode 100644 examples/advanced/CaTS/src/StackingAction.cc create mode 100644 examples/advanced/CaTS/src/TrackerHit.cc create mode 100644 examples/advanced/CaTS/src/TrackerSD.cc rename environments/g4py/tests/g4pytest/NISTmaterials/NISTmaterials.cc => examples/advanced/CaTS/src/lArTPCHit.cc (57%) create mode 100644 examples/advanced/CaTS/src/lArTPCSD.cc create mode 100644 examples/advanced/CaTS/xml/selection.xml delete mode 100644 examples/advanced/ChargeExchangeMC/README delete mode 100644 examples/advanced/ChargeExchangeMC/doc/CexmcSetupImages.pdf delete mode 100644 examples/advanced/ChargeExchangeMC/doc/CexmcUsersManual.pdf delete mode 100644 examples/advanced/HGCal_testbeam/README delete mode 100644 examples/advanced/ICRP110_HumanPhantoms/README delete mode 100644 examples/advanced/ICRP110_HumanPhantoms/include/ICRP110PhantomAnalysisManager.hh delete mode 100644 examples/advanced/README delete mode 100644 examples/advanced/STCyclotron/README delete mode 100644 examples/advanced/STCyclotron/include/STCyclotronAnalysis.hh delete mode 100644 examples/advanced/air_shower/README delete mode 100644 examples/advanced/amsEcal/README delete mode 100644 examples/advanced/brachytherapy/README delete mode 100644 examples/advanced/brachytherapy/test_macro/FlexiSourceMacro_livermore.mac delete mode 100644 examples/advanced/brachytherapy/test_macro/FlexiSourceMacro_opt0.mac delete mode 100644 examples/advanced/brachytherapy/test_macro/FlexiSourceMacro_opt3.mac delete mode 100644 examples/advanced/brachytherapy/test_macro/FlexiSourceMacro_opt4.mac delete mode 100644 examples/advanced/brachytherapy/test_macro/FlexiSourceMacro_penelope.mac delete mode 100644 examples/advanced/brachytherapy/test_macro/iridium_source_primary.mac delete mode 100644 examples/advanced/composite_calorimeter/README delete mode 100644 examples/advanced/composite_calorimeter/include/CCalAnalysis.hh delete mode 100644 examples/advanced/doiPET/README create mode 100644 examples/advanced/doiPET/analysis.cpp delete mode 100644 examples/advanced/eRosita/README.txt create mode 100755 examples/advanced/eRosita/application/include/eRositaActionInitialization.hh rename source/visualization/VRML/src/G4VRML1File.cc => examples/advanced/eRosita/application/src/eRositaActionInitialization.cc (63%) mode change 100644 => 100755 delete mode 100644 examples/advanced/fastAerosol/README.txt delete mode 100644 examples/advanced/gammaknife/README delete mode 100644 examples/advanced/gammaray_telescope/README delete mode 100644 examples/advanced/gammaray_telescope/emlowe.mac delete mode 100644 examples/advanced/gammaray_telescope/emstd.mac delete mode 100644 examples/advanced/gammaray_telescope/gammaraytel_polarized.in delete mode 100644 examples/advanced/gammaray_telescope/include/GammaRayTelIonPhysics.hh delete mode 100644 examples/advanced/gammaray_telescope/include/GammaRayTelMuonPhysics.hh rename examples/advanced/gammaray_telescope/{physics_polarized.mac => physics_opt4.mac} (87%) delete mode 100644 examples/advanced/gammaray_telescope/physics_polarized_new.mac delete mode 100644 examples/advanced/gammaray_telescope/src/GammaRayTelEMlowePhysics.cc delete mode 100644 examples/advanced/gammaray_telescope/src/GammaRayTelEMstdPhysics.cc delete mode 100644 examples/advanced/gammaray_telescope/src/GammaRayTelHadronPhysics.cc delete mode 100644 examples/advanced/gammaray_telescope/src/GammaRayTelIonPhysics.cc delete mode 100644 examples/advanced/gammaray_telescope/src/GammaRayTelMuonPhysics.cc delete mode 100644 examples/advanced/gammaray_telescope/src/GammaRayTelParticles.cc delete mode 100644 examples/advanced/gorad/README delete mode 100644 examples/advanced/hadrontherapy/README delete mode 100644 examples/advanced/hadrontherapy/experimentalData/proton/BraggPeak/README delete mode 100644 examples/advanced/human_phantom/README delete mode 100644 examples/advanced/iort_therapy/README delete mode 100644 examples/advanced/lAr_calorimeter/README delete mode 100644 examples/advanced/medical_linac/README delete mode 100644 examples/advanced/microbeam/README delete mode 100644 examples/advanced/microbeam/include/Analysis.hh delete mode 100644 examples/advanced/microelectronics/README delete mode 100644 examples/advanced/microelectronics/include/Analysis.hh rename examples/{extended/hadronic/Hadr07/include/NeutronHPMessenger.hh => advanced/microelectronics/include/DetectorMessenger.hh} (76%) create mode 100644 examples/advanced/microelectronics/include/ElectronCapture.hh create mode 100644 examples/advanced/microelectronics/include/MicroElecPhysics.hh create mode 100644 examples/advanced/microelectronics/include/MicroElecSiPhysics.hh rename examples/{extended/hadronic/Hadr06/src/NeutronHPMessenger.cc => advanced/microelectronics/src/DetectorMessenger.cc} (55%) create mode 100644 examples/advanced/microelectronics/src/ElectronCapture.cc create mode 100644 examples/advanced/microelectronics/src/MicroElecPhysics.cc create mode 100644 examples/advanced/microelectronics/src/MicroElecSiPhysics.cc delete mode 100644 examples/advanced/nanobeam/README delete mode 100644 examples/advanced/nanobeam/include/Analysis.hh delete mode 100644 examples/advanced/nanobeam/results/README delete mode 100644 examples/advanced/purging_magnet/README create mode 100644 examples/advanced/radioprotection/ProcessMicro.C delete mode 100644 examples/advanced/radioprotection/README delete mode 100644 examples/advanced/underground_physics/README delete mode 100644 examples/advanced/underground_physics/README_stt delete mode 100644 examples/advanced/xray_fluorescence/README delete mode 100644 examples/advanced/xray_telescope/README delete mode 100644 examples/basic/.README.txt delete mode 100644 examples/basic/B1/.README.txt delete mode 100644 examples/basic/B1/README rename examples/basic/B1/include/{B1ActionInitialization.hh => ActionInitialization.hh} (85%) rename examples/basic/B1/include/{B1DetectorConstruction.hh => DetectorConstruction.hh} (86%) rename examples/basic/B1/include/{B1EventAction.hh => EventAction.hh} (82%) rename examples/basic/B1/include/{B1PrimaryGeneratorAction.hh => PrimaryGeneratorAction.hh} (85%) rename examples/basic/B1/include/{B1RunAction.hh => RunAction.hh} (85%) rename examples/basic/B1/include/{B1SteppingAction.hh => SteppingAction.hh} (83%) rename examples/basic/B1/src/{B1ActionInitialization.cc => ActionInitialization.cc} (74%) rename examples/basic/B1/src/{B1DetectorConstruction.cc => DetectorConstruction.cc} (95%) rename examples/basic/B1/src/{B1EventAction.cc => EventAction.cc} (85%) rename examples/basic/B1/src/{B1PrimaryGeneratorAction.cc => PrimaryGeneratorAction.cc} (89%) rename examples/basic/B1/src/{B1RunAction.cc => RunAction.cc} (87%) rename examples/basic/B1/src/{B1SteppingAction.cc => SteppingAction.cc} (81%) delete mode 100644 examples/basic/B2/.README.txt rename examples/basic/B2/B2a/include/{B2ActionInitialization.hh => ActionInitialization.hh} (84%) rename examples/basic/B2/B2a/include/{B2aDetectorConstruction.hh => DetectorConstruction.hh} (72%) rename examples/basic/B2/B2a/include/{B2aDetectorMessenger.hh => DetectorMessenger.hh} (67%) rename examples/basic/B2/B2a/include/{B2EventAction.hh => EventAction.hh} (83%) rename examples/basic/B2/B2a/include/{B2PrimaryGeneratorAction.hh => PrimaryGeneratorAction.hh} (84%) rename examples/basic/B2/B2a/include/{B2RunAction.hh => RunAction.hh} (80%) rename examples/basic/B2/{B2b/include/B2TrackerHit.hh => B2a/include/TrackerHit.hh} (76%) rename examples/basic/B2/{B2b/include/B2TrackerSD.hh => B2a/include/TrackerSD.hh} (76%) rename examples/basic/B2/{B2b/src/B2ActionInitialization.cc => B2a/src/ActionInitialization.cc} (77%) rename examples/basic/B2/B2a/src/{B2aDetectorConstruction.cc => DetectorConstruction.cc} (90%) rename examples/basic/B2/B2a/src/{B2aDetectorMessenger.cc => DetectorMessenger.cc} (79%) rename examples/basic/B2/{B2b/src/B2EventAction.cc => B2a/src/EventAction.cc} (90%) rename examples/basic/B2/B2a/src/{B2PrimaryGeneratorAction.cc => PrimaryGeneratorAction.cc} (91%) rename examples/basic/B2/{B2b/src/B2RunAction.cc => B2a/src/RunAction.cc} (89%) rename examples/basic/B2/B2a/src/{B2TrackerHit.cc => TrackerHit.cc} (74%) rename examples/basic/B2/B2a/src/{B2TrackerSD.cc => TrackerSD.cc} (85%) rename examples/basic/B2/B2b/include/{B2ActionInitialization.hh => ActionInitialization.hh} (84%) rename examples/basic/B2/B2b/include/{B2bChamberParameterisation.hh => ChamberParameterisation.hh} (76%) rename examples/basic/B2/B2b/include/{B2bDetectorConstruction.hh => DetectorConstruction.hh} (72%) rename examples/basic/B2/B2b/include/{B2bDetectorMessenger.hh => DetectorMessenger.hh} (71%) rename examples/basic/B2/B2b/include/{B2EventAction.hh => EventAction.hh} (83%) rename examples/basic/B2/B2b/include/{B2PrimaryGeneratorAction.hh => PrimaryGeneratorAction.hh} (84%) create mode 100644 examples/basic/B2/B2b/include/RunAction.hh rename examples/basic/B2/{B2a/include/B2TrackerHit.hh => B2b/include/TrackerHit.hh} (76%) rename examples/basic/B2/{B2a/include/B2TrackerSD.hh => B2b/include/TrackerSD.hh} (76%) create mode 100644 examples/basic/B2/B2b/src/ActionInitialization.cc rename examples/basic/B2/B2b/src/{B2bChamberParameterisation.cc => ChamberParameterisation.cc} (87%) rename examples/basic/B2/B2b/src/{B2bDetectorConstruction.cc => DetectorConstruction.cc} (90%) rename examples/basic/B2/B2b/src/{B2bDetectorMessenger.cc => DetectorMessenger.cc} (85%) rename examples/basic/B2/{B2a/src/B2EventAction.cc => B2b/src/EventAction.cc} (90%) rename examples/basic/B2/B2b/src/{B2PrimaryGeneratorAction.cc => PrimaryGeneratorAction.cc} (91%) rename examples/basic/B2/{B2a/src/B2RunAction.cc => B2b/src/RunAction.cc} (89%) rename examples/basic/B2/B2b/src/{B2TrackerHit.cc => TrackerHit.cc} (74%) rename examples/basic/B2/B2b/src/{B2TrackerSD.cc => TrackerSD.cc} (81%) delete mode 100644 examples/basic/B2/README delete mode 100644 examples/basic/B3/.README.txt rename examples/basic/B3/B3a/include/{B3aActionInitialization.hh => ActionInitialization.hh} (86%) delete mode 100644 examples/basic/B3/B3a/include/B3Analysis.hh rename examples/basic/B3/{B3b/include/B3DetectorConstruction.hh => B3a/include/DetectorConstruction.hh} (85%) rename examples/basic/B3/B3a/include/{B3aEventAction.hh => EventAction.hh} (81%) rename examples/basic/B3/{B3b/include/B3PhysicsList.hh => B3a/include/PhysicsList.hh} (90%) rename examples/basic/B3/{B3b/include/B3PrimaryGeneratorAction.hh => B3a/include/PrimaryGeneratorAction.hh} (87%) rename examples/basic/B3/B3a/include/{B3aRunAction.hh => RunAction.hh} (84%) rename examples/basic/B3/B3a/include/{B3StackingAction.hh => StackingAction.hh} (88%) create mode 100644 examples/basic/B3/B3a/src/ActionInitialization.cc rename examples/basic/B3/B3a/src/{B3DetectorConstruction.cc => DetectorConstruction.cc} (95%) rename examples/basic/B3/B3a/src/{B3aEventAction.cc => EventAction.cc} (88%) rename examples/basic/B3/B3a/src/{B3PhysicsList.cc => PhysicsList.cc} (88%) rename examples/basic/B3/{B3b/src/B3PrimaryGeneratorAction.cc => B3a/src/PrimaryGeneratorAction.cc} (90%) rename examples/basic/B3/B3a/src/{B3aRunAction.cc => RunAction.cc} (90%) rename examples/basic/B3/{B3b/src/B3StackingAction.cc => B3a/src/StackingAction.cc} (89%) rename examples/basic/B3/B3b/include/{B3bActionInitialization.hh => ActionInitialization.hh} (86%) rename examples/basic/B3/{B3a/include/B3DetectorConstruction.hh => B3b/include/DetectorConstruction.hh} (85%) rename examples/basic/B3/{B3a/include/B3PhysicsList.hh => B3b/include/PhysicsList.hh} (90%) rename examples/basic/B3/{B3a/include/B3PrimaryGeneratorAction.hh => B3b/include/PrimaryGeneratorAction.hh} (87%) rename examples/basic/B3/B3b/include/{B3bRun.hh => Run.hh} (85%) rename examples/basic/B3/B3b/include/{B3bRunAction.hh => RunAction.hh} (85%) rename examples/basic/B3/B3b/include/{B3StackingAction.hh => StackingAction.hh} (88%) rename examples/basic/{B2/B2a/src/B2ActionInitialization.cc => B3/B3b/src/ActionInitialization.cc} (77%) delete mode 100644 examples/basic/B3/B3b/src/B3bActionInitialization.cc rename examples/basic/B3/B3b/src/{B3DetectorConstruction.cc => DetectorConstruction.cc} (95%) rename examples/basic/B3/B3b/src/{B3PhysicsList.cc => PhysicsList.cc} (88%) rename examples/basic/B3/{B3a/src/B3PrimaryGeneratorAction.cc => B3b/src/PrimaryGeneratorAction.cc} (90%) rename examples/basic/B3/B3b/src/{B3bRun.cc => Run.cc} (90%) rename examples/basic/B3/B3b/src/{B3bRunAction.cc => RunAction.cc} (88%) rename examples/basic/B3/{B3a/src/B3StackingAction.cc => B3b/src/StackingAction.cc} (89%) delete mode 100644 examples/basic/B3/README delete mode 100644 examples/basic/B4/.README.txt rename examples/basic/B4/B4a/include/{B4aActionInitialization.hh => ActionInitialization.hh} (80%) delete mode 100644 examples/basic/B4/B4a/include/B4Analysis.hh rename examples/basic/B4/B4a/include/{B4DetectorConstruction.hh => DetectorConstruction.hh} (80%) rename examples/basic/B4/B4a/include/{B4aEventAction.hh => EventAction.hh} (81%) rename examples/basic/B4/B4a/include/{B4PrimaryGeneratorAction.hh => PrimaryGeneratorAction.hh} (86%) rename examples/basic/B4/{B4c/include/B4RunAction.hh => B4a/include/RunAction.hh} (88%) rename examples/basic/B4/B4a/include/{B4aSteppingAction.hh => SteppingAction.hh} (79%) create mode 100644 examples/basic/B4/B4a/src/ActionInitialization.cc rename examples/basic/B4/B4a/src/{B4DetectorConstruction.cc => DetectorConstruction.cc} (93%) rename examples/basic/B4/B4a/src/{B4aEventAction.cc => EventAction.cc} (89%) rename examples/basic/B4/{B4c/src/B4PrimaryGeneratorAction.cc => B4a/src/PrimaryGeneratorAction.cc} (89%) rename examples/basic/B4/{B4c/src/B4RunAction.cc => B4a/src/RunAction.cc} (89%) rename examples/basic/B4/B4a/src/{B4aSteppingAction.cc => SteppingAction.cc} (83%) rename examples/basic/B4/B4b/include/{B4bActionInitialization.hh => ActionInitialization.hh} (77%) delete mode 100644 examples/basic/B4/B4b/include/B4Analysis.hh rename examples/basic/B4/B4b/include/{B4DetectorConstruction.hh => DetectorConstruction.hh} (80%) rename examples/basic/B4/B4b/include/{B4bEventAction.hh => EventAction.hh} (86%) rename examples/basic/B4/B4b/include/{B4PrimaryGeneratorAction.hh => PrimaryGeneratorAction.hh} (86%) rename examples/basic/B4/B4b/include/{B4bRunAction.hh => RunAction.hh} (87%) rename examples/basic/B4/B4b/include/{B4bRunData.hh => RunData.hh} (80%) rename examples/basic/B4/B4b/include/{B4bSteppingAction.hh => SteppingAction.hh} (82%) create mode 100644 examples/basic/B4/B4b/src/ActionInitialization.cc delete mode 100644 examples/basic/B4/B4b/src/B4bActionInitialization.cc rename examples/basic/B4/B4b/src/{B4DetectorConstruction.cc => DetectorConstruction.cc} (93%) rename examples/basic/B4/B4b/src/{B4bEventAction.cc => EventAction.cc} (88%) rename examples/basic/B4/{B4d/src/B4PrimaryGeneratorAction.cc => B4b/src/PrimaryGeneratorAction.cc} (89%) rename examples/basic/B4/B4b/src/{B4bRunAction.cc => RunAction.cc} (89%) rename examples/basic/B4/B4b/src/{B4bRunData.cc => RunData.cc} (87%) rename examples/basic/B4/B4b/src/{B4bSteppingAction.cc => SteppingAction.cc} (84%) rename examples/basic/B4/B4c/include/{B4cActionInitialization.hh => ActionInitialization.hh} (85%) delete mode 100644 examples/basic/B4/B4c/include/B4Analysis.hh rename examples/basic/B4/B4c/include/{B4cCalorHit.hh => CalorHit.hh} (70%) rename examples/basic/B4/B4c/include/{B4cCalorimeterSD.hh => CalorimeterSD.hh} (78%) rename examples/basic/B4/B4c/include/{B4cDetectorConstruction.hh => DetectorConstruction.hh} (84%) rename examples/basic/B4/B4c/include/{B4cEventAction.hh => EventAction.hh} (84%) rename examples/basic/B4/B4c/include/{B4PrimaryGeneratorAction.hh => PrimaryGeneratorAction.hh} (86%) rename examples/basic/B4/{B4d/include/B4RunAction.hh => B4c/include/RunAction.hh} (88%) create mode 100644 examples/basic/B4/B4c/src/ActionInitialization.cc delete mode 100644 examples/basic/B4/B4c/src/B4cActionInitialization.cc rename examples/basic/B4/B4c/src/{B4cCalorHit.cc => CalorHit.cc} (75%) rename examples/basic/B4/B4c/src/{B4cCalorimeterSD.cc => CalorimeterSD.cc} (84%) rename examples/basic/B4/B4c/src/{B4cDetectorConstruction.cc => DetectorConstruction.cc} (91%) rename examples/basic/B4/B4c/src/{B4cEventAction.cc => EventAction.cc} (88%) rename examples/basic/B4/{B4a/src/B4PrimaryGeneratorAction.cc => B4c/src/PrimaryGeneratorAction.cc} (89%) rename examples/basic/B4/{B4a/src/B4RunAction.cc => B4c/src/RunAction.cc} (89%) rename examples/basic/B4/B4d/include/{B4dActionInitialization.hh => ActionInitialization.hh} (85%) delete mode 100644 examples/basic/B4/B4d/include/B4Analysis.hh rename examples/basic/B4/B4d/include/{B4dDetectorConstruction.hh => DetectorConstruction.hh} (87%) rename examples/basic/B4/B4d/include/{B4dEventAction.hh => EventAction.hh} (83%) rename examples/basic/B4/B4d/include/{B4PrimaryGeneratorAction.hh => PrimaryGeneratorAction.hh} (86%) rename examples/basic/B4/{B4a/include/B4RunAction.hh => B4d/include/RunAction.hh} (88%) create mode 100644 examples/basic/B4/B4d/src/ActionInitialization.cc delete mode 100644 examples/basic/B4/B4d/src/B4dActionInitialization.cc rename examples/basic/B4/B4d/src/{B4dDetectorConstruction.cc => DetectorConstruction.cc} (94%) rename examples/basic/B4/B4d/src/{B4dEventAction.cc => EventAction.cc} (89%) rename examples/basic/B4/{B4b/src/B4PrimaryGeneratorAction.cc => B4d/src/PrimaryGeneratorAction.cc} (89%) rename examples/basic/B4/B4d/src/{B4RunAction.cc => RunAction.cc} (89%) delete mode 100644 examples/basic/B4/README delete mode 100644 examples/basic/B5/.README.txt delete mode 100644 examples/basic/B5/README rename examples/basic/B5/include/{B5ActionInitialization.hh => ActionInitialization.hh} (85%) rename examples/basic/B5/include/{B5CellParameterisation.hh => CellParameterisation.hh} (87%) rename examples/basic/B5/include/{B5Constants.hh => Constants.hh} (95%) rename examples/basic/B5/include/{B5DetectorConstruction.hh => DetectorConstruction.hh} (73%) rename examples/basic/B5/include/{B5DriftChamberHit.hh => DriftChamberHit.hh} (71%) rename examples/basic/B5/include/{B5DriftChamberSD.hh => DriftChamberSD.hh} (81%) rename examples/basic/B5/include/{B5EmCalorimeterHit.hh => EmCalorimeterHit.hh} (70%) rename examples/basic/B5/include/{B5EmCalorimeterSD.hh => EmCalorimeterSD.hh} (81%) rename examples/basic/B5/include/{B5EventAction.hh => EventAction.hh} (71%) rename examples/basic/B5/include/{B5HadCalorimeterHit.hh => HadCalorimeterHit.hh} (70%) rename examples/basic/B5/include/{B5HadCalorimeterSD.hh => HadCalorimeterSD.hh} (80%) rename examples/basic/B5/include/{B5HodoscopeHit.hh => HodoscopeHit.hh} (72%) rename examples/basic/B5/include/{B5HodoscopeSD.hh => HodoscopeSD.hh} (81%) rename examples/basic/B5/include/{B5MagneticField.hh => MagneticField.hh} (83%) rename examples/basic/B5/include/{B5PrimaryGeneratorAction.hh => PrimaryGeneratorAction.hh} (77%) rename examples/basic/B5/include/{B5RunAction.hh => RunAction.hh} (84%) create mode 100644 examples/basic/B5/plotter.mac create mode 100644 examples/basic/B5/src/ActionInitialization.cc rename examples/basic/B5/src/{B5CellParameterisation.cc => CellParameterisation.cc} (87%) rename examples/basic/B5/src/{B5DetectorConstruction.cc => DetectorConstruction.cc} (89%) rename examples/basic/B5/src/{B5DriftChamberHit.cc => DriftChamberHit.cc} (74%) rename examples/basic/B5/src/{B5DriftChamberSD.cc => DriftChamberSD.cc} (84%) rename examples/basic/B5/src/{B5EmCalorimeterHit.cc => EmCalorimeterHit.cc} (75%) rename examples/basic/B5/src/{B5EmCalorimeterSD.cc => EmCalorimeterSD.cc} (84%) rename examples/basic/B5/src/{B5EventAction.cc => EventAction.cc} (83%) rename examples/basic/B5/src/{B5HadCalorimeterHit.cc => HadCalorimeterHit.cc} (73%) rename examples/basic/B5/src/{B5HadCalorimeterSD.cc => HadCalorimeterSD.cc} (84%) rename examples/basic/B5/src/{B5HodoscopeHit.cc => HodoscopeHit.cc} (77%) rename examples/basic/B5/src/{B5HodoscopeSD.cc => HodoscopeSD.cc} (87%) rename examples/basic/B5/src/{B5MagneticField.cc => MagneticField.cc} (86%) rename examples/basic/B5/src/{B5PrimaryGeneratorAction.cc => PrimaryGeneratorAction.cc} (89%) rename examples/basic/B5/src/{B5RunAction.cc => RunAction.cc} (84%) delete mode 100644 examples/basic/README delete mode 100644 examples/extended/.README.txt delete mode 100644 examples/extended/analysis/.README.txt delete mode 100644 examples/extended/analysis/AnaEx01/.README.txt delete mode 100644 examples/extended/analysis/AnaEx01/README delete mode 100644 examples/extended/analysis/AnaEx02/.README.txt delete mode 100644 examples/extended/analysis/AnaEx02/README delete mode 100644 examples/extended/analysis/AnaEx03/.README.AIDA.txt delete mode 100644 examples/extended/analysis/AnaEx03/.README.OpenScientist.txt delete mode 100644 examples/extended/analysis/AnaEx03/.README.txt delete mode 100644 examples/extended/analysis/AnaEx03/AnaEx03.in delete mode 100644 examples/extended/analysis/AnaEx03/GNUmakefile delete mode 100644 examples/extended/analysis/AnaEx03/History delete mode 100644 examples/extended/analysis/AnaEx03/README delete mode 100644 examples/extended/analysis/AnaEx03/README.AIDA delete mode 100644 examples/extended/analysis/AnaEx03/README.OpenScientist delete mode 100644 examples/extended/analysis/AnaEx03/run.mac delete mode 100644 examples/extended/analysis/AnaEx03/shared/History delete mode 100644 examples/extended/analysis/AnaEx03/shared/include/DetectorConstruction.hh delete mode 100755 examples/extended/analysis/AnaEx03/shared/scripts/clean_files.sh delete mode 100755 examples/extended/analysis/AnaEx03/shared/scripts/copy_files.sh delete mode 100644 examples/extended/analysis/AnaEx03/shared/src/DetectorConstruction.cc delete mode 100644 examples/extended/analysis/AnaEx03/shared/src/DetectorMessenger.cc delete mode 100644 examples/extended/analysis/AnaEx03/shared/src/RunAction.cc delete mode 100644 examples/extended/analysis/AnaEx03/src/HistoManager.cc delete mode 100644 examples/extended/analysis/B1Con/.README.txt delete mode 100644 examples/extended/analysis/B1Con/README delete mode 100644 examples/extended/analysis/B1Con/README.B1 delete mode 100644 examples/extended/analysis/README delete mode 100644 examples/extended/biasing/.README.txt delete mode 100644 examples/extended/biasing/GB01/.README.txt delete mode 100644 examples/extended/biasing/GB01/README delete mode 100644 examples/extended/biasing/GB02/.README.txt delete mode 100644 examples/extended/biasing/GB02/README delete mode 100644 examples/extended/biasing/GB03/.README.txt delete mode 100644 examples/extended/biasing/GB03/README delete mode 100644 examples/extended/biasing/GB04/.README.txt delete mode 100644 examples/extended/biasing/GB04/README delete mode 100644 examples/extended/biasing/GB05/.README.txt delete mode 100644 examples/extended/biasing/GB05/README delete mode 100644 examples/extended/biasing/GB06/.README.txt delete mode 100644 examples/extended/biasing/GB06/README delete mode 100644 examples/extended/biasing/GB07/.README.txt delete mode 100644 examples/extended/biasing/GB07/README delete mode 100644 examples/extended/biasing/README delete mode 100644 examples/extended/biasing/ReverseMC01/.README.txt delete mode 100644 examples/extended/biasing/ReverseMC01/README delete mode 100644 examples/extended/common/.README.txt delete mode 100644 examples/extended/common/README delete mode 100644 examples/extended/electromagnetic/.README.txt delete mode 100644 examples/extended/electromagnetic/README delete mode 100644 examples/extended/electromagnetic/TestEm0/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm0/README delete mode 100644 examples/extended/electromagnetic/TestEm1/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm1/README delete mode 100644 examples/extended/electromagnetic/TestEm10/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm10/InstallAida.txt delete mode 100644 examples/extended/electromagnetic/TestEm10/README delete mode 100644 examples/extended/electromagnetic/TestEm10/include/Analysis.hh delete mode 100644 examples/extended/electromagnetic/TestEm11/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm11/README delete mode 100644 examples/extended/electromagnetic/TestEm11/sandia/EGSnrc/README delete mode 100644 examples/extended/electromagnetic/TestEm12/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm12/README delete mode 100644 examples/extended/electromagnetic/TestEm12/berger/EGSnrc/README delete mode 100644 examples/extended/electromagnetic/TestEm13/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm13/README delete mode 100644 examples/extended/electromagnetic/TestEm14/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm14/README delete mode 100644 examples/extended/electromagnetic/TestEm15/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm15/README delete mode 100644 examples/extended/electromagnetic/TestEm15/README.gamma delete mode 100644 examples/extended/electromagnetic/TestEm16/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm16/README delete mode 100644 examples/extended/electromagnetic/TestEm17/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm17/README delete mode 100644 examples/extended/electromagnetic/TestEm18/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm18/README delete mode 100644 examples/extended/electromagnetic/TestEm2/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm2/README delete mode 100644 examples/extended/electromagnetic/TestEm3/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm3/README delete mode 100644 examples/extended/electromagnetic/TestEm3/geant3/README delete mode 100644 examples/extended/electromagnetic/TestEm3/geant3/g4mat/README delete mode 100644 examples/extended/electromagnetic/TestEm4/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm4/README delete mode 100644 examples/extended/electromagnetic/TestEm4/include/Analysis.hh delete mode 100644 examples/extended/electromagnetic/TestEm5/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm5/README create mode 100644 examples/extended/electromagnetic/TestEm5/pixe_ANSTO.mac delete mode 100644 examples/extended/electromagnetic/TestEm6/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm6/README delete mode 100644 examples/extended/electromagnetic/TestEm7/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm7/README delete mode 100644 examples/extended/electromagnetic/TestEm8/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm8/README delete mode 100644 examples/extended/electromagnetic/TestEm9/.README.txt delete mode 100644 examples/extended/electromagnetic/TestEm9/README delete mode 100644 examples/extended/errorpropagation/.README.txt delete mode 100644 examples/extended/errorpropagation/README delete mode 100644 examples/extended/eventgenerator/.README.txt delete mode 100644 examples/extended/eventgenerator/HepMC/.README.txt delete mode 100644 examples/extended/eventgenerator/HepMC/HepMCEx01/.README.txt delete mode 100644 examples/extended/eventgenerator/HepMC/HepMCEx01/README delete mode 100644 examples/extended/eventgenerator/HepMC/HepMCEx02/.README.txt delete mode 100644 examples/extended/eventgenerator/HepMC/HepMCEx02/README delete mode 100644 examples/extended/eventgenerator/HepMC/MCTruth/.README.txt delete mode 100644 examples/extended/eventgenerator/HepMC/MCTruth/README delete mode 100644 examples/extended/eventgenerator/HepMC/README delete mode 100644 examples/extended/eventgenerator/README delete mode 100644 examples/extended/eventgenerator/exgps/.README.txt delete mode 100644 examples/extended/eventgenerator/exgps/README delete mode 100644 examples/extended/eventgenerator/exgps/macros/README delete mode 100644 examples/extended/eventgenerator/particleGun/.README.txt delete mode 100644 examples/extended/eventgenerator/particleGun/README delete mode 100644 examples/extended/eventgenerator/pythia/.README.txt delete mode 100644 examples/extended/eventgenerator/pythia/README delete mode 100644 examples/extended/eventgenerator/pythia/decayer6/.README.txt delete mode 100644 examples/extended/eventgenerator/pythia/decayer6/README delete mode 100644 examples/extended/eventgenerator/pythia/decayer6/common/.README.txt delete mode 100644 examples/extended/eventgenerator/pythia/decayer6/common/README delete mode 100644 examples/extended/eventgenerator/pythia/py8decayer/.README.txt delete mode 100644 examples/extended/eventgenerator/pythia/py8decayer/README delete mode 100644 examples/extended/eventgenerator/userPrimaryGenerator/.README.txt delete mode 100644 examples/extended/eventgenerator/userPrimaryGenerator/README delete mode 100644 examples/extended/exoticphysics/.README.txt delete mode 100644 examples/extended/exoticphysics/README delete mode 100644 examples/extended/exoticphysics/channeling/.README.txt delete mode 100644 examples/extended/exoticphysics/channeling/CTestDefinitions.txt delete mode 100644 examples/extended/exoticphysics/channeling/README delete mode 100644 examples/extended/exoticphysics/dmparticle/.README.txt delete mode 100644 examples/extended/exoticphysics/dmparticle/README delete mode 100644 examples/extended/exoticphysics/monopole/.README.txt delete mode 100644 examples/extended/exoticphysics/monopole/README delete mode 100644 examples/extended/exoticphysics/phonon/.README.txt delete mode 100644 examples/extended/exoticphysics/phonon/README delete mode 100644 examples/extended/exoticphysics/saxs/.README.txt delete mode 100644 examples/extended/exoticphysics/saxs/README delete mode 100644 examples/extended/exoticphysics/ucn/.README.txt delete mode 100644 examples/extended/exoticphysics/ucn/README delete mode 100644 examples/extended/field/.README.txt delete mode 100644 examples/extended/field/BlineTracer/.README.txt delete mode 100644 examples/extended/field/BlineTracer/README delete mode 100644 examples/extended/field/README delete mode 100644 examples/extended/field/field01/.README.txt delete mode 100644 examples/extended/field/field01/README delete mode 100644 examples/extended/field/field02/.README.txt delete mode 100644 examples/extended/field/field02/README delete mode 100644 examples/extended/field/field03/.README.txt delete mode 100644 examples/extended/field/field03/README delete mode 100644 examples/extended/field/field04/.README.txt delete mode 100644 examples/extended/field/field04/README delete mode 100644 examples/extended/field/field04/random/README delete mode 100644 examples/extended/field/field05/.README.txt delete mode 100644 examples/extended/field/field05/README delete mode 100644 examples/extended/field/field06/.README.txt delete mode 100644 examples/extended/field/field06/README delete mode 100644 examples/extended/g3tog4/.README.txt delete mode 100644 examples/extended/g3tog4/README delete mode 100644 examples/extended/g3tog4/clGeometry/.README.txt delete mode 100644 examples/extended/g3tog4/clGeometry/README delete mode 100644 examples/extended/g3tog4/clGeometry/common/.README.txt delete mode 100644 examples/extended/g3tog4/clGeometry/common/README delete mode 100644 examples/extended/geometry/.README.txt delete mode 100644 examples/extended/geometry/README delete mode 100644 examples/extended/geometry/transforms/.README.txt delete mode 100644 examples/extended/geometry/transforms/README delete mode 100644 examples/extended/geometry/vecGeomNavigation/README delete mode 100644 examples/extended/hadronic/.README.txt delete mode 100644 examples/extended/hadronic/FissionFragment/.README.txt delete mode 100644 examples/extended/hadronic/FissionFragment/README delete mode 100644 examples/extended/hadronic/Hadr00/.README.txt delete mode 100644 examples/extended/hadronic/Hadr00/README delete mode 100644 examples/extended/hadronic/Hadr01/.README.txt delete mode 100644 examples/extended/hadronic/Hadr01/README delete mode 100644 examples/extended/hadronic/Hadr02/.README.txt delete mode 100644 examples/extended/hadronic/Hadr02/README delete mode 100644 examples/extended/hadronic/Hadr02/hijing1_383/README delete mode 100644 examples/extended/hadronic/Hadr03/.README.txt delete mode 100644 examples/extended/hadronic/Hadr03/README delete mode 100644 examples/extended/hadronic/Hadr04/.README.txt delete mode 100644 examples/extended/hadronic/Hadr04/README delete mode 100644 examples/extended/hadronic/Hadr04/src/NeutronHPMessenger.cc rename examples/extended/{analysis/AnaEx03 => hadronic/Hadr05}/CMakeLists.txt (59%) create mode 100644 examples/extended/hadronic/Hadr05/Cu-lAr.mac create mode 100644 examples/extended/hadronic/Hadr05/Fe-Sci.mac create mode 100644 examples/extended/hadronic/Hadr05/GNUmakefile rename examples/extended/{analysis/AnaEx03/AnaEx03.cc => hadronic/Hadr05/Hadr05.cc} (57%) create mode 100644 examples/extended/hadronic/Hadr05/History create mode 100644 examples/extended/hadronic/Hadr05/Pb-lAr-em.mac create mode 100644 examples/extended/hadronic/Hadr05/Pb-lAr.mac create mode 100644 examples/extended/hadronic/Hadr05/W-lAr.mac create mode 100644 examples/extended/hadronic/Hadr05/emtest.mac create mode 100644 examples/extended/hadronic/Hadr05/emtutor.mac create mode 100644 examples/extended/hadronic/Hadr05/hadr05.in rename examples/extended/{analysis/AnaEx03/shared => hadronic/Hadr05}/include/ActionInitialization.hh (92%) create mode 100644 examples/extended/hadronic/Hadr05/include/DetectorConstruction.hh rename examples/extended/{analysis/AnaEx03/shared => hadronic/Hadr05}/include/DetectorMessenger.hh (86%) rename examples/extended/{medical/electronScattering/include/PhysListEmStandardWVI.hh => hadronic/Hadr05/include/ElectromagneticPhysics.hh} (84%) rename examples/extended/{analysis/AnaEx03/shared => hadronic/Hadr05}/include/EventAction.hh (78%) create mode 100644 examples/extended/hadronic/Hadr05/include/GammaNuclearPhysics.hh create mode 100644 examples/extended/hadronic/Hadr05/include/GammaNuclearPhysicsLEND.hh create mode 100644 examples/extended/hadronic/Hadr05/include/HadronElasticPhysicsHP.hh create mode 100644 examples/extended/hadronic/Hadr05/include/HistoManager.hh rename examples/extended/{exoticphysics/saxs/include/SAXSAnalysis.hh => hadronic/Hadr05/include/PhysicsList.hh} (85%) create mode 100644 examples/extended/hadronic/Hadr05/include/PrimaryGeneratorAction.hh create mode 100644 examples/extended/hadronic/Hadr05/include/RadioactiveDecayPhysics.hh rename examples/extended/{analysis/AnaEx03/include/HistoManager.hh => hadronic/Hadr05/include/Run.hh} (65%) rename examples/{basic/B5/src/B5ActionInitialization.cc => extended/hadronic/Hadr05/include/RunAction.hh} (73%) rename examples/extended/hadronic/{Hadr06/include/NeutronHPMessenger.hh => Hadr05/include/SteppingAction.hh} (78%) create mode 100644 examples/extended/hadronic/Hadr05/include/TrackingAction.hh rename examples/extended/{analysis/AnaEx03 => hadronic/Hadr05}/plotHisto.C (50%) rename examples/extended/{analysis/AnaEx03/shared => hadronic/Hadr05}/src/ActionInitialization.cc (79%) create mode 100644 examples/extended/hadronic/Hadr05/src/DetectorConstruction.cc create mode 100644 examples/extended/hadronic/Hadr05/src/DetectorMessenger.cc rename examples/extended/{medical/electronScattering/src/PhysListEmStandard.cc => hadronic/Hadr05/src/ElectromagneticPhysics.cc} (68%) rename examples/extended/{analysis/AnaEx03/shared => hadronic/Hadr05}/src/EventAction.cc (71%) create mode 100644 examples/extended/hadronic/Hadr05/src/GammaNuclearPhysics.cc rename examples/extended/{analysis/AnaEx03/shared/src/SteppingAction.cc => hadronic/Hadr05/src/GammaNuclearPhysicsLEND.cc} (63%) create mode 100644 examples/extended/hadronic/Hadr05/src/HadronElasticPhysicsHP.cc create mode 100644 examples/extended/hadronic/Hadr05/src/HistoManager.cc create mode 100644 examples/extended/hadronic/Hadr05/src/PhysicsList.cc create mode 100644 examples/extended/hadronic/Hadr05/src/PrimaryGeneratorAction.cc create mode 100644 examples/extended/hadronic/Hadr05/src/RadioactiveDecayPhysics.cc create mode 100644 examples/extended/hadronic/Hadr05/src/Run.cc create mode 100644 examples/extended/hadronic/Hadr05/src/RunAction.cc create mode 100644 examples/extended/hadronic/Hadr05/src/SteppingAction.cc create mode 100644 examples/extended/hadronic/Hadr05/src/TrackingAction.cc rename examples/extended/{analysis/AnaEx03 => hadronic/Hadr05}/vis.mac (86%) delete mode 100644 examples/extended/hadronic/Hadr06/.README.txt delete mode 100644 examples/extended/hadronic/Hadr06/README create mode 100644 examples/extended/hadronic/Hadr06/include/RadioactiveDecayPhysics.hh create mode 100644 examples/extended/hadronic/Hadr06/src/RadioactiveDecayPhysics.cc delete mode 100644 examples/extended/hadronic/Hadr07/.README.txt delete mode 100644 examples/extended/hadronic/Hadr07/README create mode 100644 examples/extended/hadronic/Hadr07/include/RadioactiveDecayPhysics.hh create mode 100644 examples/extended/hadronic/Hadr07/src/RadioactiveDecayPhysics.cc delete mode 100644 examples/extended/hadronic/Hadr08/.README.txt delete mode 100644 examples/extended/hadronic/Hadr08/README delete mode 100644 examples/extended/hadronic/Hadr09/.README.txt create mode 100644 examples/extended/hadronic/Hadr09/Hadr09.cc-ION_PROJECTILE delete mode 100644 examples/extended/hadronic/Hadr09/README delete mode 100644 examples/extended/hadronic/Hadr10/.README.txt delete mode 100644 examples/extended/hadronic/Hadr10/README delete mode 100644 examples/extended/hadronic/NeutronSource/.README.txt delete mode 100644 examples/extended/hadronic/NeutronSource/README delete mode 100644 examples/extended/hadronic/NeutronSource/include/NeutronHPMessenger.hh create mode 100644 examples/extended/hadronic/NeutronSource/include/RadioactiveDecayPhysics.hh delete mode 100644 examples/extended/hadronic/NeutronSource/src/NeutronHPMessenger.cc create mode 100644 examples/extended/hadronic/NeutronSource/src/RadioactiveDecayPhysics.cc delete mode 100644 examples/extended/hadronic/README delete mode 100644 examples/extended/medical/.README.txt delete mode 100644 examples/extended/medical/DICOM/.README.txt delete mode 100644 examples/extended/medical/DICOM/README delete mode 100644 examples/extended/medical/DICOM2/.README.txt delete mode 100644 examples/extended/medical/DICOM2/README delete mode 100644 examples/extended/medical/GammaTherapy/.README.txt delete mode 100644 examples/extended/medical/GammaTherapy/README delete mode 100644 examples/extended/medical/README delete mode 100644 examples/extended/medical/dna/.README.txt delete mode 100644 examples/extended/medical/dna/AuNP/.README.txt delete mode 100644 examples/extended/medical/dna/AuNP/README delete mode 100644 examples/extended/medical/dna/README delete mode 100644 examples/extended/medical/dna/chem1/.README.txt delete mode 100644 examples/extended/medical/dna/chem1/README delete mode 100644 examples/extended/medical/dna/chem2/.README.txt delete mode 100644 examples/extended/medical/dna/chem2/README delete mode 100644 examples/extended/medical/dna/chem3/.README.txt delete mode 100644 examples/extended/medical/dna/chem3/README delete mode 100644 examples/extended/medical/dna/chem4/.README.txt delete mode 100644 examples/extended/medical/dna/chem4/README delete mode 100644 examples/extended/medical/dna/chem5/.README.txt delete mode 100644 examples/extended/medical/dna/chem5/README delete mode 100644 examples/extended/medical/dna/chem6/.README.txt delete mode 100644 examples/extended/medical/dna/chem6/README delete mode 100644 examples/extended/medical/dna/clustering/.README.txt delete mode 100644 examples/extended/medical/dna/clustering/README delete mode 100644 examples/extended/medical/dna/clustering/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/dnadamage1/.README.txt delete mode 100644 examples/extended/medical/dna/dnadamage1/README.txt delete mode 100644 examples/extended/medical/dna/dnaphysics/.README.txt delete mode 100644 examples/extended/medical/dna/dnaphysics/README delete mode 100644 examples/extended/medical/dna/dnaphysics/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/icsd/.README.txt delete mode 100644 examples/extended/medical/dna/icsd/README delete mode 100644 examples/extended/medical/dna/icsd/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/mfp/.README.txt delete mode 100644 examples/extended/medical/dna/mfp/README delete mode 100644 examples/extended/medical/dna/microdosimetry/.README.txt delete mode 100644 examples/extended/medical/dna/microdosimetry/README delete mode 100644 examples/extended/medical/dna/microdosimetry/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/microprox/.README.txt delete mode 100644 examples/extended/medical/dna/microprox/README delete mode 100644 examples/extended/medical/dna/microprox/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/microyz/.README delete mode 100644 examples/extended/medical/dna/microyz/.README.txt delete mode 100644 examples/extended/medical/dna/microyz/README delete mode 100644 examples/extended/medical/dna/microyz/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/neuron/.README delete mode 100644 examples/extended/medical/dna/neuron/.README.txt delete mode 100644 examples/extended/medical/dna/neuron/README delete mode 100644 examples/extended/medical/dna/neuron/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/pdb4dna/.README.txt delete mode 100644 examples/extended/medical/dna/pdb4dna/README delete mode 100644 examples/extended/medical/dna/pdb4dna/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/range/.README.txt delete mode 100644 examples/extended/medical/dna/range/README create mode 100644 examples/extended/medical/dna/scavenger/CMakeLists.txt rename examples/extended/{analysis/AnaEx03/shared/scripts => medical/dna/scavenger}/History (69%) mode change 100644 => 100755 create mode 100644 examples/extended/medical/dna/scavenger/Rtable_NO2_NO3.txt create mode 100644 examples/extended/medical/dna/scavenger/Rtable_O2.txt create mode 100644 examples/extended/medical/dna/scavenger/beam.in create mode 100644 examples/extended/medical/dna/scavenger/include/ActionInitialization.hh create mode 100644 examples/extended/medical/dna/scavenger/include/DetectorConstruction.hh rename examples/extended/medical/{electronScattering/include/PhysListEmStandard.hh => dna/scavenger/include/EmDNAChemistry.hh} (59%) create mode 100644 examples/extended/medical/dna/scavenger/include/ParserChemReaction.hh create mode 100644 examples/extended/medical/dna/scavenger/include/PhysicsList.hh create mode 100644 examples/extended/medical/dna/scavenger/include/PrimaryGeneratorAction.hh create mode 100644 examples/extended/medical/dna/scavenger/include/PrimaryKiller.hh create mode 100644 examples/extended/medical/dna/scavenger/include/Run.hh rename examples/{basic/B2/B2b/include/B2RunAction.hh => extended/medical/dna/scavenger/include/RunAction.hh} (82%) create mode 100644 examples/extended/medical/dna/scavenger/include/ScoreSpecies.hh rename examples/extended/medical/dna/{splitting/include/Analysis.hh => scavenger/include/StackingAction.hh} (79%) create mode 100644 examples/extended/medical/dna/scavenger/include/TimeStepAction.hh create mode 100755 examples/extended/medical/dna/scavenger/plotG.C create mode 100644 examples/extended/medical/dna/scavenger/scavenger.cc create mode 100644 examples/extended/medical/dna/scavenger/src/ActionInitialization.cc create mode 100644 examples/extended/medical/dna/scavenger/src/DetectorConstruction.cc create mode 100644 examples/extended/medical/dna/scavenger/src/EmDNAChemistry.cc create mode 100644 examples/extended/medical/dna/scavenger/src/ParserChemReaction.cc create mode 100644 examples/extended/medical/dna/scavenger/src/PhysicsList.cc create mode 100644 examples/extended/medical/dna/scavenger/src/PrimaryGeneratorAction.cc create mode 100644 examples/extended/medical/dna/scavenger/src/PrimaryKiller.cc create mode 100644 examples/extended/medical/dna/scavenger/src/Run.cc create mode 100644 examples/extended/medical/dna/scavenger/src/RunAction.cc create mode 100644 examples/extended/medical/dna/scavenger/src/ScoreSpecies.cc create mode 100644 examples/extended/medical/dna/scavenger/src/StackingAction.cc create mode 100644 examples/extended/medical/dna/scavenger/src/TimeStepAction.cc create mode 100644 examples/extended/medical/dna/scavenger/vis.mac delete mode 100644 examples/extended/medical/dna/slowing/.README.txt delete mode 100644 examples/extended/medical/dna/slowing/README delete mode 100644 examples/extended/medical/dna/slowing/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/splitting/.README.txt delete mode 100644 examples/extended/medical/dna/splitting/README delete mode 100644 examples/extended/medical/dna/spower/.README.txt delete mode 100644 examples/extended/medical/dna/spower/README delete mode 100644 examples/extended/medical/dna/svalue/.README.txt delete mode 100644 examples/extended/medical/dna/svalue/README delete mode 100644 examples/extended/medical/dna/wholeNuclearDNA/.README.txt delete mode 100644 examples/extended/medical/dna/wholeNuclearDNA/README delete mode 100644 examples/extended/medical/dna/wholeNuclearDNA/include/Analysis.hh delete mode 100644 examples/extended/medical/dna/wvalue/.README.txt delete mode 100644 examples/extended/medical/dna/wvalue/README delete mode 100644 examples/extended/medical/electronScattering/.README.txt delete mode 100644 examples/extended/medical/electronScattering/EGS_13MeV/README delete mode 100644 examples/extended/medical/electronScattering/README delete mode 100644 examples/extended/medical/electronScattering/include/PhysListEmStandardGS.hh delete mode 100644 examples/extended/medical/electronScattering/src/PhysListEmStandardGS.cc delete mode 100644 examples/extended/medical/electronScattering/src/PhysListEmStandardSS.cc delete mode 100644 examples/extended/medical/electronScattering/src/PhysListEmStandardWVI.cc delete mode 100644 examples/extended/medical/electronScattering2/.README.txt delete mode 100644 examples/extended/medical/electronScattering2/README delete mode 100644 examples/extended/medical/fanoCavity/.README.txt delete mode 100644 examples/extended/medical/fanoCavity/README delete mode 100644 examples/extended/medical/fanoCavity2/.README.txt delete mode 100644 examples/extended/medical/fanoCavity2/README delete mode 100644 examples/extended/optical/.README.txt delete mode 100644 examples/extended/optical/LXe/.README.txt delete mode 100644 examples/extended/optical/LXe/README delete mode 100644 examples/extended/optical/OpNovice/.README.txt delete mode 100644 examples/extended/optical/OpNovice/README rename examples/extended/optical/OpNovice/include/{OpNoviceDetectorConstructionMessenger.hh => OpNoviceDetectorMessenger.hh} (77%) delete mode 100644 examples/extended/optical/OpNovice/include/OpNoviceGDMLDetectorConstructionMessenger.hh rename examples/extended/optical/OpNovice/src/{OpNoviceDetectorConstructionMessenger.cc => OpNoviceDetectorMessenger.cc} (55%) delete mode 100644 examples/extended/optical/OpNovice/src/OpNoviceGDMLDetectorConstructionMessenger.cc delete mode 100644 examples/extended/optical/OpNovice2/.README.txt delete mode 100644 examples/extended/optical/OpNovice2/README delete mode 100644 examples/extended/optical/README delete mode 100644 examples/extended/optical/wls/.README.txt delete mode 100644 examples/extended/optical/wls/README delete mode 100644 examples/extended/optical/wls/Sr90.mac create mode 100644 examples/extended/optical/wls/electron.mac delete mode 100644 examples/extended/parallel/.README.txt delete mode 100644 examples/extended/parallel/MPI/.README.txt delete mode 100644 examples/extended/parallel/MPI/README.md delete mode 100644 examples/extended/parallel/MPI/ctests-definitions.cmake delete mode 100644 examples/extended/parallel/MPI/examples/exMPI01/.README.txt delete mode 100644 examples/extended/parallel/MPI/examples/exMPI01/README.html delete mode 100644 examples/extended/parallel/MPI/examples/exMPI01/README.md delete mode 100644 examples/extended/parallel/MPI/examples/exMPI02/.README.txt delete mode 100644 examples/extended/parallel/MPI/examples/exMPI02/README.html delete mode 100644 examples/extended/parallel/MPI/examples/exMPI02/README.md delete mode 100644 examples/extended/parallel/MPI/examples/exMPI03/.README.txt delete mode 100644 examples/extended/parallel/MPI/examples/exMPI03/README.html delete mode 100644 examples/extended/parallel/MPI/examples/exMPI03/README.md delete mode 100644 examples/extended/parallel/MPI/examples/exMPI04/.README.txt delete mode 100644 examples/extended/parallel/MPI/examples/exMPI04/README.md delete mode 100644 examples/extended/parallel/README delete mode 100644 examples/extended/parallel/TBB/.README.txt delete mode 100644 examples/extended/parallel/TBB/B2b/.README.txt delete mode 100644 examples/extended/parallel/TBB/B2b/README delete mode 100644 examples/extended/parallel/TBB/README delete mode 100644 examples/extended/parallel/ThreadsafeScorers/.README.txt delete mode 100644 examples/extended/parallel/ThreadsafeScorers/README delete mode 100644 examples/extended/parallel/TopC/ParN02/.README.N02.txt delete mode 100644 examples/extended/parallel/TopC/ParN02/.README.txt delete mode 100644 examples/extended/parallel/TopC/ParN02/AnnotatedFiles/000README delete mode 100644 examples/extended/parallel/TopC/ParN02/README delete mode 100644 examples/extended/parallel/TopC/ParN02/README.N02 delete mode 100644 examples/extended/parallel/TopC/ParN04/.README.N04 delete mode 100644 examples/extended/parallel/TopC/ParN04/.README.N04.txt delete mode 100644 examples/extended/parallel/TopC/ParN04/.README.txt delete mode 100644 examples/extended/parallel/TopC/ParN04/AnnotatedFiles/000README delete mode 100644 examples/extended/parallel/TopC/ParN04/README delete mode 100644 examples/extended/parallel/TopC/ParN04/README.N04 delete mode 100644 examples/extended/parallel/TopC/info/NEW_APP_README delete mode 100644 examples/extended/parallel/TopC/info/README.html delete mode 100644 examples/extended/parameterisations/.README.txt delete mode 100644 examples/extended/parameterisations/Par01/.README.txt delete mode 100644 examples/extended/parameterisations/Par01/README delete mode 100644 examples/extended/parameterisations/Par02/.README.txt delete mode 100644 examples/extended/parameterisations/Par02/README delete mode 100644 examples/extended/parameterisations/Par03/.README.txt delete mode 100644 examples/extended/parameterisations/Par03/README create mode 100644 examples/extended/parameterisations/Par04/CMakeLists.txt create mode 100644 examples/extended/parameterisations/Par04/History create mode 100644 examples/extended/parameterisations/Par04/cmake/FindOnnxRuntime.cmake create mode 100644 examples/extended/parameterisations/Par04/examplePar04.cc create mode 100644 examples/extended/parameterisations/Par04/examplePar04.in create mode 100644 examples/extended/parameterisations/Par04/examplePar04_lwtnn.in create mode 100644 examples/extended/parameterisations/Par04/examplePar04_onnx.in create mode 100644 examples/extended/parameterisations/Par04/include/Par04ActionInitialisation.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04DefineMeshModel.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04DetectorConstruction.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04DetectorMessenger.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04EventAction.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04EventInformation.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04Hit.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04InferenceInterface.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04InferenceMessenger.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04InferenceSetup.hh rename examples/{advanced/gammaray_telescope/include/GammaRayTelGeneralPhysics.hh => extended/parameterisations/Par04/include/Par04LwtnnInference.hh} (58%) rename examples/{advanced/gammaray_telescope/include/GammaRayTelHadronPhysics.hh => extended/parameterisations/Par04/include/Par04MLFastSimModel.hh} (50%) rename environments/g4py/tests/g4pytest/ezgeom/G4EzVoxelParameterization.hh => examples/extended/parameterisations/Par04/include/Par04OnnxInference.hh (53%) rename source/visualization/HepRep/include/G4HepRep.hh => examples/extended/parameterisations/Par04/include/Par04PrimaryGeneratorAction.hh (70%) create mode 100644 examples/extended/parameterisations/Par04/include/Par04RunAction.hh create mode 100644 examples/extended/parameterisations/Par04/include/Par04SensitiveDetector.hh rename examples/{basic/B4/B4a/src/B4aActionInitialization.cc => extended/parameterisations/Par04/src/Par04ActionInitialisation.cc} (68%) create mode 100644 examples/extended/parameterisations/Par04/src/Par04DefineMeshModel.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04DetectorConstruction.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04DetectorMessenger.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04EventAction.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04EventInformation.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04Hit.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04InferenceMessenger.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04InferenceSetup.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04LwtnnInference.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04MLFastSimModel.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04OnnxInference.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04PrimaryGeneratorAction.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04RunAction.cc create mode 100644 examples/extended/parameterisations/Par04/src/Par04SensitiveDetector.cc create mode 100644 examples/extended/parameterisations/Par04/vis.mac delete mode 100644 examples/extended/parameterisations/README delete mode 100644 examples/extended/parameterisations/gflash/.README.txt delete mode 100644 examples/extended/parameterisations/gflash/README delete mode 100644 examples/extended/parameterisations/gflash/gflasha/.README.txt delete mode 100644 examples/extended/parameterisations/gflash/gflasha/README delete mode 100644 examples/extended/parameterisations/gflash/gflasha/power-off.png delete mode 100644 examples/extended/persistency/.README.txt delete mode 100644 examples/extended/persistency/P01/.README.txt delete mode 100644 examples/extended/persistency/P01/README delete mode 100644 examples/extended/persistency/P02/.README.txt delete mode 100644 examples/extended/persistency/P02/README delete mode 100644 examples/extended/persistency/P03/.README.txt delete mode 100644 examples/extended/persistency/P03/README delete mode 100644 examples/extended/persistency/README delete mode 100644 examples/extended/persistency/gdml/.README.txt delete mode 100644 examples/extended/persistency/gdml/G01/.README.txt delete mode 100644 examples/extended/persistency/gdml/G01/README delete mode 100644 examples/extended/persistency/gdml/G02/.README.txt delete mode 100644 examples/extended/persistency/gdml/G02/README delete mode 100644 examples/extended/persistency/gdml/G03/.README.txt delete mode 100644 examples/extended/persistency/gdml/G03/README delete mode 100644 examples/extended/persistency/gdml/G04/.README.txt delete mode 100644 examples/extended/persistency/gdml/G04/README delete mode 100644 examples/extended/persistency/gdml/README delete mode 100644 examples/extended/physicslists/.README.txt delete mode 100644 examples/extended/physicslists/README delete mode 100644 examples/extended/physicslists/extensibleFactory/.README.txt delete mode 100644 examples/extended/physicslists/extensibleFactory/README delete mode 100644 examples/extended/physicslists/extensibleFactory/shared/include/Analysis.hh delete mode 100644 examples/extended/physicslists/factory/.README.txt delete mode 100644 examples/extended/physicslists/factory/README delete mode 100644 examples/extended/physicslists/factory/shared/include/Analysis.hh delete mode 100644 examples/extended/physicslists/genericPL/.README.txt delete mode 100644 examples/extended/physicslists/genericPL/README delete mode 100644 examples/extended/physicslists/genericPL/shared/include/Analysis.hh delete mode 100644 examples/extended/physicslists/shared/include/Analysis.hh delete mode 100644 examples/extended/polarisation/.README.txt delete mode 100644 examples/extended/polarisation/Pol01/.README.txt delete mode 100644 examples/extended/polarisation/Pol01/README delete mode 100644 examples/extended/polarisation/README delete mode 100644 examples/extended/radioactivedecay/.README.txt delete mode 100644 examples/extended/radioactivedecay/Activation/.README.txt delete mode 100644 examples/extended/radioactivedecay/Activation/README delete mode 100644 examples/extended/radioactivedecay/Activation/include/NeutronHPMessenger.hh create mode 100644 examples/extended/radioactivedecay/Activation/include/RadioactiveDecayPhysics.hh delete mode 100644 examples/extended/radioactivedecay/Activation/src/NeutronHPMessenger.cc create mode 100644 examples/extended/radioactivedecay/Activation/src/RadioactiveDecayPhysics.cc delete mode 100644 examples/extended/radioactivedecay/README delete mode 100644 examples/extended/radioactivedecay/rdecay01/.README.txt delete mode 100644 examples/extended/radioactivedecay/rdecay01/README delete mode 100644 examples/extended/radioactivedecay/rdecay02/.README.txt delete mode 100644 examples/extended/radioactivedecay/rdecay02/README delete mode 100644 examples/extended/runAndEvent/.README.txt delete mode 100644 examples/extended/runAndEvent/RE01/.README.txt delete mode 100644 examples/extended/runAndEvent/RE01/README delete mode 100644 examples/extended/runAndEvent/RE02/.README.txt delete mode 100644 examples/extended/runAndEvent/RE02/README delete mode 100644 examples/extended/runAndEvent/RE03/.README.txt delete mode 100644 examples/extended/runAndEvent/RE03/README delete mode 100644 examples/extended/runAndEvent/RE04/.README.txt delete mode 100644 examples/extended/runAndEvent/RE04/README delete mode 100644 examples/extended/runAndEvent/RE05/.README.txt delete mode 100644 examples/extended/runAndEvent/RE05/README delete mode 100644 examples/extended/runAndEvent/RE06/.README.txt delete mode 100644 examples/extended/runAndEvent/RE06/README create mode 100644 examples/extended/runAndEvent/RE07/CMakeLists.txt create mode 100644 examples/extended/runAndEvent/RE07/History create mode 100644 examples/extended/runAndEvent/RE07/exampleRE07.cc create mode 100644 examples/extended/runAndEvent/RE07/include/ActionInitialization.hh create mode 100644 examples/extended/runAndEvent/RE07/include/DetectorConstruction.hh create mode 100644 examples/extended/runAndEvent/RE07/include/DetectorMessenger.hh rename examples/{advanced/gammaray_telescope/include/GammaRayTelEMlowePhysics.hh => extended/runAndEvent/RE07/include/EmStandardPhysicsTrackingManager.hh} (51%) create mode 100644 examples/extended/runAndEvent/RE07/include/EventAction.hh create mode 100644 examples/extended/runAndEvent/RE07/include/PhysicsList.hh create mode 100644 examples/extended/runAndEvent/RE07/include/PhysicsListEmSpecialized.hh create mode 100644 examples/extended/runAndEvent/RE07/include/PhysicsListEmStandardTracking.hh rename examples/extended/{hadronic/Hadr04/include/NeutronHPMessenger.hh => runAndEvent/RE07/include/PhysicsListMessenger.hh} (79%) rename examples/extended/{analysis/AnaEx03/shared => runAndEvent/RE07}/include/PrimaryGeneratorAction.hh (85%) create mode 100644 examples/extended/runAndEvent/RE07/include/Run.hh rename examples/extended/{analysis/AnaEx03/shared => runAndEvent/RE07}/include/RunAction.hh (80%) rename examples/extended/{medical/electronScattering/include/PhysListEmStandardSS.hh => runAndEvent/RE07/include/SpecializedTrackingManager.hh} (72%) rename examples/extended/{analysis/AnaEx03/shared => runAndEvent/RE07}/include/SteppingAction.hh (92%) create mode 100644 examples/extended/runAndEvent/RE07/include/TrackingAction.hh create mode 100644 examples/extended/runAndEvent/RE07/include/TrackingManagerHelper.hh create mode 100644 examples/extended/runAndEvent/RE07/include/TrackingManagerHelper.icc create mode 100644 examples/extended/runAndEvent/RE07/processes.mac create mode 100644 examples/extended/runAndEvent/RE07/specialized.mac create mode 100644 examples/extended/runAndEvent/RE07/src/ActionInitialization.cc create mode 100644 examples/extended/runAndEvent/RE07/src/DetectorConstruction.cc create mode 100644 examples/extended/runAndEvent/RE07/src/DetectorMessenger.cc create mode 100644 examples/extended/runAndEvent/RE07/src/EmStandardPhysicsTrackingManager.cc rename examples/{basic/B3/B3a/src/B3aActionInitialization.cc => extended/runAndEvent/RE07/src/EventAction.cc} (73%) create mode 100644 examples/extended/runAndEvent/RE07/src/PhysicsList.cc create mode 100644 examples/extended/runAndEvent/RE07/src/PhysicsListEmSpecialized.cc rename examples/extended/{hadronic/Hadr07/src/NeutronHPMessenger.cc => runAndEvent/RE07/src/PhysicsListEmStandardTracking.cc} (65%) create mode 100644 examples/extended/runAndEvent/RE07/src/PhysicsListMessenger.cc rename examples/extended/{analysis/AnaEx03/shared => runAndEvent/RE07}/src/PrimaryGeneratorAction.cc (74%) create mode 100644 examples/extended/runAndEvent/RE07/src/Run.cc create mode 100644 examples/extended/runAndEvent/RE07/src/RunAction.cc create mode 100644 examples/extended/runAndEvent/RE07/src/SpecializedTrackingManager.cc create mode 100644 examples/extended/runAndEvent/RE07/src/SteppingAction.cc create mode 100644 examples/extended/runAndEvent/RE07/src/TrackingAction.cc create mode 100644 examples/extended/runAndEvent/RE07/tracking.mac delete mode 100644 examples/extended/runAndEvent/README delete mode 100644 examples/extended/visualization/.README.txt delete mode 100644 examples/extended/visualization/README delete mode 100644 examples/extended/visualization/movies/.README.txt delete mode 100644 examples/extended/visualization/movies/README delete mode 100644 examples/extended/visualization/perspective/.README.txt delete mode 100644 examples/extended/visualization/perspective/README delete mode 100644 examples/extended/visualization/standalone/.README.txt delete mode 100644 examples/extended/visualization/standalone/README delete mode 100644 examples/extended/visualization/userVisAction/.README.txt delete mode 100644 examples/extended/visualization/userVisAction/README create mode 100644 source/analysis/csv/include/G4CsvHnRFileManager.hh create mode 100644 source/analysis/csv/include/G4CsvHnRFileManager.icc rename source/analysis/{csv/include/g4csv.hh => factory/include/G4AnalysisManager.hh} (88%) delete mode 100644 source/analysis/factory/src/g4analysis.cc create mode 100644 source/analysis/hdf5/include/G4Hdf5HnRFileManager.hh create mode 100644 source/analysis/hdf5/include/G4Hdf5HnRFileManager.icc delete mode 100644 source/analysis/hdf5/include/g4hdf5.hh create mode 100644 source/analysis/hntools/include/G4MPIToolsManager.icc rename environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorMessenger.hh => source/analysis/hntools/include/G4ToolsAnalysisMessenger.hh (54%) create mode 100644 source/analysis/hntools/src/G4ToolsAnalysisMessenger.cc create mode 100644 source/analysis/management/include/G4VRFileManager.hh rename environments/g4py/tests/gtest01/module/QMaterials.hh => source/analysis/management/include/G4VTHnRFileManager.hh (76%) create mode 100644 source/analysis/root/include/G4RootHnRFileManager.hh create mode 100644 source/analysis/root/include/G4RootHnRFileManager.icc delete mode 100644 source/analysis/root/include/g4root.hh create mode 100644 source/analysis/xml/include/G4XmlHnRFileManager.hh rename examples/advanced/lAr_calorimeter/include/FCALAnalysisManager.hh => source/analysis/xml/include/G4XmlHnRFileManager.icc (76%) rename environments/g4py/tests/g4pytest/EMSTDpl/pyEMSTDpl.cc => source/analysis/xml/include/G4XmlRFileManager.icc (55%) delete mode 100644 source/analysis/xml/include/g4xml.hh create mode 100644 source/externals/clhep/include/CLHEP/Random/RanluxppEngine.h create mode 100644 source/externals/clhep/include/CLHEP/Random/ranluxpp/helpers.h create mode 100644 source/externals/clhep/include/CLHEP/Random/ranluxpp/mulmod.h create mode 100644 source/externals/clhep/include/CLHEP/Random/ranluxpp/ranlux_lcg.h create mode 100644 source/externals/clhep/src/RanluxppEngine.cc delete mode 100644 source/externals/expat/README delete mode 100644 source/externals/g4tools/include/tools/Cocoa/session.hm delete mode 100644 source/externals/g4tools/include/tools/Cocoa/sg_viewer.hm delete mode 100644 source/externals/g4tools/include/tools/Qt/plots_glarea delete mode 100644 source/externals/g4tools/include/tools/Windows/WinTk delete mode 100644 source/externals/g4tools/include/tools/Windows/tools delete mode 100644 source/externals/g4tools/include/tools/Xt/OpenGLArea.c delete mode 100644 source/externals/g4tools/include/tools/Xt/OpenGLArea.h delete mode 100644 source/externals/g4tools/include/tools/Xt/OpenGLAreaP.h delete mode 100644 source/externals/g4tools/include/tools/Xt/tools delete mode 100644 source/externals/g4tools/include/tools/app delete mode 100644 source/externals/g4tools/include/tools/cmp delete mode 100644 source/externals/g4tools/include/tools/file_name create mode 100644 source/externals/g4tools/include/tools/font/lato_license create mode 100644 source/externals/g4tools/include/tools/font/lato_regular_ttf create mode 100644 source/externals/g4tools/include/tools/font/roboto_bold_ttf create mode 100644 source/externals/g4tools/include/tools/font/roboto_license delete mode 100644 source/externals/g4tools/include/tools/hep/pbp.icc delete mode 100644 source/externals/g4tools/include/tools/hep/polyhedron delete mode 100644 source/externals/g4tools/include/tools/hep/polyhedron.icc delete mode 100644 source/externals/g4tools/include/tools/hep/sf_polyhedron delete mode 100644 source/externals/g4tools/include/tools/histo/histos delete mode 100644 source/externals/g4tools/include/tools/histo/htoc delete mode 100644 source/externals/g4tools/include/tools/histo/slice delete mode 100644 source/externals/g4tools/include/tools/histo/sliced delete mode 100644 source/externals/g4tools/include/tools/image delete mode 100644 source/externals/g4tools/include/tools/image_reader delete mode 100644 source/externals/g4tools/include/tools/jpeg delete mode 100644 source/externals/g4tools/include/tools/lina/eqT delete mode 100644 source/externals/g4tools/include/tools/lina/mat3 delete mode 100644 source/externals/g4tools/include/tools/lina/mat3d delete mode 100644 source/externals/g4tools/include/tools/lina/mat3f delete mode 100644 source/externals/g4tools/include/tools/lina/mat4d delete mode 100644 source/externals/g4tools/include/tools/lina/rotd delete mode 100644 source/externals/g4tools/include/tools/lina/vec4d delete mode 100644 source/externals/g4tools/include/tools/log_file delete mode 100644 source/externals/g4tools/include/tools/metal/render.hm delete mode 100644 source/externals/g4tools/include/tools/metal/session.hm delete mode 100644 source/externals/g4tools/include/tools/metal/sg_viewer.hm delete mode 100644 source/externals/g4tools/include/tools/metal/ui_viewer delete mode 100644 source/externals/g4tools/include/tools/metal/view.hm delete mode 100644 source/externals/g4tools/include/tools/paper_format delete mode 100644 source/externals/g4tools/include/tools/path_env delete mode 100644 source/externals/g4tools/include/tools/png delete mode 100644 source/externals/g4tools/include/tools/put_env delete mode 100644 source/externals/g4tools/include/tools/randT delete mode 100644 source/externals/g4tools/include/tools/randd delete mode 100644 source/externals/g4tools/include/tools/randf delete mode 100644 source/externals/g4tools/include/tools/random delete mode 100644 source/externals/g4tools/include/tools/rroot/member_reader delete mode 100644 source/externals/g4tools/include/tools/rroot/tree_manip delete mode 100644 source/externals/g4tools/include/tools/rtausmed delete mode 100644 source/externals/g4tools/include/tools/sargs delete mode 100644 source/externals/g4tools/include/tools/serrno delete mode 100644 source/externals/g4tools/include/tools/sg/GL_plots_viewer create mode 100644 source/externals/g4tools/include/tools/sg/bcbk create mode 100644 source/externals/g4tools/include/tools/sg/cbks delete mode 100644 source/externals/g4tools/include/tools/sg/color create mode 100644 source/externals/g4tools/include/tools/sg/ecbk create mode 100644 source/externals/g4tools/include/tools/sg/event_dispatcher create mode 100644 source/externals/g4tools/include/tools/sg/light_off delete mode 100644 source/externals/g4tools/include/tools/sg/line_set create mode 100644 source/externals/g4tools/include/tools/sg/path create mode 100644 source/externals/g4tools/include/tools/sg/plotter_some_styles delete mode 100644 source/externals/g4tools/include/tools/sg/polyhedron create mode 100644 source/externals/g4tools/include/tools/sg/search delete mode 100644 source/externals/g4tools/include/tools/sg/set_plotter_camera delete mode 100644 source/externals/g4tools/include/tools/sg/sf_vec2f delete mode 100644 source/externals/g4tools/include/tools/sg/tessellate create mode 100644 source/externals/g4tools/include/tools/sg/write_paper delete mode 100644 source/externals/g4tools/include/tools/std_system delete mode 100644 source/externals/g4tools/include/tools/svalues delete mode 100644 source/externals/g4tools/include/tools/sys/dir delete mode 100644 source/externals/g4tools/include/tools/sys/process delete mode 100644 source/externals/g4tools/include/tools/system delete mode 100644 source/externals/g4tools/include/tools/test create mode 100644 source/externals/g4tools/include/tools/tokenize delete mode 100644 source/externals/g4tools/include/tools/utest delete mode 100644 source/externals/g4tools/include/tools/xpm delete mode 100644 source/externals/g4tools/src/csz_inflate.cc create mode 100644 source/externals/g4tools/src/dummy.cc delete mode 100644 source/externals/ptl/.clang-tidy delete mode 100644 source/externals/ptl/README.md delete mode 100644 source/externals/zlib/README delete mode 100644 source/g3tog4/README rename examples/extended/exoticphysics/channeling/include/Analysis.hh => source/global/management/include/G4PhysicsOrderedFreeVector.hh (90%) create mode 100644 source/graphics_reps/include/G4Plotter.hh delete mode 100644 source/graphics_reps/include/G4Scale.hh delete mode 100644 source/graphics_reps/include/G4Scale.icc create mode 100644 source/graphics_reps/src/G4Plotter.cc delete mode 100644 source/graphics_reps/src/G4Scale.cc delete mode 100644 source/interfaces/GAG/GNUmakefile delete mode 100644 source/interfaces/GAG/include/G4UIGAG.hh delete mode 100644 source/interfaces/GAG/include/G4UIGainServer.hh delete mode 100644 source/interfaces/GAG/sources.cmake delete mode 100644 source/interfaces/GAG/src/G4UIGAG.cc delete mode 100644 source/interfaces/GAG/src/G4UIGainServer.cc create mode 100644 source/particles/hadrons/ions/include/G4AntiDoubleHyperDoubleNeutron.hh create mode 100644 source/particles/hadrons/ions/include/G4AntiDoubleHyperH4.hh create mode 100644 source/particles/hadrons/ions/include/G4AntiHyperAlpha.hh create mode 100644 source/particles/hadrons/ions/include/G4AntiHyperH4.hh create mode 100644 source/particles/hadrons/ions/include/G4AntiHyperHe5.hh create mode 100644 source/particles/hadrons/ions/include/G4AntiHyperTriton.hh create mode 100644 source/particles/hadrons/ions/include/G4DoubleHyperDoubleNeutron.hh create mode 100644 source/particles/hadrons/ions/include/G4DoubleHyperH4.hh create mode 100644 source/particles/hadrons/ions/include/G4HyperAlpha.hh create mode 100644 source/particles/hadrons/ions/include/G4HyperH4.hh create mode 100644 source/particles/hadrons/ions/include/G4HyperHe5.hh create mode 100644 source/particles/hadrons/ions/include/G4HyperTriton.hh create mode 100644 source/particles/hadrons/ions/src/G4AntiDoubleHyperDoubleNeutron.cc create mode 100644 source/particles/hadrons/ions/src/G4AntiDoubleHyperH4.cc create mode 100644 source/particles/hadrons/ions/src/G4AntiHyperAlpha.cc create mode 100644 source/particles/hadrons/ions/src/G4AntiHyperH4.cc create mode 100644 source/particles/hadrons/ions/src/G4AntiHyperHe5.cc create mode 100644 source/particles/hadrons/ions/src/G4AntiHyperTriton.cc create mode 100644 source/particles/hadrons/ions/src/G4DoubleHyperDoubleNeutron.cc create mode 100644 source/particles/hadrons/ions/src/G4DoubleHyperH4.cc create mode 100644 source/particles/hadrons/ions/src/G4HyperAlpha.cc create mode 100644 source/particles/hadrons/ions/src/G4HyperH4.cc create mode 100644 source/particles/hadrons/ions/src/G4HyperHe5.cc create mode 100644 source/particles/hadrons/ions/src/G4HyperTriton.cc create mode 100644 source/persistency/ascii/include/G4tgrSolidMultiUnion.hh rename examples/advanced/gammaray_telescope/include/GammaRayTelParticles.hh => source/persistency/ascii/include/G4tgrSolidScaled.hh (68%) create mode 100644 source/persistency/ascii/src/G4tgrSolidMultiUnion.cc create mode 100644 source/persistency/ascii/src/G4tgrSolidScaled.cc delete mode 100644 source/physics_lists/constructors/decay/README delete mode 100644 source/physics_lists/constructors/electromagnetic/README delete mode 100644 source/physics_lists/constructors/factory/README delete mode 100644 source/physics_lists/constructors/gamma_lepto_nuclear/README delete mode 100644 source/physics_lists/constructors/hadron_elastic/README delete mode 100644 source/physics_lists/constructors/hadron_inelastic/README delete mode 100644 source/physics_lists/constructors/ions/README delete mode 100644 source/physics_lists/constructors/limiters/README delete mode 100644 source/physics_lists/constructors/stopping/README rename examples/basic/B3/B3b/include/B3Analysis.hh => source/processes/electromagnetic/dna/management/include/G4UserMeshAction.hh (78%) create mode 100644 source/processes/electromagnetic/dna/management/include/G4VDNAMolecularGeometry.hh rename examples/advanced/hadrontherapy/include/HadrontherapyAnalysis.hh => source/processes/electromagnetic/dna/management/include/G4VScavengerMaterial.hh (86%) create mode 100644 source/processes/electromagnetic/dna/models/include/G4DNAEventScheduler.hh create mode 100644 source/processes/electromagnetic/dna/models/include/G4DNAGillespieDirectMethod.hh create mode 100644 source/processes/electromagnetic/dna/models/include/G4DNAIRT_geometries.hh rename examples/advanced/gammaray_telescope/include/GammaRayTelEMstdPhysics.hh => source/processes/electromagnetic/dna/models/include/G4DNAUpdateSystemModel.hh (58%) rename examples/advanced/brachytherapy/include/BrachyAnalysisManager.hh => source/processes/electromagnetic/dna/models/include/G4VUpdateSystemModel.hh (86%) create mode 100644 source/processes/electromagnetic/dna/models/src/G4DNAEventScheduler.cc create mode 100644 source/processes/electromagnetic/dna/models/src/G4DNAGillespieDirectMethod.cc create mode 100644 source/processes/electromagnetic/dna/models/src/G4DNAIRT_geometries.cc create mode 100644 source/processes/electromagnetic/dna/models/src/G4DNAUpdateSystemModel.cc create mode 100644 source/processes/electromagnetic/dna/processes/include/G4DNAScavengerProcess.hh create mode 100644 source/processes/electromagnetic/dna/processes/src/G4DNAScavengerProcess.cc create mode 100644 source/processes/electromagnetic/dna/utils/include/G4DNAEventSet.hh create mode 100644 source/processes/electromagnetic/dna/utils/include/G4DNAMesh.hh create mode 100644 source/processes/electromagnetic/dna/utils/include/G4DNAScavengerMaterial.hh rename source/{visualization/VRML/src/G4VRML2.cc => processes/electromagnetic/dna/utils/include/G4VChemistryWorld.hh} (59%) create mode 100644 source/processes/electromagnetic/dna/utils/src/G4DNAEventSet.cc create mode 100644 source/processes/electromagnetic/dna/utils/src/G4DNAMesh.cc create mode 100644 source/processes/electromagnetic/dna/utils/src/G4DNAScavengerMaterial.cc rename examples/advanced/underground_physics/include/DMXAnalysisManager.hh => source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrKxsModel.hh (61%) rename source/processes/electromagnetic/{dna/molecules/management/src/G4FakeParticleID.cc => lowenergy/include/G4ANSTOecpssrLixsModel.hh} (51%) create mode 100644 source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrMixsModel.hh delete mode 100644 source/processes/electromagnetic/lowenergy/include/G4LivermoreComptonModifiedModel.hh delete mode 100644 source/processes/electromagnetic/lowenergy/include/G4LivermoreGammaConversionModelRC.hh create mode 100644 source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrKxsModel.cc create mode 100644 source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrLixsModel.cc create mode 100644 source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrMixsModel.cc delete mode 100644 source/processes/electromagnetic/lowenergy/src/G4LivermoreComptonModifiedModel.cc delete mode 100644 source/processes/electromagnetic/lowenergy/src/G4LivermoreGammaConversionModelRC.cc rename source/processes/electromagnetic/standard/include/{G4alphaIonisation.hh => G4IonICRU73Data.hh} (52%) create mode 100644 source/processes/electromagnetic/standard/src/G4IonICRU73Data.cc delete mode 100644 source/processes/electromagnetic/standard/src/G4alphaIonisation.cc create mode 100644 source/processes/electromagnetic/utils/include/G4EmSecondaryParticleType.hh rename source/{visualization/modeling/include/G4ScaleModel.hh => processes/electromagnetic/utils/include/G4LowEnergyEmProcessSubType.hh} (65%) rename environments/g4py/tests/gtest01/module/QPrimaryGeneratorAction.cc => source/processes/electromagnetic/xrays/include/G4GaussXTRadiator.hh (58%) create mode 100644 source/processes/electromagnetic/xrays/src/G4GaussXTRadiator.cc create mode 100644 source/processes/hadronic/cross_sections/include/G4ElNucleusSFcs.hh rename source/{visualization/FukuiRenderer/include/G4FukuiRendererViewer.hh => processes/hadronic/cross_sections/include/G4IonsShenCrossSection.hh} (52%) create mode 100644 source/processes/hadronic/cross_sections/src/G4ElNucleusSFcs.cc create mode 100644 source/processes/hadronic/cross_sections/src/G4IonsShenCrossSection.cc delete mode 100644 source/processes/hadronic/models/de_excitation/fission/include/G4ParaFissionModel.hh delete mode 100644 source/processes/hadronic/models/de_excitation/photon_evaporation/README-LevelGammaData delete mode 100644 source/processes/hadronic/models/im_r_matrix/README delete mode 100644 source/processes/hadronic/models/radioactive_decay/README_RDM rename source/processes/hadronic/models/radioactive_decay/include/{G4RadioactiveDecayBase.hh => G4RadioactiveDecay.hh} (94%) rename source/processes/hadronic/models/radioactive_decay/include/{G4RadioactiveDecayBaseMessenger.hh => G4RadioactiveDecayMessenger.hh} (88%) rename source/processes/hadronic/models/radioactive_decay/src/{G4RadioactiveDecayBase.cc => G4RadioactiveDecay.cc} (89%) rename source/processes/hadronic/models/radioactive_decay/src/{G4RadioactiveDecayBaseMessenger.cc => G4RadioactiveDecayMessenger.cc} (96%) create mode 100644 source/processes/management/include/G4NoProcess.hh delete mode 100644 source/processes/solidstate/phonon/README delete mode 100644 source/run/README.TXT delete mode 100644 source/tasking/README.md create mode 100644 source/tracking/include/G4VTrackingManager.hh delete mode 100644 source/visualization/FukuiRenderer/README delete mode 100644 source/visualization/FukuiRenderer/include/G4FRClientServer.hh delete mode 100644 source/visualization/FukuiRenderer/include/G4FRFeatures.hh delete mode 100644 source/visualization/FukuiRenderer/include/G4FukuiRenderer.hh delete mode 100644 source/visualization/FukuiRenderer/include/G4FukuiRendererSceneHandler.hh delete mode 100644 source/visualization/FukuiRenderer/include/G4VisFeaturesOfFukuiRenderer.hh delete mode 100644 source/visualization/FukuiRenderer/src/G4FRClientServer.cc delete mode 100644 source/visualization/FukuiRenderer/src/G4FukuiRenderer.cc delete mode 100644 source/visualization/FukuiRenderer/src/G4FukuiRendererSceneHandler.cc delete mode 100644 source/visualization/FukuiRenderer/src/G4FukuiRendererViewer.cc delete mode 100644 source/visualization/FukuiRenderer/src/G4VisFeaturesOfFukuiRenderer.cc delete mode 100644 source/visualization/HepRep/README delete mode 100644 source/visualization/HepRep/include/G4HepRepSceneHandler.hh delete mode 100644 source/visualization/HepRep/include/HEPREP/HasHepRep.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRep.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepAction.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepAttDef.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepAttValue.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepAttribute.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepAttributeListener.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepConstants.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepDefinition.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepFactory.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepFrameListener.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepInstance.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepInstanceTree.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepIterator.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepPoint.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepReader.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepSelectFilter.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepTreeID.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepType.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepTypeTree.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepViewer.h delete mode 100644 source/visualization/HepRep/include/HEPREP/HepRepWriter.h delete mode 100644 source/visualization/HepRep/include/HEPREP/Types.h delete mode 100644 source/visualization/HepRep/include/HEPREP/freehep-heprep.version delete mode 100644 source/visualization/HepRep/include/README delete mode 100644 source/visualization/HepRep/include/cheprep/AbstractXMLWriter.h delete mode 100644 source/visualization/HepRep/include/cheprep/BHepRepWriter.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRep.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepAction.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepAttDef.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepAttValue.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepAttribute.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepDefinition.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepFactory.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepInstance.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepInstanceTree.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepPoint.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepTreeID.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepType.h delete mode 100644 source/visualization/HepRep/include/cheprep/DefaultHepRepTypeTree.h delete mode 100644 source/visualization/HepRep/include/cheprep/DeflateOutputStreamBuffer.h delete mode 100644 source/visualization/HepRep/include/cheprep/GZIPOutputStream.h delete mode 100644 source/visualization/HepRep/include/cheprep/GZIPOutputStreamBuffer.h delete mode 100644 source/visualization/HepRep/include/cheprep/IndentPrintWriter.h delete mode 100644 source/visualization/HepRep/include/cheprep/XMLHepRepFactory.h delete mode 100644 source/visualization/HepRep/include/cheprep/XMLHepRepWriter.h delete mode 100644 source/visualization/HepRep/include/cheprep/XMLWriter.h delete mode 100644 source/visualization/HepRep/include/cheprep/ZipEntry.h delete mode 100644 source/visualization/HepRep/include/cheprep/ZipOutputStream.h delete mode 100644 source/visualization/HepRep/include/cheprep/ZipOutputStreamBuffer.h delete mode 100644 source/visualization/HepRep/include/cheprep/config.h delete mode 100644 source/visualization/HepRep/include/cheprep/freehep-cheprep.version delete mode 100644 source/visualization/HepRep/src/BHepRepWriter.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRep.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepAction.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepAttDef.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepAttValue.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepAttribute.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepDefinition.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepFactory.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepInstance.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepInstanceTree.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepPoint.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepTreeID.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepType.cc delete mode 100644 source/visualization/HepRep/src/DefaultHepRepTypeTree.cc delete mode 100644 source/visualization/HepRep/src/DeflateOutputStreamBuffer.cc delete mode 100644 source/visualization/HepRep/src/G4HepRep.cc delete mode 100644 source/visualization/HepRep/src/G4HepRepSceneHandler.cc delete mode 100644 source/visualization/HepRep/src/G4HepRepViewer.cc delete mode 100644 source/visualization/HepRep/src/GZIPOutputStream.cc delete mode 100644 source/visualization/HepRep/src/GZIPOutputStreamBuffer.cc delete mode 100644 source/visualization/HepRep/src/IndentPrintWriter.cc delete mode 100644 source/visualization/HepRep/src/README delete mode 100644 source/visualization/HepRep/src/XMLHepRepFactory.cc delete mode 100644 source/visualization/HepRep/src/XMLHepRepWriter.cc delete mode 100644 source/visualization/HepRep/src/XMLWriter.cc delete mode 100644 source/visualization/HepRep/src/ZipOutputStream.cc delete mode 100644 source/visualization/HepRep/src/ZipOutputStreamBuffer.cc delete mode 100644 source/visualization/OpenInventor/README.OIXExtendedViewer delete mode 100644 source/visualization/RayTracer/README create mode 100644 source/visualization/ToolsSG/src/G4ToolsSGQtViewer.cc delete mode 100644 source/visualization/VRML/g4vrmlview/Makefile delete mode 100644 source/visualization/VRML/g4vrmlview/README delete mode 100644 source/visualization/VRML/g4vrmlview/g4mini.java delete mode 100644 source/visualization/VRML/g4vrmlview/g4vrmlview.java delete mode 100644 source/visualization/VRML/g4vrmlview/sample.wrl delete mode 100644 source/visualization/VRML/include/G4FRClient.hh delete mode 100644 source/visualization/VRML/include/G4VRML1.hh delete mode 100644 source/visualization/VRML/include/G4VRML1FileSceneHandler.hh delete mode 100644 source/visualization/VRML/include/G4VRML1SceneHandler.hh delete mode 100644 source/visualization/VRML/include/G4VRML2.hh delete mode 100644 source/visualization/VRML/include/G4VRML2SceneHandler.hh delete mode 100644 source/visualization/VRML/include/G4VRML2Viewer.hh delete mode 100644 source/visualization/VRML/include/G4VRMLNetConfig.hh delete mode 100644 source/visualization/VRML/src/FRClient.cc delete mode 100644 source/visualization/VRML/src/G4FRClient.cc delete mode 100644 source/visualization/VRML/src/G4VRML1FileSceneHandler.cc delete mode 100644 source/visualization/VRML/src/G4VRML1FileViewer.cc delete mode 100644 source/visualization/VRML/src/G4VRML1SceneHandler.cc delete mode 100644 source/visualization/VRML/src/G4VRML1SceneHandlerFunc.icc delete mode 100644 source/visualization/VRML/src/G4VRML1Viewer.cc delete mode 100644 source/visualization/VRML/src/G4VRML2SceneHandler.cc delete mode 100644 source/visualization/VRML/src/G4VRML2Viewer.cc create mode 100644 source/visualization/Vtk/CMakeLists.txt rename {examples/extended/parameterisations/gflash/gflasha => source/visualization/Vtk}/History (51%) rename source/visualization/{VRML/include/G4VRML1File.hh => Vtk/include/G4Vtk.hh} (80%) rename source/visualization/{VRML/include/G4VRML1Viewer.hh => Vtk/include/G4VtkMessenger.hh} (72%) rename source/{analysis/factory/include/g4analysis.hh => visualization/Vtk/include/G4VtkQt.hh} (83%) rename source/visualization/{VRML/include/FRClient.h => Vtk/include/G4VtkQtSceneHandler.hh} (78%) rename source/visualization/{HepRep/include/G4HepRepViewer.hh => Vtk/include/G4VtkQtViewer.hh} (76%) create mode 100644 source/visualization/Vtk/include/G4VtkSceneHandler.hh create mode 100644 source/visualization/Vtk/include/G4VtkViewer.hh create mode 100644 source/visualization/Vtk/include/vtkTensorGlyphColor.h create mode 100644 source/visualization/Vtk/sources.cmake rename examples/advanced/gammaray_telescope/src/GammaRayTelGeneralPhysics.cc => source/visualization/Vtk/src/G4Vtk.cc (58%) create mode 100644 source/visualization/Vtk/src/G4VtkMessenger.cc create mode 100644 source/visualization/Vtk/src/G4VtkQt.cc rename examples/advanced/purging_magnet/include/PurgMagAnalysisManager.hh => source/visualization/Vtk/src/G4VtkQtSceneHandler.cc (70%) rename source/visualization/{VRML/src/G4VRML1.cc => Vtk/src/G4VtkQtViewer.cc} (50%) create mode 100644 source/visualization/Vtk/src/G4VtkSceneHandler.cc create mode 100644 source/visualization/Vtk/src/G4VtkViewer.cc create mode 100644 source/visualization/Vtk/src/vtkTensorGlyphColor.cxx delete mode 100644 source/visualization/gMocren/README create mode 100644 source/visualization/management/include/G4PlotterManager.hh rename environments/g4py/tests/g4pytest/ezgeom/EzDetectorConstruction.hh => source/visualization/management/include/G4VisCommandsPlotter.hh (60%) create mode 100644 source/visualization/management/src/G4PlotterManager.cc create mode 100644 source/visualization/management/src/G4VisCommandsPlotter.cc delete mode 100644 source/visualization/modeling/README rename source/visualization/{VRML/include/G4VRML1FileViewer.hh => modeling/include/G4PlotterModel.hh} (74%) rename source/visualization/modeling/src/{G4ScaleModel.cc => G4PlotterModel.cc} (64%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5830998689..7bcf17a4f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ endif() #----------------------------------------------------------------------- # - Define CMake requirements and override make rules as needed # -cmake_minimum_required(VERSION 3.12...3.20 FATAL_ERROR) +cmake_minimum_required(VERSION 3.16...3.21) # - Make overrides for default flags, so they appear in interfaces set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX @@ -27,7 +27,9 @@ set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX # Version handled manually as project(... VERSION ...) is not used # in tests/examples which are subprojects. All calls must use # the same form. -project(Geant4) +project(Geant4 + DESCRIPTION "C++ toolkit for simulating the passage of particles through matter" + HOMEPAGE_URL "https://geant4.cern.ch") set(${PROJECT_NAME}_VERSION_MAJOR 11) set(${PROJECT_NAME}_VERSION_MINOR 0) set(${PROJECT_NAME}_VERSION_PATCH 0) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index d43fec363f..3a77c3a84c 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -1,6 +1,6 @@ Contributing to Geant4 ===== -To contribute patches to Geant4, users can submit Pull Requests (PR) such that: +To contribute patches to Geant4, users can submit normal GitHub Pull Requests (PR) such that: - A single PR refers to a single particular topic (fix or suggested enhancement); PRs including uncorrelated changes in codes in different areas or modules will @@ -10,10 +10,12 @@ A PR will be examined by a responsible and eventually extracted for a patch in the development repository of Geant4, to be included in a future release or patch. -For simple bug-fixes, it is anyhow recommended to use the official -Bugzilla problem reporting system. -- Problem reports: `Bugzilla problem reporting system `_. -- User Forum: `Geant4 Forum `_. -- Documentation: `User Documentation `_. +For simple bug-fixes, it is still recommended to use the official Bugzilla problem reporting system +to report the issue, linking back to the Pull Request if created: -The Geant4 Collaboration +- Problem reports: `Bugzilla problem reporting system `_. + +Questions on Geant4 itself or feature requests should be made through our `User Forum `_, +and `full documentation on use of the toolkit is online `_. + +The Geant4 Collaboration \ No newline at end of file diff --git a/README.rst b/README.rst index 3424192f58..e0440db0bb 100644 --- a/README.rst +++ b/README.rst @@ -1,8 +1,41 @@ ===== -Geant4: A Simulation Toolkit +Geant4: A Simulation Toolkit ===== -- Problem reports: `Bugzilla problem reporting system `_. -- User Forum: `Geant4 Forum `_. -- Documentation: `User Documentation `_. +Geant4 is a toolkit for the simulation of the passage of particles through matter. +Its areas of application include high energy, nuclear and accelerator physics, as well +as studies in medical and space science. + +For more information about how to use Geant4 and its application domains, please visit +`the Geant4 website `_ + +There are three main reference papers for Geant4: + +- `Nuclear Instruments and Methods in Physics Research A 835 (2016) 186-225 `_ +- `IEEE Transactions on Nuclear Science 53 No. 1 (2006) 270-278 `_ +- `Nuclear Instruments and Methods in Physics Research A 506 (2003) 250-303 `_ + +===== +Installation +===== +For detailed instructions on building and installing Geant4, including all +supported platforms and configuration options, please refer to +the `Installation Guide `_. + +===== +Questions, Bugs, and Requirements +===== +Full documentation on Geant4, including installation, use of the toolkit in applications, +physics lists, and physics model implementations, can be found on the `User Documentation Site `_. + +If you have a question about, or issue using, Geant4, please post on our `User Forum `_ +in the Category and Section relevent to your problem. The forum is `fully searchable `_ +so it's possible your question may already have been answered. + +If you think you have found a bug in Geant4, please open a ticket on our `Bugzilla Tracker `_. + +===== +Contributing to Geant4 +===== +Please see the main `Contribution Guide <./CONTRIBUTING.rst>`_. diff --git a/ReleaseNotes/Beta4.11.0-1.txt b/ReleaseNotes/Beta4.11.0-1.txt index 63ba01632a..69b0fbbf87 100644 --- a/ReleaseNotes/Beta4.11.0-1.txt +++ b/ReleaseNotes/Beta4.11.0-1.txt @@ -707,8 +707,6 @@ List of features and fixes included in this Beta release since 10.7.p02: o Added G4HadronInelasticProcess class from hadronic/management module. o Renamed G4HadronCaptureProcess as G4NeutronCaptureProcess, as it is applied only for neutron projectile. - o Renamed G4HadronFissionProcess as G4NeutronFissionProcess, as it is - applied only for neutron projectile. o Removed use of deleted header file G4HadronicDeprecate. o G4HadronCaptureProcess: removed old and unused header file corresponding to the Gheisha capture cross-section (that has been @@ -980,14 +978,14 @@ List of features and fixes included in this Beta release since 10.7.p02: o Removed obsolete class CMSEmStandardPhysicsHcal. o FTFPCMS_BERT_EMM: use correct combination of physics constructors. o Removed use of obsolete RanecuEngine. Updated CMS EM physics. + + advanced/ICRP110_HumanPhantoms + o Introduced ICRP110PhantomVisAction. Updated vis.mac which shows + how to activate it. + advanced/iort_therapy o Removed dependency on G4EmProcessOptions. o Removed SetCuts() from the local PhysicsList. o Set cuts per region in ConstructProcess(). RegionStore is not available when accessed from the constructor of the Physics List. - + advanced/ICRP110_HumanPhantoms - o Introduced ICRP110PhantomVisAction. Updated vis.mac which shows - how to activate it. + advanced/microbeam o Added initialisation of 'fDose3DDose' and 'fMapVoxels' in the constructor of the RunAction class. diff --git a/ReleaseNotes/Patch4.10.7-3.txt b/ReleaseNotes/Patch4.10.7-3.txt new file mode 100644 index 0000000000..0327be7a0a --- /dev/null +++ b/ReleaseNotes/Patch4.10.7-3.txt @@ -0,0 +1,158 @@ + + Geant4 10.7 - patch-03 Release Notes + ------------------------------------ + + 19 November 2021 + +List of fixes included in this public patch since the public release 10.7.p02: + + o Configuration + ------------- + + CMake: + o Renamed Geant4::HDF5 to hdf5::hdf5 to be compatible with imported + targets provided since CMake 3.20. Addressing problem report #2426. + + o Environments: + ------------ + + G4py + o Removed binding to obsolete member functions of G4Sphere and G4Tubs. + + o Geometry: + -------- + + divisions: + o Make G4PVDivision and G4ReplicatedSlice inherit from G4PVReplica + rather than G4VPhysicalVolume, in order to have instances properly + cloned in MT mode. + o Fixed bug in G4ParameterisationTrd for positioning calculation. + Debug messages cleanup. + + management: + o Provide operator<<() as a free function for G4UAdapter to support + Geant4Py. + + navigation: + o G4PhantomParameterisation: reduced warning messages in GetReplicaNo() + function; issue warning only when difference is bigger than + 'kCarTolerance'. Addressing problem report #2314. + + solids/Boolean: + o In G4BooleanSolid, use G4RecursiveMutex in place of G4Mutex in + GetPolyhedron() to avoid potential deadlocks in visualisation + in recursive Boolean operations. + + solids/specific: + o More accurate calculation of distance from point to triangle + in G4TriangularFacet. Addressing problem report #2401. + o Added missing accessor in G4UTet. + + volumes: + o Use same strategy for cloning solids for replicated volumes types in + G4GeometryWorkspace (required for having proper treatment of divided + volumes). Cleanup of unused verbose printouts. + o G4PVReplica: moved internal defines for MT split data to source. + Avoid deletion of rotation matrix for replication in Phi in destructor + as not necessary. Some code cleanup. + + o Global: + ------ + + Updated date and version for 10.7.p03. + + o Materials: + --------- + + Corrected calculations in G4DensityEffectCalculator. + Addressing problem report #2330. + + G4IonisParamMat: return exact computations according to the original + publication. Addressing problem report #2334. + + o Parameterisations/gflash + ------------------------ + + Fixes in GFlashSamplingShowerParameterisation in the parameters + definition. + + o Persistency: + ----------- + + ASCII: + o Change prefix to free math functions in G4tgrEvaluator source, to avoid + potential clashes with system functions carrying same name/signature. + Addressing problem report #2444. + + GDML + o G4GDMLWriteStructure: added fatal exception in AssemblyWrite() for the + case of nested assemblies, not yet supported for exporting. + o G4GDMLParser: added utility method to retrieve a generic physical + volume by its name. + + o Physics Lists: + ------------- + + constructors/gamma_lepto_nuclear + o G4EmExtraPhysics: enable synchrotron radiation only for really stable + particles. Fixed typo in registering positron-nuclear process; register + model for e-/e+-nuclear in case of general processes, avoid registering + synchroton radiation twice for e-/e+. + + o Processes - Electromagnetic: + --------------------------- + + standard + o G4BetheBlochModel: fixed computation of dedx for alpha if ICRU90 data + are used. Addressing problem report #2414. + + utils + o Fix in G4OpticalParametersMessenger for UI command changing incorrect + parameter. Addressing problem report #2392. + + xrays + o G4Cerenkov: added protection against too small steps (still addressing + problem report #1992). + o G4GaussXTRadiator, G4VXTRenergyLoss: added Gauss-distributed regular + radiator and accessors for angle distribution range. + + o Processes - Hadronic: + -------------------- + + cross_sections + o G4NeutronCaptureXS: fixed bug in isotope data access. + + models/de_excitation + o In G4PhotonEvaporation, changed de-excitation logic from levels, which + has no data on transitions: instead of transition to closest level + continue transition is performed. + Attempting fix for problem report #2434, by reducing production of + fragments with high excitation and high angular momentum. + + models/particle_hp + o Bug fix in G4ParticleHPLabAngularEnergy. + + models/util + o G4SampleResonance: bug-fix in the method GetMinimumMass() in the use + case rare and light decay channels (e.g. e+ e-) are included for + hadronic resonances. Addressing problem report #2299. + + o Run + --- + + G4VModularPhysicsList: fixed destruction of the vector of + G4VPhysicsConstructor for the case when physics list is created + but physics is not built. + + o Tracking + -------- + + G4SteppingManager: Making sure Transportation limits the step if a volume + boundary in a parallel world is co-limiting the step. + Addressing problem report #2240. + + o Examples: + -------- + + advanced/ICRP110_HumanPhantoms: + o Updated URL for data download. + + advanced/STCyclotron: + o Added protection against potential division by zero in function + STCyclotronRun::EndOfRun(). + + extended/hadronic: + o Hadr01: in HistoManager, DetectorConstruction and DetectorMessenger + corrected counting of leaking neutrons. + Addressing problem report #2441. + + extended/persistency: + o G01: Fixed minor overlaps in assembly.gdml and axes.gdml samples. + o G02, G03: Fixed visualisation settings in input macros. + + ---------------------------------------------------------------------------- + + Technical Notes + --------------- + + o This patch should be applied on top of release 10.7 or 10.7.p01/p02. + o Technical notes distributed for release 10.7 are also applicable and + valid for this patch. + +The code and rebuilt binary libraries for release 10.7.p03 are available +through the Geant4 "Download" Web page. + +Please refer to the Geant4 User Documentation for further information about +using Geant4. diff --git a/ReleaseNotes/ReleaseNotes.11.0.html b/ReleaseNotes/ReleaseNotes.11.0.html new file mode 100644 index 0000000000..fbbf80350c --- /dev/null +++ b/ReleaseNotes/ReleaseNotes.11.0.html @@ -0,0 +1,3404 @@ + + +Geant4 11.0 Release Notes + + + +

+
+

+ +

+ +Geant4 11.0 Release Notes + + + + +
+ +December 10th, 2021 + +
+ +

+


+

+The code and binary libraries for the supported systems are available +through our Source +Code Web page. +

+

+We are grateful for the efforts of Geant4 users who have provided + detailed feedback or comprehensive reports of issues. + We thank in particular those who have contributed corrections, + improvements or developments included in this release. +

+

+Please refer to the +Geant4 +User Documentation for further information about using Geant4. +

+ +

Contents

+
    +
  1. Supported and Tested Platforms
  2. +
  3. Supported CLHEP and VecGeom versions
  4. +
  5. Items for migration of the user code
  6. +
  7. New Developments and Capabilities
  8. +
  9. Expected effects on physics and performance
  10. +
  11. Known Run-Time Problems and Limitations
  12. +
  13. Compilation Warnings
  14. +
  15. Geant4 Software License
  16. +
  17. Detailed list of changes and fixes
  18. +
  19. Appendix
  20. +
+ +

+ +
+ + + +

1. Supported and Tested Platforms

+ +Platforms: +
    +
  • Linux, gcc-8.3.1.
    + Tested on 64 bit architectures (Intel or AMD) with + CERN CentOS Linux 8 (CC8) (based on CentOS Linux 8).
  • +
  • macOS 12.01 Monterey with Apple LLVM/Clang-13.
    + Tested on 64 bit architectures (Intel or Apple Silicon).
  • +
  • Windows-10 with Visual C++ 14.29 (Visual Studio 2019).
  • +
+ +More verified and tested configurations (64 bits): +
    +
  • Linux, gcc-9.3/10.2/11.2, clang-9/10/11
  • +
  • Linux, Intel-icc 2021.4
  • +
  • macOS 10.15 Catalina with Apple LLVM/Clang-12
  • +
  • macOS 11.6 Big Sur with Apple LLVM/Clang-12
  • +
+ +

+ +
+ + + +

2. Supported CLHEP and VecGeom versions

+ +This release of Geant4 requires and has been verified with +CLHEP, release 2.4.5.1. +Use of a different CLHEP version may cause incorrect simulation results.
+NOTE: an internal module of the relevant CLHEP classes is provided and can be +used as alternative to an external CLHEP library installation.
+A configuration option allows a Geant4 installation to use the +VecGeom Library +primitives, to replace the original Geant4 solids. VecGeom version +1.1.18 is required when using such configuration. + +

+ +
+ + + +

3. Items for migration of the user code

+ +Listed here is some relevant information on developments included in this +release. +Note that for all users a full re-installation of libraries (or a full +re-compilation) and a re-compilation of user applications is required. + +

+General +

+
    +
  • Simplified G4String interfaces and implementation with C++11/17. + Removed obsolete/std::string synonym member functions and deprecated + non-std::string member functions, replacing with new free functions in + G4StrUtil namespace. Might require user code adaptation where G4String + functions are explicitly used; for details see + Section 10 of this document.
  • +
  • Major update the G4PhysicsVector and related classes; introduced new public + access methods; removed obsolete unused methods; introduced possibility to + use different Spline methods.
  • +
  • Removed deprecated classes G4LPhysicsFreeVector and G4PhysicsLnVector; + redirect G4PhysicsOrderedFreeVector to G4PhysicsFreeVector.
  • +
  • New version of G4PhysicsModelCatalog, the catalog of physics models. + Introduced a modelID (a unique integer for each physics model, with close + values for similar/related physics models), besides an index (the position + in a vector) and the name (string) of the model. The main difference with + respect to the previous version is that the three identifiers of each + physics model - modelID, index and name - must stay constant and the same + for all applications, physics lists and future versions of Geant4.
  • +
  • C++17 is the minimum ISO C++ Standard required to compile Geant4 and all + applications using it.
  • +
  • Multithreading support is now enabled in the build of Geant4 by default.
  • +
  • CMake 3.16 is the minimum version required to build Geant4.
  • +
+ +Analysis +
    +
  • Major revision in analysis classes. Migration to G4ThreadLocalSingleton + in all specific analysis manager and reader classes. The singleton instances + are now deleted by the Geant4 kernel; their explicit deletion in client code + has to be removed.
  • +
  • New G4AnalysisReader.hh header, defining G4AnalysisManager as + G4GenericAnalysisManager; G4GenericAnalysisManager can handle all supported + file formats, so file names should be provided with an extension (.csv, + .hdf5, .root or .xml). To continue using file names without extensions, + users can set the default file type using the new function + SetDefaultFileType(...). Output specific headers have been removed.
  • +
  • Also removed g4analysis.hh header with the G4Analysis::MasterInstance() + factory method.
  • +
  • Added new G4VAnalysisReader public function CloseFiles() to be called by + user before the end of program and its implementation for all readers.
  • +
+ +

+Geometry, Fields and Transportation +

+
    +
  • Removed deprecated accessors in G4Sphere and G4Tubs.
  • +
  • G4[Partial]PhantomParameterisation: renamed Get/SetNoVoxel*() accessors + to Get/SetNoVoxels*() for coherence. Might imply user code migration.
  • +
+ +

+Electromagnetic and optical physics +

+
    +
  • G4EmProcessOptions class has been removed. Adaptation of custom user made + physics-lists may be required.
  • +
  • Removed deprecated material properties for G4Scintillation. Now + the "enhanced" time constants of version 10.7 are the only way to specify + scintillation properties.
  • +
  • Added protection against typos in material property names. To create a + user-defined material property (or material constant property), add the + createNewKey=true argument to Add(Const)Property().
  • +
  • Removed redundant optical UI commands.
  • +
+ +

+Hadronic physics configuration +

+
    +
  • Constructors for inelastic processes have changed signature, as well + as for elastic and inelastic cross-sections.
    + This affects the internal configuration in physics-lists. + See the details in Section 10 + of this document, for the required adaptations in custom + physics-lists.
  • +
  • Deprecated environmental variables used in NeutronHP, ParticleHP and + Radioactive Decay have been removed: they have been replaced by equivalent + UI commands (already introduced in previous versions).
  • +
+ +

+Visualization and Modeling +

+
    +
  • As of this release, the recommended and supported Open Inventor driver + will be the Qt-based one (OIQt viewer option). The Xt/Xm drivers (OIX, + OIXE) are still available but are deprecated and will be removed in the + next release.
  • +
  • Qt drivers require the Qt-5 platform. Qt-6 is not yet supported.
  • +
  • The G4VModel interface has been simplified. Responsibility for transformation + and extent has been delegated to individual models. For example, there is no + longer a method G4VModel::GetTransformedExtent(), the concrete model is + required to maintain the extent depending on the transformation (if any) and + a simple GetExtent() returns the current extent.
  • +
+ +

+Data Sets +

+
    +
  • This release introduces new data set versions. + Please see the corresponding details in + Section 9 of this document. +
      +
    • New data set versions: G4EMLOW-8.0, G4PARTICLEXS-4.0.
    • +
    • In order to use ParticleHP for charged particles + (protons, deuterons, tritons, He3 and alphas), an optional data + set G4TENDL-1.4 is required, and can be optionally + downloaded in addition.
    • +
  • +
+ + +
+ + + +

4. New Developments and Capabilities

+ +General +
    +
  • Tasking system, based on PTL (Parallel Tasking Library) v2.0.0, is set + as default parallelism scheme for multi-threading. A dedicated run manager + (G4TaskRunManager) and factory (G4RunManagerFactory) are provided, + enabling use of tasks for the event loop. + The tasking system is fully compatible with Intel TBB, which can be + selected if GEANT4_USE_TBB=ON is specified when configuring CMake. The + default behavior for tasking is to submit the tasks to an internal + thread-pool and task-queue.
  • +
  • New G4SteppingVerboseWithUnits class, an alternative to G4SteppingVerbose + with printout of proper units. Simplified way of defining a user-specific + stepping verbose, that is now common to all sequential, MT and tasking + modes.
  • +
  • Introducing G4VTrackingManager, an interface for custom tracking + managers specialized for one or a small number of particle types. + Custom tracking manager is used in G4VUserPhysicsList, if registered. + G4EventManager hands over tracks to custom tracking manager, if registered + for the particle.
  • +
  • Added new Ranlux++ engine to the list of supported random engines.
  • +
  • G4String provides a new G4StrUtil namespace with functions for + simple string manipulation, including left/right stripping, case + conversion, and searching.
  • +
+ +Analysis +
    +
  • New public functions G4VAnalysisManager::Reset() and Clear() allowing + resetting and deleting all allocated analysis objects and clearing + their collections.
  • +
  • Added support for n-tuple columns of string vectors via new public + functions in G4VAnalysisManager and G4VAnalysisReader
  • +
  • Implemented support for file system directories with Csv output. The + histogram and n-tuple files are saved in directories, if their names are + set and if the directories exist in the file system.
  • +
+ +Digitization, Hits & Scoring +
    +
  • Extended cylindrical scoring mesh to tube and tube segment.
  • +
+ +Geometry and Field +
    +
  • Added maps for faster search based on name in solids, regions and + volumes stores.
  • +
  • Enabled use of alternative G4VoxelNavigation class, allowing the possibility + to use alternative navigation algorithms for voxelised/optimised geometries.
  • +
  • Added new example demonstrating interface with VecGeom navigator (Beta).
  • +
+ +Materials +
    +
  • Revised and updated G4Exceptions in G4Material, now providing more complete + information and better diagnostics.
  • +
  • Updated G4Material: use const pointers to G4Elements where needed.
  • +
  • New class G4OpticalMaterialProperties, a store for optical material properties + and allow use of predefined optical material properties.
  • +
  • In G4MaterialPropertiesTable, the use of std::vector for material + properties and material const properties, rather than std::map, + eliminates the need to find the map entry.
  • +
+ +Electromagnetic physics +
    +
  • General code cleanup in EM modules; removed obsolete models and processes, + removed G4EmProcessOptions class.
  • +
  • Updates to G4GammaGeneralProcess: exclude gamma-nuclear from the 2nd + energy area.
  • +
  • Fixed model per region definition for all base processes G4VEmProcess, + G4VMultipleScattering, G4VEnergyLossProcess; removed sub-cut facility + for energy loss processes but left G4VSubCutProducer interface.
  • +
  • Updated EM integral approach by introduction of a cross-section shape type + including cross-section shape with 2 maxima.
  • +
  • Reviewed EM part of G4PhysicsModelCatalog to adopt new numbering convention. + Created new enum for low-energy electromagnetic process sub-types.
  • +
  • Updated G4UrbanMscModel to not apply energy correction at small steps + below 1% of a particle range.
  • +
  • G4VEmFluctuationModel: changed interface; both cut value and max energy + transfer are parameters of main methods.
  • +
  • In G4UniversalFluctuation, substantially simplified sampling algorithm + for faster computation.
  • +
  • Updated Livermore models to use EPICS2017 data.
  • +
  • Included new PIXE data libraries following ANSTO recommendations.
  • +
  • New data structure for ICRU73 and ICRU90 ion stopping power data shared + between threads and used in G4LinhardSorensenIonModel.
  • +
  • Implement and use base material approach only if base materials are defined, + this should bring a minor speedup of the code and little reduction of memory.
  • +
  • Enable synchrotron radiation only for electrons, positrons, muons, protons, + and anti-protons.
  • +
  • Introducing quantum entanglement of e+ annihilation. Currently implemented + only in G4eplusAnnihilation and G4LivermorePolarizedComptonModel.
  • +
  • New class G4OpticalMaterialProperties, a store for optical material + properties and allow use of predefined optical material properties.
  • +
  • Added new IRT-syn model for DNA.
  • +
+ +Hadronic physics +
    +
  • General code clean-up in hadronic processes and models; removed obsolete + and deprecated classes; removed obsolete "rpg" model.
  • +
  • Introduced a new threshold parameter in radioactive-decay for analogue mode + to kill very long radioactive decays at rest of nuclides happening later + than such threshold.
  • +
  • Introduced six light hypernuclei and their corresponding antiparticles + (for the time being, only electromagnetic interactions of these particles + are available, but switched off by default).
  • +
  • Extended the interface of hadronic models for projectile hypernuclei and + anti-hypernuclei (but not yet hadronic physics for these particles).
  • +
  • Added implementation of hypercluster emission in INCLXX.
  • +
  • Extended interface of the Fritiof (FTF) string model to get the number of + projectile/target spectator nucleons, number of nucleon-nucleon collisions + and impact parameter (see example Hadr09).
  • +
+ +Physics Lists +
    +
  • Updated physics lists to use a uniform approach for verbosity.
  • +
  • Electromagnetic physics for light hypernuclei (switched off by default) + can be enabled on top of any Physics Lists via C++ interface + (G4HadronicParameters::Instance()->SetEnableHyperNuclei(true)).
  • +
  • ANSTO data option for atomic de-excitation can be enabled on top of any + physics lists using C++ interface or better via UI command.
  • +
  • EPICS2017 parameterisations for Livermore gamma processes can be enabled.
  • +
  • Positron anihilation to the tau pair can be enabled.
  • +
  • LinhardSorensenIonModel is available with G4EmStandardPhysicsWVI + constructor.
  • +
+ +Visualization and Interfaces +
    +
  • New ToolsSG (TSG) visualisation package based on g4tools, providing four + new (mutually exclusive) visualisation drivers: TOOLSSG_X11_GLES, + TOOLSSG_WINDOWS_GLES, TOOLSSG_XT_GLES and TOOLSSG_QT_GLE.
  • +
  • New VtkQt and VtkNative visualisation drivers.
  • +
  • Introducing in-app plotting with visualization and related UI command.
  • +
  • Introducing G4Mesh, a light class that encapsulates and validates + visualisation of a nested parameterisation.
  • +
  • Extended G4UIWin32 driver with new features.
  • +
  • Revised all visualisation models, to have G4PhysicalVolumeModel taking + care of the transformation of any primitives that it generates.
  • +
  • Removed obsolete network visualisation options for VRML driver + and FukuiRenderer driver.
  • +
  • Removed obsolete GAG/Gain/MOMO and HepRep(WIRED) modules/driver.
  • +
  • Removed deprecated functions in visualization.
  • +
+ +Examples +
    +
  • CaTS - New application implementing a flexible and extendable + framework for the simulation of calorimeter and tracking detectors. + It also demonstrates how to use + Opticks + for the creation and propagation of optical photons.
  • +
  • pythia/py8decayer - New example demonstrating how to outfit + Pythia8-based decay features to those resonances in Geant4 where decay + tables are not implemented by default. In addition, it shows how to + replace existing Geant4 decay tables to such resonances as tau+/- + or B+/- with the Pythia8-based ones.
  • +
  • geometry/VecGeomNavigation - New example demonstrating integration + of VecGeom navigation, based on the prototype package G4VecGeomNav, being + integrated in the example at build time.
  • +
  • hadronic/Hadr05 - New example demonstrating how to collect energy + deposition in a sampling calorimeter and how to survey energy flow.
  • +
  • hadronic/Hadr10 - New hadronic example aimed to exercise the decay + of tau leptons, as well as charmed and bottom hadrons.
  • +
  • parameterisations/Par04 - New example demonstrating how to use the + Machine Learning (ML) inference to create energy deposits as a fast + simulation model using ONNX runtime and LWTNN libraries.
  • +
  • runAndEvent/RE07 - New example demonstrating how to register + specialized tracking managers for a particle or a set of particles.
  • +
  • dna/AuNP - New example simulating the track-structure of electrons + in microscopic gold volume. Also simulating that in liquid water + medium surrounding the gold volume.
  • +
  • dna/scavenger - New example showing how to activate the scavenging + process in chemistry using the deterministic treatment of the IRT + model.
  • +
  • visualization/movies - New example illustrating how to make a movie + with /vis/viewer/save and /vis/viewer/interpolate UI + commands.
  • +
+ + +
+ + + +

5. Expected effects on physics and computing performance

+ +Geometry +
    +
  • Use G4Allocator to dynamically allocate nodes and proxies for the voxels + optimisation structure. Should help reducing memory fragmentation.
  • +
+ +Electromagnetic physics +
    +
  • Expected few % speed-up for EM simulations. Stable results for calorimeters + compared with the previous versions 10.6 or 10.7.
  • +
+ +Hadronic physics +
    +
  • Stable results with respect to version 10.7 are expected in general for + all hadronic physics observables, in particular for hadronic showers + in calorimeters.
  • +
+ +

+ +
+ + + +

6. Known Run-Time Problems and Limitations

+For a complete list of outstanding run-time problems and to submit any +problem you may find while running this version of Geant4, please refer +to the +Geant4 Problem +Reporting System. + +

+ +
+ + + +

7. Compilation Warnings

+ +There may be a few compilation warnings on some platforms. +We do not believe that any of these lead to incorrect run-time behaviour. + +

+ +
+ + + +

8. Geant4 Software License

+ +A Software License applies to the Geant4 code. +Users must accept this license in order to use it.
+The details and the list of copyright holders is available at +http://cern.ch/geant4/license +and also in the text file LICENSE distributed with the source code. + +

+ +
+ + + +

9. Detailed list of changes and fixes

+ +These are the main new features/fixes included in this release since the +last patched public release (for more detailed lists of fixes/additions, +please refer to the corresponding History files provided in most packages): + +

+ + +

Configuration

+
    +
  • CMake +
      +
    • Updated minimum required CMake version to 3.16, with 3.16 to 3.21 + as confirmed working range.
    • +
    • Updated default build settings, GEANT4_BUILD_MULTITHREADED is now + set ON by default.
    • +
    • Updated default build settings, GEANT4_BUILD_BUILTIN_BACKTRACE is now + set ON by default.
    • +
    • Deprecated use of GEANT4_BUILD_CXXSTD in favour of CMAKE_CXX_STANDARD + to choose C++ Standard to compile against.
    • +
    • Requiring C++17 as minimum standard to compile Geant4.
    • +
    • Added support for compilation against C++23 with CMake 3.20 and newer + (note that Geant4 is not yet tested or supported using C++23).
    • +
    • Removed obsolete -stdlib flag for AppleClang.
    • +
    • Added preliminary support for sanitizer builds with advanced option + GEANT4_BUILD_SANITIZER to allow selection of one of address, thread, + or undefined sanitizer. The default is no sanitization. + Adds appropriate flags to CMAKE_CXX_FLAGS.
    • +
    • Removed settings of deprecated PHP_AS_HP environmental variable.
    • +
    • Removed obsolete GEANT4_USE_SYSTEM_CLHEP_GRANULAR option.
    • +
    • Updated CLHEP minimum required version to 2.4.5.1.
    • +
    • Updated VecGeom minimum required version to 1.1.18 for optional + build with VecGeom solids.
    • +
    • Updated builtin PTL module to version v2.0.0.
    • +
    • Added GEANT4_USE_PTL_LOCKS option to configure builtin PTL with mutex + locking in task subqueues.
    • +
    • Added GEANT4_USE_TOOLSSG option for enabling new ToolsSG visualisation + driver and selecting the backend (X11, Motif, Qt, or Windows).
    • +
    • Added GEANT4_USE_VTK advanced option for enabling new experimental + VTK based visualisation driver.
    • +
    • Removed all references to obsolete Wt visualisation driver and + dependencies.
    • +
    • Removed obsolete options for VRML and FukuiRenderer network/sockets + visualisation drivers.
    • +
    • Added FindPythia8.cmake script for use in examples.
    • +
    • Removed obsolete FindAIDA.cmake module, no longer used in examples.
    • +
    • Added geant4.bat, geant4-config.cmd prototypes for setting up + environment variables and querying a Geant4 install on Windows.
    • +
    • Added XercesC library directory to Linux LD_LIBRARY_PATH for GNUmake.
    • +
    • Updated CPack source packaging, including standardisation of naming + following open source conventions and use XZ compression instead of + BZIP.
    • +
    • Updated data-sets versions.
    • +
  • +
  • GNUMake +
      +
    • Moved default to C++17 Standard.
    • +
    • Updated compiler/link flags for migration of g4tools to externals + category.
    • +
    • Added comctl32.lib to UI32LIBS for WIN32-VC configuration.
    • +
    • Updated default Qt5 include paths for Linux targets.
    • +
    • binmake.gmk: removed include path to "rpg" hadronic model, now retired. + Removed include paths to hadronic/models/management + and hadronic/models/util modules, now retired.
    • +
    • Removed obsolete network visualisation options for VRML driver + and FukuiRenderer driver.
    • +
    • Removed obsolete GAG/Gain configuration.
    • +
    • Removed no longer needed link to libXi in all configurations.
    • +
    • Check for existence of lib64 directory for Xerces-C on Linux.
    • +
    • Add 'c' flag to ar to suppress diagnostics going to stderr.
    • +
  • +
+ + +

Analysis

+
    +
  • Migration to G4ThreadLocalSingleton in all specific analysis manager + and reader classes. The singleton instances are now deleted by the Geant4 + kernel; their explicit deletion in client code has to be removed.
  • +
  • Added public function G4VAnalysisManager::Clear() that deletes all allocated + analysis objects and clears their collections. This function should be used + as a replacement for deleting the analysis manager in the applications that + allocate the analysis data in begin of run and deleted the analysis manager + in end of run.
  • +
  • Added public function G4VAnalysisManager::Reset(), needed when calling files + are closed without reset by calling CloseFile(false) from the analysis + manager, see basic/exampleB5 with interactive plotting.
  • +
  • Added support for n-tuple columns of string vectors via new public + functions in G4VAnalysisManager and G4VAnalysisReader. + Added support for Xml, Hdf5 output types: added helper code for Xml + reader, no update needed for Hdf5.
  • +
  • Implemented support for file system directories with Csv output + as proposed in + GitHub PR #32.
  • +
  • Fixed reading objects from files with directories (Root, Hdf5).
  • +
  • Implemented missing WriteOnAscii() for h2,h3,p1,p2.
  • +
  • Added new G4ToolsAnalysisManager::IsEmpty() function. +
  • Added new G4VAnalysisReader public function CloseFiles() to be called by + user before the end of program and its implementation for all readers.
  • +
  • Replaced the explicit Write[Hn|Pn] functions in the analysis managers + by a common implementation in G4ToolsAnalysisManager::WriteImpl() and + Merge() using the new Hn file manager classes introduced for the generic + file manager. The same code is now used for writing histograms/profiles + by specific analysis managers and the generic analysis manager.
  • +
  • Replaced the explicit Read[Hn|Pn] functions in the analysis readers + by a common implementation in G4ToolsAnalysisReader using the newly + introduced Hn file manager classes for reading.
  • +
  • Separated Hn/Pn object file handling from output specific analysis readers + in Hn file manager classes for reading (G4XHnRFileManager).
  • +
  • Separated ReadNtuple functions from the analysis readers in + the RNtuple manager classes.
  • +
  • Added G4ToolsAnalysisMessenger that implements "get" commands + /analysis/hn|pn/get id.
  • +
  • Reimplemented utility functions GetBaseName(), GetExtension() using + filesystem library.
  • +
  • Removed 'isMaster' argument from managers/reders constructors, and retrieve + this info from G4Threading where needed.
  • +
  • Simplified calls to G4Exceptions: added G4Analysis::Warn() and changed the + calls to G4Exception in all analysis classes (except accumulables); reduced + exception classification to: Analysis_F001 (Fatal exceptions) and + Analysis_W001 (Warnings).
  • +
  • Simplified verbosity messages, plus more simplifications in warning calls.
  • +
  • Use fonts from tools in G4PlotManager.
  • +
  • Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • Removed CMake -DTOOLS_USE_EXPAT definition, no longer needed.
  • +
  • Removed default in switch for GetMergeFunction() to prevent + accidental fall through on Windows.
  • +
  • Code clean-up: review of static data members; changed static const + to static constexpr where possible or inline static const + otherwise (for G4String); declare static data members inline and moved + their initialization in header file. Removed redundant includes and + consistency fixes. Moved data members initialization in header files; + added deleted default constructor where appropriate; added explicit + keyword to one argument constructors where missing and removed from + constructors with more than 1 parameters; use brace data members + initialization everywhere. Replaced some constants with constexpr. + Replaced G4Analysis::make_unique with std::make_unique. + Using more shared pointers. Using [[maybe_unused]] where + appropriate. Fixed Coverity issues.
  • +
  • Applied clang-tidy performance fixes: use of const auto&, + std::move where appropriate; revisited passing by + std::shared_ptr. Use make_unique, nullptr, auto, + emplace_back, using; use of default for disabled constructors + and destructors and delete for private member functions not + implemented.
  • +
  • Removed deprecated g4csv.hh, g4hdf5.hh, g4root.hh, g4xml.hh headers.
  • +
  • Reduced output specific type definitions in g4xyz_defs.hh to ntuple end + rntuple types.
  • +
  • Removed g4analysis.hh with the G4Analysis::MasterInstance() factory method.
  • +
  • Removed the default value ("root") for the default file type in + G4GenericAnalysisManager; the default must be set by user if using fileNames + without extensions.
  • +
  • Moved g4tools to externals category. Moved "fonts" directory and install + logic to g4tools package in externals, as prime interface to Freetype.
  • +
  • Fix in G4MPIToolsManager: do not call Receive() twice.
  • +
  • Fixed compilation errors in G4CsvAnalysisReader and G4XmlAnalysisReader + occurring with C++20 enabled.
  • +
  • Fixed evaluation of result of deleting empty file in G4RootAnalysisManager, + causing wrong warnings.
  • +
  • Minor fixes: do not issue same log messages from generic analysis manager + and generic file manager; do not call SetIsEmpty() twice in Hdf5.
  • +
  • Fixed G4*RFileManager destructors.
  • +
  • Implemented handling directories in Generic analysis manager.
  • +
+ + +

Digitization & Hits

+
    +
  • Extending cylindrical scoring mesh to tube and tube segment. + Fixed indexing of cylindrical scoring mesh commands; + addressing problem report + #2418.
  • +
  • Make sure probe commands are not unnecessarily broadcasted to the worker + threads.
  • +
  • Updated G4TScoreHistFiller according to changes in the analysis category; + removed deletion of the analysis manager, now done by the Geant4 kernel.
  • +
  • G4VScoringMesh: corrected warning messages when the size or number of + bins have already been set but tried to change.
  • +
  • Updated G4TScoreNtupleWriter according to changes in the analysis category; + removed deletion of the analysis manager, now done by the Geant4 kernel. + Added default type and its setter.
  • +
  • Use std::string member functions from G4String in place of synonyms. + Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • Code formatting.
  • +
+ + +

Electromagnetic Processes

+
    +
  • Adjoint: +
      +
    • General code cleanup: applied clang-format style guidelines; + applied C++11 codewords to method declarations (virtual, override, + explicit); deleted unused variables and methods; started naming class + member variables with f; use nullptr instead of + 0; removed unused headers; use constexpr for numbers. + Use virtual and override methods consistently; member + variables start with f; shorten long names; removed + unused variables; make class variables local where appropriate; order + declarations of class variables; define class variables; removed unused + functions; marked copy/assignment operators as delete; added + ProcessDescriptions; removed ChangeHistory from top of code; + use CLHEP::twopi instead of hardcoded value; removed more unused + headers.
    • +
    • G4AdjointForcedInteractionForGamma: improved forced interaction for + gamma reverse tracking in thick shielding.
    • +
    • G4AdjointhIonisationModel: updated weight correction to limit + dependence of proton dose results on cut in range.
    • +
    • G4ContinuousGainOfEnergy: use updated signature for ion ionisation.
    • +
    • G4AdjointCSManager: updated interfaces to G4PhysicsVector.
    • +
    • Fixed coverity warnings in G4AdjointCSManager and G4VEMAdjointModel.
    • +
    • Free resources in destructors.
    • +
  • +
  • DNA: +
      +
    • Added IRT-syn model.
    • +
    • Added new models: G4DNADiracRMatrixExcitationModel, + G4DNAQuinnPlasmonExcitationModel, G4DNARelativisticIonisationModel and + G4DNAPlasmonExcitation.
    • +
    • Added G4VDNAMolecularGeometry, a virtual class for DNA geometry.
    • +
    • Added new mesoscopic model for DNA chemistry.
    • +
    • Updates in G4DNAIRT, G4DNAIRTMoleculeEncounterStepper, + G4ITModelProcessor, G4Scheduler and G4DNAMolecularReactionTable + classes, and fixed sub-modules dependencies.
    • +
    • Modified G4DNAELSEPAElasticModel for gold material.
    • +
    • G4DNAElectronHoleRecombination: dissociation channel of electron-hole + recombination moved to G4EmDNAChemistry, _option1, _option2, _option3.
    • +
    • G4DNAWaterDissociationDisplacer: added the fragment displacement for + new dissociation channel.
    • +
    • Replaced hardwired process-sub-types with enum values introduced in the + new class G4LowEnergyEmProcessSubType.
    • +
    • Updated PrintGeneratorInformation() method signature in G4DNABornAngle + and G4DNARuddAngle.
    • +
    • G4DNABohrExcitationModel2, G4DNABohrIonisationModel2, G4VLEPSModel: + updated interfaces to G4PhysicsVector.
    • +
    • Fixed initialization error in G4DNAELSEPAElasticModel.
    • +
    • Fixed compilation error in G4ITMultiNavigator when compiling with C++20 + enabled.
    • +
    • Fixed dependency on g4tools, now moved to externals module.
    • +
  • +
  • High Energy +
      +
    • G4eeToHadrons: updated integral type.
    • +
    • Code clenup: clean-up of interfaces; removed unused headers; + improved initialisation.
    • +
    • G4hBremsstrahlungModel: added header.
    • +
    • G4hhIonisation: removed G4BohrFluctuations.
    • +
    • G4AnnihiToMuPair: return DBL_MAX if below threshold energy; keep pointer + to G4LossTableManager for correct de-registration in the MT mode; added + option of tau+tau- pair production; optimized computation of + cross-sections in compounds; added process sub-type via enumerator.
    • +
    • G4mplIonisationModel, G4mplIonisationWithDeltaModel: updated according to + change of G4VEmFluctuationModel signature.
    • +
  • +
  • Low Energy +
      +
    • Updated Livermore models to use EPICS2017 data.
    • +
    • Included new PIXE data libraries following ANSTO recommendations. + Added new classes to model the ANSTO ECPSSR cross-sections for protons + and alpha particles. Added option to activate the ANSTO fluorescence + radiation yield (Z < 93).
    • +
    • G4LivermorePolarizedComptonModel: added quantum entanglement of e+ + annihilation. If the photons have been "tagged" as "quantum-entangled", + for example by G4eplusAnnihilation for annihilation into 2 photons, they + are "analysed" if and only if both photons suffer Compton scattering. + Theoretical predictions from: Pryce and Ward, Nature N.4065 (1947) p.435, + and Snyder et al, Physical Review 73 (1948) p.440. Experimental + validation in: "Photon quantum entanglement in the MeV regime and its + application in PET imaging", D. Watts, J. Allison et al., Nature + Communications (2021)12:2646. + The implementation of entanglement is described in extensive comments + in G4LivermorePolarizedComptonModel source.
    • +
    • Migrated Spline treatment for all physics vectors.
    • +
    • G4LivermorePolarizedRayleighModel: read data from $G4LEDATA/livermore + directory. Code clean-up.
    • +
    • Removed unused classes G4LivermoreGammaConversionModelRC and + G4LivermoreComptonModifiedModel.
    • +
    • Convert G4LPhysicsFreeVector into G4PhysicsFreeVector.
    • +
    • Removed obsolete unused classes G4BremsstrahlungCrossSectionHandler, + G4BremsstrahlungParameters, G4eBremsstrahlungSpectrum, G4hSRIM2000p, + G4PhotoElectricAngularGeneratorSimple, G4MicroElecInelastic_new, + G4LivermorePolarizedPhotoElectricModel and + G4LivermorePolarizedPhotoElectricGDModel.
    • +
    • G4MicroElecLOPhononModel: removed debug printout; rename member of + class.
    • +
    • G4MicroElecSurface: replaced hardwired process-sub-type 25 with (already + existing) fSurfaceReflection.
    • +
    • G4MicroElecElastic, G4MicroElecLOPhononScattering, G4MicroElecInelastic: + replaced hardwired process-sub-types 51 and 53 with new enum values + fLowEnergyElastic and fLowEnergyIonisation.
    • +
    • Improved management of array in G4PenelopeGammaConversionModel.
    • +
    • Replaced std::map with static arrays in the G4Penelope models for + performance improvements.
    • +
    • Removed obsolete PrintInfo() methods and self defined process SubType.
    • +
    • G4IonParametrisedLossModel: use updated signature for ion ionisation.
    • +
    • Updated PrintGeneratorInformation() method signature for few angular + generators.
    • +
    • G4PenelopeBremsstrahlungAngular, G4PenelopeBremsstrahlungFS, + G4PenelopeCrossSection, G4JAEAElasticScatteringModel, + G4JAEAPolarizedElasticScatteringModel: use optimal methods of + G4PhysicsVector.
    • +
    • G4LivermorePolarizedComptonModel: migrated to the new version of + G4PhysicsModelCatalog.
    • +
    • G4AugerData: removed dead code.
    • +
    • G4VCrossSectionHandler, G4eIonisationParameters: use const pointers to + G4Element.
    • +
    • General code cleanup: use G4 types; cleanup of headers and Penelope + models.
    • +
  • +
  • Muons +
      +
    • General code clean-up: use C++11 keywords, improved comments, format + files.
    • +
    • G4EnergyLossForExtrapolator, G4ErrorEnergyLoss, G4TablesForExtrapolator: + provide thread-safe initialisation of internal tables; guarantee + initialisation only once; size of tables depend only on number of + materials.
    • +
    • G4MuIonisation: removed obsolete G4BohrFluctuations header.
    • +
    • G4MuPairProduction, G4ePairProduction, G4MuBremsstrahlung: disabled + Spline interpolation by default.
    • +
    • G4MuPairProduction, G4MuBremsstrahlung, G4MuBremsstrahlungModel: + improved initialisation.
    • +
    • Updated PrintGeneratorInformation() method signature in G4ModifiedMephi.
    • +
  • +
  • Pii +
      +
    • Use const pointer to G4Element according to recent changes in materials.
    • +
  • +
  • Polarisation +
      +
    • General code cleanup: name classes in logical manner; improved comments; + added ProcessDescription; ordered #includes and removed unused; disabled + copy and assignment operators with delete; increased C++11 keyword + usage, especially override, explicit; renamed (most) + class variables to start with f; make SCRN arrays the correct size; + use constexpr for numbers; applied clang-format style; use + G4ExceptionDescription; avoid implicit conversions between G4StokesVector + and G4ThreeVector.
    • +
    • G4PolarizedIonisationBhabhaXS: removed incorrect G4Exception.
    • +
    • G4PolarizedAnnihilation, G4ePolarizedIonisation: improved initialisation + of assymetry tables.
    • +
    • G4PolarizedAnnihilation, G4PolarizedCompton: updated use of the Spline + flag.
    • +
    +
  • Standard +
      +
    • G4eplusAnnihilation: introducing Quantum Entanglement. This is activated + by UI command /process/em/QuantumEntanglement. For e+e- -> gamma + gamma, the gammas are "tagged" here and must be "analysed" in a Compton + scattering process - see, for example, G4LivermorePolarizedComptonModel. + Otherwise entanglement has no effect even if activated. + Instantiate clipboard only if Quantum Entanglement is requested.
    • +
    • G4PAIModelData, G4eplusTo2GammaOKVIModel: corrected initialisation of + physics vectors.
    • +
    • G4LindhardSorensenData: updated definition of Spline flag.
    • +
    • G4CoulombScattering, G4eBremsstrahlung, G4eplusAnnihilation: updated set + of flags for Spline and the integral approach.
    • +
    • Removed obsolete classes G4BohrFluctuations and + G4HeatedKleinNishinaCompton.
    • +
    • G4BetheBlochModel, G4BraggIonModel, G4LindhardSorensenIonModel, + G4ICRU73QOModel, G4AtimaIonIonisationModel: changed interface to ion + ionisation corrections.
    • +
    • G4BraggModel, G4BraggIonModel: set lowest energy to 0.25 keV; + added protection to limit cut value by the lowest energy.
    • +
    • G4BraggIonModel, G4BetheBlochModel, G4ionIonisation clean-up. Improved + implementation of corrections to ion stopping powers: do not apply + corrections at the last step of an ion; do not apply corrections to + alpha.Addressing problem report + #2440.
    • +
    • G4PairProductionRelModel: reduced upper limit of parameterisation + cross-section from 80 to 30 GeV.
    • +
    • G4LindhardSorensenIonModel: use G4BraggIonModel, G4BetheBlochModel and + G4IonICRU73Data, do not apply corrections at the last step of an ion.
    • +
    • G4IonICRU73Data: new data structure for ion ionisation data.
    • +
    • G4LinhardSorensenIonModel, G4ICRU73QOModel: added protection to limit cut + value by the lowest energy.
    • +
    • G4eplusAnnihilation: migrated to the new version of G4PhysicsModelCatalog.
    • +
    • G4PAIModelData: use optimal methods to access G4PhysicsVector.
    • +
    • G4UniversalFluctuation, G4IonFluctuations, G4AtimaFluctuations, G4PAIModel, + G4PAIPhotModel: updated according to new G4VEmFluctuationModel signature. + Minor optimisation and code clean-up in G4UniversalFluctuation.
    • +
    • G4UrbanMscModel: do not apply energy correction at small steps below 1% of + a particle range. Use random arrays instead of flat() method to speedup the + code; use more const variables.
    • +
    • G4UniversalFluctuation: substantially simplified sampling algorithm, + smaller number of parameters, faster computations; results are in + statistical agreement with the previous version of the code.
    • +
    • G4PEEffectFluoModel: optimised cross-section computation with reciprocals + and Horners scheme.
    • +
    • G4BraggIonModel: fixed computation of dedx for alpha if + ICRU90 data are used. Improved method signatures and code cleanup.
    • +
    • G4hIonisation, G4ionIonisation: He3 dedx derived from alpha dedx; + pi, K, proton, pbar, GenericIon have their own dedx and other tables; + other hadrons derived from K, protons, pbar; ions derived from GenericIon.
    • +
    • G4ionIonisation: use G4WaterStopping with Spline enabled. + Minor code clean-up.
    • +
    • G4ASTARStopping: improved method signatures.
    • +
    • G4BetheBlochModel, G4ESTARStopping, G4AtimaEnergyLossModel, + G4LindhardSorensenIonModel: fixed Coverity warnings by initialising all + variables in class constructors.
    • +
    • Removed obsolete G4alphaIonisation class.
    • +
    • Code clean-up of ionisation, energy loss processes and models.
    • +
    • Clean-up of gamma processes.
    • +
    • Requires data-set G4EMLOW-8.0.
    • +
  • +
  • Utils +
      +
    • G4VEmProcess, G4VEnergyLossProcess, G4EmTableType, G4EmBiasingManager, + G4LossTableManager: updated integral approach by introduction of a + cross-section shape type and different actions depending on the type; + added cache for cross-section and range; removed unused methods; + attempt to reduce number of if operators at run time; integral + and Spline flags are set to each process individually and not via + G4EmParameters class.
    • +
    • G4VEmProcess, G4VEnergyLossProcess, G4VMultipleScattering, + G4LossTableBuilder, G4VEmModel, G4VMscModel, G4LossTableManager: + implement and use base material approach only if base materials are defined, + this should bring a minor speedup of the code and little reduction of memory; + fixed problems for the case when materials are changed between runs.
    • +
    • G4VEmProcess, G4VEnergyLossProcess, G4VAtomDeexcitation, G4LossTableBuilder: + implemented updated numbering scheme for secondary particle production; + deprecated duplicate printout of processes and models; moved list of EM + parameters printout before printout on processes; improved code format.
    • +
    • G4VMultipleScattering: fixed problem observed by CMS for specific + physics list.
    • +
    • G4EmCorrections, G4VEmProcess: updated use of the Spline flag.
    • +
    • G4EmCorrections: do not use Spline in various internal vectors, as + correction values are small and smooth. Cleanup of ion correction + computations.
    • +
    • G4EmCorrections, G4LossTableBuilder: substitute use of deprecated + G4LPhysicsFreeVector by G4PhysicsFreeVector.
    • +
    • G4VEmProcess, G4VEnergyLossProcess, G4EmDataHandler: updated method + RetrievePhysicsTable().
    • +
    • G4TableType: added extra enumerator for type of cross-section shape.
    • +
    • G4EmProcessSubType: added new type for annihilation to tau pair.
    • +
    • G4LowEnergyEmProcessSubType: added new enum values, corresponding + to numerical values used in G4PhysicsListHelper.
    • +
    • G4LowEnergyEmProcessSubType: created new enum for low-energy + electromagnetic process sub-types.
    • +
    • G4EmElementSelector: change computation for upper energy limit, fixing + occasional crashes in some applications.
    • +
    • G4EmParameters: added ANSTO options for the atomic de-excitation; removed + obsolete AugerCascade() method.
    • +
    • G4EmParameters, G4EmParametersMessenger: removed obsolete methods; added + protection agains duplicate printout.
    • +
    • G4EmLowEParameters, G4EmLowEParametersMessenger: added ANSTO flag and UI + commands.
    • +
    • G4OpticalParameters: removed deprecated function declarations.
    • +
    • G4OpticalParameters, G4OpticalParametersMessenger: removed deprecated + optical commands and parameters. Replaced CreateDir() with new + G4UIdirectory(). Apply clang-format style guidelines.
    • +
    • G4VMultipleScattering: removed obsolete unused methods; reduced number + of operations at run time, use isIon flag for scaling of energy + limits for all particles with mass >1 GeV.
    • +
    • G4VEmModel removed "virtual" keyword for ComputeDEDX() method.
    • +
    • G4EmCalculator: fixed computation of dedx for He3 and alpha. + In G4VEnergyLossProcess, exclude ion corrections only from d, t, alpha. + Addressing problem report + #2440.
    • +
    • G4ionEffectiveCharge: return back limit on effective charge from + 0.5 to 1 as used in previous releases.
    • +
    • G4VEmAngularDistribution: added virtual method + PrintGeneratorInformation().
    • +
    • Fixed model per region definition for all base processes G4VEmProcess, + G4VMultipleScattering, G4VEnergyLossProcess; removed sub-cut facility + for energy loss processes; clean-up of parameters classes.
    • +
    • G4VEmModel, G4VEnergyLossProcess, G4EmCalculator: optimised signature + of the CorrectionsAlongStep() method; use more constant variables; + minor code optimisation.
    • +
    • G4VEmProcess, G4VEnergyLossProcess: fixed computation of cross-section + and range if base material approach is used.
    • +
    • G4VEmFluctuationModel: changed interface; both cut value and max energy + transfer are parameters of main methods. + Addressing problem report + #2390.
    • +
    • G4VEnergyLossProcess, G4EmModelManager: adopted above interface change.
    • +
    • G4VEmProcess, G4VEnergyLossProcess, G4VAtomDeexcitation: migrated + to the new version of G4PhysicsModelCatalog.
    • +
    • G4LossTableBuilder: base material flag may be disabled. + Use updated interface to G4PhysicsVector.
    • +
    • G4EmElementSelector: change computation for corner cases.
    • +
    • G4EmParametersMessenger: correct default value for 'GeomFactor'.
    • +
    • Changed ANSTO parameters in UI interface commands.
    • +
    • Removed obsolete G4EmProcessOptions class.
    • +
    • G4LossTableBuilder: fixed debug printout.
    • +
    • G4VMscModel: improved printout.
    • +
    • G4VEnergyLossProcess: code cleanup for ions.
    • +
    • General code cleanup; removed obsolete methods and members; + reorganized class members.
    • +
    +
  • Xrays +
      +
    • General code cleanup: removed commented out code; added + ProcessDescription() and DumpInfo(); organized order of headers, + removed and added as needed; use constexpr for numbers; replaced + G4PhysicsOrderedFreeVector with G4PhysicsFreeVector.
    • +
    • G4Cerenkov, G4Scintillation, G4SynchrotronRadiation, G4ForwardXrayTR, + G4SynchrotronRadiationInMat, G4VXTRenergyLoss: set the creator model ID + for the secondaries, using the new version of G4PhysicsModelCatalog.
    • +
    • G4Cerenkov, G4Scintillation: update G4OpticalParameters when process + parameters updated directly. Addresses problem report + #2425.
    • +
    • G4Cerenkov: do not use obsolete methods to access G4PhysicsVector data.
    • +
    • G4Scintillation: removed deprecated optical commands.
    • +
  • +
+ + +

Error Propagation

+
    +
  • Code formatting.
  • +
+ + +

Event

+
    +
  • G4EventManager: hand over track to custom tracking manager, if registered + for the particle; moved StackTracks() to be public.
  • +
  • Use existing facility to find physical volume in store, rather than + looping through in G4SPSPosDistribution::ConfineSourceToVolume().
  • +
  • Use G4PhysicsFreeVector instead of deprecated G4PhysicsOrderedFreeVector + in G4AdjointPrimaryGenerator, G4SPSAngDistribution, G4SPSEneDistribution, + and G4SPSRandomGenerator.
  • +
  • G4SPSEneDistribution: use more efficient access to G4PhysicsVector.
  • +
  • Use std::string member functions from G4String in place of synonyms. + Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
+ + +

Externals

+
    +
  • CLHEP: +
      +
    • Updated to CLHEP version 2.4.5.1.
    • +
    • Added units: minute, hour, day, year + and millielectronvolt. + Added constants: Bohr_magneton and nuclear_magneton.
    • +
    • Added new random engine RANLUX++ and related helper classes. + RANLUX++ is an extension of RANLUX and uses the equivalent LCG to + offer a much higher luxury level at better performance. It inherits + the excellent statistical properties and passes the full BigCrush.
    • +
    • Fixed seeding in Ranlux64Engine.
    • +
    • Fixed trivial compilation warnings on gcc-11 in Random headers.
    • +
  • +
  • G4tools: +
      +
    • Moved from analysis module and updated to version 5.6.0: +
        +
      • Added "Windowing" code needed for G4/vis/tools_sg.
      • +
      • Added code to write/read a column of vectors of strings for n-tuple.
      • +
      • Handling of embedded fonts.
      • +
      • Fixed compilation warnings on gcc-11.
      • +
      • See History_tools for the complete list of modifications.
      • +
    • +
  • +
  • PTL: +
      +
    • Updated PTL to version v2.0.0.
    • +
    • Replaced raw pointers to tasks with + shared_ptrs for memory management improvements.
    • +
    • Removed PTL custom task allocator classes.
    • +
    • Fixed warnings about TBB task scheduler init.
    • +
    • Fixed compilation warnings when C++20 Standard enabled.
    • +
    • Improved thread safety.
    • +
    • Fixed some memory issues.
    • +
    • Fix to TaskRunManager::Terminate() + nullptr to m_thread_pool + responsible for segmentation-fault when ui/vis initialised, but not + run manager.
    • +
    • Make PTL cmake options available in configuration, including: + PTL_USE_SANITIZER and PTL_USE_LOCKS, but hidden from clients building + Geant4; relevant Geant4 options forwarded to PTL: TBB, sanitizer, locks.
    • +
    • Use CMAKE_CXX_STANDARD in place of GEANT4_BUILD_CXXSTD in CMake + configuration. Also, updated minimum CMake version requirements.
    • +
  • +
  • ZLIB: +
      +
    • Removed formatting options from build.
    • +
  • +
+ + +

G3toG4

+
    +
  • Use std::string member functions from G4String in place of synonyms. + Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • Fixed compilation error in G3EleTable when C++20 is enabled.
  • +
+ + +

General Processes

+
    +
  • Biasing +
      +
    • G4BOptrForceCollision: migrated to the new version of + G4PhysicsModelCatalog.
    • +
  • +
  • Cuts +
      +
    • G4VRangeToEnergyConverter, G4RToEConvForPositron, G4RToEConvForElectron, + G4RToEConvForGamma, G4RToEConvForProton: simplified the design; do not use + G4PhysicsTable and G4PhysicsVector but convert range cut to production + threshold directly; expected memory reduction for big detectors and some + speed-up of initialisation.
    • +
    • G4PhysicsTableHelper: updated interface to Retrieve() method. + Fixed minor Coverity report. Fixed Coverity warning due to index type; + removed G4ThreadLocal variable; substituted old cerr with G4Exception + (old printouts are kept); removed inclusion of unused headers.
    • +
    • G4MCCIndexConversionTable: changed inline functions, only one return is + left instead of two.
    • +
  • +
  • Management +
      +
    • Introducing classes for implementation of quantum entanglement: + G4EntanglementAuxInfo, G4VEntanglementClipBoard and + G4eplusAnnihilationEntanglementClipBoard. + Currently, entanglement is implemented only in G4eplusAnnihilation + and G4LivermorePolarizedComptonModel.
    • +
    • New class G4NoProcess, representing an empty process not assigned to any + particle, and used only in G4SteppingManager::InvokeAtRestDoItProcs() + for stable ions at rest, in order to avoid that radioactive decay appears + as process defining their last step. Note that the method IsApplicable(), + retunrs false, as this process should not be set to any particle.
    • +
  • +
  • Optical +
      +
    • G4OpBoundaryProcess: fixed initialisation of some local variables. + Addressing problem report + #2364.
    • +
    • G4OpBoundaryProcess: renamed internal variables; make comparison to + nullptr explicit; removed unneeded intermediate variable; + refactored Davis LUT calculation. On StepTooSmall, propose velocity + corresponding to material of post-step point. Addresses problem report + #2438.
    • +
    • In all process classes, update G4OpticalParameters when process parameters + updated directly. Addresses problem report + #2425.
    • +
    • G4OpRayleigh, G4OpWLS, G4OpWLS2: use G4PhysicsFreeVector instead + of deprecated G4PhysicsOrderedFreeVector.
    • +
  • +
  • Solid state +
      +
    • G4Channeling, G4ChannelingOptrChangeCrossSection: migrated to the + new version of G4PhysicsModelCatalog.
    • +
  • +
  • Transportation +
      +
    • Enable setting of smooth curved trajectories to particle-change in + G4CoupledTransportation::AlongStepDoIt(), which was commented out by + mistake. Based on discussion in Geant4 Forum thread #4271.
    • +
  • +
+ + +

Geometry

+
    +
  • Biasing +
      +
    • Added missing include of G4Threading header for G4Mutex for + self-consistency in G4ImportanceAlgorithm header.
    • +
  • +
  • Management +
      +
    • Added map for faster search based on name in G4SolidStore, + G4RegionStore, G4logicalVolumeStore and G4PhysicalVolumeStore. + Pointers to elements are stored in the map as buckets, grouping + elements with same name.
    • +
    • Use G4Allocator to dynamically allocate nodes and proxies for the voxels + optimisation structure. Should help reducing memory fragmentation.
    • +
    • G4UAdapter: added operator<<() to fix clash between similar methods + for G4VSolid and VecGeom UnplacedVolume.
    • +
    • Make operator<<() for G4VSolid a free function.
    • +
    • Basic clang-tidy review of code.
    • +
  • +
  • Navigation +
      +
    • G4Navigator: enabled use of alternative G4VoxelNavigation class. + Adds call to virtual method in ComputeStep(), LocateGlobalPointAndSetup() + for voxelised volumes. Controlled by ALTERNATIVE_VOXEL_NAV flag, turned + on by default. + Deleted experimental obsolete method RecheckDistanceToCurrentBoundary(), + also removed in G4SafetyHelper and G4PathFinder. + Cleaned up ComputeSafety().
    • +
    • G4VoxelNavigation: simplify code of check mode tests to avoid 2nd + code path. Added comments about method arguments.
    • +
    • G4NavigationLogger: soften check of step vs distance (using tolerance).
    • +
    • G4[Partial]PhantomParameterisation: renamed Get/SetNoVoxel*() accessors + to Get/SetNoVoxels*() for coherence. Migrated code in G4RegularNavigation + accordingly. NOTE: might imply user code migration.
    • +
  • +
  • Solids (Boolean) +
      +
    • In G4UnionSolid and G4SubtractionSolid, revised GetCubicVolume() method + to use cubic volume of constituent volume(s) and an intersection solid, + for more accurate measurement.
    • +
  • +
  • Solids (CSG) +
      +
    • G4Trap, G4Para and wrappers: added accessors to retrieve/calculate + original values for alpha, theta, phi.
    • +
    • Revision of G4UTrap wrapper: list of accessors and modifiers made + consistent with G4Trap; implemented check of parameters similar to + G4Trap.
    • +
    • Corrected typo in G4UPara::GetXHalfLength(). Addressing problem report + #2446.
    • +
    • Removed deprecated accessors in G4Sphere and G4Tubs.
    • +
  • +
  • Solids (Specific) +
      +
    • Simplified implementation of CreatePolyhedron() in G4Polyhedra, + G4Polycone, G4GenericPolycone and related wrappers. +
    • In G4TesselatedSolid, implemented GetFacetIndex(p) and CheckStructure(). + Optimised code in SetExtremeFacets(): shuffle of vertices and checking + of six extreme vertices. +
    • In G4Tet, added degeneracyFlag to the list of parameters in + SetVertices(). Addressing problem report + #2427. +
    • G4Tet: improved calculation of bounding box. Added SetBoundingLimits()
    • +
    • Added missing accessor in G4UTet. Added CheckDegeneracy(), SetVertices() + and SetBoundingLimits()
    • +
    • G4TwistedTubs: more accurate calculation of the bounding box in + BoundingLimits() and GetExtent(), fixing measured performance + penalty. Addressing problem report + #2450.
    • +
    • G4TwistedTubs, G4VTwistedFaceted: fixed GetCubicVolume().
    • +
  • +
  • Volumes +
      +
    • G4PVPlacement::CheckOverlaps(): more precise estimation of overlap size, + improved check for encapsulation of volume by another volume.
    • +
    • G4ReflectionFactory: added Clean() method for clearing the internal + maps on user request and removed problematic Reset() function.
    • +
  • +
+ + +

Global

+
    +
  • Removed deprecated classes G4LPhysicsFreeVector and G4PhysicsLnVector. + Redirect G4PhysicsOrderedFreeVector to G4PhysicsFreeVector.
  • +
  • G4PhysicsVector, G4PhysicsFreeVector, G4PhysicsLogVector, + G4PhysicsLinearVector: major update: introduced new public access methods; + removed obsolete unused methods; introduced possibility to use different + Spline methods; do not fill second derivative vector if Spline not enabled; + improved control on input data; reduced number of calls to min/max; attempt + to optimise run time code G4PhysicsTable, improved use of the vector type.
  • +
  • G4PhysicsVector, G4PhysicsTable, G4PhysicsFreeVector: removed obsolete + methods SetSpline(); T_G4PhysicsFreeVector type set to be default; + improved comments and printouts.
  • +
  • G4PhysicsVector: optimisation in G4PhysicsVector::Interpolation(). + Fix in G4PhysicsVector::GetMinEnergy(). Minor code formatting.
  • +
  • G4PhysicsVectorType: added enumeration of Spline type; use namespace.
  • +
  • G4PhysicsFreeVector, G4PhysicsLogVector, G4PhysicsLinearFreeVector: + in each constructor added extra Boolean parameter for enabling Spline; + needed for later removal of the SetSpline() method, required for + re-organisation of the code using templates.
  • +
  • G4PhysicsFreeVector: added to all constructors control on continuous + increase energy in the energy vector. Added accessor to allow user query + for use or not of Spline interpolation.
  • +
  • G4PhysicsModelCatalog: new version of the catalog of physics models. + Introduced a modelID (a unique integer for each physics model, with close + values for similar/related physics models), besides an index (the position + in a vector) and the name (string) of the model. The main difference with + respect to the previous version is that the three identifiers of each + physics model - modelID, index and name - must stay constant and the same + for all applications, physics lists and future versions of Geant4.
  • +
  • Simplified G4String interfaces and implementation with C++11/17. + Removed obsolete/std::string synonym member functions from G4String: + hash()/stlhash(), data(), replace(), index(), isNull(), first()/last(), + append()/prepend() and call operators. + Deprecated non-std::string member functions, replacing with new free + functions in G4StrUtil namespace.
  • +
  • G4ConvergenceTester: fixed potential thread contention likely + responsible for crashes in ThreadSafe-Scorers example, observed in + system testing. Some code cleanup.
  • +
  • Updated G4SIUnits and G4PhysicalConstants to include new symbols + (minute, hour, day, year and millielectronvolt) + and new constants (Bohr_magneton and nuclear_magneton), + based on CLHEP-2.4.4.2.
  • +
  • G4UnitsTable: added unit definitions for Velocity and Momentum.
  • +
  • G4BestUnit: print eV instead of meV for zero energy.
  • +
  • G4BackTrace: move from deprecated sigignore() to signal().
  • +
  • New G4Filesystem header to support transparent use of C++ filesystem + whether it is in std:: or std::experimental namespaces.
  • +
  • G4ThreadLocalSingleton: added way to explicitly call Clear() for all + TLS singletons.
  • +
  • Reworked G4Backtrace to use fewer dynamic memory allocations when + printing backtrace in order to avoid overflowing the signal stack.
  • +
  • Modernised CMake script.
  • +
  • Updated date of release for 11.0.
  • +
+ + +

Graphical Representations

+
    +
  • Added G4Plotter class, a kind of "high level" primitive to capture plots + (tools::histo:h1d, h2d for the moment) and the style of a plotter. + Style description is done by handling named lists of (parameter,value). + It is sufficently generic to be usable by various implementations of a + plotter. It is assumed that a plotter manages a grid of "regions" to + visualize various histograms in a same representation/view/viewport. + Updated G4VGraphicsScene accordingly.
  • +
  • Reviewed HepPolyhedronPgon, HepPolyhedronPcon classes given by rz-contour.
  • +
  • HepPolyhedron: added TriangulatePolygon() and RotateContourAroundZ(). + Fixed calculation of number of faces in a polyhedron object in method + RotateContourAroundZ(). In some cases, 'Nfaces' was computed incorrectly, + resulting in more memory being allocated than required; this did not + create problems for rendering, but used to generate warning messages + in some cases.
  • +
  • BooleanProcessor: redundant std::move(polyhedron) replaced with + HepPolyhedron(polyhedron), it fixes complation warnings with C++20.
  • +
  • Removed deprecated G4VisAttributes::Invisible.
  • +
  • Added G4Colour::operator<(), useful for making a set or map based on + G4colour as a key.
  • +
  • G4VGraphicsScene: introduced new pure virtual function + AddCompound(const G4Mesh&).
  • +
  • G4VisAttributes: improved message in SetForceNumberOfCloudPoints().
  • +
  • Revised visualisation models according to visualization/modeling + module. Adapted code according to visualisation models revision.
  • +
  • Removed G4Scale; /vis/scene/add/scale is reimplemented with + G4CallBackModel.
  • +
  • Add G4VMarker::operator==().
  • +
  • Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • Modernised CMake script.
  • +
+ + +

Hadronic Processes

+
    +
  • Removed deprecated 'rpg' model.
  • +
  • Merged 'models/management' module in 'management'.
  • +
  • Merged 'models/util' module in 'util'.
  • +
  • Use std::string member functions from G4String in place of synonyms. + Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • Cross Sections +
      +
    • G4MuNeutrinoNucleusTotXsc: new arrays for XS_eq and XS_in, now XS_tot + is a sum of XS_qe and XS_in with A, Z and A-Z factors.
    • +
    • G4NeutronInelasticXS, G4NeutronElasticXS, G4NeutronCaptureXS, + G4ParticleInelasticXS, GammaNuclearXS : in the method BuildPhysicsTable(), + replaced loop over material-cut-couple with a direct loop over all + elements; partially move initialisation of local variables to headers.
    • +
    • G4MuNeutrinoNucleusTotXsc: access and calculation of + fQEratio(Z,A) = XS_qe/XS_tot.
    • +
    • Removed the following obsolete classes: + G4IonsKoxCrossSection, G4IonsSihverCrossSection, + G4TripathiCrossSection, G4TripathiLightCrossSection, + G4IonProtonCrossSection, G4GeneralSpaceNNCrossSection, + G4ProtonInelasticCrossSection G4NeutronInelasticCrossSection, + G4PiNuclearCrossSection, G4CrossSectionPairGG, + G4FastPathHadronicCrossSection, G4HadronCaptureDataSet, + G4HadronFissionDataSet, G4HadronElasticDataSet, G4HadronInelasticDataSet, + G4HadronCrossSections, G4TripathiCrossSection, G4TripathiLightCrossSection.
    • +
    • G4HadronXSDataTable, G4ComponentSAIDTotalXS: updated creation and + handling of G4PhysicsVector.
    • +
    • G4UPiNuclearCrossSection, G4ComponentSAIDTotalXS: substituted use of + deprecated G4LPhysicsFreeVector by G4PhysicsFreeVector.
    • +
    • G4UPiNuclearCrossSection: disabled Spline interpolation.
    • +
    • G4IsotopeList: extended list of isotopes to cover all data for + neutrons, protons, and gamma.
    • +
    • G4GammaNuclearXS: new version of the code, based on IAEA/PD-2019. + Improved isotope cross-section. + Co-working with new data set G4PARTICLEXS-4.0.
    • +
    • G4IsotopeList: extended from Zmax=92 to Zmax=94; do not use zero + values for 'amin' and 'amax' for all Z; this is needed for + migration to the new dataset G4PARTICLEXS4.0.
    • +
    • G4NeutronInelasticXS, G4NeutronElasticXS, G4NeutronCaptureXS, + G4ParticleInelasticXS, GammaNuclearXS: instead of check (amin[Z]==0) + use the check (amin[Z]==amax[Z]).
    • +
    • G4ElNuclearSFcs: e-A cross-section according to structure function + approach by corrections of CHIPS cross-sections.
    • +
    • G4CrossSectionDataSetRegistry: improved debug printout and not use + CrossSectionFactory for XS.
    • +
    • Clean-up access to data.
    • +
    • Code cleanup.
    • +
  • +
  • Management +
      +
    • G4HadronicProcess: made public the method GetHadronicInteraction(). + This can be useful for users to access at run-time some information + available from a hadronic final-state model. + Removed unused private member variable; updated the + call to G4Track for setting the model creator ID.
    • +
    • G4HadronInelasticProcess: added a new method to return the particle + definition (useful in practice to distinguish between baryons and + antibaryons, or between hadrons and ions). + Removed old and unused header file corresponding to the Gheisha + inelastic cross-section (that has been deleted).
    • +
    • G4HadronicProcessType: added a new enum value (fEMDissociation = 310) + for EM dissociation process.
    • +
    • G4HadronicProcessStore: fixed TLS usage. Fixed loops in Clean(). + Fixed memory leak at exit.
    • +
    • G4HadronicEPTestMessenger: removed deprecated commands.
    • +
    • Removed unused class G4VCrossSectionBase.
    • +
  • +
  • Processes +
      +
    • Added G4HadronInelasticProcess class from hadronic/management module.
    • +
    • Renamed G4HadronCaptureProcess as G4NeutronCaptureProcess, as it is + applied only for neutron projectile.
    • +
    • Removed use of deleted header file G4HadronicDeprecate.
    • +
    • G4HadronCaptureProcess: removed old and unused header file + corresponding to the Gheisha capture cross-section (that has been + deleted).
    • +
    • G4HadronFissionProcess: replaced Gheisha fission cross-section + (that has been deleted) with G4ZeroXS (which is a zero cross-section + everywhere).
    • +
    • Set creator model ID for the secondaries, using the new version of + G4PhysicsModelCatalog.
    • +
    • G4HadronElasticProcess, G4NeutrinoElectronProcess, + G4ElNeutrinoNucleusProcess, G4MuNeutrinoNucleusProcess: removed + old and unused header file corresponding to the Gheisha elastic + cross-section (that has been deleted).
    • +
    • Removed the following deprecated inelastic processes: + G4AlphaInelasticProcess, G4AntiAlphaInelasticProcess + G4AntiDeuteronInelasticProcess, G4DeuteronInelasticProcess, + G4AntiHe3InelasticProcess, G4He3InelasticProcess, + G4AntiLambdaInelasticProcess, G4LambdaInelasticProcess, + G4AntiNeutronInelasticProcess, G4NeutronInelasticProcess, + G4AntiOmegaMinusInelasticProcess, G4OmegaMinusInelasticProcess, + G4AntiProtonInelasticProcess, G4ProtonInelasticProcess, + G4AntiSigmaMinusInelasticProcess, G4SigmaMinusInelasticProcess, + G4AntiSigmaPlusInelasticProcess, G4SigmaPlusInelasticProcess, + G4AntiTritonInelasticProcess, G4TritonInelasticProcess, + G4AntiXiMinusInelasticProcess, G4XiMinusInelasticProcess, + G4AntiXiZeroInelasticProcess, G4XiZeroInelasticProcess, + G4IonInelasticProcess, G4KaonMinusInelasticProcess, + G4KaonPlusInelasticProcess, G4KaonZeroLInelasticProcess, + G4KaonZeroSInelasticProcess, G4PionMinusInelasticProcess, + G4PionPlusInelasticProcess, G4PhotoCaptureProcess, + G4PhotoFissionProcess, G4PhotoNuclearProcess.
    • +
  • +
  • Stopping +
      +
    • G4MuonicAtomDecay, G4HadronStoppingProcess: migrated to the new version + of G4PhysicsModelCatalog.
    • +
    • G4ElementSelector, G4HadronStoppingProcess: use const pointer to + G4Element.
    • +
    • Removed obsolete classes: G4AntiNeutronAnnihilationAtRest, + G4AntiSigmaPlusAbsorptionFritiof, G4SigmaMinusAbsorptionBertini, + G4AntiProtonAbsorptionFritiof, G4KaonMinusAbsorptionBertini, + G4PiMinusAbsorptionBertini.
    • +
  • +
  • Utilities +
      +
    • G4Fragment, G4KineticTrack, G4HadSecondary, G4ReactionProduct: introduced + consistent naming of the Set/Get methods for the creator model ID.
    • +
    • G4DecayKineticTracks, G4KineticTrack, G4DecayStrongResonances: + propagate correctly the information regarding the creator model ID.
    • +
    • G4Nucleus: rewritten method GetBiasedThermalNucleus() according to the + sampling of the Velocity of the Target nucleus (SVT) algorithm. + Use const pointer to G4Element
    • +
    • G4Nucleon, G4Nucleus, G4V3DNucleus, G4Fancy3DNucleus, G4Fragment: + extended for hypernuclei and anti-hypernuclei.
    • +
    • Removed unused classes: G4LightMedia, G4IsoResult, G4HadronicDeprecate, + G4GHEKinematicsVector, G4HadReentrentException, G4HadSignalHandler, + DumpFrame.
    • +
    • G4HadronicParameters: added hyper-nuclei flag.
    • +
  • +
  • Abla +
      +
    • G4AblaInterface: set the model creator ID using the new version + of G4PhysicsModelCatalog.
    • +
    • G4Abla: updated for hypernuclei. Delete array variables with array + delete, as suggested by Coverity.
    • +
  • +
  • Abrasion +
      +
    • G4WilsonAbrasionModel: migrated to the new version of + G4PhysicsModelCatalog.
    • +
  • +
  • Bertini Cascade +
      +
    • Fixed TLS usage in G4CascadeChannelTables and G4CascadeParameters.
    • +
    • G4CascadeInterface: set the creator model ID for the secondaries + produced by Bertini model using the new version of G4PhysicsModelCatalog.
    • +
  • +
  • Binary Cascade +
      +
    • G4BinaryCascade, G4BinaryLightIonReaction: migrated to the new version of + G4PhysicsModelCatalog.
    • +
    • G4GeneratorPrecompoundInterface: extended the method PropagateNuclNucl() + to deal with projectile hypernuclei and anti-hypernuclei. Propagated the + creator model ID information.
    • +
  • +
  • De-excitation +
      +
    • G4DeexPrecoParameters, G4ExcitationHandler: migrated to the new version + of G4PhysicsModelCatalog.
    • +
    • Set creator model ID for secondaries, using the new version of + G4PhysicsModelCatalog.
    • +
    • G4DeexPrecoParameters: fixed propagation of verbosity level between + components of the de-excitation module.
    • +
    • Removed obsolete and not used model G4ParaFissionModel, this + fixes also circular dependences inside the de-excitation module.
    • +
    • G4PhotonEvaporation: fixed Coverity defect warning.
    • +
  • +
  • Elastic scattering +
      +
    • G4ChargeExchangeProcess: replaced Gheisha elastic cross-section + (that has been deleted) with G4ComponentGGHadronNucleusXsc.
    • +
    • G4LEHadronProtonElastic, G4ChargeExchangeProcess: removed unused + headers.
    • +
    • Set the creator model ID for the secondaries created, using the new + version of G4PhysicsModelCatalog.
    • +
    • G4QuasiElRatios: initialize the logarithmic table 'lastLRatio', + as suggested by Coverity.
    • +
  • +
  • Electromagnetic Dissociation +
      +
    • G4EMDissociation: set the creator model ID for secondaries created + by projectile and target diffraction, using the new version of + G4PhysicsModelCatalog.
    • +
  • +
  • Fission +
      +
    • G4LFission, G4FissionLibrary : set creator model ID for the secondaries, + using the new version of G4PhysicsModelCatalog.
    • +
    • G4LFission: removed unused headers.
    • +
  • +
  • Gamma-nuclear +
      +
    • G4LENDorBERTModel: set creator model ID for the secondaries, using + the new version of G4PhysicsModelCatalog.
    • +
  • +
  • im_r_matrix +
      +
    • G4XnpElasticLowE, G4XNNElasticLowE, G4XnpTotalLowE: substituted use of + deprecated G4PhysicsLnVector with G4PhysicsLogVector; no functional + changes.
    • +
  • +
  • INCLXX +
      +
    • Added implementation of hypercluster emission.
    • +
    • G4INCLXXInterface: extended to projectile hypernuclei.
    • +
    • G4INCLNuclearPotentialIsospin: improved nuclear potential for Lambda + particles.
    • +
    • G4INCLXXInterface: set creator model ID for secondaries, using the + new version of G4PhysicsModelCatalog.
    • +
  • +
  • Lend +
      +
    • Set creator model ID for secondaries, using the new version of + G4PhysicsModelCatalog.
    • +
  • +
  • Lepto-nuclear +
      +
    • G4NeutrinoNucleusModel: calculation of fQEratioA(Z,A,Enu) depending of + QE ratios for nucleons. Added accessors for XS_qe/XS_tot(A), fQEratioA + class member.
    • +
    • Bug fixed in G4NeutrinoNucleusModel, updated calls for QE ratio of + muon/electron (anti-)neutrino.
    • +
    • Set creator model ID for secondaries, using the new version of + G4PhysicsModelCatalog.
    • +
  • +
  • Particle High Precision +
      +
    • G4ParticleHPElementData, G4ParticleHPBGGNucleonInelasticXS: removed + old and unused header files corresponding to Gheisha cross-sections + (that have been deleted). Code cleanup.
    • +
    • G4ParticleHPManager: removed deprecated environmental variables.
    • +
    • G4ParticleHPData, G4ParticleHPJENDLHEData: replaced use of deprecated + G4LPhysicsFreeVector with G4PhysicsFreeVector.
    • +
    • G4ParticleHPThermalScattering, G4ParticleHPElastic: corrected the + original treatment of the temperature interpolation when computing the + neutron final state, with the temperature interpolation performed + stochastically now.
    • +
    • G4ParticleHPThermalScatteringNames: extended the list of materials + which can have thermal data libraries.
    • +
    • Set creator model ID for secondaries, using the new version of + G4PhysicsModelCatalog.
    • +
    • Updated build scripts according to new dependencies. + Clean-up of old directories no longer present.
    • +
  • +
  • Parton-String +
      +
    • Interface extension in G4FTFModel and G4FTFParticipants to provide the + following information: number of projectile spectator nucleons, number + of target spectator nucleons, number of nucleon-nucleon collisions and + impact parameter. In the latter case, there is also the possibility, + switched off by default, to set the range from which to sample the + square of the impact parameter.
    • +
    • Extended G4FTFModel for projectile hypernuclei and anti-hypernuclei.
    • +
    • G4VParticipants, G4VPartonStringModel: extended for projectile + hypernuclei and anti-hypernuclei.
    • +
    • G4FTFParameters, G4QGSParticipants: improved initialization in + constructors, as suggested by Coverity.
    • +
  • +
  • Pre-equilibrium +
      +
    • G4PreCompoundModel, G4LowEGammaNuclearModel: migrated to the new version + of G4PhysicsModelCatalog.
    • +
    • G4PreCompoundEmission, G4LowEIonFragmentation: set creator model ID + for secondaries, using the new version of G4PhysicsModelCatalog.
    • +
    • G4LowEIonFragmentation: fixed minor memory leak at exit.
    • +
    • G4PreCompoundModel: removed obsolete methods; improved code format; + fixed minor memory leak at exit.
    • +
    • G4PreCompound* classes: improved formats and added C++11 keywords.
    • +
    • G4LowEIonFragmentation: fixed Coverity defect warning for memory leak + and code cleanup.
    • +
  • +
  • QMD +
      +
    • G4QMDReaction: replaced G4IonsShenCrossSection (that has been deleted) + with G4ComponentGGNuclNuclXsc. Replaced GetIsoCrossSection() with + GetElementCrossSection(). Migrated to the new version of + G4PhysicsModelCatalog.
    • +
    • G4QMDNucleus::CalEnergyAndAngularMomentumInCM(): fix to move constant 'hbc' + outside of sqrt() in angular momentum calculation.
    • +
  • +
  • Radioactive Decay +
      +
    • G4RadioactiveDecay, G4RadioactiveDecayMessenger: introduced + a new parameter for analogue mode to kill very long radioactive decays + at rest of nuclides happening later than this threshold parameter. + Its default value (10^27 ns) corresponds to more than twice the age of + the universe. The value of the threshold can be changed via a new UI + command, e.g. to set it to 1000 years: + /process/had/rdm/thresholdForVeryLongDecayTime 3.1536e+10 second. + This kind of cut has been introduced in order to avoid to account + energy depositions happening after many billions of years in ordinary + materials used in calorimetry, in particular Tungsten and Lead - via + their natural unstable, but very long lived, isotopes, such as + W183, W180 and Pb204. Note that the cut is not on the average, mean + lifetime, but on the actual sampled global decay time.
    • +
    • G4RadioactiveDecay: updated printout of parameters according to recent + modifications in atomic de-excitation module.
    • +
    • Use existing facility to find logical volume in store, rather than + looping through in G4RadioactiveDecayBase::Select/DeselectAVolume().
    • +
    • Migrated to the new approach of creator model ID, using the new version + of G4PhysicsModelCatalog.
    • +
    • Improved branching ratio consistency in radioactive decays, by replacing + hardwired radioactive-decay-mode numbers with corresponding enum values. + Based on + Github PR #26.
    • +
    • Use proper enum interface for G4String::strip().
    • +
    • Removed obsolete classes G4RadioactiveDecayBase and + G4RadioactiveDecayBaseMessenger.
    • +
    • Removed deprecated UI commands in messengers.
    • +
    • Updated build scripts and header includes.
    • +
  • +
  • Theo_High_Energy +
      +
    • G4TheoFSGenerator: added accessors for the corresponding modifier + methods already existing. This can be useful for users to access + at run-time some information available from a hadronic final-state + model.
    • +
    • Set creator model ID for the secondaries, using the new version of + G4PhysicsModelCatalog.
    • +
  • +
+ + +

Intercoms

+
    +
  • G4UImanager: set LastCommandOutputTreated=false only for master + thread. Avoids inadvertent "highlighting" in G4UIQt on worker threads. + Added access methods to individual UI command.
  • +
  • G4UIparameter: in CandidateCheck(), when candidate not found, print list + of candidates.
  • +
  • G4UIcommand: added command-type identifier. + Added option to sort command/directory names in alphabetic order.
  • +
  • G4UIcommandTree, G4UIdirectory, G4GenericMessenger: improved output HTML + file layout. +
  • Fixed leak in G4ProfilerMessenger.
  • +
  • G4GenericMessenger: added G4ThreeVector type without unit to function + DeclareProperty(). Removed unnecessary duplication of G4UIdirectory objects.
  • +
  • G4UIcontrolMessenger: protected some control commands not to be broadcasted + to worker threads.
  • +
  • Use std::string member functions from G4String in place of + synonyms. Use new std::string compliant G4String interfaces. + Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • Modernised CMake script.
  • +
+ + +

Interfaces

+
    +
  • Modified G4UIExecutive::SelectSessionByFile() to ensure that in Windows + the Win32 OpenGL driver is selected as the second choice by default. + Based on GitHub PR #20.
  • +
  • Extended G4UIWin32 driver with new features, based on contribution + proposed in GitHub PR #23.
  • +
  • Added verbose setting in G4UIExecutive. Addressing problem report + #2402.
  • +
  • Fixed HTML links in Qt UI Start page.
  • +
  • G4UIQt: deal properly with creation and deletion of viewer properties. + Added "exit" icon and extension selection. + Fixed "Viewer Properties" window opened at Startup; "viewer" window must + be constructed with setVisible(false).
  • +
  • G4InteractorMessenger: allow use of exit icon by user.
  • +
  • Use std::string member functions from G4String in place of synonyms. + Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • Use proper enum interface for G4String::strip() and don't discard its + return value.
  • +
  • Added context for VtkQt visualisation driver.
  • +
  • Retired G4UI/G4INTY_... preprocessor symbols in toolkit build, + only required by obsolete GNUmake system.
  • +
  • Removed obsolete Wt code from source and use in G4UIexecutive.
  • +
  • Removed no longer supported GAG/Gain UI classes and settings.
  • +
  • Fixed compilation warnings when C++20 Standard enabled.
  • +
+ + +

Materials

+
    +
  • G4Material: revised and updated G4Exceptions, now providing complete + information and more precise diagnostics.
  • +
  • G4MaterialPropertiesTable: removed deprecated optical material properties. + Recalculate GROUPVEL if RINDEX is modified. + Addressing problem report + #2313. +
  • In G4MaterialPropertiesTable, added new AddProperty() method to allow use of + predefined optical material properties. + Added spline argument to method, which creates + G4MaterialPropertyVector. + Use std::vector for material properties and material const properties, + rather than std::map. Use Boolean flag with material const property to + indicate whether it is defined; renaming of variables: first letter lower case, + class variables start with f; removed iterators to material property + vectors (use C++11 iteration). Fix AddConstProperty() with new key; fix + RemoveConstProperty; make exception codes unique. + Return nullptr when GetProperty() called for non-existent property; fixed + error in GetMatConstPropNames(). Return const refs to vectors for + material[const]props and names. Renamed Get[Const]PropertyMap() to + Get[Const]Properties(). Fixed error with ConstPropertyExists(). + Throw FatalException if asked for index of non-existent property (addressing + Coverity defect).
  • +
  • G4ExtDEDXTable, G4IonStoppingData: corrected initialisation of spline + flag.
  • +
  • G4NistMaterialBuilder: removed unused argument isotopes from all + methods where NIST materials are built.
  • +
  • G4NistManager: adopt modifications in method signatures of + G4NistMaterialBuilder but keep own method signatures unchanged.
  • +
  • New class G4OpticalMaterialProperties, a store for optical material + properties.
  • +
  • G4MaterialPropertiesTable: added 'createNewKey' to AddProperty(); + merged .icc into .cc; removed deprecated methods; applied clang-format.
  • +
  • G4MaterialPropertyVector: use G4PhysicsFreeVector instead of + obsolete G4PhysicsOrderedFreeVector.
  • +
  • G4IonStoppingData, G4ICRU90StoppingData, G4ExtDEDXTable, + G4VIonDEDXTable: substituted G4LPhysicsFreeVector by G4PhysicsFreeVector. +
  • G4Material, G4Element, G4Isotope, G4IonisParamElm, + G4IonisParamMat, G4NistMaterialBuilder, G4NistMessenger, + G4SandiaTable: minor clean-up.
  • +
  • G4ElementVector: use const pointer to G4Element. Define operator<<(); + take const references to avoid needless copy construction.
  • +
  • G4ElementData: reduced length of internal arrays from 108 to 99, max number + 99 is used by G4LivermorePhotoElectricModel, hadronic models use 93. + Use G4int in method signature instead of size_t; improved initialisation. + Provide more safe destruction at the end of run.
  • +
  • G4Material: fixed Coverity report on non-initialized arrays; + use const pointers to G4Elements where needed; added warnings if there is + a mixture of definition of elements by number of atoms and mass fraction; + reduced code duplication and reduced number of new/delete for the case when + materials are added to a material.
  • +
  • G4ExtendedMaterial: removed useless dependence on G4PhysicsModelCatalog, + and improved comment.
  • +
  • G4DensityEffectData: minor clean-up.
  • +
  • Use std::string member functions from G4String in place of synonyms.
  • +
  • Modernised CMake script.
  • +
+ + +

Parameterisations

+
    +
  • GFLASH: +
      +
    • Use G4StrUtil functions replacing deprecated G4String member functions.
    • +
  • +
+ + +

Particles

+
    +
  • Introduced six light hypernuclei and their corresponding antiparticles: + G4HyperTriton, G4AntiHyperTriton, G4HyperAlpha, G4AntiHyperAlpha, G4HyperH4, + G4AntiHyperH4, G4DoubleHyperH4, G4AntiDoubleHyperH4, G4HyperHe5, + G4AntiHyperHe5, G4DoubleHyperDoubleNeutron, G4AntiDoubleHyperDoubleNeutron. + The following simplifying assumptions have been made: + (a) No hyper-deuteron, no hyper-He3; (b) the masses of these hyperons have + been computed using the existing method + G4HyperNucleiProperties::GetNuclearMass(); (c) the lifetimes are all assumed + to be the same as the Lambda's lifetime; (d) the decays are obtained from the + two decays of the (anti-)Lambda (with the same branching ratios as for a free + Lambda), assuming, whenever possible, that 50% of the emitted (anti-)nucleon + will be captured by the (anti-)nucleus where the decay of the (anti-)Lambda + occurs. In the case of double-hyperon, only one of the two Lambdas + is assumed to decay.
  • +
  • G4IonConstructor: added hyper-nuclei.
  • +
  • Added a few methods in G4ParticleDefinition, useful for dealing with + hypernuclei and anti-hypernuclei.
  • +
  • Extended the max number of decay secondaries, from 4 to 5, in the classes + G4VDecayChannel and G4PhaseSpaceDecayChannel, needed for a decay channel of + G4DoubleHyperDoubleNeutron.
  • +
  • Store custom tracking manager per particle definition.
  • +
  • Fixed retrieval of selected particle in G4ParticlePropertyMessenger, + which was failing.
  • +
  • Use std::string member functions from G4String in place of synonyms. + Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • G4ParticleTable: fixed case for potential null pointer dereferencing in + FindParticle(). Based on + GitHub PR #30.
  • +
  • Fixed compilation error in G4IonTable occurring if C++20 enabled.
  • +
  • Fixed shadowing compilation warning in G4Triton.
  • +
+ + +

Persistency

+
    +
  • Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • ASCII: +
      +
    • Added support for G4MultiUnion and G4ScaledSolid. Based on + GitHub PR #28.
    • +
    • G4tgbVolume: corrected missing conversion degree-radian for Polycone.
    • +
    • G4tgbMaterialSimple,G4tgrMaterial: changed STP_Temperature to + NTP_Temperature to be consistent with NIST materials.
    • +
    • G4tgbGeometryDumper: fixed access to G4Elements according to changes + done in materials.
    • +
  • +
  • GDML: +
      +
    • G4GDMLParser: scan for all possible logical volumes with same name in + ImportRegions() and set them as root logical volumes. + Issue notification warning in case more than one logical volume with + same name is found, to be set a root logical volume for a region.
    • +
    • G4GDMLRead: added missing update to internal maps for solids and volumes + stores, after stripping of names execution. Addressing problem report + #2403.
    • +
    • G4GDMLWriteMaterials, G4GDMLWriteSolids: G4MaterialProperties table now + returns references to vectors, rather than maps that had to be allocated + on the heap. Adjust code to iterate over the vectors.
    • +
    • G4GDMLWriteMaterials: use G4PhysicsFreeVector instead of deprecated + G4PhysicsOrderedFreeVector.
    • +
    • G4GDMLReadMaterials, G4GDMLReadSolids: added parameter + createNewKey=true to call to + G4Material[Const]PropertiesTable::AddProperty().
    • +
  • +
+ + +

Physics lists

+
    +
  • Removed dependencies on hadronic/model/util and + hadronic/model/management modules now retired.
  • +
  • Builders: +
      +
    • Replaced G4HadronCaptureProcess with G4NeutronCaptureProcess + and G4HadronFissionProcess with G4NeutronFissionProcess in builders.
    • +
    • Replaced particle-specific hadronic inelastic processes (that have + been deleted) with G4HadronInelasticProcess.
    • +
    • G4PrecoNeutronBuilder, G4PrecoProtonBuilder, G4INCLXXNeutronBuilder, + G4QGSBinaryKaonBuilder: replaced obsoleted cross-sections + (that have been deleted) with better ones.
    • +
    • G4BinaryDeuteronBuilder, G4BinaryTritonBuilder, G4BinaryHe3Builder, + G4BinaryAlphaBuilder: removed unused header files.
    • +
    • G4QGSPNeutronBuilder: use G4NeutronInelasticXS cross-section.
    • +
    • G4HadronicBuilder: properly initialise the vector mode, as suggested + by Coverity.
    • +
  • +
  • Constructors: +
      +
    • decay +
        +
      • G4RadioactiveDecayPhysics: use SetAuger() method instead of the + obsolete SetAugerCascade().
      • +
    • +
    • electromagnetic: +
        +
      • Updated all standard EM physics lists: + removed local member verbose + and use uniform approach for verbosity via G4EmParameters; instantiate + NIEL process only if parameter MaxNIELEnergy is above zero; include + gamma linear polarization model to Opt0, Opt3, Opt4, SS, and + Livermore physics constructors if the parameter EnablePolarisation + is "true"; G4EmLivermorePolarizedPhysics fully inheriting from + G4EmLivermorePhysics.
      • +
      • G4GammaGeneralProcess: updated interface in the Retrieve() method. + Use base material approach.
      • +
      • G4EmDNAPhysics: updated configuration of standard physics for gamma + and positrons according to Opt3; updated particle list by addition + of G4Alpha; simplified ConstructProcess() method using + G4PhysicsListHelper.
      • +
      • Updated G4EmLowEPPhysics physics model configuration + See https://arxiv.org/abs/2102.02721 for details.
      • +
      • G4GammaGeneralProcess: exclude gamma-nuclear from the 2nd energy area, + because cross-section is zero; in the 4th energy interval include in + the vector value of 1 - p instead of p, where p is the cumulative + probability of a sub-process. Make some methods/fields visible for + derived classes.
      • +
      • G4EmStandardPhysicsWVI: making this experimantal configuration + compatible for CPU performance with Opt3 (it was similar to SS). + Use similar options as in Opt3, for ions use + G4LinhardSorensenIonModel.
      • +
      • G4EmModelActivator: updated according to the current Opt3 and Opt4 + configurations.
      • +
      • G4EmDNAChemistry, _option1, _option2, _option3 + added dissociation channel for electron-hole recombination.
      • +
      • G4EmDNAChemistry_option3: changed pre-chemical model.
      • +
      • DNA PhysicsLists: use SeEmModel() with correct signature.
      • +
      • G4OpticalPhysicsList: removed deprecated optical commands.
      • +
      • G4EmLivermorePolarizedPhysics: removed unused header.
      • +
      • G4EmLivermorePhysics: use G4LivermorePolarizedComptonModel if + polarisation is enabled.
      • +
      • Removed obsolete G4EmLEPTSPhysics, and code cleanup in G4EmDNAPhysics + and G4EmDNAPhysics_stationary.
      • +
      • G4EmLivermorePhysics, G4EmPenelopePhysics_option1, + G4EmStandardPhysics_option3, G4EmStandardPhysics_option4, + G4EmLowEPhysics, G4EmStandardPhysicsSS: instantiate G4ePairProduction + process after ionisation and bremsstrahlung; does not change physics + but helps to have clearer debug printouts.
      • +
      • G4EmBuilder: use more optimal order of instantiation of processes; + not affecting any result but useful for debugging. + Added hyper-nuclei EM physics; in all DNA physics-lists, + use SetAuger() instead of SetAugerCascade().
      • +
      • G4OpticalPhysics: applied clang-format style guidelines.
      • +
    • +
    • gamma_lepto_nuclear: +
        +
      • G4EmExtraPhysics, G4BertiniElectroNuclearBuilder, + G4LENDBertiniGammaElectroNuclearBuilder: replaced G4PhotoNuclearProcess + (now deleted) with G4HadronInelasticProcess.
      • +
      • G4EmExtraPhysics: added option for positron annihilation to tau + pair.
      • +
      • Enable updated G4GammaNuclearXS by default in G4EmExtraPhysics for + more detailed tests.
      • +
    • +
    • hadron_elastic: +
        +
      • G4HadronDElasticPhysics, G4HadronHElasticPhysics: use inheritance + from G4HadronElasticPhysics; use G4HadProcesses, G4PhysListUtil and + G4HadParticles; implement cross-section factor.
      • +
      • G4HadronHElasticPhysics: fixed problem of fully overlapping energy + transition between G4HadronElastic and G4ChipsElasticModel, using + now G4ChipsElasticModel only for Hydrogen element above + 10 MeV.
      • +
      • G4ChargeExchangePhysics: set explicitly the elastic cross-sections + according to the hadron type, given that the universal Gheisha + elastic cross-section has been now deleted.
      • +
      • In all constructors, use verbosity level from G4HadronicParameters.
      • +
    • +
    • hadron_inelastic: +
        +
      • In all constructors: printouts are controlled by verbosity level of + G4HadronicParameters class; 'verboseLevel' member in base class is + not used; G4HadronicParameters singleton is initialized in all class + constructors; if the verbosity level is defined in class constructor, + it is propagated to G4HadronicParameters (user may change this level + using UI command before physics is initialized); check versus nullptr + is added in several places.
      • +
      • Removed unused header files, and replaced when needed + G4HadronCaptureProcess with G4NeutronCaptureProcess.
      • +
    • +
  • +
  • Lists: +
      +
    • Replaced particle-specific hadronic inelastic processes + (that have been deleted) with G4HadronInelasticProcess in LBE. + Renamed G4HadronCaptureProcess as G4NeutronCaptureProcess.
    • +
    • In all physics-lists, protected banners by verbosity level.
    • +
    • G4PhysListFactory: added verbosity level to constructor and propagated + to constructed lists.
    • +
    • Mirror changes to G4PhysListFactory constructor signature (taking a + default verbosity argument) in the G4PhysListFactoryAlt constructor.
    • +
    • Use G4StrUtil functions replacing deprecated G4String member functions.
    • +
  • +
  • Util: +
      +
    • G4HadParticles: added hyper-nuclei.
    • +
  • +
+ + +

Readout

+
    +
  • Use std::string member functions from G4String in place of synonyms.
  • +
+ + +

Run

+
    +
  • Optimised access to volumes and regions stores.
  • +
  • Minor C++11 review in use of iterators, initialisers, etc...
  • +
  • Removed obsolete ResetCuts() method in G4VUserPhysicsList.
  • +
  • Added new Ranlux++ engine to the list of supported random engines in + G4UserWorkerThreadInitialization. Requires CLHEP-2.4.5.1.
  • +
  • Added new G4DNAStaticMoleculeReactionProcess in PhysicsListHelper + for DNA processes.
  • +
  • Removed call to physicsList->TerminateWorker() in G4WorkerRunManager + as this appears to cause errors at termination.
  • +
  • G4VUserPhysicsList: invoke new static initialization of G4PhysicsModelCatalog + in Construct(). Use custom tracking manager if registered.
  • +
  • G4PhysicsListHelper: replaced hardwired numerical process types and + sub-types with corresponding enum values.
  • +
  • G4VPhysicsConstructor: fixed initialisation of hadronic parameters + avoiding uncontrolled override of verbosityLevel.
  • +
  • Use std::string member functions from G4String in place of synonyms. + Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • General code cleanup and formatting.
  • +
+ + +

Tasking

+
    +
  • Updated to PTL v2.0.0 with shared_ptr usage. Included some minor API + changes to direct async usage.
  • +
  • Fixes to TBB task-group usage.
  • +
  • Fix for G4FORCENUMBEROFTHREADS flag lookup.
  • +
  • G4RunManagerFactory: set default run manager type to be Tasking.
  • +
  • Added new Ranlux++ engine to the list of supported random engines in + G4UserTaskThreadInitialization. Requires CLHEP-2.4.5.1.
  • +
  • G4TaskRunManager: check for valid threadPool pointer in method + RequestWorkersProcessCommandsStack() to fix occasional segmentation + fault at exit.
  • +
+ + +

Track & Tracking

+
    +
  • Introducing G4VTrackingManager, an interface for custom tracking + managers specialized for one or a small number of particle types.
  • +
  • G4SteppingManager: added a pointer to a G4NoProcess instance, and used it + in InvokeAtRestDoItProcs() to flag a stable ion at rest. This avoids the + otherwise confusing information that radioactive decay is the process + defining the last step of a stable ion at rest.
  • +
  • Correction to G4Track::operator=() to copy also touchable-handles. + This fixes a crash originated when running importance sampling in the + G4EventManager when the track got assigned the origin touchable handler + from its own touchable handle; the touchable handler was sometimes not + set.
  • +
  • G4Track: migrated to the new version of G4PhysicsModelCatalog. + Get material property using index rather than string.
  • +
  • G4Step: avoid accessing G4Track data via long pointer chains.
  • +
  • Adjusted printout format in DumpInfo() for G4VParticleChange + and G4ParticleChange.
  • +
  • Introducing G4SteppingVerboseWithUnits, an alternative to + G4SteppingVerbose with printout of proper units and extended features. + Added explicit virtual keyword for virtual methods and destructor in + G4SteppingVerbose.
  • +
  • G4SteppingVerbose: fixed bug that wrongly put the Forced label + in the print-out information of non-forced processes, and vice-versa, + omitting it for real forced processes. Issue which was causing confusing + and misleading print-out.
  • +
  • G4ParticleChangeForMSC, G4ParticleChangeForTransport: disable debugFlag + which was left enabled by mistake.
  • +
  • G4RichTrajectory: migrated to the new version of G4PhysicsModelCatalog.
  • +
  • Export protected static symbols in G4VSteppingVerbose for DLL builds + on Windows.
  • +
  • G4SteppingVerbose, G4SteppingManager: added a switch to instantiate + G4SteppingVerboseWithUnits.
  • +
  • Simplified way of defining a user-specific stepping verbose, that + is now common to all sequential, MT and tasking modes.
  • +
  • Avoid unnecessary indirections when checking for regional stepping + action by reusing the value of current volume in stepping manager.
  • +
  • Use existing facility to find logical volume in store, rather than + looping through in G4AdjointCrossSurfChecker.
  • +
  • Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
+ + +

Visualization

+
    +
  • General +
      +
    • Revised vis models. See notes for "modeling" above for more details. + Consequent changes: AddPrimitive(const G4Scale&) has been removed from + all scene handlers.
    • +
    • Introduced a Vtk driver.
    • +
    • Introduced ToolsSG drivers.
    • +
    • Introduced in-app plotting; available only with ToolsSG drivers at + present.
    • +
    • Introduced "special mesh rendering" for G4VNestedParameterisation for + fast rendering of meshes typically used for medical phantoms.
    • +
    • Use G4StrUtil functions replacing deprecated G4String member functions.
    • +
    • Retired G4VIS_*, G4UI/G4INTY_* preprocessor symbols in toolkit build, + only required by obsolete GNUmake system.
    • +
    • Removed unused XXX module.
    • +
  • +
  • Management +
      +
    • Added UI commands for "Special Mesh Rendering": + /vis/viewer/set/specialMeshRendering and + /vis/viewer/set/specialMeshVolumes + Only available with OpenGL drivers at present.
    • +
    • Implemented a default AddCompound(const G4Mesh&) method: just draws the + "container" volume and prints a G4Exception with guidance.
    • +
    • Added AddPrimitive(const G4Plotter&) and /vis/plotter/ UI + command.
    • +
    • Draw(const G4Scale&) has been removed from G4VisManager; + /vis/scene/add/scale reimplemented with G4CallBackModel; all + commands using G4CallBackModel follow interface change.
    • +
    • Added new data members to view parameters.
    • +
    • Exploit C++17 to parse saved files in /vis/viewer/interpolate.
    • +
    • Introducing /vis/scene/add/localAxes and + /vis/touchable/localAxes UI commands.
    • +
    • G4Scene: removed misleading warning message. Allow multiple models + for the same name, but different parameters, to be added without warning.
    • +
    • G4VSceneHandler: use C++17 [[fallthrough]] instead in switch + statement. Added code for drawing the extents of models in a scene for + debugging.
    • +
    • Removed deprecated G4VisManager::SetUserAction(). + Use RegisterRunDurationUserVisAction or similar instead. + These functions represent quite an advanced use of visualisation + and are rarely used.
    • +
    • Sort /vis/* UI commands in alphabetical order.
    • +
    • /vis/set/extentForField, /vis/scene/add/electricField and + magneticField: improved guidance to take note of change to + G4VFieldModel, namely that the number of data points is now calculated + on the basis of the extent, which can be set as above.
    • +
    • Interrupt macro (vis.mac) if graphics system invalid/unavailable. + Issues "Batch is interrupted" and avoids long litany of further errors.
    • +
    • G4VViewer: trap request to set touchable of a physical volume no longer + in the physical volume store and issue message.
    • +
    • /vis/scene/add/volume (and /vis/drawVolume): exploit + G4PhysicalVolumesSearchScene to streamline geometry tree searches. + Avoid calculating extent of a temporary physical volume when not + necessary. + The above does introduce a change of behaviour for the case that a user + names the volume(s) requested, e.g., /vis/drawVolume Shape1. + The user will not normally see any difference - but it does avoid + extravagant computation in some circumstances.
    • +
    • G4VVisCommand, G4VisCommandsSceneHandler and G4VisCommandsViewer: preserve + view parameters of any existing viewer and use them in the creation of a + new viewer. So, if the user requests a new viewer of the same or a new + graphics system, the upcoming view will inherit the view parameters of + the previously existing viewer. The idea is that it makes the response a + UI command /vis/viewer/open (or /vis/viewer/create) more + natural. The first /vis/open is not affected.
    • +
    • In G4VisCommansCompound, with /vis/drawTree, invoke + /vis/viewer/reset to ensure culling is off, so that all + volumes are printed.
    • +
    • G4VisCommandsCompound, G4VisCommandOpen, G4VisCommandSceneHandlerCreate: + improved reporting of unrecognised graphics system.
    • +
    • G4VisCommandsTouchable: modified according to changes in + G4PhysicalVolumeModel.
    • +
    • G4VisCommandsSet, G4VisCommandsTouchable and G4VisCommandsViewer: + added comment of explanation where using G4PhysicalVolumesSearchScene.
    • +
    • Use existing facility to find logical volume in store, rather than + looping through in G4VisCommandSceneAddLogicalVolume::SetNewValue().
    • +
    • G4VisCommands: replaced /vis/ogl/printEPS with + /vis/ogl/export in guidance.
    • +
    • G4VisCommandsScene: implemented /vis/scene/removeModel.
    • +
    • G4ViewParameters: added Special Mesh Rendering parameters to + /vis/viewer/save.
    • +
    • G4VVisCommandGeometrySet: recalculate extent of any physical volume model + in run duration lists after any /vis/geometry command (the scene's + extent might have been changed by the command).
    • +
    • Introducing GetColour(const G4Visible&).
    • +
    • Protect pointers in G4VisManager::GeometryHasChanged().
    • +
    • Fixed Windows static issue in G4VVisCommand.
    • +
    • G4VisManager: fixed cout destination for UI manager during deletion.
    • +
    • G4VisExecutive: removed obsolete VRML1 and network VRML2 drivers + Removed obsolete network FukuiRenderer driver. + Removed deprecated Wt driver.
    • +
    • G4ViewParameters: fixed Coverity warning.
    • +
    • Improved warning messages.
    • +
  • +
  • Modeling: +
      +
    • Revised vis models: over time, models have sprouted some inconsistencies. + This is an attempt to rationalise them. The most significant model, used + in all applications to draw the detector, is G4PhysicaVolumeModel. To + handle all the options, G4PhysicalVolumeModel takes care of the + transformation of any primitives that it generates. It ignores the + transformation available in the base class, G4VModel. This revision + brings all models in line with this policy. + At the same time, we remove G4Scale and G4ScaleModel. G4Scale is an + anomaly. It is not a "primitive" (obviously), but somehow, from the long + distant past, it was implemented as though it was. These classes have been + removed and /vis/scene/add/scale reimplemented with + G4CallBackModel.
    • +
    • Introducing new primitive G4Plotter.
    • +
    • G4PhysicalVolumeModel: make CalculateExtent() a public function. + Fixed bug in calculation of extent. In Validate(), avoid crash if + volume no longer in physical volume store; improved warning message.
    • +
    • Introducing G4Mesh, a light class that encapsulates and validates a + nested parameterisation, called a "mesh". If a valid mesh cannot be + created out of a G4VPhysicalVolume, it will have a type "invalid". + The overhead of an invalid attempt is expected to be small, all the + same it should only be invoked if the user specifies mesh rendering.
    • +
    • G4ModelingParameters: added new data members and access functions.
    • +
    • G4PhysicalVolumeModel: added code for special mesh rendering, under + control of user flag. If flag is set by the above commands, and if a + volume is a "mesh" (a container for a nested parameterisation), invoke + new method AddCompound(const G4Mesh&).
    • +
    • G4PhysicalVolumeModel: moved fFullPVPath.push_back earlier, addressing + a bug in visualisation of touchables.
    • +
    • Improved G4VModel; make SetTransform() virtual.
    • +
    • G4ArrowModel, G4AxesModel and G4TextModel: implement SetTransform().
    • +
    • Take care to apply to original model. For example, if SetTransform() is + called more than once it must apply to the original.
    • +
    • G4PhysicalVolumeModel: for the resultant of clipping, set the + visualisation attributes of the original.
    • +
    • G4VFieldModel: Change concept of choice of data points: this model + simply checked that a data point was within the extent. + Now it uses the extent to determine the datapoint spacing. + Note: if fExtentForField is null, the used extent is that of the + current scene; otherwise it uses that supplied by the user.
    • +
    • G4PhysicalVolumesSearchScene: allow user to limit the depth of descent + during a geometry tree search.
    • +
    • G4PhysicalVolumeModel: if opacity (alpha) == 0 (completely transparent), + treat same as pVisAttribs->IsVisible(). + G4PhysicalVolumeModel: simplified validation.
    • +
    • As a result of Coverity warnings, improved G4PhysicalVolumeModel: clean up + in case of found G4Mesh; hold current transform as object, not as a + pointer.
    • +
    • G4TouchablePropertiesScene: modified according to changes in + G4PhysicalVolumeModel.
    • +
    • Added G4Exception in default implementation of + G4PseudoScene::ProcessVolume().
    • +
  • +
  • FukuiRenderer +
      +
    • Removed obsolete network FukuiRenderer driver.
    • +
  • +
  • gMocren +
      +
    • Use updated renamed method GetNoVoxels() in G4PhantomParameterisation + instead of GetNoVoxel(), now removed.
    • +
  • +
  • HepRep +
      +
    • Fixed compilation error in G4HepRepSceneHandler when C++20 is enabled.
    • +
    • Removed obsolete HepRep(WIRED) driver and associated files.
    • +
  • +
  • OpenGL +
      +
    • G4OpenGLImmediateQtViewer and G4OpenGLStoredQtViewer: set jpg as default + export format for Qt viewers, for use with /vis/ogl/export; jpg + is only available for Qt viewers, pdf is the default for other OpenGL + viewers.
    • +
    • Make better use of G4VSceneHandler::AddPrimitive().
    • +
    • Fix in G4OpenGLViewer for C++20 warnings.
    • +
    • Fixed text alignment issue with a fudge factor in + G4OpenGLQtViewer::DrawText().
    • +
    • Fix in G4OpenGLViewer for C++20 warnings.
    • +
    • Specialise fudge factor for __APPLE__. It seems only Mac has this + problem. Maybe it's to do with the retina display. Maybe Qt keeps + it's own pixel size.
    • +
    • G4OpenGLViewerMessenger: removed /vis/ogl/printEPS command, now + covered by the more versatile /vis/ogl/export. Rationalised image + exporting.
    • +
    • G4OpenGLSceneHandler: use C++17 [[fallthrough]] in switch + statements.
    • +
    • G4OpenGLViewer: subsume the code in printEPS into exportImage.
    • +
    • G4OpenGLXmViewer::print_callback: call exportImage instead of printEPS.
    • +
    • G4OpenGLStoredSceneHandler, G4OpenGLViewerMessenger: increase the default + display list limit to 10 million. The default OpenGL display list limit + was 50,000, an archaic value from the days when memory was much more + limited than is typical today. The number can be changed with + /vis/ogl/displayListLimit, either to increase it further or + lower it, subject to a lower limit of 10000.
    • +
    • In FinishView() and ShowView() of X/Xm viewers, comment out glXWaitGL(). + Wait for effects of all previous OpenGL commands to be propagated + before progressing.
    • +
    • G4OpenGLSceneHandler: disable backface culling.
    • +
    • G4OpenGLStoredViewer and G4OpenGLStoredQtViewer: suppress kernel visit + (no longer needed) for cutaway drawing. + Note 1: Section and Cutaway can reveal back-facing faces. If backface + culling is implemented, the image can look strange because the back-facing + faces are not there. As described above, we have disabled (commented out) + backface culling. It seems not to affect performance. + Note 2: In G4OpenGLStored(Qt)Viewer::CompareForKernelVisit() we decide if a + "kernel visit" (which involves a reconstruction of the graphical database + from the kernel) is required on a change of view parameters. Simple + rotating and zooming does not require a kernel visit, but more sophisticated + parameters may. In G4OpenGLSceneHandler we implement cutaways using + OpenGL cut planes, so now we have disabled backface culling, we do NOT need + to visit the kernel. This is the change that makes a huge speed up when + a user requests cutaways.
    • +
    • G4OpenGLQtViewer: use 'modelShortName' instead of 'modelDescription'.
    • +
    • Fixed compilation error in G4OpenGLXmConvenienceRoutines when C++20 is + enabled.
    • +
    • Implemented WindowProc() function in G4OpenGLWin32Viewer for the Win32 + OpenGL driver (function that was commented out). It is now possible to + change the Zoom and the orientation using the mouse (like in the Qt + driver). Based on contribution in + GitHub PR #20.
    • +
    • Implemented AddCompound(const G4Mesh&) method: turns nested + parameterisations into polymarkers of dots - much improved speed.
    • +
    • Enable extended WIN32 window in G4OpenGLWin32Viewer. + Based on contribution in + GitHub PR #23.
    • +
    • G4OpenGLQtViewer::addNonPVSceneTreeElement(): special case for markers, + use Info() if non-empty name appearing in Qt's scene tree. This allows + the user to design markers, e.g., a list of points, and give them a name + that relates to the providence of the points, e.g., a particular + material or geometry component.
    • +
    • Removed deprecated Wt driver.
    • +
    • G4OpenGLStoredQtViewer: moved fViewId<0 check to top of + constructor to pick up errors in base class construction.
    • +
    • Removed deprecated /vis/ogl/set/ commands.
    • +
    • All commands connected with a time window. Use equivalent + /vis/viewer/set/timeWindow commands.
    • +
    • /vis/ogl/set/eventsDrawInterval [N] is replaced by + /vis/ogl/flushAt NthPrimitive [N].
    • +
    • Fix in G4OpenGLStoredXmViewer destructor.
    • +
    • G4OpenGLWin32Viewer: fixed occasional crash with G4UIWin32 when + creating viewer from UI command: avoid indirect call to DrawView() + while still within CreateMainWindow().
    • +
    • Comment out makeCurrent() in G4OpenGLImmediate/StoredQtViewer + to prevent red-button crash.
    • +
  • +
  • OpenInventor +
      +
    • G4OpenInventorQtExaminerViewer: for tabbed viewer in UIQt, added a + Detach button to move the viewer to its own dedicated and resizable + window on the desktop. Added event handler for mouse wheel to fix the + non-intuitive behavior. Mouse-wheel-forward now zooms/dollys in. + Added viewer button to enable the "axis cross" (3d axes) feedback + mechanism.
    • +
    • G4OpenInventorViewer: upgraded the group node sensor to process camera + movements, thus eliminating the need for the camera sensor. The node + sensor receives all camera notifications and is immune to changes in + the camera type.
    • +
    • Force kernel visit if special mesh rendering parameters change.
    • +
    • Code cleanup of OpenInventorQt classes.
    • +
  • +
  • Qt3D +
      +
    • Improve overall protection of debug output with debug flags. + Moved debug code to G4Qt3DUtils header.
    • +
    • Force kernel visit if special mesh rendering parameters change.
    • +
    • Include some trial code (commented out) for text output.
    • +
    • Fixed problem of drawing from the vis sub-thread. + Added G4Qt3DViewer::MovingToVisSubThread() and MovingToMasterThread().
    • +
    • G4Qt3DSceneHandler: raise G4Exception if no available node. + Introduced AddCompound(const G4Mesh&) method.
    • +
    • G4Qt3DViewer: protect against illegal call to show(); it may only be + called from the master thread.
    • +
    • Revert to black background.
    • +
  • +
  • Raytracer +
      +
    • Make RayTracerX viewers "auto refresh". This means the ray tracer will + start tracing immediately on opening (/vis/open RayTracerX) and + on any change of view parameters. Only affecting RayTracerX; plain + RayTracer is not affected. It is possible to switch this feature off + with /vis/viewer/set/auto-refresh false.
    • +
    • Removed instantiation of G4The(MT)RayTracer from G4RayTracer. + G4RayTracer is/should be a "pure factory". Its job is to instantiate + a scene handler or viewer on request. G4The(MT)RayTracer should/need + only be instantiated when the viewer is instantiated.
    • +
    • Make better use of G4VSceneHandler::AddPrimitive().
    • +
  • +
  • ToolsSG +
      +
    • Introducing ToolsSG (TSG) drivers based on externals/g4tools. + Supports in-app plotting.
    • +
    • Providing four new (mutually exclusive) vis drivers: TOOLSSG_X11_GLES, + TOOLSSG_WINDOWS_GLES, TOOLSSG_XT_GLES and TOOLSSG_QT_GLE.
    • +
  • +
  • Tree +
      +
    • Updated according to changes in G4PhysicalVolumeModel.
    • +
    • Make better use of G4VSceneHandler::AddPrimitive().
    • +
  • +
  • VRML +
      +
    • Removed obsolete VRML1 and network VRML2 drivers.
    • +
    • VRML*FILE drivers: introduced environment variables G4VRMLFILE_HEADER + and G4VRMLFILE_FILE_NAME to allow the user to change the defaults. Also + improve messaging to inform the user of this possibility.
    • +
  • +
  • Vtk +
      +
    • New VtkQt and VtkNative visualisation drivers.
    • +
  • +
  • Externals +
      +
    • Migrated gl2ps to version 1.4.2. + Allow use of non-APPLE OpenGL on APPLE. + To use this, build with macro GL2PS_USE_GL_GL_H.
    • +
    • Fixed issues with GL when building X11 and Qt. + GL libs should be included only once.
    • +
  • +
+ + +

Environments

+
    +
  • G4Py: +
      +
    • Use exact version of Python for boost.python module. Based on + GitHub PR #31.
    • +
    • Export binding for G4ElementVector, according to updates to G4ElementTable.
    • +
    • Removed obsolete VRML1 driver settings.
    • +
    • Removed setup for obsolete HepRep(WIRED) driver.
    • +
    • In TestEm0, use default EM physics in place of obsolete + G4EmProcessOptions.
    • +
  • +
  • zmq: +
      +
    • Use G4StrUtil functions replacing deprecated G4String member functions.
    • +
  • +
  • Removed obsolete MOMO module.
  • +
+ + +

Data sets

+
    +
  • New low-energy data set version, G4EMLOW-8.0: +
      +
    • Removed tabs in option4 cross-section files.
    • +
    • Added new cross sections for electron transportation in gold + within Geant4-DNA.
    • +
    • Added directories Elastic, Inelastic and + Structure for microelec models.
    • +
    • Fixed problem in file sigmadiff_cumulated_ionisation_e_RBEBV_Z79.dat.
    • +
    • Added ANSTO atomic de-excitation data.
    • +
    • Added updated epics2017 data.
    • +
    • Removed some unused data.
    • +
  • +
  • New data files for evaluated cross-sections G4PARTICLEXS-4.0: +
      +
    • Extended data for all isotopes for neutron, proton and light ion + cross-sections. New dataset for gamma incident based on IAEA/PD-2019 + both for elements and isotopes.
    • +
  • +
  • New optional data set version for incident protons, + G4TENDL-1.4: +
      +
    • New version based mainly on TENDL-2019 (previous one was from TENDL-2014). +
    • Isotopes not coming from TENDL-2019: +
        +
      • Files in ENDF/B-VIII.0 (check the complete list in the README files of + each subdirectory: Proton, Deuteron ...).
      • +
      • The 5 isotopes in the JENDL/DEU-2020 data library, for incident + deuterons on Li-6, Li-7, Be-9, C-12 and C-13.
      • +
      • p+C-13, which is based on TENDL-2014, because ENDF/B-VII.1 proton file + (adopted by TENDL-2019) only provides radiative capture final state.
      • +
    • +
    • File corresponding to p+Be9, coming from ENDF/B-VIII.0 has been modified + to avoid case of G4Exception in Geant4.
    • +
    • Update README files in Proton, Deuteron, Triton, He3 and Alpha + directories.
    • +
  • +
+ + +

Examples

+
    +
  • Updated reference outputs, macros, READMEs and scripts.
  • +
  • Fixes for Doxygen documentation and coding guidelines.
  • +
  • Replaced deprecated G4VisAttributes::Invisible by + G4VisAttributes::GetInvisible().
  • +
  • Migration to new G4AnalysisManager.hh header and define the + default output file type for analysis.
  • +
  • Use std::string member functions from G4String in place of synonyms. + Use G4StrUtil functions replacing deprecated G4String member functions.
  • +
  • Bump required CMake version range to 3.16...3.21.
  • +
  • advanced +
      +
    • air_shower +
        +
      • Removed UltraAnalysisManager class, using default commands.
      • +
      • Updated code to use C++11 features.
      • +
    • +
    • amsEcal +
        +
      • Migrated to use G4RunManagerFactory and G4SteppingVerboseWithUnits.
      • +
    • +
    • brachytherapy +
        +
      • Code cleanup: use C++11 keywords and patterns.
      • +
      • Removed BrachyMaterial class; materials implemented now using NIST + material manager.
      • +
      • Removed SetCuts() from the local PhysicsList.
      • +
    • +
    • CaTS +
        +
      • New application implementing a flexible and extendable framework for + the simulation of calorimeter and tracking detectors. + It also demonstrates how to use + Opticks + for the creation and propagation of optical photons.
      • +
    • +
    • composite_calorimeter +
        +
      • Migrated to multi-threading, using G4RunManagerFactory.
      • +
      • Introduced the action initializer.
      • +
      • Split the definition of the sensitive part of the detector + from the detector construction itself. A new method, + sensitiveHandling(), has been introduced in the base class CCalG4Able.
      • +
      • Made the following three classes thread-local singletons: CCalSDList, + CCalSensAssign and CCalSensitiveDetectors.
      • +
      • Multi-threaded use of the G4AnalysisManager in the run action with the + merging of histograms and ntuple of all working threads at the end of + the run.
      • +
    • +
    • doiPET +
        +
      • Migrated to use G4RunManagerFactory.
      • +
      • Analysis now done with G4Analysis.
      • +
      • Link to reference data and analysis scripts provided to let users + compare simulation results to reference data.
      • +
      • Added some controls to prepare DOI-look-up table.
      • + If DOI look-up table is provided as a file, then it will use it. + If look-up table is not provided, the program will prepare the look-up + table based on the information provided by the user (no. of crystals, + etc). +
      • In performing Anger Logic calculation, the interaction position is + mapped to the center of the crystal before 2D position error is added + to model photomultiplier tube (PMT) error.
      • +
      • A C++ analysis program is provided to calculate the sensitivity of the + scanner for a line source.
      • +
      • Fixed compilation warnings for unused private variables in + doiPETDetectorConstruction and doiPETEventAction. Removed tabs.
      • +
      • Removed unused header.
      • +
    • +
    • eRosita +
        +
      • Migration of code to multithreading.
      • +
    • +
    • gammaknife +
        +
      • Delete runManager at the end of the run.
      • +
    • +
    • gammaray_telescope +
        +
      • Fixed interactive mode.
      • +
      • GammaRayTelHadronPhysics: replaced G4HadronCaptureProcess with + G4NeutronCaptureProcess, and G4HadronFissionProcess with + G4NeutronFissionProcess. + Replaced stopping processes that have been deleted. + Replaced old pion inelastic cross-sections (that have been deleted) + with G4BGGPionInelasticXS.
      • +
      • GammaRayTelHadronPhysics, GammaRayTelIonPhysics: replaced + G4PhotoNuclearProcess (that has been deleted) with + G4HadronInelasticProcess.
      • +
      • Minor change in the GammaRayTelRunAction::OpenFile() method to allow + filenames longer than the hardcoded 25 character limit.
      • +
      • Removed dependency on G4EmProcessOptions.
      • +
      • Removed SetCuts() from the local PhysicsList.
      • +
      • Removed obsolete input macros and use EM option-4 in physics_opt4.mac.
      • +
      • Removed obsolete classes.
      • +
    • +
    • gorad +
        +
      • Protect explicit inclusion of G4UIQt header.
      • +
      • Fixed potential shadowing compilation warnings in GRInitialization.
      • +
    • +
    • hadrontherapy +
        +
      • Modified HadrontherapyLet for file generation.
      • +
      • Removed dependency on G4EmProcessOptions.
      • +
      • Geometry modification in CarbonBeamLine.
      • +
      • Removed unncessary G4AutoDelete of StepProcessMax in physics list.
      • +
      • Minor changes in macro files.
      • +
    • +
    • HGCal_testbeam +
        +
      • SiliconPixelHit, SiPMHit: fixed problem in handling of NIEL energy + deposition.
      • +
      • CMSHadronPhysicsFTFP_BERT: added class from CMS.
      • +
      • Removed obsolete class CMSEmStandardPhysicsHcal.
      • +
      • FTFPCMS_BERT_EMM: use correct combination of physics constructors.
      • +
      • Removed use of obsolete RanecuEngine. Updated CMS EM physics.
      • +
      • Fixed compilation warning for unused private member in + PrimaryGeneratorAction.
      • +
    • +
    • ICRP110_HumanPhantoms +
        +
      • Introduced ICRP110PhantomVisAction. Updated vis.mac which shows + how to activate it.
      • +
      • Revised implementation of bone material.
      • +
      • Fix in UserScorerWriter to avoid potential division by zero.
      • +
      • Updated OrganMasses.dat; the Dose is now calculated averaged over the + entire mass of the organ, and not only in the voxels of the organ where + there is edep recorded.
      • +
      • Use /vis/viewer/set/specialMeshRendering. Draw the full + phantom. In ColourMap.dat, all materials (except air) are now opaque.
      • +
      • General code cleanup.
      • +
    • +
    • iort_therapy +
        +
      • Removed dependency on G4EmProcessOptions.
      • +
      • Removed SetCuts() from the local PhysicsList.
      • +
      • Set cuts per region in ConstructProcess(). RegionStore is not available + when accessed from the constructor of the Physics List.
      • +
    • +
    • lAr_calorimenter +
        +
      • Migrated to use G4RunManagerFactory.
      • +
    • +
    • microbeam +
        +
      • Added initialisation of data in the + constructor of the RunAction class.
      • +
      • Use explicit constructors and override instead of + virtual in derived classes. Use G4 types in + DetectorConstruction.
      • +
      • In main() do not initialize run and number of threads, let + these be done in macro microbeam.mac.
      • +
      • DetectorConstruction: use CLHEP::twopi. Avoid having + fField pointer as class member, use G4AutoDelete + registration instead.
      • +
      • CellParameterisation: initilize all data members.
      • +
    • +
    • microelectronics +
        +
      • Updated PhysicsList to new EM settings.
      • +
      • Updated analysis script plot.C.
      • +
    • +
    • purging_magnet +
        +
      • Migrated to use G4RunManagerFactory.
      • +
      • Updated physics list to use Modular physics list, with + G4EmStandardPhysics_option4.
      • +
    • +
    • radioprotection +
        +
      • Added the Bridge silicon microdosimeter and a macro to perform + microdosimetric calculations. Analysis macros run with Root6.
      • +
    • +
    • STCyclotron +
        +
      • STCyclotronSensitiveTarget: remove deprecated include.
      • +
      • Use new CLHEP units for minute, hour, day, year in + STCyclotronPhysicsList.
      • +
    • +
    • underground_physics +
        +
      • In DMXParticleSource::ConfineSourceToVolume(), use existing + facility to faster find physical volme in store, rather than looping + through. Some code cleanup.
      • +
      • DMXPhysicsList: replaced G4HadronCaptureProcess with + G4NeutronCaptureProcess. Replaced stopping processes that have been + deleted. Removed header files of old and unused pion inelastic + cross-sections (that have been deleted). Replaced particle-specific + inelastic processes (that have been deleted) with + G4HadronInelasticProcess.
      • +
      • Replaced deprecated optical commands & parameters with new ones.
      • +
    • +
    • xray_fluorescence +
        +
      • Migrated to use G4RunManagerFactory.
      • +
      • Removed dependency on G4EmProcessOptions.
      • +
      • Removed SetCuts() from the local PhysicsList.
      • +
      • Updated for changes in the analysis category.
      • +
    • +
  • +
  • basic +
      +
    • Migrated to use G4SteppingVerboseWithUnits.
    • +
    • Use nullptr instead of 0.
    • +
    • Cleaned trailing whitespaces from all files.
    • +
    • Introduced namespace instead of a class names prefix.
    • +
    • Declare overriding functions override (and removed + virtual keyword).
    • +
    • B4 +
        +
      • Removed macros/visTutor. A movies tutorial is now in extended example + visualization/movies. Remove visTutor menu in all gui.mac files.
      • +
    • +
    • B5 +
        +
      • Added input script plotter.mac to use new plotter commands.
      • +
      • Added analysisManager->Reset() in begin of run, as resetting + was disabled for plotting in end of run.
      • +
    • +
  • +
  • extended +
      +
    • analysis +
        +
      • Removed AnaEx03 with the AIDA implementation.
      • +
      • AnaEx01 +
          +
        • Define analysis manager configuration and create histograms + only once.
        • +
        • Always close analysis files in EndOfRunAction.
        • +
      • +
    • +
    • biasing +
        +
      • B03 +
          +
        • B03PhysicsList: replaced G4HadronCaptureProcess with + G4NeutronCaptureProcess, and G4HadronFissionProcess with + G4NeutronFissionProcess. Replaced old ion cross-sections (that have + been deleted) with better ones. Use G4HadronInelasticProcess for + inelastic processes (the particle-specific inelastic processes have + been deleted).
        • +
      • +
    • +
    • electromagnetic +
        +
      • TestEm0 +
          +
        • Updated PhysListEmStandard.
        • +
        • DetectorConstruction: print only used material.
        • +
        • RunAction: improved output format.
        • +
      • +
      • TestEm1 +
          +
        • Migrated main() to use G4RunManagerFactory and + G4SteppingVerboseWithUnits.
        • +
        • Updated PhysListEmStandard.
        • +
        • DetectorConstruction: do not print materials table.
        • +
        • StepMax: code formatting.
        • +
        • Added macro stepMax.mac.
        • +
      • +
      • TestEm2 +
          +
        • Migrated to use G4SteppingVerboseWithUnits.
        • +
        • Removed obsolete PhysList5DEmStandard. 5D model is a part of + Opt4 and other physics configurations.
        • +
        • Updated PhysListEmStandard.
        • +
        • DetectorConstruction: do not print materials table.
        • +
        • StepMax, StepMaxMessenger, PhysicsList, PhysicsListMessenger: + revert, to make command /testem/stepMax working in + interactive mode.
        • +
        • SteppingVerbose: set precision via data member; modified process + name.
        • +
        • Use G4RunManagerFactory in main().
        • +
        • Added macro stepMax.mac.
        • +
      • +
      • TestEm3 +
          +
        • Updated PhysListEmStandard.
        • +
        • StepMax, StepMaxMessenger, PhysicsList, PhysicsListMessenger: + revert, to make command /testem/stepMax working in + interactive mode.
        • +
        • Migrated to G4RunManagerFactory and G4SteppingVerboseWithUnits.
        • +
        • Added macro stepMax.mac.
        • +
      • +
      • TestEm4 +
          +
        • Migrated to G4RunManagerFactory and G4SteppingVerboseWithUnits.
        • +
      • +
      • TestEm5 +
          +
        • Updated PhysListEmStandard.
        • +
        • Migrated to G4SteppingVerboseWithUnits.
        • +
        • TrackingAction: fixed bug for filling histos 6 and 7. + Fixed bug for histo of vertex position.
        • +
        • StackingAction: migrated to the new version of + G4PhysicsModelCatalog.
        • +
        • StepMax, StepMaxMessenger, PhysicsList, PhysicsListMessenger: + revert, to make command /testem/stepMax working in + interactive mode.
        • +
        • Use G4RunManagerFactory in main().
        • +
        • Fixed inconsistency of target/world size defined by a user + Addressing problem report + #2379.
        • +
        • DetectorConstruction: if any geometry size is changed then + recompute all geometry parameters.
        • +
        • PrimaryGeneratorAction: reinitialise beam position for each + new run.
        • +
        • Included new macro pixe_ANSTO.mac to show how to activate + the ANSTO PIXE data libraries. Use ANSTO radiation yields + instead of EADL.
        • +
        • StackingAction: use new modelID scheme.
        • +
        • Removed obsolete PhysListEm5DPhysics and PhysListEm19DPhysics, + as these models are now part of regular physics constructors.
        • +
        • Added macros stepMax.mac and subcut.mac.
        • +
      • +
      • TestEm6 +
          +
        • Migrated to use G4RunManagerFactory.
        • +
        • Migrated to G4SteppingVerboseWithUnits.
        • +
      • +
      • TestEm7 +
          +
        • Migrated to G4SteppingVerboseWithUnits.
        • +
        • Removed use of obsolete RanecuEngine. + Updated PhysListEmPhysicsNR.
        • +
        • Migrated to use G4RunManagerFactory in main().
        • +
        • Improved macro files for ion ionisation.
        • +
        • Fix to build with C++20 Standard enabled.
        • +
        • c2_function.hh: fixed compilation warning.
        • +
      • +
      • TestEm8 +
          +
        • Added printout of random numbers.
        • +
      • +
      • TestEm9 +
          +
        • Replaced local Physics List by clone of the default EM standard; + recover analysis of process calls for the case of gamma general + process; improved macro files. Removed unused header.
        • +
      • +
      • TestEm11 +
          +
        • Migrated to G4RunManagerFactory and G4SteppingVerboseWithUnits.
        • +
        • Updated PhysListEmStandard.
        • +
        • DetectorConstruction: print only used material.
        • +
        • RunAction: dump G4EmParameters.
        • +
      • +
      • TestEm12, 13, 14 +
          +
        • Migrated to G4RunManagerFactory and G4SteppingVerboseWithUnits.
        • +
        • Updated PhysListEmStandard.
        • +
      • +
      • TestEm15 +
          +
        • Migrated to G4SteppingVerboseWithUnits.
        • +
        • PhysicsList: removed PhysList5DStandard, as 5D model is now part of + Opt4 EM physics in standard constructors.
        • +
      • +
      • TestEm16 +
          +
        • Migrated to G4RunManagerFactory and G4SteppingVerboseWithUnits.
        • +
      • +
      • TestEm17, 18 +
          +
        • Migrated to G4SteppingVerboseWithUnits.
        • +
      • +
    • +
    • eventgenerator +
        +
      • exgps +
          +
        • Tidy up CTests definition file and build configuration.
        • +
      • +
      • particleGun +
          +
        • Migrated to use G4RunManagerFactory and G4SteppingVerboseWithUnits. + Removed SteppingVerbose class.
        • +
      • +
      • pythia/py8decayer +
          +
        • New example demonstrating how to outfit Pythia8-based decay features + to those resonances in Geant4 where decay tables are not implemented + by default. In addition, it shows how to replace existing + Geant4 decay tables to such resonances as tau+/- or B+/- with + the Pythia8-based ones.
        • +
      • +
      • userPrimaryGenerator +
          +
        • Migrated to use G4SteppingVerboseWithUnits.
        • +
      • +
    • +
    • exoticphysics +
        +
      • channeling +
          +
        • Removed local option4 physics configuration.
        • +
      • +
      • phonon +
          +
        • Download CrystalMap files and fixed build issues.
        • +
      • +
      • saxs +
          +
        • Fixed using G4Analysis: add call to CloseFile().
        • +
        • Cleanup of PhysicsList.
        • +
      • +
    • +
    • geometry +
        +
      • transforms +
          +
        • Migrated to use G4SteppingVerboseWithUnits.
        • +
        • Added cleaning of the reflection factory.
        • +
      • +
      • VecGeomNavigation +
          +
        • New example demonstrating integration of VecGeom navigation, based + on the prototype package G4VecGeomNav, being integrated in the + example at build time.
        • +
      • +
    • +
    • hadronic +
        +
      • FissionFragment +
          +
        • Fixed CMake build script to define target properly.
        • +
      • +
      • Hadr01 +
          +
        • PhysicsList: removed unused header file.
        • +
      • +
      • Hadr02 +
          +
        • CRMCNeutronBuilder, HIJINGNeutronBuilder, UrQMDNeutronBuilder: + replaced G4HadronCaptureProcess with G4NeutronCaptureProcess, and + G4HadronFissionProcess with G4NeutronFissionProcess.
        • +
        • IonUrQMDPhysics: replaced old ion cross-sections (that have been + deleted) with G4ComponentGGNuclNuclXsc.
        • +
        • Replaced particle-specific inelastic processes (that have been + deleted) with G4HadronInelasticProcess.
        • +
      • +
      • Hadr03 +
          +
        • PhysicsList: added GammaNuclearPhysicsLEND.
        • +
        • GammaNuclearPhysics, GammaNuclearPhysicsLEND: replaced + G4PhotoNuclearProcess (that has been deleted) with + G4HadronInelasticProcess.
        • +
        • Migrated to use G4RunManagerFactory and G4SteppingVerboseWithUnits. + Removed SteppingVerbose class.
        • +
      • +
      • Hadr04 +
          +
        • NeutronHPphysics: replaced G4HadronCaptureProcess with + G4NeutronCaptureProcess, and G4HadronFissionProcess with + G4NeutronFissionProcess. Replaced G4NeutronInelasticProcess (that + has been deleted) with G4HadronInelasticProcess. + Use G4GenericMessenger instead of NeutronHPMessenger.
        • +
        • Migrated to use G4RunManagerFactory and G4SteppingVerboseWithUnits. + Removed SteppingVerbose class.
        • +
        • Added protection in RunAction::CountProcesses().
        • +
      • +
      • Hadr05 +
          +
        • New example demonstrating how to collect energy deposition in a + sampling calorimeter and how to survey energy flow.
        • +
      • +
      • Hadr06 +
          +
        • TrackingAction: count secondary particles with meanLife > 0. + Print meanLife. Added TrackingMessenger with 2 commands.
        • +
        • PhysicsList: added GammaNuclearPhysicsLEND. + Use new CLHEP units for minute, hour, day, year and + millielectronvolt.
        • +
        • Updated ElectromagneticPhysics.
        • +
        • Suppressed command /process/list in several macros.
        • +
        • GammaNuclearPhysics, GammaNuclearPhysicsLEND: replaced + G4PhotoNuclearProcess (that has been deleted) with + G4HadronInelasticProcess.
        • +
        • DetectorConstruction: updated fWorldSize for + SetRadius().
        • +
        • Migrated main() to G4RunManagerFactory and + G4SteppingVerboseWithUnits.
        • +
        • Enable ParticleHP settings in main().
        • +
        • Stepping verbose initialisation.
        • +
      • +
      • Hadr07 +
          +
        • TrackingAction: count secondary particles with meanLife > 0. + Print meanLife.
        • +
        • PhysicsList: added GammaNuclearPhysicsLEND. + Use new CLHEP units for minute, hour, day, year and + millielectronvolt.
        • +
        • Updated ElectromagneticPhysics.
        • +
        • GammaNuclearPhysics, GammaNuclearPhysicsLEND: replaced + G4PhotoNuclearProcess (that has been deleted) with + G4HadronInelasticProcess.
        • +
        • Migrated main() to G4RunManagerFactory and + G4SteppingVerboseWithUnits. + Enable ParticleHP settings in main().
        • +
        • HadronElasticPhysicsHP: use G4GenericMessenger.
        • +
        • RadioactiveDecayPhysics: do not change 'ThresholdOfHalfLife'.
        • +
      • +
      • Hadr08 +
          +
        • BiasingOperation: replaced Gheisha inelastic cross-section (that + has been deleted) with better cross-sections. + Replaced particle-specific inelastic processes (that have been + deleted) with G4HadronInelasticProcess.
        • +
      • +
      • Hadr09 +
          +
        • HadronicGenerator: migrated per-particle inelastic processes + (that have been deleted) to G4HadronInelasticProcess. + Extended interface and functionality; used new methods + available in the FTF model.
        • +
      • +
      • Hadr10 +
          +
        • New hadronic example aimed to exercise the decay of tau leptons, + as well as charmed and bottom hadrons.
        • +
      • +
      • NeutronSource +
          +
        • TrackingAction: count secondary particles with meanLife > 0. + Print meanLife.
        • +
        • PhysicsList: added GammaNuclearPhysicsLEND. + Use new CLHEP units for minute, hour, day, year and + millielectronvolt.
        • +
        • Updated ElectromagneticPhysics.
        • +
        • GammaNuclearPhysics, GammaNuclearPhysicsLEND: replaced + G4PhotoNuclearProcess (that has been deleted) with + G4HadronInelasticProcess.
        • +
        • Migrated to use G4RunManagerFactory and G4SteppingVerboseWithUnits. + Removed SteppingVerbose class.
        • +
        • RadioactiveDecayPhysics: new constructor, include G4Radioactivation + process, inactivate atomic de-excitation.
        • +
        • Added protection in RunAction::CountProcesses().
        • +
        • TrackingAction, RunAction: added a comment for excited states.
        • +
        • HadronElasticPhysicsHP: use G4GenericMessenger.
        • +
        • RadioactiveDecayPhysics: do not change 'ThresholdOfHalfLife'.
        • +
      • +
    • +
    • medical/DICOM +
        +
      • Use updated renamed method GetNoVoxels() in G4PhantomParameterisation + instead of GetNoVoxel(), now removed.
      • +
      • In vis.mac, changed /vis/ogl/set/eventsDrawInterval to + /vis/ogl/flushAt NthPrimitive.
      • +
    • +
    • medical/dna +
        +
      • AuNP: +
          +
        • New example simulating the track-structure of electrons in + microscopic gold volume. Also simulating that in liquid water + medium surrounding the gold volume.
        • +
      • +
      • chem2: +
          +
        • In vis.mac, changed /vis/ogl/set/eventsDrawInterval to + /vis/ogl/flushAt NthPrimitive.
        • +
      • +
      • chem3: +
          +
        • In vis.mac, changed /vis/ogl/set/ to + /vis/viewer/set/timeWindow/.
        • +
        • Replaced '/vis/ogl/printEPS' with /vis/ogl/export + in relevant macros.
        • +
      • +
      • chem6: +
          +
        • Deleted limit time step.
        • +
        • Reduced number of incident particles.
        • +
      • +
      • dnadamage1: +
          +
        • Fixes in analysis macros.
        • +
        • Fixed SSD file typos.
        • +
      • +
      • neuron: +
          +
        • In vis.mac, changed /vis/ogl/set/ to + /vis/viewer/set/timeWindow/.
        • +
      • +
      • microdosimetry: +
          +
        • Updated PhysicsList to use updated SetEmModel() method. + Removed thread unsafe SetCuts() method; use SetEmModel(..) for + multiple scattering.
        • +
      • +
      • scavenger: +
          +
        • New example showing how to activate the scavenging process + in chemistry using the deterministic treatment of the IRT + model.
        • +
      • +
      • splitting: +
          +
        • Updated PhysicsList to recent EM settings.
        • +
      • +
      • svalue: +
          +
        • PhysicsList: removed unused header. Radioactive decay is defined via + standard radioactive physics builder.
        • +
        • Do not allow change of geometry between runs, only materials may be + changed.
        • +
        • Removed all warning in test run.
        • +
      • +
    • +
    • medical/electroscattering +
        +
      • Migrated to G4RunManagerFactory and G4SteppingVerboseWithUnits.
      • +
      • Removed obsolete random number generator.
      • +
      • PhysicsList: use physics constructors from physics_list library; + added G4EmStandardPhysics_option4; removed local EM physics + constructors.
      • +
    • +
    • medical/electroscattering2 +
        +
      • Removed warning. Cosmetic modifications in PhysicsList.
      • +
    • +
    • medical/fanoCavity, 2 +
        +
      • Updated PhysicsList to recent EM settings.
      • +
      • Migrated to G4RunManagerFactory and G4SteppingVerboseWithUnits.
      • +
    • +
    • optical +
        +
      • LXe +
          +
        • Get some refractive indices from new G4OpticalMaterialParameters + file.
        • +
        • Excercise creating material property table element by element.
        • +
        • Replaced deprecated optical commands and parameters with new + ones.
        • +
      • +
      • OpNovice +
          +
        • Excercise creating material property table element by element.
        • +
        • Replaced deprecated optical commands and parameters with new ones.
        • +
        • Fixed incorrect material property name.
        • +
        • Added option to define detector via a GDML file.
        • +
        • Added outer world volume to avoid surfaces including world volume.
        • + Addressing problem report + #2373. +
        • DetectorConstruction: use modified interface to + G4MaterialPropertiesTable with Spline flag.
        • +
        • Code cleanup; renamed class variables to start with f.
        • +
        • OpNoviceDetectorConstruction: added tests of user-defined material + properties; add one material property using C-style arrays (as a + test).
        • +
      • +
      • OpNovice2 +
          +
        • DetectorConstruction: use modified interface to + G4MaterialPropertiesTable with Spline flag.
        • +
        • Replaced deprecated optical commands and parameters with new ones.
        • +
      • +
      • wls +
          +
        • WLSMaterials: use correct material property names.
        • +
        • WLSPrimaryGeneratorAction: use G4PhysicsFreeVector instead of + deprecated G4PhysicsOrderedFreeVector.
        • +
        • Added visualisation attributes.
        • +
        • Fixed bug preventing cladding being built.
        • +
        • Fixed counting of detector hits.
        • +
        • Added histograms.
        • +
        • Use G4OpBoundaryProcess::invokeSD() rather than + ProcessHits_boundary() call in SteppingAction.
        • +
        • Remove StringToRotation; removed Sr90.mac; added electron.mac.
        • +
      • +
    • +
    • parallel +
        +
      • MPI +
          +
        • Updated analysis classes for recent changes in analysis.
        • +
        • More updates in g4mpi for changes in G4String.
        • +
      • +
      • ThreadsafeScorers +
          +
        • TSPhysicsList: removed obsolete header G4EmProcessOptions; removed + method SetCuts() to avoid data race, use the one from the base class; + removed singleton pattern from this class as not needed.
        • +
      • +
    • +
    • parameterisations +
        +
      • gflash +
          +
        • clang-tidy and clang-format on code.
        • +
        • test.mac run twice with and without gflash.
        • +
      • +
      • Par04 +
          +
        • New example demonstrating how to use the Machine Learning (ML) + inference to create energy deposits as a fast simulation model + using ONNX runtime and LWTNN libraries.
        • +
      • +
    • +
    • polarisation +
        +
      • Pol01 +
          +
        • Cleanup of Physics List; use renamed polarized processes.
        • +
      • +
    • +
    • radioactivedecay +
        +
      • Activation +
          +
        • TrackingAction: count secondary particles with meanLife > 0. + Take weight into account.
        • +
        • PhysicsList: added GammaNuclearPhysicsLEND. + Use new CLHEP units for minute, hour, day, year and + millielectronvolt.
        • +
        • Updated ElectromagneticPhysics.
        • +
        • GammaNuclearPhysics, GammaNuclearPhysicsLEND: replaced + G4PhotoNuclearProcess (that has been deleted) with + G4HadronInelasticProcess.
        • +
        • Migrated to use G4RunManagerFactory and G4SteppingVerboseWithUnits. + Removed SteppingVerbose class.
        • +
        • ElectromagneticPhysics: updated EM parameters.
        • +
        • RadioactiveDecayPhysics: new constructor, include G4Radioactivation + process, inactivate atomic de-excitation.
        • +
        • Added protection in RunAction::CountProcesses().
        • +
        • TrackingAction, RunAction: added a comment for excited states.
        • +
        • HadronElasticPhysicsHP: use G4GenericMessenger.
        • +
        • RadioactiveDecayPhysics: do not change 'ThresholdOfHalfLife'.
        • +
      • +
      • rdecay01, 02 +
          +
        • Migrated to use G4RunManagerFactory and G4SteppingVerboseWithUnits. + Removed SteppingVerbose class.
        • +
        • Use new CLHEP units for minute, hour, day, year and + millielectronvolt in PhysicsList.
        • +
        • Added protection in RunAction::CountProcesses().
        • +
      • +
    • +
    • runAndEvent +
        +
      • RE05, 06 +
          +
        • Migration to the new SteppingVerbose.
        • +
      • +
      • RE07 +
          +
        • New example demonstrating how to register specialized tracking + managers for a particle or a set of particles.
        • +
      • +
    • +
    • visualization +
        +
      • movies +
          +
        • New example illustrating how to make a movie with + /vis/viewer/save and /vis/viewer/interpolate. + It also includes the "visTutor" macros + previously included in example "basic" B4. + See README for further information.
        • +
      • +
    • +
    +
+ +

+ +
+ + + +

10. Appendix

+ + +

A1 - Changes required for advanced use of G4String

+
    +
  • G4String now has identical constructors to std::string. + Replace use of the single char argument constructor + (explicitly or implicitly): +
    +    // G4String x('a');
    +    G4String x(1, 'a');
    +    
  • +
  • G4String no longer provides call operators for element or substring + access. The subscript operator or substr member functions + should be used instead: +
    +    // char x = aG4String(42);  
    +    char x = aG4String[42];
    +
    +    // G4String s = aG4String(3,14);
    +    G4String s = aG4String.substr(3, 14);
    +    
  • +
  • Replace use of G4String::index with G4String::find + (interface as std::string::find): +
    +    // auto i = aG4String.index("arg");
    +    auto i = aG4String.find("arg");
    +    
  • +
  • Replace use of G4String::isNull with G4String::empty + (interface as std::string::empty): +
    +    // bool c = aG4String.isNull();
    +    bool c = aG4String.empty();
    +    
  • +
  • Replace use of G4String::first with G4String::find, + G4String::last with G4String::rfind + (as `std::string::find, std::string::rfind interfaces): +
    +    // auto f = aG4String.first('x');
    +    auto f = aG4String.find('x');
    +
    +    // auto l = aG4String.last('y');
    +    auto l = aG4String.rfind('y');
    +    
  • +
  • Replace use of G4String::prepend with G4String::insert + (as std::string::insert interface): +
    +    // aG4String.prepend("foo");
    +    aG4String.insert(0, "foo"); 
    +    
  • +
  • G4String still allows implicit conversion to const char*> but this + behaviour should be regarded as deprecated. User code should prefer to use + explicit conversion via the c_str member function when passing to + functions expecting const char*, or to take string arguments + by G4String or std::string_view as appropriate.
  • +

    +
  • The following members functions are retained but marked as deprecated, + and with the recommended member or free function replacements in the + G4StrUtil namespace: +
    +    // G4int i = aG4String.compareTo(anotherString);
    +    G4int i = aG4String.compare(...); // replacement: std::string::compare
    +
    +    // G4int i = aG4String.compareTo(anotherString, G4String::ignoreCase);
    +    G4int i = G4StrUtil::icompare(aG4String, anotherString);
    +
    +    // aG4String.readLine(anIStream);
    +    std::getline(anIStream, aG4String);
    +
    +    // aG4String.remove(42);
    +    aG4String.erase(42); // interface as std::string::erase
    +
    +    // aG4String.contains("char or string");
    +    G4StrUtil::contains(aG4String, "char or string"); // interface as C++23 std::string::contains
    +
    +    //G4String c = aG4String.strip(...);
    +    G4String c = G4StrUtil::rstrip_copy(aG4String); // see also G4StrUtil::{rstrip,lstrip,lstrip_copy,strip,strip_copy}
    +
    +    // aG4String.toLower(); 
    +    G4StrUtil::to_lower(aG4String); // see also G4StrUtil::to_lower_copy
    +
    +    // aG4String.toUpper();
    +    G4StrUtil::to_upper(aG4String); // see also G4StrUtil::to_upper_copy
    +    
  • +
+ + +

A2 - Hadronic changes required by user-made physics lists

+
    +
  • For hadronic processes +
      +
    • Replace G4XxxInelasticProcess with: +
      +        G4HadronInelasticProcess* xxxInelasticProcess = new G4HadronInelasticProcess( "xxxInelastic", G4Xxx::Definition() );
      +        
      + where xxx can be either: +
      +        "PionPlus", "PionMinus", "KaonPlus", "KaonMinus",
      +        "KaonZeroS", "KaonZeroL", "Proton", "AntiProton",
      +        "Neutron", "AntiNeutron", "Deuteron", "Triton", "Alpha"
      +        
      + for example: +
      +        G4KaonZeroLInelasticProcess* theInelasticProcess = new G4KaonZeroLInelasticProcess( "inelastic" );
      +        
      + has been replaced by: +
      +        G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4KaonZeroLong::Definition() );
      +        
    • +
    • For photon inelastic processes, use: +
      +        G4HadronInelasticProcess* photonNuclear = new G4HadronInelasticProcess( "photonNuclear", G4Gamma::Definition() );
      + photonNuclear->AddDataSet( new G4PhotoNuclearCrossSection ); + + G4HadronicProcess* photonCapture = new G4HadronicProcess( "photonNuclear", fCapture ); + G4HadronicProcess* photonFission = new G4HadronicProcess( "photonFission", fFission ); +
    • +
  • +
  • For hadronic cross-sections +
      +
    • For INELASTIC, the following cross-sections should be used: +
      +        G4VCrossSectionDataSet* protonInelasticXS = new G4BGGNucleonInelasticXS( G4Proton::Definition() );
      +
      +        G4VCrossSectionDataSet* neutronInelasticXS = new G4NeutronInelasticXS;
      +        // a valid alternative could be:
      +        // G4VCrossSectionDataSet* neutronInelasticXS = new G4BGGNucleonInelasticXS( G4Neutron::Definition() );
      +
      +        G4VCrossSectionDataSet* pionPlusInelasticXS = new G4BGGPionInelasticXS( G4PionPlus::Definition() );
      +        G4VCrossSectionDataSet* pionMinusInelasticXS = new G4BGGPionInelasticXS( G4PionMinus::Definition() );
      +
      +        // For kaons, hyperons and anti-hyperons
      +        G4VCrossSectionDataSet* ggHadInelasticXS = new G4CrossSectionInelastic( new G4ComponentGGHadronNucleusXsc );
      +
      +        // For deuteron, triton, He3, alpha and generic ions
      +        G4VCrossSectionDataSet* ionInelasticXS = new G4CrossSectionInelastic( new G4ComponentGGNuclNuclXsc );
      +
      +        // For anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3 and anti_alpha
      +        G4VCrossSectionDataSet* antibaryonInelasticXS = new G4CrossSectionInelastic( new G4ComponentAntiNuclNuclearXS );
      +        
    • +
    • For ELASTIC: +
      +        G4VCrossSectionDataSet* protonElasticXS = new G4BGGNucleonElasticXS( G4Proton::Definition() );
      +
      +        G4VCrossSectionDataSet* neutronElasticXS = new G4NeutronElasticXS;
      +        // a valid alternative could be:
      +        // G4VCrossSectionDataSet* neutronElasticXS = new G4BGGNucleonElasticXS( G4Neutron::Definition() );
      +
      +        G4VCrossSectionDataSet* pionPlusElasticXS = new G4BGGPionElasticXS( G4PionPlus::Definition() );
      +        G4VCrossSectionDataSet* pionMinusElasticXS = new G4BGGPionElasticXS( G4PionMinus::Definition() );
      +
      +        // For kaons, hyperons and anti-hyperons
      +        G4VCrossSectionDataSet* ggHadElasticXS = new G4CrossSectionElastic( new G4ComponentGGHadronNucleusXsc );
      +
      +        // For deuteron, triton, He3, alpha and generic ions
      +        G4VCrossSectionDataSet* ggIonElasticXS = new G4CrossSectionElastic( new G4ComponentGGNuclNuclXsc );
      +
      +        // For anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3 and anti_alpha
      +        G4VCrossSectionDataSet* antibaryonElasticXS = new G4CrossSectionElastic( new G4ComponentAntiNuclNuclearXS );
      +        
    • +
    • For (neutron) CAPTURE: +
      +        G4VCrossSectionDataSet* neutronCaptureXS = new G4NeutronCaptureXS;
      +        
    • +
    • For FISSION, use HP. Elsewhere: +
      +        G4VCrossSectionDataSet* neutronFissionXS = new G4ZeroXS;
      +        G4VCrossSectionDataSet* photoFissionXS = new G4ZeroXS;
      +        
    • +
  • +
  • For stopping (at rest inelastic processes) +
      +
    • For pi-, replace G4PiMinusAbsorptionBertini with: +
      +        G4HadronStoppingProcess* piMinusAbsorption = new G4HadronicAbsorptionBertini( G4PionMinus::Definition() );
      +        
    • +
    • For K-, replace G4KaonMinusAbsorptionBertini with: +
      +        G4HadronStoppingProcess* kMinusAbsorption = new G4HadronicAbsorptionBertini( G4KaonMinus::Definition() ); 
      +        
    • +
    • For anti_proton, replace G4AntiProtonAbsorptionFritiof with: +
      +        G4HadronStoppingProcess* antiProtonAbsorption = new G4HadronicAbsorptionFritiof( G4AntiProton::Definition() );
      +        
      + No replacement for G4AntiNeutronAnnihilationAtRest, just remove it.
    • +
    • For Sigma-, replace G4SigmaMinusAbsorptionBertini with: +
      +        G4HadronStoppingProcess* sigmaMinusAbsorption = new G4HadronicAbsorptionBertini( G4SigmaMinus::Definition() ); 
      +        
    • +
    • For anti-Sigma+, replace G4AntiSigmaPlusAbsorptionFritiof with: +
      +        G4HadronStoppingProcess* antiSigmaPlusAbsorption = new G4HadronicAbsorptionFritiof( G4AntiSigmaPlus::Definition() );
      +        
    • +
  • +
+ +
+ + + diff --git a/cmake/History b/cmake/History index 9f39afa397..ffd5b2881e 100644 --- a/cmake/History +++ b/cmake/History @@ -29,8 +29,94 @@ add this in the documentation for the changed file as [BUGFIX #BUGNUMBER]. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +09 November 2021 - Ben Morgan (cmake-V10-07-53) +- Only configure public release contribution guide if present + +30 November 2021 - Ivana Hrivnacova (cmake-V10-07-52) +- Removed FindAIDA.cmake from Modules + +29 November 2021 - Ben Morgan (cmake-V10-07-51) +- Require VecGeom 1.1.18 or newer +- Configure/find Vtk alongside other UI/Vis options + +26 November 2021 - Ben Morgan (cmake-V10-07-50) +- Strip .git{ignore,lab,hub} files/dirs from source package +- Use XZ compression instead of BZIP for source package + +22 November 2021 - Ben Morgan (cmake-V10-07-49) +- Improve/modernize CPack source packaging + +12 November 2021 - Ben Morgan (cmake-V10-07-48) +- Retire G4VIS_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +8 November 2021 - Ben Morgan (cmake-V10-07-47) +- Retire G4UI/G4INTY_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +2 November 2021 - Gunter Folger (cmake-V10-07-46) +- switch to new dataset G4EMLOW8.0, given by Vladimir + +27 October 2021 - Guy Barrand (cmake-V10-07-45) +- Modules/G4DeveloperAPI.cmake: ToolsSG => G4ToolsSG in the list of Qt moc-able modules. + +25/27/28 October 2021 - Gunter Folger (cmake-V10-07-44) +- switch to new dataset G4TENDL1.4 provided by Alberto + +22 October 2021 - Guy Barrand (cmake-V10-07-43) +- Modules/G4DeveloperAPI.cmake: have ToolsSG as a Qt moc-able module. + +13 October 2021 - Ben Morgan (cmake-V10-07-42) +- Add XercesC library directory to Linux LD_LIBRARY_PATH for GNUmake. + Workaround for incorrect setup on LCG stacks for Nightly builds + +12 October 2021 - Ben Morgan (cmake-V10-07-41) +- Make ToolsSG options mutually exclusive + +04 October 2021 - Stewart Boogert / Laurie Nevay (cmake-V10-07-40) +- Add options and find module for VTK visualisation driver + +27 September 2021 - Ben Morgan (cmake-V10-07-39) +- Change default value of GEANT4_BUILD_MULTITHREADED to ON + +22 September 2021 - Guilherme Amadio (cmake-V10-07-38) +- geant4_add_test: + - Ensure that Geant4 being built is picked up to build examples. + - Ensure that the same compiler is used to build the tests. + +13 September 2021 - Gabriele Cosmo (cmake-V10-04-37) +- Set CLHEP-2.4.5.1 as the required minimum version. + +3 September 2021 - Ben Morgan (cmake-V10-04-36) +- geant4_add_test creates separate build/run tests when asked to do both + - Required to support valgrind/memcheck runs without valgrind-ing + the build part of the test. + +1 September 2021 - Ben Morgan (cmake-V10-04-35) +- Remove obsolete geant4_{executable,link_library} options + +26 August 2021 - Ben Morgan (cmake-V10-07-34) +- Remove obsolete network VRML driver option +- Remove obsolete network FukuiRenderer driver option + +23 August 2021 - Guilherme Amadio (cmake-V10-07-33) +- Rename Geant4::HDF5 to hdf5::hdf5 to be compatible with + imported target provided since CMake 3.20. + +20 August 2021 - Gunter Folger (cmake-V10-07-32) +- Switch to G4ParticleXS 4.0 + +22 July 2021 - Ivana Hrivnacova (cmake-V10-07-31) +- Fixed path to g4tools/fonts, now in source/externals + +30 June 2021 - Ben Morgan (cmake-V10-07-30) +- Remove obsolete GEANT4_USE_SYSTEM_CLHEP_GRANULAR option + +29 June 2021 - Ben Morgan (cmake-V10-07-29) +- Disable creation of clang-formatting targets + 21 June 2021 - Julia Yarba (cmake-V10-07-28) -- Clean cmake/Modules/FindPythia8.cmake +- Clean cmake/Modules/FindPythia8.cmake (remove trailing whitespaces) 18 June 2021 - Julia Yarba (cmake-V10-07-27) diff --git a/cmake/Modules/FindAIDA.cmake b/cmake/Modules/FindAIDA.cmake deleted file mode 100644 index b28d23842b..0000000000 --- a/cmake/Modules/FindAIDA.cmake +++ /dev/null @@ -1,55 +0,0 @@ -# - Finds AIDA instalation -# This module sets up AIDA information -# It defines: -# AIDA_FOUND If the AIDA is found -# AIDA_INCLUDE_DIR PATH to the include directory -# AIDA_LIBRARIES AIDA installation libraries -# AIDA_IMPLEMENTATION The implementation of AIDA found - -find_program(AIDA_CONFIG_EXECUTABLE aida-config) - -if(NOT AIDA_CONFIG_EXECUTABLE) - set(AIDA_FOUND FALSE) -else() - set(AIDA_FOUND TRUE) - - execute_process( - COMMAND ${AIDA_CONFIG_EXECUTABLE} --include - OUTPUT_VARIABLE AIDA_INCLUDE_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE) - #remove -I prefix - string(REGEX REPLACE "-I" "" AIDA_INCLUDE_DIR "${AIDA_INCLUDE_DIR}") - - execute_process( - COMMAND ${AIDA_CONFIG_EXECUTABLE} --libs - OUTPUT_VARIABLE AIDA_LIBRARIES - OUTPUT_STRIP_TRAILING_WHITESPACE) - - execute_process( - COMMAND ${AIDA_CONFIG_EXECUTABLE} --version - OUTPUT_VARIABLE AIDA_VERSION - ERROR_VARIABLE AIDA_VERSION_ERROR - OUTPUT_STRIP_TRAILING_WHITESPACE) - - execute_process( - COMMAND ${AIDA_CONFIG_EXECUTABLE} --implementation - OUTPUT_VARIABLE AIDA_IMPLEMENTATION - ERROR_VARIABLE AIDA_IMPLEMENTATION_ERROR - OUTPUT_STRIP_TRAILING_WHITESPACE) - - # Make variables changeble to the advanced user - mark_as_advanced(AIDA_CONFIG_EXECUTABLE) - - if(NOT AIDA_FIND_QUIETLY) - set (OUTPUT "Found AIDA") - if (AIDA_VERSION) - set (OUTPUT "${OUTPUT} ${AIDA_VERSION}") - endif() - if (AIDA_IMPLEMENTATION) - set (OUTPUT "${OUTPUT} implemented by ${AIDA_IMPLEMENTATION}") - endif() - message(STATUS "${OUTPUT}") - endif() - -endif() - diff --git a/cmake/Modules/G4BuildSettings.cmake b/cmake/Modules/G4BuildSettings.cmake index ee4b4387fc..78823d28ae 100644 --- a/cmake/Modules/G4BuildSettings.cmake +++ b/cmake/Modules/G4BuildSettings.cmake @@ -285,7 +285,7 @@ endif() # If set to ``ON``, compile Geant4 with support for multithreading. # On Win32, this option requires use of static libraries only # -option(GEANT4_BUILD_MULTITHREADED "Enable multithreading in Geant4" OFF) +option(GEANT4_BUILD_MULTITHREADED "Enable multithreading in Geant4" ON) geant4_add_feature(GEANT4_BUILD_MULTITHREADED "Build multithread enabled libraries") #.rst: diff --git a/cmake/Modules/G4CPack.cmake b/cmake/Modules/G4CPack.cmake index b30690d0c6..89d2aef894 100644 --- a/cmake/Modules/G4CPack.cmake +++ b/cmake/Modules/G4CPack.cmake @@ -11,108 +11,128 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Intel") set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS True) endif() +include(G4GitUtilities) include(InstallRequiredSystemLibraries) #----------------------------------------------------------------------- -# General packaging setup - variable relevant to all package formats -# -set(CPACK_PACKAGE_DESCRIPTION "Geant4 Toolkit") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Geant4 Toolkit") -set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_BINARY_DIR}/README.txt") - -set(CPACK_PACKAGE_VENDOR "Geant4 Collaboration") - -# - Canonical versions -set(CPACK_PACKAGE_VERSION ${${PROJECT_NAME}_VERSION}) -set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR}) -set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR}) -set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH}) - -# - Geant4 versions -# Canonical versions padded with zeros to two digits -function(geant4_pad_version _in _out) - string(LENGTH "${_in}" _vlength) - if(_vlength GREATER 1) - set(${_out} "${_in}" PARENT_SCOPE) - elseif(_vlength EQUAL 1) - set(${_out} "0${_in}" PARENT_SCOPE) - else() - set(${_out} "00" PARENT_SCOPE) - endif() -endfunction() - -geant4_pad_version(${${PROJECT_NAME}_VERSION_MAJOR} ${PROJECT_NAME}_SOURCE_VERSION_MAJOR) -geant4_pad_version(${${PROJECT_NAME}_VERSION_MINOR} ${PROJECT_NAME}_SOURCE_VERSION_MINOR) -geant4_pad_version(${${PROJECT_NAME}_VERSION_PATCH} ${PROJECT_NAME}_SOURCE_VERSION_PATCH) -set(${PROJECT_NAME}_SOURCE_VERSION "${${PROJECT_NAME}_SOURCE_VERSION_MAJOR}.${${PROJECT_NAME}_SOURCE_VERSION_MINOR}.${${PROJECT_NAME}_SOURCE_VERSION_PATCH}") - -# - Resource files -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_BINARY_DIR}/LICENSE.txt") -set(CPACK_RESOURCE_FILE_README "${CMAKE_BINARY_DIR}/README.txt") - -configure_file(LICENSE LICENSE.txt COPYONLY) # Suffix must be .txt +# Copy/Generate common resource files into formats CPack generators like file(WRITE ${CMAKE_BINARY_DIR}/README.txt " Geant4 ====== A toolkit for the simulation of the passage of particles through matter. -Its areas of application include high energy, nuclear and accelerator -physics, as well as studies in medical and space science -(http://www.geant4.org). +Its areas of application include high energy, nuclear and accelerator physics, as well +as studies in medical and space science. -The two main reference papers for Geant4 are published in Nuclear -Instruments and Methods in Physics Research A 506 (2003) 250-303, and IEEE -Transactions on Nuclear Science 53 No. 1 (2006) 270-278. +For more information about how to use Geant4 and its application domains, please visit +the Geant4 website (https://cern.ch/geant4) + +There are three main reference papers for Geant4: + +- Nuclear Instruments and Methods in Physics Research A 835 (2016) 186-225 + - http://www.sciencedirect.com/science/article/pii/S0168900216306957 +- IEEE Transactions on Nuclear Science 53 No. 1 (2006) 270-278 + - https://ieeexplore.ieee.org/xpls/abs_all.jsp?isnumber=33833&arnumber=1610988&count=33&index=7 +- Nuclear Instruments and Methods in Physics Research A 506 (2003) 250-303 + - http://www.sciencedirect.com/science/article/pii/S0168900203013688 This installer has been created using CPack (http://www.cmake.org). ") +configure_file(LICENSE LICENSE.txt COPYONLY) # Suffix must be .txt + +#----------------------------------------------------------------------- +# General packaging setup - variables relevant to all package formats +# +set(CPACK_PACKAGE_NAME "geant4") +set(CPACK_PACKAGE_VENDOR "Geant4 Collaboration") +set(CPACK_PACKAGE_VERSION ${Geant4_VERSION}) +set(CPACK_PACKAGE_VERSION_MAJOR ${Geant4_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${Geant4_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${Geant4_VERSION_PATCH}) +set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_BINARY_DIR}/README.txt") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "Geant4-${Geant4_VERSION_MAJOR}.${Geant4_VERSION_MINOR}") +set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/cmake/Templates/g4_small.bmp") +set(CPACK_PACKAGE_CHECKSUM "SHA256") + +# - Common Resource files +set(CPACK_RESOURCE_FILE_README "${PROJECT_BINARY_DIR}/README.txt") +set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_BINARY_DIR}/LICENSE.txt") + #----------------------------------------------------------------------- # Source package settings # -# - Use canonical Geant4 package naming convention -set(CPACK_SOURCE_PACKAGE_FILE_NAME "geant4.${Geant4_SOURCE_VERSION}") - -# - Ensure all standard source packages are built -set(CPACK_SOURCE_GENERATOR "TGZ;TBZ2;ZIP") +# - Use same source package naming as GitLab generates for tags +set(CPACK_SOURCE_PACKAGE_FILE_NAME "geant4-v${CPACK_PACKAGE_VERSION}") +set(CPACK_SOURCE_GENERATOR "TGZ;TXZ;ZIP") set(CPACK_SOURCE_STRIP_FILES "") -# Exclude VCS and standard temporary files from the source package. -# Exclude development specific files and directories -# Not totally perfected yet! +# Exclude VCS, temp files, and development-only components from the source package. set(CPACK_SOURCE_IGNORE_FILES - "${PROJECT_BINARY_DIR}" - "${PROJECT_SOURCE_DIR}/tests" - "${PROJECT_SOURCE_DIR}/ReleaseNotes/development" - "/test/" + "${PROJECT_BINARY_DIR}/" + ".clang-format" + ".clang-tidy" + "README.*" + "CONTRIBUTING.*" + "CODING_GUIDELINES.*" + "RELEASE_MANAGEMENT.rst" + "SHIFTERS.rst" + "/GitUtilities/" "/tests/" + "/ReleaseNotes/development" + "/benchmarks/" + "/verification/" + "/test.*/" + "/doc.*/" + "/benchmark.*/" "~$" "/CVS/" "/.svn/" "/\\\\\\\\.svn/" "/.git/" + ".gitignore" + "/.github/" + "/.gitlab" "/\\\\\\\\.git/" "\\\\\\\\.swp$" "\\\\\\\\.swp$" "\\\\.swp" "\\\\\\\\.#" - "/#" - ) + "/#") + +# Add any _configure time_ untracked files. Actual package build will warn/error out +# on any unknown ones. Due to an unknown quirk in CPack, changes to CPACK_SOURCE_IGNORE_FILES +# after inclusion of CPack (e.g. in `CPACK_PROJECT_CONFIG_FILE`) are not taken into account +# when CPack runs. +geant4_git_find_dirty(${PROJECT_SOURCE_DIR} __modded __untracked) +list(APPEND CPACK_SOURCE_IGNORE_FILES ${__untracked}) + +# Create and inject sources that require generation or otherwise including +configure_file(${PROJECT_SOURCE_DIR}/README.rst _source_extras/README.rst COPYONLY) + +if(EXISTS "${PROJECT_SOURCE_DIR}/CONTRIBUTING_GitHub.rst") + configure_file(${PROJECT_SOURCE_DIR}/CONTRIBUTING_GitHub.rst _source_extras/CONTRIBUTING.rst COPYONLY) +else() + configure_file(${PROJECT_SOURCE_DIR}/CONTRIBUTING.rst _source_extras/CONTRIBUTING.rst COPYONLY) +endif() + + + +configure_file( + cmake/Templates/source_package_extras.cmake.in + source_package_extras.cmake + @ONLY) +list(APPEND CPACK_INSTALL_SCRIPTS "${CMAKE_CURRENT_BINARY_DIR}/source_package_extras.cmake") #----------------------------------------------------------------------- -# Binary package setup +# Binary package common settings # -set(CPACK_PACKAGE_RELOCATABLE True) -set(CPACK_PACKAGE_INSTALL_DIRECTORY "Geant4 ${Geant4_VERSION_MAJOR}.${Geant4_VERSION_MINOR}") -if(CMAKE_BUILD_TYPE STREQUAL Release) - set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${Geant4_VERSION}-${CMAKE_SYSTEM_NAME}") -else() - set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${Geant4_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_BUILD_TYPE}") -endif() +set(CPACK_PACKAGE_RELOCATABLE ${CMAKE_INSTALL_IS_NONRELOCATABLE}) +set(CPACK_PACKAGE_INSTALL_DIRECTORY "Geant4-${Geant4_VERSION_MAJOR}.${Geant4_VERSION_MINOR}") if(WIN32) set(CPACK_GENERATOR "NSIS;ZIP") elseif(APPLE) - set(CPACK_GENERATOR "PackageMaker;TGZ") + set(CPACK_GENERATOR "productbuild;TGZ") else() set(CPACK_GENERATOR "STGZ;TGZ") endif() @@ -127,8 +147,6 @@ configure_file( @ONLY ) set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CMakeCPackOptions.cmake) - -# FINAL step - include base CPack include(CPack) #----------------------------------------------------------------------- diff --git a/cmake/Modules/G4CTest.cmake b/cmake/Modules/G4CTest.cmake index d530fecd55..0bb6a5a8c8 100644 --- a/cmake/Modules/G4CTest.cmake +++ b/cmake/Modules/G4CTest.cmake @@ -39,7 +39,7 @@ if(GEANT4_ENABLE_TESTING) # - Add TOOLS_FONT_PATH if freetype enabled if(GEANT4_USE_FREETYPE) - list(APPEND GEANT4_TEST_ENVIRONMENT TOOLS_FONT_PATH=${PROJECT_SOURCE_DIR}/source/analysis/fonts) + list(APPEND GEANT4_TEST_ENVIRONMENT TOOLS_FONT_PATH=${PROJECT_SOURCE_DIR}/source/externals/g4tools/fonts) endif() # - Configure 'G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default)' diff --git a/cmake/Modules/G4ClangFormat.cmake b/cmake/Modules/G4ClangFormat.cmake index e515435254..36b7ee1ea8 100644 --- a/cmake/Modules/G4ClangFormat.cmake +++ b/cmake/Modules/G4ClangFormat.cmake @@ -2,26 +2,22 @@ # G4ClangFormat # ============= # -# Functions and helper targets for formatting sources of a target using +# Functions and helper targets for formatting sources of a target using # clang-format # - Include guard -if(NOT __G4CLANGFORMAT_INCLUDED) - set(__G4CLANGFORMAT_INCLUDED 1) -else() - return() -endif() +include_guard(DIRECTORY) # Default logging directory set(G4FORMAT_LOGDIR ${PROJECT_BINARY_DIR}/format CACHE PATH - "Output folder of files that are formatted") + "Output folder of files that are formatted") # Find clang-format (optional) find_program(CLANG_FORMATTER NAMES - clang-format-6 # prefer clang-format version 6.0 - clang-format-6.0 - clang-format-mp-6.0 # Apple macports version - clang-format) + clang-format-6 # prefer clang-format version 6.0 + clang-format-6.0 + clang-format-mp-6.0 # Apple macports version + clang-format) function(exclude_from_format) cmake_parse_arguments(ARG "" "" "HEADERS;SOURCES;FILES" ${ARGN}) @@ -50,8 +46,7 @@ endfunction() function(create_format_directory) if(NOT EXISTS ${G4FORMAT_LOGDIR}) - execute_process(COMMAND ${CMAKE_COMMAND} - -E make_directory ${G4FORMAT_LOGDIR}) + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${G4FORMAT_LOGDIR}) endif() endfunction() @@ -103,7 +98,7 @@ function(geant4_format_target) # add to list to be processed list(APPEND SOURCES ${_SOURCE}) endforeach() - + # write format file set(FMTLOG_OUT ${G4FORMAT_LOGDIR}/${G4TARGET_NAME}.txt) file(WRITE ${FMTLOG_OUT} "${FILELOG}") diff --git a/cmake/Modules/G4ConfigureCMakeHelpers.cmake b/cmake/Modules/G4ConfigureCMakeHelpers.cmake index 125b6e3e6d..c0ecfe0fae 100644 --- a/cmake/Modules/G4ConfigureCMakeHelpers.cmake +++ b/cmake/Modules/G4ConfigureCMakeHelpers.cmake @@ -200,7 +200,7 @@ configure_file( ) -foreach(_mod AIDA HepMC Pythia6 Pythia8 StatTest TBB XQuartzGL) +foreach(_mod HepMC Pythia6 Pythia8 StatTest TBB XQuartzGL) configure_file( ${PROJECT_SOURCE_DIR}/cmake/Modules/Find${_mod}.cmake ${PROJECT_BINARY_DIR}/Modules/Find${_mod}.cmake diff --git a/cmake/Modules/G4ConfigureGNUMakeHelpers.cmake b/cmake/Modules/G4ConfigureGNUMakeHelpers.cmake index c29c41c228..e6f2f6e6c3 100644 --- a/cmake/Modules/G4ConfigureGNUMakeHelpers.cmake +++ b/cmake/Modules/G4ConfigureGNUMakeHelpers.cmake @@ -509,13 +509,7 @@ macro(_g4tc_configure_tc_variables SHELL_FAMILY SCRIPT_NAME) # Have to use detected CLHEP paths to set base dir and others get_filename_component(_CLHEP_INCLUDE_DIR "${CLHEP_INCLUDE_DIR}" REALPATH) get_filename_component(_CLHEP_BASE_DIR "${_CLHEP_INCLUDE_DIR}" DIRECTORY) - - # Handle granular vs singular cases - if(GEANT4_USE_SYSTEM_CLHEP_GRANULAR) - get_target_property(_CLHEP_LIB_DIR CLHEP::Vector LOCATION) - else() - get_target_property(_CLHEP_LIB_DIR CLHEP::CLHEP LOCATION) - endif() + get_target_property(_CLHEP_LIB_DIR CLHEP::CLHEP LOCATION) get_filename_component(_CLHEP_LIB_DIR "${_CLHEP_LIB_DIR}" REALPATH) get_filename_component(_CLHEP_LIB_DIR "${_CLHEP_LIB_DIR}" DIRECTORY) @@ -525,21 +519,6 @@ macro(_g4tc_configure_tc_variables SHELL_FAMILY SCRIPT_NAME) _g4tc_setenv_command(GEANT4_TC_CLHEP_INCLUDE_DIR ${SHELL_FAMILY} CLHEP_INCLUDE_DIR "${_CLHEP_INCLUDE_DIR}") # Only need to handle CLHEP_LIB for granular case - if(GEANT4_USE_SYSTEM_CLHEP_GRANULAR) - set(G4_SYSTEM_CLHEP_LIBRARIES ) - foreach(_clhep_lib ${CLHEP_LIBRARIES}) - get_target_property(_CLHEP_LIB_NAME ${_clhep_lib} LOCATION) - get_filename_component(_curlib "${_CLHEP_LIB_NAME}" NAME) - string(REGEX REPLACE "^lib(.*)\\.(so|a|dylib|lib|dll)$" "\\1" _curlib "${_curlib}") - set(G4_SYSTEM_CLHEP_LIBRARIES "${G4_SYSTEM_CLHEP_LIBRARIES} -l${_curlib}") - endforeach() - - # Strip first "-l" as that's prepended by Geant4Make - string(REGEX REPLACE "^ *\\-l" "" G4_SYSTEM_CLHEP_LIBRARIES "${G4_SYSTEM_CLHEP_LIBRARIES}") - - _g4tc_setenv_command(GEANT4_TC_CLHEP_LIB ${SHELL_FAMILY} CLHEP_LIB "\"${G4_SYSTEM_CLHEP_LIBRARIES}\"") - endif() - _g4tc_setenv_command(GEANT4_TC_CLHEP_LIB_DIR ${SHELL_FAMILY} CLHEP_LIB_DIR ${_CLHEP_LIB_DIR}) @@ -582,6 +561,12 @@ macro(_g4tc_configure_tc_variables SHELL_FAMILY SCRIPT_NAME) # variable... get_filename_component(_xercesc_root ${XercesC_INCLUDE_DIR} PATH) _g4tc_setenv_command(GEANT4_TC_GDML_PATH_SETUP ${SHELL_FAMILY} XERCESCROOT ${_xercesc_root}) + + # Needed temporarily to workaround issue on LCG setups + if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + get_filename_component(_xercesc_libdir ${XercesC_LIBRARY_RELEASE} DIRECTORY) + _g4tc_prepend_path(GEANT4_TC_XERCESC_LIB_PATH_SETUP ${SHELL_FAMILY} LD_LIBRARY_PATH ${_xercesc_libdir}) + endif() else() set(GEANT4_TC_G4LIB_USE_GDML "# NOT BUILT WITH GDML SUPPORT") endif() @@ -650,20 +635,6 @@ macro(_g4tc_configure_tc_variables SHELL_FAMILY SCRIPT_NAME) set(GEANT4_TC_G4UI_USE_XM "# NOT BUILT WITH XM INTERFACE") endif() - # - Network DAWN - if(GEANT4_USE_NETWORKDAWN) - _g4tc_setenv_command(GEANT4_TC_G4VIS_USE_DAWN ${SHELL_FAMILY} G4VIS_USE_DAWN 1) - else() - set(GEANT4_TC_G4VIS_USE_DAWN "# NOT BUILT WITH NETWORK DAWN SUPPORT") - endif() - - # - Network VRML - if(GEANT4_USE_NETWORKVRML) - _g4tc_setenv_command(GEANT4_TC_G4VIS_USE_VRML ${SHELL_FAMILY} G4VIS_USE_VRML 1) - else() - set(GEANT4_TC_G4VIS_USE_VRML "# NOT BUILT WITH NETWORK VRML SUPPORT") - endif() - # - OpenInventor if(GEANT4_USE_INVENTOR) if(UNIX) @@ -766,7 +737,7 @@ endmacro() # set(G4SYSTEM "${GEANT4_SYSTEM}-${GEANT4_COMPILER}") set(G4INSTALL ${PROJECT_SOURCE_DIR}) -set(G4INCLUDE ${PROJECT_SOURCE_DIR}/this_is_a_deliberate_dummy_path) +set(G4INCLUDE ${PROJECT_BINARY_DIR}/this_is_a_deliberate_dummy_path) set(G4BIN_DIR ${PROJECT_BINARY_DIR}) set(G4LIB ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) set(G4LIB_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) @@ -781,7 +752,7 @@ foreach(_ds ${GEANT4_EXPORTED_DATASETS}) endforeach() # - Fonts -set(TOOLS_FONT_PATH "${PROJECT_SOURCE_DIR}/source/analysis/fonts") +set(TOOLS_FONT_PATH "${PROJECT_SOURCE_DIR}/source/externals/g4tools/fonts") # - Configure the shell scripts for the BUILD TREE _g4tc_configure_build_tree_scripts(geant4make) @@ -965,12 +936,7 @@ foreach(_shell IN LISTS shells_list) set(GEANT4_TC_CLHEP_LIB_PATH_SETUP "# - Builtin CLHEP used") if(GEANT4_USE_SYSTEM_CLHEP) # Handle granular vs singular cases - if(GEANT4_USE_SYSTEM_CLHEP_GRANULAR) - get_target_property(_CLHEP_LIB_DIR CLHEP::Vector LOCATION) - else() - get_target_property(_CLHEP_LIB_DIR CLHEP::CLHEP LOCATION) - endif() - + get_target_property(_CLHEP_LIB_DIR CLHEP::CLHEP LOCATION) get_filename_component(_CLHEP_LIB_DIR "${_CLHEP_LIB_DIR}" REALPATH) get_filename_component(_CLHEP_LIB_DIR "${_CLHEP_LIB_DIR}" DIRECTORY) diff --git a/cmake/Modules/G4DatasetDefinitions.cmake b/cmake/Modules/G4DatasetDefinitions.cmake index 970d928e16..9ad62a91ed 100644 --- a/cmake/Modules/G4DatasetDefinitions.cmake +++ b/cmake/Modules/G4DatasetDefinitions.cmake @@ -18,11 +18,11 @@ geant4_add_dataset( # - Low energy electromagnetics geant4_add_dataset( NAME G4EMLOW - VERSION 7.17 + VERSION 8.0 FILENAME G4EMLOW EXTENSION tar.gz ENVVAR G4LEDATA - MD5SUM 7cc8360a78fe6d501cdf34a945e71a25 + MD5SUM 6795805f39ac73a71333276756004d99 ) # - Photon evaporation @@ -48,11 +48,11 @@ geant4_add_dataset( # - Particle XS - replaces Neutron XS geant4_add_dataset( NAME G4PARTICLEXS - VERSION 3.1.1 + VERSION 4.0 FILENAME G4PARTICLEXS EXTENSION tar.gz ENVVAR G4PARTICLEXSDATA - MD5SUM 98b766fa2c447b541834cc9bf5206c05 + MD5SUM d82a4d171d50f55864e28b6cd6f433c0 ) # - PII @@ -123,11 +123,11 @@ mark_as_advanced(GEANT4_INSTALL_DATASETS_TENDL) if(GEANT4_INSTALL_DATASETS_TENDL) geant4_add_dataset( NAME G4TENDL - VERSION 1.3.2 + VERSION 1.4 FILENAME G4TENDL EXTENSION tar.gz ENVVAR G4PARTICLEHPDATA - MD5SUM 209f878b777a36842d20a47ca53c6f93 + MD5SUM ab17a1eec5ad4c8fcfafcfbc0de30ed8 ) endif() diff --git a/cmake/Modules/G4DeveloperAPI.cmake b/cmake/Modules/G4DeveloperAPI.cmake index 28b86ebf81..2840230cbe 100644 --- a/cmake/Modules/G4DeveloperAPI.cmake +++ b/cmake/Modules/G4DeveloperAPI.cmake @@ -35,14 +35,7 @@ # #----------------------------------------------------------------- -if(NOT __G4DEVELOPERAPI_INCLUDED) - set(__G4DEVELOPERAPI_INCLUDED TRUE) -else() - return() -endif() - -# Needed modules -include(G4ClangFormat) +include_guard(DIRECTORY) #----------------------------------------------------------------------- #.rst: @@ -579,13 +572,12 @@ function(geant4_define_module) cmake_parse_arguments(G4DEFMOD "" "NAME" - "HEADERS;SOURCES;GRANULAR_DEPENDENCIES;GLOBAL_DEPENDENCIES;LINK_LIBRARIES;HEADERS_EXCLUDE_FORMAT;SOURCES_EXCLUDE_FORMAT" + "HEADERS;SOURCES;GRANULAR_DEPENDENCIES;GLOBAL_DEPENDENCIES;LINK_LIBRARIES" ${ARGN} ) __geant4_assert_no_unparsed_arguments(G4DEFMOD geant4_define_module) # HEADERS -> PUBLIC_HEADERS # SOURCES -> SOURCES - # Don't support clang-formatting yet. geant4_add_module(${G4DEFMOD_NAME} PUBLIC_HEADERS ${G4DEFMOD_HEADERS} SOURCES ${G4DEFMOD_SOURCES} @@ -608,7 +600,7 @@ function(geant4_define_module) # When we are ready, start issuing a deprecation warning here, including instructions for # migration... - # message(WARNING "Use of geant4_define_module is deprecated, please use... instead") + #message(WARNING "Use of geant4_define_module is deprecated, please use... instead") endfunction() #----------------------------------------------------------------------- @@ -699,8 +691,6 @@ function(geant4_library_target) message(FATAL_ERROR "geant4_library_target called for '${G4GLOBLIB_NAME}' in '${CMAKE_CURRENT_LIST_DIR}'") endif() - geant4_format_target(NAME ${G4GLOBLIB_NAME}-format SOURCES ${G4GLOBLIB_SOURCES}) - if(BUILD_SHARED_LIBS) add_library(${G4GLOBLIB_NAME} SHARED ${G4GLOBLIB_SOURCES}) add_library(Geant4::${G4GLOBLIB_NAME} ALIAS ${G4GLOBLIB_NAME}) @@ -938,9 +928,6 @@ function(__geant4_add_library _name _type) set_target_properties(${_target_name} PROPERTIES OUTPUT_NAME ${_name}) endif() - # Compose target sources and links from its constituent modules - set(__sources_to_format) - get_property(__g4modules GLOBAL PROPERTY GEANT4_CATEGORIES_${_name}_MODULES) foreach(__g4mod ${__g4modules}) # - Process sources... @@ -948,11 +935,6 @@ function(__geant4_add_library _name _type) geant4_get_module_property(_srcs ${__g4mod} SOURCES) geant4_get_module_property(_cmakescript ${__g4mod} CMAKE_LIST_FILE) - # Store sources to be formatted (one mode only) - if(_type STREQUAL "SHARED") - list(APPEND __sources_to_format ${_headers} ${_srcs}) - endif() - # - Group sources and scripts for IDEs # NB: Seemingly has to be done at same level we define target. # TODO: If lib name is same as mod name, don't group avoid extra @@ -1019,20 +1001,15 @@ function(__geant4_add_library _name _type) endforeach() # Temp workaround for modules needing Qt. We use AUTOMOC, but can't yet set - # it on a per module basis. However, only have three modules that require + # it on a per module basis. However, only have four modules that require # moc-ing, so hard code for now. # TODO: likely need an additional "module target properties" to hold things # that can be passed to set_target_properties - if(__g4mod MATCHES "G4UIbasic|G4OpenGL|G4OpenInventor" AND GEANT4_USE_QT) + if(__g4mod MATCHES "G4UIbasic|G4OpenGL|G4OpenInventor|G4ToolsSG" AND GEANT4_USE_QT) set_target_properties(${_target_name} PROPERTIES AUTOMOC ON) endif() endforeach() - # - Use stored total list of sources to create format target for one mode only - if(_type STREQUAL "SHARED") - geant4_format_target(NAME ${_name}-format SOURCES ${__sources_to_format}) - endif() - # - Postprocess target properties to remove duplicates # NB: This makes the assumption that there is no order dependence here (and any is considered a bug!) # CMake will handle static link ordering internally diff --git a/cmake/Modules/G4GitUtilities.cmake b/cmake/Modules/G4GitUtilities.cmake new file mode 100644 index 0000000000..fafa5110d4 --- /dev/null +++ b/cmake/Modules/G4GitUtilities.cmake @@ -0,0 +1,97 @@ +#.rst: +# G4GitUtilities +# -------------- +# +# .. code-block::cmake +# +# include(G4GitUtilities) +# +# CMake functions and macros for working with Git where needed in +# Geant4's build/packaging systems. +# + +#----------------------------------------------------------------- +# License and Disclaimer +# +# The Geant4 software is copyright of the Copyright Holders of +# the Geant4 Collaboration. It is provided under the terms and +# conditions of the Geant4 Software License, included in the file +# LICENSE and available at http://cern.ch/geant4/license . These +# include a list of copyright holders. +# +# Neither the authors of this software system, nor their employing +# institutes,nor the agencies providing financial support for this +# work make any representation or warranty, express or implied, +# regarding this software system or assume any liability for its +# use. Please see the license in the file LICENSE and URL above +# for the full disclaimer and the limitation of liability. +# +# This code implementation is the result of the scientific and +# technical work of the GEANT4 collaboration. +# By using, copying, modifying or distributing the software (or +# any work based on the software) you agree to acknowledge its +# use in resulting scientific publications, and indicate your +# acceptance of all terms of the Geant4 Software license. +# +#----------------------------------------------------------------- + +include_guard(GLOBAL) + +#----------------------------------------------------------------------- +#.rst: +# .. cmake:command:: geant4_git_find_dirty +# +# .. code-block:: cmake +# +# geant4_git_find_dirty( ) +# +# Runs ``git status`` in the ````, writing lists of modified +# and untracked/ignored files to ```` and ```` +# respectively. +# +# ```` must be the root of the repository queried, i.e. containing +# the ``.git/`` directory. +# +# Nothing is returned in the output variables if ```` is not a +# git repository or if a ``git`` executable cannot be located. +# +function(geant4_git_find_dirty _basedir _output_modified _output_untracked) + if(NOT EXISTS "${_basedir}/.git") + return() + endif() + + find_package(Git QUIET) + if(NOT Git_FOUND) + return() + endif() + + execute_process(COMMAND ${GIT_EXECUTABLE} status -s --ignored + WORKING_DIRECTORY "${_basedir}" + OUTPUT_VARIABLE GEANT4_GIT_UNTRACKED + ERROR_VARIABLE GEANT4_GIT_UNTRACKED_ERROR) + + if(GEANT4_GIT_UNTRACKED_ERROR) + message(FATAL_ERROR "geant4_git_find_dirty: Calling `git status` failed with error: '${GEANT4_GIT_UNTRACKED_ERROR}'") + endif() + + if(GEANT4_GIT_UNTRACKED) + set(_modded_files) + set(_untracked_files) + + string(REPLACE "\n" ";" GEANT4_GIT_UNTRACKED "${GEANT4_GIT_UNTRACKED}") + foreach(item ${GEANT4_GIT_UNTRACKED}) + if(item MATCHES "^ *(M|A|R|D|C)") + string(REGEX REPLACE "^ *[MARDC][MARDC] *" "" _modded_path "${item}") + list(APPEND _modded_files ${_modded_path}) + endif() + + if(item MATCHES "^ *(\\!|\\?)") + string(REGEX REPLACE "^ *(\\!\\!|\\?\\?) *" "" _untracked_path "${item}") + list(APPEND _untracked_files "${_untracked_path}") + endif() + endforeach() + + set(${_output_modified} ${_modded_files} PARENT_SCOPE) + set(${_output_untracked} ${_untracked_files} PARENT_SCOPE) + endif() +endfunction() diff --git a/cmake/Modules/G4HDF5Shim.cmake b/cmake/Modules/G4HDF5Shim.cmake index 963a7bb5be..97d97248d8 100644 --- a/cmake/Modules/G4HDF5Shim.cmake +++ b/cmake/Modules/G4HDF5Shim.cmake @@ -1,10 +1,10 @@ - # - G4HDF5Shim +# - G4HDF5Shim # # Geant4's Geant4Config.cmake file aims to support CMake 3.8 and newer # The HDF5 dependency is located through CMake's builtin FindHDF5 -# module, but this does not supply imported targets as of CMake 3.16. +# module, but this does not supply imported targets until CMake 3.20. # It may use HDF5's hdf5-config.cmake file if available, so create -# custom imported target Geant4::HDF5 to allow both cases to be handled +# custom imported target hdf5::hdf5 to allow both cases to be handled # without interference with either. if(HDF5_FOUND) @@ -24,18 +24,18 @@ if(HDF5_FOUND) endif() endif() - # As FindHDF5 does not yet supply imported targets, we + # If FindHDF5 does not yet supply imported targets, we # create an internal INTERFACE target to wrap these. # This still hard-codes include/library paths, but limits it # to one place. Later, we'll create proper imported targets # with re-finds but for now this is the best minimally invasive proceedure - if(NOT TARGET Geant4::HDF5) - add_library(Geant4::HDF5 IMPORTED UNKNOWN) - set_target_properties(Geant4::HDF5 PROPERTIES + if(NOT TARGET hdf5::hdf5) + add_library(hdf5::hdf5 IMPORTED UNKNOWN) + set_target_properties(hdf5::hdf5 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION "${HDF5_C_LIBRARY_hdf5}" INTERFACE_INCLUDE_DIRECTORIES "${HDF5_C_INCLUDE_DIRS}" INTERFACE_LINK_LIBRARIES "${HDF5_C_LIBRARIES}" ) endif() -endif() \ No newline at end of file +endif() diff --git a/cmake/Modules/G4InterfaceOptions.cmake b/cmake/Modules/G4InterfaceOptions.cmake index c67eca13b6..4ec36912c1 100644 --- a/cmake/Modules/G4InterfaceOptions.cmake +++ b/cmake/Modules/G4InterfaceOptions.cmake @@ -56,33 +56,55 @@ if(GEANT4_USE_INVENTOR_QT) set(GEANT4_USE_INVENTOR ON) endif() -# - Qt (may be required by Coin driver) +# - ToolsSG/Xt/X11/Qt/Win +# Though this option has platform differences, we configure here because it can +# trigger the Qt requirement +if(WIN32) + set(_g4_toolssg_backends "OFF" "WIN32") +else() + # TODO: Difference between X11, XT? + set(_g4_toolssg_backends "OFF" "X11" "XT" "QT") +endif() + +enum_option(GEANT4_USE_TOOLSSG + DOC "Build Geant4 ToolsSG Visualization Driver with Backend" + VALUES ${_g4_toolssg_backends} +) +geant4_add_feature(GEANT4_USE_TOOLSSG "Build ToolsSG Visualization Driver with backend '${GEANT4_USE_TOOLSSG}'") + +foreach(_tsg_backend IN LISTS _g4_toolssg_backends) + set(GEANT4_USE_TOOLSSG_${_tsg_backend}_GLES OFF) + if(_tsg_backend STREQUAL GEANT4_USE_TOOLSSG) + set(GEANT4_USE_TOOLSSG_${_tsg_backend}_GLES ON) + endif() +endforeach() + +# - Qt (may be required by Coin/ToolsSG driver) option(GEANT4_USE_QT "Build Geant4 with Qt support" OFF) -if(GEANT4_USE_INVENTOR_QT AND NOT GEANT4_USE_QT) +if((GEANT4_USE_INVENTOR_QT OR GEANT4_USE_TOOLSSG_QT_GLES) AND NOT GEANT4_USE_QT) set(GEANT4_USE_QT ON CACHE BOOL "Build Geant4 with Qt support" FORCE) - message(STATUS "Forcing GEANT4_USE_QT to ON, required by GEANT4_USE_INVENTOR_QT") + message(STATUS "Forcing GEANT4_USE_QT to ON, required by Inventor/ToolsSG Driver(s)") endif() geant4_add_feature(GEANT4_USE_QT "Build Geant4 with Qt support") +# - Vtk +option(GEANT4_USE_VTK "Build Geant4 with VTK visualisation" OFF) +mark_as_advanced(GEANT4_USE_VTK) +if(GEANT4_USE_VTK) + find_package(VTK 8.2 REQUIRED) +endif() + +geant4_add_feature(GEANT4_USE_VTK "Using VTK for visualisation (EXPERIMENTAL)") + # - Unix only if(UNIX) - # - Client/Server DAWN driver - # mark as advanced because user should know what they're doing here - option(GEANT4_USE_NETWORKDAWN "Build Dawn driver with Client/Server support" OFF) - geant4_add_feature(GEANT4_USE_NETWORKDAWN "Build Dawn driver with Client/Server support") - mark_as_advanced(GEANT4_USE_NETWORKDAWN) - - # - Client/Server VRML driver - option(GEANT4_USE_NETWORKVRML "Build VRML driver with Client/Server support" OFF) - geant4_add_feature(GEANT4_USE_NETWORKVRML "Build VRML driver with Client/Server support") - mark_as_advanced(GEANT4_USE_NETWORKVRML) - # - Motif UI/Vis (may be required by Coin Vis driver) option(GEANT4_USE_XM "Build Geant4 with Motif (X11) support" OFF) - if(GEANT4_USE_INVENTOR AND NOT GEANT4_USE_INVENTOR_QT AND NOT GEANT4_USE_XM) + if((GEANT4_USE_INVENTOR AND NOT GEANT4_USE_INVENTOR_QT) + AND NOT GEANT4_USE_XM) set(GEANT4_USE_XM ON CACHE BOOL "Build Geant4 with Motif (X11) support" FORCE) - message(STATUS "Forcing GEANT4_USE_XM to ON, required by GEANT4_USE_INVENTOR") + message(STATUS "Forcing GEANT4_USE_XM to ON, required by Inventor driver") endif() geant4_add_feature(GEANT4_USE_XM "Build Geant4 with Xm Support") @@ -94,30 +116,12 @@ if(UNIX) # RayTracer driver with X11 support option(GEANT4_USE_RAYTRACER_X11 "Build RayTracer driver with X11 support" OFF) geant4_add_feature(GEANT4_USE_RAYTRACER_X11 "Build RayTracer driver with X11 support") - - # ToolsSG X11/GLES driver - option(GEANT4_USE_TOOLSSG_X11_GLES "Build Geant4 ToolsSG driver with X11/GLES support" OFF) - geant4_add_feature(GEANT4_USE_TOOLSSG_X11_GLES "Build Geant4 ToolsSG driver with X11/GLES support") - - # ToolsSG Xt/GLES driver - option(GEANT4_USE_TOOLSSG_XT_GLES "Build Geant4 ToolsSG driver with Xt/GLES support" OFF) - geant4_add_feature(GEANT4_USE_TOOLSSG_XT_GLES "Build Geant4 ToolsSG driver with Xt/GLES support") - - # ToolsSG Qt/GLES driver - option(GEANT4_USE_TOOLSSG_QT_GLES "Build Geant4 ToolsSG driver with Qt/GLES support" OFF) - geant4_add_feature(GEANT4_USE_TOOLSSG_QT_GLES "Build Geant4 ToolsSG driver with Qt/GLES support") - endif() # Windows only if(WIN32) option(GEANT4_USE_OPENGL_WIN32 "Build OpenGL driver with Win32 support") geant4_add_feature(GEANT4_USE_OPENGL_WIN32 "Build OpenGL driver with Win32 support") - - # ToolsSG Windows/GLES driver - option(GEANT4_USE_TOOLSSG_WINDOWS_GLES "Build Geant4 ToolsSG driver with Windows/GLES support" OFF) - geant4_add_feature(GEANT4_USE_TOOLSSG_WINDOWS_GLES "Build Geant4 ToolsSG driver with Windows/GLES support") - endif() #----------------------------------------------------------------------- @@ -199,18 +203,29 @@ if(GEANT4_USE_INVENTOR OR GEANT4_USE_QT OR GEANT4_USE_OPENGL_X11 OR GEANT4_USE_XM + OR GEANT4_USE_TOOLSSG OR GEANT4_USE_OPENGL_WIN32) find_package(OpenGL REQUIRED) geant4_save_package_variables(OpenGL OPENGL_INCLUDE_DIR OPENGL_gl_LIBRARY) # X11 drivers on macOS need XQuartzGL - if(APPLE AND (GEANT4_USE_INVENTOR_XT OR GEANT4_USE_OPENGL_X11 OR GEANT4_USE_XM)) + if(APPLE AND + (GEANT4_USE_INVENTOR_XT + OR GEANT4_USE_OPENGL_X11 + OR GEANT4_USE_XM + OR GEANT4_USE_TOOLSSG_X11_GLES + OR GEANT4_USE_TOOLSSG_XT_GLES)) find_package(XQuartzGL REQUIRED) geant4_save_package_variables(XQuartzGL XQuartzGL_INCLUDE_DIR XQuartzGL_gl_LIBRARY) endif() - # Enable driver - set(GEANT4_USE_OPENGL ON) + # Enable G4OpenGL driver + if(GEANT4_USE_INVENTOR + OR GEANT4_USE_QT + OR GEANT4_USE_OPENGL_X11 + OR GEANT4_USE_OPENGL_WIN32) + set(GEANT4_USE_OPENGL ON) + endif() endif() if(UNIX) @@ -218,7 +233,9 @@ if(UNIX) if(GEANT4_USE_OPENGL_X11 OR GEANT4_USE_RAYTRACER_X11 OR GEANT4_USE_XM - OR GEANT4_USE_INVENTOR_XT) + OR GEANT4_USE_INVENTOR_XT + OR GEANT4_USE_TOOLSSG_X11_GLES + OR GEANT4_USE_TOOLSSG_XT_GLES) find_package(X11 REQUIRED) include("${CMAKE_CURRENT_LIST_DIR}/G4X11Shim.cmake") diff --git a/cmake/Modules/G4OptionalComponents.cmake b/cmake/Modules/G4OptionalComponents.cmake index 5b48a97584..18e089971f 100644 --- a/cmake/Modules/G4OptionalComponents.cmake +++ b/cmake/Modules/G4OptionalComponents.cmake @@ -30,11 +30,6 @@ # by providing the `CLHEP_ROOT_DIR` option. Setting this variable # will automatically enable use of an external CLHEP. # -# When using an external install of CLHEP, the default is to link -# to the full CLHEP library. An additional advanced option -# `GEANT4_USE_SYSTEM_CLHEP_GRANULAR` is available to configure -# use of the modular CLHEP libraries. -# set(_default_use_system_clhep OFF) if(CLHEP_ROOT_DIR) set(_default_use_system_clhep ON) @@ -42,27 +37,9 @@ if(CLHEP_ROOT_DIR) endif() option(GEANT4_USE_SYSTEM_CLHEP "Use system CLHEP library" ${_default_use_system_clhep}) -cmake_dependent_option(GEANT4_USE_SYSTEM_CLHEP_GRANULAR - "Use system CLHEP granular libraries" OFF - "GEANT4_USE_SYSTEM_CLHEP" OFF - ) -mark_as_advanced(GEANT4_USE_SYSTEM_CLHEP_GRANULAR) if(GEANT4_USE_SYSTEM_CLHEP) - set(__system_clhep_mode " (singular)") - - if(GEANT4_USE_SYSTEM_CLHEP_GRANULAR) - set(__g4_clhep_components - Evaluator - Geometry - Random - Vector - ) - set(__system_clhep_mode " (granular)") - endif() - - find_package(CLHEP 2.4.4.0 REQUIRED ${__g4_clhep_components} CONFIG) - + find_package(CLHEP 2.4.5.1 REQUIRED CONFIG) geant4_save_package_variables(CLHEP CLHEP_DIR) else() set(CLHEP_FOUND TRUE) @@ -82,7 +59,7 @@ else() set(CLHEP_LIBRARIES G4clhep) endif() -geant4_add_feature(GEANT4_USE_SYSTEM_CLHEP "Using system CLHEP library${__system_clhep_mode}") +geant4_add_feature(GEANT4_USE_SYSTEM_CLHEP "Using system CLHEP library") #----------------------------------------------------------------------- # Find required EXPAT package @@ -336,7 +313,7 @@ endif() # - Geant4 USolids/VecGom setup if(GEANT4_USE_ALL_USOLIDS OR GEANT4_USE_PARTIAL_USOLIDS) - find_package(VecGeom 1.1.8 REQUIRED) + find_package(VecGeom 1.1.18 REQUIRED) # Shim until VecGeom supports config mode properly include("${CMAKE_CURRENT_LIST_DIR}/G4VecGeomShim.cmake") # Backward Compatibility @@ -392,7 +369,7 @@ if(GEANT4_USE_HDF5) find_package(HDF5 1.8 REQUIRED) include("${CMAKE_CURRENT_LIST_DIR}/G4HDF5Shim.cmake") # Backward compatibility - set(HDF5_LIBRARIES Geant4::HDF5) + set(HDF5_LIBRARIES hdf5::hdf5) # May have found via config mode... if(HDF5_DIR) @@ -406,4 +383,3 @@ if(GEANT4_USE_HDF5) endif() GEANT4_ADD_FEATURE(GEANT4_USE_HDF5 "Building Geant4 analysis library with HDF5 support") - diff --git a/cmake/Modules/G4TestDriver.cmake b/cmake/Modules/G4TestDriver.cmake index 087f361c01..7972ce60b7 100644 --- a/cmake/Modules/G4TestDriver.cmake +++ b/cmake/Modules/G4TestDriver.cmake @@ -1,6 +1,6 @@ #----------------------------------------------------------------------- # Geant4 test driver -# Script arguments: +# Script arguments: # CMD command to be executed for the test # PRE command to be executed before the test command # POST command to be executed after the test command @@ -9,7 +9,7 @@ # ENV evironment VAR1=Value1;VAR2=Value2 # CWD current working directory # TST test name (used to name output/error files) -# TIM timeout +# TIM timeout # DBG debug flag if(DBG) @@ -56,9 +56,9 @@ if(TIM) else() if(NOT $ENV{CTEST_TIMEOUT} STREQUAL "") math(EXPR _timeout "$ENV{CTEST_TIMEOUT} - 120") - else() + else() math(EXPR _timeout "1500 - 120") - endif() + endif() endif() if(CWD) diff --git a/cmake/Templates/CMakeCPackOptions.cmake.in b/cmake/Templates/CMakeCPackOptions.cmake.in index eb2ff846e8..437f319ad0 100644 --- a/cmake/Templates/CMakeCPackOptions.cmake.in +++ b/cmake/Templates/CMakeCPackOptions.cmake.in @@ -2,17 +2,12 @@ # To pass variables to cpack from cmake, they must be configured # in this file. -# This file is configured at cmake time, and loaded at cpack time. -# To pass variables to cpack from cmake, they must be configured -# in this file. - # - NSIS Specifics -if(CPACK_GENERATOR MATCHES "NSIS") +if(CPACK_GENERATOR STREQUAL "NSIS") # There is a bug in NSI that does not handle full unix paths properly. # Make sure there is at least one set of two (2) backlasshes. - set(CPACK_PACKAGE_ICON "@CMAKE_SOURCE_DIR@\\cmake\\Templates\\g4_small.bmp") - set(CPACK_NSIS_MUI_ICON "@CMAKE_SOURCE_DIR@\\cmake\\Templates\\G4.ico") - set(CPACK_NSIS_MUI_UNIICON "@CMAKE_SOURCE_DIR@\\cmake\\Templates\\G4.ico") + set(CPACK_NSIS_MUI_ICON "@PROJECT_SOURCE_DIR@\\cmake\\Templates\\G4.ico") + set(CPACK_NSIS_MUI_UNIICON "@PROJECT_SOURCE_DIR@\\cmake\\Templates\\G4.ico") set(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY}") set(CPACK_NSIS_HELP_LINK "http:\\\\www.geant4.org") set(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\www.geant4.org") @@ -20,9 +15,7 @@ if(CPACK_GENERATOR MATCHES "NSIS") set(CPACK_NSIS_MODIFY_PATH ON) endif() -# - PackageMaker Specifics -if("${CPACK_GENERATOR}" STREQUAL "PackageMaker") - set(CPACK_PACKAGING_INSTALL_PREFIX "/${CPACK_PACKAGE_INSTALL_DIRECTORY}") - set(CPACK_PACKAGE_DEFAULT_LOCATION "/Applications") +# - productbuild Specifics +if(CPACK_GENERATOR STREQUAL "productbuild") + set(CPACK_PACKAGING_INSTALL_PREFIX "/Library/${CPACK_PACKAGE_INSTALL_DIRECTORY}") endif() - diff --git a/cmake/Templates/Geant4Config.cmake.in b/cmake/Templates/Geant4Config.cmake.in index 7992274ccb..32b76990cc 100644 --- a/cmake/Templates/Geant4Config.cmake.in +++ b/cmake/Templates/Geant4Config.cmake.in @@ -82,8 +82,6 @@ # motif (Motif-X11/OpenGL Graphical User Interface) # qt (Qt5/OpenGL Graphical User Interface) # -# vis_network_dawn (Client/Server network interface to DAWN visualization) -# vis_network_vrml (Client/Server network interface to VRML visualization) # vis_opengl_x11 (OpenGL visualization with X11 interface) # vis_opengl_win32 (OpenGL visualization with X11 interface) # vis_raytracer_x11 (RayTracer visualization with X11 interface) @@ -122,12 +120,6 @@ # system APIs as required, and you should use these to ensure you compile # and link against the same API version. # -# An additional variable is set for CLHEP when Geant4 was built using a -# system install to indicate whether the single/granular CLHEP library/ies -# was/were linked against -# -# Geant4_system_clhep_ISGRANULAR (TRUE is Geant4 linked to granular CLHEP) -# # Environment variables for, and directory paths to, physics datasets # used by some Geant4 physics processes may be determined from the # variables @@ -256,12 +248,7 @@ set(Geant4_system_clhep_FOUND @GEANT4_USE_SYSTEM_CLHEP@) if(Geant4_system_clhep_FOUND) set(Geant4_builtin_clhep_FOUND FALSE) - set(Geant4_system_clhep_ISGRANULAR @GEANT4_USE_SYSTEM_CLHEP_GRANULAR@) - if(Geant4_system_clhep_ISGRANULAR) - find_dependency(CLHEP @CLHEP_VERSION@ EXACT COMPONENTS @__g4_clhep_components@ CONFIG) - else() - find_dependency(CLHEP @CLHEP_VERSION@ EXACT CONFIG) - endif() + find_dependency(CLHEP @CLHEP_VERSION@ EXACT CONFIG) # Explicitly use include_directories. # - Geant4 and CLHEP use full imported targets with usage requirements, # but ROOT (used in the examples), ignores usage requirements in dictionary @@ -399,27 +386,7 @@ endif() set(Geant4_ui_win32_FOUND @WIN32@) if(Geant4_ui_win32_FOUND) if(("ui_win32" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_ui_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4INTY_USE_WIN32 - -DG4UI_USE_WIN32 - ) - endif() -endif() - -# - Visualization : Network DAWN -set(Geant4_vis_dawn_network_FOUND @GEANT4_USE_NETWORK_DAWN@) -if(Geant4_vis_dawn_network_FOUND) - if(("vis_dawn_network" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_vis_all_FOUND) - list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_DAWN) - endif() -endif() - -# - Visualization : Network VRML -set(Geant4_vis_vrml_network_FOUND @GEANT4_USE_NETWORK_VRML@) -if(Geant4_vis_vrml_network_FOUND) - if(("vis_vrml_network" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_vis_all_FOUND) - list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_VRML) + list(APPEND Geant4_DEFINITIONS -DG4UI_USE_WIN32) endif() endif() @@ -433,11 +400,7 @@ if(Geant4_vis_raytracer_x11_FOUND) include("${CMAKE_CURRENT_LIST_DIR}/G4X11Shim.cmake") if(("vis_raytracer_x11" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_vis_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4INTY_USE_XT - -DG4VIS_USE_RAYTRACERX - ) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_RAYTRACERX) endif() endif() @@ -467,15 +430,8 @@ if(Geant4_qt_FOUND) OR ("vis_openinventor" IN_LIST Geant4_FIND_COMPONENTS) OR ("vis_toolssg_qt_gles" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_ui_all_FOUND OR Geant4_vis_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4INTY_USE_QT - -DG4UI_USE_QT - -DG4VIS_USE_OPENGLQT - #-DG4VIS_USE_TOOLSSG_QT_GLES - ) + list(APPEND Geant4_DEFINITIONS -DG4UI_USE_QT -DG4VIS_USE_OPENGLQT) set(_geant4_use_opengl_library ON) - #set(_geant4_use_toolssg_library ON) # Qt3D is always on if available set(_geant4_use_qt3D_library ${Geant4_qt3d_FOUND}) endif() @@ -499,12 +455,7 @@ if(Geant4_motif_FOUND) OR ("vis_openinventor" IN_LIST Geant4_FIND_COMPONENTS) OR ("vis_toolssg_xt_gles" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_ui_all_FOUND OR Geant4_vis_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4INTY_USE_XT - -DG4UI_USE_XM - -DG4VIS_USE_OPENGLXM - ) + list(APPEND Geant4_DEFINITIONS -DG4UI_USE_XM -DG4VIS_USE_OPENGLXM) set(_geant4_use_opengl_library ON) endif() endif() @@ -521,11 +472,7 @@ if(Geant4_vis_opengl_x11_FOUND) endif() if(("vis_opengl_x11" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_vis_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4INTY_USE_XT - -DG4VIS_USE_OPENGLX - ) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_OPENGLX) set(_geant4_use_opengl_library ON) endif() endif() @@ -535,11 +482,7 @@ set(Geant4_vis_opengl_win32_FOUND @GEANT4_USE_OPENGL_WIN32@) if(Geant4_vis_opengl_win32_FOUND) find_dependency(OpenGL) if(("vis_opengl_win32" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_vis_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4INTY_USE_WIN32 - -DG4VIS_USE_OPENGLWIN32 - ) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_OPENGLWIN32) set(_geant4_use_opengl_library ON) endif() endif() @@ -569,9 +512,9 @@ if(Geant4_vis_openinventor_FOUND) list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_OI -DG4VIS_USE_OIQT) else() if(WIN32) - list(APPEND Geant4_DEFINITIONS -G4INTY_USE_WIN32 -DG4VIS_USE_OI -DG4VIS_USE_OIWIN32) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_OI -DG4VIS_USE_OIWIN32) else() - list(APPEND Geant4_DEFINITIONS -DG4INTY_USE_XT -DG4VIS_USE_OI -DG4VIS_USE_OIX) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_OI -DG4VIS_USE_OIX) endif() endif() @@ -591,10 +534,7 @@ if(Geant4_vis_toolssg_x11_gles_FOUND) endif() if(("vis_toolssg_x11_gles" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_vis_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4VIS_USE_TOOLSSG_X11_GLES - ) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_TOOLSSG_X11_GLES) set(_geant4_use_toolssg_library ON) endif() endif() @@ -604,10 +544,7 @@ set(Geant4_vis_toolssg_windows_gles_FOUND @GEANT4_USE_TOOLSSG_WINDOWS_GLES@) if(Geant4_vis_toolssg_windows_gles_FOUND) find_dependency(OpenGL) if(("vis_toolssg_windows_gles" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_vis_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4VIS_USE_TOOLSSG_WINDOWS_GLES - ) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_TOOLSSG_WINDOWS_GLES) set(_geant4_use_toolssg_library ON) endif() endif() @@ -624,10 +561,7 @@ if(Geant4_vis_toolssg_xt_gles_FOUND) endif() if(("vis_toolssg_xt_gles" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_vis_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4VIS_USE_TOOLSSG_XT_GLES - ) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_TOOLSSG_XT_GLES) set(_geant4_use_toolssg_library ON) endif() endif() @@ -637,10 +571,7 @@ set(Geant4_vis_toolssg_qt_gles_FOUND @GEANT4_USE_TOOLSSG_QT_GLES@) if(Geant4_vis_toolssg_qt_gles_FOUND) find_dependency(OpenGL) if(("vis_toolssg_qt_gles" IN_LIST Geant4_FIND_COMPONENTS) OR Geant4_vis_all_FOUND) - list(APPEND - Geant4_DEFINITIONS - -DG4VIS_USE_TOOLSSG_QT_GLES - ) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_TOOLSSG_QT_GLES) set(_geant4_use_toolssg_library ON) endif() endif() @@ -648,6 +579,17 @@ endif() # Reset any OpenGL Preference set(OpenGL_GL_PREFERENCE "${OpenGL_GL_PREFERENCE_SAVE}") +set(Geant4_vis_Vtk_FOUND @GEANT4_USE_VTK@) +if(Geant4_vis_Vtk_FOUND) + find_dependency(VTK) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_VTK) + set(_geant4_use_vtk_library ON) + + if(Geant4_qt_FOUND) + list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_VTK_QT) + endif() +endif() + #----------------------------------------------------------------------- # Include the files listing all the imported targets and configuring # Intel/MSVC Compile Features @@ -693,41 +635,37 @@ set(_geant4_internal_libraries Geant4::G4GMocren${_geant4_lib_use_suffix} Geant4::G4visHepRep${_geant4_lib_use_suffix} Geant4::G4RayTracer${_geant4_lib_use_suffix} - Geant4::G4VRML${_geant4_lib_use_suffix} - ) + Geant4::G4VRML${_geant4_lib_use_suffix}) # - G4OpenGL if it's requested. if(_geant4_use_opengl_library) list(APPEND _geant4_internal_libraries Geant4::G4OpenGL${_geant4_lib_use_suffix} - Geant4::G4gl2ps${_geant4_lib_use_suffix} - ) + Geant4::G4gl2ps${_geant4_lib_use_suffix}) list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_OPENGL) endif() # - Qt3D if it's requested. if(_geant4_use_qt3D_library) - list(APPEND _geant4_internal_libraries - Geant4::G4visQt3D${_geant4_lib_use_suffix} - ) + list(APPEND _geant4_internal_libraries Geant4::G4visQt3D${_geant4_lib_use_suffix}) list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_QT3D) endif() # - G4OpenInventor if it's requested. if(_geant4_use_inventor_library) - list(APPEND _geant4_internal_libraries - Geant4::G4OpenInventor${_geant4_lib_use_suffix} - ) + list(APPEND _geant4_internal_libraries Geant4::G4OpenInventor${_geant4_lib_use_suffix}) endif() # - G4ToolsSG if it's requested. if(_geant4_use_toolssg_library) - list(APPEND _geant4_internal_libraries - Geant4::G4ToolsSG${_geant4_lib_use_suffix} - ) + list(APPEND _geant4_internal_libraries Geant4::G4ToolsSG${_geant4_lib_use_suffix}) list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_TOOLSSG) endif() +if(_geant4_use_vtk_library) + list(APPEND _geant4_internal_libraries Geant4::G4visVtk${_geant4_lib_use_suffix}) +endif() + # - G3toG4 if it's requested if(_geant4_use_g3tog4_library) set(_geant4_g3tog4_library Geant4::G3toG4${_geant4_lib_use_suffix}) diff --git a/cmake/Templates/UseGeant4_internal.cmake b/cmake/Templates/UseGeant4_internal.cmake index 471b7ede2b..ac02e5ef0d 100644 --- a/cmake/Templates/UseGeant4_internal.cmake +++ b/cmake/Templates/UseGeant4_internal.cmake @@ -5,88 +5,9 @@ # # IT SHOULD NOT BE INSTALLED! -include(CMakeParseArguments) - #----------------------------------------------------------------------- # Special internal functions for building tests. #----------------------------------------------------------------------- -# function geant4_link_library( source1 source2 ... -# [TYPE STATIC|SHARED] -# LIBRARIES library1 library2 ...) -# -function(geant4_link_library library) - cmake_parse_arguments(ARG "TYPE;LIBRARIES" "" ${ARGN}) - set(sources) - - # - Fill sources - foreach(fp ${ARG_UNPARSED_ARGUMENTS}) - if(IS_ABSOLUTE ${fp}) - file(GLOB files ${fp}) - else() - file(GLOB files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${fp}) - endif() - if(files) - set(sources ${sources} ${files}) - else() - set(sources ${sources} ${fp}) - endif() - endforeach() - - # - Shared library unless specified - if(NOT ARG_TYPE) - set(ARG_TYPE SHARED) - endif() - - # - Make sure we can access our own headers - include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include) - - # - Deal with Win32 DLLs that don't export via declspec - if(WIN32 AND ARG_TYPE STREQUAL SHARED) - # - Dummy archive library - add_library( ${library}-arc STATIC EXCLUDE_FROM_ALL ${sources}) - - # - Use genwindef to create .def file listing symbols - add_custom_command( - OUTPUT ${library}.def - COMMAND ${genwindef_cmd} -o ${library}.def -l ${library} ${LIBRARY_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/${library}-arc.lib - DEPENDS ${library}-arc genwindef) - - #- Dummy cpp file needed to satisfy Visual Studio. - file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/${library}.cpp "// empty file\n" ) - add_library( ${library} SHARED ${library}.cpp ${library}.def) - target_link_libraries(${library} ${library}-arc ${ARG_LIBRARIES}) - set_target_properties(${library} PROPERTIES LINK_INTERFACE_LIBRARIES ${ARG_LIBRARIES} ${Geant4_LIBRARIES}) - else() - add_library( ${library} ${ARG_TYPE} ${sources}) - target_link_libraries(${library} ${ARG_LIBRARIES} ${Geant4_LIBRARIES}) - endif() -endfunction() - -#----------------------------------------------------------------------- -# function geant4_executable( source1 source2 ... -# LIBRARIES library1 library2 ... ) -# -function(geant4_executable executable) - cmake_parse_arguments(ARG "" "" "LIBRARIES" ${ARGN}) - - set(sources) - - foreach(fp ${ARG_UNPARSED_ARGUMENTS}) - file(GLOB files ${fp}) - if(files) - set(sources ${sources} ${files}) - else() - set(sources ${sources} ${fp}) - endif() - endforeach() - - include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include ${GEANT4_INCLUDE_DIR}) - - add_executable(${executable} EXCLUDE_FROM_ALL ${sources}) - target_link_libraries(${executable} ${ARG_LIBRARIES} ${Geant4_LIBRARIES} ) - set_target_properties(${executable} PROPERTIES OUTPUT_NAME ${executable}) -endfunction() - #----------------------------------------------------------------------- # function geant4_add_test( COMMAND cmd [arg1... ] # [PRECMD cmd [arg1...]] [POSTCMD cmd [arg1...]] @@ -117,6 +38,14 @@ function(geant4_add_test test) set(_cfg $/) endif() + # COMMAND AND BUILD: split test + # - In this case, we have to create a -build and a -run test with the latter depending on the former + # NOT COMMAND AND BUILD: pure build + # COMMAND AND NOT BUILD: pure test + if(ARG_COMMAND AND ARG_BUILD) + set(_is_split_test TRUE) + endif() + #- Handle COMMAND argument list(LENGTH ARG_COMMAND _len) if(_len LESS 1) @@ -127,8 +56,13 @@ function(geant4_add_test test) list(GET ARG_COMMAND 0 _prg) list(REMOVE_AT ARG_COMMAND 0) if(NOT IS_ABSOLUTE ${_prg}) - set(_prg ${CMAKE_CURRENT_BINARY_DIR}/${_cfg}${_prg}) + if(TARGET ${_prg}) + set(_prg "$") + else() + set(_prg ${CMAKE_CURRENT_BINARY_DIR}/${_cfg}${_prg}) + endif() elseif(EXISTS ${_prg}) + # Calling a prexisting/system program else() get_filename_component(_path ${_prg} PATH) get_filename_component(_file ${_prg} NAME) @@ -203,21 +137,61 @@ function(geant4_add_test test) set(ARG_PROJECT ${ARG_BUILD}) endif() endif() - add_test(NAME ${test} COMMAND ${CMAKE_CTEST_COMMAND} - --build-and-test ${ARG_SOURCE_DIR} ${ARG_BINARY_DIR} - --build-generator ${CMAKE_GENERATOR} - --build-makeprogram ${CMAKE_MAKE_PROGRAM} - --build-target ${ARG_BUILD} - --build-project ${ARG_PROJECT} - --build-config $ - --build-noclean - --build-options --no-warn-unused-cli -DCMAKE_DISABLE_FIND_PACKAGE_ROOT=$ - --test-command ${_command} ) - set_property(TEST ${test} PROPERTY ENVIRONMENT Geant4_DIR=${CMAKE_BINARY_DIR}) + + set(__build_test_name "${test}") + set(__run_test_name "") + + if(_is_split_test) + set(__build_test_name "${test}-build") + set(__run_test_name "${test}") + endif() + + # Build part of the test + add_test(NAME ${__build_test_name} COMMAND ${CMAKE_CTEST_COMMAND} + --build-and-test ${ARG_SOURCE_DIR} ${ARG_BINARY_DIR} + --build-generator ${CMAKE_GENERATOR} + --build-makeprogram ${CMAKE_MAKE_PROGRAM} + --build-target ${ARG_BUILD} + --build-project ${ARG_PROJECT} + --build-config $ + --build-noclean + --build-options + --no-warn-unused-cli + -DGeant4_DIR=${CMAKE_BINARY_DIR} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_DISABLE_FIND_PACKAGE_ROOT=$ + ) + set_property(TEST ${__build_test_name} PROPERTY ENVIRONMENT Geant4_DIR=${CMAKE_BINARY_DIR}) + + # Build part of the test should have additional regex, and *must* have same labels if(ARG_FAILREGEX) - set_property(TEST ${test} PROPERTY FAIL_REGULAR_EXPRESSION "warning:|(${ARG_FAILREGEX})") + set_property(TEST ${__build_test_name} PROPERTY FAIL_REGULAR_EXPRESSION "warning:|(${ARG_FAILREGEX})") else() - set_property(TEST ${test} PROPERTY FAIL_REGULAR_EXPRESSION "warning:") + set_property(TEST ${__build_test_name} PROPERTY FAIL_REGULAR_EXPRESSION "warning:") + endif() + + if(ARG_LABELS) + set_property(TEST ${__build_test_name} PROPERTY LABELS ${ARG_LABELS}) + else() + set_property(TEST ${__build_test_name} PROPERTY LABELS Nightly) + endif() + + # (Optional) Run part of the test + if(__run_test_name) + add_test(NAME ${__run_test_name} COMMAND ${_command}) + set_property(TEST ${__run_test_name} PROPERTY DEPENDS ${__build_test_name}) + if(ARG_FAILREGEX) + set_property(TEST ${__run_test_name} PROPERTY FAIL_REGULAR_EXPRESSION ${ARG_FAILREGEX}) + endif() + + # If WORKING_DIRECTORY supplied, make sure testdriver is run in + # that directory, otherwise use specific binary dir + if(ARG_WORKING_DIRECTORY) + set_property(TEST ${__run_test_name} PROPERTY WORKING_DIRECTORY "${ARG_WORKING_DIRECTORY}") + else() + set_property(TEST ${__run_test_name} PROPERTY WORKING_DIRECTORY "${ARG_BINARY_DIR}") + endif() endif() else() add_test(NAME ${test} COMMAND ${_command}) @@ -238,7 +212,8 @@ function(geant4_add_test test) endif() if(ARG_DEPENDS) - set_property(TEST ${test} PROPERTY DEPENDS ${ARG_DEPENDS}) + # MUST be append because a split test may set this earlier + set_property(TEST ${test} APPEND PROPERTY DEPENDS ${ARG_DEPENDS}) endif() if(ARG_PASSREGEX) diff --git a/cmake/Templates/geant4-config.in b/cmake/Templates/geant4-config.in index ecf4f8b2d1..58087b8dca 100644 --- a/cmake/Templates/geant4-config.in +++ b/cmake/Templates/geant4-config.in @@ -204,7 +204,7 @@ feature_list="${feature_list} qt[${have_qt}]" if test "x${have_qt}" = "xyes" ; then vis_cflags="${vis_cflags} \ - -DG4INTY_USE_QT -DG4UI_USE_QT -DG4VIS_USE_OPENGLQT @G4_QT_CFLAGS@" + -DG4UI_USE_QT -DG4VIS_USE_OPENGLQT @G4_QT_CFLAGS@" if test "x${qt_version}" \< "5.15.0" ; then vis_libs="-lG4visQt3D ${vis_libs}" @@ -251,7 +251,7 @@ have_openinventor="@G4_BUILTWITH_INVENTOR@" feature_list="${feature_list} openinventor[${have_openinventor}]" if test "x${have_openinventor}" = "xyes" ; then - vis_cflags="${vis_cflags} -DG4INTY_USE_XT -DG4VIS_USE_OI -DG4VIS_USE_OIX" + vis_cflags="${vis_cflags} -DG4VIS_USE_OI -DG4VIS_USE_OIX" vis_libs="-lG4OpenInventor ${vis_libs}" fi @@ -262,10 +262,9 @@ if test "x${geant4_uses_opengl}" = "xyes" ; then vis_libs="-lG4OpenGL -lG4gl2ps ${vis_libs}" fi -# - If we have any X11 based feature, then we need the INTY_XT define and -# *may* need the X11 includes +# - If we have any X11 based feature, then we *may* need the X11 includes if test "x${geant4_uses_x11}" = "xyes" ; then - vis_cflags="-DG4INTY_USE_XT @G4_X11_CFLAGS@ ${vis_cflags}" + vis_cflags="@G4_X11_CFLAGS@ ${vis_cflags}" fi #----------------------------------------------------------------------- diff --git a/cmake/Templates/geant4_validate_sources.cmake.in b/cmake/Templates/geant4_validate_sources.cmake.in index 13a33fa743..bcf62f732a 100644 --- a/cmake/Templates/geant4_validate_sources.cmake.in +++ b/cmake/Templates/geant4_validate_sources.cmake.in @@ -37,7 +37,6 @@ set(GEANT4_FALSEPOSITIVE_SOURCES # internally but validate_sources assumes icc files will be in # include/ # They are covered in sources.cmake though! - G4VRML1SceneHandlerFunc.icc G4VRML2SceneHandlerFunc.icc # - Documentation of processes/hadronic/models/cascade/cascade # lists some sources in comments. These do not correspond to diff --git a/cmake/Templates/geant4make-skeleton.in b/cmake/Templates/geant4make-skeleton.in index e389477c57..4b9de56f47 100644 --- a/cmake/Templates/geant4make-skeleton.in +++ b/cmake/Templates/geant4make-skeleton.in @@ -3,8 +3,8 @@ #----------------------------------------------------------------------- # @GEANT4_TC_SHELL_FAMILY@ environment setup script for Geant4 @Geant4_VERSION@ # -# This script will configure your environment to provide a setup which -# can be used to build user applications using the old Geant4 GNUmakefile +# This script will configure your environment to provide a setup which +# can be used to build user applications using the old Geant4 GNUmakefile # build system, but with a CMake build or install of Geant4. # # This script is autogenerated by CMake DO NOT EDIT @@ -96,14 +96,6 @@ # Only USE options matter for applications. @GEANT4_TC_UNSET_COMMAND@ G4VIS_NONE -# - Network DAWN driver -@GEANT4_TC_UNSET_COMMAND@ G4VIS_BUILD_DAWN_DRIVER -@GEANT4_TC_UNSET_COMMAND@ G4VIS_USE_DAWN - -# - Network VRML driver -@GEANT4_TC_UNSET_COMMAND@ G4VIS_BUILD_VRML_DRIVER -@GEANT4_TC_UNSET_COMMAND@ G4VIS_USE_VRML - # - OpenInventor driver @GEANT4_TC_UNSET_COMMAND@ G4VIS_BUILD_OIWIN32_DRIVER @GEANT4_TC_UNSET_COMMAND@ G4VIS_USE_OIWIN32 @@ -192,6 +184,7 @@ # @GEANT4_TC_G4LIB_USE_GDML@ @GEANT4_TC_GDML_PATH_SETUP@ +@GEANT4_TC_XERCESC_LIB_PATH_SETUP@ #----------------------------------------------------------------------- # G3ToG4 Setup @@ -246,16 +239,6 @@ @GEANT4_TC_G4UI_USE_XM@ @GEANT4_TC_G4VIS_USE_OPENGLXM@ -#----------------------------------------------------------------------- -# Network DAWN driver -# -@GEANT4_TC_G4VIS_USE_DAWN@ - -#----------------------------------------------------------------------- -# Network VRML driver -# -@GEANT4_TC_G4VIS_USE_VRML@ - #----------------------------------------------------------------------- # OpenInventor # @@ -272,7 +255,7 @@ @GEANT4_TC_G4VIS_USE_OPENGLWIN32@ #----------------------------------------------------------------------- -# X11 Raytracer +# X11 Raytracer # @GEANT4_TC_G4VIS_USE_RAYTRACERX@ diff --git a/cmake/Templates/source_package_extras.cmake.in b/cmake/Templates/source_package_extras.cmake.in new file mode 100644 index 0000000000..48573a1e1e --- /dev/null +++ b/cmake/Templates/source_package_extras.cmake.in @@ -0,0 +1,23 @@ +# Only run for source packaging +if(CPACK_SOURCE_INSTALLED_DIRECTORIES) + # Copy any additional files needed in source package that we need to generate + # or otherwise aren't present directly in the source directory. + set(GEANT4_CPACK_SOURCE_EXTRAS "@PROJECT_BINARY_DIR@/_source_extras") + file(INSTALL "${GEANT4_CPACK_SOURCE_EXTRAS}/" DESTINATION "${CMAKE_INSTALL_PREFIX}") + + # Cross-check that we are not packaging up a modified source dir, and + # that there are no additional untracked files since we configured. + include("@PROJECT_SOURCE_DIR@/cmake/Modules/G4GitUtilities.cmake") + geant4_git_find_dirty("@PROJECT_SOURCE_DIR@" _currently_modded _currently_untracked) + + if(_currently_modded) + message(WARNING "Modified files found in source directory: run `git status` for more information on these files.") + endif() + + foreach(_ut ${_currently_untracked}) + list(FIND CPACK_SOURCE_IGNORE_FILES "${_ut}" _is_found) + if(_is_found LESS 0) + message(WARNING "New untracked file found in source tree: '${_ut}'. Re-run cmake before trying to package, or remove the file.") + endif() + endforeach() +endif() \ No newline at end of file diff --git a/config/G4UI_BUILD.gmk b/config/G4UI_BUILD.gmk index af9550b93e..5af86184b7 100644 --- a/config/G4UI_BUILD.gmk +++ b/config/G4UI_BUILD.gmk @@ -11,7 +11,6 @@ ifndef G4UI_NONE # The following sessions are built by default (no environment # variables needed)... -# GAG_SESSION # TERMINAL_SESSION # Special case: if OPENGLXM vis driver requested, G4Xt must be built. diff --git a/config/G4UI_USE.gmk b/config/G4UI_USE.gmk index a001b8e4ad..59332e3d24 100644 --- a/config/G4UI_USE.gmk +++ b/config/G4UI_USE.gmk @@ -26,11 +26,9 @@ endif ifneq ($(G4INCLUDE_EXEC),1) CPPFLAGS += -I$(G4BASE)/interfaces/basic/include CPPFLAGS += -I$(G4BASE)/interfaces/common/include - CPPFLAGS += -I$(G4BASE)/interfaces/GAG/include endif UILIBS += -lG4UIbasic UILIBS += -lG4UIcommon -UILIBS += -lG4UIGAG ifdef G4UI_USE_TERMINAL G4UI_USE = 1 @@ -42,11 +40,6 @@ ifdef G4UI_USE_TCSH CPPFLAGS += -DG4UI_USE_TCSH endif -ifdef G4UI_USE_GAG - G4UI_USE = 1 - CPPFLAGS += -DG4UI_USE_GAG -endif - # Other sessions: environment variables *must* be used to control the build # and the usage, becuase they need external packages or libraries. diff --git a/config/G4VIS_BUILD.gmk b/config/G4VIS_BUILD.gmk index fb22a00cfd..8ebcd03e91 100644 --- a/config/G4VIS_BUILD.gmk +++ b/config/G4VIS_BUILD.gmk @@ -17,10 +17,6 @@ ifndef G4VIS_NONE # G4VIS_BUILD_RAYTRACER_DRIVER # G4VIS_BUILD_VRMLFILE_DRIVER -ifdef G4VIS_BUILD_DAWN_DRIVER - CPPFLAGS += -DG4VIS_BUILD_DAWN_DRIVER -endif - ifdef G4VIS_BUILD_OPENGLXM_DRIVER # OPENGLXM requires OPENGLX... G4VIS_BUILD_OPENGLX_DRIVER = 1 @@ -89,16 +85,8 @@ ifdef G4VIS_BUILD_RAYTRACERX_DRIVER INC_X11 = 1 endif -ifdef G4VIS_BUILD_VRML_DRIVER - CPPFLAGS += -DG4VIS_BUILD_VRML_DRIVER -endif - ifdef G4LIB_BUILD_SHARED # build shared libs MUST resolve external libs at library build time - ifdef G4VIS_BUILD_DAWN_DRIVER - G4VIS_USE_DAWN = 1 - endif - ifdef G4VIS_BUILD_OPENGLX_DRIVER G4VIS_USE_OPENGLX = 1 endif @@ -143,10 +131,6 @@ ifdef G4LIB_BUILD_SHARED G4VIS_USE_RAYTRACERX = 1 endif - ifdef G4VIS_BUILD_VRML_DRIVER - G4VIS_USE_VRML = 1 - endif - include $(G4INSTALL)/config/G4VIS_USE.gmk endif # G4LIB_BUILD_SHARED diff --git a/config/G4VIS_USE.gmk b/config/G4VIS_USE.gmk index 8119408c2f..486eb8a5b8 100644 --- a/config/G4VIS_USE.gmk +++ b/config/G4VIS_USE.gmk @@ -7,7 +7,7 @@ ifndef G4VIS_NONE ifndef G4VIS_USE_INCLUDED G4VIS_USE_INCLUDED = 1 -ifndef VISLIBS +ifndef VISLIBS VISLIBS := endif @@ -41,11 +41,6 @@ ifneq ($(G4INCLUDE_EXEC),1) CPPFLAGS += -I$(G4BASE)/visualization/VRML/include endif -ifdef G4VIS_USE_DAWN - CPPFLAGS += -DG4VIS_USE_DAWN - # CPPFLAGS += -I... and VISLIBS += set above. -endif - ifdef G4VIS_USE_OPENGLX G4VIS_USE_OPENGL = 1 CPPFLAGS += -DG4VIS_USE_OPENGLX diff --git a/config/History b/config/History index a4cc3e3a18..5bc169ad3c 100644 --- a/config/History +++ b/config/History @@ -15,6 +15,21 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +4th November 2021 Gabriele Cosmo (config-V10-07-09) +- Updated default Qt5 include paths for Linux targets. + +9th October 2021 Ben Morgan (config-V10-07-08) +- Remove no longer needed link to libXi +- Check for existence of lib64 directory for Xerces-C +- Add 'c' flag to ar to suppress diagnostics going to stderr + +25th September 2021 Ben Morgan (config-V10-07-07) +- Remove obsolete GAG/Gain config + +26th August 2021 Ben Morgan (config-V10-07-06) +- Remove obsolete network VRML config +- Remove obsolete network FukuiRenderer config + 1st June 2021 Gabriele Cosmo (config-V10-07-05) - Moved default to c++17 Standard. @@ -164,9 +179,9 @@ committal in the CVS repository ! - revert change forcing load of libraries 9th November 2016 Gunter Folger (config-V10-02-06) *tag REJECTED* -- Force loading of symbols for physics_lists/constructor and builders +- Force loading of symbols for physics_lists/constructor and builders libraries in granular mode for static libs - + 17th October 2016 Gabriele Cosmo (config-V10-02-05) - Changed default optimisation settings to -O3 for g++, clang and icc. - Added -fno-trapping-math -ftree-vectorize -fno-math-errno to g++ and @@ -400,9 +415,9 @@ committal in the CVS repository ! for Linux and Mac, through use of G4LIB_BUILD_EXPAT flag. 18th October 2011 Gunter Folger (config-V09-04-16) -- binmake.gmk: add new directories in electromagnetic/dna and +- binmake.gmk: add new directories in electromagnetic/dna and new hadronic/models/quasi_elastic - + 21st september 2011 John Allison (config-V09-04-15) - G4UI_BUILD.gmk: Added G4INTY_BUILD_XT = 1 for G4VIS_BUILD_OPENGLXM_DRIVER and G4VIS_BUILD_OIX_DRIVER. The vis drivers need Xt, so this covers @@ -531,7 +546,7 @@ committal in the CVS repository ! - Simplified QTLIBPATH setup in Linux-g++.gmk. 11th June 2010 Gunter Folger (config-V09-03-05) -- Increased stack size on Windows, in sys/WIN-VC added option /STACK:8368128 +- Increased stack size on Windows, in sys/WIN-VC added option /STACK:8368128 (i.e. 8MB) option to LDFLAGS; needed by some CHIPS-based examples and tests. 7th June 2010 Gabriele Cosmo (config-V09-03-04) @@ -558,7 +573,7 @@ committal in the CVS repository ! 20th January 2010 Gabriele Cosmo (config-V09-03-00) - binmake.gmk: removed extra space characters in definition of TARGOBJEXT, fixing issue with target for main() not being rebuilt according to - dependencies change. Addressing problem report #1098. + dependencies change. Addressing problem report #1098. 25th November 2009 Ben Morgan (config-V09-02-17) - Updated internal scripts for Configure. @@ -667,7 +682,7 @@ committal in the CVS repository ! by F.Jones). 9th December 2008 Guy Barrand (config-V09-01-17) -- G4UI_USE.gmk: corrected G4UI_USE_OSC to use $(shell ...) instead +- G4UI_USE.gmk: corrected G4UI_USE_OSC to use $(shell ...) instead of direct backquoting to solve a tricky env expansion problem, restricted to the Open-Scientist setup. @@ -792,18 +807,18 @@ committal in the CVS repository ! Darwin-g++.gmk. (L.Garnier) 10th October 2007 Gunter Folger (config-V09-00-05) -- Added "incl" (Liege cascade) hadronic model module to binmake.gmk. - - -3th October 2007 Laurent Garnier -- Added setup for Qt in those files : -- config/G4UI_BUILD.gmk -- config/G4UI_USE.gmk -- config/G4VIS_BUILD.gmk -- config/G4VIS_USE.gmk -- config/interactivity.gmk -- config/sys/Darwin-g++.gmk -- config/sys/Linux-g++.gmk +- Added "incl" (Liege cascade) hadronic model module to binmake.gmk. + + +3th October 2007 Laurent Garnier +- Added setup for Qt in those files : +- config/G4UI_BUILD.gmk +- config/G4UI_USE.gmk +- config/G4VIS_BUILD.gmk +- config/G4VIS_USE.gmk +- config/interactivity.gmk +- config/sys/Darwin-g++.gmk +- config/sys/Linux-g++.gmk 16th August 2007 Gabriele Cosmo (config-V09-00-04) - Corrected definition of OUT internal variable to allow for proper @@ -1053,7 +1068,7 @@ committal in the CVS repository ! o Corrected options to build shared libraries (.dyn); use "-dynamic -single_module" to have faster startup when Geant4 is embedded in an external framework. - o Corrected options to retrieve Motif. + o Corrected options to retrieve Motif. 5th April 2004 Gabriele Cosmo (config-V06-01-00) - architecture.gmk: added check for definition of LDFLAGS. @@ -1076,9 +1091,9 @@ committal in the CVS repository ! 9th February 2004 Gunter Folger (config-V06-00-01) - architecture.gmk: - o Protect OGLFLAGS against containing -I/usr/include; this may cause + o Protect OGLFLAGS against containing -I/usr/include; this may cause wrong includes to be picked up. - + 26th January 2004 Guy Barrand (config-V06-00-00) - Darwin-g++.gmk: o Use "g++" as a default compiler (in order to take the MacOSX @@ -1145,8 +1160,8 @@ committal in the CVS repository ! 11th June 2003 Gunter Folger (config-V05-01-03) - G4VIS_BUILD.gmk, G4VIS_USE.gmk, G4UI_BUILD.gmk, G4UI_USE.gmk, and sys/{Linux-g++,SU-CC}.gmk: - When building shared libraries needing external libs like OpenGL..., - add these at shared library building, so these libs know about these + When building shared libraries needing external libs like OpenGL..., + add these at shared library building, so these libs know about these dependency and have this resolved. 6th June 2003 Gabriele Cosmo (config-V05-01-02) @@ -1312,7 +1327,7 @@ committal in the CVS repository ! 19th November 2001 Guy Barrand - analysis.gmk : then remove all system specifc flags, have - only the AIDA ones. Have G4ANALYSIS_USE to drive the insertion of + only the AIDA ones. Have G4ANALYSIS_USE to drive the insertion of CPP and libs in the Geant4 GNUmakefile system. 19th November 2001 John Allison (config-V03-02-11) @@ -1372,7 +1387,7 @@ committal in the CVS repository ! G4UI_USE_TCSH G4UI_USE_TERMINAL In other words, the above environment variables become redundant and are - ignored. + ignored. For backwards compatibility, unless G4UI_NONE is set, the corresponding G4UI_USE C-pre-processor variables are automatically set. Also, the C-pre-processor variables G4UI_BUILD and G4UI_USE are set. @@ -1427,7 +1442,7 @@ committal in the CVS repository ! G4VIS_USE_ASCIITREE G4VIS_USE_GAGTREE In other words, the above environment variables become redundant and are - ignored. + ignored. For backwards compatibility, unless G4VIS_NONE is set, the corresponding G4VIS_USE C-pre-processor variables are automatically set. Also, the C-pre-processor variables G4VIS_BUILD and G4VIS_USE are set. @@ -1510,7 +1525,7 @@ committal in the CVS repository ! 30th May 2001 Gunter Folger - Do changes for persistency from Youhei: common.gmk is now split in three, - one general, and one for specific for transient and persistent each. + one general, and one for specific for transient and persistent each. Dependencies now much better handled in persistency. 2nd May 2001 Gabriele Cosmo (config-V03-01-01) @@ -1520,9 +1535,9 @@ committal in the CVS repository ! - Added G4VIS_BUILD_ASCIITREE_DRIVER and G4VIS_USE_ASCIITREE to G4VIS*gmk. 22nd March 2001 Gunter Folger (config-V03-00-03) -- binmake.gmk, only store in executable PATH to libs from example/test; +- binmake.gmk, only store in executable PATH to libs from example/test; other libs should be taken/found from LD_LIBRARY_PATH -- sys/{Linux-g++,SUN-CC}.gmk: enable storing of PATH to libs in executable +- sys/{Linux-g++,SUN-CC}.gmk: enable storing of PATH to libs in executable 06th March 2001 Gabriele Cosmo (config-V03-00-02) - binmake.gmk: added include path for processes/electromagnetic/integral @@ -1559,9 +1574,9 @@ committal in the CVS repository ! Objectivity schema generation for the persistency module. 4th December 2000 Gunter Folger (config-V02-00-09) -- Disable G4RUNPATHOPTION (internal variable) for all but SUN. This is/will - be used when linking with G4 shared libraries to store the path to these - libraries in the executable. +- Disable G4RUNPATHOPTION (internal variable) for all but SUN. This is/will + be used when linking with G4 shared libraries to store the path to these + libraries in the executable. 1st December 2000 Gabriele Cosmo (config-V02-00-08) - Added G4UI_USE_TCSH and related settings to G4UI_USE.gmk (M.Maire). @@ -1574,7 +1589,7 @@ committal in the CVS repository ! (made) in the source directory. 17th November 2000 Gunter Folger (config-V02-00-06) -- Link with CLHEP using -L/-l instead of absolute filename; this allows +- Link with CLHEP using -L/-l instead of absolute filename; this allows to link with shared lib of Anaphe, or static lib of Geant4. - Added shared-lib settings to sys configurations. @@ -1584,7 +1599,7 @@ committal in the CVS repository ! - Removed makeshlib.sh script, now obsolete. 7th November 2000 Guy Barrand -- analysis.gmk : renamed OpenScientist things to "Lab" ; +- analysis.gmk : renamed OpenScientist things to "Lab" ; Lab is the concrete package where analysis is done. 3rd November 2000 Gunter Folger (config-V02-00-04) @@ -1605,10 +1620,10 @@ committal in the CVS repository ! G4LIB_BUILD_ARCHIVE (still default) note that G4MAKESHLIB set will internally set G4LIB_BUILD_SHARED for backwards compatiblity. -- Introduced new variable (G4LIB_USE_GRANULAR) to force using of granular +- Introduced new variable (G4LIB_USE_GRANULAR) to force using of granular libraries, even when libG4global.a/.so exists. -14th September 2000 Guy Barrand +14th September 2000 Guy Barrand - Introduced changes to handle analysis module. o added analysis.gmk. o sys/Linux-g++.gmk: added macro DLDLIBS for library dynamic loading. @@ -1694,7 +1709,7 @@ committal in the CVS repository ! 7th December 1999 Gabriele Cosmo (config-V00-01-19) - architecture.gmk: minor fix on OSPACELIBS path for Win/NT. -5th December 1999 Youhei Morita (config-V00-01-18) +5th December 1999 Youhei Morita (config-V00-01-18) - architecture.gmk: defined G4OODDLX_FLAGS - common.gmk: use G4OODDLX_FLAGS @@ -1764,7 +1779,7 @@ committal in the CVS repository ! 17th November 1999 Youhei Morita (config-V00-01-09) - moved schema header files to G4INSTALL/schema/include architecture.gmk: introduced G4SCHEMA_INCLUDE and G4TMPSCHEMA_INCLUDE - common.gmk: introduced G4SCHEMA_HEADER_DIR and G4SCHEMA_SRC_DIR + common.gmk: introduced G4SCHEMA_HEADER_DIR and G4SCHEMA_SRC_DIR globlib.gmk: added tmp schema header copying 15th November 1999 Gabriele Cosmo (config-V00-01-08) @@ -1832,7 +1847,7 @@ committal in the CVS repository ! only for HP aCC; now not needed at all). 19th Octobre 1999 Youhei Morita -- common.gmk: Surpress verbose output for G4ODBMS if CPPVERBOSE +- common.gmk: Surpress verbose output for G4ODBMS if CPPVERBOSE is not defined. 7th October 1999 John Allison (config-V00-01-01) @@ -1850,7 +1865,7 @@ committal in the CVS repository ! 27th July 1999 Gonzalo Gracia Abril - Changed OSPACELIBS := '-libpath:c:\dev\ospace\lib std-2.1-vc5.0-mt.lib' to OSPACELIBS := '-libpath:$(OSPACEDIR)\lib std-2.1-vc5.0-mt.lib' - in architecture.gmk for NT + in architecture.gmk for NT 20th July 1999 John Allison (config-V00-01-00) - Added EXTRA_LINK_DEPENDENCIES to binmake.gmk. @@ -1860,7 +1875,7 @@ committal in the CVS repository ! 6th July 1999 Gunter Folger (config-01-00-09) - Adapt architecture.gmk for use of STL with WIN32-VC - Remove NICE from G4SYSTEM name WIN32-VC in architecture, globlib and + Remove NICE from G4SYSTEM name WIN32-VC in architecture, globlib and binmake.gmk 3rd July 1999 John Allison (config-01-00-08a) @@ -1884,7 +1899,7 @@ committal in the CVS repository ! - Removed references to G4Ray in G4VIS_BUILD.gmk and G4VIS_USE.gmk. 9th June 1999 Gunter Folger -- Adapt liblist.c for Windows, all changes contained withing #ifdef WIN32 blocks. +- Adapt liblist.c for Windows, all changes contained withing #ifdef WIN32 blocks. 4th June 1999 John Allison - Corrected USER_DEFINED_LDLIBS action. @@ -1946,7 +1961,7 @@ committal in the CVS repository ! Reorganised OSPACE options by introducing OSPACEINC variable. 10th May 1999 Guy Barrand -- interactivity.gmk ; put OpenGL things after OPACS things to have +- interactivity.gmk ; put OpenGL things after OPACS things to have correct link order. 10th May 1999 John Allison @@ -1994,7 +2009,7 @@ committal in the CVS repository ! o DEC-cxx: -timplicit_local. Get rid of the template repository by generating explicit template instantiations used in the code with internal linkage. - + 13th April 1999 John Allison - In binmake.gmk: - moved libmap target to source/GNUmakefile. - extensive tidying. @@ -2048,7 +2063,7 @@ December 10th, 1998 - J.Allison (config-00-04-07) December 7th, 1998 - S.Tanaka, G.Cosmo (config-00-04-06) - architecture.gmk: fixed setting of VISLIBS. -December 7th, 1998 - S.Tanaka +December 7th, 1998 - S.Tanaka - Update of architecture.gmk and G4VIS_USE.gmk: In SUN-CC, "-L/usr/lib -lsocket -lnsl" is moved from X11LIBS to VISLIBS. @@ -2063,12 +2078,12 @@ December 4th, 1998 - G.Barrand - interactivity.gmk: fixed setup for LOAD_IV. December 3rd, 1998 - S.Tanaka -- Revision to make compilation of DAWN (network) driver +- Revision to make compilation of DAWN (network) driver at Solaris and IRIX automatic. See below. - Added the following line to SUN-CC and SGI-CC CPPFLAGS += -DSOCKET_IRIX_SOLARIS - Added -L/usr/lib -lsocket -lnsl in X11LIBS for SUN-CC. - (This place is strange. But I cannot think of a better place.) + (This place is strange. But I cannot think of a better place.) December 3rd, 1998 - J.Allison (config-00-04-04) - Set G4STREAM for all platforms. @@ -2198,7 +2213,7 @@ July 10th, 1998 - Youhei Morita (config-00-01-09) - binmake.gmk moved persistency include path to ifdef G4ODBMS block July 10th, 1998 - John Allison?? -- binmake.gmk added geometry/solids/STEPinterface/include +- binmake.gmk added geometry/solids/STEPinterface/include July 10th, 1998 - Youehi Morita (config-00-01-08) - globlib.gmk added new targets 'headers' and 'd_files' for G4ODBMS @@ -2239,6 +2254,6 @@ July 6th, 1998 - G.Cosmo (config-00-01-02) rule to build global library, does not depend anymore on "libs". (by J.Allison) - Moved G4VIS_USE.gmk and G4VIS_BUILD.gmk from source/visualization. - + July 3rd, 1998 - G.Cosmo (config-00-01-01) - Created diff --git a/config/architecture.gmk b/config/architecture.gmk index 6aa0f4ba35..0a932e8c7c 100644 --- a/config/architecture.gmk +++ b/config/architecture.gmk @@ -417,7 +417,7 @@ ifdef G4LIB_USE_GDML ifneq (,$(findstring WIN32-VC,$(G4SYSTEM))) GDMLLIBS := $(LIB_PATH)$(XERCESCROOT)/lib xerces-c.lib else - GDMLLIBS := -L$(XERCESCROOT)/lib -lxerces-c + GDMLLIBS := -L$(XERCESCROOT)/$(shell [ -d $(XERCESCROOT)/lib64 ] && echo "lib64" || echo "lib") -lxerces-c endif endif CPPFLAGS += $(GDMLFLAGS) @@ -432,7 +432,7 @@ G4TREP := $(G4TMP)/$(G4TEMPLATE_REPOSITORY) # Default archive call. Changed for: SUN-CC. # -AR := ar r +AR := ar rc # Default echo used with makedepend. Changed for SUN-CC, Linux-g++, WIN32. # diff --git a/config/common.gmk b/config/common.gmk index ca9d879a40..ed996ce7de 100644 --- a/config/common.gmk +++ b/config/common.gmk @@ -10,7 +10,12 @@ ifndef G4LIBDIR endif G4TMPDIR := $(G4TMP)/$(G4SYSTEM)/$(name) -sources := $(wildcard src/*.cc) +# A module may have specified its sources already, so only +# wildcard if the variable is empty +# (Temporary feature to support toolkit builds until final retirement) +ifeq ($(sources),) + sources ?= $(wildcard src/*.cc) +endif dependencies := $(patsubst src/%.cc,$(G4TMPDIR)/%.d,$(sources)) objects := $(patsubst src/%.cc,$(G4TMPDIR)/%.o,$(sources)) diff --git a/config/sys/Darwin-clang.gmk b/config/sys/Darwin-clang.gmk index dcc66f956a..419c65e502 100644 --- a/config/sys/Darwin-clang.gmk +++ b/config/sys/Darwin-clang.gmk @@ -50,7 +50,7 @@ ifeq ($(G4SYSTEM),Darwin-clang) X11FLAGS := -I/usr/X11/include endif ifndef X11LIBS - X11LIBS := -L/usr/X11/lib -lXmu -lXt -lXext -lX11 -lXi -lSM -lICE + X11LIBS := -L/usr/X11/lib -lXmu -lXt -lXext -lX11 -lSM -lICE endif ifndef XMFLAGS XMFLAGS := -I/usr/local/include diff --git a/config/sys/Darwin-g++.gmk b/config/sys/Darwin-g++.gmk index b682cd401e..155ec3bf9c 100644 --- a/config/sys/Darwin-g++.gmk +++ b/config/sys/Darwin-g++.gmk @@ -56,7 +56,7 @@ ifeq ($(G4SYSTEM),Darwin-g++) X11FLAGS := -I/usr/X11/include endif ifndef X11LIBS - X11LIBS := -L/usr/X11/lib -lXmu -lXt -lXext -lX11 -lXi -lSM -lICE + X11LIBS := -L/usr/X11/lib -lXmu -lXt -lXext -lX11 -lSM -lICE endif ifndef XMFLAGS XMFLAGS := -I/usr/local/include diff --git a/config/sys/Linux-clang.gmk b/config/sys/Linux-clang.gmk index 33f985649d..c4ff1022c5 100644 --- a/config/sys/Linux-clang.gmk +++ b/config/sys/Linux-clang.gmk @@ -57,7 +57,7 @@ ifeq ($(G4SYSTEM),Linux-clang) X11FLAGS := -I/usr/include/X11/extensions -I/usr/include/X11 endif ifndef X11LIBS - X11LIBS := -L/usr/lib$(ARCH) -lXmu -lXt -lXext -lX11 -lXi -lSM -lICE + X11LIBS := -L/usr/lib$(ARCH) -lXmu -lXt -lXext -lX11 -lSM -lICE endif ifndef XMFLAGS XMFLAGS := -I/usr/include @@ -98,14 +98,14 @@ ifeq ($(G4SYSTEM),Linux-clang) ifeq ($(QT_VERSION),5) ifndef QTFLAGS # Qt5 QTFLAGS := -I $(QTHOME)/include -I$(QTHOME)/include/Qt - QTFLAGS += -I $(QTHOME)/include/qt5/QtCore - QTFLAGS += -I $(QTHOME)/include/qt5/QtGui - QTFLAGS += -I $(QTHOME)/include/qt5/QtWidgets - QTFLAGS += -I $(QTHOME)/include/qt5/QtOpenGL - QTFLAGS += -I $(QTHOME)/include/qt5/Qt3DCore - QTFLAGS += -I $(QTHOME)/include/qt5/Qt3DExtras - QTFLAGS += -I $(QTHOME)/include/qt5/Qt3DRender - QTFLAGS += -I $(QTHOME)/include/qt5/QtPrintSupport + QTFLAGS += -I $(QTHOME)/include/QtCore + QTFLAGS += -I $(QTHOME)/include/QtGui + QTFLAGS += -I $(QTHOME)/include/QtWidgets + QTFLAGS += -I $(QTHOME)/include/QtOpenGL + QTFLAGS += -I $(QTHOME)/include/Qt3DCore + QTFLAGS += -I $(QTHOME)/include/Qt3DExtras + QTFLAGS += -I $(QTHOME)/include/Qt3DRender + QTFLAGS += -I $(QTHOME)/include/QtPrintSupport endif else # Qt4 ifndef QTFLAGS diff --git a/config/sys/Linux-g++.gmk b/config/sys/Linux-g++.gmk index 49b4d70e6a..47f6171273 100644 --- a/config/sys/Linux-g++.gmk +++ b/config/sys/Linux-g++.gmk @@ -55,7 +55,7 @@ ifeq ($(G4SYSTEM),Linux-g++) X11FLAGS := -I/usr/include/X11/extensions -I/usr/include/X11 endif ifndef X11LIBS - X11LIBS := -L/usr/lib$(ARCH) -lXmu -lXt -lXext -lX11 -lXi -lSM -lICE + X11LIBS := -L/usr/lib$(ARCH) -lXmu -lXt -lXext -lX11 -lSM -lICE endif ifndef XMFLAGS XMFLAGS := -I/usr/include @@ -96,14 +96,14 @@ ifeq ($(G4SYSTEM),Linux-g++) ifeq ($(QT_VERSION),5) ifndef QTFLAGS # Qt5 QTFLAGS := -I $(QTHOME)/include -I$(QTHOME)/include/Qt - QTFLAGS += -I $(QTHOME)/include/qt5/QtCore - QTFLAGS += -I $(QTHOME)/include/qt5/QtGui - QTFLAGS += -I $(QTHOME)/include/qt5/QtWidgets - QTFLAGS += -I $(QTHOME)/include/qt5/QtOpenGL - QTFLAGS += -I $(QTHOME)/include/qt5/Qt3DCore - QTFLAGS += -I $(QTHOME)/include/qt5/Qt3DExtras - QTFLAGS += -I $(QTHOME)/include/qt5/Qt3DRender - QTFLAGS += -I $(QTHOME)/include/qt5/QtPrintSupport + QTFLAGS += -I $(QTHOME)/include/QtCore + QTFLAGS += -I $(QTHOME)/include/QtGui + QTFLAGS += -I $(QTHOME)/include/QtWidgets + QTFLAGS += -I $(QTHOME)/include/QtOpenGL + QTFLAGS += -I $(QTHOME)/include/Qt3DCore + QTFLAGS += -I $(QTHOME)/include/Qt3DExtras + QTFLAGS += -I $(QTHOME)/include/Qt3DRender + QTFLAGS += -I $(QTHOME)/include/QtPrintSupport endif else # Qt4 ifndef QTFLAGS diff --git a/config/sys/Linux-icc.gmk b/config/sys/Linux-icc.gmk index 971e467180..b27657ccc0 100644 --- a/config/sys/Linux-icc.gmk +++ b/config/sys/Linux-icc.gmk @@ -45,7 +45,7 @@ ifeq ($(G4SYSTEM),Linux-icc) X11FLAGS := -I/usr/include/X11/extensions -I/usr/include/X11 endif ifndef X11LIBS - X11LIBS := -L/usr/lib -lXmu -lXt -lXext -lX11 -lXi -lSM -lICE + X11LIBS := -L/usr/lib -lXmu -lXt -lXext -lX11 -lSM -lICE endif ifndef XMFLAGS XMFLAGS := -I/usr/include @@ -86,14 +86,14 @@ ifeq ($(G4SYSTEM),Linux-icc) ifeq ($(QT_VERSION),5) ifndef QTFLAGS # Qt5 QTFLAGS := -I $(QTHOME)/include -I$(QTHOME)/include/Qt - QTFLAGS += -I $(QTHOME)/include/qt5/QtCore - QTFLAGS += -I $(QTHOME)/include/qt5/QtGui - QTFLAGS += -I $(QTHOME)/include/qt5/QtWidgets - QTFLAGS += -I $(QTHOME)/include/qt5/QtOpenGL - QTFLAGS += -I $(QTHOME)/include/qt5/Qt3DCore - QTFLAGS += -I $(QTHOME)/include/qt5/Qt3DExtras - QTFLAGS += -I $(QTHOME)/include/qt5/Qt3DRender - QTFLAGS += -I $(QTHOME)/include/qt5/QtPrintSupport + QTFLAGS += -I $(QTHOME)/include/QtCore + QTFLAGS += -I $(QTHOME)/include/QtGui + QTFLAGS += -I $(QTHOME)/include/QtWidgets + QTFLAGS += -I $(QTHOME)/include/QtOpenGL + QTFLAGS += -I $(QTHOME)/include/Qt3DCore + QTFLAGS += -I $(QTHOME)/include/Qt3DExtras + QTFLAGS += -I $(QTHOME)/include/Qt3DRender + QTFLAGS += -I $(QTHOME)/include/QtPrintSupport endif else # Qt4 ifndef QTFLAGS diff --git a/config/sys/WIN32-g++.gmk b/config/sys/WIN32-g++.gmk index d29634913f..16d38f952d 100644 --- a/config/sys/WIN32-g++.gmk +++ b/config/sys/WIN32-g++.gmk @@ -55,7 +55,7 @@ ifeq ($(G4SYSTEM),WIN32-g++) X11FLAGS := -I/usr/include/X11/extensions -I/usr/include/X11 endif ifndef X11LIBS - X11LIBS := -L/usr/X11R6/lib -lXmu -lXt -lXext -lX11 -lXi -lSM -lICE + X11LIBS := -L/usr/X11R6/lib -lXmu -lXt -lXext -lX11 -lSM -lICE endif ifndef XMFLAGS XMFLAGS := -I/usr/X11R6/include diff --git a/environments/History b/environments/History index 54fd2b3e13..41d8a352fd 100644 --- a/environments/History +++ b/environments/History @@ -17,6 +17,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +envs-V10-07-00/ Sep. 25, 2020 B.Morgan +- Remove MOMO + envs-V10-05-00/ Dec. 1, 2019 K.Murakami - g4py, updated for 10.6 release - g4pym boost_python library name can be specified in cmake (BZ-2059) diff --git a/environments/MOMO/000README b/environments/MOMO/000README deleted file mode 100644 index f2e3950cab..0000000000 --- a/environments/MOMO/000README +++ /dev/null @@ -1,22 +0,0 @@ -How to use momo-src.jar - -momo-src.jar is the Java archive file which contains all Java source files and -relevant data files, as well as a Geant4.9.4 example in ./MomoHome directory. - -If you use MOMO.jar to run MOMO, momo-src.jar isn't necessary. -When you have new JDK or other JDK like OpenJDK etc, momo-src.jar can be used -to create your own MOMO.jar. - -The required tools are -1) JDK-1.6 or later (OpenJDK isn't tested fully) -2) Apache ant (1.7 or later) - -To compile, - - -1) copy momo-src.jar to any clean directory and change directory to there -2) jar fvx momo-src.jar and you have the full codes and data. -3) ant (build.xml is use by default) and you have MOMO.jar the executable MOMO jar file -4) java -jar ./MOMO.jar - -you may have a warning on the unsecure use of the HashTable but you can neglect it. diff --git a/environments/MOMO/History b/environments/MOMO/History deleted file mode 100644 index 2a98ae7587..0000000000 --- a/environments/MOMO/History +++ /dev/null @@ -1,66 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - MOMO History file - ----------------- - -This file should be used by G4 developers and category coordinators -to briefly summarize all major modifications introduced in the code -at this level and keep track of all relavant tags. -It DOES NOT substitute the CVS log-message one should put at every -committal in the CVS repository ! - - ---------------------------------------------------------- - * Reverse chronological order (last date on top), please * - ---------------------------------------------------------- - -2013 November Hajime Yoshida - - MOMO.jar updated (GPE disactivated, EnvPanel update) - - momo-src.jar updated - - On-line Help document updated - -2010 December 1 Koichi Murakami - - MOMO.jar updated (use QGSP_BERT physics list instead of GPE) - - JAVA source codes are included. (momo-src.jar) - - MomoHome and docs directories are migrated to momo-src.jar - -2010 June 4 Koichi Murakami - - revise archaic trajectory drawing (vis.mac and EventAction in MomoHome) - -2004 November 26 Hajime Yoshida - - replaced MOMO.jar with minor changes - - added some example files and README - -2004 November 25 hajime Yoshida - - replaced MOMO.jar, a new one integratig GAG and Gain. - - removed GAG.jar and gain.jar - - updated docs - - deleted old files - -2004 January 05 Hajime Yoshida - - replaced MOMO.jar with the debugged one - (MOMO.jar of 2003 December 8 had a bug in GPE) - -2003 December 8 Hajime Yoshida - - replaced MOMO.jar with a new version which has XML capability. - - removed GGE.jar and GPE.jar which are included in MOMO.jar - - added new XML data files; PDG.xml and dicom.xml - - replaced materialDB.g4mt with a new example.g4dt - - added ReleaseNote - -2003 December 4 Hajime Yoshida - -replaced GAG.jar with a revised one - -MOMO-V05-02-00 4th November Gabriele Cosmo -- Created. - Versions included: - o GAG 1.4.1 for JDK-1.3 - o GGE 1.3.2 for JDK-1.3 - o GPE 1.3.1 for JDK-1.3 - o Gain (GainDL) for J2SDK-1.4 - o MOMO for J2DK-1.4 -- Original web site: - http://erpc1.naruto-u.ac.jp/~geant4 diff --git a/environments/MOMO/MOMO.jar b/environments/MOMO/MOMO.jar deleted file mode 100644 index c923c7766fb33737c8af3ec5d23619878ff2cf12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 562892 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 z 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

Z8z(Y!N# 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 S1TqEw1OO`$qdU-BK>rWNtzqy0 diff --git a/environments/MOMO/PDG.xml b/environments/MOMO/PDG.xml deleted file mode 100644 index 12a09fd8d7..0000000000 --- a/environments/MOMO/PDG.xml +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - - - -

- - - - - - - -

- - - - - - - -

- - - - - - -

- - - - - - - - -

- - - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - - -

- - - - - - -

- - - - - - -

- - - - - - -

- - - - - - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - diff --git a/environments/MOMO/ReleaseNote b/environments/MOMO/ReleaseNote deleted file mode 100644 index 5e146489dc..0000000000 --- a/environments/MOMO/ReleaseNote +++ /dev/null @@ -1,57 +0,0 @@ -2004 November 25 - -CHANGES** for Geant4.7 release - - - Integration of GAG and Gain into MOMO - - GAG.jar and Gain.jar are no more required and removed from the distribution. - - GAG and Gain have their own logging window which displays G4cout - - Improvements of GGE - - material names are choosable from the name list defined in the material table - - color names are choosable from the name list defined in the color table - - logican volume's name is choosable from the name list to make physical volume - - "set G4WORKDIR" butto helps to choose files or to save files (GGE, GPE, GAG) - -EXAMPLE** - - A working full set of files are foud in MomoHome. Please have a look at - MomoHome/README file. - -NOTICE 1 ** on Java Version! - - The present version of MOMO is tested with j2sdk1.4. Some mal-functionning -was found when used with j2sdk-1.5. - -ABOUT ** Help function ! - - "Help" is displayed only when the env variable G4INSTALL is set. -it is stored. - -NOTICE 2 ** on "Project" menus - -"Compile" buttin is effective only when java is started in the canonical -directory of Geant4, that is just above the src and include directories. - -An example is found in ./MomoHome. - -------------------------------------------------------------------------- -2003 December 08 - - present MOMO's XML functions (save and load) are limited. - -only available GDML tags are implemented. Not implemented are - - CSG Torus, Hype - - BREPs Polygon, Polycone - - no vis attributes - - no physical volumes - - - when you want to save unimplemented elements, MOMO warns. - You can continue to save the file, but the output - may not be well-formed. You can chech it by - reading the file with the Web browser. - - - Non-compatiblity of Java's serialization. - You can save or load in the Java serialized format, without - loosing any element created in MOMO. But The present - version MOMO doesn't guarantee the persistency between - different version of Java nor different version of MOMO. - - - GGE and GPE have been integrated in MOMO and are no more improved. - Please use MOMO instead. diff --git a/environments/MOMO/dicom.xml b/environments/MOMO/dicom.xml deleted file mode 100644 index 93d0542dba..0000000000 --- a/environments/MOMO/dicom.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - -

- - - - - - - - - - - - - -

- - - - - - - - - - - - - -

- - - - - - -

- - - - - - - - - - - - -

- - - - - - - - - - - -

- - - - - - - - - - - - - -

- - - - - - - - - - - - - -

    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

    C`_N>?HrOS#$?_?Z4$cEx9 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 diff --git a/environments/g4py/CMakeLists.txt b/environments/g4py/CMakeLists.txt index d4de53a8c1..715a437050 100644 --- a/environments/g4py/CMakeLists.txt +++ b/environments/g4py/CMakeLists.txt @@ -8,7 +8,7 @@ # which Python an install of Boost Python uses)... find_package(PythonInterp 3.0 REQUIRED) find_package(PythonLibs REQUIRED) -find_package(Boost 1.65 REQUIRED python) +find_package(Boost 1.65 REQUIRED python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}) # Variables and Functions to help build, organise, and install modules include(${CMAKE_CURRENT_SOURCE_DIR}/G4PythonHelpers.cmake) diff --git a/environments/g4py/G4PythonHelpers.cmake b/environments/g4py/G4PythonHelpers.cmake index e1d2048f59..648ece11c6 100644 --- a/environments/g4py/G4PythonHelpers.cmake +++ b/environments/g4py/G4PythonHelpers.cmake @@ -40,7 +40,7 @@ function(g4py_add_module target_name) # Use dynamic_lookup on Darwin to avoid direct linking to libpython (Linux has this as default, # to be checked for Windows) target_include_directories(${target_name} PRIVATE ${PYTHON_INCLUDE_DIRS}) - target_link_libraries(${target_name} PRIVATE Boost::python "$<$:-undefined dynamic_lookup>") + target_link_libraries(${target_name} PRIVATE Boost::python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR} "$<$:-undefined dynamic_lookup>") # Workaround to suppress pragma message spam in Boost >= 1.73 # - See https://github.com/boostorg/python/pull/315 diff --git a/environments/g4py/History b/environments/g4py/History index bce654ccdb..6b02f438fa 100644 --- a/environments/g4py/History +++ b/environments/g4py/History @@ -11,6 +11,23 @@ Geant4Py is a Geant4-Python bridge. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +2 Nov. 2021 B.Morgan (geant4py-V10-07-05) +- Apply GitHub PR #31 from andriish +- Use exact version of python for boost.python module + +31 Aug. 2021 B.Morgan (geant4py-V10-07-04) +- Remove binding to obsolete member functions of G4Sphere and G4Tubs + - Either no longer used or cause issues when using Vecgeom + +27 August 2021 Ben Morgan (geant4py-V10-07-03) +- Remove obsolete HepRep(WIRED) driver + +26 Aug. 2021 B. Morgan (geant4py-V10-07-02) +- Remove obsolete VRML1 driver + +17 Aug. 2021 J. Hahnfeld (geant4py-V10-07-01) +- Export binding for G4ElementVector, now that it's different from G4ElementTable + 12 Nov. 2021 V. Ivanchenko (geant4py-V10-07-00) - TestEm0 - use default Geant4 EM physics, do not use obsolete class G4EmProcessOptions diff --git a/environments/g4py/README.md b/environments/g4py/README.md deleted file mode 100644 index 76ec00d0c3..0000000000 --- a/environments/g4py/README.md +++ /dev/null @@ -1,78 +0,0 @@ -Geant4Py -======== - -_A set of python modules for using Geant4_ - - -System Requirements -------------------- - -### CMake -Building system is migrated to CMake system. - -### Python - -Python2.x and Python 3.x (experimental) - -### Boost - -Boost_Python is needed. - -### (Optional) - -ROOT for histogramming/analysis - -### Tested Platforms - -* CentOS7 (Python2) -* Ubuntu 18.04 LTS (Python3) - -How to Install --------------- -Before building library, *GEANT4_INSTALL* environment variable should be set. - - # export GEANT4_INSTALL= (zsh, bash) - # setenv GEANT4_INSTALL (csh) - (G4 install path is the path specified by "CMAKE_INSTALL_PREFIX" when building Geant4) - -then - - # mkdir build - # cd build - # cmake .. - # make - # make install - -By default, g4py is installed in \/lib(64) directory. - -Before doing tests with CTest, you have to set environment variables -for Geant4 data. - - # make - # make install - # ctest - -performs automatic unit/integration tests with CTest. - -How to Use: ------------ -Some environment variables are required at run time. - -### *PYTHONPATH* - -Python module search directories, given by a colon-separated list of directories, like - - - # export PYTHONPATH=/lib64:/lib64/examples:/lib64/tests (zsh, bash) - # setenv PYTHONPATH /lib64:/lib64/examples:/lib64/tests (csh) - -### *LD_LIBRARY_PATH* - -You might need define LD_LIBRARY_PATH for Geant4 libraries. - # export LD_LIBRARY_PATH=/lib (zsh, bash) - # setenv LD_LIBRARY_PATH=/lib (csh) - -### Getting started -You can import Geant4Py modules in Python just like - - >>> import Geant4 diff --git a/environments/g4py/examples/README b/environments/g4py/examples/README deleted file mode 100644 index c445d98866..0000000000 --- a/environments/g4py/examples/README +++ /dev/null @@ -1,33 +0,0 @@ -------------------------------------------------------------------- - -This directory contains a set of examples for 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 - - -[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 - diff --git a/environments/g4py/examples/education/lesson1/README b/environments/g4py/examples/education/lesson1/README deleted file mode 100644 index 3d8a1fb187..0000000000 --- a/environments/g4py/examples/education/lesson1/README +++ /dev/null @@ -1,54 +0,0 @@ -Hajime Yoshida - -******* README of lesson1 ****** - -26 September 2006 - - Lesson1.py as before - - Lesson1withN03.py - - physics is list is taken from examples/novice/N03 - - process on/off - - Leson1Wx.py - - same as Lesson1withN03 but - - New GUI toolkit is used and the default Python isn't enough - - wxPython is necessary - - -26 May 2006 Geant4.8.1 - - - -The first version of the courseware of the mass attenuation coefficient - - - Lesson1.py - select absorber material - set its thickness upto 500 mm - select beam particle - set its energy upto 100 MeV - set nu of events up to 100 - run - - and then - zoom in (x1.1) or zoom out (x0.9) - pan in up/down and/or right/left in the unit of mm (type in two - numbers separated by a space) - - execute any G4 command but /gun/particle or /gun/energy which are - defined by the above - - -oglx.mac - OGLSX => important to make zooming effective after showing trajectories. - - if you want to use VRML, you have to specify the directory where *.wrl - file is stored and the VRML viewer to which the path is set: - G4VRMLFILE_DEST_DIR=/home/yoshidah/tmp/ - G4VRMLFILE_VIEWER=vrmlview - - And you have VRML drivers built. - G4VIS_BUILD_VRML_DRIVER=1 - G4VIS_USE_VRMLFILE=1 - G4VIS_BUILD_VRMLFILE_DRIVER=1 - G4VIS_USE_VRML=1 - - - -gun.mac - This is used only at the initialization time. \ No newline at end of file diff --git a/environments/g4py/examples/education/lesson2/README b/environments/g4py/examples/education/lesson2/README deleted file mode 100644 index 7bc5adc31a..0000000000 --- a/environments/g4py/examples/education/lesson2/README +++ /dev/null @@ -1,82 +0,0 @@ -26 Sep 2006 - - added Lesson2Wx.py - New version using wxPython - functionas are identical with ExN03.py - -26 May 2006 -revised 02 July 2006 -Geant4.8.1 release -=============================================== -Prerequisites for G4 environment variables. -============================================== - -This scripts offers the choice of visualization systems; -one among OGLSX (OpenGL stored mode), or VRML2FILE or Wired3. - -OGLSX is the default viewer and you need no environment variables. - -To use VRML2FILE you have to specify its viewer which is found in your -search path and the destination directory where *.wrl file is stored. -If you don't specify the name of the viewer, you can't choose it on the panel. -For example, - setenv G4VRMLFILE_VIEWER $HOME/bin/vrmlview - setenv G4VRMLFILE_DEST_DIR $HOME/tmp/ <= terminate with / - -To use Wired, download it and install under your directory. Java Runtime -Environment is necessary. -Then set, for example; - setenv G4HEPREPFILE_VIEWER $HOME/Wired/bin/wired <= any path you use - setenv G4HEPREPFILE_DIR $HOME/tmp/ - setenv G4HEPREPFILE_NAME lesson2_00 <= any name you choose. - setenv G4HEPREPFILE_OVERWRITE 1 <= to reuse the file for "next event" -G4HEPREPFILE_VIEWER isn't an official Geant4 environment variable but is employed -here to control the vissssualization viewers. -The name of the HepRepFile is ${G4HEPREPFILE_NAME}.heprep which will be -stored in ${G4HEPREPFILE_DIR}. - -ExN03.py script don't use VRML or Wired if their *_VIEWER isn't set. -But other env variables are also used in the script to look for the -file and to activate the viewer, you have to set all of the above variables -in the shell where you activate ExN03.py script. - - -NOTICE) VRML viewer blocks the window (modal), so that you have to exit it to -display another run. - -********* ExN03.py script *********** - -This example id derived from examples/novice/N03. -You can - - choose the materials of absorber and gap - - set the thickness of the absorber and gap - - set the lateral (in YZ plane) size of the sandwitch cal. - - choose an incedent particle - - set its energy - - set the number of events to run - - toggle on/off of the electromagnetic processes - - set cut length - - set magnetic field - - typein any Geant4 command (except related with the above functions) and execute it - -How to run it? - %python ExN03.py - -You can visualize with OpenGL stored mode or VRML or Wired3 -You can choose either of the active viewers by pushing the -radio buttons. -========================= -NOTICE) - -VRML viewer runs in the modal action, and you have to exit it -to have a new diaplay for the new run, or you want to switch to -another viewer. - -Wired has the "next"/"previous" event button. So to see the next -event, first run and then "next" event. Wired doesn't block G4 -and you can have Wired and OGLSX both open. - - - -ExN03-Wired.py is OBSOLETE. Please use ExN03.py - - diff --git a/environments/g4py/source/__init__.py b/environments/g4py/source/__init__.py index 2cc672c8c0..94dbe0e40e 100644 --- a/environments/g4py/source/__init__.py +++ b/environments/g4py/source/__init__.py @@ -121,10 +121,8 @@ if G4VisManager.GetConcreteInstance() == None: if _q_raytracer_x: _raytracer_x = G4RayTracerX() - _vrml1 = G4VRML1File() _vrml2 = G4VRML2File() _dawn = G4DAWNFILE() - _heprep_xml = G4HepRep() _heprep_file = G4HepRepFile() _atree = G4ASCIITree() _raytracer = G4RayTracer() @@ -140,10 +138,8 @@ if G4VisManager.GetConcreteInstance() == None: if _q_raytracer_x: gVisManager.RegisterGraphicsSystem(_raytracer_x) - gVisManager.RegisterGraphicsSystem(_vrml1) gVisManager.RegisterGraphicsSystem(_vrml2) gVisManager.RegisterGraphicsSystem(_dawn) - gVisManager.RegisterGraphicsSystem(_heprep_xml) gVisManager.RegisterGraphicsSystem(_heprep_file) gVisManager.RegisterGraphicsSystem(_atree) gVisManager.RegisterGraphicsSystem(_raytracer) diff --git a/environments/g4py/source/geometry/pyG4Sphere.cc b/environments/g4py/source/geometry/pyG4Sphere.cc index 1e1b5fa2f3..6537590fd7 100644 --- a/environments/g4py/source/geometry/pyG4Sphere.cc +++ b/environments/g4py/source/geometry/pyG4Sphere.cc @@ -38,7 +38,7 @@ using namespace boost::python; // ==================================================================== namespace pyG4Sphere { -G4Sphere* CreateSphere(const G4String& name, +G4Sphere* CreateSphere(const G4String& name, G4double pRmin, G4double pRmax, G4double pSPhi, G4double pDPhi, G4double pSTheta, G4double pDTheta) @@ -61,13 +61,11 @@ void export_G4Sphere() .def(init()) // --- - .def("GetInsideRadius", &G4Sphere::GetInsideRadius) .def("GetOuterRadius", &G4Sphere::GetOuterRadius) .def("GetStartPhiAngle", &G4Sphere::GetStartPhiAngle) .def("GetDeltaPhiAngle", &G4Sphere::GetDeltaPhiAngle) .def("GetStartThetaAngle", &G4Sphere::GetStartThetaAngle) .def("GetDeltaThetaAngle", &G4Sphere::GetDeltaThetaAngle) - .def("SetInsideRadius", &G4Sphere::SetInsideRadius) .def("SetOuterRadius", &G4Sphere::SetOuterRadius) .def("SetStartPhiAngle", &G4Sphere::SetStartPhiAngle) .def("SetDeltaPhiAngle", &G4Sphere::SetDeltaPhiAngle) diff --git a/environments/g4py/source/geometry/pyG4Tubs.cc b/environments/g4py/source/geometry/pyG4Tubs.cc index 5dd2741670..c4edc7c2e1 100644 --- a/environments/g4py/source/geometry/pyG4Tubs.cc +++ b/environments/g4py/source/geometry/pyG4Tubs.cc @@ -69,11 +69,6 @@ void export_G4Tubs() .def("SetZHalfLength", &G4Tubs::SetZHalfLength) .def("SetStartPhiAngle", &G4Tubs::SetStartPhiAngle) .def("SetDeltaPhiAngle", &G4Tubs::SetDeltaPhiAngle) - .def("GetRMin", &G4Tubs::GetRMin) - .def("GetRMax", &G4Tubs::GetRMax) - .def("GetDz", &G4Tubs::GetDz) - .def("GetSPhi", &G4Tubs::GetSPhi) - .def("GetDPhi", &G4Tubs::GetDPhi) // operators .def(self_ns::str(self)) ; diff --git a/environments/g4py/source/materials/pyG4ElementVector.cc b/environments/g4py/source/materials/pyG4ElementVector.cc index d2d935cd56..a49f5b5a2b 100644 --- a/environments/g4py/source/materials/pyG4ElementVector.cc +++ b/environments/g4py/source/materials/pyG4ElementVector.cc @@ -30,6 +30,7 @@ // ==================================================================== #include #include +#include "G4Element.hh" #include "G4ElementVector.hh" using namespace boost::python; diff --git a/environments/g4py/source/materials/pymodG4materials.cc b/environments/g4py/source/materials/pymodG4materials.cc index 391378a955..0990224deb 100644 --- a/environments/g4py/source/materials/pymodG4materials.cc +++ b/environments/g4py/source/materials/pymodG4materials.cc @@ -39,7 +39,7 @@ void export_G4Material(); void export_G4MaterialTable(); void export_G4Element(); void export_G4ElementTable(); -//void export_G4ElementVector(); +void export_G4ElementVector(); void export_G4Isotope(); void export_G4NistManager(); void export_G4AtomicShells(); @@ -50,7 +50,7 @@ BOOST_PYTHON_MODULE(G4materials) export_G4MaterialTable(); export_G4Element(); export_G4ElementTable(); - //export_G4ElementVector(); + export_G4ElementVector(); export_G4Isotope(); export_G4NistManager(); export_G4AtomicShells(); diff --git a/environments/g4py/source/visualization/CMakeLists.txt b/environments/g4py/source/visualization/CMakeLists.txt index 2529577947..72a7829081 100644 --- a/environments/g4py/source/visualization/CMakeLists.txt +++ b/environments/g4py/source/visualization/CMakeLists.txt @@ -16,7 +16,6 @@ endif() geant4_add_pymodule(pyG4visualization pyG4ASCIITree.cc pyG4DAWNFILE.cc - pyG4HepRep.cc pyG4HepRepFile.cc pyG4OpenGLImmediateX.cc pyG4OpenGLImmediateXm.cc @@ -25,7 +24,6 @@ geant4_add_pymodule(pyG4visualization pyG4RayTracer.cc pyG4RayTracerX.cc pyG4VGraphicsSystem.cc - pyG4VRML1File.cc pyG4VRML2File.cc pyG4VisManager.cc pymodG4visualization.cc @@ -37,7 +35,7 @@ target_link_libraries(pyG4visualization PRIVATE G4RayTracer G4VRML G4visHepRep - G4vis_management + G4vis_management ) if(GEANT4_USE_OPENGL_X11 OR GEANT4_USE_XM) diff --git a/environments/g4py/source/visualization/pyG4HepRep.cc b/environments/g4py/source/visualization/pyG4HepRep.cc deleted file mode 100644 index 7bb419e321..0000000000 --- a/environments/g4py/source/visualization/pyG4HepRep.cc +++ /dev/null @@ -1,45 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyG4HepRep.cc -// -// 2005 Q -// ==================================================================== -#include -#include "G4HepRep.hh" - -using namespace boost::python; - -// ==================================================================== -// module definition -// ==================================================================== -void export_G4HepRep() -{ - class_ > - ("G4HepRep", "HepRep visualization module") - ; -} - diff --git a/environments/g4py/source/visualization/pyG4VRML1File.cc b/environments/g4py/source/visualization/pyG4VRML1File.cc deleted file mode 100644 index e669802262..0000000000 --- a/environments/g4py/source/visualization/pyG4VRML1File.cc +++ /dev/null @@ -1,45 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyG4VRML1File.cc -// -// 2005 Q -// ==================================================================== -#include -#include "G4VRML1File.hh" - -using namespace boost::python; - -// ==================================================================== -// module definition -// ==================================================================== -void export_G4VRML1File() -{ - class_ > - ("G4VRML1File", "VRML-1(file) visualization module") - ; -} - diff --git a/environments/g4py/source/visualization/pymodG4visualization.cc b/environments/g4py/source/visualization/pymodG4visualization.cc index ccd46e9876..867dd2479d 100644 --- a/environments/g4py/source/visualization/pymodG4visualization.cc +++ b/environments/g4py/source/visualization/pymodG4visualization.cc @@ -38,10 +38,8 @@ using namespace boost::python; void export_G4VisManager(); void export_G4VGraphicsSystem(); -void export_G4VRML1File(); void export_G4VRML2File(); void export_G4DAWNFILE(); -void export_G4HepRep(); void export_G4HepRepFile(); void export_G4ASCIITree(); void export_G4RayTracer(); @@ -60,14 +58,12 @@ void export_G4OpenGLImmediateXm(); void export_G4RayTracerX(); #endif -BOOST_PYTHON_MODULE(G4visualization) +BOOST_PYTHON_MODULE(G4visualization) { export_G4VisManager(); export_G4VGraphicsSystem(); - export_G4VRML1File(); export_G4VRML2File(); export_G4DAWNFILE(); - export_G4HepRep(); export_G4HepRepFile(); export_G4ASCIITree(); export_G4RayTracer(); diff --git a/environments/g4py/tests/CMakeLists.txt b/environments/g4py/tests/CMakeLists.txt deleted file mode 100644 index 172298ade7..0000000000 --- a/environments/g4py/tests/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# - add tests components -add_subdirectory(g4pytest) -add_subdirectory(gtest01) -add_subdirectory(gtest02) -add_subdirectory(gtest03) -add_subdirectory(gtest04) -add_subdirectory(gtest05) -add_subdirectory(gtest06) -add_subdirectory(gtest07) -add_subdirectory(gtest08) diff --git a/environments/g4py/tests/History b/environments/g4py/tests/History deleted file mode 100644 index 9eaf9b3d09..0000000000 --- a/environments/g4py/tests/History +++ /dev/null @@ -1,57 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Category History file - --------------------- - -A set of tests for python wrapping of C++ elements. - - ---------------------------------------------------------- - * Reverse chronological order (last date on top), please * - ---------------------------------------------------------- - -Nov.30, 2008 K.Murakami -- gtest01-07: modified with g4py namespace - -Aug.07, 2007 K.Murakami -- gtest06 is added. -- gtest07 is added. - -Jul.10, 2007 K.Murakami -- gtest05 is added. - -Aug.07, 2006 K.Murakami -- gtest04 is added. - -Oct.05, 2005 K.Murakami -- test13 is added. - -Aug.31, 2005 K.Murakami -- gtest03 is added. - -Aug.28, 2005 K.Murakami -- gtest02 is added. - -Aug.24, 2005 K.Murakami -- test12 is added. - -Aug.09, 2005 K.Murakami -- test11 is added. - -Jun.22, 2005 K.Murakami -- gtest00 is removed - -Jun.15, 2005 K.Murakami -- test10 is added. - -Jun.14, 2005 K.Murakami -- test00- test09 are finished. -- gtest00 is closed. -- gtest01 is launched for Geant4Py basic tests - -May 18, 2005 K.Murakami -- just created. - diff --git a/environments/g4py/tests/README.md b/environments/g4py/tests/README.md deleted file mode 100644 index 56ce126653..0000000000 --- a/environments/g4py/tests/README.md +++ /dev/null @@ -1,45 +0,0 @@ -Test Modules -============ - -This module collects a set of tests for python wrapping of C++ elements. - ->**Notes:**
    -"*testXX*" directories contain tests without Geant4 package.
    -"*gtestXX*" directories contain tests with Geant4 package. - - -Basic tests ------------ - -| Test | Description | -|:------:|------------- -|test00 | hallo world -|test01 | simple class wrapping -|test02 | simple inheritance -|test03 | singleton w/o public constructor
    can NOT be compiled. -|test04 | call policies -|test05 | function overloading & default arguments -|test06 | python inheritance from base class -|test07 | enums -|test08 | static member function -|test09 | operators -|test10 | call by-reference -|test11 | no_init -|test12 | indexing a STL vector -|test13 | test for a list argument/return - - -Function tests --------------- - -| Test | Description | -|:------:|------------- -|gtest01 | user application -|gtest02 | test for using site-module packages -|gtest03 | test for EZsim package -|gtest04 | test for getting command tree and command information -|gtest05 | test for constructing CSG geometries in Python -|gtest06 | test for constructing/visualizing boolean geoemtries -|gtest07 | test for checking overlapped geometries - - diff --git a/environments/g4py/tests/g4pytest/CMakeLists.txt b/environments/g4py/tests/g4pytest/CMakeLists.txt deleted file mode 100644 index 75306d0972..0000000000 --- a/environments/g4py/tests/g4pytest/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -# - Function to build the C++ modules -function(g4pytest_add_module _TARGET) - g4py_add_module(${_TARGET} ${ARGN}) - - # Filthy temp hack for submodule paths.... - string(REGEX REPLACE "^_" "" _SUBMODULE "${_TARGET}") - set_property(TARGET ${_TARGET} APPEND_STRING PROPERTY LIBRARY_OUTPUT_DIRECTORY "/g4pytest/${_SUBMODULE}") - foreach(_conftype ${CMAKE_CONFIGURATION_TYPES}) - string(TOUPPER ${_conftype} _conftype_uppercase) - set_property(TARGET ${_TARGET} APPEND_STRING PROPERTY LIBRARY_OUTPUT_DIRECTORY_${_conftype_uppercase} "/g4pytest/${_SUBMODULE}") - endforeach() -endfunction() - - -# - add libs components -add_subdirectory(ExN01geom) -add_subdirectory(ExN03geom) -add_subdirectory(Qgeom) -add_subdirectory(ezgeom) -add_subdirectory(NISTmaterials) -add_subdirectory(Qmaterials) -add_subdirectory(EMSTDpl) -add_subdirectory(ExN01pl) -add_subdirectory(MedicalBeam) -add_subdirectory(ParticleGun) -# Remainder are pure python - -# Copy/configure pure python components -file(GLOB_RECURSE PY_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.py) -foreach(_pyfile ${PY_FILES}) - file(GENERATE - OUTPUT ${GEANT4_PYTHON_OUTPUT_DIR}/g4pytest/${_pyfile} - INPUT ${CMAKE_CURRENT_SOURCE_DIR}/${_pyfile} - ) -endforeach() diff --git a/environments/g4py/tests/g4pytest/EMSTDpl/CMakeLists.txt b/environments/g4py/tests/g4pytest/EMSTDpl/CMakeLists.txt deleted file mode 100644 index 82112c5a98..0000000000 --- a/environments/g4py/tests/g4pytest/EMSTDpl/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# - build library -set(_TARGET _EMSTDpl) -g4pytest_add_module(${_TARGET} PhysicsListEMstd.cc pyEMSTDpl.cc) -target_link_libraries(${_TARGET} PRIVATE G4particles G4processes G4run) diff --git a/environments/g4py/tests/g4pytest/EMSTDpl/PhysicsListEMstd.cc b/environments/g4py/tests/g4pytest/EMSTDpl/PhysicsListEMstd.cc deleted file mode 100644 index 89d33286a9..0000000000 --- a/environments/g4py/tests/g4pytest/EMSTDpl/PhysicsListEMstd.cc +++ /dev/null @@ -1,133 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// PhysicsListEMstd.cc -// -// 2006 Q -// ==================================================================== -#include "PhysicsListEMstd.hh" -#include "G4SystemOfUnits.hh" - -#include "G4ProcessManager.hh" -#include "G4ParticleDefinition.hh" - -#include "G4Gamma.hh" -#include "G4Electron.hh" -#include "G4Positron.hh" - -#include "G4ComptonScattering.hh" -#include "G4GammaConversion.hh" -#include "G4PhotoElectricEffect.hh" -#include "G4eMultipleScattering.hh" -#include "G4eIonisation.hh" -#include "G4eBremsstrahlung.hh" -#include "G4eplusAnnihilation.hh" - - -// ==================================================================== -// -// class description -// -// ==================================================================== - -//////////////////////////////////// -PhysicsListEMstd::PhysicsListEMstd() -//////////////////////////////////// -{ - SetVerboseLevel(1); - defaultCutValue = 1.*mm; // default cut value (1.0mm) -} - - -///////////////////////////////////// -PhysicsListEMstd::~PhysicsListEMstd() -///////////////////////////////////// -{ -} - - -////////////////////////////////////////// -void PhysicsListEMstd::ConstructParticle() -////////////////////////////////////////// -{ - G4Gamma::GammaDefinition(); - G4Electron::ElectronDefinition(); - G4Positron::PositronDefinition(); -} - - -///////////////////////////////////////// -void PhysicsListEMstd::ConstructProcess() -///////////////////////////////////////// -{ - AddTransportation(); - - G4ProcessManager* pm; - - // ---------------------------------------------------------- - // gamma physics - // ---------------------------------------------------------- - pm= G4Gamma::Gamma()-> GetProcessManager(); - pm-> AddDiscreteProcess(new G4PhotoElectricEffect); - pm-> AddDiscreteProcess(new G4ComptonScattering); - pm-> AddDiscreteProcess(new G4GammaConversion); - - // ---------------------------------------------------------- - // electron physics - // ---------------------------------------------------------- - G4eMultipleScattering* msc= new G4eMultipleScattering; - G4eIonisation* eion= new G4eIonisation; - G4eBremsstrahlung* ebrems= new G4eBremsstrahlung; - - pm= G4Electron::Electron()->GetProcessManager(); - pm-> AddProcess(msc, ordInActive, 1, 1); - pm-> AddProcess(eion, ordInActive, 2, 2); - pm-> AddProcess(ebrems, ordInActive, ordInActive, 3); - - // ---------------------------------------------------------- - // positron physics - // ---------------------------------------------------------- - msc= new G4eMultipleScattering; - eion= new G4eIonisation; - ebrems= new G4eBremsstrahlung; - G4eplusAnnihilation* annihilation= new G4eplusAnnihilation; - - pm= G4Positron::Positron()-> GetProcessManager(); - pm-> AddProcess(msc, ordInActive, 1, 1); - pm-> AddProcess(eion, ordInActive, 2, 2); - pm-> AddProcess(ebrems, ordInActive, ordInActive, 3); - pm-> AddProcess(annihilation, 0, ordInActive, 4); - -} - - -//////////////////////////////// -void PhysicsListEMstd::SetCuts() -//////////////////////////////// -{ - SetCutsWithDefault(); -} - diff --git a/environments/g4py/tests/g4pytest/EMSTDpl/__init__.py b/environments/g4py/tests/g4pytest/EMSTDpl/__init__.py deleted file mode 100644 index 30c93286ec..0000000000 --- a/environments/g4py/tests/g4pytest/EMSTDpl/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._EMSTDpl import * \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/ExN01geom/CMakeLists.txt b/environments/g4py/tests/g4pytest/ExN01geom/CMakeLists.txt deleted file mode 100644 index c92f18b2ee..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01geom/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# - build library -set(_TARGET _ExN01geom) -g4pytest_add_module(${_TARGET} ExN01DetectorConstruction.cc pyExN01geom.cc) -target_link_libraries(${_TARGET} PRIVATE G4materials G4geometry G4run) diff --git a/environments/g4py/tests/g4pytest/ExN01geom/ExN01DetectorConstruction.cc b/environments/g4py/tests/g4pytest/ExN01geom/ExN01DetectorConstruction.cc deleted file mode 100644 index f5fbce61a2..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01geom/ExN01DetectorConstruction.cc +++ /dev/null @@ -1,155 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// ExN01DetectorConstruction.cc -// -// 2005 Q -// ==================================================================== -#include "ExN01DetectorConstruction.hh" - -#include "G4Material.hh" -#include "G4Box.hh" -#include "G4Tubs.hh" -#include "G4LogicalVolume.hh" -#include "G4ThreeVector.hh" -#include "G4PVPlacement.hh" -#include "G4SystemOfUnits.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -////////////////////////////////////////////////////// -ExN01DetectorConstruction::ExN01DetectorConstruction() - : experimentalHall_log(0), tracker_log(0), - calorimeterBlock_log(0), calorimeterLayer_log(0), - experimentalHall_phys(0), calorimeterLayer_phys(0), - calorimeterBlock_phys(0), tracker_phys(0) -////////////////////////////////////////////////////// -{ -} - -/////////////////////////////////////////////////////// -ExN01DetectorConstruction::~ExN01DetectorConstruction() -/////////////////////////////////////////////////////// -{ -} - -///////////////////////////////////////////////////////// -G4VPhysicalVolume* ExN01DetectorConstruction::Construct() -///////////////////////////////////////////////////////// -{ - //------------------------------------------------------ materials - G4double a; // atomic mass - G4double z; // atomic number - G4double density; - - G4Material* Ar = - new G4Material("ArgonGas", z= 18., a= 39.95*g/mole, density= 1.782*mg/cm3); - - G4Material* Al = - new G4Material("Aluminum", z= 13., a= 26.98*g/mole, density= 2.7*g/cm3); - - G4Material* Pb = - new G4Material("Lead", z= 82., a= 207.19*g/mole, density= 11.35*g/cm3); - - //------------------------------------------------------ volumes - - //------------------------------ experimental hall (world volume) - //------------------------------ beam line along x axis - - G4double expHall_x = 3.0*m; - G4double expHall_y = 1.0*m; - G4double expHall_z = 1.0*m; - G4Box* experimentalHall_box - = new G4Box("expHall_box",expHall_x,expHall_y,expHall_z); - experimentalHall_log = new G4LogicalVolume(experimentalHall_box, - Ar,"expHall_log",0,0,0); - experimentalHall_phys = new G4PVPlacement(0,G4ThreeVector(), - experimentalHall_log, - "expHall",0,false,0); - - //------------------------------ a tracker tube - - G4double innerRadiusOfTheTube = 0.*cm; - G4double outerRadiusOfTheTube = 60.*cm; - G4double hightOfTheTube = 50.*cm; - G4double startAngleOfTheTube = 0.*deg; - G4double spanningAngleOfTheTube = 360.*deg; - G4Tubs* tracker_tube = new G4Tubs("tracker_tube",innerRadiusOfTheTube, - outerRadiusOfTheTube,hightOfTheTube, - startAngleOfTheTube, - spanningAngleOfTheTube); - tracker_log = new G4LogicalVolume(tracker_tube,Al,"tracker_log",0,0,0); - G4double trackerPos_x = -1.0*m; - G4double trackerPos_y = 0.*m; - G4double trackerPos_z = 0.*m; - tracker_phys = new G4PVPlacement(0, - G4ThreeVector(trackerPos_x,trackerPos_y,trackerPos_z), - tracker_log,"tracker",experimentalHall_log,false,0); - - //------------------------------ a calorimeter block - - G4double block_x = 1.0*m; - G4double block_y = 50.0*cm; - G4double block_z = 50.0*cm; - G4Box* calorimeterBlock_box = new G4Box("calBlock_box",block_x, - block_y,block_z); - calorimeterBlock_log = new G4LogicalVolume(calorimeterBlock_box, - Pb,"caloBlock_log",0,0,0); - G4double blockPos_x = 1.0*m; - G4double blockPos_y = 0.0*m; - G4double blockPos_z = 0.0*m; - calorimeterBlock_phys = new G4PVPlacement(0, - G4ThreeVector(blockPos_x,blockPos_y,blockPos_z), - calorimeterBlock_log,"caloBlock",experimentalHall_log,false,0); - - //------------------------------ calorimeter layers - - G4double calo_x = 1.*cm; - G4double calo_y = 40.*cm; - G4double calo_z = 40.*cm; - G4Box* calorimeterLayer_box = new G4Box("caloLayer_box", - calo_x,calo_y,calo_z); - calorimeterLayer_log = new G4LogicalVolume(calorimeterLayer_box, - Al,"caloLayer_log",0,0,0); - for(G4int i=0;i<19;i++) // loop for 19 layers - { - G4double caloPos_x = (i-9)*10.*cm; - G4double caloPos_y = 0.0*m; - G4double caloPos_z = 0.0*m; - calorimeterLayer_phys = new G4PVPlacement(0, - G4ThreeVector(caloPos_x,caloPos_y,caloPos_z), - calorimeterLayer_log,"caloLayer",calorimeterBlock_log,false,i); - } - - //------------------------------------------------------------------ - - return experimentalHall_phys; -} - diff --git a/environments/g4py/tests/g4pytest/ExN01geom/ExN01DetectorConstruction.hh b/environments/g4py/tests/g4pytest/ExN01geom/ExN01DetectorConstruction.hh deleted file mode 100644 index 2437df674a..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01geom/ExN01DetectorConstruction.hh +++ /dev/null @@ -1,73 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// ExN01DetectorConstruction.hh -// -// 2005 Q -// ==================================================================== -#ifndef EXN01_DETECTOR_CONSTRUCTION_H -#define EXN01_DETECTOR_CONSTRUCTION_H - -#include "G4VUserDetectorConstruction.hh" -#include "globals.hh" - -// ==================================================================== -// -// class definition -// -// ==================================================================== -class G4LogicalVolume; -class G4VPhysicalVolume; - -#include "G4VUserDetectorConstruction.hh" - -class ExN01DetectorConstruction : public G4VUserDetectorConstruction { -public: - - ExN01DetectorConstruction(); - ~ExN01DetectorConstruction(); - - G4VPhysicalVolume* Construct(); - -private: - // Logical volumes - // - G4LogicalVolume* experimentalHall_log; - G4LogicalVolume* tracker_log; - G4LogicalVolume* calorimeterBlock_log; - G4LogicalVolume* calorimeterLayer_log; - - // Physical volumes - // - G4VPhysicalVolume* experimentalHall_phys; - G4VPhysicalVolume* calorimeterLayer_phys; - G4VPhysicalVolume* calorimeterBlock_phys; - G4VPhysicalVolume* tracker_phys; - -}; - -#endif - diff --git a/environments/g4py/tests/g4pytest/ExN01geom/__init__.py b/environments/g4py/tests/g4pytest/ExN01geom/__init__.py deleted file mode 100644 index b6ad7e2ac7..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01geom/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._ExN01geom import * \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/ExN01geom/pyExN01geom.cc b/environments/g4py/tests/g4pytest/ExN01geom/pyExN01geom.cc deleted file mode 100644 index ddf290ec23..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01geom/pyExN01geom.cc +++ /dev/null @@ -1,71 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyExN01geom.cc -// -// [Qgeom] -// a site-module of Geant4Py -// -// geometry presented in ExN01 of Geant4 example -// -// 2005 Q -// ==================================================================== -#include -#include "G4RunManager.hh" -#include "ExN01DetectorConstruction.hh" - -using namespace boost::python; - -// ==================================================================== -// thin wrappers -// ==================================================================== -namespace pyExN03geom { - -void Construct() -{ - G4RunManager* runMgr= G4RunManager::GetRunManager(); - runMgr-> SetUserInitialization(new ExN01DetectorConstruction); -} - -} - -using namespace pyExN03geom; - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_ExN01geom) { - - class_ > - ("ExN01DetectorConstruction", "ExN01 detector") - ; - - // --- - def("Construct", Construct); -} - diff --git a/environments/g4py/tests/g4pytest/ExN01pl/CMakeLists.txt b/environments/g4py/tests/g4pytest/ExN01pl/CMakeLists.txt deleted file mode 100644 index 7f519ce7b8..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01pl/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# - build library -set(_TARGET _ExN01pl) -g4pytest_add_module(${_TARGET} ExN01PhysicsList.cc pyExN01pl.cc) -target_link_libraries(${_TARGET} PRIVATE G4particles G4processes G4run) diff --git a/environments/g4py/tests/g4pytest/ExN01pl/ExN01PhysicsList.cc b/environments/g4py/tests/g4pytest/ExN01pl/ExN01PhysicsList.cc deleted file mode 100644 index f270c88385..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01pl/ExN01PhysicsList.cc +++ /dev/null @@ -1,77 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// ExN01PhysicsList.cc -// -// 2005 Q -// ==================================================================== -#include "ExN01PhysicsList.hh" -#include "G4ParticleTypes.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -//////////////////////////////////// -ExN01PhysicsList::ExN01PhysicsList() -//////////////////////////////////// -{ -} - -///////////////////////////////////// -ExN01PhysicsList::~ExN01PhysicsList() -///////////////////////////////////// -{ -} - -////////////////////////////////////////// -void ExN01PhysicsList::ConstructParticle() -////////////////////////////////////////// -{ - G4Geantino::GeantinoDefinition(); -} - -///////////////////////////////////////// -void ExN01PhysicsList::ConstructProcess() -///////////////////////////////////////// -{ - AddTransportation(); -} - -//////////////////////////////// -void ExN01PhysicsList::SetCuts() -//////////////////////////////// -{ - G4int temp = GetVerboseLevel(); - SetVerboseLevel(0); - - SetCutsWithDefault(); - - SetVerboseLevel(temp); -} - diff --git a/environments/g4py/tests/g4pytest/ExN01pl/ExN01PhysicsList.hh b/environments/g4py/tests/g4pytest/ExN01pl/ExN01PhysicsList.hh deleted file mode 100644 index 69e9ca06d1..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01pl/ExN01PhysicsList.hh +++ /dev/null @@ -1,56 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// ExN01PhysicsList.hh -// -// 2005 Q -// ==================================================================== -#ifndef EXN01_PHYSICS_LIST_H -#define EXN01_PHYSICS_LIST_H - -#include "G4VUserPhysicsList.hh" -#include "globals.hh" - -// ==================================================================== -// -// class definition -// -// ==================================================================== - -class ExN01PhysicsList: public G4VUserPhysicsList { -public: - ExN01PhysicsList(); - ~ExN01PhysicsList(); - -protected: - // Construct particle and physics process - void ConstructParticle(); - void ConstructProcess(); - void SetCuts(); - -}; - -#endif diff --git a/environments/g4py/tests/g4pytest/ExN01pl/__init__.py b/environments/g4py/tests/g4pytest/ExN01pl/__init__.py deleted file mode 100644 index a0371b4b0d..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01pl/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._ExN01pl import * diff --git a/environments/g4py/tests/g4pytest/ExN01pl/pyExN01pl.cc b/environments/g4py/tests/g4pytest/ExN01pl/pyExN01pl.cc deleted file mode 100644 index 6ce4846307..0000000000 --- a/environments/g4py/tests/g4pytest/ExN01pl/pyExN01pl.cc +++ /dev/null @@ -1,75 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyExN01pl.cc -// -// [ExN01pl] -// a site-module of Geant4Py -// -// minimal physics list, which is presnted in ExN01 of Geant4 example -// -// 2005 Q -// ==================================================================== -#include -#include "G4RunManager.hh" -#include "ExN01PhysicsList.hh" - -using namespace boost::python; - -// ==================================================================== -// thin wrappers -// ==================================================================== -namespace pyExN01pl { - -ExN01PhysicsList* Construct() -{ - ExN01PhysicsList* pl= new ExN01PhysicsList; - - G4RunManager* runMgr= G4RunManager::GetRunManager(); - runMgr-> SetUserInitialization(pl); - - return pl; -} - -} - -using namespace pyExN01pl; - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_ExN01pl) { - - class_ > - ("ExN01PhysicsList", "ExN01 physics list") - ; - - // --- - def("Construct", Construct, - return_value_policy()); - -} diff --git a/environments/g4py/tests/g4pytest/ExN03geom/CMakeLists.txt b/environments/g4py/tests/g4pytest/ExN03geom/CMakeLists.txt deleted file mode 100644 index 836ecd73d5..0000000000 --- a/environments/g4py/tests/g4pytest/ExN03geom/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# - build library -set(_TARGET _ExN03geom) -g4pytest_add_module(${_TARGET} ExN03DetectorConstruction.cc ExN03DetectorMessenger.cc pyExN03geom.cc) -target_link_libraries(${_TARGET} PRIVATE G4materials G4geometry G4run) diff --git a/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorConstruction.cc b/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorConstruction.cc deleted file mode 100644 index b32ae99172..0000000000 --- a/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorConstruction.cc +++ /dev/null @@ -1,473 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "ExN03DetectorConstruction.hh" -#include "ExN03DetectorMessenger.hh" - -#include "G4Material.hh" -#include "G4Box.hh" -#include "G4LogicalVolume.hh" -#include "G4PVPlacement.hh" -#include "G4PVReplica.hh" -#include "G4UniformMagField.hh" - -#include "G4GeometryManager.hh" -#include "G4PhysicalVolumeStore.hh" -#include "G4LogicalVolumeStore.hh" -#include "G4SolidStore.hh" - -#include "G4VisAttributes.hh" -#include "G4Colour.hh" -#include "G4SystemOfUnits.hh" -#include "G4PhysicalConstants.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -ExN03DetectorConstruction::ExN03DetectorConstruction() -:AbsorberMaterial(0),GapMaterial(0),defaultMaterial(0), - solidWorld(0),logicWorld(0),physiWorld(0), - solidCalor(0),logicCalor(0),physiCalor(0), - solidLayer(0),logicLayer(0),physiLayer(0), - solidAbsorber(0),logicAbsorber(0),physiAbsorber(0), - solidGap (0),logicGap (0),physiGap (0), - magField(0) -{ - // default parameter values of the calorimeter - AbsorberThickness = 10.*mm; - GapThickness = 5.*mm; - NbOfLayers = 10; - CalorSizeYZ = 10.*cm; - ComputeCalorParameters(); - - // materials - DefineMaterials(); - SetAbsorberMaterial("Lead"); - SetGapMaterial("liquidArgon"); - - // create commands for interactive definition of the calorimeter - detectorMessenger = new ExN03DetectorMessenger(this); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -ExN03DetectorConstruction::~ExN03DetectorConstruction() -{ delete detectorMessenger;} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -G4VPhysicalVolume* ExN03DetectorConstruction::Construct() -{ - return ConstructCalorimeter(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void ExN03DetectorConstruction::DefineMaterials() -{ - //This function illustrates the possible ways to define materials - -G4String symbol; //a=mass of a mole; -G4double a, z, density; //z=mean number of protons; -G4int iz, n; //iz=number of protons in an isotope; - // n=number of nucleons in an isotope; - -G4int ncomponents, natoms; -G4double abundance, fractionmass; - -// -// define Elements -// - -G4Element* H = new G4Element("Hydrogen",symbol="H" , z= 1., a= 1.01*g/mole); -G4Element* C = new G4Element("Carbon" ,symbol="C" , z= 6., a= 12.01*g/mole); -G4Element* N = new G4Element("Nitrogen",symbol="N" , z= 7., a= 14.01*g/mole); -G4Element* O = new G4Element("Oxygen" ,symbol="O" , z= 8., a= 16.00*g/mole); -G4Element* Si = new G4Element("Silicon",symbol="Si" , z= 14., a= 28.09*g/mole); - -// -// define an Element from isotopes, by relative abundance -// - -G4Isotope* U5 = new G4Isotope("U235", iz=92, n=235, a=235.01*g/mole); -G4Isotope* U8 = new G4Isotope("U238", iz=92, n=238, a=238.03*g/mole); - -G4Element* U = new G4Element("enriched Uranium",symbol="U",ncomponents=2); -U->AddIsotope(U5, abundance= 90.*perCent); -U->AddIsotope(U8, abundance= 10.*perCent); - -// -// define simple materials -// - -new G4Material("Aluminium", z=13., a=26.98*g/mole, density=2.700*g/cm3); -new G4Material("liquidArgon", z=18., a= 39.95*g/mole, density= 1.390*g/cm3); -new G4Material("Lead" , z=82., a= 207.19*g/mole, density= 11.35*g/cm3); - -// -// define a material from elements. case 1: chemical molecule -// - -G4Material* H2O = -new G4Material("Water", density= 1.000*g/cm3, ncomponents=2); -H2O->AddElement(H, natoms=2); -H2O->AddElement(O, natoms=1); -// overwrite computed meanExcitationEnergy with ICRU recommended value -H2O->GetIonisation()->SetMeanExcitationEnergy(75.0*eV); - -G4Material* Sci = -new G4Material("Scintillator", density= 1.032*g/cm3, ncomponents=2); -Sci->AddElement(C, natoms=9); -Sci->AddElement(H, natoms=10); - -G4Material* Myl = -new G4Material("Mylar", density= 1.397*g/cm3, ncomponents=3); -Myl->AddElement(C, natoms=10); -Myl->AddElement(H, natoms= 8); -Myl->AddElement(O, natoms= 4); - -G4Material* SiO2 = -new G4Material("quartz",density= 2.200*g/cm3, ncomponents=2); -SiO2->AddElement(Si, natoms=1); -SiO2->AddElement(O , natoms=2); - -// -// define a material from elements. case 2: mixture by fractional mass -// - -G4Material* Air = -new G4Material("Air" , density= 1.290*mg/cm3, ncomponents=2); -Air->AddElement(N, fractionmass=0.7); -Air->AddElement(O, fractionmass=0.3); - -// -// define a material from elements and/or others materials (mixture of mixtures) -// - -G4Material* Aerog = -new G4Material("Aerogel", density= 0.200*g/cm3, ncomponents=3); -Aerog->AddMaterial(SiO2, fractionmass=62.5*perCent); -Aerog->AddMaterial(H2O , fractionmass=37.4*perCent); -Aerog->AddElement (C , fractionmass= 0.1*perCent); - -// -// examples of gas in non STP conditions -// - -G4Material* CO2 = -new G4Material("CarbonicGas", density= 27.*mg/cm3, ncomponents=2, - kStateGas, 325.*kelvin, 50.*atmosphere); -CO2->AddElement(C, natoms=1); -CO2->AddElement(O, natoms=2); - -G4Material* steam = -new G4Material("WaterSteam", density= 0.3*mg/cm3, ncomponents=1, - kStateGas, 500.*kelvin, 2.*atmosphere); -steam->AddMaterial(H2O, fractionmass=1.); - -// -// examples of vacuum -// - -G4Material* Vacuum = -new G4Material("Galactic", z=1., a=1.01*g/mole,density= universe_mean_density, - kStateGas, 2.73*kelvin, 3.e-18*pascal); - -G4Material* beam = -new G4Material("Beam", density= 1.e-5*g/cm3, ncomponents=1, - kStateGas, STP_Temperature, 2.e-2*bar); -beam->AddMaterial(Air, fractionmass=1.); - -G4cout << *(G4Material::GetMaterialTable()) << G4endl; - -//default materials of the World -defaultMaterial = Vacuum; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -G4VPhysicalVolume* ExN03DetectorConstruction::ConstructCalorimeter() -{ - - // Clean old geometry, if any - // - G4GeometryManager::GetInstance()->OpenGeometry(); - G4PhysicalVolumeStore::GetInstance()->Clean(); - G4LogicalVolumeStore::GetInstance()->Clean(); - G4SolidStore::GetInstance()->Clean(); - - // complete the Calor parameters definition - ComputeCalorParameters(); - - // - // World - // - solidWorld = new G4Box("World", //its name - WorldSizeX/2,WorldSizeYZ/2,WorldSizeYZ/2); //its size - - logicWorld = new G4LogicalVolume(solidWorld, //its solid - defaultMaterial, //its material - "World"); //its name - - physiWorld = new G4PVPlacement(0, //no rotation - G4ThreeVector(), //at (0,0,0) - logicWorld, //its logical volume - "World", //its name - 0, //its mother volume - false, //no boolean operation - 0); //copy number - - // - // Calorimeter - // - solidCalor=0; logicCalor=0; physiCalor=0; - solidLayer=0; logicLayer=0; physiLayer=0; - - if (CalorThickness > 0.) - { solidCalor = new G4Box("Calorimeter", //its name - CalorThickness/2,CalorSizeYZ/2,CalorSizeYZ/2);//size - - logicCalor = new G4LogicalVolume(solidCalor, //its solid - defaultMaterial, //its material - "Calorimeter"); //its name - - physiCalor = new G4PVPlacement(0, //no rotation - G4ThreeVector(), //at (0,0,0) - logicCalor, //its logical volume - "Calorimeter", //its name - logicWorld, //its mother volume - false, //no boolean operation - 0); //copy number - - // - // Layer - // - solidLayer = new G4Box("Layer", //its name - LayerThickness/2,CalorSizeYZ/2,CalorSizeYZ/2); //size - - logicLayer = new G4LogicalVolume(solidLayer, //its solid - defaultMaterial, //its material - "Layer"); //its name - if (NbOfLayers > 1) - physiLayer = new G4PVReplica("Layer", //its name - logicLayer, //its logical volume - logicCalor, //its mother - kXAxis, //axis of replication - NbOfLayers, //number of replica - LayerThickness); //witdth of replica - else - physiLayer = new G4PVPlacement(0, //no rotation - G4ThreeVector(), //at (0,0,0) - logicLayer, //its logical volume - "Layer", //its name - logicCalor, //its mother volume - false, //no boolean operation - 0); //copy number - } - - // - // Absorber - // - solidAbsorber=0; logicAbsorber=0; physiAbsorber=0; - - if (AbsorberThickness > 0.) - { solidAbsorber = new G4Box("Absorber", //its name - AbsorberThickness/2,CalorSizeYZ/2,CalorSizeYZ/2); - - logicAbsorber = new G4LogicalVolume(solidAbsorber, //its solid - AbsorberMaterial, //its material - AbsorberMaterial->GetName()); //name - - physiAbsorber = new G4PVPlacement(0, //no rotation - G4ThreeVector(-GapThickness/2,0.,0.), //its position - logicAbsorber, //its logical volume - AbsorberMaterial->GetName(), //its name - logicLayer, //its mother - false, //no boulean operat - 0); //copy number - - } - - // - // Gap - // - solidGap=0; logicGap=0; physiGap=0; - - if (GapThickness > 0.) - { solidGap = new G4Box("Gap", - GapThickness/2,CalorSizeYZ/2,CalorSizeYZ/2); - - logicGap = new G4LogicalVolume(solidGap, - GapMaterial, - GapMaterial->GetName()); - - physiGap = new G4PVPlacement(0, //no rotation - G4ThreeVector(AbsorberThickness/2,0.,0.), //its position - logicGap, //its logical volume - GapMaterial->GetName(), //its name - logicLayer, //its mother - false, //no boulean operat - 0); //copy number - } - - PrintCalorParameters(); - - // - // Visualization attributes - // - logicWorld->SetVisAttributes (G4VisAttributes::GetInvisible()); - - G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); - simpleBoxVisAtt->SetVisibility(true); - logicCalor->SetVisAttributes(simpleBoxVisAtt); - - /* - // Below are vis attributes that permits someone to test / play - // with the interactive expansion / contraction geometry system of the - // vis/OpenInventor driver : - {G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,0.0)); - simpleBoxVisAtt->SetVisibility(true); - delete logicCalor->GetVisAttributes(); - logicCalor->SetVisAttributes(simpleBoxVisAtt);} - - {G4VisAttributes* atb= new G4VisAttributes(G4Colour(1.0,0.0,0.0)); - logicLayer->SetVisAttributes(atb);} - - {G4VisAttributes* atb= new G4VisAttributes(G4Colour(0.0,1.0,0.0)); - atb->SetForceSolid(true); - logicAbsorber->SetVisAttributes(atb);} - - {//Set opacity = 0.2 then transparency = 1 - 0.2 = 0.8 - G4VisAttributes* atb= new G4VisAttributes(G4Colour(0.0,0.0,1.0,0.2)); - atb->SetForceSolid(true); - logicGap->SetVisAttributes(atb);} - */ - - // - //always return the physical World - // - return physiWorld; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void ExN03DetectorConstruction::PrintCalorParameters() -{ - G4cout << "\n------------------------------------------------------------" - << "\n---> The calorimeter is " << NbOfLayers << " layers of: [ " - << AbsorberThickness/mm << "mm of " << AbsorberMaterial->GetName() - << " + " - << GapThickness/mm << "mm of " << GapMaterial->GetName() << " ] " - << "\n------------------------------------------------------------\n"; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void ExN03DetectorConstruction::SetAbsorberMaterial(G4String materialChoice) -{ - // search the material by its name - G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice); - if (pttoMaterial) AbsorberMaterial = pttoMaterial; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void ExN03DetectorConstruction::SetGapMaterial(G4String materialChoice) -{ - // search the material by its name - G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice); - if (pttoMaterial) GapMaterial = pttoMaterial; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void ExN03DetectorConstruction::SetAbsorberThickness(G4double val) -{ - // change Absorber thickness and recompute the calorimeter parameters - AbsorberThickness = val; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void ExN03DetectorConstruction::SetGapThickness(G4double val) -{ - // change Gap thickness and recompute the calorimeter parameters - GapThickness = val; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void ExN03DetectorConstruction::SetCalorSizeYZ(G4double val) -{ - // change the transverse size and recompute the calorimeter parameters - CalorSizeYZ = val; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void ExN03DetectorConstruction::SetNbOfLayers(G4int val) -{ - NbOfLayers = val; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "G4FieldManager.hh" -#include "G4TransportationManager.hh" - -void ExN03DetectorConstruction::SetMagField(G4double fieldValue) -{ - //apply a global uniform magnetic field along Z axis - G4FieldManager* fieldMgr - = G4TransportationManager::GetTransportationManager()->GetFieldManager(); - - if(magField) delete magField; //delete the existing magn field - - if(fieldValue!=0.) // create a new one if non nul - { magField = new G4UniformMagField(G4ThreeVector(0.,0.,fieldValue)); - fieldMgr->SetDetectorField(magField); - fieldMgr->CreateChordFinder(magField); - } else { - magField = 0; - fieldMgr->SetDetectorField(magField); - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "G4RunManager.hh" - -void ExN03DetectorConstruction::UpdateGeometry() -{ - G4RunManager::GetRunManager()->DefineWorldVolume(ConstructCalorimeter()); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorConstruction.hh b/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorConstruction.hh deleted file mode 100644 index f72027d868..0000000000 --- a/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorConstruction.hh +++ /dev/null @@ -1,157 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#ifndef ExN03DetectorConstruction_h -#define ExN03DetectorConstruction_h 1 - -#include "G4VUserDetectorConstruction.hh" -#include "globals.hh" - -class G4Box; -class G4LogicalVolume; -class G4VPhysicalVolume; -class G4Material; -class G4UniformMagField; -class ExN03DetectorMessenger; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -class ExN03DetectorConstruction : public G4VUserDetectorConstruction -{ - public: - - ExN03DetectorConstruction(); - ~ExN03DetectorConstruction(); - - public: - - void SetAbsorberMaterial (G4String); - void SetAbsorberThickness(G4double); - - void SetGapMaterial (G4String); - void SetGapThickness(G4double); - - void SetCalorSizeYZ(G4double); - void SetNbOfLayers (G4int); - - void SetMagField(G4double); - - G4VPhysicalVolume* Construct(); - - void UpdateGeometry(); - - public: - - void PrintCalorParameters(); - - G4double GetWorldSizeX() {return WorldSizeX;}; - G4double GetWorldSizeYZ() {return WorldSizeYZ;}; - - G4double GetCalorThickness() {return CalorThickness;}; - G4double GetCalorSizeYZ() {return CalorSizeYZ;}; - - G4int GetNbOfLayers() {return NbOfLayers;}; - - G4Material* GetAbsorberMaterial() {return AbsorberMaterial;}; - G4double GetAbsorberThickness() {return AbsorberThickness;}; - - G4Material* GetGapMaterial() {return GapMaterial;}; - G4double GetGapThickness() {return GapThickness;}; - - const G4VPhysicalVolume* GetphysiWorld() {return physiWorld;}; - const G4VPhysicalVolume* GetAbsorber() {return physiAbsorber;}; - const G4VPhysicalVolume* GetGap() {return physiGap;}; - - private: - - G4Material* AbsorberMaterial; - G4double AbsorberThickness; - - G4Material* GapMaterial; - G4double GapThickness; - - G4int NbOfLayers; - G4double LayerThickness; - - G4double CalorSizeYZ; - G4double CalorThickness; - - G4Material* defaultMaterial; - G4double WorldSizeYZ; - G4double WorldSizeX; - - G4Box* solidWorld; //pointer to the solid World - G4LogicalVolume* logicWorld; //pointer to the logical World - G4VPhysicalVolume* physiWorld; //pointer to the physical World - - G4Box* solidCalor; //pointer to the solid Calor - G4LogicalVolume* logicCalor; //pointer to the logical Calor - G4VPhysicalVolume* physiCalor; //pointer to the physical Calor - - G4Box* solidLayer; //pointer to the solid Layer - G4LogicalVolume* logicLayer; //pointer to the logical Layer - G4VPhysicalVolume* physiLayer; //pointer to the physical Layer - - G4Box* solidAbsorber; //pointer to the solid Absorber - G4LogicalVolume* logicAbsorber; //pointer to the logical Absorber - G4VPhysicalVolume* physiAbsorber; //pointer to the physical Absorber - - G4Box* solidGap; //pointer to the solid Gap - G4LogicalVolume* logicGap; //pointer to the logical Gap - G4VPhysicalVolume* physiGap; //pointer to the physical Gap - - G4UniformMagField* magField; //pointer to the magnetic field - - ExN03DetectorMessenger* detectorMessenger; //pointer to the Messenger - - private: - - void DefineMaterials(); - void ComputeCalorParameters(); - G4VPhysicalVolume* ConstructCalorimeter(); -}; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -inline void ExN03DetectorConstruction::ComputeCalorParameters() -{ - // Compute derived parameters of the calorimeter - LayerThickness = AbsorberThickness + GapThickness; - CalorThickness = NbOfLayers*LayerThickness; - - WorldSizeX = 1.2*CalorThickness; WorldSizeYZ = 1.2*CalorSizeYZ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#endif - diff --git a/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorMessenger.cc b/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorMessenger.cc deleted file mode 100644 index 6759778215..0000000000 --- a/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorMessenger.cc +++ /dev/null @@ -1,148 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "ExN03DetectorMessenger.hh" - -#include "ExN03DetectorConstruction.hh" -#include "G4UIdirectory.hh" -#include "G4UIcmdWithAString.hh" -#include "G4UIcmdWithAnInteger.hh" -#include "G4UIcmdWithADoubleAndUnit.hh" -#include "G4UIcmdWithoutParameter.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -ExN03DetectorMessenger::ExN03DetectorMessenger( - ExN03DetectorConstruction* ExN03Det) -:ExN03Detector(ExN03Det) -{ - N03Dir = new G4UIdirectory("/N03/"); - N03Dir->SetGuidance("UI commands of this example"); - - detDir = new G4UIdirectory("/N03/det/"); - detDir->SetGuidance("detector control"); - - AbsMaterCmd = new G4UIcmdWithAString("/N03/det/setAbsMat",this); - AbsMaterCmd->SetGuidance("Select Material of the Absorber."); - AbsMaterCmd->SetParameterName("choice",false); - AbsMaterCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - - GapMaterCmd = new G4UIcmdWithAString("/N03/det/setGapMat",this); - GapMaterCmd->SetGuidance("Select Material of the Gap."); - GapMaterCmd->SetParameterName("choice",false); - GapMaterCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - - AbsThickCmd = new G4UIcmdWithADoubleAndUnit("/N03/det/setAbsThick",this); - AbsThickCmd->SetGuidance("Set Thickness of the Absorber"); - AbsThickCmd->SetParameterName("Size",false); - AbsThickCmd->SetRange("Size>=0."); - AbsThickCmd->SetUnitCategory("Length"); - AbsThickCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - - GapThickCmd = new G4UIcmdWithADoubleAndUnit("/N03/det/setGapThick",this); - GapThickCmd->SetGuidance("Set Thickness of the Gap"); - GapThickCmd->SetParameterName("Size",false); - GapThickCmd->SetRange("Size>=0."); - GapThickCmd->SetUnitCategory("Length"); - GapThickCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - - SizeYZCmd = new G4UIcmdWithADoubleAndUnit("/N03/det/setSizeYZ",this); - SizeYZCmd->SetGuidance("Set tranverse size of the calorimeter"); - SizeYZCmd->SetParameterName("Size",false); - SizeYZCmd->SetRange("Size>0."); - SizeYZCmd->SetUnitCategory("Length"); - SizeYZCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - - NbLayersCmd = new G4UIcmdWithAnInteger("/N03/det/setNbOfLayers",this); - NbLayersCmd->SetGuidance("Set number of layers."); - NbLayersCmd->SetParameterName("NbLayers",false); - NbLayersCmd->SetRange("NbLayers>0 && NbLayers<500"); - NbLayersCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - - UpdateCmd = new G4UIcmdWithoutParameter("/N03/det/update",this); - UpdateCmd->SetGuidance("Update calorimeter geometry."); - UpdateCmd->SetGuidance("This command MUST be applied before \"beamOn\" "); - UpdateCmd->SetGuidance("if you changed geometrical value(s)."); - UpdateCmd->AvailableForStates(G4State_Idle); - - MagFieldCmd = new G4UIcmdWithADoubleAndUnit("/N03/det/setField",this); - MagFieldCmd->SetGuidance("Define magnetic field."); - MagFieldCmd->SetGuidance("Magnetic field will be in Z direction."); - MagFieldCmd->SetParameterName("Bz",false); - MagFieldCmd->SetUnitCategory("Magnetic flux density"); - MagFieldCmd->AvailableForStates(G4State_PreInit,G4State_Idle); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -ExN03DetectorMessenger::~ExN03DetectorMessenger() -{ - delete NbLayersCmd; - delete AbsMaterCmd; delete GapMaterCmd; - delete AbsThickCmd; delete GapThickCmd; - delete SizeYZCmd; delete UpdateCmd; - delete MagFieldCmd; - delete detDir; - delete N03Dir; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void ExN03DetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) -{ - if( command == AbsMaterCmd ) - { ExN03Detector->SetAbsorberMaterial(newValue);} - - if( command == GapMaterCmd ) - { ExN03Detector->SetGapMaterial(newValue);} - - if( command == AbsThickCmd ) - { ExN03Detector->SetAbsorberThickness(AbsThickCmd - ->GetNewDoubleValue(newValue));} - - if( command == GapThickCmd ) - { ExN03Detector->SetGapThickness(GapThickCmd->GetNewDoubleValue(newValue));} - - if( command == SizeYZCmd ) - { ExN03Detector->SetCalorSizeYZ(SizeYZCmd->GetNewDoubleValue(newValue));} - - if( command == NbLayersCmd ) - { ExN03Detector->SetNbOfLayers(NbLayersCmd->GetNewIntValue(newValue));} - - if( command == UpdateCmd ) - { ExN03Detector->UpdateGeometry(); } - - if( command == MagFieldCmd ) - { ExN03Detector->SetMagField(MagFieldCmd->GetNewDoubleValue(newValue));} -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/environments/g4py/tests/g4pytest/ExN03geom/__init__.py b/environments/g4py/tests/g4pytest/ExN03geom/__init__.py deleted file mode 100644 index ae5f5fd590..0000000000 --- a/environments/g4py/tests/g4pytest/ExN03geom/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._ExN03geom import * \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/ExN03geom/pyExN03geom.cc b/environments/g4py/tests/g4pytest/ExN03geom/pyExN03geom.cc deleted file mode 100644 index c2d10ffb5e..0000000000 --- a/environments/g4py/tests/g4pytest/ExN03geom/pyExN03geom.cc +++ /dev/null @@ -1,101 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyExN03geom.cc -// -// [ExN03geom] -// a site-module of Geant4Py -// -// geometry presented in ExN03 of Geant4 example -// -// 2005 Q -// ==================================================================== -#include -#include "G4RunManager.hh" -#include "ExN03DetectorConstruction.hh" - -using namespace boost::python; - -typedef ExN03DetectorConstruction XXX; - -// ==================================================================== -// thin wrappers -// ==================================================================== -namespace pyExN03geom { - -void Construct() -{ - G4RunManager* runMgr= G4RunManager::GetRunManager(); - runMgr-> SetUserInitialization(new ExN03DetectorConstruction); -} - -} - -using namespace pyExN03geom; - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_ExN03geom) { - class_ > - ("ExN03DetectorConstruction", "ExN03 detector") - // --- - .def("SetAbsorberMaterial", &XXX::SetAbsorberMaterial) - .def("SetAbsorberThickness", &XXX::SetAbsorberThickness) - .def("SetGapMaterial", &XXX::SetGapMaterial) - .def("SetGapThickness", &XXX::SetGapThickness) - .def("SetCalorSizeYZ", &XXX::SetCalorSizeYZ) - .def("SetNbOfLayers", &XXX::SetNbOfLayers) - .def("SetMagField", &XXX::SetMagField) - // --- - .def("GetWorldSizeX", &XXX::GetWorldSizeX) - .def("GetWorldSizeYZ", &XXX::GetWorldSizeYZ) - .def("GetCalorThickness", &XXX::GetCalorThickness) - .def("GetCalorSizeYZ", &XXX::GetCalorSizeYZ) - .def("GetNbOfLayers", &XXX::GetNbOfLayers) - .def("GetAbsorberMaterial", &XXX::GetAbsorberMaterial, - return_value_policy()) - .def("GetAbsorberThickness", &XXX::GetAbsorberThickness) - .def("GetGapMaterial", &XXX::GetGapMaterial, - return_value_policy()) - .def("GetGapThickness", &XXX::GetGapThickness) - .def("GetphysiWorld", &XXX::GetphysiWorld, - return_value_policy()) - .def("GetAbsorber", &XXX::GetAbsorber, - return_value_policy()) - .def("GetGap", &XXX::GetGap, - return_value_policy()) - // --- - .def("UpdateGeometry", &XXX::UpdateGeometry) - .def("PrintCalorParameters", &XXX::PrintCalorParameters) - ; - - // --- - def("Construct", Construct); -} - diff --git a/environments/g4py/tests/g4pytest/MCScore/mcscore.py b/environments/g4py/tests/g4pytest/MCScore/mcscore.py deleted file mode 100644 index eb9321cb64..0000000000 --- a/environments/g4py/tests/g4pytest/MCScore/mcscore.py +++ /dev/null @@ -1,136 +0,0 @@ -""" -Python module (Python3) - -This module provides classes and functions for scoring reactions - - [C] MCVertex: - [C] MCParticle: - [f] read_next_vertex(stream): - - Q, 2006 -""" -import string -from Geant4.hepunit import * - -# ================================================================== -# public symbols -# ================================================================== -__all__ = [ 'MCParticle', 'MCVertex', 'read_next_vertex' ] - - -# ================================================================== -# class definition -# ================================================================== - -# ------------------------------------------------------------------ -# MCParticle -# ------------------------------------------------------------------ -class MCParticle: - "MC particle" - def __init__(self, aname, aZ, aA, akE, apx, apy, apz): - self.name = aname - self.Z = aZ - self.A = aA - self.kineticE = akE - self.px = apx - self.py = apy - self.pz = apz - - def printout(self): - print("--- particle: %s, Z=%2d, A=%2d, kE=%g" % \ - (self.name, self.Z, self.A, self.kineticE/MeV)) - -# ------------------------------------------------------------------ -# MCVertex -# ------------------------------------------------------------------ -class MCVertex : - "MC vertex" - def __init__(self, ax, ay, az): - self.x = ax - self.y = ay - self.z = az - self.nparticle = 0 - self.particle_list = [] - - def append_particle(self, aparticle): - self.particle_list.append(aparticle) - self.nparticle= self.nparticle+1 - - def printout(self): - print("@@@ vertex: x=(%g,%g,%g) Nsec=%3d" % \ - (self.x/cm, self.y/cm, self.z/cm, self.nparticle)) - for p in self.particle_list: - p.printout() - - def dump_vertex(self, stream): - aline = "%g %g %g %d\n" % \ - (self.x/m, self.y/m, self.z/m, self.nparticle) - stream.write(aline) - for p in self.particle_list: - aline = " %s %d %d %g %g %g %g\n" % \ - (p.name, p.Z, p.A, p.kineticE/MeV, p.px/MeV, p.py/MeV, p.pz/MeV) - stream.write(aline) - - def __del__(self): - np = len(self.particle_list) - del self.particle_list[0:np] - - -# ================================================================== -# I/O interface -# ================================================================== -def read_next_vertex(stream): - "read next vertex from a file stream" - line= stream.readline() - if line == "": # EOF - return 0 - - # reading vertex - data = line.split() - x = string.atof(data[0]) * m - y = string.atof(data[1]) * m - z = string.atof(data[2]) * m - nsec = string.atoi(data[3]) - - vertex = MCVertex(x,y,z) - - # reading particles - for p in range(0, nsec): - data = stream.readline().split() - pname = data[0] - Z = string.atoi(data[1]) - A = string.atoi(data[2]) - kE = string.atof(data[3]) * MeV - px = string.atof(data[4]) * MeV - py = string.atof(data[5]) * MeV - pz = string.atof(data[6]) * MeV - - particle = MCParticle(pname, Z, A, kE, px, py, pz) - vertex.append_particle(particle) - - return vertex - - -# ================================================================== -# test -# ================================================================== -def test(): - f = open("reaction.dat") - f.seek(0) - - while(1): - vertex = read_next_vertex(f) - if vertex == 0: - break - vertex.printout() - del vertex - f.close() - print(">>> EOF") - - -# ================================================================== -# main -# ================================================================== -if __name__ == "__main__": - test() - diff --git a/environments/g4py/tests/g4pytest/MCScore/mcscorerootio.py b/environments/g4py/tests/g4pytest/MCScore/mcscorerootio.py deleted file mode 100644 index d3f1130356..0000000000 --- a/environments/g4py/tests/g4pytest/MCScore/mcscorerootio.py +++ /dev/null @@ -1,189 +0,0 @@ -""" -Python module - -This module provides ROOT IO interface for MCScore data - - [C] MCScoreROOTIO - [f] loop_tree(tfile, analyze_vertex): - - Q, 2006 -""" -from array import array -import string -from Geant4.hepunit import * -import mcscore -import ROOT - -# ================================================================== -# public symbols -# ================================================================== -__all__ = [ 'MCScoreROOTIO', 'loop_tree' ] - - -# ================================================================== -# class definition -# ================================================================== -# ------------------------------------------------------------------ -# MCScoreROOTIO -# ------------------------------------------------------------------ -class MCScoreROOTIO: - "ROOT IO interface for MCScore" - def __init__(self, bsize=250): - self.maxparticle = bsize # buffer size for #particles/vertex - - # ------------------------------------------------------------------ - def define_tree(self): - "define ROOT tree" - # defining tree header... - self.vtree = ROOT.TTree('vertex', 'mc vertex') - self.ptree = ROOT.TTree('particle', 'mc particle') - - # vertex... - self.a_x = array('d', [0.]); self.vtree.Branch('x', self.a_x, 'x/d') - self.a_y = array('d', [0.]); self.vtree.Branch('y', self.a_y, 'y/d') - self.a_z = array('d', [0.]); self.vtree.Branch('z', self.a_z, 'z/d') - - #global a_np, a_namelist, a_Z, a_A, a_ke, a_px, a_py, a_pz - self.a_np = array('i', [0]); self.ptree.Branch('np', self.a_np, 'np/i') - - self.a_namelist = array('c', self.maxparticle*10*['\0']) - # 10 characters/particle - self.ptree.Branch('namelist', self.a_namelist, 'namelist/C') - - self.a_Z = array('i', self.maxparticle*[0]) - self.ptree.Branch('Z', self.a_Z, 'Z[np]/I') - - self.a_A = array('i', self.maxparticle*[0]) - self.ptree.Branch('A', self.a_A, 'A[np]/i') - - self.a_ke = array('d', self.maxparticle*[0.]) - self.ptree.Branch('kE', self.a_ke, 'kE[np]/d') - - self.a_px = array('d', self.maxparticle*[0.]) - self.ptree.Branch('px', self.a_px, 'px[np]/d') - - self.a_py = array('d', self.maxparticle*[0.]) - self.ptree.Branch('py', self.a_py, 'py[np]/d') - - self.a_pz = array('d', self.maxparticle*[0.]) - self.ptree.Branch('pz', self.a_pz, 'pz[np]/d') - - # ------------------------------------------------------------------ - def fill_tree(self, vertex): - "fill vertex information to ROOT tree" - # ------------------------------------------------------------------ - def push_pname(i0, pname): # local function - n = len(pname) - for i in xrange(n): - self.a_namelist[i0+i] = pname[i] - self.a_namelist[i0+n] = ' ' - - self.a_x[0] = vertex.x - self.a_y[0] = vertex.y - self.a_z[0] = vertex.z - self.vtree.Fill() - - if vertex.nparticle > self.maxparticle: - raise """ - *** buffer overflow in #particles/vertex. - *** please increment buffersize in MCScoreROOTIO(bsize). - """, self.maxparticle - - idx_namelist = 0 - self.a_np[0] = vertex.nparticle - for ip in range(vertex.nparticle): - particle = vertex.particle_list[ip] - push_pname(idx_namelist, particle.name) - idx_namelist += (len(particle.name)+1) - self.a_Z[ip] = particle.Z - self.a_A[ip] = particle.A - self.a_ke[ip] = particle.kineticE - self.a_px[ip] = particle.px - self.a_py[ip] = particle.py - self.a_pz[ip] = particle.pz - - self.a_namelist[idx_namelist] = '\0' - self.ptree.Fill() - - -# ================================================================== -# functions -# ================================================================== -def loop_tree(tfile, analyze_vertex): - """ - loop ROOT tree in a ROOT file. - * analyze_vertex: user function : analyze_vertex(MCVertex) - """ - avtree = tfile.Get("vertex") - aptree = tfile.Get("particle") - - # reading vertex... - n_vertex = avtree.GetEntries() - for ivtx in xrange(n_vertex): - avtree.GetEntry(ivtx) - aptree.GetEntry(ivtx) - - # vertex - vertex = MCScore.MCVertex(avtree.x, avtree.y, avtree.z) - - # reading secondary particles... - nsec = aptree.np - namelist = aptree.namelist - pname = namelist.split() - for ip in xrange(nsec): - particle = MCScore.MCParticle(pname[ip], aptree.Z[ip], aptree.A[ip], - aptree.kE[ip], aptree.px[ip], - aptree.py[ip], aptree.pz[ip]) - vertex.append_particle(particle) - - analyze_vertex(vertex) - - return n_vertex - - -# ================================================================== -# test -# ================================================================== -def test_t2root(): - g = ROOT.TFile("reaction.root", 'recreate') - - rootio = MCScoreROOTIO() - rootio.define_tree() - - f = open("reaction.dat") - f.seek(0) - - while(1): - vertex = MCScore.read_next_vertex(f) - if vertex == 0: - break - - # filling ... - rootio.fill_tree(vertex) - - del vertex - - print ">>> EOF" - f.close() - - # closing ROOT file - g.Write() - g.Close() - -# ------------------------------------------------------------------ -def test_loop(): - def my_analysis(vertex): - vertex.printout() - - f = ROOT.TFile("reaction.root", 'read') - nv = loop_tree(f, my_analysis) - print "*** # of vertex= ", nv - - -# ================================================================== -# main -# ================================================================== -if __name__ == "__main__": - test_t2root() - test_loop() - diff --git a/environments/g4py/tests/g4pytest/MCScore/reaction.dat b/environments/g4py/tests/g4pytest/MCScore/reaction.dat deleted file mode 100644 index edc6e64f25..0000000000 --- a/environments/g4py/tests/g4pytest/MCScore/reaction.dat +++ /dev/null @@ -1,1842 +0,0 @@ -0 0 -0.0305023 38 - proton 1 1 1000 0 0 1696.04 - proton 1 1 129.268 63.2281 -276.735 -422.739 - proton 1 1 111.814 34.3858 -242.184 403.102 - proton 1 1 82.1695 -236.712 94.2294 309.895 - neutron 0 1 74.3269 110.42 -247.06 268.26 - proton 1 1 44.7926 -124.531 251.567 85.2512 - neutron 0 1 44.511 -167.561 97.6229 -219.126 - proton 1 1 21.6735 -109.453 -139.936 -97.8724 - neutron 0 1 20.6685 124.985 -151.837 -24.2931 - neutron 0 1 19.8292 180.072 41.4736 -59.2368 - neutron 0 1 17.1647 144.898 77.0015 74.9989 - proton 1 1 14.2603 86.8485 138.55 14.9869 - neutron 0 1 8.81332 -66.3887 39.6594 103.241 - neutron 0 1 8.72505 -120.6 -36.3695 24.586 - neutron 0 1 5.00497 5.93651 16.3492 -95.538 - pi0 0 0 4.70288 -5.35245 -35.4667 2.26739 - neutron 0 1 4.62225 49.0102 -63.7755 47.3061 - neutron 0 1 4.48452 -4.04534 56.6136 -72.2886 - neutron 0 1 4.4182 -8.41472 51.6727 74.7063 - neutron 0 1 4.33618 -29.8664 -13.4453 -84.2275 - neutron 0 1 4.26413 70.3882 -46.7754 29.8092 - neutron 0 1 3.93701 27.6721 76.9943 -26.8286 - neutron 0 1 2.90508 -32.7165 4.86698 66.1318 - neutron 0 1 2.7312 -27.372 -57.9427 32.1429 - neutron 0 1 1.93394 21.5104 56.0088 -6.17988 - neutron 0 1 1.14687 -7.1144 -43.8711 13.4591 - gamma 0 0 0.917356 0.279188 -0.173667 0.856409 - neutron 0 1 0.833069 -32.0686 -18.5144 -13.9629 - gamma 0 0 0.643895 -0.382244 0.169259 0.489736 - neutron 0 1 0.562189 11.9617 -20.913 21.8244 - neutron 0 1 0.48924 7.09163 1.57869 -29.4415 - neutron 0 1 0.300866 15.105 6.83708 -17.0455 - neutron 0 1 0.182086 11.2883 -13.1121 -6.54553 - neutron 0 1 0.176325 5.08395 15.104 8.79729 - gamma 0 0 0.157846 0.150406 0.0125644 -0.0462096 - alpha 2 4 3.8739 -114.48 112.613 55.7415 - alpha 2 4 2.39579 40.929 73.5402 103.84 - Yb160[0.0] 70 160 4.43207 75.8139 195.65 1129.72 -0 0 -0.0414305 27 - proton 1 1 1000 0 0 1696.04 - proton 1 1 430.313 460.692 127.735 874.137 - proton 1 1 222.668 -51.8758 -28.1707 681.134 - proton 1 1 96.9347 370.567 -210.029 -99.3302 - neutron 0 1 28.701 -189.926 7.78062 136.472 - proton 1 1 27.176 -181.127 -106.335 87.3004 - proton 1 1 11.5799 -64.529 132.284 -14.1802 - neutron 0 1 11.2564 50.4159 -33.6421 132.685 - neutron 0 1 10.3315 3.34717 139.549 5.99554 - neutron 0 1 6.91773 -5.99949 2.85351 -114.031 - neutron 0 1 3.31254 73.404 -26.0186 13.0595 - gamma 0 0 2.45819 0.13254 -2.02832 1.3824 - gamma 0 0 1.72781 -0.317077 1.03555 1.34626 - neutron 0 1 1.67011 -39.988 21.2127 -33.0475 - neutron 0 1 1.66598 40.8877 13.3526 35.8228 - gamma 0 0 1.49572 -0.70336 -0.474581 1.23176 - gamma 0 0 1.2594 -1.17736 0.313256 0.319032 - neutron 0 1 1.12877 -41.43 19.7894 3.78324 - neutron 0 1 0.825729 14.8311 -9.15606 -35.3347 - neutron 0 1 0.800743 -22.8961 18.2172 -25.4803 - neutron 0 1 0.795167 -30.7879 -20.4541 -11.3397 - gamma 0 0 0.62935 -0.107782 0.619122 -0.033952 - neutron 0 1 0.539156 20.9258 -3.69161 23.7048 - neutron 0 1 0.487198 -26.3143 7.93839 -12.6605 - neutron 0 1 0.344635 -13.1302 -8.77096 -19.96 - neutron 0 1 0.0888052 12.6351 2.12594 -1.64934 - Re178[0.0] 75 178 0.449053 -377.531 -46.0358 64.7126 -0 0 0.0137304 29 - proton 1 1 1000 0 0 1696.04 - pi0 0 0 375.32 16.1036 94.8819 482.619 - proton 1 1 237.972 299.56 272.31 582.5 - proton 1 1 27.2745 -206.634 -43.5755 85.6114 - proton 1 1 15.4573 21.7815 -111.35 -127.953 - neutron 0 1 10.7386 49.8314 1.65693 133.449 - proton 1 1 7.99409 -41.4639 -107.006 43.5384 - neutron 0 1 7.33562 -46.6519 -106.987 -14.6882 - neutron 0 1 5.37089 20.6709 0.372525 -98.4583 - neutron 0 1 5.24916 91.9101 28.0406 25.6452 - neutron 0 1 4.29006 -89.1402 -11.5712 0.347478 - neutron 0 1 4.20598 49.9591 17.5451 71.537 - neutron 0 1 4.10522 74.2517 39.7345 25.2775 - neutron 0 1 2.97932 -47.9919 40.1956 41.0915 - neutron 0 1 2.58721 -12.0844 66.3424 -17.9179 - neutron 0 1 2.4495 13.944 -34.9591 56.5009 - gamma 0 0 2.21931 -1.3602 -0.114166 -1.7499 - neutron 0 1 2.00405 -28.3684 53.9038 7.71419 - neutron 0 1 1.83414 39.9355 -33.4969 27.0754 - neutron 0 1 1.68767 29.4276 -10.1823 -46.9525 - gamma 0 0 1.66925 0.865172 1.27067 0.650592 - gamma 0 0 1.21644 0.985299 -0.121476 -0.702957 - neutron 0 1 1.14211 -38.6415 7.7864 24.3656 - gamma 0 0 0.80498 -0.352971 -0.694617 0.202266 - neutron 0 1 0.648926 15.3145 -23.766 -20.5056 - gamma 0 0 0.185356 0.170901 0.0612552 -0.0373822 - gamma 0 0 0.111191 0.0991238 -0.00678745 -0.0499174 - neutron 0 1 0.080779 9.87314 -1.11166 7.28603 - Os178[0.0] 76 178 0.713393 -221.995 -139.16 409.641 -0.00135391 -0.00702061 0.0354987 40 - proton 1 1 999.963 31.6597 -164.169 1687.73 - neutron 0 1 128.463 -326.916 -105.999 373.888 - neutron 0 1 78.283 98.6729 -378.353 18.5776 - neutron 0 1 62.8393 -339.742 -15.262 -79.8399 - neutron 0 1 48.5852 297.396 -4.14148 72.088 - pi0 0 0 46.1365 -79.9301 -23.0658 -87.5352 - proton 1 1 36.6064 -26.147 79.5878 251.029 - proton 1 1 28.0541 -122.356 -13.514 195.648 - neutron 0 1 27.9402 -229.321 -1.54266 -26.3318 - neutron 0 1 18.1933 26.3762 58.2524 -174.441 - neutron 0 1 17.5209 -178.907 25.7852 -23.6327 - neutron 0 1 15.8987 172.951 -14.5004 -2.47505 - proton 1 1 13.8158 107.516 79.6217 90.651 - proton 1 1 11.0929 134.547 -51.8965 -11.9696 - neutron 0 1 8.87635 -29.8733 76.7107 99.9083 - neutron 0 1 6.8636 -33.7157 -61.1989 89.7923 - neutron 0 1 6.52619 -70.7113 53.0923 66.9871 - neutron 0 1 6.30204 -15.2451 -45.3499 -97.9442 - neutron 0 1 5.47428 -65.487 -75.3991 -18.5277 - neutron 0 1 5.06741 8.46403 59.0701 77.3764 - neutron 0 1 4.38308 -48.7097 -55.8302 52.5922 - neutron 0 1 3.30057 39.8806 64.5173 -21.4509 - neutron 0 1 2.89532 0.187221 70.9393 -20.4117 - neutron 0 1 2.87371 -68.9515 16.6387 19.4209 - neutron 0 1 2.33978 -38.8737 -0.641931 -53.7648 - neutron 0 1 2.25958 -45.5363 44.1507 15.1103 - proton 1 1 2.15462 41.007 -33.7247 35.0564 - neutron 0 1 1.71017 8.57055 -26.6898 49.3027 - gamma 0 0 1.47882 -0.935624 -0.8663 0.749033 - neutron 0 1 1.35078 27.2873 -9.59266 41.2735 - gamma 0 0 1.30673 1.30569 0.041371 -0.0314311 - neutron 0 1 1.1184 42.8773 7.62906 -14.3601 - gamma 0 0 0.835305 0.308833 0.417564 0.654215 - neutron 0 1 0.65755 -30.6393 14.6345 9.11689 - neutron 0 1 0.467727 -6.32551 -7.57318 -27.9602 - gamma 0 0 0.379497 -0.315466 0.167079 -0.12878 - neutron 0 1 0.191734 8.99574 14.0381 -9.07407 - deuteron 1 2 0.507704 -23.2628 -28.2547 -23.7756 - alpha 2 4 16.7499 -11.4916 46.4755 -350.508 - Hf161[0.0] 72 161 6.78888 808.714 77.4594 1172.68 --0.00163755 -0.000756256 0.0334764 33 - proton 1 1 999.997 -34.1538 -19.0016 1695.58 - pi+ 1 0 486.487 -259.173 273.918 479.861 - neutron 0 1 72.0535 249.897 -82.284 267.152 - proton 1 1 16.0872 -56.2283 98.1551 132.857 - neutron 0 1 15.2527 135.61 -102.345 -5.46558 - neutron 0 1 10.5771 137.254 30.3542 -15.0849 - neutron 0 1 9.13129 1.06112 -84.1648 100.784 - neutron 0 1 7.37985 -85.1761 69.5671 -42.7507 - neutron 0 1 6.90285 9.7081 0.305195 -113.687 - neutron 0 1 6.30553 -27.6887 95.097 45.5913 - neutron 0 1 6.15617 -20.3296 -18.8435 104.105 - neutron 0 1 5.94086 -18.5245 -25.1564 101.109 - neutron 0 1 5.67959 8.89711 -100.769 21.7112 - neutron 0 1 5.66523 -25.9014 18.5439 98.3008 - neutron 0 1 5.60256 46.2258 -9.90915 -91.2377 - neutron 0 1 5.04722 -10.4482 -64.8291 -72.0964 - neutron 0 1 4.46668 65.1524 45.4704 45.8369 - neutron 0 1 4.14363 -56.5061 -67.1912 9.79842 - neutron 0 1 3.77434 51.2354 -49.6569 -44.8982 - neutron 0 1 3.38761 -21.2226 68.0027 -36.0897 - neutron 0 1 2.47239 40.9204 -52.2691 15.6696 - gamma 0 0 2.11587 -0.74022 0.349491 1.95111 - neutron 0 1 1.97753 31.8607 36.0281 -37.5076 - gamma 0 0 1.25071 0.608326 0.497684 0.972896 - gamma 0 0 0.831477 0.436272 -0.094289 0.70152 - gamma 0 0 0.756609 -0.50435 0.50359 0.253941 - gamma 0 0 0.420739 -0.412424 0.0741764 -0.0377647 - gamma 0 0 0.37844 -0.192928 -0.307849 0.105944 - neutron 0 1 0.327118 11.2105 -8.49943 20.4179 - gamma 0 0 0.239672 0.14148 0.107635 0.16075 - neutron 0 1 0.10021 3.41853 2.85435 12.9802 - alpha 2 4 2.1136 -29.6467 38.1687 -115.867 - Os172[0.0] 76 172 2.2462 -215.099 -130.679 809.988 -0 0 -0.0203515 32 - proton 1 1 1000 0 0 1696.04 - proton 1 1 268.845 449.941 -465.101 397.505 - proton 1 1 95.5122 -414.665 -121.41 40.8388 - neutron 0 1 81.122 -107.543 -217.131 316.715 - proton 1 1 71.6025 166.49 -38.048 332.153 - proton 1 1 64.3589 -107.31 216.925 257.57 - proton 1 1 60.4916 223.35 61.2405 252.069 - neutron 0 1 45.3978 -140.421 109.132 -236.097 - neutron 0 1 25.3327 45.7169 -214.611 -9.8537 - proton 1 1 22.4741 2.24056 -194.684 69.0802 - neutron 0 1 10.3341 33.5682 -124.812 53.1137 - neutron 0 1 8.65003 85.2646 -95.0151 5.60621 - neutron 0 1 8.31007 -12.7549 -36.5648 119.101 - neutron 0 1 8.07827 -106.441 0.620053 62.5723 - neutron 0 1 6.56177 -96.8161 -54.239 -7.63306 - neutron 0 1 6.10938 4.35927 91.5879 55.7702 - neutron 0 1 4.94328 66.868 9.27546 68.9647 - neutron 0 1 4.21448 -31.1466 -76.4044 33.6093 - neutron 0 1 3.54667 -35.621 64.1783 -35.91 - gamma 0 0 3.14129 -2.2987 0.576096 -2.062 - neutron 0 1 2.22437 6.49008 -63.0128 13.1183 - neutron 0 1 1.86527 -3.03393 58.0744 -11.2572 - neutron 0 1 0.799211 -11.0824 36.8501 4.65939 - neutron 0 1 0.767088 19.8639 -28.3916 -15.5366 - gamma 0 0 0.756483 -0.322803 -0.669528 -0.140698 - neutron 0 1 0.674893 -32.5124 -0.661824 14.5317 - neutron 0 1 0.51384 -15.3158 3.25853 26.8448 - neutron 0 1 0.458241 -19.6158 -16.5522 14.232 - neutron 0 1 0.222935 12.3447 13.733 -8.83102 - neutron 0 1 0.16529 -13.8712 -8.62285 -6.62313 - gamma 0 0 0.111394 0.0579524 0.0882334 -0.0355656 - W171[0.0] 74 171 3.77446 34.2175 1090.4 -108.037 -0 0 0.0121258 40 - proton 1 1 1000 0 0 1696.04 - proton 1 1 247.878 -345.406 356.486 529.349 - neutron 0 1 82.0244 72.8112 -222.938 325.361 - proton 1 1 78.9377 133.896 -39.2953 -367.272 - neutron 0 1 70.3247 -302.676 111.57 181.754 - proton 1 1 54.332 -311.883 -72.5492 48.7229 - neutron 0 1 40.2193 -194.501 -192.378 -48.531 - neutron 0 1 23.4728 206.703 34.142 -27.7056 - neutron 0 1 22.6246 -45.4347 150.357 135.48 - neutron 0 1 18.3625 34.2388 166.628 -76.847 - neutron 0 1 18.305 108.134 -121.708 -90.7018 - proton 1 1 16.1053 112.977 102.117 85.3824 - proton 1 1 13.7549 -21.376 -34.7101 156.01 - neutron 0 1 12.7379 -63.0411 92.4069 107.635 - neutron 0 1 10.8797 59.7578 -104.964 77.293 - neutron 0 1 9.05671 -89.85 -1.21229 95.0067 - neutron 0 1 6.22837 82.7297 26.0846 64.9469 - neutron 0 1 5.59348 64.2011 62.4248 50.2348 - neutron 0 1 5.45178 65.8184 33.5883 69.3837 - neutron 0 1 4.79177 -54.6573 60.2782 -49.0556 - neutron 0 1 4.51501 -49.1752 65.407 42.5253 - neutron 0 1 4.38322 37.8995 5.29383 82.4104 - neutron 0 1 3.62314 12.7078 80.7525 -11.7907 - proton 1 1 3.32888 -31.2236 -8.79364 -72.1501 - neutron 0 1 2.66629 33.5545 -50.5271 36.5859 - neutron 0 1 2.43237 -53.0857 -19.5891 37.0788 - gamma 0 0 2.10076 1.75116 -0.490854 -1.05152 - gamma 0 0 1.6264 -0.710273 -0.227909 -1.44525 - gamma 0 0 1.56994 0.512778 -0.810091 -1.24319 - gamma 0 0 1.33113 -0.316479 -1.28587 -0.135248 - neutron 0 1 0.968281 18.2085 -36.2716 -13.164 - neutron 0 1 0.79996 26.9992 -14.117 23.9922 - neutron 0 1 0.594598 -3.67941 29.3798 15.5232 - gamma 0 0 0.444307 0.351399 -0.0834007 -0.258789 - gamma 0 0 0.39268 0.25319 -0.299968 0.0105509 - neutron 0 1 0.0488556 2.95668 -7.93859 4.47721 - alpha 2 4 0.589452 -7.65497 -53.6039 -38.2444 - deuteron 1 2 1.97403 6.21242 77.0241 -37.9161 - deuteron 1 2 0.0734221 -15.1024 -6.49413 -2.27441 - Yb161[0.0] 70 161 2.02352 507.099 -463.654 366.66 -0 0 0.0326312 6 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 614.196 -667.103 88.8057 1038.5 - proton 1 1 369.711 676.64 -187.141 581.035 - gamma 0 0 0.99598 0.226343 0.564437 0.788769 - neutron 0 1 0.208848 -7.62567 -6.55389 17.0702 - Au195[0.0] 79 195 0.0394541 -2.13538 104.324 58.6443 -0 0 -0.0496447 23 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 501.696 -633.095 52.7984 889.3 - neutron 0 1 131.814 137.561 409.46 280.161 - neutron 0 1 98.3359 -17.7252 -415.387 -146.954 - proton 1 1 48.8339 242.233 -117.686 146.618 - neutron 0 1 37.3357 214.734 11.0134 159.124 - neutron 0 1 6.67105 70.8053 -85.4504 -16.2821 - neutron 0 1 5.23053 18.9688 8.76373 -97.0546 - neutron 0 1 4.11501 -49.6551 -72.6474 -2.51009 - neutron 0 1 3.11687 17.5502 -19.4726 -71.969 - neutron 0 1 2.59323 -61.1317 33.8013 0.352055 - proton 1 1 2.31383 34.2741 -25.6483 50.1478 - neutron 0 1 1.76351 52.4441 15.6818 -17.9071 - neutron 0 1 1.35406 43.6426 18.0308 -17.7906 - neutron 0 1 1.15083 -1.34473 24.3595 39.6066 - neutron 0 1 0.782915 -23.7162 -13.0148 27.2024 - neutron 0 1 0.767871 31.6893 11.422 17.5739 - neutron 0 1 0.72959 -36.9167 -2.02643 -2.14002 - gamma 0 0 0.681846 -0.339163 -0.481692 -0.343302 - gamma 0 0 0.572155 0.248476 0.231396 0.460518 - neutron 0 1 0.457795 -8.40569 -3.32 -27.9068 - deuteron 1 2 6.47685 -62.4645 -101.112 101.058 - Ir178[0.0] 77 178 0.671751 30.6426 270.686 385.292 -0 0 -0.0443798 20 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 380.748 -384.838 -442.484 718.716 - neutron 0 1 175.673 475.417 -97.1996 354.266 - proton 1 1 139.475 -164.127 76.7665 498.351 - neutron 0 1 28.9198 -59.75 211.721 82.3689 - neutron 0 1 14.7796 133.273 -91.2448 43.6339 - pi0 0 0 12.7887 4.24767 -39.2528 -45.355 - gamma 0 0 2.86286 -0.916605 1.80947 -2.0203 - neutron 0 1 2.66593 45.6257 -8.17381 -53.5558 - gamma 0 0 2.26418 -2.26198 0.00871487 0.0993462 - neutron 0 1 2.10388 53.636 2.63942 32.7736 - gamma 0 0 1.95145 -0.339457 -1.76596 -0.757828 - neutron 0 1 1.17094 40.7089 -20.0195 11.9884 - neutron 0 1 1.15343 -43.2954 3.70576 16.7496 - gamma 0 0 0.946093 0.0748376 0.139229 -0.932795 - neutron 0 1 0.768556 28.192 25.4834 -0.783382 - neutron 0 1 0.660616 20.149 -25.8237 12.9991 - neutron 0 1 0.492457 -9.94975 17.5447 22.7776 - neutron 0 1 0.297173 6.47431 4.88728 22.1971 - Au185[0.0] 79 185 0.481616 -142.321 381.262 -17.4798 -0 0 -0.0368631 36 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 167.212 -324.339 -17.6075 486.484 - proton 1 1 155.718 -74.1016 -173.07 530.108 - neutron 0 1 83.5892 192.247 -86.1371 345.953 - neutron 0 1 52.1651 -226.414 165.249 148.914 - proton 1 1 51.745 192.436 -107.869 226.079 - proton 1 1 43.0557 -77.5507 260.712 -93.0848 - neutron 0 1 26.3037 125.977 76.8098 168.375 - proton 1 1 25.4415 216.731 34.6916 -14.6077 - proton 1 1 23.2238 -150.59 -144.491 23.7683 - neutron 0 1 21.2637 152.591 13.8609 -130.128 - neutron 0 1 18.5346 -140.355 -120.712 30.022 - neutron 0 1 16.5786 -76.3541 -136.804 82.9634 - neutron 0 1 16.2944 112.433 126.841 46.4214 - neutron 0 1 14.9044 -6.28885 105.397 -130.695 - proton 1 1 13.5456 -142.402 -72.2578 10.1437 - neutron 0 1 11.0073 121.958 -74.0681 -21.1079 - neutron 0 1 10.6465 131.778 -17.13 49.6056 - neutron 0 1 5.55535 -33.9925 -29.7092 91.8258 - neutron 0 1 4.99786 -73.6637 13.3286 61.7465 - neutron 0 1 4.5916 64.7392 17.7728 -64.3605 - proton 1 1 4.36809 -3.02326 -18.6826 88.6443 - neutron 0 1 4.09599 65.1471 -38.6807 -44.4222 - neutron 0 1 3.54628 72.8602 9.08733 35.8513 - neutron 0 1 2.97438 24.7329 -8.51819 70.0987 - neutron 0 1 2.87897 11.3788 54.2681 -48.4122 - neutron 0 1 2.02636 44.4185 -23.3538 35.9653 - neutron 0 1 0.861151 1.89424 26.1997 -30.4786 - gamma 0 0 0.750641 0.0245751 -0.0376836 -0.749291 - gamma 0 0 0.284971 -0.0713801 -0.0311435 0.274123 - neutron 0 1 0.183149 -9.26623 11.8143 10.8975 - gamma 0 0 0.179586 0.00361654 -0.151333 0.0966238 - neutron 0 1 0.121478 -12.787 -1.78605 -7.84805 - gamma 0 0 0.0956871 0.0751168 -0.0310095 0.0505163 - neutron 0 1 0.0807492 -6.28183 0.903879 -10.5578 - Ta168[0.0] 73 168 0.37542 -173.945 154.192 -251.801 -0 0 -0.0437085 31 - proton 1 1 1000 0 0 1696.04 - proton 1 1 198.425 -338.856 165.488 519.15 - neutron 0 1 162.289 -70.8761 45.8032 569.367 - proton 1 1 154.519 351.789 335.903 277.941 - neutron 0 1 97.3337 56.4374 298.943 315.951 - proton 1 1 60.8447 10.8578 -312.932 140.838 - neutron 0 1 48.7806 -213.841 127.506 -179.05 - proton 1 1 42.6702 -134.595 -149.482 203.551 - neutron 0 1 7.94864 -78.1525 80.4564 49.1799 - neutron 0 1 5.68805 54.8408 -60.5116 63.6536 - neutron 0 1 5.43137 -88.6395 18.4129 -45.1636 - neutron 0 1 5.37632 -36.3907 69.1716 -63.4249 - neutron 0 1 5.20933 -50.2579 -83.7889 -16.4227 - proton 1 1 3.69581 -69.3681 -44.7267 11.6879 - neutron 0 1 3.69326 39.4531 30.4228 -66.8705 - neutron 0 1 2.91473 -71.411 19.406 -3.08962 - neutron 0 1 2.69104 67.1819 -9.43717 -21.4846 - neutron 0 1 2.58243 -44.8661 52.851 7.29349 - gamma 0 0 2.0054 -1.02152 0.942247 1.44579 - neutron 0 1 1.89477 19.477 -48.1094 29.5 - neutron 0 1 1.40956 -24.9502 -41.8471 -16.6442 - neutron 0 1 1.31738 -34.125 -0.933494 36.22 - neutron 0 1 1.30512 -35.6927 -12.875 -31.8506 - neutron 0 1 1.02288 1.48376 -5.59093 -43.4709 - gamma 0 0 0.774287 -0.621982 -0.404922 0.220675 - gamma 0 0 0.701166 -0.353058 -0.257974 -0.548118 - gamma 0 0 0.344291 -0.268497 -0.0034541 0.215485 - neutron 0 1 0.166452 10.9655 -9.4963 -10.1188 - neutron 0 1 0.0927631 8.83138 -6.26341 7.55639 - neutron 0 1 0.041252 8.63055 -0.229227 1.72651 - Re173[0.0] 75 173 2.02773 664.341 -458.42 -41.3202 --2.77519e-05 0.000305943 -0.0311234 24 - proton 1 1 999.994 -5.83293 64.3035 1694.8 - pi0 0 0 376.177 268.195 -76.9212 406.465 - proton 1 1 186.956 -430.961 125.221 429.389 - neutron 0 1 105.862 -368.386 -150.956 227.242 - proton 1 1 29.9689 66.0746 67.3479 -219.624 - proton 1 1 13.5651 -0.11873 77.2821 -140.239 - neutron 0 1 4.98436 -48.8882 -55.9655 -62.2005 - neutron 0 1 4.41978 -37.0878 -31.7721 -77.0707 - gamma 0 0 3.76735 -3.24109 -1.67531 0.938936 - neutron 0 1 3.35204 -56.2718 -56.0673 0.300571 - neutron 0 1 2.45489 38.1581 47.4682 30.1629 - gamma 0 0 2.39148 -0.225075 2.23395 0.823379 - neutron 0 1 2.13739 -47.3442 -41.7233 6.22113 - neutron 0 1 1.94074 -58.7208 12.3363 -7.09651 - neutron 0 1 1.74815 45.4693 23.6586 25.7074 - neutron 0 1 0.753432 23.8939 23.6438 16.9239 - gamma 0 0 0.704592 -0.494891 0.0599755 0.497932 - neutron 0 1 0.496559 -8.57311 -2.4747 29.2185 - neutron 0 1 0.42369 15.6739 4.85999 22.9578 - neutron 0 1 0.371686 -0.302659 -24.871 8.9401 - gamma 0 0 0.308685 -0.240306 0.0864206 -0.17341 - neutron 0 1 0.148709 15.8089 0.425494 5.41869 - neutron 0 1 0.129239 8.42193 -12.4759 4.03693 - Ir181[0.0] 77 181 3.91321 573.328 134.583 985.962 --0.00110813 -0.000140969 0.0169009 37 - proton 1 1 999.996 -52.7477 -6.71022 1695.2 - neutron 0 1 201.376 158.87 -134.116 612.974 - neutron 0 1 88.0073 -93.8074 386.855 -121.102 - pi0 0 0 86.7384 73.9872 -108.732 116.799 - neutron 0 1 41.2707 -126.17 -244.225 60.7598 - proton 1 1 40.947 -53.4807 83.9894 261.918 - proton 1 1 22.7592 103.771 91.1056 155.428 - neutron 0 1 18.1833 -1.80291 -178.089 52.7317 - neutron 0 1 15.6817 8.18895 50.4707 164.619 - neutron 0 1 13.4706 48.7156 96.6262 117.408 - neutron 0 1 12.515 -92.0716 -100.221 71.7808 - neutron 0 1 11.069 103.889 74.1752 68.0282 - proton 1 1 10.3926 57.1226 -127.421 10.5379 - neutron 0 1 9.4002 72.5204 108.45 -27.0548 - neutron 0 1 7.79437 92.6717 77.0608 -13.4534 - neutron 0 1 5.66001 -53.0261 86.0196 21.3728 - proton 1 1 5.26062 7.61965 -38.9595 91.2336 - neutron 0 1 5.18717 67.1992 63.9453 34.1984 - neutron 0 1 3.75774 1.08246 -74.2755 -39.4636 - neutron 0 1 3.47035 23.8339 41.203 65.3264 - neutron 0 1 3.01985 65.1156 -30.8164 -22.2289 - neutron 0 1 2.68308 20.0122 -17.2049 65.974 - neutron 0 1 2.43132 -41.2 0.202518 -53.6396 - proton 1 1 2.26682 -59.0215 -21.3955 17.8219 - neutron 0 1 1.57312 52.3954 -12.0678 8.22569 - neutron 0 1 1.37143 18.1549 -14.9155 -45.0211 - neutron 0 1 1.05826 21.7819 22.6523 -31.6568 - neutron 0 1 1.04507 35.2098 3.85233 -26.6521 - neutron 0 1 1.00273 -29.1913 -13.2861 -29.2682 - neutron 0 1 0.681787 -0.837777 -28.3836 21.8014 - gamma 0 0 0.245054 -0.0486103 -0.197172 -0.137157 - neutron 0 1 0.229053 -16.7395 -6.80746 10.1942 - neutron 0 1 0.160768 10.1905 -13.461 -4.13361 - alpha 2 4 3.0034 20.87 119.892 87.1165 - alpha 2 4 5.93333 -29.5652 -133.069 160.268 - deuteron 1 2 10.874 -77.2701 164.382 -88.979 - Yb158[0.0] 70 158 0.794316 -441.719 -179.949 -78.5301 -0 0 -0.0412204 37 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 201.802 -50.9944 132.156 632.354 - proton 1 1 141.977 353.518 114.079 385.479 - proton 1 1 96.5286 -319.291 -97.1344 -281.205 - neutron 0 1 91.9858 -45.8618 -346.489 243.221 - proton 1 1 44.3286 169.764 29.697 235.474 - proton 1 1 29.6873 111.643 -168.941 -124.842 - neutron 0 1 24.4702 -72.6475 195.361 -56.0162 - neutron 0 1 19.6147 -81.4422 163.668 61.8324 - neutron 0 1 12.6568 120.297 -63.6385 -73.6386 - proton 1 1 11.6994 40.7513 129.782 59.8953 - neutron 0 1 11.409 105.383 -94.3401 -39.5413 - neutron 0 1 9.92673 126.33 -50.0223 17.0477 - neutron 0 1 9.80127 -24.5911 28.1831 -130.824 - neutron 0 1 6.96757 88.4137 -56.0768 46.6897 - neutron 0 1 5.3538 -39.9604 -86.4103 32.0248 - neutron 0 1 2.4535 -25.388 61.4098 -14.1686 - neutron 0 1 2.16569 55.2227 29.4424 12.5664 - neutron 0 1 1.93892 -35.0022 43.2835 -23.4227 - neutron 0 1 1.91645 6.3227 -57.9031 -14.5666 - neutron 0 1 1.87941 47.3163 -9.44006 -34.7454 - neutron 0 1 1.76413 -53.1241 20.482 8.74468 - gamma 0 0 1.54232 1.19168 0.413206 -0.887644 - neutron 0 1 1.53609 35.6211 32.93 23.1436 - neutron 0 1 1.17776 -1.49529 -46.9615 -2.63281 - proton 1 1 1.16222 22.8004 40.5238 -4.50207 - neutron 0 1 1.15222 30.9007 5.23745 34.4125 - neutron 0 1 0.895703 -5.55801 -38.8901 11.8581 - neutron 0 1 0.570148 7.7613 30.222 -9.90473 - neutron 0 1 0.423501 -27.3851 4.48066 5.09635 - neutron 0 1 0.395704 25.871 -1.1757 8.54669 - neutron 0 1 0.26885 1.17686 19.0363 -11.8959 - gamma 0 0 0.16558 -0.164198 0.0211886 -0.00260392 - neutron 0 1 0.0925129 1.60908 13.0783 -0.46998 - deuteron 1 2 7.30129 17.8425 80.4085 143.73 - deuteron 1 2 5.28051 22.3732 -131.259 45.8991 - Hf163[0.0] 72 163 2.10262 -609.206 74.7887 511.288 -0 0 0.0346371 31 - proton 1 1 1000 0 0 1696.04 - proton 1 1 169.941 356.047 -216.935 417.075 - neutron 0 1 165.626 -289.941 450.58 227.105 - neutron 0 1 95.8639 41.0174 152.748 405.36 - proton 1 1 62.223 -157.669 87.0597 296.98 - neutron 0 1 45.8574 -89.83 47.1957 -279.246 - pi+ 1 0 43.1584 57.1888 -101.172 20.0904 - neutron 0 1 30.424 -188.113 68.3499 134.306 - proton 1 1 14.8187 -56.3786 -148.954 -51.5909 - neutron 0 1 5.73917 -33.2674 11.7251 97.8437 - neutron 0 1 5.36648 6.91662 100.173 5.53984 - neutron 0 1 4.54705 17.8838 -71.0103 56.594 - neutron 0 1 4.12983 -47.066 31.774 -67.4741 - neutron 0 1 3.40259 -61.7575 50.899 -0.887969 - neutron 0 1 3.37329 -26.7338 27.7521 -69.7521 - neutron 0 1 2.87309 51.8533 -51.0948 -10.3789 - neutron 0 1 2.79856 -39.8925 -17.3253 58.0957 - gamma 0 0 2.74698 1.63515 1.78386 1.3 - neutron 0 1 2.38065 -11.5451 64.0188 -15.7329 - neutron 0 1 2.31504 -49.1682 39.1113 -20.2093 - neutron 0 1 1.01988 -28.1844 -14.2559 30.3305 - neutron 0 1 0.995722 -12.7493 35.6096 -21.0119 - neutron 0 1 0.845014 -24.2326 9.9018 30.0556 - neutron 0 1 0.751326 17.1785 8.00043 32.4546 - gamma 0 0 0.619064 -0.387055 0.0272165 -0.482377 - neutron 0 1 0.533251 1.53984 -5.5114 -31.1382 - neutron 0 1 0.479384 25.6014 -12.3233 -9.68299 - neutron 0 1 0.294771 -9.18503 -17.8262 -12.3232 - gamma 0 0 0.120834 -0.0864513 0.0560964 -0.0630886 - neutron 0 1 0.0488459 2.29152 -2.15492 9.04961 - Os173[0.0] 76 173 2.46283 547.039 -528.207 463.834 -0.000252546 0.000401177 -0.00447463 48 - proton 1 1 999.997 24.9339 39.6083 1695.39 - proton 1 1 135.827 -505.988 -23.8645 -129.389 - neutron 0 1 102.136 280.055 210.652 282.053 - neutron 0 1 55.2627 180.988 -47.9951 268.029 - neutron 0 1 53.2529 169.537 -261.875 -74.7225 - neutron 0 1 51.2843 263.138 -91.7253 146.1 - proton 1 1 37.9851 -202.168 -23.1408 176.964 - proton 1 1 30.172 -86.3329 -217.518 52.5533 - neutron 0 1 19.7998 -180.546 3.29283 70.6467 - neutron 0 1 16.5053 54.8546 138.388 95.5395 - neutron 0 1 16.1691 100.68 117.565 -81.7749 - neutron 0 1 14.8976 -37.0504 -131.631 -97.556 - proton 1 1 13.2451 -43.6368 151.153 16.7096 - neutron 0 1 12.5253 51.9541 69.8133 126.966 - neutron 0 1 11.3844 24.0987 130.076 -63.4187 - neutron 0 1 8.16412 110.586 -49.1864 -27.5595 - proton 1 1 7.7937 -31.2677 -22.1617 -114.966 - proton 1 1 7.27366 -7.69796 32.4398 -112.208 - neutron 0 1 6.56131 71.929 75.7952 -38.1303 - neutron 0 1 6.34574 71.8212 16.3915 -80.8566 - neutron 0 1 5.94172 -25.2184 88.1224 52.9061 - neutron 0 1 5.80637 4.70485 104.51 -0.389702 - neutron 0 1 5.73374 -36.4166 -28.4565 93.1203 - neutron 0 1 5.53046 -9.37639 -88.4225 -50.1657 - neutron 0 1 5.22839 21.6799 3.85769 96.7846 - neutron 0 1 4.30841 -63.8047 -25.6493 58.1869 - neutron 0 1 3.95636 -11.4137 -61.8011 -59.1652 - proton 1 1 3.4614 5.62365 47.9215 64.6479 - gamma 0 0 3.45505 -2.44251 -2.44224 0.0832732 - neutron 0 1 3.27045 -64.5869 8.58041 43.7175 - neutron 0 1 2.8303 16.3092 -52.0021 48.5418 - neutron 0 1 2.14588 -36.3436 43.2877 29.0227 - gamma 0 0 1.83862 1.59217 0.426592 0.814588 - neutron 0 1 1.60956 47.1863 -12.0738 25.59 - gamma 0 0 1.45483 -1.16383 -0.858746 -0.156765 - neutron 0 1 1.21875 44.4695 4.59652 17.1176 - neutron 0 1 1.02136 -17.4697 -29.7755 -26.9914 - neutron 0 1 0.945017 28.6711 -20.7135 -22.9264 - gamma 0 0 0.371024 -0.280903 -0.122064 0.209411 - neutron 0 1 0.239261 -9.32373 9.853 16.2987 - gamma 0 0 0.118366 -0.0736628 0.0423379 -0.0824121 - neutron 0 1 0.0638138 6.99408 -7.95153 2.78829 - neutron 0 1 0.0331735 0.498623 -4.11124 6.72217 - alpha 2 4 2.65311 10.9303 74.5957 -118.75 - triton 1 3 15.4248 -270.501 55.98 102.944 - He3 2 3 3.20395 52.9019 -73.3538 -99.1571 - alpha 2 4 20.9291 -187.701 316.326 145.49 - Dy147[0.0] 66 147 3.40887 234.523 -387.232 853.198 -0 0 -0.0476242 15 - proton 1 1 1000 0 0 1696.04 - proton 1 1 713.946 357.566 -150.345 1303.46 - neutron 0 1 169 -26.4757 440.351 389.261 - neutron 0 1 41.0582 -254 84.2138 -85.0383 - neutron 0 1 5.38567 -74.7964 67.4483 -2.36788 - neutron 0 1 3.94753 -37.9407 -9.55971 76.8285 - gamma 0 0 1.87704 1.81415 0.240256 -0.417613 - gamma 0 0 1.22448 -0.747418 -0.40017 -0.883512 - neutron 0 1 0.487567 -15.3857 -3.86069 -25.784 - neutron 0 1 0.335593 14.4446 19.9854 -4.76172 - neutron 0 1 0.26718 -7.68413 -4.99212 20.4492 - gamma 0 0 0.209232 -0.100997 0.168607 -0.0717573 - gamma 0 0 0.0873146 -0.003785 0.0169188 -0.0855761 - neutron 0 1 0.0293857 5.42541 -5.00873 0.835437 - Au189[0.0] 79 189 0.551522 37.8862 -438.26 24.6123 -0 0 -0.0317025 20 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 260.558 43.2663 -527.592 526.58 - pi0 0 0 253.506 -184.212 235.233 208.402 - proton 1 1 196.96 -63.1527 -34.3957 635.001 - proton 1 1 28.8785 -60.1655 -153.185 167.153 - neutron 0 1 5.8167 -5.53544 101.843 23.6973 - neutron 0 1 4.71979 -62.3723 0.361671 70.7174 - neutron 0 1 4.0151 -19.1691 29.3354 -79.5802 - neutron 0 1 2.79158 26.8323 6.86109 -66.9813 - gamma 0 0 2.50272 -0.973648 2.21766 -0.630556 - gamma 0 0 2.17967 0.653551 1.33137 1.59728 - neutron 0 1 2.0815 -3.39914 -43.5973 44.76 - neutron 0 1 1.35194 -12.9766 -17.7383 45.379 - neutron 0 1 0.73657 -11.4798 -5.07904 -35.0296 - neutron 0 1 0.509472 6.53565 -10.4887 -28.3707 - neutron 0 1 0.267383 -5.37885 -4.98335 21.1838 - gamma 0 0 0.184739 -0.0944509 0.106261 0.117967 - neutron 0 1 0.0742412 0.999984 7.89365 -8.72953 - neutron 0 1 0.044622 7.64152 -3.00157 4.0559 - Pt184[0.0] 78 184 0.926794 342.982 414.878 166.713 -0 0 0.00269011 16 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 339.902 -69.3022 -19.4106 865.491 - proton 1 1 308.532 -84.3337 -208.541 789.661 - neutron 0 1 106.936 164.997 411.465 125.912 - proton 1 1 65.9581 47.2276 5.41116 354.773 - proton 1 1 44.6071 -45.1182 122.576 -261.986 - neutron 0 1 17.3158 -85.6533 86.6516 -134.14 - proton 1 1 14.4829 -154.512 -57.6487 13.7906 - neutron 0 1 11.8917 85.9194 -122.757 6.01301 - proton 1 1 10.9894 135.499 40.0468 -27.9113 - neutron 0 1 1.8661 31.7599 47.7081 15.0129 - neutron 0 1 0.844506 -2.26688 -6.6745 39.2169 - gamma 0 0 0.65654 -0.478346 -0.353859 -0.277513 - neutron 0 1 0.354081 17.8887 10.634 15.2447 - gamma 0 0 0.192957 -0.182744 0.055204 -0.0281006 - Re186[0.0] 75 186 0.312594 -41.4448 -309.163 -104.735 -0 0 0.00247784 8 - proton 1 1 1000 0 0 1696.04 - proton 1 1 820.319 496.627 466.11 1322.27 - neutron 0 1 169.302 -404.829 -305.077 299.741 - gamma 0 0 0.718764 0.196566 0.106531 -0.683106 - gamma 0 0 0.651187 0.399552 0.0263312 -0.513526 - gamma 0 0 0.521136 0.506481 -0.0994891 -0.0718451 - gamma 0 0 0.181355 0.025827 0.0183782 0.178564 - Au196[0.0] 79 196 0.110207 -92.9253 -161.083 75.1203 -0 0 -0.0348524 35 - proton 1 1 1000 0 0 1696.04 - proton 1 1 274.999 199.932 285.558 685.68 - proton 1 1 157.982 -378.089 -292.351 -304.956 - neutron 0 1 42.3118 -116.184 259.015 26.6915 - proton 1 1 39.8791 -50.5824 -271.191 -17.9416 - proton 1 1 26.539 -4.33551 -60.3032 216.45 - pi- -1 0 17.0072 -7.80245 32.2012 -62.7602 - neutron 0 1 14.7612 158.147 -51.1572 18.1301 - neutron 0 1 13.6796 65.5665 77.1457 -125.069 - neutron 0 1 13.5004 -76.7313 108.862 -88.3893 - neutron 0 1 12.7911 13.386 -121.479 96.2465 - proton 1 1 12.3118 32.2918 -135.53 62.0016 - neutron 0 1 10.9819 -35.7318 -60.7307 125.667 - neutron 0 1 6.45457 -47.0395 -48.1877 -87.3834 - neutron 0 1 5.81287 -75.5367 -72.2979 -4.91435 - neutron 0 1 2.56832 1.24211 -46.8024 51.3888 - gamma 0 0 2.55674 -0.473685 -2.3848 0.79074 - neutron 0 1 2.36112 45.8553 47.1471 -10.8108 - gamma 0 0 1.87357 -0.226288 -0.911662 -1.62109 - neutron 0 1 1.73283 -0.193021 51.335 -24.9782 - gamma 0 0 1.6915 0.322679 -1.27561 1.06295 - neutron 0 1 1.59531 22.9717 -22.1777 -44.5062 - gamma 0 0 1.31435 1.05374 -0.78317 -0.0616173 - neutron 0 1 1.20353 31.0943 11.8393 34.0001 - neutron 0 1 0.85938 -34.2251 0.387282 -21.0741 - neutron 0 1 0.749642 -17.8662 -24.2894 -22.362 - neutron 0 1 0.382571 7.43482 -23.4592 -10.6507 - neutron 0 1 0.309556 -15.5561 -7.86498 16.6716 - neutron 0 1 0.246908 -16.4571 9.19348 10.4248 - neutron 0 1 0.155372 8.99377 13.2434 -5.9761 - neutron 0 1 0.107391 0.626226 11.1849 -8.73612 - gamma 0 0 0.0963916 0.0144924 0.0240692 -0.0922063 - neutron 0 1 0.0144331 2.05263 -1.63366 4.49887 - alpha 2 4 0.42224 -53.1114 12.5426 13.0297 - W168[0.0] 74 168 5.12352 339.158 325.132 1175.59 -0 0 -0.0396177 30 - proton 1 1 1000 0 0 1696.04 - proton 1 1 374.274 576.797 -128.643 702.266 - proton 1 1 146.145 -35.7216 523.054 144.031 - neutron 0 1 100.512 -405.23 -171.058 74.208 - proton 1 1 50.2151 57.5754 -164.931 257.362 - proton 1 1 35.5228 -80.4978 22.1024 246.888 - neutron 0 1 22.9198 7.37518 -205.804 34.4213 - neutron 0 1 19.9793 125.153 94.243 -115.75 - proton 1 1 11.1096 123.718 -19.7427 72.6308 - neutron 0 1 10.4945 27.586 -101.667 93.4534 - neutron 0 1 9.4769 84.1952 -75.6791 71.2881 - proton 1 1 7.82555 -59.0713 100.865 -32.9106 - neutron 0 1 7.37483 99.8275 7.87543 62.3308 - neutron 0 1 7.25246 -88.0083 26.2466 -72.4333 - neutron 0 1 6.0962 4.22579 -53.9697 -92.5319 - neutron 0 1 2.63656 -60.4246 33.0538 -14.7549 - neutron 0 1 2.51449 -12.9268 -8.72943 -66.9931 - neutron 0 1 2.39517 48.4474 13.0033 44.6133 - neutron 0 1 2.14056 61.4752 -13.1893 -8.59199 - neutron 0 1 1.93202 32.5024 50.362 -6.44318 - neutron 0 1 1.45958 -10.3497 -43.8878 -26.676 - neutron 0 1 1.40814 -31.7593 -10.3766 -39.1375 - neutron 0 1 0.956485 -6.69461 41.7933 -2.60341 - neutron 0 1 0.92684 4.36924 37.3063 -18.2116 - gamma 0 0 0.828924 0.293898 0.154085 0.759603 - neutron 0 1 0.637538 -10.9649 11.9302 30.5919 - neutron 0 1 0.489794 -3.96997 -4.34686 29.7653 - gamma 0 0 0.478071 -0.16137 -0.439979 -0.0944981 - gamma 0 0 0.104689 0.0301614 0.0859369 -0.0516222 - W173[0.0] 74 173 0.96278 -447.792 40.391 328.615 -0 0 -0.0407712 10 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 582.456 13.7092 66.1013 1195.5 - pi0 0 0 144.154 -140.423 -190.11 61.9256 - proton 1 1 115.771 248.202 140.129 386.539 - gamma 0 0 2.88543 -0.807229 2.75847 0.254776 - gamma 0 0 2.27332 -1.03734 1.34207 1.51353 - gamma 0 0 1.94936 0.211747 -1.18969 1.52964 - gamma 0 0 0.484548 -0.0683908 0.19039 0.440297 - neutron 0 1 0.157305 -13.6437 -9.35714 -4.68123 - Au195[0.0] 79 195 0.0390323 -106.141 -9.86309 53.0178 -0.000606011 -0.000421807 0.00181001 12 - proton 1 1 999.996 45.455 -31.6385 1695.13 - pi+ 1 0 268.821 42.024 -254.762 283.962 - proton 1 1 266.398 -48.0187 307.707 688.395 - proton 1 1 142.089 422.549 18.8784 328.513 - neutron 0 1 121.547 -193.079 -346.195 293.335 - neutron 0 1 5.62642 -26.6352 -26.1717 -95.969 - neutron 0 1 1.90746 44.165 0.388457 40.4637 - neutron 0 1 1.39603 -33.5676 35.3637 15.7445 - gamma 0 0 1.02809 0.696127 -0.51146 -0.557488 - neutron 0 1 0.588855 -0.41263 -4.22819 -32.9975 - neutron 0 1 0.0844421 0.701113 12.0474 3.61299 - Ir190[0.0] 77 190 0.301506 -162.966 225.846 170.627 -0 0 -0.0414863 45 - proton 1 1 1000 0 0 1696.04 - pi+ 1 0 126.778 209.789 -14.6046 -85.0671 - proton 1 1 105.246 -240.16 -18.2035 388.031 - proton 1 1 80.5551 296.782 59.2146 257.038 - neutron 0 1 70.6397 -100.891 57.7224 352.449 - proton 1 1 29.1649 -180.779 1.39505 -151.317 - proton 1 1 14.4291 129.452 38.0205 -95.2976 - neutron 0 1 12.9941 -88.9446 -13.2054 128.456 - neutron 0 1 12.1036 -98.7125 105.203 45.5961 - proton 1 1 9.26012 -11.9501 122.765 47.4197 - neutron 0 1 8.80582 4.12042 -127.571 -18.263 - neutron 0 1 8.24049 -109.423 54.5034 -24.673 - neutron 0 1 7.77623 -92.7499 73.3979 -26.1391 - neutron 0 1 7.75632 33.9153 15.7964 115.046 - proton 1 1 6.69397 17.9749 -108.051 24.6612 - neutron 0 1 6.2801 15.2413 87.6528 -62.652 - neutron 0 1 6.25545 18.682 81.4145 -69.4017 - neutron 0 1 4.14589 -26.8945 -36.1603 76.0064 - proton 1 1 4.00596 50.3321 -35.2792 -61.2819 - neutron 0 1 3.95547 42.4683 62.7329 41.3463 - neutron 0 1 3.40328 31.5521 -73.031 -8.81596 - gamma 0 0 3.40078 -0.861605 2.40546 2.24426 - neutron 0 1 2.90227 -54.1007 -43.9121 24.6377 - proton 1 1 2.90202 -35.246 22.3573 60.9267 - neutron 0 1 2.7158 -28.3285 49.6217 42.9639 - neutron 0 1 2.63678 34.9742 44.8618 41.5456 - neutron 0 1 2.45087 41.9512 0.0460011 53.4004 - neutron 0 1 2.43755 12.2602 43.3311 -50.5818 - neutron 0 1 1.75246 24.2516 50.7835 -11.3606 - neutron 0 1 1.73394 -7.17525 -55.8582 9.47074 - neutron 0 1 1.48458 12.0942 14.0802 49.4713 - neutron 0 1 1.38379 30.9852 -32.0309 24.8229 - gamma 0 0 1.34905 -0.169627 1.33231 0.126941 - neutron 0 1 1.3076 -22.3321 20.2758 -39.3577 - neutron 0 1 1.2728 35.0907 -22.7741 25.3645 - proton 1 1 0.936433 -36.4634 -13.7056 -15.5149 - neutron 0 1 0.863906 -29.9646 -18.8493 19.2605 - gamma 0 0 0.509071 0.318728 -0.00548473 -0.396907 - neutron 0 1 0.492376 12.8012 -1.82515 -27.5369 - neutron 0 1 0.416007 -4.29697 -26.3122 -8.43244 - neutron 0 1 0.382983 24.7707 -1.09149 10.249 - neutron 0 1 0.269373 -19.5813 -2.41554 10.8166 - deuteron 1 2 13.8304 -188.153 60.6285 113.995 - deuteron 1 2 5.07415 -45.8058 -77.191 104.897 - Er157[0.0] 68 157 1.3149 343.178 -347.467 381.883 -0 0 -0.0422503 18 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 596.413 301.758 -982.139 648.685 - proton 1 1 124.66 12.5802 219.268 448.591 - proton 1 1 61.2432 -162.637 303.615 6.58371 - proton 1 1 57.6063 287.623 169.38 -1.70786 - proton 1 1 29.5065 -187.441 39.7518 -139.737 - neutron 0 1 13.7478 -78.2277 -23.044 -139.185 - neutron 0 1 8.00788 -90.6956 -69.5225 45.309 - proton 1 1 7.73996 -92.1095 42.62 65.4497 - neutron 0 1 3.36952 -45.7035 52.4348 38.793 - neutron 0 1 2.58859 -7.90935 -67.5402 -15.7087 - gamma 0 0 1.6874 -1.67505 -0.129125 -0.157688 - neutron 0 1 1.30829 -37.7749 -32.0929 1.80608 - neutron 0 1 0.656028 -34.7083 2.4905 4.72504 - gamma 0 0 0.327895 0.0158196 0.210962 -0.25052 - neutron 0 1 0.157203 -0.651781 2.30964 17.0197 - neutron 0 1 0.120321 -6.08025 5.88631 12.4296 - Re184[0.0] 75 184 1.83472 143.637 336.503 703.391 -0 0 -0.0476869 7 - proton 1 1 1000 0 0 1696.04 - proton 1 1 979.222 33.7645 -316.452 1641.69 - proton 1 1 4.54186 -18.0119 77.1781 47.5683 - gamma 0 0 1.76484 -1.0796 0.493266 1.30606 - neutron 0 1 0.376162 8.37797 22.3221 11.7699 - gamma 0 0 0.236234 0.062544 0.149938 0.171503 - Pt195[0.0] 78 195 0.130434 -23.1136 216.309 -6.46712 -0 0 -0.0341388 10 - proton 1 1 1000 0 0 1696.04 - pi0 0 0 330.958 119.404 31.3346 428.529 - neutron 0 1 289.849 298.405 389.677 622.723 - proton 1 1 223.147 -460.634 -90.364 498.187 - gamma 0 0 3.14904 0.474497 1.21991 -2.86411 - gamma 0 0 1.64039 1.49713 -0.518536 0.424971 - gamma 0 0 0.760468 0.751174 -0.116342 -0.0226801 - neutron 0 1 0.165874 -2.75207 10.676 13.7904 - gamma 0 0 0.118891 0.025969 0.0912787 -0.0716167 - Au195[0.0] 79 195 0.377584 42.8262 -342.001 135.338 -0 0 0.0193621 33 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 216.956 252.285 400.274 480.513 - neutron 0 1 114.163 -244.782 177.688 368.876 - neutron 0 1 102.304 -375.457 147.236 200.153 - neutron 0 1 91.5373 233.985 255.097 246.103 - proton 1 1 81.1121 -228.871 -293.931 -141.466 - neutron 0 1 49.3574 -18.329 -299.109 73.3701 - proton 1 1 27.8861 -29.4482 -43.6103 224.362 - neutron 0 1 11.9275 -12.2047 78.8922 127.211 - neutron 0 1 9.507 -84.9456 -101.787 19.4652 - neutron 0 1 8.63062 -58.0773 -81.9105 78.8051 - neutron 0 1 8.5278 115.756 51.5078 -6.71821 - neutron 0 1 8.51064 35.0656 48.4097 111.767 - neutron 0 1 6.36581 15.481 -88.2272 -63.0794 - neutron 0 1 5.86293 21.0658 84.2148 59.2934 - neutron 0 1 4.62007 5.797 32.6783 87.1871 - neutron 0 1 4.52257 -6.58508 -77.7795 49.2539 - proton 1 1 4.32316 39.1326 -73.6456 -34.2966 - neutron 0 1 4.10721 82.0971 27.1532 16.0504 - neutron 0 1 2.89203 -44.8468 -9.11985 57.8658 - neutron 0 1 2.65645 -56.5549 31.8235 -28.0659 - neutron 0 1 2.55456 -31.4667 41.1 -46.1249 - proton 1 1 1.91562 26.1119 -28.2354 -46.0364 - neutron 0 1 1.88463 21.6781 -48.7673 26.3974 - neutron 0 1 1.37473 7.43484 -20.6819 -45.8494 - gamma 0 0 1.31988 -0.610696 1.16684 0.0872912 - neutron 0 1 1.2053 37.7293 -11.5622 26.6304 - neutron 0 1 0.5955 11.3989 14.2337 28.0508 - neutron 0 1 0.0724742 -4.25628 -10.3128 3.42408 - triton 1 3 1.67064 22.8994 -31.5961 -88.6937 - alpha 2 4 0.832298 -54.2052 35.8823 -44.4927 - deuteron 1 2 0.908966 53.7674 3.21248 -22.568 - Hf162[0.0] 72 162 0.387966 268.958 -210.298 -21.4472 --0.000621136 0.000169369 -0.00421895 30 - proton 1 1 999.992 -74.395 20.2857 1694.28 - proton 1 1 220.055 27.7659 -361.275 574.522 - neutron 0 1 167.433 -419.539 293.163 284.087 - pi- -1 0 87.9421 -173.672 44.4745 -11.9206 - neutron 0 1 54.8 -189.278 -172.285 201.174 - neutron 0 1 39.4695 197.217 -76.8721 175.847 - proton 1 1 24.3027 -53.0366 167.847 123.329 - proton 1 1 11.9388 -89.8335 -90.336 79.4703 - neutron 0 1 11.4304 -45.7433 -131.188 -48.0333 - neutron 0 1 6.256 48.3707 32.8759 91.512 - neutron 0 1 5.52432 73.3768 44.8134 -54.9459 - neutron 0 1 4.43845 1.97197 67.1698 -62.0037 - proton 1 1 4.42958 -77.8602 -6.88522 47.1414 - proton 1 1 3.98083 22.6705 -80.6858 21.492 - neutron 0 1 3.85632 71.1587 -34.6412 31.5885 - neutron 0 1 3.41773 31.3966 32.306 66.3673 - neutron 0 1 3.24265 62.8697 -40.8343 -21.9967 - neutron 0 1 3.23903 -41.6954 -59.4768 -28.6539 - neutron 0 1 3.01241 -17.1979 57.1745 -45.8814 - neutron 0 1 2.97775 58.6692 -24.3848 -39.5949 - neutron 0 1 1.74955 -46.9686 -31.1853 -10.589 - neutron 0 1 1.47757 -38.1982 -9.22401 35.136 - neutron 0 1 1.46973 0.224827 -52.1956 -6.28824 - neutron 0 1 1.37487 39.3205 4.53232 -31.9188 - neutron 0 1 0.799144 11.5566 24.6559 27.5838 - neutron 0 1 0.779305 12.346 -23.1601 27.8605 - neutron 0 1 0.664935 -9.92457 -17.9488 28.7973 - neutron 0 1 0.636537 -12.6793 3.62067 31.9792 - alpha 2 4 1.79601 13.0185 -56.3875 -100.215 - W168[0.0] 74 168 1.86134 469.299 516.619 308.429 -0 0 -0.0302484 44 - proton 1 1 1000 0 0 1696.04 - proton 1 1 103.586 269.968 87.5356 352.942 - proton 1 1 99.407 -26.5336 -114.544 427.316 - proton 1 1 69.9025 -82.8923 -65.3129 -353.447 - proton 1 1 65.0253 -233.487 -65.863 259.609 - neutron 0 1 60.1423 132.081 247.289 195.026 - neutron 0 1 46.3473 286.195 -69.0485 50.6501 - neutron 0 1 45.2173 -209.911 195.03 70.1034 - proton 1 1 26.876 -205.227 18.0596 -93.3386 - neutron 0 1 19.5151 100.537 154.226 56.2055 - neutron 0 1 15.9121 -7.1424 -154.544 78.8615 - neutron 0 1 14.6476 -18.7103 147.876 74.3101 - neutron 0 1 14.508 160.971 -16.6513 35.8343 - proton 1 1 13.3227 -54.7663 -46.9561 -141.329 - neutron 0 1 11.4609 120.777 30.3215 -78.4951 - proton 1 1 10.5856 -53.1486 79.9331 103.742 - neutron 0 1 10.3179 90.2765 55.8503 -90.6972 - proton 1 1 9.76942 -105.704 -85.1708 -0.882739 - neutron 0 1 9.29702 -35.0206 -60.4658 112.58 - proton 1 1 9.06729 24.2198 -41.231 121.7 - proton 1 1 8.15115 73.2641 -32.0142 -94.7096 - neutron 0 1 7.62735 -81.6626 0.943429 87.8708 - neutron 0 1 6.33592 -78.9886 -33.306 -67.8063 - neutron 0 1 5.7406 -62.0171 -74.0488 -38.6128 - neutron 0 1 5.4728 91.156 44.0889 -7.79865 - neutron 0 1 5.44835 -1.69876 62.6907 -79.5918 - neutron 0 1 4.36389 12.5013 -79.1647 42.3796 - neutron 0 1 3.65669 36.2517 9.83606 73.9854 - neutron 0 1 2.10827 -3.17401 4.97246 -62.7006 - neutron 0 1 1.91129 -44.9211 33.1978 -21.7997 - proton 1 1 1.764 -32.3204 44.3396 17.3991 - gamma 0 0 1.73391 0.999042 0.392896 -1.36161 - neutron 0 1 1.35586 -7.31465 -9.99411 -48.952 - neutron 0 1 1.1161 24.4151 4.57235 38.4908 - proton 1 1 1.03003 30.6906 -10.8518 -29.5683 - neutron 0 1 0.867879 -6.24563 -7.00473 -39.2879 - gamma 0 0 0.796323 -0.622478 0.294615 -0.399816 - neutron 0 1 0.790231 -18.0621 31.2153 13.5991 - neutron 0 1 0.477298 -6.77452 21.9792 -19.1874 - neutron 0 1 0.442115 8.6015 -23.6307 14.0923 - neutron 0 1 0.438893 -6.82757 24.2781 13.7437 - neutron 0 1 0.257563 14.2322 16.5403 2.81481 - deuteron 1 2 6.87051 -7.50258 -78.7272 139.878 - Ho157[0.0] 67 157 1.39654 -86.4618 -246.935 582.872 --0.000219484 0.00185551 0.0153427 28 - proton 1 1 999.995 -7.01752 59.3258 1694.98 - neutron 0 1 291.143 504.535 549.403 274.699 - neutron 0 1 223.772 -349.824 -304.061 505.708 - neutron 0 1 184.332 46.9306 174.068 589.797 - proton 1 1 66.6069 -302.397 -193.516 -23.1308 - proton 1 1 18.971 156.337 -106.382 -14.1921 - neutron 0 1 13.6836 111.114 115.999 9.92011 - neutron 0 1 11.6899 138.819 24.3788 -47.3148 - neutron 0 1 9.32855 -74.1859 -73.8906 81.5672 - neutron 0 1 5.52122 -37.0035 -24.6205 91.8158 - neutron 0 1 4.83819 -47.6868 73.996 -36.9535 - proton 1 1 4.12553 65.9168 -39.5342 43.0207 - neutron 0 1 2.68732 -67.7369 20.2161 -7.75067 - proton 1 1 2.48166 5.42693 -11.7527 67.0487 - neutron 0 1 2.45295 10.5088 -34.1872 -57.7601 - neutron 0 1 2.43995 24.2358 -35.412 -52.4362 - gamma 0 0 1.98153 -1.20182 -0.458392 1.5073 - neutron 0 1 1.82833 38.6696 -40.2766 17.9294 - gamma 0 0 1.3294 0.849902 1.01327 0.13517 - neutron 0 1 0.855873 -17.351 -35.3328 -7.71774 - neutron 0 1 0.76029 7.59924 24.4692 -27.7988 - neutron 0 1 0.587878 6.87661 -11.5924 30.3871 - neutron 0 1 0.50187 9.59213 -17.9929 22.969 - gamma 0 0 0.400591 -0.155365 -0.357197 0.093513 - neutron 0 1 0.387287 23.7594 -12.4475 2.90964 - gamma 0 0 0.0587857 -0.0415206 -0.00924991 -0.0405739 - gamma 0 0 0.041512 0.0380733 -0.00356763 0.0161535 - Os177[0.0] 76 177 0.368334 -260.645 17.6083 230.55 --0.00113077 0.000300594 0.0210945 16 - proton 1 1 999.995 -58.6493 15.5908 1694.95 - neutron 0 1 353.608 697.36 -462.01 299.584 - proton 1 1 296.636 -555.849 301.619 494.673 - proton 1 1 120.01 -257.934 -163.059 382.736 - proton 1 1 95.2565 246.081 191.005 301.311 - neutron 0 1 37.1155 139.924 -53.5532 220.626 - neutron 0 1 11.4645 -90.3067 85.0667 79.2658 - neutron 0 1 1.88186 -49.7597 -15.4946 28.7001 - gamma 0 0 1.42543 0.204566 -0.63755 -1.25838 - neutron 0 1 1.29334 25.3798 -6.39938 -41.7965 - neutron 0 1 0.952939 23.8091 -31.1292 -15.9908 - neutron 0 1 0.897723 -20.9829 -15.3454 -31.8117 - gamma 0 0 0.28801 0.157295 -0.221653 0.0952789 - neutron 0 1 0.224495 2.24016 12.6773 16.0054 - neutron 0 1 0.0120356 0.00268767 1.05741 4.63665 - Ir186[0.0] 77 186 0.228926 -218.977 172.017 -41.8299 -0 0 -0.041257 23 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 236.479 383.336 295.749 515.639 - pi0 0 0 178.339 144.088 82.2491 228.958 - proton 1 1 157.601 -267.592 73.3777 493.553 - neutron 0 1 96.5987 -245.934 -344.881 106.893 - proton 1 1 20.4458 196.818 4.79959 5.02697 - neutron 0 1 10.6937 -137.965 0.943875 -34.2622 - neutron 0 1 10.2438 105.487 -3.10901 -90.6496 - neutron 0 1 5.40551 42.5508 79.4485 -45.434 - neutron 0 1 3.70856 14.6647 -52.5813 63.2675 - neutron 0 1 2.66775 -11.4107 -49.2554 49.6374 - neutron 0 1 2.60666 48.2081 50.7919 1.10213 - neutron 0 1 2.40891 14.3843 -43.7945 -49.0672 - neutron 0 1 1.59174 -0.835615 21.5855 50.2691 - neutron 0 1 1.40131 12.7088 -49.1891 7.35768 - neutron 0 1 1.00894 -3.4648 -0.941776 43.4058 - gamma 0 0 0.520491 -0.169496 0.157646 0.466187 - gamma 0 0 0.463193 0.095267 -0.147963 -0.428461 - neutron 0 1 0.381701 4.80314 25.8533 5.09424 - neutron 0 1 0.188205 -18.0537 5.20213 -0.836303 - neutron 0 1 0.0500438 -2.2579 -7.77647 5.33571 - neutron 0 1 0.0296208 0.475408 -0.696268 7.41293 - Pt180[0.0] 78 180 0.588194 -279.937 -87.7857 333.296 -0 0 0.0339516 40 - proton 1 1 1000 0 0 1696.04 - proton 1 1 261.682 428.366 -26.4035 612.65 - proton 1 1 132.478 -163.793 443.138 207.247 - neutron 0 1 44.5716 -106.949 49.8172 267.997 - proton 1 1 44.1902 128.792 261.193 -8.27047 - proton 1 1 38.26 -263.756 -9.21724 60.0708 - proton 1 1 32.9993 -120.677 143.716 -166.722 - proton 1 1 27.4951 -191.181 120.901 34.4147 - neutron 0 1 25.834 -148.946 -155.44 53.5384 - neutron 0 1 19.9443 79.8794 168.348 56.1596 - proton 1 1 18.5738 -7.19846 -108.259 153.061 - neutron 0 1 16.7257 71.9121 149.51 64.692 - proton 1 1 15.2904 -8.2077 156.288 -66.586 - neutron 0 1 12.8184 149.115 -7.86549 -44.2096 - neutron 0 1 9.38015 -111.959 -67.0375 -26.1835 - neutron 0 1 7.7989 79.8418 -58.6526 -70.0083 - neutron 0 1 5.40217 44.6477 -80.5054 -41.3041 - neutron 0 1 5.07924 74.4152 -8.35629 -62.9516 - neutron 0 1 5.0577 -1.61403 -45.487 -86.3596 - neutron 0 1 4.68954 -15.8441 -73.936 -55.8273 - neutron 0 1 4.68922 14.053 60.2542 70.7502 - neutron 0 1 3.06255 72.1573 17.2272 16.1508 - neutron 0 1 2.74239 -35.3496 -59.7573 18.4469 - neutron 0 1 2.51903 -27.2787 53.6929 33.36 - neutron 0 1 2.18976 -59.5622 22.8075 7.19796 - neutron 0 1 2.15392 61.5723 -11.222 11.622 - neutron 0 1 1.96235 31.7033 -9.48832 50.9532 - neutron 0 1 1.80421 -4.30039 -33.9191 47.1657 - neutron 0 1 1.7571 20.435 -53.712 -1.52862 - neutron 0 1 1.65709 -4.06993 47.7748 28.5946 - neutron 0 1 1.53122 -44.3197 -23.3357 -19.2594 - gamma 0 0 1.5075 -0.853091 -0.809732 -0.94293 - gamma 0 0 1.33123 -0.728021 -0.205964 -1.09532 - neutron 0 1 0.960462 17.3845 38.0291 7.57118 - neutron 0 1 0.865187 -35.7397 -18.6682 0.849968 - proton 1 1 0.674929 14.4978 0.881423 -32.4966 - gamma 0 0 0.507936 -0.0176976 0.26508 -0.432918 - gamma 0 0 0.274053 0.251467 0.0837132 -0.0697248 - neutron 0 1 0.210451 18.3174 1.62916 -7.57148 - Lu164[0.0] 71 164 3.68381 45.003 -883.279 585.366 -0 0 0.00710382 22 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 407.493 545.526 -89.89 791.268 - neutron 0 1 142.015 -318.049 -186.874 388.532 - pi+ 1 0 88.368 149.283 -27.579 97.1078 - neutron 0 1 48.824 -211.182 35.7032 219.677 - neutron 0 1 11.1522 61.5288 111.287 70.0734 - proton 1 1 10.9515 -106.305 55.2932 -79.4536 - proton 1 1 7.03977 6.15625 114.898 4.52068 - neutron 0 1 5.60765 -34.9472 83.6371 48.5023 - neutron 0 1 5.45731 -71.058 -38.7741 -61.0909 - neutron 0 1 2.34117 11.2007 -4.09005 65.2891 - neutron 0 1 1.90875 -58.182 -13.3134 5.29595 - neutron 0 1 1.73956 23.181 31.4211 -41.7999 - neutron 0 1 1.73767 -45.0147 34.8254 -5.40373 - gamma 0 0 1.68529 -1.42082 -0.330134 0.844099 - neutron 0 1 0.881373 -3.93618 6.85662 39.931 - proton 1 1 0.602925 22.6277 17.7563 -17.4494 - neutron 0 1 0.219783 0.295113 13.2938 -15.37 - neutron 0 1 0.137378 -8.15622 -13.3331 3.72483 - neutron 0 1 0.0946799 -12.7795 1.64985 -3.44777 - neutron 0 1 0.0390478 -6.03063 -1.3592 5.92971 - Os180[0.0] 76 180 0.157022 57.2644 -131.079 179.356 --0.00668242 0.00439657 0.0439361 20 - proton 1 1 999.961 -143.625 94.4955 1687.26 - proton 1 1 332.802 -635.824 -363.379 446.048 - proton 1 1 225.594 580.004 240.398 282.902 - pi0 0 0 114.164 56.3029 127.049 156.654 - proton 1 1 45.0085 -125.433 141.426 225.281 - proton 1 1 22.2064 -198.216 -43.0043 32.0215 - neutron 0 1 9.49273 104.796 -51.587 65.4588 - neutron 0 1 8.63635 82.5884 -97.3168 3.46555 - neutron 0 1 5.77261 27.7028 -73.2907 -68.861 - neutron 0 1 5.11775 3.5027 65.3881 -73.1796 - neutron 0 1 2.83381 36.1551 34.4508 53.283 - neutron 0 1 2.80691 24.4905 -14.5213 66.8714 - neutron 0 1 1.61472 29.2967 12.5109 44.9674 - gamma 0 0 1.24717 -1.14774 0.271676 0.405355 - neutron 0 1 1.17794 21.367 -41.7681 -3.70888 - gamma 0 0 1.15364 0.208842 -0.804499 0.800029 - neutron 0 1 0.797122 9.12023 -32.9929 18.0782 - gamma 0 0 0.737785 0.220237 0.550712 0.438792 - gamma 0 0 0.271 0.212352 0.162713 0.0432726 - Os185[0.0] 76 185 0.731751 -158.973 190.952 436.287 -0.000619809 0.000175288 0.0236265 10 - proton 1 1 1000 14.7618 4.17475 1695.97 - proton 1 1 938.157 -364.046 -61.9284 1582.49 - neutron 0 1 10.2467 -52.0122 58.2416 115.163 - neutron 0 1 7.15611 110.902 -25.6148 23.3056 - neutron 0 1 2.13954 58.3637 9.45069 -23.0088 - gamma 0 0 1.39156 -1.30282 -0.34376 0.347743 - gamma 0 0 0.738247 0.265107 0.675236 0.137054 - neutron 0 1 0.644526 -22.631 21.1596 15.8642 - neutron 0 1 0.59959 -5.635 -21.7582 24.9379 - Au192[0.0] 79 192 0.243492 290.858 24.2926 -43.2649 -0 0 -0.0443479 18 - proton 1 1 1000 0 0 1696.04 - proton 1 1 628.85 -645.799 -182.617 1060.71 - neutron 0 1 92.2842 318.96 -149.119 240.746 - neutron 0 1 70.0904 309.879 190.251 66.3419 - neutron 0 1 47.3664 -235.284 98.3312 161.937 - neutron 0 1 42.0981 234.818 157.643 29.8215 - proton 1 1 9.36833 -33.6416 27.3894 125.642 - neutron 0 1 4.57069 -40.1749 -16.2372 82.0496 - neutron 0 1 3.11738 45.7903 -53.1387 30.7767 - gamma 0 0 2.77163 2.46488 -1.26483 -0.0806126 - neutron 0 1 0.833636 -19.3506 27.001 21.5338 - gamma 0 0 0.682985 -0.4162 -0.524613 -0.134267 - neutron 0 1 0.423423 22.7798 -3.75905 -16.211 - neutron 0 1 0.293205 -10.7549 0.983358 20.8428 - neutron 0 1 0.0915328 8.09562 9.8123 3.1922 - neutron 0 1 0.0720192 10.6102 -2.56595 4.02223 - neutron 0 1 0.0446427 -3.40797 -8.29471 1.86415 - Pt184[0.0] 78 184 0.0841858 35.4291 -93.8904 -137.02 -0 0 -0.0268678 36 - proton 1 1 1000 0 0 1696.04 - pi0 0 0 291.83 -180.099 271.343 240.586 - proton 1 1 88.3379 -14.3499 123.081 397.767 - neutron 0 1 48.4048 142.929 -159.399 217.865 - proton 1 1 37.484 -138.215 228.192 23.8845 - neutron 0 1 22.4563 199.115 -55.1859 -3.2057 - neutron 0 1 22.2426 -145.124 -45.0073 -138.582 - neutron 0 1 19.1461 37.1285 -138.44 125.699 - neutron 0 1 17.5506 -118.699 118.727 -71.4304 - neutron 0 1 14.9951 57.822 -12.369 -157.817 - neutron 0 1 13.2132 -39.3317 -151.958 -19.1212 - neutron 0 1 12.4475 89.2704 121.676 27.7718 - neutron 0 1 10.4537 73.445 -45.0661 -111.032 - neutron 0 1 9.96907 -19.4791 131.82 -32.8129 - neutron 0 1 7.07992 -31.8242 -103.865 -39.4156 - neutron 0 1 6.03653 -77.2933 37.4217 63.2868 - proton 1 1 4.71914 -55.0176 -19.1516 -74.0556 - neutron 0 1 4.41397 -65.8505 60.8079 -16.7337 - neutron 0 1 4.26065 -34.2025 -76.8143 30.8903 - neutron 0 1 3.57999 47.1631 56.1508 36.9163 - gamma 0 0 2.99504 2.42733 -1.6405 0.622147 - gamma 0 0 2.46139 1.57499 -1.69408 -0.841389 - neutron 0 1 2.39725 21.9809 27.6405 -57.1255 - neutron 0 1 2.35556 64.7935 15.2868 -0.275461 - neutron 0 1 2.06963 -39.4539 42.2501 -23.4887 - gamma 0 0 1.73765 -1.48564 0.081812 0.897568 - gamma 0 0 1.41363 0.48991 0.260033 -1.30028 - neutron 0 1 1.35791 -39.9563 -14.341 -27.4111 - gamma 0 0 1.10255 -0.123264 -0.0266675 -1.09531 - gamma 0 0 1.05137 -0.239197 -0.494419 -0.896503 - neutron 0 1 0.891276 37.512 14.6473 -7.34361 - neutron 0 1 0.643685 -23.741 14.1309 -21.1345 - neutron 0 1 0.357958 -12.4039 14.1176 17.8777 - alpha 2 4 0.890463 20.3267 66.7378 42.0944 - triton 1 3 0.65084 27.0511 -38.2965 38.1941 - W166[0.0] 74 166 5.84409 213.863 -480.625 1236.81 -0 0 0.0151999 43 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 374.768 -331.993 -335.788 788.49 - proton 1 1 60.8703 131.621 -315.96 27.8609 - proton 1 1 59.2736 -264.664 -210.895 -14.8057 - neutron 0 1 43.4794 101.274 254.001 93.9207 - proton 1 1 25.1318 -15.9696 87.5615 199.676 - proton 1 1 24.3254 -134.422 3.05209 167.812 - neutron 0 1 15.376 72.3746 43.8491 -148.22 - proton 1 1 13.0865 -123.155 82.2481 52.8856 - proton 1 1 10.9138 47.2205 2.60223 135.509 - neutron 0 1 10.6386 73.1739 113.744 42.5723 - neutron 0 1 10.6307 58.2399 26.9471 -126.378 - neutron 0 1 9.64264 2.21444 -134.861 4.51882 - proton 1 1 7.72284 54.73 -76.9865 75.0307 - neutron 0 1 7.61703 -40.7585 112.554 -6.46612 - neutron 0 1 6.8017 -36.3657 100.249 -38.1472 - neutron 0 1 6.26743 2.84481 83.6536 69.3584 - gamma 0 0 6.02718 -0.503253 1.24567 5.87554 - proton 1 1 5.98736 27.7387 -99.7958 -23.2973 - neutron 0 1 4.26315 -88.7736 10.2819 6.5355 - neutron 0 1 4.23877 16.0593 -36.3681 80.0164 - neutron 0 1 3.24989 -8.59319 -8.48297 77.277 - proton 1 1 3.1385 -6.67725 -63.3802 42.869 - gamma 0 0 2.01872 -1.95985 -0.413334 0.251788 - neutron 0 1 2.00773 -7.66486 -50.3294 34.4242 - neutron 0 1 1.96219 -42.6126 -7.99918 42.5587 - neutron 0 1 1.87457 15.9947 -55.62 -13.2915 - gamma 0 0 1.84874 -1.77443 0.490157 -0.170279 - neutron 0 1 1.36963 39.8832 6.90526 -30.6142 - neutron 0 1 1.26137 -27.0499 -14.0885 -37.9695 - neutron 0 1 1.02547 -16.374 36.9664 -17.1297 - neutron 0 1 0.86971 21.913 30.5993 -14.7837 - neutron 0 1 0.786368 26.9579 -25.5246 10.0037 - neutron 0 1 0.736704 -24.4304 13.9947 -24.3354 - neutron 0 1 0.414518 23.1725 15.5454 0.694505 - neutron 0 1 0.4057 -27.3109 3.69587 -1.72727 - neutron 0 1 0.374944 -18.672 18.7021 2.50911 - neutron 0 1 0.328818 -20.5108 6.24137 -12.5838 - gamma 0 0 0.103308 -0.0954208 0.0307985 0.0248772 - neutron 0 1 0.0812819 5.92991 -10.5875 -2.34248 - neutron 0 1 0.0496072 1.42741 -2.99958 9.06565 - deuteron 1 2 5.83204 27.5205 143.283 -24.9771 - Yb160[0.0] 70 160 1.25184 490.041 251.635 263.537 --0.00150879 0.00167725 0.0212584 33 - proton 1 1 999.994 -46.0604 51.2031 1694.63 - neutron 0 1 276.75 333.888 58.1783 694.1 - proton 1 1 123.037 -140.007 290.333 -376.997 - neutron 0 1 109.052 148.982 440.334 -26.9492 - neutron 0 1 94.2297 161.733 -130.406 377.87 - neutron 0 1 31.4362 34.9313 -180.387 -162.177 - neutron 0 1 24.6114 -104.583 -189.514 -0.749061 - neutron 0 1 19.149 181.615 -57.986 1.941 - neutron 0 1 10.4232 106.045 -91.6208 -7.4447 - neutron 0 1 9.42656 -30.8533 8.47043 129.534 - neutron 0 1 7.61566 -104.242 50.4056 -31.0124 - proton 1 1 6.13253 24.4822 38.662 -97.2185 - neutron 0 1 5.79676 -89.7393 52.5117 10.7631 - neutron 0 1 5.34175 15.2318 -6.6714 98.9438 - proton 1 1 5.18752 -77.935 55.8886 -23.7513 - neutron 0 1 3.93509 37.1859 68.4672 36.5991 - proton 1 1 3.4278 -4.98531 78.7576 -14.7159 - proton 1 1 3.13629 39.0392 -61.8593 -23.3361 - neutron 0 1 2.61865 -42.5403 -54.6764 -11.3342 - neutron 0 1 2.14793 -17.8963 -58.8872 -15.9024 - neutron 0 1 1.94088 44.24 -36.1758 19.6233 - neutron 0 1 1.78136 25.5064 -34.0718 39.2315 - neutron 0 1 1.30005 14.0297 21.3893 42.3122 - neutron 0 1 1.11585 9.42208 -35.5765 -27.2693 - neutron 0 1 1.08683 36.3932 3.32177 -26.6078 - neutron 0 1 0.506452 -30.2087 -5.97077 -1.93086 - neutron 0 1 0.246848 18.1953 -10.587 4.55691 - neutron 0 1 0.237655 2.4924 -9.16351 18.8801 - gamma 0 0 0.144984 0.0776904 -0.122063 -0.00922407 - neutron 0 1 0.0528968 -5.58854 -3.26552 7.58337 - alpha 2 4 7.4742 -65.9598 217.961 -62.5872 - deuteron 1 2 24.8918 273.991 110.857 81.4496 - Hf164[0.0] 72 164 6.60204 -839.006 -477.392 1041.23 -0 0 -0.0245185 27 - proton 1 1 1000 0 0 1696.04 - proton 1 1 370.78 477.4 -152.549 762.942 - proton 1 1 123.232 432.31 191.202 -151.609 - neutron 0 1 92.6613 -357.331 -193.927 -131.969 - proton 1 1 81.0195 96.8039 176.725 343.508 - neutron 0 1 56.596 183.642 -119.036 -248.315 - proton 1 1 35.3849 154.649 16.3923 208.49 - neutron 0 1 31.7302 34.6025 -228.42 85.2012 - neutron 0 1 17.931 -98.5961 145.746 -55.2559 - proton 1 1 10.4642 10.6562 -137.83 25.2033 - gamma 0 0 2.74946 0.0137597 0.75164 2.64469 - neutron 0 1 2.26951 7.62153 -39.0464 -51.8377 - neutron 0 1 2.17652 -63.08 -2.57269 10.44 - neutron 0 1 2.00714 52.8813 31.2847 0.738825 - neutron 0 1 1.2541 -32.0399 36.4782 0.992409 - neutron 0 1 0.91332 -30.1576 -10.5374 -26.3925 - neutron 0 1 0.791504 24.5458 18.1186 23.6048 - neutron 0 1 0.768878 -32.1876 -20.2329 0.0276634 - neutron 0 1 0.68903 7.71267 29.6908 -18.8208 - neutron 0 1 0.614803 4.15274 32.3932 9.43986 - gamma 0 0 0.582766 -0.149402 0.061499 0.559922 - neutron 0 1 0.533829 -1.52082 28.5944 13.5449 - neutron 0 1 0.381075 15.3656 21.5539 -3.94492 - neutron 0 1 0.231676 9.27014 1.0707 -18.6634 - neutron 0 1 0.0793129 -11.4858 2.41042 3.36348 - neutron 0 1 0.0147245 1.3552 -4.89647 -1.3629 - Re175[0.0] 75 175 5.06797 -886.437 176.576 913.513 -0 0 -0.0260088 32 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 203.496 -410.129 451.02 228.43 - proton 1 1 147.484 534.672 -54.7889 98.1668 - proton 1 1 105.655 -196.457 -408.913 60.1923 - neutron 0 1 65.3759 177.677 -295.889 -89.4677 - neutron 0 1 59.7242 105.834 -216.144 240.578 - neutron 0 1 54.8313 307.742 52.8908 -92.4071 - neutron 0 1 53.8396 223.784 41.9549 228.54 - neutron 0 1 21.0691 3.08139 73.8992 185.916 - neutron 0 1 11.8725 -86.783 82.8828 -89.7224 - neutron 0 1 10.3648 -79.5789 79.383 83.3651 - neutron 0 1 9.27135 -1.99885 129.323 27.9229 - neutron 0 1 7.40821 46.8126 41.2823 -100.4 - neutron 0 1 7.12203 85.1038 -70.5162 34.9106 - neutron 0 1 5.49397 -50.4888 88.3289 -1.72008 - neutron 0 1 5.04433 13.9654 2.39006 96.4555 - gamma 0 0 4.61501 0.348159 -4.28498 -1.67811 - neutron 0 1 4.37781 65.1989 37.263 51.051 - proton 1 1 2.27427 -41.6878 41.5199 -28.481 - neutron 0 1 2.1462 -38.6433 -35.0292 -36.2937 - proton 1 1 2.09106 35.6354 -51.5143 2.17576 - neutron 0 1 2.06512 41.7858 33.8298 31.534 - neutron 0 1 0.912959 -23.0285 24.5975 24.105 - neutron 0 1 0.662101 -10.3759 -30.1618 -15.0738 - neutron 0 1 0.518271 8.2136 -5.52139 29.601 - neutron 0 1 0.380056 -8.59498 14.3491 20.8459 - gamma 0 0 0.252124 0.127577 0.0908151 -0.197594 - gamma 0 0 0.158927 -0.140246 -0.0661582 0.0348127 - alpha 2 4 4.00071 166.675 35.2578 28.5845 - triton 1 3 12.414 -215.42 -17.5155 152.281 - deuteron 1 2 0.420041 22.4184 -6.75547 32.0566 - Hf165[0.0] 72 165 2.28672 -675.762 -33.1652 494.741 -0 0 -0.034343 30 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 318.999 481.545 -157.996 666.598 - neutron 0 1 148.514 93.9058 -220.971 -493.445 - neutron 0 1 91.0897 -11.523 -368.271 -209.071 - neutron 0 1 82.2267 225.198 293.458 -156.346 - proton 1 1 79.4967 -136.596 311.318 199.803 - neutron 0 1 19.8994 -79.6692 155.978 -84.3394 - neutron 0 1 12.8888 23.1755 81.6053 131.108 - neutron 0 1 9.10173 -58.0041 90.862 -74.6043 - neutron 0 1 8.12453 -80.8828 48.57 80.1998 - proton 1 1 6.29907 23.2943 51.4448 93.1181 - neutron 0 1 5.014 21.2529 93.4035 -16.4683 - neutron 0 1 3.98959 -38.8604 -64.8391 42.4105 - neutron 0 1 3.64662 -44.1087 -22.8624 -66.3138 - neutron 0 1 3.12728 34.2921 50.6324 46.3331 - neutron 0 1 2.82029 -17.7991 17.6319 68.4103 - neutron 0 1 2.47971 26.4061 59.0222 22.0214 - neutron 0 1 2.11609 10.2315 -42.8706 -45.1478 - neutron 0 1 2.07831 -50.246 2.3779 -37.1406 - gamma 0 0 1.94905 -0.131047 1.70386 -0.937271 - proton 1 1 1.79916 5.0356 55.3514 17.0382 - neutron 0 1 1.21685 -43.3415 -16.4284 -11.8208 - neutron 0 1 0.864418 17.4008 -34.0685 12.7142 - gamma 0 0 0.761128 0.238575 -0.249003 0.678524 - gamma 0 0 0.672759 0.133738 -0.514013 0.412927 - neutron 0 1 0.366038 -1.63358 -23.8244 10.8489 - neutron 0 1 0.25925 6.11883 6.12009 20.3061 - neutron 0 1 0.232115 8.20221 -1.21121 19.1699 - gamma 0 0 0.119324 0.105953 -0.0375088 -0.0400632 - Ir174[0.0] 77 174 7.52363 -413.745 -365.34 1460.55 -0 0 -0.0424028 28 - proton 1 1 1000 0 0 1696.04 - proton 1 1 361.467 65.3551 416.86 794.306 - proton 1 1 127.991 -470.538 -161.421 95.3928 - neutron 0 1 75.208 196.8 -266.889 -192.411 - proton 1 1 68.3426 -340.489 130.316 -1.89457 - neutron 0 1 39.9054 270.168 -19.4268 -56.6722 - neutron 0 1 26.1061 11.5585 -179.765 131.488 - neutron 0 1 25.4144 -43.8798 -63.9171 205.893 - neutron 0 1 22.9047 -55.8715 -154.069 129.254 - neutron 0 1 15.2426 109.285 -126.652 -29.854 - neutron 0 1 9.10091 -101.402 -82.8605 -6.03749 - neutron 0 1 7.93276 -92.9704 -76.6678 -21.1704 - neutron 0 1 7.78053 -57.8825 53.5037 92.0224 - neutron 0 1 7.66901 42.1609 -111.364 -17.043 - neutron 0 1 4.79021 66.2718 13.9582 -66.6152 - neutron 0 1 2.86558 55.2376 47.4053 9.7241 - neutron 0 1 2.7727 71.7448 7.21277 4.31447 - gamma 0 0 2.28801 -1.05725 -1.85726 0.817181 - neutron 0 1 1.94192 34.1094 49.6452 4.97873 - neutron 0 1 1.79707 53.4832 -21.4309 7.77276 - neutron 0 1 1.66568 -43.6305 32.5049 13.1382 - gamma 0 0 1.60811 -1.09041 -0.875842 -0.793677 - gamma 0 0 1.15084 -0.903048 0.318022 0.638596 - neutron 0 1 0.801943 28.7637 -7.88676 -24.8606 - neutron 0 1 0.300005 4.82153 1.15875 23.2217 - neutron 0 1 0.229505 -5.39711 -11.2955 16.5712 - triton 1 3 5.70875 -67.8121 142.162 -85.4327 - Os173[0.0] 76 173 2.09754 273.159 391.347 669.289 -0 0 0.0375754 12 - proton 1 1 1000 0 0 1696.04 - proton 1 1 568.495 431.754 -417.45 1014.55 - proton 1 1 402.414 -318.326 464.336 774.691 - gamma 0 0 2.02903 -0.0800697 -1.18501 -1.64509 - neutron 0 1 1.61851 35.8294 -41.7759 -3.87955 - gamma 0 0 1.14165 -0.853488 -0.562287 -0.508685 - neutron 0 1 1.10831 -24.1095 26.8544 27.9547 - gamma 0 0 1.03671 -0.619002 -0.540284 0.63222 - gamma 0 0 0.975895 -0.435356 0.389106 -0.781942 - gamma 0 0 0.96257 0.330035 0.64596 0.632734 - gamma 0 0 0.189612 -0.0124063 -0.033389 -0.186237 - Pt194[0.0] 78 194 0.0816841 -123.478 -30.6785 -115.422 -0 0 -0.0241656 42 - proton 1 1 1000 0 0 1696.04 - proton 1 1 205.682 -323.602 245.684 513.028 - neutron 0 1 205.528 -460.093 -121.7 -449.399 - proton 1 1 112.35 68.6716 244.192 398.883 - proton 1 1 86.3141 105.563 -19.6822 397.356 - proton 1 1 25.6845 -60.6915 -186.877 101.248 - proton 1 1 24.7708 56.9021 15.312 208.866 - neutron 0 1 22.8759 36.0793 156.939 132.584 - neutron 0 1 21.6207 -89.2319 -170.056 64.9152 - proton 1 1 10.1707 117.938 27.0282 67.4493 - neutron 0 1 8.08188 -69.0974 -46.4995 -91.1897 - neutron 0 1 6.68616 4.66719 72.2409 85.8391 - neutron 0 1 6.40228 -92.0495 56.5719 -19.9561 - neutron 0 1 4.94512 25.6564 -90.6617 -20.9568 - neutron 0 1 3.82492 10.7636 7.92996 83.8058 - gamma 0 0 3.67128 3.04776 2.04109 0.152976 - neutron 0 1 3.59303 76.1658 -3.78344 30.8081 - neutron 0 1 3.48654 0.000436851 -80.889 4.56098 - neutron 0 1 2.71109 -64.7001 -25.9055 -15.6411 - neutron 0 1 2.62064 -38.16 -44.9268 -38.1679 - neutron 0 1 2.51975 16.7399 19.894 -63.7596 - neutron 0 1 2.28967 -44.6132 -24.8941 -41.204 - gamma 0 0 1.46692 0.132048 -0.674066 -1.29617 - neutron 0 1 1.22351 14.8516 36.3999 -27.4793 - neutron 0 1 1.20969 15.5616 41.8482 16.769 - neutron 0 1 0.979603 -26.0991 9.56932 -32.696 - gamma 0 0 0.815514 0.031978 -0.170253 -0.796903 - gamma 0 0 0.805653 -0.225648 -0.244291 0.733813 - gamma 0 0 0.788566 -0.0488781 0.167046 -0.769118 - neutron 0 1 0.67718 -9.54208 -11.3761 32.4423 - proton 1 1 0.663891 30.7228 -17.1065 3.12117 - neutron 0 1 0.614697 18.9376 -28.2281 -0.128743 - neutron 0 1 0.519572 -18.1179 -20.0228 15.7304 - neutron 0 1 0.432435 20.2671 19.4533 -4.85836 - gamma 0 0 0.415529 -0.243576 0.286203 0.177267 - neutron 0 1 0.111741 -14.275 0.717289 -2.38722 - neutron 0 1 0.0985224 7.04205 -7.89879 8.55364 - neutron 0 1 0.00781862 1.92129 -3.31541 -0.0946903 - alpha 2 4 5.43159 161.132 26.9797 117.6 - alpha 2 4 5.61963 156.609 104.807 80.089 - alpha 2 4 2.26586 -25.1415 60.7842 -112.116 - Ho155[0.0] 67 155 0.947936 386.532 -243.931 254.226 -0 0 0.0172698 26 - proton 1 1 1000 0 0 1696.04 - proton 1 1 365.705 -671.642 -19.5973 607.053 - neutron 0 1 145.098 104.79 57.5602 528.599 - neutron 0 1 112.903 200.376 -358.646 -236.918 - neutron 0 1 104.797 -89.2479 177.372 410.466 - proton 1 1 38.5143 9.88655 83.4425 258.257 - neutron 0 1 26.2758 137.605 -71.3456 -161.372 - neutron 0 1 11.9843 -32.1061 -1.06014 147.078 - neutron 0 1 9.02972 -58.0892 94.6063 68.7376 - neutron 0 1 7.82982 -59.4816 61.6194 -86.2529 - neutron 0 1 7.0216 94.7119 43.2546 -49.0155 - gamma 0 0 3.34972 0.217454 2.29814 -2.42733 - neutron 0 1 2.43013 49.6038 6.19177 45.5365 - neutron 0 1 2.40774 11.0613 -25.261 -61.3985 - gamma 0 0 2.11089 1.01574 -1.3272 -1.28944 - gamma 0 0 1.94887 -1.61243 0.984057 0.479374 - neutron 0 1 1.93607 48.4491 -19.5032 -30.2357 - neutron 0 1 1.79545 -38.0019 34.3127 27.4883 - neutron 0 1 1.54162 -28.7355 40.9721 19.8707 - neutron 0 1 0.963324 -15.9767 25.0775 30.4467 - neutron 0 1 0.884703 -20.0975 -34.6879 -7.48957 - neutron 0 1 0.71139 10.2531 12.5242 32.792 - gamma 0 0 0.124852 -8.77343e-05 -0.00753198 -0.124625 - neutron 0 1 0.0731471 0.841546 -7.86283 -8.65599 - neutron 0 1 0.011888 -2.5944 2.12732 3.32908 - Pt178[0.0] 78 178 0.477299 348.775 -103.046 161.084 -0 0 0.031297 27 - proton 1 1 1000 0 0 1696.04 - proton 1 1 140.971 178.453 -277.119 419.25 - proton 1 1 133.961 -147.879 362.677 -340.481 - neutron 0 1 133.815 473.724 -82.8891 -195.134 - neutron 0 1 132.645 -285.734 -2.53862 430.352 - proton 1 1 105.367 336.02 170.614 258.477 - neutron 0 1 69.3741 29.8241 -66.9198 360.289 - proton 1 1 47.3076 -88.1721 -120.299 262.234 - proton 1 1 26.4819 91.7179 -93.39 182.378 - neutron 0 1 11.5316 135.678 -45.324 36.6001 - neutron 0 1 10.142 -64.8243 107.781 -57.8115 - neutron 0 1 9.65135 -111.801 -67.4188 34.4182 - neutron 0 1 7.01511 -59.8289 -94.5471 26.6997 - neutron 0 1 5.79911 56.2579 -29.6029 83.0039 - neutron 0 1 5.65012 3.24421 14.0342 102.185 - neutron 0 1 3.94102 -82.5898 -18.6087 -15.9335 - gamma 0 0 3.44662 -0.822866 0.865727 3.23305 - neutron 0 1 2.28498 -18.9718 46.4731 42.1821 - gamma 0 0 1.90783 0.651463 -1.08472 -1.42786 - gamma 0 0 1.82515 -0.0910014 1.17551 -1.39322 - neutron 0 1 1.52095 48.7824 21.9238 -0.0146152 - neutron 0 1 1.34697 35.6809 35.1826 -4.69047 - neutron 0 1 0.671927 -7.9795 24.259 -24.7168 - gamma 0 0 0.179345 0.052531 0.0621588 0.159817 - neutron 0 1 0.155487 8.49028 14.4267 -3.46261 - neutron 0 1 0.029671 -0.429553 -3.5615 6.54888 - Re177[0.0] 75 177 0.909543 -529.454 103.83 93.0928 -0.000142025 -0.0011493 0.0268 29 - proton 1 1 999.992 25.4807 -17.7094 1695.75 - neutron 0 1 263.199 393.653 257.056 585.507 - proton 1 1 135.251 28.1535 293.306 430.438 - neutron 0 1 105.597 -375.574 -189.088 181.027 - proton 1 1 85.0642 -251.747 -96.2459 306.958 - proton 1 1 63.6042 -142.621 -296.678 -122.651 - proton 1 1 61.3587 298.121 112.018 132.223 - neutron 0 1 24.4968 -142.509 -76.7945 142.922 - proton 1 1 13.4961 85.4757 -80.3652 108.368 - proton 1 1 12.0957 12.8511 -125.429 83.3477 - neutron 0 1 11.8677 -102.567 -101.995 -38.9735 - proton 1 1 11.559 -78.9034 -87.6922 88.9326 - neutron 0 1 10.157 125.518 -41.6673 41.2133 - neutron 0 1 9.0762 32.4442 49.0368 116.964 - neutron 0 1 4.02274 59.1988 0.82755 63.7986 - neutron 0 1 3.76527 -79.8256 -20.8197 16.8534 - neutron 0 1 3.39591 -51.6593 49.3624 35.8828 - neutron 0 1 2.92498 47.2842 50.5371 -26.743 - neutron 0 1 2.51735 -53.6834 -21.1048 -37.5426 - neutron 0 1 1.83681 -14.9872 -53.5135 19.1485 - gamma 0 0 1.8079 -0.979861 1.3378 0.720195 - neutron 0 1 1.50706 -7.11647 35.1099 39.3813 - neutron 0 1 1.26703 0.635486 -30.6098 -38.0152 - neutron 0 1 0.829978 -28.3481 22.6055 15.6748 - neutron 0 1 0.481703 -5.95145 28.7007 -6.8018 - gamma 0 0 0.47674 0.429392 -0.191408 -0.0791657 - neutron 0 1 0.44937 15.9308 11.8133 -21.2434 - neutron 0 1 0.0873812 6.6832 -7.0915 -8.32188 - Ta173[0.0] 73 173 1.01208 255.575 299.865 -413.245 -0 0 -0.0489119 8 - proton 1 1 1000 0 0 1696.04 - pi0 0 0 467.139 260.574 -63.566 521.905 - proton 1 1 270.823 37.1376 30.5996 761.079 - neutron 0 1 110.511 -224.912 25.8399 410.639 - gamma 0 0 1.01642 -0.330701 0.931723 -0.235863 - gamma 0 0 0.409352 -0.0616194 -0.331692 0.231847 - neutron 0 1 0.256063 9.37775 8.42898 -17.9514 - Au195[0.0] 79 195 0.019572 -81.7855 -1.90233 20.3677 --0.00154522 0.000579003 0.0180445 15 - proton 1 1 999.988 -87.493 32.7841 1693.45 - pi0 0 0 484.393 -208.382 129.042 552.562 - neutron 0 1 141.507 -85.566 -88.9422 520.29 - pi- -1 0 16.7475 12.1902 66.7308 18.8085 - neutron 0 1 6.87185 -4.27784 -75.145 -85.4123 - neutron 0 1 2.60028 -62.9752 25.8807 -16.0417 - neutron 0 1 2.20957 -26.2472 20.9331 55.044 - gamma 0 0 1.79055 1.52795 -0.451272 -0.8172 - neutron 0 1 1.75574 30.2565 9.90907 -47.8405 - neutron 0 1 1.38158 13.629 -32.4953 -36.829 - neutron 0 1 0.816302 -25.8553 22.2149 19.303 - neutron 0 1 0.58177 -13.2976 25.2155 -16.7605 - gamma 0 0 0.412918 -0.266554 0.302786 0.0881526 - gamma 0 0 0.168416 -0.0766106 0.0886412 -0.120985 - Tl190[0.0] 81 190 1.74946 281.85 -70.5004 731.174 --0.000470108 -0.000395645 0.0290492 24 - proton 1 1 999.996 -29.5816 -27.6474 1695.55 - proton 1 1 213.847 -202.175 260.969 581.416 - proton 1 1 153.177 432.988 -302.049 -179.428 - proton 1 1 149.001 42.2728 150.907 -526.543 - proton 1 1 96.0254 -293.885 -308.592 88.4268 - proton 1 1 78.5851 266.874 155.544 241.306 - proton 1 1 54.9273 -98.1712 -290.532 -109.747 - neutron 0 1 48.67 193.998 -179.647 154.654 - proton 1 1 13.6749 126.949 -3.50406 -98.591 - neutron 0 1 13.3463 -34.9908 47.9996 -147.408 - neutron 0 1 12.8204 -34.4771 25.7844 149.673 - neutron 0 1 5.64054 26.7068 -21.9917 -97.13 - neutron 0 1 5.12456 -73.78 -30.1199 -57.4916 - neutron 0 1 5.04705 -68.8806 57.5201 38.1634 - neutron 0 1 4.42306 -46.9498 -77.9449 -7.16791 - neutron 0 1 2.45151 38.2635 -55.5625 7.83725 - neutron 0 1 1.6931 26.9592 33.8569 -36.2123 - gamma 0 0 1.16717 0.414747 -1.08421 -0.121527 - neutron 0 1 0.870743 30.4268 12.1541 -23.7379 - gamma 0 0 0.307657 -0.110496 0.287106 0.00375806 - neutron 0 1 0.267538 16.0047 13.0253 8.77509 - neutron 0 1 0.258569 9.02 19.8184 3.43824 - neutron 0 1 0.0848137 3.77072 -0.692918 12.0285 - Ta178[0.0] 73 178 9.76843 -390.809 466.207 1693.41 -0 0 -0.0119843 36 - proton 1 1 1000 0 0 1696.04 - proton 1 1 228.216 -233.884 347.547 552.132 - neutron 0 1 181.334 335.295 -498.412 113.116 - proton 1 1 99.026 -13.6667 401.786 -184.428 - neutron 0 1 82.4216 216.427 -337.403 -31.5137 - proton 1 1 67.9246 59.7768 -298.171 198.993 - neutron 0 1 18.1502 -7.81074 79.3618 167.561 - proton 1 1 15.917 -93.1855 -45.6677 139.116 - neutron 0 1 12.8441 139.873 9.5358 68.156 - neutron 0 1 9.45156 8.6071 58.0623 120.02 - neutron 0 1 9.14737 -112.722 -62.2903 -26.2006 - neutron 0 1 9.11023 55.8232 -90.1092 77.2426 - neutron 0 1 7.62114 93.1068 37.7156 65.4818 - proton 1 1 4.57831 -22.6117 -32.7462 83.8378 - proton 1 1 4.2015 -40.5655 78.715 -7.76768 - neutron 0 1 4.0743 -4.77773 79.998 35.3587 - gamma 0 0 3.35223 2.95899 0.32206 -1.54212 - neutron 0 1 2.7974 14.1688 37.0505 60.7536 - neutron 0 1 2.48792 -40.6455 -3.73727 54.9116 - neutron 0 1 2.26812 -41.3401 46.2814 20.4024 - neutron 0 1 1.89871 55.2967 22.1276 -4.91699 - neutron 0 1 1.70687 20.1711 -51.2414 -13.3337 - neutron 0 1 1.4346 -33.015 -2.96369 39.9886 - neutron 0 1 1.36778 31.8323 19.8025 -34.1567 - neutron 0 1 1.11727 24.7718 30.6935 23.3456 - neutron 0 1 0.86923 1.03452 -18.174 36.0941 - neutron 0 1 0.828217 -8.84424 28.3314 -26.0024 - gamma 0 0 0.791958 -0.158103 -0.529615 0.567194 - neutron 0 1 0.451291 -15.3612 -24.4034 -4.09196 - gamma 0 0 0.430298 0.0534224 0.0942639 0.416433 - neutron 0 1 0.136202 15.2407 0.545778 -4.83559 - neutron 0 1 0.0861392 -10.2373 7.2638 2.07609 - neutron 0 1 0.046095 -0.929142 0.671017 9.23618 - deuteron 1 2 8.15658 -86.3567 36.1062 -147.995 - alpha 2 4 1.94699 24.1972 34.3416 112.931 - Lu163[0.0] 71 163 0.537087 -332.526 109.497 201.085 -2.65355e-05 -3.76888e-06 0.0322844 37 - proton 1 1 999.998 37.6067 -5.34134 1695.61 - pi+ 1 0 237.515 181.085 -199.633 223.76 - neutron 0 1 185.841 207.003 14.3693 583.695 - neutron 0 1 31.9628 -139.883 199.565 41.1137 - neutron 0 1 19.5252 179.85 26.2662 63.5274 - neutron 0 1 19.1356 -159.334 -16.3211 -103.299 - neutron 0 1 16.8256 -1.27361 -156.539 85.9921 - proton 1 1 14.3118 -19.7911 -21.4026 161.901 - neutron 0 1 12.7294 -33.5098 -28.6934 -148.782 - neutron 0 1 12.0282 -81.4142 126.744 -7.40599 - neutron 0 1 10.5185 -91.3888 74.5638 -77.2306 - proton 1 1 10.5161 58.3416 128.11 5.33907 - neutron 0 1 8.98334 -105.821 -63.312 -41.8938 - neutron 0 1 7.97358 12.4805 70.3499 -99.7102 - neutron 0 1 7.88735 78.0221 -10.8349 93.1597 - neutron 0 1 4.85613 62.2204 -70.1569 -18.8555 - neutron 0 1 4.66851 -71.7439 38.7587 46.3155 - proton 1 1 4.37827 -39.7329 73.7864 -34.8147 - neutron 0 1 3.72032 75.8858 35.0293 -4.37013 - neutron 0 1 3.46243 -9.03056 24.9625 76.2475 - neutron 0 1 2.917 -2.83063 -27.0961 -68.9038 - neutron 0 1 2.77287 34.6373 57.2149 27.2945 - neutron 0 1 2.42 -2.29212 41.3137 -53.3037 - proton 1 1 1.97755 21.1922 -16.1528 54.8166 - neutron 0 1 1.95359 -0.695163 48.6388 -36.1754 - proton 1 1 1.34597 6.88321 -49.5475 -5.02549 - neutron 0 1 1.18361 -17.7943 -25.3477 -35.5868 - neutron 0 1 1.13717 -14.1454 -14.3091 41.6335 - neutron 0 1 0.540587 -11.4588 -27.5884 11.1222 - neutron 0 1 0.474873 21.9075 18.0253 9.36608 - neutron 0 1 0.112139 -4.45042 12.2041 6.48012 - neutron 0 1 0.0994244 9.24451 -9.93207 -1.65361 - neutron 0 1 0.0936509 6.68644 6.25972 9.5968 - gamma 0 0 0.0778019 0.0457064 0.0480301 0.0407085 - alpha 2 4 0.931055 -67.6165 20.3745 44.211 - alpha 2 4 4.2917 -145.557 -79.8076 66.7543 - Yb159[0.0] 70 159 2.23389 101.885 -205.254 780.257 -0 0 -0.0317042 20 - proton 1 1 1000 0 0 1696.04 - proton 1 1 516.93 615.417 145.543 915.061 - proton 1 1 91.6815 175.673 -366.411 -123.821 - neutron 0 1 73.3962 230.316 -187.154 -235.023 - pi0 0 0 40.7772 -99.8853 -48.0221 -19.6856 - neutron 0 1 15.6083 -154.366 8.11358 -75.3589 - neutron 0 1 10.882 -44.7109 72.489 -115.384 - neutron 0 1 3.81142 58.8578 52.2437 31.3535 - gamma 0 0 3.17307 -2.44521 -1.10491 -1.69367 - neutron 0 1 2.22552 -54.9565 23.254 25.0205 - neutron 0 1 2.17566 -16.9263 -9.41302 60.9752 - gamma 0 0 2.01846 0.26359 1.26091 -1.55396 - neutron 0 1 1.79177 12.8124 -36.2829 43.4692 - neutron 0 1 1.27899 15.5317 -17.6186 -43.0509 - neutron 0 1 1.11401 -13.3771 1.69394 43.7355 - neutron 0 1 0.809199 -16.4431 2.33183 -35.2907 - neutron 0 1 0.617901 -2.52277 -21.0727 -26.666 - gamma 0 0 0.501526 -0.0686055 -0.341818 0.360531 - gamma 0 0 0.292774 -0.0522798 -0.192647 -0.214174 - Pt185[0.0] 78 185 6.41884 -703.119 380.686 1253.81 -0 0 -0.0118597 34 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 163.521 531.777 -200.472 105.072 - proton 1 1 127.844 25.1402 -57.2132 -502.338 - neutron 0 1 110.422 -201.726 330.782 263.78 - proton 1 1 89.2349 -24.4888 72.1824 411.833 - neutron 0 1 86.5181 208.999 -351.822 -51.0352 - proton 1 1 67.1559 169.899 15.5013 318.473 - proton 1 1 47.7434 215.034 50.9056 207.464 - neutron 0 1 18.3792 -163.621 0.60485 -90.0145 - neutron 0 1 10.9969 -4.0089 81.1939 119.067 - neutron 0 1 8.14286 -62.4714 -99.5561 39.4172 - neutron 0 1 7.60821 45.7991 81.1176 -75.3464 - proton 1 1 7.43393 112.058 31.1251 21.9014 - neutron 0 1 5.7377 22.8278 -76.7065 -66.4065 - neutron 0 1 4.83151 48.8095 -8.79455 81.5026 - neutron 0 1 3.68866 -81.2889 -11.065 14.6545 - neutron 0 1 3.08614 -38.8572 -24.1741 60.9469 - neutron 0 1 2.95166 2.72972 73.8815 -9.45166 - gamma 0 0 2.27003 -2.14852 -0.0554348 0.730631 - neutron 0 1 2.16399 -57.8841 25.9843 6.73419 - neutron 0 1 2.07063 11.1682 -18.8523 58.4392 - gamma 0 0 0.905248 0.703879 0.464288 0.32934 - neutron 0 1 0.657767 -11.1605 32.7682 6.1766 - neutron 0 1 0.538617 -4.52409 0.201536 31.4947 - gamma 0 0 0.47496 0.166478 0.0518592 0.441795 - gamma 0 0 0.234072 -0.189247 -0.101997 -0.092583 - neutron 0 1 0.150952 -3.51866 3.96686 -15.9864 - neutron 0 1 0.0944737 1.89085 -0.255027 -13.187 - neutron 0 1 0.0790516 11.4125 -3.66184 -2.21365 - alpha 2 4 11.2632 91.9608 -110.529 251.831 - alpha 2 4 9.20651 103.089 230.752 -69.5992 - deuteron 1 2 17.8623 74.8655 68.7717 238.726 - deuteron 1 2 0.0805064 11.7665 0.630918 12.7732 - Tm162[0.0] 69 162 3.9921 -1034.21 -137.626 339.921 -1.78988e-05 -9.4892e-05 -0.0121485 33 - proton 1 1 999.999 4.5966 -24.3693 1695.86 - neutron 0 1 365.273 -248.93 415.762 764.851 - neutron 0 1 120.889 -174.419 67.0935 454.815 - neutron 0 1 47.6945 -74.6097 -275.046 103.356 - pi- -1 0 26.373 -71.2192 -54.6117 1.63605 - proton 1 1 19.0359 51.6039 69.2949 169.172 - neutron 0 1 16.7543 174.697 31.4761 -15.9498 - proton 1 1 10.3834 91.7367 -105.502 6.81437 - neutron 0 1 8.92901 39.5804 31.1057 -119.684 - neutron 0 1 8.12406 -81.7901 -31.8006 87.3572 - proton 1 1 8.12385 -44.5069 -41.2628 107.83 - neutron 0 1 6.76456 -66.8579 66.6792 -61.9773 - neutron 0 1 6.02069 71.2133 -29.6492 -73.4813 - neutron 0 1 4.51727 39.5911 34.896 -75.6556 - neutron 0 1 4.18527 34.5608 64.4852 50.2932 - proton 1 1 3.74449 30.6424 70.327 -33.9984 - neutron 0 1 3.52451 12.9741 78.8562 -15.7737 - neutron 0 1 3.16352 71.5788 26.2453 -11.9303 - neutron 0 1 2.81456 -36.9322 37.0591 50.5913 - gamma 0 0 2.58851 2.39063 0.826269 0.550051 - neutron 0 1 2.50494 55.98 36.4062 15.9443 - gamma 0 0 1.25049 -1.24398 -0.125916 -0.0196296 - neutron 0 1 0.918028 1.65758 -41.0994 5.83321 - gamma 0 0 0.810011 -0.164765 -0.724711 0.322124 - neutron 0 1 0.802585 -2.37438 30.765 -23.5941 - gamma 0 0 0.75222 -0.509368 -0.433318 -0.344405 - neutron 0 1 0.69738 29.7944 13.2437 -15.7434 - neutron 0 1 0.634209 -23.9758 -5.96859 -24.1185 - gamma 0 0 0.350274 -0.0100621 0.349502 -0.0209456 - neutron 0 1 0.318955 -15.1959 -4.3758 18.6922 - neutron 0 1 0.13225 8.28777 12.0005 5.98623 - gamma 0 0 0.0624654 -0.0279216 -0.00913505 -0.0551259 - Ir174[0.0] 77 174 1.21388 131.077 -520.637 324.159 -0 0 -0.031459 40 - proton 1 1 1000 0 0 1696.04 - neutron 0 1 129.716 464.699 -47.2408 205.921 - proton 1 1 106.693 1.12815 -195.718 -416.282 - proton 1 1 95.6383 270.043 -71.9327 332.443 - proton 1 1 89.0055 -281.616 296.046 89.4092 - neutron 0 1 48.2201 273.817 44.0767 -126.565 - proton 1 1 27.8683 -112.885 195.003 -47.9964 - proton 1 1 26.6507 220.545 -45.5759 2.0791 - proton 1 1 21.8832 -44.1094 -187.149 67.6266 - neutron 0 1 15.5105 135.753 30.5583 100.122 - neutron 0 1 14.2444 157.28 39.6595 -25.6933 - neutron 0 1 13.7882 -138.377 -9.21456 82.8671 - neutron 0 1 13.3956 23.996 -155.885 -21.8053 - neutron 0 1 11.7937 -41.0722 -5.07578 -143.486 - proton 1 1 11.5507 -9.79291 -146.186 18.5129 - neutron 0 1 9.43153 121.355 33.281 44.4666 - neutron 0 1 9.32746 35.9666 -38.4197 121.839 - neutron 0 1 8.87966 -33.9687 120.963 -31.2893 - neutron 0 1 7.14418 -46.4063 -57.0532 -89.818 - neutron 0 1 6.71152 -105.559 37.0971 11.7496 - neutron 0 1 6.44417 47.5671 64.433 75.7412 - neutron 0 1 5.76391 65.938 -78.6867 18.0266 - neutron 0 1 5.72945 56.4622 -87.2314 1.38045 - neutron 0 1 3.60119 4.66457 -40.9293 71.2959 - proton 1 1 3.54876 34.6311 65.8312 33.7482 - neutron 0 1 3.03856 -38.2148 -62.1205 19.9941 - neutron 0 1 2.64606 59.4671 37.7262 4.43724 - neutron 0 1 1.87277 -36.9929 -36.2667 -28.9645 - neutron 0 1 1.80762 -28.1324 18.5916 -47.5705 - neutron 0 1 1.14329 22.1366 33.8912 22.6068 - neutron 0 1 1.10271 9.37945 -23.7452 -37.7033 - neutron 0 1 0.675933 7.66698 5.84368 -34.3175 - neutron 0 1 0.391543 -19.4319 -12.8737 13.8774 - neutron 0 1 0.252492 -19.2381 4.19738 9.31696 - neutron 0 1 0.159154 17.075 2.68295 0.586118 - gamma 0 0 0.13845 0.00052307 -0.0143693 -0.137701 - neutron 0 1 0.0982305 -4.65744 -8.34814 9.65476 - deuteron 1 2 8.38135 -135.453 -102.587 51.3718 - triton 1 3 3.20876 71.2046 -104.172 -46.0097 - Yb158[0.0] 70 158 10.754 -1004.87 486.538 1384.6 --5.99576e-05 0.000269894 -0.0242535 34 - proton 1 1 1000 -4.22127 19.0017 1695.93 - neutron 0 1 184.998 -395.332 73.6779 469.195 - proton 1 1 147.35 235.264 4.21866 492.802 - proton 1 1 140.017 80.3826 -450.916 269.379 - proton 1 1 103.063 -196.912 -368.776 171.038 - proton 1 1 89.1053 -82.1308 328.233 246.308 - neutron 0 1 51.6317 -246.774 170.157 -99.1863 - neutron 0 1 15.097 122.192 13.8707 -116.077 - neutron 0 1 10.2763 -113.862 55.9392 -57.6398 - neutron 0 1 9.40034 3.80316 48.3621 -124.095 - proton 1 1 3.33847 16.1935 -37.2926 -67.9924 - neutron 0 1 3.19537 25.2823 72.8437 8.32656 - neutron 0 1 2.73224 0.926659 67.5156 -24.1349 - neutron 0 1 2.51884 -21.5555 -44.1017 -48.2699 - proton 1 1 2.17733 -38.2342 47.3511 19.6629 - neutron 0 1 2.08427 45.1456 41.8 11.6449 - neutron 0 1 1.7004 -32.8737 9.71357 -44.9793 - neutron 0 1 1.51248 -36.5736 16.1728 -35.2882 - neutron 0 1 1.48113 49.0311 -13.5911 -14.0239 - neutron 0 1 1.47778 0.807009 40.2695 34.0125 - neutron 0 1 1.13842 40.9915 14.7274 -15.5993 - neutron 0 1 1.00194 -15.443 -25.139 31.8327 - gamma 0 0 0.901714 0.29811 -0.102801 -0.844779 - neutron 0 1 0.841211 16.0585 -33.7857 13.4947 - neutron 0 1 0.820586 -20.1927 25.3569 -22.1798 - neutron 0 1 0.704775 -3.20733 36.2274 1.46577 - neutron 0 1 0.660701 -18.399 -28.6763 -9.00706 - neutron 0 1 0.542271 -6.85843 16.8479 26.2374 - neutron 0 1 0.431081 21.1164 11.0666 -15.5522 - gamma 0 0 0.0889546 -0.0706365 -0.00551115 -0.0537869 - deuteron 1 2 5.50301 -55.667 -60.7463 117.832 - alpha 2 4 3.39718 154.476 -36.3224 -12.4395 - triton 1 3 2.01323 51.8891 85.876 -35.3301 - Yb162[0.0] 70 162 1.50162 416.012 -61.7661 525.387 --3.32223e-05 -1.92545e-07 0.0336057 47 - proton 1 1 999.999 -23.1851 -0.134372 1695.88 - proton 1 1 105.213 272.781 298.66 211.897 - proton 1 1 54.4049 47.6401 45.8238 317.307 - proton 1 1 41.9823 32.7747 -265.614 94.4404 - proton 1 1 40.5914 227.615 152.58 52.2475 - pi0 0 0 39.6415 -36.7791 -52.7743 -90.1941 - proton 1 1 30.8289 -232.871 -16.923 65.4746 - neutron 0 1 30.7884 -183.065 51.8613 150.336 - proton 1 1 26.955 -146.216 156.461 -73.8231 - proton 1 1 21.3528 -38.221 -69.7185 184.943 - neutron 0 1 15.0844 90.9779 -34.5749 -138.205 - neutron 0 1 13.6569 131.722 -92.0304 -5.42294 - neutron 0 1 12.2577 -113.423 77.1678 66.0633 - neutron 0 1 11.9641 15.6076 49.8286 141.063 - neutron 0 1 10.7812 -52.2332 -96.4919 -91.3046 - neutron 0 1 10.1541 -50.2471 -94.3764 88.0474 - neutron 0 1 9.29535 -37.6871 -101.136 -76.8425 - neutron 0 1 9.21702 24.8418 -116.784 56.1185 - neutron 0 1 8.8905 -96.6583 71.8128 47.8075 - proton 1 1 8.5111 71.093 42.9262 95.6401 - neutron 0 1 8.32198 -15.4303 -10.8659 123.9 - neutron 0 1 7.16955 -78.4318 -85.067 11.6614 - proton 1 1 6.52567 88.4879 -39.5915 53.7651 - neutron 0 1 5.21378 42.6898 58.0376 68.0718 - neutron 0 1 4.83621 24.0475 -89.2951 -23.6508 - neutron 0 1 4.46688 67.5534 2.8869 61.984 - neutron 0 1 4.35818 -60.8412 1.66046 67.1132 - neutron 0 1 4.05408 42.0873 -31.9155 69.6035 - neutron 0 1 3.82318 -41.6779 -11.1722 73.0549 - neutron 0 1 3.78594 54.3441 64.0573 8.48452 - neutron 0 1 3.29303 24.4827 -27.4691 -69.6056 - gamma 0 0 2.5727 1.15332 -2.2111 0.632217 - gamma 0 0 2.53147 -0.370082 -1.61793 -1.91146 - neutron 0 1 2.04874 24.047 0.522712 -57.2321 - gamma 0 0 1.87016 1.32871 0.0958413 1.31257 - neutron 0 1 1.78282 -1.15789 17.3143 55.2468 - proton 1 1 1.56368 39.699 4.76317 36.5796 - neutron 0 1 0.918865 -40.5417 8.69169 -2.88692 - neutron 0 1 0.837855 -17.4537 24.1203 26.2434 - neutron 0 1 0.626183 1.48557 25.5668 -22.8299 - neutron 0 1 0.44598 8.61721 -22.0008 -16.7321 - neutron 0 1 0.432131 -14.9878 -23.7848 -4.67613 - proton 1 1 0.414701 26.7498 -4.96923 -6.17488 - neutron 0 1 0.161618 -13.1569 -7.32411 8.77385 - neutron 0 1 0.149446 -11.5816 -4.59585 -11.2069 - deuteron 1 2 4.38429 18.9666 73.2411 103.642 - Er156[0.0] 68 156 0.0769138 -120.945 74.0923 47.1243 -0.000665826 -0.00088273 0.0234175 43 - proton 1 1 999.998 23.1386 -30.6764 1695.6 - proton 1 1 159.588 329.18 -362.547 -291.793 - proton 1 1 145.078 -52.7705 306.51 443.351 - neutron 0 1 97.6551 319.372 -269.855 -134.993 - neutron 0 1 45.4769 -97.5552 -271.874 -63.9766 - proton 1 1 39.1304 10.8346 151.735 227.641 - neutron 0 1 27.9844 -42.8713 -53.578 -220.592 - neutron 0 1 20.2663 -138.665 -67.3661 121.357 - proton 1 1 20.1589 -97.5755 -148.565 -81.5036 - proton 1 1 19.2354 -72.4011 154.056 86.5509 - neutron 0 1 18.9081 -118.192 145.15 29.1624 - neutron 0 1 18.1531 128.428 93.1983 -96.2382 - neutron 0 1 17.9521 -140.747 11.5472 118.801 - proton 1 1 17.1995 -55.2587 -85.1829 149.204 - neutron 0 1 15.0488 158.51 -14.5704 56.28 - proton 1 1 14.5097 -162.962 -24.9304 16.1394 - proton 1 1 10.9093 -0.050094 1.59619 143.486 - neutron 0 1 8.38531 119.094 -25.5963 -31.4447 - neutron 0 1 6.87777 -109.071 -31.0847 10.4313 - neutron 0 1 6.33105 -35.307 -83.3994 -61.1139 - neutron 0 1 5.97593 60.3089 -68.4084 54.2991 - neutron 0 1 5.032 7.93021 73.9599 -62.8343 - neutron 0 1 4.349 40.0258 -43.7503 -68.3746 - neutron 0 1 4.22924 44.3233 13.8085 -76.223 - neutron 0 1 4.10485 81.6794 -13.2613 29.7156 - neutron 0 1 2.65331 36.7572 37.7266 47.1018 - neutron 0 1 2.09295 53.8578 20.0353 -25.2038 - neutron 0 1 1.97739 -58.086 -12.2808 -13.9604 - gamma 0 0 1.90957 -1.37118 0.888317 -0.988546 - gamma 0 0 1.8484 1.76421 -0.515165 0.196832 - gamma 0 0 1.70917 0.368536 0.626659 1.54685 - gamma 0 0 1.47817 -0.871968 -1.19356 0.00757468 - neutron 0 1 1.37517 -25.8769 20.8093 38.5145 - neutron 0 1 1.34458 6.55217 19.7002 -45.7977 - proton 1 1 1.32815 19.3911 -39.4593 -23.6864 - proton 1 1 1.16174 -3.79997 40.7574 -22.4901 - neutron 0 1 0.824673 30.3847 -24.9973 -1.5003 - gamma 0 0 0.709095 -0.231434 0.113063 -0.660659 - neutron 0 1 0.49927 26.2311 14.4818 6.37576 - neutron 0 1 0.423526 25.7905 -0.830103 11.4106 - gamma 0 0 0.12532 0.118398 0.0036029 0.0409154 - alpha 2 4 9.0928 68.1002 -203.188 -148.138 - Er160[0.0] 68 160 10.3909 -332.202 709.054 1575.5 diff --git a/environments/g4py/tests/g4pytest/MedicalBeam/CMakeLists.txt b/environments/g4py/tests/g4pytest/MedicalBeam/CMakeLists.txt deleted file mode 100644 index beea193829..0000000000 --- a/environments/g4py/tests/g4pytest/MedicalBeam/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# - build library -set(_TARGET _MedicalBeam) -g4pytest_add_module(${_TARGET} MedicalBeam.cc pyMedicalBeam.cc) -target_link_libraries(${_TARGET} PRIVATE G4run G4particles) \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/MedicalBeam/MedicalBeam.cc b/environments/g4py/tests/g4pytest/MedicalBeam/MedicalBeam.cc deleted file mode 100644 index d8627a1a06..0000000000 --- a/environments/g4py/tests/g4pytest/MedicalBeam/MedicalBeam.cc +++ /dev/null @@ -1,136 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// MedicalBeam.cc -// -// 2005 Q -// ==================================================================== -#include "MedicalBeam.hh" -#include "Randomize.hh" -#include "G4Event.hh" -#include "G4ParticleTable.hh" -#include "G4PrimaryVertex.hh" - -using namespace CLHEP; - -#include - -// ==================================================================== -// -// class description -// -// ==================================================================== - -/////////////////////////////////// -MedicalBeam::MedicalBeam() - : particle(0), - kineticE(1.*MeV), - sourcePosition(G4ThreeVector()), - SSD(1.*m), - fieldShape(MedicalBeam::SQUARE), - fieldR(10.*cm) -/////////////////////////////////// -{ - fieldXY[0]= fieldXY[1]= 10.*cm; -} - - -/////////////////////////// -MedicalBeam::~MedicalBeam() -/////////////////////////// -{ -} - - -//////////////////////////////////////////////////////// -G4ThreeVector MedicalBeam::GenerateBeamDirection() const -//////////////////////////////////////////////////////// -{ - // uniform distribution in a limitted solid angle - G4double dr; - if(fieldShape == MedicalBeam::SQUARE) { - dr= std::sqrt(sqr(fieldXY[0]/2.)+sqr(fieldXY[1]/2.)); - } else { - dr= fieldR; - } - - G4double sin0= dr/SSD; - G4double cos0= std::sqrt(1.-sqr(sin0)); - - G4double x= DBL_MAX; - G4double y= DBL_MAX; - - G4double xmax, ymax; - if(fieldShape == MedicalBeam::SQUARE) { - xmax= fieldXY[0]/2./SSD; - ymax= fieldXY[1]/2./SSD; - } else { - xmax= ymax= DBL_MAX-1.; - } - - G4double dcos{0.0}; - G4double dsin{0.0}; - G4double dphi{0.0}; - - while(! (std::abs(x)< xmax && std::abs(y)< ymax) ) { - dcos= RandFlat::shoot(cos0, 1.); - dsin= std::sqrt(1.-sqr(dcos)); - dphi= RandFlat::shoot(0., twopi); - - x= std::cos(dphi)*dsin*dcos; - y= std::sin(dphi)*dsin*dcos; - } - - G4double z= dcos; - - return G4ThreeVector(x,y,z); -} - - -///////////////////////////////////////////////////// -void MedicalBeam::GeneratePrimaries(G4Event* anEvent) -///////////////////////////////////////////////////// -{ - if(particle==0) return; - - // create a new vertex - G4PrimaryVertex* vertex= new G4PrimaryVertex(sourcePosition, 0.*ns); - - // momentum - G4double mass= particle-> GetPDGMass(); - G4double p= std::sqrt(sqr(mass+kineticE)-sqr(mass)); - G4ThreeVector pmon= p*GenerateBeamDirection(); - G4PrimaryParticle* primary= new G4PrimaryParticle(particle, - pmon.x(), - pmon.y(), - pmon.z()); - // set primary to vertex - vertex-> SetPrimary(primary); - - // set vertex to event - anEvent-> AddPrimaryVertex(vertex); -} - diff --git a/environments/g4py/tests/g4pytest/MedicalBeam/MedicalBeam.hh b/environments/g4py/tests/g4pytest/MedicalBeam/MedicalBeam.hh deleted file mode 100644 index 04778fa41a..0000000000 --- a/environments/g4py/tests/g4pytest/MedicalBeam/MedicalBeam.hh +++ /dev/null @@ -1,143 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// MedicalBeam.hh -// -// 2005 Q -// ==================================================================== -#ifndef MEDICAL_BEAM_H -#define MEDICAL_BEAM_H - -#include "globals.hh" -#include "G4ThreeVector.hh" -#include "G4VUserPrimaryGeneratorAction.hh" - -class G4ParticleDefinition; - -// ==================================================================== -// -// class definition -// -// ==================================================================== -class MedicalBeam : public G4VUserPrimaryGeneratorAction { -public: - enum FieldShape{ SQUARE=0, CIRCLE }; - -protected: - G4ParticleDefinition* particle; - G4double kineticE; - G4ThreeVector sourcePosition; - - G4double SSD; // (SSD= Source Skin Depth) - FieldShape fieldShape; - G4double fieldXY[2]; - G4double fieldR; - - // local methods... - G4ThreeVector GenerateBeamDirection() const; - -public: - MedicalBeam(); - ~MedicalBeam(); - - // set/get functions... - void SetParticleDefinition(G4ParticleDefinition* pd); - const G4ParticleDefinition* GetParticleDefinition() const; - - void SetKineticE(G4double e); - G4double GetKineticE() const; - - void SetSourcePosition(const G4ThreeVector& pos); - G4ThreeVector GetSourcePosition() const; - - void SetFieldShape(FieldShape shape); - FieldShape GetFieldShape() const; - - void SetSSD(G4double ssd); - G4double GetSSD() const; - - void SetFieldXY(G4double fx, G4double fy); - G4double GetFieldX() const; - G4double GetFieldY() const; - - void SetFieldR(G4double r); - G4double GetFieldR() const; - - // methods... - virtual void GeneratePrimaries(G4Event* anEvent); - -}; - -// ==================================================================== -// inline functions -// ==================================================================== -inline void MedicalBeam::SetParticleDefinition(G4ParticleDefinition* pd) -{ particle= pd; } - -inline const G4ParticleDefinition* MedicalBeam::GetParticleDefinition() const -{ return particle; } - -inline void MedicalBeam::SetKineticE(G4double e) -{ kineticE= e; } - -inline G4double MedicalBeam::GetKineticE() const -{ return kineticE; } - -inline void MedicalBeam::SetSourcePosition(const G4ThreeVector& pos) -{ sourcePosition= pos; } - -inline G4ThreeVector MedicalBeam::GetSourcePosition() const -{ return sourcePosition; } - -inline void MedicalBeam::SetFieldShape(MedicalBeam::FieldShape shape) -{ fieldShape= shape; } - -inline MedicalBeam::FieldShape MedicalBeam::GetFieldShape() const -{ return fieldShape; } - -inline void MedicalBeam::SetSSD(G4double ssd) -{ SSD= ssd; } - -inline G4double MedicalBeam::GetSSD() const -{ return SSD; } - -inline void MedicalBeam::SetFieldXY(G4double fx, G4double fy) -{ fieldXY[0]= fx; fieldXY[1]= fy; } - -inline G4double MedicalBeam::GetFieldX() const -{ return fieldXY[0]; } - -inline G4double MedicalBeam::GetFieldY() const -{ return fieldXY[1]; } - -inline void MedicalBeam::SetFieldR(G4double r) -{ fieldR= r; } - -inline G4double MedicalBeam::GetFieldR() const -{ return fieldR; } - -#endif - diff --git a/environments/g4py/tests/g4pytest/MedicalBeam/__init__.py b/environments/g4py/tests/g4pytest/MedicalBeam/__init__.py deleted file mode 100644 index 5a0139ea8f..0000000000 --- a/environments/g4py/tests/g4pytest/MedicalBeam/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._MedicalBeam import * \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/MedicalBeam/pyMedicalBeam.cc b/environments/g4py/tests/g4pytest/MedicalBeam/pyMedicalBeam.cc deleted file mode 100644 index 4a9eec21e5..0000000000 --- a/environments/g4py/tests/g4pytest/MedicalBeam/pyMedicalBeam.cc +++ /dev/null @@ -1,162 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyMedicalBeam.cc -// -// [MedicalBeam] -// a site-module of Geant4Py -// -// primary generator action for medical beam -// -// 2005 Q -// ==================================================================== -#include -#include "MedicalBeam.hh" -#include "G4ParticleTable.hh" -#include "G4RunManager.hh" - -using namespace boost::python; - -// ==================================================================== -// thin wrappers -// ==================================================================== -namespace pyMedicalBeam { - -MedicalBeam* Construct() -{ - G4RunManager* runMgr= G4RunManager::GetRunManager(); - - MedicalBeam* medicalbeam= new MedicalBeam(); - runMgr-> SetUserAction(medicalbeam); - - return medicalbeam; -} - - -/////////////////////////////////////////////////////////////////// -void SetParticleByName(MedicalBeam* beam, const std::string& pname) -/////////////////////////////////////////////////////////////////// -{ - G4ParticleTable* particleTable= G4ParticleTable::GetParticleTable(); - G4ParticleDefinition* pd= particleTable-> FindParticle(pname); - if (pd != 0) { - beam-> SetParticleDefinition(pd); - } else { - G4cout << "*** \"" << pname << "\" is not registered " - << "in available particle list" << G4endl; - } -} - -//////////////////////////////////////////////// -std::string GetParticleByName(MedicalBeam* beam) -//////////////////////////////////////////////// -{ - const G4ParticleDefinition* pd= beam-> GetParticleDefinition(); - - if(pd==0) return std::string("None"); - else return (pd-> GetParticleName()).c_str(); -} - -//////////////////////////////////////////////////////// -void f_SetFieldXY(MedicalBeam* beam, const list& listXY) -//////////////////////////////////////////////////////// -{ - G4double fx= extract(listXY[0]); - G4double fy= extract(listXY[1]); - beam-> SetFieldXY(fx, fy); -} - - -//////////////////////////////////// -list f_GetFieldXY(MedicalBeam* beam) -//////////////////////////////////// -{ - list listFieldXY; - - listFieldXY.append(beam-> GetFieldX()); - listFieldXY.append(beam-> GetFieldY()); - - return listFieldXY; -} - -} - -using namespace pyMedicalBeam; - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_MedicalBeam) { - class_ > - ("MedicalBeam", "primary generator action with medical beam") - // --- - .add_property("particle", GetParticleByName, SetParticleByName) - .def("SetParticleByName", SetParticleByName) - .def("GetParticleByName", GetParticleByName) - // --- - .add_property("kineticE", &MedicalBeam::GetKineticE, - &MedicalBeam::SetKineticE) - .def("SetKineticE", &MedicalBeam::SetKineticE) - .def("GetKineticE", &MedicalBeam::GetKineticE) - // --- - .add_property("sourcePosition", &MedicalBeam::GetSourcePosition, - &MedicalBeam::SetSourcePosition) - .def("SetSourcePosition", &MedicalBeam::SetSourcePosition) - .def("GetSourcePosition", &MedicalBeam::GetSourcePosition) - // --- - .add_property("fieldShape", &MedicalBeam::GetFieldShape, - &MedicalBeam::SetFieldShape) - .def("SetFieldShape", &MedicalBeam::SetFieldShape) - .def("GetFieldShape", &MedicalBeam::GetFieldShape) - // --- - .add_property("SSD", &MedicalBeam::GetSSD, &MedicalBeam::SetSSD) - .def("SetSSD", &MedicalBeam::SetSSD) - .def("GetSSD", &MedicalBeam::GetSSD) - // ---- - .add_property("fieldXY", f_GetFieldXY, f_SetFieldXY) - .def("SetFieldXY", f_SetFieldXY) - .def("GetFieldXY", f_GetFieldXY) - .def("GetFieldX", &MedicalBeam::GetFieldX) - .def("GetFieldY", &MedicalBeam::GetFieldY) - // --- - .add_property("fieldR", &MedicalBeam::GetFieldR, &MedicalBeam::SetFieldR) - .def("SetFieldR", &MedicalBeam::SetFieldR) - .def("GetFieldR", &MedicalBeam::GetFieldR) - ; - - // enums... - enum_("FieldShape") - .value("SQUARE", MedicalBeam::SQUARE) - .value("CIRCLE", MedicalBeam::CIRCLE) - ; - - // --- - def("Construct", Construct, - return_value_policy()); -} - diff --git a/environments/g4py/tests/g4pytest/NISTmaterials/CMakeLists.txt b/environments/g4py/tests/g4pytest/NISTmaterials/CMakeLists.txt deleted file mode 100644 index e524a64c4c..0000000000 --- a/environments/g4py/tests/g4pytest/NISTmaterials/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# - build library -set(_TARGET _NISTmaterials) -g4pytest_add_module(${_TARGET} NISTmaterials.cc pyNISTmaterials.cc) -target_link_libraries(${_TARGET} PRIVATE G4materials) diff --git a/environments/g4py/tests/g4pytest/NISTmaterials/__init__.py b/environments/g4py/tests/g4pytest/NISTmaterials/__init__.py deleted file mode 100644 index 5849439450..0000000000 --- a/environments/g4py/tests/g4pytest/NISTmaterials/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._NISTmaterials import * \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/NISTmaterials/pyNISTmaterials.cc b/environments/g4py/tests/g4pytest/NISTmaterials/pyNISTmaterials.cc deleted file mode 100644 index e77b5a2afe..0000000000 --- a/environments/g4py/tests/g4pytest/NISTmaterials/pyNISTmaterials.cc +++ /dev/null @@ -1,49 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyNISTmaterials.cc -// -// [NISTmaterials] -// a site-module of Geant4Py -// -// NIST materials -// -// 2005 Q -// ==================================================================== -#include - -using namespace boost::python; - -void Construct(); - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_NISTmaterials) { - def("Construct", Construct); -} - diff --git a/environments/g4py/tests/g4pytest/ParticleGun/CMakeLists.txt b/environments/g4py/tests/g4pytest/ParticleGun/CMakeLists.txt deleted file mode 100644 index 45ac505cd3..0000000000 --- a/environments/g4py/tests/g4pytest/ParticleGun/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# - build library -set(_TARGET _ParticleGun) -g4pytest_add_module(${_TARGET} ParticleGunAction.cc pyParticleGun.cc) -target_link_libraries(${_TARGET} PRIVATE G4run G4particles) diff --git a/environments/g4py/tests/g4pytest/ParticleGun/ParticleGunAction.cc b/environments/g4py/tests/g4pytest/ParticleGun/ParticleGunAction.cc deleted file mode 100644 index 5b9d1044bb..0000000000 --- a/environments/g4py/tests/g4pytest/ParticleGun/ParticleGunAction.cc +++ /dev/null @@ -1,60 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// ParticleGunAction.cc -// -// 2005 Q -// ==================================================================== -#include "ParticleGunAction.hh" -#include "G4ParticleGun.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -////////////////////////////////////// -ParticleGunAction::ParticleGunAction() -////////////////////////////////////// -{ - particleGun= new G4ParticleGun; -} - -/////////////////////////////////////// -ParticleGunAction::~ParticleGunAction() -/////////////////////////////////////// -{ - delete particleGun; -} - -/////////////////////////////////////////////////////////// -void ParticleGunAction::GeneratePrimaries(G4Event* anEvent) -/////////////////////////////////////////////////////////// -{ - particleGun-> GeneratePrimaryVertex(anEvent); -} - diff --git a/environments/g4py/tests/g4pytest/ParticleGun/__init__.py b/environments/g4py/tests/g4pytest/ParticleGun/__init__.py deleted file mode 100644 index e80e543000..0000000000 --- a/environments/g4py/tests/g4pytest/ParticleGun/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._ParticleGun import * \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/ParticleGun/pyParticleGun.cc b/environments/g4py/tests/g4pytest/ParticleGun/pyParticleGun.cc deleted file mode 100644 index 4e04ce8497..0000000000 --- a/environments/g4py/tests/g4pytest/ParticleGun/pyParticleGun.cc +++ /dev/null @@ -1,79 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyParticleGun.cc -// -// [ParticleGun] -// a site-module of Geant4Py -// -// primary generator action with particle gun -// -// 2005 Q -// ==================================================================== -#include -#include "ParticleGunAction.hh" -#include "G4ParticleGun.hh" -#include "G4RunManager.hh" - -using namespace boost::python; - -// ==================================================================== -// thin wrappers -// ==================================================================== -namespace pyParticleGun { - -G4ParticleGun* Construct() -{ - G4RunManager* runMgr= G4RunManager::GetRunManager(); - - ParticleGunAction* pga= new ParticleGunAction; - runMgr-> SetUserAction(pga); - - return pga-> GetParticleGun(); -} - -} - -using namespace pyParticleGun; - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_ParticleGun) { - class_ > - ("ParticleGunAction", "primary generator action with particle gun") - .def("GetParticleGun", &ParticleGunAction::GetParticleGun, - return_internal_reference<>()) - ; - - // --- - def("Construct", Construct, - return_value_policy()); - -} - diff --git a/environments/g4py/tests/g4pytest/Qgeom/CMakeLists.txt b/environments/g4py/tests/g4pytest/Qgeom/CMakeLists.txt deleted file mode 100644 index 11bbe5c67f..0000000000 --- a/environments/g4py/tests/g4pytest/Qgeom/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# - build library -set(_TARGET _Qgeom) -g4pytest_add_module(${_TARGET} QDetectorConstruction.cc pyQgeom.cc) -target_link_libraries(${_TARGET} PRIVATE G4materials G4geometry G4run) diff --git a/environments/g4py/tests/g4pytest/Qgeom/QDetectorConstruction.cc b/environments/g4py/tests/g4pytest/Qgeom/QDetectorConstruction.cc deleted file mode 100644 index 3863c82ecf..0000000000 --- a/environments/g4py/tests/g4pytest/Qgeom/QDetectorConstruction.cc +++ /dev/null @@ -1,144 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// QDetectorConstruction.cc -// -// 2005 Q -// ==================================================================== -#include "QDetectorConstruction.hh" - -#include "G4Material.hh" -#include "G4Tubs.hh" -#include "G4Box.hh" -#include "G4LogicalVolume.hh" -#include "G4PVPlacement.hh" -#include "G4VisAttributes.hh" -#include "G4SystemOfUnits.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -// constants (detector parameters) -static const G4double DXYZ_AREA= 30.*cm; - -////////////////////////////////////////////// -QDetectorConstruction::QDetectorConstruction() -////////////////////////////////////////////// -{ -} - -/////////////////////////////////////////////// -QDetectorConstruction::~QDetectorConstruction() -/////////////////////////////////////////////// -{ -} - -///////////////////////////////////////////////////// -G4VPhysicalVolume* QDetectorConstruction::Construct() -///////////////////////////////////////////////////// -{ - G4Material* mate; - G4VisAttributes* va; - - // ============================================================== - // world volume - // ============================================================== - G4Box* areaSolid= new G4Box("AREA", - DXYZ_AREA/2., DXYZ_AREA/2., DXYZ_AREA/2.); - - G4Material* vacuum= G4Material::GetMaterial("Vacuum"); - G4LogicalVolume* areaLV= new G4LogicalVolume(areaSolid, vacuum, "AREA_LV"); - G4PVPlacement* area= new G4PVPlacement(0, G4ThreeVector(), "AREA_PV", - areaLV, 0, false, 0); - // vis. attributes - va= new G4VisAttributes(G4Color(1.,1.,1.)); - va-> SetForceWireframe(true); - areaLV-> SetVisAttributes(va); - - // ============================================================== - // detectors - // ============================================================== - // voxel - const G4double dvoxel= 10.*mm; - const G4double dl= 10.*cm; - - G4Box* svoxel= new G4Box("voxel", dvoxel, dl, dvoxel); - mate= G4Material::GetMaterial("Vacuum"); - G4LogicalVolume* lvoxel= new G4LogicalVolume(svoxel, mate, "voxel"); - va= new G4VisAttributes(G4Color(0.,0.8,0.8)); - va-> SetVisibility(false); - lvoxel-> SetVisAttributes(va); - - G4int ix, iz; - G4int index=0; - for (iz=0; iz<5; iz++) { - for (ix=-7; ix<=7; ix++) { - G4double x0= (2.*ix)*cm; - G4double z0= (-13.+2.*iz)*cm; - /*G4PVPlacement* pvoxel=*/ new G4PVPlacement(0, G4ThreeVector(x0, 0., z0), - lvoxel, "voxel", areaLV, false, index); - index++; - } - } - - // tube - //G4Tubs* stube= new G4Tubs("tube", 15./2.*mm, 19./2.*mm, dl, - G4Tubs* stube= new G4Tubs("tube", 0.*mm, 19./2.*mm, dl, - 0., 360.*deg); - mate= G4Material::GetMaterial("Al"); - G4LogicalVolume* ltube= new G4LogicalVolume(stube, mate, "tube"); - va= new G4VisAttributes(G4Color(0.,0.8,0.8)); - ltube-> SetVisAttributes(va); - - G4RotationMatrix* rmtube= new G4RotationMatrix; - rmtube-> rotateX(-90.*deg); - /*G4PVPlacement* ptube=*/ new G4PVPlacement(rmtube, G4ThreeVector(), - ltube, "tube", lvoxel, false, 0); - - // cal - const G4double dxycal= 25.*mm; - const G4double dzcal= 3.*cm; - - G4Box* scal= new G4Box("cal", dxycal, dxycal, dzcal); - mate= G4Material::GetMaterial("CsI"); - G4LogicalVolume* lcal= new G4LogicalVolume(scal, mate, "cal"); - va= new G4VisAttributes(G4Color(0.5,0.5,0.)); - lcal-> SetVisAttributes(va); - - index= 0; - for (ix=-2; ix<=2; ix++) { - G4double x0= (5.*ix)*cm; - /*G4PVPlacement* pcal=*/ new G4PVPlacement(0, G4ThreeVector(x0, 0., 2.*cm), - lcal, "cal", areaLV, false, index); - index++; - } - - return area; -} - diff --git a/environments/g4py/tests/g4pytest/Qgeom/QDetectorConstruction.hh b/environments/g4py/tests/g4pytest/Qgeom/QDetectorConstruction.hh deleted file mode 100644 index 5b392c7da9..0000000000 --- a/environments/g4py/tests/g4pytest/Qgeom/QDetectorConstruction.hh +++ /dev/null @@ -1,52 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// QDetectorConstruction.hh -// -// 2005 Q -// ==================================================================== -#ifndef Q_DETECTOR_CONSTRUCTION_H -#define Q_DETECTOR_CONSTRUCTION_H - -#include "G4VUserDetectorConstruction.hh" - -// ==================================================================== -// -// class definition -// -// ==================================================================== - -class QDetectorConstruction : public G4VUserDetectorConstruction { - -public: - QDetectorConstruction(); - ~QDetectorConstruction(); - - virtual G4VPhysicalVolume* Construct(); - -}; - -#endif diff --git a/environments/g4py/tests/g4pytest/Qgeom/__init__.py b/environments/g4py/tests/g4pytest/Qgeom/__init__.py deleted file mode 100644 index 85ffff076a..0000000000 --- a/environments/g4py/tests/g4pytest/Qgeom/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._Qgeom import * \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/Qgeom/pyQgeom.cc b/environments/g4py/tests/g4pytest/Qgeom/pyQgeom.cc deleted file mode 100644 index 6f83400311..0000000000 --- a/environments/g4py/tests/g4pytest/Qgeom/pyQgeom.cc +++ /dev/null @@ -1,71 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyQgeom.cc -// -// [Qgeom] -// a site-module of Geant4Py -// -// A sample geometry -// -// 2005 Q -// ==================================================================== -#include -#include "G4RunManager.hh" -#include "QDetectorConstruction.hh" - -using namespace boost::python; - -// ==================================================================== -// thin wrappers -// ==================================================================== -namespace pyQgeom { - -void Construct() -{ - G4RunManager* runMgr= G4RunManager::GetRunManager(); - runMgr-> SetUserInitialization(new QDetectorConstruction); -} - -} - -using namespace pyQgeom; - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_Qgeom) { - - class_ > - ("QDetectorConstruction", "my detector") - ; - - // --- - def("Construct", Construct); -} - diff --git a/environments/g4py/tests/g4pytest/Qmaterials/CMakeLists.txt b/environments/g4py/tests/g4pytest/Qmaterials/CMakeLists.txt deleted file mode 100644 index 723d52444c..0000000000 --- a/environments/g4py/tests/g4pytest/Qmaterials/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# - build library -set(_TARGET _Qmaterials) -g4pytest_add_module(${_TARGET} Qmaterials.cc pyQmaterials.cc) -target_link_libraries(${_TARGET} PRIVATE G4materials) \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/Qmaterials/Qmaterials.cc b/environments/g4py/tests/g4pytest/Qmaterials/Qmaterials.cc deleted file mode 100644 index b9ace7959f..0000000000 --- a/environments/g4py/tests/g4pytest/Qmaterials/Qmaterials.cc +++ /dev/null @@ -1,142 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// Qmaterials.cc -// -// 2005 Q -// ==================================================================== -#include "G4Material.hh" -#include "G4SystemOfUnits.hh" -#include "G4PhysicalConstants.hh" - -//////////////// -void Construct() -//////////////// -{ - G4double A, Z; - - // ------------------------------------------------------------------------ - // Elements - // ------------------------------------------------------------------------ - G4Element* elH = new G4Element("Hydrogen","H", Z=1., A=1.00794*g/mole); - G4Element* elC = new G4Element("Carbon", "C", Z=6., A= 12.011 *g/mole); - G4Element* elN = new G4Element("Nitrogen","N", Z=7., A= 14.00674*g/mole); - G4Element* elO = new G4Element("Oxygen", "O", Z=8., A= 15.9994*g/mole); - G4Element* elNa = new G4Element("Sodium", "Na", Z=11., A= 22.989768*g/mole); - G4Element* elSi = new G4Element("Silicon", "Si", Z=14., A= 28.0855*g/mole); - G4Element* elAr = new G4Element("Argon", "Ar", Z=18., A= 39.948*g/mole); - G4Element* elI = new G4Element("Iodine", "I", Z=53., A= 126.90447*g/mole); - G4Element* elCs = new G4Element("Cesium", "Cs", Z=55., A= 132.90543*g/mole); - - // ------------------------------------------------------------------------ - // Materials - // ------------------------------------------------------------------------ - G4double density, massfraction; - G4int natoms, nel; - - // temperature of experimental hall is controlled at 20 degree. - const G4double expTemp= STP_Temperature+20.*kelvin; - - // vacuum - density= universe_mean_density; - G4Material* Vacuum= new G4Material("Vacuum", density, nel=2); - Vacuum-> AddElement(elN, .7); - Vacuum-> AddElement(elO, .3); - - // air - density= 1.2929e-03 *g/cm3; // at 20 degree - G4Material* Air= new G4Material("Air", density, nel=3, - kStateGas, expTemp); - G4double ttt= 75.47+23.20+1.28; - Air-> AddElement(elN, massfraction= 75.47/ttt); - Air-> AddElement(elO, massfraction= 23.20/ttt); - Air-> AddElement(elAr, massfraction= 1.28/ttt); - - // Ar gas - A= 39.948 *g/mole; - const G4double denAr= 1.782e-03 *g/cm3 * STP_Temperature/expTemp; - G4Material* Ar= new G4Material("ArgonGas", Z=18., A, denAr, - kStateGas, expTemp); - - // ethane (C2H6) - const G4double denEthane= 1.356e-3 *g/cm3 * STP_Temperature/expTemp; - G4Material* Ethane= new G4Material("Ethane", denEthane, nel=2, - kStateGas, expTemp); - Ethane-> AddElement(elC, natoms=2); - Ethane-> AddElement(elH, natoms=6); - - // Ar(50%) + ethane(50%) mixture - density= (denAr+denEthane)/2.; - G4Material* ArEthane= new G4Material("ArEthane", density, nel=2, - kStateGas, expTemp); - ArEthane-> AddMaterial(Ar, massfraction= denAr/density/2.); - ArEthane-> AddMaterial(Ethane, massfraction= denEthane/density/2.); - - // silicon - A= 28.0855 *g/mole; - density= 2.33 *g/cm3; - /*G4Material* Si=*/ new G4Material("SiliconWafer", Z=14., A, density); - - // alminium - A= 26.98 *g/mole; - density= 2.70 *g/cm3; - /*G4Material* Al=*/ new G4Material("Al", Z=13., A, density); - - // iron - A= 55.847 *g/mole; - density= 7.87 *g/cm3; - /*G4Material* Fe=*/ new G4Material("Iron", Z=26., A, density); - - // lead - A= 207.2 *g/mole; - density= 11.35 *g/cm3; - /*G4Material* Pb=*/ new G4Material("Lead", Z=82., A, density); - - // scintillator (Polystyene(C6H5CH=CH2)) - density= 1.032 *g/cm3; - G4Material* Scinti= new G4Material("Scinti", density, nel=2); - Scinti-> AddElement(elC, natoms=8); - Scinti-> AddElement(elH, natoms=8); - - // quartz (SiO2, crystalline) - density= 2.64 *g/cm3; - G4Material* Quartz= new G4Material("Quartz", density, nel= 2); - Quartz-> AddElement(elSi, natoms=1); - Quartz-> AddElement(elO, natoms=2); - - // NaI crystal - density= 3.67 *g/cm3; - G4Material* NaI= new G4Material("NaI", density, nel= 2); - NaI-> AddElement(elNa, natoms=1); - NaI-> AddElement(elI, natoms=1); - - // CsI crystal - density= 4.51 *g/cm3; - G4Material* CsI= new G4Material("CsI", density, nel= 2); - CsI-> AddElement(elCs, natoms=1); - CsI-> AddElement(elI, natoms=1); - -} diff --git a/environments/g4py/tests/g4pytest/Qmaterials/__init__.py b/environments/g4py/tests/g4pytest/Qmaterials/__init__.py deleted file mode 100644 index 02c5a31c43..0000000000 --- a/environments/g4py/tests/g4pytest/Qmaterials/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._Qmaterials import * \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/Qmaterials/pyQmaterials.cc b/environments/g4py/tests/g4pytest/Qmaterials/pyQmaterials.cc deleted file mode 100644 index 5355fd8660..0000000000 --- a/environments/g4py/tests/g4pytest/Qmaterials/pyQmaterials.cc +++ /dev/null @@ -1,49 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyQmaterials.cc -// -// [Qmaterials] -// a site-module of Geant4Py -// -// A sample set of materials -// -// 2005 Q -// ==================================================================== -#include - -using namespace boost::python; - -void Construct(); - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_Qmaterials) { - def("Construct", Construct); -} - diff --git a/environments/g4py/tests/g4pytest/__init__.py b/environments/g4py/tests/g4pytest/__init__.py deleted file mode 100644 index b58d11dea5..0000000000 --- a/environments/g4py/tests/g4pytest/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ - -# Geant4Py site-modules - diff --git a/environments/g4py/tests/g4pytest/emcalculator/emcalculator.py b/environments/g4py/tests/g4pytest/emcalculator/emcalculator.py deleted file mode 100644 index e63d1a2952..0000000000 --- a/environments/g4py/tests/g4pytest/emcalculator/emcalculator.py +++ /dev/null @@ -1,149 +0,0 @@ -""" -# ================================================================== -# Python module (Python3) -# -# Calculation of photon cross section and stopping power for -# chared particles -# -# Q, 2005 -# ================================================================== -""" -from Geant4 import * - -# ================================================================== -# public symbols -# ================================================================== -__all__ = [ 'CalculatePhotonCrossSection', 'CalculateDEDX' ] - -# ================================================================== -# Photon Cross Section -# ================================================================== -def CalculatePhotonCrossSection(mat, elist, verbose=0, - plist=["compt", "", "phot", "conv"]): - """ - Calculate photon cross section for a given material and - a list of energy, returing a list of cross sections for - the components of "Copmton scattering", "rayleigh scattering", - "photoelectric effect", "pair creation" and total one. - - Arguments: - mat: material name - elist: list of energy - verbose: verbose level [0] - plist: list of process name - (compton/rayleigh/photoelectic/conversion) [StandardEM set] - - Keys of index: - "compt": Compton Scattering - "rayleigh": Rayleigh Scattering - "phot" : photoelectric effect - "conv" : pair Creation - "tot" : total - - Example: - xsec_list= CalculatePhotonCrossSection(...) - value= xsec_list[energy_index]["compt"] - """ - if(verbose>0): - print("-------------------------------------------------------------------") - print(" Photon Cross Section (", mat, ")") - print("Energy Compton Raleigh Photo- Pair Total") - print(" Scattering Scattering electric Creation") - print("(MeV) (cm2/g) (cm2/g) (cm2/g) (cm2/g) (cm2/g)") - print("-------------------------------------------------------------------") - - xsection_list= [] - for ekin in elist: - xsec= {} - xsec["compt"] \ - = gEmCalculator.ComputeCrossSectionPerVolume(ekin, "gamma", plist[0], - mat) * cm2/g - xsec["rayleigh"] \ - = gEmCalculator.ComputeCrossSectionPerVolume(ekin, "gamma", plist[1], - mat) * cm2/g - - xsec["phot"] \ - = gEmCalculator.ComputeCrossSectionPerVolume(ekin, "gamma", plist[2], - mat) * cm2/g - xsec["conv"] \ - = gEmCalculator.ComputeCrossSectionPerVolume(ekin, "gamma", plist[3], - mat) * cm2/g - - xsec["tot"]= xsec["compt"] + xsec["rayleigh"] + xsec["phot"] + xsec["conv"] - - xsection_list.append((ekin, xsec)) - - if(verbose>0): - print(" %8.3e %8.3e %8.3e %8.3e %8.3e %8.3e" \ - % (ekin/MeV, xsec["compt"]/(cm2/g), xsec["rayleigh"]/(cm2/g), - xsec["phot"]/(cm2/g), xsec["conv"]/(cm2/g), xsec["tot"]/(cm2/g))) - - return xsection_list - - -# ================================================================== -# Stopping Power -# ================================================================== -def CalculateDEDX(part, mat, elist, verbose=0, - plist=["eIoni", "eBrem", "muIoni", "muBrems", "hIoni"]): - """ - Calculate stopping powers for a give particle, material and - a list of energy, returing stopping power for the components of - "Ionization", "Radiation" and total one. - - Arguments: - part: particle name - mat: material name - elist: list of energy - verbose: verbose level [0] - plist: list of process name - (electron ionization/electron brems/ - muon ionization/muon brems/hadron ionization) [StandardEM set] - - Keys of index: - "ioni": ionization - "brems": Bremsstrahlung - "tot": total - - Example: - dedx_list= CalculateDEDX(...) - value= dedx_list[energy_index]["ioni"] - """ - if(verbose>0): - print("------------------------------------------------------") - print(" Stopping Power (", part, ",", mat, ")") - print(" Energy Ionization Radiation Total") - print(" (MeV) (MeVcm2/g) (MeVcm2/g) (MeVcm2/g)") - print("------------------------------------------------------") - - procname_brems= "" - procname_ioni= "" - if ( part=="e+" or part=="e-" ): - procname_ioni= plist[0] - procname_brems= plist[1] - elif ( part=="mu+" or part=="mu-"): - procname_ioni= plist[2] - procname_brems= plist[3] - else: - procname_ioni= plist[4] - procname_brems= "" - - dedx_list= [] - for ekin in elist: - dedx= {} - dedx["ioni"] \ - = gEmCalculator.ComputeDEDX(ekin, part, procname_ioni, mat) * MeV*cm2/g - dedx["brems"] \ - = gEmCalculator.ComputeDEDX(ekin, part, procname_brems, mat) * MeV*cm2/g - dedx["tot"]= dedx["ioni"]+ dedx["brems"] - - if(verbose>0): - print(" %8.3e %8.3e %8.3e %8.3e" \ - % (ekin/MeV, dedx["ioni"]/(MeV*cm2/g), - dedx["brems"]/(MeV*cm2/g), dedx["tot"]/(MeV*cm2/g) )) - - - dedx_list.append((ekin, dedx)) - - return dedx_list - diff --git a/environments/g4py/tests/g4pytest/ezgeom/CMakeLists.txt b/environments/g4py/tests/g4pytest/ezgeom/CMakeLists.txt deleted file mode 100644 index 1ba9a56b08..0000000000 --- a/environments/g4py/tests/g4pytest/ezgeom/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# - build library -set(_TARGET _ezgeom) -g4pytest_add_module(${_TARGET} - EzDetectorConstruction.cc - G4EzVolume.cc - G4EzVoxelParameterization.cc - G4EzWorld.cc - pyEzgeom.cc -) -target_link_libraries(${_TARGET} PRIVATE G4materials G4geometry G4run) diff --git a/environments/g4py/tests/g4pytest/ezgeom/G4EzVolume.cc b/environments/g4py/tests/g4pytest/ezgeom/G4EzVolume.cc deleted file mode 100644 index 26733fff46..0000000000 --- a/environments/g4py/tests/g4pytest/ezgeom/G4EzVolume.cc +++ /dev/null @@ -1,311 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// G4EzVolume.cc -// -// 2005 Q -// ==================================================================== -#include "G4Material.hh" -#include "G4Box.hh" -#include "G4Tubs.hh" -#include "G4Cons.hh" -#include "G4Sphere.hh" -#include "G4Orb.hh" -#include "G4PVPlacement.hh" -#include "G4PVReplica.hh" -#include "G4PVParameterised.hh" -#include "G4VisAttributes.hh" - -#include "G4EzWorld.hh" -#include "G4EzVolume.hh" -#include "G4EzVoxelParameterization.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -//////////////////////// -G4EzVolume::G4EzVolume() - : name("MyVolume"), - solid(0), - lv(0), lvsub(0), - nplacement(0) -//////////////////////// -{ -} - - -///////////////////////////////////////////// -G4EzVolume::G4EzVolume(const G4String& aname) - : name(aname), solid(0), lv(0), lvsub(0), - nplacement(0) -///////////////////////////////////////////// -{ -} - - -///////////////////////// -G4EzVolume::~G4EzVolume() -///////////////////////// -{ -} - - -/////////////////////////////////////////////////////////////////////// -void G4EzVolume::CreateBoxVolume(G4Material* amaterial, - G4double dx, G4double dy, G4double dz) -/////////////////////////////////////////////////////////////////////// -{ - if(lv !=0 ) { - G4cout << "%%% Warning (G4EzVolume): volume is already created." - << G4endl; - return; - } - - solid= new G4Box(name, dx/2., dy/2., dz/2.); - lv= new G4LogicalVolume(solid, amaterial, name); - - // vis. attributes - va= new G4VisAttributes(); - lv-> SetVisAttributes(va); -} - - -//////////////////////////////////////////////////////////////////////////// -void G4EzVolume::CreateTubeVolume(G4Material* amaterial, - G4double rmin, G4double rmax, G4double dz, - G4double phi0, G4double dphi) -//////////////////////////////////////////////////////////////////////////// -{ - if(lv !=0 ) { - G4cout << "%%% Warning (G4EzVolume): volume is already created." - << G4endl; - return; - } - - solid= new G4Tubs(name, rmin, rmax, dz, phi0, dphi); - lv= new G4LogicalVolume(solid, amaterial, name); - - // vis. attributes - va= new G4VisAttributes(); - lv-> SetVisAttributes(va); -} - - -///////////////////////////////////////////////////////////////// -void G4EzVolume::CreateConeVolume(G4Material* amaterial, - G4double rmin1, G4double rmax1, - G4double rmin2, G4double rmax2, - G4double dz, - G4double phi0, G4double dphi) -///////////////////////////////////////////////////////////////// -{ - if(lv !=0 ) { - G4cout << "%%% Warning (G4EzVolume): volume is already created." - << G4endl; - return; - } - - solid= new G4Cons(name, rmin1, rmax1, rmin2, rmax2, - dz, phi0, dphi); - lv= new G4LogicalVolume(solid, amaterial, name); - - // vis. attributes - va= new G4VisAttributes(); - lv-> SetVisAttributes(va); -} - - -///////////////////////////////////////////////////////////////////// -void G4EzVolume::CreateSphereVolume(G4Material* amaterial, - G4double rmin, G4double rmax, - G4double phi0, G4double dphi, - G4double theta0, G4double dtheta) -///////////////////////////////////////////////////////////////////// -{ - if(lv !=0 ) { - G4cout << "%%% Warning (G4EzVolume): volume is already created." - << G4endl; - return; - } - - solid= new G4Sphere(name, rmin, rmax, phi0, dphi, theta0, dtheta); - lv= new G4LogicalVolume(solid, amaterial, name); - - // vis. attributes - va= new G4VisAttributes(); - lv-> SetVisAttributes(va); -} - - -////////////////////////////////////////////////////////////////////// -void G4EzVolume::CreateOrbVolume(G4Material* amaterial, G4double rmax) -////////////////////////////////////////////////////////////////////// -{ - if(lv !=0 ) { - G4cout << "%%% Warning (G4EzVolume): volume is already created." - << G4endl; - return; - } - - solid= new G4Orb(name, rmax); - lv= new G4LogicalVolume(solid, amaterial, name); - - // vis. attributes - va= new G4VisAttributes(); - lv-> SetVisAttributes(va); -} - - -//////////////////////////////////////////////////////////////// -G4VPhysicalVolume* G4EzVolume::PlaceIt(const G4ThreeVector& pos, - G4int ncopy, - G4EzVolume* parent) -//////////////////////////////////////////////////////////////// -{ - if(lv==0) { - G4cout << "%%% Warning (G4EzVolume): volume is not yet created." - << G4endl; - return 0; - } - - G4PVPlacement* pv; - if(parent==0) { // place it in the world - G4VPhysicalVolume* world= G4EzWorld::GetWorldVolume(); - pv= new G4PVPlacement(0, pos, name, lv, world, false, ncopy); - } else { - pv= new G4PVPlacement(0, pos, lv, name, parent->lv, false, ncopy); - } - - nplacement++; - return pv; -} - - -////////////////////////////////////////////////////////////////////// -G4VPhysicalVolume* G4EzVolume::PlaceIt(const G4Transform3D& transform, - G4int ncopy, - G4EzVolume* parent) -////////////////////////////////////////////////////////////////////// -{ - if(lv==0) { - G4cout << "%%% Warning (G4EzVolume): volume is not yet created." - << G4endl; - return 0; - } - - G4PVPlacement* pv; - if(parent==0) { // place it in the world - G4VPhysicalVolume* world= G4EzWorld::GetWorldVolume(); - pv= new G4PVPlacement(transform, name, lv, world, false, ncopy); - } else { - pv= new G4PVPlacement(transform, lv, name, parent->lv, false, ncopy); - } - - nplacement++; - return pv; -} - - -/////////////////////////////////////////////////////////////////////////// -G4VPhysicalVolume* G4EzVolume::ReplicateIt(G4EzVolume* parent, - EAxis pAxis, G4int nReplicas, - G4double width, G4double offset) -/////////////////////////////////////////////////////////////////////////// -{ - if(lv==0) { - G4cout << "%%% Warning (G4EzVolume): volume is not yet created." - << G4endl; - return 0; - } - - G4PVReplica* pv= - new G4PVReplica(name, lv, parent->lv, pAxis, nReplicas, width, offset); - - nplacement += nReplicas; - return pv; -} - - -////////////////////////////////////////////////////////////////// -G4ThreeVector G4EzVolume::VoxelizeIt(G4int nx, G4int ny, G4int nz) -////////////////////////////////////////////////////////////////// -{ - // creating voxel volume... - G4Box* avolume= dynamic_cast(solid); - if(avolume ==0 ) { - G4cout << "%%% Error (G4EzVolume): voxelization is valid " - << "only for Box geometry." << G4endl; - return G4ThreeVector(); - } - - if(lvsub !=0) { - G4cout << "%%% Error (G4EzVolume): already voxelized." << G4endl; - return G4ThreeVector(); - } - - G4double dx= (avolume-> GetXHalfLength())*2.; - G4double dy= (avolume-> GetYHalfLength())*2.; - G4double dz= (avolume-> GetZHalfLength())*2.; - - // voxel size - G4double ddx= dx/nx; - G4double ddy= dy/ny; - G4double ddz= dz/nz; - - G4Box* voxel= new G4Box("voxel", ddx/2., ddy/2., ddz/2.); - G4Material* voxelMaterial= lv-> GetMaterial(); - lvsub= new G4LogicalVolume(voxel, voxelMaterial, "voxel"); - - G4VisAttributes* vavoxel= new G4VisAttributes(G4Color(1.,0.,0.)); - lvsub-> SetVisAttributes(vavoxel); - - G4EzVoxelParameterization* voxelParam= - new G4EzVoxelParameterization(ddx, ddy, ddz, nx, ny, nz); - G4int nvoxel= nx*ny*nz; - new G4PVParameterised(name+"_voxel", lvsub, lv, kXAxis, - nvoxel, voxelParam); - - return G4ThreeVector(ddx, ddy, ddz); -} - - - -//////////////////////////////////////////////////////////////// -void G4EzVolume::SetSensitiveDetector(G4VSensitiveDetector* asd) -//////////////////////////////////////////////////////////////// -{ - if(lvsub!=0) { - lvsub-> SetSensitiveDetector(asd); - return; - } - - if(lv!=0) lv-> SetSensitiveDetector(asd); - -} - diff --git a/environments/g4py/tests/g4pytest/ezgeom/G4EzVolume.hh b/environments/g4py/tests/g4pytest/ezgeom/G4EzVolume.hh deleted file mode 100644 index d67fd956b0..0000000000 --- a/environments/g4py/tests/g4pytest/ezgeom/G4EzVolume.hh +++ /dev/null @@ -1,165 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// G4EzVolume.hh -// -// Utility class for supporting creating user geometry -// -// * wrapper of logical volume -// -// 2005 Q -// ==================================================================== -#ifndef G4_EZ_VOLUME_H -#define G4_EZ_VOLUME_H - -#include "G4LogicalVolume.hh" -#include "G4VisAttributes.hh" -#include "G4Transform3D.hh" - -// ==================================================================== -// -// class definition -// -// ==================================================================== -class G4Material; -class G4VSolid; -class G4VPhysicalVolume; - -class G4EzVolume { -protected: - // volume information - G4String name; - G4VSolid* solid; - G4LogicalVolume* lv; - G4LogicalVolume* lvsub; // logical volume for voxels - G4VisAttributes* va; - G4int nplacement; // # of placements - -public: - G4EzVolume(); - G4EzVolume(const G4String& aname); - ~G4EzVolume(); - - // createing volume - void CreateBoxVolume(G4Material* amaterial, - G4double dx, G4double dy, G4double dz); - - void CreateTubeVolume(G4Material* amaterial, - G4double rmin, G4double rmax, - G4double dz, - G4double phi0=0., G4double dphi=360*deg); - - void CreateConeVolume(G4Material* amaterial, - G4double rmin1, G4double rmax1, - G4double rmin2, G4double rmax2, - G4double dz, - G4double phi0=0., G4double dphi=360.*deg); - - void CreateSphereVolume(G4Material* amaterial, - G4double rmin, G4double rmax, - G4double phi0=0., G4double dphi=360.*deg, - G4double theta0=0., G4double dtheta=180.*deg); - - void CreateOrbVolume(G4Material* amaterial, G4double rmax); - - - // placement - G4VPhysicalVolume* PlaceIt(const G4ThreeVector& pos, G4int ncopy=0, - G4EzVolume* parent=0); - - G4VPhysicalVolume* PlaceIt(const G4Transform3D& transform, G4int ncopy=0, - G4EzVolume* parent=0); - // replica - // parent volume should be exactly filled with replicated volumes. - G4VPhysicalVolume* ReplicateIt(G4EzVolume* parent, - EAxis pAxis, G4int nReplicas, - G4double width, G4double offset=0); - // voxelize - // volume should be "BOX". otherwise, error. - // returning voxel size in each dimension - G4ThreeVector VoxelizeIt(G4int nx, G4int ny, G4int nz); - - // sensitivity - // in the case of voxelized, SD will be set to a voxel. - void SetSensitiveDetector(G4VSensitiveDetector* asd); - - // direct access to properties - const G4String& GetName() const; - - void SetSolid(G4VSolid* asolid); - const G4VSolid* GetSolid() const; - - void SetMaterial(G4Material* amaterial); - G4Material* GetMaterial() const; - - G4int GetNofPlacements() const; - - void SetVisibility(G4bool qvisible); - void SetColor(const G4Color& color); - void SetColor(G4double red, G4double green, G4double blue); - -}; - -// ==================================================================== -// inline functions -// ==================================================================== - -inline const G4String& G4EzVolume::GetName() const { return name; } - -inline void G4EzVolume::SetSolid(G4VSolid* asolid) { solid= asolid; } - -inline const G4VSolid* G4EzVolume::GetSolid() const { return solid; } - -inline void G4EzVolume::SetMaterial(G4Material* amaterial) -{ - if(lv!= 0) lv-> SetMaterial(amaterial); - if(lvsub!= 0) lvsub-> SetMaterial(amaterial); -} - -inline G4Material* G4EzVolume::GetMaterial() const -{ - if(lv!=0) return lv-> GetMaterial(); - else return 0; -} - -inline G4int G4EzVolume::GetNofPlacements() const { return nplacement; } - -inline void G4EzVolume::SetVisibility(G4bool qvisible) -{ - if(va!=0) va-> SetVisibility(qvisible); -} - -inline void G4EzVolume::SetColor(const G4Color& color) -{ - if(va!=0) va-> SetColor(color); -} - -inline void G4EzVolume::SetColor(G4double red, G4double green, G4double blue) -{ - if(va!=0) va-> SetColor(red, green, blue); -} - -#endif diff --git a/environments/g4py/tests/g4pytest/ezgeom/G4EzVoxelParameterization.cc b/environments/g4py/tests/g4pytest/ezgeom/G4EzVoxelParameterization.cc deleted file mode 100644 index 14d1bcc40e..0000000000 --- a/environments/g4py/tests/g4pytest/ezgeom/G4EzVoxelParameterization.cc +++ /dev/null @@ -1,89 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// G4EzVoxelParameterization.cc -// -// 2005 Q -// ==================================================================== -#include "G4EzVoxelParameterization.hh" -#include "G4Box.hh" -#include "G4VPhysicalVolume.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -////////////////////////////////////////////////////////////////////////// -G4EzVoxelParameterization::G4EzVoxelParameterization - (G4double ddx, G4double ddy, G4double ddz, G4int nx, G4int ny, G4int nz) - : voxelSize(ddx, ddy, ddz), motherSize(ddx*nx, ddy*ny, ddz*nz) -////////////////////////////////////////////////////////////////////////// -{ - nvoxels[0]= nx; - nvoxels[1]= ny; - nvoxels[2]= nz; -} - - -/////////////////////////////////////////////////////// -G4EzVoxelParameterization::~G4EzVoxelParameterization() -/////////////////////////////////////////////////////// -{ -} - - -/////////////////////////////////////////////////////////// -void G4EzVoxelParameterization::ComputeTransformation - (const G4int copyNo, G4VPhysicalVolume* physVol) const -/////////////////////////////////////////////////////////// -{ - // copyNo-> index - G4int nxy= nvoxels[0]*nvoxels[1]; - G4int iz= copyNo/nxy; - G4int ixy= copyNo - iz*nxy; - G4int iy= ixy/nvoxels[0]; - G4int ix= ixy-iy*nvoxels[0]; - - // voxel position - G4double px= voxelSize[0]*(ix+0.5) - motherSize[0]/2.; - G4double py= voxelSize[1]*(iy+0.5) - motherSize[1]/2.; - G4double pz= voxelSize[2]*(iz+0.5) - motherSize[2]/2.; - - physVol-> SetTranslation(G4ThreeVector(px, py, pz)); - -} - - -////////////////////////////////////////////////////////////////////////////// -void G4EzVoxelParameterization::ComputeDimensions - (G4Box& /*aBox*/, const G4int /*copyNo*/, const G4VPhysicalVolume* /*physVol*/) const -////////////////////////////////////////////////////////////////////////////// -{ - return; -} - diff --git a/environments/g4py/tests/g4pytest/ezgeom/G4EzWorld.cc b/environments/g4py/tests/g4pytest/ezgeom/G4EzWorld.cc deleted file mode 100644 index 0c317efa4c..0000000000 --- a/environments/g4py/tests/g4pytest/ezgeom/G4EzWorld.cc +++ /dev/null @@ -1,137 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// G4EzWorld.cc -// -// 2005 Q -// ==================================================================== -#include "G4EzWorld.hh" -#include "G4Element.hh" -#include "G4Material.hh" -#include "G4Box.hh" -#include "G4LogicalVolume.hh" -#include "G4PVPlacement.hh" -#include "G4VisAttributes.hh" -#include "G4RunManager.hh" -#include "G4PhysicalConstants.hh" - -G4VPhysicalVolume* G4EzWorld::world= G4EzWorld::CreateWorld(); - -// ==================================================================== -// -// class description -// -// ==================================================================== - -////////////////////// -G4EzWorld::G4EzWorld() -////////////////////// -{ -} - -/////////////////////// -G4EzWorld::~G4EzWorld() -/////////////////////// -{ - world= 0; -} - - -////////////////////////////////////////////////////////// -G4VPhysicalVolume* G4EzWorld::CreateWorld - (G4double dx, G4double dy, G4double dz) -////////////////////////////////////////////////////////// -{ - // default matetial is "vacuum" - G4Material* vacuum= G4Material::GetMaterial("_Vacuum", false); - - if(vacuum==0) { - G4Element* elN= new G4Element("_N", "", 7., 14.00674*g/mole); - G4Element* elO= new G4Element("_O", "", 8., 15.9994*g/mole); - - vacuum= new G4Material("_Vacuum", universe_mean_density, 2); - vacuum-> AddElement(elN, 0.7); - vacuum-> AddElement(elO, 0.3); - } - - G4Box* sdworld= new G4Box("world", dx/2., dy/2., dz/2.); - G4LogicalVolume* lvworld= new G4LogicalVolume(sdworld, vacuum, "word"); - G4PVPlacement* aworld= new G4PVPlacement(0, G4ThreeVector(), "world", - lvworld, 0, false, 0); - - // vis. attributes - G4VisAttributes* vaworld= new G4VisAttributes(G4Color(1.,1.,1.)); - vaworld-> SetForceWireframe(true); - lvworld-> SetVisAttributes(vaworld); - - return aworld; - -} - - -//////////////////////////////////////////////////////////// -void G4EzWorld::Reset(G4double dx, G4double dy, G4double dz) -//////////////////////////////////////////////////////////// -{ - delete world; - world= CreateWorld(dx, dy, dz); - - G4RunManager* runManager= G4RunManager::GetRunManager(); - runManager-> DefineWorldVolume(world); -} - - -///////////////////////////////////////////////////////////// -void G4EzWorld::Resize(G4double dx, G4double dy, G4double dz) -///////////////////////////////////////////////////////////// -{ - G4Box* box= dynamic_cast(world-> GetLogicalVolume()-> GetSolid()); - box-> SetXHalfLength(dx/2.); - box-> SetYHalfLength(dy/2.); - box-> SetZHalfLength(dz/2.); - - G4RunManager* runManager= G4RunManager::GetRunManager(); - runManager-> GeometryHasBeenModified(); -} - - -////////////////////////////////////////////////// -void G4EzWorld::SetMaterial(G4Material* amaterial) -////////////////////////////////////////////////// -{ - world-> GetLogicalVolume()-> SetMaterial(amaterial); -} - - -////////////////////////////////////////// -void G4EzWorld::SetVisibility(G4bool qvis) -////////////////////////////////////////// -{ - G4VisAttributes* vaworld= const_cast( - world-> GetLogicalVolume()-> GetVisAttributes()); - vaworld-> SetVisibility(qvis); -} - diff --git a/environments/g4py/tests/g4pytest/ezgeom/G4EzWorld.hh b/environments/g4py/tests/g4pytest/ezgeom/G4EzWorld.hh deleted file mode 100644 index 79991b2365..0000000000 --- a/environments/g4py/tests/g4pytest/ezgeom/G4EzWorld.hh +++ /dev/null @@ -1,75 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// G4EzWorld.hh -// -// Utility class for supporting creating user geometry -// -// management of a world volume -// -// 2005 Q -// ==================================================================== -#ifndef G4_EZ_WORLD_H -#define G4_EZ_WORLD_H - -#include "globals.hh" -#include "G4SystemOfUnits.hh" - -// ==================================================================== -// -// class definition -// -// ==================================================================== -class G4Material; -class G4VPhysicalVolume; - -class G4EzWorld { -protected: - // world volume is automatically presented. - static G4VPhysicalVolume* world; - static G4VPhysicalVolume* CreateWorld(G4double dx=1.*m, - G4double dy=1.*m, - G4double dz=1.*m); -public: - G4EzWorld(); - ~G4EzWorld(); - - static G4VPhysicalVolume* GetWorldVolume(); - - static void Reset(G4double dx, G4double dy, G4double dz); - static void Resize(G4double dx, G4double dy, G4double dz); - static void SetMaterial(G4Material* amaterial); - static void SetVisibility(G4bool qvis); - -}; - -// ==================================================================== -// inline functions -// ==================================================================== - -inline G4VPhysicalVolume* G4EzWorld::GetWorldVolume() { return world; } - -#endif diff --git a/environments/g4py/tests/g4pytest/ezgeom/__init__.py b/environments/g4py/tests/g4pytest/ezgeom/__init__.py deleted file mode 100644 index e74f584ed2..0000000000 --- a/environments/g4py/tests/g4pytest/ezgeom/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._ezgeom import * \ No newline at end of file diff --git a/environments/g4py/tests/g4pytest/ezgeom/pyEzgeom.cc b/environments/g4py/tests/g4pytest/ezgeom/pyEzgeom.cc deleted file mode 100644 index e7f72716e3..0000000000 --- a/environments/g4py/tests/g4pytest/ezgeom/pyEzgeom.cc +++ /dev/null @@ -1,158 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// pyEZgeom.cc -// -// [ezgeom] -// a site-module of Geant4Py -// -// An easy way to build geometry -// -// 2005 Q -// ==================================================================== -#include -#include "EzDetectorConstruction.hh" -#include "G4EzWorld.hh" -#include "G4EzVolume.hh" -#include "G4RunManager.hh" -#include "G4VSensitiveDetector.hh" - -using namespace boost::python; - -// ==================================================================== -// thin wrappers -// ==================================================================== -namespace pyEZgeom { - -// methods in global namespace -void Construct() -{ - G4RunManager* runMgr= G4RunManager::GetRunManager(); - runMgr-> SetUserInitialization(new EzDetectorConstruction); -} - -void ResetWorld(G4double dx, G4double dy, G4double dz) -{ - G4EzWorld::Reset(dx, dy, dz); -} - -void ResizeWorld(G4double dx, G4double dy, G4double dz) -{ - G4EzWorld::Resize(dx, dy, dz); -} - - -void SetWorldMaterial(G4Material* amaterial) -{ - G4EzWorld::SetMaterial(amaterial); -} - - -void SetWorldVisibility(G4bool qvis) -{ - G4EzWorld::SetVisibility(qvis); -} - - -// CreateTubeVolume -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(f_CreateTubeVolume, - CreateTubeVolume, 4, 6) - -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(f_CreateConeVolume, - CreateConeVolume, 6, 8) - -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(f_CreateSphereVolume, - CreateSphereVolume, 3, 7) - -// PlaceIt -G4VPhysicalVolume*(G4EzVolume::*f1_PlaceIt) - (const G4ThreeVector&, G4int, G4EzVolume*) = &G4EzVolume::PlaceIt; - -G4VPhysicalVolume*(G4EzVolume::*f2_PlaceIt) - (const G4Transform3D&, G4int, G4EzVolume*) = &G4EzVolume::PlaceIt; - -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(f_PlaceIt, PlaceIt, 1, 3) - -// ReplicateIt -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(f_ReplicateIt, ReplicateIt, 4, 5) - -// SetColor -void (G4EzVolume::*f1_SetColor)(const G4Color&) = &G4EzVolume::SetColor; -void (G4EzVolume::*f2_SetColor)(G4double, G4double, G4double) - = &G4EzVolume::SetColor; - -} - -using namespace pyEZgeom; - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_ezgeom) { - - class_("G4EzVolume", "an easy way of geometry configuration") - .def(init()) - // --- - .def("CreateBoxVolume", &G4EzVolume::CreateBoxVolume) - .def("CreateTubeVolume", &G4EzVolume::CreateTubeVolume, - f_CreateTubeVolume()) - .def("CreateConeVolume", &G4EzVolume::CreateConeVolume, - f_CreateConeVolume()) - .def("CreateShpereVolume", &G4EzVolume::CreateSphereVolume, - f_CreateSphereVolume()) - .def("CreateOrbVolume", &G4EzVolume::CreateOrbVolume) - // --- - .def("SetSold", &G4EzVolume::SetSolid) - .def("GetSold", &G4EzVolume::GetSolid, - return_value_policy()) - .def("SetMaterial", &G4EzVolume::SetMaterial) - .def("GetMaterial", &G4EzVolume::GetMaterial, - return_value_policy()) - // --- - .def("PlaceIt", f1_PlaceIt, - f_PlaceIt()[return_value_policy()]) - .def("PlaceIt", f2_PlaceIt, - f_PlaceIt()[return_value_policy()]) - .def("ReplicateIt", &G4EzVolume::ReplicateIt, - f_ReplicateIt()[return_value_policy()]) - .def("VoxelizeIt", &G4EzVolume::VoxelizeIt) - // --- - .def("SetSensitiveDetector", &G4EzVolume::SetSensitiveDetector) - // --- - .def("SetColor", f1_SetColor) - .def("SetColor", f2_SetColor) - .def("SetVisibility", &G4EzVolume::SetVisibility) - ; - - // ------------------------------------------------------------------- - def("Construct", Construct); - def("ResetWorld", ResetWorld); - def("ResizeWorld", ResizeWorld); - def("SetWorldMaterial", SetWorldMaterial); - def("SetWorldVisibility", SetWorldVisibility); - -} diff --git a/environments/g4py/tests/gtest01/CMakeLists.txt b/environments/g4py/tests/gtest01/CMakeLists.txt deleted file mode 100644 index d8d4d387d1..0000000000 --- a/environments/g4py/tests/gtest01/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -add_subdirectory(module) -configure_file(test.py test.py) -add_test(NAME geant4py-test01 COMMAND ${PYTHON_EXECUTABLE} test.py) -set_tests_properties(geant4py-test01 PROPERTIES ENVIRONMENT "PYTHONPATH=${GEANT4_PYTHON_OUTPUT_DIR};${GEANT4_TEST_ENVIRONMENT}") diff --git a/environments/g4py/tests/gtest01/gun.mac b/environments/g4py/tests/gtest01/gun.mac deleted file mode 100644 index 035f4c4c59..0000000000 --- a/environments/g4py/tests/gtest01/gun.mac +++ /dev/null @@ -1,8 +0,0 @@ -# gun.mac - -/gun/number 1 -/gun/particle e- -/gun/energy 200 MeV -/gun/direction 0.2 0. 1. -/gun/position 0. 0. -14.9 cm - diff --git a/environments/g4py/tests/gtest01/module/CMakeLists.txt b/environments/g4py/tests/gtest01/module/CMakeLists.txt deleted file mode 100644 index 9e6c0d446c..0000000000 --- a/environments/g4py/tests/gtest01/module/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -# - build test library - -# library -set(_TARGET gtest01) -g4py_add_module(${_TARGET} - Particles.cc - PhysicsListEMstd.cc - QDetectorConstruction.cc - QEventAction.cc - QMaterials.cc - QPhysicsList.cc - QPrimaryGeneratorAction.cc - gtest01.cc -) -target_link_libraries(${_TARGET} PRIVATE G4particles G4processes G4run) - diff --git a/environments/g4py/tests/gtest01/module/PhysicsListEMstd.cc b/environments/g4py/tests/gtest01/module/PhysicsListEMstd.cc deleted file mode 100644 index d1a2ac434b..0000000000 --- a/environments/g4py/tests/gtest01/module/PhysicsListEMstd.cc +++ /dev/null @@ -1,121 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// PhysicsListEMstd.cc -// -// Physics list for electron/positron/gamma -// EM-standard package w/ default parameters -// -// ==================================================================== -#include "PhysicsListEMstd.hh" - -#include "G4ProcessManager.hh" -#include "G4ParticleDefinition.hh" - -#include "G4Gamma.hh" -#include "G4Electron.hh" -#include "G4Positron.hh" -#include "G4NeutrinoE.hh" -#include "G4AntiNeutrinoE.hh" - -#include "G4ComptonScattering.hh" -#include "G4GammaConversion.hh" -#include "G4PhotoElectricEffect.hh" -#include "G4eMultipleScattering.hh" -#include "G4eIonisation.hh" -#include "G4eBremsstrahlung.hh" -#include "G4eplusAnnihilation.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -//////////////////////////////////// -PhysicsListEMstd::PhysicsListEMstd() - : G4VPhysicsConstructor("EM-std") -//////////////////////////////////// -{ -} - - -///////////////////////////////////// -PhysicsListEMstd::~PhysicsListEMstd() -///////////////////////////////////// -{ -} - - -////////////////////////////////////////// -void PhysicsListEMstd::ConstructParticle() -////////////////////////////////////////// -{ -} - - -///////////////////////////////////////// -void PhysicsListEMstd::ConstructProcess() -///////////////////////////////////////// -{ - G4ProcessManager* pm; - - // ---------------------------------------------------------- - // gamma physics - // ---------------------------------------------------------- - pm= G4Gamma::Gamma()-> GetProcessManager(); - pm-> AddDiscreteProcess(new G4PhotoElectricEffect); - pm-> AddDiscreteProcess(new G4ComptonScattering); - pm-> AddDiscreteProcess(new G4GammaConversion); - - // ---------------------------------------------------------- - // electron physics - // ---------------------------------------------------------- - G4eMultipleScattering* msc= new G4eMultipleScattering; - G4eIonisation* eion= new G4eIonisation; - G4eBremsstrahlung* ebrems= new G4eBremsstrahlung; - - pm= G4Electron::Electron()->GetProcessManager(); - pm-> AddProcess(msc, ordInActive, 1, 1); - pm-> AddProcess(eion, ordInActive, 2, 2); - pm-> AddProcess(ebrems, ordInActive, ordInActive, 3); - - // ---------------------------------------------------------- - // positron physics - // ---------------------------------------------------------- - msc= new G4eMultipleScattering; - eion= new G4eIonisation; - ebrems= new G4eBremsstrahlung; - G4eplusAnnihilation* annihilation= new G4eplusAnnihilation; - - pm= G4Positron::Positron()-> GetProcessManager(); - pm-> AddProcess(msc, ordInActive, 1, 1); - pm-> AddProcess(eion, ordInActive, 2, 2); - pm-> AddProcess(ebrems, ordInActive, ordInActive, 3); - pm-> AddProcess(annihilation, 0, ordInActive, 4); - -} - diff --git a/environments/g4py/tests/gtest01/module/PhysicsListEMstd.hh b/environments/g4py/tests/gtest01/module/PhysicsListEMstd.hh deleted file mode 100644 index deacfb9997..0000000000 --- a/environments/g4py/tests/gtest01/module/PhysicsListEMstd.hh +++ /dev/null @@ -1,53 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// PhysicsListEMstd.hh -// -// 2004 Q -// ==================================================================== -#ifndef PHYSICS_LIST_EM_STD_H -#define PHYSICS_LIST_EM_STD_H - -#include "G4VPhysicsConstructor.hh" - -// ==================================================================== -// -// class definition -// -// ==================================================================== - -class PhysicsListEMstd : public G4VPhysicsConstructor { - -public: - PhysicsListEMstd(); - ~PhysicsListEMstd(); - - virtual void ConstructParticle(); - virtual void ConstructProcess(); -}; - -#endif - diff --git a/environments/g4py/tests/gtest01/module/QDetectorConstruction.cc b/environments/g4py/tests/gtest01/module/QDetectorConstruction.cc deleted file mode 100644 index 3863c82ecf..0000000000 --- a/environments/g4py/tests/gtest01/module/QDetectorConstruction.cc +++ /dev/null @@ -1,144 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// QDetectorConstruction.cc -// -// 2005 Q -// ==================================================================== -#include "QDetectorConstruction.hh" - -#include "G4Material.hh" -#include "G4Tubs.hh" -#include "G4Box.hh" -#include "G4LogicalVolume.hh" -#include "G4PVPlacement.hh" -#include "G4VisAttributes.hh" -#include "G4SystemOfUnits.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -// constants (detector parameters) -static const G4double DXYZ_AREA= 30.*cm; - -////////////////////////////////////////////// -QDetectorConstruction::QDetectorConstruction() -////////////////////////////////////////////// -{ -} - -/////////////////////////////////////////////// -QDetectorConstruction::~QDetectorConstruction() -/////////////////////////////////////////////// -{ -} - -///////////////////////////////////////////////////// -G4VPhysicalVolume* QDetectorConstruction::Construct() -///////////////////////////////////////////////////// -{ - G4Material* mate; - G4VisAttributes* va; - - // ============================================================== - // world volume - // ============================================================== - G4Box* areaSolid= new G4Box("AREA", - DXYZ_AREA/2., DXYZ_AREA/2., DXYZ_AREA/2.); - - G4Material* vacuum= G4Material::GetMaterial("Vacuum"); - G4LogicalVolume* areaLV= new G4LogicalVolume(areaSolid, vacuum, "AREA_LV"); - G4PVPlacement* area= new G4PVPlacement(0, G4ThreeVector(), "AREA_PV", - areaLV, 0, false, 0); - // vis. attributes - va= new G4VisAttributes(G4Color(1.,1.,1.)); - va-> SetForceWireframe(true); - areaLV-> SetVisAttributes(va); - - // ============================================================== - // detectors - // ============================================================== - // voxel - const G4double dvoxel= 10.*mm; - const G4double dl= 10.*cm; - - G4Box* svoxel= new G4Box("voxel", dvoxel, dl, dvoxel); - mate= G4Material::GetMaterial("Vacuum"); - G4LogicalVolume* lvoxel= new G4LogicalVolume(svoxel, mate, "voxel"); - va= new G4VisAttributes(G4Color(0.,0.8,0.8)); - va-> SetVisibility(false); - lvoxel-> SetVisAttributes(va); - - G4int ix, iz; - G4int index=0; - for (iz=0; iz<5; iz++) { - for (ix=-7; ix<=7; ix++) { - G4double x0= (2.*ix)*cm; - G4double z0= (-13.+2.*iz)*cm; - /*G4PVPlacement* pvoxel=*/ new G4PVPlacement(0, G4ThreeVector(x0, 0., z0), - lvoxel, "voxel", areaLV, false, index); - index++; - } - } - - // tube - //G4Tubs* stube= new G4Tubs("tube", 15./2.*mm, 19./2.*mm, dl, - G4Tubs* stube= new G4Tubs("tube", 0.*mm, 19./2.*mm, dl, - 0., 360.*deg); - mate= G4Material::GetMaterial("Al"); - G4LogicalVolume* ltube= new G4LogicalVolume(stube, mate, "tube"); - va= new G4VisAttributes(G4Color(0.,0.8,0.8)); - ltube-> SetVisAttributes(va); - - G4RotationMatrix* rmtube= new G4RotationMatrix; - rmtube-> rotateX(-90.*deg); - /*G4PVPlacement* ptube=*/ new G4PVPlacement(rmtube, G4ThreeVector(), - ltube, "tube", lvoxel, false, 0); - - // cal - const G4double dxycal= 25.*mm; - const G4double dzcal= 3.*cm; - - G4Box* scal= new G4Box("cal", dxycal, dxycal, dzcal); - mate= G4Material::GetMaterial("CsI"); - G4LogicalVolume* lcal= new G4LogicalVolume(scal, mate, "cal"); - va= new G4VisAttributes(G4Color(0.5,0.5,0.)); - lcal-> SetVisAttributes(va); - - index= 0; - for (ix=-2; ix<=2; ix++) { - G4double x0= (5.*ix)*cm; - /*G4PVPlacement* pcal=*/ new G4PVPlacement(0, G4ThreeVector(x0, 0., 2.*cm), - lcal, "cal", areaLV, false, index); - index++; - } - - return area; -} - diff --git a/environments/g4py/tests/gtest01/module/QDetectorConstruction.hh b/environments/g4py/tests/gtest01/module/QDetectorConstruction.hh deleted file mode 100644 index 5b392c7da9..0000000000 --- a/environments/g4py/tests/gtest01/module/QDetectorConstruction.hh +++ /dev/null @@ -1,52 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// QDetectorConstruction.hh -// -// 2005 Q -// ==================================================================== -#ifndef Q_DETECTOR_CONSTRUCTION_H -#define Q_DETECTOR_CONSTRUCTION_H - -#include "G4VUserDetectorConstruction.hh" - -// ==================================================================== -// -// class definition -// -// ==================================================================== - -class QDetectorConstruction : public G4VUserDetectorConstruction { - -public: - QDetectorConstruction(); - ~QDetectorConstruction(); - - virtual G4VPhysicalVolume* Construct(); - -}; - -#endif diff --git a/environments/g4py/tests/gtest01/module/QMaterials.cc b/environments/g4py/tests/gtest01/module/QMaterials.cc deleted file mode 100644 index a62e45314c..0000000000 --- a/environments/g4py/tests/gtest01/module/QMaterials.cc +++ /dev/null @@ -1,163 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// QMaterials.cc -// -// 2005 Q -// ==================================================================== -#include "QMaterials.hh" -#include "G4Material.hh" -#include "G4SystemOfUnits.hh" -#include "G4PhysicalConstants.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -//////////////////////// -QMaterials::QMaterials() -//////////////////////// -{ -} - - -///////////////////////// -QMaterials::~QMaterials() -///////////////////////// -{ -} - - -//////////////////////////// -void QMaterials::Construct() -//////////////////////////// -{ - G4double A, Z; - - // ------------------------------------------------------------------------ - // Elements - // ------------------------------------------------------------------------ - G4Element* elH = new G4Element("Hydrogen","H", Z=1., A=1.00794*g/mole); - G4Element* elC = new G4Element("Carbon", "C", Z=6., A= 12.011 *g/mole); - G4Element* elN = new G4Element("Nitrogen","N", Z=7., A= 14.00674*g/mole); - G4Element* elO = new G4Element("Oxygen", "O", Z=8., A= 15.9994*g/mole); - G4Element* elNa = new G4Element("Sodium", "Na", Z=11., A= 22.989768*g/mole); - G4Element* elSi = new G4Element("Silicon", "Si", Z=14., A= 28.0855*g/mole); - G4Element* elAr = new G4Element("Argon", "Ar", Z=18., A= 39.948*g/mole); - G4Element* elI = new G4Element("Iodine", "I", Z=53., A= 126.90447*g/mole); - G4Element* elCs = new G4Element("Cesium", "Cs", Z=55., A= 132.90543*g/mole); - - // ------------------------------------------------------------------------ - // Materials - // ------------------------------------------------------------------------ - G4double density, massfraction; - G4int natoms, nel; - - // temperature of experimental hall is controlled at 20 degree. - const G4double expTemp= STP_Temperature+20.*kelvin; - - // vacuum - density= universe_mean_density; - G4Material* Vacuum= new G4Material("Vacuum", density, nel=2); - Vacuum-> AddElement(elN, .7); - Vacuum-> AddElement(elO, .3); - - // air - density= 1.2929e-03 *g/cm3; // at 20 degree - G4Material* Air= new G4Material("Air", density, nel=3, - kStateGas, expTemp); - G4double ttt= 75.47+23.20+1.28; - Air-> AddElement(elN, massfraction= 75.47/ttt); - Air-> AddElement(elO, massfraction= 23.20/ttt); - Air-> AddElement(elAr, massfraction= 1.28/ttt); - - // Ar gas - A= 39.948 *g/mole; - const G4double denAr= 1.782e-03 *g/cm3 * STP_Temperature/expTemp; - G4Material* Ar= new G4Material("ArgonGas", Z=18., A, denAr, - kStateGas, expTemp); - - // ethane (C2H6) - const G4double denEthane= 1.356e-3 *g/cm3 * STP_Temperature/expTemp; - G4Material* Ethane= new G4Material("Ethane", denEthane, nel=2, - kStateGas, expTemp); - Ethane-> AddElement(elC, natoms=2); - Ethane-> AddElement(elH, natoms=6); - - // Ar(50%) + ethane(50%) mixture - density= (denAr+denEthane)/2.; - G4Material* ArEthane= new G4Material("ArEthane", density, nel=2, - kStateGas, expTemp); - ArEthane-> AddMaterial(Ar, massfraction= denAr/density/2.); - ArEthane-> AddMaterial(Ethane, massfraction= denEthane/density/2.); - - // silicon - A= 28.0855 *g/mole; - density= 2.33 *g/cm3; - /*G4Material* Si=*/ new G4Material("SiliconWafer", Z=14., A, density); - - // alminium - A= 26.98 *g/mole; - density= 2.70 *g/cm3; - /*G4Material* Al=*/ new G4Material("Al", Z=13., A, density); - - // iron - A= 55.847 *g/mole; - density= 7.87 *g/cm3; - /*G4Material* Fe=*/ new G4Material("Iron", Z=26., A, density); - - // lead - A= 207.2 *g/mole; - density= 11.35 *g/cm3; - /*G4Material* Pb=*/ new G4Material("Lead", Z=82., A, density); - - // scintillator (Polystyene(C6H5CH=CH2)) - density= 1.032 *g/cm3; - G4Material* Scinti= new G4Material("Scinti", density, nel=2); - Scinti-> AddElement(elC, natoms=8); - Scinti-> AddElement(elH, natoms=8); - - // quartz (SiO2, crystalline) - density= 2.64 *g/cm3; - G4Material* Quartz= new G4Material("Quartz", density, nel= 2); - Quartz-> AddElement(elSi, natoms=1); - Quartz-> AddElement(elO, natoms=2); - - // NaI crystal - density= 3.67 *g/cm3; - G4Material* NaI= new G4Material("NaI", density, nel= 2); - NaI-> AddElement(elNa, natoms=1); - NaI-> AddElement(elI, natoms=1); - - // CsI crystal - density= 4.51 *g/cm3; - G4Material* CsI= new G4Material("CsI", density, nel= 2); - CsI-> AddElement(elCs, natoms=1); - CsI-> AddElement(elI, natoms=1); - -} diff --git a/environments/g4py/tests/gtest01/module/QPhysicsList.cc b/environments/g4py/tests/gtest01/module/QPhysicsList.cc deleted file mode 100644 index 4988eb5dfd..0000000000 --- a/environments/g4py/tests/gtest01/module/QPhysicsList.cc +++ /dev/null @@ -1,72 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// QPhysicsList.cc -// -// 2005 Q -// ==================================================================== -#include "QPhysicsList.hh" -#include "Particles.hh" -#include "PhysicsListEMstd.hh" -#include "G4SystemOfUnits.hh" - -// ==================================================================== -// -// class description -// -// ==================================================================== - -//////////////////////////// -QPhysicsList::QPhysicsList() - : G4VModularPhysicsList() -//////////////////////////// -{ - // default cut value (1.0mm) - defaultCutValue = 1.*mm; - SetVerboseLevel(1); - - // particles - RegisterPhysics(new Particles); - - // EM Physics - RegisterPhysics(new PhysicsListEMstd); -} - -///////////////////////////// -QPhysicsList::~QPhysicsList() -///////////////////////////// -{ -} - -//////////////////////////// -void QPhysicsList::SetCuts() -//////////////////////////// -{ - // " G4VUserPhysicsList::SetCutsWithDefault" method sets - // the default cut value for all particle types - SetCutsWithDefault(); -} - diff --git a/environments/g4py/tests/gtest01/module/QPhysicsList.hh b/environments/g4py/tests/gtest01/module/QPhysicsList.hh deleted file mode 100644 index cb2e344687..0000000000 --- a/environments/g4py/tests/gtest01/module/QPhysicsList.hh +++ /dev/null @@ -1,51 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// QPhysicsList.hh -// -// 2005 Q -// ==================================================================== -#ifndef Q_PHYSICS_LIST_H -#define Q_PHYSICS_LIST_H - -#include "G4VModularPhysicsList.hh" -#include "globals.hh" - -// ==================================================================== -// -// class definition -// -// ==================================================================== - -class QPhysicsList: public G4VModularPhysicsList { -public: - QPhysicsList(); - ~QPhysicsList(); - - virtual void SetCuts(); -}; - -#endif diff --git a/environments/g4py/tests/gtest01/module/QPrimaryGeneratorAction.hh b/environments/g4py/tests/gtest01/module/QPrimaryGeneratorAction.hh deleted file mode 100644 index cefc3d33aa..0000000000 --- a/environments/g4py/tests/gtest01/module/QPrimaryGeneratorAction.hh +++ /dev/null @@ -1,63 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// QPrimaryGeneratorAction.hh -// -// 2005 Q -// ==================================================================== -#ifndef Q_PRIMARY_GENERATOR_ACTION_H -#define Q_PRIMARY_GENERATOR_ACTION_H - -#include "G4VUserPrimaryGeneratorAction.hh" - -class G4ParticleGun; - -// ==================================================================== -// -// class definition -// -// ==================================================================== -class QPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { -private: - // use G4 particle gun - G4ParticleGun* particleGun; - -public: - QPrimaryGeneratorAction(); - ~QPrimaryGeneratorAction(); - - G4ParticleGun* GetParticleGun() const; - - virtual void GeneratePrimaries(G4Event* anEvent); -}; - -// ==================================================================== -// inline functions -// ==================================================================== -inline G4ParticleGun* QPrimaryGeneratorAction::GetParticleGun() const -{ return particleGun; } - -#endif diff --git a/environments/g4py/tests/gtest01/module/gtest01.cc b/environments/g4py/tests/gtest01/module/gtest01.cc deleted file mode 100644 index 44dc1347e4..0000000000 --- a/environments/g4py/tests/gtest01/module/gtest01.cc +++ /dev/null @@ -1,73 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// ==================================================================== -// gtest01.cc -// -// python wrapper for user application -// 2005 Q -// ==================================================================== -#include -#include "QMaterials.hh" -#include "QDetectorConstruction.hh" -#include "QPhysicsList.hh" -#include "QPrimaryGeneratorAction.hh" -#include "G4ParticleGun.hh" -#include "QEventAction.hh" - -using namespace boost::python; - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(gtest01) { - class_("QMaterials", "my material") - .def("Construct", &QMaterials::Construct) - ; - - class_ > - ("QDetectorConstruction", "my detector") - ; - - class_ > - ("QPhysicsList", "my physics list") - ; - - class_ > - ("QPrimaryGeneratorAction", "my primary generator action") - .def("GetParticleGun", &QPrimaryGeneratorAction::GetParticleGun, - return_internal_reference<>()) - ; - - class_ > - ("QEventAction", "my event action") - ; -} - diff --git a/environments/g4py/tests/gtest01/root_test.py b/environments/g4py/tests/gtest01/root_test.py deleted file mode 100755 index 091ca04fa6..0000000000 --- a/environments/g4py/tests/gtest01/root_test.py +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/python -# ================================================================== -# python script for Geant4Py test -# -# gtest01 -# - check basic control flow -# ================================================================== -from Geant4 import * -import gtest01 -import ROOT - -# ================================================================== -# ROOT PART # -# ================================================================== - -# ------------------------------------------------------------------ -def init_root(): -# ------------------------------------------------------------------ - ROOT.gROOT.Reset() - - # plot style - ROOT.gStyle.SetTextFont(82) - ROOT.gStyle.SetTitleFont(82, "X") - ROOT.gStyle.SetLabelFont(82, "X") - ROOT.gStyle.SetTitleFont(82, "Y") - ROOT.gStyle.SetLabelFont(82, "Y") - - #ROOT.gStyle.SetOptTitle(0) - ROOT.gStyle.SetErrorX(0) - - canvas= ROOT.TCanvas("g4py_plots", - "Geant4Py Sample Plots", - 620, 30, 600, 400) - - #canvas.Divide(2,2); - #canvas.SetFillColor(29) - - canvas.SetGrid() - - return canvas - -# ------------------------------------------------------------------ -def hini(): -# ------------------------------------------------------------------ - global hist1 - hist1= ROOT.TH1D("dE/dx/step", "dE/dx", 100, 0., 2000.) - hist1.SetXTitle("(keV)") - - -# ------------------------------------------------------------------ -def hshow(): -# ------------------------------------------------------------------ - hist1.Draw() - -# ================================================================== -# Geant4 PART # -# ================================================================== - -# ================================================================== -# user actions in python -# ================================================================== -class MyPrimaryGeneratorAction(G4VUserPrimaryGeneratorAction): - "My Primary Generator Action" - - def __init__(self): - G4VUserPrimaryGeneratorAction.__init__(self) - self.particleGun= G4ParticleGun(1) - - def GeneratePrimaries(self, event): - self.particleGun.GeneratePrimaryVertex(event) - -# ------------------------------------------------------------------ -class MyRunAction(G4UserRunAction): - "My Run Action" - - def BeginOfRunAction(self, run): - print "*** #event to be processed (BRA)=", - run.numberOfEventToBeProcessed - - def EndOfRunAction(self, run): - print "*** run end run(ERA)=", run.runID - -# ------------------------------------------------------------------ -class MyEventAction(G4UserEventAction): - "My Event Action" - - def BeginOfEventAction(self, event): - print "*** current event (BEA)=", event.eventID - - def EndOfEventAction(self, event): - print "*** current event (EEA)=", event.eventID - -# ------------------------------------------------------------------ -class MySteppingAction(G4UserSteppingAction): - "My Stepping Action" - - def UserSteppingAction(self, step): - #print "*** dE/dx in current step=", step.GetTotalEnergyDeposit() - dedx= step.GetTotalEnergyDeposit() - if(dedx>0): - hist1.Fill(dedx/HEPUnit.keV) - -# ================================================================== -# main -# ================================================================== -g4pyCanvas= init_root() -hini() - -app= gtest01.MyApplication() -app.Configure() - -# set user actions... -myPGA= MyPrimaryGeneratorAction() -gRunManager.SetUserAction(myPGA) - -myRA= MyRunAction() -gRunManager.SetUserAction(myRA) - -#myEA= MyEventAction() -#gRunManager.SetUserAction(myEA) - -mySA= MySteppingAction() -gRunManager.SetUserAction(mySA) - - -# set particle gun -#ApplyUICommand("/control/execute gun.mac") -pg= myPGA.particleGun -pg.SetParticleByName("e-") -pg.SetParticleEnergy(200.*HEPUnit.MeV) -pg.SetParticleMomentumDirection(G4ThreeVector(0.2, 0., 1.)) -pg.SetParticlePosition(G4ThreeVector(0.,0.,-14.9)*HEPUnit.cm) - -# visualization -ApplyUICommand("/control/execute vis.mac") - -# beamOn -gRunManager.BeamOn(1000) - -# -hshow() - - diff --git a/environments/g4py/tests/gtest01/run.py b/environments/g4py/tests/gtest01/run.py deleted file mode 100755 index c254071d6f..0000000000 --- a/environments/g4py/tests/gtest01/run.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/python -# ================================================================== -# python script for Geant4Py test -# -# gtest01 -# - check basic control flow -# ================================================================== -from Geant4 import * -import gtest01 -import random -#import thread - -# ================================================================== -# user actions in python -# ================================================================== -class MyPrimaryGeneratorAction(G4VUserPrimaryGeneratorAction): - "My Primary Generator Action" - - def __init__(self): - G4VUserPrimaryGeneratorAction.__init__(self) - self.particleGun= G4ParticleGun(1) - - def GeneratePrimaries(self, event): - #dx= random.gauss(0., 0.1) - dx=0. - self.particleGun.SetParticleMomentumDirection(G4ThreeVector(dx, 0., 1.)) - self.particleGun.GeneratePrimaryVertex(event) - -# ------------------------------------------------------------------ -class MyRunAction(G4UserRunAction): - "My Run Action" - - def BeginOfRunAction(self, run): - print "*** #event to be processed (BRA)=", - run.GetNumberOfEventToBeProcessed() - - def EndOfRunAction(self, run): - print "*** run end run(ERA)=", run.GetRunID() - -# ------------------------------------------------------------------ -class MyEventAction(G4UserEventAction): - "My Event Action" - - #def BeginOfEventAction(self, event): - #print "*** current event (BEA)=", event.GetEventID() - # pass - - #def EndOfEventAction(self, event): - # print "*** current event (EEA)=", event.GetEventID() - -# ------------------------------------------------------------------ -class MySteppingAction(G4UserSteppingAction): - "My Stepping Action" - - def UserSteppingAction(self, step): - #print "*** dE/dx in current step=", step.GetTotalEnergyDeposit() - track= step.GetTrack() - touchable= track.GetTouchable() - pv= touchable.GetVolume() - #print pv.GetCopyNo() - #print touchable.GetReplicaNumber(0) - -# ------------------------------------------------------------------ -class MyField(G4MagneticField): - "My Magnetic Field" - - def GetFieldValue(self, pos, time): - bfield= G4ThreeVector() - bfield.x= 0. - bfield.y= 5.*tesla - bfield.z= 0. - return bfield - -# ================================================================== -# main -# ================================================================== -qMaterials= gtest01.QMaterials() -qMaterials.Construct() - -qDC= gtest01.QDetectorConstruction() -gRunManager.SetUserInitialization(qDC) - -qPL= gtest01.QPhysicsList() -gRunManager.SetUserInitialization(qPL) - -# set user actions... -#qPGA= gtest01.QPrimaryGeneratorAction() -myPGA= MyPrimaryGeneratorAction() -gRunManager.SetUserAction(myPGA) - -#myRA= MyRunAction() -#gRunManager.SetUserAction(myRA) - -myEA= MyEventAction() -gRunManager.SetUserAction(myEA) - -mySA= MySteppingAction() -gRunManager.SetUserAction(mySA) - -# set particle gun -#ApplyUICommand("/control/execute gun.mac") -#pg= qPGA.GetParticleGun() -pg= myPGA.particleGun -pg.SetParticleByName("e-") -pg.SetParticleEnergy(200.*MeV) -pg.SetParticlePosition(G4ThreeVector(0.,0.,-14.9)*cm) - -# magnetic field -fieldMgr= gTransportationManager.GetFieldManager() -myField= G4UniformMagField(G4ThreeVector(0.,10.*tesla,0.)) -#myField= MyField() -fieldMgr.SetDetectorField(myField) -fieldMgr.CreateChordFinder(myField) - -gRunManager.Initialize() - -# visualization -gControlExecute("vis.mac") - -# beamOn -gRunManager.BeamOn(10) -#thread.start_new_thread(gRunManager.BeamOn, (100000)) - diff --git a/environments/g4py/tests/gtest01/test.py b/environments/g4py/tests/gtest01/test.py deleted file mode 100755 index 5ce0964dd8..0000000000 --- a/environments/g4py/tests/gtest01/test.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/python3 -# ================================================================== -# python script for Geant4Py test -# -# gtest01 -# - check basic control flow -# ================================================================== -from Geant4 import * -import gtest01 -import random - -# ================================================================== -# user actions in python -# ================================================================== -class MyPrimaryGeneratorAction(G4VUserPrimaryGeneratorAction): - "My Primary Generator Action" - - def __init__(self): - G4VUserPrimaryGeneratorAction.__init__(self) - self.particleGun= G4ParticleGun(1) - - def GeneratePrimaries(self, event): - #dx= random.gauss(0., 0.1) - dx=0. - self.particleGun.SetParticleMomentumDirection(G4ThreeVector(dx, 0., 1.)) - self.particleGun.GeneratePrimaryVertex(event) - -# ------------------------------------------------------------------ -class MyRunAction(G4UserRunAction): - "My Run Action" - - def BeginOfRunAction(self, run): - print("*** #event to be processed (BRA)=", - run.GetNumberOfEventToBeProcessed()) - - def EndOfRunAction(self, run): - print("*** run end run(ERA)=", run.GetRunID()) - -# ------------------------------------------------------------------ -class MyEventAction(G4UserEventAction): - "My Event Action" - - #def BeginOfEventAction(self, event): - #print("*** current event (BEA)=", event.GetEventID()) - # pass - - #def EndOfEventAction(self, event): - #print("*** current event (EEA)=", event.GetEventID()) - -# ------------------------------------------------------------------ -class MySteppingAction(G4UserSteppingAction): - "My Stepping Action" - - def UserSteppingAction(self, step): - #print("*** dE/dx in current step=", step.GetTotalEnergyDeposit()) - track= step.GetTrack() - touchable= track.GetTouchable() - pv= touchable.GetVolume() - #print(pv.GetCopyNo()) - #print(touchable.GetReplicaNumber(0)) - -# ------------------------------------------------------------------ -class MyField(G4MagneticField): - "My Magnetic Field" - - def GetFieldValue(self, pos, time): - bfield= G4ThreeVector() - bfield.x= 0. - bfield.y= 5.*tesla - bfield.z= 0. - return bfield - -# ================================================================== -# main -# ================================================================== -qMaterials= gtest01.QMaterials() -qMaterials.Construct() - -qDC= gtest01.QDetectorConstruction() -gRunManager.SetUserInitialization(qDC) - -qPL= gtest01.QPhysicsList() -gRunManager.SetUserInitialization(qPL) - -# set user actions... -#qPGA= gtest01.QPrimaryGeneratorAction() -myPGA= MyPrimaryGeneratorAction() -gRunManager.SetUserAction(myPGA) - -#myRA= MyRunAction() -#gRunManager.SetUserAction(myRA) - -myEA= MyEventAction() -gRunManager.SetUserAction(myEA) - -mySA= MySteppingAction() -gRunManager.SetUserAction(mySA) - -# set particle gun -#ApplyUICommand("/control/execute gun.mac") -#pg= qPGA.GetParticleGun() -pg= myPGA.particleGun -pg.SetParticleByName("e-") -pg.SetParticleEnergy(200.*MeV) -pg.SetParticlePosition(G4ThreeVector(0.,0.,-14.9)*cm) - -# magnetic field -fieldMgr= gTransportationManager.GetFieldManager() -myField= G4UniformMagField(G4ThreeVector(0.,10.*tesla,0.)) -#myField= MyField() -fieldMgr.SetDetectorField(myField) -fieldMgr.CreateChordFinder(myField) - -gRunManager.Initialize() - -# beamOn -gRunManager.BeamOn(10) -gTerminate() diff --git a/environments/g4py/tests/gtest01/vis.mac b/environments/g4py/tests/gtest01/vis.mac deleted file mode 100644 index 4563dbe1f4..0000000000 --- a/environments/g4py/tests/gtest01/vis.mac +++ /dev/null @@ -1,16 +0,0 @@ -# vis.mac - -/vis/open OGLSX - -/vis/scene/create -/vis/scene/add/volume -#/vis/scene/add/volume cal 3 - -/vis/sceneHandler/attach - -/vis/viewer/set/viewpointThetaPhi 90. -90. - -/tracking/storeTrajectory 1 -/vis/scene/add/trajectories -/vis/scene/endOfEventAction accumulate - diff --git a/environments/g4py/tests/gtest01/vrml.mac b/environments/g4py/tests/gtest01/vrml.mac deleted file mode 100644 index 8494e3fe6d..0000000000 --- a/environments/g4py/tests/gtest01/vrml.mac +++ /dev/null @@ -1,11 +0,0 @@ -/vis/scene/create -/vis/scene/add/volume - -/vis/sceneHandler/create VRML2FILE - -/vis/viewer/create - -/tracking/storeTrajectory 1 -/vis/scene/add/trajectories -/vis/scene/endOfEventAction accumulate - diff --git a/environments/g4py/tests/gtest02/CMakeLists.txt b/environments/g4py/tests/gtest02/CMakeLists.txt deleted file mode 100644 index 364712d62c..0000000000 --- a/environments/g4py/tests/gtest02/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -configure_file(test.py test.py) -add_test(NAME geant4py-test02 COMMAND ${PYTHON_EXECUTABLE} test.py) -set_tests_properties(geant4py-test02 PROPERTIES ENVIRONMENT "PYTHONPATH=${GEANT4_PYTHON_OUTPUT_DIR};${GEANT4_TEST_ENVIRONMENT}") diff --git a/environments/g4py/tests/gtest02/gun.mac b/environments/g4py/tests/gtest02/gun.mac deleted file mode 100644 index 035f4c4c59..0000000000 --- a/environments/g4py/tests/gtest02/gun.mac +++ /dev/null @@ -1,8 +0,0 @@ -# gun.mac - -/gun/number 1 -/gun/particle e- -/gun/energy 200 MeV -/gun/direction 0.2 0. 1. -/gun/position 0. 0. -14.9 cm - diff --git a/environments/g4py/tests/gtest02/run.py b/environments/g4py/tests/gtest02/run.py deleted file mode 100755 index 0e9b0eef36..0000000000 --- a/environments/g4py/tests/gtest02/run.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/python -# ================================================================== -# python script for Geant4Py test -# -# gtest02 -# - test for using site-module packages -# ================================================================== -from Geant4 import * -import g4py.Qmaterials, g4py.NISTmaterials -import g4py.Qgeom, g4py.ExN01geom, g4py.ExN03geom -import g4py.ExN01pl, g4py.EMSTDpl -import g4py.ParticleGun, g4py.MedicalBeam - -# ================================================================== -# user setup -# ================================================================== - -# ------------------------------------------------------------------ -# Setup-0 (Q) -# ------------------------------------------------------------------ -def Setup0(): - # simple materials for Qgeom - g4py.Qmaterials.Construct() - - # NIST materials - #g4py.NISTmaterials.Construct() - - # normal way for constructing user geometry - #qDC= g4py.Qgeom.QDetectorConstruction() - #gRunManager.SetUserInitialization(qDC) - - # 2nd way, short-cut way - g4py.Qgeom.Construct() - - # primary - global primary_position, primary_direction - primary_position= G4ThreeVector(0.,0., -14.9*cm) - primary_direction= G4ThreeVector(0.2, 0., 1.) - - -# ------------------------------------------------------------------ -# Setup-1 (ExampleN01) -# ------------------------------------------------------------------ -def Setup1(): - g4py.ExN01geom.Construct() - - global primary_position, primary_direction - primary_position= G4ThreeVector(-2.5*m, 0., 0.) - primary_direction= G4ThreeVector(1., 0., 0.) - - -# ------------------------------------------------------------------ -# Setup-3 (ExampleN03) -# ------------------------------------------------------------------ -def Setup3(): - #exN03geom= g4py.ExN03geom.ExN03DetectorConstruction() - #gRunManager.SetUserInitialization(exN03geom) - - g4py.ExN03geom.Construct() - - global primary_position, primary_direction - primary_position= G4ThreeVector(-1.*m, 0., 0.) - primary_direction= G4ThreeVector(1., 0., 0.) - - -# ================================================================== -# main -# ================================================================== -# ------------------------------------------------------------------ -# randum number -# ------------------------------------------------------------------ -rand_engine= Ranlux64Engine() -HepRandom.setTheEngine(rand_engine) -HepRandom.setTheSeed(20050830L) - -# ------------------------------------------------------------------ -# user setup -# ------------------------------------------------------------------ -Setup0() -#Setup1() -#Setup3() - - -# ------------------------------------------------------------------ -# setup for physics list -# ------------------------------------------------------------------ -# normal way for constructing user physics list -#exN01PL= ExN01PhysicsList.ExN01PhysicsList() -#gRunManager.SetUserInitialization(exN01PL) - -# 2nd way, short-cut way -# geantino + transportation -#g4py.ExN01pl.Construct() - -# electron/gamma standard EM -g4py.EMSTDpl.Construct() - -# ------------------------------------------------------------------ -# setup for primary generator action -# ------------------------------------------------------------------ -# ------------ -# Particle Gun -# ------------ -# normal way for constructing user physics list -#pgPGA= g4py.ParticleGun.ParticleGunAction() -#gRunManager.SetUserAction(pgPGA) -#pg= pgPGA.GetParticleGun() - -# 2nd way, short-cut way -pg= g4py.ParticleGun.Construct() - -# set parameters of particle gun -pg.SetParticleByName("e-") -pg.SetParticleEnergy(300.*MeV) -pg.SetParticlePosition(primary_position) -pg.SetParticleMomentumDirection(primary_direction) - -# ------------ -# Medical Beam -# ------------ -#beam= g4py.MedicalBeam.Construct() - -# ------------------------------------------------------------------ -# go... -# ------------------------------------------------------------------ -gRunManager.Initialize() - -# visualization -gApplyUICommand("/control/execute vis.mac") - -# beamOn -#gRunManager.BeamOn(3) - diff --git a/environments/g4py/tests/gtest02/test.py b/environments/g4py/tests/gtest02/test.py deleted file mode 100755 index 3010c10bdc..0000000000 --- a/environments/g4py/tests/gtest02/test.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/python3 -# ================================================================== -# python script for Geant4Py test -# -# gtest02 -# - test for using site-module packages -# ================================================================== -from Geant4 import * -import g4pytest.Qmaterials, g4pytest.NISTmaterials -import g4pytest.Qgeom, g4pytest.ExN01geom, g4pytest.ExN03geom -import g4pytest.ExN01pl, g4pytest.EMSTDpl -import g4pytest.ParticleGun, g4pytest.MedicalBeam - -# ================================================================== -# user setup -# ================================================================== - -# ------------------------------------------------------------------ -# Setup-0 (Q) -# ------------------------------------------------------------------ -def Setup0(): - # simple materials for Qgeom - g4pytest.Qmaterials.Construct() - - # NIST materials - #g4pytest.NISTmaterials.Construct() - - # normal way for constructing user geometry - #qDC= g4pytest.Qgeom.QDetectorConstruction() - #gRunManager.SetUserInitialization(qDC) - - # 2nd way, short-cut way - g4pytest.Qgeom.Construct() - - # primary - global primary_position, primary_direction - primary_position= G4ThreeVector(0.,0., -14.9*cm) - primary_direction= G4ThreeVector(0.2, 0., 1.) - - -# ------------------------------------------------------------------ -# Setup-1 (ExampleN01) -# ------------------------------------------------------------------ -def Setup1(): - g4pytest.ExN01geom.Construct() - - global primary_position, primary_direction - primary_position= G4ThreeVector(-2.5*m, 0., 0.) - primary_direction= G4ThreeVector(1., 0., 0.) - - -# ------------------------------------------------------------------ -# Setup-3 (ExampleN03) -# ------------------------------------------------------------------ -def Setup3(): - #exN03geom= g4pytest.ExN03geom.ExN03DetectorConstruction() - #gRunManager.SetUserInitialization(exN03geom) - - g4pytest.ExN03geom.Construct() - - global primary_position, primary_direction - primary_position= G4ThreeVector(-1.*m, 0., 0.) - primary_direction= G4ThreeVector(1., 0., 0.) - - -# ================================================================== -# main -# ================================================================== -# ------------------------------------------------------------------ -# randum number -# ------------------------------------------------------------------ -rand_engine= Ranlux64Engine() -HepRandom.setTheEngine(rand_engine) -HepRandom.setTheSeed(20050830) - -# ------------------------------------------------------------------ -# user setup -# ------------------------------------------------------------------ -Setup0() -#Setup1() -#Setup3() - - -# ------------------------------------------------------------------ -# setup for physics list -# ------------------------------------------------------------------ -# normal way for constructing user physics list -#exN01PL= ExN01PhysicsList.ExN01PhysicsList() -#gRunManager.SetUserInitialization(exN01PL) - -# 2nd way, short-cut way -# geantino + transportation -#g4pytest.ExN01pl.Construct() - -# electron/gamma standard EM -g4pytest.EMSTDpl.Construct() - -# ------------------------------------------------------------------ -# setup for primary generator action -# ------------------------------------------------------------------ -# ------------ -# Particle Gun -# ------------ -# normal way for constructing user physics list -#pgPGA= g4pytest.ParticleGun.ParticleGunAction() -#gRunManager.SetUserAction(pgPGA) -#pg= pgPGA.GetParticleGun() - -# 2nd way, short-cut way -pg= g4pytest.ParticleGun.Construct() - -# set parameters of particle gun -pg.SetParticleByName("e-") -pg.SetParticleEnergy(300.*MeV) -pg.SetParticlePosition(primary_position) -pg.SetParticleMomentumDirection(primary_direction) - -# ------------ -# Medical Beam -# ------------ -#beam= g4pytest.MedicalBeam.Construct() - -# ------------------------------------------------------------------ -# go... -# ------------------------------------------------------------------ -gRunManager.Initialize() - -# visualization -gApplyUICommand("/control/execute vis.mac") - -# beamOn -#gRunManager.BeamOn(3) - diff --git a/environments/g4py/tests/gtest02/vis.mac b/environments/g4py/tests/gtest02/vis.mac deleted file mode 100644 index ab6ad39430..0000000000 --- a/environments/g4py/tests/gtest02/vis.mac +++ /dev/null @@ -1,16 +0,0 @@ -# vis.mac - -/vis/open OGLSX - -/vis/scene/create -/vis/scene/add/volume - -/vis/sceneHandler/attach - -#/vis/viewer/set/viewpointThetaPhi 180. 0. -/vis/viewer/set/viewpointThetaPhi 90. -90. - -/tracking/storeTrajectory 1 -/vis/scene/add/trajectories -/vis/scene/endOfEventAction accumulate - diff --git a/environments/g4py/tests/gtest03/CMakeLists.txt b/environments/g4py/tests/gtest03/CMakeLists.txt deleted file mode 100644 index 12591040b2..0000000000 --- a/environments/g4py/tests/gtest03/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -configure_file(test.py test.py) -add_test(NAME geant4py-test03 COMMAND ${PYTHON_EXECUTABLE} test.py) -set_tests_properties(geant4py-test03 PROPERTIES ENVIRONMENT "PYTHONPATH=${GEANT4_PYTHON_OUTPUT_DIR};${GEANT4_TEST_ENVIRONMENT}") diff --git a/environments/g4py/tests/gtest03/gun.mac b/environments/g4py/tests/gtest03/gun.mac deleted file mode 100644 index fd853d6fff..0000000000 --- a/environments/g4py/tests/gtest03/gun.mac +++ /dev/null @@ -1,8 +0,0 @@ -# gun.mac - -/gun/number 1 -/gun/particle gamma -/gun/energy 1 MeV -/gun/direction 0. 0. 1. -/gun/position 0. 0. -20. cm - diff --git a/environments/g4py/tests/gtest03/run.py b/environments/g4py/tests/gtest03/run.py deleted file mode 100755 index ee2f7a4203..0000000000 --- a/environments/g4py/tests/gtest03/run.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/python -# ================================================================== -# python script for Geant4Py test -# -# gtest02 -# - test for using site-module packages -# ================================================================== -from Geant4 import * -import g4py.NISTmaterials -import g4py.ezgeom -from g4py.ezgeom import G4EzVolume -import g4py.EMSTDpl -import g4py.ParticleGun - -# ================================================================== -# intialize -# ================================================================== -def Configure(): - # ------------------------------------------------------------------ - # setup for materials - # ------------------------------------------------------------------ - # simple materials for Qgeom - g4py.NISTmaterials.Construct() - - # ------------------------------------------------------------------ - # setup for geometry - # ------------------------------------------------------------------ - #g4py.Qgeom.Construct() - g4py.ezgeom.Construct() # initialize - - # ------------------------------------------------------------------ - # setup for physics list - # ------------------------------------------------------------------ - g4py.EMSTDpl.Construct() - - # ------------------------------------------------------------------ - # setup for primary generator action - # ------------------------------------------------------------------ - g4py.ParticleGun.Construct() - gControlExecute("gun.mac") - -# ================================================================== -# constructing geometry -# ================================================================== -def ConstructGeom(): - print "* Constructing geometry..." - # reset world material - air= G4Material.GetMaterial("G4_AIR") - g4py.ezgeom.SetWorldMaterial(air) - - # target - 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)) - - # dummy box - global detector_box, detector_box_pv - detector_box= G4EzVolume("DetectorBox") - detector_box.CreateBoxVolume(air, 20.*cm, 20.*cm, 40.*cm) - detector_box_pv= detector_box.PlaceIt(G4ThreeVector(0.,0.,20.*cm)) - - # calorimeter - global cal - cal= G4EzVolume("Calorimeter") - nai= G4Material.GetMaterial("G4_SODIUM_IODIDE") - cal.CreateBoxVolume(nai, 5.*cm, 5.*cm, 30.*cm) - dd= 5.*cm - for ical in range(-1, 2): - calPos= G4ThreeVector(dd*ical, 0., 0.) - print calPos - cal.PlaceIt(calPos, ical+1, detector_box) - - -# ================================================================== -# main -# ================================================================== -# ------------------------------------------------------------------ -# randum number -# ------------------------------------------------------------------ -rand_engine= Ranlux64Engine() -HepRandom.setTheEngine(rand_engine) -HepRandom.setTheSeed(20050830L) - -# setup... -Configure() -ConstructGeom() - -# ------------------------------------------------------------------ -# go... -# ------------------------------------------------------------------ -gRunManager.Initialize() - -# visualization -gControlExecute("vis.mac") - -# beamOn -#gRunManager.BeamOn(3) - diff --git a/environments/g4py/tests/gtest03/test.py b/environments/g4py/tests/gtest03/test.py deleted file mode 100755 index e5afa1cf1d..0000000000 --- a/environments/g4py/tests/gtest03/test.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/python3 -# ================================================================== -# python script for Geant4Py test -# -# gtest02 -# - test for using site-module packages -# ================================================================== -from Geant4 import * -import g4pytest.NISTmaterials -import g4pytest.ezgeom -from g4pytest.ezgeom import G4EzVolume -import g4pytest.EMSTDpl -import g4pytest.ParticleGun - -# ================================================================== -# intialize -# ================================================================== -def Configure(): - # ------------------------------------------------------------------ - # setup for materials - # ------------------------------------------------------------------ - # simple materials for Qgeom - g4pytest.NISTmaterials.Construct() - - # ------------------------------------------------------------------ - # setup for geometry - # ------------------------------------------------------------------ - #g4pytest.Qgeom.Construct() - g4pytest.ezgeom.Construct() # initialize - - # ------------------------------------------------------------------ - # setup for physics list - # ------------------------------------------------------------------ - g4pytest.EMSTDpl.Construct() - - # ------------------------------------------------------------------ - # setup for primary generator action - # ------------------------------------------------------------------ - g4pytest.ParticleGun.Construct() - gControlExecute("gun.mac") - -# ================================================================== -# constructing geometry -# ================================================================== -def ConstructGeom(): - print("* Constructing geometry...") - # reset world material - air= G4Material.GetMaterial("G4_AIR") - g4pytest.ezgeom.SetWorldMaterial(air) - - # target - 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)) - - # dummy box - global detector_box, detector_box_pv - detector_box= G4EzVolume("DetectorBox") - detector_box.CreateBoxVolume(air, 20.*cm, 20.*cm, 40.*cm) - detector_box_pv= detector_box.PlaceIt(G4ThreeVector(0.,0.,20.*cm)) - - # calorimeter - global cal - cal= G4EzVolume("Calorimeter") - nai= G4Material.GetMaterial("G4_SODIUM_IODIDE") - cal.CreateBoxVolume(nai, 5.*cm, 5.*cm, 30.*cm) - dd= 5.*cm - for ical in range(-1, 2): - calPos= G4ThreeVector(dd*ical, 0., 0.) - print(calPos) - cal.PlaceIt(calPos, ical+1, detector_box) - - -# ================================================================== -# main -# ================================================================== -# ------------------------------------------------------------------ -# randum number -# ------------------------------------------------------------------ -rand_engine= Ranlux64Engine() -HepRandom.setTheEngine(rand_engine) -HepRandom.setTheSeed(20050830) - -# setup... -Configure() -ConstructGeom() - -# ------------------------------------------------------------------ -# go... -# ------------------------------------------------------------------ -gRunManager.Initialize() - -# visualization -gControlExecute("vis.mac") - -# beamOn -#gRunManager.BeamOn(3) - diff --git a/environments/g4py/tests/gtest03/test_voxel.py b/environments/g4py/tests/gtest03/test_voxel.py deleted file mode 100755 index 82e5df3413..0000000000 --- a/environments/g4py/tests/gtest03/test_voxel.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/python -# ================================================================== -# python script for Geant4Py test -# -# gtest02 -# - test for using site-module packages -# ================================================================== -from Geant4 import * -import g4py.NISTmaterials -import g4py.ezgeom -from g4py.ezgeom import G4EzVolume -import g4py.EMSTDpl -import g4py.ParticleGun - -# ================================================================== -# intialize -# ================================================================== -def Configure(): - # ------------------------------------------------------------------ - # setup for materials - # ------------------------------------------------------------------ - # simple materials for Qgeom - g4py.NISTmaterials.Construct() - - # ------------------------------------------------------------------ - # setup for geometry - # ------------------------------------------------------------------ - #g4py.Qgeom.Construct() - g4py.ezgeom.Construct() # initialize - - # ------------------------------------------------------------------ - # setup for physics list - # ------------------------------------------------------------------ - g4py.EMSTDpl.Construct() - - # ------------------------------------------------------------------ - # setup for primary generator action - # ------------------------------------------------------------------ - g4py.ParticleGun.Construct() - gControlExecute("gun.mac") - - -# ================================================================== -# constructing geometry -# ================================================================== -def ConstructGeom(): - print "* Constructing geometry..." - # reset world material - air= G4Material.GetMaterial("G4_AIR") - g4py.ezgeom.SetWorldMaterial(air) - - # phantom - global phantom - phantom= G4EzVolume("DetectorBox") - water= G4Material.GetMaterial("G4_WATER") - phantom.CreateBoxVolume(water, 40.*cm, 40.*cm, 50.*cm) - phantom.PlaceIt(G4ThreeVector(0.,0.,20.*cm)) - vsize=phantom.VoxelizeIt(100, 100, 100) - print "voxel size=", vsize - -# ================================================================== -# main -# ================================================================== -# ------------------------------------------------------------------ -# randum number -# ------------------------------------------------------------------ -rand_engine= Ranlux64Engine() -HepRandom.setTheEngine(rand_engine) -HepRandom.setTheSeed(20050830L) - -# setup... -Configure() -ConstructGeom() - -# ------------------------------------------------------------------ -# go... -# ------------------------------------------------------------------ -gRunManager.Initialize() - -# visualization -gControlExecute("vis.mac") - -# beamOn -#gRunManager.BeamOn(3) - diff --git a/environments/g4py/tests/gtest03/vis.mac b/environments/g4py/tests/gtest03/vis.mac deleted file mode 100644 index 85e83c6c27..0000000000 --- a/environments/g4py/tests/gtest03/vis.mac +++ /dev/null @@ -1,15 +0,0 @@ -# vis.mac - -/vis/open OGLSX - -/vis/scene/create -/vis/scene/add/volume - -/vis/sceneHandler/attach - -/vis/viewer/set/viewpointThetaPhi 270. 90. - -/tracking/storeTrajectory 1 -/vis/scene/add/trajectories -/vis/scene/endOfEventAction accumulate - diff --git a/environments/g4py/tests/gtest04/CMakeLists.txt b/environments/g4py/tests/gtest04/CMakeLists.txt deleted file mode 100644 index 03db192990..0000000000 --- a/environments/g4py/tests/gtest04/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -configure_file(test.py test.py) -add_test(NAME geant4py-test04 COMMAND ${PYTHON_EXECUTABLE} test.py) -set_tests_properties(geant4py-test04 PROPERTIES ENVIRONMENT "PYTHONPATH=${GEANT4_PYTHON_OUTPUT_DIR};${GEANT4_TEST_ENVIRONMENT}") diff --git a/environments/g4py/tests/gtest04/test.py b/environments/g4py/tests/gtest04/test.py deleted file mode 100755 index 62913aa409..0000000000 --- a/environments/g4py/tests/gtest04/test.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# ================================================================== -# python script for Geant4Py test -# -# gtest04 -# - test for command tree and command information -# ================================================================== -from Geant4 import * - -def DumpTree(atree): - print("@@", atree.GetPathName(), "::", atree.GetTitle()) - ntree= atree.GetTreeEntry() - ncommand= atree.GetCommandEntry() - - for i in range(1, ncommand+1): - icommand= atree.GetCommand(i) - print(" **", icommand.GetCommandPath()) - print(" ", icommand.GetTitle()) - x= icommand.GetStateList() - - nparameter= icommand.GetParameterEntries() - for j in range(0, nparameter): - iparam= icommand.GetParameter(j) - print(" +", iparam.GetParameterName(), iparam.GetParameterType()) - - for i in range(1, ntree+1): - itree= atree.GetTree(i) - DumpTree(itree) - -# ================================================================== -# main -# ================================================================== -root_tree= gUImanager.GetTree() - -DumpTree(root_tree) - diff --git a/environments/g4py/tests/gtest05/CMakeLists.txt b/environments/g4py/tests/gtest05/CMakeLists.txt deleted file mode 100644 index 23b597fdb4..0000000000 --- a/environments/g4py/tests/gtest05/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -configure_file(test.py test.py) -add_test(NAME geant4py-test05 COMMAND ${PYTHON_EXECUTABLE} test.py) -set_tests_properties(geant4py-test05 PROPERTIES ENVIRONMENT "PYTHONPATH=${GEANT4_PYTHON_OUTPUT_DIR};${GEANT4_TEST_ENVIRONMENT}") diff --git a/environments/g4py/tests/gtest05/test.py b/environments/g4py/tests/gtest05/test.py deleted file mode 100755 index e17d01269a..0000000000 --- a/environments/g4py/tests/gtest05/test.py +++ /dev/null @@ -1,311 +0,0 @@ -#!/usr/bin/python3 -# ================================================================== -# python script for Geant4Py test -# -# gtest05 -# - test for CSG geometry construction in Python -# ================================================================== -from Geant4 import * -import g4pytest.ExN01pl, g4pytest.ParticleGun -import os, math - -# ================================================================== -# user actions in python -# ================================================================== -class MyDetectorConstruction(G4VUserDetectorConstruction): - "My Detector Construction" - - def __init__(self): - G4VUserDetectorConstruction.__init__(self) - self.air= gNistManager.FindOrBuildMaterial("G4_AIR") - self.lv_object= None - self.world= self.ConstructWorld() - - self.va_red= G4VisAttributes(G4Color(1.,0.,0.)) - self.va_cyan= G4VisAttributes(G4Color(0.,1.,1.)) - self.va_green= G4VisAttributes(G4Color(0.,1.,0.)) - self.va_blue= G4VisAttributes(G4Color(0.,0.,1.)) - self.va_magenta= G4VisAttributes(G4Color(1.,0.,1.)) - - # ----------------------------------------------------------------- - def ConstructWorld(self): - # Python has automatic garbage collection system. - # Geometry objects must be defined as GLOBAL not to be deleted. - global sld_world, lv_world, pv_world, va_world - - sld_world= G4Box("world", 1.*m, 1.*m, 1.*m) - lv_world= G4LogicalVolume(sld_world, self.air, "world") - pv_world= G4PVPlacement(G4Transform3D(), lv_world, "world", - None, False, 0) - - va_world= G4VisAttributes() - va_world.SetVisibility(False) - lv_world.SetVisAttributes(va_world) - - # solid object (dummy) - global sld_sld, lv_sld, pv_sld - sld_sld= G4Box("dummy", 10.*cm, 10.*cm, 10.*cm) - self.lv_object= lv_sld= G4LogicalVolume(sld_sld, self.air, "dummy") - pv_sld= G4PVPlacement(None, G4ThreeVector(), "dummy", lv_sld, - pv_world, False, 0) - - return pv_world - - # ----------------------------------------------------------------- - def ConstructBox(self): - global sld_box - sld_box= G4Box("box", 30.*cm, 40.*cm, 60.*cm) - self.lv_object.SetSolid(sld_box) - self.lv_object.SetVisAttributes(self.va_red) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructTubs(self): - global sld_tubs - sld_tubs= G4Tubs("tubs", 10.*cm, 15.*cm, 20.*cm, 0., pi) - self.lv_object.SetSolid(sld_tubs) - self.lv_object.SetVisAttributes(self.va_cyan) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructCons(self): - global sld_cons - sld_cons= G4Cons("cons", 5.*cm, 10.*cm, 20.*cm, 25.*cm, - 40.*cm, 0., 4./3.*pi) - self.lv_object.SetSolid(sld_cons) - self.lv_object.SetVisAttributes(self.va_green) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructPara(self): - global sld_para - sld_para= G4Para("para", 30.*cm, 40.*cm, 60.*cm, pi/4., pi/8., 0.) - self.lv_object.SetSolid(sld_para) - self.lv_object.SetVisAttributes(self.va_blue) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructTrd(self): - global sld_trd - sld_trd= G4Trd("trd", 30.*cm, 10.*cm, 40.*cm, 15.*cm, 60.*cm) - self.lv_object.SetSolid(sld_trd) - self.lv_object.SetVisAttributes(self.va_blue) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructTrap(self): - global sld_trap - sld_trap= G4Trap("trap", 60.*cm, 20.*degree, 5.*degree, - 40.*cm, 30.*cm, 40.*cm, 10.*degree, - 16.*cm, 10*cm, 14.*cm, 10.*deg) - self.lv_object.SetSolid(sld_trap) - self.lv_object.SetVisAttributes(self.va_green) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructSphere(self): - global sld_sphere - sld_sphere= G4Sphere("sphere", 100.*cm, 120.*cm, 0., 180.*deg, - 0., 180.*deg) - self.lv_object.SetSolid(sld_sphere) - self.lv_object.SetVisAttributes(self.va_cyan) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructOrb(self): - global sld_orb - sld_orb= G4Orb("orb", 100.*cm) - self.lv_object.SetSolid(sld_orb) - self.lv_object.SetVisAttributes(self.va_red) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructTorus(self): - global sld_torus - sld_torus= G4Torus("torus", 40.*cm, 60.*cm, 200.*cm, 0., 90.*deg) - self.lv_object.SetSolid(sld_torus) - self.lv_object.SetVisAttributes(self.va_magenta) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructPolycone(self): - zvec= G4doubleVector() - rinvec= G4doubleVector() - routvec= G4doubleVector() - - zvec[:]= [ 5.*cm, 7.*cm, 9.*cm, 11.*cm, 25.*cm, 27.*cm, 29.*cm, - 31.*cm, 35.*cm ] - rinvec[:]= [0.,0.,0.,0.,0.,0.,0.,0.,0.] - routvec[:]= [ 0., 10.*cm, 10.*cm, 5.*cm, 5.*cm, 10.*cm, - 10.*cm, 2.*cm, 2.*cm ] - - global sld_pcon - sld_pcon= CreatePolycone("pcon", 0., twopi, 9, zvec, rinvec,routvec) - self.lv_object.SetSolid(sld_pcon) - self.lv_object.SetVisAttributes(self.va_cyan) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructPolyhedra(self): - zvec= G4doubleVector() - rinvec= G4doubleVector() - routvec= G4doubleVector() - - zvec[:]= [ 0., 5.*cm, 8.*cm, 13.*cm, 30.*cm, 32.*cm, 35.*cm ] - rinvec[:]= [0.,0.,0.,0.,0.,0.,0. ] - routvec[:]= [ 0., 15.*cm, 15.*cm, 4.*cm, 4.*cm, 10.*cm, 10.*cm ] - - global sld_pgon - sld_pgon= CreatePolyhedra("pgon", 0., twopi, 5, 7, zvec, rinvec,routvec) - self.lv_object.SetSolid(sld_pgon) - self.lv_object.SetVisAttributes(self.va_green) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructEllipticalTube(self): - global sld_et - sld_et= G4EllipticalTube("ellipticaltube", 5.*cm, 10.*cm, 20.*cm) - self.lv_object.SetSolid(sld_et) - self.lv_object.SetVisAttributes(self.va_cyan) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructEllipsoid(self): - global sld_es - sld_es= G4Ellipsoid("ellipsoid", 10.*cm, 20.*cm, 50.*cm, - -10.*cm, 40.*cm) - self.lv_object.SetSolid(sld_es) - self.lv_object.SetVisAttributes(self.va_red) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructEllipticalCone(self): - global sld_ec - sld_ec= G4EllipticalCone("ellipticalcone", 30.*cm, 60.*cm, - 50.*cm, 25.*cm) - self.lv_object.SetSolid(sld_ec) - self.lv_object.SetVisAttributes(self.va_magenta) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructHype(self): - global sld_hype - sld_hype= G4Hype("hype", 20.*cm, 30.*cm, 0.7, 0.7, 50.*cm) - self.lv_object.SetSolid(sld_hype) - self.lv_object.SetVisAttributes(self.va_blue) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructTet(self): - global sld_tet - p1= G4ThreeVector(0., 0., math.sqrt(3.)*cm) - p2= G4ThreeVector(0., 2*math.sqrt(2./3.)*cm, -1./math.sqrt(3)*cm) - p3= G4ThreeVector(-math.sqrt(2.)*cm, -math.sqrt(2./3.)*cm, - -1./math.sqrt(3)*cm) - p4= G4ThreeVector(math.sqrt(2)*cm, -math.sqrt(2./3.)*cm, - -1./math.sqrt(3)*cm) - - sld_tet= G4Tet("tet", 20.*p1, 20.*p2, 20.*p3, 20.*p4) - self.lv_object.SetSolid(sld_tet) - self.lv_object.SetVisAttributes(self.va_green) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructTwistedBox(self): - global sld_twb - sld_twb= G4TwistedBox("twistedbox", 30.*deg, 30.*cm, 40.*cm, 60.*cm) - self.lv_object.SetSolid(sld_twb) - self.lv_object.SetVisAttributes(self.va_cyan) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructTwistedTrap(self): - global sld_twtrp - sld_twtrp= G4TwistedTrap("twistedtrap", 30.*deg, - 60.*cm, 20.*deg, 5.*deg, - 40.*cm, 30.*cm, 40.*cm, - 16.*cm, 10.*cm, 14.*cm, 10.*deg) - self.lv_object.SetSolid(sld_twtrp) - self.lv_object.SetVisAttributes(self.va_blue) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructTwistedTrd(self): - global sld_twtrd - sld_twtrd= G4TwistedTrd("twistedtrd", 30.*cm, 10.*cm, - 40.*cm, 15.*cm, 60.*cm, 30.*deg) - self.lv_object.SetSolid(sld_twtrd) - self.lv_object.SetVisAttributes(self.va_green) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructTwistedTubs(self): - global sld_twt - sld_twt= G4TwistedTubs("twistedtube", 60.*deg, - 10.*cm, 15.*cm, 20.*cm, 90.*deg) - self.lv_object.SetSolid(sld_twt) - self.lv_object.SetVisAttributes(self.va_magenta) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def Construct(self): # return the world volume - return self.world - -# ================================================================== -# main -# ================================================================== -os.environ["G4VRML_DEST_DIR"]= "." -os.environ["G4VRMLFILE_MAX_FILE_NUM"]= "1" -os.environ["G4VRMLFILE_VIEWER"]= "echo" - -# set geometry -myDC= MyDetectorConstruction() -gRunManager.SetUserInitialization(myDC) - -# minimal physics list -g4pytest.ExN01pl.Construct() - -# set primary generator action -g4pytest.ParticleGun.Construct() - -# initialize -gRunManager.Initialize() - -# visualization -gApplyUICommand("/vis/open VRML2FILE") -gApplyUICommand("/vis/scene/create") -gApplyUICommand("/vis/scene/add/volume") -gApplyUICommand("/vis/sceneHandler/attach") -gApplyUICommand("/vis/scene/add/axes 0. 0. 0. 10. cm") - -# create a vrml file for each solid type -f_list= ( - ("g4box", myDC.ConstructBox), - ("g4tubs", myDC.ConstructTubs), - ("g4cons", myDC.ConstructCons), - ("g4para", myDC.ConstructPara), - ("g4trd", myDC.ConstructTrd), - ("g4trap", myDC.ConstructTrap), - ("g4sphere", myDC.ConstructSphere), - ("g4orb", myDC.ConstructOrb), - ("g4torus", myDC.ConstructTorus), - ("g4polycone", myDC.ConstructPolycone), - ("g4polyhedra", myDC.ConstructPolyhedra), - ("g4ellipticaltube", myDC.ConstructEllipticalTube), - ("g4ellipsoid", myDC.ConstructEllipsoid), - ("g4ellipticalcone", myDC.ConstructEllipticalCone), - ("g4hype", myDC.ConstructHype), - ("g4tet", myDC.ConstructTet), - ("g4twistedbox", myDC.ConstructTwistedBox), - ("g4twistedtrap", myDC.ConstructTwistedTrap), - ("g4twistedtrd", myDC.ConstructTwistedTrd), - ("g4twistedtubs", myDC.ConstructTwistedTubs) - ) - -for s,f in f_list: - f.__call__() - gRunManager.BeamOn(1) - fname= "%s.wrl" % (s) - os.rename("g4_00.wrl", fname) - -gTerminate() diff --git a/environments/g4py/tests/gtest05/vrml/g4box.wrl b/environments/g4py/tests/gtest05/vrml/g4box.wrl deleted file mode 100644 index 83932f5902..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4box.wrl +++ /dev/null @@ -1,102 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - -300 -400 -600, - 300 -400 -600, - 300 400 -600, - -300 400 -600, - -300 -400 600, - 300 -400 600, - 300 400 600, - -300 400 600, - ] - } - coordIndex [ - 0, 3, 2, 1, -1, - 4, 7, 3, 0, -1, - 7, 6, 2, 3, -1, - 6, 5, 1, 2, -1, - 5, 4, 0, 1, -1, - 4, 5, 6, 7, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4cons.wrl b/environments/g4py/tests/gtest05/vrml/g4cons.wrl deleted file mode 100644 index 3ea90815a5..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4cons.wrl +++ /dev/null @@ -1,222 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 250 0 400, - 241.481 64.7048 400, - 216.506 125 400, - 176.777 176.777 400, - 125 216.506 400, - 64.7048 241.481 400, - 1.53081e-14 250 400, - -64.7048 241.481 400, - -125 216.506 400, - -176.777 176.777 400, - -216.506 125 400, - -241.481 64.7048 400, - -250 3.06162e-14 400, - -241.481 -64.7048 400, - -216.506 -125 400, - -176.777 -176.777 400, - -125 -216.506 400, - 100 0 -400, - 96.5926 25.8819 -400, - 86.6025 50 -400, - 70.7107 70.7107 -400, - 50 86.6025 -400, - 25.8819 96.5926 -400, - 6.12323e-15 100 -400, - -25.8819 96.5926 -400, - -50 86.6025 -400, - -70.7107 70.7107 -400, - -86.6025 50 -400, - -96.5926 25.8819 -400, - -100 1.22465e-14 -400, - -96.5926 -25.8819 -400, - -86.6025 -50 -400, - -70.7107 -70.7107 -400, - -50 -86.6025 -400, - 200 0 400, - 193.185 51.7638 400, - 173.205 100 400, - 141.421 141.421 400, - 100 173.205 400, - 51.7638 193.185 400, - 1.22465e-14 200 400, - -51.7638 193.185 400, - -100 173.205 400, - -141.421 141.421 400, - -173.205 100 400, - -193.185 51.7638 400, - -200 2.44929e-14 400, - -193.185 -51.7638 400, - -173.205 -100 400, - -141.421 -141.421 400, - -100 -173.205 400, - 50 0 -400, - 48.2963 12.941 -400, - 43.3013 25 -400, - 35.3553 35.3553 -400, - 25 43.3013 -400, - 12.941 48.2963 -400, - 3.06162e-15 50 -400, - -12.941 48.2963 -400, - -25 43.3013 -400, - -35.3553 35.3553 -400, - -43.3013 25 -400, - -48.2963 12.941 -400, - -50 6.12323e-15 -400, - -48.2963 -12.941 -400, - -43.3013 -25 -400, - -35.3553 -35.3553 -400, - -25 -43.3013 -400, - ] - } - coordIndex [ - 0, 17, 18, 1, -1, - 1, 18, 19, 2, -1, - 2, 19, 20, 3, -1, - 3, 20, 21, 4, -1, - 4, 21, 22, 5, -1, - 5, 22, 23, 6, -1, - 6, 23, 24, 7, -1, - 7, 24, 25, 8, -1, - 8, 25, 26, 9, -1, - 9, 26, 27, 10, -1, - 10, 27, 28, 11, -1, - 11, 28, 29, 12, -1, - 12, 29, 30, 13, -1, - 13, 30, 31, 14, -1, - 14, 31, 32, 15, -1, - 15, 32, 33, 16, -1, - 51, 34, 35, 52, -1, - 52, 35, 36, 53, -1, - 53, 36, 37, 54, -1, - 54, 37, 38, 55, -1, - 55, 38, 39, 56, -1, - 56, 39, 40, 57, -1, - 57, 40, 41, 58, -1, - 58, 41, 42, 59, -1, - 59, 42, 43, 60, -1, - 60, 43, 44, 61, -1, - 61, 44, 45, 62, -1, - 62, 45, 46, 63, -1, - 63, 46, 47, 64, -1, - 64, 47, 48, 65, -1, - 65, 48, 49, 66, -1, - 66, 49, 50, 67, -1, - 34, 0, 1, 35, -1, - 35, 1, 2, 36, -1, - 36, 2, 3, 37, -1, - 37, 3, 4, 38, -1, - 38, 4, 5, 39, -1, - 39, 5, 6, 40, -1, - 40, 6, 7, 41, -1, - 41, 7, 8, 42, -1, - 42, 8, 9, 43, -1, - 43, 9, 10, 44, -1, - 44, 10, 11, 45, -1, - 45, 11, 12, 46, -1, - 46, 12, 13, 47, -1, - 47, 13, 14, 48, -1, - 48, 14, 15, 49, -1, - 49, 15, 16, 50, -1, - 17, 51, 52, 18, -1, - 18, 52, 53, 19, -1, - 19, 53, 54, 20, -1, - 20, 54, 55, 21, -1, - 21, 55, 56, 22, -1, - 22, 56, 57, 23, -1, - 23, 57, 58, 24, -1, - 24, 58, 59, 25, -1, - 25, 59, 60, 26, -1, - 26, 60, 61, 27, -1, - 27, 61, 62, 28, -1, - 28, 62, 63, 29, -1, - 29, 63, 64, 30, -1, - 30, 64, 65, 31, -1, - 31, 65, 66, 32, -1, - 32, 66, 67, 33, -1, - 0, 34, 51, 17, -1, - 33, 67, 50, 16, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4ellipsoid.wrl b/environments/g4py/tests/gtest05/vrml/g4ellipsoid.wrl deleted file mode 100644 index 6deeebdf85..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4ellipsoid.wrl +++ /dev/null @@ -1,403 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 0 0 400, - 60 0 400, - 57.9555 31.0583 400, - 51.9615 60 400, - 42.4264 84.8528 400, - 30 103.923 400, - 15.5291 115.911 400, - 3.67394e-15 120 400, - -15.5291 115.911 400, - -30 103.923 400, - -42.4264 84.8528 400, - -51.9615 60 400, - -57.9555 31.0583 400, - -60 1.46958e-14 400, - -57.9555 -31.0583 400, - -51.9615 -60 400, - -42.4264 -84.8528 400, - -30 -103.923 400, - -15.5291 -115.911 400, - -1.10218e-14 -120 400, - 15.5291 -115.911 400, - 30 -103.923 400, - 42.4264 -84.8528 400, - 51.9615 -60 400, - 57.9555 -31.0583 400, - 76.3833 0 322.707, - 73.7806 39.5389 322.707, - 66.1499 76.3833 322.707, - 54.0112 108.022 322.707, - 38.1917 132.3 322.707, - 19.7695 147.561 322.707, - 4.67713e-15 152.767 322.707, - -19.7695 147.561 322.707, - -38.1917 132.3 322.707, - -54.0112 108.022 322.707, - -66.1499 76.3833 322.707, - -73.7806 39.5389 322.707, - -76.3833 1.87085e-14 322.707, - -73.7806 -39.5389 322.707, - -66.1499 -76.3833 322.707, - -54.0112 -108.022 322.707, - -38.1917 -132.3 322.707, - -19.7695 -147.561 322.707, - -1.40314e-14 -152.767 322.707, - 19.7695 -147.561 322.707, - 38.1917 -132.3 322.707, - 54.0112 -108.022 322.707, - 66.1499 -76.3833 322.707, - 73.7806 -39.5389 322.707, - 88.8911 0 229.04, - 85.8622 46.0134 229.04, - 76.982 88.8911 229.04, - 62.8555 125.711 229.04, - 44.4456 153.964 229.04, - 23.0067 171.724 229.04, - 5.44301e-15 177.782 229.04, - -23.0067 171.724 229.04, - -44.4456 153.964 229.04, - -62.8555 125.711 229.04, - -76.982 88.8911 229.04, - -85.8622 46.0134 229.04, - -88.8911 2.1772e-14 229.04, - -85.8622 -46.0134 229.04, - -76.982 -88.8911 229.04, - -62.8555 -125.711 229.04, - -44.4456 -153.964 229.04, - -23.0067 -171.724 229.04, - -1.6329e-14 -177.782 229.04, - 23.0067 -171.724 229.04, - 44.4456 -153.964 229.04, - 62.8555 -125.711 229.04, - 76.982 -88.8911 229.04, - 85.8622 -46.0134 229.04, - 96.8887 0 123.752, - 93.5873 50.1533 123.752, - 83.9081 96.8887 123.752, - 68.5106 137.021 123.752, - 48.4443 167.816 123.752, - 25.0766 187.175 123.752, - 5.93272e-15 193.777 123.752, - -25.0766 187.175 123.752, - -48.4443 167.816 123.752, - -68.5106 137.021 123.752, - -83.9081 96.8887 123.752, - -93.5873 50.1533 123.752, - -96.8887 2.37309e-14 123.752, - -93.5873 -50.1533 123.752, - -83.9081 -96.8887 123.752, - -68.5106 -137.021 123.752, - -48.4443 -167.816 123.752, - -25.0766 -187.175 123.752, - -1.77982e-14 -193.777 123.752, - 25.0766 -187.175 123.752, - 48.4443 -167.816 123.752, - 68.5106 -137.021 123.752, - 83.9081 -96.8887 123.752, - 93.5873 -50.1533 123.752, - 99.9703 0 12.1851, - 96.5639 51.7484 12.1851, - 86.5768 99.9703 12.1851, - 70.6897 141.379 12.1851, - 49.9852 173.154 12.1851, - 25.8742 193.128 12.1851, - 6.12142e-15 199.941 12.1851, - -25.8742 193.128 12.1851, - -49.9852 173.154 12.1851, - -70.6897 141.379 12.1851, - -86.5768 99.9703 12.1851, - -96.5639 51.7484 12.1851, - -99.9703 2.44857e-14 12.1851, - -96.5639 -51.7484 12.1851, - -86.5768 -99.9703 12.1851, - -70.6897 -141.379 12.1851, - -49.9852 -173.154 12.1851, - -25.8742 -193.128 12.1851, - -1.83642e-14 -199.941 12.1851, - 25.8742 -193.128 12.1851, - 49.9852 -173.154 12.1851, - 70.6897 -141.379 12.1851, - 86.5768 -99.9703 12.1851, - 96.5639 -51.7484 12.1851, - 97.9796 0 -100, - 94.641 50.718 -100, - 84.8528 97.9796 -100, - 69.282 138.564 -100, - 48.9898 169.706 -100, - 25.359 189.282 -100, - 5.99952e-15 195.959 -100, - -25.359 189.282 -100, - -48.9898 169.706 -100, - -69.282 138.564 -100, - -84.8528 97.9796 -100, - -94.641 50.718 -100, - -97.9796 2.39981e-14 -100, - -94.641 -50.718 -100, - -84.8528 -97.9796 -100, - -69.282 -138.564 -100, - -48.9898 -169.706 -100, - -25.359 -189.282 -100, - -1.79986e-14 -195.959 -100, - 25.359 -189.282 -100, - 48.9898 -169.706 -100, - 69.282 -138.564 -100, - 84.8528 -97.9796 -100, - 94.641 -50.718 -100, - 0 0 -100, - 0 0 0, - ] - } - coordIndex [ - 0, 1, 2, -1, - 0, 2, 3, -1, - 0, 3, 4, -1, - 0, 4, 5, -1, - 0, 5, 6, -1, - 0, 6, 7, -1, - 0, 7, 8, -1, - 0, 8, 9, -1, - 0, 9, 10, -1, - 0, 10, 11, -1, - 0, 11, 12, -1, - 0, 12, 13, -1, - 0, 13, 14, -1, - 0, 14, 15, -1, - 0, 15, 16, -1, - 0, 16, 17, -1, - 0, 17, 18, -1, - 0, 18, 19, -1, - 0, 19, 20, -1, - 0, 20, 21, -1, - 0, 21, 22, -1, - 0, 22, 23, -1, - 0, 23, 24, -1, - 0, 24, 1, -1, - 1, 25, 26, 2, -1, - 2, 26, 27, 3, -1, - 3, 27, 28, 4, -1, - 4, 28, 29, 5, -1, - 5, 29, 30, 6, -1, - 6, 30, 31, 7, -1, - 7, 31, 32, 8, -1, - 8, 32, 33, 9, -1, - 9, 33, 34, 10, -1, - 10, 34, 35, 11, -1, - 11, 35, 36, 12, -1, - 12, 36, 37, 13, -1, - 13, 37, 38, 14, -1, - 14, 38, 39, 15, -1, - 15, 39, 40, 16, -1, - 16, 40, 41, 17, -1, - 17, 41, 42, 18, -1, - 18, 42, 43, 19, -1, - 19, 43, 44, 20, -1, - 20, 44, 45, 21, -1, - 21, 45, 46, 22, -1, - 22, 46, 47, 23, -1, - 23, 47, 48, 24, -1, - 24, 48, 25, 1, -1, - 25, 49, 50, 26, -1, - 26, 50, 51, 27, -1, - 27, 51, 52, 28, -1, - 28, 52, 53, 29, -1, - 29, 53, 54, 30, -1, - 30, 54, 55, 31, -1, - 31, 55, 56, 32, -1, - 32, 56, 57, 33, -1, - 33, 57, 58, 34, -1, - 34, 58, 59, 35, -1, - 35, 59, 60, 36, -1, - 36, 60, 61, 37, -1, - 37, 61, 62, 38, -1, - 38, 62, 63, 39, -1, - 39, 63, 64, 40, -1, - 40, 64, 65, 41, -1, - 41, 65, 66, 42, -1, - 42, 66, 67, 43, -1, - 43, 67, 68, 44, -1, - 44, 68, 69, 45, -1, - 45, 69, 70, 46, -1, - 46, 70, 71, 47, -1, - 47, 71, 72, 48, -1, - 48, 72, 49, 25, -1, - 49, 73, 74, 50, -1, - 50, 74, 75, 51, -1, - 51, 75, 76, 52, -1, - 52, 76, 77, 53, -1, - 53, 77, 78, 54, -1, - 54, 78, 79, 55, -1, - 55, 79, 80, 56, -1, - 56, 80, 81, 57, -1, - 57, 81, 82, 58, -1, - 58, 82, 83, 59, -1, - 59, 83, 84, 60, -1, - 60, 84, 85, 61, -1, - 61, 85, 86, 62, -1, - 62, 86, 87, 63, -1, - 63, 87, 88, 64, -1, - 64, 88, 89, 65, -1, - 65, 89, 90, 66, -1, - 66, 90, 91, 67, -1, - 67, 91, 92, 68, -1, - 68, 92, 93, 69, -1, - 69, 93, 94, 70, -1, - 70, 94, 95, 71, -1, - 71, 95, 96, 72, -1, - 72, 96, 73, 49, -1, - 73, 97, 98, 74, -1, - 74, 98, 99, 75, -1, - 75, 99, 100, 76, -1, - 76, 100, 101, 77, -1, - 77, 101, 102, 78, -1, - 78, 102, 103, 79, -1, - 79, 103, 104, 80, -1, - 80, 104, 105, 81, -1, - 81, 105, 106, 82, -1, - 82, 106, 107, 83, -1, - 83, 107, 108, 84, -1, - 84, 108, 109, 85, -1, - 85, 109, 110, 86, -1, - 86, 110, 111, 87, -1, - 87, 111, 112, 88, -1, - 88, 112, 113, 89, -1, - 89, 113, 114, 90, -1, - 90, 114, 115, 91, -1, - 91, 115, 116, 92, -1, - 92, 116, 117, 93, -1, - 93, 117, 118, 94, -1, - 94, 118, 119, 95, -1, - 95, 119, 120, 96, -1, - 96, 120, 97, 73, -1, - 97, 121, 122, 98, -1, - 98, 122, 123, 99, -1, - 99, 123, 124, 100, -1, - 100, 124, 125, 101, -1, - 101, 125, 126, 102, -1, - 102, 126, 127, 103, -1, - 103, 127, 128, 104, -1, - 104, 128, 129, 105, -1, - 105, 129, 130, 106, -1, - 106, 130, 131, 107, -1, - 107, 131, 132, 108, -1, - 108, 132, 133, 109, -1, - 109, 133, 134, 110, -1, - 110, 134, 135, 111, -1, - 111, 135, 136, 112, -1, - 112, 136, 137, 113, -1, - 113, 137, 138, 114, -1, - 114, 138, 139, 115, -1, - 115, 139, 140, 116, -1, - 116, 140, 141, 117, -1, - 117, 141, 142, 118, -1, - 118, 142, 143, 119, -1, - 119, 143, 144, 120, -1, - 120, 144, 121, 97, -1, - 121, 145, 122, -1, - 122, 145, 123, -1, - 123, 145, 124, -1, - 124, 145, 125, -1, - 125, 145, 126, -1, - 126, 145, 127, -1, - 127, 145, 128, -1, - 128, 145, 129, -1, - 129, 145, 130, -1, - 130, 145, 131, -1, - 131, 145, 132, -1, - 132, 145, 133, -1, - 133, 145, 134, -1, - 134, 145, 135, -1, - 135, 145, 136, -1, - 136, 145, 137, -1, - 137, 145, 138, -1, - 138, 145, 139, -1, - 139, 145, 140, -1, - 140, 145, 141, -1, - 141, 145, 142, -1, - 142, 145, 143, -1, - 143, 145, 144, -1, - 144, 145, 121, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4ellipticalcone.wrl b/environments/g4py/tests/gtest05/vrml/g4ellipticalcone.wrl deleted file mode 100644 index eaadbd0c71..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4ellipticalcone.wrl +++ /dev/null @@ -1,210 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 75000 0 250, - 72444.4 38822.9 250, - 64951.9 75000 250, - 53033 106066 250, - 37500 129904 250, - 19411.4 144889 250, - 4.59243e-12 150000 250, - -19411.4 144889 250, - -37500 129904 250, - -53033 106066 250, - -64951.9 75000 250, - -72444.4 38822.9 250, - -75000 1.83697e-11 250, - -72444.4 -38822.9 250, - -64951.9 -75000 250, - -53033 -106066 250, - -37500 -129904 250, - -19411.4 -144889 250, - -1.37773e-11 -150000 250, - 19411.4 -144889 250, - 37500 -129904 250, - 53033 -106066 250, - 64951.9 -75000 250, - 72444.4 -38822.9 250, - 225000 0 -250, - 217333 116469 -250, - 194856 225000 -250, - 159099 318198 -250, - 112500 389711 -250, - 58234.3 434667 -250, - 1.37773e-11 450000 -250, - -58234.3 434667 -250, - -112500 389711 -250, - -159099 318198 -250, - -194856 225000 -250, - -217333 116469 -250, - -225000 5.51091e-11 -250, - -217333 -116469 -250, - -194856 -225000 -250, - -159099 -318198 -250, - -112500 -389711 -250, - -58234.3 -434667 -250, - -4.13318e-11 -450000 -250, - 58234.3 -434667 -250, - 112500 -389711 -250, - 159099 -318198 -250, - 194856 -225000 -250, - 217333 -116469 -250, - 0 0 250, - 0 0 -250, - ] - } - coordIndex [ - 0, 24, 25, 1, -1, - 1, 25, 26, 2, -1, - 2, 26, 27, 3, -1, - 3, 27, 28, 4, -1, - 4, 28, 29, 5, -1, - 5, 29, 30, 6, -1, - 6, 30, 31, 7, -1, - 7, 31, 32, 8, -1, - 8, 32, 33, 9, -1, - 9, 33, 34, 10, -1, - 10, 34, 35, 11, -1, - 11, 35, 36, 12, -1, - 12, 36, 37, 13, -1, - 13, 37, 38, 14, -1, - 14, 38, 39, 15, -1, - 15, 39, 40, 16, -1, - 16, 40, 41, 17, -1, - 17, 41, 42, 18, -1, - 18, 42, 43, 19, -1, - 19, 43, 44, 20, -1, - 20, 44, 45, 21, -1, - 21, 45, 46, 22, -1, - 22, 46, 47, 23, -1, - 23, 47, 24, 0, -1, - 48, 0, 1, -1, - 48, 1, 2, -1, - 48, 2, 3, -1, - 48, 3, 4, -1, - 48, 4, 5, -1, - 48, 5, 6, -1, - 48, 6, 7, -1, - 48, 7, 8, -1, - 48, 8, 9, -1, - 48, 9, 10, -1, - 48, 10, 11, -1, - 48, 11, 12, -1, - 48, 12, 13, -1, - 48, 13, 14, -1, - 48, 14, 15, -1, - 48, 15, 16, -1, - 48, 16, 17, -1, - 48, 17, 18, -1, - 48, 18, 19, -1, - 48, 19, 20, -1, - 48, 20, 21, -1, - 48, 21, 22, -1, - 48, 22, 23, -1, - 48, 23, 0, -1, - 24, 49, 25, -1, - 25, 49, 26, -1, - 26, 49, 27, -1, - 27, 49, 28, -1, - 28, 49, 29, -1, - 29, 49, 30, -1, - 30, 49, 31, -1, - 31, 49, 32, -1, - 32, 49, 33, -1, - 33, 49, 34, -1, - 34, 49, 35, -1, - 35, 49, 36, -1, - 36, 49, 37, -1, - 37, 49, 38, -1, - 38, 49, 39, -1, - 39, 49, 40, -1, - 40, 49, 41, -1, - 41, 49, 42, -1, - 42, 49, 43, -1, - 43, 49, 44, -1, - 44, 49, 45, -1, - 45, 49, 46, -1, - 46, 49, 47, -1, - 47, 49, 24, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4ellipticaltube.wrl b/environments/g4py/tests/gtest05/vrml/g4ellipticaltube.wrl deleted file mode 100644 index 3efae86d7b..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4ellipticaltube.wrl +++ /dev/null @@ -1,210 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 50 0 200, - 48.2963 25.8819 200, - 43.3013 50 200, - 35.3553 70.7107 200, - 25 86.6025 200, - 12.941 96.5926 200, - 3.06162e-15 100 200, - -12.941 96.5926 200, - -25 86.6025 200, - -35.3553 70.7107 200, - -43.3013 50 200, - -48.2963 25.8819 200, - -50 1.22465e-14 200, - -48.2963 -25.8819 200, - -43.3013 -50 200, - -35.3553 -70.7107 200, - -25 -86.6025 200, - -12.941 -96.5926 200, - -9.18485e-15 -100 200, - 12.941 -96.5926 200, - 25 -86.6025 200, - 35.3553 -70.7107 200, - 43.3013 -50 200, - 48.2963 -25.8819 200, - 50 0 -200, - 48.2963 25.8819 -200, - 43.3013 50 -200, - 35.3553 70.7107 -200, - 25 86.6025 -200, - 12.941 96.5926 -200, - 3.06162e-15 100 -200, - -12.941 96.5926 -200, - -25 86.6025 -200, - -35.3553 70.7107 -200, - -43.3013 50 -200, - -48.2963 25.8819 -200, - -50 1.22465e-14 -200, - -48.2963 -25.8819 -200, - -43.3013 -50 -200, - -35.3553 -70.7107 -200, - -25 -86.6025 -200, - -12.941 -96.5926 -200, - -9.18485e-15 -100 -200, - 12.941 -96.5926 -200, - 25 -86.6025 -200, - 35.3553 -70.7107 -200, - 43.3013 -50 -200, - 48.2963 -25.8819 -200, - 0 0 200, - 0 0 -200, - ] - } - coordIndex [ - 0, 24, 25, 1, -1, - 1, 25, 26, 2, -1, - 2, 26, 27, 3, -1, - 3, 27, 28, 4, -1, - 4, 28, 29, 5, -1, - 5, 29, 30, 6, -1, - 6, 30, 31, 7, -1, - 7, 31, 32, 8, -1, - 8, 32, 33, 9, -1, - 9, 33, 34, 10, -1, - 10, 34, 35, 11, -1, - 11, 35, 36, 12, -1, - 12, 36, 37, 13, -1, - 13, 37, 38, 14, -1, - 14, 38, 39, 15, -1, - 15, 39, 40, 16, -1, - 16, 40, 41, 17, -1, - 17, 41, 42, 18, -1, - 18, 42, 43, 19, -1, - 19, 43, 44, 20, -1, - 20, 44, 45, 21, -1, - 21, 45, 46, 22, -1, - 22, 46, 47, 23, -1, - 23, 47, 24, 0, -1, - 48, 0, 1, -1, - 48, 1, 2, -1, - 48, 2, 3, -1, - 48, 3, 4, -1, - 48, 4, 5, -1, - 48, 5, 6, -1, - 48, 6, 7, -1, - 48, 7, 8, -1, - 48, 8, 9, -1, - 48, 9, 10, -1, - 48, 10, 11, -1, - 48, 11, 12, -1, - 48, 12, 13, -1, - 48, 13, 14, -1, - 48, 14, 15, -1, - 48, 15, 16, -1, - 48, 16, 17, -1, - 48, 17, 18, -1, - 48, 18, 19, -1, - 48, 19, 20, -1, - 48, 20, 21, -1, - 48, 21, 22, -1, - 48, 22, 23, -1, - 48, 23, 0, -1, - 24, 49, 25, -1, - 25, 49, 26, -1, - 26, 49, 27, -1, - 27, 49, 28, -1, - 28, 49, 29, -1, - 29, 49, 30, -1, - 30, 49, 31, -1, - 31, 49, 32, -1, - 32, 49, 33, -1, - 33, 49, 34, -1, - 34, 49, 35, -1, - 35, 49, 36, -1, - 36, 49, 37, -1, - 37, 49, 38, -1, - 38, 49, 39, -1, - 39, 49, 40, -1, - 40, 49, 41, -1, - 41, 49, 42, -1, - 42, 49, 43, -1, - 43, 49, 44, -1, - 44, 49, 45, -1, - 45, 49, 46, -1, - 46, 49, 47, -1, - 47, 49, 24, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4hype.wrl b/environments/g4py/tests/gtest05/vrml/g4hype.wrl deleted file mode 100644 index 540feb7e63..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4hype.wrl +++ /dev/null @@ -1,2392 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 517.071 0 500, - 499.452 133.828 500, - 447.797 258.536 500, - 365.624 365.624 500, - 258.536 447.797 500, - 133.828 499.452 500, - 3.16615e-14 517.071 500, - -133.828 499.452 500, - -258.536 447.797 500, - -365.624 365.624 500, - -447.797 258.536 500, - -499.452 133.828 500, - -517.071 6.33229e-14 500, - -499.452 -133.828 500, - -447.797 -258.536 500, - -365.624 -365.624 500, - -258.536 -447.797 500, - -133.828 -499.452 500, - -9.49844e-14 -517.071 500, - 133.828 -499.452 500, - 258.536 -447.797 500, - 365.624 -365.624 500, - 447.797 -258.536 500, - 499.452 -133.828 500, - 488.911 0 458.333, - 472.252 126.539 458.333, - 423.409 244.455 458.333, - 345.712 345.712 458.333, - 244.455 423.409 458.333, - 126.539 472.252 458.333, - 2.99371e-14 488.911 458.333, - -126.539 472.252 458.333, - -244.455 423.409 458.333, - -345.712 345.712 458.333, - -423.409 244.455 458.333, - -472.252 126.539 458.333, - -488.911 5.98743e-14 458.333, - -472.252 -126.539 458.333, - -423.409 -244.455 458.333, - -345.712 -345.712 458.333, - -244.455 -423.409 458.333, - -126.539 -472.252 458.333, - -8.98114e-14 -488.911 458.333, - 126.539 -472.252 458.333, - 244.455 -423.409 458.333, - 345.712 -345.712 458.333, - 423.409 -244.455 458.333, - 472.252 -126.539 458.333, - 461.702 0 416.667, - 445.969 119.497 416.667, - 399.845 230.851 416.667, - 326.472 326.472 416.667, - 230.851 399.845 416.667, - 119.497 445.969 416.667, - 2.82711e-14 461.702 416.667, - -119.497 445.969 416.667, - -230.851 399.845 416.667, - -326.472 326.472 416.667, - -399.845 230.851 416.667, - -445.969 119.497 416.667, - -461.702 5.65421e-14 416.667, - -445.969 -119.497 416.667, - -399.845 -230.851 416.667, - -326.472 -326.472 416.667, - -230.851 -399.845 416.667, - -119.497 -445.969 416.667, - -8.48132e-14 -461.702 416.667, - 119.497 -445.969 416.667, - 230.851 -399.845 416.667, - 326.472 -326.472 416.667, - 399.845 -230.851 416.667, - 445.969 -119.497 416.667, - 435.622 0 375, - 420.778 112.747 375, - 377.26 217.811 375, - 308.031 308.031 375, - 217.811 377.26 375, - 112.747 420.778 375, - 2.66741e-14 435.622 375, - -112.747 420.778 375, - -217.811 377.26 375, - -308.031 308.031 375, - -377.26 217.811 375, - -420.778 112.747 375, - -435.622 5.33483e-14 375, - -420.778 -112.747 375, - -377.26 -217.811 375, - -308.031 -308.031 375, - -217.811 -377.26 375, - -112.747 -420.778 375, - -8.00224e-14 -435.622 375, - 112.747 -420.778 375, - 217.811 -377.26 375, - 308.031 -308.031 375, - 377.26 -217.811 375, - 420.778 -112.747 375, - 410.887 0 333.333, - 396.886 106.345 333.333, - 355.838 205.443 333.333, - 290.541 290.541 333.333, - 205.443 355.838 333.333, - 106.345 396.886 333.333, - 2.51595e-14 410.887 333.333, - -106.345 396.886 333.333, - -205.443 355.838 333.333, - -290.541 290.541 333.333, - -355.838 205.443 333.333, - -396.886 106.345 333.333, - -410.887 5.03191e-14 333.333, - -396.886 -106.345 333.333, - -355.838 -205.443 333.333, - -290.541 -290.541 333.333, - -205.443 -355.838 333.333, - -106.345 -396.886 333.333, - -7.54786e-14 -410.887 333.333, - 106.345 -396.886 333.333, - 205.443 -355.838 333.333, - 290.541 -290.541 333.333, - 355.838 -205.443 333.333, - 396.886 -106.345 333.333, - 387.753 0 291.667, - 374.541 100.358 291.667, - 335.804 193.877 291.667, - 274.183 274.183 291.667, - 193.877 335.804 291.667, - 100.358 374.541 291.667, - 2.3743e-14 387.753 291.667, - -100.358 374.541 291.667, - -193.877 335.804 291.667, - -274.183 274.183 291.667, - -335.804 193.877 291.667, - -374.541 100.358 291.667, - -387.753 4.74861e-14 291.667, - -374.541 -100.358 291.667, - -335.804 -193.877 291.667, - -274.183 -274.183 291.667, - -193.877 -335.804 291.667, - -100.358 -374.541 291.667, - -7.12291e-14 -387.753 291.667, - 100.358 -374.541 291.667, - 193.877 -335.804 291.667, - 274.183 -274.183 291.667, - 335.804 -193.877 291.667, - 374.541 -100.358 291.667, - 366.525 0 250, - 354.036 94.8637 250, - 317.42 183.263 250, - 259.172 259.172 250, - 183.263 317.42 250, - 94.8637 354.036 250, - 2.24432e-14 366.525 250, - -94.8637 354.036 250, - -183.263 317.42 250, - -259.172 259.172 250, - -317.42 183.263 250, - -354.036 94.8637 250, - -366.525 4.48864e-14 250, - -354.036 -94.8637 250, - -317.42 -183.263 250, - -259.172 -259.172 250, - -183.263 -317.42 250, - -94.8637 -354.036 250, - -6.73296e-14 -366.525 250, - 94.8637 -354.036 250, - 183.263 -317.42 250, - 259.172 -259.172 250, - 317.42 -183.263 250, - 354.036 -94.8637 250, - 347.552 0 208.333, - 335.709 89.953 208.333, - 300.988 173.776 208.333, - 245.756 245.756 208.333, - 173.776 300.988 208.333, - 89.953 335.709 208.333, - 2.12814e-14 347.552 208.333, - -89.953 335.709 208.333, - -173.776 300.988 208.333, - -245.756 245.756 208.333, - -300.988 173.776 208.333, - -335.709 89.953 208.333, - -347.552 4.25628e-14 208.333, - -335.709 -89.953 208.333, - -300.988 -173.776 208.333, - -245.756 -245.756 208.333, - -173.776 -300.988 208.333, - -89.953 -335.709 208.333, - -6.38442e-14 -347.552 208.333, - 89.953 -335.709 208.333, - 173.776 -300.988 208.333, - 245.756 -245.756 208.333, - 300.988 -173.776 208.333, - 335.709 -89.953 208.333, - 331.22 0 166.667, - 319.934 85.7261 166.667, - 286.845 165.61 166.667, - 234.208 234.208 166.667, - 165.61 286.845 166.667, - 85.7261 319.934 166.667, - 2.02814e-14 331.22 166.667, - -85.7261 319.934 166.667, - -165.61 286.845 166.667, - -234.208 234.208 166.667, - -286.845 165.61 166.667, - -319.934 85.7261 166.667, - -331.22 4.05628e-14 166.667, - -319.934 -85.7261 166.667, - -286.845 -165.61 166.667, - -234.208 -234.208 166.667, - -165.61 -286.845 166.667, - -85.7261 -319.934 166.667, - -6.08442e-14 -331.22 166.667, - 85.7261 -319.934 166.667, - 165.61 -286.845 166.667, - 234.208 -234.208 166.667, - 286.845 -165.61 166.667, - 319.934 -85.7261 166.667, - 317.939 0 125, - 307.105 82.2886 125, - 275.343 158.969 125, - 224.817 224.817 125, - 158.969 275.343 125, - 82.2886 307.105 125, - 1.94681e-14 317.939 125, - -82.2886 307.105 125, - -158.969 275.343 125, - -224.817 224.817 125, - -275.343 158.969 125, - -307.105 82.2886 125, - -317.939 3.89363e-14 125, - -307.105 -82.2886 125, - -275.343 -158.969 125, - -224.817 -224.817 125, - -158.969 -275.343 125, - -82.2886 -307.105 125, - -5.84044e-14 -317.939 125, - 82.2886 -307.105 125, - 158.969 -275.343 125, - 224.817 -224.817 125, - 275.343 -158.969 125, - 307.105 -82.2886 125, - 308.102 0 83.3333, - 297.604 79.7426 83.3333, - 266.824 154.051 83.3333, - 217.861 217.861 83.3333, - 154.051 266.824 83.3333, - 79.7426 297.604 83.3333, - 1.88658e-14 308.102 83.3333, - -79.7426 297.604 83.3333, - -154.051 266.824 83.3333, - -217.861 217.861 83.3333, - -266.824 154.051 83.3333, - -297.604 79.7426 83.3333, - -308.102 3.77316e-14 83.3333, - -297.604 -79.7426 83.3333, - -266.824 -154.051 83.3333, - -217.861 -217.861 83.3333, - -154.051 -266.824 83.3333, - -79.7426 -297.604 83.3333, - -5.65974e-14 -308.102 83.3333, - 79.7426 -297.604 83.3333, - 154.051 -266.824 83.3333, - 217.861 -217.861 83.3333, - 266.824 -154.051 83.3333, - 297.604 -79.7426 83.3333, - 302.046 0 41.6667, - 291.754 78.1752 41.6667, - 261.579 151.023 41.6667, - 213.579 213.579 41.6667, - 151.023 261.579 41.6667, - 78.1752 291.754 41.6667, - 1.8495e-14 302.046 41.6667, - -78.1752 291.754 41.6667, - -151.023 261.579 41.6667, - -213.579 213.579 41.6667, - -261.579 151.023 41.6667, - -291.754 78.1752 41.6667, - -302.046 3.69899e-14 41.6667, - -291.754 -78.1752 41.6667, - -261.579 -151.023 41.6667, - -213.579 -213.579 41.6667, - -151.023 -261.579 41.6667, - -78.1752 -291.754 41.6667, - -5.54849e-14 -302.046 41.6667, - 78.1752 -291.754 41.6667, - 151.023 -261.579 41.6667, - 213.579 -213.579 41.6667, - 261.579 -151.023 41.6667, - 291.754 -78.1752 41.6667, - 300 0 -4.26326e-14, - 289.778 77.6457 -4.26326e-14, - 259.808 150 -4.26326e-14, - 212.132 212.132 -4.26326e-14, - 150 259.808 -4.26326e-14, - 77.6457 289.778 -4.26326e-14, - 1.83697e-14 300 -4.26326e-14, - -77.6457 289.778 -4.26326e-14, - -150 259.808 -4.26326e-14, - -212.132 212.132 -4.26326e-14, - -259.808 150 -4.26326e-14, - -289.778 77.6457 -4.26326e-14, - -300 3.67394e-14 -4.26326e-14, - -289.778 -77.6457 -4.26326e-14, - -259.808 -150 -4.26326e-14, - -212.132 -212.132 -4.26326e-14, - -150 -259.808 -4.26326e-14, - -77.6457 -289.778 -4.26326e-14, - -5.51091e-14 -300 -4.26326e-14, - 77.6457 -289.778 -4.26326e-14, - 150 -259.808 -4.26326e-14, - 212.132 -212.132 -4.26326e-14, - 259.808 -150 -4.26326e-14, - 289.778 -77.6457 -4.26326e-14, - 302.046 0 -41.6667, - 291.754 78.1752 -41.6667, - 261.579 151.023 -41.6667, - 213.579 213.579 -41.6667, - 151.023 261.579 -41.6667, - 78.1752 291.754 -41.6667, - 1.8495e-14 302.046 -41.6667, - -78.1752 291.754 -41.6667, - -151.023 261.579 -41.6667, - -213.579 213.579 -41.6667, - -261.579 151.023 -41.6667, - -291.754 78.1752 -41.6667, - -302.046 3.69899e-14 -41.6667, - -291.754 -78.1752 -41.6667, - -261.579 -151.023 -41.6667, - -213.579 -213.579 -41.6667, - -151.023 -261.579 -41.6667, - -78.1752 -291.754 -41.6667, - -5.54849e-14 -302.046 -41.6667, - 78.1752 -291.754 -41.6667, - 151.023 -261.579 -41.6667, - 213.579 -213.579 -41.6667, - 261.579 -151.023 -41.6667, - 291.754 -78.1752 -41.6667, - 308.102 0 -83.3333, - 297.604 79.7426 -83.3333, - 266.824 154.051 -83.3333, - 217.861 217.861 -83.3333, - 154.051 266.824 -83.3333, - 79.7426 297.604 -83.3333, - 1.88658e-14 308.102 -83.3333, - -79.7426 297.604 -83.3333, - -154.051 266.824 -83.3333, - -217.861 217.861 -83.3333, - -266.824 154.051 -83.3333, - -297.604 79.7426 -83.3333, - -308.102 3.77316e-14 -83.3333, - -297.604 -79.7426 -83.3333, - -266.824 -154.051 -83.3333, - -217.861 -217.861 -83.3333, - -154.051 -266.824 -83.3333, - -79.7426 -297.604 -83.3333, - -5.65974e-14 -308.102 -83.3333, - 79.7426 -297.604 -83.3333, - 154.051 -266.824 -83.3333, - 217.861 -217.861 -83.3333, - 266.824 -154.051 -83.3333, - 297.604 -79.7426 -83.3333, - 317.939 0 -125, - 307.105 82.2886 -125, - 275.343 158.969 -125, - 224.817 224.817 -125, - 158.969 275.343 -125, - 82.2886 307.105 -125, - 1.94681e-14 317.939 -125, - -82.2886 307.105 -125, - -158.969 275.343 -125, - -224.817 224.817 -125, - -275.343 158.969 -125, - -307.105 82.2886 -125, - -317.939 3.89363e-14 -125, - -307.105 -82.2886 -125, - -275.343 -158.969 -125, - -224.817 -224.817 -125, - -158.969 -275.343 -125, - -82.2886 -307.105 -125, - -5.84044e-14 -317.939 -125, - 82.2886 -307.105 -125, - 158.969 -275.343 -125, - 224.817 -224.817 -125, - 275.343 -158.969 -125, - 307.105 -82.2886 -125, - 331.22 0 -166.667, - 319.934 85.7261 -166.667, - 286.845 165.61 -166.667, - 234.208 234.208 -166.667, - 165.61 286.845 -166.667, - 85.7261 319.934 -166.667, - 2.02814e-14 331.22 -166.667, - -85.7261 319.934 -166.667, - -165.61 286.845 -166.667, - -234.208 234.208 -166.667, - -286.845 165.61 -166.667, - -319.934 85.7261 -166.667, - -331.22 4.05628e-14 -166.667, - -319.934 -85.7261 -166.667, - -286.845 -165.61 -166.667, - -234.208 -234.208 -166.667, - -165.61 -286.845 -166.667, - -85.7261 -319.934 -166.667, - -6.08442e-14 -331.22 -166.667, - 85.7261 -319.934 -166.667, - 165.61 -286.845 -166.667, - 234.208 -234.208 -166.667, - 286.845 -165.61 -166.667, - 319.934 -85.7261 -166.667, - 347.552 0 -208.333, - 335.709 89.953 -208.333, - 300.988 173.776 -208.333, - 245.756 245.756 -208.333, - 173.776 300.988 -208.333, - 89.953 335.709 -208.333, - 2.12814e-14 347.552 -208.333, - -89.953 335.709 -208.333, - -173.776 300.988 -208.333, - -245.756 245.756 -208.333, - -300.988 173.776 -208.333, - -335.709 89.953 -208.333, - -347.552 4.25628e-14 -208.333, - -335.709 -89.953 -208.333, - -300.988 -173.776 -208.333, - -245.756 -245.756 -208.333, - -173.776 -300.988 -208.333, - -89.953 -335.709 -208.333, - -6.38442e-14 -347.552 -208.333, - 89.953 -335.709 -208.333, - 173.776 -300.988 -208.333, - 245.756 -245.756 -208.333, - 300.988 -173.776 -208.333, - 335.709 -89.953 -208.333, - 366.525 0 -250, - 354.036 94.8637 -250, - 317.42 183.263 -250, - 259.172 259.172 -250, - 183.263 317.42 -250, - 94.8637 354.036 -250, - 2.24432e-14 366.525 -250, - -94.8637 354.036 -250, - -183.263 317.42 -250, - -259.172 259.172 -250, - -317.42 183.263 -250, - -354.036 94.8637 -250, - -366.525 4.48864e-14 -250, - -354.036 -94.8637 -250, - -317.42 -183.263 -250, - -259.172 -259.172 -250, - -183.263 -317.42 -250, - -94.8637 -354.036 -250, - -6.73296e-14 -366.525 -250, - 94.8637 -354.036 -250, - 183.263 -317.42 -250, - 259.172 -259.172 -250, - 317.42 -183.263 -250, - 354.036 -94.8637 -250, - 387.753 0 -291.667, - 374.541 100.358 -291.667, - 335.804 193.877 -291.667, - 274.183 274.183 -291.667, - 193.877 335.804 -291.667, - 100.358 374.541 -291.667, - 2.3743e-14 387.753 -291.667, - -100.358 374.541 -291.667, - -193.877 335.804 -291.667, - -274.183 274.183 -291.667, - -335.804 193.877 -291.667, - -374.541 100.358 -291.667, - -387.753 4.74861e-14 -291.667, - -374.541 -100.358 -291.667, - -335.804 -193.877 -291.667, - -274.183 -274.183 -291.667, - -193.877 -335.804 -291.667, - -100.358 -374.541 -291.667, - -7.12291e-14 -387.753 -291.667, - 100.358 -374.541 -291.667, - 193.877 -335.804 -291.667, - 274.183 -274.183 -291.667, - 335.804 -193.877 -291.667, - 374.541 -100.358 -291.667, - 410.887 0 -333.333, - 396.886 106.345 -333.333, - 355.838 205.443 -333.333, - 290.541 290.541 -333.333, - 205.443 355.838 -333.333, - 106.345 396.886 -333.333, - 2.51595e-14 410.887 -333.333, - -106.345 396.886 -333.333, - -205.443 355.838 -333.333, - -290.541 290.541 -333.333, - -355.838 205.443 -333.333, - -396.886 106.345 -333.333, - -410.887 5.03191e-14 -333.333, - -396.886 -106.345 -333.333, - -355.838 -205.443 -333.333, - -290.541 -290.541 -333.333, - -205.443 -355.838 -333.333, - -106.345 -396.886 -333.333, - -7.54786e-14 -410.887 -333.333, - 106.345 -396.886 -333.333, - 205.443 -355.838 -333.333, - 290.541 -290.541 -333.333, - 355.838 -205.443 -333.333, - 396.886 -106.345 -333.333, - 435.622 0 -375, - 420.778 112.747 -375, - 377.26 217.811 -375, - 308.031 308.031 -375, - 217.811 377.26 -375, - 112.747 420.778 -375, - 2.66741e-14 435.622 -375, - -112.747 420.778 -375, - -217.811 377.26 -375, - -308.031 308.031 -375, - -377.26 217.811 -375, - -420.778 112.747 -375, - -435.622 5.33483e-14 -375, - -420.778 -112.747 -375, - -377.26 -217.811 -375, - -308.031 -308.031 -375, - -217.811 -377.26 -375, - -112.747 -420.778 -375, - -8.00224e-14 -435.622 -375, - 112.747 -420.778 -375, - 217.811 -377.26 -375, - 308.031 -308.031 -375, - 377.26 -217.811 -375, - 420.778 -112.747 -375, - 461.702 0 -416.667, - 445.969 119.497 -416.667, - 399.845 230.851 -416.667, - 326.472 326.472 -416.667, - 230.851 399.845 -416.667, - 119.497 445.969 -416.667, - 2.82711e-14 461.702 -416.667, - -119.497 445.969 -416.667, - -230.851 399.845 -416.667, - -326.472 326.472 -416.667, - -399.845 230.851 -416.667, - -445.969 119.497 -416.667, - -461.702 5.65421e-14 -416.667, - -445.969 -119.497 -416.667, - -399.845 -230.851 -416.667, - -326.472 -326.472 -416.667, - -230.851 -399.845 -416.667, - -119.497 -445.969 -416.667, - -8.48132e-14 -461.702 -416.667, - 119.497 -445.969 -416.667, - 230.851 -399.845 -416.667, - 326.472 -326.472 -416.667, - 399.845 -230.851 -416.667, - 445.969 -119.497 -416.667, - 517.071 0 -500, - 499.452 133.828 -500, - 447.797 258.536 -500, - 365.624 365.624 -500, - 258.536 447.797 -500, - 133.828 499.452 -500, - 3.16615e-14 517.071 -500, - -133.828 499.452 -500, - -258.536 447.797 -500, - -365.624 365.624 -500, - -447.797 258.536 -500, - -499.452 133.828 -500, - -517.071 6.33229e-14 -500, - -499.452 -133.828 -500, - -447.797 -258.536 -500, - -365.624 -365.624 -500, - -258.536 -447.797 -500, - -133.828 -499.452 -500, - -9.49844e-14 -517.071 -500, - 133.828 -499.452 -500, - 258.536 -447.797 -500, - 365.624 -365.624 -500, - 447.797 -258.536 -500, - 499.452 -133.828 -500, - 466.221 0 500, - 450.335 120.667 500, - 403.76 233.111 500, - 329.668 329.668 500, - 233.111 403.76 500, - 120.667 450.335 500, - 2.85478e-14 466.221 500, - -120.667 450.335 500, - -233.111 403.76 500, - -329.668 329.668 500, - -403.76 233.111 500, - -450.335 120.667 500, - -466.221 5.70957e-14 500, - -450.335 -120.667 500, - -403.76 -233.111 500, - -329.668 -329.668 500, - -233.111 -403.76 500, - -120.667 -450.335 500, - -8.56435e-14 -466.221 500, - 120.667 -450.335 500, - 233.111 -403.76 500, - 329.668 -329.668 500, - 403.76 -233.111 500, - 450.335 -120.667 500, - 434.78 0 458.333, - 419.965 112.529 458.333, - 376.531 217.39 458.333, - 307.436 307.436 458.333, - 217.39 376.531 458.333, - 112.529 419.965 458.333, - 2.66226e-14 434.78 458.333, - -112.529 419.965 458.333, - -217.39 376.531 458.333, - -307.436 307.436 458.333, - -376.531 217.39 458.333, - -419.965 112.529 458.333, - -434.78 5.32452e-14 458.333, - -419.965 -112.529 458.333, - -376.531 -217.39 458.333, - -307.436 -307.436 458.333, - -217.39 -376.531 458.333, - -112.529 -419.965 458.333, - -7.98678e-14 -434.78 458.333, - 112.529 -419.965 458.333, - 217.39 -376.531 458.333, - 307.436 -307.436 458.333, - 376.531 -217.39 458.333, - 419.965 -112.529 458.333, - 403.941 0 416.667, - 390.177 104.548 416.667, - 349.823 201.971 416.667, - 285.629 285.629 416.667, - 201.971 349.823 416.667, - 104.548 390.177 416.667, - 2.47343e-14 403.941 416.667, - -104.548 390.177 416.667, - -201.971 349.823 416.667, - -285.629 285.629 416.667, - -349.823 201.971 416.667, - -390.177 104.548 416.667, - -403.941 4.94685e-14 416.667, - -390.177 -104.548 416.667, - -349.823 -201.971 416.667, - -285.629 -285.629 416.667, - -201.971 -349.823 416.667, - -104.548 -390.177 416.667, - -7.42028e-14 -403.941 416.667, - 104.548 -390.177 416.667, - 201.971 -349.823 416.667, - 285.629 -285.629 416.667, - 349.823 -201.971 416.667, - 390.177 -104.548 416.667, - 373.853 0 375, - 361.115 96.7604 375, - 323.767 186.927 375, - 264.354 264.354 375, - 186.927 323.767 375, - 96.7604 361.115 375, - 2.28919e-14 373.853 375, - -96.7604 361.115 375, - -186.927 323.767 375, - -264.354 264.354 375, - -323.767 186.927 375, - -361.115 96.7604 375, - -373.853 4.57838e-14 375, - -361.115 -96.7604 375, - -323.767 -186.927 375, - -264.354 -264.354 375, - -186.927 -323.767 375, - -96.7604 -361.115 375, - -6.86758e-14 -373.853 375, - 96.7604 -361.115 375, - 186.927 -323.767 375, - 264.354 -264.354 375, - 323.767 -186.927 375, - 361.115 -96.7604 375, - 344.714 0 333.333, - 332.968 89.2185 333.333, - 298.531 172.357 333.333, - 243.75 243.75 333.333, - 172.357 298.531 333.333, - 89.2185 332.968 333.333, - 2.11076e-14 344.714 333.333, - -89.2185 332.968 333.333, - -172.357 298.531 333.333, - -243.75 243.75 333.333, - -298.531 172.357 333.333, - -332.968 89.2185 333.333, - -344.714 4.22153e-14 333.333, - -332.968 -89.2185 333.333, - -298.531 -172.357 333.333, - -243.75 -243.75 333.333, - -172.357 -298.531 333.333, - -89.2185 -332.968 333.333, - -6.33229e-14 -344.714 333.333, - 89.2185 -332.968 333.333, - 172.357 -298.531 333.333, - 243.75 -243.75 333.333, - 298.531 -172.357 333.333, - 332.968 -89.2185 333.333, - 316.785 0 291.667, - 305.99 81.9899 291.667, - 274.344 158.392 291.667, - 224.001 224.001 291.667, - 158.392 274.344 291.667, - 81.9899 305.99 291.667, - 1.93975e-14 316.785 291.667, - -81.9899 305.99 291.667, - -158.392 274.344 291.667, - -224.001 224.001 291.667, - -274.344 158.392 291.667, - -305.99 81.9899 291.667, - -316.785 3.87949e-14 291.667, - -305.99 -81.9899 291.667, - -274.344 -158.392 291.667, - -224.001 -224.001 291.667, - -158.392 -274.344 291.667, - -81.9899 -305.99 291.667, - -5.81924e-14 -316.785 291.667, - 81.9899 -305.99 291.667, - 158.392 -274.344 291.667, - 224.001 -224.001 291.667, - 274.344 -158.392 291.667, - 305.99 -81.9899 291.667, - 290.415 0 250, - 280.519 75.1648 250, - 251.506 145.207 250, - 205.354 205.354 250, - 145.207 251.506 250, - 75.1648 280.519 250, - 1.77828e-14 290.415 250, - -75.1648 280.519 250, - -145.207 251.506 250, - -205.354 205.354 250, - -251.506 145.207 250, - -280.519 75.1648 250, - -290.415 3.55655e-14 250, - -280.519 -75.1648 250, - -251.506 -145.207 250, - -205.354 -205.354 250, - -145.207 -251.506 250, - -75.1648 -280.519 250, - -5.33483e-14 -290.415 250, - 75.1648 -280.519 250, - 145.207 -251.506 250, - 205.354 -205.354 250, - 251.506 -145.207 250, - 280.519 -75.1648 250, - 266.068 0 208.333, - 257.002 68.8634 208.333, - 230.421 133.034 208.333, - 188.138 188.138 208.333, - 133.034 230.421 208.333, - 68.8634 257.002 208.333, - 1.6292e-14 266.068 208.333, - -68.8634 257.002 208.333, - -133.034 230.421 208.333, - -188.138 188.138 208.333, - -230.421 133.034 208.333, - -257.002 68.8634 208.333, - -266.068 3.25839e-14 208.333, - -257.002 -68.8634 208.333, - -230.421 -133.034 208.333, - -188.138 -188.138 208.333, - -133.034 -230.421 208.333, - -68.8634 -257.002 208.333, - -4.88759e-14 -266.068 208.333, - 68.8634 -257.002 208.333, - 133.034 -230.421 208.333, - 188.138 -188.138 208.333, - 230.421 -133.034 208.333, - 257.002 -68.8634 208.333, - 244.35 0 166.667, - 236.024 63.2424 166.667, - 211.613 122.175 166.667, - 172.782 172.782 166.667, - 122.175 211.613 166.667, - 63.2424 236.024 166.667, - 1.49621e-14 244.35 166.667, - -63.2424 236.024 166.667, - -122.175 211.613 166.667, - -172.782 172.782 166.667, - -211.613 122.175 166.667, - -236.024 63.2424 166.667, - -244.35 2.99242e-14 166.667, - -236.024 -63.2424 166.667, - -211.613 -122.175 166.667, - -172.782 -172.782 166.667, - -122.175 -211.613 166.667, - -63.2424 -236.024 166.667, - -4.48864e-14 -244.35 166.667, - 63.2424 -236.024 166.667, - 122.175 -211.613 166.667, - 172.782 -172.782 166.667, - 211.613 -122.175 166.667, - 236.024 -63.2424 166.667, - 226.02 0 125, - 218.319 58.4983 125, - 195.739 113.01 125, - 159.82 159.82 125, - 113.01 195.739 125, - 58.4983 218.319 125, - 1.38397e-14 226.02 125, - -58.4983 218.319 125, - -113.01 195.739 125, - -159.82 159.82 125, - -195.739 113.01 125, - -218.319 58.4983 125, - -226.02 2.76795e-14 125, - -218.319 -58.4983 125, - -195.739 -113.01 125, - -159.82 -159.82 125, - -113.01 -195.739 125, - -58.4983 -218.319 125, - -4.15192e-14 -226.02 125, - 58.4983 -218.319 125, - 113.01 -195.739 125, - 159.82 -159.82 125, - 195.739 -113.01 125, - 218.319 -58.4983 125, - 211.959 0 83.3333, - 204.737 54.8591 83.3333, - 183.562 105.98 83.3333, - 149.878 149.878 83.3333, - 105.98 183.562 83.3333, - 54.8591 204.737 83.3333, - 1.29788e-14 211.959 83.3333, - -54.8591 204.737 83.3333, - -105.98 183.562 83.3333, - -149.878 149.878 83.3333, - -183.562 105.98 83.3333, - -204.737 54.8591 83.3333, - -211.959 2.59575e-14 83.3333, - -204.737 -54.8591 83.3333, - -183.562 -105.98 83.3333, - -149.878 -149.878 83.3333, - -105.98 -183.562 83.3333, - -54.8591 -204.737 83.3333, - -3.89363e-14 -211.959 83.3333, - 54.8591 -204.737 83.3333, - 105.98 -183.562 83.3333, - 149.878 -149.878 83.3333, - 183.562 -105.98 83.3333, - 204.737 -54.8591 83.3333, - 203.056 0 41.6667, - 196.137 52.5547 41.6667, - 175.852 101.528 41.6667, - 143.582 143.582 41.6667, - 101.528 175.852 41.6667, - 52.5547 196.137 41.6667, - 1.24336e-14 203.056 41.6667, - -52.5547 196.137 41.6667, - -101.528 175.852 41.6667, - -143.582 143.582 41.6667, - -175.852 101.528 41.6667, - -196.137 52.5547 41.6667, - -203.056 2.48672e-14 41.6667, - -196.137 -52.5547 41.6667, - -175.852 -101.528 41.6667, - -143.582 -143.582 41.6667, - -101.528 -175.852 41.6667, - -52.5547 -196.137 41.6667, - -3.73008e-14 -203.056 41.6667, - 52.5547 -196.137 41.6667, - 101.528 -175.852 41.6667, - 143.582 -143.582 41.6667, - 175.852 -101.528 41.6667, - 196.137 -52.5547 41.6667, - 200 0 -4.26326e-14, - 193.185 51.7638 -4.26326e-14, - 173.205 100 -4.26326e-14, - 141.421 141.421 -4.26326e-14, - 100 173.205 -4.26326e-14, - 51.7638 193.185 -4.26326e-14, - 1.22465e-14 200 -4.26326e-14, - -51.7638 193.185 -4.26326e-14, - -100 173.205 -4.26326e-14, - -141.421 141.421 -4.26326e-14, - -173.205 100 -4.26326e-14, - -193.185 51.7638 -4.26326e-14, - -200 2.44929e-14 -4.26326e-14, - -193.185 -51.7638 -4.26326e-14, - -173.205 -100 -4.26326e-14, - -141.421 -141.421 -4.26326e-14, - -100 -173.205 -4.26326e-14, - -51.7638 -193.185 -4.26326e-14, - -3.67394e-14 -200 -4.26326e-14, - 51.7638 -193.185 -4.26326e-14, - 100 -173.205 -4.26326e-14, - 141.421 -141.421 -4.26326e-14, - 173.205 -100 -4.26326e-14, - 193.185 -51.7638 -4.26326e-14, - 203.056 0 -41.6667, - 196.137 52.5547 -41.6667, - 175.852 101.528 -41.6667, - 143.582 143.582 -41.6667, - 101.528 175.852 -41.6667, - 52.5547 196.137 -41.6667, - 1.24336e-14 203.056 -41.6667, - -52.5547 196.137 -41.6667, - -101.528 175.852 -41.6667, - -143.582 143.582 -41.6667, - -175.852 101.528 -41.6667, - -196.137 52.5547 -41.6667, - -203.056 2.48672e-14 -41.6667, - -196.137 -52.5547 -41.6667, - -175.852 -101.528 -41.6667, - -143.582 -143.582 -41.6667, - -101.528 -175.852 -41.6667, - -52.5547 -196.137 -41.6667, - -3.73008e-14 -203.056 -41.6667, - 52.5547 -196.137 -41.6667, - 101.528 -175.852 -41.6667, - 143.582 -143.582 -41.6667, - 175.852 -101.528 -41.6667, - 196.137 -52.5547 -41.6667, - 211.959 0 -83.3333, - 204.737 54.8591 -83.3333, - 183.562 105.98 -83.3333, - 149.878 149.878 -83.3333, - 105.98 183.562 -83.3333, - 54.8591 204.737 -83.3333, - 1.29788e-14 211.959 -83.3333, - -54.8591 204.737 -83.3333, - -105.98 183.562 -83.3333, - -149.878 149.878 -83.3333, - -183.562 105.98 -83.3333, - -204.737 54.8591 -83.3333, - -211.959 2.59575e-14 -83.3333, - -204.737 -54.8591 -83.3333, - -183.562 -105.98 -83.3333, - -149.878 -149.878 -83.3333, - -105.98 -183.562 -83.3333, - -54.8591 -204.737 -83.3333, - -3.89363e-14 -211.959 -83.3333, - 54.8591 -204.737 -83.3333, - 105.98 -183.562 -83.3333, - 149.878 -149.878 -83.3333, - 183.562 -105.98 -83.3333, - 204.737 -54.8591 -83.3333, - 226.02 0 -125, - 218.319 58.4983 -125, - 195.739 113.01 -125, - 159.82 159.82 -125, - 113.01 195.739 -125, - 58.4983 218.319 -125, - 1.38397e-14 226.02 -125, - -58.4983 218.319 -125, - -113.01 195.739 -125, - -159.82 159.82 -125, - -195.739 113.01 -125, - -218.319 58.4983 -125, - -226.02 2.76795e-14 -125, - -218.319 -58.4983 -125, - -195.739 -113.01 -125, - -159.82 -159.82 -125, - -113.01 -195.739 -125, - -58.4983 -218.319 -125, - -4.15192e-14 -226.02 -125, - 58.4983 -218.319 -125, - 113.01 -195.739 -125, - 159.82 -159.82 -125, - 195.739 -113.01 -125, - 218.319 -58.4983 -125, - 244.35 0 -166.667, - 236.024 63.2424 -166.667, - 211.613 122.175 -166.667, - 172.782 172.782 -166.667, - 122.175 211.613 -166.667, - 63.2424 236.024 -166.667, - 1.49621e-14 244.35 -166.667, - -63.2424 236.024 -166.667, - -122.175 211.613 -166.667, - -172.782 172.782 -166.667, - -211.613 122.175 -166.667, - -236.024 63.2424 -166.667, - -244.35 2.99242e-14 -166.667, - -236.024 -63.2424 -166.667, - -211.613 -122.175 -166.667, - -172.782 -172.782 -166.667, - -122.175 -211.613 -166.667, - -63.2424 -236.024 -166.667, - -4.48864e-14 -244.35 -166.667, - 63.2424 -236.024 -166.667, - 122.175 -211.613 -166.667, - 172.782 -172.782 -166.667, - 211.613 -122.175 -166.667, - 236.024 -63.2424 -166.667, - 266.068 0 -208.333, - 257.002 68.8634 -208.333, - 230.421 133.034 -208.333, - 188.138 188.138 -208.333, - 133.034 230.421 -208.333, - 68.8634 257.002 -208.333, - 1.6292e-14 266.068 -208.333, - -68.8634 257.002 -208.333, - -133.034 230.421 -208.333, - -188.138 188.138 -208.333, - -230.421 133.034 -208.333, - -257.002 68.8634 -208.333, - -266.068 3.25839e-14 -208.333, - -257.002 -68.8634 -208.333, - -230.421 -133.034 -208.333, - -188.138 -188.138 -208.333, - -133.034 -230.421 -208.333, - -68.8634 -257.002 -208.333, - -4.88759e-14 -266.068 -208.333, - 68.8634 -257.002 -208.333, - 133.034 -230.421 -208.333, - 188.138 -188.138 -208.333, - 230.421 -133.034 -208.333, - 257.002 -68.8634 -208.333, - 290.415 0 -250, - 280.519 75.1648 -250, - 251.506 145.207 -250, - 205.354 205.354 -250, - 145.207 251.506 -250, - 75.1648 280.519 -250, - 1.77828e-14 290.415 -250, - -75.1648 280.519 -250, - -145.207 251.506 -250, - -205.354 205.354 -250, - -251.506 145.207 -250, - -280.519 75.1648 -250, - -290.415 3.55655e-14 -250, - -280.519 -75.1648 -250, - -251.506 -145.207 -250, - -205.354 -205.354 -250, - -145.207 -251.506 -250, - -75.1648 -280.519 -250, - -5.33483e-14 -290.415 -250, - 75.1648 -280.519 -250, - 145.207 -251.506 -250, - 205.354 -205.354 -250, - 251.506 -145.207 -250, - 280.519 -75.1648 -250, - 316.785 0 -291.667, - 305.99 81.9899 -291.667, - 274.344 158.392 -291.667, - 224.001 224.001 -291.667, - 158.392 274.344 -291.667, - 81.9899 305.99 -291.667, - 1.93975e-14 316.785 -291.667, - -81.9899 305.99 -291.667, - -158.392 274.344 -291.667, - -224.001 224.001 -291.667, - -274.344 158.392 -291.667, - -305.99 81.9899 -291.667, - -316.785 3.87949e-14 -291.667, - -305.99 -81.9899 -291.667, - -274.344 -158.392 -291.667, - -224.001 -224.001 -291.667, - -158.392 -274.344 -291.667, - -81.9899 -305.99 -291.667, - -5.81924e-14 -316.785 -291.667, - 81.9899 -305.99 -291.667, - 158.392 -274.344 -291.667, - 224.001 -224.001 -291.667, - 274.344 -158.392 -291.667, - 305.99 -81.9899 -291.667, - 344.714 0 -333.333, - 332.968 89.2185 -333.333, - 298.531 172.357 -333.333, - 243.75 243.75 -333.333, - 172.357 298.531 -333.333, - 89.2185 332.968 -333.333, - 2.11076e-14 344.714 -333.333, - -89.2185 332.968 -333.333, - -172.357 298.531 -333.333, - -243.75 243.75 -333.333, - -298.531 172.357 -333.333, - -332.968 89.2185 -333.333, - -344.714 4.22153e-14 -333.333, - -332.968 -89.2185 -333.333, - -298.531 -172.357 -333.333, - -243.75 -243.75 -333.333, - -172.357 -298.531 -333.333, - -89.2185 -332.968 -333.333, - -6.33229e-14 -344.714 -333.333, - 89.2185 -332.968 -333.333, - 172.357 -298.531 -333.333, - 243.75 -243.75 -333.333, - 298.531 -172.357 -333.333, - 332.968 -89.2185 -333.333, - 373.853 0 -375, - 361.115 96.7604 -375, - 323.767 186.927 -375, - 264.354 264.354 -375, - 186.927 323.767 -375, - 96.7604 361.115 -375, - 2.28919e-14 373.853 -375, - -96.7604 361.115 -375, - -186.927 323.767 -375, - -264.354 264.354 -375, - -323.767 186.927 -375, - -361.115 96.7604 -375, - -373.853 4.57838e-14 -375, - -361.115 -96.7604 -375, - -323.767 -186.927 -375, - -264.354 -264.354 -375, - -186.927 -323.767 -375, - -96.7604 -361.115 -375, - -6.86758e-14 -373.853 -375, - 96.7604 -361.115 -375, - 186.927 -323.767 -375, - 264.354 -264.354 -375, - 323.767 -186.927 -375, - 361.115 -96.7604 -375, - 403.941 0 -416.667, - 390.177 104.548 -416.667, - 349.823 201.971 -416.667, - 285.629 285.629 -416.667, - 201.971 349.823 -416.667, - 104.548 390.177 -416.667, - 2.47343e-14 403.941 -416.667, - -104.548 390.177 -416.667, - -201.971 349.823 -416.667, - -285.629 285.629 -416.667, - -349.823 201.971 -416.667, - -390.177 104.548 -416.667, - -403.941 4.94685e-14 -416.667, - -390.177 -104.548 -416.667, - -349.823 -201.971 -416.667, - -285.629 -285.629 -416.667, - -201.971 -349.823 -416.667, - -104.548 -390.177 -416.667, - -7.42028e-14 -403.941 -416.667, - 104.548 -390.177 -416.667, - 201.971 -349.823 -416.667, - 285.629 -285.629 -416.667, - 349.823 -201.971 -416.667, - 390.177 -104.548 -416.667, - 434.78 0 -458.333, - 419.965 112.529 -458.333, - 376.531 217.39 -458.333, - 307.436 307.436 -458.333, - 217.39 376.531 -458.333, - 112.529 419.965 -458.333, - 2.66226e-14 434.78 -458.333, - -112.529 419.965 -458.333, - -217.39 376.531 -458.333, - -307.436 307.436 -458.333, - -376.531 217.39 -458.333, - -419.965 112.529 -458.333, - -434.78 5.32452e-14 -458.333, - -419.965 -112.529 -458.333, - -376.531 -217.39 -458.333, - -307.436 -307.436 -458.333, - -217.39 -376.531 -458.333, - -112.529 -419.965 -458.333, - -7.98678e-14 -434.78 -458.333, - 112.529 -419.965 -458.333, - 217.39 -376.531 -458.333, - 307.436 -307.436 -458.333, - 376.531 -217.39 -458.333, - 419.965 -112.529 -458.333, - ] - } - coordIndex [ - 0, 24, 25, 1, -1, - 1, 25, 26, 2, -1, - 2, 26, 27, 3, -1, - 3, 27, 28, 4, -1, - 4, 28, 29, 5, -1, - 5, 29, 30, 6, -1, - 6, 30, 31, 7, -1, - 7, 31, 32, 8, -1, - 8, 32, 33, 9, -1, - 9, 33, 34, 10, -1, - 10, 34, 35, 11, -1, - 11, 35, 36, 12, -1, - 12, 36, 37, 13, -1, - 13, 37, 38, 14, -1, - 14, 38, 39, 15, -1, - 15, 39, 40, 16, -1, - 16, 40, 41, 17, -1, - 17, 41, 42, 18, -1, - 18, 42, 43, 19, -1, - 19, 43, 44, 20, -1, - 20, 44, 45, 21, -1, - 21, 45, 46, 22, -1, - 22, 46, 47, 23, -1, - 23, 47, 24, 0, -1, - 24, 48, 49, 25, -1, - 25, 49, 50, 26, -1, - 26, 50, 51, 27, -1, - 27, 51, 52, 28, -1, - 28, 52, 53, 29, -1, - 29, 53, 54, 30, -1, - 30, 54, 55, 31, -1, - 31, 55, 56, 32, -1, - 32, 56, 57, 33, -1, - 33, 57, 58, 34, -1, - 34, 58, 59, 35, -1, - 35, 59, 60, 36, -1, - 36, 60, 61, 37, -1, - 37, 61, 62, 38, -1, - 38, 62, 63, 39, -1, - 39, 63, 64, 40, -1, - 40, 64, 65, 41, -1, - 41, 65, 66, 42, -1, - 42, 66, 67, 43, -1, - 43, 67, 68, 44, -1, - 44, 68, 69, 45, -1, - 45, 69, 70, 46, -1, - 46, 70, 71, 47, -1, - 47, 71, 48, 24, -1, - 48, 72, 73, 49, -1, - 49, 73, 74, 50, -1, - 50, 74, 75, 51, -1, - 51, 75, 76, 52, -1, - 52, 76, 77, 53, -1, - 53, 77, 78, 54, -1, - 54, 78, 79, 55, -1, - 55, 79, 80, 56, -1, - 56, 80, 81, 57, -1, - 57, 81, 82, 58, -1, - 58, 82, 83, 59, -1, - 59, 83, 84, 60, -1, - 60, 84, 85, 61, -1, - 61, 85, 86, 62, -1, - 62, 86, 87, 63, -1, - 63, 87, 88, 64, -1, - 64, 88, 89, 65, -1, - 65, 89, 90, 66, -1, - 66, 90, 91, 67, -1, - 67, 91, 92, 68, -1, - 68, 92, 93, 69, -1, - 69, 93, 94, 70, -1, - 70, 94, 95, 71, -1, - 71, 95, 72, 48, -1, - 72, 96, 97, 73, -1, - 73, 97, 98, 74, -1, - 74, 98, 99, 75, -1, - 75, 99, 100, 76, -1, - 76, 100, 101, 77, -1, - 77, 101, 102, 78, -1, - 78, 102, 103, 79, -1, - 79, 103, 104, 80, -1, - 80, 104, 105, 81, -1, - 81, 105, 106, 82, -1, - 82, 106, 107, 83, -1, - 83, 107, 108, 84, -1, - 84, 108, 109, 85, -1, - 85, 109, 110, 86, -1, - 86, 110, 111, 87, -1, - 87, 111, 112, 88, -1, - 88, 112, 113, 89, -1, - 89, 113, 114, 90, -1, - 90, 114, 115, 91, -1, - 91, 115, 116, 92, -1, - 92, 116, 117, 93, -1, - 93, 117, 118, 94, -1, - 94, 118, 119, 95, -1, - 95, 119, 96, 72, -1, - 96, 120, 121, 97, -1, - 97, 121, 122, 98, -1, - 98, 122, 123, 99, -1, - 99, 123, 124, 100, -1, - 100, 124, 125, 101, -1, - 101, 125, 126, 102, -1, - 102, 126, 127, 103, -1, - 103, 127, 128, 104, -1, - 104, 128, 129, 105, -1, - 105, 129, 130, 106, -1, - 106, 130, 131, 107, -1, - 107, 131, 132, 108, -1, - 108, 132, 133, 109, -1, - 109, 133, 134, 110, -1, - 110, 134, 135, 111, -1, - 111, 135, 136, 112, -1, - 112, 136, 137, 113, -1, - 113, 137, 138, 114, -1, - 114, 138, 139, 115, -1, - 115, 139, 140, 116, -1, - 116, 140, 141, 117, -1, - 117, 141, 142, 118, -1, - 118, 142, 143, 119, -1, - 119, 143, 120, 96, -1, - 120, 144, 145, 121, -1, - 121, 145, 146, 122, -1, - 122, 146, 147, 123, -1, - 123, 147, 148, 124, -1, - 124, 148, 149, 125, -1, - 125, 149, 150, 126, -1, - 126, 150, 151, 127, -1, - 127, 151, 152, 128, -1, - 128, 152, 153, 129, -1, - 129, 153, 154, 130, -1, - 130, 154, 155, 131, -1, - 131, 155, 156, 132, -1, - 132, 156, 157, 133, -1, - 133, 157, 158, 134, -1, - 134, 158, 159, 135, -1, - 135, 159, 160, 136, -1, - 136, 160, 161, 137, -1, - 137, 161, 162, 138, -1, - 138, 162, 163, 139, -1, - 139, 163, 164, 140, -1, - 140, 164, 165, 141, -1, - 141, 165, 166, 142, -1, - 142, 166, 167, 143, -1, - 143, 167, 144, 120, -1, - 144, 168, 169, 145, -1, - 145, 169, 170, 146, -1, - 146, 170, 171, 147, -1, - 147, 171, 172, 148, -1, - 148, 172, 173, 149, -1, - 149, 173, 174, 150, -1, - 150, 174, 175, 151, -1, - 151, 175, 176, 152, -1, - 152, 176, 177, 153, -1, - 153, 177, 178, 154, -1, - 154, 178, 179, 155, -1, - 155, 179, 180, 156, -1, - 156, 180, 181, 157, -1, - 157, 181, 182, 158, -1, - 158, 182, 183, 159, -1, - 159, 183, 184, 160, -1, - 160, 184, 185, 161, -1, - 161, 185, 186, 162, -1, - 162, 186, 187, 163, -1, - 163, 187, 188, 164, -1, - 164, 188, 189, 165, -1, - 165, 189, 190, 166, -1, - 166, 190, 191, 167, -1, - 167, 191, 168, 144, -1, - 168, 192, 193, 169, -1, - 169, 193, 194, 170, -1, - 170, 194, 195, 171, -1, - 171, 195, 196, 172, -1, - 172, 196, 197, 173, -1, - 173, 197, 198, 174, -1, - 174, 198, 199, 175, -1, - 175, 199, 200, 176, -1, - 176, 200, 201, 177, -1, - 177, 201, 202, 178, -1, - 178, 202, 203, 179, -1, - 179, 203, 204, 180, -1, - 180, 204, 205, 181, -1, - 181, 205, 206, 182, -1, - 182, 206, 207, 183, -1, - 183, 207, 208, 184, -1, - 184, 208, 209, 185, -1, - 185, 209, 210, 186, -1, - 186, 210, 211, 187, -1, - 187, 211, 212, 188, -1, - 188, 212, 213, 189, -1, - 189, 213, 214, 190, -1, - 190, 214, 215, 191, -1, - 191, 215, 192, 168, -1, - 192, 216, 217, 193, -1, - 193, 217, 218, 194, -1, - 194, 218, 219, 195, -1, - 195, 219, 220, 196, -1, - 196, 220, 221, 197, -1, - 197, 221, 222, 198, -1, - 198, 222, 223, 199, -1, - 199, 223, 224, 200, -1, - 200, 224, 225, 201, -1, - 201, 225, 226, 202, -1, - 202, 226, 227, 203, -1, - 203, 227, 228, 204, -1, - 204, 228, 229, 205, -1, - 205, 229, 230, 206, -1, - 206, 230, 231, 207, -1, - 207, 231, 232, 208, -1, - 208, 232, 233, 209, -1, - 209, 233, 234, 210, -1, - 210, 234, 235, 211, -1, - 211, 235, 236, 212, -1, - 212, 236, 237, 213, -1, - 213, 237, 238, 214, -1, - 214, 238, 239, 215, -1, - 215, 239, 216, 192, -1, - 216, 240, 241, 217, -1, - 217, 241, 242, 218, -1, - 218, 242, 243, 219, -1, - 219, 243, 244, 220, -1, - 220, 244, 245, 221, -1, - 221, 245, 246, 222, -1, - 222, 246, 247, 223, -1, - 223, 247, 248, 224, -1, - 224, 248, 249, 225, -1, - 225, 249, 250, 226, -1, - 226, 250, 251, 227, -1, - 227, 251, 252, 228, -1, - 228, 252, 253, 229, -1, - 229, 253, 254, 230, -1, - 230, 254, 255, 231, -1, - 231, 255, 256, 232, -1, - 232, 256, 257, 233, -1, - 233, 257, 258, 234, -1, - 234, 258, 259, 235, -1, - 235, 259, 260, 236, -1, - 236, 260, 261, 237, -1, - 237, 261, 262, 238, -1, - 238, 262, 263, 239, -1, - 239, 263, 240, 216, -1, - 240, 264, 265, 241, -1, - 241, 265, 266, 242, -1, - 242, 266, 267, 243, -1, - 243, 267, 268, 244, -1, - 244, 268, 269, 245, -1, - 245, 269, 270, 246, -1, - 246, 270, 271, 247, -1, - 247, 271, 272, 248, -1, - 248, 272, 273, 249, -1, - 249, 273, 274, 250, -1, - 250, 274, 275, 251, -1, - 251, 275, 276, 252, -1, - 252, 276, 277, 253, -1, - 253, 277, 278, 254, -1, - 254, 278, 279, 255, -1, - 255, 279, 280, 256, -1, - 256, 280, 281, 257, -1, - 257, 281, 282, 258, -1, - 258, 282, 283, 259, -1, - 259, 283, 284, 260, -1, - 260, 284, 285, 261, -1, - 261, 285, 286, 262, -1, - 262, 286, 287, 263, -1, - 263, 287, 264, 240, -1, - 264, 288, 289, 265, -1, - 265, 289, 290, 266, -1, - 266, 290, 291, 267, -1, - 267, 291, 292, 268, -1, - 268, 292, 293, 269, -1, - 269, 293, 294, 270, -1, - 270, 294, 295, 271, -1, - 271, 295, 296, 272, -1, - 272, 296, 297, 273, -1, - 273, 297, 298, 274, -1, - 274, 298, 299, 275, -1, - 275, 299, 300, 276, -1, - 276, 300, 301, 277, -1, - 277, 301, 302, 278, -1, - 278, 302, 303, 279, -1, - 279, 303, 304, 280, -1, - 280, 304, 305, 281, -1, - 281, 305, 306, 282, -1, - 282, 306, 307, 283, -1, - 283, 307, 308, 284, -1, - 284, 308, 309, 285, -1, - 285, 309, 310, 286, -1, - 286, 310, 311, 287, -1, - 287, 311, 288, 264, -1, - 288, 312, 313, 289, -1, - 289, 313, 314, 290, -1, - 290, 314, 315, 291, -1, - 291, 315, 316, 292, -1, - 292, 316, 317, 293, -1, - 293, 317, 318, 294, -1, - 294, 318, 319, 295, -1, - 295, 319, 320, 296, -1, - 296, 320, 321, 297, -1, - 297, 321, 322, 298, -1, - 298, 322, 323, 299, -1, - 299, 323, 324, 300, -1, - 300, 324, 325, 301, -1, - 301, 325, 326, 302, -1, - 302, 326, 327, 303, -1, - 303, 327, 328, 304, -1, - 304, 328, 329, 305, -1, - 305, 329, 330, 306, -1, - 306, 330, 331, 307, -1, - 307, 331, 332, 308, -1, - 308, 332, 333, 309, -1, - 309, 333, 334, 310, -1, - 310, 334, 335, 311, -1, - 311, 335, 312, 288, -1, - 312, 336, 337, 313, -1, - 313, 337, 338, 314, -1, - 314, 338, 339, 315, -1, - 315, 339, 340, 316, -1, - 316, 340, 341, 317, -1, - 317, 341, 342, 318, -1, - 318, 342, 343, 319, -1, - 319, 343, 344, 320, -1, - 320, 344, 345, 321, -1, - 321, 345, 346, 322, -1, - 322, 346, 347, 323, -1, - 323, 347, 348, 324, -1, - 324, 348, 349, 325, -1, - 325, 349, 350, 326, -1, - 326, 350, 351, 327, -1, - 327, 351, 352, 328, -1, - 328, 352, 353, 329, -1, - 329, 353, 354, 330, -1, - 330, 354, 355, 331, -1, - 331, 355, 356, 332, -1, - 332, 356, 357, 333, -1, - 333, 357, 358, 334, -1, - 334, 358, 359, 335, -1, - 335, 359, 336, 312, -1, - 336, 360, 361, 337, -1, - 337, 361, 362, 338, -1, - 338, 362, 363, 339, -1, - 339, 363, 364, 340, -1, - 340, 364, 365, 341, -1, - 341, 365, 366, 342, -1, - 342, 366, 367, 343, -1, - 343, 367, 368, 344, -1, - 344, 368, 369, 345, -1, - 345, 369, 370, 346, -1, - 346, 370, 371, 347, -1, - 347, 371, 372, 348, -1, - 348, 372, 373, 349, -1, - 349, 373, 374, 350, -1, - 350, 374, 375, 351, -1, - 351, 375, 376, 352, -1, - 352, 376, 377, 353, -1, - 353, 377, 378, 354, -1, - 354, 378, 379, 355, -1, - 355, 379, 380, 356, -1, - 356, 380, 381, 357, -1, - 357, 381, 382, 358, -1, - 358, 382, 383, 359, -1, - 359, 383, 360, 336, -1, - 360, 384, 385, 361, -1, - 361, 385, 386, 362, -1, - 362, 386, 387, 363, -1, - 363, 387, 388, 364, -1, - 364, 388, 389, 365, -1, - 365, 389, 390, 366, -1, - 366, 390, 391, 367, -1, - 367, 391, 392, 368, -1, - 368, 392, 393, 369, -1, - 369, 393, 394, 370, -1, - 370, 394, 395, 371, -1, - 371, 395, 396, 372, -1, - 372, 396, 397, 373, -1, - 373, 397, 398, 374, -1, - 374, 398, 399, 375, -1, - 375, 399, 400, 376, -1, - 376, 400, 401, 377, -1, - 377, 401, 402, 378, -1, - 378, 402, 403, 379, -1, - 379, 403, 404, 380, -1, - 380, 404, 405, 381, -1, - 381, 405, 406, 382, -1, - 382, 406, 407, 383, -1, - 383, 407, 384, 360, -1, - 384, 408, 409, 385, -1, - 385, 409, 410, 386, -1, - 386, 410, 411, 387, -1, - 387, 411, 412, 388, -1, - 388, 412, 413, 389, -1, - 389, 413, 414, 390, -1, - 390, 414, 415, 391, -1, - 391, 415, 416, 392, -1, - 392, 416, 417, 393, -1, - 393, 417, 418, 394, -1, - 394, 418, 419, 395, -1, - 395, 419, 420, 396, -1, - 396, 420, 421, 397, -1, - 397, 421, 422, 398, -1, - 398, 422, 423, 399, -1, - 399, 423, 424, 400, -1, - 400, 424, 425, 401, -1, - 401, 425, 426, 402, -1, - 402, 426, 427, 403, -1, - 403, 427, 428, 404, -1, - 404, 428, 429, 405, -1, - 405, 429, 430, 406, -1, - 406, 430, 431, 407, -1, - 407, 431, 408, 384, -1, - 408, 432, 433, 409, -1, - 409, 433, 434, 410, -1, - 410, 434, 435, 411, -1, - 411, 435, 436, 412, -1, - 412, 436, 437, 413, -1, - 413, 437, 438, 414, -1, - 414, 438, 439, 415, -1, - 415, 439, 440, 416, -1, - 416, 440, 441, 417, -1, - 417, 441, 442, 418, -1, - 418, 442, 443, 419, -1, - 419, 443, 444, 420, -1, - 420, 444, 445, 421, -1, - 421, 445, 446, 422, -1, - 422, 446, 447, 423, -1, - 423, 447, 448, 424, -1, - 424, 448, 449, 425, -1, - 425, 449, 450, 426, -1, - 426, 450, 451, 427, -1, - 427, 451, 452, 428, -1, - 428, 452, 453, 429, -1, - 429, 453, 454, 430, -1, - 430, 454, 455, 431, -1, - 431, 455, 432, 408, -1, - 432, 456, 457, 433, -1, - 433, 457, 458, 434, -1, - 434, 458, 459, 435, -1, - 435, 459, 460, 436, -1, - 436, 460, 461, 437, -1, - 437, 461, 462, 438, -1, - 438, 462, 463, 439, -1, - 439, 463, 464, 440, -1, - 440, 464, 465, 441, -1, - 441, 465, 466, 442, -1, - 442, 466, 467, 443, -1, - 443, 467, 468, 444, -1, - 444, 468, 469, 445, -1, - 445, 469, 470, 446, -1, - 446, 470, 471, 447, -1, - 447, 471, 472, 448, -1, - 448, 472, 473, 449, -1, - 449, 473, 474, 450, -1, - 450, 474, 475, 451, -1, - 451, 475, 476, 452, -1, - 452, 476, 477, 453, -1, - 453, 477, 478, 454, -1, - 454, 478, 479, 455, -1, - 455, 479, 456, 432, -1, - 456, 480, 481, 457, -1, - 457, 481, 482, 458, -1, - 458, 482, 483, 459, -1, - 459, 483, 484, 460, -1, - 460, 484, 485, 461, -1, - 461, 485, 486, 462, -1, - 462, 486, 487, 463, -1, - 463, 487, 488, 464, -1, - 464, 488, 489, 465, -1, - 465, 489, 490, 466, -1, - 466, 490, 491, 467, -1, - 467, 491, 492, 468, -1, - 468, 492, 493, 469, -1, - 469, 493, 494, 470, -1, - 470, 494, 495, 471, -1, - 471, 495, 496, 472, -1, - 472, 496, 497, 473, -1, - 473, 497, 498, 474, -1, - 474, 498, 499, 475, -1, - 475, 499, 500, 476, -1, - 476, 500, 501, 477, -1, - 477, 501, 502, 478, -1, - 478, 502, 503, 479, -1, - 479, 503, 480, 456, -1, - 480, 504, 505, 481, -1, - 481, 505, 506, 482, -1, - 482, 506, 507, 483, -1, - 483, 507, 508, 484, -1, - 484, 508, 509, 485, -1, - 485, 509, 510, 486, -1, - 486, 510, 511, 487, -1, - 487, 511, 512, 488, -1, - 488, 512, 513, 489, -1, - 489, 513, 514, 490, -1, - 490, 514, 515, 491, -1, - 491, 515, 516, 492, -1, - 492, 516, 517, 493, -1, - 493, 517, 518, 494, -1, - 494, 518, 519, 495, -1, - 495, 519, 520, 496, -1, - 496, 520, 521, 497, -1, - 497, 521, 522, 498, -1, - 498, 522, 523, 499, -1, - 499, 523, 524, 500, -1, - 500, 524, 525, 501, -1, - 501, 525, 526, 502, -1, - 502, 526, 527, 503, -1, - 503, 527, 504, 480, -1, - 504, 528, 529, 505, -1, - 505, 529, 530, 506, -1, - 506, 530, 531, 507, -1, - 507, 531, 532, 508, -1, - 508, 532, 533, 509, -1, - 509, 533, 534, 510, -1, - 510, 534, 535, 511, -1, - 511, 535, 536, 512, -1, - 512, 536, 537, 513, -1, - 513, 537, 538, 514, -1, - 514, 538, 539, 515, -1, - 515, 539, 540, 516, -1, - 516, 540, 541, 517, -1, - 517, 541, 542, 518, -1, - 518, 542, 543, 519, -1, - 519, 543, 544, 520, -1, - 520, 544, 545, 521, -1, - 521, 545, 546, 522, -1, - 522, 546, 547, 523, -1, - 523, 547, 548, 524, -1, - 524, 548, 549, 525, -1, - 525, 549, 550, 526, -1, - 526, 550, 551, 527, -1, - 527, 551, 528, 504, -1, - 528, 552, 553, 529, -1, - 529, 553, 554, 530, -1, - 530, 554, 555, 531, -1, - 531, 555, 556, 532, -1, - 532, 556, 557, 533, -1, - 533, 557, 558, 534, -1, - 534, 558, 559, 535, -1, - 535, 559, 560, 536, -1, - 536, 560, 561, 537, -1, - 537, 561, 562, 538, -1, - 538, 562, 563, 539, -1, - 539, 563, 564, 540, -1, - 540, 564, 565, 541, -1, - 541, 565, 566, 542, -1, - 542, 566, 567, 543, -1, - 543, 567, 568, 544, -1, - 544, 568, 569, 545, -1, - 545, 569, 570, 546, -1, - 546, 570, 571, 547, -1, - 547, 571, 572, 548, -1, - 548, 572, 573, 549, -1, - 549, 573, 574, 550, -1, - 550, 574, 575, 551, -1, - 551, 575, 552, 528, -1, - 600, 576, 577, 601, -1, - 601, 577, 578, 602, -1, - 602, 578, 579, 603, -1, - 603, 579, 580, 604, -1, - 604, 580, 581, 605, -1, - 605, 581, 582, 606, -1, - 606, 582, 583, 607, -1, - 607, 583, 584, 608, -1, - 608, 584, 585, 609, -1, - 609, 585, 586, 610, -1, - 610, 586, 587, 611, -1, - 611, 587, 588, 612, -1, - 612, 588, 589, 613, -1, - 613, 589, 590, 614, -1, - 614, 590, 591, 615, -1, - 615, 591, 592, 616, -1, - 616, 592, 593, 617, -1, - 617, 593, 594, 618, -1, - 618, 594, 595, 619, -1, - 619, 595, 596, 620, -1, - 620, 596, 597, 621, -1, - 621, 597, 598, 622, -1, - 622, 598, 599, 623, -1, - 623, 599, 576, 600, -1, - 624, 600, 601, 625, -1, - 625, 601, 602, 626, -1, - 626, 602, 603, 627, -1, - 627, 603, 604, 628, -1, - 628, 604, 605, 629, -1, - 629, 605, 606, 630, -1, - 630, 606, 607, 631, -1, - 631, 607, 608, 632, -1, - 632, 608, 609, 633, -1, - 633, 609, 610, 634, -1, - 634, 610, 611, 635, -1, - 635, 611, 612, 636, -1, - 636, 612, 613, 637, -1, - 637, 613, 614, 638, -1, - 638, 614, 615, 639, -1, - 639, 615, 616, 640, -1, - 640, 616, 617, 641, -1, - 641, 617, 618, 642, -1, - 642, 618, 619, 643, -1, - 643, 619, 620, 644, -1, - 644, 620, 621, 645, -1, - 645, 621, 622, 646, -1, - 646, 622, 623, 647, -1, - 647, 623, 600, 624, -1, - 648, 624, 625, 649, -1, - 649, 625, 626, 650, -1, - 650, 626, 627, 651, -1, - 651, 627, 628, 652, -1, - 652, 628, 629, 653, -1, - 653, 629, 630, 654, -1, - 654, 630, 631, 655, -1, - 655, 631, 632, 656, -1, - 656, 632, 633, 657, -1, - 657, 633, 634, 658, -1, - 658, 634, 635, 659, -1, - 659, 635, 636, 660, -1, - 660, 636, 637, 661, -1, - 661, 637, 638, 662, -1, - 662, 638, 639, 663, -1, - 663, 639, 640, 664, -1, - 664, 640, 641, 665, -1, - 665, 641, 642, 666, -1, - 666, 642, 643, 667, -1, - 667, 643, 644, 668, -1, - 668, 644, 645, 669, -1, - 669, 645, 646, 670, -1, - 670, 646, 647, 671, -1, - 671, 647, 624, 648, -1, - 672, 648, 649, 673, -1, - 673, 649, 650, 674, -1, - 674, 650, 651, 675, -1, - 675, 651, 652, 676, -1, - 676, 652, 653, 677, -1, - 677, 653, 654, 678, -1, - 678, 654, 655, 679, -1, - 679, 655, 656, 680, -1, - 680, 656, 657, 681, -1, - 681, 657, 658, 682, -1, - 682, 658, 659, 683, -1, - 683, 659, 660, 684, -1, - 684, 660, 661, 685, -1, - 685, 661, 662, 686, -1, - 686, 662, 663, 687, -1, - 687, 663, 664, 688, -1, - 688, 664, 665, 689, -1, - 689, 665, 666, 690, -1, - 690, 666, 667, 691, -1, - 691, 667, 668, 692, -1, - 692, 668, 669, 693, -1, - 693, 669, 670, 694, -1, - 694, 670, 671, 695, -1, - 695, 671, 648, 672, -1, - 696, 672, 673, 697, -1, - 697, 673, 674, 698, -1, - 698, 674, 675, 699, -1, - 699, 675, 676, 700, -1, - 700, 676, 677, 701, -1, - 701, 677, 678, 702, -1, - 702, 678, 679, 703, -1, - 703, 679, 680, 704, -1, - 704, 680, 681, 705, -1, - 705, 681, 682, 706, -1, - 706, 682, 683, 707, -1, - 707, 683, 684, 708, -1, - 708, 684, 685, 709, -1, - 709, 685, 686, 710, -1, - 710, 686, 687, 711, -1, - 711, 687, 688, 712, -1, - 712, 688, 689, 713, -1, - 713, 689, 690, 714, -1, - 714, 690, 691, 715, -1, - 715, 691, 692, 716, -1, - 716, 692, 693, 717, -1, - 717, 693, 694, 718, -1, - 718, 694, 695, 719, -1, - 719, 695, 672, 696, -1, - 720, 696, 697, 721, -1, - 721, 697, 698, 722, -1, - 722, 698, 699, 723, -1, - 723, 699, 700, 724, -1, - 724, 700, 701, 725, -1, - 725, 701, 702, 726, -1, - 726, 702, 703, 727, -1, - 727, 703, 704, 728, -1, - 728, 704, 705, 729, -1, - 729, 705, 706, 730, -1, - 730, 706, 707, 731, -1, - 731, 707, 708, 732, -1, - 732, 708, 709, 733, -1, - 733, 709, 710, 734, -1, - 734, 710, 711, 735, -1, - 735, 711, 712, 736, -1, - 736, 712, 713, 737, -1, - 737, 713, 714, 738, -1, - 738, 714, 715, 739, -1, - 739, 715, 716, 740, -1, - 740, 716, 717, 741, -1, - 741, 717, 718, 742, -1, - 742, 718, 719, 743, -1, - 743, 719, 696, 720, -1, - 744, 720, 721, 745, -1, - 745, 721, 722, 746, -1, - 746, 722, 723, 747, -1, - 747, 723, 724, 748, -1, - 748, 724, 725, 749, -1, - 749, 725, 726, 750, -1, - 750, 726, 727, 751, -1, - 751, 727, 728, 752, -1, - 752, 728, 729, 753, -1, - 753, 729, 730, 754, -1, - 754, 730, 731, 755, -1, - 755, 731, 732, 756, -1, - 756, 732, 733, 757, -1, - 757, 733, 734, 758, -1, - 758, 734, 735, 759, -1, - 759, 735, 736, 760, -1, - 760, 736, 737, 761, -1, - 761, 737, 738, 762, -1, - 762, 738, 739, 763, -1, - 763, 739, 740, 764, -1, - 764, 740, 741, 765, -1, - 765, 741, 742, 766, -1, - 766, 742, 743, 767, -1, - 767, 743, 720, 744, -1, - 768, 744, 745, 769, -1, - 769, 745, 746, 770, -1, - 770, 746, 747, 771, -1, - 771, 747, 748, 772, -1, - 772, 748, 749, 773, -1, - 773, 749, 750, 774, -1, - 774, 750, 751, 775, -1, - 775, 751, 752, 776, -1, - 776, 752, 753, 777, -1, - 777, 753, 754, 778, -1, - 778, 754, 755, 779, -1, - 779, 755, 756, 780, -1, - 780, 756, 757, 781, -1, - 781, 757, 758, 782, -1, - 782, 758, 759, 783, -1, - 783, 759, 760, 784, -1, - 784, 760, 761, 785, -1, - 785, 761, 762, 786, -1, - 786, 762, 763, 787, -1, - 787, 763, 764, 788, -1, - 788, 764, 765, 789, -1, - 789, 765, 766, 790, -1, - 790, 766, 767, 791, -1, - 791, 767, 744, 768, -1, - 792, 768, 769, 793, -1, - 793, 769, 770, 794, -1, - 794, 770, 771, 795, -1, - 795, 771, 772, 796, -1, - 796, 772, 773, 797, -1, - 797, 773, 774, 798, -1, - 798, 774, 775, 799, -1, - 799, 775, 776, 800, -1, - 800, 776, 777, 801, -1, - 801, 777, 778, 802, -1, - 802, 778, 779, 803, -1, - 803, 779, 780, 804, -1, - 804, 780, 781, 805, -1, - 805, 781, 782, 806, -1, - 806, 782, 783, 807, -1, - 807, 783, 784, 808, -1, - 808, 784, 785, 809, -1, - 809, 785, 786, 810, -1, - 810, 786, 787, 811, -1, - 811, 787, 788, 812, -1, - 812, 788, 789, 813, -1, - 813, 789, 790, 814, -1, - 814, 790, 791, 815, -1, - 815, 791, 768, 792, -1, - 816, 792, 793, 817, -1, - 817, 793, 794, 818, -1, - 818, 794, 795, 819, -1, - 819, 795, 796, 820, -1, - 820, 796, 797, 821, -1, - 821, 797, 798, 822, -1, - 822, 798, 799, 823, -1, - 823, 799, 800, 824, -1, - 824, 800, 801, 825, -1, - 825, 801, 802, 826, -1, - 826, 802, 803, 827, -1, - 827, 803, 804, 828, -1, - 828, 804, 805, 829, -1, - 829, 805, 806, 830, -1, - 830, 806, 807, 831, -1, - 831, 807, 808, 832, -1, - 832, 808, 809, 833, -1, - 833, 809, 810, 834, -1, - 834, 810, 811, 835, -1, - 835, 811, 812, 836, -1, - 836, 812, 813, 837, -1, - 837, 813, 814, 838, -1, - 838, 814, 815, 839, -1, - 839, 815, 792, 816, -1, - 840, 816, 817, 841, -1, - 841, 817, 818, 842, -1, - 842, 818, 819, 843, -1, - 843, 819, 820, 844, -1, - 844, 820, 821, 845, -1, - 845, 821, 822, 846, -1, - 846, 822, 823, 847, -1, - 847, 823, 824, 848, -1, - 848, 824, 825, 849, -1, - 849, 825, 826, 850, -1, - 850, 826, 827, 851, -1, - 851, 827, 828, 852, -1, - 852, 828, 829, 853, -1, - 853, 829, 830, 854, -1, - 854, 830, 831, 855, -1, - 855, 831, 832, 856, -1, - 856, 832, 833, 857, -1, - 857, 833, 834, 858, -1, - 858, 834, 835, 859, -1, - 859, 835, 836, 860, -1, - 860, 836, 837, 861, -1, - 861, 837, 838, 862, -1, - 862, 838, 839, 863, -1, - 863, 839, 816, 840, -1, - 864, 840, 841, 865, -1, - 865, 841, 842, 866, -1, - 866, 842, 843, 867, -1, - 867, 843, 844, 868, -1, - 868, 844, 845, 869, -1, - 869, 845, 846, 870, -1, - 870, 846, 847, 871, -1, - 871, 847, 848, 872, -1, - 872, 848, 849, 873, -1, - 873, 849, 850, 874, -1, - 874, 850, 851, 875, -1, - 875, 851, 852, 876, -1, - 876, 852, 853, 877, -1, - 877, 853, 854, 878, -1, - 878, 854, 855, 879, -1, - 879, 855, 856, 880, -1, - 880, 856, 857, 881, -1, - 881, 857, 858, 882, -1, - 882, 858, 859, 883, -1, - 883, 859, 860, 884, -1, - 884, 860, 861, 885, -1, - 885, 861, 862, 886, -1, - 886, 862, 863, 887, -1, - 887, 863, 840, 864, -1, - 888, 864, 865, 889, -1, - 889, 865, 866, 890, -1, - 890, 866, 867, 891, -1, - 891, 867, 868, 892, -1, - 892, 868, 869, 893, -1, - 893, 869, 870, 894, -1, - 894, 870, 871, 895, -1, - 895, 871, 872, 896, -1, - 896, 872, 873, 897, -1, - 897, 873, 874, 898, -1, - 898, 874, 875, 899, -1, - 899, 875, 876, 900, -1, - 900, 876, 877, 901, -1, - 901, 877, 878, 902, -1, - 902, 878, 879, 903, -1, - 903, 879, 880, 904, -1, - 904, 880, 881, 905, -1, - 905, 881, 882, 906, -1, - 906, 882, 883, 907, -1, - 907, 883, 884, 908, -1, - 908, 884, 885, 909, -1, - 909, 885, 886, 910, -1, - 910, 886, 887, 911, -1, - 911, 887, 864, 888, -1, - 912, 888, 889, 913, -1, - 913, 889, 890, 914, -1, - 914, 890, 891, 915, -1, - 915, 891, 892, 916, -1, - 916, 892, 893, 917, -1, - 917, 893, 894, 918, -1, - 918, 894, 895, 919, -1, - 919, 895, 896, 920, -1, - 920, 896, 897, 921, -1, - 921, 897, 898, 922, -1, - 922, 898, 899, 923, -1, - 923, 899, 900, 924, -1, - 924, 900, 901, 925, -1, - 925, 901, 902, 926, -1, - 926, 902, 903, 927, -1, - 927, 903, 904, 928, -1, - 928, 904, 905, 929, -1, - 929, 905, 906, 930, -1, - 930, 906, 907, 931, -1, - 931, 907, 908, 932, -1, - 932, 908, 909, 933, -1, - 933, 909, 910, 934, -1, - 934, 910, 911, 935, -1, - 935, 911, 888, 912, -1, - 936, 912, 913, 937, -1, - 937, 913, 914, 938, -1, - 938, 914, 915, 939, -1, - 939, 915, 916, 940, -1, - 940, 916, 917, 941, -1, - 941, 917, 918, 942, -1, - 942, 918, 919, 943, -1, - 943, 919, 920, 944, -1, - 944, 920, 921, 945, -1, - 945, 921, 922, 946, -1, - 946, 922, 923, 947, -1, - 947, 923, 924, 948, -1, - 948, 924, 925, 949, -1, - 949, 925, 926, 950, -1, - 950, 926, 927, 951, -1, - 951, 927, 928, 952, -1, - 952, 928, 929, 953, -1, - 953, 929, 930, 954, -1, - 954, 930, 931, 955, -1, - 955, 931, 932, 956, -1, - 956, 932, 933, 957, -1, - 957, 933, 934, 958, -1, - 958, 934, 935, 959, -1, - 959, 935, 912, 936, -1, - 960, 936, 937, 961, -1, - 961, 937, 938, 962, -1, - 962, 938, 939, 963, -1, - 963, 939, 940, 964, -1, - 964, 940, 941, 965, -1, - 965, 941, 942, 966, -1, - 966, 942, 943, 967, -1, - 967, 943, 944, 968, -1, - 968, 944, 945, 969, -1, - 969, 945, 946, 970, -1, - 970, 946, 947, 971, -1, - 971, 947, 948, 972, -1, - 972, 948, 949, 973, -1, - 973, 949, 950, 974, -1, - 974, 950, 951, 975, -1, - 975, 951, 952, 976, -1, - 976, 952, 953, 977, -1, - 977, 953, 954, 978, -1, - 978, 954, 955, 979, -1, - 979, 955, 956, 980, -1, - 980, 956, 957, 981, -1, - 981, 957, 958, 982, -1, - 982, 958, 959, 983, -1, - 983, 959, 936, 960, -1, - 984, 960, 961, 985, -1, - 985, 961, 962, 986, -1, - 986, 962, 963, 987, -1, - 987, 963, 964, 988, -1, - 988, 964, 965, 989, -1, - 989, 965, 966, 990, -1, - 990, 966, 967, 991, -1, - 991, 967, 968, 992, -1, - 992, 968, 969, 993, -1, - 993, 969, 970, 994, -1, - 994, 970, 971, 995, -1, - 995, 971, 972, 996, -1, - 996, 972, 973, 997, -1, - 997, 973, 974, 998, -1, - 998, 974, 975, 999, -1, - 999, 975, 976, 1000, -1, - 1000, 976, 977, 1001, -1, - 1001, 977, 978, 1002, -1, - 1002, 978, 979, 1003, -1, - 1003, 979, 980, 1004, -1, - 1004, 980, 981, 1005, -1, - 1005, 981, 982, 1006, -1, - 1006, 982, 983, 1007, -1, - 1007, 983, 960, 984, -1, - 1008, 984, 985, 1009, -1, - 1009, 985, 986, 1010, -1, - 1010, 986, 987, 1011, -1, - 1011, 987, 988, 1012, -1, - 1012, 988, 989, 1013, -1, - 1013, 989, 990, 1014, -1, - 1014, 990, 991, 1015, -1, - 1015, 991, 992, 1016, -1, - 1016, 992, 993, 1017, -1, - 1017, 993, 994, 1018, -1, - 1018, 994, 995, 1019, -1, - 1019, 995, 996, 1020, -1, - 1020, 996, 997, 1021, -1, - 1021, 997, 998, 1022, -1, - 1022, 998, 999, 1023, -1, - 1023, 999, 1000, 1024, -1, - 1024, 1000, 1001, 1025, -1, - 1025, 1001, 1002, 1026, -1, - 1026, 1002, 1003, 1027, -1, - 1027, 1003, 1004, 1028, -1, - 1028, 1004, 1005, 1029, -1, - 1029, 1005, 1006, 1030, -1, - 1030, 1006, 1007, 1031, -1, - 1031, 1007, 984, 1008, -1, - 1032, 1008, 1009, 1033, -1, - 1033, 1009, 1010, 1034, -1, - 1034, 1010, 1011, 1035, -1, - 1035, 1011, 1012, 1036, -1, - 1036, 1012, 1013, 1037, -1, - 1037, 1013, 1014, 1038, -1, - 1038, 1014, 1015, 1039, -1, - 1039, 1015, 1016, 1040, -1, - 1040, 1016, 1017, 1041, -1, - 1041, 1017, 1018, 1042, -1, - 1042, 1018, 1019, 1043, -1, - 1043, 1019, 1020, 1044, -1, - 1044, 1020, 1021, 1045, -1, - 1045, 1021, 1022, 1046, -1, - 1046, 1022, 1023, 1047, -1, - 1047, 1023, 1024, 1048, -1, - 1048, 1024, 1025, 1049, -1, - 1049, 1025, 1026, 1050, -1, - 1050, 1026, 1027, 1051, -1, - 1051, 1027, 1028, 1052, -1, - 1052, 1028, 1029, 1053, -1, - 1053, 1029, 1030, 1054, -1, - 1054, 1030, 1031, 1055, -1, - 1055, 1031, 1008, 1032, -1, - 1056, 1032, 1033, 1057, -1, - 1057, 1033, 1034, 1058, -1, - 1058, 1034, 1035, 1059, -1, - 1059, 1035, 1036, 1060, -1, - 1060, 1036, 1037, 1061, -1, - 1061, 1037, 1038, 1062, -1, - 1062, 1038, 1039, 1063, -1, - 1063, 1039, 1040, 1064, -1, - 1064, 1040, 1041, 1065, -1, - 1065, 1041, 1042, 1066, -1, - 1066, 1042, 1043, 1067, -1, - 1067, 1043, 1044, 1068, -1, - 1068, 1044, 1045, 1069, -1, - 1069, 1045, 1046, 1070, -1, - 1070, 1046, 1047, 1071, -1, - 1071, 1047, 1048, 1072, -1, - 1072, 1048, 1049, 1073, -1, - 1073, 1049, 1050, 1074, -1, - 1074, 1050, 1051, 1075, -1, - 1075, 1051, 1052, 1076, -1, - 1076, 1052, 1053, 1077, -1, - 1077, 1053, 1054, 1078, -1, - 1078, 1054, 1055, 1079, -1, - 1079, 1055, 1032, 1056, -1, - 1080, 1056, 1057, 1081, -1, - 1081, 1057, 1058, 1082, -1, - 1082, 1058, 1059, 1083, -1, - 1083, 1059, 1060, 1084, -1, - 1084, 1060, 1061, 1085, -1, - 1085, 1061, 1062, 1086, -1, - 1086, 1062, 1063, 1087, -1, - 1087, 1063, 1064, 1088, -1, - 1088, 1064, 1065, 1089, -1, - 1089, 1065, 1066, 1090, -1, - 1090, 1066, 1067, 1091, -1, - 1091, 1067, 1068, 1092, -1, - 1092, 1068, 1069, 1093, -1, - 1093, 1069, 1070, 1094, -1, - 1094, 1070, 1071, 1095, -1, - 1095, 1071, 1072, 1096, -1, - 1096, 1072, 1073, 1097, -1, - 1097, 1073, 1074, 1098, -1, - 1098, 1074, 1075, 1099, -1, - 1099, 1075, 1076, 1100, -1, - 1100, 1076, 1077, 1101, -1, - 1101, 1077, 1078, 1102, -1, - 1102, 1078, 1079, 1103, -1, - 1103, 1079, 1056, 1080, -1, - 1104, 1080, 1081, 1105, -1, - 1105, 1081, 1082, 1106, -1, - 1106, 1082, 1083, 1107, -1, - 1107, 1083, 1084, 1108, -1, - 1108, 1084, 1085, 1109, -1, - 1109, 1085, 1086, 1110, -1, - 1110, 1086, 1087, 1111, -1, - 1111, 1087, 1088, 1112, -1, - 1112, 1088, 1089, 1113, -1, - 1113, 1089, 1090, 1114, -1, - 1114, 1090, 1091, 1115, -1, - 1115, 1091, 1092, 1116, -1, - 1116, 1092, 1093, 1117, -1, - 1117, 1093, 1094, 1118, -1, - 1118, 1094, 1095, 1119, -1, - 1119, 1095, 1096, 1120, -1, - 1120, 1096, 1097, 1121, -1, - 1121, 1097, 1098, 1122, -1, - 1122, 1098, 1099, 1123, -1, - 1123, 1099, 1100, 1124, -1, - 1124, 1100, 1101, 1125, -1, - 1125, 1101, 1102, 1126, -1, - 1126, 1102, 1103, 1127, -1, - 1127, 1103, 1080, 1104, -1, - 1128, 1104, 1105, 1129, -1, - 1129, 1105, 1106, 1130, -1, - 1130, 1106, 1107, 1131, -1, - 1131, 1107, 1108, 1132, -1, - 1132, 1108, 1109, 1133, -1, - 1133, 1109, 1110, 1134, -1, - 1134, 1110, 1111, 1135, -1, - 1135, 1111, 1112, 1136, -1, - 1136, 1112, 1113, 1137, -1, - 1137, 1113, 1114, 1138, -1, - 1138, 1114, 1115, 1139, -1, - 1139, 1115, 1116, 1140, -1, - 1140, 1116, 1117, 1141, -1, - 1141, 1117, 1118, 1142, -1, - 1142, 1118, 1119, 1143, -1, - 1143, 1119, 1120, 1144, -1, - 1144, 1120, 1121, 1145, -1, - 1145, 1121, 1122, 1146, -1, - 1146, 1122, 1123, 1147, -1, - 1147, 1123, 1124, 1148, -1, - 1148, 1124, 1125, 1149, -1, - 1149, 1125, 1126, 1150, -1, - 1150, 1126, 1127, 1151, -1, - 1151, 1127, 1104, 1128, -1, - 576, 0, 1, 577, -1, - 577, 1, 2, 578, -1, - 578, 2, 3, 579, -1, - 579, 3, 4, 580, -1, - 580, 4, 5, 581, -1, - 581, 5, 6, 582, -1, - 582, 6, 7, 583, -1, - 583, 7, 8, 584, -1, - 584, 8, 9, 585, -1, - 585, 9, 10, 586, -1, - 586, 10, 11, 587, -1, - 587, 11, 12, 588, -1, - 588, 12, 13, 589, -1, - 589, 13, 14, 590, -1, - 590, 14, 15, 591, -1, - 591, 15, 16, 592, -1, - 592, 16, 17, 593, -1, - 593, 17, 18, 594, -1, - 594, 18, 19, 595, -1, - 595, 19, 20, 596, -1, - 596, 20, 21, 597, -1, - 597, 21, 22, 598, -1, - 598, 22, 23, 599, -1, - 599, 23, 0, 576, -1, - 552, 1128, 1129, 553, -1, - 553, 1129, 1130, 554, -1, - 554, 1130, 1131, 555, -1, - 555, 1131, 1132, 556, -1, - 556, 1132, 1133, 557, -1, - 557, 1133, 1134, 558, -1, - 558, 1134, 1135, 559, -1, - 559, 1135, 1136, 560, -1, - 560, 1136, 1137, 561, -1, - 561, 1137, 1138, 562, -1, - 562, 1138, 1139, 563, -1, - 563, 1139, 1140, 564, -1, - 564, 1140, 1141, 565, -1, - 565, 1141, 1142, 566, -1, - 566, 1142, 1143, 567, -1, - 567, 1143, 1144, 568, -1, - 568, 1144, 1145, 569, -1, - 569, 1145, 1146, 570, -1, - 570, 1146, 1147, 571, -1, - 571, 1147, 1148, 572, -1, - 572, 1148, 1149, 573, -1, - 573, 1149, 1150, 574, -1, - 574, 1150, 1151, 575, -1, - 575, 1151, 1128, 552, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4orb.wrl b/environments/g4py/tests/gtest05/vrml/g4orb.wrl deleted file mode 100644 index b4961d1be8..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4orb.wrl +++ /dev/null @@ -1,643 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 0 0 1000, - 258.819 0 965.926, - 250 66.9873 965.926, - 224.144 129.41 965.926, - 183.013 183.013 965.926, - 129.41 224.144 965.926, - 66.9873 250 965.926, - 1.58481e-14 258.819 965.926, - -66.9873 250 965.926, - -129.41 224.144 965.926, - -183.013 183.013 965.926, - -224.144 129.41 965.926, - -250 66.9873 965.926, - -258.819 3.16962e-14 965.926, - -250 -66.9873 965.926, - -224.144 -129.41 965.926, - -183.013 -183.013 965.926, - -129.41 -224.144 965.926, - -66.9873 -250 965.926, - -4.75443e-14 -258.819 965.926, - 66.9873 -250 965.926, - 129.41 -224.144 965.926, - 183.013 -183.013 965.926, - 224.144 -129.41 965.926, - 250 -66.9873 965.926, - 500 0 866.025, - 482.963 129.41 866.025, - 433.013 250 866.025, - 353.553 353.553 866.025, - 250 433.013 866.025, - 129.41 482.963 866.025, - 3.06162e-14 500 866.025, - -129.41 482.963 866.025, - -250 433.013 866.025, - -353.553 353.553 866.025, - -433.013 250 866.025, - -482.963 129.41 866.025, - -500 6.12323e-14 866.025, - -482.963 -129.41 866.025, - -433.013 -250 866.025, - -353.553 -353.553 866.025, - -250 -433.013 866.025, - -129.41 -482.963 866.025, - -9.18485e-14 -500 866.025, - 129.41 -482.963 866.025, - 250 -433.013 866.025, - 353.553 -353.553 866.025, - 433.013 -250 866.025, - 482.963 -129.41 866.025, - 707.107 0 707.107, - 683.013 183.013 707.107, - 612.372 353.553 707.107, - 500 500 707.107, - 353.553 612.372 707.107, - 183.013 683.013 707.107, - 4.32978e-14 707.107 707.107, - -183.013 683.013 707.107, - -353.553 612.372 707.107, - -500 500 707.107, - -612.372 353.553 707.107, - -683.013 183.013 707.107, - -707.107 8.65956e-14 707.107, - -683.013 -183.013 707.107, - -612.372 -353.553 707.107, - -500 -500 707.107, - -353.553 -612.372 707.107, - -183.013 -683.013 707.107, - -1.29893e-13 -707.107 707.107, - 183.013 -683.013 707.107, - 353.553 -612.372 707.107, - 500 -500 707.107, - 612.372 -353.553 707.107, - 683.013 -183.013 707.107, - 866.025 0 500, - 836.516 224.144 500, - 750 433.013 500, - 612.372 612.372 500, - 433.013 750 500, - 224.144 836.516 500, - 5.30288e-14 866.025 500, - -224.144 836.516 500, - -433.013 750 500, - -612.372 612.372 500, - -750 433.013 500, - -836.516 224.144 500, - -866.025 1.06058e-13 500, - -836.516 -224.144 500, - -750 -433.013 500, - -612.372 -612.372 500, - -433.013 -750 500, - -224.144 -836.516 500, - -1.59086e-13 -866.025 500, - 224.144 -836.516 500, - 433.013 -750 500, - 612.372 -612.372 500, - 750 -433.013 500, - 836.516 -224.144 500, - 965.926 0 258.819, - 933.013 250 258.819, - 836.516 482.963 258.819, - 683.013 683.013 258.819, - 482.963 836.516 258.819, - 250 933.013 258.819, - 5.91459e-14 965.926 258.819, - -250 933.013 258.819, - -482.963 836.516 258.819, - -683.013 683.013 258.819, - -836.516 482.963 258.819, - -933.013 250 258.819, - -965.926 1.18292e-13 258.819, - -933.013 -250 258.819, - -836.516 -482.963 258.819, - -683.013 -683.013 258.819, - -482.963 -836.516 258.819, - -250 -933.013 258.819, - -1.77438e-13 -965.926 258.819, - 250 -933.013 258.819, - 482.963 -836.516 258.819, - 683.013 -683.013 258.819, - 836.516 -482.963 258.819, - 933.013 -250 258.819, - 1000 0 6.12323e-14, - 965.926 258.819 6.12323e-14, - 866.025 500 6.12323e-14, - 707.107 707.107 6.12323e-14, - 500 866.025 6.12323e-14, - 258.819 965.926 6.12323e-14, - 6.12323e-14 1000 6.12323e-14, - -258.819 965.926 6.12323e-14, - -500 866.025 6.12323e-14, - -707.107 707.107 6.12323e-14, - -866.025 500 6.12323e-14, - -965.926 258.819 6.12323e-14, - -1000 1.22465e-13 6.12323e-14, - -965.926 -258.819 6.12323e-14, - -866.025 -500 6.12323e-14, - -707.107 -707.107 6.12323e-14, - -500 -866.025 6.12323e-14, - -258.819 -965.926 6.12323e-14, - -1.83697e-13 -1000 6.12323e-14, - 258.819 -965.926 6.12323e-14, - 500 -866.025 6.12323e-14, - 707.107 -707.107 6.12323e-14, - 866.025 -500 6.12323e-14, - 965.926 -258.819 6.12323e-14, - 965.926 0 -258.819, - 933.013 250 -258.819, - 836.516 482.963 -258.819, - 683.013 683.013 -258.819, - 482.963 836.516 -258.819, - 250 933.013 -258.819, - 5.91459e-14 965.926 -258.819, - -250 933.013 -258.819, - -482.963 836.516 -258.819, - -683.013 683.013 -258.819, - -836.516 482.963 -258.819, - -933.013 250 -258.819, - -965.926 1.18292e-13 -258.819, - -933.013 -250 -258.819, - -836.516 -482.963 -258.819, - -683.013 -683.013 -258.819, - -482.963 -836.516 -258.819, - -250 -933.013 -258.819, - -1.77438e-13 -965.926 -258.819, - 250 -933.013 -258.819, - 482.963 -836.516 -258.819, - 683.013 -683.013 -258.819, - 836.516 -482.963 -258.819, - 933.013 -250 -258.819, - 866.025 0 -500, - 836.516 224.144 -500, - 750 433.013 -500, - 612.372 612.372 -500, - 433.013 750 -500, - 224.144 836.516 -500, - 5.30288e-14 866.025 -500, - -224.144 836.516 -500, - -433.013 750 -500, - -612.372 612.372 -500, - -750 433.013 -500, - -836.516 224.144 -500, - -866.025 1.06058e-13 -500, - -836.516 -224.144 -500, - -750 -433.013 -500, - -612.372 -612.372 -500, - -433.013 -750 -500, - -224.144 -836.516 -500, - -1.59086e-13 -866.025 -500, - 224.144 -836.516 -500, - 433.013 -750 -500, - 612.372 -612.372 -500, - 750 -433.013 -500, - 836.516 -224.144 -500, - 707.107 0 -707.107, - 683.013 183.013 -707.107, - 612.372 353.553 -707.107, - 500 500 -707.107, - 353.553 612.372 -707.107, - 183.013 683.013 -707.107, - 4.32978e-14 707.107 -707.107, - -183.013 683.013 -707.107, - -353.553 612.372 -707.107, - -500 500 -707.107, - -612.372 353.553 -707.107, - -683.013 183.013 -707.107, - -707.107 8.65956e-14 -707.107, - -683.013 -183.013 -707.107, - -612.372 -353.553 -707.107, - -500 -500 -707.107, - -353.553 -612.372 -707.107, - -183.013 -683.013 -707.107, - -1.29893e-13 -707.107 -707.107, - 183.013 -683.013 -707.107, - 353.553 -612.372 -707.107, - 500 -500 -707.107, - 612.372 -353.553 -707.107, - 683.013 -183.013 -707.107, - 500 0 -866.025, - 482.963 129.41 -866.025, - 433.013 250 -866.025, - 353.553 353.553 -866.025, - 250 433.013 -866.025, - 129.41 482.963 -866.025, - 3.06162e-14 500 -866.025, - -129.41 482.963 -866.025, - -250 433.013 -866.025, - -353.553 353.553 -866.025, - -433.013 250 -866.025, - -482.963 129.41 -866.025, - -500 6.12323e-14 -866.025, - -482.963 -129.41 -866.025, - -433.013 -250 -866.025, - -353.553 -353.553 -866.025, - -250 -433.013 -866.025, - -129.41 -482.963 -866.025, - -9.18485e-14 -500 -866.025, - 129.41 -482.963 -866.025, - 250 -433.013 -866.025, - 353.553 -353.553 -866.025, - 433.013 -250 -866.025, - 482.963 -129.41 -866.025, - 258.819 0 -965.926, - 250 66.9873 -965.926, - 224.144 129.41 -965.926, - 183.013 183.013 -965.926, - 129.41 224.144 -965.926, - 66.9873 250 -965.926, - 1.58481e-14 258.819 -965.926, - -66.9873 250 -965.926, - -129.41 224.144 -965.926, - -183.013 183.013 -965.926, - -224.144 129.41 -965.926, - -250 66.9873 -965.926, - -258.819 3.16962e-14 -965.926, - -250 -66.9873 -965.926, - -224.144 -129.41 -965.926, - -183.013 -183.013 -965.926, - -129.41 -224.144 -965.926, - -66.9873 -250 -965.926, - -4.75443e-14 -258.819 -965.926, - 66.9873 -250 -965.926, - 129.41 -224.144 -965.926, - 183.013 -183.013 -965.926, - 224.144 -129.41 -965.926, - 250 -66.9873 -965.926, - 0 0 -1000, - 0 0 0, - ] - } - coordIndex [ - 0, 1, 2, -1, - 0, 2, 3, -1, - 0, 3, 4, -1, - 0, 4, 5, -1, - 0, 5, 6, -1, - 0, 6, 7, -1, - 0, 7, 8, -1, - 0, 8, 9, -1, - 0, 9, 10, -1, - 0, 10, 11, -1, - 0, 11, 12, -1, - 0, 12, 13, -1, - 0, 13, 14, -1, - 0, 14, 15, -1, - 0, 15, 16, -1, - 0, 16, 17, -1, - 0, 17, 18, -1, - 0, 18, 19, -1, - 0, 19, 20, -1, - 0, 20, 21, -1, - 0, 21, 22, -1, - 0, 22, 23, -1, - 0, 23, 24, -1, - 0, 24, 1, -1, - 1, 25, 26, 2, -1, - 2, 26, 27, 3, -1, - 3, 27, 28, 4, -1, - 4, 28, 29, 5, -1, - 5, 29, 30, 6, -1, - 6, 30, 31, 7, -1, - 7, 31, 32, 8, -1, - 8, 32, 33, 9, -1, - 9, 33, 34, 10, -1, - 10, 34, 35, 11, -1, - 11, 35, 36, 12, -1, - 12, 36, 37, 13, -1, - 13, 37, 38, 14, -1, - 14, 38, 39, 15, -1, - 15, 39, 40, 16, -1, - 16, 40, 41, 17, -1, - 17, 41, 42, 18, -1, - 18, 42, 43, 19, -1, - 19, 43, 44, 20, -1, - 20, 44, 45, 21, -1, - 21, 45, 46, 22, -1, - 22, 46, 47, 23, -1, - 23, 47, 48, 24, -1, - 24, 48, 25, 1, -1, - 25, 49, 50, 26, -1, - 26, 50, 51, 27, -1, - 27, 51, 52, 28, -1, - 28, 52, 53, 29, -1, - 29, 53, 54, 30, -1, - 30, 54, 55, 31, -1, - 31, 55, 56, 32, -1, - 32, 56, 57, 33, -1, - 33, 57, 58, 34, -1, - 34, 58, 59, 35, -1, - 35, 59, 60, 36, -1, - 36, 60, 61, 37, -1, - 37, 61, 62, 38, -1, - 38, 62, 63, 39, -1, - 39, 63, 64, 40, -1, - 40, 64, 65, 41, -1, - 41, 65, 66, 42, -1, - 42, 66, 67, 43, -1, - 43, 67, 68, 44, -1, - 44, 68, 69, 45, -1, - 45, 69, 70, 46, -1, - 46, 70, 71, 47, -1, - 47, 71, 72, 48, -1, - 48, 72, 49, 25, -1, - 49, 73, 74, 50, -1, - 50, 74, 75, 51, -1, - 51, 75, 76, 52, -1, - 52, 76, 77, 53, -1, - 53, 77, 78, 54, -1, - 54, 78, 79, 55, -1, - 55, 79, 80, 56, -1, - 56, 80, 81, 57, -1, - 57, 81, 82, 58, -1, - 58, 82, 83, 59, -1, - 59, 83, 84, 60, -1, - 60, 84, 85, 61, -1, - 61, 85, 86, 62, -1, - 62, 86, 87, 63, -1, - 63, 87, 88, 64, -1, - 64, 88, 89, 65, -1, - 65, 89, 90, 66, -1, - 66, 90, 91, 67, -1, - 67, 91, 92, 68, -1, - 68, 92, 93, 69, -1, - 69, 93, 94, 70, -1, - 70, 94, 95, 71, -1, - 71, 95, 96, 72, -1, - 72, 96, 73, 49, -1, - 73, 97, 98, 74, -1, - 74, 98, 99, 75, -1, - 75, 99, 100, 76, -1, - 76, 100, 101, 77, -1, - 77, 101, 102, 78, -1, - 78, 102, 103, 79, -1, - 79, 103, 104, 80, -1, - 80, 104, 105, 81, -1, - 81, 105, 106, 82, -1, - 82, 106, 107, 83, -1, - 83, 107, 108, 84, -1, - 84, 108, 109, 85, -1, - 85, 109, 110, 86, -1, - 86, 110, 111, 87, -1, - 87, 111, 112, 88, -1, - 88, 112, 113, 89, -1, - 89, 113, 114, 90, -1, - 90, 114, 115, 91, -1, - 91, 115, 116, 92, -1, - 92, 116, 117, 93, -1, - 93, 117, 118, 94, -1, - 94, 118, 119, 95, -1, - 95, 119, 120, 96, -1, - 96, 120, 97, 73, -1, - 97, 121, 122, 98, -1, - 98, 122, 123, 99, -1, - 99, 123, 124, 100, -1, - 100, 124, 125, 101, -1, - 101, 125, 126, 102, -1, - 102, 126, 127, 103, -1, - 103, 127, 128, 104, -1, - 104, 128, 129, 105, -1, - 105, 129, 130, 106, -1, - 106, 130, 131, 107, -1, - 107, 131, 132, 108, -1, - 108, 132, 133, 109, -1, - 109, 133, 134, 110, -1, - 110, 134, 135, 111, -1, - 111, 135, 136, 112, -1, - 112, 136, 137, 113, -1, - 113, 137, 138, 114, -1, - 114, 138, 139, 115, -1, - 115, 139, 140, 116, -1, - 116, 140, 141, 117, -1, - 117, 141, 142, 118, -1, - 118, 142, 143, 119, -1, - 119, 143, 144, 120, -1, - 120, 144, 121, 97, -1, - 121, 145, 146, 122, -1, - 122, 146, 147, 123, -1, - 123, 147, 148, 124, -1, - 124, 148, 149, 125, -1, - 125, 149, 150, 126, -1, - 126, 150, 151, 127, -1, - 127, 151, 152, 128, -1, - 128, 152, 153, 129, -1, - 129, 153, 154, 130, -1, - 130, 154, 155, 131, -1, - 131, 155, 156, 132, -1, - 132, 156, 157, 133, -1, - 133, 157, 158, 134, -1, - 134, 158, 159, 135, -1, - 135, 159, 160, 136, -1, - 136, 160, 161, 137, -1, - 137, 161, 162, 138, -1, - 138, 162, 163, 139, -1, - 139, 163, 164, 140, -1, - 140, 164, 165, 141, -1, - 141, 165, 166, 142, -1, - 142, 166, 167, 143, -1, - 143, 167, 168, 144, -1, - 144, 168, 145, 121, -1, - 145, 169, 170, 146, -1, - 146, 170, 171, 147, -1, - 147, 171, 172, 148, -1, - 148, 172, 173, 149, -1, - 149, 173, 174, 150, -1, - 150, 174, 175, 151, -1, - 151, 175, 176, 152, -1, - 152, 176, 177, 153, -1, - 153, 177, 178, 154, -1, - 154, 178, 179, 155, -1, - 155, 179, 180, 156, -1, - 156, 180, 181, 157, -1, - 157, 181, 182, 158, -1, - 158, 182, 183, 159, -1, - 159, 183, 184, 160, -1, - 160, 184, 185, 161, -1, - 161, 185, 186, 162, -1, - 162, 186, 187, 163, -1, - 163, 187, 188, 164, -1, - 164, 188, 189, 165, -1, - 165, 189, 190, 166, -1, - 166, 190, 191, 167, -1, - 167, 191, 192, 168, -1, - 168, 192, 169, 145, -1, - 169, 193, 194, 170, -1, - 170, 194, 195, 171, -1, - 171, 195, 196, 172, -1, - 172, 196, 197, 173, -1, - 173, 197, 198, 174, -1, - 174, 198, 199, 175, -1, - 175, 199, 200, 176, -1, - 176, 200, 201, 177, -1, - 177, 201, 202, 178, -1, - 178, 202, 203, 179, -1, - 179, 203, 204, 180, -1, - 180, 204, 205, 181, -1, - 181, 205, 206, 182, -1, - 182, 206, 207, 183, -1, - 183, 207, 208, 184, -1, - 184, 208, 209, 185, -1, - 185, 209, 210, 186, -1, - 186, 210, 211, 187, -1, - 187, 211, 212, 188, -1, - 188, 212, 213, 189, -1, - 189, 213, 214, 190, -1, - 190, 214, 215, 191, -1, - 191, 215, 216, 192, -1, - 192, 216, 193, 169, -1, - 193, 217, 218, 194, -1, - 194, 218, 219, 195, -1, - 195, 219, 220, 196, -1, - 196, 220, 221, 197, -1, - 197, 221, 222, 198, -1, - 198, 222, 223, 199, -1, - 199, 223, 224, 200, -1, - 200, 224, 225, 201, -1, - 201, 225, 226, 202, -1, - 202, 226, 227, 203, -1, - 203, 227, 228, 204, -1, - 204, 228, 229, 205, -1, - 205, 229, 230, 206, -1, - 206, 230, 231, 207, -1, - 207, 231, 232, 208, -1, - 208, 232, 233, 209, -1, - 209, 233, 234, 210, -1, - 210, 234, 235, 211, -1, - 211, 235, 236, 212, -1, - 212, 236, 237, 213, -1, - 213, 237, 238, 214, -1, - 214, 238, 239, 215, -1, - 215, 239, 240, 216, -1, - 216, 240, 217, 193, -1, - 217, 241, 242, 218, -1, - 218, 242, 243, 219, -1, - 219, 243, 244, 220, -1, - 220, 244, 245, 221, -1, - 221, 245, 246, 222, -1, - 222, 246, 247, 223, -1, - 223, 247, 248, 224, -1, - 224, 248, 249, 225, -1, - 225, 249, 250, 226, -1, - 226, 250, 251, 227, -1, - 227, 251, 252, 228, -1, - 228, 252, 253, 229, -1, - 229, 253, 254, 230, -1, - 230, 254, 255, 231, -1, - 231, 255, 256, 232, -1, - 232, 256, 257, 233, -1, - 233, 257, 258, 234, -1, - 234, 258, 259, 235, -1, - 235, 259, 260, 236, -1, - 236, 260, 261, 237, -1, - 237, 261, 262, 238, -1, - 238, 262, 263, 239, -1, - 239, 263, 264, 240, -1, - 240, 264, 241, 217, -1, - 241, 265, 242, -1, - 242, 265, 243, -1, - 243, 265, 244, -1, - 244, 265, 245, -1, - 245, 265, 246, -1, - 246, 265, 247, -1, - 247, 265, 248, -1, - 248, 265, 249, -1, - 249, 265, 250, -1, - 250, 265, 251, -1, - 251, 265, 252, -1, - 252, 265, 253, -1, - 253, 265, 254, -1, - 254, 265, 255, -1, - 255, 265, 256, -1, - 256, 265, 257, -1, - 257, 265, 258, -1, - 258, 265, 259, -1, - 259, 265, 260, -1, - 260, 265, 261, -1, - 261, 265, 262, -1, - 262, 265, 263, -1, - 263, 265, 264, -1, - 264, 265, 241, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4para.wrl b/environments/g4py/tests/gtest05/vrml/g4para.wrl deleted file mode 100644 index 1fcf6d556e..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4para.wrl +++ /dev/null @@ -1,102 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - -948.528 -400 -600, - -348.528 -400 -600, - 451.472 400 -600, - -148.528 400 -600, - -451.472 -400 600, - 148.528 -400 600, - 948.528 400 600, - 348.528 400 600, - ] - } - coordIndex [ - 0, 3, 2, 1, -1, - 4, 7, 3, 0, -1, - 7, 6, 2, 3, -1, - 6, 5, 1, 2, -1, - 5, 4, 0, 1, -1, - 4, 5, 6, 7, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4polycone.wrl b/environments/g4py/tests/gtest05/vrml/g4polycone.wrl deleted file mode 100644 index 494fe6e448..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4polycone.wrl +++ /dev/null @@ -1,505 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 20 0 350, - 19.3185 5.17638 350, - 17.3205 10 350, - 14.1421 14.1421 350, - 10 17.3205 350, - 5.17638 19.3185 350, - 1.22465e-15 20 350, - -5.17638 19.3185 350, - -10 17.3205 350, - -14.1421 14.1421 350, - -17.3205 10 350, - -19.3185 5.17638 350, - -20 2.44929e-15 350, - -19.3185 -5.17638 350, - -17.3205 -10 350, - -14.1421 -14.1421 350, - -10 -17.3205 350, - -5.17638 -19.3185 350, - -3.67394e-15 -20 350, - 5.17638 -19.3185 350, - 10 -17.3205 350, - 14.1421 -14.1421 350, - 17.3205 -10 350, - 19.3185 -5.17638 350, - 20 0 310, - 19.3185 5.17638 310, - 17.3205 10 310, - 14.1421 14.1421 310, - 10 17.3205 310, - 5.17638 19.3185 310, - 1.22465e-15 20 310, - -5.17638 19.3185 310, - -10 17.3205 310, - -14.1421 14.1421 310, - -17.3205 10 310, - -19.3185 5.17638 310, - -20 2.44929e-15 310, - -19.3185 -5.17638 310, - -17.3205 -10 310, - -14.1421 -14.1421 310, - -10 -17.3205 310, - -5.17638 -19.3185 310, - -3.67394e-15 -20 310, - 5.17638 -19.3185 310, - 10 -17.3205 310, - 14.1421 -14.1421 310, - 17.3205 -10 310, - 19.3185 -5.17638 310, - 100 0 290, - 96.5926 25.8819 290, - 86.6025 50 290, - 70.7107 70.7107 290, - 50 86.6025 290, - 25.8819 96.5926 290, - 6.12323e-15 100 290, - -25.8819 96.5926 290, - -50 86.6025 290, - -70.7107 70.7107 290, - -86.6025 50 290, - -96.5926 25.8819 290, - -100 1.22465e-14 290, - -96.5926 -25.8819 290, - -86.6025 -50 290, - -70.7107 -70.7107 290, - -50 -86.6025 290, - -25.8819 -96.5926 290, - -1.83697e-14 -100 290, - 25.8819 -96.5926 290, - 50 -86.6025 290, - 70.7107 -70.7107 290, - 86.6025 -50 290, - 96.5926 -25.8819 290, - 100 0 270, - 96.5926 25.8819 270, - 86.6025 50 270, - 70.7107 70.7107 270, - 50 86.6025 270, - 25.8819 96.5926 270, - 6.12323e-15 100 270, - -25.8819 96.5926 270, - -50 86.6025 270, - -70.7107 70.7107 270, - -86.6025 50 270, - -96.5926 25.8819 270, - -100 1.22465e-14 270, - -96.5926 -25.8819 270, - -86.6025 -50 270, - -70.7107 -70.7107 270, - -50 -86.6025 270, - -25.8819 -96.5926 270, - -1.83697e-14 -100 270, - 25.8819 -96.5926 270, - 50 -86.6025 270, - 70.7107 -70.7107 270, - 86.6025 -50 270, - 96.5926 -25.8819 270, - 50 0 250, - 48.2963 12.941 250, - 43.3013 25 250, - 35.3553 35.3553 250, - 25 43.3013 250, - 12.941 48.2963 250, - 3.06162e-15 50 250, - -12.941 48.2963 250, - -25 43.3013 250, - -35.3553 35.3553 250, - -43.3013 25 250, - -48.2963 12.941 250, - -50 6.12323e-15 250, - -48.2963 -12.941 250, - -43.3013 -25 250, - -35.3553 -35.3553 250, - -25 -43.3013 250, - -12.941 -48.2963 250, - -9.18485e-15 -50 250, - 12.941 -48.2963 250, - 25 -43.3013 250, - 35.3553 -35.3553 250, - 43.3013 -25 250, - 48.2963 -12.941 250, - 50 0 110, - 48.2963 12.941 110, - 43.3013 25 110, - 35.3553 35.3553 110, - 25 43.3013 110, - 12.941 48.2963 110, - 3.06162e-15 50 110, - -12.941 48.2963 110, - -25 43.3013 110, - -35.3553 35.3553 110, - -43.3013 25 110, - -48.2963 12.941 110, - -50 6.12323e-15 110, - -48.2963 -12.941 110, - -43.3013 -25 110, - -35.3553 -35.3553 110, - -25 -43.3013 110, - -12.941 -48.2963 110, - -9.18485e-15 -50 110, - 12.941 -48.2963 110, - 25 -43.3013 110, - 35.3553 -35.3553 110, - 43.3013 -25 110, - 48.2963 -12.941 110, - 100 0 90, - 96.5926 25.8819 90, - 86.6025 50 90, - 70.7107 70.7107 90, - 50 86.6025 90, - 25.8819 96.5926 90, - 6.12323e-15 100 90, - -25.8819 96.5926 90, - -50 86.6025 90, - -70.7107 70.7107 90, - -86.6025 50 90, - -96.5926 25.8819 90, - -100 1.22465e-14 90, - -96.5926 -25.8819 90, - -86.6025 -50 90, - -70.7107 -70.7107 90, - -50 -86.6025 90, - -25.8819 -96.5926 90, - -1.83697e-14 -100 90, - 25.8819 -96.5926 90, - 50 -86.6025 90, - 70.7107 -70.7107 90, - 86.6025 -50 90, - 96.5926 -25.8819 90, - 100 0 70, - 96.5926 25.8819 70, - 86.6025 50 70, - 70.7107 70.7107 70, - 50 86.6025 70, - 25.8819 96.5926 70, - 6.12323e-15 100 70, - -25.8819 96.5926 70, - -50 86.6025 70, - -70.7107 70.7107 70, - -86.6025 50 70, - -96.5926 25.8819 70, - -100 1.22465e-14 70, - -96.5926 -25.8819 70, - -86.6025 -50 70, - -70.7107 -70.7107 70, - -50 -86.6025 70, - -25.8819 -96.5926 70, - -1.83697e-14 -100 70, - 25.8819 -96.5926 70, - 50 -86.6025 70, - 70.7107 -70.7107 70, - 86.6025 -50 70, - 96.5926 -25.8819 70, - 0 0 50, - 0 0 350, - 0 0 310, - 0 0 290, - 0 0 270, - 0 0 250, - 0 0 110, - 0 0 90, - 0 0 70, - ] - } - coordIndex [ - 0, 24, 25, 1, -1, - 1, 25, 26, 2, -1, - 2, 26, 27, 3, -1, - 3, 27, 28, 4, -1, - 4, 28, 29, 5, -1, - 5, 29, 30, 6, -1, - 6, 30, 31, 7, -1, - 7, 31, 32, 8, -1, - 8, 32, 33, 9, -1, - 9, 33, 34, 10, -1, - 10, 34, 35, 11, -1, - 11, 35, 36, 12, -1, - 12, 36, 37, 13, -1, - 13, 37, 38, 14, -1, - 14, 38, 39, 15, -1, - 15, 39, 40, 16, -1, - 16, 40, 41, 17, -1, - 17, 41, 42, 18, -1, - 18, 42, 43, 19, -1, - 19, 43, 44, 20, -1, - 20, 44, 45, 21, -1, - 21, 45, 46, 22, -1, - 22, 46, 47, 23, -1, - 23, 47, 24, 0, -1, - 24, 48, 49, 25, -1, - 25, 49, 50, 26, -1, - 26, 50, 51, 27, -1, - 27, 51, 52, 28, -1, - 28, 52, 53, 29, -1, - 29, 53, 54, 30, -1, - 30, 54, 55, 31, -1, - 31, 55, 56, 32, -1, - 32, 56, 57, 33, -1, - 33, 57, 58, 34, -1, - 34, 58, 59, 35, -1, - 35, 59, 60, 36, -1, - 36, 60, 61, 37, -1, - 37, 61, 62, 38, -1, - 38, 62, 63, 39, -1, - 39, 63, 64, 40, -1, - 40, 64, 65, 41, -1, - 41, 65, 66, 42, -1, - 42, 66, 67, 43, -1, - 43, 67, 68, 44, -1, - 44, 68, 69, 45, -1, - 45, 69, 70, 46, -1, - 46, 70, 71, 47, -1, - 47, 71, 48, 24, -1, - 48, 72, 73, 49, -1, - 49, 73, 74, 50, -1, - 50, 74, 75, 51, -1, - 51, 75, 76, 52, -1, - 52, 76, 77, 53, -1, - 53, 77, 78, 54, -1, - 54, 78, 79, 55, -1, - 55, 79, 80, 56, -1, - 56, 80, 81, 57, -1, - 57, 81, 82, 58, -1, - 58, 82, 83, 59, -1, - 59, 83, 84, 60, -1, - 60, 84, 85, 61, -1, - 61, 85, 86, 62, -1, - 62, 86, 87, 63, -1, - 63, 87, 88, 64, -1, - 64, 88, 89, 65, -1, - 65, 89, 90, 66, -1, - 66, 90, 91, 67, -1, - 67, 91, 92, 68, -1, - 68, 92, 93, 69, -1, - 69, 93, 94, 70, -1, - 70, 94, 95, 71, -1, - 71, 95, 72, 48, -1, - 72, 96, 97, 73, -1, - 73, 97, 98, 74, -1, - 74, 98, 99, 75, -1, - 75, 99, 100, 76, -1, - 76, 100, 101, 77, -1, - 77, 101, 102, 78, -1, - 78, 102, 103, 79, -1, - 79, 103, 104, 80, -1, - 80, 104, 105, 81, -1, - 81, 105, 106, 82, -1, - 82, 106, 107, 83, -1, - 83, 107, 108, 84, -1, - 84, 108, 109, 85, -1, - 85, 109, 110, 86, -1, - 86, 110, 111, 87, -1, - 87, 111, 112, 88, -1, - 88, 112, 113, 89, -1, - 89, 113, 114, 90, -1, - 90, 114, 115, 91, -1, - 91, 115, 116, 92, -1, - 92, 116, 117, 93, -1, - 93, 117, 118, 94, -1, - 94, 118, 119, 95, -1, - 95, 119, 96, 72, -1, - 96, 120, 121, 97, -1, - 97, 121, 122, 98, -1, - 98, 122, 123, 99, -1, - 99, 123, 124, 100, -1, - 100, 124, 125, 101, -1, - 101, 125, 126, 102, -1, - 102, 126, 127, 103, -1, - 103, 127, 128, 104, -1, - 104, 128, 129, 105, -1, - 105, 129, 130, 106, -1, - 106, 130, 131, 107, -1, - 107, 131, 132, 108, -1, - 108, 132, 133, 109, -1, - 109, 133, 134, 110, -1, - 110, 134, 135, 111, -1, - 111, 135, 136, 112, -1, - 112, 136, 137, 113, -1, - 113, 137, 138, 114, -1, - 114, 138, 139, 115, -1, - 115, 139, 140, 116, -1, - 116, 140, 141, 117, -1, - 117, 141, 142, 118, -1, - 118, 142, 143, 119, -1, - 119, 143, 120, 96, -1, - 120, 144, 145, 121, -1, - 121, 145, 146, 122, -1, - 122, 146, 147, 123, -1, - 123, 147, 148, 124, -1, - 124, 148, 149, 125, -1, - 125, 149, 150, 126, -1, - 126, 150, 151, 127, -1, - 127, 151, 152, 128, -1, - 128, 152, 153, 129, -1, - 129, 153, 154, 130, -1, - 130, 154, 155, 131, -1, - 131, 155, 156, 132, -1, - 132, 156, 157, 133, -1, - 133, 157, 158, 134, -1, - 134, 158, 159, 135, -1, - 135, 159, 160, 136, -1, - 136, 160, 161, 137, -1, - 137, 161, 162, 138, -1, - 138, 162, 163, 139, -1, - 139, 163, 164, 140, -1, - 140, 164, 165, 141, -1, - 141, 165, 166, 142, -1, - 142, 166, 167, 143, -1, - 143, 167, 144, 120, -1, - 144, 168, 169, 145, -1, - 145, 169, 170, 146, -1, - 146, 170, 171, 147, -1, - 147, 171, 172, 148, -1, - 148, 172, 173, 149, -1, - 149, 173, 174, 150, -1, - 150, 174, 175, 151, -1, - 151, 175, 176, 152, -1, - 152, 176, 177, 153, -1, - 153, 177, 178, 154, -1, - 154, 178, 179, 155, -1, - 155, 179, 180, 156, -1, - 156, 180, 181, 157, -1, - 157, 181, 182, 158, -1, - 158, 182, 183, 159, -1, - 159, 183, 184, 160, -1, - 160, 184, 185, 161, -1, - 161, 185, 186, 162, -1, - 162, 186, 187, 163, -1, - 163, 187, 188, 164, -1, - 164, 188, 189, 165, -1, - 165, 189, 190, 166, -1, - 166, 190, 191, 167, -1, - 167, 191, 168, 144, -1, - 168, 192, 169, -1, - 169, 192, 170, -1, - 170, 192, 171, -1, - 171, 192, 172, -1, - 172, 192, 173, -1, - 173, 192, 174, -1, - 174, 192, 175, -1, - 175, 192, 176, -1, - 176, 192, 177, -1, - 177, 192, 178, -1, - 178, 192, 179, -1, - 179, 192, 180, -1, - 180, 192, 181, -1, - 181, 192, 182, -1, - 182, 192, 183, -1, - 183, 192, 184, -1, - 184, 192, 185, -1, - 185, 192, 186, -1, - 186, 192, 187, -1, - 187, 192, 188, -1, - 188, 192, 189, -1, - 189, 192, 190, -1, - 190, 192, 191, -1, - 191, 192, 168, -1, - 193, 0, 1, -1, - 193, 1, 2, -1, - 193, 2, 3, -1, - 193, 3, 4, -1, - 193, 4, 5, -1, - 193, 5, 6, -1, - 193, 6, 7, -1, - 193, 7, 8, -1, - 193, 8, 9, -1, - 193, 9, 10, -1, - 193, 10, 11, -1, - 193, 11, 12, -1, - 193, 12, 13, -1, - 193, 13, 14, -1, - 193, 14, 15, -1, - 193, 15, 16, -1, - 193, 16, 17, -1, - 193, 17, 18, -1, - 193, 18, 19, -1, - 193, 19, 20, -1, - 193, 20, 21, -1, - 193, 21, 22, -1, - 193, 22, 23, -1, - 193, 23, 0, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4polyhedra.wrl b/environments/g4py/tests/gtest05/vrml/g4polyhedra.wrl deleted file mode 100644 index 4fb6508105..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4polyhedra.wrl +++ /dev/null @@ -1,160 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 123.607 0 350, - 38.1966 117.557 350, - -100 72.6543 350, - -100 -72.6543 350, - 38.1966 -117.557 350, - 123.607 0 320, - 38.1966 117.557 320, - -100 72.6543 320, - -100 -72.6543 320, - 38.1966 -117.557 320, - 49.4427 0 300, - 15.2786 47.0228 300, - -40 29.0617 300, - -40 -29.0617 300, - 15.2786 -47.0228 300, - 49.4427 0 130, - 15.2786 47.0228 130, - -40 29.0617 130, - -40 -29.0617 130, - 15.2786 -47.0228 130, - 185.41 0 80, - 57.2949 176.336 80, - -150 108.981 80, - -150 -108.981 80, - 57.2949 -176.336 80, - 185.41 0 50, - 57.2949 176.336 50, - -150 108.981 50, - -150 -108.981 50, - 57.2949 -176.336 50, - 0 0 0, - 0 0 350, - 0 0 320, - 0 0 300, - 0 0 130, - 0 0 80, - 0 0 50, - ] - } - coordIndex [ - 0, 5, 6, 1, -1, - 1, 6, 7, 2, -1, - 2, 7, 8, 3, -1, - 3, 8, 9, 4, -1, - 4, 9, 5, 0, -1, - 5, 10, 11, 6, -1, - 6, 11, 12, 7, -1, - 7, 12, 13, 8, -1, - 8, 13, 14, 9, -1, - 9, 14, 10, 5, -1, - 10, 15, 16, 11, -1, - 11, 16, 17, 12, -1, - 12, 17, 18, 13, -1, - 13, 18, 19, 14, -1, - 14, 19, 15, 10, -1, - 15, 20, 21, 16, -1, - 16, 21, 22, 17, -1, - 17, 22, 23, 18, -1, - 18, 23, 24, 19, -1, - 19, 24, 20, 15, -1, - 20, 25, 26, 21, -1, - 21, 26, 27, 22, -1, - 22, 27, 28, 23, -1, - 23, 28, 29, 24, -1, - 24, 29, 25, 20, -1, - 25, 30, 26, -1, - 26, 30, 27, -1, - 27, 30, 28, -1, - 28, 30, 29, -1, - 29, 30, 25, -1, - 31, 0, 1, -1, - 31, 1, 2, -1, - 31, 2, 3, -1, - 31, 3, 4, -1, - 31, 4, 0, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4sphere.wrl b/environments/g4py/tests/gtest05/vrml/g4sphere.wrl deleted file mode 100644 index e3bfafdc9b..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4sphere.wrl +++ /dev/null @@ -1,690 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 0 0 1200, - 310.583 2.1464e-307 1159.11, - 300 80.3848 1159.11, - 268.973 155.291 1159.11, - 219.615 219.615 1159.11, - 155.291 268.973 1159.11, - 80.3848 300 1159.11, - 1.90177e-14 310.583 1159.11, - -80.3848 300 1159.11, - -155.291 268.973 1159.11, - -219.615 219.615 1159.11, - -268.973 155.291 1159.11, - -300 80.3848 1159.11, - -310.583 3.80354e-14 1159.11, - 600 4.14653e-307 1039.23, - 579.555 155.291 1039.23, - 519.615 300 1039.23, - 424.264 424.264 1039.23, - 300 519.615 1039.23, - 155.291 579.555 1039.23, - 3.67394e-14 600 1039.23, - -155.291 579.555 1039.23, - -300 519.615 1039.23, - -424.264 424.264 1039.23, - -519.615 300 1039.23, - -579.555 155.291 1039.23, - -600 7.34788e-14 1039.23, - 848.528 5.86408e-307 848.528, - 819.615 219.615 848.528, - 734.847 424.264 848.528, - 600 600 848.528, - 424.264 734.847 848.528, - 219.615 819.615 848.528, - 5.19574e-14 848.528 848.528, - -219.615 819.615 848.528, - -424.264 734.847 848.528, - -600 600 848.528, - -734.847 424.264 848.528, - -819.615 219.615 848.528, - -848.528 1.03915e-13 848.528, - 1039.23 7.182e-307 600, - 1003.82 268.973 600, - 900 519.615 600, - 734.847 734.847 600, - 519.615 900 600, - 268.973 1003.82 600, - 6.36345e-14 1039.23 600, - -268.973 1003.82 600, - -519.615 900 600, - -734.847 734.847 600, - -900 519.615 600, - -1003.82 268.973 600, - -1039.23 1.27269e-13 600, - 1159.11 8.01048e-307 310.583, - 1119.62 300 310.583, - 1003.82 579.555 310.583, - 819.615 819.615 310.583, - 579.555 1003.82 310.583, - 300 1119.62 310.583, - 7.09751e-14 1159.11 310.583, - -300 1119.62 310.583, - -579.555 1003.82 310.583, - -819.615 819.615 310.583, - -1003.82 579.555 310.583, - -1119.62 300 310.583, - -1159.11 1.4195e-13 310.583, - 1200 8.29306e-307 7.34788e-14, - 1159.11 310.583 7.34788e-14, - 1039.23 600 7.34788e-14, - 848.528 848.528 7.34788e-14, - 600 1039.23 7.34788e-14, - 310.583 1159.11 7.34788e-14, - 7.34788e-14 1200 7.34788e-14, - -310.583 1159.11 7.34788e-14, - -600 1039.23 7.34788e-14, - -848.528 848.528 7.34788e-14, - -1039.23 600 7.34788e-14, - -1159.11 310.583 7.34788e-14, - -1200 1.46958e-13 7.34788e-14, - 1159.11 8.01048e-307 -310.583, - 1119.62 300 -310.583, - 1003.82 579.555 -310.583, - 819.615 819.615 -310.583, - 579.555 1003.82 -310.583, - 300 1119.62 -310.583, - 7.09751e-14 1159.11 -310.583, - -300 1119.62 -310.583, - -579.555 1003.82 -310.583, - -819.615 819.615 -310.583, - -1003.82 579.555 -310.583, - -1119.62 300 -310.583, - -1159.11 1.4195e-13 -310.583, - 1039.23 7.182e-307 -600, - 1003.82 268.973 -600, - 900 519.615 -600, - 734.847 734.847 -600, - 519.615 900 -600, - 268.973 1003.82 -600, - 6.36345e-14 1039.23 -600, - -268.973 1003.82 -600, - -519.615 900 -600, - -734.847 734.847 -600, - -900 519.615 -600, - -1003.82 268.973 -600, - -1039.23 1.27269e-13 -600, - 848.528 5.86408e-307 -848.528, - 819.615 219.615 -848.528, - 734.847 424.264 -848.528, - 600 600 -848.528, - 424.264 734.847 -848.528, - 219.615 819.615 -848.528, - 5.19574e-14 848.528 -848.528, - -219.615 819.615 -848.528, - -424.264 734.847 -848.528, - -600 600 -848.528, - -734.847 424.264 -848.528, - -819.615 219.615 -848.528, - -848.528 1.03915e-13 -848.528, - 600 4.14653e-307 -1039.23, - 579.555 155.291 -1039.23, - 519.615 300 -1039.23, - 424.264 424.264 -1039.23, - 300 519.615 -1039.23, - 155.291 579.555 -1039.23, - 3.67394e-14 600 -1039.23, - -155.291 579.555 -1039.23, - -300 519.615 -1039.23, - -424.264 424.264 -1039.23, - -519.615 300 -1039.23, - -579.555 155.291 -1039.23, - -600 7.34788e-14 -1039.23, - 310.583 2.1464e-307 -1159.11, - 300 80.3848 -1159.11, - 268.973 155.291 -1159.11, - 219.615 219.615 -1159.11, - 155.291 268.973 -1159.11, - 80.3848 300 -1159.11, - 1.90177e-14 310.583 -1159.11, - -80.3848 300 -1159.11, - -155.291 268.973 -1159.11, - -219.615 219.615 -1159.11, - -268.973 155.291 -1159.11, - -300 80.3848 -1159.11, - -310.583 3.80354e-14 -1159.11, - 0 0 -1200, - 0 0 1000, - 258.819 1.78867e-307 965.926, - 250 66.9873 965.926, - 224.144 129.41 965.926, - 183.013 183.013 965.926, - 129.41 224.144 965.926, - 66.9873 250 965.926, - 1.58481e-14 258.819 965.926, - -66.9873 250 965.926, - -129.41 224.144 965.926, - -183.013 183.013 965.926, - -224.144 129.41 965.926, - -250 66.9873 965.926, - -258.819 3.16962e-14 965.926, - 500 3.45544e-307 866.025, - 482.963 129.41 866.025, - 433.013 250 866.025, - 353.553 353.553 866.025, - 250 433.013 866.025, - 129.41 482.963 866.025, - 3.06162e-14 500 866.025, - -129.41 482.963 866.025, - -250 433.013 866.025, - -353.553 353.553 866.025, - -433.013 250 866.025, - -482.963 129.41 866.025, - -500 6.12323e-14 866.025, - 707.107 4.88673e-307 707.107, - 683.013 183.013 707.107, - 612.372 353.553 707.107, - 500 500 707.107, - 353.553 612.372 707.107, - 183.013 683.013 707.107, - 4.32978e-14 707.107 707.107, - -183.013 683.013 707.107, - -353.553 612.372 707.107, - -500 500 707.107, - -612.372 353.553 707.107, - -683.013 183.013 707.107, - -707.107 8.65956e-14 707.107, - 866.025 5.985e-307 500, - 836.516 224.144 500, - 750 433.013 500, - 612.372 612.372 500, - 433.013 750 500, - 224.144 836.516 500, - 5.30288e-14 866.025 500, - -224.144 836.516 500, - -433.013 750 500, - -612.372 612.372 500, - -750 433.013 500, - -836.516 224.144 500, - -866.025 1.06058e-13 500, - 965.926 6.6754e-307 258.819, - 933.013 250 258.819, - 836.516 482.963 258.819, - 683.013 683.013 258.819, - 482.963 836.516 258.819, - 250 933.013 258.819, - 5.91459e-14 965.926 258.819, - -250 933.013 258.819, - -482.963 836.516 258.819, - -683.013 683.013 258.819, - -836.516 482.963 258.819, - -933.013 250 258.819, - -965.926 1.18292e-13 258.819, - 1000 6.91088e-307 6.12323e-14, - 965.926 258.819 6.12323e-14, - 866.025 500 6.12323e-14, - 707.107 707.107 6.12323e-14, - 500 866.025 6.12323e-14, - 258.819 965.926 6.12323e-14, - 6.12323e-14 1000 6.12323e-14, - -258.819 965.926 6.12323e-14, - -500 866.025 6.12323e-14, - -707.107 707.107 6.12323e-14, - -866.025 500 6.12323e-14, - -965.926 258.819 6.12323e-14, - -1000 1.22465e-13 6.12323e-14, - 965.926 6.6754e-307 -258.819, - 933.013 250 -258.819, - 836.516 482.963 -258.819, - 683.013 683.013 -258.819, - 482.963 836.516 -258.819, - 250 933.013 -258.819, - 5.91459e-14 965.926 -258.819, - -250 933.013 -258.819, - -482.963 836.516 -258.819, - -683.013 683.013 -258.819, - -836.516 482.963 -258.819, - -933.013 250 -258.819, - -965.926 1.18292e-13 -258.819, - 866.025 5.985e-307 -500, - 836.516 224.144 -500, - 750 433.013 -500, - 612.372 612.372 -500, - 433.013 750 -500, - 224.144 836.516 -500, - 5.30288e-14 866.025 -500, - -224.144 836.516 -500, - -433.013 750 -500, - -612.372 612.372 -500, - -750 433.013 -500, - -836.516 224.144 -500, - -866.025 1.06058e-13 -500, - 707.107 4.88673e-307 -707.107, - 683.013 183.013 -707.107, - 612.372 353.553 -707.107, - 500 500 -707.107, - 353.553 612.372 -707.107, - 183.013 683.013 -707.107, - 4.32978e-14 707.107 -707.107, - -183.013 683.013 -707.107, - -353.553 612.372 -707.107, - -500 500 -707.107, - -612.372 353.553 -707.107, - -683.013 183.013 -707.107, - -707.107 8.65956e-14 -707.107, - 500 3.45544e-307 -866.025, - 482.963 129.41 -866.025, - 433.013 250 -866.025, - 353.553 353.553 -866.025, - 250 433.013 -866.025, - 129.41 482.963 -866.025, - 3.06162e-14 500 -866.025, - -129.41 482.963 -866.025, - -250 433.013 -866.025, - -353.553 353.553 -866.025, - -433.013 250 -866.025, - -482.963 129.41 -866.025, - -500 6.12323e-14 -866.025, - 258.819 1.78867e-307 -965.926, - 250 66.9873 -965.926, - 224.144 129.41 -965.926, - 183.013 183.013 -965.926, - 129.41 224.144 -965.926, - 66.9873 250 -965.926, - 1.58481e-14 258.819 -965.926, - -66.9873 250 -965.926, - -129.41 224.144 -965.926, - -183.013 183.013 -965.926, - -224.144 129.41 -965.926, - -250 66.9873 -965.926, - -258.819 3.16962e-14 -965.926, - 0 0 -1000, - ] - } - coordIndex [ - 0, 1, 2, -1, - 0, 2, 3, -1, - 0, 3, 4, -1, - 0, 4, 5, -1, - 0, 5, 6, -1, - 0, 6, 7, -1, - 0, 7, 8, -1, - 0, 8, 9, -1, - 0, 9, 10, -1, - 0, 10, 11, -1, - 0, 11, 12, -1, - 0, 12, 13, -1, - 1, 14, 15, 2, -1, - 2, 15, 16, 3, -1, - 3, 16, 17, 4, -1, - 4, 17, 18, 5, -1, - 5, 18, 19, 6, -1, - 6, 19, 20, 7, -1, - 7, 20, 21, 8, -1, - 8, 21, 22, 9, -1, - 9, 22, 23, 10, -1, - 10, 23, 24, 11, -1, - 11, 24, 25, 12, -1, - 12, 25, 26, 13, -1, - 14, 27, 28, 15, -1, - 15, 28, 29, 16, -1, - 16, 29, 30, 17, -1, - 17, 30, 31, 18, -1, - 18, 31, 32, 19, -1, - 19, 32, 33, 20, -1, - 20, 33, 34, 21, -1, - 21, 34, 35, 22, -1, - 22, 35, 36, 23, -1, - 23, 36, 37, 24, -1, - 24, 37, 38, 25, -1, - 25, 38, 39, 26, -1, - 27, 40, 41, 28, -1, - 28, 41, 42, 29, -1, - 29, 42, 43, 30, -1, - 30, 43, 44, 31, -1, - 31, 44, 45, 32, -1, - 32, 45, 46, 33, -1, - 33, 46, 47, 34, -1, - 34, 47, 48, 35, -1, - 35, 48, 49, 36, -1, - 36, 49, 50, 37, -1, - 37, 50, 51, 38, -1, - 38, 51, 52, 39, -1, - 40, 53, 54, 41, -1, - 41, 54, 55, 42, -1, - 42, 55, 56, 43, -1, - 43, 56, 57, 44, -1, - 44, 57, 58, 45, -1, - 45, 58, 59, 46, -1, - 46, 59, 60, 47, -1, - 47, 60, 61, 48, -1, - 48, 61, 62, 49, -1, - 49, 62, 63, 50, -1, - 50, 63, 64, 51, -1, - 51, 64, 65, 52, -1, - 53, 66, 67, 54, -1, - 54, 67, 68, 55, -1, - 55, 68, 69, 56, -1, - 56, 69, 70, 57, -1, - 57, 70, 71, 58, -1, - 58, 71, 72, 59, -1, - 59, 72, 73, 60, -1, - 60, 73, 74, 61, -1, - 61, 74, 75, 62, -1, - 62, 75, 76, 63, -1, - 63, 76, 77, 64, -1, - 64, 77, 78, 65, -1, - 66, 79, 80, 67, -1, - 67, 80, 81, 68, -1, - 68, 81, 82, 69, -1, - 69, 82, 83, 70, -1, - 70, 83, 84, 71, -1, - 71, 84, 85, 72, -1, - 72, 85, 86, 73, -1, - 73, 86, 87, 74, -1, - 74, 87, 88, 75, -1, - 75, 88, 89, 76, -1, - 76, 89, 90, 77, -1, - 77, 90, 91, 78, -1, - 79, 92, 93, 80, -1, - 80, 93, 94, 81, -1, - 81, 94, 95, 82, -1, - 82, 95, 96, 83, -1, - 83, 96, 97, 84, -1, - 84, 97, 98, 85, -1, - 85, 98, 99, 86, -1, - 86, 99, 100, 87, -1, - 87, 100, 101, 88, -1, - 88, 101, 102, 89, -1, - 89, 102, 103, 90, -1, - 90, 103, 104, 91, -1, - 92, 105, 106, 93, -1, - 93, 106, 107, 94, -1, - 94, 107, 108, 95, -1, - 95, 108, 109, 96, -1, - 96, 109, 110, 97, -1, - 97, 110, 111, 98, -1, - 98, 111, 112, 99, -1, - 99, 112, 113, 100, -1, - 100, 113, 114, 101, -1, - 101, 114, 115, 102, -1, - 102, 115, 116, 103, -1, - 103, 116, 117, 104, -1, - 105, 118, 119, 106, -1, - 106, 119, 120, 107, -1, - 107, 120, 121, 108, -1, - 108, 121, 122, 109, -1, - 109, 122, 123, 110, -1, - 110, 123, 124, 111, -1, - 111, 124, 125, 112, -1, - 112, 125, 126, 113, -1, - 113, 126, 127, 114, -1, - 114, 127, 128, 115, -1, - 115, 128, 129, 116, -1, - 116, 129, 130, 117, -1, - 118, 131, 132, 119, -1, - 119, 132, 133, 120, -1, - 120, 133, 134, 121, -1, - 121, 134, 135, 122, -1, - 122, 135, 136, 123, -1, - 123, 136, 137, 124, -1, - 124, 137, 138, 125, -1, - 125, 138, 139, 126, -1, - 126, 139, 140, 127, -1, - 127, 140, 141, 128, -1, - 128, 141, 142, 129, -1, - 129, 142, 143, 130, -1, - 131, 144, 132, -1, - 132, 144, 133, -1, - 133, 144, 134, -1, - 134, 144, 135, -1, - 135, 144, 136, -1, - 136, 144, 137, -1, - 137, 144, 138, -1, - 138, 144, 139, -1, - 139, 144, 140, -1, - 140, 144, 141, -1, - 141, 144, 142, -1, - 142, 144, 143, -1, - 146, 145, 147, -1, - 147, 145, 148, -1, - 148, 145, 149, -1, - 149, 145, 150, -1, - 150, 145, 151, -1, - 151, 145, 152, -1, - 152, 145, 153, -1, - 153, 145, 154, -1, - 154, 145, 155, -1, - 155, 145, 156, -1, - 156, 145, 157, -1, - 157, 145, 158, -1, - 159, 146, 147, 160, -1, - 160, 147, 148, 161, -1, - 161, 148, 149, 162, -1, - 162, 149, 150, 163, -1, - 163, 150, 151, 164, -1, - 164, 151, 152, 165, -1, - 165, 152, 153, 166, -1, - 166, 153, 154, 167, -1, - 167, 154, 155, 168, -1, - 168, 155, 156, 169, -1, - 169, 156, 157, 170, -1, - 170, 157, 158, 171, -1, - 172, 159, 160, 173, -1, - 173, 160, 161, 174, -1, - 174, 161, 162, 175, -1, - 175, 162, 163, 176, -1, - 176, 163, 164, 177, -1, - 177, 164, 165, 178, -1, - 178, 165, 166, 179, -1, - 179, 166, 167, 180, -1, - 180, 167, 168, 181, -1, - 181, 168, 169, 182, -1, - 182, 169, 170, 183, -1, - 183, 170, 171, 184, -1, - 185, 172, 173, 186, -1, - 186, 173, 174, 187, -1, - 187, 174, 175, 188, -1, - 188, 175, 176, 189, -1, - 189, 176, 177, 190, -1, - 190, 177, 178, 191, -1, - 191, 178, 179, 192, -1, - 192, 179, 180, 193, -1, - 193, 180, 181, 194, -1, - 194, 181, 182, 195, -1, - 195, 182, 183, 196, -1, - 196, 183, 184, 197, -1, - 198, 185, 186, 199, -1, - 199, 186, 187, 200, -1, - 200, 187, 188, 201, -1, - 201, 188, 189, 202, -1, - 202, 189, 190, 203, -1, - 203, 190, 191, 204, -1, - 204, 191, 192, 205, -1, - 205, 192, 193, 206, -1, - 206, 193, 194, 207, -1, - 207, 194, 195, 208, -1, - 208, 195, 196, 209, -1, - 209, 196, 197, 210, -1, - 211, 198, 199, 212, -1, - 212, 199, 200, 213, -1, - 213, 200, 201, 214, -1, - 214, 201, 202, 215, -1, - 215, 202, 203, 216, -1, - 216, 203, 204, 217, -1, - 217, 204, 205, 218, -1, - 218, 205, 206, 219, -1, - 219, 206, 207, 220, -1, - 220, 207, 208, 221, -1, - 221, 208, 209, 222, -1, - 222, 209, 210, 223, -1, - 224, 211, 212, 225, -1, - 225, 212, 213, 226, -1, - 226, 213, 214, 227, -1, - 227, 214, 215, 228, -1, - 228, 215, 216, 229, -1, - 229, 216, 217, 230, -1, - 230, 217, 218, 231, -1, - 231, 218, 219, 232, -1, - 232, 219, 220, 233, -1, - 233, 220, 221, 234, -1, - 234, 221, 222, 235, -1, - 235, 222, 223, 236, -1, - 237, 224, 225, 238, -1, - 238, 225, 226, 239, -1, - 239, 226, 227, 240, -1, - 240, 227, 228, 241, -1, - 241, 228, 229, 242, -1, - 242, 229, 230, 243, -1, - 243, 230, 231, 244, -1, - 244, 231, 232, 245, -1, - 245, 232, 233, 246, -1, - 246, 233, 234, 247, -1, - 247, 234, 235, 248, -1, - 248, 235, 236, 249, -1, - 250, 237, 238, 251, -1, - 251, 238, 239, 252, -1, - 252, 239, 240, 253, -1, - 253, 240, 241, 254, -1, - 254, 241, 242, 255, -1, - 255, 242, 243, 256, -1, - 256, 243, 244, 257, -1, - 257, 244, 245, 258, -1, - 258, 245, 246, 259, -1, - 259, 246, 247, 260, -1, - 260, 247, 248, 261, -1, - 261, 248, 249, 262, -1, - 263, 250, 251, 264, -1, - 264, 251, 252, 265, -1, - 265, 252, 253, 266, -1, - 266, 253, 254, 267, -1, - 267, 254, 255, 268, -1, - 268, 255, 256, 269, -1, - 269, 256, 257, 270, -1, - 270, 257, 258, 271, -1, - 271, 258, 259, 272, -1, - 272, 259, 260, 273, -1, - 273, 260, 261, 274, -1, - 274, 261, 262, 275, -1, - 276, 263, 264, 277, -1, - 277, 264, 265, 278, -1, - 278, 265, 266, 279, -1, - 279, 266, 267, 280, -1, - 280, 267, 268, 281, -1, - 281, 268, 269, 282, -1, - 282, 269, 270, 283, -1, - 283, 270, 271, 284, -1, - 284, 271, 272, 285, -1, - 285, 272, 273, 286, -1, - 286, 273, 274, 287, -1, - 287, 274, 275, 288, -1, - 289, 276, 277, -1, - 289, 277, 278, -1, - 289, 278, 279, -1, - 289, 279, 280, -1, - 289, 280, 281, -1, - 289, 281, 282, -1, - 289, 282, 283, -1, - 289, 283, 284, -1, - 289, 284, 285, -1, - 289, 285, 286, -1, - 289, 286, 287, -1, - 289, 287, 288, -1, - 0, 145, 146, 1, -1, - 13, 158, 145, 0, -1, - 1, 146, 159, 14, -1, - 26, 171, 158, 13, -1, - 14, 159, 172, 27, -1, - 39, 184, 171, 26, -1, - 27, 172, 185, 40, -1, - 52, 197, 184, 39, -1, - 40, 185, 198, 53, -1, - 65, 210, 197, 52, -1, - 53, 198, 211, 66, -1, - 78, 223, 210, 65, -1, - 66, 211, 224, 79, -1, - 91, 236, 223, 78, -1, - 79, 224, 237, 92, -1, - 104, 249, 236, 91, -1, - 92, 237, 250, 105, -1, - 117, 262, 249, 104, -1, - 105, 250, 263, 118, -1, - 130, 275, 262, 117, -1, - 118, 263, 276, 131, -1, - 143, 288, 275, 130, -1, - 131, 276, 289, 144, -1, - 144, 289, 288, 143, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4tet.wrl b/environments/g4py/tests/gtest05/vrml/g4tet.wrl deleted file mode 100644 index 1259f8f3b9..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4tet.wrl +++ /dev/null @@ -1,96 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 0 0 346.41, - 0 326.599 -115.47, - 282.843 -163.299 -115.47, - -282.843 -163.299 -115.47, - ] - } - coordIndex [ - 0, 2, 1, -1, - 0, 3, 2, -1, - 0, 1, 3, -1, - 1, 2, 3, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4torus.wrl b/environments/g4py/tests/gtest05/vrml/g4torus.wrl deleted file mode 100644 index 3d3edcce0f..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4torus.wrl +++ /dev/null @@ -1,760 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 2000 0 600, - 1931.85 517.638 600, - 1732.05 1000 600, - 1414.21 1414.21 600, - 1000 1732.05 600, - 517.638 1931.85 600, - 1.22465e-13 2000 600, - 2155.29 0 579.555, - 2081.85 557.83 579.555, - 1866.54 1077.65 579.555, - 1524.02 1524.02 579.555, - 1077.65 1866.54 579.555, - 557.83 2081.85 579.555, - 1.31974e-13 2155.29 579.555, - 2300 0 519.615, - 2221.63 595.284 519.615, - 1991.86 1150 519.615, - 1626.35 1626.35 519.615, - 1150 1991.86 519.615, - 595.284 2221.63 519.615, - 1.40834e-13 2300 519.615, - 2424.26 0 424.264, - 2341.66 627.446 424.264, - 2099.47 1212.13 424.264, - 1714.21 1714.21 424.264, - 1212.13 2099.47 424.264, - 627.446 2341.66 424.264, - 1.48443e-13 2424.26 424.264, - 2519.62 0 300, - 2433.76 652.124 300, - 2182.05 1259.81 300, - 1781.64 1781.64 300, - 1259.81 2182.05 300, - 652.124 2433.76 300, - 1.54282e-13 2519.62 300, - 2579.56 0 155.291, - 2491.66 667.638 155.291, - 2233.96 1289.78 155.291, - 1824.02 1824.02 155.291, - 1289.78 2233.96 155.291, - 667.638 2491.66 155.291, - 1.57952e-13 2579.56 155.291, - 2600 0 3.67394e-14, - 2511.41 672.93 3.67394e-14, - 2251.67 1300 3.67394e-14, - 1838.48 1838.48 3.67394e-14, - 1300 2251.67 3.67394e-14, - 672.93 2511.41 3.67394e-14, - 1.59204e-13 2600 3.67394e-14, - 2579.56 0 -155.291, - 2491.66 667.638 -155.291, - 2233.96 1289.78 -155.291, - 1824.02 1824.02 -155.291, - 1289.78 2233.96 -155.291, - 667.638 2491.66 -155.291, - 1.57952e-13 2579.56 -155.291, - 2519.62 0 -300, - 2433.76 652.124 -300, - 2182.05 1259.81 -300, - 1781.64 1781.64 -300, - 1259.81 2182.05 -300, - 652.124 2433.76 -300, - 1.54282e-13 2519.62 -300, - 2424.26 0 -424.264, - 2341.66 627.446 -424.264, - 2099.47 1212.13 -424.264, - 1714.21 1714.21 -424.264, - 1212.13 2099.47 -424.264, - 627.446 2341.66 -424.264, - 1.48443e-13 2424.26 -424.264, - 2300 0 -519.615, - 2221.63 595.284 -519.615, - 1991.86 1150 -519.615, - 1626.35 1626.35 -519.615, - 1150 1991.86 -519.615, - 595.284 2221.63 -519.615, - 1.40834e-13 2300 -519.615, - 2155.29 0 -579.555, - 2081.85 557.83 -579.555, - 1866.54 1077.65 -579.555, - 1524.02 1524.02 -579.555, - 1077.65 1866.54 -579.555, - 557.83 2081.85 -579.555, - 1.31974e-13 2155.29 -579.555, - 2000 0 -600, - 1931.85 517.638 -600, - 1732.05 1000 -600, - 1414.21 1414.21 -600, - 1000 1732.05 -600, - 517.638 1931.85 -600, - 1.22465e-13 2000 -600, - 1844.71 0 -579.555, - 1781.85 477.446 -579.555, - 1597.56 922.354 -579.555, - 1304.41 1304.41 -579.555, - 922.354 1597.56 -579.555, - 477.446 1781.85 -579.555, - 1.12956e-13 1844.71 -579.555, - 1700 0 -519.615, - 1642.07 439.992 -519.615, - 1472.24 850 -519.615, - 1202.08 1202.08 -519.615, - 850 1472.24 -519.615, - 439.992 1642.07 -519.615, - 1.04095e-13 1700 -519.615, - 1575.74 0 -424.264, - 1522.04 407.83 -424.264, - 1364.63 787.868 -424.264, - 1114.21 1114.21 -424.264, - 787.868 1364.63 -424.264, - 407.83 1522.04 -424.264, - 9.6486e-14 1575.74 -424.264, - 1480.38 0 -300, - 1429.94 383.152 -300, - 1282.05 740.192 -300, - 1046.79 1046.79 -300, - 740.192 1282.05 -300, - 383.152 1429.94 -300, - 9.06474e-14 1480.38 -300, - 1420.44 0 -155.291, - 1372.04 367.638 -155.291, - 1230.14 710.222 -155.291, - 1004.41 1004.41 -155.291, - 710.222 1230.14 -155.291, - 367.638 1372.04 -155.291, - 8.69771e-14 1420.44 -155.291, - 1400 0 -1.10218e-13, - 1352.3 362.347 -1.10218e-13, - 1212.44 700 -1.10218e-13, - 989.949 989.949 -1.10218e-13, - 700 1212.44 -1.10218e-13, - 362.347 1352.3 -1.10218e-13, - 8.57253e-14 1400 -1.10218e-13, - 1420.44 0 155.291, - 1372.04 367.638 155.291, - 1230.14 710.222 155.291, - 1004.41 1004.41 155.291, - 710.222 1230.14 155.291, - 367.638 1372.04 155.291, - 8.69771e-14 1420.44 155.291, - 1480.38 0 300, - 1429.94 383.152 300, - 1282.05 740.192 300, - 1046.79 1046.79 300, - 740.192 1282.05 300, - 383.152 1429.94 300, - 9.06474e-14 1480.38 300, - 1575.74 0 424.264, - 1522.04 407.83 424.264, - 1364.63 787.868 424.264, - 1114.21 1114.21 424.264, - 787.868 1364.63 424.264, - 407.83 1522.04 424.264, - 9.6486e-14 1575.74 424.264, - 1700 0 519.615, - 1642.07 439.992 519.615, - 1472.24 850 519.615, - 1202.08 1202.08 519.615, - 850 1472.24 519.615, - 439.992 1642.07 519.615, - 1.04095e-13 1700 519.615, - 1844.71 0 579.555, - 1781.85 477.446 579.555, - 1597.56 922.354 579.555, - 1304.41 1304.41 579.555, - 922.354 1597.56 579.555, - 477.446 1781.85 579.555, - 1.12956e-13 1844.71 579.555, - 2000 0 400, - 1931.85 517.638 400, - 1732.05 1000 400, - 1414.21 1414.21 400, - 1000 1732.05 400, - 517.638 1931.85 400, - 1.22465e-13 2000 400, - 2103.53 0 386.37, - 2031.85 544.433 386.37, - 1821.71 1051.76 386.37, - 1487.42 1487.42 386.37, - 1051.76 1821.71 386.37, - 544.433 2031.85 386.37, - 1.28804e-13 2103.53 386.37, - 2200 0 346.41, - 2125.04 569.402 346.41, - 1905.26 1100 346.41, - 1555.63 1555.63 346.41, - 1100 1905.26 346.41, - 569.402 2125.04 346.41, - 1.34711e-13 2200 346.41, - 2282.84 0 282.843, - 2205.06 590.843 282.843, - 1977 1141.42 282.843, - 1614.21 1614.21 282.843, - 1141.42 1977 282.843, - 590.843 2205.06 282.843, - 1.39784e-13 2282.84 282.843, - 2346.41 0 200, - 2266.46 607.296 200, - 2032.05 1173.21 200, - 1659.16 1659.16 200, - 1173.21 2032.05 200, - 607.296 2266.46 200, - 1.43676e-13 2346.41 200, - 2386.37 0 103.528, - 2305.06 617.638 103.528, - 2066.66 1193.19 103.528, - 1687.42 1687.42 103.528, - 1193.19 2066.66 103.528, - 617.638 2305.06 103.528, - 1.46123e-13 2386.37 103.528, - 2400 0 2.44929e-14, - 2318.22 621.166 2.44929e-14, - 2078.46 1200 2.44929e-14, - 1697.06 1697.06 2.44929e-14, - 1200 2078.46 2.44929e-14, - 621.166 2318.22 2.44929e-14, - 1.46958e-13 2400 2.44929e-14, - 2386.37 0 -103.528, - 2305.06 617.638 -103.528, - 2066.66 1193.19 -103.528, - 1687.42 1687.42 -103.528, - 1193.19 2066.66 -103.528, - 617.638 2305.06 -103.528, - 1.46123e-13 2386.37 -103.528, - 2346.41 0 -200, - 2266.46 607.296 -200, - 2032.05 1173.21 -200, - 1659.16 1659.16 -200, - 1173.21 2032.05 -200, - 607.296 2266.46 -200, - 1.43676e-13 2346.41 -200, - 2282.84 0 -282.843, - 2205.06 590.843 -282.843, - 1977 1141.42 -282.843, - 1614.21 1614.21 -282.843, - 1141.42 1977 -282.843, - 590.843 2205.06 -282.843, - 1.39784e-13 2282.84 -282.843, - 2200 0 -346.41, - 2125.04 569.402 -346.41, - 1905.26 1100 -346.41, - 1555.63 1555.63 -346.41, - 1100 1905.26 -346.41, - 569.402 2125.04 -346.41, - 1.34711e-13 2200 -346.41, - 2103.53 0 -386.37, - 2031.85 544.433 -386.37, - 1821.71 1051.76 -386.37, - 1487.42 1487.42 -386.37, - 1051.76 1821.71 -386.37, - 544.433 2031.85 -386.37, - 1.28804e-13 2103.53 -386.37, - 2000 0 -400, - 1931.85 517.638 -400, - 1732.05 1000 -400, - 1414.21 1414.21 -400, - 1000 1732.05 -400, - 517.638 1931.85 -400, - 1.22465e-13 2000 -400, - 1896.47 0 -386.37, - 1831.85 490.843 -386.37, - 1642.39 948.236 -386.37, - 1341.01 1341.01 -386.37, - 948.236 1642.39 -386.37, - 490.843 1831.85 -386.37, - 1.16125e-13 1896.47 -386.37, - 1800 0 -346.41, - 1738.67 465.874 -346.41, - 1558.85 900 -346.41, - 1272.79 1272.79 -346.41, - 900 1558.85 -346.41, - 465.874 1738.67 -346.41, - 1.10218e-13 1800 -346.41, - 1717.16 0 -282.843, - 1658.65 444.433 -282.843, - 1487.1 858.579 -282.843, - 1214.21 1214.21 -282.843, - 858.579 1487.1 -282.843, - 444.433 1658.65 -282.843, - 1.05146e-13 1717.16 -282.843, - 1653.59 0 -200, - 1597.25 427.981 -200, - 1432.05 826.795 -200, - 1169.26 1169.26 -200, - 826.795 1432.05 -200, - 427.981 1597.25 -200, - 1.01253e-13 1653.59 -200, - 1613.63 0 -103.528, - 1558.65 417.638 -103.528, - 1397.44 806.815 -103.528, - 1141.01 1141.01 -103.528, - 806.815 1397.44 -103.528, - 417.638 1558.65 -103.528, - 9.88063e-14 1613.63 -103.528, - 1600 0 -7.34788e-14, - 1545.48 414.11 -7.34788e-14, - 1385.64 800 -7.34788e-14, - 1131.37 1131.37 -7.34788e-14, - 800 1385.64 -7.34788e-14, - 414.11 1545.48 -7.34788e-14, - 9.79717e-14 1600 -7.34788e-14, - 1613.63 0 103.528, - 1558.65 417.638 103.528, - 1397.44 806.815 103.528, - 1141.01 1141.01 103.528, - 806.815 1397.44 103.528, - 417.638 1558.65 103.528, - 9.88063e-14 1613.63 103.528, - 1653.59 0 200, - 1597.25 427.981 200, - 1432.05 826.795 200, - 1169.26 1169.26 200, - 826.795 1432.05 200, - 427.981 1597.25 200, - 1.01253e-13 1653.59 200, - 1717.16 0 282.843, - 1658.65 444.433 282.843, - 1487.1 858.579 282.843, - 1214.21 1214.21 282.843, - 858.579 1487.1 282.843, - 444.433 1658.65 282.843, - 1.05146e-13 1717.16 282.843, - 1800 0 346.41, - 1738.67 465.874 346.41, - 1558.85 900 346.41, - 1272.79 1272.79 346.41, - 900 1558.85 346.41, - 465.874 1738.67 346.41, - 1.10218e-13 1800 346.41, - 1896.47 0 386.37, - 1831.85 490.843 386.37, - 1642.39 948.236 386.37, - 1341.01 1341.01 386.37, - 948.236 1642.39 386.37, - 490.843 1831.85 386.37, - 1.16125e-13 1896.47 386.37, - ] - } - coordIndex [ - 0, 7, 8, 1, -1, - 1, 8, 9, 2, -1, - 2, 9, 10, 3, -1, - 3, 10, 11, 4, -1, - 4, 11, 12, 5, -1, - 5, 12, 13, 6, -1, - 7, 14, 15, 8, -1, - 8, 15, 16, 9, -1, - 9, 16, 17, 10, -1, - 10, 17, 18, 11, -1, - 11, 18, 19, 12, -1, - 12, 19, 20, 13, -1, - 14, 21, 22, 15, -1, - 15, 22, 23, 16, -1, - 16, 23, 24, 17, -1, - 17, 24, 25, 18, -1, - 18, 25, 26, 19, -1, - 19, 26, 27, 20, -1, - 21, 28, 29, 22, -1, - 22, 29, 30, 23, -1, - 23, 30, 31, 24, -1, - 24, 31, 32, 25, -1, - 25, 32, 33, 26, -1, - 26, 33, 34, 27, -1, - 28, 35, 36, 29, -1, - 29, 36, 37, 30, -1, - 30, 37, 38, 31, -1, - 31, 38, 39, 32, -1, - 32, 39, 40, 33, -1, - 33, 40, 41, 34, -1, - 35, 42, 43, 36, -1, - 36, 43, 44, 37, -1, - 37, 44, 45, 38, -1, - 38, 45, 46, 39, -1, - 39, 46, 47, 40, -1, - 40, 47, 48, 41, -1, - 42, 49, 50, 43, -1, - 43, 50, 51, 44, -1, - 44, 51, 52, 45, -1, - 45, 52, 53, 46, -1, - 46, 53, 54, 47, -1, - 47, 54, 55, 48, -1, - 49, 56, 57, 50, -1, - 50, 57, 58, 51, -1, - 51, 58, 59, 52, -1, - 52, 59, 60, 53, -1, - 53, 60, 61, 54, -1, - 54, 61, 62, 55, -1, - 56, 63, 64, 57, -1, - 57, 64, 65, 58, -1, - 58, 65, 66, 59, -1, - 59, 66, 67, 60, -1, - 60, 67, 68, 61, -1, - 61, 68, 69, 62, -1, - 63, 70, 71, 64, -1, - 64, 71, 72, 65, -1, - 65, 72, 73, 66, -1, - 66, 73, 74, 67, -1, - 67, 74, 75, 68, -1, - 68, 75, 76, 69, -1, - 70, 77, 78, 71, -1, - 71, 78, 79, 72, -1, - 72, 79, 80, 73, -1, - 73, 80, 81, 74, -1, - 74, 81, 82, 75, -1, - 75, 82, 83, 76, -1, - 77, 84, 85, 78, -1, - 78, 85, 86, 79, -1, - 79, 86, 87, 80, -1, - 80, 87, 88, 81, -1, - 81, 88, 89, 82, -1, - 82, 89, 90, 83, -1, - 84, 91, 92, 85, -1, - 85, 92, 93, 86, -1, - 86, 93, 94, 87, -1, - 87, 94, 95, 88, -1, - 88, 95, 96, 89, -1, - 89, 96, 97, 90, -1, - 91, 98, 99, 92, -1, - 92, 99, 100, 93, -1, - 93, 100, 101, 94, -1, - 94, 101, 102, 95, -1, - 95, 102, 103, 96, -1, - 96, 103, 104, 97, -1, - 98, 105, 106, 99, -1, - 99, 106, 107, 100, -1, - 100, 107, 108, 101, -1, - 101, 108, 109, 102, -1, - 102, 109, 110, 103, -1, - 103, 110, 111, 104, -1, - 105, 112, 113, 106, -1, - 106, 113, 114, 107, -1, - 107, 114, 115, 108, -1, - 108, 115, 116, 109, -1, - 109, 116, 117, 110, -1, - 110, 117, 118, 111, -1, - 112, 119, 120, 113, -1, - 113, 120, 121, 114, -1, - 114, 121, 122, 115, -1, - 115, 122, 123, 116, -1, - 116, 123, 124, 117, -1, - 117, 124, 125, 118, -1, - 119, 126, 127, 120, -1, - 120, 127, 128, 121, -1, - 121, 128, 129, 122, -1, - 122, 129, 130, 123, -1, - 123, 130, 131, 124, -1, - 124, 131, 132, 125, -1, - 126, 133, 134, 127, -1, - 127, 134, 135, 128, -1, - 128, 135, 136, 129, -1, - 129, 136, 137, 130, -1, - 130, 137, 138, 131, -1, - 131, 138, 139, 132, -1, - 133, 140, 141, 134, -1, - 134, 141, 142, 135, -1, - 135, 142, 143, 136, -1, - 136, 143, 144, 137, -1, - 137, 144, 145, 138, -1, - 138, 145, 146, 139, -1, - 140, 147, 148, 141, -1, - 141, 148, 149, 142, -1, - 142, 149, 150, 143, -1, - 143, 150, 151, 144, -1, - 144, 151, 152, 145, -1, - 145, 152, 153, 146, -1, - 147, 154, 155, 148, -1, - 148, 155, 156, 149, -1, - 149, 156, 157, 150, -1, - 150, 157, 158, 151, -1, - 151, 158, 159, 152, -1, - 152, 159, 160, 153, -1, - 154, 161, 162, 155, -1, - 155, 162, 163, 156, -1, - 156, 163, 164, 157, -1, - 157, 164, 165, 158, -1, - 158, 165, 166, 159, -1, - 159, 166, 167, 160, -1, - 161, 0, 1, 162, -1, - 162, 1, 2, 163, -1, - 163, 2, 3, 164, -1, - 164, 3, 4, 165, -1, - 165, 4, 5, 166, -1, - 166, 5, 6, 167, -1, - 175, 168, 169, 176, -1, - 176, 169, 170, 177, -1, - 177, 170, 171, 178, -1, - 178, 171, 172, 179, -1, - 179, 172, 173, 180, -1, - 180, 173, 174, 181, -1, - 182, 175, 176, 183, -1, - 183, 176, 177, 184, -1, - 184, 177, 178, 185, -1, - 185, 178, 179, 186, -1, - 186, 179, 180, 187, -1, - 187, 180, 181, 188, -1, - 189, 182, 183, 190, -1, - 190, 183, 184, 191, -1, - 191, 184, 185, 192, -1, - 192, 185, 186, 193, -1, - 193, 186, 187, 194, -1, - 194, 187, 188, 195, -1, - 196, 189, 190, 197, -1, - 197, 190, 191, 198, -1, - 198, 191, 192, 199, -1, - 199, 192, 193, 200, -1, - 200, 193, 194, 201, -1, - 201, 194, 195, 202, -1, - 203, 196, 197, 204, -1, - 204, 197, 198, 205, -1, - 205, 198, 199, 206, -1, - 206, 199, 200, 207, -1, - 207, 200, 201, 208, -1, - 208, 201, 202, 209, -1, - 210, 203, 204, 211, -1, - 211, 204, 205, 212, -1, - 212, 205, 206, 213, -1, - 213, 206, 207, 214, -1, - 214, 207, 208, 215, -1, - 215, 208, 209, 216, -1, - 217, 210, 211, 218, -1, - 218, 211, 212, 219, -1, - 219, 212, 213, 220, -1, - 220, 213, 214, 221, -1, - 221, 214, 215, 222, -1, - 222, 215, 216, 223, -1, - 224, 217, 218, 225, -1, - 225, 218, 219, 226, -1, - 226, 219, 220, 227, -1, - 227, 220, 221, 228, -1, - 228, 221, 222, 229, -1, - 229, 222, 223, 230, -1, - 231, 224, 225, 232, -1, - 232, 225, 226, 233, -1, - 233, 226, 227, 234, -1, - 234, 227, 228, 235, -1, - 235, 228, 229, 236, -1, - 236, 229, 230, 237, -1, - 238, 231, 232, 239, -1, - 239, 232, 233, 240, -1, - 240, 233, 234, 241, -1, - 241, 234, 235, 242, -1, - 242, 235, 236, 243, -1, - 243, 236, 237, 244, -1, - 245, 238, 239, 246, -1, - 246, 239, 240, 247, -1, - 247, 240, 241, 248, -1, - 248, 241, 242, 249, -1, - 249, 242, 243, 250, -1, - 250, 243, 244, 251, -1, - 252, 245, 246, 253, -1, - 253, 246, 247, 254, -1, - 254, 247, 248, 255, -1, - 255, 248, 249, 256, -1, - 256, 249, 250, 257, -1, - 257, 250, 251, 258, -1, - 259, 252, 253, 260, -1, - 260, 253, 254, 261, -1, - 261, 254, 255, 262, -1, - 262, 255, 256, 263, -1, - 263, 256, 257, 264, -1, - 264, 257, 258, 265, -1, - 266, 259, 260, 267, -1, - 267, 260, 261, 268, -1, - 268, 261, 262, 269, -1, - 269, 262, 263, 270, -1, - 270, 263, 264, 271, -1, - 271, 264, 265, 272, -1, - 273, 266, 267, 274, -1, - 274, 267, 268, 275, -1, - 275, 268, 269, 276, -1, - 276, 269, 270, 277, -1, - 277, 270, 271, 278, -1, - 278, 271, 272, 279, -1, - 280, 273, 274, 281, -1, - 281, 274, 275, 282, -1, - 282, 275, 276, 283, -1, - 283, 276, 277, 284, -1, - 284, 277, 278, 285, -1, - 285, 278, 279, 286, -1, - 287, 280, 281, 288, -1, - 288, 281, 282, 289, -1, - 289, 282, 283, 290, -1, - 290, 283, 284, 291, -1, - 291, 284, 285, 292, -1, - 292, 285, 286, 293, -1, - 294, 287, 288, 295, -1, - 295, 288, 289, 296, -1, - 296, 289, 290, 297, -1, - 297, 290, 291, 298, -1, - 298, 291, 292, 299, -1, - 299, 292, 293, 300, -1, - 301, 294, 295, 302, -1, - 302, 295, 296, 303, -1, - 303, 296, 297, 304, -1, - 304, 297, 298, 305, -1, - 305, 298, 299, 306, -1, - 306, 299, 300, 307, -1, - 308, 301, 302, 309, -1, - 309, 302, 303, 310, -1, - 310, 303, 304, 311, -1, - 311, 304, 305, 312, -1, - 312, 305, 306, 313, -1, - 313, 306, 307, 314, -1, - 315, 308, 309, 316, -1, - 316, 309, 310, 317, -1, - 317, 310, 311, 318, -1, - 318, 311, 312, 319, -1, - 319, 312, 313, 320, -1, - 320, 313, 314, 321, -1, - 322, 315, 316, 323, -1, - 323, 316, 317, 324, -1, - 324, 317, 318, 325, -1, - 325, 318, 319, 326, -1, - 326, 319, 320, 327, -1, - 327, 320, 321, 328, -1, - 329, 322, 323, 330, -1, - 330, 323, 324, 331, -1, - 331, 324, 325, 332, -1, - 332, 325, 326, 333, -1, - 333, 326, 327, 334, -1, - 334, 327, 328, 335, -1, - 168, 329, 330, 169, -1, - 169, 330, 331, 170, -1, - 170, 331, 332, 171, -1, - 171, 332, 333, 172, -1, - 172, 333, 334, 173, -1, - 173, 334, 335, 174, -1, - 0, 168, 175, 7, -1, - 13, 181, 174, 6, -1, - 7, 175, 182, 14, -1, - 20, 188, 181, 13, -1, - 14, 182, 189, 21, -1, - 27, 195, 188, 20, -1, - 21, 189, 196, 28, -1, - 34, 202, 195, 27, -1, - 28, 196, 203, 35, -1, - 41, 209, 202, 34, -1, - 35, 203, 210, 42, -1, - 48, 216, 209, 41, -1, - 42, 210, 217, 49, -1, - 55, 223, 216, 48, -1, - 49, 217, 224, 56, -1, - 62, 230, 223, 55, -1, - 56, 224, 231, 63, -1, - 69, 237, 230, 62, -1, - 63, 231, 238, 70, -1, - 76, 244, 237, 69, -1, - 70, 238, 245, 77, -1, - 83, 251, 244, 76, -1, - 77, 245, 252, 84, -1, - 90, 258, 251, 83, -1, - 84, 252, 259, 91, -1, - 97, 265, 258, 90, -1, - 91, 259, 266, 98, -1, - 104, 272, 265, 97, -1, - 98, 266, 273, 105, -1, - 111, 279, 272, 104, -1, - 105, 273, 280, 112, -1, - 118, 286, 279, 111, -1, - 112, 280, 287, 119, -1, - 125, 293, 286, 118, -1, - 119, 287, 294, 126, -1, - 132, 300, 293, 125, -1, - 126, 294, 301, 133, -1, - 139, 307, 300, 132, -1, - 133, 301, 308, 140, -1, - 146, 314, 307, 139, -1, - 140, 308, 315, 147, -1, - 153, 321, 314, 146, -1, - 147, 315, 322, 154, -1, - 160, 328, 321, 153, -1, - 154, 322, 329, 161, -1, - 167, 335, 328, 160, -1, - 161, 329, 168, 0, -1, - 6, 174, 335, 167, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4trap.wrl b/environments/g4py/tests/gtest05/vrml/g4trap.wrl deleted file mode 100644 index f382e3a649..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4trap.wrl +++ /dev/null @@ -1,102 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - -588.082 -419.033 -600, - 11.9181 -419.033 -600, - 252.98 380.967 -600, - -547.02 380.967 -600, - 89.3388 -140.967 600, - 289.339 -140.967 600, - 385.763 179.033 600, - 105.763 179.033 600, - ] - } - coordIndex [ - 0, 3, 2, 1, -1, - 4, 7, 3, 0, -1, - 7, 6, 2, 3, -1, - 6, 5, 1, 2, -1, - 5, 4, 0, 1, -1, - 4, 5, 6, 7, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4trd.wrl b/environments/g4py/tests/gtest05/vrml/g4trd.wrl deleted file mode 100644 index c21a8e1a6f..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4trd.wrl +++ /dev/null @@ -1,102 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - -300 -400 -600, - 300 -400 -600, - 300 400 -600, - -300 400 -600, - -100 -150 600, - 100 -150 600, - 100 150 600, - -100 150 600, - ] - } - coordIndex [ - 0, 3, 2, 1, -1, - 4, 7, 3, 0, -1, - 7, 6, 2, 3, -1, - 6, 5, 1, 2, -1, - 5, 4, 0, 1, -1, - 4, 5, 6, 7, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4tubs.wrl b/environments/g4py/tests/gtest05/vrml/g4tubs.wrl deleted file mode 100644 index 5e574c1088..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4tubs.wrl +++ /dev/null @@ -1,190 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 150 0 200, - 144.889 38.8229 200, - 129.904 75 200, - 106.066 106.066 200, - 75 129.904 200, - 38.8229 144.889 200, - 9.18485e-15 150 200, - -38.8229 144.889 200, - -75 129.904 200, - -106.066 106.066 200, - -129.904 75 200, - -144.889 38.8229 200, - -150 1.83697e-14 200, - 150 0 -200, - 144.889 38.8229 -200, - 129.904 75 -200, - 106.066 106.066 -200, - 75 129.904 -200, - 38.8229 144.889 -200, - 9.18485e-15 150 -200, - -38.8229 144.889 -200, - -75 129.904 -200, - -106.066 106.066 -200, - -129.904 75 -200, - -144.889 38.8229 -200, - -150 1.83697e-14 -200, - 100 0 200, - 96.5926 25.8819 200, - 86.6025 50 200, - 70.7107 70.7107 200, - 50 86.6025 200, - 25.8819 96.5926 200, - 6.12323e-15 100 200, - -25.8819 96.5926 200, - -50 86.6025 200, - -70.7107 70.7107 200, - -86.6025 50 200, - -96.5926 25.8819 200, - -100 1.22465e-14 200, - 100 0 -200, - 96.5926 25.8819 -200, - 86.6025 50 -200, - 70.7107 70.7107 -200, - 50 86.6025 -200, - 25.8819 96.5926 -200, - 6.12323e-15 100 -200, - -25.8819 96.5926 -200, - -50 86.6025 -200, - -70.7107 70.7107 -200, - -86.6025 50 -200, - -96.5926 25.8819 -200, - -100 1.22465e-14 -200, - ] - } - coordIndex [ - 0, 13, 14, 1, -1, - 1, 14, 15, 2, -1, - 2, 15, 16, 3, -1, - 3, 16, 17, 4, -1, - 4, 17, 18, 5, -1, - 5, 18, 19, 6, -1, - 6, 19, 20, 7, -1, - 7, 20, 21, 8, -1, - 8, 21, 22, 9, -1, - 9, 22, 23, 10, -1, - 10, 23, 24, 11, -1, - 11, 24, 25, 12, -1, - 39, 26, 27, 40, -1, - 40, 27, 28, 41, -1, - 41, 28, 29, 42, -1, - 42, 29, 30, 43, -1, - 43, 30, 31, 44, -1, - 44, 31, 32, 45, -1, - 45, 32, 33, 46, -1, - 46, 33, 34, 47, -1, - 47, 34, 35, 48, -1, - 48, 35, 36, 49, -1, - 49, 36, 37, 50, -1, - 50, 37, 38, 51, -1, - 26, 0, 1, 27, -1, - 27, 1, 2, 28, -1, - 28, 2, 3, 29, -1, - 29, 3, 4, 30, -1, - 30, 4, 5, 31, -1, - 31, 5, 6, 32, -1, - 32, 6, 7, 33, -1, - 33, 7, 8, 34, -1, - 34, 8, 9, 35, -1, - 35, 9, 10, 36, -1, - 36, 10, 11, 37, -1, - 37, 11, 12, 38, -1, - 13, 39, 40, 14, -1, - 14, 40, 41, 15, -1, - 15, 41, 42, 16, -1, - 16, 42, 43, 17, -1, - 17, 43, 44, 18, -1, - 18, 44, 45, 19, -1, - 19, 45, 46, 20, -1, - 20, 46, 47, 21, -1, - 21, 47, 48, 22, -1, - 22, 48, 49, 23, -1, - 23, 49, 50, 24, -1, - 24, 50, 51, 25, -1, - 0, 26, 39, 13, -1, - 25, 51, 38, 12, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4twistedbox.wrl b/environments/g4py/tests/gtest05/vrml/g4twistedbox.wrl deleted file mode 100644 index 085b2c147e..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4twistedbox.wrl +++ /dev/null @@ -1,198 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - -393.305 -308.725 -600, - -200.12 -360.488 -600, - -6.93504 -412.252 -600, - 186.25 -464.016 -600, - -324.287 -51.1444 -600, - -131.102 -102.908 -600, - 62.0834 -154.672 -600, - 255.269 -206.436 -600, - -255.269 206.436 -600, - -62.0834 154.672 -600, - 131.102 102.908 -600, - 324.287 51.1444 -600, - -186.25 464.016 -600, - 6.93504 412.252 -600, - 200.12 360.488 -600, - 393.305 308.725 -600, - -186.25 -464.016 600, - 6.93504 -412.252 600, - 200.12 -360.488 600, - 393.305 -308.725 600, - -255.269 -206.436 600, - -62.0834 -154.672 600, - 131.102 -102.908 600, - 324.287 -51.1444 600, - -324.287 51.1444 600, - -131.102 102.908 600, - 62.0834 154.672 600, - 255.269 206.436 600, - -393.305 308.725 600, - -200.12 360.488 600, - -6.93504 412.252 600, - 186.25 464.016 600, - -333.721 -372.331 -200, - -134.482 -389.762 -200, - 64.7572 -407.193 -200, - 263.996 -424.625 -200, - 287.238 -158.973 -200, - 310.479 106.679 -200, - 333.721 372.331 -200, - 134.482 389.762 -200, - -64.7572 407.193 -200, - -263.996 424.625 -200, - -287.238 158.973 -200, - -310.479 -106.679 -200, - -263.996 -424.625 200, - -64.7572 -407.193 200, - 134.482 -389.762 200, - 333.721 -372.331 200, - 310.479 -106.679 200, - 287.238 158.973 200, - 263.996 424.625 200, - 64.7572 407.193 200, - -134.482 389.762 200, - -333.721 372.331 200, - -310.479 106.679 200, - -287.238 -158.973 200, - ] - } - coordIndex [ - 0, 4, 5, 1, -1, - 1, 5, 6, 2, -1, - 2, 6, 7, 3, -1, - 4, 8, 9, 5, -1, - 5, 9, 10, 6, -1, - 6, 10, 11, 7, -1, - 8, 12, 13, 9, -1, - 9, 13, 14, 10, -1, - 10, 14, 15, 11, -1, - 16, 17, 21, 20, -1, - 17, 18, 22, 21, -1, - 18, 19, 23, 22, -1, - 20, 21, 25, 24, -1, - 21, 22, 26, 25, -1, - 22, 23, 27, 26, -1, - 24, 25, 29, 28, -1, - 25, 26, 30, 29, -1, - 26, 27, 31, 30, -1, - 0, 1, 33, 32, -1, - 1, 2, 34, 33, -1, - 2, 3, 35, 34, -1, - 32, 33, 45, 44, -1, - 33, 34, 46, 45, -1, - 34, 35, 47, 46, -1, - 44, 45, 17, 16, -1, - 45, 46, 18, 17, -1, - 46, 47, 19, 18, -1, - 3, 7, 36, 35, -1, - 7, 11, 37, 36, -1, - 11, 15, 38, 37, -1, - 35, 36, 48, 47, -1, - 36, 37, 49, 48, -1, - 37, 38, 50, 49, -1, - 47, 48, 23, 19, -1, - 48, 49, 27, 23, -1, - 49, 50, 31, 27, -1, - 15, 14, 39, 38, -1, - 14, 13, 40, 39, -1, - 13, 12, 41, 40, -1, - 38, 39, 51, 50, -1, - 39, 40, 52, 51, -1, - 40, 41, 53, 52, -1, - 50, 51, 30, 31, -1, - 51, 52, 29, 30, -1, - 52, 53, 28, 29, -1, - 12, 8, 42, 41, -1, - 8, 4, 43, 42, -1, - 4, 0, 32, 43, -1, - 41, 42, 54, 53, -1, - 42, 43, 55, 54, -1, - 43, 32, 44, 55, -1, - 53, 54, 24, 28, -1, - 54, 55, 20, 24, -1, - 55, 44, 16, 20, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4twistedtrap.wrl b/environments/g4py/tests/gtest05/vrml/g4twistedtrap.wrl deleted file mode 100644 index 65b84140fa..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4twistedtrap.wrl +++ /dev/null @@ -1,198 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - -678.984 -309.503 -600, - -485.799 -361.267 -600, - -292.614 -413.031 -600, - -99.4285 -464.795 -600, - -596.745 -55.4654 -600, - -382.095 -112.981 -600, - -167.444 -170.496 -600, - 47.2058 -228.011 -600, - -514.506 198.572 -600, - -278.39 135.305 -600, - -42.2752 72.0385 -600, - 193.84 8.77163 -600, - -432.266 452.61 -600, - -174.686 383.592 -600, - 82.8941 314.573 -600, - 340.474 245.555 -600, - 135.119 -168.699 600, - 199.514 -151.444 600, - 263.909 -134.189 600, - 328.304 -116.935 600, - 112.8 -64.2496 600, - 185.781 -44.6944 600, - 258.762 -25.1391 600, - 331.743 -5.58392 600, - 90.4805 40.1995 600, - 172.048 62.0553 600, - 253.615 83.9112 600, - 335.182 105.767 600, - 68.1615 144.649 600, - 158.315 168.805 600, - 248.468 192.961 600, - 338.621 217.118 600, - -389.062 -299.873 -200, - -234.099 -313.43 -200, - -79.135 -326.988 -200, - 75.8286 -340.545 -200, - 158.46 -133.626 -200, - 241.092 73.2925 -200, - 323.724 280.211 -200, - 115.63 298.417 -200, - -92.4643 316.623 -200, - -300.558 334.829 -200, - -330.06 123.262 -200, - -359.561 -88.3055 -200, - -114.755 -250.957 200, - -4.06717 -241.273 200, - 106.621 -231.589 200, - 217.309 -221.905 200, - 251.393 -58.3115 200, - 285.477 105.282 200, - 319.561 268.875 200, - 169.025 255.705 200, - 18.4891 242.534 200, - -132.047 229.364 200, - -126.283 69.2572 200, - -120.519 -90.8497 200, - ] - } - coordIndex [ - 0, 4, 5, 1, -1, - 1, 5, 6, 2, -1, - 2, 6, 7, 3, -1, - 4, 8, 9, 5, -1, - 5, 9, 10, 6, -1, - 6, 10, 11, 7, -1, - 8, 12, 13, 9, -1, - 9, 13, 14, 10, -1, - 10, 14, 15, 11, -1, - 16, 17, 21, 20, -1, - 17, 18, 22, 21, -1, - 18, 19, 23, 22, -1, - 20, 21, 25, 24, -1, - 21, 22, 26, 25, -1, - 22, 23, 27, 26, -1, - 24, 25, 29, 28, -1, - 25, 26, 30, 29, -1, - 26, 27, 31, 30, -1, - 0, 1, 33, 32, -1, - 1, 2, 34, 33, -1, - 2, 3, 35, 34, -1, - 32, 33, 45, 44, -1, - 33, 34, 46, 45, -1, - 34, 35, 47, 46, -1, - 44, 45, 17, 16, -1, - 45, 46, 18, 17, -1, - 46, 47, 19, 18, -1, - 3, 7, 36, 35, -1, - 7, 11, 37, 36, -1, - 11, 15, 38, 37, -1, - 35, 36, 48, 47, -1, - 36, 37, 49, 48, -1, - 37, 38, 50, 49, -1, - 47, 48, 23, 19, -1, - 48, 49, 27, 23, -1, - 49, 50, 31, 27, -1, - 15, 14, 39, 38, -1, - 14, 13, 40, 39, -1, - 13, 12, 41, 40, -1, - 38, 39, 51, 50, -1, - 39, 40, 52, 51, -1, - 40, 41, 53, 52, -1, - 50, 51, 30, 31, -1, - 51, 52, 29, 30, -1, - 52, 53, 28, 29, -1, - 12, 8, 42, 41, -1, - 8, 4, 43, 42, -1, - 4, 0, 32, 43, -1, - 41, 42, 54, 53, -1, - 42, 43, 55, 54, -1, - 43, 32, 44, 55, -1, - 53, 54, 24, 28, -1, - 54, 55, 20, 24, -1, - 55, 44, 16, 20, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4twistedtrd.wrl b/environments/g4py/tests/gtest05/vrml/g4twistedtrd.wrl deleted file mode 100644 index 2920326f90..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4twistedtrd.wrl +++ /dev/null @@ -1,198 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - -393.305 -308.725 -600, - -200.12 -360.488 -600, - -6.93504 -412.252 -600, - 186.25 -464.016 -600, - -324.287 -51.1444 -600, - -131.102 -102.908 -600, - 62.0834 -154.672 -600, - 255.269 -206.436 -600, - -255.269 206.436 -600, - -62.0834 154.672 -600, - 131.102 102.908 -600, - 324.287 51.1444 -600, - -186.25 464.016 -600, - 6.93504 412.252 -600, - 200.12 360.488 -600, - 393.305 308.725 -600, - -57.7697 -170.771 600, - 6.62533 -153.516 600, - 71.0204 -136.262 600, - 135.415 -119.007 600, - -83.6516 -74.1782 600, - -19.2566 -56.9236 600, - 45.1385 -39.669 600, - 109.534 -22.4144 600, - -109.534 22.4144 600, - -45.1385 39.669 600, - 19.2566 56.9236 600, - 83.6516 74.1782 600, - -135.415 119.007 600, - -71.0204 136.262 600, - -6.62533 153.516 600, - 57.7697 170.771 600, - -260.045 -295.125 -200, - -105.081 -308.683 -200, - 49.8825 -322.24 -200, - 204.846 -335.798 -200, - 223.246 -125.49 -200, - 241.645 84.8175 -200, - 260.045 295.125 -200, - 105.081 308.683 -200, - -49.8825 322.24 -200, - -204.846 335.798 -200, - -223.246 125.49 -200, - -241.645 -84.8175 -200, - -145.696 -246.971 200, - -35.0078 -237.287 200, - 75.6805 -227.603 200, - 186.369 -217.919 200, - 172.811 -62.9559 200, - 159.254 92.0078 200, - 145.696 246.971 200, - 35.0078 237.287 200, - -75.6805 227.603 200, - -186.369 217.919 200, - -172.811 62.9559 200, - -159.254 -92.0078 200, - ] - } - coordIndex [ - 0, 4, 5, 1, -1, - 1, 5, 6, 2, -1, - 2, 6, 7, 3, -1, - 4, 8, 9, 5, -1, - 5, 9, 10, 6, -1, - 6, 10, 11, 7, -1, - 8, 12, 13, 9, -1, - 9, 13, 14, 10, -1, - 10, 14, 15, 11, -1, - 16, 17, 21, 20, -1, - 17, 18, 22, 21, -1, - 18, 19, 23, 22, -1, - 20, 21, 25, 24, -1, - 21, 22, 26, 25, -1, - 22, 23, 27, 26, -1, - 24, 25, 29, 28, -1, - 25, 26, 30, 29, -1, - 26, 27, 31, 30, -1, - 0, 1, 33, 32, -1, - 1, 2, 34, 33, -1, - 2, 3, 35, 34, -1, - 32, 33, 45, 44, -1, - 33, 34, 46, 45, -1, - 34, 35, 47, 46, -1, - 44, 45, 17, 16, -1, - 45, 46, 18, 17, -1, - 46, 47, 19, 18, -1, - 3, 7, 36, 35, -1, - 7, 11, 37, 36, -1, - 11, 15, 38, 37, -1, - 35, 36, 48, 47, -1, - 36, 37, 49, 48, -1, - 37, 38, 50, 49, -1, - 47, 48, 23, 19, -1, - 48, 49, 27, 23, -1, - 49, 50, 31, 27, -1, - 15, 14, 39, 38, -1, - 14, 13, 40, 39, -1, - 13, 12, 41, 40, -1, - 38, 39, 51, 50, -1, - 39, 40, 52, 51, -1, - 40, 41, 53, 52, -1, - 50, 51, 30, 31, -1, - 51, 52, 29, 30, -1, - 52, 53, 28, 29, -1, - 12, 8, 42, 41, -1, - 8, 4, 43, 42, -1, - 4, 0, 32, 43, -1, - 41, 42, 54, 53, -1, - 42, 43, 55, 54, -1, - 43, 32, 44, 55, -1, - 53, 54, 24, 28, -1, - 54, 55, 20, 24, -1, - 55, 44, 16, 20, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest05/vrml/g4twistedtubs.wrl b/environments/g4py/tests/gtest05/vrml/g4twistedtubs.wrl deleted file mode 100644 index 017efc4bef..0000000000 --- a/environments/g4py/tests/gtest05/vrml/g4twistedtubs.wrl +++ /dev/null @@ -1,566 +0,0 @@ -#VRML V2.0 utf8 -# Generated by VRML 2.0 driver of GEANT4 - - -#---------- CAMERA -Viewpoint { - position 0 0 452.607 -} - -#---------- SOLID: dummy.0 - Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 1 - transparency 0.7 - } - } - geometry IndexedFaceSet { - coord Coordinate { - point [ - 25.8819 -96.5926 -200, - 46.7269 -88.4115 -200, - 65.2287 -75.7972 -200, - 80.4598 -59.382 -200, - 91.6562 -39.9892 -200, - 98.2566 -18.5912 -200, - 99.9301 3.73912 -200, - 96.5926 25.8819 -200, - 27.7306 -103.492 -200, - 50.0645 -94.7266 -200, - 69.8879 -81.2113 -200, - 86.2069 -63.6236 -200, - 98.2031 -42.8456 -200, - 105.275 -19.9191 -200, - 107.068 4.0062 -200, - 103.492 27.7306 -200, - 29.5793 -110.392 -200, - 53.4021 -101.042 -200, - 74.5471 -86.6253 -200, - 91.954 -67.8652 -200, - 104.75 -45.7019 -200, - 112.293 -21.247 -200, - 114.206 4.27328 -200, - 110.392 29.5793 -200, - 31.428 -117.291 -200, - 56.7398 -107.357 -200, - 79.2063 -92.0394 -200, - 97.7012 -72.1067 -200, - 111.297 -48.5583 -200, - 119.312 -22.575 -200, - 121.344 4.54036 -200, - 117.291 31.428 -200, - 33.2767 -124.19 -200, - 60.0774 -113.672 -200, - 83.8655 -97.4535 -200, - 103.448 -76.3483 -200, - 117.844 -51.4147 -200, - 126.33 -23.9029 -200, - 128.482 4.80744 -200, - 124.19 33.2767 -200, - 35.1254 -131.09 -200, - 63.415 -119.987 -200, - 88.5247 -102.868 -200, - 109.195 -80.5899 -200, - 124.391 -54.2711 -200, - 133.348 -25.2309 -200, - 135.619 5.07452 -200, - 131.09 35.1254 -200, - 36.9741 -137.989 -200, - 66.7527 -126.302 -200, - 93.1839 -108.282 -200, - 114.943 -84.8315 -200, - 130.937 -57.1274 -200, - 140.367 -26.5588 -200, - 142.757 5.3416 -200, - 137.989 36.9741 -200, - 38.8229 -144.889 -200, - 70.0903 -132.617 -200, - 97.8431 -113.696 -200, - 120.69 -89.073 -200, - 137.484 -59.9838 -200, - 147.385 -27.8867 -200, - 149.895 5.60868 -200, - 144.889 38.8229 -200, - 96.5926 -25.8819 200, - 99.9301 -3.73912 200, - 98.2566 18.5912 200, - 91.6562 39.9892 200, - 80.4598 59.382 200, - 65.2287 75.7972 200, - 46.7269 88.4115 200, - 25.8819 96.5926 200, - 103.492 -27.7306 200, - 107.068 -4.0062 200, - 105.275 19.9191 200, - 98.2031 42.8456 200, - 86.2069 63.6236 200, - 69.8879 81.2113 200, - 50.0645 94.7266 200, - 27.7306 103.492 200, - 110.392 -29.5793 200, - 114.206 -4.27328 200, - 112.293 21.247 200, - 104.75 45.7019 200, - 91.954 67.8652 200, - 74.5471 86.6253 200, - 53.4021 101.042 200, - 29.5793 110.392 200, - 117.291 -31.428 200, - 121.344 -4.54036 200, - 119.312 22.575 200, - 111.297 48.5583 200, - 97.7012 72.1067 200, - 79.2063 92.0394 200, - 56.7398 107.357 200, - 31.428 117.291 200, - 124.19 -33.2767 200, - 128.482 -4.80744 200, - 126.33 23.9029 200, - 117.844 51.4147 200, - 103.448 76.3483 200, - 83.8655 97.4535 200, - 60.0774 113.672 200, - 33.2767 124.19 200, - 131.09 -35.1254 200, - 135.619 -5.07452 200, - 133.348 25.2309 200, - 124.391 54.2711 200, - 109.195 80.5899 200, - 88.5247 102.868 200, - 63.415 119.987 200, - 35.1254 131.09 200, - 137.989 -36.9741 200, - 142.757 -5.3416 200, - 140.367 26.5588 200, - 130.937 57.1274 200, - 114.943 84.8315 200, - 93.1839 108.282 200, - 66.7527 126.302 200, - 36.9741 137.989 200, - 144.889 -38.8229 200, - 149.895 -5.60868 200, - 147.385 27.8867 200, - 137.484 59.9838 200, - 120.69 89.073 200, - 97.8431 113.696 200, - 70.0903 132.617 200, - 38.8229 144.889 200, - 40.024 -82.4504 -120, - 57.3675 -71.4771 -120, - 71.8343 -56.9195 -120, - 82.6991 -39.5078 -120, - 89.4169 -20.115 -120, - 91.6511 0.286506 -120, - 89.2894 20.6736 -120, - 82.4504 40.024 -120, - 88.3398 42.8829 -120, - 94.2291 45.7418 -120, - 100.118 48.6006 -120, - 106.008 51.4595 -120, - 111.897 54.3183 -120, - 117.786 57.1772 -120, - 123.676 60.0361 -120, - 133.934 31.0104 -120, - 137.477 0.429759 -120, - 134.125 -30.1724 -120, - 124.049 -59.2617 -120, - 107.751 -85.3793 -120, - 86.0513 -107.216 -120, - 60.0361 -123.676 -120, - 57.1772 -117.786 -120, - 54.3183 -111.897 -120, - 51.4595 -106.008 -120, - 48.6006 -100.118 -120, - 45.7418 -94.2291 -120, - 42.8829 -88.3398 -120, - 54.1662 -68.3083 -40, - 68.0081 -54.5426 -40, - 78.4399 -38.0418 -40, - 84.9384 -19.6335 -40, - 87.1776 -0.240714 -40, - 85.0455 19.1642 -40, - 78.6488 37.6081 -40, - 68.3083 54.1662 -40, - 73.1875 58.0352 -40, - 78.0666 61.9042 -40, - 82.9458 65.7732 -40, - 87.825 69.6422 -40, - 92.7041 73.5112 -40, - 97.5833 77.3803 -40, - 102.462 81.2493 -40, - 117.973 56.4121 -40, - 127.568 28.7463 -40, - 130.766 -0.361071 -40, - 127.408 -29.4503 -40, - 117.66 -57.0628 -40, - 102.012 -81.8139 -40, - 81.2493 -102.462 -40, - 77.3803 -97.5833 -40, - 73.5112 -92.7041 -40, - 69.6422 -87.825 -40, - 65.7732 -82.9458 -40, - 61.9042 -78.0666 -40, - 58.0352 -73.1875 -40, - 68.3083 -54.1662 40, - 78.6488 -37.6081 40, - 85.0455 -19.1642 40, - 87.1776 0.240714 40, - 84.9384 19.6335 40, - 78.4399 38.0418 40, - 68.0081 54.5426 40, - 54.1662 68.3083 40, - 58.0352 73.1875 40, - 61.9042 78.0666 40, - 65.7732 82.9458 40, - 69.6422 87.825 40, - 73.5112 92.7041 40, - 77.3803 97.5833 40, - 81.2493 102.462 40, - 102.012 81.8139 40, - 117.66 57.0628 40, - 127.408 29.4503 40, - 130.766 0.361071 40, - 127.568 -28.7463 40, - 117.973 -56.4121 40, - 102.462 -81.2493 40, - 97.5833 -77.3803 40, - 92.7041 -73.5112 40, - 87.825 -69.6422 40, - 82.9458 -65.7732 40, - 78.0666 -61.9042 40, - 73.1875 -58.0352 40, - 82.4504 -40.024 120, - 89.2894 -20.6736 120, - 91.6511 -0.286506 120, - 89.4169 20.115 120, - 82.6991 39.5078 120, - 71.8343 56.9195 120, - 57.3675 71.4771 120, - 40.024 82.4504 120, - 42.8829 88.3398 120, - 45.7418 94.2291 120, - 48.6006 100.118 120, - 51.4595 106.008 120, - 54.3183 111.897 120, - 57.1772 117.786 120, - 60.0361 123.676 120, - 86.0513 107.216 120, - 107.751 85.3793 120, - 124.049 59.2617 120, - 134.125 30.1724 120, - 137.477 -0.429759 120, - 133.934 -31.0104 120, - 123.676 -60.0361 120, - 117.786 -57.1772 120, - 111.897 -54.3183 120, - 106.008 -51.4595 120, - 100.118 -48.6006 120, - 94.2291 -45.7418 120, - 88.3398 -42.8829 120, - ] - } - coordIndex [ - 0, 1, 9, 8, -1, - 1, 2, 10, 9, -1, - 2, 3, 11, 10, -1, - 3, 4, 12, 11, -1, - 4, 5, 13, 12, -1, - 5, 6, 14, 13, -1, - 6, 7, 15, 14, -1, - 8, 9, 17, 16, -1, - 9, 10, 18, 17, -1, - 10, 11, 19, 18, -1, - 11, 12, 20, 19, -1, - 12, 13, 21, 20, -1, - 13, 14, 22, 21, -1, - 14, 15, 23, 22, -1, - 16, 17, 25, 24, -1, - 17, 18, 26, 25, -1, - 18, 19, 27, 26, -1, - 19, 20, 28, 27, -1, - 20, 21, 29, 28, -1, - 21, 22, 30, 29, -1, - 22, 23, 31, 30, -1, - 24, 25, 33, 32, -1, - 25, 26, 34, 33, -1, - 26, 27, 35, 34, -1, - 27, 28, 36, 35, -1, - 28, 29, 37, 36, -1, - 29, 30, 38, 37, -1, - 30, 31, 39, 38, -1, - 32, 33, 41, 40, -1, - 33, 34, 42, 41, -1, - 34, 35, 43, 42, -1, - 35, 36, 44, 43, -1, - 36, 37, 45, 44, -1, - 37, 38, 46, 45, -1, - 38, 39, 47, 46, -1, - 40, 41, 49, 48, -1, - 41, 42, 50, 49, -1, - 42, 43, 51, 50, -1, - 43, 44, 52, 51, -1, - 44, 45, 53, 52, -1, - 45, 46, 54, 53, -1, - 46, 47, 55, 54, -1, - 48, 49, 57, 56, -1, - 49, 50, 58, 57, -1, - 50, 51, 59, 58, -1, - 51, 52, 60, 59, -1, - 52, 53, 61, 60, -1, - 53, 54, 62, 61, -1, - 54, 55, 63, 62, -1, - 64, 72, 73, 65, -1, - 65, 73, 74, 66, -1, - 66, 74, 75, 67, -1, - 67, 75, 76, 68, -1, - 68, 76, 77, 69, -1, - 69, 77, 78, 70, -1, - 70, 78, 79, 71, -1, - 72, 80, 81, 73, -1, - 73, 81, 82, 74, -1, - 74, 82, 83, 75, -1, - 75, 83, 84, 76, -1, - 76, 84, 85, 77, -1, - 77, 85, 86, 78, -1, - 78, 86, 87, 79, -1, - 80, 88, 89, 81, -1, - 81, 89, 90, 82, -1, - 82, 90, 91, 83, -1, - 83, 91, 92, 84, -1, - 84, 92, 93, 85, -1, - 85, 93, 94, 86, -1, - 86, 94, 95, 87, -1, - 88, 96, 97, 89, -1, - 89, 97, 98, 90, -1, - 90, 98, 99, 91, -1, - 91, 99, 100, 92, -1, - 92, 100, 101, 93, -1, - 93, 101, 102, 94, -1, - 94, 102, 103, 95, -1, - 96, 104, 105, 97, -1, - 97, 105, 106, 98, -1, - 98, 106, 107, 99, -1, - 99, 107, 108, 100, -1, - 100, 108, 109, 101, -1, - 101, 109, 110, 102, -1, - 102, 110, 111, 103, -1, - 104, 112, 113, 105, -1, - 105, 113, 114, 106, -1, - 106, 114, 115, 107, -1, - 107, 115, 116, 108, -1, - 108, 116, 117, 109, -1, - 109, 117, 118, 110, -1, - 110, 118, 119, 111, -1, - 112, 120, 121, 113, -1, - 113, 121, 122, 114, -1, - 114, 122, 123, 115, -1, - 115, 123, 124, 116, -1, - 116, 124, 125, 117, -1, - 117, 125, 126, 118, -1, - 118, 126, 127, 119, -1, - 0, 128, 129, 1, -1, - 1, 129, 130, 2, -1, - 2, 130, 131, 3, -1, - 3, 131, 132, 4, -1, - 4, 132, 133, 5, -1, - 5, 133, 134, 6, -1, - 6, 134, 135, 7, -1, - 128, 156, 157, 129, -1, - 129, 157, 158, 130, -1, - 130, 158, 159, 131, -1, - 131, 159, 160, 132, -1, - 132, 160, 161, 133, -1, - 133, 161, 162, 134, -1, - 134, 162, 163, 135, -1, - 156, 184, 185, 157, -1, - 157, 185, 186, 158, -1, - 158, 186, 187, 159, -1, - 159, 187, 188, 160, -1, - 160, 188, 189, 161, -1, - 161, 189, 190, 162, -1, - 162, 190, 191, 163, -1, - 184, 212, 213, 185, -1, - 185, 213, 214, 186, -1, - 186, 214, 215, 187, -1, - 187, 215, 216, 188, -1, - 188, 216, 217, 189, -1, - 189, 217, 218, 190, -1, - 190, 218, 219, 191, -1, - 212, 64, 65, 213, -1, - 213, 65, 66, 214, -1, - 214, 66, 67, 215, -1, - 215, 67, 68, 216, -1, - 216, 68, 69, 217, -1, - 217, 69, 70, 218, -1, - 218, 70, 71, 219, -1, - 7, 135, 136, 15, -1, - 15, 136, 137, 23, -1, - 23, 137, 138, 31, -1, - 31, 138, 139, 39, -1, - 39, 139, 140, 47, -1, - 47, 140, 141, 55, -1, - 55, 141, 142, 63, -1, - 135, 163, 164, 136, -1, - 136, 164, 165, 137, -1, - 137, 165, 166, 138, -1, - 138, 166, 167, 139, -1, - 139, 167, 168, 140, -1, - 140, 168, 169, 141, -1, - 141, 169, 170, 142, -1, - 163, 191, 192, 164, -1, - 164, 192, 193, 165, -1, - 165, 193, 194, 166, -1, - 166, 194, 195, 167, -1, - 167, 195, 196, 168, -1, - 168, 196, 197, 169, -1, - 169, 197, 198, 170, -1, - 191, 219, 220, 192, -1, - 192, 220, 221, 193, -1, - 193, 221, 222, 194, -1, - 194, 222, 223, 195, -1, - 195, 223, 224, 196, -1, - 196, 224, 225, 197, -1, - 197, 225, 226, 198, -1, - 219, 71, 79, 220, -1, - 220, 79, 87, 221, -1, - 221, 87, 95, 222, -1, - 222, 95, 103, 223, -1, - 223, 103, 111, 224, -1, - 224, 111, 119, 225, -1, - 225, 119, 127, 226, -1, - 63, 142, 143, 62, -1, - 62, 143, 144, 61, -1, - 61, 144, 145, 60, -1, - 60, 145, 146, 59, -1, - 59, 146, 147, 58, -1, - 58, 147, 148, 57, -1, - 57, 148, 149, 56, -1, - 142, 170, 171, 143, -1, - 143, 171, 172, 144, -1, - 144, 172, 173, 145, -1, - 145, 173, 174, 146, -1, - 146, 174, 175, 147, -1, - 147, 175, 176, 148, -1, - 148, 176, 177, 149, -1, - 170, 198, 199, 171, -1, - 171, 199, 200, 172, -1, - 172, 200, 201, 173, -1, - 173, 201, 202, 174, -1, - 174, 202, 203, 175, -1, - 175, 203, 204, 176, -1, - 176, 204, 205, 177, -1, - 198, 226, 227, 199, -1, - 199, 227, 228, 200, -1, - 200, 228, 229, 201, -1, - 201, 229, 230, 202, -1, - 202, 230, 231, 203, -1, - 203, 231, 232, 204, -1, - 204, 232, 233, 205, -1, - 226, 127, 126, 227, -1, - 227, 126, 125, 228, -1, - 228, 125, 124, 229, -1, - 229, 124, 123, 230, -1, - 230, 123, 122, 231, -1, - 231, 122, 121, 232, -1, - 232, 121, 120, 233, -1, - 56, 149, 150, 48, -1, - 48, 150, 151, 40, -1, - 40, 151, 152, 32, -1, - 32, 152, 153, 24, -1, - 24, 153, 154, 16, -1, - 16, 154, 155, 8, -1, - 8, 155, 128, 0, -1, - 149, 177, 178, 150, -1, - 150, 178, 179, 151, -1, - 151, 179, 180, 152, -1, - 152, 180, 181, 153, -1, - 153, 181, 182, 154, -1, - 154, 182, 183, 155, -1, - 155, 183, 156, 128, -1, - 177, 205, 206, 178, -1, - 178, 206, 207, 179, -1, - 179, 207, 208, 180, -1, - 180, 208, 209, 181, -1, - 181, 209, 210, 182, -1, - 182, 210, 211, 183, -1, - 183, 211, 184, 156, -1, - 205, 233, 234, 206, -1, - 206, 234, 235, 207, -1, - 207, 235, 236, 208, -1, - 208, 236, 237, 209, -1, - 209, 237, 238, 210, -1, - 210, 238, 239, 211, -1, - 211, 239, 212, 184, -1, - 233, 120, 112, 234, -1, - 234, 112, 104, 235, -1, - 235, 104, 96, 236, -1, - 236, 96, 88, 237, -1, - 237, 88, 80, 238, -1, - 238, 80, 72, 239, -1, - 239, 72, 64, 212, -1, - ] - solid FALSE - } - } -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 1 0 0 - emissiveColor 1 0 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 100 0 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 1 0 - emissiveColor 0 1 0 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 100 0, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#---------- POLYLINE -Shape { - appearance Appearance { - material Material { - diffuseColor 0 0 1 - emissiveColor 0 0 1 - } - } - geometry IndexedLineSet { - coord Coordinate { - point [ - 0 0 0, - 0 0 100, - ] - } - coordIndex [ - 0, 1, -1 - ] - } -} -#End of file. diff --git a/environments/g4py/tests/gtest06/CMakeLists.txt b/environments/g4py/tests/gtest06/CMakeLists.txt deleted file mode 100644 index 79daaa6852..0000000000 --- a/environments/g4py/tests/gtest06/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -configure_file(test.py test.py) -add_test(NAME geant4py-test06 COMMAND ${PYTHON_EXECUTABLE} test.py) -set_tests_properties(geant4py-test06 PROPERTIES ENVIRONMENT "PYTHONPATH=${GEANT4_PYTHON_OUTPUT_DIR};${GEANT4_TEST_ENVIRONMENT}") diff --git a/environments/g4py/tests/gtest06/jpg/intersection.jpg b/environments/g4py/tests/gtest06/jpg/intersection.jpg deleted file mode 100644 index 4d63759d6760643f10018aa428aeda0166c86102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18138 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 TZ3BPXz~46T|2G?e>`(j;U`DYo diff --git a/environments/g4py/tests/gtest06/jpg/subtraction.jpg b/environments/g4py/tests/gtest06/jpg/subtraction.jpg deleted file mode 100644 index 6e06dbd2827b041c050a4a88d74fc3bb460d47fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31923 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 diff --git a/environments/g4py/tests/gtest06/jpg/union.jpg b/environments/g4py/tests/gtest06/jpg/union.jpg deleted file mode 100644 index 4ff0a7272ceb43a907259ede0c1d5ee591827bea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30020 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 Uf3C+rXW*YR@Hd_T*oX1|1lTzi$N&HU diff --git a/environments/g4py/tests/gtest06/test.py b/environments/g4py/tests/gtest06/test.py deleted file mode 100755 index aece738511..0000000000 --- a/environments/g4py/tests/gtest06/test.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/python3 -# ================================================================== -# python script for Geant4Py test -# -# gtest06 -# - test for constructing/visualizing boolean geoemtries -# ================================================================== -from Geant4 import * -import g4pytest.ExN01pl, g4pytest.ParticleGun - -# ================================================================== -# user actions in python -# ================================================================== -class MyDetectorConstruction(G4VUserDetectorConstruction): - "My Detector Construction" - - def __init__(self): - G4VUserDetectorConstruction.__init__(self) - self.air= gNistManager.FindOrBuildMaterial("G4_AIR") - self.lv_object= None - self.world= self.ConstructWorld() - - self.va_red= G4VisAttributes(G4Color(1.,0.,0.)) - self.va_cyan= G4VisAttributes(G4Color(0.,1.,1.)) - self.va_green= G4VisAttributes(G4Color(0.,1.,0.)) - self.va_blue= G4VisAttributes(G4Color(0.,0.,1.)) - self.va_magenta= G4VisAttributes(G4Color(1.,0.,1.)) - - self.sld_box= G4Box("box",20.*cm, 20.*cm, 20.*cm); - self.sld_cyl= G4Tubs("cylinder",0., 10.*cm, 30.*cm, 0., twopi) - - # ----------------------------------------------------------------- - def ConstructWorld(self): - # Python has automatic garbage collection system. - # Geometry objects must be defined as GLOBAL not to be deleted. - global sld_world, lv_world, pv_world, va_world - - sld_world= G4Box("world", 1.*m, 1.*m, 1.*m) - lv_world= G4LogicalVolume(sld_world, self.air, "world") - pv_world= G4PVPlacement(G4Transform3D(), lv_world, "world", - None, False, 0) - - va_world= G4VisAttributes() - va_world.SetVisibility(False) - lv_world.SetVisAttributes(va_world) - - # solid object (dummy) - global sld_sld, lv_sld, pv_sld - sld_sld= G4Box("dummy", 10.*cm, 10.*cm, 10.*cm) - self.lv_object= lv_sld= G4LogicalVolume(sld_sld, self.air, "dummy") - pv_sld= G4PVPlacement(None, G4ThreeVector(), "dummy", lv_sld, - pv_world, False, 0) - - return pv_world - - # ----------------------------------------------------------------- - def ConstructUnion(self): - global sld_union - sld_union= G4UnionSolid("box+cylinder", self.sld_box, self.sld_cyl); - - self.lv_object.SetSolid(sld_union) - self.lv_object.SetVisAttributes(self.va_blue) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructIntersection(self): - offset= G4ThreeVector(20.*cm, 20.*cm, 0.) - global sld_intersection - sld_intersection= G4IntersectionSolid("box*cylinder", - self.sld_box, self.sld_cyl, - None, offset) - - self.lv_object.SetSolid(sld_intersection) - self.lv_object.SetVisAttributes(self.va_magenta) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def ConstructSubtraction(self): - global sld_subtraction - sld_subtraction= G4SubtractionSolid("box-cylinder", - self.sld_box, self.sld_cyl) - - self.lv_object.SetSolid(sld_subtraction) - self.lv_object.SetVisAttributes(self.va_red) - gRunManager.GeometryHasBeenModified() - - # ----------------------------------------------------------------- - def Construct(self): # return the world volume - return self.world - -# ================================================================== -# main -# ================================================================== -# set geometry -myDC= MyDetectorConstruction() -gRunManager.SetUserInitialization(myDC) - -# minimal physics list -g4pytest.ExN01pl.Construct() - -# set primary generator action -g4pytest.ParticleGun.Construct() - -# initialize -gRunManager.Initialize() - -# visualization -gApplyUICommand("/vis/open RayTracer") -gApplyUICommand("/vis/rayTracer/headAngle 40.") -gApplyUICommand("/vis/rayTracer/eyePosition 100 100 150 cm") - -# create a vrml file for each solid type -f_list= ( - ("union", myDC.ConstructUnion), - ("intersection", myDC.ConstructIntersection), - ("subtraction", myDC.ConstructSubtraction) - ) - -for s,f in f_list: - f.__call__() - fname= "%s.jpg" % (s) - cmdstr= "/vis/rayTracer/trace " + fname - # This causes a segfault in MT mode... - gApplyUICommand(cmdstr) - -gTerminate() diff --git a/environments/g4py/tests/gtest07/CMakeLists.txt b/environments/g4py/tests/gtest07/CMakeLists.txt deleted file mode 100644 index 9c2ab0ab05..0000000000 --- a/environments/g4py/tests/gtest07/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -configure_file(test.py test.py) -add_test(NAME geant4py-test07 COMMAND ${PYTHON_EXECUTABLE} test.py) -set_tests_properties(geant4py-test07 PROPERTIES ENVIRONMENT "PYTHONPATH=${GEANT4_PYTHON_OUTPUT_DIR};${GEANT4_TEST_ENVIRONMENT}") diff --git a/environments/g4py/tests/gtest07/test.py b/environments/g4py/tests/gtest07/test.py deleted file mode 100755 index de63a7dd87..0000000000 --- a/environments/g4py/tests/gtest07/test.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/python3 -# ================================================================== -# python script for Geant4Py test -# -# gtest07 -# - test for checking overlapped geometries -# ================================================================== -from Geant4 import * -import g4pytest.ExN01pl, g4pytest.ParticleGun - -# ================================================================== -# user actions in python -# ================================================================== -class MyDetectorConstruction(G4VUserDetectorConstruction): - "My Detector Construction" - - def __init__(self): - G4VUserDetectorConstruction.__init__(self) - - # ----------------------------------------------------------------- - def Construct(self): - # Python has automatic garbage collection system. - # Geometry objects must be defined as GLOBAL not to be deleted. - air= gNistManager.FindOrBuildMaterial("G4_AIR") - - # world volume - global sld_world, lv_world, pv_world - sld_world= G4Box("world", 1.*m, 1.*m, 1.*m) - lv_world= G4LogicalVolume(sld_world, air, "world") - pv_world= G4PVPlacement(G4Transform3D(), lv_world, "world", - None, False, 0) - - # box - global sld_box, lv_box, pv_box - sld_box= G4Box("box", 10.*cm, 10.*cm, 10.*cm); - lv_box= G4LogicalVolume(sld_box, air, "box") - pv_box= G4PVPlacement(None, G4ThreeVector(), "box", lv_box, - pv_world, False, 0, True) - - # cylinder - global sld_cyl, lv_cyl, pv_cyl1, pv_cyl2, pv_cyl3 - sld_cyl= G4Tubs("cylinder",0., 2.*cm, 2.*cm, 0., twopi) - lv_cyl= G4LogicalVolume(sld_cyl, air, "cylinder") - - # - # the following placements are !! overlapped !! - # - # doubly placed - pv_cyl1= G4PVPlacement(None, G4ThreeVector(), "cylinder", lv_cyl, - pv_world, False, 0, True) - - # overlaped - pv_cyl2= G4PVPlacement(None, G4ThreeVector(10.*cm,0.,0.), - "cylinder", lv_cyl, - pv_world, False, 1, True) - - # sticked out - pv_cyl3= G4PVPlacement(None, G4ThreeVector(10.*cm,0.,0.), - "cylinder", lv_cyl, - pv_box, False, 0, True) - - return pv_world - -# ================================================================== -# main -# ================================================================== -# set geometry -myDC= MyDetectorConstruction() -gRunManager.SetUserInitialization(myDC) - -# minimal physics list -g4pytest.ExN01pl.Construct() - -# set primary generator action -g4pytest.ParticleGun.Construct() - -# initialize -gRunManager.Initialize() # overlap should be detected !! - - diff --git a/environments/g4py/tests/gtest08/CMakeLists.txt b/environments/g4py/tests/gtest08/CMakeLists.txt deleted file mode 100644 index aa44ddeaa5..0000000000 --- a/environments/g4py/tests/gtest08/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -configure_file(test.py test.py) -add_test(NAME geant4py-test08 COMMAND ${PYTHON_EXECUTABLE} test.py) -set_tests_properties(geant4py-test08 PROPERTIES ENVIRONMENT "PYTHONPATH=${GEANT4_PYTHON_OUTPUT_DIR};${GEANT4_TEST_ENVIRONMENT}") \ No newline at end of file diff --git a/environments/g4py/tests/gtest08/test.py b/environments/g4py/tests/gtest08/test.py deleted file mode 100755 index 5b03e6a769..0000000000 --- a/environments/g4py/tests/gtest08/test.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/python3 -# ================================================================== -# python script for Geant4Py test -# -# gtest09 -# - test for checking use of G4PhysListFactory -# ================================================================== - -from Geant4 import * - -# ================================================================== -# user actions in python -# ================================================================== -class MyDetectorConstruction(G4VUserDetectorConstruction): - "My Detector Construction" - - def __init__(self): - G4VUserDetectorConstruction.__init__(self) - - # ----------------------------------------------------------------- - def Construct(self): - # Python has automatic garbage collection system. - # Geometry objects must be defined as GLOBAL not to be deleted. - air= gNistManager.FindOrBuildMaterial("G4_AIR") - - # world volume - global sld_world, lv_world, pv_world - sld_world= G4Box("world", 1.*m, 1.*m, 1.*m) - lv_world= G4LogicalVolume(sld_world, air, "world") - pv_world= G4PVPlacement(G4Transform3D(), lv_world, "world", - None, False, 0) - - return pv_world - -class MyPrimaryGeneratorAction(G4VUserPrimaryGeneratorAction): - "My Primary Generator Action" - - def __init__(self): - G4VUserPrimaryGeneratorAction.__init__(self) - self.particleGun= G4ParticleGun(1) - - def GeneratePrimaries(self, event): - dx=0. - self.particleGun.SetParticleMomentumDirection(G4ThreeVector(dx, 0., 1.)) - self.particleGun.GeneratePrimaryVertex(event) - -# ================================================================== -# main -# ================================================================== -# set geometry -myDC = MyDetectorConstruction() -gRunManager.SetUserInitialization(myDC) - -# Create physics list -factory = G4PhysListFactory() -myPhysList = factory.GetReferencePhysList("FTFP_BERT") - -if myPhysList is None: - raise RuntimeError("No physics list named FTFP_BERT found") - -gRunManager.SetUserInitialization(myPhysList) - -# Event generator -myGenAction = MyPrimaryGeneratorAction() -myGenAction.particleGun.SetParticleByName("e-") -myGenAction.particleGun.SetParticleEnergy(200.*MeV) -myGenAction.particleGun.SetParticlePosition(G4ThreeVector(0.,0.,-14.9)*cm) - -gRunManager.SetUserAction(myGenAction) - -# Init, run terminate -gRunManager.Initialize() -gRunManager.BeamOn(10) -gTerminate() diff --git a/environments/zmq/History b/environments/zmq/History index 6be450a805..bfa2a4b852 100644 --- a/environments/zmq/History +++ b/environments/zmq/History @@ -11,5 +11,8 @@ ZeroMQ Interface for Geant4 * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +25 Oct. 2021 B. Morgan - zmq-V10-07-00 +- Use G4StrUtil functions replacing deprecated G4String member functions + 24 Nov. 2017 K. Murakami - First release for ZeroMQ interface (experimental) diff --git a/environments/zmq/README.md b/environments/zmq/README.md deleted file mode 100644 index 69bfa90e24..0000000000 --- a/environments/zmq/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# ZeroMQ Interface for Geant4 - -Copyright (c) 2017, Koichi Murakami - -zmq-geant4 is a [ZeroMQ](http://zeromq.org/) interface with Geant4, -that is an alternative implementation of Geant4 UI session. -The interface is designed for the purpose of Geant4 kernel -for [Jupyter](http://jupyter.org/). -A Jupyter kernel is provided in -[igeant4](https://github.com/koichi-murakami/igeant4) repository. - -* [Releases](https://github.com/koichi-murakami/zmq-geant4/releases) -* [Install Instructions](https://github.com/koichi-murakami/zmq-geant4/wiki/Installation) -* [Issues](https://github.com/koichi-murakami/zmq-geant4/issues) diff --git a/environments/zmq/zmq/G4ZMQServer.cc b/environments/zmq/zmq/G4ZMQServer.cc index 1aeeddf924..48f7a69de8 100644 --- a/environments/zmq/zmq/G4ZMQServer.cc +++ b/environments/zmq/zmq/G4ZMQServer.cc @@ -205,12 +205,12 @@ G4String G4ZMQServer::GetCommand(const G4String& input) const std::string nullstr = ""; G4String cmdstr = input; - G4String cstr = cmdstr.strip(G4String::leading); + G4String cstr = G4StrUtil::lstrip_copy(cmdstr); if ( cstr.length() == 0 ) { cmdstr = nullstr; // define built-in shell commands... - } else if ( cstr(0) == '#' ) { + } else if ( cstr[0] == '#' ) { G4cout << cstr << G4endl; cmdstr = nullstr; @@ -219,7 +219,7 @@ G4String G4ZMQServer::GetCommand(const G4String& input) cmdstr = nullstr; } else if ( cstr == "lc" || cstr.substr(0,3) == "lc " ) { - shell_-> ListCommand(cstr.remove(0,2)); + shell_-> ListCommand(cstr.erase(0,2)); cmdstr = nullstr; } else if (cstr == "pwd" ) { diff --git a/examples/.README.HowToRun b/examples/.README.HowToRun deleted file mode 100644 index d1a458dede..0000000000 --- a/examples/.README.HowToRun +++ /dev/null @@ -1,123 +0,0 @@ - -///\file ".README.HowToRun" -///\brief Examples How To Run README page - -/*! \page README_HowToRun How to build and run an example - -All novice, basic and most of extended examples have a similar structure. -The main () function is included in \em exampleXYZ.cc in the example top directory -and the example source code is structered in \em include and \em src subdirectories. -When the example is built, the executable takes the same name as the file with -main () function without \em .cc extension, \em exampleXYZ. - -Then several macros are provided to run the example with various start-up -conditions. These macros have usually \em .mac extension. Besides these macros, -there is often a macro \em exampleXYZ.in (note its different extension) -which is used in Geant4 testing and which output, \em exampleXYZ.out, can be also included -in the distribution. - -You can find all details about building the examples in the
    Geant4 Installation Guide , in the section 3.2. Building Applications with Geant4 . -Here we recall only the basics. - -\section HowToRun_s1 Compile and link to generate an executable - -\subsection HowToRun_subs11 With CMake -\verbatim -% cd path_to_exampleXYZ # go to directory which contains your example -% mkdir exampleXYZ_build -% cd exampleXYZ_build -% cmake -DGeant4_DIR=path_to_Geant4_installation/lib[64]/Geant4-10.0.0/ ../exampleXYZ -% make -j N exampleXYZ # "N" is the number of processes -% make install # this step is optional -\endverbatim - -\subsection HowToRun_subs12 With GNUmake - -To use GNUmake build system when Geant4 was installed with CMake, you have to source first -the setup script in order to define needed environment variables: -\verbatim -source path_to_Geant4_installation/share/Geant4-10.0.0/geant4make/geant4make.[c]sh -\endverbatim - -Then to build example -\verbatim -% cd path_to_exampleXYZ/exampleXYZ -% gmake -\endverbatim - -An additional step is needed when building an example using shared classes -(usually from ../shared directory) or classes from -\link Examples_common common \endlink: -\verbatim -% cd path_to_exampleXYZ/exampleXYZ -% gmake setup -% gmake -\endverbatim - -When building the example in this way make sure that the path to the example executable and its shared library is added in the paths defined on your system (eg. PATH and LD_LIBRARY_PATH on Linux). - -\section HowToRun_s2 Execute exampleXYZ in 'batch' mode from macro files - -\verbatim -... go to the directory where the example was built/installed -% exampleXYZ xyz.mac -\endverbatim - -\section HowToRun_s3 Execute exampleXYZ in 'interactive mode' with visualization -\verbatim -... go to the directory where the example was built/installed -% exampleXYZ -.... -Idle> type your commands -.... -Idle> exit -\endverbatim - -See also the explicit instructions for building TestEm1 example at -\ref README_HowToRunTestEm1 page. - -*/ - -/*! \page README_HowToRunTestEm1 How to build and run TestEm1 example - -Below we give the explicit instructions (described in general at \ref README_HowToRun page) for the example extended/electromagnetic/TestEm1. - -Let's suppose that the \em TestEm1 directory is available in $HOME and Geant4 installation in \em /usr/local and we work within the \em bash shell on a \em 64-bit machine. - -\section HowToRunTestEm1_s1 Compile and link TestEm1 to generate an executable - -\subsection HowToRunTestEm1_subs11 With CMake -\verbatim -% cd $HOME -% mkdir TestEm1_build -% cd TestEm1_build -% cmake -DGeant4_DIR=/usr/local/lib64/Geant4-10.0.0/ ../TestEm1 -% make -j 2 TestEm1 -\endverbatim - -\subsection HowToRunTestEm1_subs12 With GNUmake -\verbatim -% cd $HOME/TestEm1 -% source /usr/local/share/Geant4-10.0.0/geant4make/geant4make.sh -% make -\endverbatim - -\section HowToRunTestEm1_s2 Execute TestEm1 in 'batch' mode from macro files -\verbatim -% cd $HOME/TestEm1_build # or cd $HOME/TestEm1 if example was built with GNUmake -% TestEm1 annihil.mac -% TestEm1 brem.mac -% TestEm1 TestEm1.in >& myTestEm1.out # redirecting output in a file -\endverbatim - -\section HowToRunTestEm1_s3 Execute TestEm1 in 'interactive mode' with visualization -\verbatim -% cd $HOME/TestEm1_build # or cd $HOME/TestEm1 if example was built with GNUmake -% TestEm1 -PreInit> /run/initialize -Idle> /run/beamOn 1 -... -Idle> exit -\endverbatim - -*/ diff --git a/examples/.README.HowToRun.txt b/examples/.README.HowToRun.txt deleted file mode 100644 index 7cfa34c781..0000000000 --- a/examples/.README.HowToRun.txt +++ /dev/null @@ -1,123 +0,0 @@ - -///\file ".README.HowToRun.txt" -///\brief Examples How To Run README page - -/*! \page README_HowToRun How to build and run an example - -All novice, basic and most of extended examples have a similar structure. -The main () function is included in \em exampleXYZ.cc in the example top directory -and the example source code is structered in \em include and \em src subdirectories. -When the example is built, the executable takes the same name as the file with -main () function without \em .cc extension, \em exampleXYZ. - -Then several macros are provided to run the example with various start-up -conditions. These macros have usually \em .mac extension. Besides these macros, -there is often a macro \em exampleXYZ.in (note its different extension) -which is used in Geant4 testing and which output, \em exampleXYZ.out, can be also included -in the distribution. - -You can find all details about building the examples in the Geant4 Installation Guide , in the section 3.2. Building Applications with Geant4 . -Here we recall only the basics. - -\section HowToRun_s1 Compile and link to generate an executable - -\subsection HowToRun_subs11 With CMake -\verbatim -% cd path_to_exampleXYZ # go to directory which contains your example -% mkdir exampleXYZ_build -% cd exampleXYZ_build -% cmake -DGeant4_DIR=path_to_Geant4_installation/lib[64]/Geant4-10.2.0/ ../exampleXYZ -% make -j N exampleXYZ # "N" is the number of processes -% make install # this step is optional -\endverbatim - -\subsection HowToRun_subs12 With GNUmake - -To use GNUmake build system when Geant4 was installed with CMake, you have to source first -the setup script in order to define needed environment variables: -\verbatim -source path_to_Geant4_installation/share/Geant4-10.2.0/geant4make/geant4make.[c]sh -\endverbatim - -Then to build example -\verbatim -% cd path_to_exampleXYZ/exampleXYZ -% gmake -\endverbatim - -An additional step is needed when building an example using shared classes -(usually from ../shared directory) or classes from -\link Examples_common common \endlink: -\verbatim -% cd path_to_exampleXYZ/exampleXYZ -% gmake setup -% gmake -\endverbatim - -When building the example in this way make sure that the path to the example executable and its shared library is added in the paths defined on your system (eg. PATH and LD_LIBRARY_PATH on Linux). - -\section HowToRun_s2 Execute exampleXYZ in 'batch' mode from macro files - -\verbatim -... go to the directory where the example was built/installed -% exampleXYZ xyz.mac -\endverbatim - -\section HowToRun_s3 Execute exampleXYZ in 'interactive mode' with visualization -\verbatim -... go to the directory where the example was built/installed -% exampleXYZ -.... -Idle> type your commands -.... -Idle> exit -\endverbatim - -See also the explicit instructions for building TestEm1 example at -\ref README_HowToRunTestEm1 page. - -*/ - -/*! \page README_HowToRunTestEm1 How to build and run TestEm1 example - -Below we give the explicit instructions (described in general at \ref README_HowToRun page) for the example extended/electromagnetic/TestEm1. - -Let's suppose that the \em TestEm1 directory is available in $HOME and Geant4 installation in \em /usr/local and we work within the \em bash shell on a \em 64-bit machine. - -\section HowToRunTestEm1_s1 Compile and link TestEm1 to generate an executable - -\subsection HowToRunTestEm1_subs11 With CMake -\verbatim -% cd $HOME -% mkdir TestEm1_build -% cd TestEm1_build -% cmake -DGeant4_DIR=/usr/local/lib64/Geant4-10.2.0/ ../TestEm1 -% make -j 2 TestEm1 -\endverbatim - -\subsection HowToRunTestEm1_subs12 With GNUmake -\verbatim -% cd $HOME/TestEm1 -% source /usr/local/share/Geant4-10.2.0/geant4make/geant4make.sh -% make -\endverbatim - -\section HowToRunTestEm1_s2 Execute TestEm1 in 'batch' mode from macro files -\verbatim -% cd $HOME/TestEm1_build # or cd $HOME/TestEm1 if example was built with GNUmake -% TestEm1 annihil.mac -% TestEm1 brem.mac -% TestEm1 TestEm1.in >& myTestEm1.out # redirecting output in a file -\endverbatim - -\section HowToRunTestEm1_s3 Execute TestEm1 in 'interactive mode' with visualization -\verbatim -% cd $HOME/TestEm1_build # or cd $HOME/TestEm1 if example was built with GNUmake -% TestEm1 -PreInit> /run/initialize -Idle> /run/beamOn 1 -... -Idle> exit -\endverbatim - -*/ diff --git a/examples/.README.HowToRunMT b/examples/.README.HowToRunMT deleted file mode 100644 index 2e7564e6d7..0000000000 --- a/examples/.README.HowToRunMT +++ /dev/null @@ -1,92 +0,0 @@ - -///\file ".README.HowToRunMT" -///\brief Examples Tips How To Run MT README page - -/*! \page README_HowToRunMT Tips how to run an example in multi-threading mode - -Only migrated examples or user applications can be run in multi-threading (MT) mode. -The instructions for migrating user applications can be found in Geant4 documentation guides -and a short howto is available here: - -https://twiki.cern.ch/twiki/bin/view/Geant4/QuickMigrationGuideForGeant4V10 - -In this file, we give just useful tips for running already migrated examples -(or user applications). - -\section HowToRunMT_s1 Run example in multi-threading mode - -No special steps are needed to build an example in multi-threading (MT) mode. -The examples which has been migrated to multi-threading will automatically -run in MT when they are built against the Geant4 libraries built with MT mode -activated, otherwise they will run in sequential mode. -Not migrated examples will run in sequential mode even when built against -Geant4 libraries built with MT mode activated. - -The examples which support MT can be easily recognized by the following lines -of code in main (): -\verbatim -#ifdef G4MULTITHREADED - G4MTRunManager* runManager = new G4MTRunManager; -#else - G4RunManager* runManager = new G4RunManager; -#endif -\endverbatim -The compiler flag -DG4MULTITHREADED is automatically set when building applications -using Geant4's CMake (via GEANT4_USE_FILE) and GNUmake systems, and is listed in -the flags reported by the --cflags option of the geant4-config program. - -\section HowToRunMT_s2 Set number of threads - -When the number of threads is not selected in the application, the default number -(which is actually 2) will be used. Another number of threads can be set in several -ways: - -- in the code -\verbatim -#ifdef G4MULTITHREADED - G4MTRunManager* runManager = new G4MTRunManager; - runManager->SetNumberOfThreads(4); -#else - ... -\endverbatim - -- in a macro file via UI command added just before /run/initialize -\verbatim -/run/numberOfThreads 4 -\endverbatim - -- by setting the environment variable -\verbatim -export G4FORCENUMBEROFTHREADS = 4 -or -setenv G4FORCENUMBEROFTHREADS 4 -\endverbatim - -The environment variable value is forced and it cannot be changed from a code -call or a macro. A warning is issued in such situation. - -\section HowToRunMT_s3 Output from threads - -In MT processing each worker produces its output and these messages are interlayed -on the screen. The messeges from threads are preceded with a predefined string -G4WTi> where i is the thread number. Users can change this default behaviour -and choose - -- to buffer the output from each thread at a time, so that the output of each - thread is grouped and printed at the end of the job -\verbatim -/control/cout/useBuffer true|false -\endverbatim - -- to limit the output from threads to one selected thread only: -\verbatim -/control/cout/ignoreThreadsExcept 0 -\endverbatim - -- to redirect the output from threads in a file: -\verbatim -/control/cout/setCoutFile coutFileName -/control/cout/setCerrFile cerrFileName -\endverbatim - -*/ diff --git a/examples/.README.HowToRunMT.txt b/examples/.README.HowToRunMT.txt deleted file mode 100644 index 9cb130a7d0..0000000000 --- a/examples/.README.HowToRunMT.txt +++ /dev/null @@ -1,92 +0,0 @@ - -///\file ".README.HowToRunMT.txt" -///\brief Examples Tips How To Run MT README page - -/*! \page README_HowToRunMT Tips how to run an example in multi-threading mode - -Only migrated examples or user applications can be run in multi-threading (MT) mode. -The instructions for migrating user applications can be found in Geant4 documentation guides -and a short howto is available here: - -https://twiki.cern.ch/twiki/bin/view/Geant4/QuickMigrationGuideForGeant4V10 - -In this file, we give just useful tips for running already migrated examples -(or user applications). - -\section HowToRunMT_s1 Run example in multi-threading mode - -No special steps are needed to build an example in multi-threading (MT) mode. -The examples which has been migrated to multi-threading will automatically -run in MT when they are built against the Geant4 libraries built with MT mode -activated, otherwise they will run in sequential mode. -Not migrated examples will run in sequential mode even when built against -Geant4 libraries built with MT mode activated. - -The examples which support MT can be easily recognized by the following lines -of code in main (): -\verbatim -#ifdef G4MULTITHREADED - G4MTRunManager* runManager = new G4MTRunManager; -#else - G4RunManager* runManager = new G4RunManager; -#endif -\endverbatim -The compiler flag -DG4MULTITHREADED is automatically set when building applications -using Geant4's CMake (via GEANT4_USE_FILE) and GNUmake systems, and is listed in -the flags reported by the --cflags option of the geant4-config program. - -\section HowToRunMT_s2 Set number of threads - -When the number of threads is not selected in the application, the default number -(which is actually 2) will be used. Another number of threads can be set in several -ways: - -- in the code -\verbatim -#ifdef G4MULTITHREADED - G4MTRunManager* runManager = new G4MTRunManager; - runManager->SetNumberOfThreads(4); -#else - ... -\endverbatim - -- in a macro file via UI command added just before /run/initialize -\verbatim -/run/numberOfThreads 4 -\endverbatim - -- by setting the environment variable -\verbatim -export G4FORCENUMBEROFTHREADS = 4 -or -setenv G4FORCENUMBEROFTHREADS 4 -\endverbatim - -The environment variable value is forced and it cannot be changed from a code -call or a macro. A warning is issued in such situation. - -\section HowToRunMT_s3 Output from threads - -In MT processing each worker produces its output and these messages are interlayed -on the screen. The messeges from threads are preceded with a predefined string -G4WTi> where i is the thread number. Users can change this default behaviour -and choose - -- to buffer the output from each thread at a time, so that the output of each - thread is grouped and printed at the end of the job -\verbatim -/control/cout/useBuffer true|false -\endverbatim - -- to limit the output from threads to one selected thread only: -\verbatim -/control/cout/ignoreThreadsExcept 0 -\endverbatim - -- to redirect the output from threads in a file: -\verbatim -/control/cout/setCoutFile coutFileName -/control/cout/setCerrFile cerrFileName -\endverbatim - -*/ diff --git a/examples/.doxygen/.README.HowToNavigate.txt b/examples/.doxygen/.README.HowToNavigate.txt deleted file mode 100644 index c4bcbc0ec4..0000000000 --- a/examples/.doxygen/.README.HowToNavigate.txt +++ /dev/null @@ -1,24 +0,0 @@ - -///\file ".README.HowToNavigate.txt" -///\brief Examples How To Navigate README page - -/*! \page README_HowToNavigate How to navigate in the examples documentation - -The examples documentation is composed from a "global" documentation including all examples with classes which has unique names (eg. A01DetectorConstruction etc.) and from "standalone" documentations for examples with classes which names are not not unique (DetectorConstruction etc.). - -\section HowToNavigate_sec1 Global documentation - -The lists of "Related Pages" and "Modules" in the global documentation include the README pages for all examples categories and examples with both unique class names and generic ones. The lists "Namespaces" , "Classes" and "Files" include only the examples with unique class names. - -That's why the README pages for the examples with a standalone documentation generated in the global documentation do not contain links to their classes -(one cannot click on a class name here to get the class documentation). See eg. \ref ExampleTestEm1. - -\section HowToNavigate_sec2 Standalone documentations - -The links from "global" documentation to the examples "standalone" documentation are available in the list of "Modules". When selecting eg. "TestEm1" here, you will be directed to the main page of its standalone documentation. When selecting then "Example TestEm1" from the "Related Pages" list here (there is only one page in the list) you will get the example documentation with hyperlinks to the classes etc. - -All the lists in the examples "standalone" documentation include only the concerned example and eventually the classes shared with another examples or the classes from common if they are used in the example. - -This organization was necessary as Doxygen does not support the classes with the same names in one system. - -*/ diff --git a/examples/.doxygen/.README.novice.txt b/examples/.doxygen/.README.novice.txt deleted file mode 100644 index 8f53f38a84..0000000000 --- a/examples/.doxygen/.README.novice.txt +++ /dev/null @@ -1,25 +0,0 @@ - -///\file ".README.novice.txt" -///\brief Geant4 Old Novice Examples README page - -/*! \page README_novice Old Novice Examples - -The old "novice" set of examples is now replaced with a new "basic" set, -covering the most typical use-cases of a Geant4 application with keeping -simplicity and ease of use. - -The source code of the last version of the novice examples set -(in 9.6.p02 release) can be viewed in - -the Geant4 LXR code browser - -The new location of each example in 10.0 release: -- N01 - removed -- N02 - \link ExampleB2 basic/B2 \endlink -- N03 - \link ExampleB4 basic/B4 \endlink -- N04 - \link ExampleRE05 extended/runAndEvent/RE05 \endlink -- N05 - \link ExamplePar01 extended/parameterisations/Par01 \endlink -- N06 - \link ExampleOpNovice extended/optical/OpNovice \endlink -- N07 - \link ExampleRE06 extended/runAndEvent/RE06 \endlink - -*/ diff --git a/examples/.doxygen/Doxyfile b/examples/.doxygen/Doxyfile index 73a3e0f971..d2440ef091 100644 --- a/examples/.doxygen/Doxyfile +++ b/examples/.doxygen/Doxyfile @@ -795,9 +795,6 @@ INPUT = Doxymain.h \ ../extended/analysis/.README.txt \ ../extended/analysis/AnaEx01/.README.txt \ ../extended/analysis/AnaEx02/.README.txt \ - ../extended/analysis/AnaEx03/.README.txt \ - ../extended/analysis/AnaEx03/.README.AIDA.txt \ - ../extended/analysis/AnaEx03/.README.OpenScientist.txt \ ../extended/analysis/B1Con \ ../extended/biasing \ ../extended/electromagnetic/.README.txt \ @@ -830,6 +827,7 @@ INPUT = Doxymain.h \ ../extended/eventgenerator/particleGun/.README.txt \ ../extended/eventgenerator/pythia/.README.txt \ ../extended/eventgenerator/pythia/decayer6 \ + ../extended/eventgenerator/pythia/py8decayer/.README.txt \ ../extended/eventgenerator/userPrimaryGenerator/.README.txt \ ../extended/exoticphysics/.README.txt \ ../extended/exoticphysics/channeling/.README.txt \ @@ -842,16 +840,19 @@ INPUT = Doxymain.h \ ../extended/g3tog4 \ ../extended/geometry/.README.txt \ ../extended/geometry/transforms/.README.txt \ + ../extended/geometry/vecGeomNavigation \ ../extended/hadronic/.README.txt \ ../extended/hadronic/Hadr00/.README.txt \ ../extended/hadronic/Hadr01/.README.txt \ ../extended/hadronic/Hadr02/.README.txt \ ../extended/hadronic/Hadr03/.README.txt \ ../extended/hadronic/Hadr04/.README.txt \ + ../extended/hadronic/Hadr05/.README.txt \ ../extended/hadronic/Hadr06/.README.txt \ ../extended/hadronic/Hadr07/.README.txt \ ../extended/hadronic/Hadr08/.README.txt \ ../extended/hadronic/Hadr09/.README.txt \ + ../extended/hadronic/Hadr10/.README.txt \ ../extended/hadronic/FissionFragment \ ../extended/hadronic/NeutronSource/.README.txt \ ../extended/medical/.README.txt \ @@ -863,6 +864,7 @@ INPUT = Doxymain.h \ ../extended/medical/fanoCavity2/.README.txt \ ../extended/medical/GammaTherapy/.README.txt \ ../extended/medical/dna/.README.txt \ + ../extended/medical/dna/AuNP/.README.txt \ ../extended/medical/dna/chem1/.README.txt \ ../extended/medical/dna/chem2/.README.txt \ ../extended/medical/dna/chem3/.README.txt \ @@ -880,6 +882,7 @@ INPUT = Doxymain.h \ ../extended/medical/dna/neuron/.README.txt \ ../extended/medical/dna/pdb4dna/.README.txt \ ../extended/medical/dna/range/.README.txt \ + ../extended/medical/dna/scavenger \ ../extended/medical/dna/slowing/.README.txt \ ../extended/medical/dna/splitting/.README.txt \ ../extended/medical/dna/spower/.README.txt \ @@ -916,7 +919,14 @@ INPUT = Doxymain.h \ ../extended/radioactivedecay/Activation/.README.txt \ ../extended/radioactivedecay/rdecay01/.README.txt \ ../extended/radioactivedecay/rdecay02/.README.txt \ - ../extended/runAndEvent \ + ../extended/runAndEvent/.README.txt \ + ../extended/runAndEvent/RE01 \ + ../extended/runAndEvent/RE02 \ + ../extended/runAndEvent/RE03 \ + ../extended/runAndEvent/RE04 \ + ../extended/runAndEvent/RE05 \ + ../extended/runAndEvent/RE06 \ + ../extended/runAndEvent/RE07/.README.txt \ ../extended/visualization \ .README.novice.txt @@ -957,48 +967,48 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = ../basic/B2/B2b/include/B2ActionInitialization.hh \ - ../basic/B2/B2b/include/B2EventAction.hh \ - ../basic/B2/B2b/include/B2FieldMessenger.hh \ - ../basic/B2/B2b/include/B2MagneticField.hh \ - ../basic/B2/B2b/include/B2PrimaryGeneratorAction.hh \ - ../basic/B2/B2b/include/B2RunAction.hh \ - ../basic/B2/B2b/include/B2TrackerHit.hh \ - ../basic/B2/B2b/include/B2TrackerSD.hh \ - ../basic/B2/B2b/src/B2ActionInitialization.cc \ - ../basic/B2/B2b/src/B2EventAction.cc \ - ../basic/B2/B2b/src/B2FieldMessenger.cc \ - ../basic/B2/B2b/src/B2MagneticField.cc \ - ../basic/B2/B2b/src/B2PrimaryGeneratorAction.cc \ - ../basic/B2/B2b/src/B2RunAction.cc \ - ../basic/B2/B2b/src/B2TrackerHit.cc \ - ../basic/B2/B2b/src/B2TrackerSD.cc \ - ../basic/B3/B3b/include/B3Analysis.hh \ - ../basic/B3/B3b/include/B3DetectorConstruction.hh \ - ../basic/B3/B3b/include/B3PhysicsList.hh \ - ../basic/B3/B3b/include/B3PrimaryGeneratorAction.hh \ - ../basic/B3/B3b/include/B3StackingAction.hh \ - ../basic/B3/B3b/src/B3DetectorConstruction.cc \ - ../basic/B3/B3b/src/B3PhysicsList.cc \ - ../basic/B3/B3b/src/B3PrimaryGeneratorAction.cc \ - ../basic/B3/B3b/src/B3StackingAction.cc \ - ../basic/B4/B4b/include/B4Analysis.hh \ - ../basic/B4/B4c/include/B4Analysis.hh \ - ../basic/B4/B4d/include/B4Analysis.hh \ - ../basic/B4/B4b/include/B4DetectorConstruction.hh \ - ../basic/B4/B4b/include/B4DetectorMessenger.hh \ - ../basic/B4/B4b/src/B4DetectorConstruction.cc \ - ../basic/B4/B4b/src/B4DetectorMessenger.cc \ - ../basic/B4/B4b/include/B4PrimaryGeneratorAction.hh \ - ../basic/B4/B4c/include/B4PrimaryGeneratorAction.hh \ - ../basic/B4/B4d/include/B4PrimaryGeneratorAction.hh \ - ../basic/B4/B4b/src/B4PrimaryGeneratorAction.cc \ - ../basic/B4/B4c/src/B4PrimaryGeneratorAction.cc \ - ../basic/B4/B4d/src/B4PrimaryGeneratorAction.cc \ - ../basic/B4/B4c/include/B4RunAction.hh \ - ../basic/B4/B4d/include/B4RunAction.hh \ - ../basic/B4/B4c/src/B4RunAction.cc \ - ../basic/B4/B4d/src/B4RunAction.cc \ +EXCLUDE = ../basic/B2/B2b/include/ActionInitialization.hh \ + ../basic/B2/B2b/include/EventAction.hh \ + ../basic/B2/B2b/include/FieldMessenger.hh \ + ../basic/B2/B2b/include/MagneticField.hh \ + ../basic/B2/B2b/include/PrimaryGeneratorAction.hh \ + ../basic/B2/B2b/include/RunAction.hh \ + ../basic/B2/B2b/include/TrackerHit.hh \ + ../basic/B2/B2b/include/TrackerSD.hh \ + ../basic/B2/B2b/src/ActionInitialization.cc \ + ../basic/B2/B2b/src/EventAction.cc \ + ../basic/B2/B2b/src/FieldMessenger.cc \ + ../basic/B2/B2b/src/MagneticField.cc \ + ../basic/B2/B2b/src/PrimaryGeneratorAction.cc \ + ../basic/B2/B2b/src/RunAction.cc \ + ../basic/B2/B2b/src/TrackerHit.cc \ + ../basic/B2/B2b/src/TrackerSD.cc \ + ../basic/B3/B3b/include/Analysis.hh \ + ../basic/B3/B3b/include/DetectorConstruction.hh \ + ../basic/B3/B3b/include/PhysicsList.hh \ + ../basic/B3/B3b/include/PrimaryGeneratorAction.hh \ + ../basic/B3/B3b/include/StackingAction.hh \ + ../basic/B3/B3b/src/DetectorConstruction.cc \ + ../basic/B3/B3b/src/PhysicsList.cc \ + ../basic/B3/B3b/src/PrimaryGeneratorAction.cc \ + ../basic/B3/B3b/src/StackingAction.cc \ + ../basic/B4/B4b/include/Analysis.hh \ + ../basic/B4/B4c/include/Analysis.hh \ + ../basic/B4/B4d/include/Analysis.hh \ + ../basic/B4/B4b/include/DetectorConstruction.hh \ + ../basic/B4/B4b/include/DetectorMessenger.hh \ + ../basic/B4/B4b/src/DetectorConstruction.cc \ + ../basic/B4/B4b/src/DetectorMessenger.cc \ + ../basic/B4/B4b/include/PrimaryGeneratorAction.hh \ + ../basic/B4/B4c/include/PrimaryGeneratorAction.hh \ + ../basic/B4/B4d/include/PrimaryGeneratorAction.hh \ + ../basic/B4/B4b/src/PrimaryGeneratorAction.cc \ + ../basic/B4/B4c/src/PrimaryGeneratorAction.cc \ + ../basic/B4/B4d/src/PrimaryGeneratorAction.cc \ + ../basic/B4/B4c/include/RunAction.hh \ + ../basic/B4/B4d/include/RunAction.hh \ + ../basic/B4/B4c/src/RunAction.cc \ + ../basic/B4/B4d/src/RunAction.cc \ ../extended/analysis/B1Con/include/B1DetectorConstruction.hh \ ../extended/analysis/B1Con/include/B1EventAction.hh \ ../extended/analysis/B1Con/include/B1EventInformation.hh \ diff --git a/examples/.doxygen/Doxymain.h b/examples/.doxygen/Doxymain.h index 991f24fb53..381c570347 100644 --- a/examples/.doxygen/Doxymain.h +++ b/examples/.doxygen/Doxymain.h @@ -4,7 +4,7 @@ /*! \mainpage Geant4 Examples -This module collects four sets of user examples aimed to demonstrate to +This module collects three sets of user examples aimed to demonstrate to the user how to make correct use of the GEANT4 toolkit by implementing in a correct way those user-classes which the user is supposed to customize in order to define his/her own simulation setup. diff --git a/examples/.doxygen/Doxymodules_analysis.h b/examples/.doxygen/Doxymodules_analysis.h index 90d89ec489..3a13646413 100644 --- a/examples/.doxygen/Doxymodules_analysis.h +++ b/examples/.doxygen/Doxymodules_analysis.h @@ -27,15 +27,6 @@ /** @} */ -/** @defgroup extended_analysis_AnaEx03 AnaEx03 - * Analysis AnaEx03 example has its - * standalone documentation - * @ingroup extended_analysis - * @{ - */ - -/** @} */ - /** @defgroup extended_analysis_B1Con B1Con * Analysis example B1Con * @ingroup extended_analysis diff --git a/examples/.doxygen/Doxymodules_basic.h b/examples/.doxygen/Doxymodules_basic.h index 44a933ebbc..0194dc6c55 100644 --- a/examples/.doxygen/Doxymodules_basic.h +++ b/examples/.doxygen/Doxymodules_basic.h @@ -16,13 +16,13 @@ * @{ */ - class B1ActionInitialization{}; - class B1DetectorConstruction{}; - class B1EventAction{}; - class B1PrimaryGeneratorAction{}; - class B1Run{}; - class B1RunAction{}; - class B1SteppingAction{}; + class B1::ActionInitialization{}; + class B1::DetectorConstruction{}; + class B1::EventAction{}; + class B1::PrimaryGeneratorAction{}; + class B1::Run{}; + class B1::RunAction{}; + class B1::SteppingAction{}; /** @} */ @@ -38,14 +38,14 @@ * @{ */ - class B2ActionInitialization{}; - class B2aDetectorConstruction{}; - class B2aDetectorMessenger{}; - class B2EventAction{}; - class B2PrimaryGeneratorAction{}; - class B2RunAction{}; - class B2TrackerHit{}; - class B2TrackerSD{}; + class B2::ActionInitialization{}; + class B2::EventAction{}; + class B2::PrimaryGeneratorAction{}; + class B2::RunAction{}; + class B2::TrackerHit{}; + class B2::TrackerSD{}; + class B2a::DetectorConstruction{}; + class B2a::DetectorMessenger{}; /** @} */ @@ -55,15 +55,15 @@ * @{ */ - class B2ActionInitialization{}; - class B2bChamberParameterisation{}; - class B2bDetectorConstruction{}; - class B2bDetectorMessenger{}; - class B2EventAction{}; - class B2PrimaryGeneratorAction{}; - class B2RunAction{}; - class B2TrackerHit{}; - class B2TrackerSD{}; + class B2::ActionInitialization{}; + class B2::EventAction{}; + class B2::PrimaryGeneratorAction{}; + class B2::RunAction{}; + class B2::TrackerHit{}; + class B2::TrackerSD{}; + class B2b::ChamberParameterisation{}; + class B2b::DetectorConstruction{}; + class B2b::DetectorMessenger{}; /** @} */ @@ -81,13 +81,13 @@ * @{ */ - class B3aActionInitialization{}; - class B3aEventAction{}; - class B3aRunAction{}; - class B3DetectorConstruction{}; - class B3PhysicsList{}; - class B3PrimaryGeneratorAction{}; - class B3StackingAction{}; + class B3::DetectorConstruction{}; + class B3::PhysicsList{}; + class B3::PrimaryGeneratorAction{}; + class B3::StackingAction{}; + class B3a::ActionInitialization{}; + class B3a::EventAction{}; + class B3a::RunAction{}; /** @} */ @@ -97,13 +97,13 @@ * @{ */ - class B3bActionInitialization{}; - class B3bRun{}; - class B3bRunAction{}; - class B3DetectorConstruction{}; - class B3PhysicsList{}; - class B3PrimaryGeneratorAction{}; - class B3StackingAction{}; + class B3::PhysicsList{}; + class B3::PrimaryGeneratorAction{}; + class B3::StackingAction{}; + class B3b::ActionInitialization{}; + class B3b::Run{}; + class B3b::RunAction{}; + class B3D::etectorConstruction{}; /** @} */ @@ -122,12 +122,12 @@ * @{ */ - class B4aActionInitialization{}; - class B4aEventAction{}; - class B4aSteppingAction{}; - class B4DetectorConstruction{}; - class B4PrimaryGeneratorAction{}; - class B4RunAction{}; + class B4::DetectorConstruction{}; + class B4::PrimaryGeneratorAction{}; + class B4::RunAction{}; + class B4a::ActionInitialization{}; + class B4a::EventAction{}; + class B4a::SteppingAction{}; /** @} */ @@ -138,13 +138,13 @@ * @{ */ - class B4bActionInitialization{}; - class B4bEventAction{}; - class B4bRunAction{}; - class B4bRunData{}; - class B4bSteppingAction{}; - class B4DetectorConstruction{}; - class B4PrimaryGeneratorAction{}; + class B4::DetectorConstruction{}; + class B4::PrimaryGeneratorAction{}; + class B4b::ActionInitialization{}; + class B4b::EventAction{}; + class B4b::RunAction{}; + class B4b::RunData{}; + class B4b::SteppingAction{}; /** @} */ @@ -154,13 +154,13 @@ * @{ */ - class B4cActionInitialization{}; - class B4cCalorHit{}; - class B4cCalorimeterSD{}; - class B4cDetectorConstruction{}; - class B4cEventAction{}; - class B4PrimaryGeneratorAction{}; - class B4RunAction{}; + class B4::PrimaryGeneratorAction{}; + class B4::RunAction{}; + class B4c::ActionInitialization{}; + class B4c::CalorHit{}; + class B4c::CalorimeterSD{}; + class B4c::DetectorConstruction{}; + class B4c::EventAction{}; /** @} */ @@ -171,11 +171,11 @@ * @{ */ - class B4dActionInitialization{}; - class B4dDetectorConstruction{}; - class B4dEventAction{}; - class B4PrimaryGeneratorAction{}; - class B4RunAction{}; + class B4::PrimaryGeneratorAction{}; + class B4::RunAction{}; + class B4d::ActionInitialization{}; + class B4d::DetectorConstruction{}; + class B4d::EventAction{}; /** @} */ @@ -187,22 +187,23 @@ * @{ */ - class B5ActionInitialization{}; - class B5CellParameterisation{}; - class B5DetectorConstruction{}; - class B5DriftChamberHit{}; - class B5DriftChamberSD{}; - class B5EmCalorimeterHit{}; - class B5EmCalorimeterSD{}; - class B5EventAction{}; - class B5HadCalorimeterHit{}; - class B5HadCalorimeterSD{}; - class B5HodoscopeHit{}; - class B5HodoscopeSD{}; - class B5MagneticField{}; - class B5PrimaryGeneratorAction{}; - class B5RunAction{}; + class B5::ActionInitialization{}; + class B5::CellParameterisation{}; + class B5::DetectorConstruction{}; + class B5::DriftChamberHit{}; + class B5::DriftChamberSD{}; + class B5::EmCalorimeterHit{}; + class B5::EmCalorimeterSD{}; + class B5::EventAction{}; + class B5::HadCalorimeterHit{}; + class B5::HadCalorimeterSD{}; + class B5::HodoscopeHit{}; + class B5::HodoscopeSD{}; + class B5::MagneticField{}; + class B5::PrimaryGeneratorAction{}; + class B5::RunAction{}; /** @} */ /** @} */ + diff --git a/examples/.doxygen/Doxymodules_eventgenerator.h b/examples/.doxygen/Doxymodules_eventgenerator.h index 95c2716c20..9236179ce1 100644 --- a/examples/.doxygen/Doxymodules_eventgenerator.h +++ b/examples/.doxygen/Doxymodules_eventgenerator.h @@ -118,6 +118,15 @@ /** @} */ +/** @defgroup extended_eventgenerator_pythia_py8decayer py8decayer + * Eventgenerator example pythia_py8decayer has its + * standalone documentation + * @ingroup extended_eventgenerator + * @{ + */ + +/** @} */ + /** @defgroup extended_eventgenerator_userPrimaryGenerator userPrimaryGenerator * Eventgenerator example userPrimaryGenerator has its * standalone documentation diff --git a/examples/.doxygen/Doxymodules_geometry.h b/examples/.doxygen/Doxymodules_geometry.h index 823ba3f543..6764cd83d0 100644 --- a/examples/.doxygen/Doxymodules_geometry.h +++ b/examples/.doxygen/Doxymodules_geometry.h @@ -17,4 +17,17 @@ /** @} */ +/** @defgroup extended_geometry_vecGeomNavigation vecGeomNavigation + * Geometry example vecGeomNavigation + * @{ + */ + + class VG01ActionInitialization{}; + class VG01DetectorConstruction{}; + class VG01DetectorMessenger{}; + class VG01PrimaryGeneratorAction{}; + class VG01SteppingVerboseWithDir{}; + +/** @} */ + /** @} */ diff --git a/examples/.doxygen/Doxymodules_hadronic.h b/examples/.doxygen/Doxymodules_hadronic.h index 05f3ef04d7..74a83b1066 100644 --- a/examples/.doxygen/Doxymodules_hadronic.h +++ b/examples/.doxygen/Doxymodules_hadronic.h @@ -54,6 +54,15 @@ /** @} */ +/** @defgroup extended_hadronic_Hadr05 Hadr05 + * The Hadr05 hadronic classes have their + * standalone documentation + * @ingroup extended_hadronic + * @{ + */ + +/** @} */ + /** @defgroup extended_hadronic_Hadr06 Hadr06 * The Hadr06 hadronic classes have their * standalone documentation @@ -92,6 +101,15 @@ /** @} */ +/** @defgroup extended_hadronic_Hadr10 Hadr10 + * The Hadr10 hadronic classes have their + * standalone documentation + * @ingroup extended_hadronic + * @{ + */ + +/** @} */ + /** @defgroup extended_hadronic_FissionFragment FissionFragment * Hadronic example FissionFragment * @ingroup extended_hadronic diff --git a/examples/.doxygen/Doxymodules_medical.h b/examples/.doxygen/Doxymodules_medical.h index e598155150..98ee18e57f 100644 --- a/examples/.doxygen/Doxymodules_medical.h +++ b/examples/.doxygen/Doxymodules_medical.h @@ -284,6 +284,27 @@ /** @} */ +/** @defgroup extended_medical_dna_scavenger scavenger + * Medical dna scavenger example + * @ingroup extended_medical_dna + * @{ + */ + + class scavenger::ActionInitialization{}; + class scavenger::DetectorConstruction{}; + class scavenger::EmDNAChemistry{}; + class scavenger::ParserChemReaction{}; + class scavenger::PhysicsList{}; + class scavenger::PrimaryGeneratorAction{}; + class scavenger::PrimaryKiller{}; + class scavenger::Run{}; + class scavenger::RunAction{}; + class scavenger::ScoreSpecies{}; + class scavenger::StackingAction{}; + class scavenger::TimeStepAction{}; + +/** @} */ + /** @defgroup extended_medical_dna_splitting splitting * Medical dna splitting example has its * standalone documentation diff --git a/examples/.doxygen/Doxymodules_runAndEvent.h b/examples/.doxygen/Doxymodules_runAndEvent.h index 07043110f6..11981fea7a 100644 --- a/examples/.doxygen/Doxymodules_runAndEvent.h +++ b/examples/.doxygen/Doxymodules_runAndEvent.h @@ -145,4 +145,15 @@ /** @} */ +/** @defgroup extended_runAndEvent_RE07 RE07 + * RunAndEvent example RE07 + * The RE07 example classes have their + * standalone documentation + * @ingroup extended_runAndEvent + * @ingroup extended_electromagnetic + * @{ + */ + +/** @} */ + /** @} */ diff --git a/examples/.doxygen/History b/examples/.doxygen/History index cc345cf968..6b1d66f56b 100644 --- a/examples/.doxygen/History +++ b/examples/.doxygen/History @@ -17,6 +17,21 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06/12/20 I.Hrivnacova (doxygen-V10-07-02) +- Added new extended example RE07 in documentation + +29/11/20 I.Hrivnacova (doxygen-V10-07-01) +- Updated for removing AnaEx03 + +7/11/20 I.Hrivnacova (doxygen-V10-07-00) +- Added new extended examples in documentation: + - eventgenerator/pythia/py8decayer + - geometry/vecGeomNavigation + - hadronic/Hadr05 + - hadronic/Hadr10 + - medical/dna/AuNP + - medical/dna/scavenger + 9/11/20 I.Hrivnacova (doxygen-V10-06-03) - Added new extended example Hadr09 in documentation diff --git a/examples/.doxygen/README b/examples/.doxygen/README deleted file mode 100644 index 99e4a37d89..0000000000 --- a/examples/.doxygen/README +++ /dev/null @@ -1,25 +0,0 @@ - -To generate Doxygen documentation for all examples: - -1) Check in Doxyfile, Doxyfile_standalone the value of - STRIP_FROM_PATH variable and adjust it if needed - -2) Download geant4.tag file from: - http://www-geant4.kek.jp/Reference/10.01/geant4.tag - and update the version number in TAGFILES value - in Doxyfile, Doxyfile_standalone - -3) Generate documentation for all examples with unique class names - (alltogether): - doxygen >& doxygen.out - -4) Generate documentation for examples with non-unique class names - (a standalone documentation will be generated for each example) - ./generate_standalone.sh - -To extract coding guildelines violations from Doxygen output -(requires using patched Doxygen): - - cat doxygen*.out | grep "### Geant4 guidelines violation: data member" >> data_members_violations.txt - cat doxygen*.out | grep "### Geant4 guidelines violation: function member" >> function_members_violations.txt - diff --git a/examples/.doxygen/generate_standalone.sh b/examples/.doxygen/generate_standalone.sh index b4e49c9757..7dc8951f25 100755 --- a/examples/.doxygen/generate_standalone.sh +++ b/examples/.doxygen/generate_standalone.sh @@ -47,12 +47,12 @@ generate() { } # process examples in second level directory in extended -for DIR in analysis/shared analysis/AnaEx01 analysis/AnaEx02 analysis/AnaEx03 electromagnetic/TestEm0 electromagnetic/TestEm1 electromagnetic/TestEm2 electromagnetic/TestEm3 electromagnetic/TestEm4 electromagnetic/TestEm5 electromagnetic/TestEm6 electromagnetic/TestEm7 electromagnetic/TestEm8 electromagnetic/TestEm9 electromagnetic/TestEm10 electromagnetic/TestEm11 electromagnetic/TestEm12 electromagnetic/TestEm13 electromagnetic/TestEm14 electromagnetic/TestEm15 electromagnetic/TestEm16 electromagnetic/TestEm17 electromagnetic/TestEm18 eventgenerator/particleGun eventgenerator/exgps eventgenerator/userPrimaryGenerator exoticphysics/channeling exoticphysics/dmparticle exoticphysics/monopole geometry/transforms hadronic/Hadr00 hadronic/Hadr01 hadronic/Hadr02 hadronic/Hadr03 hadronic/Hadr04 hadronic/Hadr06 hadronic/Hadr07 hadronic/Hadr08 hadronic/Hadr09 hadronic/NeutronSource medical/electronScattering medical/electronScattering2 medical/fanoCavity medical/fanoCavity2 medical/GammaTherapy optical/OpNovice2 physicslists/extensibleFactory physicslists/factory physicslists/genericPL polarisation/Pol01 radioactivedecay/Activation radioactivedecay/rdecay01 radioactivedecay/rdecay02; do +for DIR in analysis/shared analysis/AnaEx01 analysis/AnaEx02 electromagnetic/TestEm0 electromagnetic/TestEm1 electromagnetic/TestEm2 electromagnetic/TestEm3 electromagnetic/TestEm4 electromagnetic/TestEm5 electromagnetic/TestEm6 electromagnetic/TestEm7 electromagnetic/TestEm8 electromagnetic/TestEm9 electromagnetic/TestEm10 electromagnetic/TestEm11 electromagnetic/TestEm12 electromagnetic/TestEm13 electromagnetic/TestEm14 electromagnetic/TestEm15 electromagnetic/TestEm16 electromagnetic/TestEm17 electromagnetic/TestEm18 eventgenerator/particleGun eventgenerator/exgps eventgenerator/userPrimaryGenerator exoticphysics/channeling exoticphysics/dmparticle exoticphysics/monopole geometry/transforms hadronic/Hadr00 hadronic/Hadr01 hadronic/Hadr02 hadronic/Hadr03 hadronic/Hadr04 hadronic/Hadr05 hadronic/Hadr06 hadronic/Hadr07 hadronic/Hadr08 hadronic/Hadr09 hadronic/Hadr10 hadronic/NeutronSource medical/electronScattering medical/electronScattering2 medical/fanoCavity medical/fanoCavity2 medical/GammaTherapy optical/OpNovice2 physicslists/extensibleFactory physicslists/factory physicslists/genericPL polarisation/Pol01 radioactivedecay/Activation radioactivedecay/rdecay01 radioactivedecay/rdecay02 runAndEvent/RE07; do generate ${DIR} ${BACK_PATH2} done # process examples in third level directory in extended -for DIR in eventgenerator/HepMC/MCTruth medical/dna/chem1 medical/dna/chem2 medical/dna/chem3 medical/dna/chem4 medical/dna/chem5 medical/dna/chem6 medical/dna/clustering medical/dna/dnadamage1 medical/dna/dnaphysics medical/dna/icsd medical/dna/mfp medical/dna/microdosimetry medical/dna/microprox medical/dna/microyz medical/dna/neuron medical/dna/pdb4dna medical/dna/range medical/dna/slowing medical/dna/splitting medical/dna/spower medical/dna/svalue medical/dna/wholeNuclearDNA medical/dna/wvalue parameterisations/gflash/gflasha parallel/TopC/ParN02 parallel/TopC/ParN04; do +for DIR in eventgenerator/HepMC/MCTruth eventgenerator/pythia/py8decayer medical/dna/chem1 medical/dna/chem2 medical/dna/chem3 medical/dna/chem4 medical/dna/chem5 medical/dna/chem6 medical/dna/clustering medical/dna/dnadamage1 medical/dna/dnaphysics medical/dna/icsd medical/dna/mfp medical/dna/microdosimetry medical/dna/microprox medical/dna/microyz medical/dna/neuron medical/dna/pdb4dna medical/dna/range medical/dna/slowing medical/dna/splitting medical/dna/spower medical/dna/svalue medical/dna/wholeNuclearDNA medical/dna/wvalue parameterisations/gflash/gflasha parallel/TopC/ParN02 parallel/TopC/ParN04; do generate ${DIR} ${BACK_PATH3} done diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 506846c80f..72c97758c5 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding examples subdirectories explicitly------- -cmake_minimum_required(VERSION 2.6 FATAL_ERROR) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(advanced) add_subdirectory(basic) diff --git a/examples/History b/examples/History index 0531f35f3b..2a04836f53 100644 --- a/examples/History +++ b/examples/History @@ -16,6 +16,111 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +6th December 2021 Gabriele Cosmo (examples-V11-00-00) +- Updated reference outputs according to reference tag geant4-11-00-ref-00. +- Updated README files in the top directory (I.Hrivnacova). +- Bump required CMake version range to 3.16...3.21, + matching core Geant4 (B.Morgan). +- Includes tags: doxygen-V10-07-02, air_shower-V10-07-04, CaTS-V10-07-01, + doiPET-V10-07-03, gammaknife-V10-07-03, gorad-V10-07-05, + exhgcaltb-V10-07-05, human_phantom-V10-07-03, DMX-V10-07-10, + microbeam-V10-07-06, microelectronics-V10-07-07, + nanobeam-V10-07-03, radioprotection-V10-07-05, + XRayFluo-V10-07-07, xraytel-V10-07-04, exbasic-V10-07-02, + exampleB5-V10-07-11, analysisExample-V10-07-00, + ReverseMC01-V10-07-02, electromagnetic-V10-07-01, + exEventGenerator-V10-07-04, exgps-V10-07-03, AuNP-V10-07-05, + exExoticPhysics-V10-07-01, dmparticle-V10-07-02, + monopole-V10-07-01, phononExample-V10-07-00, chem6-V10-07-02, + exGeometry-V10-07-03, exHadronic-V10-07-04, exdna-V10-07-02, + dnadamage1-V10-07-03, microdosimetry-V10-07-04, + scavenger-V10-07-01, wholeNuclearDNA-V10-07-02, MPI-V10-07-03, + exParameterisations-V10-07-01, G02-V10-07-00, G03-V10-07-00, + expar03-V10-07-02, expar04-V10-07-00, exampleRE07-V10-07-01, + exRunAndEvent-V10-07-01, exPolarisation-V10-07-01. + +31st October 2021 Gabriele Cosmo (examples-V10-07-09) +- Updated reference outputs according to reference tag geant4-10-07-ref-09. +- Includes tags: air_shower-V10-07-02, amsEcal-V10-07-03, brachy-V10-07-04, + CaTS-V10-07-00, ChargeExchangeMC-V10-07-01, ccal-V10-07-06, + doiPET-V10-07-02, gammaraytel-V10-07-08, gorad-V10-07-04, + hadrontherapy-V10-07-08, exhgcaltb-V10-07-04, + human_phantom-V10-07-02, ICRP110Phantoms-V10-07-07, + lar_calorimeter-V10-07-03, microbeam-V10-07-05, + microelectronics-V10-07-03, nanobeam-V10-07-02, + purgmag-V10-07-03, radioprotection-V10-07-03, DMX-V10-07-10, + STCyclotron-V10-07-07, XRayFluo-V10-07-06, xraytel-V10-07-03, + exampleB3-V10-07-03, exampleB4-V10-07-06, exampleB5-V10-07-07, + AnaEx01-V10-07-01, ReverseMC01-V10-07-01, testem0-V10-07-01, + testem1-V10-07-06, testem2-V10-07-07, testem3-V10-07-03, + testem4-V10-07-03, testem5-V10-07-07, testem6-V10-07-03, + testem7-V10-07-07, testem8-V10-07-02, testem10-V10-07-00, + testem11-V10-07-05, testem12-V10-07-04, testem14-V10-07-02, + testem15-V10-07-03, testem16-V10-07-02, testem17-V10-07-02, + testem18-V10-07-02, exgps-V10-07-02, dmparticle-V10-07-01, + particleGunExample-V10-07-02, channelingExample-V10-07-03, + monopole-V10-07-00, saxs-V10-07-03, fieldex04-V10-07-00, + exhadr00-V10-07-01, exhadr03-V10-07-05, exhadr04-V10-07-06, + NeutronSource-V10-07-11, AuNP-V10-07-04, chem4-V10-07-00, + chem6-V10-07-00, clustering-V10-07-01, dnadamage1-V10-07-02, + dnaphysics-V10-07-01, exicsd-V10-07-01, mfp-V10-07-01, + microdosimetry-V10-07-03, microprox-V10-07-02, range-V10-07-01, + microyz-V10-07-02, neuron-V10-07-03, pdb4dna-V10-07-00, + slowing-V10-07-02, splitting-V10-07-02, svalue-V10-07-02, + wholeNuclearDNA-V10-07-01, electronScattering-V10-07-03, + wvalue-V10-07-01, fano-V10-07-03, fano2-V10-07-03, + gtherapy-V10-07-02, LXe-V10-07-03, OpNovice-V10-07-06, + OpNovice2-V10-07-02, WLS-V10-07-04, exampleRE06-V10-07-01, + exgflash-V10-07-02, expar02-V10-07-01, expar03-V10-07-01, + extFactory-V10-07-01, factory-V10-07-01, genericPL-V10-07-01, + physicslistsShared-V10-07-01, exam-ext-vis-persp-V10-07-00, + expol01-V10-07-03, activation-V10-07-11, rdecay01-V10-07-03, + rdecay02-V10-07-04, exampleRE05-V10-07-01, MPI-V10-07-02. + +30th September 2021 Gabriele Cosmo (examples-V10-07-08) +- Updated reference outputs according to reference tag geant4-10-07-ref-08. +- Includes tags: brachy-V10-07-03, STCyclotron-V10-07-06, DMX-V10-07-08, + testem1-V10-07-05, testem7-V10-07-06, exgps-V10-07-01, + channelingExample-V10-07-02, exhadr05-V10-07-04, + DICOM-V10-07-01, WLS-V10-07-02, G01-V10-07-02. + +31st August 2021 Gabriele Cosmo (examples-V10-07-07) +- Updated reference outputs according to reference tag geant4-10-07-ref-07. +- Includes tags: air_shower-V10-07-01, amsEcal-V10-07-02, brachy-V10-07-02, + ccal-V10-07-03, eRosita-V10-07-01, gammaraytel-V10-07-07, + gorad-V10-07-02, hadrontherapy-V10-07-06, exhgcaltb-V10-07-03, + human_phantom-V10-07-01, ICRP110Phantoms-V10-07-06, + lar_calorimeter-V10-07-01, microelectronics-V10-07-02, + microbeam-V10-07-04, nanobeam-V10-07-01, STCyclotron-V10-07-05, + radioprotection-V10-07-02, DMX-V10-07-07, XRayFluo-V10-07-03, + xraytel-V10-07-02, exampleB1-V10-07-03, exampleB2-V10-07-02, + exampleB3-V10-07-02, exampleB4-V10-07-05, exampleB5-V10-07-06, + AnaEx01-V10-07-00, ReverseMC01-V10-07-00, testem1-V10-07-04, + testem3-V10-07-02, testem4-V10-07-02, testem5-V10-07-06, + testem6-V10-07-01, testem7-V10-07-05, testem8-V10-07-00, + testem9-V10-07-02, testem11-V10-07-04, testem12-V10-07-03, + testem14-V10-07-01, testem15-V10-07-02, testem16-V10-07-01, + testem17-V10-07-01, testem18-V10-07-01, exgps-V10-07-00, + particleGunExample-V10-07-01, channelingExample-V10-07-01, + dmparticle-V10-07-00, saxs-V10-07-00, exHadronic-V10-07-02, + VecGeomNavigation-V10-07-02,exhadr00-V10-07-00, + exhadr01-V10-07-01, exhadr02-V10-07-04, exhadr03-V10-07-04, + exhadr04-V10-07-04, exhadr05-V10-07-03, exhadr06-V10-07-12, + exhadr07-V10-07-10, NeutronSource-V10-07-09, AuNP-V10-07-02, + chem3-V10-07-01, clustering-V10-07-00, dnadamage1-V10-07-01, + dnaphysics-V10-07-00, exicsd-V10-07-00, mfp-V10-07-00, + microdosimetry-V10-07-02, microprox-V10-07-01, range-V10-07-00, + microyz-V10-07-01, neuron-V10-07-02, pdb4dna-V10-06-02, + slowing-V10-07-01, splitting-V10-07-01, svalue-V10-07-01, + wholeNuclearDNA-V10-07-00, electronScattering-V10-07-01, + wvalue-V10-07-00, fano-V10-07-02, fano2-V10-07-02, + gtherapy-V10-07-01, LXe-V10-07-02, OpNovice-V10-07-04, + OpNovice2-V10-07-01, exgflash-V10-07-00, expar02-V10-07-00, + expar03-V10-07-00, extFactory-V10-07-00, factory-V10-07-00, + genericPL-V10-07-00, physicslistsShared-V10-07-00, + expol01-V10-07-02, activation-V10-07-09, rdecay01-V10-07-02, + rdecay02-V10-07-03, exam-ext-vis-movies-V10-07-03. + 25th June 2021 Gabriele Cosmo (examples-V10-07-06) - Updated reference outputs according to reference tag geant4-10-07-ref-06. - Includes tags: exhgcaltb-V10-07-02, microbeam-V10-07-03, exampleB1-V10-07-01, diff --git a/examples/README b/examples/README deleted file mode 100644 index 05ecf1f2db..0000000000 --- a/examples/README +++ /dev/null @@ -1,180 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Examples module - --------------- - -This module collects four sets of user examples aimed to demonstrate to -the user how to make correct use of the GEANT4 toolkit by implementing -in a correct way those user-classes which the user is supposed to -customize in order to define his/her own simulation setup. - -The "basic" set of examples is oriented to novice users and covering -the most typical use-cases of a Geant4 application with keeping simplicity -and ease of use. - -An "extended" set of examples may require some additional libraries besides -of Geant4. This set covers many specific use cases for actual detector -simulation. - -An "advanced" set of examples covers the use-cases typical of a -"toolkit"-oriented kind of development, where real complete applications -for different simulation studies are provided; may require additional third -party products to be built. - -Most of the examples can be run both in interactive and batch mode, and -input macro files (*.in) and reference output files (*.out) are provided. -See the detailed instructions how to build and how to run an example -in README.HowToRun and README.HowToRunTestEm1. Several tips how to run -an example in multi-threading mode can be found in README.HowToRunMT. - -Basic and most of the extended examples are considered part of the -system testing suite for validation of the official releases of the -GEANT4 toolkit. Basic and some of the extended and advanced -examples are also used as "acceptance"-tests for the release process. - -The previous set of examples oriented to novice users, "novice", -has been refactored in "basic" and "extended" examples sets in Geant4 10.0. -The source code of the last version of the original novice examples set -(in 9.6.p02 release) can be viewed in the Geant4 LXR code browser: - http://www-geant4.kek.jp/lxr/source/examples/novice/?v=9.6.p2 -Old novice examples are now mapped as follows in the 10.0 release: -- N01 - removed -- N02 - basic/B2 -- N03 - basic/B4 -- N04 - extended/runAndEvent/RE05 -- N05 - extended/parameterisations/Par01 -- N06 - extended/optical/OpNovice -- N07 - extended/runAndEvent/RE06 - -Basic examples - ExampleB1 - - Simple geometry with a few solids - - Scoring total dose in a selected volume user action classes - - ExampleB2 - - Simplified tracker geometry with global constant magnetic field - - Scoring within tracker via G4 sensitive detector and hits - - Started from novice/N02 example - - ExampleB3 - - Schematic Positron Emitted Tomography system - - Radioactive source - - Scoring within Crystals via G4 scorers - - ExampleB4 - - Simplified calorimeter with layers of two materials - - Scoring within layers in four ways: via user actions (a), via user own - object (b), via G4 sensitive detector and hits (c) and via scorers (d) - - Started from novice/N03 example - -Extended level examples - analysis - - Histogramming through the AIDA interface - biasing - - Examples of event biasing, scoring and reverse-MC - common - - A set of common classes which can be reused in other examples demonstrating - just a particular feature - electromagnetic - - Specific EM physics simulation with histogramming - errorpropagation - - Use of the error propagation utility (Geant4e) - eventgenerator - - Applications using interface to HepMC - exoticphysics - - Exotic simulation applications (classical magnetic monopole, etc...) - field - - Specific simulation setups in magnetic field - g3tog3 - - Examples of usage of the g3tog4 converter tool - geometry - - Specific geometry examples and tools: OLAP tool for detection - of overlapping geometries - hadronic - - Specific hadronic physics simulation with histogramming - medical - - Specific examples for medical physics applications - optical - - Examples of generic optical processes simulation setups - parallel - - Examples of event-level parallelism in Geant4 using either the - TOP-C library, Intel-TBB library or MPI technique - parameterisations - - Examples for fast shower parameterisations according to specific models - persistency - - Persistency of geometry (GDML or ASCII) and simulation output - polarisation - - Use of physics processes including polarization - radioactivedecay - - Examples to simulate the decays of radioactive isotopes and - induced radioactivity resulted from nuclear interactions - runAndEvent - - Examples to demonstrate how to connect the information between - primary particles and hits and utilize user-information classes - visualization - - Specific visualization features and graphical customisations - -Advanced level examples - air_shower - - Simulation of the ULTRA detector for UV and charged particles - detection in cosmic rays - amsEcal - - Simplified AMS Ecal calorimeter structure - brachytherapy - - Setup for brachytherapy Ir-192 HDR source - ChargeExchangeMC - - Charge Exchange Monte Carlo - composite_calorimeter - - Test-beam simulation used in CMS against real data taken - in 1996 in a CMS Hadron calorimeter test-beam at LHC - dnageometry - - Setup of a realistic nucleus model of a cell, including chromosomes, - in combination with Geant4-DNA physics - eRosita - - Simplified eROSITA X-ray telescope setup for instrumental background - simulations for fluorescence measurements. - gammaknife - - Application specifically developed to simulate an advanced device for - Stereotactic Radiosurgery; reproduces a Leksell Gamma-Knife unit model C - gammaray_telescope - - Simulation of a typical telescope for gamma ray analysis - hadrontherapy - - Simulation of a hadron therapy beam line - human_phantom - - Anthropomorphic phantoms (male and female) based on MIRD/ORNL model - with geometry description derived from GDML persistent files - iort_therapy - - Application specifically developed to address typical needs related to - the Intra-Operative Radio-Therapy (IORT) technique - lAr_calorimeter - - Simulation of the Liquid Argon Calorimeter of the ATLAS - Detector at LHC - medical_linac - - Simulation of energy deposit in a Phantom filled with water - for a typical linac used for intensity modulated radiation therapy - microbeam - - Simulation of the cellular irradiation beam line installed on the AIFIRA - electrostatic accelerator facility located at CENBG, France - microelectronics - - Simulating tracks of a 5 MeV proton in silicon. - nanobeam - - Simulation of the beam optics of the nanobeam line installed on the AIFIRA - electrostatic accelerator facility located at CENBG, France. - purging_magnet - - Simulation of electrons traveling through a 3D magnetic field of a - strong purging magnet used for treatment head in a medical environment - radioprotection - - Modeling a simplified diamond microdosimeter for radioprotection - applications in space environments. - underground_physics - - Setup of an underground dark matter experiment - xray_fluorescence - - Test beam to characterize the response function of an - HPGe detector used to measure fluorescence emissions - xray_telescope - - Realistic simulation of an X-ray Telescope - diff --git a/examples/README.HowToRun b/examples/README.HowToRun deleted file mode 100644 index cc36a06cf7..0000000000 --- a/examples/README.HowToRun +++ /dev/null @@ -1,115 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - How to build and run an example - ------------------------------- - - All novice, basic and most of extended examples have a similar structure. - The main () function is included in exampleXYZ.cc in the example top directory - and the example source code is structered in include and src subdirectories. - When the example is built, the executable takes the same name as the file with - main() function without .cc extension, exampleXYZ. - - Then several macros are provided to run the example with various start-up - conditions. These macros have usually .mac extension. Besides these macros, - there is often a macro exampleXYZ.in (note its different extension) - which is used in Geant4 testing and which output, exampleXYZ.out, can also included - in the distribution. - - You can find all details about building the examples in the Geant4 Installation Guide: - "http://geant4.web.cern.ch/geant4/UserDocumentation/UsersGuides/InstallationGuide/html/index.html" - in the section 3.2. Building Applications with Geant4: - http://geant4.web.cern.ch/geant4/UserDocumentation/UsersGuides/InstallationGuide/html/ch03s02.html" - Here we recall only the basics. - - 1) COMPILE AND LINK TO GENERATE AN EXECUTABLE - - 1a) With CMake - - % cd path_to_exampleXYZ # go to directory which contains your example - % mkdir exampleXYZ_build - % cd exampleXYZ_build - % cmake -DGeant4_DIR=path_to_Geant4_installation/lib[64]/Geant4-10.0.0/ ../exampleXYZ - % make -j N exampleXYZ # "N" is the number of processes - % make install # this step is optional - - 1b) With GNUmake - - To use GNUmake build system when Geant4 was installed with CMake, you have to source first - the setup script in order to define needed environment variables: - - % source path_to_Geant4_installation/share/Geant4-10.0.0/geant4make/geant4make.[c]sh - - Then to build example - - % cd path_to_exampleXYZ/exampleXYZ - % gmake - - An additional step is needed when building an example using shared classes - (usually from ../shared directory) or classes from common: - - % cd path_to_exampleXYZ/exampleXYZ - % gmake setup - % gmake - - When building the example in this way make sure that the path to the example executable - and its shared library is added in the paths defined on your system - (eg. PATH and LD_LIBRARY_PATH on Linux). - - 2) EXECUTE EXAMPLEXYZ IN 'BATCH' MODE FROM MACRO FILES - - ... go to the directory where examples was built/installed - % exampleXYZ xyz.mac - - 3) EXECUTE EXAMPLEXYZ IN 'INTERACTIVE MODE' WITH VISUALIZATION - - ... go to the directory where examples was built/installed - % exampleXYZ - .... - Idle> type your commands - .... - Idle> exit - - - Below we give the explicit instructions for the example - extended/electromagnetic/TestEm1. - - Let's suppose that the TestEm1 directory is available in $HOME and Geant4 - installation in /usr/local and we work within bash shell on a 64-bit machine. - - 1) COMPILE AND LINK TESTEM1 TO GENERATE AN EXECUTABLE - - 1a) With CMake - - % cd $HOME - % mkdir TestEm1_build - % cd TestEm1_build - % cmake -DGeant4_DIR=/usr/local/lib64/Geant4-10.0.0/ ../TestEm1 - % make -j 2 TestEm1 - - 1b) With GNUmake - - % cd $HOME/TestEm1 - % source /usr/local/share/Geant4-10.0.0/geant4make/geant4make.sh - % make - - 2) EXECUTE TESTEM1 IN 'BATCH' MODE FROM MACRO FILES - - % cd $HOME/TestEm1_build # or cd $HOME/TestEm1 if example was built with GNUmake - % TestEm1 annihil.mac - % TestEm1 brem.mac - % TestEm1 TestEm1.in >& myTestEm1.out # redirecting output in a file - - 3) EXECUTE TESTEM1 IN 'INTERACTIVE MODE' WITH VISUALIZATION - - % cd $HOME/TestEm1_build # or cd $HOME/TestEm1 if example was built with GNUmake - % TestEm1 - PreInit> /run/initialize - Idle> /run/beamOn 1 - ... - Idle> exit - -*/ diff --git a/examples/README.HowToRunMT b/examples/README.HowToRunMT deleted file mode 100644 index afd8520095..0000000000 --- a/examples/README.HowToRunMT +++ /dev/null @@ -1,87 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Tips how to run an example in multi-threading mode - -------------------------------------------------- - - Only migrated examples or user applications can be run in multi-threading (MT) mode. - The instructions for migrating user applications can be found in Geant4 documentation guides - and a short howto is available here: - - https://twiki.cern.ch/twiki/bin/view/Geant4/QuickMigrationGuideForGeant4V10 - - In this file, we give just useful tips for running already migrated examples - (or user applications). - - 1) RUN EXAMPLE IN MULTI-THREADING MODE - - No special steps are needed to build an example in multi-threading mode. - The examples which has been migrated to multi-threading will automatically - run in MT when they are built against the Geant4 libraries built with MT mode - activated, otherwise they will run in sequential mode. - Not migrated examples will run in sequential mode even when built against - Geant4 libraries built with MT mode activated. - - The examples which support MT can be easily recognized by the following lines - of code in main (): - - #ifdef G4MULTITHREADED - G4MTRunManager* runManager = new G4MTRunManager; - #else - G4RunManager* runManager = new G4RunManager; - #endif - - The compiler flag -DG4MULTITHREADED is automatically set when building applications - using Geant4's CMake (via GEANT4_USE_FILE) and GNUmake systems, and is listed in - the flags reported by the --cflags option of the geant4-config program. - - 2) SET NUMBER OF THREADS - - When the number of threads is not selected in the application, the default number - (which is actually 2) will be used. Another number of threads can be set in several - ways: - - - in the code - - #ifdef G4MULTITHREADED - G4MTRunManager* runManager = new G4MTRunManager; - runManager->SetNumberOfThreads(4); - #else - ... - - - in a macro file via UI command added just before /run/initialize - - /run/numberOfThreads 4 - - - by setting the environment variable - - export G4FORCENUMBEROFTHREADS = 4 - or - setenv G4FORCENUMBEROFTHREADS 4 - - The environment variable value is forced and it cannot be changed from a code - call or a macro. A warning is issued in such situation. - - 3) OUTPUT FROM THREADS - - In MT processing each worker produces its output and these messages are interlayed - on the screen. The messeges from threads are preceded with a predefined string - G4WTi> where i is the thread number. Users can change this default behaviour - and choose - - - to buffer the output from each thread at a time, so that the output of each - thread is grouped and printed at the end of the job - - /control/cout/useBuffer true|false - - - to limit the output from threads to one selected thread only: - - /control/cout/ignoreThreadsExcept 0 - - - to redirect the output from threads in a file: - - /control/cout/setCoutFile coutFileName - /control/cout/setCerrFile cerrFileName diff --git a/examples/advanced/CMakeLists.txt b/examples/advanced/CMakeLists.txt index eb42ade637..797cc82754 100644 --- a/examples/advanced/CMakeLists.txt +++ b/examples/advanced/CMakeLists.txt @@ -1,5 +1,5 @@ #---Adding all advanced examples subdirectories explicitly -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) #---------------------------------------------------------------------------- # some examples require Geant4 build with optional packages diff --git a/examples/advanced/CaTS/CMakeLists.txt b/examples/advanced/CaTS/CMakeLists.txt new file mode 100644 index 0000000000..51bd582eea --- /dev/null +++ b/examples/advanced/CaTS/CMakeLists.txt @@ -0,0 +1,123 @@ +cmake_minimum_required(VERSION 3.16...3.21) +set(name CaTS) +project(${name} VERSION 0.1.0) + +option(WITH_ROOT "Build example with ROOT" ON) +option(WITH_G4OPTICKS "Build example with OPTICKS" OFF) +option(G4ANALYSIS_USE "Build example with Analysis" ON) + +#---------------------------------------------------------------------------- +# Find Geant4 package, activating all available UI and Vis drivers by default +# You can set WITH_GEANT4_UIVIS to OFF via the command line or ccmake/cmake-gui +# to build a batch mode only executable +# +option(WITH_GEANT4_UIVIS "Build example with Geant4 UI and Vis drivers" ON) +if(WITH_GEANT4_UIVIS) + find_package(Geant4 REQUIRED ui_all vis_all) +else() + find_package(Geant4 REQUIRED) +endif() +#---------------------------------------------------------------------------- +# Setup Geant4 include directories and compile definitions +# +include(${Geant4_USE_FILE}) +#---------------------------------------------------------------------------- +# CaTS requires shared libraries +# +if(NOT Geant4_shared_FOUND) + message(FATAL_ERROR "CaTS must use shared libraries") +endif() + +if(WITH_G4OPTICKS) + message(STATUS "WITH_G4OPTICKS is set") + include(OpticksBuildOptions) + find_package( G4OK CONFIG REQUIRED ) +else() + message(STATUS "WITH_G4OPTICKS is not set") + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/modules") + include(CaTSCXXFlags) +endif() + +if(WITH_ROOT) + find_package(ROOT REQUIRED) +# ROOT version 6 required + if(ROOT_FOUND) + STRING(REGEX MATCH "6.*" VERSION6MATCH ${ROOT_VERSION}) + if(NOT VERSION6MATCH) + message(FATAL_ERROR "${name} requires ROOT 6") + endif() + endif() +# Include ROOT's CMake functions for dictionary generation +# since root6.20, the file is renamed and included by default, so include +# only when we find the *old* name + if(EXISTS "${ROOT_DIR}/modules/RootNewMacros.cmake") + include("${ROOT_DIR}/modules/RootNewMacros.cmake") + endif() +endif() +file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc) +file(GLOB headers ${PROJECT_SOURCE_DIR}/include/*.hh) +if(WITH_ROOT) +#---------------------------------------------------------------------------- +# Locate sources and headers for this project +# + include_directories(${PROJECT_SOURCE_DIR}/include + ${Geant4_INCLUDE_DIR} + ${ROOT_INCLUDE_DIRS}) +#---------------------------------------------------------------------------- +# Generate dictionaries, add ROOT libraries properties +# + REFLEX_GENERATE_DICTIONARY(CaTSClasses include/CaTSClasses.hh SELECTION xml/selection.xml) + add_library(CaTSClassesDict SHARED ${sources} CaTSClasses.cxx) + set(libsuffix .so) + set(ROOT_LIBRARY_PROPERTIES ${ROOT_LIBRARY_PROPERTIES} SUFFIX ${libsuffix}) + set_target_properties(CaTSClassesDict PROPERTIES ${ROOT_LIBRARY_PROPERTIES}) + target_link_libraries(CaTSClassesDict ${Geant4_LIBRARIES} ${ROOT_LIBRARIES}) +else() + include_directories(${PROJECT_SOURCE_DIR}/include + ${Geant4_INCLUDE_DIR}) +endif() + +file(GLOB detectors ${PROJECT_SOURCE_DIR}/gdml/*.gdml) +file(GLOB schemas ${PROJECT_SOURCE_DIR}/gdml/*.xsd) +file(GLOB scripts ${PROJECT_SOURCE_DIR}/scripts/*) +file(GLOB macros ${PROJECT_SOURCE_DIR}/macros/*.mac) +file(GLOB runscripts ${PROJECT_SOURCE_DIR}/scripts/run.sh ${PROJECT_SOURCE_DIR}/scripts/check.sh) + +if(WITH_G4OPTICKS) + add_executable(${name} ${name}.cc ${sources} ${headers}) + target_compile_definitions( ${name} PRIVATE WITH_G4OPTICKS WITH_ROOT) + target_link_libraries(${name} CaTSClassesDict Opticks::G4OK ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} ) +else() + add_executable(${name} ${name}.cc ${sources} ${headers}) + target_compile_definitions( ${name} PRIVATE WITH_ROOT) + target_link_libraries(${name} CaTSClassesDict ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} ) +endif() +if(WITH_ROOT) + add_executable(readPhotonHits readPhotonHits.cc ${sources} ${headers}) + target_link_libraries(readPhotonHits CaTSClassesDict ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} ) + add_executable(readCalorimeterHits readCalorimeterHits.cc ${sources} ${headers}) + target_link_libraries(readCalorimeterHits CaTSClassesDict ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} ) + add_executable(readMscHits readMscHits.cc ${sources} ${headers}) + target_link_libraries(readMscHits CaTSClassesDict ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} ) + add_executable(readDRCalorimeterHits readDRCalorimeterHits.cc ${sources} ${headers}) + target_link_libraries(readDRCalorimeterHits CaTSClassesDict ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} ) + link_directories( ${ROOT_LIBRARY_DIR} ) +endif() + +install(TARGETS ${name} DESTINATION bin) +install(FILES ${detectors} ${schemas} ${scripts} ${macros} DESTINATION bin) +install(FILES ${detectors} DESTINATION bin/gdml) +install(FILES ${macros} DESTINATION bin/macros) +install(PROGRAMS ${runscripts} DESTINATION bin) +if(WITH_ROOT) + install(TARGETS CaTSClassesDict DESTINATION bin) + install(TARGETS readPhotonHits DESTINATION bin) + install(TARGETS readCalorimeterHits DESTINATION bin) + install(TARGETS readDRCalorimeterHits DESTINATION bin) + install(TARGETS readMscHits DESTINATION bin) + install(FILES ${PROJECT_BINARY_DIR}/CaTSClasses_rdict.pcm DESTINATION bin) +endif() + +message(STATUS "G4ANALYSIS_USE: ${G4ANALYSIS_USE}") +message(STATUS "WITH_G4OPTICKS: ${G4OPTICKS}") +message(STATUS "WITH_ROOT: ${ROOT}") diff --git a/examples/advanced/CaTS/CaTS.cc b/examples/advanced/CaTS/CaTS.cc new file mode 100644 index 0000000000..aefeb1223e --- /dev/null +++ b/examples/advanced/CaTS/CaTS.cc @@ -0,0 +1,236 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +//--------------------------------------------------------------------- +//* |\___/| * +//* ) ( * +//* =\ /= * +//* )===( * +//* / \ CaTS: Calorimeter and Tracker Simulation * +//* | | is a flexible and extend-able framework * +//* / \ for the simulation of various detector * +//* \ / systems * +//* \__ _/ https://github.com/hanswenzel/CaTS * +//* ( ( * +//* ) ) * +//* (_( * +//* CaTS also serves as an example that demonstrates how to use * +//* opticks from within Geant4 for the creation and propagation of * +//* optical photons. * +//* see https://bitbucket.org/simoncblyth/opticks.git). * +//* Ascii Art by Joan Stark: https://www.asciiworld.com/-Cats-2-.html * +//--------------------------------------------------------------------- +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file CaTS.cc +/// \brief main driver of CaTS +// +// project headers: +#include "ActionInitialization.hh" +#include "CaTSVersion.hh" +#include "ConfigurationManager.hh" +#include "DetectorConstruction.hh" +#include "PhysicsConfigurator.hh" +// Geant4 headers: +#include "G4RunManager.hh" +#include "G4RunManagerFactory.hh" +#include "G4Timer.hh" +#include "G4UIExecutive.hh" +#include "G4UImanager.hh" +#include "G4VModularPhysicsList.hh" +#include "G4VisExecutive.hh" +#include +#ifdef WITH_G4OPTICKS +# include "OPTICKS_LOG.hh" +#endif +#include "TROOT.h" +#include + +int main(int argc, char** argv) +{ +#ifdef G4MULTITHREADED + G4int nThreads = 0; +#endif + G4bool interactive = false; + G4String physicsconf = ""; + G4String gdmlfile = ""; + G4String macrofile = ""; + G4UIExecutive* ui = nullptr; + for(G4int i = 1; i < argc; i = i + 2) + { + if(G4String(argv[i]) == "-g") + { + gdmlfile = argv[i + 1]; + } + else if(G4String(argv[i]) == "-pl") + { + physicsconf = G4String(argv[i + 1]); + } + else if(G4String(argv[i]) == "-m") + { + macrofile = G4String(argv[i + 1]); + } +#ifdef G4MULTITHREADED + else if(G4String(argv[i]) == "-t") + { + nThreads = G4UIcommand::ConvertToInt(argv[i + 1]); + } +#endif + } + if(gdmlfile == "") + { + G4cout << "Error! Mandatory input file is not specified!" << G4endl; + G4cout << G4endl; + G4cout << G4endl; + G4cout << "Usage: CaTS -g input_gdml_file:mandatory" << G4endl; + G4cout << G4endl; + return -1; + } + G4cout + << G4endl + << "---------------------------------------------------------------------" + << G4endl + << "* |\\___/| " + "*" + << G4endl + << "* ) ( *" + << G4endl + << "* =\\ /= " + "*" + << G4endl + << "* )===( Welcome to: *" + << G4endl + << "* / \\ CaTS: Calorimeter and Tracker Simulation " + "*" + << G4endl + << "* | | a flexible and extend-able framework *" + << G4endl + << "* / \\ for the simulation of various detector " + "*" + << G4endl + << "* \\ / systems *" + << G4endl + << "* \\__ _/ https://github.com/hanswenzel/CaTS " + "*" + << G4endl + << "* ( ( *" + << G4endl << "* ) ) Version: " << CaTSVersion + << " *" << G4endl + << "* (_( Date: " << CaTSDate << " *" + << G4endl + << "---------------------------------------------------------------------" + << G4endl << G4endl; + if(physicsconf == "") + { + G4cout << "Warning! no physics configuration specified!" << G4endl; + G4cout << "Using default FTFP_BERT+OPTICAL+STEPLIMIT" << G4endl; + physicsconf = "FTFP_BERT+OPTICAL+STEPLIMIT"; + G4cout << "Usage: CaTS -pl physicsconfiguration" << G4endl; + G4cout << G4endl; + } + if(macrofile == "") + { + G4cout << "Warning! no macro specified!" << G4endl; + G4cout << "assume interactive mode" << G4endl; + interactive = true; + ui = new G4UIExecutive(argc, argv); + G4cout << G4endl; + G4cout << G4endl; + G4cout << "Usage: CaTS -m macrofile" << G4endl; + G4cout << G4endl; + } + G4Timer* eventTimer = new G4Timer; + eventTimer->Start(); +#ifdef WITH_G4OPTICKS + OPTICKS_LOG(argc, argv); +#endif + G4VModularPhysicsList* phys = + PhysicsConfigurator::getInstance()->Construct(physicsconf); + G4String DumpFilename = gdmlfile + "_G4"; + ConfigurationManager::getInstance()->setGDMLFileName(DumpFilename); + DetectorConstruction* dc = new DetectorConstruction(gdmlfile); + // Run manager + auto* rm = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default); + + // G4RunManagerFactory::CreateRunManager(G4RunManagerType::SerialOnly); +#ifdef G4MULTITHREADED + // number of threads not set so use number of cores + if(nThreads == 0) + { + nThreads = G4Threading::G4GetNumberOfCores(); + } + if(nThreads > 0) + { + rm->SetNumberOfThreads(nThreads); + } +#endif + rm->SetUserInitialization(dc); + rm->SetUserInitialization(phys); + ActionInitialization* actionInitialization = new ActionInitialization(); + rm->SetUserInitialization(actionInitialization); + G4UImanager* UImanager = G4UImanager::GetUIpointer(); + if(interactive) + { + G4VisManager* visManager = new G4VisExecutive; + visManager->Initialize(); + UImanager->ApplyCommand("/control/execute init_vis.mac"); + ui->SessionStart(); + delete ui; + delete visManager; + } + else + { + // batch mode + G4String command = "/control/execute "; + UImanager->ApplyCommand(command + macrofile); + + delete ui; + } + eventTimer->Stop(); + double totalCPUTime = + eventTimer->GetUserElapsed() + eventTimer->GetSystemElapsed(); + G4int precision_t = G4cout.precision(3); + std::ios::fmtflags flags_t = G4cout.flags(); + G4cout.setf(std::ios::fixed, std::ios::floatfield); + G4cout << "TimeTotal> " << eventTimer->GetRealElapsed() << " " << totalCPUTime + << G4endl; + G4cout.setf(flags_t); + G4cout.precision(precision_t); + delete eventTimer; + delete rm; + return 0; +} diff --git a/examples/advanced/CaTS/Examples.md b/examples/advanced/CaTS/Examples.md new file mode 100644 index 0000000000..ccd41d76a2 --- /dev/null +++ b/examples/advanced/CaTS/Examples.md @@ -0,0 +1,31 @@ +# Examples +Here we provide examples for running CaTS (without Opticks). The examples consist of a gdml file to define the detector configuration. + +## homogeneous Crystal Calorimeter +Here we just read out the energy deposited in a huge Crystal. + + time ./CaTS -g homogeneous_pbwo_crystalcal.gdml -pl 'FTFP_BERT' -m pip_IO_Calo.mac + time ./readCalorimeterHits CaloHits_Run0.root CaloHistos.root CalorimeterVolume + +The created histogram can then be looked at using ROOT + +![alt text](https://github.com/hanswenzel/CaTS/blob/master/images/CaloHistos.png) + +## Dual Read out Crystal Calorimeter + +Here in addtion to the deposited energy in the calorimeter cell we readout the number of Cerenkov photons that have been produced. + + ./CaTS -g crystalcal_pbwo.gdml -pl 'FTFP_BERT+OPTICAL' -m pip_IO_DR.mac + ./readDRCalorimeterHits DRCaloHits_Run0.root DRCaloHhstos.root CalorimeterVolume + +## multiple scattering at a thin Diamond layer + +In this example we register the momentum of a particle as it undergaos multiple scatering in a thin Diamond layer. + + ./CaTS -g DiamondTarget.gdml -pl 'FTFP_BERT' -m msc.mac + ./readMscHits Msc_Run0.root ms_histos.root 'volTarget' + + +The created histogram can then be looked at using ROOT + +![alt text](https://github.com/hanswenzel/CaTS/blob/master/images/mscHistos.png) diff --git a/examples/advanced/CaTS/History b/examples/advanced/CaTS/History new file mode 100644 index 0000000000..5c3c6fcf5e --- /dev/null +++ b/examples/advanced/CaTS/History @@ -0,0 +1,14 @@ +------------------------------------------------------------------- +------------------------------------------------------------------- + + ========================================================= + Geant4 - CaTS example + ========================================================= + + Package History file + +19 Novemebr 2021 - tag CaTS-V10-07-01 - I. Hrivnacova +- Fixed PrimaryGeneratorAction destructor + +22 October 2021 - tag CaTS-V10-07-00 - H. Wenzel +- first version of CaTS example committed diff --git a/examples/advanced/CaTS/Instructions.md b/examples/advanced/CaTS/Instructions.md new file mode 100644 index 0000000000..f98aedaffc --- /dev/null +++ b/examples/advanced/CaTS/Instructions.md @@ -0,0 +1,301 @@ +# Prerequisites +Opticks requires Geant4 (10.7.p02), nvidia cuda (11.3) and nvidia Optix (6.5) among other libraries. CaTS in addition will require ROOT. If all these libraries and development headers are available on your machine skip directly to (**Building opticks vs. existing libraries**). On a 'blank' computing system it makes sense to build CLHEP, then Geant4 and finally ROOT assuring that all the necessary development libraries and headers are installed. + +# Building CLHEP +The current version of Geant4 10.07.p02 is build on clhep 2.4.4.0. +CLHEP can be found at: +https://proj-clhep.web.cern.ch/proj-clhep/clhep23.html + +to build it from scratch using cmake (used cmake version 3.20.5) + + cd to the directory where you want to build clhep + wget https://proj-clhep.web.cern.ch/proj-clhep/dist1/clhep-2.4.4.0.tgz + tar xzvf clhep-2.4.4.0.tgz + cd 2.4.4.0/ + mkdir CLHEP-build + cd CLHEP-build + cmake -DCMAKE_INSTALL_PREFIX=../CLHEP-install DCLHEP_BUILD_CXXSTD=-std=c++11 ../CLHEP + make -j 8 + make install + +**Note** the default install directory is /usr/local but one needs root privileges to install it there: + + cd to the directory where you want to build clhep + wget https://proj-clhep.web.cern.ch/proj-clhep/dist1/clhep-2.4.4.0.tgz + tar xzvf clhep-2.4.4.0.tgz + cd 2.4.4.0/ + mkdir CLHEP-build + cd CLHEP-build + cmake -DCLHEP_BUILD_CXXSTD=-std=c++11 ../CLHEP + make -j 8 + sudo make install + +# Building Geant4 + +Geant4 versions are available at: +https://geant4.web.cern.ch/support/download + + + cd to the directory where you want to install Geant4 + wget https://geant4-data.web.cern.ch/releases/geant4.10.07.p02.tar.gz + mkdir geant4.10.07.p02-build + cd geant4.10.07.p02-build + cmake -DCMAKE_INSTALL_PREFIX=../geant4.10.07.p02-install -DGEANT4_BUILD_VERBOSE_CODE=OFF -DGEANT4_INSTALL_DATA=ON -DGEANT4_USE_SYSTEM_CLHEP=ON -DGEANT4_USE_GDML=ON -DGEANT4_USE_SYSTEM_EXPAT=ON -DGEANT4_USE_SYSTEM_ZLIB=ON -DGEANT4_USE_QT=ON -DGEANT4_BUILD_MULTITHREADED=ON -DGEANT4_USE_OPENGL_X11=ON ../geant4.10.07.p02 + make -j 8 + make install + . ../geant4.10.07.p02-install/bin/geant4.sh + + +check the output for any error, install any development packages that might be necessary. + + + + +# Building ROOT +Instructions how to build ROOT from ssource can be found at: +https://root.cern/install/build_from_source/ + + # cd to the diretory where you want to install root + git clone --branch latest-stable https://github.com/root-project/root.git root_src + mkdir root-build + cd root-build + cmake -DCMAKE_INSTALL_PREFIX=../root-install ../root + # speed up the make process + new=" -j$(($(grep -c ^processor /proc/cpuinfo) - 1))" + case ":${MAKEFLAGS:=$new}:" in + *:"$new":*) ;; + *) MAKEFLAGS="$MAKEFLAGS:$new" ;; + esac + cmake -DCMAKE_INSTALL_PREFIX=../root-install ../root_src/ + cmake --build . --target install + +check the output for any error, install any development packages that might be necessary. + + + . ../root-install/bin/thisroot.sh + root + + +# Installing CUDA + +cuda (11.3) is available at the NVIDIA web site just follow the instruction depending on the system you are using. + +https://developer.nvidia.com/cuda-downloads + +**Note** this will also install the corresponding NVIDIA graphics driver you might have to reboot. + +Another way to obtain cuda is to install the NVIDIA hpc-sdk kit. Which can be found here. +https://developer.nvidia.com/nvidia-hpc-sdk-downloads + +The NVIDIA hpc-sdk kit provides an interesting set of tools e.g. nvc++ which allows offloading of parallel algorithms to NVIDIA GPUs. + +A good way to check that things are working properly is to build the cuda samples and execute them + + # cd to the directory where you want to build the cuda samples. E.g. the commands deviceQueryDrv and deviceQuery provide useful information. + mkdir cuda-test + cd cuda-test + cp -r /usr/local/cuda-11.3/samples . + cd samples/ + which nvcc + make + bin/x86_64/linux/release/deviceQuery + bin/x86_64/linux/release/deviceQueryDrv + +2 Tools For Monitoring Nvidia GPUs On Linux can be found here: +https://www.linuxuprising.com/2019/06/2-tools-for-monitoring-nvidia-gpus-on.html + +# Installing Optix (6.5) + +https://developer.nvidia.com/designworks/optix/download + +Optix comes with precompiled samples and one might want to try them: + + # cd to the Optix installation directory + cd SDK-precompiled-samples + export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH + # execute e.g.: + ./optixMDLSphere + ./optixSphere + ./optixTutorial + # etc. + + + + + +# Building opticks vs. existing libraries + +This are instructions how to build opticks making use of preinstalled libraries available on the system. These libraries include CLHEP, xerces-c, boost and Geant4. +For geant 4 we use the current version at the time of writing which is Geant4.10.7.p2. We make use of the fact that the om-cmake function of om.bash is sensitive +to CMAKE_PREFIX_PATH envvar so that we can point to the directories where the libraries are installed and void having to rebuild them. In principle just cut and paste the following line to a file change the envars of the different directories to match your system and source the resulting script. + + cd to the directory where you want to install Opticks (the WORK_DIR environmental variable will point to this directory). + + +Here we are using a tagged snapshot of Opticks which can be found in github: + + git clone https://github.com/simoncblyth/opticks.git + cd opticks + git checkout tags/v0.1.6 -b v0.1.6-branch + git status + +The development version (a. k. a. the latest and greatest) can be found in the following repository + + git clone https://bitbucket.org/simoncblyth/opticks.git + + + +change opticks/optickscore/OpticksSwitches.h + +so that: + + #define WITH_SKIPAHEAD 1 + +is set. + + cat > setup_opticks.sh << +EOF + # ---------------------------------------------------------------------------------------------------------------------- + # --- you need to modify the following environmental variables so that point to the specific directories on your system + # --- + export WORK_DIR=/data2/wenzel/gputest_10.7.p02 + export OptiX_INSTALL_DIR=/home/wenzel/NVIDIA-OptiX-SDK-6.5.0-linux64 + export OPTICKS_COMPUTE_CAPABILITY=75 + export CUDA_INSTALL_DIR=/usr/local/cuda-11.3 + export CUDA_SAMPLES=${CUDA_INSTALL_DIR}/samples + export G4INSTALL=/data2/wenzel/Geant4.10.07.p02_install + . ${G4INSTALL}/bin/Geant4.sh + export ROOTSYS=/data2/wenzel/root_install + . ${ROOTSYS}/bin/thisroot.sh + # ---------------------------------------------------------------------------------------------------------------------- + export LOCAL_BASE=${WORK_DIR}/local + export CMAKE_PREFIX_PATH=${G4INSTALL}:${LOCAL_BASE}/opticks/externals:${OptiX_INSTALL_DIR}:${WORK_DIR}/opticks/cmake/Modules/:${WORK_DIR}/local/opticks:${WORK_DIR}/local/opticks:${WORK_DIR}/local/opticks/externals/ + export PYTHONPATH=$WORK_DIR + export OPTICKS_HOME=${WORK_DIR}/opticks + export PATH=${LOCAL_BASE}/bin:${PATH} + export OPTICKS_PREFIX=${WORK_DIR}/local/opticks + export OPTICKS_INSTALL_PREFIX=$LOCAL_BASE/opticks + export OPTICKS_OPTIX_PREFIX=${OptiX_INSTALL_DIR} + export OPTICKS_CUDA_PREFIX=${CUDA_INSTALL_DIR} + export OPTICKS_EMBEDDED_COMMANDLINE_EXTRA="--rngmax 10 --rtx 1 --skipaheadstep 10000" + opticks-(){ . ${OPTICKS_HOME}/opticks.bash && opticks-env $* ; } + op(){ op.sh $* ; } + o(){ cd $(opticks-home) ; hg st ; } + # make sure to add the compiler options + new=" -fPIC" + case ":${CXXFLAGS:=$new}:" in + *:"$new":*) ;; + *) CXXFLAGS="$CXXFLAGS:$new" ;; + esac + new=" -fPIC" + case ":${CFLAGS:=$new}:" in + *:"$new":*) ;; + *) CFLAGS="$CFLAGS:$new" ;; + esac + # speed up the make process + new=" -j$(($(grep -c ^processor /proc/cpuinfo) - 1))" + case ":${MAKEFLAGS:=$new}:" in + *:"$new":*) ;; + *) MAKEFLAGS="$MAKEFLAGS:$new" ;; + esac + # deal with the $LD_LIBRARYPATH + new=${OptiX_INSTALL_DIR}/lib64/ + case ":${LD_LIBRARY_PATH:=$new}:" in + *:"$new":*) ;; + *) LD_LIBRARY_PATH="$new:$LD_LIBRARY_PATH" ;; + esac + new=${OPTICKS_HOME}/externals/lib + case ":${LD_LIBRARY_PATH:=$new}:" in + *:"$new":*) ;; + *) LD_LIBRARY_PATH="$new:$LD_LIBRARY_PATH" ;; + esac + new=${CUDA_INSTALL_DIR}/lib64/ + case ":${LD_LIBRARY_PATH:=$new}:" in + *:"$new":*) ;; + *) LD_LIBRARY_PATH="$new:$LD_LIBRARY_PATH" ;; + esac + new=${LOCAL_BASE}/opticks/lib/ + case ":${LD_LIBRARY_PATH:=$new}:" in + *:"$new":*) ;; + *) LD_LIBRARY_PATH="$new:$LD_LIBRARY_PATH" ;; + esac + opticks- + new=${CUDA_INSTALL_DIR}/bin + case ":${PATH:=$new}:" in + *:"$new":*) ;; + *) PATH="$new:$PATH" ;; + esac + new=${OPTICKS_HOME}/bin/ + case ":${PATH:=$new}:" in + *:"$new":*) ;; + *) PATH="$new:$PATH" ;; + esac + new=${OPTICKS_HOME}/ana/ + case ":${PATH:=$new}:" in + *:"$new":*) ;; + *) PATH="$new:$PATH" ;; + esac + new=${LOCAL_BASE}/opticks/lib/ + case ":${PATH:=$new}:" in + *:"$new":*) ;; + *) PATH="$new:$PATH" ;; + esac + new=${CUDA_SAMPLES}/bin/x86_64/linux/release/ + case ":${PATH:=$new}:" in + *:"$new":*) ;; + *) PATH="$new:$PATH" ;; + esac + oinfo-(){ + echo 'LD_LIBRARY_PATH:'; + echo '================'; + echo ${LD_LIBRARY_PATH}| tr : \\n; + echo; + echo 'PATH:'; + echo '====='; + echo ${PATH}| tr : \\n; + echo; + echo 'CMAKE_PREFIX_PATH:'; + echo '=================='; + echo ${CMAKE_PREFIX_PATH}| tr : \\n; + } + dinfo-(){ + nvidia-smi; + ${CUDA_SAMPLES}/bin/x86_64/linux/release/deviceQuery + } + +EOF + + source setup_opticks.sh + oinfo- + dinfo- + mkdir -p ${WORK_DIR}/local/opticks/externals/ + cd ${WORK_DIR}/local/opticks/externals/ + ln -s ${OptiX_INSTALL_DIR} OptiX + cd ${WORK_DIR} + opticks-externals-install >& install_ext.log & + +scan the log file or any errors and correct them. + + cd ${WORK_DIR} + opticks-full >& install_full.log & + +scan the log file or any errors and correct them. Before you run opticks-t you want to to create the geocache using e.g. one of the gdml files provided by CaTS +(https://github.com/hanswenzel/CaTS) + + geocache- + geocache-create- --gdmlpath ${WORK_DIR}/local/opticks/opticksdata/export/juno1808/g4_00.gdml + export OPTICKS_KEY=`output from above command" + opticks-t + +if the geocache-create- command doesn't work: + + + ${WORK_DIR}/local/opticks/lib/OKX4Test --okx4test --g4codegen --deletegeocache --gdmlpath ${WORK_DIR}/CaTS/gdml/simpleLArTPC.gdml + export OPTICKS_KEY=`output from above command" + opticks-t + + + +# Building CaTS + +Instructions for building and running CaTS can be found here: + +https://github.com/hanswenzel/CaTS/blob/master/README.md diff --git a/examples/advanced/CaTS/authors.txt b/examples/advanced/CaTS/authors.txt new file mode 100644 index 0000000000..4061247f19 --- /dev/null +++ b/examples/advanced/CaTS/authors.txt @@ -0,0 +1,14 @@ + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// diff --git a/examples/advanced/CaTS/gdml/DiamondTarget.gdml b/examples/advanced/CaTS/gdml/DiamondTarget.gdml new file mode 100644 index 0000000000..4067786f35 --- /dev/null +++ b/examples/advanced/CaTS/gdml/DiamondTarget.gdml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/advanced/CaTS/gdml/LArTPC.gdml b/examples/advanced/CaTS/gdml/LArTPC.gdml new file mode 100644 index 0000000000..75f8ff5822 --- /dev/null +++ b/examples/advanced/CaTS/gdml/LArTPC.gdml @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/advanced/CaTS/gdml/SimpleExtension.xsd b/examples/advanced/CaTS/gdml/SimpleExtension.xsd new file mode 100644 index 0000000000..4f008bc864 --- /dev/null +++ b/examples/advanced/CaTS/gdml/SimpleExtension.xsd @@ -0,0 +1,78 @@ + + + + + + + + + Extend the volume element using the redefine tag. + + + + + + + Extend the VolumeType defined by GDML. + + + + + + + + + + + + + + + + Contains color elements. + + + + + + + + + + + A complex type defining RGBA values for geometric data display. + These values will be loaded into a G4VisAttributes object assigned + to the G4LogicalVolume. + + + + + + + + + + + + + + + Top-level element including the gdml element + plus a container extension element for e.g. + fields, SDs, regions and components. + + + + + + + + + + + diff --git a/examples/advanced/CaTS/gdml/crystalcal_pbwo.gdml b/examples/advanced/CaTS/gdml/crystalcal_pbwo.gdml new file mode 100644 index 0000000000..33aed7cec2 --- /dev/null +++ b/examples/advanced/CaTS/gdml/crystalcal_pbwo.gdml @@ -0,0 +1,619 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + diff --git a/examples/advanced/CaTS/gdml/homogeneous_pbwo_crystalcal.gdml b/examples/advanced/CaTS/gdml/homogeneous_pbwo_crystalcal.gdml new file mode 100644 index 0000000000..1fcb8bace9 --- /dev/null +++ b/examples/advanced/CaTS/gdml/homogeneous_pbwo_crystalcal.gdml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + diff --git a/examples/advanced/CaTS/gdml/simpleLArTPC.gdml b/examples/advanced/CaTS/gdml/simpleLArTPC.gdml new file mode 100644 index 0000000000..f63b9430be --- /dev/null +++ b/examples/advanced/CaTS/gdml/simpleLArTPC.gdml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/advanced/CaTS/images/CaTS.png b/examples/advanced/CaTS/images/CaTS.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f3604f33def404b6561260cca71e99e75b84e4 GIT binary patch literal 75039 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 literal 0 HcmV?d00001 diff --git a/examples/advanced/CaTS/images/CaloHistos.png b/examples/advanced/CaTS/images/CaloHistos.png new file mode 100644 index 0000000000000000000000000000000000000000..3c12f0272a6abcf78787d4253e38dffbcb7e0261 GIT binary patch literal 112989 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 literal 0 HcmV?d00001 diff --git a/examples/advanced/CaTS/images/display.png b/examples/advanced/CaTS/images/display.png new file mode 100644 index 0000000000000000000000000000000000000000..66998546349af0749205711e01832f43e0d28c06 GIT binary patch literal 157701 zcmYg&1yohh*7ZRVMI{7jMY==c3ew%(4bmyyr2;A-B3%L^-6GuK@coi83{E6xk8K}mw#Wo1V0&W3`vK-F1w1! zYFxW^ZStq`5BQeEO;X2A-O6?nx6)PKqCGvtme9qEBn~ zMn|qlK8!GA{&xZRGMgKX*QCLu+9;6P(>FBluPN%4%!m9QE$K^}5hp$h883Jt^50(< zyqZ;$l~aXs3R#gL8u|30Cit=6$bL?AWm z`(v`%5g(sf6I-@dfsZJlsZm-V>6_naDxg42OmiYbx&Ql68NHHJgwnIVef7%9irA$! zH6n51+z%TL$Q?4b1b?qADq0j7E8{9EZY+AR-j9;{@2&0C;-aG=brZ*&NgDf^Zf<*d zX8Eu7*D%E%y~$G8$Nk>}yjjiLBS6gE9lz0Dd)A@De5KZ7PObauvD=EK9WE2Le$Zr5 zQe{*IW+g2(*Xi(@RqJz0@=c>KSC`Hpl@F4nl)-&CiUx_tjwgj#dzS)gi4*M|E{nVJ z`%07Dtz5;XkjL*m#gEC}Soe6llwh}H)Gn(rJmCz z>8{9b&HTYhe%Id5=So==;@?>y%8)2S9gKVYC@S00jQafyp)6wU7GK9lNjRTNyNwyN zI5N>?i$kSjkoNlZO++U2U5x}yW}%%;*)oD~W8=%{wucvLZ{=KstlFqQYQUgS)lrmG1-5CdT$+qLlQl2(nm4=8`%t8eRxwKO!|7{3u7a=a6n zYxs@5qqCPv_V54Ql4yHan)I}vK8?ldc=dt3Sw^ntQMSixd5<=x2b06z z1f2iL<`Hv9DY<;dedgQ-!$x#q(2Y`d)NyXKMK=LkBrM$ZhKwNUBs?4z?1cm__i9Ly zP$>6?ICc?@%=Z%GLUOT6jZPuCthlRXWmWvnma~0mW~he(vomN!rEl;2;)&1AhMVK_ z_HZn>tda{-A$}4#a!c&m=}VfGZFZM$!FuZ2>DcjiEzoyQ?USgb zLKTY`23eV`tWQlOx2e3MJjXBi)25+9N%Pdi#mj)SGBw}EL?izuMDE_#Kc#nTj122D z)Xa9;MESgZn422i=|9?*tv*{`U5?IL_h&247aVhB36f%GVuQOWl~k9fzD%7h%5bwx zM`JWx6k@c=`{UG5#dW+y#iEE|8mh7Z&i5`&5)oFPXoG2wu8^EdZD+HjS4r)io62M( zNR|c_VW@D0%;kjK&S36GwtJfH&SYe+cTr-p))&zwE!sCzefb6xx;t+eMc%nOiJiM> zLAb0#De78E_fMBvD|T`cA?r&)QVAXA38kq6@cOkqZ^3jW0j=Ts zNu>`l6z%mU9`KA7dGw(!mdG&klt)h6w*qSMpc*x5*7 zuaq*|&1oW(wx<1M{)Buud1hccTnG`xEA=n;R>Th!qETnGG!}SeG7Og-#L4Hp^FN5u zP|JGX;F7&UnW1*`wPc|Y1|ehVY@>HfR7%Va4ZUD{PK2^AK9+q76pOvN{Gp6v=c%vB zoz*T5mk|-)^d_w|`t`Yz>0x)Gz~;tQild{W@rSzNC#|--Zef2Um#AO=-6zjzAKsj$ zr#KNyRG=Hoc3FuGQu$YW_QckJRirim;m3XVNLnEk6fu+u>^G;4&IMAI;w z{5<)sCd;Wb*jMH@Q0C_LJ@9D0=WEw5p3w6LT=r%%moN6}>hA1q<9*%Qf)0U4_pEw` zvlj}`+rKO9-s2Y4mw%CLsGzQ{E_A4KE`%nnv^li6qJbs$S>oTCg!XZAn>5JAnKyOg zCMIbb{!C)=@n=6ayd^$4&@%P1^UWfyppU8!qZQrx+N9yMv3gEPvH0%%y7WT=$twh$ zm+fONmgVb_KNQF@15d5;@#Z398$gD&^rM#Kf!1%Y;O``3A|E8ROr+ ziP_*@ryIBk5QQ$f?(P~J*=(E8>U;gucOohh(Gf;Q<}S9u`=}v`aCtd%k!AfFK5os+ zZ#Z1i8W?DVH(OY@$V5MA8>BSuUSZL@x~^JOY1Xxk?VO##-l zT6OkuQ*9CLnl3+-iN1aQd^Dfre-qJC2+4~+CbGM~2;YV;74PEe$m z-=#&|2=ubD$7K(|clSN=bU`o=*ox;u4+FX0_xDs(vbk+7hbzHqaw%+-J zkD>aCdiKkL(}w*98U<>@J-hJJ#irn1Lh4F_^m!U%iAp&??#Nvcqm0PNu`w|jlSmPb z{$w-JqkcO*F)cMEj^#3`ctmk=W^v~w+R(kWaa7y)9;w(gs8_5+(cE8F8 z`>=M*&c>$DMaJ1#^-Ijs>8W3~nyk0?xHbVgB0~|%MRZu;BJkh7OR0fFN@|Z0p_EKb$^5*)_;BkVPEKRwknEHSaY{FE93im7Jr?Z z{l5?3EYIeK4&9&5G!Y(F(Y@xMu*3Mr1^WEq!=ICN)w5a-5FHndJmhC=I!n6$;rvs*x2b=k7w%~*Jc9rD`5-Zw+X-8`KWgB>n*rF6mgGn z(tE3`s_3qXQAKgzzn!X7{o#Yx?qWB6{+Q>F|Nr+zE=q4r-1YeJX(WOS&17+^7R{`c z+r!~tx?a6%gT&)S_I60D=QmU$| zhQc$Ko{CW5TK{_ut$ZpqNZn+OkirjdxrrgZGF^DssA-sLt6yF>;xQc|tGJ(xhR7S< z|F*gGTpRhfT>gPVj^Pz53 z+G9WJ6s?BIelyM2Xw@(~SRV2J^-b1|uaO)Dt5vjj$sa#0>vl+XVzS51s$<5z^W};5 z82T4CNz@{F#WH^HuZ`}c2Y7oQtqkUtfBZN!JWQ{U*jMXnMHi#nOp1q|@ux~mA*SP+ z;seSUxz*G_EgAE3OU#|{*-~x#%fED!^o*`_*M{cBP6m&- zGd85_a7L%u2a1f?wT!K}XbC<(zKOv>b*8uu<01BncVbTS%Te2Nm+c+w@$u7V8{F$_ zQ>PC$CX0$4{QUjxc%6ElEqJQ?o1er6+%0d5xWT~68Ye@mm#nwrxJy7lpn$5pdT5sZ ztp)22w{>SctN-yHiibx#TZ@ZMX=tQhw>&@)p=tCdbKfAX6kMIC6cvA-$Zc~8xe*jZ zqOdrDMYihs^EMMbmVruEv5|UEcIk}gfWX6bFZS@GB?!`13hAZQpr?@Vp z#%rk0&oXtl4=`;$EmBffi=xq0QK2A&!YdbWe(EWdUYeULy+9E_UE`R;YU|KCLt&otA?CflV61l-esBN$A3C~PTy_L$0xF_6XSnr{yr#Hm* zjDq;4l#L#rSfXg+mpl8 zuNE}dTHGdcXdj0B`rdZs@xhdqN3w{VrfjZRjC|W^j(9w-8s7CkH}ibZF&EVI%7O#9 z)i(&6i*hNujS@QZSVOuxI!GVb69;|n8yz)n@N$OyTR4@t_Us)7{p7?1n^A*T>noCa zkBwv@f1lnoK~2YWqVN{ABn=AOsh16^h9p<7zF4g4*1Y*gs7RxM+FaV+zNol(Bk>bQ z7*2sqG|f{1_g_PezK2hOU#H#Gd{s;7vROa1S1_5+l1z0ArSEAr@Scr-O+)`*1K4X+ z?)6E zP9u&!|M$SEpw~lAuYEe<4vO#Ex4vrDj27Bux8o!EGNMe9lOcg<8qId?N_V$Bq9hU$ zxf=|RdG2!;d1Aj!Ng*Qz8Np$qB464!$AGf=Q($7?deB&<-H1{;-(}=P`sU>)4*J!O zlXd=oUpvSru=*eUviP>Z?Ecz7!;5{9Eup(-A=zRX>flc{FYBj{q6MXzSSMabymd!K zQl-G6;wM)v`|__{FZ1VQN%GOrwL*!fiu!KMAh^>Xv^+^aVqHc&(o5TOZLlxp)zzhZhhx&B=A4R(ig)kcMWImHSH9zLqfl+H zNbv97V@b3UR9Bc=_{-#VMk5 z&;06+D(nu=+V!$oj%BA}XyxM@d`=6nN3WQRnO-8$lIn<#j!x#baXI<6E%)dJ*4@R$ z#rWvt_oid&rCMhxXKynPW@8dm@A5e`pW*mTwf$`_#7C(&_WXChwa!bXPZ|{NS)Gm) zvtm+U@@=#a78OfZ<+d6x5$$GQzpI6bAY$Jt-|{;~H5vI&Snghz>y>uB&U}q72o1TD z{LYgfOFib$m$s-5OU$x-d}kCtM+qxgK=;hU(|Wn&E`Q!A6P=PAzz@S(7fD0IRGN0X z(UPOTf62(mMyY$kwR_p64UFn7i%kjr*S|}*2jxn)K}ldUtlG;>53qe~S86&x>S(lT zy;~xq82%%(cIqr{h3`QbY!eD)qZY|g7WQaCcx50u8smBPwU94CS8;N(v*UJio|I$C zv?yM2-mTx+;jG(G@V2wI=5?8u;o+%1IXO{Gc`*D|hWffFE@#p!ikC)>KHgql4PM*t z-@P;Wd$95K14x?#rK0ot?8Xq^2XXlP$ zBm9xMgxy^sST~-ayNnV(Qt|HG9Y_%z^)W0_@BR&ht`ouzS|Gb54i z_GMAtlx;CW_Yzz!#F~*Xv)>wBv@mQ3gf5N@^#ST!=z` z#g3;1LA?ikvoHNUBEd(iL)$TQjO3_*0UG3;%SzX)SDv!6gz@q2#SU6pgh8Lj%FNof zn$OvAuf?+&%4PO*a&fIi$)9hx-BV2APJLkE)15$wi~GTCeBi@}4{_(Yt7?KrN40ta z4!OT1*zz@PM(r4QqOWsu4R&{FBsUb-eW)YwMyil^w7=GNjd^HT77k|vd)wPN9z57I zmy|%$iET`tjdS><-rI>h6;V-D{cO&8_s$*U-N5a^;ps+FA+8}0?|QdxXHv12UWdjn zBgGBz@$t}1WTUl947Lvsa|c(3){jvNDL5UQn3XNv-Nlu5cDC}W&i#8UgW}@iwe}?v zRJER4QbVY|2PzbT=G>jGc$g-Wr`@7dG-RqWCSBdDU9Y* zR?u@&ajLn2!mhuP)XOXwSl{b-B<0X(kWVJKmX=O`i+vtpMi^nJkz}ww$*CkiEz5j? zO+Y{>6_A*zudSURm%>aU_;_l?tnK>s>xjuCrw`SUkyWpIeye8MMkwP-7#YpL1_53m zCMC7CwFRkx0WVZRQIU(2lTJBps@~HvFfh>H-+#C{L|RhH{b19;#_W6gB$~-Y?8*-7 zgdU%u@1B7FYQ<`(+aqU8(ainQoVL#koe6Rs9U3<^{dM%QupS^R=|V;k?e;P{a&B%F zk&((ODk?4^dPB3G36b1GLtg0;7R1=hv<_A$XL5SS5|QocJnmkNy*okFLe}eHewgZK z9vM$bkl0YU`NsNTf`A~_jmG_+6!B3b17(;HoT;;9dLhWKR#TQrqTo$qQvDGlY zy?<;y#(`Wra{W7CA&>Uy(3jykTQ9ed_SYeYs)E_#vZB@5lW9v;%j-9dgW zWPd9@GC;xNJ)V0`G|7-)v2-o>O2dyYyo{Ku3VFDJhHEyUU;`IxeNPjmz`Zuy ziDik$GQ%^}`*9}RMO#{0`zivNo?kt5Z9p%Hm_*|mdZ7JZYIgSO0k#Jz8|(8$ywL{k zVUMt|_S#2Ar#aW#Yw$qOpVLtJhCfzvGeR~2D~ z^|I0Ec*HDHCqbT!wb|v*t8Rr`p!}}n4u)3Sc$@lHzfNt?Jj!AFxojD)&>oPW=T0Pg zN%UD_A>$zDRb9-y`y*~38fc7e#?G4~-xZX#^^B;ZZqF~Nmv*zVY;zGu1+8b)#qgk1>;<`_U1RYA3PcXxMny?Xun@o)jb zKV<_iH0ya~W+551p?iV`Rkl_<29l&8)!qC%B*r6qNzJNbNLXQ_+fp9wNjBS?E&tdZ z>9N7Vp^_aJKE!&hVLda=#~r+%A@z=ecT!^GL$f>dGtm%h^gNEx zl=H<%!w=EzT9tvN60FLK8=*29-k}u9=*xJ~?YQ!?{C)N%at!BD)MzF@-cVltyNCAV z*|TS-^&VH05>@iY()v`6sC4u_*6(Y0KffPMv%j~O18v#5kAf~H30{eb47k@^TwRkC z76I4hx3{kDoz|CoE{VUuQ4Ot_dLt^%OfZ*l+wgUbfSu)C!g0>~_lJhLzPESZN1=$c z@)|V;QC6|KvT|58w2m_t)&vPUIu8a%i+69Yg+1!*oC&N*b{^^`CDiI^e_Po-_2)~_ z9w#LZ(lOkzCH;+)_)5%aeX&5vNFgiphfJx)p!3AM%BIZBOfyr{EHxV=BO`!^)YR0y z>B7pm-vBO*mKqCNbliTBl6w9VO+EDujV`eIsI;=27Czme71nBs>U=)n!kD0FJjPd|%Jk}AziA@J zf;j9k6$prmQ`gyCuvHZs-deOw6BEylh~)Ey{IyRe*H=}!p}3E7mds?YhEe>BbD;GpOFm}>JvX~6MHE-e4XHLN5)?_@vf=B#UoSMtOTYYLAe z#*-gEe(+uK^l($^mGM2?EM{b$4b%D({Zek%mD_7V>i9XkaU-vj(|O*lOe`#{H9aeD z9Sm_uJV}h8M~_M zRSuIr2Gp4IlRS>FZd+50;-^3I_CFo@ou&GEA{0E;J5NGZD>%)kyrrS`wcMVFW@cvd z51_Yj2+jK>G1shH&viwNEyYOhEL7U+pNgB|s2XIsk%RxOvfeRSf4Q)bgDDv0-%MjI z@nv!f+rLdkQH=@j`Z5K+#>Dq`<#nEG_sv$vfKxnw%WEh%lK5FWqb6q*fOyYaf%duW z<(pEX0Rd@W4jtVij;kF=$;dp{Mm9hO0YEFCz_#D{9_`b}#N(mws=&a3qU}2c&hi6Q zZ+=~ZJseJkD5VLNS**qDa#=Cvj1;^Zgc&nyMWwroi)*l0)bqOdkg~F-CQ%o;j>hGB zQqt8W_Ta;f!R8WK$G8tH4^pOoe+cX9?q0%BY&toNBYN)}mj6F50K2JnsgZ-J=_O?F zYPG81rSO)zfYak|q4+Cqe5p$JfDEpU6z6Yf^m-Q*a;5j;;NYAur3V6_HnX!UlrvYh zinz=iY#J)T6jWZ#^d3Kp2J_ObZKgQ-I9x=8`bj5-Hd$2=f%Jv9JASuwTh-qY3S6Az5YoR7Vz|yj^ zvT|@ZcPFFj>gp=Be+7Nq`3MO>M?(X{fF;mh@li|D`}&~TAi1EA+s10;w6A9&-fG9-&?ak26I1r(C!rYO@u{mFDvfw$+J#rEfOaydLEE1(!i@}iucB6xhQO}L! zO8A-H)M4W<*=QEF1xFybog=J(F;AK;m{&as6-#pH4l||6x><@ba7a&jLw3DGuDpo6 zb3IMBTIzc*sa8ouqi#ye9HOyGY_Q)`Q&%@r>ncryhb96tc$%Ou;7`NHr~2$f?nhxGxtU?*I~D|D0~+aqRn;6= z=B8yjEul+%Iv=+jIU1OWwj?JEsb1& z+3WY4&o`FX&F>S7T*5q$yLrl0k*Z&BB^ zE{E4ReeI+q_IYOJKc0xo;1CsGJ1+eLQ4P1S?Sg;)}tj1myNz1DghZ$nwR(T z)hljJ&f}w{^y#Uo)uyu}Uyb)l+Z*pN5Vh!5waZZ|G{v3L&y;Yxz0Qjn4t9}H874HO z?3D*&h6D`_XRz(DB~>$BFlIG&y3VSZtl{0rwv>mibi)E{x3A;l;h|spTxmB7O^t}n zVCogMv?p|G-Dr`dprvLI9TipPceKNIMdK#F#cJ&Q(7fEJnwr5! z_fD;9kH=g&z3&EBKWNPSscK6j+T@%Yvq)$S!*oa^l};TGmioK(ywf}z`82Y6%q!U4 zywKpILH6JIQ7jE6XntFL89_QM@y#ke=FXuM2a-mkS~ONhbxmnB>IduRm{+3lJmE zZ<0_&$?#%%MXR;Hu;|VD685~rx%jh*wcj6Y{(@A$hh@)uK1xN?47V1-7-Mk}1DTnb zK^K+D9)J~xjm=wJ0?4d6U6`Lw@{u|#NfU-{D&z-SgMrLg^%iS{Xf^}TeOKej&nc!KSa?5=BI2yNBtFJ8fu_hFR;gwd(X9Q2%r54 z?=CpCE0j?CXgSUPV1y}xGp@6%Bkm=0tadU5v0L3M8W?PdnniP#<>xb|8ZEK+As_78 zux+1}eR}r}Q$2Tt`U}wm7dHgCBSbthMsNg59Tg<5hAyQ7!A*?0v(vwVK6`&?`kUO1 z*Jsr142FwF+^TII2>4%U=h}Kc4r59W?)D@+8at{&IjU2#s^^{`-dqsv_-fZn^{jFA zTnFnv5y3-adJD|=TGD&lAJjiQQ3EHlxWN!R(%;+I6wQQ#z`QVYJ zMgmPB)917`M1>DjPuyDaWHuVxnQ=ls}WY(0pi-nbSO;Ee)tpXjOy40$w2LTO?vm=eCRkmObGU8}cSCKJ5RD zY?K=O-c%8W_5Z18z;F3X5D_;wH#6?)wv`DwSwd5My@}9r#@&G6N z9p`&`jEaz28_1S7(?-u=U;X*@1+=iTs;bB9VHe0I2(XKhKjYl{nQwNsB!qv z(9q7#4)}jsOTOcTbuPHnPQiq=>wP~?9?%yM7p&Ly{(Y7nK1&PewAOWrO|N2^tECwh z@b}NJo?A21FskWwyS|5+os%O+6K&a@3==_Im})P*5Rayjjkd9|8OtO){qXy1B&@MN zT}45PoSd9iiNScCyB)|*L_|b^f#+9o$o-Cz(L~hL2BvCVV`5^O=VkS)9}Bw7f0rXm zO-;Rg`Ldm0)zcfHcZCBCq^0R8DMg*lbaWD5zwRlw>VRo~Le zN?KZa_vnP(m<#bb+F5|s-TM0OB!kuYb$38aTwLJF)6y29!E>0dBlsI%Xgyof$0IAN zS*@?H8lw+zZzMDM#;ci!ie&M#ZGI1jpRZ36FwJKBv=@Ak_RP!-K*w5VefIB$-@NZ|Kxxcz zr4;*F*n~=a1R0l*RgajAtlDAnV4~6v5s99MR$ypo2+}T}`)U?%WqT~6I%Ga50ynX+ zCM)ec_m)*#tO22J3}lCc099V@DkCG~uDJ)10K=mG{)hg@+(>Xp$o}eZq4(~hl$2Cj zTAD@@d;;s9(A3aSg>JbeEIQ#ebaz4d)I7Z1)(A3CA8q>Ihrs1vlm}{Md3iaR*9<`S zwdG}%YD221lat+Ea8*2i{u~A#@bd&B{g39D?rn=*N#YLUm39d!DJk%2ASpAAz6-Pv z7%#BM7U$>9&CQ42OTvN~)zsEPE-05hfjtLFi%e&?v@azq>v7|(@d_*%i*en{COr9?-YnwnD065!(YWlG~9A3lD(^n_Kvs>q=BqvLFoS=;MI_qCC?4_&{R zZfD8HAQT`ccEmAX{2COhyQ6~>h1%cV9yXV+E!Pr>UOedj`@i2E%=`~{>KKMYg> z-9Tob7#Lo5))J{a?69hM!$)_i1Fmi$tbh*=R z^8oe3Pe>T*1%&kwt^IV}MPBy9)bNxgti-T>@y8F9=^4J3w_H}(?uP)`xtxA{5%UeJ2_OSOp6K74{yqTbRvW zx^xM)Ia}_M2u#L7($9SV-sfN)6M?jY4O(#GEznreciaCZtXl1O`O{8zIG^Ww9(PF2 z_gyRR`U-(VspT~dJw2v#tJkZdXEJ30U|t%tfAD(i!m8aQFPHPv+0Cs1s&bS6-=d-- z2;;?t175n47`73(D>CwGX;W)FP(_RS|f8*W@$SgNv-Cu-jH+<>bQ=gB?2xyil!Dqv;$)GKgU8yL>V<(WKYG;K0Yrs}uL( zaC5r6tn7&GMfa!(Q(S!9#S7&ji6D^tmKGK*Kb`78AUoc-%eIh-e#`6pJ|+f#Sotcl zIaSLAawSy2Rp%wB`}wo2>G}!^U2iDGp=-dHiIs)rITjgRU>MX7ey1NI*>N~nSPsJl zaXC3T;6O-77=_w{h_Dc{8`S(hIodUTH-W&cMaAZI9fX`#-HWh$p@rI|O6fv|XYrp+ z{v01)D^Er`jBF3MoQJLIOj={Cpcw9d%f=-tyMT#?T=jymu{In)*md zN#!yDVED6hpioyXGX4rWIs;+f$jDiq%S{YF0U_OdIz^Zv513EaMe1EEE-ubruO2BM z3JpVPGttw(s54AQkB~|c@;?T1681fz2Gf=>=#IaCJJ~AK|GEpr{PL5cA{Jj?U)vj~ zrKE<4#)5b6-a)V!HTfMu9m2rC80y=*CxNxm6((4>;NKwpsJ;TQA>8`|hY6ZlH5HXU z=vR{AgxzU^_2g*KmkIIkIGukf!}hf=&K4H&=Kt+vN09%)np@=EHf_5c26L zyZDe0NfnhhfN~)qq4atG`W6afWw=>KY{%QKva*%K8QLCy<}hM6+VBR4jH&&1gRR{+X6SBp!beBJV$yKsS69C9mvy+jEwvq>lCtT0ENWG zsZl6Rqfdi_G2NE;_}pY>KKT9kgy!Jj;OTj|YC1770WiuPMkql1PmlNiHYNPrm@3N@ z5Z|0CGsB|wJzNgp_;o$*p?a;`7Ws6u1i>1!fItJ>H1u&>nKu9kQb6IS8-OT*wsc0S z*1^7RS7RPcqg|x)b8gP{&+kXb@D2lo2N zM~bMer3GT89P9``fBxL@B_<~qvhI6F!eyx<{JH@AKqe+X(gV+GK@!jljM|)N+#OyU zO>JyAX6PDnI_g-^=b0Rey$JW#_yYX)SNF6cY*{kt`UG@z=dPoKiqz_X(z(3}g_EQ_pL!U&w5 zouLbkRoDzdUxgy(56&?;i#vDjfO7=8N+lHP*?_;S0s;m$c|U%bUE=KI&gZ=&K2Jc<=<`YhnPY7(R?I%|S1!yci zFkxPG_Naxjec=WMWD3;?lHU!wem;9@DxdrH8#g9voaX?3JaC*T%FX2oJUfAlMv!oU z3Q9vk@dNlsI3er6&`=TOAJ_<(l%xv>ZfuaI|K8$#_>i%Ou@9y+ zE!JSOS?kNVynhUCEJ*z&ms&`0aD8PEQXo&@Q4iKedj|#}38uTc*1`T6Htf4IFKcUC z;3p(zWd*f-t-vsqnTd&tn)>QZVv)wv)5BTJXJd`N)xR2ao0^(3r6TwOPIyrdgixsA z(b3V44xouUUJZacXPX0!IdTTpt~~klNd)R8_KUBkWqK9XqWhn7P7Wp=)$%W~rJakB7IjstC{mD!QemhhIpP(wH&QR(M!&7xbLtvD;d1sx z7>E2@h289d!$3-M#~CU{QX)zt@K7hpIq3;$|um2xIoT7{Tfg1aGmVE-=J0|uOhRZ(EAhN9dB z^#brqYisMUyA#xS8wrVT1)7CWi)eALfe&JV>;14(JP`EbeVZc6MOdz--t>Fq{Q-r>^e)xc*PrinvTKm>?`PLO6=Z_>Ocb^B&hBnyWhHcnX1FcezmClp?WqFN z6b=Rey&yxL1qF@Udstg9XUivmqnoL_zC;6}&cWUudH4MJn&b2sX3XKnbxppZ@re%G z_2Bk>h9g~I-+sVnz$7m~?g&+CNckA+yu;8-|-)YN{AIlVIYuOd{C94 zYXSAlbGw898ub8o5j@1G-wX_BNJvP~o`7)`mf-?V9jtrLe~*I70L<$GL_pGm>fy#W z-QDfb|6X$Ej2bR=A*_N9y6oly39OvTr|EjQ6I(G;nZdmVj`3YGR_)`5A zf35@^zTT$BT?O%t!>Z?wQ2G|Qa$?$#4>tY+^#wIx zWp%Ygzq$mjfQgC8LKsfd4pakVSEVG*maZ-qCZ@2C;Dy5vP;cQ+u|^UsFu8!&Z+JGK zl~<4lDUFV^LbgQvlQYxPsqN-7kWC{ToT>aiv^1^Nhfd)U0V25E&nU>-1YJCwWnP|- z7OE%I&4~X)?~mh}N0U=h)FWr&K(o>V$OV@r;K4)ZxX7Nt98K2rw6u~x@y9OIqtH(u zPuC3_2(z=7%3)EFdsK89Q22{2TIA@p?bV^ z(HE4`nUbRxke*O_v&rXY1@%qz1xufdS@cVKp!isUThit(A02>;lF09Gdk&*a`NpL_F?0t_BZ?A>|S5wu9F0jGV$O2=1 z`}WSgd+7z9PmbSa<>Yjf+U+g(57l{cS#~)&IqB3m{k$k`HAYOYb93qUpO}Co1H=Rh z6J%Ji3{6K*&jpC+_B0Bxl_cYN3>NkY*jH%!t&#VH9cKhq84=Ba@p0W5I_2njpf3Oy ze0CQVZ69On>rcWb0Vz)o4wer{qJ4tzpd~ayt{0?eLKX7eUv&q1EiByp`}c1kZREU8 zPkgZXA$y>~7WfQRLSF~Kva!B?dy6urUBjUH4e4VubMx5fXtg!^4_3W1rlIrObAPb! zP6~VdmSKwHtLLR@6?S)iJe=u^Lm>R=LdiZhZCd(Sih?R2qohR6VJeaN_7r+BYyby0 zw|#8+C>(-<&XdmTY})ru6o$FbxNX--GY-=PykP@?(E;ZL`COzh zbkWGW{IFDXj!qZ|%!rLIUbD$d9tBBdWgG-qbw`sR!~qel@Y?6cpId z3y+KW_csu-YilFE2La{^6|11TAMQvwO@M^g>75^z0OV_MFgh3!=jOhe+y@N^p9Kf6Tbzh554$xzN|2E*QogbR?*=rM(%yHjFM8Gi(BE*GXYIk?C% z%pi2g*!ZsA-e%Zy5s@c;&*ckJ8&jsC({^=K1Xv%?}I`EHWp;$J_17PS#NuvlJO!y(}`hyDg9mOugpZ5Q^` z@;))(auw&Q<`P4{lGz%*JvD7&Heo z=H-1K9j#U)DbTI4orPZE2sC451&jwAFnNHj1+oL`KDbW+-2MTw2F!aoI|8(*aFmm5@yG=+ampvfY9FWhS9v`0rI)U5CgYcGt(NS$5oP5d= z&3ZrP=yr4WL{tRw=XcHgT9Vzrk(cJ_yU+>{V}CtMPZxJ@%t3oX`s0v*latd2BFk*_ z*HsvUXsN1Z)PyA4JxLauZEs(J#tB3bj@DU0RS7s+Akx;>7D~rKc1X||G>p}==hu4u zg#a-`$z}Tq&3^yB42bdkFz}oQsym2C;F4$X@Gh1$qsOC`dNl^BE9f$z`1HV=-lnE9 z6TGVtu@SJ3cyMHEQ66(^gDOwr3|tFgXf5-Pcx9x{$lh{>sPFy zN;i&@(B!2My>FXP)OXl0pb_rGZOrGLJOHjP7wzxor}UP08}>~u_s?2s^R;JrC7GhI zz;He?D(Y5bTj5V1X4R8dAPB4gx%56gu57sKD>ybe34!VheJ(UK6zK5p?VSJ(t3Ln` zk1nt*AidS&zlljnKhGAsV5hNL?Z z1Sf(VksaiqcG-Eq@KSH1&+f-m-^mv^e{_`4;GK^GkNlEpl8EXtm8obpd;fUi% z$P~fC{QQ0Jzea(YhI!*gz4vZTYU(tA42Ws%wV$Jo2J(vXHp3J9{h2j?=rIpi*NvKd z0!~{i^>9vt>j0_2TjB8l1BWGx7T`h2dM|mymcq^V$`HkGz*nH}0mG$>SpmMjv7wmR z4{$tNEk8Z|9zh0Z@34YgaClI_Aa49BxUs;*0YmOQa})^i(C46r7Hf134B!cI^IrZ0 z8WCaw=AkfU+n#h`;0HopzfB69XklmoLW-NGXKueW%GeRhvga*hoLo>)P@(?q4}5Wa z!Rn{)ZMc&`zfbAbIy}xi{u9iHuJz4UP`=w_Uuy2jf_nZ09-QB z8U|PNZtdgW#KzV#s9%H54iYbr4PZv^nbhG-TE3MiXh%a);0wAWMqoc!7hcEs8QF<+gE&b~NApl}Ava)I# zyngw`i3S{^%T7b*Yq2ZAj9vs2}CO=qYKo@0YW#r_jZW0gbo#Xmgn!|&~ z)sEAZ+|}q5zvl1_4N}v-(e|yp>M=^S<2}HKL%IOb^&5RqG3`a0t!KcyK!t-tiFfXs zJOOQ6O6oa;8Q>@66Zly5o;?P|?IuRhXA>~rt^o;b^x2Q@rL6*72xz#{aW-ImtPGm( zl`B_#e0*Z)M};!(isCYB6(vF+H!*pak}?TF3@)>L)z4ut-D~^lbOE9&W2`ODD3*Fne%??lPfkzseTfMP zEy3)GhbI=7@%a1qC~815AobzjzHRR4cn=?+I!?~6Q5$huJ5bzWOEukWnV78J+c-Q+ zk~cMNh$$Bz>i&LVTp~rg5Vnl*=mxNWP}_m+vLhj@v<-03ETnxT%BIf>1yfA;9tVyu zfj$YNN`S*a8Q_>M-Z1|m4DfL72~|{AC&8kd*F#lRssC@V{p)04IV9fqL`>y+s^?`$8oH`DSu_To8mQ z7)EM-?E#eoh=&2&Axss4Cj*(e@+3Ak78-Ab!(@DmDd;{xy?{B4_+2FzXqX+&-EHLW zkB{&6tMkZxpjNwAoO0NtLxqKiii(0Nc=x`Eh`XQ*oVyK#0D{y3njNo{tFNcmLG%*i z3Fz9e2>*|;_Wa zA?u}ZD`0>t~!xIqM}j{UU;&ahlWB#Ahd>DnOyIx{9P_EzP@F!V2EvcQ1{NUdNVfF z{W?sldNl#RU-7jH94J-!{6T@Gppju#^Y>A0t(p{{vyP^|wpI?ld#vX_Q?si^AFE*Q z{PTBzMSc?{qsXs$KgHGS4-)@=xO|>tyn3p|V`&;Y%uHYZ+vMb0|K%w>Y^~)>us2AP zJGMh=jlEg0va+&E{*p8DEaf3BSdQ%F2Z8Jg0R(KlykvRe_u7)3N^O%b#lN&Yyp>zi7X~822d^6_s`sbuEAU zvyPYW@xV+DG23*HqY}Zhe-IP%$kL?b8*m10GtK&&3_E?#KfPQRP{z2qxy@Iqt^aOO zLS_P0fh`Sa;yY2=(eL+D)ZxB6W-JZYhfnoZ*f=V*}Qy0Vcpv%7h{JApme4x=N>=79RB7))E&ki^A+{|{pGH3+R-CI5b zZX2gzU^66m5V5YJ=>!WibM*4LdR5XSe;+ehcUOOP!Wpcf@89|9C^P8|Zk3#~M|i*$ z9XR`j&gGV#H9ikCVxqN@$DaeR1c438VOs+dlxhnB?YJIUYG<+S77lm>+ZTo{4+ z8!sluNkr%0K}?U}mTms>Ely=6ZF`N+ zjJEc++$TLYHsxSY;@B>vsMrq__`nJ6h|%94%e>+?I5;^uiLGN?Xhoq};ebR4-`nG) z#Z-LkTysrqB&Xwgzhg#+taib5qtxg#Ps*T%qDEHk(K(&nX#OxPhkZ&3cbwwuAu<*` z@x@-NVyXm2W*?}x9vvohK;f$+`U_@66~W#MtirHyW7{PW{r&az^)w1jvc%7$JH5;k!meK!$)`cJWuIN8Pmzo4BO1ZVxs_?va$7#hP+OV)&Ta=K~S6 z3|bfn)i7?L?W*c(gujhE^78Wg_GLzJ;Acq*30nb9tFMmlNj%Y@Vp=ITw4FF(hcopo zV+b>NUbc322qJ{R99_Agk&$^&g`_tam7ysNoaabshsEc{E)BxCV!QS4rC*(`h1SRT zPNd^_B|9i7f=YCEL^G2cJ9=^R8q&^&&S5{JJgfu=1#4=gr`&LYtscDYQ}fCNU|*~u zlV|5NutKzUmU)geB4+ntk0OEKQ5L*h9)}78yyB#2MPJND_CTx(nEe(CZM=+XcaDR2 z)%4LLN3NDV=Hca)RA$dtrz$KfGpvvm6(vMSBoFY1jyP$o;ECa3-mqctVo+u7-@o6B zs&c8DB!Gs>oqGIeG+1}T3*pv#(mj@%!g15*7G>bE+}*% zHeq{H4Puu-P(g%BLTPX2RxJ%}_D@e!X9mCYaVyPRhmodHEzL%PM+m!2Fz(FEGu=)F zxFHj{1uwaz>_34I0KVs&U{}>y9)g1#zX|QGq_8j~G}NTTz7@0pm}1M;chV#6MwZ%I zT2Lal1)-|(pKCo15ey3*!UvLZf}t)BR}Kw62vXYHh6c)V90ni`+l`OzD4qj+zCRE> zq?cNc@A|v+H3}E>v883#LCeG>G$~>NwbM-73vS_3tFsa1VhV+ z?FXMhlY;=bk)9r|FfZs}r0s|ON>JH+eH+!%(z5MTpYCa-so99K(-NgCmJ~y6lX%Uqp`juO##o4P3Q+4BkN_wp@Ypvnas=PHwT?TJ z;ooukB7ig;5PH45vF|l^-c3z~IP(MPLCoY?dRp2b9;+_LrrMq!v!v5`uo)3;f&ga% zVZ&Gxwvt_V2DF>F*tofc{f`&hHr+)l2?28uDVm#`vD#$!@Bah8ak|Qj^717lLEM9a zC*gbl-De>)>_{96!0Hl;v12zk&MYjX;Od}PW|$-CYM(qw=#JRzBX7Z=f42T?J5cUkg2m&?7JR6a`WDrZw$`7xz@tWk`y|%A{>B%h^AoCf2XaNdhb@d7f z#y0?6Of%7~aDgoY0`uz1R87H46$omd(M+n}-I=YoFGCbOI&o;+BHWzxk|waE9$(># z)78@>N)9mMBruOtJ*-@I_?z6faK+8KHu@a%B|?t*vBYTT*K307y?pMn)8-nmq>oUn9W?LE_{I zB)aj|O~!?I*3TXdxKiQL-P6<4*_ob^;ULn;fcK2t0V4^tR{zzRw}33* z)DK8Yi{{l$yZ&*_lz}o_@K!X{L=OJ1E1`99e zKf}$VtHmY3c92(o80qa$c%wNSmGN>$>>7N*vd*1p##Z7kaxZut<^{6@FH2`z*1RN_ z*a>AiJ})UzfN2f1CK^P4e*Z3mOaVV*uCv79!{*tKU%~;3>vo`^-mt-cx{elJG%OQE zkKte}#EcBv46z&kT|tgethyG2NsO66Zd%5+Jn`UAdso*%xGTo)Ay!iw|5vwt;|AW> zml2@5CY5+MX)1;x#a5gwEIq&cvw)VCR@k+`s30ZoaZay++VysH;cZ4h#9mLRDt>-n zid>m7)X4L!s{x!tFFf)iu zgFk*4n-&An0uJ>;b%Rp@J~AzCyOaN*fj*VcU3Fp6-LdiU1{jq@M;QcV%(=hn4@Lys zUF_KK37ZR`5P6e`Qsb$rAHBPJdZ^IYJPthS@YdMGq}0B37(M?{At9&79h}dfH|!S6 zv+pb%lAo$7Ml!@nVHyOyAej1LgM)(9S3Be**?}t;kTyZy5URrd{Tk}(_aMAWJ@j@!0&eq70Bv1e{THD-3I88% zJ1|=Df7-Fq2ar7yEd0hY5-f7`GMf<%psckb_doM?s7Kk1h6%7PUQl=8Rwx4!l$G5Y zR9yTUIi1jiQFRDLUxJ|Z?wxUoeROCjj{FWkD`78w1P(9|sR-<4SxLz%g0G5B+@tx$ z#q}SLqd9HUC!i=Dz}o--k~K~LEd~`+ zog$U)j*i7Br8P*ewJ7_4w&#wHjS&GJ0tF>hB{_t>eW_OnNf7lDe0&aud0UiLKh@XU zLjD@?Uo^)jC&{{rzkd4qakyUy`p=#{LvZlMj2*xvE8LT7JYZb{mWFPPY^DqR znfDz2tazFh)_=jbU1GQB{LqMS4Qv|;hdb|S!qE%vVGfd*<5Cso_n=}Y{FfPKxHrlL z7S(f;p#?}rnCAmPayroTA~p&{P<5vWr*OFQIa>bPVg~#2p6wA9qjZ-YJ2|qCn=e%A zi0Q{vec{peFk~m`g9rbBFC=aR#M61vlWPASMfzrb^73f1+soEVbkgI5Q$p4i^5)8~ z;uf`tZ4W2h{{^3So%^Ht&7T7?K+<-UXZUZe2mVb~ho3X?#FM_$bGJ(-6H+8&_T_i9 z5Pzb{B?H(}e#NB6gDKi$MK)SYNQhjSomq0S;J6_7d)AJhcEs^D6%?iydW`ymH%IIi6$>%%l_csC`q^@z4l7CLE!QJKU5f!zTjmm0j4Y0&Lolu{PL6J~) zEGq)oXNTW)-d3V&R5LFhwvMBGV|M&Qq4M?mG|84;9 zBL*v8?f?E#pW?s2#IFhk;bQPLMs>1FTjkL8|Nb8{v(5&IX#W5HFo(qdztv3t4k2}t zTE*q9vWmX>e+P;_uOV1cdnPGlBl~}cBeTu?d0#4>pmm|qm6yEte@>Jy{hX2DfUP-x z?@nSF)u-Di;=m9Rmb;#-cU)me_HuWho||jC#Df!ER_#wP+xxJJ3MF2|etvS`>I?yi zQ3sdqpc{LH)Ca;5Qn;f$6He6s;mHE0BNKd~A#*|aWiVkdmUZ90<`suXlz70dWXA?n zUKUyQ4@|7Yv{i1_ZDVy<`0?b~4C_%9mGqm98E<}l$G2eWz-UTB{yWjl0ho9Jm&LNvQySV&@i)IHMejHuIEN#xkky56i zl5QuIs&04w{LLFTP#fj|Nh3q;g2w^bUwT`jCV-A);?ox`I0F@xme2aTO+#zRQp{tI z8>6BFU|2^u=3-$X11JJDy?ygWAz;<`dNhu~9KAW~YDJw~vMlphq9#8XoimV=QxG}< zhNZdx6|-XzTup9?TCCBE+2=YYQDjmS78U7K$O;QPfkpvLMX2MHup$iVd@eOWh9G}1 z>pY$rsp!xH16d4m+_UTh9)L9C8D&E%;urzVH$SE_B(=UWXAFaP;Tkpai-h zuv7&eRF{``BKg1>&eo;1$2p(@Zp zdJ7L{3_@jFz1V+w{ZC6EWcyT4dyXCxuMzZ6zI5}rM|3D-`4?M_@= zx>qOeF(^+H({FGhu!m|Ig${%uEuN1%np-n~)xn;T?NE~232bY#h2plyXq z+0*k`V*}I;Ft%{aE*yf^w7BOUl5Si|J>FaUmIT(qMm8su)_gG z1W;kBg0ClvLb!WSW>a87jn0`fzksYzh=4rAfWO9b&*tX5Ncc2Pw0k32psUWT%$Yu| zr1U9j0t$8iswOKtJ6cfsxk5%qaGB@k90OFmD#|4}n8(CEZrr_@fnj{0W*xV#-#J{x)F#KX=>O^p7x6ANhd_0e1^-A)3wGvzG2ceJn38 zhY7K2q1%ZB0;kcwhEQT0+fmT#Sy@@_eWi8c1ZJXL^!6@za~bSeNQBy^r_AQk>))3S z?b^r8No-7z0)cqu72o=KHc{UpS!wzF&QuORBHc=i@C6a<7Ch#_!|W}rNn^) zU?4hacU^Hu%L9%nZU1TT##W0v{ePI0KR%%iV!z#S;LX{smh>-qb8=kQ;t~GyfOP8wtB$rr!~TCs z_-1{lno2@At}V;2=wCihui2Q-l((PAUhN_O(sy*qS=#TR)qmgkpM>XcE!CCwy++td){U3E=YRf;@qSX}c<0CD5UKxwLG&W!9vYX4>GzP4XXvvGhWJFe9 z=nznB@hPagki%hbmPA-b-JpLtBI${oXmOd%?gx5j&Qu{pqhO)}iD-E4+&9n)+9x8s zn5e-QZ`S)Ud+}FDLXcLO&zySCLxHc2#wv67pRqVp5VsZ=Lnw;3Zv&N-mCQi>L2F_` zb7zQSl0XGal*JCJ= z?&vh(NSx(E_a5X*kmB-}FR!3h_J=hDsn`V;Kd>oC{s2`*f589VMlQ+4PoN*aT%Fab z=fGSG^wQwkJ|mW5jHs~KnG(B}ox67Jf=3oUGX!X^3~>(?HTAW`0TjgmaPa}mFi`+F zt&K0uW5Mw8jF_LOZkrXLqJI&POI#yKT9~}=FsOyV zA7DgP9m4;y+X6&?7lv7)C$kjKm81v<6VNcu3#C705S$k3>U4UR6dxo>} z84GqaFVT)if-NN@LG$+ZgAf2DF@DJbY}N?U5?W9GF3s5ZD!Drt;hCY{ybn&W8Wu8i z?^a%3%%9U`Q%yX<|M%C($c90%!sI4EF@gz-$?0WDJaHb%CrEnq4#tQYo0;Ky)eae9 z$)YCD6QgGGM1r0U};V7Q;PDPWsJ>{F06%M(Jpz!=i*)R{x6|hQQ$8aNmEs zj4Ikz(!|s>39kLK@+4Ra)UD{pIL@ z4oXkob1^@TF6cCa*fmuZm5i@ktu(xH+ge-M{ccUqjj={E>p1NgLxT_q7M$`5h?C-y z5`Bd<%bEb(cYr3MH-h5Z$Ot?~`*?V2ySq(`PCtES5+}eIe#*#4?2qoDS)4Dyw17_W z3PS2_;WzB8~yG*LPJk-7A&n=U2E|O z9Y72-=thStJ^aIYZ&dVOqgRn#m~6X`3@(vO9tlIeV(j@?g)0N*gqt_s>sAP@iC%ZT zBF@YiO8?MUZYwka2Q^u-n;}yB`1sI-`5zn{{|`3MkuL0cE#tt_9L$@eX(C13n8Bh{ zA);tbl9PU}BjA!$#1P{RFifS7WX~VlZoK^;l8F@bx+wXfvT65c6`I_qDlcHMZy1LB z$V)c(a3hP1xEF0LBpm%+Qt8|tOf}CUK#02C{tb_Ez5=%$(=+5feD+NUSNL`HaFEHR zJ17b4!|_PtI&lhV+osOhjE#*!bNYOV4aZAQPG8=AVJDgA>VZ4VoEyJtrz3HL=FOTA zKp;@>aCdagG5nAby78(7KN%qkNk+pT_esLP9nKqhc6Sn6T>qa#k}THN(w_XhWEbfq zb;5Xy9fcP0{{8?EqvQqzQGg9Vj;8kZi&)MuUXvHFY-;AnTA&u6m6Vi#M(nR%0msH> zmJIfnXxR+Dd6QBO25vx5VAK>XleA|Z%uhZP-J4BY9~?c0ggprk4b;^z8p zXVxB{oqhG=bk%asc{5uv?eqkpFQqF8Ge{E}aFLQ1@MrKjVSsLS#A1q4;7jC9tZvJ4 z_lKx2+TLLs6C4E+9>LLKN*Ou`am3!5KqbNog|dy1$gp2w9ytS%3a95f@Y2QBcCWM? z>KL@Rlk8!wXlsLwr_!p964R1Vg(FQva_t-#uw<)8<%44OKNsODbblEc8TJ>BIDN^} zCmv=~4i8Isu;ovD@p*lQGhBULUnKgHr>7snjUu>7cq0F(!9fl_qTrVZS1qaogmCmN zS-H66mACfw9md|)i~@Z70~CoKujQ2$Em|U32ClD>aOq#*c0^DFnA7cU$3?~no5S?; z9L9>-RMd$17S-KlE@mV`NSv85sqh?uvM%J+js_&(9K2nQWMl zP*Jg8xDONxcB;3u=k;p>(gA&twZPOOjLBd~#V_v+xGFK$6Y|peRwF(eID-DT%1@R)t)220UkL~0 z<%OABSZv$0al5g$-Fcw=YMsRWWFn<11ys%b25JBzGMY3){Y?`1So|Ov`G@UAq<-+{fO33b5nr|f0d;hE1Mgsqk?&$9hd+`l zteTVre0o+^Cg#mBi6yxTObowY=G-iFq;*WMfTp^q8jWIT%M4ALLB@(!wAtN#r@r2L z=8VYf)9;@{4jR ziZ;6RyL&KX2%P`?uP!ti{)xIN9*^hmMW<)~dMoqQPWOo0YNt=n-&dC3#d|f?g7<;J zg`et#e2d1&va+&N|Aj7KA#~Y6DH@rY3WPHOD-j5rfT&oT_+O*UQn=BOKSfMS1fV{H ztrLnWDlLWcW@dgKB2;!<5m6<)Txf^10YwoYEVD>>4>oAutD_~YOxBE6A>X;;IzFJ^kqt)3PAl zJ*ly-rg!SSTRkqYt^Sq%Tq-Z5X`}5B2YNaB_J2A6jj}jnt6NQ^_3M%y!HRT@#}+4Z zE`_YGRqhCr(q?-!Pkq6GcOti9Hg;#{)%_rZ}_cwy_i*H=Fw6A zF?067U(wNA$&n{$iR+Nzbl^2NHpYybU-10?$LZ&6|I5vsccSHW!RETUklQrVPg}~o z68JSXj0y$XdCIfReEQ&g?$GrLspw1F@Ynyc9~r8w(?3NZhx)IWik^eoKRkC=$)f(& znfYKHm0(ifHnk2{RpizZW%>VHOnsG^@p}Ju)aUi1C2x4dj()v%ZF*clg`Q!=KJxTx zoBf`jZ53_t!Zyt9QWJZ~NaSeWbJ)x9DnZyvcZthwdmW!SMwIp;90PU6`)K?veOP3C&{b=D?%TD>DykHe=fm#NuljNwyEWYU zc(&i7zOjamWJz*RZgZ_(A~F1$P}V+{ou$`^XG1M| zN`^o7eVKEYCsa?*s1tZq0eXe#>2*FlLIo87`}CbVOvqFc|0|72Zy-2C>2QsGhm&`T zh;8;gC_vfIeX9wRf`l>z%)g&rem5WDe~3o@#GByLCtl`!qN;kMV8_fHa>p>6gG3Si zvuFq1^;gQS+3UU{uU<)A?u&15?N@0(*%Vq58u}gu3n&qb$!Mfd5;6&!ED|jxd;kxx zgv06tQUb*RUUW!OX8UtI7_e^_XJge_&5bijj=C<~#w5!?!j^q{{Q5SIn?Gi0RArs% z%xZHF^Y9$4eN}N!Kl(_UUGt!TJ9W#0dRF_Nw3Y*5mZzja&*?{&bd~nJdc`XxrT=k1 z8ACBh=^IU&TU(h4#{Y^Id_nN3fRHD(<(X|&h9Bnr7kC6oY+JV)Df%I5=BS;J&GyRJ zLcOr*I1khIRWGun!L@5Cm;bnxnz-mxrZx+UZJ`OF%=aA|d}WGkqiJHFAuMJ?He6i z+t&8ui_h%o!3P>JPUxpkOiYY^OwMdORe471uE-ch3_!m+9?50v1Kex^zm$gywjK3^*LOe!e_pE{EYz4Ie_Y@p;-`>J|Ca`BuI!+PG13-2Q z9UUQalnA39l92fH>eVBhIqW_i&GUC$;T%NwI*NH!jMTbu0}Wk*Xhny^4viI<832bN zv^^ksJWuq8gGzcokno?9)KfDIRrRP;*rP<|GsAke7LFs6*RzIguP8jq9WAzT3b*CG zxk*nkJ7MeaS7y%as8f3Dy!_-H#{yy`KdtGh=RDe$)T#F7inC(Gi$=M~p z`Ei$lm*yk+$jtbr>FXKXHXYk-$MZhOnUWX1+OVXi4I=T?5ZpwSq!C%^Zr8Sn#za|_~F{uB?AD7%% zmp$bu{KuM^c`uLVx1|BiK~cUOp?@N^{_ltarjI46*V&X5rDga^A09q(={J84S~-Xq z^LnEw-$TbtsUzO+qqYb?jjzL2jn6E-m`)!woYaZmP^&fW2$5+F7c(%JRO2*}GGKAr zrDH1*{Ur%c1sdo+B_+$AtB_aQHwx08J*vUJC&%beUfC51k&Uf1YX%`!B0pQept6oJ ztW3Y&f*MDd?i!}hV57m?v1`W;^93`sl%aa@CnoDf{-^&Q;)5@c%-moa!mm9Y#Ffh9 z+cD{=PUG*-Oy}bp@2N|*dt2u`lYuNhnf-2D942vei7Xbfn?o5)Ng8!cP}FDPzcqE-1H` zf1b?!1_Z;zF-!xnlhXtZi1BnSxqT7_@$x*Bj`Kr$BAQOa$7BN(NX|4oyv-qs z_4l7gs*5h`M`PfTFX0z!&qXK55c(4!Yk(&}fdZO}@bkdDGs~y6^6LPS0k(R3fn^}p z4Qk3+^Zz4(;$2}uSXxo2*1#SE`h#V{9@=mxHueBk8rTR^6BCSaBK(XQsA|ZFt{m9?cRBrc zo4$%me|ElEBBFHXau) zaKqnQRX~%lI#$A;O%Lz3~?uXdKja2;@P}pL;7S zD`OT8sC;$|9UmHM#hjP1LeyZJw@Hwcp#p!Kn*aTq8&obz3}E^P$;p?&^Ey`F!cuRK zx?wN$pnE{1yrOP9Q?tz<&rG{C}e;hKVMjX}sM}Zq0ft8^lC07lej&e@@6&Pt0_B^KlVJhRhLvBD%y>5VE_t~YE zj_HCs>e~ND2=vD*3Em;bzJASz`q!^3U4s>J13pr4C*O!V{AaixnmZVd&B}@{0NqLT z?7mj?-~jl;h9OI|E2IDC19lN5Ar%cn5Hd1wyTr;8?Z%1yJo~moO3T|2dQ%9H-33Fd{ME=a8{Bo#0OZVqz2QC+K2L*tI1M+WoI4iZmZE%__^vQ;eT$^TIkmi{?P zVP^VMP4U+qOoii&Rr7|~w9gk_7mJOmm7IxVHW!LMG$$7=_7QGD)Pi5~%~6961O){l zmZ|r^AyZvljh90_G=6L701ORNS<*{xWmnfpkRO=wus8m3lj1xhEWK+hQ>b#k!XQsr zR7$FGM?u7sOZstEG;f%md=HS`e(YEx-?qC9d;NJ=H&Aal+%r8{84@z%{eqh@Qi%pSGL$Kt zP864Pvof~{^Q$Awz49>B<8y)}n)~44K7x~Nc zhk710&-IPpn0viN{lZZ*3W@xaeS7I|&Q+e$XQ#QRzGa())ktGJkQd&21YvA_ z@n%TK4I@)TZzXW|R#8)Z06JWT(|29sd|wBVRhT^}*B*S<^eJO*aYJ`~XZP?(g0S@8 z_=ipJg7QQI{%q)b;ULeZIwE?5o#STmP>8Ph$F+L;_dj#_H2vRz7bfxizi5MDg6}Xq z%bR2UA9pY=5@&n%ER)g{pLcEhYE!;=xMO-`!|$i@oKx|! z9x-1^%ZMphIFb% z-(ff96VuzOrI{vP_d@t4Qh#bQZM{`r`_W*$)Mn3?l2;(DB9bUh$`Dq|q$i7d7ld;M z!66O?1@&B*;h|5^InUuTt#Tvk`l0K0N<~FBh6hC{8TRj_koM!qvg?%a@v(m*Sp6#W z?Yk`4FHufD<9yZD%RW4k;dfbuy0>ro8b5zQjx|xoH#Ek_`xfL)d`@NiZP!<+)=sSw zY_q%2s_u7ByYC6x%|&;AlllX=cgP!xp8RX$703}17uQ}|`E@qcNn|sxsOe{e9%d%y zF#)QH=O*VJ**HU6AKu$fku2L`rQR;$E=xnjJ3V-$zHzLq%=qqAx2se>mp=3IwHEHa zc1>t0@9M(Kvmsf{zxhe5etbjqjtVz!@BgI4sKWjxj4+C1pG#xUoF!NEJonfNdRcO+ zU6q&TY)nvBaiPay-dF8E@2r%pFFf9OMSeT|gOtkYg@<(8Da8-J;BK*e*7lXhlsc$T z;?3KHZrURsug=jMM4pP;_9Jz}qcEF)ERE(ySCx|cTnX&Vx687ANg5rx*z;!eS&D6w zgaf%o{IP0pjV148Hug38mbD#nK}`v%@*j55*>Cx4On1UVWKqw!zX z3I&RRe};>{)~sw^oV4zgkUn{CaN}YNrA~%Kv|)nVSHBA@QtkhwhW3x{!Y9YKgtvR2 zJs7p$_wbs>(cX65*ip}V^Y$t3_A*g^`k){UO6RKrLw}l#%IPis4*mlDT*8&Vz&VMN zZ#>JJC$`RCw(c_VpE{AVMfjwxu3f7`-ayr??vKFBez#ujVtAXC%KQFjzG)3Pj78|Q z)WYo1k`OBr=}UN?;@X{+XB^^1ln!e< z%iLCE9VhJ{B>g@&n(=L7Yb?cyiT)p@&0>$s{stTn-BNolaFHqX=IiIH0ZPTnB#U{6 zZM{X-*Sk6B$0~#as^**W-s|Q%!ST}bp zQ0wi7@%D4d$;(%N2Etc7w89r+!!;6__p!$8 z9O;Bh%eqbQPFo^Lg9SDy(ZM3L3q4*4s)R z4AT|=UMNw1>89x5*q`17GG6|cEc-ghP)%>FD^pW2{BCd79}vY+iU#SK^Y(Fb0_%B) zXH+FU2Bx;$|5?J_*Lv`f*oa27bL--|GlQ#qRrP05%W}ugb5j+byMn4q|J-X98+fC% zI=Hlnq_p~AVZ!WznwPt&-=QL{$9`8oPP{(V+q<$tHBTiF6S{9rTzl=A(S?=U`4>5M z)_BOR?G8$I@cnu7`OISBVShgJ&j~Q5r+cWK4!POQnbyA-uWQb{x9IqdMbj`-Rax11 zTmP1~!;TiQ6*R#Vve%i}Z!Gy3Uw*a8cxA&*1p(m;hO<9(E;eM^w){0Yov6wht>V_0 zS!Q@%^k>igs+99*d5!NS;y-7qV!L`<8+!Fg?t+59Yujn9{S~?ob*%lU3_Qn6^771e zaur&g_D=G;ViEmoUDvZmuAPRd^TSF0;ZM7^-&x9| zf(V=1wJ%S$P!`)idN!u5 z`odN80LjhE!~b!3?(jl4$9YcQ8>HsmciZ~=1*NCnUw^tU%+2KR)6(G?vYext@b3?+ zkM`9|W)z1oZ8*}m&hn*H>Hu?av7W{0UgLth{k^)-&omo!Lh_l+#g1>GQ1PMgpnP%T zvGsc@%}cMvJVZYxQ3S+q8gyvbwwK3IHZ8}w(oecS=~|?d#6?HjmPZ~L3ZLbyX3o61 zK}FfEc=*F>s^6}|JwuJLVS=188^x=G6Au^|rPq+i9ENF6^KA6jO$0>4zk@0Mp~L$i z<}Y>a%Yj{2Sl7>R9xP6yQx?5|7rM%ZYWuXk&zmgS8OeK+pX77LfHe4Zm#anKJz*uq znk-|-JXcY@1FR3#7kUE&pD~90ycPz@V&UgF zH0Ifu<*+=ET?v71nq}s*&3)#g6Wuw@PaRr*GM11Ig_WO~6lCY#%B;Z9QN@(m*|p*@ zW1=X&H7I>gFV&hGLz;YOi6$>eC0Mv6>F%8%w_AMHfd?05c2f-8e*2jIl%+)i1|0 z&BQOudwb?G4o=0LNfeMNdakQrp_xxoOWqbT(jq*$B|r`FWBjOseJBRo^x@{ zF?L`3eWa`++seuIN#|Pihii^ij97f}=TyS$)Q*3BNmsDI<#_Vv=ZMndR}SB&ZDx=Y zo^s9e)RYKKTNSSqw4hYDncJDMdWu@bCv^R8o$RlM<=n;x@4YPzCh4ku_A3On+dhpj zc)hEdY*_v3xBnpf?St-Vt8ScPmTH{rKj|FimVSHlh&&yBFz%#pyCzb&U3*V!a+p+* zfl{A^VtM6V&}8-IQ-F@N11sPrMv#=-A^ z=+v9_j2#h|nZC6THbuMCtjJ3joc_{WQMURE2cuz9Osh}i9-AyH-TWp4n|^1){l8s7 zcL&~N?nxgtxtAo@d9Pq;=I+8I=%Z-OhM1#TF|ji(zxRID9eW)a8h*WoB+lI0YFs$z z;BWj$;^RFjWh2{;;b7`3-E5_9ygNG;VSC6(JyAQFYSZf_Lc<$m{?kK#u1jnz!t&u9 z*~#F`TQcf|ET7qoJSM|dx%e-t!fuID1MbwCyR&~gJat%}9@|H@_S1`|asRHiEKj>G z5)pXb1ikXI`FAjF^JucMM){Pv#oCV zK~RI+rHf8|wNLK;sYy@}T`s^aUAf%ZywO>qsyg;TJZDh(w_lvM*2*Mh6T7QhFCXUa z$g|~7y|&Uqd$6f_PZ>V(Kw)U=Etefy#b*=ceAi2VDCtrr_q5PCvkZU!lxHD2(aQz? zxjiC_NmSN>Wwj~mc80QtoFv z?(WHsJRZ3vle!8^rK%-fRIpwBg%TuN!(=Tw#@Dr1={AXqf4=M&8O^IkHCprbL*mks z4fWY8Xl>7Kxxh;s=Qp1N^f6t=35`1G`mwDmbuDrmbs)p`DxKv&E0XBd5?m3 zp_q;^f4s12LX7IqVO17`TWAL-JsajFdB;xv0IPtg%* z^{zcV&tE@OJel%labUeN2E6cy2}&+zdP%*@Qk98mqL21J5 zVpeVHjlFxr$WK*S1qsN6K$TAO)tJu|?f&=VG**Vl(ftHfm?$HA1~% zciQ3MG=;8v!!_2mOEWDNV&>P_Yez|JMz8#qJ$g3(G8K2z)=%lmtqMG%e244!3o5sh zwKK=czwC?*TK;2C)l0*`Xhm6-JMI-r3Vhfmkx%*DRd|&g7ceeI(Hf*wNd0bu%HX<~ z4SCNy*R$JB>(BiYz~xr3sTzOZkux1o!& z`RE@Bjo=`ShwTc=rqtBV{Sj$AZ|du|+M6@J-Jn93Wx&X<+<9i?7B|OD$@9&wz1u8! zxujpc33YtnUr0wf79waJ;VcO~~AF&U+3<&5rHu zX)%EuNe6E53+b7dSBkg%FtqVta?o*hep+^nhd1ZYlTR7BznsaoAD=%R50LjulgNF+ zp8&hhxA(?da~uuF;cc?kk)x#A@1Q$In|LJaSY!w(xbp(Mbq>)LaVzT$ z+)K+p?J|Y;(Hn8~Z&a=otxw2#QNCq+NLj4}Gp(itk2|CK$(uJe$T$mluD^}{>KNK4Lq*i+)>kRcfPPF_om2%fToHkwbvXUWDL^W2ubgV@I*scnm7xW^G zLv8=crWZGF*h|v|1=%~O*aL<$~D+&xL7#nl62s`Q=_BW1Q zX)T9Rewda!ZEAURK+Nq(P&niE9Zd)AY?vjPhbT=$1n$=we)i)`fy51 z1R$|Ri=C~{e$`zj8hCMUg_Dl=>HhGeNTN;7YX z)z>VYUE5=*${5BfTxxZ|QjkY?uT|aa+@s%Bf28Rb3Ggzp>3oWycR9jT$P%n9cVo|< z;()+kU9r`parArkT)k*nQGWi5#i+lP;)?H=;2XHJJ_;g>RVk%ANJ)Q+{@N zQ+n_(7xl`Lw;tx=DXA@!KK|?_6v>e@Ut_-x3yATXw5%U^?`@`i;b+&d{2Lm5i|b`p zJJE3FmBNyy8ff^`YRQYlkpQQ015f8)_k`==aZ@Lz*2*Aj$iHF>Gh65aL~tcU4L!u@RyHM zu_guBq>pR-IP`X8*f;glY2WWA1vVE-+8blG8!FQnw4ZM~%Ssu3?(6>=4mmO2Y14bo0--cwU2w0Rr^v}>9_hFYrl1Y z@oV1kOEP0)3QIhjX$^%B*zr;uncrX{$52O$Z= zZm}pZ$6Xwz7E!$Rb-`If<2@Xr7>(i&zZ!Is6h(hOcwN^Pn_x(fqJ8+%&Ev*V4+kFc z91Z=U>vJm|>pyO^Rz4ryW47ndpHAn}Gd0Y)=}#kAm!&gI(jTy79^C1DN#>+odxl-< z_+`t)(K`P3EpHvA=L{uHC5^~tvwpQ>F*mocBx}39ORihmec#D4N$J*p8=2Q9tqNXh zK2#YGwA-Ujqt(l@C*JRcnJ$0!)ATeF5=J`r^W=5)3y)(MLVG?Qagd9;=(!?u=k3vB zKdvA3*#9Y@XX}o`x?XeY{T=dLxlW6hr>bSqj6r>P_B+xGniywcP^BcsC_#*cHdmd9 zOTB_dKsbArI)1MVtnXYx3K7>VU?+l@+?Ke3^Zu-_N>^Teyc$Cvlex%3OLyj4F!is| zT`84*+pq1`DdFHL)R4I@8oRb(Zpy9kZuAkyoKbSI`rU7Za^j!j?`d@SEPvZ}?!n+v z>GmYWMIY|T-)glCN9o>z<(o^%Y}Qk z)B8wa*5c*!ws%-~c}$r&HLfVsR=BEPWtw|!C6hqXrXIV-vP~v}p7ox@Loq|zthd*W z>a<81?uIzu3h9Jf4Zx6Up&ZMj)l^`OE(?=$!p6t0{We#E^o zU~|LPu)2tfE&VmI!=HqMo!AR5%yp~CA{`vFkBf0p-DIWF-FI|D6rF&236-Gv++-@^np*||H zga7q*(t@&OUUJNJrlDfr()2BHRPNtPQq}LuQQPoH$M@&{=_E?8cz^-P2h&<{d)m?|)c$;}x`(1eGFDI1k+^A%I zV2-Ny1C}n<~Fd_ zWVyyt4iy%!v$yb{H*l+izK8j!{9WFcX@k(KM)d9E{O%Vrok&-XXRJ#NQ&Z~_kOy|3$itu@zN zuNltV&dxZ2HEkYbeo?heisadbl}s37emGqG277lfEk@d{T)4OvNjfK0=xw0UXEZi* zf3)ZOH>(fsu+d{oNioLDycLweT(CbQ+zz%p@>qMbYo2OFZbf6`L!HQ3;OC~S^1Q)r z5QRQEcC>(bdw#z5E-uawMun#lQ?u}tf){apT;lJ$67wkCXY(7pj;C+|0{}tm7ob+Y zfj0u-ibrgI*`#}~ealT}V`pzz45fx;gEP3Fo6nXa!9_5%dA=0My$c5;Y*zV$O%GgE zb?{z+ZNjAFzBb}gZ|}+3Hxj-d^q!iv>)>6dC3er+q%D?NpijlQOC3$8$XurvefHOA zGpR9}*tmk~LV^S{f5Ech0yjpkw;EqqFnQZ{yBFHTn9t8I5{DLh6C`q0SLGC<33{Yk z`6zLwvbK3y!dNEozMyT54`-osm9+i%dBmwimM-Ohj=r)|>XbSkKK!a#AcmH(%u{(( zLO%!-Dv|)Fvi@{Nktq^MV`YN7Utg^I`0r(DvRvBAJ#K)(razqjV26&gww4Er9m_W6^Ct1TreV#ksY z*D!Sd`MkR~erNyk!e)QqtN+eyYLujPJKC_c6Rv|sw5y;|HJZaW>A}{9T+ILBYv<xgK zvHI6CE)#EJAB7&Wq?Ppm+YV6{vvA3`Q|P~cH}WKUp>=WpbuHgS<-}o|^;4&N#lJ5; zhPs8KicIL)Eic6Oty(^HIB~|+a`_zC^ZAAJW!M4wkNruji1)h&(uRYt$+s!LvIpl3 zQ=6*>Fx+LqBK0svX++m+d|N?LGf!}f=8dl*sk3+xbvj0YX9&(*2~tKzSK!WcICVRx z!Nk=+ZY8shTGB$|FdjTPX8Q2^k1j^XC00`8!Nx*EAS87T}5v5Lo7!iw=N;=8I>YB?N4fD zfFR4URComZKQDkHL9$t(IeK9rbwGW+k->RoKVt!=F(RFbR zuRjkxrt(Xaxg{i8;bfGjmfLPKEg+KpgyL@>Wt^B-jg!D`6NR8YamQPF<|~GJq*6nJ zapD3)A^e921kq2P5DQ~U75v)^6g_fm zuwXZ4c9mYS6LCkH)pFvC(0lT`GJJ2%W`l>g&@R1Te6@Y`FHKs4LWacJ?VzfKUr*mX zCq?^YFRS(0NC7%9I;zK|4??m&Xts5d;{1?bcf%Q2u97mG;1XXlP#H)fB_Go+v6p-M z*%Dd1UsNLAqL@iBg0Ze{T}PwqR|mb3ma(IV!Q9g1B&oyVm`v3@@&0a!gBo`Z@@kh7 z9O)$PZbDKFyzn0~&4T)AM@2tt>|V${h(!PPbC;Jkh3k2Pw^Sg5`jY2z;%knNbhlZa zHwb^Dcp!i0A>W9$hgIJ(==xt^e6u@^ht(pc-C4*4$H9ZHqt%w0<7P^{oa@)PvcLpyJDI8#iUx8*IUpA60}C8eBy^Q>w%q>%msMK zV2RfjU}=Ca0eon|#b#*FDn#*|uf%C=7NGw3D$SObye{l^8!Nu9T1A`9B=OY~CrhMp zw=i&)*%NG^OdS{%Q*e+wMrRECUG<55tULPTlF}-^uk+^WZtCKg3j?ECGwjlH}QL(f&wG<0_ zl|X#rg&pPUHUp%Y*e4wp!hgqe5E`5LzfBZja}No>E>Ti1hrV&@%F!<~YJ zn7Jq6;*qz)n?E`UL@-vXqVy&)ON*p69+MNQcCvN%{jkKYVJ>c@lkP!b)9jXNBds;$ zAxu9azzkrDnV{GGOC^UjLk#>^qFczY3*#}=f7_$HhSSbjaKT{gpRgKl+Zje1vlP;V zqrsxY|6UyJd)A2wXo8@r-tQOPgV2%WdW3Kgp#rr`$H1#Pl|L%6Wb8ujZ_8OZ9H>{0 zLho|?`ozhZ?v-pHweF>i>%~i(*giB>`_`VaMfugna~A?%{-Au*vAt(+XHprjjm%Yf zYVJuzJT9g1oa-S{RJ6SGGNBLaoc|(P$x0c`(UvV{=KKEN?rCz=3=w@a&rdbEY?lKp zlX8JKLM$iMWZOE)WiFk)op^7&+#R%Jbl0Y;J}x#JYL)#YjlfWNs+A4Y&p!~L2xmFm zMYb$YZiY`9$9qf-jU%X97Z(O;J_Ph|lX_=J)c5!ZseHY%?#y8w^-_Eo%-3R`fe{(< ziN-XV zojG22SxMg~b*@aAJbsKIvLd2@Oof|Zhb}ui8_?4pJ5$Hd*bBYVH9C<2moC)F#eklH zlt%EcHbbEo5bp*=3b^vZKYXACwi0YqHYI34YXs|)K(~j^z!cboWwT($`at<03!JRb zFsJcY1Pc1X>IVQ;?cf^57o6FLA3kz^hUfqXyJ|V~O9p(c_Q19J= zoG1XXLbZqpIBbEm?Mfv=p8pky<8;p@A~x%5hDvB_eq>a z0>Ilq;C#Rr*b1x)fPxHyiUI~!)sMV6phSUn7#ZGiPpC^FanS{~>HwmN2*&XI3O^IH z0}0@Asc<*(K^Y2kN3o)A~w0COth(ZM{E~GY!?#)a_I}`)kB2|D186 zF5C;h1qs;(q!l68s+_H&Pr@YGaY*{+R5O_5X9~O&&L~ItSusMbnL1lMgvy$%w_>rR zxm{K6p-o0U;2Dg0@qdv#zquq{XUkd#=nao-q zszHe%XvZMSEBV1Qa8bkB3mYrzU^AC~Dbhswv&eWisKr}>IkeCRYQth)ULH`jHU1es zc>;i4QIE|h8M+{?+@Yra_gj|G&djBDF%)(e(;*x=`DgCmD2WR!S0S1zfhVvMv2z~| z7cMNbgD-dr(zeDVPj`z(Bl^g@=xDm+9OJBPw$K@W%$3BZuccM;yS;d>EUROo8ZTdN z!pq#t%5Rf;pOuS%eJn}7Ty7~|pQBTm;SaSOwS9jA>1Mck#+}lfy1W(bmL-Xdii+-} zdJD-esYWs?QEk?kShw)$PrLK@I}QUtc=~}I9{*{7L;vl@@wW)Nj=`J0q}Q~ihy3!q z`n*ntLG`IrntG%WBCA7_kLvUC{!|P|G{A0flji~;HBf;W>)d(?m_{~kZUkLi<-b2h zm9`IHVn^3g!&-xpMQSSFM!bzbg4S{cKC{0SFu!Wy&EVp03&COWRk(h+IORgf~xnk=Ys?!``etZ|=w2$~yok(ayMYCuu6 zgUC1y$tzNx7Heu6L1*I^kXbMThZHi%m|(jE_RlN0L4ie*kdd+H+3*H@%AcVL%6v5h zB#yj1mM`Nq|8)}gU!#RC5w~hoa2j_Veq5}Vy(_7Xsb8#TS;m7(>l=Unkq|+{f^ITi zwdw$49G#-NKv%^+SJsLZZ{;U`1JOHoH5xiD6L|ir=(b8Ow3I%7r$-pM8at##PHEh1 z;yqDOYX9$vQZxfDaqwa&k&gdV```HKrX|f4<@~I%Kl!4v(Ng=^<3Cfm&oL59_8GYU z##9CpN-{{KC+VW|@JenU_at6ot@q!$C0(GavpjUo?@g3!(&qcco4Ri#ol13~R+S(kp z<6A)kzP=c5k+|INfGzv(dDv8jrq@9p0*P?YwAU1ZiL~;=KEnHCoE}`Nz=~&lG=D{o zdwwpIR;8KHk%_rP5QK{9D%;@i(_C*XMuQ8*9GDDoR*&5YjEKxd-SS%MYTce>zg_a(a5UF6n)y9w79` zDep#`g@TkUhKmySv6^pMJtr}pxcJ-PPO(Ge!quUt^+`ycqS%3N&~=LOZwCgOXZFkf zvAM6T0@v3gxV{jJ=&&;qLB!b4V37pzK!DQbGnw6B)(`m7Ilq59z{!n#$b#rr`2H^`v_!c=yHL}OFVsna)#iXvb2mf`(7k(>03h@~>$qE7yA%QYdCl<56-af0unL*CaGp7=IhzCI9^UplzyOC0 z1z_iZ8Jt|lDfu&^knFkr?5*>k+P{kXH6-@ILN5FU>(^JOM*+^bUfX5S=Yi*rxY6Hd zy8{@OU^a$9DVFT}Pb|ZiKQd|tU)S0A2@S)KL?vVLT2+bOx!#}46X-uno~2|{ zDx8I!jWw%>`BLMlrOu}66=kXTOYHp^C|vN3qD!{xaK=;$G*4NvpD4lXtZvUEea#Zb zm+;nB>}DVf z^rrCl7;OT6pHkv=ZFQj!06zdzwO=A8A_5bSjN*bA_DxE%Dx*xz5gJMAXkMIVg_eHMn-+cx;gK}wlJnLrC*HaZCpt6->}56{mh;P z;ECwoZk;eq{Xl$tf~7Se@nbbmV`R6JA)72hLNJwDr<8{_2UJK7zCEE=x1%F6Fd-AVe4=dtZF!);B(5Z5BL7gcQ1F%k{0 zf$Fb5!;cH3D@KQU4V{Z|ciC$9?$h}f>RMk%@3ST;Dt*Y-8hB{NtLF2%0@s5~TusZs zU{ts4YlrL&^4a#rvt6Us+gSYcp--jzO`N%YNZe}~F+y6d@+etoiyR_SC{KmGLlp`N+YicNHE`-eM~5+%9{ z^NzX!D3v*Vc8-R<>lvxMxvj{5#?n4MM8=SH!Is&4^R<9pIK1%(>6UblF%OECHmYj# z9o>bRO8tPu;)j$=K7Y^2n`e~maj*t1IvU#Wago{#y-@rxoNHwu>1?3&)vcAF7x0rMQe?NKD}8mI{y2vcx_JZfms{D*&Qnt0V$fslG803G0rm=pLJK?4_gX++>qig2kJ;eATJ^yPhn189mofXl*;XDo zoH`7_PLUGsSW5-$T=oV}rg=Z6{p^9ApEnPWwjSj#IJnBbHk~-eiQb-RJ93yLQf0@m zbU`-rRl4+Xi+Vw>d)mhIG2w@0@0zisFp%nABSoI3biBLe^%u2;h)2E3^ziK9^*&od z!qL{c-9r?bz+p|4@c`dNEo&=3e%(*LJK$`FOpPrbdsrY7*vt5~Cd!su5%vy`#N>xf)T;Q6c>zGGW%|5W;33^1#pAsJG=t9yO_w z@68fnj{5XzvnS^(57PvOqBRWxOyW}KO*P-d__ecUe<+{qI;D(YR1CXcq|H2#IH)MV zZB0!|=DHBz(l&{X7gVQ^`!a7g(1 zkMk-E?qS;B=jUycekb8_lQP zRB`-aV(WYwUG~Xrf}T#beR61>n{@s@UYql}=gw8gQQU7o+}y~Pr!M4JKDdcCS~zue zXtu4GcIgoqe^)dO4Kwpp;-iZ(VFPLcqy{7Bx*yCy(p%OV>qm6~Y$NQ$3Vw}GNJtZY zp`lYmDD4Yc<8tl`UenIfr7aVpOBfy$af$+3Vxh_Kku_u1kHQe!d6B$;$yo1 zi^w;|wJv`^TfEAx7;o`g|0B2H`7qZNT^^JZPV?b<_w6_siaG{-xBMMPu97~?ii4Yh zc5#BQsbfe*`1Q63jV+zoj+Amlqb~{FIZ^YdSm)KNt@%-@&RI2ALXKcFX`?@QT7Ril zRzFhxtzxFu$Y{|GYw(aZ_2}Yxj2vH0Ke(Eek9=D(heRsw-*Vwb#HpbiqBn5Xl)13f zHZ^UAtw9+4iL$Z566!xo0YqA9gE(y+-tyr%b;!f6ZV(*XU_h92WjAH3ep$Xx+9$#^plRxw^8CJ`Up_`0F1sM0?7&%OaTW7o3&nm1O-sEqNqFY?+`IEo1e~AByhI@81FYx7&t!mjeWhA&7sp zsxn0EhC!P&shRUBC@kz1>bwj5dVqhvhs^Ww;@O+a zfg2jwXMFVsaA5GYUQibUDntSZa?sn3yh508DEVwP;WZ+9|7X8QIiEwIpbQrMcj*1` zUxRx|<}J8fbd09qXJZi3&LEbA)l%S-eFm+`)Dw8_{>X{sl{4d@DvuZ=(q~Y&p)C7t zKN4ohpKkN-t;pRS8|!5SHaa^zIwE&dS$a9VoVXg`NfFZ>f7`zs$iq6#Wm1bxdw5!M zVy5{%lMZQW@7*p&!o}FMoPw)A`4{uRjPnbV?yZ!hDyCfD;QHsrfzL|u8~uDxF@A5M zp<-feCSZq0zZn<9B$^KOyt<)7CMLd2t$oYFS)@54ptjk7y66V1Q?tt@3ZO|0^!Iad za?ZB+`^Pbjx?e-Y!z8?{hXZ26u+ENH@bv#TJrCQrNAThSeQ`(P_1WE0MV=u*7E^P1BL+vV+}q>2$Zsi?gha55`aX5D?~U=ykl18n@AA%H2#^Y3w`dgh$TR_R&IoCDIhqNhi`fm)v8xY)^AJx6p4*J6Ptt)OQN62 z5~tw-MVM#GEu+nE5=)a4g5h_>9jTFS-{vsP=H|lkq0RYbebfCQcfzsvm!-9J0G5+< z14Ujs(b0DI_0{OgH;iLVEf)KvtS^sri;WEyf5K&ICA$QiWOVrFjX1wqkMW%BY_AsR zXR3f9HnrYzxys!NZ&FnW+`E|Rz9$B(IoAHy3qgdHvhZ0rPgm~%&ZV;C{}jctg#R(? ztU$k*(o5|lzkS<#rRx^!Gr0ZzPaEdXkJ!w!;{O771&py?Yaea0;~|q2awOn>Kc+pl zJB2736u`wkWnG1@!LqWkaR>voaTaF(@X(U~M@2&N5Hwq&;iZQwzpKvO@3XQZcD}El z*2N>V%juos!otG5JfI#LgL&A%zyP3!h@eYlW%%e`0ObOJP-$Y`e_=Zvp5%uuX7IAT z#juWFzF;Sfu*a@ct?(?+qpT~%K3~GkUipMqS+a-D<3vSxw(%)nEwj&4J{7;9Y7G_p z(WB9LqAI0Bik43TsS;sBPhAC^0-b38f@7ez7KTnO<(=-gS%T1%V&xK_D=&@pZ99j@ z$1D5BqEfw*t)yP!HebIQs2$nD8FZ%Oh~3`){3@I~TE9U2AN{|Z=p;!Sj_dq{m3p}y?gbDwYTbDp+CVNANRg4~|K|mOOoG5W`GtiXTwDZRM^IY< zNzdR#TE@-gdMlio0pq5x5aer^XF#aK7M!IoAkf!5ycHrs5TQ$88v+&?cp#4wjhw#~ z78;jX%C{=O2?*{esM@d)>3s+~$>8AJ7a;6`_pvRMB!y~p45B*#HI_c#gNt~(qtVDH ztKMC-85Yd^V^6^;ZY)o{=eJde;dEWa%*Ae@&Lo}LXPd!pHI~js1E(k2sasqY<^SsHI}h`uYu>XzNy{+l^$%M`@lH=|tjB*|%6;Y7Nh%;E{z zr_=ddC6Xf+DT;SKe5|BZ(qC>3wd&}Z9K-eE53qC)Op=A3XH_?8!x79UO-%qqB{;eX zJz3b;HY3yQXfBdLK0&jG8rn{%~h0X8Ahc>+L^3_5e#^h$3>IdZqzjM%bwQr~jV{R?u zRt9y1KENr&cvz?%>#+R}sg&fq&GdxLRdX3bYzey9LsBLFmkKgk<)-0!o3dQn7}$e! z=DdX%Xq=gfnm7ixge>UdWwh1CF3^Y%ACUf|tZ!QU>E0Q|Jo{5`Uels%L0BK7JFrsD zI;#YO!s1gE&-ZGC+gBp^r_5?TA!2sTl?*BiKM<+`Y{3`|=OONIFdf7AYwBl^2;Dr0 zp@5kKJ@k?=AwC|Qxo#je-MaOLd8K}nBLeYr6e?p9wH~XE5jUGYjIUaf!Df5C856m0@pJ5BiA1W(H3c-DO$Htun+yrEmR6N zy@(lkLaW+gaYSM&Yb^a+Ie%Z$q29`460QYv0Fg?4N2Yu|-B-^F(F5oUU4=%Y+LV6)_gUgoG0QT2OG`xQ4+#&Ns#p>?)E5 z>g<5nAs&RDy#eITBYAnJ$?_kIu9us7Ey}>S=|nIDwfvZsYb=J4$a z6BX)X5)ELibPz%k(E92sWEf6(Rer4k6Po;TZf1nAywFJBI_TF3T)rD=c%W<%0X95Y=KnDd!!z-a4%F}o%2M}b1XDtKCvnyEsvG`o-fS3fL&4nuMiWG`s`wG) z=UwF&6x+j*3jYPMI)F**C8aW+<(UhCkPVE85)vwaDSFP}V+ehK@j1nvJ5FW#aBHj< z{g$+^iT`VMb1{DBx?r>B=z76wR?LvbB^zX1HTGuwa&eFu|Iqp$|Rz`E{7xo=NA5E1c#DJqnb z;iu95BfD_>!7oY&=qo5;fewd|da<9-W(j00I{0ls+kv~z$FKEd#5rUswv)T_ag+OE z`D*)5Q=1B#3X8+CwlR^RJz0|l$%y?DAK7cWVM-2ZV&;!LZ|0hUR!$#Cr(Sig_a30l zk8KVPRn^X%$I8fBvwr-#K1nBS`QT{M`Vft0n(Mj9Rp+W?Ye4aa;{3g#-+Sg2q&_Dy zq~GkmVYG*w6wybiW#*~9&hiwbqW7gebM$}q{gDnE*NgaQIATnwI=LG|2O}>sk#X(j zFC3aOaSJ9l7$ha%383I8mbmi~dA(p#@~k!>Bnf3Yiup>+AV5uS^6>t*-{0$2JW4)! zE_>c*{7a*CkI^}NdS^q{xpGzxX+Sa@~(}P$&R*wdBjJyL0ZS{YwgFg=T-Wy z_OE>S^|}5mwS2nk8qpKkS$~y)5Sd8%rP(rmT&%Ybw8{&Gp->feg%kSfe;5(4|JydO zOjW8s(fHB4pf>+xkq@JapeX8Ht^!hF-x75#MS$?W1JYWXuNPkhQM|2u3SDO5J1ps7 zBxwbV?rsd`7aJ6CZs!d|AJWl|C0E?Gk&2YUAP*SW<@f$YnJ+$Opb!GLgLWx|ocd?f=fl%iG>(CTW}=#Tv4NQX3y~1O;(UJltW2 zl6+QOM69dugyi-sL3mUjC$Y#@F1_|D8*?ap-&3k_w_YZL=5EOSDk1~S1seD3sqr86 zIA8c;8G>es42zWSp+q-L+|T7N)V==ngZNCE*BggWeC69EP4*W5UYN`uu^-ysk)N8g z7ouQZc23l;SP+>9{X@eNM@xx%KhEImtNJVS*2jmhv60+Bc5`+|y!t*iMG zEq5Dkli8Y-dB!-T1O7!~=)*n(2k)SnzNbAn(%()} zL$Z=`lg3#6!4D+yXyO}lLK?bD(dSB&)YMP90A$`=C}FY%&W{e>lVvN1z(@q?1X(C+~z>mTJ)T-qRDD;i~~bIPT9tjtODH(DKixI zm6aI0$=Fv5M6WXpR{QU?J~fVAIcIZsIbW#Qz5h34@i$`>3>)Mo0%=>+Wg-Nsf%|ER8^Ndeyq40Q)V5~-(6a8LZW>` zlh2nOj778%>IPe&R9>+0(=GmzT7>>A=s5=lzN6YxF^>HW_h`+D8i&O;l)0@~iQfbY zS8+xb$2T!Zo(;kU!s-)&6q6`6t%=|I0-VcF4&IMf=Z?LetIf5S1IB#<tnu|SxCdbdYi+XLpqI3v{5`}jr>_jFayZ9y{P`jhcmNM=dgu8s4u9<`gTfGiZrx$$MR>h@{ns>UvVh zyjV{|8`hD0xb@L@&oMJh@S%`jRN}itBu{DPwz;Otu#%Skp#t1rU)4T|No!LI^!~0K z3@p+k%6O#r+wGZ(!1~5is>+Q*u?&y&-&WM)S^SVJ=^@+TBUwW65fJ6d%XwXtfvm=) z{s~Kw6(Zl}q2z~hMmh)s0EVVLngHD~J>4Jdd z@rrnAnwn>yiUG%`An}It?T0};0`9M-1q5V#L{bk+H+?43f7ob}*4wL%TO@i0%7^#% zT21n5&&@RzSU$3`iA%#@_;p|BFfEbp{2y5($$-9;C35aj@~{;K^ejDQY`=x%3bDE85tt9I%lTYR}?6e%|Pb_9`ZHVisQ8q`nBz#C9HhH`~{Sj z={J&B8ybdbAgMxZPW@5@`}I+->D8}>uSR>)Lyg4H^;i%8p^y;w8DzJFykny}(z-b^XF4nC(ia2%UQ#F0!H3h}b za1y^9B&B*eW!QvNB4(AoS0yL7HHI$apu6nXANrtfR>xz_-n)0Xc=Pq2x){2R*;FBM z8)xU(VY@Eb&ja+#!>)=cEuovC+FJS($>jTHM48UfDo5d8HP14ys<}mcvj6;vX)Jlk zM@4U9Xh;PH#Sv`{J2Qx32mc=URQ`Y5j4Ir0Y!UC@!yA!55^@AyNAp5vCMIi;>gP(} zw$Ow35eTL^@dBxw_wFI&(NO}R7|LQDfL^V{3Ol@v3tchyJM(4uifoM$yVraeGB@9y zpBS?(?@Ld!P3qBwg!O$ja`&xedGRbpf1n`q^*5JgQq5Cc=FqF?=DR_pmHI4W&(?#n z@o0?`oXZyCL;H#u0_3&0gqc~BIHL87R@R>qXT&O3JU!2iRqi$jH{#Wz7|Q}yBY5IehgPGyU5?2_exhh-U>n=PTxgEwYGX9?K!*#&xoI%bz1e*EH%G*}`h zJ>FWRNfZ(?^@FvZj~+b&q_1_+u1*E4h(N9xWWxJ^M-Q%+m-D_a0geuT0Q(5Zn`a>K zhZyX*_#LK#a9U@~h0y+}C0=_4(tdvmBO3@g@rLEJH(+Xph@;9%KDAE{#^%Eab2b*W z-Tq(4OXDnD4ihe3Ue~mre;7zAlBJu{EGR}M=uLcR-f4Fj@EKiwN^Xj13;n4iN>?nF zK47Iwg{50!xvnlgi|+j{@WANU5IG$8I=Q=w2cIDDKIRfWXV7#>(Ea1u8Rv<-(}A6n zu06)cKJ_z z79>gjZg@kqq3y-yl__DJ!ol`k)JxtKVqaHQ(seaZrKFUVe<9*${$~RAI~shH^0eCe z09LyGXK>skS5vS5 zy(>Y#CEt+Y$8P$$8WpXq`OpM75mWaDu3wGS2vk0FsaSN^HHqEW$ER5MWg4;}9%HRT zOSqw3%7DT7v}UVku&-h#@K!hj^LaY#I&!@=>%BoueJRSW6f*akAzrJhEkU;)B|UI1 zV5LDE=0cD1=S4hSWKrm3&1TIzggFA8&cQ0)nIYBWXLE z%29fq^FH#$rqq8;p{a`KQ;4FyFrCEz6kSs-^W1w-e@xL~2G+PC7^r5}a~eeAs(2Vg zKH%m33wlPA|C;@{BJ4KKxDTtrllp(_?{Fponsv_B0_LDqM3x}wON=5s#Q?ZD~MX8A3GC6U{EoH@!r z#(wM%25ov@!|oJeL4xB(sussblB`2NhfrMHWB%R+Xwc!Ibv3>ep`?^!^*&om%ib7% zT04^miMZc;<)!RgzZ$DRt8b>8H%Gd^gA&hmKe$9Rha~$6b^ZBzd-+pHvzPsTKpmx? zg`dQa_gio1g8Uw{a9O+_Qxs&1p{XwROR$v836L-^*79zfCv;eT>6_BD+={QO3wfQY~&TIKS0Gw^CtP~N) zG9tUvPSm8xpkfV@bz0U^9AKz!3fdY}FUPRX1D7Gc(|?t)#pmriNjPoq^-PVn(4CTW zs2!&jZmvnQrA-%#?F$06wO#E(w`hnQe_0R2A38sb|5i!kJ8dON+eeQ~Zs1y{-~7q! zYaBXiRZ(WsS#RAutJi^i*I##f6b6p>XiAK7n_F2Kp&ZG`KP^n}UHwa~ibX0_3~kFJ zEwmHL&g2vyptzAfdL$EUUTVerUHZYy>N@f6GRt_%z;e+S+z%KX%ooWD;wIoIvx_c>(=za!3>4OSafoD z466D#<+n+n$h9&Bh=gku1t!pubLvvEjc^aGFbCr3V6a!`X%auCp_7k}xP`4;#Bv+O zkO+?}SlmJdtNYXZ-IvyGHhot2r@bYmND((Bx+kQqgiW_Pw9MbbIKn)s-5^gLL9(Lzw- zzTGpN_6?}~608=8qBc`SM2RM|9~8&BOBrBd>TKjo)oTB0%ed$z;o_uyraIBB#hC~t zSDlG5$rsfrv-lswqDTwSH<#F$Nc2j0J=l`C=s8lpt?@VI+50q#h_>2Ro(MkDe-V@_ z<|}S@hLtiLq&hTX_uubJ9G<;#FU2m|{7~u5G@6g00R^ph@Pp#;X14tu9Ew718n<`1 z@&3>dn$$*9tUaI_q9?dFGK88kt%!{NW&h90%_JDpu7va?U@O0C;Cp`8c|N6k{ zzEVniFW!4G(hhYNdJxuPr6x=Q@LFN_Cqh_X9w z?OaSxWxjB5#3?uDeT{o!Uc^phyZBzvYx`x2x^U!+wqsS{(2{j_-3nuqk)yxQ0!3fc zB~R(==O}1@9o0XjAVGfj8#h+G#C6P86HUgBsHRlT%_)Y~E?f@w6)E~gZ_PR$EDQ|) zh-0>YCcP$-ZNd>l&HrG)ncHZc!SEzsSw1A+3lhc*(6`1cc%qYRBEO6kI~JCi;2)lG zjElU(CI3yhMA}=e&@fG^9cPt+jO<-HG8iEcu-TzYlI(%GtXy7BGg|IpVMP6&s@T+4 z{?JUSt&m62B0?t9DG8l4N^Z1C@ zkB{HAeo|r1X+JQ+CiBQYOY1T@eiG7)SMTvfg`>>Nbptgzy>kFl$PLZBk7{gzM|3KE z@*k}}n%SEGl@GD*Jea!n-`8X}-Fxe*b$)Gomdl`V2>)adOa2`pyOkbFPf1FN=QHY` z{J_c*F`8eO~m2B;Urs1vYaV| z67^p1P)x`ypF8Z_(@ikH|vMA)7#UB1CGvyCpOxfk#b9@L(#?0z#Y>P5*iB8BelD~ zy1O^ViV&I1B~7~O@9s)o!%Y7~YY`ISYj^9naBy&nKPtn0K1p|Hkc+RQW^sOWK|;UQ^9#5MmLw|htR<~zdYyi?@fLnEiE09g@%p}kq1|AFlpiOX4dCX@nW$( z1eO|nzPWCI12Bopd-E+^qEB!)-X_}SZHG)dGCdqN3K5Z}j^1{w`kGsTWHiNjdJ!4H z(3vjsCudn=jwT{V_>OO@q2tt_C8BDJH)2RQl`^iweTz7pWLi5)qmE3^nS^qvhj)v9 z|K#fHc=v4UF;4eEuX43Rfcj4w#qLsa2G(pd*3i@c=LL8rm_CcYjNBEv*Zf7B`BLu3 z@k2{AB_1C>R1B|ZUG3NWcWqY6dGI?LH}A|U+FH)WD2ffM;v+)LVDi810`4k@k|qK0 zxqt=Z-(HJ9AdsBJyT{YPxpA~R`wEc*n#A1#KBxa_46$ixCPsgu&uzKbWalO$=Q8#J zZviasP1!%b7sK}|`~DPr-{I)t)QMpUGxN_YH_d*pX2ap?bK)8e7tRkyHAev1E~^Cl1P&v$s)1c`z?k! z-|Ir1p>DF0(aAARsyKRa+uxtFvm+8n5$-Yw zMl6_ylI%8^BEif6iP#DsXzZet5CQhP&Hr|zqobik7eASJ3c)-l3}XEJ{H&}S?*-=| z;XByS4X*dxbRRZeUS5depr>C1I?}N`NdjU74EF&&Jw3Rp`g(c}NB+RS5`rHLf4~Za z=tobU6v3B3(RXt)?eZotFc3tLeVF3oVPo5Yr_0Et2_1{x6e?=i?F4Zcif4bQE~h#m zt&)P8nwpe!1oG^Tj@->5wH&Hyol}T|FfJK~f>T0Bs1~AAtSfHo!-jGei|5THXbcFH z4Mh0v@4GgcLK=(<1;Rpx5Wwt5^C1@-_L;$+P$PaU0~f4H_I*RG+c@HA74owovxZ7) zjL1X7GuuNO$zmVPn9H-NSmV))^}Js46}#v~wtvemZ!``tjWX3(6qd+PUUVA!;(h>t znw|UB9kqPU=y(3Kp|nx8`SH-D6G=rAK99x`UD$Z@N9V=J>eD1H+NQ|-h@G2QQsVaK zcVBYzg|Vc_WKI^mO_3yX7m+}X>r@^6@etEmHi~waP&i++i@$W2l&IefCxv+^F_F&$ zWz*=5A;g<_!7U1lw7gXBVZ{d$2a%DHTe({<-N4Zp790#YnSa1SfMEE5MFQ-Q%S!#I zgkt8rA7Nl06B~y&0d&yxj<^#%WQw+g7lw zjmNy55>kC&HTcgeVEqIeC=>vMceU!~E7(85c^E+i%rdIuVYcj&HlQ`kLKi(bse85s zg7-gXd&SNOc#lr}9KZ$OH!Z+H3ZvW*XqmB?I7ymA1Z40U4W+ieF(Fl9~TPwRET_yNDasv%0m_6!b69a~5h2GQ~&r zwh6xlSXiuqTe<56t^_VFF820iwvOO#`1wiATZnv0PB!cCYpAb31;`v$27D0M$Pk40 zemJpBn_WO92Y-OBefli$5m-No5`O(Q%AN4__9VUzcluTJbijqD*s0fS34VS8ZHR2O zRpfMR#jm_q)l{Wrv$v3va9{@bCURL2$1_}s#!JhaoCBElT%X4cbCBv z%cicSzFw~q9>W;`U?Hw47H&P_fHXEvFTPrYq#iDAZU7_w^+mx|Y;{rS zH`l;eYPU^&^QIb7g*HB?Kz?_RQv_gpgfzljJYRnIAWRb=!VN%yB!^MhyMZBd1MhG} z392hWAebxM>6{w5&9v9~XH0r*&r5vX=DI-h85&+lNPbjozwHl!_9~qMtZ-Hf!#4%T zMzy28cah%7=@K8YxueIGeDNw?vD;+XTOaHgK zsv2R3e1GpbnAR9nW1sr5YCI9lAu7d3ua00I`$IA-%W-`xcqTo^Ia1u@*A$+dS@D8F zGn$e=y&SjLc)v;fr;zv@B)ng=bt#1tJmiTTlE#x$Lc;@+7N)}=1jkjtSk zCX~1j($I%R0R=mfnCa&6EW|mkqX`D2ip?gnWuQHVgIX0t{(Y}VK(v5>t=?tBbp?Eh zu+eqa%o`an;xm?iu>6A4%Yb1#1)DNH4o>aS!BR_I{}ULx#87A~O#&|(puUMxZBIRf zq}Je5Eowq{#3qnrHF!x?Tf6kh<&}D4fY7HAk6*X$3M5%X==oPP zN3LiL-63dgdEZ`{n5C3^-jp{_^cH*4qO`J`P^xzJ7Nbfe?<(K6r9^=>-*tdjuq+?F zuHX|2UJTiV$J$dRO9T|TPmpZ}35kqpbc>G-kL!e}krP}rGx45fLvxMEo=P^-Vz74q z!s#h745V{rB5CV#WHHQiQn`x+NBE? ziB4KtT4s%`0viuBCqFheBtb~i4*l)=ckvIlR#HmJX3+mRML>zi z0Hu)$B3=&|dacO@g<5#fl-V&I{awhZ(YX6{Cn~mb8a;c@8I4#pKt>?xkw{Zv>)WX* zRjuCTdK={iM`2G*g5sA+3Jo6QId6D|qCfDl>WuFVk5n7@qG$CPSLx@9Q=)abd%W_9 zjAz6cT+~@}xLrC$g^jzJko=OW>SLEhh?l2rk3ihtc9K2QCz%$ZPCFlHqeOzw8$Md+ z$ur*;T;|oI0y!zXOG0AQTbiv{^vshhW6cJazynQ3B7(AJa+rRKo)< zF9a0knS&bW!J%CG4*QRo=Pnxbtt(GzN^8s2Rdp%p*65jN=`5G%_$Z>-> zdL$wAbn5nHP)vjN;>FptA>^ygloijE5<>|KUx+HU!EOEf_Ye^NK<#n@HFAlb3Q#x@ zs4(Eos&r!9klFeVj#Hphm)tBtrJC|M5HY_wg+;=@)wij6~WhC2Z zR4wf{t0O7yq43=ad(<=F$BqU5YBK19#!jw(<4?QmQ&7<89O= zvnWP^Fxt5S3^iVN^$m0^-BtE$f-epx`a_031WID$WvLcy1;v&abZ96vR4C-5+U1K2 zRVAApkC@DmQ~wHX-Sp?m6J#EYhu8|vVjy9Nyf8vO^&3o>5I^rv@K8Yt3t4V+^<}W5 z#M0(_U;g`N$*$#!#);hmi})S80YTRIQ@ExpzhG~3^H@m6JP@w9vW)iDSA&Ic)5nyHYEKUfjT`^Y$9I)z6(%n;xqNZ0}eY=dQy`6 zAf5NzYz{SoV_IYN>`MlMU=22`6=rRXIXT_d{Jyh&U)K9y!@pmG*rx+z1wdBUk~|{? zndlW2Ui?Nvtg!%x)Q^)Z5)2jGdABDIlzBsVUYg=H0;{N-QME zgZaBxUj?a4p?c8jd;5VHfBti;oxy#|q1ngcSPb`2G6~!cBBKn$Py8!54H!hUbsm0r zrh##nils%o&QB880-thhg6>o1v;KLde0m0MA*YV$6wf4&HQ`}R)pYJyc84aSb+8kF zWMXVAEGzzV9-tU(NUO?T96&uGdR=`22!0bS~_lE%877Kg3|(k6-8y`MRyGZ zlO8tL;I6J9SU^X>4u_KoiWP^&R+qJpKqQ_3K?Ags@I1}eIr&d0Ad1&UIJ)4`fP`d3 zk~p{=jKghxBE1W}CV&yY;E61}SppMlxRqcAGu`Uxkf{mfVc|QdR~_m?9b88jxWlWB zxDcZrL}oECBcR}b#)4MVO`#1`fvoV#K(i&3zOEj(KInAY_>_9j3N~I;6cpI$ZQy~t zI(fR5=zk5r0eoq4b8|s7lm%KJm=7IjIMjLJG99-6()6sX7>F1F@c1jn$2~1o{gTf; z<=jU#sy=6qvp5YR1aiL~Kc*%YDL$XP{xqDc-K=`(L`;h1A?6{5hoOx8v8AZ`&isv% z1(74M2L=5pDI+^k1-X%9+~d~(gx5V|oVrICKl4Kt24#uXjdb- zZF+@dj0uITTThkQmrvVhtVx6Q_879c>D;s~{<#KcekIF)N@faPaSYkhj!l#~%!~ZK zlOXc_ZG#C&m%hen)xt<;Tki__P7{THpwSz5~%Th^s1KajIk-CQK;^E@DbMucI85}w^UsulEgzpX7C=5Iu}bU3 z;v?keldXz5!Pqf5VOPfvbFbPyq2!3uMg;Xz{#lD|Be0YFLH#vV><`{glxBGW5>w1< zSrw`fCb;N%a!g_4Bc10PcsTE+rDxs$mYL%<_%KZ0aPQRh{SKtQlxfg& zMEjellA$AM{qBT+bt^m2QQf`Z4l(S(CE8`1{t0uXM`_`>Qq)K$s{-+kCk@Dp71V~91!l$9;>8+XL*1U#%y-mmNNMi5N!jL;sI_GF~ zX)A5t|C*;xG4EIFU!+BTUw9z6^V?XPjWv7B&?`V1e>b{lfmhXCj(QT_FmtJRS=JNf zNu zqd9X(Fjlxm-SS-UB(sCe@_w!?J6XE^ck$O=j>}ojCJ`}sW7$5YrB`)>%g^2}$S+K4 z)IUzN34_5Dyjk7Zq1nQ+haaqFp5y&BRolBqTDOqTbXh5vk#|+_T@c^Mglz5WIGy(! zz1ZinS-YGuZLgn1c)5_OC*7@Y%W>k_%MP@;_10vL<+4aTp!=~^Mq_Q-_`f?j;EMJjJ3Q7?k2zho22jvEN@mA&-VET(AB z%T#b8-0Ea?#c_CYwHhY&y#G@JR;TT`rT7U0rm9uZy{8B7R9J{r^A(HiorqG^J+`}} zZYArP2op}yzTW-2KmCd92ah$i%tX|Tpx!OJed{B3Jj!6JL;G*_`s@^@A^6d4>7gY& z!PBFbA#PE%jMqfRT147<3JT3u-i}I_M3i_D-49Z~*!v6;<`j<#Nun>zlgD`xXi&@` z9Yu?d9gfhTN?<(Ci=$lm5_!Z{KAE2WQx#J;fW$<;Y8m}VIOm&LrC%53UKHz+km^Ha zzyDlfHz(Wk&J+xpNCoDXhUVOonI4sQr)A9D%XiyPsv4)qIAIL*bHCI}G8{Sdjz5+5 zG&!;?rN?<*<$()sLAUSa3ZXQ5P{iY4ex8@&^m#fW*e~Uuz4m;?mE83Ym9%`%pK0X5 zIk^aadu@z_%1=ImG(O{oCa2cjGfD?HU!TjR)y;+S5w{N-yKA8rYwOM*zbqo&T#^#? zq`n1IpJ2c59^k+PM_(+3=+jn?uRYqa!Odm#Q!*9XVm&tP_LI(~R?ft$zNOXqPCicj z%C1)admcYFECt0fq>_dMCi$N!B89XvPa_*)TAtsX3Kh*kBPyKnrf_q-l`31)F&``O z={Xs_Z$X}1QHuJ$Fa{wjx%p|miR+=u1DvUn?`Rfz!zL3PQZMWsKgN$C-rAHR^(5Jn zOE11E&m$4QC4c)LwkR)m!XX3jK!?gDqGtvayme9wMo#HiC$XhjMEd{Uu7&C3^1Oc$ zdu(>~K=8tGmLtdI#T{Qv4&q?ZX>Km-UJRUxnBpXZDY|;P^r#!!fn;G$I&U?X#c=De zV3DD)yN#-!zo_xH2{d1mqFsgrAI?tI6{j4EM^AcibG~Nwams3Nzz`wub6oMyHTo4j zp9)sPzR8PQoq`9QD6_Wbo{F!}uI7h||NL55cAllY;teaPVZz_xc$1m=7YYoxe9(;t z-Tca)RcC-b!mfUZ@AR*Ey zYNi?A1V9CTXdtrsh$lgdya_2s4d8uMzJX!MQr3cwDf1}}MAqX6m zPE2oED)745`~$!&0f1%!A~n)DlBKAq7#$lLin0ngC{(n1)?iWL;vy&a5h_u8ie|u1 zKq4;+Fg!auyA-IGe}0e7lYk=X90!&!ICL4ASw+9`5(z2%m9M3*c% z(m-;1b1K_2MGV*{tZKeJso4HLH4 z@E3qmldr;c9vT}9f`Mc(6o?wBe3l@E0*1-wFJEq8wnIctE)0H>4axArF#A$nboTXa zF$tje{gD8$m*l_eUr@wBi1_|^ZkX{3^nT#pptcMi@c1rA9T$L1N(u=-EuS#RzZ1YuhoG{iTCQR(4^7TY&yJ+k-P@6}K(H+SY^|1+!&WPnsa5AJ0c!U2jqTr4aR|MLo>y!Lhp@Qec-w=+Jm z!0-PD`8Dlrd&FG&*#1!VjT9E)S8I!QhP~EVPlC#$lf4Zzd+O<(@s^2P8++fh&qw?Q zVsuKk6+?-0hq3OA-0Be1S%A{;@n zg@^7-n!unnf6E!M3D-N|<0HdWCd9#^7O+t_ct=g9Xkah{Kvi#V@BfDDra&yh+qX;q z3)>Y1z4K@sNC_t@rLeKF0q%#!?J5G7qP?WU_m_>dbQdf$qrX(d#ITHNL8quS-vul% z&>;d2f|5GA2?L=;=eE&e7_m<#%gi3MWEu}=;V@p@>0nxGbYK{Q^8;|J<9G@AMI4Ehm%IB8TTA! zu;asu=5}!h<b#m*Htyn zwCg5BBqYOq?_V$0y%fA6ct9;4+kcxo{1Tua=uvrcz!?~J0v%j%?3jWn*&P-Z1szhM z&fl=@lgpL-oQ81-;19rxFm7~ABU%R^lk7!V5y%)KVipqP!U{ zY#zYbb{-sIpf@j4PpbvTmdAlt8{iXBYs7`H(1CFyHO$h|K`>hYy6^)nElik^WwdYn7cyHRd@%pNU|H1@ za7RUWG{ejarW4-)1Omc9NtrWZ_fAdVv}(!ckrc2Im|y!*<=;4!{O$8#}%GvSgab8Vi}c`v8K0P{EX<>S#Vw{ z$DI38pvq{pFOpcM_9*j~(=8*k*Ab)sM?YlA7)5SZ&uyxhaM6kn@OEiG`K4n>yHSu_ z&Tc4)juoR+g|nD~wO0S00o|9H=?aC(=cwZo#$Xc7{KEhmjIhzV*fz};?uwUN^W_Aw z^xW9W1gCoh42*uNJ|3}Wx2Ta0UT~QXj}vax0!wb;(rF+ zJzOk$sTU&m?_Yon3R6!Mq2zz^WF1j#z&sv6F@yvkJj4+$^)Q=(QUezUN8P+@vB`dV z7vkK^+I?K1XaeHSVHpQ2G-4X)X^qpjz76J6_ii%37$R!zBYtn1fVNPIEx=+a$?{69 zF578$V`JhlKnyvqbKHtC$KRWo`HM!t?@>Crt5ySEDpU`W0t42E0TVuvI7exU$KL3# zopL8kEHSSMi202&dK^SXB3974UJ6#X{rh{(m)0yl8YW4#(sWQgJc~=-O|3G!%PM1e zYI}ZIc$~3GBvbuFtb#>ydRR%nNYm=b+#rXWg`_CU^XP4rjO#t`4!pPD(Y=0PNi(df zq#uMYobR4l+lWM;C^p9nCa^`T2_J19S342}ycHCqeyzOl{{S3~Z{RxM(}@WR3f2Sf z0}2)Tdr$fh5S{WF?7qNB(Y)D$fevsQ+Cd=?HO|bA2l)8dw;a*$z~BJ(0#*qL2}VXn z4i0;`)G$sq*lWK&`3zScHteThM+^EYp77@X6R8Y18D{fZ%Q9Vpn*=>h&_0+oNSY>c zFiB1lt2${b-=I)!R`#SMl&sjc(AZ>F<&CHF&A0ukBhQ@V`AsRw`!FMISifhzzk)cX z>R?YX^J;%ZfOp9W7b;sKpP!w6sxYsU=+0*%Z zZa5ftt5%-0j@xHHHgYMpJqqSNouOp%P(%?`)QWa!ls#;vt|8Q<_G92|+9(?{rK1g# z*K*hj7aqlYC7;5I&8krrB$TfHkoXm+CjE|*mCAii&;oql+IlAZe$OOfGZaBTUdYjW z?DAug#HAA7?oX9!sD3C`)4g8jpx+g}jZPWTABOce6-fyBJzJN0BlF{JoyRCZ2X;(oLYzUKqD2j#O^j9V$8)CM*Q$2+pU{m?AfwXS z&ubjg%9dIb$`pU*u7Adw|K!o#q*v|j90YHsRA3r^3!~-^>W*g^!}l`dH3!cRUbxb!BGE>0C*56IT{B{1dO)UW`0t*P zfW05#w=;H)V7EKz@)k2#!$T3Mef|1XGIy{>qPd%wg(m0d3_lR(l$L81?K`a-k5kNq znBDfYKYonnM0TyWwn+P4d(rbj-48EU{$f0998E)IKe0!4sUg0ns<+o<_D`2C_ha|x z!&*u8Epr=ebQ7DZS_XFt#CLW!>K6pFlLx3&D01Fluhb>$N3!1hsE%)|^|;Gb`pl^c z{p2yKYFI8nTh1pirMVB9Dwr4k>4L-ZqG8s&{JAHh@0Mi}Xqqg-?{(>-Or97@$HV(& zU(8gOcGR`i{9As_Ap-x%U;3kLQoBS-;mc*_OG%0F(Hrj+&v^?*tsE^c_iD|QKN~4H zEq$d_)j~nyhP47Sh7sj42Kvff4lRs)Na!~>h7aI(gyoQ*KAe3$!-sAY0(p{+dV53D z&JO%$Z5L{|@f@Y8WWlE%6Xfgb1UYZsme`1V&^L9WLC-XBul&;Z>GNidO_pKXP;ccC z(a`EE8%tL^DJ#LGL2H4XqJo~=l9TvR(0>Et=l2W{x>TsSqVp{$_C@^O7B6c1d>KWm zFp{-qd1Pn6U?ntRM0Z=s7U$3P#;wa4r6P z_*GA(Qsed~i(?Bf`;H!zASB&Y>GzqL7xVdwIA>@1x0HvAEja`U6xWlFY@OOYX3q2WFw zEr(iqngomPLc*3$k9u}?`ugn**&5p(`=06$bWdsdPcM~!6cv@yz!s)7O5JqI-M>#4 zR8`j?P8^7d%1Fo+iiA5={C!JV9WRZFXTGsPspx;n^q0kT6to=c zl3Pb!_CJN)Vx^n@j(lRK3C^G$eOel9QNyU1GiAwVA-FJEb`@oz#XL_l>=C0denYn~ zlp8B_@W`syD?l*m*?;a2GTa{ocx~q)`21P;*2>;lUr#Ah1MmFdmLT@rwkLmO=%ePK z!Q~p%Wf!Tuh3DM_pVCJALLxU>1nvDhbv5xLmy;V{m z9M|Wx({{;t|8+ST$I<4arV>s3VLf8=UVeI7-7`bufJlfDsVYo+dm6WnSw{BQyV>%N z`h}-US(sV6hMS*QL2mpVXAzp0hV_N7**x#3$oYz=C|pvlM?2=?IJ>6fSLxCF=wx24 zXdo|A-hEK#qa=J3gu`+M751zYKr}!=3i>^jy<49Qr^?I7$mjF5g_MCwPEBaiu*(*fTmGtM#}EA$~}`Ng5h^2O6JCI3X>&}FsvII7W3u2wXD zl71D5U8u-(Xn#!6BnSd=LaGevy`Iz!NTH=_ihGl^bCO3)5`^U?n8POkH0Pt?Z>XsXf@3G!zYyj z?L1C)Q%ZsV?pSCZJ3H|8)M zglV*c;#Y+16o_jvl=s$waF`8_=`j2SpS3ckVt|tnVW*H1Xs^hrwFG&wKrI8;r4zk1 zU=}Ln*Z7&efg3*{U-u%?{xY-CuHL8Xsw(eUxwcZq8F+}Cks=^g`a%sovxpFoJ=Y7k3+wxIy^u4^V}hy4!^i=$Lx;H`pm6c20=})x6PU z<9b+n3zk@K<&cq{b0{eIsHbg4HMy6~CZYW57%B7Yf0|WEl8_MIbA7h7wc$cj4k;m2 z#`6!jP^8hNDG2+MIbRU&oov$-@4R{VqQOh^gHlrz)*Sxr?%DmB^st6sC9e11Xr_OS zt!d?>vckA~myGIrEAGejd$^Oxi~P%el9&W@Uy3yF^DWRD&+6|?=U3sO=i zDf>ZQ01(q1fglR0zJO=|^6>Qpf_gck^VlB%Dma}8{|wX^NdVo}*4F$wq@<<4@%(@u z8VWvd2>Jm;5Gv-&v7noW+`L>|XmWCLOTv;+jYB!zXgiSyzIZSkXf>vU{2BYN?EabH z`6;XO7Rp0p00^NI)&C6SS>T051TnTL)-F{m%DWY(}a58^D&oBrGYxGIRM1yh8i?`d~KRKQOTH zC(oWA8h&_LOi&^0Om09n5wyk#SJ}qUJa%|rx$)EwScr#(3a%o2IcMJ3?R}k3?~)SJ ztgVcw(UYYX4N@kGoIR=|T)bNN1WY}GAE5#7WNdUA${(1wZ92zPr zB0&GOXZZkFB%tNsCcu05E)4Pr>3vp1;5$T@bp$XXn97+0Pyh(BMjC(rw{MRZ{eTcm zLQD)OObZY{0Tuwa7%NbBbU|(^xU3oI>Q2@^RbvzvH_>?usJw_>Cv;^1b4vg0BY{

    aihvbsz_6A5{zUWX|aB8Jw_j?KR$*0=VUpVgZF1Bid+rG_5G`wU$kx@L6d@v zY~!xLfHYhnXOZD!3-!(bPMrBE2q;^3SXu4W@G!!%v%kTmpUwtwO`r5Bux@t8V7>z9 zQ^_I#ksTZFOpKeH18%N;nfhS9I8|=Qi?E)9>)i3;sY5U9uwHi zi2z9!{s8=^UB511bKhiORt*PmB?zKX$5G_0+3H?k;n>%-0gc4_?9A^&pvC)*q~hI2 zEoB5k9Im`=7ROK7!#BHD%CUogQ8Sb(YFAx7GCy>#ZMrahlzt$m#Tn?Iwzyx~_^|lJ zM9)Lck9+2006mj!OVXZI$$Z%A0yuA_a`&kL&916ruRcZo4C9zWnBIfQIh}6@V;NGO zfH*HbKNn6PKLmjq#FK*P_U@m|PWS#@i8yFanYa18< z0MZDq%8UNI04o1JKllS|awIUV15x%EV%@_$&cCb+G!CQGS-_fYnuZrTIXTG!`aggp zzIKvea1PfNj=Q=Pb+F6>lV{)vx|sw)kpc}oumbZJF5po3=C$awB92%>XAzo_<{zAe zKOA>zdT#nmSTg9w7ZmVG-Ab|G>R!XE2zmOeUCoW4MVR`EBZZ?fYi)|3M?;~ zxJqmB7uYg4_q2~ME+z&KLuDwm&XsB>GkB+I8}1$T%o)p0f9Wgou~nQ$tkYdsIYQ+5^XegX!gR@BZ^sV2aR&7?><+|WM-1et z?QL79>pBwHk>X-vzP|G~T)Kj}iZdrT2;z$X|M#~5AK!77{~;n96LO7Q;M0Nu2ND>w zAS|+hQVesN-j5&QN^z0n0>}P7fO<*8Ea8`z-{WC^gRr+ZTu13*iC0=;qT6~OcGEPh3w&G5V%Ye+G)#Y9Txe-(27=o<HPq^`hL8r@XseB{X6my6pJth3AhS!8v%WF-`C0I=*;+)CiWlIGnaO z6Oae>-QD4L`6gDrD}1#1jh&06Gc#FwpD{cSnjJVb>ox-F3`cErGi`zwZ{k>f{X*8v zu!xoZGpg7A@~gzn%p#GhsY`X?`yL;m_d#eZXNvjv3PS#i@eAc{7Yt5-@vCFlfrEwR z;--y&=g%k?MFX#W0OVQz#Kq2z1PNNZdQxzYz}aXIvfW7J0HxkSWIDiq5pLgvQkOC& zqId3Wz$|wG)&T5)-(e&8{+;t6B9C1T%Tb^e40ATrzI6cBauF$gy$1A0#2rC|P=QxA z(k`vr!77-_(vK6wwI0~H1b_Yd6;=mWECX8Yy+7v)>~5i11B7TcRLH@I;_!5V<#E2f zf&uwF&AlxHUGAwnTKY|btuk7%xC?dn4jqZ&=ssU69DYV`4&wLzSj2qOve=KkbNb9Z zYtMszz0l0HMJz^1opn7jj5{Jm@eP_QwOL4ed)X^b=A+=qd{S)@yt|tB4yx$9Jr!oJ zA9&mMt6GfiPmidtuT%1eH){XP({p-UUyd>GwKDf`TTHN5mGIAd3jH3LU<&s@1MxKq z{tt3s>Q69E@P)f+39)?u31r#47Gz@Z{Kp(;5Z6O>=M9nJ&@kP1T7ag2MOsT#6&Owh zovK=F(;AzWS8iqjlT)e>POdb*nrpl%dqebiEmU~qy8s`hsbb43^}us2b=A#fpTPG6 z;}^q`YHM@vcB+L6_=1pAUf-*#zY&D|JB!dQ_eZIlOw7yEZth>%q_X-H>gy`6-$tkR zD!W|ry%(0NAk1H*I+|FWTC1@pyqYA{MvInVKjhst#y&Bm)hv8(*5IZ#y+m<9zLQf$ z8tKsKYm_#cpOWa8J7Ikw<#%f9=l8qXvKN$hz?x(V*Iw?*SBm}po#7vB7$acX04aJv zP=`k7f6`Z{_Wp~$3aRqN`+4Tz!wb?GL{SUEFEFM-SgX*|)89a=q?IKh3R*8QG4K*R z1@+FC;bEOEmTxc=08VCYkHt2uoji766Kb2a1;Yt{J6@s|j)d;+?r+zd_w^6H!b152 zY>GGlTSY~$U?dD?!B5XH*d!&FzkTb1Y5_D4qa!0XYg`dwz(I zRCp*}j6Yvlk#2WeHO{vzo|ftPedRdY@>Y^(oS)Iq%C{1dBkocJxx@&dQc7j4TKv{f zzMmO`S`iY|BgUBay~%*<(LUo+h^Y1EJTYAn+EJ_@b|~Z$3SAJGOEd|s8Dx$0`@O}W)J|87Z-OAbaNjg za1T%*yFxiAD9DM!aZMD#_Jt^4J;N>CN8lL_ycM9=l0l~gVx!eniw4uth04(u7?Tc4 z--NVPEQ5uxI!Ms2|NaHRVfNd%9+$_K4L5L$Uw}*k0|NuhZ3Ez@*{{LpLS%cwLqYSr z-4ztMUTam4+F*>XrjGcE;VmvrV6O8*3^&8BHjlQ|KYy;f<6NAE(3os5M%@!ySN?Js4R22WeH@C9?a^ zU{>Bwbs|+?R5TT)_VSZ;t=ng&WIs0SxNuT-IC*B|m6edN&l>KIE^se!SWFWEMgFEr^u_p<~mRp4189 zAe1BN9eq`D-eM;~I6aVGT41?ut#Tgn_X z5rvGaiay3U>^V7xA2K32uyH>WEN#(uoZxg!s%U+WKNg@BO+@xPTSZ2tluXB06T$KG zq0`l+{o=^sv)eU4g8PPyFqDNu(}2tw#Xmk{l88Od^Vr^Ic2aM;>Dy+Nf}DJLV8Lcg z>Z$=aIq=bSh^}t#I$kLJ8ibU+w7Btb?mT!eGP(1({d{?#kQBCxl&hwD(7lVbtY za{$d?XZa?bo+;u6d*VprdT}uNSkgaw^kz>JQBPK^SgxOjpq?IvF%)$3 z&pk`xKzqzdAUeRY6B4Q#obrK8iuFO$=KtUVJhm01bD!i3LEh}feUp};u2kFck&fsL z=ee{hYk?y)YuSBeVkKKcSGQFfo}=*g=4qldi3T#H0g58=YjB}`QP^=+cIZ@Uc1av( zF!o3PBLC$51vXiYpSEgKZ!rrKq;KxvzuqJVa(gqgd>djMwAMf3i{*cAzA#=hSmYPY zP~~jus?WK1_5&La1>Iwf^NC0d4UXqf7dx;VP`R^0O#N$dU9f=4M6Paj9NU&Vi<>4;7m6DmYi(ETxD|8)aT zRDgQ$xJZVRE;sr0we4~%zhUy!Z!Hu?o;Z;dwH->9JBeXMMT8W_yB;$kk1YG5maAS3 z-gmUPk`rc+<9AY8)j2~|*oZX}&wIT!qmX#ga%SLnetO1!(Q(|)HS^ohcS~b0`Y{G7 zE5mf#K*^_a-1iXImRljVZn&;L#XtjuR;twJIP>O!k|kYIfTGZgLNZ- z`F19`lD)*kB6LGWw3V8_9{3hsenNPJZ0lmgB*P;=W|CvF2eKrSN3f=MQdcb}8#qCI z=_8|6gc7Qrilc0)tmsnmjD$LVpc+;eueNsgcYjeVwagXo04be$7v#LGwZD&DgZR50 zdq@Yxe35?qm^*R%bMxeYdab9CoboK>b8P9&6hs1zj4!rLjN0p%QCC z7R|_=WelcN!-seopL8t?SG#k04yi~~uX zH3ocO@|FLrej#IoFc9T5xjIWuhPxu1M*G`CLRcF4=J}(XvLb@^$8Q^3Cwn6Z&CY{m zj|Zg_ldL2I#LVc-zb>N#C5Z6M)KACNZd#$q!M*M#==@Nkvy|fi_424Ff=9+KghMT4 z=F^O3S%n;D`8vj=?u4GKj;zxy?Y@yH(G%u>p18MJske(U&yS?- zYJ|u2AXpa$a=5OH99gt#P3<{I*~pJX7l;bYA9(Briot*{D$ghn#oJg*KIZR%ub-7Yx(P>z?=#%V&TCX98 z5e=WPwQV}>@){=^j^M|EWJ0HviotkYs9Tz%E_`O9_6;S5)nTWzF}V-0urxjr5}cr2 zs|{h$80uHO_ME02U}bz2mbljOVu>_Th$1(9dq2kNq$jM$b^EKTiKa}jWma86cd#`n znO%7wY8NV9@UjePw?M@sTo-M2K4cY1n96aK zpI(U%kG|$_e^_4gfl^sg&{CX_i8_VH^4xK-u~8~?fy`;1Vm5aA9NXY9=r@t^ z$nz&VQCO#bQ;W%rQlA+HRNg~`L|9X~3>K5Z6Iwcgtqn`}2X|~nKPHN(BYDY-*MSUu z2<qy`FCG5e-*0&Dvdr~nU8;@$Jh>kzH0YK)sy|Z$I>($7^~x!eXM!K&H_$V z{4{^uh_F~zq5}EKQ+d=!k>B0xa~VIzdV?%Oh9rZ{g=~PDpU8yyAb2)-7HQ4!ZFW$I zV{l_ZD9Y(xWCj^Kah7R651ic}UhVen}787GyZ6O;F&{2I2 z)|?PbwFk6qAD>HTIRNWhI26QU3ipY~zp~-oDr_5MqDsY8f7y6dg%+KIueX6Mf)f+Y zuJ17EZA@CRu$E=bHKm#Gl>RhY>~vu8_MLwAe#7@zhlx8A`l6`=Yf=POA$ShMGVlnQ zZXHwD=G#(54vH2?1s8S?${4QVxzMc!cOlWbY~Cj&v+735e_~M8x79z_{>WsL^(6&T zR-{h0aIqAw4TZZ73i&e{<%#vqC7YBRwCZQ^f4`?HO*oN%r}}5S&a9~yMflWDG+dw^ zEEvq_W2KMZy_6@B!+UY}4FMrx&~|PlV)9|p6AD)cJU!-@?*Kan;wpe_^q&9eCvXA* z;2S5Wv-1YPa|e6-Pauzka(@6awJEnF(|jSwuIj`%QZpGxQq=TwZ?c+Ec24a5B02Hp zd%^7z)@l3s@v0fo?n}g^*oAyN6nQ%heeQpaKc}HKA>UuJ@Wc@m!sMeBi|MH5yLx9F zTiERw{7ie7qt+8wP=>J^`IXFl9Xq!Cd!8IpSAD1KcZb=BX31~7h$&GAbAORP;|*;@ z*`%1NFK-tPckcbc8p-_ZnN-~XNy8@BwQC_K%0^nr!ust7&$OT3Gsa@SH-$@anTWU4 zkbgk%7$E<5+6nORUK}*c0=W~kqfYz$4)4x&C=fh-;0=Km8ANh0WcXm(l9-kzYBhit zZ%kGdanKUgjAKuCf< z!BT(-4@m^M9jhJt1qNg!B4gnT;f5%*F<@Bphezg@eY#S!zOZ^y$lK%|A)=Kl!$L%Z z+tThy65z`dJwvhAEp&01UsqOky!k$uFKedD-_ISXcPisRbNR3(o@jmQ#ogPLgTJn$ zZrw(DyO_;S9DF`(gc#B^#>d7Uz&HegN}v^0%KzzThRqbN675dc)Uh;5!>5kQ%FZsM zgz@%)Bbu8=?WY<3?)AK-)F|=?@VVZS#%Kf^ntw9XDl*1PgkJi5zseYKxbwSk zH6(uQpk!+r3r}DXT}HL z)~Vkjo|sY7XRp4;K-RxKUq_}>@6TpMlJMD;YOX=;!u(pb+M_3;bck@ChIU1%edd`W zu`>p3^D@!;KX|%Vx`O_J{2NR{X(=f$`$)8qR()5_c>qVsGUWj>H4Xs*0@aK-2n!1X z-%D}uID&gUI4}TdeWl#?TChnno4zXSm@?Pnuymc-a#}q0y?6eIc8!JLY5x+roJm|c zUT*pg`+D<`SJu)%)T8B{82Z@WZtmdFHAN(uhqwLg7|_88)F&8q096Aicn)buL_xuV z6N%s{PexnS4TuTV8nX@4R2#qHrA9lXzIb87^iQF5)Zur! zjfgCSaZ?6FV+Bs<$c7<=4uG5mLhNCk&FDf`P#4>tCPYyd`?6gmrbk!Mj?|uBb2L!j zy*tBzUx^zSUi_?ux73#0aGrZcf~S_!hwr`RtHXuop9h{Ib^9)-6VSQf*dn!}2!tee zzwXYr(?((o$$KI$V6iyJB!Lo-loUt9!I~mooi7!BJ{M)%LR*N};yc6HJ%9aXZewlb zGjDq^m5fJy^7K36uXp*VPZ+TS(^CSdFC%(K-+lQ!xox|)kqvGSgL6X&=D+obOJ^msd ze32xt8^+iKp!{I~2LJ_gJJ^o#u#hsnKyAy#aXMZVB} znpVd@gvYn?`JVCoH?NxY&knVPftIwoTKN*98 zat!i|`@eY^Uu`*;ixzyf*P~PNt+g_FuTVxDv)tE9!eS)3Rf%Li(?8ke5*)$4!22cX z%}lfDBOMU;Kd}KUUi}FS-Gty#20RlW@fv_|VZ;h10+umC_wP%CzZnn%5DxgDM#n`^ zoj>xxJQo4B!4Ct{3?X=lNl8>z_6>f0QMbU@445&1Nt?HMRZ?h0t02Dd&6>3p(4lDUyPMAdQG12!epZnQOl%#&^c}&Y$BC$JpDwajo^-Yuo7~;GaD`mipLT* zCMwe@sJId8eE4*~W+h$VRYaS)>IEhl^G3Vm_SMY%r2aY?W=6KgT>)bw^V*kOr{kVh zcqLa3NZ>b5oUbmXZI;e+CkEWi897OpqMr-0AdzK*H8%F1<5rc+!<{eY=60>UO8;un zqRB zt*`lc)p2&yXv5mGxns-F%hrf3CR)Z4`%b=CCm&aDw=KPv*j}h}L#B7R$IU^1%$K)` zEu)7Rt=r4Zx<*%CyJ6o5K(`D~KG(GBdnG-$Ff(BO?R^{Rq*0r4 zqn8!99U4r2j+xndSE48e+UGBVOkd{xzTVw6KF-0sb|g!w>*uCGz?A|oZmKp)b(t{w zcB=WOkJ}ub3gP%yl`8Fn*V*$5GSPCUS?zacCZBLG5aYtKDm1)hb9FcfGPrC4)bR}J z8NF%sD@m>;qkoWyjMjB1>0%_H$3YasaIHVkBALdI+qQM=&D<8s%T{|Xo5Y_Q?$9VW zaH1#NZP*V=@=ewb|L$a$okZ$q8Xy@G#nZRF;bph6oE*bWeyxp)(ky$`jI4xaz2k8> zMy8Ssd!$;_xTYA`qec3wwe576=4y>r>6d$)3a1d2(A8NFVPWsdkLQ_C#f%Xk>sK;w zQa0G5$pv-p82Yr1Xg1D2|4f&Hdo&-G6IK=zu9|@VVBm5`Em+gmG3>#zgohk=y`gdO zK^O}m7FI9*kaaA=;`RPc3>v-68LmZp!6h<8Gvns+S7dD>HbS4d(R!GS$;#{wHjZmc z#Ozq?^QU{O-QUT0$Hl(iT@L;bT>9QOa_!o>*vesQ%Bjc4D+i)*9GN2of?p~NbZ zY~LUlGwuz`=F#!)D3`iFpl5_K z>7KU4G?G(1-=>jmrYT6GIL&4pZb#zqK{@p|v_Wx6VV_Cw#93>y;-I;=6z6<$x z#sIgWztsJaG}zNFb{N96yEu4$#-T0hsk(J zd#zmZK6NGID{&+)I3 zNv?0MhW;~kot9&9@$rMEYo@pd+_bDUO<-A> zIsqdAuIH2OKlcRms!0V52Dx0FyQa%V4aM^IH1d$9R?$NfQy->8Y;K{*4QJBO+J?W zo&;ztZVKt8H|+#>C-&G1c3uqe$Uocdc|065`m`t8Kqi@t=>_QwS-Una{l&$!wW9*k zxRua&B}oaH`?4*393v|p& zs~X`)Fo5Xk5$M-;f~y&Ht0a~^r<*w_)(CLwz?2mTfDNx-!{8lh2$ULXF&7hH{ORaS z!2d>s>z$mL1s+f^rbo>I5rkI4!x|=h==O7SbN_<#Ek2NRMk(=>fkXz&GnA&di7t?q z6b@E*5sSHps{*Ukm$^?q+P8_648%gwbZ*XmlF3dCK2PXai<9!&QNa}#6pW^&@ee~w z)QXLjYjK<989)~EZ(Fqrk_M{W>`i&=$f^9*;_=_0^WTj@6se!0MRL9UB?b_In}2kL z_Bt%@Gt&?vcv$KhO~n017}x0yB#WFpJ~h!@LsKU3isohdT8Y*-qdUicJ)z+E*SK5l ze_sX1lfNa-Ct#5%0Aw>%);K06uoXgKg$537kPd_*C1j_ii9-J~FfafL<~v!!8_@j$ z@ufxA6p#uOy$yJEz(%MwZxiO@+l6%^0)!eszqEnC)(E5yS&(x9(T(l}Bh)x;Zh^tN zu=aj(=9ot}<&S?7Bll~s7UUSbe-mf&-KWaH_6kzEy>7X=_25&l`qsybNv?ai=&!?h z!|u(OG`@@5Il1LSjYbd=zVUhBp>>%+H$Sv@W8|X6I?FTHU4s}Ilem}P#K`! zu1Me9+nk|w=HdcJM{d6lDw4$=zy4)Q!JdG{F_898?cxzV?_7kK?a34=8ZM&@ZC zwId0M-3;?!I>fVE{4uA?uNuS>g8kve+wJLrjT{CRtPdL_>t3Cy$$Csz5FIQRWbf># z(1~eDqW_HKTb64pE|o;UD?`cl&u^)FnY86Xt{iVUak>~+zmlda*LIExkeWma_Xln) zG05}Dv=0(%T_aU69nEO>m4a~5ZRmML?p91Xs3cIM6_`tdZzmtj{T0TV}G>(NW&6#Fucq{-3kYPy65!uD-&)`K#Z_60~~Nm}H2sP6rC_RQI7Z z(VoZI#3o7FsVsY2hvprWE+a%$^c5Ps7Q;rz#hVC`nYv&-mb`rQJMQ$~!&BDVu`@3^ zes@Yeo?pAwwRlEaNVHVKa9Apry(WRfIhzz4TTxdBJvs6r?^d-ASG(U&MrvxH@ZyJU z1uS$x7)K~r2cve|fZnV=;XLXH0_hL1E=>Tq0Ffzp=*<8JVqPC^K9(DdE>~|FHTv^d z#QU-Aiy+HoIrOr*rG?40@1~v~&o>jwUc(3@mKBvL`)o5!cd+jnr>r`CEVDASJHn9J}cPSSSlZ<63i1JB_3@WH+^_ zTr0;HQ0dnLKpEPRt zBKIu6(M%Ij-YMqA_K4jgA!s-lHahX~)0=u(^HR@d$LI(xnotDwCVTJ{yb12)MJ7yh z6y292iizxt{U}>>R~#d2c<+|GQkMUfzQ`cW+XFK$etEfjm=c9VZ2>0FFiIB{JyJN4 z@-W*LiyvteX&FV%##`mx#Y&A^{yg%#n-PJ(Sm7>r%m{K!I6}o6=jU5lSS*%mT*dL5 zbPxpxSM}0guLc=03i3zjc85(btRK7gfVWi(qEVr8h}8%V3Y|<6H60Q8@_36rsfL&tQ4`HmDz;J-ko z#lo+=k&=CjJH(-3=0sbJ1PaVP3;QFuPA6aDzp*OBo}cP5-GbC!lyDPHAGmXX-~1W4 z=Kt6uBOwt4$|P8&LMoaYK*^MC4oaF*_8>A%wB%W<}wMm1gUOEi+n^_N7SXh9d z&QaS7G#)5e#{kiQa$g#_kbAe};i8^e4VQG(*MIe}`gc){cEN^Ru&LB--4L0xej1Lt zW=(UPX#Oy=_U+g2b0s4(9dGdCVDQnf)#i`at&trDE1m$FN}cz?ty>eU>uo4=3OR-%v z&5Ljd{#ZzOjJ~L!wos((=2NKOc)6uNFPy@e@ZYHa4^brEU+ znXii4IVy=OZ|erF77!f0y}kAI_3z!g2gpHia4__vuCA^C3Os!H8=Nu#{szXC%|-Ba zUfxcpsFt49$VQqTM&_+Do485>LISDZ-dBZOC)Kgr{1sT~24B~Yd>r{K6L+`LOVUg0 zc}@?4@R}fbIQJavbp&@6>!Zlx;tH%&Mwv6{e%|+5bvqUP%-!$uVi?msZ+1k{|Na?| zt(n<{@{emnkMg@Zo+SQXTma%T6S7P8{{;aUQ6q~&eUIBoeT>W89z?OP4Q2?9!*SQB zCloEx_{>#)itkh6Y2L<;v$#^SLEt&iqeU_-L?cg_9K6bVa#Xf=5!nd#oqs8za;);b z{rg^se)aeGTT7*oYd^UMzAEcM7dk`nuiSf4@v(G(Z>aQpba)i^p))-O5iGKTxD;w=?-}86^&YT{a zw`*L+f|I2aCws>R6xQVqrDUZ9aiVlNt*U$;M-|>32F4K&{*d_(4&X$n#SQblEmoa; z?tWmoMwrW~okcQSAcqg%ZMkoc%8?eA>FVlF0^X+khm1PL(2Fob%G10*o}o*Tx5+qu5M!t!4y zl_q|PbZa;pHe60HD+alxHpSPPRhmuzE80o-{35yKw>^P|*rk8UEzcpmLz{Q(ixm_$ z{Njybj5U%fhg+ixg&ilT(%BEb69ECIP~O+u6m!A!6A1fok>yEY!Ur8{zw|0K%Z(|6 z^^QN;>$_JE{IUD<(W$9%@WFz|jusL+D zLw=?1z8>`#Zye>KPo(zo4h~0)F1tQEKRh7i@Wb}I*ri5xGbR?U5wMDyWdD(}8d1{* z;yAdUQ&@tN_+N-D==4~5OgAd)^GyfpT+%gJqGgyopkmi`pH>XU^mECu}BJ**8z|Csa&HjbZFz0P(gp1ybrc;Ds1iv&i;+qmf!5S5k?O#ZG57Q!ze%Jp;=6k!-+>9uG0<%mGmva1y72P z!hL}sC2u7g^ELCSk?}_AxETf>N;0`aJk$+)Xn$&rFm!2Zombn%JlA)yqE+}Mszea7l%gh3o~dTwvJwcvWXUwZ-t1K69U`S zx#EtmQYb%)B){U6BeHducXmh8=K4%H3Gx0%xicU~FH6)G7NW_41(re~+`p!#>QnC*CP?K*g0P8)!MnFUYfdVL#cmT*@ z*uN#1Z+V3sG#1(Pb+A7wj-y9nt6kkphH|PIo>!%s4JvOU+k7{%_eSYfkys6Kw zQ~UJk;kVEFbPD34EE3e!ns^kHWaG#(yY=-x`H07lU9QcZQ22yv+by+CWL z32uoiJ!(7sbphLeVyA4z_7mt18;v{kH-KIiucNID0?OPJY zq$=({uR?(q>o*FRb?8VbS%W<@E77^l7nM0fNA`Mp!N~O@l6G9`g7}uGi-qrG)6w0u z{uwJyVg;`$WOvH9@AO4p*{0bJKw2IV9?J?0!vaU==DZZaSNsqA&A&?nu0Kz*iEYDp zbnL(OEz&=%&UcrJ4%TxJ4AKZ|o$ueB7R*rVI^YoJg3xRK7{>UQRaIv|+}~Xer@oi) z3S4|43_|LW1ANaeqUGOhGuFRH?i|gQuCD(gi`pAI4BO*0C;#9#?Nh+oVxDyV69*X} z&^ZNlv#?sL!dy^g+3Y$E`Gm$2iyF$+;@0NGh*dsbavck*9 z%nQMhRJ^X}R%{^~2(pGh-AUCd&0F^fEYa>&31A4(3L*+7mQ$OUt)XFp3Di93FVaJ}V}cCqHC* zH1s280^(mPg6?wW;xvD2UJp3hD@`mieyQY9KiN7qMz7*^Jk_IcgwF-E_Ih_b65=o$ zfqFu&TM1u7#dD*i(X6?+#bog1(LM0g<^=5G$?7E*T50uiW@C#SR&O@A*8zk`1UT>>YZdKc-4f%m{QwniKw+1$6zU%?Udz!lhFqLP~E|F?%ISfS%)YPA5X6#&d3B|wc z&ziX>(%$$EN^t~W38DgE+V{Kx?>nfiA|fJw@qb~yfq2y=*gN~YYB^D+U{zh3eC$3MiD^C;}v-qsw*izeF zA?SsGmKYTsT?Z&;!Mp4hcu=lx09wcZuq((IL5G_GI>!h3!Bld9rvj>)roI977zos2 zc0(y}CVan5tboRcYP<$DMb`Z1(sfx`o)?#t^nBQk$LM7&=r`<(Bh@H0uM(sBM z)&QZwvu9)rF|d|fz5GI=pvbjanz8@)(EljFWy5DQm&-hj%I~#0Eg^c?2{nf%l6j2w z-jE*o+l7@Mn&cXPr0<9!7nB?IOGFs?7nwtVcpauZCAv}YeqeiAXX74s3Nl1qVC39F zGw4BCqy(k{x$1*0y{TTV6#oQ!c@XOZ+gyyZel#_Vsh5`677XihGJO})buy~+Jw*=4 zPt#!y@)J)-Q&)WbAgSRU??Cd^Vt!*I3M#7ROxOkEq-H{1I@pat+)boVv)6_?0&8Q~ zAER=>|3{h!#)lyKwK6v5bh!+@JPF0XAp%QERIU+hl)r-N36Scqou7cQ2Kq{n=!FY4 z0|6iKU;N}DNQu@rGJ0M=1{EJ#jv0U}!IToD9_#CN1DT16?-Z`w6#4(qU0 z6)M=2eju2u4F|T?tdY>)c==(ScLfHU5`ocS=1Eg}>zng0%gdYM1u#8X#e;24vkJ<_ z`Iu*~xSo%uQ)ck+s9$)0$$&XgIud^S^5$~E3J)tgDs$qYk!kC!J-&C9APzSbBhf%F zwZEkl)!8SZed!Qe>cNRA+n*jp1}ei$8D{hGG#8YV@|B{sJ#JsMm4au|3D&3)djsp8 zfIr3Dnpah0`=qCv<~Q^z%f*?EGBKyRMO9EE)z6Z)zOHg2_FAi`g?c(%GG|m65AS=~bmV4r6B&P7g+ujJHyjA+~yawtB zc>_X*D)XxrwK5#@ZIdxipWB7-cL@LlcOoH%& zSL*?-7O$jkxSI{zrRC(%{z+G(2ohyl#t`awsy8tq3`}{G91+hf80B~K%E?Gp$NyW8 zD@c!QmpSM?b1V0-Cfbi?&NRpWg2}sxo~sbl*@VtJW?W`AF%ee4WQR`RfA!M|B|3*h zusRjp#^I(7|GrejNI1uzman!yUi|qv?T@YE`Y#cA?LEU?>U$>o@5+;;N4OPSzQ0uo z$8oT4-$o)OM-qoNV&hSeBT~j#D%bwP`4HDox|o_?Mq*CoK!&+H_J7a>MbicJnko>H zqPx?YE@C0nXB%kS&wT}zCI)t`7WZfg?S!S#T`;MWeIAfadNK7-oUf(WY~%_H@1Or{ zZ)@F+x{}IykE`!WYD!K-9Gc{3o%=i5oY5-@-CRV7tpGCIoxwvMNS=T-%c(=Lm=|zE z@FBCj7CbInti=Ba4X~P3yyhxHAj#VI5~pc{MIvk)<4#_TCN`22{`HR3=NCC>SBf6j zcnHQ(HOh(e(cl1;XnnJ6=PRDxwO(u{6`wL?PULgY}ZiQ6Wtx-fkc>mWu)GdvEe^| zy*n?v-9)}#DL3R^^sZ4pti6(&>i)&y(8i+wn*Vb1L||^J70cJtcG4;Azp^PGMn@m* z)U@<#z+`smX+Je(o*$hK-=9fO{xzR(BCkmt4^&5oPX%748?rM^3 zU;RG6OG|jN95K(;UQ0!SeQ-0?T#sAmYG%2tSWHkf2D{O(irEMNp-M}maf4X*@8%U2 zrMfF|7F3w{u+YP5%V=@ouH?|jn@Y@v$;qUx*^;Y6VSUY*K^Ky@x ztXT5Te#em{|GE^Kq7!q03&yn7qj2~a1QL2cOvqUa%C~%BHXgd-e9!wNHvTM+!$-?C zGgOtV2|R9KbKY^ts4$Rt5rLk%%d5r1F>`-d?~5-T$Ki70zYZ{%s5LNDrXCYpH?gi9 zL3{mhu^A26ZQU`RBQNKh@qf$_2d|PC7rk&d$6|`u=A_j3Mj9yCM1I()x%6Kwev+X1 zPKF;dG)74%ecbdW*Qsf=;SKrrVP$gh8f%5)9e0I!MJ87*TU*<}_IH)0!0{k?(Dtb) zA!g&>hg^Ak%&J=2nj48luHZ`4sGUs4NWa)6HLWta+V?rWbi<3+B2Jk^d6EDz$UQBY zIlf;)_tv7VldXr%Ms`iuWv@ubT1bbO3Ag9YEW?ZhWf|rs-o}p9oxZ`_~9v=G;<|pmFsrj!8RA7*#!UFcxH*W@l z9m;AKT;ebb0EepC;sV7b1P5~H3DLsUg%j@?A-B?-DmPp#XJw{LnT`~2$(IzsEldMs%dyS2ATAYedGwNvas?asPa z^}Ru!@Id|#BIG>-Hl+QI6n5pk(*ZiU5@mh`ql61>)tJxVYH^y$*N; zMMp+L?4CWyDgnO^vXUacf}lLYA;YY`-UIg1XHmcjOJ_+CLQn%KG=7ln1#T8K2HdE| z_PT!A%-kF*YZ2(h^B|H8IRPli3DkBo%()~A^Wu&K!4%2~go&SCDQ0NfrVLyEam|v? zN@SP(e5jrfVdyD2aA`nqU&_qdcgMWIpeRk=jf$3Ta_>Xfvr%!&zt@Qm6kOiZ@E1y> z{lc7P3zEPIPI#%N7#jP`T2pHA#L@XMH+DAUhe}*20j((tWJ?1X=eoa>7r z1_J=94DaI~cMo@TbamfQpTko|gZ|#)lNYo(2ykhs|I@Wg`Fvxdf3bB6jxAl_tH>z( zV2T4|-9v|+D#frcafHSg^mQ&SE|AewS65eEU0qXCQ(0MATiYG-FAyZ$uoQXUBM=o8 zWnAO1Qzy!7IlVNmv#0Uq6IXOrS5vbP2DLw9uJ~pm0li0LH+K|>9T^30boR)ZGV4pIr>#lx4v!GT&fq|>wp-ok5L zYw!hkdkW2OwtH$?8s;)AVlg~`O)M@hj$im297BvPEm7>^j-4N<1E1DBB9X-w@baXx z+cXM0Y^`^jY;t9#Yyr2lQev^heDgZnVeYdFBQe%A?ejjn{J^|X8 z@Aecs0*gWsD|WVj&jIfQ#qq%}0NRvQR7`n5NE{AI`10L|=;&xvEK_?sZJ0Sfh#*h@ zPd^SY(u6MoD|j16k)xWG(Gu|{B8+h+{6R;i?3G{lGcU`v`D19Q6m1)ZANNlue!e39Hi#mfFeNfQhg>^-ciaDK51;dVo3 zz8bcYk0pL)`}~W9>qB#~aSC6%Eo+IG8CONZeN0TK!{Xxb4h>g@er(Mymg}Z*$i1v<|cUx`6`OgZxu0Vhc$Ve@7Shgn3?2dJ)z{8oQd7d zw+Y0{n@fz638u}^UO6JGz|%2{U)CA2*%(CUxXG&UMccLoYxvu>#K}_YLjPqnm(Q!a z^CYWiGURy2(6z(P7OanjlH=fY#SqZ^g0*fUWD+&1q1KyYQdx$P{YlQ z?Q4T*>FVj(**ERqX98V5CMxO$q@gEC?PZEOl7&4X=j=Y3(f}5Ea(q0`_3M*AAHq`G zdQAl&Lm9^obd;ftY{*|Q)dE7!^Oe4sj&sz7pq6U9FjCY#`|qq!iUf>_o-mUxTHhkA z$v{{A5GJCflp}qA{>ff7l~|L|AgaBd~ zAvU`jqKsSeXy7~I_-uA!FoD3X1miS}pR~)3;c>p7{&w`BzWkRlvthyCf>Y#$zDL5X zvb~wY?^d)Vkv}+nfkd=S(S_XvE62Vp{WMeUd}<7;J(46nD8xT3At8al;%gmz`0edC z|5c&9K9?T-yzv#--FA?H1})Eoz!iM_Y2rs>;Dn2tY6!&T)fOnUN&O3`1C$?W8k#H< zH*e}f`8&nMDf(scJ*fo-Mi+{!nM7ILHPi>gu^J6GJ3pJsFZCA+C=z&JxAw@c{&*jy z61&FcW5yKep8-q-$XD2g=qzB|SmkXc(@W~<=+wI{-gGyPgTCtWsis`T;Ykmj6DwPh z)Xnr*-@ti6MXKxUSY9z_${IYq6{{ZTNCd6U&cLG>RiyqX(pBL{>KE5=7=OAc)W9(b z!q>Fm$xJ(l!WIMNDHZ)L>oyz;lDXSFOqd?uaXb_o>&!$`B!B0-Eo?iOZ8>FjE?83V ztssh*YGy>prXUl!d-wLPDd|_%wuQ$6g-eV5+NfncSTF%&;!y_`3cpULz)(oUMiZ7h z$*h)pQ0zdL>fX24cJq&f<3B#uU;QQsRQW%$d9pxxGokES<=Nvv_1k4B3gPKV`~>B^t1A@-s}xgvWIpCtQwF@6QuIJU^rgQ--6(vkCk)w{# zyo_%VS;;rA&9Pfpm!GK3udaw`T&ek~G>Lv^X3@el)R*P@(dj;NwnW;qc1g3{+1ZJT z!?-*K@L@}WUqocut^r)@p~C@Wflm4EBL^z@_^+|OOGs6Ta9ad8^-V-Ag`Pnq273x8 z_0rN-v-gJ5W%Y)LZlj#6L$0nBwvzm^d(VEeoYXo%WXtYS%mk?dmELOqqMa4liIr{t#Ldlxr8?Q!RF-z#F1*TP4B%^r)oa zsoNsStD)?X|BDMipV0I7UE=Q>tEt-#h@3nc)q}NxCngQpVWq<}YEmq13+T-KoPVb5 z?x9#3(5vDQP}c)H1DKMq61qx3;WFQNr583pz@5y_%xtwE%Le`mpLwew5G3G3eVYV+ zJSY=2G?bU0nwlC)Qv-|@kVQrjqHx~3cTXYM8`s^v>-Q`GRMy?PyX*7QjaDJSjES)vk*(q5m{TyRpihiX;EXOqPl7-%$XHaY zSLvSzxwhF&Q)eeX;Y#*rPFVumHW-TF^YXMY1Qv|Fy**gMKu-^0J4U9aBZr-wA7Y{8 z$22*8TRZ>BDuQn42C-TJ*wV>WMAitkov_ch<^DZKFh@yo3)>>rZDdp>XFcViCEayB z8e_S5`=H$yzb}V}oBO@-ZwQK)0~;fF0PjXwSy&KEY-}e{+QTlC-y19_uSt5XgZofY zTwFWE^F(gIR%Hhe)7N&xklYBRaBD1Q>lnogTeaES&NDM)=T`ap%e%<{#j^H@#iWjS zf13ZgNhI-h@%ceVZ%3~H@|QP~Ds`Zg!%ZPnLm^h`RFi2DbV6WI2qyz&PKbtvwrU8T zpo-B1r+XbgFCeQo>m~XGK(w!43m>9`9WE-Pw+8$|zyb8+F&4gEJJlFqzi=+I($m>H z6DfYT;1dwMtgiOnx(hU8PuX#w`I)QRLC&2en4y0nY?O|EJNfK>Pa07x@T>Y7JrVe< zZKmYmH*GF<(GBVYd>L{zj6c))7e_Pt+KUiW0k=5HDQR?cx=yds0EQ$;Gs}_*4g_5k ziWk_rmIPtmXqgh8s~Q4bqHx!N1s5Rc|19A>pbRL#UL1>OX&%E*+m1)kU!ms$#2)fY zM?Am4Q+{;xjrnCJ_~I?(Xi|+S=yk zX1LYb+t0w44OCokF9=?C19orO^mf6@Q(-<~4yP-i82$Y$?)Mpk{Z3zuJXQZz&K+yd zw(_L8kTIK2z0$|!Y{ZjISMeWN^4Srw2zD%q691>^2 zThy)2U{W5Q8|?BxV;=ew?&^F$*gN<4E2%2DWoh~X4ggEt>5@qB$a)`CC`VnbttPd+ z_@$ynq{04n-B}ku?)FT>8@$}XpGI{p3DJI{}U2!pWLi`eTd zzG}p3lL^~(mSOd_UB38TTD$oF*`@j2E^g!f{*zC;cQ`egbdq0_d(#$6sYb7q3@Jn3 z_FAO4-_HP!Lr=&>uVfwR#;V{RNI<^~9CT;&YT`=Do;K&<@VKohC!HPzhF%R#T-V1 zeA&?M7H4@NCF8MWko@?1?ZF2J@<{=~FJAHDEG9(C%9+0eyQT1KXtiJ|7q2%xr4UM> zptf)T^kC?H(3sxvs%Q}^C^oSc)<0fht@0T z?n1(sU$lWgL|_EJ%F$$Re0i}P;ImhfSoE_E=gm@l5gG-B4#h5EE|-+neD=B`Q>u6h6etRlWV-d?4wtf-#$-P)v~rDaaFnd5h#d*V;}V8_#;UxdvMI^{<4 z3wpJ=nVEg*pa1oEj<>Gc=Vs@Sl07Cac^b>1CttbU%=&Ht-IF%hDt5d`XbPHAwmU_x z8*)SmE0gv^k2@_WS#H3`KY077Sq|4x_CF||5C z0mUUn;C>0PUnL)Yp8Cky_(PcV*73h{CH>f*oT+;NF5;8_*99DD2wg&4a&n6< z`k*I5eGfr#X5cd&7*Gl3wXn2=B{noxdxdAv&b?BYQoPpU_HMRjsTT7=RNL{WMiOy~yRE`XdHxIK1|%>>)y zW6j^77c^0#;haj+b($A$=W8@hOXHAv_ds|GG2k`?CNbRnWsuuVMdb^Foz!0IJ%IS( z1AYJgy?L|C-TU`9Ec_O+3fkK4RvOH6eMjAB;Ew~_*HBobLi9Uyy4%1F0_lhALvDD~ zTx&|WrDa+Zs8Lh|`~tulWC@NZBuc8Yn|0hniB{SKylb@wvnO>}Z>V zryGD#ln*Y?Lza?6IK^B-LQf^-I8uS>4uZL#qSsfzK~cnti^RT-wS>W=o>X(?ab2;) zVCww#N%4z3u~!LuLP}MUpX&m&@WZ?>rFJxEP;6V7q5Ke7jlh2b~zf_}-g|!lhaqX0g*CrdzN`aBg5<5QKd{IN$2||35m#FN=n(ktx3M z!gnHDDLH8+cB{WN%h5MIAQlFcKC)#;K2}RcR^<#>nF*5ru2CKE^Z!8E72I^_j)cbU}k#w zbLk(*@++&W5A_zWF!%pF?PI#55EMPb$y`i28A&3$B|@`(c6N5Y*Wun9h6X(eATl7; z2oIkh8MPCRQUG#ZGHg!3qmczNKSe~yd!d;F!}(+Q;Q&7UfVs-O^FRgKBiV}s;<`K> zxVglWOvi!F{N(uPxp@@4ncX0c6gbaEz`2K?0F9~5Yi=>IWAG-#5QIJuuIpeZunJ6F zw(sJqs;W>9`Y`(;5=mySY~Mi}2=9Ax^CRc(5X@`fLY$MG-DyFp(E08`;0v-44XXPMY)8(DS$(hm+J5yDddF^4$*F`bIMe54s;bD}eF=^@@mA)B(N_(6Hr*xxQ|_ z3uO&_cSsze^!k;T9hT5WNPn^ z=A0V>xX~HphN^3500jqlB_H8d0ayAgmp)H=pX6v5BH))PgkJbZfInvQ-Kg8=N){bg zNDG;#;kEs%aBTc6p4`0#m;Vq@66Aw|{z3(S-ZTj46^C-BE&ySIN$L-nKj22yGQz^f z{{CQ}ii5AXKBg7_;VwsiW@NNG*_37DB%9sQM~=uwD`@8PCB0Qj^%B7bm5a*(F06!C zk&&1S9d=NswziUiLIgPPx5bVVc#2S1^YZeDnBZoES_#HGsM1wbTzp^na~vg4QBe_? z3eT^*#LAwdJjHmc0xvQCY!QI*^J@a8_=v|9Tyc+A-?9|gRuphKmOXtGrQyaEo3-fd z#&x|-sf|KCy6kqvbt-i9)n|`NeSaD%QD};N#-WES-CQg0wmz0~kL7=Xfq|R3KTm?j zw-WZHgFg86Y0!kx&To&rMHtL?y5GHZ7e#!Wa@R_Z8W$zl#6AiLsAS^^`){l9;K73c zjD7#knHd9ZZS7Jj*r8Hze&#iu6mYe+o_IcvKCx%R%QeRwv06rTKGsK!AU=A~6DYA& zKO>uLD9_5JnJ4U}q@E|#5g<6k)`_Ari6n4;gCH02B8nYot?2L@Ez;MCW>C1z+Vx6R z6zRQ`V&VNP4H`|lPjZCwL`&_-)KIf4hUxx8FZUS3{U zXyfcmM@iWPNuYFebm4LnP|=5m)Rf1dt1vY&ad2{?rK5wiMaXG2uf&qccXxARq^IXi zSN~iDGPUiU9Ujv^(A?2PpTe~BV_8tO&D3F*Xz zTpT33d?4YQQ_tg%7ZT`5*yZXJ{Wf%ypxA{bkWAOd=LmMM{k8|tL}_Yip}12p=C7`T zpS(K@S^PVQ*?^*n%CPbGhiW|wfBKmUQWtL+bg|F}S6z0)q2}l3 zhk>K6qT*ANb4E*xUtnN6ylpyZVMOl1$BD53q=4po9_bhf=~#w-&-k~8p27N)3_b3|gbvHE!$VLc$31xhuG6*}pU+V8JfJ*+J4=ol`O~N< z(0lR3Isi@ue=%y8<4o?z$5#X5+=hJE|E#X8JWWYK-GZ|LN(iE3ouYx!m_2vtRhnFg zexwHHCR#(WqZ%CF>tDYP{QF1fk%Ob-b+RXE%|6dZK|uCpa#Bc2s$*6K+ItE>``fp)^mId6UOvA2vY?&( z`r*SJCK7nM;J2;Ak@|7|ad^0VKtO<@Atk90f&QGO5ddzG!XYjyx_)>HS}i3It{}(+ zp5T4j0xX+k&?!*$t|*ya|7}PQpLO@;#W{FKp)N^qK8MH@Lv8${6UzydS*RIhAo>+qF~2qI_pCe1O7qwgmXBB${^ z?8y;;8g{~2Jw2Btw^K!L+<>yZkWvlVqqcT-qJX2o4+gNaq_p(a*2kF{z}h-PFGHTH z+1c1Y*in_$eOFfo28P|ey}gZ%kN>^ck<7DM8tkxn=6Gzx!G=Nb>GAO~xTht@#>OTl zZXBL+aBzSmuC7a+ivr@Tp;tJEz2DPeJHQ{vIW(RY4jYl%QGmY^`4R>H;>HS)-3mT>`k(V42*UFAg9#Gahi!}?u9#0m zp?)GznASsowh|#o4H48wq~Km}n&Y>|{ZwLPVm1Z!gJZ(4PfuJ~!C^$?uml@(V!r_t z3R5X0>gr?c2$>KUQFw zJ}USgh$lH0)(G-~G&(?$GaOZKxg!`IS&HB?NBvn&PK%l|{2cv~&(N`haPJYs;(b;O zmt)Epwd(YL3i$BVtK!hteZLCRSzfG{mzOCU0TOnHps%yAPZ5t0DNt7{G0TH6YxowO z2b})eKrNtN+dU}~<>XZ5PXBfK7xaV^K{8~H>Gv|{FGVYNq>)AqsK*SH zmSkv11><0}FQDSi>qAe$t$^hzB$p@0Li9^#R~HIrBf*6k6*eHZSh)H5EgK!4Lerze z1)f!ZVWB|D_viE!M7@TJihUy^FiLh;E&YKq@(Jw|K$1VQpq-Pv35M6`8XBW8Cp8bT zLcx0+y95{$hytL<7k)hf>l+#rSr(7IyuH`f)*wq4VD3yPt?&zoyRdM8vILt% zR7^>m*9IWLAU|${q?M`&tT2@~g6`j}>qW&8xsKja#%(}G+dDc=zJGKE1_63_0f6MF z_XBe5bEx?7?^a*Fx&)nF)9JZ@3Qt7=dJq`;fx{$G=04iHYUWqjP8wf$*WC zs)~b&X>#{&*TDdt%Q@82gX3ck7H4N?mYbm$oyp0`4Go9D49`nTYXlN4G{10{G^B5M zokAI^jsZKm*_863u`%`{K!!OvI3S=6@ZreVy``?4loa>^kduLuPH0zI7b=P!XcYbqm|y|6 zQ9qSL5K+450F1en@~cQe@XGs%y}y6|0#tzFXxLNLu*t|+0zGDK&KQ0W8yR#!jLCj* z_P;-bG6z@=fItlm4bHA?kS_~$HY6m((9qCD3Mv?k7H0SFvzy7AnVlb9q5{Mf8B0)Q z;ppgSDfk4Ia*HUzG6h8tgn(!~=UqAQhqB^=g&+=&@WGi!mbSqM$NJ$&t%0G9@UBS* zOh#2zBT#P6hX4KzVgZ(nIW&PVO2ClN*wj?2=ZFfuaf*yp0Mdh^Vs$?3Hblk5I9O!z zf3B_RcYT8;6yfKps)~x(SRWrBsLp`pw?O>`VcU%xO+YCp(*-Ev6CUcypuK+*vj22`k~yj)cYzPM^7Xox9!nI;D3 zaybQ3V6mpj!bgF(ySocZZ!&s%^UH60fIJ%*8EtNCK-8~ptz?9t$^`%$RFl{UHo7dl+)KmHHS z-aIVF_j~_+%$dtPtB@%)QAm-HF+(&VDw-%mQbHjqgiNVarV^N z5*qgF4xjILAHUDu$3FJ+&l~T0p8L7)>ssqv=XtJmd2=8S>1SNIqobptzW!vzjv~=R zIU94YG+^t)?!YHTul;5M;bzJK$^}iOEyXkKI?0aOt=57hkHAzzGX&qKh^7+S4I<`1 zpo|$me){f)EqZ$AmX4{+4$WtRU+yL9#1y>oR7EUG&ghetHZm$wG)vh;m|^)7Th5+6 zo05`}>~xs$M5rdygC9awUT0^^P&i4?kxo{-v0qPiu8>_dE@!ji|Vr%p~Q} zQt}qiQ42cM)YPn9yLOy==L;Td;0c%g)^a4X_T}uh*Q$w@&2hU#=6kf(4eC*}(&}N? zp(5w{V{48XtQs}yl9{&R)X1j3BC_?P6uk=?m9d>oNmHx$YYq~LoKGw~Fm4@iNfZXo zwcsDJT}Y8T2|`l1W#)(a<*$rimF>Tmoj0V zv!;*R7$qfG*AGO+>pe6luYIul+SRK+aA+!B*@oRoPqvu@Hw>na6N%0kH~YtTNn0+I zP!~#ON-x&bVO<*-j61U+zd0M~3rdvwntR1=rEnt=bdi|BZASnrD=XV9en4m3gmL4H z)nRN;uRq6u66Jk|sqcLy_sV~Uqg(Lx>xY|S$}PU)_POxiBsd8dFldwlYtV-oa(t zS(E+x_4D!Z0l(6iGG@}G(U$_8n!VSbqk_4$gQH^xxH4Z->JlWM>-v$sIvZ{#we!O; z*ns&K;e3-}Gs-`F7}=)_?H(jj{go@9-YG6ERlza%bTKK`+SK&PUh8!uFy4)n-n{us z%&@#ikM^w};JTjQT%bvk;)CU|USwnpLhB?k^qo9n#0cUshoiJ_`v_x4-YF+eWFcI_ zyHO+yO^ryAbDDgWZFmoZF?}e~WJ^_a>;8EGINE+$i#V<(tLz)=)ge-{l9NM$j06uD z@5AqEz#W@D5bigms&a}9HI$c^A{{wu7jUd znUOk$!IA{XKEN@P)`v5qWchJhs&A&`KJystE*OOANi>eIha>{|g5{t`w{P8A_BK{o z!u{!cqB6mVLrBM}s;*wR(2D;H+4T%IGgDFKsY!41pphEsIIwUK8Fa3uJq_ zgJ$khsa{-KT3s#Z2^?U<0Ex`(Y(dDVJM`w^T#jJ0*sviAz(f%E{rh*wwQFOeBKQ2Z zW3GerAbI2V5=_ke;$^f~pG{7!2FyhH$c19+Hca)L+miDtH4IC7_;4oRf6DrlmoK;N z*pZc;T}Y_m!#J1e<;$1Elw9eZJL!XOx^O{KEx_s9hxviOSxgXeI$QN}6gF{Y1dtzQ zhvO+-G^G-mua@X z6Bh4RASk{~W#y*&Mv61{V5%VvoeqD{=L;&IzZ>5tHvv^TLa(x{O#ge*vL^|j zzqd41J4GI15+~uCfUpe^`t2jB0d92DvL#E7UHS;6AG22n#GIU+lby}+h?Kve%IOlq zWV^EIy1zE&#(uYtLud7yL3^)Ef*h$<$8zbTygUc`>ncCyxKXvl{mZ=X}i?YS7{}K=ej$bhTI2hvO{KbZH>eDhZmXGYk7hM^i@JS1jgX5Db2LjxMF}nh(kA48bveDA=*PFrJ z2P$Z8?eDsN$dDnYt1`svloXgSjG3^6gR!Wp5k~l8J3?QxmMw-IS4KUmUutOR$lmGP zxibkkDjQ%te41^rp6ppLpZgOw^Y!cHz&p*;XU~3m|K6DE(0wR)0?RD>l)O8`jDKHm zZ}_$r+My3iRPX3e{o%vwcqga&G{Sy*dJUL$N0t)}>{xUX>kp%2zyeI0K0PN>O*C^b zMc>l?vdQF0{VkI{Wu%`D*!c9Kv35|??;rVjd7az01%MJBUz#e+i309fT3CQF3AIY! zCw5DC@v-}_+1LH&x@oOhvxmS!^yFqQ($)^QdbZ8lI*czM*8Z^Kr%#_0yk#d%3eWyU zjv!2C|H|ifxQ|g+4{-BW+k-cJwe~}Vd$p{i!)C-}TN0yrt0_~a5D+5x=WQRf)^z7x ze7wC^s+(9_H*+LlOgYZFHGp@&fqU_&>+0%qrMucvsT+c+7PRKV?eDfohn{{ut_P!C z1bLpe;>OxcZ8ASb{p)+PPL5g#??liQP9y|C$`l=Rv)!>HFYfkK4;^JjDdP0te!cj( z&F9MjvG}QR4O?bnOSrtrGjYP`bu+P@mpPD&nxbAX z1muJV#K)`0R`d->)h)j;g(cfD3X1WeBB zY6$7|YQj6sn2G-(NwD!(LX-lln2O`O@>bC~LYfdhqFh9h;OrYe``MSiAoJ#yrT zZ^8c66T|61-YcW5?6s!SXYuinNt=PTD3ti8o(wyC=8SL*Aa^4pJ^fl#4M4Ym>Ck|w z5!WT$H8nq!lx*h`DGaAf-8PCf(Lz(l0N4487mt!=1C)D4J`&1G{4|yC0HAxBPC-D= z&isTZDJ(gZKFx7w9uV3m^c^RfdE~KN^^zU}_v6>cYtflmPW2T)Y;_1~=CU(|c#As?uId_3#CA`{X+ZiRVHF zVcs3<2-%hyACEb`72DGiP1-M&6co_B9atzx*G&B=L>mE1PSC&gfe*z&Hl1h;X((uv zF@t*c=ppDtJk?Jrepc4j{s93tGy;f=&(tJMcjIY4+8B8k7ML&j|z$r&^DfUJSl zZTCq^NzIz*6**n#7`Eh$T*|A6s3-xTl7u)d*oWG|1L7PRogheQKaf(5l(67n zEh8g!+&gk|Tc~fKZlDl&aCMt5By$RIo^T>#YCuu$Ly_ps5W8pPI=S*<4WGe+aeoB_ zpZu}U|H%iUY!ci~&J+ClZZ;mJRriGy!JdE>DG!G(FjdIo;i%4-apo|n#?s$(;D7t|M+*?-R%T6DmFay#)1W!ss0=79uBi8=A69S)R1q9vzQB+G`{JJEWq{S zx^p|9XAfL^n&RMqq^GOhXLe<`o;|D6FFyxMbB5Z=p|F)E>(A{xlyC|#E!as`&DwXO~KuZkGVgh@}N?mjy={JIZ47|I=|U^ZC(tX zu`5?xnjnZ2$UoFp*sXYu2KxHfrcB`jV$c>26&q2DuRXrd-FEr%ldGFsCe*}z*ZSy{n=)$bKrw@L!ZyD;={2{S7b`7B*dN@`uIrgm(#6(JM zy*_FEZfM|S_Wez039P4Qa@`W-w63-hIZv0{5Hs}gQA#HBAw8~M;9+nOg<_M9_GIp2 z?4hxlUph5Q@fl-P&TAdfyhOX!^=Vw2v&_TOW%Z&Wb>3d$*EVjIPKSiJm2-~qAVfX~ z5@uv@i3Nw&7jEu3R=9-zyM)`Rb7WSI?O=_5aG(=J0?Rqm(Rp=D)Or#2sa9U8!!P3zb3o^97hIbsl`ZMO?= z|3+$&x3$bG9-s57CxOF+$Cc84MUZbd;Sz3794TDWmwrKul>4on!DkyHCGjJ6Jrd#u zYc>A}D&T*I9?5sVtuv0SzkEj@;qM+l9Wy4q?xJ`J0(S9M6;CWD=kMI9j|Wlx3hCRg z-{Gh48G_SdSieZr^@Qp%)S1xgaof_*g#VyL_onSi5P$uZM26KW2+p4LQ;( zghYOZO?dX~twSt6j*W%A&f~NI2-=3-J)BtfX+PJQ-6$7QsYvH?$yHBj&r-H3c)ju+ znUSebjAp<1CYX!#=@Q})`IW=wMLMntvttJ@@to5;onX9+vi$Kn;Rixb_5A)!c*slT zkB!P8azsT&np{;LuCnFAE-OM{t>hDK0!?R#)W#xPFYG*rQ>^|qQH=R*uf_L5kJgEuq~ zeF~VGm1=5cM(m54AkAGfpENB)uDZu}Nxp2GtwHnNq@``aMTUW8qO9x<{qiqggo7M~ zn&c3sub-TjjY5%oM;_fKc=huEpFEE7_{?)uGDj@dWc)s6OOTN#a9=R(KKgiYQ7Fh*S##P;=3*;!k!l?b@cVQW36pd*T<(W z;MvEF)_8mD-78}g{%4v_=-o!WWZ4+`n?mf`(yKLaOgpe@;HS5hvV(-3yroxbBwljq z;2{U)5l31dK=GX(({IO8DuzkBYi6AF%HbV_e?$Zla^2JacOfL1=}hODzS z!uzUEAVhh-P1j-#Tqr4ZZjE(ma-ny9c1{+)i}SILt+CB4`|&+nk1F%lfYif{RZY!O za8-La`Ivf_&<|c8bJ!a5KGeX)rRM9`M=-3bTz7t82EJZuJaa3no`a`UqGD|xrXobk z?6xa{^jm!AwBFBYvJ;a%vvYEs=olCL4Bp-phxI~pgc78PZ3Gy|%FJAm-dp%y+8+K2_rsqJDI27(w4B9Odh_mSEj}N9bA6?m zT0je$?}*W(pXcVTZ8}5!NiU6FH9BY&6_9vG9^WZbBUGu_wPUD$f|8H6kvQ%>75>A zUFTCiQ(p~kjlL_2mrMJdKVSLo-Nnn7sc9)27HTSZ9~Fw2>!tfweXA{7A$>ih4`0P{ zozLyI16v>C=*QlgSQxD+rWL#e@Sd2M2q;|E$6fOhHLpQfV`r@*CO0AK4 z`@2QbO{gOvbPTwKoMFa!6nT02%l-$FQ`WzIyJp@zaL9~p4udOCb!H8DDw&>BZhZ&E z_bg{SJ3EL#@ZZnk13kfXXkuYwK*H{a4}YtzZR8)}U{>xil%=$BYW^O;u0ztqNllOk z60Dljz*Vi*X|XJ9U23P^FOuGDYT9S;;8+-FXbDE|4jMQRs;{)7qPJ&Qm^Gh9zX(W# zqlC0ZZnLwy6BV^#5~l$N`ui91eTMbwB`q$-aj-IreXeB8BZL*7^$Bq>u^60WPiT-L=LPbu`*$7KhCL?I z=^|`VkwojZ9}Z=B_AX=1qL)*xuIxmt6JA5- z&0BKi$l=3RmRp3*5vnsLJHeSH71sP^L6h!qw}sc21^i^i)>dxQ4Z7&;=6VWB9`S^H z@PhEVJ>E~r6I>y@%m*Px(K)_j`*yl%j&P%WeFsn9l%Jly6-a(~8akb_f&!&!!M*LV zJ1T-gLua66!XI4T<$2&hJ91#ckQuv9yK!#S|0WIpn-Al#Rp9b6;AcUop)#d0R23{p z#Aiz3yeVv+e9IzYj_?ZZW|Y-NNrwrK9GpbL9x5S$Adcsvp|N9!7Nh}kzL%GmU?OkTIqFF`OI( zQm=G)oldlw5lU!?yg7%048bC6JcDRWNcV?l|5pPBbEFMe01E+W@(B)I4CO#dq%@fu*N=y4{M5bT8#=s1Actaae2) z7!_VB9*XX_gMv1a3OziMPmf)3BQ%ut``F)Xz}$&m$~PsLh0A_-EmBfc+>Qy39_-y} zMQ`5txS1*pl=%4R(_u|%{5UTT{dqf43QE*sO;`{%coSwDYW~mF)v4A>fmB!=!u_xx zM!>v*DV2@oIrW>geU!#dn6R0Uga?P`yW)H`ZE>?^J)(F&UH<)NV^G~$HjD7mCHroy zLs+7Ldffn-$&=5x!J<0wOGs2XYtNlHu?08R@ZrOyjWf#-?st{zu3Y){zT-|`tU@un>aO3v-^4y5#o@o6#t3*s?@9W%o-ltHyROmRpBu(IfhB}j zS~d~K>;J4ujenm7742n9;(5QZCUzBC1O@!z&4DaB6{bM)w|;&45cJ|1)(37*&&ZJG z;ccO(p6ZfQvFTP~>fq~LnLt|<_if-lgczU=kZGgYg5K%0QRjpj{z&MlK16Ldlg4V9 z-7fuKDq%6-b$@QFt=yuu)=M;uGgw)tyWqM(Qq<|yd*tCMYvrolw7@oE(2lh7=7S#UorEUsxvTj)&x^CM{v{7j5cp3+tm_RE_*aMsJ~ z_s^f##*O^*6Xu_%?T}tGo->+O{@W#A`g`>%6FO@iJ(`6v5LPNXdkTjclEm3MZTDSZ z_rP;(ih_`KUH>>Cp>O{;`T5#@)1tDcQ1f`l3!WoDXtx9*JO&a_;LgGc%t1k)SY~Hp z!u0{t-4Yr(a$xECyf}wQ)DtM6t~00@h1cy7yH|Ef6N9jX)`o%}d8xFt6r~mEW1!;3 zb3Q(ZQOUl_sq7ZoA3Q8qjOjCMnyp*YrgiJS62-~`pL3|9+&ZLbXH99|1;_bL+#IOk z2KSG7d*_i&diUzp=bkNQco-7CyKm!_KOdcDO*JYb9ii6;^v+8sAa z>dTkoWMpun1~2PQZIzRypZx9XSG@lT$#ufxh6jqgx3@H@B#0C)7*F_}yF z6T2ML7(M!GzxcoFhb`#gel*bmz@WRBGxO&~X)FxXpK1qdii?$3@JEqoiha#l}e#kaY8_)8C0lOrCJ)9Bgn zKV(Sd=g*(ty_=ViHw++cbbUREm zdJsp;42q*QxEn^X@@H}JI-UUP?VM!L04fYiTkPQDY$r`Ved)fJFBjNp8C-6?fP@bp zKaCtIv)Ef<&NWFjwZf#Ng`?!7h64-$y?OYhW{)$9wM$M+ETbG|G=%w=hZi=Wz(3+m z7A_2Fw)`(ato4DFYW*{{ne_N#y%156Ju*&Kwt#ju;F4g16<)TRw66G85Rg~~IhmQh z@+NcJ{SNz^nqp6A<-q8Fh}uEr&QUS>k^@?QNo3x0+Naj)Pxx!7%RdUn@>({BZ7-bM zVW}5+^w;m-7%8yM9~&TVOuA(0cE2Y_+cR4R0R2<`_BuE{UVh?-4%r3#F%nTqmr==@ zo0l@@2JzCw($YY;iFveCCU~T@&&gffc+J-rN8DSqS3^b9(n@lS_>du+)~~NYN@s>Z z(cP^k(981j@)+w*VccxWX|6D8`Sq(J{PQdC%tkqbn?m&faUuKdp>EI2Oe_EBJGXoy ziw^{4ja)K1gX=tee;|S=FRVH<>gdMhURRXcrKF}ZyvF9|m^RIJKnJoNnj^zXG*_%R zHDh4^{y(5dZWu%flP|A#ha@309B^0tdgiWSw2y_H#M6N3y&a0j&smmWb?feo+lKJ@ ze{BH%(*W@kCQbVB{kv6Uu;@CCBRv!3Xxv(6ny#q?rezkvc!HCn;wd*_)GdVgm<4(M z<**OqQ|{io2MNpTysE=VK~AKMbc9NeveNC;=@1$Z|#yL4H4-LZ%ryW0%s@sXyt>ci23F9aLI)f4W5Xq0>&g;imIv<_Uq;(%hVc zzJXxLW}-&0)KXorxOIKmuIs;Ih5Fmtmi)d>T*sXKYu?@qa9Y1m{q5~D$-${jjYlGX zpYxeKHG9OK+R|l&6^l|-))4a7S38n*Y)V$!DD64xW_$r^0?j~6_%{yD5Y#t5 zRQ*@!2&(wTpWEk@Aq2E-*N#T&p8!9YKj>kd;o@D>+Hbpe-fe)Zh0ZdQ34C8ShJU3s z{(aIN?@aP(sy4Q?Y&sKSma=0*`jgO$Zv!}{FEn&BUSU_)j>5yTMG9H410nD2+qWf{ zt{BEEy^F36rZ<5~PG6^^ryT17NxZqaS+mc80V?YritY&1=AXVsbR-+MQkteY#^O0W zl6{8_D}2*aZ0Na}l5z?Pq>-)3mmn}DB=RS`lI!NHtL(uITRKLTmXE!E_W#i3b^2*_ zUbjr*tU{l84=W?lP2X9y$ajiI@}&xSCXpe~eEjf1JRO@8_Bq}xRA)4lN$O`r&HJA| zQa<9K2Q!`$G+@m!edwDh<&r1VNv2uci;XQp|5k7Lc|7AMyrg_LtOQ!pNKfAH$FJ+nCAmf5Jl#_b)zSQNf?ws$ybg?pGx|O!zDa)szt^~&I}to zc%ddU+7lR(kAd}cxhe(+Bcu52sOPzbs^|=%@q&>S%#$# zb*efVb!H_kNI9h&w_61I$Z~I~?r`U-;Ig70-rs+1(;4FHU>Xej_1m~^-BK&p;*t_> z7<;w8eTNQX`{w26V_lhn42HCC6;ay8&25aNNrmIf+t_Mu9)Y%!`3#p z3wfO1=P;l=66pp7eOeOXO_CnWL3GCy?_6>qy~bi1;8Fc(oogbgEf`HaMvODK@^{?^ZR}Cd=<_60a~BdR z7@1C@p542jNi?NGM4mKr%sp*emhq9W{Sz-WY+$+N7igpwP7lQ9%}N6Pj_-FQuT6v| zqX1<39pRx1{fuxZ#9wx2_AY#M!mGH?|FcK%{{^8WPLX5XU=9#M?iU-_DT>Ry7uT;4 zYb|8FprU3bQqJfMZ4IZ0`rco{g`eT|rrrNT{S^&$(&ZoaMqqNc^}|{&T(V;pd#kRt zRuI;+#r_geIz9LSrZnO%9preX)zN3^VgKhdF3fmXue$?~dot;xpfa|;-t-@tvEzMB z+M3q9E)u=GdwM+g6L%Osi_Yyij=7b`TPZ7%(gwRIUOxwL zJ%E@R3jJ7H^Z#Sbra7|Tk^U15AT?QJfnUFFfn1`Z8~^qfpd6_JoFJ#9)R+_BT=%rU z5p6dd&*A!C+3&jqW1$xGnVbavWm|D&v@KTUgb$aXSq`$P7y~WRp8}xlRJiz`FXnSZ zkUHxAQd|JH*em+VmLH6GESom>^!R1e2RHk1qsd~ApTten}Df_?V%7qeBI`J_|ZdHk5U2gdgR z{^q5EFa_@ot07VDC}xpGGLBzDyLap67A*8Tz~q-#R<71|DJ(3^(&n~2xIs_(~f>jwn=TD$6S0)8L7K2GEo7A&JQ5&h$_pjg=?%XO28nBew@ z>JM>$YAh{G2=(*xdw*r=m`x88{@$_aPid|i)2F^7r)XIRSf=cARB1jjooU3c8A=xE&)D;!}dDGhUOf4#6`{Q!KgbSHebSFPXB8jD1_ zn3xz0!|xDP%I}{W+Urnn3+XqvHXNa0@zkkINF@Lh91l9GBHkC*Xbv}%^Ir4`-zCrh z0vWAl$`n_+usD)JTRXLkpto^deL zs)dDqj_t=7oQ}9;=4ooe=6?IR8wQ!KthrGa{+sipZ|{oM-qj^C%gw?7L@+UmVvf znT^!v>%~A}l01ZT{kLxla7{`|o9xdU?Y`$!^k}%&D$|YEpX-K?%0H9z;irSc8rvO< z7caVF(-qiZl`uH`7*@miT8n%XHXL3~>v5cymu}{u4#j8TrRkVqv1b`A7Q899U>zO) zV@uDQ*)4$()L~D$aLH+En7YSNeR3ou2;dLBh`W&f4;0wq?-i9kWJuim-3OKo9X`AT z<>JGqPcUlZmtfed23;qzXEOVtr6~`6df}{ec0g zEuYoZy{GSNE>kp9ox5uh_3As1-kyKmFxz73NNpGVdBd>QyJ(4Uh#O|ebUWGc;}?#^ z0yOZ<>C@ajf+xq;MGDeKsP5B}n)Yq?X-YeMnSk%cw_t3b=90GeF7#|UbC;;n^gCZ7 z{gm0Q(@u(-BXzFIAJAG+a^{+Q8N_Pl@D27yH~sQ}oD4qqtH|bs@S&nNz8t0jae^n$ z&@dk>8FQvSW9x$cWe7+!gB~}*$%ls<m7GqgOQE4_thm+m^@rTQzh`#B z2Gb{vse7MwjOlyqZ3oq1^Fy>Qq=+x`c8RW@XQ;n2vA}hTL05A1IM*tqNg*KM$#jY89P{j@h{#LlTU>@{xXF!be_sOXm%o zHwr=pEam$T&TZNud;Ft^Uj22Q0MF8e3bPX`OvxxD^oT z)moEePo5RCk54C{YHJefk;$;2FrS4NrbFCp>zQsQfsPzr<8Iq`@K5IlmRII$FF5zA z*C(S%KS!NO?p*I=dsuVY)T#Plb;`ra^(^8oTW-QvU`z4vSZwk``46d6I+ExF1#kwT z=luEAdU{%#$msOM8UH!_v)m{DhQZOs_}-DvRm^4mUhS6i)Su=puWT7{@xu9l5lsLG zK}lVG@0S0xzJ2=&gos5I&*1;&dMVeB7%JRl(FH|CB_-Q!+t7s{(3-Y&YXrI!QVOcj zGEO3ncWT*KuNB>K?waY^E%)=PtFw!}vSiQnKDGAKW5rV4Ge1nWS3UkYrR{TjDF(uJK)HFit-1UTv_l*=ub zYgrgJcloRq^)AsTRy#CLsqQPU`EhQ?CstJtrk>ZnGC25GkJ;M(ssou;+~vTZq*8ns zk`T+)n{i$kf9wV-*YBnQS`Z{}R=j{i-;Kwx(teMp zmMxxl9=T$--u?SO&-Pjn$Za;6WO2n%Gcn!Sq585(m64Tb52r z%YS=o#W&rIt3}IFKA#>O)}S4`yJ&P$oyn!Sv3VQiejfLA=tO54lBB?$!Kq6~NMHpR zF=DoSw8Q@x?iXqj?mZ44_JIHdYph@Yj?MC6+r8yh_>%TQvb(*Y4%r;gZl?F@iO+lJ z2@n3^1k9Ms6(Ze~vcG0Z21hMP*1X~I!u$HTk2<;+E~X96CEM;NIKa{UfW)Yy!3kkM`QN z#F8wv41JkXQCqcUcgk0bueq^2^}~9)tsvgs`dhZh1*8V3Y?bcS zvs8{@+Xn;ixlpl4UtFrEP4niNB>>R`t5P>Voa}TifPWmSr9veiifO^l<69tLzU3>s}rde(ax)`5qyTPUH*}ADSp4 zOd{Ld4PzC}o_#qi=TBv^dgQ6ZapT6VHB3%U{z9In#tn&j4R%UTk9en?l`di3l>6MQ zc7uLay-#4QI zJC$&GkC-c+F_1*kMc0DRhAwl3(QuH9g9dFhH4UCN#(5(yIb8P|7sZ@8-~Yjeq<*7EkKQ*E7(~M{VxX2L=4k^GF<$abn>W*m z_M2F9ecE#8pc4xMNxp6O&0Mp_?|I4kp*F$?6!*KgnyE@WzLm?CUA$Enli$UxR~bwV zA0?bJhuJG5Lzu5lWuSSRnVmv5MJ{??0y{zEy2d-pP{k2}r9FeE{Rtw$J$a8d?K(D6 zM@>#8rwOMC6MYUV(yg$dTK#ki+41(;^TGvy8zRQZV(;DK^q>h?gqtnlt~lul>Be7feOrkQW@f^n z=2+&i1yG70t6HC0cQFATXZeoSM=2VbM`jmJbZZ$bk!Y2$igdGiT_iD0Fd9>vV>6jj zex0_{?c2ZStO@~sPMEN=vZA88+6fMxh8*zUj2ZWXT>kn7#x1w%m;AnFkbI5zclTPV z*eAwYO?sDg9K`T@4$EVxvIN6e=-=IqD7ZH)O4pZK)Zy!2K)K$GT z41D+JMmZlwX?uXS3{j8jz{Yx8P;h1WSVy%fQ_c$gUBBwTEEI&EfXPKfHFB`BeBNtabzFa=yxT!itBXUvR-=5(u7r6o=`H!a{#H;h=!>)NX(7%7l5+ zo{hsDcMj{H`9r-&(QVY-1FP7Mi?R9@n-0ZqAt@^@Sdk)_^ zyR*h!(@x6JzW1n0ivu?pY^6hU9i7^wZ)J+z%eZEO94$;RlE=odu&N$X2*aBDHe; zMi{sk?1rvgx-fQx!=_xj=>wRk0WoOYJF?!yWcJ3tOGk7ee4T@6i&M9M zl5`Oo=j%3f{By5FUlk?Aq|p}mWm7Gl@`43j?$xh6UhD0ubY_7t@snPi+FH85>Czk1 zA}HUK=_fK>BSON$=8AzDJ*AWeEjBQSp@*{~>F*N|6`O5A)+BgrZI87+BxKqBxH|8! zw_;MrtF#AKV7kLX!3Cd3zZPr9*01GWJa3i%? z!8_PXfoO<#QXhz1@$&8SHH#K)LSTVqDO1``4&ha`rT)gW?l;uLimlLHv#%9@3brL8kIITEysJPlH)n6d#k+VN@0|88N!sJg(!XUNZsQWgUA z=>s|E=_xg`wq?>g)=9UHCG6t%vp5+NFPXNt0)s7V5e8Jhk$64a-IuLe)m#F@P@ zU0AxXyG5IQE%((YjUS&0ePWnC;LL*VVqy>T(YrC-H1OE%l?B&+>&tmq*}^rkR7!|) zHFopnJ;w(!md1XKcjik>&>$fb`CGS|Z{N!4=wb$ptLrn~A-8v@4jtazK+4+s0>sX; zqk|lX%{0*$r?D}xXVIOWKmSbZFKU+l_i2pQGVmA0YfI6JnIH??s6h1NJgU+k%MXvHGl@^ z-hKNvHU3oe?(DZD0NhI?Vo@ki78;7yG-~Gr zSy_UeMpc+$bPt>M?b{1vBwiBJ*`P`186hAZ5Jtg+J%%)@m0V#RUtE4oOiErpLeTcu ziR6}sATJ!6t*_#%*@p&a6tH=iCw@Tu7m^?1nubPOza^ZxbBx95?fTR>-TXG`YL$+T ztWx|GS3il|V4D{R{{ApB3F0(zv|41@FVBupFRa$zN|=x9+3^FK_L1c z=5yo^$Cl<99&_P!II^Zp=@hrkWoh(x`x4!v%KH!gbMpt+vd(tBWN?F2ZF7^O%TmsH z!HW(``Tp%2rm@MirJwJpt@F%OA@TB-cCpw(c7C!Sq{vZ3|L$Q+ulUzIKnM;oDOQY& zprC^30moZUGlHP-!t!fqwp4B(mhoSRBA5+It&eYG2mgJGhw*8XvQBK28vu-y6uWfi z&J=ZZ_3`7A3JMCcvieGyGI$FQ9&(Ynxz@#{YI_@lnc#7Jo2~7l`SZ();?+Ion#c_R zkAd+xP4xyuG^gtvJ-TS?)*3>PW8KStm)a=1*Uz<<&JL#SL0o!>pFDkg6fB$O<~LKT3dai3C_{->+Z2@uOXq>=~i0k=`(y{(oRC z#l`WuK-XFn0tTej)RS@05ZNVur%(6k)r)Qrc}Vbq1HG*k9f&@3Iv9~K{kr~ciHeR6 z$18!7Rk@EEmlt*)^`QS;{{yLug%fA?WMZDTq*xr~#J>RdI&$Hdi4zM!BjqaLdXTT+^yAj7S`~EhVtVGP+SKa<=Dhjm z1!!lGeqlWD^6_ARA9-NLb;|84SK3P<=(fCn+EuM5W9qLkl?M8jZk~9Pdrmz_jnMTK zUzR)Dz-TwHjP9>FTzH$70D|EUyRi-5@FpQU4Bwrhrh}u|^;)6V7q@>UG-VAw)eaB^oPN zg{_`%%@x-NquxQTxuoIHB=i4NO-o9u;0}PC`Q@UB0`)@xKnTRbiBF@kPRMhhDR5!f zo<^ZDZsW!&NWH|{ojZS2>&6Ygz?X&$j9yryPI!!_X!&haSshB>78$egDrNko2M_ix zTJ-A2_~p9LtocYhS`S8~Me(%Z0*F-u|yx4rt)Cs*-l{36P$-;yF49O1W6qNPTSnvA?r zy~?lHY}TE9o%a`;Yth|M;x5AI6nN!IgZkI5OqrepsZGWttBFbVJ2DwroNbEPX77d+ zMwUQl*wBiI~IFaM;c5 zt9K$OTtb78ydmHm;6#Bl?C`IPNwH^FOI6Ne$AE|DYiUWkeAVo>NG9{qqj#WSvNb>e z`3J`kD}d{3DepRmM9olz-M?zD;U_2KA3ru(QL&`y@jXU(RxHSA2Q|VEQ_|B(%%j5k z?^yGG4yn+QWS3nWpIV6_l^DEz+cy3{RR{Q;3Nfdq{pQQ}S51xsZLsTMrg?(s>u9SJ zZERw~iDhZIxhNuYJ3fFT;6grx9XqxJ2SoIYu^OfP9oeL8++ytt0S*x@w#+sFxxxv} zYfF-8Jot>^4zJG1v-jZ{RM>5aX=&m%v~$27r<{`)fR>mPq&D;4zvM+8YV7i{xcH`d zy0n5JV1ifNgpng}(*kn+`nWlBo^m=Z^*k${dw9xytAH3TWL{b@e?F#$&mTUJb|hVZ zN*pIKZT;i+Lbm17Kj9bUcoCFZ=2-cjJ15q?%&Fb5&Bd5_$dhp-)#R3aM(Z$Pa7_Z1 zj=_Qw$g*(lB1JvM(Tji{rkNU^o_rc?TFS zciP!))ZWgnVDJI2Vu8LVBaMiK;AQoRn>Ypk9)a-^oNF5*&bL;Sd- zjp~B6vtegBur&T$RMcdRQdYa)Gr*yMcbFp9t>b}5>)beXVZeZ|k^UrCW}MAwiJLOj zvHnJ2;3&uOKEwGIMBQh5tdaK2mEO>O1h2(D0-l~*Bs1|0UU{_;kCVz(8+C&pA5M-T9DFXD?p7$jtnX3#U?FqWxC*)!^XZ)*9ZRKA1hl zM0Q{lq#V@T7pBIH86!3iQcn1zwDjYe;g#*4(lKH}bH;`Zf^W9!F_Lfw_=5LE%}7n< ztgJpl(|iz_7@AC=TbK!~q@-$BIpD`T?$W%T8P>mFm26|7bNxFE)!E&6zd&V(B-m4M z%^xK$=rI@W$dRs9uCuRZ(lt59uB-(kGt^WQ`SRA@uif9XN|YHCP5Y*_3)HnK!&ElE zQ5q6OGYke$#+ZFGQs=8Mv`Xl8V9l#s0!~7LnL$At8~0+sWM$=1o1NGzFJBgn%88f4 z^dnuHX0lWO`hEMJ!5OwSryd+YBqzU>+Wz8QzK%TIsA|84l;}$!0ASQ84WT`S%6Hz1 z6}`QkCEWy-g?Wc1578Dtf=qpR?>~qi;Yyi=EKJzouF$nlTmGt0gFw=Yxw#65Y7o#* zJpZ=WpWn8zvZDP~IGcKV|GOcFH+bRY4{vS5uOHToeeHF6`atIC_$@KQa^y9+Ve8bI z;|gLIiJn|Jud0KJ_Uh`?#fX@>7)gsgoE%A9q@ou3YJ->Yy+%$v6U3 zTxuIb>4DC(di9Xs^8}n!y3eQlIz#GuOvFt8MEe>1#N)^N9S8f)aHO$Wsqop`4)A7) zdJ+W&%B0Dre_j=Ih@IV7y2Xl-1nJ%f|FUS5i>s(geat zp=44KX`ynTy~uFk!mhK#?>fZW6shf(#Nq;RKt}SP*9DJ4W5&yNaVVzHe&u_1a@0Ev zG|T?3`Xn+?z%IAnBeF9xzSWe>Gc)^4h+^0jULyWeUvIZx^4y}0CMG4w;tY=kMiSl; zXYycozU;d~CacbkxI8aw8(W>pLvhKb3jOhRT4c&7WasDqCQ*I}L*E9~6z=``ZPb|s zw28hYqjlb|wP?}m2;&ZpDg7s|){EaeW0p9@0};R^d>_;agv%{G+5M6n#6Xa7Utvs@ zCX6Cl_6gDx!r|CMM!`X%z)}>y1(pM5P6pzJyiVHy3#jw{1~Mo9wWBtqhn(x5K@ zzXG!-?ask^zLeODaSlGSWb^8g9S`gaKQgarcXK1(suoXL`&l>jXqBRMPNE>ti^RgrjKmNIl8Ce z>!Yl!sF3A54AfzrB(3Tos7O+#Yb4r7;2&X;H-3%?4JF-m#h31$dpqfB>CVbMFQ z>miocLx!o{{Sj_I!bAMh(lPC4U2ys}?N&=$kI_HgVA$wBWsOJNu9oH|#3()4Z1NT`ni{>MOIwX8RX$QT#6Ee6FJw(p|EIQP6vRIS4UIIeA#DIMzSCw@@3fh5J4Z3 zQmtterIokM4|#uu4PAbY8=N1zbJE)VDLFa)l@D)eU_rpDW6a;Gyn|yd?%q}5$%Wr* z-|xs7*ash<1rKHl=L=!`;35;1z;%efVp4Ro^2M0G8SzclLe3 zNB;z@_Ft#VtLDUj!}FRRg#4PiyWu9)G9zF$#I&{Dy1F+1RD3*Rlnai#so_#K7(D=T z5XIggG#2v6QKNoN?NW0ifXbdcPc-9;+t^eCH%}~Mlg(eaaIoAuQ6ZkZC!2=>+^zxV z3H)bq-kk9{-}t{*<-DF2UIa*z$p zd=~H~4G-vjmQ_&rR$ zOnyK&g_m#MOyl$yu<{4{IWFR77BG!>^lwi)OOif?6r<=^Pxj8Y>G48RN0X%|;>D!x z#a=mug=?YSSUPOgl`9V_0}ZjBiR}kefLNIIY5}vheU%VO+C;1NXnZNX_?(;+Yd}#E zLtzX3D<$f)>)YfLp(~445UdHPT45j8E?>S4)84YnbEO0b$`tg6{>QlzT38*mv<-~` z0%S=JIhc{g(qpIion3{kzQiz!@UgR#$;so#drtk?_7E%Ry?h32(?_@R>wD=|`0(-L zQ~wO=bmfcOk05YejD6jn&$fTqHNgILDy3vKr-fWCz8)Sv zTC8o$AUz`^_KeD}Utw$S`|SDAbx;;=;O{?vnDvwp7spVzyXJj|s^L#c9+k{my*dun zvPI$G=maYp8z;sXQ8^N?OpJ{=>O{NQ`l&TWILIa}o|XFq(kXR#Wy?@Wmu}s=Pn{E)U*B@ z(Tdv7qN^Jkd;*6<&6~QjON%L6?^8vEgkC;2x62$|}i!?XqPY#??k$s9Z%Y z%{#i6k(dC9JWuvS*nkfFO_&gM=MLwt*n^R=68>yH>__k2xpTQ7 za55g$El!#>3YLFHOEA_1$9#`wI~dTTa5>CLC7KuacL(E@4DP96PRAyc2nZZqZ`5e% zH?-^F698nu7(;rIc$rl`nORTOx{4QaIHy6FR3&ziL2kVdExq=d0U-^)e>2jmL$q9? zge!F_jh(+hL=M9n>H>R-i*MPv(}^q9(0GhA{$fkPmC-wE+NU?>GXIFPg{-HJaA7mi z*Li3smTh{e*BqPUn>)B2RpahsyGF5E&v?V1#q;Gq14I)#^&s3*e-;bmwj_fOOYO6?T z4(GhJw~|v!;;*@d1smqpDQjI;X)40{d_%c`{y3NhpaLBs``CJ1l?cy_jm1p30k*K z^7q3XkiFnr!U5k4X|sS^$Sq+n4Y^uc@6fzz`vwrxPb>kFR>vKWHuVRQ)qeX%Rtxv{ zA9gBHcH+cmnO+oMdO{;pR!C8~(2CZa+&p1T?0ibmyJH#ND@=Hg`vCbToCjIMH-OBu z;Y1*k?3z6ZE0!)*+5YM1&6{6&n3!gPMS_xG)ME^ehWNd2A3a)6Y07%y96|!0*u^VX zMv{@JI;dZk=#KKFSMSFU_Hwv_2Td8wLL@Wt_G6J%X(LCVa?}xPa3E69+>JQsDd{FW zN{KsnbXp6UR_L3CCxd?q$aQM@n;^j7X2<_x5KLH(O4#^w;ln5PCF2QYw6 za-Di*WMwtgmi6|J;FBy+Q4*5Wq+CF9G>_%=AHwOxBaC`5EMnB?(ci18_KCA-^n}_GDzOS{joE9x8Ev!l|wyuIzFQu9I9%6 z;>IcHHin0?U$0Zw?LK>N1-gyk9;>Pc0M?oF;`n5VPV0S1gOoBmzRjXB%xvd zKBlzPJnma2+9Ccz?4K`+RujwUncjMbX?eMfmzwG@?AN8w18bH=+?{jZG_e@;(o9ew< zfDnvA=#3j_&5oQai(Cif*}aZ|ng644J;FS9c-^6?=QYJ$08P9xk{=2Uf8g!6 zZBua2;fM{`P6|&LrQ^r7=g;rlV>qCgd`c(B7Gp+;qHY1EX?I&TP;l@I`HRJng!l=Whdd;=79%uKOSQbyP7h(yJsLZ(hV>K!DkhOYE1!&XdN=hx z!`r{!czxGUw%@Q})@Ej-p?CZxQac{X@kBwtnptM*$ArxMygaDI;Ct9woYOJ^v^JV4b0wo5w%Ar~H;Y*Uq6~ z^{dPJE40%#-hg3!e{FmOj1vAz1X9c_d_evDi5#0DOoiK8G8excI%&_IJ?nq|ytyRc zvrxVP`*+`kDl24k)5zoH*Nv$#4|N~xI(qO3F=OU55CM71hI(XwNjbSR;xeYJ!ot0{ zBJ6v}*)=$93}|~o(hZEwyEoQ+c9Rw}CMDl>xqD~mkRgQX{g>^X9$TIv%11hKb02i?cX0%W(a$ zDhjqYAip)7*?l$f*_g>$E4{u=+}`u_%jD#bdUJX^8)Z>ea->wuniXD1M0z*iEpGjY zdkThrI`l<810e6J8}sxnZEOIa^|UwDF=*~s;(f@tudxfz1Pi=;Q`<>sz+{32?t6_D z6~}T==sFXV5xYx;tyh?p8U72lC+?*Dba9R9mqpDL&$QZoRb)2wu@3Lbxsa_6Fh-_)zphb6MC39I*36vU*nC-`{&IBskrh?wK^^AdQAhS<=TNF2ba8>q6Uu0S8Kb{A&=ea$RNdp;!-eooHmUY~bJP5$&2~RQ_fUKpZ+9UmBQz6im0E z=Q8G9vGdx`LYaaP!4AVba^@oNRI7HYs;YuBBs9oe&!yVWB5_ExUxqypvXsedv^l&V z!-de@!wik+J9mh>Z=XK>2sJ~LQkfzn!x3>qrA*P<#NQAbfUd|cFmna?0QfTBuGmi7 zgVzi06a-9m2e%YmKK!shF{R>*^xsSW<@(_DiDPbVX_=V};J!`}(jbv-f=*Tu)KDG> z@ns0CxW)?}@RKJarKI+qzv1i08j6lqcGTLunRFw2&x%oDqt35agUbZxaQlm#5@oRoNfWG-HygtXk*nbq z2J_rUkJ{L9N$j^p-U=V__Ckv|{I1_jAq1(udGmy-E`?bJs~8E<5Eqwv&}a{HM7&dP z?Hhi9Dwo1sQcS_6;8Wq>&umPp^LD*W6ShVvjGEuGabw18i5r6eT*_P_ij-EJXOlj8Rzgu>fen8n9TJZ5i3AX58zjjsW(Qe6D2bN>WTQUSohgSPNdG{Fh zB(4E_vq%Q8a|oiorlQ;iS>gCK;O0&e*?3nxS z+lAD6D`$vZq$!Obg!p7U1fd1w>$wbUriOfn^1zUbnc`1au@sWRNVr$tkJb%Q*#diw z2=GUJC9zUg0J(V&K8%IbeTd45N9#@;!pE*LYnBv)fT*$AV~|R)F9@c2w=Gui{5U66 zTmxMWhe*+#UjLqSZ5WIF&dr;g#v*umflK+KQDlMVWOU31>1#439k}v`l^RZTI{#zJsXcIiPW9pIDU+N4*x-2et-GjF#S+l zY*2=%u_ww8GY6=-23`sYnJ&Q2oN0e=ucWzFyN56X_ygvEcf_PP%B4fse#PnE{{Dco zko=bDjN8GicT9sYWdqMF`10lb-~YXL;-23t4LK+1pazOr<(K`=Mjoe6>nvR=zE&+J zI_d8^Zn#(bPB{Zz2R51}@K1g>AQ8|}8Ea`DjVz|5qyq*5gQRTN+tuOY<|BJEr zfakjJ+yB2wQORhk6dKwg6_wpmNoi?XIYY~;5JF~4N<%|vIqR%&HYhTpJ!q$FN*YE~ zw*T`(=XKrp@4oKe|JUPsoYy&uug~ZGevRWeUdM||SpIF{?{Acrx`N!Q$;X5JIlkwC z%_PF*#EC_DNWz&z#hRQ$g-&@fKMS}UuQl&u4RtxfXRB=t ztiGtJ31=-W!+#%u6A=-qtD}Gai4%f-M07N4=iRCO1j)@Z!0T)OMOJhD(d9gyjjS;F z{j0Te_L3hlSbb0I8u0wZzce;_ohO{}o>D4irh}@a{a4kRriLq9e@!k;&i$|da&t~- zAf3&pu8)=4e_vW^zgW%ZYG>6%xq@}~`x(Fge65Q7kbiys|3?i^;mS#85GbWuZHk&j zYm#d5(b4v|l*^~~N&n|4I^ggMMro#{!gHVirTlXA2gR8I9vzDc_F+@e)8B_llr%{5 z3}`E?#QCTw{j&=>2BenN3m5JX@QYUIJ00^-kD&)Ely(5lU$@R$O}@$Y(DCEgY#D~= zCtmsegQQ)y?OtA5Y6Is(7)37!rx3#4PX=u;MVs1N+H)^gmel0t?q2O}1p6-dD^{8f z{r%_bI!RVX*794r^%)a~$33RLL{Di1c1ZvdzeWzITj99=_wOw{{v~}tIYCM#?C605 zhSyI$Yu$JO4o|>qcI|?PtR;JWy(dU$O=5uNp%IbMK$wM^QVUR`0y6{jG50cV?AT$a z`2+a#%{seKLP}n?SFh=T6rIP99V2s6V&akDx?%-4f^)w!IG6`Pa~Sht0#YWtoQ?yK zADY9iXMP}Q>G^Z!;2SU3yEhJ=YxI61g`!gB%TON@4(N@L`M^8(=-U^7N8qi(9%PPW zPk{`fkvfOD9R$8K{j+AwDAEQR!I9eV;|)*CBARn!Brnnw)>LVEY^N8~IKgO-4_*53mSaI`dY zC6WmTONVEVLtYltzx6%y1J(HPL+@8wbqH-aLLR zrMwyOGJgMf)UcJPn);TM&9g?Sp)dLB%^T>@p5k&ndfc{-r?O_{CaOu})6WE>RU)Xj zcPkYs+KEwzc4axYG`W-WrbMLB?ZLcbtzbB3&N}jjLV)^&2}l^uE~K#*3~~9m;GRWB zCEvb996AIvJBF4TdLJudMde<+q5l0pBTS+Yp+aH?h_``7hmt?N;xdA2@7@3kM+c#&r2hh5A<7~8TD%4+*Q6D7wfT;e=3EQ^ zP!2io8#`A)B+oRAib|i}y#rkSWHVUm_FGX=g`7Z&aLVjyhK4j;1*r)M2}kztU(SFJ zXcON#>6R-mjJOV$!nhwA9WD|+8>sUrSWApXjvKcfRd(`NG?9%@S^vf{ff69O@?#|3 zyh&A|Z)TS8{-0!{uefy4Y6b-J)A{c~mVRbt$8^1>JnPhdZ=e4CcO_sxiNhN;h>t4; zETuOgrFs)G9791@sT556O==ZD)<1!qO-CGLPZt)88?fYTj*-!rRf(ZPv^6#RDl?&B@-q!Y4_1nwF-#dbBux_;S=<0cwUR$o zmg7On^BXrN=dX=l#w$fXl#zt?n k>H77h%a*yJk9PY-*)JJQ=j+_}RhzfnzNr$P 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 literal 0 HcmV?d00001 diff --git a/examples/advanced/CaTS/images/mscHistos.png b/examples/advanced/CaTS/images/mscHistos.png new file mode 100644 index 0000000000000000000000000000000000000000..3e901b223c25c9b090122bab07ff68a192c2a831 GIT binary patch literal 147761 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

      i~gt+Au^WyDmMd3 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 literal 0 HcmV?d00001 diff --git a/examples/advanced/CaTS/images/position.png b/examples/advanced/CaTS/images/position.png new file mode 100644 index 0000000000000000000000000000000000000000..09e2724047e4d65230a9660f2f723266b029275f GIT binary patch literal 66753 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 N2~k;*qIbG~{vUYF)yx0@ literal 0 HcmV?d00001 diff --git a/examples/advanced/CaTS/include/ActionInitialization.hh b/examples/advanced/CaTS/include/ActionInitialization.hh new file mode 100644 index 0000000000..ee28836d1c --- /dev/null +++ b/examples/advanced/CaTS/include/ActionInitialization.hh @@ -0,0 +1,55 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file ActionInitialization.hh +/// \brief Definition of the CaTS::ActionInitialization class + +#pragma once + +#include "G4VUserActionInitialization.hh" + +class ActionInitialization : public G4VUserActionInitialization +{ + public: + ActionInitialization(); + virtual ~ActionInitialization() = default; + void BuildForMaster() const final; + void Build() const final; +}; diff --git a/examples/advanced/CaTS/include/CaTSClasses.hh b/examples/advanced/CaTS/include/CaTSClasses.hh new file mode 100644 index 0000000000..b70386e712 --- /dev/null +++ b/examples/advanced/CaTS/include/CaTSClasses.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file CaTSClasses.hh +/// \brief Declaration of the classes for generating dictionaries +// +#include "G4VHit.hh" +#include "lArTPCHit.hh" +#include "PhotonHit.hh" +#include "InteractionHit.hh" +#include "CalorimeterHit.hh" +#include "DRCalorimeterHit.hh" +#include "TrackerHit.hh" +#include "MscHit.hh" +#include "Event.hh" +Event e; +std::vector p; +std::vector i; +std::vector a; +std::vector c; +std::vector d; +std::vector t; +std::vector m; +std::vector vh; +std::map> hm; // map of Hit Collections +#undef __G4String diff --git a/examples/advanced/CaTS/include/CaTSVersion.hh b/examples/advanced/CaTS/include/CaTSVersion.hh new file mode 100644 index 0000000000..7c74bdec7e --- /dev/null +++ b/examples/advanced/CaTS/include/CaTSVersion.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file CaTSVersion.hh +/// \brief Definition of the CaTS::CaTSVersion class + +#pragma once + +#include +//============================================= +// - The meaning of each digit is as follows; +// +// 71 +// |--> major version number +// |--> minor version number +//============================================= +#ifndef CATSVERSION_NUMBER +# define CATSVERSION_NUMBER 10 +#endif +#ifndef CATSVERSION_TAG +# define CATSVERSION_TAG "CaTS_1_0" +#endif +// as variables +static const std::string CaTSVersion = "CaTS_1_0"; +static const std::string CaTSDate = "(14-October-2021)"; diff --git a/examples/advanced/CaTS/include/CalorimeterHit.hh b/examples/advanced/CaTS/include/CalorimeterHit.hh new file mode 100644 index 0000000000..02219bee22 --- /dev/null +++ b/examples/advanced/CaTS/include/CalorimeterHit.hh @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file CalorimeterHit.hh +/// \brief Definition of the CaTS::CalorimeterHit class + +#pragma once + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" + +class CalorimeterHit : public G4VHit +{ + public: + CalorimeterHit(); + ~CalorimeterHit() = default; + CalorimeterHit(const CalorimeterHit&); + const CalorimeterHit& operator=(const CalorimeterHit&); + G4bool operator==(const CalorimeterHit&) const; + inline void* operator new(size_t); + inline void operator delete(void*); + void Draw() final; + inline void Print() final + { + G4cout << "CalorimeterHit id: " << fid << " Edep: " << fEdep + << " em_Edep: " << fem_Edep << " time: " << ftime + << " X: " << fposition.getX() << " Y: " << fposition.getY() + << " Z: " << fposition.getZ() << G4endl; + } + CalorimeterHit(unsigned int i, G4double e, G4double em, G4double t, + G4ThreeVector p); + inline void SetPosition(G4ThreeVector position) { fposition = position; }; + inline G4ThreeVector GetPosition() const { return fposition; }; + inline void SetTime(G4double time) { ftime = time; }; + inline G4double GetTime() const { return ftime; }; + inline void SetId(unsigned int id) { fid = id; }; + inline unsigned int GetId() const { return fid; }; + inline void SetEdep(G4double Edep) { fEdep = Edep; }; + inline G4double GetEdep() const { return fEdep; }; + inline void Setem_Edep(G4double em_Edep) { fem_Edep = em_Edep; }; + inline G4double Getem_Edep() const { return fem_Edep; }; + + private: + unsigned int fid{ 0 }; + G4double fEdep{ 0 }; + G4double fem_Edep{ 0 }; + G4double ftime{ 0 }; + G4ThreeVector fposition{ 0, 0, 0 }; +}; + +using CalorimeterHitsCollection = G4THitsCollection; +extern G4ThreadLocal G4Allocator* CalorimeterHitAllocator; + +inline void* CalorimeterHit::operator new(size_t) +{ + if(!CalorimeterHitAllocator) + { + CalorimeterHitAllocator = new G4Allocator; + } + return (void*) CalorimeterHitAllocator->MallocSingle(); +} + +inline void CalorimeterHit::operator delete(void* aHit) +{ + CalorimeterHitAllocator->FreeSingle((CalorimeterHit*) aHit); +} diff --git a/examples/advanced/CaTS/include/CalorimeterSD.hh b/examples/advanced/CaTS/include/CalorimeterSD.hh new file mode 100644 index 0000000000..38df1be755 --- /dev/null +++ b/examples/advanced/CaTS/include/CalorimeterSD.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file CalorimeterSD.hh +/// \brief Definition of the CaTS::CalorimeterSD class + +#pragma once + +#include "G4VSensitiveDetector.hh" +#include "CalorimeterHit.hh" +class G4Step; +class G4HCofThisEvent; + +class CalorimeterSD : public G4VSensitiveDetector +{ + public: + CalorimeterSD(G4String); + ~CalorimeterSD() = default; + void Initialize(G4HCofThisEvent*) final; + G4bool ProcessHits(G4Step*, G4TouchableHistory*) final; + void EndOfEvent(G4HCofThisEvent* hitCollection) final; + + private: + CalorimeterHitsCollection* fCalorimeterHitsCollection{ nullptr }; + G4int fHCID{ 0 }; + G4bool verbose{ false }; +}; diff --git a/environments/g4py/tests/g4pytest/ezgeom/EzDetectorConstruction.cc b/examples/advanced/CaTS/include/ColorReader.hh similarity index 62% rename from environments/g4py/tests/g4pytest/ezgeom/EzDetectorConstruction.cc rename to examples/advanced/CaTS/include/ColorReader.hh index 90ae9a1f44..eb2696bdc6 100644 --- a/environments/g4py/tests/g4pytest/ezgeom/EzDetectorConstruction.cc +++ b/examples/advanced/CaTS/include/ColorReader.hh @@ -23,36 +23,46 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// EzDetectorConstruction.cc + +// ******************************************************************** // -// 2005 Q -// ==================================================================== -#include "EzDetectorConstruction.hh" -#include "G4EzWorld.hh" - -// ==================================================================== +// CaTS (Calorimetry and Tracking Simulation) // -// class description +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) // -// ==================================================================== +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file ColorReader.hh +/// \brief Definition of the CaTS::ColorReader class -//////////////////////////////////////////////// -EzDetectorConstruction::EzDetectorConstruction() -//////////////////////////////////////////////// +#pragma once + +#include +#include "G4GDMLReadStructure.hh" +#include +namespace xercesc_3_2 { + class DOMElement; } +class G4VisAttributes; -///////////////////////////////////////////////// -EzDetectorConstruction::~EzDetectorConstruction() -///////////////////////////////////////////////// +class ColorReader : public G4GDMLReadStructure { -} + public: + ColorReader(); + ~ColorReader(); + void ExtensionRead(const xercesc::DOMElement* const element); + void ColorRead(const xercesc::DOMElement* const element); + G4VisAttributes* GetVisAttribute(const G4String& ref); -////////////////////////////////////////////////////// -G4VPhysicalVolume* EzDetectorConstruction::Construct() -////////////////////////////////////////////////////// -{ - return G4EzWorld::GetWorldVolume(); -} + protected: + virtual void VolumeRead(const xercesc::DOMElement* const); + private: + std::map fAttribs; +}; diff --git a/examples/advanced/CaTS/include/ConfigurationManager.hh b/examples/advanced/CaTS/include/ConfigurationManager.hh new file mode 100644 index 0000000000..a3e7a48335 --- /dev/null +++ b/examples/advanced/CaTS/include/ConfigurationManager.hh @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file ConfigurationManager.hh +/// \brief Definition of the CaTS::ConfigurationManager class + +#pragma once + +#include +#include "G4String.hh" +class G4GenericMessenger; + +class ConfigurationManager +{ + private: + static ConfigurationManager* fginstance; + static std::once_flag fginitInstanceFlag; +#ifdef WITH_ROOT + G4bool fdoAnalysis{ false }; // variable determines if we are doing analysis + G4String fHistoFileName{ + "histograms.root" + }; // File name for histos and ntuples + G4bool fwriteHits{ + false + }; // variable determines if hits are written out into Root File + G4String fname{ "Hits" }; // full File name for root io +#endif + G4bool fenable_opticks{ true }; // use opticks if available + unsigned int fMaxPhotons{ 1000000 }; + G4bool fenable_verbose{ false }; // switch on/off diagnostic printouts + G4bool fdumpgdml{ false }; // write out Detector to gdml file + G4String fGDMLFileName{ "dump.gdml_G4" }; + ConfigurationManager(); + + public: + ~ConfigurationManager(); + /// Define UI commands: choice of primary generators + void DefineCommands(); + /// Pointer to the messenger for UI commands + G4GenericMessenger* fMessenger = nullptr; + static ConfigurationManager* getInstance() + { + std::call_once(fginitInstanceFlag, + ConfigurationManager::initConfigurationManager); + return fginstance; + } + static void initConfigurationManager() + { + fginstance = new ConfigurationManager(); + } +#ifdef WITH_ROOT + inline G4String getHistoFileName() const { return fHistoFileName; } + inline G4bool isWriteHits() const { return fwriteHits; } + inline G4bool isdoAnalysis() const { return fdoAnalysis; } + inline void setfname(G4String name) { fname = name; } + inline G4String getfname() const { return fname; } +#endif + inline G4bool isEnable_opticks() const { return fenable_opticks; }; + inline unsigned int getMaxPhotons() const { return fMaxPhotons; } + inline G4bool isEnable_verbose() const { return fenable_verbose; }; + inline G4String getGDMLFileName() const { return fGDMLFileName; } + inline void setGDMLFileName(G4String GDMLFileName) + { + fGDMLFileName = GDMLFileName; + } + inline G4bool isDumpgdml() const { return fdumpgdml; } + void Print(); +}; diff --git a/examples/advanced/CaTS/include/DRCalorimeterHit.hh b/examples/advanced/CaTS/include/DRCalorimeterHit.hh new file mode 100644 index 0000000000..d1812c475a --- /dev/null +++ b/examples/advanced/CaTS/include/DRCalorimeterHit.hh @@ -0,0 +1,109 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file DRCalorimeterHit.hh +/// \brief Definition of the CaTS::DRCalorimeterHit class + +#pragma once + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" + +class DRCalorimeterHit : public G4VHit +{ + public: + DRCalorimeterHit(); + ~DRCalorimeterHit() = default; + DRCalorimeterHit(const DRCalorimeterHit&); + const DRCalorimeterHit& operator=(const DRCalorimeterHit&); + G4bool operator==(const DRCalorimeterHit&) const; + inline void* operator new(size_t); + inline void operator delete(void*); + void Draw() final; + inline void Print() final + { + G4cout << "DRCalorimeterHit id: " << fid << " Edep: " << fEdep + << " em_Edep: " << fem_Edep << " NCeren: " << fNceren + << " X: " << fposition.getX() << " Y: " << fposition.getY() + << " Z: " << fposition.getZ() << G4endl; + } + + DRCalorimeterHit(unsigned int i, G4double e, G4double em, unsigned int nc, + G4double t, G4ThreeVector p); + inline void SetPosition(G4ThreeVector position) { fposition = position; }; + inline G4ThreeVector GetPosition() const { return fposition; }; + inline void SetTime(G4double time) { ftime = time; }; + inline G4double GetTime() const { return ftime; }; + inline void SetId(unsigned int id) { fid = id; }; + inline unsigned int GetId() const { return fid; }; + inline void SetEdep(G4double Edep) { fEdep = Edep; }; + inline G4double GetEdep() const { return fEdep; }; + inline void SetNceren(unsigned int Nceren) { fNceren = Nceren; }; + inline unsigned int GetNceren() const { return fNceren; }; + inline void SetEm_Edep(G4double em_Edep) { fem_Edep = em_Edep; }; + inline G4double GetEm_Edep() const { return fem_Edep; }; + + private: + unsigned int fid{ 0 }; + G4double fEdep{ 0 }; + G4double fem_Edep{ 0 }; + unsigned int fNceren{ 0 }; + G4double ftime{ 0 }; + G4ThreeVector fposition{ 0, 0, 0 }; +}; + +using DRCalorimeterHitsCollection = G4THitsCollection; +extern G4ThreadLocal G4Allocator* DRCalorimeterHitAllocator; + +inline void* DRCalorimeterHit::operator new(size_t) +{ + if(!DRCalorimeterHitAllocator) + { + DRCalorimeterHitAllocator = new G4Allocator; + } + return (void*) DRCalorimeterHitAllocator->MallocSingle(); +} + +inline void DRCalorimeterHit::operator delete(void* aHit) +{ + DRCalorimeterHitAllocator->FreeSingle((DRCalorimeterHit*) aHit); +} diff --git a/examples/advanced/CaTS/include/DRCalorimeterSD.hh b/examples/advanced/CaTS/include/DRCalorimeterSD.hh new file mode 100644 index 0000000000..53e9a3a14b --- /dev/null +++ b/examples/advanced/CaTS/include/DRCalorimeterSD.hh @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file DRCalorimeterSD.hh +/// \brief Definition of the CaTS::DRCalorimeterSD class + +#pragma once + +#include "G4VSensitiveDetector.hh" +#include "DRCalorimeterHit.hh" +#include +#include +class G4Step; +class G4HCofThisEvent; +class G4TouchableHistory; + +class DRCalorimeterSD : public G4VSensitiveDetector +{ + public: + DRCalorimeterSD(G4String); + ~DRCalorimeterSD(); + void Initialize(G4HCofThisEvent*) final; + G4bool ProcessHits(G4Step*, G4TouchableHistory*) final; + void EndOfEvent(G4HCofThisEvent* hitCollection) final; + + private: + DRCalorimeterHitsCollection* fDRCalorimeterHitsCollection; + G4int fHCID{ 0 }; + G4bool verbose{ false }; +}; diff --git a/examples/advanced/CaTS/include/DetectorConstruction.hh b/examples/advanced/CaTS/include/DetectorConstruction.hh new file mode 100644 index 0000000000..776a876014 --- /dev/null +++ b/examples/advanced/CaTS/include/DetectorConstruction.hh @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file DetectorConstruction.hh +/// \brief Definition of the CaTS::DetectorConstruction class + +#pragma once + +#include "G4VUserDetectorConstruction.hh" +#include +class G4VPhysicalVolume; +class ColorReader; +class G4GDMLParser; + +class DetectorConstruction : public G4VUserDetectorConstruction +{ + public: + DetectorConstruction(G4String fname); + ~DetectorConstruction() final; + DetectorConstruction& operator=(const DetectorConstruction& right) = delete; + DetectorConstruction(const DetectorConstruction&) = delete; + void ReadGDML(); + G4VPhysicalVolume* Construct() final; + void ConstructSDandField() final; + void UpdateGeometry(); + + private: + G4String gdmlFile; + G4GDMLParser* parser{ nullptr }; + ColorReader* fReader{ nullptr }; + G4bool verbose{ false }; +}; diff --git a/examples/advanced/CaTS/include/Event.hh b/examples/advanced/CaTS/include/Event.hh new file mode 100644 index 0000000000..d46e43886b --- /dev/null +++ b/examples/advanced/CaTS/include/Event.hh @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file Event.hh +/// \brief Definition of the CaTS::Event class + +#pragma once + +#include +#include +#include +#include "G4Types.hh" +class G4VHit; + +class Event +{ + public: + Event() = default; + virtual ~Event() = default; + inline void SetEventNr(G4int i) { fEvtNum = i; } + inline G4int GetEventNumber() const { return fEvtNum; } + inline std::map>* GetHCMap() { return &hcmap; } + void Reset(); + + private: + G4int fEvtNum{ 0 }; + std::map> hcmap; // map of Hit Collections +}; diff --git a/environments/g4py/tests/gtest01/module/QEventAction.hh b/examples/advanced/CaTS/include/EventAction.hh similarity index 64% rename from environments/g4py/tests/gtest01/module/QEventAction.hh rename to examples/advanced/CaTS/include/EventAction.hh index 51359111c9..2d7e9409f5 100644 --- a/environments/g4py/tests/gtest01/module/QEventAction.hh +++ b/examples/advanced/CaTS/include/EventAction.hh @@ -23,30 +23,41 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// QEventAction.hh // -// 2005 Q -// ==================================================================== -#ifndef Q_EVENT_ACTION_H -#define Q_EVENT_ACTION_H +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file EventAction.hh +/// \brief Definition of the CaTS::EventAction class + +#pragma once + +#include +#include #include "G4UserEventAction.hh" +class G4Event; -// ==================================================================== -// -// class definition -// -// ==================================================================== - -class QEventAction : public G4UserEventAction { -public: - QEventAction(); - ~QEventAction(); - - virtual void BeginOfEventAction(const G4Event* aevent); - virtual void EndOfEventAction(const G4Event* aevent); +class EventAction : public G4UserEventAction +{ + public: + EventAction(); + ~EventAction() = default; + void BeginOfEventAction(const G4Event* anEvent) final; + void EndOfEventAction(const G4Event* anEvent) final; + private: + std::vector& split(const std::string& s, char delim, + std::vector& elems); + std::vector split(const std::string& s, char delim); }; - -#endif diff --git a/examples/advanced/CaTS/include/InteractionHit.hh b/examples/advanced/CaTS/include/InteractionHit.hh new file mode 100644 index 0000000000..c9de21ce75 --- /dev/null +++ b/examples/advanced/CaTS/include/InteractionHit.hh @@ -0,0 +1,97 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file InteractionHit.hh +/// \brief Definition of the CaTS::InteractionHit class + +#pragma once + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" + +class InteractionHit : public G4VHit +{ + private: + G4String fpname{ "" }; // name of secondary particle + G4double fpmom{ 0 }; // momentum of secondary particle + G4double fEkin{ 0 }; // kinetic energy of secondary particle + G4double ftheta{ 0 }; // theta of secondary particle + public: + InteractionHit(); + InteractionHit(G4String n, G4double m, G4double e, G4double t); + ~InteractionHit() = default; + InteractionHit(const InteractionHit&); + const InteractionHit& operator=(const InteractionHit&); + G4int operator==(const InteractionHit&) const; + inline void* operator new(size_t); + inline void operator delete(void*); + inline void Print() final + { + G4cout << "InteractionHit pname : " << fpname + << " momentum [GeV]: " << fpmom << " kinetic Energy [GeV]" << fEkin + << " theta: " << ftheta << G4endl; + } + inline void SetPname(G4String de) { fpname = de; }; + inline void SetPmom(G4double de) { fpmom = de; }; + inline void SetEkin(G4double de) { fEkin = de; }; + inline void SetTheta(G4double de) { ftheta = de; }; + inline G4String GetPname() { return fpname; }; + inline G4double GetPmom() { return fpmom; }; + inline G4double GetEkin() { return fEkin; }; + inline G4double GetTheta() { return ftheta; }; +}; + +using InteractionHitsCollection = G4THitsCollection; +extern G4ThreadLocal G4Allocator* InteractionHitAllocator; + +inline void* InteractionHit::operator new(size_t) +{ + if(!InteractionHitAllocator) + { + InteractionHitAllocator = new G4Allocator; + } + return (void*) InteractionHitAllocator->MallocSingle(); +} + +inline void InteractionHit::operator delete(void* aHit) +{ + InteractionHitAllocator->FreeSingle((InteractionHit*) aHit); +} diff --git a/examples/advanced/CaTS/include/InteractionSD.hh b/examples/advanced/CaTS/include/InteractionSD.hh new file mode 100644 index 0000000000..e83b482712 --- /dev/null +++ b/examples/advanced/CaTS/include/InteractionSD.hh @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file InteractionSD.hh +/// \brief Definition of the CaTS::InteractionSD class + +#pragma once + +#include +#include +#include "G4VSensitiveDetector.hh" +#include "InteractionHit.hh" +class G4HCofThisEvent; +class G4Step; +class G4TouchableHistory; +class ParticleChange; + +class InteractionSD : public G4VSensitiveDetector +{ + public: + InteractionSD(G4String); + ~InteractionSD(); + void Initialize(G4HCofThisEvent*); + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + private: + G4int fHCID; + ParticleChange* fFirstInter; + ParticleChange* fOtherInter; + InteractionHitsCollection* fInteractionHitsCollection; +}; diff --git a/examples/advanced/CaTS/include/MscHit.hh b/examples/advanced/CaTS/include/MscHit.hh new file mode 100644 index 0000000000..e317efd284 --- /dev/null +++ b/examples/advanced/CaTS/include/MscHit.hh @@ -0,0 +1,98 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file MscHit.hh +/// \brief Definition of the CaTS::MscHit class + +#pragma once + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" +#include +#include +#include +#include + +class MscHit : public G4VHit +{ + public: + MscHit(); + ~MscHit() = default; + MscHit(const MscHit&); + const MscHit& operator=(const MscHit&); + G4bool operator==(const MscHit&) const; + inline void* operator new(size_t); + inline void operator delete(void*); + void Draw() final; + inline void Print() final + { + G4cout << "MscHit KinE: " << fkinE << " Px: " << fmomentum.getX() + << " Py: " << fmomentum.getY() << " Pz: " << fmomentum.getZ() + << G4endl; + } + MscHit(G4double kinE, G4ThreeVector momentum); + inline void SetKinE(G4double kinE) { fkinE = kinE; }; + inline G4double GetKinE() const { return fkinE; }; + inline void SetMomentum(G4ThreeVector momentum) { fmomentum = momentum; }; + inline G4ThreeVector GetMomentum() const { return fmomentum; }; + + private: + G4double fkinE{ 0 }; + G4ThreeVector fmomentum{ 0, 0, 0 }; +}; + +using MscHitsCollection = G4THitsCollection; +extern G4ThreadLocal G4Allocator* MscHitAllocator; + +inline void* MscHit::operator new(size_t) +{ + if(!MscHitAllocator) + { + MscHitAllocator = new G4Allocator; + } + return (void*) MscHitAllocator->MallocSingle(); +} + +inline void MscHit::operator delete(void* aHit) +{ + MscHitAllocator->FreeSingle((MscHit*) aHit); +} diff --git a/examples/advanced/CaTS/include/MscSD.hh b/examples/advanced/CaTS/include/MscSD.hh new file mode 100644 index 0000000000..9ac4e1c22b --- /dev/null +++ b/examples/advanced/CaTS/include/MscSD.hh @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file MscSD.hh +/// \brief Definition of the CaTS::MscSD class + +#pragma once + +#include +#include +#include "G4VSensitiveDetector.hh" +#include "MscHit.hh" +class G4HCofThisEvent; +class G4Step; +class G4TouchableHistory; + +class MscSD : public G4VSensitiveDetector +{ + public: + MscSD(G4String); + ~MscSD() = default; + void Initialize(G4HCofThisEvent*) final; + G4bool ProcessHits(G4Step*, G4TouchableHistory*) final; + void EndOfEvent(G4HCofThisEvent* hitCollection) final; + + private: + MscHitsCollection* fMscHitsCollection{ nullptr }; + G4int fHCID{ 0 }; + G4bool verbose{ false }; + G4bool done{ false }; +}; diff --git a/environments/g4py/tests/gtest01/module/Particles.hh b/examples/advanced/CaTS/include/ParticleChange.hh similarity index 67% rename from environments/g4py/tests/gtest01/module/Particles.hh rename to examples/advanced/CaTS/include/ParticleChange.hh index 23546113c8..eba7ee26cd 100644 --- a/environments/g4py/tests/gtest01/module/Particles.hh +++ b/examples/advanced/CaTS/include/ParticleChange.hh @@ -23,31 +23,41 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// Particles.hh // -// 2004 Q -// ==================================================================== -#ifndef PARTICLES_H -#define PARTICLES_H -#include "G4VPhysicsConstructor.hh" - -// ==================================================================== +// ******************************************************************** // -// class definition +// CaTS (Calorimetry and Tracking Simulation) // -// ==================================================================== +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file ParticleChange.hh +/// \brief Definition of the CaTS::ParticleChange class -class Particles : public G4VPhysicsConstructor { +#pragma once -public: - Particles(); - ~Particles(); +#include "G4VParticleChange.hh" - virtual void ConstructParticle(); - virtual void ConstructProcess(); +class ParticleChange : public G4VParticleChange +{ + public: + ParticleChange() + : fIsFirstInter(false) + {} + ParticleChange(G4bool isFirst) + : fIsFirstInter(isFirst) + {} + virtual ~ParticleChange() {} + + G4bool IsFisrtInteraction() const { return fIsFirstInter; } + + private: + G4bool fIsFirstInter; }; - -#endif - diff --git a/examples/advanced/CaTS/include/PhotonHit.hh b/examples/advanced/CaTS/include/PhotonHit.hh new file mode 100644 index 0000000000..acd7ab6675 --- /dev/null +++ b/examples/advanced/CaTS/include/PhotonHit.hh @@ -0,0 +1,122 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file PhotonHit.hh +/// \brief Definition of the CaTS::PhotonHit class + +#pragma once + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" + +class PhotonHit : public G4VHit +{ + public: + PhotonHit(); + ~PhotonHit() = default; + PhotonHit(const PhotonHit&); + const PhotonHit& operator=(const PhotonHit&); + G4bool operator==(const PhotonHit&) const; + inline void* operator new(size_t); + inline void operator delete(void*); + void Draw() final; + + inline void Print() final + { + G4cout << "PhotonHit id: " << fid << " pid: " << fpid + << " wavelength: " << fwavelength << " time: " << ftime + << " position X: " << fposition.getX() << " Y: " << fposition.getY() + << " Z: " << fposition.getZ() + << " direction X: " << fdirection.getX() + << " Y: " << fdirection.getY() << " Z: " << fdirection.getZ() + << " polarization: X:" << fpolarization.getX() + << " Y: " << fpolarization.getY() << " Z: " << fpolarization.getZ() + << G4endl; + } + + PhotonHit(unsigned id, unsigned pid, G4double wavelength, G4double time, + G4ThreeVector position, G4ThreeVector direction, + G4ThreeVector polarization); + inline void SetWavelength(G4double wavelength) { fwavelength = wavelength; } + inline G4double GetWavelength() { return fwavelength; } + inline void SetPolarization(G4ThreeVector polarization) + { + fpolarization = polarization; + } + inline G4ThreeVector GetPolarization() const { return fpolarization; } + inline void SetDirection(G4ThreeVector direction) { fdirection = direction; } + inline G4ThreeVector GetDirection() const { return fdirection; } + inline void SetPosition(G4ThreeVector position) { fposition = position; } + inline G4ThreeVector GetPosition() const { return fposition; } + inline void SetTime(G4double time) { ftime = time; } + inline G4double GetTime() const { return ftime; } + inline void SetPid(unsigned pid) { fpid = pid; } + inline unsigned GetPid() const { return fpid; } + inline void SetId(unsigned id) { fid = id; } + inline unsigned GetId() const { return fid; } + + private: + unsigned int fid{ 0 }; + unsigned int fpid{ 0 }; + G4double fwavelength{ 0 }; + G4double ftime{ 0 }; + G4ThreeVector fposition{ 0, 0, 0 }; + G4ThreeVector fdirection{ 0, 0, 0 }; + G4ThreeVector fpolarization{ 0, 0, 0 }; +}; + +using PhotonHitsCollection = G4THitsCollection; +extern G4ThreadLocal G4Allocator* PhotonHitAllocator; + +inline void* PhotonHit::operator new(size_t) +{ + if(!PhotonHitAllocator) + { + PhotonHitAllocator = new G4Allocator; + } + return (void*) PhotonHitAllocator->MallocSingle(); +} + +inline void PhotonHit::operator delete(void* aHit) +{ + PhotonHitAllocator->FreeSingle((PhotonHit*) aHit); +} diff --git a/examples/advanced/CaTS/include/PhotonSD.hh b/examples/advanced/CaTS/include/PhotonSD.hh new file mode 100644 index 0000000000..7103623b9b --- /dev/null +++ b/examples/advanced/CaTS/include/PhotonSD.hh @@ -0,0 +1,80 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file PhotonSD.hh +/// \brief Definition of the CaTS::PhotonSD class + +#pragma once + +#include "G4VSensitiveDetector.hh" +#include "G4PhysicalConstants.hh" +#include "PhotonHit.hh" +#include +#include +class G4Step; +class G4HCofThisEvent; +class G4TouchableHistory; + +class PhotonSD : public G4VSensitiveDetector +{ + public: + PhotonSD(G4String); + ~PhotonSD() = default; + void Initialize(G4HCofThisEvent*) final; + G4bool ProcessHits(G4Step*, G4TouchableHistory*) final; +#ifdef WITH_G4OPTICKS + void AddOpticksHits(); +#endif + void EndOfEvent(G4HCofThisEvent* hitCollection) final; + + private: + PhotonHitsCollection* fPhotonHitsCollection{ 0 }; + G4int fHCID{ 0 }; + static constexpr G4double hc = (h_Planck * c_light) / (CLHEP::eV * CLHEP::nm); + G4bool verbose{ false }; + inline G4double etolambda(G4double E) + { + // input photon energy in eV + // return wavelength in nm: + // lambda = h c/e + // + return hc / E; + } +}; diff --git a/environments/g4py/tests/g4pytest/EMSTDpl/PhysicsListEMstd.hh b/examples/advanced/CaTS/include/PhysicsConfigurator.hh similarity index 68% rename from environments/g4py/tests/g4pytest/EMSTDpl/PhysicsListEMstd.hh rename to examples/advanced/CaTS/include/PhysicsConfigurator.hh index a53d62ce96..9b0beefebe 100644 --- a/environments/g4py/tests/g4pytest/EMSTDpl/PhysicsListEMstd.hh +++ b/examples/advanced/CaTS/include/PhysicsConfigurator.hh @@ -23,34 +23,37 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// PhysicsListEMstd.hh // -// Physics list for electron/positron/gamma -// EM-standard package + +// ******************************************************************** // -// 2006 Q -// ==================================================================== -#ifndef PHYSICS_LIST_EMSTD_H -#define PHYSICS_LIST_EMSTD_H - -#include "G4VUserPhysicsList.hh" - -// ==================================================================== +// CaTS (Calorimetry and Tracking Simulation) // -// class definition +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) // -// ==================================================================== +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file PhysicsConfigurator.hh +/// \brief Definition of the CaTS::PhysicsConfigurator class -class PhysicsListEMstd: public G4VUserPhysicsList { -public: - PhysicsListEMstd(); - ~PhysicsListEMstd(); +#pragma once - virtual void ConstructParticle(); - virtual void ConstructProcess(); - virtual void SetCuts(); +class G4String; +class G4VModularPhysicsList; +class PhysicsConfigurator +{ + private: + static PhysicsConfigurator* instance; + + public: + PhysicsConfigurator() = default; + G4VModularPhysicsList* Construct(G4String physName); + ~PhysicsConfigurator() = default; + static PhysicsConfigurator* getInstance(); }; - -#endif diff --git a/examples/advanced/CaTS/include/PrimaryGeneratorAction.hh b/examples/advanced/CaTS/include/PrimaryGeneratorAction.hh new file mode 100644 index 0000000000..f2114de20a --- /dev/null +++ b/examples/advanced/CaTS/include/PrimaryGeneratorAction.hh @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the CaTS::PrimaryGeneratorAction class + +#pragma once + +#include "G4VUserPrimaryGeneratorAction.hh" +#include +#include +#include +#include +class G4GenericMessenger; +class G4VPrimaryGenerator; +class G4Event; + +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ + public: + PrimaryGeneratorAction(); + virtual ~PrimaryGeneratorAction(); + void GeneratePrimaries(G4Event*) final; + inline void SetGenerator(G4String genname) + { + std::map::iterator pos = + gentypeMap.find(genname); + if(pos != gentypeMap.end()) + { + fcurrentGenerator = pos->second; + fcurrentGeneratorName = genname; + } + else + { + G4cout << "Primary Generator: " << genname << " is not a valid Option" + << G4endl; + G4cout << "Valid Options are: "; +#if(G4VERSION_NUMBER > 1072) + for(auto [genType, generator] : gentypeMap) + { + G4cout << genType << " "; + } + G4cout << G4endl; +#else + for(std::map::iterator ii = + gentypeMap.begin(); + ii != gentypeMap.end(); ++ii) + { + G4cout << (*ii).first << " "; + } + G4cout << G4endl; +#endif + } + } + inline G4VPrimaryGenerator* GetGenerator() const { return fcurrentGenerator; } + inline G4String GetGeneratorName() const { return fcurrentGeneratorName; } + inline void Print() + { + G4cout << "===================================================" << G4endl; + G4cout << " Primary Generator: " << fcurrentGeneratorName << G4endl; + G4cout << "===================================================" << G4endl; + } + + private: + /// Define UI commands: choice of primary generators + void DefineCommands(); + G4VPrimaryGenerator* fcurrentGenerator = nullptr; + G4String fcurrentGeneratorName{ "particleGun" }; + PrimaryGeneratorAction& operator=(const PrimaryGeneratorAction& right); + PrimaryGeneratorAction(const PrimaryGeneratorAction&); + std::map gentypeMap; + /// Pointer to the messenger for UI commands + G4GenericMessenger* fMessenger = nullptr; +}; diff --git a/examples/advanced/CaTS/include/RadiatorSD.hh b/examples/advanced/CaTS/include/RadiatorSD.hh new file mode 100644 index 0000000000..9e45047c95 --- /dev/null +++ b/examples/advanced/CaTS/include/RadiatorSD.hh @@ -0,0 +1,112 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file RadiatorSD.hh +/// \brief Definition of the CaTS::RadiatorSD class + +#pragma once + +#include "G4VSensitiveDetector.hh" +#include "G4ScintillationTrackInformation.hh" +#include +#include +#include +class G4Step; +class G4Material; +class G4HCofThisEvent; +class G4MaterialPropertiesTable; +class G4PhysicsOrderedFreeVector; +class G4PhysicsTable; +class G4TouchableHistory; + +class RadiatorSD : public G4VSensitiveDetector +{ + public: + RadiatorSD(G4String name); + virtual ~RadiatorSD() = default; + // methods from base class + void Initialize(G4HCofThisEvent* hitCollection) final; + G4bool ProcessHits(G4Step* step, G4TouchableHistory* history) final; + void EndOfEvent(G4HCofThisEvent* hitCollection) final; + + private: + const G4Material* aMaterial; + G4MaterialPropertiesTable* aMaterialPropertiesTable; + // + // properties related to Scintillation + // + G4MaterialPropertyVector* Fast_Intensity; + G4MaterialPropertyVector* Slow_Intensity; + G4double YieldRatio; // slowerRatio, + G4double FastTimeConstant; // TimeConstant, + G4double SlowTimeConstant; // slowerTimeConstant, + G4ScintillationType ScintillationType; + // + // properties related to Cerenkov + // + G4MaterialPropertyVector* Rindex; + G4PhysicsOrderedFreeVector* CerenkovAngleIntegrals; + const G4PhysicsTable* thePhysicsTable; + G4double Pmin{ 0 }; + G4double Pmax{ 0 }; + G4double dp{ 0 }; + G4double nMax{ 0 }; + G4bool first{ true }; + G4bool verbose{ false }; + G4int tCphotons{ 0 }; + G4int tSphotons{ 0 }; +#ifdef WITH_G4OPTICKS + // + // info needed for generating Cerenkov photons on the GPU; + // + G4double maxCos{ 0.0 }; + G4double maxSin2{ 0.0 }; + G4double beta{ 0.0 }; + G4double beta1{ 0.0 }; + G4double beta2{ 0.0 }; + G4double BetaInverse{ 0.0 }; + G4double MeanNumberOfPhotons1{ 0.0 }; + G4double MeanNumberOfPhotons2{ 0.0 }; + G4int Sphotons{ 0 }; // number of scintillation photons this step + G4int Cphotons{ 0 }; // number of Cerenkov photons this step + const G4double ScintillationTime{ 0.0 }; + const G4int scntId{ 1 }; +#endif +}; diff --git a/environments/g4py/tests/g4pytest/ParticleGun/ParticleGunAction.hh b/examples/advanced/CaTS/include/RootIO.hh similarity index 61% rename from environments/g4py/tests/g4pytest/ParticleGun/ParticleGunAction.hh rename to examples/advanced/CaTS/include/RootIO.hh index 2b78f2d401..ff1d5cb8d3 100644 --- a/environments/g4py/tests/g4pytest/ParticleGun/ParticleGunAction.hh +++ b/examples/advanced/CaTS/include/RootIO.hh @@ -23,41 +23,54 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// ParticleGunAction.hh // -// 2005 Q -// ==================================================================== -#ifndef PARTICLE_GUN_ACTION_H -#define PARTICLE_GUN_ACTION_H -#include "G4VUserPrimaryGeneratorAction.hh" - -class G4ParticleGun; - -// ==================================================================== +// ******************************************************************** // -// class definition +// CaTS (Calorimetry and Tracking Simulation) // -// ==================================================================== -class ParticleGunAction : public G4VUserPrimaryGeneratorAction { -private: - // use G4 particle gun - G4ParticleGun* particleGun; +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file RootIO.hh +/// \brief Definition of the CaTS::RootIO class +#ifdef WITH_ROOT +#pragma once + +#include "RtypesCore.h" +#include +#include "G4ThreadLocalSingleton.hh" + +class TFile; +class TTree; +class TBranch; +class Event; + +class RootIO { + friend class G4ThreadLocalSingleton< RootIO >; public: - ParticleGunAction(); - ~ParticleGunAction(); + virtual ~RootIO()= default; + static RootIO* GetInstance(); + void Write(Event*); + void Close(); + void Merge(); +protected: + RootIO(); - G4ParticleGun* GetParticleGun() const; - - virtual void GeneratePrimaries(G4Event* anEvent); +private: + TFile* fFile{ nullptr }; + G4int fNevents{ 0 }; + TTree* ftree{ nullptr }; + TBranch* fevtbranch{ nullptr }; + Long64_t fnb{ 0 }; + G4bool fevtinitialized{ false }; + static G4ThreadLocal RootIO* fgInstance; }; - -// ==================================================================== -// inline functions -// ==================================================================== -inline G4ParticleGun* ParticleGunAction::GetParticleGun() const -{ return particleGun; } - -#endif +#endif /* WITH_ROOT */ diff --git a/examples/advanced/CaTS/include/RunAction.hh b/examples/advanced/CaTS/include/RunAction.hh new file mode 100644 index 0000000000..f994903fe4 --- /dev/null +++ b/examples/advanced/CaTS/include/RunAction.hh @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file RunAction.hh +/// \brief Definition of the CaTS::RunAction class + +#pragma once + +#include "G4UserRunAction.hh" +class G4Run; + +class RunAction : public G4UserRunAction +{ + private: + G4bool geo_initialized{ false }; + + public: + RunAction(); + void BeginOfRunAction(const G4Run* run) final; + void EndOfRunAction(const G4Run* run) final; +}; diff --git a/examples/advanced/CaTS/include/StackingAction.hh b/examples/advanced/CaTS/include/StackingAction.hh new file mode 100644 index 0000000000..27f14dd370 --- /dev/null +++ b/examples/advanced/CaTS/include/StackingAction.hh @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file StackingAction.hh +/// \brief Definition of the CaTS::StackingAction class + +#pragma once + +#include +#include +#include "G4UserStackingAction.hh" +class G4Track; +class G4GenericMessenger; + +class StackingAction : public G4UserStackingAction +{ + public: + StackingAction(); + ~StackingAction(); + G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track* aTrack) final; + void Print(); + + private: + /// Define UI commands: + void DefineCommands(); + G4bool fkillPi0{ false }; + G4bool fkilleta{ false }; + G4bool fkillGammafromnCapture{ false }; + /// Pointer to the messenger for UI commands + G4GenericMessenger* fMessenger = nullptr; +}; diff --git a/examples/advanced/gorad/include/GRAnalysis.hh b/examples/advanced/CaTS/include/TrackInfo.hh similarity index 78% rename from examples/advanced/gorad/include/GRAnalysis.hh rename to examples/advanced/CaTS/include/TrackInfo.hh index 1159ced7bc..71a957a07b 100644 --- a/examples/advanced/gorad/include/GRAnalysis.hh +++ b/examples/advanced/CaTS/include/TrackInfo.hh @@ -23,28 +23,33 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// Gorad (Geant4 Open-source Radiation Analysis and Design) -// -// Author : Makoto Asai (SLAC National Accelerator Laboratory) -// -// Development of Gorad is funded by NASA Johnson Space Center (JSC) -// under the contract NNJ15HK11B. // + // ******************************************************************** // -// GRAnalysis.hh -// Defining the file format of output histogram/n-tuple +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) // // History -// September 8th, 2020 : first implementation +// October 18th, 2021 : first implementation // // ******************************************************************** +// +/// \file TrackInfo.hh +/// \brief Definition of the CaTS::TrackInfo class -#ifndef GRAnalysis_h -#define GRAnalysis_h 1 +#pragma once -//#include "g4root.hh" -#include "g4csv.hh" -//#include "g4xml.hh" +#include "G4VUserTrackInformation.hh" -#endif +class TrackInfo : public G4VUserTrackInformation +{ + public: + TrackInfo(G4int photon_record_id_) + : photon_record_id(photon_record_id_) + {} + G4int photon_record_id{ 0 }; +}; diff --git a/examples/advanced/CaTS/include/TrackerHit.hh b/examples/advanced/CaTS/include/TrackerHit.hh new file mode 100644 index 0000000000..5d75830be4 --- /dev/null +++ b/examples/advanced/CaTS/include/TrackerHit.hh @@ -0,0 +1,100 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file TrackerHit.hh +/// \brief Definition of the CaTS::TrackerHit class + +#pragma once + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" + +class TrackerHit : public G4VHit +{ + public: + TrackerHit(); + ~TrackerHit() = default; + TrackerHit(const TrackerHit&); + const TrackerHit& operator=(const TrackerHit&); + G4bool operator==(const TrackerHit&) const; + inline void* operator new(size_t); + inline void operator delete(void*); + void Draw() final; + + inline void Print() final + { + G4cout << "TrackerHit id: " << fid << " Edep: " << fEdep + << " X: " << fposition.getX() << " Y: " << fposition.getY() + << " Z: " << fposition.getZ() << " time: " << ftime << G4endl; + } + + TrackerHit(G4double edep, G4ThreeVector position, G4double time); + inline void SetEdep(G4double Edep) { fEdep = Edep; } + inline G4double GetEdep() { return fEdep; } + inline void SetTime(G4double time) { ftime = time; } + inline G4double GetTime() const { return ftime; } + inline void SetPosition(G4ThreeVector position) { fposition = position; } + inline G4ThreeVector GetPosition() const { return fposition; } + + private: + G4int fid{ 0 }; + G4double fEdep{ 0 }; + G4ThreeVector fposition{ 0, 0, 0 }; + G4double ftime{ 0 }; +}; + +using TrackerHitsCollection = G4THitsCollection; +extern G4ThreadLocal G4Allocator* TrackerHitAllocator; + +inline void* TrackerHit::operator new(size_t) +{ + if(!TrackerHitAllocator) + { + TrackerHitAllocator = new G4Allocator; + } + return (void*) TrackerHitAllocator->MallocSingle(); +} + +inline void TrackerHit::operator delete(void* aHit) +{ + TrackerHitAllocator->FreeSingle((TrackerHit*) aHit); +} diff --git a/examples/advanced/CaTS/include/TrackerSD.hh b/examples/advanced/CaTS/include/TrackerSD.hh new file mode 100644 index 0000000000..ab7a83d620 --- /dev/null +++ b/examples/advanced/CaTS/include/TrackerSD.hh @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file TrackerSD.hh +/// \brief Definition of the CaTS::TrackerSD class + +#pragma once + +#include +#include +#include "G4VSensitiveDetector.hh" +#include "TrackerHit.hh" +class G4HCofThisEvent; +class G4Step; +class G4TouchableHistory; + +class TrackerSD : public G4VSensitiveDetector +{ + public: + TrackerSD(G4String); + ~TrackerSD() = default; + void Initialize(G4HCofThisEvent*) final; + G4bool ProcessHits(G4Step*, G4TouchableHistory*) final; + void EndOfEvent(G4HCofThisEvent* hitCollection) final; + + private: + TrackerHitsCollection* fTrackerHitsCollection{ nullptr }; + G4int fHCID{ 0 }; + G4bool verbose{ false }; +}; diff --git a/examples/advanced/CaTS/include/lArTPCHit.hh b/examples/advanced/CaTS/include/lArTPCHit.hh new file mode 100644 index 0000000000..9e3dc0bf54 --- /dev/null +++ b/examples/advanced/CaTS/include/lArTPCHit.hh @@ -0,0 +1,102 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file lArTPCHit.hh +/// \brief Definition of the CaTS::lArTPCHit class + +#pragma once + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4Types.hh" +#include "G4ios.hh" + +class lArTPCHit : public G4VHit +{ + public: + lArTPCHit(); + ~lArTPCHit() = default; + lArTPCHit(G4double fe, G4double fx, G4double fy, G4double fz); + lArTPCHit(const lArTPCHit&); + const lArTPCHit& operator=(const lArTPCHit&); + G4bool operator==(const lArTPCHit&) const; + inline void* operator new(size_t); + inline void operator delete(void*); + void Draw() final; + inline void Print() final + { + G4cout << "lArTPCHit Nr. of electrons: " << fElectrons + << " x position [mm]: " << fPosX << " y position [mm]: " << fPosY + << " z position [mm]: " << fPosZ << G4endl; + } + + void SetElectrons(G4double de) { fElectrons = de; }; + void SetPosX(G4double x) { fPosX = x; }; + void SetPosY(G4double y) { fPosY = y; }; + void SetPosZ(G4double z) { fPosZ = z; }; + G4double GetEdep() { return fElectrons; }; + G4double GetPosX() { return fPosX; }; + G4double GetPosY() { return fPosY; }; + G4double GetPosZ() { return fPosZ; }; + + private: + G4double fElectrons{ 0 }; + G4double fPosX{ 0 }; + G4double fPosY{ 0 }; + G4double fPosZ{ 0 }; +}; + +using lArTPCHitsCollection = G4THitsCollection; +extern G4ThreadLocal G4Allocator* lArTPCHitAllocator; + +inline void* lArTPCHit::operator new(size_t) +{ + if(!lArTPCHitAllocator) + { + lArTPCHitAllocator = new G4Allocator; + } + return (void*) lArTPCHitAllocator->MallocSingle(); +} + +inline void lArTPCHit::operator delete(void* aHit) +{ + lArTPCHitAllocator->FreeSingle((lArTPCHit*) aHit); +} diff --git a/examples/advanced/CaTS/include/lArTPCSD.hh b/examples/advanced/CaTS/include/lArTPCSD.hh new file mode 100644 index 0000000000..6b2f43d28b --- /dev/null +++ b/examples/advanced/CaTS/include/lArTPCSD.hh @@ -0,0 +1,99 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file lArTPCSD.hh +/// \brief Definition of the CaTS::lArTPCSD class + +#pragma once + +#include "lArTPCHit.hh" +#include "G4VSensitiveDetector.hh" +#include "G4ScintillationTrackInformation.hh" +#include +#include +#include +class G4Material; +class G4PhysicsTable; +class G4TouchableHistory; +class G4Step; +class G4HCofThisEvent; +class G4MaterialPropertiesTable; +class G4PhysicsOrderedFreeVector; + +class lArTPCSD : public G4VSensitiveDetector +{ + public: + lArTPCSD(G4String name); + virtual ~lArTPCSD() = default; + void Initialize(G4HCofThisEvent* hitCollection) final; + G4bool ProcessHits(G4Step* step, G4TouchableHistory* history) final; + void EndOfEvent(G4HCofThisEvent* hitCollection) final; + + private: + G4int materialIndex; + const G4Material* aMaterial; + G4MaterialPropertiesTable* aMaterialPropertiesTable; + // + // properties related to Scintillation + // + G4MaterialPropertyVector* Fast_Intensity{ nullptr }; + G4MaterialPropertyVector* Slow_Intensity{ nullptr }; + G4double YieldRatio{ 0 }; // slowerRatio, + G4double FastTimeConstant{ 0 }; // TimeConstant, + G4double SlowTimeConstant{ 0 }; // slowerTimeConstant, + G4ScintillationType ScintillationType; + // + // properties related to Cerenkov + // + G4MaterialPropertyVector* Rindex{ nullptr }; + G4PhysicsOrderedFreeVector* CerenkovAngleIntegrals{ nullptr }; + const G4PhysicsTable* thePhysicsTable{ 0 }; + G4double Pmin{ 0 }; + G4double Pmax{ 0 }; + G4double dp{ 0 }; + G4double nMax{ 0 }; + G4bool first{ false }; + G4bool verbose{ false }; + G4int tCphotons{ 0 }; + G4int tSphotons{ 0 }; + G4double NumElectrons(G4double e, G4double ds); + lArTPCHitsCollection* flArTPCHitsCollection{ nullptr }; + G4int fHCID{ 0 }; +}; diff --git a/examples/extended/analysis/AnaEx03/init_vis.mac b/examples/advanced/CaTS/macros/init_vis.mac similarity index 77% rename from examples/extended/analysis/AnaEx03/init_vis.mac rename to examples/advanced/CaTS/macros/init_vis.mac index 8e460329fb..772f82ee3a 100644 --- a/examples/extended/analysis/AnaEx03/init_vis.mac +++ b/examples/advanced/CaTS/macros/init_vis.mac @@ -1,4 +1,4 @@ -# Macro file for the initialization of example B1 +# Macro file for initialization # in interactive session # # Set some default verbose @@ -13,4 +13,4 @@ /run/initialize # # Visualization setting -/control/execute vis.mac +/control/execute vis.mac \ No newline at end of file diff --git a/examples/advanced/CaTS/macros/msc.mac b/examples/advanced/CaTS/macros/msc.mac new file mode 100644 index 0000000000..88d6b87ca4 --- /dev/null +++ b/examples/advanced/CaTS/macros/msc.mac @@ -0,0 +1,12 @@ +/CaTS/verbose false +/CaTS/dumpgdml true +/CaTS/writeHits true +/CaTS/fname Msc +/CaTS/enable_opticks false +/run/initialize +/CaTS/doAnalysis false +/gun/particle proton +/gun/energy 0.8 GeV +/gun/position 0. 0. -1. cm +/gun/direction 0. 0. 1. +/run/beamOn 100000 \ No newline at end of file diff --git a/examples/advanced/CaTS/macros/pip_IO_Calo.mac b/examples/advanced/CaTS/macros/pip_IO_Calo.mac new file mode 100644 index 0000000000..aaf3e2e706 --- /dev/null +++ b/examples/advanced/CaTS/macros/pip_IO_Calo.mac @@ -0,0 +1,16 @@ +/CaTS/verbose false +/process/had/verbose 0 +/run/initialize +# +/run/physicsModified +# +/run/initialize +/random/setSeeds 7 38 +/CaTS/fname CaloHits +/CaTS/writeHits true +/CaTS/enable_opticks false +/gun/particle pi+ +/gun/energy 10. GeV +/gun/position 0. 0. -200. mm +/gun/direction 0. 0. 1. +/run/beamOn 1000 \ No newline at end of file diff --git a/examples/advanced/CaTS/macros/pip_IO_DR.mac b/examples/advanced/CaTS/macros/pip_IO_DR.mac new file mode 100644 index 0000000000..7fc6eaaef5 --- /dev/null +++ b/examples/advanced/CaTS/macros/pip_IO_DR.mac @@ -0,0 +1,23 @@ +/CaTS/verbose false +/process/had/verbose 0 +/run/initialize +# +# +#/process/optical/scintillation/setStackPhotons false +#/process/optical/scintillation/verbose 0 +# +# the Cerenkov process is needed even when we run on GPU (to get the number of photons to be produced) but we don't put optical photons on the stack +# +# +/run/physicsModified +# +/run/initialize +/random/setSeeds 7 38 +/CaTS/fname DRCaloHits +/CaTS/writeHits true +/CaTS/enable_opticks false +/gun/particle pi+ +/gun/energy 10. GeV +/gun/position 0. 0. -200. mm +/gun/direction 0. 0. 1. +/run/beamOn 1000 \ No newline at end of file diff --git a/examples/advanced/CaTS/macros/test_G4.mac b/examples/advanced/CaTS/macros/test_G4.mac new file mode 100644 index 0000000000..21be58bedd --- /dev/null +++ b/examples/advanced/CaTS/macros/test_G4.mac @@ -0,0 +1,18 @@ +/CaTS/verbose false +/CaTS/dumpgdml false +/CaTS/writeHits true +/CaTS/fname Hits_G4_point +/process/optical/scintillation/setStackPhotons true +/process/optical/cerenkov/setStackPhotons true +/process/optical/rayleigh/verbose 0 +/process/optical/absorption/verbose 0 +/process/optical/boundary/verbose 0 +/run/initialize +/random/setSeeds 7 38 +/CaTS/enable_opticks false +/CaTS/doAnalysis false +/gun/particle e- +/gun/energy 2 MeV +/gun/position 0. 0. 0. cm +/gun/direction 0. 0. 1. +/run/beamOn 100 diff --git a/examples/advanced/CaTS/macros/time.mac b/examples/advanced/CaTS/macros/time.mac new file mode 100644 index 0000000000..233d3dfd3d --- /dev/null +++ b/examples/advanced/CaTS/macros/time.mac @@ -0,0 +1,25 @@ +/CaTS/verbose false +/CaTS/dumpgdml true +/CaTS/writeHits true +/CaTS/fname NewHits_point +/run/initialize +# +# the scintillation process is needed even when we run on GPU but we don't put optical photons on the stack +# +/process/optical/scintillation/setStackPhotons false +# +# the Cerenkov process is needed even when we run on GPU but we don't put optical photons on the stack +# +#/process/activate Cerenkov +/process/optical/cerenkov/setStackPhotons false +/process/optical/rayleigh/verbose 0 +/process/optical/absorption/verbose 0 +/process/optical/boundary/verbose 0 +/random/setSeeds 7 38 +/CaTS/enable_opticks true +/CaTS/doAnalysis false +/gun/particle e- +/gun/energy 2 GeV +/gun/position 0. 0. -105. cm +/gun/direction 0. 0. 1. +/run/beamOn 100 \ No newline at end of file diff --git a/examples/advanced/CaTS/macros/time_G4.mac b/examples/advanced/CaTS/macros/time_G4.mac new file mode 100644 index 0000000000..405902ca92 --- /dev/null +++ b/examples/advanced/CaTS/macros/time_G4.mac @@ -0,0 +1,19 @@ +/CaTS/verbose false +/CaTS/dumpgdml true +/CaTS/GDMLFileName dump.gdml +/CaTS/writeHits true +/CaTS/fname NewHits_G4_point +/process/optical/scintillation/setStackPhotons true +/process/optical/cerenkov/setStackPhotons true +/process/optical/rayleigh/verbose 0 +/process/optical/absorption/verbose 0 +/process/optical/boundary/verbose 0 +/run/initialize +/random/setSeeds 7 38 +/CaTS/enable_opticks false +/CaTS/doAnalysis false +/gun/particle e- +/gun/energy 2 GeV +/gun/position 0. 0. -105. cm +/gun/direction 0. 0. 1. +/run/beamOn 10 diff --git a/examples/advanced/CaTS/macros/vis.mac b/examples/advanced/CaTS/macros/vis.mac new file mode 100644 index 0000000000..04154705ec --- /dev/null +++ b/examples/advanced/CaTS/macros/vis.mac @@ -0,0 +1,82 @@ +# Macro file for the visualization setting in the initialization phase +# of the B1 example when running in interactive mode +# + +# Use these open statements to open selected visualization +# +# Use this open statement to create an OpenGL view: +/vis/open OGL 600x600-0+0 +# +# Use this open statement to create an OpenInventor view: +#/vis/open OIX +# +# Use this open statement to create a .prim file suitable for +# viewing in DAWN: +#/vis/open DAWNFILE +# +# Use this open statement to create a .heprep file suitable for +# viewing in HepRApp: +#/vis/open HepRepFile +# +# Use this open statement to create a .wrl file suitable for +# viewing in a VRML viewer: +#/vis/open VRML2FILE +# +# Disable auto refresh and quieten vis messages whilst scene and +# trajectories are established: +/vis/viewer/set/autoRefresh false +/vis/verbose errors +# +# Draw geometry: +/vis/drawVolume +# +# Specify view angle: +/vis/viewer/set/viewpointThetaPhi 90. 180. +# +# Specify zoom value: +#/vis/viewer/zoom 2. +# +# Specify style (surface, wireframe, auxiliary edges,...) +#/vis/viewer/set/style wireframe +/vis/viewer/set/auxiliaryEdge true +#/vis/viewer/set/lineSegmentsPerCircle 100 +# +# Draw coordinate axes: +#/vis/scene/add/axes 0 0 0 1 m +# +# Draw smooth trajectories at end of event, showing trajectory points +# as markers 2 pixels wide: +/vis/scene/add/trajectories smooth +/vis/modeling/trajectories/create/drawByCharge +/vis/modeling/trajectories/drawByCharge-0/default/setDrawStepPts true +/vis/modeling/trajectories/drawByCharge-0/default/setStepPtsSize 1 +# (if too many tracks cause core dump => /tracking/storeTrajectory 0) +# +# Draw hits at end of event: +#/vis/scene/add/hits +# +# To draw only gammas: +#/vis/filtering/trajectories/create/particleFilter +#/vis/filtering/trajectories/particleFilter-0/add gamma +# +# To invert the above, drawing all particles except gammas, +# keep the above two lines but also add: +#/vis/filtering/trajectories/particleFilter-0/invert true +# +# Many other options are available with /vis/modeling and /vis/filtering. +# For example, to select colour by particle ID: +#/vis/modeling/trajectories/create/drawByParticleID +#/vis/modeling/trajectories/drawByParticleID-0/default/setDrawStepPts true +# To select or override default colours (note: e+ is blue by default): +#/vis/modeling/trajectories/list +#/vis/modeling/trajectories/drawByParticleID-0/set e+ yellow +# +# To superimpose all of the events from a given run: +#/vis/scene/endOfEventAction accumulate +# +# Re-establish auto refreshing and verbosity: +/vis/viewer/set/autoRefresh true +/vis/verbose warnings +# +# For file-based drivers, use this to create an empty detector view: +#/vis/viewer/flush diff --git a/examples/advanced/CaTS/modules/CaTSCXXFlags.cmake b/examples/advanced/CaTS/modules/CaTSCXXFlags.cmake new file mode 100644 index 0000000000..0642931472 --- /dev/null +++ b/examples/advanced/CaTS/modules/CaTSCXXFlags.cmake @@ -0,0 +1,64 @@ + +# start from nothing, so repeated inclusion of this into CMake context doesnt repeat the flags +set(CMAKE_CXX_FLAGS) + +if(WIN32) + + # need to detect compiler not os? + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W4") # overall warning level 4 + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4996") # disable C4996: 'strdup': The POSIX name for this item is deprecated. + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOMINMAX") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_SCL_SECURE_NO_WARNINGS") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_USE_MATH_DEFINES") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_ITERATOR_DEBUG_LEVEL=0") + + +else(WIN32) + + ## c++11 forced by AsioZMQ : AsioZMQ not used here, but expect best to use same compiler options as far as possible + #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") ## huh nvcc compilation fails with this ??? + if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") + # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -stdlib=libc++") + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD_REQUIRED on) + else () + #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") + #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++0x") + # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11") #needed for numpyserver- on Linux ? + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD_REQUIRED on) + + endif () + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden") ## avoid boostrap visibility warning at link + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-show-option") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-function") + + if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-comment") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-shadow") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-private-field") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-shadow") + endif() + +endif(WIN32) + + +if(FLAGS_VERBOSE) + # https://cmake.org/Wiki/CMake_Useful_Variables + message(STATUS "OpticksCompilationFlags.cmake : CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}") + message(STATUS "OpticksCompilationFlags.cmake : CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}") + message(STATUS "OpticksCompilationFlags.cmake : CMAKE_CXX_FLAGS_DEBUG = ${CMAKE_CXX_FLAGS_DEBUG}") + message(STATUS "OpticksCompilationFlags.cmake : CMAKE_CXX_FLAGS_RELEASE = ${CMAKE_CXX_FLAGS_RELEASE}") + message(STATUS "OpticksCompilationFlags.cmake : CMAKE_CXX_FLAGS_RELWITHDEBINFO= ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + message(STATUS "OpticksCompilationFlags.cmake : CMAKE_CXX_STANDARD : ${CMAKE_CXX_STANDARD} " ) + message(STATUS "OpticksCompilationFlags.cmake : CMAKE_CXX_STANDARD_REQUIRED : ${CMAKE_CXX_STANDARD_REQUIRED} " ) +endif() + + + diff --git a/examples/advanced/CaTS/readCalorimeterHits.cc b/examples/advanced/CaTS/readCalorimeterHits.cc new file mode 100644 index 0000000000..363609ed63 --- /dev/null +++ b/examples/advanced/CaTS/readCalorimeterHits.cc @@ -0,0 +1,131 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +//--------------------------------------------------------------------- +//* |\___/| * +//* ) ( * +//* =\ /= * +//* )===( * +//* / \ CaTS: Calorimeter and Tracker Simulation * +//* | | is a flexible and extend-able framework * +//* / \ for the simulation of various detector * +//* \ / systems * +//* \__ _/ https://github.com/hanswenzel/CaTS * +//* ( ( * +//* ) ) * +//* (_( * +//* CaTS also serves as an example that demonstrates how to use * +//* opticks from within Geant4 for the creation and propagation of * +//* optical photons. * +//* see https://bitbucket.org/simoncblyth/opticks.git). * +//* Ascii Art by Joan Stark: https://www.asciiworld.com/-Cats-2-.html * +//--------------------------------------------------------------------- +// +/// \file readCalorimeterHits.cc +/// \brief example how to read the CaTS::CalorimeterHits +// +// Root headers +#include "TFile.h" +#include "TSystem.h" +#include "TTree.h" +#include "TH1.h" +// project headers +#include "Event.hh" +#include "CalorimeterHit.hh" + +int main(int argc, char** argv) +{ + // initialize ROOT + TSystem ts; + gSystem->Load("libCaTSClassesDict"); + if(argc < 3) + { + G4cout + << "Program requires 2 arguments: name of input file, name of output file" + << G4endl; + exit(1); + } + TFile* outfile = new TFile(argv[2], "RECREATE"); + TFile fo(argv[1]); + fo.GetListOfKeys()->Print(); + Event* event = new Event(); + TTree* Tevt = (TTree*) fo.Get("Events"); + Tevt->SetBranchAddress("event.", &event); + TBranch* fevtbranch = Tevt->GetBranch("event."); + Int_t nevent = fevtbranch->GetEntries(); + std::cout << " Nr. of Events: " << nevent << std::endl; + double max = 0.; + double min = 1000000; + std::string CollectionName = argv[3]; + CollectionName = CollectionName + "_Calorimeter_HC"; + for(Int_t i = 0; i < nevent; i++) + { + fevtbranch->GetEntry(i); + auto* hcmap = event->GetHCMap(); + for(const auto& ele : *hcmap) + { + if(ele.first.compare(CollectionName) == 0) + { + auto hits = ele.second; + G4int NbHits = hits.size(); + for(G4int ii = 0; ii < NbHits; ii++) + { + CalorimeterHit* drcaloHit = + dynamic_cast(hits.at(ii)); + const double ed = drcaloHit->GetEdep(); + if(ed > max) + max = ed; + if(ed < min) + min = ed; + } + } + } + } + outfile->cd(); + TH1F* hedep = + new TH1F("energy", "edep", 100, min - 0.1 * min, max + 0.1 * max); + for(Int_t i = 0; i < nevent; i++) + { + fevtbranch->GetEntry(i); + auto* hcmap = event->GetHCMap(); + for(const auto& ele : *hcmap) + { + if(ele.first.compare(CollectionName) == 0) + { + auto hits = ele.second; + G4int NbHits = hits.size(); + for(G4int ii = 0; ii < NbHits; ii++) + { + CalorimeterHit* drcaloHit = + dynamic_cast(hits.at(ii)); + hedep->Fill(drcaloHit->GetEdep()); + } + } + } + } + // hedep->Fit("gaus"); + outfile->Write(); +} diff --git a/examples/advanced/CaTS/readDRCalorimeterHits.cc b/examples/advanced/CaTS/readDRCalorimeterHits.cc new file mode 100644 index 0000000000..913a875701 --- /dev/null +++ b/examples/advanced/CaTS/readDRCalorimeterHits.cc @@ -0,0 +1,140 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +//--------------------------------------------------------------------- +//* |\___/| * +//* ) ( * +//* =\ /= * +//* )===( * +//* / \ CaTS: Calorimeter and Tracker Simulation * +//* | | is a flexible and extend-able framework * +//* / \ for the simulation of various detector * +//* \ / systems * +//* \__ _/ https://github.com/hanswenzel/CaTS * +//* ( ( * +//* ) ) * +//* (_( * +//* CaTS also serves as an example that demonstrates how to use * +//* opticks from within Geant4 for the creation and propagation of * +//* optical photons. * +//* see https://bitbucket.org/simoncblyth/opticks.git). * +//* Ascii Art by Joan Stark: https://www.asciiworld.com/-Cats-2-.html * +//--------------------------------------------------------------------- +// +/// \file readDRCalorimeterHits.cc +/// \brief example how to read the CaTS::DRCalorimeterHits +// +// Root headers +#include "TFile.h" +#include "TSystem.h" +#include "TTree.h" +#include "TH1.h" +// project headers +#include "Event.hh" +#include "DRCalorimeterHit.hh" + +int main(int argc, char** argv) +{ + // initialize ROOT + TSystem ts; + gSystem->Load("libCaTSClassesDict"); + if(argc < 4) + { + G4cout << "Program requires 3 arguments: name of input file, name of " + "output file, Volume that sensitive detector is attached to" + << G4endl; + exit(1); + } + TFile* outfile = new TFile(argv[2], "RECREATE"); + outfile->cd(); + TFile fo(argv[1]); + fo.GetListOfKeys()->Print(); + Event* event = new Event(); + TTree* Tevt = (TTree*) fo.Get("Events"); + Tevt->SetBranchAddress("event.", &event); + TBranch* fevtbranch = Tevt->GetBranch("event."); + Int_t nevent = fevtbranch->GetEntries(); + G4cout << " Nr. of Events: " << nevent << G4endl; + double max = 0.; + double min = 1000000; + double nmax = 0.; + double nmin = 1000000000; + std::string CollectionName = argv[3]; + CollectionName = CollectionName + "_DRCalorimeter_HC"; + for(Int_t i = 0; i < nevent; i++) + { + fevtbranch->GetEntry(i); + auto* hcmap = event->GetHCMap(); + for(const auto& ele : *hcmap) + { + if(ele.first.compare(CollectionName) == 0) + { + auto hits = ele.second; + G4int NbHits = hits.size(); + for(G4int ii = 0; ii < NbHits; ii++) + { + DRCalorimeterHit* drcaloHit = + dynamic_cast(hits.at(ii)); + const double ed = drcaloHit->GetEdep(); + if(ed > max) + max = ed; + if(ed < min) + min = ed; + const unsigned int nceren = drcaloHit->GetNceren(); + if(nceren > nmax) + nmax = nceren; + if(nceren < nmin) + nmin = nceren; + } + } + } + } + outfile->cd(); + TH1F* hedep = new TH1F("energy", "edep", 100, min, max); + TH1F* hnceren = new TH1F("nceren", "nceren", 100, nmin, nmax); + for(Int_t i = 0; i < nevent; i++) + { + fevtbranch->GetEntry(i); + auto* hcmap = event->GetHCMap(); + for(const auto& ele : *hcmap) + { + if(ele.first.compare(CollectionName) == 0) + { + auto hits = ele.second; + G4int NbHits = hits.size(); + for(G4int ii = 0; ii < NbHits; ii++) + { + DRCalorimeterHit* drcaloHit = + dynamic_cast(hits.at(ii)); + hedep->Fill(drcaloHit->GetEdep()); + hnceren->Fill(drcaloHit->GetNceren()); + } + } + } + } + // hedep->Fit("gaus"); + // hnceren->Fit("gaus"); + outfile->Write(); +} diff --git a/examples/advanced/CaTS/readMscHits.cc b/examples/advanced/CaTS/readMscHits.cc new file mode 100644 index 0000000000..9645cf9c57 --- /dev/null +++ b/examples/advanced/CaTS/readMscHits.cc @@ -0,0 +1,109 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +//--------------------------------------------------------------------- +//* |\___/| * +//* ) ( * +//* =\ /= * +//* )===( * +//* / \ CaTS: Calorimeter and Tracker Simulation * +//* | | is a flexible and extend-able framework * +//* / \ for the simulation of various detector * +//* \ / systems * +//* \__ _/ https://github.com/hanswenzel/CaTS * +//* ( ( * +//* ) ) * +//* (_( * +//* CaTS also serves as an example that demonstrates how to use * +//* opticks from within Geant4 for the creation and propagation of * +//* optical photons. * +//* see https://bitbucket.org/simoncblyth/opticks.git). * +//* Ascii Art by Joan Stark: https://www.asciiworld.com/-Cats-2-.html * +//--------------------------------------------------------------------- +// +/// \file readMscHits.cc +/// \brief example how to read the CaTS::MscHits +// +// Root headers +#include "TFile.h" +#include "TSystem.h" +#include "TTree.h" +#include "TH1.h" +#include +// project headers +#include "Event.hh" +#include "MscHit.hh" +#include "G4ThreeVector.hh" + +int main(int argc, char** argv) +{ + // initialize ROOT + TSystem ts; + gSystem->Load("libCaTSClassesDict"); + if(argc < 4) + { + G4cout << "Program requires 3 arguments: name of input file, name of " + "output file, Volume that sensitive detector is attached to" + << G4endl; + exit(1); + } + TFile* outfile = new TFile(argv[2], "RECREATE"); + TFile fo(argv[1]); + Event* event = new Event(); + TTree* Tevt = (TTree*) fo.Get("Events"); + Tevt->SetBranchAddress("event.", &event); + TBranch* fevtbranch = Tevt->GetBranch("event."); + Int_t nevent = fevtbranch->GetEntries(); + outfile->cd(); + TH1F* theta = new TH1F("angle", "angle", 100, 0.0, 0.15); + std::string CollectionName = argv[3]; + CollectionName = CollectionName + "_Msc_HC"; + for(Int_t i = 0; i < nevent; i++) + { + fevtbranch->GetEntry(i); + auto* hcmap = event->GetHCMap(); + for(const auto& ele : *hcmap) + { + if(ele.first.compare(CollectionName) == 0) + { + auto hits = ele.second; + G4int NbHits = hits.size(); + for(G4int ii = 0; ii < NbHits; ii++) + { + MscHit* mscHit = dynamic_cast(hits.at(ii)); + G4ThreeVector invec(0, 0, 1.); + std::cout << std::setprecision(12) << mscHit->GetKinE() << " " + << std::setprecision(12) << mscHit->GetMomentum().getX() + << " " << std::setprecision(12) + << mscHit->GetMomentum().getY() << " " + << std::setprecision(12) << mscHit->GetMomentum().getZ() + << std::endl; + theta->Fill(invec.angle(mscHit->GetMomentum()) * 57.3); + } + } + } + } + outfile->Write(); +} diff --git a/examples/advanced/CaTS/readPhotonHits.cc b/examples/advanced/CaTS/readPhotonHits.cc new file mode 100644 index 0000000000..307b3aa561 --- /dev/null +++ b/examples/advanced/CaTS/readPhotonHits.cc @@ -0,0 +1,125 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +//--------------------------------------------------------------------- +//* |\___/| * +//* ) ( * +//* =\ /= * +//* )===( * +//* / \ CaTS: Calorimeter and Tracker Simulation * +//* | | is a flexible and extend-able framework * +//* / \ for the simulation of various detector * +//* \ / systems * +//* \__ _/ https://github.com/hanswenzel/CaTS * +//* ( ( * +//* ) ) * +//* (_( * +//* CaTS also serves as an example that demonstrates how to use * +//* opticks from within Geant4 for the creation and propagation of * +//* optical photons. * +//* see https://bitbucket.org/simoncblyth/opticks.git). * +//* Ascii Art by Joan Stark: https://www.asciiworld.com/-Cats-2-.html * +//--------------------------------------------------------------------- +// +/// \file readPhotonHits.cc +/// \brief example how to read the CaTS::PhotonHits +// +// Root headers +#include "TFile.h" +#include "TSystem.h" +#include "TTree.h" +#include "TH1.h" +#include "TH2.h" +// Project headers +#include "Event.hh" +#include "lArTPCHit.hh" +#include "PhotonHit.hh" + +int main(int argc, char** argv) +{ + // initialize ROOT + TSystem ts; + gSystem->Load("libCaTSClassesDict"); + if(argc < 4) + { + G4cout << "Program requires 3 arguments: name of input file, name of " + "output file, Volume that sensitive detector is attached to" + << G4endl; + exit(1); + } + TFile* outfile = new TFile(argv[2], "RECREATE"); + outfile->cd(); + TH2F* pos2 = new TH2F("position", "position of Photon Hits", 400, -1000., + 1000., 400, -500, 500); + TH1F* time = new TH1F("time", "timing of photon hits", 1000, 0., 250.); + TH1F* time0 = new TH1F("time0", "timing of photon hits", 1000, 0., 250.); + TH1F* time1 = new TH1F("time1", "timing of photon hits", 1000, 0., 250.); + TH1F* time2 = new TH1F("time2", "timing of photon hits", 1000, 0., 250.); + TH1F* wl = new TH1F("wl", "wavelength of detected photons", 1000, 0., 250.); + TH1F* np = new TH1F("np", "number of detected photons", 100, 0., 50.); + TFile fo(argv[1]); + fo.GetListOfKeys()->Print(); + Event* event = new Event(); + TTree* Tevt = (TTree*) fo.Get("Events"); + Tevt->SetBranchAddress("event.", &event); + TBranch* fevtbranch = Tevt->GetBranch("event."); + Int_t nevent = fevtbranch->GetEntries(); + G4cout << "Nr. of Events: " << nevent << G4endl; + std::string CollectionName = argv[3]; + CollectionName = CollectionName + "_Photondetector_HC"; + for(Int_t i = 0; i < nevent; i++) + { + fevtbranch->GetEntry(i); + auto* hcmap = event->GetHCMap(); + for(const auto& ele : *hcmap) + { + auto hits = ele.second; + if(ele.first.compare(CollectionName) == 0) + { + auto hits = ele.second; + G4int NbHits = hits.size(); + G4cout << "Event: " << i << " Number of Hits: " << NbHits << G4endl; + np->Fill(NbHits); + for(G4int ii = 0; ii < NbHits; ii++) + { + PhotonHit* photonHit = dynamic_cast(hits.at(ii)); + time->Fill(photonHit->GetTime()); + wl->Fill(photonHit->GetWavelength()); + if(photonHit->GetPosition().getZ() < -100.) + time0->Fill(photonHit->GetTime()); + if(photonHit->GetPosition().getZ() > -100. && + photonHit->GetPosition().getZ() < 100) + time1->Fill(photonHit->GetTime()); + if(photonHit->GetPosition().getZ() < 100.) + time2->Fill(photonHit->GetTime()); + pos2->Fill(photonHit->GetPosition().getZ(), + photonHit->GetPosition().getY()); + } + } + } + } + outfile->cd(); + outfile->Write(); +} diff --git a/examples/advanced/CaTS/scripts/check.sh b/examples/advanced/CaTS/scripts/check.sh new file mode 100755 index 0000000000..9badb14da7 --- /dev/null +++ b/examples/advanced/CaTS/scripts/check.sh @@ -0,0 +1,38 @@ +#!/bin/bash -l +msg="=== $BASH_SOURCE :" + +info(){ cat << EOI +$msg checking the environment + OPTICKS_HOME : $OPTICKS_HOME + CMAKE_PREFIX_PATH : +$(echo $CMAKE_PREFIX_PATH | tr ":" "\n") +The CMAKE_PREFIX_PATH is expected to contain about seven prefix directories including:: + OPTICKS_PREFIX : $OPTICKS_PREFIX + OPTICKS_PREFIX/externals : $OPTICKS_PREFIX/externals +Note that environment setup must be done in login scripts : .bashrc .bash_profile .opticks_config etc.. +Doing environment setup just in the current session will not work as scripts often invoke login scripts. +EOI +} + +rc=0 +if [ -z "$OPTICKS_HOME" -o -z "$OPTICKS_PREFIX" -o -z "$CMAKE_PREFIX_PATH" ]; then + echo $msg missing required envvars : your need to source .opticks_config + rc=1 +fi +if [ "$CMAKE_PREFIX_PATH" == ${CMAKE_PREFIX_PATH/$OPTICKS_PREFIX:/} ]; then + echo $msg CMAKE_PREFIX_PATH does not contain the expected prefix : $OPTICKS_PREFIX : you need to invoke opticks-setup from .opticks_config + rc=2 +fi +if [ "$CMAKE_PREFIX_PATH" == ${CMAKE_PREFIX_PATH/$OPTICKS_PREFIX\/externals\:/} ]; then + echo $msg CMAKE_PREFIX_PATH does not contain the expected prefix : $OPTICKS_PREFIX/externals : you need to invoke opticks-setup from .opticks_config + rc=3 +fi + +if [ $rc -ne 0 ]; then + info + echo $msg environment check FAILED : rc $rc +else + [ -n "$VERBOSE" ] && info + echo $msg environment check PASSED : rc $rc +fi +exit $rc diff --git a/examples/advanced/CaTS/scripts/hit.py b/examples/advanced/CaTS/scripts/hit.py new file mode 100644 index 0000000000..2b4d4e20d8 --- /dev/null +++ b/examples/advanced/CaTS/scripts/hit.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# Python program explaining +# load() function + +import numpy as geek +import matplotlib.pyplot as plt + +b = geek.load('hits.npy') + +print("size of b is:",b.size) +print("shape of b is:",b.shape) +print("ndim of b is:",b.ndim) +print(b) +print(b[0,0,0]) +print(b[0,3,0]) +print("b is printed from hits.npy") +x = b[:,0,0] +y = b[:,0,1] +z = b[:,0,2] +lamb = b[:,2,3] +print(x.shape) +print(y.shape) +print(lamb.shape) + +#axs = plt.subplots(2, 2, figsize=(5, 5)) +plt.subplot(131) +plt.ylabel('#Photons') +plt.xlabel('x-position/mm') +plt.hist(x,50,(-200,200.)) +plt.subplot(132) +plt.xlabel('x-position/mm') +plt.ylabel('y-position/mm') +plt.scatter(x, y) +plt.subplot(133) +plt.xlabel('lambda/nm') +plt.ylabel('#Photons') +plt.hist(lamb,50,(50,800.)) +#plt.hist(z) +plt.show() diff --git a/examples/advanced/CaTS/scripts/run.sh b/examples/advanced/CaTS/scripts/run.sh new file mode 100755 index 0000000000..4b543b34bb --- /dev/null +++ b/examples/advanced/CaTS/scripts/run.sh @@ -0,0 +1,52 @@ +#!/bin/bash -l +msg="=== $BASH_SOURCE :" + +./check.sh +[ $? -ne 0 ] && echo $msg check failed && exit 1 + +extra_logging(){ + # switch on extra logging for these classes + export G4Opticks=INFO + export OpMgr=INFO + export OpPropagator=INFO + export OpEngine=INFO + export OScene=INFO + export OEvent=INFO + export OSensorLib=INFO +} +#extra_logging + +genstep_skips(){ + # from okc:OpticksGentep.h + local OpticksGenstep_G4Cerenkov_1042=1 + local OpticksGenstep_G4Scintillation_1042=2 + local OpticksGenstep_DsG4Cerenkov_r3971=3 + local OpticksGenstep_DsG4Scintillation_r3971=4 + local OpticksGenstep_TORCH=5 + # uncomment one of the below to skip cerenkov OR scintillation gensteps at G4Opticks collection + #export OPTICKS_SKIP_GENCODE=${OpticksGenstep_G4Cerenkov_1042},${OpticksGenstep_DsG4Cerenkov_r3971} + #export OPTICKS_SKIP_GENCODE=${OpticksGenstep_G4Scintillation_1042},${OpticksGenstep_DsG4Scintillation_r3971} +} +genstep_skips + + +# defines the embedded commandline picking between production and devlopment(with lots of .npy saves) +#export OPTICKS_EMBEDDED_COMMANDLINE="dev" +export OPTICKS_EMBEDDED_COMMANDLINE="pro" + +# appends to the embedded commandline +#export OPTICKS_EMBEDDED_COMMANDLINE_EXTRA="--rngmax 10 --trivial" # trivial changes the generate.cu kernel +export OPTICKS_EMBEDDED_COMMANDLINE_EXTRA="--rngmax 100" + + +#SY=50 +#SY=100 +SY=5000 +#SY=10000 +#SY=50000 + +cmd="CaTS $PWD/gdml/G4Opticks_$SY.gdml macros/muon_noIO.mac" +#cmd="gdb -ex r --args $cmd" # uncomment to run under debugger + +echo $cmd +eval $cmd diff --git a/source/analysis/factory/include/g4analysis_defs.hh b/examples/advanced/CaTS/src/ActionInitialization.cc similarity index 62% rename from source/analysis/factory/include/g4analysis_defs.hh rename to examples/advanced/CaTS/src/ActionInitialization.cc index c0a2ee37ab..106bf94de2 100644 --- a/source/analysis/factory/include/g4analysis_defs.hh +++ b/examples/advanced/CaTS/src/ActionInitialization.cc @@ -23,19 +23,44 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file ActionInitialization.cc +/// \brief Implementation of the CaTS::ActionInitialization class -// Author: Ivana Hrivnacova, 10/09/2019 (ivana@ipno.in2p3.fr) - -#ifndef g4analysis_defs_h -#define g4analysis_defs_h 1 - -#include "g4hntools_defs.hh" -#include "G4ToolsAnalysisManager.hh" - -using G4AnalysisManager = G4ToolsAnalysisManager; - -#endif +// Geant4 headers +#include +// project headers +#include "ActionInitialization.hh" +#include "EventAction.hh" +#include "PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "StackingAction.hh" +ActionInitialization::ActionInitialization() + : G4VUserActionInitialization() +{} +void ActionInitialization::BuildForMaster() const +{ + SetUserAction(new RunAction); +} +void ActionInitialization::Build() const +{ + SetUserAction(new PrimaryGeneratorAction()); + SetUserAction(new StackingAction()); + SetUserAction(new EventAction()); +} diff --git a/examples/advanced/CaTS/src/CalorimeterHit.cc b/examples/advanced/CaTS/src/CalorimeterHit.cc new file mode 100644 index 0000000000..ee53b87220 --- /dev/null +++ b/examples/advanced/CaTS/src/CalorimeterHit.cc @@ -0,0 +1,106 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file CalorimeterHit.cc +/// \brief Implementation of the CaTS::CalorimeterHit class + +// Geant4 headers +#include "G4Circle.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +// project headers +#include "CalorimeterHit.hh" +#include "G4VVisManager.hh" +G4ThreadLocal G4Allocator* CalorimeterHitAllocator = nullptr; + +CalorimeterHit::CalorimeterHit() + : G4VHit() +{} + +CalorimeterHit::CalorimeterHit(unsigned i, G4double e, G4double em, G4double t, + G4ThreeVector p) + : G4VHit() +{ + fid = i; + fEdep = e; + fem_Edep = em; + ftime = t; + fposition = p; +} + +CalorimeterHit::CalorimeterHit(const CalorimeterHit& right) + : G4VHit() +{ + // No need to call class member functions via this-> + fid = right.fid; + fEdep = right.fEdep; + fem_Edep = right.fem_Edep; + ftime = right.ftime; + fposition = right.fposition; +} + +const CalorimeterHit& CalorimeterHit::operator=(const CalorimeterHit& right) +{ + // No need to call class member functions via this-> + fid = right.fid; + fEdep = right.fEdep; + fem_Edep = right.fem_Edep; + ftime = right.ftime; + fposition = right.fposition; + return *this; +} + +G4bool CalorimeterHit::operator==(const CalorimeterHit& right) const +{ + return (this == &right) ? true : false; +} + +void CalorimeterHit::Draw() +{ + G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); + if(pVVisManager) + { + G4Circle circle(fposition); + circle.SetScreenSize(2.); + circle.SetFillStyle(G4Circle::filled); + G4Colour colour(1., 0., 0.); + G4VisAttributes attribs(colour); + circle.SetVisAttributes(attribs); + pVVisManager->Draw(circle); + } +} diff --git a/examples/advanced/CaTS/src/CalorimeterSD.cc b/examples/advanced/CaTS/src/CalorimeterSD.cc new file mode 100644 index 0000000000..1d5c9af2a7 --- /dev/null +++ b/examples/advanced/CaTS/src/CalorimeterSD.cc @@ -0,0 +1,128 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file CalorimeterSD.cc +/// \brief Implementation of the CaTS::CalorimeterSD class + +// Geant4 headers +#include "G4HCofThisEvent.hh" +#include "G4Step.hh" +#include "G4SDManager.hh" +#include "G4ios.hh" +// project headers +#include "CalorimeterSD.hh" +#include "ConfigurationManager.hh" + +CalorimeterSD::CalorimeterSD(G4String name) + : G4VSensitiveDetector(name) +{ + G4String HCname = name + "_HC"; + collectionName.insert(HCname); + G4cout << collectionName.size() << " CalorimeterSD name: " << name + << " collection Name: " << HCname << G4endl; + fHCID = -1; + verbose = ConfigurationManager::getInstance()->isEnable_verbose(); +} + +void CalorimeterSD::Initialize(G4HCofThisEvent* hce) +{ + fCalorimeterHitsCollection = + new CalorimeterHitsCollection(SensitiveDetectorName, collectionName[0]); + if(fHCID < 0) + { + if(verbose) + G4cout << "CalorimeterSD::Initialize: " << SensitiveDetectorName << " " + << collectionName[0] << G4endl; + fHCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); + } + hce->AddHitsCollection(fHCID, fCalorimeterHitsCollection); +} + +G4bool CalorimeterSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) +{ + // auto can be used for all results from retrieving functions + auto edep = aStep->GetTotalEnergyDeposit() / CLHEP::MeV; + if(edep == 0.) + return false; + auto time = aStep->GetPreStepPoint()->GetGlobalTime() / CLHEP::ns; + auto touch = aStep->GetPreStepPoint()->GetTouchable(); + auto cellpos = touch->GetTranslation(); + unsigned int ID = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetCopyNo(); + auto theTrack = aStep->GetTrack(); + auto particleType = theTrack->GetDefinition()->GetParticleName(); + // + // check if this cell has been hit before + // fCalorimeterHitsCollection + for(unsigned int j = 0; j < fCalorimeterHitsCollection->entries(); j++) + { + CalorimeterHit* aPreviousHit = (*fCalorimeterHitsCollection)[j]; + if(ID == aPreviousHit->GetId()) + { + aPreviousHit->SetEdep(aStep->GetTotalEnergyDeposit() + + aPreviousHit->GetEdep()); + if((particleType == "e+") || (particleType == "gamma") || + (particleType == "e-")) + { + aPreviousHit->Setem_Edep(edep + aPreviousHit->Getem_Edep()); + } + return true; + } + } + // + // otherwise create a new hit: + // + CalorimeterHit* newHit; + if((particleType == "e+") || (particleType == "gamma") || + (particleType == "e-")) + { + newHit = new CalorimeterHit(ID, edep, edep, time, cellpos); + } + else + { + newHit = new CalorimeterHit(ID, edep, 0.0, time, cellpos); + } + fCalorimeterHitsCollection->insert(newHit); + return true; +} + +void CalorimeterSD::EndOfEvent(G4HCofThisEvent*) +{ + G4int NbHits = fCalorimeterHitsCollection->entries(); + if(verbose) + G4cout << " Number of CalorimeterHits: " << NbHits << G4endl; +} diff --git a/examples/advanced/CaTS/src/ColorReader.cc b/examples/advanced/CaTS/src/ColorReader.cc new file mode 100644 index 0000000000..eedc204cdc --- /dev/null +++ b/examples/advanced/CaTS/src/ColorReader.cc @@ -0,0 +1,238 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file ColorReader.cc +/// \brief extending gdml reader to deal with colors and visualization attributes +// + +// Geant4 headers +#include "G4LogicalVolume.hh" +#include "G4VisAttributes.hh" +// project headers +#include "ColorReader.hh" +#include "ConfigurationManager.hh" +ColorReader::ColorReader() + : G4GDMLReadStructure() +{} + +ColorReader::~ColorReader() +{ +#if(G4VERSION_NUMBER > 1072) + for(auto [name, attribute] : fAttribs) + { + delete attribute; + } +#else + std::map::iterator pos; + for(pos = fAttribs.begin(); pos != fAttribs.end(); pos++) + { + delete pos->second; + } +#endif +} + +void ColorReader::ExtensionRead(const xercesc::DOMElement* const extElement) +{ + G4bool verbose = ConfigurationManager::getInstance()->isEnable_verbose(); + if(verbose) + { + G4cout << "ColorReaderReading GDML extension..." << G4endl; + G4cout << "ColorReader: Reading new GDML extension..." << G4endl; + } + for(xercesc::DOMNode* iter = extElement->getFirstChild(); iter != 0; + iter = iter->getNextSibling()) + { + if(iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) + { + continue; + } + const xercesc::DOMElement* const child = + dynamic_cast(iter); + const G4String tag = Transcode(child->getTagName()); + if(verbose) + { + G4cout << "G4GDML:" << tag << G4endl; + } + if(tag == "color") + { + ColorRead(child); + } + else + { + G4String error_msg = "Unknown tag in structure: " + tag; + G4Exception("ColorReader::ExtensionRead()", "ReadError", FatalException, + error_msg); + } + } +} + +void ColorReader::VolumeRead(const xercesc::DOMElement* const volumeElement) +{ + G4bool verbose = ConfigurationManager::getInstance()->isEnable_verbose(); + if(verbose) + { + G4cout << "G4GDML: VolumeRead" << G4endl; + } + G4VSolid* solidPtr = 0; + G4Material* materialPtr = 0; + G4VisAttributes* attrPtr = 0; + G4GDMLAuxListType auxList; + XMLCh* name_attr = xercesc::XMLString::transcode("name"); + const G4String name = Transcode(volumeElement->getAttribute(name_attr)); + xercesc::XMLString::release(&name_attr); + for(xercesc::DOMNode* iter = volumeElement->getFirstChild(); iter != 0; + iter = iter->getNextSibling()) + { + if(iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) + { + continue; + } + const xercesc::DOMElement* const child = + dynamic_cast(iter); + const G4String tag = Transcode(child->getTagName()); + if(tag == "auxiliary") + { + auxList.push_back(AuxiliaryRead(child)); + } + else if(tag == "materialref") + { + materialPtr = GetMaterial(GenerateName(RefRead(child), true)); + } + else if(tag == "solidref") + { + solidPtr = GetSolid(GenerateName(RefRead(child))); + } + else if(tag == "colorref") + { + if(verbose) + { + G4cout << "G4GDML: found visual attribute ..." << G4endl; + } + attrPtr = GetVisAttribute(GenerateName(RefRead(child))); + } + } + pMotherLogical = + new G4LogicalVolume(solidPtr, materialPtr, GenerateName(name), 0, 0, 0); + if(verbose) + { + G4cout << "G4GDML: attaching visual attribute ..." << G4endl; + } + pMotherLogical->SetVisAttributes(attrPtr); + if(!auxList.empty()) + { + auxMap[pMotherLogical] = auxList; + } + Volume_contentRead(volumeElement); +} + +void ColorReader::ColorRead(const xercesc::DOMElement* const colorElement) +{ + G4bool verbose = ConfigurationManager::getInstance()->isEnable_verbose(); + if(verbose) + { + G4cout << "G4GDML: ColorRead" << G4endl; + } + G4String name; + G4VisAttributes* color = 0; + G4double r = 0., g = 0., b = 0., a = 0.; + const xercesc::DOMNamedNodeMap* const attributes = + colorElement->getAttributes(); + XMLSize_t attributeCount = attributes->getLength(); + for(XMLSize_t attribute_index = 0; attribute_index < attributeCount; + attribute_index++) + { + xercesc::DOMNode* attribute_node = attributes->item(attribute_index); + if(attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) + { + continue; + } + const xercesc::DOMAttr* const attribute = + dynamic_cast(attribute_node); + const G4String attName = Transcode(attribute->getName()); + const G4String attValue = Transcode(attribute->getValue()); + if(attName == "name") + { + name = GenerateName(attValue); + } + else if(attName == "R") + { + r = eval.Evaluate(attValue); + } + else if(attName == "G") + { + g = eval.Evaluate(attValue); + } + else if(attName == "B") + { + b = eval.Evaluate(attValue); + } + else if(attName == "A") + { + a = eval.Evaluate(attValue); + } + } + if(verbose) + { + G4cout << "Color attribute (R,G,B,A) is: " << r << ", " << g << ", " << b + << ", " << a << " !" << G4endl; + } + color = new G4VisAttributes(G4Color(r, g, b, a)); + fAttribs.insert(std::make_pair(name, color)); +} + +G4VisAttributes* ColorReader::GetVisAttribute(const G4String& ref) +{ + G4bool verbose = ConfigurationManager::getInstance()->isEnable_verbose(); + if(verbose) + { + G4cout << "G4GDML: GetVisAttribute" << G4endl; + } + G4VisAttributes* col = 0; + std::map::iterator pos = fAttribs.find(ref); + if(pos != fAttribs.end()) + { + col = pos->second; + } + else + { + G4String err_mess = "Attribute: " + ref + " NOT found !"; + G4Exception("ColorReader::GetVisAttribute()", "ReadError", FatalException, + err_mess); + } + return col; +} diff --git a/examples/advanced/CaTS/src/ConfigurationManager.cc b/examples/advanced/CaTS/src/ConfigurationManager.cc new file mode 100644 index 0000000000..27c3be7fb3 --- /dev/null +++ b/examples/advanced/CaTS/src/ConfigurationManager.cc @@ -0,0 +1,137 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file ConfigurationManager.cc +/// \brief Implementation of the CaTS::ConfigurationManager class + +// Geant4 headers +#include +#include "G4GenericMessenger.hh" +// project headers +#include "ConfigurationManager.hh" +// c++ headers +#include +#include +ConfigurationManager* ConfigurationManager::fginstance = nullptr; +std::once_flag ConfigurationManager::fginitInstanceFlag; + +ConfigurationManager::ConfigurationManager() { DefineCommands(); } + +ConfigurationManager::~ConfigurationManager() { delete fMessenger; } + +void ConfigurationManager::Print() +{ + G4cout << "--------------------------------------------------" << G4endl; + G4cout << "CaTS configuration: " << G4endl; + G4cout << "====================" << G4endl; + G4cout << G4endl; + G4cout << "fenable_verbose: " << fenable_verbose << G4endl; + G4cout << "fdumpgdml: " << fdumpgdml << G4endl; + G4cout << "fGDMLFileName: " << fGDMLFileName << G4endl; +#ifdef WITH_ROOT + G4cout << "fdoAnalysis: " << fdoAnalysis << G4endl; + G4cout << "fHistoFileName: " << fHistoFileName << G4endl; + G4cout << "fwriteHits: " << fwriteHits << G4endl; + G4cout << "fname: " << fname << G4endl; +#endif + G4cout << "fenable_opticks: " << fenable_opticks << G4endl; + G4cout << "fMaxPhotons: " << fMaxPhotons << G4endl; + G4cout << "--------------------------------------------------" << G4endl; +} + +void ConfigurationManager::DefineCommands() +{ + fMessenger = new G4GenericMessenger(this, "/CaTS/", "Configuring CaTS"); + // + // Commands defining RootIO +#ifdef WITH_ROOT + auto& HistoFileNameCmd = + fMessenger->DeclareProperty("HistoFileName", fHistoFileName); + HistoFileNameCmd.SetGuidance("Filename for Analysis Histograms"); + HistoFileNameCmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + HistoFileNameCmd.SetDefaultValue("histograms.root"); + auto& writeHitsCmd = fMessenger->DeclareProperty("writeHits", fwriteHits); + writeHitsCmd.SetGuidance("Write out Hits collection"); + writeHitsCmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + writeHitsCmd.SetDefaultValue("false"); + auto& doAnalysisCmd = fMessenger->DeclareProperty("doAnalysis", fdoAnalysis); + doAnalysisCmd.SetGuidance("Do Analysis"); + doAnalysisCmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + doAnalysisCmd.SetDefaultValue("false"); + auto& fnameCmd = fMessenger->DeclareProperty("fname", fname); + fnameCmd.SetGuidance("set fname"); + fnameCmd.SetStates(G4State_PreInit); + fnameCmd.SetDefaultValue("Hits"); +#endif + // + // Commands enabling G4Opticks and frequency calling it: + // + auto& enable_opticksCmd = + fMessenger->DeclareProperty("enable_opticks", fenable_opticks); + enable_opticksCmd.SetGuidance( + "use opticks for generating and tracing of optical photons"); + enable_opticksCmd.SetDefaultValue("false"); + enable_opticksCmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + auto& MaxPhotonsCmd = fMessenger->DeclareProperty("MaxPhotons", fMaxPhotons); + MaxPhotonsCmd.SetGuidance( + "set number of photons to be collecetd befores invoking G4Opticks"); + MaxPhotonsCmd.SetDefaultValue("1000000"); + MaxPhotonsCmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + // + // general command to control verbosity and writing out geometry to a gdml + // file: + // + fMessenger->DeclareMethod("list", &ConfigurationManager::Print) + .SetGuidance("Print all configuration parameters") + .SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + auto& verboseCmd = fMessenger->DeclareProperty("verbose", fenable_verbose); + verboseCmd.SetGuidance("Set flag for enabling verbose diagnostic printout"); + verboseCmd.SetDefaultValue("false"); + verboseCmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + auto& GDMLFileNameCmd = + fMessenger->DeclareProperty("GDMLFileName", fGDMLFileName); + GDMLFileNameCmd.SetGuidance( + "Set Filename to dump GDML representation of Geometry"); + GDMLFileNameCmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + GDMLFileNameCmd.SetDefaultValue("dump.gdml_G4"); + auto& dumpgdmlCmd = fMessenger->DeclareProperty("dumpgdml", fdumpgdml); + dumpgdmlCmd.SetGuidance( + "Set flag for enabling dumping the Geometry to a gdml file"); + dumpgdmlCmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + dumpgdmlCmd.SetDefaultValue("false"); +} diff --git a/examples/advanced/CaTS/src/DRCalorimeterHit.cc b/examples/advanced/CaTS/src/DRCalorimeterHit.cc new file mode 100644 index 0000000000..5f7d8cb005 --- /dev/null +++ b/examples/advanced/CaTS/src/DRCalorimeterHit.cc @@ -0,0 +1,109 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file DRCalorimeterHit.cc +/// \brief Implementation of the CaTS::DRCalorimeterHit class + +// Geant4 headers +#include "G4VVisManager.hh" +#include "G4Circle.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +// project headers +#include "DRCalorimeterHit.hh" +G4ThreadLocal G4Allocator* DRCalorimeterHitAllocator = + nullptr; + +DRCalorimeterHit::DRCalorimeterHit() + : G4VHit() +{} + +DRCalorimeterHit::DRCalorimeterHit(unsigned int i, G4double e, G4double em, + unsigned int nc, G4double t, G4ThreeVector p) + : G4VHit() +{ + fid = i; + fEdep = e; + fem_Edep = em; + fNceren = nc; + ftime = t; + fposition = p; +} + +DRCalorimeterHit::DRCalorimeterHit(const DRCalorimeterHit& right) + : G4VHit() +{ + this->fid = right.fid; + this->fEdep = right.fEdep; + this->fem_Edep = right.fem_Edep; + this->fNceren = right.fNceren; + this->ftime = right.ftime; + this->fposition = right.fposition; +} + +const DRCalorimeterHit& DRCalorimeterHit::operator=( + const DRCalorimeterHit& right) +{ + this->fid = right.fid; + this->fEdep = right.fEdep; + this->fem_Edep = right.fem_Edep; + this->fNceren = right.fNceren; + this->ftime = right.ftime; + this->fposition = right.fposition; + return *this; +} + +G4bool DRCalorimeterHit::operator==(const DRCalorimeterHit& right) const +{ + return (this == &right) ? true : false; +} + +void DRCalorimeterHit::Draw() +{ + G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); + if(pVVisManager) + { + G4Circle circle(fposition); + circle.SetScreenSize(2.); + circle.SetFillStyle(G4Circle::filled); + G4Colour colour(1., 0., 0.); + G4VisAttributes attribs(colour); + circle.SetVisAttributes(attribs); + pVVisManager->Draw(circle); + } +} diff --git a/examples/advanced/CaTS/src/DRCalorimeterSD.cc b/examples/advanced/CaTS/src/DRCalorimeterSD.cc new file mode 100644 index 0000000000..601a6b4fed --- /dev/null +++ b/examples/advanced/CaTS/src/DRCalorimeterSD.cc @@ -0,0 +1,154 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file DRCalorimeterSD.cc +/// \brief Implementation of the CaTS::DRCalorimeterSD class + +// Geant4 headers +#include "G4HCofThisEvent.hh" +#include "G4Step.hh" +#include "G4ThreeVector.hh" +#include "G4SDManager.hh" +#include "G4ios.hh" +#include "G4SteppingManager.hh" +#include "G4EventManager.hh" +#include "G4Cerenkov.hh" +// project headers +#include "DRCalorimeterSD.hh" +#include "ConfigurationManager.hh" + +DRCalorimeterSD::DRCalorimeterSD(G4String name) + : G4VSensitiveDetector(name) + , fDRCalorimeterHitsCollection(0) + , fHCID(0) +{ + G4String HCname = name + "_HC"; + collectionName.insert(HCname); + G4cout << collectionName.size() << " DRCalorimeterSD name: " << name + << " collection Name: " << HCname << G4endl; + fHCID = -1; + verbose = ConfigurationManager::getInstance()->isEnable_verbose(); +} + +DRCalorimeterSD::~DRCalorimeterSD() {} + +void DRCalorimeterSD::Initialize(G4HCofThisEvent* hce) +{ + fDRCalorimeterHitsCollection = + new DRCalorimeterHitsCollection(SensitiveDetectorName, collectionName[0]); + if(fHCID < 0) + { + if(verbose) + G4cout << "DRCalorimeterSD::Initialize: " << SensitiveDetectorName + << " " << collectionName[0] << G4endl; + fHCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); + } + hce->AddHitsCollection(fHCID, fDRCalorimeterHitsCollection); +} + +G4bool DRCalorimeterSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) +{ + G4double edep = aStep->GetTotalEnergyDeposit() / CLHEP::MeV; + if(edep == 0.) + return false; + G4double time = aStep->GetPreStepPoint()->GetGlobalTime() / CLHEP::ns; + const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable(); + G4ThreeVector cellpos = touch->GetTranslation(); + unsigned int ID = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetCopyNo(); + G4Track* theTrack = aStep->GetTrack(); + G4String particleType = theTrack->GetDefinition()->GetParticleName(); + unsigned int NCerenPhotons = 0; + G4SteppingManager* fpSteppingManager = G4EventManager::GetEventManager() + ->GetTrackingManager() + ->GetSteppingManager(); + G4StepStatus stepStatus = fpSteppingManager->GetfStepStatus(); + if(stepStatus != fAtRestDoItProc) + { + G4ProcessVector* procPost = fpSteppingManager->GetfPostStepDoItVector(); + size_t MAXofPostStepLoops = fpSteppingManager->GetMAXofPostStepLoops(); + for(size_t i3 = 0; i3 < MAXofPostStepLoops; i3++) + { + if((*procPost)[i3]->GetProcessName() == "Cerenkov") + { + G4Cerenkov* proc = (G4Cerenkov*) (*procPost)[i3]; + NCerenPhotons += proc->GetNumPhotons(); + } + } + } + // + // check if this cell has been hit before + // fDRCalorimeterHitsCollection + for(unsigned int j = 0; j < fDRCalorimeterHitsCollection->entries(); j++) + { + DRCalorimeterHit* aPreviousHit = (*fDRCalorimeterHitsCollection)[j]; + if(ID == aPreviousHit->GetId()) + { + aPreviousHit->SetEdep(aStep->GetTotalEnergyDeposit() + + aPreviousHit->GetEdep()); + aPreviousHit->SetNceren(aPreviousHit->GetNceren() + NCerenPhotons); + if((particleType == "e+") || (particleType == "gamma") || + (particleType == "e-")) + { + aPreviousHit->SetEm_Edep(edep + aPreviousHit->GetEm_Edep()); + } + return true; + } + } + // + // otherwise create a new hit: + // + DRCalorimeterHit* newHit; + if((particleType == "e+") || (particleType == "gamma") || + (particleType == "e-")) + { + newHit = new DRCalorimeterHit(ID, edep, edep, NCerenPhotons, time, cellpos); + } + else + { + newHit = new DRCalorimeterHit(ID, edep, 0.0, time, NCerenPhotons, cellpos); + } + fDRCalorimeterHitsCollection->insert(newHit); + return true; +} + +void DRCalorimeterSD::EndOfEvent(G4HCofThisEvent*) +{ + G4int NbHits = fDRCalorimeterHitsCollection->entries(); + if(verbose) + G4cout << " Number of DRCalorimeterHits: " << NbHits << G4endl; +} diff --git a/examples/advanced/CaTS/src/DetectorConstruction.cc b/examples/advanced/CaTS/src/DetectorConstruction.cc new file mode 100644 index 0000000000..666d10b03d --- /dev/null +++ b/examples/advanced/CaTS/src/DetectorConstruction.cc @@ -0,0 +1,309 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file DetectorConstruction.cc +/// \brief Implementation of the CaTS::DetectorConstruction class + +// Geant4 headers +#include "G4RunManager.hh" +#include "G4PhysicalVolumeStore.hh" +#include "G4LogicalVolumeStore.hh" +#include "G4VisAttributes.hh" +#include "G4UserLimits.hh" +#include "G4ios.hh" +#include "G4SDManager.hh" +#include "G4GDMLParser.hh" +// project headers +#include "ConfigurationManager.hh" +#include "DetectorConstruction.hh" +#include "TrackerSD.hh" +#include "MscSD.hh" +#include "lArTPCSD.hh" +#include "CalorimeterSD.hh" +#include "DRCalorimeterSD.hh" +#include "RadiatorSD.hh" +#include "PhotonSD.hh" +#include "InteractionSD.hh" +#include "ColorReader.hh" +// c++ headers +#include + +DetectorConstruction::DetectorConstruction(G4String fname) + : G4VUserDetectorConstruction() + , gdmlFile(fname) +{} + +DetectorConstruction::~DetectorConstruction() {} +G4VPhysicalVolume* DetectorConstruction::Construct() +{ + verbose = ConfigurationManager::getInstance()->isEnable_verbose(); + ReadGDML(); + const G4GDMLAuxMapType* auxmap = parser->GetAuxMap(); + if(verbose) + { + G4cout << "Found " << auxmap->size() + << " volume(s) with auxiliary information." << G4endl << G4endl; + } + for(G4GDMLAuxMapType::const_iterator iter = auxmap->begin(); + iter != auxmap->end(); iter++) + { + if(verbose) + { + G4cout << "Volume " << ((*iter).first)->GetName() + << " has the following list of auxiliary information: " << G4endl; + } + for(G4GDMLAuxListType::const_iterator vit = (*iter).second.begin(); + vit != (*iter).second.end(); vit++) + { + if(verbose) + { + G4cout << "--> Type: " << (*vit).type << " Value: " << (*vit).value + << G4endl; + } + if((*vit).type == "StepLimit") + { + G4UserLimits* fStepLimit = new G4UserLimits(atof((*vit).value)); + ((*iter).first)->SetUserLimits(fStepLimit); + } + } + } + G4VPhysicalVolume* worldPhysVol = parser->GetWorldVolume(); + if(ConfigurationManager::getInstance()->isDumpgdml()) + { + std::ifstream ifile; + ifile.open(ConfigurationManager::getInstance()->getGDMLFileName()); + if(ifile) + { + G4cout << "****************************************************" + << G4endl; + G4cout << ConfigurationManager::getInstance()->getGDMLFileName() + << " already exists!!!" << G4endl; + G4cout << "No new gdml dump created!!!" << G4endl; + G4cout << "****************************************************" + << G4endl; + } + else + { + G4cout << "Writing: " + << ConfigurationManager::getInstance()->getGDMLFileName() + << G4endl; + parser->Write(ConfigurationManager::getInstance()->getGDMLFileName(), + worldPhysVol); + } + } + return worldPhysVol; +} +void DetectorConstruction::ConstructSDandField() +{ + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + const G4GDMLAuxMapType* auxmap = parser->GetAuxMap(); + if(verbose) + { + G4cout << "Found " << auxmap->size() + << " volume(s) with auxiliary information." << G4endl << G4endl; + } + for(G4GDMLAuxMapType::const_iterator iter = auxmap->begin(); + iter != auxmap->end(); iter++) + { + if(verbose) + { + G4cout << "Volume " << ((*iter).first)->GetName() + << " has the following list of auxiliary information: " << G4endl; + } + for(G4GDMLAuxListType::const_iterator vit = (*iter).second.begin(); + vit != (*iter).second.end(); vit++) + { + if(verbose) + { + G4cout << "--> Type: " << (*vit).type << " Value: " << (*vit).value + << G4endl; + } + if((*vit).type == "SensDet") + { + if(verbose) + { + G4cout << "Found sensitive Detector: " << (*vit).value << G4endl; + } + if((*vit).value == "PhotonDetector") + { + G4String name = ((*iter).first)->GetName() + "_Photondetector"; + PhotonSD* aPhotonSD = new PhotonSD(name); + SDman->AddNewDetector(aPhotonSD); + ((*iter).first)->SetSensitiveDetector(aPhotonSD); + if(verbose) + { + G4cout << "Attaching sensitive Detector: " << (*vit).value + << " to Volume: " << ((*iter).first)->GetName() << G4endl; + } + } + else if((*vit).value == "Target") + { + G4String name = ((*iter).first)->GetName() + "_Target"; + InteractionSD* aInteractionSD = new InteractionSD(name); + SDman->AddNewDetector(aInteractionSD); + ((*iter).first)->SetSensitiveDetector(aInteractionSD); + if(verbose) + { + G4cout << "Attaching sensitive Detector: " << (*vit).value + << " to Volume: " << ((*iter).first)->GetName() << G4endl; + } + } + else if((*vit).value == "Tracker") + { + G4String name = ((*iter).first)->GetName() + "_Tracker"; + TrackerSD* aTrackerSD = new TrackerSD(name); + SDman->AddNewDetector(aTrackerSD); + ((*iter).first)->SetSensitiveDetector(aTrackerSD); + if(verbose) + { + G4cout << "Attaching sensitive Detector: " << (*vit).value + << " to Volume: " << ((*iter).first)->GetName() << G4endl; + } + } + else if((*vit).value == "Msc") + { + G4String name = ((*iter).first)->GetName() + "_Msc"; + MscSD* aMscSD = new MscSD(name); + SDman->AddNewDetector(aMscSD); + ((*iter).first)->SetSensitiveDetector(aMscSD); + if(verbose) + { + G4cout << "Attaching sensitive Detector: " << (*vit).value + << " to Volume: " << ((*iter).first)->GetName() << G4endl; + } + } + else if((*vit).value == "lArTPC") + { + G4String name = ((*iter).first)->GetName() + "_lArTPC"; + lArTPCSD* alArTPCSD = new lArTPCSD(name); + SDman->AddNewDetector(alArTPCSD); + ((*iter).first)->SetSensitiveDetector(alArTPCSD); + if(verbose) + { + G4cout << "Attaching sensitive Detector: " << (*vit).value + << " to Volume: " << ((*iter).first)->GetName() << G4endl; + } + } + else if((*vit).value == "Radiator") + { + G4String name = ((*iter).first)->GetName() + "_Radiator"; + RadiatorSD* aRadiatorSD = new RadiatorSD(name); + SDman->AddNewDetector(aRadiatorSD); + ((*iter).first)->SetSensitiveDetector(aRadiatorSD); + if(verbose) + { + G4cout << "Attaching sensitive Detector: " << (*vit).value + << " to Volume: " << ((*iter).first)->GetName() << G4endl; + } + } + else if((*vit).value == "Calorimeter") + { + G4String name = ((*iter).first)->GetName() + "_Calorimeter"; + CalorimeterSD* aCalorimeterSD = new CalorimeterSD(name); + SDman->AddNewDetector(aCalorimeterSD); + ((*iter).first)->SetSensitiveDetector(aCalorimeterSD); + if(verbose) + { + G4cout << "Attaching sensitive Detector: " << (*vit).value + << " to Volume: " << ((*iter).first)->GetName() << G4endl; + } + } + else if((*vit).value == "DRCalorimeter") + { + G4String name = ((*iter).first)->GetName() + "_DRCalorimeter"; + DRCalorimeterSD* aDRCalorimeterSD = new DRCalorimeterSD(name); + SDman->AddNewDetector(aDRCalorimeterSD); + ((*iter).first)->SetSensitiveDetector(aDRCalorimeterSD); + if(verbose) + { + G4cout << "Attaching sensitive Detector: " << (*vit).value + << " to Volume: " << ((*iter).first)->GetName() << G4endl; + } + } + } + else if((*vit).type == "Solid") + { + if((*vit).value == "True") + { + G4VisAttributes* visibility = new G4VisAttributes(); + visibility->SetForceSolid(true); + G4VisAttributes* visatt = new G4VisAttributes( + ((*iter).first)->GetVisAttributes()->GetColour()); + visatt->SetVisibility(true); + visatt->SetForceSolid(true); + visatt->SetForceAuxEdgeVisible(true); + ((*iter).first)->SetVisAttributes(visatt); + } + } + } + } +} +void DetectorConstruction::ReadGDML() +{ + fReader = new ColorReader; + parser = new G4GDMLParser(fReader); + parser->Read(gdmlFile, false); + G4VPhysicalVolume* World = parser->GetWorldVolume(); + //----- GDML parser makes world invisible, this is a hack to make it + // visible again... + G4LogicalVolume* pWorldLogical = World->GetLogicalVolume(); + pWorldLogical->SetVisAttributes(0); + G4cout << World->GetTranslation() << G4endl << G4endl; + if(verbose) + { + G4cout << "Found World: " << World->GetName() << G4endl; + G4cout << "World LV: " << World->GetLogicalVolume()->GetName() << G4endl; + } + G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance(); + if(verbose) + { + G4cout << "Found " << pLVStore->size() << " logical volumes." << G4endl + << G4endl; + } + G4PhysicalVolumeStore* pPVStore = G4PhysicalVolumeStore::GetInstance(); + if(verbose) + { + G4cout << "Found " << pPVStore->size() << " physical volumes." << G4endl + << G4endl; + } +} + +void DetectorConstruction::UpdateGeometry() +{ + G4RunManager::GetRunManager()->DefineWorldVolume(Construct()); +} diff --git a/examples/advanced/air_shower/include/UltraAnalysisManager.hh b/examples/advanced/CaTS/src/Event.cc similarity index 68% rename from examples/advanced/air_shower/include/UltraAnalysisManager.hh rename to examples/advanced/CaTS/src/Event.cc index e4909fb14f..11779c023e 100644 --- a/examples/advanced/air_shower/include/UltraAnalysisManager.hh +++ b/examples/advanced/CaTS/src/Event.cc @@ -23,24 +23,38 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // +// ******************************************************************** // +// CaTS (Calorimetry and Tracking Simulation) // -// -------------------------------------------------------------- -// GEANT 4 - ULTRA experiment example -// -------------------------------------------------------------- +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) // -// Code developed by: -// B. Tome, M.C. Espirito-Santo, A. Trindade, P. Rodrigues +// History +// October 18th, 2021 : first implementation // -// **************************************************** -// * UltraAnalysisManager.hh -// **************************************************** +// ******************************************************************** // -// Class used for analysis procedures -// -#ifndef ULTRAANALYSISMANAGER_HH -#define ULTRAANALYSISMANAGER_HH 1 +/// \file Event.cc +/// \brief Implementation of the CaTS::Event class -#include "g4root.hh" +#include "G4Version.hh" +#include "Event.hh" +#include +void Event::Reset() +{ +#if(G4VERSION_NUMBER > 1072) + for(auto [name, hitvector] : hcmap) + { + hitvector.clear(); + } +#else + std::map>::iterator it; + for(it = hcmap.begin(); it != hcmap.end(); it++) + { + (it->second).clear(); + } #endif +} diff --git a/examples/advanced/CaTS/src/EventAction.cc b/examples/advanced/CaTS/src/EventAction.cc new file mode 100644 index 0000000000..07d280fb19 --- /dev/null +++ b/examples/advanced/CaTS/src/EventAction.cc @@ -0,0 +1,266 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file EventAction.cc +/// \brief Implementation of the CaTS::EventAction class + +// Geant4 headers +#include +#include +#include "G4Event.hh" +#include "G4HCofThisEvent.hh" +#include +#include +#include +#include +#include "G4SDManager.hh" + +// project headers: +#include "EventAction.hh" +#include "ConfigurationManager.hh" +#include "Event.hh" +#include "PhotonSD.hh" +#include "PhotonHit.hh" +#include "InteractionHit.hh" +#include "lArTPCHit.hh" +#include "TrackerHit.hh" +#include "MscHit.hh" +#include "CalorimeterHit.hh" +#include "DRCalorimeterHit.hh" +#ifdef WITH_ROOT +#include "RootIO.hh" +#endif +// stl headers +#include +#include +#include +#include +#ifdef WITH_G4OPTICKS +#include "OpticksFlags.hh" +#include "G4Opticks.hh" +#include "G4OpticksHit.hh" +#endif + +namespace { + // Mutex to lock updating the global ion map + G4Mutex ionIdMapMutex = G4MUTEX_INITIALIZER; +} // namespace + +EventAction::EventAction() +: G4UserEventAction() { +#ifdef WITH_ROOT + RootIO::GetInstance(); +#endif +} + +void EventAction::BeginOfEventAction(const G4Event* anEvent) { +} + +void EventAction::EndOfEventAction(const G4Event* event) { + G4bool verbose = ConfigurationManager::getInstance()->isEnable_verbose(); + if (verbose) + G4cout << "EventAction::EndOfEventAction Event: " << event->GetEventID() + << G4endl; + G4HCofThisEvent* HCE = event->GetHCofThisEvent(); + if (HCE == nullptr) + return; +#ifdef WITH_ROOT + Event* CaTSEvt = new Event(); + CaTSEvt->SetEventNr(event->GetEventID()); + std::map>*hcmap = CaTSEvt->GetHCMap(); +#endif // end WITH_ROOT +#ifdef WITH_G4OPTICKS + if (ConfigurationManager::getInstance()->isEnable_opticks()) { + G4Opticks* g4ok = G4Opticks::Get(); + G4int eventid = event->GetEventID(); + g4ok->propagateOpticalPhotons(eventid); + unsigned num_hits = g4ok->getNumHit(); + G4cout << "EndOfEventAction: num_hits: " << num_hits << G4endl; + if (num_hits > 0) { + G4HCtable* hctable = G4SDManager::GetSDMpointer()->GetHCtable(); + for (G4int i = 0; i < hctable->entries(); ++i) { + std::string sdn = hctable->GetSDname(i); + std::size_t found = sdn.find("Photondetector"); + if (found != std::string::npos) { + PhotonSD* aSD = + (PhotonSD*) G4SDManager::GetSDMpointer()->FindSensitiveDetector( + sdn); + aSD->AddOpticksHits(); + } + } + } + if (verbose) { + G4cout << "***********************************************************" + "********************************************************" + << G4endl; + G4cout << " EndOfEventAction: numphotons: " << g4ok->getNumPhotons() + << " Gensteps: " << g4ok->getNumGensteps() + << " Maxgensteps: " << g4ok->getMaxGensteps() << G4endl; + G4cout << " EndOfEventAction: num_hits: " << g4ok->getNumHit() << G4endl; + G4cout << g4ok->dbgdesc() << G4endl; + } + g4ok->reset(); + if (verbose) { + G4cout << "========================== After reset: " << G4endl; + G4cout << " EndOfEventAction: numphotons: " << g4ok->getNumPhotons() + << " Gensteps: " << g4ok->getNumGensteps() + << " Maxgensteps: " << g4ok->getMaxGensteps() << G4endl; + G4cout << "EndOfEventAction: num_hits: " << g4ok->getNumHit() << G4endl; + G4cout << g4ok->dbgdesc() << G4endl; + G4cout << "***********************************************************" + "********************************************************" + << G4endl; + } + } // end isEnable_opticks +#endif // end WITH_G4OPTICKS + // + // Now we deal with the Geant4 Hit collections. + // + if (verbose) + G4cout << "Number of collections: " << HCE->GetNumberOfCollections() + << G4endl; +#ifdef WITH_ROOT + if (ConfigurationManager::getInstance()->isWriteHits()) { + for (int i = 0; i < HCE->GetNumberOfCollections(); i++) { + G4VHitsCollection* hc = HCE->GetHC(i); + G4String hcname = hc->GetName(); + std::vector y = split(hcname, '_'); + std::string Classname = y[1]; + if (verbose) + G4cout << "Classname: " << Classname << G4endl; + if (Classname == "lArTPC") { + std::vector hitsVector; + G4int NbHits = hc->GetSize(); + for (G4int ii = 0; ii < NbHits; ii++) { + G4VHit* hit = hc->GetHit(ii); + lArTPCHit* tpcHit = dynamic_cast (hit); + hitsVector.push_back(tpcHit); + } + hcmap->insert(std::make_pair(hcname, hitsVector)); + } else if (Classname == "Photondetector") { + std::vector hitsVector; + G4int NbHits = hc->GetSize(); + if (verbose) + G4cout << "Photondetector size: " << hc->GetSize() << G4endl; + for (G4int ii = 0; ii < NbHits; ii++) { + G4VHit* hit = hc->GetHit(ii); + PhotonHit* pHit = dynamic_cast (hit); + hitsVector.push_back(pHit); + } + hcmap->insert(std::make_pair(hcname, hitsVector)); + } else if (Classname == "Target") { + std::vector hitsVector; + G4int NbHits = hc->GetSize(); + if (verbose) + G4cout << "Interaction size: " << hc->GetSize() << G4endl; + for (G4int ii = 0; ii < NbHits; ii++) { + G4VHit* hit = hc->GetHit(ii); + InteractionHit* iaHit = dynamic_cast (hit); + hitsVector.push_back(iaHit); + } + hcmap->insert(std::make_pair(hcname, hitsVector)); + } else if (Classname == "Tracker") { + std::vector hitsVector; + G4int NbHits = hc->GetSize(); + if (verbose) + G4cout << "Tracker size: " << hc->GetSize() << G4endl; + for (G4int ii = 0; ii < NbHits; ii++) { + G4VHit* hit = hc->GetHit(ii); + TrackerHit* tHit = dynamic_cast (hit); + hitsVector.push_back(tHit); + } + hcmap->insert(std::make_pair(hcname, hitsVector)); + } else if (Classname == "Msc") { + std::vector hitsVector; + G4int NbHits = hc->GetSize(); + if (verbose) + G4cout << "Msc size: " << hc->GetSize() << G4endl; + for (G4int ii = 0; ii < NbHits; ii++) { + G4VHit* hit = hc->GetHit(ii); + MscHit* mscHit = dynamic_cast (hit); + hitsVector.push_back(mscHit); + } + hcmap->insert(std::make_pair(hcname, hitsVector)); + } else if (Classname == "Calorimeter") { + std::vector hitsVector; + G4int NbHits = hc->GetSize(); + if (verbose) + G4cout << "Calorimeter size: " << hc->GetSize() << G4endl; + for (G4int ii = 0; ii < NbHits; ii++) { + G4VHit* hit = hc->GetHit(ii); + CalorimeterHit* cHit = dynamic_cast (hit); + hitsVector.push_back(cHit); + } + hcmap->insert(std::make_pair(hcname, hitsVector)); + } else if (Classname == "DRCalorimeter") { + std::vector hitsVector; + G4int NbHits = hc->GetSize(); + if (verbose) + G4cout << "DRCalorimeter size: " << hc->GetSize() << G4endl; + for (G4int ii = 0; ii < NbHits; ii++) { + G4VHit* hit = hc->GetHit(ii); + DRCalorimeterHit* drHit = dynamic_cast (hit); + hitsVector.push_back(drHit); + } + hcmap->insert(std::make_pair(hcname, hitsVector)); + } else { + G4cout << "SD type: " << Classname << " unknown" << G4endl; + } + } + G4AutoLock lock(&ionIdMapMutex); + RootIO::GetInstance()->Write(CaTSEvt); + CaTSEvt->Reset(); + delete CaTSEvt; + } // end enableio +#endif +} + +std::vector& EventAction::split(const std::string& s, char delim, + std::vector& elems) { + std::stringstream ss(s); + std::string item; + while (std::getline(ss, item, delim)) { + elems.push_back(item); + } + return elems; +} + +std::vector EventAction::split(const std::string& s, char delim) { + std::vector elems; + return split(s, delim, elems); +} diff --git a/environments/g4py/tests/gtest01/module/Particles.cc b/examples/advanced/CaTS/src/InteractionHit.cc similarity index 54% rename from environments/g4py/tests/gtest01/module/Particles.cc rename to examples/advanced/CaTS/src/InteractionHit.cc index be72d0f596..ab28cd8d8a 100644 --- a/environments/g4py/tests/gtest01/module/Particles.cc +++ b/examples/advanced/CaTS/src/InteractionHit.cc @@ -23,58 +23,60 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// Particles.cc +// ******************************************************************** // -// Physics list for defining particles +// CaTS (Calorimetry and Tracking Simulation) // -// ==================================================================== -#include "Particles.hh" +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file InteractionHit.cc +/// \brief Implementation of the CaTS::InteractionHit class -#include "G4LeptonConstructor.hh" -#include "G4BosonConstructor.hh" -#include "G4MesonConstructor.hh" -#include "G4BaryonConstructor.hh" -#include "G4ShortLivedConstructor.hh" -#include "G4IonConstructor.hh" +#include +#include "InteractionHit.hh" +template +class G4Allocator; +G4ThreadLocal G4Allocator* InteractionHitAllocator = nullptr; -// ==================================================================== -// -// class description -// -// ==================================================================== +InteractionHit::InteractionHit() + : G4VHit() +{} -////////////////////////////////////// -Particles::Particles() - : G4VPhysicsConstructor("Particles") -////////////////////////////////////// +InteractionHit::InteractionHit(G4String pn, G4double p, G4double e, G4double t) + : G4VHit() { + fpname = pn; // name of secondary particle + fpmom = p; // momentum of secondary particle + fEkin = e; // kinetic energy of secondary particle + ftheta = t; // theta of secondary particle } - -/////////////////////// -Particles::~Particles() -/////////////////////// +InteractionHit::InteractionHit(const InteractionHit& right) + : G4VHit() { + fpname = right.fpname; + fpmom = right.fpmom; + fEkin = right.fEkin; + ftheta = right.ftheta; } - -/////////////////////////////////// -void Particles::ConstructParticle() -/////////////////////////////////// +const InteractionHit& InteractionHit::operator=(const InteractionHit& right) { - G4LeptonConstructor::ConstructParticle(); - G4BosonConstructor::ConstructParticle(); - G4MesonConstructor::ConstructParticle(); - G4BaryonConstructor::ConstructParticle(); - G4ShortLivedConstructor::ConstructParticle(); - G4IonConstructor::ConstructParticle(); + fpname = right.fpname; + fpmom = right.fpmom; + fEkin = right.fEkin; + ftheta = right.ftheta; + return *this; } - -////////////////////////////////// -void Particles::ConstructProcess() -////////////////////////////////// +G4int InteractionHit::operator==(const InteractionHit& right) const { + return (this == &right) ? 1 : 0; } - diff --git a/examples/advanced/CaTS/src/InteractionSD.cc b/examples/advanced/CaTS/src/InteractionSD.cc new file mode 100644 index 0000000000..0a37e7d628 --- /dev/null +++ b/examples/advanced/CaTS/src/InteractionSD.cc @@ -0,0 +1,138 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file InteractionSD.cc +/// \brief Implementation of the CaTS::InteractionSD class + +// Geant4 headers: +#include "G4HCofThisEvent.hh" +#include "G4Step.hh" +#include "G4ThreeVector.hh" +#include "G4SDManager.hh" +#include "G4ios.hh" +#include "G4SystemOfUnits.hh" +// project headers +#include "InteractionSD.hh" +#include "ParticleChange.hh" + +InteractionSD::InteractionSD(G4String name) + : G4VSensitiveDetector(name) +{ + G4String HCname = name + "_HC"; + collectionName.insert(HCname); + G4cout << collectionName.size() << " InteractionSD name: " << name + << " collection Name: " << HCname << G4endl; + fHCID = -1; +} + +InteractionSD::~InteractionSD() +{ + delete fFirstInter; + delete fOtherInter; +} + +void InteractionSD::Initialize(G4HCofThisEvent* HCE) +{ + G4cout << "Hits Collection capacity: " << HCE->GetCapacity() << G4endl; + fInteractionHitsCollection = + new InteractionHitsCollection(SensitiveDetectorName, collectionName[0]); + if(fHCID < 0) + { + G4cout << "InteractionSD::Initialize: " << SensitiveDetectorName << " " + << collectionName[0] << G4endl; + fHCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); + } + HCE->AddHitsCollection(fHCID, fInteractionHitsCollection); + fFirstInter = new ParticleChange(true); + fOtherInter = new ParticleChange(); +} + +G4bool InteractionSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) +{ + G4int nsc = fFirstInter->GetNumberOfSecondaries(); + if(nsc > 0) + { + for(G4int i = 0; i < nsc; i++) + { + delete fFirstInter->GetSecondary(i); + } + fFirstInter->Clear(); + } + nsc = fOtherInter->GetNumberOfSecondaries(); + if(nsc > 0) + { + for(G4int i = 0; i < nsc; i++) + { + delete fOtherInter->GetSecondary(i); + } + fOtherInter->Clear(); + } + const std::vector* secs = aStep->GetSecondaryInCurrentStep(); + G4int nsec = secs->size(); + for(G4int i = 0; i < nsec; i++) + { + G4Track* tr = new G4Track(*((*secs)[i])); + if(aStep->GetTrack()->GetTrackStatus() != fAlive) // track looses identity + { + if(aStep->GetTrack()->GetParentID() == 0) // primary track + { + fFirstInter->AddSecondary(tr); + } + else // secondary track, and it's also looses identity (re-interaction) + { + fOtherInter->AddSecondary(tr); + } + } + } // end loop over secondaries + G4int NSec = fFirstInter->GetNumberOfSecondaries(); + if(NSec > 0) + { + const G4DynamicParticle* sec = 0; + for(G4int i = 0; i < NSec; i++) + { + sec = fFirstInter->GetSecondary(i)->GetDynamicParticle(); + const G4String& pname = sec->GetDefinition()->GetParticleName(); + G4double pmom = (sec->GetTotalMomentum()) / GeV; + G4double Ekin = (sec->GetKineticEnergy()) / GeV; + G4double theta = (sec->GetMomentum()).theta(); + InteractionHit* newHit = new InteractionHit(pname, pmom, Ekin, theta); + fInteractionHitsCollection->insert(newHit); + } + } + return true; +} diff --git a/environments/g4py/tests/gtest01/module/QEventAction.cc b/examples/advanced/CaTS/src/MscHit.cc similarity index 59% rename from environments/g4py/tests/gtest01/module/QEventAction.cc rename to examples/advanced/CaTS/src/MscHit.cc index b26aa86379..18c614b82c 100644 --- a/environments/g4py/tests/gtest01/module/QEventAction.cc +++ b/examples/advanced/CaTS/src/MscHit.cc @@ -23,46 +23,59 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// QEventAction.cc +// ******************************************************************** // -// 2005 Q -// ==================================================================== -#include "QEventAction.hh" -#include "globals.hh" - -// ==================================================================== +// CaTS (Calorimetry and Tracking Simulation) // -// class description +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) // -// ==================================================================== +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file MscHit.cc +/// \brief Implementation of the CaTS::MscHit class -//////////////////////////// -QEventAction::QEventAction() -//////////////////////////// +// Geant4 headers +#include +#include +// project headers +#include "MscHit.hh" + +template +class G4Allocator; +G4ThreadLocal G4Allocator* MscHitAllocator = nullptr; + +MscHit::MscHit() + : G4VHit() +{} +MscHit::MscHit(G4double E, G4ThreeVector mom) + : G4VHit() { + this->fkinE = E; + this->fmomentum = mom; } - -///////////////////////////// -QEventAction::~QEventAction() -///////////////////////////// +MscHit::MscHit(const MscHit& right) + : G4VHit() { + fkinE = right.fkinE; + fmomentum = right.fmomentum; } - -//////////////////////////////////////////////////////////// -void QEventAction::BeginOfEventAction(const G4Event* /*aevent*/) -//////////////////////////////////////////////////////////// +const MscHit& MscHit::operator=(const MscHit& right) { - G4cout << "QEventAction::BofEA is called." << G4endl; + fkinE = right.fkinE; + fmomentum = right.fmomentum; + return *this; } - -////////////////////////////////////////////////////////// -void QEventAction::EndOfEventAction(const G4Event* /*aevent*/) -////////////////////////////////////////////////////////// +G4bool MscHit::operator==(const MscHit& right) const { - G4cout << "QEventAction::EofEA is called." << G4endl; + return (this == &right) ? true : false; } +void MscHit::Draw() {} diff --git a/examples/advanced/CaTS/src/MscSD.cc b/examples/advanced/CaTS/src/MscSD.cc new file mode 100644 index 0000000000..6568aa911e --- /dev/null +++ b/examples/advanced/CaTS/src/MscSD.cc @@ -0,0 +1,101 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file MscSD.cc +/// \brief Implementation of the CaTS::MscSD class + +// Geant4 headers +#include "G4HCofThisEvent.hh" +#include "G4Step.hh" +#include "G4SDManager.hh" +// project headers +#include "MscSD.hh" +#include "ConfigurationManager.hh" + +MscSD::MscSD(G4String name) + : G4VSensitiveDetector(name) +{ + G4String HCname = name + "_HC"; + collectionName.insert(HCname); + G4cout << collectionName.size() << " MscSD name: " << name + << " collection Name: " << HCname << G4endl; + fHCID = -1; + verbose = ConfigurationManager::getInstance()->isEnable_verbose(); +} + +void MscSD::Initialize(G4HCofThisEvent* hce) +{ + fMscHitsCollection = + new MscHitsCollection(SensitiveDetectorName, collectionName[0]); + if(fHCID < 0) + { + if(verbose) + G4cout << "MscSD::Initialize: " << SensitiveDetectorName << " " + << collectionName[0] << G4endl; + fHCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); + } + hce->AddHitsCollection(fHCID, fMscHitsCollection); + done = false; +} + +G4bool MscSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) +{ + if(!done) + { + if(aStep->GetTrack()->GetParentID() == + 0) // only care about the primary particle + { + const G4StepPoint* postStep = aStep->GetPostStepPoint(); + if(postStep->GetStepStatus() == fGeomBoundary) + { + MscHit* newHit = + new MscHit(postStep->GetKineticEnergy(), postStep->GetMomentum()); + fMscHitsCollection->insert(newHit); + done = true; + } + } + } + return true; +} + +void MscSD::EndOfEvent(G4HCofThisEvent*) +{ + G4int NbHits = fMscHitsCollection->entries(); + if(verbose) + G4cout << " Number of MscHits: " << NbHits << G4endl; +} diff --git a/examples/advanced/CaTS/src/PhotonHit.cc b/examples/advanced/CaTS/src/PhotonHit.cc new file mode 100644 index 0000000000..490470c240 --- /dev/null +++ b/examples/advanced/CaTS/src/PhotonHit.cc @@ -0,0 +1,118 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file PhotonHit.cc +/// \brief Implementation of the CaTS::PhotonHit class + +// Geant4 headers +#include "PhotonHit.hh" +#include "G4VVisManager.hh" +#include "G4Circle.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include +#include +#include +// project headers +#include "PhotonHit.hh" + +template +class G4Allocator; +G4ThreadLocal G4Allocator* PhotonHitAllocator = nullptr; + +PhotonHit::PhotonHit() + : G4VHit() +{} + +PhotonHit::PhotonHit(unsigned iid, unsigned ipid, G4double iwavelength, + G4double itime, G4ThreeVector iposition, + G4ThreeVector idirection, G4ThreeVector ipolarization) + : G4VHit() +{ + fid = iid; + fpid = ipid; + fwavelength = iwavelength; + ftime = itime; + fposition = iposition; + fdirection = idirection; + fpolarization = ipolarization; +} + +PhotonHit::PhotonHit(const PhotonHit& right) + : G4VHit() +{ + fid = right.fid; + fpid = right.fpid; + fwavelength = right.fwavelength; + ftime = right.ftime; + fposition = right.fposition; + fdirection = right.fdirection; + fpolarization = right.fpolarization; +} + +const PhotonHit& PhotonHit::operator=(const PhotonHit& right) +{ + fid = right.fid; + fpid = right.fpid; + fwavelength = right.fwavelength; + ftime = right.ftime; + fposition = right.fposition; + fdirection = right.fdirection; + fpolarization = right.fpolarization; + return *this; +} + +G4bool PhotonHit::operator==(const PhotonHit& right) const +{ + return (this == &right) ? true : false; +} + +void PhotonHit::Draw() +{ + G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); + if(pVVisManager) + { + G4Circle circle(fposition); + circle.SetScreenSize(2.); + circle.SetFillStyle(G4Circle::filled); + G4Colour colour(1., 0., 0.); + G4VisAttributes attribs(colour); + circle.SetVisAttributes(attribs); + pVVisManager->Draw(circle); + } +} diff --git a/examples/advanced/CaTS/src/PhotonSD.cc b/examples/advanced/CaTS/src/PhotonSD.cc new file mode 100644 index 0000000000..15210ae683 --- /dev/null +++ b/examples/advanced/CaTS/src/PhotonSD.cc @@ -0,0 +1,154 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file PhotonSD.cc +/// \brief Implementation of the CaTS::PhotonSD class + +// Geant4 headers +#include "G4VProcess.hh" +#include "G4OpticalPhoton.hh" +#include "G4HCofThisEvent.hh" +#include "G4Step.hh" +#include "G4SDManager.hh" +#include "ConfigurationManager.hh" +// project headers +#include "PhotonSD.hh" +#ifdef WITH_G4OPTICKS +# include "G4Opticks.hh" +# include "TrackInfo.hh" +# include "OpticksGenstep.h" +# include "OpticksFlags.hh" +# include "G4OpticksHit.hh" +#endif + +PhotonSD::PhotonSD(G4String name) + : G4VSensitiveDetector(name) +{ + G4String HCname = name + "_HC"; + collectionName.insert(HCname); + G4cout << collectionName.size() << " PhotonSD name: " << name + << " collection Name: " << HCname << G4endl; + fHCID = -1; + verbose = ConfigurationManager::getInstance()->isEnable_verbose(); +} + +void PhotonSD::Initialize(G4HCofThisEvent* hce) +{ + fPhotonHitsCollection = + new PhotonHitsCollection(SensitiveDetectorName, collectionName[0]); + if(fHCID < 0) + { + if(verbose) + G4cout << "PhotonSD::Initialize: " << SensitiveDetectorName << " " + << collectionName[0] << G4endl; + fHCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); + } + hce->AddHitsCollection(fHCID, fPhotonHitsCollection); +} + +G4bool PhotonSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) +{ + G4Track* theTrack = aStep->GetTrack(); + // we only deal with optical Photons: + if(theTrack->GetDefinition() != G4OpticalPhoton::OpticalPhotonDefinition()) + { + return false; + } + G4double theEdep = theTrack->GetTotalEnergy() / CLHEP::eV; + const G4VProcess* thisProcess = theTrack->GetCreatorProcess(); + G4String processname; + if(thisProcess != NULL) + processname = thisProcess->GetProcessName(); + else + processname = "No Process"; + unsigned theCreationProcessid; + if(processname == "Cerenkov") + { + theCreationProcessid = 0; + } + else if(processname == "Scintillation") + { + theCreationProcessid = 1; + } + else + { + theCreationProcessid = -1; + } + PhotonHit* newHit = new PhotonHit( + 0, theCreationProcessid, etolambda(theEdep), theTrack->GetGlobalTime(), + aStep->GetPostStepPoint()->GetPosition(), + aStep->GetPostStepPoint()->GetMomentumDirection(), + aStep->GetPostStepPoint()->GetPolarization()); + fPhotonHitsCollection->insert(newHit); + theTrack->SetTrackStatus(fStopAndKill); + return true; +} + +void PhotonSD::EndOfEvent(G4HCofThisEvent*) +{ + if(verbose) + { + G4int NbHits = fPhotonHitsCollection->entries(); + G4cout << " PhotonSD::EndOfEvent Number of PhotonHits: " << NbHits + << G4endl; + } +} +#ifdef WITH_G4OPTICKS +void PhotonSD::AddOpticksHits() +{ + G4Opticks* g4ok = G4Opticks::Get(); + bool way_enabled = g4ok->isWayEnabled(); + unsigned num_hits = g4ok->getNumHit(); + if(verbose) + G4cout << "PhotonSD::AddOpticksHits PhotonHits: " << num_hits << G4endl; + G4OpticksHit hit; + G4OpticksHitExtra hit_extra; + G4OpticksHitExtra* hit_extra_ptr = way_enabled ? &hit_extra : NULL; + for(unsigned i = 0; i < num_hits; i++) + { + g4ok->getHit(i, &hit, hit_extra_ptr); + PhotonHit* newHit = + new PhotonHit(i, 0, hit.wavelength, hit.time, hit.global_position, + hit.global_direction, hit.global_polarization); + fPhotonHitsCollection->insert(newHit); + } + if(verbose) + G4cout << "AddOpticksHits size: " << fPhotonHitsCollection->entries() + << G4endl; +} +#endif diff --git a/examples/advanced/CaTS/src/PhysicsConfigurator.cc b/examples/advanced/CaTS/src/PhysicsConfigurator.cc new file mode 100644 index 0000000000..3878fa6885 --- /dev/null +++ b/examples/advanced/CaTS/src/PhysicsConfigurator.cc @@ -0,0 +1,146 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file PhysicsConfigurator.cc +/// \brief Implementation of the CaTS::PhysicsConfigurator class + +// Geant4 headers +#include "G4String.hh" +#include "G4VModularPhysicsList.hh" +#include "G4PhysListFactoryAlt.hh" +#include "G4PhysicsConstructorRegistry.hh" +#include "G4PhysListRegistry.hh" +#include "G4OpticalParameters.hh" +#include "G4NeutronTrackingCut.hh" +#include "G4StepLimiter.hh" +#include "G4StepLimiterPhysics.hh" +#include "G4SystemOfUnits.hh" +// project Headers +#include "PhysicsConfigurator.hh" +#include "ConfigurationManager.hh" +// c++ headers +#include +PhysicsConfigurator* PhysicsConfigurator::instance = 0; + +G4VModularPhysicsList* PhysicsConfigurator::Construct(G4String physName) +{ + // + // Access to registries and factories + // + G4PhysicsConstructorRegistry* g4pcr = + G4PhysicsConstructorRegistry::Instance(); + G4PhysListRegistry* g4plr = G4PhysListRegistry::Instance(); + G4bool verbose = ConfigurationManager::getInstance()->isEnable_verbose(); + if(verbose) + { + G4cout << "Available Physics Constructors: " + << g4pcr->AvailablePhysicsConstructors().size() << G4endl; + G4cout << "Available Physics Lists: " + << g4plr->AvailablePhysLists().size() << G4endl; + G4cout << "Available Physics Extensions: " + << g4plr->AvailablePhysicsExtensions().size() << G4endl; + G4cout << "Available Physics Lists Em: " + << g4plr->AvailablePhysListsEM().size() << G4endl; + g4plr->SetVerbose(1); + } + else + { + g4plr->SetVerbose(0); + } + g4plr->AddPhysicsExtension("OPTICAL", "G4OpticalPhysics"); + g4plr->AddPhysicsExtension("STEPLIMIT", "G4StepLimiterPhysics"); + g4plr->AddPhysicsExtension("NEUTRONLIMIT", "G4NeutronTrackingCut"); + if(verbose) + { + g4pcr->PrintAvailablePhysicsConstructors(); + g4plr->PrintAvailablePhysLists(); + } + g4alt::G4PhysListFactory factory; + G4VModularPhysicsList* phys = nullptr; + if(verbose) + G4cout << "Physics configuration: " << physName << G4endl; + // + // currently using the Constructor names doesn't work otherwise it would be: + // G4String physName = "FTFP_BERT+G4OpticalPhysics+G4StepLimiterPhysics"; + // using the name doesn't work either + // G4String physName = "FTFP_BERT+Optical+stepLimiter"; + // reference PhysicsList via its name + // + if(factory.IsReferencePhysList(physName)) + { + phys = factory.GetReferencePhysList(physName); + } + else + { + G4cout << "Not a reference physics list" << G4endl; + g4plr->PrintAvailablePhysLists(); + exit(EXIT_FAILURE); + } + if(verbose) + { + G4cout << phys->GetPhysicsTableDirectory() << G4endl; + } + G4OpticalParameters::Instance()->SetProcessActivation("Cerenkov", true); + G4OpticalParameters::Instance()->SetProcessActivation("Scintillation", true); + G4OpticalParameters::Instance()->SetProcessActivation("OpAbsorption", true); + G4OpticalParameters::Instance()->SetProcessActivation("OpRayleigh", true); + G4OpticalParameters::Instance()->SetProcessActivation("OpMieHG", false); + G4OpticalParameters::Instance()->SetProcessActivation("OpWLS", true); + G4OpticalParameters::Instance()->SetProcessActivation("OpWLS2", false); + + G4OpticalParameters::Instance()->SetCerenkovStackPhotons(false); + G4OpticalParameters::Instance()->SetScintStackPhotons(false); + G4OpticalParameters::Instance()->SetScintTrackSecondariesFirst( + true); // only relevant if we actually stack and trace the optical photons + G4OpticalParameters::Instance()->SetCerenkovTrackSecondariesFirst( + true); // only relevant if we actually stack and trace the optical photons + G4OpticalParameters::Instance()->SetCerenkovMaxPhotonsPerStep(100); + G4OpticalParameters::Instance()->SetCerenkovMaxBetaChange(10.0); + if(verbose) + { + phys->DumpList(); + } + return phys; +} + +PhysicsConfigurator* PhysicsConfigurator::getInstance() +{ + if(instance == 0) + instance = new PhysicsConfigurator(); + return instance; +} diff --git a/examples/advanced/CaTS/src/PrimaryGeneratorAction.cc b/examples/advanced/CaTS/src/PrimaryGeneratorAction.cc new file mode 100644 index 0000000000..c34ffe656b --- /dev/null +++ b/examples/advanced/CaTS/src/PrimaryGeneratorAction.cc @@ -0,0 +1,103 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the CaTS::PrimaryGeneratorAction class + +// Geant4 headers: +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleGun.hh" +#include "G4GeneralParticleSource.hh" +#include "G4HEPEvtInterface.hh" +#include "G4Version.hh" +#include "G4GenericMessenger.hh" +// project headers: +#include "PrimaryGeneratorAction.hh" +// c++ headers: +#include + +PrimaryGeneratorAction::PrimaryGeneratorAction() +{ + DefineCommands(); + G4int n_particle = 1; + G4ParticleGun* fParticleGun = new G4ParticleGun(n_particle); + G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); + G4String particleName; + G4ParticleDefinition* particle = + particleTable->FindParticle(particleName = "mu+"); + fParticleGun->SetParticleDefinition(particle); + fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0., 0., 1.)); + fParticleGun->SetParticleEnergy(10. * CLHEP::GeV); + fParticleGun->SetParticlePosition(G4ThreeVector(0., 0., 0.)); + gentypeMap["particleGun"] = fParticleGun; + gentypeMap["GPS"] = new G4GeneralParticleSource; + fcurrentGenerator = gentypeMap["particleGun"]; + fcurrentGeneratorName = "particleGun"; +} + +PrimaryGeneratorAction::~PrimaryGeneratorAction() +{ + delete fMessenger; + for( auto& gentype : gentypeMap ) + { + delete gentype.second; + } +} + +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +{ + fcurrentGenerator->GeneratePrimaryVertex(anEvent); +} + +void PrimaryGeneratorAction::DefineCommands() +{ + fMessenger = new G4GenericMessenger(this, "/CaTS/primaryGenerator/", + "select primary Generator"); + // command to select primary Generator + fMessenger + ->DeclareMethod("setGenerator", &PrimaryGeneratorAction::SetGenerator) + .SetGuidance("Select the primary Generator (Available generators : " + "particleGun,GPS") + .SetParameterName("generator", true) + .SetDefaultValue("particleGun") + .SetCandidates("particleGun GPS"); + fMessenger->DeclareMethod("Print", &PrimaryGeneratorAction::Print) + .SetGuidance("Print name of primary generator") + .SetStates(G4State_PreInit, G4State_Idle); +} diff --git a/examples/advanced/CaTS/src/RadiatorSD.cc b/examples/advanced/CaTS/src/RadiatorSD.cc new file mode 100644 index 0000000000..d4fe4ba30b --- /dev/null +++ b/examples/advanced/CaTS/src/RadiatorSD.cc @@ -0,0 +1,265 @@ +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file RadiatorSD.cc +/// \brief Implementation of the CaTS::RadiatorSD class + +// Geant4 headers +#include "G4Step.hh" +#include "G4Track.hh" +#ifdef WITH_G4OPTICKS +# include "G4ThreeVector.hh" +# include "G4ios.hh" +# include "G4UnitsTable.hh" +# include "G4SystemOfUnits.hh" +# include "G4VProcess.hh" +# include "G4VRestDiscreteProcess.hh" +# include "G4SDManager.hh" +# include "G4HCofThisEvent.hh" +# include "G4Opticks.hh" +# include "TrackInfo.hh" +# include "OpticksGenstep.h" +# include "OpticksFlags.hh" +# include "G4OpticksHit.hh" +# include "G4EventManager.hh" +# include "G4Event.hh" +# include "G4RunManager.hh" +# include "G4Version.hh" +# include "PhotonSD.hh" +# include "G4Cerenkov.hh" +# include "G4Scintillation.hh" +# include +#endif +// project headers +#include "RadiatorSD.hh" +#include "ConfigurationManager.hh" + +RadiatorSD::RadiatorSD(G4String name) + : G4VSensitiveDetector(name) +{ + verbose = ConfigurationManager::getInstance()->isEnable_verbose(); +} + +void RadiatorSD::Initialize(G4HCofThisEvent*) {} + +G4bool RadiatorSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) +{ + G4double edep = aStep->GetTotalEnergyDeposit(); + if(edep == 0.) + return false; + // only deal with charged particles + G4Track* aTrack = aStep->GetTrack(); + G4double charge = aTrack->GetDynamicParticle()->GetCharge(); + if(charge == 0) + return false; +#ifdef WITH_G4OPTICKS + if(ConfigurationManager::getInstance()->isEnable_opticks()) + { + G4int materialIndex = 0; + if(first) + { + aMaterial = aTrack->GetMaterial(); + materialIndex = aMaterial->GetIndex(); + if(verbose) + { + G4cout << "*******************************" << G4endl; + G4cout << "RadiatorSD::ProcessHits initializing Material: " + << aMaterial->GetName() << " " << G4endl; + G4cout << "RadiatorSD::ProcessHits: Name " + << aStep->GetPreStepPoint() + ->GetPhysicalVolume() + ->GetLogicalVolume() + ->GetName() + << G4endl; + } + aMaterialPropertiesTable = aMaterial->GetMaterialPropertiesTable(); + if(verbose) + { + aMaterialPropertiesTable->DumpTable(); + } + // + // properties related to Scintillation + // +# if(G4VERSION_NUMBER > 1072) + YieldRatio = + aMaterialPropertiesTable->GetConstProperty(kSCINTILLATIONYIELD1) / + aMaterialPropertiesTable->GetConstProperty( + kSCINTILLATIONYIELD2); // slowerRatio, + FastTimeConstant = aMaterialPropertiesTable->GetConstProperty( + kSCINTILLATIONTIMECONSTANT1); // TimeConstant, + SlowTimeConstant = aMaterialPropertiesTable->GetConstProperty( + kSCINTILLATIONTIMECONSTANT2); // slowerTimeConstant, +# else + Fast_Intensity = aMaterialPropertiesTable->GetProperty(kFASTCOMPONENT); + Slow_Intensity = aMaterialPropertiesTable->GetProperty(kSLOWCOMPONENT); + YieldRatio = aMaterialPropertiesTable->GetConstProperty(kYIELDRATIO); +# endif + ScintillationType = Slow; + // + // properties related to Cerenkov + // + Rindex = aMaterialPropertiesTable->GetProperty("RINDEX"); +# if(G4VERSION_NUMBER > 1072) + Pmin = Rindex->GetMinEnergy(); + Pmax = Rindex->GetMaxEnergy(); +# else + Pmin = Rindex->GetMinLowEdgeEnergy(); + Pmax = Rindex->GetMaxLowEdgeEnergy(); +# endif + dp = Pmax - Pmin; + nMax = Rindex->GetMaxValue(); + if(verbose) + { + G4cout << "nMax: " << nMax << " Pmin: " << Pmin << " Pmax: " << Pmax + << " dp: " << dp << G4endl; + Rindex->DumpValues(); + } + // + first = false; + } // end if first + G4int Sphotons = 0; // number of scintillation photons this step + G4int Cphotons = 0; // number of Cerenkov photons this step + // + // info needed for generating Cerenkov photons on the GPU; + // + G4double maxCos = 0.0; + G4double maxSin2 = 0.0; + G4double beta = 0.0; + G4double beta1 = 0.0; + G4double beta2 = 0.0; + G4double BetaInverse = 0.0; + G4double MeanNumberOfPhotons1 = 0.0; + G4double MeanNumberOfPhotons2 = 0.0; + G4SteppingManager* fpSteppingManager = G4EventManager::GetEventManager() + ->GetTrackingManager() + ->GetSteppingManager(); + G4StepStatus stepStatus = fpSteppingManager->GetfStepStatus(); + if(stepStatus != fAtRestDoItProc) + { + G4ProcessVector* procPost = fpSteppingManager->GetfPostStepDoItVector(); + size_t MAXofPostStepLoops = fpSteppingManager->GetMAXofPostStepLoops(); + for(size_t i3 = 0; i3 < MAXofPostStepLoops; i3++) + { + if((*procPost)[i3]->GetProcessName() == "Cerenkov") + { + G4Cerenkov* proc = (G4Cerenkov*) (*procPost)[i3]; + thePhysicsTable = proc->GetPhysicsTable(); + CerenkovAngleIntegrals = + (G4PhysicsOrderedFreeVector*) ((*thePhysicsTable)(materialIndex)); + Cphotons = proc->GetNumPhotons(); + if(Cphotons > 0) + { + beta1 = aStep->GetPreStepPoint()->GetBeta(); + beta2 = aStep->GetPostStepPoint()->GetBeta(); + beta = (beta1 + beta2) * 0.5; + BetaInverse = 1. / beta; + maxCos = BetaInverse / nMax; + maxSin2 = (1.0 - maxCos) * (1.0 + maxCos); + MeanNumberOfPhotons1 = + proc->GetAverageNumberOfPhotons(charge, beta1, aMaterial, Rindex); + MeanNumberOfPhotons2 = + proc->GetAverageNumberOfPhotons(charge, beta2, aMaterial, Rindex); + } + } + if((*procPost)[i3]->GetProcessName() == "Scintillation") + { + G4Scintillation* proc1 = (G4Scintillation*) (*procPost)[i3]; + Sphotons = proc1->GetNumPhotons(); + } + } + } + tSphotons += Sphotons; + tCphotons += Cphotons; + G4ThreeVector deltaPosition = aStep->GetDeltaPosition(); + G4double ScintillationTime = 0. * ns; + G4int scntId = 1; + G4StepPoint* pPreStepPoint = aStep->GetPreStepPoint(); + G4ThreeVector x0 = pPreStepPoint->GetPosition(); + G4ThreeVector p0 = aStep->GetDeltaPosition().unit(); + // + // harvest the Scintillation photon gensteps: + // + if(Sphotons > 0) + { + G4double ScintillationRiseTime = 0.0; + G4Opticks::Get()->collectGenstep_G4Scintillation_1042( + aTrack, aStep, Sphotons, scntId, ScintillationTime, + ScintillationRiseTime); + } + // + // harvest the Cerenkov photon gensteps: + // + if(Cphotons > 0) + { + G4Opticks::Get()->collectGenstep_G4Cerenkov_1042( + aTrack, aStep, Cphotons, BetaInverse, Pmin, Pmax, maxCos, maxSin2, + MeanNumberOfPhotons1, MeanNumberOfPhotons2); + } + G4Opticks* g4ok = G4Opticks::Get(); + G4RunManager* rm = G4RunManager::GetRunManager(); + const G4Event* event = rm->GetCurrentEvent(); + G4int eventid = event->GetEventID(); + G4OpticksHit hit; + unsigned num_photons = g4ok->getNumPhotons(); + if(num_photons > ConfigurationManager::getInstance()->getMaxPhotons()) + { + g4ok->propagateOpticalPhotons(eventid); + G4HCtable* hctable = G4SDManager::GetSDMpointer()->GetHCtable(); + for(G4int i = 0; i < hctable->entries(); ++i) + { + std::string sdn = hctable->GetSDname(i); + std::size_t found = sdn.find("Photondetector"); + if(found != std::string::npos) + { + PhotonSD* aSD = + (PhotonSD*) G4SDManager::GetSDMpointer()->FindSensitiveDetector( + sdn); + aSD->AddOpticksHits(); + } + } + g4ok->reset(); + } + } +#endif + return true; +} + +void RadiatorSD::EndOfEvent(G4HCofThisEvent*) +{ + tSphotons = 0; + tCphotons = 0; +} diff --git a/examples/advanced/CaTS/src/RootIO.cc b/examples/advanced/CaTS/src/RootIO.cc new file mode 100644 index 0000000000..edbd3d66ec --- /dev/null +++ b/examples/advanced/CaTS/src/RootIO.cc @@ -0,0 +1,174 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// November 10th, 2021 : implement writing one file +// per worker thread which are then merged +// +// ******************************************************************** +// +/// \file RootIO.cc +/// \brief Implementation of the CaTS::RootIO class + +#ifdef WITH_ROOT +// Project headers +#include "RootIO.hh" +#include "ConfigurationManager.hh" +#include "Event.hh" +// Geant4 headers +#include +#include +#include +#include +// Root headers +#include "TBranch.h" +#include "TFile.h" +#include "TObject.h" +#include "TSystem.h" +#include "TTree.h" +#include "TROOT.h" +// c++ headers +#include +#include + +G4ThreadLocal RootIO* RootIO::fgInstance = nullptr; +// mutex in a file scope +namespace { + // Mutex to lock RootIO constructor + G4Mutex RootIOMutex = G4MUTEX_INITIALIZER; +} // namespace + +RootIO::RootIO() { + G4AutoLock lock(&RootIOMutex); + TSystem ts; + gSystem->Load("libCaTSClassesDict"); + if (G4Threading::IsMultithreadedApplication()) { + if (G4Threading::IsWorkerThread()) { + G4String fFilename = ConfigurationManager::getInstance()->getfname() + + "_Thread_" + + std::to_string(G4Threading::G4GetThreadId()) + ".root"; + G4cout << "RootIO:: Opening File: " << fFilename << G4endl; + fFile = new TFile(fFilename.c_str(), "RECREATE"); + TTree::SetMaxTreeSize(1000 * Long64_t(2000000000)); + // Create a ROOT Tree and one superbranch + ftree = new TTree("Events", "ROOT tree containing Hit collections"); + ftree->SetAutoSave(1000000000); // autosave when 1 Gbyte written + Int_t branchStyle = 1; + TTree::SetBranchStyle(branchStyle); + } + } else { + G4String fFilename = ConfigurationManager::getInstance()->getfname() + ".root"; + G4cout << "RootIO:: Opening File: " << fFilename << G4endl; + fFile = new TFile(fFilename.c_str(), "RECREATE"); + TTree::SetMaxTreeSize(1000 * Long64_t(2000000000)); + // Create a ROOT Tree and one superbranch + ftree = new TTree("Events", "ROOT tree containing Hit collections"); + ftree->SetAutoSave(1000000000); // autosave when 1 Gbyte written + Int_t branchStyle = 1; + TTree::SetBranchStyle(branchStyle); + } +} + +RootIO* RootIO::GetInstance() { + if (fgInstance == nullptr) { + static G4ThreadLocalSingleton inst; + fgInstance = inst.Instance(); + } + return fgInstance; +} + +void RootIO::Write(Event* fevent) { + if (ConfigurationManager::getInstance()->isEnable_verbose()) + G4cout << "writing Event: " << fevent->GetEventNumber() << G4endl; + if ((fevent->GetEventNumber()) % 1000 == 0) + G4cout << "writing Event: " << fevent->GetEventNumber() << G4endl; + if (!fevtinitialized) { + Int_t bufsize = 64000; + fevtbranch = ftree->Branch("event.", &fevent, bufsize, 0); + fevtbranch->SetAutoDelete(kFALSE); + fevtinitialized = true; + } + fFile = ftree->GetCurrentFile(); // just in case we switched to a new file + fnb += ftree->Fill(); + fFile->Write("", TObject::kOverwrite); +} + +void RootIO::Close() { + G4cout << " Closing File: " << G4endl; + fFile = ftree->GetCurrentFile(); + fFile->Close(); +} + +void RootIO::Merge() { + if (G4Threading::IsMasterThread()) { + unsigned int nthreads = G4RunManager::GetRunManager()->GetNumberOfThreads(); + G4cout << "RootIO::Merging: " << nthreads << " threads" << G4endl; + G4String filename = ConfigurationManager::getInstance()->getfname(); + G4String tmpfn; + std::vector filevec; + std::vector evtvec; + std::vector treevec; + std::vector branchvec; + TList* list = new TList; + TTree* newtree; + for (unsigned int i = 0; i < nthreads; i++) { + tmpfn = filename + "_Thread_" + std::to_string(i) + ".root"; + filevec.push_back(new TFile(tmpfn.c_str())); + treevec.push_back((TTree*) (filevec[i]->Get("Events"))); + list->Add(treevec[i]); + if (i == nthreads - 1) { + G4String tmpfn2 = filename + "_Merged.root"; + TFile* fm = new TFile(tmpfn2.c_str(), "RECREATE"); + newtree = TTree::MergeTrees(list); + newtree->SetName("Events"); + Event* eventm = new Event(); + newtree->SetBranchAddress("event.", &eventm); + TBranch* fevtbranchm = newtree->GetBranch("event."); + int neventm = fevtbranchm->GetEntries(); + G4cout << "Nr. of Events: " << neventm << G4endl; + newtree->Write(); + fm->Close(); + } + } + for (unsigned int i = 0; i < nthreads; i++) { + tmpfn = filename + "_Thread_" + std::to_string(i) + ".root"; + if (remove(tmpfn.c_str()) != 0) { + G4cout << "Error deleting file: " << tmpfn << G4endl; + } else { + G4cout << "File: " << tmpfn << " successfully deleted" << G4endl; + } + } + } +} +#endif diff --git a/examples/advanced/CaTS/src/RunAction.cc b/examples/advanced/CaTS/src/RunAction.cc new file mode 100644 index 0000000000..d6d712b8af --- /dev/null +++ b/examples/advanced/CaTS/src/RunAction.cc @@ -0,0 +1,149 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file RunAction.cc +/// \brief Implementation of the CaTS::RunAction class + +#include +#include "G4Run.hh" +#ifdef WITH_G4OPTICKS +#include "G4TransportationManager.hh" +#include "G4Opticks.hh" +#endif +#ifdef WITH_ROOT +#include "G4AnalysisManager.hh" +#include "RootIO.hh" +#endif +// project headers +#include "RunAction.hh" +#include "ConfigurationManager.hh" + +RunAction::RunAction() +: G4UserRunAction() { +} + +void RunAction::BeginOfRunAction(const G4Run* aRun) { +#ifdef WITH_ROOT + if (ConfigurationManager::getInstance()->isdoAnalysis()) { + // Create the generic analysis manager + auto analysisManager = G4AnalysisManager::Instance(); + analysisManager->SetDefaultFileType("root"); + G4cout << "Using " << analysisManager->GetType() << G4endl; + analysisManager->SetVerboseLevel(1); + G4String HistoFileName = + ConfigurationManager::getInstance()->getHistoFileName(); + G4cout << "Opening Analysis output File: " << HistoFileName << G4endl; + analysisManager->SetFileName(HistoFileName); + analysisManager->OpenFile(); + // + // Book histograms, ntuple + // + // Creating 1D histograms + analysisManager->CreateH1("ENeutron", "Energy of created Neutrons", 200, 0, + 100); + analysisManager->CreateH1("EProton", "Energy of created Protons", 200, 0, + 100); + } +#endif +#ifdef WITH_G4OPTICKS + if (ConfigurationManager::getInstance()->isEnable_opticks()) { + if (!geo_initialized) { + G4cout << "\n\n###[ RunAction::BeginOfRunAction G4Opticks.setGeometry\n\n" + << G4endl; + G4VPhysicalVolume* world = + G4TransportationManager::GetTransportationManager() + ->GetNavigatorForTracking() + ->GetWorldVolume(); + assert(world); + bool standardize_geant4_materials = false; // required for alignment + G4Opticks* g4ok = G4Opticks::Get(); + g4ok->setGeometry(world, standardize_geant4_materials); + const std::vector& sensor_placements = + g4ok->getSensorPlacements(); + G4cout << "sensor_placements.size(): " << sensor_placements.size() + << G4endl; + for (unsigned i = 0; i < sensor_placements.size(); i++) { + float efficiency_1 = 0.5f; + float efficiency_2 = 1.0f; + int sensor_cat = -1; // -1:means no angular info + int sensor_identifier = + 0xc0ffee + i; // mockup a detector specific identifier + unsigned sensorIndex = 1 + i; // 1-based + g4ok->setSensorData(sensorIndex, efficiency_1, efficiency_2, sensor_cat, + sensor_identifier); + } + G4cout << "\n\n###] RunAction::BeginOfRunAction G4Opticks.setGeometry\n\n" + << G4endl; + geo_initialized = true; + } + } +#endif +} + +void RunAction::EndOfRunAction(const G4Run*) { +#ifdef WITH_G4OPTICKS + if (ConfigurationManager::getInstance()->isEnable_opticks()) { + if (ConfigurationManager::getInstance()->isEnable_verbose()) { + G4cout << "\n\n###[ RunAction::EndOfRunAction G4Opticks.Finalize\n\n" + << G4endl; + } + G4Opticks::Finalize(); + if (ConfigurationManager::getInstance()->isEnable_verbose()) { + G4cout << "\n\n###] RunAction::EndOfRunAction G4Opticks.Finalize\n\n" + << G4endl; + } + } +#endif +#ifdef WITH_ROOT + if (ConfigurationManager::getInstance()->isEnable_verbose()) { + G4cout << "##############RunAction::EndOfRunAction" << G4endl; + } + if (ConfigurationManager::getInstance()->isWriteHits()) { + if (G4Threading::IsMultithreadedApplication()) { + RootIO::GetInstance()->Merge(); + } else { + RootIO::GetInstance()->Close(); + } + } + if (ConfigurationManager::getInstance()->isdoAnalysis()) { + auto analysisManager = G4AnalysisManager::Instance(); + analysisManager->Write(); + analysisManager->CloseFile(); + } +#endif +} diff --git a/examples/advanced/CaTS/src/StackingAction.cc b/examples/advanced/CaTS/src/StackingAction.cc new file mode 100644 index 0000000000..48cd6991a2 --- /dev/null +++ b/examples/advanced/CaTS/src/StackingAction.cc @@ -0,0 +1,124 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file StackingAction.cc +/// \brief Implementation of the CaTS::StackingAction class + +// Geant4 headers +#include "G4ParticleDefinition.hh" +#include "G4Track.hh" +#include "G4ios.hh" +#include "G4VProcess.hh" +#include "G4ClassificationOfNewTrack.hh" +#include "G4GenericMessenger.hh" +// project headers +#include "StackingAction.hh" + +StackingAction::StackingAction() + : G4UserStackingAction() +{ + DefineCommands(); +} + +StackingAction::~StackingAction() { delete fMessenger; } +G4ClassificationOfNewTrack StackingAction::ClassifyNewTrack( + const G4Track* aTrack) +{ + G4ClassificationOfNewTrack classification = fWaiting; + if(aTrack->GetParentID() == 0) + return classification; + if(aTrack->GetDefinition()->GetParticleName() == "pi0") + { + if(fkillPi0) + { + classification = fKill; + } + } + if(aTrack->GetDefinition()->GetParticleName() == "eta") + { + if(fkilleta) + { + classification = fKill; + } + } + if(aTrack->GetDefinition()->GetParticleName() == "gamma") + { + if(aTrack->GetCreatorProcess()->GetProcessName() == "nCapture") + { + if(fkillGammafromnCapture) + { + classification = fKill; + } + } + } + return classification; +} + +void StackingAction::Print() +{ + G4cout << "===================================================" << G4endl; + G4cout << " StackingAction configuration: " << G4endl; + G4cout << " Kill Pi0s : " << fkillPi0 << G4endl; + G4cout << " Kill etas : " << fkilleta << G4endl; + G4cout << " Kill Gammas from neutron Capture: " << fkillGammafromnCapture + << G4endl; + G4cout << "===================================================" << G4endl; +} + +void StackingAction::DefineCommands() +{ + fMessenger = new G4GenericMessenger(this, "/CaTS/StackingAction/", + "select particles to kill"); + auto& killPi0Cmd = fMessenger->DeclareProperty("killPi0", fkillPi0); + killPi0Cmd.SetGuidance("kill Pi0 (true/false)"); + killPi0Cmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + killPi0Cmd.SetDefaultValue("false"); + auto& killetaCmd = fMessenger->DeclareProperty("killeta", fkilleta); + killetaCmd.SetGuidance("kill eta (true/false)"); + killetaCmd.SetStates(G4State_PreInit, G4State_Init, G4State_Idle); + killetaCmd.SetDefaultValue("false"); + auto& killGammafromnCaptureCmd = fMessenger->DeclareProperty( + "killGammafromnCapture", fkillGammafromnCapture); + killGammafromnCaptureCmd.SetGuidance("kill GammafromnCapture (true/false)"); + killGammafromnCaptureCmd.SetStates(G4State_PreInit, G4State_Init, + G4State_Idle); + killGammafromnCaptureCmd.SetDefaultValue("false"); + fMessenger->DeclareMethod("Print", &StackingAction::Print) + .SetGuidance("Print StackingAction configuration") + .SetStates(G4State_PreInit, G4State_Idle); +} diff --git a/examples/advanced/CaTS/src/TrackerHit.cc b/examples/advanced/CaTS/src/TrackerHit.cc new file mode 100644 index 0000000000..d9f669b5f5 --- /dev/null +++ b/examples/advanced/CaTS/src/TrackerHit.cc @@ -0,0 +1,96 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file TrackerHit.cc +/// \brief Implementation of the CaTS::TrackerHit class + +// Geant4 headers +#include "G4VVisManager.hh" +#include "G4Circle.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +// project headers +#include "TrackerHit.hh" +G4ThreadLocal G4Allocator* TrackerHitAllocator = nullptr; + +TrackerHit::TrackerHit() + : G4VHit() +{} +TrackerHit::TrackerHit(G4double iedep, G4ThreeVector iposition, G4double itime) + : G4VHit() +{ + fEdep = iedep; + fposition = iposition; + ftime = itime; +} + +TrackerHit::TrackerHit(const TrackerHit& right) + : G4VHit() +{ + fEdep = right.fEdep; + fposition = right.fposition; + ftime = right.ftime; +} + +const TrackerHit& TrackerHit::operator=(const TrackerHit& right) +{ + fEdep = right.fEdep; + fposition = right.fposition; + ftime = right.ftime; + return *this; +} + +G4bool TrackerHit::operator==(const TrackerHit& right) const +{ + return (this == &right) ? true : false; +} + +void TrackerHit::Draw() +{ + G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); + if(pVVisManager) + { + G4Circle circle(fposition); + circle.SetScreenSize(2.); + circle.SetFillStyle(G4Circle::filled); + G4Colour colour(1., 0., 0.); + G4VisAttributes attribs(colour); + circle.SetVisAttributes(attribs); + pVVisManager->Draw(circle); + } +} diff --git a/examples/advanced/CaTS/src/TrackerSD.cc b/examples/advanced/CaTS/src/TrackerSD.cc new file mode 100644 index 0000000000..fd679b5516 --- /dev/null +++ b/examples/advanced/CaTS/src/TrackerSD.cc @@ -0,0 +1,95 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file TrackerSD.cc +/// \brief Implementation of the CaTS::TrackerSD class + +// Geant4 headers +#include "G4HCofThisEvent.hh" +#include "G4Step.hh" +#include "G4SDManager.hh" +#include "G4SystemOfUnits.hh" +// project headers +#include "TrackerSD.hh" +#include "ConfigurationManager.hh" + +TrackerSD::TrackerSD(G4String name) + : G4VSensitiveDetector(name) +{ + G4String HCname = name + "_HC"; + collectionName.insert(HCname); + G4cout << collectionName.size() << " TrackerSD name: " << name + << " collection Name: " << HCname << G4endl; + fHCID = -1; + verbose = ConfigurationManager::getInstance()->isEnable_verbose(); +} + +void TrackerSD::Initialize(G4HCofThisEvent* hce) +{ + fTrackerHitsCollection = + new TrackerHitsCollection(SensitiveDetectorName, collectionName[0]); + if(fHCID < 0) + { + if(verbose) + G4cout << "TrackerSD::Initialize: " << SensitiveDetectorName << " " + << collectionName[0] << G4endl; + fHCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); + } + hce->AddHitsCollection(fHCID, fTrackerHitsCollection); +} + +G4bool TrackerSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) +{ + G4double edep = aStep->GetTotalEnergyDeposit(); + if(edep == 0. || aStep->GetTrack()->GetDynamicParticle()->GetCharge() == 0) + { + return false; + } + TrackerHit* newHit = + new TrackerHit(edep, aStep->GetPostStepPoint()->GetPosition(), + aStep->GetPostStepPoint()->GetGlobalTime() / ns); + fTrackerHitsCollection->insert(newHit); + return true; +} + +void TrackerSD::EndOfEvent(G4HCofThisEvent*) +{ + G4int NbHits = fTrackerHitsCollection->entries(); + if(verbose) + G4cout << " Number of TrackerHits: " << NbHits << G4endl; +} diff --git a/environments/g4py/tests/g4pytest/NISTmaterials/NISTmaterials.cc b/examples/advanced/CaTS/src/lArTPCHit.cc similarity index 57% rename from environments/g4py/tests/g4pytest/NISTmaterials/NISTmaterials.cc rename to examples/advanced/CaTS/src/lArTPCHit.cc index 56bf0c3a4c..47745a57fb 100644 --- a/environments/g4py/tests/g4pytest/NISTmaterials/NISTmaterials.cc +++ b/examples/advanced/CaTS/src/lArTPCHit.cc @@ -23,39 +23,61 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// NISTmaterials.cc +// ******************************************************************** // -// 2005 Q -// ==================================================================== -#include "G4NistManager.hh" +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file lArTPCHit.cc +/// \brief Implementation of the CaTS::lArTPCHit class -//////////////// -void Construct() -//////////////// +#include +#include "lArTPCHit.hh" +template +class G4Allocator; +G4ThreadLocal G4Allocator* lArTPCHitAllocator = nullptr; + +lArTPCHit::lArTPCHit() + : G4VHit() +{} +lArTPCHit::lArTPCHit(G4double fe, G4double fx, G4double fy, G4double fz) + : G4VHit() { - G4NistManager* NistMgr = G4NistManager::Instance(); - - // define typically used materials - NistMgr-> FindOrBuildMaterial("G4_Al"); - NistMgr-> FindOrBuildMaterial("G4_Si"); - NistMgr-> FindOrBuildMaterial("G4_Ar"); - NistMgr-> FindOrBuildMaterial("G4_Cu"); - NistMgr-> FindOrBuildMaterial("G4_Fe"); - NistMgr-> FindOrBuildMaterial("G4_Ge"); - NistMgr-> FindOrBuildMaterial("G4_Ag"); - NistMgr-> FindOrBuildMaterial("G4_W"); - NistMgr-> FindOrBuildMaterial("G4_Au"); - NistMgr-> FindOrBuildMaterial("G4_Pb"); - - NistMgr-> FindOrBuildMaterial("G4_AIR"); - NistMgr-> FindOrBuildMaterial("G4_Galactic"); - NistMgr-> FindOrBuildMaterial("G4_WATER"); - NistMgr-> FindOrBuildMaterial("G4_CESIUM_IODIDE"); - NistMgr-> FindOrBuildMaterial("G4_SODIUM_IODIDE"); - NistMgr-> FindOrBuildMaterial("G4_PLASTIC_SC_VINYLTOLUENE"); - NistMgr-> FindOrBuildMaterial("G4_MYLAR"); - //NistMgr-> FindOrBuildMaterial("G4_GRAPHITE"); - // bug in G4 (element isnot defined. should be fixed.) - + fElectrons = fe; + fPosX = fx; + fPosY = fy; + fPosZ = fz; } + +lArTPCHit::lArTPCHit(const lArTPCHit& right) + : G4VHit() +{ + fElectrons = right.fElectrons; + fPosX = right.fPosX; + fPosY = right.fPosY; + fPosZ = right.fPosZ; +} + +const lArTPCHit& lArTPCHit::operator=(const lArTPCHit& right) +{ + fElectrons = right.fElectrons; + fPosX = right.fPosX; + fPosY = right.fPosY; + fPosZ = right.fPosZ; + return *this; +} + +G4bool lArTPCHit::operator==(const lArTPCHit& right) const +{ + return (this == &right) ? true : false; +} + +void lArTPCHit::Draw() {} diff --git a/examples/advanced/CaTS/src/lArTPCSD.cc b/examples/advanced/CaTS/src/lArTPCSD.cc new file mode 100644 index 0000000000..dc41f9bf43 --- /dev/null +++ b/examples/advanced/CaTS/src/lArTPCSD.cc @@ -0,0 +1,324 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// ******************************************************************** +// +// CaTS (Calorimetry and Tracking Simulation) +// +// Authors : Hans Wenzel +// Soon Yung Jun +// (Fermi National Accelerator Laboratory) +// +// History +// October 18th, 2021 : first implementation +// +// ******************************************************************** +// +/// \file lArTPCSD.cc +/// \brief Implementation of the CaTS::lArTPCSD class + +// Geant4 headers +#include "G4HCofThisEvent.hh" +#include "G4Step.hh" +#include "G4ThreeVector.hh" +#include "G4SDManager.hh" +#include "G4ios.hh" +#include "G4Track.hh" +#ifdef WITH_G4OPTICKS +# include "G4Opticks.hh" +# include "TrackInfo.hh" +# include "OpticksGenstep.h" +# include "OpticksFlags.hh" +# include "G4OpticksHit.hh" +# include "G4Cerenkov.hh" +# include "G4Event.hh" +# include "G4MaterialPropertiesTable.hh" +# include "G4PhysicalConstants.hh" +# include "G4RunManager.hh" +# include "G4SteppingManager.hh" +# include "G4SystemOfUnits.hh" +# include "G4UnitsTable.hh" +# include "G4VProcess.hh" +# include "G4VRestDiscreteProcess.hh" +# include "PhotonSD.hh" +# include "G4Cerenkov.hh" +# include "G4Scintillation.hh" +# include "G4Version.hh" +#endif +// project headers +#include "lArTPCSD.hh" +#include "ConfigurationManager.hh" + +lArTPCSD::lArTPCSD(G4String name) + : G4VSensitiveDetector(name) +{ + G4String HCname = name + "_HC"; + collectionName.insert(HCname); + verbose = ConfigurationManager::getInstance()->isEnable_verbose(); + if(verbose) + { + G4cout << collectionName.size() << " lArTPCSD name: " << name + << " collection Name: " << HCname << G4endl; + } + fHCID = -1; + first = true; +} + +void lArTPCSD::Initialize(G4HCofThisEvent* hce) +{ + flArTPCHitsCollection = + new lArTPCHitsCollection(SensitiveDetectorName, collectionName[0]); + if(fHCID < 0) + { + if(verbose) + { + G4cout << "lArTPCSD::Initialize: " << SensitiveDetectorName << " " + << collectionName[0] << G4endl; + } + fHCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); + } + hce->AddHitsCollection(fHCID, flArTPCHitsCollection); +} + +G4bool lArTPCSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) +{ + G4double edep = aStep->GetTotalEnergyDeposit(); + if(edep == 0.) + return false; + // only deal with charged particles + G4Track* aTrack = aStep->GetTrack(); + G4double charge = aTrack->GetDynamicParticle()->GetCharge(); + if(charge == 0) + return false; + G4double ds = aStep->GetStepLength(); + lArTPCHit* newHit = new lArTPCHit( + NumElectrons(edep, ds), aStep->GetPostStepPoint()->GetPosition().getX(), + aStep->GetPostStepPoint()->GetPosition().getY(), + aStep->GetPostStepPoint()->GetPosition().getZ()); + flArTPCHitsCollection->insert(newHit); +#ifdef WITH_G4OPTICKS + if(ConfigurationManager::getInstance()->isEnable_opticks()) + { + if(first) + { + aMaterial = aTrack->GetMaterial(); + materialIndex = aMaterial->GetIndex(); + if(verbose) + { + G4cout << "*******************************" << G4endl; + G4cout << "RadiatorSD::ProcessHits initializing Material: " + << aMaterial->GetName() << " " << G4endl; + G4cout << "RadiatorSD::ProcessHits: Name " + << aStep->GetPreStepPoint() + ->GetPhysicalVolume() + ->GetLogicalVolume() + ->GetName() + << G4endl; + } + aMaterialPropertiesTable = aMaterial->GetMaterialPropertiesTable(); + if(verbose) + { + aMaterialPropertiesTable->DumpTable(); + } + // + // properties related to Scintillation + // +# if(G4VERSION_NUMBER > 1072) + YieldRatio = + aMaterialPropertiesTable->GetConstProperty(kSCINTILLATIONYIELD1) / + aMaterialPropertiesTable->GetConstProperty( + kSCINTILLATIONYIELD2); // slowerRatio, + FastTimeConstant = aMaterialPropertiesTable->GetConstProperty( + kSCINTILLATIONTIMECONSTANT1); // TimeConstant, + SlowTimeConstant = aMaterialPropertiesTable->GetConstProperty( + kSCINTILLATIONTIMECONSTANT2); // slowerTimeConstant, +# else + Fast_Intensity = aMaterialPropertiesTable->GetProperty(kFASTCOMPONENT); + Slow_Intensity = aMaterialPropertiesTable->GetProperty(kSLOWCOMPONENT); + YieldRatio = aMaterialPropertiesTable->GetConstProperty(kYIELDRATIO); +# endif + ScintillationType = Slow; + // + // properties related to Cerenkov + // + Rindex = aMaterialPropertiesTable->GetProperty("RINDEX"); +# if(G4VERSION_NUMBER > 1072) + Pmin = Rindex->GetMinEnergy(); + Pmax = Rindex->GetMaxEnergy(); +# else + Pmin = Rindex->GetMinLowEdgeEnergy(); + Pmax = Rindex->GetMaxLowEdgeEnergy(); +# endif + dp = Pmax - Pmin; + if(verbose) + { + G4cout << "nMax: " << nMax << "Pmin: " << Pmin << "Pmax: " << Pmax + << "dp: " << dp << G4endl; + Rindex->DumpValues(); + } + // + first = false; + } + G4int Sphotons = 0; // number of scintillation photons this step + G4int Cphotons = 0; // number of Cerenkov photons this step + // + // info needed for generating Cerenkov photons on the GPU; + // + G4double maxCos = 0.0; + G4double maxSin2 = 0.0; + G4double beta = 0.0; + G4double beta1 = 0.0; + G4double beta2 = 0.0; + G4double BetaInverse = 0.0; + G4double MeanNumberOfPhotons1 = 0.0; + G4double MeanNumberOfPhotons2 = 0.0; + G4SteppingManager* fpSteppingManager = G4EventManager::GetEventManager() + ->GetTrackingManager() + ->GetSteppingManager(); + G4StepStatus stepStatus = fpSteppingManager->GetfStepStatus(); + if(stepStatus != fAtRestDoItProc) + { + G4ProcessVector* procPost = fpSteppingManager->GetfPostStepDoItVector(); + size_t MAXofPostStepLoops = fpSteppingManager->GetMAXofPostStepLoops(); + for(size_t i3 = 0; i3 < MAXofPostStepLoops; i3++) + { + if((*procPost)[i3]->GetProcessName() == "Cerenkov") + { + G4Cerenkov* proc = (G4Cerenkov*) (*procPost)[i3]; + thePhysicsTable = proc->GetPhysicsTable(); + CerenkovAngleIntegrals = + (G4PhysicsOrderedFreeVector*) ((*thePhysicsTable)(materialIndex)); + Cphotons = proc->GetNumPhotons(); + if(Cphotons > 0) + { + beta1 = aStep->GetPreStepPoint()->GetBeta(); + beta2 = aStep->GetPostStepPoint()->GetBeta(); + beta = (beta1 + beta2) * 0.5; + BetaInverse = 1. / beta; + maxCos = BetaInverse / nMax; + maxSin2 = (1.0 - maxCos) * (1.0 + maxCos); + MeanNumberOfPhotons1 = + proc->GetAverageNumberOfPhotons(charge, beta1, aMaterial, Rindex); + MeanNumberOfPhotons2 = + proc->GetAverageNumberOfPhotons(charge, beta2, aMaterial, Rindex); + } + } + if((*procPost)[i3]->GetProcessName() == "Scintillation") + { + G4Scintillation* proc1 = (G4Scintillation*) (*procPost)[i3]; + Sphotons = proc1->GetNumPhotons(); + } + } + } + tSphotons += Sphotons; + tCphotons += Cphotons; + G4ThreeVector deltaPosition = aStep->GetDeltaPosition(); + G4double ScintillationTime = 0. * ns; + G4int scntId = 1; + G4StepPoint* pPreStepPoint = aStep->GetPreStepPoint(); + G4ThreeVector x0 = pPreStepPoint->GetPosition(); + G4ThreeVector p0 = aStep->GetDeltaPosition().unit(); + // + // harvest the Scintillation photon gensteps: + // + if(Sphotons > 0) + { + G4double ScintillationRiseTime = 0.0; + G4Opticks::Get()->collectGenstep_G4Scintillation_1042( + aTrack, aStep, Sphotons, scntId, ScintillationTime, + ScintillationRiseTime); + } + // + // harvest the Cerenkov photon gensteps: + // + if(Cphotons > 0) + { + G4Opticks::Get()->collectGenstep_G4Cerenkov_1042( + aTrack, aStep, Cphotons, BetaInverse, Pmin, Pmax, maxCos, maxSin2, + MeanNumberOfPhotons1, MeanNumberOfPhotons2); + } + G4Opticks* g4ok = G4Opticks::Get(); + G4RunManager* rm = G4RunManager::GetRunManager(); + const G4Event* event = rm->GetCurrentEvent(); + G4int eventid = event->GetEventID(); + G4OpticksHit hit; + unsigned num_photons = g4ok->getNumPhotons(); + if(num_photons > ConfigurationManager::getInstance()->getMaxPhotons()) + { + g4ok->propagateOpticalPhotons(eventid); + G4HCtable* hctable = G4SDManager::GetSDMpointer()->GetHCtable(); + for(G4int i = 0; i < hctable->entries(); ++i) + { + std::string sdn = hctable->GetSDname(i); + std::size_t found = sdn.find("Photondetector"); + if(found != std::string::npos) + { + PhotonSD* aSD = + (PhotonSD*) G4SDManager::GetSDMpointer()->FindSensitiveDetector( + sdn); + aSD->AddOpticksHits(); + } + } + g4ok->reset(); + } + } +#endif + return true; +} + +void lArTPCSD::EndOfEvent(G4HCofThisEvent*) +{ + tSphotons = 0; + tCphotons = 0; + G4int NbHits = flArTPCHitsCollection->entries(); + if(verbose) + { + G4cout << " Number of lArTPCHits: " << NbHits << G4endl; + } +} + +G4double lArTPCSD::NumElectrons(G4double edep, G4double ds) +{ + // Nucl.Instrum.Meth.A523:275-286,2004 + G4double fGeVToElectrons = 4.237e+07; + G4double fModBoxA = 0.930; + G4double fModBoxB = 0.212; + G4double EFieldStep = 0.5; + G4double recomb = 0.0; + G4double dEdx = (ds <= 0.0) ? 0.0 : edep / ds; + if(dEdx < 1.) + dEdx = 1.; + if(ds > 0) + { + G4double Xi = fModBoxB * dEdx / EFieldStep; + recomb = std::log(fModBoxA + Xi) / Xi; + } + else + { + recomb = 0.0; + } + G4double fNumIonElectrons = fGeVToElectrons * 1.e-3 * edep * recomb; + return fNumIonElectrons; +} diff --git a/examples/advanced/CaTS/xml/selection.xml b/examples/advanced/CaTS/xml/selection.xml new file mode 100644 index 0000000000..3dd6f334d3 --- /dev/null +++ b/examples/advanced/CaTS/xml/selection.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/advanced/ChargeExchangeMC/CMakeLists.txt b/examples/advanced/ChargeExchangeMC/CMakeLists.txt index ddc54c71aa..ad676cf9e4 100644 --- a/examples/advanced/ChargeExchangeMC/CMakeLists.txt +++ b/examples/advanced/ChargeExchangeMC/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) include(CMakeDependentOption) set(name ChargeExchangeMC) diff --git a/examples/advanced/ChargeExchangeMC/ChargeExchangeMC.out b/examples/advanced/ChargeExchangeMC/ChargeExchangeMC.out index b31083f85a..2be7c3128f 100644 --- a/examples/advanced/ChargeExchangeMC/ChargeExchangeMC.out +++ b/examples/advanced/ChargeExchangeMC/ChargeExchangeMC.out @@ -10,7 +10,7 @@ ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -126,32 +126,99 @@ Particle is not selected yet !! Command ignored. /cexmc/event/verbose 2 /cexmc/vis/verbose 2 /run/beamOn 10 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -161,25 +228,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -189,29 +256,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -219,31 +286,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -252,12 +319,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -265,12 +332,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -278,31 +345,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -310,31 +377,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -342,31 +409,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -374,32 +441,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -407,32 +474,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -440,31 +507,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -472,27 +539,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -501,17 +568,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -519,67 +586,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -587,13 +654,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -601,13 +668,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -615,12 +682,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -628,13 +695,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -642,13 +709,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -656,13 +723,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -670,60 +737,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -731,27 +798,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -759,29 +826,29 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: Cexmc - Model: CexmcChargeExchange: 0 meV ---> 100 TeV - Cr_sctns: : 0 meV ---> 100 TeV + Model: CexmcChargeExchange: 0 eV ---> 100 TeV + Cr_sctns: : 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -789,25 +856,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -815,13 +882,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -844,7 +911,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -854,510 +920,534 @@ Max 2J for sampling of angular correlations 10 Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_MYLAR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.6231 keV e- 331.226 keV e+ 320.282 keV proton 70 keV + Energy thresholds : gamma 2.61415 keV e- 330.148 keV e+ 321.206 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_Galactic Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 3 used in the geometry : Yes Material : G4_Al Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 5.85564 keV e- 460.395 keV e+ 442.201 keV proton 70 keV + Energy thresholds : gamma 5.8472 keV e- 461.197 keV e+ 445.1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 4 used in the geometry : Yes Material : G4_lH2 Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 88.1421 keV e+ 87.5518 keV proton 70 keV + Energy thresholds : gamma 1 keV e- 88.4948 keV e+ 87.5094 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 5 used in the geometry : Yes Material : G4_Fe Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 17.2183 keV e- 951.321 keV e+ 901.528 keV proton 70 keV + Energy thresholds : gamma 17.2467 keV e- 954.644 keV e+ 906.507 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 6 used in the geometry : Yes Material : G4_Cu Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 20.6438 keV e- 1.03121 MeV e+ 977.24 keV proton 70 keV + Energy thresholds : gamma 20.5443 keV e- 1.03402 MeV e+ 979.822 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 7 used in the geometry : Yes Material : Scintillator Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.11555 keV e- 283.792 keV e+ 278.128 keV proton 70 keV + Energy thresholds : gamma 2.11276 keV e- 285.178 keV e+ 278.202 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 8 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : Calorimeter Index : 9 used in the geometry : Yes Material : CsI_Crystal Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 30.6889 keV e- 526.624 keV e+ 502.425 keV proton 70 keV + Energy thresholds : gamma 30.8111 keV e- 527.631 keV e+ 504.103 keV proton 70 keV Region(s) which use this couple : Calorimeter ================================================================== ### Run 0 starts. -Event 955 +Event 1015 --- Reconstructed data: -- entry points: - left: 2.63399 0.236681 -15 cm - right: 0.463149 -1.7714 -15 cm + left: -3.70386 -5.28053 -15 cm + right: 0.511335 -5.49521 -15 cm target: 0 0 0 fm - -- the angle: 132.057 deg - -- mass of the output particle: 503.348 MeV - -- mass of the nucleus output particle: 984.489 MeV + -- the angle: 125.087 deg + -- mass of the output particle: 523.155 MeV + -- mass of the nucleus output particle: 943.201 MeV -- production model data: Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta -133.7387 -9.8702 235.6867 MeV -- 571.7437 MeV - (SCM) : eta -133.7387 -9.8702 -13.9077 MeV -- 521.0912 MeV - Nucleus output particle (LAB) : neutron 133.7387 9.8702 494.3133 MeV -- 1.1098 GeV - (SCM) : neutron 133.7387 9.8702 13.9077 MeV -- 993.6774 MeV - -- triggered angular ranges: - 6 [ 0.0000, -0.2000) - --- Energy Deposit - monitor : 802.109 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 209.315 MeV - 0 0 1.224 0 0 0 - 0 0.8054 109.1 6.195 0 0 - 0 1.813 87.17 2.144 0 0 - 0 0 0.8666 0 0 0 - cal (r) : 362.429 MeV - 0 0 0.5125 4.732 0 0 - 0.6507 1.971 23.91 1.076 0.5304 0.7792 - 0 4.033 274 37.53 0 0 - 0 0 1.279 6.93 0.7216 3.74 -Event 2897 - --- Reconstructed data: - -- entry points: - left: 3.00273 4.33111 -15 cm - right: 4.90778 -3.60693 -15 cm - target: 0 0 0 fm - -- the angle: 128.305 deg - -- mass of the output particle: 589.579 MeV - -- mass of the nucleus output particle: 913.92 MeV - -- production model data: - Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV - (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV - (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta -89.5767 -3.9434 296.9788 MeV -- 666.2127 MeV - (SCM) : eta -89.5767 -3.9434 8.6039 MeV -- 596.4202 MeV - Nucleus output particle (LAB) : neutron 89.5767 3.9434 433.0212 MeV -- 1.0153 GeV - (SCM) : neutron 89.5767 3.9434 -8.6039 MeV -- 918.3485 MeV + Output particle (LAB) : eta 172.9899 -55.3492 286.8099 MeV -- 623.6502 MeV + (SCM) : eta 172.9899 -55.3492 17.8275 MeV -- 554.0736 MeV + Nucleus output particle (LAB) : neutron -172.9899 55.3492 443.1901 MeV -- 1.0578 GeV + (SCM) : neutron -172.9899 55.3492 -17.8275 MeV -- 960.6951 MeV -- triggered angular ranges: 5 [ 0.2000, 0.0000) --- Energy Deposit - monitor : 438.882 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 272.567 MeV - 0.2945 1.321 26.5 9.044 2.131 0 - 0.5907 7.315 220.4 2.016 0 0 - 0 1.28 0.9797 0.4747 0 0 - 0 0.1965 0 0 0 0 - cal (r) : 393.646 MeV - 0.1764 0.3777 0.07627 0 0 0 - 0 2.32 2.135 0.7906 0 0 - 0.1602 71.04 272.2 0.5371 0 0 - 0.2278 10.6 30.94 2.09 0 0 -Event 6952 - --- Track Points - monitor : pi- [1,bp] 732.2 MeV : -0.3025 -1.475 -0.125 cm [0.0121, 0.009496, 0.9999] - target : pi- [1,bp] 731.3 MeV : 3.248 3.802 -1.197 cm [-0.6329, -0.7742, 0.009626] - : eta [7,op] 249.8 MeV : 1.044 1.105 -1.165 cm [-0.1477, -0.9888, -0.02212] - : neutron [8,np] 531.2 MeV : 1.044 1.105 -1.165 cm [-0.8009, -0.5984, 0.02205] - : gamma [10,opdp] 378.9 MeV : 1.044 1.105 -1.165 cm [0.4365, -0.8997, 0.003855] - : gamma [9,opdp] 223.2 MeV : 1.044 1.105 -1.165 cm [-0.9065, 0.421, -0.0313] - vc (l) : gamma [10,opdp] 378.9 MeV : 2.326 -0.9366 -0.25 cm [0.01539, 0.003855, 0.9999] - vc (r) : gamma [9,opdp] 223.2 MeV : -11.73 -3.056 -0.25 cm [-0.172, -0.0313, 0.9846] - cal (l) : gamma [10,opdp] 378.9 MeV : 2.345 -0.9318 -15 cm [0.01539, 0.003855, 0.9999] - cal (r) : gamma [9,opdp] 223.2 MeV : -11.95 -3.096 -15 cm [-0.172, -0.0313, 0.9846] - --- - angle between the eta decay products : 140.769 deg - --- Triggered angular ranges: - 7 [-0.2000, -0.4000) - --- Production model data: - Incident particle (LAB) : pi- 8.8921 6.1870 729.8728 MeV -- 743.1766 MeV - (SCM) : pi- 5.5080 3.8324 452.1034 MeV -- 473.2044 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV - (SCM) : proton -5.5080 -3.8324 -452.1034 MeV -- 1.0415 GeV - Output particle (LAB) : eta 130.4988 -5.5255 212.9116 MeV -- 602.1167 MeV - (SCM) : eta 127.2516 -7.7848 -53.6194 MeV -- 565.0499 MeV - Nucleus output particle (LAB) : neutron -121.6067 11.7125 516.9613 MeV -- 1.0793 GeV - (SCM) : neutron -127.2516 7.7848 53.6194 MeV -- 949.6903 MeV - --- Reconstructed data: - -- entry points: - left: 2.82424 -1.28184 -15 cm - right: -11.0482 -2.7739 -15 cm - target: 0 0 0 fm - -- the angle: 142.94 deg - -- mass of the output particle: 473.421 MeV - -- mass of the nucleus output particle: 1.00857 GeV - -- production model data: - Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV - (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV - (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta 133.7440 -15.5883 174.4825 MeV -- 522.2088 MeV - (SCM) : eta 133.7440 -15.5883 -57.9766 MeV -- 495.5998 MeV - Nucleus output particle (LAB) : neutron -133.7440 15.5883 555.5175 MeV -- 1.1593 GeV - (SCM) : neutron -133.7440 15.5883 57.9766 MeV -- 1.0192 GeV - -- triggered angular ranges: - 7 [-0.2000, -0.4000) - --- Energy Deposit - monitor : 837.461 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 337.582 MeV - 0 3.357 1.074 0 0 0 - 0 1.489 12.62 2.563 0.9805 0 - 1.926 7.053 284.2 18.61 1.661 0 - 0 0.7289 1.328 0 0 0 - cal (r) : 184.627 MeV + monitor : 470.739 keV + vc (l) : 46.2335 keV + vc (r) : 0 eV + cal (l) : 413.506 MeV + 0 0 1.553 0 0 0 + 0 0 0.2972 0.4427 1.087 0 + 0 0.2677 5.862 180.5 9.492 3.249 + 0 0.3804 7.725 168.9 33.3 0.4516 + cal (r) : 210.144 MeV 0 0 0 0 0 0 - 0 0 0 0.3618 2.799 0.8925 - 0 0 0 6.41 83.21 87.33 - 0 0 0 0 0.1248 3.495 -Event 7821 + 0 0 0 1.258 0 0 + 0 0 73.56 53.98 0 0 + 0.06912 0.7871 60 20.02 0.469 0 +Event 3645 --- Reconstructed data: -- entry points: - left: -0.499879 2.59095 -15 cm - right: 7.19197 2.30066 -15 cm + left: -6.20605 -1.86719 -15 cm + right: 3.60789 -4.00888 -15 cm target: 0 0 0 fm - -- the angle: 122.515 deg - -- mass of the output particle: 490.128 MeV - -- mass of the nucleus output particle: 994.94 MeV + -- the angle: 120.425 deg + -- mass of the output particle: 148.647 MeV + -- mass of the nucleus output particle: 1.35085 GeV -- production model data: Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta -133.4930 23.2857 287.8393 MeV -- 584.3285 MeV - (SCM) : eta -133.4930 23.2857 37.9203 MeV -- 509.9277 MeV - Nucleus output particle (LAB) : neutron 133.4930 -23.2857 442.1607 MeV -- 1.0972 GeV - (SCM) : neutron 133.4930 -23.2857 -37.9203 MeV -- 1.0048 GeV + Output particle (LAB) : eta 63.2591 -7.7787 93.8638 MeV -- 186.9989 MeV + (SCM) : eta 63.2591 -7.7787 14.0763 MeV -- 162.3463 MeV + Nucleus output particle (LAB) : neutron -63.2591 7.7787 636.1362 MeV -- 1.4945 GeV + (SCM) : neutron -63.2591 7.7787 -14.0763 MeV -- 1.3524 GeV -- triggered angular ranges: 4 [ 0.4000, 0.2000) --- Energy Deposit - monitor : 359.819 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 207.083 MeV - 0 0 1.46 13.35 0.3346 0 - 0 0 169.6 13.79 0 0 - 0 0.2354 1.494 3.216 0.7429 2.221 - 0 0 0 0.6019 0 0 - cal (r) : 377.246 MeV - 0 5.663 4.734 0 0 0 - 1.624 278 52.08 0.9531 0 0 - 1.637 28.07 4.101 0.3648 0 0 + monitor : 371.046 keV + vc (l) : 0 eV + vc (r) : 0 eV + cal (l) : 131.025 MeV + 0 0 0 0.6991 0.3973 0.2784 + 0 0 0 1.222 18.01 0.7939 + 0 0.7873 0.2991 3.143 95.48 4.256 + 0.08795 2.467 1.147 1.197 0.7649 0 + cal (r) : 55.9737 MeV 0 0 0 0 0 0 -Event 9283 + 0 0 0 0.609 0 0 + 0.55 0.5956 50.72 0.1801 0 0 + 0 0.6844 2.297 0.3411 0 0 +Event 5124 --- Reconstructed data: -- entry points: - left: 1.32443 2.53561 -15 cm - right: 9.35968 -3.59858 -15 cm + left: 6.28044 -0.525183 -15 cm + right: 10.222 -2.51249 -15 cm target: 0 0 0 fm - -- the angle: 122.472 deg - -- mass of the output particle: 470.79 MeV - -- mass of the nucleus output particle: 1.01893 GeV + -- the angle: 126.244 deg + -- mass of the output particle: 592.603 MeV + -- mass of the nucleus output particle: 905.296 MeV -- production model data: Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta -119.9742 -13.1359 282.0114 MeV -- 561.9076 MeV - (SCM) : eta -119.9742 -13.1359 42.2561 MeV -- 487.8476 MeV - Nucleus output particle (LAB) : neutron 119.9742 13.1359 447.9886 MeV -- 1.1196 GeV - (SCM) : neutron 119.9742 13.1359 -42.2561 MeV -- 1.0269 GeV + Output particle (LAB) : eta -103.6441 -19.7854 326.1385 MeV -- 684.6005 MeV + (SCM) : eta -103.6441 -19.7854 32.1116 MeV -- 602.7791 MeV + Nucleus output particle (LAB) : neutron 103.6441 19.7854 403.8615 MeV -- 996.8941 MeV + (SCM) : neutron 103.6441 19.7854 -32.1116 MeV -- 911.9895 MeV -- triggered angular ranges: 4 [ 0.4000, 0.2000) --- Energy Deposit - monitor : 440.781 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 198.329 MeV - 0 0 2.228 0.3011 0 0 - 0 0.3587 144.9 44.68 0 0 - 0 0.7031 3.526 1.659 0 0 - 0 0 0 0 0 0 - cal (r) : 363.579 MeV - 0.3108 2.467 0 0 0 0 - 1.144 0.8339 3.347 0 0 0 - 22.29 255.3 14.75 0.343 0 0 - 21.39 39.1 2.333 0 0 0 -Event 10465 - --- Track Points - monitor : pi- [1,bp] 736.5 MeV : 6.39 -3.284 -1.25 mm [-0.01802, 0.01682, 0.9997] - target : pi- [1,bp] 735.4 MeV : 3.294 3.761 0.1775 cm [-0.6565, -0.7541, 0.01721] - : eta [5,op] 182.8 MeV : 2.283 2.599 0.2041 cm [-0.3898, -0.7681, 0.508] - : neutron [6,np] 589 MeV : 2.283 2.599 0.2041 cm [-0.6986, -0.7025, -0.1357] - : pi0 [9,opdp] 161.9 MeV : 2.283 2.599 0.2041 cm [-0.8124, 0.04441, 0.5814] - : pi0 [7,opdp] 108 MeV : 2.283 2.599 0.2041 cm [0.6994, -0.2748, 0.6598] - vc (l) : tp is not valid - vc (r) : tp is not valid - cal (l) : tp is not valid - cal (r) : tp is not valid - --- - angle between the eta decay products : 101.347 deg - --- Triggered angular ranges: - 9 [-0.6000, -0.8000) - --- Production model data: - Incident particle (LAB) : pi- -13.5761 12.9404 734.8402 MeV -- 748.2123 MeV - (SCM) : pi- -8.3922 7.9992 454.2459 MeV -- 475.3457 MeV - Nucleus particle (LAB) : proton -0.0000 0.0000 0.0000 meV -- 938.2720 MeV - (SCM) : proton 8.3922 -7.9992 -454.2459 MeV -- 1.0425 GeV - Output particle (LAB) : eta 35.6613 92.8507 153.3231 MeV -- 577.5411 MeV - (SCM) : eta 40.5105 88.2285 -109.1511 MeV -- 567.0027 MeV - Nucleus output particle (LAB) : neutron -49.2374 -79.9102 581.5171 MeV -- 1.1089 GeV - (SCM) : neutron -40.5105 -88.2285 109.1511 MeV -- 950.8535 MeV + monitor : 476.126 keV + vc (l) : 0 eV + vc (r) : 0 eV + cal (l) : 259.709 MeV + 0 0.2354 0.3375 0.2372 0 0 + 0 44.54 28.09 1.592 0 0 + 5.428 130.3 47.09 0 1.009 0 + 0 0.8855 0 0 0 0 + cal (r) : 424.892 MeV + 0.7197 1.711 0 0 0 0 + 2.025 4.136 0.04159 0 1.357 0 + 114.4 282.4 3.608 0.3943 0 0 + 9.943 3.775 0.3297 0 0 0 +Event 5857 --- Reconstructed data: -- entry points: - left: 7.7328 -3.77378 -15 cm - right: -9.76967 -1.87062 -15 cm + left: -3.34232 -3.12 -15 cm + right: -3.81249 -2.55923 -15 cm target: 0 0 0 fm - -- the angle: 146.185 deg - -- mass of the output particle: 181.72 MeV - -- mass of the nucleus output particle: 1.32862 GeV + -- the angle: 130.172 deg + -- mass of the output particle: 548.072 MeV + -- mass of the nucleus output particle: 930.364 MeV -- production model data: Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta -19.0681 -8.5799 54.4874 MeV -- 190.8618 MeV - (SCM) : eta -19.0681 -8.5799 -31.4958 MeV -- 185.6108 MeV - Nucleus output particle (LAB) : neutron 19.0681 8.5799 675.5126 MeV -- 1.4906 GeV - (SCM) : neutron 19.0681 8.5799 31.4958 MeV -- 1.3292 GeV + Output particle (LAB) : eta 156.5508 -30.7881 275.0253 MeV -- 633.6230 MeV + (SCM) : eta 156.5508 -30.7881 -0.0603 MeV -- 570.8233 MeV + Nucleus output particle (LAB) : neutron -156.5508 30.7881 454.9747 MeV -- 1.0479 GeV + (SCM) : neutron -156.5508 30.7881 0.0603 MeV -- 943.9453 MeV + -- triggered angular ranges: + 6 [ 0.0000, -0.2000) + --- Energy Deposit + monitor : 353.985 keV + vc (l) : 0 eV + vc (r) : 0 eV + cal (l) : 412.061 MeV + 0 0 0 0 1.347 0 + 0 0.6395 0.2092 0 0.5404 0.3373 + 0 0.01852 13.96 375.9 6.527 1.106 + 0 0.1587 0.5114 9.777 0.6848 0.303 + cal (r) : 221.562 MeV + 0 0 0.3729 0.5284 0.6556 0 + 0 0.04036 2.041 2.108 0.1912 0.6186 + 0 0 2.702 177.9 16.43 0.3886 + 0 0.5097 0 13.98 3.139 0 +Event 6257 + --- Reconstructed data: + -- entry points: + left: 10.8188 1.53639 -15 cm + right: -11.5987 2.14589 -15 cm + target: 0 0 0 fm + -- the angle: 150.961 deg + -- mass of the output particle: 261.51 MeV + -- mass of the nucleus output particle: 1.24476 GeV + -- production model data: + Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV + (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV + (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV + Output particle (LAB) : eta 23.5742 8.0542 67.6670 MeV -- 271.2690 MeV + (SCM) : eta 23.5742 8.0542 -55.6156 MeV -- 268.5166 MeV + Nucleus output particle (LAB) : neutron -23.5742 -8.0542 662.3330 MeV -- 1.4102 GeV + (SCM) : neutron -23.5742 -8.0542 55.6156 MeV -- 1.2463 GeV -- triggered angular ranges: 10 [-0.8000, -1.0000) --- Energy Deposit - monitor : 936.427 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 86.0095 MeV + monitor : 390.649 keV + vc (l) : 0 eV + vc (r) : 0 eV + cal (l) : 148.01 MeV + 3.726 0.8124 0 0 0 0 + 14.75 90.68 0.2287 0 0 0 + 10.46 26.85 0.5004 0 0 0 0 0 0 0 0 0 - 0.6936 0.6093 0 0 0 0 - 0.088 73.33 5.186 0 0 0 - 0 4.949 0.4844 0.6716 0 0 - cal (r) : 104.852 MeV - 0 0 0 0 0 0.3657 - 0 0 0 0.3592 1.498 2.955 - 0 0 0 1.099 93.15 4.669 - 0 0 0 0.3284 0.4178 0.007282 -Event 10985 - --- Reconstructed data: - -- entry points: - left: -6.40558 0.109567 -15 cm - right: -7.58065 3.25633 -15 cm - target: 0 0 0 fm - -- the angle: 131.027 deg - -- mass of the output particle: 506.681 MeV - -- mass of the nucleus output particle: 981.336 MeV - -- production model data: - Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV - (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV - (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta 133.9466 11.6067 259.1259 MeV -- 584.7635 MeV - (SCM) : eta 133.9466 11.6067 5.8368 MeV -- 524.2482 MeV - Nucleus output particle (LAB) : neutron -133.9466 -11.6067 470.8741 MeV -- 1.0967 GeV - (SCM) : neutron -133.9466 -11.6067 -5.8368 MeV -- 990.5204 MeV - -- triggered angular ranges: - 5 [ 0.2000, 0.0000) - --- Energy Deposit - monitor : 516.076 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 381.784 MeV - 0 0.5347 1.152 3.702 0.2523 2.081 - 0 0.7655 0 7.034 104.5 1.386 - 0 0 2.203 9.233 244.2 0.7857 - 0 0.3681 3.027 0 0.5582 0 - cal (r) : 202.979 MeV - 0 0 0 2.278 17.13 1.932 - 0 0 0.7357 10.47 159.1 0 - 0 0.5947 0.03697 0.2972 8.637 1.767 - 0 0 0 0 0 0 -Event 11850 - --- Reconstructed data: - -- entry points: - left: 2.29659 0.994013 -15 cm - right: 0.663662 -4.16383 -15 cm - target: 0 0 0 fm - -- the angle: 131.517 deg - -- mass of the output particle: 342.067 MeV - -- mass of the nucleus output particle: 1.12641 GeV - -- production model data: - Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV - (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV - (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta 158.1770 -3.5982 164.7631 MeV -- 411.3267 MeV - (SCM) : eta 158.1770 -3.5982 -15.3292 MeV -- 377.1972 MeV - Nucleus output particle (LAB) : neutron -158.1770 3.5982 565.2369 MeV -- 1.2702 GeV - (SCM) : neutron -158.1770 3.5982 15.3292 MeV -- 1.1376 GeV - -- triggered angular ranges: - 6 [ 0.0000, -0.2000) - --- Energy Deposit - monitor : 367.924 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 290.007 MeV - 0 1.108 0.3591 100.8 2.878 0 - 0.253 2.308 0.9307 5.185 0.2827 0 - 0.4215 16.23 151.5 0 0 0 - 0.7233 3.872 2.709 0.4055 0 0 - cal (r) : 121.32 MeV - 0 0 0 0 0 0 - 0 0 0.3867 0 0 0 - 5.013 0.03909 13.36 94.92 0.4842 0 - 0.5113 0 1.959 4.045 0.598 0 -Event 17076 - --- Reconstructed data: - -- entry points: - left: -0.0326778 3.45241 -15 cm - right: 8.32125 2.97697 -15 cm - target: 0 0 0 fm - -- the angle: 121.78 deg - -- mass of the output particle: 490.487 MeV - -- mass of the nucleus output particle: 995.399 MeV - -- production model data: - Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV - (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV - (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta -128.4550 30.5288 293.0992 MeV -- 586.4445 MeV - (SCM) : eta -128.4550 30.5288 42.7394 MeV -- 509.7418 MeV - Nucleus output particle (LAB) : neutron 128.4550 -30.5288 436.9008 MeV -- 1.0951 GeV - (SCM) : neutron 128.4550 -30.5288 -42.7394 MeV -- 1.0050 GeV - -- triggered angular ranges: - 4 [ 0.4000, 0.2000) - --- Energy Deposit - monitor : 383.387 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 208.444 MeV - 0 0 12.52 11.63 0.4172 0 - 0 0.5973 136.1 41.6 0.5817 0 - 0 0 2.091 0.8122 1.342 0 - 0 0 0 0.7271 0 0 - cal (r) : 378.001 MeV - 8.884 4.147 13.07 0 0 0 - 7.601 319.5 8.223 1.654 0 0 - 0.6921 11.15 0.5801 1.411 0 0 - 0.9991 0.1119 0 0 0 0 -Event 17869 + cal (r) : 123.259 MeV + 0 0 0 0 0.2622 1.038 + 0 0 0 0.958 43.8 72.75 + 0 0 0 0 0.3089 2.843 + 0 0 0 1.304 0 0 +Event 7299 --- Track Points - monitor : pi- [1,bp] 730.4 MeV : 2.994 -0.7795 -0.125 cm [-0.007706, -0.006445, 0.9999] - target : pi- [1,bp] 729.8 MeV : 4.78 1.467 -0.9419 cm [-0.6486, -0.7611, -0.004033] - : eta [3,op] 380.7 MeV : 2.287 -1.459 -0.9574 cm [-0.8216, -0.5594, -0.1102] - : neutron [4,np] 379.5 MeV : 2.287 -1.459 -0.9574 cm [-0.4215, -0.901, 0.1025] - : pi0 [7,opdp] 263.9 MeV : 2.287 -1.459 -0.9574 cm [-0.9414, -0.3328, -0.0557] - : pi0 [5,opdp] 90.39 MeV : 2.287 -1.459 -0.9574 cm [0.7397, -0.423, -0.5234] + monitor : pi- [1,bp] 735.2 MeV : -1.252 1.386 -0.125 cm [-0.0124, 0.006366, 0.9999] + target : pi- [1,bp] 734.7 MeV : 1.801 4.664 1.548 cm [-0.653, -0.7574, 0.005675] + : eta [5,op] 222.4 MeV : -3.923 -1.972 1.589 cm [-0.1465, -0.9892, 0.0004912] + : neutron [6,np] 557.5 MeV : -3.923 -1.972 1.589 cm [-0.8005, -0.5993, 0.007842] + : gamma [8,opdp] 346.5 MeV : -3.923 -1.972 1.589 cm [0.591, -0.8067, 0.004491] + : gamma [7,opdp] 244.7 MeV : -3.923 -1.972 1.589 cm [-0.9699, 0.2432, -0.005913] + vc (l) : gamma [8,opdp] 346.5 MeV : 7.249 1.857 -0.25 cm [0.1947, 0.004491, 0.9808] + vc (r) : gamma [7,opdp] 244.7 MeV : 3.813 1.261 -0.25 cm [0.01609, -0.005913, 0.9999] + cal (l) : gamma [8,opdp] 346.5 MeV : 7.497 1.863 -15 cm [0.1947, 0.004491, 0.9808] + cal (r) : gamma [7,opdp] 244.7 MeV : 3.833 1.253 -15 cm [0.01609, -0.005913, 0.9999] + --- + angle between the eta decay products : 140.307 deg + --- Triggered angular ranges: + 8 [-0.4000, -0.6000) + --- Production model data: + Incident particle (LAB) : pi- -10.6325 4.4806 732.2330 MeV -- 745.5053 MeV + (SCM) : pi- -6.5798 2.7728 453.1341 MeV -- 474.1954 MeV + Nucleus particle (LAB) : proton -0.0000 0.0000 0.0000 eV -- 938.2720 MeV + (SCM) : proton 6.5798 -2.7728 -453.1341 MeV -- 1.0420 GeV + Output particle (LAB) : eta 116.4645 0.1093 189.4799 MeV -- 591.2862 MeV + (SCM) : eta 120.3097 -1.5111 -75.3264 MeV -- 565.9536 MeV + Nucleus output particle (LAB) : neutron -127.0970 4.3713 542.7532 MeV -- 1.0925 GeV + (SCM) : neutron -120.3097 1.5111 75.3264 MeV -- 950.2283 MeV + --- Reconstructed data: + -- entry points: + left: 9.9537 2.26567 -15 cm + right: 4.01557 0.338982 -15 cm + target: 0 0 0 fm + -- the angle: 135.532 deg + -- mass of the output particle: 510.697 MeV + -- mass of the nucleus output particle: 986.833 MeV + -- production model data: + Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV + (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV + (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV + Output particle (LAB) : eta 97.0853 13.1996 200.7072 MeV -- 557.3995 MeV + (SCM) : eta 97.0853 13.1996 -45.8246 MeV -- 522.0256 MeV + Nucleus output particle (LAB) : neutron -97.0853 -13.1996 529.2928 MeV -- 1.1241 GeV + (SCM) : neutron -97.0853 -13.1996 45.8246 MeV -- 992.7431 MeV + -- triggered angular ranges: + 8 [-0.4000, -0.6000) + --- Energy Deposit + monitor : 399.347 keV + vc (l) : 0 eV + vc (r) : 0 eV + cal (l) : 318.386 MeV + 0.9699 5.647 0 0 0 0 + 63.35 227.1 5.072 0.6343 0 0 + 1.789 12.82 0.4025 0 0 0 + 0.2758 0 0.3465 0 0 0 + cal (r) : 239.014 MeV + 0 0.6683 1.269 0 0.4478 0 + 0 4.434 176.1 0.3717 2.052 0 + 4.025 17.03 29.66 0.5586 0 0 + 0.04133 1.24 0.7596 0.2933 0.06231 0 +Event 12002 + --- Track Points + monitor : pi- [1,bp] 735.9 MeV : -0.4665 1.755 -0.125 cm [-0.01568, -0.01564, 0.9998] + target : pi- [1,bp] 735.2 MeV : 2.464 4.351 1.363 cm [-0.6544, -0.756, -0.01325] + : eta [3,op] 351.5 MeV : 0.4315 2.003 1.322 cm [-0.8952, -0.4399, -0.07113] + : neutron [4,np] 434 MeV : 0.4315 2.003 1.322 cm [-0.3824, -0.9233, 0.03703] + : pi0 [7,opdp] 69.09 MeV : 0.4315 2.003 1.322 cm [-0.1862, 0.9801, 0.06825] + : pi0 [5,opdp] 224.3 MeV : 0.4315 2.003 1.322 cm [-0.8428, -0.4372, 0.3139] vc (l) : tp is not valid vc (r) : tp is not valid cal (l) : tp is not valid cal (r) : tp is not valid --- - angle between the eta decay products : 121.758 deg + angle between the eta decay products : 104.489 deg --- Triggered angular ranges: - 2 [ 0.8000, 0.6000) + 4 [ 0.4000, 0.2000) --- Production model data: - Incident particle (LAB) : pi- -5.4562 -3.0718 728.9093 MeV -- 742.1778 MeV - (SCM) : pi- -3.3811 -1.9036 451.6912 MeV -- 472.7788 MeV - Nucleus particle (LAB) : proton 0.0000 -0.0000 0.0000 meV -- 938.2720 MeV - (SCM) : proton 3.3811 1.9036 -451.6912 MeV -- 1.0413 GeV - Output particle (LAB) : eta -102.7062 -41.9494 364.1755 MeV -- 667.1468 MeV - (SCM) : eta -100.6024 -40.7650 83.1121 MeV -- 564.6619 MeV - Nucleus output particle (LAB) : neutron 97.2501 38.8776 364.7339 MeV -- 1.0133 GeV - (SCM) : neutron 100.6024 40.7650 -83.1121 MeV -- 949.4595 MeV + Incident particle (LAB) : pi- -11.2362 -8.9355 734.3291 MeV -- 747.6130 MeV + (SCM) : pi- -6.9474 -5.5249 454.0408 MeV -- 475.0912 MeV + Nucleus particle (LAB) : proton 0.0000 -0.0000 0.0000 eV -- 938.2720 MeV + (SCM) : proton 6.9474 5.5249 -454.0408 MeV -- 1.0424 GeV + Output particle (LAB) : eta -141.6677 -25.0061 320.7549 MeV -- 650.9466 MeV + (SCM) : eta -137.3965 -21.6094 41.6098 MeV -- 566.7706 MeV + Nucleus output particle (LAB) : neutron 130.4316 16.0706 413.5742 MeV -- 1.0349 GeV + (SCM) : neutron 137.3965 21.6094 -41.6098 MeV -- 950.7151 MeV --- Reconstructed data: -- entry points: - left: -7.62841 -2.52592 -15 cm - right: 8.01133 5.43556 -15 cm + left: -1.39957 -2.19447 -15 cm + right: 10.8386 -1.13219 -15 cm target: 0 0 0 fm - -- the angle: 115.254 deg - -- mass of the output particle: 143.496 MeV - -- mass of the nucleus output particle: 1.35998 GeV + -- the angle: 118.354 deg + -- mass of the output particle: 102.389 MeV + -- mass of the nucleus output particle: 1.41042 GeV -- production model data: Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV - Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 meV -- 938.2720 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV - Output particle (LAB) : eta -50.4624 8.2753 96.5901 MeV -- 180.3762 MeV - (SCM) : eta -50.4624 8.2753 20.2943 MeV -- 153.6807 MeV - Nucleus output particle (LAB) : neutron 50.4624 -8.2753 633.4099 MeV -- 1.5011 GeV - (SCM) : neutron 50.4624 -8.2753 -20.2943 MeV -- 1.3611 GeV + Output particle (LAB) : eta -14.9845 -3.1386 63.4963 MeV -- 121.4483 MeV + (SCM) : eta -14.9845 -3.1386 11.9565 MeV -- 104.2155 MeV + Nucleus output particle (LAB) : neutron 14.9845 3.1386 666.5037 MeV -- 1.5600 GeV + (SCM) : neutron 14.9845 3.1386 -11.9565 MeV -- 1.4106 GeV -- triggered angular ranges: - 4 [ 0.4000, 0.2000) + 2 [ 0.8000, 0.6000) --- Energy Deposit - monitor : 452.805 keV - vc (l) : 0 meV - vc (r) : 0 meV - cal (l) : 59.9017 MeV + monitor : 568.385 keV + vc (l) : 0 eV + vc (r) : 0 eV + cal (l) : 49.1707 MeV 0 0 0 0 0 0 - 0 0 0 0.5226 0.2652 0 - 0 0 0.2363 0.4851 58.22 0 - 0 0 0 0 0.1691 0 - cal (r) : 120.474 MeV - 11.9 28.9 3.507 0 0 0 - 0 72.74 1.183 1.219 0 0 - 0 0 0.6482 0.3843 0 0 + 0 0 0.3582 0.3618 1.32 0 + 0 0 15.14 31.54 0 0 + 0 0 0 0.4457 0 0 + cal (r) : 72.2775 MeV + 0 0.4207 0 0 0 0 + 1.5 11.38 0 0 0 0 + 14.58 43.81 0 0 0 0 + 0 0.5967 0 0 0 0 +Event 22291 + --- Track Points + monitor : pi- [1,bp] 726.9 MeV : 1.45 -1.279 -0.125 cm [-0.0002259, 0.007251, 1] + target : pi- [1,bp] 726.1 MeV : 4.203 2.709 -1.101 cm [-0.6428, -0.766, 0.005665] + : eta [6,op] 350.4 MeV : 1.659 -0.3254 -1.08 cm [-0.8627, -0.5056, 0.01123] + : neutron [7,np] 411.7 MeV : 1.659 -0.3254 -1.08 cm [-0.3968, -0.9179, -0.0001347] + : gamma [9,opdp] 252.2 MeV : 1.659 -0.3254 -1.08 cm [0.3626, -0.9284, 0.08109] + : gamma [8,opdp] 398.2 MeV : 1.659 -0.3254 -1.08 cm [-0.9888, 0.143, -0.04148] + vc (l) : gamma [9,opdp] 252.2 MeV : -2.334 3.628 -0.25 cm [-0.06373, 0.08109, 0.9947] + vc (r) : gamma [8,opdp] 398.2 MeV : 7.059 -3.607 -0.25 cm [0.1178, -0.04148, 0.9922] + cal (l) : gamma [9,opdp] 252.2 MeV : -2.414 3.73 -15 cm [-0.06373, 0.08109, 0.9947] + cal (r) : gamma [8,opdp] 398.2 MeV : 7.208 -3.659 -15 cm [0.1178, -0.04148, 0.9922] + --- + angle between the eta decay products : 119.651 deg + --- Triggered angular ranges: + 3 [ 0.6000, 0.4000) + --- Production model data: + Incident particle (LAB) : pi- 0.0738 3.8791 724.5456 MeV -- 737.8761 MeV + (SCM) : pi- 0.0458 2.4081 449.7796 MeV -- 470.9430 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV + (SCM) : proton -0.0458 -2.4081 -449.7796 MeV -- 1.0405 GeV + Output particle (LAB) : eta -117.6815 3.9346 330.0240 MeV -- 650.3330 MeV + (SCM) : eta -117.7096 2.4580 54.2346 MeV -- 562.9882 MeV + Nucleus output particle (LAB) : neutron 117.7553 -0.0555 394.5216 MeV -- 1.0258 GeV + (SCM) : neutron 117.7096 -2.4580 -54.2346 MeV -- 948.4651 MeV + --- Reconstructed data: + -- entry points: + left: -3.3171 5.20341 -15 cm + right: 5.80386 -2.35166 -15 cm + target: 0 0 0 fm + -- the angle: 121.38 deg + -- mass of the output particle: 448.851 MeV + -- mass of the nucleus output particle: 1.05842 GeV + -- production model data: + Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV + (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV + (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV + Output particle (LAB) : eta -59.9437 7.6498 255.6365 MeV -- 520.0665 MeV + (SCM) : eta -59.9437 7.6498 33.1423 MeV -- 454.1118 MeV + Nucleus output particle (LAB) : neutron 59.9437 -7.6498 474.3635 MeV -- 1.1614 GeV + (SCM) : neutron 59.9437 -7.6498 -33.1423 MeV -- 1.0607 GeV + -- triggered angular ranges: + 3 [ 0.6000, 0.4000) + --- Energy Deposit + monitor : 559.005 keV + vc (l) : 0 eV + vc (r) : 0 eV + cal (l) : 222.939 MeV + 2.593 1.92 5.62 9.091 10.87 1.309 + 0 0 1.306 171.3 14.66 4.029 + 0 0 0.297 0 0 0 + 0 0 0 0 0 0 + cal (r) : 297.128 MeV + 0 0 0.7646 0.6552 0.6281 0.0005409 + 4.32 2.064 0 1.555 1.756 1.74 + 5.319 249.6 4.003 0.02026 0.999 0.008442 + 3.321 19.03 0.5707 0 0.5706 0.2047 +Event 26500 + --- Reconstructed data: + -- entry points: + left: -1.42988 3.32949 -15 cm + right: 0.600826 -3.48965 -15 cm + target: 0 0 0 fm + -- the angle: 128.151 deg + -- mass of the output particle: 543.285 MeV + -- mass of the nucleus output particle: 954.5 MeV + -- production model data: + Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV + (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV + (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV + Output particle (LAB) : eta 108.6365 6.1580 270.2778 MeV -- 616.4807 MeV + (SCM) : eta 108.6365 6.1580 2.9310 MeV -- 554.0821 MeV + Nucleus output particle (LAB) : neutron -108.6365 -6.1580 459.7222 MeV -- 1.0650 GeV + (SCM) : neutron -108.6365 -6.1580 -2.9310 MeV -- 960.6866 MeV + -- triggered angular ranges: + 5 [ 0.2000, 0.0000) + --- Energy Deposit + monitor : 315.858 keV + vc (l) : 0 eV + vc (r) : 0 eV + cal (l) : 369.772 MeV + 0 0.5371 2.942 11.9 1.387 0 + 0 10.27 7.103 327.4 1.017 0.4664 + 0 0 3.067 3.056 0 0 + 0 0 0 0 0.5961 0 + cal (r) : 246.709 MeV + 0 0 0 0 0 0 + 0 0 1.548 0 0 0 + 0.8321 0.5985 217.8 16.92 4.414 0.299 + 0 0 1.85 1.785 0 0.6903 +Event 30357 + --- Track Points + monitor : pi- [1,bp] 729.6 MeV : 1.364 -1.031 -0.125 cm [0.007996, -0.01257, 0.9999] + target : pi- [1,bp] 729.1 MeV : 4.263 2.612 -1.315 cm [-0.637, -0.7708, -0.008728] + : eta [2,op] 200.8 MeV : 2.084 -0.02554 -1.345 cm [-0.1589, -0.9857, 0.0557] + : neutron [3,np] 564.9 MeV : 2.084 -0.02554 -1.345 cm [-0.7653, -0.643, -0.03106] + : pi0 [6,opdp] 157.8 MeV : 2.084 -0.02554 -1.345 cm [0.5026, -0.8601, 0.08682] + : pi0 [4,opdp] 75.29 MeV : 2.084 -0.02554 -1.345 cm [0.6766, -0.24, -0.6961] + vc (l) : tp is not valid + vc (r) : tp is not valid + cal (l) : tp is not valid + cal (r) : tp is not valid + --- + angle between the eta decay products : 60.9159 deg + --- Triggered angular ranges: + 9 [-0.6000, -0.8000) + --- Production model data: + Incident particle (LAB) : pi- 5.1096 -6.3599 728.2302 MeV -- 741.5293 MeV + (SCM) : pi- 3.1672 -3.9422 451.3902 MeV -- 472.5023 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV + (SCM) : proton -3.1672 3.9422 -451.3902 MeV -- 1.0412 GeV + Output particle (LAB) : eta 102.7953 11.1862 172.1446 MeV -- 583.5054 MeV + (SCM) : eta 100.9586 13.4723 -89.6187 MeV -- 564.4098 MeV + Nucleus output particle (LAB) : neutron -97.6857 -17.5461 556.0857 MeV -- 1.0963 GeV + (SCM) : neutron -100.9586 -13.4723 89.6187 MeV -- 949.3096 MeV + --- Reconstructed data: + -- entry points: + left: -7.54095 -4.48042 -15 cm + right: -10.8812 -2.12253 -15 cm + target: 0 0 0 fm + -- the angle: 132.736 deg + -- mass of the output particle: 156.568 MeV + -- mass of the nucleus output particle: 1.35547 GeV + -- production model data: + Incident particle (LAB) : pi- 0.0000 0.0000 730.0000 MeV -- 743.2226 MeV + (SCM) : pi- 0.0000 0.0000 452.1737 MeV -- 473.2239 MeV + Nucleus particle (LAB) : proton 0.0000 0.0000 0.0000 eV -- 938.2720 MeV + (SCM) : proton 0.0000 0.0000 -452.1737 MeV -- 1.0415 GeV + Output particle (LAB) : eta -24.1920 -9.0269 65.2326 MeV -- 171.5684 MeV + (SCM) : eta -24.1920 -9.0269 -10.2700 MeV -- 159.0154 MeV + Nucleus output particle (LAB) : neutron 24.1920 9.0269 664.7674 MeV -- 1.5099 GeV + (SCM) : neutron 24.1920 9.0269 10.2700 MeV -- 1.3558 GeV + -- triggered angular ranges: + 7 [-0.2000, -0.4000) + --- Energy Deposit + monitor : 413.737 keV + vc (l) : 0 eV + vc (r) : 0 eV + cal (l) : 78.2216 MeV + 0 0 0 0 0 0 + 0 0 0 0 0.7216 0 + 0 0 0 4.813 65.18 1.568 + 0 0.8763 0.2152 1.147 1.506 2.194 + cal (r) : 93.3468 MeV + 0 0 0 0 0 0 + 0 0 0 0 0.9159 1.322 + 0 0 0 0 79.77 11.34 0 0 0 0 0 0 Run terminated. Run Summary - Number of events processed : 17870, effectively: 10 - User=12.750000s Real=13.478809s Sys=0.020000s + Number of events processed : 30358, effectively: 10 + User=20.390000s Real=20.870991s Sys=0.000000s --- Setup acceptances (range | real (trg / mon) | rec (trg / mon / all)): - 1 [ 1.0000, 0.8000) | 0.00000000 ( 0 / 520 ) | 0.00000000 ( 0 / 520 / 628 ) - 2 [ 0.8000, 0.6000) | 0.00199601 ( 1 / 501 ) | 0.00000000 ( 0 / 501 / 598 ) - 3 [ 0.6000, 0.4000) | 0.00000000 ( 0 / 514 ) | 0.00000000 ( 0 / 514 / 619 ) - 4 [ 0.4000, 0.2000) | 0.00000000 ( 0 / 470 ) | 0.00212766 ( 1 / 470 / 590 ) - 5 [ 0.2000, 0.0000) | 0.00000000 ( 0 / 535 ) | 0.00000000 ( 0 / 535 / 653 ) - 6 [ 0.0000, -0.2000) | 0.00000000 ( 0 / 513 ) | 0.00000000 ( 0 / 513 / 637 ) - 7 [-0.2000, -0.4000) | 0.00198413 ( 1 / 504 ) | 0.00198413 ( 1 / 504 / 601 ) - 8 [-0.4000, -0.6000) | 0.00000000 ( 0 / 496 ) | 0.00000000 ( 0 / 496 / 614 ) - 9 [-0.6000, -0.8000) | 0.00193424 ( 1 / 517 ) | 0.00000000 ( 0 / 517 / 640 ) - 10 [-0.8000, -1.0000) | 0.00000000 ( 0 / 512 ) | 0.00195312 ( 1 / 512 / 648 ) + 1 [ 1.0000, 0.8000) | 0.00000000 ( 0 / 874 ) | 0.00000000 ( 0 / 874 / 1086 ) + 2 [ 0.8000, 0.6000) | 0.00000000 ( 0 / 889 ) | 0.00112486 ( 1 / 889 / 1100 ) + 3 [ 0.6000, 0.4000) | 0.00116009 ( 1 / 862 ) | 0.00116009 ( 1 / 862 / 1048 ) + 4 [ 0.4000, 0.2000) | 0.00118343 ( 1 / 845 ) | 0.00000000 ( 0 / 845 / 1055 ) + 5 [ 0.2000, 0.0000) | 0.00000000 ( 0 / 894 ) | 0.00000000 ( 0 / 894 / 1094 ) + 6 [ 0.0000, -0.2000) | 0.00000000 ( 0 / 862 ) | 0.00000000 ( 0 / 862 / 1039 ) + 7 [-0.2000, -0.4000) | 0.00000000 ( 0 / 902 ) | 0.00110865 ( 1 / 902 / 1128 ) + 8 [-0.4000, -0.6000) | 0.00114286 ( 1 / 875 ) | 0.00114286 ( 1 / 875 / 1066 ) + 9 [-0.6000, -0.8000) | 0.00116009 ( 1 / 862 ) | 0.00000000 ( 0 / 862 / 1082 ) + 10 [-0.8000, -1.0000) | 0.00000000 ( 0 / 837 ) | 0.00000000 ( 0 / 837 / 1028 ) --- - False hits (edt | rec): 7 | 7 + False hits (edt | rec): 6 | 6 G4 kernel has come to Quit state. ================== Deleting memory pools =================== -Number of memory pools allocated: 16; of which, static: 3 -Dynamic pools deleted: 13 / Total memory freed: 1.1 MB +Number of memory pools allocated: 18; of which, static: 3 +Dynamic pools deleted: 15 / Total memory freed: 1.1 MB ============================================================ RunManagerKernel is deleted. Good bye :) diff --git a/examples/advanced/ChargeExchangeMC/History b/examples/advanced/ChargeExchangeMC/History index cb5e1cbe6d..c96a53cbb8 100644 --- a/examples/advanced/ChargeExchangeMC/History +++ b/examples/advanced/ChargeExchangeMC/History @@ -7,6 +7,9 @@ cirrone@lns.infn.it History file of the ChargeExchangeMC application ==================================================== +25.10.2021 - B. Morgan (ChargeExchangeMC-V10-07-01) + Use G4StrUtil functions replacing deprecated G4String member functions + 24.05.2021 - B. Morgan (ChargeExchangeMC-V10-07-00) Bump required CMake version range to 3.12...3.20, matching core Geant4 diff --git a/examples/advanced/ChargeExchangeMC/README b/examples/advanced/ChargeExchangeMC/README deleted file mode 100644 index 7013091bc2..0000000000 --- a/examples/advanced/ChargeExchangeMC/README +++ /dev/null @@ -1,104 +0,0 @@ - - ===================================================================== - Geant4 - Cexmc advanced example - ===================================================================== - - README - ----------------------- - -Author: A. Radkov (alexey.radkov@gmail.com) - -------> Introduction - -Cexmc stands for Charge EXchange Monte Carlo. The program was used to simulate -real experiments in Petersburg Nuclear Physics Institute (PNPI, Russia). -Detailed User's Manual and explanatory images of the experimental setup can be -found in directory doc/ of this example. - -------> Compilation - -Basic modules of Cexmc must compile with Geant4 version 9.4. Cexmc won't compile -with older versions of Geant4. Cexmc contains several optional modules which can -be enabled or disabled in the makefile by setting dedicated macros: most of them -are listed in the beginning of the makefile and well commented. Modules may -involve additional dependencies. In the following table the dependencies and -related modules are shown. - -Dependency Requirement Makefile Macro / Module Comment --------------------------------------------------------------------------------- -boost::serialize Optional CEXMC_USE_PERSISTENCY / used when - Persistency (de)serialization of - events and run data - -boost::split Optional CEXMC_USE_PERSISTENCY / used when parsing - Main command line - arguments related to - persistency module - -boost::spirit Optional CEXMC_USE_CUSTOM_FILTER / used in custom - Custom filter filter engine - -cernlib Optional CEXMC_USE_GENBOD / Main user can choose - native GENBOD() as - phase space - generator - -CERN ROOT Optional CEXMC_USE_ROOT / used in histograming - Histograming - -CERN ROOT / Qt Optional CEXMC_USE_ROOTQT / used for live -binding Histograming histograms in Qt - sessions --------------------------------------------------------------------------------- - -The persistency module is compatible with a pretty old boost::serialize version -(compilation was tested under Scientific Linux 4.8 with gcc 3.4.6 and boost -version 1.32). Custom filter requires a newer boost as far as it uses modern -boost::spirit library which requires boost version 1.37 and higher. -Presence of CERN ROOT libraries is tested automatically in the makefile, but it -is possible to disable or enable the histograming framework manually using flag -CEXMC_USE_HISTOGRAMING in the makefile. -Compilation of visualization modules and interactive sessions depends on whether -standard Geant4 macros like G4VIS_USE, G4UI_USE, G4UI_USE_TCSH and G4UI_USE_QT -have been set. -If boost is installed in a special path in your system then you may need to -properly set environment variables BOOST_INCLUDE_PATH and BOOST_LIBRARY_PATH -which denote directories where boost include files and libraries are located. - -------> Run modes - -Run modes are set from command-line options. To see available command-line -options type in terminal 'cexmc -h' or just 'cexmc'. Some run modes can be -unavailable if certain modules were not compiled. - -Here is list of run modes categorized by type of interaction with user: - - 1. Batch mode. The simplest mode without any interaction with user. - No command line option is required. - 2. Interactive mode. The program provides an interactive shell. - To run in the interactive mode command line option -i must be specified. - 3. Graphical Qt mode. This mode is specified by command line option -g. - -List of run modes categorized by task: - - 1. Straight mode (or Monte Carlo mode). The program will read preinit and - init macros, then calculate acceptances and (optionally) save data in - project files. Project files are saved in a directory defined by - environment variable CEXMC_PROJECTS_DIR (or in the current directory if it - is not defined), name of the project is specified by option -w. Preinit - and init macros are set by options -p and -m respectively. In the straight - mode preinit macro must be specified explicitly, as far as desired - production model can be instantiated only in preinit phase. - 2. Replay mode (or Read project mode). In this mode the program will not use - common Geant4's event loop. Instead, it will sequentially read event data - from an existing project and pass them into - CexmcEventAction::EndOfEventAction(). The read project is specified by - option -r. This mode is useful when user wants to recalculate data from an - existing project with different conditions (for example with different - reconstruction parameters) or apply a custom filter. The results of run - can be written again into another project. - 3. Show results mode (or Output mode). The program will output various data - from an existing project (specified by option -r). Type(s) of data are - specified in option -o. For example, to show results of a run user can - specify -orun in command line. To show events, geometry and run results - user can specify -oevents,geom,run. diff --git a/examples/advanced/ChargeExchangeMC/doc/CexmcSetupImages.pdf b/examples/advanced/ChargeExchangeMC/doc/CexmcSetupImages.pdf deleted file mode 100644 index d5d73ca17e5f5f713911952cf99850d9fd8a288b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721387 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
      #k@z|a#TW+H`Kz)Ix5QMf6W{CR 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%0DpQZ?YVg9K+}HrX6xuHUg{&Z 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�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
      8Hyc`uU;*CUxI9eMpCXZO1(E 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 diff --git a/examples/advanced/ChargeExchangeMC/src/CexmcSetup.cc b/examples/advanced/ChargeExchangeMC/src/CexmcSetup.cc index 6113248fa9..75b4143966 100644 --- a/examples/advanced/ChargeExchangeMC/src/CexmcSetup.cc +++ b/examples/advanced/ChargeExchangeMC/src/CexmcSetup.cc @@ -457,13 +457,13 @@ void CexmcSetup::ReadRightDetectors( void ) { if ( ( *k )->GetLogicalVolume() == vetoCounterVolume ) { - if ( ( *k )->GetName().contains( "Right" ) ) + if ( G4StrUtil::contains(( *k )->GetName(), "Right" ) ) rightVetoCounter = *k; break; } if ( ( *k )->GetLogicalVolume() == calorimeterVolume ) { - if ( ( *k )->GetName().contains( "Right" ) ) + if ( G4StrUtil::contains(( *k )->GetName(), "Right" ) ) rightCalorimeter = *k; break; } diff --git a/examples/advanced/HGCal_testbeam/CMakeLists.txt b/examples/advanced/HGCal_testbeam/CMakeLists.txt index 4f4b0bcc78..651498a586 100644 --- a/examples/advanced/HGCal_testbeam/CMakeLists.txt +++ b/examples/advanced/HGCal_testbeam/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(HGCal_testbeam) diff --git a/examples/advanced/HGCal_testbeam/History b/examples/advanced/HGCal_testbeam/History index 8c329079f6..c8f1b3d839 100644 --- a/examples/advanced/HGCal_testbeam/History +++ b/examples/advanced/HGCal_testbeam/History @@ -14,6 +14,18 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +14-November-2021 G. Cosmo (exhgcaltb-V10-07-05) +- Fixed compilation warning for unused private member in PrimaryGeneratorAction. + +07-October-2021 I. Hrivnacova (exhgcaltb-V10-07-04) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root). + +19-July-2021 I. Hrivnacova (exhgcaltb-V10-07-03) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 10-June-21 V. Ivanchenko (exhgcaltb-V10-07-02) - SiliconPixelHit, SiPMHit - fixed bug in handling of NIEL energy deposition diff --git a/examples/advanced/HGCal_testbeam/README b/examples/advanced/HGCal_testbeam/README deleted file mode 100644 index 93092d98eb..0000000000 --- a/examples/advanced/HGCal_testbeam/README +++ /dev/null @@ -1,227 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example HGCal_testbeam - ---------------------- - - This example is based on the Geant4 standalone application developed - by Thorben Quast for the CMS HGCal studies: - https://github.com/ThorbenQuast/HGCal_TB_Geant4. - - The goal of this example is to demonstrate a test beam setup used - in HEP experiments, and as a base for the validation studies and - comparison with experiment data. - - It presents a test beam setup used in the HGCal studies in October - 2018. It can be easily extended to other configurations. - - Details on the High Granularity Calorimeter (HGCal) can be found - i.a. in the Technical Design Report: - https://cds.cern.ch/record/2293646/files/CMS-TDR-019.pdf - - 1. Detector description - ----------------------- - - Detector construction in this example assumes that the setup is - constructed with different elements placed one behind another along - z axis (beam axis). - There are 3 configurations user can choose from, and could be set - with UI command: - - /HGCalTestbeam/setup/configuration - - where by default is equal to 0, which means the HGCal testbeam - setup used in October 2018. - 1 builds the same calorimeter setup, but places in front of it - several beamline elements. - 2 builds a very simplistic test configuration. - - Whenever a silicon wafer or SiPM is placed in the detector, a sensitive - volume is attached to it, and will be used to collect signal. - - Silicon wafer is divided into cells (pixels), and each individual pixel - can collect signal. - - In order to change the maximum step size allowed in silicon pixels: - - /HGCalTestbeam/setup/stepSilicon - - where is value of the max step size in micrometres. By default - is equal to 30 um. - - 2. Signal - --------- - - Energy deposited within silicon pixels and SiPMs is registered in the - sensitive detectors. Each deposit is added individually to the vector - of hits, in order to allow the digitisation. - - Digitisation is performed at the end of the event. It accumulates the - energy deposits within pixels, taking into account the time cut on the - arrival of signal (global time of energy deposit). By default no time - cut is applied which means all the deposits are counted. It can be set - using UI command: - - /HGCalTestbeam/hits/timeCut
      - the Geant4 User's Guide for Application Developers, Appendix 10: - Geant4 Materials Database - . - -\section B1_s2 PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set in the QBBC physics list. This physics list - requires data files for electromagnetic and hadronic processes. - See more on installation of the datasets in - - Geant4 Installation Guide, Chapter 3.3: Note On Geant4 Datasets . - The following datasets: G4LEDATA, G4LEVELGAMMADATA, G4NEUTRONXSDATA, - G4SAIDXSDATA and G4ENSDFSTATEDATA are mandatory for this example. - - In addition the build-in interactive command: -\verbatim -/process/(in)activate processName -\endverbatim - allows to activate/inactivate the processes one by one. - -\section B1_s3 ACTION INITALIZATION - - A newly introduced class, B1ActionInitialization, instantiates and registers - to Geant4 kernel all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B1ActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - B1ActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - -\section B1_s4 PRIMARY GENERATOR - - The primary generator is defined in the B1PrimaryGeneratorAction class. - The default kinematics is a 6 MeV gamma, randomly distributed in front - of the envelope across 80% of the transverse (X,Y) envelope size. - This default setting can be changed via the Geant4 built-in commands - of the G4ParticleGun class. - -\section B1_s5 DETECTOR RESPONSE - - This example demonstrates a simple scoring implemented directly - in the user action classes. Alternative ways of scoring via Geant4 classes - can be found in the other examples. - - The energy deposited is collected step by step for a selected volume - in B1SteppingAction and accumulated event by event in B1EventAction. - - At end of event, the value acummulated in B1EventAction is added in B1RunAction - and summed over the whole run (see B1EventAction::EndOfevent()). - - Total dose deposited is computed at B1RunAction::EndOfRunAction(), - and printed together with informations about the primary particle. - In multi-threading mode the energy accumulated in G4Accumulable objects per - workers is merged to the master in B1RunAction::EndOfRunAction() and the final - result is printed on the screen. - - G4Accumulable type instead of G4double type is used for the B1RunAction - data members in order to facilitate merging of the values accumulated on workers - to the master. Currently the accumulables have to be registered to G4AccumulablesManager - and G4AccumulablesManager::Merge() has to be called from the users code. This is planned - to be further simplified with a closer integration of G4Accumulable classes in - the Geant4 kernel next year. - - An example of creating and computing new units (e.g., dose) is also shown - in the class constructor. - -
      - -The following paragraphs are common to all basic examples - -\section B1_A VISUALISATION - - The visualization manager is set via the G4VisExecutive class - in the main() function in exampleB1.cc. - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then -\verbatim -/vis/open DAWNFILE -\endverbatim - then to get the same view -\verbatim -/vis/viewer/copyView viewer-0 -\endverbatim - or to get the same view *plus* scene-modifications -\verbatim -/vis/viewer/set/all viewer-0 -\endverbatim - then to see the result -\verbatim -/vis/viewer/flush -\endverbatim - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - From Release 9.6 the vis.mac macro in example B1 has additional commands - that demonstrate additional functionality of the vis system, such as - displaying text, axes, scales, date, logo and shows how to change - viewpoint and style. Consider copying these to other examples or - your application. To see even more commands use help or - ls or browse the available UI commands in the Application - Developers Guide, Section 7.1. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example,\n - - - OpenGL Tutorial - - - DAWN Tutorial - - - HepRApp Tutorial - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - - -\section B1_B USER INTERFACES - - The user command interface is set via the G4UIExecutive class - in the main() function in exampleB1.cc - The selection of the user command interface is then done automatically - according to the Geant4 configuration or it can be done explicitly via - the third argument of the G4UIExecutive constructor (see exampleB4a.cc). - -\section B1_C HOW TO RUN - - - Execute exampleB1 in the 'interactive mode' with visualization -\verbatim -% exampleB1 -and type in the commands from run1.mac line by line: -Idle> /control/verbose 2 -Idle> /tracking/verbose 1 -Idle> /run/beamOn 10 -Idle> ... -Idle> exit -\endverbatim - or -\verbatim -Idle> /control/execute run1.mac -.... -Idle> exit -\endverbatim - - - Execute exampleB1 in the 'batch' mode from macro files - (without visualization) -\verbatim -% exampleB1 run2.mac -% exampleB1 exampleB1.in > exampleB1.out -\endverbatim - -*/ - - diff --git a/examples/basic/B1/CMakeLists.txt b/examples/basic/B1/CMakeLists.txt index a9ea3ffba8..9295d45d25 100644 --- a/examples/basic/B1/CMakeLists.txt +++ b/examples/basic/B1/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B1) #---------------------------------------------------------------------------- diff --git a/examples/basic/B1/History b/examples/basic/B1/History index 26e8924f79..0c2c7598d7 100644 --- a/examples/basic/B1/History +++ b/examples/basic/B1/History @@ -14,6 +14,14 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +13-07-21 I. Hrivnacova (exampleB1-V10-07-03) +- Use B1 in multiple inclusion protection ifdefs +- Fixes in Doxygen documentation + +12-07-21 I. Hrivnacova (exampleB1-V10-07-02) +- Introduced namespace instead of a class names prefix +- Declare overriding functions 'override' (and removed 'virtual' keyword) + 31-05-21 I. Hrivnacova (exampleB1-V10-07-01) - Use nullptr instead of 0 - Clean trailing whitespaces from all files diff --git a/examples/basic/B1/README b/examples/basic/B1/README deleted file mode 100644 index 47bf50f6da..0000000000 --- a/examples/basic/B1/README +++ /dev/null @@ -1,172 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example B1 - ----------- - - This example demonstrates a very simple application where an energy - deposit is accounted in user actions and their associated objects - and a dose in a selected volume is calculated. - - - 1- GEOMETRY DEFINITION - - The geometry is constructed in the B1DetectorConstruction class. - The setup consists of a an envelope of box shape containing two - volumes: a spherical cone and a trapezoid. - - In this example we use some common materials materials for medical - applications. The envelope is made of water and the two inner volumes - are made from tissue and bone materials. - The materials are created with the help of the G4NistManager class, - which allows to build a material from the NIST database using their - names. All available materials can be found in the Geant4 User's Guide - for Application Developers, Appendix 10: Geant4 Materials Database. - - 2- PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set in the QBBC physics list. This physics list - requires data files for electromagnetic and hadronic processes. - See more on installation of the datasets in Geant4 Installation Guide, - Chapter 3.3: Note On Geant4 Datasets: - http://geant4.web.cern.ch/geant4/UserDocumentation/UsersGuides - /InstallationGuide/html/ch03s03.html - The following datasets: G4LEDATA, G4LEVELGAMMADATA, G4NEUTRONXSDATA, - G4SAIDXSDATA and G4ENSDFSTATEDATA are mandatory for this example. - - In addition the build-in interactive command: - /process/(in)activate processName - allows to activate/inactivate the processes one by one. - - 3- ACTION INITALIZATION - - A newly introduced class, B1ActionInitialization, instantiates and registers - to Geant4 kernel all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B1ActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - B1ActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - - 4- PRIMARY GENERATOR - - The primary generator is defined in the B1PrimaryGeneratorAction class. - The default kinematics is a 6 MeV gamma, randomly distributed in front - of the envelope across 80% of the transverse (X,Y) envelope size. - This default setting can be changed via the Geant4 built-in commands - of the G4ParticleGun class. - - 5- DETECTOR RESPONSE - - This example demonstrates a simple scoring implemented directly - in the user action classes. Alternative ways of scoring via Geant4 classes - can be found in the other examples. - - The energy deposited is collected step by step for a selected volume - in B1SteppingAction and accumulated event by event in B1EventAction. - - At end of event, the value acummulated in B1EventAction is added in B1RunAction - and summed over the whole run (see B1EventAction::EndOfevent()). - - Total dose deposited is computed at B1RunAction::EndOfRunAction(), - and printed together with informations about the primary particle. - In multi-threading mode the energy accumulated in G4Accumulable objects per - workers is merged to the master in B1RunAction::EndOfRunAction() and the final - result is printed on the screen. - - G4Parameter type instead of G4double type is used for the B1RunAction - data members in order to facilitate merging of the values accumulated on workers - to the master. Currently the accumulables have to be registered to G4AccumulablesManager - and G4AccumulablesManager::Merge() has to be called from the users code. This is planned - to be further simplified with a closer integration of G4Accumulable classes in - the Geant4 kernel next year. - - An example of creating and computing new units (e.g., dose) is also shown - in the class constructor. - - The following paragraphs are common to all basic examples - - A- VISUALISATION - - The visualization manager is set via the G4VisExecutive class - in the main() function in exampleB1.cc. - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then - /vis/open DAWNFILE - then to get the same view - /vis/viewer/copyView viewer-0 - or to get the same view *plus* scene-modifications - /vis/viewer/set/all viewer-0 - then to see the result - /vis/viewer/flush - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - From Release 9.6 the vis.mac macro in example B1 has additional commands - that demonstrate additional functionality of the vis system, such as - displaying text, axes, scales, date, logo and shows how to change - viewpoint and style. Consider copying these to other examples or - your application. To see even more commands use help or - ls or browse the available UI commands in the Application - Developers Guide, Section 7.1. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example, - http://geant4.slac.stanford.edu/Presentations/vis/G4[VIS]Tutorial/G4[VIS]Tutorial.html - (where [VIS] can be replaced by DAWN, OpenGL and HepRApp) - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - - B- USER INTERFACES - - The user command interface is set via the G4UIExecutive class - in the main() function in exampleB1.cc - The selection of the user command interface is then done automatically - according to the Geant4 configuration or it can be done explicitly via - the third argument of the G4UIExecutive constructor (see exampleB4a.cc). - - C- HOW TO RUN - - - Execute exampleB1 in the 'interactive mode' with visualization: - % ./exampleB1 - and type in the commands from run1.mac line by line: - Idle> /control/verbose 2 - Idle> /tracking/verbose 1 - Idle> /run/beamOn 10 - Idle> ... - Idle> exit - or - Idle> /control/execute run1.mac - .... - Idle> exit - - - Execute exampleB1 in the 'batch' mode from macro files - (without visualization) - % ./exampleB1 run2.mac - % ./exampleB1 exampleB1.in > exampleB1.out - - diff --git a/examples/basic/B1/exampleB1.cc b/examples/basic/B1/exampleB1.cc index c149667c5b..099a77825f 100644 --- a/examples/basic/B1/exampleB1.cc +++ b/examples/basic/B1/exampleB1.cc @@ -27,8 +27,8 @@ /// \file exampleB1.cc /// \brief Main program of the B1 example -#include "B1DetectorConstruction.hh" -#include "B1ActionInitialization.hh" +#include "DetectorConstruction.hh" +#include "ActionInitialization.hh" #include "G4RunManagerFactory.hh" #include "G4SteppingVerbose.hh" @@ -40,6 +40,8 @@ #include "Randomize.hh" +using namespace B1; + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... int main(int argc,char** argv) @@ -64,7 +66,7 @@ int main(int argc,char** argv) // Set mandatory initialization classes // // Detector construction - runManager->SetUserInitialization(new B1DetectorConstruction()); + runManager->SetUserInitialization(new DetectorConstruction()); // Physics list G4VModularPhysicsList* physicsList = new QBBC; @@ -72,7 +74,7 @@ int main(int argc,char** argv) runManager->SetUserInitialization(physicsList); // User action initialization - runManager->SetUserInitialization(new B1ActionInitialization()); + runManager->SetUserInitialization(new ActionInitialization()); // Initialize visualization // diff --git a/examples/basic/B1/exampleB1.out b/examples/basic/B1/exampleB1.out index dbec5d95d4..5681ba9f77 100644 --- a/examples/basic/B1/exampleB1.out +++ b/examples/basic/B1/exampleB1.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -28,10 +28,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -73,40 +71,107 @@ End of Run User Vis Actions: none Some /vis commands (optionally) take a string to specify colour. "/vis/list" to see available colours. -Checking overlaps for volume Envelope (G4Box) ... OK! -Checking overlaps for volume Shape1 (G4Cons) ... OK! -Checking overlaps for volume Shape2 (G4Trd) ... OK! +Checking overlaps for volume Envelope:0 (G4Box) ... OK! +Checking overlaps for volume Shape1:0 (G4Cons) ... OK! +Checking overlaps for volume Shape2:0 (G4Trd) ... OK! ### HadronInelasticQBBC Construct Process: Emin(FTFP)= 3 GeV Emax(FTFP)= 100000 GeV Emin(BERT)= 1 GeV Emax(BERT)= 6 GeV Emax(BERTpions)= 12 GeV Emin(BIC) = 0 GeV Emax(BIC)= 1.5 GeV. ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -116,25 +181,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -144,29 +209,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -174,31 +239,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -207,12 +272,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -220,12 +285,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -233,31 +298,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -265,31 +330,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -297,31 +362,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -329,32 +394,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -362,32 +427,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -395,31 +460,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -427,27 +492,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -456,18 +521,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -475,71 +540,71 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: ionElastic - Model: NNDiffuseElastic: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: NNDiffuseElastic: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -547,13 +612,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -561,13 +626,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -575,12 +640,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -588,13 +653,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -602,13 +667,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -616,13 +681,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -630,60 +695,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -691,27 +756,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -719,27 +784,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -747,26 +812,26 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -774,13 +839,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -803,7 +868,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -823,7 +887,7 @@ See commands in /vis/modeling/trajectories/ for other options. --------------------End of Global Run----------------------- The run consists of 1000 gamma of 6 MeV - Cumulated dose per run, in scoring volume : 44.6588 picoGy rms = 3.99536 picoGy + Cumulated dose per run, in scoring volume : 34.5972 picoGy rms = 3.51258 picoGy ------------------------------------------------------------ 0 events have been kept for refreshing and/or reviewing. @@ -843,7 +907,7 @@ See commands in /vis/modeling/trajectories/ for other options. --------------------End of Global Run----------------------- The run consists of 1000 proton of 210 MeV - Cumulated dose per run, in scoring volume : 4.77268 nanoGy rms = 147.506 picoGy + Cumulated dose per run, in scoring volume : 4.88767 nanoGy rms = 145.546 picoGy ------------------------------------------------------------ 0 events have been kept for refreshing and/or reviewing. diff --git a/examples/basic/B1/include/B1ActionInitialization.hh b/examples/basic/B1/include/ActionInitialization.hh similarity index 85% rename from examples/basic/B1/include/B1ActionInitialization.hh rename to examples/basic/B1/include/ActionInitialization.hh index b5119453ab..7bef838962 100644 --- a/examples/basic/B1/include/B1ActionInitialization.hh +++ b/examples/basic/B1/include/ActionInitialization.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B1ActionInitialization.hh -/// \brief Definition of the B1ActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the B1::ActionInitialization class #ifndef B1ActionInitialization_h #define B1ActionInitialization_h 1 @@ -34,18 +34,21 @@ /// Action initialization class. -class B1ActionInitialization : public G4VUserActionInitialization +namespace B1 +{ + +class ActionInitialization : public G4VUserActionInitialization { public: - B1ActionInitialization(); - virtual ~B1ActionInitialization(); + ActionInitialization(); + ~ActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; + void BuildForMaster() const override; + void Build() const override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - - diff --git a/examples/basic/B1/include/B1DetectorConstruction.hh b/examples/basic/B1/include/DetectorConstruction.hh similarity index 86% rename from examples/basic/B1/include/B1DetectorConstruction.hh rename to examples/basic/B1/include/DetectorConstruction.hh index 74dc556eca..81ef3f8a40 100644 --- a/examples/basic/B1/include/B1DetectorConstruction.hh +++ b/examples/basic/B1/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B1DetectorConstruction.hh -/// \brief Definition of the B1DetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the B1::DetectorConstruction class #ifndef B1DetectorConstruction_h #define B1DetectorConstruction_h 1 @@ -38,21 +38,25 @@ class G4LogicalVolume; /// Detector construction class to define materials and geometry. -class B1DetectorConstruction : public G4VUserDetectorConstruction +namespace B1 +{ + +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B1DetectorConstruction(); - virtual ~B1DetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; - virtual G4VPhysicalVolume* Construct(); + G4VPhysicalVolume* Construct() override; G4LogicalVolume* GetScoringVolume() const { return fScoringVolume; } protected: - G4LogicalVolume* fScoringVolume; + G4LogicalVolume* fScoringVolume = nullptr; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - diff --git a/examples/basic/B1/include/B1EventAction.hh b/examples/basic/B1/include/EventAction.hh similarity index 82% rename from examples/basic/B1/include/B1EventAction.hh rename to examples/basic/B1/include/EventAction.hh index cff5bde19b..532e85abce 100644 --- a/examples/basic/B1/include/B1EventAction.hh +++ b/examples/basic/B1/include/EventAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B1EventAction.hh -/// \brief Definition of the B1EventAction class +/// \file EventAction.hh +/// \brief Definition of the B1::EventAction class #ifndef B1EventAction_h #define B1EventAction_h 1 @@ -33,27 +33,32 @@ #include "G4UserEventAction.hh" #include "globals.hh" -class B1RunAction; - /// Event action class /// -class B1EventAction : public G4UserEventAction +namespace B1 +{ + +class RunAction; + +class EventAction : public G4UserEventAction { public: - B1EventAction(B1RunAction* runAction); - virtual ~B1EventAction(); + EventAction(RunAction* runAction); + ~EventAction() override; - virtual void BeginOfEventAction(const G4Event* event); - virtual void EndOfEventAction(const G4Event* event); + void BeginOfEventAction(const G4Event* event) override; + void EndOfEventAction(const G4Event* event) override; void AddEdep(G4double edep) { fEdep += edep; } private: - B1RunAction* fRunAction; - G4double fEdep; + RunAction* fRunAction = nullptr; + G4double fEdep = 0.; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B1/include/B1PrimaryGeneratorAction.hh b/examples/basic/B1/include/PrimaryGeneratorAction.hh similarity index 85% rename from examples/basic/B1/include/B1PrimaryGeneratorAction.hh rename to examples/basic/B1/include/PrimaryGeneratorAction.hh index 346292173a..14d7fd0335 100644 --- a/examples/basic/B1/include/B1PrimaryGeneratorAction.hh +++ b/examples/basic/B1/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B1PrimaryGeneratorAction.hh -/// \brief Definition of the B1PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the B1::PrimaryGeneratorAction class #ifndef B1PrimaryGeneratorAction_h #define B1PrimaryGeneratorAction_h 1 @@ -43,23 +43,28 @@ class G4Box; /// The default kinematic is a 6 MeV gamma, randomly distribued /// in front of the phantom across 80% of the (X,Y) phantom size. -class B1PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +namespace B1 +{ + +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B1PrimaryGeneratorAction(); - virtual ~B1PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; // method from the base class - virtual void GeneratePrimaries(G4Event*); + void GeneratePrimaries(G4Event*) override; // method to access particle gun const G4ParticleGun* GetParticleGun() const { return fParticleGun; } private: - G4ParticleGun* fParticleGun; // pointer a to G4 gun class - G4Box* fEnvelopeBox; + G4ParticleGun* fParticleGun = nullptr; // pointer a to G4 gun class + G4Box* fEnvelopeBox = nullptr; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B1/include/B1RunAction.hh b/examples/basic/B1/include/RunAction.hh similarity index 85% rename from examples/basic/B1/include/B1RunAction.hh rename to examples/basic/B1/include/RunAction.hh index ed4478dd03..f8eb97cf48 100644 --- a/examples/basic/B1/include/B1RunAction.hh +++ b/examples/basic/B1/include/RunAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B1RunAction.hh -/// \brief Definition of the B1RunAction class +/// \file RunAction.hh +/// \brief Definition of the B1::RunAction class #ifndef B1RunAction_h #define B1RunAction_h 1 @@ -42,22 +42,26 @@ class G4Run; /// from the energy deposit accumulated via stepping and event actions. /// The computed dose is then printed on the screen. -class B1RunAction : public G4UserRunAction +namespace B1 +{ + +class RunAction : public G4UserRunAction { public: - B1RunAction(); - virtual ~B1RunAction(); + RunAction(); + ~RunAction() override; - // virtual G4Run* GenerateRun(); - virtual void BeginOfRunAction(const G4Run*); - virtual void EndOfRunAction(const G4Run*); + void BeginOfRunAction(const G4Run*) override; + void EndOfRunAction(const G4Run*) override; void AddEdep (G4double edep); private: - G4Accumulable fEdep; - G4Accumulable fEdep2; + G4Accumulable fEdep = 0.; + G4Accumulable fEdep2 = 0.; }; +} + #endif diff --git a/examples/basic/B1/include/B1SteppingAction.hh b/examples/basic/B1/include/SteppingAction.hh similarity index 83% rename from examples/basic/B1/include/B1SteppingAction.hh rename to examples/basic/B1/include/SteppingAction.hh index b8ee3f5d8d..d4d5764549 100644 --- a/examples/basic/B1/include/B1SteppingAction.hh +++ b/examples/basic/B1/include/SteppingAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B1SteppingAction.hh -/// \brief Definition of the B1SteppingAction class +/// \file SteppingAction.hh +/// \brief Definition of the B1::SteppingAction class #ifndef B1SteppingAction_h #define B1SteppingAction_h 1 @@ -33,27 +33,32 @@ #include "G4UserSteppingAction.hh" #include "globals.hh" -class B1EventAction; - class G4LogicalVolume; /// Stepping action class /// -class B1SteppingAction : public G4UserSteppingAction +namespace B1 +{ + +class EventAction; + +class SteppingAction : public G4UserSteppingAction { public: - B1SteppingAction(B1EventAction* eventAction); - virtual ~B1SteppingAction(); + SteppingAction(EventAction* eventAction); + ~SteppingAction() override; // method from the base class - virtual void UserSteppingAction(const G4Step*); + void UserSteppingAction(const G4Step*) override; private: - B1EventAction* fEventAction; - G4LogicalVolume* fScoringVolume; + EventAction* fEventAction = nullptr; + G4LogicalVolume* fScoringVolume = nullptr; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B1/src/B1ActionInitialization.cc b/examples/basic/B1/src/ActionInitialization.cc similarity index 74% rename from examples/basic/B1/src/B1ActionInitialization.cc rename to examples/basic/B1/src/ActionInitialization.cc index 7b3659a5d8..b0a032bc07 100644 --- a/examples/basic/B1/src/B1ActionInitialization.cc +++ b/examples/basic/B1/src/ActionInitialization.cc @@ -24,47 +24,51 @@ // ******************************************************************** // // -/// \file B1ActionInitialization.cc -/// \brief Implementation of the B1ActionInitialization class +/// \file ActionInitialization.cc +/// \brief Implementation of the B1::ActionInitialization class -#include "B1ActionInitialization.hh" -#include "B1PrimaryGeneratorAction.hh" -#include "B1RunAction.hh" -#include "B1EventAction.hh" -#include "B1SteppingAction.hh" +#include "ActionInitialization.hh" +#include "PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "EventAction.hh" +#include "SteppingAction.hh" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B1ActionInitialization::B1ActionInitialization() - : G4VUserActionInitialization() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B1ActionInitialization::~B1ActionInitialization() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B1ActionInitialization::BuildForMaster() const +namespace B1 { - B1RunAction* runAction = new B1RunAction; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::~ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::BuildForMaster() const +{ + RunAction* runAction = new RunAction; SetUserAction(runAction); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B1ActionInitialization::Build() const +void ActionInitialization::Build() const { - SetUserAction(new B1PrimaryGeneratorAction); + SetUserAction(new PrimaryGeneratorAction); - B1RunAction* runAction = new B1RunAction; + RunAction* runAction = new RunAction; SetUserAction(runAction); - B1EventAction* eventAction = new B1EventAction(runAction); + EventAction* eventAction = new EventAction(runAction); SetUserAction(eventAction); - SetUserAction(new B1SteppingAction(eventAction)); + SetUserAction(new SteppingAction(eventAction)); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B1/src/B1DetectorConstruction.cc b/examples/basic/B1/src/DetectorConstruction.cc similarity index 95% rename from examples/basic/B1/src/B1DetectorConstruction.cc rename to examples/basic/B1/src/DetectorConstruction.cc index 8c81d01681..8817eb485e 100644 --- a/examples/basic/B1/src/B1DetectorConstruction.cc +++ b/examples/basic/B1/src/DetectorConstruction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B1DetectorConstruction.cc -/// \brief Implementation of the B1DetectorConstruction class +/// \file DetectorConstruction.cc +/// \brief Implementation of the B1::DetectorConstruction class -#include "B1DetectorConstruction.hh" +#include "DetectorConstruction.hh" #include "G4RunManager.hh" #include "G4NistManager.hh" @@ -40,21 +40,22 @@ #include "G4PVPlacement.hh" #include "G4SystemOfUnits.hh" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B1DetectorConstruction::B1DetectorConstruction() -: G4VUserDetectorConstruction(), - fScoringVolume(nullptr) -{ } +namespace B1 +{ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B1DetectorConstruction::~B1DetectorConstruction() -{ } +DetectorConstruction::DetectorConstruction() +{} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B1DetectorConstruction::Construct() +DetectorConstruction::~DetectorConstruction() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4VPhysicalVolume* DetectorConstruction::Construct() { // Get nist material manager G4NistManager* nist = G4NistManager::Instance(); @@ -185,3 +186,5 @@ G4VPhysicalVolume* B1DetectorConstruction::Construct() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B1/src/B1EventAction.cc b/examples/basic/B1/src/EventAction.cc similarity index 85% rename from examples/basic/B1/src/B1EventAction.cc rename to examples/basic/B1/src/EventAction.cc index f6acaacefa..a4005507a8 100644 --- a/examples/basic/B1/src/B1EventAction.cc +++ b/examples/basic/B1/src/EventAction.cc @@ -24,41 +24,44 @@ // ******************************************************************** // // -/// \file B1EventAction.cc -/// \brief Implementation of the B1EventAction class +/// \file EventAction.cc +/// \brief Implementation of the B1::EventAction class -#include "B1EventAction.hh" -#include "B1RunAction.hh" +#include "EventAction.hh" +#include "RunAction.hh" #include "G4Event.hh" #include "G4RunManager.hh" +namespace B1 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B1EventAction::B1EventAction(B1RunAction* runAction) -: G4UserEventAction(), - fRunAction(runAction), - fEdep(0.) +EventAction::EventAction(RunAction* runAction) +: fRunAction(runAction) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B1EventAction::~B1EventAction() +EventAction::~EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B1EventAction::BeginOfEventAction(const G4Event*) +void EventAction::BeginOfEventAction(const G4Event*) { fEdep = 0.; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B1EventAction::EndOfEventAction(const G4Event*) +void EventAction::EndOfEventAction(const G4Event*) { // accumulate statistics in run action fRunAction->AddEdep(fEdep); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B1/src/B1PrimaryGeneratorAction.cc b/examples/basic/B1/src/PrimaryGeneratorAction.cc similarity index 89% rename from examples/basic/B1/src/B1PrimaryGeneratorAction.cc rename to examples/basic/B1/src/PrimaryGeneratorAction.cc index e507fd3f4f..f2e74058a8 100644 --- a/examples/basic/B1/src/B1PrimaryGeneratorAction.cc +++ b/examples/basic/B1/src/PrimaryGeneratorAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B1PrimaryGeneratorAction.cc -/// \brief Implementation of the B1PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the B1::PrimaryGeneratorAction class -#include "B1PrimaryGeneratorAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4LogicalVolumeStore.hh" #include "G4LogicalVolume.hh" @@ -39,12 +39,12 @@ #include "G4SystemOfUnits.hh" #include "Randomize.hh" +namespace B1 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B1PrimaryGeneratorAction::B1PrimaryGeneratorAction() -: G4VUserPrimaryGeneratorAction(), - fParticleGun(nullptr), - fEnvelopeBox(nullptr) +PrimaryGeneratorAction::PrimaryGeneratorAction() { G4int n_particle = 1; fParticleGun = new G4ParticleGun(n_particle); @@ -61,14 +61,14 @@ B1PrimaryGeneratorAction::B1PrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B1PrimaryGeneratorAction::~B1PrimaryGeneratorAction() +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B1PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { //this function is called at the begining of ecah event // @@ -96,7 +96,7 @@ void B1PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) msg << "Envelope volume of box shape not found.\n"; msg << "Perhaps you have changed geometry.\n"; msg << "The gun will be place at the center."; - G4Exception("B1PrimaryGeneratorAction::GeneratePrimaries()", + G4Exception("PrimaryGeneratorAction::GeneratePrimaries()", "MyCode0002",JustWarning,msg); } @@ -112,3 +112,6 @@ void B1PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} + + diff --git a/examples/basic/B1/src/B1RunAction.cc b/examples/basic/B1/src/RunAction.cc similarity index 87% rename from examples/basic/B1/src/B1RunAction.cc rename to examples/basic/B1/src/RunAction.cc index 51817b93f0..deece5453f 100644 --- a/examples/basic/B1/src/B1RunAction.cc +++ b/examples/basic/B1/src/RunAction.cc @@ -24,13 +24,13 @@ // ******************************************************************** // // -/// \file B1RunAction.cc -/// \brief Implementation of the B1RunAction class +/// \file RunAction.cc +/// \brief Implementation of the B1::RunAction class -#include "B1RunAction.hh" -#include "B1PrimaryGeneratorAction.hh" -#include "B1DetectorConstruction.hh" -// #include "B1Run.hh" +#include "RunAction.hh" +#include "PrimaryGeneratorAction.hh" +#include "DetectorConstruction.hh" +// #include "Run.hh" #include "G4RunManager.hh" #include "G4Run.hh" @@ -40,12 +40,12 @@ #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +namespace B1 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B1RunAction::B1RunAction() -: G4UserRunAction(), - fEdep(0.), - fEdep2(0.) +RunAction::RunAction() { // add new units for dose // @@ -67,12 +67,12 @@ B1RunAction::B1RunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B1RunAction::~B1RunAction() +RunAction::~RunAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B1RunAction::BeginOfRunAction(const G4Run*) +void RunAction::BeginOfRunAction(const G4Run*) { // inform the runManager to save random number seed G4RunManager::GetRunManager()->SetRandomNumberStore(false); @@ -85,7 +85,7 @@ void B1RunAction::BeginOfRunAction(const G4Run*) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B1RunAction::EndOfRunAction(const G4Run* run) +void RunAction::EndOfRunAction(const G4Run* run) { G4int nofEvents = run->GetNumberOfEvent(); if (nofEvents == 0) return; @@ -102,18 +102,18 @@ void B1RunAction::EndOfRunAction(const G4Run* run) G4double rms = edep2 - edep*edep/nofEvents; if (rms > 0.) rms = std::sqrt(rms); else rms = 0.; - const B1DetectorConstruction* detectorConstruction - = static_cast + const DetectorConstruction* detConstruction + = static_cast (G4RunManager::GetRunManager()->GetUserDetectorConstruction()); - G4double mass = detectorConstruction->GetScoringVolume()->GetMass(); + G4double mass = detConstruction->GetScoringVolume()->GetMass(); G4double dose = edep/mass; G4double rmsDose = rms/mass; // Run conditions // note: There is no primary generator action object for "master" // run manager for multi-threaded mode. - const B1PrimaryGeneratorAction* generatorAction - = static_cast + const PrimaryGeneratorAction* generatorAction + = static_cast (G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction()); G4String runCondition; if (generatorAction) @@ -152,12 +152,12 @@ void B1RunAction::EndOfRunAction(const G4Run* run) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B1RunAction::AddEdep(G4double edep) +void RunAction::AddEdep(G4double edep) { fEdep += edep; fEdep2 += edep*edep; } - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} diff --git a/examples/basic/B1/src/B1SteppingAction.cc b/examples/basic/B1/src/SteppingAction.cc similarity index 81% rename from examples/basic/B1/src/B1SteppingAction.cc rename to examples/basic/B1/src/SteppingAction.cc index 4c6d25659a..b3573c0938 100644 --- a/examples/basic/B1/src/B1SteppingAction.cc +++ b/examples/basic/B1/src/SteppingAction.cc @@ -24,40 +24,41 @@ // ******************************************************************** // // -/// \file B1SteppingAction.cc -/// \brief Implementation of the B1SteppingAction class +/// \file SteppingAction.cc +/// \brief Implementation of the B1::SteppingAction class -#include "B1SteppingAction.hh" -#include "B1EventAction.hh" -#include "B1DetectorConstruction.hh" +#include "SteppingAction.hh" +#include "EventAction.hh" +#include "DetectorConstruction.hh" #include "G4Step.hh" #include "G4Event.hh" #include "G4RunManager.hh" #include "G4LogicalVolume.hh" +namespace B1 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B1SteppingAction::B1SteppingAction(B1EventAction* eventAction) -: G4UserSteppingAction(), - fEventAction(eventAction), - fScoringVolume(nullptr) +SteppingAction::SteppingAction(EventAction* eventAction) +: fEventAction(eventAction) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B1SteppingAction::~B1SteppingAction() +SteppingAction::~SteppingAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B1SteppingAction::UserSteppingAction(const G4Step* step) +void SteppingAction::UserSteppingAction(const G4Step* step) { if (!fScoringVolume) { - const B1DetectorConstruction* detectorConstruction - = static_cast + const DetectorConstruction* detConstruction + = static_cast (G4RunManager::GetRunManager()->GetUserDetectorConstruction()); - fScoringVolume = detectorConstruction->GetScoringVolume(); + fScoringVolume = detConstruction->GetScoringVolume(); } // get volume of the current step @@ -75,3 +76,4 @@ void B1SteppingAction::UserSteppingAction(const G4Step* step) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} diff --git a/examples/basic/B2/.README.txt b/examples/basic/B2/.README.txt deleted file mode 100644 index 10674d29ed..0000000000 --- a/examples/basic/B2/.README.txt +++ /dev/null @@ -1,230 +0,0 @@ - -///\file "B2/.README.txt" -///\brief Example B2 README page - -/*! \page ExampleB2 Example B2 - -This example simulates a simplified fixed target experiment. - -\section B2_s1 GEOMETRY DEFINITION - - The setup consists of a target followed by six chambers of increasing - transverse size at defined instances from the target. These chambers are - located in a region called the Tracker region. - Their shape are cylinders, constructed as simple cylinders - (in B2aDetectorConstruction) and as parametrised volumes - (in B2bDetectorConstruction), see also B2bChamberParameterisation class. - - In addition, a global, uniform, and transverse magnetic field can be - applied using G4GlobalMagFieldMessenger, instantiated in - B2aDetectorConstruction::ConstructSDandField with a non zero field value, - or via interactive commands. - For example: -\verbatim -/globalField/setValue 0.2 0 0 tesla -\endverbatim - An instance of the B2TrackerSD class is created and associated with each - logical chamber volume (in B2a) and with the one G4LogicalVolume associated - with G4PVParameterised (in B2b). - - One can change the materials of the target and the chambers - interactively via the commands defined in B2aDetectorMessenger - (or B2bDetectorMessenger). For example: -\verbatim -/B2/det/setTargetMaterial G4_WATER -/B2/det/setChamberMaterial G4_Ar -\endverbatim - -\section B2_s2 PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set in the FTFP_BERT physics list. This physics list - requires data files for electromagnetic and hadronic processes. - See more on installation of the datasets in - - Geant4 Installation Guide, Chapter 3.3: Note On Geant4 Datasets . - The following datasets: G4LEDATA, G4LEVELGAMMADATA, G4SAIDXSDATA and - G4ENSDFSTATEDATA are mandatory for this example. - - In addition, the build-in interactive command: -\verbatim -/process/(in)activate processName -\endverbatim - allows the user to activate/inactivate the processes one by one. - -\section B2_s3 ACTION INITALIZATION - - A newly introduced class, B2ActionInitialization, - instantiates and registers to Geant4 kernel all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B2ActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - B2ActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - -\section B2_s4 PRIMARY GENERATOR - - The primary generator action class employs the G4ParticleGun. - The primary kinematics consists of a single particle which starts at the world boundary - and hits the target perpendicular to the entrance face. The type of the particle - and its energy can be changed via the G4 built-in commands of - the G4ParticleGun class. - Note that this particular case of starting a primary particle on the world boundary - requires shooting in a direction towards inside the world. - -\section B2_s5 RUNS and EVENTS - - A run is a set of events. - - The user has control: - - at Begin and End of each run (class B2RunAction) - - at Begin and End of each event (class B2EventAction) - - at Begin and End of each track (class TrackingAction, not used here) - - at End of each step (class SteppingAction, not used here) - - The event number is written to the log file every requested number - of events in B2EventAction::BeginOfEventAction() and - B2EventAction::EndOfEventAction(). - Moreover, for the first 100 events and every 100 events thereafter - information about the number of stored trajectories in the event - is printed as well as the number of hits stored in the G4VHitsCollection. - - The run number is printed at B2RunAction::BeginOfRunAction(), where the - G4RunManager is also informed how to SetRandomNumberStore for storing - initial random number seeds per run or per event. - - \section B2_s6 USER LIMITS - - This example also illustrates how to introduce tracking constraints - like maximum step length, minimum kinetic energy etc. via the G4UserLimits - class and associated G4StepLimiter and G4UserSpecialCuts processes. - See B2aDetectorConstruction (or B2bDetectorConstruction). - - The maximum step limit in the tracker region can be set by the interactive - command (see B2aDetectorMessenger, B2bDetectorMessenger classes). - For example: - -\verbatim -/B2/det/stepMax 1.0 mm -\endverbatim - -\section B2_s7 DETECTOR RESPONSE - - A HIT is a step per step record of all the information needed to - simulate and analyse the detector response. - - In this example the Tracker chambers are considered to be the detector. - Therefore, the chambers are declared 'sensitive detectors' (SD) in - the B2aDetectorConstruction (or B2bDetectorConstruction) class. - They are associated with an instance of the B2TrackerSD class. - - Then, a Hit is defined as a set of 4 informations per step, inside - the chambers, namely: - - the track identifier (an integer), - - the chamber number, - - the total energy deposit in this step, and - - the position of the energy deposit. - - A given hit is an instance of the class B2TrackerHit which is created - during the tracking of a particle, step by step, in the method - B2TrackerSD::ProcessHits(). This hit is inserted in a HitsCollection. - - The HitsCollection is printed at the end of each event (via the method - B2TrackerSD::EndOfEvent()), under the control of the command: -\verbatim -/hits/verbose 2 -\endverbatim - -
      - - The following paragraphs are common to all basic examples - -\section B2_A VISUALISATION - - The visualization manager is set via the G4VisExecutive class - in the main () function in exampleB2a.cc (or exampleB2b.cc). - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then -\verbatim -/vis/open DAWNFILE -\endverbatim - then to get the same view -\verbatim -/vis/viewer/copyView viewer-0 -\endverbatim - or to get the same view *plus* scene-modifications -\verbatim -/vis/viewer/set/all viewer-0 -\endverbatim - then to see the result -\verbatim -/vis/viewer/flush -\endverbatim - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example,\n - - - OpenGL Tutorial - - - DAWN Tutorial - - - HepRApp Tutorial - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - -\section B2_B USER INTERFACES - - The user command interface is set via the G4UIExecutive class - in the main () function in exampleB2a.cc - The selection of the user command interface is then done automatically - according to the Geant4 configuration or it can be done explicitly via - the third argument of the G4UIExecutive constructor (see exampleB2a.cc). - -\section B2_C HOW TO RUN - - - Execute exampleB2a in the 'interactive mode' with visualization -\verbatim -% exampleB2a -and type in the commands from run1.mac line by line: -Idle> /tracking/verbose 1 -Idle> /run/beamOn 1 -Idle> ... -Idle> exit -\endverbatim - or -\verbatim -Idle> /control/execute run1.mac -.... -Idle> exit -\endverbatim - - - Execute exampleB2a in the 'batch' mode from macro files - (without visualization) -\verbatim -% exampleB2a run2.mac -% exampleB2a exampleB2.in > exampleB2.out -\endverbatim - -*/ diff --git a/examples/basic/B2/B2a/CMakeLists.txt b/examples/basic/B2/B2a/CMakeLists.txt index d65b77c81f..ea81bae6d2 100644 --- a/examples/basic/B2/B2a/CMakeLists.txt +++ b/examples/basic/B2/B2a/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B2a) #---------------------------------------------------------------------------- diff --git a/examples/basic/B2/B2a/exampleB2a.cc b/examples/basic/B2/B2a/exampleB2a.cc index b55b98acba..d0590c43c2 100644 --- a/examples/basic/B2/B2a/exampleB2a.cc +++ b/examples/basic/B2/B2a/exampleB2a.cc @@ -27,8 +27,8 @@ /// \file exampleB2a.cc /// \brief Main program of the B2a example -#include "B2aDetectorConstruction.hh" -#include "B2ActionInitialization.hh" +#include "DetectorConstruction.hh" +#include "ActionInitialization.hh" #include "G4RunManagerFactory.hh" #include "G4SteppingVerbose.hh" @@ -64,14 +64,14 @@ int main(int argc,char** argv) // Set mandatory initialization classes // - runManager->SetUserInitialization(new B2aDetectorConstruction()); + runManager->SetUserInitialization(new B2a::DetectorConstruction()); G4VModularPhysicsList* physicsList = new FTFP_BERT; physicsList->RegisterPhysics(new G4StepLimiterPhysics()); runManager->SetUserInitialization(physicsList); // Set user action classes - runManager->SetUserInitialization(new B2ActionInitialization()); + runManager->SetUserInitialization(new B2::ActionInitialization()); // Initialize visualization // diff --git a/examples/basic/B2/B2a/exampleB2a.out b/examples/basic/B2/B2a/exampleB2a.out index 628569a432..2f6c5421c6 100644 --- a/examples/basic/B2/B2a/exampleB2a.out +++ b/examples/basic/B2/B2a/exampleB2a.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -29,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -132,17 +130,17 @@ Some /vis commands (optionally) take a string to specify colour. Computed tolerance = 5.88e-08 mm -Checking overlaps for volume Target (G4Tubs) ... OK! +Checking overlaps for volume Target:0 (G4Tubs) ... OK! Target is 5 cm of G4_Pb -Checking overlaps for volume Tracker (G4Tubs) ... OK! +Checking overlaps for volume Tracker:0 (G4Tubs) ... OK! There are 5 chambers in the tracker region. The chambers are 20 cm of G4_Xe The distance between chamber is 80 cm -Checking overlaps for volume Chamber_PV (G4Tubs) ... OK! -Checking overlaps for volume Chamber_PV (G4Tubs) ... OK! -Checking overlaps for volume Chamber_PV (G4Tubs) ... OK! -Checking overlaps for volume Chamber_PV (G4Tubs) ... OK! -Checking overlaps for volume Chamber_PV (G4Tubs) ... OK! +Checking overlaps for volume Chamber_PV:0 (G4Tubs) ... OK! +Checking overlaps for volume Chamber_PV:1 (G4Tubs) ... OK! +Checking overlaps for volume Chamber_PV:2 (G4Tubs) ... OK! +Checking overlaps for volume Chamber_PV:3 (G4Tubs) ... OK! +Checking overlaps for volume Chamber_PV:4 (G4Tubs) ... OK! hInelastic FTFP_BERT : threshold between BERT and FTFP is over the interval for pions : 3 to 6 GeV @@ -151,32 +149,99 @@ Checking overlaps for volume Chamber_PV (G4Tubs) ... OK! for neutron : 3 to 6 GeV ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -186,25 +251,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -214,29 +279,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -244,31 +309,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -277,12 +342,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -290,12 +355,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -303,31 +368,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -335,31 +400,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -367,31 +432,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -399,32 +464,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -432,32 +497,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -465,31 +530,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -497,27 +562,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -526,17 +591,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -544,67 +609,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -612,13 +677,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -626,13 +691,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -640,12 +705,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -653,13 +718,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -667,13 +732,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -681,13 +746,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -695,60 +760,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -756,27 +821,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -784,25 +849,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -810,25 +875,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -836,13 +901,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -865,7 +930,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -876,21 +940,21 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 0 0 hits stored in this event >>> Event: 1 - 0 hits stored in this event + 108 hits stored in this event >>> Event: 2 - 120 hits stored in this event + 0 hits stored in this event >>> Event: 3 - 15 hits stored in this event + 0 hits stored in this event >>> Event: 4 0 hits stored in this event >>> Event: 5 - 92 hits stored in this event + 0 hits stored in this event >>> Event: 6 0 hits stored in this event >>> Event: 7 0 hits stored in this event >>> Event: 8 - 12 hits stored in this event + 0 hits stored in this event >>> Event: 9 0 hits stored in this event >>> Event: 10 @@ -900,7 +964,7 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 12 0 hits stored in this event >>> Event: 13 - 64 hits stored in this event + 0 hits stored in this event >>> Event: 14 0 hits stored in this event >>> Event: 15 @@ -910,13 +974,13 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 17 0 hits stored in this event >>> Event: 18 - 0 hits stored in this event + 74 hits stored in this event >>> Event: 19 - 0 hits stored in this event + 291 hits stored in this event >>> Event: 20 0 hits stored in this event >>> Event: 21 - 27 hits stored in this event + 82 hits stored in this event >>> Event: 22 0 hits stored in this event >>> Event: 23 @@ -928,11 +992,11 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 26 0 hits stored in this event >>> Event: 27 - 0 hits stored in this event + 46 hits stored in this event >>> Event: 28 0 hits stored in this event >>> Event: 29 - 66 hits stored in this event + 0 hits stored in this event >>> Event: 30 0 hits stored in this event >>> Event: 31 @@ -942,15 +1006,15 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 33 0 hits stored in this event >>> Event: 34 - 15 hits stored in this event + 0 hits stored in this event >>> Event: 35 - 25 hits stored in this event + 46 hits stored in this event >>> Event: 36 0 hits stored in this event >>> Event: 37 0 hits stored in this event >>> Event: 38 - 74 hits stored in this event + 0 hits stored in this event >>> Event: 39 0 hits stored in this event >>> Event: 40 @@ -960,13 +1024,13 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 42 0 hits stored in this event >>> Event: 43 - 61 hits stored in this event + 0 hits stored in this event >>> Event: 44 0 hits stored in this event >>> Event: 45 - 0 hits stored in this event + 48 hits stored in this event >>> Event: 46 - 23 hits stored in this event + 0 hits stored in this event >>> Event: 47 0 hits stored in this event >>> Event: 48 @@ -978,9 +1042,9 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 51 0 hits stored in this event >>> Event: 52 - 0 hits stored in this event + 1 hits stored in this event >>> Event: 53 - 0 hits stored in this event + 2 hits stored in this event >>> Event: 54 0 hits stored in this event >>> Event: 55 @@ -996,13 +1060,13 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 60 0 hits stored in this event >>> Event: 61 - 0 hits stored in this event + 1 hits stored in this event >>> Event: 62 0 hits stored in this event >>> Event: 63 0 hits stored in this event >>> Event: 64 - 0 hits stored in this event + 58 hits stored in this event >>> Event: 65 0 hits stored in this event >>> Event: 66 @@ -1010,13 +1074,13 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 67 0 hits stored in this event >>> Event: 68 - 15 hits stored in this event + 0 hits stored in this event >>> Event: 69 - 76 hits stored in this event + 95 hits stored in this event >>> Event: 70 0 hits stored in this event >>> Event: 71 - 0 hits stored in this event + 47 hits stored in this event >>> Event: 72 0 hits stored in this event >>> Event: 73 @@ -1032,15 +1096,15 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 78 0 hits stored in this event >>> Event: 79 - 66 hits stored in this event + 0 hits stored in this event >>> Event: 80 0 hits stored in this event >>> Event: 81 - 3 hits stored in this event + 46 hits stored in this event >>> Event: 82 0 hits stored in this event >>> Event: 83 - 108 hits stored in this event + 0 hits stored in this event >>> Event: 84 0 hits stored in this event >>> Event: 85 @@ -1058,19 +1122,19 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 91 0 hits stored in this event >>> Event: 92 - 0 hits stored in this event + 102 hits stored in this event >>> Event: 93 - 0 hits stored in this event + 50 hits stored in this event >>> Event: 94 0 hits stored in this event >>> Event: 95 - 69 hits stored in this event + 0 hits stored in this event >>> Event: 96 - 73 hits stored in this event + 0 hits stored in this event >>> Event: 97 0 hits stored in this event >>> Event: 98 - 168 hits stored in this event + 0 hits stored in this event >>> Event: 99 0 hits stored in this event 0 events have been kept for refreshing and/or reviewing. @@ -1079,205 +1143,205 @@ See commands in /vis/modeling/trajectories/ for other options. ### Run 1 starts. --> Event 0 starts. >>> Event: 0 - 57 hits stored in this event + 93 hits stored in this event >>> Event: 1 - 224 hits stored in this event + 85 hits stored in this event >>> Event: 2 - 73 hits stored in this event + 463 hits stored in this event >>> Event: 3 - 99 hits stored in this event + 104 hits stored in this event >>> Event: 4 - 379 hits stored in this event + 54 hits stored in this event >>> Event: 5 - 77 hits stored in this event + 87 hits stored in this event >>> Event: 6 - 78 hits stored in this event + 192 hits stored in this event >>> Event: 7 - 437 hits stored in this event + 696 hits stored in this event >>> Event: 8 - 124 hits stored in this event + 99 hits stored in this event >>> Event: 9 - 129 hits stored in this event ->>> Event: 10 - 981 hits stored in this event ->>> Event: 11 - 759 hits stored in this event ->>> Event: 12 - 95 hits stored in this event ->>> Event: 13 - 68 hits stored in this event ->>> Event: 14 - 77 hits stored in this event ->>> Event: 15 - 185 hits stored in this event ->>> Event: 16 - 61 hits stored in this event ->>> Event: 17 - 329 hits stored in this event ->>> Event: 18 - 71 hits stored in this event ->>> Event: 19 - 92 hits stored in this event ->>> Event: 20 - 63 hits stored in this event ->>> Event: 21 - 50529 hits stored in this event ->>> Event: 22 - 88 hits stored in this event ->>> Event: 23 - 58 hits stored in this event ->>> Event: 24 - 52 hits stored in this event ->>> Event: 25 - 62 hits stored in this event ->>> Event: 26 - 86 hits stored in this event ->>> Event: 27 69 hits stored in this event ->>> Event: 28 - 76 hits stored in this event ->>> Event: 29 - 83 hits stored in this event ->>> Event: 30 - 79 hits stored in this event ->>> Event: 31 - 183 hits stored in this event ->>> Event: 32 - 1555 hits stored in this event ->>> Event: 33 - 385 hits stored in this event ->>> Event: 34 - 77 hits stored in this event ->>> Event: 35 - 675 hits stored in this event ->>> Event: 36 - 71 hits stored in this event ->>> Event: 37 - 79 hits stored in this event ->>> Event: 38 - 54 hits stored in this event ->>> Event: 39 - 25 hits stored in this event ->>> Event: 40 - 852 hits stored in this event ->>> Event: 41 - 43 hits stored in this event ->>> Event: 42 - 62 hits stored in this event ->>> Event: 43 +>>> Event: 10 + 103 hits stored in this event +>>> Event: 11 87 hits stored in this event ->>> Event: 44 - 119 hits stored in this event ->>> Event: 45 - 446 hits stored in this event ->>> Event: 46 - 97 hits stored in this event ->>> Event: 47 - 39 hits stored in this event ->>> Event: 48 - 51 hits stored in this event ->>> Event: 49 - 76 hits stored in this event ->>> Event: 50 - 66 hits stored in this event ->>> Event: 51 - 60 hits stored in this event ->>> Event: 52 - 91 hits stored in this event ->>> Event: 53 - 56 hits stored in this event ->>> Event: 54 +>>> Event: 12 + 148 hits stored in this event +>>> Event: 13 + 104 hits stored in this event +>>> Event: 14 + 72 hits stored in this event +>>> Event: 15 117 hits stored in this event ->>> Event: 55 - 75 hits stored in this event ->>> Event: 56 - 82 hits stored in this event ->>> Event: 57 - 44 hits stored in this event ->>> Event: 58 - 87 hits stored in this event ->>> Event: 59 - 115 hits stored in this event ->>> Event: 60 - 88 hits stored in this event ->>> Event: 61 - 68 hits stored in this event ->>> Event: 62 - 221 hits stored in this event ->>> Event: 63 - 454 hits stored in this event ->>> Event: 64 - 61 hits stored in this event ->>> Event: 65 - 60 hits stored in this event ->>> Event: 66 - 65 hits stored in this event ->>> Event: 67 - 298 hits stored in this event ->>> Event: 68 - 88 hits stored in this event ->>> Event: 69 - 100 hits stored in this event ->>> Event: 70 - 66 hits stored in this event ->>> Event: 71 - 83 hits stored in this event ->>> Event: 72 - 54 hits stored in this event ->>> Event: 73 - 125 hits stored in this event ->>> Event: 74 - 57 hits stored in this event ->>> Event: 75 - 74 hits stored in this event ->>> Event: 76 - 84 hits stored in this event ->>> Event: 77 - 54 hits stored in this event ->>> Event: 78 - 52 hits stored in this event ->>> Event: 79 - 66 hits stored in this event ->>> Event: 80 - 143 hits stored in this event ->>> Event: 81 - 200 hits stored in this event ->>> Event: 82 - 54 hits stored in this event ->>> Event: 83 - 119 hits stored in this event ->>> Event: 84 - 102 hits stored in this event ->>> Event: 85 - 528 hits stored in this event ->>> Event: 86 - 268 hits stored in this event ->>> Event: 87 - 50 hits stored in this event ->>> Event: 88 - 85 hits stored in this event ->>> Event: 89 - 102 hits stored in this event ->>> Event: 90 - 74 hits stored in this event ->>> Event: 91 - 63 hits stored in this event ->>> Event: 92 - 88 hits stored in this event ->>> Event: 93 - 85 hits stored in this event ->>> Event: 94 - 146 hits stored in this event ->>> Event: 95 - 121 hits stored in this event ->>> Event: 96 - 58 hits stored in this event ->>> Event: 97 - 63 hits stored in this event ->>> Event: 98 - 102 hits stored in this event ->>> Event: 99 +>>> Event: 16 + 141 hits stored in this event +>>> Event: 17 + 168 hits stored in this event +>>> Event: 18 + 79 hits stored in this event +>>> Event: 19 + 49 hits stored in this event +>>> Event: 20 81 hits stored in this event +>>> Event: 21 + 52 hits stored in this event +>>> Event: 22 + 72 hits stored in this event +>>> Event: 23 + 57 hits stored in this event +>>> Event: 24 + 80 hits stored in this event +>>> Event: 25 + 231 hits stored in this event +>>> Event: 26 + 1205 hits stored in this event +>>> Event: 27 + 316 hits stored in this event +>>> Event: 28 + 657 hits stored in this event +>>> Event: 29 + 49 hits stored in this event +>>> Event: 30 + 76 hits stored in this event +>>> Event: 31 + 90 hits stored in this event +>>> Event: 32 + 94 hits stored in this event +>>> Event: 33 + 85 hits stored in this event +>>> Event: 34 + 42 hits stored in this event +>>> Event: 35 + 777 hits stored in this event +>>> Event: 36 + 82 hits stored in this event +>>> Event: 37 + 109 hits stored in this event +>>> Event: 38 + 79 hits stored in this event +>>> Event: 39 + 309 hits stored in this event +>>> Event: 40 + 69 hits stored in this event +>>> Event: 41 + 69 hits stored in this event +>>> Event: 42 + 396 hits stored in this event +>>> Event: 43 + 242 hits stored in this event +>>> Event: 44 + 120 hits stored in this event +>>> Event: 45 + 98 hits stored in this event +>>> Event: 46 + 82 hits stored in this event +>>> Event: 47 + 1334 hits stored in this event +>>> Event: 48 + 88 hits stored in this event +>>> Event: 49 + 96 hits stored in this event +>>> Event: 50 + 86 hits stored in this event +>>> Event: 51 + 57 hits stored in this event +>>> Event: 52 + 84 hits stored in this event +>>> Event: 53 + 73 hits stored in this event +>>> Event: 54 + 219 hits stored in this event +>>> Event: 55 + 79 hits stored in this event +>>> Event: 56 + 325 hits stored in this event +>>> Event: 57 + 130 hits stored in this event +>>> Event: 58 + 114 hits stored in this event +>>> Event: 59 + 139 hits stored in this event +>>> Event: 60 + 95 hits stored in this event +>>> Event: 61 + 111 hits stored in this event +>>> Event: 62 + 24182 hits stored in this event +>>> Event: 63 + 103 hits stored in this event +>>> Event: 64 + 93 hits stored in this event +>>> Event: 65 + 140 hits stored in this event +>>> Event: 66 + 80 hits stored in this event +>>> Event: 67 + 576 hits stored in this event +>>> Event: 68 + 258 hits stored in this event +>>> Event: 69 + 597 hits stored in this event +>>> Event: 70 + 77 hits stored in this event +>>> Event: 71 + 64 hits stored in this event +>>> Event: 72 + 55 hits stored in this event +>>> Event: 73 + 98 hits stored in this event +>>> Event: 74 + 69 hits stored in this event +>>> Event: 75 + 87 hits stored in this event +>>> Event: 76 + 1461 hits stored in this event +>>> Event: 77 + 85 hits stored in this event +>>> Event: 78 + 72 hits stored in this event +>>> Event: 79 + 150 hits stored in this event +>>> Event: 80 + 74 hits stored in this event +>>> Event: 81 + 59 hits stored in this event +>>> Event: 82 + 113 hits stored in this event +>>> Event: 83 + 76 hits stored in this event +>>> Event: 84 + 118 hits stored in this event +>>> Event: 85 + 105 hits stored in this event +>>> Event: 86 + 80 hits stored in this event +>>> Event: 87 + 237 hits stored in this event +>>> Event: 88 + 110 hits stored in this event +>>> Event: 89 + 66 hits stored in this event +>>> Event: 90 + 78 hits stored in this event +>>> Event: 91 + 1537 hits stored in this event +>>> Event: 92 + 134 hits stored in this event +>>> Event: 93 + 65 hits stored in this event +>>> Event: 94 + 48 hits stored in this event +>>> Event: 95 + 143 hits stored in this event +>>> Event: 96 + 219 hits stored in this event +>>> Event: 97 + 123 hits stored in this event +>>> Event: 98 + 48 hits stored in this event +>>> Event: 99 + 198 hits stored in this event 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1289,21 +1353,21 @@ See commands in /vis/modeling/trajectories/ for other options. ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 0 fm 0 fm -2.94 m 1 TeV 0 meV 0 fm 0 fm World initStep - 1 0 fm 0 fm -2.45 m 1 TeV 0 meV 49 cm 49 cm World Transportation - 2 0 fm 0 fm -2.4 m 1 TeV 0 meV 5 cm 54 cm Target Transportation - 3 0 fm 0 fm -1.7 m 1 TeV 0 meV 70 cm 1.24 m Tracker Transportation - 4 0 fm 0 fm -1.5 m 1 TeV 0 meV 20 cm 1.44 m Chamber_PV Transportation - 5 0 fm 0 fm -90 cm 1 TeV 0 meV 60 cm 2.04 m Tracker Transportation - 6 0 fm 0 fm -70 cm 1 TeV 0 meV 20 cm 2.24 m Chamber_PV Transportation - 7 0 fm 0 fm -10 cm 1 TeV 0 meV 60 cm 2.84 m Tracker Transportation - 8 0 fm 0 fm 10 cm 1 TeV 0 meV 20 cm 3.04 m Chamber_PV Transportation - 9 0 fm 0 fm 70 cm 1 TeV 0 meV 60 cm 3.64 m Tracker Transportation - 10 0 fm 0 fm 90 cm 1 TeV 0 meV 20 cm 3.84 m Chamber_PV Transportation - 11 0 fm 0 fm 1.5 m 1 TeV 0 meV 60 cm 4.44 m Tracker Transportation - 12 0 fm 0 fm 1.7 m 1 TeV 0 meV 20 cm 4.64 m Chamber_PV Transportation - 13 0 fm 0 fm 2.4 m 1 TeV 0 meV 70 cm 5.34 m Tracker Transportation - 14 0 fm 0 fm 2.94 m 1 TeV 0 meV 54 cm 5.88 m World OutOfWorld + 0 0 fm 0 fm -2.94 m 1 TeV 0 eV 0 fm 0 fm World initStep + 1 0 fm 0 fm -2.45 m 1 TeV 0 eV 49 cm 49 cm World Transportation + 2 0 fm 0 fm -2.4 m 1 TeV 0 eV 5 cm 54 cm Target Transportation + 3 0 fm 0 fm -1.7 m 1 TeV 0 eV 70 cm 1.24 m Tracker Transportation + 4 0 fm 0 fm -1.5 m 1 TeV 0 eV 20 cm 1.44 m Chamber_PV Transportation + 5 0 fm 0 fm -90 cm 1 TeV 0 eV 60 cm 2.04 m Tracker Transportation + 6 0 fm 0 fm -70 cm 1 TeV 0 eV 20 cm 2.24 m Chamber_PV Transportation + 7 0 fm 0 fm -10 cm 1 TeV 0 eV 60 cm 2.84 m Tracker Transportation + 8 0 fm 0 fm 10 cm 1 TeV 0 eV 20 cm 3.04 m Chamber_PV Transportation + 9 0 fm 0 fm 70 cm 1 TeV 0 eV 60 cm 3.64 m Tracker Transportation + 10 0 fm 0 fm 90 cm 1 TeV 0 eV 20 cm 3.84 m Chamber_PV Transportation + 11 0 fm 0 fm 1.5 m 1 TeV 0 eV 60 cm 4.44 m Tracker Transportation + 12 0 fm 0 fm 1.7 m 1 TeV 0 eV 20 cm 4.64 m Chamber_PV Transportation + 13 0 fm 0 fm 2.4 m 1 TeV 0 eV 70 cm 5.34 m Tracker Transportation + 14 0 fm 0 fm 2.94 m 1 TeV 0 eV 54 cm 5.88 m World OutOfWorld >>> Event: 0 0 hits stored in this event 0 events have been kept for refreshing and/or reviewing. diff --git a/examples/basic/B2/B2a/include/B2ActionInitialization.hh b/examples/basic/B2/B2a/include/ActionInitialization.hh similarity index 84% rename from examples/basic/B2/B2a/include/B2ActionInitialization.hh rename to examples/basic/B2/B2a/include/ActionInitialization.hh index 588d2edb1a..c3b8a90c0d 100644 --- a/examples/basic/B2/B2a/include/B2ActionInitialization.hh +++ b/examples/basic/B2/B2a/include/ActionInitialization.hh @@ -24,29 +24,31 @@ // ******************************************************************** // // -/// \file B2ActionInitialization.hh -/// \brief Definition of the B2ActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the B2::ActionInitialization class #ifndef B2ActionInitialization_h #define B2ActionInitialization_h 1 #include "G4VUserActionInitialization.hh" -class B4DetectorConstruction; +namespace B2 +{ /// Action initialization class. -/// -class B2ActionInitialization : public G4VUserActionInitialization +class ActionInitialization : public G4VUserActionInitialization { public: - B2ActionInitialization(); - virtual ~B2ActionInitialization(); + ActionInitialization(); + ~ActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; + void BuildForMaster() const override; + void Build() const override; }; +} + #endif diff --git a/examples/basic/B2/B2a/include/B2aDetectorConstruction.hh b/examples/basic/B2/B2a/include/DetectorConstruction.hh similarity index 72% rename from examples/basic/B2/B2a/include/B2aDetectorConstruction.hh rename to examples/basic/B2/B2a/include/DetectorConstruction.hh index d93baa7b76..d09f996aeb 100644 --- a/examples/basic/B2/B2a/include/B2aDetectorConstruction.hh +++ b/examples/basic/B2/B2a/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2aDetectorConstruction.hh -/// \brief Definition of the B2aDetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the B2a::DetectorConstruction class #ifndef B2aDetectorConstruction_h #define B2aDetectorConstruction_h 1 @@ -40,20 +40,23 @@ class G4Material; class G4UserLimits; class G4GlobalMagFieldMessenger; -class B2aDetectorMessenger; +namespace B2a +{ + +class DetectorMessenger; /// Detector construction class to define materials, geometry /// and global uniform magnetic field. -class B2aDetectorConstruction : public G4VUserDetectorConstruction +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B2aDetectorConstruction(); - virtual ~B2aDetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; public: - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; // Set methods void SetTargetMaterial (G4String ); @@ -66,25 +69,25 @@ class B2aDetectorConstruction : public G4VUserDetectorConstruction void DefineMaterials(); G4VPhysicalVolume* DefineVolumes(); - // data members - G4int fNbOfChambers; - - G4LogicalVolume* fLogicTarget; // pointer to the logical Target - G4LogicalVolume** fLogicChamber; // pointer to the logical Chamber - - G4Material* fTargetMaterial; // pointer to the target material - G4Material* fChamberMaterial; // pointer to the chamber material - - G4UserLimits* fStepLimit; // pointer to user step limits - - B2aDetectorMessenger* fMessenger; // messenger - + // static data members static G4ThreadLocal G4GlobalMagFieldMessenger* fMagFieldMessenger; // magnetic field messenger + // data members + G4int fNbOfChambers = 0; - G4bool fCheckOverlaps; // option to activate checking of volumes overlaps + G4LogicalVolume* fLogicTarget = nullptr; // pointer to the logical Target + G4LogicalVolume** fLogicChamber = nullptr; // pointer to the logical Chamber + + G4Material* fTargetMaterial = nullptr; // pointer to the target material + G4Material* fChamberMaterial = nullptr; // pointer to the chamber material + + G4UserLimits* fStepLimit = nullptr; // pointer to user step limits + + DetectorMessenger* fMessenger = nullptr; // messenger + + G4bool fCheckOverlaps = true; // option to activate checking of volumes overlaps }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2a/include/B2aDetectorMessenger.hh b/examples/basic/B2/B2a/include/DetectorMessenger.hh similarity index 67% rename from examples/basic/B2/B2a/include/B2aDetectorMessenger.hh rename to examples/basic/B2/B2a/include/DetectorMessenger.hh index 0f8fb431f7..e3a0b078ec 100644 --- a/examples/basic/B2/B2a/include/B2aDetectorMessenger.hh +++ b/examples/basic/B2/B2a/include/DetectorMessenger.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2aDetectorMessenger.hh -/// \brief Definition of the B2aDetectorMessenger class +/// \file DetectorMessenger.hh +/// \brief Definition of the B2a::DetectorMessenger class #ifndef B2aDetectorMessenger_h #define B2aDetectorMessenger_h 1 @@ -33,40 +33,42 @@ #include "globals.hh" #include "G4UImessenger.hh" -class B2aDetectorConstruction; class G4UIdirectory; class G4UIcmdWithAString; class G4UIcmdWithADoubleAndUnit; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +namespace B2a +{ -/// Messenger class that defines commands for B2aDetectorConstruction. +class DetectorConstruction; + +/// Messenger class that defines commands for DetectorConstruction. /// /// It implements commands: -/// - /B2/det/setTargetMaterial name -/// - /B2/det/setChamberMaterial name -/// - /B2/det/stepMax value unit +/// - //det/setTargetMaterial name +/// - //det/setChamberMaterial name +/// - //det/stepMax value unit -class B2aDetectorMessenger: public G4UImessenger +class DetectorMessenger: public G4UImessenger { public: - B2aDetectorMessenger(B2aDetectorConstruction* ); - virtual ~B2aDetectorMessenger(); + DetectorMessenger(DetectorConstruction* ); + ~DetectorMessenger() override; - virtual void SetNewValue(G4UIcommand*, G4String); + void SetNewValue(G4UIcommand*, G4String) override; private: - B2aDetectorConstruction* fDetectorConstruction; + DetectorConstruction* fDetectorConstruction = nullptr; - G4UIdirectory* fB2Directory; - G4UIdirectory* fDetDirectory; + G4UIdirectory* fDirectory = nullptr; + G4UIdirectory* fDetDirectory = nullptr; - G4UIcmdWithAString* fTargMatCmd; - G4UIcmdWithAString* fChamMatCmd; + G4UIcmdWithAString* fTargMatCmd = nullptr; + G4UIcmdWithAString* fChamMatCmd = nullptr; - G4UIcmdWithADoubleAndUnit* fStepMaxCmd; + G4UIcmdWithADoubleAndUnit* fStepMaxCmd = nullptr; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2a/include/B2EventAction.hh b/examples/basic/B2/B2a/include/EventAction.hh similarity index 83% rename from examples/basic/B2/B2a/include/B2EventAction.hh rename to examples/basic/B2/B2a/include/EventAction.hh index 36bb382a64..a557245477 100644 --- a/examples/basic/B2/B2a/include/B2EventAction.hh +++ b/examples/basic/B2/B2a/include/EventAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2EventAction.hh -/// \brief Definition of the B2EventAction class +/// \file EventAction.hh +/// \brief Definition of the B2::EventAction class #ifndef B2EventAction_h #define B2EventAction_h 1 @@ -34,18 +34,21 @@ #include "globals.hh" +namespace B2 +{ + /// Event action class -class B2EventAction : public G4UserEventAction +class EventAction : public G4UserEventAction { public: - B2EventAction(); - virtual ~B2EventAction(); + EventAction(); + ~EventAction() override; - virtual void BeginOfEventAction(const G4Event* ); - virtual void EndOfEventAction(const G4Event* ); + void BeginOfEventAction(const G4Event* ) override; + void EndOfEventAction(const G4Event* ) override; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2a/include/B2PrimaryGeneratorAction.hh b/examples/basic/B2/B2a/include/PrimaryGeneratorAction.hh similarity index 84% rename from examples/basic/B2/B2a/include/B2PrimaryGeneratorAction.hh rename to examples/basic/B2/B2a/include/PrimaryGeneratorAction.hh index 113a5fc085..9177a1c69d 100644 --- a/examples/basic/B2/B2a/include/B2PrimaryGeneratorAction.hh +++ b/examples/basic/B2/B2a/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2PrimaryGeneratorAction.hh -/// \brief Definition of the B2PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the B2::PrimaryGeneratorAction class #ifndef B2PrimaryGeneratorAction_h #define B2PrimaryGeneratorAction_h 1 @@ -36,6 +36,9 @@ class G4ParticleGun; class G4Event; +namespace B2 +{ + /// The primary generator action class with particle gum. /// /// It defines a single particle which hits the Tracker @@ -43,13 +46,13 @@ class G4Event; /// can be changed via the G4 build-in commands of G4ParticleGun class /// (see the macros provided with this example). -class B2PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B2PrimaryGeneratorAction(); - virtual ~B2PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event* ); + void GeneratePrimaries(G4Event* ) override; G4ParticleGun* GetParticleGun() {return fParticleGun;} @@ -57,9 +60,9 @@ class B2PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction void SetRandomFlag(G4bool ); private: - G4ParticleGun* fParticleGun; // G4 particle gun + G4ParticleGun* fParticleGun = nullptr; // G4 particle gun }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2a/include/B2RunAction.hh b/examples/basic/B2/B2a/include/RunAction.hh similarity index 80% rename from examples/basic/B2/B2a/include/B2RunAction.hh rename to examples/basic/B2/B2a/include/RunAction.hh index c8ba82fe0b..a6456e8acb 100644 --- a/examples/basic/B2/B2a/include/B2RunAction.hh +++ b/examples/basic/B2/B2a/include/RunAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2RunAction.hh -/// \brief Definition of the B2RunAction class +/// \file RunAction.hh +/// \brief Definition of the B2::RunAction class #ifndef B2RunAction_h #define B2RunAction_h 1 @@ -33,22 +33,23 @@ #include "G4UserRunAction.hh" #include "globals.hh" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - class G4Run; +namespace B2 +{ + /// Run action class -class B2RunAction : public G4UserRunAction +class RunAction : public G4UserRunAction { public: - B2RunAction(); - virtual ~B2RunAction(); + RunAction(); + ~RunAction() override; - virtual void BeginOfRunAction(const G4Run* run); - virtual void EndOfRunAction(const G4Run* run); + void BeginOfRunAction(const G4Run* run) override; + void EndOfRunAction(const G4Run* run) override; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2b/include/B2TrackerHit.hh b/examples/basic/B2/B2a/include/TrackerHit.hh similarity index 76% rename from examples/basic/B2/B2b/include/B2TrackerHit.hh rename to examples/basic/B2/B2a/include/TrackerHit.hh index d80c4352f2..2ed28e9ca5 100644 --- a/examples/basic/B2/B2b/include/B2TrackerHit.hh +++ b/examples/basic/B2/B2a/include/TrackerHit.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2TrackerHit.hh -/// \brief Definition of the B2TrackerHit class +/// \file TrackerHit.hh +/// \brief Definition of the B2::TrackerHit class #ifndef B2TrackerHit_h #define B2TrackerHit_h 1 @@ -36,29 +36,32 @@ #include "G4ThreeVector.hh" #include "tls.hh" +namespace B2 +{ + /// Tracker hit class /// /// It defines data members to store the trackID, chamberNb, energy deposit, /// and position of charged particles in a selected volume: /// - fTrackID, fChamberNB, fEdep, fPos -class B2TrackerHit : public G4VHit +class TrackerHit : public G4VHit { public: - B2TrackerHit(); - B2TrackerHit(const B2TrackerHit&); - virtual ~B2TrackerHit(); + TrackerHit(); + TrackerHit(const TrackerHit&) = default; + ~TrackerHit() override; // operators - const B2TrackerHit& operator=(const B2TrackerHit&); - G4bool operator==(const B2TrackerHit&) const; + TrackerHit& operator=(const TrackerHit&) = default; + G4bool operator==(const TrackerHit&) const; inline void* operator new(size_t); inline void operator delete(void*); // methods from base class - virtual void Draw(); - virtual void Print(); + void Draw() override; + void Print() override; // Set methods void SetTrackID (G4int track) { fTrackID = track; }; @@ -73,35 +76,36 @@ class B2TrackerHit : public G4VHit G4ThreeVector GetPos() const { return fPos; }; private: - - G4int fTrackID; - G4int fChamberNb; - G4double fEdep; - G4ThreeVector fPos; + G4int fTrackID = -1; + G4int fChamberNb = -1; + G4double fEdep = 0.; + G4ThreeVector fPos; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -typedef G4THitsCollection B2TrackerHitsCollection; +typedef G4THitsCollection TrackerHitsCollection; -extern G4ThreadLocal G4Allocator* B2TrackerHitAllocator; +extern G4ThreadLocal G4Allocator* TrackerHitAllocator; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -inline void* B2TrackerHit::operator new(size_t) +inline void* TrackerHit::operator new(size_t) { - if(!B2TrackerHitAllocator) - B2TrackerHitAllocator = new G4Allocator; - return (void *) B2TrackerHitAllocator->MallocSingle(); + if(!TrackerHitAllocator) + TrackerHitAllocator = new G4Allocator; + return (void *) TrackerHitAllocator->MallocSingle(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -inline void B2TrackerHit::operator delete(void *hit) +inline void TrackerHit::operator delete(void *hit) { - B2TrackerHitAllocator->FreeSingle((B2TrackerHit*) hit); + TrackerHitAllocator->FreeSingle((TrackerHit*) hit); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} + #endif diff --git a/examples/basic/B2/B2b/include/B2TrackerSD.hh b/examples/basic/B2/B2a/include/TrackerSD.hh similarity index 76% rename from examples/basic/B2/B2b/include/B2TrackerSD.hh rename to examples/basic/B2/B2a/include/TrackerSD.hh index eb7d4bab29..096a8b81d4 100644 --- a/examples/basic/B2/B2b/include/B2TrackerSD.hh +++ b/examples/basic/B2/B2a/include/TrackerSD.hh @@ -24,45 +24,46 @@ // ******************************************************************** // // -/// \file B2TrackerSD.hh -/// \brief Definition of the B2TrackerSD class +/// \file TrackerSD.hh +/// \brief Definition of the B2::TrackerSD class #ifndef B2TrackerSD_h #define B2TrackerSD_h 1 #include "G4VSensitiveDetector.hh" -#include "B2TrackerHit.hh" +#include "TrackerHit.hh" #include class G4Step; class G4HCofThisEvent; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +namespace B2 +{ -/// B2Tracker sensitive detector class +/// Tracker sensitive detector class /// /// The hits are accounted in hits in ProcessHits() function which is called /// by Geant4 kernel at each step. A hit is created with each step with non zero /// energy deposit. -class B2TrackerSD : public G4VSensitiveDetector +class TrackerSD : public G4VSensitiveDetector { public: - B2TrackerSD(const G4String& name, + TrackerSD(const G4String& name, const G4String& hitsCollectionName); - virtual ~B2TrackerSD(); + ~TrackerSD() override; // methods from base class - virtual void Initialize(G4HCofThisEvent* hitCollection); - virtual G4bool ProcessHits(G4Step* step, G4TouchableHistory* history); - virtual void EndOfEvent(G4HCofThisEvent* hitCollection); + void Initialize(G4HCofThisEvent* hitCollection) override; + G4bool ProcessHits(G4Step* step, G4TouchableHistory* history) override; + void EndOfEvent(G4HCofThisEvent* hitCollection) override; private: - B2TrackerHitsCollection* fHitsCollection; + TrackerHitsCollection* fHitsCollection = nullptr; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2b/src/B2ActionInitialization.cc b/examples/basic/B2/B2a/src/ActionInitialization.cc similarity index 77% rename from examples/basic/B2/B2b/src/B2ActionInitialization.cc rename to examples/basic/B2/B2a/src/ActionInitialization.cc index 799cda0ce7..165798aee4 100644 --- a/examples/basic/B2/B2b/src/B2ActionInitialization.cc +++ b/examples/basic/B2/B2a/src/ActionInitialization.cc @@ -24,39 +24,44 @@ // ******************************************************************** // // -/// \file B2ActionInitialization.cc -/// \brief Implementation of the B2ActionInitialization class +/// \file ActionInitialization.cc +/// \brief Implementation of the B2::ActionInitialization class -#include "B2ActionInitialization.hh" -#include "B2PrimaryGeneratorAction.hh" -#include "B2RunAction.hh" -#include "B2EventAction.hh" +#include "ActionInitialization.hh" +#include "PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "EventAction.hh" + +namespace B2 +{ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2ActionInitialization::B2ActionInitialization() - : G4VUserActionInitialization() +ActionInitialization::ActionInitialization() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2ActionInitialization::~B2ActionInitialization() +ActionInitialization::~ActionInitialization() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2ActionInitialization::BuildForMaster() const +void ActionInitialization::BuildForMaster() const { - SetUserAction(new B2RunAction); + SetUserAction(new RunAction); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2ActionInitialization::Build() const +void ActionInitialization::Build() const { - SetUserAction(new B2PrimaryGeneratorAction); - SetUserAction(new B2RunAction); - SetUserAction(new B2EventAction); + SetUserAction(new PrimaryGeneratorAction); + SetUserAction(new RunAction); + SetUserAction(new EventAction); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/B2a/src/B2aDetectorConstruction.cc b/examples/basic/B2/B2a/src/DetectorConstruction.cc similarity index 90% rename from examples/basic/B2/B2a/src/B2aDetectorConstruction.cc rename to examples/basic/B2/B2a/src/DetectorConstruction.cc index a0fb1b3629..de5d1326a3 100644 --- a/examples/basic/B2/B2a/src/B2aDetectorConstruction.cc +++ b/examples/basic/B2/B2a/src/DetectorConstruction.cc @@ -24,12 +24,12 @@ // ******************************************************************** // // -/// \file B2aDetectorConstruction.cc -/// \brief Implementation of the B2aDetectorConstruction class +/// \file DetectorConstruction.cc +/// \brief Implementation of the B2a::DetectorConstruction class -#include "B2aDetectorConstruction.hh" -#include "B2aDetectorMessenger.hh" -#include "B2TrackerSD.hh" +#include "DetectorConstruction.hh" +#include "DetectorMessenger.hh" +#include "TrackerSD.hh" #include "G4Material.hh" #include "G4NistManager.hh" @@ -52,20 +52,19 @@ #include "G4SystemOfUnits.hh" +using namespace B2; + +namespace B2a +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ThreadLocal -G4GlobalMagFieldMessenger* B2aDetectorConstruction::fMagFieldMessenger = nullptr; +G4GlobalMagFieldMessenger* DetectorConstruction::fMagFieldMessenger = nullptr; -B2aDetectorConstruction::B2aDetectorConstruction() -:G4VUserDetectorConstruction(), - fNbOfChambers(0), - fLogicTarget(nullptr), fLogicChamber(nullptr), - fTargetMaterial(nullptr), fChamberMaterial(nullptr), - fStepLimit(nullptr), - fCheckOverlaps(true) +DetectorConstruction::DetectorConstruction() { - fMessenger = new B2aDetectorMessenger(this); + fMessenger = new DetectorMessenger(this); fNbOfChambers = 5; fLogicChamber = new G4LogicalVolume*[fNbOfChambers]; @@ -73,7 +72,7 @@ B2aDetectorConstruction::B2aDetectorConstruction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2aDetectorConstruction::~B2aDetectorConstruction() +DetectorConstruction::~DetectorConstruction() { delete [] fLogicChamber; delete fStepLimit; @@ -82,7 +81,7 @@ B2aDetectorConstruction::~B2aDetectorConstruction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B2aDetectorConstruction::Construct() +G4VPhysicalVolume* DetectorConstruction::Construct() { // Define materials DefineMaterials(); @@ -93,7 +92,7 @@ G4VPhysicalVolume* B2aDetectorConstruction::Construct() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2aDetectorConstruction::DefineMaterials() +void DetectorConstruction::DefineMaterials() { // Material definition @@ -114,7 +113,7 @@ void B2aDetectorConstruction::DefineMaterials() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B2aDetectorConstruction::DefineVolumes() +G4VPhysicalVolume* DetectorConstruction::DefineVolumes() { G4Material* air = G4Material::GetMaterial("G4_AIR"); @@ -231,7 +230,7 @@ G4VPhysicalVolume* B2aDetectorConstruction::DefineVolumes() if( fNbOfChambers > 0 ){ rmaxIncr = 0.5 * (lastLength-firstLength)/(fNbOfChambers-1); if (chamberSpacing < chamberWidth) { - G4Exception("B2aDetectorConstruction::DefineVolumes()", + G4Exception("DetectorConstruction::DefineVolumes()", "InvalidSetup", FatalException, "Width>Spacing"); } @@ -287,12 +286,12 @@ G4VPhysicalVolume* B2aDetectorConstruction::DefineVolumes() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2aDetectorConstruction::ConstructSDandField() +void DetectorConstruction::ConstructSDandField() { // Sensitive detectors - G4String trackerChamberSDname = "B2/TrackerChamberSD"; - B2TrackerSD* aTrackerSD = new B2TrackerSD(trackerChamberSDname, + G4String trackerChamberSDname = "/TrackerChamberSD"; + TrackerSD* aTrackerSD = new TrackerSD(trackerChamberSDname, "TrackerHitsCollection"); G4SDManager::GetSDMpointer()->AddNewDetector(aTrackerSD); // Setting aTrackerSD to all logical volumes with the same name @@ -312,7 +311,7 @@ void B2aDetectorConstruction::ConstructSDandField() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2aDetectorConstruction::SetTargetMaterial(G4String materialName) +void DetectorConstruction::SetTargetMaterial(G4String materialName) { G4NistManager* nistManager = G4NistManager::Instance(); @@ -337,7 +336,7 @@ void B2aDetectorConstruction::SetTargetMaterial(G4String materialName) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2aDetectorConstruction::SetChamberMaterial(G4String materialName) +void DetectorConstruction::SetChamberMaterial(G4String materialName) { G4NistManager* nistManager = G4NistManager::Instance(); @@ -365,14 +364,18 @@ void B2aDetectorConstruction::SetChamberMaterial(G4String materialName) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2aDetectorConstruction::SetMaxStep(G4double maxStep) +void DetectorConstruction::SetMaxStep(G4double maxStep) { if ((fStepLimit)&&(maxStep>0.)) fStepLimit->SetMaxAllowedStep(maxStep); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2aDetectorConstruction::SetCheckOverlaps(G4bool checkOverlaps) +void DetectorConstruction::SetCheckOverlaps(G4bool checkOverlaps) { fCheckOverlaps = checkOverlaps; } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} \ No newline at end of file diff --git a/examples/basic/B2/B2a/src/B2aDetectorMessenger.cc b/examples/basic/B2/B2a/src/DetectorMessenger.cc similarity index 79% rename from examples/basic/B2/B2a/src/B2aDetectorMessenger.cc rename to examples/basic/B2/B2a/src/DetectorMessenger.cc index abcbcdcc21..640fed8fb0 100644 --- a/examples/basic/B2/B2a/src/B2aDetectorMessenger.cc +++ b/examples/basic/B2/B2a/src/DetectorMessenger.cc @@ -24,39 +24,41 @@ // ******************************************************************** // // -/// \file B2aDetectorMessenger.cc -/// \brief Implementation of the B2aDetectorMessenger class +/// \file DetectorMessenger.cc +/// \brief Implementation of the B2a::DetectorMessenger class -#include "B2aDetectorMessenger.hh" -#include "B2aDetectorConstruction.hh" +#include "DetectorMessenger.hh" +#include "DetectorConstruction.hh" #include "G4UIdirectory.hh" #include "G4UIcmdWithAString.hh" #include "G4UIcmdWithADoubleAndUnit.hh" +namespace B2a +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2aDetectorMessenger::B2aDetectorMessenger(B2aDetectorConstruction* Det) - : G4UImessenger(), - fDetectorConstruction(Det) +DetectorMessenger::DetectorMessenger(DetectorConstruction* det) + : fDetectorConstruction(det) { - fB2Directory = new G4UIdirectory("/B2/"); - fB2Directory->SetGuidance("UI commands specific to this example."); + fDirectory = new G4UIdirectory("//"); + fDirectory->SetGuidance("UI commands specific to this example."); - fDetDirectory = new G4UIdirectory("/B2/det/"); + fDetDirectory = new G4UIdirectory("//det/"); fDetDirectory->SetGuidance("Detector construction control"); - fTargMatCmd = new G4UIcmdWithAString("/B2/det/setTargetMaterial",this); + fTargMatCmd = new G4UIcmdWithAString("//det/setTargetMaterial",this); fTargMatCmd->SetGuidance("Select Material of the Target."); fTargMatCmd->SetParameterName("choice",false); fTargMatCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - fChamMatCmd = new G4UIcmdWithAString("/B2/det/setChamberMaterial",this); + fChamMatCmd = new G4UIcmdWithAString("//det/setChamberMaterial",this); fChamMatCmd->SetGuidance("Select Material of the Chamber."); fChamMatCmd->SetParameterName("choice",false); fChamMatCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - fStepMaxCmd = new G4UIcmdWithADoubleAndUnit("/B2/det/stepMax",this); + fStepMaxCmd = new G4UIcmdWithADoubleAndUnit("//det/stepMax",this); fStepMaxCmd->SetGuidance("Define a step max"); fStepMaxCmd->SetParameterName("stepMax",false); fStepMaxCmd->SetUnitCategory("Length"); @@ -65,18 +67,18 @@ B2aDetectorMessenger::B2aDetectorMessenger(B2aDetectorConstruction* Det) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2aDetectorMessenger::~B2aDetectorMessenger() +DetectorMessenger::~DetectorMessenger() { delete fTargMatCmd; delete fChamMatCmd; delete fStepMaxCmd; - delete fB2Directory; + delete fDirectory; delete fDetDirectory; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2aDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +void DetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) { if( command == fTargMatCmd ) { fDetectorConstruction->SetTargetMaterial(newValue);} @@ -91,3 +93,5 @@ void B2aDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B2/B2b/src/B2EventAction.cc b/examples/basic/B2/B2a/src/EventAction.cc similarity index 90% rename from examples/basic/B2/B2b/src/B2EventAction.cc rename to examples/basic/B2/B2a/src/EventAction.cc index cf41016da7..d8480a8190 100644 --- a/examples/basic/B2/B2b/src/B2EventAction.cc +++ b/examples/basic/B2/B2a/src/EventAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B2EventAction.cc -/// \brief Implementation of the B2EventAction class +/// \file EventAction.cc +/// \brief Implementation of the B2::EventAction class -#include "B2EventAction.hh" +#include "EventAction.hh" #include "G4Event.hh" #include "G4EventManager.hh" @@ -35,25 +35,27 @@ #include "G4Trajectory.hh" #include "G4ios.hh" +namespace B2 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2EventAction::B2EventAction() -: G4UserEventAction() +EventAction::EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2EventAction::~B2EventAction() +EventAction::~EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2EventAction::BeginOfEventAction(const G4Event*) +void EventAction::BeginOfEventAction(const G4Event*) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2EventAction::EndOfEventAction(const G4Event* event) +void EventAction::EndOfEventAction(const G4Event* event) { // get number of stored trajectories @@ -77,3 +79,6 @@ void B2EventAction::EndOfEventAction(const G4Event* event) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/B2a/src/B2PrimaryGeneratorAction.cc b/examples/basic/B2/B2a/src/PrimaryGeneratorAction.cc similarity index 91% rename from examples/basic/B2/B2a/src/B2PrimaryGeneratorAction.cc rename to examples/basic/B2/B2a/src/PrimaryGeneratorAction.cc index 09b46ba161..b45b4a1f93 100644 --- a/examples/basic/B2/B2a/src/B2PrimaryGeneratorAction.cc +++ b/examples/basic/B2/B2a/src/PrimaryGeneratorAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B2PrimaryGeneratorAction.cc -/// \brief Implementation of the B2PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the B2::PrimaryGeneratorAction class -#include "B2PrimaryGeneratorAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4LogicalVolumeStore.hh" #include "G4LogicalVolume.hh" @@ -37,13 +37,14 @@ #include "G4ParticleTable.hh" #include "G4ParticleDefinition.hh" #include "G4SystemOfUnits.hh" - #include "Randomize.hh" +namespace B2 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2PrimaryGeneratorAction::B2PrimaryGeneratorAction() - : G4VUserPrimaryGeneratorAction() +PrimaryGeneratorAction::PrimaryGeneratorAction() { G4int nofParticles = 1; fParticleGun = new G4ParticleGun(nofParticles); @@ -60,14 +61,14 @@ B2PrimaryGeneratorAction::B2PrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2PrimaryGeneratorAction::~B2PrimaryGeneratorAction() +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { // This function is called at the begining of event @@ -95,3 +96,6 @@ void B2PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/B2b/src/B2RunAction.cc b/examples/basic/B2/B2a/src/RunAction.cc similarity index 89% rename from examples/basic/B2/B2b/src/B2RunAction.cc rename to examples/basic/B2/B2a/src/RunAction.cc index 8245c761c7..13e881d4c0 100644 --- a/examples/basic/B2/B2b/src/B2RunAction.cc +++ b/examples/basic/B2/B2a/src/RunAction.cc @@ -24,18 +24,20 @@ // ******************************************************************** // // -/// \file B2RunAction.cc -/// \brief Implementation of the B2RunAction class +/// \file RunAction.cc +/// \brief Implementation of the B2::RunAction class -#include "B2RunAction.hh" +#include "RunAction.hh" #include "G4Run.hh" #include "G4RunManager.hh" +namespace B2 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2RunAction::B2RunAction() - : G4UserRunAction() +RunAction::RunAction() { // set printing event number per each 100 events G4RunManager::GetRunManager()->SetPrintProgress(1000); @@ -43,12 +45,12 @@ B2RunAction::B2RunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2RunAction::~B2RunAction() +RunAction::~RunAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2RunAction::BeginOfRunAction(const G4Run*) +void RunAction::BeginOfRunAction(const G4Run*) { //inform the runManager to save random number seed G4RunManager::GetRunManager()->SetRandomNumberStore(false); @@ -56,7 +58,10 @@ void B2RunAction::BeginOfRunAction(const G4Run*) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2RunAction::EndOfRunAction(const G4Run* ) +void RunAction::EndOfRunAction(const G4Run* ) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/B2a/src/B2TrackerHit.cc b/examples/basic/B2/B2a/src/TrackerHit.cc similarity index 74% rename from examples/basic/B2/B2a/src/B2TrackerHit.cc rename to examples/basic/B2/B2a/src/TrackerHit.cc index 9bf31d9907..c2b90b6e6c 100644 --- a/examples/basic/B2/B2a/src/B2TrackerHit.cc +++ b/examples/basic/B2/B2a/src/TrackerHit.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B2TrackerHit.cc -/// \brief Implementation of the B2TrackerHit class +/// \file TrackerHit.cc +/// \brief Implementation of the B2::TrackerHit class -#include "B2TrackerHit.hh" +#include "TrackerHit.hh" #include "G4UnitsTable.hh" #include "G4VVisManager.hh" #include "G4Circle.hh" @@ -36,55 +36,30 @@ #include -G4ThreadLocal G4Allocator* B2TrackerHitAllocator = nullptr; +namespace B2 +{ + +G4ThreadLocal G4Allocator* TrackerHitAllocator = nullptr; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerHit::B2TrackerHit() - : G4VHit(), - fTrackID(-1), - fChamberNb(-1), - fEdep(0.), - fPos(G4ThreeVector()) +TrackerHit::TrackerHit() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerHit::~B2TrackerHit() {} +TrackerHit::~TrackerHit() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerHit::B2TrackerHit(const B2TrackerHit& right) - : G4VHit() -{ - fTrackID = right.fTrackID; - fChamberNb = right.fChamberNb; - fEdep = right.fEdep; - fPos = right.fPos; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -const B2TrackerHit& B2TrackerHit::operator=(const B2TrackerHit& right) -{ - fTrackID = right.fTrackID; - fChamberNb = right.fChamberNb; - fEdep = right.fEdep; - fPos = right.fPos; - - return *this; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -G4bool B2TrackerHit::operator==(const B2TrackerHit& right) const +G4bool TrackerHit::operator==(const TrackerHit& right) const { return ( this == &right ) ? true : false; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2TrackerHit::Draw() +void TrackerHit::Draw() { G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); if(pVVisManager) @@ -101,7 +76,7 @@ void B2TrackerHit::Draw() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2TrackerHit::Print() +void TrackerHit::Print() { G4cout << " trackID: " << fTrackID << " chamberNb: " << fChamberNb @@ -113,3 +88,5 @@ void B2TrackerHit::Print() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B2/B2a/src/B2TrackerSD.cc b/examples/basic/B2/B2a/src/TrackerSD.cc similarity index 85% rename from examples/basic/B2/B2a/src/B2TrackerSD.cc rename to examples/basic/B2/B2a/src/TrackerSD.cc index 89fea0e83f..fafeeb7c88 100644 --- a/examples/basic/B2/B2a/src/B2TrackerSD.cc +++ b/examples/basic/B2/B2a/src/TrackerSD.cc @@ -24,39 +24,41 @@ // ******************************************************************** // // -/// \file B2TrackerSD.cc -/// \brief Implementation of the B2TrackerSD class +/// \file TrackerSD.cc +/// \brief Implementation of the B2::TrackerSD class -#include "B2TrackerSD.hh" +#include "TrackerSD.hh" #include "G4HCofThisEvent.hh" #include "G4Step.hh" #include "G4ThreeVector.hh" #include "G4SDManager.hh" #include "G4ios.hh" +namespace B2 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerSD::B2TrackerSD(const G4String& name, - const G4String& hitsCollectionName) - : G4VSensitiveDetector(name), - fHitsCollection(nullptr) +TrackerSD::TrackerSD(const G4String& name, + const G4String& hitsCollectionName) + : G4VSensitiveDetector(name) { collectionName.insert(hitsCollectionName); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerSD::~B2TrackerSD() +TrackerSD::~TrackerSD() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2TrackerSD::Initialize(G4HCofThisEvent* hce) +void TrackerSD::Initialize(G4HCofThisEvent* hce) { // Create hits collection fHitsCollection - = new B2TrackerHitsCollection(SensitiveDetectorName, collectionName[0]); + = new TrackerHitsCollection(SensitiveDetectorName, collectionName[0]); // Add this collection in hce @@ -67,7 +69,7 @@ void B2TrackerSD::Initialize(G4HCofThisEvent* hce) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4bool B2TrackerSD::ProcessHits(G4Step* aStep, +G4bool TrackerSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) { // energy deposit @@ -75,7 +77,7 @@ G4bool B2TrackerSD::ProcessHits(G4Step* aStep, if (edep==0.) return false; - B2TrackerHit* newHit = new B2TrackerHit(); + TrackerHit* newHit = new TrackerHit(); newHit->SetTrackID (aStep->GetTrack()->GetTrackID()); newHit->SetChamberNb(aStep->GetPreStepPoint()->GetTouchableHandle() @@ -92,7 +94,7 @@ G4bool B2TrackerSD::ProcessHits(G4Step* aStep, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2TrackerSD::EndOfEvent(G4HCofThisEvent*) +void TrackerSD::EndOfEvent(G4HCofThisEvent*) { if ( verboseLevel>1 ) { G4int nofHits = fHitsCollection->entries(); @@ -104,3 +106,6 @@ void B2TrackerSD::EndOfEvent(G4HCofThisEvent*) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/B2b/CMakeLists.txt b/examples/basic/B2/B2b/CMakeLists.txt index ae784e67f8..0a722420b6 100644 --- a/examples/basic/B2/B2b/CMakeLists.txt +++ b/examples/basic/B2/B2b/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B2b) #---------------------------------------------------------------------------- diff --git a/examples/basic/B2/B2b/exampleB2b.cc b/examples/basic/B2/B2b/exampleB2b.cc index 46a0e91595..b22c5e269a 100644 --- a/examples/basic/B2/B2b/exampleB2b.cc +++ b/examples/basic/B2/B2b/exampleB2b.cc @@ -27,8 +27,8 @@ /// \file exampleB2b.cc /// \brief Main program of the B2b example -#include "B2bDetectorConstruction.hh" -#include "B2ActionInitialization.hh" +#include "DetectorConstruction.hh" +#include "ActionInitialization.hh" #include "G4RunManagerFactory.hh" #include "G4SteppingVerbose.hh" @@ -64,14 +64,14 @@ int main(int argc,char** argv) // Set mandatory initialization classes // - runManager->SetUserInitialization(new B2bDetectorConstruction()); + runManager->SetUserInitialization(new B2b::DetectorConstruction()); G4VModularPhysicsList* physicsList = new FTFP_BERT; physicsList->RegisterPhysics(new G4StepLimiterPhysics()); runManager->SetUserInitialization(physicsList); // Set user action classes - runManager->SetUserInitialization(new B2ActionInitialization()); + runManager->SetUserInitialization(new B2::ActionInitialization()); // Initialize visualization // diff --git a/examples/basic/B2/B2b/exampleB2b.out b/examples/basic/B2/B2b/exampleB2b.out index 584fc42fdb..577c40e5ef 100644 --- a/examples/basic/B2/B2b/exampleB2b.out +++ b/examples/basic/B2/B2b/exampleB2b.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -29,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -132,9 +130,9 @@ Some /vis commands (optionally) take a string to specify colour. Computed tolerance = 5.88e-08 mm -Checking overlaps for volume Target (G4Tubs) ... OK! +Checking overlaps for volume Target:0 (G4Tubs) ... OK! Target is 5 cm of G4_Pb -Checking overlaps for volume Tracker (G4Tubs) ... OK! +Checking overlaps for volume Tracker:0 (G4Tubs) ... OK! Checking overlaps for parameterised volume Chamber ... OK! There are 5 chambers in the tracker region. The chambers are 20 cm of G4_Xe @@ -147,32 +145,99 @@ The distance between chamber is 80 cm for neutron : 3 to 6 GeV ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -182,25 +247,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -210,29 +275,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -240,31 +305,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -273,12 +338,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -286,12 +351,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -299,31 +364,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -331,31 +396,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -363,31 +428,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -395,32 +460,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -428,32 +493,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -461,31 +526,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -493,27 +558,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -522,17 +587,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -540,67 +605,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -608,13 +673,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -622,13 +687,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -636,12 +701,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -649,13 +714,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -663,13 +728,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -677,13 +742,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -691,60 +756,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -752,27 +817,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -780,25 +845,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -806,25 +871,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -832,13 +897,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -861,7 +926,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -872,13 +936,13 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 0 0 hits stored in this event >>> Event: 1 - 0 hits stored in this event + 60 hits stored in this event >>> Event: 2 - 120 hits stored in this event + 0 hits stored in this event >>> Event: 3 0 hits stored in this event >>> Event: 4 - 0 hits stored in this event + 34 hits stored in this event >>> Event: 5 0 hits stored in this event >>> Event: 6 @@ -890,7 +954,7 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 9 0 hits stored in this event >>> Event: 10 - 47 hits stored in this event + 21 hits stored in this event >>> Event: 11 0 hits stored in this event >>> Event: 12 @@ -902,15 +966,15 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 15 0 hits stored in this event >>> Event: 16 - 0 hits stored in this event + 58 hits stored in this event >>> Event: 17 - 96 hits stored in this event ->>> Event: 18 0 hits stored in this event +>>> Event: 18 + 93 hits stored in this event >>> Event: 19 0 hits stored in this event >>> Event: 20 - 0 hits stored in this event + 39 hits stored in this event >>> Event: 21 0 hits stored in this event >>> Event: 22 @@ -920,11 +984,11 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 24 0 hits stored in this event >>> Event: 25 - 0 hits stored in this event + 104 hits stored in this event >>> Event: 26 0 hits stored in this event >>> Event: 27 - 15 hits stored in this event + 0 hits stored in this event >>> Event: 28 0 hits stored in this event >>> Event: 29 @@ -932,9 +996,9 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 30 0 hits stored in this event >>> Event: 31 - 17 hits stored in this event + 0 hits stored in this event >>> Event: 32 - 142 hits stored in this event + 0 hits stored in this event >>> Event: 33 0 hits stored in this event >>> Event: 34 @@ -942,29 +1006,29 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 35 0 hits stored in this event >>> Event: 36 - 214 hits stored in this event + 0 hits stored in this event >>> Event: 37 0 hits stored in this event >>> Event: 38 - 3 hits stored in this event + 0 hits stored in this event >>> Event: 39 0 hits stored in this event >>> Event: 40 0 hits stored in this event >>> Event: 41 - 203 hits stored in this event + 0 hits stored in this event >>> Event: 42 0 hits stored in this event >>> Event: 43 - 0 hits stored in this event + 5 hits stored in this event >>> Event: 44 - 0 hits stored in this event + 86 hits stored in this event >>> Event: 45 - 72 hits stored in this event + 0 hits stored in this event >>> Event: 46 0 hits stored in this event >>> Event: 47 - 77 hits stored in this event + 13 hits stored in this event >>> Event: 48 0 hits stored in this event >>> Event: 49 @@ -972,13 +1036,13 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 50 0 hits stored in this event >>> Event: 51 - 58 hits stored in this event + 0 hits stored in this event >>> Event: 52 0 hits stored in this event >>> Event: 53 0 hits stored in this event >>> Event: 54 - 0 hits stored in this event + 12 hits stored in this event >>> Event: 55 0 hits stored in this event >>> Event: 56 @@ -986,25 +1050,25 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 57 0 hits stored in this event >>> Event: 58 - 0 hits stored in this event + 153 hits stored in this event >>> Event: 59 0 hits stored in this event >>> Event: 60 - 0 hits stored in this event + 120 hits stored in this event >>> Event: 61 - 9 hits stored in this event + 0 hits stored in this event >>> Event: 62 0 hits stored in this event >>> Event: 63 - 9 hits stored in this event + 0 hits stored in this event >>> Event: 64 0 hits stored in this event >>> Event: 65 - 86 hits stored in this event + 0 hits stored in this event >>> Event: 66 0 hits stored in this event >>> Event: 67 - 0 hits stored in this event + 295 hits stored in this event >>> Event: 68 0 hits stored in this event >>> Event: 69 @@ -1014,21 +1078,21 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 71 0 hits stored in this event >>> Event: 72 - 0 hits stored in this event + 48 hits stored in this event >>> Event: 73 0 hits stored in this event >>> Event: 74 0 hits stored in this event >>> Event: 75 - 0 hits stored in this event + 132 hits stored in this event >>> Event: 76 0 hits stored in this event >>> Event: 77 - 82 hits stored in this event + 0 hits stored in this event >>> Event: 78 0 hits stored in this event >>> Event: 79 - 0 hits stored in this event + 65 hits stored in this event >>> Event: 80 0 hits stored in this event >>> Event: 81 @@ -1038,17 +1102,17 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 83 0 hits stored in this event >>> Event: 84 - 106 hits stored in this event + 0 hits stored in this event >>> Event: 85 0 hits stored in this event >>> Event: 86 0 hits stored in this event >>> Event: 87 - 0 hits stored in this event + 39 hits stored in this event >>> Event: 88 0 hits stored in this event >>> Event: 89 - 0 hits stored in this event + 67 hits stored in this event >>> Event: 90 0 hits stored in this event >>> Event: 91 @@ -1056,13 +1120,13 @@ See commands in /vis/modeling/trajectories/ for other options. >>> Event: 92 0 hits stored in this event >>> Event: 93 - 0 hits stored in this event + 181 hits stored in this event >>> Event: 94 - 0 hits stored in this event + 50 hits stored in this event >>> Event: 95 0 hits stored in this event >>> Event: 96 - 0 hits stored in this event + 120 hits stored in this event >>> Event: 97 0 hits stored in this event >>> Event: 98 @@ -1075,205 +1139,205 @@ See commands in /vis/modeling/trajectories/ for other options. ### Run 1 starts. --> Event 0 starts. >>> Event: 0 - 122 hits stored in this event + 68 hits stored in this event >>> Event: 1 - 69 hits stored in this event + 646 hits stored in this event >>> Event: 2 - 66 hits stored in this event ->>> Event: 3 - 946 hits stored in this event ->>> Event: 4 - 69 hits stored in this event ->>> Event: 5 - 179 hits stored in this event ->>> Event: 6 - 63 hits stored in this event ->>> Event: 7 - 77 hits stored in this event ->>> Event: 8 - 85 hits stored in this event ->>> Event: 9 - 64 hits stored in this event ->>> Event: 10 - 92 hits stored in this event ->>> Event: 11 - 61 hits stored in this event ->>> Event: 12 - 72 hits stored in this event ->>> Event: 13 - 54 hits stored in this event ->>> Event: 14 - 89 hits stored in this event ->>> Event: 15 - 85 hits stored in this event ->>> Event: 16 - 199 hits stored in this event ->>> Event: 17 - 80 hits stored in this event ->>> Event: 18 - 75 hits stored in this event ->>> Event: 19 - 127 hits stored in this event ->>> Event: 20 - 60 hits stored in this event ->>> Event: 21 - 94 hits stored in this event ->>> Event: 22 - 134 hits stored in this event ->>> Event: 23 - 74 hits stored in this event ->>> Event: 24 - 72 hits stored in this event ->>> Event: 25 - 84 hits stored in this event ->>> Event: 26 - 84 hits stored in this event ->>> Event: 27 - 106 hits stored in this event ->>> Event: 28 - 247 hits stored in this event ->>> Event: 29 - 304 hits stored in this event ->>> Event: 30 - 172 hits stored in this event ->>> Event: 31 - 41 hits stored in this event ->>> Event: 32 - 64 hits stored in this event ->>> Event: 33 - 60 hits stored in this event ->>> Event: 34 - 70 hits stored in this event ->>> Event: 35 - 78 hits stored in this event ->>> Event: 36 - 116 hits stored in this event ->>> Event: 37 - 64 hits stored in this event ->>> Event: 38 - 336 hits stored in this event ->>> Event: 39 - 233 hits stored in this event ->>> Event: 40 - 161 hits stored in this event ->>> Event: 41 - 82 hits stored in this event ->>> Event: 42 - 958 hits stored in this event ->>> Event: 43 - 455 hits stored in this event ->>> Event: 44 - 99 hits stored in this event ->>> Event: 45 - 149 hits stored in this event ->>> Event: 46 - 135 hits stored in this event ->>> Event: 47 - 51 hits stored in this event ->>> Event: 48 - 73 hits stored in this event ->>> Event: 49 - 83 hits stored in this event ->>> Event: 50 - 84 hits stored in this event ->>> Event: 51 - 58 hits stored in this event ->>> Event: 52 - 116 hits stored in this event ->>> Event: 53 - 1676 hits stored in this event ->>> Event: 54 - 3988 hits stored in this event ->>> Event: 55 - 556 hits stored in this event ->>> Event: 56 - 87 hits stored in this event ->>> Event: 57 - 1856 hits stored in this event ->>> Event: 58 - 79 hits stored in this event ->>> Event: 59 - 72 hits stored in this event ->>> Event: 60 - 201 hits stored in this event ->>> Event: 61 - 78 hits stored in this event ->>> Event: 62 - 85 hits stored in this event ->>> Event: 63 71 hits stored in this event ->>> Event: 64 - 55 hits stored in this event ->>> Event: 65 - 128 hits stored in this event ->>> Event: 66 - 135 hits stored in this event ->>> Event: 67 - 249 hits stored in this event ->>> Event: 68 - 295 hits stored in this event ->>> Event: 69 - 104 hits stored in this event ->>> Event: 70 - 117 hits stored in this event ->>> Event: 71 - 146 hits stored in this event ->>> Event: 72 - 79 hits stored in this event ->>> Event: 73 - 245 hits stored in this event ->>> Event: 74 - 27 hits stored in this event ->>> Event: 75 - 371 hits stored in this event ->>> Event: 76 - 4940 hits stored in this event ->>> Event: 77 - 54 hits stored in this event ->>> Event: 78 - 67 hits stored in this event ->>> Event: 79 - 58 hits stored in this event ->>> Event: 80 - 67 hits stored in this event ->>> Event: 81 - 79 hits stored in this event ->>> Event: 82 - 255 hits stored in this event ->>> Event: 83 - 89 hits stored in this event ->>> Event: 84 - 34 hits stored in this event ->>> Event: 85 - 972 hits stored in this event ->>> Event: 86 - 81 hits stored in this event ->>> Event: 87 - 198 hits stored in this event ->>> Event: 88 - 80 hits stored in this event ->>> Event: 89 - 74 hits stored in this event ->>> Event: 90 +>>> Event: 3 + 142 hits stored in this event +>>> Event: 4 + 1920 hits stored in this event +>>> Event: 5 92 hits stored in this event ->>> Event: 91 - 61 hits stored in this event ->>> Event: 92 - 144 hits stored in this event ->>> Event: 93 - 108 hits stored in this event ->>> Event: 94 +>>> Event: 6 93 hits stored in this event ->>> Event: 95 - 301 hits stored in this event ->>> Event: 96 - 62 hits stored in this event ->>> Event: 97 - 90 hits stored in this event ->>> Event: 98 +>>> Event: 7 98 hits stored in this event +>>> Event: 8 + 71 hits stored in this event +>>> Event: 9 + 50 hits stored in this event +>>> Event: 10 + 169 hits stored in this event +>>> Event: 11 + 57 hits stored in this event +>>> Event: 12 + 64 hits stored in this event +>>> Event: 13 + 157 hits stored in this event +>>> Event: 14 + 83 hits stored in this event +>>> Event: 15 + 111 hits stored in this event +>>> Event: 16 + 77 hits stored in this event +>>> Event: 17 + 119 hits stored in this event +>>> Event: 18 + 76 hits stored in this event +>>> Event: 19 + 67 hits stored in this event +>>> Event: 20 + 71 hits stored in this event +>>> Event: 21 + 90 hits stored in this event +>>> Event: 22 + 256 hits stored in this event +>>> Event: 23 + 134 hits stored in this event +>>> Event: 24 + 97 hits stored in this event +>>> Event: 25 + 59 hits stored in this event +>>> Event: 26 + 2361 hits stored in this event +>>> Event: 27 + 73 hits stored in this event +>>> Event: 28 + 966 hits stored in this event +>>> Event: 29 + 129 hits stored in this event +>>> Event: 30 + 625 hits stored in this event +>>> Event: 31 + 169 hits stored in this event +>>> Event: 32 + 80 hits stored in this event +>>> Event: 33 + 263 hits stored in this event +>>> Event: 34 + 493 hits stored in this event +>>> Event: 35 + 665 hits stored in this event +>>> Event: 36 + 120 hits stored in this event +>>> Event: 37 + 191 hits stored in this event +>>> Event: 38 + 74 hits stored in this event +>>> Event: 39 + 194 hits stored in this event +>>> Event: 40 + 89 hits stored in this event +>>> Event: 41 + 147 hits stored in this event +>>> Event: 42 + 166 hits stored in this event +>>> Event: 43 + 91 hits stored in this event +>>> Event: 44 + 75 hits stored in this event +>>> Event: 45 + 151 hits stored in this event +>>> Event: 46 + 151 hits stored in this event +>>> Event: 47 + 121 hits stored in this event +>>> Event: 48 + 143 hits stored in this event +>>> Event: 49 + 100 hits stored in this event +>>> Event: 50 + 102 hits stored in this event +>>> Event: 51 + 79 hits stored in this event +>>> Event: 52 + 212 hits stored in this event +>>> Event: 53 + 1132 hits stored in this event +>>> Event: 54 + 370 hits stored in this event +>>> Event: 55 + 143 hits stored in this event +>>> Event: 56 + 119 hits stored in this event +>>> Event: 57 + 73 hits stored in this event +>>> Event: 58 + 97 hits stored in this event +>>> Event: 59 + 76 hits stored in this event +>>> Event: 60 + 105 hits stored in this event +>>> Event: 61 + 104 hits stored in this event +>>> Event: 62 + 88 hits stored in this event +>>> Event: 63 + 535 hits stored in this event +>>> Event: 64 + 148 hits stored in this event +>>> Event: 65 + 170 hits stored in this event +>>> Event: 66 + 98 hits stored in this event +>>> Event: 67 + 139 hits stored in this event +>>> Event: 68 + 118 hits stored in this event +>>> Event: 69 + 88 hits stored in this event +>>> Event: 70 + 64 hits stored in this event +>>> Event: 71 + 81 hits stored in this event +>>> Event: 72 + 162 hits stored in this event +>>> Event: 73 + 84 hits stored in this event +>>> Event: 74 + 51 hits stored in this event +>>> Event: 75 + 252 hits stored in this event +>>> Event: 76 + 54 hits stored in this event +>>> Event: 77 + 655 hits stored in this event +>>> Event: 78 + 916 hits stored in this event +>>> Event: 79 + 70 hits stored in this event +>>> Event: 80 + 107 hits stored in this event +>>> Event: 81 + 163 hits stored in this event +>>> Event: 82 + 102 hits stored in this event +>>> Event: 83 + 171 hits stored in this event +>>> Event: 84 + 105 hits stored in this event +>>> Event: 85 + 130 hits stored in this event +>>> Event: 86 + 110 hits stored in this event +>>> Event: 87 + 151 hits stored in this event +>>> Event: 88 + 72 hits stored in this event +>>> Event: 89 + 1123 hits stored in this event +>>> Event: 90 + 128 hits stored in this event +>>> Event: 91 + 86 hits stored in this event +>>> Event: 92 + 70 hits stored in this event +>>> Event: 93 + 68 hits stored in this event +>>> Event: 94 + 1107 hits stored in this event +>>> Event: 95 + 291 hits stored in this event +>>> Event: 96 + 202 hits stored in this event +>>> Event: 97 + 141 hits stored in this event +>>> Event: 98 + 82 hits stored in this event >>> Event: 99 - 500 hits stored in this event + 106 hits stored in this event 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1285,21 +1349,21 @@ See commands in /vis/modeling/trajectories/ for other options. ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 0 fm 0 fm -2.94 m 1 TeV 0 meV 0 fm 0 fm World initStep - 1 0 fm 0 fm -2.45 m 1 TeV 0 meV 49 cm 49 cm World Transportation - 2 0 fm 0 fm -2.4 m 1 TeV 0 meV 5 cm 54 cm Target Transportation - 3 0 fm 0 fm -1.7 m 1 TeV 0 meV 70 cm 1.24 m Tracker Transportation - 4 0 fm 0 fm -1.5 m 1 TeV 0 meV 20 cm 1.44 m Chamber Transportation - 5 0 fm 0 fm -90 cm 1 TeV 0 meV 60 cm 2.04 m Tracker Transportation - 6 0 fm 0 fm -70 cm 1 TeV 0 meV 20 cm 2.24 m Chamber Transportation - 7 0 fm 0 fm -10 cm 1 TeV 0 meV 60 cm 2.84 m Tracker Transportation - 8 0 fm 0 fm 10 cm 1 TeV 0 meV 20 cm 3.04 m Chamber Transportation - 9 0 fm 0 fm 70 cm 1 TeV 0 meV 60 cm 3.64 m Tracker Transportation - 10 0 fm 0 fm 90 cm 1 TeV 0 meV 20 cm 3.84 m Chamber Transportation - 11 0 fm 0 fm 1.5 m 1 TeV 0 meV 60 cm 4.44 m Tracker Transportation - 12 0 fm 0 fm 1.7 m 1 TeV 0 meV 20 cm 4.64 m Chamber Transportation - 13 0 fm 0 fm 2.4 m 1 TeV 0 meV 70 cm 5.34 m Tracker Transportation - 14 0 fm 0 fm 2.94 m 1 TeV 0 meV 54 cm 5.88 m World OutOfWorld + 0 0 fm 0 fm -2.94 m 1 TeV 0 eV 0 fm 0 fm World initStep + 1 0 fm 0 fm -2.45 m 1 TeV 0 eV 49 cm 49 cm World Transportation + 2 0 fm 0 fm -2.4 m 1 TeV 0 eV 5 cm 54 cm Target Transportation + 3 0 fm 0 fm -1.7 m 1 TeV 0 eV 70 cm 1.24 m Tracker Transportation + 4 0 fm 0 fm -1.5 m 1 TeV 0 eV 20 cm 1.44 m Chamber Transportation + 5 0 fm 0 fm -90 cm 1 TeV 0 eV 60 cm 2.04 m Tracker Transportation + 6 0 fm 0 fm -70 cm 1 TeV 0 eV 20 cm 2.24 m Chamber Transportation + 7 0 fm 0 fm -10 cm 1 TeV 0 eV 60 cm 2.84 m Tracker Transportation + 8 0 fm 0 fm 10 cm 1 TeV 0 eV 20 cm 3.04 m Chamber Transportation + 9 0 fm 0 fm 70 cm 1 TeV 0 eV 60 cm 3.64 m Tracker Transportation + 10 0 fm 0 fm 90 cm 1 TeV 0 eV 20 cm 3.84 m Chamber Transportation + 11 0 fm 0 fm 1.5 m 1 TeV 0 eV 60 cm 4.44 m Tracker Transportation + 12 0 fm 0 fm 1.7 m 1 TeV 0 eV 20 cm 4.64 m Chamber Transportation + 13 0 fm 0 fm 2.4 m 1 TeV 0 eV 70 cm 5.34 m Tracker Transportation + 14 0 fm 0 fm 2.94 m 1 TeV 0 eV 54 cm 5.88 m World OutOfWorld >>> Event: 0 0 hits stored in this event 0 events have been kept for refreshing and/or reviewing. diff --git a/examples/basic/B2/B2b/include/B2ActionInitialization.hh b/examples/basic/B2/B2b/include/ActionInitialization.hh similarity index 84% rename from examples/basic/B2/B2b/include/B2ActionInitialization.hh rename to examples/basic/B2/B2b/include/ActionInitialization.hh index 588d2edb1a..c3b8a90c0d 100644 --- a/examples/basic/B2/B2b/include/B2ActionInitialization.hh +++ b/examples/basic/B2/B2b/include/ActionInitialization.hh @@ -24,29 +24,31 @@ // ******************************************************************** // // -/// \file B2ActionInitialization.hh -/// \brief Definition of the B2ActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the B2::ActionInitialization class #ifndef B2ActionInitialization_h #define B2ActionInitialization_h 1 #include "G4VUserActionInitialization.hh" -class B4DetectorConstruction; +namespace B2 +{ /// Action initialization class. -/// -class B2ActionInitialization : public G4VUserActionInitialization +class ActionInitialization : public G4VUserActionInitialization { public: - B2ActionInitialization(); - virtual ~B2ActionInitialization(); + ActionInitialization(); + ~ActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; + void BuildForMaster() const override; + void Build() const override; }; +} + #endif diff --git a/examples/basic/B2/B2b/include/B2bChamberParameterisation.hh b/examples/basic/B2/B2b/include/ChamberParameterisation.hh similarity index 76% rename from examples/basic/B2/B2b/include/B2bChamberParameterisation.hh rename to examples/basic/B2/B2b/include/ChamberParameterisation.hh index b19c39c6e5..cab4c7b368 100644 --- a/examples/basic/B2/B2b/include/B2bChamberParameterisation.hh +++ b/examples/basic/B2/B2b/include/ChamberParameterisation.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2bChamberParameterisation.hh -/// \brief Definition of the B2bChamberParameterisation class +/// \file ChamberParameterisation.hh +/// \brief Definition of the B2b::ChamberParameterisation class #ifndef B2bChamberParameterisation_h #define B2bChamberParameterisation_h 1 @@ -50,56 +50,59 @@ class G4Tubs; class G4Polycone; class G4Polyhedra; +namespace B2b +{ + /// A parameterisation that describes a series of boxes along Z. /// /// The boxes have equal width, & their lengths are a linear equation. /// They are spaced an equal distance apart, starting from given location. -class B2bChamberParameterisation : public G4VPVParameterisation +class ChamberParameterisation : public G4VPVParameterisation { public: - B2bChamberParameterisation(G4int noChambers, + ChamberParameterisation(G4int noChambers, G4double startZ, G4double spacing, G4double widthChamber, G4double lengthInitial, G4double lengthFinal ); - virtual ~B2bChamberParameterisation(); + ~ChamberParameterisation() override; void ComputeTransformation (const G4int copyNo, - G4VPhysicalVolume* physVol) const; + G4VPhysicalVolume* physVol) const override; void ComputeDimensions (G4Tubs & trackerLayer, const G4int copyNo, - const G4VPhysicalVolume* physVol) const; + const G4VPhysicalVolume* physVol) const override; private: // Dummy declarations to get rid of warnings ... void ComputeDimensions (G4Box&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Trd&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Trap&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Cons&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Sphere&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Orb&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Ellipsoid&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Torus&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Para&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Hype&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Polycone&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} void ComputeDimensions (G4Polyhedra&,const G4int, - const G4VPhysicalVolume*) const {} + const G4VPhysicalVolume*) const override {} private: @@ -111,6 +114,6 @@ class B2bChamberParameterisation : public G4VPVParameterisation G4double fRmaxIncr; // The Increment for the half-length }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2b/include/B2bDetectorConstruction.hh b/examples/basic/B2/B2b/include/DetectorConstruction.hh similarity index 72% rename from examples/basic/B2/B2b/include/B2bDetectorConstruction.hh rename to examples/basic/B2/B2b/include/DetectorConstruction.hh index 797c2789c2..94b32d24ee 100644 --- a/examples/basic/B2/B2b/include/B2bDetectorConstruction.hh +++ b/examples/basic/B2/B2b/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2bDetectorConstruction.hh -/// \brief Definition of the B2bDetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the B2b::DetectorConstruction class #ifndef B2bDetectorConstruction_h #define B2bDetectorConstruction_h 1 @@ -40,20 +40,23 @@ class G4Material; class G4UserLimits; class G4GlobalMagFieldMessenger; -class B2bDetectorMessenger; +namespace B2b +{ + +class DetectorMessenger; /// Detector construction class to define materials, geometry /// and global uniform magnetic field. -class B2bDetectorConstruction : public G4VUserDetectorConstruction +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B2bDetectorConstruction(); - virtual ~B2bDetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; public: - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; // Set methods void SetTargetMaterial (G4String ); @@ -66,23 +69,23 @@ class B2bDetectorConstruction : public G4VUserDetectorConstruction void DefineMaterials(); G4VPhysicalVolume* DefineVolumes(); - // data members - G4LogicalVolume* fLogicTarget; // pointer to the logical Target - G4LogicalVolume* fLogicChamber; // pointer to the logical Chamber - - G4Material* fTargetMaterial; // pointer to the target material - G4Material* fChamberMaterial; // pointer to the chamber material - - G4UserLimits* fStepLimit; // pointer to user step limits - - B2bDetectorMessenger* fMessenger; // detector messenger - + // static data members static G4ThreadLocal G4GlobalMagFieldMessenger* fMagFieldMessenger; // magnetic field messenger + // data members + G4LogicalVolume* fLogicTarget = nullptr; // pointer to the logical Target + G4LogicalVolume* fLogicChamber = nullptr; // pointer to the logical Chamber - G4bool fCheckOverlaps; // option to activate checking of volumes overlaps + G4Material* fTargetMaterial = nullptr; // pointer to the target material + G4Material* fChamberMaterial = nullptr; // pointer to the chamber material + + G4UserLimits* fStepLimit = nullptr; // pointer to user step limits + + DetectorMessenger* fMessenger = nullptr; // messenger + + G4bool fCheckOverlaps = true; // option to activate checking of volumes overlaps }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2b/include/B2bDetectorMessenger.hh b/examples/basic/B2/B2b/include/DetectorMessenger.hh similarity index 71% rename from examples/basic/B2/B2b/include/B2bDetectorMessenger.hh rename to examples/basic/B2/B2b/include/DetectorMessenger.hh index f8a310b59e..40a47488a5 100644 --- a/examples/basic/B2/B2b/include/B2bDetectorMessenger.hh +++ b/examples/basic/B2/B2b/include/DetectorMessenger.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2bDetectorMessenger.hh -/// \brief Definition of the B2bDetectorMessenger class +/// \file DetectorMessenger.hh +/// \brief Definition of the B2b::DetectorMessenger class #ifndef B2bDetectorMessenger_h #define B2bDetectorMessenger_h 1 @@ -33,40 +33,42 @@ #include "globals.hh" #include "G4UImessenger.hh" -class B2bDetectorConstruction; class G4UIdirectory; class G4UIcmdWithAString; class G4UIcmdWithADoubleAndUnit; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +namespace B2b +{ -/// Messenger class that defines commands for B2bDetectorConstruction. +class DetectorConstruction; + +/// Messenger class that defines commands for B2b::DetectorConstruction. /// /// It implements commands: /// - /B2/det/setTargetMaterial name /// - /B2/det/setChamberMaterial name /// - /B2/det/stepMax value unit -class B2bDetectorMessenger: public G4UImessenger +class DetectorMessenger: public G4UImessenger { public: - B2bDetectorMessenger(B2bDetectorConstruction* ); - virtual ~B2bDetectorMessenger(); + DetectorMessenger(DetectorConstruction* ); + ~DetectorMessenger() override; - virtual void SetNewValue(G4UIcommand*, G4String); + void SetNewValue(G4UIcommand*, G4String) override; private: - B2bDetectorConstruction* fDetectorConstruction; + DetectorConstruction* fDetectorConstruction = nullptr; - G4UIdirectory* fB2Directory; - G4UIdirectory* fDetDirectory; + G4UIdirectory* fDirectory = nullptr; + G4UIdirectory* fDetDirectory = nullptr; - G4UIcmdWithAString* fTargMatCmd; - G4UIcmdWithAString* fChamMatCmd; + G4UIcmdWithAString* fTargMatCmd = nullptr; + G4UIcmdWithAString* fChamMatCmd = nullptr; - G4UIcmdWithADoubleAndUnit* fStepMaxCmd; + G4UIcmdWithADoubleAndUnit* fStepMaxCmd = nullptr; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2b/include/B2EventAction.hh b/examples/basic/B2/B2b/include/EventAction.hh similarity index 83% rename from examples/basic/B2/B2b/include/B2EventAction.hh rename to examples/basic/B2/B2b/include/EventAction.hh index 36bb382a64..a557245477 100644 --- a/examples/basic/B2/B2b/include/B2EventAction.hh +++ b/examples/basic/B2/B2b/include/EventAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2EventAction.hh -/// \brief Definition of the B2EventAction class +/// \file EventAction.hh +/// \brief Definition of the B2::EventAction class #ifndef B2EventAction_h #define B2EventAction_h 1 @@ -34,18 +34,21 @@ #include "globals.hh" +namespace B2 +{ + /// Event action class -class B2EventAction : public G4UserEventAction +class EventAction : public G4UserEventAction { public: - B2EventAction(); - virtual ~B2EventAction(); + EventAction(); + ~EventAction() override; - virtual void BeginOfEventAction(const G4Event* ); - virtual void EndOfEventAction(const G4Event* ); + void BeginOfEventAction(const G4Event* ) override; + void EndOfEventAction(const G4Event* ) override; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2b/include/B2PrimaryGeneratorAction.hh b/examples/basic/B2/B2b/include/PrimaryGeneratorAction.hh similarity index 84% rename from examples/basic/B2/B2b/include/B2PrimaryGeneratorAction.hh rename to examples/basic/B2/B2b/include/PrimaryGeneratorAction.hh index 113a5fc085..9177a1c69d 100644 --- a/examples/basic/B2/B2b/include/B2PrimaryGeneratorAction.hh +++ b/examples/basic/B2/B2b/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2PrimaryGeneratorAction.hh -/// \brief Definition of the B2PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the B2::PrimaryGeneratorAction class #ifndef B2PrimaryGeneratorAction_h #define B2PrimaryGeneratorAction_h 1 @@ -36,6 +36,9 @@ class G4ParticleGun; class G4Event; +namespace B2 +{ + /// The primary generator action class with particle gum. /// /// It defines a single particle which hits the Tracker @@ -43,13 +46,13 @@ class G4Event; /// can be changed via the G4 build-in commands of G4ParticleGun class /// (see the macros provided with this example). -class B2PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B2PrimaryGeneratorAction(); - virtual ~B2PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event* ); + void GeneratePrimaries(G4Event* ) override; G4ParticleGun* GetParticleGun() {return fParticleGun;} @@ -57,9 +60,9 @@ class B2PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction void SetRandomFlag(G4bool ); private: - G4ParticleGun* fParticleGun; // G4 particle gun + G4ParticleGun* fParticleGun = nullptr; // G4 particle gun }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2b/include/RunAction.hh b/examples/basic/B2/B2b/include/RunAction.hh new file mode 100644 index 0000000000..a6456e8acb --- /dev/null +++ b/examples/basic/B2/B2b/include/RunAction.hh @@ -0,0 +1,55 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +/// \file RunAction.hh +/// \brief Definition of the B2::RunAction class + +#ifndef B2RunAction_h +#define B2RunAction_h 1 + +#include "G4UserRunAction.hh" +#include "globals.hh" + +class G4Run; + +namespace B2 +{ + +/// Run action class + +class RunAction : public G4UserRunAction +{ + public: + RunAction(); + ~RunAction() override; + + void BeginOfRunAction(const G4Run* run) override; + void EndOfRunAction(const G4Run* run) override; +}; + +} + +#endif diff --git a/examples/basic/B2/B2a/include/B2TrackerHit.hh b/examples/basic/B2/B2b/include/TrackerHit.hh similarity index 76% rename from examples/basic/B2/B2a/include/B2TrackerHit.hh rename to examples/basic/B2/B2b/include/TrackerHit.hh index d80c4352f2..2ed28e9ca5 100644 --- a/examples/basic/B2/B2a/include/B2TrackerHit.hh +++ b/examples/basic/B2/B2b/include/TrackerHit.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B2TrackerHit.hh -/// \brief Definition of the B2TrackerHit class +/// \file TrackerHit.hh +/// \brief Definition of the B2::TrackerHit class #ifndef B2TrackerHit_h #define B2TrackerHit_h 1 @@ -36,29 +36,32 @@ #include "G4ThreeVector.hh" #include "tls.hh" +namespace B2 +{ + /// Tracker hit class /// /// It defines data members to store the trackID, chamberNb, energy deposit, /// and position of charged particles in a selected volume: /// - fTrackID, fChamberNB, fEdep, fPos -class B2TrackerHit : public G4VHit +class TrackerHit : public G4VHit { public: - B2TrackerHit(); - B2TrackerHit(const B2TrackerHit&); - virtual ~B2TrackerHit(); + TrackerHit(); + TrackerHit(const TrackerHit&) = default; + ~TrackerHit() override; // operators - const B2TrackerHit& operator=(const B2TrackerHit&); - G4bool operator==(const B2TrackerHit&) const; + TrackerHit& operator=(const TrackerHit&) = default; + G4bool operator==(const TrackerHit&) const; inline void* operator new(size_t); inline void operator delete(void*); // methods from base class - virtual void Draw(); - virtual void Print(); + void Draw() override; + void Print() override; // Set methods void SetTrackID (G4int track) { fTrackID = track; }; @@ -73,35 +76,36 @@ class B2TrackerHit : public G4VHit G4ThreeVector GetPos() const { return fPos; }; private: - - G4int fTrackID; - G4int fChamberNb; - G4double fEdep; - G4ThreeVector fPos; + G4int fTrackID = -1; + G4int fChamberNb = -1; + G4double fEdep = 0.; + G4ThreeVector fPos; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -typedef G4THitsCollection B2TrackerHitsCollection; +typedef G4THitsCollection TrackerHitsCollection; -extern G4ThreadLocal G4Allocator* B2TrackerHitAllocator; +extern G4ThreadLocal G4Allocator* TrackerHitAllocator; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -inline void* B2TrackerHit::operator new(size_t) +inline void* TrackerHit::operator new(size_t) { - if(!B2TrackerHitAllocator) - B2TrackerHitAllocator = new G4Allocator; - return (void *) B2TrackerHitAllocator->MallocSingle(); + if(!TrackerHitAllocator) + TrackerHitAllocator = new G4Allocator; + return (void *) TrackerHitAllocator->MallocSingle(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -inline void B2TrackerHit::operator delete(void *hit) +inline void TrackerHit::operator delete(void *hit) { - B2TrackerHitAllocator->FreeSingle((B2TrackerHit*) hit); + TrackerHitAllocator->FreeSingle((TrackerHit*) hit); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} + #endif diff --git a/examples/basic/B2/B2a/include/B2TrackerSD.hh b/examples/basic/B2/B2b/include/TrackerSD.hh similarity index 76% rename from examples/basic/B2/B2a/include/B2TrackerSD.hh rename to examples/basic/B2/B2b/include/TrackerSD.hh index eb7d4bab29..096a8b81d4 100644 --- a/examples/basic/B2/B2a/include/B2TrackerSD.hh +++ b/examples/basic/B2/B2b/include/TrackerSD.hh @@ -24,45 +24,46 @@ // ******************************************************************** // // -/// \file B2TrackerSD.hh -/// \brief Definition of the B2TrackerSD class +/// \file TrackerSD.hh +/// \brief Definition of the B2::TrackerSD class #ifndef B2TrackerSD_h #define B2TrackerSD_h 1 #include "G4VSensitiveDetector.hh" -#include "B2TrackerHit.hh" +#include "TrackerHit.hh" #include class G4Step; class G4HCofThisEvent; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +namespace B2 +{ -/// B2Tracker sensitive detector class +/// Tracker sensitive detector class /// /// The hits are accounted in hits in ProcessHits() function which is called /// by Geant4 kernel at each step. A hit is created with each step with non zero /// energy deposit. -class B2TrackerSD : public G4VSensitiveDetector +class TrackerSD : public G4VSensitiveDetector { public: - B2TrackerSD(const G4String& name, + TrackerSD(const G4String& name, const G4String& hitsCollectionName); - virtual ~B2TrackerSD(); + ~TrackerSD() override; // methods from base class - virtual void Initialize(G4HCofThisEvent* hitCollection); - virtual G4bool ProcessHits(G4Step* step, G4TouchableHistory* history); - virtual void EndOfEvent(G4HCofThisEvent* hitCollection); + void Initialize(G4HCofThisEvent* hitCollection) override; + G4bool ProcessHits(G4Step* step, G4TouchableHistory* history) override; + void EndOfEvent(G4HCofThisEvent* hitCollection) override; private: - B2TrackerHitsCollection* fHitsCollection; + TrackerHitsCollection* fHitsCollection = nullptr; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} #endif diff --git a/examples/basic/B2/B2b/src/ActionInitialization.cc b/examples/basic/B2/B2b/src/ActionInitialization.cc new file mode 100644 index 0000000000..165798aee4 --- /dev/null +++ b/examples/basic/B2/B2b/src/ActionInitialization.cc @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +/// \file ActionInitialization.cc +/// \brief Implementation of the B2::ActionInitialization class + +#include "ActionInitialization.hh" +#include "PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "EventAction.hh" + +namespace B2 +{ + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::~ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::BuildForMaster() const +{ + SetUserAction(new RunAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::Build() const +{ + SetUserAction(new PrimaryGeneratorAction); + SetUserAction(new RunAction); + SetUserAction(new EventAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/B2b/src/B2bChamberParameterisation.cc b/examples/basic/B2/B2b/src/ChamberParameterisation.cc similarity index 87% rename from examples/basic/B2/B2b/src/B2bChamberParameterisation.cc rename to examples/basic/B2/B2b/src/ChamberParameterisation.cc index d0d0a194c3..d1aa10c0c5 100644 --- a/examples/basic/B2/B2b/src/B2bChamberParameterisation.cc +++ b/examples/basic/B2/B2b/src/ChamberParameterisation.cc @@ -24,26 +24,28 @@ // ******************************************************************** // // -/// \file B2bChamberParameterisation.cc -/// \brief Implementation of the B2bChamberParameterisation class +/// \file ChamberParameterisation.cc +/// \brief Implementation of the B2b::ChamberParameterisation class -#include "B2bChamberParameterisation.hh" +#include "ChamberParameterisation.hh" #include "G4VPhysicalVolume.hh" #include "G4ThreeVector.hh" #include "G4Tubs.hh" #include "G4SystemOfUnits.hh" +namespace B2b +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2bChamberParameterisation::B2bChamberParameterisation( +ChamberParameterisation::ChamberParameterisation( G4int noChambers, G4double startZ, // Z of center of first G4double spacingZ, // Z spacing of centers G4double widthChamber, G4double lengthInitial, G4double lengthFinal ) - : G4VPVParameterisation() { fNoChambers = noChambers; fStartZ = startZ; @@ -53,7 +55,7 @@ B2bChamberParameterisation::B2bChamberParameterisation( if( noChambers > 0 ){ fRmaxIncr = 0.5 * (lengthFinal-lengthInitial)/(noChambers-1); if (spacingZ < widthChamber) { - G4Exception("B2bChamberParameterisation::B2bChamberParameterisation()", + G4Exception("ChamberParameterisation::ChamberParameterisation()", "InvalidSetup", FatalException, "Width>Spacing"); } @@ -62,12 +64,12 @@ B2bChamberParameterisation::B2bChamberParameterisation( //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2bChamberParameterisation::~B2bChamberParameterisation() +ChamberParameterisation::~ChamberParameterisation() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2bChamberParameterisation::ComputeTransformation +void ChamberParameterisation::ComputeTransformation (const G4int copyNo, G4VPhysicalVolume* physVol) const { // Note: copyNo will start with zero! @@ -79,7 +81,7 @@ void B2bChamberParameterisation::ComputeTransformation //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2bChamberParameterisation::ComputeDimensions +void ChamberParameterisation::ComputeDimensions (G4Tubs& trackerChamber, const G4int copyNo, const G4VPhysicalVolume*) const { // Note: copyNo will start with zero! @@ -92,3 +94,5 @@ void B2bChamberParameterisation::ComputeDimensions } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B2/B2b/src/B2bDetectorConstruction.cc b/examples/basic/B2/B2b/src/DetectorConstruction.cc similarity index 90% rename from examples/basic/B2/B2b/src/B2bDetectorConstruction.cc rename to examples/basic/B2/B2b/src/DetectorConstruction.cc index 4487ed09ba..acb82d493e 100644 --- a/examples/basic/B2/B2b/src/B2bDetectorConstruction.cc +++ b/examples/basic/B2/B2b/src/DetectorConstruction.cc @@ -24,13 +24,13 @@ // ******************************************************************** // // -/// \file B2bDetectorConstruction.cc -/// \brief Implementation of the B2bDetectorConstruction class +/// \file DetectorConstruction.cc +/// \brief Implementation of the B2b::DetectorConstruction class -#include "B2bDetectorConstruction.hh" -#include "B2bDetectorMessenger.hh" -#include "B2bChamberParameterisation.hh" -#include "B2TrackerSD.hh" +#include "DetectorConstruction.hh" +#include "DetectorMessenger.hh" +#include "ChamberParameterisation.hh" +#include "TrackerSD.hh" #include "G4Material.hh" #include "G4NistManager.hh" @@ -54,24 +54,24 @@ #include "G4SystemOfUnits.hh" +using namespace B2; + +namespace B2b +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ThreadLocal -G4GlobalMagFieldMessenger* B2bDetectorConstruction::fMagFieldMessenger = nullptr; +G4GlobalMagFieldMessenger* DetectorConstruction::fMagFieldMessenger = nullptr; -B2bDetectorConstruction::B2bDetectorConstruction() -:G4VUserDetectorConstruction(), - fLogicTarget(nullptr), fLogicChamber(nullptr), - fTargetMaterial(nullptr), fChamberMaterial(nullptr), - fStepLimit(nullptr), - fCheckOverlaps(true) +DetectorConstruction::DetectorConstruction() { - fMessenger = new B2bDetectorMessenger(this); + fMessenger = new DetectorMessenger(this); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2bDetectorConstruction::~B2bDetectorConstruction() +DetectorConstruction::~DetectorConstruction() { delete fStepLimit; delete fMessenger; @@ -79,7 +79,7 @@ B2bDetectorConstruction::~B2bDetectorConstruction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B2bDetectorConstruction::Construct() +G4VPhysicalVolume* DetectorConstruction::Construct() { // Define materials DefineMaterials(); @@ -90,7 +90,7 @@ G4VPhysicalVolume* B2bDetectorConstruction::Construct() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2bDetectorConstruction::DefineMaterials() +void DetectorConstruction::DefineMaterials() { // Material definition @@ -111,7 +111,7 @@ void B2bDetectorConstruction::DefineMaterials() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B2bDetectorConstruction::DefineVolumes() +G4VPhysicalVolume* DetectorConstruction::DefineVolumes() { G4Material* air = G4Material::GetMaterial("G4_AIR"); @@ -215,7 +215,7 @@ G4VPhysicalVolume* B2bDetectorConstruction::DefineVolumes() G4double lastLength = trackerLength; G4VPVParameterisation* chamberParam = - new B2bChamberParameterisation( + new ChamberParameterisation( NbOfChambers, // NoChambers firstPosition, // Z of center of first chamberSpacing, // Z spacing of centers @@ -276,13 +276,13 @@ G4VPhysicalVolume* B2bDetectorConstruction::DefineVolumes() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2bDetectorConstruction::ConstructSDandField() +void DetectorConstruction::ConstructSDandField() { // Sensitive detectors G4String trackerChamberSDname = "B2/TrackerChamberSD"; - B2TrackerSD* aTrackerSD = new B2TrackerSD(trackerChamberSDname, - "TrackerHitsCollection"); + TrackerSD* aTrackerSD = new TrackerSD(trackerChamberSDname, + "TrackerHitsCollection"); G4SDManager::GetSDMpointer()->AddNewDetector(aTrackerSD); SetSensitiveDetector( fLogicChamber, aTrackerSD ); @@ -299,7 +299,7 @@ void B2bDetectorConstruction::ConstructSDandField() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2bDetectorConstruction::SetTargetMaterial(G4String materialName) +void DetectorConstruction::SetTargetMaterial(G4String materialName) { G4NistManager* nistManager = G4NistManager::Instance(); @@ -324,7 +324,7 @@ void B2bDetectorConstruction::SetTargetMaterial(G4String materialName) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2bDetectorConstruction::SetChamberMaterial(G4String materialName) +void DetectorConstruction::SetChamberMaterial(G4String materialName) { G4NistManager* nistManager = G4NistManager::Instance(); @@ -349,9 +349,11 @@ void B2bDetectorConstruction::SetChamberMaterial(G4String materialName) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2bDetectorConstruction::SetMaxStep(G4double maxStep) +void DetectorConstruction::SetMaxStep(G4double maxStep) { if ((fStepLimit)&&(maxStep>0.)) fStepLimit->SetMaxAllowedStep(maxStep); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B2/B2b/src/B2bDetectorMessenger.cc b/examples/basic/B2/B2b/src/DetectorMessenger.cc similarity index 85% rename from examples/basic/B2/B2b/src/B2bDetectorMessenger.cc rename to examples/basic/B2/B2b/src/DetectorMessenger.cc index 16a971553a..da186a44b6 100644 --- a/examples/basic/B2/B2b/src/B2bDetectorMessenger.cc +++ b/examples/basic/B2/B2b/src/DetectorMessenger.cc @@ -24,24 +24,26 @@ // ******************************************************************** // // -/// \file B2bDetectorMessenger.cc -/// \brief Implementation of the B2bDetectorMessenger class +/// \file DetectorMessenger.cc +/// \brief Implementation of the B2b::DetectorMessenger class -#include "B2bDetectorMessenger.hh" -#include "B2bDetectorConstruction.hh" +#include "DetectorMessenger.hh" +#include "DetectorConstruction.hh" #include "G4UIdirectory.hh" #include "G4UIcmdWithAString.hh" #include "G4UIcmdWithADoubleAndUnit.hh" +namespace B2b +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2bDetectorMessenger::B2bDetectorMessenger(B2bDetectorConstruction* Det) - : G4UImessenger(), - fDetectorConstruction(Det) +DetectorMessenger::DetectorMessenger(DetectorConstruction* Det) + : fDetectorConstruction(Det) { - fB2Directory = new G4UIdirectory("/B2/"); - fB2Directory->SetGuidance("UI commands specific to this example."); + fDirectory = new G4UIdirectory("/B2/"); + fDirectory->SetGuidance("UI commands specific to this example."); fDetDirectory = new G4UIdirectory("/B2/det/"); fDetDirectory->SetGuidance("Detector construction control"); @@ -65,18 +67,18 @@ B2bDetectorMessenger::B2bDetectorMessenger(B2bDetectorConstruction* Det) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2bDetectorMessenger::~B2bDetectorMessenger() +DetectorMessenger::~DetectorMessenger() { delete fTargMatCmd; delete fChamMatCmd; delete fStepMaxCmd; - delete fB2Directory; + delete fDirectory; delete fDetDirectory; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2bDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +void DetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) { if( command == fTargMatCmd ) { fDetectorConstruction->SetTargetMaterial(newValue);} @@ -91,3 +93,5 @@ void B2bDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B2/B2a/src/B2EventAction.cc b/examples/basic/B2/B2b/src/EventAction.cc similarity index 90% rename from examples/basic/B2/B2a/src/B2EventAction.cc rename to examples/basic/B2/B2b/src/EventAction.cc index cf41016da7..d8480a8190 100644 --- a/examples/basic/B2/B2a/src/B2EventAction.cc +++ b/examples/basic/B2/B2b/src/EventAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B2EventAction.cc -/// \brief Implementation of the B2EventAction class +/// \file EventAction.cc +/// \brief Implementation of the B2::EventAction class -#include "B2EventAction.hh" +#include "EventAction.hh" #include "G4Event.hh" #include "G4EventManager.hh" @@ -35,25 +35,27 @@ #include "G4Trajectory.hh" #include "G4ios.hh" +namespace B2 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2EventAction::B2EventAction() -: G4UserEventAction() +EventAction::EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2EventAction::~B2EventAction() +EventAction::~EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2EventAction::BeginOfEventAction(const G4Event*) +void EventAction::BeginOfEventAction(const G4Event*) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2EventAction::EndOfEventAction(const G4Event* event) +void EventAction::EndOfEventAction(const G4Event* event) { // get number of stored trajectories @@ -77,3 +79,6 @@ void B2EventAction::EndOfEventAction(const G4Event* event) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/B2b/src/B2PrimaryGeneratorAction.cc b/examples/basic/B2/B2b/src/PrimaryGeneratorAction.cc similarity index 91% rename from examples/basic/B2/B2b/src/B2PrimaryGeneratorAction.cc rename to examples/basic/B2/B2b/src/PrimaryGeneratorAction.cc index 09b46ba161..b45b4a1f93 100644 --- a/examples/basic/B2/B2b/src/B2PrimaryGeneratorAction.cc +++ b/examples/basic/B2/B2b/src/PrimaryGeneratorAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B2PrimaryGeneratorAction.cc -/// \brief Implementation of the B2PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the B2::PrimaryGeneratorAction class -#include "B2PrimaryGeneratorAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4LogicalVolumeStore.hh" #include "G4LogicalVolume.hh" @@ -37,13 +37,14 @@ #include "G4ParticleTable.hh" #include "G4ParticleDefinition.hh" #include "G4SystemOfUnits.hh" - #include "Randomize.hh" +namespace B2 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2PrimaryGeneratorAction::B2PrimaryGeneratorAction() - : G4VUserPrimaryGeneratorAction() +PrimaryGeneratorAction::PrimaryGeneratorAction() { G4int nofParticles = 1; fParticleGun = new G4ParticleGun(nofParticles); @@ -60,14 +61,14 @@ B2PrimaryGeneratorAction::B2PrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2PrimaryGeneratorAction::~B2PrimaryGeneratorAction() +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { // This function is called at the begining of event @@ -95,3 +96,6 @@ void B2PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/B2a/src/B2RunAction.cc b/examples/basic/B2/B2b/src/RunAction.cc similarity index 89% rename from examples/basic/B2/B2a/src/B2RunAction.cc rename to examples/basic/B2/B2b/src/RunAction.cc index 8245c761c7..13e881d4c0 100644 --- a/examples/basic/B2/B2a/src/B2RunAction.cc +++ b/examples/basic/B2/B2b/src/RunAction.cc @@ -24,18 +24,20 @@ // ******************************************************************** // // -/// \file B2RunAction.cc -/// \brief Implementation of the B2RunAction class +/// \file RunAction.cc +/// \brief Implementation of the B2::RunAction class -#include "B2RunAction.hh" +#include "RunAction.hh" #include "G4Run.hh" #include "G4RunManager.hh" +namespace B2 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2RunAction::B2RunAction() - : G4UserRunAction() +RunAction::RunAction() { // set printing event number per each 100 events G4RunManager::GetRunManager()->SetPrintProgress(1000); @@ -43,12 +45,12 @@ B2RunAction::B2RunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2RunAction::~B2RunAction() +RunAction::~RunAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2RunAction::BeginOfRunAction(const G4Run*) +void RunAction::BeginOfRunAction(const G4Run*) { //inform the runManager to save random number seed G4RunManager::GetRunManager()->SetRandomNumberStore(false); @@ -56,7 +58,10 @@ void B2RunAction::BeginOfRunAction(const G4Run*) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2RunAction::EndOfRunAction(const G4Run* ) +void RunAction::EndOfRunAction(const G4Run* ) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/B2b/src/B2TrackerHit.cc b/examples/basic/B2/B2b/src/TrackerHit.cc similarity index 74% rename from examples/basic/B2/B2b/src/B2TrackerHit.cc rename to examples/basic/B2/B2b/src/TrackerHit.cc index 9bf31d9907..c2b90b6e6c 100644 --- a/examples/basic/B2/B2b/src/B2TrackerHit.cc +++ b/examples/basic/B2/B2b/src/TrackerHit.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B2TrackerHit.cc -/// \brief Implementation of the B2TrackerHit class +/// \file TrackerHit.cc +/// \brief Implementation of the B2::TrackerHit class -#include "B2TrackerHit.hh" +#include "TrackerHit.hh" #include "G4UnitsTable.hh" #include "G4VVisManager.hh" #include "G4Circle.hh" @@ -36,55 +36,30 @@ #include -G4ThreadLocal G4Allocator* B2TrackerHitAllocator = nullptr; +namespace B2 +{ + +G4ThreadLocal G4Allocator* TrackerHitAllocator = nullptr; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerHit::B2TrackerHit() - : G4VHit(), - fTrackID(-1), - fChamberNb(-1), - fEdep(0.), - fPos(G4ThreeVector()) +TrackerHit::TrackerHit() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerHit::~B2TrackerHit() {} +TrackerHit::~TrackerHit() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerHit::B2TrackerHit(const B2TrackerHit& right) - : G4VHit() -{ - fTrackID = right.fTrackID; - fChamberNb = right.fChamberNb; - fEdep = right.fEdep; - fPos = right.fPos; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -const B2TrackerHit& B2TrackerHit::operator=(const B2TrackerHit& right) -{ - fTrackID = right.fTrackID; - fChamberNb = right.fChamberNb; - fEdep = right.fEdep; - fPos = right.fPos; - - return *this; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -G4bool B2TrackerHit::operator==(const B2TrackerHit& right) const +G4bool TrackerHit::operator==(const TrackerHit& right) const { return ( this == &right ) ? true : false; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2TrackerHit::Draw() +void TrackerHit::Draw() { G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); if(pVVisManager) @@ -101,7 +76,7 @@ void B2TrackerHit::Draw() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2TrackerHit::Print() +void TrackerHit::Print() { G4cout << " trackID: " << fTrackID << " chamberNb: " << fChamberNb @@ -113,3 +88,5 @@ void B2TrackerHit::Print() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B2/B2b/src/B2TrackerSD.cc b/examples/basic/B2/B2b/src/TrackerSD.cc similarity index 81% rename from examples/basic/B2/B2b/src/B2TrackerSD.cc rename to examples/basic/B2/B2b/src/TrackerSD.cc index 904d1072c2..fafeeb7c88 100644 --- a/examples/basic/B2/B2b/src/B2TrackerSD.cc +++ b/examples/basic/B2/B2b/src/TrackerSD.cc @@ -24,39 +24,41 @@ // ******************************************************************** // // -/// \file B2TrackerSD.cc -/// \brief Implementation of the B2TrackerSD class +/// \file TrackerSD.cc +/// \brief Implementation of the B2::TrackerSD class -#include "B2TrackerSD.hh" +#include "TrackerSD.hh" #include "G4HCofThisEvent.hh" #include "G4Step.hh" #include "G4ThreeVector.hh" #include "G4SDManager.hh" #include "G4ios.hh" +namespace B2 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerSD::B2TrackerSD(const G4String& name, - const G4String& hitsCollectionName) - : G4VSensitiveDetector(name), - fHitsCollection(nullptr) +TrackerSD::TrackerSD(const G4String& name, + const G4String& hitsCollectionName) + : G4VSensitiveDetector(name) { collectionName.insert(hitsCollectionName); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2TrackerSD::~B2TrackerSD() +TrackerSD::~TrackerSD() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2TrackerSD::Initialize(G4HCofThisEvent* hce) +void TrackerSD::Initialize(G4HCofThisEvent* hce) { // Create hits collection fHitsCollection - = new B2TrackerHitsCollection(SensitiveDetectorName, collectionName[0]); + = new TrackerHitsCollection(SensitiveDetectorName, collectionName[0]); // Add this collection in hce @@ -67,7 +69,7 @@ void B2TrackerSD::Initialize(G4HCofThisEvent* hce) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4bool B2TrackerSD::ProcessHits(G4Step* aStep, +G4bool TrackerSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) { // energy deposit @@ -75,7 +77,7 @@ G4bool B2TrackerSD::ProcessHits(G4Step* aStep, if (edep==0.) return false; - B2TrackerHit* newHit = new B2TrackerHit(); + TrackerHit* newHit = new TrackerHit(); newHit->SetTrackID (aStep->GetTrack()->GetTrackID()); newHit->SetChamberNb(aStep->GetPreStepPoint()->GetTouchableHandle() @@ -92,16 +94,18 @@ G4bool B2TrackerSD::ProcessHits(G4Step* aStep, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2TrackerSD::EndOfEvent(G4HCofThisEvent*) +void TrackerSD::EndOfEvent(G4HCofThisEvent*) { if ( verboseLevel>1 ) { G4int nofHits = fHitsCollection->entries(); - G4cout - << G4endl - << "-------->Hits Collection: in this event they are " << nofHits - << " hits in the tracker chambers: " << G4endl; + G4cout << G4endl + << "-------->Hits Collection: in this event they are " << nofHits + << " hits in the tracker chambers: " << G4endl; for ( G4int i=0; iPrint(); } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B2/CMakeLists.txt b/examples/basic/B2/CMakeLists.txt index 955c123443..0ef913fb78 100644 --- a/examples/basic/B2/CMakeLists.txt +++ b/examples/basic/B2/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding example B2 subdirectories explicitly # and a custom target to for building all example B2 options ---------- -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(B2a) add_subdirectory(B2b) diff --git a/examples/basic/B2/History b/examples/basic/B2/History index 9c2e6e5cdf..de7028c259 100644 --- a/examples/basic/B2/History +++ b/examples/basic/B2/History @@ -14,6 +14,10 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +13-07-21 I. Hrivnacova (exampleB2-V10-07-02) +- Introduced namespace instead of a class names prefix +- Declare overriding functions 'override' (and removed 'virtual' keyword) + 31-05-21 I. Hrivnacova (exampleB2-V10-07-01) - Use nullptr instead of 0, NULL - Clean trailing whitespaces from all files diff --git a/examples/basic/B2/README b/examples/basic/B2/README deleted file mode 100644 index 0dd30dcd49..0000000000 --- a/examples/basic/B2/README +++ /dev/null @@ -1,205 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example B2 - ---------- - - This example simulates a simplified fixed target experiment. - - 1- GEOMETRY DEFINITION - - The setup consists of a target followed by six chambers of increasing - transverse size at defined instances from the target. These chambers are - located in a region called the Tracker region. - Their shape are cylinders, constructed as simple cylinders - (in B2aDetectorConstruction) and as parametrised volumes - (in B2bDetectorConstruction), see also B2bChamberParameterisation class. - - In addition, a global, uniform, and transverse magnetic field can be - applied using G4GlobalMagFieldMessenger, instantiated in - B2[a,b]DetectorConstruction::ConstructSDandField with a non zero field value, - or via interactive commands. - For example: - - /globalField/setValue 0.2 0 0 tesla - - An instance of the B2TrackerSD class is created and associated with each - logical chamber volume (in B2a) and with the one G4LogicalVolume associated - with G4PVParameterised (in B2b). - - One can change the materials of the target and the chambers - interactively via the commands defined in B2aDetectorMessenger - (or B2bDetectorMessenger). For example: - - /B2/det/setTargetMaterial G4_WATER - /B2/det/setChamberMaterial G4_Ar - - 2- PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set in the FTFP_BERT physics list. This physics list - requires data files for electromagnetic and hadronic processes. - See more on installation of the datasets in Geant4 Installation Guide, - Chapter 3.3: Note On Geant4 Datasets: - http://geant4.web.cern.ch/geant4/UserDocumentation/UsersGuides/InstallationGuide/html/ch03s03.html - The following datasets: G4LEDATA, G4LEVELGAMMADATA, G4SAIDXSDATA and - G4ENSDFSTATEDATA are mandatory for this example. - - In addition, the build-in interactive command: - /process/(in)activate processName - allows the user to activate/inactivate the processes one by one. - - 3- ACTION INITALIZATION - - A newly introduced class, B2ActionInitialization, - instantiates and registers to Geant4 kernel all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B2ActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance has is created also in the method - B2ActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - - 4- PRIMARY GENERATOR - - The primary generator action class employs the G4ParticleGun. - The primary kinematics consists of a single particle which starts at the world boundary - and hits the target perpendicular to the entrance face. The type of the particle - and its energy can be changed via the G4 built-in commands of - the G4ParticleGun class. - Note that this particular case of starting a primary particle on the world boundary - requires shooting in a direction towards inside the world. - - 5- RUNS and EVENTS - - A run is a set of events. - - The user has control: - - at Begin and End of each run (class B2RunAction) - - at Begin and End of each event (class B2EventAction) - - at Begin and End of each track (class TrackingAction, not used here) - - at End of each step (class SteppingAction, not used here) - - The event number is written to the log file every requested number - of events in B2EventAction::BeginOfEventAction() and - B2EventAction::EndOfEventAction(). - Moreover, for the first 100 events and every 100 events thereafter - information about the number of stored trajectories in the event - is printed as well as the number of hits stored in the G4VHitsCollection. - - The run number is printed at B2RunAction::BeginOfRunAction(), where the - G4RunManager is also informed how to SetRandomNumberStore for storing - initial random number seeds per run or per event. - - 6- USER LIMITS - - This example also illustrates how to introduce tracking constraints - like maximum step length, minimum kinetic energy etc. via the G4UserLimits - class and associated G4StepLimiter and G4UserSpecialCuts processes. - See B2aDetectorConstruction (or B2bDetectorConstruction). - - The maximum step limit in the tracker region can be set by the interactive - command (see B2aDetectorMessenger, B2bDetectorMessenger classes). - For example: - - /B2/det/stepMax 1.0 mm - - 7- DETECTOR RESPONSE - - A HIT is a step per step record of all the information needed to - simulate and analyse the detector response. - - In this example the Tracker chambers are considered to be the detector. - Therefore, the chambers are declared 'sensitive detectors' (SD) in - the B2aDetectorConstruction (or B2bDetectorConstruction) class. - They are associated with an instance of the B2TrackerSD class. - - Then, a Hit is defined as a set of 4 informations per step, inside - the chambers, namely: - - the track identifier (an integer), - - the chamber number, - - the total energy deposit in this step, and - - the position of the energy deposit. - - A given hit is an instance of the class B2TrackerHit which is created - during the tracking of a particle, step by step, in the method - B2TrackerSD::ProcessHits(). This hit is inserted in a HitsCollection. - - The HitsCollection is printed at the end of each event (via the method - B2TrackerSD::EndOfEvent()), under the control of the command: - /hits/verbose 2 - - The following paragraphs are common to all basic examples - - A- VISUALISATION - - The visualization manager is set via the G4VisExecutive class - in the main() function in exampleB2a.cc (or exampleB2b.cc). - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then - /vis/open DAWNFILE - then to get the same view - /vis/viewer/copyView viewer-0 - or to get the same view *plus* scene-modifications - /vis/viewer/set/all viewer-0 - then to see the result - /vis/viewer/flush - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example, - http://geant4.slac.stanford.edu/Presentations/vis/G4[VIS]Tutorial/G4[VIS]Tutorial.html - (where [VIS] can be replaced by DAWN, OpenGL and HepRApp) - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - - B- USER INTERFACES - - The user command interface is set via the G4UIExecutive class - in the main() function in exampleB2a.cc - The selection of the user command interface is then done automatically - according to the Geant4 configuration or it can be done explicitly via - the third argument of the G4UIExecutive constructor (see exampleB4a.cc). - - C- HOW TO RUN - - - Execute exampleB2a in the 'interactive mode' with visualization - % exampleB2a - and type in the commands from run1.mac line by line: - Idle> /tracking/verbose 1 - Idle> /run/beamOn 1 - Idle> ... - Idle> exit - or - Idle> /control/execute run1.mac or run2.mac - .... - Idle> exit - - - Execute exampleB2a in the 'batch' mode from macro files - (without visualization) - % exampleB2a run2.mac - % exampleB2a exampleB2.in > exampleB2.out - diff --git a/examples/basic/B3/.README.txt b/examples/basic/B3/.README.txt deleted file mode 100644 index 349bdb7cc3..0000000000 --- a/examples/basic/B3/.README.txt +++ /dev/null @@ -1,221 +0,0 @@ - -///\file "B3/.README.txt" -///\brief Example B3 README page - -/*! \page ExampleB3 Example B3 - - This example simulates schematically a Positron Emitted Tomography system. - -\section B3_s1 GEOMETRY DEFINITION - - The support of gamma detection are scintillating crystals. A small number - of such crystals are optically grouped in a matrix of crystals. In - this example, individual crystals are not described; only the matrix of - crystals is and it is still called 'Crystal' hereafter. - - Crystals are circularly arranged to form a ring. Few rings make up the full - detector (gamma camera). This is done by positionning Crystals in - Ring with an appropriate rotation matrix. Several copies of Ring are - then placed in the full detector. - - The head of a patient is schematised as a homogeneous cylinder of brain - tissue, placed at the center of full detector. - - The Crystal material, Lu2SiO5, is not included in the G4Nist database. - Therefore, it is explicitly built in DefineMaterials(). - -\section B3_s2 PHYSICS LIST - - The physics list contains standard electromagnetic processes and the - radioactiveDecay module for GenericIon. It is defined in the B3PhysicsList - class as a Geant4 modular physics list with registered physics builders - provided in Geant4: - - G4DecayPhysics - defines all particles and their decay processes - - G4RadioactiveDecayPhysics - defines radioactiveDecay for GenericIon - - G4EmStandardPhysics - defines all EM standard processes - - This physics list requires data files for: - - low energy electromagnetic processes which path is defined via - the G4LEDATA envirnoment variable - - data files for nuclides properties which path is defined via - the G4ENSDFSTATEDATA envirnoment variable - - radioactive decay hadronic processes which path is defined via - the G4RADIOACTIVEDATA envirnoment variable. - - See more on installation of the datasets in - - Geant4 Installation Guide, Chapter 3.3: Note On Geant4 Datasets . - -\section B3_s3 ACTION INITALIZATION - - B3aActionInitialization class (see also B3bActionInitialization) instantiates and registers to Geant4 kernel all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B3aActionInitialization::Build() - (see also B3bActionInitialization::Build) - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - B3aActionInitialization::BuildForMaster() - (see also B3bActionInitialization::Build) - which is invoked only in multi-threading mode. - -\section B3_s4 PRIMARY GENERATOR - - The default particle beam is an ion (F18), at rest, randomly distributed - within a zone inside a patient and is defined in - B3PrimaryGeneratorAction::GeneratePrimaries(). - The type of a primary particle can be changed with G4ParticleGun commands - (see run2.mac). - -\section B3_s5 DETECTOR RESPONSE : scorers - - A 'good' event is an event in which an identical energy of 511 keV is - deposited in two separate Crystals. A count of the number of such events - corresponds to a measure of the efficiency of the PET system. - The total dose deposited in a patient during a run is also computed. - - Scorers are defined in B3DetectorConstruction::ConstructSDandField(). There are - two G4MultiFunctionalDetector objects: one for the Crystal (EnergyDeposit), - and one for the Patient (DoseDeposit) - - The scorers hits are saved in form of ntuples in a Root file using Geant4 - analysis tools. This feature is activated in the main () function with instantiating - G4TScoreNtupleWriter. - - Two variants of accumulation event statistics in a run are demonstrated - in this example: - - B3a: - - At the end of event, the values acummulated in B3aEventAction are passed - in B3aRunAction and summed over the whole run (see B3aEventAction::EndOfevent()). - In multi-threading mode the data accumulated in G4Accumulable objects per - workers is merged to the master in B3aRunAction::EndOfRunAction() and the final - result is printed on the screen. - - G4Accumulable<> type instead of G4double and G4int types is used for the B3aRunAction - data members in order to facilitate merging of the values accumulated on workers - to the master. Currently the accumulables have to be registered to G4AccumulablesManager - and G4AccumulablesManager::Merge() has to be called from the users code. This is planned - to be further simplified with a closer integration of G4Accumulable classes in - the Geant4 kernel next year. - - B3b: - - B3bRun::RecordEvent(), called at end of event, collects informations - event per event from the hits collections, and accumulates statistic for - B3bRunAction::EndOfRunAction(). - In addition, results for dose are accumulated in a - standard floating-point summation and using a new lightweight statistical - class called G4StatAnalysis. The G4StatAnalysis class records four values: - (1) the sum, (2) sum^2, (3) number of entries, and (4) the number of entries - less than mean * machine-epsilon (the machine epsilon is the difference - between 1.0 and the next value representable by the floating-point type). - From these 4 values, G4StatAnalysis provides the mean, FOM, relative error, - standard deviation, variance, coefficient of variation, efficiency, r2int, - and r2eff. - - In multi-threading mode the statistics accumulated per workers is merged - to the master in B3bRun::Merge(). - -\section B3_s6 STACKING ACTION - - Beta decay of Fluor generates a neutrino. One wishes not to track this - neutrino; therefore one kills it immediately, before created particles - are put in a stack. - The function B3StackingAction::ClassifyNewTrack() is invoked by G4 kernel - each time a new particle is created. - -
      - -The following paragraphs are common to all basic examples - -\section B3_A VISUALISATION - - The visualization manager is set via the G4VisExecutive class - in the main () function in exampleB3.cc. - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then -\verbatim -/vis/open DAWNFILE -\endverbatim - then to get the same view -\verbatim -/vis/viewer/copyView viewer-0 -\endverbatim - or to get the same view *plus* scene-modifications -\verbatim -/vis/viewer/set/all viewer-0 -\endverbatim - then to see the result -\verbatim -/vis/viewer/flush -\endverbatim - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example,\n - - - OpenGL Tutorial - - - DAWN Tutorial - - - HepRApp Tutorial - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - -\section B3_B USER INTERFACES - - The user command interface is set via the G4UIExecutive class - in the main () function in exampleB3.cc - The selection of the user command interface is then done automatically - according to the Geant4 configuration or it can be done explicitly via - the third argument of the G4UIExecutive constructor (see exampleB4a.cc). - -\section B3_C HOW TO RUN - - - Execute exampleB3a in the 'interactive mode' with visualization -\verbatim -% ./exampleB3a -and type in the commands from run1.mac line by line: -Idle> /control/verbose 2 -Idle> /tracking/verbose 2 -Idle> /run/beamOn 1 -Idle> ... -Idle> exit -\endverbatim - or -\verbatim -Idle> /control/execute run1.mac -.... -Idle> exit -\endverbatim - - - Execute exampleB3a in the 'batch' mode from macro files - (without visualization) -\verbatim -% ./exampleB3a run2.mac -% ./exampleB3a exampleB3.in > exampleB3.out -\endverbatim - -*/ diff --git a/examples/basic/B3/B3a/CMakeLists.txt b/examples/basic/B3/B3a/CMakeLists.txt index 3013a44395..0cfe1c0c18 100644 --- a/examples/basic/B3/B3a/CMakeLists.txt +++ b/examples/basic/B3/B3a/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B3a) #---------------------------------------------------------------------------- diff --git a/examples/basic/B3/B3a/exampleB3a.cc b/examples/basic/B3/B3a/exampleB3a.cc index 38d171d990..69ca580a20 100644 --- a/examples/basic/B3/B3a/exampleB3a.cc +++ b/examples/basic/B3/B3a/exampleB3a.cc @@ -34,14 +34,14 @@ #include "G4UImanager.hh" #include "G4VisExecutive.hh" #include "G4UIExecutive.hh" +#include "G4AnalysisManager.hh" #include "G4TScoreNtupleWriter.hh" #include "Randomize.hh" -#include "B3DetectorConstruction.hh" -#include "B3PhysicsList.hh" -#include "B3aActionInitialization.hh" -#include "B3Analysis.hh" +#include "DetectorConstruction.hh" +#include "PhysicsList.hh" +#include "ActionInitialization.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -66,13 +66,13 @@ int main(int argc,char** argv) // Set mandatory initialization classes // - runManager->SetUserInitialization(new B3DetectorConstruction); + runManager->SetUserInitialization(new B3::DetectorConstruction); // - runManager->SetUserInitialization(new B3PhysicsList); + runManager->SetUserInitialization(new B3::PhysicsList); // Set user action initialization // - runManager->SetUserInitialization(new B3aActionInitialization()); + runManager->SetUserInitialization(new B3a::ActionInitialization()); // Initialize visualization // diff --git a/examples/basic/B3/B3a/exampleB3a.out b/examples/basic/B3/B3a/exampleB3a.out index 2c4acbda6a..59b72e1fcf 100644 --- a/examples/basic/B3/B3a/exampleB3a.out +++ b/examples/basic/B3/B3a/exampleB3a.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -27,10 +27,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -72,49 +70,49 @@ End of Run User Vis Actions: none Some /vis commands (optionally) take a string to specify colour. "/vis/list" to see available colours. -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume Detector (G4Tubs) ... OK! -Checking overlaps for volume Patient (G4Tubs) ... OK! +Checking overlaps for volume crystal:0 (G4Box) ... OK! +Checking overlaps for volume crystal:1 (G4Box) ... OK! +Checking overlaps for volume crystal:2 (G4Box) ... OK! +Checking overlaps for volume crystal:3 (G4Box) ... OK! +Checking overlaps for volume crystal:4 (G4Box) ... OK! +Checking overlaps for volume crystal:5 (G4Box) ... OK! +Checking overlaps for volume crystal:6 (G4Box) ... OK! +Checking overlaps for volume crystal:7 (G4Box) ... OK! +Checking overlaps for volume crystal:8 (G4Box) ... OK! +Checking overlaps for volume crystal:9 (G4Box) ... OK! +Checking overlaps for volume crystal:10 (G4Box) ... OK! +Checking overlaps for volume crystal:11 (G4Box) ... OK! +Checking overlaps for volume crystal:12 (G4Box) ... OK! +Checking overlaps for volume crystal:13 (G4Box) ... OK! +Checking overlaps for volume crystal:14 (G4Box) ... OK! +Checking overlaps for volume crystal:15 (G4Box) ... OK! +Checking overlaps for volume crystal:16 (G4Box) ... OK! +Checking overlaps for volume crystal:17 (G4Box) ... OK! +Checking overlaps for volume crystal:18 (G4Box) ... OK! +Checking overlaps for volume crystal:19 (G4Box) ... OK! +Checking overlaps for volume crystal:20 (G4Box) ... OK! +Checking overlaps for volume crystal:21 (G4Box) ... OK! +Checking overlaps for volume crystal:22 (G4Box) ... OK! +Checking overlaps for volume crystal:23 (G4Box) ... OK! +Checking overlaps for volume crystal:24 (G4Box) ... OK! +Checking overlaps for volume crystal:25 (G4Box) ... OK! +Checking overlaps for volume crystal:26 (G4Box) ... OK! +Checking overlaps for volume crystal:27 (G4Box) ... OK! +Checking overlaps for volume crystal:28 (G4Box) ... OK! +Checking overlaps for volume crystal:29 (G4Box) ... OK! +Checking overlaps for volume crystal:30 (G4Box) ... OK! +Checking overlaps for volume crystal:31 (G4Box) ... OK! +Checking overlaps for volume ring:0 (G4Tubs) ... OK! +Checking overlaps for volume ring:1 (G4Tubs) ... OK! +Checking overlaps for volume ring:2 (G4Tubs) ... OK! +Checking overlaps for volume ring:3 (G4Tubs) ... OK! +Checking overlaps for volume ring:4 (G4Tubs) ... OK! +Checking overlaps for volume ring:5 (G4Tubs) ... OK! +Checking overlaps for volume ring:6 (G4Tubs) ... OK! +Checking overlaps for volume ring:7 (G4Tubs) ... OK! +Checking overlaps for volume ring:8 (G4Tubs) ... OK! +Checking overlaps for volume Detector:0 (G4Tubs) ... OK! +Checking overlaps for volume Patient:0 (G4Tubs) ... OK! ***** Table : Nb of materials = 3 ***** @@ -222,6 +220,84 @@ G4SDManager::AddNewCollection : the collection is registered at 2 # /run/printProgress 1000 /run/beamOn 10000 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= +====== Atomic Deexcitation Parameters ======== +======================================================================= +Fluorescence enabled 1 +Fluorescence Bearden data files enabled 0 +Fluorescence ANSTO data files enabled 0 +Auger electron cascade enabled 1 +PIXE atomic de-excitation enabled 0 +De-excitation module ignores cuts 1 +Type of PIXE cross section for hadrons Empirical +Type of PIXE cross section for e+- Livermore +======================================================================= ### === Deexcitation model UAtomDeexcitation is activated for 1 region: DefaultRegionForTheWorld 1 1 0 @@ -231,28 +307,28 @@ G4SDManager::AddNewCollection : the collection is registered at 2 phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -262,25 +338,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -290,29 +366,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -320,31 +396,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -353,7 +429,7 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV ====================================================================== ====== Radioactive Decay Physics Parameters ======= @@ -365,15 +441,15 @@ Enable correlated gamma emission 0 Max 2J for sampling of angular correlations 10 Atomic de-excitation enabled 1 Auger electron emission enabled 1 -Auger cascade enabled 1 Check EM cuts disabled for atomic de-excitation 1 Use Bearden atomic level energies 0 +Use ANSTO fluorescence model 0 Threshold for very long decay time at rest 1e+27 ns ====================================================================== msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -381,12 +457,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -394,31 +470,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -426,31 +502,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -458,31 +534,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -490,32 +566,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -523,32 +599,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -556,31 +632,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -588,33 +664,35 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. ### Run 0 start. +... set ntuple merging row mode : row-wise - done ... create file : scoring.root - done ... open analysis file : scoring.root - done +... open analysis file : scoring.root - done --> Event 0 starts. --> Event 1000 starts. --> Event 2000 starts. @@ -627,8 +705,8 @@ See commands in /vis/modeling/trajectories/ for other options. --> Event 9000 starts. --------------------End of Global Run----------------------- - The run was 10000 events Nb of 'good' e+ annihilations: 1317 - Total dose in patient : 308.988 picoGy + The run was 10000 events Nb of 'good' e+ annihilations: 1264 + Total dose in patient : 307.747 picoGy ------------------------------------------------------------ ... write file : scoring.root - done diff --git a/examples/basic/B3/B3a/include/B3aActionInitialization.hh b/examples/basic/B3/B3a/include/ActionInitialization.hh similarity index 86% rename from examples/basic/B3/B3a/include/B3aActionInitialization.hh rename to examples/basic/B3/B3a/include/ActionInitialization.hh index 646cbbc81f..31413e58a0 100644 --- a/examples/basic/B3/B3a/include/B3aActionInitialization.hh +++ b/examples/basic/B3/B3a/include/ActionInitialization.hh @@ -24,32 +24,34 @@ // ******************************************************************** // // -/// \file B3aActionInitialization.hh -/// \brief Definition of the B3aActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the B3a::ActionInitialization class #ifndef B3aActionInitialization_h #define B3aActionInitialization_h 1 #include "G4VUserActionInitialization.hh" -/// Action initialization class. -/// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class B3aActionInitialization : public G4VUserActionInitialization +namespace B3a +{ + +/// Action initialization class. + +class ActionInitialization : public G4VUserActionInitialization { public: - B3aActionInitialization(); - virtual ~B3aActionInitialization(); + ActionInitialization(); + ~ActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; + void BuildForMaster() const override; + void Build() const override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - - diff --git a/examples/basic/B3/B3a/include/B3Analysis.hh b/examples/basic/B3/B3a/include/B3Analysis.hh deleted file mode 100644 index 16095dae27..0000000000 --- a/examples/basic/B3/B3a/include/B3Analysis.hh +++ /dev/null @@ -1,37 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file B3Analysis.hh -/// \brief Selection of the analysis technology - -#ifndef B3Analysis_h -#define B3Analysis_h 1 - -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" - -#endif diff --git a/examples/basic/B3/B3b/include/B3DetectorConstruction.hh b/examples/basic/B3/B3a/include/DetectorConstruction.hh similarity index 85% rename from examples/basic/B3/B3b/include/B3DetectorConstruction.hh rename to examples/basic/B3/B3a/include/DetectorConstruction.hh index aaf35721ef..05f16a3963 100644 --- a/examples/basic/B3/B3b/include/B3DetectorConstruction.hh +++ b/examples/basic/B3/B3a/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3DetectorConstruction.hh -/// \brief Definition of the B3DetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the B3::DetectorConstruction class #ifndef B3DetectorConstruction_h #define B3DetectorConstruction_h 1 @@ -36,27 +36,32 @@ class G4VPhysicalVolume; class G4LogicalVolume; +namespace B3 +{ + /// Detector construction class to define materials and geometry. /// /// Crystals are positioned in Ring, with an appropriate rotation matrix. /// Several copies of Ring are placed in the full detector. -class B3DetectorConstruction : public G4VUserDetectorConstruction +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B3DetectorConstruction(); - virtual ~B3DetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; public: - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; private: void DefineMaterials(); - G4bool fCheckOverlaps; + G4bool fCheckOverlaps = true; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3a/include/B3aEventAction.hh b/examples/basic/B3/B3a/include/EventAction.hh similarity index 81% rename from examples/basic/B3/B3a/include/B3aEventAction.hh rename to examples/basic/B3/B3a/include/EventAction.hh index 9bbd3be0a7..92f998e17a 100644 --- a/examples/basic/B3/B3a/include/B3aEventAction.hh +++ b/examples/basic/B3/B3a/include/EventAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3aEventAction.hh -/// \brief Definition of the B3aEventAction class +/// \file EventAction.hh +/// \brief Definition of the B3a::EventAction class #ifndef B3aEventAction_h #define B3aEventAction_h 1 @@ -33,29 +33,34 @@ #include "G4UserEventAction.hh" #include "globals.hh" -class B3aRunAction; +namespace B3a +{ + +class RunAction; /// Event action class /// /// In EndOfEventAction() there is collected information event per event /// from Hits Collections, and accumulated statistic for -/// B3RunAction::EndOfRunAction(). +/// RunAction::EndOfRunAction(). -class B3aEventAction : public G4UserEventAction +class EventAction : public G4UserEventAction { public: - B3aEventAction(B3aRunAction* runAction); - virtual ~B3aEventAction(); + EventAction(RunAction* runAction); + ~EventAction() override; - virtual void BeginOfEventAction(const G4Event*); - virtual void EndOfEventAction(const G4Event*); + void BeginOfEventAction(const G4Event*) override; + void EndOfEventAction(const G4Event*) override; private: - B3aRunAction* fRunAction; - G4int fCollID_cryst; - G4int fCollID_patient; + RunAction* fRunAction = nullptr; + G4int fCollID_cryst = -1; + G4int fCollID_patient = -1; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3b/include/B3PhysicsList.hh b/examples/basic/B3/B3a/include/PhysicsList.hh similarity index 90% rename from examples/basic/B3/B3b/include/B3PhysicsList.hh rename to examples/basic/B3/B3a/include/PhysicsList.hh index 49f4fe18b3..30075efe26 100644 --- a/examples/basic/B3/B3b/include/B3PhysicsList.hh +++ b/examples/basic/B3/B3a/include/PhysicsList.hh @@ -24,14 +24,17 @@ // ******************************************************************** // // -/// \file B3PhysicsList.hh -/// \brief Definition of the B3PhysicsList class +/// \file PhysicsList.hh +/// \brief Definition of the B3::PhysicsList class #ifndef B3PhysicsList_h #define B3PhysicsList_h 1 #include "G4VModularPhysicsList.hh" +namespace B3 +{ + /// Modular physics list /// /// It includes the folowing physics builders @@ -39,15 +42,17 @@ /// - G4RadioactiveDecayPhysics /// - G4EmStandardPhysics -class B3PhysicsList: public G4VModularPhysicsList +class PhysicsList: public G4VModularPhysicsList { public: - B3PhysicsList(); - virtual ~B3PhysicsList(); + PhysicsList(); + ~PhysicsList() override; - virtual void SetCuts(); + void SetCuts() override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3b/include/B3PrimaryGeneratorAction.hh b/examples/basic/B3/B3a/include/PrimaryGeneratorAction.hh similarity index 87% rename from examples/basic/B3/B3b/include/B3PrimaryGeneratorAction.hh rename to examples/basic/B3/B3a/include/PrimaryGeneratorAction.hh index 6c59975259..b0439f8440 100644 --- a/examples/basic/B3/B3b/include/B3PrimaryGeneratorAction.hh +++ b/examples/basic/B3/B3a/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3PrimaryGeneratorAction.hh -/// \brief Definition of the B3PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the B3::PrimaryGeneratorAction class #ifndef B3PrimaryGeneratorAction_h #define B3PrimaryGeneratorAction_h 1 @@ -37,26 +37,31 @@ class G4ParticleGun; class G4Event; +namespace B3 +{ + /// The primary generator action class with particle gum. /// /// It defines an ion (F18), at rest, randomly distribued within a zone /// in a patient defined in GeneratePrimaries(). Ion F18 can be changed /// with the G4ParticleGun commands (see run2.mac). -class B3PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B3PrimaryGeneratorAction(); - virtual ~B3PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event*); + void GeneratePrimaries(G4Event*) override; const G4ParticleGun* GetParticleGun() const { return fParticleGun; } private: - G4ParticleGun* fParticleGun; + G4ParticleGun* fParticleGun = nullptr; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3a/include/B3aRunAction.hh b/examples/basic/B3/B3a/include/RunAction.hh similarity index 84% rename from examples/basic/B3/B3a/include/B3aRunAction.hh rename to examples/basic/B3/B3a/include/RunAction.hh index 61449bd348..016b42508a 100644 --- a/examples/basic/B3/B3a/include/B3aRunAction.hh +++ b/examples/basic/B3/B3a/include/RunAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3aRunAction.hh -/// \brief Definition of the B3aRunAction class +/// \file RunAction.hh +/// \brief Definition of the B3a::RunAction class #ifndef B3aRunAction_h #define B3aRunAction_h 1 @@ -34,25 +34,30 @@ #include "G4Accumulable.hh" #include "globals.hh" +namespace B3a +{ + /// Run action class -class B3aRunAction : public G4UserRunAction +class RunAction : public G4UserRunAction { public: - B3aRunAction(); - virtual ~B3aRunAction(); + RunAction(); + ~RunAction() override; - virtual void BeginOfRunAction(const G4Run*); - virtual void EndOfRunAction(const G4Run*); + void BeginOfRunAction(const G4Run*) override; + void EndOfRunAction(const G4Run*) override; void CountEvent() { fGoodEvents += 1; }; void SumDose(G4double dose) { fSumDose += dose; }; private: - G4Accumulable fGoodEvents; - G4Accumulable fSumDose; + G4Accumulable fGoodEvents = 0; + G4Accumulable fSumDose = 0.; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3a/include/B3StackingAction.hh b/examples/basic/B3/B3a/include/StackingAction.hh similarity index 88% rename from examples/basic/B3/B3a/include/B3StackingAction.hh rename to examples/basic/B3/B3a/include/StackingAction.hh index df377ddabf..4a62c579db 100644 --- a/examples/basic/B3/B3a/include/B3StackingAction.hh +++ b/examples/basic/B3/B3a/include/StackingAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3StackingAction.hh -/// \brief Definition of the B3StackingAction class +/// \file StackingAction.hh +/// \brief Definition of the B3::StackingAction class #ifndef B3StackingAction_h #define B3StackingAction_h 1 @@ -33,20 +33,25 @@ #include "G4UserStackingAction.hh" #include "globals.hh" +namespace B3 +{ + /// Stacking action class : manage the newly generated particles /// /// One wishes do not track secondary neutrino.Therefore one kills it /// immediately, before created particles will put in a stack. -class B3StackingAction : public G4UserStackingAction +class StackingAction : public G4UserStackingAction { public: - B3StackingAction(); - virtual ~B3StackingAction(); + StackingAction(); + ~StackingAction() override; - virtual G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track*); + G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track*) override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3a/src/ActionInitialization.cc b/examples/basic/B3/B3a/src/ActionInitialization.cc new file mode 100644 index 0000000000..e892c8222e --- /dev/null +++ b/examples/basic/B3/B3a/src/ActionInitialization.cc @@ -0,0 +1,73 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +/// \file ActionInitialization.cc +/// \brief Implementation of the B3a::ActionInitialization class + +#include "ActionInitialization.hh" +#include "RunAction.hh" +#include "EventAction.hh" +#include "PrimaryGeneratorAction.hh" +#include "StackingAction.hh" + +using namespace B3; + +namespace B3a +{ + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::~ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::BuildForMaster() const +{ + SetUserAction(new RunAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::Build() const +{ + RunAction* runAction = new RunAction(); + SetUserAction(runAction); + + SetUserAction(new EventAction(runAction)); + SetUserAction(new PrimaryGeneratorAction); + SetUserAction(new StackingAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/B3a/src/B3DetectorConstruction.cc b/examples/basic/B3/B3a/src/DetectorConstruction.cc similarity index 95% rename from examples/basic/B3/B3a/src/B3DetectorConstruction.cc rename to examples/basic/B3/B3a/src/DetectorConstruction.cc index 008cff0a37..317f905f37 100644 --- a/examples/basic/B3/B3a/src/B3DetectorConstruction.cc +++ b/examples/basic/B3/B3a/src/DetectorConstruction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B3DetectorConstruction.cc -/// \brief Implementation of the B3DetectorConstruction class +/// \file DetectorConstruction.cc +/// \brief Implementation of the B3::DetectorConstruction class -#include "B3DetectorConstruction.hh" +#include "DetectorConstruction.hh" #include "G4NistManager.hh" #include "G4Box.hh" @@ -45,23 +45,24 @@ #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" +namespace B3 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3DetectorConstruction::B3DetectorConstruction() -: G4VUserDetectorConstruction(), - fCheckOverlaps(true) +DetectorConstruction::DetectorConstruction() { DefineMaterials(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3DetectorConstruction::~B3DetectorConstruction() +DetectorConstruction::~DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3DetectorConstruction::DefineMaterials() +void DetectorConstruction::DefineMaterials() { G4NistManager* man = G4NistManager::Instance(); @@ -79,7 +80,7 @@ void B3DetectorConstruction::DefineMaterials() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B3DetectorConstruction::Construct() +G4VPhysicalVolume* DetectorConstruction::Construct() { // Gamma detector Parameters // @@ -249,7 +250,7 @@ G4VPhysicalVolume* B3DetectorConstruction::Construct() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3DetectorConstruction::ConstructSDandField() +void DetectorConstruction::ConstructSDandField() { G4SDManager::GetSDMpointer()->SetVerboseLevel(1); @@ -271,3 +272,6 @@ void B3DetectorConstruction::ConstructSDandField() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/B3a/src/B3aEventAction.cc b/examples/basic/B3/B3a/src/EventAction.cc similarity index 88% rename from examples/basic/B3/B3a/src/B3aEventAction.cc rename to examples/basic/B3/B3a/src/EventAction.cc index 9aa4fdda8e..3fd6d96cab 100644 --- a/examples/basic/B3/B3a/src/B3aEventAction.cc +++ b/examples/basic/B3/B3a/src/EventAction.cc @@ -24,11 +24,11 @@ // ******************************************************************** // // -/// \file B3aEventAction.cc -/// \brief Implementation of the B3aEventAction class +/// \file EventAction.cc +/// \brief Implementation of the B3a::EventAction class -#include "B3aEventAction.hh" -#include "B3aRunAction.hh" +#include "EventAction.hh" +#include "RunAction.hh" #include "G4RunManager.hh" #include "G4Event.hh" @@ -39,28 +39,28 @@ #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +namespace B3a +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3aEventAction::B3aEventAction(B3aRunAction* runAction) - : G4UserEventAction(), - fRunAction(runAction), - fCollID_cryst(-1), - fCollID_patient(-1) +EventAction::EventAction(RunAction* runAction) + : fRunAction(runAction) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3aEventAction::~B3aEventAction() +EventAction::~EventAction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3aEventAction::BeginOfEventAction(const G4Event* /*evt*/) +void EventAction::BeginOfEventAction(const G4Event* /*evt*/) { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3aEventAction::EndOfEventAction(const G4Event* evt ) +void EventAction::EndOfEventAction(const G4Event* evt ) { //Hits collections // @@ -105,3 +105,6 @@ void B3aEventAction::EndOfEventAction(const G4Event* evt ) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/B3a/src/B3PhysicsList.cc b/examples/basic/B3/B3a/src/PhysicsList.cc similarity index 88% rename from examples/basic/B3/B3a/src/B3PhysicsList.cc rename to examples/basic/B3/B3a/src/PhysicsList.cc index 3c92555bb1..c3070f8470 100644 --- a/examples/basic/B3/B3a/src/B3PhysicsList.cc +++ b/examples/basic/B3/B3a/src/PhysicsList.cc @@ -24,19 +24,22 @@ // ******************************************************************** // // -/// \file B3PhysicsList.cc -/// \brief Implementation of the B3PhysicsList class +/// \file PhysicsList.cc +/// \brief Implementation of the B3::PhysicsList class -#include "B3PhysicsList.hh" +#include "PhysicsList.hh" #include "G4DecayPhysics.hh" #include "G4EmStandardPhysics.hh" #include "G4RadioactiveDecayPhysics.hh" +namespace B3 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3PhysicsList::B3PhysicsList() -: G4VModularPhysicsList(){ +PhysicsList::PhysicsList() +{ SetVerboseLevel(1); // Default physics @@ -51,13 +54,17 @@ B3PhysicsList::B3PhysicsList() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3PhysicsList::~B3PhysicsList() +PhysicsList::~PhysicsList() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3PhysicsList::SetCuts() +void PhysicsList::SetCuts() { G4VUserPhysicsList::SetCuts(); } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B3/B3b/src/B3PrimaryGeneratorAction.cc b/examples/basic/B3/B3a/src/PrimaryGeneratorAction.cc similarity index 90% rename from examples/basic/B3/B3b/src/B3PrimaryGeneratorAction.cc rename to examples/basic/B3/B3a/src/PrimaryGeneratorAction.cc index eb8d0f9963..e7f9b1dba4 100644 --- a/examples/basic/B3/B3b/src/B3PrimaryGeneratorAction.cc +++ b/examples/basic/B3/B3a/src/PrimaryGeneratorAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B3PrimaryGeneratorAction.cc -/// \brief Implementation of the B3PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the B3::PrimaryGeneratorAction class -#include "B3PrimaryGeneratorAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4RunManager.hh" #include "G4Event.hh" @@ -39,11 +39,12 @@ #include "G4SystemOfUnits.hh" #include "Randomize.hh" +namespace B3 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3PrimaryGeneratorAction::B3PrimaryGeneratorAction() - : G4VUserPrimaryGeneratorAction(), - fParticleGun(nullptr) +PrimaryGeneratorAction::PrimaryGeneratorAction() { G4int n_particle = 1; fParticleGun = new G4ParticleGun(n_particle); @@ -61,14 +62,14 @@ B3PrimaryGeneratorAction::B3PrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3PrimaryGeneratorAction::~B3PrimaryGeneratorAction() +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { G4ParticleDefinition* particle = fParticleGun->GetParticleDefinition(); if (particle == G4ChargedGeantino::ChargedGeantino()) { @@ -101,3 +102,6 @@ void B3PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} + + diff --git a/examples/basic/B3/B3a/src/B3aRunAction.cc b/examples/basic/B3/B3a/src/RunAction.cc similarity index 90% rename from examples/basic/B3/B3a/src/B3aRunAction.cc rename to examples/basic/B3/B3a/src/RunAction.cc index 54329cc7c9..17eefca023 100644 --- a/examples/basic/B3/B3a/src/B3aRunAction.cc +++ b/examples/basic/B3/B3a/src/RunAction.cc @@ -24,11 +24,11 @@ // ******************************************************************** // // -/// \file B3aRunAction.cc -/// \brief Implementation of the B3aRunAction class +/// \file RunAction.cc +/// \brief Implementation of the B3a::RunAction class -#include "B3aRunAction.hh" -#include "B3PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4RunManager.hh" #include "G4Run.hh" @@ -36,12 +36,14 @@ #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +using namespace B3; + +namespace B3a +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3aRunAction::B3aRunAction() - : G4UserRunAction(), - fGoodEvents(0), - fSumDose(0.) +RunAction::RunAction() { //add new units for dose // @@ -63,12 +65,12 @@ B3aRunAction::B3aRunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3aRunAction::~B3aRunAction() +RunAction::~RunAction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3aRunAction::BeginOfRunAction(const G4Run* run) +void RunAction::BeginOfRunAction(const G4Run* run) { G4cout << "### Run " << run->GetRunID() << " start." << G4endl; @@ -82,7 +84,7 @@ void B3aRunAction::BeginOfRunAction(const G4Run* run) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3aRunAction::EndOfRunAction(const G4Run* run) +void RunAction::EndOfRunAction(const G4Run* run) { G4int nofEvents = run->GetNumberOfEvent(); if (nofEvents == 0) return; @@ -94,8 +96,8 @@ void B3aRunAction::EndOfRunAction(const G4Run* run) // Run conditions // note: There is no primary generator action object for "master" // run manager for multi-threaded mode. - const B3PrimaryGeneratorAction* generatorAction - = static_cast( + const PrimaryGeneratorAction* generatorAction + = static_cast( G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction()); G4String partName; if (generatorAction) @@ -132,3 +134,6 @@ void B3aRunAction::EndOfRunAction(const G4Run* run) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/B3b/src/B3StackingAction.cc b/examples/basic/B3/B3a/src/StackingAction.cc similarity index 89% rename from examples/basic/B3/B3b/src/B3StackingAction.cc rename to examples/basic/B3/B3a/src/StackingAction.cc index 0e4b60214d..53bc9fb404 100644 --- a/examples/basic/B3/B3b/src/B3StackingAction.cc +++ b/examples/basic/B3/B3a/src/StackingAction.cc @@ -24,28 +24,31 @@ // ******************************************************************** // // -/// \file B3StackingAction.cc -/// \brief Implementation of the B3StackingAction class +/// \file StackingAction.cc +/// \brief Implementation of the B3::StackingAction class -#include "B3StackingAction.hh" +#include "StackingAction.hh" #include "G4Track.hh" #include "G4NeutrinoE.hh" +namespace B3 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3StackingAction::B3StackingAction() +StackingAction::StackingAction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3StackingAction::~B3StackingAction() +StackingAction::~StackingAction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ClassificationOfNewTrack -B3StackingAction::ClassifyNewTrack(const G4Track* track) +StackingAction::ClassifyNewTrack(const G4Track* track) { //keep primary particle if (track->GetParentID() == 0) return fUrgent; @@ -56,3 +59,6 @@ B3StackingAction::ClassifyNewTrack(const G4Track* track) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/B3b/CMakeLists.txt b/examples/basic/B3/B3b/CMakeLists.txt index 539595089b..fed46cab15 100644 --- a/examples/basic/B3/B3b/CMakeLists.txt +++ b/examples/basic/B3/B3b/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B3b) #---------------------------------------------------------------------------- diff --git a/examples/basic/B3/B3b/exampleB3b.cc b/examples/basic/B3/B3b/exampleB3b.cc index 978e4489f1..d7e2f9c9e3 100644 --- a/examples/basic/B3/B3b/exampleB3b.cc +++ b/examples/basic/B3/B3b/exampleB3b.cc @@ -34,14 +34,14 @@ #include "G4UImanager.hh" #include "G4VisExecutive.hh" #include "G4UIExecutive.hh" +#include "G4AnalysisManager.hh" #include "G4TScoreNtupleWriter.hh" #include "Randomize.hh" -#include "B3DetectorConstruction.hh" -#include "B3PhysicsList.hh" -#include "B3bActionInitialization.hh" -#include "B3Analysis.hh" +#include "DetectorConstruction.hh" +#include "PhysicsList.hh" +#include "ActionInitialization.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -66,13 +66,13 @@ int main(int argc,char** argv) // Set mandatory initialization classes // - runManager->SetUserInitialization(new B3DetectorConstruction); + runManager->SetUserInitialization(new B3::DetectorConstruction); // - runManager->SetUserInitialization(new B3PhysicsList); + runManager->SetUserInitialization(new B3::PhysicsList); // Set user action initialization // - runManager->SetUserInitialization(new B3bActionInitialization()); + runManager->SetUserInitialization(new B3b::ActionInitialization()); // Initialize visualization // @@ -85,11 +85,12 @@ int main(int argc,char** argv) G4UImanager* UImanager = G4UImanager::GetUIpointer(); // Activate score ntuple writer - // The Root output type (Root) is selected in B3Analysis.hh. // The verbose level can be also set via UI commands // /score/ntuple/writerVerbose level G4TScoreNtupleWriter scoreNtupleWriter; scoreNtupleWriter.SetVerboseLevel(1); + // The default file type ("root") can be changed in xml, csv, hdf5 + // scoreNtupleWriter.SetDefaultFileType("xml"); // Process macro or start UI session // diff --git a/examples/basic/B3/B3b/exampleB3b.out b/examples/basic/B3/B3b/exampleB3b.out index a1f9c53efa..8eba57fb2f 100644 --- a/examples/basic/B3/B3b/exampleB3b.out +++ b/examples/basic/B3/B3b/exampleB3b.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -27,10 +27,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -72,49 +70,49 @@ End of Run User Vis Actions: none Some /vis commands (optionally) take a string to specify colour. "/vis/list" to see available colours. -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume crystal (G4Box) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume ring (G4Tubs) ... OK! -Checking overlaps for volume Detector (G4Tubs) ... OK! -Checking overlaps for volume Patient (G4Tubs) ... OK! +Checking overlaps for volume crystal:0 (G4Box) ... OK! +Checking overlaps for volume crystal:1 (G4Box) ... OK! +Checking overlaps for volume crystal:2 (G4Box) ... OK! +Checking overlaps for volume crystal:3 (G4Box) ... OK! +Checking overlaps for volume crystal:4 (G4Box) ... OK! +Checking overlaps for volume crystal:5 (G4Box) ... OK! +Checking overlaps for volume crystal:6 (G4Box) ... OK! +Checking overlaps for volume crystal:7 (G4Box) ... OK! +Checking overlaps for volume crystal:8 (G4Box) ... OK! +Checking overlaps for volume crystal:9 (G4Box) ... OK! +Checking overlaps for volume crystal:10 (G4Box) ... OK! +Checking overlaps for volume crystal:11 (G4Box) ... OK! +Checking overlaps for volume crystal:12 (G4Box) ... OK! +Checking overlaps for volume crystal:13 (G4Box) ... OK! +Checking overlaps for volume crystal:14 (G4Box) ... OK! +Checking overlaps for volume crystal:15 (G4Box) ... OK! +Checking overlaps for volume crystal:16 (G4Box) ... OK! +Checking overlaps for volume crystal:17 (G4Box) ... OK! +Checking overlaps for volume crystal:18 (G4Box) ... OK! +Checking overlaps for volume crystal:19 (G4Box) ... OK! +Checking overlaps for volume crystal:20 (G4Box) ... OK! +Checking overlaps for volume crystal:21 (G4Box) ... OK! +Checking overlaps for volume crystal:22 (G4Box) ... OK! +Checking overlaps for volume crystal:23 (G4Box) ... OK! +Checking overlaps for volume crystal:24 (G4Box) ... OK! +Checking overlaps for volume crystal:25 (G4Box) ... OK! +Checking overlaps for volume crystal:26 (G4Box) ... OK! +Checking overlaps for volume crystal:27 (G4Box) ... OK! +Checking overlaps for volume crystal:28 (G4Box) ... OK! +Checking overlaps for volume crystal:29 (G4Box) ... OK! +Checking overlaps for volume crystal:30 (G4Box) ... OK! +Checking overlaps for volume crystal:31 (G4Box) ... OK! +Checking overlaps for volume ring:0 (G4Tubs) ... OK! +Checking overlaps for volume ring:1 (G4Tubs) ... OK! +Checking overlaps for volume ring:2 (G4Tubs) ... OK! +Checking overlaps for volume ring:3 (G4Tubs) ... OK! +Checking overlaps for volume ring:4 (G4Tubs) ... OK! +Checking overlaps for volume ring:5 (G4Tubs) ... OK! +Checking overlaps for volume ring:6 (G4Tubs) ... OK! +Checking overlaps for volume ring:7 (G4Tubs) ... OK! +Checking overlaps for volume ring:8 (G4Tubs) ... OK! +Checking overlaps for volume Detector:0 (G4Tubs) ... OK! +Checking overlaps for volume Patient:0 (G4Tubs) ... OK! ***** Table : Nb of materials = 3 ***** @@ -222,6 +220,84 @@ G4SDManager::AddNewCollection : the collection is registered at 2 # /run/printProgress 1000 /run/beamOn 10000 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= +====== Atomic Deexcitation Parameters ======== +======================================================================= +Fluorescence enabled 1 +Fluorescence Bearden data files enabled 0 +Fluorescence ANSTO data files enabled 0 +Auger electron cascade enabled 1 +PIXE atomic de-excitation enabled 0 +De-excitation module ignores cuts 1 +Type of PIXE cross section for hadrons Empirical +Type of PIXE cross section for e+- Livermore +======================================================================= ### === Deexcitation model UAtomDeexcitation is activated for 1 region: DefaultRegionForTheWorld 1 1 0 @@ -231,28 +307,28 @@ G4SDManager::AddNewCollection : the collection is registered at 2 phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -262,25 +338,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -290,29 +366,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -320,31 +396,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -353,7 +429,7 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV ====================================================================== ====== Radioactive Decay Physics Parameters ======= @@ -365,15 +441,15 @@ Enable correlated gamma emission 0 Max 2J for sampling of angular correlations 10 Atomic de-excitation enabled 1 Auger electron emission enabled 1 -Auger cascade enabled 1 Check EM cuts disabled for atomic de-excitation 1 Use Bearden atomic level energies 0 +Use ANSTO fluorescence model 0 Threshold for very long decay time at rest 1e+27 ns ====================================================================== msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -381,12 +457,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -394,31 +470,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -426,31 +502,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -458,31 +534,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -490,32 +566,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -523,32 +599,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -556,31 +632,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -588,33 +664,35 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. ### Run 0 start. +... set ntuple merging row mode : row-wise - done ... create file : scoring.root - done ... open analysis file : scoring.root - done +... open analysis file : scoring.root - done --> Event 0 starts. ---> end of event: 0 @@ -629,9 +707,9 @@ See commands in /vis/modeling/trajectories/ for other options. --> Event 9000 starts. --------------------End of Global Run----------------------- - The run was 10000 events Nb of 'good' e+ annihilations: 1317 - Total dose in patient : 308.988 picoGy - Total dose in patient : 3.08988e-10 [sigma: 1.7578e-14 | error: 0.00568889 | coeff: 0.00568889 | eff: 1 | fom: 30899 | r2int: 3.23603e-05 | r2eff: 0 | hits: 10000 ] Gy + The run was 10000 events Nb of 'good' e+ annihilations: 1264 + Total dose in patient : 307.747 picoGy + Total dose in patient : 3.07747e-10 [sigma: 1.75577e-14 | error: 0.00570523 | coeff: 0.00570523 | eff: 1 | fom: 30722.3 | r2int: 3.25463e-05 | r2eff: 0 | hits: 10000 ] Gy ------------------------------------------------------------ ... write file : scoring.root - done diff --git a/examples/basic/B3/B3b/include/B3bActionInitialization.hh b/examples/basic/B3/B3b/include/ActionInitialization.hh similarity index 86% rename from examples/basic/B3/B3b/include/B3bActionInitialization.hh rename to examples/basic/B3/B3b/include/ActionInitialization.hh index 6c00b82947..394696a278 100644 --- a/examples/basic/B3/B3b/include/B3bActionInitialization.hh +++ b/examples/basic/B3/B3b/include/ActionInitialization.hh @@ -24,30 +24,34 @@ // ******************************************************************** // // -/// \file B3bActionInitialization.hh -/// \brief Definition of the B3bActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the B3b::ActionInitialization class #ifndef B3bActionInitialization_h #define B3bActionInitialization_h 1 #include "G4VUserActionInitialization.hh" -/// Action initialization class. -/// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class B3bActionInitialization : public G4VUserActionInitialization +namespace B3b +{ + +/// Action initialization class. + +class ActionInitialization : public G4VUserActionInitialization { public: - B3bActionInitialization(); - virtual ~B3bActionInitialization(); + ActionInitialization(); + ~ActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; + void BuildForMaster() const override; + void Build() const override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3a/include/B3DetectorConstruction.hh b/examples/basic/B3/B3b/include/DetectorConstruction.hh similarity index 85% rename from examples/basic/B3/B3a/include/B3DetectorConstruction.hh rename to examples/basic/B3/B3b/include/DetectorConstruction.hh index aaf35721ef..05f16a3963 100644 --- a/examples/basic/B3/B3a/include/B3DetectorConstruction.hh +++ b/examples/basic/B3/B3b/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3DetectorConstruction.hh -/// \brief Definition of the B3DetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the B3::DetectorConstruction class #ifndef B3DetectorConstruction_h #define B3DetectorConstruction_h 1 @@ -36,27 +36,32 @@ class G4VPhysicalVolume; class G4LogicalVolume; +namespace B3 +{ + /// Detector construction class to define materials and geometry. /// /// Crystals are positioned in Ring, with an appropriate rotation matrix. /// Several copies of Ring are placed in the full detector. -class B3DetectorConstruction : public G4VUserDetectorConstruction +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B3DetectorConstruction(); - virtual ~B3DetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; public: - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; private: void DefineMaterials(); - G4bool fCheckOverlaps; + G4bool fCheckOverlaps = true; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3a/include/B3PhysicsList.hh b/examples/basic/B3/B3b/include/PhysicsList.hh similarity index 90% rename from examples/basic/B3/B3a/include/B3PhysicsList.hh rename to examples/basic/B3/B3b/include/PhysicsList.hh index 49f4fe18b3..30075efe26 100644 --- a/examples/basic/B3/B3a/include/B3PhysicsList.hh +++ b/examples/basic/B3/B3b/include/PhysicsList.hh @@ -24,14 +24,17 @@ // ******************************************************************** // // -/// \file B3PhysicsList.hh -/// \brief Definition of the B3PhysicsList class +/// \file PhysicsList.hh +/// \brief Definition of the B3::PhysicsList class #ifndef B3PhysicsList_h #define B3PhysicsList_h 1 #include "G4VModularPhysicsList.hh" +namespace B3 +{ + /// Modular physics list /// /// It includes the folowing physics builders @@ -39,15 +42,17 @@ /// - G4RadioactiveDecayPhysics /// - G4EmStandardPhysics -class B3PhysicsList: public G4VModularPhysicsList +class PhysicsList: public G4VModularPhysicsList { public: - B3PhysicsList(); - virtual ~B3PhysicsList(); + PhysicsList(); + ~PhysicsList() override; - virtual void SetCuts(); + void SetCuts() override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3a/include/B3PrimaryGeneratorAction.hh b/examples/basic/B3/B3b/include/PrimaryGeneratorAction.hh similarity index 87% rename from examples/basic/B3/B3a/include/B3PrimaryGeneratorAction.hh rename to examples/basic/B3/B3b/include/PrimaryGeneratorAction.hh index 6c59975259..b0439f8440 100644 --- a/examples/basic/B3/B3a/include/B3PrimaryGeneratorAction.hh +++ b/examples/basic/B3/B3b/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3PrimaryGeneratorAction.hh -/// \brief Definition of the B3PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the B3::PrimaryGeneratorAction class #ifndef B3PrimaryGeneratorAction_h #define B3PrimaryGeneratorAction_h 1 @@ -37,26 +37,31 @@ class G4ParticleGun; class G4Event; +namespace B3 +{ + /// The primary generator action class with particle gum. /// /// It defines an ion (F18), at rest, randomly distribued within a zone /// in a patient defined in GeneratePrimaries(). Ion F18 can be changed /// with the G4ParticleGun commands (see run2.mac). -class B3PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B3PrimaryGeneratorAction(); - virtual ~B3PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event*); + void GeneratePrimaries(G4Event*) override; const G4ParticleGun* GetParticleGun() const { return fParticleGun; } private: - G4ParticleGun* fParticleGun; + G4ParticleGun* fParticleGun = nullptr; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3b/include/B3bRun.hh b/examples/basic/B3/B3b/include/Run.hh similarity index 85% rename from examples/basic/B3/B3b/include/B3bRun.hh rename to examples/basic/B3/B3b/include/Run.hh index 7d4753fea8..3ab6e4e034 100644 --- a/examples/basic/B3/B3b/include/B3bRun.hh +++ b/examples/basic/B3/B3b/include/Run.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3bRun.hh -/// \brief Definition of the B3bRun class +/// \file Run.hh +/// \brief Definition of the B3b::Run class #ifndef B3bRun_h #define B3bRun_h 1 @@ -34,19 +34,22 @@ #include "globals.hh" #include "G4StatAnalysis.hh" +namespace B3b +{ + /// Run class /// /// In RecordEvent() there is collected information event per event /// from Hits Collections, and accumulated statistic for the run -class B3bRun : public G4Run +class Run : public G4Run { public: - B3bRun(); - virtual ~B3bRun(); + Run(); + ~Run() override; - virtual void RecordEvent(const G4Event*); - virtual void Merge(const G4Run*); + void RecordEvent(const G4Event*) override; + void Merge(const G4Run*) override; public: G4int GetNbGoodEvents() const { return fGoodEvents; } @@ -54,14 +57,16 @@ class B3bRun : public G4Run G4StatAnalysis GetStatDose() const { return fStatDose; } private: - G4int fCollID_cryst; - G4int fCollID_patient; - G4int fPrintModulo; - G4int fGoodEvents; - G4double fSumDose; + G4int fCollID_cryst = -1; + G4int fCollID_patient = -1; + G4int fPrintModulo = 10000; + G4int fGoodEvents = 0; + G4double fSumDose = 0.; G4StatAnalysis fStatDose; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3b/include/B3bRunAction.hh b/examples/basic/B3/B3b/include/RunAction.hh similarity index 85% rename from examples/basic/B3/B3b/include/B3bRunAction.hh rename to examples/basic/B3/B3b/include/RunAction.hh index ac2c551099..9d27530e43 100644 --- a/examples/basic/B3/B3b/include/B3bRunAction.hh +++ b/examples/basic/B3/B3b/include/RunAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3bRunAction.hh -/// \brief Definition of the B3bRunAction class +/// \file RunAction.hh +/// \brief Definition of the B3b::RunAction class #ifndef B3bRunAction_h #define B3bRunAction_h 1 @@ -35,19 +35,24 @@ class G4Run; +namespace B3b +{ + /// Run action class -class B3bRunAction : public G4UserRunAction +class RunAction : public G4UserRunAction { public: - B3bRunAction(); - virtual ~B3bRunAction(); + RunAction(); + ~RunAction() override; - virtual G4Run* GenerateRun(); - virtual void BeginOfRunAction(const G4Run*); - virtual void EndOfRunAction(const G4Run*); + G4Run* GenerateRun() override; + void BeginOfRunAction(const G4Run*) override; + void EndOfRunAction(const G4Run*) override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B3/B3b/include/B3StackingAction.hh b/examples/basic/B3/B3b/include/StackingAction.hh similarity index 88% rename from examples/basic/B3/B3b/include/B3StackingAction.hh rename to examples/basic/B3/B3b/include/StackingAction.hh index df377ddabf..4a62c579db 100644 --- a/examples/basic/B3/B3b/include/B3StackingAction.hh +++ b/examples/basic/B3/B3b/include/StackingAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B3StackingAction.hh -/// \brief Definition of the B3StackingAction class +/// \file StackingAction.hh +/// \brief Definition of the B3::StackingAction class #ifndef B3StackingAction_h #define B3StackingAction_h 1 @@ -33,20 +33,25 @@ #include "G4UserStackingAction.hh" #include "globals.hh" +namespace B3 +{ + /// Stacking action class : manage the newly generated particles /// /// One wishes do not track secondary neutrino.Therefore one kills it /// immediately, before created particles will put in a stack. -class B3StackingAction : public G4UserStackingAction +class StackingAction : public G4UserStackingAction { public: - B3StackingAction(); - virtual ~B3StackingAction(); + StackingAction(); + ~StackingAction() override; - virtual G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track*); + G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track*) override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B2/B2a/src/B2ActionInitialization.cc b/examples/basic/B3/B3b/src/ActionInitialization.cc similarity index 77% rename from examples/basic/B2/B2a/src/B2ActionInitialization.cc rename to examples/basic/B3/B3b/src/ActionInitialization.cc index 799cda0ce7..7c123ff37b 100644 --- a/examples/basic/B2/B2a/src/B2ActionInitialization.cc +++ b/examples/basic/B3/B3b/src/ActionInitialization.cc @@ -24,39 +24,46 @@ // ******************************************************************** // // -/// \file B2ActionInitialization.cc -/// \brief Implementation of the B2ActionInitialization class +/// \file ActionInitialization.cc +/// \brief Implementation of the B3b::ActionInitialization class -#include "B2ActionInitialization.hh" -#include "B2PrimaryGeneratorAction.hh" -#include "B2RunAction.hh" -#include "B2EventAction.hh" +#include "ActionInitialization.hh" +#include "RunAction.hh" +#include "PrimaryGeneratorAction.hh" +#include "StackingAction.hh" + +using namespace B3; + +namespace B3b +{ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2ActionInitialization::B2ActionInitialization() - : G4VUserActionInitialization() +ActionInitialization::ActionInitialization() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B2ActionInitialization::~B2ActionInitialization() +ActionInitialization::~ActionInitialization() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2ActionInitialization::BuildForMaster() const +void ActionInitialization::BuildForMaster() const { - SetUserAction(new B2RunAction); + SetUserAction(new RunAction); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B2ActionInitialization::Build() const +void ActionInitialization::Build() const { - SetUserAction(new B2PrimaryGeneratorAction); - SetUserAction(new B2RunAction); - SetUserAction(new B2EventAction); + SetUserAction(new RunAction); + SetUserAction(new PrimaryGeneratorAction); + SetUserAction(new StackingAction); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/B3b/src/B3bActionInitialization.cc b/examples/basic/B3/B3b/src/B3bActionInitialization.cc deleted file mode 100644 index 3dd94f9281..0000000000 --- a/examples/basic/B3/B3b/src/B3bActionInitialization.cc +++ /dev/null @@ -1,62 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file B3bActionInitialization.cc -/// \brief Implementation of the B3bActionInitialization class - -#include "B3bActionInitialization.hh" -#include "B3bRunAction.hh" -#include "B3PrimaryGeneratorAction.hh" -#include "B3StackingAction.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B3bActionInitialization::B3bActionInitialization() - : G4VUserActionInitialization() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B3bActionInitialization::~B3bActionInitialization() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B3bActionInitialization::BuildForMaster() const -{ - SetUserAction(new B3bRunAction); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B3bActionInitialization::Build() const -{ - SetUserAction(new B3bRunAction); - SetUserAction(new B3PrimaryGeneratorAction); - SetUserAction(new B3StackingAction); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B3/B3b/src/B3DetectorConstruction.cc b/examples/basic/B3/B3b/src/DetectorConstruction.cc similarity index 95% rename from examples/basic/B3/B3b/src/B3DetectorConstruction.cc rename to examples/basic/B3/B3b/src/DetectorConstruction.cc index 008cff0a37..317f905f37 100644 --- a/examples/basic/B3/B3b/src/B3DetectorConstruction.cc +++ b/examples/basic/B3/B3b/src/DetectorConstruction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B3DetectorConstruction.cc -/// \brief Implementation of the B3DetectorConstruction class +/// \file DetectorConstruction.cc +/// \brief Implementation of the B3::DetectorConstruction class -#include "B3DetectorConstruction.hh" +#include "DetectorConstruction.hh" #include "G4NistManager.hh" #include "G4Box.hh" @@ -45,23 +45,24 @@ #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" +namespace B3 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3DetectorConstruction::B3DetectorConstruction() -: G4VUserDetectorConstruction(), - fCheckOverlaps(true) +DetectorConstruction::DetectorConstruction() { DefineMaterials(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3DetectorConstruction::~B3DetectorConstruction() +DetectorConstruction::~DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3DetectorConstruction::DefineMaterials() +void DetectorConstruction::DefineMaterials() { G4NistManager* man = G4NistManager::Instance(); @@ -79,7 +80,7 @@ void B3DetectorConstruction::DefineMaterials() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B3DetectorConstruction::Construct() +G4VPhysicalVolume* DetectorConstruction::Construct() { // Gamma detector Parameters // @@ -249,7 +250,7 @@ G4VPhysicalVolume* B3DetectorConstruction::Construct() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3DetectorConstruction::ConstructSDandField() +void DetectorConstruction::ConstructSDandField() { G4SDManager::GetSDMpointer()->SetVerboseLevel(1); @@ -271,3 +272,6 @@ void B3DetectorConstruction::ConstructSDandField() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/B3b/src/B3PhysicsList.cc b/examples/basic/B3/B3b/src/PhysicsList.cc similarity index 88% rename from examples/basic/B3/B3b/src/B3PhysicsList.cc rename to examples/basic/B3/B3b/src/PhysicsList.cc index 3c92555bb1..c3070f8470 100644 --- a/examples/basic/B3/B3b/src/B3PhysicsList.cc +++ b/examples/basic/B3/B3b/src/PhysicsList.cc @@ -24,19 +24,22 @@ // ******************************************************************** // // -/// \file B3PhysicsList.cc -/// \brief Implementation of the B3PhysicsList class +/// \file PhysicsList.cc +/// \brief Implementation of the B3::PhysicsList class -#include "B3PhysicsList.hh" +#include "PhysicsList.hh" #include "G4DecayPhysics.hh" #include "G4EmStandardPhysics.hh" #include "G4RadioactiveDecayPhysics.hh" +namespace B3 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3PhysicsList::B3PhysicsList() -: G4VModularPhysicsList(){ +PhysicsList::PhysicsList() +{ SetVerboseLevel(1); // Default physics @@ -51,13 +54,17 @@ B3PhysicsList::B3PhysicsList() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3PhysicsList::~B3PhysicsList() +PhysicsList::~PhysicsList() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3PhysicsList::SetCuts() +void PhysicsList::SetCuts() { G4VUserPhysicsList::SetCuts(); } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B3/B3a/src/B3PrimaryGeneratorAction.cc b/examples/basic/B3/B3b/src/PrimaryGeneratorAction.cc similarity index 90% rename from examples/basic/B3/B3a/src/B3PrimaryGeneratorAction.cc rename to examples/basic/B3/B3b/src/PrimaryGeneratorAction.cc index eb8d0f9963..e7f9b1dba4 100644 --- a/examples/basic/B3/B3a/src/B3PrimaryGeneratorAction.cc +++ b/examples/basic/B3/B3b/src/PrimaryGeneratorAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B3PrimaryGeneratorAction.cc -/// \brief Implementation of the B3PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the B3::PrimaryGeneratorAction class -#include "B3PrimaryGeneratorAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4RunManager.hh" #include "G4Event.hh" @@ -39,11 +39,12 @@ #include "G4SystemOfUnits.hh" #include "Randomize.hh" +namespace B3 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3PrimaryGeneratorAction::B3PrimaryGeneratorAction() - : G4VUserPrimaryGeneratorAction(), - fParticleGun(nullptr) +PrimaryGeneratorAction::PrimaryGeneratorAction() { G4int n_particle = 1; fParticleGun = new G4ParticleGun(n_particle); @@ -61,14 +62,14 @@ B3PrimaryGeneratorAction::B3PrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3PrimaryGeneratorAction::~B3PrimaryGeneratorAction() +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { G4ParticleDefinition* particle = fParticleGun->GetParticleDefinition(); if (particle == G4ChargedGeantino::ChargedGeantino()) { @@ -101,3 +102,6 @@ void B3PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} + + diff --git a/examples/basic/B3/B3b/src/B3bRun.cc b/examples/basic/B3/B3b/src/Run.cc similarity index 90% rename from examples/basic/B3/B3b/src/B3bRun.cc rename to examples/basic/B3/B3b/src/Run.cc index 391d28b2fa..8d1932a4a7 100644 --- a/examples/basic/B3/B3b/src/B3bRun.cc +++ b/examples/basic/B3/B3b/src/Run.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B3bRun.cc -/// \brief Implementation of the B3bRun class +/// \file Run.cc +/// \brief Implementation of the B3b::Run class -#include "B3bRun.hh" +#include "Run.hh" #include "G4RunManager.hh" #include "G4Event.hh" @@ -37,26 +37,22 @@ #include "G4THitsMap.hh" #include "G4SystemOfUnits.hh" +namespace B3b +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3bRun::B3bRun() - : G4Run(), - fCollID_cryst(-1), - fCollID_patient(-1), - fPrintModulo(10000), - fGoodEvents(0), - fSumDose(0.), - fStatDose() +Run::Run() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3bRun::~B3bRun() +Run::~Run() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3bRun::RecordEvent(const G4Event* event) +void Run::RecordEvent(const G4Event* event) { if ( fCollID_cryst < 0 ) { fCollID_cryst @@ -116,9 +112,9 @@ void B3bRun::RecordEvent(const G4Event* event) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3bRun::Merge(const G4Run* aRun) +void Run::Merge(const G4Run* aRun) { - const B3bRun* localRun = static_cast(aRun); + const Run* localRun = static_cast(aRun); fGoodEvents += localRun->fGoodEvents; fSumDose += localRun->fSumDose; fStatDose += localRun->fStatDose; @@ -126,3 +122,6 @@ void B3bRun::Merge(const G4Run* aRun) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/B3b/src/B3bRunAction.cc b/examples/basic/B3/B3b/src/RunAction.cc similarity index 88% rename from examples/basic/B3/B3b/src/B3bRunAction.cc rename to examples/basic/B3/B3b/src/RunAction.cc index c82b33404a..a630791877 100644 --- a/examples/basic/B3/B3b/src/B3bRunAction.cc +++ b/examples/basic/B3/B3b/src/RunAction.cc @@ -24,22 +24,26 @@ // ******************************************************************** // // -/// \file B3bRunAction.cc -/// \brief Implementation of the B3bRunAction class +/// \file RunAction.cc +/// \brief Implementation of the B3b::RunAction class -#include "B3bRunAction.hh" -#include "B3bRun.hh" -#include "B3PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "Run.hh" +#include "PrimaryGeneratorAction.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +using namespace B3; + +namespace B3b +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3bRunAction::B3bRunAction() - : G4UserRunAction() +RunAction::RunAction() { //add new units for dose // @@ -56,17 +60,17 @@ B3bRunAction::B3bRunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3bRunAction::~B3bRunAction() +RunAction::~RunAction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4Run* B3bRunAction::GenerateRun() -{ return new B3bRun; } +G4Run* RunAction::GenerateRun() +{ return new Run; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3bRunAction::BeginOfRunAction(const G4Run* run) +void RunAction::BeginOfRunAction(const G4Run* run) { G4cout << "### Run " << run->GetRunID() << " start." << G4endl; @@ -76,7 +80,7 @@ void B3bRunAction::BeginOfRunAction(const G4Run* run) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3bRunAction::EndOfRunAction(const G4Run* run) +void RunAction::EndOfRunAction(const G4Run* run) { G4int nofEvents = run->GetNumberOfEvent(); if (nofEvents == 0) return; @@ -84,8 +88,8 @@ void B3bRunAction::EndOfRunAction(const G4Run* run) // Run conditions // note: There is no primary generator action object for "master" // run manager for multi-threaded mode. - const B3PrimaryGeneratorAction* generatorAction - = static_cast( + const PrimaryGeneratorAction* generatorAction + = static_cast( G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction()); G4String partName; if (generatorAction) @@ -97,7 +101,7 @@ void B3bRunAction::EndOfRunAction(const G4Run* run) //results // - const B3bRun* b3Run = static_cast(run); + const Run* b3Run = static_cast(run); G4int nbGoodEvents = b3Run->GetNbGoodEvents(); G4double sumDose = b3Run->GetSumDose(); G4StatAnalysis statDose = b3Run->GetStatDose(); @@ -130,3 +134,6 @@ void B3bRunAction::EndOfRunAction(const G4Run* run) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/B3a/src/B3StackingAction.cc b/examples/basic/B3/B3b/src/StackingAction.cc similarity index 89% rename from examples/basic/B3/B3a/src/B3StackingAction.cc rename to examples/basic/B3/B3b/src/StackingAction.cc index 0e4b60214d..53bc9fb404 100644 --- a/examples/basic/B3/B3a/src/B3StackingAction.cc +++ b/examples/basic/B3/B3b/src/StackingAction.cc @@ -24,28 +24,31 @@ // ******************************************************************** // // -/// \file B3StackingAction.cc -/// \brief Implementation of the B3StackingAction class +/// \file StackingAction.cc +/// \brief Implementation of the B3::StackingAction class -#include "B3StackingAction.hh" +#include "StackingAction.hh" #include "G4Track.hh" #include "G4NeutrinoE.hh" +namespace B3 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3StackingAction::B3StackingAction() +StackingAction::StackingAction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3StackingAction::~B3StackingAction() +StackingAction::~StackingAction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ClassificationOfNewTrack -B3StackingAction::ClassifyNewTrack(const G4Track* track) +StackingAction::ClassifyNewTrack(const G4Track* track) { //keep primary particle if (track->GetParentID() == 0) return fUrgent; @@ -56,3 +59,6 @@ B3StackingAction::ClassifyNewTrack(const G4Track* track) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B3/CMakeLists.txt b/examples/basic/B3/CMakeLists.txt index 7e0bc4da1b..1e316712da 100644 --- a/examples/basic/B3/CMakeLists.txt +++ b/examples/basic/B3/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding example B3 subdirectories explicitly # and a custom target to for building all example B2 options ---------- -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(B3a) add_subdirectory(B3b) diff --git a/examples/basic/B3/History b/examples/basic/B3/History index f5a8efa843..745123f4cb 100644 --- a/examples/basic/B3/History +++ b/examples/basic/B3/History @@ -14,6 +14,14 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06-10-21 I. Hrivnacova (exampleB3-V10-07-03) +- Migration to new G4AnalysisManager.hh header; + removed Analysis.hh. + +13-07-21 I. Hrivnacova (exampleB3-V10-07-02) +- Introduced namespace instead of a class names prefix +- Declare overriding functions 'override' (and removed 'virtual' keyword) + 31-05-21 I. Hrivnacova (exampleB3-V10-07-01) - Use nullptr instead of 0 - Clean trailing whitespaces from all files diff --git a/examples/basic/B3/README b/examples/basic/B3/README deleted file mode 100644 index 254d4c81cd..0000000000 --- a/examples/basic/B3/README +++ /dev/null @@ -1,202 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example B3 - ---------- - - This example simulates schematically a Positron Emitted Tomography system. - - 1- GEOMETRY DEFINITION - - The support of gamma detection are scintillating crystals. A small number - of such crystals are optically grouped in a matrix of crystals. In - this example, individual crystals are not described; only the matrix of - crystals is and it is still called 'Crystal' hereafter. - - Crystals are circularly arranged to form a ring. Few rings make up the full - detector (gamma camera). This is done by positionning Crystals in - Ring with an appropriate rotation matrix. Several copies of Ring are - then placed in the full detector. - - The head of a patient is schematised as a homogeneous cylinder of brain - tissue, placed at the center of full detector. - - The Crystal material, Lu2SiO5, is not included in the G4Nist database. - Therefore, it is explicitly built in DefineMaterials(). - - 2- PHYSICS LIST - - The physics list contains standard electromagnetic processes and the - radioactiveDecay module for GenericIon. It is defined in the B3PhysicsList - class as a Geant4 modular physics list with registered physics builders - provided in Geant4: - - G4DecayPhysics - defines all particles and their decay processes - - G4RadioactiveDecayPhysics - defines radioactiveDecay for GenericIon - - G4EmStandardPhysics - defines all EM standard processes - - This physics list requires data files for: - - low energy electromagnetic processes which path is defined via - the G4LEDATA envirnoment variable - - nuclides properties which path is defined via - the G4ENSDFSTATEDATA envirnoment variable - - radioactive decay hadronic processes which path is defined via - the G4RADIOACTIVEDATA envirnoment variable. - - See more on installation of the datasets in Geant4 Installation Guide, - Chapter 3.3: Note On Geant4 Datasets: - http://geant4.web.cern.ch/geant4/UserDocumentation/UsersGuides - /InstallationGuide/html/ch03s03.html - 3- ACTION INITALIZATION - - B3[a,b]ActionInitialization class instantiates and registers to Geant4 kernel - all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B3[a,b]ActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - B3[a,b]ActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - - 4- PRIMARY GENERATOR - - The default particle beam is an ion (F18), at rest, randomly distributed - within a zone inside a patient and is defined in - B3PrimaryGeneratorAction::GeneratePrimaries(). - The type of a primary particle can be changed with G4ParticleGun commands - (see run2.mac). - - 5- DETECTOR RESPONSE: scorers - - A 'good' event is an event in which an identical energy of 511 keV is - deposited in two separate Crystals. A count of the number of such events - corresponds to a measure of the efficiency of the PET system. - The total dose deposited in a patient during a run is also computed. - - Scorers are defined in B3DetectorConstruction::ConstructSDandField(). There are - two G4MultiFunctionalDetector objects: one for the Crystal (EnergyDeposit), - and one for the Patient (DoseDeposit) - - The scorers hits are saved in form of ntuples in a Root file using Geant4 - analysis tools. This feature is activated in the main () function with instantiating - G4TScoreNtupleWriter. - - Two variants of accumulation event statistics in a run are demonstrated - in this example: - - B3a: - - At the end of event, the values acummulated in B3aEventAction are passed - in B3aRunAction and summed over the whole run (see B3aEventAction::EndOfevent()). - In multi-threading mode the data accumulated in G4Accumulable objects per - workers is merged to the master in B3aRunAction::EndOfRunAction() and the final - result is printed on the screen. - - G4Accumulable<> type instead of G4double and G4int types is used for the B3aRunAction - data members in order to facilitate merging of the values accumulated on workers - to the master. Currently the accumulables have to be registered to G4AccumulablesManager - and G4AccumulablesManager::Merge() has to be called from the users code. This is planned - to be further simplified with a closer integration of G4Accumulable classes in - the Geant4 kernel next year. - - B3b: - - B3bRun::RecordEvent(), called at end of event, collects informations - event per event from the hits collections, and accumulates statistic for - B3bRunAction::EndOfRunAction(). - In addition, results for dose are accumulated in a - standard floating-point summation and using a new lightweight statistical - class called G4StatAnalysis. The G4StatAnalysis class records four values: - (1) the sum, (2) sum^2, (3) number of entries, and (4) the number of entries - less than mean * machine-epsilon (the machine epsilon is the difference - between 1.0 and the next value representable by the floating-point type). - From these 4 values, G4StatAnalysis provides the mean, FOM, relative error, - standard deviation, variance, coefficient of variation, efficiency, r2int, - and r2eff. - - In multi-threading mode the statistics accumulated per workers is merged - to the master in B3bRun::Merge(). - - 6- STACKING ACTION - - Beta decay of Fluor generates a neutrino. One wishes not to track this - neutrino; therefore one kills it immediately, before created particles - are put in a stack. - The function B3StackingAction::ClassifyNewTrack() is invoked by G4 kernel - each time a new particle is created. - - The following paragraphs are common to all basic examples - - A- VISUALISATION - - The visualization manager is set via the G4VisExecutive class - in the main() function in exampleB3.cc. - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then - /vis/open DAWNFILE - then to get the same view - /vis/viewer/copyView viewer-0 - or to get the same view *plus* scene-modifications - /vis/viewer/set/all viewer-0 - then to see the result - /vis/viewer/flush - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example, - http://geant4.slac.stanford.edu/Presentations/vis/G4[VIS]Tutorial/G4[VIS]Tutorial.html - (where [VIS] can be replaced by DAWN, OpenGL and HepRApp) - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - - B- USER INTERFACES - - The user command interface is set via the G4UIExecutive class - in the main() function in exampleB3.cc - The selection of the user command interface is then done automatically - according to the Geant4 configuration or it can be done explicitly via - the third argument of the G4UIExecutive constructor (see exampleB4a.cc). - -C- HOW TO RUN - - - Execute exampleB3a in the 'interactive mode' with visualization - % ./exampleB3a - and type in the commands from run1.mac line by line: - Idle> /control/verbose 2 - Idle> /tracking/verbose 2 - Idle> /run/beamOn 1 - Idle> ... - Idle> exit - or - Idle> /control/execute run1.mac - .... - Idle> exit - - - Execute exampleB3a in the 'batch' mode from macro files - (without visualization) - % ./exampleB3a run2.mac - % ./exampleB3a exampleB3.in > exampleB3.out - - diff --git a/examples/basic/B4/.README.txt b/examples/basic/B4/.README.txt deleted file mode 100644 index 5a39c5755b..0000000000 --- a/examples/basic/B4/.README.txt +++ /dev/null @@ -1,322 +0,0 @@ - -///\file "B4/.README.txt" -///\brief Example B4 README page - -/*! \page ExampleB4 Example B4 - - This example simulates a simple Sampling Calorimeter setup. - To demonstrate several possible ways of data scoring, the example - is provided in four variants: B4a, B4b, B4c, B4d. - (See also examples/extended/electromagnetic/TestEm3) - -\section B4_s1 GEOMETRY DEFINITION - - The geometry is constructed in B4DetectorConstruction class - (see also - \link B4cDetectorConstruction B4c \endlink, - \link B4dDetectorConstruction B4d \endlink variants). - The calorimeter is a box made of a given number of layers. A layer - consists of an absorber plate and of a detection gap. The layer is - replicated. - - Four parameters define the geometry of the calorimeter : - - the thickness of an absorber plate, - - the thickness of a gap, - - the number of layers, and - - the transverse size of the calorimeter (the entrance face is a square). - - In addition, a global, uniform, and transverse magnetic field can be - applied using G4GlobalMagFieldMessenger, instantiated in - B4DetectorConstruction::ConstructSDandField() - (see also - \link B4cDetectorConstruction::ConstructSDandField() B4c \endlink, - \link B4dDetectorConstruction::ConstructSDandField() B4d \endlink variants) - with a non zero field value, or via interactive commands. - For example: - -\verbatim -/globalField/setValue 0.2 0 0 tesla -\endverbatim - -
      -        |<----layer 0---------->|<----layer 1---------->|<----layer 2---------->|
      -        |                       |                       |                       |
      -        ==========================================================================
      -        ||              |       ||              |       ||              |       ||
      -        ||              |       ||              |       ||              |       ||
      - beam   ||   absorber   |  gap  ||   absorber   |  gap  ||   absorber   |  gap  ||
      -======> ||              |       ||              |       ||              |       ||
      -        ||              |       ||              |       ||              |       ||
      -        ==========================================================================
      -
      -
      - - A more general version of this geometry can be found in: - examples/extended/electromagnetic/TestEm3 - where all the geometry parameters, the absorber and gap materials - can be modified interactively via the commands defined in the DetectorMessenger - class. - -\section B4_s2 PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set in the FTFP_BERT physics list. This physics list - requires data files for electromagnetic and hadronic processes. - See more on installation of the datasets in - - Geant4 Installation Guide, Chapter 3.3: Note On Geant4 Datasets . - The following datasets: G4LEDATA, G4LEVELGAMMADATA, G4SAIDXSDATA and - G4ENSDFSTATEDATA are mandatory for this example. - - In addition the build-in interactive command: -\verbatim -/process/(in)activate processName -\endverbatim - allows to activate/inactivate the processes one by one. - -\section B4_s3 ACTION INITALIZATION - - A newly introduced class, B4aActionInitialization, (see also - \link B4bActionInitialization B4b \endlink, - \link B4cActionInitialization B4c \endlink, - \link B4dActionInitialization B4d \endlink variants), - instantiates and registers to Geant4 kernel all user action classes; - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B4aActionInitialization::Build() - (see also - \link B4bActionInitialization::Build() B4b \endlink, - \link B4cActionInitialization::Build() B4c \endlink, - \link B4dActionInitialization::Build() B4d \endlink variants), - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - B4aActionInitialization::BuildForMaster() - (see also - \link B4bActionInitialization::BuildForMaster() B4b \endlink, - \link B4cActionInitialization::BuildForMaster() B4c \endlink, - \link B4dActionInitialization::BuildForMaster() B4d \endlink variants), - which is invoked only in multi-threading mode. - -\section B4_s4 PRIMARY GENERATOR - - The primary beam consists of a single particle which hits the - calorimeter perpendicular to the input face. The type of the particle - and its energy are set in the B4PrimaryGeneratorAction class, and can - be changed via the G4 built-in commands of the G4ParticleGun class (see - the macros provided with this example). - -\section B4_s5 RUNS and EVENTS - - A run is a set of events. - - The user can choose the frequency of printing via the Geant4 interactive - command, for example: -\verbatim -/run/printProgress 100 -\endverbatim - -\section B4_s6- DETECTOR RESPONSE - - The energy deposit and track lengths of the charged particles are recorded on - an event by event basis in the Absober and Gap layers. - - In order to demonstrate several possible ways of data scoring, - the example is provided in four variants: - -\subsection s6a Variant a: User Actions - - These 4 quantities are data members of the B4aEventAction class. - They are collected step by step in - B4aSteppingAction::UserSteppingAction(), and passed to the event action - via two methods: B4aEventAction::AddAbs() and B4aEventAction::AddGap(). - - In B4aEventAction::EndOfEventAction(), these quantities are printed and - filled in H1D histograms and ntuple to accumulate statistic and compute - dispersion. - -\subsection s6b Variant b: User data object - - In order to avoid dependencies between action classes, a user object - B4bRunData, derived from G4Run, is defined with data members needed - for the accounted information. - In order to reduce the number of data members a 2-dimensions array - is introduced for each quantity. - Then the quantities are collected step by step in user action classes: - B4bSteppingAction::UserSteppingAction() and - B4bEventAction::EndOfEventAction() in a similar way as in variant a. - -\subsection s6c Variant c: Hits and Sensitive detectors - - In this option, the physics quantities are accounted using the hits - and sensitive detectors framework defined in the Geant4 kernel. - The physics quantities are stored in B4cCalorHit via two B4cCalorimeterSD - objects, one associated with the Absorber volume and another one with Gap - in B4cDetectorConstruction::ConstructSDandField(). - - In contrary to the B2 example (Tracker) where a new hit is created - with each track passing the sensitive volume (in the calorimeter), only one - hit is created for each calorimeter layer and one more hit to account for - the total quantities in all layers. In addition to the variants a and b, - the quantities per each layer are also available in addition to the total - quantities. - -\subsection s6d Variant d: Scorer - - In this option, the Geant4 scorers which are defined on the top of hits - and sensitive detectors Geant4 framework are used. - In practice this means that the user does not need to define hits and sensitive - detector classes but rather uses the classes already defined - in Geant4. In this example, the G4MultiFunctionalDetector with - G4PSEnergyDeposit and G4PSTrackLength primitive scores are used (see - B4dDetectorConstruction::ConstructSDandField()). - - The scorers hits are saved in form of ntuples in a Root file using Geant4 - analysis tools. This feature is activated in the main () function with instantiating - G4TScoreNtupleWriter. - - Also with this approach, the quantities per each layer are available - in addition to the total quantities. - -\section B4_s7 HISTOGRAMS - - The analysis tools are used to accumulate statistics and compute the dispersion - of the energy deposit and track lengths of the charged particles. - H1D histograms are created in B4RunAction::B4RunAction() (see also - \link B4bRunAction::B4bRunAction() B4b \endlink variant) for the - following quantities: - - Energy deposit in absorber - - Energy deposit in gap - - Track length in absorber - - Track length in gap - - The same values are also saved in an ntuple. - - The histograms and the ntuple are saved in the output file in a format - according to a technology selected in B4Analysis.hh, the default in this example - is ROOT. - - The accumulated statistic and computed dispersion is printed at the end of - run, in B4RunAction::EndOfRunAction() ((see also - \link B4bRunAction::EndOfRunAction() B4b \endlink variant). - When running in multi-threading mode, the histograms and the ntuple accumulated - on threads are merged in a single output file. While merging of histograms is - performed by default, merging of ntuples is explicitly activated in the B4RunAction - constructor. - - The ROOT histograms and ntuple can be plotted with ROOT using the plotHisto.C - and plotNtuple.C macros. - -\section B4_s8 HOW TO RUN - - This example handles the program arguments in a new way. - It can be run with the following optional arguments: -\verbatim -% exampleB4a [-m macro ] [-u UIsession] [-t nThreads] [-vDefault] -\endverbatim - - The -vDefault option will activate using the default Geant4 stepping verbose - class (G4SteppingVerbose) instead of the enhanced stepping verbose with best - units (G4SteppingVerboseWithUnits) used in the example by default. - - The -t option is available only in multi-threading mode - and it allows the user to override the Geant4 default number of - threads. The number of threads can be also set via G4FORCENUMBEROFTHREADS - environment variable which has the top priority. - - - Execute exampleB4a in the 'interactive mode' with visualization -\verbatim -% exampleB4a -and type in the commands from run1.mac line by line: -Idle> /tracking/verbose 1 -Idle> /run/beamOn 1 -Idle> ... -Idle> exit -\endverbatim - or -\verbatim -Idle> /control/execute run1.mac -.... -Idle> exit -\endverbatim - - - Execute exampleB4a in the 'batch' mode from macro files - (without visualization) -\verbatim -% exampleB4a -m run2.mac -% exampleB4a -m exampleB4.in > exampleB4.out -\endverbatim - - - Execute exampleB4a in the 'interactive mode' with a selected UI session, - e.g. tcsh -\verbatim -% exampleB4a -u tcsh -\endverbatim - -
      - -The following paragraphs are common to all basic examples - -\section B4_A VISUALISATION - - The visualization manager is set via the G4VisExecutive class - in the main () function in exampleB4a.cc. - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then -\verbatim -/vis/open DAWNFILE -\endverbatim - then to get the same view -\verbatim -/vis/viewer/copyView viewer-0 -\endverbatim - or to get the same view *plus* scene-modifications -\verbatim -/vis/viewer/set/all viewer-0 -\endverbatim - then to see the result -\verbatim -/vis/viewer/flush -\endverbatim - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example,\n - - - OpenGL Tutorial - - - DAWN Tutorial - - - HepRApp Tutorial - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - -\section B4_B USER INTERFACES - - The user command interface is set via the G4UIExecutive class - in the main () function in exampleB4a.cc - The selection of the user command interface is then done automatically - according to the Geant4 configuration or it can be done explicitly via - the third argument of the G4UIExecutive constructor (see exampleB4a.cc). - -*/ - - diff --git a/examples/basic/B4/B4a/CMakeLists.txt b/examples/basic/B4/B4a/CMakeLists.txt index 2ae24f2a48..a1e0f4d7ca 100644 --- a/examples/basic/B4/B4a/CMakeLists.txt +++ b/examples/basic/B4/B4a/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B4a) #---------------------------------------------------------------------------- diff --git a/examples/basic/B4/B4a/exampleB4a.cc b/examples/basic/B4/B4a/exampleB4a.cc index 8e947aff8e..bc988bde5d 100644 --- a/examples/basic/B4/B4a/exampleB4a.cc +++ b/examples/basic/B4/B4a/exampleB4a.cc @@ -27,8 +27,8 @@ /// \file exampleB4a.cc /// \brief Main program of the B4a example -#include "B4DetectorConstruction.hh" -#include "B4aActionInitialization.hh" +#include "DetectorConstruction.hh" +#include "ActionInitialization.hh" #include "G4RunManagerFactory.hh" #include "G4SteppingVerbose.hh" @@ -114,13 +114,13 @@ int main(int argc,char** argv) // Set mandatory initialization classes // - auto detConstruction = new B4DetectorConstruction(); + auto detConstruction = new B4::DetectorConstruction(); runManager->SetUserInitialization(detConstruction); auto physicsList = new FTFP_BERT; runManager->SetUserInitialization(physicsList); - auto actionInitialization = new B4aActionInitialization(detConstruction); + auto actionInitialization = new B4a::ActionInitialization(detConstruction); runManager->SetUserInitialization(actionInitialization); // Initialize visualization diff --git a/examples/basic/B4/B4a/exampleB4a.out b/examples/basic/B4/B4a/exampleB4a.out index d6a61f9917..a068acd418 100644 --- a/examples/basic/B4/B4a/exampleB4a.out +++ b/examples/basic/B4/B4a/exampleB4a.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -21,16 +21,6 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo <<< Geant4 Physics List simulation engine: FTFP_BERT -Using Root - --------- WWWW ------- G4Exception-START -------- WWWW ------- -*** G4Exception : Analysis_W013 - issued by : G4RootNtupleFileManager::SetNtupleMergingMode -Merging ntuples is not applicable in sequential application. -Setting was ignored. -*** This is just a warning message. *** --------- WWWW -------- G4Exception-END --------- WWWW ------- - Visualization Manager instantiating with verbosity "warnings (3)"... Visualization Manager initialising... Registering graphics systems... @@ -39,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -118,9 +106,9 @@ Some /vis commands (optionally) take a string to specify colour. -Checking overlaps for volume Calorimeter (G4Box) ... OK! -Checking overlaps for volume Abso (G4Box) ... OK! -Checking overlaps for volume Gap (G4Box) ... OK! +Checking overlaps for volume Calorimeter:0 (G4Box) ... OK! +Checking overlaps for volume Abso:0 (G4Box) ... OK! +Checking overlaps for volume Gap:0 (G4Box) ... OK! ------------------------------------------------------------ ---> The calorimeter is 10 layers of: [ 10mm of G4_Pb + 5mm of liquidArgon ] @@ -133,32 +121,99 @@ Checking overlaps for volume Gap (G4Box) ... OK! for neutron : 3 to 6 GeV ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -168,25 +223,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -196,29 +251,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -226,31 +281,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -259,12 +314,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -272,12 +327,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -285,31 +340,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -317,31 +372,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -349,31 +404,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -381,32 +436,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -414,32 +469,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -447,31 +502,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -479,27 +534,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -508,17 +563,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -526,67 +581,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -594,13 +649,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -608,13 +663,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -622,12 +677,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -635,13 +690,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -649,13 +704,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -663,13 +718,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -677,60 +732,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -738,27 +793,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -766,25 +821,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -792,25 +847,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -818,13 +873,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -847,26 +902,37 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. + +-------- WWWW ------- G4Exception-START -------- WWWW ------- +*** G4Exception : Analysis_W001 + issued by : G4RootNtupleFileManager::SetNtupleMergingMode +Merging ntuples is not applicable in sequential application. +Setting was ignored. +*** This is just a warning message. *** +-------- WWWW -------- G4Exception-END --------- WWWW ------- + +... set ntuple merging row mode : row-wise - done ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 276.418 MeV total track length: 20.0351 cm - Gap: total energy: 16.7054 MeV total track length: 8.39188 cm + Absorber: total energy: 281.979 MeV total track length: 20.3632 cm + Gap: total energy: 7.05731 MeV total track length: 3.5668 cm ----> print histograms statistic for the entire run - EAbs : mean = 276.418 MeV rms = 0 meV - EGap : mean = 16.7054 MeV rms = 0 meV - LAbs : mean = 20.0351 cm rms = 0 fm - LGap : mean = 8.39188 cm rms = 0 fm + EAbs : mean = 281.979 MeV rms = 0 eV + EGap : mean = 7.05731 MeV rms = 0 eV + LAbs : mean = 20.3632 cm rms = 0 fm + LGap : mean = 3.5668 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. @@ -894,7 +960,7 @@ See commands in /vis/modeling/trajectories/ for other options. hIoni, hIoni, hIoni, hIoni hIoni, hIoni, hIoni, hIoni hIoni, hIoni, photonNuclear, electronNuclear - muonNuclear, Decay, hadElastic, hadElastic + positronNuclear, muonNuclear, Decay, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic @@ -909,791 +975,61 @@ See commands in /vis/modeling/trajectories/ for other options. hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, neutronInelastic, nCapture - protonInelastic, pi+Inelastic, pi-Inelastic, kaon+Inelastic - kaon-Inelastic, kaon0LInelastic, kaon0SInelastic,anti_protonInelastic -anti_neutronInelastic,anti_deuteronInelastic,anti_tritonInelastic, anti_He3Inelastic -anti_alphaInelastic, lambdaInelastic, sigma+Inelastic, sigma-Inelastic - xi0Inelastic, xi-Inelastic, omega-Inelastic,anti_lambdaInelastic -anti_sigma+Inelastic,anti_sigma-Inelastic, anti_xi0Inelastic, anti_xi-Inelastic -anti_omega-Inelastic, D+Inelastic, D0Inelastic, D-Inelastic - anti_D0Inelastic, Ds+Inelastic, Ds-Inelastic, B+Inelastic - B0Inelastic, B-Inelastic, anti_B0Inelastic, Bs0Inelastic - anti_Bs0Inelastic, Bc+Inelastic, Bc-Inelastic, lambda_c+Inelastic - xi_c+Inelastic, xi_c0Inelastic, omega_c0Inelastic, lambda_bInelastic - xi_b0Inelastic, xi_b-Inelastic, omega_b-Inelastic,anti_lambda_c+Inelastic -anti_xi_c+Inelastic,anti_xi_c0Inelastic,anti_omega_c0Inelastic,anti_lambda_bInelastic -anti_xi_b0Inelastic,anti_xi_b-Inelastic,anti_omega_b-Inelastic,hFritiofCaptureAtRest -hBertiniCaptureAtRest,muMinusCaptureAtRest, dInelastic, tInelastic - He3Inelastic, alphaInelastic, ionInelastic, nKiller - - -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + hadElastic, hadElastic, hadElastic, neutronInelastic + nCapture, protonInelastic, pi+Inelastic, pi-Inelastic + kaon+Inelastic, kaon-Inelastic, kaon0LInelastic, kaon0SInelastic +anti_protonInelastic,anti_neutronInelastic,anti_deuteronInelastic,anti_tritonInelastic + anti_He3Inelastic,anti_alphaInelastic, lambdaInelastic, sigma+Inelastic + sigma-Inelastic, xi0Inelastic, xi-Inelastic, omega-Inelastic +anti_lambdaInelastic,anti_sigma+Inelastic,anti_sigma-Inelastic, anti_xi0Inelastic + anti_xi-Inelastic,anti_omega-Inelastic, D+Inelastic, D0Inelastic + D-Inelastic, anti_D0Inelastic, Ds+Inelastic, Ds-Inelastic + B+Inelastic, B0Inelastic, B-Inelastic, anti_B0Inelastic + Bs0Inelastic, anti_Bs0Inelastic, Bc+Inelastic, Bc-Inelastic + lambda_c+Inelastic, xi_c+Inelastic, xi_c0Inelastic, omega_c0Inelastic + lambda_bInelastic, xi_b0Inelastic, xi_b-Inelastic, omega_b-Inelastic +anti_lambda_c+Inelastic,anti_xi_c+Inelastic,anti_xi_c0Inelastic,anti_omega_c0Inelastic +anti_lambda_bInelastic,anti_xi_b0Inelastic,anti_xi_b-Inelastic,anti_omega_b-Inelastic +hFritiofCaptureAtRest,hBertiniCaptureAtRest,muMinusCaptureAtRest, dInelastic + tInelastic, He3Inelastic, alphaInelastic, ionInelastic + nKiller ### Run 1 starts. ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 276.851 MeV total track length: 20.6185 cm - Gap: total energy: 15.9299 MeV total track length: 8.21284 cm + Absorber: total energy: 280.59 MeV total track length: 20.2565 cm + Gap: total energy: 17.1134 MeV total track length: 8.57952 cm ----> print histograms statistic for the entire run - EAbs : mean = 276.851 MeV rms = 0 meV - EGap : mean = 15.9299 MeV rms = 0 meV - LAbs : mean = 20.6185 cm rms = 0 fm - LGap : mean = 8.21284 cm rms = 0 fm + EAbs : mean = 280.59 MeV rms = 0 eV + EGap : mean = 17.1134 MeV rms = 0 eV + LAbs : mean = 20.2565 cm rms = 0 fm + LGap : mean = 8.57952 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. - -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV ### Run 2 starts. ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 468.054 MeV total track length: 34.15 cm - Gap: total energy: 27.9107 MeV total track length: 14.3207 cm + Absorber: total energy: 469.283 MeV total track length: 33.8386 cm + Gap: total energy: 18.5204 MeV total track length: 9.32324 cm ----> print histograms statistic for the entire run - EAbs : mean = 468.054 MeV rms = 0 meV - EGap : mean = 27.9107 MeV rms = 0 meV - LAbs : mean = 34.15 cm rms = 0 fm - LGap : mean = 14.3207 cm rms = 0 fm + EAbs : mean = 469.283 MeV rms = 0 eV + EGap : mean = 18.5204 MeV rms = 0 eV + LAbs : mean = 33.8386 cm rms = 0 fm + LGap : mean = 9.32324 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. diff --git a/examples/basic/B4/B4a/include/B4aActionInitialization.hh b/examples/basic/B4/B4a/include/ActionInitialization.hh similarity index 80% rename from examples/basic/B4/B4a/include/B4aActionInitialization.hh rename to examples/basic/B4/B4a/include/ActionInitialization.hh index eccf04aa79..603429a2f2 100644 --- a/examples/basic/B4/B4a/include/B4aActionInitialization.hh +++ b/examples/basic/B4/B4a/include/ActionInitialization.hh @@ -24,32 +24,40 @@ // ******************************************************************** // // -/// \file B4aActionInitialization.hh -/// \brief Definition of the B4aActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the ActionInitialization class #ifndef B4aActionInitialization_h #define B4aActionInitialization_h 1 #include "G4VUserActionInitialization.hh" -class B4DetectorConstruction; + +namespace B4 +{ + class DetectorConstruction; +} + +namespace B4a +{ /// Action initialization class. -/// -class B4aActionInitialization : public G4VUserActionInitialization +class ActionInitialization : public G4VUserActionInitialization { public: - B4aActionInitialization(B4DetectorConstruction*); - virtual ~B4aActionInitialization(); + ActionInitialization(B4::DetectorConstruction*); + ~ActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; + void BuildForMaster() const override; + void Build() const override; private: - B4DetectorConstruction* fDetConstruction; + B4::DetectorConstruction* fDetConstruction = nullptr; }; +} + #endif diff --git a/examples/basic/B4/B4a/include/B4Analysis.hh b/examples/basic/B4/B4a/include/B4Analysis.hh deleted file mode 100644 index 78c4412df4..0000000000 --- a/examples/basic/B4/B4a/include/B4Analysis.hh +++ /dev/null @@ -1,40 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file B4Analysis.hh -/// \brief Selection of the analysis technology - -#ifndef B4Analysis_h -#define B4Analysis_h 1 - -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" - -//#include "G4GenericAnalysisManager.hh" -//using G4AnalysisManager = G4GenericAnalysisManager; - -#endif diff --git a/examples/basic/B4/B4a/include/B4DetectorConstruction.hh b/examples/basic/B4/B4a/include/DetectorConstruction.hh similarity index 80% rename from examples/basic/B4/B4a/include/B4DetectorConstruction.hh rename to examples/basic/B4/B4a/include/DetectorConstruction.hh index 9b2379571b..17abcdfb6f 100644 --- a/examples/basic/B4/B4a/include/B4DetectorConstruction.hh +++ b/examples/basic/B4/B4a/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4DetectorConstruction.hh -/// \brief Definition of the B4DetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the DetectorConstruction class #ifndef B4DetectorConstruction_h #define B4DetectorConstruction_h 1 @@ -36,6 +36,9 @@ class G4VPhysicalVolume; class G4GlobalMagFieldMessenger; +namespace B4 +{ + /// Detector construction class to define materials and geometry. /// The calorimeter is a box made of a given number of layers. A layer consists /// of an absorber plate and of a detection gap. The layer is replicated. @@ -50,15 +53,15 @@ class G4GlobalMagFieldMessenger; /// In addition a transverse uniform magnetic field is defined /// via G4GlobalMagFieldMessenger class. -class B4DetectorConstruction : public G4VUserDetectorConstruction +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B4DetectorConstruction(); - virtual ~B4DetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; public: - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; // get methods // @@ -76,22 +79,23 @@ class B4DetectorConstruction : public G4VUserDetectorConstruction static G4ThreadLocal G4GlobalMagFieldMessenger* fMagFieldMessenger; // magnetic field messenger - G4VPhysicalVolume* fAbsorberPV; // the absorber physical volume - G4VPhysicalVolume* fGapPV; // the gap physical volume + G4VPhysicalVolume* fAbsorberPV = nullptr; // the absorber physical volume + G4VPhysicalVolume* fGapPV = nullptr; // the gap physical volume - G4bool fCheckOverlaps; // option to activate checking of volumes overlaps + G4bool fCheckOverlaps = true; // option to activate checking of volumes overlaps }; // inline functions -inline const G4VPhysicalVolume* B4DetectorConstruction::GetAbsorberPV() const { +inline const G4VPhysicalVolume* DetectorConstruction::GetAbsorberPV() const { return fAbsorberPV; } -inline const G4VPhysicalVolume* B4DetectorConstruction::GetGapPV() const { +inline const G4VPhysicalVolume* DetectorConstruction::GetGapPV() const { return fGapPV; } +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B4/B4a/include/B4aEventAction.hh b/examples/basic/B4/B4a/include/EventAction.hh similarity index 81% rename from examples/basic/B4/B4a/include/B4aEventAction.hh rename to examples/basic/B4/B4a/include/EventAction.hh index 65654a2e61..b0bf6b3c14 100644 --- a/examples/basic/B4/B4a/include/B4aEventAction.hh +++ b/examples/basic/B4/B4a/include/EventAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4aEventAction.hh -/// \brief Definition of the B4aEventAction class +/// \file EventAction.hh +/// \brief Definition of the EventAction class #ifndef B4aEventAction_h #define B4aEventAction_h 1 @@ -33,6 +33,9 @@ #include "G4UserEventAction.hh" #include "globals.hh" +namespace B4a +{ + /// Event action class /// /// It defines data members to hold the energy deposit and track lengths @@ -41,37 +44,39 @@ /// which are collected step by step via the functions /// - AddAbs(), AddGap() -class B4aEventAction : public G4UserEventAction +class EventAction : public G4UserEventAction { public: - B4aEventAction(); - virtual ~B4aEventAction(); + EventAction(); + ~EventAction() override; - virtual void BeginOfEventAction(const G4Event* event); - virtual void EndOfEventAction(const G4Event* event); + void BeginOfEventAction(const G4Event* event) override; + void EndOfEventAction(const G4Event* event) override; void AddAbs(G4double de, G4double dl); void AddGap(G4double de, G4double dl); private: - G4double fEnergyAbs; - G4double fEnergyGap; - G4double fTrackLAbs; - G4double fTrackLGap; + G4double fEnergyAbs = 0.; + G4double fEnergyGap = 0.; + G4double fTrackLAbs = 0.; + G4double fTrackLGap = 0.; }; // inline functions -inline void B4aEventAction::AddAbs(G4double de, G4double dl) { +inline void EventAction::AddAbs(G4double de, G4double dl) { fEnergyAbs += de; fTrackLAbs += dl; } -inline void B4aEventAction::AddGap(G4double de, G4double dl) { +inline void EventAction::AddGap(G4double de, G4double dl) { fEnergyGap += de; fTrackLGap += dl; } +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4a/include/B4PrimaryGeneratorAction.hh b/examples/basic/B4/B4a/include/PrimaryGeneratorAction.hh similarity index 86% rename from examples/basic/B4/B4a/include/B4PrimaryGeneratorAction.hh rename to examples/basic/B4/B4a/include/PrimaryGeneratorAction.hh index 9e2a99aa73..debeaa24a4 100644 --- a/examples/basic/B4/B4a/include/B4PrimaryGeneratorAction.hh +++ b/examples/basic/B4/B4a/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4PrimaryGeneratorAction.hh -/// \brief Definition of the B4PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the PrimaryGeneratorAction class #ifndef B4PrimaryGeneratorAction_h #define B4PrimaryGeneratorAction_h 1 @@ -36,6 +36,9 @@ class G4ParticleGun; class G4Event; +namespace B4 +{ + /// The primary generator action class with particle gum. /// /// It defines a single particle which hits the calorimeter @@ -43,21 +46,23 @@ class G4Event; /// can be changed via the G4 build-in commands of G4ParticleGun class /// (see the macros provided with this example). -class B4PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B4PrimaryGeneratorAction(); - virtual ~B4PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event* event); + void GeneratePrimaries(G4Event* event) override; // set methods void SetRandomFlag(G4bool value); private: - G4ParticleGun* fParticleGun; // G4 particle gun + G4ParticleGun* fParticleGun = nullptr; // G4 particle gun }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4c/include/B4RunAction.hh b/examples/basic/B4/B4a/include/RunAction.hh similarity index 88% rename from examples/basic/B4/B4c/include/B4RunAction.hh rename to examples/basic/B4/B4a/include/RunAction.hh index 40f41a210f..420342d5a6 100644 --- a/examples/basic/B4/B4c/include/B4RunAction.hh +++ b/examples/basic/B4/B4a/include/RunAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4RunAction.hh -/// \brief Definition of the B4RunAction class +/// \file RunAction.hh +/// \brief Definition of the RunAction class #ifndef B4RunAction_h #define B4RunAction_h 1 @@ -35,6 +35,9 @@ class G4Run; +namespace B4 +{ + /// Run action class /// /// It accumulates statistic and computes dispersion of the energy deposit @@ -47,22 +50,24 @@ class G4Run; /// - Track length in gap /// The same values are also saved in the ntuple. /// The histograms and ntuple are saved in the output file in a format -/// accoring to a selected technology in B4Analysis.hh. +/// according to a specified file extension. /// /// In EndOfRunAction(), the accumulated statistic and computed /// dispersion is printed. /// -class B4RunAction : public G4UserRunAction +class RunAction : public G4UserRunAction { public: - B4RunAction(); - virtual ~B4RunAction(); + RunAction(); + ~RunAction() override; - virtual void BeginOfRunAction(const G4Run*); - virtual void EndOfRunAction(const G4Run*); + void BeginOfRunAction(const G4Run*) override; + void EndOfRunAction(const G4Run*) override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4a/include/B4aSteppingAction.hh b/examples/basic/B4/B4a/include/SteppingAction.hh similarity index 79% rename from examples/basic/B4/B4a/include/B4aSteppingAction.hh rename to examples/basic/B4/B4a/include/SteppingAction.hh index 82c51f77ee..6a824e3201 100644 --- a/examples/basic/B4/B4a/include/B4aSteppingAction.hh +++ b/examples/basic/B4/B4a/include/SteppingAction.hh @@ -24,37 +24,46 @@ // ******************************************************************** // // -/// \file B4aSteppingAction.hh -/// \brief Definition of the B4aSteppingAction class +/// \file SteppingAction.hh +/// \brief Definition of the SteppingAction class #ifndef B4aSteppingAction_h #define B4aSteppingAction_h 1 #include "G4UserSteppingAction.hh" -class B4DetectorConstruction; -class B4aEventAction; +namespace B4 +{ + class DetectorConstruction; +} + +namespace B4a +{ + +class EventAction; /// Stepping action class. /// /// In UserSteppingAction() there are collected the energy deposit and track /// lengths of charged particles in Absober and Gap layers and -/// updated in B4aEventAction. +/// updated in EventAction. -class B4aSteppingAction : public G4UserSteppingAction +class SteppingAction : public G4UserSteppingAction { public: - B4aSteppingAction(const B4DetectorConstruction* detectorConstruction, - B4aEventAction* eventAction); - virtual ~B4aSteppingAction(); + SteppingAction(const B4::DetectorConstruction* detConstruction, + EventAction* eventAction); + ~SteppingAction() override; - virtual void UserSteppingAction(const G4Step* step); + void UserSteppingAction(const G4Step* step) override; private: - const B4DetectorConstruction* fDetConstruction; - B4aEventAction* fEventAction; + const B4::DetectorConstruction* fDetConstruction = nullptr; + EventAction* fEventAction = nullptr; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4a/src/ActionInitialization.cc b/examples/basic/B4/B4a/src/ActionInitialization.cc new file mode 100644 index 0000000000..e0ba121796 --- /dev/null +++ b/examples/basic/B4/B4a/src/ActionInitialization.cc @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +/// \file ActionInitialization.cc +/// \brief Implementation of the ActionInitialization class + +#include "ActionInitialization.hh" +#include "PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "EventAction.hh" +#include "SteppingAction.hh" +#include "DetectorConstruction.hh" + +using namespace B4; + +namespace B4a +{ + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::ActionInitialization + (DetectorConstruction* detConstruction) + : fDetConstruction(detConstruction) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::~ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::BuildForMaster() const +{ + SetUserAction(new RunAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::Build() const +{ + SetUserAction(new PrimaryGeneratorAction); + SetUserAction(new RunAction); + auto eventAction = new EventAction; + SetUserAction(eventAction); + SetUserAction(new SteppingAction(fDetConstruction,eventAction)); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4a/src/B4DetectorConstruction.cc b/examples/basic/B4/B4a/src/DetectorConstruction.cc similarity index 93% rename from examples/basic/B4/B4a/src/B4DetectorConstruction.cc rename to examples/basic/B4/B4a/src/DetectorConstruction.cc index 66144e0ac6..ccfa731ad1 100644 --- a/examples/basic/B4/B4a/src/B4DetectorConstruction.cc +++ b/examples/basic/B4/B4a/src/DetectorConstruction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B4DetectorConstruction.cc -/// \brief Implementation of the B4DetectorConstruction class +/// \file DetectorConstruction.cc +/// \brief Implementation of the DetectorConstruction class -#include "B4DetectorConstruction.hh" +#include "DetectorConstruction.hh" #include "G4Material.hh" #include "G4NistManager.hh" @@ -50,30 +50,29 @@ #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" +namespace B4 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ThreadLocal -G4GlobalMagFieldMessenger* B4DetectorConstruction::fMagFieldMessenger = nullptr; +G4GlobalMagFieldMessenger* DetectorConstruction::fMagFieldMessenger = nullptr; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4DetectorConstruction::B4DetectorConstruction() - : G4VUserDetectorConstruction(), - fAbsorberPV(nullptr), - fGapPV(nullptr), - fCheckOverlaps(true) +DetectorConstruction::DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4DetectorConstruction::~B4DetectorConstruction() +DetectorConstruction::~DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B4DetectorConstruction::Construct() +G4VPhysicalVolume* DetectorConstruction::Construct() { // Define materials DefineMaterials(); @@ -84,7 +83,7 @@ G4VPhysicalVolume* B4DetectorConstruction::Construct() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4DetectorConstruction::DefineMaterials() +void DetectorConstruction::DefineMaterials() { // Lead material defined using NIST Manager auto nistManager = G4NistManager::Instance(); @@ -107,7 +106,7 @@ void B4DetectorConstruction::DefineMaterials() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B4DetectorConstruction::DefineVolumes() +G4VPhysicalVolume* DetectorConstruction::DefineVolumes() { // Geometry parameters G4int nofLayers = 10; @@ -128,7 +127,7 @@ G4VPhysicalVolume* B4DetectorConstruction::DefineVolumes() if ( ! defaultMaterial || ! absorberMaterial || ! gapMaterial ) { G4ExceptionDescription msg; msg << "Cannot retrieve materials already defined."; - G4Exception("B4DetectorConstruction::DefineVolumes()", + G4Exception("DetectorConstruction::DefineVolumes()", "MyCode0001", FatalException, msg); } @@ -277,7 +276,7 @@ G4VPhysicalVolume* B4DetectorConstruction::DefineVolumes() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4DetectorConstruction::ConstructSDandField() +void DetectorConstruction::ConstructSDandField() { // Create global magnetic field messenger. // Uniform magnetic field is then created automatically if @@ -291,3 +290,6 @@ void B4DetectorConstruction::ConstructSDandField() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B4/B4a/src/B4aEventAction.cc b/examples/basic/B4/B4a/src/EventAction.cc similarity index 89% rename from examples/basic/B4/B4a/src/B4aEventAction.cc rename to examples/basic/B4/B4a/src/EventAction.cc index 2e76100cc1..f7be174e06 100644 --- a/examples/basic/B4/B4a/src/B4aEventAction.cc +++ b/examples/basic/B4/B4a/src/EventAction.cc @@ -24,13 +24,13 @@ // ******************************************************************** // // -/// \file B4aEventAction.cc -/// \brief Implementation of the B4aEventAction class +/// \file EventAction.cc +/// \brief Implementation of the B4a::EventAction class -#include "B4aEventAction.hh" -#include "B4RunAction.hh" -#include "B4Analysis.hh" +#include "EventAction.hh" +#include "RunAction.hh" +#include "G4AnalysisManager.hh" #include "G4RunManager.hh" #include "G4Event.hh" #include "G4UnitsTable.hh" @@ -38,24 +38,22 @@ #include "Randomize.hh" #include +namespace B4a +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4aEventAction::B4aEventAction() - : G4UserEventAction(), - fEnergyAbs(0.), - fEnergyGap(0.), - fTrackLAbs(0.), - fTrackLGap(0.) +EventAction::EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4aEventAction::~B4aEventAction() +EventAction::~EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4aEventAction::BeginOfEventAction(const G4Event* /*event*/) +void EventAction::BeginOfEventAction(const G4Event* /*event*/) { // initialisation per event fEnergyAbs = 0.; @@ -66,7 +64,7 @@ void B4aEventAction::BeginOfEventAction(const G4Event* /*event*/) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4aEventAction::EndOfEventAction(const G4Event* event) +void EventAction::EndOfEventAction(const G4Event* event) { // Accumulate statistics // @@ -109,3 +107,5 @@ void B4aEventAction::EndOfEventAction(const G4Event* event) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4c/src/B4PrimaryGeneratorAction.cc b/examples/basic/B4/B4a/src/PrimaryGeneratorAction.cc similarity index 89% rename from examples/basic/B4/B4c/src/B4PrimaryGeneratorAction.cc rename to examples/basic/B4/B4a/src/PrimaryGeneratorAction.cc index 41994a9778..4824f5ab0a 100644 --- a/examples/basic/B4/B4c/src/B4PrimaryGeneratorAction.cc +++ b/examples/basic/B4/B4a/src/PrimaryGeneratorAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B4PrimaryGeneratorAction.cc -/// \brief Implementation of the B4PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the PrimaryGeneratorAction class -#include "B4PrimaryGeneratorAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4RunManager.hh" #include "G4LogicalVolumeStore.hh" @@ -40,11 +40,12 @@ #include "G4SystemOfUnits.hh" #include "Randomize.hh" +namespace B4 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4PrimaryGeneratorAction::B4PrimaryGeneratorAction() - : G4VUserPrimaryGeneratorAction(), - fParticleGun(nullptr) +PrimaryGeneratorAction::PrimaryGeneratorAction() { G4int nofParticles = 1; fParticleGun = new G4ParticleGun(nofParticles); @@ -60,14 +61,14 @@ B4PrimaryGeneratorAction::B4PrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4PrimaryGeneratorAction::~B4PrimaryGeneratorAction() +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { // This function is called at the begining of event @@ -92,7 +93,7 @@ void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) msg << "World volume of box shape not found." << G4endl; msg << "Perhaps you have changed geometry." << G4endl; msg << "The gun will be place in the center."; - G4Exception("B4PrimaryGeneratorAction::GeneratePrimaries()", + G4Exception("PrimaryGeneratorAction::GeneratePrimaries()", "MyCode0002", JustWarning, msg); } @@ -105,3 +106,4 @@ void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} diff --git a/examples/basic/B4/B4c/src/B4RunAction.cc b/examples/basic/B4/B4a/src/RunAction.cc similarity index 89% rename from examples/basic/B4/B4c/src/B4RunAction.cc rename to examples/basic/B4/B4a/src/RunAction.cc index 8021ac11d9..53e8d5c82a 100644 --- a/examples/basic/B4/B4c/src/B4RunAction.cc +++ b/examples/basic/B4/B4a/src/RunAction.cc @@ -24,30 +24,31 @@ // ******************************************************************** // // -/// \file B4RunAction.cc -/// \brief Implementation of the B4RunAction class +/// \file RunAction.cc +/// \brief Implementation of the B4::RunAction class -#include "B4RunAction.hh" -#include "B4Analysis.hh" +#include "RunAction.hh" +#include "G4AnalysisManager.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +namespace B4 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4RunAction::B4RunAction() - : G4UserRunAction() +RunAction::RunAction() { // set printing event number per each event G4RunManager::GetRunManager()->SetPrintProgress(1); // Create analysis manager - // The choice of analysis technology is done via selectin of a namespace - // in B4Analysis.hh + // The choice of the output format is done via the specified + // file extension. auto analysisManager = G4AnalysisManager::Instance(); - G4cout << "Using " << analysisManager->GetType() << G4endl; // Create directories //analysisManager->SetHistoDirectoryName("histograms"); @@ -77,14 +78,13 @@ B4RunAction::B4RunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4RunAction::~B4RunAction() +RunAction::~RunAction() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4RunAction::BeginOfRunAction(const G4Run* /*run*/) +void RunAction::BeginOfRunAction(const G4Run* /*run*/) { //inform the runManager to save random number seed //G4RunManager::GetRunManager()->SetRandomNumberStore(true); @@ -94,13 +94,18 @@ void B4RunAction::BeginOfRunAction(const G4Run* /*run*/) // Open an output file // - G4String fileName = "B4"; + G4String fileName = "B4.root"; + // Other supported output types: + // G4String fileName = "B4.csv"; + // G4String fileName = "B4.hdf5"; + // G4String fileName = "B4.xml"; analysisManager->OpenFile(fileName); + G4cout << "Using " << analysisManager->GetType() << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4RunAction::EndOfRunAction(const G4Run* /*run*/) +void RunAction::EndOfRunAction(const G4Run* /*run*/) { // print histogram statistics // @@ -142,3 +147,5 @@ void B4RunAction::EndOfRunAction(const G4Run* /*run*/) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4a/src/B4aSteppingAction.cc b/examples/basic/B4/B4a/src/SteppingAction.cc similarity index 83% rename from examples/basic/B4/B4a/src/B4aSteppingAction.cc rename to examples/basic/B4/B4a/src/SteppingAction.cc index 09d28b9b6c..652cecdd15 100644 --- a/examples/basic/B4/B4a/src/B4aSteppingAction.cc +++ b/examples/basic/B4/B4a/src/SteppingAction.cc @@ -24,34 +24,37 @@ // ******************************************************************** // // -/// \file B4aSteppingAction.cc -/// \brief Implementation of the B4aSteppingAction class +/// \file SteppingAction.cc +/// \brief Implementation of the SteppingAction class -#include "B4aSteppingAction.hh" -#include "B4aEventAction.hh" -#include "B4DetectorConstruction.hh" +#include "SteppingAction.hh" +#include "EventAction.hh" +#include "DetectorConstruction.hh" #include "G4Step.hh" #include "G4RunManager.hh" +using namespace B4; + +namespace B4a +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4aSteppingAction::B4aSteppingAction( - const B4DetectorConstruction* detectorConstruction, - B4aEventAction* eventAction) - : G4UserSteppingAction(), - fDetConstruction(detectorConstruction), +SteppingAction::SteppingAction(const DetectorConstruction* detConstruction, + EventAction* eventAction) + : fDetConstruction(detConstruction), fEventAction(eventAction) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4aSteppingAction::~B4aSteppingAction() +SteppingAction::~SteppingAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4aSteppingAction::UserSteppingAction(const G4Step* step) +void SteppingAction::UserSteppingAction(const G4Step* step) { // Collect energy and track length step by step @@ -77,3 +80,5 @@ void B4aSteppingAction::UserSteppingAction(const G4Step* step) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4b/CMakeLists.txt b/examples/basic/B4/B4b/CMakeLists.txt index bb17e63430..9b43860162 100644 --- a/examples/basic/B4/B4b/CMakeLists.txt +++ b/examples/basic/B4/B4b/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B4b) #---------------------------------------------------------------------------- diff --git a/examples/basic/B4/B4b/exampleB4b.cc b/examples/basic/B4/B4b/exampleB4b.cc index 23da2acfaf..db8e08dd9a 100644 --- a/examples/basic/B4/B4b/exampleB4b.cc +++ b/examples/basic/B4/B4b/exampleB4b.cc @@ -27,8 +27,8 @@ /// \file exampleB4b.cc /// \brief Main program of the B4b example -#include "B4DetectorConstruction.hh" -#include "B4bActionInitialization.hh" +#include "DetectorConstruction.hh" +#include "ActionInitialization.hh" #include "G4RunManagerFactory.hh" #include "G4SteppingVerbose.hh" @@ -44,7 +44,7 @@ namespace { void PrintUsage() { G4cerr << " Usage: " << G4endl; - G4cerr << " exampleB4a [-m macro ] [-u UIsession] [-t nThreads] [-vDefault]" + G4cerr << " exampleB4b [-m macro ] [-u UIsession] [-t nThreads] [-vDefault]" << G4endl; G4cerr << " note: -t option is available only for multi-threaded mode." << G4endl; @@ -114,13 +114,13 @@ int main(int argc,char** argv) // Set mandatory initialization classes // - auto detConstruction = new B4DetectorConstruction(); + auto detConstruction = new B4::DetectorConstruction(); runManager->SetUserInitialization(detConstruction); auto physicsList = new FTFP_BERT; runManager->SetUserInitialization(physicsList); - auto actionInitialization = new B4bActionInitialization(detConstruction); + auto actionInitialization = new B4b::ActionInitialization(detConstruction); runManager->SetUserInitialization(actionInitialization); // Initialize visualization diff --git a/examples/basic/B4/B4b/exampleB4b.out b/examples/basic/B4/B4b/exampleB4b.out index 6b2a5c1064..6cc0629b1a 100644 --- a/examples/basic/B4/B4b/exampleB4b.out +++ b/examples/basic/B4/B4b/exampleB4b.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -21,16 +21,6 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo <<< Geant4 Physics List simulation engine: FTFP_BERT -Using Root - --------- WWWW ------- G4Exception-START -------- WWWW ------- -*** G4Exception : Analysis_W013 - issued by : G4RootNtupleFileManager::SetNtupleMergingMode -Merging ntuples is not applicable in sequential application. -Setting was ignored. -*** This is just a warning message. *** --------- WWWW -------- G4Exception-END --------- WWWW ------- - Visualization Manager instantiating with verbosity "warnings (3)"... Visualization Manager initialising... Registering graphics systems... @@ -39,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -118,9 +106,9 @@ Some /vis commands (optionally) take a string to specify colour. -Checking overlaps for volume Calorimeter (G4Box) ... OK! -Checking overlaps for volume Abso (G4Box) ... OK! -Checking overlaps for volume Gap (G4Box) ... OK! +Checking overlaps for volume Calorimeter:0 (G4Box) ... OK! +Checking overlaps for volume Abso:0 (G4Box) ... OK! +Checking overlaps for volume Gap:0 (G4Box) ... OK! ------------------------------------------------------------ ---> The calorimeter is 10 layers of: [ 10mm of G4_Pb + 5mm of liquidArgon ] @@ -133,32 +121,99 @@ Checking overlaps for volume Gap (G4Box) ... OK! for neutron : 3 to 6 GeV ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -168,25 +223,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -196,29 +251,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -226,31 +281,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -259,12 +314,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -272,12 +327,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -285,31 +340,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -317,31 +372,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -349,31 +404,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -381,32 +436,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -414,32 +469,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -447,31 +502,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -479,27 +534,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -508,17 +563,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -526,67 +581,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -594,13 +649,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -608,13 +663,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -622,12 +677,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -635,13 +690,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -649,13 +704,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -663,13 +718,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -677,60 +732,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -738,27 +793,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -766,25 +821,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -792,25 +847,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -818,13 +873,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -847,7 +902,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -855,19 +909,31 @@ G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. ### Run 0 start. + +-------- WWWW ------- G4Exception-START -------- WWWW ------- +*** G4Exception : Analysis_W001 + issued by : G4RootNtupleFileManager::SetNtupleMergingMode +Merging ntuples is not applicable in sequential application. +Setting was ignored. +*** This is just a warning message. *** +-------- WWWW -------- G4Exception-END --------- WWWW ------- + +... set ntuple merging row mode : row-wise - done ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 276.418 MeV total track length: 20.0351 cm - Gap: total energy: 16.7054 MeV total track length: 8.39188 cm + Absorber: total energy: 281.979 MeV total track length: 20.3632 cm + Gap: total energy: 7.05731 MeV total track length: 3.5668 cm ----> print histograms statistic for the entire run - EAbs : mean = 276.418 MeV rms = 0 meV - EGap : mean = 16.7054 MeV rms = 0 meV - LAbs : mean = 20.0351 cm rms = 0 fm - LGap : mean = 8.39188 cm rms = 0 fm + EAbs : mean = 281.979 MeV rms = 0 eV + EGap : mean = 7.05731 MeV rms = 0 eV + LAbs : mean = 20.3632 cm rms = 0 fm + LGap : mean = 3.5668 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. @@ -895,7 +961,7 @@ See commands in /vis/modeling/trajectories/ for other options. hIoni, hIoni, hIoni, hIoni hIoni, hIoni, hIoni, hIoni hIoni, hIoni, photonNuclear, electronNuclear - muonNuclear, Decay, hadElastic, hadElastic + positronNuclear, muonNuclear, Decay, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic @@ -910,793 +976,63 @@ See commands in /vis/modeling/trajectories/ for other options. hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, neutronInelastic, nCapture - protonInelastic, pi+Inelastic, pi-Inelastic, kaon+Inelastic - kaon-Inelastic, kaon0LInelastic, kaon0SInelastic,anti_protonInelastic -anti_neutronInelastic,anti_deuteronInelastic,anti_tritonInelastic, anti_He3Inelastic -anti_alphaInelastic, lambdaInelastic, sigma+Inelastic, sigma-Inelastic - xi0Inelastic, xi-Inelastic, omega-Inelastic,anti_lambdaInelastic -anti_sigma+Inelastic,anti_sigma-Inelastic, anti_xi0Inelastic, anti_xi-Inelastic -anti_omega-Inelastic, D+Inelastic, D0Inelastic, D-Inelastic - anti_D0Inelastic, Ds+Inelastic, Ds-Inelastic, B+Inelastic - B0Inelastic, B-Inelastic, anti_B0Inelastic, Bs0Inelastic - anti_Bs0Inelastic, Bc+Inelastic, Bc-Inelastic, lambda_c+Inelastic - xi_c+Inelastic, xi_c0Inelastic, omega_c0Inelastic, lambda_bInelastic - xi_b0Inelastic, xi_b-Inelastic, omega_b-Inelastic,anti_lambda_c+Inelastic -anti_xi_c+Inelastic,anti_xi_c0Inelastic,anti_omega_c0Inelastic,anti_lambda_bInelastic -anti_xi_b0Inelastic,anti_xi_b-Inelastic,anti_omega_b-Inelastic,hFritiofCaptureAtRest -hBertiniCaptureAtRest,muMinusCaptureAtRest, dInelastic, tInelastic - He3Inelastic, alphaInelastic, ionInelastic, nKiller - - -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + hadElastic, hadElastic, hadElastic, neutronInelastic + nCapture, protonInelastic, pi+Inelastic, pi-Inelastic + kaon+Inelastic, kaon-Inelastic, kaon0LInelastic, kaon0SInelastic +anti_protonInelastic,anti_neutronInelastic,anti_deuteronInelastic,anti_tritonInelastic + anti_He3Inelastic,anti_alphaInelastic, lambdaInelastic, sigma+Inelastic + sigma-Inelastic, xi0Inelastic, xi-Inelastic, omega-Inelastic +anti_lambdaInelastic,anti_sigma+Inelastic,anti_sigma-Inelastic, anti_xi0Inelastic + anti_xi-Inelastic,anti_omega-Inelastic, D+Inelastic, D0Inelastic + D-Inelastic, anti_D0Inelastic, Ds+Inelastic, Ds-Inelastic + B+Inelastic, B0Inelastic, B-Inelastic, anti_B0Inelastic + Bs0Inelastic, anti_Bs0Inelastic, Bc+Inelastic, Bc-Inelastic + lambda_c+Inelastic, xi_c+Inelastic, xi_c0Inelastic, omega_c0Inelastic + lambda_bInelastic, xi_b0Inelastic, xi_b-Inelastic, omega_b-Inelastic +anti_lambda_c+Inelastic,anti_xi_c+Inelastic,anti_xi_c0Inelastic,anti_omega_c0Inelastic +anti_lambda_bInelastic,anti_xi_b0Inelastic,anti_xi_b-Inelastic,anti_omega_b-Inelastic +hFritiofCaptureAtRest,hBertiniCaptureAtRest,muMinusCaptureAtRest, dInelastic + tInelastic, He3Inelastic, alphaInelastic, ionInelastic + nKiller ### Run 1 starts. ### Run 1 start. ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 276.851 MeV total track length: 20.6185 cm - Gap: total energy: 15.9299 MeV total track length: 8.21284 cm + Absorber: total energy: 280.59 MeV total track length: 20.2565 cm + Gap: total energy: 17.1134 MeV total track length: 8.57952 cm ----> print histograms statistic for the entire run - EAbs : mean = 276.851 MeV rms = 0 meV - EGap : mean = 15.9299 MeV rms = 0 meV - LAbs : mean = 20.6185 cm rms = 0 fm - LGap : mean = 8.21284 cm rms = 0 fm + EAbs : mean = 280.59 MeV rms = 0 eV + EGap : mean = 17.1134 MeV rms = 0 eV + LAbs : mean = 20.2565 cm rms = 0 fm + LGap : mean = 8.57952 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. - -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV ### Run 2 starts. ### Run 2 start. ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 468.054 MeV total track length: 34.15 cm - Gap: total energy: 27.9107 MeV total track length: 14.3207 cm + Absorber: total energy: 469.283 MeV total track length: 33.8386 cm + Gap: total energy: 18.5204 MeV total track length: 9.32324 cm ----> print histograms statistic for the entire run - EAbs : mean = 468.054 MeV rms = 0 meV - EGap : mean = 27.9107 MeV rms = 0 meV - LAbs : mean = 34.15 cm rms = 0 fm - LGap : mean = 14.3207 cm rms = 0 fm + EAbs : mean = 469.283 MeV rms = 0 eV + EGap : mean = 18.5204 MeV rms = 0 eV + LAbs : mean = 33.8386 cm rms = 0 fm + LGap : mean = 9.32324 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. diff --git a/examples/basic/B4/B4b/include/B4bActionInitialization.hh b/examples/basic/B4/B4b/include/ActionInitialization.hh similarity index 77% rename from examples/basic/B4/B4b/include/B4bActionInitialization.hh rename to examples/basic/B4/B4b/include/ActionInitialization.hh index 49a31478bd..59782ac24e 100644 --- a/examples/basic/B4/B4b/include/B4bActionInitialization.hh +++ b/examples/basic/B4/B4b/include/ActionInitialization.hh @@ -24,31 +24,40 @@ // ******************************************************************** // // -/// \file B4bActionInitialization.hh -/// \brief Definition of the B4bActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the ActionInitialization class -#ifndef B4bActionInitialization_h -#define B4bActionInitialization_h 1 +#ifndef B4aActionInitialization_h +#define B4aActionInitialization_h 1 #include "G4VUserActionInitialization.hh" -class B4DetectorConstruction; + +namespace B4 +{ + class DetectorConstruction; +} + +namespace B4b +{ /// Action initialization class. -/// -class B4bActionInitialization : public G4VUserActionInitialization +class ActionInitialization : public G4VUserActionInitialization { public: - B4bActionInitialization(B4DetectorConstruction*); - virtual ~B4bActionInitialization(); + ActionInitialization(B4::DetectorConstruction*); + ~ActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; + void BuildForMaster() const override; + void Build() const override; private: - B4DetectorConstruction* fDetConstruction; + B4::DetectorConstruction* fDetConstruction = nullptr; }; +} + #endif + diff --git a/examples/basic/B4/B4b/include/B4Analysis.hh b/examples/basic/B4/B4b/include/B4Analysis.hh deleted file mode 100644 index 78c4412df4..0000000000 --- a/examples/basic/B4/B4b/include/B4Analysis.hh +++ /dev/null @@ -1,40 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file B4Analysis.hh -/// \brief Selection of the analysis technology - -#ifndef B4Analysis_h -#define B4Analysis_h 1 - -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" - -//#include "G4GenericAnalysisManager.hh" -//using G4AnalysisManager = G4GenericAnalysisManager; - -#endif diff --git a/examples/basic/B4/B4b/include/B4DetectorConstruction.hh b/examples/basic/B4/B4b/include/DetectorConstruction.hh similarity index 80% rename from examples/basic/B4/B4b/include/B4DetectorConstruction.hh rename to examples/basic/B4/B4b/include/DetectorConstruction.hh index 9b2379571b..17abcdfb6f 100644 --- a/examples/basic/B4/B4b/include/B4DetectorConstruction.hh +++ b/examples/basic/B4/B4b/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4DetectorConstruction.hh -/// \brief Definition of the B4DetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the DetectorConstruction class #ifndef B4DetectorConstruction_h #define B4DetectorConstruction_h 1 @@ -36,6 +36,9 @@ class G4VPhysicalVolume; class G4GlobalMagFieldMessenger; +namespace B4 +{ + /// Detector construction class to define materials and geometry. /// The calorimeter is a box made of a given number of layers. A layer consists /// of an absorber plate and of a detection gap. The layer is replicated. @@ -50,15 +53,15 @@ class G4GlobalMagFieldMessenger; /// In addition a transverse uniform magnetic field is defined /// via G4GlobalMagFieldMessenger class. -class B4DetectorConstruction : public G4VUserDetectorConstruction +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B4DetectorConstruction(); - virtual ~B4DetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; public: - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; // get methods // @@ -76,22 +79,23 @@ class B4DetectorConstruction : public G4VUserDetectorConstruction static G4ThreadLocal G4GlobalMagFieldMessenger* fMagFieldMessenger; // magnetic field messenger - G4VPhysicalVolume* fAbsorberPV; // the absorber physical volume - G4VPhysicalVolume* fGapPV; // the gap physical volume + G4VPhysicalVolume* fAbsorberPV = nullptr; // the absorber physical volume + G4VPhysicalVolume* fGapPV = nullptr; // the gap physical volume - G4bool fCheckOverlaps; // option to activate checking of volumes overlaps + G4bool fCheckOverlaps = true; // option to activate checking of volumes overlaps }; // inline functions -inline const G4VPhysicalVolume* B4DetectorConstruction::GetAbsorberPV() const { +inline const G4VPhysicalVolume* DetectorConstruction::GetAbsorberPV() const { return fAbsorberPV; } -inline const G4VPhysicalVolume* B4DetectorConstruction::GetGapPV() const { +inline const G4VPhysicalVolume* DetectorConstruction::GetGapPV() const { return fGapPV; } +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B4/B4b/include/B4bEventAction.hh b/examples/basic/B4/B4b/include/EventAction.hh similarity index 86% rename from examples/basic/B4/B4b/include/B4bEventAction.hh rename to examples/basic/B4/B4b/include/EventAction.hh index deac38207d..d454455d11 100644 --- a/examples/basic/B4/B4b/include/B4bEventAction.hh +++ b/examples/basic/B4/B4b/include/EventAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4bEventAction.hh -/// \brief Definition of the B4bEventAction class +/// \file EventAction.hh +/// \brief Definition of the B4b::EventAction class #ifndef B4bEventAction_h #define B4bEventAction_h 1 @@ -33,20 +33,23 @@ #include "G4UserEventAction.hh" #include "globals.hh" +namespace B4b +{ + /// Event action class /// /// In EndOfEventAction(), it prints the accumulated quantities of the energy /// deposit and track lengths of charged particles in Absober and Gap layers -/// stored in B4bRunData object. +/// stored in RunData object. -class B4bEventAction : public G4UserEventAction +class EventAction : public G4UserEventAction { public: - B4bEventAction(); - virtual ~B4bEventAction(); + EventAction(); + ~EventAction() override; - virtual void BeginOfEventAction(const G4Event* event); - virtual void EndOfEventAction(const G4Event* event); + void BeginOfEventAction(const G4Event* event) override; + void EndOfEventAction(const G4Event* event) override; private: // methods @@ -54,6 +57,8 @@ class B4bEventAction : public G4UserEventAction G4double gapEdep, G4double gapTrackLength) const; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4b/include/B4PrimaryGeneratorAction.hh b/examples/basic/B4/B4b/include/PrimaryGeneratorAction.hh similarity index 86% rename from examples/basic/B4/B4b/include/B4PrimaryGeneratorAction.hh rename to examples/basic/B4/B4b/include/PrimaryGeneratorAction.hh index 9e2a99aa73..debeaa24a4 100644 --- a/examples/basic/B4/B4b/include/B4PrimaryGeneratorAction.hh +++ b/examples/basic/B4/B4b/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4PrimaryGeneratorAction.hh -/// \brief Definition of the B4PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the PrimaryGeneratorAction class #ifndef B4PrimaryGeneratorAction_h #define B4PrimaryGeneratorAction_h 1 @@ -36,6 +36,9 @@ class G4ParticleGun; class G4Event; +namespace B4 +{ + /// The primary generator action class with particle gum. /// /// It defines a single particle which hits the calorimeter @@ -43,21 +46,23 @@ class G4Event; /// can be changed via the G4 build-in commands of G4ParticleGun class /// (see the macros provided with this example). -class B4PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B4PrimaryGeneratorAction(); - virtual ~B4PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event* event); + void GeneratePrimaries(G4Event* event) override; // set methods void SetRandomFlag(G4bool value); private: - G4ParticleGun* fParticleGun; // G4 particle gun + G4ParticleGun* fParticleGun = nullptr; // G4 particle gun }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4b/include/B4bRunAction.hh b/examples/basic/B4/B4b/include/RunAction.hh similarity index 87% rename from examples/basic/B4/B4b/include/B4bRunAction.hh rename to examples/basic/B4/B4b/include/RunAction.hh index 30eb7ff836..65aa7dde6e 100644 --- a/examples/basic/B4/B4b/include/B4bRunAction.hh +++ b/examples/basic/B4/B4b/include/RunAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4bRunAction.hh -/// \brief Definition of the B4bRunAction class +/// \file RunAction.hh +/// \brief Definition of the B4b::RunAction class #ifndef B4bRunAction_h #define B4bRunAction_h 1 @@ -35,6 +35,9 @@ class G4Run; +namespace B4b +{ + /// Run action class /// /// It accumulates statistic and computes dispersion of the energy deposit @@ -47,24 +50,26 @@ class G4Run; /// - Track length in gap /// The same values are also saved in the ntuple. /// The histograms and ntuple are saved in the output file in a format -/// accoring to a selected technology in B4Analysis.hh. +/// according to a specified file extension. /// /// In EndOfRunAction(), the accumulated statistic and computed /// dispersion is printed. /// -class B4bRunAction : public G4UserRunAction +class RunAction : public G4UserRunAction { public: - B4bRunAction(); - virtual ~B4bRunAction(); + RunAction(); + ~RunAction() override; - virtual G4Run* GenerateRun(); + G4Run* GenerateRun() override; - virtual void BeginOfRunAction(const G4Run*); - virtual void EndOfRunAction(const G4Run*); + void BeginOfRunAction(const G4Run*) override; + void EndOfRunAction(const G4Run*) override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4b/include/B4bRunData.hh b/examples/basic/B4/B4b/include/RunData.hh similarity index 80% rename from examples/basic/B4/B4b/include/B4bRunData.hh rename to examples/basic/B4/B4b/include/RunData.hh index 4725022980..1c5ede9a5d 100644 --- a/examples/basic/B4/B4b/include/B4bRunData.hh +++ b/examples/basic/B4/B4b/include/RunData.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4bRunData.hh -/// \brief Definition of the B4bRunData class +/// \file RunData.hh +/// \brief Definition of the B4b::RunData class #ifndef B4bRunData_h #define B4bRunData_h 1 @@ -35,6 +35,9 @@ #include +namespace B4b +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... const G4int kAbs = 0; @@ -50,15 +53,15 @@ const G4int kDim = 2; /// is introduced for each quantity: /// - fEdep[], fTrackLength[]. /// -/// The data are collected step by step in B4bSteppingAction, and +/// The data are collected step by step in SteppingAction, and /// the accumulated values are filled in histograms and entuple -/// event by event in B4EventAction. +/// event by event in EventAction. -class B4bRunData : public G4Run +class RunData : public G4Run { public: - B4bRunData(); - virtual ~B4bRunData(); + RunData(); + ~RunData() override; void Add(G4int id, G4double de, G4double dl); void FillPerEvent(); @@ -71,30 +74,32 @@ public: G4double GetTrackLength(G4int id) const; private: - std::array fVolumeNames; - std::array fEdep; - std::array fTrackLength; + std::array fVolumeNames = { "Absorber", "Gap" }; + std::array fEdep = { 0., 0. }; + std::array fTrackLength = { 0., 0. }; }; // inline functions -inline void B4bRunData::Add(G4int id, G4double de, G4double dl) { +inline void RunData::Add(G4int id, G4double de, G4double dl) { fEdep[id] += de; fTrackLength[id] += dl; } -inline G4String B4bRunData::GetVolumeName(G4int id) const { +inline G4String RunData::GetVolumeName(G4int id) const { return fVolumeNames[id]; } -inline G4double B4bRunData::GetEdep(G4int id) const { +inline G4double RunData::GetEdep(G4int id) const { return fEdep[id]; } -inline G4double B4bRunData::GetTrackLength(G4int id) const { +inline G4double RunData::GetTrackLength(G4int id) const { return fTrackLength[id]; } +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4b/include/B4bSteppingAction.hh b/examples/basic/B4/B4b/include/SteppingAction.hh similarity index 82% rename from examples/basic/B4/B4b/include/B4bSteppingAction.hh rename to examples/basic/B4/B4b/include/SteppingAction.hh index bdebdbe45d..0d7cffd3b4 100644 --- a/examples/basic/B4/B4b/include/B4bSteppingAction.hh +++ b/examples/basic/B4/B4b/include/SteppingAction.hh @@ -24,34 +24,42 @@ // ******************************************************************** // // -/// \file B4bSteppingAction.hh -/// \brief Definition of the B4bSteppingAction class +/// \file SteppingAction.hh +/// \brief Definition of the B4b::SteppingAction class #ifndef B4bSteppingAction_h #define B4bSteppingAction_h 1 #include "G4UserSteppingAction.hh" -class B4DetectorConstruction; +namespace B4 +{ +class DetectorConstruction; +} + +namespace B4b +{ /// Stepping action class. /// /// In UserSteppingAction() there are collected the energy deposit and track /// lengths of charged particles in Absober and Gap layers and -/// updated in B4bRunData object. +/// updated in RunData object. -class B4bSteppingAction : public G4UserSteppingAction +class SteppingAction : public G4UserSteppingAction { public: - B4bSteppingAction(const B4DetectorConstruction* detectorConstruction); - virtual ~B4bSteppingAction(); + SteppingAction(const B4::DetectorConstruction* detConstruction); + ~SteppingAction() override; - virtual void UserSteppingAction(const G4Step* step); + void UserSteppingAction(const G4Step* step) override; private: - const B4DetectorConstruction* fDetConstruction; + const B4::DetectorConstruction* fDetConstruction = nullptr; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4b/src/ActionInitialization.cc b/examples/basic/B4/B4b/src/ActionInitialization.cc new file mode 100644 index 0000000000..05ba69e485 --- /dev/null +++ b/examples/basic/B4/B4b/src/ActionInitialization.cc @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +/// \file ActionInitialization.cc +/// \brief Implementation of the B4b::ActionInitialization class + +#include "ActionInitialization.hh" +#include "PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "EventAction.hh" +#include "SteppingAction.hh" +#include "G4MTRunManager.hh" +#include "DetectorConstruction.hh" + +using namespace B4; + +namespace B4b +{ + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::ActionInitialization + (DetectorConstruction* detConstruction) + : fDetConstruction(detConstruction) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::~ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::BuildForMaster() const +{ + SetUserAction(new RunAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::Build() const +{ + SetUserAction(new PrimaryGeneratorAction); + SetUserAction(new RunAction); + SetUserAction(new EventAction); + SetUserAction(new SteppingAction(fDetConstruction)); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4b/src/B4bActionInitialization.cc b/examples/basic/B4/B4b/src/B4bActionInitialization.cc deleted file mode 100644 index 086662f80b..0000000000 --- a/examples/basic/B4/B4b/src/B4bActionInitialization.cc +++ /dev/null @@ -1,68 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file B4bActionInitialization.cc -/// \brief Implementation of the B4bActionInitialization class - -#include "B4bActionInitialization.hh" -#include "B4PrimaryGeneratorAction.hh" -#include "B4bRunAction.hh" -#include "B4bEventAction.hh" -#include "B4bSteppingAction.hh" -#include "G4MTRunManager.hh" -#include "B4DetectorConstruction.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B4bActionInitialization::B4bActionInitialization - (B4DetectorConstruction* detConstruction) - : G4VUserActionInitialization(), - fDetConstruction(detConstruction) -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B4bActionInitialization::~B4bActionInitialization() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B4bActionInitialization::BuildForMaster() const -{ - SetUserAction(new B4bRunAction); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B4bActionInitialization::Build() const -{ - SetUserAction(new B4PrimaryGeneratorAction); - SetUserAction(new B4bRunAction); - SetUserAction(new B4bEventAction); - SetUserAction(new B4bSteppingAction(fDetConstruction)); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B4/B4b/src/B4DetectorConstruction.cc b/examples/basic/B4/B4b/src/DetectorConstruction.cc similarity index 93% rename from examples/basic/B4/B4b/src/B4DetectorConstruction.cc rename to examples/basic/B4/B4b/src/DetectorConstruction.cc index 66144e0ac6..624342952a 100644 --- a/examples/basic/B4/B4b/src/B4DetectorConstruction.cc +++ b/examples/basic/B4/B4b/src/DetectorConstruction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B4DetectorConstruction.cc -/// \brief Implementation of the B4DetectorConstruction class +/// \file DetectorConstruction.cc +/// \brief Implementation of the B4:DetectorConstruction class -#include "B4DetectorConstruction.hh" +#include "DetectorConstruction.hh" #include "G4Material.hh" #include "G4NistManager.hh" @@ -50,30 +50,29 @@ #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" +namespace B4 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ThreadLocal -G4GlobalMagFieldMessenger* B4DetectorConstruction::fMagFieldMessenger = nullptr; +G4GlobalMagFieldMessenger* DetectorConstruction::fMagFieldMessenger = nullptr; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4DetectorConstruction::B4DetectorConstruction() - : G4VUserDetectorConstruction(), - fAbsorberPV(nullptr), - fGapPV(nullptr), - fCheckOverlaps(true) +DetectorConstruction::DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4DetectorConstruction::~B4DetectorConstruction() +DetectorConstruction::~DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B4DetectorConstruction::Construct() +G4VPhysicalVolume* DetectorConstruction::Construct() { // Define materials DefineMaterials(); @@ -84,7 +83,7 @@ G4VPhysicalVolume* B4DetectorConstruction::Construct() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4DetectorConstruction::DefineMaterials() +void DetectorConstruction::DefineMaterials() { // Lead material defined using NIST Manager auto nistManager = G4NistManager::Instance(); @@ -107,7 +106,7 @@ void B4DetectorConstruction::DefineMaterials() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B4DetectorConstruction::DefineVolumes() +G4VPhysicalVolume* DetectorConstruction::DefineVolumes() { // Geometry parameters G4int nofLayers = 10; @@ -128,7 +127,7 @@ G4VPhysicalVolume* B4DetectorConstruction::DefineVolumes() if ( ! defaultMaterial || ! absorberMaterial || ! gapMaterial ) { G4ExceptionDescription msg; msg << "Cannot retrieve materials already defined."; - G4Exception("B4DetectorConstruction::DefineVolumes()", + G4Exception("DetectorConstruction::DefineVolumes()", "MyCode0001", FatalException, msg); } @@ -277,7 +276,7 @@ G4VPhysicalVolume* B4DetectorConstruction::DefineVolumes() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4DetectorConstruction::ConstructSDandField() +void DetectorConstruction::ConstructSDandField() { // Create global magnetic field messenger. // Uniform magnetic field is then created automatically if @@ -291,3 +290,6 @@ void B4DetectorConstruction::ConstructSDandField() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} + diff --git a/examples/basic/B4/B4b/src/B4bEventAction.cc b/examples/basic/B4/B4b/src/EventAction.cc similarity index 88% rename from examples/basic/B4/B4b/src/B4bEventAction.cc rename to examples/basic/B4/B4b/src/EventAction.cc index af7c3f5879..75706bc9e2 100644 --- a/examples/basic/B4/B4b/src/B4bEventAction.cc +++ b/examples/basic/B4/B4b/src/EventAction.cc @@ -24,11 +24,11 @@ // ******************************************************************** // // -/// \file B4bEventAction.cc -/// \brief Implementation of the B4bEventAction class +/// \file EventAction.cc +/// \brief Implementation of the B4b::EventAction class -#include "B4bEventAction.hh" -#include "B4bRunData.hh" +#include "EventAction.hh" +#include "RunData.hh" #include "G4RunManager.hh" #include "G4Event.hh" @@ -37,20 +37,22 @@ #include "Randomize.hh" #include +namespace B4b +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4bEventAction::B4bEventAction() - : G4UserEventAction() +EventAction::EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4bEventAction::~B4bEventAction() +EventAction::~EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4bEventAction::PrintEventStatistics( +void EventAction::PrintEventStatistics( G4double absoEdep, G4double absoTrackLength, G4double gapEdep, G4double gapTrackLength) const { @@ -70,20 +72,20 @@ void B4bEventAction::PrintEventStatistics( //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4bEventAction::BeginOfEventAction(const G4Event* /*event*/) +void EventAction::BeginOfEventAction(const G4Event* /*event*/) { auto runData - = static_cast( + = static_cast( G4RunManager::GetRunManager()->GetNonConstCurrentRun()); runData->Reset(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4bEventAction::EndOfEventAction(const G4Event* event) +void EventAction::EndOfEventAction(const G4Event* event) { auto runData - = static_cast( + = static_cast( G4RunManager::GetRunManager()->GetNonConstCurrentRun()); runData->FillPerEvent(); @@ -103,3 +105,5 @@ void B4bEventAction::EndOfEventAction(const G4Event* event) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4d/src/B4PrimaryGeneratorAction.cc b/examples/basic/B4/B4b/src/PrimaryGeneratorAction.cc similarity index 89% rename from examples/basic/B4/B4d/src/B4PrimaryGeneratorAction.cc rename to examples/basic/B4/B4b/src/PrimaryGeneratorAction.cc index 41994a9778..471aa628bb 100644 --- a/examples/basic/B4/B4d/src/B4PrimaryGeneratorAction.cc +++ b/examples/basic/B4/B4b/src/PrimaryGeneratorAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B4PrimaryGeneratorAction.cc -/// \brief Implementation of the B4PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the B4::PrimaryGeneratorAction class -#include "B4PrimaryGeneratorAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4RunManager.hh" #include "G4LogicalVolumeStore.hh" @@ -40,11 +40,12 @@ #include "G4SystemOfUnits.hh" #include "Randomize.hh" +namespace B4 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4PrimaryGeneratorAction::B4PrimaryGeneratorAction() - : G4VUserPrimaryGeneratorAction(), - fParticleGun(nullptr) +PrimaryGeneratorAction::PrimaryGeneratorAction() { G4int nofParticles = 1; fParticleGun = new G4ParticleGun(nofParticles); @@ -60,14 +61,14 @@ B4PrimaryGeneratorAction::B4PrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4PrimaryGeneratorAction::~B4PrimaryGeneratorAction() +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { // This function is called at the begining of event @@ -92,7 +93,7 @@ void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) msg << "World volume of box shape not found." << G4endl; msg << "Perhaps you have changed geometry." << G4endl; msg << "The gun will be place in the center."; - G4Exception("B4PrimaryGeneratorAction::GeneratePrimaries()", + G4Exception("PrimaryGeneratorAction::GeneratePrimaries()", "MyCode0002", JustWarning, msg); } @@ -105,3 +106,4 @@ void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} diff --git a/examples/basic/B4/B4b/src/B4bRunAction.cc b/examples/basic/B4/B4b/src/RunAction.cc similarity index 89% rename from examples/basic/B4/B4b/src/B4bRunAction.cc rename to examples/basic/B4/B4b/src/RunAction.cc index 8ea2dce9a0..89fd367f18 100644 --- a/examples/basic/B4/B4b/src/B4bRunAction.cc +++ b/examples/basic/B4/B4b/src/RunAction.cc @@ -24,31 +24,32 @@ // ******************************************************************** // // -/// \file B4bRunAction.cc -/// \brief Implementation of the B4bRunAction class +/// \file RunAction.cc +/// \brief Implementation of the B4b::RunAction class -#include "B4bRunAction.hh" -#include "B4bRunData.hh" -#include "B4Analysis.hh" +#include "RunAction.hh" +#include "RunData.hh" +#include "G4AnalysisManager.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +namespace B4b +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4bRunAction::B4bRunAction() - : G4UserRunAction() +RunAction::RunAction() { // set printing event number per each event G4RunManager::GetRunManager()->SetPrintProgress(1); // Create analysis manager // The choice of analysis technology is done via selectin of a namespace - // in B4Analysis.hh + // in Analysis.hh auto analysisManager = G4AnalysisManager::Instance(); - G4cout << "Using " << analysisManager->GetType() << G4endl; // Create directories //analysisManager->SetHistoDirectoryName("histograms"); @@ -78,21 +79,20 @@ B4bRunAction::B4bRunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4bRunAction::~B4bRunAction() +RunAction::~RunAction() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4Run* B4bRunAction::GenerateRun() +G4Run* RunAction::GenerateRun() { - return (new B4bRunData); + return (new RunData); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4bRunAction::BeginOfRunAction(const G4Run* run) +void RunAction::BeginOfRunAction(const G4Run* run) { G4cout << "### Run " << run->GetRunID() << " start." << G4endl; @@ -104,13 +104,18 @@ void B4bRunAction::BeginOfRunAction(const G4Run* run) // Open an output file // - G4String fileName = "B4"; + G4String fileName = "B4.root"; + // Other supported output types: + // G4String fileName = "B4.csv"; + // G4String fileName = "B4.hdf5"; + // G4String fileName = "B4.xml"; analysisManager->OpenFile(fileName); + G4cout << "Using " << analysisManager->GetType() << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4bRunAction::EndOfRunAction(const G4Run* /*aRun*/) +void RunAction::EndOfRunAction(const G4Run* /*aRun*/) { // print histogram statistics // @@ -153,3 +158,5 @@ void B4bRunAction::EndOfRunAction(const G4Run* /*aRun*/) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4b/src/B4bRunData.cc b/examples/basic/B4/B4b/src/RunData.cc similarity index 87% rename from examples/basic/B4/B4b/src/B4bRunData.cc rename to examples/basic/B4/B4b/src/RunData.cc index 98cd598ced..a73b14625b 100644 --- a/examples/basic/B4/B4b/src/B4bRunData.cc +++ b/examples/basic/B4/B4b/src/RunData.cc @@ -24,37 +24,31 @@ // ******************************************************************** // // -/// \file B4bRunData.cc -/// \brief Implementation of the B4bRunData class +/// \file RunData.cc +/// \brief Implementation of the B4b::RunData class -#include "B4bRunData.hh" -#include "B4Analysis.hh" +#include "RunData.hh" +#include "G4AnalysisManager.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B4bRunData::B4bRunData() - : G4Run(), - fVolumeNames{ { "Absorber", "Gap" } } +namespace B4b { - for ( auto& edep : fEdep ) { - edep = 0.; - } - for ( auto& trackLength : fTrackLength ) { - trackLength = 0.; - } -} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4bRunData::~B4bRunData() -{;} +RunData::RunData() +{} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4bRunData::FillPerEvent() +RunData::~RunData() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunData::FillPerEvent() { // get analysis manager auto analysisManager = G4AnalysisManager::Instance(); @@ -75,7 +69,7 @@ void B4bRunData::FillPerEvent() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4bRunData::Reset() +void RunData::Reset() { for ( auto& edep : fEdep ) { edep = 0.; @@ -86,3 +80,5 @@ void B4bRunData::Reset() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4b/src/B4bSteppingAction.cc b/examples/basic/B4/B4b/src/SteppingAction.cc similarity index 84% rename from examples/basic/B4/B4b/src/B4bSteppingAction.cc rename to examples/basic/B4/B4b/src/SteppingAction.cc index 43633700db..e2aed1862b 100644 --- a/examples/basic/B4/B4b/src/B4bSteppingAction.cc +++ b/examples/basic/B4/B4b/src/SteppingAction.cc @@ -24,34 +24,37 @@ // ******************************************************************** // // -/// \file B4bSteppingAction.cc -/// \brief Implementation of the B4bSteppingAction class +/// \file SteppingAction.cc +/// \brief Implementation of the SteppingAction class -#include "B4bSteppingAction.hh" -#include "B4bRunData.hh" -#include "B4DetectorConstruction.hh" +#include "SteppingAction.hh" +#include "RunData.hh" +#include "DetectorConstruction.hh" #include "G4Step.hh" #include "G4RunManager.hh" +using namespace B4; + +namespace B4b +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4bSteppingAction::B4bSteppingAction( - const B4DetectorConstruction* detectorConstruction) - : G4UserSteppingAction(), - fDetConstruction(detectorConstruction) +SteppingAction::SteppingAction(const DetectorConstruction* detConstruction) + : fDetConstruction(detConstruction) { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4bSteppingAction::~B4bSteppingAction() +SteppingAction::~SteppingAction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4bSteppingAction::UserSteppingAction(const G4Step* step) +void SteppingAction::UserSteppingAction(const G4Step* step) { // Collect energy and track length step by step @@ -67,7 +70,7 @@ void B4bSteppingAction::UserSteppingAction(const G4Step* step) stepLength = step->GetStepLength(); } - auto runData = static_cast + auto runData = static_cast (G4RunManager::GetRunManager()->GetNonConstCurrentRun()); if ( volume == fDetConstruction->GetAbsorberPV() ) { @@ -80,3 +83,5 @@ void B4bSteppingAction::UserSteppingAction(const G4Step* step) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4c/CMakeLists.txt b/examples/basic/B4/B4c/CMakeLists.txt index fd267f31f9..47c2185592 100644 --- a/examples/basic/B4/B4c/CMakeLists.txt +++ b/examples/basic/B4/B4c/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B4c) #---------------------------------------------------------------------------- diff --git a/examples/basic/B4/B4c/exampleB4c.cc b/examples/basic/B4/B4c/exampleB4c.cc index a4607d0bb5..b9e57e3cd9 100644 --- a/examples/basic/B4/B4c/exampleB4c.cc +++ b/examples/basic/B4/B4c/exampleB4c.cc @@ -27,8 +27,8 @@ /// \file exampleB4c.cc /// \brief Main program of the B4c example -#include "B4cDetectorConstruction.hh" -#include "B4cActionInitialization.hh" +#include "DetectorConstruction.hh" +#include "ActionInitialization.hh" #include "G4RunManagerFactory.hh" #include "G4SteppingVerbose.hh" @@ -44,7 +44,7 @@ namespace { void PrintUsage() { G4cerr << " Usage: " << G4endl; - G4cerr << " exampleB4a [-m macro ] [-u UIsession] [-t nThreads] [-vDefault]" + G4cerr << " exampleB4c [-m macro ] [-u UIsession] [-t nThreads] [-vDefault]" << G4endl; G4cerr << " note: -t option is available only for multi-threaded mode." << G4endl; @@ -114,13 +114,13 @@ int main(int argc,char** argv) // Set mandatory initialization classes // - auto detConstruction = new B4cDetectorConstruction(); + auto detConstruction = new B4c::DetectorConstruction(); runManager->SetUserInitialization(detConstruction); auto physicsList = new FTFP_BERT; runManager->SetUserInitialization(physicsList); - auto actionInitialization = new B4cActionInitialization(); + auto actionInitialization = new B4c::ActionInitialization(); runManager->SetUserInitialization(actionInitialization); // Initialize visualization diff --git a/examples/basic/B4/B4c/exampleB4c.out b/examples/basic/B4/B4c/exampleB4c.out index d6a61f9917..a068acd418 100644 --- a/examples/basic/B4/B4c/exampleB4c.out +++ b/examples/basic/B4/B4c/exampleB4c.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -21,16 +21,6 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo <<< Geant4 Physics List simulation engine: FTFP_BERT -Using Root - --------- WWWW ------- G4Exception-START -------- WWWW ------- -*** G4Exception : Analysis_W013 - issued by : G4RootNtupleFileManager::SetNtupleMergingMode -Merging ntuples is not applicable in sequential application. -Setting was ignored. -*** This is just a warning message. *** --------- WWWW -------- G4Exception-END --------- WWWW ------- - Visualization Manager instantiating with verbosity "warnings (3)"... Visualization Manager initialising... Registering graphics systems... @@ -39,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -118,9 +106,9 @@ Some /vis commands (optionally) take a string to specify colour. -Checking overlaps for volume Calorimeter (G4Box) ... OK! -Checking overlaps for volume Abso (G4Box) ... OK! -Checking overlaps for volume Gap (G4Box) ... OK! +Checking overlaps for volume Calorimeter:0 (G4Box) ... OK! +Checking overlaps for volume Abso:0 (G4Box) ... OK! +Checking overlaps for volume Gap:0 (G4Box) ... OK! ------------------------------------------------------------ ---> The calorimeter is 10 layers of: [ 10mm of G4_Pb + 5mm of liquidArgon ] @@ -133,32 +121,99 @@ Checking overlaps for volume Gap (G4Box) ... OK! for neutron : 3 to 6 GeV ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -168,25 +223,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -196,29 +251,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -226,31 +281,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -259,12 +314,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -272,12 +327,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -285,31 +340,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -317,31 +372,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -349,31 +404,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -381,32 +436,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -414,32 +469,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -447,31 +502,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -479,27 +534,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -508,17 +563,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -526,67 +581,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -594,13 +649,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -608,13 +663,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -622,12 +677,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -635,13 +690,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -649,13 +704,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -663,13 +718,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -677,60 +732,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -738,27 +793,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -766,25 +821,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -792,25 +847,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -818,13 +873,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -847,26 +902,37 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. + +-------- WWWW ------- G4Exception-START -------- WWWW ------- +*** G4Exception : Analysis_W001 + issued by : G4RootNtupleFileManager::SetNtupleMergingMode +Merging ntuples is not applicable in sequential application. +Setting was ignored. +*** This is just a warning message. *** +-------- WWWW -------- G4Exception-END --------- WWWW ------- + +... set ntuple merging row mode : row-wise - done ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 276.418 MeV total track length: 20.0351 cm - Gap: total energy: 16.7054 MeV total track length: 8.39188 cm + Absorber: total energy: 281.979 MeV total track length: 20.3632 cm + Gap: total energy: 7.05731 MeV total track length: 3.5668 cm ----> print histograms statistic for the entire run - EAbs : mean = 276.418 MeV rms = 0 meV - EGap : mean = 16.7054 MeV rms = 0 meV - LAbs : mean = 20.0351 cm rms = 0 fm - LGap : mean = 8.39188 cm rms = 0 fm + EAbs : mean = 281.979 MeV rms = 0 eV + EGap : mean = 7.05731 MeV rms = 0 eV + LAbs : mean = 20.3632 cm rms = 0 fm + LGap : mean = 3.5668 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. @@ -894,7 +960,7 @@ See commands in /vis/modeling/trajectories/ for other options. hIoni, hIoni, hIoni, hIoni hIoni, hIoni, hIoni, hIoni hIoni, hIoni, photonNuclear, electronNuclear - muonNuclear, Decay, hadElastic, hadElastic + positronNuclear, muonNuclear, Decay, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic @@ -909,791 +975,61 @@ See commands in /vis/modeling/trajectories/ for other options. hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, neutronInelastic, nCapture - protonInelastic, pi+Inelastic, pi-Inelastic, kaon+Inelastic - kaon-Inelastic, kaon0LInelastic, kaon0SInelastic,anti_protonInelastic -anti_neutronInelastic,anti_deuteronInelastic,anti_tritonInelastic, anti_He3Inelastic -anti_alphaInelastic, lambdaInelastic, sigma+Inelastic, sigma-Inelastic - xi0Inelastic, xi-Inelastic, omega-Inelastic,anti_lambdaInelastic -anti_sigma+Inelastic,anti_sigma-Inelastic, anti_xi0Inelastic, anti_xi-Inelastic -anti_omega-Inelastic, D+Inelastic, D0Inelastic, D-Inelastic - anti_D0Inelastic, Ds+Inelastic, Ds-Inelastic, B+Inelastic - B0Inelastic, B-Inelastic, anti_B0Inelastic, Bs0Inelastic - anti_Bs0Inelastic, Bc+Inelastic, Bc-Inelastic, lambda_c+Inelastic - xi_c+Inelastic, xi_c0Inelastic, omega_c0Inelastic, lambda_bInelastic - xi_b0Inelastic, xi_b-Inelastic, omega_b-Inelastic,anti_lambda_c+Inelastic -anti_xi_c+Inelastic,anti_xi_c0Inelastic,anti_omega_c0Inelastic,anti_lambda_bInelastic -anti_xi_b0Inelastic,anti_xi_b-Inelastic,anti_omega_b-Inelastic,hFritiofCaptureAtRest -hBertiniCaptureAtRest,muMinusCaptureAtRest, dInelastic, tInelastic - He3Inelastic, alphaInelastic, ionInelastic, nKiller - - -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + hadElastic, hadElastic, hadElastic, neutronInelastic + nCapture, protonInelastic, pi+Inelastic, pi-Inelastic + kaon+Inelastic, kaon-Inelastic, kaon0LInelastic, kaon0SInelastic +anti_protonInelastic,anti_neutronInelastic,anti_deuteronInelastic,anti_tritonInelastic + anti_He3Inelastic,anti_alphaInelastic, lambdaInelastic, sigma+Inelastic + sigma-Inelastic, xi0Inelastic, xi-Inelastic, omega-Inelastic +anti_lambdaInelastic,anti_sigma+Inelastic,anti_sigma-Inelastic, anti_xi0Inelastic + anti_xi-Inelastic,anti_omega-Inelastic, D+Inelastic, D0Inelastic + D-Inelastic, anti_D0Inelastic, Ds+Inelastic, Ds-Inelastic + B+Inelastic, B0Inelastic, B-Inelastic, anti_B0Inelastic + Bs0Inelastic, anti_Bs0Inelastic, Bc+Inelastic, Bc-Inelastic + lambda_c+Inelastic, xi_c+Inelastic, xi_c0Inelastic, omega_c0Inelastic + lambda_bInelastic, xi_b0Inelastic, xi_b-Inelastic, omega_b-Inelastic +anti_lambda_c+Inelastic,anti_xi_c+Inelastic,anti_xi_c0Inelastic,anti_omega_c0Inelastic +anti_lambda_bInelastic,anti_xi_b0Inelastic,anti_xi_b-Inelastic,anti_omega_b-Inelastic +hFritiofCaptureAtRest,hBertiniCaptureAtRest,muMinusCaptureAtRest, dInelastic + tInelastic, He3Inelastic, alphaInelastic, ionInelastic + nKiller ### Run 1 starts. ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 276.851 MeV total track length: 20.6185 cm - Gap: total energy: 15.9299 MeV total track length: 8.21284 cm + Absorber: total energy: 280.59 MeV total track length: 20.2565 cm + Gap: total energy: 17.1134 MeV total track length: 8.57952 cm ----> print histograms statistic for the entire run - EAbs : mean = 276.851 MeV rms = 0 meV - EGap : mean = 15.9299 MeV rms = 0 meV - LAbs : mean = 20.6185 cm rms = 0 fm - LGap : mean = 8.21284 cm rms = 0 fm + EAbs : mean = 280.59 MeV rms = 0 eV + EGap : mean = 17.1134 MeV rms = 0 eV + LAbs : mean = 20.2565 cm rms = 0 fm + LGap : mean = 8.57952 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. - -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV ### Run 2 starts. ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 468.054 MeV total track length: 34.15 cm - Gap: total energy: 27.9107 MeV total track length: 14.3207 cm + Absorber: total energy: 469.283 MeV total track length: 33.8386 cm + Gap: total energy: 18.5204 MeV total track length: 9.32324 cm ----> print histograms statistic for the entire run - EAbs : mean = 468.054 MeV rms = 0 meV - EGap : mean = 27.9107 MeV rms = 0 meV - LAbs : mean = 34.15 cm rms = 0 fm - LGap : mean = 14.3207 cm rms = 0 fm + EAbs : mean = 469.283 MeV rms = 0 eV + EGap : mean = 18.5204 MeV rms = 0 eV + LAbs : mean = 33.8386 cm rms = 0 fm + LGap : mean = 9.32324 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. diff --git a/examples/basic/B4/B4c/include/B4cActionInitialization.hh b/examples/basic/B4/B4c/include/ActionInitialization.hh similarity index 85% rename from examples/basic/B4/B4c/include/B4cActionInitialization.hh rename to examples/basic/B4/B4c/include/ActionInitialization.hh index 566ab0dc21..910fddc83a 100644 --- a/examples/basic/B4/B4c/include/B4cActionInitialization.hh +++ b/examples/basic/B4/B4c/include/ActionInitialization.hh @@ -24,27 +24,31 @@ // ******************************************************************** // // -/// \file B4cActionInitialization.hh -/// \brief Definition of the B4cActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the B4c::ActionInitialization class #ifndef B4cActionInitialization_h #define B4cActionInitialization_h 1 #include "G4VUserActionInitialization.hh" -/// Action initialization class. -/// +namespace B4c +{ -class B4cActionInitialization : public G4VUserActionInitialization +/// Action initialization class. + +class ActionInitialization : public G4VUserActionInitialization { public: - B4cActionInitialization(); - virtual ~B4cActionInitialization(); + ActionInitialization(); + ~ActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; + void BuildForMaster() const override; + void Build() const override; }; +} + #endif diff --git a/examples/basic/B4/B4c/include/B4Analysis.hh b/examples/basic/B4/B4c/include/B4Analysis.hh deleted file mode 100644 index 78c4412df4..0000000000 --- a/examples/basic/B4/B4c/include/B4Analysis.hh +++ /dev/null @@ -1,40 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file B4Analysis.hh -/// \brief Selection of the analysis technology - -#ifndef B4Analysis_h -#define B4Analysis_h 1 - -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" - -//#include "G4GenericAnalysisManager.hh" -//using G4AnalysisManager = G4GenericAnalysisManager; - -#endif diff --git a/examples/basic/B4/B4c/include/B4cCalorHit.hh b/examples/basic/B4/B4c/include/CalorHit.hh similarity index 70% rename from examples/basic/B4/B4c/include/B4cCalorHit.hh rename to examples/basic/B4/B4c/include/CalorHit.hh index 52409868b7..3bed7021fa 100644 --- a/examples/basic/B4/B4c/include/B4cCalorHit.hh +++ b/examples/basic/B4/B4c/include/CalorHit.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4cCalorHit.hh -/// \brief Definition of the B4cCalorHit class +/// \file CalorHit.hh +/// \brief Definition of the B4c::CalorHit class #ifndef B4cCalorHit_h #define B4cCalorHit_h 1 @@ -36,29 +36,32 @@ #include "G4ThreeVector.hh" #include "G4Threading.hh" +namespace B4c +{ + /// Calorimeter hit class /// /// It defines data members to store the the energy deposit and track lengths /// of charged particles in a selected volume: /// - fEdep, fTrackLength -class B4cCalorHit : public G4VHit +class CalorHit : public G4VHit { public: - B4cCalorHit(); - B4cCalorHit(const B4cCalorHit&); - virtual ~B4cCalorHit(); + CalorHit(); + CalorHit(const CalorHit&) = default; + ~CalorHit() override; // operators - const B4cCalorHit& operator=(const B4cCalorHit&); - G4bool operator==(const B4cCalorHit&) const; + CalorHit& operator=(const CalorHit&) = default; + G4bool operator==(const CalorHit&) const; inline void* operator new(size_t); inline void operator delete(void*); // methods from base class - virtual void Draw() {} - virtual void Print(); + void Draw() override{} + void Print() override; // methods to handle data void Add(G4double de, G4double dl); @@ -68,49 +71,51 @@ class B4cCalorHit : public G4VHit G4double GetTrackLength() const; private: - G4double fEdep; ///< Energy deposit in the sensitive volume - G4double fTrackLength; ///< Track length in the sensitive volume + G4double fEdep = 0.; ///< Energy deposit in the sensitive volume + G4double fTrackLength = 0.; ///< Track length in the sensitive volume }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -using B4cCalorHitsCollection = G4THitsCollection; +using CalorHitsCollection = G4THitsCollection; -extern G4ThreadLocal G4Allocator* B4cCalorHitAllocator; +extern G4ThreadLocal G4Allocator* CalorHitAllocator; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -inline void* B4cCalorHit::operator new(size_t) +inline void* CalorHit::operator new(size_t) { - if (!B4cCalorHitAllocator) { - B4cCalorHitAllocator = new G4Allocator; + if (!CalorHitAllocator) { + CalorHitAllocator = new G4Allocator; } void *hit; - hit = (void *) B4cCalorHitAllocator->MallocSingle(); + hit = (void *) CalorHitAllocator->MallocSingle(); return hit; } -inline void B4cCalorHit::operator delete(void *hit) +inline void CalorHit::operator delete(void *hit) { - if (!B4cCalorHitAllocator) { - B4cCalorHitAllocator = new G4Allocator; + if (!CalorHitAllocator) { + CalorHitAllocator = new G4Allocator; } - B4cCalorHitAllocator->FreeSingle((B4cCalorHit*) hit); + CalorHitAllocator->FreeSingle((CalorHit*) hit); } -inline void B4cCalorHit::Add(G4double de, G4double dl) { +inline void CalorHit::Add(G4double de, G4double dl) { fEdep += de; fTrackLength += dl; } -inline G4double B4cCalorHit::GetEdep() const { +inline G4double CalorHit::GetEdep() const { return fEdep; } -inline G4double B4cCalorHit::GetTrackLength() const { +inline G4double CalorHit::GetTrackLength() const { return fTrackLength; } +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4c/include/B4cCalorimeterSD.hh b/examples/basic/B4/B4c/include/CalorimeterSD.hh similarity index 78% rename from examples/basic/B4/B4c/include/B4cCalorimeterSD.hh rename to examples/basic/B4/B4c/include/CalorimeterSD.hh index aaf0df6061..e5bd1a2e8b 100644 --- a/examples/basic/B4/B4c/include/B4cCalorimeterSD.hh +++ b/examples/basic/B4/B4c/include/CalorimeterSD.hh @@ -24,21 +24,24 @@ // ******************************************************************** // // -/// \file B4cCalorimeterSD.hh -/// \brief Definition of the B4cCalorimeterSD class +/// \file CalorimeterSD.hh +/// \brief Definition of the B4c::CalorimeterSD class #ifndef B4cCalorimeterSD_h #define B4cCalorimeterSD_h 1 #include "G4VSensitiveDetector.hh" -#include "B4cCalorHit.hh" +#include "CalorHit.hh" #include class G4Step; class G4HCofThisEvent; +namespace B4c +{ + /// Calorimeter sensitive detector class /// /// In Initialize(), it creates one hit for each calorimeter layer and one more @@ -47,24 +50,26 @@ class G4HCofThisEvent; /// The values are accounted in hits in ProcessHits() function which is called /// by Geant4 kernel at each step. -class B4cCalorimeterSD : public G4VSensitiveDetector +class CalorimeterSD : public G4VSensitiveDetector { public: - B4cCalorimeterSD(const G4String& name, - const G4String& hitsCollectionName, - G4int nofCells); - virtual ~B4cCalorimeterSD(); + CalorimeterSD(const G4String& name, + const G4String& hitsCollectionName, + G4int nofCells); + ~CalorimeterSD() override; // methods from base class - virtual void Initialize(G4HCofThisEvent* hitCollection); - virtual G4bool ProcessHits(G4Step* step, G4TouchableHistory* history); - virtual void EndOfEvent(G4HCofThisEvent* hitCollection); + void Initialize(G4HCofThisEvent* hitCollection) override; + G4bool ProcessHits(G4Step* step, G4TouchableHistory* history) override; + void EndOfEvent(G4HCofThisEvent* hitCollection) override; private: - B4cCalorHitsCollection* fHitsCollection; - G4int fNofCells; + CalorHitsCollection* fHitsCollection = nullptr; + G4int fNofCells = 0; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4c/include/B4cDetectorConstruction.hh b/examples/basic/B4/B4c/include/DetectorConstruction.hh similarity index 84% rename from examples/basic/B4/B4c/include/B4cDetectorConstruction.hh rename to examples/basic/B4/B4c/include/DetectorConstruction.hh index 90b3a38c3e..b95d444cd0 100644 --- a/examples/basic/B4/B4c/include/B4cDetectorConstruction.hh +++ b/examples/basic/B4/B4c/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4cDetectorConstruction.hh -/// \brief Definition of the B4cDetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the B4c::DetectorConstruction class #ifndef B4cDetectorConstruction_h #define B4cDetectorConstruction_h 1 @@ -36,6 +36,9 @@ class G4VPhysicalVolume; class G4GlobalMagFieldMessenger; +namespace B4c +{ + /// Detector construction class to define materials and geometry. /// The calorimeter is a box made of a given number of layers. A layer consists /// of an absorber plate and of a detection gap. The layer is replicated. @@ -47,20 +50,20 @@ class G4GlobalMagFieldMessenger; /// - the number of layers, /// - the transverse size of the calorimeter (the input face is a square). /// -/// In ConstructSDandField() sensitive detectors of B4cCalorimeterSD type +/// In ConstructSDandField() sensitive detectors of CalorimeterSD type /// are created and associated with the Absorber and Gap volumes. /// In addition a transverse uniform magnetic field is defined /// via G4GlobalMagFieldMessenger class. -class B4cDetectorConstruction : public G4VUserDetectorConstruction +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B4cDetectorConstruction(); - virtual ~B4cDetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; public: - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; private: // methods @@ -73,10 +76,12 @@ class B4cDetectorConstruction : public G4VUserDetectorConstruction static G4ThreadLocal G4GlobalMagFieldMessenger* fMagFieldMessenger; // magnetic field messenger - G4bool fCheckOverlaps; // option to activate checking of volumes overlaps - G4int fNofLayers; // number of layers + G4bool fCheckOverlaps = true; // option to activate checking of volumes overlaps + G4int fNofLayers = -1; // number of layers }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4c/include/B4cEventAction.hh b/examples/basic/B4/B4c/include/EventAction.hh similarity index 84% rename from examples/basic/B4/B4c/include/B4cEventAction.hh rename to examples/basic/B4/B4c/include/EventAction.hh index b43da34e7f..791c5d37af 100644 --- a/examples/basic/B4/B4c/include/B4cEventAction.hh +++ b/examples/basic/B4/B4c/include/EventAction.hh @@ -24,45 +24,50 @@ // ******************************************************************** // // -/// \file B4cEventAction.hh -/// \brief Definition of the B4cEventAction class +/// \file EventAction.hh +/// \brief Definition of the B4c::EventAction class #ifndef B4cEventAction_h #define B4cEventAction_h 1 #include "G4UserEventAction.hh" -#include "B4cCalorHit.hh" +#include "CalorHit.hh" #include "globals.hh" +namespace B4c +{ + /// Event action class /// /// In EndOfEventAction(), it prints the accumulated quantities of the energy /// deposit and track lengths of charged particles in Absober and Gap layers /// stored in the hits collections. -class B4cEventAction : public G4UserEventAction +class EventAction : public G4UserEventAction { public: - B4cEventAction(); - virtual ~B4cEventAction(); + EventAction(); + ~EventAction() override; - virtual void BeginOfEventAction(const G4Event* event); - virtual void EndOfEventAction(const G4Event* event); + void BeginOfEventAction(const G4Event* event) override; + void EndOfEventAction(const G4Event* event) override; private: // methods - B4cCalorHitsCollection* GetHitsCollection(G4int hcID, + CalorHitsCollection* GetHitsCollection(G4int hcID, const G4Event* event) const; void PrintEventStatistics(G4double absoEdep, G4double absoTrackLength, G4double gapEdep, G4double gapTrackLength) const; // data members - G4int fAbsHCID; - G4int fGapHCID; + G4int fAbsHCID = -1; + G4int fGapHCID = -1; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4c/include/B4PrimaryGeneratorAction.hh b/examples/basic/B4/B4c/include/PrimaryGeneratorAction.hh similarity index 86% rename from examples/basic/B4/B4c/include/B4PrimaryGeneratorAction.hh rename to examples/basic/B4/B4c/include/PrimaryGeneratorAction.hh index 9e2a99aa73..debeaa24a4 100644 --- a/examples/basic/B4/B4c/include/B4PrimaryGeneratorAction.hh +++ b/examples/basic/B4/B4c/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4PrimaryGeneratorAction.hh -/// \brief Definition of the B4PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the PrimaryGeneratorAction class #ifndef B4PrimaryGeneratorAction_h #define B4PrimaryGeneratorAction_h 1 @@ -36,6 +36,9 @@ class G4ParticleGun; class G4Event; +namespace B4 +{ + /// The primary generator action class with particle gum. /// /// It defines a single particle which hits the calorimeter @@ -43,21 +46,23 @@ class G4Event; /// can be changed via the G4 build-in commands of G4ParticleGun class /// (see the macros provided with this example). -class B4PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B4PrimaryGeneratorAction(); - virtual ~B4PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event* event); + void GeneratePrimaries(G4Event* event) override; // set methods void SetRandomFlag(G4bool value); private: - G4ParticleGun* fParticleGun; // G4 particle gun + G4ParticleGun* fParticleGun = nullptr; // G4 particle gun }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4d/include/B4RunAction.hh b/examples/basic/B4/B4c/include/RunAction.hh similarity index 88% rename from examples/basic/B4/B4d/include/B4RunAction.hh rename to examples/basic/B4/B4c/include/RunAction.hh index 40f41a210f..6480c59487 100644 --- a/examples/basic/B4/B4d/include/B4RunAction.hh +++ b/examples/basic/B4/B4c/include/RunAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4RunAction.hh -/// \brief Definition of the B4RunAction class +/// \file RunAction.hh +/// \brief Definition of the B4::RunAction class #ifndef B4RunAction_h #define B4RunAction_h 1 @@ -35,6 +35,9 @@ class G4Run; +namespace B4 +{ + /// Run action class /// /// It accumulates statistic and computes dispersion of the energy deposit @@ -47,22 +50,24 @@ class G4Run; /// - Track length in gap /// The same values are also saved in the ntuple. /// The histograms and ntuple are saved in the output file in a format -/// accoring to a selected technology in B4Analysis.hh. +/// according to a specified file extension. /// /// In EndOfRunAction(), the accumulated statistic and computed /// dispersion is printed. /// -class B4RunAction : public G4UserRunAction +class RunAction : public G4UserRunAction { public: - B4RunAction(); - virtual ~B4RunAction(); + RunAction(); + ~RunAction() override; - virtual void BeginOfRunAction(const G4Run*); - virtual void EndOfRunAction(const G4Run*); + void BeginOfRunAction(const G4Run*) override; + void EndOfRunAction(const G4Run*) override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4c/src/ActionInitialization.cc b/examples/basic/B4/B4c/src/ActionInitialization.cc new file mode 100644 index 0000000000..d64d2347d9 --- /dev/null +++ b/examples/basic/B4/B4c/src/ActionInitialization.cc @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +/// \file ActionInitialization.cc +/// \brief Implementation of the B4c::ActionInitialization class + +#include "ActionInitialization.hh" +#include "PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "EventAction.hh" + +using namespace B4; + +namespace B4c +{ + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::~ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::BuildForMaster() const +{ + SetUserAction(new RunAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::Build() const +{ + SetUserAction(new PrimaryGeneratorAction); + SetUserAction(new RunAction); + SetUserAction(new EventAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4c/src/B4cActionInitialization.cc b/examples/basic/B4/B4c/src/B4cActionInitialization.cc deleted file mode 100644 index 29a5428e8e..0000000000 --- a/examples/basic/B4/B4c/src/B4cActionInitialization.cc +++ /dev/null @@ -1,62 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file B4cActionInitialization.cc -/// \brief Implementation of the B4cActionInitialization class - -#include "B4cActionInitialization.hh" -#include "B4PrimaryGeneratorAction.hh" -#include "B4RunAction.hh" -#include "B4cEventAction.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B4cActionInitialization::B4cActionInitialization() - : G4VUserActionInitialization() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B4cActionInitialization::~B4cActionInitialization() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B4cActionInitialization::BuildForMaster() const -{ - SetUserAction(new B4RunAction); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B4cActionInitialization::Build() const -{ - SetUserAction(new B4PrimaryGeneratorAction); - SetUserAction(new B4RunAction); - SetUserAction(new B4cEventAction); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B4/B4c/src/B4cCalorHit.cc b/examples/basic/B4/B4c/src/CalorHit.cc similarity index 75% rename from examples/basic/B4/B4c/src/B4cCalorHit.cc rename to examples/basic/B4/B4c/src/CalorHit.cc index 9482397201..979bd5f1db 100644 --- a/examples/basic/B4/B4c/src/B4cCalorHit.cc +++ b/examples/basic/B4/B4c/src/CalorHit.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B4cCalorHit.cc -/// \brief Implementation of the B4cCalorHit class +/// \file CalorHit.cc +/// \brief Implementation of the B4c::CalorHit class -#include "B4cCalorHit.hh" +#include "CalorHit.hh" #include "G4UnitsTable.hh" #include "G4VVisManager.hh" #include "G4Circle.hh" @@ -36,49 +36,49 @@ #include -G4ThreadLocal G4Allocator* B4cCalorHitAllocator = nullptr; +namespace B4c +{ + +G4ThreadLocal G4Allocator* CalorHitAllocator = nullptr; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cCalorHit::B4cCalorHit() - : G4VHit(), - fEdep(0.), - fTrackLength(0.) +CalorHit::CalorHit() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cCalorHit::~B4cCalorHit() {} +CalorHit::~CalorHit() {} + +// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +// CalorHit::CalorHit(const CalorHit& right) +// : G4VHit() +// { +// fEdep = right.fEdep; +// fTrackLength = right.fTrackLength; +// } + +// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +// const CalorHit& CalorHit::operator=(const CalorHit& right) +// { +// fEdep = right.fEdep; +// fTrackLength = right.fTrackLength; + +// return *this; +// } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cCalorHit::B4cCalorHit(const B4cCalorHit& right) - : G4VHit() -{ - fEdep = right.fEdep; - fTrackLength = right.fTrackLength; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -const B4cCalorHit& B4cCalorHit::operator=(const B4cCalorHit& right) -{ - fEdep = right.fEdep; - fTrackLength = right.fTrackLength; - - return *this; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -G4bool B4cCalorHit::operator==(const B4cCalorHit& right) const +G4bool CalorHit::operator==(const CalorHit& right) const { return ( this == &right ) ? true : false; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4cCalorHit::Print() +void CalorHit::Print() { G4cout << "Edep: " @@ -89,3 +89,5 @@ void B4cCalorHit::Print() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4c/src/B4cCalorimeterSD.cc b/examples/basic/B4/B4c/src/CalorimeterSD.cc similarity index 84% rename from examples/basic/B4/B4c/src/B4cCalorimeterSD.cc rename to examples/basic/B4/B4c/src/CalorimeterSD.cc index 7d019351a3..f6a4df54f8 100644 --- a/examples/basic/B4/B4c/src/B4cCalorimeterSD.cc +++ b/examples/basic/B4/B4c/src/CalorimeterSD.cc @@ -24,24 +24,25 @@ // ******************************************************************** // // -/// \file B4cCalorimeterSD.cc -/// \brief Implementation of the B4cCalorimeterSD class +/// \file CalorimeterSD.cc +/// \brief Implementation of the B4c::CalorimeterSD class -#include "B4cCalorimeterSD.hh" +#include "CalorimeterSD.hh" #include "G4HCofThisEvent.hh" #include "G4Step.hh" #include "G4ThreeVector.hh" #include "G4SDManager.hh" #include "G4ios.hh" +namespace B4c +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cCalorimeterSD::B4cCalorimeterSD( - const G4String& name, - const G4String& hitsCollectionName, - G4int nofCells) +CalorimeterSD::CalorimeterSD(const G4String& name, + const G4String& hitsCollectionName, + G4int nofCells) : G4VSensitiveDetector(name), - fHitsCollection(nullptr), fNofCells(nofCells) { collectionName.insert(hitsCollectionName); @@ -49,17 +50,17 @@ B4cCalorimeterSD::B4cCalorimeterSD( //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cCalorimeterSD::~B4cCalorimeterSD() +CalorimeterSD::~CalorimeterSD() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4cCalorimeterSD::Initialize(G4HCofThisEvent* hce) +void CalorimeterSD::Initialize(G4HCofThisEvent* hce) { // Create hits collection fHitsCollection - = new B4cCalorHitsCollection(SensitiveDetectorName, collectionName[0]); + = new CalorHitsCollection(SensitiveDetectorName, collectionName[0]); // Add this collection in hce auto hcID @@ -69,13 +70,13 @@ void B4cCalorimeterSD::Initialize(G4HCofThisEvent* hce) // Create hits // fNofCells for cells + one more for total sums for (G4int i=0; iinsert(new B4cCalorHit()); + fHitsCollection->insert(new CalorHit()); } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4bool B4cCalorimeterSD::ProcessHits(G4Step* step, +G4bool CalorimeterSD::ProcessHits(G4Step* step, G4TouchableHistory*) { // energy deposit @@ -99,7 +100,7 @@ G4bool B4cCalorimeterSD::ProcessHits(G4Step* step, if ( ! hit ) { G4ExceptionDescription msg; msg << "Cannot access hit " << layerNumber; - G4Exception("B4cCalorimeterSD::ProcessHits()", + G4Exception("CalorimeterSD::ProcessHits()", "MyCode0004", FatalException, msg); } @@ -116,7 +117,7 @@ G4bool B4cCalorimeterSD::ProcessHits(G4Step* step, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4cCalorimeterSD::EndOfEvent(G4HCofThisEvent*) +void CalorimeterSD::EndOfEvent(G4HCofThisEvent*) { if ( verboseLevel>1 ) { auto nofHits = fHitsCollection->entries(); @@ -129,3 +130,5 @@ void B4cCalorimeterSD::EndOfEvent(G4HCofThisEvent*) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4c/src/B4cDetectorConstruction.cc b/examples/basic/B4/B4c/src/DetectorConstruction.cc similarity index 91% rename from examples/basic/B4/B4c/src/B4cDetectorConstruction.cc rename to examples/basic/B4/B4c/src/DetectorConstruction.cc index b8dfcf8019..506f97dd93 100644 --- a/examples/basic/B4/B4c/src/B4cDetectorConstruction.cc +++ b/examples/basic/B4/B4c/src/DetectorConstruction.cc @@ -24,11 +24,11 @@ // ******************************************************************** // // -/// \file B4cDetectorConstruction.cc -/// \brief Implementation of the B4cDetectorConstruction class +/// \file DetectorConstruction.cc +/// \brief Implementation of the B4c::DetectorConstruction class -#include "B4cDetectorConstruction.hh" -#include "B4cCalorimeterSD.hh" +#include "DetectorConstruction.hh" +#include "CalorimeterSD.hh" #include "G4Material.hh" #include "G4NistManager.hh" @@ -47,29 +47,29 @@ #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" +namespace B4c +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ThreadLocal -G4GlobalMagFieldMessenger* B4cDetectorConstruction::fMagFieldMessenger = nullptr; +G4GlobalMagFieldMessenger* DetectorConstruction::fMagFieldMessenger = nullptr; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cDetectorConstruction::B4cDetectorConstruction() - : G4VUserDetectorConstruction(), - fCheckOverlaps(true), - fNofLayers(-1) +DetectorConstruction::DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cDetectorConstruction::~B4cDetectorConstruction() +DetectorConstruction::~DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B4cDetectorConstruction::Construct() +G4VPhysicalVolume* DetectorConstruction::Construct() { // Define materials DefineMaterials(); @@ -80,7 +80,7 @@ G4VPhysicalVolume* B4cDetectorConstruction::Construct() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4cDetectorConstruction::DefineMaterials() +void DetectorConstruction::DefineMaterials() { // Lead material defined using NIST Manager auto nistManager = G4NistManager::Instance(); @@ -103,7 +103,7 @@ void B4cDetectorConstruction::DefineMaterials() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B4cDetectorConstruction::DefineVolumes() +G4VPhysicalVolume* DetectorConstruction::DefineVolumes() { // Geometry parameters fNofLayers = 10; @@ -124,7 +124,7 @@ G4VPhysicalVolume* B4cDetectorConstruction::DefineVolumes() if ( ! defaultMaterial || ! absorberMaterial || ! gapMaterial ) { G4ExceptionDescription msg; msg << "Cannot retrieve materials already defined."; - G4Exception("B4DetectorConstruction::DefineVolumes()", + G4Exception("DetectorConstruction::DefineVolumes()", "MyCode0001", FatalException, msg); } @@ -271,7 +271,7 @@ G4VPhysicalVolume* B4cDetectorConstruction::DefineVolumes() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4cDetectorConstruction::ConstructSDandField() +void DetectorConstruction::ConstructSDandField() { // G4SDManager::GetSDMpointer()->SetVerboseLevel(1); @@ -279,12 +279,12 @@ void B4cDetectorConstruction::ConstructSDandField() // Sensitive detectors // auto absoSD - = new B4cCalorimeterSD("AbsorberSD", "AbsorberHitsCollection", fNofLayers); + = new CalorimeterSD("AbsorberSD", "AbsorberHitsCollection", fNofLayers); G4SDManager::GetSDMpointer()->AddNewDetector(absoSD); SetSensitiveDetector("AbsoLV",absoSD); auto gapSD - = new B4cCalorimeterSD("GapSD", "GapHitsCollection", fNofLayers); + = new CalorimeterSD("GapSD", "GapHitsCollection", fNofLayers); G4SDManager::GetSDMpointer()->AddNewDetector(gapSD); SetSensitiveDetector("GapLV",gapSD); @@ -303,3 +303,5 @@ void B4cDetectorConstruction::ConstructSDandField() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4c/src/B4cEventAction.cc b/examples/basic/B4/B4c/src/EventAction.cc similarity index 88% rename from examples/basic/B4/B4c/src/B4cEventAction.cc rename to examples/basic/B4/B4c/src/EventAction.cc index a2b9f49c60..f44ed1cd59 100644 --- a/examples/basic/B4/B4c/src/B4cEventAction.cc +++ b/examples/basic/B4/B4c/src/EventAction.cc @@ -24,14 +24,14 @@ // ******************************************************************** // // -/// \file B4cEventAction.cc -/// \brief Implementation of the B4cEventAction class +/// \file EventAction.cc +/// \brief Implementation of the B4c::EventAction class -#include "B4cEventAction.hh" -#include "B4cCalorimeterSD.hh" -#include "B4cCalorHit.hh" -#include "B4Analysis.hh" +#include "EventAction.hh" +#include "CalorimeterSD.hh" +#include "CalorHit.hh" +#include "G4AnalysisManager.hh" #include "G4RunManager.hh" #include "G4Event.hh" #include "G4SDManager.hh" @@ -41,33 +41,33 @@ #include "Randomize.hh" #include +namespace B4c +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cEventAction::B4cEventAction() - : G4UserEventAction(), - fAbsHCID(-1), - fGapHCID(-1) +EventAction::EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cEventAction::~B4cEventAction() +EventAction::~EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4cCalorHitsCollection* -B4cEventAction::GetHitsCollection(G4int hcID, +CalorHitsCollection* +EventAction::GetHitsCollection(G4int hcID, const G4Event* event) const { auto hitsCollection - = static_cast( + = static_cast( event->GetHCofThisEvent()->GetHC(hcID)); if ( ! hitsCollection ) { G4ExceptionDescription msg; msg << "Cannot access hitsCollection ID " << hcID; - G4Exception("B4cEventAction::GetHitsCollection()", + G4Exception("EventAction::GetHitsCollection()", "MyCode0003", FatalException, msg); } @@ -76,7 +76,7 @@ B4cEventAction::GetHitsCollection(G4int hcID, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4cEventAction::PrintEventStatistics( +void EventAction::PrintEventStatistics( G4double absoEdep, G4double absoTrackLength, G4double gapEdep, G4double gapTrackLength) const { @@ -96,12 +96,12 @@ void B4cEventAction::PrintEventStatistics( //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4cEventAction::BeginOfEventAction(const G4Event* /*event*/) +void EventAction::BeginOfEventAction(const G4Event* /*event*/) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4cEventAction::EndOfEventAction(const G4Event* event) +void EventAction::EndOfEventAction(const G4Event* event) { // Get hits collections IDs (only once) if ( fAbsHCID == -1 ) { @@ -152,3 +152,5 @@ void B4cEventAction::EndOfEventAction(const G4Event* event) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4a/src/B4PrimaryGeneratorAction.cc b/examples/basic/B4/B4c/src/PrimaryGeneratorAction.cc similarity index 89% rename from examples/basic/B4/B4a/src/B4PrimaryGeneratorAction.cc rename to examples/basic/B4/B4c/src/PrimaryGeneratorAction.cc index 41994a9778..471aa628bb 100644 --- a/examples/basic/B4/B4a/src/B4PrimaryGeneratorAction.cc +++ b/examples/basic/B4/B4c/src/PrimaryGeneratorAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B4PrimaryGeneratorAction.cc -/// \brief Implementation of the B4PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the B4::PrimaryGeneratorAction class -#include "B4PrimaryGeneratorAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4RunManager.hh" #include "G4LogicalVolumeStore.hh" @@ -40,11 +40,12 @@ #include "G4SystemOfUnits.hh" #include "Randomize.hh" +namespace B4 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4PrimaryGeneratorAction::B4PrimaryGeneratorAction() - : G4VUserPrimaryGeneratorAction(), - fParticleGun(nullptr) +PrimaryGeneratorAction::PrimaryGeneratorAction() { G4int nofParticles = 1; fParticleGun = new G4ParticleGun(nofParticles); @@ -60,14 +61,14 @@ B4PrimaryGeneratorAction::B4PrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4PrimaryGeneratorAction::~B4PrimaryGeneratorAction() +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { // This function is called at the begining of event @@ -92,7 +93,7 @@ void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) msg << "World volume of box shape not found." << G4endl; msg << "Perhaps you have changed geometry." << G4endl; msg << "The gun will be place in the center."; - G4Exception("B4PrimaryGeneratorAction::GeneratePrimaries()", + G4Exception("PrimaryGeneratorAction::GeneratePrimaries()", "MyCode0002", JustWarning, msg); } @@ -105,3 +106,4 @@ void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} diff --git a/examples/basic/B4/B4a/src/B4RunAction.cc b/examples/basic/B4/B4c/src/RunAction.cc similarity index 89% rename from examples/basic/B4/B4a/src/B4RunAction.cc rename to examples/basic/B4/B4c/src/RunAction.cc index 8021ac11d9..53e8d5c82a 100644 --- a/examples/basic/B4/B4a/src/B4RunAction.cc +++ b/examples/basic/B4/B4c/src/RunAction.cc @@ -24,30 +24,31 @@ // ******************************************************************** // // -/// \file B4RunAction.cc -/// \brief Implementation of the B4RunAction class +/// \file RunAction.cc +/// \brief Implementation of the B4::RunAction class -#include "B4RunAction.hh" -#include "B4Analysis.hh" +#include "RunAction.hh" +#include "G4AnalysisManager.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +namespace B4 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4RunAction::B4RunAction() - : G4UserRunAction() +RunAction::RunAction() { // set printing event number per each event G4RunManager::GetRunManager()->SetPrintProgress(1); // Create analysis manager - // The choice of analysis technology is done via selectin of a namespace - // in B4Analysis.hh + // The choice of the output format is done via the specified + // file extension. auto analysisManager = G4AnalysisManager::Instance(); - G4cout << "Using " << analysisManager->GetType() << G4endl; // Create directories //analysisManager->SetHistoDirectoryName("histograms"); @@ -77,14 +78,13 @@ B4RunAction::B4RunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4RunAction::~B4RunAction() +RunAction::~RunAction() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4RunAction::BeginOfRunAction(const G4Run* /*run*/) +void RunAction::BeginOfRunAction(const G4Run* /*run*/) { //inform the runManager to save random number seed //G4RunManager::GetRunManager()->SetRandomNumberStore(true); @@ -94,13 +94,18 @@ void B4RunAction::BeginOfRunAction(const G4Run* /*run*/) // Open an output file // - G4String fileName = "B4"; + G4String fileName = "B4.root"; + // Other supported output types: + // G4String fileName = "B4.csv"; + // G4String fileName = "B4.hdf5"; + // G4String fileName = "B4.xml"; analysisManager->OpenFile(fileName); + G4cout << "Using " << analysisManager->GetType() << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4RunAction::EndOfRunAction(const G4Run* /*run*/) +void RunAction::EndOfRunAction(const G4Run* /*run*/) { // print histogram statistics // @@ -142,3 +147,5 @@ void B4RunAction::EndOfRunAction(const G4Run* /*run*/) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4d/CMakeLists.txt b/examples/basic/B4/B4d/CMakeLists.txt index 990d4bbf68..033efbf01a 100644 --- a/examples/basic/B4/B4d/CMakeLists.txt +++ b/examples/basic/B4/B4d/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B4d) #---------------------------------------------------------------------------- @@ -38,7 +38,7 @@ target_link_libraries(exampleB4d ${Geant4_LIBRARIES}) #---------------------------------------------------------------------------- # Copy all scripts to the build directory, i.e. the directory in which we -# build B4c. This is so that we can run the executable directly because it +# build B4d. This is so that we can run the executable directly because it # relies on these scripts being in the current working directory. # set(EXAMPLEB4D_SCRIPTS diff --git a/examples/basic/B4/B4d/exampleB4d.cc b/examples/basic/B4/B4d/exampleB4d.cc index 943254385d..d144e6cf40 100644 --- a/examples/basic/B4/B4d/exampleB4d.cc +++ b/examples/basic/B4/B4d/exampleB4d.cc @@ -27,10 +27,10 @@ /// \file exampleB4d.cc /// \brief Main program of the B4d example -#include "B4dDetectorConstruction.hh" -#include "B4dActionInitialization.hh" -#include "B4Analysis.hh" +#include "DetectorConstruction.hh" +#include "ActionInitialization.hh" +#include "G4AnalysisManager.hh" #include "G4RunManagerFactory.hh" #include "G4SteppingVerbose.hh" #include "G4TScoreNtupleWriter.hh" @@ -46,7 +46,7 @@ namespace { void PrintUsage() { G4cerr << " Usage: " << G4endl; - G4cerr << " exampleB4a [-m macro ] [-u UIsession] [-t nThreads] [-vDefault]" + G4cerr << " exampleB4d [-m macro ] [-u UIsession] [-t nThreads] [-vDefault]" << G4endl; G4cerr << " note: -t option is available only for multi-threaded mode." << G4endl; @@ -116,13 +116,13 @@ int main(int argc,char** argv) // Set mandatory initialization classes // - auto detConstruction = new B4dDetectorConstruction(); + auto detConstruction = new B4d::DetectorConstruction(); runManager->SetUserInitialization(detConstruction); auto physicsList = new FTFP_BERT; runManager->SetUserInitialization(physicsList); - auto actionInitialization = new B4dActionInitialization(); + auto actionInitialization = new B4d::ActionInitialization(); runManager->SetUserInitialization(actionInitialization); // Initialize visualization diff --git a/examples/basic/B4/B4d/exampleB4d.out b/examples/basic/B4/B4d/exampleB4d.out index c6aee3c62b..fa6603e467 100644 --- a/examples/basic/B4/B4d/exampleB4d.out +++ b/examples/basic/B4/B4d/exampleB4d.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -21,16 +21,6 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo <<< Geant4 Physics List simulation engine: FTFP_BERT -Using Root - --------- WWWW ------- G4Exception-START -------- WWWW ------- -*** G4Exception : Analysis_W013 - issued by : G4RootNtupleFileManager::SetNtupleMergingMode -Merging ntuples is not applicable in sequential application. -Setting was ignored. -*** This is just a warning message. *** --------- WWWW -------- G4Exception-END --------- WWWW ------- - Visualization Manager instantiating with verbosity "warnings (3)"... Visualization Manager initialising... Registering graphics systems... @@ -39,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -118,9 +106,9 @@ Some /vis commands (optionally) take a string to specify colour. -Checking overlaps for volume Calorimeter (G4Box) ... OK! -Checking overlaps for volume Abso (G4Box) ... OK! -Checking overlaps for volume Gap (G4Box) ... OK! +Checking overlaps for volume Calorimeter:0 (G4Box) ... OK! +Checking overlaps for volume Abso:0 (G4Box) ... OK! +Checking overlaps for volume Gap:0 (G4Box) ... OK! ------------------------------------------------------------ ---> The calorimeter is 10 layers of: [ 10mm of G4_Pb + 5mm of liquidArgon ] @@ -137,32 +125,99 @@ G4SDManager::AddNewCollection : the collection is registered a for neutron : 3 to 6 GeV ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -172,25 +227,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -200,29 +255,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -230,31 +285,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -263,12 +318,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -276,12 +331,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -289,31 +344,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -321,31 +376,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -353,31 +408,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -385,32 +440,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -418,32 +473,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -451,31 +506,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -483,27 +538,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -512,17 +567,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -530,67 +585,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -598,13 +653,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -612,13 +667,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -626,12 +681,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -639,13 +694,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -653,13 +708,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -667,13 +722,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -681,60 +736,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -742,27 +797,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -770,25 +825,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -796,25 +851,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -822,13 +877,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -851,26 +906,37 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. + +-------- WWWW ------- G4Exception-START -------- WWWW ------- +*** G4Exception : Analysis_W001 + issued by : G4RootNtupleFileManager::SetNtupleMergingMode +Merging ntuples is not applicable in sequential application. +Setting was ignored. +*** This is just a warning message. *** +-------- WWWW -------- G4Exception-END --------- WWWW ------- + +... set ntuple merging row mode : row-wise - done ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 276.418 MeV total track length: 20.0351 cm - Gap: total energy: 16.7054 MeV total track length: 8.39188 cm + Absorber: total energy: 281.979 MeV total track length: 20.3632 cm + Gap: total energy: 7.05731 MeV total track length: 3.5668 cm ----> print histograms statistic for the entire run - EAbs : mean = 276.418 MeV rms = 0 meV - EGap : mean = 16.7054 MeV rms = 0 meV - LAbs : mean = 20.0351 cm rms = 0 fm - LGap : mean = 8.39188 cm rms = 0 fm + EAbs : mean = 281.979 MeV rms = 0 eV + EGap : mean = 7.05731 MeV rms = 0 eV + LAbs : mean = 20.3632 cm rms = 0 fm + LGap : mean = 3.5668 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. @@ -898,7 +964,7 @@ See commands in /vis/modeling/trajectories/ for other options. hIoni, hIoni, hIoni, hIoni hIoni, hIoni, hIoni, hIoni hIoni, hIoni, photonNuclear, electronNuclear - muonNuclear, Decay, hadElastic, hadElastic + positronNuclear, muonNuclear, Decay, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic @@ -913,791 +979,61 @@ See commands in /vis/modeling/trajectories/ for other options. hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, neutronInelastic, nCapture - protonInelastic, pi+Inelastic, pi-Inelastic, kaon+Inelastic - kaon-Inelastic, kaon0LInelastic, kaon0SInelastic,anti_protonInelastic -anti_neutronInelastic,anti_deuteronInelastic,anti_tritonInelastic, anti_He3Inelastic -anti_alphaInelastic, lambdaInelastic, sigma+Inelastic, sigma-Inelastic - xi0Inelastic, xi-Inelastic, omega-Inelastic,anti_lambdaInelastic -anti_sigma+Inelastic,anti_sigma-Inelastic, anti_xi0Inelastic, anti_xi-Inelastic -anti_omega-Inelastic, D+Inelastic, D0Inelastic, D-Inelastic - anti_D0Inelastic, Ds+Inelastic, Ds-Inelastic, B+Inelastic - B0Inelastic, B-Inelastic, anti_B0Inelastic, Bs0Inelastic - anti_Bs0Inelastic, Bc+Inelastic, Bc-Inelastic, lambda_c+Inelastic - xi_c+Inelastic, xi_c0Inelastic, omega_c0Inelastic, lambda_bInelastic - xi_b0Inelastic, xi_b-Inelastic, omega_b-Inelastic,anti_lambda_c+Inelastic -anti_xi_c+Inelastic,anti_xi_c0Inelastic,anti_omega_c0Inelastic,anti_lambda_bInelastic -anti_xi_b0Inelastic,anti_xi_b-Inelastic,anti_omega_b-Inelastic,hFritiofCaptureAtRest -hBertiniCaptureAtRest,muMinusCaptureAtRest, dInelastic, tInelastic - He3Inelastic, alphaInelastic, ionInelastic, nKiller - - -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + hadElastic, hadElastic, hadElastic, neutronInelastic + nCapture, protonInelastic, pi+Inelastic, pi-Inelastic + kaon+Inelastic, kaon-Inelastic, kaon0LInelastic, kaon0SInelastic +anti_protonInelastic,anti_neutronInelastic,anti_deuteronInelastic,anti_tritonInelastic + anti_He3Inelastic,anti_alphaInelastic, lambdaInelastic, sigma+Inelastic + sigma-Inelastic, xi0Inelastic, xi-Inelastic, omega-Inelastic +anti_lambdaInelastic,anti_sigma+Inelastic,anti_sigma-Inelastic, anti_xi0Inelastic + anti_xi-Inelastic,anti_omega-Inelastic, D+Inelastic, D0Inelastic + D-Inelastic, anti_D0Inelastic, Ds+Inelastic, Ds-Inelastic + B+Inelastic, B0Inelastic, B-Inelastic, anti_B0Inelastic + Bs0Inelastic, anti_Bs0Inelastic, Bc+Inelastic, Bc-Inelastic + lambda_c+Inelastic, xi_c+Inelastic, xi_c0Inelastic, omega_c0Inelastic + lambda_bInelastic, xi_b0Inelastic, xi_b-Inelastic, omega_b-Inelastic +anti_lambda_c+Inelastic,anti_xi_c+Inelastic,anti_xi_c0Inelastic,anti_omega_c0Inelastic +anti_lambda_bInelastic,anti_xi_b0Inelastic,anti_xi_b-Inelastic,anti_omega_b-Inelastic +hFritiofCaptureAtRest,hBertiniCaptureAtRest,muMinusCaptureAtRest, dInelastic + tInelastic, He3Inelastic, alphaInelastic, ionInelastic + nKiller ### Run 1 starts. ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 276.851 MeV total track length: 20.6185 cm - Gap: total energy: 15.9299 MeV total track length: 8.21284 cm + Absorber: total energy: 280.59 MeV total track length: 20.2565 cm + Gap: total energy: 17.1134 MeV total track length: 8.57952 cm ----> print histograms statistic for the entire run - EAbs : mean = 276.851 MeV rms = 0 meV - EGap : mean = 15.9299 MeV rms = 0 meV - LAbs : mean = 20.6185 cm rms = 0 fm - LGap : mean = 8.21284 cm rms = 0 fm + EAbs : mean = 280.59 MeV rms = 0 eV + EGap : mean = 17.1134 MeV rms = 0 eV + LAbs : mean = 20.2565 cm rms = 0 fm + LGap : mean = 8.57952 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. - -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV ### Run 2 starts. ... create file : B4.root - done ... open analysis file : B4.root - done +... open analysis file : B4.root - done +Using --> Event 0 starts. ---> End of event: 0 - Absorber: total energy: 468.054 MeV total track length: 34.15 cm - Gap: total energy: 27.9107 MeV total track length: 14.3207 cm + Absorber: total energy: 469.283 MeV total track length: 33.8386 cm + Gap: total energy: 18.5204 MeV total track length: 9.32324 cm ----> print histograms statistic for the entire run - EAbs : mean = 468.054 MeV rms = 0 meV - EGap : mean = 27.9107 MeV rms = 0 meV - LAbs : mean = 34.15 cm rms = 0 fm - LGap : mean = 14.3207 cm rms = 0 fm + EAbs : mean = 469.283 MeV rms = 0 eV + EGap : mean = 18.5204 MeV rms = 0 eV + LAbs : mean = 33.8386 cm rms = 0 fm + LGap : mean = 9.32324 cm rms = 0 fm ... write file : B4.root - done ... close file : B4.root - done 0 events have been kept for refreshing and/or reviewing. @@ -1705,4 +1041,4 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. Graphics systems deleted. Visualization Manager deleting... -### deleting chargedFilter 0x13cd220 +### deleting chargedFilter 0x1c3d620 diff --git a/examples/basic/B4/B4d/include/B4dActionInitialization.hh b/examples/basic/B4/B4d/include/ActionInitialization.hh similarity index 85% rename from examples/basic/B4/B4d/include/B4dActionInitialization.hh rename to examples/basic/B4/B4d/include/ActionInitialization.hh index 1abe45a950..716558639d 100644 --- a/examples/basic/B4/B4d/include/B4dActionInitialization.hh +++ b/examples/basic/B4/B4d/include/ActionInitialization.hh @@ -24,27 +24,31 @@ // ******************************************************************** // // -/// \file B4dActionInitialization.hh -/// \brief Definition of the B4dActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the B4d::ActionInitialization class #ifndef B4dActionInitialization_h #define B4dActionInitialization_h 1 #include "G4VUserActionInitialization.hh" -/// Action initialization class. -/// +namespace B4d +{ -class B4dActionInitialization : public G4VUserActionInitialization +/// Action initialization class. + +class ActionInitialization : public G4VUserActionInitialization { public: - B4dActionInitialization(); - virtual ~B4dActionInitialization(); + ActionInitialization(); + ~ActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; + void BuildForMaster() const override; + void Build() const override; }; +} + #endif diff --git a/examples/basic/B4/B4d/include/B4Analysis.hh b/examples/basic/B4/B4d/include/B4Analysis.hh deleted file mode 100644 index 78c4412df4..0000000000 --- a/examples/basic/B4/B4d/include/B4Analysis.hh +++ /dev/null @@ -1,40 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file B4Analysis.hh -/// \brief Selection of the analysis technology - -#ifndef B4Analysis_h -#define B4Analysis_h 1 - -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" - -//#include "G4GenericAnalysisManager.hh" -//using G4AnalysisManager = G4GenericAnalysisManager; - -#endif diff --git a/examples/basic/B4/B4d/include/B4dDetectorConstruction.hh b/examples/basic/B4/B4d/include/DetectorConstruction.hh similarity index 87% rename from examples/basic/B4/B4d/include/B4dDetectorConstruction.hh rename to examples/basic/B4/B4d/include/DetectorConstruction.hh index 5c8503c489..2f0e6edfc8 100644 --- a/examples/basic/B4/B4d/include/B4dDetectorConstruction.hh +++ b/examples/basic/B4/B4d/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4dDetectorConstruction.hh -/// \brief Definition of the B4dDetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the B4d::DetectorConstruction class #ifndef B4dDetectorConstruction_h #define B4dDetectorConstruction_h 1 @@ -36,6 +36,9 @@ class G4VPhysicalVolume; class G4GlobalMagFieldMessenger; +namespace B4d +{ + /// Detector construction class to define materials and geometry. /// The calorimeter is a box made of a given number of layers. A layer consists /// of an absorber plate and of a detection gap. The layer is replicated. @@ -52,15 +55,15 @@ class G4GlobalMagFieldMessenger; /// and Gap volumes. In addition a transverse uniform magnetic field is defined /// via G4GlobalMagFieldMessenger class. -class B4dDetectorConstruction : public G4VUserDetectorConstruction +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B4dDetectorConstruction(); - virtual ~B4dDetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; public: - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; private: // methods @@ -73,10 +76,11 @@ class B4dDetectorConstruction : public G4VUserDetectorConstruction static G4ThreadLocal G4GlobalMagFieldMessenger* fMagFieldMessenger; // magnetic field messenger - G4bool fCheckOverlaps; // option to activate checking of volumes overlaps + G4bool fCheckOverlaps = true; // option to activate checking of volumes overlaps }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - diff --git a/examples/basic/B4/B4d/include/B4dEventAction.hh b/examples/basic/B4/B4d/include/EventAction.hh similarity index 83% rename from examples/basic/B4/B4d/include/B4dEventAction.hh rename to examples/basic/B4/B4d/include/EventAction.hh index 49948304ff..0817f2652e 100644 --- a/examples/basic/B4/B4d/include/B4dEventAction.hh +++ b/examples/basic/B4/B4d/include/EventAction.hh @@ -24,31 +24,34 @@ // ******************************************************************** // // -/// \file B4dEventAction.hh -/// \brief Definition of the B4dEventAction class +/// \file EventAction.hh +/// \brief Definition of the EventAction class -#ifndef B4dEventAction_h -#define B4dEventAction_h 1 +#ifndef EventAction_h +#define EventAction_h 1 #include "G4UserEventAction.hh" #include "G4THitsMap.hh" #include "globals.hh" +namespace B4d +{ + /// Event action class /// /// In EndOfEventAction(), it prints the accumulated quantities of the energy /// deposit and track lengths of charged particles in Absober and Gap layers /// stored in the hits collections. -class B4dEventAction : public G4UserEventAction +class EventAction : public G4UserEventAction { public: - B4dEventAction(); - virtual ~B4dEventAction(); + EventAction(); + ~EventAction() override; - virtual void BeginOfEventAction(const G4Event* event); - virtual void EndOfEventAction(const G4Event* event); + void BeginOfEventAction(const G4Event* event) override; + void EndOfEventAction(const G4Event* event) override; private: // methods @@ -59,14 +62,14 @@ private: G4double gapEdep, G4double gapTrackLength) const; // data members - G4int fAbsoEdepHCID; - G4int fGapEdepHCID; - G4int fAbsoTrackLengthHCID; - G4int fGapTrackLengthHCID; + G4int fAbsoEdepHCID = -1; + G4int fGapEdepHCID = -1; + G4int fAbsoTrackLengthHCID = -1; + G4int fGapTrackLengthHCID = -1; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - - diff --git a/examples/basic/B4/B4d/include/B4PrimaryGeneratorAction.hh b/examples/basic/B4/B4d/include/PrimaryGeneratorAction.hh similarity index 86% rename from examples/basic/B4/B4d/include/B4PrimaryGeneratorAction.hh rename to examples/basic/B4/B4d/include/PrimaryGeneratorAction.hh index 9e2a99aa73..debeaa24a4 100644 --- a/examples/basic/B4/B4d/include/B4PrimaryGeneratorAction.hh +++ b/examples/basic/B4/B4d/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4PrimaryGeneratorAction.hh -/// \brief Definition of the B4PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the PrimaryGeneratorAction class #ifndef B4PrimaryGeneratorAction_h #define B4PrimaryGeneratorAction_h 1 @@ -36,6 +36,9 @@ class G4ParticleGun; class G4Event; +namespace B4 +{ + /// The primary generator action class with particle gum. /// /// It defines a single particle which hits the calorimeter @@ -43,21 +46,23 @@ class G4Event; /// can be changed via the G4 build-in commands of G4ParticleGun class /// (see the macros provided with this example). -class B4PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B4PrimaryGeneratorAction(); - virtual ~B4PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event* event); + void GeneratePrimaries(G4Event* event) override; // set methods void SetRandomFlag(G4bool value); private: - G4ParticleGun* fParticleGun; // G4 particle gun + G4ParticleGun* fParticleGun = nullptr; // G4 particle gun }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B4/B4a/include/B4RunAction.hh b/examples/basic/B4/B4d/include/RunAction.hh similarity index 88% rename from examples/basic/B4/B4a/include/B4RunAction.hh rename to examples/basic/B4/B4d/include/RunAction.hh index 40f41a210f..02e6c9f982 100644 --- a/examples/basic/B4/B4a/include/B4RunAction.hh +++ b/examples/basic/B4/B4d/include/RunAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B4RunAction.hh -/// \brief Definition of the B4RunAction class +/// \file RunAction.hh +/// \brief Definition of the B4::RunAction class #ifndef B4RunAction_h #define B4RunAction_h 1 @@ -35,6 +35,9 @@ class G4Run; +namespace B4 +{ + /// Run action class /// /// It accumulates statistic and computes dispersion of the energy deposit @@ -47,23 +50,24 @@ class G4Run; /// - Track length in gap /// The same values are also saved in the ntuple. /// The histograms and ntuple are saved in the output file in a format -/// accoring to a selected technology in B4Analysis.hh. +/// according to a specified file extension. /// /// In EndOfRunAction(), the accumulated statistic and computed /// dispersion is printed. /// -class B4RunAction : public G4UserRunAction +class RunAction : public G4UserRunAction { public: - B4RunAction(); - virtual ~B4RunAction(); + RunAction(); + ~RunAction() override; - virtual void BeginOfRunAction(const G4Run*); - virtual void EndOfRunAction(const G4Run*); + void BeginOfRunAction(const G4Run*) override; + void EndOfRunAction(const G4Run*) override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - diff --git a/examples/basic/B4/B4d/src/ActionInitialization.cc b/examples/basic/B4/B4d/src/ActionInitialization.cc new file mode 100644 index 0000000000..55583d5b73 --- /dev/null +++ b/examples/basic/B4/B4d/src/ActionInitialization.cc @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +/// \file ActionInitialization.cc +/// \brief Implementation of the B4d::ActionInitialization class + +#include "ActionInitialization.hh" +#include "PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "EventAction.hh" + +using namespace B4; + +namespace B4d +{ + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::~ActionInitialization() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::BuildForMaster() const +{ + SetUserAction(new RunAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::Build() const +{ + SetUserAction(new PrimaryGeneratorAction); + SetUserAction(new RunAction); + SetUserAction(new EventAction); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4d/src/B4dActionInitialization.cc b/examples/basic/B4/B4d/src/B4dActionInitialization.cc deleted file mode 100644 index 69ef3c60bd..0000000000 --- a/examples/basic/B4/B4d/src/B4dActionInitialization.cc +++ /dev/null @@ -1,62 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file B4dActionInitialization.cc -/// \brief Implementation of the B4dActionInitialization class - -#include "B4dActionInitialization.hh" -#include "B4PrimaryGeneratorAction.hh" -#include "B4RunAction.hh" -#include "B4dEventAction.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B4dActionInitialization::B4dActionInitialization() - : G4VUserActionInitialization() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -B4dActionInitialization::~B4dActionInitialization() -{;} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B4dActionInitialization::BuildForMaster() const -{ - SetUserAction(new B4RunAction); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B4dActionInitialization::Build() const -{ - SetUserAction(new B4PrimaryGeneratorAction); - SetUserAction(new B4RunAction); - SetUserAction(new B4dEventAction); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B4/B4d/src/B4dDetectorConstruction.cc b/examples/basic/B4/B4d/src/DetectorConstruction.cc similarity index 94% rename from examples/basic/B4/B4d/src/B4dDetectorConstruction.cc rename to examples/basic/B4/B4d/src/DetectorConstruction.cc index 89778d50c5..bc1d8d065c 100644 --- a/examples/basic/B4/B4d/src/B4dDetectorConstruction.cc +++ b/examples/basic/B4/B4d/src/DetectorConstruction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B4dDetectorConstruction.cc -/// \brief Implementation of the B4dDetectorConstruction class +/// \file DetectorConstruction.cc +/// \brief Implementation of the B4d::DetectorConstruction class -#include "B4dDetectorConstruction.hh" +#include "DetectorConstruction.hh" #include "G4Material.hh" #include "G4NistManager.hh" @@ -52,28 +52,29 @@ #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" +namespace B4d +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ThreadLocal -G4GlobalMagFieldMessenger* B4dDetectorConstruction::fMagFieldMessenger = nullptr; +G4GlobalMagFieldMessenger* DetectorConstruction::fMagFieldMessenger = nullptr; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4dDetectorConstruction::B4dDetectorConstruction() - : G4VUserDetectorConstruction(), - fCheckOverlaps(true) +DetectorConstruction::DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4dDetectorConstruction::~B4dDetectorConstruction() +DetectorConstruction::~DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B4dDetectorConstruction::Construct() +G4VPhysicalVolume* DetectorConstruction::Construct() { // Define materials DefineMaterials(); @@ -84,7 +85,7 @@ G4VPhysicalVolume* B4dDetectorConstruction::Construct() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4dDetectorConstruction::DefineMaterials() +void DetectorConstruction::DefineMaterials() { // Lead material defined using NIST Manager auto nistManager = G4NistManager::Instance(); @@ -107,7 +108,7 @@ void B4dDetectorConstruction::DefineMaterials() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4VPhysicalVolume* B4dDetectorConstruction::DefineVolumes() +G4VPhysicalVolume* DetectorConstruction::DefineVolumes() { // Geometry parameters G4int nofLayers = 10; @@ -128,7 +129,7 @@ G4VPhysicalVolume* B4dDetectorConstruction::DefineVolumes() if ( ! defaultMaterial || ! absorberMaterial || ! gapMaterial ) { G4ExceptionDescription msg; msg << "Cannot retrieve materials already defined."; - G4Exception("B4DetectorConstruction::DefineVolumes()", + G4Exception("DetectorConstruction::DefineVolumes()", "MyCode0001", FatalException, msg); } @@ -275,7 +276,7 @@ G4VPhysicalVolume* B4dDetectorConstruction::DefineVolumes() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4dDetectorConstruction::ConstructSDandField() +void DetectorConstruction::ConstructSDandField() { G4SDManager::GetSDMpointer()->SetVerboseLevel(1); // @@ -327,3 +328,5 @@ void B4dDetectorConstruction::ConstructSDandField() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4d/src/B4dEventAction.cc b/examples/basic/B4/B4d/src/EventAction.cc similarity index 89% rename from examples/basic/B4/B4d/src/B4dEventAction.cc rename to examples/basic/B4/B4d/src/EventAction.cc index 8396c2cfed..a5fbe12d41 100644 --- a/examples/basic/B4/B4d/src/B4dEventAction.cc +++ b/examples/basic/B4/B4d/src/EventAction.cc @@ -24,12 +24,12 @@ // ******************************************************************** // // -/// \file B4dEventAction.cc -/// \brief Implementation of the B4dEventAction class +/// \file EventAction.cc +/// \brief Implementation of the B4d::EventAction class -#include "B4dEventAction.hh" -#include "B4Analysis.hh" +#include "EventAction.hh" +#include "G4AnalysisManager.hh" #include "G4RunManager.hh" #include "G4Event.hh" #include "G4SDManager.hh" @@ -39,25 +39,23 @@ #include "Randomize.hh" #include +namespace B4d +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4dEventAction::B4dEventAction() - : G4UserEventAction(), - fAbsoEdepHCID(-1), - fGapEdepHCID(-1), - fAbsoTrackLengthHCID(-1), - fGapTrackLengthHCID(-1) +EventAction::EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4dEventAction::~B4dEventAction() +EventAction::~EventAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4THitsMap* -B4dEventAction::GetHitsCollection(G4int hcID, +EventAction::GetHitsCollection(G4int hcID, const G4Event* event) const { auto hitsCollection @@ -67,7 +65,7 @@ B4dEventAction::GetHitsCollection(G4int hcID, if ( ! hitsCollection ) { G4ExceptionDescription msg; msg << "Cannot access hitsCollection ID " << hcID; - G4Exception("B4dEventAction::GetHitsCollection()", + G4Exception("EventAction::GetHitsCollection()", "MyCode0003", FatalException, msg); } @@ -76,7 +74,7 @@ B4dEventAction::GetHitsCollection(G4int hcID, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4double B4dEventAction::GetSum(G4THitsMap* hitsMap) const +G4double EventAction::GetSum(G4THitsMap* hitsMap) const { G4double sumValue = 0.; for ( auto it : *hitsMap->GetMap() ) { @@ -88,7 +86,7 @@ G4double B4dEventAction::GetSum(G4THitsMap* hitsMap) const //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4dEventAction::PrintEventStatistics( +void EventAction::PrintEventStatistics( G4double absoEdep, G4double absoTrackLength, G4double gapEdep, G4double gapTrackLength) const { @@ -109,12 +107,12 @@ void B4dEventAction::PrintEventStatistics( //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4dEventAction::BeginOfEventAction(const G4Event* /*event*/) +void EventAction::BeginOfEventAction(const G4Event* /*event*/) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4dEventAction::EndOfEventAction(const G4Event* event) +void EventAction::EndOfEventAction(const G4Event* event) { // Get hist collections IDs if ( fAbsoEdepHCID == -1 ) { @@ -167,3 +165,5 @@ void B4dEventAction::EndOfEventAction(const G4Event* event) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/B4b/src/B4PrimaryGeneratorAction.cc b/examples/basic/B4/B4d/src/PrimaryGeneratorAction.cc similarity index 89% rename from examples/basic/B4/B4b/src/B4PrimaryGeneratorAction.cc rename to examples/basic/B4/B4d/src/PrimaryGeneratorAction.cc index 41994a9778..471aa628bb 100644 --- a/examples/basic/B4/B4b/src/B4PrimaryGeneratorAction.cc +++ b/examples/basic/B4/B4d/src/PrimaryGeneratorAction.cc @@ -24,10 +24,10 @@ // ******************************************************************** // // -/// \file B4PrimaryGeneratorAction.cc -/// \brief Implementation of the B4PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.cc +/// \brief Implementation of the B4::PrimaryGeneratorAction class -#include "B4PrimaryGeneratorAction.hh" +#include "PrimaryGeneratorAction.hh" #include "G4RunManager.hh" #include "G4LogicalVolumeStore.hh" @@ -40,11 +40,12 @@ #include "G4SystemOfUnits.hh" #include "Randomize.hh" +namespace B4 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4PrimaryGeneratorAction::B4PrimaryGeneratorAction() - : G4VUserPrimaryGeneratorAction(), - fParticleGun(nullptr) +PrimaryGeneratorAction::PrimaryGeneratorAction() { G4int nofParticles = 1; fParticleGun = new G4ParticleGun(nofParticles); @@ -60,14 +61,14 @@ B4PrimaryGeneratorAction::B4PrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4PrimaryGeneratorAction::~B4PrimaryGeneratorAction() +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { // This function is called at the begining of event @@ -92,7 +93,7 @@ void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) msg << "World volume of box shape not found." << G4endl; msg << "Perhaps you have changed geometry." << G4endl; msg << "The gun will be place in the center."; - G4Exception("B4PrimaryGeneratorAction::GeneratePrimaries()", + G4Exception("PrimaryGeneratorAction::GeneratePrimaries()", "MyCode0002", JustWarning, msg); } @@ -105,3 +106,4 @@ void B4PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +} diff --git a/examples/basic/B4/B4d/src/B4RunAction.cc b/examples/basic/B4/B4d/src/RunAction.cc similarity index 89% rename from examples/basic/B4/B4d/src/B4RunAction.cc rename to examples/basic/B4/B4d/src/RunAction.cc index 8021ac11d9..53e8d5c82a 100644 --- a/examples/basic/B4/B4d/src/B4RunAction.cc +++ b/examples/basic/B4/B4d/src/RunAction.cc @@ -24,30 +24,31 @@ // ******************************************************************** // // -/// \file B4RunAction.cc -/// \brief Implementation of the B4RunAction class +/// \file RunAction.cc +/// \brief Implementation of the B4::RunAction class -#include "B4RunAction.hh" -#include "B4Analysis.hh" +#include "RunAction.hh" +#include "G4AnalysisManager.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +namespace B4 +{ + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4RunAction::B4RunAction() - : G4UserRunAction() +RunAction::RunAction() { // set printing event number per each event G4RunManager::GetRunManager()->SetPrintProgress(1); // Create analysis manager - // The choice of analysis technology is done via selectin of a namespace - // in B4Analysis.hh + // The choice of the output format is done via the specified + // file extension. auto analysisManager = G4AnalysisManager::Instance(); - G4cout << "Using " << analysisManager->GetType() << G4endl; // Create directories //analysisManager->SetHistoDirectoryName("histograms"); @@ -77,14 +78,13 @@ B4RunAction::B4RunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4RunAction::~B4RunAction() +RunAction::~RunAction() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4RunAction::BeginOfRunAction(const G4Run* /*run*/) +void RunAction::BeginOfRunAction(const G4Run* /*run*/) { //inform the runManager to save random number seed //G4RunManager::GetRunManager()->SetRandomNumberStore(true); @@ -94,13 +94,18 @@ void B4RunAction::BeginOfRunAction(const G4Run* /*run*/) // Open an output file // - G4String fileName = "B4"; + G4String fileName = "B4.root"; + // Other supported output types: + // G4String fileName = "B4.csv"; + // G4String fileName = "B4.hdf5"; + // G4String fileName = "B4.xml"; analysisManager->OpenFile(fileName); + G4cout << "Using " << analysisManager->GetType() << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4RunAction::EndOfRunAction(const G4Run* /*run*/) +void RunAction::EndOfRunAction(const G4Run* /*run*/) { // print histogram statistics // @@ -142,3 +147,5 @@ void B4RunAction::EndOfRunAction(const G4Run* /*run*/) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +} diff --git a/examples/basic/B4/CMakeLists.txt b/examples/basic/B4/CMakeLists.txt index 4cbcb5df8a..c5ac1c38b8 100644 --- a/examples/basic/B4/CMakeLists.txt +++ b/examples/basic/B4/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding example N3 subdirectories explicitly # and a custom target to for building all example N3 options ---------- -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(B4a) add_subdirectory(B4b) diff --git a/examples/basic/B4/History b/examples/basic/B4/History index 310cf84f30..8f3dc05319 100644 --- a/examples/basic/B4/History +++ b/examples/basic/B4/History @@ -14,9 +14,23 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06-10-21 I. Hrivnacova (exampleB4-V10-07-06) +- Migration to new G4AnalysisManager.hh header; + removed Analysis.hh, + define the output file name with an extension + +19-07-21 I. Hrivnacova (exampleB4-V10-07-05) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + +13-07-21 I. Hrivnacova (exampleB4-V10-07-04) +- Introduced namespace instead of a class names prefix +- Declare overriding functions 'override' (and removed 'virtual' keyword) + 31-05-21 I. Hrivnacova (exampleB4-V10-07-03) - Use G4SteppingVerboseWithUnits, added option to switch to - the Geant4 default stepping verbose (-vDefault) + the Geant4 default stepping verbose (-vDefault) - Use nullptr instead of 0 - Clean trailing whitespaces from all files diff --git a/examples/basic/B4/README b/examples/basic/B4/README deleted file mode 100644 index 90778d0dcb..0000000000 --- a/examples/basic/B4/README +++ /dev/null @@ -1,269 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example B4 - ----------- - - This example simulates a simple Sampling Calorimeter setup. - To demonstrate several possible ways of data scoring, the example - is provided in four variants: B4a, B4b, B4c, B4d. - (See also examples/extended/electromagnetic/TestEm3) - - 1- GEOMETRY DEFINITION - - The geometry is constructed in B4[c,d]DetectorConstruction class. - The calorimeter is a box made of a given number of layers. A layer - consists of an absorber plate and of a detection gap. The layer is - replicated. - - Four parameters define the geometry of the calorimeter : - - the thickness of an absorber plate, - - the thickness of a gap, - - the number of layers, and - - the transverse size of the calorimeter (the entrance face is a square). - - In addition, a global, uniform, and transverse magnetic field can be - applied using G4GlobalMagFieldMessenger, instantiated in - B4[c,d]DetectorConstruction::ConstructSDandField - with a non zero field value, or via interactive commands. - For example: - - /globalField/setValue 0.2 0 0 tesla - - - |<----layer 0---------->|<----layer 1---------->|<----layer 2---------->| - | | | | - ========================================================================== - || | || | || | || - || | || | || | || - beam || absorber | gap || absorber | gap || absorber | gap || -======> || | || | || | || - || | || | || | || - ========================================================================== - - A more general version of this geometry can be found in: - examples/extended/electromagnetic/TestEm3 - where all the geometry parameters, the absorber and gap materials - can be modified interactively via the commands defined in the DetectorMessenger - class. - - 2- PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set in the FTFP_BERT physics list. This physics list - requires data files for electromagnetic and hadronic processes. - See more on installation of the datasets in Geant4 Installation Guide, - Chapter 3.3: Note On Geant4 Datasets: - http://geant4.web.cern.ch/geant4/UserDocumentation/UsersGuides/InstallationGuide/html/ch03s03.html - The following datasets: G4LEDATA, G4LEVELGAMMADATA, G4SAIDXSDATA and - G4ENSDFSTATEDATA are mandatory for this example. - - In addition the build-in interactive command: - /process/(in)activate processName - allows to activate/inactivate the processes one by one. - - 3- ACTION INITALIZATION - - A newly introduced class, B4[a,b,c,d]ActionInitialization, - instantiates and registers to Geant4 kernel all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B4[a,b,c,d]ActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - B4[a,b,c,d]ActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - - 4- PRIMARY GENERATOR - - The primary beam consists of a single particle which hits the - calorimeter perpendicular to the input face. The type of the particle - and its energy are set in the B4PrimaryGeneratorAction class, and can - be changed via the G4 built-in commands of the G4ParticleGun class (see - the macros provided with this example). - - 5- RUNS and EVENTS - - A run is a set of events. - The user can choose the frequency of printing via the Geant4 interactive - command, for example: - - /run/printProgress 100 - - 6- DETECTOR RESPONSE - - The energy deposit and track lengths of the charged particles are recorded on - an event by event basis in the Absober and Gap layers. - - In order to demonstrate several possible ways of data scoring, - the example is provided in four variants: - - Variant a: User Actions - - These 4 quantities are data members of the B4aEventAction class. - They are collected step by step in - B4aSteppingAction::UserSteppingAction(), and passed to the event action - via two methods: B4aEventAction::AddAbs() and B4aEventAction::AddGap(). - - In B4aEventAction::EndOfEventAction(), these quantities are printed and - filled in H1D histograms and ntuple to accumulate statistic and compute - dispersion. - - Variant b: User data object - - In order to avoid dependencies between action classes, a user object - B4bRunData, derived from G4Run, is defined with data members needed - for the accounted information. - In order to reduce the number of data members a 2-dimensions array - is introduced for each quantity. - Then the quantities are collected step by step in user action classes: - B4bSteppingAction::UserSteppingAction() and - B4bEventAction::EndOfEventAction() in a similar way as in variant a. - - Variant c: Hits and Sensitive detectors - - In this option, the physics quantities are accounted using the hits - and sensitive detectors framework defined in the Geant4 kernel. - The physics quantities are stored in B4cCalorHit via two B4cCalorimeterSD - objects, one associated with the Absorber volume and another one with Gap - in B4cDetectorConstruction::ConstructSDandField(). - - In contrary to the B2 example (Tracker) where a new hit is created - with each track passing the sensitive volume (in the calorimeter), only one - hit is created for each calorimeter layer and one more hit to account for - the total quantities in all layers. In addition to the variants a and b, - the quantities per each layer are also available in addition to the total - quantities. - - Variant d: Scorer - - In this option, the Geant4 scorers which are defined on the top of hits - and sensitive detectors Geant4 framework are used. - In practice this means that the user does not need to define hits and sensitive - detector classes but rather uses the classes already defined - in Geant4. In this example, the G4MultiFunctionalDetector with - G4PSEnergyDeposit and G4PSTrackLength primitive scores are used (see - B4dDetectorConstruction::ConstructSDandField()). - - The scorers hits are saved in form of ntuples in a Root file using Geant4 - analysis tools. This feature is activated in the main () function with instantiating - G4TScoreNtupleWriter. - - Also with this approach, the quantities per each layer are available - in addition to the total quantities. - - 7- HISTOGRAMS - - The analysis tools are used to accumulate statistics and compute the dispersion - of the energy deposit and track lengths of the charged particles. - H1D histograms are created in B4[b]RunAction::B4[b]RunAction() for the - following quantities: - - Energy deposit in absorber - - Energy deposit in gap - - Track length in absorber - - Track length in gap - The same values are also saved in an ntuple. - - The histograms and the ntuple are saved in the output file in a format - according to a technology selected in B4Analysis.hh, the default in this example - is ROOT. - - The accumulated statistic and computed dispersion is printed at the end of - run, in B4RunAction::EndOfRunAction(). - When running in multi-threading mode, the histograms and the ntuple accumulated - on threads are merged in a single output file. While merging of histograms is - performed by default, merging of ntuples is explicitly activated in the B4RunAction - constructor. - - The ROOT histograms and ntuple can be plotted with ROOT using the plotHisto.C - and plotNtuple.C macros. - - 8- HOW TO RUN - - This example handles the program arguments in a new way. - It can be run with the following optional arguments: - % exampleB4a [-m macro ] [-u UIsession] [-t nThreads] [-vDefault] - - The -vDefault option will activate using the default Geant4 stepping verbose - class (G4SteppingVerbose) instead of the enhanced stepping verbose with best - units (G4SteppingVerboseWithUnits) used in the example by default. - - The -t option is available only in multi-threading mode - and it allows the user to override the Geant4 default number of - threads. The number of threads can be also set via G4FORCENUMBEROFTHREADS - environment variable which has the top priority. - - - Execute exampleB4a in the 'interactive mode' with visualization - % exampleB4a - and type in the commands from run1.mac line by line: - Idle> /tracking/verbose 1 - Idle> /run/beamOn 1 - Idle> ... - Idle> exit - or - Idle> /control/execute run1.mac - .... - Idle> exit - - - Execute exampleB4a in the 'batch' mode from macro files - (without visualization) - % exampleB4a -m run2.mac - % exampleB4a -m exampleB4.in > exampleB4.out - - - Execute exampleB4a in the 'interactive mode' with a selected UI session, - e.g. tcsh - % exampleB4a -u tcsh - - The following paragraphs are common to all basic examples - - A- VISUALIZATION - - The visualization manager is set via the G4VisExecutive class - in the main() function in exampleB4a.cc. - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then - /vis/open DAWNFILE - then to get the same view - /vis/viewer/copyView viewer-0 - or to get the same view *plus* scene-modifications - /vis/viewer/set/all viewer-0 - then to see the result - /vis/viewer/flush - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example, - http://geant4.slac.stanford.edu/Presentations/vis/G4[VIS]Tutorial/G4[VIS]Tutorial.html - (where [VIS] can be replaced by DAWN, OpenGL and HepRApp) - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - - B- USER INTERFACES - - The user command interface is set via the G4UIExecutive class - in the main() function in exampleB4a.cc - The selection of the user command interface is then done automatically - according to the Geant4 configuration or it can be done explicitly via - the third argument of the G4UIExecutive constructor (see exampleB4a.cc). diff --git a/examples/basic/B5/.README.txt b/examples/basic/B5/.README.txt deleted file mode 100644 index 359f82a4c9..0000000000 --- a/examples/basic/B5/.README.txt +++ /dev/null @@ -1,331 +0,0 @@ - -///\file "B5/.README.txt" -///\brief Example B5 README page - -/*! \page ExampleB5 Example B5 - - Example B5 implements a double-arm spectrometer with wire chambers, - hodoscopes and calorimeters. Event simulation and collection are - enabled, as well as event display and analysis. - - -\section B5_s1 GEOMETRY - - The spectrometer consists of two detector arms - (see B5DetectorConstruction). One arm provides - position and timing information of the incident particle while the - other collects position, timing and energy information of the particle - after it has been deflected by a magnetic field centered at the - spectrometer pivot point. - - - First arm: box filled with air, also containing: - - 1 hodoscope (15 vertical strips of plastic scintillator) - - 1 drift chamber (5 horizontal argon gas layers with a - "virtual wire" at the center of each layer) - - - Second arm: box filled with air, also containing: - - 1 hodoscope (25 vertical strips of plastic scintillator) - - 1 drift chamber (5 horizontal argon gas layers with a - "virtual wire" at the center of each layer) - - 1 electromagnetic calorimeter: - a box sub-divided along x,y and z - axes into cells of CsI - - 1 hadronic calorimeter: - a box sub-divided along x,y, and z axes - into cells of lead, with a layer of - plastic scintillator placed at the center - of each cell - - - Magnetic field region: air-filled cylinder which contains - the field (see B5MagneticField) - - The maximum step limit in the magnetic field region is also set - via the G4UserLimits class in a similar way as in Example B2 - (see \ref B2_s6 in B2 example documentation). - - The rotation angle of the second arm and the magnetic field value - can be set via the interactive commands defined using the G4GenericMessenger - class. - -\section B5_s2 PHYSICS - - This example uses the reference hadronic physics list, FTFP_BERT, - and also adds the G4StepLimiter process. - -\section B5_s3 ACTION INITALIZATION - - B5ActionInitialization class - instantiates and registers to Geant4 kernel all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B5ActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - B5ActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - -\section B5_s4 PRIMARY GENERATOR - - The primary generator action class employs the G4ParticleGun. - The primary kinematics consists of a single particle which is - is sent in the direction of the first spectrometer arm. - - The type of the particle and its several properties can be changed - via the G4 built-in commands of the G4ParticleGun class or - this example command defined using the G4GenericMessenger class. - - -\section B5_s5 EVENT - - An event consists of the generation of a single particle which is - transported through the first spectrometer arm. Here, a scintillator - hodoscope records the reference time of the particle before it passes - through a drift chamber where the particle position is measured. - Momentum analysis is performed as the particle passes through a magnetic - field at the spectrometer pivot and then into the second spectrometer - arm. In the second arm, the particle passes through another hodoscope - and drift chamber before interacting in the electromagnetic calorimeter. - Here it is likely that particles will induce electromagnetic showers. - The shower energy is recorded in a three-dimensional array of CsI - crystals. Secondary particles from the shower, as well as primary - particles which do not interact in the CsI crystals, pass into the - hadronic calorimeter. Here, the remaining energy is collected in a - three-dimensional array of scintillator-lead sandwiches. - - Several aspects of the event may be changed interactively by the user: - - angle of the second spectrometer arm - - strength of magnetic field - - initial particle type - - initial momentum and angle - - momentum and angle spreads - - type of initial particle may be randomized - - The initial particle type can be changed using the G4ParticleGun command: -\verbatim -/gun/particle particleName -\endverbatim - - The UI commands specific to this example are available in /B5 command - directory: -\verbatim -/B5/detector/armAngle angle unit -/B5/field/value field unit -/B5/generator/momentum value unit -/B5/generator/sigmaMomentum value unit -/B5/generator/sigmaAngle value unit -/B5/generator/randomizePrimary [true|false] -\endverbatim - - They are implemented in - - B5DetectorConstruction::DefineCommands(), - - B5MagneticField::DefineCommands() and - - B5PrimaryGeneratorAction::DefineCommands() methods - using G4GenericMessenger class. - - In first execution of B5EventAction::BeginOfEventAction() - the hits collections identifiers are saved in data members of the class - and used in B5EventAction::EndOfEventAction() for accessing - the hists collections and filling the accounted information in defined - histograms and ntuples and printing its summary in a log file. - The frequency of printing can be tuned with the built-in command -\verbatim -/run/printProgress frequency -\endverbatim - -\section B5_s6 DETECTOR RESPONSE - - All the information required to simulate and analyze an event is - recorded in hits. This information is recorded in the following - sensitive detectors: - - - hodoscope: - - particle time - - strip ID, position and rotation - - see B5HodoscopeSD, B5HodoscopeHit - - - drift chamber: - - particle time - - particle position - - layer ID - - see B5DriftChamberSD, B5DriftChamberHit classes - - - electromagnetic calorimeter: - - energy deposited in cell - - cell ID, position and rotation - - see B5EmCalorimeterSD, B5EmCalorimeterHit classes - - - hadronic calorimeter: - - energy deposited in cell - - cell column ID and row ID, position and rotation - - see B5HadCalorimeterSD, B5HadCalorimeterHit classes - - The hit classes include methods GetAttDefs and CreateAttValues to define - and then fill extra "HepRep-style" Attributes that the visualization system - can use to present extra information about the hits. - For example, if you pick a B5HadCalorimeterHit in OpenGL or a HepRep viewer, - you will be shown the hit's "Hit Type", "Column ID", "Row ID", - "Energy Deposited" and "Position". - These attributes are essentially arbitrary extra pieces of information - (integers, doubles or strings) that are carried through the visualization. - Each attribute is defined once in G4AttDef object and then is filled for - each hit in a G4AttValue object. - These attributes can also be used by commands to filter which hits are drawn: - /vis/filtering/hits/drawByAttribute - Detector Geometry and trajectories also carry HepRep-style attributes, - but these are filled automatically in the base classes. - HepRep is further described at the - HepRep Home Page - -\section B5_s7 ANALYSIS - - The analysis tools are used to accumulate statistics. - Histograms and an ntuple are created in B5RunAction::B5RunAction() - constructor for the following quantities: - - - 1D histograms: - - Number of hits in Chamber 1 - - Number of hits in Chamber 2 - - - 2D histograms: - - Drift Chamber 1 X vs Y positions - - Drift Chamber 2 X vs Y positions - - - Ntuple: - - Number of hits in Chamber 1 - - Number of hits in Chamber 2 - - Total energy deposit in EM calorimeter - - Total energy deposit in Hadronic calorimeter - - Time of flight in Hodoscope 1 - - Time of flight in Hodoscope 2 - - Vector of energy deposits in EM calorimeter cells - - Vector of energy deposits in Hadronic calorimeter cells - - The histograms and ntuple are saved in two output files in a default - (Root) file format. - - Another file format (for example xml) can be selected either by - changing the generic analysis manager default file type: -\verbatim -analysisManager->SetDefaultFileType("xml"); -\endverbatim - or by providing the file names with the extension: -\verbatim -analysisManager->SetFileName("B5.xml"); -analysisManager->SetNtupleFileName(0, "B4ntuple.xml"); -\endverbatim - - When running in multi-threading mode, the histograms and ntuple accumulated - on threads are automatically merged in a single output file. - -\section B5_s8 BUILD OPTIONS - - This example can be built with excluding use of visualization and/or - Geant4 user interface using G4VIS_USE and G4UI_USE compiler options - (see exampleB5.cc). - These options are defined by default with Geant4 configuration; - they can be switched off at compilation time via the CMake options - G4VIS_NONE or G4UI_NONE or via the environment variables of the - same name if using GNUmake build. - -
      - -The following paragraphs are common to all basic examples - -\section B5_A VISUALISATION - - The visualization manager is set via the G4VisExecutive class - in the main () function in exampleB5.cc. - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then -\verbatim -/vis/open DAWNFILE -\endverbatim - then to get the same view -\verbatim -/vis/viewer/copyView viewer-0 -\endverbatim - or to get the same view *plus* scene-modifications -\verbatim -/vis/viewer/set/all viewer-0 -\endverbatim - then to see the result -\verbatim -/vis/viewer/flush -\endverbatim - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - vis.mac has additional commands that demonstrate additional functionality - of the vis system, such as displaying text, axes, scales, date, logo and - shows how to change viewpoint and style. - To see even more commands use help or ls or browse the available UI commands - in the Application Developers Guide. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example,\n - - - OpenGL Tutorial - - - DAWN Tutorial - - - HepRApp Tutorial - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - - -\section B5_B USER INTERFACES - - This example can be built with excluding visualization and/or - Geant4 user interface via G4VIS_USE and G4UI_USE compiler options - (see exampleB5.cc). - These options are defined by default with Geant4 configuration; - they can switched off at compilation time via the CMake options - G4VIS_NONE or G4UI_NONE or via the environment variables of the - same name if using GNUmake build. - - -\section B5_C HOW TO RUN - - - Execute exampleB5 in the 'interactive mode' with visualization -\verbatim -% exampleB5 -and type in the commands from run1.mac line by line: -Idle> /control/verbose 2 -Idle> /tracking/verbose 1 -Idle> /run/beamOn 10 -Idle> ... -Idle> exit -\endverbatim - or -\verbatim -Idle> /control/execute run1.mac -.... -Idle> exit -\endverbatim - - - Execute exampleB5 in the 'batch' mode from macro files - (without visualization) -\verbatim -% exampleB5 run2.mac -% exampleB5 exampleB5.in > exampleB5.out -\endverbatim -*/ - diff --git a/examples/basic/B5/CMakeLists.txt b/examples/basic/B5/CMakeLists.txt index a78dafc1f2..9835e84f63 100644 --- a/examples/basic/B5/CMakeLists.txt +++ b/examples/basic/B5/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B5) #---------------------------------------------------------------------------- @@ -52,6 +52,7 @@ set(B5_SCRIPTS run1.mac run2.mac vis.mac + plotter.mac ) foreach(_script ${B5_SCRIPTS}) diff --git a/examples/basic/B5/History b/examples/basic/B5/History index c81312f64f..fce80b588f 100644 --- a/examples/basic/B5/History +++ b/examples/basic/B5/History @@ -14,6 +14,52 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +05-11-21 G. Barrand (exampleB5-V10-07-11) +- RunAction: remove the usage of G4VisPlotMessenger. +- README, .README.txt: remove the paragraph about using + G4VisPlotMessenger in the RunAction. Now about plotting, + remains only the plotter.mac file. + +04-11-21 G. Barrand (exampleB5-V10-07-10) +- plotter.mac: TSG_QT_GLES => TSG. +- plotter.mac: have commented examples to create a style + by using the /vis/plotter/style/select,add commands. +- plotter.mac, README, .README.txt: remove reference + to the XML style logic. +- CMakeLists.txt: remove plotter.style. +- remove plotter.style. + +02-11-21 I. Hrivnacova (exampleB5-V10-07-09) +- Added analysisManager->Reset() in begin of run, + as resetting was disabled for plotting in end of run. + +25-10-21 G. Barrand (exampleB5-V10-07-08) +- README, .README.txt: have the "PLOTTING" section. +- modifications to have vis plotting. Available with the + TOOLSSG_[QT,XT,WINDOWS]_GLES vis drivers for the moment. +- CMakeLists.txt: declare plotte.mac, plotter.style. +- src/RunAction.cc: instanciate the G4VisPlotMessenger so that + the commands /vis/plotter/add/[h1,h2] be available to attach + histos to a G4/vis/plotter (see plotter.mac for a macro example). +- plotter.mac: example to create a G4/vis/plotter, attach + to it histograms of this example, and customize the style + of the various plotting regions. +- plotter.style: an example to declare styles by using XML. + +06-10-21 I. Hrivnacova (exampleB5-V10-07-07) +- Migration to new G4AnalysisManager.hh header + +19-07-21 I. Hrivnacova (exampleB5-V10-07-06) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. +- Include G4GenericAnalysisManager.hh instead of "g4analysis.hh" + in EventAction.cc (to be consistent with RunAction.cc) + +13-07-21 I. Hrivnacova (exampleB5-V10-07-05) +- Introduced namespace instead of a class names prefix +- Declare overriding functions 'override' (and removed 'virtual' keyword) + 31-05-21 I. Hrivnacova (exampleB5-V10-07-01) - Clean trailing whitespaces from all files diff --git a/examples/basic/B5/README b/examples/basic/B5/README deleted file mode 100644 index a34647d92a..0000000000 --- a/examples/basic/B5/README +++ /dev/null @@ -1,300 +0,0 @@ - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Extended Example B5 - -------------------- - - Example B5 implements a double-arm spectrometer with wire chambers, - hodoscopes and calorimeters. Event simulation and collection are - enabled, as well as event display and analysis. - - - 1- GEOMETRY - - The spectrometer consists of two detector arms - (see B5DetectorConstruction). One arm provides - position and timing information of the incident particle while the - other collects position, timing and energy information of the particle - after it has been deflected by a magnetic field centered at the - spectrometer pivot point. - - - First arm: box filled with air, also containing: - - 1 hodoscope (15 vertical strips of plastic scintillator) - 1 drift chamber (5 horizontal argon gas layers with a - "virtual wire" at the center of each layer) - - - Second arm: box filled with air, also containing: - - 1 hodoscope (25 vertical strips of plastic scintillator) - 1 drift chamber (5 horizontal argon gas layers with a - "virtual wire" at the center of each layer) - 1 electromagnetic calorimeter: - a box sub-divided along x,y and z - axes into cells of CsI - 1 hadronic calorimeter: - a box sub-divided along x,y, and z axes - into cells of lead, with a layer of - plastic scintillator placed at the center - of each cell - - - Magnetic field region: air-filled cylinder which contains - the field (see B5MagneticField) - - The maximum step limit in the magnetic field region is also set - via the G4UserLimits class in a similar way as in Example B2. - - The rotation angle of the second arm and the magnetic field value - can be set via the interactive command defined using the G4GenericMessenger - class. - - 2- PHYSICS - - This example uses the reference hadronic physics list, FTFP_BERT, - and also adds the G4StepLimiter process. - - - 3- ACTION INITALIZATION - - B5ActionInitialization class - instantiates and registers to Geant4 kernel all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - B5ActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - B5ActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - - 4- PRIMARY GENERATOR - - The primary generator action class employs the G4ParticleGun. - The primary kinematics consists of a single particle which is - is sent in the direction of the first spectrometer arm. - - The type of the particle and its several properties can be changed - via the G4 built-in commands of the G4ParticleGun class or - this example command defined using the G4GenericMessenger class. - - - 5- EVENT - - An event consists of the generation of a single particle which is - transported through the first spectrometer arm. Here, a scintillator - hodoscope records the reference time of the particle before it passes - through a drift chamber where the particle position is measured. - Momentum analysis is performed as the particle passes through a magnetic - field at the spectrometer pivot and then into the second spectrometer - arm. In the second arm, the particle passes through another hodoscope - and drift chamber before interacting in the electromagnetic calorimeter. - Here it is likely that particles will induce electromagnetic showers. - The shower energy is recorded in a three-dimensional array of CsI - crystals. Secondary particles from the shower, as well as primary - particles which do not interact in the CsI crystals, pass into the - hadronic calorimeter. Here, the remaining energy is collected in a - three-dimensional array of scintillator-lead sandwiches. - - Several aspects of the event may be changed interactively by the user: - - angle of the second spectrometer arm - - strength of magnetic field - - initial particle type - - initial momentum and angle - - momentum and angle spreads - - type of initial particle may be randomized - - The initial particle type can be changed using the G4ParticleGun command: - /gun/particle particleName - - The UI commands specific to this example are available in /B5 command - directory: - /B5/detector/armAngle angle unit - /B5/field/value field unit - /B5/generator/momentum value unit - /B5/generator/sigmaMomentum value unit - /B5/generator/sigmaAngle value unit - /B5/generator/randomizePrimary [true|false] - - They are implemented in - B5DetectorConstruction::DefineCommands(), - B5MagneticField::DefineCommands() and - B5PrimaryGeneratorAction::DefineCommands() methods - using G4GenericMessenger class. - - In first execution of BeginOfEventAction() - the hits collections identifiers are saved in data members of the class - and used in EndOfEventAction() for accessing - the hists collections and filling the accounted information in defined - histograms and ntuples and printing its summary in a log file. - The frequency of printing can be tuned with the built-in command - /run/printProgress frequency - - 6- DETECTOR RESPONSE: - - All the information required to simulate and analyze an event is - recorded in hits. This information is recorded in the following - sensitive detectors: - - - hodoscope: - particle time - strip ID, position and rotation - (see B5HodoscopeSD, B5HodoscopeHit classes) - - - drift chamber: - particle time - particle position - layer ID - (see B5DriftChamberSD, B5DriftChamberHit classes) - - - electromagnetic calorimeter: - energy deposited in cell - cell ID, position and rotation - (see B5EMCalorimeterSD, B5EMCalorimeterHit classes) - - - hadronic calorimeter: - energy deposited in cell - cell column ID and row ID, position and rotation - (see B5HadCalorimeterSD, B5HadCalorimeterHit classes) - - The hit classes include methods GetAttDefs and CreateAttValues to define - and then fill extra "HepRep-style" Attributes that the visualization system - can use to present extra information about the hits. - For example, if you pick a B5HadCalorimeterHit in OpenGL or a HepRep viewer, - you will be shown the hit's "Hit Type", "Column ID", "Row ID", - "Energy Deposited" and "Position". - These attributes are essentially arbitrary extra pieces of information - (integers, doubles or strings) that are carried through the visualization. - Each attribute is defined once in G4AttDef object and then is filled for - each hit in a G4AttValue object. - These attributes can also be used by commands to filter which hits are drawn: - /vis/filtering/hits/drawByAttribute - Detector Geometry and trajectories also carry HepRep-style attributes, - but these are filled automatically in the base classes. - HepRep is further described at: http://www.slac.stanford.edu/~perl/heprep/ - - 7- ANALYSIS: - - The analysis tools are used to accumulate statistics. - Histograms and an ntuple are created in B5RunAction::B5RunAction() - constructor for the following quantities: - - 1D histograms: - - Number of hits in Chamber 1 - - Number of hits in Chamber 2 - - 2D histograms: - - Drift Chamber 1 X vs Y positions - - Drift Chamber 2 X vs Y positions - - Ntuple: - - Number of hits in Chamber 1 - - Number of hits in Chamber 2 - - Total energy deposit in EM calorimeter - - Total energy deposit in Hadronic calorimeter - - Time of flight in Hodoscope 1 - - Time of flight in Hodoscope 2 - - Vector of energy deposits in EM calorimeter cells - - Vector of energy deposits in Hadronic calorimeter cells - - The histograms and ntuple are saved in two output files in a default - (Root) file format. - - Another file format (for example xml) can be selected either by - changing the generic analysis manager default file type: - analysisManager->SetDefaultFileType("xml"); - or by providing the file names with the extension: - analysisManager->SetFileName("B5.xml"); - analysisManager->SetNtupleFileName(0, "B4ntuple.xml"); - - When running in multi-threading mode, the histograms and ntuple accumulated - on threads are automatically merged in a single output file. - - 8- BUILD OPTIONS: - - This example can be built with excluding visualization and/or - Geant4 user interface via G4VIS_USE and G4UI_USE compiler options - (see exampleB5.cc). - These options are defined by default with Geant4 configuration; - they can be switched off at compilation time via the CMake options - G4VIS_NONE or G4UI_NONE or via the environment variables of the - same name if using GNUmake build. - - The following paragraphs are common to all basic examples - - A- VISUALISATION - - The visualization manager is set via the G4VisExecutive class - in the main() function in exampleB5.cc. - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main function when the example is used in interactive running mode. - - By default, vis.mac opens an OpenGL viewer (/vis/open OGL). - The user can change the initial viewer by commenting out this line - and instead uncommenting one of the other /vis/open statements, such as - HepRepFile or DAWNFILE (which produce files that can be viewed with the - HepRApp and DAWN viewers, respectively). Note that one can always - open new viewers at any time from the command line. For example, if - you already have a view in, say, an OpenGL window with a name - "viewer-0", then - /vis/open DAWNFILE - then to get the same view - /vis/viewer/copyView viewer-0 - or to get the same view *plus* scene-modifications - /vis/viewer/set/all viewer-0 - then to see the result - /vis/viewer/flush - - The DAWNFILE, HepRepFile drivers are always available - (since they require no external libraries), but the OGL driver requires - that the Geant4 libraries have been built with the OpenGL option. - - vis.mac has additional commands that demonstrate additional functionality - of the vis system, such as displaying text, axes, scales, date, logo and - shows how to change viewpoint and style. - To see even more commands use help or ls or browse the available UI commands - in the Application Developers Guide. - - For more information on visualization, including information on how to - install and run DAWN, OpenGL and HepRApp, see the visualization tutorials, - for example, - http://geant4.slac.stanford.edu/Presentations/vis/G4[VIS]Tutorial/G4[VIS]Tutorial.html - (where [VIS] can be replaced by DAWN, OpenGL and HepRApp) - - The tracks are automatically drawn at the end of each event, accumulated - for all events and erased at the beginning of the next run. - - B- USER INTERFACES - - The user command interface is set via the G4UIExecutive class - in the main() function in exampleB5.cc - The selection of the user command interface is then done automatically - according to the Geant4 configuration or it can be done explicitly via - the third argument of the G4UIExecutive constructor (see exampleB4a.cc). - - C- HOW TO RUN - - - Execute exampleB5 in the 'interactive mode' with visualization: - % ./exampleB5 - and type in the commands from run1.mac line by line: - Idle> /control/verbose 2 - Idle> /tracking/verbose 1 - Idle> /run/beamOn 10 - Idle> ... - Idle> exit - or - Idle> /control/execute run1.mac - .... - Idle> exit - - - Execute exampleB5 in the 'batch' mode from macro files - (without visualization) - % ./exampleB5 run2.mac - % ./exampleB5 exampleB5.in > exampleB5.out - - diff --git a/examples/basic/B5/exampleB5.cc b/examples/basic/B5/exampleB5.cc index 461ad1b275..a1d5a0fb2e 100644 --- a/examples/basic/B5/exampleB5.cc +++ b/examples/basic/B5/exampleB5.cc @@ -25,10 +25,10 @@ // // /// \file exampleB5.cc -/// \brief Main program of the analysis/B5 example +/// \brief Main program of the basic B5 example -#include "B5DetectorConstruction.hh" -#include "B5ActionInitialization.hh" +#include "DetectorConstruction.hh" +#include "ActionInitialization.hh" #include "G4RunManagerFactory.hh" #include "G4SteppingVerbose.hh" @@ -58,14 +58,14 @@ int main(int argc,char** argv) G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default); // Mandatory user initialization classes - runManager->SetUserInitialization(new B5DetectorConstruction); + runManager->SetUserInitialization(new B5::DetectorConstruction); auto physicsList = new FTFP_BERT; physicsList->RegisterPhysics(new G4StepLimiterPhysics()); runManager->SetUserInitialization(physicsList); // User action initialization - runManager->SetUserInitialization(new B5ActionInitialization()); + runManager->SetUserInitialization(new B5::ActionInitialization()); // Visualization manager construction auto visManager = new G4VisExecutive; diff --git a/examples/basic/B5/exampleB5.out b/examples/basic/B5/exampleB5.out index 2f175c4506..8b8198a8b3 100644 --- a/examples/basic/B5/exampleB5.out +++ b/examples/basic/B5/exampleB5.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -29,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -154,64 +152,64 @@ The materials defined are : -Checking overlaps for volume magneticPhysical (G4Tubs) ... OK! -Checking overlaps for volume firstArmPhysical (G4Box) ... OK! -Checking overlaps for volume fSecondArmPhys (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope1Physical (G4Box) ... OK! -Checking overlaps for volume chamber1Physical (G4Box) ... OK! -Checking overlaps for volume chamber1Physical (G4Box) ... OK! -Checking overlaps for volume chamber1Physical (G4Box) ... OK! -Checking overlaps for volume chamber1Physical (G4Box) ... OK! -Checking overlaps for volume chamber1Physical (G4Box) ... OK! -Checking overlaps for volume wirePlane1Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume hodoscope2Physical (G4Box) ... OK! -Checking overlaps for volume chamber2Physical (G4Box) ... OK! -Checking overlaps for volume chamber2Physical (G4Box) ... OK! -Checking overlaps for volume chamber2Physical (G4Box) ... OK! -Checking overlaps for volume chamber2Physical (G4Box) ... OK! -Checking overlaps for volume chamber2Physical (G4Box) ... OK! -Checking overlaps for volume wirePlane2Physical (G4Box) ... OK! -Checking overlaps for volume EMcalorimeterPhysical (G4Box) ... OK! -Checking overlaps for volume HadCalorimeterPhysical (G4Box) ... OK! -Checking overlaps for volume HadCalScintiPhysical (G4Box) ... OK! +Checking overlaps for volume magneticPhysical:0 (G4Tubs) ... OK! +Checking overlaps for volume firstArmPhysical:0 (G4Box) ... OK! +Checking overlaps for volume fSecondArmPhys:0 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:0 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:1 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:2 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:3 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:4 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:5 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:6 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:7 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:8 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:9 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:10 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:11 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:12 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:13 (G4Box) ... OK! +Checking overlaps for volume hodoscope1Physical:14 (G4Box) ... OK! +Checking overlaps for volume chamber1Physical:0 (G4Box) ... OK! +Checking overlaps for volume chamber1Physical:1 (G4Box) ... OK! +Checking overlaps for volume chamber1Physical:2 (G4Box) ... OK! +Checking overlaps for volume chamber1Physical:3 (G4Box) ... OK! +Checking overlaps for volume chamber1Physical:4 (G4Box) ... OK! +Checking overlaps for volume wirePlane1Physical:0 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:0 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:1 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:2 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:3 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:4 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:5 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:6 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:7 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:8 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:9 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:10 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:11 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:12 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:13 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:14 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:15 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:16 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:17 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:18 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:19 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:20 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:21 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:22 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:23 (G4Box) ... OK! +Checking overlaps for volume hodoscope2Physical:24 (G4Box) ... OK! +Checking overlaps for volume chamber2Physical:0 (G4Box) ... OK! +Checking overlaps for volume chamber2Physical:1 (G4Box) ... OK! +Checking overlaps for volume chamber2Physical:2 (G4Box) ... OK! +Checking overlaps for volume chamber2Physical:3 (G4Box) ... OK! +Checking overlaps for volume chamber2Physical:4 (G4Box) ... OK! +Checking overlaps for volume wirePlane2Physical:0 (G4Box) ... OK! +Checking overlaps for volume EMcalorimeterPhysical:0 (G4Box) ... OK! +Checking overlaps for volume HadCalorimeterPhysical:0 (G4Box) ... OK! +Checking overlaps for volume HadCalScintiPhysical:0 (G4Box) ... OK! hInelastic FTFP_BERT : threshold between BERT and FTFP is over the interval for pions : 3 to 6 GeV @@ -220,32 +218,99 @@ Checking overlaps for volume HadCalScintiPhysical (G4Box) ... OK! for neutron : 3 to 6 GeV ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -255,25 +320,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -283,29 +348,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -313,31 +378,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -346,12 +411,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -359,12 +424,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -372,31 +437,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -404,31 +469,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -436,31 +501,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -468,32 +533,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -501,32 +566,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -534,31 +599,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -566,27 +631,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -595,17 +660,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -613,67 +678,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -681,13 +746,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -695,13 +760,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -709,12 +774,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -722,13 +787,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -736,13 +801,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -750,13 +815,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -764,60 +829,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -825,27 +890,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -853,25 +918,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -879,25 +944,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -905,13 +970,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -934,7 +999,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -943,7 +1007,7 @@ See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. -------- WWWW ------- G4Exception-START -------- WWWW ------- -*** G4Exception : Analysis_W013 +*** G4Exception : Analysis_W001 issued by : G4RootNtupleFileManager::SetNtupleMergingMode Merging ntuples is not applicable in sequential application. Setting was ignored. @@ -958,100 +1022,76 @@ Setting was ignored. --> Event 0 starts. >>> Event 0 >>> Simulation truth : proton (0,0,100000) -Hodoscope 1 has 2 hits. - Hodoscope[7] 4.9870027260871 (nsec) - Hodoscope[6] 5.4878268239358 (nsec) +Hodoscope 1 has 1 hits. + Hodoscope[7] 4.987002725936 (nsec) Hodoscope 2 has 0 hits. -Drift Chamber 1 has 86 hits. - Layer[0] : time 8.3244016843795 (nsec) --- local (x,y) 372.31519231248, -290.51386762444 - Layer[0] : time 6.680795732647 (nsec) --- local (x,y) 40.051479113847, 29.954528815821 - Layer[0] : time 6.6767579389608 (nsec) --- local (x,y) -32.919897653603, -18.978011078808 - Layer[0] : time 6.8738833676301 (nsec) --- local (x,y) 31.063759900488, 206.7492472533 - Layer[0] : time 7.4872844823518 (nsec) --- local (x,y) 487.52164443561, -218.5057973074 - Layer[0] : time 6.7518868131014 (nsec) --- local (x,y) -83.254611166601, 125.05209755212 - Layer[0] : time 7.2545698775643 (nsec) --- local (x,y) 407.86548003493, -97.448859075208 - Layer[0] : time 6.7389486795742 (nsec) --- local (x,y) 60.993048842936, 12.428052750654 - Layer[0] : time 6.6774196343681 (nsec) --- local (x,y) -12.022286575194, 24.451482094751 - Layer[0] : time 6.6862971787789 (nsec) --- local (x,y) -45.005784400591, 3.3576673193117 - Layer[0] : time 6.7811935368883 (nsec) --- local (x,y) 31.921564090749, -136.53786469384 - Layer[0] : time 6.9652067908345 (nsec) --- local (x,y) 112.15428070076, -189.51007661025 - Layer[0] : time 6.6796507577445 (nsec) --- local (x,y) 23.785386647666, -39.867554115817 - Layer[0] : time 6.6838539212172 (nsec) --- local (x,y) 51.205478644286, -32.878901225761 - Layer[0] : time 8.3334349699785 (nsec) --- local (x,y) 34.20178580776, -69.039836258088 - Layer[0] : time 7.2513531859916 (nsec) --- local (x,y) 423.09148266335, -99.333933968696 - Layer[0] : time 7.1364939430196 (nsec) --- local (x,y) -219.67648330692, -194.56034230531 - Layer[0] : time 6.7518661526086 (nsec) --- local (x,y) -79.811502609178, 92.38640451877 - Layer[0] : time 6.8039386101597 (nsec) --- local (x,y) 9.347293958448, 76.68809849275 - Layer[0] : time 6.6780047578593 (nsec) --- local (x,y) -0.9751109579709, 10.234126962106 - Layer[0] : time 40.765614368595 (nsec) --- local (x,y) 423.60520502763, 199.25509699423 - Layer[0] : time 6.744611189691 (nsec) --- local (x,y) -43.066451269076, -29.830674606947 - Layer[0] : time 6.7304200520298 (nsec) --- local (x,y) 27.808811985618, -67.955601475178 - Layer[0] : time 6.8016700900691 (nsec) --- local (x,y) -1.5812875477122, 133.36145215817 - Layer[1] : time 8.358185606292 (nsec) --- local (x,y) 79.815310333824, 59.740161700849 - Layer[1] : time 8.3501314891973 (nsec) --- local (x,y) -65.602592852555, -37.87125616972 - Layer[1] : time 8.3627600069665 (nsec) --- local (x,y) -83.380820542773, -34.384764790742 - Layer[1] : time 8.4999188512288 (nsec) --- local (x,y) -166.05597185465, 249.21515665844 - Layer[1] : time 9.5012034966648 (nsec) --- local (x,y) 812.58797426206, -194.33150912802 - Layer[1] : time 8.4738707714691 (nsec) --- local (x,y) 120.20593212518, 27.369471111116 - Layer[1] : time 8.3514645273434 (nsec) --- local (x,y) -24.097795070012, 48.757916117931 - Layer[1] : time 8.3691735580197 (nsec) --- local (x,y) -89.791485793355, 6.8800367147563 - Layer[1] : time 8.5584019721984 (nsec) --- local (x,y) 63.644766604458, -272.24993510481 - Layer[1] : time 8.3558813553473 (nsec) --- local (x,y) 47.365833114391, -79.434550489873 - Layer[1] : time 8.3642686403448 (nsec) --- local (x,y) 102.03925510595, -65.537349599106 - Layer[1] : time 11.671169014003 (nsec) --- local (x,y) 68.941668305312, -138.90670444491 - Layer[1] : time 9.4998088967096 (nsec) --- local (x,y) 847.18449611688, -199.7000820246 - Layer[1] : time 8.5003701725844 (nsec) --- local (x,y) -159.60022774113, 184.623780099 - Layer[1] : time 8.6036766360604 (nsec) --- local (x,y) 18.716323634884, 152.8894239693 - Layer[1] : time 8.3525528892974 (nsec) --- local (x,y) -2.3149698963654, 19.376409651798 - Layer[1] : time 39.087318630547 (nsec) --- local (x,y) 390.2733319794, 189.72854917566 - Layer[1] : time 8.4853735671026 (nsec) --- local (x,y) -85.855573262343, -59.441197940457 - Layer[1] : time 8.4576081331246 (nsec) --- local (x,y) 56.219303673417, -136.20896543984 - Layer[1] : time 8.5990421912748 (nsec) --- local (x,y) -2.8684301633605, 265.70259851639 - Layer[2] : time 10.035553545548 (nsec) --- local (x,y) 119.49270484424, 89.529818370271 - Layer[2] : time 10.023468165653 (nsec) --- local (x,y) -98.044717274107, -56.858776900877 - Layer[2] : time 10.131935074869 (nsec) --- local (x,y) -258.52200521681, -39.478722362029 - Layer[2] : time 10.208111781132 (nsec) --- local (x,y) 175.98173677692, 48.248921122513 - Layer[2] : time 10.025503562854 (nsec) --- local (x,y) -36.128694953445, 73.048198146094 - Layer[2] : time 10.052079498214 (nsec) --- local (x,y) -134.67304417412, 10.396554697651 - Layer[2] : time 10.032104272234 (nsec) --- local (x,y) 70.949709400248, -118.96997063657 - Layer[2] : time 10.044685836726 (nsec) --- local (x,y) 152.89362442292, -98.175092933327 - Layer[2] : time 15.012839628051 (nsec) --- local (x,y) 103.63942159903, -209.58398142811 - Layer[2] : time 10.248897728552 (nsec) --- local (x,y) -239.3698401314, 276.91408403409 - Layer[2] : time 10.403480719082 (nsec) --- local (x,y) 28.107347857635, 229.19196387567 - Layer[2] : time 10.027121366319 (nsec) --- local (x,y) -3.7177549653379, 28.824703712429 - Layer[2] : time 37.408985192759 (nsec) --- local (x,y) 356.71011420539, 180.41487016479 - Layer[2] : time 10.226156468205 (nsec) --- local (x,y) -128.69995231355, -89.051430302635 - Layer[2] : time 10.22639762675 (nsec) --- local (x,y) -128.70589056969, -89.055533806392 - Layer[2] : time 10.22639762675 (nsec) --- local (x,y) -128.70589056969, -89.055533806392 - Layer[2] : time 10.227406472266 (nsec) --- local (x,y) -128.71129741599, -89.082824995381 - Layer[2] : time 10.18476499531 (nsec) --- local (x,y) 84.607320263908, -204.37830719364 - Layer[3] : time 11.712909667382 (nsec) --- local (x,y) 159.16793665739, 119.2621710378 - Layer[3] : time 11.696808960295 (nsec) --- local (x,y) -130.50751315894, -75.843275553229 - Layer[3] : time 11.905859566215 (nsec) --- local (x,y) -437.49147503118, -43.927853722702 - Layer[3] : time 11.942383231305 (nsec) --- local (x,y) 231.87108855037, 68.922782075027 - Layer[3] : time 11.699544802765 (nsec) --- local (x,y) -48.170854424449, 97.344763410062 - Layer[3] : time 11.734968240585 (nsec) --- local (x,y) -179.49347071559, 13.903659866652 - Layer[3] : time 11.70832203213 (nsec) --- local (x,y) 94.447922066257, -158.53640548142 - Layer[3] : time 11.725083668895 (nsec) --- local (x,y) 203.70533269648, -130.78964903557 - Layer[3] : time 18.356706513428 (nsec) --- local (x,y) 137.94988153586, -279.62691382176 - Layer[3] : time 11.701691306221 (nsec) --- local (x,y) -5.1816690591496, 38.278627515524 - Layer[3] : time 35.730656502063 (nsec) --- local (x,y) 323.14330565439, 171.18414388799 - Layer[3] : time 11.966943388311 (nsec) --- local (x,y) -171.53408675869, -118.68185836681 - Layer[3] : time 11.91195400966 (nsec) --- local (x,y) 112.71676496078, -272.69479673144 - Layer[4] : time 13.390273444256 (nsec) --- local (x,y) 198.86162109378, 149.00827265087 - Layer[4] : time 13.370143675236 (nsec) --- local (x,y) -162.92076760352, -94.863972135471 - Layer[4] : time 13.714381839617 (nsec) --- local (x,y) -645.26995183431, -30.723574770022 - Layer[4] : time 13.676799129384 (nsec) --- local (x,y) 288.04413260503, 89.710565854788 - Layer[4] : time 13.373581411382 (nsec) --- local (x,y) -60.229060226772, 121.60255020826 - Layer[4] : time 13.417845193379 (nsec) --- local (x,y) -224.27444917309, 17.366352405964 - Layer[4] : time 13.384540552765 (nsec) --- local (x,y) 117.88083133002, -198.14407826765 - Layer[4] : time 13.405468479795 (nsec) --- local (x,y) 254.49968493497, -163.37089400543 - Layer[4] : time 13.37625786536 (nsec) --- local (x,y) -6.7661414343371, 47.644923755985 - Layer[4] : time 34.052348124975 (nsec) --- local (x,y) 289.68112403994, 161.89305469534 - Layer[4] : time 13.707743354446 (nsec) --- local (x,y) -214.33314105819, -148.41135212149 +Drift Chamber 1 has 63 hits. + Layer[0] : time 6.7557786014511 (nsec) --- local (x,y) 70.206007799582, -92.279363716733 + Layer[0] : time 6.8087197282096 (nsec) --- local (x,y) -118.15919093946, -87.697239109756 + Layer[0] : time 7.2162712838945 (nsec) --- local (x,y) -32.021365175343, 30.103891303509 + Layer[0] : time 6.8734822803662 (nsec) --- local (x,y) -204.0506899287, 4.0073902600573 + Layer[0] : time 7.2661198705468 (nsec) --- local (x,y) 57.652348645256, 88.751479391552 + Layer[0] : time 6.6733252384026 (nsec) --- local (x,y) -12.815372855368, -21.594993406711 + Layer[0] : time 6.6877503096417 (nsec) --- local (x,y) -13.142025251057, -21.836450382168 + Layer[0] : time 6.6886461679672 (nsec) --- local (x,y) -13.139699035099, -21.83991539311 + Layer[0] : time 6.6895475711405 (nsec) --- local (x,y) -13.148151317107, -21.847021112694 + Layer[0] : time 6.6905482412803 (nsec) --- local (x,y) -13.167946644849, -21.86621501958 + Layer[0] : time 6.6919623059423 (nsec) --- local (x,y) -13.212008493988, -21.875306379246 + Layer[0] : time 6.6929188743704 (nsec) --- local (x,y) -13.231314749559, -21.876567087535 + Layer[0] : time 6.6938806589061 (nsec) --- local (x,y) -13.250499355449, -21.906515835404 + Layer[0] : time 6.6948566134766 (nsec) --- local (x,y) -13.239175995798, -21.938920752145 + Layer[0] : time 6.6958693786711 (nsec) --- local (x,y) -13.210614053592, -21.949564800274 + Layer[0] : time 6.6968892908029 (nsec) --- local (x,y) -13.200635027843, -21.979783901668 + Layer[0] : time 6.6979698440192 (nsec) --- local (x,y) -13.230781897977, -21.998758999758 + Layer[0] : time 6.6991091590249 (nsec) --- local (x,y) -13.269133529562, -21.995091122609 + Layer[0] : time 6.7001432380385 (nsec) --- local (x,y) -15.52374872817, 68.799941000473 + Layer[0] : time 6.8252598695636 (nsec) --- local (x,y) -38.697108821483, 196.22578458392 + Layer[0] : time 6.7053195586928 (nsec) --- local (x,y) -86.653345693123, 49.242808439072 + Layer[0] : time 7.1857534928123 (nsec) --- local (x,y) 351.97438535531, 201.90139895508 + Layer[0] : time 6.7037485245226 (nsec) --- local (x,y) 1.2840488023166, -63.19754745788 + Layer[0] : time 6.6808750961886 (nsec) --- local (x,y) 33.977503736699, -41.241438311708 + Layer[0] : time 6.7269679062726 (nsec) --- local (x,y) -50.333689362339, -84.476674728467 + Layer[0] : time 6.6737324070811 (nsec) --- local (x,y) -26.334945650699, 0.24415222386594 + Layer[1] : time 8.5076205098544 (nsec) --- local (x,y) 139.87786060476, -183.94472006216 + Layer[1] : time 8.613213867648 (nsec) --- local (x,y) -235.3325487788, -175.08654640165 + Layer[1] : time 9.4256827762124 (nsec) --- local (x,y) -63.833624515698, 60.059867503512 + Layer[1] : time 8.7536972851613 (nsec) --- local (x,y) -414.40298904527, -2.6715486443324 + Layer[1] : time 8.3432897156235 (nsec) --- local (x,y) -25.551182903146, -43.046708723902 + Layer[1] : time 8.3967343965363 (nsec) --- local (x,y) -30.9260516606, 137.11995934584 + Layer[1] : time 8.407052002591 (nsec) --- local (x,y) -172.69411143762, 98.162686221254 + Layer[1] : time 8.4038823600338 (nsec) --- local (x,y) 2.3568815499483, -125.85087200332 + Layer[1] : time 8.3583255052146 (nsec) --- local (x,y) 67.717077366538, -82.158972961754 + Layer[1] : time 8.4502847068754 (nsec) --- local (x,y) -100.23612728175, -168.55159405051 + Layer[1] : time 8.3440987905831 (nsec) --- local (x,y) -52.485776772069, 0.5048453760266 + Layer[2] : time 10.259448929408 (nsec) --- local (x,y) 209.55439259882, -275.58031371471 + Layer[2] : time 10.417499220063 (nsec) --- local (x,y) -352.33512513392, -262.30332262699 + Layer[2] : time 11.635217174803 (nsec) --- local (x,y) -95.647674280715, 90.051229030098 + Layer[2] : time 10.65960036956 (nsec) --- local (x,y) -641.97431220783, -35.17659608887 + Layer[2] : time 10.013257128995 (nsec) --- local (x,y) -38.302739628727, -64.509603018052 + Layer[2] : time 10.093332294557 (nsec) --- local (x,y) -46.325696051684, 205.45466121545 + Layer[2] : time 10.108806793371 (nsec) --- local (x,y) -258.80931198272, 147.0210096189 + Layer[2] : time 10.104163581979 (nsec) --- local (x,y) 3.3234984095156, -188.84687698934 + Layer[2] : time 10.035781250044 (nsec) --- local (x,y) 101.49590351274, -123.06374680674 + Layer[2] : time 10.173613579392 (nsec) --- local (x,y) -150.32480721249, -252.52844201923 + Layer[2] : time 10.014464247851 (nsec) --- local (x,y) -78.630954778718, 0.79340782593829 + Layer[3] : time 13.844875449559 (nsec) --- local (x,y) -127.47914734395, 120.04700020714 + Layer[3] : time 12.565372716366 (nsec) --- local (x,y) -869.58035836367, -66.568831873435 + Layer[3] : time 11.683222019722 (nsec) --- local (x,y) -51.03847628837, -85.964241011507 + Layer[3] : time 11.789922783323 (nsec) --- local (x,y) -61.656235661582, 273.78120965963 + Layer[3] : time 12.640882658231 (nsec) --- local (x,y) -483.86592881784, -19.459212887817 + Layer[3] : time 11.810564398719 (nsec) --- local (x,y) -344.94339075829, 195.85464307394 + Layer[3] : time 11.804419690479 (nsec) --- local (x,y) 4.3122755539306, -251.77342734213 + Layer[3] : time 11.713240189608 (nsec) --- local (x,y) 135.29235431495, -163.96571656939 + Layer[3] : time 11.684832080629 (nsec) --- local (x,y) -104.78966501455, 1.0865856468959 + Layer[4] : time 16.054685923075 (nsec) --- local (x,y) -159.32198739018, 150.05996184141 + Layer[4] : time 13.353185418094 (nsec) --- local (x,y) -63.759385561588, -107.41722921112 + Layer[4] : time 14.917091184666 (nsec) --- local (x,y) -844.73036379834, -164.55174322388 + Layer[4] : time 13.512311714229 (nsec) --- local (x,y) -431.02172982442, 244.75402133754 + Layer[4] : time 13.39068871051 (nsec) --- local (x,y) 169.07403229293, -204.84146029795 + Layer[4] : time 13.35520864566 (nsec) --- local (x,y) -130.99829932563, 1.3892465145517 Drift Chamber 2 has 0 hits. -EM Calorimeter has 8 hits. Total Edep is 242.58624759004 (MeV) -Hadron Calorimeter has 0 hits. Total Edep is 0 (MeV) +EM Calorimeter has 4 hits. Total Edep is 1474.9397262416 (MeV) +Hadron Calorimeter has 1 hits. Total Edep is 0.098560309853969 (MeV) ... write file : B5.root - done ... write file : B5ntuple.root - done ... close file : B5.root - done @@ -1068,23 +1108,26 @@ Hadron Calorimeter has 0 hits. Total Edep is 0 (MeV) >>> Event 0 >>> Simulation truth : pi+ (0,0,100000) Hodoscope 1 has 1 hits. - Hodoscope[7] 4.9867880807734 (nsec) -Hodoscope 2 has 1 hits. - Hodoscope[10] 42.694112849803 (nsec) + Hodoscope[7] 4.9867880803675 (nsec) +Hodoscope 2 has 3 hits. + Hodoscope[10] 42.693618216939 (nsec) + Hodoscope[13] 358.38560824511 (nsec) + Hodoscope[0] 283.11622831717 (nsec) Drift Chamber 1 has 5 hits. - Layer[0] : time 6.6709548380868 (nsec) --- local (x,y) -0.005471494270544, -0.02425664575539 - Layer[1] : time 8.3387769387609 (nsec) --- local (x,y) -0.0031246105686073, -0.031142300729085 - Layer[2] : time 10.006599039525 (nsec) --- local (x,y) -0.0010897884521452, -0.039772434112833 - Layer[3] : time 11.674421140218 (nsec) --- local (x,y) 0.00033370637463721, -0.047097112899986 - Layer[4] : time 13.342243240988 (nsec) --- local (x,y) 0.0026067813253165, -0.055551390844551 -Drift Chamber 2 has 5 hits. - Layer[0] : time 34.366793783331 (nsec) --- local (x,y) -82.683844346138, -0.21152163574463 - Layer[1] : time 36.035528438024 (nsec) --- local (x,y) -99.22624786035, -0.22883626085171 - Layer[2] : time 37.704263151911 (nsec) --- local (x,y) -115.76918703093, -0.24701529133272 - Layer[3] : time 39.372997927726 (nsec) --- local (x,y) -132.31268841706, -0.26450849429205 - Layer[4] : time 41.041732253878 (nsec) --- local (x,y) -148.85211758164, -0.27633012798684 -EM Calorimeter has 55 hits. Total Edep is 1329.9382782035 (MeV) -Hadron Calorimeter has 19 hits. Total Edep is 4542.387118546 (MeV) + Layer[0] : time 6.6709548377118 (nsec) --- local (x,y) -0.0032635029937747, -0.010667921706549 + Layer[1] : time 8.3387769384352 (nsec) --- local (x,y) -0.0084227244151683, -0.01709424044444 + Layer[2] : time 10.006599039224 (nsec) --- local (x,y) -0.015158094572203, -0.023400472036744 + Layer[3] : time 11.674421140022 (nsec) --- local (x,y) -0.022528695889701, -0.029157518351191 + Layer[4] : time 13.342243241045 (nsec) --- local (x,y) -0.033429553356734, -0.034927385208282 +Drift Chamber 2 has 6 hits. + Layer[0] : time 34.366314485641 (nsec) --- local (x,y) -82.718349731738, -0.030054379428449 + Layer[1] : time 36.035045866101 (nsec) --- local (x,y) -99.231049680789, -0.024012311562531 + Layer[2] : time 37.70377716007 (nsec) --- local (x,y) -115.74296211149, -0.013917643114638 + Layer[3] : time 39.372508392958 (nsec) --- local (x,y) -132.25432058226, -0.005453708672134 + Layer[4] : time 41.041239763219 (nsec) --- local (x,y) -148.76692672107, 0.0028549145554235 + Layer[4] : time 62.993827716514 (nsec) --- local (x,y) -1422.4309041996, -257.66765499105 +EM Calorimeter has 73 hits. Total Edep is 12980.257597808 (MeV) +Hadron Calorimeter has 18 hits. Total Edep is 3559.4369365923 (MeV) ... write file : B5.root - done ... write file : B5ntuple.root - done ... close file : B5.root - done @@ -1101,25 +1144,27 @@ Hadron Calorimeter has 19 hits. Total Edep is 4542.387118546 (MeV) >>> Event 0 >>> Simulation truth : e+ (0,0,100000) Hodoscope 1 has 1 hits. - Hodoscope[7] 4.9867832233312 (nsec) + Hodoscope[7] 4.986783223279 (nsec) Hodoscope 2 has 3 hits. - Hodoscope[9] 43.185585967592 (nsec) - Hodoscope[7] 56.452446919309 (nsec) - Hodoscope[5] 56.189641882772 (nsec) -Drift Chamber 1 has 5 hits. - Layer[0] : time 6.670948340869 (nsec) --- local (x,y) -0.022650567270517, -0.010396657121677 - Layer[1] : time 8.3387688178102 (nsec) --- local (x,y) -0.036967661388588, -0.019188435381281 - Layer[2] : time 10.006589294534 (nsec) --- local (x,y) -0.049560878906597, -0.026833407524811 - Layer[3] : time 11.674409771355 (nsec) --- local (x,y) -0.064537398250929, -0.031698111054952 - Layer[4] : time 13.342230248219 (nsec) --- local (x,y) -0.080533743063145, -0.033989745346103 -Drift Chamber 2 has 5 hits. - Layer[0] : time 34.848352037499 (nsec) --- local (x,y) -147.69572137401, -0.12412049962734 - Layer[1] : time 36.519073492314 (nsec) --- local (x,y) -177.19907601656, -0.12387028820468 - Layer[2] : time 38.189794666582 (nsec) --- local (x,y) -206.70100273897, -0.12559761112726 - Layer[3] : time 39.860515800389 (nsec) --- local (x,y) -236.20272331995, -0.12947620569721 - Layer[4] : time 41.531237449286 (nsec) --- local (x,y) -265.70706537022, -0.1339106119343 -EM Calorimeter has 40 hits. Total Edep is 91220.683145668 (MeV) -Hadron Calorimeter has 5 hits. Total Edep is 38.857264117551 (MeV) + Hodoscope[9] 43.186141934039 (nsec) + Hodoscope[16] 56.587508165145 (nsec) + Hodoscope[7] 55.893346895592 (nsec) +Drift Chamber 1 has 6 hits. + Layer[0] : time 6.6709483404543 (nsec) --- local (x,y) 0.0061718026648383, -0.015568897173451 + Layer[1] : time 8.3387688169536 (nsec) --- local (x,y) 0.0085610072761597, -0.027667102631794 + Layer[2] : time 10.006589293255 (nsec) --- local (x,y) 0.012897954895822, -0.036247433549594 + Layer[3] : time 11.674409769726 (nsec) --- local (x,y) 0.024134435075224, -0.039792069667104 + Layer[3] : time 12.406887267431 (nsec) --- local (x,y) -198.41011484338, -53.159299016341 + Layer[4] : time 13.342230246247 (nsec) --- local (x,y) 0.036704522180506, -0.039220374509927 +Drift Chamber 2 has 6 hits. + Layer[0] : time 34.848893271681 (nsec) --- local (x,y) -147.41163101389, 0.022809387626289 + Layer[1] : time 36.519617088754 (nsec) --- local (x,y) -176.9270054008, 0.028100612285775 + Layer[2] : time 38.190341812153 (nsec) --- local (x,y) -206.44699067831, 0.030528710696459 + Layer[3] : time 39.861066601675 (nsec) --- local (x,y) -235.96731230587, 0.033009034944669 + Layer[4] : time 41.531791149301 (nsec) --- local (x,y) -265.48640340012, 0.036173126924294 + Layer[4] : time 58.507148310721 (nsec) --- local (x,y) -1195.0286293212, 292.39115804752 +EM Calorimeter has 50 hits. Total Edep is 88259.231556983 (MeV) +Hadron Calorimeter has 11 hits. Total Edep is 76.708741161887 (MeV) ... write file : B5.root - done ... write file : B5ntuple.root - done ... close file : B5.root - done @@ -1134,25 +1179,26 @@ Hadron Calorimeter has 5 hits. Total Edep is 38.857264117551 (MeV) ... open analysis file : B5.root - done --> Event 0 starts. ->>> Event 0 >>> Simulation truth : proton (0,0,10000) +>>> Event 0 >>> Simulation truth : proton (-0,0,10000) Hodoscope 1 has 1 hits. - Hodoscope[7] 5.0086862999309 (nsec) -Hodoscope 2 has 1 hits. - Hodoscope[9] 43.376183810645 (nsec) + Hodoscope[7] 5.0086863995438 (nsec) +Hodoscope 2 has 2 hits. + Hodoscope[9] 43.37533495566 (nsec) + Hodoscope[2] 4643.5331855704 (nsec) Drift Chamber 1 has 5 hits. - Layer[0] : time 6.7002530484965 (nsec) --- local (x,y) 0.1067309449766, -0.11277049578431 - Layer[1] : time 8.3754035346252 (nsec) --- local (x,y) 0.18487643435626, -0.10103659362979 - Layer[2] : time 10.050554138795 (nsec) --- local (x,y) 0.25441363733634, -0.09042103023253 - Layer[3] : time 11.725704863256 (nsec) --- local (x,y) 0.31498517408949, -0.08712838203859 - Layer[4] : time 13.400855734662 (nsec) --- local (x,y) 0.35190960237207, -0.083493437991714 + Layer[0] : time 6.7002517626799 (nsec) --- local (x,y) -0.022349248227811, -0.29420022567928 + Layer[1] : time 8.3754009056829 (nsec) --- local (x,y) -0.085863523556728, -0.49394313405456 + Layer[2] : time 10.050550143476 (nsec) --- local (x,y) -0.16570344625007, -0.68700569397219 + Layer[3] : time 11.725699488182 (nsec) --- local (x,y) -0.24167744850375, -0.87345454665286 + Layer[4] : time 13.40084890562 (nsec) --- local (x,y) -0.30684447378443, -1.0276411114737 Drift Chamber 2 has 5 hits. - Layer[0] : time 35.002165297596 (nsec) --- local (x,y) -147.93803243955, 0.64232451820089 - Layer[1] : time 36.680259703675 (nsec) --- local (x,y) -177.58260634037, 0.67833786533091 - Layer[2] : time 38.358354627835 (nsec) --- local (x,y) -207.22904283735, 0.73168228167184 - Layer[3] : time 40.0364489984 (nsec) --- local (x,y) -236.87198689983, 0.79839031395546 - Layer[4] : time 41.71454005221 (nsec) --- local (x,y) -266.49747939723, 0.88037339807234 -EM Calorimeter has 34 hits. Total Edep is 285.23381299323 (MeV) -Hadron Calorimeter has 14 hits. Total Edep is 692.38559865096 (MeV) + Layer[0] : time 35.001376603877 (nsec) --- local (x,y) -147.80110256265, -3.1253712145765 + Layer[1] : time 36.679457538461 (nsec) --- local (x,y) -177.38379927132, -3.3345298820139 + Layer[2] : time 38.357536355627 (nsec) --- local (x,y) -206.9549433519, -3.5649214682564 + Layer[3] : time 40.035615774397 (nsec) --- local (x,y) -236.52833240062, -3.796215919941 + Layer[4] : time 41.713699094782 (nsec) --- local (x,y) -266.12077349803, -4.0363227432172 +EM Calorimeter has 25 hits. Total Edep is 5641.4065204872 (MeV) +Hadron Calorimeter has 11 hits. Total Edep is 228.12707640749 (MeV) ... write file : B5.root - done ... write file : B5ntuple.root - done ... close file : B5.root - done @@ -1169,24 +1215,26 @@ Hadron Calorimeter has 14 hits. Total Edep is 692.38559865096 (MeV) >>> Event 0 >>> Simulation truth : pi+ (0,0,10000) Hodoscope 1 has 1 hits. - Hodoscope[7] 4.9872689215166 (nsec) -Hodoscope 2 has 2 hits. - Hodoscope[10] 42.696191506364 (nsec) - Hodoscope[17] 3409.207470982 (nsec) + Hodoscope[7] 4.9872689660597 (nsec) +Hodoscope 2 has 1 hits. + Hodoscope[10] 42.705277984622 (nsec) Drift Chamber 1 has 5 hits. - Layer[0] : time 6.6715981485924 (nsec) --- local (x,y) -0.04104908672857, -0.036265737054786 - Layer[1] : time 8.3395811431519 (nsec) --- local (x,y) -0.038500981609264, -0.095121240673463 - Layer[2] : time 10.007564141667 (nsec) --- local (x,y) -0.024467312285855, -0.15544859053809 - Layer[3] : time 11.675547145772 (nsec) --- local (x,y) -0.0080183651974258, -0.22100567647756 - Layer[4] : time 13.3435301575 (nsec) --- local (x,y) -0.035952411010668, -0.28816209137126 -Drift Chamber 2 has 5 hits. - Layer[0] : time 34.368062211093 (nsec) --- local (x,y) -83.63913707401, -0.74998790794261 - Layer[1] : time 36.036961288796 (nsec) --- local (x,y) -100.21207138424, -0.82151269916962 - Layer[2] : time 37.70585720683 (nsec) --- local (x,y) -116.75644870384, -0.87098144133335 - Layer[3] : time 39.374753517376 (nsec) --- local (x,y) -133.30434502421, -0.92329820845108 - Layer[4] : time 41.043650231426 (nsec) --- local (x,y) -149.85594425541, -0.9485344352209 -EM Calorimeter has 43 hits. Total Edep is 4944.5285862098 (MeV) -Hadron Calorimeter has 13 hits. Total Edep is 95.932515955769 (MeV) + Layer[0] : time 6.671598322667 (nsec) --- local (x,y) 0.22933462973613, -0.2138934147804 + Layer[1] : time 8.3395815247574 (nsec) --- local (x,y) 0.39064756761327, -0.39591814995509 + Layer[2] : time 10.007564763238 (nsec) --- local (x,y) 0.56815760217874, -0.58619586551157 + Layer[3] : time 11.675548014985 (nsec) --- local (x,y) 0.73371446090579, -0.79297739838818 + Layer[4] : time 13.343531289527 (nsec) --- local (x,y) 0.89101504693309, -1.0199605747907 +Drift Chamber 2 has 8 hits. + Layer[0] : time 34.37680279851 (nsec) --- local (x,y) -83.287643653354, -4.065683371671 + Layer[1] : time 36.045767922697 (nsec) --- local (x,y) -100.44577805965, -4.3121962685794 + Layer[1] : time 36.355493166073 (nsec) --- local (x,y) 95.085792824427, -73.138446253837 + Layer[2] : time 37.714733961014 (nsec) --- local (x,y) -117.61179870902, -4.5555918806547 + Layer[2] : time 39.110706899366 (nsec) --- local (x,y) 630.84093470745, -100.52962316865 + Layer[3] : time 39.383700299043 (nsec) --- local (x,y) -134.7807435269, -4.7739475879862 + Layer[3] : time 43.200015812599 (nsec) --- local (x,y) 1451.8111294961, 272.82110872522 + Layer[4] : time 41.052665532951 (nsec) --- local (x,y) -151.93982421198, -5.0060919196642 +EM Calorimeter has 6 hits. Total Edep is 204.36366591634 (MeV) +Hadron Calorimeter has 8 hits. Total Edep is 351.72212415738 (MeV) ... write file : B5.root - done ... write file : B5ntuple.root - done ... close file : B5.root - done @@ -1203,24 +1251,25 @@ Hadron Calorimeter has 13 hits. Total Edep is 95.932515955769 (MeV) >>> Event 0 >>> Simulation truth : e+ (0,0,10000) Hodoscope 1 has 1 hits. - Hodoscope[7] 4.9867832248776 (nsec) -Hodoscope 2 has 2 hits. - Hodoscope[9] 43.186824168409 (nsec) - Hodoscope[19] 56.953071557234 (nsec) + Hodoscope[7] 4.9867832321086 (nsec) +Hodoscope 2 has 3 hits. + Hodoscope[9] 43.184153188907 (nsec) + Hodoscope[10] 245.82002534641 (nsec) + Hodoscope[11] 245.15967872428 (nsec) Drift Chamber 1 has 5 hits. - Layer[0] : time 6.670948471923 (nsec) --- local (x,y) 0.00074437803480282, -0.19716470129138 - Layer[1] : time 8.3387690912391 (nsec) --- local (x,y) -0.019551867149912, -0.40337995480736 - Layer[2] : time 10.006589733899 (nsec) --- local (x,y) -0.0061068094024282, -0.62601292010359 - Layer[3] : time 11.674410352285 (nsec) --- local (x,y) -0.004457904578065, -0.83184483569746 - Layer[4] : time 13.342230963961 (nsec) --- local (x,y) -0.010374796958086, -1.0331168609819 + Layer[0] : time 6.6709483625156 (nsec) --- local (x,y) 0.028554733854253, 0.11288425077491 + Layer[1] : time 8.3387688497016 (nsec) --- local (x,y) 0.0081954888959827, 0.16566803949222 + Layer[2] : time 10.00658933911 (nsec) --- local (x,y) -0.037084812462791, 0.2097955115181 + Layer[3] : time 11.674409830458 (nsec) --- local (x,y) -0.095739665655089, 0.24212776551843 + Layer[4] : time 13.342230343245 (nsec) --- local (x,y) -0.19143883143498, 0.280955043982 Drift Chamber 2 has 5 hits. - Layer[0] : time 34.849303701949 (nsec) --- local (x,y) -147.4439645577, -3.682152589963 - Layer[1] : time 36.520083391224 (nsec) --- local (x,y) -177.23900305816, -4.1071355324344 - Layer[2] : time 38.190862018315 (nsec) --- local (x,y) -207.02791423935, -4.594747397065 - Layer[3] : time 39.861638512926 (nsec) --- local (x,y) -236.80568174536, -5.1064609040451 - Layer[4] : time 41.532419124968 (nsec) --- local (x,y) -266.60395281678, -5.6325618315619 -EM Calorimeter has 20 hits. Total Edep is 9551.2128642721 (MeV) -Hadron Calorimeter has 1 hits. Total Edep is 0.79255018557546 (MeV) + Layer[0] : time 34.846775294742 (nsec) --- local (x,y) -149.42589417847, 1.0913236277365 + Layer[1] : time 36.517528166378 (nsec) --- local (x,y) -179.08871186789, 1.1036475382268 + Layer[2] : time 38.188280041957 (nsec) --- local (x,y) -208.74648619631, 1.1183344154187 + Layer[3] : time 39.859030277492 (nsec) --- local (x,y) -238.39595920202, 1.1194071306527 + Layer[4] : time 41.529777438209 (nsec) --- local (x,y) -268.02985388489, 1.1179763136207 +EM Calorimeter has 19 hits. Total Edep is 9592.7528256058 (MeV) +Hadron Calorimeter has 1 hits. Total Edep is 1.1527738459778 (MeV) ... write file : B5.root - done ... write file : B5ntuple.root - done ... close file : B5.root - done @@ -1237,23 +1286,33 @@ Hadron Calorimeter has 1 hits. Total Edep is 0.79255018557546 (MeV) >>> Event 0 >>> Simulation truth : proton (0,0,1000) Hodoscope 1 has 1 hits. - Hodoscope[7] 6.8393534865768 (nsec) + Hodoscope[7] 6.8391294477092 (nsec) Hodoscope 2 has 1 hits. - Hodoscope[9] 59.403133143058 (nsec) -Drift Chamber 1 has 5 hits. - Layer[0] : time 9.1540009613224 (nsec) --- local (x,y) -1.4305191145607, 4.2781892895396 - Layer[1] : time 11.446564714089 (nsec) --- local (x,y) -2.5472323088019, 6.8318374311601 - Layer[2] : time 13.739313677278 (nsec) --- local (x,y) -3.6865093980832, 9.5942150657218 - Layer[3] : time 16.032297892598 (nsec) --- local (x,y) -4.9774723995266, 12.415316330892 - Layer[4] : time 18.325536393761 (nsec) --- local (x,y) -5.8689825323314, 15.209548970803 + Hodoscope[9] 59.335155166658 (nsec) +Drift Chamber 1 has 15 hits. + Layer[0] : time 9.1530868142859 (nsec) --- local (x,y) -1.7003060531296, -1.2574642505728 + Layer[1] : time 11.444865639518 (nsec) --- local (x,y) -3.1911477116536, -3.0583289559432 + Layer[1] : time 11.445260708189 (nsec) --- local (x,y) -3.1913618155475, -3.0586122262793 + Layer[1] : time 11.445260708189 (nsec) --- local (x,y) -3.1913618155475, -3.0586122262793 + Layer[1] : time 11.44579977117 (nsec) --- local (x,y) -3.2120298396826, -3.0652161442389 + Layer[1] : time 11.447012500352 (nsec) --- local (x,y) -3.2535022616029, -3.0849991561147 + Layer[1] : time 11.448239122897 (nsec) --- local (x,y) -3.2167984846275, -3.066950610984 + Layer[1] : time 11.449579352467 (nsec) --- local (x,y) -3.2053947670375, -3.0513542557342 + Layer[1] : time 11.450651467865 (nsec) --- local (x,y) -3.1944465815106, -3.0667120862004 + Layer[1] : time 11.451693660894 (nsec) --- local (x,y) -3.1675510263612, -3.0709428730859 + Layer[1] : time 11.452616037749 (nsec) --- local (x,y) -3.149827760649, -3.0819530439862 + Layer[1] : time 11.44579977117 (nsec) --- local (x,y) -3.2120298396826, -3.0652161442389 + Layer[2] : time 13.736836636682 (nsec) --- local (x,y) -4.3885203351499, -4.6056021441795 + Layer[3] : time 16.028986497908 (nsec) --- local (x,y) -5.7011362343429, -6.2665502911047 + Layer[4] : time 18.321316375366 (nsec) --- local (x,y) -7.1302349229711, -8.1703402567636 Drift Chamber 2 has 5 hits. - Layer[0] : time 47.917621161278 (nsec) --- local (x,y) -153.60738395585, 52.566300521229 - Layer[1] : time 50.218722103696 (nsec) --- local (x,y) -183.47698629314, 55.753342385152 - Layer[2] : time 52.520157641659 (nsec) --- local (x,y) -213.53375721711, 59.017666294204 - Layer[3] : time 54.82172544894 (nsec) --- local (x,y) -243.4765801424, 62.254694391985 - Layer[4] : time 57.123607500918 (nsec) --- local (x,y) -273.60168936352, 65.260589634429 -EM Calorimeter has 12 hits. Total Edep is 368.25505014869 (MeV) -Hadron Calorimeter has 0 hits. Total Edep is 0 (MeV) + Layer[0] : time 47.85525356834 (nsec) --- local (x,y) -177.50275227276, -44.02503126221 + Layer[1] : time 50.155303948642 (nsec) --- local (x,y) -209.10940781929, -47.423401566478 + Layer[2] : time 52.455623670988 (nsec) --- local (x,y) -240.53694749766, -50.914728862583 + Layer[3] : time 54.756095232873 (nsec) --- local (x,y) -271.696617012, -54.4379571935 + Layer[4] : time 57.056828188829 (nsec) --- local (x,y) -303.16204527942, -57.611673758328 +EM Calorimeter has 6 hits. Total Edep is 335.49967869246 (MeV) +Hadron Calorimeter has 1 hits. Total Edep is 0.13769058658181 (MeV) ... write file : B5.root - done ... write file : B5ntuple.root - done ... close file : B5.root - done @@ -1268,25 +1327,25 @@ Hadron Calorimeter has 0 hits. Total Edep is 0 (MeV) ... open analysis file : B5.root - done --> Event 0 starts. ->>> Event 0 >>> Simulation truth : pi+ (-0,0,1000) +>>> Event 0 >>> Simulation truth : pi+ (0,0,1000) Hodoscope 1 has 1 hits. - Hodoscope[7] 5.0351399552724 (nsec) + Hodoscope[7] 5.0351328396979 (nsec) Hodoscope 2 has 1 hits. - Hodoscope[10] 43.217595909099 (nsec) + Hodoscope[10] 43.130372899128 (nsec) Drift Chamber 1 has 5 hits. - Layer[0] : time 6.7357003042825 (nsec) --- local (x,y) 1.7794777059786, 0.14435027640907 - Layer[1] : time 8.4197620377243 (nsec) --- local (x,y) 3.0205721015587, 0.12546811854514 - Layer[2] : time 10.103826356277 (nsec) --- local (x,y) 4.2772867215777, 0.12581281032325 - Layer[3] : time 11.787901585363 (nsec) --- local (x,y) 6.2120327207629, 0.69186569057478 - Layer[4] : time 13.471980016653 (nsec) --- local (x,y) 8.2051624013077, 1.28000498786 + Layer[0] : time 6.7357021989171 (nsec) --- local (x,y) 0.48736932095771, -1.5632820632101 + Layer[1] : time 8.4197720672591 (nsec) --- local (x,y) 0.68882804513895, -2.3827925991713 + Layer[2] : time 10.103845114249 (nsec) --- local (x,y) 0.82659388901757, -3.162433339196 + Layer[3] : time 11.787921241599 (nsec) --- local (x,y) 1.1875847128091, -4.0545076080575 + Layer[4] : time 13.471999469737 (nsec) --- local (x,y) 1.5935890288088, -4.6070634835276 Drift Chamber 2 has 5 hits. - Layer[0] : time 34.802299041599 (nsec) --- local (x,y) -85.709297083024, 45.864350700498 - Layer[1] : time 36.488599216903 (nsec) --- local (x,y) -110.50892857713, 50.851800769542 - Layer[2] : time 38.174970233039 (nsec) --- local (x,y) -135.71745493723, 55.830137884354 - Layer[3] : time 39.861332753624 (nsec) --- local (x,y) -160.88497179058, 60.668813524458 - Layer[4] : time 41.547717662901 (nsec) --- local (x,y) -186.17003902257, 65.496057117332 -EM Calorimeter has 30 hits. Total Edep is 544.53950172875 (MeV) -Hadron Calorimeter has 9 hits. Total Edep is 3.7380061567021 (MeV) + Layer[0] : time 34.719503435985 (nsec) --- local (x,y) -92.48427555994, -7.3729370872464 + Layer[1] : time 36.404974956781 (nsec) --- local (x,y) -112.55139621836, -7.5640475233388 + Layer[2] : time 38.090441686578 (nsec) --- local (x,y) -132.55506139381, -7.8954268939133 + Layer[3] : time 39.775905714484 (nsec) --- local (x,y) -152.50827789895, -8.464189921769 + Layer[4] : time 41.461375440267 (nsec) --- local (x,y) -172.48214183209, -9.0175330126414 +EM Calorimeter has 21 hits. Total Edep is 568.09819939903 (MeV) +Hadron Calorimeter has 0 hits. Total Edep is 0 (MeV) ... write file : B5.root - done ... write file : B5ntuple.root - done ... close file : B5.root - done @@ -1301,25 +1360,27 @@ Hadron Calorimeter has 9 hits. Total Edep is 3.7380061567021 (MeV) ... open analysis file : B5.root - done --> Event 0 starts. ->>> Event 0 >>> Simulation truth : e+ (0,0,1000) +>>> Event 0 >>> Simulation truth : e+ (-0,0,1000) Hodoscope 1 has 1 hits. - Hodoscope[7] 4.9867836288103 (nsec) -Hodoscope 2 has 1 hits. - Hodoscope[7] 43.221054043405 (nsec) + Hodoscope[7] 4.9867833779458 (nsec) +Hodoscope 2 has 2 hits. + Hodoscope[9] 43.197418066152 (nsec) + Hodoscope[24] 57.858849325328 (nsec) Drift Chamber 1 has 5 hits. - Layer[0] : time 6.6709495073582 (nsec) --- local (x,y) 0.68856812511186, -0.4674583163358 - Layer[1] : time 8.338770585454 (nsec) --- local (x,y) 0.94339080328088, -0.792716855236 - Layer[2] : time 10.006592054104 (nsec) --- local (x,y) 1.2283816037175, -1.2510512016604 - Layer[3] : time 11.674413540716 (nsec) --- local (x,y) 1.4201630292622, -1.761131485237 - Layer[4] : time 13.342234777508 (nsec) --- local (x,y) 1.3363211247053, -2.2280328499863 -Drift Chamber 2 has 5 hits. - Layer[0] : time 34.850487183508 (nsec) --- local (x,y) -273.72067934462, -11.283075264707 - Layer[1] : time 36.528092930731 (nsec) --- local (x,y) -327.96007605827, -11.753837003036 - Layer[2] : time 38.205582721039 (nsec) --- local (x,y) -381.87621822736, -12.240292926333 - Layer[3] : time 39.882964250696 (nsec) --- local (x,y) -435.48751553174, -12.84888915755 - Layer[4] : time 41.560265877625 (nsec) --- local (x,y) -488.8735974868, -13.461494579086 -EM Calorimeter has 9 hits. Total Edep is 903.19833784422 (MeV) -Hadron Calorimeter has 1 hits. Total Edep is 0.6763256576787 (MeV) + Layer[0] : time 6.6709537660755 (nsec) --- local (x,y) 1.0369457035594, 0.93102019894036 + Layer[1] : time 8.3387785516647 (nsec) --- local (x,y) 1.7909519033166, 1.7801792793074 + Layer[2] : time 10.006604471708 (nsec) --- local (x,y) 2.574107125825, 2.788524716259 + Layer[3] : time 11.674432122513 (nsec) --- local (x,y) 3.4086760352871, 3.9940881586654 + Layer[4] : time 13.342259193758 (nsec) --- local (x,y) 4.306221996358, 5.0756070707912 +Drift Chamber 2 has 6 hits. + Layer[0] : time 34.85776626691 (nsec) --- local (x,y) -151.11179719489, 20.263928034068 + Layer[1] : time 36.528937431717 (nsec) --- local (x,y) -182.71701782342, 22.797566141124 + Layer[1] : time 36.619227777364 (nsec) --- local (x,y) -122.85781413697, -129.33765771657 + Layer[2] : time 38.200128518253 (nsec) --- local (x,y) -214.40534431581, 25.508211111181 + Layer[3] : time 39.871335714879 (nsec) --- local (x,y) -246.15232283785, 28.418161521237 + Layer[4] : time 41.542567838155 (nsec) --- local (x,y) -278.03359932473, 31.140540058196 +EM Calorimeter has 7 hits. Total Edep is 957.24529557224 (MeV) +Hadron Calorimeter has 0 hits. Total Edep is 0 (MeV) ... write file : B5.root - done ... write file : B5ntuple.root - done ... close file : B5.root - done diff --git a/examples/basic/B5/include/B5ActionInitialization.hh b/examples/basic/B5/include/ActionInitialization.hh similarity index 85% rename from examples/basic/B5/include/B5ActionInitialization.hh rename to examples/basic/B5/include/ActionInitialization.hh index 8cf82961f9..91ae3598a8 100644 --- a/examples/basic/B5/include/B5ActionInitialization.hh +++ b/examples/basic/B5/include/ActionInitialization.hh @@ -24,29 +24,31 @@ // ******************************************************************** // // -/// \file B5ActionInitialization.hh -/// \brief Definition of the B5ActionInitialization class +/// \file ActionInitialization.hh +/// \brief Definition of the B5::ActionInitialization class #ifndef B5ActionInitialization_h #define B5ActionInitialization_h 1 #include "G4VUserActionInitialization.hh" +namespace B5 +{ + /// Action initialization class. -class B5ActionInitialization : public G4VUserActionInitialization +class ActionInitialization : public G4VUserActionInitialization { public: - B5ActionInitialization(); - virtual ~B5ActionInitialization(); - - virtual void BuildForMaster() const; - virtual void Build() const; + ActionInitialization(); + ~ActionInitialization() override; + void BuildForMaster() const override; + void Build() const override; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - - diff --git a/examples/basic/B5/include/B5CellParameterisation.hh b/examples/basic/B5/include/CellParameterisation.hh similarity index 87% rename from examples/basic/B5/include/B5CellParameterisation.hh rename to examples/basic/B5/include/CellParameterisation.hh index 8c1e90ee90..353df7a776 100644 --- a/examples/basic/B5/include/B5CellParameterisation.hh +++ b/examples/basic/B5/include/CellParameterisation.hh @@ -24,13 +24,13 @@ // ******************************************************************** // // -/// \file B5CellParameterisation.hh -/// \brief Definition of the B5CellParameterisation class +/// \file CellParameterisation.hh +/// \brief Definition of the B5::CellParameterisation class #ifndef B5CellParameterisation_H #define B5CellParameterisation_H 1 -#include "B5Constants.hh" +#include "Constants.hh" #include "globals.hh" #include "G4VPVParameterisation.hh" @@ -39,22 +39,27 @@ class G4VPhysicalVolume; +namespace B5 +{ + /// EM Calorimeter cell parameterisation -class B5CellParameterisation : public G4VPVParameterisation +class CellParameterisation : public G4VPVParameterisation { public: - B5CellParameterisation(); - virtual ~B5CellParameterisation(); + CellParameterisation(); + ~CellParameterisation() override; - virtual void ComputeTransformation( - const G4int copyNo,G4VPhysicalVolume *physVol) const; + void ComputeTransformation( + const G4int copyNo,G4VPhysicalVolume *physVol) const override; private: std::array fXCell; std::array fYCell; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/include/B5Constants.hh b/examples/basic/B5/include/Constants.hh similarity index 95% rename from examples/basic/B5/include/B5Constants.hh rename to examples/basic/B5/include/Constants.hh index 97ec06383d..e7ef36cd28 100644 --- a/examples/basic/B5/include/B5Constants.hh +++ b/examples/basic/B5/include/Constants.hh @@ -24,14 +24,17 @@ // ******************************************************************** // // -/// \file B5Constants.hh -/// \brief Definition of constants. +/// \file Constants.hh +/// \brief Definition of B5 example constants. #ifndef B5Constants_h #define B5Constants_h 1 #include "globals.hh" +namespace B5 +{ + constexpr G4int kNofHodoscopes1 = 15; constexpr G4int kNofHodoscopes2 = 25; constexpr G4int kNofChambers = 5; @@ -42,4 +45,6 @@ constexpr G4int kNofHadColumns = 10; constexpr G4int kNofHadRows = 2; constexpr G4int kNofHadCells = kNofHadColumns * kNofHadRows; +} + #endif diff --git a/examples/basic/B5/include/B5DetectorConstruction.hh b/examples/basic/B5/include/DetectorConstruction.hh similarity index 73% rename from examples/basic/B5/include/B5DetectorConstruction.hh rename to examples/basic/B5/include/DetectorConstruction.hh index c1e22113a6..7a1f6e733c 100644 --- a/examples/basic/B5/include/B5DetectorConstruction.hh +++ b/examples/basic/B5/include/DetectorConstruction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B5DetectorConstruction.hh -/// \brief Definition of the B5DetectorConstruction class +/// \file DetectorConstruction.hh +/// \brief Definition of the B5::DetectorConstruction class #ifndef B5DetectorConstruction_h #define B5DetectorConstruction_h 1 @@ -37,24 +37,27 @@ #include -class B5MagneticField; - class G4VPhysicalVolume; class G4Material; class G4VSensitiveDetector; class G4VisAttributes; class G4GenericMessenger; +namespace B5 +{ + +class MagneticField; + /// Detector construction -class B5DetectorConstruction : public G4VUserDetectorConstruction +class DetectorConstruction : public G4VUserDetectorConstruction { public: - B5DetectorConstruction(); - virtual ~B5DetectorConstruction(); + DetectorConstruction(); + ~DetectorConstruction() override; - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; void SetArmAngle(G4double val); G4double GetArmAngle() { return fArmAngle; } @@ -66,24 +69,26 @@ class B5DetectorConstruction : public G4VUserDetectorConstruction G4GenericMessenger* fMessenger; - static G4ThreadLocal B5MagneticField* fMagneticField; + static G4ThreadLocal MagneticField* fMagneticField; static G4ThreadLocal G4FieldManager* fFieldMgr; - G4LogicalVolume* fHodoscope1Logical; - G4LogicalVolume* fHodoscope2Logical; - G4LogicalVolume* fWirePlane1Logical; - G4LogicalVolume* fWirePlane2Logical; - G4LogicalVolume* fCellLogical; - G4LogicalVolume* fHadCalScintiLogical; - G4LogicalVolume* fMagneticLogical; + G4LogicalVolume* fHodoscope1Logical = nullptr; + G4LogicalVolume* fHodoscope2Logical = nullptr; + G4LogicalVolume* fWirePlane1Logical = nullptr; + G4LogicalVolume* fWirePlane2Logical = nullptr; + G4LogicalVolume* fCellLogical = nullptr; + G4LogicalVolume* fHadCalScintiLogical = nullptr; + G4LogicalVolume* fMagneticLogical = nullptr; std::vector fVisAttributes; - G4double fArmAngle; - G4RotationMatrix* fArmRotation; - G4VPhysicalVolume* fSecondArmPhys; + G4double fArmAngle = 30.*CLHEP::deg; + G4RotationMatrix* fArmRotation = nullptr; + G4VPhysicalVolume* fSecondArmPhys = nullptr; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/include/B5DriftChamberHit.hh b/examples/basic/B5/include/DriftChamberHit.hh similarity index 71% rename from examples/basic/B5/include/B5DriftChamberHit.hh rename to examples/basic/B5/include/DriftChamberHit.hh index c5ef9ff650..542189f7d0 100644 --- a/examples/basic/B5/include/B5DriftChamberHit.hh +++ b/examples/basic/B5/include/DriftChamberHit.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B5DriftChamberHit.hh -/// \brief Definition of the B5DriftChamberHit class +/// \file DriftChamberHit.hh +/// \brief Definition of the B5::DriftChamberHit class #ifndef B5DriftChamberHit_h #define B5DriftChamberHit_h 1 @@ -41,6 +41,9 @@ class G4AttDef; class G4AttValue; +namespace B5 +{ + /// Drift chamber hit /// /// It records: @@ -48,24 +51,24 @@ class G4AttValue; /// - the particle time /// - the particle local and global positions -class B5DriftChamberHit : public G4VHit +class DriftChamberHit : public G4VHit { public: - B5DriftChamberHit(); - B5DriftChamberHit(G4int layerID); - B5DriftChamberHit(const B5DriftChamberHit &right); - virtual ~B5DriftChamberHit(); + DriftChamberHit(); + DriftChamberHit(G4int layerID); + DriftChamberHit(const DriftChamberHit &right) = default; + ~DriftChamberHit() override; - const B5DriftChamberHit& operator=(const B5DriftChamberHit &right); - G4bool operator==(const B5DriftChamberHit &right) const; + DriftChamberHit& operator=(const DriftChamberHit &right) = default; + G4bool operator==(const DriftChamberHit &right) const; inline void *operator new(size_t); inline void operator delete(void *aHit); - virtual void Draw(); - virtual const std::map* GetAttDefs() const; - virtual std::vector* CreateAttValues() const; - virtual void Print(); + void Draw() override; + const std::map* GetAttDefs() const override; + std::vector* CreateAttValues() const override; + void Print() override; void SetLayerID(G4int z) { fLayerID = z; } G4int GetLayerID() const { return fLayerID; } @@ -80,27 +83,29 @@ class B5DriftChamberHit : public G4VHit G4ThreeVector GetWorldPos() const { return fWorldPos; } private: - G4int fLayerID; - G4double fTime; + G4int fLayerID = -1; + G4double fTime = 0.; G4ThreeVector fLocalPos; G4ThreeVector fWorldPos; }; -using B5DriftChamberHitsCollection = G4THitsCollection; +using DriftChamberHitsCollection = G4THitsCollection; -extern G4ThreadLocal G4Allocator* B5DriftChamberHitAllocator; +extern G4ThreadLocal G4Allocator* DriftChamberHitAllocator; -inline void* B5DriftChamberHit::operator new(size_t) +inline void* DriftChamberHit::operator new(size_t) { - if (!B5DriftChamberHitAllocator) { - B5DriftChamberHitAllocator = new G4Allocator; + if (!DriftChamberHitAllocator) { + DriftChamberHitAllocator = new G4Allocator; } - return (void*)B5DriftChamberHitAllocator->MallocSingle(); + return (void*)DriftChamberHitAllocator->MallocSingle(); } -inline void B5DriftChamberHit::operator delete(void* aHit) +inline void DriftChamberHit::operator delete(void* aHit) { - B5DriftChamberHitAllocator->FreeSingle((B5DriftChamberHit*) aHit); + DriftChamberHitAllocator->FreeSingle((DriftChamberHit*) aHit); +} + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B5/include/B5DriftChamberSD.hh b/examples/basic/B5/include/DriftChamberSD.hh similarity index 81% rename from examples/basic/B5/include/B5DriftChamberSD.hh rename to examples/basic/B5/include/DriftChamberSD.hh index 6f3f43f141..0f8513d7e3 100644 --- a/examples/basic/B5/include/B5DriftChamberSD.hh +++ b/examples/basic/B5/include/DriftChamberSD.hh @@ -24,36 +24,41 @@ // ******************************************************************** // // -/// \file B5DriftChamberSD.hh -/// \brief Definition of the B5DriftChamberSD class +/// \file DriftChamberSD.hh +/// \brief Definition of the B5::DriftChamberSD class #ifndef B5DriftChamberSD_h #define B5DriftChamberSD_h 1 #include "G4VSensitiveDetector.hh" -#include "B5DriftChamberHit.hh" +#include "DriftChamberHit.hh" class G4Step; class G4HCofThisEvent; class G4TouchableHistory; +namespace B5 +{ + /// Drift chamber sensitive detector -class B5DriftChamberSD : public G4VSensitiveDetector +class DriftChamberSD : public G4VSensitiveDetector { public: - B5DriftChamberSD(G4String name); - virtual ~B5DriftChamberSD(); + DriftChamberSD(G4String name); + ~DriftChamberSD() override; - virtual void Initialize(G4HCofThisEvent*HCE); - virtual G4bool ProcessHits(G4Step* aStep, G4TouchableHistory* ROhist); + void Initialize(G4HCofThisEvent*HCE) override; + G4bool ProcessHits(G4Step* aStep, G4TouchableHistory* ROhist) override; private: - B5DriftChamberHitsCollection* fHitsCollection; - G4int fHCID; + DriftChamberHitsCollection* fHitsCollection = nullptr; + G4int fHCID = -1; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/include/B5EmCalorimeterHit.hh b/examples/basic/B5/include/EmCalorimeterHit.hh similarity index 70% rename from examples/basic/B5/include/B5EmCalorimeterHit.hh rename to examples/basic/B5/include/EmCalorimeterHit.hh index b80009eba2..9074302495 100644 --- a/examples/basic/B5/include/B5EmCalorimeterHit.hh +++ b/examples/basic/B5/include/EmCalorimeterHit.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B5EmCalorimeterHit.hh -/// \brief Definition of the B5EmCalorimeterHit class +/// \file EmCalorimeterHit.hh +/// \brief Definition of the B5::EmCalorimeterHit class #ifndef B5EmCalorimeterHit_h #define B5EmCalorimeterHit_h 1 @@ -41,6 +41,9 @@ class G4AttDef; class G4AttValue; +namespace B5 +{ + /// EM Calorimeter hit /// /// It records: @@ -48,24 +51,24 @@ class G4AttValue; /// - the energy deposit /// - the cell logical volume, its position and rotation -class B5EmCalorimeterHit : public G4VHit +class EmCalorimeterHit : public G4VHit { public: - B5EmCalorimeterHit(); - B5EmCalorimeterHit(G4int cellID); - B5EmCalorimeterHit(const B5EmCalorimeterHit &right); - virtual ~B5EmCalorimeterHit(); + EmCalorimeterHit(); + EmCalorimeterHit(G4int cellID); + EmCalorimeterHit(const EmCalorimeterHit &right) = default; + ~EmCalorimeterHit() override; - const B5EmCalorimeterHit& operator=(const B5EmCalorimeterHit &right); - G4bool operator==(const B5EmCalorimeterHit &right) const; + EmCalorimeterHit& operator=(const EmCalorimeterHit &right) = default; + G4bool operator==(const EmCalorimeterHit &right) const; inline void *operator new(size_t); inline void operator delete(void *aHit); - virtual void Draw(); - virtual const std::map* GetAttDefs() const; - virtual std::vector* CreateAttValues() const; - virtual void Print(); + void Draw() override; + const std::map* GetAttDefs() const override; + std::vector* CreateAttValues() const override; + void Print() override; void SetCellID(G4int z) { fCellID = z; } G4int GetCellID() const { return fCellID; } @@ -84,28 +87,30 @@ class B5EmCalorimeterHit : public G4VHit const G4LogicalVolume* GetLogV() const { return fPLogV; } private: - G4int fCellID; - G4double fEdep; + G4int fCellID = -1; + G4double fEdep = 0.; G4ThreeVector fPos; G4RotationMatrix fRot; - const G4LogicalVolume* fPLogV; + const G4LogicalVolume* fPLogV = nullptr; }; -using B5EmCalorimeterHitsCollection = G4THitsCollection; +using EmCalorimeterHitsCollection = G4THitsCollection; -extern G4ThreadLocal G4Allocator* B5EmCalorimeterHitAllocator; +extern G4ThreadLocal G4Allocator* EmCalorimeterHitAllocator; -inline void* B5EmCalorimeterHit::operator new(size_t) +inline void* EmCalorimeterHit::operator new(size_t) { - if (!B5EmCalorimeterHitAllocator) { - B5EmCalorimeterHitAllocator = new G4Allocator; + if (!EmCalorimeterHitAllocator) { + EmCalorimeterHitAllocator = new G4Allocator; } - return (void*)B5EmCalorimeterHitAllocator->MallocSingle(); + return (void*)EmCalorimeterHitAllocator->MallocSingle(); } -inline void B5EmCalorimeterHit::operator delete(void* aHit) +inline void EmCalorimeterHit::operator delete(void* aHit) { - B5EmCalorimeterHitAllocator->FreeSingle((B5EmCalorimeterHit*) aHit); + EmCalorimeterHitAllocator->FreeSingle((EmCalorimeterHit*) aHit); +} + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B5/include/B5EmCalorimeterSD.hh b/examples/basic/B5/include/EmCalorimeterSD.hh similarity index 81% rename from examples/basic/B5/include/B5EmCalorimeterSD.hh rename to examples/basic/B5/include/EmCalorimeterSD.hh index 6d6c81f571..fe98f1eddc 100644 --- a/examples/basic/B5/include/B5EmCalorimeterSD.hh +++ b/examples/basic/B5/include/EmCalorimeterSD.hh @@ -24,36 +24,41 @@ // ******************************************************************** // // -/// \file B5EmCalorimeterSD.hh -/// \brief Definition of the B5EmCalorimeterSD class +/// \file EmCalorimeterSD.hh +/// \brief Definition of the B5::EmCalorimeterSD class #ifndef B5EmCalorimeterSD_h #define B5EmCalorimeterSD_h 1 #include "G4VSensitiveDetector.hh" -#include "B5EmCalorimeterHit.hh" +#include "EmCalorimeterHit.hh" class G4Step; class G4HCofThisEvent; class G4TouchableHistory; +namespace B5 +{ + /// EM calorimeter sensitive detector -class B5EmCalorimeterSD : public G4VSensitiveDetector +class EmCalorimeterSD : public G4VSensitiveDetector { public: - B5EmCalorimeterSD(G4String name); - virtual ~B5EmCalorimeterSD(); + EmCalorimeterSD(G4String name); + ~EmCalorimeterSD() override; - virtual void Initialize(G4HCofThisEvent*HCE); - virtual G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*ROhist); + void Initialize(G4HCofThisEvent*HCE) override; + G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*ROhist) override; private: - B5EmCalorimeterHitsCollection* fHitsCollection; - G4int fHCID; + EmCalorimeterHitsCollection* fHitsCollection = nullptr; + G4int fHCID = -1; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/include/B5EventAction.hh b/examples/basic/B5/include/EventAction.hh similarity index 71% rename from examples/basic/B5/include/B5EventAction.hh rename to examples/basic/B5/include/EventAction.hh index 68b38827e6..dbce56397d 100644 --- a/examples/basic/B5/include/B5EventAction.hh +++ b/examples/basic/B5/include/EventAction.hh @@ -24,12 +24,13 @@ // ******************************************************************** // // -/// \file B5EventAction.hh -/// \brief Definition of the B5EventAction class +/// \file EventAction.hh +/// \brief Definition of the B5::EventAction class #ifndef B5EventAction_h #define B5EventAction_h 1 +#include "Constants.hh" #include "G4UserEventAction.hh" #include "globals.hh" @@ -44,31 +45,41 @@ const G4int kH1 = 0; const G4int kH2 = 1; const G4int kDim = 2; +namespace B5 +{ + /// Event action -class B5EventAction : public G4UserEventAction +class EventAction : public G4UserEventAction { public: - B5EventAction(); - virtual ~B5EventAction(); + EventAction(); + ~EventAction() override; - virtual void BeginOfEventAction(const G4Event*); - virtual void EndOfEventAction(const G4Event*); + void BeginOfEventAction(const G4Event*) override; + void EndOfEventAction(const G4Event*) override; std::vector& GetEmCalEdep() { return fCalEdep[kEm]; } std::vector& GetHadCalEdep() { return fCalEdep[kHad]; } private: // hit collections Ids - std::array fHodHCID; - std::array fDriftHCID; - std::array fCalHCID; + std::array fHodHCID = { -1, -1 }; + std::array fDriftHCID = { -1, -1 }; + std::array fCalHCID = { -1, -1 }; // histograms Ids - std::array, kDim> fDriftHistoID; + std::array, kDim> fDriftHistoID + {{ {{ -1, -1 }}, {{ -1, -1 }} }}; + // std::array is an aggregate that contains a C array. + // To initialize it, we need outer braces for the class itself + // and inner braces for the C array // energy deposit in calorimeters cells - std::array, kDim> fCalEdep; + std::array, kDim> fCalEdep + {{ std::vector(kNofEmCells, 0.), std::vector(kNofHadCells, 0.) }}; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/include/B5HadCalorimeterHit.hh b/examples/basic/B5/include/HadCalorimeterHit.hh similarity index 70% rename from examples/basic/B5/include/B5HadCalorimeterHit.hh rename to examples/basic/B5/include/HadCalorimeterHit.hh index fd02c5c8c8..e5aef6ede6 100644 --- a/examples/basic/B5/include/B5HadCalorimeterHit.hh +++ b/examples/basic/B5/include/HadCalorimeterHit.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B5HadCalorimeterHit.hh -/// \brief Definition of the B5HadCalorimeterHit class +/// \file HadCalorimeterHit.hh +/// \brief Definition of the B5::HadCalorimeterHit class #ifndef B5HadCalorimeterHit_h #define B5HadCalorimeterHit_h 1 @@ -41,6 +41,9 @@ class G4AttDef; class G4AttValue; +namespace B5 +{ + /// Hadron Calorimeter hit /// /// It records: @@ -48,24 +51,24 @@ class G4AttValue; /// - the energy deposit /// - the cell position and rotation -class B5HadCalorimeterHit : public G4VHit +class HadCalorimeterHit : public G4VHit { public: - B5HadCalorimeterHit(); - B5HadCalorimeterHit(G4int iCol,G4int iRow); - B5HadCalorimeterHit(const B5HadCalorimeterHit &right); - virtual ~B5HadCalorimeterHit(); + HadCalorimeterHit(); + HadCalorimeterHit(G4int iCol,G4int iRow); + HadCalorimeterHit(const HadCalorimeterHit &right) = default; + ~HadCalorimeterHit() override; - const B5HadCalorimeterHit& operator=(const B5HadCalorimeterHit &right); - G4bool operator==(const B5HadCalorimeterHit &right) const; + HadCalorimeterHit& operator=(const HadCalorimeterHit &right) = default; + G4bool operator==(const HadCalorimeterHit &right) const; inline void *operator new(size_t); inline void operator delete(void *aHit); - virtual void Draw(); - virtual const std::map* GetAttDefs() const; - virtual std::vector* CreateAttValues() const; - virtual void Print(); + void Draw() override; + const std::map* GetAttDefs() const override; + std::vector* CreateAttValues() const override; + void Print() override; void SetColumnID(G4int z) { fColumnID = z; } G4int GetColumnID() const { return fColumnID; } @@ -84,28 +87,30 @@ class B5HadCalorimeterHit : public G4VHit G4RotationMatrix GetRot() const { return fRot; } private: - G4int fColumnID; - G4int fRowID; - G4double fEdep; + G4int fColumnID = -1; + G4int fRowID = -1; + G4double fEdep = 0.; G4ThreeVector fPos; G4RotationMatrix fRot; }; -using B5HadCalorimeterHitsCollection = G4THitsCollection; +using HadCalorimeterHitsCollection = G4THitsCollection; -extern G4ThreadLocal G4Allocator* B5HadCalorimeterHitAllocator; +extern G4ThreadLocal G4Allocator* HadCalorimeterHitAllocator; -inline void* B5HadCalorimeterHit::operator new(size_t) +inline void* HadCalorimeterHit::operator new(size_t) { - if (!B5HadCalorimeterHitAllocator) { - B5HadCalorimeterHitAllocator = new G4Allocator; + if (!HadCalorimeterHitAllocator) { + HadCalorimeterHitAllocator = new G4Allocator; } - return (void*)B5HadCalorimeterHitAllocator->MallocSingle(); + return (void*)HadCalorimeterHitAllocator->MallocSingle(); } -inline void B5HadCalorimeterHit::operator delete(void* aHit) +inline void HadCalorimeterHit::operator delete(void* aHit) { - B5HadCalorimeterHitAllocator->FreeSingle((B5HadCalorimeterHit*) aHit); + HadCalorimeterHitAllocator->FreeSingle((HadCalorimeterHit*) aHit); +} + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B5/include/B5HadCalorimeterSD.hh b/examples/basic/B5/include/HadCalorimeterSD.hh similarity index 80% rename from examples/basic/B5/include/B5HadCalorimeterSD.hh rename to examples/basic/B5/include/HadCalorimeterSD.hh index 171b7da32a..161db6b2de 100644 --- a/examples/basic/B5/include/B5HadCalorimeterSD.hh +++ b/examples/basic/B5/include/HadCalorimeterSD.hh @@ -24,36 +24,41 @@ // ******************************************************************** // // -/// \file B5HadCalorimeterSD.hh -/// \brief Definition of the B5HadCalorimeterSD class +/// \file HadCalorimeterSD.hh +/// \brief Definition of the B5::HadCalorimeterSD class #ifndef B5HadCalorimeterSD_h #define B5HadCalorimeterSD_h 1 #include "G4VSensitiveDetector.hh" -#include "B5HadCalorimeterHit.hh" +#include "HadCalorimeterHit.hh" class G4Step; class G4HCofThisEvent; class G4TouchableHistory; +namespace B5 +{ + /// Hadron calorimeter sensitive detector -class B5HadCalorimeterSD : public G4VSensitiveDetector +class HadCalorimeterSD : public G4VSensitiveDetector { public: - B5HadCalorimeterSD(G4String name); - virtual ~B5HadCalorimeterSD(); + HadCalorimeterSD(G4String name); + ~HadCalorimeterSD() override; - virtual void Initialize(G4HCofThisEvent*HCE); - virtual G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*ROhist); + void Initialize(G4HCofThisEvent*HCE) override; + G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*ROhist) override; private: - B5HadCalorimeterHitsCollection* fHitsCollection; - G4int fHCID; + HadCalorimeterHitsCollection* fHitsCollection = nullptr; + G4int fHCID = -1; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/include/B5HodoscopeHit.hh b/examples/basic/B5/include/HodoscopeHit.hh similarity index 72% rename from examples/basic/B5/include/B5HodoscopeHit.hh rename to examples/basic/B5/include/HodoscopeHit.hh index e1b6bdb470..5391870be2 100644 --- a/examples/basic/B5/include/B5HodoscopeHit.hh +++ b/examples/basic/B5/include/HodoscopeHit.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B5HodoscopeHit.hh -/// \brief Definition of the B5HodoscopeHit class +/// \file HodoscopeHit.hh +/// \brief Definition of the B5::HodoscopeHit class #ifndef B5HodoscopeHit_h #define B5HodoscopeHit_h 1 @@ -41,6 +41,9 @@ class G4AttDef; class G4AttValue; +namespace B5 +{ + /// Hodoscope hit /// /// It records: @@ -48,23 +51,23 @@ class G4AttValue; /// - the particle time /// - the strip logical volume, its position and rotation -class B5HodoscopeHit : public G4VHit +class HodoscopeHit : public G4VHit { public: - B5HodoscopeHit(G4int i,G4double t); - B5HodoscopeHit(const B5HodoscopeHit &right); - virtual ~B5HodoscopeHit(); + HodoscopeHit(G4int i,G4double t); + HodoscopeHit(const HodoscopeHit &right) = default; + ~HodoscopeHit() override; - const B5HodoscopeHit& operator=(const B5HodoscopeHit &right); - G4bool operator==(const B5HodoscopeHit &right) const; + HodoscopeHit& operator=(const HodoscopeHit &right) = default; + G4bool operator==(const HodoscopeHit &right) const; inline void *operator new(size_t); inline void operator delete(void*aHit); - void Draw(); - virtual const std::map* GetAttDefs() const; - virtual std::vector* CreateAttValues() const; - void Print(); + void Draw() override; + const std::map* GetAttDefs() const override; + std::vector* CreateAttValues() const override; + void Print() override; G4int GetID() const { return fId; } @@ -81,28 +84,30 @@ class B5HodoscopeHit : public G4VHit const G4LogicalVolume* GetLogV() const { return fPLogV; } private: - G4int fId; - G4double fTime; + G4int fId = -1; + G4double fTime = 0.; G4ThreeVector fPos; G4RotationMatrix fRot; - const G4LogicalVolume* fPLogV; + const G4LogicalVolume* fPLogV = nullptr; }; -using B5HodoscopeHitsCollection = G4THitsCollection; +using HodoscopeHitsCollection = G4THitsCollection; -extern G4ThreadLocal G4Allocator* B5HodoscopeHitAllocator; +extern G4ThreadLocal G4Allocator* HodoscopeHitAllocator; -inline void* B5HodoscopeHit::operator new(size_t) +inline void* HodoscopeHit::operator new(size_t) { - if (!B5HodoscopeHitAllocator) { - B5HodoscopeHitAllocator = new G4Allocator; + if (!HodoscopeHitAllocator) { + HodoscopeHitAllocator = new G4Allocator; } - return (void*)B5HodoscopeHitAllocator->MallocSingle(); + return (void*)HodoscopeHitAllocator->MallocSingle(); } -inline void B5HodoscopeHit::operator delete(void*aHit) +inline void HodoscopeHit::operator delete(void*aHit) { - B5HodoscopeHitAllocator->FreeSingle((B5HodoscopeHit*) aHit); + HodoscopeHitAllocator->FreeSingle((HodoscopeHit*) aHit); +} + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/basic/B5/include/B5HodoscopeSD.hh b/examples/basic/B5/include/HodoscopeSD.hh similarity index 81% rename from examples/basic/B5/include/B5HodoscopeSD.hh rename to examples/basic/B5/include/HodoscopeSD.hh index 32d4410613..093b3482d6 100644 --- a/examples/basic/B5/include/B5HodoscopeSD.hh +++ b/examples/basic/B5/include/HodoscopeSD.hh @@ -24,35 +24,40 @@ // ******************************************************************** // // -/// \file B5HodoscopeSD.hh -/// \brief Definition of the B5HodoscopeSD class +/// \file HodoscopeSD.hh +/// \brief Definition of the B5::HodoscopeSD class #ifndef B5HodoscopeSD_h #define B5HodoscopeSD_h 1 #include "G4VSensitiveDetector.hh" -#include "B5HodoscopeHit.hh" +#include "HodoscopeHit.hh" class G4Step; class G4HCofThisEvent; class G4TouchableHistory; +namespace B5 +{ + /// Hodoscope sensitive detector -class B5HodoscopeSD : public G4VSensitiveDetector +class HodoscopeSD : public G4VSensitiveDetector { public: - B5HodoscopeSD(G4String name); - virtual ~B5HodoscopeSD(); + HodoscopeSD(G4String name); + ~HodoscopeSD() override; - virtual void Initialize(G4HCofThisEvent*HCE); - virtual G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*ROhist); + void Initialize(G4HCofThisEvent*HCE) override; + G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*ROhist) override; private: - B5HodoscopeHitsCollection* fHitsCollection; - G4int fHCID; + HodoscopeHitsCollection* fHitsCollection = nullptr; + G4int fHCID = -1; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/include/B5MagneticField.hh b/examples/basic/B5/include/MagneticField.hh similarity index 83% rename from examples/basic/B5/include/B5MagneticField.hh rename to examples/basic/B5/include/MagneticField.hh index 410f4d4ce4..e0f1d4c7aa 100644 --- a/examples/basic/B5/include/B5MagneticField.hh +++ b/examples/basic/B5/include/MagneticField.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B5MagneticField.hh -/// \brief Definition of the B5MagneticField class +/// \file MagneticField.hh +/// \brief Definition of the B5::MagneticField class #ifndef B5MagneticField_H #define B5MagneticField_H 1 @@ -33,17 +33,22 @@ #include "globals.hh" #include "G4MagneticField.hh" +#include + class G4GenericMessenger; +namespace B5 +{ + /// Magnetic field -class B5MagneticField : public G4MagneticField +class MagneticField : public G4MagneticField { public: - B5MagneticField(); - virtual ~B5MagneticField(); + MagneticField(); + ~MagneticField() override; - virtual void GetFieldValue(const G4double point[4],double* bField ) const; + void GetFieldValue(const G4double point[4],double* bField ) const override; void SetField(G4double val) { fBy = val; } G4double GetField() const { return fBy; } @@ -51,10 +56,12 @@ class B5MagneticField : public G4MagneticField private: void DefineCommands(); - G4GenericMessenger* fMessenger; - G4double fBy; + G4GenericMessenger* fMessenger = nullptr; + G4double fBy = 1.0*CLHEP::tesla; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/include/B5PrimaryGeneratorAction.hh b/examples/basic/B5/include/PrimaryGeneratorAction.hh similarity index 77% rename from examples/basic/B5/include/B5PrimaryGeneratorAction.hh rename to examples/basic/B5/include/PrimaryGeneratorAction.hh index 4c8ce9d47a..aeb5529fe1 100644 --- a/examples/basic/B5/include/B5PrimaryGeneratorAction.hh +++ b/examples/basic/B5/include/PrimaryGeneratorAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B5PrimaryGeneratorAction.hh -/// \brief Definition of the B5PrimaryGeneratorAction class +/// \file PrimaryGeneratorAction.hh +/// \brief Definition of the B5::PrimaryGeneratorAction class #ifndef B5PrimaryGeneratorAction_h #define B5PrimaryGeneratorAction_h 1 @@ -33,11 +33,16 @@ #include "G4VUserPrimaryGeneratorAction.hh" #include "globals.hh" +#include + class G4ParticleGun; class G4GenericMessenger; class G4Event; class G4ParticleDefinition; +namespace B5 +{ + /// Primary generator /// /// A single particle is generated. @@ -47,13 +52,13 @@ class G4ParticleDefinition; /// - random selection of a particle type from proton, kaon+, pi+, muon+, e+ -class B5PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: - B5PrimaryGeneratorAction(); - virtual ~B5PrimaryGeneratorAction(); + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event*); + void GeneratePrimaries(G4Event*) override; void SetMomentum(G4double val) { fMomentum = val; } G4double GetMomentum() const { return fMomentum; } @@ -70,19 +75,21 @@ class B5PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction private: void DefineCommands(); - G4ParticleGun* fParticleGun; - G4GenericMessenger* fMessenger; - G4ParticleDefinition* fPositron; - G4ParticleDefinition* fMuon; - G4ParticleDefinition* fPion; - G4ParticleDefinition* fKaon; - G4ParticleDefinition* fProton; - G4double fMomentum; - G4double fSigmaMomentum; - G4double fSigmaAngle; - G4bool fRandomizePrimary; + G4ParticleGun* fParticleGun = nullptr; + G4GenericMessenger* fMessenger = nullptr; + G4ParticleDefinition* fPositron = nullptr; + G4ParticleDefinition* fMuon = nullptr; + G4ParticleDefinition* fPion = nullptr; + G4ParticleDefinition* fKaon = nullptr; + G4ParticleDefinition* fProton = nullptr; + G4double fMomentum = 1000. * CLHEP::MeV; + G4double fSigmaMomentum = 50. * CLHEP::MeV; + G4double fSigmaAngle = 2. * CLHEP::deg; + G4bool fRandomizePrimary = true; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/include/B5RunAction.hh b/examples/basic/B5/include/RunAction.hh similarity index 84% rename from examples/basic/B5/include/B5RunAction.hh rename to examples/basic/B5/include/RunAction.hh index 714333f749..933d0222c1 100644 --- a/examples/basic/B5/include/B5RunAction.hh +++ b/examples/basic/B5/include/RunAction.hh @@ -24,8 +24,8 @@ // ******************************************************************** // // -/// \file B5RunAction.hh -/// \brief Definition of the B5RunAction class +/// \file RunAction.hh +/// \brief Definition of the B5::RunAction class #ifndef B5RunAction_h #define B5RunAction_h 1 @@ -33,25 +33,30 @@ #include "G4UserRunAction.hh" #include "globals.hh" -class B5EventAction; - class G4Run; +namespace B5 +{ + +class EventAction; + /// Run action class -class B5RunAction : public G4UserRunAction +class RunAction : public G4UserRunAction { public: - B5RunAction(B5EventAction* eventAction); - virtual ~B5RunAction(); + RunAction(EventAction* eventAction); + ~RunAction() override; - virtual void BeginOfRunAction(const G4Run*); - virtual void EndOfRunAction(const G4Run*); + void BeginOfRunAction(const G4Run*) override; + void EndOfRunAction(const G4Run*) override; private: - B5EventAction* fEventAction; + EventAction* fEventAction = nullptr; }; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/basic/B5/plotter.mac b/examples/basic/B5/plotter.mac new file mode 100644 index 0000000000..7eb3d93a04 --- /dev/null +++ b/examples/basic/B5/plotter.mac @@ -0,0 +1,211 @@ +# +# Use with a TSG vis driver. +# Activate with: +# /control/execute plotter.mac +# /run/beamOn 10 # it will update the plotter regions at end of run. +# + +#/vis/verbose errors +#/vis/verbose confirmations + +#/////////////////////////////////////////////////////////////////////// +#/// activate the TSG vis driver: ////////////////////////////////////// +#/////////////////////////////////////////////////////////////////////// +/vis/sceneHandler/create TSG scene-handler-plotter + +#/////////////////////////////////////////////////////////////////////// +#/// viewer: /////////////////////////////////////////////////////////// +#/////////////////////////////////////////////////////////////////////// +/vis/viewer/create scene-handler-plotter viewer-plotter 600x600-0+0 + +/vis/viewer/set/background 1 1 1 +/vis/viewer/zoomTo 1 +/vis/viewer/set/viewpointVector 0 0 1 + +#/////////////////////////////////////////////////////////////////////// +#/// scene: //////////////////////////////////////////////////////////// +#/////////////////////////////////////////////////////////////////////// +/vis/plotter/create plotter-0 + +/vis/scene/create scene-plotter +/vis/scene/add/plotter plotter-0 +/vis/sceneHandler/attach scene-plotter + +#/////////////////////////////////////////////////////////////////////// +#/// create plotter regions and attach histograms to them: ///////////// +#/////////////////////////////////////////////////////////////////////// +/vis/plotter/setLayout plotter-0 2 2 # create 2x2 plotting regions. + +# B5 specific: +/vis/plotter/add/h1 0 plotter-0 0 +/vis/plotter/add/h1 1 plotter-0 1 +/vis/plotter/add/h2 0 plotter-0 2 +/vis/plotter/add/h2 1 plotter-0 3 + +#/////////////////////////////////////////////////////////////////////// +#/// plotters customisation: /////////////////////////////////////////// +#/////////////////////////////////////////////////////////////////////// + +# For texts, as titles and axis labels, the good old Hershey vectorial font is used +# by default, but you can also specify a freetype font To use a freetype font, you +# must build Geant4 by specifying -DGEANT4_USE_FREETYPE=ON yin your cmake flags. +# (The ROOT_default and hippodraw styles (see below) uses freetype fonts). +# Two embedded ttf fonts comes with the ToolsSG plotting: roboto_bold (some open source +# kind of the Microsoft arialbd) and lato_regular (close to an helvetica). +# You can use your own .ttf files by using the TOOLS_FONT_PATH environment variable +# to specify the directory where they could be found. + +#/////////////////////////////////////////////////////////////////////// +#/// using styles: ///////////////////////////////////////////////////// +#/////////////////////////////////////////////////////////////////////// +/vis/plotter/style/list + +/vis/plotter/addStyle plotter-0 reset + +# +# The below lines show how to customise a plotter by using an embedded style +# (for example ROOT_default, hippodraw, default) or a style defined with commands. +# The description of the embedded styles can be seen in Geant4 source code at: +# source/externals/g4tools/include/tools/sg/plotter_some_styles +# +# A style can be applied on all regions by using: +# /vis/plotter/addStyle - -

      MPI/Examples : exMPI01

      - -

      Description

      - -

      A simple application

      - -

      Configuration:

      - -
        -
      • Geometry : chamber / calorimeter
      • -
      • Primary : particle gun (200 MeV electron as default)
      • -
      • Physics List : FTFP_BERT
      • -
      - -

      Features:

      - -
        -
      • Particles are transported in a geometry without any scoring.
      • -
      • Learn how to parallelized your G4 session.
      • -
      - -

      How to build

      - -

      Use CMake on Geant4 library installed with CMake build.

      - -

      This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md)

      - -

      Follow these commands,

      - - -
      > mkdir build
      -> cd build
      -> cmake -DG4mpi_DIR=<where-G4mpi-wasintalled >/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \
      -     -DGeant4_DIR=<your Geant4 install path
      ->/lib[64]/Geant4-V.m.n <path-to-source><
      -      (V.m.n is the version of Geant4, eg. Geant4-9.6.0)
      -> make<
      -> make install
      -
      - - - \ No newline at end of file diff --git a/examples/extended/parallel/MPI/examples/exMPI01/README.md b/examples/extended/parallel/MPI/examples/exMPI01/README.md deleted file mode 100644 index b0f3cd261c..0000000000 --- a/examples/extended/parallel/MPI/examples/exMPI01/README.md +++ /dev/null @@ -1,37 +0,0 @@ -MPI/Examples : exMPI01 -====================== - -Description ------------ -A simple application - -### Configuration: - -- Geometry : chamber / calorimeter -- Primary : particle gun (200 MeV electron as default) -- Physics List : FTFP_BERT - -### Features: - -- Particles are transported in a geometry without any scoring. -- Learn how to parallelized your G4 session. - - -How to build ------------- -Use CMake on Geant4 library installed with CMake build. - -This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md) - -Follow these commands, - - > mkdir build - > cd build - > cmake -DG4mpi_DIR=/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \ - -DGeant4_DIR=/lib[64]/Geant4-V.m.n - (V.m.n is the version of Geant4, eg. Geant4-9.6.0) - > make - > make install - -Replace mpicxx with your MPI-compiler wrapper. diff --git a/examples/extended/parallel/MPI/examples/exMPI02/.README.txt b/examples/extended/parallel/MPI/examples/exMPI02/.README.txt deleted file mode 100644 index 5ec7ee61e8..0000000000 --- a/examples/extended/parallel/MPI/examples/exMPI02/.README.txt +++ /dev/null @@ -1,50 +0,0 @@ -/// @file "MPI/examples/exMPI02/.README.txt" -/// @brief Example exMPI02 README - -/*! \page exMPI02 Example : exMPI02 - - -Description -=========== -An example of dosimetry in a water phantom. - -### Configuration: -- Geometry : water phantom -- Primary : broad beam (200 MeV proton) -- Physics List : FTFP_BERT -- Analysis : ROOT histogramming - -The environment variables, *G4LEDATA*, *G4LEVELGAMMADATA* and *G4SAIDXSDATA* -are required for data files. - -The enviromnet variable, *ROOTSYS*, is set to the root path of the ROOT package. - -### Features: -- Score dose distribution in a water phantom. -- Learn how to paralleized your applications. -- Create a ROOT file containing histograms/trees in each node. - Each slave node generate a ROOT file, whose file name is different - from each other. - -- - - - -How to build -============ -Use CMake on Geant4 library installed with CMake build. - -This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md) - -Follow these commands, - - > mkdir build - > cd build - > cmake -DG4mpi_DIR=/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \ - -DGeant4_DIR=/lib[64]/Geant4-V.m.n - (V.m.n is the version of Geant4, eg. Geant4-9.6.0) - > make - > make install - -Replace mpicxx with your MPI-compiler wrapper. - -*/ diff --git a/examples/extended/parallel/MPI/examples/exMPI02/CMakeLists.txt b/examples/extended/parallel/MPI/examples/exMPI02/CMakeLists.txt index 9019b3b712..efa6ea1e6c 100644 --- a/examples/extended/parallel/MPI/examples/exMPI02/CMakeLists.txt +++ b/examples/extended/parallel/MPI/examples/exMPI02/CMakeLists.txt @@ -2,7 +2,7 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(exMPI02) #------------------------------------------------------------------------------ diff --git a/examples/extended/parallel/MPI/examples/exMPI02/README.html b/examples/extended/parallel/MPI/examples/exMPI02/README.html deleted file mode 100644 index 7ae30e0b7a..0000000000 --- a/examples/extended/parallel/MPI/examples/exMPI02/README.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - -

      MPI/Examples : exMPI02

      - -

      Description

      - -

      An example of dosimetry in a water phantom.

      - -

      Configuration:

      - -
        -
      • Geometry : water phantom
      • -
      • Primary : broad beam (200 MeV proton)
      • -
      • Physics List : FTFP_BERT
      • -
      • Analysis : ROOT histogramming
      • -
      - -

      The environment variables, G4LEDATA, G4LEVELGAMMADATA and G4SAIDXSDATA -are required for data files.

      - -

      The enviromnet variable, ROOTSYS, is set to the root path of the ROOT package.

      - -

      Features:

      - -
        -
      • Score dose distribution in a water phantom.
      • -
      • Learn how to paralleized your applications.
      • -
      • Create a ROOT file containing histograms/trees in each node. -Each slave node generate a ROOT file, whose file name is different -from each other.
      • -
      - -

      How to build

      - -

      Use CMake on Geant4 library installed with CMake build.

      - -

      This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md)

      - -

      Follow these commands,

      - - -
      > mkdir build
      -> cd build
      -> cmake -DG4mpi_DIR=<where-G4mpi-wasintalled >/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \
      -     -DGeant4_DIR=<your Geant4 install path
      ->/lib[64]/Geant4-V.m.n <path-to-source><
      -      (V.m.n is the version of Geant4, eg. Geant4-9.6.0)
      -> make<
      -> make install
      -
      - - - - \ No newline at end of file diff --git a/examples/extended/parallel/MPI/examples/exMPI02/README.md b/examples/extended/parallel/MPI/examples/exMPI02/README.md deleted file mode 100644 index 535b7935c7..0000000000 --- a/examples/extended/parallel/MPI/examples/exMPI02/README.md +++ /dev/null @@ -1,44 +0,0 @@ -MPI/Examples : exMPI02 -====================== - -Description ------------ -An example of dosimetry in a water phantom. - -### Configuration: -- Geometry : water phantom -- Primary : broad beam (200 MeV proton) -- Physics List : FTFP_BERT -- Analysis : ROOT histogramming - -The environment variables, *G4LEDATA*, *G4LEVELGAMMADATA* and *G4SAIDXSDATA* -are required for data files. - -The enviromnet variable, *ROOTSYS*, is set to the root path of the ROOT package. - -### Features: -- Score dose distribution in a water phantom. -- Learn how to paralleized your applications. -- Create a ROOT file containing histograms/trees in each node. - Each slave node generate a ROOT file, whose file name is different - from each other. - - -How to build ------------- -Use CMake on Geant4 library installed with CMake build. - -This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md) - -Follow these commands, - - > mkdir build - > cd build - > cmake -DG4mpi_DIR=/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \ - -DGeant4_DIR=/lib[64]/Geant4-V.m.n - (V.m.n is the version of Geant4, eg. Geant4-9.6.0) - > make - > make install - -Replace mpicxx with your MPI-compiler wrapper. diff --git a/examples/extended/parallel/MPI/examples/exMPI03/.README.txt b/examples/extended/parallel/MPI/examples/exMPI03/.README.txt deleted file mode 100644 index c128ea26e6..0000000000 --- a/examples/extended/parallel/MPI/examples/exMPI03/.README.txt +++ /dev/null @@ -1,59 +0,0 @@ -/// @file "MPI/examples/exMPI03/.README.txt" -/// @brief Example exMPI03 README - -/*! \page exMPI03 Example : exMPI03 - - -Description -=========== -An example of dosimetry in a water phantom. -The example has same geometry and physics as exMPI02, only the analysis part -is diffenrent. - -### Configuration: -- Geometry : water phantom -- Primary : broad beam (200 MeV proton) -- Physics List : FTFP_BERT -- Analysis : g4tools histogramming - -The environment variables, *G4LEDATA*, *G4LEVELGAMMADATA* and *G4SAIDXSDATA* -are required for data files. - -### Features: -- Score dose distribution in a water phantom. -- Learn how to paralleized your applications. -- Create a ROOT file containing histograms/trees in each node. - Each slave node generate a ROOT file, whose file name is different - from each other. -- MT is enabled. -- One of each object supported by g4tools is instantiated: 1D, 2D and 3D - histograms and 1D and 2D profiles. -- Histograms and profiles are merged first among threads of the same - MPI-rank and then across MPI-ranks. See RunActionMaster class for - an example on how to use the mergers. -- G4Run object and scorers (command line ones) are also merged via - MPI. -- Output: several root files are created: dose-rank*.root thread-merged - histograms for each rank; dose-merged.root, merged across threads and - across ranks. - -How to build -============ -Use CMake on Geant4 library installed with CMake build. - -This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md) - -Follow these commands, - - > mkdir build - > cd build - > cmake -DG4mpi_DIR=/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \ - -DGeant4_DIR=/lib[64]/Geant4-V.m.n - (V.m.n is the version of Geant4, eg. Geant4-9.6.0) - > make - > make install - -Replace mpicxx with your MPI-compiler wrapper. - -*/ diff --git a/examples/extended/parallel/MPI/examples/exMPI03/CMakeLists.txt b/examples/extended/parallel/MPI/examples/exMPI03/CMakeLists.txt index e78b173758..99f345a1b9 100644 --- a/examples/extended/parallel/MPI/examples/exMPI03/CMakeLists.txt +++ b/examples/extended/parallel/MPI/examples/exMPI03/CMakeLists.txt @@ -2,7 +2,7 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(exMPI03) #------------------------------------------------------------------------------ diff --git a/examples/extended/parallel/MPI/examples/exMPI03/README.html b/examples/extended/parallel/MPI/examples/exMPI03/README.html deleted file mode 100644 index 8cfda85d69..0000000000 --- a/examples/extended/parallel/MPI/examples/exMPI03/README.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - - -

      MPI/Examples : exMPI03

      - -

      Description

      - -

      An example of dosimetry in a water phantom.

      - -

      Configuration:

      - -
        -
      • Geometry : water phantom
      • -
      • Primary : broad beam (200 MeV proton)
      • -
      • Physics List : FTFP_BERT
      • -
      • Analysis : g4tools histogramming
      • -
      - -

      The environment variables, G4LEDATA, G4LEVELGAMMADATA and G4SAIDXSDATA -are required for data files.

      - -

      Features:

      - -
        -
      • Score dose distribution in a water phantom.
      • -
      • Learn how to paralleized your applications.
      • -
      • Create a ROOT file containing histograms/trees in each node. -Each slave node generate a ROOT file, whose file name is different -from each other.
      • -
      • MT is enabled.
      • -
      • One of each object supported by g4tools is instantiated: 1D, 2D and 3D - histograms and 1D and 2D profiles.
      • -
      • Histograms and profiles are merged first among threads of the same - MPI-rank and then across MPI-ranks. See RunActionMaster class for - an example on how to use the mergers.
      • -
      • G4Run object and scorers (command line ones) are also merged via - MPI.
      • -
      • Output: several root files are created: dose-rank*.root thread-merged - histograms for each rank; dose-merged.root, merged across threads and - across ranks.
      • -
      - -

      How to build

      - -

      Use CMake on Geant4 library installed with CMake build.

      - -

      This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md)

      - -

      Follow these commands,

      - - -
      > mkdir build
      -> cd build
      -> cmake -DG4mpi_DIR=<where-G4mpi-wasintalled >/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \
      -     -DGeant4_DIR=<your Geant4 install path
      ->/lib[64]/Geant4-V.m.n <path-to-source><
      -      (V.m.n is the version of Geant4, eg. Geant4-9.6.0)
      -> make<
      -> make install
      -
      - - - - diff --git a/examples/extended/parallel/MPI/examples/exMPI03/README.md b/examples/extended/parallel/MPI/examples/exMPI03/README.md deleted file mode 100644 index e8867a9cb6..0000000000 --- a/examples/extended/parallel/MPI/examples/exMPI03/README.md +++ /dev/null @@ -1,54 +0,0 @@ -MPI/Examples : exMPI03 -====================== - -Description ------------ -An example of dosimetry in a water phantom. -The example has same geometry and physics as exMPI02, only the analysis part -is different. - -### Configuration: -- Geometry : water phantom -- Primary : broad beam (200 MeV proton) -- Physics List : FTFP_BERT -- Analysis : g4tools histogramming - -The environment variables, *G4LEDATA*, *G4LEVELGAMMADATA* and *G4SAIDXSDATA* -are required for data files. - -### Features: -- Score dose distribution in a water phantom. -- Learn how to paralleized your applications. -- Create a ROOT file containing histograms/trees in each node. - Each slave node generate a ROOT file, whose file name is different - from each other. -- MT is enabled. -- One of each object supported by g4tools is instantiated: 1D, 2D and 3D - histograms and 1D and 2D profiles. -- Histograms and profiles are merged first among threads of the same - MPI-rank and then across MPI-ranks. See RunActionMaster class for - an example on how to use the mergers. -- G4Run object and scorers (command line ones) are also merged via - MPI. -- Output: several root files are created: dose-rank*.root thread-merged - histograms for each rank; dose-merged.root, merged across threads and - across ranks. - -How to build ------------- -Use CMake on Geant4 library installed with CMake build. - -This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md) - -Follow these commands, - - > mkdir build - > cd build - > cmake -DG4mpi_DIR=/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \ - -DGeant4_DIR=/lib[64]/Geant4-V.m.n - (V.m.n is the version of Geant4, eg. Geant4-9.6.0) - > make - > make install - -Replace mpicxx with your MPI-compiler wrapper. diff --git a/examples/extended/parallel/MPI/examples/exMPI03/src/Analysis.cc b/examples/extended/parallel/MPI/examples/exMPI03/src/Analysis.cc index 30353a271b..72d21b45e2 100644 --- a/examples/extended/parallel/MPI/examples/exMPI03/src/Analysis.cc +++ b/examples/extended/parallel/MPI/examples/exMPI03/src/Analysis.cc @@ -27,16 +27,12 @@ /// @file Analysis.cc /// @brief Define histograms -//#include "TFile.h" -//#include "TH1.h" -//#include "TH2.h" -//#include "TROOT.h" #include "G4AutoDelete.hh" #include "G4SystemOfUnits.hh" +#include "G4AnalysisManager.hh" #include "Analysis.hh" //Select format of output here -#include "g4root.hh" G4ThreadLocal G4int Analysis::fincidentFlag = false; G4ThreadLocal Analysis* the_analysis = 0; @@ -64,7 +60,8 @@ void Analysis::Book() { G4AnalysisManager* mgr = G4AnalysisManager::Instance(); - //mgr->SetVerboseLevel(1); + mgr->SetDefaultFileType("root"); + mgr->SetVerboseLevel(1); fincident_x_hist = mgr->CreateH1("incident_x", "Incident X", 100, -5 * cm, 5 * cm, "cm"); fincident_map = mgr->CreateH2("incident_map", "Incident Map", 50, -5 * cm, diff --git a/examples/extended/parallel/MPI/examples/exMPI03/src/RunActionMaster.cc b/examples/extended/parallel/MPI/examples/exMPI03/src/RunActionMaster.cc index 9d555590f5..1a4adc2e26 100644 --- a/examples/extended/parallel/MPI/examples/exMPI03/src/RunActionMaster.cc +++ b/examples/extended/parallel/MPI/examples/exMPI03/src/RunActionMaster.cc @@ -32,7 +32,7 @@ #include "G4Threading.hh" #include "Analysis.hh" #include "RunActionMaster.hh" -#include "g4root.hh" //ROOT Format for output +#include "G4AnalysisManager.hh" #include "RunMerger.hh" #include "G4MPIscorerMerger.hh" #include "G4MPIhistoMerger.hh" // New code with use of g4analysis @@ -59,7 +59,7 @@ void RunActionMaster::BeginOfRunAction(const G4Run*) { Analysis* myana = Analysis::GetAnalysis(); - myana-> Clear(); + myana->Clear(); myana->Book(); } @@ -186,21 +186,20 @@ RunActionMaster::EndOfRunAction(const G4Run* arun) //NB: It is important that the save is done *after* MPI-merging of histograms //One can save all ranks or just rank0, chane the if - if (true /*rank == 0*/) - { - std::ostringstream fname; - fname<<"dose-rank"< Save(fname.str()); + if (true /*rank == 0*/) { + std::ostringstream fname; + fname<<"dose-rank"< Close(); + myana-> Save(fname.str()); + } + Analysis* myana = Analysis::GetAnalysis(); + myana-> Close(); - G4cout << "===================================================" << G4endl; - G4cout << "End EndOfRunAction for master thread in rank: " << rank << G4endl; - G4cout << "===================================================" << G4endl; + G4cout << "===================================================" << G4endl; + G4cout << "End EndOfRunAction for master thread in rank: " << rank << G4endl; + G4cout << "===================================================" << G4endl; } diff --git a/examples/extended/parallel/MPI/examples/exMPI04/.README.txt b/examples/extended/parallel/MPI/examples/exMPI04/.README.txt deleted file mode 100644 index b3e55b17d0..0000000000 --- a/examples/extended/parallel/MPI/examples/exMPI04/.README.txt +++ /dev/null @@ -1,58 +0,0 @@ -/// @file "MPI/examples/exMPI04/.README.txt" -/// @brief Example exMPI04 README - -/*! \page exMPI04 Example : exMPI04 - - -Description -=========== -An example of dosimetry in a water phantom. -The example is as exMPI03, but adds output in G4analysis ntuple -and demonstrates ntuple merging. - -In difference from merging other data (G4Run, scorers, hitograms), -the ntuple data are not sent to the collecting rank(s) at the -end of run but during event processing. That's why (an) extra rank(s) -have to be reserved for this purpose. The number of extra workers requested -is set in G4MPImanager constructor in main(). While G4MPImanager -can be created with any number of extra workers (< total number), -the ntuple merging is at present supported only for one. - -The extra worker is connected to the run action class via G4MPIextraWorker -object which is set to G4MPImanager in main(). -The standard calls to G4AnalysisManager (creating ntuple, open, write and -close file) trigger creating all necessary analysis tools object -for merging ntuple data on flight. - -MPI ntuple merging can be activated in sequential mode only; -this activation is perfomed by creating the G4MPIntupleMerger -object in the RunActionMaster constructor. -The merger must be created before creating G4AnalysisManager -(= the first call to G4AnalysisManager::Instance()) -and deleted only at the end of program. - -If multithreading mode is enabled, the ntuples are merged from -threads to files per ranks. -Combined MT + MPI merging is not yet supported. -Merging ntuples is actually supported only with Root output format. - -How to build -============ -Use CMake on Geant4 library installed with CMake build. - -This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md) - -Follow these commands, - - > mkdir build - > cd build - > cmake -DG4mpi_DIR=/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \ - -DGeant4_DIR=/lib[64]/Geant4-V.m.n - (V.m.n is the version of Geant4, eg. Geant4-9.6.0) - > make - > make install - -Replace mpicxx with your MPI-compiler wrapper. - -*/ diff --git a/examples/extended/parallel/MPI/examples/exMPI04/CMakeLists.txt b/examples/extended/parallel/MPI/examples/exMPI04/CMakeLists.txt index fd4caf2239..1286f8358c 100644 --- a/examples/extended/parallel/MPI/examples/exMPI04/CMakeLists.txt +++ b/examples/extended/parallel/MPI/examples/exMPI04/CMakeLists.txt @@ -2,7 +2,7 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(exMPI04) #------------------------------------------------------------------------------ diff --git a/examples/extended/parallel/MPI/examples/exMPI04/README.md b/examples/extended/parallel/MPI/examples/exMPI04/README.md deleted file mode 100644 index 96ba27a1a4..0000000000 --- a/examples/extended/parallel/MPI/examples/exMPI04/README.md +++ /dev/null @@ -1,53 +0,0 @@ -MPI/Examples : exMPI04 -====================== - -Description ------------ -An example of dosimetry in a water phantom. -The example is as exMPI03, but adds output in G4analysis ntuple -and demonstrates ntuple merging. - -In difference from merging other data (G4Run, scorers, hitograms), -the ntuple data are not sent to the collecting rank(s) at the -end of run but during event processing. That's why (an) extra rank(s) -have to be reserved for this purpose. The number of extra workers requested -is set in G4MPImanager constructor in main(). While G4MPImanager -can be created with any number of extra workers (< total number), -the ntuple merging is at present supported only for one. - -The extra worker is connected to the run action class via G4MPIextraWorker -object which is set to G4MPImanager in main(). -The standard calls to G4AnalysisManager (creating ntuple, open, write and -close file) trigger creating all necessary analysis tools object -for merging ntuple data on flight. - -MPI ntuple merging can be activated in sequential mode only; -this activation is perfomed by creating the G4MPIntupleMerger -object in the RunActionMaster constructor. -The merger must be created before creating G4AnalysisManager -(= the first call to G4AnalysisManager::Instance()) -and deleted only at the end of program. - -If multithreading mode is enabled, the ntuples are merged from -threads to files per ranks. -Combined MT + MPI merging is not yet supported. -Merging ntuples is actually supported only with Root output format. - -How to build ------------- -Use CMake on Geant4 library installed with CMake build. - -This example requires G4mpi library to be installed -(see examples/extended/parallel/MPI/source/REDME.md) - -Follow these commands, - - > mkdir build - > cd build - > cmake -DG4mpi_DIR=/lib[64]/G4mpi -DCMAKE_CXX_COMPILER=mpicxx \ - -DGeant4_DIR=/lib[64]/Geant4-V.m.n - (V.m.n is the version of Geant4, eg. Geant4-9.6.0) - > make - > make install - -Replace mpicxx with your MPI-compiler wrapper. diff --git a/examples/extended/parallel/MPI/examples/exMPI04/src/Analysis.cc b/examples/extended/parallel/MPI/examples/exMPI04/src/Analysis.cc index 51e03ef7ba..49b5e6568c 100644 --- a/examples/extended/parallel/MPI/examples/exMPI04/src/Analysis.cc +++ b/examples/extended/parallel/MPI/examples/exMPI04/src/Analysis.cc @@ -31,11 +31,14 @@ #include "G4SystemOfUnits.hh" #include "Analysis.hh" -//Select format of output here //Note: ntuple merging is supported only with Root format -#include "g4root.hh" +#ifndef G4MULTITHREADED +#include "G4RootMpiAnalysisManager.hh" +using G4AnalysisManager = G4RootMpiAnalysisManager; +#else #include "G4RootAnalysisManager.hh" - +using G4AnalysisManager = G4RootAnalysisManager; +#endif G4ThreadLocal G4int Analysis::fincidentFlag = false; G4ThreadLocal Analysis* the_analysis = 0; diff --git a/examples/extended/parallel/MPI/examples/exMPI04/src/RunActionMaster.cc b/examples/extended/parallel/MPI/examples/exMPI04/src/RunActionMaster.cc index 0852f5e219..7b4762775c 100644 --- a/examples/extended/parallel/MPI/examples/exMPI04/src/RunActionMaster.cc +++ b/examples/extended/parallel/MPI/examples/exMPI04/src/RunActionMaster.cc @@ -32,11 +32,18 @@ #include "G4Threading.hh" #include "Analysis.hh" #include "RunActionMaster.hh" -#include "g4root.hh" //ROOT Format for output #include "RunMerger.hh" +#ifndef G4MULTITHREADED +#include "G4RootMpiAnalysisManager.hh" +using G4AnalysisManager = G4RootMpiAnalysisManager; +#else +#include "G4RootAnalysisManager.hh" +using G4AnalysisManager = G4RootAnalysisManager; +#endif #include "G4MPIscorerMerger.hh" #include "G4MPIhistoMerger.hh" #include "G4MPIntupleMerger.hh" +#include "G4filesystem.hh" #include "Run.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -206,12 +213,14 @@ RunActionMaster::EndOfRunAction(const G4Run* arun) } //Save histograms *before* MPI merging for rank #0 - if (rank == 0) - { - Analysis* myana = Analysis::GetAnalysis(); - myana-> Save(); - myana-> Close(false); // close without resetting histograms - } + if (rank == 0) { + Analysis* myana = Analysis::GetAnalysis(); + myana-> Save(); + myana-> Close(false); // close without resetting histograms + // Rename file in another file + G4fs::rename("dose-rank0.root", "dose-rank0-part.root"); + } + //Merge of g4analysis objects G4cout << "Go to merge histograms " << G4endl; ver=1; @@ -220,20 +229,19 @@ RunActionMaster::EndOfRunAction(const G4Run* arun) hm.Merge(); G4cout << "Done merge histograms " << G4endl; } + else { + G4cout << "Skip merging on the extra worker" << G4endl; + } //Save g4analysis objects to a file - //NB: It is important that the save is done *after* MPI-merging of histograms + Analysis* myana = Analysis::GetAnalysis(); + myana-> Save(); + myana-> Close(); - //One can save all ranks or just rank0, chane the if - if (true /*rank == 0*/) - // if (rank == 0) - { - Analysis* myana = Analysis::GetAnalysis(); - if (rank == 0) { - myana->OpenFile("dose-merged"); - } - myana-> Save(); - myana-> Close(); + if (rank == 0) { + // Rename files + G4fs::rename("dose-rank0.root", "dose-merged.root"); + G4fs::rename("dose-rank0-part.root", "dose-rank0.root"); } G4cout << "===================================================" << G4endl; diff --git a/examples/extended/parallel/MPI/source/CMakeLists.txt b/examples/extended/parallel/MPI/source/CMakeLists.txt index f753866624..ab79b620cd 100644 --- a/examples/extended/parallel/MPI/source/CMakeLists.txt +++ b/examples/extended/parallel/MPI/source/CMakeLists.txt @@ -8,7 +8,7 @@ project(${_projname}) #------------------------------------------------------------------------------ #Manadatory dependencies -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) find_package(MPI REQUIRED) find_package(Geant4 10.2.0 REQUIRED) include(${Geant4_USE_FILE}) diff --git a/examples/extended/parallel/MPI/source/analysis/include/G4RootMpiAnalysisManager.hh b/examples/extended/parallel/MPI/source/analysis/include/G4RootMpiAnalysisManager.hh index 9ea7c8e4d7..c765bc3056 100644 --- a/examples/extended/parallel/MPI/source/analysis/include/G4RootMpiAnalysisManager.hh +++ b/examples/extended/parallel/MPI/source/analysis/include/G4RootMpiAnalysisManager.hh @@ -47,6 +47,9 @@ class G4RootMpiAnalysisManager : public G4RootAnalysisManager explicit G4RootMpiAnalysisManager(G4bool isMaster = true); virtual ~G4RootMpiAnalysisManager(); + // Static methods + static G4RootMpiAnalysisManager* Instance(); + // MPI void SetMpiNtupleMerging(tools::impi* impi, G4int mpiRank, G4int mpiSize, @@ -57,6 +60,10 @@ class G4RootMpiAnalysisManager : public G4RootAnalysisManager virtual G4bool OpenFileImpl(const G4String& fileName) final; virtual G4bool WriteImpl() final; virtual G4bool CloseFileImpl(G4bool reset) final; + + private: + // Static data members + inline static G4RootMpiAnalysisManager* fgInstance { nullptr }; }; #endif diff --git a/examples/extended/parallel/MPI/source/analysis/include/G4RootMpiPNtupleManager.hh b/examples/extended/parallel/MPI/source/analysis/include/G4RootMpiPNtupleManager.hh index 71c1e063f7..ccc0828679 100644 --- a/examples/extended/parallel/MPI/source/analysis/include/G4RootMpiPNtupleManager.hh +++ b/examples/extended/parallel/MPI/source/analysis/include/G4RootMpiPNtupleManager.hh @@ -45,6 +45,8 @@ #include +using std::to_string; + class G4RootFileManager; namespace tools { @@ -93,6 +95,9 @@ class G4RootMpiPNtupleManager : public G4BaseNtupleManager virtual G4bool AddNtupleRow(G4int ntupleId) final; virtual G4bool Merge() final; + // Clear all data + virtual void Clear() final; + // Reset virtual G4bool Reset(G4bool deleteNtuple) final; @@ -140,14 +145,11 @@ inline G4bool G4RootMpiPNtupleManager::FillNtupleTColumn( return false; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("fill", "pntuple T column", description); - } -#endif + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "fill", "pntuple T column", + " ntupleId " + to_string(ntupleId) + " columnId " + to_string(columnId) + + " value " + G4Analysis::ToString(value)); + } auto ntuple = GetNtupleInFunction(ntupleId, "FillNtupleTColumn"); if ( ! ntuple ) return false; @@ -176,14 +178,13 @@ inline G4bool G4RootMpiPNtupleManager::FillNtupleTColumn( column->fill(value); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("done fill", "pntuple T column", description); - } -#endif + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "done fill", "pntuple T column", + " ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + + " value " + value); + } + return true; } @@ -197,14 +198,12 @@ G4bool G4RootMpiPNtupleManager::FillNtupleTColumn( return false; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("fill", "pntuple T column", description); - } -#endif + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "fill", "pntuple T column", + " ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + + " value " + G4Analysis::ToString(value)); + } // get ntuple auto ntuple = GetNtupleInFunction(ntupleId, "FillNtupleTColumn"); @@ -236,14 +235,13 @@ G4bool G4RootMpiPNtupleManager::FillNtupleTColumn( column->fill(value); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("done fill", "pntuple T column", description); - } -#endif + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "done fill", "pntuple T column", + " ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + + " value " + G4Analysis::ToString(value)); + } + return true; } diff --git a/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiAnalysisManager.cc b/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiAnalysisManager.cc index 145d70196c..34fbf48bb3 100644 --- a/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiAnalysisManager.cc +++ b/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiAnalysisManager.cc @@ -30,13 +30,24 @@ #include "G4RootMpiNtupleFileManager.hh" #include "G4RootMpiNtupleManager.hh" #include "G4RootMpiPNtupleManager.hh" +#include "G4AnalysisUtilities.hh" #include +using namespace G4Analysis; + //_____________________________________________________________________________ -G4RootMpiAnalysisManager::G4RootMpiAnalysisManager(G4bool isMaster) - : G4RootAnalysisManager(isMaster) +G4RootMpiAnalysisManager* G4RootMpiAnalysisManager::Instance() { + return fgInstance; +} + +//_____________________________________________________________________________ +G4RootMpiAnalysisManager::G4RootMpiAnalysisManager(G4bool /*isMaster*/) + : G4RootAnalysisManager() +{ + fgInstance = this; + // Reset the ntuple file manager fNtupleFileManager.reset(); @@ -48,7 +59,9 @@ G4RootMpiAnalysisManager::G4RootMpiAnalysisManager(G4bool isMaster) //_____________________________________________________________________________ G4RootMpiAnalysisManager::~G4RootMpiAnalysisManager() -{} +{ + fgInstance = 0; +} // // public methods @@ -118,11 +131,7 @@ G4bool G4RootMpiAnalysisManager::WriteImpl() finalResult = finalResult && result; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("write", "slave files", "", finalResult); - } -#endif + Message(kVL2, "write", "slave files", "", finalResult); return finalResult; } @@ -144,11 +153,7 @@ G4bool G4RootMpiAnalysisManager::CloseFileImpl(G4bool reset) finalResult = finalResult && result; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("close", "slave files", "", finalResult); - } -#endif + Message(kVL2, "close", "slave files", "", finalResult); return finalResult; diff --git a/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiNtupleFileManager.cc b/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiNtupleFileManager.cc index 2deebe1157..d92fee5c0a 100644 --- a/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiNtupleFileManager.cc +++ b/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiNtupleFileManager.cc @@ -29,9 +29,11 @@ #include "G4RootMpiNtupleFileManager.hh" #include "G4RootMpiNtupleManager.hh" #include "G4RootMpiPNtupleManager.hh" +#include "G4AnalysisUtilities.hh" #include +using namespace G4Analysis; using std::make_shared; //_____________________________________________________________________________ @@ -56,11 +58,7 @@ G4RootMpiNtupleFileManager::~G4RootMpiNtupleFileManager() void G4RootMpiNtupleFileManager::SetMpiNtupleMergingMode( G4int nofNtupleFiles) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("set", "mpi ntuple merging mode", ""); - } -#endif + Message(kVL2, "set", "mpi ntuple merging mode"); auto canMerge = true; @@ -98,11 +96,7 @@ void G4RootMpiNtupleFileManager::SetMpiNtupleMergingMode( } } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) { - fState.GetVerboseL1()->Message("set", "ntuple merging mode", mergingMode); - } -#endif + Message(kVL1, "set", "mpi ntuple merging mode", mergingMode); } @@ -137,11 +131,7 @@ void G4RootMpiNtupleFileManager::SetMpiNtupleMerging(tools::impi* impi, //_____________________________________________________________________________ std::shared_ptr G4RootMpiNtupleFileManager::CreateNtupleManager() { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("create", "mpi ntuple managers", ""); - } -#endif + Message(kVL4, "create", "mpi ntuple manager"); std::shared_ptr activeNtupleManager = nullptr; switch ( fNtupleMergeMode ) @@ -172,23 +162,19 @@ std::shared_ptr G4RootMpiNtupleFileManager::CreateNtupleManage } } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - G4String mergeMode; - switch ( fNtupleMergeMode ) { - case G4NtupleMergeMode::kNone: - mergeMode = ""; - break; - case G4NtupleMergeMode::kMain: - mergeMode = "main "; - break; - case G4NtupleMergeMode::kSlave: - mergeMode = "slave "; - break; - } - fState.GetVerboseL3()->Message("create", mergeMode + "mpi ntuple managers", ""); + G4String mergeMode; + switch ( fNtupleMergeMode ) { + case G4NtupleMergeMode::kNone: + mergeMode = ""; + break; + case G4NtupleMergeMode::kMain: + mergeMode = "main "; + break; + case G4NtupleMergeMode::kSlave: + mergeMode = "slave "; + break; } -#endif + Message(kVL3, "create", mergeMode + "mpi ntuple manager"); fIsInitialized = true; @@ -207,15 +193,12 @@ G4bool G4RootMpiNtupleFileManager::ActionAtOpenFile(const G4String& fileName) if ( ! fNtupleBooked ) { -#ifdef G4VERBOSE G4String objectType = "analysis file"; if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) { objectType = "main analysis file"; } - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("open", objectType, fileName); - } -#endif + Message(kVL4, "open", objectType, fileName); + if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) { // Creating files is triggered from CreateNtuple @@ -230,11 +213,7 @@ G4bool G4RootMpiNtupleFileManager::ActionAtOpenFile(const G4String& fileName) fBookingManager->GetNtupleBookingVector()); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) { - fState.GetVerboseL1()->Message("open", objectType, fileName, finalResult); - } -#endif + Message(kVL1, "open", objectType, fileName); fNtupleBooked = true; } @@ -256,11 +235,7 @@ G4bool G4RootMpiNtupleFileManager::ActionAtWrite() if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) ntupleType = "main ntuples"; if ( fNtupleMergeMode == G4NtupleMergeMode::kSlave ) ntupleType = "slave ntuples"; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("merge", ntupleType, ""); - } -#endif + Message(kVL4, "merge", ntupleType); if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) { auto result = fNtupleManager->Merge(); @@ -272,11 +247,7 @@ G4bool G4RootMpiNtupleFileManager::ActionAtWrite() finalResult = result && finalResult; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) { - fState.GetVerboseL1()->Message("merge", ntupleType, ""); - } -#endif + Message(kVL1, "merge", ntupleType, "", finalResult); return finalResult; } @@ -326,7 +297,7 @@ G4bool G4RootMpiNtupleFileManager::Reset() auto finalResult = true; if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) { - auto result = fNtupleManager->Reset(false); + auto result = fNtupleManager->Reset(); finalResult = result && finalResult; } diff --git a/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiNtupleManager.cc b/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiNtupleManager.cc index dcdc7e2ed6..f1f2ee06ad 100644 --- a/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiNtupleManager.cc +++ b/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiNtupleManager.cc @@ -185,7 +185,7 @@ G4bool G4RootMpiNtupleManager::WaitBuffer() unsigned long numberOfEndFill = 0; - G4bool verbose = ( fState.GetVerboseL2() ); + G4bool verbose = IsVerbose(kVL2); while ( true ) { fImpi->pack_reset(); diff --git a/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiPNtupleManager.cc b/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiPNtupleManager.cc index 41e276457b..47bb70e62f 100644 --- a/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiPNtupleManager.cc +++ b/examples/extended/parallel/MPI/source/analysis/src/G4RootMpiPNtupleManager.cc @@ -34,9 +34,10 @@ #include "tools/wroot/mpi_ntuple_row_wise" #include "tools/wroot/mpi_ntuple_column_wise" +using namespace G4Analysis; + const int kTAG_NTUPLE = 1004; // This constant is defined in G4MPImanager // (should be passed from the application) - namespace { //_____________________________________________________________________________ @@ -114,17 +115,12 @@ tools::wroot::base_pntuple* G4RootMpiPNtupleManager::GetNtupleInFunction( //_____________________________________________________________________________ void G4RootMpiPNtupleManager::CreateNtuple(G4RootMpiPNtupleDescription* ntupleDescription) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4() - ->Message("create from booking", "mpi pntuple", - ntupleDescription->fDescription.fNtupleBooking.name()); - } -#endif + Message(kVL4, "create from booking", "mpi pntuple", + ntupleDescription->fDescription.fNtupleBooking.name()); // Wait for the ntuple data from main - G4bool verbose = ( fState.GetVerboseL2() ); + G4bool verbose = IsVerbose(kVL2); G4cout << "Go to wait_buffer from " << fDestinationRank << G4endl; fImpi->pack_reset(); @@ -229,13 +225,8 @@ void G4RootMpiPNtupleManager::CreateNtuple(G4RootMpiPNtupleDescription* ntupleDe // pntuple object is not deleted automatically fNtupleVector.push_back(ntupleDescription->fNtuple); -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3() - ->Message("create from booking", "mpi pntuple", - ntupleDescription->fDescription.fNtupleBooking.name()); - } -#endif + Message(kVL3, "create from booking", "mpi pntuple", + ntupleDescription->fDescription.fNtupleBooking.name()); } //_____________________________________________________________________________ @@ -266,13 +257,8 @@ void G4RootMpiPNtupleManager::CreateNtuplesFromBooking( // Do not create ntuple if it already exists if ( ntupleDescription->fNtuple ) continue; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4() - ->Message("create from booking", "mpi pntuple", - ntupleDescription->fDescription.fNtupleBooking.name()); - } -#endif + Message(kVL4, "create from booking", "mpi pntuple", + ntupleDescription->fDescription.fNtupleBooking.name()); // create ntuple CreateNtuple(ntupleDescription); @@ -281,13 +267,8 @@ void G4RootMpiPNtupleManager::CreateNtuplesFromBooking( // (nothing to be done ?) // FinishTNtuple(ntupleDescription); -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3() - ->Message("create from booking", "mpi pntuple", - ntupleDescription->fDescription.fNtupleBooking.name()); - } -#endif + Message(kVL3, "create from booking", "mpi pntuple", + ntupleDescription->fDescription.fNtupleBooking.name()); } } @@ -338,13 +319,7 @@ G4bool G4RootMpiPNtupleManager::AddNtupleRow(G4int ntupleId) return false; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId; - fState.GetVerboseL4()->Message("add", "pntuple row", description); - } -#endif + Message(kVL4, "add", "pntuple row", " ntupleId " + to_string(ntupleId)); auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "AddNtupleRow"); if ( ! ntupleDescription ) return false; @@ -362,13 +337,7 @@ G4bool G4RootMpiPNtupleManager::AddNtupleRow(G4int ntupleId) "Analysis_W002", JustWarning, description); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId; - fState.GetVerboseL3()->Message("add", "pntuple row", description); - } -#endif + Message(kVL3, "add", "pntuple row", " ntupleId " + to_string(ntupleId)); return true; } @@ -390,13 +359,8 @@ G4bool G4RootMpiPNtupleManager::Merge() // (this happend when the main rank re-opens a new file for merged data) if ( ! ntupleDescription->fNtuple ) continue; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4() - ->Message("end_fill", "pntuple", ntupleDescription->fDescription.fNtupleBooking.name()); - } -#endif - + Message(kVL4, "merge", "pntuple", ntupleDescription->fDescription.fNtupleBooking.name()); + // G4cout << "call end_fill " << fImpi // << " to rank " << ntupleDescription->fMainNtupleRank // << " pntuple: " << ntupleDescription->fNtuple << G4endl; @@ -415,17 +379,26 @@ G4bool G4RootMpiPNtupleManager::Merge() delete ntupleDescription->fNtuple; ntupleDescription->fNtuple = nullptr; -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3() - ->Message("end_fill", "pntuple", ntupleDescription->fDescription.fNtupleBooking.name()); - } -#endif + Message(kVL3, "merge", "pntuple", ntupleDescription->fDescription.fNtupleBooking.name()); } return finalResult; } +//_____________________________________________________________________________ +void G4RootMpiPNtupleManager::Clear() +{ + for ( auto ntupleDescription : fNtupleDescriptionVector ) { + delete ntupleDescription->fNtuple; + } + + fNtupleDescriptionVector.clear(); + fNtupleVector.clear(); + + Message(kVL2, "clear", "pntuples"); +} + + //_____________________________________________________________________________ G4bool G4RootMpiPNtupleManager::Reset(G4bool deleteNtuple) { diff --git a/examples/extended/parallel/MPI/source/src/G4MPIbatch.cc b/examples/extended/parallel/MPI/source/src/G4MPIbatch.cc index c45060065e..b136e34e1f 100644 --- a/examples/extended/parallel/MPI/source/src/G4MPIbatch.cc +++ b/examples/extended/parallel/MPI/source/src/G4MPIbatch.cc @@ -39,8 +39,8 @@ void Tokenize(const G4String& str, std::vector& tokens) { const char* delimiter = " "; - str_size pos0 = str.find_first_not_of(delimiter); - str_size pos = str.find_first_of(delimiter, pos0); + auto pos0 = str.find_first_not_of(delimiter); + auto pos = str.find_first_of(delimiter, pos0); while (pos != G4String::npos || pos0 != G4String::npos) { if (str[pos0] == '\"') { @@ -95,19 +95,19 @@ G4String G4MPIbatch::ReadCommand() G4String cmdline(linebuf); // TAB-> ' ' conversion - str_size nb = 0; + G4String::size_type nb = 0; while ((nb= cmdline.find('\t',nb)) != G4String::npos) { cmdline.replace(nb, 1, " "); } // strip - cmdline = cmdline.strip(G4String::both); + G4StrUtil::strip(cmdline); // skip null line if single line if( !qcontinued && cmdline.size() == 0 ) continue; // '#' is treated as echoing something - if( cmdline(0) == '#' ) return cmdline; + if( cmdline[0] == '#' ) return cmdline; // tokenize... std::vector tokens; @@ -115,9 +115,9 @@ G4String G4MPIbatch::ReadCommand() qcontinued = false; for( G4int i = 0; i < G4int(tokens.size()); i++ ) { // string after '#" is ignored - if( tokens[i](0) == '#' ) break; + if( tokens[i][0] == '#' ) break; // '\' or '_' is treated as continued line. - if( tokens[i] == '\\' || tokens[i] == '_' ) { + if( tokens[i] == "\\" || tokens[i] == "_" ) { qcontinued = true; // check nothing after line continuation character if( i != G4int(tokens.size())-1 ) { @@ -137,7 +137,7 @@ G4String G4MPIbatch::ReadCommand() } // strip again - cmdtotal = cmdtotal.strip(G4String::both); + G4StrUtil::strip(cmdtotal); // bypass some commands cmdtotal = BypassCommand(cmdtotal); @@ -170,7 +170,7 @@ G4UIsession* G4MPIbatch::SessionStart() } // just echo something - if( scommand(0) == '#' ) { + if( scommand[0] == '#' ) { if( G4UImanager::GetUIpointer()-> GetVerboseLevel() == 2 ) { G4cout << scommand << G4endl; } diff --git a/examples/extended/parallel/MPI/source/src/G4MPIntupleMerger.cc b/examples/extended/parallel/MPI/source/src/G4MPIntupleMerger.cc index f81470f8e1..7393904faa 100644 --- a/examples/extended/parallel/MPI/source/src/G4MPIntupleMerger.cc +++ b/examples/extended/parallel/MPI/source/src/G4MPIntupleMerger.cc @@ -47,6 +47,7 @@ G4MPIntupleMerger::G4MPIntupleMerger(G4int nofReducedNtupleFiles, G4bool isMaster = true; auto analysisManager = new G4RootMpiAnalysisManager(isMaster); + analysisManager->SetVerboseLevel(1); // G4cout << "Start configure ntuple MPI merging" << G4endl; // Get communicator diff --git a/examples/extended/parallel/MPI/source/src/G4MPIsession.cc b/examples/extended/parallel/MPI/source/src/G4MPIsession.cc index 9492c2545e..ffb3d4fee3 100644 --- a/examples/extended/parallel/MPI/source/src/G4MPIsession.cc +++ b/examples/extended/parallel/MPI/source/src/G4MPIsession.cc @@ -100,20 +100,20 @@ G4String G4MPIsession::GetCommand(const char* msg) // get command from shell... newCommand = shell_-> GetCommandLineString(msg); - G4String nC= newCommand.strip(G4String::leading); + G4String nC= G4StrUtil::lstrip_copy(newCommand); if( nC.length() == 0 ) { newCommand = nullString; - } else if( nC(0) == '#' ) { + } else if( nC[0] == '#' ) { G4cout << nC << G4endl; newCommand = nullString; - } else if( nC == "ls" || nC(0,3) == "ls " ) { // list commands + } else if( nC == "ls" || nC.substr(0,3) == "ls " ) { // list commands ListDirectory(nC); newCommand = nullString; - } else if( nC == "lc" || nC(0,3) == "lc " ) { // ... by shell - shell_-> ListCommand(nC.remove(0,2)); + } else if( nC == "lc" || nC.substr(0,3) == "lc " ) { // ... by shell + shell_-> ListCommand(nC.erase(0,2)); newCommand = nullString; } else if( nC == "pwd" ) { // show current directory @@ -125,16 +125,16 @@ G4String G4MPIsession::GetCommand(const char* msg) shell_-> ShowCurrentDirectory(); newCommand = nullString; - } else if(nC == "cd" || nC(0,3) == "cd " ) { // "cd" + } else if(nC == "cd" || nC.substr(0,3) == "cd " ) { // "cd" ChangeDirectoryCommand(nC); shell_-> SetCurrentDirectory(GetCurrentWorkingDirectory()); newCommand = nullString; - } else if( nC == "help" || nC(0,5) == "help " ) { // "help" + } else if( nC == "help" || nC.substr(0,5) == "help " ) { // "help" TerminalHelp(nC); newCommand = nullString; - } else if( nC(0) == '?' ) { // "show current value of a parameter" + } else if( nC[0] == '?' ) { // "show current value of a parameter" ShowCurrent(nC); newCommand = nullString; @@ -145,8 +145,8 @@ G4String G4MPIsession::GetCommand(const char* msg) } newCommand = nullString; - } else if( nC(0) == '!' ) { // "!" - G4String ss = nC(1, nC.length()-1); + } else if( nC[0] == '!' ) { // "!" + G4String ss = nC.substr(1, nC.length()-1); G4int vl; const char* tt = ss; std::istringstream is(tt); diff --git a/examples/extended/parallel/MPI/source/src/G4VMPIsession.cc b/examples/extended/parallel/MPI/source/src/G4VMPIsession.cc index 3d7a581038..9b82218347 100644 --- a/examples/extended/parallel/MPI/source/src/G4VMPIsession.cc +++ b/examples/extended/parallel/MPI/source/src/G4VMPIsession.cc @@ -83,10 +83,10 @@ G4int G4VMPIsession::ExecCommand(const G4String& acommand) G4String command = BypassCommand(acommand); // "/mpi/beamOn is threaded out. - if( command(0,11) == "/mpi/beamOn" ) { + if( command.substr(0,11) == "/mpi/beamOn" ) { g4mpi_-> ExecuteBeamOnThread(command); returnVal = fCommandSucceeded; - } else if( command(0,12) == "/mpi/.beamOn" ) { // care for beamOn + } else if( command.substr(0,12) == "/mpi/.beamOn" ) { // care for beamOn G4bool threadStatus = g4mpi_-> CheckThreadStatus(); if ( threadStatus ) { // still /run/beamOn is active if( is_master_ ) { @@ -151,16 +151,16 @@ G4String G4VMPIsession::TruncateCommand(const G4String& command) const G4String acommand = command; G4String strarg; - str_size iarg = acommand.find(' '); + G4String::size_type iarg = acommand.find(' '); if( iarg != G4String::npos ) { - strarg = acommand(iarg, acommand.size()-iarg); - acommand = acommand(0,iarg); + strarg = acommand.substr(iarg, acommand.size()-iarg); + acommand = acommand.substr(0,iarg); } - str_size idx; + G4String::size_type idx; while( (idx = acommand.find("//")) != G4String::npos) { - G4String command1 = acommand(0,idx+1); - G4String command2 = acommand(idx+2, acommand.size()-idx-2); + G4String command1 = acommand.substr(0,idx+1); + G4String command2 = acommand.substr(idx+2, acommand.size()-idx-2); acommand = command1 + command2; } @@ -187,7 +187,7 @@ G4String G4VMPIsession::BypassCommand(const G4String& command) const G4String acommand = command; // /mpi/beamOn - if( acommand(0,11) == "/mpi/beamOn" ) { + if( acommand.substr(0,11) == "/mpi/beamOn" ) { #ifdef G4MULTITHREADED acommand = "/mpi/.beamOn"; if(command.length() > 11) { @@ -204,12 +204,12 @@ G4String G4VMPIsession::BypassCommand(const G4String& command) const } // /run/beamOn - if( acommand(0,11) == "/run/beamOn" ) { + if( acommand.substr(0,11) == "/run/beamOn" ) { G4String strarg = ""; G4bool qget = false; G4bool qdone = false; - for ( str_size idx = 10; idx < command.size(); idx++ ) { + for ( G4String::size_type idx = 10; idx < command.size(); idx++ ) { if( command[idx] == ' ' || command[idx] == '\011' ) { qget = true; if(qdone) break; @@ -242,7 +242,7 @@ G4String G4VMPIsession::BypassCommand(const G4String& command) const } // /control/execute - if( acommand(0,16) == "/control/execute" ) { + if( acommand.substr(0,16) == "/control/execute" ) { if( g4mpi_-> GetVerbose()>0 && is_master_ ) { G4cout << "/control/execute is overridden by /mpi/execute" << G4endl; diff --git a/examples/extended/parallel/README b/examples/extended/parallel/README deleted file mode 100644 index 1666e62a2a..0000000000 --- a/examples/extended/parallel/README +++ /dev/null @@ -1,21 +0,0 @@ - - Examples for event parallelism - ------------------------------ - -This directory includes example applications to demonstrate the usage of -different techniques for achieving event parallelism with Geant4. - -- MPI is a native interface with MPI libraries. The directory contains - a Geant4 UI library and a couple of parallelized examples. - Using this interface, users applications can be parllelized with - different MPI compliant libraries, such as LAM/MPI, MPICH2, OpenMPI, - and so on. - -- Example TBB is derived from original basic/B2 demonstrating how to - interface a simple application with the Intel Threading Building Blocks - library (TBB), and organise MT event-level parallelism as TBB tasks. - -- TopC examples are Geant4 examples adapted to be run together with - the TOP-C communication layer application on either a cluster of systems - or multi-processor machines. They are based on N02 and N04 examples, - originally provided in novice examples (see more in example/README) diff --git a/examples/extended/parallel/TBB/.README.txt b/examples/extended/parallel/TBB/.README.txt deleted file mode 100644 index 904a7bd1f9..0000000000 --- a/examples/extended/parallel/TBB/.README.txt +++ /dev/null @@ -1,27 +0,0 @@ - -///\file "parallel/TBB/.README.txt" -///\brief Examples TBB README page - -/*! \page Examples_tbb Category "parallel/TBB" - - -TBB directory shows how to integrate Intel Threading Building Block and Geant4 -to achieve event-level parallelism. - -\link ExampleTBB_B2b TBB/B2b \endlink - -Currently only a preliminary version of one example is provided: it replaces -the Geant4 Version 10.0 event-loop parallelism based on pthreads with TBB -task-based parallelism. It should not be considered a feature-complete example -and it present some limitations (no merging of output, no correct clean-up of -heap). - -It will be substantially improved in the future. -If you have interest in TBB please -refer to Geant4 Multi-threading user-forum (reachable from Geant4 website) -where updates on TBB will be communicated or contact example author at: -adotti@slac.stanford.edu. - -*/ - - diff --git a/examples/extended/parallel/TBB/B2b/.README.txt b/examples/extended/parallel/TBB/B2b/.README.txt deleted file mode 100644 index 1584b2fee2..0000000000 --- a/examples/extended/parallel/TBB/B2b/.README.txt +++ /dev/null @@ -1,51 +0,0 @@ - -///\file "parallel/TBB/B2b/.README.txt" -///\brief Example TBB/B2b README page - -/*! \page ExampleTBB_B2b Example TBB/B2b - -This example shows how to integrate Intel Threading Building Block and Geant4 -to achieve event-level parallelism. - - -Note that this is a preliminary version which should not be considered a -feature-complete example and which presents some limitations (no merging of -output, no correct clean-up of heap). It will be substantially improved -in 2014. - - -This example adds to B2b example, originally provided in basic example, -the TBB based classes: - -\section TBB_B2b_s1 tbbMasterRunManager - -tbbMasterRunManager class implements the master model run manager for TBB bases -application. - -It is instantiated by user main (or equivalent function) instead -of G4[MT]RunManager. It controls the creation of tbb::tasks. -See G4MTRunManager for documentation of methods relative to base -class. Only class specific methods are documented here. - -\section TBB_B2b_s2 tbbWorkerRunManager - -tbbWorkerRunManager class implements the worker model run manager for TBB based -application. - -It is instantiated by tbbUserWorkerInitialization and used by -tbbMasterRunManager. -See G4WorkerRunManager for documentation of methods relative to -base class. Only class specific methods are documented here. - -\section TBB_B2b_s3 tbbUserWorkerInitialization - -tbbUserWorkerInitialization class implements TBB specific worker initialization. -It is a sub-class of G4UserWorkerThreadInitialization. -Its role is to instantiate a tbbWorkerRunManager to be used by -tbb tasks. - -\section TBB_B2b_s4 tbbTask - -tbbTask class represents one TBB task. - -*/ diff --git a/examples/extended/parallel/TBB/B2b/CMakeLists.txt b/examples/extended/parallel/TBB/B2b/CMakeLists.txt index c77fec3baa..d3ef59e079 100644 --- a/examples/extended/parallel/TBB/B2b/CMakeLists.txt +++ b/examples/extended/parallel/TBB/B2b/CMakeLists.txt @@ -2,7 +2,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(B2bTBB) #---------------------------------------------------------------------------- diff --git a/examples/extended/parallel/TBB/B2b/README b/examples/extended/parallel/TBB/B2b/README deleted file mode 100644 index 59474b35d0..0000000000 --- a/examples/extended/parallel/TBB/B2b/README +++ /dev/null @@ -1,47 +0,0 @@ - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - TBB/B2b - -------- - -This example shows how to integrate Intel Threading Building Block and Geant4 -to achieve event-level parallelism. - -Note that this is a preliminary version which should not be considered a -feature-complete example and which presents some limitations (no merging of -output, no correct clean-up of heap). It will be substantially improved -in 2014. - -This example adds to B2b example, originally provided in basic example, -the TBB based classes: - -tbbMasterRunManager: --------------------- -This class implements the master model run manager for TBB bases -application. -It is instantiated by user main (or equivalent function) instead -of G4[MT]RunManager. It controls the creation of tbb::tasks. -See G4MTRunManager for documentation of methods relative to base -class. Only class specific methods are documented here. - -tbbWorkerRunManager --------------------- -This class implements the worker model run manager for TBB based -application. -It is instantiated by tbbUserWorkerInitialization and used by -tbbMasterRunManager. -See G4WorkerRunManager for documentation of methods relative to -base class. Only class specific methods are documented here. - -tbbUserWorkerInitialization ---------------------------- -This class implements TBB specific worker initialization. -It is a sub-class of G4UserWorkerThreadInitialization. -Its role is to instantiate a tbbWorkerRunManager to be used by -tbb tasks. - -tbbTask ---------------------------- -This class represents one TBB task. diff --git a/examples/extended/parallel/TBB/CMakeLists.txt b/examples/extended/parallel/TBB/CMakeLists.txt index 4b4767a7b9..0045dae085 100644 --- a/examples/extended/parallel/TBB/CMakeLists.txt +++ b/examples/extended/parallel/TBB/CMakeLists.txt @@ -1,7 +1,7 @@ #---Adding examples subdirectories explicitly # and a custom target to for building all basic examples ------------- -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) if(GEANT4_BUILD_MULTITHREADED) add_subdirectory(B2b) diff --git a/examples/extended/parallel/TBB/README b/examples/extended/parallel/TBB/README deleted file mode 100644 index 408869a95a..0000000000 --- a/examples/extended/parallel/TBB/README +++ /dev/null @@ -1,22 +0,0 @@ - - Geant4 extended examples - TBB - -------------------------------- - -TBB directory shows how to integrate Intel Threading Building Block and Geant4 -to achieve event-level parallelism. - -TBB/B2b - -Currently only a preliminary version of one example is provided: it replaces -the Geant4 Version 10.0 event-loop parallelism based on pthreads with TBB -task-based parallelism. It should not be considered a feature-complete example -and it present some limitations (no merging of output, no correct clean-up of -heap). - -It will be substantially improved in the future. -If you have interest in TBB please -refer to Geant4 Multi-threading user-forum (reachable from Geant4 website) -where updates on TBB will be communicated or contact example author at: -adotti@slac.stanford.edu. - - diff --git a/examples/extended/parallel/ThreadsafeScorers/.README.txt b/examples/extended/parallel/ThreadsafeScorers/.README.txt deleted file mode 100644 index 9ea7f5f43a..0000000000 --- a/examples/extended/parallel/ThreadsafeScorers/.README.txt +++ /dev/null @@ -1,202 +0,0 @@ - -///\file "parallel/ThreadsafeScorers/.README.txt" -///\brief Threadsafe Scorers README page - -/*! \page ExampleThreadsafeScorers Example ThreadsafeScorers - - This example demonstrates a very simple application where an energy - deposit and # of steps is accounted in thread-local (i.e. one instance per - thread) hits maps with underlying types of plain-old data (POD) and global - (i.e. one instance) hits maps with underlying types of atomics. - The example uses a coarse mesh, extensive physics, and step limiters - to ensure that there is a higher degree of conflict between threads - when updating the scorers to test the robustness of the atomics - classes and maximize the compounding of thread-local round-off error. - - At the end of the simulation, the scorers are printed to - "mfd__.out", where DATA_TYPE is either - "tl" (thread-local) or "tg" (thread-global) and SCORER_TYPE is "EnergyDeposit" - or "NumberOfSteps". These values are then compared to a thread-global - sum of these scorers that were updated via mutex locking. If round-off - errors in thread-local EnergyDeposit are present, they can be viewed - in "mfd_diff.out" at the end of the simulation - - This example also provides a demonstration of the timemory (a performance - instrumentation toolkit) package provided in Geant4 -- for documentation of timemory - see https://github.com/NERSC/timemory and https://timemory.readthedocs.io. - -\section ThreadsafeScorers_s1 ATOMICS and the ATOMIC SCORERS - - atomics can ONLY handle plain-old data (POD) types, e.g. int, double, etc. - The implementation of atomics in compiler-dependent. At the very worst, - the performance of an atomic is the same mutex locking. - Atomics, in general, are not copy-constructable. This has to do with - thread safety (e.g. making a copy while another thread tries to update) - This is why atomics cannot be used in STL containers. The implementation - in atomic.hh has limited copy-construction and still cannot be used in - STL containers. Use these copy-constructors with extreme caution. See - opening comments of G4atomic.hh for more details. - - The newly provided classes in this example (G4atomic, G4TAtomicHitsMap, and - G4TAtomicHitsCollection) are intended for applications where memory is a - greater concern than performance. While atomics generally perform better than - mutex locking, the synchronization is not without a cost. However, since - the memory consumed by thread-local hits maps scales roughly linearly - with the number of threads, simulations with a large number of scoring - volumes can decrease simulation time by increasing the number of threads - beyond what was previously allowed due to the increase in memory consumption. - *************************************************************************** - *** These classes are intended to be included in the Geant4 source code *** - *** release next year *** - *************************************************************************** - - The G4TAtomicHitsMap and G4TAtomicHitsCollection work exactly the same way - as the standard G4THitsMap and G4THitsCollection, respectively, with the - exception(s) that you should only implement one instance and provide a - pointer/reference of that instance to the threads instead of having the - threads create them. Additionally, there is no need to include them - in the G4Run::Merge(). - -\section ThreadsafeScorers_s2 GEOMETRY DEFINITION - - The geometry is constructed in the TSDetectorConstruction class. - The setup consists of a box filling the world. The volume is divided into - subregions, where the outermost boxes are a different material. The materials - by default are water and boron as these have large scattering cross-sections - for neutrons (the default particle). - -\section ThreadsafeScorers_s3 PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set are built from a variety of physics constructors. - The chosen physics lists are extensive, primarily - The constructors are: - - - G4EmStandardPhysics_option4 - - G4DecayPhysics - - G4RadioactiveDecayPhysics - - G4HadronPhysicsQGSP_BERT_HP - - G4HadronElasticPhysicsHP - - G4StepLimiterPhysics - - G4IonElasticPhysics - - G4IonBinaryCascadePhysics - -\section ThreadsafeScorers_s4 ACTION INITALIZATION - - TSActionInitialization, instantiates and registers to Geant4 kernel - all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - TSActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - TSActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - -\section ThreadsafeScorers_s5 PRIMARY GENERATOR - - The primary generator is defined in the TSPrimaryGeneratorAction class. - The default kinematics is a 1 MeV neutron, randomly distributed in front - of the target across 100% of the transverse (X,Y) target size. - This default setting can be changed via the Geant4 built-in commands - of the G4ParticleGun class. - -\section ThreadsafeScorers_s6 DETECTOR RESPONSE - - This example demonstrates a scoring implemented - in the user action classes and TSRun object. - - The energy deposited is collected per event in the PrimitiveScorer - G4PSEnergyDeposit (as part of a MultiFunctionalDetector) - and the thread-local version are merged at the end of the run. - - The number of steps is collected per event in the PrimativeScorer - G4PSNoOfSteps and the thread-local version are merged at the end of the run. - - When the MFD is recording an event i.e. TSRun::RecordEvent(const G4Event*), - the global atomic hits map adds the same hits collections - - In multi-threading mode the energy accumulated in TSRun MFD object per - workers is merged to the master in TSRun::Merge(). - - Scoring is accumulated with thread-local doubles, thread-global atomics, - mutex-locking, G4StatAnalysis, and G4ConvergenceTester - - TSRun contains five hits collections types: - 1) a thread-local hits map, - 2) a global atomic hits map - 3) a global "mutex" hits map - 4) a global G4StatAnalysis hits deque - 5) a global G4ConvergenceTester hits deque - - The thread-local hits map is the same as you will find in many other - examples. - - The atomics hits map is the purpose of this example. Code-wise, the - implementation looks extremely similar to the thread-local version with - 3 primary exceptions: - (1) construction - there should only be one instance so it should be a - static member variable or a pointer/reference to a single instance - (2) It does not need to, nor should be, summed in G4Run::Merge() - (3) destruction -- it should only be cleared by the master thread since - there is only one instance. - - The "mutex" hits map is also included as reference for checking the results - accumulated by the thread-local hits maps and atomic hits maps. The - differences w.r.t. this hits maps are computed in - TSRunAction::EndOfRunAction - - The "G4StatAnalysis" and "G4ConvergenceTester" hits deques are - memory-efficient version of the standard G4THitsMap. While maps are - ideal for scoring at the G4Event-level, where sparsity w.r.t. indices - is common; at the G4Run-level, these data structures require much - less memory overhead. Due to a lack of - G4ConvergenceTester::operator+=(G4ConvergenceTester), the static version - of G4ConvergenceTester is the only valid way to use G4ConvergenceTester - in a scoring container. This is not the case for G4StatAnalysis, which - can be used in lieu of G4double. - -\section ThreadsafeScorers_s7 HOW TO RUN - - - Execute ts_scorers in the 'interactive mode' with visualization: - - % ./ts_scorers - - and type in the commands from run.mac line by line: - - Idle> /control/verbose 2 - Idle> /tracking/verbose 1 - Idle> /run/beamOn 10 - Idle> ... - Idle> exit - - or - - Idle> /control/execute run.mac - .... - Idle> exit - - - Execute ts_scorers in the 'batch' mode from macro files - (without visualization) - - % ./ts_scorers run.mac - % ./ts_scorers run.mac > run.out - -\section ThreadsafeScorers_s8 TIMEMORY USAGE - - This example demonstrates profiling analysis with timemory - (https://github.com/NERSC/timemory). - - - Compile Geant4 with timemory (-DGEANT4_USE_TIMEMORY=ON) - - timemory provide timing within the Geant4 source code - and within the example (TSRun::RecordEvent) - - Analysis is echoed to stdout and generates several output - files in a folder based on the name of the executable. In - general that folder will be "timemory-{name of executable}-output" - -*/ - diff --git a/examples/extended/parallel/ThreadsafeScorers/CMakeLists.txt b/examples/extended/parallel/ThreadsafeScorers/CMakeLists.txt index 995f731852..7d459a0598 100644 --- a/examples/extended/parallel/ThreadsafeScorers/CMakeLists.txt +++ b/examples/extended/parallel/ThreadsafeScorers/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) set(name ts_scorers) project(ThreadsafeScorers C CXX) diff --git a/examples/extended/parallel/ThreadsafeScorers/README b/examples/extended/parallel/ThreadsafeScorers/README deleted file mode 100644 index f66fe2c8d7..0000000000 --- a/examples/extended/parallel/ThreadsafeScorers/README +++ /dev/null @@ -1,188 +0,0 @@ - -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example ThreadsafeScorers - ---------------------------- - - This example demonstrates a very simple application where an energy - deposit and # of steps is accounted in thread-local (i.e. one instance per - thread) hits maps with underlying types of plain-old data (POD) and global - (i.e. one instance) hits maps with underlying types of atomics. - The example uses a coarse mesh, extensive physics, and step limiters - to ensure that there is a higher degree of conflict between threads - when updating the scorers to test the robustness of the atomics - classes and maximize the compounding of thread-local round-off error. - At the end of the simulation, the scorers are printed to - "mfd__.out", where DATA_TYPE is either - "tl" (thread-local) or "tg" (thread-global) and SCORER_TYPE is "EnergyDeposit" - or "NumberOfSteps". These values are then compared to a thread-global - sum of these scorers that were updated via mutex locking. If round-off - errors in thread-local EnergyDeposit are present, they can be viewed - in "mfd_diff.out" at the end of the simulation - This example also provides a demonstration of the timemory (a performance - instrumentation toolkit) package provided in Geant4 -- for documentation of timemory - see https://github.com/NERSC/timemory and https://timemory.readthedocs.io. - - 1- ATOMICS and the ATOMIC SCORERS - - atomics can ONLY handle plain-old data (POD) types, e.g. int, double, etc. - The implementation of atomics in compiler-dependent. At the very worst, - the performance of an atomic is the same mutex locking. - Atomics, in general, are not copy-constructable. This has to do with - thread safety (e.g. making a copy while another thread tries to update) - This is why atomics cannot be used in STL containers. The implementation - in atomic.hh has limited copy-construction and still cannot be used in - STL containers. Use these copy-constructors with extreme caution. See - opening comments of G4atomic.hh for more details. - - The newly provided classes in this example (G4atomic, G4TAtomicHitsMap, and - G4TAtomicHitsCollection) are intended for applications where memory is a - greater concern than performance. While atomics generally perform better than - mutex locking, the synchronization is not without a cost. However, since - the memory consumed by thread-local hits maps scales roughly linearly - with the number of threads, simulations with a large number of scoring - volumes can decrease simulation time by increasing the number of threads - beyond what was previously allowed due to the increase in memory consumption. - - The G4TAtomicHitsMap and G4TAtomicHitsCollection work exactly the same way - as the standard G4THitsMap and G4THitsCollection, respectively, with the - exception(s) that you should only implement one instance and provide a - pointer/reference of that instance to the threads instead of having the - threads create them. Additionally, there is no need to include them - in the G4Run::Merge(). - - 2- GEOMETRY DEFINITION - - The geometry is constructed in the TSDetectorConstruction class. - The setup consists of a box filling the world. The volume is divided into - subregions, where the outermost boxes are a different material. The materials - by default are water and boron as these have large scattering cross-sections - for neutrons (the default particle). - - 3- PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set are built from a variety of physics constructors. - The chosen physics lists are extensive, primarily - The constructors are: - - G4EmStandardPhysics_option4 - G4DecayPhysics - G4RadioactiveDecayPhysics - G4HadronPhysicsQGSP_BERT_HP - G4HadronElasticPhysicsHP - G4StepLimiterPhysics - G4IonElasticPhysics - G4IonBinaryCascadePhysics - - 4- ACTION INITALIZATION - - TSActionInitialization, instantiates and registers to Geant4 kernel - all user action classes. - - While in sequential mode the action classes are instatiated just once, - via invoking the method: - TSActionInitialization::Build() - in multi-threading mode the same method is invoked for each thread worker - and so all user action classes are defined thread-local. - - A run action class is instantiated both thread-local - and global that's why its instance is created also in the method - TSActionInitialization::BuildForMaster() - which is invoked only in multi-threading mode. - - 5- PRIMARY GENERATOR - - The primary generator is defined in the TSPrimaryGeneratorAction class. - The default kinematics is a 1 MeV neutron, randomly distributed in front - of the target across 100% of the transverse (X,Y) target size. - This default setting can be changed via the Geant4 built-in commands - of the G4ParticleGun class. - - 6- DETECTOR RESPONSE - - This example demonstrates a scoring implemented - in the user action classes and TSRun object. - - The energy deposited is collected per event in the PrimitiveScorer - G4PSEnergyDeposit (as part of a MultiFunctionalDetector) - and the thread-local version are merged at the end of the run. - - The number of steps is collected per event in the PrimativeScorer - G4PSNoOfSteps and the thread-local version are merged at the end of the run. - - When the MFD is recording an event i.e. TSRun::RecordEvent(const G4Event*), - the global atomic hits map adds the same hits collections - - In multi-threading mode the energy accumulated in TSRun MFD object per - workers is merged to the master in TSRun::Merge(). - - TSRun contains five hits collections types: - 1) a thread-local hits map, - 2) a global atomic hits map - 3) a global "mutex" hits map - 4) a global G4StatAnalysis hits deque - 5) a global G4ConvergenceTester hits deque - - The thread-local hits map is the same as you will find in many other - examples. - - The atomics hits map is the purpose of this example. Code-wise, the - implementation looks extremely similar to the thread-local version with - 3 primary exceptions: - (1) construction - there should only be one instance so it should be a - static member variable or a pointer/reference to a single instance - (2) It does not need to, nor should be, summed in G4Run::Merge() - (3) destruction -- it should only be cleared by the master thread since - there is only one instance. - - The "mutex" hits map is also included as reference for checking the results - accumulated by the thread-local hits maps and atomic hits maps. The - differences w.r.t. this hits maps are computed in - TSRunAction::EndOfRunAction - - The "G4StatAnalysis" and "G4ConvergenceTester" hits deques are - memory-efficient version of the standard G4THitsMap. While maps are - ideal for scoring at the G4Event-level, where sparsity w.r.t. indices - is common; at the G4Run-level, these data structures require much - less memory overhead. Due to a lack of - G4ConvergenceTester::operator+=(G4ConvergenceTester), the static version - of G4ConvergenceTester is the only valid way to use G4ConvergenceTester - in a scoring container. This is not the case for G4StatAnalysis, which - can be used in lieu of G4double. - -7- HOW TO RUN - - - Execute ts_scorers in the 'interactive mode' with visualization: - % ./ts_scorers - and type in the commands from run.mac line by line: - Idle> /control/verbose 2 - Idle> /tracking/verbose 1 - Idle> /run/beamOn 10 - Idle> ... - Idle> exit - or - Idle> /control/execute run.mac - .... - Idle> exit - - - Execute ts_scorers in the 'batch' mode from macro files - (without visualization) - % ./ts_scorers run.mac - % ./ts_scorers run.mac > run.out - -8- TIMEMORY USAGE - - This example demonstrates profiling analysis with timemory - (https://github.com/NERSC/timemory). - - - Compile Geant4 with timemory (-DGEANT4_USE_TIMEMORY=ON) - - timemory provide timing within the Geant4 source code - and within the example (TSRun::RecordEvent) - - Analysis is echoed to stdout and generates several output - files in a folder based on the name of the executable. In - general that folder will be "timemory-{name of executable}-output" diff --git a/examples/extended/parallel/ThreadsafeScorers/threadsafe-scorers.out b/examples/extended/parallel/ThreadsafeScorers/threadsafe-scorers.out index d318279748..2912c9870b 100644 --- a/examples/extended/parallel/ThreadsafeScorers/threadsafe-scorers.out +++ b/examples/extended/parallel/ThreadsafeScorers/threadsafe-scorers.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -40,10 +40,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -92,6 +90,84 @@ Some /vis commands (optionally) take a string to specify colour. /random/setSavingFlag 1 /random/saveEachEventFlag 0 /run/beamOn 10000 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 20 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 0.01 mm) +Step function for muons/hadrons (0.1, 0.05 mm) +Step function for light ions (0.1, 0.02 mm) +Step function for general ions (0.1, 0.001 mm) +Lowest e+e- kinetic energy 100 eV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 1 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 1 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 1 MeV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 2 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 1 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.08 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 3 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 1 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= +====== Atomic Deexcitation Parameters ======== +======================================================================= +Fluorescence enabled 1 +Fluorescence Bearden data files enabled 0 +Fluorescence ANSTO data files enabled 0 +Auger electron cascade enabled 1 +PIXE atomic de-excitation enabled 0 +De-excitation module ignores cuts 1 +Type of PIXE cross section for hadrons Empirical +Type of PIXE cross section for e+- Livermore +======================================================================= ### === Deexcitation model UAtomDeexcitation is activated for 1 region: DefaultRegionForTheWorld 1 1 0 @@ -101,29 +177,29 @@ Some /vis commands (optionally) take a string to specify colour. phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 174 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 20 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 160 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LowEPComptonModel : Emin= 0 meV Emax= 20 MeV Fluo + LowEPComptonModel : Emin= 0 eV Emax= 20 MeV Fluo KleinNishina : Emin= 20 MeV Emax= 100 TeV Fluo conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 20 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitler5D : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitler5D : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 20 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 180 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - GoudsmitSaunderson : Emin= 0 meV Emax= 100 MeV Nbins=120 100 eV - 100 MeV + GoudsmitSaunderson : Emin= 0 eV Emax= 100 MeV Nbins=120 100 eV - 100 MeV StepLim=SafetyPlus Rfact=0.08 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=120 100 MeV - 100 TeV StepLim=SafetyPlus Rfact=0.08 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm @@ -133,7 +209,7 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.2, 0.01 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LowEnergyIoni : Emin= 0 meV Emax= 100 keV deltaVI + LowEnergyIoni : Emin= 0 eV Emax= 100 keV deltaVI MollerBhabha : Emin= 100 keV Emax= 100 TeV deltaVI eBrem: for e- XStype:4 SubType=3 @@ -141,25 +217,25 @@ eBrem: for e- XStype:4 SubType=3 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV AngularGen2BS + eBremSB : Emin= 0 eV Emax= 1 GeV AngularGen2BS eBremLPM : Emin= 1 GeV Emax= 100 TeV AngularGen2BS ePairProd: for e- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 25x1001 from 0.1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ePairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + ePairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 20 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 20 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - GoudsmitSaunderson : Emin= 0 meV Emax= 100 MeV Nbins=120 100 eV - 100 MeV + GoudsmitSaunderson : Emin= 0 eV Emax= 100 MeV Nbins=120 100 eV - 100 MeV StepLim=SafetyPlus Rfact=0.08 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=120 100 MeV - 100 TeV StepLim=SafetyPlus Rfact=0.08 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm @@ -169,7 +245,7 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.2, 0.01 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - PenIoni : Emin= 0 meV Emax= 100 keV + PenIoni : Emin= 0 eV Emax= 100 keV MollerBhabha : Emin= 100 keV Emax= 100 TeV deltaVI eBrem: for e+ XStype:4 SubType=3 @@ -177,29 +253,29 @@ eBrem: for e+ XStype:4 SubType=3 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV AngularGen2BS + eBremSB : Emin= 0 eV Emax= 1 GeV AngularGen2BS eBremLPM : Emin= 1 GeV Emax= 100 TeV AngularGen2BS ePairProd: for e+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 25x1001 from 0.1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ePairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + ePairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 20 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 20 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=240 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=240 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -207,35 +283,35 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.05 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV deltaVI + Bragg : Emin= 0 eV Emax= 2 MeV deltaVI BetheBloch : Emin= 2 MeV Emax= 100 TeV deltaVI hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV nuclearStopping: for proton SubType=8 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU49NucStopping : Emin= 0 meV Emax= 1 MeV + ICRU49NucStopping : Emin= 0 eV Emax= 1 MeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -243,11 +319,11 @@ ionIoni: for GenericIon XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.02 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ParamICRU73 : Emin= 0 meV Emax= 100 TeV deltaVI + ParamICRU73 : Emin= 0 eV Emax= 100 TeV deltaVI nuclearStopping: for GenericIon SubType=8 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU49NucStopping : Emin= 0 meV Emax= 1 MeV + ICRU49NucStopping : Emin= 0 eV Emax= 1 MeV ====================================================================== ====== Radioactive Decay Physics Parameters ======= ====================================================================== @@ -258,15 +334,15 @@ Enable correlated gamma emission 0 Max 2J for sampling of angular correlations 10 Atomic de-excitation enabled 1 Auger electron emission enabled 1 -Auger cascade enabled 1 Check EM cuts disabled for atomic de-excitation 1 Use Bearden atomic level energies 0 +Use ANSTO fluorescence model 0 Threshold for very long decay time at rest 1e+27 ns ====================================================================== msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -274,16 +350,16 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.02 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV deltaVI + BraggIon : Emin= 0 eV Emax=7.9452 MeV deltaVI BetheBloch : Emin=7.9452 MeV Emax= 100 TeV deltaVI nuclearStopping: for alpha SubType=8 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU49NucStopping : Emin= 0 meV Emax= 1 MeV + ICRU49NucStopping : Emin= 0 eV Emax= 1 MeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=240 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=240 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -291,31 +367,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.05 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV deltaVI + ICRU73QO : Emin= 0 eV Emax= 2 MeV deltaVI BetheBloch : Emin= 2 MeV Emax= 100 TeV deltaVI hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=240 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=240 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -323,31 +399,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.05 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV deltaVI + Bragg : Emin= 0 eV Emax=1.05231 MeV deltaVI BetheBloch : Emin=1.05231 MeV Emax= 100 TeV deltaVI hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=240 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=240 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -355,31 +431,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.05 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV deltaVI + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV deltaVI BetheBloch : Emin=1.05231 MeV Emax= 100 TeV deltaVI hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=240 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=240 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -387,32 +463,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.05 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV deltaVI + Bragg : Emin= 0 eV Emax= 200 keV deltaVI BetheBloch : Emin= 200 keV Emax= 1 GeV deltaVI MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=240 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=240 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -420,28 +496,28 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.05 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV deltaVI + ICRU73QO : Emin= 0 eV Emax= 200 keV deltaVI BetheBloch : Emin= 200 keV Emax= 1 GeV deltaVI MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ======================================================= ====== ParticleHP Physics Parameters ======== @@ -459,7 +535,7 @@ CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=240 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=240 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -467,31 +543,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.05 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV deltaVI + Bragg : Emin= 0 eV Emax=297.505 keV deltaVI BetheBloch : Emin=297.505 keV Emax= 100 TeV deltaVI hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 20 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=240 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=240 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=3 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -499,27 +575,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 StepFunction=(0.1, 0.05 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV deltaVI + ICRU73QO : Emin= 0 eV Emax=297.505 keV deltaVI BetheBloch : Emin=297.505 keV Emax= 100 TeV deltaVI hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 240 bins - Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 20 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -529,158 +605,158 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Process: B-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: D-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionElastic - Model: NNDiffuseElastic: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: NNDiffuseElastic: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV - Process: RadioactiveDecayBase + Process: RadioactiveDecay --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_alpha Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_deuteron Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_lambda Process: anti_lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for anti_neutron Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_proton Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_triton Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for kaon+ @@ -688,12 +764,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Process: kaon+Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- @@ -701,12 +777,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Process: kaon-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for lambda @@ -714,12 +790,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Process: lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for neutron @@ -728,27 +804,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV Model: BertiniCascade: 19.9 MeV ---> 6 GeV - Model: NeutronHPInelastic: 0 meV ---> 20 MeV - Cr_sctns: NeutronHPInelasticXS: 0 meV ---> 20 MeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: NeutronHPInelastic: 0 eV ---> 20 MeV + Cr_sctns: NeutronHPInelasticXS: 0 eV ---> 20 MeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: NeutronHPCapture: 0 meV ---> 20 MeV + Model: NeutronHPCapture: 0 eV ---> 20 MeV Model: nRadCapture: 19.9 MeV ---> 100 TeV - Cr_sctns: NeutronHPCaptureXS: 0 meV ---> 20 MeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Cr_sctns: NeutronHPCaptureXS: 0 eV ---> 20 MeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nFission - Model: NeutronHPFission: 0 meV ---> 20 MeV + Model: NeutronHPFission: 0 eV ---> 20 MeV Model: G4LFission: 19.9 MeV ---> 100 TeV - Cr_sctns: NeutronHPFissionXS: 0 meV ---> 20 MeV - Cr_sctns: ZeroXS: 0 meV ---> 100 TeV + Cr_sctns: NeutronHPFissionXS: 0 eV ---> 20 MeV + Cr_sctns: ZeroXS: 0 eV ---> 100 TeV Process: hadElastic Model: hElasticCHIPS: 19.5 MeV ---> 100 TeV - Model: NeutronHPElastic: 0 meV ---> 20 MeV - Cr_sctns: NeutronHPElasticXS: 0 meV ---> 20 MeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: NeutronHPElastic: 0 eV ---> 20 MeV + Cr_sctns: NeutronHPElasticXS: 0 eV ---> 20 MeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi+ @@ -756,12 +832,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Process: pi+Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- @@ -769,12 +845,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Process: pi-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for proton @@ -782,12 +858,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Process: protonInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- @@ -795,24 +871,24 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Process: sigma-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -835,7 +911,6 @@ Time limit for long lived isomeres (ns) 1442.7 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 1 -Electron internal conversion ID 0 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -845,21 +920,21 @@ Max 2J for sampling of angular correlations 10 Index : 0 used in the geometry : Yes Material : G4_Galactic Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 100 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 100 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_WATER Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 2.94056 keV e- 351.877 keV e+ 342.545 keV proton 100 keV + Energy thresholds : gamma 2.93549 keV e- 351.358 keV e+ 341.648 keV proton 100 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_B Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 2.7587 keV e- 570.85 keV e+ 548.291 keV proton 100 keV + Energy thresholds : gamma 2.75233 keV e- 567.818 keV e+ 548.359 keV proton 100 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -879,776 +954,773 @@ See commands in /vis/modeling/trajectories/ for other options. Run terminated. Run Summary Number of events processed : 10000 - User=22.140000s Real=37.648053s Sys=1.260000s + User=20.280000s Real=22.737924s Sys=1.020000s ###### EndOfTSRunAction ###### ============================================================ opened file mfd_tl_EnergyDeposit.out for output ============================================================ - 0 20.467471 keV - 1 322.356283 keV - 2 339.492581 keV - 3 484.958679 keV - 4 3250.399281 keV - 5 2155.491760 keV - 6 520.973316 keV - 7 935.108262 keV - 8 248.139313 keV - 9 255.899594 keV - 10 533.109860 keV - 11 1533.636277 keV - 12 1086.354239 keV - 13 94.075725 keV - 14 10.909852 keV - 15 253.158627 keV - 16 309.215984 keV - 17 333.259771 keV - 18 129.474654 keV - 19 26.338818 keV - 20 1929.263063 keV - 21 39.149980 keV - 22 2852.933594 keV - 23 2683.271788 keV - 24 37.552490 keV - 25 1054.744978 keV - 26 2006.653569 keV - 27 4591.230623 keV - 28 2066.024332 keV - 29 3497.229487 keV - 30 2163.673233 keV - 31 6858.124678 keV - 32 3975.907307 keV - 33 4889.999718 keV - 34 1384.917601 keV - 35 2017.621405 keV - 36 5105.861080 keV - 37 1411.776460 keV - 38 9217.012361 keV - 39 1561.759811 keV - 40 3281.349045 keV - 41 6635.218309 keV - 42 4799.041749 keV - 43 3251.182486 keV - 44 1410.973135 keV - 45 327.059251 keV - 46 4411.487990 keV - 47 2093.563903 keV - 48 3600.827287 keV - 49 636.797553 keV - 50 5037.551248 keV - 51 9472.778329 keV - 52 2709.165334 keV - 53 5946.151315 keV - 54 13544.341822 keV - 55 3516.338346 keV - 56 31311.864131 keV - 57 27015.525399 keV - 58 21690.531480 keV - 59 4319.070946 keV - 60 10732.949319 keV - 61 26246.088577 keV - 62 18326.955423 keV - 63 11444.776100 keV - 64 5282.749258 keV - 65 6166.924536 keV - 66 20045.904412 keV - 67 17907.538870 keV - 68 23041.719011 keV - 69 4730.589032 keV - 70 6053.681091 keV - 71 8126.028267 keV - 72 7923.429990 keV - 73 8111.327834 keV - 74 3205.843285 keV - 75 23102.447255 keV - 76 32755.499794 keV - 77 41864.195186 keV - 78 29279.011194 keV - 79 27913.219951 keV - 80 24466.084471 keV - 81 392032.414226 keV - 82 330559.495720 keV - 83 403316.606422 keV - 84 37934.539161 keV - 85 41243.763643 keV - 86 373315.950693 keV - 87 298868.818890 keV - 88 334837.410599 keV - 89 29834.422433 keV - 90 32172.459637 keV - 91 314660.203296 keV - 92 319015.906880 keV - 93 405968.969077 keV - 94 24613.358893 keV - 95 16792.589147 keV - 96 33896.326929 keV - 97 36369.806387 keV - 98 32970.137494 keV - 99 19812.733770 keV - 100 316058.085343 keV - 101 372105.273041 keV - 102 356018.675027 keV - 103 312062.497611 keV - 104 361017.525376 keV - 105 353703.183018 keV - 106 422366.825440 keV - 107 386499.464995 keV - 108 381488.590070 keV - 109 333995.252165 keV - 110 342915.148636 keV - 111 400116.902575 keV - 112 416161.060276 keV - 113 394536.520485 keV - 114 372494.305849 keV - 115 382783.249699 keV - 116 389326.111891 keV - 117 377580.689646 keV - 118 380947.495409 keV - 119 352093.835755 keV - 120 313057.319579 keV - 121 355240.533018 keV - 122 363178.546889 keV - 123 355937.158969 keV - 124 307385.988818 keV - 0 20.4675 [sigma: 0 | error: 0 | coeff: 0 | eff: 1 | fom: 1 | r2int: -1.11022e-16 | r2eff: 0 | hits: 1 ] keV - 1 322.356 [sigma: 129.622 | error: 0.804216 | coeff: 0.804216 | eff: 1 | fom: 0.0672243 | r2int: 0.485073 | r2eff: 0 | hits: 4 ] keV - 2 339.493 [sigma: 163.372 | error: 0.833505 | coeff: 0.833505 | eff: 1 | fom: 0.062583 | r2int: 0.463153 | r2eff: 0 | hits: 3 ] keV - 3 484.959 [sigma: 108.489 | error: 0.447417 | coeff: 0.447417 | eff: 1 | fom: 0.217194 | r2int: 0.150136 | r2eff: 0 | hits: 4 ] keV - 4 3250.4 [sigma: 851.944 | error: 0.524209 | coeff: 0.524209 | eff: 1 | fom: 0.158221 | r2int: 0.206096 | r2eff: 0 | hits: 4 ] keV - 5 2155.49 [sigma: 1135.88 | error: 0.912735 | coeff: 0.912735 | eff: 1 | fom: 0.0521894 | r2int: 0.55539 | r2eff: 0 | hits: 3 ] keV - 6 520.973 [sigma: 150.61 | error: 0.578187 | coeff: 0.578187 | eff: 1 | fom: 0.130057 | r2int: 0.250726 | r2eff: 0 | hits: 4 ] keV - 7 935.108 [sigma: 398.24 | error: 0.602279 | coeff: 0.602279 | eff: 1 | fom: 0.119861 | r2int: 0.18137 | r2eff: 0 | hits: 2 ] keV - 8 248.139 [sigma: 21.0895 | error: 0.190045 | coeff: 0.190045 | eff: 1 | fom: 1.20381 | r2int: 0.0288937 | r2eff: 0 | hits: 5 ] keV - 9 255.9 [sigma: 81.8781 | error: 0.639924 | coeff: 0.639924 | eff: 1 | fom: 0.106173 | r2int: 0.307127 | r2eff: 0 | hits: 4 ] keV - 10 533.11 [sigma: 33.9997 | error: 0.0901932 | coeff: 0.0901932 | eff: 1 | fom: 5.34471 | r2int: 0.00406741 | r2eff: 0 | hits: 2 ] keV - 11 1533.64 [sigma: 1007.77 | error: 0.929292 | coeff: 0.929292 | eff: 1 | fom: 0.0503463 | r2int: 0.431792 | r2eff: 0 | hits: 2 ] keV - 12 1086.35 [sigma: 221.033 | error: 0.49838 | coeff: 0.49838 | eff: 1 | fom: 0.175045 | r2int: 0.206986 | r2eff: 0 | hits: 6 ] keV - 13 94.0757 [sigma: 16.0921 | error: 0.382491 | coeff: 0.382491 | eff: 1 | fom: 0.297188 | r2int: 0.117039 | r2eff: 0 | hits: 5 ] keV - 14 10.9099 [sigma: 3.01958 | error: 0.479389 | coeff: 0.479389 | eff: 1 | fom: 0.189189 | r2int: 0.153209 | r2eff: 0 | hits: 3 ] keV - 15 253.159 [sigma: 76.5836 | error: 0.523967 | coeff: 0.523967 | eff: 1 | fom: 0.158367 | r2int: 0.183027 | r2eff: 0 | hits: 3 ] keV - 16 309.216 [sigma: 88.9662 | error: 0.643351 | coeff: 0.643351 | eff: 1 | fom: 0.105045 | r2int: 0.331121 | r2eff: 0 | hits: 5 ] keV - 17 333.26 [sigma: 32.34 | error: 0.291124 | coeff: 0.291124 | eff: 1 | fom: 0.512998 | r2int: 0.0753363 | r2eff: 0 | hits: 9 ] keV - 18 129.475 [sigma: 46.1559 | error: 0.712972 | coeff: 0.712972 | eff: 1 | fom: 0.0855318 | r2int: 0.381247 | r2eff: 0 | hits: 4 ] keV - 19 26.3388 [sigma: 0 | error: 0 | coeff: 0 | eff: 1 | fom: 1 | r2int: 2.22045e-16 | r2eff: 0 | hits: 1 ] keV - 20 1929.26 [sigma: 1311.92 | error: 0.961681 | coeff: 0.961681 | eff: 1 | fom: 0.0470121 | r2int: 0.462415 | r2eff: 0 | hits: 2 ] keV - 21 39.15 [sigma: 0 | error: 0 | coeff: 0 | eff: 1 | fom: 1 | r2int: 2.22045e-16 | r2eff: 0 | hits: 1 ] keV - 22 2852.93 [sigma: 371.705 | error: 0.319141 | coeff: 0.319141 | eff: 1 | fom: 0.426881 | r2int: 0.0848759 | r2eff: 0 | hits: 6 ] keV - 23 2683.27 [sigma: 957.422 | error: 0.713623 | coeff: 0.713623 | eff: 1 | fom: 0.0853757 | r2int: 0.381943 | r2eff: 0 | hits: 4 ] keV - 24 37.5525 [sigma: 21.9631 | error: 0.827121 | coeff: 0.827121 | eff: 1 | fom: 0.0635527 | r2int: 0.342065 | r2eff: 0 | hits: 2 ] keV - 25 1054.74 [sigma: 143.097 | error: 0.449967 | coeff: 0.449967 | eff: 1 | fom: 0.214739 | r2int: 0.184064 | r2eff: 0 | hits: 11 ] keV - 26 2006.65 [sigma: 304.852 | error: 0.526268 | coeff: 0.526268 | eff: 1 | fom: 0.156985 | r2int: 0.253878 | r2eff: 0 | hits: 12 ] keV - 27 4591.23 [sigma: 735.952 | error: 0.480886 | coeff: 0.480886 | eff: 1 | fom: 0.188013 | r2int: 0.205556 | r2eff: 0 | hits: 9 ] keV - 28 2066.02 [sigma: 235.245 | error: 0.455455 | coeff: 0.455455 | eff: 1 | fom: 0.209595 | r2int: 0.194474 | r2eff: 0 | hits: 16 ] keV - 29 3497.23 [sigma: 425.093 | error: 0.454803 | coeff: 0.454803 | eff: 1 | fom: 0.210196 | r2int: 0.192071 | r2eff: 0 | hits: 14 ] keV - 30 2163.67 [sigma: 296.885 | error: 0.475322 | coeff: 0.475322 | eff: 1 | fom: 0.19244 | r2int: 0.207103 | r2eff: 0 | hits: 12 ] keV - 31 6858.12 [sigma: 555.353 | error: 0.404887 | coeff: 0.404887 | eff: 1 | fom: 0.265219 | r2int: 0.157376 | r2eff: 0 | hits: 25 ] keV - 32 3975.91 [sigma: 574.619 | error: 0.540764 | coeff: 0.540764 | eff: 1 | fom: 0.148681 | r2int: 0.271538 | r2eff: 0 | hits: 14 ] keV - 33 4890 [sigma: 511.327 | error: 0.467632 | coeff: 0.467632 | eff: 1 | fom: 0.198821 | r2int: 0.207746 | r2eff: 0 | hits: 20 ] keV - 34 1384.92 [sigma: 164.642 | error: 0.460429 | coeff: 0.460429 | eff: 1 | fom: 0.205091 | r2int: 0.197862 | r2eff: 0 | hits: 15 ] keV - 35 2017.62 [sigma: 463.598 | error: 0.607927 | coeff: 0.607927 | eff: 1 | fom: 0.117644 | r2int: 0.316778 | r2eff: 0 | hits: 7 ] keV - 36 5105.86 [sigma: 422.353 | error: 0.379067 | coeff: 0.379067 | eff: 1 | fom: 0.30258 | r2int: 0.136849 | r2eff: 0 | hits: 21 ] keV - 37 1411.78 [sigma: 102.908 | error: 0.349579 | coeff: 0.349579 | eff: 1 | fom: 0.355779 | r2int: 0.116892 | r2eff: 0 | hits: 23 ] keV - 38 9217.01 [sigma: 969.404 | error: 0.43365 | coeff: 0.43365 | eff: 1 | fom: 0.231203 | r2int: 0.17699 | r2eff: 0 | hits: 17 ] keV - 39 1561.76 [sigma: 128.486 | error: 0.307827 | coeff: 0.307827 | eff: 1 | fom: 0.458836 | r2int: 0.0879893 | r2eff: 0 | hits: 14 ] keV - 40 3281.35 [sigma: 487.238 | error: 0.555588 | coeff: 0.555588 | eff: 1 | fom: 0.140853 | r2int: 0.28663 | r2eff: 0 | hits: 14 ] keV - 41 6635.22 [sigma: 677.298 | error: 0.381934 | coeff: 0.381934 | eff: 1 | fom: 0.298054 | r2int: 0.135454 | r2eff: 0 | hits: 14 ] keV - 42 4799.04 [sigma: 510.145 | error: 0.487135 | coeff: 0.487135 | eff: 1 | fom: 0.183221 | r2int: 0.226 | r2eff: 0 | hits: 21 ] keV - 43 3251.18 [sigma: 325.919 | error: 0.491105 | coeff: 0.491105 | eff: 1 | fom: 0.18027 | r2int: 0.231135 | r2eff: 0 | hits: 24 ] keV - 44 1410.97 [sigma: 141.994 | error: 0.402541 | coeff: 0.402541 | eff: 1 | fom: 0.268319 | r2int: 0.151912 | r2eff: 0 | hits: 16 ] keV - 45 327.059 [sigma: 29.4875 | error: 0.270478 | coeff: 0.270478 | eff: 1 | fom: 0.594301 | r2int: 0.0650299 | r2eff: 0 | hits: 9 ] keV - 46 4411.49 [sigma: 650.74 | error: 0.531856 | coeff: 0.531856 | eff: 1 | fom: 0.153703 | r2int: 0.261112 | r2eff: 0 | hits: 13 ] keV - 47 2093.56 [sigma: 245.24 | error: 0.35142 | coeff: 0.35142 | eff: 1 | fom: 0.352062 | r2int: 0.109774 | r2eff: 0 | hits: 9 ] keV - 48 3600.83 [sigma: 579.396 | error: 0.557396 | coeff: 0.557396 | eff: 1 | fom: 0.139941 | r2int: 0.284799 | r2eff: 0 | hits: 12 ] keV - 49 636.798 [sigma: 97.9764 | error: 0.40707 | coeff: 0.40707 | eff: 1 | fom: 0.262382 | r2int: 0.142034 | r2eff: 0 | hits: 7 ] keV - 50 5037.55 [sigma: 345.163 | error: 0.393606 | coeff: 0.393606 | eff: 1 | fom: 0.28064 | r2int: 0.150231 | r2eff: 0 | hits: 33 ] keV - 51 9472.78 [sigma: 499.497 | error: 0.320742 | coeff: 0.320742 | eff: 1 | fom: 0.42263 | r2int: 0.100095 | r2eff: 0 | hits: 37 ] keV - 52 2709.17 [sigma: 188.637 | error: 0.399989 | coeff: 0.399989 | eff: 1 | fom: 0.271754 | r2int: 0.155143 | r2eff: 0 | hits: 33 ] keV - 53 5946.15 [sigma: 350.453 | error: 0.363317 | coeff: 0.363317 | eff: 1 | fom: 0.329383 | r2int: 0.128525 | r2eff: 0 | hits: 38 ] keV - 54 13544.3 [sigma: 701.826 | error: 0.283813 | coeff: 0.283813 | eff: 1 | fom: 0.539769 | r2int: 0.0778648 | r2eff: 0 | hits: 30 ] keV - 55 3516.34 [sigma: 226.578 | error: 0.375722 | coeff: 0.375722 | eff: 1 | fom: 0.307992 | r2int: 0.137015 | r2eff: 0 | hits: 34 ] keV - 56 31311.9 [sigma: 895.731 | error: 0.221587 | coeff: 0.221587 | eff: 1 | fom: 0.88549 | r2int: 0.0482824 | r2eff: 0 | hits: 60 ] keV - 57 27015.5 [sigma: 703.393 | error: 0.22847 | coeff: 0.22847 | eff: 1 | fom: 0.832938 | r2int: 0.0515208 | r2eff: 0 | hits: 77 ] keV - 58 21690.5 [sigma: 708.917 | error: 0.253163 | coeff: 0.253163 | eff: 1 | fom: 0.678376 | r2int: 0.0630235 | r2eff: 0 | hits: 60 ] keV - 59 4319.07 [sigma: 334.161 | error: 0.416643 | coeff: 0.416643 | eff: 1 | fom: 0.250463 | r2int: 0.167606 | r2eff: 0 | hits: 29 ] keV - 60 10732.9 [sigma: 417.044 | error: 0.266386 | coeff: 0.266386 | eff: 1 | fom: 0.612701 | r2int: 0.0694518 | r2eff: 0 | hits: 47 ] keV - 61 26246.1 [sigma: 663.47 | error: 0.215982 | coeff: 0.215982 | eff: 1 | fom: 0.932042 | r2int: 0.0460094 | r2eff: 0 | hits: 73 ] keV - 62 18327 [sigma: 503.727 | error: 0.239614 | coeff: 0.239614 | eff: 1 | fom: 0.757265 | r2int: 0.0566594 | r2eff: 0 | hits: 76 ] keV - 63 11444.8 [sigma: 273.643 | error: 0.208441 | coeff: 0.208441 | eff: 1 | fom: 1.0007 | r2int: 0.042876 | r2eff: 0 | hits: 76 ] keV - 64 5282.75 [sigma: 279.922 | error: 0.317928 | coeff: 0.317928 | eff: 1 | fom: 0.430144 | r2int: 0.0982705 | r2eff: 0 | hits: 36 ] keV - 65 6166.92 [sigma: 376.081 | error: 0.375928 | coeff: 0.375928 | eff: 1 | fom: 0.307654 | r2int: 0.137603 | r2eff: 0 | hits: 38 ] keV - 66 20045.9 [sigma: 797.026 | error: 0.27832 | coeff: 0.27832 | eff: 1 | fom: 0.561283 | r2int: 0.0758814 | r2eff: 0 | hits: 49 ] keV - 67 17907.5 [sigma: 498.209 | error: 0.24571 | coeff: 0.24571 | eff: 1 | fom: 0.720155 | r2int: 0.0595995 | r2eff: 0 | hits: 78 ] keV - 68 23041.7 [sigma: 669.906 | error: 0.248405 | coeff: 0.248405 | eff: 1 | fom: 0.704614 | r2int: 0.0608598 | r2eff: 0 | hits: 73 ] keV - 69 4730.59 [sigma: 435.93 | error: 0.478832 | coeff: 0.478832 | eff: 1 | fom: 0.189629 | r2int: 0.220789 | r2eff: 0 | hits: 27 ] keV - 70 6053.68 [sigma: 465.503 | error: 0.360674 | coeff: 0.360674 | eff: 1 | fom: 0.334229 | r2int: 0.124172 | r2eff: 0 | hits: 22 ] keV - 71 8126.03 [sigma: 521.726 | error: 0.363195 | coeff: 0.363195 | eff: 1 | fom: 0.329605 | r2int: 0.127788 | r2eff: 0 | hits: 32 ] keV - 72 7923.43 [sigma: 467.824 | error: 0.37806 | coeff: 0.37806 | eff: 1 | fom: 0.304194 | r2int: 0.139444 | r2eff: 0 | hits: 41 ] keV - 73 8111.33 [sigma: 473.661 | error: 0.340499 | coeff: 0.340499 | eff: 1 | fom: 0.375009 | r2int: 0.112529 | r2eff: 0 | hits: 34 ] keV - 74 3205.84 [sigma: 391.457 | error: 0.585607 | coeff: 0.585607 | eff: 1 | fom: 0.126783 | r2int: 0.328025 | r2eff: 0 | hits: 23 ] keV - 75 23102.4 [sigma: 357.194 | error: 0.171474 | coeff: 0.171474 | eff: 1 | fom: 1.47868 | r2int: 0.0291644 | r2eff: 0 | hits: 123 ] keV - 76 32755.5 [sigma: 431.143 | error: 0.171617 | coeff: 0.171617 | eff: 1 | fom: 1.47621 | r2int: 0.0292793 | r2eff: 0 | hits: 170 ] keV - 77 41864.2 [sigma: 502.414 | error: 0.161458 | coeff: 0.161458 | eff: 1 | fom: 1.66784 | r2int: 0.0259245 | r2eff: 0 | hits: 181 ] keV - 78 29279 [sigma: 340.427 | error: 0.145686 | coeff: 0.145686 | eff: 1 | fom: 2.04851 | r2int: 0.0210892 | r2eff: 0 | hits: 157 ] keV - 79 27913.2 [sigma: 478.825 | error: 0.187129 | coeff: 0.187129 | eff: 1 | fom: 1.24163 | r2int: 0.0347229 | r2eff: 0 | hits: 119 ] keV - 80 24466.1 [sigma: 368.69 | error: 0.17894 | coeff: 0.17894 | eff: 1 | fom: 1.35787 | r2int: 0.0317924 | r2eff: 0 | hits: 141 ] keV - 81 392032 [sigma: 1141.13 | error: 0.0486201 | coeff: 0.0486201 | eff: 1 | fom: 18.3925 | r2int: 0.00235544 | r2eff: 0 | hits: 279 ] keV - 82 330559 [sigma: 1145.66 | error: 0.0571599 | coeff: 0.0571599 | eff: 1 | fom: 13.3073 | r2int: 0.00325524 | r2eff: 0 | hits: 272 ] keV - 83 403317 [sigma: 1116.45 | error: 0.0463206 | coeff: 0.0463206 | eff: 1 | fom: 20.264 | r2int: 0.00213793 | r2eff: 0 | hits: 280 ] keV - 84 37934.5 [sigma: 489.526 | error: 0.158573 | coeff: 0.158573 | eff: 1 | fom: 1.72907 | r2int: 0.0249789 | r2eff: 0 | hits: 151 ] keV - 85 41243.8 [sigma: 471.288 | error: 0.152454 | coeff: 0.152454 | eff: 1 | fom: 1.87067 | r2int: 0.0231116 | r2eff: 0 | hits: 178 ] keV - 86 373316 [sigma: 1154.15 | error: 0.052284 | coeff: 0.052284 | eff: 1 | fom: 15.9051 | r2int: 0.00272405 | r2eff: 0 | hits: 286 ] keV - 87 298869 [sigma: 1130.9 | error: 0.062977 | coeff: 0.062977 | eff: 1 | fom: 10.9625 | r2int: 0.00395178 | r2eff: 0 | hits: 277 ] keV - 88 334837 [sigma: 1120.28 | error: 0.0565819 | coeff: 0.0565819 | eff: 1 | fom: 13.5805 | r2int: 0.00319032 | r2eff: 0 | hits: 286 ] keV - 89 29834.4 [sigma: 369.355 | error: 0.163306 | coeff: 0.163306 | eff: 1 | fom: 1.63031 | r2int: 0.0265155 | r2eff: 0 | hits: 174 ] keV - 90 32172.5 [sigma: 464.115 | error: 0.177854 | coeff: 0.177854 | eff: 1 | fom: 1.37451 | r2int: 0.0314238 | r2eff: 0 | hits: 152 ] keV - 91 314660 [sigma: 1123.01 | error: 0.0567677 | coeff: 0.0567677 | eff: 1 | fom: 13.4918 | r2int: 0.00320984 | r2eff: 0 | hits: 253 ] keV - 92 319016 [sigma: 1140.04 | error: 0.0591538 | coeff: 0.0591538 | eff: 1 | fom: 12.4253 | r2int: 0.0034864 | r2eff: 0 | hits: 274 ] keV - 93 405969 [sigma: 1141.37 | error: 0.0462825 | coeff: 0.0462825 | eff: 1 | fom: 20.2973 | r2int: 0.00213417 | r2eff: 0 | hits: 271 ] keV - 94 24613.4 [sigma: 354.809 | error: 0.172382 | coeff: 0.172382 | eff: 1 | fom: 1.46315 | r2int: 0.0295077 | r2eff: 0 | hits: 143 ] keV - 95 16792.6 [sigma: 388.831 | error: 0.238395 | coeff: 0.238395 | eff: 1 | fom: 0.765032 | r2int: 0.0562958 | r2eff: 0 | hits: 106 ] keV - 96 33896.3 [sigma: 395.599 | error: 0.148546 | coeff: 0.148546 | eff: 1 | fom: 1.97039 | r2int: 0.0219296 | r2eff: 0 | hits: 162 ] keV - 97 36369.8 [sigma: 430.103 | error: 0.15866 | coeff: 0.15866 | eff: 1 | fom: 1.72718 | r2int: 0.0250332 | r2eff: 0 | hits: 180 ] keV - 98 32970.1 [sigma: 398.726 | error: 0.164045 | coeff: 0.164045 | eff: 1 | fom: 1.61565 | r2int: 0.0267644 | r2eff: 0 | hits: 184 ] keV - 99 19812.7 [sigma: 370.468 | error: 0.207376 | coeff: 0.207376 | eff: 1 | fom: 1.01101 | r2int: 0.0426552 | r2eff: 0 | hits: 123 ] keV - 100 316058 [sigma: 444.734 | error: 0.0340629 | coeff: 0.0340629 | eff: 1 | fom: 37.4721 | r2int: 0.0011583 | r2eff: 0 | hits: 586 ] keV - 101 372105 [sigma: 467.716 | error: 0.0333742 | coeff: 0.0333742 | eff: 1 | fom: 39.0347 | r2int: 0.00111226 | r2eff: 0 | hits: 705 ] keV - 102 356019 [sigma: 496.824 | error: 0.036417 | coeff: 0.036417 | eff: 1 | fom: 32.7842 | r2int: 0.00132425 | r2eff: 0 | hits: 681 ] keV - 103 312062 [sigma: 464.8 | error: 0.0390677 | coeff: 0.0390677 | eff: 1 | fom: 28.4863 | r2int: 0.00152407 | r2eff: 0 | hits: 688 ] keV - 104 361018 [sigma: 457.37 | error: 0.031469 | coeff: 0.031469 | eff: 1 | fom: 43.9043 | r2int: 0.00098869 | r2eff: 0 | hits: 617 ] keV - 105 353703 [sigma: 489.646 | error: 0.0366 | coeff: 0.0366 | eff: 1 | fom: 32.4571 | r2int: 0.00133765 | r2eff: 0 | hits: 699 ] keV - 106 422367 [sigma: 513.867 | error: 0.0362141 | coeff: 0.0362141 | eff: 1 | fom: 33.1525 | r2int: 0.00130998 | r2eff: 0 | hits: 886 ] keV - 107 386499 [sigma: 466.419 | error: 0.0362033 | coeff: 0.0362033 | eff: 1 | fom: 33.1723 | r2int: 0.00130922 | r2eff: 0 | hits: 900 ] keV - 108 381489 [sigma: 476.295 | error: 0.0365285 | coeff: 0.0365285 | eff: 1 | fom: 32.5843 | r2int: 0.00133277 | r2eff: 0 | hits: 856 ] keV - 109 333995 [sigma: 477.68 | error: 0.0382695 | coeff: 0.0382695 | eff: 1 | fom: 29.6869 | r2int: 0.00146251 | r2eff: 0 | hits: 716 ] keV - 110 342915 [sigma: 473.663 | error: 0.0369864 | coeff: 0.0369864 | eff: 1 | fom: 31.7824 | r2int: 0.00136609 | r2eff: 0 | hits: 717 ] keV - 111 400117 [sigma: 478.491 | error: 0.0360553 | coeff: 0.0360553 | eff: 1 | fom: 32.0517 | r2int: 0.00129855 | r2eff: 0 | hits: 909 ] keV - 112 416161 [sigma: 511.389 | error: 0.0364943 | coeff: 0.0364943 | eff: 1 | fom: 31.2853 | r2int: 0.00133032 | r2eff: 0 | hits: 882 ] keV - 113 394537 [sigma: 500.947 | error: 0.037451 | coeff: 0.037451 | eff: 1 | fom: 29.7071 | r2int: 0.00140097 | r2eff: 0 | hits: 870 ] keV - 114 372494 [sigma: 457.493 | error: 0.0323553 | coeff: 0.0323553 | eff: 1 | fom: 39.8014 | r2int: 0.00104535 | r2eff: 0 | hits: 694 ] keV - 115 382783 [sigma: 459.148 | error: 0.032342 | coeff: 0.032342 | eff: 1 | fom: 39.834 | r2int: 0.00104457 | r2eff: 0 | hits: 727 ] keV - 116 389326 [sigma: 455.607 | error: 0.0342784 | coeff: 0.0342784 | eff: 1 | fom: 35.4608 | r2int: 0.00117364 | r2eff: 0 | hits: 858 ] keV - 117 377581 [sigma: 491.356 | error: 0.038029 | coeff: 0.038029 | eff: 1 | fom: 28.811 | r2int: 0.00144451 | r2eff: 0 | hits: 854 ] keV - 118 380947 [sigma: 466.398 | error: 0.035883 | coeff: 0.035883 | eff: 1 | fom: 32.3603 | r2int: 0.00128609 | r2eff: 0 | hits: 859 ] keV - 119 352094 [sigma: 448.009 | error: 0.0338089 | coeff: 0.0338089 | eff: 1 | fom: 36.4525 | r2int: 0.00114142 | r2eff: 0 | hits: 706 ] keV - 120 313057 [sigma: 460.86 | error: 0.034868 | coeff: 0.034868 | eff: 1 | fom: 34.2717 | r2int: 0.00121361 | r2eff: 0 | hits: 561 ] keV - 121 355241 [sigma: 500.243 | error: 0.037654 | coeff: 0.037654 | eff: 1 | fom: 29.3877 | r2int: 0.00141584 | r2eff: 0 | hits: 715 ] keV - 122 363179 [sigma: 482.416 | error: 0.0356672 | coeff: 0.0356672 | eff: 1 | fom: 32.7529 | r2int: 0.00127039 | r2eff: 0 | hits: 721 ] keV - 123 355937 [sigma: 492.166 | error: 0.0365052 | coeff: 0.0365052 | eff: 1 | fom: 31.2665 | r2int: 0.00133072 | r2eff: 0 | hits: 697 ] keV - 124 307386 [sigma: 433.239 | error: 0.033204 | coeff: 0.033204 | eff: 1 | fom: 37.7928 | r2int: 0.00110052 | r2eff: 0 | hits: 555 ] keV + 0 97.126468 keV + 1 83.608548 keV + 2 93.037557 keV + 3 138.191013 keV + 4 1144.639741 keV + 5 1977.021639 keV + 6 738.334889 keV + 8 613.258720 keV + 9 1266.634060 keV + 10 461.439053 keV + 11 364.354752 keV + 12 437.055908 keV + 13 760.002191 keV + 14 1862.458149 keV + 15 2555.836878 keV + 16 496.943687 keV + 17 427.845305 keV + 18 262.162576 keV + 19 950.275669 keV + 20 2041.991467 keV + 21 3064.636122 keV + 22 106.890085 keV + 23 86.203499 keV + 24 55.209628 keV + 25 4094.872253 keV + 26 2964.466048 keV + 27 778.641524 keV + 28 2540.374972 keV + 29 4536.405843 keV + 30 1885.843732 keV + 31 5358.453020 keV + 32 9765.678221 keV + 33 12495.258267 keV + 34 3036.050622 keV + 35 1792.405767 keV + 36 1387.819501 keV + 37 13791.871410 keV + 38 836.733630 keV + 39 4178.981881 keV + 40 2052.907868 keV + 41 3295.595367 keV + 42 1824.914499 keV + 43 6354.451437 keV + 44 1947.780233 keV + 45 3946.773097 keV + 46 1414.302458 keV + 47 300.008841 keV + 48 1802.685679 keV + 49 597.446744 keV + 50 7306.086406 keV + 51 7311.836609 keV + 52 9088.094627 keV + 53 6465.700190 keV + 54 4743.821740 keV + 55 8664.908931 keV + 56 20036.310720 keV + 57 26322.881350 keV + 58 16420.125765 keV + 59 9068.718078 keV + 60 5145.185239 keV + 61 20475.497388 keV + 62 24350.322630 keV + 63 30254.726052 keV + 64 5937.732322 keV + 65 9636.858207 keV + 66 19964.669553 keV + 67 18520.431153 keV + 68 18623.465948 keV + 69 7004.086999 keV + 70 3912.866492 keV + 71 8850.425594 keV + 72 4020.803756 keV + 73 5565.659964 keV + 74 6113.413647 keV + 75 25198.349098 keV + 76 42631.636288 keV + 77 39165.023845 keV + 78 39845.772036 keV + 79 16769.162360 keV + 80 34773.355055 keV + 81 350202.153466 keV + 82 326208.956360 keV + 83 373588.200066 keV + 84 30713.021368 keV + 85 33024.590137 keV + 86 302387.081582 keV + 87 260747.075926 keV + 88 325093.207564 keV + 89 40319.571080 keV + 90 27750.167758 keV + 91 349844.791877 keV + 92 289443.035975 keV + 93 349641.511703 keV + 94 22103.173845 keV + 95 24521.811416 keV + 96 33132.530967 keV + 97 38244.308721 keV + 98 35076.046266 keV + 99 30547.595283 keV + 100 313077.079071 keV + 101 383097.566323 keV + 102 392489.816408 keV + 103 346505.985327 keV + 104 360394.637576 keV + 105 358697.203553 keV + 106 376485.475295 keV + 107 356281.429146 keV + 108 398905.171807 keV + 109 396659.165829 keV + 110 383246.456275 keV + 111 367468.002984 keV + 112 414311.768324 keV + 113 423084.424988 keV + 114 379863.187750 keV + 115 365049.089278 keV + 116 408186.846340 keV + 117 381769.210181 keV + 118 382783.339401 keV + 119 364916.666201 keV + 120 343893.329653 keV + 121 326520.998382 keV + 122 370895.608938 keV + 123 336348.709798 keV + 124 334615.525072 keV + 0 97.1265 [sigma: 25.357 | error: 0.45219 | coeff: 0.45219 | eff: 1 | fom: 0.232883 | r2int: 0.136317 | r2eff: 0 | hits: 3 ] keV + 1 83.6085 [sigma: 17.8733 | error: 0.427548 | coeff: 0.427548 | eff: 1 | fom: 0.260502 | r2int: 0.137098 | r2eff: 0 | hits: 4 ] keV + 2 93.0376 [sigma: 54.9054 | error: 0.834587 | coeff: 0.834587 | eff: 1 | fom: 0.0683656 | r2int: 0.348268 | r2eff: 0 | hits: 2 ] keV + 3 138.191 [sigma: 8.70717 | error: 0.0891071 | coeff: 0.0891071 | eff: 1 | fom: 5.9973 | r2int: 0.00397004 | r2eff: 0 | hits: 2 ] keV + 4 1144.64 [sigma: 635.088 | error: 0.961006 | coeff: 0.961006 | eff: 1 | fom: 0.0515619 | r2int: 0.615688 | r2eff: 0 | hits: 3 ] keV + 5 1977.02 [sigma: 820.091 | error: 0.927546 | coeff: 0.927546 | eff: 1 | fom: 0.055349 | r2int: 0.688273 | r2eff: 0 | hits: 5 ] keV + 6 738.335 [sigma: 206.837 | error: 0.560281 | coeff: 0.560281 | eff: 1 | fom: 0.151694 | r2int: 0.235436 | r2eff: 0 | hits: 4 ] keV + 8 613.259 [sigma: 111.409 | error: 0.444992 | coeff: 0.444992 | eff: 1 | fom: 0.240478 | r2int: 0.165015 | r2eff: 0 | hits: 6 ] keV + 9 1266.63 [sigma: 384.455 | error: 0.607049 | coeff: 0.607049 | eff: 1 | fom: 0.129221 | r2int: 0.276382 | r2eff: 0 | hits: 4 ] keV + 10 461.439 [sigma: 51.1763 | error: 0.271663 | coeff: 0.271663 | eff: 1 | fom: 0.645239 | r2int: 0.0615005 | r2eff: 0 | hits: 6 ] keV + 11 364.355 [sigma: 48.2753 | error: 0.350549 | coeff: 0.350549 | eff: 1 | fom: 0.387509 | r2int: 0.10533 | r2eff: 0 | hits: 7 ] keV + 12 437.056 [sigma: 187.808 | error: 0.960865 | coeff: 0.960865 | eff: 1 | fom: 0.051577 | r2int: 0.738608 | r2eff: 0 | hits: 5 ] keV + 13 760.002 [sigma: 111.475 | error: 0.32798 | coeff: 0.32798 | eff: 1 | fom: 0.442675 | r2int: 0.0860568 | r2eff: 0 | hits: 5 ] keV + 14 1862.46 [sigma: 945.224 | error: 0.87904 | coeff: 0.87904 | eff: 1 | fom: 0.0616259 | r2int: 0.515141 | r2eff: 0 | hits: 3 ] keV + 15 2555.84 [sigma: 562.243 | error: 0.659952 | coeff: 0.659952 | eff: 1 | fom: 0.109334 | r2int: 0.387143 | r2eff: 0 | hits: 9 ] keV + 16 496.944 [sigma: 73.1939 | error: 0.389688 | coeff: 0.389688 | eff: 1 | fom: 0.313579 | r2int: 0.130163 | r2eff: 0 | hits: 7 ] keV + 17 427.845 [sigma: 146.918 | error: 0.767846 | coeff: 0.767846 | eff: 1 | fom: 0.0807667 | r2int: 0.47167 | r2eff: 0 | hits: 5 ] keV + 18 262.163 [sigma: 45.9603 | error: 0.350625 | coeff: 0.350625 | eff: 1 | fom: 0.387343 | r2int: 0.0922032 | r2eff: 0 | hits: 4 ] keV + 19 950.276 [sigma: 648.861 | error: 0.965644 | coeff: 0.965644 | eff: 1 | fom: 0.0510677 | r2int: 0.466234 | r2eff: 0 | hits: 2 ] keV + 20 2041.99 [sigma: 872.199 | error: 0.854263 | coeff: 0.854263 | eff: 1 | fom: 0.0652526 | r2int: 0.547324 | r2eff: 0 | hits: 4 ] keV + 21 3064.64 [sigma: 701.934 | error: 0.605991 | coeff: 0.605991 | eff: 1 | fom: 0.129673 | r2int: 0.314765 | r2eff: 0 | hits: 7 ] keV + 22 106.89 [sigma: 24.909 | error: 0.466068 | coeff: 0.466068 | eff: 1 | fom: 0.219221 | r2int: 0.162914 | r2eff: 0 | hits: 4 ] keV + 23 86.2035 [sigma: 55.5592 | error: 0.911477 | coeff: 0.911477 | eff: 1 | fom: 0.0573177 | r2int: 0.415396 | r2eff: 0 | hits: 2 ] keV + 24 55.2096 [sigma: 32.3444 | error: 0.828513 | coeff: 0.828513 | eff: 1 | fom: 0.0693717 | r2int: 0.343217 | r2eff: 0 | hits: 2 ] keV + 25 4094.87 [sigma: 673.491 | error: 0.545492 | coeff: 0.545492 | eff: 1 | fom: 0.160031 | r2int: 0.27051 | r2eff: 0 | hits: 11 ] keV + 26 2964.47 [sigma: 317.912 | error: 0.442165 | coeff: 0.442165 | eff: 1 | fom: 0.243563 | r2int: 0.18401 | r2eff: 0 | hits: 17 ] keV + 27 778.642 [sigma: 68.6827 | error: 0.305563 | coeff: 0.305563 | eff: 1 | fom: 0.510011 | r2int: 0.0855879 | r2eff: 0 | hits: 12 ] keV + 28 2540.37 [sigma: 289.924 | error: 0.3609 | coeff: 0.3609 | eff: 1 | fom: 0.365601 | r2int: 0.117224 | r2eff: 0 | hits: 10 ] keV + 29 4536.41 [sigma: 685.352 | error: 0.50107 | coeff: 0.50107 | eff: 1 | fom: 0.189664 | r2int: 0.228246 | r2eff: 0 | hits: 11 ] keV + 30 1885.84 [sigma: 287.119 | error: 0.527408 | coeff: 0.527408 | eff: 1 | fom: 0.171194 | r2int: 0.254979 | r2eff: 0 | hits: 12 ] keV + 31 5358.45 [sigma: 610.929 | error: 0.496968 | coeff: 0.496968 | eff: 1 | fom: 0.192808 | r2int: 0.233978 | r2eff: 0 | hits: 19 ] keV + 32 9765.68 [sigma: 689.048 | error: 0.373358 | coeff: 0.373358 | eff: 1 | fom: 0.341609 | r2int: 0.134418 | r2eff: 0 | hits: 28 ] keV + 33 12495.3 [sigma: 720.227 | error: 0.299507 | coeff: 0.299507 | eff: 1 | fom: 0.530845 | r2int: 0.0863818 | r2eff: 0 | hits: 27 ] keV + 34 3036.05 [sigma: 367.573 | error: 0.419397 | coeff: 0.419397 | eff: 1 | fom: 0.270726 | r2int: 0.161236 | r2eff: 0 | hits: 12 ] keV + 35 1792.41 [sigma: 611.051 | error: 0.901966 | coeff: 0.901966 | eff: 1 | fom: 0.0585329 | r2int: 0.697322 | r2eff: 0 | hits: 7 ] keV + 36 1387.82 [sigma: 96.3878 | error: 0.302737 | coeff: 0.302737 | eff: 1 | fom: 0.519576 | r2int: 0.0868261 | r2eff: 0 | hits: 19 ] keV + 37 13791.9 [sigma: 787.588 | error: 0.332978 | coeff: 0.332978 | eff: 1 | fom: 0.429487 | r2int: 0.107613 | r2eff: 0 | hits: 34 ] keV + 38 836.734 [sigma: 64.071 | error: 0.324871 | coeff: 0.324871 | eff: 1 | fom: 0.45119 | r2int: 0.0996776 | r2eff: 0 | hits: 18 ] keV + 39 4178.98 [sigma: 509.244 | error: 0.42213 | coeff: 0.42213 | eff: 1 | fom: 0.267232 | r2int: 0.163344 | r2eff: 0 | hits: 12 ] keV + 40 2052.91 [sigma: 336.395 | error: 0.43354 | coeff: 0.43354 | eff: 1 | fom: 0.25335 | r2int: 0.161106 | r2eff: 0 | hits: 7 ] keV + 41 3295.6 [sigma: 464.288 | error: 0.597709 | coeff: 0.597709 | eff: 1 | fom: 0.133291 | r2int: 0.337409 | r2eff: 0 | hits: 18 ] keV + 42 1824.91 [sigma: 196.276 | error: 0.515809 | coeff: 0.515809 | eff: 1 | fom: 0.17898 | r2int: 0.254491 | r2eff: 0 | hits: 23 ] keV + 43 6354.45 [sigma: 644.267 | error: 0.405553 | coeff: 0.405553 | eff: 1 | fom: 0.289524 | r2int: 0.154194 | r2eff: 0 | hits: 16 ] keV + 44 1947.78 [sigma: 397.495 | error: 0.645344 | coeff: 0.645344 | eff: 1 | fom: 0.11434 | r2int: 0.374822 | r2eff: 0 | hits: 10 ] keV + 45 3946.77 [sigma: 870.81 | error: 0.583755 | coeff: 0.583755 | eff: 1 | fom: 0.13974 | r2int: 0.292088 | r2eff: 0 | hits: 7 ] keV + 46 1414.3 [sigma: 265.007 | error: 0.592537 | coeff: 0.592537 | eff: 1 | fom: 0.135628 | r2int: 0.31599 | r2eff: 0 | hits: 10 ] keV + 47 300.009 [sigma: 53.6582 | error: 0.50588 | coeff: 0.50588 | eff: 1 | fom: 0.186074 | r2int: 0.223925 | r2eff: 0 | hits: 8 ] keV + 48 1802.69 [sigma: 486.005 | error: 0.852551 | coeff: 0.852551 | eff: 1 | fom: 0.0655149 | r2int: 0.654159 | r2eff: 0 | hits: 10 ] keV + 49 597.447 [sigma: 147.836 | error: 0.742337 | coeff: 0.742337 | eff: 1 | fom: 0.0864128 | r2int: 0.489835 | r2eff: 0 | hits: 9 ] keV + 50 7306.09 [sigma: 495.89 | error: 0.32551 | coeff: 0.32551 | eff: 1 | fom: 0.44942 | r2int: 0.10135 | r2eff: 0 | hits: 23 ] keV + 51 7311.84 [sigma: 338.74 | error: 0.274078 | coeff: 0.274078 | eff: 1 | fom: 0.633919 | r2int: 0.0729723 | r2eff: 0 | hits: 35 ] keV + 52 9088.09 [sigma: 434.562 | error: 0.278817 | coeff: 0.278817 | eff: 1 | fom: 0.612553 | r2int: 0.0754523 | r2eff: 0 | hits: 34 ] keV + 53 6465.7 [sigma: 478.151 | error: 0.411747 | coeff: 0.411747 | eff: 1 | fom: 0.280879 | r2int: 0.164067 | r2eff: 0 | hits: 31 ] keV + 54 4743.82 [sigma: 498.367 | error: 0.445715 | coeff: 0.445715 | eff: 1 | fom: 0.239699 | r2int: 0.187625 | r2eff: 0 | hits: 18 ] keV + 55 8664.91 [sigma: 640.478 | error: 0.391128 | coeff: 0.391128 | eff: 1 | fom: 0.311273 | r2int: 0.147518 | r2eff: 0 | hits: 28 ] keV + 56 20036.3 [sigma: 594.356 | error: 0.233574 | coeff: 0.233574 | eff: 1 | fom: 0.872834 | r2int: 0.0536769 | r2eff: 0 | hits: 62 ] keV + 57 26322.9 [sigma: 624.96 | error: 0.211024 | coeff: 0.211024 | eff: 1 | fom: 1.06934 | r2int: 0.0439676 | r2eff: 0 | hits: 79 ] keV + 58 16420.1 [sigma: 541.363 | error: 0.242275 | coeff: 0.242275 | eff: 1 | fom: 0.811265 | r2int: 0.0576103 | r2eff: 0 | hits: 54 ] keV + 59 9068.72 [sigma: 566.518 | error: 0.364256 | coeff: 0.364256 | eff: 1 | fom: 0.358894 | r2int: 0.12878 | r2eff: 0 | hits: 34 ] keV + 60 5145.19 [sigma: 300.415 | error: 0.359925 | coeff: 0.359925 | eff: 1 | fom: 0.367583 | r2int: 0.126137 | r2eff: 0 | hits: 38 ] keV + 61 20475.5 [sigma: 678.964 | error: 0.273443 | coeff: 0.273443 | eff: 1 | fom: 0.636864 | r2int: 0.0736715 | r2eff: 0 | hits: 68 ] keV + 62 24350.3 [sigma: 670.941 | error: 0.26997 | coeff: 0.26997 | eff: 1 | fom: 0.653356 | r2int: 0.0721246 | r2eff: 0 | hits: 96 ] keV + 63 30254.7 [sigma: 662.537 | error: 0.1983 | coeff: 0.1983 | eff: 1 | fom: 1.21097 | r2int: 0.0388435 | r2eff: 0 | hits: 82 ] keV + 64 5937.73 [sigma: 339.226 | error: 0.365814 | coeff: 0.365814 | eff: 1 | fom: 0.355844 | r2int: 0.130556 | r2eff: 0 | hits: 41 ] keV + 65 9636.86 [sigma: 470.257 | error: 0.308624 | coeff: 0.308624 | eff: 1 | fom: 0.499945 | r2int: 0.0928674 | r2eff: 0 | hits: 40 ] keV + 66 19964.7 [sigma: 606.465 | error: 0.239188 | coeff: 0.239188 | eff: 1 | fom: 0.832343 | r2int: 0.0562881 | r2eff: 0 | hits: 62 ] keV + 67 18520.4 [sigma: 467.453 | error: 0.220036 | coeff: 0.220036 | eff: 1 | fom: 0.983544 | r2int: 0.0477787 | r2eff: 0 | hits: 76 ] keV + 68 18623.5 [sigma: 601.777 | error: 0.274183 | coeff: 0.274183 | eff: 1 | fom: 0.63343 | r2int: 0.0741324 | r2eff: 0 | hits: 72 ] keV + 69 7004.09 [sigma: 409.263 | error: 0.335667 | coeff: 0.335667 | eff: 1 | fom: 0.422634 | r2int: 0.109258 | r2eff: 0 | hits: 33 ] keV + 70 3912.87 [sigma: 440.917 | error: 0.464608 | coeff: 0.464608 | eff: 1 | fom: 0.220601 | r2int: 0.203163 | r2eff: 0 | hits: 17 ] keV + 71 8850.43 [sigma: 440.681 | error: 0.294574 | coeff: 0.294574 | eff: 1 | fom: 0.548771 | r2int: 0.0842947 | r2eff: 0 | hits: 35 ] keV + 72 4020.8 [sigma: 329.342 | error: 0.470534 | coeff: 0.470534 | eff: 1 | fom: 0.215079 | r2int: 0.214693 | r2eff: 0 | hits: 33 ] keV + 73 5565.66 [sigma: 365.736 | error: 0.377492 | coeff: 0.377492 | eff: 1 | fom: 0.334168 | r2int: 0.138182 | r2eff: 0 | hits: 33 ] keV + 74 6113.41 [sigma: 423.567 | error: 0.346424 | coeff: 0.346424 | eff: 1 | fom: 0.396793 | r2int: 0.11521 | r2eff: 0 | hits: 25 ] keV + 75 25198.3 [sigma: 418.812 | error: 0.173524 | coeff: 0.173524 | eff: 1 | fom: 1.58147 | r2int: 0.0298344 | r2eff: 0 | hits: 109 ] keV + 76 42631.6 [sigma: 523.121 | error: 0.153752 | coeff: 0.153752 | eff: 1 | fom: 2.01438 | r2int: 0.023489 | r2eff: 0 | hits: 157 ] keV + 77 39165 [sigma: 409.979 | error: 0.13966 | coeff: 0.13966 | eff: 1 | fom: 2.44137 | r2int: 0.0193955 | r2eff: 0 | hits: 178 ] keV + 78 39845.8 [sigma: 526.611 | error: 0.161865 | coeff: 0.161865 | eff: 1 | fom: 1.8175 | r2int: 0.0260257 | r2eff: 0 | hits: 150 ] keV + 79 16769.2 [sigma: 399.654 | error: 0.238327 | coeff: 0.238327 | eff: 1 | fom: 0.83837 | r2int: 0.0562315 | r2eff: 0 | hits: 100 ] keV + 80 34773.4 [sigma: 431.054 | error: 0.157776 | coeff: 0.157776 | eff: 1 | fom: 1.91292 | r2int: 0.0247398 | r2eff: 0 | hits: 162 ] keV + 81 350202 [sigma: 1130.44 | error: 0.0510386 | coeff: 0.0510386 | eff: 1 | fom: 18.2803 | r2int: 0.00259451 | r2eff: 0 | hits: 250 ] keV + 82 326209 [sigma: 1141.94 | error: 0.0577343 | coeff: 0.0577343 | eff: 1 | fom: 14.2861 | r2int: 0.00332099 | r2eff: 0 | hits: 272 ] keV + 83 373588 [sigma: 1142.47 | error: 0.0491203 | coeff: 0.0491203 | eff: 1 | fom: 19.736 | r2int: 0.00240345 | r2eff: 0 | hits: 258 ] keV + 84 30713 [sigma: 437.356 | error: 0.176715 | coeff: 0.176715 | eff: 1 | fom: 1.52488 | r2int: 0.0310253 | r2eff: 0 | hits: 154 ] keV + 85 33024.6 [sigma: 404.851 | error: 0.160308 | coeff: 0.160308 | eff: 1 | fom: 1.85298 | r2int: 0.0255484 | r2eff: 0 | hits: 171 ] keV + 86 302387 [sigma: 1171.22 | error: 0.0612412 | coeff: 0.0612412 | eff: 1 | fom: 12.6968 | r2int: 0.00373548 | r2eff: 0 | hits: 250 ] keV + 87 260747 [sigma: 1120.36 | error: 0.0684788 | coeff: 0.0684788 | eff: 1 | fom: 10.1547 | r2int: 0.00467089 | r2eff: 0 | hits: 254 ] keV + 88 325093 [sigma: 1164.55 | error: 0.0585337 | coeff: 0.0585337 | eff: 1 | fom: 13.8985 | r2int: 0.00341336 | r2eff: 0 | hits: 267 ] keV + 89 40319.6 [sigma: 478.393 | error: 0.148194 | coeff: 0.148194 | eff: 1 | fom: 2.1683 | r2int: 0.0218207 | r2eff: 0 | hits: 156 ] keV + 90 27750.2 [sigma: 351.959 | error: 0.16341 | coeff: 0.16341 | eff: 1 | fom: 1.78329 | r2int: 0.0265421 | r2eff: 0 | hits: 166 ] keV + 91 349845 [sigma: 1141.66 | error: 0.0534231 | coeff: 0.0534231 | eff: 1 | fom: 16.6849 | r2int: 0.00284338 | r2eff: 0 | hits: 268 ] keV + 92 289443 [sigma: 1114.11 | error: 0.0619464 | coeff: 0.0619464 | eff: 1 | fom: 12.4094 | r2int: 0.00382253 | r2eff: 0 | hits: 259 ] keV + 93 349642 [sigma: 1129 | error: 0.0506454 | coeff: 0.0506454 | eff: 1 | fom: 18.5652 | r2int: 0.00255453 | r2eff: 0 | hits: 246 ] keV + 94 22103.2 [sigma: 280.233 | error: 0.160871 | coeff: 0.160871 | eff: 1 | fom: 1.84003 | r2int: 0.0257187 | r2eff: 0 | hits: 161 ] keV + 95 24521.8 [sigma: 469.237 | error: 0.191355 | coeff: 0.191355 | eff: 1 | fom: 1.30047 | r2int: 0.0362506 | r2eff: 0 | hits: 100 ] keV + 96 33132.5 [sigma: 524.772 | error: 0.184708 | coeff: 0.184708 | eff: 1 | fom: 1.39575 | r2int: 0.0338662 | r2eff: 0 | hits: 136 ] keV + 97 38244.3 [sigma: 437.262 | error: 0.142803 | coeff: 0.142803 | eff: 1 | fom: 2.33511 | r2int: 0.0202619 | r2eff: 0 | hits: 156 ] keV + 98 35076 [sigma: 489.333 | error: 0.162691 | coeff: 0.162691 | eff: 1 | fom: 1.7991 | r2int: 0.0262737 | r2eff: 0 | hits: 136 ] keV + 99 30547.6 [sigma: 514.342 | error: 0.174167 | coeff: 0.174167 | eff: 1 | fom: 1.56981 | r2int: 0.0300507 | r2eff: 0 | hits: 107 ] keV + 100 313077 [sigma: 453.027 | error: 0.0351479 | coeff: 0.0351479 | eff: 1 | fom: 38.5463 | r2int: 0.00123328 | r2eff: 0 | hits: 590 ] keV + 101 383098 [sigma: 483.127 | error: 0.0340265 | coeff: 0.0340265 | eff: 1 | fom: 41.1287 | r2int: 0.00115622 | r2eff: 0 | hits: 728 ] keV + 102 392490 [sigma: 479.157 | error: 0.0330748 | coeff: 0.0330748 | eff: 1 | fom: 43.5297 | r2int: 0.00109245 | r2eff: 0 | hits: 734 ] keV + 103 346506 [sigma: 478.139 | error: 0.0366645 | coeff: 0.0366645 | eff: 1 | fom: 35.4234 | r2int: 0.00134238 | r2eff: 0 | hits: 706 ] keV + 104 360395 [sigma: 473.148 | error: 0.0330048 | coeff: 0.0330048 | eff: 1 | fom: 43.7145 | r2int: 0.0010876 | r2eff: 0 | hits: 632 ] keV + 105 358697 [sigma: 435.158 | error: 0.0322117 | coeff: 0.0322117 | eff: 1 | fom: 45.8938 | r2int: 0.00103612 | r2eff: 0 | hits: 705 ] keV + 106 376485 [sigma: 498.774 | error: 0.0379832 | coeff: 0.0379832 | eff: 1 | fom: 33.0064 | r2int: 0.00144097 | r2eff: 0 | hits: 822 ] keV + 107 356281 [sigma: 455.105 | error: 0.0373291 | coeff: 0.0373291 | eff: 1 | fom: 34.1733 | r2int: 0.00139183 | r2eff: 0 | hits: 854 ] keV + 108 398905 [sigma: 483.891 | error: 0.0362902 | coeff: 0.0362902 | eff: 1 | fom: 36.1578 | r2int: 0.00131551 | r2eff: 0 | hits: 895 ] keV + 109 396659 [sigma: 493.373 | error: 0.0341768 | coeff: 0.0341768 | eff: 1 | fom: 40.7679 | r2int: 0.00116651 | r2eff: 0 | hits: 755 ] keV + 110 383246 [sigma: 488.553 | error: 0.0346073 | coeff: 0.0346073 | eff: 1 | fom: 39.7599 | r2int: 0.00119604 | r2eff: 0 | hits: 737 ] keV + 111 367468 [sigma: 490.281 | error: 0.038392 | coeff: 0.038392 | eff: 1 | fom: 32.3072 | r2int: 0.00147217 | r2eff: 0 | hits: 828 ] keV + 112 414312 [sigma: 514.984 | error: 0.0372066 | coeff: 0.0372066 | eff: 1 | fom: 34.3985 | r2int: 0.00138279 | r2eff: 0 | hits: 896 ] keV + 113 423084 [sigma: 487.804 | error: 0.0344736 | coeff: 0.0344736 | eff: 1 | fom: 40.0688 | r2int: 0.0011871 | r2eff: 0 | hits: 894 ] keV + 114 379863 [sigma: 497.046 | error: 0.0351591 | coeff: 0.0351591 | eff: 1 | fom: 38.5216 | r2int: 0.00123445 | r2eff: 0 | hits: 722 ] keV + 115 365049 [sigma: 509.6 | error: 0.0364026 | coeff: 0.0364026 | eff: 1 | fom: 35.9348 | r2int: 0.0013232 | r2eff: 0 | hits: 680 ] keV + 116 408187 [sigma: 505.021 | error: 0.0360712 | coeff: 0.0360712 | eff: 1 | fom: 36.5983 | r2int: 0.0012996 | r2eff: 0 | hits: 850 ] keV + 117 381769 [sigma: 482.389 | error: 0.0373553 | coeff: 0.0373553 | eff: 1 | fom: 34.1252 | r2int: 0.00139382 | r2eff: 0 | hits: 874 ] keV + 118 382783 [sigma: 480.713 | error: 0.0369566 | coeff: 0.0369566 | eff: 1 | fom: 34.8655 | r2int: 0.00136421 | r2eff: 0 | hits: 866 ] keV + 119 364917 [sigma: 500.248 | error: 0.0366047 | coeff: 0.0366047 | eff: 1 | fom: 35.5392 | r2int: 0.00133802 | r2eff: 0 | hits: 713 ] keV + 120 343893 [sigma: 479.18 | error: 0.03315 | coeff: 0.03315 | eff: 1 | fom: 43.3326 | r2int: 0.00109698 | r2eff: 0 | hits: 566 ] keV + 121 326521 [sigma: 476.272 | error: 0.036987 | coeff: 0.036987 | eff: 1 | fom: 34.8083 | r2int: 0.00136591 | r2eff: 0 | hits: 643 ] keV + 122 370896 [sigma: 495.72 | error: 0.0357886 | coeff: 0.0357886 | eff: 1 | fom: 35.4886 | r2int: 0.00127903 | r2eff: 0 | hits: 717 ] keV + 123 336349 [sigma: 475.125 | error: 0.0362628 | coeff: 0.0362628 | eff: 1 | fom: 34.5665 | r2int: 0.00131299 | r2eff: 0 | hits: 659 ] keV + 124 334616 [sigma: 464.511 | error: 0.0326447 | coeff: 0.0326447 | eff: 1 | fom: 42.6534 | r2int: 0.00106375 | r2eff: 0 | hits: 553 ] keV ============================================================ closed file mfd_tl_EnergyDeposit.out for output ============================================================ opened file mfd_tg_EnergyDeposit.out for output ============================================================ - 0 20.467471 keV - 1 322.356283 keV - 2 339.492581 keV - 3 484.958679 keV - 4 3250.399281 keV - 5 2155.491760 keV - 6 520.973316 keV - 7 935.108262 keV - 8 248.139313 keV - 9 255.899594 keV - 10 533.109860 keV - 11 1533.636277 keV - 12 1086.354239 keV - 13 94.075725 keV - 14 10.909852 keV - 15 253.158627 keV - 16 309.215984 keV - 17 333.259771 keV - 18 129.474654 keV - 19 26.338818 keV - 20 1929.263063 keV - 21 39.149980 keV - 22 2852.933594 keV - 23 2683.271788 keV - 24 37.552490 keV - 25 1054.744978 keV - 26 2006.653569 keV - 27 4591.230623 keV - 28 2066.024332 keV - 29 3497.229487 keV - 30 2163.673233 keV - 31 6858.124678 keV - 32 3975.907307 keV - 33 4889.999718 keV - 34 1384.917601 keV - 35 2017.621405 keV - 36 5105.861080 keV - 37 1411.776460 keV - 38 9217.012361 keV - 39 1561.759811 keV - 40 3281.349045 keV - 41 6635.218309 keV - 42 4799.041749 keV - 43 3251.182486 keV - 44 1410.973135 keV - 45 327.059251 keV - 46 4411.487990 keV - 47 2093.563903 keV - 48 3600.827287 keV - 49 636.797553 keV - 50 5037.551248 keV - 51 9472.778329 keV - 52 2709.165334 keV - 53 5946.151315 keV - 54 13544.341822 keV - 55 3516.338346 keV - 56 31311.864131 keV - 57 27015.525399 keV - 58 21690.531480 keV - 59 4319.070946 keV - 60 10732.949319 keV - 61 26246.088577 keV - 62 18326.955423 keV - 63 11444.776100 keV - 64 5282.749258 keV - 65 6166.924536 keV - 66 20045.904412 keV - 67 17907.538870 keV - 68 23041.719011 keV - 69 4730.589032 keV - 70 6053.681091 keV - 71 8126.028267 keV - 72 7923.429990 keV - 73 8111.327834 keV - 74 3205.843285 keV - 75 23102.447255 keV - 76 32755.499794 keV - 77 41864.195186 keV - 78 29279.011194 keV - 79 27913.219951 keV - 80 24466.084471 keV - 81 392032.414226 keV - 82 330559.495720 keV - 83 403316.606422 keV - 84 37934.539161 keV - 85 41243.763643 keV - 86 373315.950693 keV - 87 298868.818890 keV - 88 334837.410599 keV - 89 29834.422433 keV - 90 32172.459637 keV - 91 314660.203296 keV - 92 319015.906880 keV - 93 405968.969077 keV - 94 24613.358893 keV - 95 16792.589147 keV - 96 33896.326929 keV - 97 36369.806387 keV - 98 32970.137494 keV - 99 19812.733770 keV - 100 316058.085343 keV - 101 372105.273041 keV - 102 356018.675027 keV - 103 312062.497611 keV - 104 361017.525376 keV - 105 353703.183018 keV - 106 422366.825440 keV - 107 386499.464995 keV - 108 381488.590070 keV - 109 333995.252165 keV - 110 342915.148636 keV - 111 400116.902575 keV - 112 416161.060276 keV - 113 394536.520485 keV - 114 372494.305849 keV - 115 382783.249699 keV - 116 389326.111891 keV - 117 377580.689646 keV - 118 380947.495409 keV - 119 352093.835755 keV - 120 313057.319579 keV - 121 355240.533018 keV - 122 363178.546889 keV - 123 355937.158969 keV - 124 307385.988818 keV + 0 97.126468 keV + 1 83.608548 keV + 2 93.037557 keV + 3 138.191013 keV + 4 1144.639741 keV + 5 1977.021639 keV + 6 738.334889 keV + 8 613.258720 keV + 9 1266.634060 keV + 10 461.439053 keV + 11 364.354752 keV + 12 437.055908 keV + 13 760.002191 keV + 14 1862.458149 keV + 15 2555.836878 keV + 16 496.943687 keV + 17 427.845305 keV + 18 262.162576 keV + 19 950.275669 keV + 20 2041.991467 keV + 21 3064.636122 keV + 22 106.890085 keV + 23 86.203499 keV + 24 55.209628 keV + 25 4094.872253 keV + 26 2964.466048 keV + 27 778.641524 keV + 28 2540.374972 keV + 29 4536.405843 keV + 30 1885.843732 keV + 31 5358.453020 keV + 32 9765.678221 keV + 33 12495.258267 keV + 34 3036.050622 keV + 35 1792.405767 keV + 36 1387.819501 keV + 37 13791.871410 keV + 38 836.733630 keV + 39 4178.981881 keV + 40 2052.907868 keV + 41 3295.595367 keV + 42 1824.914499 keV + 43 6354.451437 keV + 44 1947.780233 keV + 45 3946.773097 keV + 46 1414.302458 keV + 47 300.008841 keV + 48 1802.685679 keV + 49 597.446744 keV + 50 7306.086406 keV + 51 7311.836609 keV + 52 9088.094627 keV + 53 6465.700190 keV + 54 4743.821740 keV + 55 8664.908931 keV + 56 20036.310720 keV + 57 26322.881350 keV + 58 16420.125765 keV + 59 9068.718078 keV + 60 5145.185239 keV + 61 20475.497388 keV + 62 24350.322630 keV + 63 30254.726052 keV + 64 5937.732322 keV + 65 9636.858207 keV + 66 19964.669553 keV + 67 18520.431153 keV + 68 18623.465948 keV + 69 7004.086999 keV + 70 3912.866492 keV + 71 8850.425594 keV + 72 4020.803756 keV + 73 5565.659964 keV + 74 6113.413647 keV + 75 25198.349098 keV + 76 42631.636288 keV + 77 39165.023845 keV + 78 39845.772036 keV + 79 16769.162360 keV + 80 34773.355055 keV + 81 350202.153466 keV + 82 326208.956360 keV + 83 373588.200066 keV + 84 30713.021368 keV + 85 33024.590137 keV + 86 302387.081582 keV + 87 260747.075926 keV + 88 325093.207564 keV + 89 40319.571080 keV + 90 27750.167758 keV + 91 349844.791877 keV + 92 289443.035975 keV + 93 349641.511703 keV + 94 22103.173845 keV + 95 24521.811416 keV + 96 33132.530967 keV + 97 38244.308721 keV + 98 35076.046266 keV + 99 30547.595283 keV + 100 313077.079071 keV + 101 383097.566323 keV + 102 392489.816408 keV + 103 346505.985327 keV + 104 360394.637576 keV + 105 358697.203553 keV + 106 376485.475295 keV + 107 356281.429146 keV + 108 398905.171807 keV + 109 396659.165829 keV + 110 383246.456275 keV + 111 367468.002984 keV + 112 414311.768324 keV + 113 423084.424988 keV + 114 379863.187750 keV + 115 365049.089278 keV + 116 408186.846340 keV + 117 381769.210181 keV + 118 382783.339401 keV + 119 364916.666201 keV + 120 343893.329653 keV + 121 326520.998382 keV + 122 370895.608938 keV + 123 336348.709798 keV + 124 334615.525072 keV ============================================================ closed file mfd_tg_EnergyDeposit.out for output ============================================================ opened file mfd_tl_NumberOfSteps.out for output ============================================================ - 0 12.000000 steps - 1 32.000000 steps - 2 32.000000 steps - 3 77.000000 steps - 4 83.000000 steps - 5 57.000000 steps - 6 50.000000 steps - 7 51.000000 steps - 8 98.000000 steps - 9 35.000000 steps - 10 36.000000 steps - 11 51.000000 steps - 12 101.000000 steps - 13 46.000000 steps - 14 16.000000 steps - 15 51.000000 steps - 16 39.000000 steps - 17 89.000000 steps - 18 53.000000 steps - 19 9.000000 steps - 20 63.000000 steps - 21 12.000000 steps - 22 118.000000 steps - 23 71.000000 steps - 24 14.000000 steps - 25 132.000000 steps - 26 176.000000 steps - 27 152.000000 steps - 28 146.000000 steps - 29 292.000000 steps - 30 148.000000 steps - 31 399.000000 steps - 32 295.000000 steps - 33 317.000000 steps - 34 173.000000 steps - 35 90.000000 steps - 36 280.000000 steps - 37 284.000000 steps - 38 261.000000 steps - 39 208.000000 steps - 40 341.000000 steps - 41 198.000000 steps - 42 303.000000 steps - 43 360.000000 steps - 44 178.000000 steps - 45 159.000000 steps - 46 236.000000 steps - 47 231.000000 steps - 48 202.000000 steps - 49 84.000000 steps - 50 630.000000 steps - 51 789.000000 steps - 52 561.000000 steps - 53 505.000000 steps - 54 585.000000 steps - 55 655.000000 steps - 56 988.000000 steps - 57 1201.000000 steps - 58 1072.000000 steps - 59 385.000000 steps - 60 819.000000 steps - 61 1338.000000 steps - 62 1298.000000 steps - 63 1253.000000 steps - 64 603.000000 steps - 65 831.000000 steps - 66 855.000000 steps - 67 1248.000000 steps - 68 1148.000000 steps - 69 491.000000 steps - 70 398.000000 steps - 71 621.000000 steps - 72 752.000000 steps - 73 529.000000 steps - 74 417.000000 steps - 75 3443.000000 steps - 76 4473.000000 steps - 77 4391.000000 steps - 78 3708.000000 steps - 79 2927.000000 steps - 80 3011.000000 steps - 81 4349.000000 steps - 82 4323.000000 steps - 83 3932.000000 steps - 84 4151.000000 steps - 85 5131.000000 steps - 86 4250.000000 steps - 87 4808.000000 steps - 88 4063.000000 steps - 89 4132.000000 steps - 90 3899.000000 steps - 91 3621.000000 steps - 92 4405.000000 steps - 93 3922.000000 steps - 94 3218.000000 steps - 95 2758.000000 steps - 96 3774.000000 steps - 97 4714.000000 steps - 98 5052.000000 steps - 99 2844.000000 steps - 100 14236.000000 steps - 101 19039.000000 steps - 102 18528.000000 steps - 103 17519.000000 steps - 104 15181.000000 steps - 105 17425.000000 steps - 106 25081.000000 steps - 107 24404.000000 steps - 108 23142.000000 steps - 109 17779.000000 steps - 110 19603.000000 steps - 111 23784.000000 steps - 112 25449.000000 steps - 113 24049.000000 steps - 114 18168.000000 steps - 115 18756.000000 steps - 116 23325.000000 steps - 117 22665.000000 steps - 118 22837.000000 steps - 119 17774.000000 steps - 120 13840.000000 steps - 121 17910.000000 steps - 122 17402.000000 steps - 123 17229.000000 steps - 124 12762.000000 steps - 0 12 [sigma: 2.44949 | error: 0.5 | coeff: 0.5 | eff: 1 | fom: 0.166667 | r2int: 0.208333 | r2eff: 0 | hits: 6 ] steps - 1 32 [sigma: 4.15933 | error: 0.290642 | coeff: 0.290642 | eff: 1 | fom: 0.493256 | r2int: 0.0675781 | r2eff: 0 | hits: 5 ] steps - 2 32 [sigma: 7.00476 | error: 0.53619 | coeff: 0.53619 | eff: 1 | fom: 0.144928 | r2int: 0.239583 | r2eff: 0 | hits: 6 ] steps - 3 77 [sigma: 11.9304 | error: 0.409932 | coeff: 0.409932 | eff: 1 | fom: 0.247951 | r2int: 0.144038 | r2eff: 0 | hits: 7 ] steps - 4 83 [sigma: 12.4154 | error: 0.395761 | coeff: 0.395761 | eff: 1 | fom: 0.266026 | r2int: 0.134251 | r2eff: 0 | hits: 7 ] steps - 5 57 [sigma: 16.9189 | error: 0.593646 | coeff: 0.593646 | eff: 1 | fom: 0.118231 | r2int: 0.264312 | r2eff: 0 | hits: 4 ] steps - 6 50 [sigma: 8.02971 | error: 0.424892 | coeff: 0.424892 | eff: 1 | fom: 0.230798 | r2int: 0.154743 | r2eff: 0 | hits: 7 ] steps - 7 51 [sigma: 13.8094 | error: 0.605467 | coeff: 0.605467 | eff: 1 | fom: 0.11366 | r2int: 0.293272 | r2eff: 0 | hits: 5 ] steps - 8 98 [sigma: 12.242 | error: 0.305986 | coeff: 0.305986 | eff: 1 | fom: 0.445025 | r2int: 0.078023 | r2eff: 0 | hits: 6 ] steps - 9 35 [sigma: 4.95648 | error: 0.346881 | coeff: 0.346881 | eff: 1 | fom: 0.34628 | r2int: 0.100272 | r2eff: 0 | hits: 6 ] steps - 10 36 [sigma: 7.77174 | error: 0.5288 | coeff: 0.5288 | eff: 1 | fom: 0.149007 | r2int: 0.233025 | r2eff: 0 | hits: 6 ] steps - 11 51 [sigma: 9.95615 | error: 0.552162 | coeff: 0.552162 | eff: 1 | fom: 0.136665 | r2int: 0.266772 | r2eff: 0 | hits: 8 ] steps - 12 101 [sigma: 10.756 | error: 0.383975 | coeff: 0.383975 | eff: 1 | fom: 0.282607 | r2int: 0.136095 | r2eff: 0 | hits: 13 ] steps - 13 46 [sigma: 4.45658 | error: 0.290647 | coeff: 0.290647 | eff: 1 | fom: 0.49324 | r2int: 0.0750893 | r2eff: 0 | hits: 9 ] steps - 14 16 [sigma: 2.16795 | error: 0.30298 | coeff: 0.30298 | eff: 1 | fom: 0.453901 | r2int: 0.0734375 | r2eff: 0 | hits: 5 ] steps - 15 51 [sigma: 7.932 | error: 0.311059 | coeff: 0.311059 | eff: 1 | fom: 0.430629 | r2int: 0.0725682 | r2eff: 0 | hits: 4 ] steps - 16 39 [sigma: 3.41402 | error: 0.276823 | coeff: 0.276823 | eff: 1 | fom: 0.543732 | r2int: 0.0689678 | r2eff: 0 | hits: 10 ] steps - 17 89 [sigma: 4.73817 | error: 0.232059 | coeff: 0.232059 | eff: 1 | fom: 0.773737 | r2int: 0.051017 | r2eff: 0 | hits: 19 ] steps - 18 53 [sigma: 7.40683 | error: 0.419254 | coeff: 0.419254 | eff: 1 | fom: 0.237046 | r2int: 0.156244 | r2eff: 0 | hits: 9 ] steps - 19 9 [sigma: 3.4641 | error: 0.666667 | coeff: 0.666667 | eff: 1 | fom: 0.09375 | r2int: 0.296296 | r2eff: 0 | hits: 3 ] steps - 20 63 [sigma: 23.7655 | error: 0.843513 | coeff: 0.843513 | eff: 1 | fom: 0.0585606 | r2int: 0.569211 | r2eff: 0 | hits: 5 ] steps - 21 12 [sigma: 1.41421 | error: 0.333333 | coeff: 0.333333 | eff: 1 | fom: 0.375 | r2int: 0.0972222 | r2eff: 0 | hits: 8 ] steps - 22 118 [sigma: 11.0955 | error: 0.28209 | coeff: 0.28209 | eff: 1 | fom: 0.523616 | r2int: 0.0707332 | r2eff: 0 | hits: 9 ] steps - 23 71 [sigma: 13.848 | error: 0.477753 | coeff: 0.477753 | eff: 1 | fom: 0.18255 | r2int: 0.190207 | r2eff: 0 | hits: 6 ] steps - 24 14 [sigma: 3.21455 | error: 0.397697 | coeff: 0.397697 | eff: 1 | fom: 0.263441 | r2int: 0.105442 | r2eff: 0 | hits: 3 ] steps - 25 132 [sigma: 8.01469 | error: 0.257602 | coeff: 0.257602 | eff: 1 | fom: 0.6279 | r2int: 0.0626722 | r2eff: 0 | hits: 18 ] steps - 26 176 [sigma: 11.7411 | error: 0.298339 | coeff: 0.298339 | eff: 1 | fom: 0.468133 | r2int: 0.0845558 | r2eff: 0 | hits: 20 ] steps - 27 152 [sigma: 12.9006 | error: 0.294005 | coeff: 0.294005 | eff: 1 | fom: 0.482034 | r2int: 0.0792359 | r2eff: 0 | hits: 12 ] steps - 28 146 [sigma: 5.85224 | error: 0.212104 | coeff: 0.212104 | eff: 1 | fom: 0.926174 | r2int: 0.0433812 | r2eff: 0 | hits: 28 ] steps - 29 292 [sigma: 16.0955 | error: 0.258543 | coeff: 0.258543 | eff: 1 | fom: 0.623337 | r2int: 0.0638061 | r2eff: 0 | hits: 22 ] steps - 30 148 [sigma: 8.8401 | error: 0.267122 | coeff: 0.267122 | eff: 1 | fom: 0.583939 | r2int: 0.0677867 | r2eff: 0 | hits: 20 ] steps - 31 399 [sigma: 12.9715 | error: 0.175073 | coeff: 0.175073 | eff: 1 | fom: 1.35942 | r2int: 0.0295935 | r2eff: 0 | hits: 29 ] steps - 32 295 [sigma: 13.9373 | error: 0.216504 | coeff: 0.216504 | eff: 1 | fom: 0.88891 | r2int: 0.0446418 | r2eff: 0 | hits: 21 ] steps - 33 317 [sigma: 9.86476 | error: 0.176036 | coeff: 0.176036 | eff: 1 | fom: 1.34457 | r2int: 0.0300204 | r2eff: 0 | hits: 32 ] steps - 34 173 [sigma: 7.94452 | error: 0.234158 | coeff: 0.234158 | eff: 1 | fom: 0.759928 | r2int: 0.0527209 | r2eff: 0 | hits: 26 ] steps - 35 90 [sigma: 5.29356 | error: 0.288145 | coeff: 0.288145 | eff: 1 | fom: 0.501843 | r2int: 0.0795679 | r2eff: 0 | hits: 24 ] steps - 36 280 [sigma: 7.78888 | error: 0.147196 | coeff: 0.147196 | eff: 1 | fom: 1.92308 | r2int: 0.0208929 | r2eff: 0 | hits: 28 ] steps - 37 284 [sigma: 9.76882 | error: 0.188402 | coeff: 0.188402 | eff: 1 | fom: 1.17387 | r2int: 0.034312 | r2eff: 0 | hits: 30 ] steps - 38 261 [sigma: 14.3567 | error: 0.269475 | coeff: 0.269475 | eff: 1 | fom: 0.573787 | r2int: 0.0695912 | r2eff: 0 | hits: 24 ] steps - 39 208 [sigma: 12.7296 | error: 0.273694 | coeff: 0.273694 | eff: 1 | fom: 0.556234 | r2int: 0.0711631 | r2eff: 0 | hits: 20 ] steps - 40 341 [sigma: 23.3784 | error: 0.321567 | coeff: 0.321567 | eff: 1 | fom: 0.402946 | r2int: 0.0987049 | r2eff: 0 | hits: 22 ] steps - 41 198 [sigma: 8.65363 | error: 0.209603 | coeff: 0.209603 | eff: 1 | fom: 0.948406 | r2int: 0.0420232 | r2eff: 0 | hits: 23 ] steps - 42 303 [sigma: 10.4563 | error: 0.189015 | coeff: 0.189015 | eff: 1 | fom: 1.16626 | r2int: 0.0345358 | r2eff: 0 | hits: 30 ] steps - 43 360 [sigma: 12.1082 | error: 0.181124 | coeff: 0.181124 | eff: 1 | fom: 1.2701 | r2int: 0.0316746 | r2eff: 0 | hits: 29 ] steps - 44 178 [sigma: 6.06316 | error: 0.156095 | coeff: 0.156095 | eff: 1 | fom: 1.71006 | r2int: 0.0232053 | r2eff: 0 | hits: 21 ] steps - 45 159 [sigma: 13.8693 | error: 0.39973 | coeff: 0.39973 | eff: 1 | fom: 0.260769 | r2int: 0.152175 | r2eff: 0 | hits: 21 ] steps - 46 236 [sigma: 18.8457 | error: 0.374551 | coeff: 0.374551 | eff: 1 | fom: 0.297006 | r2int: 0.133912 | r2eff: 0 | hits: 22 ] steps - 47 231 [sigma: 17.9405 | error: 0.372466 | coeff: 0.372466 | eff: 1 | fom: 0.300342 | r2int: 0.132699 | r2eff: 0 | hits: 23 ] steps - 48 202 [sigma: 13.6917 | error: 0.303125 | coeff: 0.303125 | eff: 1 | fom: 0.453467 | r2int: 0.0872905 | r2eff: 0 | hits: 20 ] steps - 49 84 [sigma: 6.67852 | error: 0.286663 | coeff: 0.286663 | eff: 1 | fom: 0.507042 | r2int: 0.0758547 | r2eff: 0 | hits: 13 ] steps - 50 630 [sigma: 27.1391 | error: 0.304607 | coeff: 0.304607 | eff: 1 | fom: 0.449065 | r2int: 0.0909297 | r2eff: 0 | hits: 50 ] steps - 51 789 [sigma: 17.8314 | error: 0.175059 | coeff: 0.175059 | eff: 1 | fom: 1.35962 | r2int: 0.030135 | r2eff: 0 | hits: 60 ] steps - 52 561 [sigma: 14.8068 | error: 0.199268 | coeff: 0.199268 | eff: 1 | fom: 1.04934 | r2int: 0.039011 | r2eff: 0 | hits: 57 ] steps - 53 505 [sigma: 8.1394 | error: 0.133883 | coeff: 0.133883 | eff: 1 | fom: 2.32454 | r2int: 0.0176649 | r2eff: 0 | hits: 69 ] steps - 54 585 [sigma: 21.7783 | error: 0.252492 | coeff: 0.252492 | eff: 1 | fom: 0.653571 | r2int: 0.0623664 | r2eff: 0 | hits: 46 ] steps - 55 655 [sigma: 15.3217 | error: 0.181193 | coeff: 0.181193 | eff: 1 | fom: 1.26912 | r2int: 0.0322839 | r2eff: 0 | hits: 60 ] steps - 56 988 [sigma: 11.3437 | error: 0.109526 | coeff: 0.109526 | eff: 1 | fom: 3.47338 | r2int: 0.0118642 | r2eff: 0 | hits: 91 ] steps - 57 1201 [sigma: 12.1471 | error: 0.0985804 | coeff: 0.0985804 | eff: 1 | fom: 4.28754 | r2int: 0.00961579 | r2eff: 0 | hits: 95 ] steps - 58 1072 [sigma: 13.9161 | error: 0.115382 | coeff: 0.115382 | eff: 1 | fom: 3.12979 | r2int: 0.0131444 | r2eff: 0 | hits: 79 ] steps - 59 385 [sigma: 8.84224 | error: 0.170327 | coeff: 0.170327 | eff: 1 | fom: 1.43623 | r2int: 0.0284837 | r2eff: 0 | hits: 55 ] steps - 60 819 [sigma: 14.1798 | error: 0.159623 | coeff: 0.159623 | eff: 1 | fom: 1.63529 | r2int: 0.0251799 | r2eff: 0 | hits: 85 ] steps - 61 1338 [sigma: 18.1859 | error: 0.136597 | coeff: 0.136597 | eff: 1 | fom: 2.2331 | r2int: 0.0184739 | r2eff: 0 | hits: 101 ] steps - 62 1298 [sigma: 13.6851 | error: 0.101675 | coeff: 0.101675 | eff: 1 | fom: 4.03053 | r2int: 0.0102266 | r2eff: 0 | hits: 93 ] steps - 63 1253 [sigma: 14.4253 | error: 0.109824 | coeff: 0.109824 | eff: 1 | fom: 3.45459 | r2int: 0.0119287 | r2eff: 0 | hits: 91 ] steps - 64 603 [sigma: 12.6754 | error: 0.160087 | coeff: 0.160087 | eff: 1 | fom: 1.62583 | r2int: 0.0251861 | r2eff: 0 | hits: 58 ] steps - 65 831 [sigma: 25.4016 | error: 0.238739 | coeff: 0.238739 | eff: 1 | fom: 0.731039 | r2int: 0.0560621 | r2eff: 0 | hits: 61 ] steps - 66 855 [sigma: 16.8397 | error: 0.171702 | coeff: 0.171702 | eff: 1 | fom: 1.41331 | r2int: 0.0290937 | r2eff: 0 | hits: 76 ] steps - 67 1248 [sigma: 13.4371 | error: 0.106041 | coeff: 0.106041 | eff: 1 | fom: 3.70542 | r2int: 0.0111289 | r2eff: 0 | hits: 97 ] steps - 68 1148 [sigma: 10.8133 | error: 0.0898542 | coeff: 0.0898542 | eff: 1 | fom: 5.16074 | r2int: 0.00798506 | r2eff: 0 | hits: 91 ] steps - 69 491 [sigma: 15.6592 | error: 0.218643 | coeff: 0.218643 | eff: 1 | fom: 0.8716 | r2int: 0.0467877 | r2eff: 0 | hits: 47 ] steps - 70 398 [sigma: 11.8976 | error: 0.184276 | coeff: 0.184276 | eff: 1 | fom: 1.22702 | r2int: 0.033064 | r2eff: 0 | hits: 38 ] steps - 71 621 [sigma: 17.7781 | error: 0.198342 | coeff: 0.198342 | eff: 1 | fom: 1.05916 | r2int: 0.0385198 | r2eff: 0 | hits: 48 ] steps - 72 752 [sigma: 16.4412 | error: 0.176267 | coeff: 0.176267 | eff: 1 | fom: 1.34105 | r2int: 0.0305921 | r2eff: 0 | hits: 65 ] steps - 73 529 [sigma: 12.9277 | error: 0.182877 | coeff: 0.182877 | eff: 1 | fom: 1.24587 | r2int: 0.0328466 | r2eff: 0 | hits: 56 ] steps - 74 417 [sigma: 18.8025 | error: 0.281587 | coeff: 0.281587 | eff: 1 | fom: 0.52549 | r2int: 0.077258 | r2eff: 0 | hits: 39 ] steps - 75 3443 [sigma: 26.0044 | error: 0.0961318 | coeff: 0.0961318 | eff: 1 | fom: 4.50874 | r2int: 0.00918427 | r2eff: 0 | hits: 162 ] steps - 76 4473 [sigma: 26.0655 | error: 0.0906516 | coeff: 0.0906516 | eff: 1 | fom: 5.07035 | r2int: 0.00818376 | r2eff: 0 | hits: 242 ] steps - 77 4391 [sigma: 22.3938 | error: 0.0809587 | coeff: 0.0809587 | eff: 1 | fom: 6.35713 | r2int: 0.00652831 | r2eff: 0 | hits: 252 ] steps - 78 3708 [sigma: 21.6244 | error: 0.0861057 | coeff: 0.0861057 | eff: 1 | fom: 5.61986 | r2int: 0.00738018 | r2eff: 0 | hits: 218 ] steps - 79 2927 [sigma: 21.0812 | error: 0.0905318 | coeff: 0.0905318 | eff: 1 | fom: 5.08378 | r2int: 0.00814413 | r2eff: 0 | hits: 158 ] steps - 80 3011 [sigma: 20.9646 | error: 0.0972286 | coeff: 0.0972286 | eff: 1 | fom: 4.40759 | r2int: 0.00940491 | r2eff: 0 | hits: 195 ] steps - 81 4349 [sigma: 12.3651 | error: 0.0510986 | coeff: 0.0510986 | eff: 1 | fom: 15.9577 | r2int: 0.00260299 | r2eff: 0 | hits: 323 ] steps - 82 4323 [sigma: 13.5095 | error: 0.0563374 | coeff: 0.0563374 | eff: 1 | fom: 13.1279 | r2int: 0.00316414 | r2eff: 0 | hits: 325 ] steps - 83 3932 [sigma: 12.7525 | error: 0.0597146 | coeff: 0.0597146 | eff: 1 | fom: 11.685 | r2int: 0.00355532 | r2eff: 0 | hits: 339 ] steps - 84 4151 [sigma: 25.2845 | error: 0.0878484 | coeff: 0.0878484 | eff: 1 | fom: 5.3991 | r2int: 0.00768024 | r2eff: 0 | hits: 208 ] steps - 85 5131 [sigma: 27.3126 | error: 0.0829782 | coeff: 0.0829782 | eff: 1 | fom: 6.05146 | r2int: 0.00685705 | r2eff: 0 | hits: 243 ] steps - 86 4250 [sigma: 11.9157 | error: 0.0520009 | coeff: 0.0520009 | eff: 1 | fom: 15.4087 | r2int: 0.00269623 | r2eff: 0 | hits: 344 ] steps - 87 4808 [sigma: 13.7566 | error: 0.0534513 | coeff: 0.0534513 | eff: 1 | fom: 14.5839 | r2int: 0.00284885 | r2eff: 0 | hits: 349 ] steps - 88 4063 [sigma: 12.922 | error: 0.0585577 | coeff: 0.0585577 | eff: 1 | fom: 12.1512 | r2int: 0.00341889 | r2eff: 0 | hits: 339 ] steps - 89 4132 [sigma: 24.1349 | error: 0.0864384 | coeff: 0.0864384 | eff: 1 | fom: 5.57668 | r2int: 0.00743747 | r2eff: 0 | hits: 219 ] steps - 90 3899 [sigma: 26.5075 | error: 0.0982855 | coeff: 0.0982855 | eff: 1 | fom: 4.3133 | r2int: 0.00961382 | r2eff: 0 | hits: 209 ] steps - 91 3621 [sigma: 11.7398 | error: 0.056249 | coeff: 0.056249 | eff: 1 | fom: 13.1692 | r2int: 0.00315344 | r2eff: 0 | hits: 301 ] steps - 92 4405 [sigma: 12.1029 | error: 0.0493027 | coeff: 0.0493027 | eff: 1 | fom: 17.1414 | r2int: 0.00242321 | r2eff: 0 | hits: 322 ] steps - 93 3922 [sigma: 11.8818 | error: 0.0547835 | coeff: 0.0547835 | eff: 1 | fom: 13.8832 | r2int: 0.00299205 | r2eff: 0 | hits: 327 ] steps - 94 3218 [sigma: 22.1545 | error: 0.0941449 | coeff: 0.0941449 | eff: 1 | fom: 4.70106 | r2int: 0.00881586 | r2eff: 0 | hits: 187 ] steps - 95 2758 [sigma: 27.436 | error: 0.11601 | coeff: 0.11601 | eff: 1 | fom: 3.09596 | r2int: 0.0133594 | r2eff: 0 | hits: 136 ] steps - 96 3774 [sigma: 23.4174 | error: 0.0907702 | coeff: 0.0907702 | eff: 1 | fom: 5.05711 | r2int: 0.00820073 | r2eff: 0 | hits: 214 ] steps - 97 4714 [sigma: 28.7876 | error: 0.0934165 | coeff: 0.0934165 | eff: 1 | fom: 4.77465 | r2int: 0.00868935 | r2eff: 0 | hits: 234 ] steps - 98 5052 [sigma: 26.883 | error: 0.0829502 | coeff: 0.0829502 | eff: 1 | fom: 6.05555 | r2int: 0.00685242 | r2eff: 0 | hits: 243 ] steps - 99 2844 [sigma: 22.4749 | error: 0.098703 | coeff: 0.098703 | eff: 1 | fom: 4.27689 | r2int: 0.00967983 | r2eff: 0 | hits: 156 ] steps - 100 14236 [sigma: 26.2643 | error: 0.0467461 | coeff: 0.0467461 | eff: 1 | fom: 19.0677 | r2int: 0.00218179 | r2eff: 0 | hits: 642 ] steps - 101 19039 [sigma: 27.9368 | error: 0.0412948 | coeff: 0.0412948 | eff: 1 | fom: 24.4341 | r2int: 0.00170311 | r2eff: 0 | hits: 792 ] steps - 102 18528 [sigma: 30.3127 | error: 0.0451324 | coeff: 0.0451324 | eff: 1 | fom: 20.4556 | r2int: 0.00203426 | r2eff: 0 | hits: 761 ] steps - 103 17519 [sigma: 27.0015 | error: 0.0427408 | coeff: 0.0427408 | eff: 1 | fom: 22.8089 | r2int: 0.0018244 | r2eff: 0 | hits: 769 ] steps - 104 15181 [sigma: 25.9441 | error: 0.0439711 | coeff: 0.0439711 | eff: 1 | fom: 20.6884 | r2int: 0.00193053 | r2eff: 0 | hits: 662 ] steps - 105 17425 [sigma: 26.392 | error: 0.0422464 | coeff: 0.0422464 | eff: 1 | fom: 22.412 | r2int: 0.00178246 | r2eff: 0 | hits: 778 ] steps - 106 25081 [sigma: 31.0507 | error: 0.0387956 | coeff: 0.0387956 | eff: 1 | fom: 26.5764 | r2int: 0.00150356 | r2eff: 0 | hits: 982 ] steps - 107 24404 [sigma: 29.6996 | error: 0.038504 | coeff: 0.038504 | eff: 1 | fom: 26.9804 | r2int: 0.00148108 | r2eff: 0 | hits: 1001 ] steps - 108 23142 [sigma: 27.5689 | error: 0.0369301 | coeff: 0.0369301 | eff: 1 | fom: 29.3292 | r2int: 0.00136241 | r2eff: 0 | hits: 961 ] steps - 109 17779 [sigma: 27.2605 | error: 0.0427952 | coeff: 0.0427952 | eff: 1 | fom: 21.8409 | r2int: 0.00182908 | r2eff: 0 | hits: 779 ] steps - 110 19603 [sigma: 28.3606 | error: 0.0409968 | coeff: 0.0409968 | eff: 1 | fom: 23.799 | r2int: 0.00167865 | r2eff: 0 | hits: 803 ] steps - 111 23784 [sigma: 26.5896 | error: 0.0357224 | coeff: 0.0357224 | eff: 1 | fom: 31.3458 | r2int: 0.00127484 | r2eff: 0 | hits: 1021 ] steps - 112 25449 [sigma: 29.4395 | error: 0.0365081 | coeff: 0.0365081 | eff: 1 | fom: 30.0111 | r2int: 0.0013315 | r2eff: 0 | hits: 996 ] steps - 113 24049 [sigma: 28.1783 | error: 0.0365489 | coeff: 0.0365489 | eff: 1 | fom: 29.9441 | r2int: 0.00133445 | r2eff: 0 | hits: 973 ] steps - 114 18168 [sigma: 26.768 | error: 0.0409371 | coeff: 0.0409371 | eff: 1 | fom: 23.8686 | r2int: 0.00167367 | r2eff: 0 | hits: 772 ] steps - 115 18756 [sigma: 28.1028 | error: 0.0418731 | coeff: 0.0418731 | eff: 1 | fom: 21.9359 | r2int: 0.00175111 | r2eff: 0 | hits: 781 ] steps - 116 23325 [sigma: 27.7983 | error: 0.0367332 | coeff: 0.0367332 | eff: 1 | fom: 28.5042 | r2int: 0.00134791 | r2eff: 0 | hits: 950 ] steps - 117 22665 [sigma: 27.6446 | error: 0.0379287 | coeff: 0.0379287 | eff: 1 | fom: 26.7357 | r2int: 0.0014371 | r2eff: 0 | hits: 967 ] steps - 118 22837 [sigma: 26.347 | error: 0.0360611 | coeff: 0.0360611 | eff: 1 | fom: 29.5766 | r2int: 0.00129908 | r2eff: 0 | hits: 977 ] steps - 119 17774 [sigma: 26.0106 | error: 0.0408183 | coeff: 0.0408183 | eff: 1 | fom: 23.0843 | r2int: 0.00166399 | r2eff: 0 | hits: 778 ] steps - 120 13840 [sigma: 25.7331 | error: 0.0456199 | coeff: 0.0456199 | eff: 1 | fom: 18.4807 | r2int: 0.00207772 | r2eff: 0 | hits: 602 ] steps - 121 17910 [sigma: 26.1287 | error: 0.0410567 | coeff: 0.0410567 | eff: 1 | fom: 22.817 | r2int: 0.00168353 | r2eff: 0 | hits: 792 ] steps - 122 17402 [sigma: 26.8322 | error: 0.043802 | coeff: 0.043802 | eff: 1 | fom: 20.0465 | r2int: 0.00191624 | r2eff: 0 | hits: 807 ] steps - 123 17229 [sigma: 25.6436 | error: 0.041167 | coeff: 0.041167 | eff: 1 | fom: 22.6949 | r2int: 0.00169251 | r2eff: 0 | hits: 765 ] steps - 124 12762 [sigma: 24.7119 | error: 0.047589 | coeff: 0.047589 | eff: 1 | fom: 16.983 | r2int: 0.00226096 | r2eff: 0 | hits: 604 ] steps + 0 23.000000 steps + 1 34.000000 steps + 2 17.000000 steps + 3 26.000000 steps + 4 49.000000 steps + 5 102.000000 steps + 6 59.000000 steps + 7 6.000000 steps + 8 87.000000 steps + 9 54.000000 steps + 10 90.000000 steps + 11 77.000000 steps + 12 52.000000 steps + 13 73.000000 steps + 14 69.000000 steps + 15 144.000000 steps + 16 74.000000 steps + 17 60.000000 steps + 18 37.000000 steps + 19 39.000000 steps + 20 66.000000 steps + 21 132.000000 steps + 22 37.000000 steps + 23 21.000000 steps + 24 26.000000 steps + 25 145.000000 steps + 26 298.000000 steps + 27 141.000000 steps + 28 257.000000 steps + 29 200.000000 steps + 30 161.000000 steps + 31 361.000000 steps + 32 511.000000 steps + 33 500.000000 steps + 34 231.000000 steps + 35 101.000000 steps + 36 186.000000 steps + 37 651.000000 steps + 38 192.000000 steps + 39 279.000000 steps + 40 137.000000 steps + 41 202.000000 steps + 42 280.000000 steps + 43 329.000000 steps + 44 132.000000 steps + 45 141.000000 steps + 46 116.000000 steps + 47 85.000000 steps + 48 131.000000 steps + 49 85.000000 steps + 50 591.000000 steps + 51 599.000000 steps + 52 592.000000 steps + 53 772.000000 steps + 54 339.000000 steps + 55 466.000000 steps + 56 1061.000000 steps + 57 1556.000000 steps + 58 827.000000 steps + 59 602.000000 steps + 60 627.000000 steps + 61 1080.000000 steps + 62 1287.000000 steps + 63 1550.000000 steps + 64 624.000000 steps + 65 937.000000 steps + 66 1043.000000 steps + 67 1233.000000 steps + 68 1088.000000 steps + 69 697.000000 steps + 70 315.000000 steps + 71 737.000000 steps + 72 441.000000 steps + 73 524.000000 steps + 74 478.000000 steps + 75 2407.000000 steps + 76 4109.000000 steps + 77 4723.000000 steps + 78 4367.000000 steps + 79 2645.000000 steps + 80 4367.000000 steps + 81 3840.000000 steps + 82 4316.000000 steps + 83 4039.000000 steps + 84 3760.000000 steps + 85 4504.000000 steps + 86 3686.000000 steps + 87 4324.000000 steps + 88 4152.000000 steps + 89 4325.000000 steps + 90 3570.000000 steps + 91 4074.000000 steps + 92 4000.000000 steps + 93 4074.000000 steps + 94 3845.000000 steps + 95 2171.000000 steps + 96 2932.000000 steps + 97 4433.000000 steps + 98 3375.000000 steps + 99 3524.000000 steps + 100 14462.000000 steps + 101 19876.000000 steps + 102 21201.000000 steps + 103 20085.000000 steps + 104 17236.000000 steps + 105 18885.000000 steps + 106 22790.000000 steps + 107 22426.000000 steps + 108 26517.000000 steps + 109 21088.000000 steps + 110 19720.000000 steps + 111 22310.000000 steps + 112 25663.000000 steps + 113 24977.000000 steps + 114 21326.000000 steps + 115 19107.000000 steps + 116 24677.000000 steps + 117 25403.000000 steps + 118 24236.000000 steps + 119 18917.000000 steps + 120 15224.000000 steps + 121 18542.000000 steps + 122 20159.000000 steps + 123 19604.000000 steps + 124 14858.000000 steps + 0 23 [sigma: 3.78153 | error: 0.367642 | coeff: 0.367642 | eff: 1 | fom: 0.3363 | r2int: 0.108129 | r2eff: 0 | hits: 5 ] steps + 1 34 [sigma: 4.29839 | error: 0.334485 | coeff: 0.334485 | eff: 1 | fom: 0.406279 | r2int: 0.0958972 | r2eff: 0 | hits: 7 ] steps + 2 17 [sigma: 3.91152 | error: 0.514496 | coeff: 0.514496 | eff: 1 | fom: 0.171717 | r2int: 0.211765 | r2eff: 0 | hits: 5 ] steps + 3 26 [sigma: 5.16398 | error: 0.486504 | coeff: 0.486504 | eff: 1 | fom: 0.192045 | r2int: 0.197239 | r2eff: 0 | hits: 6 ] steps + 4 49 [sigma: 11.4164 | error: 0.616426 | coeff: 0.616426 | eff: 1 | fom: 0.119623 | r2int: 0.325698 | r2eff: 0 | hits: 7 ] steps + 5 102 [sigma: 21.9913 | error: 0.570428 | coeff: 0.570428 | eff: 1 | fom: 0.139694 | r2int: 0.278904 | r2eff: 0 | hits: 7 ] steps + 6 59 [sigma: 6.78438 | error: 0.344968 | coeff: 0.344968 | eff: 1 | fom: 0.381961 | r2int: 0.105781 | r2eff: 0 | hits: 9 ] steps + 7 6 [sigma: 0 | error: 0 | coeff: 0 | eff: 1 | fom: 1 | r2int: 0 | r2eff: 0 | hits: 6 ] steps + 8 87 [sigma: 9.49162 | error: 0.361841 | coeff: 0.361841 | eff: 1 | fom: 0.34717 | r2int: 0.119026 | r2eff: 0 | hits: 11 ] steps + 9 54 [sigma: 7.67494 | error: 0.376037 | coeff: 0.376037 | eff: 1 | fom: 0.321452 | r2int: 0.121203 | r2eff: 0 | hits: 7 ] steps + 10 90 [sigma: 9.20968 | error: 0.354481 | coeff: 0.354481 | eff: 1 | fom: 0.361736 | r2int: 0.115185 | r2eff: 0 | hits: 12 ] steps + 11 77 [sigma: 4.98845 | error: 0.242403 | coeff: 0.242403 | eff: 1 | fom: 0.77357 | r2int: 0.0545623 | r2eff: 0 | hits: 14 ] steps + 12 52 [sigma: 6.22049 | error: 0.358874 | coeff: 0.358874 | eff: 1 | fom: 0.352933 | r2int: 0.114481 | r2eff: 0 | hits: 9 ] steps + 13 73 [sigma: 7.40683 | error: 0.30439 | coeff: 0.30439 | eff: 1 | fom: 0.490587 | r2int: 0.0823586 | r2eff: 0 | hits: 9 ] steps + 14 69 [sigma: 14.9469 | error: 0.6127 | coeff: 0.6127 | eff: 1 | fom: 0.121083 | r2int: 0.328476 | r2eff: 0 | hits: 8 ] steps + 15 144 [sigma: 15.6219 | error: 0.343061 | coeff: 0.343061 | eff: 1 | fom: 0.386219 | r2int: 0.105922 | r2eff: 0 | hits: 10 ] steps + 16 74 [sigma: 5.8902 | error: 0.238792 | coeff: 0.238792 | eff: 1 | fom: 0.797147 | r2int: 0.0506858 | r2eff: 0 | hits: 9 ] steps + 17 60 [sigma: 8.31522 | error: 0.391983 | coeff: 0.391983 | eff: 1 | fom: 0.29583 | r2int: 0.134444 | r2eff: 0 | hits: 8 ] steps + 18 37 [sigma: 4.20671 | error: 0.321578 | coeff: 0.321578 | eff: 1 | fom: 0.439547 | r2int: 0.0904858 | r2eff: 0 | hits: 8 ] steps + 19 39 [sigma: 10.2323 | error: 0.58667 | coeff: 0.58667 | eff: 1 | fom: 0.132066 | r2int: 0.275345 | r2eff: 0 | hits: 5 ] steps + 20 66 [sigma: 13.3116 | error: 0.450996 | coeff: 0.450996 | eff: 1 | fom: 0.223476 | r2int: 0.162718 | r2eff: 0 | hits: 5 ] steps + 21 132 [sigma: 12.1637 | error: 0.291401 | coeff: 0.291401 | eff: 1 | fom: 0.535296 | r2int: 0.0764233 | r2eff: 0 | hits: 10 ] steps + 22 37 [sigma: 4.10357 | error: 0.313693 | coeff: 0.313693 | eff: 1 | fom: 0.46192 | r2int: 0.086103 | r2eff: 0 | hits: 8 ] steps + 23 21 [sigma: 3.69685 | error: 0.465759 | coeff: 0.465759 | eff: 1 | fom: 0.209534 | r2int: 0.185941 | r2eff: 0 | hits: 7 ] steps + 24 26 [sigma: 8.48528 | error: 0.461538 | coeff: 0.461538 | eff: 1 | fom: 0.213384 | r2int: 0.106509 | r2eff: 0 | hits: 2 ] steps + 25 145 [sigma: 8.52313 | error: 0.249383 | coeff: 0.249383 | eff: 1 | fom: 0.730874 | r2int: 0.058737 | r2eff: 0 | hits: 18 ] steps + 26 298 [sigma: 12.2144 | error: 0.212979 | coeff: 0.212979 | eff: 1 | fom: 1.00208 | r2int: 0.04368 | r2eff: 0 | hits: 27 ] steps + 27 141 [sigma: 7.15597 | error: 0.226968 | coeff: 0.226968 | eff: 1 | fom: 0.882366 | r2int: 0.0489387 | r2eff: 0 | hits: 20 ] steps + 28 257 [sigma: 25.0526 | error: 0.36474 | coeff: 0.36474 | eff: 1 | fom: 0.341673 | r2int: 0.123533 | r2eff: 0 | hits: 14 ] steps + 29 200 [sigma: 16.5096 | error: 0.340354 | coeff: 0.340354 | eff: 1 | fom: 0.392389 | r2int: 0.109026 | r2eff: 0 | hits: 17 ] steps + 30 161 [sigma: 7.94539 | error: 0.197401 | coeff: 0.197401 | eff: 1 | fom: 1.16648 | r2int: 0.0365317 | r2eff: 0 | hits: 16 ] steps + 31 361 [sigma: 18.8665 | error: 0.266484 | coeff: 0.266484 | eff: 1 | fom: 0.64008 | r2int: 0.0682826 | r2eff: 0 | hits: 26 ] steps + 32 511 [sigma: 14.7812 | error: 0.187462 | coeff: 0.187462 | eff: 1 | fom: 1.29345 | r2int: 0.0343053 | r2eff: 0 | hits: 42 ] steps + 33 500 [sigma: 14.502 | error: 0.183437 | coeff: 0.183437 | eff: 1 | fom: 1.35083 | r2int: 0.032808 | r2eff: 0 | hits: 40 ] steps + 34 231 [sigma: 19.6857 | error: 0.45094 | coeff: 0.45094 | eff: 1 | fom: 0.223532 | r2int: 0.196084 | r2eff: 0 | hits: 28 ] steps + 35 101 [sigma: 9.07598 | error: 0.449306 | coeff: 0.449306 | eff: 1 | fom: 0.225161 | r2int: 0.193801 | r2eff: 0 | hits: 25 ] steps + 36 186 [sigma: 5.86714 | error: 0.157719 | coeff: 0.157719 | eff: 1 | fom: 1.8273 | r2int: 0.0238802 | r2eff: 0 | hits: 25 ] steps + 37 651 [sigma: 17.0574 | error: 0.163631 | coeff: 0.163631 | eff: 1 | fom: 1.69765 | r2int: 0.0260884 | r2eff: 0 | hits: 39 ] steps + 38 192 [sigma: 7.91257 | error: 0.201893 | coeff: 0.201893 | eff: 1 | fom: 1.11515 | r2int: 0.0390625 | r2eff: 0 | hits: 24 ] steps + 39 279 [sigma: 18.5655 | error: 0.325994 | coeff: 0.325994 | eff: 1 | fom: 0.42772 | r2int: 0.101844 | r2eff: 0 | hits: 24 ] steps + 40 137 [sigma: 11.773 | error: 0.36459 | coeff: 0.36459 | eff: 1 | fom: 0.341955 | r2int: 0.125541 | r2eff: 0 | hits: 18 ] steps + 41 202 [sigma: 9.40573 | error: 0.202964 | coeff: 0.202964 | eff: 1 | fom: 1.10342 | r2int: 0.0390261 | r2eff: 0 | hits: 19 ] steps + 42 280 [sigma: 9.76035 | error: 0.190927 | coeff: 0.190927 | eff: 1 | fom: 1.24693 | r2int: 0.0352381 | r2eff: 0 | hits: 30 ] steps + 43 329 [sigma: 14.8174 | error: 0.225189 | coeff: 0.225189 | eff: 1 | fom: 0.89636 | r2int: 0.0486817 | r2eff: 0 | hits: 25 ] steps + 44 132 [sigma: 7.79987 | error: 0.283385 | coeff: 0.283385 | eff: 1 | fom: 0.566008 | r2int: 0.0768156 | r2eff: 0 | hits: 23 ] steps + 45 141 [sigma: 15.8999 | error: 0.406582 | coeff: 0.406582 | eff: 1 | fom: 0.274968 | r2int: 0.152593 | r2eff: 0 | hits: 13 ] steps + 46 116 [sigma: 7.72257 | error: 0.25784 | coeff: 0.25784 | eff: 1 | fom: 0.68372 | r2int: 0.0620491 | r2eff: 0 | hits: 15 ] steps + 47 85 [sigma: 6.33213 | error: 0.297982 | coeff: 0.297982 | eff: 1 | fom: 0.511913 | r2int: 0.0832439 | r2eff: 0 | hits: 16 ] steps + 48 131 [sigma: 9.08007 | error: 0.294072 | coeff: 0.294072 | eff: 1 | fom: 0.525616 | r2int: 0.0816742 | r2eff: 0 | hits: 18 ] steps + 49 85 [sigma: 5.0599 | error: 0.214632 | coeff: 0.214632 | eff: 1 | fom: 0.986707 | r2int: 0.0425233 | r2eff: 0 | hits: 13 ] steps + 50 591 [sigma: 20.3798 | error: 0.206901 | coeff: 0.206901 | eff: 1 | fom: 1.06182 | r2int: 0.0416191 | r2eff: 0 | hits: 36 ] steps + 51 599 [sigma: 16.8578 | error: 0.217997 | coeff: 0.217997 | eff: 1 | fom: 0.956482 | r2int: 0.0467306 | r2eff: 0 | hits: 60 ] steps + 52 592 [sigma: 12.4787 | error: 0.175094 | coeff: 0.175094 | eff: 1 | fom: 1.48263 | r2int: 0.0302137 | r2eff: 0 | hits: 69 ] steps + 53 772 [sigma: 29.367 | error: 0.294658 | coeff: 0.294658 | eff: 1 | fom: 0.523529 | r2int: 0.0853763 | r2eff: 0 | hits: 60 ] steps + 54 339 [sigma: 16.9857 | error: 0.292162 | coeff: 0.292162 | eff: 1 | fom: 0.532513 | r2int: 0.082848 | r2eff: 0 | hits: 34 ] steps + 55 466 [sigma: 13.5541 | error: 0.203602 | coeff: 0.203602 | eff: 1 | fom: 1.09651 | r2int: 0.0406079 | r2eff: 0 | hits: 49 ] steps + 56 1061 [sigma: 12.0913 | error: 0.0980332 | coeff: 0.0980332 | eff: 1 | fom: 4.72967 | r2int: 0.00948064 | r2eff: 0 | hits: 74 ] steps + 57 1556 [sigma: 14.6062 | error: 0.0948041 | coeff: 0.0948041 | eff: 1 | fom: 5.05735 | r2int: 0.0088997 | r2eff: 0 | hits: 102 ] steps + 58 827 [sigma: 10.1999 | error: 0.106097 | coeff: 0.106097 | eff: 1 | fom: 4.03802 | r2int: 0.0111045 | r2eff: 0 | hits: 74 ] steps + 59 602 [sigma: 15.9933 | error: 0.200576 | coeff: 0.200576 | eff: 1 | fom: 1.12984 | r2int: 0.039525 | r2eff: 0 | hits: 57 ] steps + 60 627 [sigma: 14.0294 | error: 0.176184 | coeff: 0.176184 | eff: 1 | fom: 1.46435 | r2int: 0.0305401 | r2eff: 0 | hits: 62 ] steps + 61 1080 [sigma: 11.9067 | error: 0.108019 | coeff: 0.108019 | eff: 1 | fom: 3.8956 | r2int: 0.0115466 | r2eff: 0 | hits: 96 ] steps + 62 1287 [sigma: 9.13167 | error: 0.0793281 | coeff: 0.0793281 | eff: 1 | fom: 7.2231 | r2int: 0.0062426 | r2eff: 0 | hits: 125 ] steps + 63 1550 [sigma: 16.9732 | error: 0.110051 | coeff: 0.110051 | eff: 1 | fom: 3.75313 | r2int: 0.0119912 | r2eff: 0 | hits: 101 ] steps + 64 624 [sigma: 11.5853 | error: 0.154222 | coeff: 0.154222 | eff: 1 | fom: 1.9111 | r2int: 0.0234397 | r2eff: 0 | hits: 69 ] steps + 65 937 [sigma: 31.4304 | error: 0.259828 | coeff: 0.259828 | eff: 1 | fom: 0.673297 | r2int: 0.0663852 | r2eff: 0 | hits: 60 ] steps + 66 1043 [sigma: 12.2733 | error: 0.101226 | coeff: 0.101226 | eff: 1 | fom: 4.43597 | r2int: 0.0101083 | r2eff: 0 | hits: 74 ] steps + 67 1233 [sigma: 12.4516 | error: 0.0984291 | coeff: 0.0984291 | eff: 1 | fom: 4.6917 | r2int: 0.00958631 | r2eff: 0 | hits: 95 ] steps + 68 1088 [sigma: 12.8112 | error: 0.111707 | coeff: 0.111707 | eff: 1 | fom: 3.64261 | r2int: 0.0123399 | r2eff: 0 | hits: 90 ] steps + 69 697 [sigma: 18.5482 | error: 0.206132 | coeff: 0.206132 | eff: 1 | fom: 1.06976 | r2int: 0.0417822 | r2eff: 0 | hits: 60 ] steps + 70 315 [sigma: 17.261 | error: 0.324182 | coeff: 0.324182 | eff: 1 | fom: 0.432514 | r2int: 0.102091 | r2eff: 0 | hits: 35 ] steps + 71 737 [sigma: 16.4853 | error: 0.173263 | coeff: 0.173263 | eff: 1 | fom: 1.51414 | r2int: 0.0295197 | r2eff: 0 | hits: 60 ] steps + 72 441 [sigma: 11.2251 | error: 0.190478 | coeff: 0.190478 | eff: 1 | fom: 1.25282 | r2int: 0.0356339 | r2eff: 0 | hits: 56 ] steps + 73 524 [sigma: 10.7385 | error: 0.14491 | coeff: 0.14491 | eff: 1 | fom: 2.16461 | r2int: 0.0205789 | r2eff: 0 | hits: 50 ] steps + 74 478 [sigma: 16.1426 | error: 0.218862 | coeff: 0.218862 | eff: 1 | fom: 0.948938 | r2int: 0.04676 | r2eff: 0 | hits: 42 ] steps + 75 2407 [sigma: 20.7205 | error: 0.108206 | coeff: 0.108206 | eff: 1 | fom: 3.88214 | r2int: 0.0116345 | r2eff: 0 | hits: 158 ] steps + 76 4109 [sigma: 24.3421 | error: 0.0868643 | coeff: 0.0868643 | eff: 1 | fom: 6.02413 | r2int: 0.00751032 | r2eff: 0 | hits: 215 ] steps + 77 4723 [sigma: 29.8336 | error: 0.0978573 | coeff: 0.0978573 | eff: 1 | fom: 4.74669 | r2int: 0.00953615 | r2eff: 0 | hits: 240 ] steps + 78 4367 [sigma: 31.1372 | error: 0.106236 | coeff: 0.106236 | eff: 1 | fom: 4.02747 | r2int: 0.0112353 | r2eff: 0 | hits: 222 ] steps + 79 2645 [sigma: 26.1256 | error: 0.116033 | coeff: 0.116033 | eff: 1 | fom: 3.37611 | r2int: 0.013366 | r2eff: 0 | hits: 138 ] steps + 80 4367 [sigma: 25.7324 | error: 0.0897513 | coeff: 0.0897513 | eff: 1 | fom: 5.64282 | r2int: 0.00802057 | r2eff: 0 | hits: 232 ] steps + 81 3840 [sigma: 11.5875 | error: 0.0535565 | coeff: 0.0535565 | eff: 1 | fom: 15.8472 | r2int: 0.0028592 | r2eff: 0 | hits: 315 ] steps + 82 4316 [sigma: 12.3758 | error: 0.0517728 | coeff: 0.0517728 | eff: 1 | fom: 16.958 | r2int: 0.0026722 | r2eff: 0 | hits: 326 ] steps + 83 4039 [sigma: 12.2745 | error: 0.0551225 | coeff: 0.0551225 | eff: 1 | fom: 14.9596 | r2int: 0.00302926 | r2eff: 0 | hits: 329 ] steps + 84 3760 [sigma: 24.595 | error: 0.100275 | coeff: 0.100275 | eff: 1 | fom: 4.52055 | r2int: 0.0100123 | r2eff: 0 | hits: 235 ] steps + 85 4504 [sigma: 28.915 | error: 0.0975733 | coeff: 0.0975733 | eff: 1 | fom: 4.77437 | r2int: 0.00947933 | r2eff: 0 | hits: 231 ] steps + 86 3686 [sigma: 11.7371 | error: 0.0553359 | coeff: 0.0553359 | eff: 1 | fom: 14.8444 | r2int: 0.00305192 | r2eff: 0 | hits: 302 ] steps + 87 4324 [sigma: 13.7456 | error: 0.0556988 | coeff: 0.0556988 | eff: 1 | fom: 14.6516 | r2int: 0.00309225 | r2eff: 0 | hits: 307 ] steps + 88 4152 [sigma: 12.783 | error: 0.0560976 | coeff: 0.0560976 | eff: 1 | fom: 14.4441 | r2int: 0.00313746 | r2eff: 0 | hits: 332 ] steps + 89 4325 [sigma: 32.181 | error: 0.112598 | coeff: 0.112598 | eff: 1 | fom: 3.58521 | r2int: 0.012623 | r2eff: 0 | hits: 229 ] steps + 90 3570 [sigma: 20.9431 | error: 0.0868152 | coeff: 0.0868152 | eff: 1 | fom: 6.03095 | r2int: 0.00750246 | r2eff: 0 | hits: 219 ] steps + 91 4074 [sigma: 12.8739 | error: 0.0551872 | coeff: 0.0551872 | eff: 1 | fom: 14.9245 | r2int: 0.00303565 | r2eff: 0 | hits: 305 ] steps + 92 4000 [sigma: 13.3407 | error: 0.0597546 | coeff: 0.0597546 | eff: 1 | fom: 12.7302 | r2int: 0.00355949 | r2eff: 0 | hits: 321 ] steps + 93 4074 [sigma: 14.3371 | error: 0.062161 | coeff: 0.062161 | eff: 1 | fom: 11.7636 | r2int: 0.00385161 | r2eff: 0 | hits: 312 ] steps + 94 3845 [sigma: 27.1784 | error: 0.104365 | coeff: 0.104365 | eff: 1 | fom: 4.17317 | r2int: 0.0108421 | r2eff: 0 | hits: 218 ] steps + 95 2171 [sigma: 20.8788 | error: 0.107952 | coeff: 0.107952 | eff: 1 | fom: 3.90047 | r2int: 0.0115611 | r2eff: 0 | hits: 126 ] steps + 96 2932 [sigma: 19.3569 | error: 0.0933654 | coeff: 0.0933654 | eff: 1 | fom: 5.21442 | r2int: 0.00867351 | r2eff: 0 | hits: 200 ] steps + 97 4433 [sigma: 32.5542 | error: 0.112815 | coeff: 0.112815 | eff: 1 | fom: 3.57146 | r2int: 0.0126732 | r2eff: 0 | hits: 236 ] steps + 98 3375 [sigma: 24.1672 | error: 0.0994789 | coeff: 0.0994789 | eff: 1 | fom: 4.5932 | r2int: 0.00984478 | r2eff: 0 | hits: 193 ] steps + 99 3524 [sigma: 34.252 | error: 0.11623 | coeff: 0.11623 | eff: 1 | fom: 3.36465 | r2int: 0.013415 | r2eff: 0 | hits: 143 ] steps + 100 14462 [sigma: 29.0258 | error: 0.0506952 | coeff: 0.0506952 | eff: 1 | fom: 17.6866 | r2int: 0.00256597 | r2eff: 0 | hits: 638 ] steps + 101 19876 [sigma: 29.1113 | error: 0.0410623 | coeff: 0.0410623 | eff: 1 | fom: 26.9582 | r2int: 0.00168397 | r2eff: 0 | hits: 786 ] steps + 102 21201 [sigma: 31.3023 | error: 0.0421501 | coeff: 0.0421501 | eff: 1 | fom: 25.5847 | r2int: 0.00177445 | r2eff: 0 | hits: 815 ] steps + 103 20085 [sigma: 32.4776 | error: 0.0452185 | coeff: 0.0452185 | eff: 1 | fom: 22.2303 | r2int: 0.0020421 | r2eff: 0 | hits: 782 ] steps + 104 17236 [sigma: 31.9774 | error: 0.0487338 | coeff: 0.0487338 | eff: 1 | fom: 19.1389 | r2int: 0.00237154 | r2eff: 0 | hits: 690 ] steps + 105 18885 [sigma: 28.6605 | error: 0.0424938 | coeff: 0.0424938 | eff: 1 | fom: 25.1725 | r2int: 0.00180342 | r2eff: 0 | hits: 784 ] steps + 106 22790 [sigma: 29.1867 | error: 0.0389293 | coeff: 0.0389293 | eff: 1 | fom: 29.9934 | r2int: 0.00151385 | r2eff: 0 | hits: 924 ] steps + 107 22426 [sigma: 27.9201 | error: 0.0388946 | coeff: 0.0388946 | eff: 1 | fom: 30.0468 | r2int: 0.00151124 | r2eff: 0 | hits: 976 ] steps + 108 26517 [sigma: 32.697 | error: 0.0392065 | coeff: 0.0392065 | eff: 1 | fom: 28.2849 | r2int: 0.00153563 | r2eff: 0 | hits: 1011 ] steps + 109 21088 [sigma: 30.2992 | error: 0.0414933 | coeff: 0.0414933 | eff: 1 | fom: 25.2532 | r2int: 0.00171963 | r2eff: 0 | hits: 834 ] steps + 110 19720 [sigma: 30.0409 | error: 0.0432756 | coeff: 0.0432756 | eff: 1 | fom: 23.2159 | r2int: 0.00187046 | r2eff: 0 | hits: 807 ] steps + 111 22310 [sigma: 29.1901 | error: 0.040093 | coeff: 0.040093 | eff: 1 | fom: 27.048 | r2int: 0.00160573 | r2eff: 0 | hits: 939 ] steps + 112 25663 [sigma: 31.9829 | error: 0.0394694 | coeff: 0.0394694 | eff: 1 | fom: 27.9094 | r2int: 0.00155628 | r2eff: 0 | hits: 1003 ] steps + 113 24977 [sigma: 31.2512 | error: 0.0398424 | coeff: 0.0398424 | eff: 1 | fom: 27.3894 | r2int: 0.00158585 | r2eff: 0 | hits: 1014 ] steps + 114 21326 [sigma: 33.4406 | error: 0.0447929 | coeff: 0.0447929 | eff: 1 | fom: 21.6697 | r2int: 0.00200395 | r2eff: 0 | hits: 816 ] steps + 115 19107 [sigma: 29.6115 | error: 0.0432827 | coeff: 0.0432827 | eff: 1 | fom: 23.2083 | r2int: 0.00187099 | r2eff: 0 | hits: 780 ] steps + 116 24677 [sigma: 30.8852 | error: 0.0383726 | coeff: 0.0383726 | eff: 1 | fom: 29.5277 | r2int: 0.00147089 | r2eff: 0 | hits: 940 ] steps + 117 25403 [sigma: 33.7352 | error: 0.0417845 | coeff: 0.0417845 | eff: 1 | fom: 24.9024 | r2int: 0.00174418 | r2eff: 0 | hits: 990 ] steps + 118 24236 [sigma: 30.7308 | error: 0.0394504 | coeff: 0.0394504 | eff: 1 | fom: 27.9364 | r2int: 0.00155472 | r2eff: 0 | hits: 968 ] steps + 119 18917 [sigma: 29.8704 | error: 0.0444937 | coeff: 0.0444937 | eff: 1 | fom: 21.9622 | r2int: 0.00197719 | r2eff: 0 | hits: 794 ] steps + 120 15224 [sigma: 30.7459 | error: 0.0501244 | coeff: 0.0501244 | eff: 1 | fom: 17.3051 | r2int: 0.00250838 | r2eff: 0 | hits: 616 ] steps + 121 18542 [sigma: 31.8987 | error: 0.0462899 | coeff: 0.0462899 | eff: 1 | fom: 19.4454 | r2int: 0.0021398 | r2eff: 0 | hits: 724 ] steps + 122 20159 [sigma: 31.3362 | error: 0.0435246 | coeff: 0.0435246 | eff: 1 | fom: 21.9948 | r2int: 0.00189197 | r2eff: 0 | hits: 784 ] steps + 123 19604 [sigma: 32.9301 | error: 0.0451666 | coeff: 0.0451666 | eff: 1 | fom: 20.4246 | r2int: 0.0020372 | r2eff: 0 | hits: 723 ] steps + 124 14858 [sigma: 30.8127 | error: 0.0507554 | coeff: 0.0507554 | eff: 1 | fom: 16.1742 | r2int: 0.00257181 | r2eff: 0 | hits: 599 ] steps ============================================================ closed file mfd_tl_NumberOfSteps.out for output ============================================================ opened file mfd_tg_NumberOfSteps.out for output ============================================================ - 0 12.000000 steps - 1 32.000000 steps - 2 32.000000 steps - 3 77.000000 steps - 4 83.000000 steps - 5 57.000000 steps - 6 50.000000 steps - 7 51.000000 steps - 8 98.000000 steps - 9 35.000000 steps - 10 36.000000 steps - 11 51.000000 steps - 12 101.000000 steps - 13 46.000000 steps - 14 16.000000 steps - 15 51.000000 steps - 16 39.000000 steps - 17 89.000000 steps - 18 53.000000 steps - 19 9.000000 steps - 20 63.000000 steps - 21 12.000000 steps - 22 118.000000 steps - 23 71.000000 steps - 24 14.000000 steps - 25 132.000000 steps - 26 176.000000 steps - 27 152.000000 steps - 28 146.000000 steps - 29 292.000000 steps - 30 148.000000 steps - 31 399.000000 steps - 32 295.000000 steps - 33 317.000000 steps - 34 173.000000 steps - 35 90.000000 steps - 36 280.000000 steps - 37 284.000000 steps - 38 261.000000 steps - 39 208.000000 steps - 40 341.000000 steps - 41 198.000000 steps - 42 303.000000 steps - 43 360.000000 steps - 44 178.000000 steps - 45 159.000000 steps - 46 236.000000 steps - 47 231.000000 steps - 48 202.000000 steps - 49 84.000000 steps - 50 630.000000 steps - 51 789.000000 steps - 52 561.000000 steps - 53 505.000000 steps - 54 585.000000 steps - 55 655.000000 steps - 56 988.000000 steps - 57 1201.000000 steps - 58 1072.000000 steps - 59 385.000000 steps - 60 819.000000 steps - 61 1338.000000 steps - 62 1298.000000 steps - 63 1253.000000 steps - 64 603.000000 steps - 65 831.000000 steps - 66 855.000000 steps - 67 1248.000000 steps - 68 1148.000000 steps - 69 491.000000 steps - 70 398.000000 steps - 71 621.000000 steps - 72 752.000000 steps - 73 529.000000 steps - 74 417.000000 steps - 75 3443.000000 steps - 76 4473.000000 steps - 77 4391.000000 steps - 78 3708.000000 steps - 79 2927.000000 steps - 80 3011.000000 steps - 81 4349.000000 steps - 82 4323.000000 steps - 83 3932.000000 steps - 84 4151.000000 steps - 85 5131.000000 steps - 86 4250.000000 steps - 87 4808.000000 steps - 88 4063.000000 steps - 89 4132.000000 steps - 90 3899.000000 steps - 91 3621.000000 steps - 92 4405.000000 steps - 93 3922.000000 steps - 94 3218.000000 steps - 95 2758.000000 steps - 96 3774.000000 steps - 97 4714.000000 steps - 98 5052.000000 steps - 99 2844.000000 steps - 100 14236.000000 steps - 101 19039.000000 steps - 102 18528.000000 steps - 103 17519.000000 steps - 104 15181.000000 steps - 105 17425.000000 steps - 106 25081.000000 steps - 107 24404.000000 steps - 108 23142.000000 steps - 109 17779.000000 steps - 110 19603.000000 steps - 111 23784.000000 steps - 112 25449.000000 steps - 113 24049.000000 steps - 114 18168.000000 steps - 115 18756.000000 steps - 116 23325.000000 steps - 117 22665.000000 steps - 118 22837.000000 steps - 119 17774.000000 steps - 120 13840.000000 steps - 121 17910.000000 steps - 122 17402.000000 steps - 123 17229.000000 steps - 124 12762.000000 steps + 0 23.000000 steps + 1 34.000000 steps + 2 17.000000 steps + 3 26.000000 steps + 4 49.000000 steps + 5 102.000000 steps + 6 59.000000 steps + 7 6.000000 steps + 8 87.000000 steps + 9 54.000000 steps + 10 90.000000 steps + 11 77.000000 steps + 12 52.000000 steps + 13 73.000000 steps + 14 69.000000 steps + 15 144.000000 steps + 16 74.000000 steps + 17 60.000000 steps + 18 37.000000 steps + 19 39.000000 steps + 20 66.000000 steps + 21 132.000000 steps + 22 37.000000 steps + 23 21.000000 steps + 24 26.000000 steps + 25 145.000000 steps + 26 298.000000 steps + 27 141.000000 steps + 28 257.000000 steps + 29 200.000000 steps + 30 161.000000 steps + 31 361.000000 steps + 32 511.000000 steps + 33 500.000000 steps + 34 231.000000 steps + 35 101.000000 steps + 36 186.000000 steps + 37 651.000000 steps + 38 192.000000 steps + 39 279.000000 steps + 40 137.000000 steps + 41 202.000000 steps + 42 280.000000 steps + 43 329.000000 steps + 44 132.000000 steps + 45 141.000000 steps + 46 116.000000 steps + 47 85.000000 steps + 48 131.000000 steps + 49 85.000000 steps + 50 591.000000 steps + 51 599.000000 steps + 52 592.000000 steps + 53 772.000000 steps + 54 339.000000 steps + 55 466.000000 steps + 56 1061.000000 steps + 57 1556.000000 steps + 58 827.000000 steps + 59 602.000000 steps + 60 627.000000 steps + 61 1080.000000 steps + 62 1287.000000 steps + 63 1550.000000 steps + 64 624.000000 steps + 65 937.000000 steps + 66 1043.000000 steps + 67 1233.000000 steps + 68 1088.000000 steps + 69 697.000000 steps + 70 315.000000 steps + 71 737.000000 steps + 72 441.000000 steps + 73 524.000000 steps + 74 478.000000 steps + 75 2407.000000 steps + 76 4109.000000 steps + 77 4723.000000 steps + 78 4367.000000 steps + 79 2645.000000 steps + 80 4367.000000 steps + 81 3840.000000 steps + 82 4316.000000 steps + 83 4039.000000 steps + 84 3760.000000 steps + 85 4504.000000 steps + 86 3686.000000 steps + 87 4324.000000 steps + 88 4152.000000 steps + 89 4325.000000 steps + 90 3570.000000 steps + 91 4074.000000 steps + 92 4000.000000 steps + 93 4074.000000 steps + 94 3845.000000 steps + 95 2171.000000 steps + 96 2932.000000 steps + 97 4433.000000 steps + 98 3375.000000 steps + 99 3524.000000 steps + 100 14462.000000 steps + 101 19876.000000 steps + 102 21201.000000 steps + 103 20085.000000 steps + 104 17236.000000 steps + 105 18885.000000 steps + 106 22790.000000 steps + 107 22426.000000 steps + 108 26517.000000 steps + 109 21088.000000 steps + 110 19720.000000 steps + 111 22310.000000 steps + 112 25663.000000 steps + 113 24977.000000 steps + 114 21326.000000 steps + 115 19107.000000 steps + 116 24677.000000 steps + 117 25403.000000 steps + 118 24236.000000 steps + 119 18917.000000 steps + 120 15224.000000 steps + 121 18542.000000 steps + 122 20159.000000 steps + 123 19604.000000 steps + 124 14858.000000 steps ============================================================ closed file mfd_tg_NumberOfSteps.out for output ============================================================ @@ -1663,7 +1735,7 @@ Graphics systems deleted. Visualization Manager deleting... G4 kernel has come to Quit state. ================== Deleting memory pools =================== -Number of memory pools allocated: 13 of which, static: 0 -Dynamic pools deleted: 13 / Total memory freed: 0.069 MB +Number of memory pools allocated: 15 of which, static: 0 +Dynamic pools deleted: 15 / Total memory freed: 0.11 MB ============================================================ RunManagerKernel is deleted. Good bye :) diff --git a/examples/extended/parallel/TopC/ParN02/.README.N02.txt b/examples/extended/parallel/TopC/ParN02/.README.N02.txt deleted file mode 100644 index 6d0bf5cd93..0000000000 --- a/examples/extended/parallel/TopC/ParN02/.README.N02.txt +++ /dev/null @@ -1,124 +0,0 @@ - -///\file "parallel/TopC/ParN02/.README.N02.txt" -///\brief Example N02 (in ParN02) README page - -/*! \page ExampleN02InParN02 Example N02 in ParN02 - - - This example simulates a simplified fixe target experiment. - Read \link ExampleParN02 Example ParN02 \endlink for a description - of how to run it in parallel. - -\section ExampleN02InParN02_s1 GEOMETRY DEFINITION - - The setup consists of a target followed by six chambers of increasing - transverse size. These chambers are located in a region called Tracker - region. Their shape are boxes, constructed as parametrised volumes - (ChamberParametrisation class). - - The default geometry is constructed in DetectorConstruction class. - One can change the material of the target and of the chambers - interactively via the commands defined in the DetectorMessenger class. - - In addition a transverse uniform magnetic field can be applied (see - N02MagneticField and DetectorMessenger classes). - - -\section ExampleN02InParN02_s2 PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set in PhysicsList class. - - In this example, all the so called 'electromagnetic processes' are - introduced for gamma, charged leptons, and charged hadrons (see the - method PhysicsList::ConstructEM()). - - An important data member of this class is the defaultCutValue which - defines the production threshold of secondary particles - (mainly Ionisation and Bremsstrahlung processes are concerned by this - CutValue). - Notice that the CutValue must be given in unit of length, corresponding - to the stopping range of the particle. It is automatically converted - in energy for each material, and a table is printed in the method - PhysicsList::SetCuts() - - In addition the build-in interactive command: -\verbatim -/process/(in)activate processName -\endverbatim - allows to activate/inactivate the processes one by one. - - -\section ExampleN02InParN02_s3 RUNS and EVENTS - - The primary kinematic consists of a single particle which hits the - target perpendicular to the input face. The type of the particle - and its energy are set in the PrimaryGeneratorAction class, and can - be changed via the G4 build-in commands of ParticleGun class. - - A RUN is a set of events. - - The user has control: - -at Begin and End of each run (class RunAction) - -at Begin and End of each event (class EventAction) - -at Begin and End of each track (class TrackingAction, not used here) - -at End of each step (class SteppingAction) - - The class SteppingVerbose prints some informations step per step, - under the control of the command: /tracking/verbose 1 - It inherits from G4SteppingVerbose, and has been setup here in order - to illustrate how to extract informations from the G4 kernel during - the tracking of a particle. - - -\section ExampleN02InParN02_s4 DETECTOR RESPONSE - - A HIT is a record, track per track (even step per step), of all the - informations needed to simulate and analyse the detector response. - - In this example the Tracker chambers are considered as the detector. - Therefore the chambers are declared 'sensitive detectors' (SD) in - the DetectorConstruction class. - - Then, a Hit is defined as a set of 4 informations per step, inside - the chambers, namely: - - the track identifier (an integer), - - the chamber number, - - the total energy deposit in this step, - - the position of the deposit. - - A given hit is an instance of the class TrackerHit which is created - during the tracking of a particle, step by step, in the method - TrackerSD::ProcessHits(). This hit is inserted in a HitsCollection. - - The HitsCollection is printed at the end of event (via the method - TrackerSD::EndOfEvent()), under the control of the command: /hits/verbose 1 - - -\section ExampleN02InParN02_s5 VISUALIZATION - - The Visualization Manager is set in the main () (see exampleN02.cc). - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main when running in interactive mode. - - The tracks are automatically drawn at the end of event and erased at - the beginning of the next run. - - The visualization (with OpenGL driver) assumes two things: - 1- the visualisation & interfaces categories have been compiled - with the environment variable G4VIS_BUILD_OPENGLX_DRIVER. - 2- ParN02.cc has been compiled with G4VIS_USE_OPENGLX. - - (The same with DAWNFILE instead of OPENGLX) - - -\section ExampleN02InParN02_s6 USER INTERFACES - - The default command interface, called G4UIterminal, is done via - standart cin/G4cout. - On Linux and Sun-cc on can use a smarter command interface G4UItcsh. - It is enough to set the environment variable G4UI_USE_TCSH before - compiling ParN02.cc - -*/ diff --git a/examples/extended/parallel/TopC/ParN02/.README.txt b/examples/extended/parallel/TopC/ParN02/.README.txt deleted file mode 100644 index 2eebbaa9a7..0000000000 --- a/examples/extended/parallel/TopC/ParN02/.README.txt +++ /dev/null @@ -1,199 +0,0 @@ - -///\file "parallel/TopC/ParN02/.README.txt" -///\brief Example ParN02 README page - -/*! \page ExampleParN02 Example ParN02 - - ParGeant4: Geant4/TOP-C, a parallelization of Geant4 - (event-level parallelism) - -\author Gene Cooperman, - Northeastern University, - gene@ccs.neu.edu - -For the latest information on ParGeant4, see: \n - http://www.ccs.neu.edu/home/gene/pargeant4.html - -Note that a version now exists that runs Geant4 over the Grid. -Please write to gene@ccs.neu.edu for further information. -To port other applications to a parallel version, read the -files ../../info/PAR_INSTALL and ../../info/PAR_README. - -
      - -See the beginning of GNUmakefile for reasonable `make' targets to run it. -To run it: \n --# - - a. Follow the standard Geant4 installation procedure. - - b. Download and install TOP-C. \n - The TOP-C home page is at http://www.ccs.neu.edu/home/gene/topc.html -\verbatim -cd -gzip -dc topc.tar.gz | tar -xvf - -cd topc -./configure -make -make check -[ Copy bin/topc-config to your path ] -\endverbatim - - c. Verify that the Geant4 example installs: -\verbatim -cd $G4INSTALL/examples/extended/parallel/ParN02 -make -$G4WORKDIR/bin/$G4SYSTEM/ParN02 ParN02.in -\endverbatim -\n --# -\verbatim -make run -\endverbatim - [ By default, the included `procgroup' file creates two slave processes - on localhost. ] \n - [ Note that in addition to output on master, - $G4WORKDIR/bin/$G4SYSTEM/slave*.out contains slave output. ]\n - [ To remove intermediate files and start over: make parclean ] -\n --# -\n - Try running it with slave processes on remote processes. - First, test that your local environment is set up correctly. - Try: -\verbatim -ssh $G4WORKDIR/bin/$G4SYSTEM/ParN02 `pwd`/ParN02.in -\endverbatim - The above command needs to work without asking for a password. - [ If you use dynamic libraries (*.so), make sure the LD_LIBRARY_PATH - in your shell startup file (e.g. ~.tcshrc) includes both: - $G4INSTALL/lib/$G4SYSTEM and $CLHEP_BASE_DIR/lib - If you use AFS, you may need to type 'klog' to renew your AFS token. ] - In `procgroup' file, replace `localhost' by desired remote hosts; - Add additional remote hosts (additional slaves) if you like. - Then: -\verbatim -make run -\endverbatim - -
      - -If you read ParGNUmakefile, you'll find other things that you can -modify. -- For example, all TOP-C additions are in conditionals: -remove -DG4USE_TOPC from ParGNUmakefile and: -\verbatim -make parclean; make run -\endverbatim - in order to re-compile and rerun without TOP-C. - -- Define REMOTE_SHELL differently if you don't use `ssh' for a remote shell. - (If undefined, ParGNUmakefile defines it to be `ssh') - -- Define MACROFILE diferently to use a different set of input commands. - -- Define MEM_MODEL=--seq - to run with TOP-C, but using a single (sequential) process, suitable - for easy debugging (via gdb, for example). - -- Try: pushd $G4WORKDIR/bin/$G4SYSTEM/; ./ParN02 --TOPC-help - to see TOP-C run-time options that can be invoked, such as - pushd $G4WORKDIR/bin/$G4SYSTEM/; ./ParN02 --TOPC-num-slaves=5 ParN02.in - -- Alternatively, modify TOPC_OPTIONS in ParGNUmakefile for the same effect. - -You can also try other targets: make run-debug - This will run it under gdb, so you can single step to see what happens. -make parclean - Start over with clean set of files. - -
      - -New or modified files: -\verbatim -- ParN02.cc - Adds one line: #include "ParN02.icc" - ParExample.icc inserts: #include "topc.h" - and causes main to calls TOPC_init, TOPC_finalize, - and to use: `new ParRunManager' instead of `new G4RunManager' - -- GNUmakefile - Adds one line at beginning: include ParGNUmakefile - ParGNUmakefile defines EXTRALIBS and CPPFLAGS so as to - modify behavior of config/binmake.gmk - in order to use TOP-C libraries and includes - -- procgroup - Specifies which slave hosts to use, and where to put output - For example: localhost 1 - > slave1.out - host=`localhost', executable=`same as master', - params of slave=`> slave1.out' (redirect output) - If output not redirected, it goes to stdout on master. - -- src/ParRunManager.cc - ParRunManger derived from G4RunManager - replaces Gr4RunManager::DoEventLoop w/ TOP-C parallel loop, - Adds certain local vars of DoEventLoop as ParRunManager members - -- include/MarshaledObj.h - run-time utilities for marshalling -- include/MarshaledEx*Hit.h - marshals N02 hits (calorimeter hits) -- include/MarshaledG4*.h - marshaling routines for Geant4 data structures - -- ~/slave*.out - Contains outputs of slave1, slave2, etc. - Generated each time parallel ParN02 is executed. - These files are specified in the file procgroup. -\endverbatim - -This version passes an event number to the slave and lets the -slave generate the event. The slave passes back marshaled hits to -the master. - -I will integrate the track level parallelism into this scenario at -a later date. For the track level, I will generate several -secondary tracks on the master, and then convert the secondary tracks -to new events that can be passed to slaves. I will do this only if -I detect that there are not enough initial events to fully occupy all -the slaves. This scheme has the drawback that we are splitting an event -into many events, which may make the summarization, histogram, and so -on more difficult. However, track level parallelism will be triggered -only when a very small number of events are generated. - -I also want to support postponing -a track to the next event ( G4ClassificationOfNewTrack::fPostpone . -To do this, each slave will wait to retire an event until it knows that -the previous event has been retired. - -In addition, I plan to have only the master read commands and pass -them to the slaves. Currently, the master and slaves each read -identical commands. - -
      - -If you are curious about some of the layers, the following -stack trace [somewhat out of date now] gives some idea. -- G4RunManager::BeamOn calls ParRunManager::DoEventLoop -(since G4RunManager::DoEventLoop is virtual) -- ParRunManager::DoEventLoop calls TOPC_master_slave -- TOPC_master_slave calls submit_task_input -- submit_task_input eventually calls COMM_send_msg which calls MPI_Send -(COMM_send_msg is the communication layer of TOPC; - ParN02.cc was linked with the TOP-C MPI communication layer. - The same source could have been linked with a POSIX threads layer, - a communication layer, or some other communication layer. -) -- MPI_send calls send -(where send is the socket system call of libc.so) -
      -(gdb) where
      -#0  0x41946c62 in send () from /lib/libc.so.6
      -#1  0x400839c1 in send () at wrapsyscall.c:186
      -#2  0x805c547 in MPI_Send (buf=0x82690fc, count=4, datatype=3, dest=2, tag=1, comm=0) at sendrecv.c:236
      -#3  0x805a0b5 in COMM_send_msg (msg=0x82690fc, msg_size=4, dst=2, tag=TASK_INPUT_TAG) at comm-mpi.c:224
      -#4  0x805774e in send_task_input (slave=2, input={data = 0x82690fc, data_size = 4}, tag=TASK_INPUT_TAG) at topc.c:560
      -#5  0x8057aa8 in submit_task_input (input={data = 0x82690fc, data_size = 4}) at topc.c:659
      -#6  0x805813c in TOPC_master_slave (generate_task_input_=0x4003d2e4 , 
      -    do_task_=0x4003d350 , check_task_result_=0x4003d420 , 
      -    update_shared_data_=0) at topc.c:922
      -#7  0x4003d18c in ParRunManager::DoEventLoop (this=0x80c0bf0, n_event=1, macroFile=0x0, n_select=-1) at src/ParRunManager.cc:51
      -#8  0x400b14d1 in G4RunManager::BeamOn () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4run.so
      -#9  0x400b870a in G4RunMessenger::SetNewValue () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4run.so
      -#10 0x4167157b in G4UIcommand::DoIt () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4intercoms.so
      -#11 0x416810a3 in G4UImanager::ApplyCommand () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4intercoms.so
      -#12 0x805db7e in G4UIterminal::ExecuteCommand () at /afs/cern.ch/sw/lhcxx/specific/redhat61/3.2.0/include/CLHEP/Random/Randomize.h:64
      -#13 0x805d42d in G4UIterminal::SessionStart () at /afs/cern.ch/sw/lhcxx/specific/redhat61/3.2.0/include/CLHEP/Random/Randomize.h:64
      -#14 0x8056a3d in main (argc=1, argv=0x80bfa00) at ParN02.cc:98
      -
      - -*/ diff --git a/examples/extended/parallel/TopC/ParN02/AnnotatedFiles/000README b/examples/extended/parallel/TopC/ParN02/AnnotatedFiles/000README deleted file mode 100644 index 9b85a08bd4..0000000000 --- a/examples/extended/parallel/TopC/ParN02/AnnotatedFiles/000README +++ /dev/null @@ -1,47 +0,0 @@ -The files in this directory are the files that were used to build - ../include/Marshaled*.hh . The files ../include/Marshaled*.hh contain -marshaling (serialization) routines that are used by Parallel Geantr4. - -Marshalgen is a package that allows one to add a small number of annotations -to the original sequential code, in order to create marshalling or -serialization routines. Those marshalling routines are then used -by ParGeant4 to pass data between slave processes and the master process. - -INPUT FILES: -1. G4*.hh : The files *.hh are taken from Geant4. They include annotations - (comments) that describe how to marshal individual fields of the - given classes. These files have additional annotations that describe - how to marshal individual fields of the given classes. For a new - application, you have to change any references to Ex* to your - own example/application include files. These files are then reused - in the new Geant4 parallel application. -2. ../include/Ex*Hit.hh : These files are the original sequential Geant4 - application files that describe the application-defined hits. - They remain in the application include directory because they may - depend on other files in the include directory. - For most new parallel Geant4 applications, these files are sufficiently - simple, that one needs only to add Marshalgen begin and end comments - bracketing the class that needs to be marshalled, and a small number - of annotations specifying accessor functions to get and set fields - in the class. It may also be necessary to include marshalling - include files, if it is necessary to marshal other Geant4 data - structures. - Information on how to marshal the fields, etc., is in the Marshalgen - manual, along with the Marshalgen package: - http://www.ccs.neu.edu/home/gene/marshalgen - - -Marshalgen was then called on the above input files. One calls: - ./marshalgen *.hh - ./marshalgen ../include/Ex*Hit.hh - -OUTPUT FILES: -3. *.msh : These files are intermediate files generated automatically - by marshalgen ( http://www.ccs.neu.edu/home/gene/marshalgen ) - These files can be deleted if desired. -4. Marshaled*.h : These files are generated by Marshalgen. They - include of type both MarshaledEx*.h and MarshaledG4*.h . - (In addition, the file MarshaledObj.h is copied directly from - the Marshalgen distribution.) These files are all copied to - the include directory of the Geant4 parallel application. - They provide the marshalling functions that are then used by Geant4. diff --git a/examples/extended/parallel/TopC/ParN02/README b/examples/extended/parallel/TopC/ParN02/README deleted file mode 100644 index ce6ec5033a..0000000000 --- a/examples/extended/parallel/TopC/ParN02/README +++ /dev/null @@ -1,155 +0,0 @@ - - ParGeant4: Geant4/TOP-C, a parallelization of Geant4 - (event-level parallelism) - - Gene Cooperman - Northeastern University - gene@ccs.neu.edu, - -For the latest information on ParGeant4, see: - http://www.ccs.neu.edu/home/gene/pargeant4.html -Note that a version now exists that runs Geant4 over the Grid. -Please write to gene@ccs.neu.edu for further information. -To port other applications to a parallel version, read the - files ../../info/PAR_INSTALL and ../../info/PAR_README. - -See the beginning of GNUmakefile for reasonable `make' targets to run it. -To run it: -0. a. Follow the standard Geant4 installation procedure. - b. Download and install TOP-C - The TOP-C home page is at http://www.ccs.neu.edu/home/gene/topc.html - cd - gzip -dc topc.tar.gz | tar -xvf - - cd topc - ./configure - make - make check - [ Copy bin/topc-config to your path ] - c. Verify that the Geant4 example installs: - cd $G4INSTALL/examples/extended/parallel/ParN02 - make - $G4WORKDIR/bin/$G4SYSTEM/ParN02 ParN02.in -2. make run - [ By default, the included `procgroup' file creates two slave processes - on localhost. ] - [ Note that in addition to output on master, - $G4WORKDIR/bin/$G4SYSTEM/slave*.out contains slave output. ] - [ To remove intermediate files and start over: make parclean ] -3. Try running it with slave processes on remote processes. - First, test that your local environment is set up correctly. - Try: - ssh $G4WORKDIR/bin/$G4SYSTEM/ParN02 `pwd`/ParN02.in - The above command needs to work without asking for a password. - [ If you use dynamic libraries (*.so), make sure the LD_LIBRARY_PATH - in your shell startup file (e.g. ~.tcshrc) includes both: - $G4INSTALL/lib/$G4SYSTEM and $CLHEP_BASE_DIR/lib - If you use AFS, you may need to type 'klog' to renew your AFS token. ] - In `procgroup' file, replace `localhost' by desired remote hosts; - Add additional remote hosts (additional slaves) if you like. - Then: make run - -============================================================================ -If you read ParGNUmakefile, you'll find other things that you can -modify. For example, all TOP-C additions are in conditionals: - remove -DG4USE_TOPC from ParGNUmakefile and: - make parclean; make run - in order to re-compile and rerun without TOP-C. -Define REMOTE_SHELL differently if you don't use `ssh' for a remote shell. - (If undefined, ParGNUmakefile defines it to be `ssh') -Define MACROFILE diferently to use a different set of input commands. -Define MEM_MODEL=--seq - to run with TOP-C, but using a single (sequential) process, suitable - for easy debugging (via gdb, for example). -Try: pushd $G4WORKDIR/bin/$G4SYSTEM/; ./ParN02 --TOPC-help - to see TOP-C run-time options that can be invoked, such as - pushd $G4WORKDIR/bin/$G4SYSTEM/; ./ParN02 --TOPC-num-slaves=5 ParN02.in - Alternatively, modify TOPC_OPTIONS in ParGNUmakefile for the same effect. - -You can also try other targets: make run-debug - This will run it under gdb, so you can single step to see what happens. -make parclean - Start over with clean set of files. - -============================================================================ -New or modified files: - ParN02.cc - Adds one line: #include "ParN02.icc" - ParExample.icc inserts: #include "topc.h" - and causes main to calls TOPC_init, TOPC_finalize, - and to use: `new ParRunManager' instead of `new G4RunManager' - GNUmakefile - Adds one line at beginning: include ParGNUmakefile - ParGNUmakefile defines EXTRALIBS and CPPFLAGS so as to - modify behavior of config/binmake.gmk - in order to use TOP-C libraries and includes - procgroup - Specifies which slave hosts to use, and where to put output - For example: localhost 1 - > slave1.out - host=`localhost', executable=`same as master', - params of slave=`> slave1.out' (redirect output) - If output not redirected, it goes to stdout on master. - src/ParRunManager.cc - ParRunManger derived from G4RunManager - replaces Gr4RunManager::DoEventLoop w/ TOP-C parallel loop, - Adds certain local vars of DoEventLoop as ParRunManager members - include/MarshaledObj.h - run-time utilities for marshalling - include/MarshaledEx*Hit.h - marshals N02 hits (calorimeter hits) - include/MarshaledG4*.h - marshaling routines for Geant4 data structures - - ~/slave*.out - Contains outputs of slave1, slave2, etc. - Generated each time parallel ParN02 is executed. - These files are specified in the file procgroup. - -==================================================================== -This version passes an event number to the slave and lets the -slave generate the event. The slave passes back marshaled hits to -the master. - -I will integrate the track level parallelism into this scenario at -a later date. For the track level, I will generate several -secondary tracks on the master, and then convert the secondary tracks -to new events that can be passed to slaves. I will do this only if -I detect that there are not enough initial events to fully occupy all -the slaves. This scheme has the drawback that we are splitting an event -into many events, which may make the summarization, histogram, and so -on more difficult. However, track level parallelism will be triggered -only when a very small number of events are generated. - -I also want to support postponing -a track to the next event ( G4ClassificationOfNewTrack::fPostpone . -To do this, each slave will wait to retire an event until it knows that -the previous event has been retired. - -In addition, I plan to have only the master read commands and pass -them to the slaves. Currently, the master and slaves each read -identical commands. - -==================================================================== -If you are curious about some of the layers, the following -stack trace [somewhat out of date now] gives some idea. - G4RunManager::BeamOn calls ParRunManager::DoEventLoop -(since G4RunManager::DoEventLoop is virtual) - ParRunManager::DoEventLoop calls TOPC_master_slave - TOPC_master_slave calls submit_task_input - submit_task_input eventually calls COMM_send_msg which calls MPI_Send -(COMM_send_msg is the communication layer of TOPC; - ParN02.cc was linked with the TOP-C MPI communication layer. - The same source could have been linked with a POSIX threads layer, - a communication layer, or some other communication layer. -) - MPI_send calls send -(where send is the socket system call of libc.so) - -(gdb) where -#0 0x41946c62 in send () from /lib/libc.so.6 -#1 0x400839c1 in send () at wrapsyscall.c:186 -#2 0x805c547 in MPI_Send (buf=0x82690fc, count=4, datatype=3, dest=2, tag=1, comm=0) at sendrecv.c:236 -#3 0x805a0b5 in COMM_send_msg (msg=0x82690fc, msg_size=4, dst=2, tag=TASK_INPUT_TAG) at comm-mpi.c:224 -#4 0x805774e in send_task_input (slave=2, input={data = 0x82690fc, data_size = 4}, tag=TASK_INPUT_TAG) at topc.c:560 -#5 0x8057aa8 in submit_task_input (input={data = 0x82690fc, data_size = 4}) at topc.c:659 -#6 0x805813c in TOPC_master_slave (generate_task_input_=0x4003d2e4 , - do_task_=0x4003d350 , check_task_result_=0x4003d420 , - update_shared_data_=0) at topc.c:922 -#7 0x4003d18c in ParRunManager::DoEventLoop (this=0x80c0bf0, n_event=1, macroFile=0x0, n_select=-1) at src/ParRunManager.cc:51 -#8 0x400b14d1 in G4RunManager::BeamOn () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4run.so -#9 0x400b870a in G4RunMessenger::SetNewValue () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4run.so -#10 0x4167157b in G4UIcommand::DoIt () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4intercoms.so -#11 0x416810a3 in G4UImanager::ApplyCommand () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4intercoms.so -#12 0x805db7e in G4UIterminal::ExecuteCommand () at /afs/cern.ch/sw/lhcxx/specific/redhat61/3.2.0/include/CLHEP/Random/Randomize.h:64 -#13 0x805d42d in G4UIterminal::SessionStart () at /afs/cern.ch/sw/lhcxx/specific/redhat61/3.2.0/include/CLHEP/Random/Randomize.h:64 -#14 0x8056a3d in main (argc=1, argv=0x80bfa00) at ParN02.cc:98 diff --git a/examples/extended/parallel/TopC/ParN02/README.N02 b/examples/extended/parallel/TopC/ParN02/README.N02 deleted file mode 100644 index 1e9561985a..0000000000 --- a/examples/extended/parallel/TopC/ParN02/README.N02 +++ /dev/null @@ -1,123 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - ParN02 - ------ - - - This example simulates a simplified fixe target experiment. - Read README for a description of how to run it in parallel. - - 1- GEOMETRY DEFINITION - - The setup consists of a target followed by six chambers of increasing - transverse size. These chambers are located in a region called Tracker - region. Their shape are boxes, constructed as parametrised volumes - (ChamberParametrisation class). - - The default geometry is constructed in DetectorConstruction class. - One can change the material of the target and of the chambers - interactively via the commands defined in the DetectorMessenger class. - - In addition a transverse uniform magnetic field can be applied (see - N02MagneticField and DetectorMessenger classes). - - - 2- PHYSICS LIST - - The particle's type and the physic processes which will be available - in this example are set in PhysicsList class. - - In this example, all the so called 'electromagnetic processes' are - introduced for gamma, charged leptons, and charged hadrons (see the - method PhysicsList::ConstructEM()). - - An important data member of this class is the defaultCutValue which - defines the production threshold of secondary particles - (mainly Ionisation and Bremsstrahlung processes are concerned by this - CutValue). - Notice that the CutValue must be given in unit of length, corresponding - to the stopping range of the particle. It is automatically converted - in energy for each material, and a table is printed in the method - PhysicsList::SetCuts() - - In addition the build-in interactive command: - /process/(in)activate processName - allows to activate/inactivate the processes one by one. - - - 3- RUNS and EVENTS - - The primary kinematic consists of a single particle which hits the - target perpendicular to the input face. The type of the particle - and its energy are set in the PrimaryGeneratorAction class, and can - be changed via the G4 build-in commands of ParticleGun class. - - A RUN is a set of events. - - The user has control: - -at Begin and End of each run (class RunAction) - -at Begin and End of each event (class EventAction) - -at Begin and End of each track (class TrackingAction, not used here) - -at End of each step (class SteppingAction) - - The class SteppingVerbose prints some informations step per step, - under the control of the command: /tracking/verbose 1 - It inherits from G4SteppingVerbose, and has been setup here in order - to illustrate how to extract informations from the G4 kernel during - the tracking of a particle. - - - 4- DETECTOR RESPONSE - - A HIT is a record, track per track (even step per step), of all the - informations needed to simulate and analyse the detector response. - - In this example the Tracker chambers are considered as the detector. - Therefore the chambers are declared 'sensitive detectors' (SD) in - the DetectorConstruction class. - - Then, a Hit is defined as a set of 4 informations per step, inside - the chambers, namely: - - the track identifier (an integer), - - the chamber number, - - the total energy deposit in this step, - - the position of the deposit. - - A given hit is an instance of the class TrackerHit which is created - during the tracking of a particle, step by step, in the method - TrackerSD::ProcessHits(). This hit is inserted in a HitsCollection. - - The HitsCollection is printed at the end of event (via the method - TrackerSD::EndOfEvent()), under the control of the command: /hits/verbose 1 - - - 5- VISUALIZATION - - The Visualization Manager is set in the main(). - The initialisation of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main when running in interactive mode. - - The tracks are automatically drawn at the end of event and erased at - the beginning of the next run. - - The visualization (with OpenGL driver) assumes two things: - 1- the visualisation & interfaces categories have been compiled - with the environment variable G4VIS_BUILD_OPENGLX_DRIVER. - 2- ParN02.cc has been compiled with G4VIS_USE_OPENGLX. - - (The same with DAWNFILE instead of OPENGLX) - - - 6- USER INTERFACES - - The default command interface, called G4UIterminal, is done via - standart cin/G4cout. - On Linux and Sun-cc on can use a smarter command interface G4UItcsh. - It is enough to set the environment variable G4UI_USE_TCSH before - compiling ParN02.cc - diff --git a/examples/extended/parallel/TopC/ParN04/.README.N04 b/examples/extended/parallel/TopC/ParN04/.README.N04 deleted file mode 100644 index ee53a1978c..0000000000 --- a/examples/extended/parallel/TopC/ParN04/.README.N04 +++ /dev/null @@ -1,47 +0,0 @@ - -///\file "parallel/TopC/ParN04/.README.N04" -///\brief Example N04 (in ParN04) README page - -/*! \page ExampleN04InParN04 Example N04 in ParN04 - - ParN04 has a simplified collider detector geometry. - This example demonstrates the following features. - [ Read \link ExampleParN02 Example ParN02 \endlink for a description - of how to run it in parallel. ] - -\section ExampleN04InParN04_s1 PYTHIA primary events. - - ExN04PrimaryGeneratorAction has G4HEPEvtInterface as the generator. -G4HEPEvtInterface accesses to "pythia_event.data", which contains three -events of Higgs generation produced by PYTHIA. "pythia_main.f" is an -example FORTRAN code of PYTHIA for generating this event sample. - -\section ExampleN04InParN04_s2 Readout geometry - - ExN04DetectorConstruction defines a simplified collider detecor -geometry, tracker made of cylindrical tubes, calorimeter made of -cylindrical tubes, and muon trackers made of planes. - Cylindrical calorimeter is made of tubes of lead and scintirator -without cut in phi nor z direction. Energy deposition in scintirator -is accumurated by ExN04CalorimeterSD sensitive detector, which has -a readout geometry to find the phi-z cell. - -\section ExampleN04InParN04_s3 Full set of "ordinary" physics processes - - ExN04PhysicsList defines almost all of leptons and hadrons which -Geant4 has dedicated classes for. Also almost all physics processes -Geant4 has are defined. - -\section ExampleN04InParN04_s4 Event filtering by the stacking mechanism. - - Higgs events in "pythia_event.data" have two lepton pairs produced -by the Higgs decay via Z0. At the first stage of each event, only the -primary muons are tracked without tracking secondaries. then the number -of hits on the muon trackers are examined. At the next stage, only -the primary charged particles are tracked only inside the barrel -tracking area and the isolation of the primary muons are examined. -At the third stage, all particles in the RoI (Region of Interest) along -the isolated muons are tracked. All these examinations are applied in -ExN04StackingAction. - -*/ diff --git a/examples/extended/parallel/TopC/ParN04/.README.N04.txt b/examples/extended/parallel/TopC/ParN04/.README.N04.txt deleted file mode 100644 index a7936c9be8..0000000000 --- a/examples/extended/parallel/TopC/ParN04/.README.N04.txt +++ /dev/null @@ -1,47 +0,0 @@ - -///\file "parallel/TopC/ParN04/.README.N04.txt" -///\brief Example N04 (in ParN04) README page - -/*! \page ExampleN04InParN04 Example N04 in ParN04 - - ParN04 has a simplified collider detector geometry. - This example demonstrates the following features. - [ Read \link ExampleParN04 Example ParN02 \endlink for a description - of how to run it in parallel. ] - -\section ExampleN04InParN04_s1 PYTHIA primary events. - - ExN04PrimaryGeneratorAction has G4HEPEvtInterface as the generator. -G4HEPEvtInterface accesses to "pythia_event.data", which contains three -events of Higgs generation produced by PYTHIA. "pythia_main.f" is an -example FORTRAN code of PYTHIA for generating this event sample. - -\section ExampleN04InParN04_s2 Readout geometry - - ExN04DetectorConstruction defines a simplified collider detecor -geometry, tracker made of cylindrical tubes, calorimeter made of -cylindrical tubes, and muon trackers made of planes. - Cylindrical calorimeter is made of tubes of lead and scintirator -without cut in phi nor z direction. Energy deposition in scintirator -is accumurated by ExN04CalorimeterSD sensitive detector, which has -a readout geometry to find the phi-z cell. - -\section ExampleN04InParN04_s3 Full set of "ordinary" physics processes - - ExN04PhysicsList defines almost all of leptons and hadrons which -Geant4 has dedicated classes for. Also almost all physics processes -Geant4 has are defined. - -\section ExampleN04InParN04_s4 Event filtering by the stacking mechanism. - - Higgs events in "pythia_event.data" have two lepton pairs produced -by the Higgs decay via Z0. At the first stage of each event, only the -primary muons are tracked without tracking secondaries. then the number -of hits on the muon trackers are examined. At the next stage, only -the primary charged particles are tracked only inside the barrel -tracking area and the isolation of the primary muons are examined. -At the third stage, all particles in the RoI (Region of Interest) along -the isolated muons are tracked. All these examinations are applied in -ExN04StackingAction. - -*/ diff --git a/examples/extended/parallel/TopC/ParN04/.README.txt b/examples/extended/parallel/TopC/ParN04/.README.txt deleted file mode 100644 index a71be0aaed..0000000000 --- a/examples/extended/parallel/TopC/ParN04/.README.txt +++ /dev/null @@ -1,200 +0,0 @@ - -///\file "parallel/TopC/ParN04/.README.txt" -///\brief Example ParN04 README page - -/*! \page ExampleParN04 Example ParN04 - - ParGeant4: Geant4/TOP-C, a parallelization of Geant4 - (event-level parallelism) - -\author Gene Cooperman, - Northeastern University, - gene@ccs.neu.edu - -For the latest information on ParGeant4, see: \n - http://www.ccs.neu.edu/home/gene/pargeant4.html - -Note that a version now exists that runs Geant4 over the Grid. -Please write to gene@ccs.neu.edu for further information. -To port other applications to a parallel version, read the -files ../../info/PAR_INSTALL and ../../info/PAR_README. - -
      - -See the beginning of GNUmakefile for reasonable `make' targets to run it. -To run it: \n --# - - a. Follow the standard Geant4 installation procedure. - - b. Download and install TOP-C. \n - The TOP-C home page is at http://www.ccs.neu.edu/home/gene/topc.html -\verbatim -cd -gzip -dc topc.tar.gz | tar -xvf - -cd topc -./configure -make -make check -[ Copy bin/topc-config to your path ] -\endverbatim - - c. Verify that the Geant4 example installs: -\verbatim -cd $G4INSTALL/examples/extended/parallel/ParN04 -make -$G4WORKDIR/bin/$G4SYSTEM/ParN04 ParN04.in -\endverbatim -\n --# -\verbatim -make run -\endverbatim - [ By default, the included `procgroup' file creates two slave processes - on localhost. ] \n - [ Note that in addition to output on master, - $G4WORKDIR/bin/$G4SYSTEM/slave*.out contains slave output. ]\n - [ To remove intermediate files and start over: make parclean ] -\n --# -\n - Try running it with slave processes on remote processes. - First, test that your local environment is set up correctly. - Try: -\verbatim -ssh $G4WORKDIR/bin/$G4SYSTEM/ParN04 `pwd`/ParN04.in -\endverbatim - The above command needs to work without asking for a password. - [ If you use dynamic libraries (*.so), make sure the LD_LIBRARY_PATH - in your shell startup file (e.g. ~.tcshrc) includes both: - $G4INSTALL/lib/$G4SYSTEM and $CLHEP_BASE_DIR/lib - If you use AFS, you may need to type 'klog' to renew your AFS token. ] - In `procgroup' file, replace `localhost' by desired remote hosts; - Add additional remote hosts (additional slaves) if you like. - Then: -\verbatim -make run -\endverbatim - -
      - -If you read ParGNUmakefile, you'll find other things that you can -modify. -- For example, all TOP-C additions are in conditionals: -remove -DG4USE_TOPC from ParGNUmakefile and: -\verbatim -make parclean; make run -\endverbatim - in order to re-compile and rerun without TOP-C. - -- Define REMOTE_SHELL differently if you don't use `ssh' for a remote shell. - (If undefined, ParGNUmakefile defines it to be `ssh') - -- Define MACROFILE diferently to use a different set of input commands. - -- Define MEM_MODEL=--seq - to run with TOP-C, but using a single (sequential) process, suitable - for easy debugging (via gdb, for example). - -- Try: pushd $G4WORKDIR/bin/$G4SYSTEM/; ./ParN04 --TOPC-help - to see TOP-C run-time options that can be invoked, such as - pushd $G4WORKDIR/bin/$G4SYSTEM/; ./ParN04 --TOPC-num-slaves=5 ParN04.in - -- Alternatively, modify TOPC_OPTIONS in ParGNUmakefile for the same effect. - -You can also try other targets: make run-debug - This will run it under gdb, so you can single step to see what happens. -make parclean - Start over with clean set of files. - -
      - -New or modified files: -\verbatim -- ParN04.cc - Adds one line: #include "ParN04.icc" - ParExample.icc inserts: #include "topc.h" - and causes main to calls TOPC_init, TOPC_finalize, - and to use: `new ParRunManager' instead of `new G4RunManager' - -- GNUmakefile - Adds one line at beginning: include ParGNUmakefile - ParGNUmakefile defines EXTRALIBS and CPPFLAGS so as to - modify behavior of config/binmake.gmk - in order to use TOP-C libraries and includes - -- procgroup - Specifies which slave hosts to use, and where to put output - For example: localhost 1 - > slave1.out - host=`localhost', executable=`same as master', - params of slave=`> slave1.out' (redirect output) - If output not redirected, it goes to stdout on master. - -- src/ParRunManager.cc - ParRunManger derived from G4RunManager - replaces Gr4RunManager::DoEventLoop w/ TOP-C parallel loop, - Adds certain local vars of DoEventLoop as ParRunManager members - -- include/MarshaledObj.h - run-time utilities for marshalling -- include/MarshaledEx*Hit.h - marshals N04 hits (calorimeter hits) -- include/MarshaledG4*.h - marshaling routines for Geant4 data structures - -- ~/slave*.out - Contains outputs of slave1, slave2, etc. - Generated each time parallel ParN04 is executed. - These files are specified in the file procgroup. - -\endverbatim - -This version passes an event number to the slave and lets the -slave generate the event. The slave passes back marshaled hits to -the master. - -I will integrate the track level parallelism into this scenario at -a later date. For the track level, I will generate several -secondary tracks on the master, and then convert the secondary tracks -to new events that can be passed to slaves. I will do this only if -I detect that there are not enough initial events to fully occupy all -the slaves. This scheme has the drawback that we are splitting an event -into many events, which may make the summarization, histogram, and so -on more difficult. However, track level parallelism will be triggered -only when a very small number of events are generated. - -I also want to support postponing -a track to the next event ( G4ClassificationOfNewTrack::fPostpone . -To do this, each slave will wait to retire an event until it knows that -the previous event has been retired. - -In addition, I plan to have only the master read commands and pass -them to the slaves. Currently, the master and slaves each read -identical commands. - -
      - -If you are curious about some of the layers, the following -stack trace [somewhat out of date now] gives some idea. -- G4RunManager::BeamOn calls ParRunManager::DoEventLoop -(since G4RunManager::DoEventLoop is virtual) -- ParRunManager::DoEventLoop calls TOPC_master_slave -- TOPC_master_slave calls submit_task_input -- submit_task_input eventually calls COMM_send_msg which calls MPI_Send -(COMM_send_msg is the communication layer of TOPC; - ParN04.cc was linked with the TOP-C MPI communication layer. - The same source could have been linked with a POSIX threads layer, - a communication layer, or some other communication layer. -) -- MPI_send calls send -(where send is the socket system call of libc.so) -
      -(gdb) where
      -#0  0x41946c62 in send () from /lib/libc.so.6
      -#1  0x400839c1 in send () at wrapsyscall.c:186
      -#2  0x805c547 in MPI_Send (buf=0x82690fc, count=4, datatype=3, dest=2, tag=1, comm=0) at sendrecv.c:236
      -#3  0x805a0b5 in COMM_send_msg (msg=0x82690fc, msg_size=4, dst=2, tag=TASK_INPUT_TAG) at comm-mpi.c:224
      -#4  0x805774e in send_task_input (slave=2, input={data = 0x82690fc, data_size = 4}, tag=TASK_INPUT_TAG) at topc.c:560
      -#5  0x8057aa8 in submit_task_input (input={data = 0x82690fc, data_size = 4}) at topc.c:659
      -#6  0x805813c in TOPC_master_slave (generate_task_input_=0x4003d2e4 , 
      -    do_task_=0x4003d350 , check_task_result_=0x4003d420 , 
      -    update_shared_data_=0) at topc.c:922
      -#7  0x4003d18c in ParRunManager::DoEventLoop (this=0x80c0bf0, n_event=1, macroFile=0x0, n_select=-1) at src/ParRunManager.cc:51
      -#8  0x400b14d1 in G4RunManager::BeamOn () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4run.so
      -#9  0x400b870a in G4RunMessenger::SetNewValue () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4run.so
      -#10 0x4167157b in G4UIcommand::DoIt () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4intercoms.so
      -#11 0x416810a3 in G4UImanager::ApplyCommand () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4intercoms.so
      -#12 0x805db7e in G4UIterminal::ExecuteCommand () at /afs/cern.ch/sw/lhcxx/specific/redhat61/3.2.0/include/CLHEP/Random/Randomize.h:64
      -#13 0x805d42d in G4UIterminal::SessionStart () at /afs/cern.ch/sw/lhcxx/specific/redhat61/3.2.0/include/CLHEP/Random/Randomize.h:64
      -#14 0x8056a3d in main (argc=1, argv=0x80bfa00) at ParN02.cc:98
      -
      - -*/ diff --git a/examples/extended/parallel/TopC/ParN04/AnnotatedFiles/000README b/examples/extended/parallel/TopC/ParN04/AnnotatedFiles/000README deleted file mode 100644 index 9b85a08bd4..0000000000 --- a/examples/extended/parallel/TopC/ParN04/AnnotatedFiles/000README +++ /dev/null @@ -1,47 +0,0 @@ -The files in this directory are the files that were used to build - ../include/Marshaled*.hh . The files ../include/Marshaled*.hh contain -marshaling (serialization) routines that are used by Parallel Geantr4. - -Marshalgen is a package that allows one to add a small number of annotations -to the original sequential code, in order to create marshalling or -serialization routines. Those marshalling routines are then used -by ParGeant4 to pass data between slave processes and the master process. - -INPUT FILES: -1. G4*.hh : The files *.hh are taken from Geant4. They include annotations - (comments) that describe how to marshal individual fields of the - given classes. These files have additional annotations that describe - how to marshal individual fields of the given classes. For a new - application, you have to change any references to Ex* to your - own example/application include files. These files are then reused - in the new Geant4 parallel application. -2. ../include/Ex*Hit.hh : These files are the original sequential Geant4 - application files that describe the application-defined hits. - They remain in the application include directory because they may - depend on other files in the include directory. - For most new parallel Geant4 applications, these files are sufficiently - simple, that one needs only to add Marshalgen begin and end comments - bracketing the class that needs to be marshalled, and a small number - of annotations specifying accessor functions to get and set fields - in the class. It may also be necessary to include marshalling - include files, if it is necessary to marshal other Geant4 data - structures. - Information on how to marshal the fields, etc., is in the Marshalgen - manual, along with the Marshalgen package: - http://www.ccs.neu.edu/home/gene/marshalgen - - -Marshalgen was then called on the above input files. One calls: - ./marshalgen *.hh - ./marshalgen ../include/Ex*Hit.hh - -OUTPUT FILES: -3. *.msh : These files are intermediate files generated automatically - by marshalgen ( http://www.ccs.neu.edu/home/gene/marshalgen ) - These files can be deleted if desired. -4. Marshaled*.h : These files are generated by Marshalgen. They - include of type both MarshaledEx*.h and MarshaledG4*.h . - (In addition, the file MarshaledObj.h is copied directly from - the Marshalgen distribution.) These files are all copied to - the include directory of the Geant4 parallel application. - They provide the marshalling functions that are then used by Geant4. diff --git a/examples/extended/parallel/TopC/ParN04/README b/examples/extended/parallel/TopC/ParN04/README deleted file mode 100644 index 27c08ff008..0000000000 --- a/examples/extended/parallel/TopC/ParN04/README +++ /dev/null @@ -1,157 +0,0 @@ - - ParGeant4: Geant4/TOP-C, a parallelization of Geant4 - (event-level parallelism) - - Gene Cooperman - Northeastern University - gene@ccs.neu.edu, - -For the latest information on ParGeant4, see: - http://www.ccs.neu.edu/home/gene/pargeant4.html -Note that a version now exists that runs Geant4 over the Grid. -Please write to gene@ccs.neu.edu for further information. -To port other applications to a parallel version, read the - files ../../info/PAR_INSTALL and ../../info/PAR_README. - -See the beginning of GNUmakefile for reasonable `make' targets to run it. -To run it: -0. a. Follow the standard Geant4 installation procedure. - b. Download and install TOP-C - The TOP-C home page is at http://www.ccs.neu.edu/home/gene/topc.html - cd - gzip -dc topc.tar.gz | tar -xvf - - cd topc - ./configure - make - make check - [ Copy bin/topc-config to your path ] - c. Verify that the Geant4 example installs: - cd $G4INSTALL/examples/extended/parallel/ParN04 - make - $G4WORKDIR/bin/$G4SYSTEM/ParN04 ParN04.in -2. make run - [ By default, the included `procgroup' file creates two slave processes - on localhost. ] - [ Note that in addition to output on master, - $G4WORKDIR/bin/$G4SYSTEM/slave*.out contains slave output. ] - [ To remove intermediate files and start over: make parclean ] -3. Try running it with slave processes on remote processes. - First, test that your local environment is set up correctly. - Try: - ssh $G4WORKDIR/bin/$G4SYSTEM/ParN04 `pwd`/ParN04.in - The above command needs to work without asking for a password. - [ If you use dynamic libraries (*.so), make sure the LD_LIBRARY_PATH - in your shell startup file (e.g. ~.tcshrc) includes both: - $G4INSTALL/lib/$G4SYSTEM and $CLHEP_BASE_DIR/lib - If you use AFS, you may need to type 'klog' to renew your AFS token. ] - In `procgroup' file, replace `localhost' by desired remote hosts; - Add additional remote hosts (additional slaves) if you like. - Then: make run - -============================================================================ -If you read ParGNUmakefile, you'll find other things that you can -modify. For example, all TOP-C additions are in conditionals: - remove -DG4USE_TOPC from ParGNUmakefile and: - make parclean; make run - in order to re-compile and rerun without TOP-C. -Define REMOTE_SHELL differently if you don't use `ssh' for a remote shell. - (If undefined, ParGNUmakefile defines it to be `ssh') -Define MACROFILE diferently to use a different set of input commands. -Define MEM_MODEL=--seq - to run with TOP-C, but using a single (sequential) process, suitable - for easy debugging (via gdb, for example). -Try: pushd $G4WORKDIR/bin/$G4SYSTEM/; ./ParN04 --TOPC-help - to see TOP-C run-time options that can be invoked, such as - pushd $G4WORKDIR/bin/$G4SYSTEM/; ./ParN04 --TOPC-num-slaves=5 ParN04.in - Alternatively, modify TOPC_OPTIONS in ParGNUmakefile for the same effect. - -You can also try other targets: make run-debug - This will run it under gdb, so you can single step to see what happens. -make parclean - Start over with clean set of files. - -============================================================================ -New or modified files: - ParN04.cc - Adds one line: #include "ParN04.icc" - ParExample.icc inserts: #include "topc.h" - and causes main to calls TOPC_init, TOPC_finalize, - and to use: `new ParRunManager' instead of `new G4RunManager' - GNUmakefile - Adds one line at beginning: include ParGNUmakefile - ParGNUmakefile defines EXTRALIBS and CPPFLAGS so as to - modify behavior of config/binmake.gmk - in order to use TOP-C libraries and includes - procgroup - Specifies which slave hosts to use, and where to put output - For example: localhost 1 - > slave1.out - host=`localhost', executable=`same as master', - params of slave=`> slave1.out' (redirect output) - If output not redirected, it goes to stdout on master. - src/ParRunManager.cc - ParRunManger derived from G4RunManager - replaces Gr4RunManager::DoEventLoop w/ TOP-C parallel loop, - Adds certain local vars of DoEventLoop as ParRunManager members - include/MarshaledObj.h - run-time utilities for marshalling - include/MarshaledEx*Hit.h - marshals N04 hits (calorimeter hits) - include/MarshaledG4*.h - marshaling routines for Geant4 data structures - - ~/slave*.out - Contains outputs of slave1, slave2, etc. - Generated each time parallel ParN04 is executed. - These files are specified in the file procgroup. - -==================================================================== -This version passes an event number to the slave and lets the -slave generate the event. The slave passes back marshaled hits to -the master. - -I will integrate the track level parallelism into this scenario at -a later date. For the track level, I will generate several -secondary tracks on the master, and then convert the secondary tracks -to new events that can be passed to slaves. I will do this only if -I detect that there are not enough initial events to fully occupy all -the slaves. This scheme has the drawback that we are splitting an event -into many events, which may make the summarization, histogram, and so -on more difficult. However, track level parallelism will be triggered -only when a very small number of events are generated. - -I also want to support postponing -a track to the next event ( G4ClassificationOfNewTrack::fPostpone . -To do this, each slave will wait to retire an event until it knows that -the previous event has been retired. - -In addition, I plan to have only the master read commands and pass -them to the slaves. Currently, the master and slaves each read -identical commands. - -==================================================================== -If you are curious about some of the layers, the following -stack trace [somewhat out of date now] gives some idea. -[ This stack trace is from a run based on ParN02.] - - G4RunManager::BeamOn calls ParRunManager::DoEventLoop -(since G4RunManager::DoEventLoop is virtual) - ParRunManager::DoEventLoop calls TOPC_master_slave - TOPC_master_slave calls submit_task_input - submit_task_input eventually calls COMM_send_msg which calls MPI_Send -(COMM_send_msg is the communication layer of TOPC; - ParN04.cc was linked with the TOP-C MPI communication layer. - The same source could have been linked with a POSIX threads layer, - a communication layer, or some other communication layer. -) - MPI_send calls send -(where send is the socket system call of libc.so) - -(gdb) where -#0 0x41946c62 in send () from /lib/libc.so.6 -#1 0x400839c1 in send () at wrapsyscall.c:186 -#2 0x805c547 in MPI_Send (buf=0x82690fc, count=4, datatype=3, dest=2, tag=1, comm=0) at sendrecv.c:236 -#3 0x805a0b5 in COMM_send_msg (msg=0x82690fc, msg_size=4, dst=2, tag=TASK_INPUT_TAG) at comm-mpi.c:224 -#4 0x805774e in send_task_input (slave=2, input={data = 0x82690fc, data_size = 4}, tag=TASK_INPUT_TAG) at topc.c:560 -#5 0x8057aa8 in submit_task_input (input={data = 0x82690fc, data_size = 4}) at topc.c:659 -#6 0x805813c in TOPC_master_slave (generate_task_input_=0x4003d2e4 , - do_task_=0x4003d350 , check_task_result_=0x4003d420 , - update_shared_data_=0) at topc.c:922 -#7 0x4003d18c in ParRunManager::DoEventLoop (this=0x80c0bf0, n_event=1, macroFile=0x0, n_select=-1) at src/ParRunManager.cc:51 -#8 0x400b14d1 in G4RunManager::BeamOn () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4run.so -#9 0x400b870a in G4RunMessenger::SetNewValue () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4run.so -#10 0x4167157b in G4UIcommand::DoIt () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4intercoms.so -#11 0x416810a3 in G4UImanager::ApplyCommand () from /afs/cern.ch/user/c/cooperma/scratch-pcitapi07/geant4/lib/libG4intercoms.so -#12 0x805db7e in G4UIterminal::ExecuteCommand () at /afs/cern.ch/sw/lhcxx/specific/redhat61/3.2.0/include/CLHEP/Random/Randomize.h:64 -#13 0x805d42d in G4UIterminal::SessionStart () at /afs/cern.ch/sw/lhcxx/specific/redhat61/3.2.0/include/CLHEP/Random/Randomize.h:64 -#14 0x8056a3d in main (argc=1, argv=0x80bfa00) at ParN02.cc:98 diff --git a/examples/extended/parallel/TopC/ParN04/README.N04 b/examples/extended/parallel/TopC/ParN04/README.N04 deleted file mode 100644 index 6436c3e5c9..0000000000 --- a/examples/extended/parallel/TopC/ParN04/README.N04 +++ /dev/null @@ -1,47 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - ParN04 - ------ - - ParN04 has a simplified collider detector geometry. - This example demonstrates the following features. - [ Read README for a description of how to run it in parallel. ] - -1. PYTHIA primary events. - - ExN04PrimaryGeneratorAction has G4HEPEvtInterface as the generator. -G4HEPEvtInterface accesses to "pythia_event.data", which contains three -events of Higgs generation produced by PYTHIA. "pythia_main.f" is an -example FORTRAN code of PYTHIA for generating this event sample. - -2. Readout geometry - - ExN04DetectorConstruction defines a simplified collider detecor -geometry, tracker made of cylindrical tubes, calorimeter made of -cylindrical tubes, and muon trackers made of planes. - Cylindrical calorimeter is made of tubes of lead and scintirator -without cut in phi nor z direction. Energy deposition in scintirator -is accumurated by ExN04CalorimeterSD sensitive detector, which has -a readout geometry to find the phi-z cell. - -3. Full set of "ordinary" physics processes - - ExN04PhysicsList defines almost all of leptons and hadrons which -Geant4 has dedicated classes for. Also almost all physics processes -Geant4 has are defined. - -4. Event filtering by the stacking mechanism. - - Higgs events in "pythia_event.data" have two lepton pairs produced -by the Higgs decay via Z0. At the first stage of each event, only the -primary muons are tracked without tracking secondaries. then the number -of hits on the muon trackers are examined. At the next stage, only -the primary charged particles are tracked only inside the barrel -tracking area and the isolation of the primary muons are examined. -At the third stage, all particles in the RoI (Region of Interest) along -the isolated muons are tracked. All these examinations are applied in -ExN04StackingAction. diff --git a/examples/extended/parallel/TopC/info/NEW_APP_README b/examples/extended/parallel/TopC/info/NEW_APP_README deleted file mode 100644 index 30e50ce4e9..0000000000 --- a/examples/extended/parallel/TopC/info/NEW_APP_README +++ /dev/null @@ -1,46 +0,0 @@ ------------------------------------------------------------------------------- -This file and NEW_APP_INSTALL describe important information if you are - planning to create a new parallel Geant4 application, similarly - to the examples ParN02 and ParN04. -This package implements event-level parallelism for Geant4 - using the free TOP-C distribution. (TOP-C = Task Oriented Parallel C/C++) - -To parallelize an existing sequential Geant4 application, read NEW_APP_INSTALL. - -The design goals are: -1. No modification of the Geant4 kernel libraries. -2. Application sessions should be efficient and reproducible - (independently of the number of slave processes and the - order in which they are called by TOP-C) -3. Setting deterministic random seeds on each slave - [ This code assumes that each slave will initialize its random state - based on either the event number or a random seed selected - on the master.] - -This assumes that you have already installed CLHEP, Geant4, and TOP-C - TOP-C can be downloaded via its home page: - http://www.ccs.neu.edu/home/gene/topc.html - -Other qualifications are: -1. It has only been tested under Linux, although it should be - portable to any other UNIX supported by Geant4. -2. Since Geant4 does not currently support a uniform format for - tracker hits, calorimeter hits, etc., on new applications, - you may have to write marshalling code for your hits, based - on the examples in ParN02 and ParN04. -3. This should support histograms as long as AnalysisManager::Step() is - is trivial. However, I have not had the opportunity - for careful testing. Please write to gene@ccs.neu.edu if you - are including histograms, and especially if you define - AnalysisManager::Step(). -4. Currently, this distribution does not support: - trajectory stores, n-tuples, track parallelism, - interactive input commands (no macrofile) - I plan to add those features according to demand. - Probably: a. allowing interactive input - b. track-level parallelism - c. other (trajectory store, PostponeOneEvent(), ...) - -Some design assumptions in this ParGeant4 implementation: -1. A collectionName for a G4HitsCollection uniquely identifies the - G4HitsCollection within a G4HCofThisEvent. diff --git a/examples/extended/parallel/TopC/info/README.html b/examples/extended/parallel/TopC/info/README.html deleted file mode 100644 index fed9e17c38..0000000000 --- a/examples/extended/parallel/TopC/info/README.html +++ /dev/null @@ -1,114 +0,0 @@ - - - -ParGeant4 README - - - - - - - - - -

      ParGeant4 README

      -
      -by Gene Cooperman - (gene@ccs.neu.edu) -
      -There is also a -ParGeant4 Home Page, which will be updated more frequently than -this page. - -

      -This distribution implements event-level parallelism for - Geant4 - using the free TOP-C distribution. - (TOP-C - = Task Oriented Parallel C/C++) - -

      -These are example parallelizations that parallelize examples/novice/N02 -and examples/novice/N04 of the Geant4 distribution. -The files also contain information on how to write new parallel -Geant4 applications or parallelize existing sequential Geant4 -applications. - -

      -

      -The design goals are:
      -1.  No modification of the Geant4 kernel libraries.
      -2.  Application sessions should be efficient and reproducible
      -     (independently of the number of slave processes and the
      -      order in which they are called by TOP-C)
      -3.  Setting deterministic random seeds on each slave
      -    [ This code assumes that each slave will initialize its random state
      -      based on either the event number or a random seed selected
      -      on the master.]
      -
      -This assumes that you have already installed CLHEP, Geant4, and TOP-C
      -  TOP-C can be downloaded via its home page:
      -                          http://www.ccs.neu.edu/home/gene/topc.html
      -
      -Other qualifications are:
      -1.  `topc-config' is already in your path.
      -2.  It has only been tested under Linux, although it should be
      -       portable to any other UNIX supported by Geant4.
      -3.  Currently, this distribution does not support:
      -      histograms, trajectory stores, n-tuples, track parallelism,
      -      interactive input commands (no macrofile)
      -    I plan to add those features according to demand.
      -       Probably:  a. histograms (I believe histograms work now, but I don't
      -                        have a ready test application.  If someone does, could
      -                        you either check yourself if the parallelization works
      -                        for histograms, or tell me, and I'll parallelize it.)
      -                  b. track-level parallelism
      -                  c. allowing interactive input
      -                  d. other
      -
      - - -

      -ParGeant4 has been demonstrated to run over the Computational Grid -using a new TOP-C communication layer, with support for the Grid, -based on Ampic. See related paper: -
      - G. Cooperman, H. Casanova, J. Hayes and T. Witzel, -``Using TOP-C and AMPIC to Port Large Parallel Applications - to the Computational Grid'', - Proc. of 2nd IEEC/ACM Interantional Symposium - on Cluster Computing and the Grid (CCGrid), 2002, - to appear - - -

      -(This material is based in part upon work supported by the National Science -Foundation under Grants No. 9732330 and 9872114. Any opinions, findings, and -conclusions or recommendations expressed in this material are those of -the author(s) and do not necessarily reflect the views of the National -Science Foundation.) -

      -

      -Gene Cooperman
      -College of Computer Science, 215CN
      -Northeastern University
      -Boston, MA 02115
      -e-mail: gene@ccs.neu.edu
      -Phone: (617) 373-8686
      -Fax: (617) 373-5121 -
      - - - - diff --git a/examples/extended/parameterisations/.README.txt b/examples/extended/parameterisations/.README.txt deleted file mode 100644 index 5133495a70..0000000000 --- a/examples/extended/parameterisations/.README.txt +++ /dev/null @@ -1,33 +0,0 @@ - -///\file "parameterisations/.README.txt" -///\brief Examples parameterisations README page - -/*! \page Examples_parameterisations Category "parameterisations" - - Examples in this directory demonstrate use of parameterisation libraries. - Currently, two examples are provided: - -\link ExamplePar01 Par01 \endlink - -This example demonstrates the use of parameterisation facilities. -It was moved in extended examples from novice/N05 with removal of -novice examples. - -\link ExamplePar02 Par02 \endlink - -This example shows how to do "track and energy smearing" in Geant4, -in order to have a very fast simulation based on assumed detector -resolutions. - -\link ExamplePar03 Par03 \endlink - -This example demonstrates how to create multiple energy deposits -from the fast simulation model and store it alongside deposits created -in full/detailed simulation. - -\link Examples_gflash gflash \endlink - -Set of examples demonstrating the use of the GFLASH parameterisation library. - -*/ - diff --git a/examples/extended/parameterisations/CMakeLists.txt b/examples/extended/parameterisations/CMakeLists.txt index 5661bf737d..b513b881a2 100644 --- a/examples/extended/parameterisations/CMakeLists.txt +++ b/examples/extended/parameterisations/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding all parameterisations examples subdirectories explicitly -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) find_package(Geant4) include(${Geant4_USE_FILE}) @@ -8,6 +8,7 @@ include(${Geant4_USE_FILE}) add_subdirectory(gflash) add_subdirectory(Par01) add_subdirectory(Par03) +add_subdirectory(Par04) #---------------------------------------------------------------------------- # Par02 example requires Geant4 build with gdml diff --git a/examples/extended/parameterisations/History b/examples/extended/parameterisations/History index 0ef7941ef2..2ae618325f 100644 --- a/examples/extended/parameterisations/History +++ b/examples/extended/parameterisations/History @@ -16,6 +16,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Nov 8th 2021, D. Salamani, A. Zaborowska (exParameterisations-V10-07-01) +- Add new Par04 example + May 24th 2021, B. Morgan (exParameterisations-V10-07-00) - Bump required CMake version range to 3.12...3.20, matching core Geant4 diff --git a/examples/extended/parameterisations/Par01/.README.txt b/examples/extended/parameterisations/Par01/.README.txt deleted file mode 100644 index 936fb54aa2..0000000000 --- a/examples/extended/parameterisations/Par01/.README.txt +++ /dev/null @@ -1,76 +0,0 @@ - -///\file "parameterisations/Par01/.README.txt" -///\brief Example Par01 README page - -/*! \page ExamplePar01 Example Par01 - -Example Par01 provides examples of the use of parameterisation facilities. -It was moved in extended examples from novice/N05 with removal of -novice examples. - -Geometry, sensitive detector, hits, processes are defined respectively in: -- Par01DetectorConstruction -- Par01CalorimeterSD -- Par01CalorimeterHit - -The particularities are: - -- The parameterisation models: - - - Par01EMShowerModel which provides a crude - parameterisation for e+/e-/gamma. This model - is bound to the EM calorimeter. \n\n - - - Par01PionShowerModel: an even more crude - parameterisation for pi+/pi-. This model - is bound to a ghost volume. \n\n - - Those two models produces "hits": ie the energy - of the incident particle is distributed into - the volume of the envelope throught energy spots - (class Par01EnergySpot), those energy spots being - recorded in the sensitive detector at this point - if any. \n\n - - They are rather similar from a technical point of vue. - They both make use of a private G4Navigator to set - their energy spots into the sensitive volumes. - However, we don't take care of putting every spot into - a sensitive (which is recommended in a "serious" - parameterisation !). \n\n - - Those two models trigger their parameterisation - on the first step the particle does in the envelope, - but it would be perfectly possible to wait that the - particle is far enough from the boundary of the envelope - for example. \n\n - - - Par01PiModel: just there to show how a parameterisation - can create secondaries, but not used. \n\n - -- Par01PhysicsList::AddParameterisation(). A method which - sets the G4FastSimulationManagerProcess in the process - manager of all the particles. This process provides - the INTERFACE between the tracking and the parameterisation - models. \n\n - -- In Par01DetectorConstruction::Construct(): the parameterisation - models are built and bound to envelopes: \n\n - - - Par01EMShowerModel is bound to the electromagnetic - calorimeter \n\n - - - Par01PionShowerModel is bound to a ghost volume - which encompasses the electromagnetic and - hadronic calorimters \n\n - -- The Physics list used is FTFP_BERT which is augmented using the - G4FastSimulationPhysics physics constructor to insert the - G4FastSimulationManagerProcess that is making the interface - between the fast simulation and the tracking. - The configuration is shown in examlePar01.cc. - -*/ - - - diff --git a/examples/extended/parameterisations/Par01/CMakeLists.txt b/examples/extended/parameterisations/Par01/CMakeLists.txt index ad03160318..555152288a 100644 --- a/examples/extended/parameterisations/Par01/CMakeLists.txt +++ b/examples/extended/parameterisations/Par01/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(Par01) #---------------------------------------------------------------------------- diff --git a/examples/extended/parameterisations/Par01/README b/examples/extended/parameterisations/Par01/README deleted file mode 100644 index 4a846dbc75..0000000000 --- a/examples/extended/parameterisations/Par01/README +++ /dev/null @@ -1,72 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example Par01 - ------------- - -Example Par01 provides examples of the use of parameterisation facilities. -It was moved in extended examples from novice/N05 with removal of -novice examples. - -Geometry, sensitive detector, hits, processes are defined respectively in: - - Par01DetectorConstruction - Par01CalorimeterSD - Par01CalorimeterHit - -The particularities are: - - o The parameterisation models: - - o Par01EMShowerModel which provides a crude - parameterisation for e+/e-/gamma. This model - is bound to the EM calorimeter. - - o Par01PionShowerModel: an even more crude - parameterisation for pi+/pi-. This model - is bound to a ghost volume. - - Those two models produces "hits": ie the energy - of the incident particle is distributed into - the volume of the envelope throught energy spots - (class Par01EnergySpot), those energy spots being - recorded in the sensitive detector at this point - if any. - - They are rather similar from a technical point of vue. - They both make use of a private G4Navigator to set - their energy spots into the sensitive volumes. - However, we don't take care of putting every spot into - a sensitive (which is recommended in a "serious" - parameterisation !). - - Those two models trigger their parameterisation - on the first step the particle does in the envelope, - but it would be perfectly possible to wait that the - particle is far enough from the boundary of the envelope - for example. - - o Par01PiModel: just there to show how a parameterisation - can create secondaries, but not used. - - o Par01DetectorConstruction::Construct: in this method, the parameterisation - models are built and bound to envelopes: - - o Par01EMShowerModel is bound to the electromagnetic - calorimeter - - o Par01PionShowerModel is bound to a ghost volume - which encompasses the electromagnetic and - hadronic calorimters - - o The Physics list used is FTFP_BERT which is augmented using the - G4FastSimulationPhysics physics constructor to insert the - G4FastSimulationManagerProcess that is making the interface - between the fast simulation and the tracking. - The configuration is shown in examlePar01.cc. - - - diff --git a/examples/extended/parameterisations/Par01/examplePar01.out b/examples/extended/parameterisations/Par01/examplePar01.out index 2611939a64..22ae3e015c 100644 --- a/examples/extended/parameterisations/Par01/examplePar01.out +++ b/examples/extended/parameterisations/Par01/examplePar01.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -51,10 +51,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -96,32 +94,99 @@ End of Run User Vis Actions: none Some /vis commands (optionally) take a string to specify colour. "/vis/list" to see available colours. +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -131,25 +196,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -159,29 +224,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -189,31 +254,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -222,12 +287,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -235,12 +300,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -248,31 +313,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -280,31 +345,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -312,31 +377,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -344,32 +409,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -377,32 +442,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -410,31 +475,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -442,27 +507,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -471,17 +536,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -489,67 +554,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -557,13 +622,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -571,13 +636,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -585,12 +650,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -598,13 +663,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -612,13 +677,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -626,13 +691,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -640,60 +705,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -701,27 +766,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -729,25 +794,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -755,25 +820,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -781,13 +846,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -810,7 +875,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -823,602 +887,87 @@ See commands in /vis/modeling/trajectories/ for other options. Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 -0.000253 36.2 60.4 997 0.0141 70.4 70.4 WorldPhysical eBrem - 2 -0.000386 38.7 64.5 997 0.000634 4.77 75.2 WorldPhysical eIoni - 3 -0.00356 60 100 997 0.0104 41.4 117 DriftChamberPhysical CoupledTransportation - 4 -0.141 501 836 997 0.0292 858 974 DriftChamberPhysical eIoni - 5 -0.145 519 866 997 0.000982 35.2 1.01e+03 DriftChamberPhysical eIoni - 6 -0.148 540 900 997 0.00105 39.7 1.05e+03 WorldPhysical CoupledTransportation - 7 -0.158 600 1e+03 996 0.0233 117 1.17e+03 Crystal CoupledTransportation - 8 -0.158 600 1e+03 0 996 0 1.17e+03 Crystal fastSimProcess_massGeom + 1 -0.000254 36.2 60.4 999 0.0176 70.4 70.4 WorldPhysical eBrem + 2 -0.000433 39.1 65.1 999 0.00191 5.51 76 WorldPhysical eIoni + 3 -0.00349 60 100 999 0.00961 40.7 117 DriftChamberPhysical CoupledTransportation + 4 -0.0815 510 850 999 0.0276 875 992 DriftChamberPhysical eIoni + 5 -0.0866 528 881 999 0.000937 35.6 1.03e+03 DriftChamberPhysical eIoni + 6 -0.0887 540 900 999 0.000447 22.1 1.05e+03 WorldPhysical CoupledTransportation + 7 -0.0998 600 1e+03 999 0.0241 117 1.17e+03 Crystal CoupledTransportation + 8 -0.0998 600 1e+03 0 999 0 1.17e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.145 519 866 0.00196 0 0 0 DriftChamberPhysical initStep - 1 -0.751 519 866 0 0.00196 0.879 0.879 DriftChamberPhysical eIoni + 0 -0.0866 528 881 0.00198 0 0 0 DriftChamberPhysical initStep + 1 -0.703 528 881 0 0.00198 0.894 0.894 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.141 501 836 0.00416 0 0 0 DriftChamberPhysical initStep - 1 0.932 500 837 0.00178 0.00238 2.01 2.01 DriftChamberPhysical eIoni - 2 0.884 499 837 0 0.00178 0.75 2.76 DriftChamberPhysical eIoni + 0 -0.0815 510 850 0.0042 0 0 0 DriftChamberPhysical initStep + 1 1 509 851 0.00241 0.00179 2.03 2.03 DriftChamberPhysical eIoni + 2 1.42 509 852 0 0.00241 1.21 3.24 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.000386 38.7 64.5 0.00255 0 0 0 WorldPhysical initStep - 1 0.0985 38.7 64.5 0 0.00255 0.239 0.239 WorldPhysical eIoni + 0 -0.000433 39.1 65.1 0.00257 0 0 0 WorldPhysical initStep + 1 0.1 39.1 65.1 0 0.00257 0.243 0.243 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.000253 36.2 60.4 3.43 0 0 0 WorldPhysical initStep - 1 0.0123 60 100 3.43 0 46.2 46.2 DriftChamberPhysical CoupledTransportation - 2 0.267 540 900 3.43 0 933 979 WorldPhysical CoupledTransportation - 3 0.299 600 1e+03 3.43 0 117 1.1e+03 Crystal CoupledTransportation - 4 0.325 650 1.08e+03 3.43 0 96.4 1.19e+03 Crystal CoupledTransportation - 5 0.351 700 1.17e+03 3.43 0 97.1 1.29e+03 Crystal CoupledTransportation - 6 0.355 708 1.18e+03 3.34 0 14.7 1.3e+03 Crystal compt - 7 2.45 747 1.26e+03 0.414 0 89.2 1.39e+03 Crystal compt - 8 4.67 750 1.26e+03 0.414 0 4.51 1.4e+03 Crystal CoupledTransportation - 9 22.2 776 1.24e+03 0 0.0332 35.5 1.43e+03 Crystal phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 22.2 776 1.24e+03 0.381 0 0 0 Crystal initStep - 1 22.2 776 1.24e+03 0 0.381 0.474 0.474 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 2.45 747 1.26e+03 2.93 0 0 0 Crystal initStep - 1 2.18 747 1.26e+03 2.65 0.282 0.571 0.571 Crystal eBrem - 2 1.5 747 1.26e+03 2.19 0.455 1.14 1.71 Crystal msc - 3 0.726 747 1.26e+03 1.61 0.58 1.04 2.75 Crystal msc - 4 0.444 747 1.26e+03 1.45 0.161 0.461 3.21 Crystal msc - 5 0.244 747 1.26e+03 1.32 0.13 0.291 3.5 Crystal msc - 6 0.143 747 1.26e+03 1.25 0.0684 0.217 3.72 Crystal msc - 7 0.248 747 1.26e+03 1.17 0.077 0.23 3.95 Crystal msc - 8 0.321 747 1.26e+03 0.611 0.564 0.261 4.21 Crystal msc - 9 0.277 747 1.26e+03 0.509 0.102 0.194 4.4 Crystal msc - 10 0.203 747 1.26e+03 0.413 0.0965 0.226 4.63 Crystal msc - 11 0.336 747 1.26e+03 0.161 0.252 0.22 4.85 Crystal msc - 12 0.347 747 1.26e+03 0 0.161 0.13 4.98 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.355 708 1.18e+03 0.0906 0 0 0 Crystal initStep - 1 0.354 708 1.18e+03 0 0.0906 0.0515 0.0515 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 60 100 1e+03 0.0208 117 117 DriftChamberPhysical CoupledTransportation - 2 0.29 540 900 1e+03 0.031 933 1.05e+03 WorldPhysical CoupledTransportation - 3 0.291 542 902 1e+03 0.000268 2.52 1.05e+03 WorldPhysical eIoni - 4 0.298 566 943 1e+03 0.0107 47.1 1.1e+03 WorldPhysical eIoni - 5 0.304 600 1e+03 1e+03 0.0141 67 1.17e+03 Crystal CoupledTransportation - 6 0.304 600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.298 566 943 0.00136 0 0 0 WorldPhysical initStep - 1 0.332 566 943 0 0.00136 0.0895 0.0895 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.291 542 902 0.00186 0 0 0 WorldPhysical initStep - 1 0.245 542 902 0 0.00186 0.144 0.144 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 -0.00247 18.8 31.3 1e+03 0.00826 36.6 36.6 WorldPhysical eIoni - 2 -0.00562 32 53.3 1e+03 0.00621 25.6 62.2 WorldPhysical eIoni - 3 -0.00928 60 100 1e+03 0.00911 54.4 117 DriftChamberPhysical CoupledTransportation - 4 0.038 232 386 1e+03 0.0138 334 451 DriftChamberPhysical eIoni - 5 0.13 540 900 1e+03 0.0172 599 1.05e+03 WorldPhysical CoupledTransportation - 6 0.131 600 1e+03 1e+03 0.0226 117 1.17e+03 Crystal CoupledTransportation - 7 0.131 600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.038 232 386 0.00123 0 0 0 DriftChamberPhysical initStep - 1 -0.0715 232 386 0 0.00123 0.415 0.415 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.00562 32 53.3 0.00113 0 0 0 WorldPhysical initStep - 1 -0.0309 32 53.3 0 0.00113 0.068 0.068 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.00247 18.8 31.3 0.00184 0 0 0 WorldPhysical initStep - 1 0.0456 18.8 31.4 0 0.00184 0.142 0.142 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0.0056 23.1 38.4 1e+03 0.00828 44.8 44.8 WorldPhysical eIoni - 2 0.0153 60 100 1e+03 0.0153 71.8 117 DriftChamberPhysical CoupledTransportation - 3 0.0408 94 157 1e+03 0.00175 66.1 183 DriftChamberPhysical eIoni - 4 0.0622 128 213 1e+03 0.00313 65.3 248 DriftChamberPhysical eIoni - 5 0.177 293 488 1e+03 0.00768 321 569 DriftChamberPhysical eIoni - 6 0.378 540 900 1e+03 0.0148 481 1.05e+03 WorldPhysical CoupledTransportation - 7 0.415 600 1e+03 1e+03 0.0236 117 1.17e+03 Crystal CoupledTransportation - 8 0.415 600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.177 293 488 0.00257 0 0 0 DriftChamberPhysical initStep - 1 0.0289 292 488 0.00111 0.000362 0.424 0.424 DriftChamberPhysical eIoni - 2 0.037 292 488 0 0.00111 0.35 0.774 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 5 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0289 292 488 0.0011 0 0 0 DriftChamberPhysical initStep - 1 -0.0958 292 488 0 0.0011 0.349 0.349 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0622 128 213 0.00138 0 0 0 DriftChamberPhysical initStep - 1 -0.0445 128 213 0 0.00138 0.494 0.494 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0408 94 157 0.0036 0 0 0 DriftChamberPhysical initStep - 1 1.45 93.6 157 0.00144 0.00216 1.79 1.79 DriftChamberPhysical eIoni - 2 1.74 93.8 157 0 0.00144 0.531 2.32 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0056 23.1 38.4 0.00872 0 0 0 WorldPhysical initStep - 1 0.759 23.5 38.3 0.00571 0.00301 1.63 1.63 WorldPhysical eIoni - 2 0.575 23.1 38.3 0.00223 0.0024 0.592 2.22 WorldPhysical eIoni - 3 0.579 23.1 38.3 0 0.00223 0.192 2.42 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.575 23.1 38.3 0.00109 0 0 0 WorldPhysical initStep - 1 0.551 23.1 38.3 0 0.00109 0.0641 0.0641 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 -0.000647 15.2 25.3 1e+03 0.00455 29.5 29.5 WorldPhysical eIoni - 2 0.000235 30.5 50.8 1e+03 0.00602 29.8 59.3 WorldPhysical eIoni - 3 0.00594 60 100 1e+03 0.0107 57.4 117 DriftChamberPhysical CoupledTransportation - 4 0.0101 81.4 136 1e+03 0.0012 41.5 158 DriftChamberPhysical eIoni - 5 0.0186 134 224 1e+03 0.00359 103 261 DriftChamberPhysical eIoni - 6 0.0205 172 286 1e+03 0.00217 72.3 333 DriftChamberPhysical eIoni - 7 0.0467 540 900 1e+03 0.0188 716 1.05e+03 WorldPhysical CoupledTransportation - 8 0.0339 600 1e+03 1e+03 0.0266 117 1.17e+03 Crystal CoupledTransportation - 9 0.0339 600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0205 172 286 0.00122 0 0 0 DriftChamberPhysical initStep - 1 -0.0486 172 286 0 0.00122 0.409 0.409 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0186 134 224 0.00232 0 0 0 DriftChamberPhysical initStep - 1 0.59 135 224 0 0.00232 1.15 1.15 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0101 81.4 136 0.0011 0 0 0 DriftChamberPhysical initStep - 1 0.245 81.4 136 0 0.0011 0.349 0.349 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.000235 30.5 50.8 0.00193 0 0 0 WorldPhysical initStep - 1 -0.061 30.5 50.8 0 0.00193 0.153 0.153 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.000647 15.2 25.3 0.00154 0 0 0 WorldPhysical initStep - 1 -0.0058 15.2 25.3 0 0.00154 0.108 0.108 WorldPhysical eIoni -0 events have been kept for refreshing and/or reviewing. - "/vis/reviewKeptEvents" to review them one by one. - "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 -0.00494 14.4 47.8 1e+03 0.00839 49.9 49.9 WorldPhysical eIoni - 2 -0.0196 30 100 1e+03 0.00903 54.5 104 DriftChamberPhysical CoupledTransportation - 3 -0.0284 102 339 1e+03 0.00832 249 353 DriftChamberPhysical eIoni - 4 -0.0172 270 900 1e+03 0.0169 586 940 WorldPhysical CoupledTransportation - 5 -0.00829 300 1e+03 1e+03 0.0199 104 1.04e+03 Crystal CoupledTransportation - 6 -0.00829 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0284 102 339 0.00422 0 0 0 DriftChamberPhysical initStep - 1 -1.2 103 338 0.00212 0.00211 2.04 2.04 DriftChamberPhysical eIoni - 2 -1.63 103 338 0 0.00212 1 3.04 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.00494 14.4 47.8 0.00718 0 0 0 WorldPhysical initStep - 1 0.388 14.5 47.8 0.00339 0.00096 0.551 0.551 WorldPhysical eIoni - 2 0.452 14.5 48 0 0.00339 0.389 0.94 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.388 14.5 47.8 0.00283 0 0 0 WorldPhysical initStep - 1 0.358 14.5 47.9 0 0.00283 0.0628 0.0628 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0.00286 15.4 51.5 1e+03 0.00762 53.7 53.7 WorldPhysical eIoni - 2 0.0134 26.6 88.7 1e+03 0.00967 38.8 92.6 WorldPhysical eIoni - 3 0.0161 30 100 1e+03 0.00289 11.8 104 DriftChamberPhysical CoupledTransportation - 4 0.169 270 900 1e+03 0.0245 835 940 WorldPhysical CoupledTransportation - 5 0.177 276 921 1e+03 0.00784 21.8 961 WorldPhysical eIoni - 6 0.209 300 1e+03 1e+03 0.0158 82.6 1.04e+03 Crystal CoupledTransportation - 7 0.209 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.177 276 921 0.00106 0 0 0 WorldPhysical initStep - 1 0.172 276 921 0 0.00106 0.0622 0.0622 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0134 26.6 88.7 0.00142 0 0 0 WorldPhysical initStep - 1 0.0506 26.6 88.7 0 0.00142 0.0952 0.0952 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.00286 15.4 51.5 0.00769 0 0 0 WorldPhysical initStep - 1 -0.349 15.9 51.4 0.00291 0.00374 0.792 0.792 WorldPhysical eIoni - 2 -0.402 16 51.4 0 0.00291 0.299 1.09 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.349 15.9 51.4 0.00104 0 0 0 WorldPhysical initStep - 1 -0.351 15.9 51.4 0 0.00104 0.0604 0.0604 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0.00228 8.03 26.8 1e+03 0.00396 27.9 27.9 WorldPhysical eIoni - 2 0.011 25.4 84.7 1e+03 0.0129 60.4 88.4 WorldPhysical eIoni - 3 0.0121 27.5 91.6 1e+03 0.00331 7.22 95.6 WorldPhysical eIoni - 4 0.0134 30 100 1e+03 0.00208 8.8 104 DriftChamberPhysical CoupledTransportation - 5 0.0769 170 568 1e+03 0.0137 488 593 DriftChamberPhysical eIoni - 6 0.118 270 900 1e+03 0.00891 347 940 WorldPhysical CoupledTransportation - 7 0.123 277 923 1e+03 0.00267 23.8 963 WorldPhysical eIoni - 8 0.14 300 1e+03 1e+03 0.0145 80.6 1.04e+03 Crystal CoupledTransportation - 9 0.14 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.123 277 923 0.00254 0 0 0 WorldPhysical initStep - 1 0.218 277 923 0 0.00254 0.238 0.238 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0769 170 568 0.00128 0 0 0 DriftChamberPhysical initStep - 1 0.218 171 568 0 0.00128 0.44 0.44 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0121 27.5 91.6 0.00129 0 0 0 WorldPhysical initStep - 1 0.0101 27.4 91.6 0 0.00129 0.083 0.083 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.011 25.4 84.7 0.0013 0 0 0 WorldPhysical initStep - 1 0.042 25.4 84.7 0 0.0013 0.0837 0.0837 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.00228 8.03 26.8 0.00356 0 0 0 WorldPhysical initStep - 1 -0.105 8.17 26.7 0 0.00356 0.422 0.422 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 30 100 1e+03 0.0188 104 104 DriftChamberPhysical CoupledTransportation - 2 0.0117 180 599 1e+03 0.015 521 625 DriftChamberPhysical eIoni - 3 0.015 201 670 1e+03 0.0031 74.2 699 DriftChamberPhysical eIoni - 4 0.0055 270 900 1e+03 0.00714 240 940 WorldPhysical CoupledTransportation - 5 0.00896 288 961 1e+03 0.0123 64.1 1e+03 WorldPhysical eIoni - 6 0.0144 300 1e+03 1e+03 0.00716 40.3 1.04e+03 Crystal CoupledTransportation - 7 0.0144 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.00896 288 961 0.00383 0 0 0 WorldPhysical initStep - 1 0.13 289 961 0 0.00383 0.48 0.48 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.015 201 670 0.00783 0 0 0 DriftChamberPhysical initStep - 1 3.24 202 670 0.00709 0.000742 3.6 3.6 DriftChamberPhysical eIoni - 2 6.24 202 670 0.00527 0.00182 3.23 6.83 DriftChamberPhysical eIoni - 3 8.27 203 670 0.00385 0.00142 2.44 9.27 DriftChamberPhysical eIoni - 4 9.22 204 671 0.00125 0.0026 1.89 11.2 DriftChamberPhysical eIoni - 5 9.04 204 671 0 0.00125 0.424 11.6 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0117 180 599 0.00237 0 0 0 DriftChamberPhysical initStep - 1 0.295 179 599 0 0.00237 1.19 1.19 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 -2.47e-05 1.41 4.7 1e+03 0.00146 4.9 4.9 WorldPhysical eIoni - 2 0.00433 30 100 1e+03 0.0202 99.5 104 DriftChamberPhysical CoupledTransportation - 3 -0.0981 241 804 1e+03 0.0215 735 840 DriftChamberPhysical eIoni - 4 -0.124 270 900 1e+03 0.00183 100 940 WorldPhysical CoupledTransportation - 5 -0.133 277 925 1e+03 0.00496 26.2 966 WorldPhysical eIoni - 6 -0.16 300 1e+03 1e+03 0.0173 78.2 1.04e+03 Crystal CoupledTransportation - 7 -0.16 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.133 277 925 0.00176 0 0 0 WorldPhysical initStep - 1 -0.136 277 925 0 0.00176 0.132 0.132 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0981 241 804 0.00463 0 0 0 DriftChamberPhysical initStep - 1 1.74 242 804 0.00322 0.00141 2.19 2.19 DriftChamberPhysical eIoni - 2 2.46 243 804 0.00117 0.00205 1.63 3.82 DriftChamberPhysical eIoni - 3 2.36 243 804 0 0.00117 0.383 4.2 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -2.47e-05 1.41 4.7 0.00176 0 0 0 WorldPhysical initStep - 1 -0.0531 1.41 4.7 0 0.00176 0.132 0.132 WorldPhysical eIoni -0 events have been kept for refreshing and/or reviewing. - "/vis/reviewKeptEvents" to review them one by one. - "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0.00155 -16.1 53.8 1e+03 0.00805 56.2 56.2 WorldPhysical eIoni - 2 0.00414 -21.7 72.4 1e+03 0.00605 19.3 75.5 WorldPhysical eIoni - 3 0.0099 -30 100 1e+03 0.00664 28.8 104 DriftChamberPhysical CoupledTransportation - 4 0.163 -270 900 1e+03 0.0236 835 940 WorldPhysical CoupledTransportation - 5 0.197 -300 1e+03 1e+03 0.022 104 1.04e+03 Crystal CoupledTransportation - 6 0.197 -300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.00414 -21.7 72.4 0.00743 0 0 0 WorldPhysical initStep - 1 -0.328 -21.6 72.4 0.00515 0.00111 0.42 0.42 WorldPhysical eIoni - 2 -0.624 -21.5 72.5 0 0.00515 0.808 1.23 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 3 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.328 -21.6 72.4 0.00117 0 0 0 WorldPhysical initStep - 1 -0.339 -21.6 72.4 0 0.00117 0.0714 0.0714 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.00155 -16.1 53.8 0.079 0 0 0 WorldPhysical initStep - 1 -1.14 -18.8 54.2 0.0759 0.00104 2.9 2.9 WorldPhysical eIoni - 2 -3.61 -37.5 64.5 0.0654 0.0105 23 25.9 WorldPhysical eIoni - 3 -15.1 -49.8 65.4 0.0586 0.00683 18 43.9 WorldPhysical eIoni - 4 -22.9 -55 60.8 0.0517 0.00522 11 55 WorldPhysical eIoni - 5 -25.8 -65.8 63.6 0.0444 0.00729 12.4 67.3 WorldPhysical eIoni - 6 -27.9 -73.6 65.5 0.0376 0.00682 9.76 77.1 WorldPhysical eIoni - 7 -28.2 -75.6 63.5 0.0326 0.00349 3.02 80.1 WorldPhysical eIoni - 8 -28.1 -79.8 60.6 0.0268 0.0058 6.23 86.4 WorldPhysical eIoni - 9 -27.7 -80.6 60.8 0.0237 0.000829 0.909 87.3 WorldPhysical eIoni - 10 -27.5 -81.9 61.3 0.0212 0.000701 1.51 88.8 WorldPhysical eIoni - 11 -25.5 -83.3 62.7 0.0177 0.00344 3.63 92.4 WorldPhysical eIoni - 12 -23.6 -82.4 63.6 0.0132 0.00456 3.02 95.4 WorldPhysical eIoni - 13 -22.3 -81.7 63.8 0.00985 0.00332 2.3 97.7 WorldPhysical eIoni - 14 -21.6 -81.7 64.6 0.00318 0.00667 1.81 99.5 WorldPhysical eIoni - 15 -21.4 -81.7 64.6 0 0.00318 0.349 99.9 WorldPhysical eIoni + 0 -0.000254 36.2 60.4 0.899 0 0 0 WorldPhysical initStep + 1 0.00615 60 100 0.899 0 46.2 46.2 DriftChamberPhysical CoupledTransportation + 2 0.136 540 900 0.899 0 933 979 WorldPhysical CoupledTransportation + 3 0.152 600 1e+03 0.899 0 117 1.1e+03 Crystal CoupledTransportation + 4 0.152 600 1e+03 0.899 0 0.729 1.1e+03 Crystal CoupledTransportation + 5 0.157 620 1.03e+03 0.852 0 39.7 1.14e+03 Crystal compt + 6 1.78e-15 621 1.04e+03 0.852 0 0.743 1.14e+03 Crystal CoupledTransportation + 7 -3.97 628 1.05e+03 0.85 0 18.7 1.16e+03 Crystal compt + 8 -4.73 630 1.06e+03 0.267 0 4.38 1.16e+03 Crystal compt + 9 -0.686 647 1.04e+03 0 0.0332 23.5 1.18e+03 Crystal phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 9, Parent ID = 2 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -27.5 -81.9 61.3 0.0018 0 0 0 WorldPhysical initStep - 1 -27.5 -81.9 61.4 0 0.0018 0.137 0.137 WorldPhysical eIoni + 0 -0.686 647 1.04e+03 0.234 0 0 0 Crystal initStep + 1 -0.668 647 1.04e+03 0 0.234 0.232 0.232 Crystal eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 8, Parent ID = 2 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -27.7 -80.6 60.8 0.00232 0 0 0 WorldPhysical initStep - 1 -27.6 -80.6 60.8 0 0.00232 0.205 0.205 WorldPhysical eIoni + 0 -4.73 630 1.06e+03 0.582 0 0 0 Crystal initStep + 1 -4.74 630 1.06e+03 0 0.582 0.845 0.845 Crystal eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 7, Parent ID = 2 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -28.2 -75.6 63.5 0.00149 0 0 0 WorldPhysical initStep - 1 -28.3 -75.6 63.5 0 0.00149 0.103 0.103 WorldPhysical eIoni + 0 -3.97 628 1.05e+03 0.00247 0 0 0 Crystal initStep + 1 -3.97 628 1.05e+03 0 0.00247 0.000184 0.000184 Crystal eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 6, Parent ID = 2 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -22.9 -55 60.8 0.00164 0 0 0 WorldPhysical initStep - 1 -22.9 -55.1 60.8 0 0.00164 0.119 0.119 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -1.14 -18.8 54.2 0.00208 0 0 0 WorldPhysical initStep - 1 -1.13 -18.8 54.1 0 0.00208 0.172 0.172 WorldPhysical eIoni + 0 0.157 620 1.03e+03 0.0474 0 0 0 Crystal initStep + 1 0.159 620 1.03e+03 0 0.0474 0.0176 0.0176 Crystal eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1426,179 +975,55 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 -0.000655 -5.47 18.3 1e+03 0.00415 19.1 19.1 WorldPhysical eIoni - 2 -0.000636 -6.18 20.6 1e+03 0.000132 2.45 21.5 WorldPhysical eIoni - 3 -0.000479 -6.85 22.8 1e+03 0.000226 2.32 23.8 WorldPhysical eIoni - 4 -0.00448 -20.6 68.7 1e+03 0.00925 47.9 71.8 WorldPhysical eIoni - 5 -0.0135 -30 100 1e+03 0.00424 32.6 104 DriftChamberPhysical CoupledTransportation - 6 -0.214 -251 837 1e+03 0.0206 770 874 DriftChamberPhysical eIoni - 7 -0.228 -270 900 1e+03 0.0017 65.7 940 WorldPhysical CoupledTransportation - 8 -0.233 -278 926 1e+03 0.0053 27.4 967 WorldPhysical eIoni - 9 -0.236 -300 1e+03 1e+03 0.0186 77 1.04e+03 Crystal CoupledTransportation - 10 -0.236 -300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.233 -278 926 0.0688 0 0 0 WorldPhysical initStep - 1 -3.68 -281 926 0.0645 0.00152 5 5 WorldPhysical eIoni - 2 -7.64 -282 927 0.0599 0.00284 4.33 9.34 WorldPhysical eIoni - 3 -19.5 -286 931 0.0462 0.00863 13.7 23.1 WorldPhysical eIoni - 4 -14.7 -292 937 0.0411 0.00512 10.4 33.4 WorldPhysical eIoni - 5 -12.2 -296 942 0.0342 0.00687 8.66 42.1 WorldPhysical eIoni - 6 -12 -297 942 0.0327 0.000256 0.563 42.6 WorldPhysical eIoni - 7 -11.8 -297 941 0.0291 0.000699 0.798 43.4 WorldPhysical eIoni - 8 -8.94 -299 938 0.0268 0.00233 5.34 48.8 WorldPhysical eIoni - 9 -6.91 -298 935 0.0213 0.0055 4.8 53.6 WorldPhysical eIoni - 10 -5.81 -299 932 0.018 0.00329 3.65 57.2 WorldPhysical eIoni - 11 -4.85 -299 934 0.0151 0.00291 3.06 60.3 WorldPhysical eIoni - 12 -4.92 -297 934 0.00969 0.00539 2.59 62.9 WorldPhysical eIoni - 13 -5.24 -297 934 0.0071 0.000958 1 63.9 WorldPhysical eIoni - 14 -5.07 -296 933 0.00159 0.00551 1.14 65 WorldPhysical eIoni - 15 -5.09 -296 933 0 0.00159 0.114 65.1 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 13, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -5.24 -297 934 0.00163 0 0 0 WorldPhysical initStep - 1 -5.26 -297 934 0 0.00163 0.117 0.117 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 12, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -11.8 -297 941 0.00294 0 0 0 WorldPhysical initStep - 1 -11.9 -297 941 0.00118 0.000645 0.152 0.152 WorldPhysical eIoni - 2 -11.9 -297 941 0 0.00118 0.0727 0.225 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 14, Parent ID = 12 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -11.9 -297 941 0.00111 0 0 0 WorldPhysical initStep - 1 -11.9 -297 941 0 0.00111 0.0662 0.0662 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 11, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -12 -297 942 0.00118 0 0 0 WorldPhysical initStep - 1 -12 -297 942 0 0.00118 0.0725 0.0725 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 10, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -19.5 -286 931 0.00512 0 0 0 WorldPhysical initStep - 1 -19.6 -286 931 0.00344 0.000224 0.0322 0.0322 WorldPhysical eIoni - 2 -19.6 -286 931 0.00149 0.000909 0.161 0.193 WorldPhysical eIoni - 3 -19.7 -286 931 0 0.00149 0.103 0.296 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 16, Parent ID = 10 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -19.6 -286 931 0.00104 0 0 0 WorldPhysical initStep - 1 -19.6 -286 931 0 0.00104 0.0604 0.0604 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 15, Parent ID = 10 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -19.6 -286 931 0.00145 0 0 0 WorldPhysical initStep - 1 -19.6 -286 931 0 0.00145 0.0987 0.0987 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -7.64 -282 927 0.00175 0 0 0 WorldPhysical initStep - 1 -7.64 -283 928 0 0.00175 0.131 0.131 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -3.68 -281 926 0.00278 0 0 0 WorldPhysical initStep - 1 -3.66 -281 926 0 0.00278 0.276 0.276 WorldPhysical eIoni + 1 -5.44e-05 43.1 71.8 1e+03 0.0119 83.7 83.7 WorldPhysical eIoni + 2 0.000326 52 86.7 1e+03 0.00224 17.4 101 WorldPhysical eIoni + 3 0.000453 60 100 1e+03 0.00219 15.5 117 DriftChamberPhysical CoupledTransportation + 4 0.0691 540 900 1e+03 0.0279 933 1.05e+03 WorldPhysical CoupledTransportation + 5 0.0687 544 907 1e+03 0.00114 8.23 1.06e+03 WorldPhysical eIoni + 6 0.0537 595 991 1e+03 0.0218 98 1.16e+03 WorldPhysical eIoni + 7 0.0524 597 996 1e+03 0.000638 5.24 1.16e+03 WorldPhysical eIoni + 8 0.0509 600 1e+03 1e+03 0.000808 5.18 1.17e+03 Crystal CoupledTransportation + 9 0.0509 600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.214 -251 837 0.00379 0 0 0 DriftChamberPhysical initStep - 1 -1.33 -250 837 0.00168 0.00211 1.87 1.87 DriftChamberPhysical eIoni - 2 -1.8 -250 837 0 0.00168 0.686 2.55 DriftChamberPhysical eIoni + 0 0.0524 597 996 0.00242 0 0 0 WorldPhysical initStep + 1 0.0954 597 996 0 0.00242 0.219 0.219 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.00448 -20.6 68.7 0.0385 0 0 0 WorldPhysical initStep - 1 6.23 -19.3 70.4 0.0341 0.00446 7.89 7.89 WorldPhysical eIoni - 2 11.3 -19.8 72.5 0.0312 0.00286 6.61 14.5 WorldPhysical eIoni - 3 14 -21.1 74.5 0.0253 0.0046 4.19 18.7 WorldPhysical eIoni - 4 16.6 -22 76.8 0.0216 0.00375 4.48 23.2 WorldPhysical eIoni - 5 17.9 -21.1 79.2 0.0175 0.0041 3.71 26.9 WorldPhysical eIoni - 6 16.7 -21 81.1 0.0135 0.00399 2.98 29.9 WorldPhysical eIoni - 7 15.1 -21.2 80.9 0.00931 0.00418 2.35 32.2 WorldPhysical eIoni - 8 14.6 -21.9 80.6 0.00484 0.00447 1.73 33.9 WorldPhysical eIoni - 9 14.5 -21.9 80.6 0.00381 1.64e-05 0.0914 34 WorldPhysical eIoni - 10 14.3 -21.8 80.6 0 0.00381 0.475 34.5 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 18, Parent ID = 5 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 14.5 -21.9 80.6 0.00101 0 0 0 WorldPhysical initStep - 1 14.5 -21.9 80.7 0 0.00101 0.0583 0.0583 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 17, Parent ID = 5 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 14 -21.1 74.5 0.00127 0 0 0 WorldPhysical initStep - 1 14 -21 74.5 0 0.00127 0.0812 0.0812 WorldPhysical eIoni + 0 0.0537 595 991 0.00267 0 0 0 WorldPhysical initStep + 1 0.0251 595 991 0 0.00267 0.258 0.258 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.000479 -6.85 22.8 0.00565 0 0 0 WorldPhysical initStep - 1 0.39 -6.76 22.9 0 0.00565 0.953 0.953 WorldPhysical eIoni + 0 0.0687 544 907 0.00329 0 0 0 WorldPhysical initStep + 1 0.201 544 907 0 0.00329 0.369 0.369 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.000636 -6.18 20.6 0.00215 0 0 0 WorldPhysical initStep - 1 -0.0736 -6.19 20.6 0 0.00215 0.182 0.182 WorldPhysical eIoni + 0 0.000326 52 86.7 0.00107 0 0 0 WorldPhysical initStep + 1 0.0239 52 86.7 0 0.00107 0.0629 0.0629 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.000655 -5.47 18.3 0.00191 0 0 0 WorldPhysical initStep - 1 -0.0527 -5.45 18.3 0 0.00191 0.15 0.15 WorldPhysical eIoni + 0 -5.44e-05 43.1 71.8 0.00101 0 0 0 WorldPhysical initStep + 1 -0.0125 43.1 71.8 0 0.00101 0.0582 0.0582 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1606,74 +1031,59 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0.0023 -20 66.8 1e+03 0.0166 69.8 69.8 WorldPhysical eIoni - 2 -0.00315 -30 100 1e+03 0.0138 34.7 104 DriftChamberPhysical CoupledTransportation - 3 -0.0143 -54.4 181 1e+03 0.0023 84.8 189 DriftChamberPhysical eIoni - 4 -0.0944 -270 900 1e+03 0.0263 750 940 WorldPhysical CoupledTransportation - 5 -0.0948 -285 951 1e+03 0.0115 53.4 993 WorldPhysical eIoni - 6 -0.0936 -291 969 1e+03 0.00614 18.6 1.01e+03 WorldPhysical eIoni - 7 -0.0922 -300 1e+03 1e+03 0.0061 32.4 1.04e+03 Crystal CoupledTransportation - 8 -0.0922 -300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom + 1 0 60 100 1e+03 0.0292 117 117 DriftChamberPhysical CoupledTransportation + 2 0.0119 122 204 1e+03 0.00376 121 238 DriftChamberPhysical eIoni + 3 0.0356 245 409 1e+03 0.00875 239 477 DriftChamberPhysical eIoni + 4 0.0896 540 900 1e+03 0.0173 572 1.05e+03 WorldPhysical CoupledTransportation + 5 0.0965 561 936 1e+03 0.00938 42 1.09e+03 WorldPhysical eIoni + 6 0.0992 571 953 1e+03 0.0023 19.3 1.11e+03 WorldPhysical eIoni + 7 0.107 589 983 1e+03 0.00572 35 1.15e+03 WorldPhysical eIoni + 8 0.114 600 1e+03 1e+03 0.00403 20.3 1.17e+03 Crystal CoupledTransportation + 9 0.114 600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.107 589 983 0.00654 0 0 0 WorldPhysical initStep + 1 0.228 589 983 0.00107 0.00547 1.2 1.2 WorldPhysical eIoni + 2 0.207 589 983 0 0.00107 0.0629 1.26 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0936 -291 969 0.00113 0 0 0 WorldPhysical initStep - 1 -0.0855 -291 969 0 0.00113 0.0678 0.0678 WorldPhysical eIoni + 0 0.0992 571 953 0.016 0 0 0 WorldPhysical initStep + 1 -1.81 572 953 0.0101 0.00596 2.74 2.74 WorldPhysical eIoni + 2 -1.67 573 952 0.00209 0.00797 1.84 4.58 WorldPhysical eIoni + 3 -1.61 573 952 0 0.00209 0.173 4.75 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0948 -285 951 0.0188 0 0 0 WorldPhysical initStep - 1 -1.86 -284 952 0.0153 0.00358 3.21 3.21 WorldPhysical eIoni - 2 -3.69 -284 952 0.00993 0.00533 2.62 5.83 WorldPhysical eIoni - 3 -4.37 -284 952 0.00399 0.00368 0.865 6.69 WorldPhysical eIoni - 4 -4.42 -284 952 0.00194 0.00104 0.14 6.83 WorldPhysical eIoni - 5 -4.38 -284 952 0 0.00194 0.155 6.99 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 4 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -4.42 -284 952 0.00101 0 0 0 WorldPhysical initStep - 1 -4.42 -284 951 0 0.00101 0.0578 0.0578 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 4 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -4.37 -284 952 0.00226 0 0 0 WorldPhysical initStep - 1 -4.44 -284 952 0 0.00226 0.196 0.196 WorldPhysical eIoni + 0 0.0965 561 936 0.00136 0 0 0 WorldPhysical initStep + 1 0.131 561 936 0 0.00136 0.0892 0.0892 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0143 -54.4 181 0.00129 0 0 0 DriftChamberPhysical initStep - 1 -0.264 -54.5 181 0 0.00129 0.446 0.446 DriftChamberPhysical eIoni + 0 0.0356 245 409 0.00304 0 0 0 DriftChamberPhysical initStep + 1 0.498 244 410 0.00164 0.0014 1.55 1.55 DriftChamberPhysical eIoni + 2 0.362 244 410 0 0.00164 0.659 2.21 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0023 -20 66.8 0.0451 0 0 0 WorldPhysical initStep - 1 8.18 -21.5 68.2 0.0398 0.00536 9.99 9.99 WorldPhysical eIoni - 2 14.1 -23.8 65.5 0.0353 0.0045 8.26 18.3 WorldPhysical eIoni - 3 19.8 -22.5 65.3 0.029 0.00629 6.94 25.2 WorldPhysical eIoni - 4 23.5 -20.4 65.4 0.0215 0.00747 5.31 30.5 WorldPhysical eIoni - 5 26 -21.3 66.6 0.0175 0.00405 3.7 34.2 WorldPhysical eIoni - 6 26.4 -20.9 68.8 0.0148 0.00267 2.97 37.2 WorldPhysical eIoni - 7 27 -21.8 70.2 0.0103 0.00451 2.55 39.7 WorldPhysical eIoni - 8 26.7 -22.7 70.8 0.00555 0.00473 1.88 41.6 WorldPhysical eIoni - 9 26.7 -23.1 70.8 0 0.00555 0.922 42.5 WorldPhysical eIoni + 0 0.0119 122 204 0.00107 0 0 0 DriftChamberPhysical initStep + 1 0.0312 122 204 0 0.00107 0.333 0.333 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1681,28 +1091,19 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -30 100 1e+03 0.0174 104 104 DriftChamberPhysical CoupledTransportation - 2 -0.0234 -42.8 143 1e+03 0.0017 44.6 149 DriftChamberPhysical eIoni - 3 -0.254 -170 567 1e+03 0.0135 443 592 DriftChamberPhysical eIoni - 4 -0.453 -269 900 1e+03 0.00842 348 939 WorldPhysical CoupledTransportation - 5 -0.506 -299 1e+03 1e+03 0.0267 104 1.04e+03 Crystal CoupledTransportation - 6 -0.506 -299 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.254 -170 567 0.0011 0 0 0 DriftChamberPhysical initStep - 1 -0.176 -170 567 0 0.0011 0.345 0.345 DriftChamberPhysical eIoni + 1 0.00149 21.1 35.1 1e+03 0.00978 40.9 40.9 WorldPhysical eIoni + 2 0.00545 60 100 1e+03 0.0125 75.7 117 DriftChamberPhysical CoupledTransportation + 3 -0.0943 540 900 1e+03 0.0299 933 1.05e+03 WorldPhysical CoupledTransportation + 4 -0.0924 600 1e+03 1e+03 0.025 117 1.17e+03 Crystal CoupledTransportation + 5 -0.0924 600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0234 -42.8 143 0.0018 0 0 0 DriftChamberPhysical initStep - 1 -0.211 -42.3 143 0 0.0018 0.764 0.764 DriftChamberPhysical eIoni + 0 0.00149 21.1 35.1 0.00414 0 0 0 WorldPhysical initStep + 1 0.176 21 35.2 0 0.00414 0.38 0.38 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1710,112 +1111,67 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 -0.00116 -4.58 15.3 1e+03 0.00299 15.9 15.9 WorldPhysical eIoni - 2 -0.0135 -30 100 1e+03 0.0202 88.5 104 DriftChamberPhysical CoupledTransportation - 3 -0.0406 -170 568 1e+03 0.0141 488 593 DriftChamberPhysical eIoni - 4 -0.0491 -270 900 1e+03 0.0114 347 940 WorldPhysical CoupledTransportation - 5 -0.0472 -279 928 1e+03 0.00469 29.8 969 WorldPhysical eIoni - 6 -0.044 -284 948 1e+03 0.00524 19.9 989 WorldPhysical eIoni - 7 -0.0308 -295 983 1e+03 0.00725 36.8 1.03e+03 WorldPhysical eBrem - 8 -0.024 -300 1e+03 1e+03 0.00307 17.9 1.04e+03 Crystal CoupledTransportation - 9 -0.024 -300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom + 1 -0.00335 59.5 99.2 1e+03 0.0211 116 116 WorldPhysical eIoni + 2 -0.00339 60 100 1e+03 0.000202 0.948 117 DriftChamberPhysical CoupledTransportation + 3 -0.00414 77.7 129 1e+03 0.000449 34.3 151 DriftChamberPhysical eIoni + 4 -0.00179 319 531 1e+03 0.0168 469 620 DriftChamberPhysical eIoni + 5 0.00428 394 656 1e+03 0.00386 145 765 DriftChamberPhysical eIoni + 6 0.00945 533 887 1e+03 0.0102 270 1.03e+03 DriftChamberPhysical eIoni + 7 0.00915 540 900 1e+03 0.00044 14.9 1.05e+03 WorldPhysical CoupledTransportation + 8 0.00381 579 965 1e+03 0.0178 75.6 1.13e+03 WorldPhysical eIoni + 9 0.00328 600 1e+03 1e+03 0.00978 41.1 1.17e+03 Crystal CoupledTransportation + 10 0.00328 600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 6, Parent ID = 1 +* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0308 -295 983 0.296 0 0 0 WorldPhysical initStep - 1 -0.0173 -300 1e+03 0.296 0 17.9 17.9 Crystal CoupledTransportation - 2 -0.0119 -302 1.01e+03 0.269 0 7.17 25.1 Crystal compt - 3 9.65e-16 -302 1.01e+03 0.269 0 0.0427 25.1 Crystal CoupledTransportation - 4 1.15 -305 1.01e+03 0 0.036 4.12 29.2 Crystal phot + 0 0.00381 579 965 0.0018 0 0 0 WorldPhysical initStep + 1 -0.0199 579 965 0 0.0018 0.137 0.137 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 6 +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 1.15 -305 1.01e+03 0.233 0 0 0 Crystal initStep - 1 1.14 -305 1.01e+03 0 0.233 0.231 0.231 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 6 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0119 -302 1.01e+03 0.0272 0 0 0 Crystal initStep - 1 -0.0123 -302 1.01e+03 0 0.0272 0.00699 0.00699 Crystal eIoni + 0 0.00945 533 887 0.00389 0 0 0 DriftChamberPhysical initStep + 1 1.63 533 887 0.00296 0.000933 1.91 1.91 DriftChamberPhysical eIoni + 2 2.79 533 887 0.00247 0.000493 1.51 3.41 DriftChamberPhysical eIoni + 3 3.44 532 887 0.00116 0.0013 1.24 4.66 DriftChamberPhysical eIoni + 4 3.52 532 887 0 0.00116 0.38 5.04 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.044 -284 948 0.0318 0 0 0 WorldPhysical initStep - 1 -4.83 -285 948 0.0269 0.00492 6 6 WorldPhysical eIoni - 2 -6.9 -288 948 0.0196 0.00326 4.59 10.6 WorldPhysical eIoni - 3 -8.19 -290 947 0.0159 0.0025 2.6 13.2 WorldPhysical eIoni - 4 -7.46 -290 946 0.00967 0.00626 2.72 15.9 WorldPhysical eIoni - 5 -6.98 -290 945 0.00377 0.0037 1.58 17.5 WorldPhysical eIoni - 6 -6.87 -290 945 0 0.00377 0.467 18 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 11, Parent ID = 5 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -6.98 -290 945 0.0022 0 0 0 WorldPhysical initStep - 1 -7.05 -290 945 0 0.0022 0.188 0.188 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 10, Parent ID = 5 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -8.19 -290 947 0.00118 0 0 0 WorldPhysical initStep - 1 -8.18 -290 947 0 0.00118 0.0724 0.0724 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 5 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -6.9 -288 948 0.004 0 0 0 WorldPhysical initStep - 1 -6.79 -289 948 0.00172 0.00116 0.242 0.242 WorldPhysical eIoni - 2 -6.8 -289 948 0 0.00172 0.127 0.37 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 12, Parent ID = 9 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -6.79 -289 948 0.00113 0 0 0 WorldPhysical initStep - 1 -6.8 -289 948 0 0.00113 0.0682 0.0682 WorldPhysical eIoni + 0 0.00428 394 656 0.00154 0 0 0 DriftChamberPhysical initStep + 1 0.275 393 656 0 0.00154 0.592 0.592 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0472 -279 928 0.00202 0 0 0 WorldPhysical initStep - 1 -0.0796 -279 928 0 0.00202 0.164 0.164 WorldPhysical eIoni + 0 -0.00179 319 531 0.00106 0 0 0 DriftChamberPhysical initStep + 1 -0.219 319 531 0 0.00106 0.327 0.327 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0406 -170 568 0.00148 0 0 0 DriftChamberPhysical initStep - 1 -0.407 -170 568 0 0.00148 0.554 0.554 DriftChamberPhysical eIoni + 0 -0.00414 77.7 129 0.00101 0 0 0 DriftChamberPhysical initStep + 1 0.204 77.7 129 0 0.00101 0.304 0.304 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.00116 -4.58 15.3 0.00169 0 0 0 WorldPhysical initStep - 1 0.0345 -4.61 15.3 0 0.00169 0.125 0.125 WorldPhysical eIoni + 0 -0.00335 59.5 99.2 0.00464 0 0 0 WorldPhysical initStep + 1 -0.0547 59.3 99.3 0 0.00464 0.67 0.67 WorldPhysical eIoni 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1826,1599 +1182,1207 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -0.994 1.66 1e+03 0.000207 1.93 1.93 WorldPhysical eIoni - 2 0.000488 -5.72 9.53 1e+03 0.00105 9.18 11.1 WorldPhysical eIoni - 3 0.00812 -60 100 1e+03 0.0226 105 117 DriftChamberPhysical CoupledTransportation - 4 0.0827 -271 452 1e+03 0.0106 411 527 DriftChamberPhysical eIoni - 5 0.0874 -287 479 1e+03 0.000409 31.6 559 DriftChamberPhysical eIoni - 6 0.11 -348 580 1e+03 0.00516 117 676 DriftChamberPhysical eIoni - 7 0.127 -389 648 1e+03 0.00369 79.7 755 DriftChamberPhysical eIoni - 8 0.164 -519 866 1e+03 0.00646 254 1.01e+03 DriftChamberPhysical eIoni - 9 0.168 -540 900 1e+03 0.000854 39.8 1.05e+03 WorldPhysical CoupledTransportation - 10 0.169 -545 909 1e+03 0.00209 10.3 1.06e+03 WorldPhysical eIoni - 11 0.169 -553 921 1e+03 0.00139 14.5 1.07e+03 WorldPhysical eIoni - 12 0.17 -600 1e+03 1e+03 0.0173 91.8 1.17e+03 Crystal CoupledTransportation - 13 0.17 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom + 1 -0.00275 12.4 41.3 1e+03 0.00836 43.1 43.1 WorldPhysical eIoni + 2 -0.00938 30 100 1e+03 0.00987 61.3 104 DriftChamberPhysical CoupledTransportation + 3 -0.191 270 900 1e+03 0.0302 835 940 WorldPhysical CoupledTransportation + 4 -0.217 294 979 1e+03 0.018 82.5 1.02e+03 WorldPhysical eIoni + 5 -0.217 294 981 1e+03 0.000205 1.54 1.02e+03 WorldPhysical eIoni + 6 -0.221 300 1e+03 1e+03 0.00176 20.3 1.04e+03 Crystal CoupledTransportation + 7 -0.221 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 10, Parent ID = 1 +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.169 -553 921 0.0016 0 0 0 WorldPhysical initStep - 1 0.129 -553 921 0 0.0016 0.114 0.114 WorldPhysical eIoni + 0 -0.217 294 981 0.00125 0 0 0 WorldPhysical initStep + 1 -0.242 294 981 0 0.00125 0.0787 0.0787 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 1 +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.169 -545 909 0.00225 0 0 0 WorldPhysical initStep - 1 0.247 -545 909 0 0.00225 0.196 0.196 WorldPhysical eIoni + 0 -0.217 294 979 0.00378 0 0 0 WorldPhysical initStep + 1 -0.381 294 979 0 0.00378 0.469 0.469 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 1 +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.164 -519 866 0.00129 0 0 0 DriftChamberPhysical initStep - 1 0.437 -519 866 0 0.00129 0.446 0.446 DriftChamberPhysical eIoni + 0 -0.00275 12.4 41.3 0.00558 0 0 0 WorldPhysical initStep + 1 0.149 12.7 41.2 0 0.00558 0.931 0.931 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 30 100 1e+03 0.0241 104 104 DriftChamberPhysical CoupledTransportation + 2 -0.137 269 898 1e+03 0.0269 833 937 DriftChamberPhysical eIoni + 3 -0.137 270 900 1e+03 5.37e-05 2.58 940 WorldPhysical CoupledTransportation + 4 -0.143 275 917 1e+03 0.0037 17.5 957 WorldPhysical eIoni + 5 -0.17 298 995 1e+03 0.0153 81.2 1.04e+03 WorldPhysical eIoni + 6 -0.171 300 1e+03 1e+03 0.000831 5.72 1.04e+03 Crystal CoupledTransportation + 7 -0.171 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.17 298 995 0.00218 0 0 0 WorldPhysical initStep + 1 -0.181 298 994 0 0.00218 0.186 0.186 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.143 275 917 0.00214 0 0 0 WorldPhysical initStep + 1 -0.134 275 917 0 0.00214 0.181 0.181 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.137 269 898 0.00136 0 0 0 DriftChamberPhysical initStep + 1 0.16 269 898 0 0.00136 0.486 0.486 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0.000544 6.76 22.5 1e+03 0.00476 23.5 23.5 WorldPhysical eIoni + 2 0.00398 26.1 87 1e+03 0.0126 67.4 90.9 WorldPhysical eIoni + 3 0.00427 30 100 1e+03 0.00273 13.5 104 DriftChamberPhysical CoupledTransportation + 4 -0.0379 270 900 1e+03 0.0246 835 940 WorldPhysical CoupledTransportation + 5 -0.0461 300 1e+03 1e+03 0.0163 104 1.04e+03 Crystal CoupledTransportation + 6 -0.0461 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.00398 26.1 87 0.0103 0 0 0 WorldPhysical initStep + 1 -0.844 26.8 87 0.00545 0.00486 1.88 1.88 WorldPhysical eIoni + 2 -0.887 26.7 87.3 0 0.00545 0.892 2.77 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.000544 6.76 22.5 0.00378 0 0 0 WorldPhysical initStep + 1 -0.108 6.92 22.5 0 0.00378 0.469 0.469 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 -0.00511 23.4 78.1 1e+03 0.018 81.5 81.5 WorldPhysical eIoni + 2 -0.00787 30 100 1e+03 0.00195 22.9 104 DriftChamberPhysical CoupledTransportation + 3 -0.014 53.2 177 1e+03 0.00298 80.7 185 DriftChamberPhysical eIoni + 4 -0.025 80.4 268 1e+03 0.00224 94.8 280 DriftChamberPhysical eIoni + 5 -0.0602 159 529 1e+03 0.00856 272 552 DriftChamberPhysical eIoni + 6 -0.0664 173 575 1e+03 0.000501 48.2 600 DriftChamberPhysical eIoni + 7 -0.115 270 900 1e+03 0.00842 339 940 WorldPhysical CoupledTransportation + 8 -0.118 291 969 1e+03 0.0141 72.2 1.01e+03 WorldPhysical eIoni + 9 -0.118 300 1e+03 1e+03 0.00502 32.2 1.04e+03 Crystal CoupledTransportation + 10 -0.118 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 7, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.127 -389 648 0.00109 0 0 0 DriftChamberPhysical initStep - 1 0.354 -389 648 0 0.00109 0.344 0.344 DriftChamberPhysical eIoni + 0 -0.118 291 969 0.00267 0 0 0 WorldPhysical initStep + 1 -0.177 291 969 0 0.00267 0.259 0.259 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.11 -348 580 0.00263 0 0 0 DriftChamberPhysical initStep - 1 0.622 -348 579 0 0.00263 1.34 1.34 DriftChamberPhysical eIoni + 0 -0.0664 173 575 0.00855 0 0 0 DriftChamberPhysical initStep + 1 0.253 176 574 0.00698 0.00158 3.97 3.97 DriftChamberPhysical eIoni + 2 1.67 179 574 0.00624 0.000733 3.18 7.15 DriftChamberPhysical eIoni + 3 3.54 181 574 0.00525 0.000999 2.85 10 DriftChamberPhysical eIoni + 4 5.03 182 573 0.00341 0.00184 2.43 12.4 DriftChamberPhysical eIoni + 5 5.92 183 573 0.00235 0.00106 1.71 14.1 DriftChamberPhysical eIoni + 6 6.24 184 574 0.00138 0.000969 1.17 15.3 DriftChamberPhysical eIoni + 7 6.43 183 573 0 0.00138 0.496 15.8 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0874 -287 479 0.00557 0 0 0 DriftChamberPhysical initStep - 1 -1.33 -286 480 0.004 0.00158 2.57 2.57 DriftChamberPhysical eIoni - 2 -2.63 -286 481 0.00274 0.00125 1.95 4.52 DriftChamberPhysical eIoni - 3 -3.39 -286 482 0.00184 0.00091 1.4 5.92 DriftChamberPhysical eIoni - 4 -3.17 -286 483 0 0.00184 0.79 6.71 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0827 -271 452 0.00113 0 0 0 DriftChamberPhysical initStep - 1 0.332 -271 452 0 0.00113 0.362 0.362 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.000488 -5.72 9.53 0.00176 0 0 0 WorldPhysical initStep - 1 -0.0173 -5.76 9.51 0 0.00176 0.132 0.132 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 -0.994 1.66 0.00299 0 0 0 WorldPhysical initStep - 1 -0.127 -1.03 1.65 0.00107 0.00192 0.279 0.279 WorldPhysical eIoni - 2 -0.105 -1.02 1.66 0 0.00107 0.063 0.342 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0.000294 -24.7 41.1 1e+03 0.00862 47.9 47.9 WorldPhysical eIoni - 2 0.00132 -60 100 1e+03 0.00941 68.7 117 DriftChamberPhysical CoupledTransportation - 3 0.0558 -387 646 1e+03 0.0176 636 753 DriftChamberPhysical eIoni - 4 0.0729 -540 900 1e+03 0.00797 296 1.05e+03 WorldPhysical CoupledTransportation - 5 0.079 -600 1e+03 1e+03 0.0237 117 1.17e+03 Crystal CoupledTransportation - 6 0.079 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0558 -387 646 0.0023 0 0 0 DriftChamberPhysical initStep - 1 0.635 -388 646 0 0.0023 1.13 1.13 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.000294 -24.7 41.1 0.00145 0 0 0 WorldPhysical initStep - 1 -0.0176 -24.7 41.1 0 0.00145 0.098 0.098 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 6.56e-05 -2.09 3.48 1e+03 0.00118 4.06 4.06 WorldPhysical eIoni - 2 0.00685 -60 100 1e+03 0.0168 113 117 DriftChamberPhysical CoupledTransportation - 3 0.0202 -80.6 134 1e+03 0.000724 40 157 DriftChamberPhysical eIoni - 4 0.159 -241 402 1e+03 0.00737 312 468 DriftChamberPhysical eIoni - 5 0.426 -540 900 1e+03 0.0161 581 1.05e+03 WorldPhysical CoupledTransportation - 6 0.465 -600 1e+03 1e+03 0.0217 117 1.17e+03 Crystal CoupledTransportation - 7 0.465 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.159 -241 402 0.00114 0 0 0 DriftChamberPhysical initStep - 1 0.311 -241 402 0 0.00114 0.367 0.367 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0202 -80.6 134 0.00341 0 0 0 DriftChamberPhysical initStep - 1 -1.39 -80.5 134 0.00216 0.00124 1.71 1.71 DriftChamberPhysical eIoni - 2 -1.44 -79.8 135 0 0.00216 1.04 2.75 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 6.56e-05 -2.09 3.48 0.00106 0 0 0 WorldPhysical initStep - 1 -0.00852 -2.07 3.49 0 0.00106 0.0618 0.0618 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0.000663 -16 26.6 1e+03 0.0102 31 31 WorldPhysical eIoni - 2 0.00823 -60 100 1e+03 0.0147 85.6 117 DriftChamberPhysical CoupledTransportation - 3 0.00883 -64 107 1e+03 9.9e-05 7.85 124 DriftChamberPhysical eIoni - 4 0.0477 -540 900 1e+03 0.0227 925 1.05e+03 WorldPhysical CoupledTransportation - 5 0.0481 -547 911 1e+03 0.00237 13 1.06e+03 WorldPhysical eIoni - 6 0.0507 -600 1e+03 1e+03 0.0232 104 1.17e+03 Crystal CoupledTransportation - 7 0.0507 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0481 -547 911 0.00101 0 0 0 WorldPhysical initStep - 1 0.0647 -547 911 0 0.00101 0.0576 0.0576 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.00883 -64 107 0.00232 0 0 0 DriftChamberPhysical initStep - 1 0.597 -63.5 107 0 0.00232 1.15 1.15 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.000663 -16 26.6 0.00121 0 0 0 WorldPhysical initStep - 1 -0.000836 -16 26.6 0 0.00121 0.0747 0.0747 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 -0.000933 -16.7 27.8 1e+03 0.00744 32.4 32.4 WorldPhysical eIoni - 2 0.000791 -60 100 1e+03 0.0165 84.2 117 DriftChamberPhysical CoupledTransportation - 3 0.0976 -451 752 1e+03 0.0199 760 877 DriftChamberPhysical eIoni - 4 0.13 -508 847 1e+03 0.00451 110 987 DriftChamberPhysical eIoni - 5 0.151 -540 900 1e+03 0.00206 62.3 1.05e+03 WorldPhysical CoupledTransportation - 6 0.171 -570 950 1e+03 0.00809 58.2 1.11e+03 WorldPhysical eIoni - 7 0.185 -600 1e+03 1e+03 0.0116 58.4 1.17e+03 Crystal CoupledTransportation - 8 0.185 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.171 -570 950 0.00133 0 0 0 WorldPhysical initStep - 1 0.199 -570 950 0 0.00133 0.0863 0.0863 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.13 -508 847 0.00247 0 0 0 DriftChamberPhysical initStep - 1 -0.704 -508 846 0 0.00247 1.25 1.25 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0976 -451 752 0.046 0 0 0 DriftChamberPhysical initStep - 1 -39 -429 785 0.0424 0.00358 56.3 56.3 DriftChamberPhysical eIoni - 2 -44.2 -423 792 0.0406 0.000603 10.8 67.1 DriftChamberPhysical eIoni - 3 -53.6 -416 802 0.0322 0.00162 15.7 82.8 DriftChamberPhysical eIoni - 4 -63.1 -414 826 0.0288 0.00245 26 109 DriftChamberPhysical eIoni - 5 -64.6 -415 840 0.0259 0.00174 14.2 123 DriftChamberPhysical eIoni - 6 -76.1 -420 856 0.0223 0.00363 20.6 144 DriftChamberPhysical eIoni - 7 -86.8 -425 866 0.0194 0.00286 16 160 DriftChamberPhysical eIoni - 8 -95.3 -427 875 0.0169 0.00254 12.7 172 DriftChamberPhysical eIoni - 9 -100 -429 883 0.0149 0.00201 10.2 182 DriftChamberPhysical eIoni - 10 -104 -433 889 0.0121 0.00277 8.36 191 DriftChamberPhysical eIoni - 11 -108 -438 891 0.00995 0.00214 6.19 197 DriftChamberPhysical eIoni - 12 -110 -441 892 0.00871 0.00123 4.77 202 DriftChamberPhysical eIoni - 13 -111 -445 892 0.00712 0.00159 4.06 206 DriftChamberPhysical eIoni - 14 -113 -448 892 0.00595 0.00118 3.25 209 DriftChamberPhysical eIoni - 15 -113 -450 892 0.00376 0.00219 2.72 212 DriftChamberPhysical eIoni - 16 -113 -452 891 0.00228 0.00147 1.85 214 DriftChamberPhysical eIoni - 17 -112 -452 890 0 0.00228 1.13 215 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 3 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -64.6 -415 840 0.00115 0 0 0 DriftChamberPhysical initStep - 1 -64.4 -415 840 0 0.00115 0.374 0.374 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 3 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -63.1 -414 826 0.000991 0 0 0 DriftChamberPhysical initStep - 1 -63.3 -414 826 0 0.000991 0.296 0.296 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 3 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -53.6 -416 802 0.0067 0 0 0 DriftChamberPhysical initStep - 1 -54.2 -414 802 0.00437 0.00233 3.05 3.05 DriftChamberPhysical eIoni - 2 -54.4 -412 801 0.00269 0.00168 2.09 5.14 DriftChamberPhysical eIoni - 3 -54.6 -413 801 0.0013 0.00139 1.37 6.51 DriftChamberPhysical eIoni - 4 -54.9 -413 801 0 0.0013 0.452 6.97 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 3 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -44.2 -423 792 0.00124 0 0 0 DriftChamberPhysical initStep - 1 -44.1 -423 792 0 0.00124 0.42 0.42 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.000933 -16.7 27.8 0.00128 0 0 0 WorldPhysical initStep - 1 -0.0316 -16.7 27.8 0 0.00128 0.0816 0.0816 WorldPhysical eIoni -0 events have been kept for refreshing and/or reviewing. - "/vis/reviewKeptEvents" to review them one by one. - "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. - -********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 60 100 1e+03 0.0131 117 117 DriftChamberPhysical CoupledTransportation - 2 0.0419 174 291 1e+03 0.00444 222 339 DriftChamberPhysical hIoni - 3 0.17 540 900 1e+03 0.0176 710 1.05e+03 WorldPhysical CoupledTransportation - 4 0.178 570 950 1e+03 0.00859 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 5 0.178 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0419 174 291 0.0021 0 0 0 DriftChamberPhysical initStep - 1 -0.609 174 291 0 0.0021 0.986 0.986 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 49.5 82.5 1e+03 0.0141 96.2 96.2 WorldPhysical hIoni - 2 -0.00124 60 100 1e+03 0.00191 20.4 117 DriftChamberPhysical CoupledTransportation - 3 -0.0567 477 796 1e+03 0.0187 811 928 DriftChamberPhysical hIoni - 4 -0.0743 540 900 1e+03 0.00144 121 1.05e+03 WorldPhysical CoupledTransportation - 5 -0.0769 551 918 1e+03 0.00342 21.1 1.07e+03 WorldPhysical hIoni - 6 -0.0824 570 950 1e+03 0.0063 37.2 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 7 -0.0824 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0769 551 918 0.00188 0 0 0 WorldPhysical initStep - 1 -0.122 551 918 0 0.00188 0.147 0.147 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0567 477 796 0.0116 0 0 0 DriftChamberPhysical initStep - 1 -0.438 482 794 0.00917 0.00246 5.87 5.87 DriftChamberPhysical eIoni - 2 0.418 486 792 0.00774 0.00143 4.32 10.2 DriftChamberPhysical eIoni - 3 1.19 488 789 0.00489 0.00285 3.55 13.7 DriftChamberPhysical eIoni - 4 2.4 488 788 0.00402 0.000867 2.29 16 DriftChamberPhysical eIoni - 5 4.07 489 787 0.00303 0.000991 1.96 18 DriftChamberPhysical eIoni - 6 5.04 489 788 0 0.00303 1.54 19.5 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 49.5 82.5 0.00106 0 0 0 WorldPhysical initStep - 1 -0.0109 49.5 82.5 0 0.00106 0.0616 0.0616 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 -4.86e-05 6.9 11.5 1e+03 0.0016 13.4 13.4 WorldPhysical hIoni - 2 0.000421 13.5 22.5 1e+03 0.00174 12.9 26.3 WorldPhysical hIoni - 3 0.000142 20.1 33.4 1e+03 0.00184 12.7 39 WorldPhysical hIoni - 4 0.000633 60 100 1e+03 0.0125 77.6 117 DriftChamberPhysical CoupledTransportation - 5 -0.00861 364 607 1e+03 0.00996 591 708 DriftChamberPhysical hIoni - 6 0.0157 540 900 1e+03 0.00643 341 1.05e+03 WorldPhysical CoupledTransportation - 7 0.0228 570 950 1e+03 0.00853 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 8 0.0228 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.00861 364 607 0.00182 0 0 0 DriftChamberPhysical initStep - 1 0.0375 364 608 0 0.00182 0.781 0.781 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.000142 20.1 33.4 0.00197 0 0 0 WorldPhysical initStep - 1 -0.0308 20.1 33.4 0 0.00197 0.158 0.158 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.000421 13.5 22.5 0.00334 0 0 0 WorldPhysical initStep - 1 0.12 13.6 22.5 0 0.00334 0.378 0.378 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -4.86e-05 6.9 11.5 0.00194 0 0 0 WorldPhysical initStep - 1 -0.062 6.89 11.5 0 0.00194 0.154 0.154 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 32 53.4 1e+03 0.00718 62.3 62.3 WorldPhysical hIoni - 2 -0.0119 59.7 99.5 1e+03 0.00924 53.8 116 WorldPhysical hIoni - 3 -0.012 60 100 1e+03 0 0.59 117 DriftChamberPhysical CoupledTransportation - 4 -0.0777 196 326 1e+03 0.00385 264 380 DriftChamberPhysical hIoni - 5 -0.11 268 447 1e+03 0.00369 141 521 DriftChamberPhysical hIoni - 6 -0.162 540 900 1e+03 0.00856 529 1.05e+03 WorldPhysical CoupledTransportation - 7 -0.17 565 941 1e+03 0.00992 47.2 1.1e+03 WorldPhysical hIoni - 8 -0.17 570 950 1e+03 0.00105 11.1 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 9 -0.17 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.17 565 941 0.00294 0 0 0 WorldPhysical initStep - 1 -0.188 565 941 0 0.00294 0.304 0.304 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.11 268 447 0.0344 0 0 0 DriftChamberPhysical initStep - 1 -28.6 283 444 0.0309 0.00347 33.7 33.7 DriftChamberPhysical eIoni - 2 -49.8 298 436 0.0264 0.00456 28 61.7 DriftChamberPhysical eIoni - 3 -54.8 299 434 0.0241 0.00132 5.5 67.2 DriftChamberPhysical eIoni - 4 -69.5 303 426 0.0204 0.00371 18.2 85.4 DriftChamberPhysical eIoni - 5 -79.2 307 418 0.0174 0.00295 13.8 99.1 DriftChamberPhysical eIoni - 6 -82.1 309 415 0.0158 0.000639 4.38 104 DriftChamberPhysical eIoni - 7 -87.9 313 410 0.0132 0.00261 9.14 113 DriftChamberPhysical eIoni - 8 -91.5 314 405 0.0116 0.00154 6.98 120 DriftChamberPhysical eIoni - 9 -94.4 314 400 0.0107 0.000936 5.86 125 DriftChamberPhysical eIoni - 10 -97.7 313 397 0.00958 0.0011 5.23 131 DriftChamberPhysical eIoni - 11 -101 311 394 0.00873 0.000847 4.55 135 DriftChamberPhysical eIoni - 12 -105 310 394 0.00699 0.00174 4.07 139 DriftChamberPhysical eIoni - 13 -105 311 393 0.00504 0.00062 1.36 141 DriftChamberPhysical eIoni - 14 -106 312 392 0.00317 0.00187 2.35 143 DriftChamberPhysical eIoni - 15 -106 313 391 0 0.00317 1.61 145 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 5 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -105 311 393 0.00133 0 0 0 DriftChamberPhysical initStep - 1 -106 311 393 0 0.00133 0.469 0.469 DriftChamberPhysical eIoni + 0 -0.0602 159 529 0.00567 0 0 0 DriftChamberPhysical initStep + 1 -0.21 158 529 0.00361 0.000461 1.05 1.05 DriftChamberPhysical eIoni + 2 -0.205 156 529 0.00176 0.00185 1.79 2.84 DriftChamberPhysical eIoni + 3 0.201 156 529 0 0.00176 0.741 3.58 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 8, Parent ID = 5 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -82.1 309 415 0.00101 0 0 0 DriftChamberPhysical initStep - 1 -82.1 308 415 0 0.00101 0.306 0.306 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 5 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -54.8 299 434 0.000993 0 0 0 DriftChamberPhysical initStep - 1 -54.9 299 435 0 0.000993 0.297 0.297 DriftChamberPhysical eIoni + 0 -0.21 158 529 0.00159 0 0 0 DriftChamberPhysical initStep + 1 -0.27 158 530 0 0.00159 0.625 0.625 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0777 196 326 0.00275 0 0 0 DriftChamberPhysical initStep - 1 -0.95 195 327 0 0.00275 1.4 1.4 DriftChamberPhysical eIoni + 0 -0.025 80.4 268 0.00142 0 0 0 DriftChamberPhysical initStep + 1 -0.161 80.8 268 0 0.00142 0.517 0.517 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0119 59.7 99.5 0.00204 0 0 0 WorldPhysical initStep - 1 -0.0626 59.7 99.5 0 0.00204 0.167 0.167 WorldPhysical eIoni + 0 -0.014 53.2 177 0.00173 0 0 0 DriftChamberPhysical initStep + 1 0.28 53.6 177 0 0.00173 0.716 0.716 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 32 53.4 0.00262 0 0 0 WorldPhysical initStep - 1 0.104 32 53.4 0 0.00262 0.251 0.251 WorldPhysical eIoni + 0 -0.00511 23.4 78.1 0.00142 0 0 0 WorldPhysical initStep + 1 0.00711 23.4 78.1 0 0.00142 0.0956 0.0956 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 60 100 1e+03 0.016 117 117 DriftChamberPhysical CoupledTransportation - 2 0.0219 306 511 1e+03 0.00934 479 595 DriftChamberPhysical hIoni - 3 0.0926 540 900 1e+03 0.00992 454 1.05e+03 WorldPhysical CoupledTransportation - 4 0.0969 557 928 1e+03 0.00268 32.6 1.08e+03 WorldPhysical hIoni - 5 0.101 570 950 1e+03 0.00413 25.7 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 6 0.101 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 1 0 30 100 1e+03 0.0199 104 104 DriftChamberPhysical CoupledTransportation + 2 0.0118 97.6 325 1e+03 0.00925 235 340 DriftChamberPhysical eIoni + 3 0.0193 270 900 1e+03 0.0193 600 940 WorldPhysical CoupledTransportation + 4 0.0191 274 912 1e+03 0.00285 12.8 952 WorldPhysical eIoni + 5 0.0172 300 1e+03 1e+03 0.0148 91.6 1.04e+03 Crystal CoupledTransportation + 6 0.0172 300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0969 557 928 0.0087 0 0 0 WorldPhysical initStep - 1 -0.507 556 928 0.00427 0.00443 1.63 1.63 WorldPhysical eIoni - 2 -0.738 556 928 0 0.00427 0.58 2.21 WorldPhysical eIoni + 0 0.0191 274 912 0.00141 0 0 0 WorldPhysical initStep + 1 0.031 274 912 0 0.00141 0.0943 0.0943 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0219 306 511 0.0165 0 0 0 DriftChamberPhysical initStep - 1 -2.44 308 510 0.0144 0.000655 3.08 3.08 DriftChamberPhysical eIoni - 2 -8.28 313 510 0.012 0.00234 7.96 11 DriftChamberPhysical eIoni - 3 -13.9 314 509 0.0114 0.000622 6.16 17.2 DriftChamberPhysical eIoni - 4 -19.2 315 510 0.00881 0.00261 5.73 22.9 DriftChamberPhysical eIoni - 5 -23 315 511 0.00761 0.0012 4.11 27 DriftChamberPhysical eIoni - 6 -26.2 314 511 0.00582 0.00179 3.49 30.5 DriftChamberPhysical eIoni - 7 -28.2 313 512 0.00487 0.000956 2.67 33.2 DriftChamberPhysical eIoni - 8 -29.3 313 512 0.00246 0.000348 1.39 34.6 DriftChamberPhysical eIoni - 9 -28.6 312 512 0 0.00246 1.24 35.8 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -29.3 313 512 0.00206 0 0 0 DriftChamberPhysical initStep - 1 -29.2 313 512 0 0.00206 0.955 0.955 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -2.44 308 510 0.00141 0 0 0 DriftChamberPhysical initStep - 1 -2.51 308 510 0 0.00141 0.514 0.514 DriftChamberPhysical eIoni + 0 0.0118 97.6 325 0.00183 0 0 0 DriftChamberPhysical initStep + 1 0.554 97.8 325 0 0.00183 0.79 0.79 DriftChamberPhysical eIoni 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. ********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 18.6 61.9 1e+03 0.00877 64.7 64.7 WorldPhysical hIoni - 2 -0.00197 22.8 76 1e+03 0.00124 14.7 79.3 WorldPhysical hIoni - 3 -0.00412 30 100 1e+03 0.0037 25.1 104 DriftChamberPhysical CoupledTransportation - 4 -0.146 270 900 1e+03 0.0203 835 940 WorldPhysical CoupledTransportation - 5 -0.149 273 912 1e+03 0.00156 12.4 952 WorldPhysical hIoni - 6 -0.156 285 950 1e+03 0.00666 39.8 992 WorldPhysical fastSimProcess_parallelGeom - 7 -0.156 285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.149 273 912 0.00136 0 0 0 WorldPhysical initStep - 1 -0.182 273 912 0 0.00136 0.0899 0.0899 WorldPhysical eIoni + 1 0 -30 100 1e+03 0.0217 104 104 DriftChamberPhysical CoupledTransportation + 2 0.128 -143 476 1e+03 0.0138 393 497 DriftChamberPhysical eIoni + 3 0.211 -258 859 1e+03 0.0124 400 897 DriftChamberPhysical eIoni + 4 0.22 -270 900 1e+03 0.00121 42.5 940 WorldPhysical CoupledTransportation + 5 0.271 -300 1e+03 1e+03 0.0181 104 1.04e+03 Crystal CoupledTransportation + 6 0.271 -300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.00197 22.8 76 0.0015 0 0 0 WorldPhysical initStep - 1 -0.0319 22.8 76 0 0.0015 0.104 0.104 WorldPhysical eIoni + 0 0.211 -258 859 0.00117 0 0 0 DriftChamberPhysical initStep + 1 0.125 -257 859 0 0.00117 0.381 0.381 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 18.6 61.9 0.00164 0 0 0 WorldPhysical initStep - 1 0.0472 18.6 61.9 0 0.00164 0.119 0.119 WorldPhysical eIoni + 0 0.128 -143 476 0.00193 0 0 0 DriftChamberPhysical initStep + 1 0.739 -143 476 0 0.00193 0.862 0.862 DriftChamberPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 28.7 95.6 1e+03 0.0127 99.8 99.8 WorldPhysical hIoni - 2 0.000464 30 100 1e+03 0.0018 4.62 104 DriftChamberPhysical CoupledTransportation - 3 0.0402 166 553 1e+03 0.0132 473 577 DriftChamberPhysical Decay + 1 0 -30 100 1e+03 0.0207 104 104 DriftChamberPhysical CoupledTransportation + 2 -0.273 -270 900 1e+03 0.0237 835 940 WorldPhysical CoupledTransportation + 3 -0.322 -300 1e+03 1e+03 0.0253 104 1.04e+03 Crystal CoupledTransportation + 4 -0.322 -300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* -* G4Track Information: Particle = mu-, Track ID = 4, Parent ID = 1 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0402 166 553 751 0 0 0 DriftChamberPhysical initStep - 1 4.06 229 789 751 0.00603 244 244 DriftChamberPhysical muIoni - 2 5.96 258 900 751 0.00219 115 359 WorldPhysical CoupledTransportation - 3 7.58 283 994 751 0.0132 97.4 457 WorldPhysical muIoni - 4 7.68 285 1e+03 751 0.000362 6.1 463 Crystal CoupledTransportation - 5 8.15 292 1.03e+03 727 14.1 28.7 492 Crystal muIoni - 6 8.13 295 1.04e+03 722 3.59 8.44 500 Crystal muIoni - 7 8.03 297 1.05e+03 715 6.17 10.3 510 Crystal muIoni - 8 8.06 299 1.05e+03 710 3.3 6.49 517 Crystal muIoni - 9 8.14 300 1.06e+03 708 2.23 4.47 521 Crystal CoupledTransportation - 10 8.25 305 1.07e+03 691 9 18.3 540 Crystal muIoni - 11 8.24 306 1.08e+03 687 3.36 5.65 545 Crystal muIoni - 12 9.3 328 1.16e+03 643 42.1 82.6 628 Crystal muIoni - 13 9.41 329 1.16e+03 638 2.5 5.54 633 Crystal muIoni - 14 10.8 339 1.2e+03 619 18 37.2 671 Crystal muIoni - 15 10.9 341 1.21e+03 615 3.36 7.13 678 Crystal muIoni - 16 11 344 1.22e+03 607 6.13 12.5 690 Crystal muIoni - 17 11.1 344 1.22e+03 604 0.497 1.01 691 Crystal muIoni - 18 11.4 349 1.24e+03 594 9.21 19 710 Crystal muIoni - 19 11.6 350 1.24e+03 591 3.03 3.25 713 Crystal CoupledTransportation - 20 11.6 350 1.24e+03 587 0.257 0.403 714 Crystal muIoni - 21 11.8 351 1.25e+03 584 1.99 4.58 718 Crystal muIoni - 22 14 363 1.29e+03 562 21.5 42.3 761 Crystal muIoni - 23 14.7 366 1.3e+03 555 5.66 12 773 Crystal muIoni - 24 22.1 391 1.4e+03 506 49.4 99.8 872 Crystal CoulombScat - 25 22.6 391 1.4e+03 503 2.5 5.06 878 WorldPhysical CoupledTransportation - 26 31.7 410 1.5e+03 503 0.0158 102 980 HadCaloPhysical CoupledTransportation - 27 36.2 420 1.55e+03 503 0.0127 51.1 1.03e+03 Tower CoupledTransportation - 28 43.4 435 1.63e+03 410 93 81.1 1.11e+03 Tower muIoni - 29 49.1 447 1.69e+03 340 70.3 64.9 1.18e+03 Tower muIoni - 30 50 448 1.7e+03 333 7.3 6.59 1.18e+03 Tower CoupledTransportation - 31 60.3 448 1.75e+03 281 51.6 51.4 1.23e+03 Tower muIoni - 32 67.2 446 1.79e+03 239 41.9 42.3 1.28e+03 Tower muIoni - 33 74.9 443 1.82e+03 188 51.4 35 1.31e+03 Tower muIoni - 34 82.1 442 1.85e+03 158 29.5 26 1.34e+03 Tower muIoni - 35 88.4 441 1.87e+03 133 25.7 20.9 1.36e+03 Tower muIoni - 36 94.1 440 1.89e+03 113 19.1 16.6 1.38e+03 Tower muIoni - 37 99.8 439 1.9e+03 98.4 15.1 13.5 1.39e+03 Tower muIoni - 38 105 439 1.91e+03 80 18.4 11.1 1.4e+03 Tower muIoni - 39 110 439 1.91e+03 69.5 10.5 8.25 1.41e+03 Tower muIoni - 40 113 439 1.92e+03 59.7 9.76 6.73 1.42e+03 Tower muIoni - 41 116 440 1.92e+03 51.4 8.29 5.38 1.42e+03 Tower muIoni - 42 118 439 1.93e+03 42.6 8.82 4.31 1.42e+03 Tower muIoni - 43 120 438 1.93e+03 37.2 5.44 3.24 1.43e+03 Tower muIoni - 44 122 437 1.93e+03 32.2 4.95 2.63 1.43e+03 Tower muIoni - 45 123 436 1.93e+03 27.5 4.74 2.12 1.43e+03 Tower muIoni - 46 124 435 1.93e+03 23.6 3.85 1.66 1.43e+03 Tower muIoni - 47 125 435 1.94e+03 20 3.59 1.33 1.44e+03 Tower muIoni - 48 125 434 1.94e+03 17.4 2.61 1.04 1.44e+03 Tower muIoni - 49 126 434 1.94e+03 14.7 2.72 0.855 1.44e+03 Tower muIoni - 50 126 434 1.94e+03 12.5 2.2 0.678 1.44e+03 Tower muIoni - 51 126 434 1.94e+03 10.6 1.87 0.549 1.44e+03 Tower muIoni - 52 126 434 1.94e+03 8.52 2.11 0.451 1.44e+03 Tower muIoni - 53 126 433 1.94e+03 6.52 2 0.353 1.44e+03 Tower muIoni - 54 126 433 1.94e+03 4.78 1.74 0.273 1.44e+03 Tower muIoni - 55 126 433 1.94e+03 2.73 2.05 0.211 1.44e+03 Tower muIoni - 56 126 433 1.94e+03 0.584 2.15 0.13 1.44e+03 Tower muIoni - 57 126 433 1.94e+03 0.0253 0.558 0.0106 1.44e+03 Tower muIoni - 58 126 433 1.94e+03 0 0.0253 0.000351 1.44e+03 Tower muIoni - 59 126 433 1.94e+03 0 0 0 1.44e+03 Tower muMinusCaptureAtRest + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 -30 100 1e+03 0.0181 104 104 DriftChamberPhysical CoupledTransportation + 2 0.00055 -129 431 1e+03 0.0086 346 450 DriftChamberPhysical eIoni + 3 0.00701 -214 715 1e+03 0.0107 296 746 DriftChamberPhysical eIoni + 4 0.00638 -270 900 1e+03 0.00593 193 940 WorldPhysical CoupledTransportation + 5 0.0145 -300 1e+03 1e+03 0.0148 104 1.04e+03 Crystal CoupledTransportation + 6 0.0145 -300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* -* G4Track Information: Particle = Mn56, Track ID = 32, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.0929 0 0 0 Tower initStep - 1 126 433 1.94e+03 0 0.0929 9.8e-05 9.8e-05 Tower ionIoni + 0 0.00701 -214 715 0.00266 0 0 0 DriftChamberPhysical initStep + 1 0.986 -215 715 0 0.00266 1.36 1.36 DriftChamberPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 31, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.127 0 0 0 Tower initStep - 1 127 433 1.94e+03 0.0896 0 0.588 0.588 Tower compt - 2 126 433 1.94e+03 0 0.00708 0.606 1.19 Tower phot + 0 0.00055 -129 431 0.00129 0 0 0 DriftChamberPhysical initStep + 1 -0.258 -129 431 0 0.00129 0.447 0.447 DriftChamberPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 34, Parent ID = 31 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.0825 0 0 0 Tower initStep - 1 126 433 1.94e+03 0 0.0825 0.0197 0.0197 Tower eIoni + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0.00192 -8.34 27.8 1e+03 0.00811 29 29 WorldPhysical eIoni + 2 0.00364 -30 100 1e+03 0.014 75.4 104 DriftChamberPhysical CoupledTransportation + 3 -0.145 -268 892 1e+03 0.0193 827 932 DriftChamberPhysical eIoni + 4 -0.147 -270 900 1e+03 0.000189 7.85 940 WorldPhysical CoupledTransportation + 5 -0.169 -300 1e+03 1e+03 0.0198 104 1.04e+03 Crystal CoupledTransportation + 6 -0.169 -300 1e+03 0 1e+03 0 1.04e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 33, Parent ID = 31 +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 127 433 1.94e+03 0.037 0 0 0 Tower initStep - 1 127 433 1.94e+03 0 0.037 0.00505 0.00505 Tower eIoni + 0 -0.145 -268 892 0.00156 0 0 0 DriftChamberPhysical initStep + 1 0.195 -268 892 0 0.00156 0.605 0.605 DriftChamberPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 30, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 1.59 0 0 0 Tower initStep - 1 118 450 1.95e+03 1.59 0 23.7 23.7 Tower CoupledTransportation - 2 116 455 1.96e+03 0.888 0 7.41 31.1 Tower compt - 3 115 460 1.96e+03 0.402 0 4.88 36 Tower compt - 4 150 481 1.96e+03 0.402 0 41.1 77 Tower CoupledTransportation - 5 171 493 1.96e+03 0.228 0 24 101 Tower compt - 6 171 494 1.96e+03 0 0.00708 3.19 104 Tower phot + 0 0.00192 -8.34 27.8 0.00148 0 0 0 WorldPhysical initStep + 1 0.0268 -8.31 27.8 0 0.00148 0.102 0.102 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 38, Parent ID = 30 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 171 494 1.96e+03 0.221 0 0 0 Tower initStep - 1 171 494 1.96e+03 0 0.221 0.0977 0.0977 Tower eIoni + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 -0.00018 -4.81 16 1e+03 0.0035 16.8 16.8 WorldPhysical eIoni + 2 -0.00147 -25.3 84.5 958 0.0159 71.4 88.2 WorldPhysical eBrem + 3 -0.00139 -25.9 86.3 958 0.000688 1.96 90.2 WorldPhysical eIoni + 4 -0.000818 -30 100 958 0.00382 14.3 104 DriftChamberPhysical CoupledTransportation + 5 0.0798 -270 900 958 0.0253 835 940 WorldPhysical CoupledTransportation + 6 0.0807 -271 905 958 0.00208 4.96 945 WorldPhysical eIoni + 7 0.0856 -280 935 958 0.0118 31.5 976 WorldPhysical eIoni + 8 0.0902 -292 972 958 0.00727 39 1.02e+03 WorldPhysical eIoni + 9 0.0933 -300 1e+03 958 0.00558 28.9 1.04e+03 Crystal CoupledTransportation + 10 0.0933 -300 1e+03 0 958 0 1.04e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 37, Parent ID = 30 +* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 171 493 1.96e+03 0.174 0 0 0 Tower initStep - 1 171 493 1.96e+03 0 0.174 0.0668 0.0668 Tower eIoni + 0 0.0902 -292 972 0.00417 0 0 0 WorldPhysical initStep + 1 0.114 -292 972 0 0.00417 0.555 0.555 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 36, Parent ID = 30 +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 115 460 1.96e+03 0.486 0 0 0 Tower initStep - 1 115 460 1.96e+03 0 0.486 0.31 0.31 Tower eIoni + 0 0.0856 -280 935 0.00868 0 0 0 WorldPhysical initStep + 1 0.612 -280 935 0.00508 0.0036 1.62 1.62 WorldPhysical eIoni + 2 0.683 -280 935 0 0.00508 0.786 2.41 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 35, Parent ID = 30 +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 116 455 1.96e+03 0.699 0 0 0 Tower initStep - 1 116 455 1.96e+03 0 0.699 0.506 0.506 Tower eIoni + 0 0.0807 -271 905 0.00483 0 0 0 WorldPhysical initStep + 1 0.371 -272 905 0 0.00483 0.72 0.72 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = nu_mu, Track ID = 29, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 99.6 0 0 0 Tower initStep - 1 150 396 1.93e+03 99.6 0 44.5 44.5 Tower CoupledTransportation - 2 179 350 1.93e+03 99.6 0 54.6 99.1 Tower CoupledTransportation - 3 242 250 1.91e+03 99.6 0 119 218 Tower CoupledTransportation - 4 250 238 1.91e+03 99.6 0 14.5 233 Tower CoupledTransportation - 5 306 150 1.9e+03 99.6 0 105 337 Tower CoupledTransportation - 6 350 79.9 1.89e+03 99.6 0 83.6 421 Tower CoupledTransportation - 7 369 50 1.89e+03 99.6 0 35.6 457 Tower CoupledTransportation - 8 432 -50 1.87e+03 99.6 0 119 576 Tower CoupledTransportation - 9 450 -78.1 1.87e+03 99.6 0 33.5 609 Tower CoupledTransportation - 10 496 -150 1.86e+03 99.6 0 85.7 695 Tower CoupledTransportation - 11 550 -236 1.85e+03 99.6 0 103 797 Tower CoupledTransportation - 12 559 -250 1.84e+03 99.6 0 16.6 814 Tower CoupledTransportation - 13 622 -350 1.83e+03 99.6 0 119 933 Tower CoupledTransportation - 14 650 -394 1.82e+03 99.6 0 52.5 986 Tower CoupledTransportation - 15 685 -450 1.82e+03 99.6 0 66.6 1.05e+03 Tower CoupledTransportation - 16 749 -550 1.8e+03 99.6 0 119 1.17e+03 Tower CoupledTransportation - 17 750 -552 1.8e+03 99.6 0 2.44 1.17e+03 Tower CoupledTransportation - 18 812 -650 1.79e+03 99.6 0 117 1.29e+03 Tower CoupledTransportation - 19 850 -710 1.78e+03 99.6 0 71.5 1.36e+03 Tower CoupledTransportation - 20 875 -750 1.77e+03 99.6 0 47.6 1.41e+03 Tower CoupledTransportation - 21 939 -850 1.76e+03 99.6 0 119 1.53e+03 Tower CoupledTransportation - 22 950 -868 1.76e+03 99.6 0 21.4 1.55e+03 Tower CoupledTransportation - 23 1e+03 -950 1.75e+03 99.6 0 97.7 1.65e+03 Tower CoupledTransportation - 24 1.05e+03 -1.03e+03 1.74e+03 99.6 0 90.5 1.74e+03 Tower CoupledTransportation - 25 1.07e+03 -1.05e+03 1.73e+03 99.6 0 28.6 1.77e+03 Tower CoupledTransportation - 26 1.13e+03 -1.15e+03 1.72e+03 99.6 0 119 1.89e+03 HadCaloPhysical CoupledTransportation - 27 1.19e+03 -1.25e+03 1.71e+03 99.6 0 119 2.01e+03 WorldPhysical CoupledTransportation - 28 2.93e+03 -4e+03 1.32e+03 99.6 0 3.28e+03 5.28e+03 OutOfWorld CoupledTransportation + 0 -0.00139 -25.9 86.3 0.00168 0 0 0 WorldPhysical initStep + 1 0.00186 -26 86.3 0 0.00168 0.123 0.123 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 28, Parent ID = 4 +* G4Track Information: Particle = gamma, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 1.63 0 0 0 Tower initStep - 1 140 439 1.94e+03 0.478 0 14.6 14.6 Tower compt - 2 140 440 1.94e+03 0.205 0 2.75 17.4 Tower compt - 3 150 436 1.95e+03 0.205 0 12.4 29.8 Tower CoupledTransportation - 4 157 434 1.95e+03 0 0.00708 9.05 38.9 Tower phot + 0 -0.00147 -25.3 84.5 42.1 0 0 0 WorldPhysical initStep + 1 -0.00477 -30 100 42.1 0 16.2 16.2 DriftChamberPhysical CoupledTransportation + 2 -0.174 -270 900 42.1 0 835 852 WorldPhysical CoupledTransportation + 3 -0.196 -301 1e+03 42.1 0 104 956 Crystal CoupledTransportation + 4 -0.196 -301 1e+03 0 0 0.501 957 Crystal conv ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 41, Parent ID = 28 +* G4Track Information: Particle = e+, Track ID = 9, Parent ID = 3 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 157 434 1.95e+03 0.198 0 0 0 Tower initStep - 1 157 434 1.95e+03 0 0.198 0.0821 0.0821 Tower eIoni + 0 -0.196 -301 1e+03 14.6 0 0 0 Crystal initStep + 1 -0.0993 -302 1e+03 11.9 2.56 4.95 4.95 Crystal eBrem + 2 -1.36e-15 -302 1.01e+03 11.3 0.56 1.01 5.96 Crystal CoupledTransportation + 3 0.278 -301 1.01e+03 9.61 1.71 3.65 9.61 Crystal msc + 4 0.567 -302 1.01e+03 8.6 0.928 1.97 11.6 Crystal eBrem + 5 0.683 -302 1.01e+03 7.71 0.716 0.791 12.4 Crystal eBrem + 6 0.804 -302 1.01e+03 7.07 0.304 0.73 13.1 Crystal eBrem + 7 0.819 -302 1.01e+03 6.41 0.0173 0.0677 13.2 Crystal eBrem + 8 2.82 -304 1.01e+03 4.6 1.81 4.01 17.2 Crystal msc + 9 3.39 -304 1.01e+03 3.11 0.51 0.955 18.1 Crystal eBrem + 10 3.4 -306 1.01e+03 1.74 1.38 2.67 20.8 Crystal eIoni + 11 3.86 -307 1.01e+03 0.882 0.856 1.99 22.8 Crystal eIoni + 12 3.84 -307 1.01e+03 0.186 0.695 1.33 24.1 Crystal eIoni + 13 3.85 -307 1.01e+03 0 0.186 0.156 24.3 Crystal eIoni + 14 3.85 -307 1.01e+03 0 0 0 24.3 Crystal annihil ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 40, Parent ID = 28 +* G4Track Information: Particle = gamma, Track ID = 17, Parent ID = 9 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 140 440 1.94e+03 0.273 0 0 0 Tower initStep - 1 140 440 1.94e+03 0 0.273 0.135 0.135 Tower eIoni + 0 3.85 -307 1.01e+03 0.511 0 0 0 Crystal initStep + 1 2.47 -307 1.02e+03 0 0.036 3.18 3.18 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 39, Parent ID = 28 +* G4Track Information: Particle = e-, Track ID = 18, Parent ID = 17 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 140 439 1.94e+03 1.15 0 0 0 Tower initStep - 1 140 439 1.94e+03 0 1.15 0.942 0.942 Tower eIoni + 0 2.47 -307 1.02e+03 0.475 0 0 0 Crystal initStep + 1 2.41 -307 1.02e+03 0 0.475 0.644 0.644 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 27, Parent ID = 4 +* G4Track Information: Particle = gamma, Track ID = 16, Parent ID = 9 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.0232 0 0 0 Tower initStep - 1 126 433 1.94e+03 0 0.00708 0.213 0.213 Tower phot + 0 3.85 -307 1.01e+03 0.511 0 0 0 Crystal initStep + 1 8.47 -305 1e+03 0.405 0 10.6 10.6 Crystal compt + 2 8.29 -305 1e+03 0.22 0 0.999 11.6 Crystal compt + 3 9.55 -304 1e+03 0.22 0 1.77 13.4 Crystal Rayl + 4 8.62 -300 1e+03 0.22 0 4.35 17.7 Crystal CoupledTransportation + 5 6.22 -290 1.01e+03 0.139 0 11.2 28.9 Crystal compt + 6 6.28 -290 1.01e+03 0 0.0332 0.0741 29 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 42, Parent ID = 27 +* G4Track Information: Particle = e-, Track ID = 22, Parent ID = 16 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.0161 0 0 0 Tower initStep - 1 126 433 1.94e+03 0 0.0161 0.00123 0.00123 Tower eIoni + 0 6.28 -290 1.01e+03 0.106 0 0 0 Crystal initStep + 1 6.28 -290 1.01e+03 0 0.106 0.0664 0.0664 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 26, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 21, Parent ID = 16 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.014 0 0 0 Tower initStep - 1 126 433 1.94e+03 0 0.00708 0.00281 0.00281 Tower phot + 0 6.22 -290 1.01e+03 0.0808 0 0 0 Crystal initStep + 1 6.22 -290 1.01e+03 0 0.0808 0.0426 0.0426 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 43, Parent ID = 26 +* G4Track Information: Particle = e-, Track ID = 20, Parent ID = 16 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.0069 0 0 0 Tower initStep - 1 126 433 1.94e+03 0 0.0069 0.000304 0.000304 Tower eIoni + 0 8.29 -305 1e+03 0.185 0 0 0 Crystal initStep + 1 8.28 -305 1e+03 0 0.185 0.162 0.162 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 25, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 19, Parent ID = 16 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.029 0 0 0 Tower initStep - 1 126 433 1.94e+03 0 0.00708 0.0917 0.0917 Tower phot + 0 8.47 -305 1e+03 0.106 0 0 0 Crystal initStep + 1 8.48 -305 1e+03 0 0.106 0.0665 0.0665 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 44, Parent ID = 25 +* G4Track Information: Particle = gamma, Track ID = 15, Parent ID = 9 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.022 0 0 0 Tower initStep - 1 126 433 1.94e+03 0 0.022 0.00208 0.00208 Tower eIoni + 0 3.39 -304 1.01e+03 0.975 0 0 0 Crystal initStep + 1 50 -329 1.01e+03 0.975 0 52.8 52.8 Crystal CoupledTransportation + 2 91.1 -350 1e+03 0.975 0 46.6 99.3 Crystal CoupledTransportation + 3 94.7 -352 1e+03 0.677 0 4.1 103 Crystal compt + 4 100 -352 1e+03 0.677 0 6.7 110 Crystal CoupledTransportation + 5 100 -352 1e+03 0.677 0 0.27 110 WorldPhysical CoupledTransportation + 6 227 -358 900 0.677 0 162 272 DriftChamberPhysical CoupledTransportation + 7 1.24e+03 -409 100 0.677 0 1.29e+03 1.57e+03 WorldPhysical CoupledTransportation + 8 4e+03 -545 -2.07e+03 0.677 0 3.51e+03 5.08e+03 OutOfWorld CoupledTransportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 24, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 23, Parent ID = 15 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 126 433 1.94e+03 0.00968 0 0 0 Tower initStep - 1 126 433 1.94e+03 0 0.00968 0.000527 0.000527 Tower eIoni + 0 94.7 -352 1e+03 0.298 0 0 0 Crystal initStep + 1 94.8 -352 1e+03 0 0.298 0.333 0.333 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 23, Parent ID = 4 +* G4Track Information: Particle = gamma, Track ID = 14, Parent ID = 9 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 14.7 366 1.3e+03 0.706 0 0 0 Crystal initStep - 1 14.7 366 1.3e+03 0.158 0.494 0.905 0.905 Crystal eBrem - 2 14.7 366 1.3e+03 0 0.158 0.126 1.03 Crystal eIoni + 0 0.819 -302 1.01e+03 0.648 0 0 0 Crystal initStep + 1 3.89 -309 1.02e+03 0.238 0 12.9 12.9 Crystal compt + 2 4.82 -306 1.02e+03 0 0.036 3.45 16.4 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 45, Parent ID = 23 +* G4Track Information: Particle = e-, Track ID = 25, Parent ID = 14 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 14.7 366 1.3e+03 0.0542 0 0 0 Crystal initStep - 1 14.7 366 1.3e+03 0 0.036 0.182 0.182 Crystal phot + 0 4.82 -306 1.02e+03 0.202 0 0 0 Crystal initStep + 1 4.83 -306 1.02e+03 0 0.202 0.185 0.185 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 46, Parent ID = 45 +* G4Track Information: Particle = e-, Track ID = 24, Parent ID = 14 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 14.7 366 1.3e+03 0.0183 0 0 0 Crystal initStep - 1 14.7 366 1.3e+03 0 0.0183 0.00364 0.00364 Crystal eIoni + 0 3.89 -309 1.02e+03 0.41 0 0 0 Crystal initStep + 1 3.9 -309 1.02e+03 0.22 0.113 0.275 0.275 Crystal eBrem + 2 3.9 -309 1.02e+03 0 0.22 0.211 0.486 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 22, Parent ID = 4 +* G4Track Information: Particle = gamma, Track ID = 26, Parent ID = 24 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 14 363 1.29e+03 0.77 0 0 0 Crystal initStep - 1 14.1 363 1.29e+03 0.151 0.619 1.18 1.18 Crystal eIoni - 2 14.1 363 1.29e+03 0 0.151 0.117 1.3 Crystal eIoni + 0 3.9 -309 1.02e+03 0.0777 0 0 0 Crystal initStep + 1 3.73 -309 1.02e+03 0 0.0332 1.12 1.12 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 21, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 27, Parent ID = 26 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11.8 351 1.25e+03 1.42 0 0 0 Crystal initStep - 1 11.6 351 1.25e+03 1.16 0.136 0.306 0.306 Crystal eBrem - 2 11.4 351 1.25e+03 0.807 0.25 0.453 0.759 Crystal eBrem - 3 11.4 351 1.25e+03 0.186 0.62 1.23 1.99 Crystal eIoni - 4 11.4 351 1.25e+03 0 0.186 0.163 2.15 Crystal eIoni + 0 3.73 -309 1.02e+03 0.0445 0 0 0 Crystal initStep + 1 3.73 -309 1.02e+03 0 0.0445 0.0158 0.0158 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 48, Parent ID = 21 +* G4Track Information: Particle = gamma, Track ID = 13, Parent ID = 9 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11.4 351 1.25e+03 0.104 0 0 0 Crystal initStep - 1 11 350 1.25e+03 0 0.00568 1.57 1.57 Crystal phot + 0 0.804 -302 1.01e+03 0.332 0 0 0 Crystal initStep + 1 4.3 -313 1.03e+03 0.149 0 20.7 20.7 Crystal compt + 2 4.77 -308 1.03e+03 0 0.036 6.13 26.9 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 49, Parent ID = 48 +* G4Track Information: Particle = e-, Track ID = 29, Parent ID = 13 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11 350 1.25e+03 0.0982 0 0 0 Crystal initStep - 1 11 350 1.25e+03 0 0.0982 0.0586 0.0586 Crystal eIoni + 0 4.77 -308 1.03e+03 0.113 0 0 0 Crystal initStep + 1 4.77 -308 1.03e+03 0 0.113 0.0735 0.0735 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 47, Parent ID = 21 +* G4Track Information: Particle = e-, Track ID = 28, Parent ID = 13 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11.6 351 1.25e+03 0.119 0 0 0 Crystal initStep - 1 11.4 351 1.25e+03 0 0.000991 0.299 0.299 Crystal phot + 0 4.3 -313 1.03e+03 0.183 0 0 0 Crystal initStep + 1 4.3 -313 1.03e+03 0 0.183 0.159 0.159 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 50, Parent ID = 47 +* G4Track Information: Particle = gamma, Track ID = 12, Parent ID = 9 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11.4 351 1.25e+03 0.118 0 0 0 Crystal initStep - 1 11.4 351 1.25e+03 0 0.118 0.0795 0.0795 Crystal eIoni + 0 0.683 -302 1.01e+03 0.175 0 0 0 Crystal initStep + 1 5.62 -304 1.02e+03 0 0.036 10.3 10.3 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 20, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 30, Parent ID = 12 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11.6 350 1.24e+03 3.15 0 0 0 Crystal initStep - 1 11.5 350 1.24e+03 3.01 0.134 0.257 0.257 Crystal msc - 2 11.3 350 1.24e+03 2.92 0.094 0.244 0.501 Crystal msc - 3 11.2 350 1.24e+03 2.77 0.145 0.298 0.799 Crystal msc - 4 11.2 350 1.24e+03 2.56 0.214 0.252 1.05 Crystal msc - 5 11.1 350 1.24e+03 2.45 0.108 0.231 1.28 Crystal msc - 6 11 350 1.24e+03 1.48 0.0834 0.197 1.48 Crystal eIoni - 7 11 350 1.24e+03 1.39 0.089 0.258 1.74 Crystal msc - 8 11.1 350 1.24e+03 1.31 0.0893 0.21 1.95 Crystal msc - 9 11.1 350 1.24e+03 1.23 0.0708 0.193 2.14 Crystal msc - 10 11 350 1.24e+03 1.13 0.104 0.136 2.27 Crystal CoupledTransportation - 11 11 350 1.24e+03 1.1 0.0315 0.0725 2.35 Crystal msc - 12 11 350 1.24e+03 1.08 0.0237 0.0827 2.43 Crystal msc - 13 11 350 1.24e+03 1.04 0.0336 0.095 2.52 Crystal msc - 14 11.1 350 1.24e+03 1.02 0.0255 0.0678 2.59 Crystal msc - 15 11.1 350 1.24e+03 0.991 0.0248 0.0716 2.66 Crystal msc - 16 11.1 350 1.24e+03 0.939 0.0525 0.09 2.75 Crystal msc - 17 11 350 1.24e+03 0.89 0.0488 0.111 2.86 Crystal msc - 18 11 350 1.24e+03 0.82 0.0702 0.0702 2.93 Crystal msc - 19 11 350 1.24e+03 0.784 0.0363 0.0846 3.02 Crystal msc - 20 11 350 1.24e+03 0.739 0.045 0.073 3.09 Crystal msc - 21 10.9 350 1.24e+03 0.704 0.0344 0.0687 3.16 Crystal msc - 22 10.9 350 1.24e+03 0.694 0.00996 0.0222 3.18 Crystal CoupledTransportation - 23 10.9 350 1.24e+03 0.675 0.0192 0.0402 3.22 Crystal msc - 24 10.9 350 1.24e+03 0.594 0.0808 0.0468 3.27 Crystal msc - 25 10.8 350 1.24e+03 0.575 0.019 0.0387 3.31 Crystal msc - 26 10.8 350 1.24e+03 0.551 0.0244 0.0514 3.36 Crystal msc - 27 10.8 350 1.24e+03 0.51 0.0405 0.0514 3.41 Crystal msc - 28 10.7 350 1.24e+03 0.491 0.0194 0.0517 3.46 Crystal msc - 29 10.8 350 1.24e+03 0.474 0.0172 0.0481 3.51 Crystal msc - 30 10.8 350 1.24e+03 0.41 0.0633 0.0418 3.55 Crystal msc - 31 10.8 350 1.24e+03 0.389 0.0214 0.049 3.6 Crystal msc - 32 10.8 350 1.24e+03 0.351 0.0382 0.048 3.65 Crystal msc - 33 10.8 350 1.24e+03 0.314 0.0368 0.0672 3.72 Crystal msc - 34 10.7 350 1.24e+03 0.259 0.0545 0.122 3.84 Crystal msc - 35 10.7 350 1.24e+03 0 0.259 0.271 4.11 Crystal eIoni + 0 5.62 -304 1.02e+03 0.139 0 0 0 Crystal initStep + 1 5.62 -304 1.02e+03 0 0.139 0.103 0.103 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 51, Parent ID = 20 +* G4Track Information: Particle = gamma, Track ID = 11, Parent ID = 9 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11 350 1.24e+03 0.884 0 0 0 Crystal initStep - 1 11.1 350 1.24e+03 0.82 0.0645 0.193 0.193 Crystal msc - 2 11 350 1.24e+03 0.751 0.0691 0.129 0.323 Crystal msc - 3 10.9 350 1.24e+03 0.721 0.03 0.0889 0.411 Crystal msc - 4 10.9 350 1.24e+03 0.678 0.0431 0.0571 0.469 Crystal msc - 5 10.9 350 1.24e+03 0.656 0.0217 0.0544 0.523 Crystal msc - 6 10.8 350 1.24e+03 0.636 0.0194 0.0477 0.571 Crystal msc - 7 10.8 350 1.24e+03 0.551 0.0851 0.0799 0.651 Crystal msc - 8 10.9 350 1.24e+03 0.539 0.0127 0.0562 0.707 Crystal msc - 9 10.9 350 1.24e+03 0.512 0.0266 0.052 0.759 Crystal msc - 10 10.8 350 1.24e+03 0.484 0.0281 0.0528 0.811 Crystal msc - 11 10.8 350 1.24e+03 0.46 0.0235 0.0568 0.868 Crystal msc - 12 10.9 350 1.24e+03 0.427 0.0331 0.0529 0.921 Crystal msc - 13 10.9 350 1.24e+03 0.41 0.0177 0.0568 0.978 Crystal msc - 14 10.9 350 1.24e+03 0.35 0.0594 0.0551 1.03 Crystal msc - 15 10.9 350 1.24e+03 0.282 0.0682 0.0655 1.1 Crystal msc - 16 10.9 350 1.24e+03 0.269 0.0131 0.0205 1.12 Crystal CoupledTransportation - 17 10.9 350 1.24e+03 0.264 0.00545 0.0129 1.13 Crystal msc - 18 10.9 350 1.24e+03 0.254 0.00921 0.013 1.14 Crystal msc - 19 10.9 350 1.24e+03 0.247 0.00691 0.0112 1.16 Crystal msc - 20 10.9 350 1.24e+03 0.241 0.00688 0.0167 1.17 Crystal msc - 21 10.9 350 1.24e+03 0.23 0.0101 0.0262 1.2 Crystal msc - 22 10.9 350 1.24e+03 0.22 0.0109 0.0204 1.22 Crystal msc - 23 10.9 350 1.24e+03 0.205 0.0143 0.0188 1.24 Crystal msc - 24 10.9 350 1.24e+03 0.157 0.0483 0.0209 1.26 Crystal msc - 25 10.9 350 1.24e+03 0.12 0.0366 0.0256 1.28 Crystal msc - 26 10.9 350 1.24e+03 0.107 0.0135 0.0176 1.3 Crystal msc - 27 10.9 350 1.24e+03 0.0953 0.0116 0.0192 1.32 Crystal msc - 28 10.9 350 1.24e+03 0.0726 0.0227 0.0196 1.34 Crystal msc - 29 10.9 350 1.24e+03 0 0.0726 0.0357 1.38 Crystal eIoni + 0 0.567 -302 1.01e+03 0.0843 0 0 0 Crystal initStep + 1 0.579 -302 1.01e+03 0 0.036 0.0469 0.0469 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 19, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 31, Parent ID = 11 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11.4 349 1.24e+03 0.784 0 0 0 Crystal initStep - 1 11.5 349 1.24e+03 0.19 0.594 1.2 1.2 Crystal eIoni - 2 11.4 349 1.24e+03 0 0.19 0.169 1.37 Crystal eIoni + 0 0.579 -302 1.01e+03 0.0483 0 0 0 Crystal initStep + 1 0.579 -302 1.01e+03 0 0.0483 0.0182 0.0182 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 18, Parent ID = 4 +* G4Track Information: Particle = gamma, Track ID = 10, Parent ID = 9 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11.1 344 1.22e+03 3.01 0 0 0 Crystal initStep - 1 11.2 344 1.22e+03 2.29 0.0912 0.244 0.244 Crystal eBrem - 2 11 344 1.22e+03 1.32 0.977 2.26 2.5 Crystal eIoni - 3 11.3 345 1.22e+03 0.494 0.823 1.71 4.21 Crystal eIoni - 4 11.3 345 1.22e+03 0 0.494 0.679 4.89 Crystal eIoni + 0 -0.0993 -302 1e+03 0.158 0 0 0 Crystal initStep + 1 -1.36e-15 -302 1.01e+03 0.158 0 0.839 0.839 Crystal CoupledTransportation + 2 0.137 -301 1.01e+03 0.112 0 1.16 2 Crystal compt + 3 0.76 -300 1.01e+03 0 0.036 1.64 3.64 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 52, Parent ID = 18 +* G4Track Information: Particle = e-, Track ID = 33, Parent ID = 10 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11.2 344 1.22e+03 0.621 0 0 0 Crystal initStep - 1 9.82 350 1.23e+03 0.621 0 13.1 13.1 Crystal CoupledTransportation - 2 7.73 359 1.25e+03 0.206 0 20.4 33.4 Crystal compt - 3 10.8 358 1.25e+03 0 0.036 3.85 37.3 Crystal phot + 0 0.76 -300 1.01e+03 0.0757 0 0 0 Crystal initStep + 1 0.761 -300 1.01e+03 0 0.0757 0.0382 0.0382 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 54, Parent ID = 52 +* G4Track Information: Particle = e-, Track ID = 32, Parent ID = 10 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 10.8 358 1.25e+03 0.17 0 0 0 Crystal initStep - 1 10.9 358 1.25e+03 0 0.17 0.141 0.141 Crystal eIoni + 0 0.137 -301 1.01e+03 0.0464 0 0 0 Crystal initStep + 1 0.137 -301 1.01e+03 0 0.0464 0.017 0.017 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 53, Parent ID = 52 +* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 3 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 7.73 359 1.25e+03 0.415 0 0 0 Crystal initStep - 1 7.71 359 1.25e+03 0 0.415 0.535 0.535 Crystal eIoni + 0 -0.196 -301 1e+03 26.5 0 0 0 Crystal initStep + 1 -0.0566 -301 1e+03 24.8 0.719 1.55 1.55 Crystal eBrem + 2 -0.0258 -301 1e+03 22.9 0.0368 0.104 1.66 Crystal eBrem + 3 1.48e-15 -301 1e+03 22.9 0.041 0.0857 1.74 Crystal CoupledTransportation + 4 0.414 -302 1e+03 19 0.573 1.28 3.02 Crystal eBrem + 5 0.554 -302 1e+03 18.4 0.423 0.914 3.93 Crystal eBrem + 6 1.05 -303 1.01e+03 11.7 1.77 3.16 7.1 Crystal eBrem + 7 1.74 -305 1.01e+03 9.72 1.97 4.4 11.5 Crystal eBrem + 8 1.83 -305 1.01e+03 9.28 0.278 0.439 11.9 Crystal eBrem + 9 3.65 -306 1.01e+03 7.5 1.73 3.4 15.3 Crystal eBrem + 10 4.04 -306 1.01e+03 7.11 0.336 0.763 16.1 Crystal eBrem + 11 3.57 -305 1.02e+03 5.08 2.03 4.27 20.4 Crystal eIoni + 12 1.92 -303 1.02e+03 3.44 1.64 3.28 23.6 Crystal eBrem + 13 1.9 -303 1.02e+03 2.73 0.666 0.73 24.4 Crystal eBrem + 14 1.62 -304 1.01e+03 1.55 1.18 2.47 26.8 Crystal eIoni + 15 1.62 -304 1.01e+03 0.595 0.955 1.86 28.7 Crystal eIoni + 16 1.55 -304 1.01e+03 0 0.595 0.869 29.6 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 17, Parent ID = 4 +* G4Track Information: Particle = gamma, Track ID = 42, Parent ID = 8 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 11 344 1.22e+03 1.4 0 0 0 Crystal initStep - 1 10.8 344 1.22e+03 0.201 1.2 1.77 1.77 Crystal eIoni - 2 10.8 344 1.22e+03 0 0.201 0.183 1.95 Crystal eIoni + 0 1.9 -303 1.02e+03 0.0487 0 0 0 Crystal initStep + 1 1.91 -303 1.02e+03 0 0.036 0.0394 0.0394 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 16, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 43, Parent ID = 42 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 10.9 341 1.21e+03 0.707 0 0 0 Crystal initStep - 1 11 341 1.21e+03 0.112 0.595 1.08 1.08 Crystal eIoni - 2 11 341 1.21e+03 0 0.112 0.0724 1.15 Crystal eIoni + 0 1.91 -303 1.02e+03 0.0127 0 0 0 Crystal initStep + 1 1.91 -303 1.02e+03 0 0.0127 0.00204 0.00204 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 15, Parent ID = 4 +* G4Track Information: Particle = gamma, Track ID = 41, Parent ID = 8 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 10.8 339 1.2e+03 0.923 0 0 0 Crystal initStep - 1 10.9 339 1.2e+03 0.134 0.789 1.37 1.37 Crystal eIoni - 2 10.9 339 1.2e+03 0 0.134 0.0969 1.47 Crystal eIoni + 0 4.04 -306 1.01e+03 0.0488 0 0 0 Crystal initStep + 1 4.06 -306 1.01e+03 0 0.036 0.0453 0.0453 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 14, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 44, Parent ID = 41 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 9.41 329 1.16e+03 3.26 0 0 0 Crystal initStep - 1 9.3 329 1.17e+03 2.04 1.22 2.7 2.7 Crystal eIoni - 2 9.3 329 1.17e+03 1.93 0.00133 0.00493 2.71 Crystal eBrem - 3 9.51 329 1.17e+03 1.28 0.349 0.827 3.53 Crystal eBrem - 4 9.46 329 1.17e+03 0.687 0.589 1.44 4.98 Crystal eBrem - 5 9.36 329 1.17e+03 0.0498 0.638 1.05 6.02 Crystal eIoni - 6 9.36 329 1.17e+03 0 0.0498 0.0191 6.04 Crystal eIoni + 0 4.06 -306 1.01e+03 0.0128 0 0 0 Crystal initStep + 1 4.06 -306 1.01e+03 0 0.0128 0.00205 0.00205 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 56, Parent ID = 14 +* G4Track Information: Particle = gamma, Track ID = 40, Parent ID = 8 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 9.51 329 1.17e+03 0.306 0 0 0 Crystal initStep - 1 8.4 323 1.16e+03 0 0.036 6.62 6.62 Crystal phot + 0 3.65 -306 1.01e+03 0.0534 0 0 0 Crystal initStep + 1 3.66 -306 1.01e+03 0 0.036 0.0189 0.0189 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 57, Parent ID = 56 +* G4Track Information: Particle = e-, Track ID = 45, Parent ID = 40 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.4 323 1.16e+03 0.27 0 0 0 Crystal initStep - 1 8.38 323 1.16e+03 0 0.27 0.288 0.288 Crystal eIoni + 0 3.66 -306 1.01e+03 0.0175 0 0 0 Crystal initStep + 1 3.66 -306 1.01e+03 0 0.0175 0.00339 0.00339 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 55, Parent ID = 14 +* G4Track Information: Particle = gamma, Track ID = 39, Parent ID = 8 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 9.3 329 1.17e+03 0.106 0 0 0 Crystal initStep - 1 10.5 330 1.17e+03 0 0.036 2.11 2.11 Crystal phot + 0 1.83 -305 1.01e+03 0.156 0 0 0 Crystal initStep + 1 2 -306 1.01e+03 0 0.0332 0.998 0.998 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 58, Parent ID = 55 +* G4Track Information: Particle = e-, Track ID = 46, Parent ID = 39 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 10.5 330 1.17e+03 0.07 0 0 0 Crystal initStep - 1 10.5 330 1.17e+03 0 0.07 0.0336 0.0336 Crystal eIoni + 0 2 -306 1.01e+03 0.123 0 0 0 Crystal initStep + 1 2 -306 1.01e+03 0 0.123 0.0845 0.0845 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 13, Parent ID = 4 +* G4Track Information: Particle = gamma, Track ID = 38, Parent ID = 8 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 9.3 328 1.16e+03 0.941 0 0 0 Crystal initStep - 1 9.27 328 1.16e+03 0.235 0.706 1.39 1.39 Crystal eIoni - 2 9.25 328 1.16e+03 0 0.235 0.233 1.63 Crystal eIoni + 0 1.05 -303 1.01e+03 4.98 0 0 0 Crystal initStep + 1 19.9 -318 1.03e+03 0 0 33.8 33.8 Crystal conv ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 12, Parent ID = 4 +* G4Track Information: Particle = e+, Track ID = 48, Parent ID = 38 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.24 306 1.08e+03 0.714 0 0 0 Crystal initStep - 1 8.17 306 1.08e+03 0.0281 0.686 1.09 1.09 Crystal eIoni - 2 8.17 306 1.08e+03 0 0.0281 0.00738 1.1 Crystal eIoni + 0 19.9 -318 1.03e+03 2.45 0 0 0 Crystal initStep + 1 20 -318 1.03e+03 1.22 1.23 2.37 2.37 Crystal eIoni + 2 20.3 -319 1.03e+03 0.468 0.75 1.65 4.02 Crystal eIoni + 3 20.3 -318 1.03e+03 0 0.468 0.622 4.64 Crystal eIoni + 4 20.3 -318 1.03e+03 0 0 0 4.64 Crystal annihil ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 11, Parent ID = 4 +* G4Track Information: Particle = gamma, Track ID = 50, Parent ID = 48 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.25 305 1.07e+03 8.25 0 0 0 Crystal initStep - 1 8.62 306 1.08e+03 6.55 1.7 2.89 2.89 Crystal msc - 2 8.69 306 1.08e+03 3.48 0.0926 0.187 3.08 Crystal eBrem - 3 8.96 306 1.08e+03 3.04 0.29 0.74 3.82 Crystal eBrem - 4 9.62 306 1.08e+03 1.86 1.18 2.61 6.42 Crystal eIoni - 5 9.76 306 1.08e+03 1.68 0.129 0.328 6.75 Crystal eBrem - 6 9.55 306 1.08e+03 0.798 0.884 1.94 8.69 Crystal eIoni - 7 9.47 306 1.08e+03 0.595 0.16 0.229 8.92 Crystal eBrem - 8 9.38 306 1.08e+03 0 0.595 0.87 9.79 Crystal eIoni + 0 20.3 -318 1.03e+03 0.511 0 0 0 Crystal initStep + 1 19.2 -325 1.05e+03 0.511 0 18.8 18.8 Crystal Rayl + 2 18.9 -328 1.07e+03 0.343 0 25.5 44.3 Crystal compt + 3 21.8 -300 1.1e+03 0.343 0 34.4 78.7 Crystal CoupledTransportation + 4 26.9 -250 1.13e+03 0.343 0 62.4 141 Crystal CoupledTransportation + 5 29.2 -228 1.15e+03 0 0.036 27.6 169 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 62, Parent ID = 11 +* G4Track Information: Particle = e-, Track ID = 52, Parent ID = 50 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 9.47 306 1.08e+03 0.0432 0 0 0 Crystal initStep - 1 9.44 306 1.08e+03 0 0.0332 0.0336 0.0336 Crystal phot + 0 29.2 -228 1.15e+03 0.307 0 0 0 Crystal initStep + 1 29.2 -228 1.15e+03 0 0.307 0.347 0.347 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 51, Parent ID = 50 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 18.9 -328 1.07e+03 0.168 0 0 0 Crystal initStep + 1 18.9 -328 1.07e+03 0 0.168 0.139 0.139 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 49, Parent ID = 48 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 20.3 -318 1.03e+03 0.511 0 0 0 Crystal initStep + 1 20.8 -315 1.02e+03 0 0.0332 9.16 9.16 Crystal phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 53, Parent ID = 49 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 20.8 -315 1.02e+03 0.478 0 0 0 Crystal initStep + 1 20.8 -315 1.02e+03 0 0.478 0.649 0.649 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 47, Parent ID = 38 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 19.9 -318 1.03e+03 1.51 0 0 0 Crystal initStep + 1 20.1 -318 1.03e+03 0.883 0.562 1.31 1.31 Crystal eBrem + 2 20.1 -319 1.03e+03 0.0723 0.811 1.33 2.64 Crystal eIoni + 3 20.1 -319 1.03e+03 0 0.0723 0.0354 2.67 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 54, Parent ID = 47 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 20.1 -318 1.03e+03 0.0637 0 0 0 Crystal initStep + 1 20.1 -319 1.03e+03 0.0637 0 0.178 0.178 Crystal Rayl + 2 20.2 -319 1.03e+03 0 0.036 0.129 0.307 Crystal phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 55, Parent ID = 54 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 20.2 -319 1.03e+03 0.0277 0 0 0 Crystal initStep + 1 20.2 -319 1.03e+03 0 0.0277 0.00723 0.00723 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 37, Parent ID = 8 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.554 -302 1e+03 0.0932 0 0 0 Crystal initStep + 1 0.524 -303 1e+03 0 0.036 1.08 1.08 Crystal phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 56, Parent ID = 37 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.524 -303 1e+03 0.0572 0 0 0 Crystal initStep + 1 0.523 -303 1e+03 0 0.0572 0.024 0.024 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 36, Parent ID = 8 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.414 -302 1e+03 3.32 0 0 0 Crystal initStep + 1 21.2 -350 1.07e+03 3.32 0 87.5 87.5 Crystal CoupledTransportation + 2 26.2 -362 1.09e+03 1.69 0 21.3 109 Crystal compt + 3 33.2 -365 1.1e+03 0.5 0 9.93 119 Crystal compt + 4 33.2 -375 1.09e+03 0.485 0 9.24 128 Crystal compt + 5 36.4 -400 1.1e+03 0.485 0 25.7 154 Crystal CoupledTransportation + 6 42.6 -450 1.1e+03 0.485 0 50.5 204 Crystal CoupledTransportation + 7 44.3 -463 1.1e+03 0.484 0 13.6 218 Crystal compt + 8 44.9 -478 1.1e+03 0 0.0332 14.7 232 Crystal phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 61, Parent ID = 36 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 44.9 -478 1.1e+03 0.451 0 0 0 Crystal initStep + 1 45 -478 1.1e+03 0 0.451 0.599 0.599 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 60, Parent ID = 36 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 44.3 -463 1.1e+03 0.00177 0 0 0 Crystal initStep + 1 44.3 -463 1.1e+03 0 0.00177 0.000116 0.000116 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 59, Parent ID = 36 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 33.2 -375 1.09e+03 0.0146 0 0 0 Crystal initStep + 1 33.2 -375 1.09e+03 0 0.0146 0.00255 0.00255 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 58, Parent ID = 36 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 33.2 -365 1.1e+03 1.19 0 0 0 Crystal initStep + 1 33.4 -365 1.1e+03 0.516 0.679 1.62 1.62 Crystal eIoni + 2 33.5 -365 1.1e+03 0.428 0.0236 0.0635 1.68 Crystal eBrem + 3 33.5 -365 1.1e+03 0 0.428 0.559 2.24 Crystal eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 62, Parent ID = 58 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 33.5 -365 1.1e+03 0.0636 0 0 0 Crystal initStep + 1 33.7 -366 1.1e+03 0 0.0332 0.451 0.451 Crystal phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 63, Parent ID = 62 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 9.44 306 1.08e+03 0.01 0 0 0 Crystal initStep - 1 9.44 306 1.08e+03 0 0.01 0.0014 0.0014 Crystal eIoni + 0 33.7 -366 1.1e+03 0.0304 0 0 0 Crystal initStep + 1 33.7 -366 1.1e+03 0 0.0304 0.00842 0.00842 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 61, Parent ID = 11 +* G4Track Information: Particle = e-, Track ID = 57, Parent ID = 36 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 9.76 306 1.08e+03 0.0482 0 0 0 Crystal initStep - 1 9.75 306 1.08e+03 0 0.036 0.122 0.122 Crystal phot + 0 26.2 -362 1.09e+03 1.63 0 0 0 Crystal initStep + 1 26.1 -362 1.09e+03 0.834 0.794 1.91 1.91 Crystal eIoni + 2 26.1 -362 1.09e+03 0 0.834 1.27 3.18 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 64, Parent ID = 61 +* G4Track Information: Particle = gamma, Track ID = 35, Parent ID = 8 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 9.75 306 1.08e+03 0.0122 0 0 0 Crystal initStep - 1 9.75 306 1.08e+03 0 0.0122 0.0019 0.0019 Crystal eIoni + 0 -0.0258 -301 1e+03 1.9 0 0 0 Crystal initStep + 1 1.47e-15 -301 1e+03 1.9 0 0.0781 0.0781 Crystal CoupledTransportation + 2 28.5 -336 1.08e+03 0.941 0 86.4 86.5 Crystal compt + 3 50 -346 1.08e+03 0.941 0 25.4 112 Crystal CoupledTransportation + 4 57.4 -350 1.09e+03 0.941 0 8.77 121 Crystal CoupledTransportation + 5 100 -371 1.1e+03 0.941 0 50.3 171 Crystal CoupledTransportation + 6 106 -374 1.11e+03 0.362 0 7.46 178 Crystal compt + 7 117 -350 1.12e+03 0.362 0 31.8 210 Crystal CoupledTransportation + 8 117 -350 1.12e+03 0 0.0332 0.306 211 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 60, Parent ID = 11 +* G4Track Information: Particle = e-, Track ID = 66, Parent ID = 35 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.96 306 1.08e+03 0.152 0 0 0 Crystal initStep - 1 9.73 306 1.08e+03 0 0.0332 1.12 1.12 Crystal phot + 0 117 -350 1.12e+03 0.329 0 0 0 Crystal initStep + 1 117 -350 1.12e+03 0 0.329 0.384 0.384 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 65, Parent ID = 60 +* G4Track Information: Particle = e-, Track ID = 65, Parent ID = 35 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 9.73 306 1.08e+03 0.119 0 0 0 Crystal initStep - 1 9.74 306 1.08e+03 0 0.119 0.0802 0.0802 Crystal eIoni + 0 106 -374 1.11e+03 0.579 0 0 0 Crystal initStep + 1 106 -374 1.11e+03 0 0.579 0.839 0.839 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 59, Parent ID = 11 +* G4Track Information: Particle = e-, Track ID = 64, Parent ID = 35 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.69 306 1.08e+03 2.98 0 0 0 Crystal initStep - 1 21.6 306 1.11e+03 2.44 0 35.9 35.9 Crystal compt - 2 33.3 313 1.22e+03 2.12 0 113 149 Crystal compt - 3 32.5 315 1.23e+03 1.13 0 8.33 157 Crystal compt - 4 39.3 300 1.27e+03 1.13 0 39.7 197 Crystal CoupledTransportation - 5 41.2 296 1.28e+03 0.848 0 10.5 207 Crystal compt - 6 47.2 300 1.3e+03 0.848 0 24.7 232 Crystal CoupledTransportation - 7 48.3 301 1.3e+03 0 0.0332 4.51 237 Crystal phot + 0 28.5 -336 1.08e+03 0.96 0 0 0 Crystal initStep + 1 28.5 -336 1.08e+03 0.16 0.8 1.41 1.41 Crystal eIoni + 2 28.5 -336 1.08e+03 0 0.16 0.129 1.54 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 70, Parent ID = 59 +* G4Track Information: Particle = gamma, Track ID = 34, Parent ID = 8 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 48.3 301 1.3e+03 0.815 0 0 0 Crystal initStep - 1 48.6 301 1.3e+03 0.565 0.25 0.458 0.458 Crystal msc - 2 48.7 301 1.3e+03 0 0.565 0.812 1.27 Crystal eIoni + 0 -0.0566 -301 1e+03 0.955 0 0 0 Crystal initStep + 1 1.11e-16 -301 1e+03 0.955 0 0.175 0.175 Crystal CoupledTransportation + 2 4.09 -306 1.01e+03 0.567 0 12.7 12.9 Crystal compt + 3 6.66 -314 1.02e+03 0.439 0 8.75 21.6 Crystal compt + 4 4.86 -318 1.02e+03 0 0.00568 5.39 27 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 69, Parent ID = 59 +* G4Track Information: Particle = e-, Track ID = 69, Parent ID = 34 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 41.2 296 1.28e+03 0.279 0 0 0 Crystal initStep - 1 41.2 296 1.28e+03 0 0.279 0.301 0.301 Crystal eIoni + 0 4.86 -318 1.02e+03 0.433 0 0 0 Crystal initStep + 1 4.85 -318 1.02e+03 0.173 0.0858 0.197 0.197 Crystal eBrem + 2 4.84 -318 1.02e+03 0 0.173 0.145 0.343 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 68, Parent ID = 59 +* G4Track Information: Particle = gamma, Track ID = 70, Parent ID = 69 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 32.5 315 1.23e+03 0.994 0 0 0 Crystal initStep - 1 32.4 315 1.23e+03 0.206 0.788 1.45 1.45 Crystal eIoni - 2 32.4 315 1.23e+03 0 0.206 0.191 1.64 Crystal eIoni + 0 4.85 -318 1.02e+03 0.175 0 0 0 Crystal initStep + 1 7.83 -319 1.02e+03 0 0.0332 3.34 3.34 Crystal phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 67, Parent ID = 59 +* G4Track Information: Particle = e-, Track ID = 71, Parent ID = 70 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 33.3 313 1.22e+03 0.316 0 0 0 Crystal initStep - 1 33.3 313 1.22e+03 0 0.316 0.362 0.362 Crystal eIoni + 0 7.83 -319 1.02e+03 0.141 0 0 0 Crystal initStep + 1 7.84 -319 1.02e+03 0 0.141 0.106 0.106 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 66, Parent ID = 59 +* G4Track Information: Particle = e-, Track ID = 68, Parent ID = 34 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 21.6 306 1.11e+03 0.539 0 0 0 Crystal initStep - 1 21.7 306 1.11e+03 0.295 0.0461 0.0971 0.0971 Crystal eBrem - 2 21.6 306 1.11e+03 0.2 0.0336 0.077 0.174 Crystal eBrem - 3 21.6 306 1.11e+03 0 0.2 0.183 0.357 Crystal eIoni + 0 6.66 -314 1.02e+03 0.128 0 0 0 Crystal initStep + 1 6.66 -314 1.02e+03 0 0.128 0.0899 0.0899 Crystal eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 72, Parent ID = 66 +* G4Track Information: Particle = e-, Track ID = 67, Parent ID = 34 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 21.6 306 1.11e+03 0.0614 0 0 0 Crystal initStep - 1 21.6 305 1.11e+03 0 0.036 0.0191 0.0191 Crystal phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 73, Parent ID = 72 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 21.6 305 1.11e+03 0.0254 0 0 0 Crystal initStep - 1 21.6 305 1.11e+03 0 0.0254 0.00627 0.00627 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 71, Parent ID = 66 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 21.7 306 1.11e+03 0.198 0 0 0 Crystal initStep - 1 21.3 305 1.11e+03 0 0.036 1.77 1.77 Crystal phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 74, Parent ID = 71 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 21.3 305 1.11e+03 0.162 0 0 0 Crystal initStep - 1 21.3 305 1.11e+03 0 0.162 0.131 0.131 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 10, Parent ID = 4 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.06 299 1.05e+03 1.31 0 0 0 Crystal initStep - 1 8.47 299 1.05e+03 0.591 0.723 0.601 0.601 Crystal msc - 2 8.46 299 1.05e+03 0 0.591 0.862 1.46 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 4 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.03 297 1.05e+03 0.806 0 0 0 Crystal initStep - 1 8.12 297 1.05e+03 0.147 0.659 1.23 1.23 Crystal eIoni - 2 8.11 297 1.05e+03 0 0.147 0.113 1.34 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 4 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.13 295 1.04e+03 1.22 0 0 0 Crystal initStep - 1 8.31 295 1.04e+03 0.442 0.774 1.64 1.64 Crystal eIoni - 2 8.35 295 1.04e+03 0 0.442 0.582 2.22 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 4 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.15 292 1.03e+03 10 0 0 0 Crystal initStep - 1 8.11 292 1.03e+03 9.83 0.0378 0.119 0.119 Crystal eBrem - 2 5.24 293 1.03e+03 7.41 2.42 4.64 4.76 Crystal msc - 3 2.73 295 1.03e+03 5.66 1.75 3.42 8.17 Crystal msc - 4 3.3 294 1.03e+03 5.03 0.498 1.11 9.28 Crystal eBrem - 5 3.99 293 1.03e+03 2.74 0.608 1.15 10.4 Crystal eIoni - 6 4.21 293 1.03e+03 1.54 0.18 0.436 10.9 Crystal eBrem - 7 4.35 293 1.03e+03 0.836 0.461 1.11 12 Crystal eBrem - 8 4.43 293 1.03e+03 0.0801 0.756 1.27 13.2 Crystal eIoni - 9 4.43 293 1.03e+03 0 0.0801 0.042 13.3 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 79, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 4.35 293 1.03e+03 0.238 0 0 0 Crystal initStep - 1 7.48 289 1.03e+03 0 0.036 5.42 5.42 Crystal phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 80, Parent ID = 79 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 7.48 289 1.03e+03 0.202 0 0 0 Crystal initStep - 1 7.49 289 1.03e+03 0 0.202 0.185 0.185 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 78, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 4.21 293 1.03e+03 1.03 0 0 0 Crystal initStep - 1 5.81 294 1.02e+03 0.975 0 5.66 5.66 Crystal compt - 2 9.02 300 1.01e+03 0.975 0 14.6 20.2 Crystal CoupledTransportation - 3 11.9 305 1e+03 0.975 0 13.3 33.5 WorldPhysical CoupledTransportation - 4 36.6 349 900 0.975 0 112 146 DriftChamberPhysical CoupledTransportation - 5 234 701 100 0.975 0 896 1.04e+03 WorldPhysical CoupledTransportation - 6 1.24e+03 2.51e+03 -4e+03 0.975 0 4.59e+03 5.63e+03 OutOfWorld CoupledTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 81, Parent ID = 78 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 5.81 294 1.02e+03 0.0522 0 0 0 Crystal initStep - 1 5.81 294 1.02e+03 0 0.0522 0.0206 0.0206 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 77, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 3.99 293 1.03e+03 1.68 0 0 0 Crystal initStep - 1 4.42 293 1.03e+03 0.871 0.808 1.94 1.94 Crystal eIoni - 2 4.38 293 1.03e+03 0.184 0.687 1.31 3.25 Crystal eIoni - 3 4.38 293 1.03e+03 0 0.184 0.16 3.41 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 76, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 3.3 294 1.03e+03 0.135 0 0 0 Crystal initStep - 1 3.99 293 1.03e+03 0 0.0012 1.1 1.1 Crystal phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 82, Parent ID = 76 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 3.99 293 1.03e+03 0.134 0 0 0 Crystal initStep - 1 3.99 293 1.03e+03 0 0.134 0.0973 0.0973 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 75, Parent ID = 7 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 8.11 292 1.03e+03 0.153 0 0 0 Crystal initStep - 1 7.64 292 1.03e+03 0 0.036 2.04 2.04 Crystal phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 83, Parent ID = 75 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 7.64 292 1.03e+03 0.117 0 0 0 Crystal initStep - 1 7.64 292 1.03e+03 0 0.117 0.0781 0.0781 Crystal eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 4 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 7.58 283 994 0.001 0 0 0 WorldPhysical initStep - 1 7.57 283 994 0 0.001 0.0573 0.0573 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 4 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 4.06 229 789 0.00308 0 0 0 DriftChamberPhysical initStep - 1 5.2 228 789 0.00198 0.00109 1.57 1.57 DriftChamberPhysical eIoni - 2 5.84 228 789 0 0.00198 0.9 2.47 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = anti_nu_mu, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0402 166 553 283 0 0 0 DriftChamberPhysical initStep - 1 -18.3 305 900 283 0 375 375 WorldPhysical CoupledTransportation - 2 -23.6 346 1e+03 283 0 108 483 Crystal CoupledTransportation - 3 -24.2 350 1.01e+03 283 0 11.5 494 Crystal CoupledTransportation - 4 -30.7 400 1.13e+03 283 0 134 628 Crystal CoupledTransportation - 5 -37.3 450 1.26e+03 283 0 134 762 Crystal CoupledTransportation - 6 -43.8 500 1.38e+03 283 0 134 896 Crystal CoupledTransportation - 7 -44.7 507 1.4e+03 283 0 18.2 914 WorldPhysical CoupledTransportation - 8 -50 547 1.5e+03 283 0 108 1.02e+03 HadCaloPhysical CoupledTransportation - 9 -52.7 567 1.55e+03 283 0 54 1.08e+03 Tower CoupledTransportation - 10 -63.5 650 1.76e+03 283 0 222 1.3e+03 Tower CoupledTransportation - 11 -76.7 750 2e+03 283 0 268 1.57e+03 Tower CoupledTransportation - 12 -89.8 850 2.25e+03 283 0 268 1.83e+03 Tower CoupledTransportation - 13 -100 930 2.45e+03 283 0 213 2.05e+03 HadCaloPhysical CoupledTransportation - 14 -103 950 2.5e+03 283 0 54 2.1e+03 WorldPhysical CoupledTransportation - 15 -182 1.55e+03 4e+03 283 0 1.62e+03 3.72e+03 OutOfWorld CoupledTransportation + 0 4.09 -306 1.01e+03 0.389 0 0 0 Crystal initStep + 1 4.1 -306 1.01e+03 0 0.389 0.488 0.488 Crystal eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 28.7 95.6 0.00269 0 0 0 WorldPhysical initStep - 1 0.108 28.7 95.6 0 0.00269 0.261 0.261 WorldPhysical eIoni + 0 -0.00018 -4.81 16 0.00128 0 0 0 WorldPhysical initStep + 1 -0.0302 -4.81 16.1 0 0.00128 0.0814 0.0814 WorldPhysical eIoni +0 events have been kept for refreshing and/or reviewing. + "/vis/reviewKeptEvents" to review them one by one. + "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. ********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 23 76.6 1e+03 0.0108 80 80 WorldPhysical hIoni - 2 -0.000168 30 100 1e+03 0.00244 24.5 104 DriftChamberPhysical CoupledTransportation - 3 -0.0235 270 900 1e+03 0.0173 835 940 WorldPhysical CoupledTransportation - 4 -0.0278 282 940 1e+03 0.00375 42.2 982 WorldPhysical hIoni - 5 -0.0297 285 950 1e+03 0.00274 9.98 992 WorldPhysical fastSimProcess_parallelGeom - 6 -0.0297 285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + 1 -0.0108 -33.2 55.3 1e+03 0.0143 64.5 64.5 WorldPhysical eIoni + 2 -0.0243 -60 100 1e+03 0.0142 52.1 117 DriftChamberPhysical CoupledTransportation + 3 -0.313 -444 740 1e+03 0.0284 747 863 DriftChamberPhysical eIoni + 4 -0.387 -540 900 1e+03 0.00533 186 1.05e+03 WorldPhysical CoupledTransportation + 5 -0.434 -600 1e+03 1e+03 0.0224 117 1.17e+03 Crystal CoupledTransportation + 6 -0.434 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0278 282 940 0.00474 0 0 0 WorldPhysical initStep - 1 -0.0279 282 941 0 0.00474 0.696 0.696 WorldPhysical eIoni + 0 -0.313 -444 740 0.0152 0 0 0 DriftChamberPhysical initStep + 1 -8.41 -443 742 0.0138 0.00148 8.68 8.68 DriftChamberPhysical eIoni + 2 -12.2 -443 744 0.0112 0.00091 4.24 12.9 DriftChamberPhysical eIoni + 3 -16.8 -445 745 0.00946 0.00175 5.58 18.5 DriftChamberPhysical eIoni + 4 -19 -449 744 0.00797 0.00149 4.48 23 DriftChamberPhysical eIoni + 5 -19.8 -452 744 0.00704 0.000924 3.66 26.6 DriftChamberPhysical eIoni + 6 -19.7 -453 744 0.00486 0.000594 1.34 28 DriftChamberPhysical eIoni + 7 -18.8 -455 745 0.004 0.000859 2.28 30.3 DriftChamberPhysical eIoni + 8 -19.6 -456 743 0.00121 0.00279 1.95 32.2 DriftChamberPhysical eIoni + 9 -19.9 -456 743 0 0.00121 0.404 32.6 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 3 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -19.7 -453 744 0.00159 0 0 0 DriftChamberPhysical initStep + 1 -20 -454 744 0 0.00159 0.622 0.622 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 3 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -12.2 -443 744 0.00165 0 0 0 DriftChamberPhysical initStep + 1 -12.4 -443 743 0 0.00165 0.662 0.662 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 23 76.6 0.00133 0 0 0 WorldPhysical initStep - 1 -0.0286 23 76.6 0 0.00133 0.0861 0.0861 WorldPhysical eIoni + 0 -0.0108 -33.2 55.3 0.00352 0 0 0 WorldPhysical initStep + 1 -0.015 -33.4 55.3 0 0.00352 0.413 0.413 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0.000287 3.25 10.8 1e+03 0.00326 11.3 11.3 WorldPhysical hIoni - 2 0.00447 21.9 72.9 1e+03 0.00928 64.8 76.1 WorldPhysical hIoni - 3 0.00519 30 100 1e+03 0.00453 28.3 104 DriftChamberPhysical CoupledTransportation - 4 0.0168 270 900 1e+03 0.0137 835 940 WorldPhysical CoupledTransportation - 5 0.0192 285 950 1e+03 0.00612 52.2 992 WorldPhysical fastSimProcess_parallelGeom - 6 0.0192 285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + 1 0.00145 -13.9 23.1 1e+03 0.00633 26.9 26.9 WorldPhysical eIoni + 2 0.00503 -60 100 1e+03 0.0173 89.7 117 DriftChamberPhysical CoupledTransportation + 3 -0.00329 -212 354 1e+03 0.0117 296 412 DriftChamberPhysical eIoni + 4 -0.0552 -540 900 1e+03 0.0185 637 1.05e+03 WorldPhysical CoupledTransportation + 5 -0.0467 -600 1e+03 1e+03 0.0242 117 1.17e+03 Crystal CoupledTransportation + 6 -0.0467 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.00447 21.9 72.9 0.00617 0 0 0 WorldPhysical initStep - 1 0.0994 22.3 72.8 0 0.00617 1.11 1.11 WorldPhysical eIoni + 0 -0.00329 -212 354 0.00188 0 0 0 DriftChamberPhysical initStep + 1 0.11 -212 354 0 0.00188 0.825 0.825 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.000287 3.25 10.8 0.00378 0 0 0 WorldPhysical initStep - 1 -0.165 3.36 10.8 0 0.00378 0.47 0.47 WorldPhysical eIoni + 0 0.00145 -13.9 23.1 0.00407 0 0 0 WorldPhysical initStep + 1 0.225 -13.9 23.1 0 0.00407 0.532 0.532 WorldPhysical eIoni ********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 22 73.4 1e+03 0.0131 76.7 76.7 WorldPhysical hIoni - 2 0.000113 30 100 1e+03 0.00317 27.7 104 DriftChamberPhysical CoupledTransportation - 3 0.0056 162 538 1e+03 0.0099 458 562 DriftChamberPhysical hIoni - 4 0.0213 199 664 1e+03 0.00264 131 693 DriftChamberPhysical hIoni - 5 0.0537 270 900 1e+03 0.00396 246 940 WorldPhysical CoupledTransportation - 6 0.0564 274 914 1e+03 0.00163 14.2 954 WorldPhysical hIoni - 7 0.0641 285 950 1e+03 0.00467 38 992 WorldPhysical fastSimProcess_parallelGeom - 8 0.0641 285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + 1 0.00442 -55.4 92.3 1e+03 0.0202 108 108 WorldPhysical eIoni + 2 0.00474 -60 100 1e+03 0.00191 8.96 117 DriftChamberPhysical CoupledTransportation + 3 0.0584 -540 900 1e+03 0.0292 933 1.05e+03 WorldPhysical CoupledTransportation + 4 0.0701 -600 1e+03 1e+03 0.0215 117 1.17e+03 Crystal CoupledTransportation + 5 0.0701 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.00442 -55.4 92.3 0.00249 0 0 0 WorldPhysical initStep + 1 0.00289 -55.3 92.4 0 0.00249 0.23 0.23 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 -0.00522 -38.2 63.7 1e+03 0.0145 74.3 74.3 WorldPhysical eIoni + 2 -0.000114 -60 100 1e+03 0.00907 42.3 117 DriftChamberPhysical CoupledTransportation + 3 0.00305 -88.6 148 1e+03 0.000324 55.6 172 DriftChamberPhysical eIoni + 4 0.0409 -540 900 1e+03 0.0257 877 1.05e+03 WorldPhysical CoupledTransportation + 5 0.0455 -582 970 1e+03 0.0179 82.2 1.13e+03 WorldPhysical eIoni + 6 0.046 -596 994 1e+03 0.00417 27.3 1.16e+03 WorldPhysical eIoni + 7 0.0458 -599 998 1e+03 0.00128 4.47 1.16e+03 WorldPhysical eIoni + 8 0.0456 -600 1e+03 1e+03 0.000579 2.65 1.17e+03 Crystal CoupledTransportation + 9 0.0456 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.0458 -599 998 0.00433 0 0 0 WorldPhysical initStep + 1 0.246 -599 998 0 0.00433 0.595 0.595 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0564 274 914 0.00128 0 0 0 WorldPhysical initStep - 1 0.0689 274 914 0 0.00128 0.0813 0.0813 WorldPhysical eIoni + 0 0.046 -596 994 0.0048 0 0 0 WorldPhysical initStep + 1 0.199 -597 994 0 0.0048 0.713 0.713 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0213 199 664 0.00126 0 0 0 DriftChamberPhysical initStep - 1 0.0477 200 664 0 0.00126 0.432 0.432 DriftChamberPhysical eIoni + 0 0.0455 -582 970 0.00196 0 0 0 WorldPhysical initStep + 1 0.00479 -582 970 0 0.00196 0.157 0.157 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0056 162 538 0.00116 0 0 0 DriftChamberPhysical initStep - 1 -0.245 162 538 0 0.00116 0.377 0.377 DriftChamberPhysical eIoni + 0 0.00305 -88.6 148 0.00202 0 0 0 DriftChamberPhysical initStep + 1 0.372 -89.1 147 0 0.00202 0.928 0.928 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 22 73.4 0.00135 0 0 0 WorldPhysical initStep - 1 0.00292 22 73.4 0 0.00135 0.0886 0.0886 WorldPhysical eIoni + 0 -0.00522 -38.2 63.7 0.0528 0 0 0 WorldPhysical initStep + 1 -8.19 -30.7 68 0.0472 0.00559 12.7 12.7 WorldPhysical eIoni + 2 -14.3 -25.6 73.9 0.0388 0.0084 10.7 23.4 WorldPhysical eIoni + 3 -14.8 -25.2 74.4 0.032 0.000138 0.865 24.3 WorldPhysical eIoni + 4 -18.1 -26 78.1 0.0281 0.00386 6.05 30.3 WorldPhysical eIoni + 5 -16.9 -27.2 81.9 0.026 0.00207 5.1 35.4 WorldPhysical eIoni + 6 -16.1 -27.5 83.6 0.0168 0.00322 2.19 37.6 WorldPhysical eIoni + 7 -15.8 -27.3 84.1 0.0148 0.000657 0.654 38.3 WorldPhysical eIoni + 8 -14.8 -25.9 84.6 0.0113 0.00342 2.54 40.8 WorldPhysical eIoni + 9 -14.5 -25.2 85.6 0.006 0.00534 2.03 42.9 WorldPhysical eIoni + 10 -14.2 -25 85.9 0.00183 0.00417 1.06 43.9 WorldPhysical eIoni + 11 -14.2 -25 85.8 0 0.00183 0.141 44.1 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 2 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -15.8 -27.3 84.1 0.00133 0 0 0 WorldPhysical initStep + 1 -15.8 -27.3 84.2 0 0.00133 0.0865 0.0865 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 2 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -16.1 -27.5 83.6 0.00607 0 0 0 WorldPhysical initStep + 1 -15.7 -27.6 83.4 0 0.00607 1.08 1.08 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 2 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -14.8 -25.2 74.4 0.00664 0 0 0 WorldPhysical initStep + 1 -14.8 -24.6 74.5 0 0.00664 1.22 1.22 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 -3.73e-06 -12.9 21.5 1e+03 0.00719 25.1 25.1 WorldPhysical eIoni + 2 0.00395 -48.3 80.5 1e+03 0.0132 68.8 93.9 WorldPhysical eIoni + 3 0.00441 -60 100 1e+03 0.00526 22.7 117 DriftChamberPhysical CoupledTransportation + 4 0.115 -540 900 1e+03 0.0267 933 1.05e+03 WorldPhysical CoupledTransportation + 5 0.166 -597 995 1e+03 0.0208 111 1.16e+03 WorldPhysical eIoni + 6 0.168 -600 1e+03 1e+03 0.000526 5.33 1.17e+03 Crystal CoupledTransportation + 7 0.168 -600 1e+03 0 1e+03 0 1.17e+03 Crystal fastSimProcess_massGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.166 -597 995 0.00133 0 0 0 WorldPhysical initStep + 1 0.199 -597 995 0 0.00133 0.0862 0.0862 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.00395 -48.3 80.5 0.00518 0 0 0 WorldPhysical initStep + 1 0.0186 -48.6 80.4 0 0.00518 0.816 0.816 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -3.73e-06 -12.9 21.5 0.00208 0 0 0 WorldPhysical initStep + 1 -0.0701 -12.9 21.5 0 0.00208 0.173 0.173 WorldPhysical eIoni 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -3429,88 +2393,46 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -15.3 51.1 1e+03 0.00747 53.3 53.3 WorldPhysical hIoni - 2 -0.00531 -30 100 1e+03 0.00417 51.1 104 DriftChamberPhysical CoupledTransportation - 3 -0.157 -270 900 1e+03 0.0177 835 940 WorldPhysical CoupledTransportation - 4 -0.164 -285 950 1e+03 0.00656 52.2 992 WorldPhysical fastSimProcess_parallelGeom - 5 -0.164 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 -15.3 51.1 0.00292 0 0 0 WorldPhysical initStep - 1 0.111 -15.3 51.1 0 0.00292 0.301 0.301 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -0.274 0.912 1e+03 0.000109 0.952 0.952 WorldPhysical hIoni - 2 -0.00378 -30 100 1e+03 0.0134 103 104 DriftChamberPhysical CoupledTransportation - 3 -0.143 -270 900 1e+03 0.0179 835 940 WorldPhysical CoupledTransportation - 4 -0.149 -285 950 1e+03 0.00531 52.2 992 WorldPhysical fastSimProcess_parallelGeom - 5 -0.149 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 -0.274 0.912 0.0026 0 0 0 WorldPhysical initStep - 1 0.0823 -0.334 0.899 0 0.0026 0.248 0.248 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -30 100 1e+03 0.0147 104 104 DriftChamberPhysical CoupledTransportation - 2 0.0979 -139 465 1e+03 0.00775 381 485 DriftChamberPhysical hIoni - 3 0.142 -183 612 1e+03 0.00271 153 639 DriftChamberPhysical hIoni - 4 0.187 -225 749 1e+03 0.00257 143 782 DriftChamberPhysical hIoni - 5 0.237 -270 900 1e+03 0.00325 158 940 WorldPhysical CoupledTransportation - 6 0.242 -274 913 1e+03 0.00309 13.8 953 WorldPhysical hIoni - 7 0.255 -285 950 1e+03 0.00563 38.4 992 WorldPhysical fastSimProcess_parallelGeom - 8 0.255 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + 1 0 20.7 34.5 1e+03 0.00585 40.2 40.2 WorldPhysical hIoni + 2 0.000671 26.3 43.8 1e+03 0.0027 10.8 51 WorldPhysical hIoni + 3 0.0074 58.9 98.2 1e+03 0.00586 63.4 114 WorldPhysical hIoni + 4 0.00766 60 100 1e+03 0.000124 2.13 117 DriftChamberPhysical CoupledTransportation + 5 0.119 540 900 1e+03 0.021 933 1.05e+03 WorldPhysical CoupledTransportation + 6 0.12 545 908 1e+03 0.000985 9.71 1.06e+03 WorldPhysical hIoni + 7 0.123 570 950 1e+03 0.00694 48.6 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 8 0.123 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.242 -274 913 0.0016 0 0 0 WorldPhysical initStep - 1 0.2 -274 913 0 0.0016 0.114 0.114 WorldPhysical eIoni + 0 0.12 545 908 0.00111 0 0 0 WorldPhysical initStep + 1 0.144 545 908 0 0.00111 0.0667 0.0667 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.187 -225 749 0.00511 0 0 0 DriftChamberPhysical initStep - 1 -0.462 -227 748 0.0037 0.00141 2.38 2.38 DriftChamberPhysical eIoni - 2 -0.328 -228 749 0.0023 0.0014 1.83 4.21 DriftChamberPhysical eIoni - 3 -0.531 -229 749 0 0.0023 1.14 5.35 DriftChamberPhysical eIoni + 0 0.0074 58.9 98.2 0.00223 0 0 0 WorldPhysical initStep + 1 -0.00426 59 98.1 0 0.00223 0.193 0.193 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.142 -183 612 0.00204 0 0 0 DriftChamberPhysical initStep - 1 -0.181 -183 612 0 0.00204 0.939 0.939 DriftChamberPhysical eIoni + 0 0.000671 26.3 43.8 0.00171 0 0 0 WorldPhysical initStep + 1 -0.0487 26.3 43.8 0 0.00171 0.127 0.127 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0979 -139 465 0.00199 0 0 0 DriftChamberPhysical initStep - 1 0.452 -140 465 0 0.00199 0.903 0.903 DriftChamberPhysical eIoni + 0 0 20.7 34.5 0.00108 0 0 0 WorldPhysical initStep + 1 -0.0231 20.7 34.5 0 0.00108 0.0636 0.0636 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 @@ -3518,31 +2440,37 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -30 100 1e+03 0.0145 104 104 DriftChamberPhysical CoupledTransportation - 2 0.0484 -161 538 1e+03 0.00745 457 562 DriftChamberPhysical hIoni - 3 0.0969 -270 900 1e+03 0.00641 378 940 WorldPhysical CoupledTransportation - 4 0.102 -285 950 1e+03 0.00823 52.2 992 WorldPhysical fastSimProcess_parallelGeom - 5 0.102 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + 1 -3.32e-05 2.87 4.78 1e+03 0.000449 5.57 5.57 WorldPhysical hIoni + 2 -0.000296 14.7 24.5 1e+03 0.0032 23 28.5 WorldPhysical hIoni + 3 -0.00472 39.8 66.3 1e+03 0.00746 48.8 77.3 WorldPhysical hIoni + 4 -0.00361 60 100 1e+03 0.00303 39.3 117 DriftChamberPhysical CoupledTransportation + 5 -0.0371 540 900 1e+03 0.0252 933 1.05e+03 WorldPhysical CoupledTransportation + 6 -0.035 570 950 1e+03 0.00894 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 7 -0.035 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.00472 39.8 66.3 0.00191 0 0 0 WorldPhysical initStep + 1 -0.044 39.8 66.4 0 0.00191 0.151 0.151 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.000296 14.7 24.5 0.00185 0 0 0 WorldPhysical initStep + 1 0.0498 14.7 24.5 0 0.00185 0.143 0.143 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0484 -161 538 0.00873 0 0 0 DriftChamberPhysical initStep - 1 -1.7 -158 539 0.00684 0.00189 4.07 4.07 DriftChamberPhysical eIoni - 2 -3.59 -156 540 0.00476 0.000835 3.04 7.11 DriftChamberPhysical eIoni - 3 -4.53 -155 540 0.00327 0.00149 2.24 9.35 DriftChamberPhysical eIoni - 4 -4.76 -153 541 0.00185 0.00142 1.65 11 DriftChamberPhysical eIoni - 5 -5.32 -153 541 0 0.00185 0.801 11.8 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 2 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -3.59 -156 540 0.00125 0 0 0 DriftChamberPhysical initStep - 1 -3.34 -156 540 0 0.00125 0.423 0.423 DriftChamberPhysical eIoni + 0 -3.32e-05 2.87 4.78 0.0011 0 0 0 WorldPhysical initStep + 1 -0.000285 2.89 4.76 0 0.0011 0.0655 0.0655 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 @@ -3550,19 +2478,114 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -30 100 1e+03 0.0145 104 104 DriftChamberPhysical CoupledTransportation - 2 -0.0194 -160 532 1e+03 0.00835 451 556 DriftChamberPhysical hIoni - 3 -0.0206 -270 900 1e+03 0.00685 384 940 WorldPhysical CoupledTransportation - 4 -0.0209 -285 950 1e+03 0.00597 52.2 992 WorldPhysical fastSimProcess_parallelGeom - 5 -0.0209 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + 1 0 60 100 1e+03 0.015 117 117 DriftChamberPhysical CoupledTransportation + 2 -0.128 384 640 1e+03 0.0123 629 746 DriftChamberPhysical hIoni + 3 -0.13 393 655 1e+03 0.00027 18.3 764 DriftChamberPhysical hIoni + 4 -0.162 540 900 1e+03 0.00392 285 1.05e+03 WorldPhysical CoupledTransportation + 5 -0.167 570 950 1e+03 0.00784 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 6 -0.167 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.13 393 655 0.00187 0 0 0 DriftChamberPhysical initStep + 1 0.198 393 656 0 0.00187 0.816 0.816 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0194 -160 532 0.00204 0 0 0 DriftChamberPhysical initStep - 1 0.574 -160 532 0 0.00204 0.942 0.942 DriftChamberPhysical eIoni + 0 -0.128 384 640 0.00149 0 0 0 DriftChamberPhysical initStep + 1 -0.00414 384 639 0 0.00149 0.564 0.564 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 12.3 20.5 1e+03 0.00211 24 24 WorldPhysical hIoni + 2 0.00092 60 100 1e+03 0.011 92.7 117 DriftChamberPhysical CoupledTransportation + 3 -0.00387 168 280 1e+03 0.00515 209 326 DriftChamberPhysical hIoni + 4 0.0559 540 900 1e+03 0.0134 724 1.05e+03 WorldPhysical CoupledTransportation + 5 0.0557 544 908 1e+03 0.000659 8.95 1.06e+03 WorldPhysical hIoni + 6 0.055 570 950 1e+03 0.00569 49.4 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 7 0.055 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.0557 544 908 0.00137 0 0 0 WorldPhysical initStep + 1 0.0462 544 908 0 0.00137 0.0902 0.0902 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.00387 168 280 0.00255 0 0 0 DriftChamberPhysical initStep + 1 -0.307 169 279 0 0.00255 1.29 1.29 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 12.3 20.5 0.00144 0 0 0 WorldPhysical initStep + 1 0.0074 12.4 20.5 0 0.00144 0.0971 0.0971 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 23.1 38.5 1e+03 0.00535 44.9 44.9 WorldPhysical hIoni + 2 -0.00142 28.5 47.5 1e+03 0.00246 10.4 55.4 WorldPhysical hIoni + 3 -0.0104 60 100 1e+03 0.00775 61.2 117 DriftChamberPhysical CoupledTransportation + 4 -0.0978 462 769 1e+03 0.0147 781 897 DriftChamberPhysical hIoni + 5 -0.14 540 900 1e+03 0.00241 152 1.05e+03 WorldPhysical CoupledTransportation + 6 -0.143 546 909 1e+03 0.00149 11 1.06e+03 WorldPhysical hIoni + 7 -0.156 570 950 1e+03 0.00637 47.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 8 -0.156 570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.143 546 909 0.00154 0 0 0 WorldPhysical initStep + 1 -0.172 546 909 0 0.00154 0.108 0.108 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.0978 462 769 0.00211 0 0 0 DriftChamberPhysical initStep + 1 0.542 462 769 0 0.00211 0.998 0.998 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.00142 28.5 47.5 0.00585 0 0 0 WorldPhysical initStep + 1 0.04 28.9 47.3 0.00222 0.00362 1.01 1.01 WorldPhysical eIoni + 2 0.0475 28.9 47.3 0 0.00222 0.192 1.2 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 23.1 38.5 0.00571 0 0 0 WorldPhysical initStep + 1 0.379 23.3 38.5 0 0.00571 0.97 0.97 WorldPhysical eIoni 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -3573,37 +2596,118 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -15.9 26.5 1e+03 0.00502 30.9 30.9 WorldPhysical hIoni - 2 0.000435 -17.9 29.9 1e+03 0.000423 3.88 34.8 WorldPhysical hIoni - 3 0.00988 -60 100 1e+03 0.0084 81.8 117 DriftChamberPhysical CoupledTransportation - 4 0.0773 -249 415 1e+03 0.0058 367 484 DriftChamberPhysical hIoni - 5 0.224 -540 900 1e+03 0.0101 566 1.05e+03 WorldPhysical CoupledTransportation - 6 0.236 -570 950 1e+03 0.00746 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 7 0.236 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 1 0 30 100 1e+03 0.0134 104 104 DriftChamberPhysical CoupledTransportation + 2 -0.0456 186 621 1e+03 0.0119 544 648 DriftChamberPhysical hIoni + 3 -0.0498 259 861 1e+03 0.00522 251 899 DriftChamberPhysical hIoni + 4 -0.0528 270 900 1e+03 0.00139 40.2 940 WorldPhysical CoupledTransportation + 5 -0.0576 285 950 1e+03 0.00721 52.2 992 WorldPhysical fastSimProcess_parallelGeom + 6 -0.0576 285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.0498 259 861 0.00136 0 0 0 DriftChamberPhysical initStep + 1 0.238 258 862 0 0.00136 0.484 0.484 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.0456 186 621 0.00162 0 0 0 DriftChamberPhysical initStep + 1 -0.378 186 621 0 0.00162 0.641 0.641 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 5.79 19.3 1e+03 0.00168 20.1 20.1 WorldPhysical hIoni + 2 0.00733 30 100 1e+03 0.0121 84.3 104 DriftChamberPhysical CoupledTransportation + 3 0.0984 175 584 1e+03 0.0118 505 610 DriftChamberPhysical hIoni + 4 0.153 270 900 1e+03 0.00785 330 940 WorldPhysical CoupledTransportation + 5 0.157 285 950 1e+03 0.00783 52.2 992 WorldPhysical fastSimProcess_parallelGeom + 6 0.157 285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.0984 175 584 0.00182 0 0 0 DriftChamberPhysical initStep + 1 -0.335 175 584 0 0.00182 0.779 0.779 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 5.79 19.3 0.00215 0 0 0 WorldPhysical initStep + 1 -0.0654 5.82 19.3 0 0.00215 0.182 0.182 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 30 100 1e+03 0.012 104 104 DriftChamberPhysical CoupledTransportation + 2 -0.0175 89.6 298 1e+03 0.00501 207 312 DriftChamberPhysical hIoni + 3 -0.0102 270 900 1e+03 0.0136 628 940 WorldPhysical CoupledTransportation + 4 -0.00621 285 950 1e+03 0.00745 52.2 992 WorldPhysical fastSimProcess_parallelGeom + 5 -0.00621 285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.0175 89.6 298 0.00588 0 0 0 DriftChamberPhysical initStep + 1 -2.18 90.7 298 0.00459 0.00129 2.69 2.69 DriftChamberPhysical eIoni + 2 -3.26 92.2 299 0.00372 0.000876 2.18 4.87 DriftChamberPhysical eIoni + 3 -4.16 93.4 299 0.00106 0.00265 1.84 6.71 DriftChamberPhysical eIoni + 4 -4.21 93.5 299 0 0.00106 0.329 7.04 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 30 100 1e+03 0.0145 104 104 DriftChamberPhysical CoupledTransportation + 2 -0.126 225 749 1e+03 0.0114 678 782 DriftChamberPhysical hIoni + 3 -0.146 258 860 1e+03 0.00234 116 898 DriftChamberPhysical hIoni + 4 -0.153 270 900 1e+03 0.00124 41.6 940 WorldPhysical CoupledTransportation + 5 -0.154 272 906 1e+03 0.000559 6.12 946 WorldPhysical hIoni + 6 -0.163 285 950 1e+03 0.00713 46.1 992 WorldPhysical fastSimProcess_parallelGeom + 7 -0.163 285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0773 -249 415 0.00146 0 0 0 DriftChamberPhysical initStep - 1 -0.217 -249 415 0 0.00146 0.545 0.545 DriftChamberPhysical eIoni + 0 -0.154 272 906 0.0014 0 0 0 WorldPhysical initStep + 1 -0.122 272 906 0 0.0014 0.0931 0.0931 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.000435 -17.9 29.9 0.00175 0 0 0 WorldPhysical initStep - 1 -0.0024 -17.9 29.9 0 0.00175 0.131 0.131 WorldPhysical eIoni + 0 -0.146 258 860 0.00125 0 0 0 DriftChamberPhysical initStep + 1 -0.353 258 860 0 0.00125 0.423 0.423 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 -15.9 26.5 0.00246 0 0 0 WorldPhysical initStep - 1 5.37e-05 -16 26.5 0 0.00246 0.226 0.226 WorldPhysical eIoni + 0 -0.126 225 749 0.00133 0 0 0 DriftChamberPhysical initStep + 1 0.0728 225 749 0 0.00133 0.469 0.469 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 @@ -3611,28 +2715,31 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -17 28.4 1e+03 0.00605 33.1 33.1 WorldPhysical hIoni - 2 -0.008 -60 100 1e+03 0.0116 83.5 117 DriftChamberPhysical CoupledTransportation - 3 -0.122 -540 900 1e+03 0.0219 933 1.05e+03 WorldPhysical CoupledTransportation - 4 -0.13 -562 936 1e+03 0.00373 42.2 1.09e+03 WorldPhysical hIoni - 5 -0.134 -570 950 1e+03 0.00266 16.1 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 6 -0.134 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 1 -0.00055 2.91 9.72 1e+03 0.0013 10.1 10.1 WorldPhysical hIoni + 2 -0.00416 13.7 45.6 1e+03 0.00519 37.5 47.6 WorldPhysical hIoni + 3 -0.00902 30 100 1e+03 0.00921 56.8 104 DriftChamberPhysical CoupledTransportation + 4 0.195 270 900 1e+03 0.0205 835 940 WorldPhysical CoupledTransportation + 5 0.209 285 950 1e+03 0.0106 52.2 992 WorldPhysical fastSimProcess_parallelGeom + 6 0.209 285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.13 -562 936 0.00104 0 0 0 WorldPhysical initStep - 1 -0.107 -562 936 0 0.00104 0.0605 0.0605 WorldPhysical eIoni + 0 -0.00416 13.7 45.6 0.00106 0 0 0 WorldPhysical initStep + 1 -0.0267 13.7 45.6 0 0.00106 0.0624 0.0624 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0 -17 28.4 0.00151 0 0 0 WorldPhysical initStep - 1 -0.0316 -17 28.4 0 0.00151 0.105 0.105 WorldPhysical eIoni + 0 -0.00055 2.91 9.72 0.00122 0 0 0 WorldPhysical initStep + 1 0.0273 2.91 9.72 0 0.00122 0.0763 0.0763 WorldPhysical eIoni +0 events have been kept for refreshing and/or reviewing. + "/vis/reviewKeptEvents" to review them one by one. + "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. ********************************************************************************************************* * G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 @@ -3640,10 +2747,47 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -60 100 1e+03 0.0127 117 117 DriftChamberPhysical CoupledTransportation - 2 -0.266 -540 900 1e+03 0.0197 933 1.05e+03 WorldPhysical CoupledTransportation - 3 -0.28 -570 950 1e+03 0.00868 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 4 -0.28 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 1 0 -27.7 92.4 1e+03 0.0124 96.5 96.5 WorldPhysical hIoni + 2 0.00155 -30 100 1e+03 0.00123 7.91 104 DriftChamberPhysical CoupledTransportation + 3 0.0375 -76.4 254 1e+03 0.00343 161 266 DriftChamberPhysical hIoni + 4 0.0475 -85.8 286 1e+03 0.000486 32.8 299 DriftChamberPhysical hIoni + 5 0.244 -270 900 1e+03 0.00965 641 940 WorldPhysical CoupledTransportation + 6 0.261 -285 950 1e+03 0.00888 52.2 992 WorldPhysical fastSimProcess_parallelGeom + 7 0.261 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.0475 -85.8 286 0.00228 0 0 0 DriftChamberPhysical initStep + 1 0.0261 -86.6 286 0 0.00228 1.12 1.12 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.0375 -76.4 254 0.00692 0 0 0 DriftChamberPhysical initStep + 1 -2.6 -77.6 254 0.00442 0.00251 3.16 3.16 DriftChamberPhysical eIoni + 2 -4.12 -78.2 254 0.00166 0.00136 1.85 5 DriftChamberPhysical eIoni + 3 -3.97 -78.7 254 0 0.00166 0.669 5.67 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 3 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -4.12 -78.2 254 0.0014 0 0 0 DriftChamberPhysical initStep + 1 -4.45 -78.3 254 0 0.0014 0.508 0.508 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 -27.7 92.4 0.00338 0 0 0 WorldPhysical initStep + 1 0.115 -27.6 92.5 0 0.00338 0.386 0.386 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 @@ -3651,46 +2795,70 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0 -60 100 1e+03 0.0157 117 117 DriftChamberPhysical CoupledTransportation - 2 -0.0287 -234 391 1e+03 0.00993 339 456 DriftChamberPhysical hIoni - 3 -0.0294 -241 403 1e+03 0.000159 13.5 469 DriftChamberPhysical hIoni - 4 -0.0794 -540 900 1e+03 0.0124 580 1.05e+03 WorldPhysical CoupledTransportation - 5 -0.0794 -540 901 1e+03 0.000101 0.841 1.05e+03 WorldPhysical hIoni - 6 -0.0788 -553 921 1e+03 0.00254 24 1.07e+03 WorldPhysical hIoni - 7 -0.0837 -570 950 1e+03 0.00857 33.5 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 8 -0.0837 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 1 0 -30 100 1e+03 0.0167 104 104 DriftChamberPhysical CoupledTransportation + 2 0.000144 -32.4 108 1e+03 6.46e-05 8.19 113 DriftChamberPhysical hIoni + 3 0.00544 -66.4 221 1e+03 0.00236 118 231 DriftChamberPhysical hIoni + 4 0.0219 -270 900 1e+03 0.0154 709 940 WorldPhysical CoupledTransportation + 5 0.0219 -270 901 1e+03 7.58e-05 0.873 941 WorldPhysical hIoni + 6 0.017 -282 940 1e+03 0.00468 41.2 982 WorldPhysical hIoni + 7 0.0167 -284 946 1e+03 0.00111 6.03 988 WorldPhysical hIoni + 8 0.0165 -285 950 1e+03 0.000561 4.14 992 WorldPhysical fastSimProcess_parallelGeom + 9 0.0165 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.0167 -284 946 0.00156 0 0 0 WorldPhysical initStep + 1 0.0471 -284 946 0 0.00156 0.11 0.11 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0788 -553 921 0.00289 0 0 0 WorldPhysical initStep - 1 0.0421 -553 921 0 0.00289 0.295 0.295 WorldPhysical eIoni + 0 0.017 -282 940 0.0101 0 0 0 WorldPhysical initStep + 1 0.00421 -283 940 0.00764 0.00247 1.85 1.85 WorldPhysical eIoni + 2 -0.376 -283 939 0.00166 0.00598 1.39 3.24 WorldPhysical eIoni + 3 -0.353 -283 939 0 0.00166 0.121 3.36 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0794 -540 901 0.00117 0 0 0 WorldPhysical initStep - 1 -0.0657 -540 901 0 0.00117 0.0715 0.0715 WorldPhysical eIoni + 0 0.0219 -270 901 0.0023 0 0 0 WorldPhysical initStep + 1 0.1 -270 901 0 0.0023 0.203 0.203 WorldPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0294 -241 403 0.00203 0 0 0 DriftChamberPhysical initStep - 1 0.613 -242 402 0 0.00203 0.934 0.934 DriftChamberPhysical eIoni + 0 0.00544 -66.4 221 0.0102 0 0 0 DriftChamberPhysical initStep + 1 1.6 -62.4 223 0.00843 0.00178 4.93 4.93 DriftChamberPhysical eIoni + 2 2.27 -59 224 0.00703 0.00139 3.9 8.84 DriftChamberPhysical eIoni + 3 4.15 -56.7 225 0.00451 0.00252 3.21 12 DriftChamberPhysical eIoni + 4 4.87 -55.6 225 0.00235 0.0011 1.5 13.5 DriftChamberPhysical eIoni + 5 5.59 -55.4 225 0 0.00235 1.17 14.7 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 3 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 4.87 -55.6 225 0.00106 0 0 0 DriftChamberPhysical initStep + 1 4.93 -55.4 225 0 0.00106 0.33 0.33 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.0287 -234 391 0.00187 0 0 0 DriftChamberPhysical initStep - 1 0.552 -234 391 0 0.00187 0.814 0.814 DriftChamberPhysical eIoni + 0 0.000144 -32.4 108 0.00441 0 0 0 DriftChamberPhysical initStep + 1 -0.0872 -30.6 108 0.00277 0.00165 2.11 2.11 DriftChamberPhysical eIoni + 2 0.243 -29.8 109 0 0.00277 1.41 3.52 DriftChamberPhysical eIoni ********************************************************************************************************* * G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 @@ -3698,49 +2866,266 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep - 1 0.000642 -9.39 15.6 1e+03 0.00369 18.2 18.2 WorldPhysical hIoni - 2 0.00494 -55.6 92.7 1e+03 0.0115 89.8 108 WorldPhysical hIoni - 3 0.00579 -60 100 1e+03 0.00157 8.54 117 DriftChamberPhysical CoupledTransportation - 4 0.0206 -134 223 1e+03 0.00245 144 260 DriftChamberPhysical hIoni - 5 0.058 -540 900 1e+03 0.0168 789 1.05e+03 WorldPhysical CoupledTransportation - 6 0.0583 -543 904 1e+03 0.00124 4.98 1.05e+03 WorldPhysical hIoni - 7 0.0622 -570 950 1e+03 0.00807 53.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - 8 0.0622 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0583 -543 904 0.00392 0 0 0 WorldPhysical initStep - 1 -0.00805 -542 904 0 0.00392 0.5 0.5 WorldPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.0206 -134 223 0.00502 0 0 0 DriftChamberPhysical initStep - 1 2.09 -134 224 0.00394 0.00108 2.34 2.34 DriftChamberPhysical eIoni - 2 3.17 -134 225 0.00253 0.00141 1.92 4.27 DriftChamberPhysical eIoni - 3 3.88 -134 225 0 0.00253 1.28 5.55 DriftChamberPhysical eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.00494 -55.6 92.7 0.00386 0 0 0 WorldPhysical initStep - 1 -0.17 -55.5 92.7 0.00133 0.00253 0.4 0.4 WorldPhysical eIoni - 2 -0.198 -55.5 92.7 0 0.00133 0.0867 0.487 WorldPhysical eIoni + 1 0 -30 100 1e+03 0.0182 104 104 DriftChamberPhysical CoupledTransportation + 2 0.0769 -218 726 1e+03 0.014 654 758 DriftChamberPhysical hIoni + 3 0.096 -270 900 1e+03 0.00253 181 940 WorldPhysical CoupledTransportation + 4 0.101 -285 950 1e+03 0.00875 52.2 992 WorldPhysical fastSimProcess_parallelGeom + 5 0.101 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.000642 -9.39 15.6 0.00203 0 0 0 WorldPhysical initStep - 1 0.0183 -9.33 15.7 0 0.00203 0.166 0.166 WorldPhysical eIoni + 0 0.0769 -218 726 0.0016 0 0 0 DriftChamberPhysical initStep + 1 0.0627 -218 726 0 0.0016 0.631 0.631 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 -6.68 22.3 1e+03 0.00488 23.3 23.3 WorldPhysical hIoni + 2 0.000979 -16.2 54.1 1e+03 0.00469 33.2 56.4 WorldPhysical hIoni + 3 0.00153 -23.8 79.4 1e+03 0.00534 26.5 82.9 WorldPhysical hIoni + 4 0.000531 -30 100 1e+03 0.00476 21.5 104 DriftChamberPhysical CoupledTransportation + 5 -0.0176 -270 900 1e+03 0.0178 835 940 WorldPhysical CoupledTransportation + 6 -0.0166 -285 950 1e+03 0.0077 52.2 992 WorldPhysical fastSimProcess_parallelGeom + 7 -0.0166 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.00153 -23.8 79.4 0.00149 0 0 0 WorldPhysical initStep + 1 0.0406 -23.8 79.4 0 0.00149 0.102 0.102 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.000979 -16.2 54.1 0.00328 0 0 0 WorldPhysical initStep + 1 0.0404 -16.4 54 0 0.00328 0.366 0.366 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 -6.68 22.3 0.00186 0 0 0 WorldPhysical initStep + 1 -0.0426 -6.72 22.3 0 0.00186 0.145 0.145 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 -11.2 37.4 1e+03 0.00586 39.1 39.1 WorldPhysical hIoni + 2 -0.000992 -27.6 91.9 1e+03 0.00892 56.8 95.9 WorldPhysical hIoni + 3 -0.000801 -28.1 93.8 1e+03 0.000177 1.95 97.9 WorldPhysical hIoni + 4 -0.000435 -30 100 1e+03 0.00101 6.52 104 DriftChamberPhysical CoupledTransportation + 5 0.0136 -105 350 1e+03 0.00775 261 366 DriftChamberPhysical hIoni + 6 0.0478 -270 900 1e+03 0.00999 574 940 WorldPhysical CoupledTransportation + 7 0.0516 -285 950 1e+03 0.00804 52.2 992 WorldPhysical fastSimProcess_parallelGeom + 8 0.0516 -285 950 0 1e+03 0 992 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.0136 -105 350 0.00139 0 0 0 DriftChamberPhysical initStep + 1 0.0541 -105 350 0 0.00139 0.501 0.501 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.000801 -28.1 93.8 0.00216 0 0 0 WorldPhysical initStep + 1 0.0738 -28.1 93.8 0 0.00216 0.183 0.183 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.000992 -27.6 91.9 0.00132 0 0 0 WorldPhysical initStep + 1 0.0323 -27.6 91.9 0 0.00132 0.0859 0.0859 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 -11.2 37.4 0.00713 0 0 0 WorldPhysical initStep + 1 -0.00183 -11.6 37.4 0.00433 0.00163 0.502 0.502 WorldPhysical eIoni + 2 -0.0458 -11.8 37.5 0 0.00433 0.594 1.1 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 2 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.00183 -11.6 37.4 0.00117 0 0 0 WorldPhysical initStep + 1 0.0224 -11.6 37.4 0 0.00117 0.0716 0.0716 WorldPhysical eIoni +0 events have been kept for refreshing and/or reviewing. + "/vis/reviewKeptEvents" to review them one by one. + "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 -60 100 1e+03 0.0142 117 117 DriftChamberPhysical CoupledTransportation + 2 -0.0126 -373 622 1e+03 0.0118 608 725 DriftChamberPhysical hIoni + 3 0.046 -540 900 1e+03 0.00574 324 1.05e+03 WorldPhysical CoupledTransportation + 4 0.0582 -570 950 1e+03 0.00874 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 5 0.0582 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.0126 -373 622 0.00103 0 0 0 DriftChamberPhysical initStep + 1 -0.229 -373 622 0 0.00103 0.316 0.316 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 2.9e-05 -4.01 6.69 1e+03 0.000615 7.8 7.8 WorldPhysical hIoni + 2 0.00269 -60 100 1e+03 0.0181 109 117 DriftChamberPhysical CoupledTransportation + 3 0.00732 -71.5 119 1e+03 0.000276 22.4 139 DriftChamberPhysical hIoni + 4 0.12 -540 900 1e+03 0.021 910 1.05e+03 WorldPhysical CoupledTransportation + 5 0.122 -570 950 1e+03 0.00693 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 6 0.122 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.00732 -71.5 119 0.00982 0 0 0 DriftChamberPhysical initStep + 1 4.16 -73 119 0.00859 0.00123 4.7 4.7 DriftChamberPhysical eIoni + 2 7.6 -74.3 118 0.00595 0.00265 3.99 8.69 DriftChamberPhysical eIoni + 3 9.91 -75.1 119 0.0051 0.000844 2.72 11.4 DriftChamberPhysical eIoni + 4 11.9 -75.8 118 0.00195 0.00315 2.38 13.8 DriftChamberPhysical eIoni + 5 12.4 -76.3 118 0 0.00195 0.875 14.7 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 2.9e-05 -4.01 6.69 0.00125 0 0 0 WorldPhysical initStep + 1 -0.0161 -4.04 6.68 0 0.00125 0.0792 0.0792 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 -21.1 35.2 1e+03 0.00502 41 41 WorldPhysical hIoni + 2 -0.0101 -60 100 1e+03 0.0116 75.6 117 DriftChamberPhysical CoupledTransportation + 3 -0.0456 -266 443 1e+03 0.00786 400 517 DriftChamberPhysical hIoni + 4 -0.0748 -540 900 1e+03 0.0105 533 1.05e+03 WorldPhysical CoupledTransportation + 5 -0.0839 -570 950 1e+03 0.0104 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 6 -0.0839 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.0456 -266 443 0.0013 0 0 0 DriftChamberPhysical initStep + 1 -0.179 -266 443 0 0.0013 0.454 0.454 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 -21.1 35.2 0.00126 0 0 0 WorldPhysical initStep + 1 0.00831 -21.1 35.2 0 0.00126 0.0795 0.0795 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 -36.5 60.8 1e+03 0.0115 70.9 70.9 WorldPhysical hIoni + 2 0.00747 -60 100 1e+03 0.00596 45.7 117 DriftChamberPhysical CoupledTransportation + 3 0.0607 -314 524 1e+03 0.0105 494 611 DriftChamberPhysical hIoni + 4 0.109 -540 900 1e+03 0.00926 439 1.05e+03 WorldPhysical CoupledTransportation + 5 0.116 -570 950 1e+03 0.00886 58.3 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 6 0.116 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0.0607 -314 524 0.00217 0 0 0 DriftChamberPhysical initStep + 1 -0.637 -315 524 0 0.00217 1.04 1.04 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 -36.5 60.8 0.0015 0 0 0 WorldPhysical initStep + 1 -0.0348 -36.5 60.8 0 0.0015 0.104 0.104 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = pi-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 0 0 0 1e+03 0 0 0 WorldPhysical initStep + 1 0 -60 100 1e+03 0.0142 117 117 DriftChamberPhysical CoupledTransportation + 2 -0.0116 -350 583 1e+03 0.0107 563 680 DriftChamberPhysical hIoni + 3 -0.0177 -493 822 1e+03 0.00487 278 958 DriftChamberPhysical hIoni + 4 -0.0295 -540 900 1e+03 0.00254 91.2 1.05e+03 WorldPhysical CoupledTransportation + 5 -0.0306 -545 909 1e+03 0.00151 10.5 1.06e+03 WorldPhysical hIoni + 6 -0.0376 -570 950 1e+03 0.00642 47.8 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + 7 -0.0376 -570 950 0 1e+03 0 1.11e+03 WorldPhysical fastSimProcess_parallelGeom + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.0306 -545 909 0.00116 0 0 0 WorldPhysical initStep + 1 -0.034 -545 909 0 0.00116 0.0707 0.0707 WorldPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.0177 -493 822 0.00129 0 0 0 DriftChamberPhysical initStep + 1 0.288 -493 822 0 0.00129 0.447 0.447 DriftChamberPhysical eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.0116 -350 583 0.00471 0 0 0 DriftChamberPhysical initStep + 1 -1.92 -349 583 0.00378 0.000934 2.22 2.22 DriftChamberPhysical eIoni + 2 -1.42 -348 584 0 0.00378 1.86 4.09 DriftChamberPhysical eIoni 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. diff --git a/examples/extended/parameterisations/Par02/.README.txt b/examples/extended/parameterisations/Par02/.README.txt deleted file mode 100644 index aa39273ae7..0000000000 --- a/examples/extended/parameterisations/Par02/.README.txt +++ /dev/null @@ -1,250 +0,0 @@ - -///\file "parameterisations/Par02/.README.txt" -///\brief Example Par02 README page - -/*! \page ExamplePar02 Example Par02 - - This example is a simplified version of a Geant4-based fast simulation - program written by Anna Zaborowska for Future Circular Collider (FCC) - studies. - - This example shows how to do "track and energy smearing" in Geant4, - in order to have a very fast simulation based on assumed detector - resolutions. - - The geometry which is considered is a simplified collider detector set-up, - inspired by ALEPH/ATLAS/CMS detectors. Although it is much simpler than - a realistic detector, it is anyhow fairly complex and therefore build up - from a GDML file, Par02FullDetector.gdml . - - In this example: - - Particles with transverse momentum less than 1 MeV or pseudorapidity - larger (in module) than 5.5 are neglected (i.e. the corresponding - Geant4 track is killed as soon as it is created). - - Any primary charged particle is smeared in the tracker as follows: - its momentum is smeared according to a gaussian, with mean equal to 1.0 - and sigma taken from the momentum resolution of the CMS tracker - (with ALEPH or ATLAS tracker as a possible alternative), and then placed - at the end of the tracker, at the position that it would reach if - normally transported (i.e. without smearing). - - Any primary electron, or positron, or gamma is smeared in the - electromagnetic calorimeter as follows: it is killed at the entrance - of the electromagnetic calorimeter, with a deposited energy equal to - the gaussian smearing (with mean equal to 1.0 and sigma taken from the - energy resolution of the CMS electromagnetic calorimeter - with ALEPH or - ATLAS electromagnetic calorimeter as a possible alternative) of its - kinetic energy (at the entrance of the electromagnetic calorimeter). - - Any primary hadron is smeared in the hadronic calorimeter as follows: - it is killed at the entrance of the hadronic calorimeter, with a - deposited energy equal to the gaussian smearing (with mean equal to 1.0 - and sigma taken from the energy resolution of the CMS hadronic - calorimeter - with ALEPH or ATLAS hadronic calorimeter as a possible - alternative) of its kinetic energy (at the entrance of the hadronic - calorimeter). - - The only competing physical processes with respect to the above physics - parametrisations are the decays. - Note: no electromagnetic processes; - no momentum smearing in the tracker for secondary particles; - secondary electrons, positrons, gammas in the electromagnetic - calorimeter are killed (at the entrance) but without any - energy deposition; - secondary hadrons in the hadronic calorimeter are killed (at the - entrance) but without any energy deposition. - - - Below some details. - - - \section Par02_s1 Detector description - - The geometry is read in from a GDML file, Par02FullDetector.gdml . - - The geometry is a simplified collider detector set-up used for the - first FCC studies, inspired by ALEPH/ATLAS/CMS detectors. - It is made of 4 main parts: - - Tracker - - Electromagnetic calorimeter - - Hadronic calorimeter - - Muon subdetector - - In this example, fast simulation parametrisation models exist for the - first three subdetectors, but not for the Muon subdetector. - The three parametrisation models: - - Par02FastSimModelTracker : in the tracker - - Par02FastSimModelEMCal : in the electromagnetic calorimeter - - Par02FastSimModelHCal : in the hadronic calorimeter - are build and bound to the respective subdetector (i.e. Geant4 regions) - in the method: Par02DetectorConstruction::Construct() . - - Three configurations are possible for those parametrisation models: - CMS-like, ALEPH-like, ATLAS-like. - By default, the CMS configuration is used. - - - \section Par02_s2 Primary generation - - In this example we use a very simple primary generation action, - Par02PrimaryGeneratorAction, that uses the G4ParticleGun. - One single particle type, with a well defined energy, and in one fixed - direction is used for each run: the corresponding values can be set via - macro commands. See examplePar02.in as an example. - - For the FCC studies, Pythia8 events in HepMC format were used for the - generation of the primary particles. - - - \section Par02_s3 Physics List - - A special, ad-hoc physics list is used in this example, in order to have - an ultra-fast parametrised simulation: for all particles, the only two - physics processes that are assigned are the decay process and the fast - simulation process. - The following three fast simulation models are defined: - - - Par02FastSimModelTracker : - - bound to the tracker - (see the method Par02DetectorConstruction::Construct ) - - applicable to all charged particles - (see the method Par02FastSimModelTracker::IsApplicable ) - - triggered in all cases (i.e. no kinematic constraints) - (see the method Par02FastSimModelTracker::ModelTrigger ) - - does the following: place the particle at the tracking detector exit - (at the place the particle would reach without smearing), and, only - if the particle is a primary, it smears the momentum of the particle - according to a gaussian, with mean equal to 1.0 and sigma taken from - the momentum resolution of the CMS tracker (with ALEPH or ATLAS tracker - as a possible alternative) - (see the method Par02FastSimModelTracker::DoIt ) - - - Par02FastSimModelEMCal : - - bound to the electromagnetic calorimeter - (see the method Par02DetectorConstruction::Construct ) - - applicable to electrons, positrons, gammas - (see the method Par02FastSimModelEMCal::IsApplicable ) - - triggered in all cases (i.e. no kinematic constraints) - (see the method Par02FastSimModelEMCal::ModelTrigger ) - - does the following: kill the particle at the entrance of the - electromagnetic calorimeter, and, only if the particle is a primary, - it deposits in the electromagnetic calorimeter an energy obtained - by a gaussian smearing (with mean equal to 1.0 and sigma taken from the - energy resolution of the CMS electromagnetic calorimeter - with ALEPH - or ATLAS electromagnetic calorimeter as a possible alternative) of the - particle kinetic energy (at the entrance of the electromagnetic - calorimeter) - (see the method Par02FastSimModelEMCal::DoIt ) - - - Par02FastSimModelHCal : - - bound to the hadronic calorimeter - (see the method Par02DetectorConstruction::Construct ) - - applicable to all hadrons (i.e. particles made of quarks) - (see the method Par02FastSimModelHCal::IsApplicable ) - - triggered in all cases (i.e. no kinematic constraints) - (see the method Par02FastSimModelHCal::ModelTrigger ) - - does the following: kill the particle at the entrance of the - hadronic calorimeter, and, only if the particle is a primary, - it deposits in the hadronic calorimeter an energy obtained by a - gaussian smearing (with mean equal to 1.0 and sigma taken from the - energy resolution of the CMS hadronic calorimeter - with ALEPH - or ATLAS hadronic calorimeter as a possible alternative) of the - particle kinetic energy (at the entrance of the hadronic - calorimeter) - (see the method Par02FastSimModelHCal::DoIt ) - - - \section Par02_s4 User actions, user information and user utility classes - - - Par02RunAction : run action used for initialization and termination - of the run. - - - Par02EventAction : event action used for initialization and termination - of the event. - - - Par02TrackingAction : tracking action used for killing particles with - transverse momentum less than 1 MeV or - pseudorapidity larger (in module) than 5.5 - (see method Par02TrackingAction::PreUserTrackingAction ) - and to store the information about the track at - the end of the simulation of such a track - (see method Par02TrackingAction::PostUserTrackingAction ). - - - Par02ActionInitialization : initialization of the primary generator class - and all user-defined actions (i.e. the three - classes above). - - - Par02PrimaryParticleInformation : utility class to store information - associated with a primary particle. - - - Par02EventInformation : utility class to store information associated - with a Geant4 event. - - - Par02DetectorParametrisation : a simple class used to provide the detector - resolution and efficiency, according to the - type of detector: tracker, electromagnetic - calorimeter, hadronic calorimeter. - There are 3 choices: CMS-like (default), - ALEPH-like and ATLAS-like. - The efficiency is currently set to 1.0 in - all cases and not used. - - - Par02Smearer : a simple class that does the gaussian smearing, either - of the momentum (in the tracker detector) or in energy - (in the electromagnetic or hadronic calorimeter). - - - \section Par02_s5 Output - - The execution of the program (examplePar02) produces in output, at the end - of a run, a Root file, by default named DefaultOutput.root, which contains - 3 histograms and one ntuple. - - The macro file examplePar02.in specifies one run made of 1000 events - each consisting of one 50 GeV electron. - By editing the file, one could select alternatively a run made of 1000 - events each consisting of one 100 GeV muon, or a run made of 1000 events - each consisting of one 20 GeV pion- . - - See the class Par02Output for the definition of the 3 histograms and the - ntuples. Here is a quick summary: - - histogram of the ratio of the momentum smeared and the original momentum - in the tracker (for primary charged particles); - - histogram of the ratio of the smeared energy deposited and the original - energy at the entrance in the electromagnetic calorimeter (for primary - electrons, positrons and gammas); - - histogram of the ratio of the smeared energy deposited and the original - energy at the entrance in the hadronic calorimeter (for primary hadrons); - - ntuple containing the "Monte-Carlo true" information regarding the - primary, and the resolution, efficiency, smeared momentum (tracker), - smeared energy (calorimeter) and impact position (calorimeter) of each - subdetector (tracker, electromagnetic calorimeter, hadronic calorimeter) - where the primary is parametrised (tracker and electromagnetic calorimeter - in the case of primary electrons, positrons and gammas; tracker and - hadronic calorimeter in the case of primary hadrons; tracker only for - all other primary charged particles, e.g. muons). - - Note: - - you do not need to have the Root package available to run this example, - but you need it if you want to look at the histograms and the ntuple - contained in the Root output file; - - because the class Par02Output is a singleton, this example must be run - in sequential mode, not in multi-threaded mode; - - sensitive detectors and hits are not used in this example. - - - \section Par02_s6 How to build and run the example - -- You need to have built the Geant4 persistency/gdml module by having set - the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR=path_to_xercesc flag pointing to - the path where the XercesC XML parser package is installed in your system. - -- Compile and link to generate the executable (in your CMAKE build directory): -\verbatim - % make -\endverbatim -- Execute the application: -\verbatim - % examplePar02 examplePar02.in -\endverbatim - which produces one Root file: DefaultOutput.root . - -*/ diff --git a/examples/extended/parameterisations/Par02/CMakeLists.txt b/examples/extended/parameterisations/Par02/CMakeLists.txt index f00c43fbef..222a6d417a 100644 --- a/examples/extended/parameterisations/Par02/CMakeLists.txt +++ b/examples/extended/parameterisations/Par02/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(Par02) #---------------------------------------------------------------------------- diff --git a/examples/extended/parameterisations/Par02/History b/examples/extended/parameterisations/Par02/History index 22745b50e5..3b48807ed0 100644 --- a/examples/extended/parameterisations/Par02/History +++ b/examples/extended/parameterisations/Par02/History @@ -14,6 +14,15 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06-10-21 I. Hrivnacova (expar02-V10-07-01) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root). + +19-07-21 I. Hrivnacova (expar02-V10-07-00) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 10-11-20 B. Morgan (expar02-V10-06-00) - Migration to G4RunManagerFactory. diff --git a/examples/extended/parameterisations/Par02/README b/examples/extended/parameterisations/Par02/README deleted file mode 100644 index c59af89f06..0000000000 --- a/examples/extended/parameterisations/Par02/README +++ /dev/null @@ -1,254 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example Par02 - ------------- - - This example is a simplified version of a Geant4-based fast simulation - program written by Anna Zaborowska for Future Circular Collider (FCC) - studies. - - This example shows how to do "track and energy smearing" in Geant4, - in order to have a very fast simulation based on assumed detector - resolutions. - - The geometry which is considered is a simplified collider detector set-up, - inspired by ALEPH/ATLAS/CMS detectors. Although it is much simpler than - a realistic detector, it is anyhow fairly complex and therefore build up - from a GDML file, Par02FullDetector.gdml . - - In this example: - - Particles with transverse momentum less than 1 MeV or pseudorapidity - larger (in module) than 5.5 are neglected (i.e. the corresponding - Geant4 track is killed as soon as it is created). - - Any primary charged particle is smeared in the tracker as follows: - its momentum is smeared according to a gaussian, with mean equal to 1.0 - and sigma taken from the momentum resolution of the CMS tracker - (with ALEPH or ATLAS tracker as a possible alternative), and then placed - at the end of the tracker, at the position that it would reach if - normally transported (i.e. without smearing). - - Any primary electron, or positron, or gamma is smeared in the - electromagnetic calorimeter as follows: it is killed at the entrance - of the electromagnetic calorimeter, with a deposited energy equal to - the gaussian smearing (with mean equal to 1.0 and sigma taken from the - energy resolution of the CMS electromagnetic calorimeter - with ALEPH or - ATLAS electromagnetic calorimeter as a possible alternative) of its - kinetic energy (at the entrance of the electromagnetic calorimeter). - - Any primary hadron is smeared in the hadronic calorimeter as follows: - it is killed at the entrance of the hadronic calorimeter, with a - deposited energy equal to the gaussian smearing (with mean equal to 1.0 - and sigma taken from the energy resolution of the CMS hadronic - calorimeter - with ALEPH or ATLAS hadronic calorimeter as a possible - alternative) of its kinetic energy (at the entrance of the hadronic - calorimeter). - - The only competing physical processes with respect to the above physics - parametrisations are the decays. - Note: no electromagnetic processes; - no momentum smearing in the tracker for secondary particles; - secondary electrons, positrons, gammas in the electromagnetic - calorimeter are killed (at the entrance) but without any - energy deposition; - secondary hadrons in the hadronic calorimeter are killed (at the - entrance) but without any energy deposition. - - - Below some details. - - - 1. Detector description - ----------------------- - - The geometry is read in from a GDML file, Par02FullDetector.gdml . - - The geometry is a simplified collider detector set-up used for the - first FCC studies, inspired by ALEPH/ATLAS/CMS detectors. - It is made of 4 main parts: - - Tracker - - Electromagnetic calorimeter - - Hadronic calorimeter - - Muon subdetector - - In this example, fast simulation parametrisation models exist for the - first three subdetectors, but not for the Muon subdetector. - The three parametrisation models: - - Par02FastSimModelTracker : in the tracker - - Par02FastSimModelEMCal : in the electromagnetic calorimeter - - Par02FastSimModelHCal : in the hadronic calorimeter - are build and bound to the respective subdetector (i.e. Geant4 regions) - in the method: Par02DetectorConstruction::Construct() . - - Three configurations are possible for those parametrisation models: - CMS-like, ALEPH-like, ATLAS-like. - By default, the CMS configuration is used. - - - 2. Primary generation - --------------------- - - In this example we use a very simple primary generation action, - Par02PrimaryGeneratorAction, that uses the G4ParticleGun. - One single particle type, with a well defined energy, and in one fixed - direction is used for each run: the corresponding values can be set via - macro commands. See examplePar02.in as an example. - - For the FCC studies, Pythia8 events in HepMC format were used for the - generation of the primary particles. - - - 3. Physics List - --------------- - - A special, ad-hoc physics list is used in this example, in order to have - an ultra-fast parametrised simulation: for all particles, the only two - physics processes that are assigned are the decay process and the fast - simulation process. - The following three fast simulation models are defined: - - - Par02FastSimModelTracker : - - bound to the tracker - (see the method Par02DetectorConstruction::Construct ) - - applicable to all charged particles - (see the method Par02FastSimModelTracker::IsApplicable ) - - triggered in all cases (i.e. no kinematic constraints) - (see the method Par02FastSimModelTracker::ModelTrigger ) - - does the following: place the particle at the tracking detector exit - (at the place the particle would reach without smearing), and, only - if the particle is a primary, it smears the momentum of the particle - according to a gaussian, with mean equal to 1.0 and sigma taken from - the momentum resolution of the CMS tracker (with ALEPH or ATLAS tracker - as a possible alternative) - (see the method Par02FastSimModelTracker::DoIt ) - - - Par02FastSimModelEMCal : - - bound to the electromagnetic calorimeter - (see the method Par02DetectorConstruction::Construct ) - - applicable to electrons, positrons, gammas - (see the method Par02FastSimModelEMCal::IsApplicable ) - - triggered in all cases (i.e. no kinematic constraints) - (see the method Par02FastSimModelEMCal::ModelTrigger ) - - does the following: kill the particle at the entrance of the - electromagnetic calorimeter, and, only if the particle is a primary, - it deposits in the electromagnetic calorimeter an energy obtained - by a gaussian smearing (with mean equal to 1.0 and sigma taken from the - energy resolution of the CMS electromagnetic calorimeter - with ALEPH - or ATLAS electromagnetic calorimeter as a possible alternative) of the - particle kinetic energy (at the entrance of the electromagnetic - calorimeter) - (see the method Par02FastSimModelEMCal::DoIt ) - - - Par02FastSimModelHCal : - - bound to the hadronic calorimeter - (see the method Par02DetectorConstruction::Construct ) - - applicable to all hadrons (i.e. particles made of quarks) - (see the method Par02FastSimModelHCal::IsApplicable ) - - triggered in all cases (i.e. no kinematic constraints) - (see the method Par02FastSimModelHCal::ModelTrigger ) - - does the following: kill the particle at the entrance of the - hadronic calorimeter, and, only if the particle is a primary, - it deposits in the hadronic calorimeter an energy obtained by a - gaussian smearing (with mean equal to 1.0 and sigma taken from the - energy resolution of the CMS hadronic calorimeter - with ALEPH - or ATLAS hadronic calorimeter as a possible alternative) of the - particle kinetic energy (at the entrance of the hadronic - calorimeter) - (see the method Par02FastSimModelHCal::DoIt ) - - - 4. User actions, user information and user utility classes - ---------------------------------------------------------- - - - Par02RunAction : run action used for initialization and termination - of the run. - - - Par02EventAction : event action used for initialization and termination - of the event. - - - Par02TrackingAction : tracking action used for killing particles with - transverse momentum less than 1 MeV or - pseudorapidity larger (in module) than 5.5 - (see method Par02TrackingAction::PreUserTrackingAction ) - and to store the information about the track at - the end of the simulation of such a track - (see method Par02TrackingAction::PostUserTrackingAction ). - - - Par02ActionInitialization : initialization of the primary generator class - and all user-defined actions (i.e. the three - classes above). - - - Par02PrimaryParticleInformation : utility class to store information - associated with a primary particle. - - - Par02EventInformation : utility class to store information associated - with a Geant4 event. - - - Par02DetectorParametrisation : a simple class used to provide the detector - resolution and efficiency, according to the - type of detector: tracker, electromagnetic - calorimeter, hadronic calorimeter. - There are 3 choices: CMS-like (default), - ALEPH-like and ATLAS-like. - The efficiency is currently set to 1.0 in - all cases and not used. - - - Par02Smearer : a simple class that does the gaussian smearing, either - of the momentum (in the tracker detector) or in energy - (in the electromagnetic or hadronic calorimeter). - - - 5. Output - --------- - - The execution of the program (examplePar02) produces in output, at the end - of a run, a Root file, by default named DefaultOutput.root, which contains - 3 histograms and one ntuple. - - The macro file examplePar02.in specifies one run made of 1000 events - each consisting of one 50 GeV electron. - By editing the file, one could select alternatively a run made of 1000 - events each consisting of one 100 GeV muon, or a run made of 1000 events - each consisting of one 20 GeV pion- . - - See the class Par02Output for the definition of the 3 histograms and the - ntuples. Here is a quick summary: - - histogram of the ratio of the momentum smeared and the original momentum - in the tracker (for primary charged particles); - - histogram of the ratio of the smeared energy deposited and the original - energy at the entrance in the electromagnetic calorimeter (for primary - electrons, positrons and gammas); - - histogram of the ratio of the smeared energy deposited and the original - energy at the entrance in the hadronic calorimeter (for primary hadrons); - - ntuple containing the "Monte-Carlo true" information regarding the - primary, and the resolution, efficiency, smeared momentum (tracker), - smeared energy (calorimeter) and impact position (calorimeter) of each - subdetector (tracker, electromagnetic calorimeter, hadronic calorimeter) - where the primary is parametrised (tracker and electromagnetic calorimeter - in the case of primary electrons, positrons and gammas; tracker and - hadronic calorimeter in the case of primary hadrons; tracker only for - all other primary charged particles, e.g. muons). - - Note: - - you do not need to have the Root package available to run this example, - but you need it if you want to look at the histograms and the ntuple - contained in the Root output file; - - sensitive detectors and hits are not used in this example. - - - 6. How to build and run the example - ----------------------------------- - -- You need to have built the Geant4 persistency/gdml module by having set - the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR= flag pointing to - the path where the XercesC XML parser package is installed in your system. - -- Compile and link to generate the executable (in your CMAKE build directory): - % make - -- Execute the application: - % examplePar02 examplePar02.in - - which produces one Root file: DefaultOutput.root . - diff --git a/examples/extended/parameterisations/Par02/examplePar02.out b/examples/extended/parameterisations/Par02/examplePar02.out index 1462f44f8f..e1b739ddf5 100644 --- a/examples/extended/parameterisations/Par02/examplePar02.out +++ b/examples/extended/parameterisations/Par02/examplePar02.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -29,27 +29,27 @@ G4GDML: Reading 'Par02FullDetector.gdml' done! Stripping off GDML names of materials, solids and volumes ... Geometry loaded from file .......Par02FullDetector.gdml -hcal !!! - -hcal !!! - -hcal !!! - -hcal !!! - -hcal !!! - -ecal !!! - -ecal !!! - -ecal !!! - ecal !!! ecal !!! tracker !!! + +ecal !!! + +ecal !!! + +ecal !!! + +hcal !!! + +hcal !!! + +hcal !!! + +hcal !!! + +hcal !!! Warning : Region does not have specific production cuts, even though it appears in the current tracking world. Default cuts are used for this region. @@ -95,10 +95,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -143,7 +141,9 @@ Some /vis commands (optionally) take a string to specify colour. Magnetic field is active, fieldValue = (0 0 1 T ). G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. +... set ntuple merging row mode : row-wise - done ... create file : DefaultOutput.root - done +... open analysis file : DefaultOutput.root - done ... open analysis file : DefaultOutput.root - done ________Tracker model triggered _________ ________Tracker model triggered _________ diff --git a/examples/extended/parameterisations/Par02/src/Par02FastSimModelEMCal.cc b/examples/extended/parameterisations/Par02/src/Par02FastSimModelEMCal.cc index 7748a89499..eedcd29eaf 100644 --- a/examples/extended/parameterisations/Par02/src/Par02FastSimModelEMCal.cc +++ b/examples/extended/parameterisations/Par02/src/Par02FastSimModelEMCal.cc @@ -36,7 +36,7 @@ #include "G4Track.hh" #include "G4Event.hh" #include "G4RunManager.hh" -#include "g4root.hh" +#include "G4AnalysisManager.hh" #include "Randomize.hh" #include "G4SystemOfUnits.hh" diff --git a/examples/extended/parameterisations/Par02/src/Par02FastSimModelHCal.cc b/examples/extended/parameterisations/Par02/src/Par02FastSimModelHCal.cc index 6efc96bade..2420f5d244 100644 --- a/examples/extended/parameterisations/Par02/src/Par02FastSimModelHCal.cc +++ b/examples/extended/parameterisations/Par02/src/Par02FastSimModelHCal.cc @@ -36,7 +36,7 @@ #include "G4Track.hh" #include "G4Event.hh" #include "G4RunManager.hh" -#include "g4root.hh" +#include "G4AnalysisManager.hh" #include "Randomize.hh" #include "G4SystemOfUnits.hh" diff --git a/examples/extended/parameterisations/Par02/src/Par02FastSimModelTracker.cc b/examples/extended/parameterisations/Par02/src/Par02FastSimModelTracker.cc index 68072ebb43..158d8ec1ba 100644 --- a/examples/extended/parameterisations/Par02/src/Par02FastSimModelTracker.cc +++ b/examples/extended/parameterisations/Par02/src/Par02FastSimModelTracker.cc @@ -36,7 +36,7 @@ #include "G4Track.hh" #include "G4Event.hh" #include "G4RunManager.hh" -#include "g4root.hh" +#include "G4AnalysisManager.hh" #include "Randomize.hh" diff --git a/examples/extended/parameterisations/Par02/src/Par02Output.cc b/examples/extended/parameterisations/Par02/src/Par02Output.cc index be5dcb418f..60535e0373 100644 --- a/examples/extended/parameterisations/Par02/src/Par02Output.cc +++ b/examples/extended/parameterisations/Par02/src/Par02Output.cc @@ -34,7 +34,7 @@ #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" -#include "g4root.hh" +#include "G4AnalysisManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -51,7 +51,6 @@ Par02Output::Par02Output() : fFileNameWithRunNo( false ) { //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... Par02Output::~Par02Output() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -89,6 +88,7 @@ void Par02Output::StartAnalysis( G4int aRunID ) { fFileName += "_run"; fFileName += G4UIcommand::ConvertToString( aRunID ); } + analysisManager->SetDefaultFileType("root"); analysisManager->SetVerboseLevel( 1 ); analysisManager->SetFileName( fFileName ); analysisManager->OpenFile( fFileName ); diff --git a/examples/extended/parameterisations/Par03/.README.txt b/examples/extended/parameterisations/Par03/.README.txt deleted file mode 100644 index 3ffbc7bbb6..0000000000 --- a/examples/extended/parameterisations/Par03/.README.txt +++ /dev/null @@ -1,134 +0,0 @@ -///\file "parameterisations/Par03/.README.txt" -///\brief Example Par03 README page - -/*! \page ExamplePar03 Example Par03 - - This example demonstrates how to use G4FastSimHitMaker helper class - to create multiple energy deposits from the fast simulation model. - - It requires sensitive detector class to inherit from both base classes: - - G4VSensitiveDetector: for processing of detailed/non-fast simulation hits - - G4VFastSimSensitiveDetector: for processing of fast sim (G4FastSim) hits - Hits are placed in the same hit collection, so they can be used to - compare between the full and the fast simulation. - - The geometry used in the example is a homogeneous cylinder of lead, with - 3D readout geometry (cylindrical). Analysis of energy deposits is done - in the event action. - -\section Par03_s1 Detector description - - The detector is a homogeneous cylinder of lead. It is segmented along - z, R and phi to create a readout geometry in the cylindrical coordinates. - - Fast simulation is attached to the region of the detector. - - -\section Par03_s2 Sensitive detector - - Sensitive detector inherits from both base classes: - - G4VSensitiveDetector: for processing of detailed/non-fast simulation hits - - G4VFastSimSensitiveDetector: for processing of fast sim (G4FastSim) hits. - Hits are placed in the same hit collection, with a different flag to distinguish - between those originated in the full simulation, and those from the fast - simulation. - During visualisation, hits are represented as volumes of different colour: - green for full simulation and red for fast simulation. - -\section Par03_s3 Primary generation - - Particle gun is used as a primary generator. The direction of particles is along - the axis of symmetry of the detector (cylinder). It is positioned 10 cm in front - of the entrance to the detector. 10 GeV electron is used by default. Those values - can be changed using /gun/ UI commands. - -\section Par03_s4 Physics List - - FTFP_BERT modular physics list is used. On top of it, fast simulation physics - is registered for selected particles (electrons, positrons, and photons). - - -\section Par03_s5 User actions - - - Par03RunAction : run action used for initialization and termination - of the run. Histograms for analysis of shower development - in the detector are created. - - - Par03EventAction : event action used for initialization and termination - of the event. Analysis of shower development is performed - on event-by-event basis. - -\section Par03_s6 Output - - The execution of the program (examplePar03) produces an output with histograms. - - The macro file examplePar03.in specifies three runs. Each run is made of 100 - events, for single 10 GeV electron beams. The first run is executed with fast - simulation model activated with defualt parameters. The second run executes fast - simulation with modified parameters. For the third run the fast simulation model - is disactivated. - Three output files are produced: two with shower development from the fast - simulation (with different parameters), and from the full simulation. - -\section Par03_s7 How to build and run the example - -- Compile and link to generate the executable (in your CMAKE build directory): -\verbatim -% cmake -% make -\endverbatim - -- Execute the application (in batch mode): -\verbatim -% ./examplePar03 -m examplePar03.in -\endverbatim - which produces three root files: Par03_fastsim_100events.root, - Par03_fastsimModified_100events.root, and Par03_fullsim_100events.root. - -- Execute the application (in interactive mode): -\verbatim -% ./examplePar03 -\endverbatim - which allows to visualize hits. - -\section Par03_s8 UI commands - -UI commands useful in this example: - -- activation/disactivation of the fast simulation model: -\verbatim -/param/ActivateModel model -/param/InActivateModel model -\endverbatim - -- particle gun commands -\verbatim -/gun/particle e+ -/gun/energy 50 GeV -/gun/direction 0 0.2 1 -/gun/position 0 0 0 -\endverbatim - -UI commands defined in this example: -- detector settings -\verbatim -/Par03/detector/print -/Par03/detector/setDetectorRadius 10 cm -/Par03/detector/setDetectorLength 30 cm -/Par03/detector/setDetectorMaterial G4_Pb -/Par03/detector/setNbOfLayers 100 -/Par03/detector/setNbOfPhiCells 20 -/Par03/detector/setNbOfRhoCells 100 -\endverbatim - -- fast simulation settings -\verbatim -/Par03/fastSim/print -/Par03/fastSim/transverseProfile/sigma 20 mm -/Par03/fastSim/longitudinalProfile/beta 0.6 -/Par03/fastSim/longitudinalProfile/alpha 2. -/Par03/fastSim/longitudinalProfile/maxDepth 20 -/Par03/fastSim/numberOfHits 500 -\endverbatim - -*/ diff --git a/examples/extended/parameterisations/Par03/CMakeLists.txt b/examples/extended/parameterisations/Par03/CMakeLists.txt index aab8dde598..e3eab6e854 100644 --- a/examples/extended/parameterisations/Par03/CMakeLists.txt +++ b/examples/extended/parameterisations/Par03/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(Par03) #---------------------------------------------------------------------------- diff --git a/examples/extended/parameterisations/Par03/History b/examples/extended/parameterisations/Par03/History index 0b524a024f..a1f1f07299 100644 --- a/examples/extended/parameterisations/Par03/History +++ b/examples/extended/parameterisations/Par03/History @@ -14,6 +14,18 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +07-Nov-21 I. Hrivnacova (expar03-V10-07-02) +- Added analysis manager Clear() call at the end of run + +06-Oct-21 I. Hrivnacova (expar03-V10-07-01) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root). + +19-Jul-21 I. Hrivnacova (expar03-V10-07-00) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 06-Nov-20 I. Hrivnacova (expar03-V10-06-02) - Added missing README for Doxygen - Fixed section numbering in README diff --git a/examples/extended/parameterisations/Par03/README b/examples/extended/parameterisations/Par03/README deleted file mode 100644 index e304420cca..0000000000 --- a/examples/extended/parameterisations/Par03/README +++ /dev/null @@ -1,130 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example Par03 - ------------- - - This example demonstrates how to use G4FastSimHitMaker helper class - to create multiple energy deposits from the fast simulation model. - - It requires sensitive detector class to inherit from both base classes: - - G4VSensitiveDetector: for processing of detailed/non-fast simulation hits - - G4VFastSimSensitiveDetector: for processing of fast sim (G4FastSim) hits - Hits are placed in the same hit collection, so they can be used to - compare between the full and the fast simulation. - - The geometry used in the example is a homogeneous cylinder of lead, with - 3D readout geometry (cylindrical). Analysis of energy deposits is done - in the event action. - - 1. Detector description - ----------------------- - - The detector is a homogeneous cylinder of lead. It is segmented along - z, R and phi to create a readout geometry in the cylindrical coordinates. - - Fast simulation is attached to the region of the detector. - - - 2. Sensitive detector - ----------------------- - - Sensitive detector inherits from both base classes: - - G4VSensitiveDetector: for processing of detailed/non-fast simulation hits - - G4VFastSimSensitiveDetector: for processing of fast sim (G4FastSim) hits. - Hits are placed in the same hit collection, with a different flag to distinguish - between those originated in the full simulation, and those from the fast - simulation. - During visualisation, hits are represented as volumes of different colour: - green for full simulation and red for fast simulation. - - 3. Primary generation - --------------------- - - Particle gun is used as a primary generator. The direction of particles is along - the axis of symmetry of the detector (cylinder). It is positioned 10 cm in front - of the entrance to the detector. 10 GeV electron is used by default. Those values - can be changed using /gun/ UI commands. - - 4. Physics List - --------------- - - FTFP_BERT modular physics list is used. On top of it, fast simulation physics - is registered for selected particles (electrons, positrons, and photons). - - - 5. User actions - ---------------------------------------------------------- - - - Par03RunAction : run action used for initialization and termination - of the run. Histograms for analysis of shower development - in the detector are created. - - - Par03EventAction : event action used for initialization and termination - of the event. Analysis of shower development is performed - on event-by-event basis. - - 6. Output - --------- - - The execution of the program (examplePar03) produces an output with histograms. - - The macro file examplePar03.in specifies three runs. Each run is made of 100 - events, for single 10 GeV electron beams. The first run is executed with fast - simulation model activated with defualt parameters. The second run executes fast - simulation with modified parameters. For the third run the fast simulation model - is disactivated. - Three output files are produced: two with shower development from the fast - simulation (with different parameters), and from the full simulation. - - 7. How to build and run the example - ----------------------------------- - -- Compile and link to generate the executable (in your CMAKE build directory): - % cmake - % make - -- Execute the application (in batch mode): - % ./examplePar03 -m examplePar03.in - which produces three root files: Par03_fastsim_100events.root, - Par03_fastsimModified_100events.root, and Par03_fullsim_100events.root. - -- Execute the application (in interactive mode): - % ./examplePar03 - which allows to visualize hits. - - 8. UI commands - -------------- - - UI commands useful in this example: - -- activation/disactivation of the fast simulation model: - /param/ActivateModel model - /param/InActivateModel model - -- particle gun commands - /gun/particle e+ - /gun/energy 50 GeV - /gun/direction 0 0.2 1 - /gun/position 0 0 0 - - UI commands defined in this example: - - detector settings - /Par03/detector/print - /Par03/detector/setDetectorRadius 10 cm - /Par03/detector/setDetectorLength 30 cm - /Par03/detector/setDetectorMaterial G4_Pb - /Par03/detector/setNbOfLayers 100 - /Par03/detector/setNbOfPhiCells 20 - /Par03/detector/setNbOfRhoCells 100 - - - fast simulation settings - /Par03/fastSim/print - /Par03/fastSim/transverseProfile/sigma 20 mm - /Par03/fastSim/longitudinalProfile/beta 0.6 - /Par03/fastSim/longitudinalProfile/alpha 2. - /Par03/fastSim/longitudinalProfile/maxDepth 20 - /Par03/fastSim/numberOfHits 500 \ No newline at end of file diff --git a/examples/extended/parameterisations/Par03/src/Par03EventAction.cc b/examples/extended/parameterisations/Par03/src/Par03EventAction.cc index 63f6441ae0..ac3676ccd2 100644 --- a/examples/extended/parameterisations/Par03/src/Par03EventAction.cc +++ b/examples/extended/parameterisations/Par03/src/Par03EventAction.cc @@ -26,8 +26,8 @@ #include "Par03EventAction.hh" #include "Par03Hit.hh" #include "Par03DetectorConstruction.hh" -#include "g4analysis.hh" +#include "G4AnalysisManager.hh" #include "G4SDManager.hh" #include "G4HCofThisEvent.hh" #include "G4Event.hh" diff --git a/examples/extended/parameterisations/Par03/src/Par03RunAction.cc b/examples/extended/parameterisations/Par03/src/Par03RunAction.cc index 8ce44eecb9..49ddfc4ace 100644 --- a/examples/extended/parameterisations/Par03/src/Par03RunAction.cc +++ b/examples/extended/parameterisations/Par03/src/Par03RunAction.cc @@ -26,21 +26,23 @@ #include "Par03RunAction.hh" #include "Par03DetectorConstruction.hh" -#include "g4analysis.hh" +#include "G4AnalysisManager.hh" Par03RunAction::Par03RunAction(Par03DetectorConstruction* aDetector) : G4UserRunAction() , fDetector(aDetector) { // Create analysis manager - G4AnalysisManager* analysisManager = G4Analysis::ManagerInstance("root"); + G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); + analysisManager->SetDefaultFileType("root"); + // Default filename, can be overriden with /analysis/setFileName analysisManager->SetFileName("Par03Output"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -Par03RunAction::~Par03RunAction() { delete G4AnalysisManager::Instance(); } +Par03RunAction::~Par03RunAction() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -114,4 +116,5 @@ void Par03RunAction::EndOfRunAction(const G4Run*) auto analysisManager = G4AnalysisManager::Instance(); analysisManager->Write(); analysisManager->CloseFile(); + analysisManager->Clear(); } \ No newline at end of file diff --git a/examples/extended/parameterisations/Par04/CMakeLists.txt b/examples/extended/parameterisations/Par04/CMakeLists.txt new file mode 100644 index 0000000000..8911201af3 --- /dev/null +++ b/examples/extended/parameterisations/Par04/CMakeLists.txt @@ -0,0 +1,146 @@ +#---------------------------------------------------------------------------- +# Setup the project +cmake_minimum_required(VERSION 3.16...3.21) + +# must be set before project(...) call; version module is needed before +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +project(Par04) + +#---------------------------------------------------------------------------- +# Find Geant4 package, activating all available UI and Vis drivers by default +# You can set WITH_GEANT4_UIVIS to OFF via the command line or ccmake/cmake-gui +# to build a batch mode only executable +# +SET(GEANT4_MIN_VERSION "11.0") +option(WITH_GEANT4_UIVIS "Build example with Geant4 UI and Vis drivers" ON) +if(WITH_GEANT4_UIVIS) + find_package(Geant4 ${GEANT4_MIN_VERSION} REQUIRED ui_all vis_all) +else() + find_package(Geant4 ${GEANT4_MIN_VERSION} REQUIRED) +endif() + +#---------------------------------------------------------------------------- +# Setup Geant4 include directories and compile definitions +# +include(${Geant4_USE_FILE}) + +#---------------------------------------------------------------------------- +# Setup ML-infernce (LCG) +# +option(INFERENCE_LIB "The inference library: currently implemented LWTNN and ONNX" ON) + +# LWTNN +if(INFERENCE_LIB) + find_package(lwtnn QUIET) + if(lwtnn_FOUND) + message("LWTNN inference library found.") + add_definitions(-DUSE_INFERENCE) + add_definitions(-DUSE_INFERENCE_LWTNN) + else() + message("LWTNN not found!") + endif() +endif() + +# ONNX +if(INFERENCE_LIB) + find_package(OnnxRuntime QUIET) + if(OnnxRuntime_FOUND) + message("ONNX Runtime inference library found.") + add_definitions(-DUSE_INFERENCE) + add_definitions(-DUSE_INFERENCE_ONNX) + else() + message("ONNX Runtime not found!") + endif() +endif() + +#---------------------------------------------------------------------------- +# Locate sources and headers for this project +# +include_directories(${PROJECT_SOURCE_DIR}/include + ${Geant4_INCLUDE_DIR}) +file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc) +file(GLOB headers ${PROJECT_SOURCE_DIR}/include/*.hh) + +#---------------------------------------------------------------------------- +# Add the executable, and link it to the Geant4 libraries +# +add_executable(examplePar04 examplePar04.cc ${sources} ${headers}) +target_link_libraries(examplePar04 ${Geant4_LIBRARIES} ) + +if(lwtnn_FOUND) + target_include_directories(examplePar04 PUBLIC ${lwtnn_INCLUDE_DIRS}) + target_link_libraries(examplePar04 ${lwtnn_LIBRARIES} ) + # Depend on data for runtime + add_dependencies(examplePar04 examplePar04lwtnndata) +endif() + +if(OnnxRuntime_FOUND) + target_include_directories(examplePar04 PUBLIC ${OnnxRuntime_INCLUDE_DIR}) + target_link_libraries(examplePar04 ${OnnxRuntime_LIBRARY}) + # Depend on data for runtime + add_dependencies(examplePar04 examplePar04onnxdata) +endif() + +#---------------------------------------------------------------------------- +# Copy all scripts to the build directory, i.e. the directory in which we +# build Par04. This is so that we can run the executable directly because it +# relies on these scripts being in the current working directory. +# +set(Par04_SCRIPTS + examplePar04.in vis.mac + ) +if(lwtnn_FOUND) + set(Par04_SCRIPTS ${Par04_SCRIPTS} examplePar04_lwtnn.in) +endif() +if(OnnxRuntime_FOUND) + set(Par04_SCRIPTS ${Par04_SCRIPTS} examplePar04_onnx.in) +endif() + +foreach(_script ${Par04_SCRIPTS}) + configure_file( + ${PROJECT_SOURCE_DIR}/${_script} + ${PROJECT_BINARY_DIR}/${_script} + COPYONLY + ) +endforeach() + +#---------------------------------------------------------------------------- +# Use external data. They are stored outside of the code because of their size. +# THey can be downloaded on demand when this example is built (with inference enabled) +# +include(ExternalProject) +if(lwtnn_FOUND) + ExternalProject_Add(examplePar04lwtnndata + DOWNLOAD_DIR ${PROJECT_BINARY_DIR}/MLModels + URL https://cern.ch/geant4-data/datasets/examples/extended/parameterisations/Par04/Generator.json + URL_MD5 af94b1130347428e2e6030930c1ac2cc + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + DOWNLOAD_NO_EXTRACT true + ) +endif() +if(OnnxRuntime_FOUND) + ExternalProject_Add(examplePar04onnxdata + DOWNLOAD_DIR ${PROJECT_BINARY_DIR}/MLModels + URL https://cern.ch/geant4-data/datasets/examples/extended/parameterisations/Par04/Generator.onnx + URL_MD5 cacd07c24b704decca28de990850287e + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + DOWNLOAD_NO_EXTRACT true + ) +endif() + +#---------------------------------------------------------------------------- +# Add program to the project targets +# (this avoids the need of typing the program name after make) +# +add_custom_target(Par04 DEPENDS examplePar04) + +#---------------------------------------------------------------------------- +# Install the executable to 'bin' directory under CMAKE_INSTALL_PREFIX +# +install(TARGETS examplePar04 DESTINATION bin) + diff --git a/examples/extended/parameterisations/Par04/History b/examples/extended/parameterisations/Par04/History new file mode 100644 index 0000000000..319f4749eb --- /dev/null +++ b/examples/extended/parameterisations/Par04/History @@ -0,0 +1,18 @@ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + Example Par04 History file + --------------------------- +This file should be used by the G4 example coordinator to briefly +summarize all major modifications introduced in the code and keep +track of all tags. + + ---------------------------------------------------------- + * Reverse chronological order (last date on top), please * + ---------------------------------------------------------- + +08-Nov-21 D. Salamani, A. Zaborowska (expar04-V10-07-00) +- Create Par04 example diff --git a/examples/extended/parameterisations/Par04/cmake/FindOnnxRuntime.cmake b/examples/extended/parameterisations/Par04/cmake/FindOnnxRuntime.cmake new file mode 100644 index 0000000000..cb5396cf67 --- /dev/null +++ b/examples/extended/parameterisations/Par04/cmake/FindOnnxRuntime.cmake @@ -0,0 +1,27 @@ +# Find the ONNX Runtime include directory and library. +# +# This module defines the `onnxruntime` imported target that encodes all +# necessary information in its target properties. + +find_library( + OnnxRuntime_LIBRARY + NAMES onnxruntime + PATH_SUFFIXES lib lib32 lib64 + DOC "The ONNXRuntime library") + +find_path( + OnnxRuntime_INCLUDE_DIR + NAMES core/session/onnxruntime_cxx_api.h + PATH_SUFFIXES include include/onnxruntime + DOC "The ONNXRuntime include directory") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + OnnxRuntime + REQUIRED_VARS OnnxRuntime_LIBRARY OnnxRuntime_INCLUDE_DIR) + +add_library(OnnxRuntime SHARED IMPORTED) +set_property(TARGET OnnxRuntime PROPERTY IMPORTED_LOCATION ${OnnxRuntime_LIBRARY}) +set_property(TARGET OnnxRuntime PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${OnnxRuntime_INCLUDE_DIR}) + +mark_as_advanced(OnnxRuntime_FOUND OnnxRuntime_INCLUDE_DIR OnnxRuntime_LIBRARY) diff --git a/examples/extended/parameterisations/Par04/examplePar04.cc b/examples/extended/parameterisations/Par04/examplePar04.cc new file mode 100644 index 0000000000..5a263887b0 --- /dev/null +++ b/examples/extended/parameterisations/Par04/examplePar04.cc @@ -0,0 +1,153 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// +// +// -------------------------------------------------------------- +// GEANT 4 - examplePar04 +// -------------------------------------------------------------- +// Comments +// +// Example of a main program demonstrating multiple energy deposition +// from fast simulation model. +// +//------------------------------------------------------------------- +#include // for G4Exception +#include // for FatalErrorInArgument +#include // for G4RunManager +#include // for G4String +#include // for G4VisManager +#include // for G4cout, G4endl +#include // for char_traits, operator<<, bas... +#include // for allocator, operator+, operat... +#include "FTFP_BERT.hh" // for FTFP_BERT +#include "G4EmParameters.hh" // for G4EmParameters +#include "G4FastSimulationPhysics.hh" // for G4FastSimulationPhysics +#include "G4HadronicProcessStore.hh" // for G4HadronicProcessStore +#include "G4RunManagerFactory.hh" // for G4RunManagerFactory, G4RunMa... +#include "G4Types.hh" // for G4bool, G4int +#include "G4UIExecutive.hh" // for G4UIExecutive +#include "G4UImanager.hh" // for G4UImanager +#include "G4VisExecutive.hh" // for G4VisExecutive +#include "Par04ActionInitialisation.hh" // for Par04ActionInitialisation +#include "Par04DetectorConstruction.hh" // for Par04DetectorConstruction + +int main(int argc, char** argv) +{ + // Macro name from arguments + G4String batchMacroName; + G4bool useInteractiveMode = true; + G4String helpMsg( + "Usage: " + G4String(argv[0]) + + " [option(s)] \n No additional arguments triggers an interactive mode " + "executing vis.mac macro. \n Options:\n\t-h\t\tdisplay this help " + "message\n\t-m MACRO\ttriggers a batch mode executing MACRO\n"); + for(G4int i = 1; i < argc; ++i) + { + G4String argument(argv[i]); + if(argument == "-h" || argument == "--help") + { + G4cout << helpMsg << G4endl; + return 0; + } + else if(argument == "-m") + { + batchMacroName = G4String(argv[i + 1]); + useInteractiveMode = false; + ++i; + } + else + { + G4Exception("main", "Unknown argument", FatalErrorInArgument, + ("Unknown argument passed to " + G4String(argv[0]) + " : " + + argument + "\n" + helpMsg) + .c_str()); + } + } + + // Instantiate G4UIExecutive if interactive mode + G4UIExecutive* ui = nullptr; + if(useInteractiveMode) + { + ui = new G4UIExecutive(argc, argv); + } + + // Initialization of default Run manager + auto* runManager = + G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default); + + // Detector geometry: + auto detector = new Par04DetectorConstruction(); + runManager->SetUserInitialization(detector); + + // Physics list + auto physicsList = new FTFP_BERT(); + // Add fast simulation physics + auto fastSimulationPhysics = new G4FastSimulationPhysics(); + fastSimulationPhysics->BeVerbose(); + fastSimulationPhysics->ActivateFastSimulation("e-"); + fastSimulationPhysics->ActivateFastSimulation("e+"); + fastSimulationPhysics->ActivateFastSimulation("gamma"); + physicsList->RegisterPhysics(fastSimulationPhysics); + // reduce verbosity of physics lists + G4EmParameters::Instance()->SetVerbose(0); + runManager->SetUserInitialization(physicsList); + G4HadronicProcessStore::Instance()->SetVerbose(0); + + //------------------------------- + // UserAction classes + //------------------------------- + runManager->SetUserInitialization(new Par04ActionInitialisation(detector)); + + //---------------- + // Visualization: + //---------------- + G4cout << "Instantiating Visualization Manager......." << G4endl; + G4VisManager* visManager = new G4VisExecutive; + visManager->Initialize(); + G4UImanager* UImanager = G4UImanager::GetUIpointer(); + + if(useInteractiveMode) + { + UImanager->ApplyCommand("/control/execute vis.mac"); + ui->SessionStart(); + delete ui; + } + else + { + G4String command = "/control/execute "; + UImanager->ApplyCommand(command + batchMacroName); + } + + // Free the store: user actions, physics_list and detector_description are + // owned and deleted by the run manager, so they should not + // be deleted in the main() program ! + + delete visManager; + delete runManager; + + return 0; +} diff --git a/examples/extended/parameterisations/Par04/examplePar04.in b/examples/extended/parameterisations/Par04/examplePar04.in new file mode 100644 index 0000000000..61cc119a1c --- /dev/null +++ b/examples/extended/parameterisations/Par04/examplePar04.in @@ -0,0 +1,30 @@ +# examplePar04.in +# +# Detector Construction +/Par04/detector/setDetectorInnerRadius 80 cm +/Par04/detector/setDetectorLength 2 m +/Par04/detector/setNbOfLayers 90 +/Par04/detector/setAbsorber 0 G4_W 1.4 mm false +/Par04/detector/setAbsorber 1 G4_Si 0.3 mm true +## 2.325 mm of tungsten =~ 0.25 * 9.327 mm = 0.25 * R_Moliere +/Par04/mesh/setSizeOfRhoCells 2.325 mm +## 2 * 1.4 mm of tungsten =~ 0.65 X_0 +/Par04/mesh/setSizeOfZCells 3.4 mm +/Par04/mesh/setNbOfRhoCells 18 +/Par04/mesh/setNbOfPhiCells 50 +/Par04/mesh/setNbOfZCells 45 + +# Initialize +/run/initialize + +/gun/energy 10 GeV +/gun/position 0 0 0 +/gun/direction 0 1 0 + +# Full Simulation +/analysis/setFileName 10GeV_100events_fullsim.root +## dynamically set readout mesh from particle direction +/param/ActivateModel defineMesh +## we do not use ML fast sim +/param/InActivateModel inferenceModel +/run/beamOn 100 diff --git a/examples/extended/parameterisations/Par04/examplePar04_lwtnn.in b/examples/extended/parameterisations/Par04/examplePar04_lwtnn.in new file mode 100644 index 0000000000..cfd2ed9109 --- /dev/null +++ b/examples/extended/parameterisations/Par04/examplePar04_lwtnn.in @@ -0,0 +1,47 @@ +# examplePar04_lwtnn.in +# +# Detector Construction +/Par04/detector/setDetectorInnerRadius 80 cm +/Par04/detector/setDetectorLength 2 m +/Par04/detector/setNbOfLayers 90 +/Par04/detector/setAbsorber 0 G4_W 1.4 mm true +/Par04/detector/setAbsorber 1 G4_Si 0.3 mm true +## 2.325 mm of tungsten =~ 0.25 * 9.327 mm = 0.25 * R_Moliere +/Par04/mesh/setSizeOfRhoCells 2.325 mm +## 2 * 1.4 mm of tungsten =~ 0.65 X_0 +/Par04/mesh/setSizeOfZCells 3.4 mm +/Par04/mesh/setNbOfRhoCells 18 +/Par04/mesh/setNbOfPhiCells 50 +/Par04/mesh/setNbOfZCells 45 +## set mesh size for inference == mesh size of a full sim that +## was used for training; it coincides with readout mesh size +/Par04/inference/setSizeOfRhoCells 2.325 mm +/Par04/inference/setSizeOfZCells 3.4 mm +/Par04/inference/setNbOfRhoCells 18 +/Par04/inference/setNbOfPhiCells 50 +/Par04/inference/setNbOfZCells 45 + +# Initialize +/run/initialize + +/gun/energy 10 GeV +/gun/position 0 0 0 +/gun/direction 0 1 0 + +# Inference Setup +## dimension of the latent vector (encoded vector in a Variational Autoencoder model) +/Par04/inference/setSizeLatentVector 10 +## size of the condition vector (energy, angle and geometry) +/Par04/inference/setSizeConditionVector 4 +## path to the model which is set to download by cmake +/Par04/inference/setModelPathName MLModels/Generator.json +/Par04/inference/setInferenceLibrary LWTNN + +# Fast Simulation +/analysis/setFileName 10GeV_100events_fastsim_lwtnn.root +## dynamically set readout mesh from particle direction +## needs to be the first fast sim model! +/param/ActivateModel defineMesh +## ML fast sim, configured with the inference setup /Par04/inference +/param/ActivateModel inferenceModel +/run/beamOn 100 diff --git a/examples/extended/parameterisations/Par04/examplePar04_onnx.in b/examples/extended/parameterisations/Par04/examplePar04_onnx.in new file mode 100644 index 0000000000..97ec5b072b --- /dev/null +++ b/examples/extended/parameterisations/Par04/examplePar04_onnx.in @@ -0,0 +1,49 @@ +# examplePar04_onnx.in +# +# Detector Construction +/Par04/detector/setDetectorInnerRadius 80 cm +/Par04/detector/setDetectorLength 2 m +/Par04/detector/setNbOfLayers 90 +/Par04/detector/setAbsorber 0 G4_W 1.4 mm true +/Par04/detector/setAbsorber 1 G4_Si 0.3 mm true +## 2.325 mm of tungsten =~ 0.25 * 9.327 mm = 0.25 * R_Moliere +/Par04/mesh/setSizeOfRhoCells 2.325 mm +## 2 * 1.4 mm of tungsten =~ 0.65 X_0 +/Par04/mesh/setSizeOfZCells 3.4 mm +/Par04/mesh/setNbOfRhoCells 18 +/Par04/mesh/setNbOfPhiCells 50 +/Par04/mesh/setNbOfZCells 45 + +# Initialize +/run/initialize + +/gun/energy 10 GeV +/gun/position 0 0 0 +/gun/direction 0 1 0 + +# Inference Setup +## dimension of the latent vector (encoded vector in a Variational Autoencoder model) +/Par04/inference/setSizeLatentVector 10 +## size of the condition vector (energy, angle and geometry) +/Par04/inference/setSizeConditionVector 4 +## path to the model which is set to download by cmake +/Par04/inference/setModelPathName MLModels/Generator.onnx +/Par04/inference/setProfileFlag 1 +/Par04/inference/setOptimizationFlag 0 +/Par04/inference/setInferenceLibrary ONNX +## set mesh size for inference == mesh size of a full sim that +## was used for training; it coincides with readout mesh size +/Par04/inference/setSizeOfRhoCells 2.325 mm +/Par04/inference/setSizeOfZCells 3.4 mm +/Par04/inference/setNbOfRhoCells 18 +/Par04/inference/setNbOfPhiCells 50 +/Par04/inference/setNbOfZCells 45 + +# Fast Simulation +/analysis/setFileName 10GeV_100events_fastsim_onnx.root +## dynamically set readout mesh from particle direction +## needs to be the first fast sim model! +/param/ActivateModel defineMesh +## ML fast sim, configured with the inference setup /Par04/inference +/param/ActivateModel inferenceModel +/run/beamOn 100 diff --git a/examples/extended/parameterisations/Par04/include/Par04ActionInitialisation.hh b/examples/extended/parameterisations/Par04/include/Par04ActionInitialisation.hh new file mode 100644 index 0000000000..13d59b1669 --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04ActionInitialisation.hh @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifndef PAR04ACTIONINITIALISATION_HH +#define PAR04ACTIONINITIALISATION_HH + +#include "G4VUserActionInitialization.hh" + +class Par04DetectorConstruction; + +/** + * @brief Initialization of user actions. + * + * Initialises the primary generator, and user actions (event, run) to perform + * analysis and store histograms. + * + */ + +class Par04ActionInitialisation : public G4VUserActionInitialization +{ + public: + Par04ActionInitialisation(Par04DetectorConstruction* aDetector); + ~Par04ActionInitialisation(); + /// Create all user actions. + virtual void Build() const final; + /// Create run action in the master thread to allow analysis merging. + virtual void BuildForMaster() const final; + + private: + /// Pointer to detector to be passed to event and run actions in order to + /// retrieve detector dimensions + Par04DetectorConstruction* fDetector = nullptr; +}; + +#endif /* PAR04ACTIONINITIALISATION_HH */ diff --git a/examples/extended/parameterisations/Par04/include/Par04DefineMeshModel.hh b/examples/extended/parameterisations/Par04/include/Par04DefineMeshModel.hh new file mode 100644 index 0000000000..226d62100d --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04DefineMeshModel.hh @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifndef PAR04DEFINEMESHMODEL_HH +#define PAR04DEFINEMESHMODEL_HH + +#include // for G4String +#include // for G4bool +#include "G4VFastSimulationModel.hh" // for G4VFastSimulationModel +class G4FastStep; +class G4FastTrack; +class G4ParticleDefinition; +class G4Region; + +/** + * @brief Defince mesh for energy scoring + * + * Fast simulation model is used in order to define where particle enters the detector + * and its direction. That data is used to define the mesh used for energy scoring. + * TODO To make the simulation faster, this model could be attached to a very thin layer at the + * entrance to the calorimeter instead of attaching it to the volume of the detector. + * + */ + +class Par04DefineMeshModel : public G4VFastSimulationModel +{ + public: + Par04DefineMeshModel(G4String, G4Region*); + Par04DefineMeshModel(G4String); + ~Par04DefineMeshModel(); + + /// Check if particle is entering the volume. Check particle energy. It must be + /// no smaller than 99% of the primary particle energy. This is to ensure that in case of + /// prior interactions, particle energy does not differ (much) from the assumed + /// energy. + virtual G4bool ModelTrigger(const G4FastTrack&) final; + /// Model is applicable to all particles. + virtual G4bool IsApplicable(const G4ParticleDefinition&) final; + /// Check particle direction, entrance point, and store it in event information. + /// Then go back to the full simulation. + virtual void DoIt(const G4FastTrack&, G4FastStep&) final; +}; +#endif /* PAR04DEFINEMESHMODEL_HH */ diff --git a/examples/extended/parameterisations/Par04/include/Par04DetectorConstruction.hh b/examples/extended/parameterisations/Par04/include/Par04DetectorConstruction.hh new file mode 100644 index 0000000000..7dda37fae6 --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04DetectorConstruction.hh @@ -0,0 +1,157 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifndef PAR04DETECTORCONSTRUCTION_H +#define PAR04DETECTORCONSTRUCTION_H + +#include // for cm, mm, pi, rad +#include // for G4String +#include // for G4double, G4bool, G4int +#include // for array +#include // for size_t +#include // for vector +#include "G4Material.hh" // for G4Material +#include "G4SystemOfUnits.hh" // for cm, mm, rad +#include "G4ThreeVector.hh" // for G4ThreeVector +#include "G4VUserDetectorConstruction.hh" // for G4VUserDetectorConstruction +class G4LogicalVolume; +class G4VPhysicalVolume; +class Par04DetectorMessenger; + +/** + * @brief Detector construction. + * + * Creates a cylindrical detector, with cylinder axis along Z-axis. It is placed + * in the centre of the world volume. + * Dimensions of the detector (inner radius and its length) as well as composition (number of + * radial layers, number of absorbers, its thicknesses and materials) can be set using the UI + * commands. There may be up to two absorbers used to build the layers. + * + * TODO Extend to allow use of more than two different absorbers. + * + * Each absorber may have differnt thickness (along radial direction), material, and may be + * either sensitive to particle passage (will register deposited energy) or not (passive). + * Readout geometry of the detector is dynamic, and its size can be set by UI commands. + * Cells are created along z-axis, azimuthal angle, and radius (cylindrical + * segmentation). The z axis is parallel to the direction of the particle entering the + * detector volume. The mesh also starts at the entrance to the detector volume. + * In order to define this enrance position and direction, a fast simulation model is used. + * For the detector volume, if particle has entered, sets the particle direction and position + * in the event information. Those vectors define the readout mesh for the event. + * + * TODO In order to speed up the simulation, fast simulation that checks for the entrance + * properites should be defined in a very thin region instead of a whole region of the detector. + * + * Sensitive detector Par04SensitiveDetector is attached to the detector volume + * Region for the detector is created as an envelope of the fast simulation. + * + */ + +class Par04DetectorConstruction : public G4VUserDetectorConstruction +{ + public: + Par04DetectorConstruction(); + virtual ~Par04DetectorConstruction(); + + virtual G4VPhysicalVolume* Construct() final; + virtual void ConstructSDandField() final; + + /// Set inner radius of the cylindrical detector + void SetInnerRadius(G4double aInnerRadius); + /// Get inner radius of the cylindrical detector + inline G4double GetInnerRadius() const { return fDetectorInnerRadius; }; + /// Set length radius of the cylindrical detector + void SetLength(G4double aLength); + /// Get length of the cylindrical detector (along z-axis) + inline G4double GetLength() const { return fDetectorLength; }; + /// Set number of layers + inline void SetNbOfLayers(G4int aNumber) { fNbOfLayers = aNumber; }; + /// Get number of layers + inline G4int GetNbOfLayers() const { return fNbOfLayers; }; + + /// Set material of the layer (from NIST materials) + void SetAbsorberMaterial(const std::size_t aLayer, const G4String& aMaterial); + /// Get name of the material of the layer + inline G4String GetAbsorberMaterial(const std::size_t aLayer) const + { + return fAbsorberMaterial[aLayer]->GetName(); + }; + /// Set thickness of the layer + void SetAbsorberThickness(const std::size_t aLayer, const G4double aThickness); + /// Get thickness of the layer + inline G4double GetAbsorberThickness(const std::size_t aLayer) const + { + return fAbsorberThickness[aLayer]; + }; + /// Set sensitivity of the layer + void SetAbsorberSensitivity(const std::size_t aLayer, const G4bool aSensitivity); + /// Get sensitivity of the layer + inline G4bool GetAbsorberSensitivity(const std::size_t aLayer) const + { + return fAbsorberSensitivity[aLayer]; + }; + + /// Set number of Mesh cells in cylindrical coordinates (r, phi, z) + inline void SetMeshNbOfCells(G4ThreeVector aNb) { fMeshNbOfCells = aNb; }; + /// Set number of Mesh cells in cylindrical coordinates along one of the axis + /// @param[in] aIndex index of cylindrical axis (0,1,2) = (r, phi, z) + inline void SetMeshNbOfCells(std::size_t aIndex, G4double aNb) { fMeshNbOfCells[aIndex] = aNb; }; + /// Get number of Mesh cells in cylindrical coordinates (r, phi, z) + inline G4ThreeVector GetMeshNbOfCells() const { return fMeshNbOfCells; }; + /// Set size of Mesh cells in cylindrical coordinates (r, phi, z) + inline void SetMeshSizeOfCells(G4ThreeVector aNb) { fMeshSizeOfCells = aNb; }; + /// Set size of Mesh cells in cylindrical coordinates along one of the axis + /// @param[in] aIndex index of cylindrical axis (0,1,2) = (r, phi, z) + inline void SetMeshSizeOfCells(std::size_t aIndex, G4double aNb) { fMeshSizeOfCells[aIndex] = aNb; }; + /// Get size of Mesh cells in cylindrical coordinates (r, phi, z) + inline G4ThreeVector GetMeshSizeOfCells() const { return fMeshSizeOfCells; }; + + /// Print detector information + void Print() const; + + private: + /// Messenger that allows to modify geometry + Par04DetectorMessenger* fDetectorMessenger = nullptr; + /// Inner radius of the cylindrical detector + G4double fDetectorInnerRadius = 80 * cm; + /// Length of the cylindrical detector (along z axis) + G4double fDetectorLength = 24 * cm; + /// Logical volume(s) of the sensitive absorbers + std::vector fLayerLogical; + /// Material(s) of the layers + std::array fAbsorberMaterial = { nullptr, nullptr }; + /// Thickness(es) of the layers + std::array fAbsorberThickness = { 1 * cm, 0 }; + /// Sensitivity of the layers + std::array fAbsorberSensitivity = { true, 0 }; + /// Number of layers = slices along z axis + G4int fNbOfLayers = 24; + /// Mesh number of cells (Nr, Nphi, Nz) + G4ThreeVector fMeshNbOfCells = { 40, 50, 48 }; + /// Mesh size of cells (dr, dphi, dz). + G4ThreeVector fMeshSizeOfCells = { 5 * mm, 2 * CLHEP::pi / 50 * CLHEP::rad, 5 * mm }; +}; + +#endif /* PAR04DETECTORCONSTRUCTION_H */ diff --git a/examples/extended/parameterisations/Par04/include/Par04DetectorMessenger.hh b/examples/extended/parameterisations/Par04/include/Par04DetectorMessenger.hh new file mode 100644 index 0000000000..f37671c2da --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04DetectorMessenger.hh @@ -0,0 +1,91 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +#ifndef PAR04DETECTORMESSENGER_H +#define PAR04DETECTORMESSENGER_H + +#include // for G4String +#include "G4UImessenger.hh" // for G4UImessenger +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithAnInteger; +class G4UIcmdWithoutParameter; +class G4UIcommand; +class G4UIdirectory; +class Par04DetectorConstruction; + +/** + * @brief Detector messenger. + * + * Provides UI commands to setup detector and readout geometry (prior to + * initialization). Radius, length, and material of the detector, as well as + * segmentation of the readout geometry can be changed. + * + */ + +class Par04DetectorMessenger : public G4UImessenger +{ + public: + Par04DetectorMessenger(Par04DetectorConstruction*); + ~Par04DetectorMessenger(); + + /// Invokes appropriate methods based on the typed command + virtual void SetNewValue(G4UIcommand*, G4String) final; + /// Retrieves the current settings + virtual G4String GetCurrentValue(G4UIcommand*) final; + + private: + /// Detector construction to setup + Par04DetectorConstruction* fDetector = nullptr; + /// Command to set the directory common to all messengers in this example + /// /Par04 + G4UIdirectory* fExampleDir = nullptr; + /// Command to set the directory for detector settings /Par04/detector + G4UIdirectory* fDetectorDir = nullptr; + /// Command printing current settings + G4UIcmdWithoutParameter* fPrintCmd; + /// Command to set the detector inner radius + G4UIcmdWithADoubleAndUnit* fDetectorInnerRadiusCmd = nullptr; + /// Command to set the detector length + G4UIcmdWithADoubleAndUnit* fDetectorLengthCmd = nullptr; + /// Command to set the number of layers + G4UIcmdWithAnInteger* fNbLayersCmd = nullptr; + /// Commanbd to set the absorbers within layers (material, thickness, sensitivity) + G4UIcommand* fAbsorCmd = nullptr; + /// Command to set the directory for sensitive detector settings /Par04/mesh + G4UIdirectory* fMeshDir = nullptr; + /// Command to set the number of cells in the cylindrical readout mesh (along rho axis) + G4UIcmdWithAnInteger* fMeshNbRhoCellsCmd = nullptr; + /// Command to set the number of cells in the cylindrical readout mesh (along phi axis) + G4UIcmdWithAnInteger* fMeshNbPhiCellsCmd = nullptr; + /// Command to set the number of cells in the cylindrical readout mesh (along z axis) + G4UIcmdWithAnInteger* fMeshNbZCellsCmd = nullptr; + /// Command to the size of cells in the cylindrical readout mesh (along rho axis) + G4UIcmdWithADoubleAndUnit* fMeshSizeRhoCellsCmd = nullptr; + /// Command to the size of cells in the cylindrical readout mesh (along z axis) + G4UIcmdWithADoubleAndUnit* fMeshSizeZCellsCmd = nullptr; +}; + +#endif diff --git a/examples/extended/parameterisations/Par04/include/Par04EventAction.hh b/examples/extended/parameterisations/Par04/include/Par04EventAction.hh new file mode 100644 index 0000000000..b402767b36 --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04EventAction.hh @@ -0,0 +1,89 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifndef PAR04EVENTACTION_HH +#define PAR04EVENTACTION_HH + +#include // for G4int, G4double +#include // for vector +#include "G4Timer.hh" // for G4Timer +#include "G4UserEventAction.hh" // for G4UserEventAction +class G4Event; +class Par04DetectorConstruction; + +/** + * @brief Event action class for hits' analysis. + * + * Analysis of single-particle events and developed showers in the detector. + * At the end of the event basic variables are calculated and saved in the + * histograms. + * Additionally ntuple with cell energies and IDs (in cylindrical coordinates) is stored. + * + */ + +class Par04EventAction : public G4UserEventAction +{ + public: + Par04EventAction(Par04DetectorConstruction* aDetector); + virtual ~Par04EventAction(); + + /// Timer is started + virtual void BeginOfEventAction(const G4Event* aEvent) final; + /// Hits collection is retrieved, analysed, and histograms are filled. + virtual void EndOfEventAction(const G4Event* aEvent) final; + inline std::vector& GetCalEdep() { return fCalEdep; } + inline std::vector& GetCalRho() { return fCalRho; } + inline std::vector& GetCalPhi() { return fCalPhi; } + inline std::vector& GetCalZ() { return fCalZ; } + + private: + /// ID of a hit collection to analyse + G4int fHitCollectionID; + /// Timer measurement + G4Timer fTimer; + /// Pointer to detector construction to retrieve (once) the detector + /// dimensions and size of readout + Par04DetectorConstruction* fDetector = nullptr; + /// Size of cell along Z axis + G4double fCellSizeZ = 0; + /// Size of cell along radius of cylinder + G4double fCellSizeRho = 0; + /// Number of readout cells along radius + G4int fCellNbRho = 0; + /// Number of readout cells in azimuthal angle + G4int fCellNbPhi = 0; + /// Number of readout cells along z axis + G4int fCellNbZ = 0; + /// Cell energy deposits to be stored in ntuple + std::vector fCalEdep; + /// Cell ID of radius to be stored in ntuple + std::vector fCalRho; + /// Cell ID of azimuthal angle to be stored in ntuple + std::vector fCalPhi; + /// Cell ID of z axis to be stored in ntuple + std::vector fCalZ; +}; + +#endif /* PAR04EVENTACTION_HH */ diff --git a/examples/extended/parameterisations/Par04/include/Par04EventInformation.hh b/examples/extended/parameterisations/Par04/include/Par04EventInformation.hh new file mode 100644 index 0000000000..c0fcde05fd --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04EventInformation.hh @@ -0,0 +1,72 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifndef PAR04EVENTINFORMATION_HH +#define PAR04EVENTINFORMATION_HH + +#include // for G4bool +#include "G4ThreeVector.hh" // for G4ThreeVector +#include "G4VUserEventInformation.hh" // for G4VUserEventInformation + +/** + * @brief Event information + * + * Additional data associated to the primary particle. + * Contains information on the direction of the primary particle used to determine + * how energy is scored (mesh around the particle direction). + * + */ + +class Par04EventInformation : public G4VUserEventInformation +{ + public: + Par04EventInformation(); + virtual ~Par04EventInformation(); + + /// Set particle direction + inline void SetDirection(const G4ThreeVector& aDirection) { fDirection = aDirection; }; + /// Get particle direction + inline G4ThreeVector GetDirection() const { return fDirection; }; + /// Set particle position + inline void SetPosition(const G4ThreeVector& aPosition) { fPosition = aPosition; }; + /// Get particle position + inline G4ThreeVector GetPosition() const { return fPosition; }; + /// Set flag + inline void SetFlag(G4bool aFlag) { fIfSet = aFlag; }; + /// Get flag + inline G4bool GetFlag() const { return fIfSet; }; + /// Print + void Print() const final; + + private: + /// Particle direction. By default equal to the default particle gun direction. + G4ThreeVector fDirection = { 0, 1, 0 }; + /// Particle position. By default equal to the default inner radius. + G4ThreeVector fPosition = { 0, 800, 0 }; + /// Flag + G4bool fIfSet = false; +}; + +#endif /* PAR04EVENTINFORMATION_HH */ diff --git a/examples/extended/parameterisations/Par04/include/Par04Hit.hh b/examples/extended/parameterisations/Par04/include/Par04Hit.hh new file mode 100644 index 0000000000..9c9fe17cec --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04Hit.hh @@ -0,0 +1,153 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifndef PAR04HIT_HH +#define PAR04HIT_HH + +#include // for size_t +#include // for G4int, G4double +#include // for map +#include // for G4ThreadLocal +#include // for vector +#include "G4Allocator.hh" // for G4Allocator +#include "G4RotationMatrix.hh" // for G4RotationMatrix +#include "G4THitsCollection.hh" // for G4THitsCollection +#include "G4ThreeVector.hh" // for G4ThreeVector +#include "G4VHit.hh" // for G4VHit +class G4AttDef; +class G4AttValue; +class G4LogicalVolume; +class G4String; + +/** + * @brief Hit class to store energy deposited in the sensitive detector. + * + * Hit class registers position and energy deposited within the sensitive + * detector. Cell ID is stored using identifiers of readout segmentation (z, + * phi, rho). Additionally, pointer to cell logical volume, its position and + * rotation are saved for visualisation purposes. Time allows to filter hits in + * visualisation. Type of hit allows to distinguish between hits originating + * from full simulation (type 0) and fast simulation (type 1). + * + */ + +class Par04Hit : public G4VHit +{ + public: + Par04Hit(); + Par04Hit(const Par04Hit& aRight); + virtual ~Par04Hit(); + + const Par04Hit& operator=(const Par04Hit& aRight); + int operator==(const Par04Hit& aRight) const; + + inline void* operator new(size_t); + inline void operator delete(void* aHit); + /// Visualise hits. If pointer to the logical volume was set, cell shape is + /// drawn taking into account proper radial position (taken from fRhoId) + virtual void Draw() final; + /// Retrieve atributes' names in order to allow filtering + virtual const std::map* GetAttDefs() const final; + /// Create attributes for the visualisation. + virtual std::vector* CreateAttValues() const final; + /// Print hit properties. + virtual void Print() final; + /// Set position + inline void SetPos(G4ThreeVector aXYZ) { fPos = aXYZ; } + /// Get position + inline G4ThreeVector GetPos() const { return fPos; } + /// Set rotation + inline void SetRot(G4RotationMatrix aXYZ) { fRot = aXYZ; } + /// Get rotation + inline G4RotationMatrix GetRot() const { return fRot; } + /// Set energy + inline void SetEdep(G4double aEdep) { fEdep = aEdep; } + /// Add energy to previous value + inline void AddEdep(G4double aEdep) { fEdep += aEdep; } + /// Get energy + inline G4double GetEdep() const { return fEdep; } + /// Set Z id of the cell in the readout segmentation + inline void SetZid(G4int aZ) { fZId = aZ; } + /// Get Z id of the cell in the readout segmentation + inline G4int GetZid() const { return fZId; } + /// Set Rho id of the cell in the readout segmentation + inline void SetRhoId(G4int aRho) { fRhoId = aRho; } + /// Get rho id of the cell in the readout segmentation + inline G4int GetRhoId() const { return fRhoId; } + /// Set phi id of the cell in the readout segmentation + inline void SetPhiId(G4int aPhi) { fPhiId = aPhi; } + /// Get phi id of the cell in the readout segmentation + inline G4int GetPhiId() const { return fPhiId; } + /// Set time + inline void SetTime(G4double aTime) { fTime = aTime; } + /// Get time + inline G4double GetTime() const { return fTime; } + /// Set type (0 = full sim, 1 = fast sim) + inline void SetType(G4int aType) { fType = aType; } + /// Get type (0 = full sim, 1 = fast sim) + inline G4int GetType() const { return fType; } + // Set pointer to cell logical volume + inline void SetLogV(G4LogicalVolume* aLogVol) { fLogVol = aLogVol; } + // Get pointer to cell logical volume + inline const G4LogicalVolume* GetLogVol() { return fLogVol; } + + public: + /// Energy deposit + G4double fEdep = 0; + /// Z ID of readout cell + G4int fZId = -1; + /// Rho ID of readout cell + G4int fRhoId = -1; + /// Phi ID of readout cell + G4int fPhiId = -1; + /// Position + G4ThreeVector fPos = { -1, -1, -1 }; + /// Rotation + G4RotationMatrix fRot; + /// Time + G4double fTime = -1; + /// Type: 0 = full sim, 1 = fast sim + G4int fType = -1; + /// Pointer to logical volume for visualisation + G4LogicalVolume* fLogVol = nullptr; +}; + +typedef G4THitsCollection Par04HitsCollection; + +extern G4ThreadLocal G4Allocator* Par04HitAllocator; + +inline void* Par04Hit::operator new(size_t) +{ + if(!Par04HitAllocator) + Par04HitAllocator = new G4Allocator; + return (void*) Par04HitAllocator->MallocSingle(); +} + +inline void Par04Hit::operator delete(void* aHit) +{ + Par04HitAllocator->FreeSingle((Par04Hit*) aHit); +} + +#endif /* PAR04HIT_HH */ diff --git a/examples/extended/parameterisations/Par04/include/Par04InferenceInterface.hh b/examples/extended/parameterisations/Par04/include/Par04InferenceInterface.hh new file mode 100644 index 0000000000..890a272fb1 --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04InferenceInterface.hh @@ -0,0 +1,54 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifdef USE_INFERENCE +#ifndef PAR04INFERENCEINTERFACE_HH +#define PAR04INFERENCEINTERFACE_HH + +#include "globals.hh" +using namespace std; + +/** + * @brief Inference interface + * + * Base class interface that allows to read in ML models and run the inference. + * + */ + +class Par04InferenceInterface +{ + public: + virtual ~Par04InferenceInterface(){}; + + /// Run inference + /// @param[in] aGenVector Input latent space and conditions + /// @param[out] aEnergies Model output = generated shower energies + /// @param[in] aSize Size of the output + virtual void RunInference(vector aGenVector, std::vector& aEnergies, + int aSize) = 0; +}; + +#endif /* PAR04INFERENCEINTERFACE_HH */ +#endif diff --git a/examples/extended/parameterisations/Par04/include/Par04InferenceMessenger.hh b/examples/extended/parameterisations/Par04/include/Par04InferenceMessenger.hh new file mode 100644 index 0000000000..d2c09305a1 --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04InferenceMessenger.hh @@ -0,0 +1,92 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifdef USE_INFERENCE +#ifndef PAR04INFERENCEMESSENGER_H +#define PAR04INFERENCEMESSENGER_H +#include "G4UImessenger.hh" + +class Par04InferenceSetup; +class G4UIdirectory; +class G4UIcmdWithoutParameter; +class G4UIcmdWithAnInteger; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithAString; + +/** + * @brief Inference messenger. + * + * Provides UI commands to setup the inference: name of the inference library, + * path to the ML model, size of the latent space, the size of the condition vector and + * flags for optimization and profiling. + * It allows to specify the mesh size (in cylindrical coordinates) that was used in training dataset + * (full simulation). + * + */ + +class Par04InferenceMessenger : public G4UImessenger +{ + public: + Par04InferenceMessenger(Par04InferenceSetup*); + ~Par04InferenceMessenger(); + /// Invokes appropriate methods based on the typed command + virtual void SetNewValue(G4UIcommand*, G4String) final; + /// Retrieves the current settings + virtual G4String GetCurrentValue(G4UIcommand*) final; + + private: + /// Inference to setup + Par04InferenceSetup* fInference = nullptr; + /// Command to set the directory common to all inference messengers in this example + /// /Par04 + G4UIdirectory* fExampleDir = nullptr; + /// Command to set the directory for inference settings /Par04/inference + G4UIdirectory* fInferenceDir = nullptr; + /// Command to set the inference library + G4UIcmdWithAString* fInferenceLibraryCmd = nullptr; + /// Command to set fModelPathNameCmd + G4UIcmdWithAString* fModelPathNameCmd = nullptr; + /// Command to set the fSizeLatentVectorCmd + G4UIcmdWithAnInteger* fSizeLatentVectorCmd = nullptr; + /// Command to set the fSizeConditionVectorCmd + G4UIcmdWithAnInteger* fSizeConditionVectorCmd = nullptr; + /// Command to set the fProfileFlagCmd + G4UIcmdWithAnInteger* fProfileFlagCmd = nullptr; + /// Command to set the fOptimizationFlagCmd + G4UIcmdWithAnInteger* fOptimizationFlagCmd = nullptr; + /// Command to set the number of cells in the cylindrical readout mesh (along rho axis) + G4UIcmdWithAnInteger* fMeshNbRhoCellsCmd = nullptr; + /// Command to set the number of cells in the cylindrical readout mesh (along phi axis) + G4UIcmdWithAnInteger* fMeshNbPhiCellsCmd = nullptr; + /// Command to set the number of cells in the cylindrical readout mesh (along z axis) + G4UIcmdWithAnInteger* fMeshNbZCellsCmd = nullptr; + /// Command to the size of cells in the cylindrical readout mesh (along rho axis) + G4UIcmdWithADoubleAndUnit* fMeshSizeRhoCellsCmd = nullptr; + /// Command to the size of cells in the cylindrical readout mesh (along z axis) + G4UIcmdWithADoubleAndUnit* fMeshSizeZCellsCmd = nullptr; +}; + +#endif +#endif diff --git a/examples/extended/parameterisations/Par04/include/Par04InferenceSetup.hh b/examples/extended/parameterisations/Par04/include/Par04InferenceSetup.hh new file mode 100644 index 0000000000..eaf4018d7c --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04InferenceSetup.hh @@ -0,0 +1,189 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifdef USE_INFERENCE +#ifndef PAR04INFEERENCESETUP_HH +#define PAR04INFEERENCESETUP_HH + +#include "G4ThreeVector.hh" +#include "globals.hh" +#include "CLHEP/Units/SystemOfUnits.h" + +#include "Par04DetectorConstruction.hh" +#include "Par04InferenceMessenger.hh" +#include "Par04InferenceInterface.hh" + +namespace CLHEP +{ + class HepRandomEngine; +} +class Par04InferenceMessenger; + +/** + * @brief Inference setup. + * + * Constructs the input vector of size b+c to run the inference, b represents the size of + * the latent space (or the encoded space in a Variational Autoencoder based model), + * c represents the size of the conditional vector. The b values of the input vector + * are randomly sampled from b-dimensional Gaussian distribution. The c values + * represent respectively the condition values of the particle energy, angle and + * detector geometry. These condition values are user-specific application. + * The energy rescaling is used to retrieve the original energy scale in MeV. + * Computes the cell position in the detector of each inferred energy value. + * + **/ + +class Par04InferenceSetup +{ + public: + Par04InferenceSetup(); + ~Par04InferenceSetup(); + + /// Geometry setup + /// Check if inference should be performed for the particle + /// @param[in] aEnergy Particle's energy + G4bool IfTrigger(G4double aEnergy); + /// Specify if cylindrical coordinates are to be used (or Carthesian instead). + inline void SetIfCylindrical(const G4bool aIfCylindrical) { fIfCylindrical = aIfCylindrical; }; + /// Get flag specifying if cylindrical are used (or Carthesian instead). + inline G4double GetIfCylindrical() const { return fIfCylindrical; }; + /// Set mesh size. + /// @param aSize (x,y,x) size for Carthesian coordinates, or (R, phi, z) for + /// cylindrical coordinates. + inline void SetMeshSize(const G4ThreeVector& aSize) { fMeshSize = aSize; }; + /// Get mesh size. + /// @return G4ThreeVector (x,y,x) size for Carthesian coordinates, or (R, phi, + /// z) for cylindrical coordinates. + inline G4ThreeVector GetMeshSize() const { return fMeshSize; }; + /// Set number of mesh cells. + /// @param aSize (x,y,x) size for Carthesian coordinates, or (R, phi, z) for + /// cylindrical coordinates. + inline void SetMeshNumber(const G4ThreeVector& aSize) { fMeshNumber = aSize; }; + /// Get number of mesh cells. + /// @return G4ThreeVector (x,y,x) size for Carthesian coordinates, or (R, phi, + /// z) for cylindrical coordinates. + inline G4ThreeVector GetMeshNumber() const { return fMeshNumber; }; + /// Set size of the condition vector + inline void SetSizeConditionVector(G4int aNumber) { fSizeConditionVector = aNumber; }; + /// Get size of the condition vector + inline G4int GetSizeConditionVector() const { return fSizeConditionVector; }; + /// Set size of the latent space vector + inline void SetSizeLatentVector(G4int aNumber) { fSizeLatentVector = aNumber; }; + /// Get size of the latent space vector + inline G4int GetSizeLatentVector() const { return fSizeLatentVector; }; + /// Set path and name of the model + inline void SetModelPathName(G4String aName) { fModelPathName = aName; }; + /// Get path and name of the model + inline G4String GetModelPathName() const { return fModelPathName; }; + /// Set profiling flag + inline void SetProfileFlag(G4int aNumber) { fProfileFlag = aNumber; }; + /// Get profiling flag + inline G4int GetProfileFlag() const { return fProfileFlag; }; + /// Set optimization flag + inline void SetOptimizationFlag(G4int aNumber) { fOptimizationFlag = aNumber; }; + /// Get optimization flag + inline G4int GetOptimizationFlag() const { return fOptimizationFlag; }; + /// Get name of the inference library + inline G4String GetInferenceLibrary() const { return fInferenceLibrary; }; + /// Set name of the inference library and create a pointer to chosen inference interface + void SetInferenceLibrary(G4String aName); + /// Check settings of the inference library + void CheckInferenceLibrary(); + /// Set number of Mesh cells in cylindrical coordinates (r, phi, z) + inline void SetMeshNbOfCells(G4ThreeVector aNb) { fMeshNumber = aNb; }; + /// Set number of Mesh cells in cylindrical coordinates + /// @param[in] aIndex index of cylindrical axis (0,1,2) = (r, phi, z) + inline void SetMeshNbOfCells(G4int aIndex, G4double aNb) { fMeshNumber[aIndex] = aNb; }; + /// Get number of Mesh cells in cylindrical coordinates (r, phi, z) + inline G4ThreeVector GetMeshNbOfCells() const { return fMeshNumber; }; + /// Set size of Mesh cells in cylindrical coordinates (r, phi, z) + inline void SetMeshSizeOfCells(G4ThreeVector aNb) { fMeshSize = aNb; }; + /// Set size of Mesh cells in cylindrical coordinates + /// @param[in] aIndex index of cylindrical axis (0,1,2) = (r, phi, z) + inline void SetMeshSizeOfCells(G4int aIndex, G4double aNb) { fMeshSize[aIndex] = aNb; }; + /// Get size of Mesh cells in cylindrical coordinates (r, phi, z) + inline G4ThreeVector GetMeshSizeOfCells() const { return fMeshSize; }; + + /// Execute inference + /// @param[out] aDepositsEnergies of inferred energies deposited in the + /// detector + /// @param[in] aParticleEnergy Energy of initial particle + void GetEnergies(std::vector& aEnergies, G4double aParticleEnergy, + G4float aInitialAngle); + + /// Calculate positions + /// @param[out] aDepositsPositions Vector of positions corresponding to + /// energies deposited in the detector + /// @param[in] aParticlePosition Initial particle position which is centre of + /// transverse plane of the mesh + /// and beginning of the mesh in the longitudinal direction + /// @param[in] aParticleDirection Initial particle direction for the mesh + /// rotation + void GetPositions(std::vector& aDepositsPositions, G4ThreeVector aParticlePosition, + G4ThreeVector aParticleDirection); + + private: + /// Pointer to detector construction to retrieve (once) the detector + /// dimensions + Par04DetectorConstruction* fDetector; + // Alpha parameter of the Sigma distribution + /// Can be changed with UI command `/example/mesh/cylindrical ` + bool fIfCylindrical = true; + /// Cell's size: (x,y,x) for Carthesian, and (R, phi, z) for cylindrical + /// coordinates Can be changed with UI command `/example/mesh/size / `. For cylindrical coordinates phi is ignored and calculated + /// from fMeshNumber. + G4ThreeVector fMeshSize = G4ThreeVector(2.325 * CLHEP::mm, 1, 3.4 * CLHEP::mm); + /// Number of cells: (x,y,x) for Carthesian, and (R, phi, z) for cylindrical + /// coordinates. Can be changed with UI command `/example/mesh/number /` + G4ThreeVector fMeshNumber = G4ThreeVector(18, 50, 45); + /// Inference interface + std::unique_ptr fInferenceInterface; + /// Inference messenger + Par04InferenceMessenger* fInferenceMessenger; + /// Maximum particle energy value (in MeV) in the training range + float fMaxEnergy = 1024000.0; + /// Maximum particle angle (in degrees) in the training range + float fMaxAngle = 90.0; + /// Name of the inference library + G4String fInferenceLibrary = "ONNX"; + /// Size of the latent space vector + G4int fSizeLatentVector = 10; + /// Size of the condition vector + G4int fSizeConditionVector = 4; + /// Name of the inference library + G4String fModelPathName = "MLModels/Generator.onnx"; + /// ONNX specific + /// Profiling flag + G4bool fProfileFlag = false; + /// Optimization flag + G4bool fOptimizationFlag = false; + /// Intra-operation number of threads + G4int fIntraOpNumThreads = 1; +}; + +#endif /* PAR04INFEERENCESETUP_HH */ +#endif diff --git a/examples/advanced/gammaray_telescope/include/GammaRayTelGeneralPhysics.hh b/examples/extended/parameterisations/Par04/include/Par04LwtnnInference.hh similarity index 58% rename from examples/advanced/gammaray_telescope/include/GammaRayTelGeneralPhysics.hh rename to examples/extended/parameterisations/Par04/include/Par04LwtnnInference.hh index dc4f6f4ef4..7fab6c1d9e 100644 --- a/examples/advanced/gammaray_telescope/include/GammaRayTelGeneralPhysics.hh +++ b/examples/extended/parameterisations/Par04/include/Par04LwtnnInference.hh @@ -23,56 +23,45 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// -// -// -// ------------------------------------------------------------ -// GEANT 4 class header file -// Class Description: -// This class is an derived class of G4VPhysicsConstructor -// -// ------------------------------------------- -// History -// first version 12 Nov. 2000 by H.Kurashige -// ------------------------------------------------------------ -#ifndef GammaRayTelGeneralPhysics_h -#define GammaRayTelGeneralPhysics_h 1 -#include "globals.hh" -#include "G4ios.hh" +#ifdef USE_INFERENCE_LWTNN +#ifndef PAR04LWTNNINFERENCE_HH +#define PAR04LWTNNINFERENCE_HH -#include "G4VPhysicsConstructor.hh" +#include "Par04InferenceInterface.hh" +#include "lwtnn/LightweightGraph.hh" +#include "lwtnn/parse_json.hh" +#include +/** + * @brief Inference using the LWTNN library. + * + * Initializes a computation object or a light weight graph using the ML model saved + * as a JSON file. + * Runs the inference by evaluating the graph on the input vector from Par04InferenceSetup. + * + **/ -#include "G4Decay.hh" +using namespace std; -class GammaRayTelGeneralPhysics : public G4VPhysicsConstructor +class Par04LwtnnInference : public Par04InferenceInterface { - public: - GammaRayTelGeneralPhysics(const G4String& name = "general"); - virtual ~GammaRayTelGeneralPhysics(); + public: + Par04LwtnnInference(G4String); + Par04LwtnnInference(); - public: - // This method will be invoked in the Construct() method. - // each particle type will be instantiated - virtual void ConstructParticle(); - - // This method will be invoked in the Construct() method. - // each physics process will be instantiated and - // registered to the process manager of each particle type - virtual void ConstructProcess(); + /// Run inference + /// @param[in] aGenVector Input latent space and conditions + /// @param[out] aEnergies Model output = generated shower energies + /// @param[in] aSize Size of the output + void RunInference(vector aGenVector, std::vector& aEnergies, int aSize); - protected: - G4Decay fDecayProcess; + private: + /// LWTNN graph , Network input and output vectors + std::unique_ptr fGraph; + typedef std::map> fNetworkInputs; + typedef std::map fNetworkOutputs; }; - +#endif /* PAR04LWTNNINFERENCE_HH */ #endif - - - - - - - - diff --git a/examples/advanced/gammaray_telescope/include/GammaRayTelHadronPhysics.hh b/examples/extended/parameterisations/Par04/include/Par04MLFastSimModel.hh similarity index 50% rename from examples/advanced/gammaray_telescope/include/GammaRayTelHadronPhysics.hh rename to examples/extended/parameterisations/Par04/include/Par04MLFastSimModel.hh index 320e630749..fab8628547 100644 --- a/examples/advanced/gammaray_telescope/include/GammaRayTelHadronPhysics.hh +++ b/examples/extended/parameterisations/Par04/include/Par04MLFastSimModel.hh @@ -23,40 +23,53 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// -// ------------------------------------------------------------ -// GEANT 4 class header file -// -// This class is an derived class of G4VPhysicsConstructor -// -// ------------------------------------------------------------ -#ifndef GammaRayTelHadronPhysics_h -#define GammaRayTelHadronPhysics_h 1 +#ifdef USE_INFERENCE +#ifndef PAR04MLFASTSIMMODEL_HH +#define PAR04MLFASTSIMMODEL_HH -#include "globals.hh" +#include "G4VFastSimulationModel.hh" +#include "G4VPhysicalVolume.hh" #include "G4ios.hh" +#include "Par04InferenceSetup.hh" -#include "G4VPhysicsConstructor.hh" +class G4FastSimHitMaker; +/** + * @brief Inference for the fast simulation model. + * + * Parametrisation of electrons, positrons, and gammas. Energy is deposited and + * distributed according to ML inference. This class is only a shell that + * triggers the inference, asks for values, and deposits energies at + * given positions. + * + **/ -class GammaRayTelHadronPhysics : public G4VPhysicsConstructor +class Par04MLFastSimModel : public G4VFastSimulationModel { - public: - GammaRayTelHadronPhysics(const G4String& name ="hadron"); - virtual ~GammaRayTelHadronPhysics(); - - public: - // This method will be invoked in the Construct() method. - // each particle type will be instantiated - void ConstructParticle(){}; - - // This method will be invoked in the Construct() method. - // each physics process will be instantiated and - // registered to the process manager of each particle type - void ConstructProcess(); + public: + Par04MLFastSimModel(G4String, G4Region*); + Par04MLFastSimModel(G4String); + ~Par04MLFastSimModel(); + /// There are no kinematics constraints. True is returned. + virtual G4bool ModelTrigger(const G4FastTrack&) final; + /// Model is applicable to electrons, positrons, and photons. + virtual G4bool IsApplicable(const G4ParticleDefinition&) final; + /// Take particle out of the full simulation (kill it at the entrance + /// depositing all the energy). Calculate energy deposited in the detector + /// from the NN model inference. + virtual void DoIt(const G4FastTrack&, G4FastStep&) final; + private: + /// Inference model that is NN aware + Par04InferenceSetup* fInference; + /// Inference model that is NN aware + /// Helper class for creation of hits within the sensitive detector + std::unique_ptr fHitMaker; + /// Vector of energy values + std::vector fEnergies; + /// Vector of positions corresponding to energy values (const for one NN + /// model) + std::vector fPositions; }; - - +#endif /* PAR04INFERENCEMODEL_HH */ #endif - diff --git a/environments/g4py/tests/g4pytest/ezgeom/G4EzVoxelParameterization.hh b/examples/extended/parameterisations/Par04/include/Par04OnnxInference.hh similarity index 53% rename from environments/g4py/tests/g4pytest/ezgeom/G4EzVoxelParameterization.hh rename to examples/extended/parameterisations/Par04/include/Par04OnnxInference.hh index dd8d97632e..1f60386a54 100644 --- a/environments/g4py/tests/g4pytest/ezgeom/G4EzVoxelParameterization.hh +++ b/examples/extended/parameterisations/Par04/include/Par04OnnxInference.hh @@ -23,41 +23,53 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// G4EzVoxelParameterization.hh -// -// 2005 Q -// ==================================================================== -#ifndef G4EZ_VOXEL_PARAMETERIZATION_H -#define G4EZ_VOXEL_PARAMETERIZATION_H -#include "G4VPVParameterisation.hh" +#ifdef USE_INFERENCE_ONNX +#ifndef PAR04ONNXINFERENCE_HH +#define PAR04ONNXINFERENCE_HH + +#include "Par04InferenceInterface.hh" +#include "CLHEP/Units/SystemOfUnits.h" #include "G4ThreeVector.hh" +#include "globals.hh" +#include "core/session/onnxruntime_cxx_api.h" -// ==================================================================== -// -// class definition -// -// ==================================================================== +/** + * @brief Inference using the ONNX runtime. + * + * Creates an enviroment whcih manages an internal thread pool and creates an + * inference session for the model saved as an ONNX file. + * Runs the inference in the session using the input vector from Par04InferenceSetup. + * + **/ -class G4EzVoxelParameterization : public G4VPVParameterisation { -protected: - G4ThreeVector voxelSize; - G4ThreeVector motherSize; - G4int nvoxels[3]; +class Par04OnnxInference : public Par04InferenceInterface +{ + public: + Par04OnnxInference(G4String, G4int, G4int, G4int); + Par04OnnxInference(); -public: - G4EzVoxelParameterization(G4double ddx, G4double ddy, G4double ddz, - G4int nx, G4int ny, G4int nz); + /// Run inference + /// @param[in] aGenVector Input latent space and conditions + /// @param[out] aEnergies Model output = generated shower energies + /// @param[in] aSize Size of the output + void RunInference(vector aGenVector, std::vector& aEnergies, int aSize); - ~G4EzVoxelParameterization(); - - virtual void ComputeTransformation(const G4int copyNo, - G4VPhysicalVolume* physVol) const; - - using G4VPVParameterisation::ComputeDimensions; - virtual void ComputeDimensions(G4Box& aBox, const G4int copyNo, - const G4VPhysicalVolume* physVol) const; + private: + /// Pointer to the ONNX enviroment + std::unique_ptr fEnv; + /// Pointer to the ONNX inference session + std::unique_ptr fSession; + /// ONNX settings + Ort::SessionOptions fSessionOptions; + /// ONNX memory info + const OrtMemoryInfo* fInfo; + struct MemoryInfo; + /// the input names represent the names given to the model + /// when defining the model's architecture (if applicable) + /// they can also be retrieved from model.summary() + std::vector fInames; }; +#endif /* PAR04ONNXINFERENCE_HH */ #endif diff --git a/source/visualization/HepRep/include/G4HepRep.hh b/examples/extended/parameterisations/Par04/include/Par04PrimaryGeneratorAction.hh similarity index 70% rename from source/visualization/HepRep/include/G4HepRep.hh rename to examples/extended/parameterisations/Par04/include/Par04PrimaryGeneratorAction.hh index 5a6938ec53..0a42dbb1a8 100644 --- a/source/visualization/HepRep/include/G4HepRep.hh +++ b/examples/extended/parameterisations/Par04/include/Par04PrimaryGeneratorAction.hh @@ -23,30 +23,33 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// +#ifndef PAR04PRIMARYGENERATORACTION_HH +#define PAR04PRIMARYGENERATORACTION_HH + +#include "G4VUserPrimaryGeneratorAction.hh" // for G4VUserPrimaryGeneratorA... +class G4Event; +class G4ParticleGun; /** - * @author Mark Donszelmann + * @brief Generator of particles + * + * Creates single particle events using a particle gun. Particle gun can be + * configured using UI commands '/gun/'. + * */ -#ifndef G4HEPREP_HH -#define G4HEPREP_HH 1 -//G4 -#include "G4VGraphicsSystem.hh" +class Par04PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ + public: + Par04PrimaryGeneratorAction(); + virtual ~Par04PrimaryGeneratorAction(); -class G4HepRep: public G4VGraphicsSystem { - public: - G4HepRep (); - virtual ~G4HepRep (); - G4VSceneHandler* CreateSceneHandler (const G4String& name = ""); - G4VViewer* CreateViewer (G4VSceneHandler&, const G4String& name = ""); + /// Generate primary particles + virtual void GeneratePrimaries(G4Event*) final; - void removeSceneHandler(); - void removeViewer(); - - private: - G4VSceneHandler* sceneHandler; - G4VViewer* viewer; + private: + /// Particle gun + G4ParticleGun* fParticleGun = nullptr; }; -#endif +#endif /* PAR04PRIMARYGENERATORACTION_HH */ diff --git a/examples/extended/parameterisations/Par04/include/Par04RunAction.hh b/examples/extended/parameterisations/Par04/include/Par04RunAction.hh new file mode 100644 index 0000000000..8d018ed873 --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04RunAction.hh @@ -0,0 +1,77 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifndef PAR04RUNACTION_HH +#define PAR04RUNACTION_HH + +#include "G4UserRunAction.hh" +#include "Par04PrimaryGeneratorAction.hh" +#include // for GeV +#include // for G4String +#include // for G4ThreeVector +#include // for G4int +#include // for G4VUserPrimaryGeneratorA... +#include // for basic_string +#include "G4Event.hh" // for G4Event +#include "G4ParticleGun.hh" // for G4ParticleGun +#include "G4ParticleTable.hh" // for G4ParticleTable +#include "G4SystemOfUnits.hh" // for GeV +#include "Par04EventInformation.hh" // for Par04EventInformation +class G4ParticleDefinition; +class Par04EventAction; +class G4Run; +class Par04DetectorConstruction; + +/** + * @brief Run action + * + * Create analysis file and define control histograms for showers in detectors. + * Histograms are configured taking into account the dimensions of the readout mesh. + * Ntuple with hits is also stored. It contains energy of the primary particle, + * coordinates (cylindrical) of the hit and the deposited energy. + * + */ + +class Par04RunAction : public G4UserRunAction +{ + public: + /// Constructor. Defines the histograms. + Par04RunAction(Par04DetectorConstruction* aDetector, Par04EventAction* aEventAction); + virtual ~Par04RunAction(); + + /// Open the file for the analysis + virtual void BeginOfRunAction(const G4Run*) final; + /// Write and close the file + virtual void EndOfRunAction(const G4Run*) final; + + private: + /// Pointer to detector construction to retrieve the detector dimensions to + /// setup the histograms + Par04DetectorConstruction* fDetector; + /// Pointer to event action to save hits + Par04EventAction* fEventAction; +}; + +#endif /* PAR04RUNACTION_HH */ diff --git a/examples/extended/parameterisations/Par04/include/Par04SensitiveDetector.hh b/examples/extended/parameterisations/Par04/include/Par04SensitiveDetector.hh new file mode 100644 index 0000000000..81d7b5518e --- /dev/null +++ b/examples/extended/parameterisations/Par04/include/Par04SensitiveDetector.hh @@ -0,0 +1,92 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifndef PAR04SENSITIVEDETECTOR_HH +#define PAR04SENSITIVEDETECTOR_HH + +#include // for m, pi +#include // for G4String +#include // for G4bool, G4int +#include "G4SystemOfUnits.hh" // for m +#include "G4ThreeVector.hh" // for G4ThreeVector +#include "G4VFastSimSensitiveDetector.hh" // for G4VFastSimSensitiveDetector +#include "G4VSensitiveDetector.hh" // for G4VSensitiveDetector +#include "Par04Hit.hh" // for Par04Hit (ptr only), Par04... +class G4FastHit; +class G4FastTrack; +class G4HCofThisEvent; +class G4Step; +class G4TouchableHistory; + +/** + * @brief Sensitive detector. + * + * Describes how to store the energy deposited within the detector. + * It derives from two classes: G4VSensitiveDetector and + * G4VFastSimSensitiveDetector. Addition of G4VFastSimSensitiveDetector is + * necessary in order to handle the energy deposits from the fast simulation. + * + * Two ProcessHits() methods are introduced to handle energy deposited from full + * (detailed) simulation, and from fast simulation. The common part is handled + * by RetrieveAdnSetupHit() method. + * + */ + +class Par04SensitiveDetector + : public G4VSensitiveDetector + , public G4VFastSimSensitiveDetector +{ + public: + Par04SensitiveDetector(G4String aName); + Par04SensitiveDetector(G4String aName, G4ThreeVector aNbOfCells, G4ThreeVector aNSizeOfCells); + virtual ~Par04SensitiveDetector(); + /// Create hit collection + virtual void Initialize(G4HCofThisEvent* HCE) final; + /// Process energy deposit from the full simulation. + virtual G4bool ProcessHits(G4Step* aStep, G4TouchableHistory* aROhist) final; + /// Process energy deposit from the fast simulation. + virtual G4bool ProcessHits(const G4FastHit* aHit, const G4FastTrack* aTrack, + G4TouchableHistory* aROhist) final; + /// Process energy deposit - common part for full and fast simulation + /// It is invoked from ProcessHits() methods, and sets basic hit properties + /// (position, etc.), common for hit from fast and full simulation. + Par04Hit* RetrieveAndSetupHit(G4ThreeVector aPosition); + + private: + /// Collection of hits + Par04HitsCollection* fHitsCollection = nullptr; + /// ID of collection of hits + G4int fHitCollectionID = -1; + /// Number of mesh readout cells in cylindrical coordinates + G4ThreeVector fMeshNbOfCells = { 10, 10, 10 }; + /// Size of mesh readout cells in cylindrical coordinates. + G4ThreeVector fMeshSizeOfCells = { 1 * m, 2 * CLHEP::pi / 10., 1 * m }; + /// Retrieved once per event: position of entering particle + G4ThreeVector fEntrancePosition = { -1, -1, -1 }; + /// Retrieved once per event: direction of entering particle + G4ThreeVector fEntranceDirection = { -1, -1, -1 }; +}; + +#endif /* PAR04SENSITIVEDETECTOR_HH */ diff --git a/examples/basic/B4/B4a/src/B4aActionInitialization.cc b/examples/extended/parameterisations/Par04/src/Par04ActionInitialisation.cc similarity index 68% rename from examples/basic/B4/B4a/src/B4aActionInitialization.cc rename to examples/extended/parameterisations/Par04/src/Par04ActionInitialisation.cc index 0c94d5fa95..3b0adc7464 100644 --- a/examples/basic/B4/B4a/src/B4aActionInitialization.cc +++ b/examples/extended/parameterisations/Par04/src/Par04ActionInitialisation.cc @@ -23,46 +23,37 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// -/// \file B4aActionInitialization.cc -/// \brief Implementation of the B4aActionInitialization class - -#include "B4aActionInitialization.hh" -#include "B4PrimaryGeneratorAction.hh" -#include "B4RunAction.hh" -#include "B4aEventAction.hh" -#include "B4aSteppingAction.hh" -#include "B4DetectorConstruction.hh" +#include "Par04ActionInitialisation.hh" +#include // for G4VUserActionInitialization +#include "Par04EventAction.hh" // for Par04EventAction +#include "Par04PrimaryGeneratorAction.hh" // for Par04PrimaryGeneratorAction +#include "Par04RunAction.hh" // for Par04RunAction //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4aActionInitialization::B4aActionInitialization - (B4DetectorConstruction* detConstruction) - : G4VUserActionInitialization(), - fDetConstruction(detConstruction) +Par04ActionInitialisation::Par04ActionInitialisation(Par04DetectorConstruction* aDetector) + : G4VUserActionInitialization() + , fDetector(aDetector) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B4aActionInitialization::~B4aActionInitialization() -{} +Par04ActionInitialisation::~Par04ActionInitialisation() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4aActionInitialization::BuildForMaster() const +void Par04ActionInitialisation::BuildForMaster() const { - SetUserAction(new B4RunAction); + auto eventAction = new Par04EventAction(fDetector); + SetUserAction(new Par04RunAction(fDetector, eventAction)); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B4aActionInitialization::Build() const +void Par04ActionInitialisation::Build() const { - SetUserAction(new B4PrimaryGeneratorAction); - SetUserAction(new B4RunAction); - auto eventAction = new B4aEventAction; + SetUserAction(new Par04PrimaryGeneratorAction()); + auto eventAction = new Par04EventAction(fDetector); SetUserAction(eventAction); - SetUserAction(new B4aSteppingAction(fDetConstruction,eventAction)); + SetUserAction(new Par04RunAction(fDetector, eventAction)); } - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/parameterisations/Par04/src/Par04DefineMeshModel.cc b/examples/extended/parameterisations/Par04/src/Par04DefineMeshModel.cc new file mode 100644 index 0000000000..8b8afe0405 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04DefineMeshModel.cc @@ -0,0 +1,88 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "Par04DefineMeshModel.hh" +#include // for G4FastTrack +#include // for G4Track +#include // for G4VFastSimulationModel +#include // for G4VUserEventInformation +#include "G4Event.hh" // for G4Event +#include "G4EventManager.hh" // for G4EventManager +#include "Par04EventInformation.hh" // for Par04EventInformation +class G4FastStep; +class G4ParticleDefinition; +class G4Region; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04DefineMeshModel::Par04DefineMeshModel(G4String aModelName, G4Region* aEnvelope) + : G4VFastSimulationModel(aModelName, aEnvelope) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04DefineMeshModel::Par04DefineMeshModel(G4String aModelName) + : G4VFastSimulationModel(aModelName) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04DefineMeshModel::~Par04DefineMeshModel() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4bool Par04DefineMeshModel::IsApplicable(const G4ParticleDefinition&) +{ + return true; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4bool Par04DefineMeshModel::ModelTrigger(const G4FastTrack&) +{ + Par04EventInformation* info = dynamic_cast( + G4EventManager::GetEventManager()->GetConstCurrentEvent()->GetUserInformation()); + // check if particle direction and position were already set for this event + if(info != nullptr) + return !info->GetFlag(); + else + return true; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04DefineMeshModel::DoIt(const G4FastTrack& aFastTrack, G4FastStep&) +{ + Par04EventInformation* info = dynamic_cast( + G4EventManager::GetEventManager()->GetConstCurrentEvent()->GetUserInformation()); + if(info == nullptr) + { + info = new Par04EventInformation(); + G4EventManager::GetEventManager()->GetNonconstCurrentEvent()->SetUserInformation(info); + } + info->SetPosition(aFastTrack.GetPrimaryTrack()->GetPosition()); + info->SetDirection(aFastTrack.GetPrimaryTrack()->GetMomentumDirection()); + info->SetFlag(true); +} diff --git a/examples/extended/parameterisations/Par04/src/Par04DetectorConstruction.cc b/examples/extended/parameterisations/Par04/src/Par04DetectorConstruction.cc new file mode 100644 index 0000000000..45e352001d --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04DetectorConstruction.cc @@ -0,0 +1,266 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "Par04DetectorConstruction.hh" +#include // for G4Colour +#include // for G4Exception +#include // for FatalException +#include // for rad +#include // for G4ThreeVector +#include // for G4VUserDetectorConstruction +#include // for G4endl, G4cout +#include // for max +#include // for accumulate +#include // for operator<<, basic_ostream +#include // for allocator, char_traits +#include "G4Box.hh" // for G4Box +#include "G4LogicalVolume.hh" // for G4LogicalVolume +#include "G4Material.hh" // for G4Material +#include "G4NistManager.hh" // for G4NistManager +#include "G4PVPlacement.hh" // for G4PVPlacement +#include "G4Region.hh" // for G4Region +#include "G4RegionStore.hh" // for G4RegionStore +#include "G4RunManager.hh" // for G4RunManager +#include "G4SDManager.hh" // for G4SDManager +#include "G4Tubs.hh" // for G4Tubs +#include "G4UnitsTable.hh" // for operator<<, G4BestUnit +#include "G4VisAttributes.hh" // for G4VisAttributes +#include "Par04DefineMeshModel.hh" // for Par04DefineMeshModel +#include "Par04DetectorMessenger.hh" // for Par04DetectorMessenger +#include "Par04SensitiveDetector.hh" // for Par04SensitiveDetector +class G4VPhysicalVolume; +#ifdef USE_INFERENCE +#include "Par04MLFastSimModel.hh" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04DetectorConstruction::Par04DetectorConstruction() + : G4VUserDetectorConstruction() +{ + fDetectorMessenger = new Par04DetectorMessenger(this); + G4NistManager* nistManager = G4NistManager::Instance(); + fAbsorberMaterial[0] = nistManager->FindOrBuildMaterial("G4_PbWO4"); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04DetectorConstruction::~Par04DetectorConstruction() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4VPhysicalVolume* Par04DetectorConstruction::Construct() +{ + //--------- Material definition --------- + G4NistManager* nistManager = G4NistManager::Instance(); + G4Material* air = nistManager->FindOrBuildMaterial("G4_AIR"); + + //--------- Derived dimensions --------- + G4double full2Pi = 2. * CLHEP::pi * rad; + G4double layerThickness = + std::accumulate(fAbsorberThickness.begin(), fAbsorberThickness.end(), 0.); + G4double detectorOuterRadius = fDetectorInnerRadius + fNbOfLayers * layerThickness; + G4double worldSizeXY = detectorOuterRadius * 4.; + G4double worldSizeZ = fDetectorLength * 2; + // check number of materials: (1 = homogeneous calo, 2 = sampling calo) + G4int nbOfMaterials = 0; + for(const auto material : fAbsorberMaterial) + { + if(material != nullptr) + nbOfMaterials++; + } + + //--------- World --------- + auto fSolidWorld = new G4Box("World", // name + worldSizeXY / 2., // half-width in X + worldSizeXY / 2., // half-width in Y + worldSizeZ / 2.); // half-width in Z + auto fLogicWorld = new G4LogicalVolume(fSolidWorld, // solid + air, // material + "World"); // name + auto fPhysicWorld = new G4PVPlacement(0, // no rotation + G4ThreeVector(), // at (0,0,0) + fLogicWorld, // logical volume + "World", // name + 0, // mother volume + false, // not used + 999, // copy number + true); // copy number + fLogicWorld->SetVisAttributes(G4VisAttributes::GetInvisible()); + + //--------- Detector envelope --------- + auto fSolidDetector = new G4Tubs("Detector", // name + fDetectorInnerRadius, // inner radius + detectorOuterRadius, // outer radius + fDetectorLength / 2., // half-width in Z + 0, // start angle + full2Pi); // delta angle + auto fLogicDetector = new G4LogicalVolume(fSolidDetector, // solid + air, // material + "Detector"); // name + new G4PVPlacement(0, // no rotation + G4ThreeVector(0, 0, 0), // detector centre at (0,0,0) + fLogicDetector, // logical volume + "Detector", // name + fLogicWorld, // mother volume + false, // not used + 99, // copy number + true); // check overlaps + + // Region for fast simulation + auto detectorRegion = new G4Region("DetectorRegion"); + detectorRegion->AddRootLogicalVolume(fLogicDetector); + + //--------- Detector layers: material --------- + std::array attribs; + attribs[0].SetColour(G4Colour(0, 0, 1, 0.1)); + attribs[0].SetForceSolid(true); + attribs[1].SetColour(G4Colour(1, 0, 0, 0.1)); + attribs[1].SetForceSolid(true); + /// useful variable + G4double innerRadius = fDetectorInnerRadius; + for(G4int iLayer = 0; iLayer < fNbOfLayers; iLayer++) + { + for(G4int iMaterial = 0; iMaterial < nbOfMaterials; iMaterial++) + { + auto fSolidLayer = new G4Tubs("Layer", // name + innerRadius, // inner radius + innerRadius + fAbsorberThickness[iMaterial], // outer radius + fDetectorLength / 2., // half-width in Z + 0, // start angle + full2Pi); // delta angle + G4LogicalVolume* logical = new G4LogicalVolume(fSolidLayer, // solid + fAbsorberMaterial[iMaterial], // material + "Layer"); // name + new G4PVPlacement(0, // no rotation + G4ThreeVector(), // place at centre of mother volume + logical, // logical volume + "Layer", // name + fLogicDetector, // mother volume + false, // not used + iLayer * nbOfMaterials + iMaterial, // copy number + true); // check overlaps + logical->SetVisAttributes(attribs[iMaterial]); + innerRadius += fAbsorberThickness[iMaterial]; + if(fAbsorberSensitivity[iMaterial]) + { + fLayerLogical.push_back(logical); + } + } + } + + Print(); + return fPhysicWorld; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04DetectorConstruction::ConstructSDandField() +{ + Par04SensitiveDetector* caloSD = + new Par04SensitiveDetector("sensitiveDetector", fMeshNbOfCells, fMeshSizeOfCells); + G4SDManager::GetSDMpointer()->AddNewDetector(caloSD); + for(const auto logical : fLayerLogical) + { + SetSensitiveDetector(logical, caloSD); + } + + auto detectorRegion = G4RegionStore::GetInstance()->GetRegion("DetectorRegion"); + // Par04DefineMeshModel needs to be first model to call + new Par04DefineMeshModel("defineMesh", detectorRegion); +#ifdef USE_INFERENCE + new Par04MLFastSimModel("inferenceModel", detectorRegion); +#endif +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04DetectorConstruction::Print() const +{ + G4cout << "\n------------------------------------------------------" + << "\n--- Detector length:\t" << G4BestUnit(fDetectorLength, "Length") + << "\n--- Detector inner radius:\t" << G4BestUnit(fDetectorInnerRadius, "Length") + << "\n--- Number of layers:\t" << fNbOfLayers << G4endl << "\n--- 1st layer: \t" + << G4BestUnit(fAbsorberThickness[0], "Length") << " of " + << (fAbsorberSensitivity[0] ? "active " : "passive ") << fAbsorberMaterial[0]->GetName() + << G4endl; + if(fAbsorberMaterial[1] != nullptr) + G4cout << "--- 2nd layer: \t" << G4BestUnit(fAbsorberThickness[1], "Length") << " of " + << (fAbsorberSensitivity[1] ? "active " : "passive ") << fAbsorberMaterial[1]->GetName() + << G4endl; + G4cout << "-----------------------------------------------------" << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04DetectorConstruction::SetAbsorberMaterial(const std::size_t aLayer, const G4String& aName) +{ + // search material by its name + G4Material* material = G4NistManager::Instance()->FindOrBuildMaterial(aName); + if(material) + fAbsorberMaterial[aLayer] = material; + else + G4Exception("Par04DetectorConstruction::SetAbsorberMaterial()", "InvalidSetup", FatalException, + ("Unknown material name: " + aName).c_str()); + G4RunManager::GetRunManager()->PhysicsHasBeenModified(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04DetectorConstruction::SetAbsorberThickness(const std::size_t aLayer, const G4double aThickness) +{ + if(aLayer < fAbsorberThickness.size()) + fAbsorberThickness[aLayer] = aThickness; + else + G4Exception("Par04DetectorConstruction::SetAbsorberThickness()", "InvalidSetup", FatalException, + ("Requested layer " + std::to_string(aLayer) + + " is larger than number of available layers (" + + std::to_string(fAbsorberThickness.size()) + ").") + .c_str()); + G4RunManager::GetRunManager()->PhysicsHasBeenModified(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04DetectorConstruction::SetAbsorberSensitivity(const std::size_t aLayer, const G4bool aSensitivity) +{ + if(aLayer < fAbsorberSensitivity.size()) + fAbsorberSensitivity[aLayer] = aSensitivity; + else + G4Exception( + "Par04DetectorConstruction::SetAbsorberSensitivity()", "InvalidSetup", FatalException, + ("Requested layer " + std::to_string(aLayer) + " is larger than number of available layers (" + + std::to_string(fAbsorberSensitivity.size()) + ").") + .c_str()); + G4RunManager::GetRunManager()->PhysicsHasBeenModified(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04DetectorConstruction::SetInnerRadius(G4double aRadius) { fDetectorInnerRadius = aRadius; } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04DetectorConstruction::SetLength(G4double aLength) { fDetectorLength = aLength; } diff --git a/examples/extended/parameterisations/Par04/src/Par04DetectorMessenger.cc b/examples/extended/parameterisations/Par04/src/Par04DetectorMessenger.cc new file mode 100644 index 0000000000..865b67cab1 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04DetectorMessenger.cc @@ -0,0 +1,267 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "Par04DetectorMessenger.hh" +#include // for pi +#include // for G4State_PreInit, G4State_Idle +#include // for G4ThreeVector +#include // for G4bool, G4double, G4int +#include // for G4UIcommand +#include // for G4UImessenger +#include // for G4UIparameter +#include // for basic_istream, basic_istream... +#include // for operator>> +#include "G4UIcmdWithADoubleAndUnit.hh" // for G4UIcmdWithADoubleAndUnit +#include "G4UIcmdWithAnInteger.hh" // for G4UIcmdWithAnInteger +#include "G4UIcmdWithoutParameter.hh" // for G4UIcmdWithoutParameter +#include "G4UIdirectory.hh" // for G4UIdirectory +#include "Par04DetectorConstruction.hh" // for Par04DetectorConstruction + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04DetectorMessenger::Par04DetectorMessenger(Par04DetectorConstruction* aDetector) + : G4UImessenger() + , fDetector(aDetector) +{ + fExampleDir = new G4UIdirectory("/Par04/"); + fExampleDir->SetGuidance("UI commands specific to this example"); + + fDetectorDir = new G4UIdirectory("/Par04/detector/"); + fDetectorDir->SetGuidance("Detector construction UI commands"); + + fPrintCmd = new G4UIcmdWithoutParameter("/Par04/detector/print", this); + fPrintCmd->SetGuidance("Print current settings."); + + fDetectorInnerRadiusCmd = + new G4UIcmdWithADoubleAndUnit("/Par04/detector/setDetectorInnerRadius", this); + fDetectorInnerRadiusCmd->SetGuidance("Set cylindrical detector inner radius"); + fDetectorInnerRadiusCmd->SetParameterName("Size", false); + fDetectorInnerRadiusCmd->SetRange("Size>0."); + fDetectorInnerRadiusCmd->SetUnitCategory("Length"); + fDetectorInnerRadiusCmd->AvailableForStates(G4State_PreInit); + fDetectorInnerRadiusCmd->SetToBeBroadcasted(false); + + fDetectorLengthCmd = new G4UIcmdWithADoubleAndUnit("/Par04/detector/setDetectorLength", this); + fDetectorLengthCmd->SetGuidance("Set length of the detector (cylinder length)"); + fDetectorLengthCmd->SetParameterName("Size", false); + fDetectorLengthCmd->SetRange("Size>0."); + fDetectorLengthCmd->SetUnitCategory("Length"); + fDetectorLengthCmd->AvailableForStates(G4State_PreInit); + fDetectorLengthCmd->SetToBeBroadcasted(false); + + fNbLayersCmd = new G4UIcmdWithAnInteger("/Par04/detector/setNbOfLayers", this); + fNbLayersCmd->SetGuidance("Set number of layers."); + fNbLayersCmd->SetParameterName("NbLayers", false); + fNbLayersCmd->SetRange("NbLayers>0"); + fNbLayersCmd->AvailableForStates(G4State_PreInit); + fNbLayersCmd->SetToBeBroadcasted(false); + + fAbsorCmd = new G4UIcommand("/Par04/detector/setAbsorber", this); + fAbsorCmd->SetGuidance("Set the absorber id, the material, the thickness."); + fAbsorCmd->SetGuidance(" absorber number : from 0 to 1"); + fAbsorCmd->SetGuidance(" material name"); + fAbsorCmd->SetGuidance(" thickness (with unit) : t>0"); + fAbsorCmd->SetGuidance(" if sensitive : true/false."); + G4UIparameter* absNbPrm = new G4UIparameter("AbsorNb", 'i', false); + absNbPrm->SetGuidance("absor number : from 0 to 1"); + absNbPrm->SetParameterRange("AbsorNb>-1&AbsoNb<2"); + fAbsorCmd->SetParameter(absNbPrm); + G4UIparameter* matPrm = new G4UIparameter("material", 's', false); + matPrm->SetGuidance("material name"); + fAbsorCmd->SetParameter(matPrm); + G4UIparameter* thickPrm = new G4UIparameter("thickness", 'd', false); + thickPrm->SetGuidance("thickness of absorber"); + thickPrm->SetParameterRange("thickness>0."); + fAbsorCmd->SetParameter(thickPrm); + G4UIparameter* unitPrm = new G4UIparameter("unit", 's', false); + unitPrm->SetGuidance("unit of thickness"); + G4String unitList = G4UIcommand::UnitsList(G4UIcommand::CategoryOf("mm")); + unitPrm->SetParameterCandidates(unitList); + fAbsorCmd->SetParameter(unitPrm); + G4UIparameter* sensitivePrm = new G4UIparameter("sensitive", 'b', false); + sensitivePrm->SetGuidance("if absorber is sensitive (registers energy deposits)"); + fAbsorCmd->SetParameter(sensitivePrm); + + fAbsorCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fAbsorCmd->SetToBeBroadcasted(false); + + fMeshDir = new G4UIdirectory("/Par04/mesh/"); + fMeshDir->SetGuidance("Mesh UI commands"); + + fMeshNbRhoCellsCmd = new G4UIcmdWithAnInteger("/Par04/mesh/setNbOfRhoCells", this); + fMeshNbRhoCellsCmd->SetGuidance("Set number of rho cells in the cylindrical mesh readout."); + fMeshNbRhoCellsCmd->SetParameterName("NbRhoCells", false); + fMeshNbRhoCellsCmd->SetRange("NbRhoCells>0"); + fMeshNbRhoCellsCmd->AvailableForStates(G4State_PreInit); + fMeshNbRhoCellsCmd->SetToBeBroadcasted(false); + + fMeshNbPhiCellsCmd = new G4UIcmdWithAnInteger("/Par04/mesh/setNbOfPhiCells", this); + fMeshNbPhiCellsCmd->SetGuidance("Set number of phi cells in the cylindrical mesh readout."); + fMeshNbPhiCellsCmd->SetParameterName("NbPhiCells", false); + fMeshNbPhiCellsCmd->SetRange("NbPhiCells>0"); + fMeshNbPhiCellsCmd->AvailableForStates(G4State_PreInit); + fMeshNbPhiCellsCmd->SetToBeBroadcasted(false); + + fMeshNbZCellsCmd = new G4UIcmdWithAnInteger("/Par04/mesh/setNbOfZCells", this); + fMeshNbZCellsCmd->SetGuidance("Set number of z cells in the cylindrical mesh readout."); + fMeshNbZCellsCmd->SetParameterName("NbZCells", false); + fMeshNbZCellsCmd->SetRange("NbZCells>0"); + fMeshNbZCellsCmd->AvailableForStates(G4State_PreInit); + fMeshNbZCellsCmd->SetToBeBroadcasted(false); + + fMeshSizeRhoCellsCmd = new G4UIcmdWithADoubleAndUnit("/Par04/mesh/setSizeOfRhoCells", this); + fMeshSizeRhoCellsCmd->SetGuidance("Set size of rho cells in the cylindrical readout mesh"); + fMeshSizeRhoCellsCmd->SetParameterName("Size", false); + fMeshSizeRhoCellsCmd->SetRange("Size>0."); + fMeshSizeRhoCellsCmd->SetUnitCategory("Length"); + fMeshSizeRhoCellsCmd->AvailableForStates(G4State_PreInit); + fMeshSizeRhoCellsCmd->SetToBeBroadcasted(false); + + fMeshSizeZCellsCmd = new G4UIcmdWithADoubleAndUnit("/Par04/mesh/setSizeOfZCells", this); + fMeshSizeZCellsCmd->SetGuidance("Set size of z cells in the cylindrical readout mesh"); + fMeshSizeZCellsCmd->SetParameterName("Size", false); + fMeshSizeZCellsCmd->SetRange("Size>0."); + fMeshSizeZCellsCmd->SetUnitCategory("Length"); + fMeshSizeZCellsCmd->AvailableForStates(G4State_PreInit); + fMeshSizeZCellsCmd->SetToBeBroadcasted(false); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04DetectorMessenger::~Par04DetectorMessenger() +{ + delete fPrintCmd; + delete fDetectorInnerRadiusCmd; + delete fDetectorLengthCmd; + delete fNbLayersCmd; + delete fAbsorCmd; + delete fDetectorDir; + delete fMeshNbRhoCellsCmd; + delete fMeshNbPhiCellsCmd; + delete fMeshNbZCellsCmd; + delete fMeshSizeRhoCellsCmd; + delete fMeshSizeZCellsCmd; + delete fMeshDir; + delete fExampleDir; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04DetectorMessenger::SetNewValue(G4UIcommand* aCommand, G4String aNewValue) +{ + if(aCommand == fPrintCmd) + { + fDetector->Print(); + } + else if(aCommand == fDetectorInnerRadiusCmd) + { + fDetector->SetInnerRadius(fDetectorInnerRadiusCmd->GetNewDoubleValue(aNewValue)); + } + else if(aCommand == fDetectorLengthCmd) + { + fDetector->SetLength(fDetectorInnerRadiusCmd->GetNewDoubleValue(aNewValue)); + } + else if(aCommand == fNbLayersCmd) + { + fDetector->SetNbOfLayers(fNbLayersCmd->GetNewIntValue(aNewValue)); + } + else if(aCommand == fAbsorCmd) + { + G4int num; + G4double thick; + G4String unt, mat; + G4bool sensitive; + std::istringstream is(aNewValue); + is >> num >> mat >> thick >> unt >> std::boolalpha >> sensitive; + G4String material = mat; + thick *= G4UIcommand::ValueOf(unt); + fDetector->SetAbsorberMaterial(num, material); + fDetector->SetAbsorberThickness(num, thick); + fDetector->SetAbsorberSensitivity(num, sensitive); + } + else if(aCommand == fMeshNbRhoCellsCmd) + { + fDetector->SetMeshNbOfCells(0, fMeshNbRhoCellsCmd->GetNewIntValue(aNewValue)); + } + else if(aCommand == fMeshNbPhiCellsCmd) + { + fDetector->SetMeshNbOfCells(1, fMeshNbPhiCellsCmd->GetNewIntValue(aNewValue)); + fDetector->SetMeshSizeOfCells(1, + 2. * CLHEP::pi / fMeshNbPhiCellsCmd->GetNewIntValue(aNewValue)); + } + else if(aCommand == fMeshNbZCellsCmd) + { + fDetector->SetMeshNbOfCells(2, fMeshNbZCellsCmd->GetNewIntValue(aNewValue)); + } + else if(aCommand == fMeshSizeRhoCellsCmd) + { + fDetector->SetMeshSizeOfCells(0, fMeshSizeRhoCellsCmd->GetNewDoubleValue(aNewValue)); + } + else if(aCommand == fMeshSizeZCellsCmd) + { + fDetector->SetMeshSizeOfCells(2, fMeshSizeZCellsCmd->GetNewDoubleValue(aNewValue)); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4String Par04DetectorMessenger::GetCurrentValue(G4UIcommand* aCommand) +{ + G4String cv; + + if(aCommand == fDetectorInnerRadiusCmd) + { + cv = fDetectorInnerRadiusCmd->ConvertToString(fDetector->GetInnerRadius(), "mm"); + } + else if(aCommand == fDetectorLengthCmd) + { + cv = fDetectorLengthCmd->ConvertToString(fDetector->GetLength(), "mm"); + } + else if(aCommand == fNbLayersCmd) + { + cv = fNbLayersCmd->ConvertToString(fDetector->GetNbOfLayers()); + } + else if(aCommand == fMeshNbRhoCellsCmd) + { + cv = fMeshNbRhoCellsCmd->ConvertToString(fDetector->GetMeshNbOfCells()[0]); + } + else if(aCommand == fMeshNbPhiCellsCmd) + { + cv = fMeshNbPhiCellsCmd->ConvertToString(fDetector->GetMeshNbOfCells()[1]); + } + else if(aCommand == fMeshNbZCellsCmd) + { + cv = fMeshNbZCellsCmd->ConvertToString(fDetector->GetMeshNbOfCells()[2]); + } + else if(aCommand == fMeshSizeRhoCellsCmd) + { + cv = fMeshSizeRhoCellsCmd->ConvertToString(fDetector->GetMeshSizeOfCells()[0]); + } + else if(aCommand == fMeshSizeZCellsCmd) + { + cv = fMeshSizeZCellsCmd->ConvertToString(fDetector->GetMeshSizeOfCells()[2]); + } + return cv; +} diff --git a/examples/extended/parameterisations/Par04/src/Par04EventAction.cc b/examples/extended/parameterisations/Par04/src/Par04EventAction.cc new file mode 100644 index 0000000000..b7a3a33bb3 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04EventAction.cc @@ -0,0 +1,203 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "Par04EventAction.hh" +#include // for GeV +#include // for Hep3Vector +#include // for size_t +#include // for G4Exception, G4ExceptionDesc... +#include // for FatalException +#include // for G4GenericAnalysisManager +#include // for G4PrimaryParticle +#include // for G4PrimaryVertex +#include // for GeV +#include // for G4THitsCollection +#include // for G4ThreeVector +#include // for G4Timer +#include // for G4UserEventAction +#include // for max +#include // for basic_ostream::operator<< +#include "G4AnalysisManager.hh" // for G4AnalysisManager +#include "G4Event.hh" // for G4Event +#include "G4EventManager.hh" // for G4EventManager +#include "G4HCofThisEvent.hh" // for G4HCofThisEvent +#include "G4SDManager.hh" // for G4SDManager +#include "Par04DetectorConstruction.hh" // for Par04DetectorConstruction +#include "Par04Hit.hh" // for Par04Hit, Par04HitsCollection + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04EventAction::Par04EventAction(Par04DetectorConstruction* aDetector) + : G4UserEventAction() + , fHitCollectionID(-1) + , fTimer() + , fDetector(aDetector) +{ + fCellNbRho = aDetector->GetMeshNbOfCells().x(); + fCellNbPhi = aDetector->GetMeshNbOfCells().y(); + fCellNbZ = aDetector->GetMeshNbOfCells().z(); + fCalEdep.reserve(fCellNbRho * fCellNbPhi * fCellNbZ); + fCalRho.reserve(fCellNbRho * fCellNbPhi * fCellNbZ); + fCalPhi.reserve(fCellNbRho * fCellNbPhi * fCellNbZ); + fCalZ.reserve(fCellNbRho * fCellNbPhi * fCellNbZ); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04EventAction::~Par04EventAction() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04EventAction::BeginOfEventAction(const G4Event*) { fTimer.Start(); } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04EventAction::EndOfEventAction(const G4Event* aEvent) +{ + fTimer.Stop(); + + // Get hits collection ID (only once) + if(fHitCollectionID == -1) + { + fHitCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("hits"); + } + // Get hits collection + auto hitsCollection = + static_cast(aEvent->GetHCofThisEvent()->GetHC(fHitCollectionID)); + + if(hitsCollection == nullptr) + { + G4ExceptionDescription msg; + msg << "Cannot access hitsCollection ID " << fHitCollectionID; + G4Exception("Par04EventAction::GetHitsCollection()", "MyCode0001", FatalException, msg); + } + + // Get analysis manager + auto analysisManager = G4AnalysisManager::Instance(); + // Retrieve only once detector dimensions + if(fCellSizeZ == 0) + { + fCellSizeZ = fDetector->GetMeshSizeOfCells().z(); + fCellSizeRho = fDetector->GetMeshSizeOfCells().x(); + fCellNbRho = fDetector->GetMeshNbOfCells().x(); + fCellNbPhi = fDetector->GetMeshNbOfCells().y(); + fCellNbZ = fDetector->GetMeshNbOfCells().z(); + } + + // Retrieve information from primary vertex and primary particle + // To calculate shower axis and entry point to the detector + auto primaryVertex = + G4EventManager::GetEventManager()->GetConstCurrentEvent()->GetPrimaryVertex(); + auto primaryParticle = primaryVertex->GetPrimary(0); + G4double primaryEnergy = primaryParticle->GetTotalEnergy(); + // Estimate from vertex and particle direction the entry point to the detector + // Calculate entrance point to the detector located at z = 0 + auto primaryDirection = primaryParticle->GetMomentumDirection(); + auto primaryEntrance = + primaryVertex->GetPosition() - primaryVertex->GetPosition().z() * primaryDirection; + + // Resize back to initial mesh size + fCalEdep.resize(fCellNbRho * fCellNbPhi * fCellNbZ); + fCalRho.resize(fCellNbRho * fCellNbPhi * fCellNbZ); + fCalPhi.resize(fCellNbRho * fCellNbPhi * fCellNbZ); + fCalZ.resize(fCellNbRho * fCellNbPhi * fCellNbZ); + + // Fill histograms + Par04Hit* hit = nullptr; + G4double hitEn = 0; + G4double totalEnergy = 0; + G4int hitZ = -1; + G4int hitRho = -1; + G4int hitPhi = -1; + G4int hitType = -1; + G4int numNonZeroThresholdCells = 0; + G4double tDistance = 0., rDistance = 0.; + G4double tFirstMoment = 0., tSecondMoment = 0.; + G4double rFirstMoment = 0., rSecondMoment = 0.; + for(size_t iHit = 0; iHit < hitsCollection->entries(); iHit++) + { + hit = static_cast(hitsCollection->GetHit(iHit)); + hitZ = hit->GetZid(); + hitRho = hit->GetRhoId(); + hitPhi = hit->GetPhiId(); + hitEn = hit->GetEdep(); + hitType = hit->GetType(); + if(hitEn > 0) + { + totalEnergy += hitEn; + tDistance = hitZ * fCellSizeZ; + rDistance = hitRho * fCellSizeRho; + tFirstMoment += hitEn * tDistance; + rFirstMoment += hitEn * rDistance; + analysisManager->FillH1(4, tDistance, hitEn); + analysisManager->FillH1(5, rDistance, hitEn); + analysisManager->FillH1(10, hitType); + if(hitEn > 0.0005) + { // e > 0.5 keV + fCalEdep[numNonZeroThresholdCells] = hitEn; + fCalRho[numNonZeroThresholdCells] = hitRho; + fCalPhi[numNonZeroThresholdCells] = hitPhi; + fCalZ[numNonZeroThresholdCells] = hitZ; + numNonZeroThresholdCells++; + } + } + } + tFirstMoment /= totalEnergy; + rFirstMoment /= totalEnergy; + analysisManager->FillH1(0, primaryEnergy / GeV); + analysisManager->FillH1(1, totalEnergy / GeV); + analysisManager->FillH1(2, totalEnergy / primaryEnergy); + analysisManager->FillH1(3, fTimer.GetRealElapsed()); + analysisManager->FillH1(6, tFirstMoment); + analysisManager->FillH1(7, rFirstMoment); + // Resize to store only energy hits above threshold + fCalEdep.resize(numNonZeroThresholdCells); + fCalRho.resize(numNonZeroThresholdCells); + fCalPhi.resize(numNonZeroThresholdCells); + fCalZ.resize(numNonZeroThresholdCells); + analysisManager->FillNtupleDColumn(0, primaryEnergy); + analysisManager->FillNtupleDColumn(5, fTimer.GetRealElapsed()); + + // Second loop over hits to calculate second moments + for(size_t iHit = 0; iHit < hitsCollection->entries(); iHit++) + { + hit = static_cast(hitsCollection->GetHit(iHit)); + hitEn = hit->GetEdep(); + hitZ = hit->GetZid(); + hitRho = hit->GetRhoId(); + if(hitEn > 0) + { + tDistance = hitZ * fCellSizeZ; + rDistance = hitRho * fCellSizeRho; + tSecondMoment += hitEn * std::pow(tDistance - tFirstMoment, 2); + rSecondMoment += hitEn * std::pow(rDistance - rFirstMoment, 2); + } + } + tSecondMoment /= totalEnergy; + rSecondMoment /= totalEnergy; + analysisManager->FillH1(8, tSecondMoment); + analysisManager->FillH1(9, rSecondMoment); + analysisManager->AddNtupleRow(); +} diff --git a/examples/extended/parameterisations/Par04/src/Par04EventInformation.cc b/examples/extended/parameterisations/Par04/src/Par04EventInformation.cc new file mode 100644 index 0000000000..bdc636579c --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04EventInformation.cc @@ -0,0 +1,50 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "Par04EventInformation.hh" +#include // for operator<< +#include // for G4VUserEventInformation +#include // for G4cout, G4endl +#include // for operator<<, basic_ostream, ost... + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04EventInformation::Par04EventInformation() + : G4VUserEventInformation() + , fDirection() + , fPosition() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04EventInformation::~Par04EventInformation() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04EventInformation::Print() const +{ + G4cout << "Event information\nPrimary particle direction = " << fDirection + << "\nPrimary particle position = " << fPosition << G4endl; +} diff --git a/examples/extended/parameterisations/Par04/src/Par04Hit.cc b/examples/extended/parameterisations/Par04/src/Par04Hit.cc new file mode 100644 index 0000000000..61a835f142 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04Hit.cc @@ -0,0 +1,168 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "Par04Hit.hh" +#include // for mm, pi, MeV, cm, rad +#include // for operator/, operator<<, Hep... +#include // for G4RotationMatrix +#include // for G4String +#include // for G4ThreeVector +#include // for G4Transform3D +#include // for G4VHit +#include // for max +#include // for operator<<, basic_ostream:... +#include // for operator< +#include "G4AttDef.hh" // for G4AttDef +#include "G4AttDefStore.hh" // for GetInstance +#include "G4AttValue.hh" // for G4AttValue +#include "G4Colour.hh" // for G4Colour +#include "G4SystemOfUnits.hh" // for mm, MeV, cm, rad +#include "G4Tubs.hh" // for G4Tubs +#include "G4UnitsTable.hh" // for G4BestUnit +#include "G4VVisManager.hh" // for G4VVisManager +#include "G4VisAttributes.hh" // for G4VisAttributes +template class G4Allocator; + +G4ThreadLocal G4Allocator* Par04HitAllocator; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04Hit::Par04Hit() + : G4VHit() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04Hit::~Par04Hit() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04Hit::Par04Hit(const Par04Hit& aRight) + : G4VHit() +{ + fEdep = aRight.fEdep; + fZId = aRight.fZId; + fRhoId = aRight.fRhoId; + fPhiId = aRight.fPhiId; + fTime = aRight.fTime; + fPos = aRight.fPos; + fRot = aRight.fRot; + fType = aRight.fType; + fLogVol = aRight.fLogVol; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +const Par04Hit& Par04Hit::operator=(const Par04Hit& aRight) +{ + fEdep = aRight.fEdep; + fZId = aRight.fZId; + fRhoId = aRight.fRhoId; + fPhiId = aRight.fPhiId; + fTime = aRight.fTime; + fPos = aRight.fPos; + fRot = aRight.fRot; + fType = aRight.fType; + fLogVol = aRight.fLogVol; + return *this; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +int Par04Hit::operator==(const Par04Hit& aRight) const +{ + return (fRhoId == aRight.fRhoId && fPhiId == aRight.fPhiId && fZId == aRight.fZId); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04Hit::Draw() +{ + /// TOFIX do not hardcode size + G4ThreeVector meshSize(2.325 * mm, 2 * CLHEP::pi / 50. * CLHEP::rad, 3.4 * mm); + G4int numPhiCells = CLHEP::pi * 2. / meshSize.y(); + G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); + // Hits can be filtered out in visualisation + if(!pVVisManager->FilterHit(*this)) + return; + // Do not draw empty hits + if(fEdep <= 0) + return; + // Do not plot if default values were not changed + if(fRhoId == -1 && fZId == -1 && fPhiId == -1) + return; + if(pVVisManager) + { + G4Transform3D trans(fRot, fPos); + G4VisAttributes attribs; + G4Tubs solid("draw", fRhoId * meshSize.x(), (fRhoId + 1) * meshSize.x(), meshSize.z() / 2., + (-numPhiCells / 2. + fPhiId) * meshSize.y(), meshSize.y()); + // Set colours depending on type of hit (full/fast sim) + G4double colR = fType == 0 ? 0 : 1; + G4double colG = fType == 0 ? 1 : 0; + G4double colB = 0; + G4Colour colour(colR, colG, colB, 0.5); + attribs.SetColour(colour); + attribs.SetForceSolid(true); + pVVisManager->Draw(solid, attribs, trans); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +const std::map* Par04Hit::GetAttDefs() const +{ + G4bool isNew; + std::map* store = G4AttDefStore::GetInstance("Par04Hit", isNew); + if(isNew) + { + (*store)["HitType"] = G4AttDef("HitType", "Hit Type", "Physics", "", "G4String"); + (*store)["Energy"] = + G4AttDef("Energy", "Energy Deposited", "Physics", "G4BestUnit", "G4double"); + (*store)["Time"] = G4AttDef("Time", "Time", "Physics", "G4BestUnit", "G4double"); + (*store)["Pos"] = G4AttDef("Pos", "Position", "Physics", "G4BestUnit", "G4ThreeVector"); + } + return store; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +std::vector* Par04Hit::CreateAttValues() const +{ + std::vector* values = new std::vector; + values->push_back(G4AttValue("HitType", "HadPar04Hit", "")); + values->push_back(G4AttValue("Energy", G4BestUnit(fEdep, "Energy"), "")); + values->push_back(G4AttValue("Time", G4BestUnit(fTime, "Time"), "")); + values->push_back(G4AttValue("Pos", G4BestUnit(fPos, "Length"), "")); + return values; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04Hit::Print() +{ + std::cout << "\tHit " << fEdep / MeV << " MeV at " << fPos / cm << " cm (R,phi,z)= (" << fRhoId + << ", " << fPhiId << ", " << fZId << "), " << fTime << " ns" << std::endl; +} diff --git a/examples/extended/parameterisations/Par04/src/Par04InferenceMessenger.cc b/examples/extended/parameterisations/Par04/src/Par04InferenceMessenger.cc new file mode 100644 index 0000000000..4347b9a561 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04InferenceMessenger.cc @@ -0,0 +1,249 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifdef USE_INFERENCE +#include "Par04InferenceMessenger.hh" +#include "Par04InferenceSetup.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithoutParameter.hh" +#include "G4UIcmdWithAnInteger.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithAString.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04InferenceMessenger::Par04InferenceMessenger(Par04InferenceSetup* aInference) + : G4UImessenger() + , fInference(aInference) +{ + fExampleDir = new G4UIdirectory("/Par04/"); + fExampleDir->SetGuidance("UI commands specific to this example"); + + fInferenceDir = new G4UIdirectory("/Par04/inference/"); + fInferenceDir->SetGuidance("Inference construction UI commands"); + + fInferenceLibraryCmd = new G4UIcmdWithAString("/Par04/inference/setInferenceLibrary", this); + fInferenceLibraryCmd->SetGuidance("Inference library."); + fInferenceLibraryCmd->SetParameterName("InferenceLibrary", false); + fInferenceLibraryCmd->AvailableForStates(G4State_Idle); + fInferenceLibraryCmd->SetToBeBroadcasted(true); + + fSizeLatentVectorCmd = new G4UIcmdWithAnInteger("/Par04/inference/setSizeLatentVector", this); + fSizeLatentVectorCmd->SetGuidance("Set size of the latent space vector."); + fSizeLatentVectorCmd->SetParameterName("SizeLatentVector", false); + fSizeLatentVectorCmd->SetRange("SizeLatentVector>0"); + fSizeLatentVectorCmd->AvailableForStates(G4State_Idle); + fSizeLatentVectorCmd->SetToBeBroadcasted(true); + + fSizeConditionVectorCmd = + new G4UIcmdWithAnInteger("/Par04/inference/setSizeConditionVector", this); + fSizeConditionVectorCmd->SetGuidance("Set size of the condition vector."); + fSizeConditionVectorCmd->SetParameterName("SizeConditionVector", false); + fSizeConditionVectorCmd->SetRange("SizeConditionVector>0"); + fSizeConditionVectorCmd->AvailableForStates(G4State_Idle); + fSizeConditionVectorCmd->SetToBeBroadcasted(true); + + fModelPathNameCmd = new G4UIcmdWithAString("/Par04/inference/setModelPathName", this); + fModelPathNameCmd->SetGuidance("Model path and name."); + fModelPathNameCmd->SetParameterName("Name", false); + fModelPathNameCmd->AvailableForStates(G4State_Idle); + fModelPathNameCmd->SetToBeBroadcasted(true); + + fProfileFlagCmd = new G4UIcmdWithAnInteger("/Par04/inference/setProfileFlag", this); + fProfileFlagCmd->SetGuidance("Flag to save a json file for model execution profiling."); + fProfileFlagCmd->SetParameterName("ProfileFlag", false); + fProfileFlagCmd->SetRange("ProfileFlag>-1"); + fProfileFlagCmd->AvailableForStates(G4State_Idle); + fProfileFlagCmd->SetToBeBroadcasted(true); + + fOptimizationFlagCmd = new G4UIcmdWithAnInteger("/Par04/inference/setOptimizationFlag", this); + fOptimizationFlagCmd->SetGuidance("Set optimization flag"); + fOptimizationFlagCmd->SetParameterName("OptimizationFlag", false); + fOptimizationFlagCmd->SetRange("OptimizationFlag>-1"); + fOptimizationFlagCmd->AvailableForStates(G4State_Idle); + fOptimizationFlagCmd->SetToBeBroadcasted(true); + + fMeshNbRhoCellsCmd = new G4UIcmdWithAnInteger("/Par04/inference/setNbOfRhoCells", this); + fMeshNbRhoCellsCmd->SetGuidance("Set number of rho cells in the cylindrical mesh readout."); + fMeshNbRhoCellsCmd->SetParameterName("NbRhoCells", false); + fMeshNbRhoCellsCmd->SetRange("NbRhoCells>0"); + fMeshNbRhoCellsCmd->AvailableForStates(G4State_Idle); + fMeshNbRhoCellsCmd->SetToBeBroadcasted(true); + + fMeshNbPhiCellsCmd = new G4UIcmdWithAnInteger("/Par04/inference/setNbOfPhiCells", this); + fMeshNbPhiCellsCmd->SetGuidance("Set number of phi cells in the cylindrical mesh readout."); + fMeshNbPhiCellsCmd->SetParameterName("NbPhiCells", false); + fMeshNbPhiCellsCmd->SetRange("NbPhiCells>0"); + fMeshNbPhiCellsCmd->AvailableForStates(G4State_Idle); + fMeshNbPhiCellsCmd->SetToBeBroadcasted(true); + + fMeshNbZCellsCmd = new G4UIcmdWithAnInteger("/Par04/inference/setNbOfZCells", this); + fMeshNbZCellsCmd->SetGuidance("Set number of z cells in the cylindrical mesh readout."); + fMeshNbZCellsCmd->SetParameterName("NbZCells", false); + fMeshNbZCellsCmd->SetRange("NbZCells>0"); + fMeshNbZCellsCmd->AvailableForStates(G4State_Idle); + fMeshNbZCellsCmd->SetToBeBroadcasted(true); + + fMeshSizeRhoCellsCmd = new G4UIcmdWithADoubleAndUnit("/Par04/inference/setSizeOfRhoCells", this); + fMeshSizeRhoCellsCmd->SetGuidance("Set size of rho cells in the cylindrical readout mesh"); + fMeshSizeRhoCellsCmd->SetParameterName("Size", false); + fMeshSizeRhoCellsCmd->SetRange("Size>0."); + fMeshSizeRhoCellsCmd->SetUnitCategory("Length"); + fMeshSizeRhoCellsCmd->AvailableForStates(G4State_Idle); + fMeshSizeRhoCellsCmd->SetToBeBroadcasted(true); + + fMeshSizeZCellsCmd = new G4UIcmdWithADoubleAndUnit("/Par04/inference/setSizeOfZCells", this); + fMeshSizeZCellsCmd->SetGuidance("Set size of z cells in the cylindrical readout mesh"); + fMeshSizeZCellsCmd->SetParameterName("Size", false); + fMeshSizeZCellsCmd->SetRange("Size>0."); + fMeshSizeZCellsCmd->SetUnitCategory("Length"); + fMeshSizeZCellsCmd->AvailableForStates(G4State_Idle); + fMeshSizeZCellsCmd->SetToBeBroadcasted(true); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04InferenceMessenger::~Par04InferenceMessenger() +{ + delete fInferenceLibraryCmd; + delete fSizeLatentVectorCmd; + delete fSizeConditionVectorCmd; + delete fModelPathNameCmd; + delete fProfileFlagCmd; + delete fOptimizationFlagCmd; + delete fMeshNbRhoCellsCmd; + delete fMeshNbPhiCellsCmd; + delete fMeshNbZCellsCmd; + delete fMeshSizeRhoCellsCmd; + delete fMeshSizeZCellsCmd; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04InferenceMessenger::SetNewValue(G4UIcommand* aCommand, G4String aNewValue) +{ + if(aCommand == fInferenceLibraryCmd) + { + fInference->SetInferenceLibrary(aNewValue); + } + if(aCommand == fSizeLatentVectorCmd) + { + fInference->SetSizeLatentVector(std::stoi(aNewValue)); + } + if(aCommand == fSizeConditionVectorCmd) + { + fInference->SetSizeConditionVector(std::stoi(aNewValue)); + } + if(aCommand == fModelPathNameCmd) + { + fInference->SetModelPathName(aNewValue); + } + if(aCommand == fProfileFlagCmd) + { + fInference->SetProfileFlag(std::stoi(aNewValue)); + } + if(aCommand == fOptimizationFlagCmd) + { + fInference->SetOptimizationFlag(std::stoi(aNewValue)); + } + else if(aCommand == fMeshNbRhoCellsCmd) + { + fInference->SetMeshNbOfCells(0, fMeshNbRhoCellsCmd->GetNewIntValue(aNewValue)); + } + else if(aCommand == fMeshNbPhiCellsCmd) + { + fInference->SetMeshNbOfCells(1, fMeshNbPhiCellsCmd->GetNewIntValue(aNewValue)); + fInference->SetMeshSizeOfCells(1, + 2. * CLHEP::pi / fMeshNbPhiCellsCmd->GetNewIntValue(aNewValue)); + } + else if(aCommand == fMeshNbZCellsCmd) + { + fInference->SetMeshNbOfCells(2, fMeshNbZCellsCmd->GetNewIntValue(aNewValue)); + } + else if(aCommand == fMeshSizeRhoCellsCmd) + { + fInference->SetMeshSizeOfCells(0, fMeshSizeRhoCellsCmd->GetNewDoubleValue(aNewValue)); + } + else if(aCommand == fMeshSizeZCellsCmd) + { + fInference->SetMeshSizeOfCells(2, fMeshSizeZCellsCmd->GetNewDoubleValue(aNewValue)); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4String Par04InferenceMessenger::GetCurrentValue(G4UIcommand* aCommand) +{ + G4String cv; + + if(aCommand == fInferenceLibraryCmd) + { + cv = fInferenceLibraryCmd->ConvertToString(fInference->GetInferenceLibrary()); + } + if(aCommand == fSizeLatentVectorCmd) + { + cv = fSizeLatentVectorCmd->ConvertToString(fInference->GetSizeLatentVector()); + } + if(aCommand == fSizeConditionVectorCmd) + { + cv = fSizeConditionVectorCmd->ConvertToString(fInference->GetSizeConditionVector()); + } + if(aCommand == fModelPathNameCmd) + { + cv = fModelPathNameCmd->ConvertToString(fInference->GetModelPathName()); + } + if(aCommand == fProfileFlagCmd) + { + cv = fSizeLatentVectorCmd->ConvertToString(fInference->GetProfileFlag()); + } + if(aCommand == fOptimizationFlagCmd) + { + cv = fSizeLatentVectorCmd->ConvertToString(fInference->GetOptimizationFlag()); + } + else if(aCommand == fMeshNbRhoCellsCmd) + { + cv = fMeshNbRhoCellsCmd->ConvertToString(fInference->GetMeshNbOfCells()[0]); + } + else if(aCommand == fMeshNbPhiCellsCmd) + { + cv = fMeshNbPhiCellsCmd->ConvertToString(fInference->GetMeshNbOfCells()[1]); + } + else if(aCommand == fMeshNbZCellsCmd) + { + cv = fMeshNbZCellsCmd->ConvertToString(fInference->GetMeshNbOfCells()[2]); + } + else if(aCommand == fMeshSizeRhoCellsCmd) + { + cv = fMeshSizeRhoCellsCmd->ConvertToString(fInference->GetMeshSizeOfCells()[0]); + } + else if(aCommand == fMeshSizeZCellsCmd) + { + cv = fMeshSizeZCellsCmd->ConvertToString(fInference->GetMeshSizeOfCells()[2]); + } + + return cv; +} + +#endif \ No newline at end of file diff --git a/examples/extended/parameterisations/Par04/src/Par04InferenceSetup.cc b/examples/extended/parameterisations/Par04/src/Par04InferenceSetup.cc new file mode 100644 index 0000000000..ac0cb4a849 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04InferenceSetup.cc @@ -0,0 +1,176 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifdef USE_INFERENCE +#include "Par04InferenceSetup.hh" + +#include "Par04InferenceInterface.hh" +#ifdef USE_INFERENCE_ONNX +#include "Par04OnnxInference.hh" +#endif +#ifdef USE_INFERENCE_LWTNN +#include "Par04LwtnnInference.hh" +#endif +#include "G4RotationMatrix.hh" +#include "CLHEP/Random/RandGauss.h" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04InferenceSetup::Par04InferenceSetup() + : fInferenceMessenger(new Par04InferenceMessenger(this)) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04InferenceSetup::~Par04InferenceSetup() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4bool Par04InferenceSetup::IfTrigger(G4double aEnergy) +{ + /// Energy of electrons used in training dataset + if(aEnergy > 1 * CLHEP::GeV || aEnergy < 1024 * CLHEP::GeV) + return true; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04InferenceSetup::SetInferenceLibrary(G4String aName) +{ + fInferenceLibrary = aName; + +#ifdef USE_INFERENCE_ONNX + if(fInferenceLibrary == "ONNX") + fInferenceInterface = std::unique_ptr( + new Par04OnnxInference(fModelPathName, fProfileFlag, fOptimizationFlag, fIntraOpNumThreads)); +#endif +#ifdef USE_INFERENCE_LWTNN + if(fInferenceLibrary == "LWTNN") + fInferenceInterface = + std::unique_ptr(new Par04LwtnnInference(fModelPathName)); +#endif + CheckInferenceLibrary(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04InferenceSetup::CheckInferenceLibrary() +{ + G4String msg = "Please choose inference library from available libraries ("; +#ifdef USE_INFERENCE_ONNX + msg += "ONNX,"; +#endif +#ifdef USE_INFERENCE_LWTNN + msg += "LWTNN"; +#endif + if(fInferenceInterface == nullptr) + G4Exception("Par04InferenceSetup::CheckInferenceLibrary()", "InvalidSetup", FatalException, + (msg + "). Current name: " + fInferenceLibrary).c_str()); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04InferenceSetup::GetEnergies(std::vector& aEnergies, G4double aInitialEnergy, + G4float aInitialAngle) +{ + // First check if inference library was set correctly + CheckInferenceLibrary(); + // size represents the size of the output vector + int size = fMeshNumber.x() * fMeshNumber.y() * fMeshNumber.z(); + + // randomly sample from a gaussian distribution in the latent space + std::vector genVector(fSizeLatentVector + fSizeConditionVector, 0); + for(int i = 0; i < fSizeLatentVector; ++i) + { + genVector[i] = CLHEP::RandGauss::shoot(0., 1.); + } + + // Vector of condition + // this is application specific it depdens on what the model was condition on + // and it depends on how the condition values were encoded at the training time + // in this example the energy of each particle is normlaized to the highest + // energy in the considered range (1GeV-500GeV) + // the angle is also is normlaized to the highest angle in the considered range + // (0-90 in dergrees) + // the model in this example was trained on two detector geometries PBW04 + // and SiW a one hot encoding vector is used to represent the geometry with + // [0,1] for PBW04 and [1,0] for SiW + // 1.energy + genVector[fSizeLatentVector] = aInitialEnergy / fMaxEnergy; + // 2. angle + genVector[fSizeLatentVector + 1] = (aInitialAngle / (CLHEP::deg)) / fMaxAngle; + // 3.geometry + genVector[fSizeLatentVector + 2] = 0; + genVector[fSizeLatentVector + 3] = 1; + + // Run the inference + fInferenceInterface->RunInference(genVector, aEnergies, size); + + // After the inference rescale back to the initial energy (in this example the + // energies of cells were normalized to the energy of the particle) + for(int i = 0; i < size; ++i) + { + aEnergies[i] = aEnergies[i] * aInitialEnergy; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04InferenceSetup::GetPositions(std::vector& aPositions, G4ThreeVector pos0, + G4ThreeVector direction) +{ + aPositions.resize(fMeshNumber.x() * fMeshNumber.y() * fMeshNumber.z()); + + // Calculate rotation matrix along the particle momentum direction + // It will rotate the shower axes to match the incoming particle direction + G4RotationMatrix rotMatrix = G4RotationMatrix(); + double particleTheta = direction.theta(); + double particlePhi = direction.phi(); + rotMatrix.rotateZ(-particlePhi); + rotMatrix.rotateY(-particleTheta); + G4RotationMatrix rotMatrixInv = CLHEP::inverseOf(rotMatrix); + + int cpt = 0; + for(G4int iCellR = 0; iCellR < fMeshNumber.x(); iCellR++) + { + for(G4int iCellPhi = 0; iCellPhi < fMeshNumber.y(); iCellPhi++) + { + for(G4int iCellZ = 0; iCellZ < fMeshNumber.z(); iCellZ++) + { + aPositions[cpt] = + pos0 + + rotMatrixInv * + G4ThreeVector((iCellR + 0.5) * fMeshSize.x() * + std::cos((iCellPhi + 0.5) * 2 * CLHEP::pi / fMeshNumber.y() - CLHEP::pi), + (iCellR + 0.5) * fMeshSize.x() * + std::sin((iCellPhi + 0.5) * 2 * CLHEP::pi / fMeshNumber.y() - CLHEP::pi), + (iCellZ + 0.5) * fMeshSize.z()); + cpt++; + } + } + } +} + +#endif diff --git a/examples/extended/parameterisations/Par04/src/Par04LwtnnInference.cc b/examples/extended/parameterisations/Par04/src/Par04LwtnnInference.cc new file mode 100644 index 0000000000..666fe213a2 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04LwtnnInference.cc @@ -0,0 +1,61 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifdef USE_INFERENCE_LWTNN +#include "Par04InferenceInterface.hh" +#include "Par04LwtnnInference.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04LwtnnInference::Par04LwtnnInference(G4String modelPath) + : Par04InferenceInterface() +{ + // file to read + std::ifstream input(modelPath); + // build the graph + fGraph = std::make_unique(lwt::parse_json_graph(input)); + input.close(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04LwtnnInference::RunInference(vector aGenVector, std::vector& aEnergies, + int aSize) +{ + // generation vector + fNetworkInputs inputs; + for(int i = 0; i < (unsigned) (aGenVector.size()); ++i) + { + inputs["node_0"]["variable_" + std::to_string(i)] = aGenVector[i]; + } + + // run the inference + fNetworkOutputs outputs = fGraph->compute(inputs); + aEnergies.assign(aSize, 0); + for(int i = 0; i < aSize; i++) + aEnergies[i] = outputs["out_" + std::to_string(i)]; +} + +#endif diff --git a/examples/extended/parameterisations/Par04/src/Par04MLFastSimModel.cc b/examples/extended/parameterisations/Par04/src/Par04MLFastSimModel.cc new file mode 100644 index 0000000000..6981bb4bc1 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04MLFastSimModel.cc @@ -0,0 +1,101 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifdef USE_INFERENCE +#include "Par04MLFastSimModel.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4Gamma.hh" +#include "G4SystemOfUnits.hh" +#include "G4UnitsTable.hh" +#include "G4FastHit.hh" +#include "G4FastSimHitMaker.hh" +#include "Randomize.hh" +#include "CLHEP/Units/SystemOfUnits.h" +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04MLFastSimModel::Par04MLFastSimModel(G4String aModelName, G4Region* aEnvelope) + : G4VFastSimulationModel(aModelName, aEnvelope) + , fInference(new Par04InferenceSetup) + , fHitMaker(new G4FastSimHitMaker) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04MLFastSimModel::Par04MLFastSimModel(G4String aModelName) + : G4VFastSimulationModel(aModelName) + , fInference(new Par04InferenceSetup) + , fHitMaker(new G4FastSimHitMaker) +{} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04MLFastSimModel::~Par04MLFastSimModel() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4bool Par04MLFastSimModel::IsApplicable(const G4ParticleDefinition& aParticleType) +{ + return &aParticleType == G4Electron::ElectronDefinition() || + &aParticleType == G4Positron::PositronDefinition() || + &aParticleType == G4Gamma::GammaDefinition(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4bool Par04MLFastSimModel::ModelTrigger(const G4FastTrack& aFastTrack) +{ + return fInference->IfTrigger(aFastTrack.GetPrimaryTrack()->GetKineticEnergy()); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04MLFastSimModel::DoIt(const G4FastTrack& aFastTrack, G4FastStep& aFastStep) +{ + // remove particle from further processing by G4 + aFastStep.KillPrimaryTrack(); + aFastStep.SetPrimaryTrackPathLength(0.0); + G4double energy = aFastTrack.GetPrimaryTrack()->GetKineticEnergy(); + aFastStep.SetTotalEnergyDeposited(energy); + G4ThreeVector position = aFastTrack.GetPrimaryTrack()->GetPosition(); + G4ThreeVector direction = aFastTrack.GetPrimaryTrack()->GetMomentumDirection(); + + // calculate the incident angle + G4float angle = direction.theta(); + + // calculate how to deposit energy within the detector + // get it from inference model + fInference->GetEnergies(fEnergies, energy, angle); + fInference->GetPositions(fPositions, position, direction); + + // deposit energy in the detector using calculated values of energy deposits + // and positions + for(size_t iHit = 0; iHit < fPositions.size(); iHit++) + { + fHitMaker->make(G4FastHit(fPositions[iHit], fEnergies[iHit]), aFastTrack); + } +} +#endif diff --git a/examples/extended/parameterisations/Par04/src/Par04OnnxInference.cc b/examples/extended/parameterisations/Par04/src/Par04OnnxInference.cc new file mode 100644 index 0000000000..4440f992fa --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04OnnxInference.cc @@ -0,0 +1,128 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#ifdef USE_INFERENCE_ONNX +#include "Par04InferenceInterface.hh" +#include "G4RotationMatrix.hh" +#include "Par04OnnxInference.hh" +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04OnnxInference::Par04OnnxInference(G4String modelPath, G4int profileFlag, G4int optimizeFlag, + G4int intraOpNumThreads) + : Par04InferenceInterface() +{ + // initialization of the enviroment and inference session + auto envLocal = std::make_unique(ORT_LOGGING_LEVEL_WARNING, "ENV"); + fEnv = std::move(envLocal); + fSessionOptions.SetIntraOpNumThreads(intraOpNumThreads); + // graph optimizations of the model + // if the flag is not set to true none of the optimizations will be applied + // if it is set to true all the optimizations will be applied + if(optimizeFlag) + { + fSessionOptions.SetOptimizedModelFilePath("opt-graph"); + fSessionOptions.SetGraphOptimizationLevel(ORT_ENABLE_ALL); + // ORT_ENABLE_BASIC #### ORT_ENABLE_EXTENDED + } + else + fSessionOptions.SetGraphOptimizationLevel(ORT_DISABLE_ALL); + // save json file for model execution profiling + if(profileFlag) + fSessionOptions.EnableProfiling("opt.json"); + + auto sessionLocal = std::make_unique(*fEnv, modelPath, fSessionOptions); + fSession = std::move(sessionLocal); + fInfo = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemTypeDefault); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04OnnxInference::RunInference(vector aGenVector, std::vector& aEnergies, + int aSize) +{ + // input nodes + Ort::AllocatorWithDefaultOptions allocator; + std::vector input_node_dims; + size_t num_input_nodes = fSession->GetInputCount(); + std::vector input_node_names(num_input_nodes); + for(std::size_t i = 0; i < num_input_nodes; i++) + { + char* input_name = fSession->GetInputName(i, allocator); + fInames = { input_name }; + input_node_names[i] = input_name; + Ort::TypeInfo type_info = fSession->GetInputTypeInfo(i); + auto tensor_info = type_info.GetTensorTypeAndShapeInfo(); + ONNXTensorElementDataType type = tensor_info.GetElementType(); + input_node_dims = tensor_info.GetShape(); + for(int j = 0; j < input_node_dims.size(); j++) + { + if(input_node_dims[j] < 0) + input_node_dims[j] = 1; + } + } + // output nodes + std::vector output_node_dims; + size_t num_output_nodes = fSession->GetOutputCount(); + std::vector output_node_names(num_output_nodes); + for(std::size_t i = 0; i < num_output_nodes; i++) + { + char* output_name = fSession->GetOutputName(i, allocator); + output_node_names[i] = output_name; + Ort::TypeInfo type_info = fSession->GetOutputTypeInfo(i); + auto tensor_info = type_info.GetTensorTypeAndShapeInfo(); + ONNXTensorElementDataType type = tensor_info.GetElementType(); + output_node_dims = tensor_info.GetShape(); + for(int j = 0; j < output_node_dims.size(); j++) + { + if(output_node_dims[j] < 0) + output_node_dims[j] = 1; + } + } + + // create input tensor object from data values + float genVector[(unsigned) (aGenVector.size())]; + for(int i = 0; i < (unsigned) (aGenVector.size()); i++) + genVector[i] = aGenVector[i]; + int values_length = sizeof(genVector) / sizeof(genVector[0]); + std::vector dims = { 1, (unsigned) (aGenVector.size()) }; + Ort::Value Input_noise_tensor = + Ort::Value::CreateTensor(fInfo, genVector, values_length, dims.data(), dims.size()); + assert(Input_noise_tensor.IsTensor()); + std::vector ort_inputs; + ort_inputs.push_back(std::move(Input_noise_tensor)); + // run the inference session + std::vector ort_outputs = + fSession->Run(Ort::RunOptions{ nullptr }, fInames.data(), ort_inputs.data(), ort_inputs.size(), + output_node_names.data(), output_node_names.size()); + // get pointer to output tensor float values + float* floatarr = ort_outputs.front().GetTensorMutableData(); + aEnergies.assign(aSize, 0); + for(int i = 0; i < aSize; ++i) + aEnergies[i] = floatarr[i]; +} + +#endif diff --git a/examples/extended/parameterisations/Par04/src/Par04PrimaryGeneratorAction.cc b/examples/extended/parameterisations/Par04/src/Par04PrimaryGeneratorAction.cc new file mode 100644 index 0000000000..efb6a7a2a2 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04PrimaryGeneratorAction.cc @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "Par04PrimaryGeneratorAction.hh" +#include // for GeV +#include // for G4String +#include // for G4ThreeVector +#include // for G4int +#include // for G4VUserPrimaryGeneratorA... +#include // for basic_string +#include "G4Event.hh" // for G4Event +#include "G4ParticleGun.hh" // for G4ParticleGun +#include "G4ParticleTable.hh" // for G4ParticleTable +#include "G4SystemOfUnits.hh" // for GeV +#include "Par04EventInformation.hh" // for Par04EventInformation +class G4ParticleDefinition; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04PrimaryGeneratorAction::Par04PrimaryGeneratorAction() + : G4VUserPrimaryGeneratorAction() +{ + G4int n_particle = 1; + fParticleGun = new G4ParticleGun(n_particle); + // Default particle properties + G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); + G4String particleName; + G4ParticleDefinition* particle = particleTable->FindParticle(particleName = "e-"); + fParticleGun->SetParticleDefinition(particle); + fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0., 1., 0.)); + fParticleGun->SetParticleEnergy(10. * GeV); + fParticleGun->SetParticlePosition(G4ThreeVector(0., 0., 0.)); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04PrimaryGeneratorAction::~Par04PrimaryGeneratorAction() { delete fParticleGun; } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04PrimaryGeneratorAction::GeneratePrimaries(G4Event* aEvent) +{ + fParticleGun->GeneratePrimaryVertex(aEvent); + aEvent->SetUserInformation(new Par04EventInformation()); +} diff --git a/examples/extended/parameterisations/Par04/src/Par04RunAction.cc b/examples/extended/parameterisations/Par04/src/Par04RunAction.cc new file mode 100644 index 0000000000..c01485519e --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04RunAction.cc @@ -0,0 +1,125 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "Par04RunAction.hh" +#include // for G4GenericAnalysisManager +#include // for G4ThreeVector +#include // for G4int, G4double +#include // for G4UserRunAction +#include "G4AnalysisManager.hh" // for G4AnalysisManager +#include "Par04DetectorConstruction.hh" // for Par04DetectorConstruction +#include "Par04EventAction.hh" // for Par04EventAction + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04RunAction::Par04RunAction(Par04DetectorConstruction* aDetector, Par04EventAction* aEventAction) + : G4UserRunAction() + , fDetector(aDetector) + , fEventAction(aEventAction) +{ + // Create analysis manager + G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); + analysisManager->SetDefaultFileType("root"); + + // Default filename, can be overriden with /analysis/setFileName + analysisManager->SetFileName("Par04Output"); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04RunAction::~Par04RunAction() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04RunAction::BeginOfRunAction(const G4Run*) +{ + // Get analysis manager + G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); + + // Create directories + analysisManager->SetNtupleMerging(false); + analysisManager->SetVerboseLevel(0); + + // Get detector dimensions + G4int cellNumZ = fDetector->GetMeshNbOfCells().z(); + G4int cellNumRho = fDetector->GetMeshNbOfCells().x(); + G4double cellSizeZ = fDetector->GetMeshSizeOfCells().z(); + G4double cellSizeRho = fDetector->GetMeshSizeOfCells().x(); + // Default max value of energy stored in histogram (in GeV) + G4double maxEnergy = 1000; + + // Creating control histograms + analysisManager->CreateH1("energyParticle", "Primary energy;E_{MC} (GeV);Entries", 1024, 0, + 1.1 * maxEnergy); + analysisManager->CreateH1("energyDeposited", "Deposited energy;E_{MC} (GeV);Entries", 1024, 0, + 1.1 * maxEnergy); + analysisManager->CreateH1( + "energyRatio", "Ratio of energy deposited to primary;E_{dep} / E_{MC};Entries", 1024, 0, 1); + analysisManager->CreateH1("time", "Simulation time; time (s);Entries", 2048, 0, 100); + analysisManager->CreateH1("longProfile", "Longitudinal profile;t (mm);#LTE#GT (MeV)", cellNumZ, + -0.5 * cellSizeZ, (cellNumZ - 0.5) * cellSizeZ); + analysisManager->CreateH1("transProfile", "Transverse profile;r (mm);#LTE#GT (MeV)", cellNumRho, + -0.5 * cellSizeRho, (cellNumRho - 0.5) * cellSizeRho); + analysisManager->CreateH1("longFirstMoment", + "First moment of longitudinal distribution;#LT#lambda#GT (mm);Entries", + 1024, -0.5 * cellSizeZ, + cellNumZ * cellSizeZ / 2); // arbitrary scaling of max value on axis + analysisManager->CreateH1("transFirstMoment", + "First moment of transverse distribution;#LTr#GT " + "(mm);Entries", + 1024, -0.5 * cellSizeRho, + cellNumRho * cellSizeRho / + 1); // arbitrary scaling of max value on axis + analysisManager->CreateH1( + "longSecondMoment", + "Second moment of longitudinal distribution;#LT#lambda^{2}#GT " + "(mm^{2});Entries", + 1024, 0, std::pow(cellNumZ * cellSizeZ, 2) / 25); // arbitrary scaling of max value on axis + analysisManager->CreateH1( + "transSecondMoment", "Second moment of transverse distribution;#LTr^{2}#GT (mm^{2});Entries", + 1024, 0, std::pow(cellNumRho * cellSizeRho, 2) / 5); // arbitrary scaling of max value on axis + analysisManager->CreateH1("hitType", "hit type;type (0=full, 1= fast);Entries", 2, -0.5, 1.5); + + // Creating ntuple + analysisManager->CreateNtuple("events", "per event data"); + analysisManager->CreateNtupleDColumn("EnergyMC"); + analysisManager->CreateNtupleDColumn("EnergyCell", fEventAction->GetCalEdep()); + analysisManager->CreateNtupleIColumn("rhoCell", fEventAction->GetCalRho()); + analysisManager->CreateNtupleIColumn("phiCell", fEventAction->GetCalPhi()); + analysisManager->CreateNtupleIColumn("zCell", fEventAction->GetCalZ()); + analysisManager->CreateNtupleDColumn("SimTime"); + analysisManager->FinishNtuple(); + + analysisManager->OpenFile(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04RunAction::EndOfRunAction(const G4Run*) +{ + auto analysisManager = G4AnalysisManager::Instance(); + analysisManager->Write(); + analysisManager->CloseFile(); +} diff --git a/examples/extended/parameterisations/Par04/src/Par04SensitiveDetector.cc b/examples/extended/parameterisations/Par04/src/Par04SensitiveDetector.cc new file mode 100644 index 0000000000..f683299c07 --- /dev/null +++ b/examples/extended/parameterisations/Par04/src/Par04SensitiveDetector.cc @@ -0,0 +1,206 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "Par04SensitiveDetector.hh" +#include // for HepRotation +#include // for Hep3Vector +#include // for floor +#include // for G4CollectionNameVector +#include // for G4FastHit +#include // for G4FastTrack +#include // for G4RotationMatrix +#include // for G4StepPoint +#include // for G4THitsCollection +#include // for G4ThreeVector +#include // for G4VSensitiveDetector +#include // for G4VUserEventInformation +#include // for size_t +#include // for vector +#include "G4Event.hh" // for G4Event +#include "G4EventManager.hh" // for G4EventManager +#include "G4HCofThisEvent.hh" // for G4HCofThisEvent +#include "G4SDManager.hh" // for G4SDManager +#include "G4Step.hh" // for G4Step +#include "G4Track.hh" // for G4Track +#include "Par04EventInformation.hh" // for Par04EventInformation +#include "Par04Hit.hh" // for Par04Hit, Par04HitsCollection + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04SensitiveDetector::Par04SensitiveDetector(G4String aName) + : G4VSensitiveDetector(aName) +{ + collectionName.insert("hits"); +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04SensitiveDetector::Par04SensitiveDetector(G4String aName, G4ThreeVector aNb, + G4ThreeVector aSize) + : G4VSensitiveDetector(aName) + , fMeshNbOfCells(aNb) + , fMeshSizeOfCells(aSize) +{ + collectionName.insert("hits"); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04SensitiveDetector::~Par04SensitiveDetector() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Par04SensitiveDetector::Initialize(G4HCofThisEvent* aHCE) +{ + fHitsCollection = new Par04HitsCollection(SensitiveDetectorName, collectionName[0]); + if(fHitCollectionID < 0) + { + fHitCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(fHitsCollection); + } + aHCE->AddHitsCollection(fHitCollectionID, fHitsCollection); + + // fill calorimeter hits with zero energy deposition + for(G4int iphi = 0; iphi < fMeshNbOfCells.y(); iphi++) + for(G4int irho = 0; irho < fMeshNbOfCells.x(); irho++) + for(G4int iz = 0; iz < fMeshNbOfCells.z(); iz++) + { + Par04Hit* hit = new Par04Hit(); + fHitsCollection->insert(hit); + } + // reset entrance position + fEntrancePosition.set(-1, -1, -1); + fEntranceDirection.set(-1, -1, -1); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4bool Par04SensitiveDetector::ProcessHits(G4Step* aStep, G4TouchableHistory*) +{ + G4double edep = aStep->GetTotalEnergyDeposit(); + if(edep == 0.) + return true; + + auto hit = RetrieveAndSetupHit(aStep->GetPostStepPoint()->GetPosition()); + if(hit == nullptr) + return true; + + // Add energy deposit from G4Step + hit->AddEdep(edep); + + // Fill time information from G4Step + // If it's already filled, choose hit with earliest global time + if(hit->GetTime() == -1 || hit->GetTime() > aStep->GetTrack()->GetGlobalTime()) + hit->SetTime(aStep->GetTrack()->GetGlobalTime()); + + // Set hit type to full simulation (only if hit is not already marked as fast + // sim) + if(hit->GetType() != 1) + hit->SetType(0); + + return true; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4bool Par04SensitiveDetector::ProcessHits(const G4FastHit* aHit, const G4FastTrack* aTrack, + G4TouchableHistory*) +{ + G4double edep = aHit->GetEnergy(); + if(edep == 0.) + return true; + + auto hit = RetrieveAndSetupHit(aHit->GetPosition()); + if(hit == nullptr) + return true; + + // Add energy deposit from G4FastHit + hit->AddEdep(edep); + + // Fill time information from G4FastTrack + // If it's already filled, choose hit with earliest global time + if(hit->GetTime() == -1 || hit->GetTime() > aTrack->GetPrimaryTrack()->GetGlobalTime()) + { + hit->SetTime(aTrack->GetPrimaryTrack()->GetGlobalTime()); + } + + // Set hit type to fast simulation (even if hit was already marked as full + // sim, overwrite it) + hit->SetType(1); + + return true; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Par04Hit* Par04SensitiveDetector::RetrieveAndSetupHit(G4ThreeVector aGlobalPosition) +{ + if(fEntrancePosition.x() == -1) + { + Par04EventInformation* info = dynamic_cast( + G4EventManager::GetEventManager()->GetConstCurrentEvent()->GetUserInformation()); + if(info == nullptr) + return nullptr; + fEntrancePosition = info->GetPosition(); + fEntranceDirection = info->GetDirection(); + } + + auto delta = aGlobalPosition - fEntrancePosition; + + // Calculate rotation matrix along the particle momentum direction + // It will rotate the shower axes to match the incoming particle direction + G4RotationMatrix rotMatrix = G4RotationMatrix(); + double particleTheta = fEntranceDirection.theta(); + double particlePhi = fEntranceDirection.phi(); + rotMatrix.rotateZ(-particlePhi); + rotMatrix.rotateY(-particleTheta); + G4RotationMatrix rotMatrixInv = CLHEP::inverseOf(rotMatrix); + + delta = rotMatrix * delta; + + G4int rhoNo = std::floor(delta.perp() / fMeshSizeOfCells.x()); + G4int phiNo = std::floor((CLHEP::pi + delta.phi()) / fMeshSizeOfCells.y()); + G4int zNo = std::floor(delta.z() / fMeshSizeOfCells.z()); + + std::size_t hitID = + fMeshNbOfCells.x() * fMeshNbOfCells.z() * phiNo + fMeshNbOfCells.z() * rhoNo + zNo; + + if(hitID >= fHitsCollection->entries() || zNo > fMeshNbOfCells.z() || + rhoNo > fMeshNbOfCells.x() || zNo < 0) + { + return nullptr; + } + + Par04Hit* hit = (*fHitsCollection)[hitID]; + + if(hit->GetRhoId() < 0) + { + hit->SetRhoId(rhoNo); + hit->SetPhiId(phiNo); + hit->SetZid(zNo); + hit->SetRot(rotMatrixInv); + hit->SetPos(fEntrancePosition + + rotMatrixInv * G4ThreeVector(0, 0, (zNo + 0.5) * fMeshSizeOfCells.z())); + } + return hit; +} diff --git a/examples/extended/parameterisations/Par04/vis.mac b/examples/extended/parameterisations/Par04/vis.mac new file mode 100644 index 0000000000..ab8a934327 --- /dev/null +++ b/examples/extended/parameterisations/Par04/vis.mac @@ -0,0 +1,94 @@ + +/Par04/detector/setDetectorInnerRadius 80 cm +/Par04/detector/setDetectorLength 4 m +/Par04/detector/setNbOfLayers 90 +/Par04/detector/setAbsorber 0 G4_W 1.4 mm false +/Par04/detector/setAbsorber 1 G4_Si 0.3 mm true +/Par04/mesh/setSizeOfRhoCells 2.325 mm +/Par04/mesh/setSizeOfZCells 3.4 mm +/Par04/mesh/setNbOfRhoCells 18 +/Par04/mesh/setNbOfPhiCells 50 +/Par04/mesh/setNbOfZCells 45 +/Par04/detector/print + +# Use default detector dimensions and initialize +/run/initialize + +# Use this open statement to create an OpenGL view: +/vis/open OGL 600x600-0+0 +# +# Use this open statement to create a .prim file suitable for +# viewing in DAWN: +#/vis/open DAWNFILE +# +# Use this open statement to create a .heprep file suitable for +# viewing in HepRApp: +#/vis/open HepRepFile +# +# Use this open statement to create a .wrl file suitable for +# viewing in a VRML viewer: +#/vis/open VRML2FILE +# +# Disable auto refresh and quieten vis messages whilst scene and +# trajectories are established: +/vis/viewer/set/autoRefresh false +/vis/verbose errors +# +# Draw geometry: +/vis/drawVolume worlds +# +# Specify view angle: +/vis/viewer/set/viewpointThetaPhi 0 90 deg +/vis/viewer/set/targetPoint 0 800 0 mm +# +# Specify zoom value: +/vis/viewer/zoom 10 +# +# Specify style (surface or wireframe): +#/vis/viewer/set/style wireframe +# +# Draw coordinate axes: +#/vis/scene/add/axes 0 0 0 1 m +# +# Draw smooth trajectories at end of event, showing trajectory points +# as markers 2 pixels wide: +#/vis/scene/add/trajectories smooth +/vis/scene/add/trajectories +/vis/modeling/trajectories/create/drawByCharge +/vis/modeling/trajectories/drawByCharge-0/default/setDrawStepPts true +/vis/modeling/trajectories/drawByCharge-0/default/setStepPtsSize 2 +# (if too many tracks cause core dump => /tracking/storeTrajectory 0) +# +# Draw hits at end of event: +/vis/scene/add/hits +# +# To draw only gammas: +#/vis/filtering/trajectories/create/particleFilter +#/vis/filtering/trajectories/particleFilter-0/add gamma +# +# To invert the above, drawing all particles except gammas, +# keep the above two lines but also add: +#/vis/filtering/trajectories/particleFilter-0/invert true +# +# Many other options are available with /vis/modeling and /vis/filtering. +# For example, to select colour by particle ID: +#/vis/modeling/trajectories/create/drawByParticleID +#/vis/modeling/trajectories/drawByParticleID-0/set e- blue +# +# Create an attribute filter to draw only particles with certain (high) momentum +/vis/filtering/trajectories/create/attributeFilter +# Select attribute "IMag" +/vis/filtering/trajectories/attributeFilter-0/setAttribute IMag +# Select trajectories with 25 MeV <= IMag < 1000 GeV +/vis/filtering/trajectories/attributeFilter-0/addInterval 25 MeV 1000 GeV +# +# To superimpose all of the events from a given run: +/vis/scene/endOfEventAction accumulate +# +# Re-establish auto refreshing and verbosity: +/vis/viewer/set/autoRefresh true +/vis/verbose warnings +# +# For file-based drivers, use this to create an empty detector view: +#/vis/viewer/flush +/vis/viewer/set/background 1 1 1 \ No newline at end of file diff --git a/examples/extended/parameterisations/README b/examples/extended/parameterisations/README deleted file mode 100644 index 5efb61aa64..0000000000 --- a/examples/extended/parameterisations/README +++ /dev/null @@ -1,33 +0,0 @@ - - Geant4 extended examples - parameterisations - ---------------------------------------------- - - Examples in this directory demonstrate use of parameterisation libraries. - Currently, two examples are provided: - - Par01 - ------- - - This example demonstrates the use of parameterisation facilities. - It was moved in extended examples from novice/N05 with removal of - novice examples. - - Par02 - ------- - - This example shows how to do "track and energy smearing" in Geant4, - in order to have a very fast simulation based on assumed detector - resolutions. - - Par03 - ------- - - This example demonstrates how to create multiple energy deposits - from the fast simulation model and store it alongside deposits created - in full/detailed simulation. - - gflash - ------- - - Set of examples demonstrating the use of the GFLASH parameterisation library. - diff --git a/examples/extended/parameterisations/gflash/.README.txt b/examples/extended/parameterisations/gflash/.README.txt deleted file mode 100644 index e582dec264..0000000000 --- a/examples/extended/parameterisations/gflash/.README.txt +++ /dev/null @@ -1,165 +0,0 @@ -///\file "parameterisations/gflash/.README.txt" -///\brief Examples gflash README page - -/*! \page Examples_gflash Category "parameterisations/gflash" - -These examples demonstrate the use of the GFLASH parameterisation library. -They use the GFLASH equations (hep-ex/0001020, Grindhammer & Peters) -to parametrise electromagnetic showers in matter. -In these examples the calorimeter is a simple cube, -which consists of 10 x 10 crystals of PbWO4 (CMS like). - -Briefly, whenever a e-/e+ enters the calorimeter, it is parametrised if it -has a minimum energy and the shower is expected to be contained -in the calorimeter (so called " parameterisation envelope"). -If this is fullfilled the particle is killed, as well as all secondaries, -and the energy is deposited according to the GFLASH equations. - -The examples show how to interface GFLASH to your application. -The simulation time is measured, so the user can see immediately -the speed up by using GFLASH. - -Geometry and parametrisation is defined in different ways in the set of three equivalent -(in terms of produced showers) examples: gflash1, gflash2 and gflash3, to demonstrate -how to use the parametrisation, sensitive detectors and parallel geometry. -The classes which are the same in all three examples have the names with ExGflash prefix while -the names of classes specific to each example have the prexix ExGflash[1,2,3]. - -The gflasha -example - allow histogramming of show profiles and fine tuning -of gflash parametrization for homogeneous medium. - -Note: Instead of particle gun the gps class is used here for particle generation. - -\section Examples_gflash_s1 Briefly - - Table below presents in which world/geometry (mass or parallel) each of the elements is defined. - - -| Example | gflash1 | gflash2 | gflash3 | -|------------------------------|----------|--------------|--------------| -| Block of material | mass geo | mass geo | mass geo | -| Crystals (readout geometry) | mass geo | mass geo | parallel geo | -| Sensitive detector | mass geo | mass geo | parallel geo | -| Envelope for parametrisation | mass geo | parallel geo | mass geo | - - -\subsection Examples_gflash_s1_sub1 Example gflash1: - -Uses only the mass geometry, with each crystal defined as a volume, -with parametrisation attached to the envelope in the mass geometry. -Geometry and sensitive detector are defined in: -- ExGflash1DetectorConstruction -- ExGflash1SensitiveDetector - -\subsection Examples_gflash_s1_sub2 Example gflash2: - -Uses mass geometry to create volumes and to create a sensitive detector -for storing hits, but parametrisation is attached to the envelope -in the parallel geometry (see also examples/extended/parametrisations/Par01). -Geometry and sensitive detector are defined in: -- ExGflash2DetectorConstruction -- ExGflash2ParallelWorld -- ExGflash2SensitiveDetector - -\subsection Examples_gflash_s1_sub3 Example gflash3: - -Uses mass geometry to create the main volume (homogeneous material) and use it -as an envelope for the parametrisation, but the readout geometry (crystals) -are defined in the parallel geometry, together with the sensitive detector -to store the hits. -Geometry and sensitive detector are defined in: -- ExGflash3DetectorConstruction -- ExGflash3ParallelWorld -- ExGflash3SensitiveDetector - -\section Examples_gflash_s2 Details of implementation: - -\subsection Examples_gflash_s2_sub1 Example gflash1: - -To use GFLASH the user has to implement the following: - - - ExGflash1DetectorConstruction::ConstructSDandField() : \n - Here GFLASH has to be initialized and assigend to the envelope, - where it should be active (here our calorimeter = caloLog ) -\code{.cpp} -// ********************************************** -// * Initializing shower modell -// *********************************************** -G4cout << "Creating shower parameterization models" << G4endl; -fFastShowerModel = new GFlashShowerModel("fFastShowerModel", fRegion); -fParameterisation = new GFlashHomoShowerParameterisation(pbWO4); -fFastShowerModel->SetParameterisation(*fParameterisation); -fParticleBounds = new GFlashParticleBounds(); -fFastShowerModel->SetParticleBounds(*fParticleBounds); -fHitMaker = new GFlashHitMaker(); -fFastShowerModel->SetHitMaker(*fHitMaker); -G4cout<<"end shower parameterization."<SetParameterisation(*fParameterisation); - fParticleBounds = new GFlashParticleBounds(); - fFastShowerModel->SetParticleBounds(*fParticleBounds); - fHitMaker = new GFlashHitMaker(); - fFastShowerModel->SetHitMaker(*fHitMaker); - G4cout<<"end shower parameterization."< 20 slices of 1. radl -/exgflash/det/setRbin 5 0.25 ---> 5 rings of 0.25 radl - (MaxBin = 500 in both directions) -\endverbatim - -In ExGflashEventAction class the arrays corresponded slices and rings was -created and filled with hists information. This arrays was use to fill -histograms later. - -\section gflasha_s3 Visualization - -The Visualization Manager is set in the main(). -The initialization of the drawing is done via the commands /vis/... -in the macro vis.mac. To get visualization: -\verbatim -/control/execute vis.mac -\endverbatim - -\section gflasha_s4 How to start ? - -- Execute ExGflasha in 'batch' mode from macro files -\verbatim - % ExGflasha test.mac -\endverbatim - -- Execute ExGflasha in 'interactive mode' with visualization -\verbatim - % ExGflasha - .... - Idle> type your commands - .... - Idle> exit -\endverbatim - -The GFLASH activated via: -\verbatim -/GFlash/flag 1 -\endverbatim - -\section gflasha_s5 Histograms - -ExGflasha produces several histograms: -The histograms defined in ExGflashHistoManager class - -Content of these histo: - -- h0 : energy deposit per event -- h1 : the number of hits per event -- h2 : the energy per hit ( in MeV ) - -- p0 : longitudinal energy profile -- p1 : radial energy profile - -- p2 : cumulated longitudinal energy profile -- p3 : cumulated radial energy profile - -To define the output file name with histograms, use the UI command : -\verbatim -/analysys/setFileName name -\endverbatim - -\section gflasha_s6 Macros - -The macros to run in batch mode: - -- test.mac - default macro for example testing - -- run01.mac - show how redefine the histograms - -- csi1.mac - macro which produce profiles in CsI Material - -- test0.mac - profile caparison, long run without GFLASH -- test1.mac - profile comprising, long run with GFLASH on - -*/ diff --git a/examples/extended/parameterisations/gflash/gflasha/CMakeLists.txt b/examples/extended/parameterisations/gflash/gflasha/CMakeLists.txt index 6cb6e11b47..028311fa1f 100644 --- a/examples/extended/parameterisations/gflash/gflasha/CMakeLists.txt +++ b/examples/extended/parameterisations/gflash/gflasha/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(gflasha) #---------------------------------------------------------------------------- @@ -40,7 +40,7 @@ target_link_libraries(ExGflasha ${Geant4_LIBRARIES} ) # relies on these scripts being in the current working directory. # set(gflash_SCRIPTS - test.mac test0.mac test1.mac vis.mac power-off.png csi1.mac run01.mac + test.mac test0.mac test1.mac vis.mac csi1.mac run01.mac cmpL.C cmpR.C ) foreach(_script ${gflash_SCRIPTS}) diff --git a/examples/extended/parameterisations/gflash/gflasha/ExGflasha.cc b/examples/extended/parameterisations/gflash/gflasha/ExGflasha.cc index 3367a49f63..f227478af2 100644 --- a/examples/extended/parameterisations/gflash/gflasha/ExGflasha.cc +++ b/examples/extended/parameterisations/gflash/gflasha/ExGflasha.cc @@ -30,26 +30,26 @@ // Created by Joanna Weng 26.11.2004 // G4 includes -#include "G4Types.hh" -#include "G4ios.hh" #include "G4Timer.hh" +#include "G4Types.hh" #include "G4UImanager.hh" +#include "G4ios.hh" #include "G4RunManagerFactory.hh" // my project -#include "ExGflashDetectorConstruction.hh" #include "ExGflashActionInitialization.hh" +#include "ExGflashDetectorConstruction.hh" #include "FTFP_BERT.hh" #include "G4FastSimulationPhysics.hh" -#include "G4VisExecutive.hh" #include "G4UIExecutive.hh" +#include "G4VisExecutive.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -int main(int argc,char** argv) +int main(int argc, char** argv) { // Instantiate G4UIExecutive if interactive mode G4UIExecutive* ui = nullptr; @@ -61,26 +61,32 @@ int main(int argc,char** argv) G4Timer timer; timer.Start(); - G4cout<<"+-------------------------------------------------------+"<SetUserInitialization(detector); // -- Select a physics list: G4VModularPhysicsList* physicsList = new FTFP_BERT(); // -- Create a fast simulation physics constructor, used to augment // -- the above physics list to allow for fast simulation: - G4FastSimulationPhysics* fastSimulationPhysics = new G4FastSimulationPhysics(); + auto fastSimulationPhysics = new G4FastSimulationPhysics(); // -- We now configure the fastSimulationPhysics object. - // -- The gflash model (GFlashShowerModel, see ExGflashDetectorConstruction.cc) + // -- The gflash model (GFlashShowerModel, see + // ExGflashDetectorConstruction.cc) // -- is applicable to e+ and e- : we augment the physics list for these // -- particles (by adding a G4FastSimulationManagerProcess with below's // -- calls), this will make the fast simulation to be activated: @@ -91,7 +97,7 @@ int main(int argc,char** argv) // -- (will happen at initialization of the run manager) // -- for physics process construction, the fast simulation // -- configuration will be applied as well. - physicsList->RegisterPhysics( fastSimulationPhysics ); + physicsList->RegisterPhysics(fastSimulationPhysics); runManager->SetUserInitialization(physicsList); // Action initialization: @@ -105,16 +111,16 @@ int main(int argc,char** argv) runManager->Initialize(); UImanager->ApplyCommand("/Step/Verbose 0"); - if (ui) // Define UI terminal for interactive mode + if ( ui != nullptr ) // Define UI terminal for interactive mode { UImanager->ApplyCommand("/control/execute vis.mac"); ui->SessionStart(); delete ui; } - else // Batch mode + else // Batch mode { - G4String s=*(argv+1); - UImanager->ApplyCommand("/control/execute "+s); + G4String s = *(argv + 1); + UImanager->ApplyCommand("/control/execute " + s); } delete visManager; @@ -124,7 +130,7 @@ int main(int argc,char** argv) G4cout << G4endl; G4cout << "******************************************"; G4cout << G4endl; - G4cout << "Total Real Elapsed Time is: "<< timer.GetRealElapsed(); + G4cout << "Total Real Elapsed Time is: " << timer.GetRealElapsed(); G4cout << G4endl; G4cout << "Total System Elapsed Time: " << timer.GetSystemElapsed(); G4cout << G4endl; diff --git a/examples/extended/parameterisations/gflash/gflasha/README b/examples/extended/parameterisations/gflash/gflasha/README deleted file mode 100644 index 36baeee3c3..0000000000 --- a/examples/extended/parameterisations/gflash/gflasha/README +++ /dev/null @@ -1,110 +0,0 @@ - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - GFLASHa Example - --------------- - -The Example demonstrating usage 'gflash' shower parameterisation -in homogeneous calorimeter.Compare with glash1,2,3 in this -example histograms was added. This makes it possible to use this -example for fine tuning of GFLASH parameters. - This example allow compare the shower profiles from fast simulation -with full simulation by histograming of longitudinal (slice) -and radial profiles with different "binning". -Then GFlash fast simulation can be "tuned" via modification -of the model parameters file: - -include/ExGflashHomoShowerTuning.hh - -in this example. - -GEOMETRY DEFINITION -------------------- - -In this example the calorimeter is a simple cube, -which consists of 10 x 10 crystals of PbWO4 (CMS like). - -Geometry, sensitive detector and hits are defined respectively in: - ExGflashDetectorConstruction - ExGflashSensitiveDetector - ExGflashHit - -Materials can be choosen from Nist Materials: G4_Air G4_WATER ... -eg: /exgflash/det/setMat G4_PbWO4 see also: csi1.mac - -HIT SCORING ------------ - -The virtual cylinder sliced longitudinally (slice) and radially (ring) was used. -The size of the slices and rings are expressed in radiation -length units and can be changed. -eg: /exgflash/det/setLbin 20 1. ---> 20 slices of 1. radl - /exgflash/det/setRbin 5 0.25 ---> 5 rings of 0.25 radl - - (MaxBin = 500 in both directions) - -In ExGflashEventAction class the arrays corresponded slices and rings was -created and filled with hists information. This arrays was use to fill -histograms later. - -VISUALIZATION -------------- - -The Visualization Manager is set in the main(). -The initialization of the drawing is done via the commands /vis/... -in the macro vis.mac. To get visualization: - /control/execute vis.mac - - -HOW TO START ? --------------- - -- Execute ExGflasha in 'batch' mode from macro files - % ExGflasha test.mac - -- Execute ExGflasha in 'interactive mode' with visualization - % ExGflasha - .... - Idle> type your commands - .... - Idle> exit - -The GFLASH activated via: - -/GFlash/flag 1 - -HISTOGRAMS ----------- - - ExGflasha produces several histograms: - The histograms defined in ExGflashHistoManager class - - Content of these histo: - - h0 : energy deposit per event - h1 : the number of hits per event - h2 : the energy per hit ( in MeV ) - - p0 : longitudinal energy profile - p1 : radial energy profile - - p2 : cumulated longitudinal energy profile - p3 : cumulated radial energy profile - - To define the output file name with histograms, use the UI command : - - "/analysys/setFileName name" - -MACROS ------- -The macros to run in batch mode: - -test.mac - default macro for example testing - -run01.mac - show how redefine the histograms - -csi1.mac - macro which produce profiles in CsI Material - -test0.mac - profile comparison, long run without GFLASH -test1.mac - profile comparison, long run with GFLASH on diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashActionInitialization.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashActionInitialization.hh index de6a948021..b1616a79c4 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashActionInitialization.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashActionInitialization.hh @@ -38,16 +38,15 @@ class ExGflashDetectorConstruction; class ExGflashActionInitialization : public G4VUserActionInitialization { - public: - ExGflashActionInitialization(ExGflashDetectorConstruction* det); - virtual ~ExGflashActionInitialization(); + public: + ExGflashActionInitialization(ExGflashDetectorConstruction* det); + ~ExGflashActionInitialization() override; - virtual void BuildForMaster() const; - virtual void Build() const; - private: + void BuildForMaster() const override; + void Build() const override; + private: ExGflashDetectorConstruction* fDetector; - }; #endif diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashDetectorConstruction.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashDetectorConstruction.hh index 84f08e0f27..ba98aeb46a 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashDetectorConstruction.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashDetectorConstruction.hh @@ -29,10 +29,10 @@ #ifndef ExGflashDetectorConstruction_h #define ExGflashDetectorConstruction_h 1 -#include "G4VUserDetectorConstruction.hh" #include "ExGflashSensitiveDetector.hh" -#include "G4ThreeVector.hh" #include "G4Cache.hh" +#include "G4ThreeVector.hh" +#include "G4VUserDetectorConstruction.hh" #include "globals.hh" class G4LogicalVolume; @@ -48,47 +48,65 @@ class ExGflashMessenger; class ExGflashDetectorConstruction : public G4VUserDetectorConstruction { -public: + public: ExGflashDetectorConstruction(); - ~ExGflashDetectorConstruction(); - - virtual G4VPhysicalVolume* Construct(); - virtual void ConstructSDandField(); - - void SetLBining (G4ThreeVector); - void SetRBining (G4ThreeVector); - void SetVerbose(G4int val) {fVerbose = val;} + ~ExGflashDetectorConstruction() override; + + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; + + void SetLBining(G4ThreeVector); + void SetRBining(G4ThreeVector); + void SetVerbose(G4int val) { fVerbose = val; } void SetMaterial(G4String mat); - G4int GetVerbose() const {return fVerbose;} + G4int GetVerbose() const + { + return fVerbose; + } - G4int GetnLtot() const {return fNLtot;} - G4int GetnRtot() const {return fNRtot;} - G4double GetdLradl() const {return fDLradl;} - G4double GetdRradl() const {return fDRradl;} + G4int GetnLtot() const + { + return fNLtot; + } + G4int GetnRtot() const + { + return fNRtot; + } + G4double GetdLradl() const + { + return fDLradl; + } + G4double GetdRradl() const + { + return fDRradl; + } - G4double GetSDRadLen() const {return fSDRadLen;} - -private: - G4int fNbOfCrystals; // cube of nb x nb crystals + G4double GetSDRadLen() const + { + return fSDRadLen; + } - G4double fCrystalWidth; // x,y size - G4double fCrystalLength;// z size + private: + G4int fNbOfCrystals; // cube of nb x nb crystals - G4LogicalVolume* fCrystal_log; + G4double fCrystalWidth; // x,y size + G4double fCrystalLength; // z size + + G4LogicalVolume* fCrystal_log; G4Material* fDetMat; - G4Region* fRegion; + G4Region* fRegion; G4double fSDRadLen; // SD material Rad Lenght G4int fVerbose; - G4int fNLtot, fNRtot; // nb of bins: longitudinal and radial - G4double fDLradl, fDRradl; // bin thickness (in radl unit) + G4int fNLtot, fNRtot; // nb of bins: longitudinal and radial + G4double fDLradl, fDRradl; // bin thickness (in radl unit) - ExGflashMessenger* fGflashMessenger; + ExGflashMessenger* fGflashMessenger; - static G4ThreadLocal GFlashShowerModel* fFastShowerModel; + static G4ThreadLocal GFlashShowerModel* fFastShowerModel; static G4ThreadLocal GFlashHomoShowerParameterisation* fParameterisation; static G4ThreadLocal GFlashParticleBounds* fParticleBounds; static G4ThreadLocal GFlashHitMaker* fHitMaker; diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashEventAction.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashEventAction.hh index 6b6d03b1d9..4c12603e10 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashEventAction.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashEventAction.hh @@ -35,17 +35,17 @@ class ExGflashDetectorConstruction; -class ExGflashEventAction: public G4UserEventAction { -public: +class ExGflashEventAction : public G4UserEventAction +{ + public: ExGflashEventAction(ExGflashDetectorConstruction* det); - ~ExGflashEventAction(); - - virtual void BeginOfEventAction(const G4Event*); - virtual void EndOfEventAction(const G4Event*); - -private: - G4int fCalorimeterCollectionId; - ExGflashDetectorConstruction* fDet; + ~ExGflashEventAction() override; + void BeginOfEventAction(const G4Event*) override; + void EndOfEventAction(const G4Event*) override; + + private: + G4int fCalorimeterCollectionId; + ExGflashDetectorConstruction* fDet; }; #endif diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHistoManager.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHistoManager.hh index 7b3b3f7df3..bc9500d92a 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHistoManager.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHistoManager.hh @@ -30,8 +30,8 @@ #ifndef ExGflashHistoManager_h #define ExGflashHistoManager_h 1 +#include "G4AnalysisManager.hh" #include "globals.hh" -#include "g4root.hh" class ExGflashDetectorConstruction; @@ -39,24 +39,23 @@ class ExGflashDetectorConstruction; class ExGflashHistoManager { - public: - ExGflashHistoManager(ExGflashDetectorConstruction* myDet); - ~ExGflashHistoManager(); + public: + ExGflashHistoManager(ExGflashDetectorConstruction* myDet); + ~ExGflashHistoManager(); void InitializePerEvent(); - void FillPerEvent(); + // void FillPerEvent(); - inline void FillPerTrack(G4double,G4double); - inline void FillPerStep (G4double,G4int,G4int); + // inline void FillPerTrack(G4double, G4double); + // inline void FillPerStep(G4double, G4int, G4int); -private: + private: void Book(); G4String fFileName; - - ExGflashDetectorConstruction* fDet; - - G4int fVerbose; + ExGflashDetectorConstruction* fDet; + + G4int fVerbose; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHit.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHit.hh index e59288b9ee..6906e08b86 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHit.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHit.hh @@ -29,65 +29,75 @@ // #ifndef ExGflashHit_h #define ExGflashHit_h 1 - -#include "G4VHit.hh" -#include "G4THitsCollection.hh" + #include "G4Allocator.hh" -#include "G4ThreeVector.hh" #include "G4RotationMatrix.hh" +#include "G4THitsCollection.hh" +#include "G4ThreeVector.hh" +#include "G4VHit.hh" class G4LogicalVolume; class ExGflashHit : public G4VHit { -public: - + public: ExGflashHit(); - ~ExGflashHit(); - ExGflashHit(const ExGflashHit &right); - const ExGflashHit& operator=(const ExGflashHit &right); - G4bool operator==(const ExGflashHit &right) const; - - inline void *operator new(size_t); - inline void operator delete(void *aHit); - void *operator new(size_t,void*p){return p;} + ~ExGflashHit() override; + ExGflashHit(const ExGflashHit& right); + ExGflashHit& operator=(const ExGflashHit& right); + G4bool operator==(const ExGflashHit& right) const; + + inline void* operator new(size_t); + inline void operator delete(void* aHit); + void* operator new(size_t, void* p) { return p; } #ifndef G4NOT_ISO_DELETES - void operator delete(void *,void*){} + void operator delete(void*, void*) {} #endif - - virtual void Draw(); - virtual void Print(); - - private: + + void Draw() override; + void Print() override; + + private: G4double fEdep; G4ThreeVector fPos; - -public: - inline void SetEdep(G4double de) - { fEdep = de; }; - inline void AddEdep(G4double de) - { fEdep += de; }; - inline G4double GetEdep() - { return fEdep; }; - inline void SetPos(G4ThreeVector xyz) - { fPos = xyz; }; - inline G4ThreeVector GetPos() - { return fPos; }; + + public: + void SetEdep(G4double de) + { + fEdep = de; + }; + void AddEdep(G4double de) + { + fEdep += de; + }; + G4double GetEdep() + { + return fEdep; + }; + void SetPos(G4ThreeVector xyz) + { + fPos = xyz; + }; + G4ThreeVector GetPos() + { + return fPos; + }; }; -typedef G4THitsCollection ExGflashHitsCollection; +using ExGflashHitsCollection = G4THitsCollection; extern G4ThreadLocal G4Allocator* ExGflashHitAllocator; inline void* ExGflashHit::operator new(size_t) { - if(!ExGflashHitAllocator) ExGflashHitAllocator = new G4Allocator; - return (void *) ExGflashHitAllocator->MallocSingle(); + if ( ExGflashHitAllocator == nullptr ) + ExGflashHitAllocator = new G4Allocator; + return (void*)ExGflashHitAllocator->MallocSingle(); } -inline void ExGflashHit::operator delete(void *aHit) +inline void ExGflashHit::operator delete(void* aHit) { - ExGflashHitAllocator->FreeSingle((ExGflashHit*) aHit); + ExGflashHitAllocator->FreeSingle((ExGflashHit*)aHit); } #endif diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHomoShowerTuning.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHomoShowerTuning.hh index 8484cbeee1..390f051758 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHomoShowerTuning.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashHomoShowerTuning.hh @@ -64,85 +64,84 @@ class ExGflashHomoShowerTuning : public GVFlashHomoShowerTuning { - public: - ExGflashHomoShowerTuning() {} - virtual ~ExGflashHomoShowerTuning() {} - - public: // with description +public: + ExGflashHomoShowerTuning() = default; + ~ExGflashHomoShowerTuning() override = default; - G4double ParAveT1(){ return -0.812;} // t1 - G4double ParAveA1(){ return 0.81; } // a1 - G4double ParAveA2(){ return 0.458; } // a2 - G4double ParAveA3(){ return 2.26; } // a3 - - G4double ParSigLogT1(){ return -1.4;} // t1 - G4double ParSigLogT2(){ return 1.26;} // t2 - // std::sqrt(var(ln(T))) = 1/(t+t2*ln(y)) +public: // with description - G4double ParSigLogA1(){ return -0.58;} // a1 - G4double ParSigLogA2(){ return 0.86; } // a2 - // std::sqrt(var(ln(alpha))) = 1/(a1+a2*ln(y)) - - G4double ParRho1(){ return 0.705; } // r1 - G4double ParRho2(){ return -0.023;} // r2 - // Correlation(ln(T),ln(alpha))=r1+r2*ln(y) + G4double ParAveT1() override { return -0.812;} // t1 + G4double ParAveA1() override { return 0.81; } // a1 + G4double ParAveA2() override { return 0.458; } // a2 + G4double ParAveA3() override { return 2.26; } // a3 - // Radial profiles - // f(r) := (1/dE(t))(dE(t,r)/dr) - // Ansatz: - // f(r) = p(2*r*Rc**2)/(r**2+Rc**2)**2+(1-p)*(2*r*Rt**2)/(r**2+Rt**2)**2, - // 0 = alpha_s/beta_s - // Ts = (alpha_s-1)/beta_s - // and - // Ts = T*(t1+t2*Z) - // alpha_s = alpha*(a1+a2*Z) + // Radial profiles + // f(r) := (1/dE(t))(dE(t,r)/dr) + // Ansatz: + // f(r) = p(2*r*Rc**2)/(r**2+Rc**2)**2+(1-p)*(2*r*Rt**2)/(r**2+Rt**2)**2, + // 0 = alpha_s/beta_s + // Ts = (alpha_s-1)/beta_s + // and + // Ts = T*(t1+t2*Z) + // alpha_s = alpha*(a1+a2*Z) + + G4double ParSpotT1() override { return 0.698; } // t1 + G4double ParSpotT2() override { return 0.00212;} // t2 + + G4double ParSpotA1() override { return 0.639; } //a1 + G4double ParSpotA2() override { return 0.00334;} //a2 }; #endif diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashMessenger.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashMessenger.hh index bb7fa5746a..43bc86a52a 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashMessenger.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashMessenger.hh @@ -26,15 +26,15 @@ /// \file ExGflashMessenger.hh /// \brief Definition of the ExGflashMessenger class // -// +// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #ifndef ExGflashMessenger_h #define ExGflashMessenger_h 1 -#include "globals.hh" #include "G4UImessenger.hh" +#include "globals.hh" class ExGflashDetectorConstruction; class G4UIdirectory; @@ -44,23 +44,23 @@ class G4UIcmdWith3Vector; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class ExGflashMessenger: public G4UImessenger +class ExGflashMessenger : public G4UImessenger { -public: - ExGflashMessenger(ExGflashDetectorConstruction* ); - virtual ~ExGflashMessenger(); + public: + ExGflashMessenger(ExGflashDetectorConstruction*); + ~ExGflashMessenger() override; - virtual void SetNewValue(G4UIcommand*, G4String); + void SetNewValue(G4UIcommand*, G4String) override; -private: - ExGflashDetectorConstruction* fDetector; + private: + ExGflashDetectorConstruction* fDetector; - G4UIdirectory* fExGflashDir; - G4UIcmdWithAnInteger* fVerbose; - G4UIdirectory* fDetDir; - G4UIcmdWithAString* fMaterCmd; - G4UIcmdWith3Vector* fLBinCmd; - G4UIcmdWith3Vector* fRBinCmd; + G4UIdirectory* fExGflashDir; + G4UIcmdWithAnInteger* fVerbose; + G4UIdirectory* fDetDir; + G4UIcmdWithAString* fMaterCmd; + G4UIcmdWith3Vector* fLBinCmd; + G4UIcmdWith3Vector* fRBinCmd; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashPrimaryGeneratorAction.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashPrimaryGeneratorAction.hh index d742fba964..a832175944 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashPrimaryGeneratorAction.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashPrimaryGeneratorAction.hh @@ -35,16 +35,16 @@ class G4Event; class G4GeneralParticleSource; -class ExGflashPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +class ExGflashPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { - public: - ExGflashPrimaryGeneratorAction(); - ~ExGflashPrimaryGeneratorAction(); + public: + ExGflashPrimaryGeneratorAction(); + ~ExGflashPrimaryGeneratorAction() override; - virtual void GeneratePrimaries(G4Event* anEvent); + void GeneratePrimaries(G4Event* anEvent) override; - private: - G4GeneralParticleSource* fParticleGun; + private: + G4GeneralParticleSource* fParticleGun; }; #endif diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashRunAction.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashRunAction.hh index 8463e46697..775027b139 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashRunAction.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashRunAction.hh @@ -30,25 +30,25 @@ #ifndef ExGflashRunAction_h #define ExGflashRunAction_h -#include "G4UserRunAction.hh" #include "ExGflashHistoManager.hh" #include "G4Timer.hh" +#include "G4UserRunAction.hh" class G4Run; class ExGflashDetectorConstruction; class ExGflashRunAction : public G4UserRunAction { -public: + public: ExGflashRunAction(ExGflashDetectorConstruction* det); - ~ExGflashRunAction(); + ~ExGflashRunAction() override; - virtual void BeginOfRunAction(const G4Run* aRun); - virtual void EndOfRunAction(const G4Run* aRun); + void BeginOfRunAction(const G4Run* aRun) override; + void EndOfRunAction(const G4Run* aRun) override; -private: + private: // G4int fRunID; - ExGflashHistoManager* fHistoManager; + ExGflashHistoManager* fHistoManager; ExGflashDetectorConstruction* fDetector; G4Timer fRunTimer; diff --git a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashSensitiveDetector.hh b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashSensitiveDetector.hh index cb16330908..e43b9d11e9 100644 --- a/examples/extended/parameterisations/gflash/gflasha/include/ExGflashSensitiveDetector.hh +++ b/examples/extended/parameterisations/gflash/gflasha/include/ExGflashSensitiveDetector.hh @@ -30,9 +30,9 @@ #ifndef EXGFLASHSENSITIVEDETECTOR_H #define EXGFLASHSENSITIVEDETECTOR_H +#include "ExGflashHit.hh" #include "G4VSensitiveDetector.hh" #include "G4VGFlashSensitiveDetector.hh" -#include "ExGflashHit.hh" #include "globals.hh" class G4GFlashSpot; @@ -42,18 +42,20 @@ class G4Step; class G4HCofThisEvent; class G4TouchableHistory; -class ExGflashSensitiveDetector: public G4VSensitiveDetector, - public G4VGFlashSensitiveDetector { -public: +class ExGflashSensitiveDetector + : public G4VSensitiveDetector + , public G4VGFlashSensitiveDetector +{ + public: ExGflashSensitiveDetector(G4String, ExGflashDetectorConstruction* det); - ~ExGflashSensitiveDetector(); - - virtual void Initialize(G4HCofThisEvent*); - virtual G4bool ProcessHits(G4Step*,G4TouchableHistory*); - virtual G4bool ProcessHits(G4GFlashSpot*aSpot,G4TouchableHistory*); - virtual void EndOfEvent(G4HCofThisEvent*); + ~ExGflashSensitiveDetector() override; -private: + void Initialize(G4HCofThisEvent*) override; + G4bool ProcessHits(G4Step*, G4TouchableHistory*) override; + G4bool ProcessHits(G4GFlashSpot* aSpot, G4TouchableHistory*) override; + void EndOfEvent(G4HCofThisEvent*) override; + + private: ExGflashHitsCollection* fCaloHitsCollection; // ExGflashDetectorConstruction* fDetector; G4int fHCID; diff --git a/examples/extended/parameterisations/gflash/gflasha/power-off.png b/examples/extended/parameterisations/gflash/gflasha/power-off.png deleted file mode 100644 index e4493a3691d1f0fafdb0150b8d90e3e668f1a082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 969 zcmV;)12+7LP)zZ-`V?7{;IX-2XH8&dkoZxhl1pN!n(Au(i@w6k3Qt(=aw< zx3U$Aq7U{VjG(9t%)W#uM5R$!R39o`v~}}C)Uy3siIBw-DK}zWa&>2CclOSmx#yfd z4V<|o{2ff8PGD%S=wq_ zhldxWi+eqHI8L;-CY%9F4kWy9cg15{Tt?Q@@z?`xy8dV_vP-mXkLT`ih>T6Pwfd`c zY9L9}Sq*OOPj~|xEOVtAF4ov}wcrN9Q}-Fh;sfcXK9lH{3iw*Xcxj_$-mDg15@P05 zP<*o%d{W5%&-}tr#cdc_FT3%>05kw#8qj(m={>I&g;I)blT+Os7_9{dAotAVyM7PD zan;;nTkY3t+T#GgZZ-67i%3@sy0f_#CWJUT4;TQzfxo-6xd*3(D5!pqWA6X}*6TRi z)!@*qf9gya?yCnbYgWpio|u|`QS}~i>~$K@$~sJAg&Ld;iv3Z50A$3f*q;x>IcHLg zRxzEZ;;sM5`Czp0Bfs!jLK& z7BbdyA}AgN5JYb>7?eg@W7_(%VG=oW;1<#HK*}?!CxDBC#nSF*t*YA%ZJD|cr7X^w zEiH`QIUl5&7|_yY7)w+yE9DsL4}yv|blFx98XQbzMaP7YQcei*1N+1ezEp$9V$Q}J zHSMWJ!3MD6-K6)5>KzS&p9L_+PM1n=|Hb(gHGD6X*cT(ZyB?SU*SzMrM?A)C)qgAR zzYYLQ0OP&c+_P%f%$PfrX&SuOH1?v#UuO|xU47})$R^ubt@^J{=Z{PXaSTv;+Z(e# ze=Z*18ikxKg=2j|F!W0)9QLK0Y18#PHdw}*PRm*qt^KVOUfh$^*K0>LT^1t0`AYVotds*~Pb)7ZkUtg#ht7rE?X=7_jHuxk^Wm)j&688p_xr$U z)vpS0i8}Ttz4z}jjAhkw^=o%#bGy%Reh_o#&%EzhOAxJZH;m0Ib?v65y0+K`nWLPK rpXYq^`(o+jxDY2KkZa_2|1bRuVR$fJw?)}c00000NkvXXu0mjfpe)wK diff --git a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashActionInitialization.cc b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashActionInitialization.cc index eb0cc71522..0b24c78b49 100644 --- a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashActionInitialization.cc +++ b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashActionInitialization.cc @@ -28,22 +28,20 @@ /// \brief Implementation of the ExGflashActionInitialization class #include "ExGflashActionInitialization.hh" +#include "ExGflashEventAction.hh" #include "ExGflashPrimaryGeneratorAction.hh" #include "ExGflashRunAction.hh" -#include "ExGflashEventAction.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashActionInitialization::ExGflashActionInitialization(ExGflashDetectorConstruction* det) +ExGflashActionInitialization::ExGflashActionInitialization( + ExGflashDetectorConstruction* det) : G4VUserActionInitialization(), fDetector(det) -{ -} +{} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashActionInitialization::~ExGflashActionInitialization() -{ -} +ExGflashActionInitialization::~ExGflashActionInitialization() = default; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -59,6 +57,6 @@ void ExGflashActionInitialization::Build() const SetUserAction(new ExGflashPrimaryGeneratorAction); SetUserAction(new ExGflashRunAction(fDetector)); SetUserAction(new ExGflashEventAction(fDetector)); -} +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashDetectorConstruction.cc b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashDetectorConstruction.cc index a1aa0fa163..5bd60952aa 100644 --- a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashDetectorConstruction.cc +++ b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashDetectorConstruction.cc @@ -33,59 +33,67 @@ // User Classes #include "ExGflashDetectorConstruction.hh" -#include "ExGflashSensitiveDetector.hh" -#include "ExGflashMessenger.hh" #include "ExGflashHomoShowerTuning.hh" +#include "ExGflashMessenger.hh" +#include "ExGflashSensitiveDetector.hh" // G4 Classes -#include "G4RunManager.hh" -#include "G4NistManager.hh" -#include "G4Material.hh" -#include "G4ThreeVector.hh" -#include "G4PVPlacement.hh" -#include "G4VPhysicalVolume.hh" -#include "G4LogicalVolume.hh" -#include "G4Box.hh" -#include "G4SDManager.hh" -#include "G4VisAttributes.hh" -#include "G4Colour.hh" -#include "G4SystemOfUnits.hh" #include "G4AutoDelete.hh" +#include "G4Box.hh" +#include "G4Colour.hh" +#include "G4LogicalVolume.hh" +#include "G4Material.hh" +#include "G4NistManager.hh" +#include "G4PVPlacement.hh" +#include "G4RunManager.hh" +#include "G4SDManager.hh" +#include "G4SystemOfUnits.hh" +#include "G4ThreeVector.hh" +#include "G4VPhysicalVolume.hh" +#include "G4VisAttributes.hh" #include "globals.hh" -//fast simulation -#include "GFlashHomoShowerParameterisation.hh" +// fast simulation #include "G4FastSimulationManager.hh" -#include "GFlashShowerModel.hh" #include "GFlashHitMaker.hh" +#include "GFlashHomoShowerParameterisation.hh" #include "GFlashParticleBounds.hh" +#include "GFlashShowerModel.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4ThreadLocal GFlashShowerModel* ExGflashDetectorConstruction::fFastShowerModel = 0; -G4ThreadLocal -GFlashHomoShowerParameterisation* ExGflashDetectorConstruction::fParameterisation = 0; -G4ThreadLocal GFlashParticleBounds* ExGflashDetectorConstruction::fParticleBounds = 0; -G4ThreadLocal GFlashHitMaker* ExGflashDetectorConstruction::fHitMaker = 0; +G4ThreadLocal GFlashShowerModel* + ExGflashDetectorConstruction::fFastShowerModel = nullptr; +G4ThreadLocal GFlashHomoShowerParameterisation* + ExGflashDetectorConstruction::fParameterisation = nullptr; +G4ThreadLocal GFlashParticleBounds* + ExGflashDetectorConstruction::fParticleBounds = nullptr; +G4ThreadLocal GFlashHitMaker* ExGflashDetectorConstruction::fHitMaker = nullptr; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... const G4int kMaxBin = 500; -//const G4int kMaxRowCol = 50; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... ExGflashDetectorConstruction::ExGflashDetectorConstruction() - :G4VUserDetectorConstruction(),fNbOfCrystals(10), - fCrystal_log(0),fDetMat(0),fRegion(0), - fVerbose(0),fNLtot(40),fNRtot(50),fDLradl(0.5),fDRradl(0.1) + : G4VUserDetectorConstruction(), + fNbOfCrystals(10), + fCrystal_log(nullptr), + fDetMat(nullptr), + fRegion(nullptr), + fVerbose(0), + fNLtot(40), + fNRtot(50), + fDLradl(0.5), + fDRradl(0.1) { - G4cout<<"ExGflashDetectorConstruction::Detector constructor"<FindOrBuildMaterial("G4_PbWO4"); fDetMat = pbWO4; - - //------------------------------ + + //------------------------------ // Calorimeter segments //------------------------------ - // Simplified `CMS-like` PbWO4 crystal calorimeter - - - // Simplified `CMS-like` PbWO4 crystal calorimeter + // Simplified `CMS-like` PbWO4 crystal calorimeter - // Calorimeter - G4double calo_xside = (fCrystalWidth*fNbOfCrystals); - G4double calo_yside = (fCrystalWidth*fNbOfCrystals); + // Simplified `CMS-like` PbWO4 crystal calorimeter + + // Calorimeter + G4double calo_xside = (fCrystalWidth * fNbOfCrystals); + G4double calo_yside = (fCrystalWidth * fNbOfCrystals); G4double calo_zside = fCrystalLength; - //The Experimental Hall - G4double experimentalHall_x=calo_xside * 4; - G4double experimentalHall_y=calo_yside * 4; - G4double experimentalHall_z=calo_zside * 4; - - G4VSolid* experimentalHall_box - = new G4Box("expHall_box", // World Volume - experimentalHall_x, // x size - experimentalHall_y, // y size - experimentalHall_z); // z size - - G4LogicalVolume* experimentalHall_log - = new G4LogicalVolume(experimentalHall_box, - air, - "expHall_log", - 0, //opt: fieldManager - 0, //opt: SensitiveDetector - 0); //opt: UserLimits - G4VPhysicalVolume* experimentalHall_phys - = new G4PVPlacement(0, - G4ThreeVector(), //at (0,0,0) - "expHall", - experimentalHall_log, - 0, - false, - 0); - - G4Box* calo_box= new G4Box("Calorimeter", // its name - calo_xside/2., // size - calo_yside/2., - calo_zside/2.); - G4LogicalVolume* calo_log - = new G4LogicalVolume(calo_box, // its solid - air, // its material - "calo_log", // its name - 0, // opt: fieldManager - 0, // opt: SensitiveDetector - 0); // opt: UserLimit - + // The Experimental Hall + G4double experimentalHall_x = calo_xside * 4; + G4double experimentalHall_y = calo_yside * 4; + G4double experimentalHall_z = calo_zside * 4; + + G4VSolid* experimentalHall_box = new G4Box("expHall_box", // World Volume + experimentalHall_x, // x size + experimentalHall_y, // y size + experimentalHall_z); // z size + + auto experimentalHall_log = + new G4LogicalVolume(experimentalHall_box, air, "expHall_log", + nullptr, // opt: fieldManager + nullptr, // opt: SensitiveDetector + nullptr); // opt: UserLimits + G4VPhysicalVolume* experimentalHall_phys = new G4PVPlacement(nullptr, + G4ThreeVector(), // at (0,0,0) + "expHall", experimentalHall_log, nullptr, false, 0); + + G4Box* calo_box = new G4Box("Calorimeter", // its name + calo_xside / 2., // size + calo_yside / 2., calo_zside / 2.); + auto calo_log = new G4LogicalVolume(calo_box, // its solid + air, // its material + "calo_log", // its name + nullptr, // opt: fieldManager + nullptr, // opt: SensitiveDetector + nullptr); // opt: UserLimit + G4double xpos = 0.0; G4double ypos = 0.0; - G4double zpos = calo_zside/2.;// face @ z= 0.0 + G4double zpos = calo_zside / 2.; // face @ z= 0.0 + + new G4PVPlacement(nullptr, G4ThreeVector(xpos, ypos, zpos), calo_log, + "calorimeter", experimentalHall_log, false, 1); - new G4PVPlacement(0, - G4ThreeVector(xpos, ypos, zpos), - calo_log, - "calorimeter", - experimentalHall_log, - false, - 1); - // Crystals - G4VSolid* crystal_box - = new G4Box("Crystal", // its name - fCrystalWidth/2, - fCrystalWidth/2, - fCrystalLength/2); - // size - fCrystal_log - = new G4LogicalVolume(crystal_box, // its solid - fDetMat, // its material - "Crystal_log"); // its name - - for (G4int i=0; iGetRadlen() - <<" X0" << G4endl; - - + << calo_yside / cm << " cm x " << calo_zside / cm << " cm" << G4endl; + G4cout << "They have width of " << fCrystalWidth / cm + << " cm and a length of " << fCrystalLength / cm + << " cm. The Material is " << fDetMat + << " Total: " << fCrystalLength / fDetMat->GetRadlen() << " X0" + << G4endl; + experimentalHall_log->SetVisAttributes(G4VisAttributes::GetInvisible()); - G4VisAttributes* caloVisAtt = new G4VisAttributes(G4Colour(1.0,1.0,1.0)); - G4VisAttributes* crystalVisAtt = new G4VisAttributes(G4Colour(1.0,1.0,0.0)); + auto caloVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 1.0)); + auto crystalVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 0.0)); calo_log->SetVisAttributes(caloVisAtt); fCrystal_log->SetVisAttributes(crystalVisAtt); @@ -230,8 +212,8 @@ G4VPhysicalVolume* ExGflashDetectorConstruction::Construct() fRegion = new G4Region("crystals"); calo_log->SetRegion(fRegion); fRegion->AddRootLogicalVolume(calo_log); - - return experimentalHall_phys; + + return experimentalHall_phys; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -242,22 +224,21 @@ void ExGflashDetectorConstruction::ConstructSDandField() G4SDManager* SDman = G4SDManager::GetSDMpointer(); - ExGflashSensitiveDetector* SD = - new ExGflashSensitiveDetector("Calorimeter",this); + auto SD = new ExGflashSensitiveDetector("Calorimeter", this); SDman->AddNewDetector(SD); - if (fCrystal_log) + if ( fCrystal_log != nullptr ) { fCrystal_log->SetSensitiveDetector(SD); - + } + // -- fast simulation models: // ********************************************** // * Initializing shower modell // *********************************************** G4cout << "\n--> Creating shower parameterization models" << G4endl; - fFastShowerModel = new GFlashShowerModel("fFastShowerModel", fRegion); - fParameterisation = - new GFlashHomoShowerParameterisation(fDetMat, - new ExGflashHomoShowerTuning()); + fFastShowerModel = new GFlashShowerModel("fFastShowerModel", fRegion); + fParameterisation = new GFlashHomoShowerParameterisation( + fDetMat, new ExGflashHomoShowerTuning()); fFastShowerModel->SetParameterisation(*fParameterisation); // Energy Cuts to kill particles: fParticleBounds = new GFlashParticleBounds(); @@ -265,22 +246,22 @@ void ExGflashDetectorConstruction::ConstructSDandField() // Makes the EnergieSpots fHitMaker = new GFlashHitMaker(); fFastShowerModel->SetHitMaker(*fHitMaker); - G4cout<<"end shower parameterization."<GetRadlen(); - } +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ExGflashDetectorConstruction::SetLBining(G4ThreeVector Value) { fNLtot = (G4int)Value(0); - if (fNLtot > kMaxBin) { - G4cout << "\n ---> warning from SetLBining: " - << fNLtot << " truncated to " << kMaxBin << G4endl; + if ( fNLtot > kMaxBin ) { + G4cout << "\n ---> warning from SetLBining: " << fNLtot << " truncated to " + << kMaxBin << G4endl; fNLtot = kMaxBin; - } + } fDLradl = Value(1); } @@ -289,11 +270,11 @@ void ExGflashDetectorConstruction::SetLBining(G4ThreeVector Value) void ExGflashDetectorConstruction::SetRBining(G4ThreeVector Value) { fNRtot = (G4int)Value(0); - if (fNRtot > kMaxBin) { - G4cout << "\n ---> warning from SetRBining: " - << fNRtot << " truncated to " << kMaxBin << G4endl; + if ( fNRtot > kMaxBin ) { + G4cout << "\n ---> warning from SetRBining: " << fNRtot << " truncated to " + << kMaxBin << G4endl; fNRtot = kMaxBin; - } + } fDRradl = Value(1); } @@ -305,10 +286,12 @@ void ExGflashDetectorConstruction::SetMaterial(G4String mat) G4Material* pttoMaterial = G4NistManager::Instance()->FindOrBuildMaterial(mat); - if(pttoMaterial && fDetMat != pttoMaterial) { + if ( pttoMaterial != nullptr && fDetMat != pttoMaterial ) { fDetMat = pttoMaterial; - if(fCrystal_log) { fCrystal_log->SetMaterial(fDetMat); } - if(fParameterisation) { + if ( fCrystal_log != nullptr ) { + fCrystal_log->SetMaterial(fDetMat); + } + if ( fParameterisation != nullptr ) { fParameterisation->SetMaterial(fDetMat); fParameterisation->PrintMaterial(fDetMat); // Get Rad Len and R molere ? @@ -318,5 +301,4 @@ void ExGflashDetectorConstruction::SetMaterial(G4String mat) } } - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashEventAction.cc b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashEventAction.cc index e8416e2050..53d64e03cd 100644 --- a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashEventAction.cc +++ b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashEventAction.cc @@ -27,143 +27,132 @@ /// \file ExGflashEventAction.cc /// \brief Implementation of the ExGflashEventAction class // -// Created by Joanna Weng 26.11.2004 - #include "ExGflashEventAction.hh" -#include "ExGflashHit.hh" -#include "ExGflashHistoManager.hh" #include "ExGflashDetectorConstruction.hh" +#include "ExGflashHistoManager.hh" +#include "ExGflashHit.hh" +#include "G4Event.hh" #include "G4EventManager.hh" #include "G4SDManager.hh" -#include "G4UImanager.hh" -#include "G4Event.hh" #include "G4SystemOfUnits.hh" -//std -#include +#include "G4UImanager.hh" +// std #include +#include #include -typedef std::vector MyVector; -//Gflash +using MyVector = std::vector; + +// Gflash using namespace std; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... ExGflashEventAction::ExGflashEventAction(ExGflashDetectorConstruction* det) - : G4UserEventAction(),fCalorimeterCollectionId(-1),fDet(det) -{ -} + : G4UserEventAction(), fCalorimeterCollectionId(-1), fDet(det) +{} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashEventAction::~ExGflashEventAction() -{ -} +ExGflashEventAction::~ExGflashEventAction() = default; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void ExGflashEventAction::BeginOfEventAction(const G4Event * /* evt */) -{ -} +void ExGflashEventAction::BeginOfEventAction(const G4Event* /* evt */) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void ExGflashEventAction::EndOfEventAction(const G4Event *evt) -{ +void ExGflashEventAction::EndOfEventAction(const G4Event* evt) +{ + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + G4String colNam; + fCalorimeterCollectionId = + SDman->GetCollectionID(colNam = "ExGflashCollection"); - G4SDManager * SDman = G4SDManager::GetSDMpointer(); - G4String colNam; - fCalorimeterCollectionId=SDman->GetCollectionID(colNam="ExGflashCollection"); + if ( fCalorimeterCollectionId < 0 ) { + return; + } - if (fCalorimeterCollectionId<0) return; - - G4HCofThisEvent * HCE = evt->GetHCofThisEvent(); - ExGflashHitsCollection* THC = 0; - G4double totE = 0; + G4HCofThisEvent* HCE = evt->GetHCofThisEvent(); + ExGflashHitsCollection* THC = nullptr; + G4double totE = 0; // Read out of the crysta ECAL - THC=(ExGflashHitsCollection *)(HCE->GetHC(fCalorimeterCollectionId)); + THC = (ExGflashHitsCollection*)(HCE->GetHC(fCalorimeterCollectionId)); - if (THC) - { - /// Hits in sensitive Detector - int n_hit = THC->entries(); - // G4cout<<" " << n_hit<< " hits are stored in ExGflashHitsCollection "<GetPrimaryVertex(); - //Computing (x,y,z) of vertex of initial particles - G4ThreeVector vtx=pvertex->GetPosition(); - G4PrimaryParticle* pparticle=pvertex->GetPrimary(); - // direction of the Shower - G4ThreeVector mom=pparticle->GetMomentumDirection(); + if ( THC != nullptr ) { + /// Hits in sensitive Detector + int n_hit = THC->entries(); + // G4cout<<" " << n_hit<< " hits are stored in ExGflashHitsCollection + // "<GetPrimaryVertex(); + // Computing (x,y,z) of vertex of initial particles + G4ThreeVector vtx = pvertex->GetPosition(); + G4PrimaryParticle* pparticle = pvertex->GetPrimary(); + // direction of the Shower + G4ThreeVector mom = pparticle->GetMomentumDirection(); - G4double Ekin=pparticle->GetKineticEnergy(); - G4double mass=pparticle->GetParticleDefinition()->GetPDGMass(); - G4double Etot = Ekin/MeV + mass/MeV; + G4double Ekin = pparticle->GetKineticEnergy(); + G4double mass = pparticle->GetParticleDefinition()->GetPDGMass(); + G4double Etot = Ekin / MeV + mass / MeV; - G4int nLbin = fDet->GetnLtot(); - G4int nRbin = fDet->GetnRtot(); - G4double dLradl = fDet->GetdLradl(); - G4double dRradl = fDet->GetdRradl(); + G4int nLbin = fDet->GetnLtot(); + G4int nRbin = fDet->GetnRtot(); + G4double dLradl = fDet->GetdLradl(); + G4double dRradl = fDet->GetdRradl(); - G4double SDRadl = fDet->GetSDRadLen(); // SD matrial - // init to to 0.0 - MyVector dEdL(nLbin,0.0); - MyVector dEdR(nRbin,0.0); + G4double SDRadl = fDet->GetSDRadLen(); // SD matrial + // init to to 0.0 + MyVector dEdL(nLbin, 0.0); + MyVector dEdR(nRbin, 0.0); - G4AnalysisManager* fAnalysisManager = G4AnalysisManager::Instance(); + G4AnalysisManager* fAnalysisManager = G4AnalysisManager::Instance(); - fAnalysisManager->FillH1(1,n_hit + 0.5); - /// For all Hits in sensitive detector - for (int i=0;iGetEdep(); - fAnalysisManager->FillH1(2,estep/MeV); - estep /= MeV; - - if (estep >0.0) - { - totE += estep; - - G4ThreeVector hitpos=(*THC)[i]->GetPos(); - // in shower coordinate system - // from shower start - G4ThreeVector l = hitpos - vtx; - //longitudinal profile - G4ThreeVector longitudinal = l.dot(mom) * mom; - // shower profiles (Radial) - G4ThreeVector radial = l - longitudinal; + fAnalysisManager->FillH1(1, n_hit + 0.5); + /// For all Hits in sensitive detector + for ( int i = 0; i < n_hit; i++ ) { + G4double estep = (*THC)[i]->GetEdep(); + fAnalysisManager->FillH1(2, estep / MeV); + estep /= MeV; - G4int SlideNb = G4int((longitudinal.mag()/SDRadl) / dLradl); - G4int RingNb = G4int((radial.mag()/SDRadl) / dRradl); + if ( estep > 0.0 ) { + totE += estep; - if ( SlideNb >=0 && SlideNb < nLbin) dEdL[SlideNb] += estep; - if ( RingNb >=0 && RingNb < nLbin)dEdR[RingNb] += estep; - } - } + G4ThreeVector hitpos = (*THC)[i]->GetPos(); + // in shower coordinate system + // from shower start + G4ThreeVector l = hitpos - vtx; + // longitudinal profile + G4ThreeVector longitudinal = l.dot(mom) * mom; + // shower profiles (Radial) + G4ThreeVector radial = l - longitudinal; - G4double Lnorm = 100. / dLradl / Etot; - G4double Lsum = 0.0; - for (int i=0;iFillH1(3,(i +0.5) * dLradl,dEdL[i] * Lnorm); - fAnalysisManager->FillP1(0,(i +0.5) * dLradl,dEdL[i] * Lnorm); - Lsum += dEdL[i]; - fAnalysisManager->FillP1(2,(i +0.5) * dLradl,Lsum * Lnorm); - } - G4double Rnorm = 100. / dRradl / Etot; - G4double Rsum = 0.0; - for (int i=0;iFillH1(4,(i +0.5) * dRradl,dEdR[i] * Rnorm); - fAnalysisManager->FillP1(1,(i +0.5) * dRradl,dEdR[i] * Rnorm); - Rsum += dEdR[i]; - fAnalysisManager->FillP1(3,(i +0.5) * dRradl,Rsum * Rnorm); - } - - fAnalysisManager->FillH1(0,totE/Etot * 100.); + G4int SlideNb = G4int((longitudinal.mag() / SDRadl) / dLradl); + G4int RingNb = G4int((radial.mag() / SDRadl) / dRradl); + if ( SlideNb >= 0 && SlideNb < nLbin ) dEdL[SlideNb] += estep; + if ( RingNb >= 0 && RingNb < nLbin ) dEdR[RingNb] += estep; + } } + + G4double Lnorm = 100. / dLradl / Etot; + G4double Lsum = 0.0; + for ( int i = 0; i < nLbin; i++ ) { // Slide + fAnalysisManager->FillP1(0, (i + 0.5) * dLradl, dEdL[i] * Lnorm); + Lsum += dEdL[i]; + fAnalysisManager->FillP1(2, (i + 0.5) * dLradl, Lsum * Lnorm); + } + G4double Rnorm = 100. / dRradl / Etot; + G4double Rsum = 0.0; + for ( int i = 0; i < nRbin; i++ ) { // Ring + fAnalysisManager->FillP1(1, (i + 0.5) * dRradl, dEdR[i] * Rnorm); + Rsum += dEdR[i]; + fAnalysisManager->FillP1(3, (i + 0.5) * dRradl, Rsum * Rnorm); + } + + fAnalysisManager->FillH1(0, totE / Etot * 100.); + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashHistoManager.cc b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashHistoManager.cc index 6aa95f3d1c..603eb2985f 100644 --- a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashHistoManager.cc +++ b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashHistoManager.cc @@ -45,61 +45,54 @@ ExGflashHistoManager::ExGflashHistoManager(ExGflashDetectorConstruction* myDet) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashHistoManager::~ExGflashHistoManager() -{ - delete G4AnalysisManager::Instance(); -} +ExGflashHistoManager::~ExGflashHistoManager() = default; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ExGflashHistoManager::Book() { - // Create or get analysis manager - // The choice of analysis technology is done via selection of a namespace - // in ExGflashHistoManager.hh G4AnalysisManager* fAnalysisManager = G4AnalysisManager::Instance(); + fAnalysisManager->SetDefaultFileType("root"); fAnalysisManager->SetFileName(fFileName); fAnalysisManager->SetVerboseLevel(1); - fAnalysisManager->SetActivation(true); // enable inactivation of histograms + fAnalysisManager->SetActivation(true); // enable inactivation of histograms // // Creating histograms // // const G4int kMaxHisto = 9; // const G4int kMaxProf = 2; - G4int nLbin = fDet->GetnLtot(); - G4int nRbin = fDet->GetnRtot(); + G4int nLbin = fDet->GetnLtot(); + G4int nRbin = fDet->GetnRtot(); G4double dLradl = fDet->GetdLradl(); G4double dRradl = fDet->GetdRradl(); - - fAnalysisManager->CreateH1( "h0","total energy deposit(percent of Einc)", - 100,95.,105.); + fAnalysisManager->CreateH1( + "h0", "total energy deposit(percent of Einc)", 100, 95., 105.); + + fAnalysisManager->CreateH1( + "h1", "The number of Hits per event", 200, 0., 4.0e5); + + fAnalysisManager->CreateH1("h2", "The energy of Hit (in MeV)", 200, 0., 10.); - fAnalysisManager->CreateH1( "h1","The number of Hits per event", - 200,0.,4.0e5); - - fAnalysisManager->CreateH1( "h2","The energy of Hit (in MeV)", - 200,0.,10.); - // fAnalysisManager->CreateH1( "h3","longit energy profile (% of E inc)", // nLbin,0.,nLbin*dLradl); - + // fAnalysisManager->CreateH1( "h4","radial energy profile (% of E inc)", // nRbin,0.,nRbin*dRradl); - fAnalysisManager->CreateP1( "p0","longit energy profile (% of E inc)", - nLbin,0.,nLbin*dLradl, 0., 2000.); - - fAnalysisManager->CreateP1( "p1","radial energy profile (% of E inc)", - nRbin,0.,nRbin*dRradl, 0., 2000.); - - fAnalysisManager->CreateP1( "p2","Comul longit energy profile (% of E inc)", - nLbin,0.,nLbin*dLradl, 0., 20000.); - - fAnalysisManager->CreateP1( "p3","Cuml radial energy profile (% of E inc)", - nRbin,0.,nRbin*dRradl, 0., 20000.); - - // Create all histograms as inactivated + fAnalysisManager->CreateP1("p0", "longit energy profile (% of E inc)", nLbin, + 0., nLbin * dLradl, 0., 2000.); + + fAnalysisManager->CreateP1("p1", "radial energy profile (% of E inc)", nRbin, + 0., nRbin * dRradl, 0., 2000.); + + fAnalysisManager->CreateP1("p2", "Comul longit energy profile (% of E inc)", + nLbin, 0., nLbin * dLradl, 0., 20000.); + + fAnalysisManager->CreateP1("p3", "Cuml radial energy profile (% of E inc)", + nRbin, 0., nRbin * dRradl, 0., 20000.); + + // Create all histograms as inactivated // for (G4int k=0; kSetH1Activation(k, false); // } diff --git a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashHit.cc b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashHit.cc index c3e77593bd..f213df2b9a 100644 --- a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashHit.cc +++ b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashHit.cc @@ -29,56 +29,49 @@ #include "ExGflashHit.hh" -#include "G4VVisManager.hh" #include "G4Circle.hh" #include "G4Colour.hh" -#include "G4VisAttributes.hh" #include "G4LogicalVolume.hh" #include "G4Transform3D.hh" +#include "G4VVisManager.hh" +#include "G4VisAttributes.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4ThreadLocal G4Allocator* ExGflashHitAllocator=0; +G4ThreadLocal G4Allocator* ExGflashHitAllocator = nullptr; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashHit::ExGflashHit() -: G4VHit() -{} +ExGflashHit::ExGflashHit() : G4VHit() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashHit::~ExGflashHit() -{} +ExGflashHit::~ExGflashHit() = default; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashHit::ExGflashHit(const ExGflashHit &right) -: G4VHit(right) +ExGflashHit::ExGflashHit(const ExGflashHit& right) : G4VHit(right) //@@@ ExGflashHit:Is it right with the init? { fEdep = right.fEdep; - fPos = right.fPos; + fPos = right.fPos; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -const ExGflashHit & ExGflashHit::operator=(const ExGflashHit &right) -{ - G4VHit::operator=(right); - fEdep = right.fEdep; - fPos = right.fPos; - return *this; -} +ExGflashHit& ExGflashHit::operator=(const ExGflashHit& right) = default; +// { +// G4VHit::operator=(right); +// fEdep = right.fEdep; +// fPos = right.fPos; +// return *this; +// } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4bool ExGflashHit::operator==(const ExGflashHit &right) const +G4bool ExGflashHit::operator==(const ExGflashHit& right) const { -// @@@@ return false; - if ((fPos==right.fPos) && (fEdep == right.fEdep)) return true; - else return false; - + return ((fEdep == right.fEdep) && (fPos == right.fPos)); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -86,12 +79,11 @@ G4bool ExGflashHit::operator==(const ExGflashHit &right) const void ExGflashHit::Draw() { G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); - if(pVVisManager) - { + if ( pVVisManager != nullptr ) { G4Circle circle(fPos); circle.SetScreenSize(0.04); circle.SetFillStyle(G4Circle::filled); - G4Colour colour(1.,0.,0.); + G4Colour colour(1., 0., 0.); G4VisAttributes attribs(colour); circle.SetVisAttributes(attribs); pVVisManager->Draw(circle); @@ -100,7 +92,6 @@ void ExGflashHit::Draw() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void ExGflashHit::Print() -{} +void ExGflashHit::Print() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashMessenger.cc b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashMessenger.cc index 58a20985e9..7ce60a8a21 100644 --- a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashMessenger.cc +++ b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashMessenger.cc @@ -33,55 +33,55 @@ #include "ExGflashMessenger.hh" #include "ExGflashDetectorConstruction.hh" -#include "G4UIdirectory.hh" -#include "G4UIcmdWithAString.hh" -#include "G4UIcmdWithAnInteger.hh" #include "G4UIcmdWith3Vector.hh" #include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithAnInteger.hh" #include "G4UIcmdWithoutParameter.hh" +#include "G4UIdirectory.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashMessenger::ExGflashMessenger(ExGflashDetectorConstruction * Det) -:G4UImessenger(),fDetector(Det) +ExGflashMessenger::ExGflashMessenger(ExGflashDetectorConstruction* Det) + : G4UImessenger(), fDetector(Det) { fExGflashDir = new G4UIdirectory("/exgflash/"); fExGflashDir->SetGuidance(" Gflash example commands."); - - fVerbose = new G4UIcmdWithAnInteger("/exgflash/verbose",this); + + fVerbose = new G4UIcmdWithAnInteger("/exgflash/verbose", this); fVerbose->SetGuidance("set exglash verbosity"); fVerbose->SetGuidance("0- silent, 1 - on exit, 2 - run , 3 - event"); - fVerbose->SetParameterName("ver",false); + fVerbose->SetParameterName("ver", false); fVerbose->SetRange("ver >= 0"); - fVerbose->AvailableForStates(G4State_PreInit,G4State_Idle); + fVerbose->AvailableForStates(G4State_PreInit, G4State_Idle); fVerbose->SetToBeBroadcasted(false); - + fDetDir = new G4UIdirectory("/exgflash/det/"); fDetDir->SetGuidance("detector construction commands"); - fMaterCmd = new G4UIcmdWithAString("/exgflash/det/setMat",this); + fMaterCmd = new G4UIcmdWithAString("/exgflash/det/setMat", this); fMaterCmd->SetGuidance("Select Material."); - fMaterCmd->SetParameterName("material",false); - fMaterCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + fMaterCmd->SetParameterName("material", false); + fMaterCmd->AvailableForStates(G4State_PreInit, G4State_Idle); fMaterCmd->SetToBeBroadcasted(false); - fLBinCmd = new G4UIcmdWith3Vector("/exgflash/det/setLbin",this); + fLBinCmd = new G4UIcmdWith3Vector("/exgflash/det/setLbin", this); fLBinCmd->SetGuidance("set longitudinal bining"); fLBinCmd->SetGuidance("nb of bins; bin thickness (in radl)"); // must have omitable==true we use 2 values only - fLBinCmd->SetParameterName("nLtot","dLradl"," ",true); + fLBinCmd->SetParameterName("nLtot", "dLradl", " ", true); fLBinCmd->SetRange("nLtot>=1 && dLradl>0"); - fLBinCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + fLBinCmd->AvailableForStates(G4State_PreInit, G4State_Idle); fLBinCmd->SetToBeBroadcasted(false); - fRBinCmd = new G4UIcmdWith3Vector("/exgflash/det/setRbin",this); + fRBinCmd = new G4UIcmdWith3Vector("/exgflash/det/setRbin", this); fRBinCmd->SetGuidance("set radial bining"); fRBinCmd->SetGuidance("nb of bins; bin thickness (in radl)"); - fRBinCmd->SetParameterName("nRtot","dRradl"," ",true); + fRBinCmd->SetParameterName("nRtot", "dRradl", " ", true); fRBinCmd->SetRange("nRtot>=1 && dRradl>0"); - fRBinCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - fRBinCmd->SetToBeBroadcasted(false); - } + fRBinCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fRBinCmd->SetToBeBroadcasted(false); +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -98,18 +98,22 @@ ExGflashMessenger::~ExGflashMessenger() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ExGflashMessenger::SetNewValue(G4UIcommand* command, G4String newValue) -{ - if( command == fMaterCmd ) - { fDetector->SetMaterial(newValue);} - - if( command == fVerbose ) - { fDetector->SetVerbose(fVerbose->GetNewIntValue(newValue));} - - if( command == fLBinCmd ) - { fDetector->SetLBining(fLBinCmd->GetNew3VectorValue(newValue));} - - if( command == fRBinCmd ) - { fDetector->SetRBining(fRBinCmd->GetNew3VectorValue(newValue));} +{ + if ( command == fMaterCmd ) { + fDetector->SetMaterial(newValue); + } + + if ( command == fVerbose ) { + fDetector->SetVerbose(fVerbose->GetNewIntValue(newValue)); + } + + if ( command == fLBinCmd ) { + fDetector->SetLBining(fLBinCmd->GetNew3VectorValue(newValue)); + } + + if ( command == fRBinCmd ) { + fDetector->SetRBining(fRBinCmd->GetNew3VectorValue(newValue)); + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashPrimaryGeneratorAction.cc b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashPrimaryGeneratorAction.cc index 3c9b3865ad..e1ae85d95c 100644 --- a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashPrimaryGeneratorAction.cc +++ b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashPrimaryGeneratorAction.cc @@ -28,15 +28,15 @@ // #include "ExGflashPrimaryGeneratorAction.hh" -#include "G4GeneralParticleSource.hh" #include "G4Event.hh" +#include "G4GeneralParticleSource.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... ExGflashPrimaryGeneratorAction::ExGflashPrimaryGeneratorAction() - : G4VUserPrimaryGeneratorAction(), fParticleGun(0) + : G4VUserPrimaryGeneratorAction(), fParticleGun(nullptr) { - fParticleGun=new G4GeneralParticleSource; + fParticleGun = new G4GeneralParticleSource; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -49,7 +49,7 @@ ExGflashPrimaryGeneratorAction::~ExGflashPrimaryGeneratorAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ExGflashPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) -{ +{ fParticleGun->GeneratePrimaryVertex(anEvent); } diff --git a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashRunAction.cc b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashRunAction.cc index fba3264ecf..8a7d82d8f9 100644 --- a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashRunAction.cc +++ b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashRunAction.cc @@ -33,7 +33,6 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... ExGflashRunAction::ExGflashRunAction(ExGflashDetectorConstruction* det) - // : G4UserRunAction(), fRunID(0), fDetector(det) : G4UserRunAction(), fDetector(det) { fHistoManager = new ExGflashHistoManager(fDetector); @@ -49,42 +48,46 @@ ExGflashRunAction::~ExGflashRunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ExGflashRunAction::BeginOfRunAction(const G4Run* aRun) -{ +{ G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl; - //histograms file + // histograms file G4AnalysisManager* analysis = G4AnalysisManager::Instance(); - if (analysis->IsActive()) analysis->OpenFile(); - - if (IsMaster()) fRunTimer.Start(); + if ( analysis->IsActive() ) { + analysis->OpenFile(); + } + + if ( IsMaster() ) { + fRunTimer.Start(); + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ExGflashRunAction::EndOfRunAction(const G4Run* aRun) { - if (IsMaster()) { + if ( IsMaster() ) { // For MT we need Timer Merge fRunTimer.Stop(); G4cout << G4endl; G4cout << "******************************************"; G4cout << G4endl; - G4cout << "Run Real Elapsed Time is: "<< fRunTimer.GetRealElapsed(); + G4cout << "Run Real Elapsed Time is: " << fRunTimer.GetRealElapsed(); G4cout << G4endl; G4cout << "Run System Elapsed Time: " << fRunTimer.GetSystemElapsed(); G4cout << G4endl; G4cout << "Run GetUserElapsed Time: " << fRunTimer.GetUserElapsed(); G4cout << G4endl; - G4cout << "******************************************"<< G4endl; - + G4cout << "******************************************" << G4endl; + G4cout << "number of event = " << aRun->GetNumberOfEvent() << G4endl; } - //save histograms - G4AnalysisManager* analysis = G4AnalysisManager::Instance(); - if (analysis->IsActive()) { - analysis->Write(); + // save histograms + G4AnalysisManager* analysis = G4AnalysisManager::Instance(); + if ( analysis->IsActive() ) { + analysis->Write(); analysis->CloseFile(); - } + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashSensitiveDetector.cc b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashSensitiveDetector.cc index 843653f8dd..4efedf5486 100644 --- a/examples/extended/parameterisations/gflash/gflasha/src/ExGflashSensitiveDetector.cc +++ b/examples/extended/parameterisations/gflash/gflasha/src/ExGflashSensitiveDetector.cc @@ -28,78 +28,81 @@ // // Created by Joanna Weng 26.11.2004 #include "ExGflashSensitiveDetector.hh" +#include "ExGflashDetectorConstruction.hh" #include "ExGflashHit.hh" #include "G4GFlashSpot.hh" -#include "ExGflashDetectorConstruction.hh" -#include "G4VPhysicalVolume.hh" #include "G4Step.hh" -#include "G4VTouchable.hh" #include "G4TouchableHistory.hh" +#include "G4VPhysicalVolume.hh" +#include "G4VTouchable.hh" -//WARNING : You have to use also G4VGFlashSensitiveDetector() as base class +// WARNING : You have to use also G4VGFlashSensitiveDetector() as base class //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashSensitiveDetector::ExGflashSensitiveDetector(G4String name, - ExGflashDetectorConstruction* /* det */) - // : G4VSensitiveDetector(name), G4VGFlashSensitiveDetector(), fDetector(det), fHCID(-1) - : G4VSensitiveDetector(name), G4VGFlashSensitiveDetector(), fHCID(-1) +ExGflashSensitiveDetector::ExGflashSensitiveDetector( + G4String name, ExGflashDetectorConstruction* /* det */) + : G4VSensitiveDetector(name), G4VGFlashSensitiveDetector(), fHCID(-1) { - G4String caloname="ExGflashCollection"; + G4String caloname = "ExGflashCollection"; collectionName.insert(caloname); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -ExGflashSensitiveDetector::~ExGflashSensitiveDetector() -{} +ExGflashSensitiveDetector::~ExGflashSensitiveDetector() = default; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ExGflashSensitiveDetector::Initialize(G4HCofThisEvent* HCE) { - if(fHCID<0){ fHCID = GetCollectionID(0); } - fCaloHitsCollection=new - ExGflashHitsCollection(SensitiveDetectorName,collectionName[0]); // first collection - HCE->AddHitsCollection( fHCID, fCaloHitsCollection ); + if ( fHCID < 0 ) { + fHCID = GetCollectionID(0); + } + fCaloHitsCollection = new ExGflashHitsCollection( + SensitiveDetectorName, collectionName[0]); // first collection + HCE->AddHitsCollection(fHCID, fCaloHitsCollection); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void ExGflashSensitiveDetector::EndOfEvent(G4HCofThisEvent*) -{} +void ExGflashSensitiveDetector::EndOfEvent(G4HCofThisEvent*) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4bool ExGflashSensitiveDetector::ProcessHits(G4Step* aStep,G4TouchableHistory* /* ROhist */) +G4bool ExGflashSensitiveDetector::ProcessHits( + G4Step* aStep, G4TouchableHistory* /* ROhist */) { - G4double e=aStep->GetTotalEnergyDeposit(); - if(e<=0.)return false; - - ExGflashHit* caloHit=new ExGflashHit(); + G4double e = aStep->GetTotalEnergyDeposit(); + if ( e <= 0. ) return false; + + auto caloHit = new ExGflashHit(); caloHit->SetEdep(e); caloHit->SetPos(aStep->GetPreStepPoint()->GetPosition()); fCaloHitsCollection->insert(caloHit); - + return true; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Separate GFLASH interface -G4bool ExGflashSensitiveDetector::ProcessHits(G4GFlashSpot*aSpot ,G4TouchableHistory* /* ROhist */) -{ //cout<<"This is ProcessHits GFLASH"<GetEnergySpot()->GetEnergy(); - if(e<=0.)return false; - - // G4VPhysicalVolume* pCurrentVolume = aSpot->GetTouchableHandle()->GetVolume(); - - ExGflashHit* caloHit=new ExGflashHit(); +G4bool ExGflashSensitiveDetector::ProcessHits( + G4GFlashSpot* aSpot, G4TouchableHistory* /* ROhist */) +{ + // cout<<"This is ProcessHits GFLASH"<GetEnergySpot()->GetEnergy(); + if ( e <= 0. ) return false; + + // G4VPhysicalVolume* pCurrentVolume = + // aSpot->GetTouchableHandle()->GetVolume(); + + auto caloHit = new ExGflashHit(); caloHit->SetEdep(e); caloHit->SetPos(aSpot->GetEnergySpot()->GetPosition()); fCaloHitsCollection->insert(caloHit); - // if (ROhist){;} - + // if (ROhist){;} + return true; } diff --git a/examples/extended/parameterisations/gflash/gflasha/test.mac b/examples/extended/parameterisations/gflash/gflasha/test.mac index f28ddbabe5..bc1b7e452b 100644 --- a/examples/extended/parameterisations/gflash/gflasha/test.mac +++ b/examples/extended/parameterisations/gflash/gflasha/test.mac @@ -11,7 +11,7 @@ /gps/energy 50 GeV /gps/direction 0. 0. 1.0 -# Paramatrisation on +# Paramatrisation on /GFlash/flag 1 @@ -22,4 +22,11 @@ #/vis/scene/endOfEventAction accumulate /tracking/verbose 0 -/run/beamOn 10 +/run/beamOn 100 + +# Paramatrisation off +/GFlash/flag 0 +/analysis/setFileName gflash00 + + +/run/beamOn 100 diff --git a/examples/extended/parameterisations/gflash/gflasha/vis.mac b/examples/extended/parameterisations/gflash/gflasha/vis.mac index fd2f200b1c..b7903e35a0 100644 --- a/examples/extended/parameterisations/gflash/gflasha/vis.mac +++ b/examples/extended/parameterisations/gflash/gflasha/vis.mac @@ -10,7 +10,6 @@ # # Use this open statement to create an OpenGL view: /vis/open OGL 600x600-0+0 -/gui/addIcon Exit user_icon exit power-off.png # # Use this open statement to create a .prim file suitable for # viewing in DAWN: diff --git a/examples/extended/persistency/.README.txt b/examples/extended/persistency/.README.txt deleted file mode 100644 index 51287c1537..0000000000 --- a/examples/extended/persistency/.README.txt +++ /dev/null @@ -1,17 +0,0 @@ - -///\file "persistency/.README.txt" -///\brief Examples persistency README page - -/*! \page Examples_persistency Category "persistency" - -This directory contains a set of persistency examples. - - - \link ExampleP01 P01 \endlink Root I/O example for storing and retrieving calorimeter hits. - - \link ExampleP02 P02 \endlink Root I/O example for storing and reading geometry objects. - - \link ExampleP03 P03 \endlink Example of detector geometry persistency in ASCII text format. - - - \link Examples_gdml gdml \endlink Set of examples showing usage of the GDML plugin module in Geant4. - -See the README page inside each example for more detail. - -*/ diff --git a/examples/extended/persistency/CMakeLists.txt b/examples/extended/persistency/CMakeLists.txt index 1ea711ecc9..5c8ad4ea43 100644 --- a/examples/extended/persistency/CMakeLists.txt +++ b/examples/extended/persistency/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding all persistency examples subdirectories explicitly -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) find_package(Geant4) include(${Geant4_USE_FILE}) diff --git a/examples/extended/persistency/P01/.README.txt b/examples/extended/persistency/P01/.README.txt deleted file mode 100644 index 2a3c832bb7..0000000000 --- a/examples/extended/persistency/P01/.README.txt +++ /dev/null @@ -1,83 +0,0 @@ - -///\file "persistency/P01/.README.txt" -///\brief Example P01 README page - -/*! \page ExampleP01 Example P01 - - -\section P01_s1 General description - -This example shows how to store produced hits in a file using -the 'reflection' technique for persistency provided by the Reflex tool -included in ROOT. The Reflex tool allows to create a dictionary -for the hit class, making then possible to save hit objects in a .root -file. The general simulation setup (geometry, physics list, user -actions, etc...) is taken from ExampleN02. - -The provided makefile produces two executables: 'exampleP01' and -'readHits'. The first one is the actual Geant4 simulation application -with hits persistency. The second one, is just a simple 'reader' for -the produced .root file (you need to specify the name of the .root -file as argument). - - -\section P01_s2 Building and running the example - -This examples requires the ROOT toolkit of version 6 to be installed. The -provided CMake file checks for the existence of the package and its version. -Once the CMake configuration has been succesfully done, the two executables -for this example (exampleP01, readHits) should be built using make -(in your CMake build directory): -\verbatim -make -\endverbatim - -When the example is run (using the provided run.mac macro file) ten -events are generated and the produced hits will be stored in -the hits.root file. In addition, the hits will be printed out on the -screen so one can then compare them with the 'reader' output. - -In order to read the persistified hits, a small 'reader' application -has been implemented. It can be run in the following way: - -\verbatim -/readHits hits.root -\endverbatim - -where the argument is the name of the file to be read. All the hits -saved in that file will be then read and printed on the screen. - -In addition to that the readHits.C ROOT macro file is provides, which -illustrates how one can read the hits file directly from the ROOT -prompt. - -\section P01_s3 Remark on dictionary generation - -The dictionary is generated by ${ROOTSYS}/bin/genreflex -tool. The header file including headers for all the classes we want to -generate the dictionary for should be given as argument. Additionally, -a so called selection file (xml) should be provided (with -s flag) to -the genreflex tool (see the GNUmakefile). The role of this file is to -specify which classes we want to generate the dictionary for. The -selection file for our dictionary is in xml/ directory. Please refer -to genreflex manual for more details concerning the usage of that -tool. - -Concerning generating dictionary for the Geant4 objects, there are -also two technical remarks that need to be made here. -The Reflex tool requires all the templated classes to be -explicitely used somewhere in the included header files in order for -the generation of the dictionary to be possible. For those templated -classes for which it is not the case, the problem can be very easily -solved by instaciating them in the headerfile which is given to -genreflex (see includes/ExP01Classes.hh) as argument. -The second remark is that there is an unfortunate clash of names as -far as G4String class is concerned. The header of G4String class -defines __G4String which happens to be the name of a variable used -within the generated dictionary code. The solution for that is to do -\verbatim -#undef __G4String -\endverbatim -in include/ExP01Classes.hh file. - -*/ diff --git a/examples/extended/persistency/P01/CMakeLists.txt b/examples/extended/persistency/P01/CMakeLists.txt index c70f1536b3..9f5d1bf43c 100644 --- a/examples/extended/persistency/P01/CMakeLists.txt +++ b/examples/extended/persistency/P01/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(P01) #---------------------------------------------------------------------------- diff --git a/examples/extended/persistency/P01/README b/examples/extended/persistency/P01/README deleted file mode 100644 index f1d52ea0a2..0000000000 --- a/examples/extended/persistency/P01/README +++ /dev/null @@ -1,82 +0,0 @@ - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - ExampleP01 - ---------- - -General description -------------------- - -This example shows how to store produced hits in a file using -the 'reflection' technique for persistency provided by the Reflex tool -included in ROOT. The Reflex tool allows to create a dictionary -for the hit class, making then possible to save hit objects in a .root -file. The general simulation setup (geometry, physics list, user -actions, etc...) is taken from ExampleN02. - -The provided makefile produces two executables: 'exampleP01' and -'readHits'. The first one is the actual Geant4 simulation application -with hits persistency. The second one, is just a simple 'reader' for -the produced .root file (you need to specify the name of the .root -file as argument). - - -Building and running the example --------------------------------- - -This examples requires the ROOT toolkit of version 6 to be installed. The -provided CMake file checks for the existence of the package and its version. -Once the CMake configuration has been succesfully done, the two executables -for this example (exampleP01, readHits) should be built using make -(in your CMake build directory): - - make - -When the example is run (using the provided run.mac macro file) ten -events are generated and the produced hits will be stored in -the hits.root file. In addition, the hits will be printed out on the -screen so one can then compare them with the 'reader' output. - -In order to read the persistified hits, a small 'reader' application -has been implemented. It can be run in the following way: - -/readHits hits.root - -where the argument is the name of the file to be read. All the hits -saved in that file will be then read and printed on the screen. - -In addition to that the readHits.C ROOT macro file is provides, which -illustrates how one can read the hits file directly from the ROOT -prompt. - - -Remark on dictionary generation -------------------------------- - -The dictionary is generated by ${ROOTSYS}/bin/genreflex -tool. The header file including headers for all the classes we want to -generate the dictionary for should be given as argument. Additionally, -a so called selection file (xml) should be provided (with -s flag) to -the genreflex tool (see the GNUmakefile). The role of this file is to -specify which classes we want to generate the dictionary for. The -selection file for our dictionary is in xml/ directory. Please refer -to genreflex manual for more details concerning the usage of that -tool. - -Concerning generating dictionary for the Geant4 objects, there are -also two technical remarks that need to be made here. -The Reflex tool requires all the templated classes to be -explicitely used somewhere in the included header files in order for -the generation of the dictionary to be possible. For those templated -classes for which it is not the case, the problem can be very easily -solved by instaciating them in the headerfile which is given to -genreflex (see includes/ExP01Classes.hh) as argument. -The second remark is that there is an unfortunate clash of names as -far as G4String class is concerned. The header of G4String class -defines __G4String which happens to be the name of a variable used -within the generated dictionary code. The solution for that is to do -#undef __G4String in include/ExP01Classes.hh file. - - diff --git a/examples/extended/persistency/P01/p01-read.out b/examples/extended/persistency/P01/p01-read.out index 1e244f49be..0d45006450 100644 --- a/examples/extended/persistency/P01/p01-read.out +++ b/examples/extended/persistency/P01/p01-read.out @@ -4,378 +4,337 @@ Collection name='THashList', class='THashList', size=4 TKey Name = Event_3, Title = object title, Cycle = 1 TKey Name = Event_4, Title = object title, Cycle = 1 Collection: Event_1 -Number of hits: 51 - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00323676 position[mm]: (-12.2171,2.65375,-1584.75) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0038909 position[mm]: (-12.3594,2.68522,-1575.53) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00864322 position[mm]: (-12.8692,2.79827,-1542.62) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0134881 position[mm]: (-13.2859,2.89309,-1515.51) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0197991 position[mm]: (-14.0809,3.0804,-1463.05) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0206028 position[mm]: (-15.0432,3.30675,-1400) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0253753 position[mm]: (-24.6327,5.52999,-760.682) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00899952 position[mm]: (-25.1756,5.66199,-724.49) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0112183 position[mm]: (-25.5363,5.74813,-700.523) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0427645 position[mm]: (-27.0442,6.1042,-600) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0362652 position[mm]: (-37.4938,8.4343,96.0955) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0312709 position[mm]: (-38.9219,8.74903,188.69) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00518782 position[mm]: (-39.0421,8.77266,196.368) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00345525 position[mm]: (-39.0991,8.78411,200) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0191644 position[mm]: (-49.4518,10.8657,858.246) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00666628 position[mm]: (-49.8203,10.945,881.36) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0130183 position[mm]: (-50.4094,11.0708,918.396) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0245426 position[mm]: (-51.4414,11.2973,982.916) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00480269 position[mm]: (-51.7073,11.3618,1000) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 8.45805e-05 position[mm]: (-61.0811,13.6443,1600.71) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0533965 position[mm]: (-62.9673,14.1194,1722.03) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0029426 position[mm]: (-63.069,14.1454,1728.7) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0365001 position[mm]: (-64.1576,14.4121,1800) - trackID: 62 chamberNb: 4 energy deposit[MeV]: 0.0108842 position[mm]: (-62.9544,14.3347,1728.73) - trackID: 62 chamberNb: 4 energy deposit[MeV]: 0.00352377 position[mm]: (-62.934,14.3189,1728.73) - trackID: 61 chamberNb: 4 energy deposit[MeV]: 0.0018583 position[mm]: (-62.9665,14.1304,1722.03) - trackID: 60 chamberNb: 4 energy deposit[MeV]: 0.00173404 position[mm]: (-61.0909,13.6472,1600.71) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.00367348 position[mm]: (-51.7048,11.3079,982.946) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.00546052 position[mm]: (-51.5667,11.307,982.943) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.00306028 position[mm]: (-51.5749,11.2932,982.928) - trackID: 75 chamberNb: 3 energy deposit[MeV]: 0.00218375 position[mm]: (-51.5791,11.3124,982.945) - trackID: 74 chamberNb: 3 energy deposit[MeV]: 0.0017388 position[mm]: (-51.7046,11.3013,982.954) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0019443 position[mm]: (-50.3978,11.0724,918.397) - trackID: 52 chamberNb: 3 energy deposit[MeV]: 0.00566719 position[mm]: (-49.6412,10.9687,881.384) - trackID: 52 chamberNb: 3 energy deposit[MeV]: 0.00505387 position[mm]: (-49.6043,10.9884,881.4) - trackID: 76 chamberNb: 3 energy deposit[MeV]: 0.00198243 position[mm]: (-49.6403,10.9603,881.392) - trackID: 51 chamberNb: 3 energy deposit[MeV]: 0.00435147 position[mm]: (-49.4178,10.8763,858.248) - trackID: 44 chamberNb: 2 energy deposit[MeV]: 0.00822585 position[mm]: (-39.2505,8.64126,196.397) - trackID: 44 chamberNb: 2 energy deposit[MeV]: 0.00719955 position[mm]: (-39.2481,8.6568,196.323) - trackID: 43 chamberNb: 2 energy deposit[MeV]: 0.0046306 position[mm]: (-38.9585,8.73532,188.692) - trackID: 42 chamberNb: 2 energy deposit[MeV]: 0.00234206 position[mm]: (-37.4842,8.42276,96.0964) - trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.00226796 position[mm]: (-25.5502,5.75197,-700.522) - trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.00145983 position[mm]: (-25.1748,5.67032,-724.49) - trackID: 27 chamberNb: 1 energy deposit[MeV]: 0.00220391 position[mm]: (-24.6307,5.51632,-760.682) - trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.00243725 position[mm]: (-14.0868,3.06556,-1463.05) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.00951089 position[mm]: (-13.7858,2.53471,-1515.41) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.00791861 position[mm]: (-14.0838,2.52608,-1515.32) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.0100615 position[mm]: (-13.963,2.4954,-1515.33) - trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.00356597 position[mm]: (-12.8603,2.82367,-1542.62) - trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.00139258 position[mm]: (-12.3662,2.68926,-1575.53) - trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.00586167 position[mm]: (-12.2041,2.5999,-1584.75) +Number of hits: 91 + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0174322 position[mm]: (-9.14682,-19.2489,-1550.14) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0155065 position[mm]: (-9.46539,-19.9341,-1518.68) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.015751 position[mm]: (-9.81347,-20.6946,-1483.7) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0123671 position[mm]: (-10.0968,-21.3109,-1455.12) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0107315 position[mm]: (-10.5006,-22.1714,-1415.25) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00539197 position[mm]: (-10.656,-22.4993,-1400) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00569426 position[mm]: (-16.9025,-35.7006,-784.421) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00135735 position[mm]: (-16.9301,-35.7584,-781.707) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0251551 position[mm]: (-17.4041,-36.7434,-735.493) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 1.59686e-05 position[mm]: (-17.4048,-36.7449,-735.421) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00900634 position[mm]: (-17.8863,-37.7677,-687.855) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0252504 position[mm]: (-18.7733,-39.6625,-600.486) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.000388912 position[mm]: (-18.7782,-39.673,-600) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.000988652 position[mm]: (-24.7485,-52.6789,3.56656) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0246546 position[mm]: (-25.3722,-54.05,66.9326) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0117664 position[mm]: (-25.6213,-54.5851,91.5337) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.000569946 position[mm]: (-25.6495,-54.6473,94.3988) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00422072 position[mm]: (-25.752,-54.8735,104.827) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00676587 position[mm]: (-25.9318,-55.2701,123.175) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0149988 position[mm]: (-26.2719,-56.0195,157.882) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00110361 position[mm]: (-26.3078,-56.098,161.537) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00933243 position[mm]: (-26.5519,-56.6356,186.591) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00207627 position[mm]: (-26.6817,-56.9254,200) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00649033 position[mm]: (-32.8819,-70.4943,831.383) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0529681 position[mm]: (-33.8054,-72.4726,923.363) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0110988 position[mm]: (-34.1733,-73.2559,959.385) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0181588 position[mm]: (-34.5919,-74.1466,1000) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0324686 position[mm]: (-41.6181,-88.7878,1677.63) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00165988 position[mm]: (-41.7127,-88.9854,1686.67) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0261717 position[mm]: (-42.5874,-90.7914,1769.43) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00869284 position[mm]: (-42.917,-91.4598,1800) + trackID: 61 chamberNb: 4 energy deposit[MeV]: 0.00184327 position[mm]: (-42.6358,-90.7928,1769.43) + trackID: 61 chamberNb: 4 energy deposit[MeV]: 0.00217379 position[mm]: (-42.6294,-90.7901,1769.44) + trackID: 84 chamberNb: 4 energy deposit[MeV]: 0.00135947 position[mm]: (-42.6335,-90.786,1769.43) + trackID: 60 chamberNb: 4 energy deposit[MeV]: 0.002422 position[mm]: (-41.6982,-88.9792,1686.67) + trackID: 59 chamberNb: 4 energy deposit[MeV]: 0.010049 position[mm]: (-41.5073,-88.8443,1677.64) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00712849 position[mm]: (-35.1188,-71.6156,959.872) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.000675313 position[mm]: (-35.0436,-71.4274,959.313) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00345221 position[mm]: (-34.5198,-70.8618,958.294) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00954478 position[mm]: (-35.4611,-71.2572,957.976) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00430171 position[mm]: (-35.6422,-71.6754,957.485) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00475762 position[mm]: (-35.69,-71.3641,957.148) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.000332479 position[mm]: (-35.7611,-71.284,957.221) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00171345 position[mm]: (-35.8636,-71.1433,957.211) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00111146 position[mm]: (-35.7739,-71.1812,957.173) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00685595 position[mm]: (-35.8361,-71.1985,957.2) + trackID: 93 chamberNb: 3 energy deposit[MeV]: 0.00150232 position[mm]: (-35.7756,-71.1858,957.166) + trackID: 92 chamberNb: 3 energy deposit[MeV]: 0.0016616 position[mm]: (-35.8631,-71.1359,957.205) + trackID: 91 chamberNb: 3 energy deposit[MeV]: 0.00308713 position[mm]: (-35.7452,-71.2732,957.21) + trackID: 90 chamberNb: 3 energy deposit[MeV]: 0.00098947 position[mm]: (-35.745,-71.1692,957.219) + trackID: 94 chamberNb: 3 energy deposit[MeV]: 0.00110158 position[mm]: (-35.7505,-71.1673,957.219) + trackID: 89 chamberNb: 3 energy deposit[MeV]: 0.00173297 position[mm]: (-35.6457,-71.6686,957.491) + trackID: 88 chamberNb: 3 energy deposit[MeV]: 0.00454864 position[mm]: (-34.5289,-70.8284,958.277) + trackID: 87 chamberNb: 3 energy deposit[MeV]: 0.00179271 position[mm]: (-35.0371,-71.4219,959.32) + trackID: 47 chamberNb: 3 energy deposit[MeV]: 0.00158733 position[mm]: (-33.8069,-72.4818,923.364) + trackID: 46 chamberNb: 3 energy deposit[MeV]: 0.00749283 position[mm]: (-32.9284,-70.5587,831.388) + trackID: 43 chamberNb: 2 energy deposit[MeV]: 0.00378073 position[mm]: (-26.5273,-56.6513,186.593) + trackID: 42 chamberNb: 2 energy deposit[MeV]: 0.00536616 position[mm]: (-26.3262,-56.1432,161.54) + trackID: 41 chamberNb: 2 energy deposit[MeV]: 0.00232902 position[mm]: (-26.257,-56.0192,157.882) + trackID: 40 chamberNb: 2 energy deposit[MeV]: 0.00856534 position[mm]: (-25.971,-55.0955,123.199) + trackID: 40 chamberNb: 2 energy deposit[MeV]: 0.00404904 position[mm]: (-26.0028,-55.0965,123.194) + trackID: 39 chamberNb: 2 energy deposit[MeV]: 0.00218453 position[mm]: (-25.7657,-54.8732,104.827) + trackID: 38 chamberNb: 2 energy deposit[MeV]: 0.00223164 position[mm]: (-25.6607,-54.6388,94.3996) + trackID: 37 chamberNb: 2 energy deposit[MeV]: 0.00168113 position[mm]: (-25.6173,-54.5761,91.5344) + trackID: 36 chamberNb: 2 energy deposit[MeV]: 0.0012167 position[mm]: (-25.3729,-54.0435,66.933) + trackID: 35 chamberNb: 2 energy deposit[MeV]: 0.0030045 position[mm]: (-24.733,-52.664,3.56823) + trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.001501 position[mm]: (-18.776,-39.6543,-600.485) + trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.00415213 position[mm]: (-18.041,-37.5647,-687.819) + trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.0102727 position[mm]: (-18.1585,-37.5477,-687.767) + trackID: 96 chamberNb: 1 energy deposit[MeV]: 0.00137343 position[mm]: (-18.0427,-37.5594,-687.824) + trackID: 27 chamberNb: 1 energy deposit[MeV]: 0.00192405 position[mm]: (-17.4121,-36.7538,-735.421) + trackID: 26 chamberNb: 1 energy deposit[MeV]: 0.00181874 position[mm]: (-17.3959,-36.7363,-735.492) + trackID: 25 chamberNb: 1 energy deposit[MeV]: 0.00337591 position[mm]: (-16.9061,-35.7653,-781.706) + trackID: 24 chamberNb: 1 energy deposit[MeV]: 0.000527922 position[mm]: (-16.8746,-35.6838,-784.418) + trackID: 24 chamberNb: 1 energy deposit[MeV]: 0.0030086 position[mm]: (-16.87,-35.6952,-784.435) + trackID: 97 chamberNb: 1 energy deposit[MeV]: 0.00143251 position[mm]: (-16.8667,-35.682,-784.417) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0100418 position[mm]: (-9.12229,-22.791,-1414.91) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.00684213 position[mm]: (-8.62199,-21.915,-1414.55) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.00530348 position[mm]: (-8.51747,-22.2705,-1413.91) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.00480208 position[mm]: (-8.6712,-22.5163,-1413.84) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0113288 position[mm]: (-8.69491,-22.6409,-1413.76) + trackID: 99 chamberNb: 0 energy deposit[MeV]: 0.00130496 position[mm]: (-8.66406,-22.5169,-1413.84) + trackID: 98 chamberNb: 0 energy deposit[MeV]: 0.000616708 position[mm]: (-8.53597,-22.2409,-1413.84) + trackID: 98 chamberNb: 0 energy deposit[MeV]: 0.00611465 position[mm]: (-8.48438,-22.2693,-1413.83) + trackID: 100 chamberNb: 0 energy deposit[MeV]: 0.00237175 position[mm]: (-8.53998,-22.2506,-1413.85) + trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.00126284 position[mm]: (-10.1016,-21.3058,-1455.12) + trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.00372634 position[mm]: (-9.79691,-20.6713,-1483.7) + trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.00478818 position[mm]: (-9.50495,-19.9227,-1518.68) + trackID: 16 chamberNb: 0 energy deposit[MeV]: 0.00417084 position[mm]: (-9.20632,-19.3188,-1550.13) + trackID: 16 chamberNb: 0 energy deposit[MeV]: 0.00245238 position[mm]: (-9.2001,-19.3093,-1550.12) + trackID: 101 chamberNb: 0 energy deposit[MeV]: 0.0016593 position[mm]: (-9.2074,-19.326,-1550.12) Collection: Event_2 -Number of hits: 108 - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00990939 position[mm]: (-207.244,-161.386,-1578.44) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.000244233 position[mm]: (-207.415,-161.517,-1577.75) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0144427 position[mm]: (-216.63,-168.563,-1540.82) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0124663 position[mm]: (-225.389,-175.335,-1505.33) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.000696409 position[mm]: (-226.057,-175.846,-1502.63) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00955931 position[mm]: (-232.107,-180.492,-1478.1) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00681285 position[mm]: (-237.024,-184.204,-1458.38) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0040336 position[mm]: (-240,-186.448,-1446.42) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 7.35056e-05 position[mm]: (-399.514,-306.584,-799.355) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0086664 position[mm]: (-401.882,-308.39,-789.702) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00436029 position[mm]: (-405.719,-311.309,-774.061) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0268707 position[mm]: (-420.865,-322.825,-712.66) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0113829 position[mm]: (-426.169,-326.877,-691.279) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00997859 position[mm]: (-431.153,-330.712,-671.303) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0115015 position[mm]: (-437.367,-335.528,-646.41) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0101593 position[mm]: (-442.176,-339.236,-627.108) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00827272 position[mm]: (-448.947,-344.407,-600) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00336941 position[mm]: (-602.741,-459.965,6.67493) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0423769 position[mm]: (-632.484,-482.603,124.436) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0129074 position[mm]: (-641.723,-489.99,160.847) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00268309 position[mm]: (-643.735,-491.651,168.816) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00223843 position[mm]: (-646.951,-494.313,181.606) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00567001 position[mm]: (-651.56,-498.167,200) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00165814 position[mm]: (-802.653,-625.63,803.707) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0144656 position[mm]: (-813.707,-634.772,847.339) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0423828 position[mm]: (-835.19,-652.649,931.905) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00332137 position[mm]: (-837.126,-654.2,939.349) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00485691 position[mm]: (-840.315,-656.748,951.63) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00632117 position[mm]: (-844.461,-660.055,967.588) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0103187 position[mm]: (-851.757,-665.892,995.69) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0014453 position[mm]: (-852.869,-666.79,1000) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0121877 position[mm]: (-1013.92,-796.524,1623.83) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0254872 position[mm]: (-1033.33,-811.315,1698.14) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0196418 position[mm]: (-1048.29,-822.532,1756.39) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00400484 position[mm]: (-1051.17,-824.706,1767.55) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0164954 position[mm]: (-1059.58,-831.053,1800) - trackID: 69 chamberNb: 4 energy deposit[MeV]: 0.00826813 position[mm]: (-1051.34,-824.763,1767.85) - trackID: 68 chamberNb: 4 energy deposit[MeV]: 0.00311573 position[mm]: (-1051.15,-824.695,1767.56) - trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.00868633 position[mm]: (-1048.24,-822.621,1756.39) - trackID: 66 chamberNb: 4 energy deposit[MeV]: 0.00239961 position[mm]: (-1033.34,-811.33,1698.14) - trackID: 65 chamberNb: 4 energy deposit[MeV]: 0.00245034 position[mm]: (-1013.91,-796.509,1623.84) - trackID: 59 chamberNb: 3 energy deposit[MeV]: 0.00141516 position[mm]: (-851.75,-665.895,995.691) - trackID: 58 chamberNb: 3 energy deposit[MeV]: 0.00279207 position[mm]: (-844.475,-660.042,967.589) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.00599646 position[mm]: (-840.661,-656.706,951.601) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.00176722 position[mm]: (-840.762,-656.83,951.498) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.000935847 position[mm]: (-840.808,-656.921,951.554) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.00334849 position[mm]: (-840.835,-656.959,951.508) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.00324297 position[mm]: (-840.821,-656.955,951.526) - trackID: 90 chamberNb: 3 energy deposit[MeV]: 0.00262601 position[mm]: (-840.82,-656.908,951.55) - trackID: 89 chamberNb: 3 energy deposit[MeV]: 0.00138989 position[mm]: (-840.767,-656.831,951.492) - trackID: 56 chamberNb: 3 energy deposit[MeV]: 0.00622584 position[mm]: (-837.179,-654.225,939.335) - trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.00667524 position[mm]: (-835.313,-652.62,931.893) - trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.0034636 position[mm]: (-835.302,-652.6,931.905) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.00220449 position[mm]: (-813.689,-634.792,847.341) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.00139323 position[mm]: (-813.683,-634.798,847.342) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00417588 position[mm]: (-799.718,-627.375,803.878) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00393522 position[mm]: (-796.903,-629.071,802.535) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00306036 position[mm]: (-794.424,-627.052,801.82) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00104327 position[mm]: (-793.145,-627.117,802.337) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00456406 position[mm]: (-792.941,-629.272,804.403) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00511574 position[mm]: (-793.969,-629.765,807.773) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00637247 position[mm]: (-797.851,-629.636,808.544) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00309314 position[mm]: (-795.78,-627.749,805.661) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00895093 position[mm]: (-797.881,-627.252,803.54) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00666176 position[mm]: (-800.749,-627.447,804.002) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00875908 position[mm]: (-801.307,-629.518,806.038) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0107237 position[mm]: (-801.426,-629.812,806.609) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0102013 position[mm]: (-801.49,-629.54,806.491) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.00740612 position[mm]: (-801.506,-629.6,806.444) - trackID: 92 chamberNb: 3 energy deposit[MeV]: 0.00218699 position[mm]: (-792.929,-629.267,804.402) - trackID: 91 chamberNb: 3 energy deposit[MeV]: 0.00230187 position[mm]: (-793.147,-627.117,802.352) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.00172235 position[mm]: (-647.162,-494.31,181.582) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.000100189 position[mm]: (-647.182,-494.234,181.631) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.00715183 position[mm]: (-647.208,-494.243,181.7) - trackID: 94 chamberNb: 2 energy deposit[MeV]: 0.00227061 position[mm]: (-647.173,-494.223,181.636) - trackID: 93 chamberNb: 2 energy deposit[MeV]: 0.00316 position[mm]: (-647.145,-494.298,181.571) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00166229 position[mm]: (-643.728,-491.657,168.817) - trackID: 46 chamberNb: 2 energy deposit[MeV]: 0.00817399 position[mm]: (-641.65,-490.041,160.863) - trackID: 45 chamberNb: 2 energy deposit[MeV]: 0.00160447 position[mm]: (-632.491,-482.609,124.434) - trackID: 44 chamberNb: 2 energy deposit[MeV]: 0.00308924 position[mm]: (-602.763,-459.964,6.67084) - trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.00158052 position[mm]: (-442.184,-339.239,-627.11) - trackID: 33 chamberNb: 1 energy deposit[MeV]: 0.00204573 position[mm]: (-437.355,-335.527,-646.407) - trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.00719253 position[mm]: (-431.211,-330.665,-671.301) - trackID: 31 chamberNb: 1 energy deposit[MeV]: 0.00179581 position[mm]: (-426.178,-326.873,-691.28) - trackID: 30 chamberNb: 1 energy deposit[MeV]: 0.00180419 position[mm]: (-420.864,-322.835,-712.662) - trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.00178413 position[mm]: (-405.718,-311.299,-774.058) - trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.00853436 position[mm]: (-401.873,-308.486,-789.708) - trackID: 27 chamberNb: 1 energy deposit[MeV]: 0.00200303 position[mm]: (-399.518,-306.595,-799.358) - trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.00715865 position[mm]: (-237.094,-184.222,-1458.4) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.00485216 position[mm]: (-232.134,-180.46,-1478.1) - trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.00532339 position[mm]: (-226.089,-175.81,-1502.63) - trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.00162162 position[mm]: (-225.382,-175.341,-1505.33) - trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.00165618 position[mm]: (-216.634,-168.571,-1540.82) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.00690165 position[mm]: (-205.357,-162.02,-1576.71) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.000884619 position[mm]: (-204.803,-162.315,-1576.32) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.00851841 position[mm]: (-204.919,-162.95,-1575.11) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0029855 position[mm]: (-204.38,-163.62,-1575.22) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0021987 position[mm]: (-203.779,-163.853,-1575.07) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.00815166 position[mm]: (-204.142,-164.244,-1574.84) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.00771203 position[mm]: (-203.965,-163.978,-1574.81) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.00797414 position[mm]: (-203.896,-163.933,-1574.84) - trackID: 104 chamberNb: 0 energy deposit[MeV]: 0.00257143 position[mm]: (-203.971,-163.979,-1574.82) - trackID: 103 chamberNb: 0 energy deposit[MeV]: 0.00319027 position[mm]: (-203.774,-163.868,-1575.09) - trackID: 102 chamberNb: 0 energy deposit[MeV]: 0.00204907 position[mm]: (-204.385,-163.624,-1575.21) - trackID: 101 chamberNb: 0 energy deposit[MeV]: 0.00541519 position[mm]: (-204.681,-162.279,-1576.29) - trackID: 101 chamberNb: 0 energy deposit[MeV]: 0.00340951 position[mm]: (-204.689,-162.265,-1576.31) - trackID: 105 chamberNb: 0 energy deposit[MeV]: 0.00154363 position[mm]: (-204.688,-162.285,-1576.29) - trackID: 16 chamberNb: 0 energy deposit[MeV]: 0.00623364 position[mm]: (-207.258,-161.445,-1578.45) +Number of hits: 84 + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0215623 position[mm]: (39.1055,123.995,-1537.81) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0011119 position[mm]: (39.2437,124.429,-1534.72) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00553722 position[mm]: (40.3118,127.767,-1511.04) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00288133 position[mm]: (40.487,128.32,-1507.15) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0187196 position[mm]: (43.7154,138.615,-1435.33) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.000893277 position[mm]: (43.896,139.2,-1431.29) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0131794 position[mm]: (44.909,142.505,-1408.42) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00255475 position[mm]: (45.2804,143.717,-1400) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0020168 position[mm]: (72.4232,231.948,-791.329) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0191813 position[mm]: (74.8434,239.489,-739.696) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00488624 position[mm]: (75.3943,241.178,-728.185) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00266656 position[mm]: (75.6936,242.083,-722.017) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0102167 position[mm]: (76.6061,244.825,-703.244) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0158013 position[mm]: (78.4534,250.439,-665.447) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0101196 position[mm]: (81.7681,260.158,-600) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00578336 position[mm]: (115.807,356.466,25.8162) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0130692 position[mm]: (119.012,365.821,83.3583) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00970557 position[mm]: (121.529,372.718,125.942) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.002298 position[mm]: (121.995,374.022,133.865) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0213963 position[mm]: (125.967,384.729,200) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.000936037 position[mm]: (161.604,482.052,804.62) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00348552 position[mm]: (162.412,484.272,818.256) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.034779 position[mm]: (165.538,492.956,871.669) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0147367 position[mm]: (168.6,501.285,922.879) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00466231 position[mm]: (169.09,502.666,931.345) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.011321 position[mm]: (172.003,510.752,981.146) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00784367 position[mm]: (173.122,513.882,1000) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0367359 position[mm]: (215.362,626.875,1685.62) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00526687 position[mm]: (216.577,629.953,1703.84) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0215246 position[mm]: (219.984,638.385,1753.99) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.000992859 position[mm]: (220.086,638.633,1755.47) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00215374 position[mm]: (220.256,639.042,1757.91) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00272989 position[mm]: (220.515,639.667,1761.64) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0112539 position[mm]: (222.549,644.58,1790.84) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0031773 position[mm]: (223.204,646.109,1800) + trackID: 70 chamberNb: 4 energy deposit[MeV]: 0.00132948 position[mm]: (222.556,644.576,1790.84) + trackID: 69 chamberNb: 4 energy deposit[MeV]: 0.00362945 position[mm]: (220.502,639.691,1761.64) + trackID: 68 chamberNb: 4 energy deposit[MeV]: 0.0028981 position[mm]: (220.235,639.041,1757.91) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.00638279 position[mm]: (219.43,639.202,1755.58) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.00324495 position[mm]: (219.635,639.772,1755.76) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.00596952 position[mm]: (219.173,639.556,1755.7) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.00971622 position[mm]: (219.22,639.538,1755.42) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.00418521 position[mm]: (219.274,639.526,1755.37) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.00289521 position[mm]: (219.269,639.517,1755.35) + trackID: 89 chamberNb: 4 energy deposit[MeV]: 0.00168661 position[mm]: (219.177,639.564,1755.7) + trackID: 66 chamberNb: 4 energy deposit[MeV]: 0.00400577 position[mm]: (219.958,638.367,1754) + trackID: 65 chamberNb: 4 energy deposit[MeV]: 0.00158487 position[mm]: (216.584,629.947,1703.85) + trackID: 64 chamberNb: 4 energy deposit[MeV]: 0.0013216 position[mm]: (215.363,626.868,1685.62) + trackID: 60 chamberNb: 3 energy deposit[MeV]: 0.00172183 position[mm]: (171.996,510.746,981.148) + trackID: 59 chamberNb: 3 energy deposit[MeV]: 0.00770904 position[mm]: (169.013,502.696,931.352) + trackID: 58 chamberNb: 3 energy deposit[MeV]: 0.00184495 position[mm]: (168.601,501.296,922.878) + trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.00248136 position[mm]: (165.524,492.966,871.669) + trackID: 56 chamberNb: 3 energy deposit[MeV]: 0.00282504 position[mm]: (162.426,484.286,818.254) + trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.000858227 position[mm]: (161.539,482.116,804.623) + trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.00346002 position[mm]: (161.548,482.156,804.603) + trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.00161512 position[mm]: (161.553,482.15,804.598) + trackID: 90 chamberNb: 3 energy deposit[MeV]: 0.00358038 position[mm]: (161.515,482.115,804.61) + trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00556109 position[mm]: (118.276,383.654,138.337) + trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0170856 position[mm]: (102.889,403.383,182.767) + trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.000978962 position[mm]: (103.771,405.457,188.005) + trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00601089 position[mm]: (105.583,410.416,200) + trackID: 94 chamberNb: 2 energy deposit[MeV]: 0.00190496 position[mm]: (103.771,405.468,188.001) + trackID: 93 chamberNb: 2 energy deposit[MeV]: 0.00404836 position[mm]: (102.914,403.363,182.769) + trackID: 92 chamberNb: 2 energy deposit[MeV]: 0.00143964 position[mm]: (118.269,383.653,138.333) + trackID: 46 chamberNb: 2 energy deposit[MeV]: 0.00272759 position[mm]: (121.47,372.73,125.948) + trackID: 46 chamberNb: 2 energy deposit[MeV]: 0.00226753 position[mm]: (121.471,372.738,125.96) + trackID: 136 chamberNb: 2 energy deposit[MeV]: 0.00128367 position[mm]: (121.474,372.735,125.945) + trackID: 45 chamberNb: 2 energy deposit[MeV]: 0.00250908 position[mm]: (118.996,365.827,83.3591) + trackID: 44 chamberNb: 2 energy deposit[MeV]: 0.00190597 position[mm]: (115.817,356.46,25.8172) + trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.00155339 position[mm]: (78.4508,250.448,-665.448) + trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.00326346 position[mm]: (76.6266,244.813,-703.241) + trackID: 35 chamberNb: 1 energy deposit[MeV]: 0.0014817 position[mm]: (75.6996,242.077,-722.016) + trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.00129489 position[mm]: (75.3871,241.178,-728.184) + trackID: 33 chamberNb: 1 energy deposit[MeV]: 0.00136336 position[mm]: (74.8396,239.482,-739.695) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.00192481 position[mm]: (72.4258,231.96,-791.33) + trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.00306933 position[mm]: (44.9307,142.509,-1408.42) + trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.00288095 position[mm]: (43.8931,139.22,-1431.29) + trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.00122091 position[mm]: (43.7157,138.621,-1435.33) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.00306746 position[mm]: (40.4655,128.316,-1507.15) + trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.00489825 position[mm]: (40.0648,127.817,-1511) + trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.00809003 position[mm]: (40.1391,127.798,-1511.05) + trackID: 138 chamberNb: 0 energy deposit[MeV]: 0.00271721 position[mm]: (40.0546,127.809,-1511.02) + trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.00248525 position[mm]: (39.2305,124.419,-1534.72) + trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.00149106 position[mm]: (39.0974,123.998,-1537.81) Collection: Event_3 -Number of hits: 105 - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.000142237 position[mm]: (-182.714,-89.1504,-1598.29) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0117448 position[mm]: (-188.963,-92.1863,-1570.36) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00241116 position[mm]: (-190.713,-93.0306,-1562.53) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0102666 position[mm]: (-195.375,-95.2911,-1541.63) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0108043 position[mm]: (-200.435,-97.8302,-1518.76) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0243197 position[mm]: (-211.874,-103.53,-1466.68) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00555836 position[mm]: (-214.397,-104.83,-1454.99) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00175646 position[mm]: (-215.571,-105.441,-1449.59) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0130376 position[mm]: (-223.849,-109.743,-1411.36) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00703194 position[mm]: (-226.332,-111.029,-1400) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00464842 position[mm]: (-358.863,-179.444,-792.661) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00729115 position[mm]: (-363.234,-181.74,-772.41) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00498788 position[mm]: (-365.247,-182.808,-763.101) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0074807 position[mm]: (-370.382,-185.517,-739.41) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.000921049 position[mm]: (-371.278,-185.987,-735.302) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0162738 position[mm]: (-382.42,-191.86,-684.223) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00599164 position[mm]: (-387.025,-194.352,-662.732) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0208004 position[mm]: (-398.28,-200.403,-610.596) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00411082 position[mm]: (-400.564,-201.626,-600) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0028629 position[mm]: (-533.034,-272.459,13.8074) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.017149 position[mm]: (-543.055,-277.841,60.2752) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0196527 position[mm]: (-556.368,-285.14,122.032) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00442667 position[mm]: (-557.272,-285.634,126.257) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0078407 position[mm]: (-561.34,-287.854,145.235) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.000363521 position[mm]: (-562.206,-288.33,149.291) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00877339 position[mm]: (-567.227,-291.094,172.813) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00415309 position[mm]: (-569.864,-292.548,185.107) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00468462 position[mm]: (-573.054,-294.33,200) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00887244 position[mm]: (-707.027,-368.286,827.945) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00364496 position[mm]: (-709.834,-369.826,841.183) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0181281 position[mm]: (-718.24,-374.495,880.797) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00651837 position[mm]: (-721.255,-376.161,894.936) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00262072 position[mm]: (-723.867,-377.611,907.159) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0125822 position[mm]: (-733.468,-383.066,952.547) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.013172 position[mm]: (-743.665,-388.836,1000) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0251578 position[mm]: (-884.987,-469.319,1663.58) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00339169 position[mm]: (-887.933,-470.98,1677.33) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0392749 position[mm]: (-908.976,-482.885,1775.57) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 5.73694e-05 position[mm]: (-909.065,-482.934,1775.98) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0120925 position[mm]: (-914.232,-485.788,1800) - trackID: 74 chamberNb: 4 energy deposit[MeV]: 0.00176039 position[mm]: (-909.058,-482.942,1775.98) - trackID: 73 chamberNb: 4 energy deposit[MeV]: 0.0014563 position[mm]: (-908.968,-482.885,1775.57) - trackID: 72 chamberNb: 4 energy deposit[MeV]: 0.0013694 position[mm]: (-887.928,-470.975,1677.33) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.00439194 position[mm]: (-884.202,-469.583,1663.89) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.000346053 position[mm]: (-884.273,-469.61,1664.02) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.00508069 position[mm]: (-884.586,-469.724,1664.27) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.00694359 position[mm]: (-884.603,-469.769,1664) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.00522692 position[mm]: (-884.626,-469.735,1663.98) - trackID: 112 chamberNb: 4 energy deposit[MeV]: 0.00436607 position[mm]: (-884.634,-469.779,1664.02) - trackID: 111 chamberNb: 4 energy deposit[MeV]: 0.0046207 position[mm]: (-884.295,-469.618,1663.99) - trackID: 110 chamberNb: 4 energy deposit[MeV]: 0.00412986 position[mm]: (-884.228,-469.596,1663.87) - trackID: 65 chamberNb: 3 energy deposit[MeV]: 0.00257823 position[mm]: (-733.477,-383.051,952.547) - trackID: 64 chamberNb: 3 energy deposit[MeV]: 0.00149334 position[mm]: (-723.867,-377.603,907.161) - trackID: 63 chamberNb: 3 energy deposit[MeV]: 0.00182135 position[mm]: (-721.265,-376.158,894.935) - trackID: 62 chamberNb: 3 energy deposit[MeV]: 0.00323702 position[mm]: (-718.263,-374.494,880.793) - trackID: 61 chamberNb: 3 energy deposit[MeV]: 0.00794578 position[mm]: (-709.912,-369.789,841.179) - trackID: 60 chamberNb: 3 energy deposit[MeV]: 0.00758828 position[mm]: (-707.019,-368.367,827.945) - trackID: 53 chamberNb: 2 energy deposit[MeV]: 0.00278246 position[mm]: (-569.88,-292.537,185.106) - trackID: 52 chamberNb: 2 energy deposit[MeV]: 0.00508025 position[mm]: (-567.2,-291.13,172.818) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00146051 position[mm]: (-562.206,-288.322,149.292) - trackID: 50 chamberNb: 2 energy deposit[MeV]: 0.00743867 position[mm]: (-561.371,-287.782,145.244) - trackID: 49 chamberNb: 2 energy deposit[MeV]: 0.00205789 position[mm]: (-557.284,-285.628,126.256) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.00296207 position[mm]: (-556.389,-285.141,122.029) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.000349864 position[mm]: (-543.049,-277.762,60.3098) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00831648 position[mm]: (-543.263,-275.642,61.6985) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00613615 position[mm]: (-543.945,-276.605,63.2762) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0025852 position[mm]: (-543.471,-275.998,62.9942) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00700308 position[mm]: (-543.079,-275.603,64.2531) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00871496 position[mm]: (-542.805,-276.553,63.8933) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00523097 position[mm]: (-543.379,-276.597,64.2969) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00518131 position[mm]: (-543.456,-277.018,64.5666) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00674237 position[mm]: (-543.603,-277.207,64.7518) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0093403 position[mm]: (-543.541,-277.236,64.8393) - trackID: 117 chamberNb: 2 energy deposit[MeV]: 0.00152918 position[mm]: (-543.6,-277.214,64.7472) - trackID: 116 chamberNb: 2 energy deposit[MeV]: 0.00161258 position[mm]: (-543.464,-277.017,64.5609) - trackID: 115 chamberNb: 2 energy deposit[MeV]: 0.00256381 position[mm]: (-543.455,-276.004,62.9913) - trackID: 114 chamberNb: 2 energy deposit[MeV]: 0.0017527 position[mm]: (-543.265,-275.651,61.6928) - trackID: 113 chamberNb: 2 energy deposit[MeV]: 0.00406323 position[mm]: (-543.019,-277.753,60.3023) - trackID: 46 chamberNb: 2 energy deposit[MeV]: 0.00148978 position[mm]: (-533.027,-272.456,13.8098) - trackID: 41 chamberNb: 1 energy deposit[MeV]: 0.00479401 position[mm]: (-398.316,-200.383,-610.598) - trackID: 40 chamberNb: 1 energy deposit[MeV]: 0.00539823 position[mm]: (-387.005,-194.308,-662.719) - trackID: 39 chamberNb: 1 energy deposit[MeV]: 0.00174543 position[mm]: (-382.41,-191.863,-684.221) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.000485913 position[mm]: (-371.029,-186.01,-735.212) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.00632878 position[mm]: (-370.947,-186.218,-735.372) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.00764784 position[mm]: (-371.049,-186.179,-735.438) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.00250194 position[mm]: (-371.048,-186.166,-735.427) - trackID: 118 chamberNb: 1 energy deposit[MeV]: 0.00158769 position[mm]: (-371.028,-186.005,-735.219) - trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.00477379 position[mm]: (-370.342,-185.514,-739.398) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.00158739 position[mm]: (-365.15,-183.086,-763.063) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.00727154 position[mm]: (-364.808,-183.196,-763.07) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0123547 position[mm]: (-364.917,-183.069,-763.024) - trackID: 119 chamberNb: 1 energy deposit[MeV]: 0.00241042 position[mm]: (-365.155,-183.101,-763.065) - trackID: 35 chamberNb: 1 energy deposit[MeV]: 0.00268513 position[mm]: (-363.216,-181.738,-772.405) - trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.00281901 position[mm]: (-358.882,-179.443,-792.664) - trackID: 29 chamberNb: 0 energy deposit[MeV]: 0.00344476 position[mm]: (-223.824,-109.74,-1411.35) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.00341095 position[mm]: (-215.58,-105.418,-1449.58) - trackID: 27 chamberNb: 0 energy deposit[MeV]: 0.0108344 position[mm]: (-214.215,-104.69,-1454.91) - trackID: 27 chamberNb: 0 energy deposit[MeV]: 0.00448066 position[mm]: (-214.196,-104.663,-1454.89) - trackID: 26 chamberNb: 0 energy deposit[MeV]: 0.00220921 position[mm]: (-211.886,-103.536,-1466.68) - trackID: 25 chamberNb: 0 energy deposit[MeV]: 0.00140356 position[mm]: (-200.427,-97.8297,-1518.76) - trackID: 24 chamberNb: 0 energy deposit[MeV]: 0.00145438 position[mm]: (-195.374,-95.283,-1541.63) - trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.00879002 position[mm]: (-190.871,-93.036,-1562.55) - trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.00289242 position[mm]: (-190.865,-93.0169,-1562.55) - trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.00143248 position[mm]: (-188.965,-92.1943,-1570.36) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.00803882 position[mm]: (-182.792,-89.1888,-1598.3) +Number of hits: 82 + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00828945 position[mm]: (-120.358,32.0127,-1580.83) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00700916 position[mm]: (-123.273,32.7956,-1560.67) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00155552 position[mm]: (-124.14,33.0346,-1554.73) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0177594 position[mm]: (-131.815,35.1467,-1502.61) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0337391 position[mm]: (-146.657,39.0199,-1400) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00547206 position[mm]: (-237.165,62.2479,-783.245) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00445912 position[mm]: (-239.087,62.7399,-770.286) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.023392 position[mm]: (-247.312,64.9133,-711.899) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00650988 position[mm]: (-249.115,65.3915,-697.393) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0041427 position[mm]: (-251.248,65.9657,-680.246) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00440381 position[mm]: (-253.246,66.4965,-664.078) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00166824 position[mm]: (-253.519,66.5703,-661.857) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0135859 position[mm]: (-256.615,67.4299,-636.557) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00718292 position[mm]: (-258.393,67.9376,-622.041) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.000357632 position[mm]: (-258.503,67.9674,-621.142) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00491991 position[mm]: (-259.93,68.3547,-609.48) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00344529 position[mm]: (-261.092,68.6606,-600) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00672363 position[mm]: (-335.195,87.08,12.6765) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00667937 position[mm]: (-338.535,87.939,40.4943) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.000857114 position[mm]: (-339.177,88.1019,45.8618) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0031074 position[mm]: (-340.003,88.3079,52.8029) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0213269 position[mm]: (-345.29,89.6301,97.3387) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.000148093 position[mm]: (-345.321,89.6384,97.6004) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0198152 position[mm]: (-350.461,91.3919,137.157) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.000693179 position[mm]: (-350.783,91.5133,139.413) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00365501 position[mm]: (-354.24,92.8234,163.564) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.000438203 position[mm]: (-354.584,92.9476,165.903) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0102358 position[mm]: (-359.636,94.7396,200) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0017692 position[mm]: (-449.682,126.273,803.003) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00336061 position[mm]: (-450.482,126.546,808.326) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0175266 position[mm]: (-458.096,129.13,859.053) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0029129 position[mm]: (-459.09,129.476,865.655) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00106119 position[mm]: (-460.041,129.81,871.995) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0456493 position[mm]: (-478.399,136.37,993.446) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00285821 position[mm]: (-479.35,136.713,1000) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0236857 position[mm]: (-578.892,172.759,1690.34) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0265085 position[mm]: (-594.706,178.644,1800) + trackID: 81 chamberNb: 4 energy deposit[MeV]: 0.0020396 position[mm]: (-578.881,172.756,1690.35) + trackID: 72 chamberNb: 3 energy deposit[MeV]: 0.00554535 position[mm]: (-478.509,136.4,993.44) + trackID: 72 chamberNb: 3 energy deposit[MeV]: 0.0039867 position[mm]: (-478.525,136.422,993.457) + trackID: 71 chamberNb: 3 energy deposit[MeV]: 0.00145047 position[mm]: (-460.041,129.801,871.996) + trackID: 70 chamberNb: 3 energy deposit[MeV]: 0.00263968 position[mm]: (-459.073,129.481,865.658) + trackID: 69 chamberNb: 3 energy deposit[MeV]: 0.00163153 position[mm]: (-458.097,129.12,859.054) + trackID: 68 chamberNb: 3 energy deposit[MeV]: 0.00363983 position[mm]: (-450.408,126.486,808.35) + trackID: 68 chamberNb: 3 energy deposit[MeV]: 0.00344326 position[mm]: (-450.397,126.509,808.355) + trackID: 135 chamberNb: 3 energy deposit[MeV]: 0.00149146 position[mm]: (-450.411,126.486,808.358) + trackID: 67 chamberNb: 3 energy deposit[MeV]: 0.00132476 position[mm]: (-449.689,126.27,803.003) + trackID: 60 chamberNb: 2 energy deposit[MeV]: 0.00324873 position[mm]: (-354.561,92.9454,165.908) + trackID: 59 chamberNb: 2 energy deposit[MeV]: 0.00122005 position[mm]: (-354.245,92.8184,163.563) + trackID: 58 chamberNb: 2 energy deposit[MeV]: 0.00478843 position[mm]: (-350.428,91.2155,139.558) + trackID: 58 chamberNb: 2 energy deposit[MeV]: 0.0122115 position[mm]: (-350.546,91.0768,139.841) + trackID: 58 chamberNb: 2 energy deposit[MeV]: 0.00343275 position[mm]: (-350.517,91.0812,139.901) + trackID: 58 chamberNb: 2 energy deposit[MeV]: 0.00172473 position[mm]: (-350.507,91.0839,139.901) + trackID: 136 chamberNb: 2 energy deposit[MeV]: 0.00144542 position[mm]: (-350.516,91.0776,139.908) + trackID: 57 chamberNb: 2 energy deposit[MeV]: 0.00155332 position[mm]: (-350.452,91.3908,137.158) + trackID: 56 chamberNb: 2 energy deposit[MeV]: 0.00146302 position[mm]: (-345.321,89.6468,97.6005) + trackID: 55 chamberNb: 2 energy deposit[MeV]: 0.00164615 position[mm]: (-345.29,89.6205,97.3393) + trackID: 54 chamberNb: 2 energy deposit[MeV]: 0.00144252 position[mm]: (-340.004,88.3161,52.8029) + trackID: 53 chamberNb: 2 energy deposit[MeV]: 0.00200201 position[mm]: (-339.226,88.1521,45.861) + trackID: 53 chamberNb: 2 energy deposit[MeV]: 0.00466013 position[mm]: (-339.261,88.1516,45.8417) + trackID: 137 chamberNb: 2 energy deposit[MeV]: 0.00137545 position[mm]: (-339.225,88.1598,45.8598) + trackID: 52 chamberNb: 2 energy deposit[MeV]: 0.00149201 position[mm]: (-338.543,87.9377,40.4937) + trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00984471 position[mm]: (-335.195,86.96,12.6927) + trackID: 39 chamberNb: 1 energy deposit[MeV]: 0.00181893 position[mm]: (-259.937,68.346,-609.48) + trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.00145622 position[mm]: (-258.508,67.9611,-621.143) + trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.00325776 position[mm]: (-258.374,67.9228,-622.037) + trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.00123038 position[mm]: (-256.621,67.4328,-636.557) + trackID: 35 chamberNb: 1 energy deposit[MeV]: 0.00249295 position[mm]: (-253.535,66.5686,-661.858) + trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.00324842 position[mm]: (-253.258,66.5175,-664.079) + trackID: 33 chamberNb: 1 energy deposit[MeV]: 0.00133622 position[mm]: (-251.252,65.972,-680.246) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.00241734 position[mm]: (-249.161,65.3853,-697.395) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.00145295 position[mm]: (-249.158,65.3931,-697.395) + trackID: 138 chamberNb: 1 energy deposit[MeV]: 0.00129375 position[mm]: (-249.155,65.3829,-697.393) + trackID: 31 chamberNb: 1 energy deposit[MeV]: 0.00228388 position[mm]: (-247.305,64.926,-711.897) + trackID: 30 chamberNb: 1 energy deposit[MeV]: 0.0012467 position[mm]: (-239.094,62.7402,-770.287) + trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.00172793 position[mm]: (-237.098,62.291,-783.229) + trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.00373116 position[mm]: (-237.082,62.3095,-783.244) + trackID: 139 chamberNb: 1 energy deposit[MeV]: 0.00222082 position[mm]: (-237.094,62.2808,-783.238) + trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.00124809 position[mm]: (-131.817,35.1533,-1502.61) + trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.00158332 position[mm]: (-124.134,33.0276,-1554.73) + trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.00263862 position[mm]: (-123.278,32.7782,-1560.66) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0018637 position[mm]: (-120.348,32.0155,-1580.83) Collection: Event_4 -Number of hits: 104 - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00296933 position[mm]: (-102.109,-41.1029,-1591.74) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00399437 position[mm]: (-103.726,-41.854,-1578.44) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00167813 position[mm]: (-104.695,-42.2979,-1570.56) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00257389 position[mm]: (-105.348,-42.5973,-1565.28) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00143805 position[mm]: (-105.838,-42.8185,-1561.34) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0106539 position[mm]: (-110.406,-44.9132,-1524.85) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00473951 position[mm]: (-112.747,-46.041,-1505.92) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00893497 position[mm]: (-116.88,-47.9584,-1472.44) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0178272 position[mm]: (-121.861,-50.2891,-1432.67) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00314193 position[mm]: (-123.629,-51.0922,-1418.87) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00124922 position[mm]: (-124.605,-51.532,-1411.4) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.000636163 position[mm]: (-125.122,-51.7609,-1407.46) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00220188 position[mm]: (-125.87,-52.0925,-1401.77) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.000286721 position[mm]: (-126.104,-52.1968,-1400) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0408678 position[mm]: (-220.873,-94.8854,-687.879) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00507192 position[mm]: (-222.29,-95.4578,-677.667) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0010888 position[mm]: (-222.69,-95.6149,-674.809) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00667714 position[mm]: (-225.063,-96.5253,-658.065) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0282676 position[mm]: (-231.995,-99.0931,-610.172) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00568703 position[mm]: (-233.485,-99.6169,-600) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0161571 position[mm]: (-326.046,-132.901,36.0567) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00112451 position[mm]: (-327.229,-133.322,44.2532) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0230111 position[mm]: (-336.032,-136.481,105.362) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0122851 position[mm]: (-339.801,-137.793,131.698) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0246674 position[mm]: (-349.414,-141.349,200) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00946387 position[mm]: (-437.439,-173.103,828.051) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0102184 position[mm]: (-440.773,-174.332,851.799) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0181717 position[mm]: (-447.224,-176.729,898.042) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00233817 position[mm]: (-447.997,-177.021,903.538) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00312091 position[mm]: (-448.825,-177.334,909.388) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0101725 position[mm]: (-451.194,-178.227,926.189) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0130762 position[mm]: (-454.643,-179.528,950.63) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0191766 position[mm]: (-460.718,-181.829,993.64) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00152223 position[mm]: (-461.603,-182.179,1000) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0251739 position[mm]: (-556.449,-219.678,1683.71) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0355864 position[mm]: (-569.291,-224.843,1776.87) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0063955 position[mm]: (-572.414,-226.048,1800) - trackID: 72 chamberNb: 4 energy deposit[MeV]: 0.00616382 position[mm]: (-569.265,-224.79,1776.88) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.00391945 position[mm]: (-556.424,-219.694,1683.72) - trackID: 64 chamberNb: 3 energy deposit[MeV]: 0.00414158 position[mm]: (-460.7,-181.802,993.647) - trackID: 63 chamberNb: 3 energy deposit[MeV]: 0.00174619 position[mm]: (-454.643,-179.539,950.63) - trackID: 62 chamberNb: 3 energy deposit[MeV]: 0.00272336 position[mm]: (-451.22,-178.229,926.24) - trackID: 61 chamberNb: 3 energy deposit[MeV]: 0.00173413 position[mm]: (-451.186,-178.233,926.19) - trackID: 60 chamberNb: 3 energy deposit[MeV]: 0.00667736 position[mm]: (-448.887,-177.309,909.386) - trackID: 59 chamberNb: 3 energy deposit[MeV]: 0.00561497 position[mm]: (-448.049,-177.021,903.535) - trackID: 58 chamberNb: 3 energy deposit[MeV]: 0.00185139 position[mm]: (-447.219,-176.739,898.042) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.000393506 position[mm]: (-440.758,-174.26,851.811) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.00496118 position[mm]: (-440.789,-174.279,851.836) - trackID: 87 chamberNb: 3 energy deposit[MeV]: 0.00198984 position[mm]: (-440.756,-174.252,851.82) - trackID: 56 chamberNb: 3 energy deposit[MeV]: 0.00155872 position[mm]: (-437.438,-173.094,828.052) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0104979 position[mm]: (-342.998,-137.39,132.19) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.000307385 position[mm]: (-343.524,-136.956,132.261) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00972185 position[mm]: (-345.238,-136.538,131.246) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00799097 position[mm]: (-346.47,-136.931,130.457) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 2.98199e-05 position[mm]: (-346.496,-136.919,130.46) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00759425 position[mm]: (-347.192,-136.405,130.276) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.000270791 position[mm]: (-347.18,-136.104,130.011) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00166211 position[mm]: (-347.495,-136.084,129.895) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0048133 position[mm]: (-347.585,-135.815,130.195) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.000207379 position[mm]: (-347.481,-135.979,130.285) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00649485 position[mm]: (-347.576,-136.031,130.484) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00368681 position[mm]: (-347.524,-136.08,130.527) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00291425 position[mm]: (-347.52,-136.067,130.542) - trackID: 93 chamberNb: 2 energy deposit[MeV]: 0.00146774 position[mm]: (-347.518,-136.086,130.53) - trackID: 92 chamberNb: 2 energy deposit[MeV]: 0.00183119 position[mm]: (-347.476,-135.971,130.289) - trackID: 91 chamberNb: 2 energy deposit[MeV]: 0.0016495 position[mm]: (-347.489,-136.089,129.901) - trackID: 90 chamberNb: 2 energy deposit[MeV]: 0.00172105 position[mm]: (-347.182,-136.097,130.017) - trackID: 89 chamberNb: 2 energy deposit[MeV]: 0.0057746 position[mm]: (-346.53,-136.958,130.475) - trackID: 88 chamberNb: 2 energy deposit[MeV]: 0.000687278 position[mm]: (-343.516,-136.915,132.263) - trackID: 88 chamberNb: 2 energy deposit[MeV]: 0.00516365 position[mm]: (-343.496,-136.883,132.204) - trackID: 88 chamberNb: 2 energy deposit[MeV]: 0.00171693 position[mm]: (-343.486,-136.884,132.202) - trackID: 94 chamberNb: 2 energy deposit[MeV]: 0.001526 position[mm]: (-343.522,-136.909,132.265) - trackID: 50 chamberNb: 2 energy deposit[MeV]: 0.00658668 position[mm]: (-336.065,-136.538,105.361) - trackID: 49 chamberNb: 2 energy deposit[MeV]: 0.00177864 position[mm]: (-327.238,-133.317,44.2526) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.00175144 position[mm]: (-326.049,-132.891,36.0572) - trackID: 40 chamberNb: 1 energy deposit[MeV]: 0.00399482 position[mm]: (-231.99,-99.0624,-610.167) - trackID: 39 chamberNb: 1 energy deposit[MeV]: 0.00155311 position[mm]: (-225.054,-96.5266,-658.063) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.00301184 position[mm]: (-222.678,-95.6326,-674.807) - trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.00239563 position[mm]: (-222.304,-95.4641,-677.669) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.00750969 position[mm]: (-220.497,-95.1068,-687.768) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.00226002 position[mm]: (-220.415,-94.9316,-687.725) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0053922 position[mm]: (-220.364,-94.8732,-687.843) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.00548186 position[mm]: (-220.344,-94.9162,-687.827) - trackID: 96 chamberNb: 1 energy deposit[MeV]: 0.00193148 position[mm]: (-220.425,-94.9255,-687.726) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.00278817 position[mm]: (-126.41,-51.6258,-1402.05) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.0024878 position[mm]: (-126.613,-51.6831,-1401.85) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.00483081 position[mm]: (-126.744,-51.6876,-1401.7) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.00581887 position[mm]: (-126.769,-51.7361,-1401.7) - trackID: 102 chamberNb: 0 energy deposit[MeV]: 0.00263986 position[mm]: (-126.735,-51.6901,-1401.69) - trackID: 101 chamberNb: 0 energy deposit[MeV]: 0.00154227 position[mm]: (-126.609,-51.6757,-1401.85) - trackID: 27 chamberNb: 0 energy deposit[MeV]: 0.00160082 position[mm]: (-125.124,-51.7699,-1407.46) - trackID: 26 chamberNb: 0 energy deposit[MeV]: 0.0079116 position[mm]: (-124.522,-51.5216,-1411.38) - trackID: 25 chamberNb: 0 energy deposit[MeV]: 0.00204212 position[mm]: (-123.617,-51.0899,-1418.87) - trackID: 24 chamberNb: 0 energy deposit[MeV]: 0.00148944 position[mm]: (-121.865,-50.2967,-1432.67) - trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.00157542 position[mm]: (-116.759,-47.9953,-1472.41) - trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.00555439 position[mm]: (-116.781,-47.9532,-1472.43) - trackID: 103 chamberNb: 0 energy deposit[MeV]: 0.0037574 position[mm]: (-116.733,-47.9838,-1472.42) - trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.00137539 position[mm]: (-112.754,-46.0439,-1505.92) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.00174496 position[mm]: (-110.409,-44.9035,-1524.85) - trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.002207 position[mm]: (-105.851,-42.8138,-1561.34) - trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.00267619 position[mm]: (-105.366,-42.5955,-1565.28) - trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.00173408 position[mm]: (-104.704,-42.3013,-1570.56) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0070482 position[mm]: (-103.796,-41.8752,-1578.44) - trackID: 16 chamberNb: 0 energy deposit[MeV]: 0.00182127 position[mm]: (-102.104,-41.0936,-1591.74) +Number of hits: 70 + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00635849 position[mm]: (102.847,21.9736,-1577) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0505602 position[mm]: (115.728,25.3854,-1469.66) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.020265 position[mm]: (123.943,27.6097,-1400) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00487965 position[mm]: (196.889,49.4871,-785.224) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0116329 position[mm]: (201.079,50.6986,-750.479) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00402162 position[mm]: (201.83,50.9217,-744.256) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00952723 position[mm]: (203.453,51.4015,-730.837) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.000450973 position[mm]: (203.617,51.451,-729.477) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00262604 position[mm]: (204.548,51.7286,-721.761) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00156445 position[mm]: (205.713,52.073,-712.008) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00326617 position[mm]: (206.814,52.396,-702.822) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0131166 position[mm]: (210.991,53.6057,-668.143) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0137087 position[mm]: (215.849,54.9237,-627.371) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0022558 position[mm]: (216.68,55.1266,-620.305) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0090286 position[mm]: (218.634,55.5826,-603.744) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00191443 position[mm]: (219.079,55.6787,-600) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00766252 position[mm]: (291.685,70.2846,15.0778) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0161953 position[mm]: (296.93,71.225,59.149) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00524743 position[mm]: (298.702,71.5756,73.8401) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0166842 position[mm]: (303.981,72.6569,116.926) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00545869 position[mm]: (306.4,73.113,137.106) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00923382 position[mm]: (308.315,73.501,152.942) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00762031 position[mm]: (310.505,73.9586,171.134) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0154846 position[mm]: (314.023,74.6776,200) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0119841 position[mm]: (392.963,91.151,836.015) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0173401 position[mm]: (398.89,92.2412,882.681) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00284831 position[mm]: (399.525,92.3595,887.717) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0343696 position[mm]: (413.698,94.9536,1000) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0501211 position[mm]: (505.076,112.391,1726.12) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00473449 position[mm]: (506.919,112.732,1740.69) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00489703 position[mm]: (508.366,112.98,1752.29) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0114771 position[mm]: (513.635,113.834,1794.58) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00412303 position[mm]: (514.303,113.956,1800) + trackID: 75 chamberNb: 4 energy deposit[MeV]: 0.00259255 position[mm]: (513.651,113.838,1794.58) + trackID: 74 chamberNb: 4 energy deposit[MeV]: 0.00192571 position[mm]: (508.378,112.977,1752.29) + trackID: 73 chamberNb: 4 energy deposit[MeV]: 0.0054798 position[mm]: (506.962,112.706,1740.69) + trackID: 72 chamberNb: 4 energy deposit[MeV]: 0.00529666 position[mm]: (505.036,112.416,1726.13) + trackID: 64 chamberNb: 3 energy deposit[MeV]: 0.00251327 position[mm]: (399.542,92.3617,887.716) + trackID: 63 chamberNb: 3 energy deposit[MeV]: 0.00304702 position[mm]: (398.901,92.2604,882.681) + trackID: 62 chamberNb: 3 energy deposit[MeV]: 0.00274759 position[mm]: (392.949,91.1628,836.017) + trackID: 54 chamberNb: 2 energy deposit[MeV]: 0.00160634 position[mm]: (310.514,73.9593,171.133) + trackID: 53 chamberNb: 2 energy deposit[MeV]: 6.15061e-05 position[mm]: (308.292,73.4998,152.948) + trackID: 53 chamberNb: 2 energy deposit[MeV]: 0.00653758 position[mm]: (308.249,73.5147,152.994) + trackID: 89 chamberNb: 2 energy deposit[MeV]: 0.00224006 position[mm]: (308.263,73.4823,152.926) + trackID: 89 chamberNb: 2 energy deposit[MeV]: 0.00246548 position[mm]: (308.276,73.4762,152.917) + trackID: 52 chamberNb: 2 energy deposit[MeV]: 0.00523603 position[mm]: (306.355,73.1233,137.115) + trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00228223 position[mm]: (303.991,72.6464,116.926) + trackID: 50 chamberNb: 2 energy deposit[MeV]: 0.00133706 position[mm]: (298.709,71.5732,73.8395) + trackID: 49 chamberNb: 2 energy deposit[MeV]: 0.00124328 position[mm]: (296.924,71.2277,59.1499) + trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.00185737 position[mm]: (291.693,70.2764,15.0776) + trackID: 39 chamberNb: 1 energy deposit[MeV]: 0.00217464 position[mm]: (218.627,55.571,-603.742) + trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.00329829 position[mm]: (216.423,55.3748,-620.227) + trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.0109844 position[mm]: (216.441,55.1806,-620.126) + trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.00326247 position[mm]: (216.444,55.203,-620.134) + trackID: 90 chamberNb: 1 energy deposit[MeV]: 0.0031628 position[mm]: (216.409,55.3652,-620.242) + trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.00996907 position[mm]: (215.694,55.0122,-627.334) + trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.00274138 position[mm]: (215.689,55.029,-627.326) + trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.00733792 position[mm]: (210.923,53.571,-668.127) + trackID: 35 chamberNb: 1 energy deposit[MeV]: 0.00154748 position[mm]: (206.811,52.3874,-702.821) + trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.00127962 position[mm]: (205.713,52.0659,-712.008) + trackID: 33 chamberNb: 1 energy deposit[MeV]: 0.002313 position[mm]: (204.56,51.7206,-721.761) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.00247196 position[mm]: (203.638,51.5513,-729.473) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.0047954 position[mm]: (203.667,51.5443,-729.502) + trackID: 91 chamberNb: 1 energy deposit[MeV]: 0.00158988 position[mm]: (203.638,51.5602,-729.475) + trackID: 31 chamberNb: 1 energy deposit[MeV]: 0.00376778 position[mm]: (203.454,51.3725,-730.834) + trackID: 30 chamberNb: 1 energy deposit[MeV]: 0.00136265 position[mm]: (201.836,50.9253,-744.257) + trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.00345392 position[mm]: (201.1,50.7139,-750.48) + trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.00213223 position[mm]: (196.878,49.4801,-785.222) + trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.00146162 position[mm]: (115.737,25.3858,-1469.66) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.00196506 position[mm]: (102.837,21.98,-1577) diff --git a/examples/extended/persistency/P01/p01-write.out b/examples/extended/persistency/P01/p01-write.out index 14662af04f..99af9a3d6a 100644 --- a/examples/extended/persistency/P01/p01-write.out +++ b/examples/extended/persistency/P01/p01-write.out @@ -10,7 +10,7 @@ ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -28,10 +28,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -134,32 +132,99 @@ There are 5 chambers in the tracker region. The chambers are 200 mm of XenonGas for neutron : 3 to 6 GeV ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -169,25 +234,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -197,29 +262,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -227,31 +292,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -260,12 +325,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -273,12 +338,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -286,31 +351,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -318,31 +383,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -350,31 +415,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -382,32 +447,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -415,32 +480,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -448,31 +513,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -480,27 +545,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -509,17 +574,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -527,67 +592,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -595,13 +660,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -609,13 +674,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -623,12 +688,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -636,13 +701,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -650,13 +715,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -664,13 +729,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -678,60 +743,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -739,27 +804,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -767,25 +832,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -793,25 +858,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -819,13 +884,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -848,7 +913,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -871,21 +935,21 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Lead Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 94.5861 keV e- 1.00386 MeV e+ 951.321 keV proton 70 keV + Energy thresholds : gamma 94.659 keV e- 1.00699 MeV e+ 946.934 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : XenonGas Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 1.36845 keV e+ 1.34483 keV proton 70 keV + Energy thresholds : gamma 1 keV e- 1.21598 keV e+ 1.19032 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -920,817 +984,1042 @@ CalorimeterSD::Initialize: TrackerChamberSD ExP01/TrackerChamberSD_HC ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 0 fm 0 fm -2.91 m 3 GeV 0 meV 0 fm 0 fm World initStep - 1 0 fm 0 fm -2.7 m 3 GeV 28.5 keV 20.6 cm 20.6 cm World hIoni - 2 3.74 um -4.78 um -2.63 m 3 GeV 11.3 keV 7.09 cm 27.7 cm World hIoni - 3 4.34 um -5.79 um -2.62 m 3 GeV 826 eV 1.03 cm 28.7 cm World hIoni - 4 4.52 um -6.17 um -2.62 m 3 GeV 599 eV 3.33 mm 29 cm World hIoni - 5 14 um -22.4 um -2.45 m 3 GeV 19.8 keV 17 cm 46 cm World Transportation - 6 14.1 um -22.6 um -2.45 m 3 GeV 777 keV 736 um 46.1 cm Target CoulombScat - 7 82.7 um -21.1 um -2.44 m 2.99 GeV 5.89 MeV 5.18 mm 46.6 cm Target hIoni - 8 132 um -12.7 um -2.44 m 2.99 GeV 3.98 MeV 3.57 mm 46.9 cm Target hIoni - 9 356 um -35.9 um -2.42 m 2.96 GeV 23.9 MeV 1.89 cm 48.8 cm Target hIoni - 10 355 um -31.5 um -2.42 m 2.96 GeV 1.79 MeV 1.54 mm 49 cm Target hIoni - 11 351 um -23.8 um -2.42 m 2.95 GeV 3.83 MeV 3.48 mm 49.3 cm Target hIoni - 12 346 um -14.8 um -2.41 m 2.95 GeV 5.32 MeV 5.51 mm 49.9 cm Target hIoni - 13 319 um -32.8 um -2.4 m 2.93 GeV 13.1 MeV 1.11 cm 51 cm Target Transportation - 14 -185 um 72.4 um -2.37 m 2.93 GeV 3.46 keV 3.3 cm 54.3 cm Tracker hIoni - 15 -696 um 180 um -2.33 m 2.93 GeV 2.35 keV 3.34 cm 57.6 cm Tracker hIoni - 16 -6.04 mm 1.3 mm -1.98 m 2.93 GeV 66 keV 35 cm 92.6 cm Tracker hIoni - 17 -6.1 mm 1.31 mm -1.98 m 2.93 GeV 339 eV 3.85 mm 93 cm Tracker hIoni - 18 -7.57 mm 1.63 mm -1.88 m 2.93 GeV 14.5 keV 9.54 cm 1.03 m Tracker hIoni - 19 -8.81 mm 1.91 mm -1.8 m 2.93 GeV 12.8 keV 7.98 cm 1.11 m Tracker hIoni - 20 -1.2 cm 2.6 mm -1.6 m 2.93 GeV 18 keV 20.5 cm 1.31 m Tracker Transportation - 21 -1.22 cm 2.65 mm -1.58 m 2.93 GeV 3.24 keV 1.53 cm 1.33 m Chamber hIoni - 22 -1.24 cm 2.69 mm -1.58 m 2.93 GeV 3.89 keV 9.23 mm 1.33 m Chamber hIoni - 23 -1.29 cm 2.8 mm -1.54 m 2.93 GeV 8.64 keV 3.29 cm 1.37 m Chamber hIoni - 24 -1.33 cm 2.89 mm -1.52 m 2.93 GeV 13.5 keV 2.71 cm 1.39 m Chamber hIoni - 25 -1.41 cm 3.08 mm -1.46 m 2.93 GeV 19.8 keV 5.25 cm 1.45 m Chamber hIoni - 26 -1.5 cm 3.31 mm -1.4 m 2.93 GeV 20.6 keV 6.31 cm 1.51 m Chamber Transportation - 27 -1.79 cm 3.96 mm -1.21 m 2.93 GeV 26.1 keV 19.2 cm 1.7 m Tracker hIoni - 28 -2.15 cm 4.78 mm -97.2 cm 2.93 GeV 34.3 keV 23.6 cm 1.94 m Tracker hIoni - 29 -2.28 cm 5.1 mm -88.2 cm 2.93 GeV 13.8 keV 9.02 cm 2.03 m Tracker hIoni - 30 -2.34 cm 5.24 mm -84.2 cm 2.93 GeV 4.88 keV 3.95 cm 2.07 m Tracker hIoni - 31 -2.4 cm 5.39 mm -80 cm 2.93 GeV 7 keV 4.21 cm 2.11 m Tracker Transportation - 32 -2.46 cm 5.53 mm -76.1 cm 2.93 GeV 25.4 keV 3.93 cm 2.15 m Chamber hIoni - 33 -2.52 cm 5.66 mm -72.4 cm 2.93 GeV 9 keV 3.62 cm 2.19 m Chamber hIoni - 34 -2.55 cm 5.75 mm -70.1 cm 2.93 GeV 11.2 keV 2.4 cm 2.21 m Chamber hIoni - 35 -2.7 cm 6.1 mm -60 cm 2.93 GeV 42.8 keV 10.1 cm 2.31 m Chamber Transportation - 36 -2.72 cm 6.15 mm -58.7 cm 2.93 GeV 2.74 keV 1.31 cm 2.32 m Tracker hIoni - 37 -2.73 cm 6.17 mm -58 cm 2.93 GeV 943 eV 6.41 mm 2.33 m Tracker hIoni - 38 -2.82 cm 6.38 mm -52 cm 2.93 GeV 9.08 keV 6.08 cm 2.39 m Tracker hIoni - 39 -2.87 cm 6.49 mm -48.8 cm 2.93 GeV 4.58 keV 3.15 cm 2.42 m Tracker hIoni - 40 -2.99 cm 6.75 mm -41.1 cm 2.93 GeV 13.9 keV 7.74 cm 2.5 m Tracker hIoni - 41 -3.09 cm 6.99 mm -34.1 cm 2.93 GeV 13.4 keV 6.97 cm 2.57 m Tracker hIoni - 42 -3.17 cm 7.17 mm -28.6 cm 2.93 GeV 9.08 keV 5.47 cm 2.62 m Tracker hIoni - 43 -3.19 cm 7.2 mm -27.6 cm 2.93 GeV 904 eV 1.03 cm 2.63 m Tracker hIoni - 44 -3.21 cm 7.26 mm -25.9 cm 2.93 GeV 4.23 keV 1.67 cm 2.65 m Tracker hIoni - 45 -3.37 cm 7.6 mm -15.4 cm 2.93 GeV 16 keV 10.6 cm 2.76 m Tracker hIoni - 46 -3.43 cm 7.73 mm -11.3 cm 2.93 GeV 5.83 keV 4.05 cm 2.8 m Tracker hIoni - 47 -3.52 cm 7.93 mm -5.23 cm 2.93 GeV 8.08 keV 6.1 cm 2.86 m Tracker hIoni - 48 -3.6 cm 8.11 mm 0.0142 fm 2.93 GeV 10.5 keV 5.23 cm 2.91 m Tracker Transportation - 49 -3.75 cm 8.43 mm 9.61 cm 2.93 GeV 36.3 keV 9.61 cm 3.01 m Chamber hIoni - 50 -3.89 cm 8.75 mm 18.9 cm 2.93 GeV 31.3 keV 9.26 cm 3.1 m Chamber hIoni - 51 -3.9 cm 8.77 mm 19.6 cm 2.93 GeV 5.19 keV 7.68 mm 3.11 m Chamber hIoni - 52 -3.91 cm 8.78 mm 20 cm 2.93 GeV 3.46 keV 3.63 mm 3.11 m Chamber Transportation - 53 -4.12 cm 9.21 mm 33.2 cm 2.93 GeV 17.8 keV 13.2 cm 3.24 m Tracker hIoni - 54 -4.25 cm 9.48 mm 41.7 cm 2.93 GeV 12.3 keV 8.5 cm 3.33 m Tracker hIoni - 55 -4.39 cm 9.76 mm 50.5 cm 2.93 GeV 11.8 keV 8.79 cm 3.42 m Tracker hIoni - 56 -4.43 cm 9.85 mm 53.4 cm 2.93 GeV 4.66 keV 2.87 cm 3.44 m Tracker hIoni - 57 -4.54 cm 1.01 cm 60.4 cm 2.93 GeV 10.3 keV 6.97 cm 3.51 m Tracker hIoni - 58 -4.85 cm 1.07 cm 79.8 cm 2.93 GeV 27.8 keV 19.5 cm 3.71 m Tracker hIoni - 59 -4.85 cm 1.07 cm 80 cm 2.93 GeV 63.6 eV 1.61 mm 3.71 m Tracker Transportation - 60 -4.95 cm 1.09 cm 85.8 cm 2.93 GeV 19.2 keV 5.83 cm 3.77 m Chamber hIoni - 61 -4.98 cm 1.09 cm 88.1 cm 2.93 GeV 6.67 keV 2.31 cm 3.79 m Chamber hIoni - 62 -5.04 cm 1.11 cm 91.8 cm 2.93 GeV 13 keV 3.7 cm 3.83 m Chamber hIoni - 63 -5.14 cm 1.13 cm 98.3 cm 2.93 GeV 24.5 keV 6.45 cm 3.89 m Chamber hIoni - 64 -5.17 cm 1.14 cm 1 m 2.93 GeV 4.8 keV 1.71 cm 3.91 m Chamber Transportation - 65 -5.25 cm 1.16 cm 1.05 m 2.93 GeV 6.07 keV 5.32 cm 3.96 m Tracker hIoni - 66 -5.37 cm 1.18 cm 1.13 m 2.93 GeV 7.86 keV 7.3 cm 4.04 m Tracker hIoni - 67 -5.65 cm 1.25 cm 1.31 m 2.93 GeV 24.1 keV 18.4 cm 4.22 m Tracker hIoni - 68 -5.69 cm 1.26 cm 1.34 m 2.93 GeV 4.02 keV 2.49 cm 4.25 m Tracker hIoni - 69 -5.94 cm 1.32 cm 1.49 m 2.93 GeV 25.9 keV 15.8 cm 4.4 m Tracker hIoni - 70 -6.11 cm 1.36 cm 1.6 m 2.93 GeV 15.7 keV 10.7 cm 4.51 m Tracker Transportation - 71 -6.11 cm 1.36 cm 1.6 m 2.93 GeV 84.6 eV 712 um 4.51 m Chamber hIoni - 72 -6.3 cm 1.41 cm 1.72 m 2.93 GeV 53.4 keV 12.1 cm 4.63 m Chamber hIoni - 73 -6.31 cm 1.41 cm 1.73 m 2.93 GeV 2.94 keV 6.67 mm 4.64 m Chamber hIoni - 74 -6.42 cm 1.44 cm 1.8 m 2.93 GeV 36.5 keV 7.13 cm 4.71 m Chamber Transportation - 75 -6.54 cm 1.47 cm 1.88 m 2.93 GeV 6.62 keV 8.17 cm 4.79 m Tracker hIoni - 76 -6.57 cm 1.48 cm 1.9 m 2.93 GeV 3.22 keV 2.18 cm 4.81 m Tracker hIoni - 77 -6.68 cm 1.51 cm 1.98 m 2.93 GeV 11.9 keV 7.17 cm 4.89 m Tracker hIoni - 78 -7 cm 1.6 cm 2.19 m 2.93 GeV 27 keV 21.1 cm 5.1 m Tracker hIoni - 79 -7.14 cm 1.64 cm 2.28 m 2.93 GeV 10.4 keV 9.37 cm 5.19 m Tracker hIoni - 80 -7.33 cm 1.68 cm 2.4 m 2.93 GeV 19.2 keV 12.1 cm 5.31 m Tracker Transportation - 81 -7.43 cm 1.71 cm 2.47 m 2.93 GeV 9.93 keV 7.06 cm 5.38 m World hIoni - 82 -7.57 cm 1.75 cm 2.56 m 2.93 GeV 11.1 keV 9.11 cm 5.47 m World hIoni - 83 -7.73 cm 1.79 cm 2.67 m 2.93 GeV 14.7 keV 10.4 cm 5.58 m World hIoni - 84 -7.87 cm 1.83 cm 2.76 m 2.93 GeV 14.6 keV 9.41 cm 5.67 m World hIoni - 85 -8.1 cm 1.89 cm 2.91 m 2.93 GeV 20.7 keV 15 cm 5.82 m OutOfWorld Transportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 71, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.87 cm 1.83 cm 2.76 m 1.46 keV 0 meV 0 fm 0 fm World initStep - 1 -7.88 cm 1.83 cm 2.76 m 0 meV 1.46 keV 93.1 um 93.1 um World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 70, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.73 cm 1.79 cm 2.67 m 991 eV 0 meV 0 fm 0 fm World initStep - 1 -7.73 cm 1.79 cm 2.67 m 0 meV 991 eV 52.5 um 52.5 um World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 69, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.57 cm 1.75 cm 2.56 m 1.56 keV 0 meV 0 fm 0 fm World initStep - 1 -7.57 cm 1.75 cm 2.56 m 0 meV 1.56 keV 103 um 103 um World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 68, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.43 cm 1.71 cm 2.47 m 2.47 keV 0 meV 0 fm 0 fm World initStep - 1 -7.43 cm 1.72 cm 2.47 m 0 meV 2.47 keV 212 um 212 um World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 67, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.14 cm 1.64 cm 2.28 m 5.7 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -7.14 cm 1.63 cm 2.28 m 2.93 keV 344 eV 72.2 um 72.2 um Tracker eIoni - 2 -7.13 cm 1.64 cm 2.28 m 0 meV 2.93 keV 283 um 355 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 72, Parent ID = 67 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.14 cm 1.63 cm 2.28 m 2.42 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -7.13 cm 1.63 cm 2.28 m 0 meV 2.42 keV 206 um 206 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 66, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7 cm 1.6 cm 2.19 m 1.14 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -7 cm 1.6 cm 2.19 m 0 meV 1.14 keV 64.2 um 64.2 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 65, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.68 cm 1.51 cm 1.98 m 1.37 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -6.68 cm 1.51 cm 1.98 m 0 meV 1.37 keV 84.1 um 84.1 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 64, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.57 cm 1.48 cm 1.9 m 5.95 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -6.54 cm 1.5 cm 1.9 m 0 meV 5.95 keV 877 um 877 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 63, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.54 cm 1.47 cm 1.88 m 2.48 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -6.53 cm 1.48 cm 1.88 m 0 meV 2.48 keV 214 um 214 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 62, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.31 cm 1.41 cm 1.73 m 14.4 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -6.3 cm 1.43 cm 1.73 m 3.52 keV 10.9 keV 1.71 mm 1.71 mm Chamber eIoni - 2 -6.29 cm 1.43 cm 1.73 m 0 meV 3.52 keV 231 um 1.94 mm Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 61, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.3 cm 1.41 cm 1.72 m 1.86 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -6.3 cm 1.41 cm 1.72 m 0 meV 1.86 keV 94.4 um 94.4 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 60, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.11 cm 1.36 cm 1.6 m 1.73 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -6.11 cm 1.36 cm 1.6 m 0 meV 1.73 keV 85.9 um 85.9 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 59, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.94 cm 1.32 cm 1.49 m 1.2 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -5.94 cm 1.32 cm 1.49 m 0 meV 1.2 keV 69.7 um 69.7 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 58, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.69 cm 1.26 cm 1.34 m 4.07 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -5.67 cm 1.26 cm 1.34 m 0 meV 4.07 keV 497 um 497 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 57, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.65 cm 1.25 cm 1.31 m 12.7 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -5.73 cm 1.24 cm 1.31 m 10.2 keV 1.13 keV 871 um 871 um Tracker eIoni - 2 -5.69 cm 1.34 cm 1.31 m 4.52 keV 5.66 keV 1.8 mm 2.67 mm Tracker eIoni - 3 -5.68 cm 1.36 cm 1.31 m 0 meV 4.52 keV 597 um 3.27 mm Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 73, Parent ID = 57 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.73 cm 1.24 cm 1.31 m 1.37 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -5.73 cm 1.25 cm 1.31 m 0 meV 1.37 keV 84.1 um 84.1 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 56, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.37 cm 1.18 cm 1.13 m 1.65 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -5.37 cm 1.19 cm 1.13 m 0 meV 1.65 keV 112 um 112 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 55, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.25 cm 1.16 cm 1.05 m 1.1 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -5.25 cm 1.16 cm 1.05 m 0 meV 1.1 keV 61.4 um 61.4 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 54, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.14 cm 1.13 cm 98.3 cm 16.1 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -5.17 cm 1.13 cm 98.3 cm 10.7 keV 3.67 keV 1.55 mm 1.55 mm Chamber eIoni - 2 -5.16 cm 1.13 cm 98.3 cm 3.06 keV 5.46 keV 863 um 2.42 mm Chamber eIoni - 3 -5.16 cm 1.13 cm 98.3 cm 0 meV 3.06 keV 189 um 2.6 mm Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 75, Parent ID = 54 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.16 cm 1.13 cm 98.3 cm 2.18 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -5.16 cm 1.13 cm 98.3 cm 0 meV 2.18 keV 118 um 118 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 74, Parent ID = 54 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.17 cm 1.13 cm 98.3 cm 1.74 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -5.17 cm 1.13 cm 98.3 cm 0 meV 1.74 keV 86.2 um 86.2 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 53, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.04 cm 1.11 cm 91.8 cm 1.94 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -5.04 cm 1.11 cm 91.8 cm 0 meV 1.94 keV 100 um 100 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 52, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.98 cm 1.09 cm 88.1 cm 12.7 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -4.96 cm 1.1 cm 88.1 cm 5.05 keV 5.67 keV 1.01 mm 1.01 mm Chamber eIoni - 2 -4.96 cm 1.1 cm 88.1 cm 0 meV 5.05 keV 403 um 1.42 mm Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 76, Parent ID = 52 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.96 cm 1.1 cm 88.1 cm 1.98 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -4.96 cm 1.1 cm 88.1 cm 0 meV 1.98 keV 103 um 103 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 51, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.95 cm 1.09 cm 85.8 cm 4.35 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -4.94 cm 1.09 cm 85.8 cm 0 meV 4.35 keV 318 um 318 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 50, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.85 cm 1.07 cm 79.8 cm 21.1 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -4.81 cm 1.15 cm 79.9 cm 20.3 keV 832 eV 955 um 955 um Tracker msc - 2 -4.76 cm 1.23 cm 79.9 cm 19.4 keV 875 eV 1.04 mm 2 mm Tracker msc - 3 -4.7 cm 1.29 cm 79.8 cm 18.4 keV 1.01 keV 908 um 2.91 mm Tracker msc - 4 -4.65 cm 1.35 cm 79.8 cm 18.2 keV 216 eV 1.01 mm 3.91 mm Tracker msc - 5 -4.56 cm 1.41 cm 79.7 cm 17.1 keV 1.05 keV 1.25 mm 5.17 mm Tracker msc - 6 -4.47 cm 1.54 cm 79.7 cm 14.3 keV 2.85 keV 1.67 mm 6.84 mm Tracker msc - 7 -4.39 cm 1.63 cm 79.6 cm 8.53 keV 5.78 keV 1.81 mm 8.65 mm Tracker msc - 8 -4.38 cm 1.59 cm 79.6 cm 5.61 keV 1.51 keV 854 um 9.5 mm Tracker eIoni - 9 -4.39 cm 1.56 cm 79.6 cm 0 meV 5.61 keV 876 um 1.04 cm Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 77, Parent ID = 50 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.38 cm 1.59 cm 79.6 cm 1.41 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -4.38 cm 1.59 cm 79.6 cm 0 meV 1.41 keV 88.4 um 88.4 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 49, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.54 cm 1.01 cm 60.4 cm 5.18 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -4.53 cm 1.04 cm 60.4 cm 0 meV 5.18 keV 760 um 760 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 48, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.43 cm 9.85 mm 53.4 cm 1.9 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -4.43 cm 9.85 mm 53.4 cm 0 meV 1.9 keV 139 um 139 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 47, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.39 cm 9.76 mm 50.5 cm 1.21 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -4.39 cm 9.78 mm 50.5 cm 0 meV 1.21 keV 70.1 um 70.1 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 46, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.25 cm 9.48 mm 41.7 cm 1.46 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -4.25 cm 9.51 mm 41.7 cm 0 meV 1.46 keV 93.1 um 93.1 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 45, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.12 cm 9.21 mm 33.2 cm 4.6 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -4.12 cm 8.95 mm 33.2 cm 0 meV 4.6 keV 617 um 617 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 44, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.9 cm 8.77 mm 19.6 cm 15.4 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -3.93 cm 8.64 mm 19.6 cm 7.2 keV 8.23 keV 1.81 mm 1.81 mm Chamber eIoni - 2 -3.92 cm 8.66 mm 19.6 cm 0 meV 7.2 keV 711 um 2.52 mm Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 43, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.89 cm 8.75 mm 18.9 cm 4.63 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -3.9 cm 8.74 mm 18.9 cm 0 meV 4.63 keV 351 um 351 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 42, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.75 cm 8.43 mm 9.61 cm 2.34 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -3.75 cm 8.42 mm 9.61 cm 0 meV 2.34 keV 130 um 130 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 41, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.52 cm 7.93 mm -5.23 cm 16.5 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -3.33 cm 7.69 mm -5.2 cm 13.2 keV 3.35 keV 2.72 mm 2.72 mm Tracker eIoni - 2 -3.19 cm 7.34 mm -5.17 cm 9.01 keV 4.16 keV 2.23 mm 4.95 mm Tracker eIoni - 3 -3.17 cm 6.94 mm -5.1 cm 2.56 keV 6.45 keV 1.62 mm 6.57 mm Tracker eIoni - 4 -3.16 cm 6.93 mm -5.09 cm 0 meV 2.56 keV 226 um 6.8 mm Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 40, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.43 cm 7.73 mm -11.3 cm 2.83 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -3.44 cm 7.65 mm -11.3 cm 0 meV 2.83 keV 266 um 266 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 39, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.37 cm 7.6 mm -15.4 cm 5.14 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -3.34 cm 7.6 mm -15.4 cm 0 meV 5.14 keV 750 um 750 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 38, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.21 cm 7.26 mm -25.9 cm 3.41 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -3.23 cm 7.32 mm -25.9 cm 0 meV 3.41 keV 365 um 365 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 37, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.19 cm 7.2 mm -27.6 cm 4.48 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -3.21 cm 7.34 mm -27.6 cm 0 meV 4.48 keV 589 um 589 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 36, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.17 cm 7.17 mm -28.6 cm 1.07 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -3.17 cm 7.19 mm -28.6 cm 0 meV 1.07 keV 59 um 59 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 35, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.09 cm 6.99 mm -34.1 cm 1.66 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -3.09 cm 6.94 mm -34.1 cm 0 meV 1.66 keV 113 um 113 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 34, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.99 cm 6.75 mm -41.1 cm 991 eV 0 meV 0 fm 0 fm Tracker initStep - 1 -2.99 cm 6.76 mm -41.1 cm 0 meV 991 eV 52.5 um 52.5 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 33, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.87 cm 6.49 mm -48.8 cm 1.49 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -2.87 cm 6.46 mm -48.8 cm 0 meV 1.49 keV 95.8 um 95.8 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 32, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.82 cm 6.38 mm -52 cm 4.12 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -2.81 cm 6.26 mm -52 cm 0 meV 4.12 keV 509 um 509 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 31, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.73 cm 6.17 mm -58 cm 2.72 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -2.74 cm 6.27 mm -58 cm 0 meV 2.72 keV 248 um 248 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 30, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.72 cm 6.15 mm -58.7 cm 2.03 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -2.73 cm 6.21 mm -58.7 cm 0 meV 2.03 keV 155 um 155 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 29, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.55 cm 5.75 mm -70.1 cm 2.27 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -2.56 cm 5.75 mm -70.1 cm 0 meV 2.27 keV 124 um 124 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 28, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.52 cm 5.66 mm -72.4 cm 1.46 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -2.52 cm 5.67 mm -72.4 cm 0 meV 1.46 keV 68.1 um 68.1 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 27, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.46 cm 5.53 mm -76.1 cm 2.2 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -2.46 cm 5.52 mm -76.1 cm 0 meV 2.2 keV 119 um 119 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 26, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.34 cm 5.24 mm -84.2 cm 7.43 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -2.28 cm 5.1 mm -84.2 cm 2.6 keV 4.83 keV 1.34 mm 1.34 mm Tracker eIoni - 2 -2.27 cm 5.03 mm -84.2 cm 0 meV 2.6 keV 231 um 1.57 mm Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 25, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.28 cm 5.1 mm -88.2 cm 1.34 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -2.28 cm 5.07 mm -88.2 cm 0 meV 1.34 keV 82 um 82 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 24, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.15 cm 4.78 mm -97.2 cm 2.04 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -2.15 cm 4.84 mm -97.2 cm 0 meV 2.04 keV 155 um 155 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 23, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.79 cm 3.96 mm -1.21 m 1.47 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -1.79 cm 3.98 mm -1.21 m 0 meV 1.47 keV 93.7 um 93.7 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 22, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.41 cm 3.08 mm -1.46 m 2.44 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -1.41 cm 3.07 mm -1.46 m 0 meV 2.44 keV 137 um 137 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 21, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.33 cm 2.89 mm -1.52 m 27.5 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -1.38 cm 2.53 mm -1.52 m 18 keV 9.51 keV 2.91 mm 2.91 mm Chamber eIoni - 2 -1.41 cm 2.53 mm -1.52 m 10.1 keV 7.92 keV 2.04 mm 4.95 mm Chamber eIoni - 3 -1.4 cm 2.5 mm -1.52 m 0 meV 10.1 keV 1.21 mm 6.15 mm Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 20, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.29 cm 2.8 mm -1.54 m 3.57 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -1.29 cm 2.82 mm -1.54 m 0 meV 3.57 keV 235 um 235 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 19, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.24 cm 2.69 mm -1.58 m 1.39 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -1.24 cm 2.69 mm -1.58 m 0 meV 1.39 keV 64 um 64 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 18, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.22 cm 2.65 mm -1.58 m 5.86 keV 0 meV 0 fm 0 fm Chamber initStep - 1 -1.22 cm 2.6 mm -1.58 m 0 meV 5.86 keV 510 um 510 um Chamber eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 17, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -8.81 mm 1.91 mm -1.8 m 1.12 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -8.79 mm 1.89 mm -1.8 m 0 meV 1.12 keV 62.3 um 62.3 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 16, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.57 mm 1.63 mm -1.88 m 1.36 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -7.6 mm 1.66 mm -1.88 m 0 meV 1.36 keV 83 um 83 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 15, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.1 mm 1.31 mm -1.98 m 2.21 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -6.07 mm 1.25 mm -1.98 m 0 meV 2.21 keV 177 um 177 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 14, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.04 mm 1.3 mm -1.98 m 1.95 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -5.98 mm 1.3 mm -1.98 m 0 meV 1.95 keV 145 um 145 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 13, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -696 um 180 um -2.33 m 1.55 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -672 um 148 um -2.33 m 0 meV 1.55 keV 101 um 101 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 12, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -185 um 72.4 um -2.37 m 2.49 keV 0 meV 0 fm 0 fm Tracker initStep - 1 -217 um -10.7 um -2.37 m 0 meV 2.49 keV 216 um 216 um Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 11, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 346 um -14.8 um -2.41 m 1.45 MeV 0 meV 0 fm 0 fm Target initStep - 1 349 um 45.2 um -2.41 m 105 keV 996 keV 969 um 969 um Target eBrem - 2 347 um 45.3 um -2.41 m 0 meV 105 keV 29.5 um 999 um Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 78, Parent ID = 11 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 349 um 45.2 um -2.41 m 350 keV 0 meV 0 fm 0 fm Target initStep - 1 -2.64 mm 1.79 mm -2.41 m 0 meV 88.3 keV 3.64 mm 3.64 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 79, Parent ID = 78 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.64 mm 1.79 mm -2.41 m 262 keV 0 meV 0 fm 0 fm Target initStep - 1 -2.65 mm 1.79 mm -2.41 m 0 meV 262 keV 122 um 122 um Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 10, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 351 um -23.8 um -2.42 m 1.1 MeV 0 meV 0 fm 0 fm Target initStep - 1 331 um -62.9 um -2.42 m 0 meV 1.1 MeV 817 um 817 um Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 355 um -31.5 um -2.42 m 1.03 MeV 0 meV 0 fm 0 fm Target initStep - 1 395 um -28.2 um -2.42 m 0 meV 1.03 MeV 753 um 753 um Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 356 um -35.9 um -2.42 m 1.18 MeV 0 meV 0 fm 0 fm Target initStep - 1 382 um -25.5 um -2.42 m 1 MeV 59.2 keV 60.7 um 60.7 um Target eBrem - 2 428 um -56.4 um -2.42 m 0 meV 1 MeV 732 um 793 um Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 80, Parent ID = 8 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 382 um -25.5 um -2.42 m 114 keV 0 meV 0 fm 0 fm Target initStep - 1 473 um -417 um -2.42 m 0 meV 13 keV 478 um 478 um Target phot + 0 0 fm 0 fm -2.91 m 3 GeV 0 eV 0 fm 0 fm World initStep + 1 0 fm 0 fm -2.7 m 3 GeV 31.9 keV 20.8 cm 20.8 cm World hIoni + 2 1.61 um -2.04 um -2.66 m 3 GeV 8.95 keV 3.82 cm 24.6 cm World hIoni + 3 5.89 um -20 um -2.47 m 3 GeV 28.6 keV 19.2 cm 43.8 cm World hIoni + 4 5.19 um -23.8 um -2.45 m 3 GeV 1.95 keV 2.14 cm 45.9 cm World hIoni + 5 5.17 um -23.9 um -2.45 m 3 GeV 56.8 eV 559 um 46 cm World Transportation + 6 5.14 um -24.1 um -2.45 m 3 GeV 680 keV 517 um 46.1 cm Target hIoni + 7 4.99 um -24 um -2.45 m 3 GeV 268 keV 217 um 46.1 cm Target CoulombScat + 8 -161 um -102 um -2.44 m 2.99 GeV 8.72 MeV 7.38 mm 46.8 cm Target hIoni + 9 -462 um -525 um -2.42 m 2.96 GeV 27.9 MeV 2.45 cm 49.3 cm Target CoulombScat + 10 -585 um -786 um -2.4 m 2.94 GeV 19.4 MeV 1.74 cm 51 cm Target Transportation + 11 -1.12 mm -1.93 mm -2.35 m 2.94 GeV 8.04 keV 5.28 cm 56.3 cm Tracker hIoni + 12 -2.74 mm -5.44 mm -2.19 m 2.94 GeV 28.8 keV 16.1 cm 72.4 cm Tracker hIoni + 13 -2.79 mm -5.54 mm -2.18 m 2.94 GeV 1.23 keV 4.68 mm 72.9 cm Tracker hIoni + 14 -2.79 mm -5.55 mm -2.18 m 2.94 GeV 24.1 eV 315 um 72.9 cm Tracker hIoni + 15 -3.16 mm -6.32 mm -2.15 m 2.94 GeV 6.06 keV 3.57 cm 76.5 cm Tracker hIoni + 16 -5.88 mm -1.22 cm -1.88 m 2.94 GeV 35.5 keV 26.9 cm 1.03 m Tracker hIoni + 17 -6.33 mm -1.31 cm -1.83 m 2.94 GeV 5.21 keV 4.52 cm 1.08 m Tracker hIoni + 18 -6.54 mm -1.36 cm -1.81 m 2.94 GeV 3.1 keV 2.06 cm 1.1 m Tracker hIoni + 19 -8.64 mm -1.82 cm -1.6 m 2.94 GeV 36.4 keV 21 cm 1.31 m Tracker Transportation + 20 -9.15 mm -1.92 cm -1.55 m 2.94 GeV 17.4 keV 4.99 cm 1.36 m Chamber hIoni + 21 -9.47 mm -1.99 cm -1.52 m 2.94 GeV 15.5 keV 3.15 cm 1.39 m Chamber hIoni + 22 -9.81 mm -2.07 cm -1.48 m 2.94 GeV 15.8 keV 3.5 cm 1.43 m Chamber hIoni + 23 -1.01 cm -2.13 cm -1.46 m 2.94 GeV 12.4 keV 2.86 cm 1.46 m Chamber hIoni + 24 -1.05 cm -2.22 cm -1.42 m 2.94 GeV 10.7 keV 3.99 cm 1.5 m Chamber hIoni + 25 -1.07 cm -2.25 cm -1.4 m 2.94 GeV 5.39 keV 1.53 cm 1.51 m Chamber Transportation + 26 -1.3 cm -2.75 cm -1.17 m 2.94 GeV 39.8 keV 23.1 cm 1.74 m Tracker hIoni + 27 -1.59 cm -3.35 cm -88.7 cm 2.94 GeV 39.2 keV 28.3 cm 2.02 m Tracker hIoni + 28 -1.66 cm -3.5 cm -81.8 cm 2.94 GeV 11.5 keV 6.9 cm 2.09 m Tracker hIoni + 29 -1.67 cm -3.54 cm -80 cm 2.94 GeV 2.45 keV 1.77 cm 2.11 m Tracker Transportation + 30 -1.69 cm -3.57 cm -78.4 cm 2.94 GeV 5.69 keV 1.56 cm 2.13 m Chamber hIoni + 31 -1.69 cm -3.58 cm -78.2 cm 2.94 GeV 1.36 keV 2.71 mm 2.13 m Chamber hIoni + 32 -1.74 cm -3.67 cm -73.5 cm 2.94 GeV 25.2 keV 4.62 cm 2.17 m Chamber hIoni + 33 -1.74 cm -3.67 cm -73.5 cm 2.94 GeV 16 eV 71.4 um 2.18 m Chamber hIoni + 34 -1.79 cm -3.78 cm -68.8 cm 2.94 GeV 9.01 keV 4.76 cm 2.22 m Chamber hIoni + 35 -1.88 cm -3.97 cm -60 cm 2.94 GeV 25.3 keV 8.74 cm 2.31 m Chamber hIoni + 36 -1.88 cm -3.97 cm -60 cm 2.94 GeV 389 eV 486 um 2.31 m Chamber Transportation + 37 -1.96 cm -4.15 cm -51.5 cm 2.94 GeV 11.4 keV 8.54 cm 2.4 m Tracker hIoni + 38 -2.03 cm -4.29 cm -45.1 cm 2.94 GeV 10.9 keV 6.39 cm 2.46 m Tracker hIoni + 39 -2.04 cm -4.32 cm -43.4 cm 2.94 GeV 2.11 keV 1.66 cm 2.48 m Tracker hIoni + 40 -2.07 cm -4.38 cm -41.1 cm 2.94 GeV 2.53 keV 2.36 cm 2.5 m Tracker hIoni + 41 -2.16 cm -4.58 cm -31.4 cm 2.94 GeV 15 keV 9.6 cm 2.6 m Tracker hIoni + 42 -2.47 cm -5.26 cm 0.0568 fm 2.94 GeV 38.9 keV 31.5 cm 2.91 m Tracker Transportation + 43 -2.47 cm -5.27 cm 3.57 mm 2.94 GeV 989 eV 3.57 mm 2.91 m Chamber hIoni + 44 -2.54 cm -5.41 cm 6.69 cm 2.94 GeV 24.7 keV 6.34 cm 2.98 m Chamber hIoni + 45 -2.56 cm -5.46 cm 9.15 cm 2.94 GeV 11.8 keV 2.46 cm 3 m Chamber hIoni + 46 -2.56 cm -5.46 cm 9.44 cm 2.94 GeV 570 eV 2.87 mm 3.01 m Chamber hIoni + 47 -2.58 cm -5.49 cm 10.5 cm 2.94 GeV 4.22 keV 1.04 cm 3.02 m Chamber hIoni + 48 -2.59 cm -5.53 cm 12.3 cm 2.94 GeV 6.77 keV 1.84 cm 3.03 m Chamber hIoni + 49 -2.63 cm -5.6 cm 15.8 cm 2.94 GeV 15 keV 3.47 cm 3.07 m Chamber hIoni + 50 -2.63 cm -5.61 cm 16.2 cm 2.94 GeV 1.1 keV 3.66 mm 3.07 m Chamber hIoni + 51 -2.66 cm -5.66 cm 18.7 cm 2.94 GeV 9.33 keV 2.51 cm 3.1 m Chamber hIoni + 52 -2.67 cm -5.69 cm 20 cm 2.94 GeV 2.08 keV 1.34 cm 3.11 m Chamber Transportation + 53 -2.79 cm -5.96 cm 32.2 cm 2.94 GeV 25.3 keV 12.2 cm 3.23 m Tracker hIoni + 54 -2.93 cm -6.26 cm 46.3 cm 2.94 GeV 22.9 keV 14.1 cm 3.37 m Tracker hIoni + 55 -3.26 cm -6.98 cm 80 cm 2.94 GeV 52.1 keV 33.7 cm 3.71 m Tracker Transportation + 56 -3.29 cm -7.05 cm 83.1 cm 2.94 GeV 6.49 keV 3.14 cm 3.74 m Chamber hIoni + 57 -3.38 cm -7.25 cm 92.3 cm 2.94 GeV 53 keV 9.2 cm 3.83 m Chamber hIoni + 58 -3.42 cm -7.33 cm 95.9 cm 2.94 GeV 11.1 keV 3.6 cm 3.87 m Chamber hIoni + 59 -3.46 cm -7.41 cm 1 m 2.94 GeV 18.2 keV 4.06 cm 3.91 m Chamber Transportation + 60 -3.46 cm -7.42 cm 1 m 2.94 GeV 187 eV 2.94 mm 3.91 m Tracker hIoni + 61 -3.47 cm -7.44 cm 1.01 m 2.94 GeV 1.2 keV 9.31 mm 3.92 m Tracker hIoni + 62 -3.48 cm -7.47 cm 1.02 m 2.94 GeV 1.62 keV 1.18 cm 3.94 m Tracker hIoni + 63 -3.52 cm -7.53 cm 1.05 m 2.94 GeV 3.09 keV 3 cm 3.97 m Tracker hIoni + 64 -3.57 cm -7.65 cm 1.11 m 2.94 GeV 8.57 keV 5.28 cm 4.02 m Tracker hIoni + 65 -3.57 cm -7.65 cm 1.11 m 2.94 GeV 0 eV 3.12 mm 4.02 m Tracker hIoni + 66 -3.59 cm -7.68 cm 1.12 m 2.94 GeV 1.33 keV 1.4 cm 4.03 m Tracker hIoni + 67 -3.59 cm -7.69 cm 1.13 m 2.94 GeV 157 eV 1.48 mm 4.04 m Tracker hIoni + 68 -3.94 cm -8.41 cm 1.46 m 2.94 GeV 49.4 keV 33.6 cm 4.37 m Tracker hIoni + 69 -3.97 cm -8.49 cm 1.49 m 2.94 GeV 6.17 keV 3.34 cm 4.41 m Tracker hIoni + 70 -4.08 cm -8.71 cm 1.6 m 2.94 GeV 10.4 keV 10.5 cm 4.51 m Tracker Transportation + 71 -4.16 cm -8.88 cm 1.68 m 2.94 GeV 32.5 keV 7.77 cm 4.59 m Chamber hIoni + 72 -4.17 cm -8.9 cm 1.69 m 2.94 GeV 1.66 keV 9.05 mm 4.6 m Chamber hIoni + 73 -4.26 cm -9.08 cm 1.77 m 2.94 GeV 26.2 keV 8.28 cm 4.68 m Chamber hIoni + 74 -4.29 cm -9.15 cm 1.8 m 2.94 GeV 8.69 keV 3.06 cm 4.71 m Chamber Transportation + 75 -4.31 cm -9.18 cm 1.81 m 2.94 GeV 2.17 keV 1.41 cm 4.73 m Tracker hIoni + 76 -4.37 cm -9.3 cm 1.87 m 2.94 GeV 10.3 keV 5.63 cm 4.78 m Tracker hIoni + 77 -4.4 cm -9.36 cm 1.9 m 2.94 GeV 3.8 keV 2.53 cm 4.81 m Tracker hIoni + 78 -4.42 cm -9.4 cm 1.92 m 2.94 GeV 1.48 keV 2.25 cm 4.83 m Tracker hIoni + 79 -4.45 cm -9.46 cm 1.94 m 2.94 GeV 4.58 keV 2.49 cm 4.85 m Tracker hIoni + 80 -4.5 cm -9.56 cm 1.99 m 2.94 GeV 6.5 keV 4.48 cm 4.9 m Tracker hIoni + 81 -4.5 cm -9.56 cm 1.99 m 2.94 GeV 307 eV 1.71 mm 4.9 m Tracker hIoni + 82 -4.79 cm -10.1 cm 2.26 m 2.94 GeV 35.9 keV 26.6 cm 5.17 m Tracker hIoni + 83 -4.86 cm -10.3 cm 2.32 m 2.94 GeV 8.55 keV 6.72 cm 5.23 m Tracker hIoni + 84 -4.9 cm -10.4 cm 2.36 m 2.94 GeV 5.76 keV 4.21 cm 5.28 m Tracker hIoni + 85 -4.94 cm -10.5 cm 2.4 m 2.94 GeV 5.44 keV 3.56 cm 5.31 m Tracker Transportation + 86 -5 cm -10.6 cm 2.46 m 2.94 GeV 5.88 keV 5.66 cm 5.37 m World hIoni + 87 -5.07 cm -10.7 cm 2.52 m 2.94 GeV 8.34 keV 6.48 cm 5.43 m World hIoni + 88 -5.09 cm -10.8 cm 2.54 m 2.94 GeV 4.34 keV 1.51 cm 5.45 m World hIoni + 89 -5.11 cm -10.8 cm 2.56 m 2.94 GeV 3.16 keV 2 cm 5.47 m World hIoni + 90 -5.16 cm -10.9 cm 2.6 m 2.94 GeV 7.46 keV 4.46 cm 5.51 m World hIoni + 91 -5.17 cm -10.9 cm 2.61 m 2.94 GeV 3.47 keV 1.35 cm 5.53 m World hIoni + 92 -5.2 cm -11 cm 2.64 m 2.94 GeV 2.85 keV 2.29 cm 5.55 m World hIoni + 93 -5.26 cm -11.1 cm 2.69 m 2.94 GeV 5.01 keV 5.28 cm 5.6 m World hIoni + 94 -5.29 cm -11.2 cm 2.72 m 2.94 GeV 6.63 keV 3.44 cm 5.64 m World hIoni + 95 -5.49 cm -11.6 cm 2.91 m 2.94 GeV 27.5 keV 18.6 cm 5.82 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 80, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.29 cm -11.2 cm 2.72 m 3.05 keV 0 eV 0 fm 0 fm World initStep + 1 -5.29 cm -11.2 cm 2.72 m 1.59 keV 147 eV 33.2 um 33.2 um World eIoni + 2 -5.29 cm -11.2 cm 2.72 m 0 eV 1.59 keV 106 um 139 um World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 81, Parent ID = 80 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 473 um -417 um -2.42 m 101 keV 0 meV 0 fm 0 fm Target initStep - 1 473 um -418 um -2.42 m 0 meV 101 keV 27.9 um 27.9 um Target eIoni + 0 -5.29 cm -11.2 cm 2.72 m 1.31 keV 0 eV 0 fm 0 fm World initStep + 1 -5.29 cm -11.2 cm 2.72 m 0 eV 1.31 keV 79.3 um 79.3 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 79, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.26 cm -11.1 cm 2.69 m 50.4 keV 0 eV 0 fm 0 fm World initStep + 1 -4.86 cm -10.3 cm 2.69 m 43.8 keV 6.61 keV 1.12 cm 1.12 cm World eIoni + 2 -4.85 cm -10 cm 2.69 m 40.3 keV 800 eV 2.4 mm 1.36 cm World eIoni + 3 -4.77 cm -9.5 cm 2.69 m 34.4 keV 3.58 keV 6.25 mm 1.98 cm World eIoni + 4 -4.88 cm -9.01 cm 2.69 m 26.3 keV 8.1 keV 6.36 mm 2.62 cm World eIoni + 5 -4.81 cm -8.65 cm 2.69 m 23.6 keV 2.7 keV 4.48 mm 3.06 cm World eIoni + 6 -4.57 cm -8.47 cm 2.69 m 18.6 keV 5.03 keV 3.94 mm 3.46 cm World eIoni + 7 -4.65 cm -8.39 cm 2.69 m 12.7 keV 5.9 keV 3.05 mm 3.76 cm World eIoni + 8 -4.68 cm -8.26 cm 2.69 m 7.93 keV 4.78 keV 2.16 mm 3.98 cm World eIoni + 9 -4.67 cm -8.19 cm 2.69 m 0 eV 7.93 keV 1.44 mm 4.12 cm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 83, Parent ID = 79 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.77 cm -9.5 cm 2.69 m 2.31 keV 0 eV 0 fm 0 fm World initStep + 1 -4.77 cm -9.5 cm 2.69 m 0 eV 2.31 keV 190 um 190 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 82, Parent ID = 79 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.85 cm -10 cm 2.69 m 2.62 keV 0 eV 0 fm 0 fm World initStep + 1 -4.86 cm -10 cm 2.69 m 0 eV 2.62 keV 234 um 234 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 78, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.2 cm -11 cm 2.64 m 1.33 keV 0 eV 0 fm 0 fm World initStep + 1 -5.2 cm -11 cm 2.64 m 0 eV 1.33 keV 80.3 um 80.3 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 77, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.17 cm -10.9 cm 2.61 m 1.42 keV 0 eV 0 fm 0 fm World initStep + 1 -5.17 cm -10.9 cm 2.61 m 0 eV 1.42 keV 88.5 um 88.5 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 76, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.16 cm -10.9 cm 2.6 m 2.49 keV 0 eV 0 fm 0 fm World initStep + 1 -5.16 cm -10.9 cm 2.6 m 0 eV 2.49 keV 215 um 215 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 75, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.11 cm -10.8 cm 2.56 m 1.8 keV 0 eV 0 fm 0 fm World initStep + 1 -5.12 cm -10.8 cm 2.56 m 0 eV 1.8 keV 129 um 129 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 74, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.09 cm -10.8 cm 2.54 m 2.03 keV 0 eV 0 fm 0 fm World initStep + 1 -5.08 cm -10.8 cm 2.54 m 0 eV 2.03 keV 155 um 155 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 73, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.07 cm -10.7 cm 2.52 m 2.76 keV 0 eV 0 fm 0 fm World initStep + 1 -5.08 cm -10.7 cm 2.52 m 0 eV 2.76 keV 255 um 255 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 72, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5 cm -10.6 cm 2.46 m 4.67 keV 0 eV 0 fm 0 fm World initStep + 1 -5.01 cm -10.6 cm 2.46 m 0 eV 4.67 keV 633 um 633 um World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 71, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.9 cm -10.4 cm 2.36 m 9.36 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.9 cm -10.3 cm 2.36 m 2.89 keV 6.47 keV 1.68 mm 1.68 mm Tracker eIoni + 2 -4.9 cm -10.3 cm 2.36 m 0 eV 2.89 keV 276 um 1.96 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 70, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.86 cm -10.3 cm 2.32 m 2.77 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.85 cm -10.3 cm 2.32 m 0 eV 2.77 keV 256 um 256 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 69, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.79 cm -10.1 cm 2.26 m 1.15 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.79 cm -10.1 cm 2.26 m 0 eV 1.15 keV 65.5 um 65.5 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 68, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.5 cm -9.56 cm 1.99 m 1.25 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.5 cm -9.56 cm 1.99 m 0 eV 1.25 keV 73.2 um 73.2 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 67, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.5 cm -9.56 cm 1.99 m 2.69 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.51 cm -9.55 cm 1.99 m 0 eV 2.69 keV 244 um 244 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 66, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.45 cm -9.46 cm 1.94 m 13.3 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.59 cm -9.48 cm 1.94 m 8.54 keV 4.75 keV 2.24 mm 2.24 mm Tracker eIoni + 2 -4.55 cm -9.49 cm 1.94 m 6.24 keV 2.3 keV 1.54 mm 3.79 mm Tracker eIoni + 3 -4.59 cm -9.47 cm 1.94 m 0 eV 6.24 keV 1.06 mm 4.85 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 65, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.42 cm -9.4 cm 1.92 m 3.12 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.41 cm -9.4 cm 1.92 m 0 eV 3.12 keV 313 um 313 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 64, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.4 cm -9.36 cm 1.9 m 7.94 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.35 cm -9.4 cm 1.9 m 2.14 keV 5.8 keV 1.44 mm 1.44 mm Tracker eIoni + 2 -4.34 cm -9.4 cm 1.9 m 0 eV 2.14 keV 168 um 1.61 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 63, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.37 cm -9.3 cm 1.87 m 2.03 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.37 cm -9.3 cm 1.87 m 0 eV 2.03 keV 155 um 155 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 62, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.31 cm -9.18 cm 1.81 m 3.48 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -4.29 cm -9.18 cm 1.81 m 2.01 keV 1.46 keV 196 um 196 um Tracker eIoni + 2 -4.29 cm -9.17 cm 1.81 m 0 eV 2.01 keV 152 um 348 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 61, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.26 cm -9.08 cm 1.77 m 5.38 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -4.26 cm -9.08 cm 1.77 m 2.17 keV 1.84 keV 171 um 171 um Chamber eIoni + 2 -4.26 cm -9.08 cm 1.77 m 0 eV 2.17 keV 117 um 288 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 84, Parent ID = 61 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.26 cm -9.08 cm 1.77 m 1.36 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -4.26 cm -9.08 cm 1.77 m 0 eV 1.36 keV 62 um 62 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 60, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.17 cm -8.9 cm 1.69 m 2.42 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -4.17 cm -8.9 cm 1.69 m 0 eV 2.42 keV 136 um 136 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 59, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.16 cm -8.88 cm 1.68 m 10 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -4.15 cm -8.88 cm 1.68 m 0 eV 10 keV 1.22 mm 1.22 mm Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 58, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.97 cm -8.49 cm 1.49 m 1.61 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.97 cm -8.48 cm 1.49 m 0 eV 1.61 keV 108 um 108 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 57, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.94 cm -8.41 cm 1.46 m 4.95 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.92 cm -8.4 cm 1.46 m 1.45 keV 2.08 keV 313 um 313 um Tracker eIoni + 2 -3.93 cm -8.39 cm 1.46 m 0 eV 1.45 keV 91.6 um 405 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 85, Parent ID = 57 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.92 cm -8.4 cm 1.46 m 1.41 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.92 cm -8.4 cm 1.46 m 0 eV 1.41 keV 88.4 um 88.4 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 56, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.59 cm -7.69 cm 1.13 m 1.93 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.59 cm -7.68 cm 1.13 m 0 eV 1.93 keV 143 um 143 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 55, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.59 cm -7.68 cm 1.12 m 6.91 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.59 cm -7.63 cm 1.12 m 2.61 keV 4.3 keV 1.23 mm 1.23 mm Tracker eIoni + 2 -3.6 cm -7.63 cm 1.12 m 0 eV 2.61 keV 232 um 1.46 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 54, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.57 cm -7.65 cm 1.11 m 1.59 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.57 cm -7.66 cm 1.11 m 0 eV 1.59 keV 105 um 105 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 53, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.57 cm -7.65 cm 1.11 m 3.81 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.58 cm -7.66 cm 1.11 m 0 eV 3.81 keV 444 um 444 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 52, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.52 cm -7.53 cm 1.05 m 2.24 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.52 cm -7.54 cm 1.05 m 0 eV 2.24 keV 181 um 181 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 51, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.48 cm -7.47 cm 1.02 m 17.3 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.69 cm -7.51 cm 1.02 m 15.4 keV 1.92 keV 2.84 mm 2.84 mm Tracker eIoni + 2 -3.57 cm -7.42 cm 1.03 m 11.2 keV 4.19 keV 2.55 mm 5.39 mm Tracker eIoni + 3 -3.62 cm -7.32 cm 1.03 m 4.57 keV 4.12 keV 1.84 mm 7.23 mm Tracker eIoni + 4 -3.63 cm -7.3 cm 1.03 m 0 eV 4.57 keV 609 um 7.84 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 86, Parent ID = 51 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.62 cm -7.32 cm 1.03 m 2.51 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.61 cm -7.32 cm 1.03 m 0 eV 2.51 keV 217 um 217 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 50, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.47 cm -7.44 cm 1.01 m 3.94 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.46 cm -7.46 cm 1.01 m 0 eV 3.94 keV 469 um 469 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 49, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.46 cm -7.42 cm 1 m 1.45 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.47 cm -7.42 cm 1 m 0 eV 1.45 keV 91.5 um 91.5 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 48, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.42 cm -7.33 cm 95.9 cm 56.3 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.51 cm -7.16 cm 96 cm 49.2 keV 7.13 keV 6.67 mm 6.67 mm Chamber eIoni + 2 -3.5 cm -7.14 cm 95.9 cm 46.7 keV 675 eV 727 um 7.39 mm Chamber eIoni + 3 -3.45 cm -7.09 cm 95.8 cm 38.7 keV 3.45 keV 2.77 mm 1.02 cm Chamber eIoni + 4 -3.55 cm -7.13 cm 95.8 cm 29.1 keV 9.54 keV 4.18 mm 1.43 cm Chamber eIoni + 5 -3.56 cm -7.17 cm 95.7 cm 23.1 keV 4.3 keV 2.17 mm 1.65 cm Chamber eIoni + 6 -3.57 cm -7.14 cm 95.7 cm 16.3 keV 4.76 keV 1.6 mm 1.81 cm Chamber eBrem + 7 -3.58 cm -7.13 cm 95.7 cm 12.8 keV 332 eV 172 um 1.83 cm Chamber eIoni + 8 -3.59 cm -7.11 cm 95.7 cm 9.47 keV 1.71 keV 454 um 1.87 cm Chamber eIoni + 9 -3.58 cm -7.12 cm 95.7 cm 6.86 keV 1.11 keV 252 um 1.9 cm Chamber eIoni + 10 -3.58 cm -7.12 cm 95.7 cm 0 eV 6.86 keV 668 um 1.97 cm Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 93, Parent ID = 48 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.58 cm -7.12 cm 95.7 cm 1.5 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.58 cm -7.12 cm 95.7 cm 0 eV 1.5 keV 70.8 um 70.8 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 92, Parent ID = 48 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.59 cm -7.11 cm 95.7 cm 1.66 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.59 cm -7.11 cm 95.7 cm 0 eV 1.66 keV 81.1 um 81.1 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 91, Parent ID = 48 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.58 cm -7.13 cm 95.7 cm 3.09 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.57 cm -7.13 cm 95.7 cm 0 eV 3.09 keV 192 um 192 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 90, Parent ID = 48 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.57 cm -7.14 cm 95.7 cm 2.09 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.57 cm -7.12 cm 95.7 cm 0 eV 989 eV 215 um 215 um Chamber phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 94, Parent ID = 90 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.57 cm -7.12 cm 95.7 cm 1.1 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.58 cm -7.12 cm 95.7 cm 0 eV 1.1 keV 47.3 um 47.3 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 89, Parent ID = 48 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.56 cm -7.17 cm 95.7 cm 1.73 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.56 cm -7.17 cm 95.7 cm 0 eV 1.73 keV 85.8 um 85.8 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 88, Parent ID = 48 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.45 cm -7.09 cm 95.8 cm 4.55 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.45 cm -7.08 cm 95.8 cm 0 eV 4.55 keV 346 um 346 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 87, Parent ID = 48 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.5 cm -7.14 cm 95.9 cm 1.79 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.5 cm -7.14 cm 95.9 cm 0 eV 1.79 keV 89.9 um 89.9 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 47, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.38 cm -7.25 cm 92.3 cm 1.59 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.38 cm -7.25 cm 92.3 cm 0 eV 1.59 keV 76.2 um 76.2 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 46, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.29 cm -7.05 cm 83.1 cm 7.49 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -3.29 cm -7.06 cm 83.1 cm 0 eV 7.49 keV 773 um 773 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 45, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.93 cm -6.26 cm 46.3 cm 1.1 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.92 cm -6.26 cm 46.3 cm 0 eV 1.1 keV 61.1 um 61.1 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 44, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.79 cm -5.96 cm 32.2 cm 2.14 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.78 cm -5.95 cm 32.2 cm 0 eV 2.14 keV 168 um 168 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 43, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.66 cm -5.66 cm 18.7 cm 3.78 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -2.65 cm -5.67 cm 18.7 cm 0 eV 3.78 keV 260 um 260 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 42, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.63 cm -5.61 cm 16.2 cm 5.37 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -2.63 cm -5.61 cm 16.2 cm 0 eV 5.37 keV 450 um 450 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 41, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.63 cm -5.6 cm 15.8 cm 2.33 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -2.63 cm -5.6 cm 15.8 cm 0 eV 2.33 keV 129 um 129 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 40, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.59 cm -5.53 cm 12.3 cm 12.6 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -2.6 cm -5.51 cm 12.3 cm 4.05 keV 8.57 keV 1.54 mm 1.54 mm Chamber eIoni + 2 -2.6 cm -5.51 cm 12.3 cm 0 eV 4.05 keV 289 um 1.83 mm Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 39, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.58 cm -5.49 cm 10.5 cm 2.18 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -2.58 cm -5.49 cm 10.5 cm 0 eV 2.18 keV 118 um 118 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 38, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.56 cm -5.46 cm 9.44 cm 2.23 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -2.57 cm -5.46 cm 9.44 cm 0 eV 2.23 keV 122 um 122 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 37, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.56 cm -5.46 cm 9.15 cm 1.68 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -2.56 cm -5.46 cm 9.15 cm 0 eV 1.68 keV 82.3 um 82.3 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 36, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.54 cm -5.41 cm 6.69 cm 1.22 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -2.54 cm -5.4 cm 6.69 cm 0 eV 1.22 keV 53.7 um 53.7 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 35, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.47 cm -5.27 cm 3.57 mm 3 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -2.47 cm -5.27 cm 3.57 mm 0 eV 3 keV 185 um 185 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 34, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.16 cm -4.58 cm -31.4 cm 1.82 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.16 cm -4.58 cm -31.4 cm 0 eV 1.82 keV 130 um 130 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 33, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.07 cm -4.38 cm -41.1 cm 1.38 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.07 cm -4.37 cm -41.1 cm 0 eV 1.38 keV 85.7 um 85.7 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 32, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.04 cm -4.32 cm -43.4 cm 9.12 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.06 cm -4.39 cm -43.4 cm 2.38 keV 5.65 keV 1.05 mm 1.05 mm Tracker eIoni + 2 -2.05 cm -4.39 cm -43.4 cm 0 eV 2.38 keV 200 um 1.25 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 95, Parent ID = 32 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.06 cm -4.39 cm -43.4 cm 1.1 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.06 cm -4.39 cm -43.4 cm 0 eV 1.1 keV 60.7 um 60.7 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 31, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.03 cm -4.29 cm -45.1 cm 1.1 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.03 cm -4.29 cm -45.1 cm 0 eV 1.1 keV 61.3 um 61.3 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 30, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.96 cm -4.15 cm -51.5 cm 2.34 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -1.97 cm -4.15 cm -51.5 cm 0 eV 2.34 keV 195 um 195 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 29, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.88 cm -3.97 cm -60 cm 1.5 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -1.88 cm -3.97 cm -60 cm 0 eV 1.5 keV 70.7 um 70.7 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 28, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.79 cm -3.78 cm -68.8 cm 15.8 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -1.8 cm -3.76 cm -68.8 cm 10.3 keV 4.15 keV 1.42 mm 1.42 mm Chamber eIoni + 2 -1.82 cm -3.75 cm -68.8 cm 0 eV 10.3 keV 1.25 mm 2.68 mm Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 96, Parent ID = 28 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.8 cm -3.76 cm -68.8 cm 1.37 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -1.8 cm -3.76 cm -68.8 cm 0 eV 1.37 keV 62.8 um 62.8 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 27, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.74 cm -3.67 cm -73.5 cm 1.92 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -1.74 cm -3.68 cm -73.5 cm 0 eV 1.92 keV 99 um 99 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 26, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.74 cm -3.67 cm -73.5 cm 1.82 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -1.74 cm -3.67 cm -73.5 cm 0 eV 1.82 keV 91.7 um 91.7 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 25, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.69 cm -3.58 cm -78.2 cm 3.38 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -1.69 cm -3.58 cm -78.2 cm 0 eV 3.38 keV 219 um 219 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 24, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.69 cm -3.57 cm -78.4 cm 4.97 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -1.69 cm -3.57 cm -78.4 cm 3.01 keV 528 eV 56 um 56 um Chamber eIoni + 2 -1.69 cm -3.57 cm -78.4 cm 0 eV 3.01 keV 185 um 241 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 97, Parent ID = 24 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.69 cm -3.57 cm -78.4 cm 1.43 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -1.69 cm -3.57 cm -78.4 cm 0 eV 1.43 keV 66.4 um 66.4 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 23, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.66 cm -3.5 cm -81.8 cm 1.74 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -1.66 cm -3.49 cm -81.8 cm 0 eV 1.74 keV 121 um 121 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 22, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.59 cm -3.35 cm -88.7 cm 2.61 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -1.59 cm -3.35 cm -88.7 cm 0 eV 2.61 keV 232 um 232 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 21, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.3 cm -2.75 cm -1.17 m 2.93 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -1.3 cm -2.73 cm -1.17 m 0 eV 2.93 keV 282 um 282 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 20, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.05 cm -2.22 cm -1.42 m 48.7 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -9.12 mm -2.28 cm -1.41 m 38.7 keV 10 keV 5.52 mm 5.52 mm Chamber eIoni + 2 -8.62 mm -2.19 cm -1.41 m 31.8 keV 6.84 keV 4.18 mm 9.7 mm Chamber eIoni + 3 -8.52 mm -2.23 cm -1.41 m 17.4 keV 5.3 keV 1.97 mm 1.17 cm Chamber eIoni + 4 -8.67 mm -2.25 cm -1.41 m 11.3 keV 4.8 keV 1.16 mm 1.28 cm Chamber eIoni + 5 -8.69 mm -2.26 cm -1.41 m 0 eV 11.3 keV 1.39 mm 1.42 cm Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 99, Parent ID = 20 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -8.67 mm -2.25 cm -1.41 m 1.3 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -8.66 mm -2.25 cm -1.41 m 0 eV 1.3 keV 58.8 um 58.8 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 98, Parent ID = 20 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -8.52 mm -2.23 cm -1.41 m 9.1 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -8.54 mm -2.22 cm -1.41 m 6.11 keV 617 eV 139 um 139 um Chamber eIoni + 2 -8.48 mm -2.23 cm -1.41 m 0 eV 6.11 keV 555 um 694 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 100, Parent ID = 98 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -8.54 mm -2.22 cm -1.41 m 2.37 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -8.54 mm -2.23 cm -1.41 m 0 eV 2.37 keV 132 um 132 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 19, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.01 cm -2.13 cm -1.46 m 1.26 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -1.01 cm -2.13 cm -1.46 m 0 eV 1.26 keV 56.3 um 56.3 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 18, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -9.81 mm -2.07 cm -1.48 m 3.73 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -9.8 mm -2.07 cm -1.48 m 0 eV 3.73 keV 254 um 254 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 17, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -9.47 mm -1.99 cm -1.52 m 4.79 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -9.5 mm -1.99 cm -1.52 m 0 eV 4.79 keV 375 um 375 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 16, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -9.15 mm -1.92 cm -1.55 m 8.28 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -9.21 mm -1.93 cm -1.55 m 2.45 keV 4.17 keV 379 um 379 um Chamber eIoni + 2 -9.2 mm -1.93 cm -1.55 m 0 eV 2.45 keV 139 um 518 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 101, Parent ID = 16 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -9.21 mm -1.93 cm -1.55 m 1.66 keV 0 eV 0 fm 0 fm Chamber initStep + 1 -9.21 mm -1.93 cm -1.55 m 0 eV 1.66 keV 80.9 um 80.9 um Chamber eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 15, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -6.54 mm -1.36 cm -1.81 m 1.56 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -6.5 mm -1.36 cm -1.81 m 0 eV 1.56 keV 103 um 103 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 14, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -6.33 mm -1.31 cm -1.83 m 1.1 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -6.35 mm -1.31 cm -1.83 m 0 eV 1.1 keV 60.8 um 60.8 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 13, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.88 mm -1.22 cm -1.88 m 1.25 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -5.9 mm -1.22 cm -1.88 m 0 eV 1.25 keV 73.5 um 73.5 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 12, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.16 mm -6.32 mm -2.15 m 6.57 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -3.45 mm -5.93 mm -2.15 m 0 eV 6.57 keV 1.15 mm 1.15 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 11, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.79 mm -5.55 mm -2.18 m 1.19 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.77 mm -5.53 mm -2.18 m 0 eV 1.19 keV 68 um 68 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 10, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.79 mm -5.54 mm -2.18 m 1.22 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.77 mm -5.57 mm -2.18 m 0 eV 1.22 keV 70.8 um 70.8 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.74 mm -5.44 mm -2.19 m 1.72 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.79 mm -5.43 mm -2.19 m 0 eV 1.72 keV 119 um 119 um Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.12 mm -1.93 mm -2.35 m 1.39 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -1.08 mm -1.93 mm -2.35 m 0 eV 1.39 keV 86.4 um 86.4 um Tracker eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 7, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 132 um -12.7 um -2.44 m 1.8 MeV 0 meV 0 fm 0 fm Target initStep - 1 161 um 59.5 um -2.44 m 454 keV 1.35 MeV 1.32 mm 1.32 mm Target eIoni - 2 177 um 65.2 um -2.44 m 0 meV 454 keV 267 um 1.59 mm Target eIoni + 0 -161 um -102 um -2.44 m 1.88 MeV 0 eV 0 fm 0 fm Target initStep + 1 -134 um -27.8 um -2.44 m 33.9 keV 1.85 MeV 1.36 mm 1.36 mm Target eIoni + 2 -134 um -27.6 um -2.44 m 0 eV 33.9 keV 4.74 um 1.36 mm Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 82.7 um -21.1 um -2.44 m 1.55 MeV 0 meV 0 fm 0 fm Target initStep - 1 18.8 um -21.8 um -2.44 m 0 meV 1.55 MeV 1.18 mm 1.18 mm Target eIoni + 0 5.14 um -24.1 um -2.45 m 1.09 MeV 0 eV 0 fm 0 fm Target initStep + 1 30 um -59.5 um -2.45 m 0 eV 1.09 MeV 808 um 808 um Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 4.52 um -6.17 um -2.62 m 7.04 keV 0 meV 0 fm 0 fm World initStep - 1 -17.7 um -565 um -2.62 m 0 meV 7.04 keV 1.26 mm 1.26 mm World eIoni + 0 5.19 um -23.8 um -2.45 m 2.82 keV 0 eV 0 fm 0 fm World initStep + 1 104 um 24.1 um -2.45 m 0 eV 2.82 keV 264 um 264 um World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 4.34 um -5.79 um -2.62 m 2.79 keV 0 meV 0 fm 0 fm World initStep - 1 45.8 um 94.2 um -2.62 m 0 meV 2.79 keV 260 um 260 um World eIoni + 0 5.89 um -20 um -2.47 m 1.16 keV 0 eV 0 fm 0 fm World initStep + 1 -18.8 um -24.6 um -2.47 m 0 eV 1.16 keV 66.1 um 66.1 um World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 3.74 um -4.78 um -2.63 m 1.07 keV 0 meV 0 fm 0 fm World initStep - 1 15 um -23.6 um -2.63 m 0 meV 1.07 keV 58.5 um 58.5 um World eIoni + 0 1.61 um -2.04 um -2.66 m 2.28 keV 0 eV 0 fm 0 fm World initStep + 1 64 um 42.4 um -2.66 m 0 eV 2.28 keV 187 um 187 um World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 0 fm 0 fm -2.7 m 2.67 keV 0 meV 0 fm 0 fm World initStep - 1 -97.6 um 23.8 um -2.7 m 0 meV 2.67 keV 242 um 242 um World eIoni + 0 0 fm 0 fm -2.7 m 1.87 keV 0 eV 0 fm 0 fm World initStep + 1 -11.8 um -53.5 um -2.7 m 0 eV 1.87 keV 136 um 136 um World eIoni --------->Storing hits in the ROOT file: in this event there are 51 hits in the tracker chambers: - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0032367577862829 position[mm]: (-12.217143484268,2.6537541520217,-1584.7512101279) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0038909020902619 position[mm]: (-12.359392765747,2.6852197462203,-1575.5254786851) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0086432234994344 position[mm]: (-12.869192398314,2.7982736676222,-1542.6167336847) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.013488065179592 position[mm]: (-13.285877669401,2.893093042258,-1515.5123034392) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.019799082908402 position[mm]: (-14.080912289348,3.080400341017,-1463.0459896301) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.020602761722553 position[mm]: (-15.043156359496,3.3067494279718,-1400) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.025375327843659 position[mm]: (-24.632661405201,5.5299855614008,-760.68235408645) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0089995215177201 position[mm]: (-25.175612577606,5.6619861640037,-724.49018213782) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.011218311911537 position[mm]: (-25.536333695236,5.7481293650857,-700.5228573556) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.042764492822408 position[mm]: (-27.04415779892,6.1041959133294,-600) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.036265222722244 position[mm]: (-37.493820979,8.4343049735897,96.095487167117) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.031270863748773 position[mm]: (-38.921864036021,8.7490318218555,188.68983585772) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0051878239038407 position[mm]: (-39.042072790839,8.7726604233073,196.36829372058) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.003455252805066 position[mm]: (-39.099059215178,8.784110819844,200) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.019164418615935 position[mm]: (-49.451755109437,10.865700149009,858.24559461144) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0066662840343641 position[mm]: (-49.820319177297,10.945026096131,881.36034838297) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.013018296842257 position[mm]: (-50.409374357088,11.070827583979,918.39583654881) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.024542605845295 position[mm]: (-51.441390764267,11.297257304433,982.91599313563) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0048026947612688 position[mm]: (-51.707292090808,11.361826303122,1000) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 8.4580460175478e-05 position[mm]: (-61.081095593293,13.64426809231,1600.7123311983) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.053396457137452 position[mm]: (-62.967253609387,14.119392465359,1722.0252623553) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0029426018511021 position[mm]: (-63.068970850147,14.145436478869,1728.697672026) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.036500113888715 position[mm]: (-64.157617530564,14.412123574484,1800) - trackID: 62 chamberNb: 4 energy deposit[MeV]: 0.010884176370196 position[mm]: (-62.954412837266,14.334658455238,1728.7258122412) - trackID: 62 chamberNb: 4 energy deposit[MeV]: 0.0035237688694303 position[mm]: (-62.934030985272,14.318900513533,1728.7321871898) - trackID: 61 chamberNb: 4 energy deposit[MeV]: 0.0018582963578881 position[mm]: (-62.966495829679,14.130435470291,1722.025717278) - trackID: 60 chamberNb: 4 energy deposit[MeV]: 0.0017340417881193 position[mm]: (-61.090878410202,13.647216883588,1600.7126011438) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.0036734807673693 position[mm]: (-51.704753771047,11.30789825149,982.94592264596) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.0054605163088496 position[mm]: (-51.56671654441,11.307047697886,982.94295156886) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.0030602766620297 position[mm]: (-51.574917267938,11.293160538551,982.92797963037) - trackID: 75 chamberNb: 3 energy deposit[MeV]: 0.0021837543236939 position[mm]: (-51.579144474981,11.312425047666,982.94472045701) - trackID: 74 chamberNb: 3 energy deposit[MeV]: 0.0017388043953873 position[mm]: (-51.704582860814,11.301285753054,982.95375688718) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0019443045419797 position[mm]: (-50.397796206941,11.072406253449,918.39654200879) - trackID: 52 chamberNb: 3 energy deposit[MeV]: 0.0056671859037563 position[mm]: (-49.641200480129,10.968654323429,881.38392636601) - trackID: 52 chamberNb: 3 energy deposit[MeV]: 0.0050538722377288 position[mm]: (-49.60432303514,10.98838796512,881.39964105792) - trackID: 76 chamberNb: 3 energy deposit[MeV]: 0.0019824270972442 position[mm]: (-49.640318542968,10.960282518149,881.39247487309) - trackID: 51 chamberNb: 3 energy deposit[MeV]: 0.0043514749658497 position[mm]: (-49.41777491251,10.876326618516,858.24849738975) - trackID: 44 chamberNb: 2 energy deposit[MeV]: 0.0082258533692907 position[mm]: (-39.250490207824,8.6412624893738,196.396608054) - trackID: 44 chamberNb: 2 energy deposit[MeV]: 0.0071995540920187 position[mm]: (-39.248086219784,8.6567998517957,196.32337472206) - trackID: 43 chamberNb: 2 energy deposit[MeV]: 0.0046305979230176 position[mm]: (-38.958503654048,8.7353182009436,188.69201684538) - trackID: 42 chamberNb: 2 energy deposit[MeV]: 0.0023420626936928 position[mm]: (-37.484155391722,8.4227639155514,96.096418826826) - trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.0022679598230279 position[mm]: (-25.550206833917,5.7519731256443,-700.52238046979) - trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.001459829754845 position[mm]: (-25.174763471377,5.6703153184513,-724.48987315866) - trackID: 27 chamberNb: 1 energy deposit[MeV]: 0.0022039094484138 position[mm]: (-24.630681734581,5.5163152963875,-760.68161314649) - trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.0024372505270794 position[mm]: (-14.086788916591,3.0655610737853,-1463.0452227094) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.0095108917393424 position[mm]: (-13.785838266835,2.534709333041,-1515.4146985645) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.0079186076670902 position[mm]: (-14.083758181996,2.5260777969691,-1515.3168946543) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.010061492305841 position[mm]: (-13.9629993617,2.4953992619367,-1515.3274162179) - trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0035659652633321 position[mm]: (-12.860297205464,2.823674871599,-1542.6150468182) - trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.0013925785636852 position[mm]: (-12.366188592538,2.6892575104492,-1575.5252971971) - trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.0058616698387091 position[mm]: (-12.204145043404,2.5999048481759,-1584.7464986332) +-------->Storing hits in the ROOT file: in this event there are 91 hits in the tracker chambers: + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.017432162702218 position[mm]: (-9.1468215433972,-19.248876507264,-1550.1360017673) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.015506503341061 position[mm]: (-9.4653935544309,-19.934146385146,-1518.6849067453) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.015750959507912 position[mm]: (-9.813473237527,-20.694591015847,-1483.6993847826) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.012367089625452 position[mm]: (-10.096776611997,-21.31085915638,-1455.1173474007) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.010731513987771 position[mm]: (-10.500648342864,-22.171433727553,-1415.2491314426) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.005391969637253 position[mm]: (-10.655987442546,-22.499250103653,-1400) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0056942560736049 position[mm]: (-16.902473816935,-35.700599078447,-784.42079034573) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0013573489803285 position[mm]: (-16.930128487296,-35.75835363007,-781.70709375794) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.025155084407133 position[mm]: (-17.404054962102,-36.743368239877,-735.49254504019) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 1.5968587698629e-05 position[mm]: (-17.404777861484,-36.744903243565,-735.42118471195) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0090063383042925 position[mm]: (-17.886345677529,-37.767679734091,-687.85459347835) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.025250403999115 position[mm]: (-18.773346325997,-39.662544180222,-600.48560526487) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00038891157914369 position[mm]: (-18.778175454951,-39.672997562531,-600) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00098865241274331 position[mm]: (-24.748452161266,-52.678867547995,3.5665609136377) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.024654638806198 position[mm]: (-25.372246809807,-54.050044051303,66.932579844204) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.011766374522557 position[mm]: (-25.621272161144,-54.585109884701,91.533735336473) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00056994601329141 position[mm]: (-25.649536878572,-54.647261615742,94.398816038694) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0042207197023185 position[mm]: (-25.751999938951,-54.8734708487,104.82689796641) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0067658658719387 position[mm]: (-25.931784388107,-55.27011783688,123.17517309439) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.014998794945296 position[mm]: (-26.271939003595,-56.019505080731,157.88158529128) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0011036147995526 position[mm]: (-26.307794649542,-56.09797505788,161.53734498829) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0093324288344522 position[mm]: (-26.551935809879,-56.635625453216,186.59114028954) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.002076272220099 position[mm]: (-26.681701292501,-56.925357802022,200) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0064903319174729 position[mm]: (-32.881923119036,-70.494282375024,831.38264750901) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.052968109169217 position[mm]: (-33.805429659431,-72.472647076168,923.3633744795) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.011098782796191 position[mm]: (-34.17326282891,-73.255929766375,959.38491718019) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.018158770395322 position[mm]: (-34.591860460987,-74.146645990746,1000) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.032468561750356 position[mm]: (-41.618105026549,-88.78782208899,1677.628436918) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0016598797038381 position[mm]: (-41.712732562378,-88.985449710911,1686.6725448029) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.026171656455158 position[mm]: (-42.587425606175,-90.791413720134,1769.4280844256) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0086928401630491 position[mm]: (-42.917008609881,-91.459839852309,1800) + trackID: 61 chamberNb: 4 energy deposit[MeV]: 0.001843269843861 position[mm]: (-42.635770365608,-90.792779741124,1769.4311470991) + trackID: 61 chamberNb: 4 energy deposit[MeV]: 0.0021737879441599 position[mm]: (-42.629443968447,-90.790140054706,1769.4428592782) + trackID: 84 chamberNb: 4 energy deposit[MeV]: 0.0013594736705426 position[mm]: (-42.633470294541,-90.786001623324,1769.4283919761) + trackID: 60 chamberNb: 4 energy deposit[MeV]: 0.0024220024079834 position[mm]: (-41.698240304684,-88.979154645197,1686.6736291591) + trackID: 59 chamberNb: 4 energy deposit[MeV]: 0.010049000080602 position[mm]: (-41.507297573316,-88.844318540664,1677.6410781798) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.0071284904505198 position[mm]: (-35.118826164707,-71.615559577883,959.87156309475) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00067531328855911 position[mm]: (-35.043560257568,-71.427435990988,959.31326218775) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.0034522124798604 position[mm]: (-34.519805159116,-70.861774530799,958.29364183062) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.0095447754793795 position[mm]: (-35.46111032938,-71.257161436644,957.97624282067) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.0043017084278598 position[mm]: (-35.642216224062,-71.675420501176,957.48464067521) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.0047576219510217 position[mm]: (-35.690039594729,-71.364129218904,957.1479048226) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.00033247925327861 position[mm]: (-35.761057349543,-71.284023302884,957.22146984193) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.0017134547820133 position[mm]: (-35.8635871032,-71.143259808405,957.21102907794) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.001111456888245 position[mm]: (-35.773872899334,-71.181159955374,957.17316074503) + trackID: 48 chamberNb: 3 energy deposit[MeV]: 0.0068559521255505 position[mm]: (-35.836052699074,-71.198538489166,957.19988360647) + trackID: 93 chamberNb: 3 energy deposit[MeV]: 0.0015023242971238 position[mm]: (-35.775634760028,-71.185846910307,957.16608402907) + trackID: 92 chamberNb: 3 energy deposit[MeV]: 0.0016615996298735 position[mm]: (-35.863111055623,-71.135893787499,957.20468096994) + trackID: 91 chamberNb: 3 energy deposit[MeV]: 0.0030871256016422 position[mm]: (-35.745225667419,-71.273162152214,957.21015504517) + trackID: 90 chamberNb: 3 energy deposit[MeV]: 0.00098947 position[mm]: (-35.745036788695,-71.169195673384,957.21932595387) + trackID: 94 chamberNb: 3 energy deposit[MeV]: 0.0011015792675021 position[mm]: (-35.750489664332,-71.167276202834,957.21870190103) + trackID: 89 chamberNb: 3 energy deposit[MeV]: 0.0017329655061533 position[mm]: (-35.645704540087,-71.668579491205,957.49137460991) + trackID: 88 chamberNb: 3 energy deposit[MeV]: 0.0045486412681802 position[mm]: (-34.528863124231,-70.828427934795,958.27732823049) + trackID: 87 chamberNb: 3 energy deposit[MeV]: 0.0017927057961701 position[mm]: (-35.037056423364,-71.421889034088,959.31956392544) + trackID: 47 chamberNb: 3 energy deposit[MeV]: 0.0015873278237905 position[mm]: (-33.806928069654,-72.481764275959,923.36353603552) + trackID: 46 chamberNb: 3 energy deposit[MeV]: 0.0074928332135047 position[mm]: (-32.928364011562,-70.558713978226,831.38779449837) + trackID: 43 chamberNb: 2 energy deposit[MeV]: 0.0037807258840171 position[mm]: (-26.527317880253,-56.651313563751,186.59286953697) + trackID: 42 chamberNb: 2 energy deposit[MeV]: 0.0053661618627703 position[mm]: (-26.326212366271,-56.143241002561,161.5398394415) + trackID: 41 chamberNb: 2 energy deposit[MeV]: 0.0023290228104911 position[mm]: (-26.257005106634,-56.019158738205,157.88247471117) + trackID: 40 chamberNb: 2 energy deposit[MeV]: 0.0085653400393601 position[mm]: (-25.971036249299,-55.095548038004,123.19910430659) + trackID: 40 chamberNb: 2 energy deposit[MeV]: 0.004049042574602 position[mm]: (-26.002815346436,-55.096527628086,123.19392344164) + trackID: 39 chamberNb: 2 energy deposit[MeV]: 0.0021845286631694 position[mm]: (-25.765651203456,-54.873189860045,104.82742076792) + trackID: 38 chamberNb: 2 energy deposit[MeV]: 0.002231641756004 position[mm]: (-25.660727370074,-54.638750664047,94.399568136469) + trackID: 37 chamberNb: 2 energy deposit[MeV]: 0.0016811348575999 position[mm]: (-25.617317606133,-54.576094337133,91.534382043348) + trackID: 36 chamberNb: 2 energy deposit[MeV]: 0.0012166977059289 position[mm]: (-25.372897365968,-54.043457041783,66.93295216926) + trackID: 35 chamberNb: 2 energy deposit[MeV]: 0.003004502944702 position[mm]: (-24.733000309917,-52.664030420514,3.5682332232577) + trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.0015010009702022 position[mm]: (-18.775993901093,-39.654313551781,-600.48511257172) + trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.004152134832362 position[mm]: (-18.041031562437,-37.564716859807,-687.81899299907) + trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.010272667175123 position[mm]: (-18.158535999931,-37.547739029187,-687.7673053038) + trackID: 96 chamberNb: 1 energy deposit[MeV]: 0.0013734253428518 position[mm]: (-18.042688999921,-37.559419068106,-687.82442996675) + trackID: 27 chamberNb: 1 energy deposit[MeV]: 0.0019240474262113 position[mm]: (-17.412114460564,-36.753826548981,-735.42093455665) + trackID: 26 chamberNb: 1 energy deposit[MeV]: 0.001818736106498 position[mm]: (-17.395904935386,-36.736317094595,-735.49184167293) + trackID: 25 chamberNb: 1 energy deposit[MeV]: 0.0033759066424984 position[mm]: (-16.906074494083,-35.765346025314,-781.70551160449) + trackID: 24 chamberNb: 1 energy deposit[MeV]: 0.00052792235643794 position[mm]: (-16.874610347801,-35.683779393165,-784.41780503794) + trackID: 24 chamberNb: 1 energy deposit[MeV]: 0.0030086001719335 position[mm]: (-16.869953451727,-35.695212371067,-784.43544019509) + trackID: 97 chamberNb: 1 energy deposit[MeV]: 0.0014325138120107 position[mm]: (-16.866669660921,-35.682010049182,-784.41687548573) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.01004182352552 position[mm]: (-9.1222893067487,-22.791018107622,-1414.907733907) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0068421346230391 position[mm]: (-8.6219936432329,-21.915037995805,-1414.5545337764) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0053034823906967 position[mm]: (-8.5174698692216,-22.270462613315,-1413.9098436761) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0048020822539405 position[mm]: (-8.6711987079941,-22.516342722303,-1413.8446403173) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.011328818718322 position[mm]: (-8.6949097824848,-22.640875819363,-1413.761502802) + trackID: 99 chamberNb: 0 energy deposit[MeV]: 0.0013049583630391 position[mm]: (-8.6640573737963,-22.516889811799,-1413.8433734896) + trackID: 98 chamberNb: 0 energy deposit[MeV]: 0.00061670822813378 position[mm]: (-8.5359749923858,-22.240880293226,-1413.8374613071) + trackID: 98 chamberNb: 0 energy deposit[MeV]: 0.0061146533357262 position[mm]: (-8.4843789115728,-22.269315048607,-1413.8315049149) + trackID: 100 chamberNb: 0 energy deposit[MeV]: 0.002371749483672 position[mm]: (-8.5399847695878,-22.250617959648,-1413.8486465601) + trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.0012628410324691 position[mm]: (-10.101551258534,-21.305797175162,-1455.1170342707) + trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.003726337028847 position[mm]: (-9.7969110200017,-20.671324009409,-1483.6969380824) + trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0047881772555189 position[mm]: (-9.5049547962692,-19.922731811996,-1518.6821474368) + trackID: 16 chamberNb: 0 energy deposit[MeV]: 0.0041708422912957 position[mm]: (-9.2063182889279,-19.318825507812,-1550.1296210411) + trackID: 16 chamberNb: 0 energy deposit[MeV]: 0.0024523804525132 position[mm]: (-9.20010035045,-19.309345904327,-1550.1181503682) + trackID: 101 chamberNb: 0 energy deposit[MeV]: 0.0016593039659583 position[mm]: (-9.207400055504,-19.325961684516,-1550.123110238) writing Event_1 >>> Event 0 0 trajectories stored in this event. Run terminated. Run Summary Number of events processed : 1 - User=0.330000s Real=3.587627s Sys=0.340000s + User=0.300000s Real=2.532937s Sys=0.360000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1753,21 +2042,21 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Lead Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 94.586138310569 keV e- 1.0038644857808 MeV e+ 951.32127129134 keV proton 70 keV + Energy thresholds : gamma 94.659013046542 keV e- 1.0069920459193 MeV e+ 946.93445358257 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : XenonGas Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 1.3684530084265 keV e+ 1.3448250375664 keV proton 70 keV + Energy thresholds : gamma 1 keV e- 1.2159764674201 keV e+ 1.1903214400869 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1778,345 +2067,264 @@ Index : 2 used in the geometry : Yes CalorimeterSD::Initialize: TrackerChamberSD ExP01/TrackerChamberSD_HC is not found. --------->Storing hits in the ROOT file: in this event there are 108 hits in the tracker chambers: - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0099093924905045 position[mm]: (-207.24427631197,-161.38634952633,-1578.4382875686) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00024423283522575 position[mm]: (-207.41470336463,-161.51709008926,-1577.7530342184) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.014442683435764 position[mm]: (-216.6295949553,-168.56251471209,-1540.8219902201) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.012466327850154 position[mm]: (-225.38939415051,-175.33533951122,-1505.3349820248) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0006964088957732 position[mm]: (-226.05661502127,-175.84597120194,-1502.6313218714) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0095593054501037 position[mm]: (-232.10652422909,-180.49218104773,-1478.0974324272) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0068128499239189 position[mm]: (-237.02364236393,-184.20380629155,-1458.3845272554) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0040336006034772 position[mm]: (-240,-186.44848145289,-1446.4245305678) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 7.350563396054e-05 position[mm]: (-399.51358386035,-306.58415328804,-799.35519276298) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0086664039656574 position[mm]: (-401.8817023648,-308.39021929444,-789.70166893327) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0043602946105023 position[mm]: (-405.71874425017,-311.30927555253,-774.06103544132) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.026870713573612 position[mm]: (-420.86519965157,-322.82482366176,-712.66027862242) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.011382925057681 position[mm]: (-426.16854380727,-326.87730956829,-691.27901627936) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0099785876862476 position[mm]: (-431.15325824536,-330.7124997055,-671.30298295003) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.011501515129341 position[mm]: (-437.36717384163,-335.52842591449,-646.41040036217) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.010159312689052 position[mm]: (-442.17591447516,-339.23603507877,-627.10785055656) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.008272722920559 position[mm]: (-448.94657156931,-344.40715680356,-600) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0033694112679947 position[mm]: (-602.7407856261,-459.96498098523,6.6749277770448) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.042376909782379 position[mm]: (-632.48374114124,-482.60313197688,124.43619396208) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.012907436472698 position[mm]: (-641.72320957533,-489.98972539021,160.84650751991) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0026830933255836 position[mm]: (-643.73513450169,-491.65075240015,168.81557630379) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.002238426761993 position[mm]: (-646.95052774487,-494.31257413038,181.60636829308) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0056700069210212 position[mm]: (-651.55973984708,-498.16724996473,200) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0016581388947727 position[mm]: (-802.65279950871,-625.62953423047,803.70721525839) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.014465597447405 position[mm]: (-813.70700363852,-634.77227758824,847.33913193767) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.042382782665666 position[mm]: (-835.18987873886,-652.64851927742,931.90536543301) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0033213679378505 position[mm]: (-837.12552475697,-654.19972255047,939.34868393383) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0048569100324009 position[mm]: (-840.3145232226,-656.74825865585,951.62979381214) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0063211678925552 position[mm]: (-844.46135900943,-660.05521963103,967.5881722126) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.010318705445027 position[mm]: (-851.75694411523,-665.89213282711,995.68960959374) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0014452958578005 position[mm]: (-852.8689768636,-666.78966920397,1000) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.012187668787886 position[mm]: (-1013.9167517402,-796.52350992893,1623.832745843) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.025487244507295 position[mm]: (-1033.3341071429,-811.31469475791,1698.1384719436) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.019641816856249 position[mm]: (-1048.2851087667,-822.53211787539,1756.3852890232) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0040048412153869 position[mm]: (-1051.1703302414,-824.70618638521,1767.5531004578) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.016495394230663 position[mm]: (-1059.5791708247,-831.05272542736,1800) - trackID: 69 chamberNb: 4 energy deposit[MeV]: 0.0082681329070189 position[mm]: (-1051.3421466794,-824.76252651063,1767.8511109211) - trackID: 68 chamberNb: 4 energy deposit[MeV]: 0.0031157310210214 position[mm]: (-1051.1523186165,-824.69536932899,1767.5612635755) - trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.0086863261615412 position[mm]: (-1048.240676781,-822.62084296821,1756.3895774465) - trackID: 66 chamberNb: 4 energy deposit[MeV]: 0.0023996088358014 position[mm]: (-1033.3355094789,-811.3300540564,1698.1359893772) - trackID: 65 chamberNb: 4 energy deposit[MeV]: 0.0024503386209062 position[mm]: (-1013.9133481938,-796.50851524414,1623.837532421) - trackID: 59 chamberNb: 3 energy deposit[MeV]: 0.0014151617109892 position[mm]: (-851.74974984547,-665.89546125725,995.6911050143) - trackID: 58 chamberNb: 3 energy deposit[MeV]: 0.0027920681083352 position[mm]: (-844.47513967724,-660.04154113364,967.58855943179) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.0059964552598748 position[mm]: (-840.66098084559,-656.70564157904,951.60146021255) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.0017672235276123 position[mm]: (-840.76191031712,-656.82994571568,951.49781369648) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.00093584687125269 position[mm]: (-840.80812329002,-656.92089418582,951.5541219161) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.0033484898722537 position[mm]: (-840.83537938191,-656.95875194561,951.5075977794) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.0032429692198728 position[mm]: (-840.82104092433,-656.95450039272,951.52607433189) - trackID: 90 chamberNb: 3 energy deposit[MeV]: 0.0026260059946511 position[mm]: (-840.81952133983,-656.90782959415,951.55006630032) - trackID: 89 chamberNb: 3 energy deposit[MeV]: 0.0013898909510979 position[mm]: (-840.76699036776,-656.8310716146,951.49188554729) - trackID: 56 chamberNb: 3 energy deposit[MeV]: 0.0062258376935522 position[mm]: (-837.17913321524,-654.22453022331,939.33484882571) - trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.0066752432203414 position[mm]: (-835.31266307041,-652.62027691894,931.89323102204) - trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.003463603605775 position[mm]: (-835.3017885712,-652.60004562246,931.90528076231) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.0022044908345973 position[mm]: (-813.68875293429,-634.79245104449,847.34129454642) - trackID: 54 chamberNb: 3 energy deposit[MeV]: 0.0013932316918893 position[mm]: (-813.68346187168,-634.79829953224,847.34192150843) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0041758807422317 position[mm]: (-799.71764720449,-627.37500176082,803.87792714019) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0039352200357724 position[mm]: (-796.90314214899,-629.0713579399,802.53546413292) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0030603557854572 position[mm]: (-794.42354033394,-627.0516583514,801.82040887175) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.001043274941037 position[mm]: (-793.1445194251,-627.11690773536,802.33733598113) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0045640589480322 position[mm]: (-792.94143905818,-629.27165240656,804.403495021) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0051157355575381 position[mm]: (-793.96906437594,-629.7649946672,807.77266617526) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0063724744194565 position[mm]: (-797.85056379359,-629.63582543223,808.5435357651) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0030931391410429 position[mm]: (-795.77968297596,-627.74863987466,805.66081506565) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0089509282375378 position[mm]: (-797.88095439327,-627.25248022257,803.54011266741) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0066617598992027 position[mm]: (-800.74949154941,-627.44714077246,804.00199188484) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0087590799125775 position[mm]: (-801.30678496969,-629.51776398969,806.0378690949) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.010723739187259 position[mm]: (-801.42637569585,-629.81240227396,806.60917356466) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.01020131918329 position[mm]: (-801.48997583325,-629.53969086197,806.49143780788) - trackID: 53 chamberNb: 3 energy deposit[MeV]: 0.0074061199339969 position[mm]: (-801.50610258258,-629.59984985593,806.44433888222) - trackID: 92 chamberNb: 3 energy deposit[MeV]: 0.0021869921976282 position[mm]: (-792.9286041515,-629.26703629427,804.40238769763) - trackID: 91 chamberNb: 3 energy deposit[MeV]: 0.0023018708029713 position[mm]: (-793.14702524858,-627.11717790223,802.35183061102) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.0017223507968598 position[mm]: (-647.16225864873,-494.30964074935,181.58173650876) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.00010018864582404 position[mm]: (-647.18179417798,-494.23370010822,181.63080831619) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.0071518277247503 position[mm]: (-647.20796274036,-494.24343064383,181.69952915411) - trackID: 94 chamberNb: 2 energy deposit[MeV]: 0.0022706060999177 position[mm]: (-647.17345502258,-494.22293236886,181.635569608) - trackID: 93 chamberNb: 2 energy deposit[MeV]: 0.0031600034618577 position[mm]: (-647.14514248598,-494.29838070194,181.57135603328) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0016622947361143 position[mm]: (-643.72786936084,-491.65717463988,168.81650044947) - trackID: 46 chamberNb: 2 energy deposit[MeV]: 0.0081739915475056 position[mm]: (-641.65045548456,-490.04094050912,160.8631238543) - trackID: 45 chamberNb: 2 energy deposit[MeV]: 0.001604468714265 position[mm]: (-632.49077255214,-482.60879957772,124.43375181209) - trackID: 44 chamberNb: 2 energy deposit[MeV]: 0.0030892432313004 position[mm]: (-602.76268723801,-459.96447809556,6.6708428002602) - trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.0015805183978945 position[mm]: (-442.18412621691,-339.23947046549,-627.11015853716) - trackID: 33 chamberNb: 1 energy deposit[MeV]: 0.0020457260191133 position[mm]: (-437.35533732964,-335.52716236009,-646.40659299547) - trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.0071925301540452 position[mm]: (-431.21133205555,-330.66538903348,-671.30146895126) - trackID: 31 chamberNb: 1 energy deposit[MeV]: 0.001795814985936 position[mm]: (-426.17838620819,-326.87345279348,-691.28024039439) - trackID: 30 chamberNb: 1 energy deposit[MeV]: 0.0018041862903571 position[mm]: (-420.86421429896,-322.83540219442,-712.66154433578) - trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.0017841298998958 position[mm]: (-405.71773035669,-311.2991007604,-774.05839161784) - trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.0085343568621698 position[mm]: (-401.87331570152,-308.4863195575,-789.70786550684) - trackID: 27 chamberNb: 1 energy deposit[MeV]: 0.0020030337462071 position[mm]: (-399.51836452097,-306.59502209542,-799.35780709721) - trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.0071586516996728 position[mm]: (-237.094319194,-184.22176250026,-1458.3986614816) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.0048521584722292 position[mm]: (-232.13395357455,-180.4604201406,-1478.0951108044) - trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0053233916997873 position[mm]: (-226.08892342189,-175.81019701857,-1502.6286867109) - trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.0016216237158232 position[mm]: (-225.38184943944,-175.34093099842,-1505.3337610555) - trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.0016561813509727 position[mm]: (-216.63368797429,-168.57102785271,-1540.8241954885) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0069016488950329 position[mm]: (-205.35721224795,-162.0200484759,-1576.7055947791) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.00088461865916589 position[mm]: (-204.80311435614,-162.3150619689,-1576.3221752746) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.008518406715083 position[mm]: (-204.91933979191,-162.95008012812,-1575.1067147356) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0029855024501187 position[mm]: (-204.38040155206,-163.62015926753,-1575.2198121988) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0021987034254916 position[mm]: (-203.77855223975,-163.852931018,-1575.0707952283) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0081516573418108 position[mm]: (-204.14225746249,-164.24426997738,-1574.8364910757) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0077120261839786 position[mm]: (-203.96544921203,-163.97784851272,-1574.8066062233) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0079741427701077 position[mm]: (-203.8964416596,-163.93296749462,-1574.8353350121) - trackID: 104 chamberNb: 0 energy deposit[MeV]: 0.0025714250648303 position[mm]: (-203.97124735801,-163.97916690163,-1574.8228242848) - trackID: 103 chamberNb: 0 energy deposit[MeV]: 0.003190266163391 position[mm]: (-203.77449449523,-163.86756021333,-1575.0884176754) - trackID: 102 chamberNb: 0 energy deposit[MeV]: 0.0020490718201924 position[mm]: (-204.38462614694,-163.62428898555,-1575.2087682055) - trackID: 101 chamberNb: 0 energy deposit[MeV]: 0.0054151864220394 position[mm]: (-204.68143744673,-162.27920643506,-1576.2887390454) - trackID: 101 chamberNb: 0 energy deposit[MeV]: 0.003409512099041 position[mm]: (-204.68919747665,-162.2654167877,-1576.3086093662) - trackID: 105 chamberNb: 0 energy deposit[MeV]: 0.0015436331153966 position[mm]: (-204.68829244409,-162.28482185382,-1576.289984554) - trackID: 16 chamberNb: 0 energy deposit[MeV]: 0.0062336365213614 position[mm]: (-207.25782164838,-161.44486253678,-1578.4476038257) +-------->Storing hits in the ROOT file: in this event there are 84 hits in the tracker chambers: + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.021562325295832 position[mm]: (39.105544982527,123.99515640368,-1537.8110441557) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0011118956564693 position[mm]: (39.243720316423,124.42852211793,-1534.7235507307) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0055372248474455 position[mm]: (40.31176506644,127.76650925184,-1511.0420535199) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0028813330206017 position[mm]: (40.487036505618,128.32038612115,-1507.1541092223) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.01871959510557 position[mm]: (43.715426917267,138.61476803308,-1435.3316890986) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00089327723313621 position[mm]: (43.896031848836,139.20017928431,-1431.2889840319) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.013179430865415 position[mm]: (44.908999936218,142.50458836593,-1408.4167438466) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0025547501935488 position[mm]: (45.280427283912,143.71748698686,-1400) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.002016799146161 position[mm]: (72.423226474844,231.94846188182,-791.32860663925) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.019181265251933 position[mm]: (74.843387840866,239.48886493288,-739.69610244187) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0048862429181343 position[mm]: (75.394272639915,241.17809763365,-728.18466112405) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0026665557834698 position[mm]: (75.693613911317,242.0831589719,-722.01700225058) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.010216683819344 position[mm]: (76.60606909555,244.82546044433,-703.24367652178) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.015801343921305 position[mm]: (78.453449561097,250.43892865213,-665.44726449945) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.010119642267073 position[mm]: (81.768079174068,260.15750367643,-600) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0057833630107143 position[mm]: (115.80695714843,356.46589223234,25.816235590745) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.01306920055836 position[mm]: (119.01173920357,365.82083563904,83.358291302) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0097055677698844 position[mm]: (121.52898273544,372.7182098779,125.94170465092) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0022980016866721 position[mm]: (121.99531317902,374.02166309758,133.86537790499) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.021396328136125 position[mm]: (125.96718239154,384.72851248145,200) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.00093603697163491 position[mm]: (161.60449325556,482.05154529364,804.6199972106) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0034855179136724 position[mm]: (162.41238015118,484.27151698493,818.25598242879) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.034779012489299 position[mm]: (165.53757290471,492.95643523566,871.66917846288) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.014736709177053 position[mm]: (168.59961045582,501.28545139246,922.87889940136) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0046623063197765 position[mm]: (169.09002885891,502.66593861349,931.34483579834) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.011320951672449 position[mm]: (172.00328135229,510.75200602904,981.14636364485) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0078436711989754 position[mm]: (173.12217657216,513.88154321557,1000) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.036735905069942 position[mm]: (215.36226844079,626.87489717094,1685.6207474114) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0052668685540769 position[mm]: (216.57718951873,629.9531790346,1703.8445269654) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.021524592085022 position[mm]: (219.98384593557,638.38471442282,1753.9894977846) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.00099285906465048 position[mm]: (220.08569705384,638.63275441426,1755.4660681637) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.002153740283056 position[mm]: (220.2556130478,639.04196683545,1757.9096072971) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0027298940773487 position[mm]: (220.51472177224,639.66670681391,1761.6379313354) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.011253933068342 position[mm]: (222.549361785,644.58045081817,1790.8421815956) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0031772982205545 position[mm]: (223.20435093512,646.10933375441,1800) + trackID: 70 chamberNb: 4 energy deposit[MeV]: 0.0013294832217106 position[mm]: (222.55555623741,644.57634173435,1790.8427112629) + trackID: 69 chamberNb: 4 energy deposit[MeV]: 0.0036294472410319 position[mm]: (220.50193529059,639.69118221234,1761.6364600454) + trackID: 68 chamberNb: 4 energy deposit[MeV]: 0.0028980968467966 position[mm]: (220.23533706143,639.04138075194,1757.9122758095) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.006382791268234 position[mm]: (219.43000214081,639.20205483385,1755.5843514116) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.003244949317294 position[mm]: (219.63478569797,639.77157998459,1755.7646554387) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.0059695184514318 position[mm]: (219.17301210162,639.55556794319,1755.6956357002) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.0097162196688147 position[mm]: (219.21986738375,639.53763759793,1755.4169694134) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.004185209997748 position[mm]: (219.2744585093,639.52556018852,1755.3696764763) + trackID: 67 chamberNb: 4 energy deposit[MeV]: 0.0028952054788173 position[mm]: (219.26863378556,639.51740888059,1755.3518701388) + trackID: 89 chamberNb: 4 energy deposit[MeV]: 0.0016866142660281 position[mm]: (219.17743815903,639.56442543557,1755.6957580483) + trackID: 66 chamberNb: 4 energy deposit[MeV]: 0.0040057702967579 position[mm]: (219.95812341627,638.3674358037,1753.9962851849) + trackID: 65 chamberNb: 4 energy deposit[MeV]: 0.0015848708357349 position[mm]: (216.58400030848,629.94703195524,1703.8454852553) + trackID: 64 chamberNb: 4 energy deposit[MeV]: 0.001321603810722 position[mm]: (215.36326758627,626.8677111612,1685.6221782755) + trackID: 60 chamberNb: 3 energy deposit[MeV]: 0.0017218305506316 position[mm]: (171.99574229411,510.74551914807,981.14833118308) + trackID: 59 chamberNb: 3 energy deposit[MeV]: 0.007709044093692 position[mm]: (169.01281152643,502.69556002532,931.35219905038) + trackID: 58 chamberNb: 3 energy deposit[MeV]: 0.0018449483623277 position[mm]: (168.600543592,501.29631413143,922.87757090325) + trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.002481357626044 position[mm]: (165.52394796293,492.96557239833,871.66936753988) + trackID: 56 chamberNb: 3 energy deposit[MeV]: 0.0028250353223492 position[mm]: (162.42602060088,484.28566292159,818.25398933978) + trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.00085822703777198 position[mm]: (161.53876328859,482.11629064773,804.6227980843) + trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.0034600232895128 position[mm]: (161.54805235212,482.15575478327,804.60318710225) + trackID: 55 chamberNb: 3 energy deposit[MeV]: 0.0016151235382073 position[mm]: (161.55330523274,482.14982540688,804.59807794715) + trackID: 90 chamberNb: 3 energy deposit[MeV]: 0.0035803769055112 position[mm]: (161.51503323955,482.11546298878,804.60963345702) + trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0055610939280041 position[mm]: (118.27600444905,383.65406239454,138.33673339789) + trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.017085645793798 position[mm]: (102.88862973818,403.38322527681,182.76695342937) + trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00097896202022103 position[mm]: (103.77147481115,405.45693927466,188.00485777533) + trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0060108875468213 position[mm]: (105.5834209938,410.41647983834,200) + trackID: 94 chamberNb: 2 energy deposit[MeV]: 0.0019049639703451 position[mm]: (103.77148738,405.46760120679,188.00078259792) + trackID: 93 chamberNb: 2 energy deposit[MeV]: 0.0040483599590376 position[mm]: (102.91354546105,403.36294154118,182.76918650528) + trackID: 92 chamberNb: 2 energy deposit[MeV]: 0.0014396379050038 position[mm]: (118.26897018653,383.65325333977,138.33252276121) + trackID: 46 chamberNb: 2 energy deposit[MeV]: 0.0027275882605582 position[mm]: (121.46986945149,372.72994936593,125.94830134866) + trackID: 46 chamberNb: 2 energy deposit[MeV]: 0.002267529121678 position[mm]: (121.47119228306,372.73819709345,125.96003291874) + trackID: 136 chamberNb: 2 energy deposit[MeV]: 0.001283670422922 position[mm]: (121.47364954257,372.73468181366,125.94456258769) + trackID: 45 chamberNb: 2 energy deposit[MeV]: 0.0025090824677586 position[mm]: (118.99616952007,365.82674312714,83.359133867984) + trackID: 44 chamberNb: 2 energy deposit[MeV]: 0.0019059663327929 position[mm]: (115.81663928651,356.45990844823,25.817185394675) + trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.0015533877654716 position[mm]: (78.450833538888,250.44752003566,-665.44803464993) + trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0032634621379113 position[mm]: (76.626649527136,244.8133246824,-703.24144157592) + trackID: 35 chamberNb: 1 energy deposit[MeV]: 0.0014816979352502 position[mm]: (75.699620884977,242.07717655812,-722.01607568733) + trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.0012948929639286 position[mm]: (75.387115919643,241.17769780588,-728.18398305327) + trackID: 33 chamberNb: 1 energy deposit[MeV]: 0.0013633610258181 position[mm]: (74.83960511607,239.48231731667,-739.6946621599) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.0019248136527263 position[mm]: (72.425777333703,231.95967078661,-791.32983083545) + trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.0030693267397763 position[mm]: (44.930727545598,142.5086913737,-1408.4170094255) + trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.002880954593076 position[mm]: (43.89310297065,139.22019482769,-1431.2906037821) + trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.0012209092714778 position[mm]: (43.715675789639,138.62138385052,-1435.3324139853) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0030674621301966 position[mm]: (40.46553702072,128.31616451247,-1507.1512547686) + trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.0048982535627939 position[mm]: (40.064760810386,127.81734004279,-1511.0048766588) + trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.0080900344059036 position[mm]: (40.139147321786,127.79790419796,-1511.0502477296) + trackID: 138 chamberNb: 0 energy deposit[MeV]: 0.002717211209925 position[mm]: (40.054553927391,127.80932092199,-1511.0183437441) + trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.00248524863102 position[mm]: (39.23051320445,124.4191283153,-1534.7207716009) + trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0014910600706122 position[mm]: (39.097400926402,123.99787523392,-1537.8107133395) writing Event_2 >>> Event 0 0 trajectories stored in this event. CalorimeterSD::Initialize: TrackerChamberSD ExP01/TrackerChamberSD_HC is not found. --------->Storing hits in the ROOT file: in this event there are 105 hits in the tracker chambers: - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00014223734398682 position[mm]: (-182.71390133485,-89.150416683525,-1598.289775715) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.011744830941486 position[mm]: (-188.96320671505,-92.186306002581,-1570.3638170964) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0024111599182691 position[mm]: (-190.71253647726,-93.030550393437,-1562.5309387227) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.010266622136434 position[mm]: (-195.37501609241,-95.291126046103,-1541.6345644077) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.010804261454859 position[mm]: (-200.43491607734,-97.830153976991,-1518.7625201178) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.024319710223237 position[mm]: (-211.87350777018,-103.5304508973,-1466.6811170962) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.005558355380741 position[mm]: (-214.39659236921,-104.83021411331,-1454.9940674382) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0017564558285224 position[mm]: (-215.57076687006,-105.44144506703,-1449.5856042745) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.013037555631799 position[mm]: (-223.84856415083,-109.74344436567,-1411.360698329) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0070319394131853 position[mm]: (-226.33199224952,-111.02949463518,-1400) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0046484198805825 position[mm]: (-358.86250666654,-179.44443880695,-792.66105800114) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0072911478108327 position[mm]: (-363.23394184025,-181.74024454635,-772.41017332762) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.004987876261174 position[mm]: (-365.24687401098,-182.80759582674,-763.10103864705) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0074807008353053 position[mm]: (-370.38159642957,-185.5170836685,-739.40976783361) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00092104899248157 position[mm]: (-371.27763699765,-185.98719608061,-735.302392867) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.016273795805412 position[mm]: (-382.41963557196,-191.85962228901,-684.22337053743) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0059916401566887 position[mm]: (-387.02484146961,-194.35177465215,-662.73165870292) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.020800444102855 position[mm]: (-398.27959027668,-200.40330641699,-610.59606619087) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0041108155788208 position[mm]: (-400.56430961265,-201.62552197951,-600) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0028629042980607 position[mm]: (-533.03444823814,-272.45914834499,13.807449584072) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.01714897432349 position[mm]: (-543.05534645897,-277.84110619943,60.27518252035) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.019652676663731 position[mm]: (-556.36786878076,-285.13967130406,122.03244108434) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0044266695249591 position[mm]: (-557.27231346576,-285.63378245825,126.25726588709) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0078406952966326 position[mm]: (-561.34023550453,-287.85401306921,145.23507667453) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00036352104218318 position[mm]: (-562.20630221011,-288.32993679726,149.29053864699) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0087733866757566 position[mm]: (-567.22678747204,-291.09417757278,172.81306874888) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0041530880985865 position[mm]: (-569.86403111917,-292.54805353874,185.10722373488) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0046846194839613 position[mm]: (-573.05401597218,-294.32992963011,200) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0088724412867292 position[mm]: (-707.02726330979,-368.28607595704,827.94493246325) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0036449600722661 position[mm]: (-709.83352343666,-369.82569866377,841.18303726439) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.018128066949998 position[mm]: (-718.23984372968,-374.49534910092,880.79690965411) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0065183683763598 position[mm]: (-721.25523497545,-376.16135084368,894.93585376498) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0026207180519746 position[mm]: (-723.8666806303,-377.61146729737,907.15928031077) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.01258219593804 position[mm]: (-733.46767060534,-383.06560882296,952.54682577432) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.013171985376416 position[mm]: (-743.66517202616,-388.83606082526,1000) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.025157765961916 position[mm]: (-884.98671250296,-469.31878900231,1663.5806419638) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0033916936596775 position[mm]: (-887.93333247763,-470.97987943643,1677.329671466) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.039274893066334 position[mm]: (-908.97634727564,-482.88499166202,1775.5654599691) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 5.736937983701e-05 position[mm]: (-909.06458030568,-482.93376133173,1775.9757296734) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.012092549050738 position[mm]: (-914.23183302871,-485.78800748513,1800) - trackID: 74 chamberNb: 4 energy deposit[MeV]: 0.0017603883591051 position[mm]: (-909.05791229823,-482.94168379106,1775.9766893587) - trackID: 73 chamberNb: 4 energy deposit[MeV]: 0.0014562970394206 position[mm]: (-908.96825361705,-482.88518824137,1775.5675183521) - trackID: 72 chamberNb: 4 energy deposit[MeV]: 0.0013693963671909 position[mm]: (-887.9275549241,-470.97518077551,1677.3317850086) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.0043919420009632 position[mm]: (-884.2024131122,-469.58303156553,1663.8911633193) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.00034605337207446 position[mm]: (-884.27289004515,-469.60984889383,1664.0202290452) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.0050806949576385 position[mm]: (-884.58609702436,-469.72446749325,1664.2747058551) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.0069435935052471 position[mm]: (-884.60281742545,-469.76877230369,1664.0029937675) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.0052269172234476 position[mm]: (-884.62563984436,-469.735135145,1663.979432464) - trackID: 112 chamberNb: 4 energy deposit[MeV]: 0.0043660724459116 position[mm]: (-884.63365669957,-469.77857894076,1664.0185324842) - trackID: 111 chamberNb: 4 energy deposit[MeV]: 0.0046206990354751 position[mm]: (-884.2953442238,-469.61791842387,1663.9895764411) - trackID: 110 chamberNb: 4 energy deposit[MeV]: 0.0041298614414654 position[mm]: (-884.22831253799,-469.59555341963,1663.8748061741) - trackID: 65 chamberNb: 3 energy deposit[MeV]: 0.0025782252015773 position[mm]: (-733.47727988319,-383.05118874841,952.54745594338) - trackID: 64 chamberNb: 3 energy deposit[MeV]: 0.0014933412681997 position[mm]: (-723.86730740111,-377.60297277586,907.16052414645) - trackID: 63 chamberNb: 3 energy deposit[MeV]: 0.0018213516897325 position[mm]: (-721.26544824782,-376.15802584164,894.93455991076) - trackID: 62 chamberNb: 3 energy deposit[MeV]: 0.0032370177910593 position[mm]: (-718.26327786115,-374.49412076949,880.79349796176) - trackID: 61 chamberNb: 3 energy deposit[MeV]: 0.0079457788743282 position[mm]: (-709.91197836548,-369.78897374872,841.17895550697) - trackID: 60 chamberNb: 3 energy deposit[MeV]: 0.0075882762060638 position[mm]: (-707.01931368119,-368.36663425687,827.94476273891) - trackID: 53 chamberNb: 2 energy deposit[MeV]: 0.0027824551885516 position[mm]: (-569.87994195612,-292.53712765525,185.10621271724) - trackID: 52 chamberNb: 2 energy deposit[MeV]: 0.0050802485818947 position[mm]: (-567.200004085,-291.13003862184,172.81799988577) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0014605094099196 position[mm]: (-562.2064760323,-288.32165401864,149.29181742171) - trackID: 50 chamberNb: 2 energy deposit[MeV]: 0.007438665835922 position[mm]: (-561.37080517335,-287.78218529123,145.24420420199) - trackID: 49 chamberNb: 2 energy deposit[MeV]: 0.0020578897784956 position[mm]: (-557.2835103134,-285.62812322483,126.25613875937) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.0029620723693189 position[mm]: (-556.38857862377,-285.14140784188,122.02902917427) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.00034986447430795 position[mm]: (-543.04945129603,-277.76167570001,60.309815462888) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.008316480270296 position[mm]: (-543.26315466097,-275.64225343778,61.698539724856) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0061361547820864 position[mm]: (-543.94466385272,-276.60476853712,63.276233657355) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0025851991372281 position[mm]: (-543.47058153656,-275.99816655469,62.994173618239) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0070030821805105 position[mm]: (-543.07884223717,-275.60303823836,64.253138972577) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.008714962439893 position[mm]: (-542.80506606397,-276.5532912631,63.893312407737) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0052309702789827 position[mm]: (-543.37853704839,-276.59707761286,64.29689128613) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0051813084349492 position[mm]: (-543.45621178683,-277.0175189823,64.566628217416) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0067423709952116 position[mm]: (-543.60320897544,-277.20673784328,64.751823019285) - trackID: 47 chamberNb: 2 energy deposit[MeV]: 0.0093402973210566 position[mm]: (-543.54106501123,-277.23584091048,64.839295016728) - trackID: 117 chamberNb: 2 energy deposit[MeV]: 0.0015291804056403 position[mm]: (-543.59985398854,-277.21351641881,64.747225549633) - trackID: 116 chamberNb: 2 energy deposit[MeV]: 0.0016125761686672 position[mm]: (-543.4636754358,-277.01740571497,64.560899211521) - trackID: 115 chamberNb: 2 energy deposit[MeV]: 0.0025638067392349 position[mm]: (-543.45470984146,-276.00413972066,62.991303580405) - trackID: 114 chamberNb: 2 energy deposit[MeV]: 0.0017526990486281 position[mm]: (-543.26465372707,-275.65075162617,61.692830118837) - trackID: 113 chamberNb: 2 energy deposit[MeV]: 0.0040632275757554 position[mm]: (-543.01921162252,-277.75308699708,60.302283125503) - trackID: 46 chamberNb: 2 energy deposit[MeV]: 0.0014897784806997 position[mm]: (-533.0267869057,-272.45608155335,13.809811278988) - trackID: 41 chamberNb: 1 energy deposit[MeV]: 0.0047940095260186 position[mm]: (-398.31557965371,-200.38323934578,-610.59846050601) - trackID: 40 chamberNb: 1 energy deposit[MeV]: 0.0053982334772937 position[mm]: (-387.00539653932,-194.30842500811,-662.71856429854) - trackID: 39 chamberNb: 1 energy deposit[MeV]: 0.0017454318675296 position[mm]: (-382.41029520273,-191.8634619437,-684.22135443852) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.00048591303718596 position[mm]: (-371.02866156211,-186.0103761737,-735.21233993919) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.0063287814509415 position[mm]: (-370.94741634688,-186.21816175157,-735.37226028194) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.0076478435031887 position[mm]: (-371.0487461084,-186.17912104971,-735.43771364309) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.0025019372394431 position[mm]: (-371.04838140095,-186.16634656042,-735.42711964706) - trackID: 118 chamberNb: 1 energy deposit[MeV]: 0.0015876905642984 position[mm]: (-371.02754099551,-186.0045457858,-735.21942482985) - trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.0047737944864045 position[mm]: (-370.34243245163,-185.51439148666,-739.39788934571) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0015873917491345 position[mm]: (-365.14981587564,-183.08631486634,-763.06349676052) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0072715389946185 position[mm]: (-364.80776845258,-183.19627388765,-763.0703986962) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.012354655192699 position[mm]: (-364.91717673558,-183.06886903032,-763.02408680341) - trackID: 119 chamberNb: 1 energy deposit[MeV]: 0.002410423625272 position[mm]: (-365.15453174094,-183.10122172999,-763.06516713409) - trackID: 35 chamberNb: 1 energy deposit[MeV]: 0.0026851324469622 position[mm]: (-363.21644011228,-181.73783437818,-772.40509455956) - trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.0028190129079471 position[mm]: (-358.88192351249,-179.44310093064,-792.66398127961) - trackID: 29 chamberNb: 0 energy deposit[MeV]: 0.0034447637655771 position[mm]: (-223.82409670337,-109.74018217863,-1411.3533654829) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.0034109524031457 position[mm]: (-215.57974529041,-105.41778067738,-1449.5832998951) - trackID: 27 chamberNb: 0 energy deposit[MeV]: 0.010834406645335 position[mm]: (-214.21515096331,-104.69026273278,-1454.906622279) - trackID: 27 chamberNb: 0 energy deposit[MeV]: 0.0044806622266137 position[mm]: (-214.19618061263,-104.66326951,-1454.8892132981) - trackID: 26 chamberNb: 0 energy deposit[MeV]: 0.0022092064356471 position[mm]: (-211.88615699691,-103.53553767462,-1466.6837166289) - trackID: 25 chamberNb: 0 energy deposit[MeV]: 0.0014035611257407 position[mm]: (-200.42721623016,-97.82968700528,-1518.7604579728) - trackID: 24 chamberNb: 0 energy deposit[MeV]: 0.001454384526722 position[mm]: (-195.37391523134,-95.282993396427,-1541.6330777382) - trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.0087900177884044 position[mm]: (-190.87053423883,-93.036009272126,-1562.5484767466) - trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.0028924194236585 position[mm]: (-190.86493703805,-93.016922410453,-1562.5529607222) - trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.0014324793003656 position[mm]: (-188.96459319788,-92.194331742079,-1570.3646601511) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.0080388172662798 position[mm]: (-182.79224116036,-89.188836142413,-1598.3030414771) +-------->Storing hits in the ROOT file: in this event there are 82 hits in the tracker chambers: + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0082894540955244 position[mm]: (-120.35843687499,32.012747294617,-1580.8314914278) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0070091596687942 position[mm]: (-123.27334783727,32.795585516179,-1560.665956509) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0015555203849337 position[mm]: (-124.13991909514,33.034598059468,-1554.7339596003) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.01775944031003 position[mm]: (-131.8149413555,35.146724130781,-1502.6082852643) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.033739096089735 position[mm]: (-146.65725599321,39.019857512766,-1400) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0054720599483169 position[mm]: (-237.16527958972,62.24785393925,-783.24490108535) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0044591166973198 position[mm]: (-239.08677254802,62.739895138095,-770.28607197871) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.023392043825277 position[mm]: (-247.31232052683,64.913327581803,-711.89852236364) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.006509878801185 position[mm]: (-249.11538725318,65.391548263872,-697.39341687147) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0041426964273259 position[mm]: (-251.24825388904,65.965739833585,-680.24569345044) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0044038114380888 position[mm]: (-253.2464773456,66.496468504809,-664.07816036323) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0016682432311171 position[mm]: (-253.51903294651,66.570313667574,-661.85709849313) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.013585895648218 position[mm]: (-256.61512631494,67.429880771072,-636.55661608922) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0071829184666003 position[mm]: (-258.39272774997,67.93761280418,-622.04085558704) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0003576323240798 position[mm]: (-258.50287777103,67.96742802509,-621.14240994882) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0049199117675006 position[mm]: (-259.93002450635,68.354658292324,-609.47983165496) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0034452910456864 position[mm]: (-261.09169219603,68.66062906478,-600) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0067236342134345 position[mm]: (-335.19515679418,87.079954464505,12.676485295531) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0066793687266438 position[mm]: (-338.534633096,87.938957592267,40.494344569878) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00085711412449545 position[mm]: (-339.17691602792,88.101944160867,45.861781054303) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0031074024794845 position[mm]: (-340.0030549882,88.307894972917,52.802900377156) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.021326910275672 position[mm]: (-345.28975174246,89.630078431276,97.338685547331) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00014809327974684 position[mm]: (-345.32084977073,89.638368967842,97.600437178991) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.01981520942028 position[mm]: (-350.461039244,91.391870325386,137.15680876471) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00069317852320204 position[mm]: (-350.78278002596,91.51326131285,139.41317613334) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0036550098860649 position[mm]: (-354.24028614664,92.823378628958,163.56353516645) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.00043820322241 position[mm]: (-354.58436831793,92.947630558331,165.90310608639) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.010235803172326 position[mm]: (-359.63568925476,94.739555199789,200) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0017692011154108 position[mm]: (-449.68206522359,126.27258686875,803.00309848651) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0033606142433601 position[mm]: (-450.48188490843,126.54551910217,808.32637451872) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.017526577029841 position[mm]: (-458.09569459749,129.12957015422,859.05283144629) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0029129043601222 position[mm]: (-459.0896327301,129.47574210439,865.65491205463) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0010611910951865 position[mm]: (-460.04130872663,129.80976529683,871.99497195936) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.045649344054958 position[mm]: (-478.39861034161,136.36998342594,993.44611750099) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0028582084730301 position[mm]: (-479.35034634433,136.7129479092,1000) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.023685748989969 position[mm]: (-578.89231125127,172.75940558314,1690.3429434393) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.026508473370402 position[mm]: (-594.70649327589,178.64417980255,1800) + trackID: 81 chamberNb: 4 energy deposit[MeV]: 0.0020396036037999 position[mm]: (-578.88056152646,172.75611144093,1690.3454050997) + trackID: 72 chamberNb: 3 energy deposit[MeV]: 0.0055453486881591 position[mm]: (-478.50940713313,136.4001872727,993.44019429532) + trackID: 72 chamberNb: 3 energy deposit[MeV]: 0.0039866973864711 position[mm]: (-478.52502785423,136.42153056583,993.45731487472) + trackID: 71 chamberNb: 3 energy deposit[MeV]: 0.0014504670336166 position[mm]: (-460.04105603085,129.80149626098,871.99578969522) + trackID: 70 chamberNb: 3 energy deposit[MeV]: 0.0026396772678363 position[mm]: (-459.07290996335,129.48142882872,865.65809133592) + trackID: 69 chamberNb: 3 energy deposit[MeV]: 0.0016315331277241 position[mm]: (-458.09682782497,129.12013037691,859.05356065879) + trackID: 68 chamberNb: 3 energy deposit[MeV]: 0.0036398265911643 position[mm]: (-450.40809077672,126.48623779336,808.34993143443) + trackID: 68 chamberNb: 3 energy deposit[MeV]: 0.0034432579124714 position[mm]: (-450.39743880857,126.50916473483,808.35491721843) + trackID: 135 chamberNb: 3 energy deposit[MeV]: 0.0014914622670946 position[mm]: (-450.41091757617,126.48580983552,808.35803701007) + trackID: 67 chamberNb: 3 energy deposit[MeV]: 0.0013247596214006 position[mm]: (-449.68881297579,126.26955992659,803.00252364394) + trackID: 60 chamberNb: 2 energy deposit[MeV]: 0.0032487328324485 position[mm]: (-354.56114911131,92.945399811794,165.90809054426) + trackID: 59 chamberNb: 2 energy deposit[MeV]: 0.0012200540315295 position[mm]: (-354.24469473521,92.81839642773,163.56340928855) + trackID: 58 chamberNb: 2 energy deposit[MeV]: 0.0047884252577934 position[mm]: (-350.42772862291,91.21546049964,139.55764335169) + trackID: 58 chamberNb: 2 energy deposit[MeV]: 0.012211489074827 position[mm]: (-350.54562247036,91.076776095883,139.8412350898) + trackID: 58 chamberNb: 2 energy deposit[MeV]: 0.0034327531680314 position[mm]: (-350.51706791009,91.081247218386,139.90075461301) + trackID: 58 chamberNb: 2 energy deposit[MeV]: 0.0017247349759257 position[mm]: (-350.50727873466,91.083921496522,139.90120729723) + trackID: 136 chamberNb: 2 energy deposit[MeV]: 0.0014454191093019 position[mm]: (-350.51639048078,91.077566129444,139.90813833147) + trackID: 57 chamberNb: 2 energy deposit[MeV]: 0.0015533191168616 position[mm]: (-350.45224618086,91.39082635564,137.15849174921) + trackID: 56 chamberNb: 2 energy deposit[MeV]: 0.0014630180905118 position[mm]: (-345.32083172709,89.64676858253,97.600510317687) + trackID: 55 chamberNb: 2 energy deposit[MeV]: 0.0016461531700293 position[mm]: (-345.29031339502,89.620483731496,97.339331434171) + trackID: 54 chamberNb: 2 energy deposit[MeV]: 0.0014425249308512 position[mm]: (-340.00371788675,88.316126417627,52.802905321397) + trackID: 53 chamberNb: 2 energy deposit[MeV]: 0.0020020078898377 position[mm]: (-339.22602858897,88.152078965866,45.861007756784) + trackID: 53 chamberNb: 2 energy deposit[MeV]: 0.0046601255244549 position[mm]: (-339.26063523336,88.151624274343,45.841718554262) + trackID: 137 chamberNb: 2 energy deposit[MeV]: 0.0013754450306846 position[mm]: (-339.22548580782,88.159752233986,45.859813583998) + trackID: 52 chamberNb: 2 energy deposit[MeV]: 0.0014920104327752 position[mm]: (-338.54312262868,87.937746237003,40.493712858515) + trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0098447132530728 position[mm]: (-335.1952152447,86.96003734286,12.692688573336) + trackID: 39 chamberNb: 1 energy deposit[MeV]: 0.0018189283521136 position[mm]: (-259.93653527071,68.346040071971,-609.47986942727) + trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.0014562194727499 position[mm]: (-258.50835515274,67.961122866606,-621.14253734949) + trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.0032577590694989 position[mm]: (-258.37441155331,67.92276999803,-622.03668824142) + trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0012303755519782 position[mm]: (-256.62115707072,67.432805570556,-636.55720992086) + trackID: 35 chamberNb: 1 energy deposit[MeV]: 0.0024929451081272 position[mm]: (-253.53542491805,66.568590395715,-661.85818337583) + trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.0032484231870007 position[mm]: (-253.25766100816,66.517523434655,-664.07881171895) + trackID: 33 chamberNb: 1 energy deposit[MeV]: 0.0013362190621371 position[mm]: (-251.25240188884,65.971975026494,-680.24612384956) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.0024173388447346 position[mm]: (-249.16113742125,65.385298075256,-697.39542836476) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.001452948796731 position[mm]: (-249.15844522866,65.393129669475,-697.39452627301) + trackID: 138 chamberNb: 1 energy deposit[MeV]: 0.001293752293656 position[mm]: (-249.15502761132,65.382872125095,-697.39251232724) + trackID: 31 chamberNb: 1 energy deposit[MeV]: 0.0022838762952703 position[mm]: (-247.30531510372,64.926025290995,-711.89734278519) + trackID: 30 chamberNb: 1 energy deposit[MeV]: 0.0012466973078832 position[mm]: (-239.09356825468,62.740245030522,-770.28683808529) + trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.0017279262685269 position[mm]: (-237.09771470311,62.291009253131,-783.22902334618) + trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.0037311558154201 position[mm]: (-237.08190830031,62.309460274203,-783.24432977384) + trackID: 139 chamberNb: 1 energy deposit[MeV]: 0.0022208232845733 position[mm]: (-237.09442089002,62.280804003674,-783.23799745977) + trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.0012480932269754 position[mm]: (-131.81680406256,35.153318908524,-1502.6085493597) + trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.0015833170204218 position[mm]: (-124.13408717566,33.027629519908,-1554.7324336237) + trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.0026386157654869 position[mm]: (-123.27775554946,32.778228887804,-1560.6649344473) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0018637030202717 position[mm]: (-120.34784610168,32.015521434717,-1580.8295647105) writing Event_3 >>> Event 1 0 trajectories stored in this event. CalorimeterSD::Initialize: TrackerChamberSD ExP01/TrackerChamberSD_HC is not found. --------->Storing hits in the ROOT file: in this event there are 104 hits in the tracker chambers: - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0029693347766671 position[mm]: (-102.10910384003,-41.102898818721,-1591.7425318333) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.003994371154351 position[mm]: (-103.72642944859,-41.853979340439,-1578.435564562) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0016781315759498 position[mm]: (-104.69485120194,-42.297925610776,-1570.5551731331) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0025738854069349 position[mm]: (-105.34792596522,-42.597336223628,-1565.2767595985) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0014380483328999 position[mm]: (-105.83824987472,-42.818540865051,-1561.3426376938) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.010653927034941 position[mm]: (-110.40583614162,-44.913209742538,-1524.8528413291) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.004739512515534 position[mm]: (-112.74690776996,-46.041031380322,-1505.9233366968) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0089349653433733 position[mm]: (-116.88019781216,-47.958379850006,-1472.4392570286) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.01782717901336 position[mm]: (-121.86116808058,-50.289116120505,-1432.6689676441) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0031419288276982 position[mm]: (-123.6286596025,-51.092161389432,-1418.8692378014) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0012492190691821 position[mm]: (-124.60477771069,-51.53195746537,-1411.3984238335) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00063616306820041 position[mm]: (-125.12196241341,-51.760851703286,-1407.463689815) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0022018848384248 position[mm]: (-125.86998413729,-52.092477265684,-1401.772338825) - trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.00028672097890287 position[mm]: (-126.10448882973,-52.196757271655,-1400) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.040867769371816 position[mm]: (-220.8733280855,-94.885388756099,-687.87862098641) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0050719206302026 position[mm]: (-222.29030514567,-95.457828528667,-677.66701126616) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0010887998053597 position[mm]: (-222.6904547727,-95.614916660558,-674.80946620777) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0066771422857803 position[mm]: (-225.06284908469,-96.525295962527,-658.06506132333) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.028267576603845 position[mm]: (-231.99545865596,-99.093120452315,-610.17165277653) - trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0056870313865816 position[mm]: (-233.48498735272,-99.616872839356,-600) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.016157103955712 position[mm]: (-326.04587674266,-132.9005018806,36.056687396137) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0011245107238154 position[mm]: (-327.2292706881,-133.32208731153,44.253163880005) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.023011054868859 position[mm]: (-336.03179983195,-136.48102365854,105.36247510221) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.012285146241241 position[mm]: (-339.8012671823,-137.79285316712,131.69756083469) - trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.024667432991242 position[mm]: (-349.41418032832,-141.34942102973,200) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.009463865307385 position[mm]: (-437.43909096774,-173.10321683105,828.05100627039) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.010218370153145 position[mm]: (-440.77329177471,-174.33171545237,851.79887280345) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.018171679684041 position[mm]: (-447.22380750982,-176.72867067043,898.04175260545) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0023381688042842 position[mm]: (-447.99671559046,-177.02109048682,903.53777417708) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0031209137758155 position[mm]: (-448.82472953015,-177.33369804418,909.38782677006) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.010172463308751 position[mm]: (-451.19375915811,-178.22735455953,926.18909922844) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.013076153958347 position[mm]: (-454.64256244333,-179.52837470883,950.63033605384) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.019176642465607 position[mm]: (-460.71783715032,-181.82893730856,993.64031817392) - trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.001522233502925 position[mm]: (-461.60337144435,-182.17900503295,1000) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.025173879795095 position[mm]: (-556.44914519796,-219.67790813662,1683.7104847634) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.03558636409791 position[mm]: (-569.29123167503,-224.84261124348,1776.8683504135) - trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0063954984172126 position[mm]: (-572.41439790392,-226.04823890877,1800) - trackID: 72 chamberNb: 4 energy deposit[MeV]: 0.0061638218996953 position[mm]: (-569.26478259958,-224.79016961305,1776.879575566) - trackID: 71 chamberNb: 4 energy deposit[MeV]: 0.0039194501369782 position[mm]: (-556.42368998539,-219.69445476387,1683.7150949113) - trackID: 64 chamberNb: 3 energy deposit[MeV]: 0.0041415849600514 position[mm]: (-460.69998875846,-181.80161100911,993.64655273786) - trackID: 63 chamberNb: 3 energy deposit[MeV]: 0.0017461865370148 position[mm]: (-454.64307293258,-179.53866382113,950.63016622762) - trackID: 62 chamberNb: 3 energy deposit[MeV]: 0.0027233632430548 position[mm]: (-451.21988731905,-178.22900006999,926.2404617202) - trackID: 61 chamberNb: 3 energy deposit[MeV]: 0.0017341344626157 position[mm]: (-451.18564422683,-178.23343890105,926.19036934686) - trackID: 60 chamberNb: 3 energy deposit[MeV]: 0.0066773609798344 position[mm]: (-448.8871874259,-177.30915756976,909.38607807655) - trackID: 59 chamberNb: 3 energy deposit[MeV]: 0.0056149724623625 position[mm]: (-448.04883021716,-177.02075082761,903.53452197581) - trackID: 58 chamberNb: 3 energy deposit[MeV]: 0.0018513916627549 position[mm]: (-447.2194945492,-176.7388060006,898.04231872098) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.00039350573042717 position[mm]: (-440.75819168175,-174.25985791195,851.81139433535) - trackID: 57 chamberNb: 3 energy deposit[MeV]: 0.00496118277047 position[mm]: (-440.78860495692,-174.27869118152,851.83606861213) - trackID: 87 chamberNb: 3 energy deposit[MeV]: 0.0019898374940556 position[mm]: (-440.75596877755,-174.25196069621,851.82022706814) - trackID: 56 chamberNb: 3 energy deposit[MeV]: 0.0015587189821716 position[mm]: (-437.43778739581,-173.09431955699,828.05202512858) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.010497887013252 position[mm]: (-342.99796556737,-137.39001258466,132.19020123114) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00030738470980333 position[mm]: (-343.52366577014,-136.95626335505,132.26129954199) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0097218485347264 position[mm]: (-345.23841920677,-136.53849886534,131.24573015712) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0079909744127714 position[mm]: (-346.47021274548,-136.93081136236,130.45710482808) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 2.9819903551926e-05 position[mm]: (-346.49575592897,-136.91854495448,130.45965307225) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0075942537147736 position[mm]: (-347.19172068468,-136.40514709108,130.27596580164) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00027079127835106 position[mm]: (-347.18008135152,-136.10441307825,130.01108471591) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.001662112500506 position[mm]: (-347.49520755917,-136.08428926175,129.89535492856) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0048132985130803 position[mm]: (-347.58521733317,-135.81456113194,130.19512175362) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.00020737854300119 position[mm]: (-347.48071302446,-135.97933369598,130.28454401696) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0064948456779139 position[mm]: (-347.57588087005,-136.0307950603,130.48384952281) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0036868113970685 position[mm]: (-347.52375803706,-136.08038391829,130.52683743496) - trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.002914253543263 position[mm]: (-347.52048629101,-136.06735714428,130.54245689218) - trackID: 93 chamberNb: 2 energy deposit[MeV]: 0.0014677362364492 position[mm]: (-347.51808957176,-136.08570189079,130.53010778093) - trackID: 92 chamberNb: 2 energy deposit[MeV]: 0.0018311851338146 position[mm]: (-347.47559587692,-135.97093706083,130.28921758032) - trackID: 91 chamberNb: 2 energy deposit[MeV]: 0.0016495020960356 position[mm]: (-347.48943913541,-136.08905845279,129.90145481089) - trackID: 90 chamberNb: 2 energy deposit[MeV]: 0.001721046343799 position[mm]: (-347.18190266576,-136.09655933651,130.01722413639) - trackID: 89 chamberNb: 2 energy deposit[MeV]: 0.0057745951475509 position[mm]: (-346.529866542,-136.95788788936,130.47539423676) - trackID: 88 chamberNb: 2 energy deposit[MeV]: 0.00068727826245092 position[mm]: (-343.51595688151,-136.91534975537,132.26329726006) - trackID: 88 chamberNb: 2 energy deposit[MeV]: 0.0051636531804737 position[mm]: (-343.49585470034,-136.88334121404,132.20424765133) - trackID: 88 chamberNb: 2 energy deposit[MeV]: 0.0017169287392254 position[mm]: (-343.48612084573,-136.88434864858,132.20172413653) - trackID: 94 chamberNb: 2 energy deposit[MeV]: 0.0015259968488583 position[mm]: (-343.52185341202,-136.90893644206,132.2647332216) - trackID: 50 chamberNb: 2 energy deposit[MeV]: 0.0065866757310538 position[mm]: (-336.06473281907,-136.53797205725,105.36052657955) - trackID: 49 chamberNb: 2 energy deposit[MeV]: 0.0017786448348065 position[mm]: (-327.23827586651,-133.31666916845,44.252613495741) - trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.001751442706118 position[mm]: (-326.0492841848,-132.89075183253,36.057151910911) - trackID: 40 chamberNb: 1 energy deposit[MeV]: 0.0039948173124999 position[mm]: (-231.98992439942,-99.062386133651,-610.16716470634) - trackID: 39 chamberNb: 1 energy deposit[MeV]: 0.0015531094296479 position[mm]: (-225.05407206953,-96.526608760387,-658.06349302205) - trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.0030118415580253 position[mm]: (-222.67829656849,-95.632585876625,-674.80748170086) - trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.0023956294189037 position[mm]: (-222.30449491586,-95.464087605515,-677.66854092957) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0075096921098552 position[mm]: (-220.49701997235,-95.106841941192,-687.76842361238) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0022600153814277 position[mm]: (-220.4150472068,-94.931596195709,-687.72461078599) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0053921982610983 position[mm]: (-220.36429694872,-94.87324366612,-687.84325197922) - trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0054818648302955 position[mm]: (-220.34355158091,-94.916218204974,-687.82700039671) - trackID: 96 chamberNb: 1 energy deposit[MeV]: 0.0019314774319604 position[mm]: (-220.42483419162,-94.925473521728,-687.72584767515) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.0027881739435426 position[mm]: (-126.41003958247,-51.62583841934,-1402.0527832971) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.0024878008350395 position[mm]: (-126.61304431855,-51.683134495753,-1401.8506218281) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.0048308089145323 position[mm]: (-126.74354010801,-51.687602057064,-1401.7047670449) - trackID: 28 chamberNb: 0 energy deposit[MeV]: 0.0058188716177251 position[mm]: (-126.76880755573,-51.736096661276,-1401.6988040156) - trackID: 102 chamberNb: 0 energy deposit[MeV]: 0.0026398568671232 position[mm]: (-126.73522913978,-51.69007886845,-1401.6890612733) - trackID: 101 chamberNb: 0 energy deposit[MeV]: 0.0015422674959734 position[mm]: (-126.60947551777,-51.675710767911,-1401.8471486766) - trackID: 27 chamberNb: 0 energy deposit[MeV]: 0.0016008172164724 position[mm]: (-125.12423127799,-51.769892522392,-1407.4641227824) - trackID: 26 chamberNb: 0 energy deposit[MeV]: 0.0079115954535282 position[mm]: (-124.52151202188,-51.521590199193,-1411.378853734) - trackID: 25 chamberNb: 0 energy deposit[MeV]: 0.0020421234078776 position[mm]: (-123.61660809872,-51.089935329414,-1418.8669406458) - trackID: 24 chamberNb: 0 energy deposit[MeV]: 0.0014894400856431 position[mm]: (-121.86510792793,-50.296715966063,-1432.6695669015) - trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.001575422531315 position[mm]: (-116.7587698653,-47.995259536437,-1472.4120655997) - trackID: 23 chamberNb: 0 energy deposit[MeV]: 0.0055543937737974 position[mm]: (-116.78098660468,-47.953162645639,-1472.4314458081) - trackID: 103 chamberNb: 0 energy deposit[MeV]: 0.0037573955123869 position[mm]: (-116.73271926861,-47.983839824808,-1472.4174652293) - trackID: 22 chamberNb: 0 energy deposit[MeV]: 0.0013753949296599 position[mm]: (-112.75408816676,-46.043942141026,-1505.9240868825) - trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.0017449621602566 position[mm]: (-110.40918589096,-44.9034945586,-1524.8522256511) - trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0022069950318641 position[mm]: (-105.85126359973,-42.813820389673,-1561.3433127934) - trackID: 19 chamberNb: 0 energy deposit[MeV]: 0.0026761859919942 position[mm]: (-105.36609260112,-42.595512662269,-1565.2779276657) - trackID: 18 chamberNb: 0 energy deposit[MeV]: 0.0017340847518296 position[mm]: (-104.70443714519,-42.301348399036,-1570.5561068794) - trackID: 17 chamberNb: 0 energy deposit[MeV]: 0.0070482037823653 position[mm]: (-103.79579785987,-41.87517192366,-1578.4389068353) - trackID: 16 chamberNb: 0 energy deposit[MeV]: 0.0018212698382813 position[mm]: (-102.1038056219,-41.093612933657,-1591.7408797078) +-------->Storing hits in the ROOT file: in this event there are 70 hits in the tracker chambers: + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.0063584917856074 position[mm]: (102.84667146915,21.973581441235,-1576.9997861565) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.050560178106805 position[mm]: (115.72840560437,25.385369575537,-1469.6601342263) + trackID: 1 chamberNb: 0 energy deposit[MeV]: 0.020265025865538 position[mm]: (123.94258510676,27.60965162444,-1400) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0048796492341434 position[mm]: (196.88929863813,49.487139536068,-785.22444359455) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.011632934648378 position[mm]: (201.07870261295,50.698612781592,-750.47877999143) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0040216173289106 position[mm]: (201.82963753104,50.921652157665,-744.25631963087) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0095272295841115 position[mm]: (203.45328683623,51.401475271645,-730.83713820854) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.00045097289177956 position[mm]: (203.61742538518,51.450984944163,-729.47667814802) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0026260438107412 position[mm]: (204.5476066259,51.728607731986,-721.7607348737) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0015644460717922 position[mm]: (205.71304302663,52.072989802061,-712.00836859056) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0032661708112649 position[mm]: (206.81386854949,52.395968618854,-702.82192368486) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.013116611356696 position[mm]: (210.99053671767,53.605671455704,-668.14251812734) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.013708654948879 position[mm]: (215.84909163243,54.923713927835,-627.37109904279) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0022558029993261 position[mm]: (216.68032669519,55.126586305304,-620.30468366215) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0090286010175976 position[mm]: (218.63396241581,55.582581166572,-603.74385384514) + trackID: 1 chamberNb: 1 energy deposit[MeV]: 0.0019144279472191 position[mm]: (219.07857428103,55.678671204174,-600) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0076625226237401 position[mm]: (291.68541971543,70.2846225603,15.07780728914) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.016195292401349 position[mm]: (296.93019368101,71.225017315311,59.148953296472) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0052474253685143 position[mm]: (298.70165142643,71.57561480396,73.840068294854) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.016684176277966 position[mm]: (303.98052579304,72.656937030726,116.92575652245) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0054586891297047 position[mm]: (306.39972370968,73.113043123032,137.10606010518) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.009233821298351 position[mm]: (308.31485230819,73.501026224872,152.94234740315) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.0076203125714395 position[mm]: (310.50469677542,73.958648070836,171.13381583948) + trackID: 1 chamberNb: 2 energy deposit[MeV]: 0.015484607539355 position[mm]: (314.0234039392,74.677568667424,200) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.011984127559763 position[mm]: (392.96326718317,91.151008542116,836.01477465045) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.017340129098151 position[mm]: (398.88994263228,92.241235765676,882.68138594792) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.0028483086540065 position[mm]: (399.52543094215,92.359508615242,887.71717460048) + trackID: 1 chamberNb: 3 energy deposit[MeV]: 0.034369585721993 position[mm]: (413.69829012813,94.953572235227,1000) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.050121123184738 position[mm]: (505.07636194335,112.39091458768,1726.1189151699) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0047344851017472 position[mm]: (506.91943986398,112.73224127062,1740.6889928591) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0048970285269313 position[mm]: (508.3664427993,112.98010395193,1752.2931624808) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.011477105855715 position[mm]: (513.63453468529,113.8338132929,1794.5801827195) + trackID: 1 chamberNb: 4 energy deposit[MeV]: 0.0041230312516385 position[mm]: (514.30311779564,113.95577533728,1800) + trackID: 75 chamberNb: 4 energy deposit[MeV]: 0.0025925473312605 position[mm]: (513.65149063308,113.83789945879,1794.5789293156) + trackID: 74 chamberNb: 4 energy deposit[MeV]: 0.001925711229308 position[mm]: (508.37764633519,112.97734264131,1752.2923530481) + trackID: 73 chamberNb: 4 energy deposit[MeV]: 0.0054798048072193 position[mm]: (506.96224656899,112.70552158376,1740.6881240173) + trackID: 72 chamberNb: 4 energy deposit[MeV]: 0.0052966564536443 position[mm]: (505.03610052154,112.41573882833,1726.1270728061) + trackID: 64 chamberNb: 3 energy deposit[MeV]: 0.0025132705153881 position[mm]: (399.54195361832,92.36169732813,887.71591421977) + trackID: 63 chamberNb: 3 energy deposit[MeV]: 0.0030470219139328 position[mm]: (398.90053925491,92.26039164383,882.68086177627) + trackID: 62 chamberNb: 3 energy deposit[MeV]: 0.0027475932960703 position[mm]: (392.94857470054,91.162764624699,836.01740680784) + trackID: 54 chamberNb: 2 energy deposit[MeV]: 0.0016063359178872 position[mm]: (310.51401067584,73.95930251696,171.13305655578) + trackID: 53 chamberNb: 2 energy deposit[MeV]: 6.1506142703081e-05 position[mm]: (308.2924730321,73.499835099932,152.94761684517) + trackID: 53 chamberNb: 2 energy deposit[MeV]: 0.0065375826733001 position[mm]: (308.24893856438,73.51468859201,152.99385884121) + trackID: 89 chamberNb: 2 energy deposit[MeV]: 0.0022400587781895 position[mm]: (308.26335101612,73.482331391336,152.92612842323) + trackID: 89 chamberNb: 2 energy deposit[MeV]: 0.002465478105107 position[mm]: (308.27552431223,73.476185389928,152.91728483064) + trackID: 52 chamberNb: 2 energy deposit[MeV]: 0.0052360285322883 position[mm]: (306.35450868261,73.123284417724,137.11483839165) + trackID: 51 chamberNb: 2 energy deposit[MeV]: 0.0022822264673942 position[mm]: (303.99055924414,72.64642348009,116.92551651628) + trackID: 50 chamberNb: 2 energy deposit[MeV]: 0.0013370644552737 position[mm]: (298.70873996137,71.573197719809,73.839547397129) + trackID: 49 chamberNb: 2 energy deposit[MeV]: 0.001243280065425 position[mm]: (296.92397676383,71.227667000334,59.14989109856) + trackID: 48 chamberNb: 2 energy deposit[MeV]: 0.0018573732986958 position[mm]: (291.69279555493,70.276368517214,15.077603980019) + trackID: 39 chamberNb: 1 energy deposit[MeV]: 0.0021746394784459 position[mm]: (218.62703696641,55.571038343192,-603.74207388987) + trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.0032982931833607 position[mm]: (216.42329154209,55.374792542224,-620.22672977316) + trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.010984388665604 position[mm]: (216.44097671365,55.180638964547,-620.12595013538) + trackID: 38 chamberNb: 1 energy deposit[MeV]: 0.0032624663614052 position[mm]: (216.44374823428,55.202954668409,-620.1342980495) + trackID: 90 chamberNb: 1 energy deposit[MeV]: 0.0031628049253547 position[mm]: (216.40942277396,55.365220887871,-620.24240952205) + trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.0099690732908129 position[mm]: (215.69354014108,55.012160246102,-627.333934544) + trackID: 37 chamberNb: 1 energy deposit[MeV]: 0.0027413830239733 position[mm]: (215.68921805702,55.029018866633,-627.32646348487) + trackID: 36 chamberNb: 1 energy deposit[MeV]: 0.0073379190282766 position[mm]: (210.92345245716,53.571045200053,-668.12651697087) + trackID: 35 chamberNb: 1 energy deposit[MeV]: 0.0015474794702929 position[mm]: (206.81135276018,52.387409192743,-702.82095317478) + trackID: 34 chamberNb: 1 energy deposit[MeV]: 0.0012796209410158 position[mm]: (205.71260570298,52.065937713651,-712.00780323677) + trackID: 33 chamberNb: 1 energy deposit[MeV]: 0.0023130049135742 position[mm]: (204.56004065282,51.720563155535,-721.76119233731) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.0024719637581378 position[mm]: (203.63825651004,51.551308228465,-729.47274905953) + trackID: 32 chamberNb: 1 energy deposit[MeV]: 0.0047953962560736 position[mm]: (203.66653868386,51.544297250836,-729.50210362875) + trackID: 91 chamberNb: 1 energy deposit[MeV]: 0.0015898781229499 position[mm]: (203.63777244863,51.560174748779,-729.47536822956) + trackID: 31 chamberNb: 1 energy deposit[MeV]: 0.0037677827677021 position[mm]: (203.45378073846,51.372515933244,-730.83427711205) + trackID: 30 chamberNb: 1 energy deposit[MeV]: 0.0013626544710411 position[mm]: (201.83637271508,50.925311732124,-744.25696858198) + trackID: 29 chamberNb: 1 energy deposit[MeV]: 0.0034539179978466 position[mm]: (201.09951518334,50.713913959555,-750.4802523594) + trackID: 28 chamberNb: 1 energy deposit[MeV]: 0.0021322318672362 position[mm]: (196.8783331107,49.480103016853,-785.22223858457) + trackID: 21 chamberNb: 0 energy deposit[MeV]: 0.0014616239062346 position[mm]: (115.73676049855,25.385762554399,-1469.6607968666) + trackID: 20 chamberNb: 0 energy deposit[MeV]: 0.0019650610945758 position[mm]: (102.83682112309,21.980014795785,-1576.9982591221) writing Event_4 >>> Event 2 0 trajectories stored in this event. Run terminated. Run Summary Number of events processed : 3 - User=0.010000s Real=0.009156s Sys=0.000000s + User=0.010000s Real=0.006963s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -2140,18 +2348,20 @@ G4RNGHelper object is deleted. ================== Deleting memory pools =================== Pool ID '20G4NavigationLevelRep', size : 0.0269 MB Pool ID '24G4ReferenceCountedHandleIvE', size : 0.000961 MB +Pool ID '16G4SmartVoxelNode', size : 0.000961 MB +Pool ID '17G4SmartVoxelProxy', size : 0.000961 MB Pool ID '7G4Event', size : 0.000961 MB Pool ID '15G4PrimaryVertex', size : 0.000961 MB Pool ID '17G4PrimaryParticle', size : 0.000961 MB Pool ID '15G4HCofThisEvent', size : 0.000961 MB Pool ID '16G4HitsCollection', size : 0.000961 MB -Pool ID '17G4DynamicParticle', size : 0.0154 MB -Pool ID '7G4Track', size : 0.0298 MB +Pool ID '17G4DynamicParticle', size : 0.0183 MB +Pool ID '7G4Track', size : 0.0356 MB Pool ID '18G4TouchableHistory', size : 0.00192 MB Pool ID '15G4CountedObjectIvE', size : 0.000961 MB -Pool ID '15ExP01TrackerHit', size : 0.0173 MB -Number of memory pools allocated: 12 of which, static: 0 -Dynamic pools deleted: 12 / Total memory freed: 0.098 MB +Pool ID '15ExP01TrackerHit', size : 0.0154 MB +Number of memory pools allocated: 14 of which, static: 0 +Dynamic pools deleted: 14 / Total memory freed: 0.11 MB ============================================================ G4Allocator objects are deleted. UImanager deleted. diff --git a/examples/extended/persistency/P02/.README.txt b/examples/extended/persistency/P02/.README.txt deleted file mode 100644 index 536da70095..0000000000 --- a/examples/extended/persistency/P02/.README.txt +++ /dev/null @@ -1,64 +0,0 @@ - -///\file "persistency/P02/.README.txt" -///\brief Example P02 README page - -/*! \page ExampleP02 Example P02 - -\section P02_s1 General description - - -This example shows how to store in a binary file and how to -read back the geometry tree using the 'reflection' technique for -persistency provided by the Reflex tool also included in ROOT. The -Reflex tool allows to create a dictionary for the geometry classes, -making then possible to save the entire tree in a .root file. - -The provided makefile produces the executable: 'exampleP02'. In order -to run it one has to specify the argument, either 'write' or -'read'. In the first case the geometry is instaciated in the standard -way and then saved into the root file (geo.root). In the second case, -the geometry is read from geo.root file. - - -\section P02_s2 Building and running the example - -This examples requires the ROOT toolkit of version 6 to be installed. The -provided CMake file checks for the existence of the package and its version. -Once the CMake configuration has been succesfully done, the executable -for this example should be built using make -(in your CMake build directory): -\verbatim -make -\endverbatim - -\section P02_s3 Remark on dictionary generation - -The dictionary is generated by ${ROOTSYS}/bin/genreflex -tool. The header file including headers for all the classes we want to -generate the dictionary for should be given as argument. Additionally, -a so called selection file (xml) should be provided (with -s flag) to -the genreflex tool (see the GNUmakefile). The role of this file is to -specify which classes we want to generate the dictionary for. The -selection file for our dictionary is in xml/ directory. Please refer -to genreflex manual for more details concerning the usage of that -tool. - -Concerning generating dictionary for the Geant4 objects, there are -also two technical remarks that need to be made here. -The Reflex tool requires all the templated classes to be -explicitely used somewhere in the included header files in order for -the generation of the dictionary to be possible. For those templated -classes for which it is not the case, the problem can be very easily -solved by instaciating them in the headerfile which is given to -genreflex (see includes/ExP02Classes.hh) as argument. -The second remark is that there is an unfortunate clash of names as -far as G4String class is concerned. The header of G4String class -defines __G4String which happens to be the name of a variable used -within the generated dictionary code. The solution for that is to do -\verbatim -#undef __G4String -\endverbatim -in include/ExP02Classes.hh file. - - -*/ diff --git a/examples/extended/persistency/P02/CMakeLists.txt b/examples/extended/persistency/P02/CMakeLists.txt index e36a12ee5a..966a034219 100644 --- a/examples/extended/persistency/P02/CMakeLists.txt +++ b/examples/extended/persistency/P02/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(P02) #---------------------------------------------------------------------------- diff --git a/examples/extended/persistency/P02/README b/examples/extended/persistency/P02/README deleted file mode 100644 index 17746474bb..0000000000 --- a/examples/extended/persistency/P02/README +++ /dev/null @@ -1,61 +0,0 @@ - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - ExampleP02 - ---------- - -General description -------------------- - -This example shows how to store in a binary file and how to -read back the geometry tree using the 'reflection' technique for -persistency provided by the Reflex tool also included in ROOT. The -Reflex tool allows to create a dictionary for the geometry classes, -making then possible to save the entire tree in a .root file. - -The provided makefile produces the executable: 'exampleP02'. In order -to run it one has to specify the argument, either 'write' or -'read'. In the first case the geometry is instaciated in the standard -way and then saved into the root file (geo.root). In the second case, -the geometry is read from geo.root file. - - -Building and running the example --------------------------------- - -This examples requires the ROOT toolkit of version 6 to be installed. The -provided CMake file checks for the existence of the package and its version. -Once the CMake configuration has been succesfully done, the executable -for this example should be built using make -(in your CMake build directory): - - make - -Remark on dictionary generation -------------------------------- - -The dictionary is generated by ${ROOTSYS}/bin/genreflex -tool. The header file including headers for all the classes we want to -generate the dictionary for should be given as argument. Additionally, -a so called selection file (xml) should be provided (with -s flag) to -the genreflex tool (see the GNUmakefile). The role of this file is to -specify which classes we want to generate the dictionary for. The -selection file for our dictionary is in xml/ directory. Please refer -to genreflex manual for more details concerning the usage of that -tool. - -Concerning generating dictionary for the Geant4 objects, there are -also two technical remarks that need to be made here. -The Reflex tool requires all the templated classes to be -explicitely used somewhere in the included header files in order for -the generation of the dictionary to be possible. For those templated -classes for which it is not the case, the problem can be very easily -solved by instaciating them in the headerfile which is given to -genreflex (see includes/ExP02Classes.hh) as argument. -The second remark is that there is an unfortunate clash of names as -far as G4String class is concerned. The header of G4String class -defines __G4String which happens to be the name of a variable used -within the generated dictionary code. The solution for that is to do -#undef __G4String in include/ExP02Classes.hh file. diff --git a/examples/extended/persistency/P03/.README.txt b/examples/extended/persistency/P03/.README.txt deleted file mode 100644 index 2163e74d45..0000000000 --- a/examples/extended/persistency/P03/.README.txt +++ /dev/null @@ -1,133 +0,0 @@ - -///\file "persistency/P03/.README.txt" -///\brief ExampleP03 README page - -/*! \page ExampleP03 Example P03 - -This example illustrates the use of the text geometry. - -\section P03_s1 GEOMETRY EXAMPLES - -Several examples of text geometries are provided: - -g4geom_simple.txt : -- Simple construction of materials and single placements - -g4geom_matemixt.txt : -- Isotopes, elements and materials - -g4geom_boolean.txt : -- Boolean solids - -g4geom_reflections.txt : -- Reflections - -g4geom_replicas.txt : -- Replicas - -g4geom_divisions.txt : -- Divisions - -g4geom_paramLinear.txt : -- Linear parameterisations - -g4geom_paramSquare.txt : -- Square parameterisations - -g4geom_assembly.txt : -- Assembly placements - - -\section P03_s2 HOW TO START ? - -Execute textGeom in 'batch' mode from macro file -\verbatim -% textGeom run.mac -\endverbatim - -It will read the geometry from a file named 'g4geom.txt', and it will create a -VRML2 file to visualise the geometry. -Therefore if you want to try any of the above-mentioned files, copy it to a -file with this name, - - -\section P03_s3 DEFINING A SENSITIVE DETECTOR - -The detector construction class ExTGDetectorConstructionWithSD shows how to -access a volume of the text geometry and assign to it a sensitive detector. -To use it, replace at exampleTextGeom.cc the line - -\verbatim -runManager->SetUserInitialization(new ExTGDetectorConstruction); -\endverbatim - -by - -\verbatim -runManager->SetUserInitialization(new ExTGDetectorConstructionWithSD); -\endverbatim - -and recompile. - -It will use the geometry from the file 'g4geom_SD.txt' - - -\section P03_s4 MIXING TEXT AND C++ GEOMETRIES - -The detector construction class ExTGDetectorConstructionWithCpp shows how to -create a volume with C++ and place it in the world or inside a volume defined -in the text geometry. -To use it, replace at exampleTextGeom.cc the line - -\verbatim -runManager->SetUserInitialization(new ExTGDetectorConstruction); -\endverbatim - -by - -\verbatim -runManager->SetUserInitialization(new ExTGDetectorConstructionWithCpp); -\endverbatim - -and recompile. - -It will use the geometry from the file 'g4geom_simple.txt' - - -\section P03_s5 CREATING NEW TAGS IN THE TEXT GEOMETRY: DEFINING CUTS PER REGION - -The detector construction class ExTGDetectorConstructionWithCuts, together with -ExTGRCLineProcessor, ExTGRCDetectorBuilder, ExTGRCRegionCutsMgr and -ExTGRCRegionData show how to add a couple of tags, ':REGION' and ':CUT', that -allow to define cuts per region in your input geometry text file. -To use it, replace at exampleTextGeom.cc the line - -\verbatim -runManager->SetUserInitialization(new ExTGDetectorConstruction); -\endverbatim - -by - -\verbatim -runManager->SetUserInitialization(new ExTGDetectorConstructionWithCuts); -\endverbatim - -and recompile. - -It will use the geometry from the file 'g4geom_cutsPerRegion.txt' - - -\section P03_s6 DUMP THE IN-MEMORY GEOMETRY TO TEXT FILE - -The run action, ExTGRunAction, triggers the writing of the in-memory Geant4 -geometry to a text file. -To use it you just have to uncomment in exampleTextGeom.cc the line - -\verbatim -runManager->SetUserAction(new ExTGRunAction); -\endverbatim - -and it will read the geometry from the file 'g4geom.txt' and will write the -geometry in a file named 'geom.txt' - -*/ diff --git a/examples/extended/persistency/P03/CMakeLists.txt b/examples/extended/persistency/P03/CMakeLists.txt index 9feb85abcf..bb1f4c653c 100644 --- a/examples/extended/persistency/P03/CMakeLists.txt +++ b/examples/extended/persistency/P03/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(P03) #---------------------------------------------------------------------------- diff --git a/examples/extended/persistency/P03/README b/examples/extended/persistency/P03/README deleted file mode 100644 index 7f5e111d83..0000000000 --- a/examples/extended/persistency/P03/README +++ /dev/null @@ -1,117 +0,0 @@ - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example TextGeom - ---------------- - -This example illustrates the use of the text geometry. - -1.- GEOMETRY EXAMPLES - -Several examples of text geometries are provided: - -g4geom_simple.txt : -- Simple construction of materials and single placements - -g4geom_matemixt.txt : -- Isotopes, elements and materials - -g4geom_boolean.txt : -- Boolean solids - -g4geom_reflections.txt : -- Reflections - -g4geom_replicas.txt : -- Replicas - -g4geom_divisions.txt : -- Divisions - -g4geom_paramLinear.txt : -- Linear parameterisations - -g4geom_paramSquare.txt : -- Square parameterisations - -g4geom_assembly.txt : -- Assembly placements - - -2.- HOW TO START ? - - - execute textGeom in 'batch' mode from macro file - % textGeom run.mac - -It will read the geometry from a file named 'g4geom.txt', and it will create a -VRML2 file to visualise the geometry. -Therefore if you want to try any of the above-mentioned files, copy it to a -file with this name, - - -3.- DEFINING A SENSITIVE DETECTOR - -The detector construction class ExTGDetectorConstructionWithSD shows how to -access a volume of the text geometry and assign to it a sensitive detector. -To use it, replace at exampleTextGeom.cc the line - - runManager->SetUserInitialization(new ExTGDetectorConstruction); - -by - - runManager->SetUserInitialization(new ExTGDetectorConstructionWithSD); - -and recompile. - -It will use the geometry from the file 'g4geom_SD.txt' - - -4.- MIXING TEXT AND C++ GEOMETRIES - -The detector construction class ExTGDetectorConstructionWithCpp shows how to -create a volume with C++ and place it in the world or inside a volume defined -in the text geometry. -To use it, replace at exampleTextGeom.cc the line - - runManager->SetUserInitialization(new ExTGDetectorConstruction); - -by - - runManager->SetUserInitialization(new ExTGDetectorConstructionWithCpp); - -and recompile. - -It will use the geometry from the file 'g4geom_simple.txt' - - -5.- CREATING NEW TAGS IN THE TEXT GEOMETRY: DEFINING CUTS PER REGION - -The detector construction class ExTGDetectorConstructionWithCuts, together with -ExTGRCLineProcessor, ExTGRCDetectorBuilder, ExTGRCRegionCutsMgr and -ExTGRCRegionData show how to add a couple of tags, ':REGION' and ':CUT', that -allow to define cuts per region in your input geometry text file. -To use it, replace at exampleTextGeom.cc the line - - runManager->SetUserInitialization(new ExTGDetectorConstruction); - -by - - runManager->SetUserInitialization(new ExTGDetectorConstructionWithCuts); - -and recompile. - -It will use the geometry from the file 'g4geom_cutsPerRegion.txt' - - -6.- DUMP THE IN-MEMORY GEOMETRY TO TEXT FILE - -The run action 'ExTGRunAction' triggers the writing of the in-memory Geant4 -geometry to a text file. -To use it you just have to uncomment in exampleTextGeom.cc the line - - runManager->SetUserAction(new ExTGRunAction); - -and it will read the geometry from the file 'g4geom.txt' and will write the -geometry in a file named 'geom.txt' diff --git a/examples/extended/persistency/P03/batch.out b/examples/extended/persistency/P03/batch.out index 1684417080..5bd23975d6 100644 --- a/examples/extended/persistency/P03/batch.out +++ b/examples/extended/persistency/P03/batch.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -29,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -122,32 +120,99 @@ Visualization verbosity changed to warnings (3) /gun/energy 10 MeV /tracking/verbose 0 /run/beamOn 10 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -157,25 +222,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -185,29 +250,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -215,31 +280,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -248,12 +313,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -261,12 +326,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -274,31 +339,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -306,31 +371,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -338,31 +403,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -370,32 +435,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -403,32 +468,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -436,31 +501,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -468,27 +533,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV Region -- -- appears in world volume This region is in the mass world. @@ -508,21 +573,21 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_WATER Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.51944 keV e- 276.265 keV e+ 270.751 keV proton 70 keV + Energy thresholds : gamma 2.52562 keV e- 277.64 keV e+ 270.815 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -538,7 +603,7 @@ G4GeometryManager::ReportVoxelStats -- Voxel Statistics Run terminated. Run Summary Number of events processed : 10 - User=0.000000s Real=0.000796s Sys=0.000000s + User=0.000000s Real=0.000948s Sys=0.000000s 10 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -569,11 +634,11 @@ Pool ID '17G4DynamicParticle', size : 0.000961 MB Pool ID '7G4Track', size : 0.00192 MB Pool ID '18G4TouchableHistory', size : 0.000961 MB Pool ID '15G4CountedObjectIvE', size : 0.000961 MB -Pool ID '18G4SmoothTrajectory', size : 0.00288 MB +Pool ID '18G4SmoothTrajectory', size : 0.00192 MB Pool ID '23G4SmoothTrajectoryPoint', size : 0.00481 MB Pool ID '21G4TrajectoryContainer', size : 0.000961 MB Number of memory pools allocated: 12 of which, static: 0 -Dynamic pools deleted: 12 / Total memory freed: 0.026 MB +Dynamic pools deleted: 12 / Total memory freed: 0.025 MB ============================================================ G4Allocator objects are deleted. UImanager deleted. diff --git a/examples/extended/persistency/README b/examples/extended/persistency/README deleted file mode 100644 index b0ab92085a..0000000000 --- a/examples/extended/persistency/README +++ /dev/null @@ -1,13 +0,0 @@ - - Geant4 Persistency Examples - =========================== - -This directory contains a set of persistency examples. - - P01 Root I/O example for storing and retrieving calorimeter hits. - P02 Root I/O example for storing and reading geometry objects. - P03 Example of detector geometry persistency in ASCII text format. - - gdml Set of examples showing usage of the GDML plugin module in Geant4. - -See the README file inside each example for more detail. diff --git a/examples/extended/persistency/gdml/.README.txt b/examples/extended/persistency/gdml/.README.txt deleted file mode 100644 index bc22842c3b..0000000000 --- a/examples/extended/persistency/gdml/.README.txt +++ /dev/null @@ -1,24 +0,0 @@ - -///\file "persistency/gdml/.README.txt" -///\brief Examples gdml README page - -/*! \page Examples_gdml Category "persistency/gdml" - -This directory contains a set of examples showing the usage of the GDML -plugin module in Geant4. - - - \link ExampleG01 G01 \endlink Simple example for importing and exporting simple GDML files. - - - \link ExampleG02 G02 \endlink Sample application showing how to import/export different - geometry setups, including STEP Tools files and structures - integrating them in a real simulation application. - - - \link ExampleG03 G03 \endlink Simple example showing how to import extensions to the GDML - schema. - - - \link ExampleG04 G04 \endlink Simple example showing how to associate detector sensitivity - to a logical-volume, making use of the auxiliary-information. - -See the README file inside each example for more detail. - -*/ diff --git a/examples/extended/persistency/gdml/CMakeLists.txt b/examples/extended/persistency/gdml/CMakeLists.txt index 46065b7428..0542c070f9 100644 --- a/examples/extended/persistency/gdml/CMakeLists.txt +++ b/examples/extended/persistency/gdml/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding all GDML examples subdirectories explicitly -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(G01) add_subdirectory(G02) diff --git a/examples/extended/persistency/gdml/G01/.README.txt b/examples/extended/persistency/gdml/G01/.README.txt deleted file mode 100644 index 754e8d1534..0000000000 --- a/examples/extended/persistency/gdml/G01/.README.txt +++ /dev/null @@ -1,58 +0,0 @@ - -///\file "persistency/gdml/G01/.README.txt" -///\brief Example G01 README page - -/*! \page ExampleG01 Example G01 - -\section G01_s1 GDML READ/WRITE - -This example demonstrates the usage of the GDML reader and writer. It allows -to export geometry descriptions in an application independent format (GDML, -Geometry Description Markup Language). -The GDML files can be then used to interchange geometries between different -applications and users. - -The detector construction consists of a call to GDMLProcessor which parses a -GDML file and returns the pointer to the world volume. The user can also write -her/his own GDML file and use it as the primary input format for her/his Geant4 -application. - -Several simple GDML files are provided: -- axes.gdml, showing loading and orientation of Cartesian axes; -- solids.gdml, list of all supported solids with placement; -- scale.gdml, a simple diamond structure made of extruded solids; -- divisionvol.gdml, a divided box; -- parameterized.gdml, a parameterised box; -- pTube.gdml, a parameterised tube; -- auxiliary.gdml, showing association of volume with auxiliary information; -- etc... - -\section G01_s2 HOW TO BUILD THE EXAMPLE ? - -- You need to have built the persistency/gdml module by having - set the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR=path_to_xercesc flag pointing to - the path where the XercesC XML parser package is installed in your system. - -- Compile and link to generate the executable (in your CMAKE build directory): -\verbatim -make -\endverbatim - - -- Execute the application. - - For reading and visualize interactively a GDML file: -\verbatim -load_gdml [GDML-file-in].gdml -\endverbatim - - - For reading, writing and visualize interactively a GDML file: -\verbatim -load_gdml [GDML-file-in].gdml [GDML-file-out].gdml -\endverbatim - - - For reading, writing a GDML file and running in batch a macro: -\verbatim -load_gdml [GDML-file-in].gdml [GDML-file-out].gdml [macro].in -\endverbatim -*/ diff --git a/examples/extended/persistency/gdml/G01/CMakeLists.txt b/examples/extended/persistency/gdml/G01/CMakeLists.txt index eece7978bd..68a79e8dfb 100644 --- a/examples/extended/persistency/gdml/G01/CMakeLists.txt +++ b/examples/extended/persistency/gdml/G01/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(G01) #---------------------------------------------------------------------------- diff --git a/examples/extended/persistency/gdml/G01/History b/examples/extended/persistency/gdml/G01/History index 70bf86b688..806bbe644d 100644 --- a/examples/extended/persistency/gdml/G01/History +++ b/examples/extended/persistency/gdml/G01/History @@ -16,6 +16,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +September 15th, 2021 Gabriele Cosmo G01-V10-07-02 +- Fixed minor overlaps in assembly.gdml and axes.gdml samples. + February 3rd, 2021 Gabriele Cosmo G01-V10-07-01 - Fixed auxiliary.gdml sample to define proper Region tags. diff --git a/examples/extended/persistency/gdml/G01/README b/examples/extended/persistency/gdml/G01/README deleted file mode 100644 index 7dc34d376c..0000000000 --- a/examples/extended/persistency/gdml/G01/README +++ /dev/null @@ -1,49 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - GDML read/write - --------------- - -This example demonstrates the usage of the GDML reader and writer. It allows -to export geometry descriptions in an application independent format (GDML, -Geometry Description Markup Language). -The GDML files can be then used to interchange geometries between different -applications and users. - -The detector construction consists of a call to GDMLProcessor which parses a -GDML file and returns the pointer to the world volume. The user can also write -her/his own GDML file and use it as the primary input format for her/his Geant4 -application. - -Several simple GDML files are provided: -- axes.gdml, showing loading and orientation of Cartesian axes; -- solids.gdml, list of all supported solids with placement; -- scale.gdml, a simple diamond structure made of extruded solids; -- divisionvol.gdml, a divided box; -- parameterized.gdml, a parameterised box; -- pTube.gdml, a parameterised tube; -- auxiliary.gdml, showing association of volume with auxiliary information; -- etc... - -HOW TO BUILD THE EXAMPLE ? - -- You need to have built the persistency/gdml module by having - set the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR= flag pointing to - the path where the XercesC XML parser package is installed in your system. - -- Compile and link to generate the executable (in your CMAKE build directory): - % make - -- Execute the application. - o For reading and visualize interactively a GDML file: - % load_gdml [GDML-file-in].gdml - - o For reading, writing and visualize interactively a GDML file: - % load_gdml [GDML-file-in].gdml [GDML-file-out].gdml - - o For reading, writing a GDML file and running in batch a macro: - % load_gdml [GDML-file-in].gdml [GDML-file-out].gdml [macro].in diff --git a/examples/extended/persistency/gdml/G01/assembly.gdml b/examples/extended/persistency/gdml/G01/assembly.gdml index da934c7f8e..962f5c906d 100644 --- a/examples/extended/persistency/gdml/G01/assembly.gdml +++ b/examples/extended/persistency/gdml/G01/assembly.gdml @@ -34,7 +34,7 @@ - + diff --git a/examples/extended/persistency/gdml/G01/axes.gdml b/examples/extended/persistency/gdml/G01/axes.gdml index 19024b431a..2a294cbd26 100644 --- a/examples/extended/persistency/gdml/G01/axes.gdml +++ b/examples/extended/persistency/gdml/G01/axes.gdml @@ -5,12 +5,12 @@ - - - - - - + + + + + + diff --git a/examples/extended/persistency/gdml/G01/block.gdml b/examples/extended/persistency/gdml/G01/block.gdml index 057dd70b14..f256ef89ee 100644 --- a/examples/extended/persistency/gdml/G01/block.gdml +++ b/examples/extended/persistency/gdml/G01/block.gdml @@ -2,9 +2,9 @@ - + - + @@ -35,30 +35,30 @@ - - - + + + - + - + - + - + - - + + - - + + @@ -74,9 +74,9 @@ - + - + @@ -84,7 +84,7 @@ - + diff --git a/examples/extended/persistency/gdml/G01/g01.out b/examples/extended/persistency/gdml/G01/g01.out index 637410fbe3..cbdef024a2 100644 --- a/examples/extended/persistency/gdml/G01/g01.out +++ b/examples/extended/persistency/gdml/G01/g01.out @@ -6,32 +6,32 @@ G4GDML: Reading definitions... G4GDML: Reading materials... G4GDML: Reading solids... G4GDML: Reading structure... -Checking overlaps for volume vol0_PV (G4Box) ... OK! -Checking overlaps for volume vol1_PV (G4Cons) ... OK! -Checking overlaps for volume vol2_PV (G4Para) ... OK! -Checking overlaps for volume vol3_PV (G4Sphere) ... OK! -Checking overlaps for volume vol4_PV (G4Trap) ... OK! -Checking overlaps for volume vol11_PV (G4Trd) ... OK! -Checking overlaps for volume vol21_PV (G4Tubs) ... OK! -Checking overlaps for volume vol31_PV (G4SubtractionSolid) ... OK! -Checking overlaps for volume vol41_PV (G4Polycone) ... OK! -Checking overlaps for volume vol412_PV (G4GenericPolycone) ... OK! -Checking overlaps for volume vol51_PV (G4Ellipsoid) ... OK! -Checking overlaps for volume vol61_PV (G4Tet) ... OK! -Checking overlaps for volume vol71_PV (G4TwistedBox) ... OK! -Checking overlaps for volume vol81_PV (G4TwistedTrd) ... OK! -Checking overlaps for volume vol91_PV (G4TwistedTrap) ... OK! -Checking overlaps for volume vol101_PV (G4TwistedTubs) ... OK! -Checking overlaps for volume vol201_PV (G4TessellatedSolid) ... OK! -Checking overlaps for volume vol301_PV (G4Torus) ... OK! -Checking overlaps for volume vol401_PV (G4Orb) ... OK! -Checking overlaps for volume vol501_PV (G4Polyhedra) ... OK! -Checking overlaps for volume vol502_PV (G4Polyhedra) ... OK! -Checking overlaps for volume vol601_PV (G4Hype) ... OK! -Checking overlaps for volume vol701_PV (G4EllipticalTube) ... OK! -Checking overlaps for volume vol1001_PV (G4EllipticalCone) ... OK! -Checking overlaps for volume vol1002_PV (G4GenericTrap) ... OK! -Checking overlaps for volume vol1003_PV (G4GenericTrap) ... OK! +Checking overlaps for volume vol0_PV:0 (G4Box) ... OK! +Checking overlaps for volume vol1_PV:0 (G4Cons) ... OK! +Checking overlaps for volume vol2_PV:0 (G4Para) ... OK! +Checking overlaps for volume vol3_PV:0 (G4Sphere) ... OK! +Checking overlaps for volume vol4_PV:0 (G4Trap) ... OK! +Checking overlaps for volume vol11_PV:0 (G4Trd) ... OK! +Checking overlaps for volume vol21_PV:0 (G4Tubs) ... OK! +Checking overlaps for volume vol31_PV:0 (G4SubtractionSolid) ... OK! +Checking overlaps for volume vol41_PV:0 (G4Polycone) ... OK! +Checking overlaps for volume vol412_PV:0 (G4GenericPolycone) ... OK! +Checking overlaps for volume vol51_PV:0 (G4Ellipsoid) ... OK! +Checking overlaps for volume vol61_PV:0 (G4Tet) ... OK! +Checking overlaps for volume vol71_PV:0 (G4TwistedBox) ... OK! +Checking overlaps for volume vol81_PV:0 (G4TwistedTrd) ... OK! +Checking overlaps for volume vol91_PV:0 (G4TwistedTrap) ... OK! +Checking overlaps for volume vol101_PV:0 (G4TwistedTubs) ... OK! +Checking overlaps for volume vol201_PV:0 (G4TessellatedSolid) ... OK! +Checking overlaps for volume vol301_PV:0 (G4Torus) ... OK! +Checking overlaps for volume vol401_PV:0 (G4Orb) ... OK! +Checking overlaps for volume vol501_PV:0 (G4Polyhedra) ... OK! +Checking overlaps for volume vol502_PV:0 (G4Polyhedra) ... OK! +Checking overlaps for volume vol601_PV:0 (G4Hype) ... OK! +Checking overlaps for volume vol701_PV:0 (G4EllipticalTube) ... OK! +Checking overlaps for volume vol1001_PV:0 (G4EllipticalCone) ... OK! +Checking overlaps for volume vol1002_PV:0 (G4GenericTrap) ... OK! +Checking overlaps for volume vol1003_PV:0 (G4GenericTrap) ... OK! G4GDML: Reading setup... G4GDML: Reading '/geant4/examples/extended/persistency/gdml/G01/solids.gdml' done! Stripping off GDML names of materials, solids and volumes ... @@ -48,7 +48,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -74,10 +74,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -124,32 +122,99 @@ Some /vis commands (optionally) take a string to specify colour. Global auxiliary info: +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -159,25 +224,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -187,29 +252,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -217,31 +282,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -250,12 +315,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -263,12 +328,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -276,31 +341,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -308,31 +373,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -340,31 +405,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -372,32 +437,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -405,32 +470,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -438,31 +503,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -470,27 +535,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -499,17 +564,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -517,67 +582,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -585,13 +650,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -599,13 +664,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -613,12 +678,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -626,13 +691,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -640,13 +705,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -654,13 +719,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -668,60 +733,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -729,27 +794,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -757,25 +822,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -783,25 +848,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -809,13 +874,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -838,7 +903,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -872,14 +936,14 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Water Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.51944 keV e- 276.265 keV e+ 270.751 keV proton 70 keV + Energy thresholds : gamma 2.52535 keV e- 277.593 keV e+ 270.769 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1219,7 +1283,7 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Run terminated. Run Summary Number of events processed : 20 - User=0.000000s Real=0.006458s Sys=0.000000s + User=0.000000s Real=0.004420s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1244,14 +1308,14 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 69.99999999999999 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Water Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 2.519443689999526 keV e- 276.2650242766716 keV e+ 270.7512371977519 keV proton 69.99999999999999 keV + Energy thresholds : gamma 2.525347827299922 keV e- 277.5934763678286 keV e+ 270.7691906611086 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1589,7 +1653,7 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Run terminated. Run Summary Number of events processed : 20 - User=0.010000s Real=0.003551s Sys=0.000000s + User=0.000000s Real=0.003726s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1615,14 +1679,14 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 69.99999999999999 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Water Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 2.519443689999526 keV e- 276.2650242766716 keV e+ 270.7512371977519 keV proton 69.99999999999999 keV + Energy thresholds : gamma 2.525347827299922 keV e- 277.5934763678286 keV e+ 270.7691906611086 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1632,7 +1696,7 @@ Index : 1 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 20 - User=0.000000s Real=0.001910s Sys=0.000000s + User=0.010000s Real=0.001952s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1657,14 +1721,14 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 69.99999999999999 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Water Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 2.519443689999526 keV e- 276.2650242766716 keV e+ 270.7512371977519 keV proton 69.99999999999999 keV + Energy thresholds : gamma 2.525347827299922 keV e- 277.5934763678286 keV e+ 270.7691906611086 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1674,7 +1738,7 @@ Index : 1 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 20 - User=0.000000s Real=0.001896s Sys=0.000000s + User=0.000000s Real=0.002009s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1699,14 +1763,14 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 69.99999999999999 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Water Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 2.519443689999526 keV e- 276.2650242766716 keV e+ 270.7512371977519 keV proton 69.99999999999999 keV + Energy thresholds : gamma 2.525347827299922 keV e- 277.5934763678286 keV e+ 270.7691906611086 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1716,7 +1780,7 @@ Index : 1 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 20 - User=0.000000s Real=0.001874s Sys=0.000000s + User=0.000000s Real=0.002271s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1740,6 +1804,8 @@ G4RNGHelper object is deleted. ================== Deleting memory pools =================== Pool ID '20G4NavigationLevelRep', size : 0.00961 MB Pool ID '24G4ReferenceCountedHandleIvE', size : 0.000961 MB +Pool ID '16G4SmartVoxelNode', size : 0.00385 MB +Pool ID '17G4SmartVoxelProxy', size : 0.00192 MB Pool ID '7G4Event', size : 0.000961 MB Pool ID '15G4PrimaryVertex', size : 0.000961 MB Pool ID '17G4PrimaryParticle', size : 0.000961 MB @@ -1747,8 +1813,8 @@ Pool ID '17G4DynamicParticle', size : 0.000961 MB Pool ID '7G4Track', size : 0.000961 MB Pool ID '18G4TouchableHistory', size : 0.000961 MB Pool ID '15G4CountedObjectIvE', size : 0.000961 MB -Number of memory pools allocated: 9 of which, static: 0 -Dynamic pools deleted: 9 / Total memory freed: 0.017 MB +Number of memory pools allocated: 11 of which, static: 0 +Dynamic pools deleted: 11 / Total memory freed: 0.023 MB ============================================================ G4Allocator objects are deleted. UImanager deleted. diff --git a/examples/extended/persistency/gdml/G02/.README.txt b/examples/extended/persistency/gdml/G02/.README.txt deleted file mode 100644 index 20f0331d07..0000000000 --- a/examples/extended/persistency/gdml/G02/.README.txt +++ /dev/null @@ -1,57 +0,0 @@ - -///\file "persistency/gdml/G02/.README.txt" -///\brief Example G02 README page - -/*! \page ExampleG02 Example G02 - - -\section G02_s1 EXAMPLE OF USE GDML READER/WRITER IN DETECTOR CONSTRUCTION - - In this directory you can find a example showing how to use GDML module for - reading and writing. It is also shown how to Read STEP Tools files. - In this example the DetectorConstruction consists of a Simple Detector, then - this Detector is filled/written in GDML. - The different options for writing and reading GDML files are shown in the - Detector Construction: writing modular files, using different schema location, - setting parameters for names in GDML file, etc. - For more information, please, refer to the GDML Documentation. - - The Geometry is a Simple Detector Box with 4 Subdetectors. - This setup shows how to use Reflection Factory, Assembly of Volumes and - Parameterisation. - Using commands or macros it possible to read or write GDML file. - -\section G02_s2 HOW TO BUILD THE EXAMPLE ? - - - - You need to have built the persistency/gdml module by having - set the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR=path_to_xercesc flag pointing to - the path where the XercesC XML parser package is installed in your system. - - - Compile and link to generate the executable (in your CMAKE build directory): -\verbatim -% make -\endverbatim - - - Execute the application: -\verbatim -% geotest [macro-file].mac -\endverbatim - - You can run this application with the following macro file: - - - write_gdml.mac : This macro will write the Geometry defined in file - "test.gdml" and output to a new file wtest.gdml - To change this name you can use command : - /mydet/writeFile FileName.gdml - - - read_gdml.mac : This macro will read the Geometry from file "test.gdml" - To change this name you can use command : - /mydet/readFile FileName.gdml - - - read_step.mac : This macro will read the STEP Tool files "mbb.geom" and - "mbb.tree" and load them in memory. - To change this name you can use command : - /mydet/StepFile FileName -*/ diff --git a/examples/extended/persistency/gdml/G02/CMakeLists.txt b/examples/extended/persistency/gdml/G02/CMakeLists.txt index 1dbf10ea74..5a718aceeb 100644 --- a/examples/extended/persistency/gdml/G02/CMakeLists.txt +++ b/examples/extended/persistency/gdml/G02/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(G02) #---------------------------------------------------------------------------- diff --git a/examples/extended/persistency/gdml/G02/History b/examples/extended/persistency/gdml/G02/History index b0ffcce120..5ce32f2eb4 100644 --- a/examples/extended/persistency/gdml/G02/History +++ b/examples/extended/persistency/gdml/G02/History @@ -16,6 +16,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +November 11th, 2021 Gabriele Cosmo G02-V10-07-00 +- Fixed visualisation settings in input macros. + November 13th, 2020 Ben Morgan G02-V10-06-01 - Enforce use of Serial RunManager. diff --git a/examples/extended/persistency/gdml/G02/README b/examples/extended/persistency/gdml/G02/README deleted file mode 100644 index 2651746022..0000000000 --- a/examples/extended/persistency/gdml/G02/README +++ /dev/null @@ -1,47 +0,0 @@ -------------------------------------------------------------------- - - Example of use GDML reader/writer in Detector Construction - ----------------------------------------------------------- - - In this directory you can find a example showing how to use GDML module for - reading and writing. It is also shown how to Read STEP Tools files. - In this example the DetectorConstruction consists of a Simple Detector, then - this Detector is filled/written in GDML. - The different options for writing and reading GDML files are shown in the - Detector Construction: writing modular files, using different schema location, - setting parameters for names in GDML file, etc. - For more information, please, refer to the GDML Documentation. - - The Geometry is a Simple Detector Box with 4 Subdetectors. - This setup shows how to use Reflection Factory, Assembly of Volumes and - Parameterisation. - Using commands or macros it possible to read or write GDML file. - - HOW TO BUILD THE EXAMPLE ? - - - You need to have built the persistency/gdml module by having - set the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR= flag pointing to - the path where the XercesC XML parser package is installed in your system. - - - Compile and link to generate the executable (in your CMAKE build directory): - % make - - - Execute the application: - % geotest [macro-file].mac - - You can run this application with the following macro file: - - write_gdml.mac : This macro will write the Geometry defined in file - "test.gdml" and output to a new file wtest.gdml - To change this name you can use command : - /mydet/writeFile FileName.gdml - - read_gdml.mac : This macro will read the Geometry from file "test.gdml" - To change this name you can use command : - /mydet/readFile FileName.gdml - - read_step.mac : This macro will read the STEP Tool files "mbb.geom" and - "mbb.tree" and load them in memory. - To change this name you can use command : - /mydet/StepFile FileName diff --git a/examples/extended/persistency/gdml/G02/read_gdml.mac b/examples/extended/persistency/gdml/G02/read_gdml.mac index d83c730a5b..02f67eae45 100644 --- a/examples/extended/persistency/gdml/G02/read_gdml.mac +++ b/examples/extended/persistency/gdml/G02/read_gdml.mac @@ -2,15 +2,12 @@ # Visualization of detector geometry and events ################################################### -# create empty scene -/vis/scene/create - # reading Geometry from File /mydet/readFile test.gdml /run/initialize # Create a scene handler for a specific graphics system -/vis/open OGL +/vis/open OGL 600x600-0+0 # draw scene /vis/viewer/zoom 1.5 diff --git a/examples/extended/persistency/gdml/G02/read_step.mac b/examples/extended/persistency/gdml/G02/read_step.mac index a2c6240ed9..dc97cb5faa 100644 --- a/examples/extended/persistency/gdml/G02/read_step.mac +++ b/examples/extended/persistency/gdml/G02/read_step.mac @@ -2,15 +2,12 @@ # Visualization of detector geometry and events ################################################### -# create empty scene -/vis/scene/create - # reading Geometry from STEP file /mydet/StepFile mbb /run/initialize # Create a scene handler for a specific graphics system -/vis/open OGL +/vis/open OGL 600x600-0+0 #/vis/open VRML2FILE # draw scene diff --git a/examples/extended/persistency/gdml/G02/vis.mac b/examples/extended/persistency/gdml/G02/vis.mac index c3d49f33e5..59e5305948 100644 --- a/examples/extended/persistency/gdml/G02/vis.mac +++ b/examples/extended/persistency/gdml/G02/vis.mac @@ -2,9 +2,6 @@ # Visualization of detector geometry and events ################################################### -# create empty scene -/vis/scene/create - /run/initialize # Use this open statement to create an OpenGL view: /vis/open OGL 600x600-0+0 diff --git a/examples/extended/persistency/gdml/G02/write_gdml.mac b/examples/extended/persistency/gdml/G02/write_gdml.mac index 3f168b146a..a2f2c68936 100644 --- a/examples/extended/persistency/gdml/G02/write_gdml.mac +++ b/examples/extended/persistency/gdml/G02/write_gdml.mac @@ -2,15 +2,12 @@ # Visualization of detector geometry and events ################################################### -# create empty scene -/vis/scene/create - # writing Geometry in GDML file /mydet/writeFile wtest.gdml /run/initialize # Create a scene handler for a specific graphics system -/vis/open OGL +/vis/open OGL 600x600-0+0 # draw scene /vis/viewer/zoom 1.5 diff --git a/examples/extended/persistency/gdml/G03/.README.txt b/examples/extended/persistency/gdml/G03/.README.txt deleted file mode 100644 index c099bed8a9..0000000000 --- a/examples/extended/persistency/gdml/G03/.README.txt +++ /dev/null @@ -1,49 +0,0 @@ - -///\file "persistency/gdml/G03/.README.txt" -///\brief Example G03 README page - -/*! \page ExampleG03 Example G03 - -\section G03_s1 EXAMPLE OF DEFINITION OF A GDML EXTENSION WITH ASSOCIATED READER AND WRITER - - - In this directory you can find an example showing how to extend the GDML - schema and plug-in a custom reader and writer to the system for handling - the extension. - For more information, please, refer to the GDML Documentation. - - The Geometry is a Simple Box to which it is assigned a color as - visualization attribute. - The entity "color" is defined as part of the "extension" tag and properly - implemented in the GDML schema extension placed inside the directory - SimpleExtensionSchema. - The GDML file implenting the geometry with colors extension is - color_extension.gdml, in which the standard "gdml" tag has been replaced - by the "gdml_simple_extension" tag, with relative location for the new schema. - The GDML file is automatically loaded by the program. - It is also possible to use UI commands or macros as arguments to read any - standard GDML file. - -\section G03_s2 HOW TO BUILD THE EXAMPLE ? - - - You need to have built the persistency/gdml module by having - set the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR=path_to_xercesc flag pointing to - the path where the XercesC XML parser package is installed in your system. - - - Compile and link to generate the executable (in your CMAKE build directory): -\verbatim -% make -\endverbatim - - - Execute the application for reading and visualizing the setup: -\verbatim -% gdml_ext read_ext.mac -\endverbatim - - - Execute the application for also writing the setup: -\verbatim -% gdml_ext [write_ext.mac] -\endverbatim - -*/ diff --git a/examples/extended/persistency/gdml/G03/CMakeLists.txt b/examples/extended/persistency/gdml/G03/CMakeLists.txt index 2a92e424d1..a59b538120 100644 --- a/examples/extended/persistency/gdml/G03/CMakeLists.txt +++ b/examples/extended/persistency/gdml/G03/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(G03) #---------------------------------------------------------------------------- diff --git a/examples/extended/persistency/gdml/G03/History b/examples/extended/persistency/gdml/G03/History index 6305799a1b..d43842fa02 100644 --- a/examples/extended/persistency/gdml/G03/History +++ b/examples/extended/persistency/gdml/G03/History @@ -16,6 +16,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +November 11th, 2021 Gabriele Cosmo G03-V10-07-00 +- Fixed visualisation settings in input macros. + November 13th, 2020 Ben Morgan G03-V10-06-01 - Enforce use of Serial RunManager. diff --git a/examples/extended/persistency/gdml/G03/README b/examples/extended/persistency/gdml/G03/README deleted file mode 100644 index 1982096cc2..0000000000 --- a/examples/extended/persistency/gdml/G03/README +++ /dev/null @@ -1,37 +0,0 @@ -------------------------------------------------------------------- - - Example of definition of a GDML extension with associated reader and writer - --------------------------------------------------------------------------- - - In this directory you can find an example showing how to extend the GDML - schema and plug-in a custom reader and writer to the system for handling - the extension. - For more information, please, refer to the GDML Documentation. - - The Geometry is a Simple Box to which it is assigned a color as - visualization attribute. - The entity "color" is defined as part of the "extension" tag and properly - implemented in the GDML schema extension placed inside the directory - SimpleExtensionSchema. - The GDML file implenting the geometry with colors extension is - color_extension.gdml, in which the standard "gdml" tag has been replaced - by the "gdml_simple_extension" tag, with relative location for the new schema. - The GDML file is automatically loaded by the program. - It is also possible to use UI commands or macros as arguments to read any - standard GDML file. - - HOW TO BUILD THE EXAMPLE ? - - - You need to have built the persistency/gdml module by having - set the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR= flag pointing to - the path where the XercesC XML parser package is installed in your system. - - - Compile and link to generate the executable (in your CMAKE build directory): - % make - - - Execute the application for reading and visualizing the setup: - % gdml_ext read_ext.mac - - - Execute the application for also writing the setup: - % gdml_ext [write_ext.mac] diff --git a/examples/extended/persistency/gdml/G03/read_ext.mac b/examples/extended/persistency/gdml/G03/read_ext.mac index e8cb914c3f..def07ba6f4 100644 --- a/examples/extended/persistency/gdml/G03/read_ext.mac +++ b/examples/extended/persistency/gdml/G03/read_ext.mac @@ -2,9 +2,6 @@ # Visualization of detector geometry and events ################################################### -# create empty scene -/vis/scene/create - # reading extended GDML Geometry from file /mydet/readFile color_extension.gdml /run/initialize diff --git a/examples/extended/persistency/gdml/G03/vis.mac b/examples/extended/persistency/gdml/G03/vis.mac index 60c703016e..c19431b3e4 100644 --- a/examples/extended/persistency/gdml/G03/vis.mac +++ b/examples/extended/persistency/gdml/G03/vis.mac @@ -2,9 +2,6 @@ # Visualization of detector geometry and events ################################################### -# create empty scene -/vis/scene/create - /run/initialize # # Use this open statement to create an OpenGL view: diff --git a/examples/extended/persistency/gdml/G03/write_ext.mac b/examples/extended/persistency/gdml/G03/write_ext.mac index 6d14a533db..e065b9aa9d 100644 --- a/examples/extended/persistency/gdml/G03/write_ext.mac +++ b/examples/extended/persistency/gdml/G03/write_ext.mac @@ -2,9 +2,6 @@ # Visualization of detector geometry and events ################################################### -# create empty scene -/vis/scene/create - # reading extended GDML Geometry from file /mydet/writeFile color_extension_test.gdml /run/initialize diff --git a/examples/extended/persistency/gdml/G04/.README.txt b/examples/extended/persistency/gdml/G04/.README.txt deleted file mode 100644 index 81a1ba98a8..0000000000 --- a/examples/extended/persistency/gdml/G04/.README.txt +++ /dev/null @@ -1,39 +0,0 @@ - -///\file "persistency/gdml/G04/.README.txt" -///\brief Example G04 README page - -/*! \page ExampleG04 Example G04 - - -\section G04_s1 GDML DETECTOR SENSITIVITY - -This example demonstrates the usage of the GDML auxiliary information for -associating a sensitive detector to a volume. - -The detector construction consists of a call to GDMLProcessor which parses a -GDML file and returns the pointer to the world volume. The user can also write -her/his own GDML file and use it as the primary input format for her/his Geant4 -application. - -A simple GDML files is provided: -- auxiliary.gdml, showing association of a volume with the auxiliary - information, related to the sensitive detector. - -\section G04_s2 HOW TO BUILD THE EXAMPLE ? - -- You need to have built the persistency/gdml module by having - set the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR=path_to_xercesc flag pointing to - the path where the XercesC XML parser package is installed in your system. - -- Compile and link to generate the executable (in your CMAKE build directory): -\verbatim -% make -\endverbatim - -- Execute the application for parsing interactively the GDML file: -\verbatim -% gdml_det auxiliary.gdml -\endverbatim - -*/ diff --git a/examples/extended/persistency/gdml/G04/CMakeLists.txt b/examples/extended/persistency/gdml/G04/CMakeLists.txt index 779a8e4a16..bca91dd071 100644 --- a/examples/extended/persistency/gdml/G04/CMakeLists.txt +++ b/examples/extended/persistency/gdml/G04/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(G04) #---------------------------------------------------------------------------- diff --git a/examples/extended/persistency/gdml/G04/README b/examples/extended/persistency/gdml/G04/README deleted file mode 100644 index 116ed74a0b..0000000000 --- a/examples/extended/persistency/gdml/G04/README +++ /dev/null @@ -1,34 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - GDML detector sensitivity - ------------------------- - -This example demonstrates the usage of the GDML auxiliary information for -associating a sensitive detector to a volume. - -The detector construction consists of a call to GDMLProcessor which parses a -GDML file and returns the pointer to the world volume. The user can also write -her/his own GDML file and use it as the primary input format for her/his Geant4 -application. - -A simple GDML files is provided: -- auxiliary.gdml, showing association of a volume with the auxiliary - information, related to the sensitive detector. - -HOW TO BUILD THE EXAMPLE ? - -- You need to have built the persistency/gdml module by having - set the -DGEANT4_USE_GDML=ON flag during the CMAKE configuration step, - as well as the -DXERCESC_ROOT_DIR= flag pointing to - the path where the XercesC XML parser package is installed in your system. - -- Compile and link to generate the executable (in your CMAKE build directory): - % make - -- Execute the application. - o For parsing interactively the GDML file: - % gdml_det auxiliary.gdml diff --git a/examples/extended/persistency/gdml/G04/g04.out b/examples/extended/persistency/gdml/G04/g04.out index 45da1e01e5..8f17c42c4a 100644 --- a/examples/extended/persistency/gdml/G04/g04.out +++ b/examples/extended/persistency/gdml/G04/g04.out @@ -22,7 +22,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -59,10 +59,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -106,32 +104,99 @@ Some /vis commands (optionally) take a string to specify colour. "/vis/list" to see available colours. /run/verbose 2 /run/beamOn 20 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -141,25 +206,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -169,29 +234,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -199,31 +264,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -232,12 +297,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -245,12 +310,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -258,31 +323,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -290,31 +355,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -322,31 +387,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -354,32 +419,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -387,32 +452,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -420,31 +485,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -452,27 +517,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -481,17 +546,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -499,67 +564,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -567,13 +632,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -581,13 +646,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -595,12 +660,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -608,13 +673,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -622,13 +687,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -636,13 +701,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -650,60 +715,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -711,27 +776,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -739,25 +804,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -765,25 +830,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -791,13 +856,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -820,7 +885,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -843,7 +907,7 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1080,7 +1144,7 @@ Processing hits .... Run terminated. Run Summary Number of events processed : 20 - User=0.010000s Real=0.010586s Sys=0.000000s + User=0.010000s Real=0.001187s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1105,7 +1169,7 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 69.99999999999999 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1335,7 +1399,7 @@ Processing hits .... Run terminated. Run Summary Number of events processed : 20 - User=0.000000s Real=0.000841s Sys=0.000000s + User=0.000000s Real=0.000883s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1361,7 +1425,7 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 69.99999999999999 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1391,7 +1455,7 @@ Processing hits .... Run terminated. Run Summary Number of events processed : 20 - User=0.000000s Real=0.000137s Sys=0.000000s + User=0.000000s Real=0.000140s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1416,7 +1480,7 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 69.99999999999999 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1446,7 +1510,7 @@ Processing hits .... Run terminated. Run Summary Number of events processed : 20 - User=0.000000s Real=0.000109s Sys=0.000000s + User=0.000000s Real=0.000103s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -1471,7 +1535,7 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 69.99999999999999 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1501,7 +1565,7 @@ Processing hits .... Run terminated. Run Summary Number of events processed : 20 - User=0.000000s Real=0.000102s Sys=0.000000s + User=0.000000s Real=0.000110s Sys=0.000000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. diff --git a/examples/extended/persistency/gdml/README b/examples/extended/persistency/gdml/README deleted file mode 100644 index d207c81979..0000000000 --- a/examples/extended/persistency/gdml/README +++ /dev/null @@ -1,17 +0,0 @@ - - Geant4 GDML Examples - ==================== - -This directory contains a set of examples showing the usage of the GDML -plugin module in Geant4. - - G01 Simple example for importing and exporting simple GDML files. - G02 Sample application showing how to import/export different - geometry setups, including STEP Tools files and structures - integrating them in a real simulation application. - G03 Simple example showing how to import extensions to the GDML - schema. - G04 Simple example showing how to associate detector sensitivity - to a logical-volume, making use of the auxiliary-information. - -See the README file inside each example for more detail. diff --git a/examples/extended/physicslists/.README.txt b/examples/extended/physicslists/.README.txt deleted file mode 100644 index 73ff6f566e..0000000000 --- a/examples/extended/physicslists/.README.txt +++ /dev/null @@ -1,26 +0,0 @@ - -///\file "physicslists/.README.txt" -///\brief Examples physicslists README page - -/*! \page Examples_physicslists Category "physicslists" - - Examples in this directory demonstrate usage of Geant4 reference physics lists - and physics builders. - -\link Examplefactory factory \endlink - -Demonstrates the usage of G4PhysListFactory to build the concrete physics list - -\link ExampleextensibleFactory extensibleFactory \endlink - - Demonstrates the usage of extensible g4alt::G4PhysListFactory to build a - concrete physics list. It also demonstrates the setting of an alternative - "default" physics list; extending existing lists by adding/replacing physics - constructors; and extending the factory with user supplied physics lists. - -\link ExamplegenericPL genericPL \endlink - - Demonstrates the usage of G4GenericPhysicsList to build the concrete physics - list at the run time. - -*/ diff --git a/examples/extended/physicslists/CMakeLists.txt b/examples/extended/physicslists/CMakeLists.txt index 33b86c8a7d..09479da8f1 100644 --- a/examples/extended/physicslists/CMakeLists.txt +++ b/examples/extended/physicslists/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding all physicslist examples subdirectories explicitly -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(factory) add_subdirectory(extensibleFactory) diff --git a/examples/extended/physicslists/README b/examples/extended/physicslists/README deleted file mode 100644 index 90697e81a6..0000000000 --- a/examples/extended/physicslists/README +++ /dev/null @@ -1,26 +0,0 @@ - - Geant4 extended examples - physicslists - ---------------------------------------- - - Examples in this directory demonstrate usage of Geant4 reference physics lists - and physics builders. - - factory - -------- - - Demonstrates the usage of G4PhysListFactory to build the concrete physics list - - extensibleFactory - ----------------- - - Demonstrates the usage of extensible g4alt::G4PhysListFactory to build a - concrete physics list. It also demonstrates the setting of an alternative - "default" physics list; extending existing lists by adding/replacing physics - constructors; and extending the factory with user supplied physics lists. - - - genericPL - --------- - - Demonstrates the usage of G4GenericPhysicsList to build the concrete physics - list at the run time. diff --git a/examples/extended/physicslists/extensibleFactory/.README.txt b/examples/extended/physicslists/extensibleFactory/.README.txt deleted file mode 100644 index c6671b17b2..0000000000 --- a/examples/extended/physicslists/extensibleFactory/.README.txt +++ /dev/null @@ -1,95 +0,0 @@ - -///\file "physicslists/extensibleFactory/.README.txt" -///\brief Example extensibleFactory README page - -/*! \page ExampleextensibleFactory Example extensibleFactory - -\author R. Hatcher \n -Fermilab \n -(based on Hadr00 by V. Ivantchenko, CERN) - -Examples in the physicslist category show the possible ways how to define -a physics list from Geant4 physics constructors. This example demonstrates -the usage of g4alt::G4PhysListFactory to build a concrete physics list. - -Physics List can be defined by its name given by the -p argument of the of the -run command or by the PHYSLIST environment variable. - -\verbatim - ./extensibleFactory -m my.macro [ -p QGSP_BERT ] \ - [ -v | --verbose ] [ -h | --help ] -\endverbatim - -By default, FTFP_BERT Physics List will be instantiated if --p argument is not set and the PHYSLIST environment variable is not defined. -This is the system default, but can be overridden using the -SetDefaultReferencePhysList() method on the factory (see the code). - -The extensible factory allows users to define and register their own physics -lists. This example shows the addtional a new list "MySpecialPhysList". - -\verbatim - ./extensibleFactory -m run.mac -p MySpecialPhysList -\endverbatim - -The extensible factory also allows for the extension of lists by adding -(using "+" as a separator) or replacing (using "_" as a separator) -specific physics constructors. These can be specified by -pre-defining a short name (e.g. RADIO for G4RadioactiveDecayPhysics) or -providing the full class name. - -\verbatim - ./extensibleFactory -m run.mac -p FTFP_BERT_EMX+G4OpticalPhysics+RADIO -\endverbatim - -uses the FTFP_BERT physics list as a base - - replaces the list's standard EM portion with - G4EmStandardPhysics_option2 ( standard EMX extension ) - - adds G4OpticalPhysics - - adds G4RadioactiveDecayPhysics (RADIO defined in code to map to this) - -The same experimental setup is used for all examples in the physicslist category: - -\section extensibleFactory_s1 Detector description - -The geometry (defined in the DetectorConstruction class) consists in a box of scintillator material (CsI) followed by a thin box of air (screen) which is used to simplify scoring. - -\section extensibleFactory_s2 Primary generator - -The primary generator is defined with usage of G4ParticleGun. -The default particle is proton which hits the box perpendicular to the input face. -The type of the particle and its energy are set in the PrimaryGeneratorAction class, and can -be changed via the G4 built-in commands of the G4ParticleGun class. - - -\section extensibleFactory_s3 Scoring (ntuples) - -The screen volume is associated with a sensitive detector, ScreenSD, -which accounts the following particle properties: -- trackID -- particle PDG encoding -- particle kinetic energy -- particle X,Y position -- particle time - -The scored quantities are filled in the Screen ntuple, which is defined using G4AnalysisManager -in RunAction class. The ntuple is saved in a Root file, which name is set to be equal to the -example name in main () function. - -\section extensibleFactory_s4 How to build - -An additional step is needed when building the example with GNUmake -due to using the extra shared directory: -\verbatim - % cd path_to_example/example - % gmake setup - % gmake -\endverbatim - -This will copy the files from shared in the example include and src; -to remove these files: -\verbatim - % gmake clean_setup -\endverbatim - -*/ diff --git a/examples/extended/physicslists/extensibleFactory/CMakeLists.txt b/examples/extended/physicslists/extensibleFactory/CMakeLists.txt index cddf3eafe4..b3b5579e15 100644 --- a/examples/extended/physicslists/extensibleFactory/CMakeLists.txt +++ b/examples/extended/physicslists/extensibleFactory/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(extensibleFactory) #---------------------------------------------------------------------------- diff --git a/examples/extended/physicslists/extensibleFactory/History b/examples/extended/physicslists/extensibleFactory/History index f9783f5adc..0b6c90a9e3 100644 --- a/examples/extended/physicslists/extensibleFactory/History +++ b/examples/extended/physicslists/extensibleFactory/History @@ -14,6 +14,16 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06/10/21 I. Hrivnacova (extFactory-V10-07-01) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root), + removed Analysis.hh. + +19/07/21 I. Hrivnacova (extFactory-V10-07-00) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 10/11/20 I. Hrivnacova (extFactory-V10-06-00) - Migration to G4RunManagerFactory - Removed trailing whitespaces diff --git a/examples/extended/physicslists/extensibleFactory/README b/examples/extended/physicslists/extensibleFactory/README deleted file mode 100644 index ed764b8cfd..0000000000 --- a/examples/extended/physicslists/extensibleFactory/README +++ /dev/null @@ -1,93 +0,0 @@ - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - - Example extensibleFactory - -R. Hatcher -Fermilab -(based on Hadr00 by V. Ivantchenko, CERN) - -Examples in the physicslist category show the possible ways how to define -a physics list from Geant4 physics constructors. This example demonstrates -the usage of g4alt::G4PhysListFactory to build the concrete physics list. - -Physics List can be defined by its name given by the -p argument of the of the -run command or by the PHYSLIST environment variable. - - ./extensibleFactory -m my.macro [ -p QGSP_BERT ] \ - [ -v | --verbose ] [ -h | --help ] - -By default, FTFP_BERT Physics List will be instantiated if --p argument is not set and the PHYSLIST environment variable is not defined. -This is the system default, but can be overridden using the -SetDefaultReferencePhysList() method on the factory (see the code). - -The extensible factory allows users to define and register their own physics -lists. This example shows the addtional a new list "MySpecialPhysList". - - ./extensibleFactory -m run.mac -p MySpecialPhysList - -The extensible factory also allows for the extension of lists by adding -(using "+" as a separator) or replacing (using "_" as a separator) -specific physics constructors. These can be specified by -pre-defining a short name (e.g. RADIO for G4RadioactiveDecayPhysics) or -providing the full class name. - - ./extensibleFactory -m run.mac -p FTFP_BERT_EMX+G4OpticalPhysics+RADIO - -uses the FTFP_BERT physics list as a base - * replaces the list's standard EM portion with - G4EmStandardPhysics_option2 ( standard EMX extension ) - * adds G4OpticalPhysics - * adds G4RadioactiveDecayPhysics (RADIO defined in code to map to this) - -The same experimental setup is used for all examples in the physicslist -category: - -1- Detector description ------------------------ - -The geometry (defined in the DetectorConstruction class) consists in a box of -scintillator material (CsI) followed by a thin box of air (screen) which is used -to simplify scoring. - - -2- Primary generator --------------------- - -The primary generator is defined with usage of G4ParticleGun. -The default particle is proton which hits the box perpendicular to the input face. -The type of the particle and its energy are set in the PrimaryGeneratorAction class, and can -be changed via the G4 built-in commands of the G4ParticleGun class. - - -3- Scoring (ntuples) --------------------- - -The screen volume is associated with a sensitive detector, ScreenSD, -which accounts the following particle properties: -- trackID -- particle PDG encoding -- particle kinetic energy -- particle X,Y position -- particle time - -The scored quantities are filled in the Screen ntuple, which is defined using G4AnalysisManager -in RunAction class. The ntuple is saved in a Root file, which name is set to be equal to the -example name in main () function. - -4- How to build ----------------- - -An additional step is needed when building the example with GNUmake -due to using the extra shared directory: - % cd path_to_example/example - % gmake setup - % gmake - -This will copy the files from shared in the example include and src; -to remove these files: - % gmake clean_setup - diff --git a/examples/extended/physicslists/extensibleFactory/extensibleFactory.out b/examples/extended/physicslists/extensibleFactory/extensibleFactory.out index 5d03aa53b7..044dd9640d 100644 --- a/examples/extended/physicslists/extensibleFactory/extensibleFactory.out +++ b/examples/extended/physicslists/extensibleFactory/extensibleFactory.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -23,16 +23,7 @@ G4PhysListRegistry::GetModularPhysicsList , as "MySpecialPhys <<< Reference Physics List QBBC <<< Reference Physics List MySpecialPhysList is built -Using Root - --------- WWWW ------- G4Exception-START -------- WWWW ------- -*** G4Exception : Analysis_W013 - issued by : G4RootNtupleFileManager::SetNtupleMergingMode -Merging ntuples is not applicable in sequential application. -Setting was ignored. -*** This is just a warning message. *** --------- WWWW -------- G4Exception-END --------- WWWW ------- - +Using Visualization Manager instantiating with verbosity "warnings (3)"... Visualization Manager initialising... Registering graphics systems... @@ -41,10 +32,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -128,39 +117,106 @@ Some /vis commands (optionally) take a string to specify colour. -Checking overlaps for volume Box (G4Box) ... OK! -Checking overlaps for volume Screen (G4Box) ... OK! +Checking overlaps for volume Box:0 (G4Box) ... OK! +Checking overlaps for volume Screen:0 (G4Box) ... OK! ### HadronInelasticQBBC Construct Process: Emin(FTFP)= 3 GeV Emax(FTFP)= 100000 GeV Emin(BERT)= 1 GeV Emax(BERT)= 6 GeV Emax(BERTpions)= 12 GeV Emin(BIC) = 0 GeV Emax(BIC)= 1.5 GeV. ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -170,25 +226,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -198,29 +254,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -228,31 +284,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -261,12 +317,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -274,12 +330,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -287,31 +343,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -319,31 +375,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -351,31 +407,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -383,32 +439,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -416,32 +472,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -449,31 +505,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -481,27 +537,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -510,18 +566,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -529,71 +585,71 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: ionElastic - Model: NNDiffuseElastic: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: NNDiffuseElastic: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -601,13 +657,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -615,13 +671,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -629,12 +685,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -642,13 +698,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -656,13 +712,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -670,13 +726,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -684,60 +740,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -745,27 +801,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -773,27 +829,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -801,26 +857,26 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -828,13 +884,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -857,15 +913,25 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. + +-------- WWWW ------- G4Exception-START -------- WWWW ------- +*** G4Exception : Analysis_W001 + issued by : G4RootNtupleFileManager::SetNtupleMergingMode +Merging ntuples is not applicable in sequential application. +Setting was ignored. +*** This is just a warning message. *** +-------- WWWW -------- G4Exception-END --------- WWWW ------- + +... set ntuple merging row mode : row-wise - done ... create file : extensibleFactory.root - done ... open analysis file : extensibleFactory.root - done +... open analysis file : extensibleFactory.root - done --> Event 0 starts. --> Event 100 starts. --> Event 200 starts. diff --git a/examples/extended/physicslists/extensibleFactory/shared/include/Analysis.hh b/examples/extended/physicslists/extensibleFactory/shared/include/Analysis.hh deleted file mode 100644 index ee975175d6..0000000000 --- a/examples/extended/physicslists/extensibleFactory/shared/include/Analysis.hh +++ /dev/null @@ -1,37 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file Analysis.hh -/// \brief Selection of the analysis technology - -#ifndef Analysis_h -#define Analysis_h 1 - -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" - -#endif diff --git a/examples/extended/physicslists/extensibleFactory/shared/include/RunAction.hh b/examples/extended/physicslists/extensibleFactory/shared/include/RunAction.hh index 4af3e1fa77..d3e26b81f6 100644 --- a/examples/extended/physicslists/extensibleFactory/shared/include/RunAction.hh +++ b/examples/extended/physicslists/extensibleFactory/shared/include/RunAction.hh @@ -46,8 +46,7 @@ class G4Run; /// - Track length in absorber /// - Track length in gap /// The same values are also saved in the ntuple. -/// The histograms and ntuple are saved in the output file in a format -/// accoring to a selected technology in Analysis.hh. +/// The histograms and ntuple are saved in the Root output file by default. /// /// In EndOfRunAction(), the accumulated statistic and computed /// dispersion is printed. diff --git a/examples/extended/physicslists/extensibleFactory/shared/src/RunAction.cc b/examples/extended/physicslists/extensibleFactory/shared/src/RunAction.cc index 83b27dcf0b..a8018b39c5 100644 --- a/examples/extended/physicslists/extensibleFactory/shared/src/RunAction.cc +++ b/examples/extended/physicslists/extensibleFactory/shared/src/RunAction.cc @@ -28,12 +28,12 @@ /// \brief Implementation of the RunAction class #include "RunAction.hh" -#include "Analysis.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +#include "G4AnalysisManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -42,12 +42,11 @@ RunAction::RunAction(const G4String& fileName) fFileName(fileName) { // Create analysis manager - // The choice of analysis technology is done via selectin of a namespace - // in Analysis.hh auto analysisManager = G4AnalysisManager::Instance(); - G4cout << "Using " << analysisManager->GetType() << G4endl; + analysisManager->SetDefaultFileType("root"); analysisManager->SetVerboseLevel(1); analysisManager->SetNtupleMerging(true); + G4cout << "Using " << analysisManager->GetType() << G4endl; // Note: merging ntuples is available only with Root output // Set default fileName @@ -69,7 +68,6 @@ RunAction::RunAction(const G4String& fileName) RunAction::~RunAction() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/physicslists/extensibleFactory/shared/src/ScreenSD.cc b/examples/extended/physicslists/extensibleFactory/shared/src/ScreenSD.cc index 492d80ae7c..18df18d7be 100644 --- a/examples/extended/physicslists/extensibleFactory/shared/src/ScreenSD.cc +++ b/examples/extended/physicslists/extensibleFactory/shared/src/ScreenSD.cc @@ -29,12 +29,12 @@ // #include "ScreenSD.hh" -#include "Analysis.hh" #include "G4VTouchable.hh" #include "G4Step.hh" #include "G4ios.hh" #include "G4SystemOfUnits.hh" +#include "G4AnalysisManager.hh" #include "G4VProcess.hh" diff --git a/examples/extended/physicslists/factory/.README.txt b/examples/extended/physicslists/factory/.README.txt deleted file mode 100644 index 8c06fe0bef..0000000000 --- a/examples/extended/physicslists/factory/.README.txt +++ /dev/null @@ -1,69 +0,0 @@ - -///\file "physicslists/factory/.README.txt" -///\brief Example factory README page - -/*! \page Examplefactory Example factory - -\author I. Hrivnacova \n -Institut de Physique NucleÌaire (IPNO), UniversiteÌ Paris-Sud, CNRS-IN2P3 \n -(Based on Hadr00 by V. Ivantchenko, CERN) - -Examples in the physicslist category show the possible ways how to define -a physics list from Geant4 physics constructors. This example demonstrates -the usage of G4PhysListFactory to build the concrete physics list. - -Physics List can be defined by its name given by the -p argument of the of the -run command or by the PHYSLIST environment variable. - -\verbatim -./factory -m my.macro [ -p QGSP_BERT ] -\endverbatim - -By default, FTFP_BERT Physics List will be instantiated if --p argument is not set and the PHYSLIST environment variable is not defined. - -The same experimental setup is used for all examples in the physicslist category: - -\section factory_s1 Detector description - -The geometry (defined in the DetectorConstruction class) consists in a box of scintillator material (CsI) followed by a thin box of air (screen) which is used to simplify scoring. - -\section factory_s2 Primary generator - -The primary generator is defined with usage of G4ParticleGun. -The default particle is proton which hits the box perpendicular to the input face. -The type of the particle and its energy are set in the PrimaryGeneratorAction class, and can -be changed via the G4 built-in commands of the G4ParticleGun class. - - -\section factory_s3 Scoring (ntuples) - -The screen volume is associated with a sensitive detector, ScreenSD, -which accounts the following particle properties: -- trackID -- particle PDG encoding -- particle kinetic energy -- particle X,Y position -- particle time - -The scored quantities are filled in the Screen ntuple, which is defined using G4AnalysisManager -in RunAction class. The ntuple is saved in a Root file, which name is set to be equal to the -example name in main () function. - -\section factory_s4 How to build - -An additional step is needed when building the example with GNUmake -due to using the extra shared directory: -\verbatim - % cd path_to_example/example - % gmake setup - % gmake -\endverbatim - -This will copy the files from shared in the example include and src; -to remove these files: -\verbatim - % gmake clean_setup -\endverbatim - -*/ diff --git a/examples/extended/physicslists/factory/CMakeLists.txt b/examples/extended/physicslists/factory/CMakeLists.txt index a54854850d..c72141bf25 100644 --- a/examples/extended/physicslists/factory/CMakeLists.txt +++ b/examples/extended/physicslists/factory/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(factory) #---------------------------------------------------------------------------- diff --git a/examples/extended/physicslists/factory/History b/examples/extended/physicslists/factory/History index 66b92229dd..457bc20462 100644 --- a/examples/extended/physicslists/factory/History +++ b/examples/extended/physicslists/factory/History @@ -14,6 +14,16 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06/10/21 I. Hrivnacova (factory-V10-07-01) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root), + removed Analysis.hh. + +19/07/21 I. Hrivnacova (factory-V10-07-00) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 10/11/20 I. Hrivnacova (factory-V10-06-00) - Migration to G4RunManagerFactory - Removed trailing whitespaces diff --git a/examples/extended/physicslists/factory/README b/examples/extended/physicslists/factory/README deleted file mode 100644 index ef56796eec..0000000000 --- a/examples/extended/physicslists/factory/README +++ /dev/null @@ -1,69 +0,0 @@ - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - - Example factory - - I. Hrivnacova, -Institut de Physique NucleÌaire (IPNO), UniversiteÌ Paris-Sud, CNRS-IN2P3 - Based on Hadr00 by V. Ivantchenko, CERN - - -Examples in the physicslist category show the possible ways how to define -a physics list from Geant4 physics constructors. This example demonstrates -the usage of G4PhysListFactory to build the concrete physics list. - -Physics List can be defined by its name given by the -p argument of the of the -run command or by the PHYSLIST environment variable. - -./factory -m my.macro [ -p QGSP_BERT ] - -By default, FTFP_BERT Physics List will be instantiated if --p argument is not set and the PHYSLIST environment variable is not defined. - -The same experimental setup is used for all examples in the physicslist category: - -1- Detector description ------------------------ - -The geometry (defined in the DetectorConstruction class) consists in a box of scintillator material (CsI) followed by a thin box of air (screen) which is used to simplify scoring. - - -2- Primary generator --------------------- - -The primary generator is defined with usage of G4ParticleGun. -The default particle is proton which hits the box perpendicular to the input face. -The type of the particle and its energy are set in the PrimaryGeneratorAction class, and can -be changed via the G4 built-in commands of the G4ParticleGun class. - - -3- Scoring (ntuples) --------------------- - -The screen volume is associated with a sensitive detector, ScreenSD, -which accounts the following particle properties: -- trackID -- particle PDG encoding -- particle kinetic energy -- particle X,Y position -- particle time - -The scored quantities are filled in the Screen ntuple, which is defined using G4AnalysisManager -in RunAction class. The ntuple is saved in a Root file, which name is set to be equal to the -example name in main () function. - -4- How to build ----------------- - -An additional step is needed when building the example with GNUmake -due to using the extra shared directory: - % cd path_to_example/example - % gmake setup - % gmake - -This will copy the files from shared in the example include and src; -to remove these files: - % gmake clean_setup - diff --git a/examples/extended/physicslists/factory/factory-environment.out b/examples/extended/physicslists/factory/factory-environment.out index 28af44ab09..fcb31ce254 100644 --- a/examples/extended/physicslists/factory/factory-environment.out +++ b/examples/extended/physicslists/factory/factory-environment.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -24,16 +24,7 @@ G4PhysListFactory::GetReferencePhysList EMoption= 1 G4VModularPhysicsList::ReplacePhysics: G4EmStandard with type : 2 is replaced with G4EmStandard_opt1 -Using Root - --------- WWWW ------- G4Exception-START -------- WWWW ------- -*** G4Exception : Analysis_W013 - issued by : G4RootNtupleFileManager::SetNtupleMergingMode -Merging ntuples is not applicable in sequential application. -Setting was ignored. -*** This is just a warning message. *** --------- WWWW -------- G4Exception-END --------- WWWW ------- - +Using Visualization Manager instantiating with verbosity "warnings (3)"... Visualization Manager initialising... Registering graphics systems... @@ -42,10 +33,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -129,8 +118,8 @@ Some /vis commands (optionally) take a string to specify colour. -Checking overlaps for volume Box (G4Box) ... OK! -Checking overlaps for volume Screen (G4Box) ... OK! +Checking overlaps for volume Box:0 (G4Box) ... OK! +Checking overlaps for volume Screen:0 (G4Box) ... OK! hInelastic FTFP_BERT : threshold between BERT and FTFP is over the interval for pions : 3 to 6 GeV @@ -139,26 +128,93 @@ Checking overlaps for volume Screen (G4Box) ... OK! for neutron : 3 to 6 GeV ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 1 +Use general process 1 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.8, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 0 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.2 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma applyCuts:1 SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma applyCuts:1 SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma applyCuts:1 SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -168,25 +224,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.8, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 applyCuts:1 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -196,29 +252,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.8, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 applyCuts:1 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 applyCuts:1 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -226,31 +282,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 applyCuts:1 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -259,12 +315,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -272,12 +328,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -285,31 +341,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 applyCuts:1 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -317,31 +373,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 applyCuts:1 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -349,31 +405,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -381,32 +437,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 applyCuts:1 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -414,32 +470,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -447,31 +503,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 applyCuts:1 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -479,27 +535,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -508,17 +564,17 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -526,67 +582,67 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -594,13 +650,13 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -608,13 +664,13 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -622,12 +678,12 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -635,13 +691,13 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -649,13 +705,13 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -663,13 +719,13 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -677,60 +733,60 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -738,27 +794,27 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -766,25 +822,25 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -792,25 +848,25 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -818,13 +874,13 @@ CoulombScat: for pi- XStype:3 applyCuts:1 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -847,15 +903,25 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. + +-------- WWWW ------- G4Exception-START -------- WWWW ------- +*** G4Exception : Analysis_W001 + issued by : G4RootNtupleFileManager::SetNtupleMergingMode +Merging ntuples is not applicable in sequential application. +Setting was ignored. +*** This is just a warning message. *** +-------- WWWW -------- G4Exception-END --------- WWWW ------- + +... set ntuple merging row mode : row-wise - done ... create file : factory.root - done ... open analysis file : factory.root - done +... open analysis file : factory.root - done --> Event 0 starts. --> Event 100 starts. --> Event 200 starts. diff --git a/examples/extended/physicslists/factory/factory.out b/examples/extended/physicslists/factory/factory.out index f810d9675e..93c6efe7ba 100644 --- a/examples/extended/physicslists/factory/factory.out +++ b/examples/extended/physicslists/factory/factory.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -23,16 +23,7 @@ G4PhysListFactory::GetReferencePhysList EMoption= 0 <<< Geant4 Physics List simulation engine: QGSP_BERT -Using Root - --------- WWWW ------- G4Exception-START -------- WWWW ------- -*** G4Exception : Analysis_W013 - issued by : G4RootNtupleFileManager::SetNtupleMergingMode -Merging ntuples is not applicable in sequential application. -Setting was ignored. -*** This is just a warning message. *** --------- WWWW -------- G4Exception-END --------- WWWW ------- - +Using Visualization Manager instantiating with verbosity "warnings (3)"... Visualization Manager initialising... Registering graphics systems... @@ -41,10 +32,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -128,40 +117,107 @@ Some /vis commands (optionally) take a string to specify colour. -Checking overlaps for volume Box (G4Box) ... OK! -Checking overlaps for volume Screen (G4Box) ... OK! +Checking overlaps for volume Box:0 (G4Box) ... OK! +Checking overlaps for volume Screen:0 (G4Box) ... OK! hInelastic QGSP_BERT Thresholds: 1) between BERT and FTF/P over the interval 3 to 6 GeV. 2) between FTF/P and QGS/P over the interval 12 to 25 GeV. -- quasiElastic: 1 for QGS and 0 for FTF ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -171,25 +227,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -199,29 +255,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -229,31 +285,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -262,12 +318,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -275,12 +331,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -288,31 +344,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -320,31 +376,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -352,31 +408,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -384,32 +440,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -417,32 +473,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -450,31 +506,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -482,27 +538,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -511,18 +567,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -530,69 +586,69 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -600,13 +656,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -614,13 +670,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -628,13 +684,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -642,13 +698,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -656,13 +712,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -670,13 +726,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -684,62 +740,62 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -747,28 +803,28 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -776,27 +832,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -804,27 +860,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -832,13 +888,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -861,15 +917,25 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. + +-------- WWWW ------- G4Exception-START -------- WWWW ------- +*** G4Exception : Analysis_W001 + issued by : G4RootNtupleFileManager::SetNtupleMergingMode +Merging ntuples is not applicable in sequential application. +Setting was ignored. +*** This is just a warning message. *** +-------- WWWW -------- G4Exception-END --------- WWWW ------- + +... set ntuple merging row mode : row-wise - done ... create file : factory.root - done ... open analysis file : factory.root - done +... open analysis file : factory.root - done --> Event 0 starts. --> Event 100 starts. --> Event 200 starts. diff --git a/examples/extended/physicslists/factory/shared/include/Analysis.hh b/examples/extended/physicslists/factory/shared/include/Analysis.hh deleted file mode 100644 index ee975175d6..0000000000 --- a/examples/extended/physicslists/factory/shared/include/Analysis.hh +++ /dev/null @@ -1,37 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file Analysis.hh -/// \brief Selection of the analysis technology - -#ifndef Analysis_h -#define Analysis_h 1 - -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" - -#endif diff --git a/examples/extended/physicslists/factory/shared/include/RunAction.hh b/examples/extended/physicslists/factory/shared/include/RunAction.hh index 4af3e1fa77..d3e26b81f6 100644 --- a/examples/extended/physicslists/factory/shared/include/RunAction.hh +++ b/examples/extended/physicslists/factory/shared/include/RunAction.hh @@ -46,8 +46,7 @@ class G4Run; /// - Track length in absorber /// - Track length in gap /// The same values are also saved in the ntuple. -/// The histograms and ntuple are saved in the output file in a format -/// accoring to a selected technology in Analysis.hh. +/// The histograms and ntuple are saved in the Root output file by default. /// /// In EndOfRunAction(), the accumulated statistic and computed /// dispersion is printed. diff --git a/examples/extended/physicslists/factory/shared/src/RunAction.cc b/examples/extended/physicslists/factory/shared/src/RunAction.cc index 83b27dcf0b..a8018b39c5 100644 --- a/examples/extended/physicslists/factory/shared/src/RunAction.cc +++ b/examples/extended/physicslists/factory/shared/src/RunAction.cc @@ -28,12 +28,12 @@ /// \brief Implementation of the RunAction class #include "RunAction.hh" -#include "Analysis.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +#include "G4AnalysisManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -42,12 +42,11 @@ RunAction::RunAction(const G4String& fileName) fFileName(fileName) { // Create analysis manager - // The choice of analysis technology is done via selectin of a namespace - // in Analysis.hh auto analysisManager = G4AnalysisManager::Instance(); - G4cout << "Using " << analysisManager->GetType() << G4endl; + analysisManager->SetDefaultFileType("root"); analysisManager->SetVerboseLevel(1); analysisManager->SetNtupleMerging(true); + G4cout << "Using " << analysisManager->GetType() << G4endl; // Note: merging ntuples is available only with Root output // Set default fileName @@ -69,7 +68,6 @@ RunAction::RunAction(const G4String& fileName) RunAction::~RunAction() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/physicslists/factory/shared/src/ScreenSD.cc b/examples/extended/physicslists/factory/shared/src/ScreenSD.cc index 492d80ae7c..18df18d7be 100644 --- a/examples/extended/physicslists/factory/shared/src/ScreenSD.cc +++ b/examples/extended/physicslists/factory/shared/src/ScreenSD.cc @@ -29,12 +29,12 @@ // #include "ScreenSD.hh" -#include "Analysis.hh" #include "G4VTouchable.hh" #include "G4Step.hh" #include "G4ios.hh" #include "G4SystemOfUnits.hh" +#include "G4AnalysisManager.hh" #include "G4VProcess.hh" diff --git a/examples/extended/physicslists/genericPL/.README.txt b/examples/extended/physicslists/genericPL/.README.txt deleted file mode 100644 index 681df6bac2..0000000000 --- a/examples/extended/physicslists/genericPL/.README.txt +++ /dev/null @@ -1,86 +0,0 @@ - -///\file "physicslists/genericPL/.README.txt" -///\brief Example genericPL README page - -/*! \page ExamplegenericPL Example genericPL - -\author W. Pokorski(1), I. Hrivnacova(2) \n -(1) CERN \n -(2) Institut de Physique NucleÌaire (IPNO), UniversiteÌ Paris-Sud, CNRS-IN2P3 \n - -Examples in the physicslist category show the possible ways how to define -a physics list from Geant4 physics constructors. This example demonstrates -the usage of G4GenericPhysicsList to build the concrete physics list at -the run time. - -In Geant4 versions < 10.4, the generic physics list was demonstrated in the -extended/hadronic/Hadr05 example. - -The G4GenericPhysicsList class allows to build the physics list at the run -time in two possible ways, either by processing a macro file -containing the 'physics list' or by passing a vector of 'physics -constructors' names to the constructor of the class. - -To run the example you can call - -\verbatim -./genericPL -m run.mac [ -p FTFP_BERT.mac ] -\endverbatim - -where FTFP_BERT.mac is the macro file containing the 'physics list'. - -If you run this example by calling - -\verbatim -./genericPL -m run.mac -\endverbatim - -the physics list will be constructed by using a vector of the names of -the different physics constructor defined in the genericPL.cc file. - -The same experimental setup is used for all examples in the physicslist category: - -\section genericPL_s1 Detector description - -The geometry (defined in the DetectorConstruction class) consists in a box of scintillator material (CsI) followed by a thin box of air (screen) which is used to simplify scoring. - -\section genericPL_s2 Primary generator - -The primary generator is defined with usage of G4ParticleGun. -The default particle is proton which hits the box perpendicular to the input face. -The type of the particle and its energy are set in the PrimaryGeneratorAction class, and can -be changed via the G4 built-in commands of the G4ParticleGun class. - - -\section genericPL_s3 Scoring (ntuples) - -The screen volume is associated with a sensitive detector, ScreenSD, -which accounts the following particle properties: -- trackID -- particle PDG encoding -- particle kinetic energy -- particle X,Y position -- particle time - -The scored quantities are filled in the Screen ntuple, which is defined using G4AnalysisManager -in RunAction class. The ntuple is saved in a Root file, which name is set to be equal to the -example name in main () function. - -\section genericPL_s4 How to build - -An additional step is needed when building the example with GNUmake -due to using the extra shared directory: -\verbatim - % cd path_to_example/example - % gmake setup - % gmake -\endverbatim - -This will copy the files from shared in the example include and src; -to remove these files: -\verbatim - % gmake clean_setup -\endverbatim - - -*/ diff --git a/examples/extended/physicslists/genericPL/CMakeLists.txt b/examples/extended/physicslists/genericPL/CMakeLists.txt index cbf1e6343d..3cce5cc933 100644 --- a/examples/extended/physicslists/genericPL/CMakeLists.txt +++ b/examples/extended/physicslists/genericPL/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(genericPL) #---------------------------------------------------------------------------- diff --git a/examples/extended/physicslists/genericPL/History b/examples/extended/physicslists/genericPL/History index b668fc1acd..8c09c73fdd 100644 --- a/examples/extended/physicslists/genericPL/History +++ b/examples/extended/physicslists/genericPL/History @@ -14,6 +14,16 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06/10/21 I. Hrivnacova (genericPL-V10-07-01) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root), + removed Analysis.hh. + +19/07/21 I. Hrivnacova (genericPL-V10-07-00) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 10/11/20 I. Hrivnacova (genericPL-V10-06-00) - Migration to G4RunManagerFactory - Removed trailing whitespaces diff --git a/examples/extended/physicslists/genericPL/README b/examples/extended/physicslists/genericPL/README deleted file mode 100644 index 237adf5ef9..0000000000 --- a/examples/extended/physicslists/genericPL/README +++ /dev/null @@ -1,85 +0,0 @@ - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - - Example genericPL - - W. Pokorski (1) - I. Hrivnacova (2) - - (1) CERN - (2) Institut de Physique NucleÌaire (IPNO), UniversiteÌ Paris-Su - - -Examples in the physicslist category show the possible ways how to define -a physics list from Geant4 physics constructors. This example demonstrates -the usage of G4GenericPhysicsList to build the concrete physics list at -the run time. - -In Geant4 versions < 10.4, the generic physics list was demonstrated in the -extended/hadronic/Hadr05 example. - -The G4GenericPhysicsList class allows to build the physics list at the run -time in two possible ways, either by processing a macro file -containing the 'physics list' or by passing a vector of 'physics -constructors' names to the constructor of the class. - -To run the example you can call - -./genericPL -m run.mac [ -p FTFP_BERT.mac ] - -where FTFP_BERT.mac is the macro file containing the 'physics list'. - -If you run this example by calling - -./genericPL -m run.mac - -the physics list will be constructed by using a vector of the names of -the different physics constructor defined in the genericPL.cc file. - -The same experimental setup is used for all examples in the physicslist category: - -1- Detector description ------------------------ - -The geometry (defined in the DetectorConstruction class) consists in a box of scintillator material (CsI) followed by a thin box of air (screen) which is used to simplify scoring. - - -2- Primary generator --------------------- - -The primary generator is defined with usage of G4ParticleGun. -The default particle is proton which hits the box perpendicular to the input face. -The type of the particle and its energy are set in the PrimaryGeneratorAction class, and can -be changed via the G4 built-in commands of the G4ParticleGun class. - - -3- Scoring (ntuples) --------------------- - -The screen volume is associated with a sensitive detector, ScreenSD, -which accounts the following particle properties: -- trackID -- particle PDG encoding -- particle kinetic energy -- particle X,Y position -- particle time - -The scored quantities are filled in the Screen ntuple, which is defined using G4AnalysisManager -in RunAction class. The ntuple is saved in a Root file, which name is set to be equal to the -example name in main () function. - -4- How to build ----------------- - -An additional step is needed when building the example with GNUmake -due to using the extra shared directory: - % cd path_to_example/example - % gmake setup - % gmake - -This will copy the files from shared in the example include and src; -to remove these files: - % gmake clean_setup - diff --git a/examples/extended/physicslists/genericPL/genericPL.out b/examples/extended/physicslists/genericPL/genericPL.out index dd03a4ea21..8c104edd4c 100644 --- a/examples/extended/physicslists/genericPL/genericPL.out +++ b/examples/extended/physicslists/genericPL/genericPL.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -21,16 +21,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo <<< Geant4 Physics List simulation engine: G4GenericPhysicsList -Using Root - --------- WWWW ------- G4Exception-START -------- WWWW ------- -*** G4Exception : Analysis_W013 - issued by : G4RootNtupleFileManager::SetNtupleMergingMode -Merging ntuples is not applicable in sequential application. -Setting was ignored. -*** This is just a warning message. *** --------- WWWW -------- G4Exception-END --------- WWWW ------- - +Using Visualization Manager instantiating with verbosity "warnings (3)"... Visualization Manager initialising... Registering graphics systems... @@ -39,10 +30,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -126,8 +115,8 @@ Some /vis commands (optionally) take a string to specify colour. -Checking overlaps for volume Box (G4Box) ... OK! -Checking overlaps for volume Screen (G4Box) ... OK! +Checking overlaps for volume Box:0 (G4Box) ... OK! +Checking overlaps for volume Screen:0 (G4Box) ... OK! hInelastic FTFP_BERT : threshold between BERT and FTFP is over the interval for pions : 3 to 6 GeV @@ -135,32 +124,99 @@ Checking overlaps for volume Screen (G4Box) ... OK! for proton : 3 to 6 GeV for neutron : 3 to 6 GeV +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -170,25 +226,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -198,29 +254,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -228,31 +284,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -261,12 +317,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -274,12 +330,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -287,31 +343,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -319,31 +375,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -351,31 +407,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -383,32 +439,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -416,32 +472,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -449,31 +505,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -481,27 +537,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -510,17 +566,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -528,67 +584,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -596,13 +652,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -610,13 +666,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -624,12 +680,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -637,13 +693,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -651,13 +707,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -665,13 +721,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -679,60 +735,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -740,27 +796,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -768,25 +824,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -794,25 +850,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -820,13 +876,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -849,15 +905,25 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model. See commands in /vis/modeling/trajectories/ for other options. ### Run 0 starts. + +-------- WWWW ------- G4Exception-START -------- WWWW ------- +*** G4Exception : Analysis_W001 + issued by : G4RootNtupleFileManager::SetNtupleMergingMode +Merging ntuples is not applicable in sequential application. +Setting was ignored. +*** This is just a warning message. *** +-------- WWWW -------- G4Exception-END --------- WWWW ------- + +... set ntuple merging row mode : row-wise - done ... create file : genericPL.root - done ... open analysis file : genericPL.root - done +... open analysis file : genericPL.root - done --> Event 0 starts. --> Event 100 starts. --> Event 200 starts. diff --git a/examples/extended/physicslists/genericPL/shared/include/Analysis.hh b/examples/extended/physicslists/genericPL/shared/include/Analysis.hh deleted file mode 100644 index ee975175d6..0000000000 --- a/examples/extended/physicslists/genericPL/shared/include/Analysis.hh +++ /dev/null @@ -1,37 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file Analysis.hh -/// \brief Selection of the analysis technology - -#ifndef Analysis_h -#define Analysis_h 1 - -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" - -#endif diff --git a/examples/extended/physicslists/genericPL/shared/include/RunAction.hh b/examples/extended/physicslists/genericPL/shared/include/RunAction.hh index 4af3e1fa77..d3e26b81f6 100644 --- a/examples/extended/physicslists/genericPL/shared/include/RunAction.hh +++ b/examples/extended/physicslists/genericPL/shared/include/RunAction.hh @@ -46,8 +46,7 @@ class G4Run; /// - Track length in absorber /// - Track length in gap /// The same values are also saved in the ntuple. -/// The histograms and ntuple are saved in the output file in a format -/// accoring to a selected technology in Analysis.hh. +/// The histograms and ntuple are saved in the Root output file by default. /// /// In EndOfRunAction(), the accumulated statistic and computed /// dispersion is printed. diff --git a/examples/extended/physicslists/genericPL/shared/src/RunAction.cc b/examples/extended/physicslists/genericPL/shared/src/RunAction.cc index 83b27dcf0b..a8018b39c5 100644 --- a/examples/extended/physicslists/genericPL/shared/src/RunAction.cc +++ b/examples/extended/physicslists/genericPL/shared/src/RunAction.cc @@ -28,12 +28,12 @@ /// \brief Implementation of the RunAction class #include "RunAction.hh" -#include "Analysis.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +#include "G4AnalysisManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -42,12 +42,11 @@ RunAction::RunAction(const G4String& fileName) fFileName(fileName) { // Create analysis manager - // The choice of analysis technology is done via selectin of a namespace - // in Analysis.hh auto analysisManager = G4AnalysisManager::Instance(); - G4cout << "Using " << analysisManager->GetType() << G4endl; + analysisManager->SetDefaultFileType("root"); analysisManager->SetVerboseLevel(1); analysisManager->SetNtupleMerging(true); + G4cout << "Using " << analysisManager->GetType() << G4endl; // Note: merging ntuples is available only with Root output // Set default fileName @@ -69,7 +68,6 @@ RunAction::RunAction(const G4String& fileName) RunAction::~RunAction() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/physicslists/genericPL/shared/src/ScreenSD.cc b/examples/extended/physicslists/genericPL/shared/src/ScreenSD.cc index 492d80ae7c..18df18d7be 100644 --- a/examples/extended/physicslists/genericPL/shared/src/ScreenSD.cc +++ b/examples/extended/physicslists/genericPL/shared/src/ScreenSD.cc @@ -29,12 +29,12 @@ // #include "ScreenSD.hh" -#include "Analysis.hh" #include "G4VTouchable.hh" #include "G4Step.hh" #include "G4ios.hh" #include "G4SystemOfUnits.hh" +#include "G4AnalysisManager.hh" #include "G4VProcess.hh" diff --git a/examples/extended/physicslists/shared/History b/examples/extended/physicslists/shared/History index 17ac4cb005..e5e7cfa74d 100644 --- a/examples/extended/physicslists/shared/History +++ b/examples/extended/physicslists/shared/History @@ -14,6 +14,16 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06/10/21 I. Hrivnacova (physicslistsShared-V10-07-01) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root), + removed Analysis.hh. + +19/07/21 I. Hrivnacova (physicslistsShared-V10-07-00) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 10/11/20 I. Hrivnacova (physicslistsShared-V10-06-00) - Removed trailing whitespaces diff --git a/examples/extended/physicslists/shared/include/Analysis.hh b/examples/extended/physicslists/shared/include/Analysis.hh deleted file mode 100644 index ee975175d6..0000000000 --- a/examples/extended/physicslists/shared/include/Analysis.hh +++ /dev/null @@ -1,37 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -/// \file Analysis.hh -/// \brief Selection of the analysis technology - -#ifndef Analysis_h -#define Analysis_h 1 - -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" - -#endif diff --git a/examples/extended/physicslists/shared/include/RunAction.hh b/examples/extended/physicslists/shared/include/RunAction.hh index 4af3e1fa77..d3e26b81f6 100644 --- a/examples/extended/physicslists/shared/include/RunAction.hh +++ b/examples/extended/physicslists/shared/include/RunAction.hh @@ -46,8 +46,7 @@ class G4Run; /// - Track length in absorber /// - Track length in gap /// The same values are also saved in the ntuple. -/// The histograms and ntuple are saved in the output file in a format -/// accoring to a selected technology in Analysis.hh. +/// The histograms and ntuple are saved in the Root output file by default. /// /// In EndOfRunAction(), the accumulated statistic and computed /// dispersion is printed. diff --git a/examples/extended/physicslists/shared/src/RunAction.cc b/examples/extended/physicslists/shared/src/RunAction.cc index 69f145f35c..2ac896080c 100644 --- a/examples/extended/physicslists/shared/src/RunAction.cc +++ b/examples/extended/physicslists/shared/src/RunAction.cc @@ -28,12 +28,12 @@ /// \brief Implementation of the RunAction class #include "RunAction.hh" -#include "Analysis.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" +#include "G4AnalysisManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -42,12 +42,11 @@ RunAction::RunAction(const G4String& fileName) fFileName(fileName) { // Create analysis manager - // The choice of analysis technology is done via selectin of a namespace - // in Analysis.hh auto analysisManager = G4AnalysisManager::Instance(); - G4cout << "Using " << analysisManager->GetType() << G4endl; + analysisManager->SetDefaultFileType("root"); analysisManager->SetVerboseLevel(1); analysisManager->SetNtupleMerging(true); + G4cout << "Using " << analysisManager->GetType() << G4endl; // Note: merging ntuples is available only with Root output // Set default fileName @@ -69,7 +68,6 @@ RunAction::RunAction(const G4String& fileName) RunAction::~RunAction() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/physicslists/shared/src/ScreenSD.cc b/examples/extended/physicslists/shared/src/ScreenSD.cc index 492d80ae7c..18df18d7be 100644 --- a/examples/extended/physicslists/shared/src/ScreenSD.cc +++ b/examples/extended/physicslists/shared/src/ScreenSD.cc @@ -29,12 +29,12 @@ // #include "ScreenSD.hh" -#include "Analysis.hh" #include "G4VTouchable.hh" #include "G4Step.hh" #include "G4ios.hh" #include "G4SystemOfUnits.hh" +#include "G4AnalysisManager.hh" #include "G4VProcess.hh" diff --git a/examples/extended/polarisation/.README.txt b/examples/extended/polarisation/.README.txt deleted file mode 100644 index 6d3624aa53..0000000000 --- a/examples/extended/polarisation/.README.txt +++ /dev/null @@ -1,16 +0,0 @@ - -///\file "polarisation/.README.txt" -///\brief Examples polarisation README page - -/*! \page Examples_polarisation Category "polarisation" - - Examples in this directory demonstrate use of physics processes including - polarization: - -\link ExamplePol01 Pol01 \endlink - -This example demonstrates how to compute and plot the QED processes including -polarization. - -*/ - diff --git a/examples/extended/polarisation/CMakeLists.txt b/examples/extended/polarisation/CMakeLists.txt index d0607f3899..bdd2c62f86 100644 --- a/examples/extended/polarisation/CMakeLists.txt +++ b/examples/extended/polarisation/CMakeLists.txt @@ -1,5 +1,5 @@ #---Adding all polarisation examples subdirectories explicitly -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(Pol01) diff --git a/examples/extended/polarisation/History b/examples/extended/polarisation/History index b08fbbc48f..9bddff2dcd 100644 --- a/examples/extended/polarisation/History +++ b/examples/extended/polarisation/History @@ -15,6 +15,9 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +November 29th, 2021 I. Hrivnacova (exPolarisation-V10-07-01) +- Removed obsolete references to AIDA analysis tools + May 24th, 2021, B. Morgan (exPolarisation-V10-07-00) - Bump required CMake version range to 3.12...3.20, matching core Geant4 diff --git a/examples/extended/polarisation/Pol01/.README.txt b/examples/extended/polarisation/Pol01/.README.txt deleted file mode 100644 index 9a6c81bf0b..0000000000 --- a/examples/extended/polarisation/Pol01/.README.txt +++ /dev/null @@ -1,145 +0,0 @@ - -///\file "polarisation/Pol01/.README.txt" -///\brief Example Pol01 README page - -/*! \page ExamplePol01 Example Pol01 - - How to compute and plot the QED processes including - polarization. - Two possible scenarios are available: - - Polarization transfer of an incoming beam to final state particles - - Material dependent transmission of a polarized beams. - The method is explained below : see item Physics. - -\section Pol01_s1 GEOMETRY DEFINITION - - The geometry consists of a single block of a homogeneous material, - placed in a world. - - Three parameters define the geometry : - - the material of the box, - - the thickness of the box (sizeZ), - - the transverse dimension of the box (sizeXY). - - The default geometry (5mm of Iron, G4_Fe) is constructed in - DetectorConstruction, but the above parameters can be changed - interactively via the commands defined in DetectorMessenger. - Its polarization can be accessed via the G4PolarizationMessenger - (see example macro file), and is given in the global coordinate - system. - -\section Pol01_s2 PHYSICS LIST - - The Physics List contains QED particle definitions (electrons, - positrons and photons) and a general transportation process. - In addition the user can add one of the two process modules: - - 1. "standard" - standard (unpolarized) EM physics - - 2. "polarized" - polarized EM physics - - These physics list contain the standard electromagnetic processes. - -\section Pol01_s3 AN EVENT : THE PRIMARY GENERATOR - - The primary kinematic consists of a single particle starting - at the edge of the box. The type of the particle and its - energy are set in PrimaryGeneratorAction (10 MeV electron). - By default the G4ParticleGun polarization is zero. - All parameter can be changed via the G4 build-in commands of - ParticleGun class (see the macros provided with this example). - -\section Pol01_s4 PHYSICS - - This example uses the following physics processes: - - electromagnetic: - - photo-electric effect - - Compton scattering - - pair production - - bremsstrahlung - - ionization - - multiple scattering - - annihilation - - or - - polarized electromagnetic: - (incl. simulation of polarization transfer, and - asymmetries for longitudinally polarized leptons, and - circularly polarized photons) - - polarized photo-electric effect - - polarized Compton scattering - - polarized pair production - - polarized bremsstrahlung - - polarized ionization - - multiple scattering - - polarized annihilation - - and - - transportation - - and defines the following particles: - - electron, positron, photon - - -\section Pol01_s5 HISTOGRAMS - - The test contains 12 built-in 1D histograms, which are managed by the - HistoManager class and its messenger, HistoMessenger. The histos can be individually - activated with the command : -\verbatim -/testem/histo/setHisto id nbBins valMin valMax unit -\endverbatim - where unit is the desired unit for the histo (MeV or keV, etc..) - (see the macro histos.mac). - - - 1 gamma energy - - 2 gamma cos(theta) - - 3 gamma phi - - 4 gamma polarization - - 5 electron energy - - 6 electron cos(theta) - - 7 electron phi - - 8 electron polarization - - 9 positron energy - - 10 positron cos(theta) - - 11 positron phi - - 12 positron polarization - - If AIDA is available, i.e. if G4ANALYSIS_USE is set, these - histograms are stored in a compressed XML file - (Pol01.aida). These results can be displayed using a small - program (plotResults.java) based on JAIDA by simply calling - -\verbatim -% gmake plots -\endverbatim - -\section Pol01_s6 VISUALIZATION - - Simulated events can be displayed on top of a representation of - the geometry, see vis.mac for an example. - -\section Pol01_s7- HOW TO START ? - - - Execute Pol01 in 'batch' mode from the default macro file : -\verbatim -% Pol01 pol01.in -\endverbatim - - - Execute Pol01 in 'batch' mode including aida output : -\verbatim -% Pol01 histos.mac -\endverbatim - - - If available use JAIDA to display the results via -\verbatim -% gmake plots -\endverbatim - - - A visualisation example is available by calling -\verbatim -% Pol01 -[...] -PreInit> /control/execute vis.mac -\endverbatim - -*/ diff --git a/examples/extended/polarisation/Pol01/CMakeLists.txt b/examples/extended/polarisation/Pol01/CMakeLists.txt index c461885397..e5ac80065c 100644 --- a/examples/extended/polarisation/Pol01/CMakeLists.txt +++ b/examples/extended/polarisation/Pol01/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(Pol01) #---------------------------------------------------------------------------- diff --git a/examples/extended/polarisation/Pol01/History b/examples/extended/polarisation/Pol01/History index a3219d2591..17c0692f6d 100644 --- a/examples/extended/polarisation/Pol01/History +++ b/examples/extended/polarisation/Pol01/History @@ -15,6 +15,15 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06-10-21 I. Hrivnacova (expol01-V10-07-03) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root). + +19-07-21 I. Hrivnacova (expol01-V10-07-02) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 16-02-21 D. Sawkey (expol01-V10-07-01) - used renamed polarized processes diff --git a/examples/extended/polarisation/Pol01/README b/examples/extended/polarisation/Pol01/README deleted file mode 100644 index 235330befc..0000000000 --- a/examples/extended/polarisation/Pol01/README +++ /dev/null @@ -1,128 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - TestPolarization - ---------------- - - How to compute and plot the QED processes including - polarization. - Two possible scenarios are available: - - Polarization transfer of an incoming beam to final state particles - - Material dependent transmission of a polarized beams. - The method is explained below : see item Physics. - - 1- GEOMETRY DEFINITION - - The geometry consists of a single block of a homogeneous material, - placed in a world. - - Three parameters define the geometry : - - the material of the box, - - the thickness of the box (sizeZ), - - the transverse dimension of the box (sizeXY). - - The default geometry (5mm of Iron, G4_Fe) is constructed in - DetectorConstruction, but the above parameters can be changed - interactively via the commands defined in DetectorMessenger. - Its polarization can be accessed via the PolarizationMessenger - (see example macro file), and is given in the global coordinate - system. - - 2- PHYSICS LIST - - The Physics List contains QED particle definitions (electrons, - positrons and photons) and a general transportation process. - In addition the user can add one of the two process modules: - 1. "standard" - standard (unpolarized) EM physics - 2. "polarized" - polarized EM physics - These physics list contain the standard electromagnetic processes. - - 3- AN EVENT : THE PRIMARY GENERATOR - - The primary kinematic consists of a single particle starting - at the edge of the box. The type of the particle and its - energy are set in PrimaryGeneratorAction (10 MeV electron). - By default the ParticleGun polarization is zero. - All parameter can be changed via the G4 build-in commands of - ParticleGun class (see the macros provided with this example). - - 4- PHYSICS - - This example uses the following physics processes: - - - electromagnetic: - photo-electric effect - Compton scattering - pair production - bremsstrahlung - ionization - multiple scattering - annihilation - or - - polarized electromagnetic: - (incl. simulation of polarization transfer, and - asymmetries for longitudinally polarized leptons, and - circularly polarized photons) - - polarized photo-electric effect - polarized Compton scattering - polarized pair production - polarized bremsstrahlung - polarized ionization - multiple scattering - polarized annihilation - and - - transportation - - and defines the following particles: - electron, positron, photon - - - 5- HISTOGRAMS - - The test contains 12 built-in 1D histograms, which are managed by the - HistoManager class and its Messenger. The histos can be individually - activated with the command : - /analysis/h1/set id nbBins valMin valMax unit - where unit is the desired unit for the histo (MeV or keV, etc..) - (see the macro histos.mac). - - 1 gamma energy - 2 gamma cos(theta) - 3 gamma phi - 4 gamma polarization - 5 electron energy - 6 electron cos(theta) - 7 electron phi - 8 electron polarization - 9 positron energy - 10 positron cos(theta) - 11 positron phi - 12 positron polarization - - 6- VISUALIZATION - - Simulated events can be displayed on top of a representation of - the geometry, see vis.mac for an example. - - 7- HOW TO START ? - - compile and link to generate an executable - % gmake - - execute Pol01 in 'batch' mode from the default macro file : - % Pol01 pol01.in - - or execute Pol01 in 'batch' mode including aida output : - % Pol01 histos.mac - - if available use JAIDA to display the results via - % gmake plots - - a visualisation example is available by calling - % Pol01 - [...] - PreInit> /control/execute vis.mac diff --git a/examples/extended/polarisation/Pol01/include/RunAction.hh b/examples/extended/polarisation/Pol01/include/RunAction.hh index 150a3178d1..48a37a53d9 100644 --- a/examples/extended/polarisation/Pol01/include/RunAction.hh +++ b/examples/extended/polarisation/Pol01/include/RunAction.hh @@ -34,9 +34,9 @@ #define RunAction_h 1 #include "G4UserRunAction.hh" +#include "G4AnalysisManager.hh" #include "ProcessesCount.hh" #include "globals.hh" -#include "g4root.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/polarisation/Pol01/pol01.out b/examples/extended/polarisation/Pol01/pol01.out index 9467ff5016..4fada48cae 100644 --- a/examples/extended/polarisation/Pol01/pol01.out +++ b/examples/extended/polarisation/Pol01/pol01.out @@ -10,7 +10,7 @@ ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -18,8 +18,10 @@ WWW : http://geant4.org/ ************************************************************** +... set ntuple merging row mode : row-wise - done ... create file : pol01.root - done ... open analysis file : pol01.root - done +... open analysis file : pol01.root - done /run/verbose 2 # /testem/det/setMat G4_Fe @@ -53,27 +55,94 @@ theBox : (0,0,0.08) # ##/tracking/verbose 1 /run/beamOn 10000 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= buildBhabha cross section 0 buildBhabha cross section 0 pol-phot: for gamma SubType=12 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== -Polarized-PhotoElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila +Polarized-PhotoElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila pol-compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Polarized-Compton : Emin= 0 meV Emax= 100 TeV + Polarized-Compton : Emin= 0 eV Emax= 100 TeV pol-conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - polConv : Emin= 0 meV Emax= 100 TeV ModifiedTsai + polConv : Emin= 0 eV Emax= 100 TeV ModifiedTsai msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm pol-eIoni: for e- XStype:1 SubType=2 @@ -81,18 +150,18 @@ pol-eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== -PolarizedMollerBhabha : Emin= 0 meV Emax= 100 TeV +PolarizedMollerBhabha : Emin= 0 eV Emax= 100 TeV pol-eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 100000 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - PolBrem : Emin= 0 meV Emax= 100 TeV ModifiedTsai + PolBrem : Emin= 0 eV Emax= 100 TeV ModifiedTsai msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm pol-eIoni: for e+ XStype:1 SubType=2 @@ -100,18 +169,7 @@ pol-eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== -PolarizedMollerBhabha : Emin= 0 meV Emax= 100 TeV - -pol-eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 100000 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - PolBrem : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -pol-annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== -Polarized-Annihilation : Emin= 0 meV Emax= 100 TeV +PolarizedMollerBhabha : Emin= 0 eV Emax= 100 TeV Region -- -- appears in world volume This region is in the mass world. @@ -131,14 +189,14 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : G4_Galactic Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 10 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 10 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_Fe Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 6.28375 keV e- 235.116 keV e+ 228.88 keV proton 10 keV + Energy thresholds : gamma 6.28013 keV e- 235.652 keV e+ 229.148 keV proton 10 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -156,38 +214,39 @@ G4GeometryManager::ReportVoxelStats -- Voxel Statistics Run terminated. Run Summary Number of events processed : 10000 - User=0.050000s Real=0.052353s Sys=0.000000s + User=0.050000s Real=0.056268s Sys=0.000000s The run consists of 10000 gamma of 10 MeV through 1.75 mm of G4_Fe (density: 7.874 g/cm3 ) Process calls frequency ---> - Transportation = 31026 - pol-conv = 197 - msc = 1499 - pol-eBrem = 283 - pol-phot = 145 - pol-eIoni = 618 - pol-compt = 260 - pol-annihil = 55 + Transportation = 31184 + pol-conv = 229 + msc = 1806 + pol-eIoni = 741 + pol-eBrem = 336 + pol-annihil = 75 + pol-compt = 285 + pol-phot = 180 Gamma: -Mean Number per Event :1.0044 -Mean Energy :9.6333 MeV +- 1.7791 MeV -Mean Polarization :-0.9698 +- 0.16794 +Mean Number per Event :1.0071 +Mean Energy :9.5719 MeV +- 1.923 MeV +Mean Polarization :-0.96345 +- 0.18582 Electron: -Mean Number per Event :0.0321 -Mean Energy :5.405 MeV +- 2.5648 MeV -Mean Polarization :-0.72686 +- 0.3046 +Mean Number per Event :0.0365 +Mean Energy :5.3556 MeV +- 2.4606 MeV +Mean Polarization :-0.74507 +- 0.28333 Positron: -Mean Number per Event :0.0148 -Mean Energy :4.2005 MeV +- 2.0177 MeV -Mean Polarization :-0.59627 +- 0.33881 +Mean Number per Event :0.0156 +Mean Energy :3.9054 MeV +- 2.0267 MeV +Mean Polarization :-0.54327 +- 0.34605 ... write file : pol01.root - done ... close file : pol01.root - done +... delete empty file : pol01.root - done ------- MixMaxRng engine status ------- Current state vector is: mixmax state, file version 1.0 -N=17 V[N]={1070029060380044275, 1452744244067288775, 484797723570206551, 810534345944831089, 1785012081452881778, 363774572091969476, 642299707523813964, 1095801661099078560, 2038040517141041611, 969700547076028694, 1867474704091568856, 38203698131185750, 951718104572890248, 1382836620322085169, 1187203719546800534, 603875856701136428, 1986087757022693175} counter= 10sumtot= 283390847025993325 +N=17 V[N]={1883766887621258172, 445260673900121858, 1495747664081991833, 154728272166703337, 783765121210404421, 364296141077971942, 1499610218231124573, 1675248323824583760, 1440307099525015875, 1159860002200486021, 590729407651023665, 1027050997351495804, 950076689074687500, 1513081478329614161, 129981774455909486, 2001839909826765720, 1899088457471448255} counter= 4sumtot= 567695044291054775 --------------------------------------- # G4 kernel has come to Quit state. diff --git a/examples/extended/polarisation/Pol01/src/RunAction.cc b/examples/extended/polarisation/Pol01/src/RunAction.cc index 5dfae2dc0b..c1ec49dc51 100644 --- a/examples/extended/polarisation/Pol01/src/RunAction.cc +++ b/examples/extended/polarisation/Pol01/src/RunAction.cc @@ -120,6 +120,7 @@ void RunAction::BookHisto() { // Always creating analysis manager fAnalysisManager = G4AnalysisManager::Instance(); + fAnalysisManager->SetDefaultFileType("root"); fAnalysisManager->SetActivation(true); fAnalysisManager->SetVerboseLevel(1); @@ -168,8 +169,6 @@ void RunAction::SaveHisto(G4int nevents) } fAnalysisManager->Write(); fAnalysisManager->CloseFile(); - delete fAnalysisManager; - fAnalysisManager = 0; } } diff --git a/examples/extended/polarisation/README b/examples/extended/polarisation/README deleted file mode 100644 index 166615446a..0000000000 --- a/examples/extended/polarisation/README +++ /dev/null @@ -1,13 +0,0 @@ - - Geant4 extended examples - polarisation - ---------------------------------------- - - Examples in this directory demonstrate use of physics processes including - polarization. - Currently, only one example is provided: - -Pol01 ------- - -This example demonstrates how to compute and plot the QED processes including -polarization. diff --git a/examples/extended/radioactivedecay/.README.txt b/examples/extended/radioactivedecay/.README.txt deleted file mode 100644 index e6e3dc639e..0000000000 --- a/examples/extended/radioactivedecay/.README.txt +++ /dev/null @@ -1,25 +0,0 @@ - -///\file "radioactivedecay/.README.txt" -///\brief Examples radioactivedecay README page - -/*! \page Examples_radioactivedecay Category "radioactivedecay" - - Examples in this directory demonstrate the use of some features of the - Radioactive-Decay hadronic model in Geant4. - - \link Examplerdecay01 rdecay01 \endlink - - This example allows to display basic features of the radioactive decay - of a nuclei: energy spectrum of emitted particles, time of life, activity. - - \link Examplerdecay02 rdecay02 \endlink - - This example illustrates more advanced features of the package: - selected decay channels, time window, bias and variance reduction technique. - - \link ExampleActivation Activation \endlink - - Compute and plot time evolution of each nuclide in an hadronic cascade. - Compute and plot activity of emerging particles. - -*/ diff --git a/examples/extended/radioactivedecay/Activation/.README.txt b/examples/extended/radioactivedecay/Activation/.README.txt deleted file mode 100644 index 1f24fe2089..0000000000 --- a/examples/extended/radioactivedecay/Activation/.README.txt +++ /dev/null @@ -1,183 +0,0 @@ - - -///\file "radioactivedecay/Activation/.README.txt" -///\brief Example Activation README page - -/*! \page ExampleActivation Example Activation - - Survey energy deposition and particle's flux from an hadronic cascade, - including radioactive decays. - The main purpose of the example is to plot evolution of each metastable isomer - as a function of time, taking into account the time of exposure in the beam. - Also plot the activity of emerging particles. - Use PhysicsConstructor objects rather than predefined G4 PhysicsLists. - -\section Activation_s1 MATERIALS AND GEOMETRY DEFINITION - - The "absorber" is a box made of a given material. - - Three parameters define the absorber : - - the material of the absorber - - the thickness of an absorber - - the transverse size of the absorber (the input face is a square) - - The volume "World" contains the "absorber". - - A function, and its associated UI command, allows to build a material - directly from a single isotope. - - To be identified by the ThermalScattering module, the elements composing a - material must have a specific name (see G4ParticleHPThermalScatteringNames.cc) - Examples of such materials are build in DetectorConstruction::DefineMaterials(). - -\section Activation_s2 PHYSICS LIST - - The physics list contains a "full" set of physics processes. It is defined in - the PhysicsList class as a Geant4 modular physics list with registered physics - constructors (builders). - - Physics constructors are either constructors provided in Geant4 (with G4 prefix) - or 'local'. They include : HadronElastic, HadronInelastic, IonsInelastic, GammaNuclear, - RadioactiveDecay and Electomagnetic. - (see geant4/source/physics_lists/constructors) - - HadronElasticPhysicsHP include a model for thermalized neutrons, under the control of a command - defined in NeutronHPMesseger. - - GammmaNuclearPhysics is a subset of G4BertiniElectroNuclearBuilder. - - ElectromagneticPhysics is a simplified version of G4EmStandardPhysics. - - Several hadronic physics options are controlled by environment variables. - To select them, see Activation.cc - -\section Activation_s3 AN EVENT : THE PRIMARY GENERATOR - - The primary kinematic is a single particle which hits the absorber - perpendicular to the input face. The type of particle and its energy are - set in the PrimaryGeneratorAction class, and can be changed via the G4 - build-in commands of G4ParticleGun class - (see the macros provided with this example). - - One can control the transverse size of the beam. - The command -\verbatim -/testhadr/gun/beamSize -\endverbatim - is built in PrimaryGeneratorMessenger class. - - The time of exposure in the beam may be finite. It is controled by the command -\verbatim -/testhadr/gun/beamTime. -\endverbatim - Then the time zero of each event is randomly chosen within this interval. - -\section Activation_s4 PHYSICS - - The program computes and plots energy deposited in the interaction volume - (absorber), energy spectrum and activity of particles leaving the absorber, - and evolution of population of metastable isomers within the absorber - (see below : histograms). - Processes invoked and particles generated during interactions are listed. - -\section Activation_s5 HISTOGRAMS - - The test contains 43 built-in 1D histograms, which are managed by - G4AnalysisManager and its Messenger. The histos can be individually - activated with the command : -\verbatim -/analysis/h1/set id nbBins valMin valMax unit -\endverbatim - where unit is the desired unit for the histo (MeV or keV, etc..) - (see the macros xxxx.mac). - - 1 "total energy deposit" - 2 "Edep (MeV/mm) profile along beam direction" - 3 "total kinetic energy emerging" - 4 "energy spectrum of emerging gamma" - 5 "energy spectrum of emerging e+-" - 6 "energy spectrum of emerging neutrons" - 7 "energy spectrum of emerging protons" - 8 "energy spectrum of emerging deuterons" - 9 "energy spectrum of emerging alphas" - 10 "energy spectrum of all others emerging ions" - 11 "energy spectrum of all others emerging baryons" - 12 "energy spectrum of all others emerging mesons" - 13 "energy spectrum of all others emerging leptons (neutrinos)" - 14 "dN/dt (becquerel) of emerging gamma" - 15 "dN/dt (becquerel) of emerging e+-" - 16 "dN/dt (becquerel) of emerging neutrons" - 17 "dN/dt (becquerel) of emerging protons" - 18 "dN/dt (becquerel) of emerging deuterons" - 19 "dN/dt (becquerel) of emerging alphas" - 20 "dN/dt (becquerel) of all others emerging ions" - 21 "dN/dt (becquerel) of all others emerging baryons" - 22 "dN/dt (becquerel) of all others emerging mesons" - 23 "dN/dt (becquerel) of all others emerging leptons (neutrinos)" - - Histograms 24 to 43 are assigned to population of metastable isomer. - Here, ´metastable' means time life > 0. - - The type and number of isomers created in a run cannot be predicted in advance. - Therefore the assignation : isomer <--> histo_Id is done on fly - and printed at end of run. A lock mechanism is necessary in MT mode; see Run.cc - - Activation and binning control of histograms is done with the usual command -\verbatim -/analysis/h1/set -\endverbatim - - One can control the name of the histograms file with the command: -\verbatim -/analysis/setFileName name (default Activation) -\endverbatim - - It is possible to choose the format of the histogram file : root (default), - xml, csv, by using namespace in HistoManager.hh - - It is also possible to print selected histograms on an ascii file: -\verbatim -/analysis/h1/setAscii id -\endverbatim - All selected histos will be written on a file name.ascii (default Activation) - -\section Activation_s6 VISUALIZATION - - The Visualization Manager is set in the main(). - The initialisation of the drawing is done via the commands - /vis/... in the macro vis.mac. To get visualisation: -\verbatim -> /control/execute vis.mac -\endverbatim - - The tracks are drawn at the end of event, and erased at the end of run. - gamma green - neutron yellow - negative particles (e-, ...) red - positive particles (e+, ions, ...) blue - -\section Activation_s7 HOW TO START ? - - Execute Activation in 'batch' mode from macro files : -\verbatim -% ./Activation run1.mac -\endverbatim - - Execute Activation in 'interactive mode' with visualization : -\verbatim -% ./Activation -Idle> control/execute vis.mac -.... -Idle> type your commands -.... -Idle> exit -\endverbatim - - Macros provided in this example: - - Bi209.mac: neutron (25 meV) on 10 cm of Bi209 - - Co60.mac: neutron (25 meV) on 1 cm of Cobalt. - - Macros to be run interactively: - - debug.mac: neutron (25 meV) on Cobalt - - vis.mac: To activate visualization -*/ diff --git a/examples/extended/radioactivedecay/Activation/Activation.in b/examples/extended/radioactivedecay/Activation/Activation.in index 15a550b475..6c1a610493 100644 --- a/examples/extended/radioactivedecay/Activation/Activation.in +++ b/examples/extended/radioactivedecay/Activation/Activation.in @@ -10,10 +10,12 @@ ###/testhadr/det/setSizeYZ 1 cm # /process/em/verbose 0 -/process/had/verbose 1 +/process/had/verbose 0 # /run/initialize # +/process/em/printParameters +# /gun/particle neutron /gun/energy 25 meV # diff --git a/examples/extended/radioactivedecay/Activation/Activation.out b/examples/extended/radioactivedecay/Activation/Activation.out index 1076901353..d865af89e2 100644 --- a/examples/extended/radioactivedecay/Activation/Activation.out +++ b/examples/extended/radioactivedecay/Activation/Activation.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -27,7 +27,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ###/testhadr/det/setSizeYZ 1 cm # /process/em/verbose 0 -/process/had/verbose 1 +/process/had/verbose 0 # /run/initialize @@ -40,394 +40,95 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ---> Isotope: Co59 Z = 27 N = 59 A = 58.93 g/mole abundance: 100.000 % ElmMassFraction: 100.00 % ElmAbundance 100.00 % -/cvmfs/geant4.cern.ch/share/data/G4NDL4.6 -@@@ G4ParticleHPInelastic instantiated for particle neutron data directory variable is G4NEUTRONHPDATA pointing to /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Inelastic -@@@ G4ParticleHPInelasticData instantiated for particle neutron data directory variable is G4NEUTRONHPDATA pointing to /cvmfs/geant4.cern.ch/share/data/G4NDL4.6 -NeutronHP: /Capture file for Z = 6, A = 12 is not found and NeutronHP will use /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Capture/CrossSection/6_nat_Carbon -NeutronHP: /Elastic file for Z = 6, A = 12 is not found and NeutronHP will use /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Elastic/CrossSection/6_nat_Carbon -NeutronHP: /Inelastic file for Z = 6, A = 12 is not found and NeutronHP will use /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Inelastic/CrossSection/6_nat_Carbon +# +/process/em/printParameters +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 0 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 0.1 mm) +Step function for muons/hadrons (0.1, 0.01 mm) +Step function for light ions (0.1, 0.01 mm) +Step function for general ions (0.1, 0.001 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= # /gun/particle neutron /gun/energy 25 meV # /run/printProgress 100 /run/beamOn 1000 -====================================================================== -====== Radioactive Decay Physics Parameters ======= -====================================================================== -Max life time 1.4427e+06 ps -Internal e- conversion flag 1 -Stored internal conversion coefficients 1 -Enable correlated gamma emission 0 -Max 2J for sampling of angular correlations 10 -Atomic de-excitation enabled 1 -Auger electron emission enabled 1 -Auger cascade enabled 1 -Check EM cuts disabled for atomic de-excitation 1 -Use Bearden atomic level energies 0 -Threshold for very long decay time at rest 1e+27 ns -====================================================================== -NeutronHP: /Capture file for Z = 6, A = 12 is not found and NeutronHP will use /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Capture/CrossSection/6_nat_Carbon -NeutronHP: /Elastic file for Z = 6, A = 12 is not found and NeutronHP will use /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Elastic/CrossSection/6_nat_Carbon -NeutronHP: /Inelastic file for Z = 6, A = 12 is not found and NeutronHP will use /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Inelastic/CrossSection/6_nat_Carbon -NeutronHP: /Elastic file for Z = 6, A = 12 is not found and NeutronHP will use /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Elastic/CrossSection/6_nat_Carbon - -======================================================= -====== ParticleHP Physics Parameters ======== -======================================================= - UseOnlyPhotoEvaporation ? 1 - SkipMissingIsotopes ? 0 - NeglectDoppler ? 0 - DoNotAdjustFinalState ? 1 - ProduceFissionFragments ? 0 - UseWendtFissionModel ? 0 - UseNRESP71Model ? 0 -======================================================= - -@@@ G4ParticleHPInelastic instantiated for particle neutron data directory variable is G4NEUTRONHPDATA pointing to /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Inelastic -NeutronHP: /Capture file for Z = 6, A = 12 is not found and NeutronHP will use /cvmfs/geant4.cern.ch/share/data/G4NDL4.6/Capture/CrossSection/6_nat_Carbon - -==================================================================== - HADRONIC PROCESSES SUMMARY (verbose level 1) - ---------------------------------------------------- - Hadronic Processes for GenericIon - - Process: ionElastic - Model: NNDiffuseElastic: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV - - Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n - Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV - - Process: RadioactiveDecayBase - ---------------------------------------------------- - Hadronic Processes for He3 - - Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV - - Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n - Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV - ---------------------------------------------------- - Hadronic Processes for alpha - - Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV - - Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n - Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV - ---------------------------------------------------- - Hadronic Processes for anti_He3 - - Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n - Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: hFritiofCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for anti_alpha - - Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n - Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: hFritiofCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for anti_deuteron - - Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n - Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: hFritiofCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for anti_lambda - - Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - - Process: anti_lambdaInelastic - Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - - Process: hFritiofCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for anti_neutron - - Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV - Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: hFritiofCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for anti_proton - - Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV - Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: hFritiofCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for anti_triton - - Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n - Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV - - Process: hFritiofCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for deuteron - - Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV - - Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n - Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV - ---------------------------------------------------- - Hadronic Processes for gamma - - Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV - Model: BertiniCascade: 199 MeV ---> 10 GeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV - ---------------------------------------------------- - Hadronic Processes for kaon+ - - Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - - Process: kaon+Inelastic - Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - ---------------------------------------------------- - Hadronic Processes for kaon- - - Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - - Process: kaon-Inelastic - Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - - Process: hBertiniCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for lambda - - Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - - Process: lambdaInelastic - Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - ---------------------------------------------------- - Hadronic Processes for mu- - - Process: muMinusCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for neutron - - Process: hadElastic - Model: hElasticCHIPS: 19.5 MeV ---> 100 TeV - Model: NeutronHPElastic: 0 meV ---> 20 MeV - Cr_sctns: NeutronHPElasticXS: 0 meV ---> 20 MeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV - - Process: neutronInelastic - Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 3 GeV ---> 25 GeV - Model: Binary Cascade: 19.9 MeV ---> 6 GeV - Model: NeutronHPInelastic: 0 meV ---> 20 MeV - Cr_sctns: NeutronHPInelasticXS: 0 meV ---> 20 MeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV - - Process: nCapture - Model: NeutronHPCapture: 0 meV ---> 20 MeV - Model: nRadCapture: 19.9 MeV ---> 100 TeV - Cr_sctns: NeutronHPCaptureXS: 0 meV ---> 20 MeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV - - Process: nFission - Model: NeutronHPFission: 0 meV ---> 20 MeV - Model: G4LFission: 19.9 MeV ---> 100 TeV - Cr_sctns: NeutronHPFissionXS: 0 meV ---> 20 MeV - Cr_sctns: ZeroXS: 0 meV ---> 100 TeV - ---------------------------------------------------- - Hadronic Processes for pi+ - - Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV - - Process: pi+Inelastic - Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV - ---------------------------------------------------- - Hadronic Processes for pi- - - Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV - - Process: pi-Inelastic - Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV - - Process: hBertiniCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for proton - - Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV - - Process: protonInelastic - Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 3 GeV ---> 25 GeV - Model: Binary Cascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV - ---------------------------------------------------- - Hadronic Processes for sigma- - - Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - - Process: sigma-Inelastic - Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV - - Process: hBertiniCaptureAtRest - ---------------------------------------------------- - Hadronic Processes for triton - - Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV - - Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n - Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV - -================================================================ -======================================================================= -====== Pre-compound/De-excitation Physics Parameters ======== -======================================================================= -Type of pre-compound inverse x-section 3 -Pre-compound model active 1 -Pre-compound excitation low energy (MeV) 0.1 -Pre-compound excitation high energy (MeV) 30 -Type of de-excitation inverse x-section 3 -Type of de-excitation factory Evaporation+GEM -Number of de-excitation channels 68 -Min excitation energy (keV) 0.01 -Min energy per nucleon for multifragmentation (MeV) 2e+05 -Limit excitation energy for Fermi BreakUp (MeV) 20 -Level density (1/MeV) 0.075 -Use simple level density model 1 -Use discrete excitation energy of the residual 0 -Time limit for long lived isomeres (ns) 1442.7 -Isomer production flag 1 -Internal e- conversion flag 1 -Store e- internal conversion data 1 -Electron internal conversion ID 0 -Correlated gamma emission flag 0 -Max 2J for sampling of angular correlations 10 -======================================================================= ========= Table of registered couples ============================ Index : 0 used in the geometry : Yes Material : Galactic Range cuts : gamma 10 km e- 10 km e+ 10 km proton 0 fm - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 0 meV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 0 eV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_Co Range cuts : gamma 10 km e- 10 km e+ 10 km proton 0 fm - Energy thresholds : gamma 10 GeV e- 10 GeV e+ 10 GeV proton 0 meV + Energy thresholds : gamma 9.54993 GeV e- 9.54993 GeV e+ 9.54993 GeV proton 0 eV Region(s) which use this couple : DefaultRegionForTheWorld @@ -452,34 +153,35 @@ Index : 1 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 1000 - User=0.160000s Real=0.166122s Sys=0.000000s + User=0.110000s Real=0.115423s Sys=0.000000s The run is 1000 neutron of 25 meV through 1 cm of G4_Co (density: 8.9 g/cm3 ) Process calls frequency : - RadioactiveDecayBase= 3931 Rayl= 86 Transportation= 21880 - annihil= 5 compt= 3157 conv= 5 - eIoni= 5812 hadElastic= 154 ionIoni= 2044 - msc= 585 nCapture= 945 phot= 311 + NoProcess= 1113 Radioactivation= 2859 Rayl= 96 + Transportation= 13692 annihil= 28 compt= 1477 + conv= 32 eIoni= 4874 hadElastic= 159 + ionIoni= 2067 msc= 565 nCapture= 954 + phot= 654 + List of generated particles (with meanLife != 0): + Co59: 159 Emean = 37.497 meV ( 0.90316 meV --> 196.03 meV) stable + Co60: 954 Emean = 229.83 eV ( 2.6322 eV --> 506.41 eV ) mean life = 7.6098 y + Ni60: 954 Emean = 15.907 eV ( 15.907 eV --> 15.907 eV ) stable + anti_nu_e: 954 Emean = 225.96 keV ( 29.436 keV --> 824.54 keV) stable + e+: 32 Emean = 1.8328 MeV ( 22.541 keV --> 4.1918 MeV) stable + e-: 3121 Emean = 304.06 keV ( 4.015 eV --> 7.0686 MeV) stable + gamma: 5975 Emean = 1.6 MeV ( 13.015 eV --> 7.4914 MeV) stable - List of generated particles: - Co59: 154 Emean = 37.465 meV ( 0.19601 meV --> 163.33 meV) stable - Co60: 945 Emean = 72.285 eV ( 422.67 meV --> 404.2 eV ) mean life = 7.6098 y - Ni60: 945 Emean = 15.907 eV ( 15.907 eV --> 15.907 eV ) stable - anti_nu_e: 945 Emean = 220.41 keV ( 28.268 keV --> 1.3879 MeV) stable - e+: 5 Emean = 200.03 keV ( 64.021 keV --> 326.1 keV) stable - e-: 5833 Emean = 206.61 keV ( 20.97 eV --> 1.7924 MeV) stable - gamma: 9704 Emean = 973.4 keV ( 682.6 eV --> 1.8003 MeV) stable - - Mean energy deposit per event = 1.1781 MeV rms = 878.21 keV - Mean energy flow per event = 8.5693 MeV rms = 2.2281 MeV + Mean energy deposit per event = 948.41 keV rms = 1.1633 MeV + Mean energy flow per event = 8.8877 MeV rms = 2.2664 MeV List of particles emerging from the target : - anti_nu_e: 945 Emean = 220.41 keV ( 28.268 keV --> 1.3879 MeV) Eflow/event = 208.29 keV - e-: 49 Emean = 574.39 keV ( 58.433 keV --> 1.4898 MeV) Eflow/event = 28.145 keV - gamma: 9388 Emean = 887.6 keV ( 68.043 keV --> 1.8003 MeV) Eflow/event = 8.3328 MeV - neutron: 55 Emean = 25.115 meV ( 15.186 meV --> 42.607 meV) Eflow/event = 1.3813 meV + anti_nu_e: 954 Emean = 225.96 keV ( 29.436 keV --> 824.54 keV) Eflow/event = 215.57 keV + e+: 4 Emean = 1.8704 MeV ( 666.47 keV --> 3.0623 MeV) Eflow/event = 7.4815 keV + e-: 50 Emean = 1.1401 MeV ( 168.56 keV --> 4.8017 MeV) Eflow/event = 57.005 keV + gamma: 5289 Emean = 1.6275 MeV ( 48.452 keV --> 7.4914 MeV) Eflow/event = 8.6077 MeV + neutron: 46 Emean = 25.924 meV ( 13.589 meV --> 41.399 meV) Eflow/event = 1.1925 meV histo Id for populations : Co59 id = 26 @@ -489,11 +191,11 @@ Run Summary --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 1604086558, 873711302 + Current couple of seeds = 1724911910, 453057909 ---------------------------------------- G4 kernel has come to Quit state. ================== Deleting memory pools =================== Number of memory pools allocated: 11 of which, static: 0 -Dynamic pools deleted: 11 / Total memory freed: 0.029 MB +Dynamic pools deleted: 11 / Total memory freed: 0.025 MB ============================================================ RunManagerKernel is deleted. Good bye :) diff --git a/examples/extended/radioactivedecay/Activation/Bi209.mac b/examples/extended/radioactivedecay/Activation/Bi209.mac index cf32b53389..21ca28d91c 100644 --- a/examples/extended/radioactivedecay/Activation/Bi209.mac +++ b/examples/extended/radioactivedecay/Activation/Bi209.mac @@ -8,8 +8,13 @@ /testhadr/det/setThickness 10 cm /testhadr/det/setSizeYZ 5 cm # +/process/em/verbose 0 +/process/had/verbose 0 +# /run/initialize # +/process/em/printParameters +# /gun/particle neutron /gun/energy 25 meV /testhadr/gun/beamSize 25 mm diff --git a/examples/extended/radioactivedecay/Activation/CMakeLists.txt b/examples/extended/radioactivedecay/Activation/CMakeLists.txt index 2eca1d3c36..08385aed70 100644 --- a/examples/extended/radioactivedecay/Activation/CMakeLists.txt +++ b/examples/extended/radioactivedecay/Activation/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(Activation) #---------------------------------------------------------------------------- diff --git a/examples/extended/radioactivedecay/Activation/Co60.mac b/examples/extended/radioactivedecay/Activation/Co60.mac index e2995e6ed9..b956cfd789 100644 --- a/examples/extended/radioactivedecay/Activation/Co60.mac +++ b/examples/extended/radioactivedecay/Activation/Co60.mac @@ -8,8 +8,13 @@ /testhadr/det/setThickness 1 cm /testhadr/det/setSizeYZ 1 cm # +/process/em/verbose 0 +/process/had/verbose 0 +# /run/initialize # +/process/em/printParameters +# /gun/particle neutron /gun/energy 25 meV /testhadr/gun/beamSize 8 mm @@ -19,8 +24,8 @@ /analysis/h1/set 4 100 0 8 MeV #gamma /analysis/h1/set 14 100 0 20 year #gamma /analysis/h1/set 24 100 0 20 year #(Co60) -/analysis/h1/set 25 100 0 20 year #(Ni60) -/analysis/h1/set 26 100 0 20 year #(Co59) +/analysis/h1/set 27 100 0 20 year #(Ni60 ?) +/analysis/h1/set 28 100 0 20 year #(Co59 ?) # /run/printProgress 10000 /run/beamOn 100000 diff --git a/examples/extended/radioactivedecay/Activation/History b/examples/extended/radioactivedecay/Activation/History index 1384450819..b9744b7593 100644 --- a/examples/extended/radioactivedecay/Activation/History +++ b/examples/extended/radioactivedecay/Activation/History @@ -12,7 +12,32 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +13-10-21 mma (activation-V10-07-11) +- HadronElasticPhysicsHP : use G4GenericMessenger instead of NeutronHPMessenger +- RadioactiveDecayPhysics : do not change ThresholdOfHalfLife +06-10-21 I. Hrivnacova (activation-V10-07-10) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root). + +16-08-21 mma (activation-V10-07-09) +- TrackingAction : take weight into account + +05-08-21 mma (activation-V10-07-08) +- ElectromagneticPhysics : update EM parameters +- RadioactiveDecayPhysics : new constructor, include G4Radioactivation process, + inactivate atomic deexcitation + +27-07-21 mma (activation-V10-07-07) +- RunAction::CountProcesses() : add a protection if (process == nullptr) +- RunAction : add a comment for excited states + +19-07-21 I. Hrivnacova (activation-V10-07-06) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 22-06-21 G. Cosmo (activation-V10-07-05) - Use new CLHEP units for minute, hour, day, year and millielectronvolt in PhysicsList. diff --git a/examples/extended/radioactivedecay/Activation/README b/examples/extended/radioactivedecay/Activation/README deleted file mode 100644 index 15e5114b3d..0000000000 --- a/examples/extended/radioactivedecay/Activation/README +++ /dev/null @@ -1,163 +0,0 @@ - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Activation - ---------- - - Survey energy deposition and particle's flux from an hadronic cascade, - including radioactive decays. - The main purpose of the example is to plot evolution of each metastable isomer - as a function of time, taking into account the time of exposure in the beam. - Also plot the activity of emerging particles. - Use PhysicsConstructor objects rather than predefined G4 PhysicsLists. - - 1- MATERIALS AND GEOMETRY DEFINITION - - The "absorber" is a box made of a given material. - - Three parameters define the absorber : - - the material of the absorber - - the thickness of an absorber - - the transverse size of the absorber (the input face is a square) - - The volume "World" contains the "absorber". - - A function, and its associated UI command, allows to build a material - directly from a single isotope. - - To be identified by the ThermalScattering module, the elements composing a - material must have a specific name (see G4ParticleHPThermalScatteringNames.cc) - Examples of such materials are build in DetectorConstruction::DefineMaterials(). - - 2- PHYSICS LIST - - The physics list contains a "full" set of physics processes. It is defined in - the PhysicsList class as a Geant4 modular physics list with registered physics - constructors (builders). - - Physics constructors are either constructors provided in Geant4 (with G4 prefix) - or 'local'. They include : HadronElastic, HadronInelastic, IonsInelastic, GammaNuclear, - RadioactiveDecay and Electomagnetic. - (see geant4/source/physics_lists/constructors) - - HadronElasticPhysicsHP include a model for thermalized neutrons, under the control of a command - defined in NeutronHPMesseger. - - GammmaNuclearPhysics is a subset of G4BertiniElectroNuclearBuilder. - - ElectromagneticPhysics is a simplified version of G4EmStandardPhysics. - - Several hadronic physics options are controlled by environment variables. - To select them, see Activation.cc - - 3- AN EVENT : THE PRIMARY GENERATOR - - The primary kinematic is a single particle which hits the absorber - perpendicular to the input face. The type of particle and its energy are - set in the PrimaryGeneratorAction class, and can be changed via the G4 - build-in commands of G4ParticleGun class - (see the macros provided with this example). - - One can control the transverse size of the beam. - The command /testhadr/gun/beamSize is built in PrimaryGeneratorMessenger class. - - The time of exposure in the beam may be finite. It is controled by the command - /testhadr/gun/beamTime. - Then the time zero of each event is randomly chosen within this interval. - - 4- PHYSICS - - The program computes and plots energy deposited in the interaction volume - (absorber), energy spectrum and activity of particles leaving the absorber, - and evolution of population of metastable isomers within the absorber - (see below : histograms). - Processes invoked and particles generated during interactions are listed. - - 5- HISTOGRAMS - - The test contains 43 built-in 1D histograms, which are managed by - G4AnalysisManager and its Messenger. The histos can be individually - activated with the command : - /analysis/h1/set id nbBins valMin valMax unit - where unit is the desired unit for the histo (MeV or keV, etc..) - (see the macros xxxx.mac). - - 1 "total energy deposit" - 2 "Edep (MeV/mm) profile along beam direction" - 3 "total kinetic energy emerging" - 4 "energy spectrum of emerging gamma" - 5 "energy spectrum of emerging e+-" - 6 "energy spectrum of emerging neutrons" - 7 "energy spectrum of emerging protons" - 8 "energy spectrum of emerging deuterons" - 9 "energy spectrum of emerging alphas" - 10 "energy spectrum of all others emerging ions" - 11 "energy spectrum of all others emerging baryons" - 12 "energy spectrum of all others emerging mesons" - 13 "energy spectrum of all others emerging leptons (neutrinos)" - 14 "dN/dt (becquerel) of emerging gamma" - 15 "dN/dt (becquerel) of emerging e+-" - 16 "dN/dt (becquerel) of emerging neutrons" - 17 "dN/dt (becquerel) of emerging protons" - 18 "dN/dt (becquerel) of emerging deuterons" - 19 "dN/dt (becquerel) of emerging alphas" - 20 "dN/dt (becquerel) of all others emerging ions" - 21 "dN/dt (becquerel) of all others emerging baryons" - 22 "dN/dt (becquerel) of all others emerging mesons" - 23 "dN/dt (becquerel) of all others emerging leptons (neutrinos)" - - Histograms 24 to 43 are assigned to population of metastable isomer. - Here, ´metastable' means time life > 0. - - The type and number of isomers created in a run cannot be predicted in advance. - Therefore the assignation : isomer <--> histo_Id is done on fly - and printed at end of run. A lock mechanism is necessary in MT mode; see Run.cc - - Activation and binning control of histograms is done with the usual command - /analysis/h1/set - - One can control the name of the histograms file with the command: - /analysis/setFileName name (default Activation) - - It is possible to choose the format of the histogram file : root (default), - xml, csv, by using namespace in HistoManager.hh - - It is also possible to print selected histograms on an ascii file: - /analysis/h1/setAscii id - All selected histos will be written on a file name.ascii (default Activation) - - 6- VISUALIZATION - - The Visualization Manager is set in the main(). - The initialisation of the drawing is done via the commands - /vis/... in the macro vis.mac. To get visualisation: - > /control/execute vis.mac - - The tracks are drawn at the end of event, and erased at the end of run. - gamma green - neutron yellow - negative particles (e-, ...) red - positive particles (e+, ions, ...) blue - - 7- HOW TO START ? - - Execute Activation in 'batch' mode from macro files : - % ./Activation run1.mac - - Execute Activation in 'interactive mode' with visualization : - % ./Activation - Idle> control/execute vis.mac - .... - Idle> type your commands - .... - Idle> exit - - Macros provided in this example: - - Bi209.mac: neutron (25 meV) on 10 cm of Bi209 - - Co60.mac: neutron (25 meV) on 1 cm of Cobalt. - - Macros to be run interactively: - - debug.mac: neutron (25 meV) on Cobalt - - vis.mac: To activate visualization diff --git a/examples/extended/radioactivedecay/Activation/include/HadronElasticPhysicsHP.hh b/examples/extended/radioactivedecay/Activation/include/HadronElasticPhysicsHP.hh index 5b34dcd328..fa5f17a43b 100644 --- a/examples/extended/radioactivedecay/Activation/include/HadronElasticPhysicsHP.hh +++ b/examples/extended/radioactivedecay/Activation/include/HadronElasticPhysicsHP.hh @@ -36,7 +36,7 @@ #include "globals.hh" #include "G4HadronElasticPhysics.hh" -class NeutronHPMessenger; +class G4GenericMessenger; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -44,20 +44,26 @@ class HadronElasticPhysicsHP : public G4HadronElasticPhysics { public: HadronElasticPhysicsHP(G4int ver = 1); - ~HadronElasticPhysicsHP(); + ~HadronElasticPhysicsHP() override; public: - virtual void ConstructProcess(); - - public: - void SetThermalPhysics(G4bool flag) {fThermal = flag;}; + void ConstructProcess() override; private: - G4bool fThermal; - NeutronHPMessenger* fNeutronMessenger; + void DefineCommands(); + + G4GenericMessenger* fMessenger; + G4bool fThermal; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif + + + + + + + diff --git a/examples/extended/radioactivedecay/Activation/include/HistoManager.hh b/examples/extended/radioactivedecay/Activation/include/HistoManager.hh index ed6ac05cc6..00de842da7 100644 --- a/examples/extended/radioactivedecay/Activation/include/HistoManager.hh +++ b/examples/extended/radioactivedecay/Activation/include/HistoManager.hh @@ -34,11 +34,9 @@ #define HistoManager_h 1 #include "globals.hh" +#include "G4AnalysisManager.hh" #include -#include "g4root.hh" -//#include "g4xml.hh" - const G4int kMaxHisto1 = 24; const G4int kMaxHisto2 = 44; diff --git a/examples/extended/radioactivedecay/Activation/include/NeutronHPMessenger.hh b/examples/extended/radioactivedecay/Activation/include/NeutronHPMessenger.hh deleted file mode 100644 index d12c930ca3..0000000000 --- a/examples/extended/radioactivedecay/Activation/include/NeutronHPMessenger.hh +++ /dev/null @@ -1,62 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -/// \file NeutronHPMessenger.hh -/// \brief Definition of the NeutronHPMessenger class -// -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#ifndef NeutronHPMessenger_h -#define NeutronHPMessenger_h 1 - -#include "globals.hh" -#include "G4UImessenger.hh" - -class HadronElasticPhysicsHP; -class G4UIdirectory; -class G4UIcmdWithABool; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -class NeutronHPMessenger: public G4UImessenger -{ - public: - NeutronHPMessenger(HadronElasticPhysicsHP*); - ~NeutronHPMessenger(); - - virtual void SetNewValue(G4UIcommand*, G4String); - - private: - HadronElasticPhysicsHP* fNeutronPhysics; - - G4UIdirectory* fPhysDir; - G4UIcmdWithABool* fThermalCmd; -}; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#endif diff --git a/examples/extended/radioactivedecay/Activation/include/RadioactiveDecayPhysics.hh b/examples/extended/radioactivedecay/Activation/include/RadioactiveDecayPhysics.hh new file mode 100644 index 0000000000..5a00ee4114 --- /dev/null +++ b/examples/extended/radioactivedecay/Activation/include/RadioactiveDecayPhysics.hh @@ -0,0 +1,59 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef RadioactiveDecayPhysics_h +#define RadioactiveDecayPhysics_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class RadioactiveDecayPhysics : public G4VPhysicsConstructor +{ + public: + RadioactiveDecayPhysics(const G4String& name = "radioactiveDecay"); + ~RadioactiveDecayPhysics() override; + + public: + void ConstructParticle() override; + void ConstructProcess() override; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + + + + + + + + diff --git a/examples/extended/radioactivedecay/Activation/plotHisto.C b/examples/extended/radioactivedecay/Activation/plotHisto.C index 8bbc8b5019..57042984e4 100644 --- a/examples/extended/radioactivedecay/Activation/plotHisto.C +++ b/examples/extended/radioactivedecay/Activation/plotHisto.C @@ -18,9 +18,9 @@ TH1D* hist24 = (TH1D*)f.Get("24"); hist24->Draw("HIST"); - TH1D* hist25 = (TH1D*)f.Get("25"); - hist25->Draw("HIST"); + TH1D* hist27 = (TH1D*)f.Get("27"); + hist27->Draw("HIST"); - TH1D* hist26 = (TH1D*)f.Get("26"); - hist26->Draw("HIST"); + TH1D* hist28 = (TH1D*)f.Get("28"); + hist28->Draw("HIST"); } diff --git a/examples/extended/radioactivedecay/Activation/src/ElectromagneticPhysics.cc b/examples/extended/radioactivedecay/Activation/src/ElectromagneticPhysics.cc index 3908d52e41..a698a96d32 100644 --- a/examples/extended/radioactivedecay/Activation/src/ElectromagneticPhysics.cc +++ b/examples/extended/radioactivedecay/Activation/src/ElectromagneticPhysics.cc @@ -61,6 +61,9 @@ #include "G4IonParametrisedLossModel.hh" #include "G4NuclearStopping.hh" +#include "G4LossTableManager.hh" +#include "G4UAtomicDeexcitation.hh" + #include "G4SystemOfUnits.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -72,11 +75,11 @@ ElectromagneticPhysics::ElectromagneticPhysics(const G4String& name) G4EmParameters* param = G4EmParameters::Instance(); param->SetDefaults(); - param->SetVerbose(0); - param->SetStepFunction(0.2, 1*mm); //default= 0.1, 100*um - param->SetStepFunctionMuHad(0.2, 1*mm); - param->SetStepFunctionLightIons(0.2, 100*um); - param->SetStepFunctionIons(0.2, 50*um); + param->SetStepFunction(0.2, 100*um); + param->SetStepFunctionMuHad(0.1, 10*um); + param->SetStepFunctionLightIons(0.1, 10*um); + param->SetStepFunctionIons(0.1, 1*um); + param->SetDeexcitationIgnoreCut(true); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -157,6 +160,11 @@ void ElectromagneticPhysics::ConstructProcess() ph->RegisterProcess(new G4hIonisation(), particle); } } + + // Deexcitation + // + G4VAtomDeexcitation* de = new G4UAtomicDeexcitation(); + G4LossTableManager::Instance()->SetAtomDeexcitation(de); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/radioactivedecay/Activation/src/HadronElasticPhysicsHP.cc b/examples/extended/radioactivedecay/Activation/src/HadronElasticPhysicsHP.cc index fc444373ca..0281a99c60 100644 --- a/examples/extended/radioactivedecay/Activation/src/HadronElasticPhysicsHP.cc +++ b/examples/extended/radioactivedecay/Activation/src/HadronElasticPhysicsHP.cc @@ -23,7 +23,7 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -/// \file HadronElasticPhysicsHP.hh +/// \file HadronElasticPhysicsHP.cc /// \brief Definition of the HadronElasticPhysicsHP class // // @@ -34,8 +34,7 @@ #include "HadronElasticPhysicsHP.hh" -#include "NeutronHPMessenger.hh" - +#include "G4GenericMessenger.hh" #include "G4HadronicProcess.hh" #include "G4ParticleHPElastic.hh" #include "G4ParticleHPElasticData.hh" @@ -48,16 +47,17 @@ HadronElasticPhysicsHP::HadronElasticPhysicsHP(G4int ver) : G4HadronElasticPhysics(ver), - fThermal(false), fNeutronMessenger(0) + fMessenger(nullptr), fThermal(false) { - fNeutronMessenger = new NeutronHPMessenger(this); + // define commands for this class + DefineCommands(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... HadronElasticPhysicsHP::~HadronElasticPhysicsHP() { - delete fNeutronMessenger; + delete fMessenger; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -76,8 +76,27 @@ void HadronElasticPhysicsHP::ConstructProcess() model1->SetMinEnergy(4*eV); G4ParticleHPThermalScattering* model2 = new G4ParticleHPThermalScattering(); process->RegisterMe(model2); - process->AddDataSet(new G4ParticleHPThermalScatteringData()); + process->AddDataSet(new G4ParticleHPThermalScatteringData()); } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HadronElasticPhysicsHP::DefineCommands() +{ + // Define /testhadr/phys command directory using generic messenger class + fMessenger = new G4GenericMessenger(this, + "/testhadr/phys/", + "physics list commands"); + + // thermal scattering command + auto& thermalCmd + = fMessenger->DeclareProperty("thermalScattering", fThermal); + + thermalCmd.SetGuidance("set thermal scattering model"); + thermalCmd.SetParameterName("thermal", false); + thermalCmd.SetDefaultValue("false"); + thermalCmd.SetStates(G4State_PreInit); +} + +//..oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/radioactivedecay/Activation/src/HistoManager.cc b/examples/extended/radioactivedecay/Activation/src/HistoManager.cc index 511ab9d863..237e84a2cc 100644 --- a/examples/extended/radioactivedecay/Activation/src/HistoManager.cc +++ b/examples/extended/radioactivedecay/Activation/src/HistoManager.cc @@ -45,7 +45,6 @@ HistoManager::HistoManager() HistoManager::~HistoManager() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -53,9 +52,8 @@ HistoManager::~HistoManager() void HistoManager::Book() { // Create or get analysis manager - // The choice of analysis technology is done via selection of a namespace - // in HistoManager.hh G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); + analysisManager->SetDefaultFileType("root"); analysisManager->SetFileName(fFileName); analysisManager->SetVerboseLevel(1); analysisManager->SetActivation(true); //enable inactivation of histograms diff --git a/examples/extended/radioactivedecay/Activation/src/NeutronHPMessenger.cc b/examples/extended/radioactivedecay/Activation/src/NeutronHPMessenger.cc deleted file mode 100644 index 8e9f8bb4b1..0000000000 --- a/examples/extended/radioactivedecay/Activation/src/NeutronHPMessenger.cc +++ /dev/null @@ -1,71 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -/// \file NeutronHPMessenger.cc -/// \brief Implementation of the NeutronHPMessenger class -// -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "NeutronHPMessenger.hh" - -#include "HadronElasticPhysicsHP.hh" - -#include "G4UIdirectory.hh" -#include "G4UIcmdWithABool.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -NeutronHPMessenger::NeutronHPMessenger(HadronElasticPhysicsHP* phys) -:G4UImessenger(),fNeutronPhysics(phys), - fPhysDir(0), fThermalCmd(0) -{ - fPhysDir = new G4UIdirectory("/testhadr/phys/"); - fPhysDir->SetGuidance("physics list commands"); - - fThermalCmd = new G4UIcmdWithABool("/testhadr/phys/thermalScattering",this); - fThermalCmd->SetGuidance("set thermal scattering model"); - fThermalCmd->SetParameterName("thermal",false); - fThermalCmd->AvailableForStates(G4State_PreInit); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -NeutronHPMessenger::~NeutronHPMessenger() -{ - delete fThermalCmd; - delete fPhysDir; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void NeutronHPMessenger::SetNewValue(G4UIcommand* command, G4String newValue) -{ - if (command == fThermalCmd) - {fNeutronPhysics->SetThermalPhysics(fThermalCmd->GetNewBoolValue(newValue));} -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/radioactivedecay/Activation/src/PhysicsList.cc b/examples/extended/radioactivedecay/Activation/src/PhysicsList.cc index 3523321751..60a3f9e0ba 100644 --- a/examples/extended/radioactivedecay/Activation/src/PhysicsList.cc +++ b/examples/extended/radioactivedecay/Activation/src/PhysicsList.cc @@ -50,6 +50,8 @@ #include "G4EmStandardPhysics_option3.hh" #include "G4DecayPhysics.hh" + +#include "RadioactiveDecayPhysics.hh" #include "G4RadioactiveDecayPhysics.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -91,7 +93,8 @@ PhysicsList::PhysicsList() RegisterPhysics(new G4DecayPhysics()); // Radioactive decay - RegisterPhysics(new G4RadioactiveDecayPhysics()); + RegisterPhysics(new RadioactiveDecayPhysics()); + ////RegisterPhysics(new G4RadioactiveDecayPhysics()); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/radioactivedecay/Activation/src/RadioactiveDecayPhysics.cc b/examples/extended/radioactivedecay/Activation/src/RadioactiveDecayPhysics.cc new file mode 100644 index 0000000000..d9736fdebe --- /dev/null +++ b/examples/extended/radioactivedecay/Activation/src/RadioactiveDecayPhysics.cc @@ -0,0 +1,106 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "RadioactiveDecayPhysics.hh" + +#include "G4Radioactivation.hh" +#include "G4GenericIon.hh" +#include "G4PhysicsListHelper.hh" +#include "G4EmParameters.hh" +#include "G4VAtomDeexcitation.hh" +#include "G4UAtomicDeexcitation.hh" +#include "G4LossTableManager.hh" +#include "G4NuclearLevelData.hh" +#include "G4DeexPrecoParameters.hh" +#include "G4NuclideTable.hh" +#include "G4SystemOfUnits.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +RadioactiveDecayPhysics::RadioactiveDecayPhysics(const G4String& name) +: G4VPhysicsConstructor(name) +{ + // mandatory for G4NuclideTable + // + ///G4NuclideTable::GetInstance()->SetThresholdOfHalfLife(0.1*picosecond); + ///G4NuclideTable::GetInstance()->SetLevelTolerance(1.0*eV); + + // hadronic physics extra configuration + // + G4DeexPrecoParameters* deex = + G4NuclearLevelData::GetInstance()->GetParameters(); + deex->SetStoreICLevelData(true); + deex->SetMaxLifeTime(G4NuclideTable::GetInstance()->GetThresholdOfHalfLife() + /std::log(2.)); + deex->SetIsomerProduction(true); + deex->SetCorrelatedGamma(false); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +RadioactiveDecayPhysics::~RadioactiveDecayPhysics() +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RadioactiveDecayPhysics::ConstructParticle() +{ + G4GenericIon::GenericIon(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RadioactiveDecayPhysics::ConstructProcess() +{ + G4Radioactivation* radioactiveDecay = new G4Radioactivation(); + + G4bool ARMflag = false; + radioactiveDecay->SetARM(ARMflag); //Atomic Rearangement + + // EM physics extra configuration + // this physics constructor should be defined after EM constructor + G4EmParameters::Instance()->SetFluo(ARMflag); + G4EmParameters::Instance()->SetAugerCascade(ARMflag); + G4EmParameters::Instance()->SetDeexcitationIgnoreCut(ARMflag); + + G4LossTableManager* man = G4LossTableManager::Instance(); + G4VAtomDeexcitation* ad = man->AtomDeexcitation(); + + // EM physics constructors are not used + if( ad == nullptr ) { + ad = new G4UAtomicDeexcitation(); + man->SetAtomDeexcitation(ad); + man->ResetParameters(); + } + + G4PhysicsListHelper::GetPhysicsListHelper()-> + RegisterProcess(radioactiveDecay, G4GenericIon::GenericIon()); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/radioactivedecay/Activation/src/Run.cc b/examples/extended/radioactivedecay/Activation/src/Run.cc index d105267988..46637b916a 100644 --- a/examples/extended/radioactivedecay/Activation/src/Run.cc +++ b/examples/extended/radioactivedecay/Activation/src/Run.cc @@ -108,6 +108,7 @@ void Run::SetPrimary(G4ParticleDefinition* particle, G4double energy) void Run::CountProcesses(const G4VProcess* process) { + if (process == nullptr) return; G4String procName = process->GetProcessName(); std::map::iterator it = fProcCounter.find(procName); if ( it == fProcCounter.end()) { @@ -265,7 +266,7 @@ void Run::EndOfRun() //particles count // - G4cout << "\n List of generated particles:" << G4endl; + G4cout << "\n List of generated particles (with meanLife != 0):" << G4endl; for ( const auto& particleData : fParticleDataMap1 ) { G4String name = particleData.first; diff --git a/examples/extended/radioactivedecay/Activation/src/TrackingAction.cc b/examples/extended/radioactivedecay/Activation/src/TrackingAction.cc index e4c1bc3a9d..ec50b34dcf 100644 --- a/examples/extended/radioactivedecay/Activation/src/TrackingAction.cc +++ b/examples/extended/radioactivedecay/Activation/src/TrackingAction.cc @@ -99,11 +99,12 @@ void TrackingAction::PostUserTrackingAction(const G4Track* track) G4double tmin = analysis->GetH1Xmin(id)*unit; G4double tmax = analysis->GetH1Xmax(id)*unit; G4double binWidth = analysis->GetH1Width(id)*unit; - + G4double weight = track->GetWeight(); + G4double t1 = std::max(fTimeBirth,tmin); G4double t2 = std::min(fTimeEnd ,tmax); for (G4double time = t1; timeFillH1(id,time); + analysis->FillH1(id,time,weight); } // keep only emerging particles @@ -119,6 +120,7 @@ void TrackingAction::PostUserTrackingAction(const G4Track* track) G4String type = particle->GetParticleType(); G4double charge = particle->GetPDGCharge(); G4double time = track->GetGlobalTime(); + G4double weight = track->GetWeight(); if (charge > 3.) {ih1 = 10; ih2 = 20;} else if (particle == G4Gamma::Gamma()) {ih1 = 4; ih2 = 14;} else if (particle == G4Electron::Electron()) {ih1 = 5; ih2 = 15;} @@ -131,9 +133,8 @@ void TrackingAction::PostUserTrackingAction(const G4Track* track) else if (type == "baryon") {ih1 = 11; ih2 = 21;} else if (type == "meson") {ih1 = 12; ih2 = 22;} else if (type == "lepton") {ih1 = 13; ih2 = 23;}; - if (ih1 > 0) analysis->FillH1(ih1,ekin); - if (ih2 > 0) analysis->FillH1(ih2,time); - + if (ih1 > 0) analysis->FillH1(ih1,ekin,weight); + if (ih2 > 0) analysis->FillH1(ih2,time,weight); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/radioactivedecay/CMakeLists.txt b/examples/extended/radioactivedecay/CMakeLists.txt index eef6da2e01..f8926e4f3a 100644 --- a/examples/extended/radioactivedecay/CMakeLists.txt +++ b/examples/extended/radioactivedecay/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding all radioactivedecay examples subdirectories explicitly -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(rdecay01) add_subdirectory(rdecay02) diff --git a/examples/extended/radioactivedecay/README b/examples/extended/radioactivedecay/README deleted file mode 100644 index 428d8b794e..0000000000 --- a/examples/extended/radioactivedecay/README +++ /dev/null @@ -1,24 +0,0 @@ - - Geant4 extended examples - radioactive decay - -------------------------------------------- - - Examples in this directory demonstrate the use of some features of the - Radioactive-Decay hadronic model in Geant4. - -rdecay01 --------- - - This example allows to display basic features of the radioactive decay - of a nuclei: energy spectrum of emitted particles, time of life, activity. - -rdecay02 --------- - - This example illustrates more advanced features of the package: - selected decay channels, time window, bias and variance reduction technique. - -Activation ----------- - - Compute and plot time evolution of each nuclide in an hadronic cascade. - Compute and plot activity of emerging particles. diff --git a/examples/extended/radioactivedecay/rdecay01/.README.txt b/examples/extended/radioactivedecay/rdecay01/.README.txt deleted file mode 100644 index 886267423a..0000000000 --- a/examples/extended/radioactivedecay/rdecay01/.README.txt +++ /dev/null @@ -1,163 +0,0 @@ - -///\file "radioactivedecay/rdecay01/.README.txt" -///\brief Example rdecay01 README page - -/*! \page Examplerdecay01 Example rdecay01 - - Survey G4RadioactiveDecay process. See Physics Reference Manual, chapter 36. - See also http://ie.lbl.gov/decay.html - -\section rdecay01_s1 Geometry construction - - It is a simple box which represente an 'infinite' homogeneous medium. - -\section rdecay01_s2 Physics list - - PhysicsList.cc defines only G4RadioactiveDecay, G4Transportation processes, - and relevant particle definitions. - Therefore, once created, particles or ions travel as geantino. - -\section rdecay01_s3 Primary generator - - Default kinematic is an ion (Ne24), at rest, at coordinate origin. - Can be changed with particleGun commands. - -\section rdecay01_s4 Physics - - As said above, all particles and ions behave as geantino, eg. no energy loss. - - A flag: -\verbatim -/rdecay01/fullChain (true or false) -\endverbatim -allows to limit to single decay or full decay chain (default). - In case of full decay chain, G4TrackStatus of ions is set to fStopButAlive - in order to force decay at rest. - In case of single decay, G4TrackStatus of secondary ion is set to fStopAndKill. - - At each decay, one counts and plots energy spectrum of created particles and - ions, and energy-momentum balance of that decay. - - Total time of life of decay chain is plotted. Activity is computed. - - The command - \verbatim - /rdecay01/timeWindow - \endverbatim - allows to survey activity of each nuclide in a specified - time window [t1,t2] : population at t1 and t2, nb of decays within [t1,t2], mean activity. - See timeWindow.mac - - Few macros are given in example. Debug.mac is to be run in interactive mode. - -\section rdecay01_s5 User data files - - Users can redefine RadioactiveDecay and PhotonEvaporation data, via commands: -\verbatim -/grdm/setRadioactiveDecayFile -/grdm/setPhotoEvaporationFile -\endverbatim - Examples of such files are given in subdirectory UserData. \n - Formats are described in readme \n - Examples in macros Cf238.mac and No252.mac - - \section rdecay01_s6 example of biasing - - macro timeWindowBiased.mac illustrates one of the biasing capabilities of the - radioactiveDecay package. Ca47 is forced to decay within 20 days - (eg. 1728000 seconds in data file). - It is instructive to plot time of life (histo 8) with and without the weight of the track: - see line 189/190 of TrackingAction.cc - And also to compare with analog decay mode : comment out /grdm/ commands in the macro. -\section rdecay01_s7 Visualisation - - Visualization Manager is set in the main () (see rdecay01.cc). - Initialisation of the drawing is done via the commands - /vis/.. in the macro vis.mac. This macro is automatically read from the main - in case of interactive running mode. - - - e- red - - e+ blue - - nu_e white - - anti_nu_e white - - gamma green - - alpha yellow - - GenericIon grey - -\section rdecay01_s8 How to start ? - - - Execute rdecay01 in 'batch' mode from macro files -\verbatim -% rdecay01 singleDecay.mac -\endverbatim - - - Execute rdecay01 in 'interactive mode' with visualization -\verbatim -% rdecay01 -.... -Idle> ---> type your commands. For instance: -Idle> /control/execute debug.mac -.... -Idle> /run/beamOn 1 -.... -Idle> exit -\endverbatim - - Macros provided in this example: - - Co60.mac: Co60 - - Gd158.mac: Gd158 excited state - - No158.mac: read user data file - - Po212.mac: Po212 excited state - - Ra228.mac: Ra228 excited state - - alpha.mac: Po212 alpha decay - - atomicDeexcitation.mac: plot Auger cascade - - fullChain.mac: U238 - - neutron.mac: Li10 neutron emission - - proton.mac: Co53 proton emission - - singleDecay.mac: Ne10 - - timeWindow.mac: print activity within a given time window - - timeWindowBiased.mac: force decay within a given time window - - Macros to be run interactively: - - Cf238.mac: read user data file - - debug.mac: Pb210 - - electronicCapture.mac: Fe55 electronic capture - - vis.mac: To activate visualization - -\section rdecay01_s9 Histograms - - rdecay01 produces several 1D histograms which are saved as - rdecay01.root by default. - - - 1 : energy spectrum: e+ e- - - 2 : energy spectrum: nu_e anti_nu_ev - - 3 : energy spectrum: gamma - - 4 : energy spectrum: alpha - - 5 : energy spectrum: ions - - 6 : total kinetic energy (Q) - - 7 : momentum balance - - 8 : total time of life of decay chain - - 9 : total visible energy - - The histograms are managed by G4AnalysiManager and its Messenger. - The histos can be individually activated with the command : -\verbatim -/analysis/h1/set id nbBins valMin valMax unit -\endverbatim - where unit is the desired unit for the histo (MeV or keV, deg or mrad, etc..) - - One can control the name of the histograms file with the command: -\verbatim -/analysis/setFileName name (default rdecay1) -\endverbatim - - It is possible to choose the format of the histogram file : root (default), - xml, csv, by using namespace in HistoManager.hh - - It is also possible to print selected histograms on an ascii file: -\verbatim -/analysis/h1/setAscii id -\endverbatim - All selected histos will be written on a file name.ascii (default rdecay1) - -*/ diff --git a/examples/extended/radioactivedecay/rdecay01/CMakeLists.txt b/examples/extended/radioactivedecay/rdecay01/CMakeLists.txt index d8e5aa7358..2453136a25 100644 --- a/examples/extended/radioactivedecay/rdecay01/CMakeLists.txt +++ b/examples/extended/radioactivedecay/rdecay01/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(rdecay01) #---------------------------------------------------------------------------- diff --git a/examples/extended/radioactivedecay/rdecay01/History b/examples/extended/radioactivedecay/rdecay01/History index 89999eecca..f537690407 100644 --- a/examples/extended/radioactivedecay/rdecay01/History +++ b/examples/extended/radioactivedecay/rdecay01/History @@ -14,6 +14,15 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06-10-21 I. Hrivnacova (rdecay01-V10-07-03) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root). + +19-07-21 I. Hrivnacova (rdecay01-V10-07-02) +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 22-06-21 G. Cosmo (rdecay01-V10-07-01) - Use new CLHEP units for minute, hour, day, year and millielectronvolt in PhysicsList. diff --git a/examples/extended/radioactivedecay/rdecay01/README b/examples/extended/radioactivedecay/rdecay01/README deleted file mode 100644 index 54ee42fbaf..0000000000 --- a/examples/extended/radioactivedecay/rdecay01/README +++ /dev/null @@ -1,153 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - rdecay01 - -------- - - Survey G4RadioactiveDecay process. See Physics Reference Manual, chapter 36. - See also http://ie.lbl.gov/decay.html - - 1- Geometry construction - --------------------- - - It is a simple box which represente an 'infinite' homogeneous medium. - - 2- Physics list - ------------ - - PhysicsList.cc defines only G4RadioactiveDecay, G4Transportation processes, - and relevant particle definitions. - Therefore, once created, particles or ions travel as geantino. - - 3- Primary generator - ----------------- - - Default kinematic is an ion (Ne24), at rest, at coordinate origin. - Can be changed with particleGun commands. - - 4- Physics - ------- - As said above, all particles and ions behave as geantino, eg. no energy loss. - - A flag, /rdecay01/fullChain (true or false), allows to limit to - single decay or full decay chain (default). - In case of full decay chain, G4TrackStatus of ions is set to fStopButAlive - in order to force decay at rest. - In case of single decay, G4TrackStatus of secondary ion is set to fStopAndKill. - - At each decay, one counts and plots energy spectrum of created particles and - ions, and energy-momentum balance of that decay. - - Total time of life of decay chain is plotted. Activity is computed. - - The command /rdecay01/timeWindow allows to survey activity of each nuclide in a specified - time window [t1,t2] : population at t1 and t2, nb of decays within [t1,t2], mean activity. - See timeWindow.mac - - Few macros are given in example. Debug.mac is to be run in interactive mode. - - 4-a User data files - ------------------- - Users can redefine RadioactiveDecay and PhotonEvaporation data, via commands: - /grdm/setRadioactiveDecayFile - /grdm/setPhotoEvaporationFile - Examples of such files are given in subdirectory UserData. - Formats are described in readme - Examples in macros Cf238.mac and No252.mac - - 4-b example of biasing - ---------------------- - macro timeWindowBiased.mac illustrates one of the biasing capabilities of the - radioactiveDecay package. Ca47 is "forced" to decay within 20 days - (eg. 1728000 seconds in data file). - It is instructive to plot time of life (histo 8) with and without the weight of the track: - see lines 189/190 of TrackingAction.cc - And also to compare with analog decay mode : comment out /grdm/ commands in the macro. - - 5- Visualisation - ------------- - - Visualization Manager is set in the main(). - Initialisation of the drawing is done via the commands - /vis/.. in the macro vis.mac. This macro is automatically read from the main - in case of interactive running mode. - - e- red - e+ blue - nu_e white - anti_nu_e white - gamma green - alpha yellow - GenericIon grey - - 6- How to start ? - -------------- - - - Execute rdecay01 in 'batch' mode from macro files - % rdecay01 singleDecay.mac - - - Execute rdecay01 in 'interactive mode' with visualization - % rdecay01 - .... - Idle> ---> type your commands. For instance: - Idle> /control/execute debug.mac - .... - Idle> /run/beamOn 1 - .... - Idle> exit - - Macros provided in this example: - - Co60.mac: Co60 - - Gd158.mac: Gd158 excited state - - No158.mac: read user data file - - Po212.mac: Po212 excited state - - Ra228.mac: Ra228 excited state - - alpha.mac: Po212 alpha decay - - atomicDeexcitation.mac: plot Auger cascade - - fullChain.mac: U238 - - neutron.mac: Li10 neutron emission - - proton.mac: Co53 proton emission - - singleDecay.mac: Ne10 - - timeWindow.mac: print activity within a given time window - - timeWindowBiased.mac: force decay within a given time window - - Macros to be run interactively: - - Cf238.mac: read user data file - - debug.mac: Pb210 - - electronicCapture.mac: Fe55 electronic capture - - vis.mac: To activate visualization - - 7- Histograms - ---------- - - rdecay01 produces several 1D histograms which are saved as - rdecay01.root by default. - - 1 : energy spectrum: e+ e- - 2 : energy spectrum: nu_e anti_nu_ev - 3 : energy spectrum: gamma - 4 : energy spectrum: alpha - 5 : energy spectrum: ions - 6 : total kinetic energy (Q) - 7 : momentum balance - 8 : total time of life of decay chain - 9 : total visible energy - - The histograms are managed by G4AnalysisManager and its Messenger. - The histos can be individually activated with the command : - /analysis/h1/set id nbBins valMin valMax unit - where unit is the desired unit for the histo (MeV or keV, deg or mrad, etc..) - - One can control the name of the histograms file with the command: - /analysis/setFileName name (default rdecay1) - - It is possible to choose the format of the histogram file : root (default), - xml, csv, by using namespace in HistoManager.hh - - It is also possible to print selected histograms on an ascii file: - /analysis/h1/setAscii id - All selected histos will be written on a file name.ascii (default rdecay1) - diff --git a/examples/extended/radioactivedecay/rdecay01/include/HistoManager.hh b/examples/extended/radioactivedecay/rdecay01/include/HistoManager.hh index 494da50c3a..df91d5d01e 100644 --- a/examples/extended/radioactivedecay/rdecay01/include/HistoManager.hh +++ b/examples/extended/radioactivedecay/rdecay01/include/HistoManager.hh @@ -34,9 +34,7 @@ #define HistoManager_h 1 #include "globals.hh" - -#include "g4root.hh" -//#include "g4xml.hh" +#include "G4AnalysisManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/radioactivedecay/rdecay01/rdecay01.out b/examples/extended/radioactivedecay/rdecay01/rdecay01.out index 1730799fec..746d44e952 100644 --- a/examples/extended/radioactivedecay/rdecay01/rdecay01.out +++ b/examples/extended/radioactivedecay/rdecay01/rdecay01.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -41,9 +41,9 @@ Enable correlated gamma emission 0 Max 2J for sampling of angular correlations 10 Atomic de-excitation enabled 0 Auger electron emission enabled 0 -Auger cascade enabled 0 Check EM cuts disabled for atomic de-excitation 0 Use Bearden atomic level energies 0 +Use ANSTO fluorescence model 0 Threshold for very long decay time at rest 1e+27 ns ====================================================================== @@ -52,7 +52,7 @@ Threshold for very long decay time at rest 1e+27 ns Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 100 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 100 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -66,8 +66,8 @@ Index : 0 used in the geometry : Yes ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 0 fm 0 fm 0 fm 0 meV 0 meV 0 fm 0 fm World initStep - 1 0 fm 0 fm 0 fm 0 meV 0 meV 0 fm 0 fm World Radioactivation + 0 0 fm 0 fm 0 fm 0 eV 0 eV 0 fm 0 fm World initStep + 1 0 fm 0 fm 0 fm 0 eV 0 eV 0 fm 0 fm World Radioactivation :----- List of secondaries ---------------- Ni60[2505.753]: energy = 1.818 eV time = 9.982 y @@ -81,37 +81,37 @@ Step# X Y Z KineE dEStep StepLeng T ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 0 fm 0 fm 0 fm 128.9 keV 0 meV 0 fm 0 fm World initStep - 1 -2.171 mm -356.7 um 1 cm 128.9 keV 0 meV 1.024 cm 1.024 cm World OutOfWorld + 0 0 fm 0 fm 0 fm 128.9 keV 0 eV 0 fm 0 fm World initStep + 1 -2.171 mm -356.7 um 1 cm 128.9 keV 0 eV 1.024 cm 1.024 cm World OutOfWorld ********************************************************************************************************* * G4Track Information: Particle = anti_nu_e, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 0 fm 0 fm 0 fm 188.1 keV 0 meV 0 fm 0 fm World initStep - 1 -2.269 mm -1 cm 538.6 um 188.1 keV 0 meV 1.027 cm 1.027 cm World OutOfWorld + 0 0 fm 0 fm 0 fm 188.1 keV 0 eV 0 fm 0 fm World initStep + 1 -2.269 mm -1 cm 538.6 um 188.1 keV 0 eV 1.027 cm 1.027 cm World OutOfWorld ********************************************************************************************************* * G4Track Information: Particle = Ni60[2505.753], Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 0 fm 0 fm 0 fm 1.818 eV 0 meV 0 fm 0 fm World initStep + 0 0 fm 0 fm 0 fm 1.818 eV 0 eV 0 fm 0 fm World initStep End of event. Decay chain: Co60 ---> Ni60[2505.753] Run terminated. Run Summary Number of events processed : 1 - User=0.000000s Real=0.004739s Sys=0.000000s + User=0.000000s Real=0.001990s Sys=0.000000s ======================== run summary ====================== - The run was 1 Co60 of 0 meV + The run was 1 Co60 of 0 eV =========================================================== Nb of generated particles: - Co60: 1 Emean = 0 meV ( 0 meV --> 0 meV) mean life = 7.61 y + Co60: 1 Emean = 0 eV ( 0 eV --> 0 eV ) mean life = 7.61 y Ni60[2505.753]: 1 Emean = 1.818 eV ( 1.818 eV --> 1.818 eV ) mean life = 4.761 ps anti_nu_e: 1 Emean = 188.1 keV ( 188.1 keV --> 188.1 keV) stable e-: 1 Emean = 128.9 keV ( 128.9 keV --> 128.9 keV) stable @@ -138,7 +138,7 @@ Run Summary Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 100 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 100 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -178,15 +178,15 @@ Index : 0 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 100000 - User=0.630000s Real=0.653883s Sys=0.000000s + User=0.720000s Real=0.743373s Sys=0.010000s ======================== run summary ====================== - The run was 100000 Co60 of 0 meV + The run was 100000 Co60 of 0 eV =========================================================== Nb of generated particles: - Co60: 100000 Emean = 0 meV ( 0 meV --> 0 meV) mean life = 7.61 y + Co60: 100000 Emean = 0 eV ( 0 eV --> 0 eV ) mean life = 7.61 y Ni60[1332.514]: 118 Emean = 17.74 eV ( 367.3 meV --> 32.55 eV ) mean life = 1.06 ps Ni60[2505.753]: 99882 Emean = 1.469 eV ( 0.8367 meV --> 3.757 eV ) mean life = 4.761 ps anti_nu_e: 100000 Emean = 223 keV ( 3.89 keV --> 1.482 MeV) stable @@ -213,7 +213,7 @@ Run Summary Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 100 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 100 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -253,15 +253,15 @@ Index : 0 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 100000 - User=1.370000s Real=1.414637s Sys=0.000000s + User=1.690000s Real=1.744463s Sys=0.000000s ======================== run summary ====================== - The run was 100000 Co60 of 0 meV + The run was 100000 Co60 of 0 eV =========================================================== Nb of generated particles: - Co60: 100000 Emean = 0 meV ( 0 meV --> 0 meV) mean life = 7.61 y + Co60: 100000 Emean = 0 eV ( 0 eV --> 0 eV ) mean life = 7.61 y Ni60: 100000 Emean = 15.91 eV ( 15.91 eV --> 41.74 eV ) stable Ni60[1332.514]: 99999 Emean = 12.34 eV ( 347.1 meV --> 32.26 eV ) mean life = 1.06 ps Ni60[2158.632]: 6 Emean = 1.079 eV ( 1.079 eV --> 1.079 eV ) mean life = 0.8512 ps diff --git a/examples/extended/radioactivedecay/rdecay01/src/HistoManager.cc b/examples/extended/radioactivedecay/rdecay01/src/HistoManager.cc index ba45fa9e43..9ccb4520b3 100644 --- a/examples/extended/radioactivedecay/rdecay01/src/HistoManager.cc +++ b/examples/extended/radioactivedecay/rdecay01/src/HistoManager.cc @@ -45,7 +45,6 @@ HistoManager::HistoManager() HistoManager::~HistoManager() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -53,9 +52,8 @@ HistoManager::~HistoManager() void HistoManager::Book() { // Create or get analysis manager - // The choice of analysis technology is done via selection of a namespace - // in HistoManager.hh G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); + analysisManager->SetDefaultFileType("root"); analysisManager->SetFileName(fFileName); analysisManager->SetVerboseLevel(1); analysisManager->SetActivation(true); //enable inactivation of histograms diff --git a/examples/extended/radioactivedecay/rdecay02/.README.txt b/examples/extended/radioactivedecay/rdecay02/.README.txt deleted file mode 100644 index 4331d092eb..0000000000 --- a/examples/extended/radioactivedecay/rdecay02/.README.txt +++ /dev/null @@ -1,211 +0,0 @@ - -///\file "radioactivedecay/rdecay02/.README.txt" -///\brief Example rdecay02 README page - -/*! \page Examplerdecay02 Example rdecay02 - - Rdecay02 is created to show how to use the G4RadioactiveDecay process to - simulate the decays of radioactive isotopes as well as the induced - radioactivity resulted from nuclear interactions. - - In this example a simple geometry consists of a cylindric target placed - in the centre of a tube detector. Various primary event generation and - tallying options are available. - -\section rdecay02_s1 GEOMETRY - - The world is filled with "Air" and there are two components in it: - - - Target: A cylinder placed at the origin along the z-axis. The default - size of the cylinder is 0.5 cm radius and 1 cm length, and its default - material is "CsI". - - - Detector: A tube centered at the origin along the z-axis, with inner - radius matching the radius of the target. The default thickness of the - tube is 2 cm and it is 5 cm long. The default material is "Germanium". - - The user can change the target/detector size and material, using the - commands in the directory -\verbatim -/rdecay02/det -\endverbatim - -\section rdecay02_s2 PHYSICS - - The following physics processes are included by default: - - - Standard electromagnetic - - Decay - - Radioactive Decay - By default radioactive decay is applied through out the geometry. - The user can limit it to just the target by commands : - /process/had/rdm/noVolumes - /process/had/rdm/selectVolume Target - - - Hadronic processes - -\section rdecay02_s3 EVENT: THE PRIMARY GENERATOR - - The primary kinematic is a single particle or ion shooted at the - centre of the target. The type of the particle and its energy are set in - PrimaryGeneratorAction, and can be changed via the G4 build-in commands of - ParticleGun class (see the macros provided with this example). - Default is Ne24, at rest. - -\section rdecay02_s4 DETECTOR RESPONSE - - The relevant informations are collected in TrackingAction or - SteppingAction. These include: - - - Emission particles in the RadioactiveDecay process: - particle PDGcode, - particle kinetic energy, - particle creation time, - particle weight. - - Note: the residual nuclei is not considered as an emitted particle. - - - Radio-Isotopes. All the radioactive isotopes produced in the simulation: - isotope PDGcode, - isotope creation time, - isotope weight. - - - Energy depositions in the target and detector by prodicts of the - RadioactiveDecay process: - energy depostion (positive value for target and negative for detector), - time, - weight. - - -\section rdecay02_s5 HISTOGRAMS - - The test contains 7 built-in 1D histograms, which are managed by - G4AnalysisManager and its Messenger. The histos can be individually - activated with the command : -\verbatim - /analysis/h1/set id nbBins valMin valMax unit -\endverbatim - where unit is the desired unit for the histo (MeV or keV, etc..) - (see the macros xxxx.mac). - - histogram 0: The Pulse Height Spectrum (PHS) of the target. - histogram 1: The PHS of the detector. - histogram 2: The combined PHS of the target and detector. - histogram 3: The anti-coincidece PHS of the target. - histogram 4: The anti-coincidece PHS of the detector. - histogram 5: The coincidece PHS between the target and detector. - histogram 6: The emitted particle energy spectrum. - - It is assumed the detector and target pulses both have an integration time - of 1 microsecond, and the gate is 2 microsecond for the coincidence spectrum. - The target and detctor have a threshold of 10 keV in the anti-/coincidence - modes. - - HistoManager includes also 4 ntuples whose contents are described in the above paragraphe - (detector response) - The ntuples can be activated with the command -\verbatim - /analysis/ntuple/setActivation -\endverbatim - - One can control the name of the analysis file with the command: -\verbatim - /analysis/setFileName name (default rdecay02) -\endverbatim - - It is possible to choose the format of the histogram file : root (default), - xml, csv, by using namespace in HistoManager.hh - - It is also possible to print selected histograms on an ascii file: -\verbatim - /analysis/h1/setAscii id -\endverbatim - All selected histos will be written on a file name.ascii (default rdecay02) - -\section rdecay02_s6 VISUALIZATION - - The Visualization Manager is set in the main(). - The initialisation of the drawing is done via the commands - /vis/... in the macro vis.mac. To get visualisation: -\verbatim - > /control/execute vis.mac -\endverbatim - The tracks are drawn at the end of event, and erased at the end of run. - - gamma green - neutron yellow - negative particles (e-, ...) red - positive particles (e+, ions, ...) blue - -\section rdecay02_s7 HOW TO START ? - - Execute rdecay02 in 'batch' mode from macro files : -\verbatim - % rdecay02 run1.mac -\endverbatim - - Execute rdecay02 in 'interactive mode' with visualization : -\verbatim - % rdecay02 - Idle> control/execute vis.mac - .... - Idle> type your commands - .... - Idle> exit -\endverbatim - -\section rdecay02_s8 FURTHER EXAMPLES - - There are a number of g4mac files in the ./macros subdirectory, to show - the features of the G4RadioactiveDecay process. Most of them will lead to - the creation of an root file in the same name of the macro file. - - u238c.mac: shows the decays of the U238 chain in analogue MC mode. - - th234c-b.mac: shows the decays of Th234 in variance reduction MC mode. - All its secondaies in along the decay chains are generated. The default - source profile and decay biasing schemes are used to determine the decay - times and weights of the secondaries. - - proton.mac: simulation of 1 GeV protons incident on a lead target. - The decays of the radio-siotopes created in the proton-lead interactions - are simulated with RadioactiveDecay in analogue MC mode. - - proton-beam.mac: same as proton.mac, but the decays of the radio-siotopes - created in the proton-lead interactions are simulated with - RadioactiveDecay in variance reduction MC mode. The isotopes and those - along the decay chains are forced to decay in the time windows specified - by the user in file measures.data, and the weights of the decay products - are determined by the beam profile as defined in the beam.data file and - their decay times. - - neutron.mac: macrofile to show the incident of low energy neutrons on an - user specified NaI target and the decays of the induced radio-isotopes. - - ne24.mac: this shows the decays of Ne-24 to Na-24 in variance reduction MC - mode. Further decays of Na-24 are not simulated by applying the - nucleuslimits in RadioactiveDecay. Two runs are carried out. - One with the bracjing ratio biasing applied and one without. - - isotopes.mac: to show the decays of a number of different isotopes in a - single macro file. - - f24.mac: to show the different treatments one can apply to the decays of F24. - i) the complete decay chain from F24 to Mg24, in analogue mode; - ii) the complete chain, but in variance reduction mode; - iii) restrict to the decay of F24 only in analogue mode; iv) restrict to - the decay of F24 only but in variance reduction mode. - - as74.mac: The decays of As74 which has a rather complicated decay scheme. - i) in analogue MC mode; - ii) in variance reduction MC mode. - - UserRadDataPb210Test.mac: show how the user can define its own radioactive - decay datafile - - UserEvapDataBiTest.mac: show how the user can define its own - photo-evaporation datafile - - No252.mac: show how to simulate Radoactive decay for nuclei with Z>100 - based on user datafile -*/ diff --git a/examples/extended/radioactivedecay/rdecay02/CMakeLists.txt b/examples/extended/radioactivedecay/rdecay02/CMakeLists.txt index 0e46d2ec7e..36a79baa82 100644 --- a/examples/extended/radioactivedecay/rdecay02/CMakeLists.txt +++ b/examples/extended/radioactivedecay/rdecay02/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(rdecay02) #---------------------------------------------------------------------------- diff --git a/examples/extended/radioactivedecay/rdecay02/History b/examples/extended/radioactivedecay/rdecay02/History index afa0f4ad05..9e23fc296f 100644 --- a/examples/extended/radioactivedecay/rdecay02/History +++ b/examples/extended/radioactivedecay/rdecay02/History @@ -14,7 +14,20 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +06-10-21 I. Hrivnacova (rdecay02-V10-07-04) +- Migration to new G4AnalysisManager.hh header; + define the default output file type (root). + +27-07-21 mma (rdecay02-V10-07-03) +- RunAction::CountProcesses() : add a protection if (process == nullptr) +19-07-21 I. Hrivnacova (rdecay02-V10-07-02) +-------------------------------------- +- Updated for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + 22-06-21 G. Cosmo (rdecay02-V10-07-01) -------------------------------------- - Use new CLHEP units for minute, hour, day, year and millielectronvolt diff --git a/examples/extended/radioactivedecay/rdecay02/README b/examples/extended/radioactivedecay/rdecay02/README deleted file mode 100644 index f641f45995..0000000000 --- a/examples/extended/radioactivedecay/rdecay02/README +++ /dev/null @@ -1,208 +0,0 @@ - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - rdecay02 - -------- - - Rdecay02 is created to show how to use the G4RadioactiveDecay process to - simulate the decays of radioactive isotopes as well as the induced - radioactivity resulted from nuclear interactions. - - In this example a simple geometry consists of a cylindric target placed - in the centre of a tube detector. Various primary event generation and - tallying options are available. - - 1. GEOMETRY - - The world is filled with "Air" and there are two components in it: - - - Target: A cylinder placed at the origin along the z-axis. The default - size of the cylinder is 0.5 cm radius and 1 cm length, and its default - material is "CsI". - - - Detector: A tube centered at the origin along the z-axis, with inner - radius matching the radius of the target. The default thickness of the - tube is 2 cm and it is 5 cm long. The default material is "Germanium". - - The user can change the target/detector size and material, using the - commands in the directory /rdecay02/det - - 2. PHYSICS - - The following physics processes are included by default: - - - Standard electromagnetic - - Decay - - Radioactive Decay - By default radioactive decay is applied through out the geometry. - The user can limit it to just the target by commands : - /process/had/rdm/noVolumes - /process/had/rdm/selectVolume Target - - - Hadronic processes - - 3. AN EVENT: THE PRIMARY GENERATOR - - The primary kinematic is a single particle or ion shooted at the - centre of the target. The type of the particle and its energy are set in - PrimaryGeneratorAction, and can be changed via the G4 build-in commands of - ParticleGun class (see the macros provided with this example). - Default is Ne24, at rest. - - 4. DETECTOR RESPONSE - - The relevant informations are collected in TrackingAction or - SteppingAction. These include: - - - Emission particles in the RadioactiveDecay process: - particle PDGcode, - particle kinetic energy, - particle creation time, - particle weight. - - Note: the residual nuclei is not considered as an emitted particle. - - - Radio-Isotopes. All the radioactive isotopes produced in the simulation: - isotope PDGcode, - isotope creation time, - isotope weight. - - - Energy depositions in the target and detector by prodicts of the - RadioactiveDecay process: - energy depostion (positive value for target and negative for detector), - time, - weight. - - - 5. HISTOGRAMS - - The test contains 7 built-in 1D histograms, which are managed by - G4AnalysisManager and its Messenger. The histos can be individually - activated with the command : - /analysis/h1/set id nbBins valMin valMax unit - where unit is the desired unit for the histo (MeV or keV, etc..) - (see the macros xxxx.mac). - - histogram 0: The Pulse Height Spectrum (PHS) of the target. - histogram 1: The PHS of the detector. - histogram 2: The combined PHS of the target and detector. - histogram 3: The anti-coincidece PHS of the target. - histogram 4: The anti-coincidece PHS of the detector. - histogram 5: The coincidece PHS between the target and detector. - histogram 6: The emitted particle energy spectrum. - - It is assumed the detector and target pulses both have an integration time - of 1 microsecond, and the gate is 2 microsecond for the coincidence spectrum. - The target and detctor have a threshold of 10 keV in the anti-/coincidence - modes. - - Initially, all histograms but histogram 6 are inactive. They can all be turned on - with the command - - /analysis/h1/setActivationToAll true - - or specific histograms can be turned on with the command - - /analysis/h1/setActivation i true - - where i is the histogram index (0,... n). - To turn off, set the final argument to false - - - HistoManager includes also 4 ntuples whose contents are described in the above paragraphe - (detector response) - The ntuples can be activated with the command /analysis/ntuple/setActivation - - One can control the name of the analysis file with the command: - /analysis/setFileName name (default rdecay02) - - It is possible to choose the format of the histogram file : root (default), - xml, csv, by using namespace in HistoManager.hh - - It is also possible to print selected histograms on an ascii file: - /analysis/h1/setAscii id - All selected histos will be written on a file name.ascii (default rdecay02) - - 6. VISUALIZATION - - The Visualization Manager is set in the main(). - The initialisation of the drawing is done via the commands - /vis/... in the macro vis.mac. To get visualisation: - > /control/execute vis.mac - - The tracks are drawn at the end of event, and erased at the end of run. - - gamma green - neutron yellow - negative particles (e-, ...) red - positive particles (e+, ions, ...) blue - - 7. HOW TO START ? - - Execute rdecay02 in 'batch' mode from macro files : - % rdecay02 run1.mac - - Execute rdecay02 in 'interactive mode' with visualization : - % rdecay02 - Idle> control/execute vis.mac - .... - Idle> type your commands - .... - Idle> exit - - 8. FURTHER EXAMPLES - - There are a number of g4mac files in the ./macros subdirectory, to show - the features of the G4RadioactiveDecay process. Most of them will lead to - the creation of an root file in the same name of the macro file. - - u238c.mac: shows the decays of the U238 chain in analogue MC mode. - - th234c-b.mac: shows the decays of Th234 in variance reduction MC mode. - All its secondaies in along the decay chains are generated. The default - source profile and decay biasing schemes are used to determine the decay - times and weights of the secondaries. - - proton.mac: simulation of 1 GeV protons incident on a lead target. - The decays of the radio-siotopes created in the proton-lead interactions - are simulated with RadioactiveDecay in analogue MC mode. - - proton-beam.mac: same as proton.mac, but the decays of the radio-siotopes - created in the proton-lead interactions are simulated with - RadioactiveDecay in variance reduction MC mode. The isotopes and those - along the decay chains are forced to decay in the time windows specified - by the user in file measures.data, and the weights of the decay products - are determined by the beam profile as defined in the beam.data file and - their decay times. - - neutron.mac: macrofile to show the incident of low energy neutrons on an - user specified NaI target and the decays of the induced radio-isotopes. - - ne24.mac: this shows the decays of Ne-24 to Na-24 in variance reduction MC - mode. Further decays of Na-24 are not simulated by applying the - nucleuslimits in RadioactiveDecay. Two runs are carried out. - One with the bracjing ratio biasing applied and one without. - - isotopes.mac: to show the decays of a number of different isotopes in a - single macro file. - - f24.mac: to show the different treatments one can apply to the decays of F24. - i) the complete decay chain from F24 to Mg24, in analogue mode; - ii) the complete chain, but in variance reduction mode; - iii) restrict to the decay of F24 only in analogue mode; iv) restrict to - the decay of F24 only but in variance reduction mode. - - as74.mac: The decays of As74 which has a rather complicated decay scheme. - i) in analogue MC mode; - ii) in variance reduction MC mode. - - UserRadDataPb210Test.mac: show how the user can define its own radioactive - decay datafile - - UserEvapDataBiTest.mac: show how the user can define its own - photo-evaporation datafile - - No252.mac: show how to simulate Radoactive decay for nuclei with Z>100 - based on user datafile diff --git a/examples/extended/radioactivedecay/rdecay02/include/HistoManager.hh b/examples/extended/radioactivedecay/rdecay02/include/HistoManager.hh index e02379c44e..a2ba04f186 100644 --- a/examples/extended/radioactivedecay/rdecay02/include/HistoManager.hh +++ b/examples/extended/radioactivedecay/rdecay02/include/HistoManager.hh @@ -34,9 +34,7 @@ #define HistoManager_h 1 #include "globals.hh" - -#include "g4root.hh" -//#include "g4xml.hh" +#include "G4AnalysisManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/radioactivedecay/rdecay02/rdecay02.in b/examples/extended/radioactivedecay/rdecay02/rdecay02.in index 4db8a79495..144410fe45 100644 --- a/examples/extended/radioactivedecay/rdecay02/rdecay02.in +++ b/examples/extended/radioactivedecay/rdecay02/rdecay02.in @@ -9,8 +9,6 @@ # /run/initialize # -/process/list -# /gun/particle ion /gun/ion 10 24 # diff --git a/examples/extended/radioactivedecay/rdecay02/rdecay02.out b/examples/extended/radioactivedecay/rdecay02/rdecay02.out index b842900e4f..2fda53c080 100644 --- a/examples/extended/radioactivedecay/rdecay02/rdecay02.out +++ b/examples/extended/radioactivedecay/rdecay02/rdecay02.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -59,62 +59,6 @@ Command is ignored. for proton : 3 to 6 GeV for neutron : 3 to 6 GeV -# -/process/list - Transportation, phot, compt, conv - Rayl, msc, eIoni, eBrem - CoulombScat, msc, eIoni, eBrem - annihil, CoulombScat, msc, ionIoni - msc, muIoni, muBrems, muPairProd - CoulombScat, muIoni, msc, hIoni - hBrems, hPairProd, CoulombScat, hIoni - msc, hIoni, hBrems, hPairProd - CoulombScat, hIoni, msc, hIoni - hBrems, hPairProd, CoulombScat, msc - hIoni, CoulombScat, hIoni, hIoni - msc, ionIoni, msc, ionIoni - hIoni, hIoni, hIoni, hIoni - hIoni, hIoni, hIoni, hIoni - hIoni, hIoni, hIoni, hIoni - hIoni, hIoni, hIoni, hIoni - hIoni, hIoni, hIoni, hIoni - hIoni, hIoni, hIoni, hIoni - hIoni, hIoni, hIoni, hIoni - hIoni, hIoni, hIoni, hIoni - hIoni, hIoni, hIoni, hIoni - hIoni, hIoni, Decay, Radioactivation - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - hadElastic, hadElastic, hadElastic, hadElastic - neutronInelastic, nCapture, protonInelastic, pi+Inelastic - pi-Inelastic, kaon+Inelastic, kaon-Inelastic, kaon0LInelastic - kaon0SInelastic,anti_protonInelastic,anti_neutronInelastic,anti_deuteronInelastic -anti_tritonInelastic, anti_He3Inelastic,anti_alphaInelastic, lambdaInelastic - sigma+Inelastic, sigma-Inelastic, xi0Inelastic, xi-Inelastic - omega-Inelastic,anti_lambdaInelastic,anti_sigma+Inelastic,anti_sigma-Inelastic - anti_xi0Inelastic, anti_xi-Inelastic,anti_omega-Inelastic, D+Inelastic - D0Inelastic, D-Inelastic, anti_D0Inelastic, Ds+Inelastic - Ds-Inelastic, B+Inelastic, B0Inelastic, B-Inelastic - anti_B0Inelastic, Bs0Inelastic, anti_Bs0Inelastic, Bc+Inelastic - Bc-Inelastic, lambda_c+Inelastic, xi_c+Inelastic, xi_c0Inelastic - omega_c0Inelastic, lambda_bInelastic, xi_b0Inelastic, xi_b-Inelastic - omega_b-Inelastic,anti_lambda_c+Inelastic,anti_xi_c+Inelastic,anti_xi_c0Inelastic -anti_omega_c0Inelastic,anti_lambda_bInelastic,anti_xi_b0Inelastic,anti_xi_b-Inelastic -anti_omega_b-Inelastic, ionElastic, dInelastic, tInelastic - He3Inelastic, alphaInelastic, ionInelastic, photonNuclear - # /gun/particle ion /gun/ion 10 24 @@ -126,6 +70,84 @@ Set file name: rdecay02 # /run/printProgress 1000 /run/beamOn 10000 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (1, 1 mm) +Step function for muons/hadrons (1, 1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= +====== Atomic Deexcitation Parameters ======== +======================================================================= +Fluorescence enabled 1 +Fluorescence Bearden data files enabled 0 +Fluorescence ANSTO data files enabled 0 +Auger electron cascade enabled 1 +PIXE atomic de-excitation enabled 0 +De-excitation module ignores cuts 0 +Type of PIXE cross section for hadrons Empirical +Type of PIXE cross section for e+- Livermore +======================================================================= ### === Deexcitation model UAtomDeexcitation is activated for 1 region: DefaultRegionForTheWorld 1 1 0 @@ -135,28 +157,28 @@ Set file name: rdecay02 phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -166,25 +188,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -194,29 +216,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -224,31 +246,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -257,7 +279,7 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV ====================================================================== ====== Radioactive Decay Physics Parameters ======= @@ -269,15 +291,15 @@ Enable correlated gamma emission 0 Max 2J for sampling of angular correlations 10 Atomic de-excitation enabled 1 Auger electron emission enabled 1 -Auger cascade enabled 1 Check EM cuts disabled for atomic de-excitation 0 Use Bearden atomic level energies 0 +Use ANSTO fluorescence model 0 Threshold for very long decay time at rest 1e+27 ns ====================================================================== msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -285,12 +307,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -298,31 +320,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -330,31 +352,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -362,31 +384,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -394,32 +416,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -427,32 +449,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -460,31 +482,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -492,27 +514,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(1, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -521,35 +543,35 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionElastic - Model: NNDiffuseElastic: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: NNDiffuseElastic: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: Radioactivation @@ -557,241 +579,241 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -814,7 +836,6 @@ Time limit for long lived isomeres (ns) 0.00014427 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 1 -Electron internal conversion ID 0 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -824,21 +845,21 @@ Max 2J for sampling of angular correlations 10 Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 10 km e- 10 km e+ 10 km proton 0 fm - Energy thresholds : gamma 10 GeV e- 10 GeV e+ 10 GeV proton 0 meV + Energy thresholds : gamma 9.54993 GeV e- 9.54993 GeV e+ 9.54993 GeV proton 0 eV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_CESIUM_IODIDE Range cuts : gamma 10 km e- 10 km e+ 10 km proton 0 fm - Energy thresholds : gamma 10 GeV e- 10 GeV e+ 10 GeV proton 0 meV + Energy thresholds : gamma 9.54993 GeV e- 9.54993 GeV e+ 9.54993 GeV proton 0 eV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : Germanium Range cuts : gamma 10 km e- 10 km e+ 10 km proton 0 fm - Energy thresholds : gamma 10 GeV e- 10 GeV e+ 10 GeV proton 0 meV + Energy thresholds : gamma 9.54993 GeV e- 9.54993 GeV e+ 9.54993 GeV proton 0 eV Region(s) which use this couple : DefaultRegionForTheWorld @@ -850,8 +871,10 @@ Index : 2 used in the geometry : Yes Initial seed (index) = 0 Current couple of seeds = 9876, 54321 ---------------------------------------- +... set ntuple merging row mode : row-wise - done ... create file : rdecay02.root - done ... open analysis file : rdecay02.root - done +... open analysis file : rdecay02.root - done --> Event 0 starts. --> Event 1000 starts. --> Event 2000 starts. @@ -865,55 +888,55 @@ Index : 2 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 10000 - User=0.710000s Real=0.745139s Sys=0.000000s + User=0.710000s Real=0.745763s Sys=0.000000s - The run is 10000 Ne24 of 0 meV through : + The run is 10000 Ne24 of 0 eV through : Target : Length = 1 cm Radius = 5 mm Material = G4_CESIUM_IODIDE Detector : Length = 5 cm Thickness = 2 cm Material = Germanium - Mean energy deposit in target, in time window = 806.45 keV rms = 419.41 keV - Mean energy deposit in detector, in time window = 19.291 keV rms = 109.73 keV + Mean energy deposit in target, in time window = 809.46 keV rms = 422.05 keV + Mean energy deposit in detector, in time window = 17.632 keV rms = 106.32 keV Process calls frequency in target : - Radioactivation= 60828 Rayl= 267 Transportation= 50140 - annihil= 161 compt= 4215 conv= 164 - eIoni= 26028 ionIoni= 39627 msc= 3558 - phot= 1595 + NoProcess= 10000 Radioactivation= 50725 Rayl= 258 + Transportation= 50135 annihil= 188 compt= 4131 + conv= 194 eIoni= 25946 ionIoni= 39558 + msc= 3150 phot= 1529 Process calls frequency in detector: - Rayl= 1205 Transportation= 45921 annihil= 347 - compt= 22564 conv= 352 eIoni= 27444 - msc= 5830 phot= 4258 + Rayl= 1228 Transportation= 45896 annihil= 330 + compt= 22533 conv= 331 eIoni= 27403 + msc= 5611 phot= 4273 List of generated particles in target: - Mg24: 10000 Emean = 42.119 eV ( 41.932 eV --> 842.44 eV ) - Mg24[1368.672]: 9997 Emean = 169.94 eV ( 85.066 eV --> 440.38 eV ) - Mg24[4122.889]: 9985 Emean = 39.305 eV ( 141.48 meV --> 75.018 eV ) - Mg24[5235.120]: 4 Emean = 3.0075 eV ( 314.93 meV --> 5.416 eV ) - Na24: 9997 Emean = 4.9965 eV ( 4.9901 eV --> 15.742 eV ) - Na24[1346.621]: 838 Emean = 27.798 eV ( 81.88 meV --> 51.99 eV ) - Na24[472.207]: 10000 Emean = 68.661 eV ( 147.52 meV --> 133.82 eV ) - Na24[563.199]: 7 Emean = 13.735 eV ( 13.735 eV --> 13.735 eV ) - anti_nu_e: 20000 Emean = 980.72 keV ( 35.558 keV --> 4.7316 MeV) - e+: 164 Emean = 807.72 keV ( 3.9611 keV --> 1.6505 MeV) - e-: 25994 Emean = 633.58 keV ( 37.533 eV --> 3.5013 MeV) - gamma: 31143 Emean = 1.5031 MeV ( 90.991 keV --> 3.8661 MeV) + Mg24: 10000 Emean = 42.502 eV ( 41.932 eV --> 909.16 eV ) + Mg24[1368.672]: 9991 Emean = 169.91 eV ( 46.779 eV --> 419.89 eV ) + Mg24[4122.889]: 9976 Emean = 39.283 eV ( 141.48 meV --> 74.745 eV ) + Mg24[5235.120]: 2 Emean = 2.0865 eV ( 673.5 meV --> 3.4995 eV ) + Na24: 9991 Emean = 4.9989 eV ( 4.9901 eV --> 15.742 eV ) + Na24[1346.621]: 754 Emean = 28.528 eV ( 414.97 meV --> 52.407 eV ) + Na24[472.207]: 9999 Emean = 69.191 eV ( 64.48 meV --> 134.33 eV ) + Na24[563.199]: 12 Emean = 13.735 eV ( 13.735 eV --> 13.735 eV ) + anti_nu_e: 20000 Emean = 984.8 keV ( 27.785 keV --> 5.1042 MeV) + e+: 194 Emean = 788.59 keV ( 1.7574 keV --> 1.6659 MeV) + e-: 25881 Emean = 635.43 keV ( 72.285 eV --> 3.457 MeV) + gamma: 31092 Emean = 1.5027 MeV ( 90.991 keV --> 3.8661 MeV) List of generated particles in detector: - e+: 352 Emean = 868.75 keV ( 14.733 keV --> 1.7001 MeV) - e-: 27157 Emean = 380.69 keV ( 112.2 eV --> 3.4647 MeV) - gamma: 690 Emean = 518.82 keV ( 330.31 keV --> 1.418 MeV) + e+: 331 Emean = 872.71 keV ( 11.228 keV --> 1.6904 MeV) + e-: 27127 Emean = 377.87 keV ( 105.46 eV --> 2.743 MeV) + gamma: 658 Emean = 519.2 keV ( 354.47 keV --> 1.4365 MeV) ... write file : rdecay02.root - done ... close file : rdecay02.root - done --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 1362126438, 1599555896 + Current couple of seeds = 1268488396, 2098735751 ---------------------------------------- G4 kernel has come to Quit state. ================== Deleting memory pools =================== -Number of memory pools allocated: 10 of which, static: 0 -Dynamic pools deleted: 10 / Total memory freed: 0.024 MB +Number of memory pools allocated: 12 of which, static: 0 +Dynamic pools deleted: 12 / Total memory freed: 0.026 MB ============================================================ RunManagerKernel is deleted. Good bye :) diff --git a/examples/extended/radioactivedecay/rdecay02/src/HistoManager.cc b/examples/extended/radioactivedecay/rdecay02/src/HistoManager.cc index ac7ca7f808..32b1164032 100644 --- a/examples/extended/radioactivedecay/rdecay02/src/HistoManager.cc +++ b/examples/extended/radioactivedecay/rdecay02/src/HistoManager.cc @@ -45,7 +45,6 @@ HistoManager::HistoManager() HistoManager::~HistoManager() { - delete G4AnalysisManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -53,11 +52,10 @@ HistoManager::~HistoManager() void HistoManager::Book() { // Create or get analysis manager - // The choice of analysis technology is done via selection of a namespace - // in HistoManager.hh // G4AnalysisManager* analysis = G4AnalysisManager::Instance(); + analysis->SetDefaultFileType("root"); analysis->SetFileName(fFileName); analysis->SetVerboseLevel(1); analysis->SetActivation(true); //enable inactivation of histos, nTuples diff --git a/examples/extended/radioactivedecay/rdecay02/src/Run.cc b/examples/extended/radioactivedecay/rdecay02/src/Run.cc index 0f54f1ca1a..2582c5cb87 100644 --- a/examples/extended/radioactivedecay/rdecay02/src/Run.cc +++ b/examples/extended/radioactivedecay/rdecay02/src/Run.cc @@ -68,8 +68,8 @@ void Run::SetPrimary(G4ParticleDefinition* particle, G4double energy) void Run::CountProcesses(const G4VProcess* process, G4int iVol) { + if (process == nullptr) return; G4String procName = process->GetProcessName(); - if (iVol == 1) { std::map::iterator it1 = fProcCounter1.find(procName); if ( it1 == fProcCounter1.end()) { diff --git a/examples/extended/runAndEvent/.README.txt b/examples/extended/runAndEvent/.README.txt deleted file mode 100644 index 80a76c1fc6..0000000000 --- a/examples/extended/runAndEvent/.README.txt +++ /dev/null @@ -1,57 +0,0 @@ - -///\file "runAndEvent/.README.txt" -///\brief Examples runAndEvent README page - -/*! \page Examples_runAndEvent Category "runAndEvent" - - Examples in this directory demonstrate the use of some features in -Run and Event categories. Since these categories are on the top of -hierarchy of Geant4 structure to control the full functionarities of -Geant4, some examples contain features in other categories such as -Tracking, Track, Particles, Detector responces, and even some cases -Geometry and Processes. - -\link ExampleRE01 RE01 \endlink - - This example demonstrates how to connect the information between -primary particles and hits. It also utilizes some user-information -classes. - -\link ExampleRE02 RE02 \endlink - - This example demonstrates how to accumulate the physics quantities -such as energy deposition and dose for a run. It also demonstrates -the use of primitive scorers. - -\link ExampleRE03 RE03 \endlink - - This example demonstrates how to use UI-command base scoring. -It create parallel world(s) for defining scoring mesh(es). - -\link ExampleRE04 RE04 \endlink - - This example demonstrates how to define layered mass geometry in -a parallel world and use it in a simulation. - -\link ExampleRE05 RE05 \endlink - -Defines a simplified collider detector setup. -Demonstrates interfacing to the PYTHIA primary generator. Includes -the definition of a 'readout' geometry. Exercises event filtering using -the stacking mechanism. Includes visualization. \n -It was moved in extended examples from novice/N04 with removal of -novice examples. - -\link ExampleRE06 RE06 \endlink - -Implements three simplified sandwitch calorimeters. -Shows how to modify part of the geometry setup at run-time. Includes -detector description parameterisation by materials. Demonstrates -sharing of a sensitive detector definition for different sub-detectors. -Defines different geometrical regions with different production -thresholds. Shows customization of the G4Run. \n -It was moved in extended examples from novice/N07 with removal of -novice examples. - -*/ - diff --git a/examples/extended/runAndEvent/CMakeLists.txt b/examples/extended/runAndEvent/CMakeLists.txt index aa6637c6c5..4661985d0d 100644 --- a/examples/extended/runAndEvent/CMakeLists.txt +++ b/examples/extended/runAndEvent/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding all runAndEvent examples subdirectories explicitly -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(RE01) add_subdirectory(RE02) @@ -8,3 +8,4 @@ add_subdirectory(RE03) add_subdirectory(RE04) add_subdirectory(RE05) add_subdirectory(RE06) +add_subdirectory(RE07) diff --git a/examples/extended/runAndEvent/History b/examples/extended/runAndEvent/History index fb03ac5561..1bd462a4cb 100644 --- a/examples/extended/runAndEvent/History +++ b/examples/extended/runAndEvent/History @@ -15,6 +15,9 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Dec. 06th, 2021, I. Hrivnacova (exRunAndEvent-V10-07-01) +- Added RE07 in Doxygen documentation + May 24th, 2021, B. Morgan (exRunAndEvent-V10-07-00) - Bump required CMake version range to 3.12...3.20, matching core Geant4 diff --git a/examples/extended/runAndEvent/RE01/.README.txt b/examples/extended/runAndEvent/RE01/.README.txt deleted file mode 100644 index 8abcedf960..0000000000 --- a/examples/extended/runAndEvent/RE01/.README.txt +++ /dev/null @@ -1,70 +0,0 @@ - -///\file "runAndEvent/RE01/.README.txt" -///\brief Example RE01 README page - -/*! \page ExampleRE01 Example RE01 - - - Contact : M.Asai (SLAC) - -\section RE01_s1 Introduction - - This example demonstrates how to connect the information between -primary particles and hits. It also utilize some user-information -classes. - -\subsection RE01_s11 Geometry and region information - - It has a quite simple cylindrical tracker of 5 layers and a -cylindrical calorimeter of lead and scintillator. Dedicated regions -are assigned to both tracker and calorimeter mother volumes not -for setting additional production thresholds but for adding some -more information to these regions. RE01RegionInformation is the -class for this purpose. - A "readout geometry" is attached to the calorimeter to define -its cells. - -\subsection RE01_s12 Physics - - This example basically uses QGSP_BERT physics list. In addition -to this, RE01UnknownDecayPhysics is used for adding decay process to -G4UnknownParticle. - -\subsection RE01_s13 Event generator - - An event sample is attached. This event has a Higgs particle -which decays into e+e- and mu+mu- pairs through two Z bosons. -It uses G4HEPEvtInterface. - In this example, by utilizing G4UnknownParticle, all particles -appear in the primary event are converted to G4Track and then -to RE01Trajectory. Relation between primary particles and track -IDs are shown at the end of event execution. - -\section RE01_s2 "Source track" information - - "Source track" is meant for a track that is either a primary -particle or a track born is the tracking region. This information -is stored in RE01TrackInformation class object and copied from -a parent track to its daughters. - -\subsection RE01_s21 Track suspension - - All source tracks are suspended for their tracking when they are -getting into the calorimeter region. Thus, all tracks in the tracker -region are tracked before generating any shower in the calorimeter. - -\subsection RE01_s22 Tracker hits associated with primary particle information - - Information kept in RE01TrackInformation is used to connect each -tracker hit to the primary particle. - -\subsection RE01_s23 Energy deposition of each source track - - Utilizing RE01StackingAction, shower generation is done for each -souorce track separately, and thus energy deposition in calorimeter -cells are shown for each individual source track. With the trajectory -information, energy deposition for each primary particle can also -be gotten. - -*/ - diff --git a/examples/extended/runAndEvent/RE01/CMakeLists.txt b/examples/extended/runAndEvent/RE01/CMakeLists.txt index f2dc8d1fa5..446f000bae 100644 --- a/examples/extended/runAndEvent/RE01/CMakeLists.txt +++ b/examples/extended/runAndEvent/RE01/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(RE01) #---------------------------------------------------------------------------- diff --git a/examples/extended/runAndEvent/RE01/README b/examples/extended/runAndEvent/RE01/README deleted file mode 100644 index f463c78101..0000000000 --- a/examples/extended/runAndEvent/RE01/README +++ /dev/null @@ -1,66 +0,0 @@ - - RE01 - An extended example for run and event - -------------------------------------------- - - Contact : M.Asai (SLAC) - -1. Introduction - - This example demonstrates how to connect the information between -primary particles and hits. It also utilize some user-information -classes. - -1.1 Geometry and region information - - It has a quite simple cylindrical tracker of 5 layers and a -cylindrical calorimeter of lead and scintillator. Dedicated regions -are assigned to both tracker and calorimeter mother volumes not -for setting additional production thresholds but for adding some -more information to these regions. RE01RegionInformation is the -class for this purpose. - A "readout geometry" is attached to the calorimeter to define -its cells. - -1.2 Physics - - This example basically uses QGSP_BERT physics list. In addition -to this, RE01UnknownDecayPhysics is used for adding decay process to -G4UnknownParticle. - -1.3 Event generator - - An event sample is attached. This event has a Higgs particle -which decays into e+e- and mu+mu- pairs through two Z bosons. -It uses G4HEPEvtInterface. - In this example, by utilizing G4UnknownParticle, all particles -appear in the primary event are converted to G4Track and then -to RE01Trajectory. Relation between primary particles and track -IDs are shown at the end of event execution. - -2. "Source track" information - - "Source track" is meant for a track that is either a primary -particle or a track born is the tracking region. This information -is stored in RE01TrackInformation class object and copied from -a parent track to its daughters. - -2.1 Track suspension - - All source tracks are suspended for their tracking when they are -getting into the calorimeter region. Thus, all tracks in the tracker -region are tracked before generating any shower in the calorimeter. - -2.2 Tracker hits associated with primary particle information - - Information kept in RE01TrackInformation is used to connect each -tracker hit to the primary particle. - -2.3 Energy deposition of each source track - - Utilizing RE01StackingAction, shower generation is done for each -souorce track separately, and thus energy deposition in calorimeter -cells are shown for each individual source track. With the trajectory -information, energy deposition for each primary particle can also -be gotten. - - diff --git a/examples/extended/runAndEvent/RE01/sample.out b/examples/extended/runAndEvent/RE01/sample.out index 15320bab62..32c41d4ec3 100644 --- a/examples/extended/runAndEvent/RE01/sample.out +++ b/examples/extended/runAndEvent/RE01/sample.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -27,10 +27,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -90,32 +88,99 @@ even though it appears in the current tracking world. Default cuts are used for this region. /mydet/generator PYTHIA /run/beamOn 1 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -125,25 +190,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -153,29 +218,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -183,31 +248,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -216,12 +281,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -229,12 +294,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -242,31 +307,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -274,31 +339,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -306,31 +371,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -338,32 +403,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -371,32 +436,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -404,31 +469,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -436,27 +501,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -465,18 +530,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -484,69 +549,69 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -554,13 +619,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -568,13 +633,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -582,13 +647,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -596,13 +661,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -610,13 +675,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -624,13 +689,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -638,62 +703,62 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -701,28 +766,28 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -730,27 +795,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -758,27 +823,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -786,13 +851,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -815,7 +880,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -825,4828 +889,4616 @@ See commands in /vis/modeling/trajectories/ for other options. Tracks in tracking region have been processed. -- Stage 0 over. -Source track ID 8647 (gamma,2.9376095453628[GeV]) at (140.53178516477,479.84457625194,-280.93728330691) +Source track ID 9914 (gamma,71.517979249326[GeV]) at (140.3930993518,479.88517132164,-280.93450796615) Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[8,9] 2.5896227839299 [GeV] -Cell[8,10] 0.29200988952404 [GeV] -Cell[9,8] 0.0030158724956166 [GeV] -Cell[8,8] 0.015277267693234 [GeV] -Cell[5,24] 0.00046991652807261 [GeV] -Cell[8,7] 0.0011754078488919 [GeV] -Cell[8,45] 0.0010692749475066 [GeV] -Cell[8,44] 0.0028666064319264 [GeV] -Cell[7,11] 0.0024040092471818 [GeV] -Cell[7,10] 0.0031882691894174 [GeV] -Cell[7,9] 0.020331228949872 [GeV] -Cell[10,10] 0.0011858227741731 [GeV] -Cell[8,11] 0.00016967005430391 [GeV] -Cell[4,45] 0.0013307667247747 [GeV] -Cell[4,37] 0.0016529299270945 [GeV] -Cell[9,31] 0.0018031213418494 [GeV] -### Total energy deposition in calorimeter by a source track in 16 cells : 2.9375728376079 (GeV) +Cell[8,9] 64.733530955325 [GeV] +Cell[8,10] 4.572358072916 [GeV] +Cell[8,8] 0.29629216456482 [GeV] +Cell[7,9] 0.90050838400722 [GeV] +Cell[7,8] 0.067828198789999 [GeV] +Cell[3,44] 0.001057579895165 [GeV] +Cell[7,10] 0.40463299939608 [GeV] +Cell[8,11] 0.10507528117242 [GeV] +Cell[8,13] 0.0055655358340044 [GeV] +Cell[6,41] 0.00049950515972796 [GeV] +Cell[7,31] 0.00076809302771949 [GeV] +Cell[7,11] 0.046223498763124 [GeV] +Cell[8,12] 0.0069158904538416 [GeV] +Cell[8,45] 0.0088642312438722 [GeV] +Cell[8,46] 0.00084456707464448 [GeV] +Cell[9,9] 0.014700923530664 [GeV] +Cell[9,10] 0.01268212067594 [GeV] +Cell[7,7] 0.010221485450194 [GeV] +Cell[4,24] 0.0015495476206753 [GeV] +Cell[9,8] 0.017472974013727 [GeV] +Cell[8,7] 0.023388498875225 [GeV] +Cell[9,24] 0.0016295291439459 [GeV] +Cell[8,28] 0.0017341181557309 [GeV] +Cell[7,32] 0.0051617173067326 [GeV] +Cell[7,6] 0.012573010934256 [GeV] +Cell[9,11] 0.003070396482697 [GeV] +Cell[10,27] 0.001085881637476 [GeV] +Cell[16,31] 0.0006500241674561 [GeV] +Cell[4,28] 0.00044653408605281 [GeV] +Cell[4,29] 0.0011661505138642 [GeV] +Cell[6,25] 0.00052119196762198 [GeV] +Cell[6,26] 0.00028713540770107 [GeV] +Cell[6,43] 0.00094576685592072 [GeV] +Cell[4,47] 0.00086228098442494 [GeV] +Cell[4,46] 0.0021496064729947 [GeV] +Cell[10,28] 0.00093406512545299 [GeV] +Cell[6,32] 0.0037974738688194 [GeV] +Cell[9,12] 0.0026477958938114 [GeV] +Cell[6,24] 0.0012961085314894 [GeV] +Cell[7,12] 0.005944954711486 [GeV] +Cell[8,39] 0.00013414032706057 [GeV] +Cell[12,39] 0.00087157011565415 [GeV] +Cell[16,2] 0.00025815638373333 [GeV] +Cell[13,19] 0.00021188830716293 [GeV] +Cell[7,27] 0.00073401805481018 [GeV] +Cell[6,9] 0.0074014277311456 [GeV] +Cell[8,6] 0.00061111883395872 [GeV] +Cell[7,33] 0.0019519006649636 [GeV] +Cell[4,42] 0.001904466095691 [GeV] +Cell[6,10] 5.3152576778316e-05 [GeV] +Cell[5,24] 1.912379150474e-05 [GeV] +Cell[5,27] 0.00024197658255807 [GeV] +Cell[5,18] 0.00019700252910997 [GeV] +Cell[7,5] 0.011553801543511 [GeV] +Cell[7,13] 0.00050138241248734 [GeV] +Cell[8,32] 0.0024012090530037 [GeV] +Cell[6,6] 0.0008724346828224 [GeV] +Cell[7,47] 0.0011209672053314 [GeV] +Cell[6,8] 0.0018328691579929 [GeV] +Cell[4,40] 0.0017843342090082 [GeV] +Cell[11,25] 0.00026294498077534 [GeV] +Cell[11,17] 0.00017818137142449 [GeV] +Cell[5,46] 0.0027926803312186 [GeV] +Cell[7,29] 0.006029224130399 [GeV] +Cell[9,21] 0.00093491277032676 [GeV] +Cell[7,30] 0.0045126246406127 [GeV] +Cell[13,31] 0.00024412924955281 [GeV] +Cell[9,5] 0.00013908871583112 [GeV] +Cell[9,7] 0.00090140427211369 [GeV] +Cell[7,46] 0.0010857124927999 [GeV] +Cell[7,45] 0.00065546258399684 [GeV] +Cell[5,9] 0.0023615685551664 [GeV] +Cell[13,27] 0.00048931479893887 [GeV] +Cell[4,8] 5.5007593764458e-06 [GeV] +Cell[4,9] 7.4453004344832e-06 [GeV] +Cell[5,8] 4.5051183740497e-05 [GeV] +Cell[4,33] 0.0030328864384577 [GeV] +Cell[5,33] 0.00062231113124866 [GeV] +Cell[5,34] 0.0031741743969132 [GeV] +### Total energy deposition in calorimeter by a source track in 79 cells : 71.3400158084 (GeV) -Source track ID 8648 (gamma,48.493002178168[GeV]) at (140.53777516325,479.84282192418,-280.93823428502) +Source track ID 9843 (e+,2.0578835103854[GeV]) at (154.55406961726,475.51344835319,-281.44746151966) Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[8,9] 43.706852093218 [GeV] -Cell[8,10] 3.0955255472995 [GeV] -Cell[9,8] 0.0039238050151083 [GeV] -Cell[8,8] 0.22854961715128 [GeV] -Cell[8,7] 0.010255222960327 [GeV] -Cell[7,11] 0.023738940668009 [GeV] -Cell[7,10] 0.35634026726639 [GeV] -Cell[7,9] 0.67872373218116 [GeV] -Cell[8,11] 0.06923693325397 [GeV] -Cell[8,12] 0.0078181820330166 [GeV] -Cell[9,10] 0.0029203859720883 [GeV] -Cell[9,9] 0.0093090584242855 [GeV] -Cell[7,8] 0.047356251035305 [GeV] -Cell[8,1] 0.0063175343154032 [GeV] -Cell[13,38] 0.00033808960848545 [GeV] -Cell[7,5] 0.00011967605282618 [GeV] -Cell[7,25] 0.0012601655375318 [GeV] -Cell[7,12] 0.0073264667577108 [GeV] -Cell[9,11] 0.0013068844056448 [GeV] -Cell[6,41] 0.0040059242519841 [GeV] -Cell[9,34] 0.00093878245057592 [GeV] -Cell[9,4] 0.00018299240911666 [GeV] -Cell[8,5] 0.0045801276150766 [GeV] -Cell[9,12] 0.0010708834212544 [GeV] -Cell[18,41] 0.00033805229755799 [GeV] -Cell[5,8] 0.0015182090903847 [GeV] -Cell[7,13] 0.0045604280823242 [GeV] -Cell[7,22] 0.00050488809140916 [GeV] -Cell[7,23] 1.4318889327569e-07 [GeV] -Cell[7,7] 0.0069550233712982 [GeV] -Cell[7,6] 0.0046174486450734 [GeV] -Cell[6,18] 0.0044854428642851 [GeV] -Cell[6,19] 0.00051099891 [GeV] -Cell[6,10] 0.020197320500958 [GeV] -Cell[8,46] 0.00051099891 [GeV] -Cell[6,9] 0.0050404151763295 [GeV] -Cell[9,13] 0.0017471112956087 [GeV] -Cell[6,25] 0.00041534072844308 [GeV] -Cell[5,26] 0.00011185849798858 [GeV] -Cell[5,25] 2.6286133052622e-05 [GeV] -Cell[6,7] 0.0005434070261553 [GeV] -Cell[6,8] 4.2013250768895e-05 [GeV] -Cell[6,12] 0.00051099891 [GeV] -Cell[8,19] 2.2712904261425e-05 [GeV] -Cell[2,47] 0.00080224572305929 [GeV] -Cell[2,0] 3.9707017060664e-07 [GeV] -Cell[7,15] 0.0023065013751954 [GeV] -Cell[10,37] 0.00036025677278923 [GeV] -Cell[8,32] 0.0005219404474812 [GeV] -Cell[9,6] 0.00040750243363832 [GeV] -Cell[5,32] 0.00074999627526104 [GeV] -Cell[6,38] 0.00084801310362877 [GeV] -Cell[6,37] 9.7398356251688e-07 [GeV] -Cell[6,16] 0.0024343289805742 [GeV] -Cell[5,36] 0.00060574938151774 [GeV] -Cell[0,27] 0.0017580482788042 [GeV] -### Total energy deposition in calorimeter by a source track in 56 cells : 48.331452615004 (GeV) +Cell[8,9] 1.952831115331 [GeV] +Cell[8,10] 0.016594864238776 [GeV] +Cell[8,8] 0.047874463278078 [GeV] +Cell[7,9] 0.0074443973722168 [GeV] +Cell[7,8] 0.012341076300998 [GeV] +Cell[8,11] 0.001933785263081 [GeV] +Cell[7,11] 0.0011003906516789 [GeV] +Cell[9,9] 0.00043909061113571 [GeV] +Cell[8,7] 0.0012880117314524 [GeV] +Cell[7,12] 0.0032320684576271 [GeV] +Cell[6,36] 0.0013206345764381 [GeV] +Cell[8,24] 0.0006032236440686 [GeV] +Cell[4,37] 0.0012826368760405 [GeV] +Cell[13,30] 0.0012947870460899 [GeV] +Cell[9,38] 0.00082710351530412 [GeV] +Cell[5,35] 0.0032761183555749 [GeV] +Cell[4,45] 0.0037241155179107 [GeV] +Cell[8,38] 0.00020617118381516 [GeV] +### Total energy deposition in calorimeter by a source track in 18 cells : 2.0576140539513 (GeV) -Source track ID 8651 (gamma,0.18841493455268[GeV]) at (140.97466387572,479.7146486664,-281.02721645722) +Source track ID 9820 (mu+,97.449404437789[GeV]) at (421.38296645308,269.14010400385,1659.1336863015) Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[8,9] 0.17517134255876 [GeV] -Cell[8,10] 0.0026136105851372 [GeV] -Cell[7,11] 0.0019375752870819 [GeV] -Cell[8,1] 0.00015580867819497 [GeV] -Cell[10,37] 0.0022629578822507 [GeV] -Cell[7,35] 0.0010921866903915 [GeV] -Cell[12,34] 0.0010715089410248 [GeV] -Cell[13,33] 0.0007282646202476 [GeV] -Cell[5,41] 0.0025820290625454 [GeV] -### Total energy deposition in calorimeter by a source track in 9 cells : 0.18761528430563 (GeV) +Cell[18,4] 0.18750572186067 [GeV] +Cell[19,4] 0.22530807797313 [GeV] +Cell[16,26] 0.00063821157048537 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.41345201140428 (GeV) -Source track ID 8657 (gamma,0.00014508047901603[GeV]) at (165.55841218988,471.79488355976,-8.2508306920429) +Source track ID 9821 (mu-,49.164873349615[GeV]) at (-250.04195086821,-432.98847883751,234.30759600325) Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[9,9] 0.00014508047901603 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00014508047901603 (GeV) +Cell[16,31] 0.024299794897436 [GeV] +Cell[13,31] 0.022282916752854 [GeV] +Cell[11,31] 0.054809009536631 [GeV] +Cell[11,32] 0.4280589795848 [GeV] +Cell[12,32] 0.64130878964092 [GeV] +Cell[13,32] 0.65069616574634 [GeV] +Cell[14,32] 0.47653369003471 [GeV] +Cell[15,32] 0.44367458646957 [GeV] +Cell[16,32] 0.58939125392917 [GeV] +Cell[17,32] 0.021213114985789 [GeV] +Cell[15,31] 0.010026346795827 [GeV] +Cell[14,31] 0.021507458216735 [GeV] +Cell[12,31] 0.063343212188895 [GeV] +Cell[10,32] 0.00031701687063922 [GeV] +Cell[10,31] 0.001368840116879 [GeV] +### Total energy deposition in calorimeter by a source track in 15 cells : 3.4488311757672 (GeV) -Source track ID 8654 (gamma,0.013184271782224[GeV]) at (141.4189115876,479.58387321237,-280.98621473845) -Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[8,9] 0.013184271782224 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.013184271782224 (GeV) - -Source track ID 8655 (gamma,1.7959188949636[GeV]) at (141.42145579006,479.58312297475,-280.98586837604) -Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[8,9] 1.6373831148914 [GeV] -Cell[8,10] 0.11265490554631 [GeV] -Cell[8,8] 0.0098412266934271 [GeV] -Cell[7,11] 0.0033244711403737 [GeV] -Cell[7,10] 0.0028007972222819 [GeV] -Cell[7,9] 0.00051099891 [GeV] -Cell[8,11] 0.00095129124167705 [GeV] -Cell[9,10] 0.00017232891251281 [GeV] -Cell[5,36] 0.0019194235865219 [GeV] -Cell[8,40] 0.0004434885047045 [GeV] -Cell[7,27] 1.581416578847e-05 [GeV] -Cell[8,36] 1.061655182275e-05 [GeV] -Cell[8,35] 0.00070421844748773 [GeV] -Cell[8,22] 4.5787940962327e-08 [GeV] -Cell[8,23] 1.5123054276955e-07 [GeV] -Cell[14,30] 0.0028668678854376 [GeV] -Cell[6,34] 0.00091558375022124 [GeV] -Cell[8,2] 0.0006225567788111 [GeV] -Cell[5,42] 0.00054702356279781 [GeV] -Cell[5,43] 0.00045280953162467 [GeV] -Cell[9,35] 0.00046151635710615 [GeV] -### Total energy deposition in calorimeter by a source track in 21 cells : 1.7765992506987 (GeV) - -Source track ID 8571 (e+,20.145174704208[GeV]) at (141.47033600516,479.56870626698,-280.98450610995) -Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[8,9] 18.391711264155 [GeV] -Cell[8,10] 1.2343629634925 [GeV] -Cell[9,8] 0.00071677572776908 [GeV] -Cell[8,8] 0.086865603795112 [GeV] -Cell[5,24] 1.9190256774891e-05 [GeV] -Cell[8,7] 0.00089493487384299 [GeV] -Cell[8,45] 1.1456626816653e-07 [GeV] -Cell[7,11] 0.0045017607074357 [GeV] -Cell[7,10] 0.084560956886811 [GeV] -Cell[7,9] 0.18275631726565 [GeV] -Cell[8,11] 0.040489554572428 [GeV] -Cell[8,12] 0.0012761398575884 [GeV] -Cell[9,10] 0.004896561847737 [GeV] -Cell[9,9] 0.0015478688945815 [GeV] -Cell[7,8] 0.011528886032834 [GeV] -Cell[9,11] 0.0047487188277557 [GeV] -Cell[7,23] 0.00069158130617094 [GeV] -Cell[7,7] 0.0016570190210281 [GeV] -Cell[7,6] 0.0020531274072329 [GeV] -Cell[9,13] 8.3682648838248e-05 [GeV] -Cell[8,36] 0.00091609348621409 [GeV] -Cell[5,43] 0.004397442201588 [GeV] -Cell[6,43] 0.0065210634998906 [GeV] -Cell[6,44] 0.00051099891 [GeV] -Cell[11,21] 0.00017318435619441 [GeV] -Cell[7,30] 0.0015457672998525 [GeV] -Cell[8,43] 0.0019199877767503 [GeV] -Cell[5,33] 0.0010867500065214 [GeV] -Cell[7,39] 0.00036619503937578 [GeV] -Cell[9,36] 0.00018302144798634 [GeV] -Cell[8,13] 5.4948954618794e-07 [GeV] -Cell[11,28] 0.00074618707019281 [GeV] -Cell[7,47] 0.00045987913439922 [GeV] -Cell[7,45] 1.6392319230363e-07 [GeV] -Cell[7,41] 9.8636111943051e-08 [GeV] -Cell[7,42] 1.5782334958203e-07 [GeV] -Cell[16,12] 2.4480861611664e-08 [GeV] -Cell[18,6] 7.887402898632e-08 [GeV] -Cell[14,44] 4.0671602420161e-06 [GeV] -Cell[14,43] 5.8621204061637e-08 [GeV] -Cell[9,3] 0.0003570188293181 [GeV] -Cell[10,29] 0.00047764044662083 [GeV] -Cell[8,37] 0.00070959385016007 [GeV] -Cell[7,37] 0.0013183137093412 [GeV] -Cell[6,13] 0.00066759730672173 [GeV] -Cell[5,0] 1.0616871062666e-05 [GeV] -Cell[5,47] 1.7191402992466e-05 [GeV] -Cell[5,11] 0.00054484087009894 [GeV] -Cell[1,34] 0.00049389608834849 [GeV] -Cell[1,33] 1.4488134524981e-08 [GeV] -Cell[9,42] 0.00034067289207902 [GeV] -Cell[8,16] 0.00053421487488773 [GeV] -Cell[8,15] 0.00072249595637252 [GeV] -Cell[6,32] 0.003184022156858 [GeV] -Cell[9,7] 0.00099383338628107 [GeV] -Cell[7,14] 0.0011473919937208 [GeV] -Cell[8,6] 0.00063925828176425 [GeV] -Cell[4,32] 0.0011896958047802 [GeV] -### Total energy deposition in calorimeter by a source track in 58 cells : 20.08754310059 (GeV) - -Source track ID 8570 (e-,0.00051218664474972[GeV]) at (421.33637499984,269.2130366494,1658.6933128468) -Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[18,4] 1.1877347497228e-06 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 1.1877347497228e-06 (GeV) - -Source track ID 8541 (mu+,97.449413388047[GeV]) at (421.36386015204,269.17001571084,1659.0901041227) -Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[18,4] 0.16551974682966 [GeV] -Cell[19,4] 0.19616849718335 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.361688244013 (GeV) - -Source track ID 8542 (mu-,49.167801472927[GeV]) at (-250.05856345648,-432.97888498411,234.2493490096) -Original primary track ID 1 (unknown,305.48142430119[GeV]) -Cell[11,31] 0.057030807512147 [GeV] -Cell[11,32] 0.35384449521428 [GeV] -Cell[12,32] 0.50210920668945 [GeV] -Cell[13,32] 0.43973019118799 [GeV] -Cell[14,32] 0.47685054924166 [GeV] -Cell[15,32] 0.73702695351123 [GeV] -Cell[16,32] 2.6514283628602 [GeV] -Cell[17,32] 0.029223739512726 [GeV] -Cell[16,31] 0.10956183174971 [GeV] -Cell[17,31] 0.0097924138535674 [GeV] -Cell[15,31] 0.030042213308087 [GeV] -Cell[14,31] 0.0011638487181398 [GeV] -Cell[12,31] 0.0059852762217332 [GeV] -Cell[13,31] 0.0026791392978758 [GeV] -### Total energy deposition in calorimeter by a source track in 14 cells : 5.4064690288789 (GeV) - -Source track ID 8537 (gamma,0.18586941759822[GeV]) at (-308.57129365728,-393.42566862201,1178.600776121) +Source track ID 9816 (gamma,0.18586941759822[GeV]) at (-308.57139732957,-393.42558730982,1178.6005832694) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[15,31] 0.0080486896661722 [GeV] -Cell[15,30] 0.13372552387585 [GeV] -Cell[15,39] 0.00051099891 [GeV] -Cell[16,30] 0.022577362929398 [GeV] -Cell[12,5] 0.00051099891 [GeV] -Cell[18,12] 0.00046979127029161 [GeV] -Cell[16,29] 0.0024331551649339 [GeV] -Cell[17,5] 0.00022642778071639 [GeV] -Cell[16,17] 0.0029224397607393 [GeV] -Cell[16,21] 0.00046388001593188 [GeV] -Cell[14,38] 0.00051099891 [GeV] -Cell[17,10] 0.00051099891 [GeV] -Cell[19,39] 9.9292177845788e-05 [GeV] -Cell[18,17] 0.0058716746634575 [GeV] -Cell[14,3] 0.0018504789597473 [GeV] -Cell[13,46] 0.00051099891 [GeV] -### Total energy deposition in calorimeter by a source track in 16 cells : 0.18124371081508 (GeV) +Cell[16,31] 0.008285161283578 [GeV] +Cell[18,4] 0.0010842599118087 [GeV] +Cell[16,32] 0.0054894369915902 [GeV] +Cell[15,31] 0.040731565315957 [GeV] +Cell[15,30] 0.081411941567256 [GeV] +Cell[16,7] 0.00082593430807097 [GeV] +Cell[19,14] 0.0078178603943449 [GeV] +Cell[18,14] 0.00050241957801103 [GeV] +Cell[16,30] 0.026972696955513 [GeV] +Cell[17,40] 0.0072721941653144 [GeV] +Cell[18,29] 0.00056202769102712 [GeV] +Cell[16,39] 0.0013574216368651 [GeV] +Cell[15,14] 0.0022947604258868 [GeV] +Cell[14,43] 0.00062298420138405 [GeV] +### Total energy deposition in calorimeter by a source track in 14 cells : 0.18523066442661 (GeV) -Source track ID 8538 (gamma,0.79108390679382[GeV]) at (-463.39575537319,-187.78810905409,658.34952723719) +Source track ID 9817 (gamma,0.79108390679382[GeV]) at (-463.39574786568,-187.78812758002,658.34957605829) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[13,26] 0.68842169188336 [GeV] -Cell[13,27] 0.089815592539635 [GeV] -Cell[13,28] 0.0004228311347272 [GeV] -Cell[15,46] 0.0012589709483824 [GeV] -Cell[11,27] 0.00016872201898204 [GeV] -Cell[16,5] 0.00099622764889242 [GeV] -Cell[14,26] 0.0022297054172472 [GeV] -Cell[13,25] 0.0007157883972148 [GeV] -Cell[14,27] 0.0057178378244703 [GeV] -Cell[12,10] 0.00038345296189051 [GeV] -Cell[14,35] 0.00061080912799658 [GeV] -### Total energy deposition in calorimeter by a source track in 11 cells : 0.7907416299028 (GeV) +Cell[13,27] 0.063892872088335 [GeV] +Cell[13,26] 0.70616524932987 [GeV] +Cell[15,7] 0.00073361775775358 [GeV] +Cell[13,25] 0.0016530705300629 [GeV] +Cell[12,23] 0.0023745536677355 [GeV] +Cell[14,28] 0.0034893317852547 [GeV] +Cell[12,3] 0.0019506536051721 [GeV] +Cell[13,3] 0.00051099891 [GeV] +Cell[11,13] 0.00010968959362999 [GeV] +Cell[16,0] 0.00093318932326253 [GeV] +Cell[12,26] 0.00068978606774165 [GeV] +Cell[13,28] 0.0008117018128807 [GeV] +### Total energy deposition in calorimeter by a source track in 12 cells : 0.7833147144717 (GeV) -Source track ID 8197 (gamma,0.68389327451526[GeV]) at (-406.71456953711,-290.83201152254,428.61115719032) +Source track ID 9513 (gamma,0.68389327451526[GeV]) at (-406.71457072934,-290.83200985525,428.61115789822) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[11,28] 0.002893113544088 [GeV] -Cell[13,28] 0.0054030328096079 [GeV] -Cell[12,28] 0.65456158538922 [GeV] -Cell[12,29] 0.014316634006487 [GeV] -Cell[12,27] 0.0022984711949595 [GeV] -Cell[9,16] 0.00051099891 [GeV] -Cell[10,12] 0.0015025085895301 [GeV] -Cell[12,17] 0.0024061521731716 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.68389249661707 (GeV) +Cell[4,37] 0.00010598012384536 [GeV] +Cell[11,13] 0.00050827709783023 [GeV] +Cell[13,28] 0.002369449174007 [GeV] +Cell[12,28] 0.64230844372878 [GeV] +Cell[12,29] 0.020998669136445 [GeV] +Cell[12,27] 0.0078428205202804 [GeV] +Cell[11,29] 0.00051099891 [GeV] +Cell[14,7] 0.00065397422043954 [GeV] +Cell[14,15] 0.00067155226091384 [GeV] +Cell[10,1] 0.0018407436977609 [GeV] +Cell[14,4] 0.00068229553876909 [GeV] +Cell[14,45] 0.00069616561732224 [GeV] +Cell[11,30] 0.00024038646327502 [GeV] +Cell[13,18] 0.00048677169379664 [GeV] +Cell[13,39] 0.0014090969727887 [GeV] +Cell[11,24] 0.00070999528407973 [GeV] +Cell[12,8] 0.0010433802315353 [GeV] +### Total energy deposition in calorimeter by a source track in 17 cells : 0.68307900067187 (GeV) -Source track ID 8198 (gamma,0.23519569097121[GeV]) at (-263.70589302827,-424.80489872665,329.32744127033) +Source track ID 9514 (gamma,0.23519569097121[GeV]) at (-263.70588842477,-424.80490158437,329.32743775765) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[11,31] 0.19305688766126 [GeV] -Cell[11,32] 0.024355278220643 [GeV] -Cell[12,32] 0.0049746502291034 [GeV] -Cell[12,31] 0.010743676416492 [GeV] -Cell[11,30] 0.0020651984437141 [GeV] -### Total energy deposition in calorimeter by a source track in 5 cells : 0.23519569097121 (GeV) +Cell[9,8] 9.7427051514387e-08 [GeV] +Cell[9,7] 1.1483667758853e-05 [GeV] +Cell[11,31] 0.21105325300755 [GeV] +Cell[11,32] 0.013546128701733 [GeV] +Cell[12,32] 0.00087477177402705 [GeV] +Cell[10,37] 3.2214113161899e-07 [GeV] +Cell[10,8] 1.9608438014984e-07 [GeV] +Cell[9,6] 1.7478509107605e-08 [GeV] +Cell[10,7] 5.2911473176209e-09 [GeV] +Cell[10,6] 2.4365302238039e-08 [GeV] +Cell[12,15] 0.00028786614000028 [GeV] +### Total energy deposition in calorimeter by a source track in 11 cells : 0.22577416607859 (GeV) -Source track ID 8131 (proton,1.6975714624652[GeV]) at (-499.99294730801,2.6556811262993,255.89759317703) +Source track ID 9111 (proton,1.698524062039[GeV]) at (-499.99727175624,1.6517373628201,252.7272770119) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[11,21] 0.0021888816433774 [GeV] -Cell[12,10] 2.7159170144841e-08 [GeV] -Cell[11,23] 0.48798629550392 [GeV] -Cell[11,24] 0.0054144470713019 [GeV] -Cell[11,22] 0.024217395797554 [GeV] -Cell[12,21] 0.0052512579331817 [GeV] -Cell[12,20] 6.1455658492719e-05 [GeV] -Cell[12,40] 1.4113844372332e-06 [GeV] -Cell[13,40] 5.3172634459315e-06 [GeV] -Cell[12,39] 2.3676553602058e-05 [GeV] -Cell[13,39] 3.6143564267377e-06 [GeV] -Cell[12,24] 0.0017813538717282 [GeV] -Cell[12,25] 0.00070666376813108 [GeV] -Cell[12,26] 1.2482349231959e-06 [GeV] -Cell[10,24] 0.00014835682977957 [GeV] -Cell[12,23] 0.011943347455306 [GeV] -Cell[11,20] 5.1084595324937e-06 [GeV] -Cell[12,22] 0.0019113942270683 [GeV] -Cell[10,32] 8.181854209397e-07 [GeV] -Cell[10,33] 0.0010453244268581 [GeV] -Cell[12,11] 2.6756245705428e-06 [GeV] -Cell[11,10] 1.0062787509924e-08 [GeV] -Cell[11,25] 0.00075661917499815 [GeV] -Cell[7,2] 6.5831055107992e-06 [GeV] -Cell[12,7] 0.00024883349243146 [GeV] -Cell[12,6] 3.2150891986475e-06 [GeV] -Cell[13,23] 0.0010929161430302 [GeV] -### Total energy deposition in calorimeter by a source track in 27 cells : 0.54480824847618 (GeV) +Cell[11,25] 0.00058127033163089 [GeV] +Cell[9,21] 3.8706245073854e-06 [GeV] +Cell[12,23] 0.010204187973439 [GeV] +Cell[14,28] 5.5933836847544e-07 [GeV] +Cell[14,45] 3.7195670302026e-07 [GeV] +Cell[11,24] 0.0049038014322871 [GeV] +Cell[11,23] 0.32639742157245 [GeV] +Cell[10,25] 0.00017272452689758 [GeV] +Cell[10,24] 0.00014378530175234 [GeV] +Cell[10,23] 0.00066129823530712 [GeV] +Cell[8,21] 0.0004348931942834 [GeV] +Cell[8,20] 1.6239887322627e-06 [GeV] +Cell[14,44] 8.1701262388378e-07 [GeV] +Cell[13,41] 7.8588898759335e-07 [GeV] +Cell[11,22] 0.0012117192391606 [GeV] +Cell[10,22] 0.00019251817515469 [GeV] +Cell[12,22] 0.343240330593 [GeV] +Cell[13,22] 3.6321796414995e-10 [GeV] +### Total energy deposition in calorimeter by a source track in 18 cells : 0.68815197974851 (GeV) -Source track ID 8132 (anti_proton,1.0341123553149[GeV]) at (-279.32892446273,-414.69911014915,-337.81427572821) +Source track ID 9285 (gamma,0.30518683774644[GeV]) at (-245.50885799734,-435.5747933993,-347.96924177841) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[8,8] 5.7491160987411e-10 [GeV] -Cell[8,7] 2.470571142112e-05 [GeV] -Cell[8,44] 1.0622683068505e-05 [GeV] -Cell[7,11] 0.0014239202796015 [GeV] -Cell[7,9] 0.00030582772706043 [GeV] -Cell[10,10] 0.010507701345183 [GeV] -Cell[8,11] 1.1160355541051e-07 [GeV] -Cell[9,31] 0.0047262949797214 [GeV] -Cell[8,12] 0.00096731565526795 [GeV] -Cell[7,8] 0.00051100389795862 [GeV] -Cell[7,25] 0.00074880807176697 [GeV] -Cell[9,34] 5.4312844004016e-06 [GeV] -Cell[9,4] 0.026120981931689 [GeV] -Cell[7,13] 1.5615217940649e-05 [GeV] -Cell[7,22] 0.00093654053168234 [GeV] -Cell[7,23] 1.2412389144515e-05 [GeV] -Cell[8,46] 0.001444913645187 [GeV] -Cell[9,13] 0.0018805202230726 [GeV] -Cell[6,12] 3.4211561258417e-05 [GeV] -Cell[7,15] 0.00037891715508104 [GeV] -Cell[8,32] 0.053624635651989 [GeV] -Cell[9,6] 0.013154313324858 [GeV] -Cell[5,41] 0.00011046518590979 [GeV] -Cell[8,40] 0.0049596479027225 [GeV] -Cell[8,36] 3.9243814826477e-06 [GeV] -Cell[8,23] 0.0051731264233246 [GeV] -Cell[8,2] 3.1697226414849e-05 [GeV] -Cell[5,42] 3.9640254951109e-05 [GeV] -Cell[9,35] 2.8766478062607e-05 [GeV] -Cell[7,30] 0.054326730527448 [GeV] -Cell[8,43] 1.2845025223214e-05 [GeV] -Cell[7,39] 0.00075573130642942 [GeV] -Cell[9,36] 6.9785742680665e-05 [GeV] -Cell[8,13] 0.0024038186643698 [GeV] -Cell[7,47] 0.0011127765440598 [GeV] -Cell[7,45] 3.1209832513923e-09 [GeV] -Cell[8,37] 3.5581922566053e-06 [GeV] -Cell[7,37] 3.7147080875002e-06 [GeV] -Cell[6,13] 0.00017686987920297 [GeV] -Cell[5,0] 4.5282246219358e-09 [GeV] -Cell[5,47] 4.7576776523783e-08 [GeV] -Cell[9,42] 7.8260380250867e-06 [GeV] -Cell[8,16] 0.00051116185441867 [GeV] -Cell[6,32] 0.0025610946488955 [GeV] -Cell[9,7] 1.1971008689216e-08 [GeV] -Cell[7,14] 0.00044921621748836 [GeV] -Cell[8,6] 0.0026047879320504 [GeV] -Cell[12,10] 0.00022972900053063 [GeV] -Cell[11,10] 4.1982776292571e-07 [GeV] -Cell[7,2] 2.9912436259565e-06 [GeV] -Cell[8,31] 0.53281201834412 [GeV] -Cell[8,30] 0.009826077569368 [GeV] -Cell[6,39] 0.00018836582805254 [GeV] -Cell[5,4] 0.00011934718368597 [GeV] -Cell[9,33] 0.0007978720466688 [GeV] -Cell[9,43] 0.00039153661013272 [GeV] -Cell[10,43] 0.00063963888353519 [GeV] -Cell[11,39] 0.00054024880509765 [GeV] -Cell[11,40] 0.0050994643765789 [GeV] -Cell[10,47] 0.00035400604122363 [GeV] -Cell[9,5] 0.055299482873616 [GeV] -Cell[9,39] 0.00015315788780966 [GeV] -Cell[6,15] 0.002922282348029 [GeV] -Cell[8,39] 0.020766389178693 [GeV] -Cell[3,13] 0.00013409744208893 [GeV] -Cell[10,8] 0.0033959745619623 [GeV] -Cell[10,7] 0.0044185911689368 [GeV] -Cell[10,6] 0.0024668451266483 [GeV] -Cell[8,18] 0.011684795764324 [GeV] -Cell[9,27] 8.990790520329e-06 [GeV] -Cell[8,3] 0.00026536072759461 [GeV] -Cell[4,26] 5.5773925851099e-08 [GeV] -Cell[3,26] 1.7696181304245e-06 [GeV] -Cell[8,17] 3.5537022654353e-08 [GeV] -Cell[9,32] 0.0027066544730305 [GeV] -Cell[10,3] 0.0017862137012412 [GeV] -Cell[10,4] 0.0052114373283188 [GeV] -Cell[10,5] 0.0014715644173839 [GeV] -Cell[10,19] 0.0004335215391352 [GeV] -Cell[11,11] 1.5854557628927e-06 [GeV] -Cell[10,1] 0.00056367096694498 [GeV] -Cell[10,0] 0.00042481298182986 [GeV] -Cell[9,1] 0.00084957676013039 [GeV] -Cell[10,9] 0.00024491352872008 [GeV] -Cell[5,2] 0.0036902621801314 [GeV] -Cell[5,3] 2.5796438276302e-06 [GeV] -Cell[2,12] 2.3969054745976e-06 [GeV] -Cell[0,40] 0.0001974220815847 [GeV] -Cell[0,39] 3.1743868021294e-08 [GeV] -Cell[1,44] 7.6036373093302e-07 [GeV] -Cell[0,44] 4.2942410800606e-09 [GeV] -Cell[1,45] 1.9408908906371e-07 [GeV] -Cell[9,22] 1.3323694292922e-06 [GeV] -Cell[9,21] 2.5091782143022e-05 [GeV] -Cell[8,21] 1.3775308616459e-08 [GeV] -Cell[8,28] 1.6595586203039e-08 [GeV] -Cell[9,30] 0.0048545299806902 [GeV] -Cell[9,29] 0.00078790199348464 [GeV] -Cell[10,30] 0.0013377301826473 [GeV] -Cell[10,31] 0.00016748994823024 [GeV] -Cell[8,29] 0.0044959029731063 [GeV] -Cell[8,33] 0.00097512057531196 [GeV] -Cell[11,5] 0.0097353239887752 [GeV] -Cell[11,3] 0.0048638392618628 [GeV] -Cell[10,2] 2.9666253714822e-05 [GeV] -Cell[11,4] 0.0067177948626104 [GeV] -Cell[9,2] 3.1581642688252e-06 [GeV] -Cell[13,17] 0.00014604530942188 [GeV] -Cell[13,18] 1.7187625282986e-06 [GeV] -Cell[7,3] 0.0012987535591317 [GeV] -Cell[8,42] 0.00012338814946463 [GeV] -Cell[7,43] 3.7011824315414e-06 [GeV] -Cell[7,32] 0.00022852510554333 [GeV] -Cell[7,33] 0.00083763840930476 [GeV] -Cell[8,34] 6.482567135879e-05 [GeV] -Cell[10,34] 3.9363512769341e-09 [GeV] -Cell[4,8] 0.00066541146912346 [GeV] -Cell[4,9] 1.1383092451069e-06 [GeV] -Cell[3,9] 4.4849002733827e-11 [GeV] -Cell[3,27] 0.001397136381524 [GeV] -Cell[6,0] 0.014789317471848 [GeV] -Cell[6,1] 0.0088727320917594 [GeV] -Cell[6,47] 0.0054173219054072 [GeV] -Cell[5,1] 7.8168661766767e-05 [GeV] -Cell[6,2] 0.002245390854657 [GeV] -Cell[6,3] 0.0035011780590203 [GeV] -Cell[7,1] 0.00017135535263151 [GeV] -Cell[6,4] 0.0005103221780937 [GeV] -Cell[7,4] 0.00069496644489367 [GeV] -Cell[6,46] 0.00034095801335229 [GeV] -Cell[7,46] 0.00020020584932115 [GeV] -Cell[6,45] 1.1547739597972e-07 [GeV] -Cell[7,31] 0.011745159850004 [GeV] -Cell[4,2] 3.9146654278738e-05 [GeV] -Cell[4,3] 0.0016507899291608 [GeV] -Cell[4,4] 0.00078665218234674 [GeV] -Cell[9,23] 0.0010299354872624 [GeV] -Cell[6,31] 0.0001293728514039 [GeV] -Cell[7,29] 0.24590068358068 [GeV] -Cell[10,17] 2.6708355289884e-07 [GeV] -Cell[11,12] 3.5460310755298e-08 [GeV] -Cell[8,24] 0.0020577316824985 [GeV] -Cell[7,40] 1.8824554661023e-07 [GeV] -Cell[6,11] 0.0018509370970488 [GeV] -Cell[5,28] 0.0015652120567911 [GeV] -Cell[5,27] 0.00016841896437165 [GeV] -Cell[8,0] 2.1100956655573e-05 [GeV] -Cell[11,2] 0.001964858648175 [GeV] -Cell[7,28] 0.00019658065101999 [GeV] -Cell[6,20] 0.00081088405890971 [GeV] -### Total energy deposition in calorimeter by a source track in 150 cells : 1.2077923915881 (GeV) +Cell[8,32] 0.28526707134071 [GeV] +Cell[3,14] 0.00051099891 [GeV] +Cell[7,34] 0.0017247476392669 [GeV] +Cell[8,33] 0.0075425182625095 [GeV] +Cell[4,12] 0.001163519519292 [GeV] +Cell[1,41] 0.0049123516452323 [GeV] +Cell[1,42] 0.00080602670127694 [GeV] +Cell[8,31] 0.001942620797455 [GeV] +Cell[10,38] 0.00039187698374221 [GeV] +Cell[6,20] 0.00051099891 [GeV] +### Total energy deposition in calorimeter by a source track in 10 cells : 0.30477273070949 (GeV) -Source track ID 8152 (gamma,0.37133215847831[GeV]) at (-133.93655571807,-481.72710017434,181.68248543309) +Source track ID 9286 (gamma,0.19450844188576[GeV]) at (-300.43247605957,-399.6752773549,-316.2653373935) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[10,33] 0.24392254906826 [GeV] -Cell[10,43] 0.00011233235200937 [GeV] -Cell[10,34] 0.010893323920132 [GeV] -Cell[11,33] 0.083314048012889 [GeV] -Cell[11,34] 0.028485580657479 [GeV] -Cell[11,18] 0.0016443842649646 [GeV] -Cell[11,35] 0.0017115195159579 [GeV] -Cell[13,8] 0.00039027178139827 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.37047400957309 (GeV) +Cell[7,30] 0.0067239262322498 [GeV] +Cell[8,31] 0.18315647290142 [GeV] +Cell[10,9] 0.00046528528203421 [GeV] +Cell[8,30] 0.0024523983020168 [GeV] +Cell[12,14] 0.0016679143188702 [GeV] +### Total energy deposition in calorimeter by a source track in 5 cells : 0.19446599703659 (GeV) -Source track ID 8153 (gamma,0.136782797126[GeV]) at (-378.97239240907,-326.15935643753,68.392634019785) +Source track ID 9268 (pi-,0.42783198734913[GeV]) at (-476.70185129533,150.84874865773,-500.53380494578) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[10,29] 0.13440730643663 [GeV] -Cell[10,28] 0.0023754906893765 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.136782797126 (GeV) +Cell[8,9] 0.0050844914878149 [GeV] +Cell[7,8] 0.00010002992881073 [GeV] +Cell[6,41] 0.0010156005305822 [GeV] +Cell[8,46] 0.00011474468583037 [GeV] +Cell[9,9] 0.00077797190210845 [GeV] +Cell[9,10] 0.00023610467887477 [GeV] +Cell[7,7] 0.0010361468128322 [GeV] +Cell[9,8] 0.00023467891386099 [GeV] +Cell[8,28] 0.00097626120196102 [GeV] +Cell[7,6] 1.1173828213941e-05 [GeV] +Cell[6,25] 8.5950255652278e-08 [GeV] +Cell[4,47] 0.0008146200296294 [GeV] +Cell[4,46] 0.00016835686932973 [GeV] +Cell[8,39] 0.00026845192053463 [GeV] +Cell[7,27] 6.2850366989323e-05 [GeV] +Cell[7,5] 0.00097455523419737 [GeV] +Cell[6,8] 6.9780179564987e-05 [GeV] +Cell[7,29] 6.2822051962371e-05 [GeV] +Cell[9,7] 1.1228227509037e-05 [GeV] +Cell[8,24] 0.00054054073786244 [GeV] +Cell[8,38] 0.001247220116633 [GeV] +Cell[12,23] 3.2110515712588e-05 [GeV] +Cell[10,1] 4.3890330938439e-06 [GeV] +Cell[10,24] 8.0594693632065e-05 [GeV] +Cell[10,23] 0.0022556443216834 [GeV] +Cell[8,21] 0.0019434791672587 [GeV] +Cell[8,20] 5.1595956538222e-06 [GeV] +Cell[10,22] 0.00038808801137316 [GeV] +Cell[10,38] 0.0017404519920442 [GeV] +Cell[6,20] 0.027176022991786 [GeV] +Cell[7,21] 0.034036994375478 [GeV] +Cell[7,22] 0.017783045450068 [GeV] +Cell[3,2] 2.6372217311291e-05 [GeV] +Cell[3,3] 0.00015731612520722 [GeV] +Cell[3,4] 1.3338168675546e-05 [GeV] +Cell[3,5] 0.00083731153555379 [GeV] +Cell[3,6] 4.7667853868916e-07 [GeV] +Cell[6,7] 8.5318716010079e-06 [GeV] +Cell[10,0] 0.0016529999790976 [GeV] +Cell[8,19] 4.5972982320563e-08 [GeV] +Cell[7,19] 0.0011851045598393 [GeV] +Cell[7,18] 8.8190139267681e-05 [GeV] +Cell[7,20] 0.0014243941262451 [GeV] +Cell[6,21] 0.0012387205292486 [GeV] +Cell[7,23] 0.0027344174195073 [GeV] +Cell[8,23] 0.0015116913689057 [GeV] +Cell[10,40] 1.9233771968175e-07 [GeV] +Cell[10,39] 0.0012538304300251 [GeV] +Cell[11,37] 3.996919139172e-05 [GeV] +Cell[10,17] 1.2998231636629e-07 [GeV] +Cell[10,16] 1.386710209772e-09 [GeV] +Cell[6,35] 0.0022242484024464 [GeV] +Cell[6,34] 0.00026514485900589 [GeV] +Cell[3,13] 4.762179452382e-05 [GeV] +Cell[3,12] 4.5305673324947e-08 [GeV] +Cell[3,11] 3.2095726965053e-08 [GeV] +Cell[4,0] 0.00012575772046307 [GeV] +Cell[5,0] 1.8828411612049e-09 [GeV] +Cell[7,24] 0.00061054993678797 [GeV] +Cell[7,28] 0.0058948490563047 [GeV] +Cell[6,19] 0.001749883880381 [GeV] +Cell[0,36] 0.0009763061112219 [GeV] +Cell[2,7] 4.9486735610117e-05 [GeV] +Cell[1,14] 7.0903048908804e-06 [GeV] +Cell[2,14] 1.1268881382421e-05 [GeV] +Cell[2,15] 1.0008682002081e-05 [GeV] +Cell[5,42] 1.3520052307285e-05 [GeV] +Cell[5,44] 0.00067415613275617 [GeV] +Cell[2,6] 9.8984201593339e-05 [GeV] +Cell[6,22] 0.00072850628739037 [GeV] +Cell[7,4] 5.9182201803196e-06 [GeV] +Cell[4,26] 5.7808975398075e-06 [GeV] +Cell[4,3] 2.6783827988197e-05 [GeV] +Cell[5,3] 0.00026965262229669 [GeV] +Cell[5,4] 1.1656707472753e-05 [GeV] +Cell[4,4] 5.7190467214241e-07 [GeV] +Cell[4,2] 2.1449523046613e-11 [GeV] +Cell[3,9] 0.00069423573353505 [GeV] +Cell[5,17] 0.00037111112493192 [GeV] +Cell[8,47] 0.0012641377687116 [GeV] +Cell[9,46] 4.9156993782162e-09 [GeV] +Cell[8,0] 9.1295840205215e-05 [GeV] +Cell[9,0] 3.3097851452574e-05 [GeV] +Cell[17,2] 0.00028043906780173 [GeV] +Cell[15,19] 0.00073344690274166 [GeV] +Cell[16,19] 4.1244398175877e-07 [GeV] +Cell[16,20] 3.9063274925866e-10 [GeV] +Cell[10,2] 0.0021329913519582 [GeV] +Cell[10,21] 5.3349481425585e-05 [GeV] +Cell[5,37] 1.6274898312986e-05 [GeV] +Cell[5,38] 0.0012317695675704 [GeV] +Cell[5,39] 1.2505206642913e-05 [GeV] +Cell[8,22] 0.0015670550222659 [GeV] +Cell[10,46] 0.00049129907851568 [GeV] +Cell[10,45] 4.8448449945226e-07 [GeV] +Cell[10,44] 1.4992081105447e-09 [GeV] +Cell[0,35] 5.9321933182218e-05 [GeV] +Cell[0,38] 2.7462141675642e-05 [GeV] +Cell[0,37] 0.00075698658943497 [GeV] +Cell[6,23] 4.4147193545996e-07 [GeV] +Cell[10,11] 0.00023367544190137 [GeV] +Cell[11,11] 6.4332660531363e-07 [GeV] +Cell[11,10] 1.3995558049373e-07 [GeV] +Cell[9,16] 4.995746712666e-06 [GeV] +Cell[6,0] 0.00034052759079032 [GeV] +Cell[7,1] 4.0186128409232e-05 [GeV] +Cell[6,1] 2.8137668589352e-06 [GeV] +Cell[6,29] 9.104958039984e-06 [GeV] +Cell[6,28] 1.6289654088268e-06 [GeV] +Cell[4,5] 2.1991359826643e-06 [GeV] +Cell[6,45] 0.00011433474467594 [GeV] +Cell[6,44] 2.2715051018167e-06 [GeV] +Cell[7,44] 4.0395857649855e-07 [GeV] +Cell[3,28] 3.3147807698697e-09 [GeV] +Cell[7,25] 0.0037716525497448 [GeV] +Cell[8,25] 2.2436332415054e-08 [GeV] +### Total energy deposition in calorimeter by a source track in 116 cells : 0.13957728464002 (GeV) -Source track ID 8135 (pi+,0.39397794397207[GeV]) at (-476.34686233237,-151.96600523177,237.25146607108) +Source track ID 9269 (pi+,0.37371153034337[GeV]) at (-290.45436203653,-406.98435298418,-308.40793221837) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[11,23] 8.2819069999676e-05 [GeV] -Cell[11,24] 0.13815503489478 [GeV] -Cell[11,25] 0.082318033572637 [GeV] -Cell[11,26] 0.051627287778201 [GeV] -### Total energy deposition in calorimeter by a source track in 4 cells : 0.27218317531562 (GeV) +Cell[8,32] 0.072606839579973 [GeV] +Cell[8,31] 0.18982494740375 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.26243178698373 (GeV) -Source track ID 8136 (pi-,0.8955271573842[GeV]) at (-161.09417848287,-473.33779234171,404.9734035348) +Source track ID 9270 (pi-,0.35696371720811[GeV]) at (-395.23794120256,-306.24658338333,-299.85953626958) Original primary track ID 2 (unknown,2.8798399642419[GeV]) -Cell[10,10] 3.5596796124082e-09 [GeV] -Cell[12,34] 0.1350621806288 [GeV] -Cell[13,33] 0.0012480154063923 [GeV] -Cell[11,21] 3.0000986417008e-05 [GeV] -Cell[11,32] 4.5906075101811e-05 [GeV] -Cell[12,32] 0.017204916014367 [GeV] -Cell[13,32] 1.3435083258173e-07 [GeV] -Cell[12,31] 0.012826044499501 [GeV] -Cell[12,5] 9.7587122581899e-08 [GeV] -Cell[16,5] 2.6556028842606e-10 [GeV] -Cell[12,10] 4.4374265708029e-06 [GeV] -Cell[12,28] 8.5309864862211e-06 [GeV] -Cell[12,29] 0.00077804919467462 [GeV] -Cell[12,17] 0.0024585697517306 [GeV] -Cell[11,30] 9.6818256452025e-09 [GeV] -Cell[11,23] 7.560396916233e-07 [GeV] -Cell[11,22] 1.2542264303192e-06 [GeV] -Cell[12,11] 0.00053628571581992 [GeV] -Cell[11,10] 6.8451038259809e-10 [GeV] -Cell[12,6] 3.6699337157415e-06 [GeV] -Cell[10,5] 0.00073282807179983 [GeV] -Cell[10,9] 4.0774466469884e-11 [GeV] -Cell[11,33] 0.0012004126086341 [GeV] -Cell[11,34] 0.0030355213125257 [GeV] -Cell[11,18] 7.4286523158662e-08 [GeV] -Cell[11,35] 0.0012904880285093 [GeV] -Cell[12,33] 0.2995583345006 [GeV] -Cell[12,35] 0.0032950183942394 [GeV] -Cell[13,34] 0.00064789821649413 [GeV] -Cell[13,35] 1.3399278373072e-08 [GeV] -Cell[11,36] 6.6813697230828e-07 [GeV] -Cell[13,47] 6.8392838279124e-05 [GeV] -Cell[14,0] 1.1231228996849e-06 [GeV] -Cell[13,0] 7.7967534934942e-09 [GeV] -Cell[18,33] 1.4124845620245e-08 [GeV] -Cell[10,41] 0.00040608968811398 [GeV] -Cell[10,40] 0.0016099967660054 [GeV] -Cell[9,40] 3.2733078114688e-10 [GeV] -Cell[11,6] 3.5692355595529e-09 [GeV] -Cell[10,27] 5.1977694965899e-09 [GeV] -Cell[4,14] 1.5583959117066e-05 [GeV] -Cell[3,1] 0.0012711715032585 [GeV] -Cell[4,1] 7.428466123315e-05 [GeV] -Cell[12,12] 0.00015994039852033 [GeV] -Cell[12,9] 7.5597202430799e-05 [GeV] -Cell[11,9] 0.0027653040089783 [GeV] -Cell[13,10] 0.0016585355819634 [GeV] -Cell[14,12] 0.0038042358919802 [GeV] -Cell[15,13] 8.3989393811862e-05 [GeV] -Cell[16,3] 7.9079853039389e-05 [GeV] -Cell[16,4] 0.0010487244524986 [GeV] -Cell[14,18] 0.00033256873269098 [GeV] -Cell[12,30] 0.0017140356403187 [GeV] -Cell[16,1] 1.957693399163e-06 [GeV] -Cell[8,26] 1.7138356051873e-06 [GeV] -Cell[10,14] 9.8388309738766e-05 [GeV] -Cell[11,14] 2.8517242059252e-06 [GeV] -Cell[11,15] 5.4892450407351e-10 [GeV] -Cell[13,29] 0.00012843698237884 [GeV] -Cell[10,36] 0.00077916812343062 [GeV] -Cell[10,35] 8.9754712689682e-07 [GeV] -Cell[14,9] 0.0026850270322956 [GeV] -Cell[13,30] 7.5511944614846e-06 [GeV] -Cell[12,18] 5.4995985124151e-07 [GeV] -Cell[11,29] 4.7156269147308e-09 [GeV] -Cell[12,36] 1.9088488450052e-06 [GeV] -### Total energy deposition in calorimeter by a source track in 66 cells : 0.49884726123855 (GeV) +Cell[7,7] 1.1199522783727e-06 [GeV] +Cell[8,28] 0.24359802479476 [GeV] +Cell[7,6] 0.0049047887283062 [GeV] +Cell[7,5] 1.2508610325312e-10 [GeV] +Cell[8,32] 0.0027732791207338 [GeV] +Cell[9,38] 2.3639931225716e-07 [GeV] +Cell[8,33] 0.0013284300072916 [GeV] +Cell[8,31] 3.6624495596698e-05 [GeV] +Cell[8,30] 0.0010077135606061 [GeV] +Cell[12,14] 2.300555748775e-06 [GeV] +Cell[8,29] 0.0081518014499328 [GeV] +Cell[8,27] 0.002035786473829 [GeV] +Cell[9,27] 0.00028361040075595 [GeV] +Cell[9,26] 1.9327506801346e-05 [GeV] +Cell[1,13] 1.1758536595153e-05 [GeV] +Cell[1,20] 0.0010012217302975 [GeV] +Cell[0,20] 3.9167905924842e-08 [GeV] +Cell[9,29] 0.0021998785813554 [GeV] +Cell[9,30] 0.00010702584016292 [GeV] +Cell[8,34] 3.9027320869195e-05 [GeV] +Cell[9,32] 0.00010720669360978 [GeV] +Cell[9,31] 0.00031004007105173 [GeV] +Cell[9,34] 0.00095104770491787 [GeV] +Cell[12,13] 0.00098189214875765 [GeV] +Cell[9,33] 6.3679401068839e-07 [GeV] +Cell[11,4] 2.5796787522268e-06 [GeV] +Cell[9,39] 0.0001372105218237 [GeV] +Cell[9,40] 2.6647466002032e-06 [GeV] +### Total energy deposition in calorimeter by a source track in 28 cells : 0.26999527310775 (GeV) -Source track ID 8125 (gamma,0.032559394638405[GeV]) at (-498.6285167551,-37.008138005202,-1797.0004637238) +Source track ID 9272 (neutron,0.94192221262424[GeV]) at (302.98941135211,397.74038845521,-1247.3249652441) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[3,5] 0.00024816102093428 [GeV] +Cell[3,6] 0.0004445907691661 [GeV] +Cell[0,20] 2.9453658498824e-09 [GeV] +Cell[3,7] 3.6336462886538e-05 [GeV] +Cell[0,30] 1.3558867096435e-05 [GeV] +Cell[0,29] 3.1216477509588e-06 [GeV] +Cell[0,28] 0.0015912913097945 [GeV] +Cell[0,27] 1.971156714842e-05 [GeV] +Cell[0,19] 3.6275887396187e-09 [GeV] +### Total energy deposition in calorimeter by a source track in 9 cells : 0.0023567782177319 (GeV) + +Source track ID 9274 (gamma,0.0015732925727237[GeV]) at (269.1071483562,-421.40401363015,-786.66318936557) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[6,40] 0.0015732925727237 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0015732925727237 (GeV) + +Source track ID 9136 (gamma,0.37133215847831[GeV]) at (-133.93655991785,-481.72709900666,181.68248413552) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[10,32] 0.0015916437939687 [GeV] +Cell[10,1] 0.001185738621705 [GeV] +Cell[10,33] 0.24596422913244 [GeV] +Cell[10,34] 0.048599470277799 [GeV] +Cell[11,34] 0.013557016216029 [GeV] +Cell[11,33] 0.05864474448612 [GeV] +Cell[11,40] 0.0013698198005089 [GeV] +Cell[13,7] 0.00041949614973704 [GeV] +### Total energy deposition in calorimeter by a source track in 8 cells : 0.37133215847831 (GeV) + +Source track ID 9153 (gamma,0.01139578735168[GeV]) at (-378.53299639271,-326.66920675502,67.506751163836) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[10,29] 0.010267507605936 [GeV] +Cell[9,43] 0.00060266371971851 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.010870171325654 (GeV) + +Source track ID 9154 (gamma,0.00021492568368278[GeV]) at (227.43875032011,445.27700912222,142.15482994866) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[10,8] 0.00021492568368278 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00021492568368278 (GeV) + +Source track ID 9161 (gamma,0.00037506614877199[GeV]) at (-352.88780872234,354.21772182535,254.75979382503) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[11,17] 0.00037506614877199 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00037506614877199 (GeV) + +Source track ID 9164 (gamma,0.00016318467509648[GeV]) at (-26.067660078532,-499.32001471805,-0.35322809141366) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[9,35] 0.00016318467509648 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00016318467509648 (GeV) + +Source track ID 9167 (gamma,6.7563006848117e-05[GeV]) at (-370.90218461647,-335.30817086187,170.48930767087) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[10,29] 6.7563006848117e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 6.7563006848117e-05 (GeV) + +Source track ID 9171 (gamma,0.00010169236615044[GeV]) at (-363.13749153887,-343.70214174319,214.39648619313) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[11,29] 0.00010169236615044 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00010169236615044 (GeV) + +Source track ID 9172 (gamma,0.0073716910123341[GeV]) at (44.395582616753,-498.02513214106,238.71200535981) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[11,36] 0.0073716910123341 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0073716910123341 (GeV) + +Source track ID 9173 (gamma,0.00066653152541897[GeV]) at (51.198996893966,-497.37175504551,230.43792802058) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[11,36] 0.00066653152541897 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00066653152541897 (GeV) + +Source track ID 9176 (gamma,0.0030799415647092[GeV]) at (246.83426794978,-434.82507306467,303.83427869332) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[11,40] 0.0030799415647092 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0030799415647092 (GeV) + +Source track ID 9179 (gamma,0.00083162249273393[GeV]) at (-282.12294685692,-412.80339491914,326.79198043717) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[11,31] 0.00083162249273393 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00083162249273393 (GeV) + +Source track ID 9199 (gamma,0.00022410535560786[GeV]) at (21.690947195249,-499.52928123362,1084.5119515781) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[15,36] 0.00022410535560786 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00022410535560786 (GeV) + +Source track ID 9138 (e-,0.037016518770359[GeV]) at (-460.34210609495,-195.15415792665,1179.9984544083) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[15,27] 0.036505519860359 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.036505519860359 (GeV) + +Source track ID 9152 (gamma,0.00023406542709028[GeV]) at (488.29206539277,107.56792679264,24.552200621046) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[10,1] 0.00023406542709028 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00023406542709028 (GeV) + +Source track ID 9142 (gamma,0.00021041885458053[GeV]) at (499.01345564121,31.393806539117,69.073284849457) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[10,0] 0.00021041885458053 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00021041885458053 (GeV) + +Source track ID 9143 (gamma,0.0060416707009145[GeV]) at (377.84918538091,327.45991068677,-167.26140384381) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[8,10] 0.0016966596089984 [GeV] +Cell[9,5] 0.0043450110919161 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.0060416707009145 (GeV) + +Source track ID 9115 (pi+,0.39072990112858[GeV]) at (-475.84406433134,-153.53314443672,245.84029858129) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[10,27] 0.0011797035201223 [GeV] +Cell[10,28] 1.1052054787797e-08 [GeV] +Cell[7,27] 5.1693376690309e-09 [GeV] +Cell[11,25] 0.0037748956526597 [GeV] +Cell[9,38] 5.3250380733516e-06 [GeV] +Cell[11,29] 6.6356733441353e-12 [GeV] +Cell[10,25] 0.00027561907560651 [GeV] +Cell[10,2] 1.236119720852e-05 [GeV] +Cell[8,27] 0.0007718520700098 [GeV] +Cell[9,30] 0.00016957760631192 [GeV] +Cell[9,31] 0.00054966509908434 [GeV] +Cell[10,29] 5.7625584304333e-12 [GeV] +Cell[11,36] 2.4103513820592e-05 [GeV] +Cell[11,26] 0.097737117864053 [GeV] +Cell[13,38] 4.1024146485142e-06 [GeV] +Cell[11,35] 0.00012797540949441 [GeV] +Cell[8,26] 0.00027075142101842 [GeV] +Cell[7,26] 1.3242015484138e-10 [GeV] +Cell[10,26] 8.4659770224562e-05 [GeV] +Cell[9,2] 0.00035803181442748 [GeV] +Cell[9,3] 3.1783787107997e-08 [GeV] +Cell[11,27] 0.10973620258342 [GeV] +Cell[11,28] 1.5617070175722e-08 [GeV] +### Total energy deposition in calorimeter by a source track in 23 cells : 0.21508200781725 (GeV) + +Source track ID 9116 (pi-,0.89610430765776[GeV]) at (-156.71389837812,-474.80601729036,408.35365682855) +Original primary track ID 2 (unknown,2.8798399642419[GeV]) +Cell[12,39] 5.8349237394282e-05 [GeV] +Cell[11,25] 0.00061437527487283 [GeV] +Cell[13,31] 1.3320730204214e-07 [GeV] +Cell[11,31] 4.3249001780509e-05 [GeV] +Cell[11,32] 5.0179382379724e-05 [GeV] +Cell[12,32] 0.0049836621723479 [GeV] +Cell[13,32] 0.0022129027335301 [GeV] +Cell[12,31] 0.00065361305418139 [GeV] +Cell[10,31] 0.00020750050230527 [GeV] +Cell[12,23] 0.00032564789343326 [GeV] +Cell[12,26] 0.00026255807563507 [GeV] +Cell[12,28] 9.5663585067769e-05 [GeV] +Cell[12,29] 0.00092252171370922 [GeV] +Cell[12,27] 0.0022619498198243 [GeV] +Cell[11,30] 0.0012608398146422 [GeV] +Cell[12,15] 0.00023352005043353 [GeV] +Cell[11,23] 7.8962543047965e-06 [GeV] +Cell[13,22] 8.6697200971116e-05 [GeV] +Cell[11,37] 0.0013611661447188 [GeV] +Cell[17,2] 0.00024610621850627 [GeV] +Cell[9,29] 2.8474363264195e-06 [GeV] +Cell[11,34] 0.0010060270634827 [GeV] +Cell[11,33] 8.324813212198e-05 [GeV] +Cell[11,40] 7.4273454665672e-06 [GeV] +Cell[10,29] 0.0026532166945569 [GeV] +Cell[11,36] 0.0012417832678911 [GeV] +Cell[11,26] 0.00092485467134622 [GeV] +Cell[11,35] 6.9979545257979e-05 [GeV] +Cell[11,27] 0.00063202157740398 [GeV] +Cell[12,33] 0.4218712874284 [GeV] +Cell[12,34] 0.0065860316623226 [GeV] +Cell[12,35] 0.0090650916078219 [GeV] +Cell[11,39] 3.5506359208853e-05 [GeV] +Cell[12,38] 0.0011849452493065 [GeV] +Cell[9,25] 5.564790956214e-08 [GeV] +Cell[12,44] 0.0007363142561959 [GeV] +Cell[12,45] 0.00072834509137374 [GeV] +Cell[13,33] 0.003560129388137 [GeV] +Cell[13,34] 0.006251624649689 [GeV] +Cell[12,36] 0.0011542571529816 [GeV] +Cell[12,24] 0.00017957251795997 [GeV] +Cell[12,37] 0.0025737907448497 [GeV] +Cell[7,41] 0.0002707072752728 [GeV] +Cell[7,40] 0.00082875791901415 [GeV] +Cell[8,40] 0.00030881335073627 [GeV] +Cell[13,43] 6.6766066040145e-05 [GeV] +Cell[13,44] 0.0044701341829678 [GeV] +Cell[14,3] 3.7565815437119e-06 [GeV] +Cell[14,2] 0.00078471379510358 [GeV] +Cell[14,1] 9.443492628634e-06 [GeV] +Cell[13,16] 8.295259491922e-05 [GeV] +Cell[15,2] 0.00091792713174709 [GeV] +Cell[15,1] 4.2334431782365e-10 [GeV] +Cell[12,30] 0.00043698635229929 [GeV] +Cell[17,1] 0.0027965031089224 [GeV] +Cell[17,24] 0.00052867673509159 [GeV] +Cell[17,0] 7.2576419825054e-08 [GeV] +Cell[18,24] 1.3168793375371e-05 [GeV] +Cell[14,40] 0.00048143123920011 [GeV] +Cell[15,40] 7.1202652219426e-06 [GeV] +Cell[14,41] 9.3725507821091e-05 [GeV] +Cell[15,41] 1.138152040312e-06 [GeV] +Cell[10,18] 3.3308169804513e-09 [GeV] +Cell[10,30] 0.0013007495122202 [GeV] +Cell[13,35] 0.00034387819696803 [GeV] +Cell[13,36] 3.7346114822867e-10 [GeV] +Cell[14,33] 7.9446509320178e-06 [GeV] +Cell[16,22] 5.0363770723152e-06 [GeV] +Cell[16,21] 4.2390560224703e-08 [GeV] +Cell[11,38] 0.0028331012225402 [GeV] +Cell[19,7] 7.2196687397081e-06 [GeV] +Cell[15,12] 4.7042866994161e-05 [GeV] +Cell[14,16] 0.00077733516026456 [GeV] +Cell[14,17] 6.8491489830194e-05 [GeV] +Cell[13,17] 5.2836154121906e-05 [GeV] +Cell[13,15] 0.0024112066655504 [GeV] +### Total energy deposition in calorimeter by a source track in 76 cells : 0.49639457243113 (GeV) + +Source track ID 9105 (gamma,0.032559394638405[GeV]) at (-498.62850540333,-37.008290952667,-1796.9963141463) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[0,24] 0.031227448972347 [GeV] -Cell[0,25] 0.00070528115340421 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.031932730125751 (GeV) +Cell[3,12] 0.00051099891 [GeV] +Cell[5,37] 0.00062952340707053 [GeV] +Cell[0,24] 0.0285165782632 [GeV] +Cell[4,36] 0.0011024984080998 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.03075959898837 (GeV) -Source track ID 8094 (pi+,0.77707134447034[GeV]) at (-481.00086991852,136.52165812655,-1806.9929489366) +Source track ID 9087 (pi+,0.77713438708341[GeV]) at (-481.3056745241,135.44315291258,-1799.1405725184) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[0,21] 0.18070663671822 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.18070663671822 (GeV) +Cell[0,20] 0.0013878383058018 [GeV] +Cell[1,21] 0.00086748323114912 [GeV] +Cell[0,21] 0.29745067441395 [GeV] +Cell[0,22] 0.011165309584996 [GeV] +Cell[0,23] 5.4186315013794e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 5 cells : 0.31092549185092 (GeV) -Source track ID 8091 (gamma,1.9015972345341[GeV]) at (-363.22356462855,343.61117865769,-955.17208973951) +Source track ID 9084 (gamma,1.9015972345341[GeV]) at (-363.22356462864,343.6111786576,-955.17208968166) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[7,8] 0.0066220739069065 [GeV] -Cell[6,10] 0.0003017809733348 [GeV] -Cell[7,39] 0.00093095152288825 [GeV] -Cell[6,13] 0.00026011745198873 [GeV] -Cell[1,34] 0.0048224189050486 [GeV] -Cell[7,2] 0.0021938040547454 [GeV] -Cell[4,8] 0.00079394400562126 [GeV] -Cell[6,1] 0.0012269254142474 [GeV] -Cell[7,31] 0.0010909250317777 [GeV] -Cell[10,27] 7.8398595992884e-05 [GeV] -Cell[5,18] 1.0923148709396 [GeV] -Cell[6,5] 0.00049018458737711 [GeV] -Cell[4,18] 0.67378505961984 [GeV] -Cell[4,17] 0.0566183874123 [GeV] -Cell[7,44] 0.00051099891 [GeV] -Cell[5,17] 0.019179365214997 [GeV] -Cell[4,19] 0.0029603841487378 [GeV] -Cell[5,19] 0.0025866566509448 [GeV] -Cell[5,22] 0.0014179613983543 [GeV] -Cell[4,22] 0.0023639830524083 [GeV] -Cell[3,39] 0.00029630287281089 [GeV] -Cell[3,10] 0.0009921705741547 [GeV] -Cell[3,11] 0.00015232704386448 [GeV] -Cell[1,35] 0.011179188832503 [GeV] -Cell[1,22] 0.00099660384683663 [GeV] -Cell[2,38] 0.00037913738162213 [GeV] -Cell[3,42] 0.0022609973806049 [GeV] -Cell[5,20] 0.00059605351676479 [GeV] -Cell[4,16] 0.00053529980853945 [GeV] -Cell[3,43] 0.00031745142276762 [GeV] -Cell[3,37] 0.0013189088215705 [GeV] -Cell[5,44] 0.00043437404380005 [GeV] -### Total energy deposition in calorimeter by a source track in 32 cells : 1.890008007343 (GeV) +Cell[4,42] 0.00041406552211348 [GeV] +Cell[5,18] 1.0584493419005 [GeV] +Cell[4,9] 0.0010459907226613 [GeV] +Cell[4,45] 0.001046433725877 [GeV] +Cell[3,3] 0.0042059354959554 [GeV] +Cell[7,24] 0.0012145578848686 [GeV] +Cell[4,26] 0.00052429430394723 [GeV] +Cell[5,17] 0.028781491428073 [GeV] +Cell[4,5] 0.0019925254079074 [GeV] +Cell[0,27] 0.00088372689556612 [GeV] +Cell[5,11] 0.00027259112959077 [GeV] +Cell[4,11] 0.00046927646152985 [GeV] +Cell[6,31] 0.00054311614103906 [GeV] +Cell[4,18] 0.69033482380694 [GeV] +Cell[4,19] 0.003002572581643 [GeV] +Cell[5,19] 0.0052406554000483 [GeV] +Cell[4,17] 0.093823416960695 [GeV] +Cell[4,16] 0.0038419609350673 [GeV] +Cell[4,25] 0.00056019700805307 [GeV] +Cell[1,45] 0.0005064803368802 [GeV] +Cell[5,43] 0.00035956662141815 [GeV] +Cell[5,16] 0.00024623671682686 [GeV] +Cell[4,10] 0.00055661617553181 [GeV] +Cell[1,27] 0.00017221092391747 [GeV] +Cell[2,35] 0.0015563785197641 [GeV] +Cell[1,46] 0.00052446473036758 [GeV] +### Total energy deposition in calorimeter by a source track in 26 cells : 1.9005689277368 (GeV) -Source track ID 8077 (e-,0.00056861558678491[GeV]) at (-387.40940065493,316.0916896791,-1686.7243470931) +Source track ID 9062 (pi-,4.4332436436323[GeV]) at (-407.28601073277,290.03121463281,-1898.4733377946) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[1,18] 2.3068239475541e-06 [GeV] -Cell[1,19] 4.1006717331917e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 4.3313541279471e-05 (GeV) +Cell[0,19] 0.14110754135972 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.14110754135972 (GeV) -Source track ID 8081 (e-,0.00054541538399885[GeV]) at (-407.07711921644,290.3243341686,-1890.9782160084) +Source track ID 9056 (gamma,3.1562433463089e-06[GeV]) at (-461.452510803,192.51384436867,-1348.8013622747) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[0,19] 3.1066761985545e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 3.1066761985545e-05 (GeV) +Cell[3,20] 3.1562433463089e-06 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 3.1562433463089e-06 (GeV) -Source track ID 8059 (pi-,4.4331318487452[GeV]) at (-407.16435409337,290.20197924157,-1898.5467779436) +Source track ID 9043 (e-,0.00057964307315046[GeV]) at (-462.73808435161,189.40291785135,-1319.7300493708) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[0,19] 0.15423947847164 [GeV] -Cell[0,9] 0.0012989757200406 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.15553845419168 (GeV) +Cell[3,21] 6.8644163150459e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 6.8644163150459e-05 (GeV) -Source track ID 8020 (pi+,1.2125625304778[GeV]) at (-419.40021806971,272.21950165828,-1950.5581791826) +Source track ID 9014 (pi+,1.2124140433534[GeV]) at (-427.93396130718,258.59722496567,-1940.7947378075) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[7,8] 4.0228877332993e-07 [GeV] -Cell[6,12] 1.2143791536801e-09 [GeV] -Cell[5,42] 8.9121265122003e-06 [GeV] -Cell[9,36] 3.230401489418e-07 [GeV] -Cell[6,13] 6.2053115439085e-06 [GeV] -Cell[1,44] 0.0005460096988711 [GeV] -Cell[1,45] 0.0005417062291607 [GeV] -Cell[3,27] 0.00028993754277678 [GeV] -Cell[0,21] 0.015733964559559 [GeV] -Cell[1,22] 0.00013158077279729 [GeV] -Cell[1,19] 2.6366335355306e-06 [GeV] -Cell[0,19] 0.089546162804955 [GeV] -Cell[0,18] 0.041049340906686 [GeV] -Cell[1,26] 0.00030251342437805 [GeV] -Cell[1,25] 0.00052456107925991 [GeV] -Cell[1,24] 0.00021872441119535 [GeV] -Cell[2,25] 3.1249463179847e-05 [GeV] -Cell[1,43] 0.0050872536986188 [GeV] -Cell[1,42] 0.00037500453513158 [GeV] -Cell[2,43] 0.0006091266318376 [GeV] -Cell[1,7] 0.0030934067690117 [GeV] -Cell[3,31] 0.0017847195021272 [GeV] -Cell[3,28] 1.3241769513115e-05 [GeV] -Cell[4,28] 0.00012723848371525 [GeV] -Cell[3,23] 8.7263179011643e-08 [GeV] -Cell[0,1] 4.507968317057e-06 [GeV] -Cell[2,3] 0.0011447730328995 [GeV] -Cell[1,13] 0.0088106862307034 [GeV] -Cell[1,12] 0.00012890007120734 [GeV] -Cell[1,14] 0.00097754708710374 [GeV] -Cell[2,15] 1.6252587287454e-05 [GeV] -Cell[3,15] 0.00027865069269853 [GeV] -Cell[4,31] 6.4629125184183e-05 [GeV] -Cell[19,36] 3.203256521374e-06 [GeV] -Cell[18,36] 6.0273424883007e-05 [GeV] -Cell[19,10] 1.9869265088346e-06 [GeV] -Cell[0,20] 0.0038337984529891 [GeV] -Cell[3,5] 1.4763332263101e-05 [GeV] -Cell[1,46] 0.00054829304806867 [GeV] -Cell[1,47] 8.0701323749963e-06 [GeV] -Cell[1,21] 5.3380611949137e-05 [GeV] -Cell[0,22] 0.0024988124296931 [GeV] -Cell[1,23] 8.3119734506454e-07 [GeV] -Cell[0,23] 0.0024640483797141 [GeV] -Cell[1,1] 3.1578078051098e-07 [GeV] -Cell[0,2] 9.003103472196e-07 [GeV] -Cell[1,20] 0.00076157014832252 [GeV] -### Total energy deposition in calorimeter by a source track in 47 cells : 0.18170050438801 (GeV) +Cell[7,6] 0.00014988768121111 [GeV] +Cell[4,29] 1.2581085728016e-05 [GeV] +Cell[6,26] 2.0748702809215e-09 [GeV] +Cell[4,42] 3.0584996920879e-08 [GeV] +Cell[6,6] 0.0034299942800691 [GeV] +Cell[7,47] 4.8444070034748e-07 [GeV] +Cell[3,6] 0.0032684191137173 [GeV] +Cell[6,7] 5.807108638794e-05 [GeV] +Cell[7,19] 6.7823560646502e-05 [GeV] +Cell[2,7] 0.0032607191662965 [GeV] +Cell[2,15] 4.9822567903902e-05 [GeV] +Cell[5,42] 0.00033692765674977 [GeV] +Cell[2,6] 0.0020570204794459 [GeV] +Cell[7,4] 2.188407812946e-05 [GeV] +Cell[0,37] 1.0831785039045e-07 [GeV] +Cell[3,28] 0.00078235711473803 [GeV] +Cell[1,20] 0.0010566028488076 [GeV] +Cell[0,20] 0.040292951017169 [GeV] +Cell[3,7] 0.0021280698886834 [GeV] +Cell[0,30] 0.0013090026593522 [GeV] +Cell[0,19] 0.3610625306086 [GeV] +Cell[9,35] 8.7762047769502e-08 [GeV] +Cell[9,2] 2.1992212418809e-06 [GeV] +Cell[1,21] 0.0020848504412034 [GeV] +Cell[0,21] 0.00083232849661533 [GeV] +Cell[4,19] 8.1538769154577e-05 [GeV] +Cell[2,35] 0.0013254027053905 [GeV] +Cell[0,18] 0.0027240246279412 [GeV] +Cell[2,34] 8.8126797345467e-07 [GeV] +Cell[3,47] 4.7959348303266e-06 [GeV] +Cell[0,4] 0.00084900441999563 [GeV] +Cell[2,1] 4.7392003849382e-05 [GeV] +Cell[4,31] 4.3492939206772e-05 [GeV] +Cell[4,30] 0.002130706820408 [GeV] +Cell[5,28] 0.00034605033328933 [GeV] +Cell[5,29] 0.00021403840427433 [GeV] +Cell[0,6] 0.0016262940904511 [GeV] +Cell[0,5] 0.00081614780836969 [GeV] +Cell[0,7] 9.1003424313385e-06 [GeV] +Cell[0,8] 0.00089147899325189 [GeV] +Cell[1,6] 0.00063044175580944 [GeV] +Cell[3,43] 0.00040204360365874 [GeV] +Cell[3,42] 0.00016745464553651 [GeV] +Cell[4,43] 8.0607501331542e-08 [GeV] +Cell[3,41] 9.3714334070683e-12 [GeV] +Cell[0,47] 0.0016150315611986 [GeV] +Cell[7,3] 0.00064273889479762 [GeV] +Cell[8,3] 0.016202886671 [GeV] +Cell[7,2] 0.0019347437625381 [GeV] +Cell[8,2] 0.0026082317655937 [GeV] +Cell[8,4] 0.0022274576021744 [GeV] +Cell[8,5] 5.637403082801e-06 [GeV] +Cell[7,0] 0.00058723175233217 [GeV] +Cell[10,36] 5.7483390841526e-05 [GeV] +Cell[10,35] 2.055193472188e-07 [GeV] +Cell[10,15] 1.2421669089235e-07 [GeV] +Cell[9,42] 2.159409923479e-07 [GeV] +Cell[15,21] 5.6765129556879e-08 [GeV] +Cell[15,23] 1.1736241867766e-07 [GeV] +Cell[13,13] 1.0745643558039e-06 [GeV] +Cell[13,14] 5.234806953581e-06 [GeV] +Cell[1,40] 0.0012590225319455 [GeV] +Cell[0,3] 0.0013420654491111 [GeV] +Cell[1,4] 1.3284801525515e-09 [GeV] +Cell[2,8] 1.1248277733102e-05 [GeV] +Cell[3,29] 0.00051050301746045 [GeV] +Cell[3,30] 1.896649422406e-07 [GeV] +Cell[0,31] 0.00011326974622398 [GeV] +Cell[1,34] 0.0011809927679623 [GeV] +Cell[3,8] 0.0011465155781185 [GeV] +Cell[4,34] 2.2038002498448e-09 [GeV] +Cell[1,0] 0.0034959995972678 [GeV] +Cell[1,1] 6.8958747433498e-06 [GeV] +Cell[1,47] 0.00074177182455423 [GeV] +Cell[0,10] 3.8097424258012e-06 [GeV] +Cell[0,46] 1.669198254092e-05 [GeV] +Cell[0,0] 9.5828778512441e-09 [GeV] +Cell[1,22] 0.0026984573278194 [GeV] +### Total energy deposition in calorimeter by a source track in 78 cells : 0.47299104479331 (GeV) -Source track ID 8021 (anti_proton,5.3584437160492[GeV]) at (-482.20338833237,132.21154367446,-1699.6423113394) +Source track ID 9015 (anti_proton,5.3584526511398[GeV]) at (-481.19174420749,135.84736032236,-1700.3865575391) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[8,9] 0.00015994134897842 [GeV] -Cell[8,45] 5.4768444679212e-06 [GeV] -Cell[7,10] 0.006602478747838 [GeV] -Cell[4,45] 0.0017167513903681 [GeV] -Cell[4,37] 6.1885151797696e-05 [GeV] -Cell[8,1] 0.00228316257065 [GeV] -Cell[8,5] 0.00029522020471632 [GeV] -Cell[7,7] 0.00026901675697127 [GeV] -Cell[7,6] 0.00018345711834081 [GeV] -Cell[6,10] 1.4522531098919e-05 [GeV] -Cell[6,9] 1.3645384664414e-05 [GeV] -Cell[6,25] 9.5727552206881e-08 [GeV] -Cell[5,26] 8.648736898067e-07 [GeV] -Cell[6,7] 0.00015279222937352 [GeV] -Cell[2,47] 0.0014429568195784 [GeV] -Cell[5,32] 2.711664501112e-05 [GeV] -Cell[0,27] 0.00068528806676556 [GeV] -Cell[7,35] 0.0019123001117791 [GeV] -Cell[5,41] 0.00028162137954712 [GeV] -Cell[8,22] 0.00067982461722011 [GeV] -Cell[8,23] 8.265465710565e-05 [GeV] -Cell[8,2] 0.0024517917401429 [GeV] -Cell[5,42] 1.6626274828013e-09 [GeV] -Cell[7,30] 7.753728215107e-06 [GeV] -Cell[8,43] 3.8233278019106e-09 [GeV] -Cell[18,6] 3.744731657207e-09 [GeV] -Cell[5,0] 0.0047745105757579 [GeV] -Cell[5,47] 3.356871282449e-06 [GeV] -Cell[4,32] 0.00049859125886996 [GeV] -Cell[14,35] 1.2176591233583e-05 [GeV] -Cell[12,21] 0.0011987783463189 [GeV] -Cell[9,43] 0.00067357968804208 [GeV] -Cell[10,43] 0.00028609862461303 [GeV] -Cell[8,3] 4.9456674219073e-08 [GeV] -Cell[4,26] 5.0115543749598e-06 [GeV] -Cell[3,26] 0.00048877000850518 [GeV] -Cell[9,1] 0.00040389458598133 [GeV] -Cell[2,12] 0.00047035726423769 [GeV] -Cell[0,40] 0.00014136287483279 [GeV] -Cell[0,39] 0.0028861249468699 [GeV] -Cell[1,44] 0.00019218000506783 [GeV] -Cell[0,44] 1.7210802102113e-05 [GeV] -Cell[1,45] 1.746229827404e-12 [GeV] -Cell[13,18] 1.665896744214e-05 [GeV] -Cell[8,42] 0.00018890905433909 [GeV] -Cell[7,43] 3.9010717341625e-07 [GeV] -Cell[4,8] 0.0039374731349373 [GeV] -Cell[3,27] 2.6258868369041e-05 [GeV] -Cell[5,1] 0.0011331517893796 [GeV] -Cell[6,2] 4.7774842948911e-07 [GeV] -Cell[6,3] 0.00023976411406261 [GeV] -Cell[6,4] 6.1468058447645e-09 [GeV] -Cell[4,4] 0.00014987174806799 [GeV] -Cell[7,29] 0.00042273093457482 [GeV] -Cell[6,11] 2.832909495919e-05 [GeV] -Cell[5,27] 0.00049674472121876 [GeV] -Cell[8,0] 0.00085707968288511 [GeV] -Cell[13,47] 4.1017414478119e-06 [GeV] -Cell[4,1] 2.2846937645227e-07 [GeV] -Cell[16,1] 3.2099300879054e-06 [GeV] -Cell[11,14] 4.9157858011313e-06 [GeV] -Cell[0,24] 0.0062225319130313 [GeV] -Cell[0,25] 0.0016490863233272 [GeV] -Cell[0,21] 0.062370300888368 [GeV] -Cell[5,18] 0.001424838921242 [GeV] -Cell[6,5] 1.4686161390273e-05 [GeV] -Cell[4,18] 0.0010274717564673 [GeV] -Cell[5,17] 2.0096598513192e-05 [GeV] -Cell[4,19] 6.4484359692187e-06 [GeV] -Cell[5,19] 7.4943096806237e-06 [GeV] -Cell[3,39] 0.0004345719782541 [GeV] -Cell[3,10] 0.00019387757407924 [GeV] -Cell[3,11] 0.00099706079024338 [GeV] -Cell[1,22] 0.60414268709644 [GeV] -Cell[2,38] 0.033277991993018 [GeV] -Cell[3,42] 0.00077787155424994 [GeV] -Cell[3,37] 0.0013486260126401 [GeV] -Cell[1,18] 0.0037576071218521 [GeV] -Cell[1,19] 0.010329066138589 [GeV] -Cell[0,19] 0.0096726942612252 [GeV] -Cell[0,9] 0.0029006638267517 [GeV] -Cell[0,18] 0.0042843774925716 [GeV] -Cell[1,26] 0.0014866591964101 [GeV] -Cell[1,25] 0.0022570524960372 [GeV] -Cell[1,24] 0.024013413419925 [GeV] -Cell[2,25] 0.0056814411455371 [GeV] -Cell[1,43] 5.8259594079573e-06 [GeV] -Cell[1,42] 4.7567300498486e-10 [GeV] -Cell[2,43] 0.00089564453387644 [GeV] -Cell[3,23] 1.2395321391523e-10 [GeV] -Cell[0,1] 0.00090776059306784 [GeV] -Cell[2,3] 0.0013011273540945 [GeV] -Cell[1,13] 0.0022402841339144 [GeV] -Cell[1,12] 0.0037055466503167 [GeV] -Cell[1,14] 0.00032794977375306 [GeV] -Cell[2,15] 0.0053140068422064 [GeV] -Cell[4,31] 0.00012954730474632 [GeV] -Cell[0,20] 0.016748056350739 [GeV] -Cell[3,5] 0.0034550105888626 [GeV] -Cell[1,46] 7.9049947316889e-09 [GeV] -Cell[1,21] 1.5774035207385 [GeV] -Cell[0,22] 0.62110261890331 [GeV] -Cell[1,23] 0.10134392169892 [GeV] -Cell[0,23] 0.015270109126259 [GeV] -Cell[1,1] 0.22759350223175 [GeV] -Cell[0,2] 8.4525384590961e-06 [GeV] -Cell[1,20] 0.039016848511354 [GeV] -Cell[2,13] 0.0005928109542424 [GeV] -Cell[1,5] 0.0089017391118406 [GeV] -Cell[0,6] 0.00066884951494183 [GeV] -Cell[0,5] 8.286727941595e-06 [GeV] -Cell[4,5] 0.0023955710329098 [GeV] -Cell[4,6] 0.00040105601253171 [GeV] -Cell[3,4] 0.00025906533717455 [GeV] -Cell[3,6] 0.0017058332848248 [GeV] -Cell[2,22] 0.075764232020968 [GeV] -Cell[2,21] 0.0030842887403473 [GeV] -Cell[4,0] 6.6811625943956e-05 [GeV] -Cell[0,32] 2.065385109745e-06 [GeV] -Cell[1,3] 0.0014160480577701 [GeV] -Cell[15,15] 4.2515727067439e-05 [GeV] -Cell[15,16] 0.0048906189549196 [GeV] -Cell[16,16] 1.449630376294e-05 [GeV] -Cell[16,15] 6.2411709222943e-09 [GeV] -Cell[15,4] 1.2600733498402e-08 [GeV] -Cell[15,3] 1.9965027548778e-06 [GeV] -Cell[0,8] 0.0099287756753954 [GeV] -Cell[0,10] 1.1922395415809e-05 [GeV] -Cell[17,46] 0.00053128251269466 [GeV] -Cell[2,26] 3.7958206376061e-06 [GeV] -Cell[9,41] 0.00092530874938996 [GeV] -Cell[9,44] 0.010261375645585 [GeV] -Cell[10,44] 0.00041131807741629 [GeV] -Cell[9,45] 8.2830008177552e-06 [GeV] -Cell[0,16] 8.2291255239397e-07 [GeV] -Cell[0,17] 7.4288779716198e-06 [GeV] -Cell[0,11] 2.0469634910114e-07 [GeV] -Cell[1,4] 0.00013529793775024 [GeV] -Cell[0,4] 0.0013459513533923 [GeV] -Cell[16,0] 0.0086331536937258 [GeV] -Cell[19,16] 2.7857022359967e-09 [GeV] -Cell[17,23] 2.055038450635e-05 [GeV] -Cell[17,24] 0.0026601554411313 [GeV] -Cell[19,46] 1.5509751392528e-08 [GeV] -Cell[19,19] 0.0028917271270021 [GeV] -Cell[19,20] 1.5138642197599e-08 [GeV] -Cell[14,36] 1.1421643634094e-05 [GeV] -Cell[13,20] 0.00014450985918631 [GeV] -Cell[13,21] 0.00058272914845691 [GeV] -Cell[14,20] 0.00024797570874318 [GeV] -Cell[14,21] 0.002223055958002 [GeV] -Cell[16,47] 0.00094516812373956 [GeV] -Cell[17,47] 0.00077845368293754 [GeV] -Cell[17,0] 4.0808270568959e-06 [GeV] -Cell[14,24] 1.1735212081021e-07 [GeV] -Cell[14,25] 8.0254810427505e-08 [GeV] -Cell[4,43] 0.00069065144075774 [GeV] -Cell[3,38] 0.10591738555243 [GeV] -Cell[4,47] 0.0018282118508317 [GeV] -Cell[4,46] 2.1628768422488e-07 [GeV] -Cell[3,0] 0.01275479147611 [GeV] -Cell[2,14] 0.0011010248663584 [GeV] -Cell[1,15] 0.0053831409609307 [GeV] -Cell[0,15] 0.00022479481996982 [GeV] -Cell[0,14] 0.00060142625679961 [GeV] -Cell[2,19] 0.0065356615427593 [GeV] -Cell[2,20] 0.0076374399716259 [GeV] -Cell[0,41] 3.8821187531994e-05 [GeV] -Cell[2,44] 1.2326341675362e-05 [GeV] -Cell[4,27] 3.4504327821878e-06 [GeV] -Cell[3,20] 4.8968203638651e-05 [GeV] -Cell[4,7] 3.1066590416685e-05 [GeV] -Cell[3,22] 0.0061120275947401 [GeV] -Cell[3,21] 0.00011063303079743 [GeV] -Cell[2,5] 0.00022077355147837 [GeV] -Cell[2,4] 1.6114157390234e-05 [GeV] -Cell[2,23] 0.01395810538844 [GeV] -Cell[0,38] 2.6813898701221e-05 [GeV] -Cell[5,34] 3.995228864369e-05 [GeV] -Cell[4,34] 4.4415133888833e-05 [GeV] -Cell[4,33] 0.00071076879332804 [GeV] -Cell[2,9] 0.0017260761189267 [GeV] -Cell[2,8] 0.0011218410810936 [GeV] -Cell[2,7] 1.8085647028556e-06 [GeV] -Cell[13,19] 9.9555394740491e-08 [GeV] -Cell[0,29] 0.0030653989830964 [GeV] -Cell[4,40] 0.0027186393869283 [GeV] -Cell[2,34] 0.00022925375595696 [GeV] -Cell[2,31] 0.000337589670998 [GeV] -Cell[2,32] 0.00070646051473693 [GeV] -Cell[2,35] 0.0024330992558802 [GeV] -Cell[3,45] 0.00034997053863267 [GeV] -Cell[2,45] 0.0013086400514335 [GeV] -Cell[2,18] 0.00051197758324656 [GeV] -Cell[1,0] 0.0096678187747505 [GeV] -Cell[2,24] 0.0053323409138574 [GeV] -Cell[2,28] 2.1913930831943e-06 [GeV] -Cell[3,7] 0.00013293589799753 [GeV] -Cell[8,4] 0.00028290335007659 [GeV] -Cell[1,38] 0.0054308058427575 [GeV] -Cell[1,39] 0.0036134042616287 [GeV] -Cell[1,40] 4.6140478343546e-05 [GeV] -Cell[2,39] 0.0014803558460297 [GeV] -Cell[2,36] 2.578951214673e-06 [GeV] -Cell[4,38] 8.4513945102344e-05 [GeV] -Cell[7,36] 0.097843193290227 [GeV] -Cell[5,9] 0.0007942754076629 [GeV] -Cell[1,11] 0.013272789599096 [GeV] -Cell[0,12] 0.0056467753207898 [GeV] -Cell[1,16] 0.0017348112468851 [GeV] -Cell[1,10] 0.0085644027383699 [GeV] -Cell[2,16] 2.8615819406696e-05 [GeV] -Cell[6,42] 1.7771353275748e-05 [GeV] -Cell[3,30] 0.00076017779104067 [GeV] -Cell[4,35] 8.2305351388641e-06 [GeV] -Cell[5,31] 0.0011034924017232 [GeV] -Cell[5,30] 2.3053751123371e-05 [GeV] -Cell[0,34] 0.00055290051981206 [GeV] -Cell[0,33] 0.00024927012754415 [GeV] -Cell[1,6] 0.0011885187552053 [GeV] -Cell[2,6] 0.00036390034434305 [GeV] -Cell[0,37] 0.0016750001989412 [GeV] -Cell[4,12] 0.0027722419494548 [GeV] -Cell[4,13] 0.00066850903656065 [GeV] -Cell[6,6] 0.0013960965836398 [GeV] -Cell[1,9] 0.0044888726053369 [GeV] -Cell[2,11] 2.6671272623958e-05 [GeV] -Cell[2,10] 5.6476632571503e-05 [GeV] -Cell[1,8] 0.00040853667947647 [GeV] -Cell[2,42] 2.9249015530013e-06 [GeV] -Cell[3,41] 2.8656457823217e-07 [GeV] -Cell[3,40] 2.8771079200851e-08 [GeV] -Cell[2,40] 2.6484485715628e-11 [GeV] -Cell[2,41] 2.6988379886461e-09 [GeV] -Cell[6,36] 0.00054129827579831 [GeV] -Cell[0,28] 0.00014112902400935 [GeV] -Cell[0,46] 6.2174169920581e-06 [GeV] -Cell[0,45] 9.0544490376487e-08 [GeV] -Cell[0,26] 0.014525601006733 [GeV] -Cell[7,16] 0.0025357928790802 [GeV] -Cell[7,21] 0.00022846931210962 [GeV] -Cell[4,36] 0.0015314115556347 [GeV] -Cell[15,44] 0.004173892681136 [GeV] -Cell[16,43] 0.0053000476710234 [GeV] -Cell[16,44] 0.00022757594596341 [GeV] -Cell[15,43] 0.00074158712969539 [GeV] -Cell[16,42] 0.00093188085327701 [GeV] -Cell[0,0] 0.014092954348481 [GeV] -Cell[6,29] 0.0020092527261691 [GeV] -Cell[6,28] 1.6556279850192e-05 [GeV] -Cell[6,27] 4.4635568559897e-05 [GeV] -Cell[6,26] 0.0005521304163899 [GeV] -Cell[1,32] 0.0012701058713646 [GeV] -Cell[3,36] 3.5783720524705e-05 [GeV] -Cell[1,36] 3.1916982843541e-06 [GeV] -Cell[2,37] 1.8960878776852e-05 [GeV] -Cell[13,45] 2.5194385962095e-06 [GeV] -Cell[0,42] 4.0213118635393e-06 [GeV] -### Total energy deposition in calorimeter by a source track in 258 cells : 3.9741113873611 (GeV) +Cell[1,21] 0.13308768615356 [GeV] +Cell[0,21] 0.15745459576597 [GeV] +Cell[0,22] 0.0012343939278952 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.29177667584743 (GeV) -Source track ID 8016 (gamma,0.3844820986824[GeV]) at (-412.11223063409,283.13161137851,-1144.9216103029) +Source track ID 9010 (gamma,0.3844820986824[GeV]) at (-401.29816182548,298.26127022375,-1212.397680683) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[7,10] 0.00019824681660946 [GeV] -Cell[8,31] 0.0006855842354676 [GeV] -Cell[3,13] 0.0018320239067459 [GeV] -Cell[8,0] 0.0004977951054192 [GeV] -Cell[4,18] 0.0016944173185703 [GeV] -Cell[4,19] 0.32141349659856 [GeV] -Cell[3,37] 0.00051099891 [GeV] -Cell[2,25] 0.00066163299286291 [GeV] -Cell[2,43] 0.00051099891 [GeV] -Cell[0,5] 0.00040642182106672 [GeV] -Cell[1,15] 0.0022246261782259 [GeV] -Cell[3,20] 0.0023303030985421 [GeV] -Cell[3,21] 0.0058824954443197 [GeV] -Cell[2,9] 0.00022654624952997 [GeV] -Cell[1,11] 0.00031868921701675 [GeV] -Cell[1,6] 0.00014317268609983 [GeV] -Cell[1,9] 0.00051099891 [GeV] -Cell[2,11] 0.0055383372218163 [GeV] -Cell[2,10] 0.0004299579149711 [GeV] -Cell[2,41] 0.0019351890914786 [GeV] -Cell[3,19] 0.016054305389357 [GeV] -Cell[1,2] 0.00083594717972526 [GeV] -Cell[2,1] 0.00018642862438028 [GeV] -Cell[3,14] 0.00025682005182169 [GeV] -Cell[1,37] 0.00027056484671673 [GeV] -Cell[2,30] 0.00041901941672602 [GeV] -Cell[3,18] 0.00357265227153 [GeV] -Cell[4,15] 0.0012405212974152 [GeV] -### Total energy deposition in calorimeter by a source track in 28 cells : 0.37078819170498 (GeV) +Cell[5,27] 0.0036744422385457 [GeV] +Cell[0,36] 0.0018565117112139 [GeV] +Cell[5,3] 0.00027319778098269 [GeV] +Cell[5,4] 0.00020809043059115 [GeV] +Cell[0,35] 0.00048286254131172 [GeV] +Cell[4,19] 0.0011908692490186 [GeV] +Cell[1,4] 0.00094307008374504 [GeV] +Cell[0,31] 0.0017058029677338 [GeV] +Cell[0,10] 0.0022112591348388 [GeV] +Cell[0,0] 0.00051099891 [GeV] +Cell[3,19] 0.34795242352814 [GeV] +Cell[1,12] 0.00067670648682401 [GeV] +Cell[2,19] 0.0009880167492588 [GeV] +Cell[3,18] 0.010281141036629 [GeV] +Cell[1,2] 0.00062171642027217 [GeV] +Cell[1,8] 0.0029944159754204 [GeV] +Cell[4,21] 9.1742081639344e-05 [GeV] +Cell[2,37] 0.00059540203563787 [GeV] +Cell[7,35] 0.00037991482852052 [GeV] +Cell[1,39] 0.0029047853609248 [GeV] +### Total energy deposition in calorimeter by a source track in 20 cells : 0.38054336955125 (GeV) -Source track ID 7867 (proton,2.1151187943132[GeV]) at (-35.36782673198,498.74754819674,-1593.6754832108) +Source track ID 8863 (proton,2.1151672953451[GeV]) at (-74.289977255961,494.45019898804,-1616.9000301661) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[4,32] 1.2162014968453e-08 [GeV] -Cell[2,12] 0.0083987716640834 [GeV] -Cell[1,12] 0.19857872444584 [GeV] -Cell[4,31] 0.0003932183711421 [GeV] -Cell[0,11] 0.001289886033532 [GeV] -Cell[1,11] 0.0057046964282889 [GeV] -Cell[0,12] 0.21013349796848 [GeV] -Cell[0,13] 0.0021272376855451 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.42662604475893 (GeV) +Cell[1,14] 0.00086083252876457 [GeV] +Cell[1,13] 0.17524428809797 [GeV] +Cell[0,10] 2.4500074250568e-05 [GeV] +Cell[1,2] 0.0024696115340266 [GeV] +Cell[0,13] 0.081536060613974 [GeV] +Cell[0,12] 0.32617049130951 [GeV] +Cell[0,11] 0.0009771491375617 [GeV] +Cell[0,14] 0.0049003465202846 [GeV] +Cell[0,15] 0.00035338312753959 [GeV] +Cell[1,11] 1.2648859304363e-05 [GeV] +Cell[0,34] 0.0027307998772932 [GeV] +### Total energy deposition in calorimeter by a source track in 11 cells : 0.59528011168048 (GeV) -Source track ID 7296 (pi+,0.78132276014106[GeV]) at (-497.52819968296,49.655719914521,-1149.9635789527) +Source track ID 8749 (e-,0.0013261459709905[GeV]) at (174.46534346474,468.57426725091,-1839.8021247178) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[1,22] 0.29289176209598 [GeV] -Cell[3,23] 0.028029147878958 [GeV] -Cell[1,21] 0.0023989545283391 [GeV] -Cell[2,22] 0.15438622620983 [GeV] -Cell[3,22] 0.14884302528365 [GeV] -Cell[4,23] 0.061875682261159 [GeV] -### Total energy deposition in calorimeter by a source track in 6 cells : 0.68842479825791 (GeV) +Cell[0,9] 0.00081514706099052 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00081514706099052 (GeV) -Source track ID 7299 (pi+,0.50623725375964[GeV]) at (488.94119771105,104.57774706355,-1121.9330247904) +Source track ID 6227 (neutron,0.94324668234621[GeV]) at (-217.64299103523,697.09506632196,-2000) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[2,0] 0.0059637578397593 [GeV] -Cell[3,1] 0.0062088508892354 [GeV] -Cell[4,1] 0.11974518952413 [GeV] -Cell[3,0] 0.2873801842401 [GeV] -### Total energy deposition in calorimeter by a source track in 4 cells : 0.41929798249323 (GeV) +Cell[0,14] 0.00065126392052844 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00065126392052844 (GeV) -Source track ID 7113 (anti_proton,1.6907853467306[GeV]) at (-493.59309818724,79.786298459861,-1169.7398058094) +Source track ID 5958 (pi+,0.78145137568424[GeV]) at (-497.62689048475,48.65673505773,-1135.8616607091) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[7,25] 0.00012789205445358 [GeV] -Cell[5,26] 1.5423574154738e-08 [GeV] -Cell[5,32] 0.0003432016667208 [GeV] -Cell[12,34] 2.0411796867847e-08 [GeV] -Cell[7,30] 2.7078203856945e-10 [GeV] -Cell[7,45] 0.0019944115926418 [GeV] -Cell[4,26] 8.637060246997e-06 [GeV] -Cell[3,26] 0.022182060507959 [GeV] -Cell[4,9] 1.2248638086021e-09 [GeV] -Cell[3,27] 0.0043892241443667 [GeV] -Cell[7,46] 3.3012837081969e-07 [GeV] -Cell[3,1] 1.7054119089153e-06 [GeV] -Cell[0,21] 2.9578583169382e-05 [GeV] -Cell[4,22] 0.048946400220097 [GeV] -Cell[1,22] 0.25758381927947 [GeV] -Cell[3,42] 7.1307168763269e-05 [GeV] -Cell[1,25] 0.00087693741985572 [GeV] -Cell[1,24] 0.010480969064487 [GeV] -Cell[2,25] 0.0040373647193109 [GeV] -Cell[3,31] 0.0003203662412941 [GeV] -Cell[3,23] 0.16855087985015 [GeV] -Cell[4,31] 7.7651057866888e-05 [GeV] -Cell[1,21] 0.0006701550002565 [GeV] -Cell[0,22] 0.29366063792394 [GeV] -Cell[1,23] 0.053232257742949 [GeV] -Cell[0,23] 0.10766682901786 [GeV] -Cell[3,4] 2.9016156622674e-06 [GeV] -Cell[2,22] 0.13119698727597 [GeV] -Cell[2,21] 0.0019826162034565 [GeV] -Cell[2,26] 0.0027407601798568 [GeV] -Cell[2,20] 4.3682161194738e-06 [GeV] -Cell[3,20] 0.0028084420528935 [GeV] -Cell[3,22] 0.084478716523695 [GeV] -Cell[3,21] 0.0086900596201283 [GeV] -Cell[2,23] 0.66017552381476 [GeV] -Cell[0,29] 0.004183301528031 [GeV] -Cell[3,45] 0.002519143147461 [GeV] -Cell[2,24] 0.01409507198726 [GeV] -Cell[3,30] 0.0002262064407106 [GeV] -Cell[3,41] 1.1901357211173e-06 [GeV] -Cell[0,28] 0.0015515861966292 [GeV] -Cell[6,27] 2.7232454158366e-09 [GeV] -Cell[3,19] 3.6595235997083e-10 [GeV] -Cell[4,15] 2.6105345938049e-05 [GeV] -Cell[4,23] 0.00034321845265549 [GeV] -Cell[3,24] 0.018383555673908 [GeV] -Cell[3,25] 0.0043685465046247 [GeV] -Cell[7,26] 4.7628945903853e-06 [GeV] -Cell[8,25] 1.6308997184865e-05 [GeV] -Cell[3,46] 0.0008628243329822 [GeV] -Cell[4,21] 0.0022878445403303 [GeV] -Cell[4,20] 6.9718146342325e-05 [GeV] -Cell[3,8] 4.8938672989607e-09 [GeV] -Cell[3,32] 9.3329705123324e-06 [GeV] -Cell[7,34] 1.8760329112411e-09 [GeV] -Cell[1,28] 0.0086801876524974 [GeV] -Cell[1,29] 0.00031738409971172 [GeV] -Cell[1,27] 0.00078406536167972 [GeV] -Cell[2,29] 8.4656892477142e-07 [GeV] -Cell[1,30] 3.6736967774686e-07 [GeV] -Cell[0,30] 0.0011511013386505 [GeV] -Cell[0,31] 8.8971456148101e-07 [GeV] -Cell[4,25] 5.4783246014267e-08 [GeV] -### Total energy deposition in calorimeter by a source track in 63 cells : 1.9272166527326 (GeV) +Cell[4,24] 8.7999069023681e-08 [GeV] +Cell[4,42] 0.0042115105050391 [GeV] +Cell[10,46] 0.00039052683270495 [GeV] +Cell[10,45] 2.4041119104368e-09 [GeV] +Cell[3,20] 4.2499262141064e-05 [GeV] +Cell[3,21] 0.0016944044183072 [GeV] +Cell[2,34] 2.0473555196077e-08 [GeV] +Cell[1,6] 0.00066327872049146 [GeV] +Cell[4,23] 0.10197588812477 [GeV] +Cell[4,22] 0.0013967485475761 [GeV] +Cell[3,22] 0.29305837107521 [GeV] +Cell[3,23] 0.092493698825381 [GeV] +Cell[0,43] 3.2728799851611e-08 [GeV] +Cell[2,22] 1.3514643425651e-05 [GeV] +Cell[2,21] 3.7519566831179e-10 [GeV] +Cell[14,0] 9.3241807480808e-06 [GeV] +Cell[13,0] 2.5025714712683e-06 [GeV] +Cell[13,47] 3.7430926886373e-05 [GeV] +Cell[11,45] 1.8362129594607e-11 [GeV] +Cell[3,24] 0.0033734482408705 [GeV] +Cell[3,25] 0.00046383198198555 [GeV] +Cell[2,5] 0.001415735124273 [GeV] +Cell[1,7] 6.2910900097904e-05 [GeV] +Cell[1,5] 0.0029593069291493 [GeV] +### Total energy deposition in calorimeter by a source track in 24 cells : 0.50426507580962 (GeV) -Source track ID 7114 (neutron,1.4783692592721[GeV]) at (458.5309876774,199.3723484829,-606.56000985403) +Source track ID 5961 (pi+,0.50613624514701[GeV]) at (486.25443514161,116.43291761831,-1140.2826977283) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[8,44] 0.0021004329826662 [GeV] -Cell[7,5] 1.2999644415686e-05 [GeV] -Cell[5,43] 0.0040714166997785 [GeV] -Cell[6,43] 0.031355946040397 [GeV] -Cell[6,44] 0.004703213659763 [GeV] -Cell[8,43] 0.0013047074188521 [GeV] -Cell[7,47] 0.0027040441359463 [GeV] -Cell[5,47] 1.528256910251e-05 [GeV] -Cell[9,42] 0.0030636074427682 [GeV] -Cell[5,4] 0.0016031349042099 [GeV] -Cell[9,43] 0.0008164686700469 [GeV] -Cell[5,2] 0.0048765012889473 [GeV] -Cell[5,3] 0.24299485101623 [GeV] -Cell[7,3] 0.00074112343337447 [GeV] -Cell[8,42] 0.0090365949760979 [GeV] -Cell[6,0] 8.0677044047775e-05 [GeV] -Cell[6,1] 0.0030689014555799 [GeV] -Cell[6,47] 0.022470748935748 [GeV] -Cell[5,1] 2.9131510591696e-05 [GeV] -Cell[6,2] 0.0092180126107336 [GeV] -Cell[6,3] 0.0026927969312036 [GeV] -Cell[6,4] 0.0015802396749243 [GeV] -Cell[7,4] 0.00040154380510637 [GeV] -Cell[6,46] 7.4953841325055e-05 [GeV] -Cell[6,45] 5.1854233024642e-06 [GeV] -Cell[4,3] 0.0010294273232097 [GeV] -Cell[4,4] 8.3732140865322e-10 [GeV] -Cell[5,28] 2.1808373276144e-09 [GeV] -Cell[6,5] 2.1703924744543e-08 [GeV] -Cell[7,44] 2.5570588186383e-06 [GeV] -Cell[5,44] 0.0011548857387826 [GeV] -Cell[9,41] 3.487199137453e-06 [GeV] -Cell[4,47] 5.6142664789149e-08 [GeV] -Cell[5,5] 1.0870256369344e-07 [GeV] -Cell[7,0] 0.0031796874260203 [GeV] -Cell[10,42] 0.0010041067335574 [GeV] -Cell[8,41] 8.0723600985948e-06 [GeV] -### Total energy deposition in calorimeter by a source track in 37 cells : 0.35540492952209 (GeV) +Cell[9,24] 0.00052708745569466 [GeV] +Cell[8,28] 3.1275068758987e-06 [GeV] +Cell[4,28] 9.3677998620478e-09 [GeV] +Cell[4,29] 0.00039539844156513 [GeV] +Cell[6,10] 2.9525961523177e-05 [GeV] +Cell[5,18] 4.7991928877309e-06 [GeV] +Cell[7,29] 0.00018430100114722 [GeV] +Cell[7,30] 0.00060843461462705 [GeV] +Cell[5,9] 0.00051099891 [GeV] +Cell[4,9] 0.0092426511386138 [GeV] +Cell[12,26] 3.3102935685747e-07 [GeV] +Cell[12,29] 0.0013358969583539 [GeV] +Cell[12,27] 1.844933831876e-06 [GeV] +Cell[3,2] 0.0018096153198527 [GeV] +Cell[3,5] 1.0774385213153e-05 [GeV] +Cell[4,0] 1.220540800432e-06 [GeV] +Cell[5,44] 0.0066362665954591 [GeV] +Cell[4,26] 0.00029153395780679 [GeV] +Cell[4,2] 0.00085136163205061 [GeV] +Cell[8,29] 0.00064548891864775 [GeV] +Cell[9,26] 0.00016007610913402 [GeV] +Cell[0,29] 0.0014534472135117 [GeV] +Cell[0,28] 0.00012785831655299 [GeV] +Cell[0,27] 0.00027833294539641 [GeV] +Cell[9,25] 0.00090742748297592 [GeV] +Cell[1,21] 0.0022275221125822 [GeV] +Cell[4,17] 0.0026777003420608 [GeV] +Cell[4,25] 0.00057517968401646 [GeV] +Cell[5,43] 4.6720567752345e-09 [GeV] +Cell[4,10] 2.3345563447606e-05 [GeV] +Cell[0,18] 0.0013234159767916 [GeV] +Cell[2,34] 0.00088209096865744 [GeV] +Cell[3,47] 1.4804146871938e-08 [GeV] +Cell[2,1] 3.1744699983392e-05 [GeV] +Cell[5,28] 9.8953023552895e-13 [GeV] +Cell[5,29] 0.00026532680034177 [GeV] +Cell[0,6] 0.00078863861745958 [GeV] +Cell[0,5] 8.6844240787514e-06 [GeV] +Cell[1,6] 2.4108123034239e-07 [GeV] +Cell[4,43] 1.6615383162843e-07 [GeV] +Cell[1,22] 0.00050739777470717 [GeV] +Cell[3,25] 0.0011873897797804 [GeV] +Cell[1,5] 4.8674398538424e-05 [GeV] +Cell[4,1] 0.23863573636336 [GeV] +Cell[3,1] 0.0046655454178971 [GeV] +Cell[3,0] 0.0029810667551953 [GeV] +Cell[4,27] 8.1287646566125e-05 [GeV] +Cell[0,17] 5.1484676077962e-11 [GeV] +Cell[5,13] 0.00059310194413216 [GeV] +Cell[4,14] 0.0012257388476288 [GeV] +Cell[5,30] 1.2470223620767e-05 [GeV] +Cell[5,14] 0.0021167624086087 [GeV] +Cell[2,33] 0.012088712751813 [GeV] +Cell[1,19] 7.8571475751232e-06 [GeV] +Cell[2,16] 1.5598014666466e-05 [GeV] +Cell[2,47] 8.8335460902726e-06 [GeV] +Cell[2,46] 0.00078661765400989 [GeV] +Cell[2,45] 6.1075374833308e-07 [GeV] +Cell[3,46] 2.2327640181175e-11 [GeV] +Cell[2,32] 0.00010772490943327 [GeV] +Cell[1,32] 3.1199306249619e-11 [GeV] +Cell[2,23] 0.00119068375723 [GeV] +Cell[3,33] 0.0014735059306299 [GeV] +Cell[3,10] 5.5404940275139e-06 [GeV] +Cell[4,44] 9.2113623395562e-11 [GeV] +Cell[2,43] 0.00013061576797918 [GeV] +Cell[4,39] 1.8426524475217e-06 [GeV] +Cell[3,37] 1.8145941052353e-05 [GeV] +Cell[5,40] 2.2546054591658e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 69 cells : 0.30273589296381 (GeV) -Source track ID 7115 (pi+,0.53392931317916[GeV]) at (90.401250863888,491.75971148747,277.74823226481) +Source track ID 5792 (anti_proton,1.6910452994143[GeV]) at (-493.94766802596,77.56095184896,-1172.04454143) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[15,31] 1.6456848243251e-08 [GeV] -Cell[14,31] 1.3460992034879e-06 [GeV] -Cell[12,10] 1.1175870895386e-11 [GeV] -Cell[12,11] 0.00016703094888089 [GeV] -Cell[11,10] 0.12928383285263 [GeV] -Cell[12,7] 3.6223604979568e-08 [GeV] -Cell[10,43] 0.00068692276487707 [GeV] -Cell[11,11] 0.014965105392147 [GeV] -Cell[11,5] 1.2543668162834e-08 [GeV] -Cell[11,12] 0.012403734801471 [GeV] -Cell[11,6] 8.6500165707548e-08 [GeV] -Cell[12,12] 0.0001919363312702 [GeV] -Cell[12,9] 0.00056380675256617 [GeV] -Cell[11,9] 0.1618307178738 [GeV] -Cell[11,14] 1.8186843192325e-07 [GeV] -Cell[11,15] 6.5563654061407e-11 [GeV] -Cell[11,8] 0.0027430953700182 [GeV] -Cell[12,8] 4.8605747895181e-07 [GeV] -Cell[11,7] 2.3812685867597e-09 [GeV] -Cell[11,43] 0.00036517663470374 [GeV] -Cell[11,44] 7.2697793863199e-06 [GeV] -Cell[12,44] 7.9445123901678e-10 [GeV] -Cell[11,13] 0.0049944858238185 [GeV] -Cell[17,37] 0.0011829663327379 [GeV] -Cell[12,13] 0.0020630164966164 [GeV] -Cell[12,14] 0.0093268777670391 [GeV] -Cell[12,15] 0.0012257840757932 [GeV] -Cell[12,16] 8.0786161759988e-05 [GeV] -Cell[13,16] 1.6333130133717e-08 [GeV] -### Total energy deposition in calorimeter by a source track in 29 cells : 0.34208473149451 (GeV) +Cell[8,9] 0.00079011359606553 [GeV] +Cell[8,10] 5.0397376881165e-05 [GeV] +Cell[7,9] 8.3377516129985e-06 [GeV] +Cell[7,8] 0.00085605525859955 [GeV] +Cell[3,44] 0.00021201806831459 [GeV] +Cell[8,11] 6.017000941938e-11 [GeV] +Cell[9,9] 0.0033540880209669 [GeV] +Cell[7,7] 5.6303588917217e-05 [GeV] +Cell[4,24] 1.6054966505521e-05 [GeV] +Cell[7,6] 0.00051099891 [GeV] +Cell[9,11] 0.00051099898772655 [GeV] +Cell[4,28] 5.6483029115157e-05 [GeV] +Cell[4,29] 4.2211237596348e-06 [GeV] +Cell[4,47] 0.00051781103494588 [GeV] +Cell[6,9] 1.2431197421392e-05 [GeV] +Cell[5,24] 6.4362762475412e-06 [GeV] +Cell[5,27] 1.6885518562049e-08 [GeV] +Cell[6,8] 1.4187845638389e-05 [GeV] +Cell[11,25] 3.7060788599774e-08 [GeV] +Cell[4,33] 2.1446975588333e-06 [GeV] +Cell[5,34] 6.1503892925884e-05 [GeV] +Cell[4,37] 0.003288456626201 [GeV] +Cell[16,26] 7.5960997492075e-12 [GeV] +Cell[11,24] 1.0765506885946e-09 [GeV] +Cell[10,8] 0.00061492721656953 [GeV] +Cell[3,5] 0.0015577035817695 [GeV] +Cell[3,6] 0.045530424669732 [GeV] +Cell[6,7] 8.7262344550254e-10 [GeV] +Cell[3,12] 2.1518130291952e-05 [GeV] +Cell[3,11] 2.8062742407201e-05 [GeV] +Cell[5,0] 0.00078846825493549 [GeV] +Cell[2,7] 0.0041001318414522 [GeV] +Cell[5,42] 3.7652261380572e-06 [GeV] +Cell[5,44] 4.7861831262708e-09 [GeV] +Cell[2,6] 0.00021368786496834 [GeV] +Cell[4,26] 1.2872437946498e-07 [GeV] +Cell[4,3] 2.8047390514985e-08 [GeV] +Cell[5,4] 0.00059515709882615 [GeV] +Cell[4,4] 0.0007977647836935 [GeV] +Cell[4,2] 0.000182238142134 [GeV] +Cell[3,9] 0.016794333655175 [GeV] +Cell[5,37] 2.7973733958788e-06 [GeV] +Cell[5,38] 1.2804660655092e-06 [GeV] +Cell[0,35] 0.028006472776302 [GeV] +Cell[0,38] 0.00010624130337715 [GeV] +Cell[4,5] 0.00045990151823878 [GeV] +Cell[3,28] 3.3390230529449e-06 [GeV] +Cell[1,13] 0.0040272385882469 [GeV] +Cell[3,7] 0.0012270096525086 [GeV] +Cell[15,27] 1.3239755162431e-08 [GeV] +Cell[12,24] 1.7671467503533e-08 [GeV] +Cell[4,36] 0.0021398780216918 [GeV] +Cell[4,11] 0.00025590514686003 [GeV] +Cell[4,19] 0.00011146367018227 [GeV] +Cell[5,19] 7.7851125319853e-05 [GeV] +Cell[4,17] 0.0012583021788392 [GeV] +Cell[5,43] 1.1708412785083e-08 [GeV] +Cell[5,16] 0.00046096874208062 [GeV] +Cell[4,10] 0.0022169363494611 [GeV] +Cell[3,20] 0.0027057401712511 [GeV] +Cell[3,21] 0.0055251117417574 [GeV] +Cell[0,18] 0.00060481667546881 [GeV] +Cell[3,42] 0.00051099891 [GeV] +Cell[4,43] 2.1081075329903e-06 [GeV] +Cell[1,4] 0.00027567521782294 [GeV] +Cell[2,8] 6.4309095323551e-06 [GeV] +Cell[3,29] 4.5203252273041e-07 [GeV] +Cell[3,30] 4.3131349957548e-06 [GeV] +Cell[1,47] 9.1902029798945e-06 [GeV] +Cell[3,19] 0.00062246365126956 [GeV] +Cell[1,12] 0.001209837016185 [GeV] +Cell[2,19] 0.004239235278023 [GeV] +Cell[3,18] 0.00029480750958774 [GeV] +Cell[1,2] 0.0035384342611515 [GeV] +Cell[4,21] 0.0044198068911943 [GeV] +Cell[2,37] 0.00031726247696528 [GeV] +Cell[0,13] 4.270643054042e-06 [GeV] +Cell[0,12] 5.9264742885716e-06 [GeV] +Cell[0,14] 0.0038105738864445 [GeV] +Cell[0,15] 3.7682499464068e-05 [GeV] +Cell[4,23] 0.03361250832993 [GeV] +Cell[4,22] 0.33553305276557 [GeV] +Cell[3,22] 0.8811781284486 [GeV] +Cell[3,23] 0.28661572361898 [GeV] +Cell[2,22] 0.00079421506524011 [GeV] +Cell[2,21] 0.0010472156861426 [GeV] +Cell[3,24] 0.0056220749944115 [GeV] +Cell[2,5] 5.3240415059008e-06 [GeV] +Cell[1,5] 4.5924706500955e-07 [GeV] +Cell[4,1] 0.0012188345723835 [GeV] +Cell[4,27] 0.00016483763456358 [GeV] +Cell[1,19] 7.8289303928614e-12 [GeV] +Cell[2,16] 0.00034540281000305 [GeV] +Cell[2,46] 0.00047279706546412 [GeV] +Cell[2,45] 0.00025075959563093 [GeV] +Cell[3,46] 0.00047212652585676 [GeV] +Cell[2,32] 0.0056424276273562 [GeV] +Cell[1,32] 0.003241910119663 [GeV] +Cell[2,23] 0.00018088279240874 [GeV] +Cell[3,33] 3.8309363299049e-06 [GeV] +Cell[3,10] 0.0028626574162331 [GeV] +Cell[4,44] 1.33467313849e-05 [GeV] +Cell[3,37] 0.00017117171346661 [GeV] +Cell[7,43] 0.00051967094933588 [GeV] +Cell[4,15] 7.6076332188677e-06 [GeV] +Cell[3,32] 2.5475231232122e-06 [GeV] +Cell[2,4] 0.0020719030027994 [GeV] +Cell[1,33] 6.4053133537527e-06 [GeV] +Cell[2,31] 0.0027067415222222 [GeV] +Cell[2,30] 7.0295733855687e-05 [GeV] +Cell[4,20] 0.0012718372139213 [GeV] +Cell[0,41] 1.4219936012523e-05 [GeV] +Cell[0,40] 0.00057651446638909 [GeV] +Cell[0,39] 5.9154417407626e-05 [GeV] +Cell[6,5] 3.3034489315469e-06 [GeV] +Cell[1,37] 0.0011838028522548 [GeV] +Cell[3,34] 0.0019273472862676 [GeV] +Cell[1,3] 1.8005082894888e-05 [GeV] +Cell[2,3] 0.00034884965422134 [GeV] +Cell[2,2] 0.00037643354079403 [GeV] +Cell[3,35] 0.00041431892766616 [GeV] +Cell[5,23] 8.1662060802159e-05 [GeV] +Cell[3,36] 0.009019778751319 [GeV] +Cell[3,38] 7.4125224514319e-06 [GeV] +Cell[4,38] 0.0003559162674775 [GeV] +Cell[19,32] 3.3391224656953e-05 [GeV] +Cell[19,33] 0.00061162875508819 [GeV] +Cell[19,34] 0.00039577722536774 [GeV] +Cell[8,18] 1.9468064332955e-05 [GeV] +Cell[5,10] 0.00016409717174554 [GeV] +Cell[12,25] 6.9249164221219e-07 [GeV] +Cell[6,46] 0.00027937502227746 [GeV] +Cell[3,26] 1.8976000137627e-06 [GeV] +Cell[2,20] 0.0021784931991996 [GeV] +Cell[1,28] 0.0011344546512611 [GeV] +Cell[2,42] 0.0083192816599633 [GeV] +Cell[0,33] 0.0013731706344867 [GeV] +Cell[6,3] 0.0011208115674611 [GeV] +Cell[1,31] 0.00092773421219172 [GeV] +Cell[4,13] 0.0085373806305675 [GeV] +Cell[13,37] 7.6715662437768e-05 [GeV] +Cell[0,44] 0.0011574292926805 [GeV] +Cell[5,20] 0.00014809560994672 [GeV] +Cell[0,2] 0.00020380835484377 [GeV] +Cell[4,6] 7.2018302114429e-07 [GeV] +Cell[4,7] 6.4858386394917e-10 [GeV] +Cell[3,31] 3.3741461520549e-06 [GeV] +Cell[5,22] 2.3009998358248e-08 [GeV] +Cell[16,27] 0.11140441627117 [GeV] +Cell[16,28] 0.0023351076268529 [GeV] +Cell[15,26] 1.1714476158886e-08 [GeV] +Cell[2,36] 0.0055359633546298 [GeV] +### Total energy deposition in calorimeter by a source track in 152 cells : 1.8765149450632 (GeV) -Source track ID 7116 (kaon-,1.517346079945[GeV]) at (454.17472278306,-209.10600466014,407.94747330939) +Source track ID 5793 (neutron,1.4783692592721[GeV]) at (458.5309876774,199.3723484829,-606.56000985403) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[14,44] 0.014929864188267 [GeV] -Cell[13,46] 0.022896464000949 [GeV] -Cell[13,47] 0.0021028266041009 [GeV] -Cell[13,45] 0.83903309305413 [GeV] -Cell[12,44] 0.13435453427163 [GeV] -Cell[12,45] 0.14639988371737 [GeV] -Cell[14,45] 0.0017449299660026 [GeV] -Cell[13,44] 0.02512945292366 [GeV] -Cell[13,43] 0.00014622691781028 [GeV] -Cell[12,46] 0.0028863024974031 [GeV] -Cell[14,46] 2.0016107745732e-05 [GeV] -Cell[14,47] 0.00041815742616575 [GeV] -Cell[12,47] 9.1904079814412e-05 [GeV] -Cell[13,42] 0.0016498261359574 [GeV] -Cell[13,41] 0.00064784308078652 [GeV] -Cell[12,43] 0.0019775307930361 [GeV] -### Total energy deposition in calorimeter by a source track in 16 cells : 1.1944288557648 (GeV) +Cell[4,0] 0.0014222033761975 [GeV] +Cell[5,0] 0.002176016874354 [GeV] +Cell[4,3] 0.00041567977363354 [GeV] +Cell[5,3] 0.0033409562291614 [GeV] +Cell[5,4] 0.005427124465579 [GeV] +Cell[4,2] 0.0012274100983832 [GeV] +Cell[2,35] 0.00022143050764862 [GeV] +Cell[3,20] 1.1571272847277e-06 [GeV] +Cell[3,21] 0.00011483152193773 [GeV] +Cell[2,1] 0.013683793651021 [GeV] +Cell[1,1] 0.0011448549267566 [GeV] +Cell[4,1] 0.00021188307262025 [GeV] +Cell[3,1] 0.048306404207801 [GeV] +Cell[3,0] 0.0022596404422563 [GeV] +Cell[2,2] 0.0012660750044959 [GeV] +Cell[3,35] 0.00021038382505594 [GeV] +Cell[3,36] 1.5555188042526e-08 [GeV] +Cell[6,3] 0.0084331750182161 [GeV] +Cell[2,36] 0.00023781938626632 [GeV] +Cell[6,4] 2.5402304561339e-07 [GeV] +Cell[6,2] 0.0079261995070255 [GeV] +Cell[5,5] 0.0019420178849563 [GeV] +Cell[5,2] 0.0027299256789074 [GeV] +Cell[2,0] 0.021087240122078 [GeV] +Cell[5,1] 0.1603474932035 [GeV] +Cell[5,47] 0.0012404747509864 [GeV] +### Total energy deposition in calorimeter by a source track in 26 cells : 0.28537446023435 (GeV) -Source track ID 7219 (gamma,0.23378010273678[GeV]) at (499.39194043647,24.651365623421,861.27116328123) +Source track ID 5794 (pi+,0.53308787498617[GeV]) at (103.15074054631,489.24423831533,291.91449490901) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[10,37] 0.00059187588939797 [GeV] -Cell[14,0] 0.22674934574103 [GeV] -Cell[13,19] 0.00051099891 [GeV] -Cell[14,47] 0.0046682114026883 [GeV] -Cell[19,17] 0.00056389163167405 [GeV] -Cell[15,17] 0.00069577916198902 [GeV] -### Total energy deposition in calorimeter by a source track in 6 cells : 0.23378010273678 (GeV) +Cell[7,31] 0.0012851036784319 [GeV] +Cell[9,9] 0.015577200633673 [GeV] +Cell[9,10] 0.00073297849411587 [GeV] +Cell[7,32] 6.5128784584886e-05 [GeV] +Cell[9,11] 9.0075835469179e-06 [GeV] +Cell[9,12] 0.00073508744942626 [GeV] +Cell[7,33] 0.0006039876514576 [GeV] +Cell[5,35] 1.7045014953965e-06 [GeV] +Cell[16,26] 0.00026191083203139 [GeV] +Cell[11,32] 0.0015180304099504 [GeV] +Cell[15,31] 1.6806705389172e-07 [GeV] +Cell[10,32] 1.3745014652159e-05 [GeV] +Cell[10,31] 0.00014999255786961 [GeV] +Cell[15,30] 3.7759923725389e-07 [GeV] +Cell[16,7] 0.00023859363857662 [GeV] +Cell[16,30] 7.8079032452933e-06 [GeV] +Cell[16,39] 0.00023871294453238 [GeV] +Cell[15,7] 0.00010705281424339 [GeV] +Cell[12,23] 0.0012529702040853 [GeV] +Cell[14,28] 1.6973625752144e-05 [GeV] +Cell[10,1] 7.9123926407192e-06 [GeV] +Cell[11,30] 2.6997520966688e-05 [GeV] +Cell[12,8] 0.00194400072198 [GeV] +Cell[10,8] 2.1961750462651e-10 [GeV] +Cell[10,7] 9.0736100286335e-05 [GeV] +Cell[11,22] 0.0026707252981317 [GeV] +Cell[12,22] 6.4990342153237e-05 [GeV] +Cell[7,34] 1.0579553917978e-05 [GeV] +Cell[10,9] 0.010838547097567 [GeV] +Cell[10,0] 0.00065893598049115 [GeV] +Cell[15,19] 0.0031179827459069 [GeV] +Cell[16,19] 0.0010678830714328 [GeV] +Cell[16,20] 0.00015663571010043 [GeV] +Cell[10,45] 2.8915840084665e-07 [GeV] +Cell[10,44] 1.4021136448719e-06 [GeV] +Cell[10,11] 0.0036619774087763 [GeV] +Cell[11,11] 0.0025649836062242 [GeV] +Cell[11,10] 0.11984137870294 [GeV] +Cell[9,30] 8.8164918805091e-05 [GeV] +Cell[9,31] 0.0022370277553003 [GeV] +Cell[13,7] 1.340382434023e-06 [GeV] +Cell[10,29] 0.0040629585374475 [GeV] +Cell[9,3] 0.0013090753488499 [GeV] +Cell[12,38] 2.4159887107089e-07 [GeV] +Cell[12,45] 4.7034839561093e-05 [GeV] +Cell[12,24] 5.1464409916662e-06 [GeV] +Cell[8,40] 3.3820010437921e-05 [GeV] +Cell[14,41] 0.00085005789891725 [GeV] +Cell[10,30] 0.0002601186369731 [GeV] +Cell[9,42] 1.1010661751893e-05 [GeV] +Cell[13,37] 0.0021986315458565 [GeV] +Cell[16,27] 0.0010933337977087 [GeV] +Cell[16,28] 2.903084762147e-05 [GeV] +Cell[11,9] 0.009170405067758 [GeV] +Cell[10,10] 0.0062493761926457 [GeV] +Cell[14,20] 8.3947930897921e-07 [GeV] +Cell[14,19] 9.4748102128506e-09 [GeV] +Cell[11,8] 0.0034760517070138 [GeV] +Cell[12,10] 0.00012134791279823 [GeV] +Cell[12,7] 0.002614507461336 [GeV] +Cell[12,9] 0.003912621777159 [GeV] +Cell[13,9] 7.7906318869633e-05 [GeV] +Cell[16,40] 0.0023239416426768 [GeV] +Cell[16,38] 9.6226871246472e-06 [GeV] +Cell[17,39] 0.00088371887711094 [GeV] +Cell[16,25] 3.0129114065858e-09 [GeV] +Cell[16,8] 0.0011118738642781 [GeV] +Cell[15,8] 0.0035949103346443 [GeV] +Cell[14,9] 5.3312271575123e-09 [GeV] +Cell[14,24] 3.529313049512e-06 [GeV] +Cell[14,26] 3.4406846010825e-05 [GeV] +Cell[14,27] 6.9883091578959e-05 [GeV] +Cell[16,6] 3.6895458094932e-07 [GeV] +Cell[16,41] 3.7832942325622e-09 [GeV] +Cell[10,12] 0.0033690806101212 [GeV] +Cell[10,47] 0.00011466088115856 [GeV] +Cell[11,47] 2.0161580417721e-05 [GeV] +Cell[11,0] 1.7832678742707e-05 [GeV] +Cell[8,42] 0.00049998824824811 [GeV] +Cell[12,47] 0.00083205668225885 [GeV] +Cell[12,46] 0.00030717810537772 [GeV] +Cell[11,46] 0.0011849564908871 [GeV] +Cell[9,44] 1.1186341580469e-06 [GeV] +Cell[9,45] 2.898552629631e-07 [GeV] +Cell[16,18] 0.011116843824807 [GeV] +Cell[17,20] 1.2076199724106e-05 [GeV] +Cell[16,29] 0.00033411805960839 [GeV] +Cell[17,30] 2.4912878870964e-11 [GeV] +Cell[13,6] 1.1768717966447e-05 [GeV] +Cell[16,17] 0.0041621122438945 [GeV] +Cell[18,5] 2.3785416077203e-05 [GeV] +Cell[18,6] 1.3072340493636e-08 [GeV] +Cell[17,38] 2.9033985458682e-07 [GeV] +Cell[15,39] 5.8460614236537e-06 [GeV] +Cell[13,8] 0.0001126926922168 [GeV] +Cell[11,42] 1.4455060113505e-07 [GeV] +Cell[11,41] 1.0797521099448e-10 [GeV] +Cell[16,16] 0.00085410565523159 [GeV] +Cell[10,13] 0.00023902605082219 [GeV] +Cell[9,14] 0.007393090186438 [GeV] +Cell[11,12] 2.7648638933897e-12 [GeV] +Cell[12,5] 8.475862123305e-06 [GeV] +Cell[12,41] 0.00066087890859512 [GeV] +Cell[12,40] 4.7717350535095e-06 [GeV] +### Total energy deposition in calorimeter by a source track in 104 cells : 0.24671218196392 (GeV) -Source track ID 7220 (gamma,0.24889356279397[GeV]) at (220.29244156685,-448.85547806451,830.38548328728) +Source track ID 5909 (pi+,0.38886482314824[GeV]) at (449.21355940668,-219.56133094236,368.91421349729) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[16,17] 0.00051099891 [GeV] -Cell[14,38] 0.0060257817489205 [GeV] -Cell[14,39] 0.24197310825541 [GeV] -Cell[14,40] 0.00038367387963884 [GeV] -### Total energy deposition in calorimeter by a source track in 4 cells : 0.24889356279397 (GeV) +Cell[10,44] 8.754003389015e-05 [GeV] +Cell[11,45] 0.0016156307741178 [GeV] +Cell[11,42] 1.9438448362052e-10 [GeV] +Cell[11,44] 0.26858974324368 [GeV] +Cell[11,43] 0.047578283691693 [GeV] +Cell[10,43] 0.00039829926270079 [GeV] +Cell[10,42] 0.00074857875103226 [GeV] +### Total energy deposition in calorimeter by a source track in 7 cells : 0.3190180759515 (GeV) -Source track ID 7201 (kaon+,0.66752744779245[GeV]) at (305.44042973481,395.86126848104,372.37175891068) +Source track ID 5910 (kaon-,0.7393961619719[GeV]) at (489.7012750229,-100.9587105749,472.43368152874) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[12,5] 0.0347509752379 [GeV] -Cell[12,7] 7.9329843480377e-05 [GeV] -Cell[12,6] 0.26549098950039 [GeV] -Cell[11,5] 0.0035600234059958 [GeV] -Cell[13,0] 0.00042030383604666 [GeV] -Cell[11,6] 0.10885924611145 [GeV] -Cell[12,4] 0.033164100226365 [GeV] -Cell[12,3] 0.0097145256351002 [GeV] -Cell[13,3] 0.00097460521550385 [GeV] -Cell[12,2] 0.0011255911906022 [GeV] -### Total energy deposition in calorimeter by a source track in 10 cells : 0.45813969020283 (GeV) +Cell[9,11] 6.2691397033632e-07 [GeV] +Cell[10,27] 4.8353579099057e-05 [GeV] +Cell[16,2] 2.8395962317518e-08 [GeV] +Cell[7,29] 3.2413971415508e-06 [GeV] +Cell[9,5] 0.0010556523912622 [GeV] +Cell[9,7] 7.4577155659199e-06 [GeV] +Cell[13,30] 0.00075419170945656 [GeV] +Cell[17,32] 3.0441937269643e-08 [GeV] +Cell[14,28] 0.0044451773505427 [GeV] +Cell[13,3] 0.0011509677254753 [GeV] +Cell[16,0] 0.00064535957733813 [GeV] +Cell[14,7] 7.6980553869589e-05 [GeV] +Cell[14,15] 0.00095780816052518 [GeV] +Cell[13,39] 9.4447616429534e-06 [GeV] +Cell[11,24] 0.0018305622303493 [GeV] +Cell[9,6] 2.0820536883548e-07 [GeV] +Cell[11,23] 9.5256465292323e-05 [GeV] +Cell[10,23] 3.440911857524e-06 [GeV] +Cell[7,28] 0.0019308493529766 [GeV] +Cell[8,34] 1.4880055062008e-05 [GeV] +Cell[9,34] 1.2841569514421e-09 [GeV] +Cell[14,3] 0.00097434448501872 [GeV] +Cell[14,2] 4.9594129667412e-06 [GeV] +Cell[17,1] 1.0942372493446e-05 [GeV] +Cell[10,18] 0.0013216167614524 [GeV] +Cell[8,5] 5.5743148550391e-09 [GeV] +Cell[13,0] 0.002612680478324 [GeV] +Cell[13,47] 0.0022114901167716 [GeV] +Cell[7,43] 2.2171537537361e-05 [GeV] +Cell[14,27] 2.3226142220665e-05 [GeV] +Cell[12,47] 0.24850286867953 [GeV] +Cell[12,46] 0.099865509932347 [GeV] +Cell[12,5] 1.7933158411893e-05 [GeV] +Cell[12,41] 3.1826916383579e-06 [GeV] +Cell[12,0] 0.082874326063219 [GeV] +Cell[12,1] 0.0017710792192556 [GeV] +Cell[13,1] 0.0040359254291888 [GeV] +Cell[14,29] 0.0014609279499535 [GeV] +Cell[14,30] 5.2860236610286e-06 [GeV] +Cell[13,29] 6.3747844943691e-06 [GeV] +Cell[12,42] 2.095858566463e-06 [GeV] +Cell[12,2] 3.2203388400376e-09 [GeV] +Cell[14,47] 2.5845640368061e-05 [GeV] +Cell[15,28] 0.00030423771273392 [GeV] +Cell[8,41] 4.2318087158492e-05 [GeV] +Cell[7,42] 6.2166394782253e-06 [GeV] +Cell[13,46] 0.002629896029406 [GeV] +Cell[19,26] 1.1003610299667e-05 [GeV] +Cell[16,1] 0.00059559466362634 [GeV] +Cell[11,18] 2.3720781377051e-05 [GeV] +Cell[11,21] 0.00052062634668687 [GeV] +Cell[12,21] 0.00036406814220572 [GeV] +Cell[14,36] 8.0208210565615e-06 [GeV] +Cell[15,35] 0.0011902339300392 [GeV] +Cell[15,45] 0.00022516474644072 [GeV] +Cell[15,46] 0.0013015079935426 [GeV] +Cell[14,14] 2.2708912205417e-05 [GeV] +Cell[15,0] 8.3364045422059e-06 [GeV] +Cell[17,33] 5.4538459514788e-06 [GeV] +Cell[13,4] 0.015335462416492 [GeV] +Cell[13,5] 0.0010735356412814 [GeV] +Cell[13,2] 0.0055247542427323 [GeV] +Cell[15,3] 1.5055452240631e-07 [GeV] +Cell[12,4] 0.0010638502776064 [GeV] +Cell[11,5] 2.3120906712393e-07 [GeV] +### Total energy deposition in calorimeter by a source track in 65 cells : 0.48904040771938 (GeV) -Source track ID 7118 (pi-,1.1891393475251[GeV]) at (43.718614687427,-498.08501556442,1037.6692239687) +Source track ID 5911 (neutron,1.0308949596502[GeV]) at (461.56328327865,-192.24810929897,388.34422368354) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[16,12] 0.0010248735772702 [GeV] -Cell[15,32] 3.302112192614e-06 [GeV] -Cell[16,31] 3.9390352321789e-07 [GeV] -Cell[15,39] 0.0003375124767424 [GeV] -Cell[14,38] 3.2724346965551e-10 [GeV] -Cell[14,3] 1.4897436776664e-06 [GeV] -Cell[18,33] 5.0024514723646e-07 [GeV] -Cell[18,36] 0.0001443510221543 [GeV] -Cell[14,21] 0.0011191362407457 [GeV] -Cell[17,37] 0.0013002590894338 [GeV] -Cell[13,3] 1.0340099688619e-06 [GeV] -Cell[15,36] 0.21230488198713 [GeV] -Cell[15,37] 0.016813660531025 [GeV] -Cell[15,38] 1.0889742884501e-06 [GeV] -Cell[16,38] 0.0078746898749076 [GeV] -Cell[16,37] 0.12731262288776 [GeV] -Cell[18,32] 4.9292619361495e-05 [GeV] -Cell[18,34] 1.5583244512868e-05 [GeV] -Cell[18,35] 0.0025885998855843 [GeV] -Cell[19,33] 1.9892644672836e-08 [GeV] -Cell[19,34] 2.9638158594025e-12 [GeV] -Cell[16,36] 0.19134879458986 [GeV] -Cell[16,19] 6.7471271077352e-05 [GeV] -Cell[16,18] 0.0020141103851945 [GeV] -Cell[16,35] 0.018658178269905 [GeV] -Cell[16,13] 7.803932051786e-05 [GeV] -Cell[18,21] 0.00054929993171006 [GeV] -Cell[18,20] 0.0099813554432238 [GeV] -Cell[18,19] 0.0017522365032866 [GeV] -Cell[17,20] 0.00063088009095382 [GeV] -Cell[17,21] 0.00065666151521319 [GeV] -Cell[19,21] 0.0013272650084675 [GeV] -Cell[17,22] 0.00096382509278704 [GeV] -Cell[19,22] 0.00040764749587345 [GeV] -Cell[19,23] 3.7512560921755e-05 [GeV] -Cell[18,22] 0.00038262888035422 [GeV] -Cell[17,34] 0.0043363069362673 [GeV] -Cell[17,14] 3.6501937207959e-05 [GeV] -Cell[16,34] 0.0061881355998192 [GeV] -Cell[15,34] 0.00017338377396015 [GeV] -Cell[15,33] 0.027705830685271 [GeV] -Cell[17,19] 2.9466842534021e-08 [GeV] -Cell[19,0] 1.3205717550591e-08 [GeV] -Cell[19,47] 1.6980629879981e-09 [GeV] -Cell[17,35] 0.023120216602389 [GeV] -Cell[17,36] 0.0022188193781353 [GeV] -Cell[17,38] 0.0017681017397083 [GeV] -Cell[16,39] 0.023607701141614 [GeV] -Cell[17,40] 0.0019959402303853 [GeV] -Cell[17,39] 0.0063421620724553 [GeV] -Cell[18,40] 6.218875940931e-07 [GeV] -Cell[17,41] 5.2806787493864e-08 [GeV] -Cell[16,40] 0.0013398482282852 [GeV] -Cell[15,40] 0.00048165611345098 [GeV] -Cell[15,41] 1.3711257906834e-09 [GeV] -Cell[14,37] 1.5090660440364e-08 [GeV] -Cell[15,35] 0.00039538428959874 [GeV] -Cell[18,37] 2.6921909593511e-06 [GeV] -### Total energy deposition in calorimeter by a source track in 58 cells : 0.69946261545392 (GeV) +Cell[10,1] 0.0019264853524961 [GeV] +Cell[10,0] 0.00012832736539985 [GeV] +Cell[12,44] 7.2889757970529e-05 [GeV] +Cell[12,45] 4.6061585043958e-05 [GeV] +Cell[13,44] 0.0002046759975002 [GeV] +Cell[11,45] 0.011463343630532 [GeV] +Cell[11,47] 0.0067324325461892 [GeV] +Cell[11,0] 0.00083416045144843 [GeV] +Cell[12,47] 0.001441783456812 [GeV] +Cell[12,46] 1.9856731407344e-05 [GeV] +Cell[11,46] 0.00094227814178521 [GeV] +Cell[11,44] 0.0097106167030837 [GeV] +Cell[12,0] 0.00015170476708386 [GeV] +Cell[13,45] 0.00063957319554629 [GeV] +### Total energy deposition in calorimeter by a source track in 14 cells : 0.034314189682299 (GeV) -Source track ID 7182 (gamma,1.5351207931195[GeV]) at (395.55062600533,-305.84261028639,318.34457537674) +Source track ID 5912 (neutron,1.006917729628[GeV]) at (-383.78142751778,-320.48684199576,1148.9931540481) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[12,40] 0.00081658304131614 [GeV] -Cell[10,44] 0.00042706288454939 [GeV] -Cell[8,4] 0.0015959920208939 [GeV] -Cell[8,41] 0.00012881174149832 [GeV] -Cell[11,43] 0.44616665190439 [GeV] -Cell[11,44] 0.0015136331721174 [GeV] -Cell[12,44] 0.00062117977650166 [GeV] -Cell[12,16] 0.0020335317442525 [GeV] -Cell[12,45] 0.0012860387222633 [GeV] -Cell[12,43] 0.014989494124438 [GeV] -Cell[17,20] 0.0015505326006318 [GeV] -Cell[11,42] 1.0350093798444 [GeV] -Cell[11,45] 0.0042606870852607 [GeV] -Cell[11,41] 0.0041913412111431 [GeV] -Cell[10,46] 0.00061883924333654 [GeV] -Cell[12,42] 0.010814358871539 [GeV] -Cell[7,24] 0.0011261764971418 [GeV] -Cell[15,28] 0.0008873313012162 [GeV] -Cell[7,20] 0.00051099891 [GeV] -### Total energy deposition in calorimeter by a source track in 19 cells : 1.5285486246969 (GeV) +Cell[16,31] 8.8453525677323e-08 [GeV] +Cell[16,26] 0.0011534289470144 [GeV] +Cell[15,31] 7.7259933618734e-07 [GeV] +Cell[15,30] 0.00094318136833169 [GeV] +Cell[16,30] 2.0791279894183e-07 [GeV] +Cell[14,45] 3.2806807553243e-08 [GeV] +Cell[14,44] 1.3538647181122e-09 [GeV] +Cell[15,27] 4.7629873064466e-05 [GeV] +Cell[16,27] 2.6161469122599e-08 [GeV] +Cell[16,28] 0.010437277827933 [GeV] +Cell[16,25] 1.8172688729692e-05 [GeV] +Cell[16,29] 0.0014741108385998 [GeV] +Cell[15,28] 0.0012084032345646 [GeV] +Cell[15,45] 3.8892168436178e-07 [GeV] +Cell[15,29] 0.0051714477056788 [GeV] +Cell[15,44] 0.00080338245205144 [GeV] +### Total energy deposition in calorimeter by a source track in 16 cells : 0.021258553145454 (GeV) -Source track ID 7183 (gamma,0.1244455075516[GeV]) at (447.26698080048,-223.49999526985,557.85471368412) +Source track ID 5913 (neutron,1.0005945867229[GeV]) at (443.36676612022,-231.14045664942,456.83880936496) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[11,31] 0.00025687959618678 [GeV] -Cell[12,32] 0.00010430634414446 [GeV] -Cell[17,31] 0.00051099891 [GeV] -Cell[13,28] 0.0016900494618233 [GeV] -Cell[12,44] 0.11083184488804 [GeV] -Cell[13,44] 0.0051441265376633 [GeV] -Cell[13,43] 0.0017950219622455 [GeV] -Cell[13,42] 0.00028015457239613 [GeV] -Cell[12,43] 0.0006108613116247 [GeV] -Cell[14,37] 0.0010104369201333 [GeV] -Cell[15,5] 0.0010229971342506 [GeV] -### Total energy deposition in calorimeter by a source track in 11 cells : 0.12325767763851 (GeV) +Cell[9,10] 3.6908893671352e-06 [GeV] +Cell[9,11] 3.8787699104773e-05 [GeV] +Cell[12,3] 1.1165749298243e-06 [GeV] +Cell[10,1] 1.4593223371776e-05 [GeV] +Cell[12,15] 3.3398537198082e-08 [GeV] +Cell[10,2] 0.0012805324359695 [GeV] +Cell[10,11] 0.00026743881624691 [GeV] +Cell[12,44] 0.0041780709241208 [GeV] +Cell[12,45] 2.0640518632717e-06 [GeV] +Cell[13,43] 0.00064155742355485 [GeV] +Cell[10,42] 2.3782099859091e-05 [GeV] +Cell[12,42] 0.00031993683091173 [GeV] +Cell[12,4] 6.3918213493253e-07 [GeV] +Cell[12,43] 0.004836673326821 [GeV] +Cell[14,8] 1.7996434704401e-05 [GeV] +Cell[13,10] 1.421902855509e-05 [GeV] +Cell[10,41] 0.0016427147722464 [GeV] +Cell[19,47] 5.1794082537526e-05 [GeV] +Cell[19,46] 0.0024931815438925 [GeV] +Cell[19,45] 0.00026146213767061 [GeV] +Cell[14,25] 0.0010516215468215 [GeV] +Cell[13,42] 0.00011826982902255 [GeV] +Cell[11,1] 0.0041734092672473 [GeV] +Cell[11,3] 0.00073794905055373 [GeV] +Cell[10,3] 0.0062508537274064 [GeV] +Cell[11,2] 0.0008736846792641 [GeV] +### Total energy deposition in calorimeter by a source track in 26 cells : 0.029296072976715 (GeV) -Source track ID 7157 (pi+,0.37517768079804[GeV]) at (180.84065050677,466.15089737583,1254.728427216) +Source track ID 5916 (neutron,0.94361312633394[GeV]) at (484.82860475331,-122.23429965833,335.8527630151) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[13,33] 4.8827181431307e-05 [GeV] -Cell[13,32] 0.001051104019263 [GeV] -Cell[14,32] 0.00013825419999978 [GeV] -Cell[15,32] 1.031166757457e-07 [GeV] -Cell[14,31] 0.00095702149159911 [GeV] -Cell[13,25] 0.00083870685950791 [GeV] -Cell[13,40] 5.7782035466516e-05 [GeV] -Cell[16,38] 0.0016702392841397 [GeV] -Cell[16,37] 1.0529004082059e-05 [GeV] -Cell[16,36] 7.3140349286405e-08 [GeV] -Cell[18,19] 0.00039661977882452 [GeV] -Cell[17,20] 3.5805407125736e-05 [GeV] -Cell[17,19] 1.1986901052296e-05 [GeV] -Cell[16,39] 0.00020495144981703 [GeV] -Cell[16,9] 0.028091235410632 [GeV] -Cell[16,8] 0.15677602772333 [GeV] -Cell[16,7] 0.0043965291761031 [GeV] -Cell[16,6] 0.00024547081392348 [GeV] -Cell[14,33] 3.8299739344438e-09 [GeV] -Cell[15,8] 0.00039272014971993 [GeV] -Cell[15,6] 0.00040742030358183 [GeV] -Cell[15,7] 0.010925186004792 [GeV] -Cell[17,18] 0.00093480244415332 [GeV] -Cell[15,9] 0.00034467877584939 [GeV] -Cell[15,10] 0.002766791240831 [GeV] -Cell[14,10] 1.6395642887801e-09 [GeV] -Cell[14,6] 0.00071813398804852 [GeV] -Cell[14,7] 0.00062079158739652 [GeV] -Cell[14,5] 0.0081112689437063 [GeV] -Cell[13,5] 6.1705356074526e-08 [GeV] -Cell[13,4] 5.8647685818869e-10 [GeV] -Cell[14,4] 3.7789555461018e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 32 cells : 0.22019091774823 (GeV) +Cell[4,47] 2.2635442746832e-09 [GeV] +Cell[7,18] 9.3849914555904e-06 [GeV] +Cell[4,0] 0.00068953479825643 [GeV] +Cell[5,0] 2.5133060494454e-05 [GeV] +Cell[11,46] 0.00329913436997 [GeV] +### Total energy deposition in calorimeter by a source track in 5 cells : 0.0040231894837207 (GeV) -Source track ID 7149 (pi-,0.48394187159358[GeV]) at (173.8369509531,-468.8077585571,105.16916888305) +Source track ID 5924 (gamma,0.0016693908788587[GeV]) at (398.68391662799,301.74680548793,174.88204846655) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[10,37] 0.0003055165835832 [GeV] -Cell[11,40] 0.0017811116097268 [GeV] -Cell[10,41] 0.004159146374445 [GeV] -Cell[10,40] 0.15660375279759 [GeV] -Cell[10,36] 0.00097363593432149 [GeV] -Cell[10,42] 0.00024319223605357 [GeV] -Cell[11,41] 0.00054369227718744 [GeV] -Cell[10,38] 0.069072395962015 [GeV] -Cell[10,39] 0.21069327852374 [GeV] -### Total energy deposition in calorimeter by a source track in 9 cells : 0.44437572229866 (GeV) +Cell[10,5] 0.00015385120962864 [GeV] +Cell[10,4] 0.0013259485240562 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.0014797997336848 (GeV) -Source track ID 7130 (pi+,0.96823386337029[GeV]) at (-69.966732068248,-495.08045447552,1184.9752006886) +Source track ID 5925 (neutron,0.94058819654791[GeV]) at (361.90851019793,344.99598584088,1.5433416202086) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[16,32] 5.1205161202233e-05 [GeV] -Cell[17,32] 6.4025312894955e-08 [GeV] -Cell[16,31] 0.00011672696665426 [GeV] -Cell[17,31] 0.0012277139057574 [GeV] -Cell[15,30] 3.7801521830261e-07 [GeV] -Cell[16,30] 7.7434799459297e-06 [GeV] -Cell[16,29] 1.902192569105e-06 [GeV] -Cell[14,38] 0.0022243807561515 [GeV] -Cell[19,39] 0.010282719790683 [GeV] -Cell[14,35] 0.00024336025699313 [GeV] -Cell[13,35] 6.1769947024004e-09 [GeV] -Cell[16,4] 0.0020355714865313 [GeV] -Cell[18,36] 0.00013335130913526 [GeV] -Cell[17,46] 4.6002214430246e-05 [GeV] -Cell[19,16] 1.473070628424e-05 [GeV] -Cell[17,23] 6.1326315289989e-08 [GeV] -Cell[17,24] 0.0037096313080517 [GeV] -Cell[14,36] 0.038570020131619 [GeV] -Cell[17,37] 0.00012702122371411 [GeV] -Cell[14,40] 8.8487977336626e-09 [GeV] -Cell[12,4] 1.4569822155863e-08 [GeV] -Cell[12,3] 4.8527581611779e-08 [GeV] -Cell[13,3] 0.00043451557839524 [GeV] -Cell[15,36] 0.0022285053081886 [GeV] -Cell[16,36] 3.5529464021238e-06 [GeV] -Cell[16,35] 0.0079825036907262 [GeV] -Cell[19,22] 1.2575183063745e-09 [GeV] -Cell[19,23] 6.2572944443673e-09 [GeV] -Cell[17,34] 0.00047407172040846 [GeV] -Cell[16,34] 0.36498352364483 [GeV] -Cell[15,34] 0.025221389251798 [GeV] -Cell[15,41] 0.00033913246301358 [GeV] -Cell[14,37] 0.000413078071673 [GeV] -Cell[15,35] 0.0023682628130218 [GeV] -Cell[18,37] 2.7453130843583e-05 [GeV] -Cell[15,5] 2.1169694955461e-06 [GeV] -Cell[16,7] 5.2440660512275e-05 [GeV] -Cell[16,6] 0.0011223734155404 [GeV] -Cell[15,6] 2.5808482605498e-06 [GeV] -Cell[15,7] 0.00086530237889497 [GeV] -Cell[14,6] 0.0011443520412615 [GeV] -Cell[14,5] 0.002518978168488 [GeV] -Cell[13,5] 7.6931359563105e-05 [GeV] -Cell[13,4] 0.0001162787559166 [GeV] -Cell[15,42] 1.8434077879647e-05 [GeV] -Cell[14,41] 7.4648040304055e-06 [GeV] -Cell[17,30] 0.0001046800101908 [GeV] -Cell[19,14] 0.00014901783802452 [GeV] -Cell[19,13] 3.2371549919276e-05 [GeV] -Cell[19,12] 2.4049622908933e-05 [GeV] -Cell[17,4] 0.00016361456679931 [GeV] -Cell[17,3] 0.0001239074354861 [GeV] -Cell[17,2] 6.5067368497466e-05 [GeV] -Cell[17,43] 3.3688429306494e-05 [GeV] -Cell[18,43] 0.0020679654839517 [GeV] -Cell[18,44] 0.00032805109658102 [GeV] -Cell[18,7] 0.0025343314904821 [GeV] -Cell[19,7] 3.8380400842016e-05 [GeV] -Cell[19,8] 1.1690199883674e-05 [GeV] -Cell[19,9] 4.6111611652577e-07 [GeV] -Cell[14,16] 1.130928832572e-05 [GeV] -Cell[14,17] 0.0016167275239877 [GeV] -Cell[17,7] 6.4499997339681e-05 [GeV] -Cell[17,8] 8.985516615212e-10 [GeV] -Cell[15,14] 0.00175069398331 [GeV] -Cell[19,25] 0.0028590870015523 [GeV] -Cell[17,9] 0.0016346418872017 [GeV] -Cell[17,33] 8.9436495909467e-07 [GeV] -Cell[16,23] 0.0021558446789148 [GeV] -Cell[15,29] 1.3402331387624e-07 [GeV] -Cell[16,28] 1.2099081184715e-05 [GeV] -Cell[16,27] 1.1394789005863e-05 [GeV] -Cell[17,25] 0.009675988530143 [GeV] -Cell[16,25] 2.3324038734245e-06 [GeV] -Cell[18,25] 0.0072416903750063 [GeV] -Cell[19,24] 4.6375188230627e-05 [GeV] -Cell[16,24] 1.0653592507538e-05 [GeV] -Cell[18,24] 0.001669329511866 [GeV] -Cell[19,37] 0.084484344281669 [GeV] -Cell[19,38] 0.0025266337308649 [GeV] -### Total energy deposition in calorimeter by a source track in 80 cells : 0.59064786373452 (GeV) +Cell[12,39] 2.6133411738556e-05 [GeV] +Cell[9,5] 2.3833536106395e-05 [GeV] +Cell[11,40] 8.2479051197879e-06 [GeV] +Cell[10,12] 0.00059361388611831 [GeV] +Cell[10,13] 0.00018670627142933 [GeV] +Cell[12,40] 3.0810596013907e-05 [GeV] +Cell[10,5] 1.1638838448562e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 7 cells : 0.00088098444497484 (GeV) -Source track ID 7131 (kaon-,2.4403941557082[GeV]) at (342.08531583564,-364.66098871367,532.03535340985) +Source track ID 5926 (gamma,0.0003506782128334[GeV]) at (493.82872350472,78.314697482037,340.79252156074) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[8,9] 0.0024032168643234 [GeV] -Cell[9,8] 1.4244650665205e-06 [GeV] -Cell[8,8] 3.282559485524e-05 [GeV] -Cell[9,10] 0.00042548227786064 [GeV] -Cell[9,9] 5.9366106928792e-05 [GeV] -Cell[13,38] 0.0006091151844995 [GeV] -Cell[9,34] 0.00038647748769457 [GeV] -Cell[9,4] 0.00033039079948048 [GeV] -Cell[7,22] 0.00033725759236048 [GeV] -Cell[5,41] 6.6843640524894e-09 [GeV] -Cell[14,30] 0.00025739894269827 [GeV] -Cell[9,35] 0.0031763080121078 [GeV] -Cell[11,28] 0.0017050021857879 [GeV] -Cell[7,42] 0.00067547272204764 [GeV] -Cell[14,44] 0.0043060253877597 [GeV] -Cell[14,43] 0.22416172044754 [GeV] -Cell[13,32] 0.00056592911442402 [GeV] -Cell[15,39] 0.00066802769808191 [GeV] -Cell[14,38] 0.0077606786360788 [GeV] -Cell[14,3] 0.01377170084981 [GeV] -Cell[11,27] 6.0403179351169e-06 [GeV] -Cell[16,5] 9.1089168563485e-10 [GeV] -Cell[12,10] 5.9430686509586e-05 [GeV] -Cell[12,27] 5.8070058003068e-08 [GeV] -Cell[12,40] 0.012942191918409 [GeV] -Cell[13,40] 0.036927155305359 [GeV] -Cell[12,39] 0.0026696569560529 [GeV] -Cell[13,39] 0.00012126575723937 [GeV] -Cell[12,25] 1.5582668129355e-07 [GeV] -Cell[9,5] 2.0915729351145e-07 [GeV] -Cell[10,7] 0.00035040388628189 [GeV] -Cell[9,27] 0.0007591620711205 [GeV] -Cell[3,26] 1.1025491630789e-09 [GeV] -Cell[10,5] 6.5833194184961e-10 [GeV] -Cell[9,1] 6.8210658791941e-06 [GeV] -Cell[6,0] 0.0016807223520296 [GeV] -Cell[6,2] 3.7493591662496e-09 [GeV] -Cell[10,17] 0.0010790587340567 [GeV] -Cell[11,18] 6.0173142410349e-06 [GeV] -Cell[13,8] 6.5025844378397e-08 [GeV] -Cell[13,35] 0.00031275071737207 [GeV] -Cell[11,6] 9.3279127031565e-07 [GeV] -Cell[12,9] 5.2820512792096e-08 [GeV] -Cell[11,9] 0.00058984149235113 [GeV] -Cell[13,10] 0.00060963907184828 [GeV] -Cell[14,18] 2.3280886816792e-06 [GeV] -Cell[8,26] 5.4637115681544e-08 [GeV] -Cell[14,9] 1.5253905439749e-07 [GeV] -Cell[11,29] 1.8960318266181e-05 [GeV] -Cell[3,23] 0.00050283143612307 [GeV] -Cell[4,6] 2.3432858337969e-05 [GeV] -Cell[4,0] 1.2425213664073e-06 [GeV] -Cell[15,3] 0.0019331959720201 [GeV] -Cell[4,47] 1.8188400357531e-06 [GeV] -Cell[4,7] 6.3289776497868e-05 [GeV] -Cell[3,22] 0.00014278936327526 [GeV] -Cell[2,7] 1.0738939250587e-05 [GeV] -Cell[4,13] 0.00032727276518958 [GeV] -Cell[13,45] 4.2158567191564e-07 [GeV] -Cell[3,24] 3.2284820917994e-08 [GeV] -Cell[3,25] 8.5823207643898e-07 [GeV] -Cell[4,20] 0.00051099891 [GeV] -Cell[11,8] 2.1111336536705e-09 [GeV] -Cell[11,7] 0.0010473715951589 [GeV] -Cell[11,43] 0.0007557554297963 [GeV] -Cell[11,44] 6.8340641178111e-08 [GeV] -Cell[12,44] 0.020383465653587 [GeV] -Cell[12,14] 0.0015877670223038 [GeV] -Cell[13,16] 0.001621059365749 [GeV] -Cell[12,45] 9.1313710610507e-05 [GeV] -Cell[14,45] 0.00021797930116816 [GeV] -Cell[13,44] 0.011656915164783 [GeV] -Cell[13,43] 0.023418174094062 [GeV] -Cell[12,47] 0.0015202188776861 [GeV] -Cell[13,42] 0.53722945792239 [GeV] -Cell[13,41] 0.22720365028356 [GeV] -Cell[12,43] 0.021237874346109 [GeV] -Cell[15,17] 0.00018126715519975 [GeV] -Cell[14,39] 0.011040743202917 [GeV] -Cell[14,40] 0.0073570112832084 [GeV] -Cell[12,3] 0.0018518126107912 [GeV] -Cell[15,38] 9.5413194594585e-07 [GeV] -Cell[16,19] 7.8240168570346e-05 [GeV] -Cell[16,18] 0.00043964196278102 [GeV] -Cell[17,21] 0.00020396402279289 [GeV] -Cell[17,22] 3.0650539388034e-05 [GeV] -Cell[14,37] 2.715304162848e-08 [GeV] -Cell[11,42] 0.0012154608714702 [GeV] -Cell[12,42] 0.14060416168722 [GeV] -Cell[16,7] 0.00027411834158374 [GeV] -Cell[16,6] 0.00013770821401579 [GeV] -Cell[15,8] 3.17990129588e-07 [GeV] -Cell[15,6] 6.6766952256785e-06 [GeV] -Cell[15,10] 0.00068267963393487 [GeV] -Cell[14,5] 0.008250518578638 [GeV] -Cell[13,5] 0.00051099891 [GeV] -Cell[13,4] 0.0088787606458467 [GeV] -Cell[14,4] 3.1834083983995e-08 [GeV] -Cell[14,41] 0.0028136474333294 [GeV] -Cell[16,28] 9.7107081705872e-07 [GeV] -Cell[16,27] 0.00038416884921548 [GeV] -Cell[12,41] 0.25930348997308 [GeV] -Cell[15,11] 0.0013416851128929 [GeV] -Cell[15,12] 3.4178810892627e-12 [GeV] -Cell[15,18] 3.3061194699258e-08 [GeV] -Cell[15,19] 2.551296304091e-06 [GeV] -Cell[15,20] 1.3687365697024e-07 [GeV] -Cell[7,19] 0.0010757737075358 [GeV] -Cell[10,26] 0.0012658336347178 [GeV] -Cell[10,25] 0.00029505692080102 [GeV] -Cell[9,26] 0.0015271395334524 [GeV] -Cell[10,11] 0.00087951957772679 [GeV] -Cell[9,14] 0.037149546601719 [GeV] -Cell[4,30] 0.0056345954429303 [GeV] -Cell[13,9] 0.00054298145599 [GeV] -Cell[15,21] 1.6151432557308e-05 [GeV] -Cell[13,15] 5.2924860210624e-06 [GeV] -Cell[14,1] 7.8061672393233e-06 [GeV] -Cell[14,8] 7.3077768320218e-08 [GeV] -Cell[8,27] 1.0140248923562e-07 [GeV] -Cell[18,16] 0.001158321044661 [GeV] -Cell[14,42] 0.0010575411667139 [GeV] -Cell[8,20] 0.0007089078958323 [GeV] -Cell[13,6] 0.00066193422716244 [GeV] -Cell[17,29] 0.00019590531265446 [GeV] -Cell[15,1] 0.00084844273587514 [GeV] -Cell[15,22] 0.00035240278707107 [GeV] -Cell[13,2] 0.023619424091776 [GeV] -Cell[12,1] 0.00017002445515157 [GeV] -Cell[14,2] 0.00036457293565027 [GeV] -Cell[14,15] 0.00051099891 [GeV] -Cell[12,38] 0.00037209771665107 [GeV] -Cell[13,37] 0.00050446522741197 [GeV] -Cell[12,37] 8.2819436577211e-06 [GeV] -Cell[18,18] 1.7396429466316e-05 [GeV] -Cell[19,18] 0.00012208110261963 [GeV] -### Total energy deposition in calorimeter by a source track in 136 cells : 1.6959320558298 (GeV) +Cell[11,1] 0.0003506782128334 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0003506782128334 (GeV) -Source track ID 7129 (kaon0L,0.85324689363199[GeV]) at (443.61976117133,-230.65451978727,564.59737040268) +Source track ID 5919 (gamma,0.00034766302330713[GeV]) at (-470.59964720568,-168.92593658137,550.88724045995) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[14,44] 0.037365434094697 [GeV] -Cell[14,43] 0.010594526246133 [GeV] -Cell[13,32] 4.9417797127035e-05 [GeV] -Cell[13,46] 0.00035033948147486 [GeV] -Cell[12,29] 0.0020260988283328 [GeV] -Cell[12,17] 1.0150498792427e-06 [GeV] -Cell[13,40] 8.3214321639389e-06 [GeV] -Cell[13,47] 0.0022724857129229 [GeV] -Cell[14,0] 1.2271161162062e-05 [GeV] -Cell[13,0] 0.001023152200895 [GeV] -Cell[15,44] 0.11507803322197 [GeV] -Cell[13,45] 5.9830287796103e-08 [GeV] -Cell[12,16] 2.1212757530861e-05 [GeV] -Cell[14,45] 0.37530734414632 [GeV] -Cell[13,44] 0.0019868894280746 [GeV] -Cell[13,43] 0.024994118157056 [GeV] -Cell[14,46] 0.043032686210256 [GeV] -Cell[14,47] 0.00014504556494217 [GeV] -Cell[13,41] 0.00061755375407893 [GeV] -Cell[14,41] 3.481194877736e-06 [GeV] -Cell[14,42] 0.0018748214317445 [GeV] -Cell[15,45] 0.061439721453155 [GeV] -### Total energy deposition in calorimeter by a source track in 22 cells : 0.67820402915509 (GeV) +Cell[12,26] 0.00034766302330713 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00034766302330713 (GeV) -Source track ID 7123 (pi+,4.2124309467828[GeV]) at (194.32987893002,-460.69067513359,515.89675080528) +Source track ID 5920 (gamma,0.00013509693632589[GeV]) at (410.93250316014,-284.84114493265,319.15477064876) Original primary track ID 8 (unknown,11.672977589613[GeV]) -Cell[13,38] 0.95021722538951 [GeV] -Cell[11,31] 3.3354271181452e-07 [GeV] -Cell[15,39] 0.0003073366475391 [GeV] -Cell[14,38] 0.029279789023326 [GeV] -Cell[14,35] 0.17705527604478 [GeV] -Cell[10,12] 0.00041771543172813 [GeV] -Cell[11,30] 1.2282689567655e-09 [GeV] -Cell[12,40] 0.00056825957001304 [GeV] -Cell[13,40] 0.032101035185912 [GeV] -Cell[12,39] 0.09214326787664 [GeV] -Cell[13,39] 0.44036363619889 [GeV] -Cell[12,25] 0.0010798120203096 [GeV] -Cell[9,39] 4.7832996199304e-07 [GeV] -Cell[10,7] 0.0013545586058488 [GeV] -Cell[11,36] 3.0319203096951e-07 [GeV] -Cell[12,36] 3.2304155023667e-05 [GeV] -Cell[0,20] 0.00092245551828346 [GeV] -Cell[19,16] 9.6731030207593e-06 [GeV] -Cell[14,36] 0.45173074323124 [GeV] -Cell[13,42] 0.0070298012840407 [GeV] -Cell[13,41] 0.0023622305304862 [GeV] -Cell[14,39] 0.3013707646533 [GeV] -Cell[14,40] 0.29168371367415 [GeV] -Cell[15,36] 0.026475458550705 [GeV] -Cell[15,37] 0.012803337450587 [GeV] -Cell[15,38] 0.0024740614495821 [GeV] -Cell[16,37] 0.0039950498229865 [GeV] -Cell[16,36] 0.0040489754744332 [GeV] -Cell[17,21] 0.00030005719633027 [GeV] -Cell[19,21] 0.00053511036367445 [GeV] -Cell[17,22] 7.0666344413439e-08 [GeV] -Cell[15,34] 0.00035735728236205 [GeV] -Cell[17,41] 0.00017850173759487 [GeV] -Cell[15,40] 0.0023370297361619 [GeV] -Cell[15,41] 0.10531481213748 [GeV] -Cell[14,37] 0.2790931103534 [GeV] -Cell[15,35] 0.0046769887041053 [GeV] -Cell[12,42] 2.75710132222e-05 [GeV] -Cell[14,10] 5.9817102737725e-09 [GeV] -Cell[15,42] 0.022242169022393 [GeV] -Cell[14,41] 0.0052301583469441 [GeV] -Cell[12,41] 0.0030728577130193 [GeV] -Cell[12,38] 0.077960665662124 [GeV] -Cell[13,37] 0.18536191991428 [GeV] -Cell[12,37] 0.00042115257599397 [GeV] -Cell[13,36] 0.0060046050554237 [GeV] -Cell[11,37] 4.1686984218359e-08 [GeV] -Cell[17,6] 3.1999730563257e-06 [GeV] -Cell[19,15] 7.0098425802712e-05 [GeV] -Cell[16,41] 0.0040739324878098 [GeV] -Cell[17,42] 0.00024055007077541 [GeV] -### Total energy deposition in calorimeter by a source track in 51 cells : 3.5273295632923 (GeV) +Cell[11,43] 0.00013509693632589 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00013509693632589 (GeV) -Source track ID 6205 (kaon+,2.4773699439527[GeV]) at (287.40608278009,-409.14269342249,-440.37850752327) +Source track ID 5897 (gamma,0.23378010273678[GeV]) at (499.39194048253,24.65136469026,861.27116427725) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[14,2] 0.00067614212083465 [GeV] +Cell[14,1] 0.0040546877815133 [GeV] +Cell[14,0] 0.22284020663172 [GeV] +Cell[14,47] 0.00051099891 [GeV] +Cell[14,8] 0.00076484855079002 [GeV] +### Total energy deposition in calorimeter by a source track in 5 cells : 0.22884688399486 (GeV) + +Source track ID 5898 (gamma,0.24889356279397[GeV]) at (220.29244233362,-448.85547768819,830.38548427803) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[13,31] 0.00098756667073338 [GeV] +Cell[15,14] 0.00046889929414313 [GeV] +Cell[13,39] 0.00044197981788591 [GeV] +Cell[16,19] 0.0017049890376309 [GeV] +Cell[14,40] 0.00064817338916476 [GeV] +Cell[16,18] 2.1290017974628e-05 [GeV] +Cell[15,3] 4.6943422278447e-06 [GeV] +Cell[14,39] 0.23836016823868 [GeV] +Cell[13,40] 0.0007073904640208 [GeV] +Cell[15,11] 0.0023112379773478 [GeV] +Cell[11,15] 0.00044191373159165 [GeV] +Cell[17,18] 0.0010425084971272 [GeV] +Cell[15,4] 0.00072329553729056 [GeV] +Cell[14,38] 0.0010294557781428 [GeV] +### Total energy deposition in calorimeter by a source track in 14 cells : 0.24889356279397 (GeV) + +Source track ID 5878 (kaon+,0.66861605529019[GeV]) at (302.8387426893,397.85511926625,367.49154322407) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[12,39] 0.012512693009394 [GeV] +Cell[13,31] 0.00046023799659954 [GeV] +Cell[18,29] 0.0014545243743436 [GeV] +Cell[13,28] 0.0017138656869112 [GeV] +Cell[12,8] 0.0027674984860386 [GeV] +Cell[10,44] 0.001870887589525 [GeV] +Cell[13,43] 0.00039469989349709 [GeV] +Cell[13,35] 0.0031429170617187 [GeV] +Cell[12,7] 0.0053589070245773 [GeV] +Cell[14,39] 0.012782440874582 [GeV] +Cell[14,38] 0.0032326366017645 [GeV] +Cell[11,7] 0.0073444242533336 [GeV] +Cell[11,6] 0.2483621097942 [GeV] +Cell[12,6] 0.25961691260714 [GeV] +Cell[12,16] 0.00081230474216865 [GeV] +Cell[19,29] 0.00021496341476091 [GeV] +Cell[19,30] 0.00092039051727883 [GeV] +Cell[14,35] 0.00024098878066913 [GeV] +Cell[18,23] 0.00043089057612711 [GeV] +Cell[14,37] 0.0098078967435131 [GeV] +### Total energy deposition in calorimeter by a source track in 20 cells : 0.57344219002814 (GeV) + +Source track ID 5797 (pi-,1.1892032464204[GeV]) at (43.835654082775,-498.07472876179,1039.0382367071) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[12,39] 2.846670045983e-05 [GeV] +Cell[17,40] 0.00078723868071404 [GeV] +Cell[16,39] 0.0051201224054571 [GeV] +Cell[13,25] 3.7390271725599e-05 [GeV] +Cell[13,3] 9.7899766988121e-06 [GeV] +Cell[14,7] 1.9069411791861e-09 [GeV] +Cell[14,4] 0.00017828470350287 [GeV] +Cell[13,18] 2.5944609660655e-09 [GeV] +Cell[13,39] 7.1172879252117e-06 [GeV] +Cell[12,15] 0.00036724353508669 [GeV] +Cell[12,14] 2.9468878619809e-07 [GeV] +Cell[15,36] 0.11870091888102 [GeV] +Cell[13,38] 7.5213954027276e-05 [GeV] +Cell[12,38] 0.00014683727497675 [GeV] +Cell[14,3] 2.328081172891e-07 [GeV] +Cell[16,40] 0.0040382766241632 [GeV] +Cell[16,38] 0.01803303309159 [GeV] +Cell[17,39] 0.004688259591841 [GeV] +Cell[14,24] 0.0015116192158636 [GeV] +Cell[16,41] 2.7608177795059e-05 [GeV] +Cell[17,38] 0.006134987475248 [GeV] +Cell[15,39] 0.0020737338961381 [GeV] +Cell[15,35] 0.00027674208578237 [GeV] +Cell[15,45] 0.00076048676347489 [GeV] +Cell[15,46] 1.06562758981e-06 [GeV] +Cell[14,8] 6.1465834733099e-09 [GeV] +Cell[11,15] 5.9514745071283e-06 [GeV] +Cell[14,35] 0.0028033963001404 [GeV] +Cell[15,37] 0.15262872035516 [GeV] +Cell[15,38] 0.00026615467972418 [GeV] +Cell[17,36] 0.015810223996204 [GeV] +Cell[16,15] 3.0106748454273e-09 [GeV] +Cell[17,35] 0.015300416537691 [GeV] +Cell[17,34] 8.9772591600195e-06 [GeV] +Cell[16,34] 4.1814468568191e-06 [GeV] +Cell[16,35] 6.1847709519498e-05 [GeV] +Cell[19,16] 0.0016242193034821 [GeV] +Cell[19,17] 0.00094928961294681 [GeV] +Cell[18,35] 0.0013335380079086 [GeV] +Cell[18,34] 0.00068610927307002 [GeV] +Cell[14,18] 7.9493316268781e-05 [GeV] +Cell[13,24] 0.0010824818550911 [GeV] +Cell[17,37] 0.01631867482868 [GeV] +Cell[19,8] 0.042133076006348 [GeV] +Cell[19,9] 0.045931710755884 [GeV] +Cell[16,42] 0.003375801152594 [GeV] +Cell[14,34] 0.0087836979008432 [GeV] +Cell[16,37] 0.2989143713349 [GeV] +Cell[16,36] 0.0037656059494862 [GeV] +Cell[18,40] 0.00048222674562908 [GeV] +Cell[18,37] 3.0690754329044e-09 [GeV] +Cell[18,38] 3.7752048456241e-09 [GeV] +Cell[15,34] 0.001946306572482 [GeV] +Cell[17,41] 0.0090939728996193 [GeV] +### Total energy deposition in calorimeter by a source track in 54 cells : 0.78639542949512 (GeV) + +Source track ID 5860 (gamma,1.5351207931195[GeV]) at (395.55062862341,-305.84260690039,318.34458623578) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[10,23] 0.00054714874431917 [GeV] +Cell[12,44] 0.0011770182537824 [GeV] +Cell[11,42] 0.93941213915793 [GeV] +Cell[11,41] 0.0049952685933543 [GeV] +Cell[12,41] 0.013431470463936 [GeV] +Cell[11,44] 0.0031849829838595 [GeV] +Cell[11,43] 0.52740624727362 [GeV] +Cell[12,42] 0.018448609221379 [GeV] +Cell[12,43] 0.021337500223203 [GeV] +Cell[10,41] 0.0017512630661947 [GeV] +Cell[11,19] 0.00054389262990717 [GeV] +### Total energy deposition in calorimeter by a source track in 11 cells : 1.5322355406115 (GeV) + +Source track ID 5861 (gamma,0.1244455075516[GeV]) at (447.26695097298,-223.50005496047,557.85455581178) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[9,10] 0.00060105072931956 [GeV] +Cell[10,23] 0.0002018871705301 [GeV] +Cell[12,44] 0.11910140027867 [GeV] +Cell[13,44] 0.0028279537092862 [GeV] +Cell[13,4] 0.00090323398055084 [GeV] +Cell[12,43] 0.00059903827090717 [GeV] +### Total energy deposition in calorimeter by a source track in 6 cells : 0.12423456413926 (GeV) + +Source track ID 5857 (e-,0.00059969508604626[GeV]) at (157.31882995655,474.60592678674,1188.264184627) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[15,9] 8.8696176046264e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 8.8696176046264e-05 (GeV) + +Source track ID 5843 (pi+,0.37517245371602[GeV]) at (183.97194995993,464.92399553899,1248.5276665099) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[16,7] 0.00047583037288848 [GeV] +Cell[17,40] 5.7450168533251e-06 [GeV] +Cell[15,7] 9.6783890080587e-07 [GeV] +Cell[12,44] 6.0260077589192e-07 [GeV] +Cell[16,28] 2.2972031729296e-08 [GeV] +Cell[16,40] 4.5595088158734e-07 [GeV] +Cell[16,8] 0.2659386325498 [GeV] +Cell[15,8] 0.00024064562882722 [GeV] +Cell[11,42] 1.06522196279e-06 [GeV] +Cell[11,44] 0.0051638262662233 [GeV] +Cell[11,43] 0.00010653409521626 [GeV] +Cell[15,9] 4.8748770495877e-07 [GeV] +Cell[16,9] 0.018102042001871 [GeV] +Cell[18,42] 2.8276437660679e-08 [GeV] +Cell[17,16] 0.00034538847837689 [GeV] +Cell[17,17] 3.8617072505076e-08 [GeV] +Cell[18,16] 4.4304652533356e-08 [GeV] +Cell[17,13] 6.9986189773772e-06 [GeV] +Cell[17,12] 1.5392700734083e-05 [GeV] +Cell[17,26] 5.1053001370747e-06 [GeV] +Cell[17,27] 0.00019137627549719 [GeV] +Cell[16,13] 1.037395268213e-05 [GeV] +Cell[16,12] 2.1282490051817e-06 [GeV] +Cell[18,20] 0.00014811732478643 [GeV] +Cell[18,21] 5.4256656653706e-08 [GeV] +Cell[17,45] 1.5536146106683e-05 [GeV] +Cell[17,44] 2.1141723846085e-07 [GeV] +Cell[18,8] 1.290858263701e-05 [GeV] +Cell[18,9] 1.9126015831716e-07 [GeV] +Cell[15,6] 8.2176882187923e-10 [GeV] +### Total energy deposition in calorimeter by a source track in 30 cells : 0.29079075258686 (GeV) + +Source track ID 5831 (pi-,0.48298003896801[GeV]) at (179.76896826232,-466.56523450628,107.25094228369) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[8,11] 0.00035369424708438 [GeV] +Cell[8,6] 0.09560116858585 [GeV] +Cell[9,5] 0.00027870791033956 [GeV] +Cell[9,38] 0.0013045327310155 [GeV] +Cell[10,37] 0.0064017751273927 [GeV] +Cell[9,6] 0.0014271840195145 [GeV] +Cell[10,23] 1.0925577953458e-10 [GeV] +Cell[10,22] 2.0948403039256e-07 [GeV] +Cell[10,38] 0.062130289690593 [GeV] +Cell[10,40] 0.010452762101417 [GeV] +Cell[10,39] 0.10473267931194 [GeV] +Cell[11,37] 0.0060043527845774 [GeV] +Cell[11,40] 7.7071897635506e-08 [GeV] +Cell[9,43] 3.2641723997585e-05 [GeV] +Cell[11,36] 0.0010014518939122 [GeV] +Cell[11,35] 0.00039877477283665 [GeV] +Cell[9,3] 1.0110154020367e-05 [GeV] +Cell[12,36] 0.00013513503106606 [GeV] +Cell[12,37] 0.00030244905909967 [GeV] +Cell[11,38] 4.0367516362494e-07 [GeV] +Cell[8,5] 0.0036381033462474 [GeV] +Cell[10,36] 2.680499108817e-05 [GeV] +Cell[10,35] 0.004449720841436 [GeV] +Cell[9,42] 0.00095394215100645 [GeV] +Cell[14,19] 2.9858475754054e-05 [GeV] +Cell[11,42] 4.0058961569684e-06 [GeV] +Cell[11,41] 1.4869456991846e-05 [GeV] +Cell[11,43] 1.178093363626e-05 [GeV] +Cell[10,43] 7.1989265714819e-05 [GeV] +Cell[10,42] 0.00054319571869053 [GeV] +Cell[12,42] 4.9729594902601e-06 [GeV] +Cell[10,41] 0.0019761940614393 [GeV] +Cell[14,39] 0.00025667262450395 [GeV] +Cell[14,38] 1.1421864044223e-06 [GeV] +Cell[12,6] 0.00018452673345246 [GeV] +Cell[14,18] 0.00071092299950215 [GeV] +Cell[7,14] 6.0411210737357e-05 [GeV] +Cell[13,20] 0.00036052238115826 [GeV] +Cell[9,37] 0.0028035273447552 [GeV] +Cell[9,36] 8.3592710493349e-05 [GeV] +Cell[9,41] 0.0009198264876718 [GeV] +Cell[9,4] 6.5707897010725e-06 [GeV] +### Total energy deposition in calorimeter by a source track in 42 cells : 0.30768155305104 (GeV) + +Source track ID 5809 (pi+,0.9682457133246[GeV]) at (-70.872242565705,-494.95163928783,1187.0926005189) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[13,19] 0.0019982382573454 [GeV] +Cell[15,32] 0.00032405668573824 [GeV] +Cell[17,40] 0.00095446772706282 [GeV] +Cell[12,23] 8.8587480365277e-05 [GeV] +Cell[16,0] 9.5701852785623e-07 [GeV] +Cell[14,7] 0.0017162305161789 [GeV] +Cell[14,45] 9.7108510317412e-08 [GeV] +Cell[13,18] 8.7742578055895e-05 [GeV] +Cell[12,22] 0.00021136607554547 [GeV] +Cell[16,19] 5.4994799597807e-08 [GeV] +Cell[15,36] 0.00036159075439082 [GeV] +Cell[12,44] 8.7659259312431e-06 [GeV] +Cell[12,45] 0.00029365880856665 [GeV] +Cell[13,16] 5.8014676194489e-06 [GeV] +Cell[17,24] 6.1199038918858e-06 [GeV] +Cell[18,24] 9.013662745474e-07 [GeV] +Cell[15,40] 0.0015128434935889 [GeV] +Cell[15,41] 7.9290244034496e-05 [GeV] +Cell[14,33] 1.7963857692394e-07 [GeV] +Cell[14,17] 5.7704232877995e-05 [GeV] +Cell[13,17] 0.00042145513203752 [GeV] +Cell[13,0] 1.9438036042629e-07 [GeV] +Cell[13,47] 8.9679266896837e-05 [GeV] +Cell[11,45] 3.1110051160795e-05 [GeV] +Cell[14,19] 8.565527168571e-06 [GeV] +Cell[12,7] 3.7672633334637e-05 [GeV] +Cell[17,39] 0.003952649701395 [GeV] +Cell[14,9] 0.0010856173538505 [GeV] +Cell[16,6] 1.0144748512175e-07 [GeV] +Cell[16,41] 3.2611014659096e-06 [GeV] +Cell[11,47] 0.00033494341299673 [GeV] +Cell[16,18] 0.00027678798399415 [GeV] +Cell[17,20] 7.8870136676414e-05 [GeV] +Cell[16,17] 0.0003287618071447 [GeV] +Cell[17,38] 1.0684509790735e-05 [GeV] +Cell[15,39] 0.00013711894877929 [GeV] +Cell[16,16] 7.3803792864737e-06 [GeV] +Cell[11,44] 1.1067910577367e-08 [GeV] +Cell[13,1] 0.0022243770919133 [GeV] +Cell[15,28] 0.00026198464608187 [GeV] +Cell[13,46] 0.0025431800999015 [GeV] +Cell[12,21] 4.1913775589819e-08 [GeV] +Cell[15,35] 0.0051807779586671 [GeV] +Cell[15,45] 0.0019090252519682 [GeV] +Cell[15,46] 0.0016693545631105 [GeV] +Cell[15,0] 0.00045723572879638 [GeV] +Cell[14,8] 0.00095053616937932 [GeV] +Cell[19,46] 6.7910392826889e-06 [GeV] +Cell[14,39] 2.232817136121e-05 [GeV] +Cell[17,18] 1.5348533515407e-05 [GeV] +Cell[14,38] 2.4331149572959e-05 [GeV] +Cell[12,16] 0.0011230952032826 [GeV] +Cell[15,37] 5.8716400235426e-06 [GeV] +Cell[15,38] 4.2725738603622e-07 [GeV] +Cell[17,36] 1.3648905223818e-08 [GeV] +Cell[17,35] 0.0014724237881433 [GeV] +Cell[16,34] 0.42697501479468 [GeV] +Cell[16,35] 0.020635762644648 [GeV] +Cell[18,35] 0.0010383322895009 [GeV] +Cell[17,37] 0.00019220318201405 [GeV] +Cell[14,34] 2.408949923165e-07 [GeV] +Cell[16,36] 4.0463001624971e-05 [GeV] +Cell[18,40] 0.00087934953966362 [GeV] +Cell[18,37] 2.6742418862113e-06 [GeV] +Cell[18,38] 0.0019218922303879 [GeV] +Cell[15,34] 0.022785904068336 [GeV] +Cell[17,41] 0.0012066065575764 [GeV] +Cell[15,9] 0.00017884471401844 [GeV] +Cell[18,42] 1.2758653610945e-08 [GeV] +Cell[17,17] 1.5775211396885e-05 [GeV] +Cell[18,20] 0.0023622798663018 [GeV] +Cell[18,21] 1.3398081364357e-08 [GeV] +Cell[18,8] 7.6487452327001e-06 [GeV] +Cell[13,20] 2.1744158166257e-06 [GeV] +Cell[18,43] 8.0023242044263e-06 [GeV] +Cell[16,10] 4.5811445814252e-05 [GeV] +Cell[17,10] 0.00070247843334641 [GeV] +Cell[17,11] 1.7261458812072e-06 [GeV] +Cell[12,17] 2.6335290254792e-05 [GeV] +Cell[15,33] 0.0016012348193351 [GeV] +Cell[16,33] 0.0024372512213036 [GeV] +Cell[18,15] 5.9967658307869e-06 [GeV] +Cell[18,25] 0.00050316204827141 [GeV] +Cell[14,23] 0.002717053311314 [GeV] +Cell[18,7] 7.6581386565522e-11 [GeV] +Cell[17,19] 0.011608020664561 [GeV] +Cell[18,39] 0.015078411334015 [GeV] +Cell[18,41] 0.00024230581734719 [GeV] +Cell[19,41] 5.7101715356112e-11 [GeV] +Cell[19,21] 4.6385692519834e-05 [GeV] +Cell[19,22] 0.00045062681312766 [GeV] +Cell[18,36] 7.5669959187508e-13 [GeV] +Cell[17,42] 0.0015337105923946 [GeV] +Cell[17,43] 2.0377757057872e-05 [GeV] +Cell[10,20] 0.00030504665024671 [GeV] +Cell[10,19] 7.711274891517e-05 [GeV] +Cell[16,24] 3.9403937989846e-08 [GeV] +Cell[16,23] 0.00015997893908411 [GeV] +Cell[19,3] 0.00066318472148123 [GeV] +Cell[18,3] 6.4342537622451e-05 [GeV] +Cell[17,23] 2.2291949944133e-05 [GeV] +Cell[17,22] 0.00038343057093711 [GeV] +Cell[17,21] 0.00075867595123111 [GeV] +Cell[16,46] 1.2146081367973e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 104 cells : 0.55010099569528 (GeV) + +Source track ID 5810 (kaon-,2.4403904703555[GeV]) at (342.10054599992,-364.64670083049,532.11366038608) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[9,10] 3.0596076328834e-05 [GeV] +Cell[8,39] 3.8159750723265e-06 [GeV] +Cell[12,39] 0.00093378012940548 [GeV] +Cell[8,38] 0.00011497607848896 [GeV] +Cell[16,32] 2.7343410773028e-05 [GeV] +Cell[16,7] 0.00073595339154785 [GeV] +Cell[16,30] 1.071465050336e-05 [GeV] +Cell[17,40] 0.00013608620630271 [GeV] +Cell[16,39] 0.0010151624519132 [GeV] +Cell[14,43] 0.25509713366002 [GeV] +Cell[13,26] 3.9731442811899e-06 [GeV] +Cell[12,3] 9.0696069582918e-06 [GeV] +Cell[14,45] 0.016887148209968 [GeV] +Cell[13,39] 0.0036964385260651 [GeV] +Cell[12,8] 0.027518461145097 [GeV] +Cell[10,25] 3.6795943742618e-08 [GeV] +Cell[14,44] 0.015018907852732 [GeV] +Cell[13,41] 0.12098283947513 [GeV] +Cell[10,40] 0.013637511338141 [GeV] +Cell[15,19] 0.00026854484062983 [GeV] +Cell[16,20] 0.0025931509119785 [GeV] +Cell[11,10] 2.3172610235633e-05 [GeV] +Cell[9,39] 0.003380750656659 [GeV] +Cell[9,40] 0.0060141356493201 [GeV] +Cell[11,40] 3.7863817474317e-06 [GeV] +Cell[15,36] 1.0310423079545e-05 [GeV] +Cell[12,44] 0.00059669268628113 [GeV] +Cell[12,45] 2.3262217184765e-06 [GeV] +Cell[8,40] 0.00012069365344428 [GeV] +Cell[13,43] 0.025702330867098 [GeV] +Cell[13,44] 0.013512632504938 [GeV] +Cell[14,40] 0.0011165932250713 [GeV] +Cell[15,40] 0.00138560130007 [GeV] +Cell[14,41] 0.024344941141441 [GeV] +Cell[15,41] 0.022009308907333 [GeV] +Cell[14,33] 1.1273093376076e-05 [GeV] +Cell[16,21] 0.00037435891815737 [GeV] +Cell[15,23] 0.0029950490279869 [GeV] +Cell[11,9] 8.263907352557e-05 [GeV] +Cell[10,10] 0.0062514116420086 [GeV] +Cell[11,8] 0.0017437443474095 [GeV] +Cell[16,38] 0.002798032493338 [GeV] +Cell[17,39] 3.4444517154952e-08 [GeV] +Cell[16,6] 1.0135596705368e-05 [GeV] +Cell[16,41] 0.0041352650838797 [GeV] +Cell[11,0] 8.2013330643349e-07 [GeV] +Cell[12,46] 0.00024617359937383 [GeV] +Cell[17,30] 0.00082646858643329 [GeV] +Cell[15,39] 0.15073493406714 [GeV] +Cell[11,42] 0.00076065983344233 [GeV] +Cell[11,41] 0.00068776001112018 [GeV] +Cell[12,41] 0.12245720931113 [GeV] +Cell[12,40] 0.019805925915138 [GeV] +Cell[12,1] 1.2353342026472e-07 [GeV] +Cell[12,42] 0.0057905778057411 [GeV] +Cell[12,2] 1.0742352643774e-05 [GeV] +Cell[8,41] 0.00069021956106201 [GeV] +Cell[13,46] 1.7143185872328e-06 [GeV] +Cell[14,36] 0.00052968335069818 [GeV] +Cell[15,35] 2.2118911147118e-11 [GeV] +Cell[15,45] 0.0010965624395874 [GeV] +Cell[13,45] 0.0075496009285541 [GeV] +Cell[15,44] 0.00045501658090086 [GeV] +Cell[12,43] 0.00013658479379399 [GeV] +Cell[14,8] 0.00097054582733561 [GeV] +Cell[10,41] 0.00026212499318535 [GeV] +Cell[19,47] 0.000221238992686 [GeV] +Cell[13,42] 0.53365743192177 [GeV] +Cell[11,2] 0.00010871317473288 [GeV] +Cell[13,40] 0.014803004733097 [GeV] +Cell[14,37] 0.0016727857821468 [GeV] +Cell[15,37] 0.010396898788293 [GeV] +Cell[15,38] 0.010065377676894 [GeV] +Cell[17,36] 0.00012882115136824 [GeV] +Cell[16,34] 7.6136544928886e-05 [GeV] +Cell[16,35] 0.0011048892039516 [GeV] +Cell[17,37] 0.00051107173368746 [GeV] +Cell[16,42] 0.00012349195231275 [GeV] +Cell[18,40] 0.004262910811105 [GeV] +Cell[17,41] 3.1439813610632e-06 [GeV] +Cell[18,42] 5.1701911725104e-05 [GeV] +Cell[15,6] 0.0010301726073794 [GeV] +Cell[9,41] 0.0015489221729801 [GeV] +Cell[16,10] 6.0387139342311e-08 [GeV] +Cell[17,10] 3.1616946216673e-09 [GeV] +Cell[16,33] 0.0060876449497763 [GeV] +Cell[18,39] 1.2163718565716e-09 [GeV] +Cell[19,22] 0.0018999772030917 [GeV] +Cell[14,42] 0.012074774339289 [GeV] +Cell[15,42] 0.049473046902792 [GeV] +Cell[15,43] 0.0023126231954401 [GeV] +Cell[17,31] 1.9686015235493e-05 [GeV] +Cell[18,30] 5.5170230552903e-09 [GeV] +Cell[18,46] 3.158880434512e-05 [GeV] +Cell[15,24] 0.00028442800103574 [GeV] +Cell[15,25] 6.9732545806573e-06 [GeV] +Cell[16,5] 0.0044524785954374 [GeV] +Cell[19,23] 0.0036333233763354 [GeV] +Cell[18,22] 2.0295288763009e-05 [GeV] +Cell[16,44] 1.1370651805009e-08 [GeV] +Cell[14,46] 0.00013700151460538 [GeV] +### Total energy deposition in calorimeter by a source track in 101 cells : 1.5485609480254 (GeV) + +Source track ID 5808 (kaon0L,0.85324689363199[GeV]) at (443.61976117133,-230.65451978727,564.59737040268) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[14,43] 0.17742224941941 [GeV] +Cell[13,26] 0.00034287868591355 [GeV] +Cell[13,25] 1.8662308604689e-05 [GeV] +Cell[14,45] 7.0420972747343e-08 [GeV] +Cell[12,8] 5.1718488657571e-07 [GeV] +Cell[12,15] 0.00079744421534327 [GeV] +Cell[14,44] 4.5357312842498e-08 [GeV] +Cell[12,44] 0.0031365114178167 [GeV] +Cell[12,45] 0.0015004529823791 [GeV] +Cell[13,43] 0.065658817884986 [GeV] +Cell[13,44] 0.084576497574578 [GeV] +Cell[14,41] 0.0029891637488478 [GeV] +Cell[15,41] 0.0041899553618451 [GeV] +Cell[11,45] 4.040984549647e-09 [GeV] +Cell[12,7] 1.0304880788681e-09 [GeV] +Cell[12,9] 0.00010936538587873 [GeV] +Cell[14,26] 0.00032158885878982 [GeV] +Cell[14,27] 0.00070195711677252 [GeV] +Cell[11,47] 0.0011985102009967 [GeV] +Cell[11,0] 0.0012902752145386 [GeV] +Cell[12,47] 0.0054103199539551 [GeV] +Cell[11,46] 6.5058481561664e-07 [GeV] +Cell[12,41] 1.1763539580102e-05 [GeV] +Cell[12,0] 0.00030169386769205 [GeV] +Cell[12,1] 1.3079557742572e-05 [GeV] +Cell[12,42] 0.00053026711210373 [GeV] +Cell[13,46] 5.8435550393256e-05 [GeV] +Cell[13,45] 0.0044212369706483 [GeV] +Cell[12,43] 0.0017692788072525 [GeV] +Cell[13,42] 2.5671673275838e-06 [GeV] +Cell[11,1] 3.6843070665782e-06 [GeV] +Cell[14,42] 0.020857468301789 [GeV] +Cell[15,42] 0.058685094588718 [GeV] +### Total energy deposition in calorimeter by a source track in 33 cells : 0.43632050872043 (GeV) + +Source track ID 5802 (pi+,4.2124179367762[GeV]) at (194.22066361275,-460.73672940826,515.82035960086) +Original primary track ID 8 (unknown,11.672977589613[GeV]) +Cell[12,39] 0.092624568121887 [GeV] +Cell[8,6] 0.00011972334201562 [GeV] +Cell[13,27] 2.1961006568745e-06 [GeV] +Cell[17,32] 0.12684885312245 [GeV] +Cell[13,26] 0.00024753862503644 [GeV] +Cell[12,23] 0.00042760259980525 [GeV] +Cell[16,0] 0.00021156109175342 [GeV] +Cell[12,26] 0.0033149153855046 [GeV] +Cell[12,28] 1.6401172615588e-09 [GeV] +Cell[12,27] 0.00032328572237565 [GeV] +Cell[13,18] 1.8211120618616e-08 [GeV] +Cell[13,39] 0.74659049502147 [GeV] +Cell[13,41] 0.0015277728343716 [GeV] +Cell[13,22] 0.00045742683257163 [GeV] +Cell[11,37] 0.0032320184030252 [GeV] +Cell[15,19] 0.00059665900468519 [GeV] +Cell[16,19] 2.3887044080766e-05 [GeV] +Cell[10,11] 3.3152707976569e-07 [GeV] +Cell[11,34] 3.6925020523313e-05 [GeV] +Cell[11,40] 1.2653345038416e-13 [GeV] +Cell[13,7] 0.0014881217872927 [GeV] +Cell[11,36] 0.0035275988767255 [GeV] +Cell[13,38] 1.1216229983507 [GeV] +Cell[11,35] 0.051055589010692 [GeV] +Cell[12,35] 0.0002796287850349 [GeV] +Cell[11,39] 0.00050646072624647 [GeV] +Cell[12,38] 0.18055908050237 [GeV] +Cell[12,44] 0.00018512316094882 [GeV] +Cell[12,36] 0.004388794748685 [GeV] +Cell[12,24] 0.0031833366570508 [GeV] +Cell[12,37] 0.048973203124677 [GeV] +Cell[13,43] 0.0031433915207099 [GeV] +Cell[13,44] 7.4556112940627e-06 [GeV] +Cell[15,1] 0.0014876403913631 [GeV] +Cell[12,30] 0.0015792701134379 [GeV] +Cell[17,24] 1.2327935080975e-05 [GeV] +Cell[14,40] 0.0013050004577957 [GeV] +Cell[14,41] 3.6316309209951e-05 [GeV] +Cell[13,35] 0.0025314444476091 [GeV] +Cell[13,36] 0.0028283603219512 [GeV] +Cell[11,38] 0.00021566378150362 [GeV] +Cell[14,16] 5.2119959844276e-05 [GeV] +Cell[13,17] 3.6507350591819e-07 [GeV] +Cell[8,5] 1.8806313164532e-09 [GeV] +Cell[19,32] 5.1563256420195e-10 [GeV] +Cell[19,33] 1.2798160291823e-06 [GeV] +Cell[12,25] 0.00067438254856063 [GeV] +Cell[13,37] 0.0087317632779266 [GeV] +Cell[10,10] 1.2873855439466e-09 [GeV] +Cell[14,9] 1.5204236842692e-07 [GeV] +Cell[14,24] 0.0031746938163195 [GeV] +Cell[14,26] 0.0022345873702176 [GeV] +Cell[12,46] 1.2600017420482e-05 [GeV] +Cell[16,18] 0.0002044324856256 [GeV] +Cell[17,30] 0.0029020002158285 [GeV] +Cell[13,6] 2.7370934335636e-05 [GeV] +Cell[16,17] 2.7969454539516e-06 [GeV] +Cell[11,41] 0.00021532401966385 [GeV] +Cell[16,16] 0.0018698825716004 [GeV] +Cell[12,41] 0.0026558420099241 [GeV] +Cell[12,40] 0.0040131649297272 [GeV] +Cell[12,42] 0.0023251141021157 [GeV] +Cell[16,1] 6.5889269727677e-06 [GeV] +Cell[11,18] 0.00093464114235451 [GeV] +Cell[14,36] 0.0010150954507263 [GeV] +Cell[15,0] 6.6003940552264e-06 [GeV] +Cell[17,33] 3.3138810540549e-06 [GeV] +Cell[13,45] 0.00083792782907005 [GeV] +Cell[12,43] 0.0070804270045505 [GeV] +Cell[14,25] 0.0020256405437436 [GeV] +Cell[13,42] 0.019487051437811 [GeV] +Cell[14,39] 0.01644747422913 [GeV] +Cell[13,40] 0.29847107978256 [GeV] +Cell[14,38] 0.014265908943978 [GeV] +Cell[11,7] 1.3859535101801e-09 [GeV] +Cell[14,35] 0.00088750160523034 [GeV] +Cell[14,37] 0.0020652576527757 [GeV] +Cell[18,34] 1.4349293625401e-05 [GeV] +Cell[11,19] 7.7512562984339e-07 [GeV] +Cell[17,27] 2.4327164283022e-11 [GeV] +Cell[16,13] 1.2714595533907e-05 [GeV] +Cell[18,8] 0.00015959262267177 [GeV] +Cell[17,31] 0.0092236203456103 [GeV] +Cell[15,17] 1.9003278255695e-05 [GeV] +Cell[13,21] 0.00054210395929567 [GeV] +Cell[14,21] 6.5977050121546e-07 [GeV] +Cell[14,22] 0.00015072605750584 [GeV] +Cell[11,20] 1.028308054174e-08 [GeV] +Cell[18,33] 2.431905689707e-05 [GeV] +Cell[18,32] 5.741894710809e-10 [GeV] +Cell[15,18] 5.1843660344275e-08 [GeV] +Cell[12,12] 3.7351727427449e-05 [GeV] +Cell[13,23] 3.3658749598544e-05 [GeV] +Cell[17,29] 0.00030303553919123 [GeV] +Cell[17,28] 1.1332065923852e-08 [GeV] +### Total energy deposition in calorimeter by a source track in 95 cells : 2.8086569564802 (GeV) + +Source track ID 5083 (kaon+,2.4806813413179[GeV]) at (287.29146207153,-409.22318582994,-439.460773207) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[8,45] 0.0017870663814066 [GeV] -Cell[8,44] 0.00028731739412024 [GeV] -Cell[6,41] 0.0023741585796471 [GeV] -Cell[6,38] 0.00031102076585648 [GeV] -Cell[5,41] 0.017675099380206 [GeV] -Cell[5,42] 0.011778053911263 [GeV] -Cell[5,43] 1.5503338813687e-06 [GeV] -Cell[6,43] 0.010479743098673 [GeV] -Cell[6,44] 0.0031004424138298 [GeV] -Cell[7,39] 0.00012552941402294 [GeV] -Cell[7,45] 0.00044948159253397 [GeV] -Cell[7,41] 3.1324670279673e-06 [GeV] -Cell[7,42] 0.00015249825365231 [GeV] -Cell[6,39] 0.084497640287913 [GeV] -Cell[6,45] 0.010284166958912 [GeV] -Cell[7,40] 0.21752671104425 [GeV] -Cell[7,44] 0.0085333300891637 [GeV] -Cell[3,42] 0.0020539350360349 [GeV] -Cell[4,43] 2.4104790782076e-08 [GeV] -Cell[4,40] 0.0076029448574928 [GeV] -Cell[4,38] 3.5832543971992e-09 [GeV] -Cell[6,42] 0.0018364919874424 [GeV] -Cell[3,41] 3.9261596236884e-07 [GeV] -Cell[6,40] 0.29287287766113 [GeV] -Cell[5,38] 0.011882865273405 [GeV] -Cell[5,39] 0.35859815737722 [GeV] -Cell[5,40] 0.84261015900816 [GeV] -Cell[5,45] 1.8763561911328e-08 [GeV] -Cell[4,41] 0.011815724285983 [GeV] -Cell[4,42] 0.0013068229745341 [GeV] -Cell[5,37] 2.1428787704281e-08 [GeV] -### Total energy deposition in calorimeter by a source track in 31 cells : 1.8999473813241 (GeV) +Cell[7,9] 0.0011502016272857 [GeV] +Cell[6,41] 0.0013537213983041 [GeV] +Cell[9,24] 4.3814516976681e-06 [GeV] +Cell[6,43] 0.071457155787974 [GeV] +Cell[9,12] 0.00011294057507371 [GeV] +Cell[8,39] 0.0010247541182072 [GeV] +Cell[13,19] 2.0659266738221e-08 [GeV] +Cell[4,42] 0.0030957318049007 [GeV] +Cell[4,40] 0.0022440311796859 [GeV] +Cell[7,30] 0.0013862526591872 [GeV] +Cell[13,31] 1.9396774005145e-06 [GeV] +Cell[9,5] 0.00013795222835756 [GeV] +Cell[9,7] 1.2159285603275e-06 [GeV] +Cell[7,45] 0.0059083407671073 [GeV] +Cell[6,36] 1.0520268022309e-05 [GeV] +Cell[8,38] 2.3607943830939e-09 [GeV] +Cell[12,29] 0.0012921336998082 [GeV] +Cell[9,6] 1.5979373371124e-05 [GeV] +Cell[11,22] 7.5115463005204e-10 [GeV] +Cell[10,22] 1.5850965908157e-06 [GeV] +Cell[8,33] 5.1839853695128e-06 [GeV] +Cell[7,18] 0.00084934853862717 [GeV] +Cell[10,40] 0.00021376622412595 [GeV] +Cell[6,35] 0.00050092200478322 [GeV] +Cell[3,12] 1.0465979779838e-05 [GeV] +Cell[5,42] 0.012143456114078 [GeV] +Cell[5,44] 0.00049346285468005 [GeV] +Cell[7,4] 1.3811458396958e-05 [GeV] +Cell[5,37] 2.8044128004694e-05 [GeV] +Cell[5,38] 0.00076122751727485 [GeV] +Cell[5,39] 5.9491778552001e-07 [GeV] +Cell[7,1] 0.0022461406535035 [GeV] +Cell[6,29] 7.6785314362496e-05 [GeV] +Cell[4,5] 0.0006924663468069 [GeV] +Cell[6,45] 0.017298674584901 [GeV] +Cell[6,44] 0.0045137504812778 [GeV] +Cell[7,44] 0.00019160428613839 [GeV] +Cell[6,40] 0.0064818496485367 [GeV] +Cell[11,40] 0.0010519105904812 [GeV] +Cell[9,43] 0.00028469791573525 [GeV] +Cell[9,3] 0.00021445542307629 [GeV] +Cell[11,27] 7.4449559615459e-06 [GeV] +Cell[11,28] 0.00054506868507065 [GeV] +Cell[7,41] 0.054227449023117 [GeV] +Cell[7,40] 1.1743479980567 [GeV] +Cell[8,40] 0.005889413080221 [GeV] +Cell[4,11] 0.00029614521442704 [GeV] +Cell[4,18] 0.0010643772758453 [GeV] +Cell[4,19] 2.2276126284851e-05 [GeV] +Cell[5,43] 0.0029708580252966 [GeV] +Cell[3,41] 0.00091989634048412 [GeV] +Cell[7,2] 2.2600235297432e-08 [GeV] +Cell[7,0] 6.9116757658776e-06 [GeV] +Cell[9,42] 3.6305617541075e-06 [GeV] +Cell[3,19] 9.3115542258602e-06 [GeV] +Cell[3,18] 0.00010628082416224 [GeV] +Cell[1,8] 0.00069085186759611 [GeV] +Cell[4,39] 0.00016595618515248 [GeV] +Cell[5,40] 3.349993460597e-05 [GeV] +Cell[7,43] 0.0010955744373759 [GeV] +Cell[5,23] 2.2381146845873e-06 [GeV] +Cell[4,38] 0.0005841973413817 [GeV] +Cell[6,46] 0.0014823671672567 [GeV] +Cell[4,6] 8.1698236172087e-06 [GeV] +Cell[3,31] 1.2305996487271e-05 [GeV] +Cell[5,22] 1.6164086788194e-05 [GeV] +Cell[8,42] 0.012228197478119 [GeV] +Cell[8,41] 0.0039961721769981 [GeV] +Cell[7,42] 0.057787072628335 [GeV] +Cell[11,21] 0.00080694613319565 [GeV] +Cell[11,5] 1.7490034910224e-05 [GeV] +Cell[10,41] 0.00068971591109243 [GeV] +Cell[10,3] 0.00032291892222452 [GeV] +Cell[10,5] 3.2862730091665e-06 [GeV] +Cell[10,4] 6.0776700547649e-07 [GeV] +Cell[11,6] 8.9737350367614e-06 [GeV] +Cell[9,36] 2.010929165408e-08 [GeV] +Cell[9,41] 1.3353538993215e-06 [GeV] +Cell[9,4] 1.4775588899738e-06 [GeV] +Cell[11,20] 0.00041680954477033 [GeV] +Cell[7,38] 0.010661592932379 [GeV] +Cell[6,37] 0.0033405229637691 [GeV] +Cell[7,39] 0.032184152190975 [GeV] +Cell[6,38] 0.038490470157446 [GeV] +Cell[7,37] 0.0038402208585162 [GeV] +Cell[7,17] 2.5382239616761e-05 [GeV] +Cell[8,36] 0.0095985432637299 [GeV] +Cell[8,37] 0.0024805456882355 [GeV] +Cell[8,35] 0.0022701936904241 [GeV] +Cell[3,40] 0.00013696615445896 [GeV] +Cell[9,13] 8.7131917243823e-06 [GeV] +Cell[8,16] 1.6603909898549e-08 [GeV] +Cell[5,41] 0.0099968190083809 [GeV] +Cell[6,42] 0.009354072915494 [GeV] +Cell[6,39] 0.016435024699322 [GeV] +Cell[6,33] 1.8834514776245e-08 [GeV] +Cell[8,43] 0.001652645168065 [GeV] +Cell[8,44] 1.6903949789139e-05 [GeV] +Cell[7,36] 1.9500997609612e-08 [GeV] +Cell[4,41] 0.005764420376155 [GeV] +Cell[2,41] 7.3308972969244e-05 [GeV] +Cell[9,22] 0.0010768396873601 [GeV] +Cell[9,23] 7.247356001335e-05 [GeV] +Cell[6,47] 4.8319611087209e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 104 cells : 1.605589099181 (GeV) -Source track ID 6465 (gamma,0.0088670142206499[GeV]) at (-499.86497242016,11.619352279283,497.57084608094) +Source track ID 5275 (e-,0.19383715902232[GeV]) at (-497.71925700256,47.702633143426,490.66858824915) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[12,24] 0.00048501784228739 [GeV] -Cell[12,23] 0.0083819963783625 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.0088670142206499 (GeV) +Cell[12,23] 0.19200992522403 [GeV] +Cell[8,36] 0.0001163381003281 [GeV] +Cell[17,47] 0.00055498724046217 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.19268125056482 (GeV) -Source track ID 6466 (e-,0.00087946258262003[GeV]) at (-439.77899316311,-237.895853626,1135.3142606494) +Source track ID 5273 (gamma,0.00048705893825444[GeV]) at (-492.27396957807,87.557631739636,289.49627099227) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[15,27] 0.00010332872755502 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00010332872755502 (GeV) +Cell[11,22] 0.00048705893825444 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00048705893825444 (GeV) -Source track ID 6471 (gamma,0.0002257190587733[GeV]) at (-359.20417154291,-347.81081516562,796.0496499055) +Source track ID 5274 (gamma,0.89164369738079[GeV]) at (-456.12362170126,204.82002276664,886.89509868229) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[13,29] 0.0002257190587733 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.0002257190587733 (GeV) +Cell[16,31] 0.0022121329012234 [GeV] +Cell[13,39] 0.00051099891 [GeV] +Cell[16,19] 0.0015154841815291 [GeV] +Cell[15,2] 0.00080086638967903 [GeV] +Cell[13,36] 0.00051099891 [GeV] +Cell[16,21] 0.00079412047851853 [GeV] +Cell[15,21] 0.019259342376639 [GeV] +Cell[15,23] 0.0019931906533311 [GeV] +Cell[11,45] 0.00027251157849966 [GeV] +Cell[14,20] 0.79476282385116 [GeV] +Cell[14,19] 0.0047846851040409 [GeV] +Cell[11,0] 0.0015826540351244 [GeV] +Cell[12,0] 0.00079559185279212 [GeV] +Cell[17,34] 0.0024066506659147 [GeV] +Cell[14,21] 0.0091391045087382 [GeV] +Cell[17,7] 0.0005171893853754 [GeV] +Cell[15,20] 0.028627470677985 [GeV] +Cell[17,46] 0.00051099891 [GeV] +Cell[15,5] 0.00031438382937529 [GeV] +Cell[15,22] 0.00013622734802326 [GeV] +Cell[15,15] 0.00040117176749372 [GeV] +### Total energy deposition in calorimeter by a source track in 21 cells : 0.87184859831544 (GeV) -Source track ID 6437 (e-,0.16053530339216[GeV]) at (-431.06801911906,253.3384354826,1332.1048462227) +Source track ID 5241 (pi-,0.85427826623185[GeV]) at (-164.58757840846,472.13443957589,872.95415985974) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[16,17] 0.00061616661405021 [GeV] -Cell[16,3] 0.00042535187869732 [GeV] -Cell[16,0] 0.0011646495377989 [GeV] -Cell[18,35] 0.00051099891 [GeV] -Cell[16,19] 0.15335057972147 [GeV] -Cell[17,19] 0.00086222757090154 [GeV] -Cell[17,6] 0.00036231832046832 [GeV] -Cell[16,20] 0.0021206807594039 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.15941297331279 (GeV) +Cell[16,2] 3.1668956798967e-05 [GeV] +Cell[16,26] 2.9031281543098e-05 [GeV] +Cell[18,29] 0.0023500929710118 [GeV] +Cell[15,14] 0.0060854921807783 [GeV] +Cell[14,15] 0.041747219487288 [GeV] +Cell[13,18] 5.3614287575101e-06 [GeV] +Cell[15,19] 1.0326793249078e-06 [GeV] +Cell[15,1] 0.00012910432738443 [GeV] +Cell[14,16] 0.034301248354222 [GeV] +Cell[14,17] 0.0035256459337867 [GeV] +Cell[13,17] 0.0011470297001082 [GeV] +Cell[14,19] 5.987189535972e-08 [GeV] +Cell[16,25] 8.9752495967332e-05 [GeV] +Cell[16,18] 0.0033822605910404 [GeV] +Cell[16,29] 1.1152884690091e-05 [GeV] +Cell[16,17] 0.045013920434881 [GeV] +Cell[16,16] 0.018173612550643 [GeV] +Cell[12,1] 2.052273553204e-05 [GeV] +Cell[13,1] 5.6334806367886e-07 [GeV] +Cell[12,2] 0.0010648197806132 [GeV] +Cell[15,45] 0.00013533078832791 [GeV] +Cell[15,46] 0.001112103023296 [GeV] +Cell[14,14] 0.11034601429284 [GeV] +Cell[13,2] 2.4043950247687e-08 [GeV] +Cell[15,3] 0.00076888315636063 [GeV] +Cell[15,44] 4.6441984013654e-06 [GeV] +Cell[17,18] 0.00061068444321347 [GeV] +Cell[16,15] 0.013919359631811 [GeV] +Cell[14,18] 0.000299049022232 [GeV] +Cell[17,17] 0.00076072945157198 [GeV] +Cell[17,27] 2.881182229612e-05 [GeV] +Cell[16,13] 0.00069436453140679 [GeV] +Cell[16,12] 1.0544703133291e-05 [GeV] +Cell[15,43] 1.3954954658402e-05 [GeV] +Cell[18,30] 0.00078249014432981 [GeV] +Cell[15,17] 0.0097683535243848 [GeV] +Cell[15,18] 0.0048868351972953 [GeV] +Cell[17,29] 0.00049025011594824 [GeV] +Cell[15,15] 0.2039421438797 [GeV] +Cell[15,16] 0.028250068639044 [GeV] +Cell[15,47] 3.5070115700364e-11 [GeV] +Cell[16,11] 9.7187056962866e-06 [GeV] +Cell[16,14] 0.0033406090346407 [GeV] +Cell[17,25] 1.6080835064713e-05 [GeV] +Cell[16,3] 8.7369955227814e-06 [GeV] +Cell[15,13] 0.0025823869251846 [GeV] +Cell[14,12] 0.00062319187488617 [GeV] +Cell[14,11] 4.5764408423565e-07 [GeV] +Cell[18,28] 0.0027204438389839 [GeV] +Cell[18,27] 2.2200398461791e-09 [GeV] +### Total energy deposition in calorimeter by a source track in 50 cells : 0.54323585966771 (GeV) -Source track ID 6454 (gamma,6.8511874090976e-05[GeV]) at (497.38769825107,51.04387944214,1613.4987795577) +Source track ID 5236 (mu+,0.31288941442066[GeV]) at (-380.6115751571,-324.24501361846,-460.42801049666) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[18,0] 6.8511874090976e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 6.8511874090976e-05 (GeV) +Cell[7,29] 0.054711187872854 [GeV] +Cell[7,28] 0.18662365041111 [GeV] +Cell[6,28] 0.0022245389371972 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.24355937722116 (GeV) -Source track ID 6438 (e+,0.018786250864411[GeV]) at (486.30919270332,116.2039977464,1641.4538700037) +Source track ID 5223 (kaon-,0.64993488040168[GeV]) at (453.75902844824,-210.00653347386,328.45962456422) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[17,24] 0.00097204425197133 [GeV] -Cell[18,35] 0.002062531413956 [GeV] -Cell[17,22] 0.00051099891 [GeV] -Cell[15,27] 8.0424296940034e-05 [GeV] -Cell[18,1] 0.01432431941592 [GeV] -Cell[10,15] 0.00012913216565135 [GeV] -Cell[19,35] 0.00051099891 [GeV] -Cell[18,2] 0.00050024155939914 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.019090690923838 (GeV) +Cell[17,40] 5.3521944209933e-11 [GeV] +Cell[16,39] 0.00025906734657633 [GeV] +Cell[11,13] 2.313637119255e-05 [GeV] +Cell[10,46] 0.00089221457727018 [GeV] +Cell[10,44] 9.1187911493762e-08 [GeV] +Cell[12,44] 4.4717744458467e-09 [GeV] +Cell[12,45] 0.00058876119203728 [GeV] +Cell[11,45] 0.37820625536267 [GeV] +Cell[1,28] 0.0002851322798021 [GeV] +Cell[16,40] 7.9034706504899e-06 [GeV] +Cell[17,39] 0.00023443928322354 [GeV] +Cell[11,47] 0.0046452612719769 [GeV] +Cell[12,46] 0.0073214915728463 [GeV] +Cell[11,46] 0.014253617744469 [GeV] +Cell[17,38] 2.2962743940298e-05 [GeV] +Cell[11,42] 8.1097197287363e-06 [GeV] +Cell[11,12] 4.3209979139647e-08 [GeV] +Cell[11,44] 0.15571657051883 [GeV] +Cell[11,43] 0.0018640918315873 [GeV] +Cell[10,43] 4.0160375647247e-10 [GeV] +Cell[12,43] 1.4641901998402e-08 [GeV] +Cell[11,1] 0.0024888884009754 [GeV] +Cell[15,18] 8.4538560477085e-06 [GeV] +Cell[12,12] 2.7212081477046e-11 [GeV] +### Total energy deposition in calorimeter by a source track in 24 cells : 0.56682651153773 (GeV) -Source track ID 6436 (gamma,0.89164369738079[GeV]) at (-456.12361555883,204.82003644552,886.89514051114) +Source track ID 5220 (gamma,0.062293140479318[GeV]) at (-277.09244964282,416.19679762216,226.70071536516) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[18,41] 0.0013637467627819 [GeV] -Cell[14,32] 0.00027804568870876 [GeV] -Cell[19,39] 0.00041629215805406 [GeV] -Cell[13,8] 0.00032010914873806 [GeV] -Cell[14,20] 0.81961960843532 [GeV] -Cell[14,21] 0.036050262893429 [GeV] -Cell[14,39] 0.0044392737945217 [GeV] -Cell[16,37] 0.00074931382664051 [GeV] -Cell[18,34] 0.001725417644606 [GeV] -Cell[11,42] 0.0005753216334188 [GeV] -Cell[19,9] 0.0021357821956296 [GeV] -Cell[17,8] 0.00040747382054107 [GeV] -Cell[19,37] 0.00020722425945472 [GeV] -Cell[15,20] 0.0021608805376629 [GeV] -Cell[15,21] 0.0062031873290084 [GeV] -Cell[15,22] 0.0005115708275814 [GeV] -Cell[14,22] 8.8812666945159e-09 [GeV] -Cell[18,31] 0.0029263341259508 [GeV] -Cell[14,19] 0.0014143187829975 [GeV] -Cell[19,42] 0.00015299733485993 [GeV] -### Total energy deposition in calorimeter by a source track in 20 cells : 0.88165717008118 (GeV) - -Source track ID 6410 (pi-,0.85425011255986[GeV]) at (-164.71414325867,472.09029963616,872.49027524565) -Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[6,19] 0.0025476823440041 [GeV] -Cell[13,33] 0.0024792545035243 [GeV] -Cell[6,43] 3.8340642058756e-06 [GeV] -Cell[7,47] 1.205149425823e-05 [GeV] -Cell[14,44] 0.1438050002344 [GeV] -Cell[14,43] 0.00098185325199748 [GeV] -Cell[8,37] 7.404780756508e-05 [GeV] -Cell[19,4] 6.5189377055503e-06 [GeV] -Cell[16,30] 3.7745248027932e-07 [GeV] -Cell[16,29] 2.8608570573851e-08 [GeV] -Cell[16,17] 3.0730359412701e-10 [GeV] -Cell[16,21] 0.00066115240492536 [GeV] -Cell[13,46] 1.6473273990414e-06 [GeV] -Cell[15,46] 0.001367663265757 [GeV] -Cell[11,27] 4.3325957744855e-07 [GeV] -Cell[14,26] 0.00010292792340681 [GeV] -Cell[11,24] 1.3090213440591e-05 [GeV] -Cell[12,24] 0.00045783034052329 [GeV] -Cell[12,26] 0.0010608898873826 [GeV] -Cell[10,24] 1.0604450653773e-06 [GeV] -Cell[12,22] 2.5601147208363e-06 [GeV] -Cell[13,23] 0.00069883668780353 [GeV] -Cell[9,43] 9.4876037678659e-08 [GeV] -Cell[10,43] 1.1403413686821e-06 [GeV] -Cell[10,2] 1.1771540739574e-06 [GeV] -Cell[8,0] 8.4259318441582e-08 [GeV] -Cell[11,18] 4.117477746729e-05 [GeV] -Cell[11,26] 3.5601703984867e-10 [GeV] -Cell[14,0] 6.8966865313769e-06 [GeV] -Cell[9,40] 8.5433105705306e-06 [GeV] -Cell[12,12] 1.7829991228382e-06 [GeV] -Cell[14,12] 9.2149955453351e-06 [GeV] -Cell[15,13] 4.8825352450876e-08 [GeV] -Cell[11,14] 2.5527185061947e-07 [GeV] -Cell[4,17] 2.2361695300788e-08 [GeV] -Cell[4,22] 0.00025960592977424 [GeV] -Cell[0,6] 0.0012631485582342 [GeV] -Cell[15,15] 0.011891411301322 [GeV] -Cell[15,16] 0.0060949826585982 [GeV] -Cell[16,16] 9.1534456632189e-05 [GeV] -Cell[16,15] 0.00078621088600607 [GeV] -Cell[9,44] 4.0481350310984e-08 [GeV] -Cell[14,36] 0.0014426970686153 [GeV] -Cell[14,20] 1.4061707770452e-07 [GeV] -Cell[14,24] 6.7570086963686e-07 [GeV] -Cell[14,25] 0.00046271746886448 [GeV] -Cell[13,19] 1.4677346596727e-05 [GeV] -Cell[15,44] 1.7665558028739e-06 [GeV] -Cell[16,44] 1.4119499217486e-05 [GeV] -Cell[15,43] 0.00031421927888289 [GeV] -Cell[16,42] 7.2101091615195e-06 [GeV] -Cell[13,45] 0.0010418233938035 [GeV] -Cell[4,23] 6.2356381795325e-05 [GeV] -Cell[4,21] 6.8646756062662e-07 [GeV] -Cell[4,20] 2.923841681195e-07 [GeV] -Cell[7,0] 7.3792015200524e-09 [GeV] -Cell[8,41] 0.001126830693476 [GeV] -Cell[12,8] 0.00013244143627173 [GeV] -Cell[11,7] 4.5297347242013e-08 [GeV] -Cell[12,13] 0.011228395319011 [GeV] -Cell[12,14] 0.037065611845686 [GeV] -Cell[13,44] 0.00098425454813776 [GeV] -Cell[13,43] 0.00066762329952243 [GeV] -Cell[15,17] 4.145190583813e-06 [GeV] -Cell[14,40] 3.9403617847711e-08 [GeV] -Cell[16,37] 7.3031680076383e-06 [GeV] -Cell[16,19] 7.6572494346692e-05 [GeV] -Cell[17,21] 0.00085845380568148 [GeV] -Cell[17,22] 0.000219552838588 [GeV] -Cell[15,34] 2.880409010686e-08 [GeV] -Cell[17,41] 0.00033797418857489 [GeV] -Cell[16,8] 2.8923961217515e-06 [GeV] -Cell[16,7] 0.00099173964211718 [GeV] -Cell[16,6] 4.073702370988e-09 [GeV] -Cell[17,18] 0.0011419428528878 [GeV] -Cell[14,7] 4.0201113158673e-06 [GeV] -Cell[14,41] 5.0694186938927e-08 [GeV] -Cell[14,16] 0.0034366626352661 [GeV] -Cell[14,17] 0.0019774905597774 [GeV] -Cell[15,14] 0.0033263213716832 [GeV] -Cell[10,26] 2.9786203231197e-06 [GeV] -Cell[13,15] 0.00025443781039303 [GeV] -Cell[14,15] 0.15806185768492 [GeV] -Cell[12,37] 2.1125698694959e-06 [GeV] -Cell[11,37] 0.0015390991344461 [GeV] -Cell[16,20] 1.6005215672976e-07 [GeV] -Cell[14,14] 0.023722027004611 [GeV] -Cell[14,13] 0.00017584736511162 [GeV] -Cell[13,24] 0.00082236764398059 [GeV] -Cell[15,0] 4.115899365388e-05 [GeV] -Cell[15,47] 0.00037952764242198 [GeV] -Cell[8,38] 0.00022332476355291 [GeV] -Cell[11,38] 0.0020852318915509 [GeV] -Cell[18,28] 0.0040278297149815 [GeV] -Cell[19,28] 0.00019538983969198 [GeV] -Cell[19,29] 2.3915168792428e-06 [GeV] -Cell[18,27] 5.2632756786579e-06 [GeV] -Cell[19,27] 4.8203924052359e-10 [GeV] -Cell[18,29] 0.0038603966057829 [GeV] -Cell[8,47] 1.5645234630028e-06 [GeV] -Cell[16,14] 1.6405332426075e-06 [GeV] -Cell[16,22] 0.0021035145577133 [GeV] -Cell[13,14] 0.012688858504793 [GeV] -Cell[13,13] 0.0078857654401546 [GeV] -Cell[13,12] 0.00044717309265616 [GeV] -### Total energy deposition in calorimeter by a source track in 105 cells : 0.46021981694858 (GeV) - -Source track ID 6370 (pi+,0.42635013696094[GeV]) at (-362.90421503807,-343.94844193222,-452.38529146551) -Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[7,30] 0.00032443487969977 [GeV] -Cell[9,32] 0.00067412050702397 [GeV] -Cell[7,29] 0.31767556123968 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.31867411662641 (GeV) - -Source track ID 6371 (kaon-,0.64272953589267[GeV]) at (453.13517731004,-211.34926326864,323.84052809368) -Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[5,11] 0.00051729024894385 [GeV] -Cell[12,5] 3.417848187155e-07 [GeV] -Cell[13,46] 0.0070810789585669 [GeV] -Cell[12,6] 1.8957944121212e-09 [GeV] -Cell[10,43] 6.949994713068e-10 [GeV] -Cell[8,28] 0.00011237194119713 [GeV] -Cell[13,8] 2.489057223147e-05 [GeV] -Cell[13,47] 0.00097263865842751 [GeV] -Cell[14,0] 4.0047278162092e-08 [GeV] -Cell[13,0] 0.0047984488946607 [GeV] -Cell[12,9] 1.7495496308584e-08 [GeV] -Cell[3,11] 6.6985003941227e-06 [GeV] -Cell[3,7] 1.2459118530387e-05 [GeV] -Cell[2,36] 5.8333795555882e-05 [GeV] -Cell[2,37] 0.00016745837955023 [GeV] -Cell[3,18] 3.9004644495435e-06 [GeV] -Cell[11,43] 1.4117844818884e-07 [GeV] -Cell[11,44] 0.30226270192458 [GeV] -Cell[12,44] 0.0023699185761051 [GeV] -Cell[12,13] 1.9387583597563e-06 [GeV] -Cell[12,45] 0.0023268388983726 [GeV] -Cell[12,46] 3.3904567575405e-05 [GeV] -Cell[14,46] 4.5538315839622e-07 [GeV] -Cell[12,4] 9.9118171460304e-05 [GeV] -Cell[12,3] 1.0636114369845e-05 [GeV] -Cell[12,2] 7.9980644222815e-06 [GeV] -Cell[11,45] 0.18084522090925 [GeV] -Cell[10,46] 4.9264613153355e-09 [GeV] -Cell[13,9] 3.2178628543988e-09 [GeV] -Cell[8,27] 7.9684796801303e-06 [GeV] -Cell[12,1] 1.7011460731737e-06 [GeV] -Cell[3,17] 4.2262196948286e-06 [GeV] -Cell[11,46] 0.0023471005506997 [GeV] -Cell[13,7] 3.8737291674806e-08 [GeV] -Cell[12,0] 6.1472545326069e-08 [GeV] -### Total energy deposition in calorimeter by a source track in 35 cells : 0.50407594874731 (GeV) - -Source track ID 6368 (gamma,0.062293140479318[GeV]) at (-277.09244439676,416.19680111484,226.70071890975) -Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[11,16] 0.0556588638028 [GeV] -Cell[10,18] 0.0029361643695442 [GeV] -Cell[11,17] 0.0036981123069737 [GeV] +Cell[10,16] 0.00084307914632173 [GeV] +Cell[10,15] 0.00075181211790888 [GeV] +Cell[11,16] 0.060698249215087 [GeV] ### Total energy deposition in calorimeter by a source track in 3 cells : 0.062293140479318 (GeV) -Source track ID 6369 (gamma,0.18169391742921[GeV]) at (418.45379175316,273.67211068613,279.34342923354) +Source track ID 5221 (gamma,0.18169391742921[GeV]) at (418.453792987,273.67210879956,279.34342820112) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[11,5] 0.0011007700013977 [GeV] -Cell[11,3] 0.0028544986047092 [GeV] -Cell[11,4] 0.1777386488231 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.18169391742921 (GeV) +Cell[12,3] 0.00035516878173073 [GeV] +Cell[10,45] 0.00046809308285531 [GeV] +Cell[11,4] 0.17196640732181 [GeV] +Cell[10,18] 0.00023182778621991 [GeV] +Cell[12,4] 0.00079607493058558 [GeV] +Cell[11,3] 0.0078763455260046 [GeV] +### Total energy deposition in calorimeter by a source track in 6 cells : 0.18169391742921 (GeV) -Source track ID 6343 (kaon+,1.7504356296508[GeV]) at (75.704142571268,494.23565512572,1964.9179656702) +Source track ID 5200 (kaon+,1.7504928303317[GeV]) at (75.402601675293,494.28174926918,1963.056349445) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[19,10] 0.04757544556447 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.04757544556447 (GeV) +Cell[19,10] 0.042507068510276 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.042507068510276 (GeV) -Source track ID 6209 (pi-,0.45866977743498[GeV]) at (-499.95853591605,-6.4391276336936,-198.77400504074) +Source track ID 5087 (pi-,0.4566696063168[GeV]) at (-499.95055841529,-7.0312971950056,-205.66966805076) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[7,25] 0.00071432166354816 [GeV] -Cell[6,9] 8.6934143619146e-06 [GeV] -Cell[6,8] 0.00036580754280999 [GeV] -Cell[7,27] 0.0012490674207683 [GeV] -Cell[8,22] 7.2478798621319e-05 [GeV] -Cell[8,23] 0.00045562963528982 [GeV] -Cell[10,24] 3.0252906377427e-05 [GeV] -Cell[9,21] 7.0941268859315e-11 [GeV] -Cell[8,21] 0.0022236390594106 [GeV] -Cell[8,28] 0.0019329300913852 [GeV] -Cell[4,2] 0.0082809656538101 [GeV] -Cell[4,3] 0.00015744850908777 [GeV] -Cell[4,4] 3.0256902291512e-06 [GeV] -Cell[9,23] 0.0001980180352657 [GeV] -Cell[8,24] 0.21402576097267 [GeV] -Cell[8,26] 0.011417059688049 [GeV] -Cell[3,5] 0.00097457208289484 [GeV] -Cell[4,5] 1.4144825747962e-05 [GeV] -Cell[4,6] 1.0885206789453e-05 [GeV] -Cell[3,4] 0.0070127835487346 [GeV] -Cell[6,29] 4.7412006301784e-07 [GeV] -Cell[6,28] 5.5875749467305e-09 [GeV] -Cell[7,26] 0.0074324165997784 [GeV] -Cell[8,25] 0.04145603014613 [GeV] -Cell[7,24] 0.0010007166770725 [GeV] -Cell[10,25] 0.00034635971976184 [GeV] -Cell[9,26] 1.0912316758208e-05 [GeV] -Cell[8,27] 3.2056414056569e-09 [GeV] -Cell[9,24] 0.0052899611165675 [GeV] -Cell[9,25] 0.0042450219762606 [GeV] -Cell[3,3] 0.010199517665878 [GeV] -### Total energy deposition in calorimeter by a source track in 31 cells : 0.31912890394828 (GeV) +Cell[9,24] 0.0011570245880523 [GeV] +Cell[6,25] 8.8959656068255e-09 [GeV] +Cell[6,26] 1.2428678983952e-05 [GeV] +Cell[8,24] 0.1218924301977 [GeV] +Cell[8,23] 9.9964672699571e-09 [GeV] +Cell[7,25] 7.395650589865e-05 [GeV] +Cell[8,25] 0.22154677319398 [GeV] +Cell[8,27] 0.0013165166370013 [GeV] +Cell[9,26] 0.0010890760259882 [GeV] +Cell[8,26] 0.010233165207608 [GeV] +Cell[7,26] 0.001332947688729 [GeV] +Cell[9,25] 0.0015703010567005 [GeV] +### Total energy deposition in calorimeter by a source track in 12 cells : 0.36022463867308 (GeV) -Source track ID 6330 (gamma,0.43032370642417[GeV]) at (-193.66745936383,460.96953823822,1404.1020563198) +Source track ID 5189 (gamma,0.43032370642417[GeV]) at (-193.66746366997,460.96953642908,1404.1020509541) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[16,19] 0.00051099891 [GeV] -Cell[17,14] 0.039598129605155 [GeV] -Cell[19,9] 0.0023445742943899 [GeV] -Cell[19,24] 0.0036080248240759 [GeV] -Cell[17,15] 0.37393395402374 [GeV] -Cell[17,16] 0.0002029829378234 [GeV] -Cell[15,25] 0.0014540162916239 [GeV] -Cell[19,32] 0.00047963928847965 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.42213232017529 (GeV) +Cell[15,1] 0.00040434526392126 [GeV] +Cell[17,13] 0.0011917440596187 [GeV] +Cell[16,13] 0.00029468083016432 [GeV] +Cell[17,15] 0.38882498123071 [GeV] +Cell[17,14] 0.036419639786284 [GeV] +Cell[19,35] 0.00021914078097082 [GeV] +Cell[19,36] 0.00029185812902918 [GeV] +### Total energy deposition in calorimeter by a source track in 7 cells : 0.4276463900807 (GeV) -Source track ID 6331 (gamma,0.84468519705162[GeV]) at (143.95468839671,478.82882921625,1448.6318377193) +Source track ID 5190 (gamma,0.84468519705162[GeV]) at (143.9546907397,478.82882851186,1448.6318355152) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[18,41] 0.00037197056698921 [GeV] -Cell[17,10] 0.024916599433932 [GeV] -Cell[14,45] 0.00036989507567704 [GeV] -Cell[16,19] 0.00095183183105487 [GeV] -Cell[16,18] 0.0022246113704505 [GeV] -Cell[17,8] 0.0092972341309317 [GeV] -Cell[19,25] 0.00051099891 [GeV] -Cell[17,9] 0.79954561759041 [GeV] -Cell[18,24] 0.00075736741465763 [GeV] -Cell[15,19] 0.00092889804726425 [GeV] -Cell[19,18] 0.0030610306455471 [GeV] -Cell[14,19] 0.00065006098948895 [GeV] -Cell[18,23] 0.00046867945907662 [GeV] -### Total energy deposition in calorimeter by a source track in 13 cells : 0.84405479546548 (GeV) +Cell[17,40] 0.00051099891 [GeV] +Cell[15,27] 0.00029715414124245 [GeV] +Cell[16,1] 0.00031661326251417 [GeV] +Cell[18,23] 0.00051099891 [GeV] +Cell[17,36] 0.0013412257830675 [GeV] +Cell[16,35] 8.0218407905399e-05 [GeV] +Cell[17,41] 0.00090224281173112 [GeV] +Cell[18,8] 0.00069030903100017 [GeV] +Cell[17,10] 0.01027237146802 [GeV] +Cell[19,22] 0.0016637756199307 [GeV] +Cell[15,43] 0.00051099891 [GeV] +Cell[16,44] 0.00041252227350471 [GeV] +Cell[14,21] 0.00051099891 [GeV] +Cell[17,14] 0.00027238517016573 [GeV] +Cell[17,9] 0.78965002056934 [GeV] +Cell[19,20] 0.0010761381968734 [GeV] +Cell[17,8] 0.00048392284788302 [GeV] +Cell[18,11] 8.7604585109358e-06 [GeV] +Cell[19,40] 0.0013704681558506 [GeV] +Cell[18,47] 0.0011736356608675 [GeV] +Cell[18,10] 0.0033594997604468 [GeV] +### Total energy deposition in calorimeter by a source track in 21 cells : 0.81541525925885 (GeV) -Source track ID 6237 (e-,0.00098911601613086[GeV]) at (-104.40737528056,-746.80516636408,2000) +Source track ID 5093 (pi-,1.1276316848768[GeV]) at (-499.9753396497,-4.9658576471182,953.16491730672) Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[19,34] 0.00047811710613086 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00047811710613086 (GeV) +Cell[8,8] 4.7452317630814e-11 [GeV] +Cell[3,44] 0.0010124268188758 [GeV] +Cell[9,9] 0.0019817291439076 [GeV] +Cell[9,10] 1.5892227014774e-05 [GeV] +Cell[9,8] 0.022188388726681 [GeV] +Cell[8,7] 8.5429712726182e-10 [GeV] +Cell[9,11] 0.0011257760589082 [GeV] +Cell[9,12] 2.2118911147118e-12 [GeV] +Cell[8,6] 3.0898279370945e-05 [GeV] +Cell[7,5] 0.010143991550522 [GeV] +Cell[9,7] 0.0065305126867213 [GeV] +Cell[4,45] 5.8837611947752e-05 [GeV] +Cell[15,14] 0.001233988035331 [GeV] +Cell[12,3] 0.00028530323802818 [GeV] +Cell[13,3] 1.6617954316303e-05 [GeV] +Cell[14,45] 0.0012355059477085 [GeV] +Cell[12,8] 5.4918183127484e-06 [GeV] +Cell[10,8] 6.2549342692364e-06 [GeV] +Cell[9,6] 0.0010443555807412 [GeV] +Cell[10,9] 2.0133134326898e-05 [GeV] +Cell[12,14] 0.00050772380885485 [GeV] +Cell[3,6] 2.1621207968565e-05 [GeV] +Cell[7,4] 0.0062333218193789 [GeV] +Cell[10,2] 5.1684663878859e-07 [GeV] +Cell[8,34] 5.8892474044114e-09 [GeV] +Cell[12,13] 0.00012363612008573 [GeV] +Cell[3,7] 7.5144294823986e-06 [GeV] +Cell[13,7] 1.0287172044627e-05 [GeV] +Cell[16,22] 0.00062617450180733 [GeV] +Cell[13,17] 1.5773211867781e-05 [GeV] +Cell[1,27] 0.0001881515278626 [GeV] +Cell[3,43] 2.5530261627864e-06 [GeV] +Cell[8,4] 2.3251501806953e-06 [GeV] +Cell[8,5] 9.9503172646109e-06 [GeV] +Cell[15,21] 2.5666425256077e-07 [GeV] +Cell[15,23] 7.8751175351499e-07 [GeV] +Cell[13,13] 4.6013624760576e-05 [GeV] +Cell[13,14] 1.1479038048265e-05 [GeV] +Cell[3,8] 6.9503918639384e-06 [GeV] +Cell[13,0] 4.5183312492213e-05 [GeV] +Cell[13,47] 0.0193332302738 [GeV] +Cell[2,23] 3.0095525144134e-06 [GeV] +Cell[4,44] 4.1368308509391e-06 [GeV] +Cell[6,5] 1.1386220285203e-06 [GeV] +Cell[2,20] 3.6719525232911e-06 [GeV] +Cell[15,26] 0.0016012460675731 [GeV] +Cell[6,4] 4.5630003118845e-05 [GeV] +Cell[10,10] 0.0022299334610175 [GeV] +Cell[14,20] 0.0018649429882847 [GeV] +Cell[14,19] 5.1176692941226e-06 [GeV] +Cell[12,10] 9.9640897133213e-10 [GeV] +Cell[12,7] 4.1043948473316e-06 [GeV] +Cell[12,9] 8.2641649464676e-07 [GeV] +Cell[16,25] 1.2010426900815e-05 [GeV] +Cell[14,24] 0.23172294924563 [GeV] +Cell[16,6] 7.0811275509186e-07 [GeV] +Cell[16,41] 0.00035880363563956 [GeV] +Cell[12,47] 0.0052992048475937 [GeV] +Cell[13,6] 9.684824210126e-06 [GeV] +Cell[13,8] 0.00092042012946136 [GeV] +Cell[12,0] 0.0003949835715066 [GeV] +Cell[12,1] 1.1552707162764e-05 [GeV] +Cell[13,1] 0.00046545934302753 [GeV] +Cell[14,29] 6.7050247025691e-09 [GeV] +Cell[14,30] 0.0002564905263863 [GeV] +Cell[12,2] 0.00094507150089021 [GeV] +Cell[13,46] 0.037241332444339 [GeV] +Cell[15,45] 0.00162053797107 [GeV] +Cell[14,25] 0.0014086318292144 [GeV] +Cell[10,3] 0.00030478021714305 [GeV] +Cell[12,6] 4.9767550081015e-12 [GeV] +Cell[16,42] 4.1273618978721e-07 [GeV] +Cell[18,37] 0.00056916649231773 [GeV] +Cell[15,6] 0.00040776052911713 [GeV] +Cell[13,20] 0.0018269033212405 [GeV] +Cell[14,23] 0.0087687580256436 [GeV] +Cell[18,36] 0.0024675113523581 [GeV] +Cell[16,24] 0.0002920168868344 [GeV] +Cell[16,23] 3.2613633433357e-05 [GeV] +Cell[15,42] 1.1920972816597e-06 [GeV] +Cell[18,46] 6.3123691652436e-06 [GeV] +Cell[15,24] 0.22452649533207 [GeV] +Cell[15,25] 0.0016750626172295 [GeV] +Cell[16,5] 2.0970010659425e-05 [GeV] +Cell[14,46] 0.046952959442858 [GeV] +Cell[14,21] 0.0032477735495407 [GeV] +Cell[14,22] 0.0012205562474262 [GeV] +Cell[15,5] 2.9397708105989e-06 [GeV] +Cell[15,22] 0.00018629702864882 [GeV] +Cell[2,27] 1.4244826363665e-05 [GeV] +Cell[2,26] 1.2723504471523e-07 [GeV] +Cell[16,43] 1.4429679140449e-10 [GeV] +Cell[3,45] 8.0816299887374e-06 [GeV] +Cell[14,13] 1.4598403940909e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 94 cells : 0.65310870117711 (GeV) -Source track ID 6215 (pi-,1.1277138028304[GeV]) at (-499.98662353434,-3.6573606238401,954.8135397093) -Original primary track ID 25 (unknown,7.7728456153487[GeV]) -Cell[13,33] 1.2294622138143e-09 [GeV] -Cell[18,6] 2.9398357507603e-05 [GeV] -Cell[16,21] 0.0012781271757517 [GeV] -Cell[14,26] 0.0094509009420176 [GeV] -Cell[13,25] 0.00019366507883103 [GeV] -Cell[11,3] 8.1221094910802e-05 [GeV] -Cell[1,23] 0.00050163016529883 [GeV] -Cell[1,5] 0.002259448491836 [GeV] -Cell[1,4] 0.0017749967544679 [GeV] -Cell[17,24] 3.7866266211495e-08 [GeV] -Cell[14,24] 0.073106994490845 [GeV] -Cell[14,25] 0.059268449021316 [GeV] -Cell[2,5] 0.00024780826017354 [GeV] -Cell[2,6] 6.4070181455236e-06 [GeV] -Cell[13,42] 4.0109674358973e-05 [GeV] -Cell[12,3] 0.0013602411449697 [GeV] -Cell[13,5] 9.8041732562706e-06 [GeV] -Cell[16,23] 0.0022013007030948 [GeV] -Cell[17,25] 0.00026070916882213 [GeV] -Cell[16,25] 0.0016929516730893 [GeV] -Cell[16,24] 0.00033573094693452 [GeV] -Cell[15,21] 0.00053455137228229 [GeV] -Cell[15,22] 0.0020738049453125 [GeV] -Cell[16,20] 5.7283875094072e-08 [GeV] -Cell[14,22] 6.0486769370982e-08 [GeV] -Cell[13,24] 0.00074944584300351 [GeV] -Cell[16,22] 0.00070915871374537 [GeV] -Cell[15,25] 0.024143457890736 [GeV] -Cell[15,24] 0.30568783212297 [GeV] -Cell[15,23] 0.044202608519363 [GeV] -Cell[15,26] 0.0019515670944951 [GeV] -Cell[14,23] 0.00097283776573602 [GeV] -Cell[16,26] 0.0041961271807788 [GeV] -Cell[17,26] 0.018732049053545 [GeV] -### Total energy deposition in calorimeter by a source track in 34 cells : 0.55805349170397 (GeV) - -Source track ID 6203 (gamma,0.21259862372436[GeV]) at (298.67434101202,-400.99082037004,-1192.0286004174) +Source track ID 5081 (gamma,0.21259862372436[GeV]) at (298.67434952538,-400.99081402894,-1192.0287833622) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[0,21] 0.00074698657259671 [GeV] -Cell[4,18] 0.00035051783119224 [GeV] -Cell[3,39] 0.0010260014305181 [GeV] -Cell[3,42] 2.9658421108732e-05 [GeV] -Cell[3,43] 0.00035140210393351 [GeV] -Cell[0,5] 0.0024871593538472 [GeV] -Cell[4,5] 0.00069971828298488 [GeV] -Cell[4,40] 0.018200458197711 [GeV] -Cell[3,41] 0.00087652641164683 [GeV] -Cell[3,40] 0.18475795318507 [GeV] -Cell[5,13] 0.0004690413392841 [GeV] -Cell[10,20] 0.00033992103123071 [GeV] -Cell[3,2] 0.00059336778990952 [GeV] -### Total energy deposition in calorimeter by a source track in 13 cells : 0.21092871195104 (GeV) +Cell[9,24] 0.00032478328800859 [GeV] +Cell[6,10] 0.0002110351799275 [GeV] +Cell[4,40] 0.031675307268219 [GeV] +Cell[3,41] 0.008609504815862 [GeV] +Cell[10,19] 0.0014413093695003 [GeV] +Cell[3,40] 0.15908339552287 [GeV] +Cell[4,41] 0.0015307989664216 [GeV] +Cell[2,24] 0.00062777016300706 [GeV] +### Total energy deposition in calorimeter by a source track in 8 cells : 0.20350390457382 (GeV) -Source track ID 6168 (pi-,0.62986232986955[GeV]) at (341.00339094635,365.6729240224,-1020.5134191382) +Source track ID 5045 (pi-,0.62978906875403[GeV]) at (341.74891765296,364.9762694793,-1019.802359297) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[5,47] 3.1409704308771e-07 [GeV] -Cell[3,26] 0.00054537636575742 [GeV] -Cell[4,8] 0.0015693868315522 [GeV] -Cell[4,9] 5.6702067467995e-09 [GeV] -Cell[3,27] 3.6407809238881e-05 [GeV] -Cell[4,3] 3.4589826627098e-05 [GeV] -Cell[4,4] 0.00086318822867111 [GeV] -Cell[4,14] 3.7782669242006e-06 [GeV] -Cell[0,24] 0.0082203762460879 [GeV] -Cell[0,21] 0.010052959585139 [GeV] -Cell[5,19] 2.2183192995726e-06 [GeV] -Cell[5,20] 4.1134742787108e-08 [GeV] -Cell[0,19] 8.7055345996873e-05 [GeV] -Cell[0,20] 0.018276026458816 [GeV] -Cell[1,21] 8.2199243863215e-05 [GeV] -Cell[0,22] 0.0032163452744633 [GeV] -Cell[0,23] 0.0020343271534075 [GeV] -Cell[1,20] 0.0045752573262986 [GeV] -Cell[4,5] 0.0008935249272198 [GeV] -Cell[4,6] 0.26561729444756 [GeV] -Cell[3,4] 0.00043887466320314 [GeV] -Cell[3,6] 0.0011638574978808 [GeV] -Cell[2,22] 0.00026108748659829 [GeV] -Cell[2,21] 0.0013723957029007 [GeV] -Cell[0,8] 0.0012084430426791 [GeV] -Cell[4,46] 1.0126147622941e-05 [GeV] -Cell[4,7] 0.011067031900452 [GeV] -Cell[3,7] 6.607714749407e-06 [GeV] -Cell[0,28] 0.00048254718534872 [GeV] -Cell[1,36] 1.8605999548527e-07 [GeV] -Cell[1,37] 6.2814029547553e-08 [GeV] -Cell[2,30] 0.00088332519817677 [GeV] -Cell[1,28] 4.3413937947321e-05 [GeV] -Cell[5,45] 0.0013288596741647 [GeV] -Cell[3,3] 0.0010704267148446 [GeV] -Cell[5,46] 1.108394967855e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 36 cells : 0.33545900224918 (GeV) +Cell[9,9] 1.6735017125029e-05 [GeV] +Cell[9,8] 8.7541512621101e-06 [GeV] +Cell[6,25] 0.00068429778447319 [GeV] +Cell[6,26] 6.3795528149058e-10 [GeV] +Cell[4,8] 0.0069058506825798 [GeV] +Cell[4,9] 2.8250717446099e-05 [GeV] +Cell[5,8] 3.3613764571783e-10 [GeV] +Cell[4,45] 1.7001613741741e-07 [GeV] +Cell[3,4] 7.034791001206e-05 [GeV] +Cell[3,5] 0.00079600646885376 [GeV] +Cell[3,6] 3.8059721555328e-05 [GeV] +Cell[5,4] 0.036188255549079 [GeV] +Cell[4,4] 0.00052536568090602 [GeV] +Cell[3,9] 3.8095811062249e-06 [GeV] +Cell[4,5] 0.0017146485265135 [GeV] +Cell[3,7] 0.0015614431383035 [GeV] +Cell[3,8] 0.0034571720369423 [GeV] +Cell[2,32] 3.8767133664805e-06 [GeV] +Cell[4,44] 3.2223238287088e-06 [GeV] +Cell[2,31] 9.71806542384e-05 [GeV] +Cell[6,5] 0.00018411972636909 [GeV] +Cell[4,6] 0.17954239767335 [GeV] +Cell[4,7] 0.2289051060336 [GeV] +Cell[6,4] 0.00014026476575839 [GeV] +Cell[5,5] 6.62014072077e-08 [GeV] +Cell[7,38] 0.0040409315268038 [GeV] +Cell[7,37] 0.00061607154304352 [GeV] +Cell[8,37] 2.1845312403457e-10 [GeV] +Cell[5,7] 0.00063668517389965 [GeV] +### Total energy deposition in calorimeter by a source track in 29 cells : 0.46616909051051 (GeV) -Source track ID 6169 (pi+,3.2625449607587[GeV]) at (499.99068155013,-3.0525993893268,-1675.9144410428) +Source track ID 5046 (pi+,3.2625462605863[GeV]) at (499.98898047876,-3.3195481337235,-1675.0742827799) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[10,10] 0.0016274255446515 [GeV] -Cell[9,9] 1.8480932340026e-11 [GeV] -Cell[6,18] 2.4906439336974e-06 [GeV] -Cell[6,19] 0.00061220078165456 [GeV] -Cell[5,25] 4.084003274329e-05 [GeV] -Cell[2,47] 0.0012062322919417 [GeV] -Cell[2,0] 0.0030052132334436 [GeV] -Cell[7,15] 3.3709871087922e-05 [GeV] -Cell[6,37] 0.001482551989272 [GeV] -Cell[5,36] 0.004023485611246 [GeV] -Cell[6,34] 0.0032921956617 [GeV] -Cell[7,39] 8.0258653724741e-08 [GeV] -Cell[7,41] 0.00012777156055938 [GeV] -Cell[7,42] 1.9395443960093e-06 [GeV] -Cell[1,34] 7.0776543579996e-06 [GeV] -Cell[13,25] 0.0019045006435119 [GeV] -Cell[10,24] 0.0013674259401021 [GeV] -Cell[3,13] 0.0068585867414896 [GeV] -Cell[10,9] 1.4876015717846e-05 [GeV] -Cell[2,12] 0.046639840311371 [GeV] -Cell[0,39] 1.4211109373719e-09 [GeV] -Cell[6,1] 0.00025398593171303 [GeV] -Cell[5,1] 1.4288764305093e-10 [GeV] -Cell[6,2] 0.00087466408463104 [GeV] -Cell[4,2] 1.7282706721744e-07 [GeV] -Cell[4,3] 1.4083206541613e-05 [GeV] -Cell[10,17] 0.00025099032188484 [GeV] -Cell[7,40] 2.941946884971e-05 [GeV] -Cell[11,18] 1.4651708188467e-06 [GeV] -Cell[10,28] 0.0014425273667823 [GeV] -Cell[10,27] 0.00031567931590098 [GeV] -Cell[3,1] 5.3477193281424e-06 [GeV] -Cell[11,9] 3.5370922205402e-07 [GeV] -Cell[0,25] 0.002223055683248 [GeV] -Cell[0,21] 0.0019753934185217 [GeV] -Cell[5,19] 0.0052660004787089 [GeV] -Cell[3,10] 8.3835163877666e-10 [GeV] -Cell[3,11] 0.00032067572249036 [GeV] -Cell[2,38] 2.414453729898e-06 [GeV] -Cell[0,9] 0.0012056724908723 [GeV] -Cell[1,26] 3.5760599286959e-05 [GeV] -Cell[1,25] 0.00027161875770733 [GeV] -Cell[1,24] 0.0010528686284543 [GeV] -Cell[1,7] 3.1897714623483e-05 [GeV] -Cell[3,23] 9.1268593678251e-08 [GeV] -Cell[0,1] 0.0011634632756094 [GeV] -Cell[2,3] 0.002840518389605 [GeV] -Cell[1,14] 3.4703864210655e-05 [GeV] -Cell[3,5] 1.6797373876784e-05 [GeV] -Cell[1,46] 0.016866185391757 [GeV] -Cell[1,47] 1.3268068651942 [GeV] -Cell[0,22] 9.3728704360956e-06 [GeV] -Cell[1,23] 0.0011268832468586 [GeV] -Cell[1,1] 0.015178878710446 [GeV] -Cell[0,2] 9.9516174407995e-05 [GeV] -Cell[2,13] 0.00028028389246083 [GeV] -Cell[0,6] 1.6788182343589e-05 [GeV] -Cell[3,4] 0.01420455321008 [GeV] -Cell[2,22] 2.05275164044e-05 [GeV] -Cell[1,3] 6.5321855821139e-05 [GeV] -Cell[0,8] 0.0020578747565494 [GeV] -Cell[0,10] 0.0022867246283331 [GeV] -Cell[2,26] 0.0005452363339703 [GeV] -Cell[0,11] 0.00018486599176561 [GeV] -Cell[1,4] 0.0014970314293216 [GeV] -Cell[13,20] 5.6082987061927e-06 [GeV] -Cell[13,21] 1.7828649561125e-09 [GeV] -Cell[2,14] 3.8629371556453e-07 [GeV] -Cell[1,15] 1.5990548979516e-06 [GeV] -Cell[2,19] 0.0015148108291542 [GeV] -Cell[2,20] 0.00092785079289756 [GeV] -Cell[2,4] 0.0011144436568866 [GeV] -Cell[0,38] 1.5216937754303e-09 [GeV] -Cell[5,34] 0.0022230880202815 [GeV] -Cell[4,34] 1.5133991837502e-12 [GeV] -Cell[2,9] 4.7244479541405e-05 [GeV] -Cell[0,29] 3.6187685531331e-05 [GeV] -Cell[4,40] 1.1563175270567e-05 [GeV] -Cell[2,34] 0.0023470772902868 [GeV] -Cell[2,31] 9.8301903313995e-06 [GeV] -Cell[2,32] 2.6739476947114e-05 [GeV] -Cell[2,35] 0.010227845346515 [GeV] -Cell[2,45] 0.00035264328191124 [GeV] -Cell[1,0] 0.26405888253912 [GeV] -Cell[1,38] 0.00019668575515436 [GeV] -Cell[1,39] 8.4034744610335e-06 [GeV] -Cell[2,39] 1.0954891070014e-07 [GeV] -Cell[2,36] 0.000397226247655 [GeV] -Cell[1,11] 0.029582027572981 [GeV] -Cell[0,12] 0.023984173687292 [GeV] -Cell[1,10] 0.001138343055453 [GeV] -Cell[4,35] 0.00063073461358579 [GeV] -Cell[5,30] 2.846397722351e-06 [GeV] -Cell[0,34] 0.0071070844216424 [GeV] -Cell[4,13] 4.4297761305984e-05 [GeV] -Cell[1,9] 0.0029997985315718 [GeV] -Cell[2,11] 0.063882237447363 [GeV] -Cell[2,10] 0.003682487673368 [GeV] -Cell[1,8] 0.0016451588624129 [GeV] -Cell[3,41] 3.1535383197479e-05 [GeV] -Cell[6,36] 2.6312773115933e-10 [GeV] -Cell[0,46] 0.00029622483905564 [GeV] -Cell[0,45] 4.5667670519833e-08 [GeV] -Cell[4,36] 9.2864103780812e-06 [GeV] -Cell[0,0] 0.00017704457015532 [GeV] -Cell[6,26] 1.5078618540429e-05 [GeV] -Cell[3,36] 3.2056098105386e-05 [GeV] -Cell[1,2] 0.0024316722563049 [GeV] -Cell[2,1] 0.005835782598852 [GeV] -Cell[3,14] 2.9055671475362e-06 [GeV] -Cell[1,37] 3.0838023521937e-06 [GeV] -Cell[2,30] 0.00061528410789003 [GeV] -Cell[0,13] 0.00018400969286404 [GeV] -Cell[4,23] 0.00062711615240005 [GeV] -Cell[3,24] 6.8535056780092e-06 [GeV] -Cell[3,25] 1.871376298368e-11 [GeV] -Cell[3,46] 0.00012611598730723 [GeV] -Cell[3,32] 1.8126858951291e-05 [GeV] -Cell[1,27] 5.8247484962408e-05 [GeV] -Cell[2,29] 0.00098479915045607 [GeV] -Cell[0,30] 0.00025107544499758 [GeV] -Cell[4,25] 0.0028481405040363 [GeV] -Cell[14,6] 8.5518399137641e-05 [GeV] -Cell[14,7] 0.00034527799029422 [GeV] -Cell[4,30] 0.00095291454274786 [GeV] -Cell[5,38] 8.3057908727824e-07 [GeV] -Cell[5,37] 0.014408685066817 [GeV] -Cell[13,24] 7.2975147577381e-07 [GeV] -Cell[3,17] 0.00024059184233192 [GeV] -Cell[3,3] 0.0067027087615977 [GeV] -Cell[3,2] 0.0021166344508666 [GeV] -Cell[3,34] 0.0016557498017931 [GeV] -Cell[0,47] 0.0069612892791837 [GeV] -Cell[2,46] 0.00096469882864292 [GeV] -Cell[11,19] 0.0011600633419764 [GeV] -Cell[2,2] 0.026136042103021 [GeV] -Cell[5,29] 0.00062274067828522 [GeV] -Cell[4,29] 0.00014582225029485 [GeV] -Cell[5,35] 0.00012384896305355 [GeV] -Cell[6,35] 2.5262290504315e-06 [GeV] -Cell[6,33] 2.9455055516792e-07 [GeV] -Cell[3,35] 0.00016399658084958 [GeV] -Cell[3,12] 0.0044941649376938 [GeV] -Cell[4,24] 0.00056392121593396 [GeV] -Cell[2,33] 2.4035398382694e-09 [GeV] -Cell[5,14] 0.0016903174430811 [GeV] -### Total energy deposition in calorimeter by a source track in 146 cells : 1.9754262511235 (GeV) +Cell[4,29] 0.0018543616474738 [GeV] +Cell[0,36] 0.0020375506854958 [GeV] +Cell[0,38] 3.5982925495432e-05 [GeV] +Cell[3,28] 1.1316588143018e-08 [GeV] +Cell[0,20] 0.00056547103022627 [GeV] +Cell[1,46] 5.3424250040734e-08 [GeV] +Cell[0,4] 9.3308736152949e-05 [GeV] +Cell[4,30] 5.4844405212862e-09 [GeV] +Cell[0,5] 1.1154323181017e-07 [GeV] +Cell[0,8] 0.00087227959994315 [GeV] +Cell[0,47] 0.54185629048088 [GeV] +Cell[0,3] 0.00049969500097222 [GeV] +Cell[3,29] 0.013069181288886 [GeV] +Cell[3,30] 0.011857171734687 [GeV] +Cell[1,0] 0.021744706345883 [GeV] +Cell[1,1] 1.550554725236e-05 [GeV] +Cell[1,47] 0.22119062985381 [GeV] +Cell[0,46] 0.0011773446804962 [GeV] +Cell[0,0] 0.24218613805854 [GeV] +Cell[3,19] 3.2060588039919e-06 [GeV] +Cell[1,2] 0.0010568805931655 [GeV] +Cell[1,8] 0.02348159683494 [GeV] +Cell[0,9] 2.8886026120745e-07 [GeV] +Cell[1,7] 0.00092921357333925 [GeV] +Cell[2,32] 5.8197350881528e-06 [GeV] +Cell[2,4] 0.00025459766809346 [GeV] +Cell[2,30] 0.00049039234450902 [GeV] +Cell[1,3] 1.8665654351935e-08 [GeV] +Cell[4,13] 0.00029014519010508 [GeV] +Cell[0,2] 0.00024233095941755 [GeV] +Cell[2,41] 0.00038581592468364 [GeV] +Cell[0,1] 0.079825987413916 [GeV] +Cell[5,32] 0.00067431270566112 [GeV] +Cell[0,45] 0.00018977826465709 [GeV] +Cell[0,16] 0.0033183435926381 [GeV] +Cell[2,29] 3.3518852654879e-06 [GeV] +Cell[1,9] 0.16607229863931 [GeV] +Cell[4,32] 0.0029802474854976 [GeV] +### Total energy deposition in calorimeter by a source track in 38 cells : 1.3392604257797 (GeV) -Source track ID 6165 (gamma,0.53051937575115[GeV]) at (475.84609296694,-153.52685696026,-782.17061787867) +Source track ID 5042 (gamma,0.53051937575115[GeV]) at (475.84610341346,-153.52682458199,-782.17055026345) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[5,8] 0.00047427277917368 [GeV] -Cell[5,36] 0.00051099891 [GeV] -Cell[5,47] 0.0013063889605963 [GeV] -Cell[8,16] 0.00088443497013 [GeV] -Cell[6,46] 0.00051099891 [GeV] -Cell[6,45] 0.25939788313863 [GeV] -Cell[4,14] 0.0004088929326827 [GeV] -Cell[0,19] 0.00051099891 [GeV] -Cell[0,18] 0.00054362537639081 [GeV] -Cell[3,31] 0.00058402391057247 [GeV] -Cell[4,6] 0.0004643666988406 [GeV] -Cell[0,4] 0.012637993979395 [GeV] -Cell[2,36] 0.0016974448684292 [GeV] -Cell[6,28] 0.00021509446282609 [GeV] -Cell[2,37] 0.00020784698444953 [GeV] -Cell[7,26] 0.00051099891 [GeV] -Cell[5,45] 0.23031171022413 [GeV] -Cell[5,46] 0.017457585695727 [GeV] -### Total energy deposition in calorimeter by a source track in 18 cells : 0.52863556062197 (GeV) +Cell[5,24] 0.00051099891 [GeV] +Cell[5,46] 0.003858488879574 [GeV] +Cell[5,44] 0.0033223459416669 [GeV] +Cell[6,45] 0.26892216490535 [GeV] +Cell[6,44] 0.0024690240337861 [GeV] +Cell[9,32] 0.00084962499914039 [GeV] +Cell[4,18] 0.00049033578195361 [GeV] +Cell[3,37] 0.0021157573474844 [GeV] +Cell[5,45] 0.24798063495219 [GeV] +### Total energy deposition in calorimeter by a source track in 9 cells : 0.53051937575115 (GeV) -Source track ID 6166 (gamma,0.17927399228015[GeV]) at (168.15436509716,-470.87589606899,-1264.5234766204) +Source track ID 5043 (gamma,0.17927399228015[GeV]) at (168.15422621469,-470.87594566525,-1264.5234722374) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[2,0] 0.00051099891 [GeV] -Cell[3,26] 0.00051099891 [GeV] -Cell[3,39] 0.0075909832573026 [GeV] -Cell[3,23] 0.00051099891 [GeV] -Cell[3,38] 0.16184738498134 [GeV] -Cell[2,20] 0.001623946128685 [GeV] -Cell[3,20] 0.0016869691015181 [GeV] -Cell[3,22] 0.001606759196934 [GeV] -Cell[5,9] 0.00051099891 [GeV] -Cell[2,30] 0.0010154048236653 [GeV] -Cell[2,46] 0.00028280552131486 [GeV] -### Total energy deposition in calorimeter by a source track in 11 cells : 0.17769824865076 (GeV) +Cell[3,38] 0.16336444866512 [GeV] +Cell[3,39] 0.012011043965086 [GeV] +Cell[3,15] 0.0014928719131196 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.17686836454333 (GeV) -Source track ID 6153 (gamma,0.00021038655848434[GeV]) at (254.24674879558,430.5329148008,-111.74448953552) +Source track ID 4985 (gamma,0.0024312803142812[GeV]) at (-429.8170400581,255.45510775026,-123.53764723492) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[9,7] 0.00021038655848434 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00021038655848434 (GeV) +Cell[9,19] 0.0024312803142812 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0024312803142812 (GeV) -Source track ID 6158 (gamma,0.0095909131876044[GeV]) at (-161.02306662747,473.36198834918,-135.78711913686) +Source track ID 4989 (gamma,0.2549970134741[GeV]) at (-225.69995234463,446.16088075002,-128.17223771304) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[8,3] 0.00014985178137297 [GeV] -Cell[2,30] 0.00019133711923556 [GeV] -Cell[9,14] 0.008732711615513 [GeV] -Cell[6,30] 0.00051099891 [GeV] -### Total energy deposition in calorimeter by a source track in 4 cells : 0.0095848994261215 (GeV) +Cell[8,13] 0.0061452940384954 [GeV] +Cell[12,37] 0.00046627660769333 [GeV] +Cell[4,25] 0.00039353825721293 [GeV] +Cell[9,14] 0.026341272539901 [GeV] +Cell[9,15] 0.22137832178529 [GeV] +Cell[8,14] 0.00018815877499582 [GeV] +### Total energy deposition in calorimeter by a source track in 6 cells : 0.25491286200359 (GeV) -Source track ID 6159 (gamma,0.054350248877731[GeV]) at (-160.49119962848,473.54257975584,-135.45910775903) +Source track ID 5040 (gamma,0.00036003650962604[GeV]) at (487.40162447479,111.533207877,-966.33846808832) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[9,13] 0.053381407912433 [GeV] -Cell[9,14] 0.00096884096529744 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.054350248877731 (GeV) +Cell[5,1] 0.00036003650962604 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00036003650962604 (GeV) -Source track ID 6073 (e+,0.27884044917557[GeV]) at (-152.98101263388,476.02185850391,-136.47058780217) +Source track ID 4992 (gamma,0.00056276477189922[GeV]) at (390.58817845944,312.15520954765,-307.94633281271) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[8,12] 0.0014763386538126 [GeV] -Cell[9,13] 0.050955512000447 [GeV] -Cell[8,13] 0.0019506190801146 [GeV] -Cell[9,14] 0.21847718077035 [GeV] -Cell[9,15] 0.0057299349365963 [GeV] -Cell[8,14] 0.00076286157426399 [GeV] -### Total energy deposition in calorimeter by a source track in 6 cells : 0.27935244701559 (GeV) +Cell[8,5] 0.00056276477189922 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00056276477189922 (GeV) -Source track ID 6143 (gamma,8.450356879855e-05[GeV]) at (-493.89410660732,77.901293048022,-130.16419495365) +Source track ID 4993 (gamma,0.0010920302112204[GeV]) at (368.88531416958,-337.5257397444,251.08743107943) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[9,22] 8.450356879855e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 8.450356879855e-05 (GeV) +Cell[11,42] 0.0010920302112204 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0010920302112204 (GeV) -Source track ID 6144 (gamma,0.00016188042141038[GeV]) at (-496.58383472387,58.348051303634,-129.93713130389) +Source track ID 5029 (gamma,0.00017017628602837[GeV]) at (474.09930665359,158.83906141307,-266.76457300461) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[9,23] 0.00016188042141038 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00016188042141038 (GeV) +Cell[8,2] 0.00017017628602837 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00017017628602837 (GeV) -Source track ID 6074 (e-,0.51341248718912[GeV]) at (-499.61690787238,19.568989959671,-132.94779045964) +Source track ID 4994 (gamma,0.00039878902339674[GeV]) at (323.02532536337,381.64727062287,693.69746543126) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[8,23] 0.00042554975417932 [GeV] -Cell[9,35] 0.00068092349948437 [GeV] -Cell[6,13] 0.00044147097831251 [GeV] -Cell[10,47] 7.9136926607869e-05 [GeV] -Cell[9,22] 0.0030005239924101 [GeV] -Cell[6,1] 0.00051099891 [GeV] -Cell[9,23] 0.38396624907017 [GeV] -Cell[9,24] 0.11745969184689 [GeV] -Cell[9,25] 0.003021055874966 [GeV] -Cell[7,38] 0.00064280045924234 [GeV] -Cell[9,20] 0.00042153201480548 [GeV] -### Total energy deposition in calorimeter by a source track in 11 cells : 0.51064993332707 (GeV) +Cell[13,6] 0.00039878902339674 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00039878902339674 (GeV) -Source track ID 6138 (gamma,7.5225131704127e-05[GeV]) at (-340.45664908045,-366.18201771374,-506.85915476653) +Source track ID 5010 (gamma,0.016112762147217[GeV]) at (-112.4991554107,-487.17957678035,-405.59081319083) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[7,30] 7.5225131704127e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 7.5225131704127e-05 (GeV) +Cell[7,33] 0.00043730093888236 [GeV] +Cell[7,34] 0.015164462298334 [GeV] +Cell[13,44] 0.0001919393224526 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.015793702559669 (GeV) -Source track ID 6139 (gamma,0.00046044811878705[GeV]) at (-498.61981308179,-37.125220568763,137.28704617059) +Source track ID 5014 (gamma,0.00041410854276733[GeV]) at (271.10905382779,420.11888904523,-251.38421619702) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[10,24] 0.00046044811878705 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00046044811878705 (GeV) +Cell[8,7] 0.00041410854276733 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00041410854276733 (GeV) -Source track ID 6085 (gamma,0.029520899132753[GeV]) at (-484.45391733824,-123.71096142071,-425.47653635336) +Source track ID 5015 (gamma,0.003369509159358[GeV]) at (-316.63407419135,-386.96622987153,-280.43571734) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[10,10] 0.0030054764702091 [GeV] -Cell[7,25] 0.0057152054899321 [GeV] -Cell[9,11] 1.7220940324478e-05 [GeV] -Cell[2,47] 0.00063080392971466 [GeV] -Cell[6,16] 0.00043222629633426 [GeV] -Cell[10,8] 0.00084220187981509 [GeV] -Cell[10,7] 8.1455436167062e-06 [GeV] -Cell[10,9] 2.2303959005512e-05 [GeV] -Cell[7,29] 0.0018887549727275 [GeV] -Cell[7,28] 0.0017972559148 [GeV] -Cell[6,29] 1.4362256827098e-06 [GeV] -Cell[10,11] 3.5842786601279e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 12 cells : 0.014396874408763 (GeV) +Cell[8,30] 0.0026500088290276 [GeV] +Cell[8,19] 0.00024831916386823 [GeV] +Cell[8,1] 0.00045838200832392 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.0033567100012198 (GeV) -Source track ID 6086 (gamma,0.00024773206697743[GeV]) at (8.5197135575905,-499.92740921147,-361.71708079719) +Source track ID 4961 (gamma,0.014487211184588[GeV]) at (-498.2734621517,41.515742982086,-134.05951580505) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[8,36] 0.00024773206697743 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00024773206697743 (GeV) +Cell[7,31] 0.00030104145644375 [GeV] +Cell[7,30] 0.00020995745355625 [GeV] +Cell[3,47] 0.00043731745788516 [GeV] +Cell[9,23] 0.013538894816703 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.014487211184588 (GeV) -Source track ID 6124 (gamma,2.7791744150632e-05[GeV]) at (-186.157828258,-464.05308206957,-1025.56419527) +Source track ID 4962 (gamma,0.0094814846661407[GeV]) at (-499.18960579531,28.455886314168,-134.1537900924) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[4,33] 2.7791744150632e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 2.7791744150632e-05 (GeV) +Cell[9,23] 0.0094814846661407 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0094814846661407 (GeV) -Source track ID 6125 (gamma,0.00017552743628782[GeV]) at (498.43906026798,39.477882404844,-1362.8038119621) +Source track ID 4955 (e-,0.48797699168512[GeV]) at (-499.67309607397,18.077529141361,-135.74670719422) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[3,0] 0.00017552743628782 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00017552743628782 (GeV) +Cell[9,24] 0.11818165611987 [GeV] +Cell[6,43] 0.00042196262758854 [GeV] +Cell[5,18] 0.00022740984424128 [GeV] +Cell[8,24] 0.0081635073835645 [GeV] +Cell[12,14] 0.0028798377202105 [GeV] +Cell[8,23] 4.4782887562178e-06 [GeV] +Cell[8,22] 3.9291419625442e-08 [GeV] +Cell[11,4] 0.0015005230838656 [GeV] +Cell[8,26] 0.0064927756095923 [GeV] +Cell[9,25] 0.0055723938162889 [GeV] +Cell[11,3] 0.0010009131368814 [GeV] +Cell[6,42] 0.00073623270271864 [GeV] +Cell[9,22] 2.5996435113029e-07 [GeV] +Cell[9,23] 0.33036394262913 [GeV] +Cell[9,28] 0.0002158168182571 [GeV] +### Total energy deposition in calorimeter by a source track in 15 cells : 0.47576174903674 (GeV) -Source track ID 6126 (gamma,0.00010762620634936[GeV]) at (-499.98252473018,4.1803067393433,-449.06179614825) +Source track ID 4956 (gamma,0.14815181584447[GeV]) at (-470.45468947269,169.32922120283,-336.66130440399) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[7,23] 0.00010762620634936 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00010762620634936 (GeV) +Cell[8,21] 0.12594065142667 [GeV] +Cell[6,20] 0.00064424574715824 [GeV] +Cell[7,21] 0.021359874178007 [GeV] +Cell[6,21] 0.00020704449263428 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.14815181584447 (GeV) -Source track ID 6088 (gamma,0.00022022099237942[GeV]) at (-469.91810272102,-170.81269488852,-456.23174003499) +Source track ID 4911 (mu+,0.17022330891457[GeV]) at (-377.3698846737,-328.01214938071,1646.0180926872) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[7,26] 0.00022022099237942 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00022022099237942 (GeV) +Cell[18,29] 0.10427846564278 [GeV] +Cell[18,30] 0.00051099891 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.10478946455278 (GeV) -Source track ID 6089 (gamma,0.037606272570639[GeV]) at (-434.74062271943,-246.98297706021,-507.47819555235) +Source track ID 4889 (pi-,0.95224355718191[GeV]) at (-378.93916038114,-326.19796555104,-224.05400626204) Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[7,27] 0.00065144518751395 [GeV] -Cell[7,31] 0.00011895112363766 [GeV] -Cell[7,28] 0.035404224063971 [GeV] -Cell[4,5] 0.00051099891 [GeV] -Cell[13,7] 0.0002514730532374 [GeV] -### Total energy deposition in calorimeter by a source track in 5 cells : 0.03693709233836 (GeV) +Cell[7,31] 0.0013154972064971 [GeV] +Cell[8,28] 0.052587003738508 [GeV] +Cell[7,32] 0.0001780241282936 [GeV] +Cell[10,28] 0.0022244342236637 [GeV] +Cell[6,32] 0.0033845929574438 [GeV] +Cell[8,32] 1.1483498190046e-07 [GeV] +Cell[7,29] 0.00068408622226309 [GeV] +Cell[7,30] 0.0059232932764129 [GeV] +Cell[8,31] 0.002842929995823 [GeV] +Cell[8,30] 0.097208881980556 [GeV] +Cell[3,6] 0.00017847172465918 [GeV] +Cell[7,28] 7.1994145400822e-10 [GeV] +Cell[6,29] 7.6535558182513e-05 [GeV] +Cell[4,5] 4.1749751653697e-07 [GeV] +Cell[8,29] 0.47718280267433 [GeV] +Cell[8,27] 2.4541218033391e-07 [GeV] +Cell[9,27] 0.00022302717511411 [GeV] +Cell[9,29] 0.0053443669405716 [GeV] +Cell[9,30] 0.0055216565793833 [GeV] +Cell[9,32] 9.8907599532708e-05 [GeV] +Cell[9,31] 0.0013503092999984 [GeV] +Cell[9,33] 0.0019548865228279 [GeV] +Cell[3,7] 0.0050311087864499 [GeV] +Cell[10,29] 6.7595736567228e-06 [GeV] +Cell[6,31] 2.2767407208448e-05 [GeV] +Cell[5,30] 0.00025897859248323 [GeV] +Cell[4,6] 0.0013517912170064 [GeV] +Cell[4,7] 0.010266750114509 [GeV] +Cell[9,28] 0.0082276781123592 [GeV] +Cell[6,30] 0.0027330984757993 [GeV] +Cell[5,31] 3.8446160033345e-11 [GeV] +### Total energy deposition in calorimeter by a source track in 31 cells : 0.6861794185866 (GeV) -Source track ID 6092 (gamma,8.9982846655809e-05[GeV]) at (316.32172710351,387.22159671467,-785.34002799046) -Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[6,6] 8.9982846655809e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 8.9982846655809e-05 (GeV) - -Source track ID 6076 (e-,0.030289532847381[GeV]) at (-499.45164442556,-23.410571983665,-1033.5372897461) -Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[7,43] 0.00033642850826052 [GeV] -Cell[2,40] 0.00026209973139469 [GeV] -Cell[4,24] 0.029180005697725 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.029778533937381 (GeV) - -Source track ID 6078 (gamma,0.00051099891[GeV]) at (-494.78404691792,-72.032957148307,-382.46051605913) -Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[8,25] 0.00051099891 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00051099891 (GeV) - -Source track ID 6079 (gamma,0.00051099891[GeV]) at (158.86272839079,474.09137677059,173.1218749317) -Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[10,9] 0.00051099891 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00051099891 (GeV) - -Source track ID 6032 (pi+,0.18776409481153[GeV]) at (-498.35785404252,-40.490113782717,1585.20369083) -Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[17,24] 0.065211816264578 [GeV] -Cell[18,2] 0.00069539191332167 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.0659072081779 (GeV) - -Source track ID 6022 (pi-,0.95287762932613[GeV]) at (-377.10768358651,-328.31356198003,-220.15950940443) -Original primary track ID 27 (unknown,1.8699577628705[GeV]) -Cell[8,45] 0.00082244553573848 [GeV] -Cell[8,44] 2.1643645595759e-09 [GeV] -Cell[4,45] 0.0031610729339782 [GeV] -Cell[9,31] 0.0052785205709648 [GeV] -Cell[9,10] 0.0028764733766359 [GeV] -Cell[9,9] 1.7565456334978e-07 [GeV] -Cell[9,11] 0.0011544866163042 [GeV] -Cell[9,34] 0.0010364153410419 [GeV] -Cell[7,13] 5.4980596178211e-07 [GeV] -Cell[6,18] 5.742783939786e-05 [GeV] -Cell[8,46] 0.00088833492837714 [GeV] -Cell[9,13] 2.8860062593594e-07 [GeV] -Cell[2,47] 5.6292579870387e-08 [GeV] -Cell[8,32] 0.004939074175245 [GeV] -Cell[9,6] 3.0543203640264e-05 [GeV] -Cell[7,27] 0.0009116736170721 [GeV] -Cell[8,35] 3.4954950933752e-11 [GeV] -Cell[9,35] 7.9196404101367e-07 [GeV] -Cell[7,30] 4.8441078688484e-06 [GeV] -Cell[7,39] 4.0568674307906e-08 [GeV] -Cell[5,47] 5.1628146191661e-05 [GeV] -Cell[8,16] 6.8148103309795e-07 [GeV] -Cell[10,33] 2.1569569526037e-09 [GeV] -Cell[8,31] 0.0088738206181852 [GeV] -Cell[8,30] 0.13534498404653 [GeV] -Cell[9,33] 0.00025221678362652 [GeV] -Cell[10,8] 0.0014579521864131 [GeV] -Cell[10,7] 0.00062296125868011 [GeV] -Cell[8,18] 9.5565017545596e-08 [GeV] -Cell[9,27] 1.2400638894178e-05 [GeV] -Cell[8,3] 8.544884622097e-11 [GeV] -Cell[8,17] 1.0195693026503e-05 [GeV] -Cell[9,32] 0.0026467891436425 [GeV] -Cell[10,19] 0.0005022182285328 [GeV] -Cell[8,28] 0.006394928074595 [GeV] -Cell[9,30] 0.0079588012403417 [GeV] -Cell[9,29] 0.0016412072628991 [GeV] -Cell[8,29] 0.31110639627204 [GeV] -Cell[8,33] 2.593943814486e-05 [GeV] -Cell[4,4] 4.7324638580903e-07 [GeV] -Cell[7,29] 0.001805385125712 [GeV] -Cell[8,24] 0.0010543266383704 [GeV] -Cell[7,40] 1.2190424647542e-06 [GeV] -Cell[8,0] 7.4863585177809e-07 [GeV] -Cell[7,28] 0.0035861542776694 [GeV] -Cell[11,34] 1.559978204341e-06 [GeV] -Cell[11,35] 0.00042979270783553 [GeV] -Cell[12,35] 0.0013202673519711 [GeV] -Cell[3,1] 0.00020538326465601 [GeV] -Cell[4,1] 7.7564490266013e-07 [GeV] -Cell[11,9] 1.4885270502418e-08 [GeV] -Cell[8,26] 9.0201058799266e-07 [GeV] -Cell[3,37] 1.1429423262598e-05 [GeV] -Cell[5,44] 1.0315903346054e-06 [GeV] -Cell[2,43] 7.066561643569e-06 [GeV] -Cell[1,47] 3.8257112233396e-05 [GeV] -Cell[4,6] 0.0017711248192222 [GeV] -Cell[3,6] 0.00084052458804524 [GeV] -Cell[4,0] 1.4341436326504e-08 [GeV] -Cell[0,11] 6.4275600016117e-07 [GeV] -Cell[1,4] 5.6269712513313e-07 [GeV] -Cell[4,43] 1.0205253493041e-06 [GeV] -Cell[4,47] 1.8752965843305e-08 [GeV] -Cell[3,0] 0.00038778526522049 [GeV] -Cell[2,44] 2.5269088598748e-05 [GeV] -Cell[2,9] 4.9962891498581e-06 [GeV] -Cell[4,40] 2.5847693905234e-09 [GeV] -Cell[2,32] 8.5520971624646e-06 [GeV] -Cell[3,45] 1.490081535303e-05 [GeV] -Cell[3,7] 4.3787144932139e-09 [GeV] -Cell[2,11] 0.00030569892840651 [GeV] -Cell[2,1] 3.4222193178721e-05 [GeV] -Cell[7,26] 0.00066961045114112 [GeV] -Cell[8,25] 0.00072151582240434 [GeV] -Cell[3,46] 0.000108741081414 [GeV] -Cell[11,8] 0.0012309141607701 [GeV] -Cell[13,43] 3.5166661837138e-07 [GeV] -Cell[10,46] 1.6512216762976e-06 [GeV] -Cell[17,4] 1.333956248709e-05 [GeV] -Cell[10,26] 0.0059548082505925 [GeV] -Cell[10,25] 0.00039822099229559 [GeV] -Cell[9,26] 3.1787823245395e-06 [GeV] -Cell[9,14] 6.2306664767675e-07 [GeV] -Cell[14,1] 5.5836729243083e-05 [GeV] -Cell[8,27] 3.2935559714701e-05 [GeV] -Cell[5,39] 0.00012486105922608 [GeV] -Cell[5,40] 7.2140246629715e-09 [GeV] -Cell[5,45] 0.0054722662390081 [GeV] -Cell[11,46] 7.7582080848515e-10 [GeV] -Cell[2,46] 2.5673320078567e-07 [GeV] -Cell[9,28] 0.0027413581668773 [GeV] -Cell[3,47] 5.1500036966786e-05 [GeV] -Cell[4,44] 0.006493196596649 [GeV] -Cell[4,39] 2.9702525353059e-08 [GeV] -Cell[9,19] 8.5128031279623e-05 [GeV] -Cell[9,38] 0.0019573874800486 [GeV] -Cell[9,37] 0.00011159336743469 [GeV] -Cell[13,1] 8.5379359101807e-05 [GeV] -Cell[10,45] 5.3345662308857e-08 [GeV] -### Total energy deposition in calorimeter by a source track in 99 cells : 0.53624130872545 (GeV) - -Source track ID 5958 (pi-,0.2974722570762[GeV]) at (-495.47888066733,67.087098704935,1860.1677352417) +Source track ID 4860 (mu-,0.1789197210045[GeV]) at (359.16528147827,-347.85097467254,1832.0866435922) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[17,24] 0.0020852887315339 [GeV] -Cell[19,20] 0.00061206234918806 [GeV] -Cell[16,43] 2.8288923203945e-11 [GeV] -Cell[16,44] 2.3153373831519e-09 [GeV] -Cell[17,37] 0.0015877182547764 [GeV] -Cell[16,38] 5.9260244539473e-05 [GeV] -Cell[16,37] 0.0004946812291106 [GeV] -Cell[16,36] 8.4189958720344e-06 [GeV] -Cell[18,21] 0.0022224204321514 [GeV] -Cell[19,21] 0.00015384484746687 [GeV] -Cell[19,22] 0.025681540487624 [GeV] -Cell[19,23] 0.08743573112779 [GeV] -Cell[18,22] 1.0132520162074e-05 [GeV] -Cell[17,36] 3.7588177974612e-09 [GeV] -Cell[17,39] 0.00025537480739241 [GeV] -Cell[17,43] 2.8564117383212e-07 [GeV] -Cell[18,43] 0.0011277566487882 [GeV] -Cell[18,44] 3.4061586802636e-08 [GeV] -Cell[19,25] 9.599314804575e-05 [GeV] -Cell[17,25] 0.00031445923924502 [GeV] -Cell[18,25] 0.0013231567727939 [GeV] -Cell[19,24] 1.6263220459223e-10 [GeV] -Cell[18,24] 0.0028366215504382 [GeV] -Cell[17,42] 1.2848542095526e-05 [GeV] -Cell[19,42] 0.0012367427730054 [GeV] -Cell[18,23] 0.00047418529239224 [GeV] -Cell[17,26] 5.7061373524448e-05 [GeV] -Cell[18,45] 8.537445298316e-06 [GeV] -Cell[19,44] 0.00084905861491575 [GeV] -Cell[18,42] 4.6594499053754e-08 [GeV] -Cell[18,26] 6.6982889547944e-06 [GeV] -Cell[17,1] 0.0016042423518453 [GeV] -Cell[18,11] 0.00099136813281029 [GeV] -Cell[17,44] 2.935510098041e-07 [GeV] -Cell[19,26] 0.00022914169178341 [GeV] -Cell[19,41] 0.00010226198900739 [GeV] -### Total energy deposition in calorimeter by a source track in 36 cells : 0.1318772739959 (GeV) +Cell[8,10] 1.1349687702022e-07 [GeV] +Cell[18,4] 1.133391608073e-05 [GeV] +Cell[15,14] 0.00077204522181103 [GeV] +Cell[9,32] 4.6972214435073e-06 [GeV] +Cell[9,31] 2.4209663030206e-06 [GeV] +Cell[18,5] 2.104219646526e-07 [GeV] +Cell[15,37] 2.023734850809e-08 [GeV] +Cell[15,38] 2.6784167857841e-08 [GeV] +Cell[19,16] 3.0644380603917e-07 [GeV] +Cell[19,17] 0.00053409622008792 [GeV] +Cell[18,16] 4.0384926032061e-05 [GeV] +Cell[18,15] 0.0026665692872615 [GeV] +Cell[19,41] 0.0104957038608 [GeV] +Cell[18,3] 1.1653054253429e-05 [GeV] +Cell[15,15] 0.00033459816537356 [GeV] +Cell[17,8] 0.00013643903705406 [GeV] +Cell[19,40] 3.679173978162e-05 [GeV] +Cell[19,42] 0.073989470957491 [GeV] +Cell[17,4] 8.7452322986792e-08 [GeV] +Cell[17,5] 2.4154870061466e-08 [GeV] +### Total energy deposition in calorimeter by a source track in 20 cells : 0.089036993565131 (GeV) -Source track ID 5959 (pi+,3.7102764589952[GeV]) at (209.39260571984,454.04265952645,1946.3084535833) +Source track ID 4846 (pi+,3.7103971178076[GeV]) at (209.82288778534,453.84397733298,1948.4877713212) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[19,8] 0.07420516583625 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.07420516583625 (GeV) +Cell[13,31] 2.3036632489948e-07 [GeV] +Cell[19,4] 0.0018868056281325 [GeV] +Cell[16,26] 0.001067347186141 [GeV] +Cell[13,32] 0.00011930154412948 [GeV] +Cell[18,14] 8.9018085272983e-06 [GeV] +Cell[10,6] 1.9995844631921e-06 [GeV] +Cell[7,26] 2.6844230596907e-06 [GeV] +Cell[12,45] 0.00013151400041352 [GeV] +Cell[12,24] 0.00041853625973645 [GeV] +Cell[19,7] 0.0072503243582765 [GeV] +Cell[14,16] 0.00096109775147158 [GeV] +Cell[15,21] 0.00030823647240852 [GeV] +Cell[1,1] 0.00012041716836586 [GeV] +Cell[16,25] 0.0051214591015372 [GeV] +Cell[12,47] 9.5264135779871e-10 [GeV] +Cell[12,46] 0.00075540345524576 [GeV] +Cell[18,6] 3.0920603486493e-06 [GeV] +Cell[17,38] 1.336039690068e-05 [GeV] +Cell[15,45] 9.8917661451651e-05 [GeV] +Cell[13,2] 7.7351647487376e-06 [GeV] +Cell[15,44] 0.0047396578117668 [GeV] +Cell[19,46] 5.1532842917368e-08 [GeV] +Cell[11,15] 6.0785509413108e-06 [GeV] +Cell[19,30] 0.00026208716401743 [GeV] +Cell[17,36] 0.00042473707076749 [GeV] +Cell[19,16] 4.265636447667e-05 [GeV] +Cell[17,37] 1.6960186758524e-05 [GeV] +Cell[19,8] 0.70000084148011 [GeV] +Cell[19,9] 0.04835341366855 [GeV] +Cell[16,37] 0.0003255629561222 [GeV] +Cell[18,40] 0.00059178499867653 [GeV] +Cell[18,42] 0.0002326581658599 [GeV] +Cell[17,12] 1.3967574068374e-07 [GeV] +Cell[18,20] 0.0007675333147306 [GeV] +Cell[17,45] 2.5330140488222e-06 [GeV] +Cell[17,44] 2.7267973637208e-06 [GeV] +Cell[18,8] 0.0021759761105565 [GeV] +Cell[18,9] 6.1315796918597e-05 [GeV] +Cell[12,17] 2.3573345679324e-06 [GeV] +Cell[18,7] 0.00062368214324385 [GeV] +Cell[18,39] 1.9716344468179e-09 [GeV] +Cell[18,41] 3.9637820853386e-05 [GeV] +Cell[19,41] 0.0013304562425109 [GeV] +Cell[19,22] 0.0015648210635137 [GeV] +Cell[17,42] 1.2834640801884e-06 [GeV] +Cell[19,3] 6.7639877794136e-05 [GeV] +Cell[18,3] 0.0035071627662672 [GeV] +Cell[19,23] 0.0001541400714417 [GeV] +Cell[18,33] 5.9191577747697e-08 [GeV] +Cell[18,32] 0.0003953101762296 [GeV] +Cell[17,25] 0.0018852286771197 [GeV] +Cell[19,10] 0.0012210098187428 [GeV] +Cell[18,11] 4.9241672721791e-06 [GeV] +Cell[19,40] 0.0003254474438238 [GeV] +Cell[18,47] 3.8845856670378e-07 [GeV] +Cell[18,10] 0.00083402897431082 [GeV] +Cell[16,43] 8.5884792497382e-08 [GeV] +Cell[19,42] 0.00088874169889883 [GeV] +Cell[19,28] 1.8680942303035e-06 [GeV] +Cell[19,19] 1.9229183089919e-06 [GeV] +Cell[19,15] 1.3575106549979e-10 [GeV] +Cell[18,31] 1.6962055524345e-05 [GeV] +Cell[19,2] 0.00051660221573741 [GeV] +Cell[19,27] 0.0010098043532448 [GeV] +Cell[19,6] 0.0037264479270357 [GeV] +Cell[16,45] 0.0016302435077894 [GeV] +Cell[19,11] 2.4532515497867e-05 [GeV] +Cell[19,43] 7.3241479694843e-06 [GeV] +Cell[18,1] 0.0013856861409372 [GeV] +Cell[19,1] 0.013874250305349 [GeV] +Cell[19,0] 0.0038342323083982 [GeV] +Cell[11,14] 1.8727376009338e-06 [GeV] +Cell[18,19] 0.00014513106818345 [GeV] +Cell[18,18] 2.6372759293736e-08 [GeV] +Cell[18,2] 4.2086115048733e-05 [GeV] +Cell[18,0] 0.00022811873607293 [GeV] +### Total energy deposition in calorimeter by a source track in 76 cells : 0.81557759890725 (GeV) -Source track ID 5688 (pi+,0.59947932603833[GeV]) at (-417.54462108927,275.05724749481,371.13922470629) +Source track ID 4735 (pi+,0.59377325981627[GeV]) at (-363.84749323483,342.95043616641,455.90258481368) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[12,17] 0.0047091280166927 [GeV] -Cell[13,17] 0.01072443859577 [GeV] -Cell[13,18] 0.14157939350415 [GeV] -Cell[12,18] 0.20598186449494 [GeV] -Cell[13,20] 1.0464928800502e-07 [GeV] -Cell[13,19] 0.0047504032454409 [GeV] -Cell[12,16] 1.471250072882e-08 [GeV] -Cell[13,16] 5.1516968678698e-06 [GeV] -Cell[11,19] 0.049788636197557 [GeV] -Cell[12,19] 0.055583261983035 [GeV] -### Total energy deposition in calorimeter by a source track in 10 cells : 0.47312239709624 (GeV) +Cell[13,18] 0.0013620897551501 [GeV] +Cell[12,15] 0.0021758861911998 [GeV] +Cell[10,11] 5.0227390602231e-09 [GeV] +Cell[12,35] 0.00070285609439873 [GeV] +Cell[12,36] 0.00029539592655658 [GeV] +Cell[13,16] 0.0027734008624644 [GeV] +Cell[13,17] 0.001764230621716 [GeV] +Cell[13,15] 7.1142245436249e-05 [GeV] +Cell[10,12] 3.8141733966768e-09 [GeV] +Cell[11,41] 7.0046703913249e-06 [GeV] +Cell[11,18] 0.0071186963277985 [GeV] +Cell[11,21] 5.9740268625319e-09 [GeV] +Cell[11,15] 2.5841464960195e-06 [GeV] +Cell[12,16] 0.0065298830888943 [GeV] +Cell[19,17] 1.9518483895808e-09 [GeV] +Cell[12,17] 0.41617758027621 [GeV] +Cell[11,16] 5.5428698022752e-05 [GeV] +Cell[18,18] 3.0349124926943e-07 [GeV] +Cell[12,18] 0.047587281088024 [GeV] +Cell[18,17] 0.0004131085622023 [GeV] +Cell[19,18] 1.1068390449509e-08 [GeV] +Cell[12,19] 0.0010673951369935 [GeV] +### Total energy deposition in calorimeter by a source track in 22 cells : 0.48810429501438 (GeV) -Source track ID 5951 (gamma,0.15251351239083[GeV]) at (-487.09323647994,-112.87240130121,-730.31341538657) +Source track ID 4830 (gamma,0.15251351239083[GeV]) at (-487.09323696818,-112.87239919422,-730.31343465937) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[5,24] 0.0053072683298085 [GeV] -Cell[6,25] 0.12493846958619 [GeV] -Cell[5,26] 0.0044509303203997 [GeV] -Cell[5,25] 0.0051212625081934 [GeV] -Cell[6,26] 0.012695581646233 [GeV] -### Total energy deposition in calorimeter by a source track in 5 cells : 0.15251351239083 (GeV) +Cell[6,25] 0.13865321607727 [GeV] +Cell[3,14] 9.0087859013726e-05 [GeV] +Cell[7,0] 0.0003329439596905 [GeV] +Cell[5,14] 0.0012589698683278 [GeV] +Cell[3,10] 9.202513484294e-05 [GeV] +Cell[5,10] 0.0015580884106332 [GeV] +Cell[5,2] 0.00021041665388122 [GeV] +Cell[11,0] 0.00066491862027513 [GeV] +Cell[5,45] 0.00038088426847422 [GeV] +Cell[5,25] 0.0015201170244267 [GeV] +Cell[5,26] 0.0077518445139899 [GeV] +### Total energy deposition in calorimeter by a source track in 11 cells : 0.15251351239083 (GeV) -Source track ID 5952 (gamma,0.13352323164713[GeV]) at (-462.29599661224,-190.47942544089,2.9650585337884) +Source track ID 4831 (gamma,0.13352323164713[GeV]) at (-462.29599608057,-190.47942673128,2.9650711361214) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,36] 0.0015739984953654 [GeV] -Cell[10,33] 0.00026099355881144 [GeV] -Cell[9,27] 0.00095593395443273 [GeV] -Cell[10,27] 0.030346113094159 [GeV] -Cell[10,26] 0.085938356368453 [GeV] -Cell[9,26] 0.014197830824719 [GeV] -### Total energy deposition in calorimeter by a source track in 6 cells : 0.13327322629594 (GeV) +Cell[10,27] 0.021718841420738 [GeV] +Cell[9,27] 0.0077935442744244 [GeV] +Cell[9,26] 0.015492259671617 [GeV] +Cell[10,26] 0.088518586280349 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.13352323164713 (GeV) -Source track ID 5936 (pi-,0.85376620479487[GeV]) at (324.53968736038,-380.36034405288,733.29307853359) +Source track ID 4816 (pi-,0.85377982792133[GeV]) at (323.72439501796,-381.05447913685,732.72714259843) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[10,10] 1.1416798181017e-05 [GeV] -Cell[14,44] 2.2699087674027e-07 [GeV] -Cell[14,43] 0.0014556081442478 [GeV] -Cell[15,39] 0.0012742963113917 [GeV] -Cell[17,5] 0.00025302858891882 [GeV] -Cell[12,10] 1.1876271759093e-06 [GeV] -Cell[12,26] 1.1670879903249e-05 [GeV] -Cell[12,11] 0.00037214171639869 [GeV] -Cell[11,11] 5.7109506611823e-06 [GeV] -Cell[11,2] 3.0746544071008e-06 [GeV] -Cell[11,9] 1.2761276229867e-07 [GeV] -Cell[13,30] 1.0241155454423e-05 [GeV] -Cell[15,4] 0.00023723523272463 [GeV] -Cell[15,3] 0.00033196251968059 [GeV] -Cell[16,43] 1.8460084027083e-07 [GeV] -Cell[15,43] 0.00097973604460129 [GeV] -Cell[13,41] 0.091578361527399 [GeV] -Cell[14,39] 0.00024558125741419 [GeV] -Cell[14,40] 0.0051628200696101 [GeV] -Cell[16,38] 0.00128580141036 [GeV] -Cell[16,37] 0.0012490421982095 [GeV] -Cell[16,39] 1.6364479262847e-05 [GeV] -Cell[16,40] 0.00069166128471488 [GeV] -Cell[15,40] 0.011395378175514 [GeV] -Cell[15,41] 0.27403252658573 [GeV] -Cell[15,28] 2.5587426066522e-05 [GeV] -Cell[16,7] 7.9898303695245e-06 [GeV] -Cell[16,6] 0.00052210566378506 [GeV] -Cell[15,42] 0.0049256466947399 [GeV] -Cell[14,41] 0.2113117521811 [GeV] -Cell[17,7] 1.4159613101583e-08 [GeV] -Cell[17,8] 7.569252261419e-09 [GeV] -Cell[15,29] 3.0696178201879e-06 [GeV] -Cell[16,28] 6.075156852603e-08 [GeV] -Cell[14,42] 0.0081058835107086 [GeV] -Cell[15,1] 1.4677428407595e-07 [GeV] -Cell[16,41] 0.0053890573159649 [GeV] -Cell[11,16] 0.00013978867308549 [GeV] -Cell[13,11] 5.1416319300074e-05 [GeV] -Cell[15,2] 0.00015830062762825 [GeV] -### Total energy deposition in calorimeter by a source track in 40 cells : 0.62124621393173 (GeV) +Cell[8,11] 5.6841236073524e-09 [GeV] +Cell[10,27] 1.9128522126266e-09 [GeV] +Cell[10,28] 1.4828959275519e-06 [GeV] +Cell[11,17] 0.0002744063184083 [GeV] +Cell[12,32] 6.2524647801183e-06 [GeV] +Cell[14,43] 0.063295650333348 [GeV] +Cell[14,4] 0.0040847795947177 [GeV] +Cell[14,45] 0.0048641357282238 [GeV] +Cell[13,39] 3.2344842116231e-05 [GeV] +Cell[14,44] 0.0063120532519242 [GeV] +Cell[13,41] 0.085416879714869 [GeV] +Cell[10,9] 1.1873414837282e-07 [GeV] +Cell[10,40] 0.00019013101340397 [GeV] +Cell[9,40] 6.794311957492e-11 [GeV] +Cell[10,29] 3.3094548103236e-05 [GeV] +Cell[13,38] 8.1116352611048e-05 [GeV] +Cell[12,34] 9.4961231807247e-06 [GeV] +Cell[12,35] 0.00069833519739223 [GeV] +Cell[12,44] 0.0022966246598546 [GeV] +Cell[12,45] 0.00029193808156118 [GeV] +Cell[13,43] 0.0024926843444318 [GeV] +Cell[13,44] 0.0030139273595158 [GeV] +Cell[14,3] 0.0001712131448536 [GeV] +Cell[14,40] 0.018665195030328 [GeV] +Cell[15,40] 4.3864128151654e-06 [GeV] +Cell[14,41] 0.068671898505946 [GeV] +Cell[15,41] 3.5714201658266e-09 [GeV] +Cell[10,30] 0.00010655939249932 [GeV] +Cell[13,35] 5.8242904157169e-06 [GeV] +Cell[13,36] 6.4075912268891e-07 [GeV] +Cell[15,23] 3.8321071770042e-08 [GeV] +Cell[17,20] 0.00011324663547089 [GeV] +Cell[15,39] 0.00061241690797997 [GeV] +Cell[11,42] 2.6950652099913e-05 [GeV] +Cell[11,41] 0.0002647138565477 [GeV] +Cell[12,41] 9.6058275903488e-05 [GeV] +Cell[11,43] 0.001442164215376 [GeV] +Cell[10,42] 8.6195272624536e-06 [GeV] +Cell[12,42] 0.0072742285989096 [GeV] +Cell[11,18] 0.00047624116128918 [GeV] +Cell[12,21] 0.00033676280656039 [GeV] +Cell[13,45] 0.066538650778389 [GeV] +Cell[15,44] 1.7327766613562e-08 [GeV] +Cell[12,43] 0.0021190455829553 [GeV] +Cell[10,41] 0.0015757918815188 [GeV] +Cell[13,42] 0.0062169979656593 [GeV] +Cell[14,39] 0.010438011819256 [GeV] +Cell[13,40] 0.0061877416466322 [GeV] +Cell[11,15] 2.2615546014322e-06 [GeV] +Cell[14,38] 0.00049976428201501 [GeV] +Cell[16,37] 5.4454616247313e-08 [GeV] +Cell[18,20] 2.7047644834965e-09 [GeV] +Cell[14,42] 0.017688345201514 [GeV] +Cell[15,42] 0.00033401317680284 [GeV] +Cell[15,43] 5.5163466895465e-06 [GeV] +Cell[15,24] 8.5072183355805e-07 [GeV] +Cell[16,44] 0.0001998354108435 [GeV] +Cell[14,46] 1.7508139080746e-08 [GeV] +Cell[11,16] 0.00026666549194772 [GeV] +Cell[16,45] 6.6755135776475e-08 [GeV] +Cell[12,19] 1.3410175131867e-05 [GeV] +Cell[12,20] 0.00053505532810664 [GeV] +Cell[8,15] 2.9674265533686e-09 [GeV] +Cell[14,5] 0.0018402805441283 [GeV] +### Total energy deposition in calorimeter by a source track in 64 cells : 0.38613502091518 (GeV) -Source track ID 5933 (gamma,0.37778731993224[GeV]) at (315.8962049503,-387.56881672549,149.20557417954) +Source track ID 4813 (gamma,0.37778731993224[GeV]) at (315.89620791871,-387.56881430602,149.20557729779) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[10,43] 0.00063138441013149 [GeV] -Cell[9,39] 0.00019579179901181 [GeV] -Cell[10,41] 0.34550567718043 [GeV] -Cell[10,40] 0.0056173513732575 [GeV] -Cell[6,27] 0.00068318977418909 [GeV] -Cell[10,42] 0.0012093629721694 [GeV] -Cell[11,41] 0.022559956928331 [GeV] -Cell[11,37] 0.00031476791998381 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.3767174823575 (GeV) +Cell[10,40] 0.0066148123025794 [GeV] +Cell[11,40] 0.0059914034296009 [GeV] +Cell[11,41] 0.0065457010522743 [GeV] +Cell[10,41] 0.35863540314779 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.37778731993224 (GeV) -Source track ID 5934 (gamma,0.13885684299554[GeV]) at (475.10692455716,-155.79926263574,345.33262549608) +Source track ID 4814 (gamma,0.13885684299554[GeV]) at (475.1069207763,-155.79927416538,345.33261913247) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[11,44] 0.0034271105531917 [GeV] -Cell[12,44] 0.00037510524535212 [GeV] -Cell[12,45] 0.0059046760848127 [GeV] -Cell[12,46] 0.001321569000534 [GeV] -Cell[11,45] 0.12576871747609 [GeV] -Cell[11,46] 0.0020596646355601 [GeV] -### Total energy deposition in calorimeter by a source track in 6 cells : 0.13885684299554 (GeV) +Cell[5,35] 0.00023183914668341 [GeV] +Cell[11,29] 0.00015734745953525 [GeV] +Cell[11,45] 0.11952413204574 [GeV] +Cell[10,47] 0.00034329268997995 [GeV] +Cell[12,46] 0.00045065558461233 [GeV] +Cell[11,46] 0.016509597141943 [GeV] +### Total energy deposition in calorimeter by a source track in 6 cells : 0.1372168640685 (GeV) -Source track ID 5782 (gamma,0.0020459966955143[GeV]) at (-238.27407272099,439.57418744616,-155.88932907728) +Source track ID 4746 (gamma,0.1484777566564[GeV]) at (-237.22761372648,440.1398178825,-159.00519819459) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[9,15] 0.0020459966955143 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.0020459966955143 (GeV) +Cell[9,16] 0.0021878346735725 [GeV] +Cell[9,14] 0.001519020379106 [GeV] +Cell[9,15] 0.14425990269372 [GeV] +Cell[9,17] 0.00051099891 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.1484777566564 (GeV) -Source track ID 5784 (gamma,0.0009848835750661[GeV]) at (-331.72803018617,374.10762353741,-164.47819375577) +Source track ID 4747 (gamma,0.20137908385321[GeV]) at (152.32666809887,476.23165181023,-66.015724724987) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[9,18] 0.0009848835750661 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.0009848835750661 (GeV) +Cell[9,9] 0.18696341864563 [GeV] +Cell[9,10] 0.00027718573760077 [GeV] +Cell[9,8] 0.00021423474119264 [GeV] +Cell[6,24] 0.0034835922210604 [GeV] +Cell[13,39] 0.00049354695190618 [GeV] +Cell[0,6] 6.9341132586942e-05 [GeV] +Cell[1,6] 0.00035986105715506 [GeV] +Cell[3,29] 6.8964183155913e-06 [GeV] +Cell[3,26] 0.00069413438870529 [GeV] +Cell[7,38] 0.00016676617875261 [GeV] +Cell[3,27] 0.00017693193332707 [GeV] +### Total energy deposition in calorimeter by a source track in 11 cells : 0.19290590940623 (GeV) -Source track ID 5789 (gamma,0.00073780561283205[GeV]) at (-493.05430927178,83.050876627101,-352.23272580244) +Source track ID 4740 (pi-,0.39547986188493[GeV]) at (391.75815757835,-310.68560631419,357.24843121614) Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,22] 0.00073780561283205 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00073780561283205 (GeV) +Cell[8,9] 0.00084683632135761 [GeV] +Cell[8,45] 0.00028412417219648 [GeV] +Cell[8,46] 0.00087204217362572 [GeV] +Cell[9,9] 4.2338136699982e-07 [GeV] +Cell[7,7] 2.2759195417166e-11 [GeV] +Cell[8,7] 4.4709504214097e-05 [GeV] +Cell[9,24] 4.143542441966e-06 [GeV] +Cell[8,6] 3.1925406074151e-07 [GeV] +Cell[5,9] 0.0001098686041272 [GeV] +Cell[5,33] 5.1096975539622e-09 [GeV] +Cell[12,28] 6.0569961206056e-06 [GeV] +Cell[14,45] 0.0013878107379367 [GeV] +Cell[10,25] 0.0004009811623037 [GeV] +Cell[13,22] 3.2790543307783e-05 [GeV] +Cell[7,23] 1.7719420138746e-06 [GeV] +Cell[10,40] 0.00017208228562507 [GeV] +Cell[10,39] 0.00017452523034208 [GeV] +Cell[6,35] 7.913441513665e-07 [GeV] +Cell[6,34] 3.8352012052201e-07 [GeV] +Cell[10,33] 0.0010957968047865 [GeV] +Cell[11,28] 0.0021768066190724 [GeV] +Cell[9,25] 5.3171328543158e-06 [GeV] +Cell[12,44] 0.04439414485358 [GeV] +Cell[12,45] 0.0036812715263656 [GeV] +Cell[13,34] 0.0048573170039574 [GeV] +Cell[5,11] 2.3809210688341e-08 [GeV] +Cell[11,45] 0.0001321862594491 [GeV] +Cell[5,10] 1.6656064147355e-05 [GeV] +Cell[16,28] 0.0024377792495869 [GeV] +Cell[5,47] 1.9541960791685e-06 [GeV] +Cell[14,24] 0.00018854524439055 [GeV] +Cell[12,46] 7.5076739700535e-05 [GeV] +Cell[17,30] 0.00049505493038598 [GeV] +Cell[16,17] 3.0770275043324e-06 [GeV] +Cell[11,42] 0.076692675385211 [GeV] +Cell[12,41] 0.00012357531418661 [GeV] +Cell[11,44] 0.0038271261905857 [GeV] +Cell[11,43] 0.013836057945093 [GeV] +Cell[13,29] 0.00082238344106748 [GeV] +Cell[12,42] 0.001665424778675 [GeV] +Cell[11,5] 0.00035282150186572 [GeV] +Cell[12,43] 0.0042971023251771 [GeV] +Cell[14,8] 8.7089882290456e-06 [GeV] +Cell[10,41] 0.00015318756135332 [GeV] +Cell[10,3] 0.0001846023812127 [GeV] +Cell[10,5] 1.279855816847e-07 [GeV] +Cell[10,4] 2.6923542736768e-07 [GeV] +Cell[11,6] 0.0026582284053032 [GeV] +Cell[17,13] 7.6541803427972e-06 [GeV] +Cell[13,23] 0.00060781433169996 [GeV] +Cell[17,29] 1.0682692169212e-05 [GeV] +Cell[6,33] 2.5778337236829e-05 [GeV] +Cell[14,12] 0.00025911603736912 [GeV] +Cell[17,14] 1.1731078149751e-05 [GeV] +Cell[18,11] 5.7227008801419e-06 [GeV] +Cell[18,1] 0.00043700358145941 [GeV] +Cell[18,12] 0.00052718949426312 [GeV] +Cell[19,13] 5.6547759159002e-06 [GeV] +Cell[19,12] 0.00020619457787939 [GeV] +### Total energy deposition in calorimeter by a source track in 59 cells : 0.17062750653517 (GeV) -Source track ID 5794 (gamma,0.00011545222769339[GeV]) at (-350.1619291923,-356.91262704523,-290.3873525127) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,30] 0.00011545222769339 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00011545222769339 (GeV) - -Source track ID 5795 (gamma,0.00015591648169263[GeV]) at (467.71304251954,176.76116614549,-280.24831827142) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,2] 0.00015591648169263 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00015591648169263 (GeV) - -Source track ID 5797 (gamma,9.2511754719382e-05[GeV]) at (1.619727005738,499.99737647754,-221.08510517006) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,11] 9.2511754719382e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 9.2511754719382e-05 (GeV) - -Source track ID 5803 (gamma,0.00038066955727289[GeV]) at (135.3656822654,-481.32746863733,-417.79698035887) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[7,38] 0.00038066955727289 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00038066955727289 (GeV) - -Source track ID 5804 (gamma,0.002706175588052[GeV]) at (151.98050201661,-476.34223726936,-292.15099203442) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,36] 0.00041678622717985 [GeV] -Cell[8,38] 0.0022893893608721 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.002706175588052 (GeV) - -Source track ID 5810 (gamma,0.00027525059349082[GeV]) at (157.54247361572,-474.53173656463,-372.71436664932) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,38] 0.00027525059349082 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00027525059349082 (GeV) - -Source track ID 5817 (gamma,0.00060392534683689[GeV]) at (-342.52773522551,364.24545378259,-249.93398696784) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,17] 0.00060392534683689 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00060392534683689 (GeV) - -Source track ID 5821 (gamma,0.00022966561361808[GeV]) at (-303.24423365804,397.54614166553,-186.00734415683) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[9,16] 0.00022966561361808 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00022966561361808 (GeV) - -Source track ID 5822 (gamma,0.0010912311943299[GeV]) at (-300.60393617577,399.54633467926,-200.33578116759) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,16] 0.0010912311943299 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.0010912311943299 (GeV) - -Source track ID 5824 (gamma,0.00083847563280789[GeV]) at (329.46333544068,-376.10359025181,199.55592537202) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[11,41] 0.00083847563280789 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00083847563280789 (GeV) - -Source track ID 5734 (gamma,0.00064259624081402[GeV]) at (-158.6814762826,474.15207379571,-156.00147406635) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[9,14] 0.00064259624081402 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00064259624081402 (GeV) - -Source track ID 5745 (gamma,0.0010813086538754[GeV]) at (-102.45160891339,489.39111948528,-343.88785938997) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,12] 0.0010813086538754 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.0010813086538754 (GeV) - -Source track ID 5746 (gamma,0.016801610599748[GeV]) at (480.56926965144,138.03324623683,-512.7735937058) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[7,2] 0.00030054722151829 [GeV] -Cell[7,1] 0.01650106337823 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.016801610599748 (GeV) - -Source track ID 5747 (gamma,0.012222631169331[GeV]) at (499.4298359082,23.871300859242,-604.28479215472) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[7,22] 0.0010064332685896 [GeV] -Cell[7,32] 0.00045928623365286 [GeV] -Cell[6,0] 0.01012897834846 [GeV] -Cell[9,47] 0.00015348049439195 [GeV] -### Total energy deposition in calorimeter by a source track in 4 cells : 0.011748178345095 (GeV) - -Source track ID 5748 (gamma,0.00025930325652574[GeV]) at (-64.895743737261,495.77065508639,-310.23835258089) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[8,12] 0.00025930325652574 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00025930325652574 (GeV) - -Source track ID 5731 (e+,0.024484459925203[GeV]) at (-312.30227860747,390.47059655829,-1075.0624566198) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[5,1] 0.00051099891 [GeV] -Cell[4,17] 0.024484459925203 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.024995458835203 (GeV) - -Source track ID 5729 (gamma,0.20137908385321[GeV]) at (152.32664034762,476.23166068669,-66.015733885499) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[9,8] 0.0011767872282789 [GeV] -Cell[9,10] 0.015490465720651 [GeV] -Cell[9,9] 0.18208372128687 [GeV] -Cell[9,15] 0.0017071391341358 [GeV] -### Total energy deposition in calorimeter by a source track in 4 cells : 0.20045811336994 (GeV) - -Source track ID 5693 (pi-,0.39498895612547[GeV]) at (384.17047449798,-320.02038454449,363.18795552462) -Original primary track ID 29 (unknown,1.6025887774154[GeV]) -Cell[14,30] 0.004481763879829 [GeV] -Cell[14,31] 1.9697085463122e-08 [GeV] -Cell[13,31] 1.7833844651364e-05 [GeV] -Cell[13,28] 0.00095463384161565 [GeV] -Cell[12,29] 1.260675128924e-05 [GeV] -Cell[11,20] 0.00013235351864205 [GeV] -Cell[6,39] 0.0011604437884874 [GeV] -Cell[7,40] 0.00087932900989986 [GeV] -Cell[12,30] 1.2731176411762e-08 [GeV] -Cell[13,29] 0.0095314306686358 [GeV] -Cell[13,30] 0.0054660306060954 [GeV] -Cell[11,43] 0.01886665871792 [GeV] -Cell[11,44] 1.8389645174466e-07 [GeV] -Cell[12,44] 0.0072850336567352 [GeV] -Cell[12,45] 0.00018823240341828 [GeV] -Cell[13,44] 0.00053625871612749 [GeV] -Cell[13,43] 0.0024829599313941 [GeV] -Cell[12,46] 0.00065522286547184 [GeV] -Cell[12,47] 1.9157834231009e-08 [GeV] -Cell[13,42] 0.0016982213407156 [GeV] -Cell[13,41] 1.0566627679509e-09 [GeV] -Cell[12,43] 0.12776353773269 [GeV] -Cell[11,42] 0.051641770248085 [GeV] -Cell[11,45] 9.5850645038809e-09 [GeV] -Cell[12,42] 0.0059461248568907 [GeV] -Cell[12,41] 0.00028887210631251 [GeV] -Cell[14,42] 0.0018438157543443 [GeV] -Cell[6,40] 0.0015891226110981 [GeV] -Cell[10,20] 0.00017283494145192 [GeV] -Cell[10,21] 0.00097439179516061 [GeV] -Cell[9,17] 0.001442135472235 [GeV] -Cell[14,29] 0.0035965858462979 [GeV] -Cell[14,28] 0.0030857601310789 [GeV] -### Total energy deposition in calorimeter by a source track in 33 cells : 0.25269421116085 (GeV) - -Source track ID 5685 (gamma,0.094503470007519[GeV]) at (318.07142318977,385.78565259744,-1059.6704640505) +Source track ID 4732 (gamma,0.094503470007519[GeV]) at (318.07142219989,385.78565341357,-1059.6704152366) Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[5,47] 0.00040165394888633 [GeV] -Cell[4,6] 0.088405654806823 [GeV] -Cell[4,7] 0.0056961612518092 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.094503470007519 (GeV) +Cell[6,44] 0.00042300414113151 [GeV] +Cell[0,28] 0.0014350179231857 [GeV] +Cell[4,6] 0.085305199141707 [GeV] +Cell[4,7] 0.00029848052970247 [GeV] +Cell[5,25] 0.0022402392778774 [GeV] +Cell[2,44] 0.0011406443873001 [GeV] +### Total energy deposition in calorimeter by a source track in 6 cells : 0.090842585400904 (GeV) -Source track ID 5639 (pi+,0.33206527872119[GeV]) at (212.7123201824,452.49692688749,-1593.2513744835) +Source track ID 4684 (pi+,0.33214795006178[GeV]) at (215.27719390839,451.28231716181,-1600.9490077383) Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[0,44] 0.0024095348447587 [GeV] -Cell[1,7] 0.12362531145702 [GeV] -Cell[2,8] 0.0098091213219436 [GeV] -Cell[1,6] 0.0012911832585331 [GeV] -Cell[2,6] 0.00041109841665807 [GeV] -Cell[1,8] 0.10800189456205 [GeV] -### Total energy deposition in calorimeter by a source track in 6 cells : 0.24554814386096 (GeV) +Cell[8,9] 0.00028163296523041 [GeV] +Cell[8,10] 0.00031824592702105 [GeV] +Cell[7,10] 3.8535562225661e-09 [GeV] +Cell[8,11] 2.182787284255e-11 [GeV] +Cell[7,11] 1.2809314284823e-09 [GeV] +Cell[7,46] 3.044914783095e-05 [GeV] +Cell[10,37] 1.1634197318926e-05 [GeV] +Cell[3,4] 2.7480770047987e-05 [GeV] +Cell[3,5] 0.00072128136251661 [GeV] +Cell[3,6] 0.00094340663919081 [GeV] +Cell[2,7] 0.00070105163117603 [GeV] +Cell[2,6] 0.0056299652684572 [GeV] +Cell[3,9] 0.00037931792517497 [GeV] +Cell[1,6] 0.004615328675363 [GeV] +Cell[2,8] 6.5699434061344e-06 [GeV] +Cell[3,8] 2.4455951210257e-05 [GeV] +Cell[1,8] 0.10413648775907 [GeV] +Cell[2,22] 0.00016491426033826 [GeV] +Cell[2,5] 0.00067266376330047 [GeV] +Cell[1,7] 0.06696699234698 [GeV] +Cell[1,5] 4.2552754848657e-09 [GeV] +Cell[2,23] 0.0024632308338208 [GeV] +Cell[3,10] 9.3454796228798e-08 [GeV] +Cell[9,45] 8.2958260027226e-06 [GeV] +Cell[10,41] 1.5993355744286e-05 [GeV] +Cell[9,37] 1.3693146873266e-05 [GeV] +Cell[2,24] 4.1566268009774e-09 [GeV] +Cell[1,9] 0.0094895769066662 [GeV] +Cell[1,10] 0.0020611608004795 [GeV] +Cell[2,9] 0.00077109048322745 [GeV] +Cell[2,10] 0.0008166409044461 [GeV] +### Total energy deposition in calorimeter by a source track in 31 cells : 0.2012716678139 (GeV) -Source track ID 5640 (pi-,0.61477343388711[GeV]) at (86.148877182435,492.52245731561,-889.77322719225) +Source track ID 4685 (pi-,0.61475635385705[GeV]) at (83.564453321563,492.96752645693,-891.65578142264) Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[7,5] 6.0753645292721e-05 [GeV] -Cell[5,26] 0.00066006512589583 [GeV] -Cell[9,35] 0.0057127824303001 [GeV] -Cell[7,41] 0.0041447821054479 [GeV] -Cell[5,47] 0.0024682453603437 [GeV] -Cell[5,11] 0.15162493561557 [GeV] -Cell[10,24] 1.1701417865538e-05 [GeV] -Cell[10,3] 6.1904325718842e-07 [GeV] -Cell[10,1] 0.00059775847428955 [GeV] -Cell[9,1] 0.00024978620931131 [GeV] -Cell[9,21] 0.00018676519418045 [GeV] -Cell[8,21] 0.00077982707492345 [GeV] -Cell[10,2] 2.0348938708594e-05 [GeV] -Cell[7,43] 0.0046109839824545 [GeV] -Cell[4,8] 0.00067850251623084 [GeV] -Cell[3,9] 2.5780716532608e-05 [GeV] -Cell[7,40] 0.00075253273980024 [GeV] -Cell[13,29] 1.7651124217082e-05 [GeV] -Cell[5,17] 0.0013786157640971 [GeV] -Cell[3,10] 0.0004358205491423 [GeV] -Cell[3,11] 3.7145024107303e-06 [GeV] -Cell[5,44] 0.00086413905082052 [GeV] -Cell[4,31] 0.0072687261111399 [GeV] -Cell[4,46] 3.9216169243446e-05 [GeV] -Cell[2,8] 0.0068069309299858 [GeV] -Cell[2,7] 0.00030671987130222 [GeV] -Cell[3,7] 0.025292507999096 [GeV] -Cell[4,35] 0.0009362252973974 [GeV] -Cell[2,6] 1.1179299315245e-07 [GeV] -Cell[4,12] 0.0058047986549257 [GeV] -Cell[1,37] 0.0012032144604832 [GeV] -Cell[3,8] 0.0074488151506353 [GeV] -Cell[13,43] 5.0278912340218e-09 [GeV] -Cell[13,42] 0.00020832037490402 [GeV] -Cell[13,41] 1.2073162739398e-05 [GeV] -Cell[14,40] 0.0003545362087483 [GeV] -Cell[14,41] 0.00033778633898953 [GeV] -Cell[10,25] 0.00013082584920483 [GeV] -Cell[4,30] 7.1930604812906e-05 [GeV] -Cell[14,42] 1.7379987764343e-07 [GeV] -Cell[9,20] 1.0619430997849e-07 [GeV] -Cell[9,47] 2.1624331711791e-06 [GeV] -Cell[5,10] 0.074617684645654 [GeV] -Cell[4,11] 0.21013595047462 [GeV] -Cell[4,10] 0.0013474909910766 [GeV] -Cell[5,12] 0.011990255171259 [GeV] -### Total energy deposition in calorimeter by a source track in 46 cells : 0.52960267929556 (GeV) +Cell[8,8] 0.00056855497991842 [GeV] +Cell[7,8] 7.1359150429089e-06 [GeV] +Cell[6,41] 0.0022528681424819 [GeV] +Cell[7,6] 8.9322568674106e-06 [GeV] +Cell[6,43] 0.00038002287585426 [GeV] +Cell[8,39] 3.3102276120189e-10 [GeV] +Cell[6,10] 0.00093260084682218 [GeV] +Cell[5,27] 3.6967227357763e-05 [GeV] +Cell[5,18] 1.6315025277436e-09 [GeV] +Cell[7,5] 0.00011307665983088 [GeV] +Cell[6,6] 4.5617314754054e-08 [GeV] +Cell[4,40] 2.910659823101e-07 [GeV] +Cell[9,21] 5.9125275583938e-08 [GeV] +Cell[5,9] 0.0086976488679584 [GeV] +Cell[4,8] 0.00023594596838666 [GeV] +Cell[4,9] 0.00030794958440674 [GeV] +Cell[5,8] 0.0032665087956883 [GeV] +Cell[5,33] 2.3541698261397e-05 [GeV] +Cell[4,45] 0.00060423537099871 [GeV] +Cell[8,38] 0.0069036396775635 [GeV] +Cell[8,20] 3.996619489044e-08 [GeV] +Cell[4,12] 0.0081744571846834 [GeV] +Cell[6,20] 4.7745428028065e-06 [GeV] +Cell[8,19] 4.397362872669e-05 [GeV] +Cell[6,35] 0.0016484077113626 [GeV] +Cell[6,34] 0.00094239669889009 [GeV] +Cell[5,0] 0.00071997874360734 [GeV] +Cell[6,19] 8.1403354566305e-05 [GeV] +Cell[9,46] 1.1908215936273e-05 [GeV] +Cell[9,16] 8.4589974721894e-07 [GeV] +Cell[0,30] 0.001465903088371 [GeV] +Cell[0,29] 0.0017264414025235 [GeV] +Cell[6,40] 0.00030732434859294 [GeV] +Cell[7,41] 0.0061348431632703 [GeV] +Cell[7,40] 0.0070619424904345 [GeV] +Cell[8,40] 5.523152067326e-06 [GeV] +Cell[5,11] 0.023060427384374 [GeV] +Cell[4,11] 1.0594560878076e-05 [GeV] +Cell[4,18] 0.00067245736340044 [GeV] +Cell[4,19] 1.8153915561925e-09 [GeV] +Cell[5,19] 6.9980185503482e-07 [GeV] +Cell[4,17] 0.0003908902029001 [GeV] +Cell[4,16] 1.4235616836231e-06 [GeV] +Cell[4,10] 0.0037282898575942 [GeV] +Cell[5,28] 0.00027577727029097 [GeV] +Cell[3,30] 1.9090658490313e-05 [GeV] +Cell[0,31] 2.4081041367026e-05 [GeV] +Cell[3,8] 3.2003386847919e-06 [GeV] +Cell[5,13] 0.0013394533859751 [GeV] +Cell[3,46] 0.00044472811974458 [GeV] +Cell[7,43] 2.2151891054818e-05 [GeV] +Cell[2,31] 0.00010563932347577 [GeV] +Cell[2,30] 2.5155994687793e-05 [GeV] +Cell[3,38] 7.6456926763058e-09 [GeV] +Cell[8,18] 0.00048192100846347 [GeV] +Cell[5,10] 0.13012211735907 [GeV] +Cell[1,31] 3.1048973099814e-06 [GeV] +Cell[4,13] 6.4095365814865e-10 [GeV] +Cell[4,6] 1.4163670130074e-09 [GeV] +Cell[4,7] 5.3592957556248e-09 [GeV] +Cell[3,31] 0.0032583467450319 [GeV] +Cell[8,42] 0.0013913603607637 [GeV] +Cell[10,13] 5.45191057995e-07 [GeV] +Cell[8,41] 0.00032675361357023 [GeV] +Cell[7,38] 0.0047490588869617 [GeV] +Cell[7,39] 0.012043522500081 [GeV] +Cell[6,38] 2.2851177200209e-06 [GeV] +Cell[7,37] 1.0903571591143e-06 [GeV] +Cell[7,17] 0.00050746694150405 [GeV] +Cell[3,40] 0.0019446731398673 [GeV] +Cell[6,39] 0.0011459347783851 [GeV] +Cell[6,33] 2.0013121740476e-05 [GeV] +Cell[9,22] 0.0018920782353525 [GeV] +Cell[5,7] 0.0024855491333117 [GeV] +Cell[3,39] 4.3970109433531e-05 [GeV] +Cell[9,19] 1.7441893826117e-05 [GeV] +Cell[2,10] 0.00036344378013575 [GeV] +Cell[5,12] 0.0087774770843306 [GeV] +Cell[6,12] 7.7919376167301e-08 [GeV] +Cell[6,11] 0.00016723421447568 [GeV] +Cell[8,17] 3.7236962649331e-05 [GeV] +Cell[7,16] 5.6470073559467e-09 [GeV] +Cell[9,47] 0.00089292534597655 [GeV] +Cell[5,6] 1.3704131094983e-07 [GeV] +Cell[9,18] 8.796029665973e-06 [GeV] +### Total energy deposition in calorimeter by a source track in 85 cells : 0.25347883528001 (GeV) -Source track ID 3959 (pi+,0.42344749866135[GeV]) at (-383.07385023561,321.33226614467,-1070.885200294) +Source track ID 4678 (mu+,0.35164981889217[GeV]) at (-380.04194059031,324.91248574401,-1106.1701276854) Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[9,8] 1.6394306258007e-06 [GeV] -Cell[5,32] 9.4753535813652e-06 [GeV] -Cell[6,32] 0.0020679393290073 [GeV] -Cell[9,7] 5.1723909564316e-08 [GeV] -Cell[1,44] 6.249986894295e-05 [GeV] -Cell[0,44] 9.1962956710745e-05 [GeV] -Cell[8,33] 5.4393537561737e-07 [GeV] -Cell[8,34] 1.0233344653443e-07 [GeV] -Cell[4,8] 0.0015702442045465 [GeV] -Cell[4,2] 0.00033281049733887 [GeV] -Cell[4,3] 8.4064118728747e-05 [GeV] -Cell[4,4] 0.00048011026987547 [GeV] -Cell[6,31] 0.00038150461847101 [GeV] -Cell[6,11] 2.0892388420179e-08 [GeV] -Cell[4,1] 7.0249913551379e-06 [GeV] -Cell[5,18] 0.0020870110783171 [GeV] -Cell[4,18] 0.11234337609304 [GeV] -Cell[4,17] 0.18973465952598 [GeV] -Cell[4,19] 0.0065452982276805 [GeV] -Cell[4,22] 1.2307078577578e-08 [GeV] -Cell[4,16] 9.8733231850133e-05 [GeV] -Cell[1,43] 0.00035550313335568 [GeV] -Cell[2,43] 5.9833080449607e-05 [GeV] -Cell[3,15] 0.0049971347532164 [GeV] -Cell[3,5] 0.00041282143078843 [GeV] -Cell[4,5] 0.0001709246097339 [GeV] -Cell[3,4] 0.0030182059883069 [GeV] -Cell[2,19] 1.0423013009131e-08 [GeV] -Cell[2,44] 0.00023403386216444 [GeV] -Cell[4,7] 0.0019440539726893 [GeV] -Cell[2,28] 0.00076754097894423 [GeV] -Cell[5,31] 7.9121465769276e-06 [GeV] -Cell[2,11] 7.0963869802654e-10 [GeV] -Cell[2,42] 4.9117195532745e-05 [GeV] -Cell[2,41] 0.0012131276572549 [GeV] -Cell[0,46] 9.8711170721799e-09 [GeV] -Cell[0,42] 0.00036943114827648 [GeV] -Cell[3,19] 6.9814526634104e-05 [GeV] -Cell[3,14] 0.0026640340892292 [GeV] -Cell[3,18] 0.0024206201141297 [GeV] -Cell[4,15] 3.5051964074455e-06 [GeV] -Cell[4,23] 2.1556974388659e-08 [GeV] -Cell[3,25] 4.562385060126e-06 [GeV] -Cell[1,29] 2.5470362743363e-08 [GeV] -Cell[3,17] 0.010420429130727 [GeV] -Cell[3,3] 5.9038343151542e-05 [GeV] -Cell[4,24] 9.961164323613e-09 [GeV] -Cell[3,29] 0.00019327459388285 [GeV] -Cell[3,16] 0.0010636104236247 [GeV] -Cell[0,43] 7.3658882671452e-06 [GeV] -### Total energy deposition in calorimeter by a source track in 50 cells : 0.34640505762892 (GeV) +Cell[4,18] 0.13114001819095 [GeV] +Cell[3,19] 0.00057518943674321 [GeV] +Cell[3,18] 0.15450470478866 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.28621991241635 (GeV) -Source track ID 5590 (pi-,0.49369497939696[GeV]) at (310.83352495226,-391.64080452087,-962.83760487069) +Source track ID 4631 (pi-,0.49370298907626[GeV]) at (310.87714943995,-391.60617711687,-960.6460679886) Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[8,9] 0.0012034767362635 [GeV] -Cell[8,10] 1.5019394524529e-05 [GeV] -Cell[9,8] 4.8678317625672e-09 [GeV] -Cell[8,8] 0.0013110948834162 [GeV] -Cell[4,37] 1.344335032627e-08 [GeV] -Cell[6,41] 1.1784068362886e-07 [GeV] -Cell[8,19] 0.00011368044891799 [GeV] -Cell[5,32] 0.00052721295168601 [GeV] -Cell[6,38] 0.00079425898450415 [GeV] -Cell[6,37] 6.9565979356412e-06 [GeV] -Cell[6,16] 0.001785695816344 [GeV] -Cell[5,41] 0.086003417899738 [GeV] -Cell[8,23] 0.00029747684151039 [GeV] -Cell[5,42] 0.0049558740885469 [GeV] -Cell[5,43] 5.9590092860162e-12 [GeV] -Cell[7,30] 1.7877787172438e-08 [GeV] -Cell[5,33] 1.7955329094548e-06 [GeV] -Cell[8,13] 0.00051239576405465 [GeV] -Cell[10,29] 2.5011575984536e-05 [GeV] -Cell[7,37] 3.9135954197263e-05 [GeV] -Cell[5,0] 1.9988457061118e-05 [GeV] -Cell[5,47] 1.6848712834872e-07 [GeV] -Cell[5,11] 0.002787537639567 [GeV] -Cell[9,7] 0.00032968245940401 [GeV] -Cell[7,14] 1.2426261037035e-08 [GeV] -Cell[15,39] 7.3130874462436e-05 [GeV] -Cell[12,29] 1.7749148246367e-05 [GeV] -Cell[6,39] 0.18281647015031 [GeV] -Cell[3,26] 0.00091470441975252 [GeV] -Cell[8,21] 4.3655745685101e-12 [GeV] -Cell[6,47] 2.6879371262112e-08 [GeV] -Cell[6,3] 3.3264223020524e-08 [GeV] -Cell[7,29] 5.4302844417862e-05 [GeV] -Cell[5,28] 9.000370154717e-05 [GeV] -Cell[7,28] 3.9298831998167e-05 [GeV] -Cell[10,28] 0.00013764160473875 [GeV] -Cell[10,27] 0.00031240691914229 [GeV] -Cell[0,21] 0.0043560689753297 [GeV] -Cell[4,17] 0.00087401832684259 [GeV] -Cell[3,39] 3.5519525408745e-07 [GeV] -Cell[3,42] 8.5780978152343e-05 [GeV] -Cell[4,16] 0.00026989947496531 [GeV] -Cell[3,37] 5.2015745459357e-05 [GeV] -Cell[1,19] 1.0800789890709e-05 [GeV] -Cell[0,19] 1.1381327087292e-05 [GeV] -Cell[1,7] 0.0025230434647434 [GeV] -Cell[3,28] 1.07453961391e-08 [GeV] -Cell[4,28] 8.715724106878e-10 [GeV] -Cell[3,23] 0.00051099891 [GeV] -Cell[3,15] 7.6510134622367e-06 [GeV] -Cell[0,20] 0.001247580136058 [GeV] -Cell[1,46] 1.9417115254328e-08 [GeV] -Cell[1,47] 3.8276767698903e-05 [GeV] -Cell[1,1] 1.7741308256518e-06 [GeV] -Cell[1,5] 7.1184420321515e-06 [GeV] -Cell[0,32] 0.00062633323289924 [GeV] -Cell[2,26] 0.0024132288708479 [GeV] -Cell[1,4] 6.6575426899362e-06 [GeV] -Cell[3,38] 0.0035766393164977 [GeV] -Cell[4,7] 1.6074496670626e-07 [GeV] -Cell[2,5] 3.858386335196e-05 [GeV] -Cell[2,23] 8.7751541286707e-09 [GeV] -Cell[2,8] 0.00030080375360831 [GeV] -Cell[2,7] 0.0022510572765053 [GeV] -Cell[4,40] 0.0019275128265237 [GeV] -Cell[2,31] 0.0021541025620266 [GeV] -Cell[1,0] 0.00091428994829766 [GeV] -Cell[4,38] 0.00069278607684532 [GeV] -Cell[6,42] 6.7533417313825e-07 [GeV] -Cell[5,31] 0.008599322974253 [GeV] -Cell[5,30] 0.0005024827105683 [GeV] -Cell[1,6] 0.00038397944149017 [GeV] -Cell[2,6] 8.7886441324372e-06 [GeV] -Cell[4,12] 0.0027806376606514 [GeV] -Cell[3,41] 0.0025098643606008 [GeV] -Cell[2,41] 1.6215785872191e-06 [GeV] -Cell[7,16] 0.0011039112077361 [GeV] -Cell[6,29] 2.5452247956764e-05 [GeV] -Cell[6,28] 0.00024734881617167 [GeV] -Cell[1,36] 0.00015581316837463 [GeV] -Cell[1,28] 0.00038721896446145 [GeV] -Cell[1,27] 5.2460939270986e-06 [GeV] -Cell[0,31] 2.6162335416302e-08 [GeV] -Cell[16,39] 0.00047998169553159 [GeV] -Cell[16,40] 6.1296687927097e-06 [GeV] -Cell[10,26] 0.00027034159498976 [GeV] -Cell[8,20] 0.0011074444211109 [GeV] -Cell[5,38] 0.00055414629791028 [GeV] -Cell[5,39] 0.0049163445548425 [GeV] -Cell[5,40] 0.0019086565552204 [GeV] -Cell[4,41] 0.00050690181421771 [GeV] -Cell[4,42] 0.0013246578019004 [GeV] -Cell[2,46] 1.1740339687094e-08 [GeV] -Cell[6,30] 0.00042920113055413 [GeV] -Cell[8,14] 0.00093244798291266 [GeV] -Cell[4,39] 0.00014955037041238 [GeV] -Cell[5,10] 0.0041340308918826 [GeV] -Cell[3,16] 1.0616222577482e-05 [GeV] -Cell[7,17] 0.00088643388220324 [GeV] -Cell[1,31] 0.0010529714916161 [GeV] -### Total energy deposition in calorimeter by a source track in 100 cells : 0.34546703260268 (GeV) +Cell[7,32] 0.00084233516907185 [GeV] +Cell[6,43] 1.1149065452628e-05 [GeV] +Cell[7,12] 2.3452729306882e-05 [GeV] +Cell[4,42] 6.3531725886605e-06 [GeV] +Cell[7,13] 0.00010112944315011 [GeV] +Cell[4,40] 0.014462091800272 [GeV] +Cell[5,46] 2.9195905663073e-05 [GeV] +Cell[7,46] 4.0901771077188e-05 [GeV] +Cell[4,33] 4.9026217311621e-08 [GeV] +Cell[5,33] 0.0010722938636043 [GeV] +Cell[4,37] 0.00040305176585548 [GeV] +Cell[12,15] 2.0793760195374e-06 [GeV] +Cell[11,22] 0.0065419551563653 [GeV] +Cell[1,41] 0.00032135758168351 [GeV] +Cell[1,42] 0.00065921259328638 [GeV] +Cell[6,20] 0.00012470624378511 [GeV] +Cell[12,14] 0.00045347183282377 [GeV] +Cell[7,21] 3.0465082857063e-06 [GeV] +Cell[7,20] 4.5872718729811e-05 [GeV] +Cell[6,21] 0.00079507780567451 [GeV] +Cell[6,19] 4.1486323729259e-05 [GeV] +Cell[2,6] 2.5256754721113e-05 [GeV] +Cell[5,37] 1.4011272258358e-05 [GeV] +Cell[5,39] 0.0017834358356763 [GeV] +Cell[6,23] 0.00013461926754655 [GeV] +Cell[6,44] 1.6920677968301e-05 [GeV] +Cell[1,13] 0.0010382060536535 [GeV] +Cell[12,13] 6.9973565736291e-05 [GeV] +Cell[0,27] 1.9962840724475e-08 [GeV] +Cell[13,7] 0.00060592562778126 [GeV] +Cell[1,27] 3.6496203392744e-11 [GeV] +Cell[0,6] 0.0017432478034674 [GeV] +Cell[0,5] 0.00058980774380768 [GeV] +Cell[1,6] 0.04735069327221 [GeV] +Cell[4,43] 0.00022061884585025 [GeV] +Cell[3,41] 1.1936348653308e-07 [GeV] +Cell[1,4] 3.2663958207877e-06 [GeV] +Cell[4,34] 4.3625886144582e-05 [GeV] +Cell[1,12] 8.2363469533675e-06 [GeV] +Cell[2,37] 0.00077138568820885 [GeV] +Cell[1,11] 5.1753346497208e-09 [GeV] +Cell[2,22] 1.2179984774434e-05 [GeV] +Cell[2,5] 0.0037316460291325 [GeV] +Cell[1,7] 0.00021581544944524 [GeV] +Cell[1,5] 0.018452632646582 [GeV] +Cell[5,13] 1.1094871704699e-05 [GeV] +Cell[4,14] 1.1958120211716e-05 [GeV] +Cell[2,23] 0.0010111137388949 [GeV] +Cell[4,39] 0.00048982172933597 [GeV] +Cell[3,37] 0.003501361144953 [GeV] +Cell[5,40] 0.0013437714339201 [GeV] +Cell[4,15] 0.00065923621666821 [GeV] +Cell[2,4] 0.0011746653221867 [GeV] +Cell[3,38] 0.0073173886094053 [GeV] +Cell[4,38] 0.00088631320167942 [GeV] +Cell[2,42] 7.9688152254676e-09 [GeV] +Cell[6,3] 0.00038139379634458 [GeV] +Cell[4,13] 9.7175736736972e-06 [GeV] +Cell[13,9] 5.9438063101084e-05 [GeV] +Cell[13,6] 1.3329183857422e-05 [GeV] +Cell[13,8] 0.00045658503297864 [GeV] +Cell[12,5] 2.6278431847459e-05 [GeV] +Cell[12,4] 8.5761534282938e-06 [GeV] +Cell[11,15] 3.31785289045e-05 [GeV] +Cell[7,14] 0.00047993107713313 [GeV] +Cell[3,40] 0.0024521232010393 [GeV] +Cell[5,41] 0.035416213695139 [GeV] +Cell[4,41] 0.001786071289497 [GeV] +Cell[11,16] 5.4263955462375e-08 [GeV] +Cell[2,27] 0.00032258503539094 [GeV] +Cell[2,26] 0.00063905937655056 [GeV] +Cell[5,32] 0.00044245920266326 [GeV] +Cell[3,39] 6.4471751109068e-06 [GeV] +Cell[11,14] 0.00011414533407549 [GeV] +Cell[6,18] 1.8624672666192e-06 [GeV] +Cell[1,15] 9.8272873437963e-06 [GeV] +Cell[1,44] 2.8222994124008e-06 [GeV] +Cell[1,43] 5.9642690644068e-08 [GeV] +Cell[7,15] 0.00087689666491933 [GeV] +Cell[1,26] 0.0011299400441771 [GeV] +Cell[2,38] 2.7023178099512e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 81 cells : 0.16391466989491 (GeV) -Source track ID 5591 (pi+,1.8608973656886[GeV]) at (-197.33949605906,459.40953766238,-618.18650749743) +Source track ID 4632 (pi+,1.8608254785644[GeV]) at (-197.66525667309,459.2694702507,-618.1989288739) Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[9,8] 1.9287945469841e-06 [GeV] -Cell[8,45] 0.00098174314645647 [GeV] -Cell[7,11] 0.029507566442243 [GeV] -Cell[7,10] 0.0020264583818971 [GeV] -Cell[8,11] 1.8631435864336e-08 [GeV] -Cell[9,31] 1.2697013175966e-08 [GeV] -Cell[8,12] 1.236445262964e-05 [GeV] -Cell[9,10] 8.6208456195891e-10 [GeV] -Cell[7,12] 0.0044082908256239 [GeV] -Cell[9,34] 0.00014637268862828 [GeV] -Cell[9,4] 7.9310936038382e-05 [GeV] -Cell[9,12] 0.0011227505669516 [GeV] -Cell[7,13] 0.013185244237708 [GeV] -Cell[7,22] 1.9306729373056e-06 [GeV] -Cell[6,18] 5.2091335419391e-08 [GeV] -Cell[9,13] 6.2158505897969e-09 [GeV] -Cell[6,12] 0.005184458914566 [GeV] -Cell[2,47] 0.0023690049921972 [GeV] -Cell[2,0] 2.7208518321572e-05 [GeV] -Cell[7,15] 0.00074190870436007 [GeV] -Cell[9,6] 1.0758230928332e-09 [GeV] -Cell[6,16] 0.0056845990793385 [GeV] -Cell[0,27] 6.8103870203686e-05 [GeV] -Cell[8,40] 1.4577357000007e-06 [GeV] -Cell[8,35] 0.00095676041534864 [GeV] -Cell[8,22] 3.7239087873786e-07 [GeV] -Cell[8,23] 0.0013352413052448 [GeV] -Cell[9,35] 0.0010271446820319 [GeV] -Cell[9,36] 0.0038442387227161 [GeV] -Cell[8,13] 0.0019875603457724 [GeV] -Cell[6,13] 0.038017160070665 [GeV] -Cell[1,33] 1.1759107088437e-05 [GeV] -Cell[8,16] 0.0080559039734221 [GeV] -Cell[8,15] 0.0022927569204759 [GeV] -Cell[7,14] 0.0059526095500509 [GeV] -Cell[8,6] 1.1394757864764e-05 [GeV] -Cell[9,16] 1.0855728760362e-11 [GeV] -Cell[12,21] 2.8022217156831e-06 [GeV] -Cell[12,20] 7.3697477928363e-06 [GeV] -Cell[8,31] 8.4739655392241e-07 [GeV] -Cell[8,30] 1.0930150485365e-05 [GeV] -Cell[5,4] 0.00035114855608572 [GeV] -Cell[9,5] 1.350684883073e-05 [GeV] -Cell[6,15] 0.32558988414302 [GeV] -Cell[8,39] 5.0580795214046e-06 [GeV] -Cell[9,27] 6.7095580812975e-06 [GeV] -Cell[8,17] 0.00027670430330011 [GeV] -Cell[9,32] 1.0095977543187e-06 [GeV] -Cell[5,3] 2.9108875343809e-05 [GeV] -Cell[1,45] 0.01103615242027 [GeV] -Cell[9,30] 1.5471363352844e-05 [GeV] -Cell[9,29] 4.6804780140519e-10 [GeV] -Cell[8,29] 9.0412440476939e-06 [GeV] -Cell[8,34] 0.00036010688231147 [GeV] -Cell[3,9] 8.1068253075955e-05 [GeV] -Cell[4,3] 4.762762284372e-05 [GeV] -Cell[4,4] 0.0019930498832805 [GeV] -Cell[8,24] 0.0028803934784793 [GeV] -Cell[6,11] 0.0034269374621333 [GeV] -Cell[11,33] 0.00010335410807966 [GeV] -Cell[11,34] 0.0032678965646933 [GeV] -Cell[10,28] 3.0767111747991e-06 [GeV] -Cell[9,40] 3.3099300181902e-06 [GeV] -Cell[10,27] 0.00020138354215953 [GeV] -Cell[3,1] 0.00017275040439438 [GeV] -Cell[0,21] 2.7257279725745e-07 [GeV] -Cell[5,18] 1.8682322212157e-05 [GeV] -Cell[5,17] 1.2532557275335e-06 [GeV] -Cell[3,43] 2.3262691684067e-10 [GeV] -Cell[1,18] 0.00021346567663454 [GeV] -Cell[0,9] 1.5286874713638e-08 [GeV] -Cell[1,26] 0.0011206879299372 [GeV] -Cell[2,43] 0.00037321901286248 [GeV] -Cell[0,20] 2.1455237110786e-06 [GeV] -Cell[1,46] 0.0077282473415891 [GeV] -Cell[1,47] 2.2575836192118e-05 [GeV] -Cell[0,5] 4.2380411268823e-06 [GeV] -Cell[4,5] 5.2219045550942e-05 [GeV] -Cell[3,4] 5.0744289474096e-06 [GeV] -Cell[0,32] 0.00012888917885311 [GeV] -Cell[0,8] 3.8540289339267e-05 [GeV] -Cell[9,45] 3.876741874933e-05 [GeV] -Cell[0,16] 8.2220220938325e-06 [GeV] -Cell[0,4] 8.4812310524285e-07 [GeV] -Cell[3,0] 0.0085461291640662 [GeV] -Cell[0,41] 7.4755446985364e-06 [GeV] -Cell[2,44] 0.0013831680733829 [GeV] -Cell[5,34] 9.0850827971281e-06 [GeV] -Cell[4,33] 5.7474076136714e-05 [GeV] -Cell[2,45] 0.010223569233267 [GeV] -Cell[1,0] 5.0457744740015e-05 [GeV] -Cell[1,10] 1.3835198216839e-05 [GeV] -Cell[5,31] 3.0980884708697e-05 [GeV] -Cell[0,33] 0.0021455986028009 [GeV] -Cell[1,9] 0.0010847282723931 [GeV] -Cell[1,8] 0.00017597708327469 [GeV] -Cell[2,42] 0.00017988463758968 [GeV] -Cell[7,16] 0.0014092397916975 [GeV] -Cell[7,21] 0.00010083131118733 [GeV] -Cell[6,29] 5.9101439546794e-09 [GeV] -Cell[6,28] 1.2267002603039e-08 [GeV] -Cell[3,46] 9.8820521088783e-08 [GeV] -Cell[3,8] 0.00197589572267 [GeV] -Cell[7,34] 8.9992689709106e-09 [GeV] -Cell[0,31] 1.3644061937157e-08 [GeV] -Cell[8,41] 0.0059857568946042 [GeV] -Cell[11,8] 1.9363210012671e-06 [GeV] -Cell[10,26] 0.0012830285299125 [GeV] -Cell[9,26] 6.8856228608638e-08 [GeV] -Cell[8,38] 0.00027167901792041 [GeV] -Cell[5,13] 3.7696084882555e-05 [GeV] -Cell[3,2] 1.3530884530155e-08 [GeV] -Cell[2,46] 0.041583129580431 [GeV] -Cell[5,14] 0.00029838011968627 [GeV] -Cell[8,14] 1.504085958004e-10 [GeV] -Cell[9,28] 4.0605590379528e-06 [GeV] -Cell[3,47] 2.4940921025518e-07 [GeV] -Cell[0,43] 6.3124192529358e-06 [GeV] -Cell[6,14] 0.32762672606847 [GeV] -Cell[1,17] 0.00036297063293819 [GeV] -Cell[5,16] 0.00015582219115231 [GeV] -Cell[5,15] 0.12403128351688 [GeV] -Cell[6,17] 0.00064444428383592 [GeV] -Cell[9,46] 9.2608222248828e-05 [GeV] -Cell[9,0] 1.5804256836418e-06 [GeV] -Cell[11,47] 4.6981193590909e-06 [GeV] -Cell[11,0] 2.0494159252848e-06 [GeV] -Cell[0,7] 6.646413014596e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 128 cells : 1.0185531886868 (GeV) +Cell[6,25] 0.00054093781990514 [GeV] +Cell[8,39] 0.0033229503961627 [GeV] +Cell[7,33] 0.0016945084843401 [GeV] +Cell[5,18] 0.00061029287359532 [GeV] +Cell[7,13] 0.0055781230315209 [GeV] +Cell[6,6] 0.00092681511149548 [GeV] +Cell[6,8] 0.0045541135606345 [GeV] +Cell[5,9] 0.0015130008414176 [GeV] +Cell[4,8] 4.6399801589359e-05 [GeV] +Cell[4,9] 0.0039650558789631 [GeV] +Cell[5,8] 0.00094123759893432 [GeV] +Cell[8,38] 6.9698281518868e-05 [GeV] +Cell[12,26] 0.00044093914447639 [GeV] +Cell[12,15] 1.3939028256573e-05 [GeV] +Cell[7,34] 2.3933803866385e-05 [GeV] +Cell[4,12] 1.7517863284411e-08 [GeV] +Cell[10,9] 0.00030761608130888 [GeV] +Cell[6,7] 0.00011013707531197 [GeV] +Cell[10,0] 4.098322824575e-08 [GeV] +Cell[7,19] 0.00027079259994535 [GeV] +Cell[7,18] 0.00029452807405822 [GeV] +Cell[7,24] 0.00059616533467124 [GeV] +Cell[6,19] 0.0030767388691928 [GeV] +Cell[5,17] 0.00015459205565117 [GeV] +Cell[9,46] 0.00066860681605534 [GeV] +Cell[4,5] 0.00022724933061966 [GeV] +Cell[7,25] 8.7253730453085e-06 [GeV] +Cell[8,34] 1.1166237527505e-07 [GeV] +Cell[7,41] 0.0002944879919836 [GeV] +Cell[7,40] 0.0017307444380886 [GeV] +Cell[8,40] 0.00092222897774536 [GeV] +Cell[5,11] 0.0007408378173385 [GeV] +Cell[4,11] 0.00010451382353426 [GeV] +Cell[4,19] 3.0236187740229e-09 [GeV] +Cell[4,16] 4.9443086709289e-09 [GeV] +Cell[5,16] 0.016348277600966 [GeV] +Cell[4,10] 3.5090750998279e-09 [GeV] +Cell[3,20] 0.002624512781873 [GeV] +Cell[3,19] 4.0327243223146e-06 [GeV] +Cell[5,13] 0.00076217485871291 [GeV] +Cell[4,14] 0.0031028352816108 [GeV] +Cell[5,14] 0.31814314084451 [GeV] +Cell[2,45] 0.00018471000793875 [GeV] +Cell[4,15] 0.0002406078048715 [GeV] +Cell[6,5] 0.00064140804040307 [GeV] +Cell[5,10] 0.00076887795968241 [GeV] +Cell[4,13] 0.00040062731543298 [GeV] +Cell[5,20] 8.724263170734e-08 [GeV] +Cell[5,5] 1.1548128270078e-05 [GeV] +Cell[2,0] 4.1966823046096e-06 [GeV] +Cell[10,10] 0.0014160020767827 [GeV] +Cell[10,47] 6.0262270062594e-07 [GeV] +Cell[8,41] 0.00045829297715591 [GeV] +Cell[7,42] 1.469555153335e-07 [GeV] +Cell[11,19] 1.3694256311283e-05 [GeV] +Cell[7,14] 0.00059219293065251 [GeV] +Cell[17,29] 8.2068447081838e-06 [GeV] +Cell[17,28] 7.5104868155904e-06 [GeV] +Cell[7,17] 0.00025279960490661 [GeV] +Cell[8,36] 1.9208528101444e-11 [GeV] +Cell[8,35] 5.4114860582786e-05 [GeV] +Cell[6,33] 1.2623740985873e-10 [GeV] +Cell[19,10] 0.00050715619980258 [GeV] +Cell[5,7] 1.2456606142223e-05 [GeV] +Cell[8,14] 0.00033112276807071 [GeV] +Cell[19,11] 2.6776263084685e-05 [GeV] +Cell[5,25] 7.2115961549571e-05 [GeV] +Cell[2,44] 0.00058629035127376 [GeV] +Cell[5,12] 0.00061061407368592 [GeV] +Cell[6,12] 0.00090233671458111 [GeV] +Cell[6,11] 0.00074305524179817 [GeV] +Cell[7,16] 0.0013415250827674 [GeV] +Cell[5,6] 2.3587702889927e-06 [GeV] +Cell[6,18] 0.0024498092804153 [GeV] +Cell[1,15] 1.051830968936e-05 [GeV] +Cell[7,15] 7.1569644966075e-05 [GeV] +Cell[6,15] 0.19861439258865 [GeV] +Cell[6,14] 0.4642511071561 [GeV] +Cell[5,15] 0.0095321771707376 [GeV] +Cell[6,16] 0.16663059386319 [GeV] +Cell[6,13] 0.017662097138521 [GeV] +Cell[10,14] 1.2925461352324e-05 [GeV] +Cell[5,21] 1.0241562923056e-05 [GeV] +Cell[6,17] 0.014592334676155 [GeV] +### Total energy deposition in calorimeter by a source track in 84 cells : 1.2587642678765 (GeV) -Source track ID 5588 (gamma,1.5112205487345[GeV]) at (-499.81457163637,13.615945797213,-1633.5784670741) +Source track ID 4629 (gamma,1.5112205487345[GeV]) at (-499.81457392573,13.615861758952,-1633.578438093) Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[7,5] 0.00058226028150462 [GeV] -Cell[9,11] 0.00051099891 [GeV] -Cell[5,8] 0.00074696086140392 [GeV] -Cell[1,33] 0.0012926682866351 [GeV] -Cell[0,39] 0.0029836802664807 [GeV] -Cell[0,44] 0.0030290233078289 [GeV] -Cell[4,8] 0.00043010674767136 [GeV] -Cell[0,24] 0.00080825823015132 [GeV] -Cell[1,22] 0.014136617512844 [GeV] -Cell[1,24] 0.072796181802 [GeV] -Cell[1,46] 0.00043592167262926 [GeV] -Cell[1,23] 1.3464041010703 [GeV] -Cell[0,2] 0.0017000084329836 [GeV] -Cell[0,5] 0.0020046880995725 [GeV] -Cell[2,22] 0.00037743772976181 [GeV] -Cell[0,14] 0.0010286310341435 [GeV] -Cell[2,23] 0.0056993930838008 [GeV] -Cell[2,18] 0.0012868848820806 [GeV] -Cell[2,16] 0.0056809188012053 [GeV] -Cell[6,42] 0.00033852939631073 [GeV] -Cell[0,33] 0.0011052400831317 [GeV] -Cell[1,6] 0.0032550245133648 [GeV] -Cell[0,46] 0.00023750901515957 [GeV] -Cell[6,40] 0.003753457911368 [GeV] -Cell[3,3] 0.00060391359340656 [GeV] -Cell[3,35] 0.00051099891 [GeV] -Cell[2,33] 0.0017349981861974 [GeV] -Cell[0,43] 0.00095198213198044 [GeV] -### Total energy deposition in calorimeter by a source track in 28 cells : 1.4744263947539 (GeV) - -Source track ID 5589 (gamma,2.1679106429722[GeV]) at (-488.39602668604,-107.0949163933,-1544.0566701617) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[8,43] 0.00083552278921168 [GeV] -Cell[5,4] 0.00034760078425799 [GeV] -Cell[0,44] 0.00049823707937891 [GeV] -Cell[6,46] 0.0006797352445156 [GeV] -Cell[4,14] 0.00023913303223434 [GeV] -Cell[0,25] 0.0011196142707094 [GeV] -Cell[5,44] 0.00025117308941052 [GeV] -Cell[0,9] 0.0010936756516264 [GeV] -Cell[1,26] 0.02789260386857 [GeV] -Cell[1,25] 0.54469208267111 [GeV] -Cell[1,24] 0.0095512013677127 [GeV] -Cell[2,25] 1.5015906167579 [GeV] -Cell[2,15] 4.2539471178316e-07 [GeV] -Cell[1,47] 0.0013915677161034 [GeV] -Cell[0,8] 0.00036992912703543 [GeV] -Cell[0,10] 0.003072501527476 [GeV] -Cell[2,26] 0.023920257453963 [GeV] -Cell[0,16] 0.0013943963831328 [GeV] -Cell[1,4] 0.00035792806116023 [GeV] -Cell[3,0] 0.00050550978630284 [GeV] -Cell[3,20] 0.0011273975226965 [GeV] -Cell[4,34] 0.00038807756186088 [GeV] -Cell[2,24] 0.0012209640770426 [GeV] -Cell[1,40] 0.00051099891 [GeV] -Cell[2,39] 0.00070845926713191 [GeV] -Cell[0,34] 0.00057583586204996 [GeV] -Cell[1,6] 0.00084761789560534 [GeV] -Cell[2,6] 0.00064167890505697 [GeV] -Cell[4,13] 0.0009540841169214 [GeV] -Cell[2,11] 0.00095717122509301 [GeV] -Cell[2,40] 0.0019810216949755 [GeV] -Cell[1,2] 0.00052023572407047 [GeV] -Cell[3,14] 0.0035847637898688 [GeV] -Cell[0,13] 0.001597027519528 [GeV] -Cell[1,27] 0.0015151645408258 [GeV] -Cell[4,42] 0.00051099891 [GeV] -Cell[0,47] 0.0029895531330205 [GeV] -Cell[0,36] 0.00065108868502261 [GeV] -Cell[3,44] 0.0029485836108666 [GeV] -### Total energy deposition in calorimeter by a source track in 39 cells : 2.1440344350082 (GeV) - -Source track ID 5572 (pi-,0.39153014115049[GeV]) at (-220.73593031426,448.63754754623,-1618.973234573) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[6,7] 1.5889178654334e-06 [GeV] -Cell[0,21] 0.00012933652841457 [GeV] -Cell[1,18] 0.017239671786838 [GeV] -Cell[1,19] 1.2713218806311e-05 [GeV] -Cell[0,19] 0.0011621755483828 [GeV] -Cell[0,18] 0.0012263271848633 [GeV] -Cell[1,13] 4.2840686091949e-09 [GeV] -Cell[1,14] 9.6001524987514e-05 [GeV] -Cell[2,15] 2.5030892516043e-08 [GeV] -Cell[0,20] 0.0015722530280083 [GeV] -Cell[0,22] 0.0013050036441895 [GeV] -Cell[0,16] 0.0026411652224154 [GeV] -Cell[0,17] 0.0030658563067508 [GeV] -Cell[2,14] 4.0452168126421e-06 [GeV] -Cell[1,15] 0.14365448833287 [GeV] -Cell[0,15] 0.00071712928254601 [GeV] -Cell[0,14] 0.00018641321300856 [GeV] -Cell[2,19] 1.0755320545286e-09 [GeV] -Cell[2,18] 6.2652584915668e-08 [GeV] -Cell[1,40] 6.4167095729317e-08 [GeV] -Cell[1,16] 0.089450224033205 [GeV] -Cell[2,16] 1.2776581570506e-11 [GeV] -Cell[6,6] 4.2263372298407e-05 [GeV] -Cell[0,13] 0.0023779771388156 [GeV] -Cell[3,24] 2.9456318588927e-07 [GeV] -Cell[1,17] 0.0019851507412273 [GeV] -Cell[2,17] 0.00069087265918881 [GeV] -### Total energy deposition in calorimeter by a source track in 27 cells : 0.26756110868763 (GeV) - -Source track ID 5550 (pi+,4.0201530853243[GeV]) at (-418.65151454465,-273.3695472606,-1790.225596337) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[0,29] 0.00041372145003645 [GeV] -Cell[2,41] 0.0010920634571226 [GeV] -Cell[0,28] 0.24427508157635 [GeV] -Cell[4,21] 0.00034475769855162 [GeV] -Cell[1,28] 0.011996250621639 [GeV] -### Total energy deposition in calorimeter by a source track in 5 cells : 0.2581218748037 (GeV) - -Source track ID 5551 (neutron,7.3741998938947[GeV]) at (-413.0762339184,-281.72331279429,-1776.1644807987) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[0,27] 0.030043607607969 [GeV] -Cell[3,13] 8.1566844892222e-06 [GeV] -Cell[4,26] 7.3321574891452e-06 [GeV] -Cell[3,26] 6.5188242879231e-06 [GeV] -Cell[6,0] 1.9147410057485e-09 [GeV] -Cell[6,47] 6.0241727624089e-09 [GeV] -Cell[6,46] 1.6119156498462e-09 [GeV] -Cell[3,1] 4.4997546181548e-05 [GeV] -Cell[0,25] 0.0037533411968819 [GeV] -Cell[4,22] 5.5567899948983e-08 [GeV] -Cell[3,39] 0.0010469344491313 [GeV] -Cell[2,38] 8.6516575113933e-05 [GeV] -Cell[1,19] 0.001058406666327 [GeV] -Cell[0,18] 3.7140347831155e-07 [GeV] -Cell[1,25] 6.5366667405442e-06 [GeV] -Cell[1,42] 0.00017037050227157 [GeV] -Cell[4,28] 0.0007503128715291 [GeV] -Cell[0,1] 0.0011797864873663 [GeV] -Cell[2,3] 0.0011318689184164 [GeV] -Cell[1,12] 1.3320891662261e-07 [GeV] -Cell[1,21] 6.8553385208361e-06 [GeV] -Cell[1,1] 0.0032146158686419 [GeV] -Cell[0,2] 2.6085826926874e-06 [GeV] -Cell[2,13] 0.00063128992469865 [GeV] -Cell[1,5] 0.007588739608295 [GeV] -Cell[0,6] 0.0034299481764162 [GeV] -Cell[0,5] 2.5270672515035e-05 [GeV] -Cell[3,6] 1.252526009921e-05 [GeV] -Cell[2,21] 0.0021541596811535 [GeV] -Cell[1,3] 0.0076953450661074 [GeV] -Cell[0,17] 1.3477983884513e-10 [GeV] -Cell[1,4] 0.028545086704868 [GeV] -Cell[0,4] 0.00014011036545958 [GeV] -Cell[2,14] 4.9570494871887e-06 [GeV] -Cell[3,20] 5.4474149078487e-07 [GeV] -Cell[3,22] 9.3640408595093e-06 [GeV] -Cell[2,5] 0.0018189382965726 [GeV] -Cell[2,4] 0.0011728860965613 [GeV] -Cell[0,38] 2.7012023757607e-06 [GeV] -Cell[0,29] 0.0084206383166287 [GeV] -Cell[2,31] 0.00089306501126111 [GeV] -Cell[2,32] 3.6593373692995e-08 [GeV] -Cell[1,38] 0.0015316320580554 [GeV] -Cell[1,39] 0.0067853268364322 [GeV] -Cell[1,40] 0.0058147511973752 [GeV] -Cell[2,39] 0.0026647313182965 [GeV] -Cell[0,37] 4.1143882197048e-07 [GeV] -Cell[3,40] 4.9903888048334e-05 [GeV] -Cell[2,40] 0.0083038032235234 [GeV] -Cell[2,41] 9.3844504153822e-06 [GeV] -Cell[0,28] 0.30223686641463 [GeV] -Cell[0,26] 0.013585241869055 [GeV] -Cell[0,0] 0.028295351827575 [GeV] -Cell[1,36] 4.8734055599198e-06 [GeV] -Cell[2,37] 0.00018878481218837 [GeV] -Cell[1,2] 0.0018679149148859 [GeV] -Cell[3,14] 1.5095643611858e-05 [GeV] -Cell[1,37] 0.0024299539726036 [GeV] -Cell[4,23] 0.00050018135007872 [GeV] -Cell[0,30] 0.00019473945635957 [GeV] -Cell[4,41] 2.3396508813676e-05 [GeV] -Cell[4,42] 0.021891627160198 [GeV] -Cell[3,3] 1.7825232323958e-05 [GeV] -Cell[3,2] 9.8466813215055e-06 [GeV] -Cell[5,29] 8.8802931259124e-08 [GeV] -Cell[4,29] 0.00014997552650334 [GeV] -Cell[1,31] 8.097230193016e-10 [GeV] -Cell[0,7] 0.000879270280995 [GeV] -Cell[1,41] 0.0014789350103516 [GeV] -Cell[0,3] 0.00076358687722222 [GeV] -### Total energy deposition in calorimeter by a source track in 70 cells : 0.50475844458608 (GeV) - -Source track ID 5547 (anti_neutron,5.3948206100571[GeV]) at (-415.09134243251,-278.74572182829,-1871.4579101789) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[8,7] 0.00076975023191354 [GeV] -Cell[4,37] 7.5452573946677e-07 [GeV] -Cell[7,8] 8.2559228872015e-08 [GeV] -Cell[8,5] 3.2615776774473e-05 [GeV] -Cell[7,6] 1.3894259609515e-09 [GeV] -Cell[6,19] 6.0809943825006e-06 [GeV] -Cell[6,10] 1.5088838612428e-05 [GeV] -Cell[6,9] 2.0380996375025e-09 [GeV] -Cell[6,7] 0.032519942233548 [GeV] -Cell[6,8] 0.0013016074049621 [GeV] -Cell[2,47] 5.0233415095136e-08 [GeV] -Cell[2,0] 0.0029505504499458 [GeV] -Cell[0,27] 0.16453301722646 [GeV] -Cell[11,40] 0.0004300939811078 [GeV] -Cell[3,13] 7.1209560701391e-09 [GeV] -Cell[2,12] 3.4779077395797e-11 [GeV] -Cell[0,40] 0.0004054403598301 [GeV] -Cell[1,44] 0.00084830981464153 [GeV] -Cell[0,44] 1.6624146664981e-06 [GeV] -Cell[1,45] 0.00046176796357573 [GeV] -Cell[4,8] 0.00011420940761093 [GeV] -Cell[4,9] 6.804196765188e-06 [GeV] -Cell[6,47] 0.0014218962705676 [GeV] -Cell[7,4] 0.0010177495766005 [GeV] -Cell[6,11] 0.00078061183628154 [GeV] -Cell[5,27] 2.4999749730341e-06 [GeV] -Cell[10,41] 3.6570794554791e-07 [GeV] -Cell[4,14] 1.1468115831804e-05 [GeV] -Cell[10,35] 3.339271643199e-08 [GeV] -Cell[0,24] 2.2831759331439e-06 [GeV] -Cell[0,25] 0.0081926327699102 [GeV] -Cell[0,21] 0.00083087223457309 [GeV] -Cell[5,17] 0.00035324851087171 [GeV] -Cell[4,19] 0.0029102019624462 [GeV] -Cell[3,11] 5.1391904707998e-07 [GeV] -Cell[1,22] 0.0029901906232976 [GeV] -Cell[3,43] 0.00056439309212058 [GeV] -Cell[1,18] 0.018722504399885 [GeV] -Cell[1,19] 0.00038087733841674 [GeV] -Cell[0,19] 0.0004107358610368 [GeV] -Cell[0,9] 0.0014011813545877 [GeV] -Cell[0,18] 0.0026342223536102 [GeV] -Cell[1,26] 0.00010075225838227 [GeV] -Cell[1,25] 7.3221600632678e-07 [GeV] -Cell[2,25] 3.9735459722579e-10 [GeV] -Cell[1,43] 1.1315616347929e-08 [GeV] -Cell[1,42] 1.0188711542582e-05 [GeV] -Cell[2,43] 0.001094454128068 [GeV] -Cell[1,7] 0.030668462782509 [GeV] -Cell[0,1] 0.0021636257700416 [GeV] -Cell[1,14] 0.0007726532539296 [GeV] -Cell[3,5] 2.4459448759444e-06 [GeV] -Cell[1,46] 0.0010278778049621 [GeV] -Cell[1,47] 5.5538613809631e-05 [GeV] -Cell[1,23] 1.3902474020142e-06 [GeV] -Cell[0,23] 0.00039330836219085 [GeV] -Cell[1,1] 0.0089273888388992 [GeV] -Cell[0,2] 0.00010005709068651 [GeV] -Cell[1,20] 0.0017863514058636 [GeV] -Cell[1,5] 3.9712880679872e-06 [GeV] -Cell[0,6] 6.0707438409622e-05 [GeV] -Cell[0,5] 0.012999643138497 [GeV] -Cell[2,22] 0.00053647435380947 [GeV] -Cell[2,21] 3.1894203842398e-05 [GeV] -Cell[0,32] 0.0011203626716978 [GeV] -Cell[1,3] 0.0010599434711291 [GeV] -Cell[0,10] 0.0019484702797439 [GeV] -Cell[2,26] 6.1393919957482e-05 [GeV] -Cell[9,44] 0.0020179545624733 [GeV] -Cell[0,16] 0.00032274390687006 [GeV] -Cell[0,17] 0.0029884097978035 [GeV] -Cell[0,11] 0.00035166648280424 [GeV] -Cell[1,4] 0.0010815044439191 [GeV] -Cell[0,4] 0.063611910246939 [GeV] -Cell[3,38] 0.0010479550431028 [GeV] -Cell[2,20] 0.00025675586038369 [GeV] -Cell[2,44] 0.0004735394975886 [GeV] -Cell[2,5] 0.0025543016481424 [GeV] -Cell[2,9] 1.2644365825736e-06 [GeV] -Cell[2,7] 5.4565356061858e-06 [GeV] -Cell[0,29] 0.45099320782665 [GeV] -Cell[2,31] 4.8515405360718e-05 [GeV] -Cell[3,45] 0.00037752869689487 [GeV] -Cell[2,45] 0.00017211743520727 [GeV] -Cell[1,0] 0.007523394750472 [GeV] -Cell[8,4] 0.0024979321248727 [GeV] -Cell[1,10] 0.00039544408197625 [GeV] -Cell[3,30] 3.5723945410496e-05 [GeV] -Cell[0,34] 0.00030735034016459 [GeV] -Cell[0,33] 0.0068677310010741 [GeV] -Cell[1,6] 0.0025229004506941 [GeV] -Cell[2,6] 0.003890742829113 [GeV] -Cell[4,13] 0.0021656863824016 [GeV] -Cell[6,6] 4.2815806568797e-07 [GeV] -Cell[1,9] 0.00012185380840731 [GeV] -Cell[2,11] 0.0014498553623306 [GeV] -Cell[2,10] 1.6753844139657e-05 [GeV] -Cell[1,8] 0.0012195694089398 [GeV] -Cell[2,40] 0.00042155926318537 [GeV] -Cell[2,41] 0.00019465809116533 [GeV] -Cell[0,28] 2.7284084870639 [GeV] -Cell[0,46] 0.0006752831905568 [GeV] -Cell[0,26] 0.013109599340785 [GeV] -Cell[0,0] 0.00024950723017798 [GeV] -Cell[1,36] 0.00019604094266356 [GeV] -Cell[0,42] 0.0081878127717223 [GeV] -Cell[1,2] 0.0049189184716876 [GeV] -Cell[2,1] 0.0044643060395869 [GeV] -Cell[3,14] 1.391354567204e-08 [GeV] -Cell[1,37] 0.00059695033998895 [GeV] -Cell[2,30] 0.0035295458395612 [GeV] -Cell[3,46] 0.00022871248045408 [GeV] -Cell[3,8] 4.6174026238077e-09 [GeV] -Cell[1,28] 0.0053566607959916 [GeV] -Cell[1,29] 0.0014842765405299 [GeV] -Cell[1,27] 0.0031222537260788 [GeV] -Cell[2,29] 0.0024193941641797 [GeV] -Cell[1,30] 2.1681972430088e-07 [GeV] -Cell[0,30] 0.01461639434262 [GeV] -Cell[0,31] 0.0011677671276551 [GeV] -Cell[11,41] 2.8803208189515e-05 [GeV] -Cell[7,19] 0.00026755090219946 [GeV] -Cell[4,30] 4.0801311536143e-07 [GeV] -Cell[5,39] 1.6469898400828e-07 [GeV] -Cell[3,17] 0.0010574617520791 [GeV] -Cell[5,13] 2.588293646113e-05 [GeV] -Cell[0,47] 3.3271483907811e-06 [GeV] -Cell[2,46] 0.00042010433536529 [GeV] -Cell[2,2] 0.0023288709581731 [GeV] -Cell[3,47] 0.00010615136736885 [GeV] -Cell[3,29] 4.7551741825032e-05 [GeV] -Cell[0,43] 0.007596617751111 [GeV] -Cell[1,31] 8.5885665612295e-08 [GeV] -Cell[5,16] 0.00010891026856041 [GeV] -Cell[0,36] 0.0026069385941028 [GeV] -Cell[3,44] 2.9341575573198e-06 [GeV] -Cell[2,17] 1.3243869397115e-05 [GeV] -Cell[0,3] 0.001364443027233 [GeV] -Cell[0,35] 1.3844827772118e-05 [GeV] -Cell[5,21] 5.9687471948564e-06 [GeV] -Cell[2,27] 4.415126005847e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 141 cells : 3.6766663984527 (GeV) - -Source track ID 5456 (pi-,5.4476316743567[GeV]) at (-292.62346827093,-405.42755927181,-1905.0210333983) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[0,31] 0.14896015265494 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.14896015265494 (GeV) - -Source track ID 3966 (pi-,5.0455105604379[GeV]) at (-463.76190821087,-186.88202827616,-1931.5453451796) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[4,45] 0.0047923200324411 [GeV] -Cell[8,46] 0.00018759868492918 [GeV] -Cell[2,0] 2.2409949451685e-12 [GeV] -Cell[6,38] 6.3354462781717e-08 [GeV] -Cell[6,37] 0.0030640752827318 [GeV] -Cell[0,27] 0.39592315974482 [GeV] -Cell[7,30] 0.0033614597011084 [GeV] -Cell[8,43] 0.00081466981294164 [GeV] -Cell[7,45] 2.9249349609017e-11 [GeV] -Cell[5,0] 4.8947298512303e-07 [GeV] -Cell[5,47] 0.0006066268699833 [GeV] -Cell[1,34] 6.8079697957728e-06 [GeV] -Cell[8,31] 7.654786168132e-07 [GeV] -Cell[8,30] 0.002129090201779 [GeV] -Cell[5,4] 0.00018632731432899 [GeV] -Cell[3,13] 8.4768473823715e-05 [GeV] -Cell[10,3] 4.141280235558e-05 [GeV] -Cell[10,4] 1.4027039320581e-06 [GeV] -Cell[10,5] 1.2122327461839e-09 [GeV] -Cell[5,2] 5.4594154062215e-06 [GeV] -Cell[5,3] 5.5338960510198e-07 [GeV] -Cell[1,44] 0.00098818677906092 [GeV] -Cell[1,45] 5.9056131346779e-05 [GeV] -Cell[8,29] 0.00084455385044629 [GeV] -Cell[11,5] 1.1391616510537e-07 [GeV] -Cell[11,4] 1.8097853171639e-08 [GeV] -Cell[6,0] 0.00062850644711125 [GeV] -Cell[6,47] 0.00076752308849559 [GeV] -Cell[6,3] 0.0025800163117408 [GeV] -Cell[6,46] 0.00021476338337663 [GeV] -Cell[7,46] 9.2044468992071e-05 [GeV] -Cell[6,45] 6.2936285394244e-06 [GeV] -Cell[7,31] 6.8592383549117e-05 [GeV] -Cell[4,3] 1.1385202469683e-10 [GeV] -Cell[7,29] 1.4537315080133e-05 [GeV] -Cell[7,28] 8.0059468583613e-06 [GeV] -Cell[9,40] 3.4279515093658e-06 [GeV] -Cell[4,1] 0.001063584310116 [GeV] -Cell[10,14] 0.00020150420524308 [GeV] -Cell[0,24] 0.0047257058097561 [GeV] -Cell[0,25] 0.0099845948173612 [GeV] -Cell[4,18] 0.0022230550122848 [GeV] -Cell[4,19] 0.00045276317961611 [GeV] -Cell[5,22] 1.4760483580176e-05 [GeV] -Cell[4,22] 2.252359763952e-05 [GeV] -Cell[3,42] 5.181921540418e-05 [GeV] -Cell[5,20] 8.8771827836354e-07 [GeV] -Cell[1,18] 0.0015360222247055 [GeV] -Cell[1,19] 0.0009102915362368 [GeV] -Cell[0,18] 0.0019242226881776 [GeV] -Cell[1,25] 2.581720048056e-08 [GeV] -Cell[1,43] 2.9366896458669e-05 [GeV] -Cell[1,7] 0.014841710839209 [GeV] -Cell[0,1] 7.8141776612028e-08 [GeV] -Cell[2,3] 0.032796795457314 [GeV] -Cell[1,13] 7.7895217839341e-06 [GeV] -Cell[1,14] 2.5097862817347e-08 [GeV] -Cell[2,15] 1.0097680788022e-06 [GeV] -Cell[0,20] 3.0708773553442e-05 [GeV] -Cell[1,46] 0.0075917131970407 [GeV] -Cell[1,47] 0.00046534472412555 [GeV] -Cell[0,22] 9.2576812923653e-05 [GeV] -Cell[0,23] 0.021451626177857 [GeV] -Cell[1,1] 0.0053076858783811 [GeV] -Cell[1,20] 1.0603227938191e-06 [GeV] -Cell[2,13] 0.00016749547171355 [GeV] -Cell[4,0] 0.00010109173428202 [GeV] -Cell[1,3] 0.0077863162474123 [GeV] -Cell[9,41] 0.00020523903855667 [GeV] -Cell[1,4] 0.0020668423917284 [GeV] -Cell[4,43] 1.3200048322233e-06 [GeV] -Cell[4,46] 7.2347191837707e-07 [GeV] -Cell[2,14] 3.5695660626516e-06 [GeV] -Cell[1,15] 0.00012339235226318 [GeV] -Cell[2,20] 0.0013583791603246 [GeV] -Cell[4,7] 1.0571909020655e-05 [GeV] -Cell[2,5] 4.836396937435e-06 [GeV] -Cell[2,4] 3.2954739383513e-06 [GeV] -Cell[0,29] 0.0088810944566601 [GeV] -Cell[3,45] 0.0024549548147872 [GeV] -Cell[2,45] 0.00047481930450317 [GeV] -Cell[1,0] 0.038041614440056 [GeV] -Cell[1,38] 2.0390737248817e-05 [GeV] -Cell[2,36] 2.7264384843875e-05 [GeV] -Cell[0,12] 4.7980877570808e-06 [GeV] -Cell[1,16] 0.00028435379323412 [GeV] -Cell[0,34] 0.0015147709215773 [GeV] -Cell[0,33] 0.00053971856644421 [GeV] -Cell[1,6] 0.0003738408079131 [GeV] -Cell[2,6] 7.0761931496349e-05 [GeV] -Cell[0,37] 0.0086138004332237 [GeV] -Cell[1,8] 1.80403820126e-05 [GeV] -Cell[2,42] 0.0001374218620989 [GeV] -Cell[2,41] 0.0013038443699081 [GeV] -Cell[6,36] 9.5260387602707e-05 [GeV] -Cell[0,28] 0.0027063401720658 [GeV] -Cell[0,46] 0.0076805333426763 [GeV] -Cell[0,45] 0.0019383265504801 [GeV] -Cell[0,26] 1.4388595444864 [GeV] -Cell[7,16] 8.6987856775522e-09 [GeV] -Cell[0,0] 0.0062199319922125 [GeV] -Cell[3,36] 0.0058403347076166 [GeV] -Cell[2,37] 0.00011971717877896 [GeV] -Cell[1,2] 0.001087054938341 [GeV] -Cell[2,1] 9.1850984063058e-10 [GeV] -Cell[3,14] 0.00029582241483104 [GeV] -Cell[1,37] 7.2610897390405e-05 [GeV] -Cell[0,13] 0.001330676180427 [GeV] -Cell[3,46] 0.00061779515123226 [GeV] -Cell[4,21] 0.00011508252594649 [GeV] -Cell[4,20] 7.2413689919131e-06 [GeV] -Cell[3,32] 6.5241049412634e-07 [GeV] -Cell[1,29] 0.00039783422929188 [GeV] -Cell[1,27] 0.00085139074987637 [GeV] -Cell[2,29] 0.00074893884172211 [GeV] -Cell[1,30] 7.4635903212652e-05 [GeV] -Cell[0,30] 0.00058071866994476 [GeV] -Cell[0,31] 0.0024839414757415 [GeV] -Cell[5,5] 0.00089062255919703 [GeV] -Cell[7,0] 5.005786253605e-06 [GeV] -Cell[11,13] 0.00056385134751781 [GeV] -Cell[8,38] 0.0010679042256233 [GeV] -Cell[3,3] 8.2893685965928e-06 [GeV] -Cell[5,46] 4.9439056281699e-05 [GeV] -Cell[0,47] 0.0002857865900819 [GeV] -Cell[2,2] 0.0045885418608359 [GeV] -Cell[5,35] 9.046654067788e-07 [GeV] -Cell[6,35] 1.3020323996898e-05 [GeV] -Cell[4,44] 0.0020935267529836 [GeV] -Cell[5,10] 9.6737353887875e-06 [GeV] -Cell[4,11] 3.0904737941455e-06 [GeV] -Cell[4,10] 0.00018453874000988 [GeV] -Cell[1,31] 0.00014419343671625 [GeV] -Cell[0,36] 0.0047920857140999 [GeV] -Cell[2,17] 1.5296689874958e-05 [GeV] -Cell[0,35] 0.0014707554765779 [GeV] -Cell[5,21] 0.0012178553039688 [GeV] -Cell[6,21] 5.9545035117026e-07 [GeV] -Cell[10,13] 0.0021607380274828 [GeV] -Cell[3,33] 1.1856057085424e-08 [GeV] -### Total energy deposition in calorimeter by a source track in 140 cells : 2.089496628135 (GeV) - -Source track ID 5186 (pi-,26.431185018836[GeV]) at (-349.01053983718,-358.03860557565,-1955.6346478566) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[0,29] 0.0041838922864822 [GeV] -Cell[4,40] 0.00056244665702791 [GeV] -Cell[2,24] 0.00020413592864884 [GeV] -Cell[0,30] 0.074753415570176 [GeV] -### Total energy deposition in calorimeter by a source track in 4 cells : 0.079703890442335 (GeV) - -Source track ID 5187 (pi+,1.1826653021165[GeV]) at (-499.00724176511,31.492422358054,-1755.2225688228) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[1,23] 0.06198475055943 [GeV] -Cell[0,23] 0.14854013896028 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.21052488951971 (GeV) - -Source track ID 5184 (gamma,1.5279055119092[GeV]) at (-73.254798053637,-494.60462448517,-436.11291337959) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[8,11] 0.001322593675031 [GeV] -Cell[8,12] 0.00047323212793674 [GeV] -Cell[9,6] 0.0011619495995525 [GeV] -Cell[6,16] 0.00051099891 [GeV] -Cell[7,35] 0.17393431915847 [GeV] -Cell[8,35] 0.0020924918528747 [GeV] -Cell[6,34] 0.0095622453727713 [GeV] -Cell[7,37] 0.00025126850076049 [GeV] -Cell[8,39] 0.0014281921082276 [GeV] -Cell[7,33] 0.018820337787506 [GeV] -Cell[8,34] 0.0019827298946922 [GeV] -Cell[7,36] 0.0014528021026504 [GeV] -Cell[7,34] 1.3004933373185 [GeV] -Cell[12,47] 0.00019801791907591 [GeV] -Cell[5,38] 0.002508650429639 [GeV] -Cell[8,38] 3.1857140129432e-08 [GeV] -Cell[2,46] 0.0026375980704937 [GeV] -Cell[6,35] 0.00065045058601557 [GeV] -Cell[7,38] 2.1682199379939e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 19 cells : 1.5195029294707 (GeV) - -Source track ID 5185 (gamma,2.1921548366006[GeV]) at (-105.1967704698,-488.80838728762,-488.2927116083) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[9,8] 0.00048902250762978 [GeV] -Cell[7,10] 0.00029491385423599 [GeV] -Cell[6,38] 0.0015257941808115 [GeV] -Cell[7,35] 0.01987495182511 [GeV] -Cell[6,34] 0.014138583875159 [GeV] -Cell[5,11] 0.0014433100630852 [GeV] -Cell[8,16] 0.0012470687005785 [GeV] -Cell[9,7] 0.00034898363541551 [GeV] -Cell[7,2] 0.0020622618987197 [GeV] -Cell[8,3] 0.00029378773235293 [GeV] -Cell[4,26] 0.0025879976441547 [GeV] -Cell[7,32] 0.0017014451635589 [GeV] -Cell[7,33] 0.031889940586786 [GeV] -Cell[7,4] 0.0011582572497226 [GeV] -Cell[7,28] 0.00087510167141622 [GeV] -Cell[5,22] 0.00051099891 [GeV] -Cell[7,36] 0.0020223033780589 [GeV] -Cell[7,34] 2.0779059302088 [GeV] -Cell[6,40] 0.0015874924468752 [GeV] -Cell[6,35] 0.0013750218348928 [GeV] -Cell[6,33] 0.0086917197450725 [GeV] -Cell[6,17] 0.0017683835856485 [GeV] -Cell[9,0] 9.060768747061e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 23 cells : 2.1738838783855 (GeV) - -Source track ID 5182 (gamma,0.076632669216442[GeV]) at (-300.43599690194,399.67263074364,200.63474718829) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[13,30] 0.00051099891 [GeV] -Cell[11,16] 0.075356502825717 [GeV] -Cell[11,17] 0.00076516748072526 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.076632669216442 (GeV) - -Source track ID 5183 (gamma,0.17932025858732[GeV]) at (-255.57095698794,429.74816572531,-559.80029942731) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[7,15] 0.0020124867132122 [GeV] -Cell[6,16] 0.006473994438303 [GeV] -Cell[6,15] 0.014785320841793 [GeV] -Cell[7,16] 0.15554814193723 [GeV] -Cell[9,46] 0.00035670623158009 [GeV] -### Total energy deposition in calorimeter by a source track in 5 cells : 0.17917665016212 (GeV) - -Source track ID 3970 (pi-,0.2275690782538[GeV]) at (24.618705435302,499.39355156298,-1272.9472605893) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[5,41] 0.0052303949371662 [GeV] -Cell[5,42] 7.0031824578109e-05 [GeV] -Cell[3,11] 0.15045966570453 [GeV] -Cell[4,43] 1.9684928411152e-05 [GeV] -Cell[4,40] 0.0002668827828976 [GeV] -Cell[2,11] 7.2928611206014e-05 [GeV] -Cell[3,41] 1.940601605952e-06 [GeV] -Cell[5,39] 9.7044649476516e-05 [GeV] -Cell[5,40] 0.00088442550681637 [GeV] -Cell[4,41] 0.0037876250532522 [GeV] -Cell[4,42] 0.00050053685743899 [GeV] -Cell[3,12] 0.0019323724322895 [GeV] -### Total energy deposition in calorimeter by a source track in 12 cells : 0.16332353388967 (GeV) - -Source track ID 4938 (gamma,0.00011732136086344[GeV]) at (441.13012538989,235.38099429117,184.20940651349) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[10,3] 0.00011732136086344 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00011732136086344 (GeV) - -Source track ID 4929 (e-,0.050093550096734[GeV]) at (-421.39352467256,269.12357266512,1450.5038381873) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[17,20] 0.007642263892987 [GeV] -Cell[17,19] 0.041940287293747 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.049582551186734 (GeV) - -Source track ID 4933 (gamma,3.7558424512104e-05[GeV]) at (465.24781617963,183.15149341485,257.85651798237) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[11,2] 3.7558424512104e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 3.7558424512104e-05 (GeV) - -Source track ID 4930 (e+,0.24042152245717[GeV]) at (467.63215800354,176.97504005071,258.81165419537) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[9,10] 0.00029238636553745 [GeV] -Cell[9,9] 0.0021893819117074 [GeV] -Cell[6,16] 0.00013528985927348 [GeV] -Cell[7,14] 0.0007530357359102 [GeV] -Cell[9,16] 0.0016464699733998 [GeV] -Cell[10,6] 0.00022447127187221 [GeV] -Cell[10,4] 0.00088440323999013 [GeV] -Cell[11,3] 0.020793711827183 [GeV] -Cell[10,17] 0.00071976854478604 [GeV] -Cell[11,2] 0.19280001585955 [GeV] -Cell[9,14] 0.0010591254750897 [GeV] -Cell[12,1] 0.0010707453448552 [GeV] -Cell[9,19] 0.00018704871669179 [GeV] -Cell[9,17] 0.00021392560306394 [GeV] -Cell[3,33] 0.00060484900620612 [GeV] -Cell[11,1] 0.00037311978716477 [GeV] -### Total energy deposition in calorimeter by a source track in 16 cells : 0.22394774852228 (GeV) - -Source track ID 4928 (gamma,0.15995014937721[GeV]) at (486.22067374803,-116.57382390577,276.45970272021) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[9,12] 0.00093119343993383 [GeV] -Cell[11,45] 0.0010653679981564 [GeV] -Cell[11,46] 0.15764649757169 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.15964305900978 (GeV) - -Source track ID 4913 (pi+,0.58338757389867[GeV]) at (-499.09613657913,30.050731302104,859.05045340355) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[8,44] 3.1009549275041e-09 [GeV] -Cell[8,43] 3.5472939077863e-07 [GeV] -Cell[9,42] 6.8193187180441e-06 [GeV] -Cell[16,21] 0.0024491544517375 [GeV] -Cell[14,26] 1.1746908512578e-10 [GeV] -Cell[9,43] 1.6830441303455e-05 [GeV] -Cell[13,17] 0.00021116676636109 [GeV] -Cell[13,18] 1.2365182996064e-06 [GeV] -Cell[8,42] 3.5211269278079e-09 [GeV] -Cell[11,2] 5.5657601042185e-06 [GeV] -Cell[14,12] 3.6970819405724e-07 [GeV] -Cell[14,18] 0.0064150677982743 [GeV] -Cell[9,41] 0.0002815344982065 [GeV] -Cell[9,44] 1.2803473509848e-08 [GeV] -Cell[13,21] 0.0018336335369995 [GeV] -Cell[14,20] 0.0039388145726776 [GeV] -Cell[14,21] 0.021728575652054 [GeV] -Cell[14,24] 0.0010445200158409 [GeV] -Cell[14,25] 0.001221120465518 [GeV] -Cell[13,16] 0.00043319158717361 [GeV] -Cell[14,6] 4.8920628614724e-10 [GeV] -Cell[14,16] 9.6458448970225e-06 [GeV] -Cell[14,17] 0.00024766221994525 [GeV] -Cell[15,19] 1.7177080735564e-10 [GeV] -Cell[15,20] 0.0023991882637555 [GeV] -Cell[15,21] 0.0040119548722431 [GeV] -Cell[15,22] 0.020556311311347 [GeV] -Cell[16,20] 0.00036068212756481 [GeV] -Cell[14,22] 0.12462034072504 [GeV] -Cell[14,19] 0.00029321825623811 [GeV] -Cell[14,14] 0.00049184003928531 [GeV] -Cell[14,13] 5.1802786742883e-08 [GeV] -Cell[16,22] 8.9048133156666e-07 [GeV] -Cell[13,7] 5.6565315742318e-07 [GeV] -Cell[15,25] 0.0006981905089915 [GeV] -Cell[15,24] 7.9433375503868e-09 [GeV] -Cell[15,23] 0.0057310490065035 [GeV] -Cell[14,23] 0.12589384390788 [GeV] -Cell[15,2] 0.00039177824689114 [GeV] -Cell[16,2] 0.00093436509586354 [GeV] -### Total energy deposition in calorimeter by a source track in 40 cells : 0.32622956233191 (GeV) - -Source track ID 4834 (gamma,8.7110239168586e-05[GeV]) at (30.992376018085,-499.03854823927,324.09554540374) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[11,36] 8.7110239168586e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 8.7110239168586e-05 (GeV) - -Source track ID 4835 (gamma,0.019652877624536[GeV]) at (472.69376083215,162.97425707871,553.72947585936) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[12,2] 0.019652877624536 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.019652877624536 (GeV) - -Source track ID 4836 (gamma,0.00031881677569151[GeV]) at (439.69411443075,238.05269529025,656.23344967969) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[13,3] 0.00031881677569151 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00031881677569151 (GeV) - -Source track ID 4840 (gamma,0.00018469799592053[GeV]) at (-486.00271708111,117.47918534694,544.59491764404) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[12,22] 0.00018469799592053 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00018469799592053 (GeV) - -Source track ID 4845 (gamma,0.0010315888687243[GeV]) at (35.67782848801,-498.72546812287,417.22890864009) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[12,36] 0.0010315888687243 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.0010315888687243 (GeV) - -Source track ID 4818 (e-,0.030359474251041[GeV]) at (499.99884720235,1.0736835310337,1374.6931941662) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[16,0] 0.0050693702848203 [GeV] -Cell[16,9] 0.00036298830662357 [GeV] -Cell[17,4] 0.00089104288001173 [GeV] -Cell[16,10] 0.0074935255342529 [GeV] -Cell[18,8] 0.012939618748014 [GeV] -Cell[18,5] 0.0029361574347588 [GeV] -### Total energy deposition in calorimeter by a source track in 6 cells : 0.029692703188481 (GeV) - -Source track ID 4820 (gamma,0.00014580535915228[GeV]) at (-132.06574233429,-482.24334075412,294.72163137804) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[11,33] 0.00014580535915228 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00014580535915228 (GeV) - -Source track ID 4821 (gamma,0.0075972335600979[GeV]) at (-131.17889946841,-482.48533276594,294.7754360289) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[11,33] 0.00664030533725 [GeV] -Cell[11,34] 0.00095692822284795 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.0075972335600979 (GeV) - -Source track ID 4824 (gamma,0.0004172148837099[GeV]) at (-112.94880890756,-487.0755244994,243.79604397333) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[11,34] 0.0004172148837099 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.0004172148837099 (GeV) - -Source track ID 4819 (e+,0.92045942588576[GeV]) at (-152.00175865214,-476.33545466053,295.12086420966) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[12,34] 0.00032509881577264 [GeV] -Cell[11,31] 0.0016996727002805 [GeV] -Cell[11,32] 0.037381267659706 [GeV] -Cell[13,31] 4.9777202366386e-06 [GeV] -Cell[10,34] 2.4072185624391e-08 [GeV] -Cell[11,33] 0.83771938350706 [GeV] -Cell[11,34] 0.014287161446639 [GeV] -Cell[12,33] 0.0039432790199689 [GeV] -Cell[15,16] 6.3288408944118e-07 [GeV] -Cell[12,14] 1.8536813731771e-05 [GeV] -Cell[12,45] 6.5367716306355e-06 [GeV] -Cell[11,42] 3.5084667615592e-09 [GeV] -Cell[15,19] 0.00027428088955593 [GeV] -Cell[9,26] 7.9754179601845e-05 [GeV] -Cell[14,2] 0.00032862539241091 [GeV] -Cell[14,15] 5.672627594322e-10 [GeV] -Cell[14,19] 2.2293010852081e-07 [GeV] -### Total energy deposition in calorimeter by a source track in 17 cells : 0.8960694588787 (GeV) - -Source track ID 4817 (gamma,1.1635719616336[GeV]) at (-189.42307787085,-462.72983215904,253.06736977087) -Original primary track ID 31 (unknown,691.32334101424[GeV]) -Cell[11,32] 0.38747876411261 [GeV] -Cell[12,32] 0.001198503213416 [GeV] -Cell[12,29] 0.00049975372450886 [GeV] -Cell[11,30] 0.00045092287083203 [GeV] -Cell[10,32] 0.0063058781396267 [GeV] -Cell[11,25] 0.0011970530379946 [GeV] -Cell[11,33] 0.75605416925058 [GeV] -Cell[12,33] 0.0033195608765021 [GeV] -Cell[12,30] 1.9562943017804e-05 [GeV] -Cell[13,29] 0.0047240125027578 [GeV] -Cell[12,18] 0.0008097714227402 [GeV] -Cell[14,22] 0.0010030106290544 [GeV] -### Total energy deposition in calorimeter by a source track in 12 cells : 1.1630609627236 (GeV) - -Source track ID 3956 (gamma,0.17435926984906[GeV]) at (-435.61886350495,245.43065366547,445.72699706947) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[12,21] 0.0021832469868425 [GeV] -Cell[12,20] 0.16133083778629 [GeV] -Cell[12,18] 0.00051099891 [GeV] -Cell[4,38] 0.00039027611794321 [GeV] -Cell[12,3] 0.00039652030335245 [GeV] -Cell[14,2] 0.00051099891 [GeV] -Cell[12,19] 0.0089219122279846 [GeV] -### Total energy deposition in calorimeter by a source track in 7 cells : 0.17424479124241 (GeV) - -Source track ID 3862 (e-,0.0012384443379202[GeV]) at (221.39362194534,448.31335487795,481.10895313545) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[12,8] 0.00072744542792021 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00072744542792021 (GeV) - -Source track ID 3284 (pi+,0.27413659727227[GeV]) at (261.60181760388,426.10384770188,25.479282812196) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[8,44] 0.0014325400507014 [GeV] -Cell[10,10] 0.00018353577093541 [GeV] -Cell[9,10] 0.00023843555112344 [GeV] -Cell[10,7] 0.093261286661573 [GeV] -Cell[10,6] 0.088463759538752 [GeV] -Cell[9,32] 0.0017015985768287 [GeV] -### Total energy deposition in calorimeter by a source track in 6 cells : 0.18528115614991 (GeV) - -Source track ID 3851 (gamma,0.67224858404432[GeV]) at (444.05232253707,-229.8206580128,-518.95901795137) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[9,8] 0.0069017147485572 [GeV] -Cell[7,9] 0.001026019532033 [GeV] -Cell[6,43] 0.0012196911213606 [GeV] -Cell[6,44] 0.033741870093584 [GeV] -Cell[7,45] 0.00084471396017756 [GeV] -Cell[8,17] 0.00051099891 [GeV] -Cell[7,43] 0.01045513315758 [GeV] -Cell[6,45] 0.0039728856137152 [GeV] -Cell[7,31] 0.0077992699030535 [GeV] -Cell[7,44] 0.59943832560088 [GeV] -Cell[6,6] 0.0010208518430231 [GeV] -Cell[5,5] 0.0027631222987137 [GeV] -Cell[15,21] 0.00045201361425385 [GeV] -Cell[9,15] 0.00051099891 [GeV] -Cell[9,37] 0.00029919194025455 [GeV] -### Total energy deposition in calorimeter by a source track in 15 cells : 0.67095680124718 (GeV) - -Source track ID 3852 (gamma,0.13757172036947[GeV]) at (417.90941981582,-274.50267180705,-190.74598677336) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[8,44] 0.0012246527367112 [GeV] -Cell[8,23] 0.001147902462785 [GeV] -Cell[8,43] 0.092599123284159 [GeV] -Cell[7,2] 0.00069502633284695 [GeV] -Cell[9,43] 0.028790377960505 [GeV] -Cell[8,42] 0.010863102536253 [GeV] -Cell[7,1] 0.00030771896017856 [GeV] -Cell[9,44] 0.001797807538072 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.13742571181151 (GeV) - -Source track ID 3803 (kaon0L,0.79133145570028[GeV]) at (475.12875111956,-155.73268719047,-20.781563977403) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[8,45] 0.0026161993303186 [GeV] -Cell[8,44] 0.0013312068435322 [GeV] -Cell[7,22] 0.0011396049601597 [GeV] -Cell[8,46] 5.8499207661953e-06 [GeV] -Cell[6,9] 4.3130103222211e-09 [GeV] -Cell[6,7] 0.00018883147106385 [GeV] -Cell[6,8] 2.0613772135221e-06 [GeV] -Cell[10,37] 0.0006229313099617 [GeV] -Cell[6,38] 0.0053682049582406 [GeV] -Cell[8,43] 0.0001637307372032 [GeV] -Cell[7,41] 0.16070018062157 [GeV] -Cell[7,42] 0.0037627084713563 [GeV] -Cell[14,44] 5.2797104872297e-06 [GeV] -Cell[8,37] 8.4814382717013e-09 [GeV] -Cell[7,37] 5.6381738453638e-05 [GeV] -Cell[12,31] 0.0034861263216242 [GeV] -Cell[14,35] 6.3461212754191e-05 [GeV] -Cell[11,22] 8.442077122163e-05 [GeV] -Cell[10,24] 1.7880984369185e-05 [GeV] -Cell[7,2] 3.8493938336615e-05 [GeV] -Cell[9,43] 0.00045529539387531 [GeV] -Cell[10,43] 0.0021940549461373 [GeV] -Cell[10,47] 0.035525967217293 [GeV] -Cell[9,39] 0.00037691237544152 [GeV] -Cell[8,39] 0.0020179128364406 [GeV] -Cell[10,0] 0.003145415914381 [GeV] -Cell[8,42] 3.0379146046471e-06 [GeV] -Cell[7,43] 0.00054391272500538 [GeV] -Cell[6,1] 7.3235110508904e-05 [GeV] -Cell[6,2] 0.0021328290373901 [GeV] -Cell[8,24] 0.00013476009530916 [GeV] -Cell[7,40] 9.1759629872058e-05 [GeV] -Cell[13,8] 6.2447043601424e-06 [GeV] -Cell[13,35] 1.7455574105725e-06 [GeV] -Cell[10,41] 0.00012184748820255 [GeV] -Cell[10,40] 5.8961707400158e-06 [GeV] -Cell[9,40] 0.0019026581697302 [GeV] -Cell[15,13] 3.6524723701859e-05 [GeV] -Cell[12,36] 0.00060246898619628 [GeV] -Cell[3,15] 0.00024089110639261 [GeV] -Cell[16,16] 6.6922322439495e-06 [GeV] -Cell[9,41] 0.00090241399695335 [GeV] -Cell[9,44] 0.082190768110221 [GeV] -Cell[10,44] 0.0010739249939726 [GeV] -Cell[9,45] 0.087408535825338 [GeV] -Cell[14,36] 0.00031791911567632 [GeV] -Cell[13,20] 1.5749996178783e-05 [GeV] -Cell[13,21] 0.0004787387952158 [GeV] -Cell[14,21] 3.6925414751749e-06 [GeV] -Cell[4,33] 8.7967680301517e-06 [GeV] -Cell[2,16] 3.3602933399379e-08 [GeV] -Cell[7,21] 0.0015272201986626 [GeV] -Cell[3,14] 0.00065312235100771 [GeV] -Cell[8,25] 2.3547826060621e-07 [GeV] -Cell[10,42] 0.0014321510854521 [GeV] -Cell[8,41] 0.00070095842242415 [GeV] -Cell[12,44] 7.8108005969057e-05 [GeV] -Cell[12,45] 0.00014205581046406 [GeV] -Cell[15,36] 4.7123451367952e-06 [GeV] -Cell[16,13] 0.0014943136989716 [GeV] -Cell[15,35] 5.1603627216537e-06 [GeV] -Cell[11,42] 7.0819501706865e-06 [GeV] -Cell[10,46] 0.0025330761699689 [GeV] -Cell[10,38] 1.6708367666524e-05 [GeV] -Cell[10,39] 3.8598969922532e-09 [GeV] -Cell[10,25] 1.4990856186614e-07 [GeV] -Cell[11,37] 0.0032822153698211 [GeV] -Cell[8,38] 0.00068225578931469 [GeV] -Cell[7,38] 0.00025035456926889 [GeV] -Cell[9,38] 0.0091021542127009 [GeV] -Cell[9,37] 0.00095715580185219 [GeV] -Cell[10,45] 0.00052664150835358 [GeV] -Cell[9,47] 2.5458808522671e-08 [GeV] -Cell[14,28] 3.7121971545275e-06 [GeV] -Cell[3,16] 9.9748285720125e-07 [GeV] -Cell[9,46] 0.0014859648987926 [GeV] -Cell[9,0] 0.0016753988528309 [GeV] -Cell[10,22] 0.0001448686965465 [GeV] -Cell[10,23] 3.8519057011399e-07 [GeV] -Cell[14,34] 3.4645701415684e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 80 cells : 0.42841603729993 (GeV) - -Source track ID 3847 (mu-,0.24782567216285[GeV]) at (458.01834658585,-200.54723680661,13.541562510136) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[10,44] 0.15877619026941 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.15877619026941 (GeV) - -Source track ID 3805 (proton,0.97615145639518[GeV]) at (477.3492248854,-148.78749107807,-69.838296217133) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[9,45] 0.037879443395181 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.037879443395181 (GeV) - -Source track ID 3807 (neutron,0.94369517218507[GeV]) at (479.24446790177,-142.56486238042,-62.520216875433) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[10,47] 6.4450875925104e-10 [GeV] -Cell[9,45] 3.8596658298047e-05 [GeV] -Cell[10,46] 0.00054836119374011 [GeV] -Cell[9,46] 0.0034947456562958 [GeV] -### Total energy deposition in calorimeter by a source track in 4 cells : 0.0040817041528427 (GeV) - -Source track ID 3808 (gamma,0.002044637708816[GeV]) at (-460.55145348751,-194.65959696492,209.43935826061) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[11,26] 0.002044637708816 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.002044637708816 (GeV) - -Source track ID 3810 (gamma,0.00025364665084798[GeV]) at (474.15498158729,-158.67278732019,117.58193664262) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[10,45] 0.00025364665084798 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00025364665084798 (GeV) - -Source track ID 3759 (e-,0.003759232342645[GeV]) at (-457.8210902096,-200.9971376893,-1905.4122281895) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[0,27] 0.003248233432645 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.003248233432645 (GeV) - -Source track ID 3763 (gamma,0.00018623709744145[GeV]) at (-50.383145853319,-497.45506190401,-717.74208020165) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[6,35] 0.00018623709744145 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00018623709744145 (GeV) - -Source track ID 3764 (gamma,0.00051099891[GeV]) at (-225.52109053166,-446.25131677723,-394.46406253628) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[8,32] 0.00051099891 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00051099891 (GeV) - -Source track ID 3758 (gamma,0.75885122891297[GeV]) at (497.51078043263,-49.829944343925,326.48051511998) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[9,30] 0.00025259453583584 [GeV] -Cell[12,45] 0.00049883762248432 [GeV] -Cell[12,46] 0.0069753251013577 [GeV] -Cell[12,47] 0.012357703916524 [GeV] -Cell[11,46] 0.026489125491215 [GeV] -Cell[12,0] 0.0014315305965433 [GeV] -Cell[11,47] 0.70866628503878 [GeV] -Cell[11,0] 0.001652090481931 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.75832349278467 (GeV) - -Source track ID 3454 (gamma,0.12620965025075[GeV]) at (-487.28250320383,-112.05249694412,703.88980966998) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[14,43] 0.0029906078231716 [GeV] -Cell[13,26] 0.0036841738488922 [GeV] -Cell[13,25] 0.11723921251317 [GeV] -Cell[14,7] 0.00041741482248882 [GeV] -Cell[13,12] 0.0018192181072534 [GeV] -### Total energy deposition in calorimeter by a source track in 5 cells : 0.12615062711497 (GeV) - -Source track ID 3455 (gamma,0.088297327870564[GeV]) at (61.272157358079,-496.23152130098,76.525337684461) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[10,37] 0.014976755714576 [GeV] -Cell[10,36] 0.073320572155988 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.088297327870564 (GeV) - -Source track ID 3289 (pi+,0.88671540994531[GeV]) at (4.6176068729718,499.97867725211,751.17196447196) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[18,41] 3.8783089548815e-06 [GeV] -Cell[12,34] 6.2706990865991e-06 [GeV] -Cell[13,46] 1.3891233829781e-06 [GeV] -Cell[12,22] 0.14110092218975 [GeV] -Cell[12,35] 1.1459716915851e-05 [GeV] -Cell[13,10] 4.3877093958145e-11 [GeV] -Cell[14,12] 1.0881302728194e-07 [GeV] -Cell[12,36] 0.00050788134747017 [GeV] -Cell[15,15] 4.7822176156842e-09 [GeV] -Cell[15,16] 6.063424734748e-09 [GeV] -Cell[14,25] 3.7600772047881e-06 [GeV] -Cell[14,39] 3.6549076903611e-06 [GeV] -Cell[18,35] 3.4549011761555e-05 [GeV] -Cell[16,18] 2.6522925327299e-05 [GeV] -Cell[18,21] 5.5809525722452e-05 [GeV] -Cell[18,19] 7.0485519245267e-08 [GeV] -Cell[18,22] 4.975816494948e-06 [GeV] -Cell[15,8] 6.1257291556103e-05 [GeV] -Cell[15,6] 2.066948794527e-05 [GeV] -Cell[15,7] 0.0011833807335971 [GeV] -Cell[15,10] 0.062783233014139 [GeV] -Cell[14,6] 3.638978885192e-05 [GeV] -Cell[14,7] 1.5611990267644e-05 [GeV] -Cell[13,5] 4.8802467063069e-08 [GeV] -Cell[14,16] 2.8531244296914e-05 [GeV] -Cell[15,11] 0.021434780630866 [GeV] -Cell[13,15] 0.00044578540714826 [GeV] -Cell[13,6] 2.0261504687369e-09 [GeV] -Cell[13,2] 0.0010521809989117 [GeV] -Cell[14,2] 5.982827488333e-05 [GeV] -Cell[14,15] 8.3494660323709e-05 [GeV] -Cell[18,18] 6.0252804710444e-05 [GeV] -Cell[13,14] 0.0065862656681392 [GeV] -Cell[13,13] 0.00082396046326357 [GeV] -Cell[13,12] 0.0040260439485506 [GeV] -Cell[18,23] 0.00086004457639581 [GeV] -Cell[15,24] 1.9535655155778e-09 [GeV] -Cell[15,23] 1.3221879198682e-06 [GeV] -Cell[13,1] 0.00043314185869519 [GeV] -Cell[13,11] 0.11148000486736 [GeV] -Cell[14,11] 0.45995076951454 [GeV] -### Total energy deposition in calorimeter by a source track in 41 cells : 0.81318826603237 (GeV) - -Source track ID 3362 (pi-,0.65427123483908[GeV]) at (-90.473487260039,-491.74642662963,1125.9985716746) -Original primary track ID 41 (unknown,2.6699951779791[GeV]) -Cell[14,32] 0.0008143677196557 [GeV] -Cell[15,32] 0.019964440107603 [GeV] -Cell[16,32] 3.9181486412417e-05 [GeV] -Cell[15,31] 0.0021057166752345 [GeV] -Cell[14,31] 0.013708525905652 [GeV] -Cell[16,29] 3.6128841456957e-06 [GeV] -Cell[15,46] 3.0983632483981e-05 [GeV] -Cell[12,10] 0.00056393268585402 [GeV] -Cell[14,35] 0.00083425415388558 [GeV] -Cell[11,22] 0.00019160043070599 [GeV] -Cell[12,21] 0.00024302177766037 [GeV] -Cell[12,20] 0.00050275185847704 [GeV] -Cell[12,11] 0.020505050200957 [GeV] -Cell[10,19] 4.012898018118e-06 [GeV] -Cell[13,35] 3.4095835871994e-07 [GeV] -Cell[12,12] 0.0023748798307371 [GeV] -Cell[17,46] 1.2769349621067e-07 [GeV] -Cell[16,0] 0.00020668243930879 [GeV] -Cell[14,36] 0.0012772045403666 [GeV] -Cell[13,21] 0.0001959218852104 [GeV] -Cell[14,21] 2.8521753847599e-10 [GeV] -Cell[16,47] 4.7048364948068e-05 [GeV] -Cell[17,47] 1.7809215933084e-09 [GeV] -Cell[1,39] 0.0030626643997663 [GeV] -Cell[1,40] 8.1883006804446e-05 [GeV] -Cell[12,13] 0.00022923378167764 [GeV] -Cell[12,14] 7.5220150354312e-05 [GeV] -Cell[13,42] 1.3678800314665e-12 [GeV] -Cell[13,41] 1.3529389202063e-05 [GeV] -Cell[12,4] 0.00082873137578917 [GeV] -Cell[15,36] 0.00087613768476695 [GeV] -Cell[15,37] 1.7073352613806e-05 [GeV] -Cell[18,34] 0.00028079641798229 [GeV] -Cell[16,36] 0.0026474287315698 [GeV] -Cell[16,19] 7.6256219181232e-06 [GeV] -Cell[16,18] 0.00075712947650391 [GeV] -Cell[16,35] 0.0031035084727303 [GeV] -Cell[17,34] 3.8079548685346e-06 [GeV] -Cell[16,34] 0.00044578107460416 [GeV] -Cell[15,34] 0.10351170859056 [GeV] -Cell[15,33] 0.0040606568850774 [GeV] -Cell[16,40] 2.932789825536e-07 [GeV] -Cell[14,37] 0.0016972771675219 [GeV] -Cell[15,35] 0.011225300976219 [GeV] -Cell[14,33] 3.8369280900952e-08 [GeV] -Cell[15,8] 0.0027260206901452 [GeV] -Cell[14,41] 4.5329795739235e-09 [GeV] -Cell[16,27] 1.3980662333779e-06 [GeV] -Cell[16,25] 6.0293499263935e-06 [GeV] -Cell[16,24] 8.3876852295361e-07 [GeV] -Cell[15,18] 0.0027757481669199 [GeV] -Cell[15,19] 0.00047099798035208 [GeV] -Cell[15,21] 1.8759012732517e-08 [GeV] -Cell[14,42] 4.4528860598803e-12 [GeV] -Cell[15,22] 1.1212667050131e-07 [GeV] -Cell[16,41] 2.9198708944023e-09 [GeV] -Cell[14,22] 0.00016366068124171 [GeV] -Cell[15,47] 0.00039262288169652 [GeV] -Cell[13,13] 0.00080523633689245 [GeV] -Cell[13,12] 4.5090045037796e-05 [GeV] -Cell[15,25] 0.0011463293927445 [GeV] -Cell[15,24] 0.0049914286643496 [GeV] -Cell[15,23] 4.8648511619717e-05 [GeV] -Cell[15,26] 1.8655389227206e-05 [GeV] -Cell[16,26] 0.00053374197879361 [GeV] -Cell[10,22] 1.1700041902827e-05 [GeV] -Cell[10,23] 2.2464967059932e-09 [GeV] -Cell[14,34] 0.0005438394643129 [GeV] -Cell[16,46] 6.0020841601727e-08 [GeV] -### Total energy deposition in calorimeter by a source track in 69 cells : 0.21122167337572 (GeV) - -Source track ID 3280 (gamma,0.23818895051853[GeV]) at (-24.111052240173,-499.41831880686,-17.911064377671) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[7,8] 0.00042932071914374 [GeV] -Cell[8,36] 0.00030158848541862 [GeV] -Cell[9,35] 0.22728853451137 [GeV] -Cell[9,36] 0.0017648446252356 [GeV] -Cell[10,36] 0.00017092924852192 [GeV] -Cell[10,35] 0.004023998764521 [GeV] -Cell[0,14] 0.00051099891 [GeV] -Cell[0,13] 0.0031202153176619 [GeV] -### Total energy deposition in calorimeter by a source track in 8 cells : 0.23761043058188 (GeV) - -Source track ID 3281 (gamma,0.33413532464401[GeV]) at (245.8933673121,435.35784351717,97.500310757389) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[10,8] 0.29449747175599 [GeV] -Cell[10,7] 0.037445757606726 [GeV] -Cell[11,15] 0.0021920952812929 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.33413532464401 (GeV) - -Source track ID 2101 (pi-,0.58754745256679[GeV]) at (451.85240769917,-214.0780270286,-1440.9225700085) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[6,10] 1.5083403288827e-06 [GeV] -Cell[2,0] 0.002171834537593 [GeV] -Cell[6,38] 0.0028167241514058 [GeV] -Cell[6,44] 8.2584310511152e-05 [GeV] -Cell[5,11] 0.0007162730334054 [GeV] -Cell[1,34] 6.0563848237507e-06 [GeV] -Cell[1,33] 0.0013335154585416 [GeV] -Cell[1,44] 3.781656015974e-05 [GeV] -Cell[0,44] 7.3472317308187e-06 [GeV] -Cell[3,9] 0.0025104661751741 [GeV] -Cell[6,47] 0.0071287749456726 [GeV] -Cell[6,45] 0.00011156443634025 [GeV] -Cell[4,2] 0.0032317521689455 [GeV] -Cell[6,11] 9.2354215059004e-05 [GeV] -Cell[11,18] 9.3714334070683e-12 [GeV] -Cell[3,1] 0.0079843887835066 [GeV] -Cell[4,1] 0.0016069495528761 [GeV] -Cell[10,36] 0.00050772896732033 [GeV] -Cell[12,18] 7.5372967216936e-07 [GeV] -Cell[7,44] 3.7853666261071e-05 [GeV] -Cell[5,17] 2.544347795606e-06 [GeV] -Cell[1,22] 0.0015282261300405 [GeV] -Cell[4,16] 0.00029077168032757 [GeV] -Cell[3,43] 9.1317579997394e-06 [GeV] -Cell[3,37] 0.0012266033843123 [GeV] -Cell[5,44] 7.8804805473169e-05 [GeV] -Cell[1,26] 2.8174371982459e-06 [GeV] -Cell[1,43] 0.00093490937595766 [GeV] -Cell[1,42] 0.014372657698018 [GeV] -Cell[2,43] 0.00074855795534802 [GeV] -Cell[3,31] 0.0022230570024493 [GeV] -Cell[1,12] 4.0863470931072e-06 [GeV] -Cell[2,15] 0.00061706838246027 [GeV] -Cell[1,5] 0.0013532177113179 [GeV] -Cell[1,4] 0.0014276253200827 [GeV] -Cell[4,43] 0.00013587651937889 [GeV] -Cell[3,38] 6.8429051826797e-05 [GeV] -Cell[2,44] 0.17270691128341 [GeV] -Cell[3,22] 0.00084077348503373 [GeV] -Cell[2,5] 0.00096733366684884 [GeV] -Cell[2,4] 0.0035488319149261 [GeV] -Cell[2,34] 0.0022861538991753 [GeV] -Cell[2,31] 1.1423541415979e-05 [GeV] -Cell[2,32] 5.5953525713903e-07 [GeV] -Cell[3,45] 0.0022265135005103 [GeV] -Cell[2,45] 0.0098732747545425 [GeV] -Cell[2,28] 0.000476299249877 [GeV] -Cell[3,7] 0.0028171559660776 [GeV] -Cell[2,39] 7.9959785249116e-05 [GeV] -Cell[2,16] 4.6600611375652e-05 [GeV] -Cell[3,30] 2.3398421471938e-06 [GeV] -Cell[5,30] 0.0010080276357878 [GeV] -Cell[2,6] 0.0034575812876056 [GeV] -Cell[2,42] 0.000248850024783 [GeV] -Cell[2,40] 1.7266851658178e-05 [GeV] -Cell[2,41] 0.00046019682413944 [GeV] -Cell[0,0] 7.4778978842005e-08 [GeV] -Cell[1,32] 0.00028832785258783 [GeV] -Cell[2,1] 5.2538603753828e-05 [GeV] -Cell[3,14] 5.7844045368256e-05 [GeV] -Cell[4,15] 4.6172004797427e-05 [GeV] -Cell[3,24] 0.00024422135721693 [GeV] -Cell[3,25] 0.0013207372748917 [GeV] -Cell[3,46] 0.0090255508329122 [GeV] -Cell[3,32] 0.00035722817859005 [GeV] -Cell[1,28] 0.0026133217046794 [GeV] -Cell[1,29] 0.0002078418490287 [GeV] -Cell[1,27] 0.00053411944966876 [GeV] -Cell[2,29] 0.00018684748726753 [GeV] -Cell[1,30] 3.1738738016429e-08 [GeV] -Cell[4,25] 1.1720112524927e-10 [GeV] -Cell[7,0] 0.0034529348110271 [GeV] -Cell[6,40] 4.2784792603925e-06 [GeV] -Cell[5,45] 1.443091314286e-07 [GeV] -Cell[8,38] 5.7511259336025e-05 [GeV] -Cell[11,17] 3.0850060284138e-12 [GeV] -Cell[18,23] 9.2301073557358e-05 [GeV] -Cell[5,13] 2.1299994870787e-05 [GeV] -Cell[3,2] 0.00076440536802519 [GeV] -Cell[0,47] 0.00012955889831255 [GeV] -Cell[2,46] 4.2404723367099e-05 [GeV] -Cell[3,12] 0.0017230447469676 [GeV] -Cell[2,33] 0.00040754239788851 [GeV] -Cell[3,47] 0.00028495859159816 [GeV] -Cell[4,44] 1.5935112896841e-06 [GeV] -Cell[5,10] 8.6290821241391e-05 [GeV] -Cell[5,12] 0.0011549310286661 [GeV] -Cell[3,16] 0.00061904885866397 [GeV] -Cell[0,43] 3.1014166882414e-05 [GeV] -Cell[5,16] 8.2823908294358e-06 [GeV] -Cell[3,44] 0.001430724008845 [GeV] -Cell[1,41] 0.002056694875271 [GeV] -Cell[2,27] 7.5201274594292e-06 [GeV] -### Total energy deposition in calorimeter by a source track in 93 cells : 0.28379802694686 (GeV) - -Source track ID 2102 (pi+,0.2170884815008[GeV]) at (327.90335803984,377.46441923206,-1035.3745996195) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[5,32] 0.0015442657934729 [GeV] -Cell[4,6] 0.10330809499733 [GeV] -Cell[3,33] 0.0020979196890283 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.10695028047983 (GeV) - -Source track ID 2104 (neutron,0.94396403823531[GeV]) at (438.59084196001,-240.07930637356,-1162.0739832409) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[4,43] 8.4006393903564e-05 [GeV] -Cell[4,44] 0.00032760276691038 [GeV] -Cell[3,44] 0.003956727612845 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.004368336773659 (GeV) - -Source track ID 2105 (gamma,0.0040197164704084[GeV]) at (399.77118395697,-300.30484591102,-994.89157026029) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[5,43] 0.0035087175604084 [GeV] -Cell[4,42] 0.00051099891 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.0040197164704084 (GeV) - -Source track ID 2106 (gamma,0.00033680420565254[GeV]) at (492.81819330369,84.440679467244,-367.81393726783) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[8,1] 0.00033680420565254 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00033680420565254 (GeV) - -Source track ID 1731 (gamma,0.16498092085606[GeV]) at (-167.2775756377,471.1880863188,-1116.98356483) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,36] 0.0003517845387616 [GeV] -Cell[3,9] 0.00089028274375003 [GeV] -Cell[5,1] 0.00030258006579549 [GeV] -Cell[4,14] 0.15017775022561 [GeV] -Cell[3,1] 0.00051473974100847 [GeV] -Cell[4,18] 0.0047742051289062 [GeV] +Cell[9,8] 0.00092350438150213 [GeV] +Cell[6,10] 0.00051099891 [GeV] +Cell[5,46] 2.327470027376e-05 [GeV] +Cell[4,45] 0.00051099891 [GeV] +Cell[1,42] 0.00014388596917339 [GeV] +Cell[3,2] 0.00099770704761477 [GeV] +Cell[5,44] 4.9891149274117e-09 [GeV] +Cell[2,6] 0.0005079773924573 [GeV] +Cell[0,27] 0.0030883652223339 [GeV] +Cell[0,24] 0.0045079511404058 [GeV] +Cell[0,23] 0.0036365350048948 [GeV] +Cell[4,10] 0.00051099891 [GeV] +Cell[0,8] 0.00036937041215155 [GeV] +Cell[7,3] 0.00030489342166364 [GeV] +Cell[1,34] 0.00048082641373811 [GeV] +Cell[4,34] 0.00027898462849073 [GeV] +Cell[1,47] 0.0005879358710827 [GeV] +Cell[1,22] 0.010168307686205 [GeV] +Cell[1,39] 0.00013919811444429 [GeV] +Cell[0,12] 0.00048437661705903 [GeV] +Cell[0,9] 0.00051099891 [GeV] +Cell[2,22] 0.0016640478575728 [GeV] +Cell[2,21] 0.00024099864597992 [GeV] +Cell[2,33] 0.00049032078907515 [GeV] +Cell[2,23] 2.2568257925741e-05 [GeV] +Cell[2,4] 0.00051099891 [GeV] +Cell[2,31] 0.0024775147435446 [GeV] +Cell[0,41] 0.00087896738007496 [GeV] +Cell[0,40] 0.0047494301184084 [GeV] +Cell[1,3] 0.00090122138546843 [GeV] +Cell[2,36] 0.00083063768367373 [GeV] +Cell[0,45] 0.00051445868422626 [GeV] +Cell[5,45] 0.001145284930327 [GeV] +Cell[2,38] 4.7084967909519e-05 [GeV] +Cell[1,23] 1.3877937141378 [GeV] +Cell[1,24] 0.03725437678196 [GeV] +Cell[2,39] 0.0016338561305013 [GeV] +Cell[2,11] 0.00059964189664264 [GeV] +Cell[1,17] 0.00081040140222576 [GeV] Cell[1,35] 0.00051099891 [GeV] -Cell[3,31] 0.0011408810290587 [GeV] -Cell[4,31] 0.00042551939490437 [GeV] -Cell[3,22] 0.00051099891 [GeV] -Cell[2,41] 0.00051084123122689 [GeV] -Cell[3,14] 0.0041201218853209 [GeV] -Cell[4,15] 0.00042083777253798 [GeV] -### Total energy deposition in calorimeter by a source track in 13 cells : 0.16465154157688 (GeV) +### Total energy deposition in calorimeter by a source track in 40 cells : 1.4717636182659 (GeV) -Source track ID 1656 (gamma,0.025785962614609[GeV]) at (-499.85156157998,12.182626402071,-421.86027214421) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[8,11] 0.00029728142474435 [GeV] -Cell[7,23] 0.024778127273502 [GeV] -Cell[8,15] 0.00019404164957006 [GeV] -Cell[7,29] 0.00051099891 [GeV] -### Total energy deposition in calorimeter by a source track in 4 cells : 0.025780449257816 (GeV) +Source track ID 4630 (gamma,2.1679106429722[GeV]) at (-488.39603861094,-107.09486201094,-1544.0567325744) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[6,9] 0.00045432222555402 [GeV] +Cell[1,41] 0.0010191826362979 [GeV] +Cell[1,14] 0.0039078238493701 [GeV] +Cell[4,5] 0.00051099891 [GeV] +Cell[7,44] 0.00051099891 [GeV] +Cell[1,20] 0.00051099891 [GeV] +Cell[0,21] 0.0012111463122724 [GeV] +Cell[1,45] 0.00040357857221098 [GeV] +Cell[1,27] 0.0012589322585958 [GeV] +Cell[2,19] 0.0034563659859454 [GeV] +Cell[1,2] 0.0015432528401519 [GeV] +Cell[1,39] 0.00043580795454617 [GeV] +Cell[0,15] 0.0005660322417531 [GeV] +Cell[0,34] 0.00047274570132805 [GeV] +Cell[1,7] 0.00049278917125411 [GeV] +Cell[3,0] 0.0012678403804036 [GeV] +Cell[4,39] 0.0010467176686817 [GeV] +Cell[0,40] 0.0014012898496538 [GeV] +Cell[0,39] 0.00039366918590336 [GeV] +Cell[1,37] 0.00052452489749833 [GeV] +Cell[3,36] 0.00021742134089984 [GeV] +Cell[2,20] 0.0015631865125859 [GeV] +Cell[2,42] 0.0011473706654017 [GeV] +Cell[0,33] 0.0020798263672508 [GeV] +Cell[5,5] 0.0025574794014128 [GeV] +Cell[2,27] 0.0024237719506435 [GeV] +Cell[2,26] 0.0053774188672952 [GeV] +Cell[2,24] 0.0051236166753627 [GeV] +Cell[2,44] 0.00057032099261176 [GeV] +Cell[1,10] 0.00078654929112054 [GeV] +Cell[1,15] 0.00071819281711551 [GeV] +Cell[1,26] 0.033888380747158 [GeV] +Cell[1,23] 0.0023191632825662 [GeV] +Cell[1,24] 0.0072445020171758 [GeV] +Cell[1,35] 0.00081116937176303 [GeV] +Cell[2,25] 1.1021751891877 [GeV] +Cell[1,25] 0.9612893566344 [GeV] +Cell[1,16] 0.0002119010487474 [GeV] +### Total energy deposition in calorimeter by a source track in 38 cells : 2.1518938356326 (GeV) -Source track ID 1657 (gamma,0.77353931528222[GeV]) at (193.22389509577,-461.15564223375,-1884.3170388951) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[5,25] 0.00074675139280695 [GeV] -Cell[6,12] 0.00035445005479085 [GeV] -Cell[0,39] 0.47194669855742 [GeV] -Cell[0,24] 0.0004159238415366 [GeV] -Cell[5,22] 0.0002894769957743 [GeV] -Cell[0,9] 0.003659328335513 [GeV] -Cell[0,20] 0.0019248710045801 [GeV] -Cell[0,23] 0.0041783661979294 [GeV] -Cell[0,2] 0.00051099891 [GeV] -Cell[1,20] 0.00044344366027153 [GeV] -Cell[1,5] 0.00036525209306032 [GeV] -Cell[0,11] 0.00015926353883408 [GeV] -Cell[1,4] 0.00044431016948173 [GeV] -Cell[0,4] 0.00026122522169566 [GeV] -Cell[0,14] 0.00051099891 [GeV] -Cell[0,38] 0.21924083838248 [GeV] -Cell[1,11] 0.0010500724120148 [GeV] -Cell[0,12] 0.00051099891 [GeV] -Cell[5,31] 0.00018987752986382 [GeV] -Cell[0,37] 0.0003325336796246 [GeV] -Cell[1,8] 0.00042419951734084 [GeV] -Cell[0,0] 0.00051099891 [GeV] -Cell[0,42] 0.0070849009464944 [GeV] -Cell[4,23] 0.00027170225087429 [GeV] -Cell[4,21] 0.00051099891 [GeV] -Cell[0,31] 0.00084815304731648 [GeV] -### Total energy deposition in calorimeter by a source track in 26 cells : 0.7171866333797 (GeV) +Source track ID 4595 (pi-,0.39128925269785[GeV]) at (-221.56974150267,448.22633752429,-1612.178966769) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[9,10] 0.0006774697065706 [GeV] +Cell[9,11] 2.8280585986295e-05 [GeV] +Cell[9,12] 1.2405455308908e-06 [GeV] +Cell[9,5] 0.0050887255264274 [GeV] +Cell[4,33] 1.1483251000755e-07 [GeV] +Cell[1,14] 0.087279607377972 [GeV] +Cell[2,14] 0.00065663356863899 [GeV] +Cell[2,15] 1.8265086691827e-07 [GeV] +Cell[5,37] 1.6562411097993e-06 [GeV] +Cell[6,1] 8.6373780243321e-06 [GeV] +Cell[9,39] 0.00016062364273251 [GeV] +Cell[9,2] 8.0018704175018e-06 [GeV] +Cell[9,3] 6.9978680403437e-06 [GeV] +Cell[0,18] 1.0344417503802e-05 [GeV] +Cell[8,3] 0.0024685218298432 [GeV] +Cell[4,34] 2.1680844254206e-06 [GeV] +Cell[2,16] 6.1837739605153e-06 [GeV] +Cell[6,3] 0.0001737669473199 [GeV] +Cell[6,2] 0.00065425084059973 [GeV] +Cell[5,2] 1.8312130123377e-10 [GeV] +Cell[5,1] 4.5134220272303e-10 [GeV] +Cell[10,12] 5.0661003569985e-10 [GeV] +Cell[9,4] 0.00051099891 [GeV] +Cell[1,15] 0.073495048831416 [GeV] +Cell[1,17] 6.1365730362013e-06 [GeV] +Cell[1,16] 0.0022872410207738 [GeV] +Cell[5,36] 6.4191408455372e-10 [GeV] +### Total energy deposition in calorimeter by a source track in 27 cells : 0.17353283480669 (GeV) -Source track ID 1617 (pi+,0.23584892735226[GeV]) at (53.075862727434,497.17497201261,-1626.2184144699) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[2,22] 0.00051099891 [GeV] -Cell[1,11] 0.12664240799578 [GeV] -Cell[1,10] 0.0033910621525886 [GeV] -### Total energy deposition in calorimeter by a source track in 3 cells : 0.13054446905837 (GeV) +Source track ID 4578 (pi+,4.0201690142727[GeV]) at (-418.20744767256,-274.04840943016,-1790.0514888423) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[0,29] 0.0017647687928538 [GeV] +Cell[0,28] 0.56868728867335 [GeV] +Cell[0,27] 0.25319636291995 [GeV] +Cell[1,28] 0.019889041595735 [GeV] +Cell[0,26] 0.0064776725924195 [GeV] +### Total energy deposition in calorimeter by a source track in 5 cells : 0.8500151345743 (GeV) -Source track ID 1614 (gamma,0.59980090891317[GeV]) at (255.70125647983,-429.67064995719,-1133.3038368836) +Source track ID 4579 (neutron,7.3741998938947[GeV]) at (-413.0762339184,-281.72331279429,-1776.1644807987) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[7,9] 0.0020559765369351 [GeV] +Cell[4,46] 0.00021977220950066 [GeV] +Cell[6,24] 0.00055553106737818 [GeV] +Cell[6,9] 0.0036979163167345 [GeV] +Cell[5,27] 1.4559307601303e-08 [GeV] +Cell[7,46] 3.1353191006929e-06 [GeV] +Cell[4,8] 0.00023988943702739 [GeV] +Cell[5,8] 0.0002031241454024 [GeV] +Cell[4,45] 0.00016411875072299 [GeV] +Cell[11,30] 4.5915574986566e-06 [GeV] +Cell[12,15] 0.0012002657183896 [GeV] +Cell[3,6] 0.0016225435319622 [GeV] +Cell[3,13] 4.7349531441796e-05 [GeV] +Cell[3,12] 3.0857986530464e-09 [GeV] +Cell[3,11] 0.00067743204827407 [GeV] +Cell[2,15] 0.0010310843707471 [GeV] +Cell[5,42] 0.00095091551455027 [GeV] +Cell[2,6] 2.7310883160681e-07 [GeV] +Cell[3,9] 2.6302146201488e-05 [GeV] +Cell[10,21] 3.3781611818995e-10 [GeV] +Cell[0,35] 3.494093220786e-05 [GeV] +Cell[6,29] 0.00023305407641897 [GeV] +Cell[6,28] 1.6402918845415e-10 [GeV] +Cell[6,45] 0.00015800296872624 [GeV] +Cell[1,13] 0.00059964177030027 [GeV] +Cell[1,20] 0.0024948770755499 [GeV] +Cell[0,20] 0.0021914167637309 [GeV] +Cell[12,13] 7.5866410043091e-09 [GeV] +Cell[11,4] 0.0061695002411052 [GeV] +Cell[3,7] 0.029984996535649 [GeV] +Cell[0,30] 0.030206459448595 [GeV] +Cell[0,29] 0.3996427420904 [GeV] +Cell[0,28] 2.7546597259075 [GeV] +Cell[0,27] 0.13802238255748 [GeV] +Cell[0,19] 0.081139960805096 [GeV] +Cell[11,35] 0.0008891646665395 [GeV] +Cell[0,24] 0.005107631421486 [GeV] +Cell[4,36] 0.00068095398589395 [GeV] +Cell[1,21] 9.4415336789098e-06 [GeV] +Cell[0,21] 0.0001093470796682 [GeV] +Cell[0,22] 3.2058057551012e-05 [GeV] +Cell[0,23] 0.0051265854258763 [GeV] +Cell[5,11] 0.014373513960101 [GeV] +Cell[4,11] 0.0027749224179092 [GeV] +Cell[1,45] 7.2089308650902e-07 [GeV] +Cell[5,43] 0.00054278769417556 [GeV] +Cell[4,10] 0.0030363215154171 [GeV] +Cell[1,27] 0.10424798196651 [GeV] +Cell[2,35] 0.00028872148713883 [GeV] +Cell[1,46] 1.437752507627e-08 [GeV] +Cell[3,20] 0.00024501674117801 [GeV] +Cell[0,18] 0.0053003348241148 [GeV] +Cell[0,4] 2.1093247341923e-06 [GeV] +Cell[0,5] 0.001457354176443 [GeV] +Cell[0,7] 3.0561033543108e-07 [GeV] +Cell[0,8] 0.00051810599468627 [GeV] +Cell[3,42] 1.2733210198348e-05 [GeV] +Cell[3,41] 0.00015110969323541 [GeV] +Cell[0,47] 0.0019887496086208 [GeV] +Cell[10,35] 2.0641309674829e-09 [GeV] +Cell[0,31] 0.0063161441433848 [GeV] +Cell[1,34] 1.2569439683944e-05 [GeV] +Cell[3,8] 0.098391634873657 [GeV] +Cell[0,10] 0.0020973351407889 [GeV] +Cell[0,46] 8.7898098821597e-06 [GeV] +Cell[0,0] 0.00031534048935566 [GeV] +Cell[1,12] 1.7308733600657e-05 [GeV] +Cell[2,19] 0.00040863980496783 [GeV] +Cell[7,35] 0.0015264394652325 [GeV] +Cell[0,13] 0.00013547809815964 [GeV] +Cell[0,14] 0.0014010353297633 [GeV] +Cell[0,15] 0.0004812987645978 [GeV] +Cell[0,9] 0.00013439474814913 [GeV] +Cell[2,22] 0.0015955468284016 [GeV] +Cell[2,21] 0.0047979171457608 [GeV] +Cell[1,7] 3.5463193148644e-07 [GeV] +Cell[5,14] 2.45513219852e-08 [GeV] +Cell[1,19] 0.0037679569089147 [GeV] +Cell[2,47] 0.0020633346525378 [GeV] +Cell[2,46] 1.7148180631921e-08 [GeV] +Cell[1,32] 0.0010134093959322 [GeV] +Cell[2,23] 6.7924161441624e-05 [GeV] +Cell[3,32] 0.00013045434643755 [GeV] +Cell[1,33] 0.002239271777767 [GeV] +Cell[6,5] 0.0010998275467065 [GeV] +Cell[3,35] 3.9957605418749e-05 [GeV] +Cell[2,20] 0.00036810708878807 [GeV] +Cell[1,28] 0.010163867261596 [GeV] +Cell[0,33] 0.00022538670609197 [GeV] +Cell[1,31] 0.0032097233473453 [GeV] +Cell[0,44] 0.00081920594066946 [GeV] +Cell[4,7] 3.7568370753434e-06 [GeV] +Cell[3,31] 0.0019105316176654 [GeV] +Cell[2,36] 0.0018742238961299 [GeV] +Cell[6,2] 0.0006438535469037 [GeV] +Cell[11,21] 4.2760562541844e-07 [GeV] +Cell[11,3] 1.676591928117e-07 [GeV] +Cell[9,4] 5.4839594791929e-06 [GeV] +Cell[6,38] 3.1294184736907e-09 [GeV] +Cell[5,41] 2.1567801013589e-08 [GeV] +Cell[4,41] 7.8654452227056e-06 [GeV] +Cell[2,41] 3.7169248913415e-05 [GeV] +Cell[6,47] 0.0016895108718527 [GeV] +Cell[0,45] 0.001888031244796 [GeV] +Cell[0,16] 1.5823422085191e-05 [GeV] +Cell[5,45] 1.2646690432803e-06 [GeV] +Cell[3,39] 0.00044323119227039 [GeV] +Cell[5,12] 0.00014026048817925 [GeV] +Cell[1,15] 0.0019923372208938 [GeV] +Cell[1,43] 8.5990581428632e-06 [GeV] +Cell[1,26] 0.00064773227637442 [GeV] +Cell[6,16] 9.7128057095688e-06 [GeV] +Cell[6,17] 0.0009887546500159 [GeV] +Cell[1,17] 0.00071405092406656 [GeV] +Cell[1,35] 1.8683669350139e-07 [GeV] +Cell[1,16] 0.00079171947742759 [GeV] +Cell[5,36] 3.2009715796448e-06 [GeV] +Cell[0,26] 0.02177185523666 [GeV] +Cell[1,29] 0.0077427655962855 [GeV] +Cell[0,25] 0.011446218962578 [GeV] +Cell[1,30] 0.0019037230995393 [GeV] +Cell[1,18] 0.056788384580249 [GeV] +Cell[2,17] 0.00066025330893376 [GeV] +Cell[3,17] 7.3319824878126e-11 [GeV] +Cell[0,32] 0.0026741798642906 [GeV] +### Total energy deposition in calorimeter by a source track in 125 cells : 3.8647879331781 (GeV) + +Source track ID 4575 (anti_neutron,5.3948206100571[GeV]) at (-415.09134243251,-278.74572182829,-1871.4579101789) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[8,10] 3.3391060424037e-06 [GeV] +Cell[3,44] 0.002015514169294 [GeV] +Cell[8,11] 0.00011746574577535 [GeV] +Cell[8,12] 3.1817091382891e-07 [GeV] +Cell[9,10] 0.00097848420803916 [GeV] +Cell[4,47] 0.0083311939109111 [GeV] +Cell[4,42] 0.0051553442104308 [GeV] +Cell[4,37] 0.0020605792662026 [GeV] +Cell[4,45] 0.0025731665341106 [GeV] +Cell[1,42] 6.0905046275366e-06 [GeV] +Cell[3,2] 0.0014329061546624 [GeV] +Cell[3,3] 0.0024456897916089 [GeV] +Cell[3,4] 0.00033628458409419 [GeV] +Cell[3,6] 0.00052174584045781 [GeV] +Cell[7,18] 1.4664568880107e-06 [GeV] +Cell[3,13] 8.2448798366386e-10 [GeV] +Cell[3,11] 7.5786412360571e-05 [GeV] +Cell[0,36] 0.0027475947307645 [GeV] +Cell[2,7] 0.00067617588515429 [GeV] +Cell[1,14] 0.013803823159891 [GeV] +Cell[2,14] 0.00030661819389616 [GeV] +Cell[5,17] 1.42608769238e-12 [GeV] +Cell[0,35] 0.004331250928659 [GeV] +Cell[0,38] 0.0015507926345819 [GeV] +Cell[0,37] 4.5789577138748e-05 [GeV] +Cell[3,28] 2.627530193422e-11 [GeV] +Cell[1,13] 0.0038378123665823 [GeV] +Cell[3,7] 1.0747530567528e-05 [GeV] +Cell[0,30] 0.014500299510064 [GeV] +Cell[0,29] 0.12733137494388 [GeV] +Cell[0,28] 2.8487423067385 [GeV] +Cell[0,27] 0.17453861189085 [GeV] +Cell[6,40] 0.00018263694612529 [GeV] +Cell[0,24] 7.1558635656402e-05 [GeV] +Cell[4,36] 3.1319593745138e-09 [GeV] +Cell[1,21] 7.8992645636617e-06 [GeV] +Cell[0,21] 0.00023864555142848 [GeV] +Cell[0,22] 5.7901473845732e-06 [GeV] +Cell[5,11] 1.7411280281294e-06 [GeV] +Cell[1,45] 0.0010122277635578 [GeV] +Cell[5,16] 1.0362014033149e-05 [GeV] +Cell[1,27] 0.0080756537059047 [GeV] +Cell[2,35] 0.006429927871561 [GeV] +Cell[1,46] 7.8722901207584e-08 [GeV] +Cell[0,18] 0.00056609234507569 [GeV] +Cell[2,34] 4.425918089396e-06 [GeV] +Cell[3,47] 0.0061345206148706 [GeV] +Cell[2,1] 6.7229848355055e-12 [GeV] +Cell[3,43] 0.0018075985664233 [GeV] +Cell[3,42] 3.1309289170167e-09 [GeV] +Cell[4,43] 0.00016044296512393 [GeV] +Cell[0,47] 1.9032436801353e-05 [GeV] +Cell[9,42] 0.001657245834941 [GeV] +Cell[1,4] 0.00031318265675682 [GeV] +Cell[2,8] 0.00047334120333949 [GeV] +Cell[0,31] 0.0023864910078109 [GeV] +Cell[1,34] 0.00053916519425604 [GeV] +Cell[3,8] 0.00073510058696274 [GeV] +Cell[1,0] 0.023318417658176 [GeV] +Cell[1,1] 0.0011326627046964 [GeV] +Cell[1,47] 0.00062028820751533 [GeV] +Cell[0,10] 0.0027269534865486 [GeV] +Cell[1,22] 0.00095748729837692 [GeV] +Cell[1,12] 0.0024028135173671 [GeV] +Cell[2,19] 0.00095071834890925 [GeV] +Cell[3,18] 2.1093823738738e-07 [GeV] +Cell[1,2] 6.9748958441096e-05 [GeV] +Cell[1,8] 1.0866694792639e-06 [GeV] +Cell[2,37] 1.154668428353e-05 [GeV] +Cell[1,39] 0.00069799842127974 [GeV] +Cell[0,13] 0.00057089281201729 [GeV] +Cell[0,14] 0.00011614261544173 [GeV] +Cell[0,15] 0.0018030971566626 [GeV] +Cell[1,11] 0.003432770076027 [GeV] +Cell[0,34] 0.12315463726044 [GeV] +Cell[0,43] 1.4925713677258e-05 [GeV] +Cell[2,22] 4.7322759928647e-06 [GeV] +Cell[2,21] 2.3178464516604e-09 [GeV] +Cell[1,7] 0.0014829752434819 [GeV] +Cell[3,1] 3.1427858630195e-07 [GeV] +Cell[3,0] 7.8609009506181e-08 [GeV] +Cell[4,27] 1.6230529057793e-05 [GeV] +Cell[0,17] 0.0054375258873886 [GeV] +Cell[5,13] 3.6249548080377e-05 [GeV] +Cell[4,14] 0.0042298151096105 [GeV] +Cell[5,14] 0.21250714656324 [GeV] +Cell[2,33] 3.5914126783609e-11 [GeV] +Cell[2,16] 4.7517532948405e-09 [GeV] +Cell[2,32] 1.1699576134561e-09 [GeV] +Cell[1,32] 0.0017486790931564 [GeV] +Cell[2,23] 0.0022874836031618 [GeV] +Cell[3,10] 6.7670521401851e-05 [GeV] +Cell[4,44] 0.00030559073665074 [GeV] +Cell[2,43] 0.0024087280196693 [GeV] +Cell[4,15] 0.12554711182068 [GeV] +Cell[1,33] 0.00099756499122225 [GeV] +Cell[0,41] 0.00077379371084476 [GeV] +Cell[0,40] 0.008505361921217 [GeV] +Cell[0,39] 0.0092355514603799 [GeV] +Cell[1,37] 0.0019059239076058 [GeV] +Cell[1,3] 0.0035687569421768 [GeV] +Cell[2,3] 5.4547735780943e-06 [GeV] +Cell[2,2] 3.0930415023249e-06 [GeV] +Cell[3,35] 0.00041438052648823 [GeV] +Cell[3,36] 5.6793794806254e-07 [GeV] +Cell[6,46] 9.2569852144493e-05 [GeV] +Cell[3,26] 6.3603710732423e-06 [GeV] +Cell[2,20] 0.0013968349251089 [GeV] +Cell[1,28] 0.010082337670403 [GeV] +Cell[2,42] 0.0017157325821224 [GeV] +Cell[0,33] 1.222685907851e-05 [GeV] +Cell[1,31] 0.0060762020122719 [GeV] +Cell[4,13] 7.4625158958952e-09 [GeV] +Cell[0,44] 0.0024294704559562 [GeV] +Cell[2,36] 7.8804659715388e-06 [GeV] +Cell[5,2] 3.0904801710903e-05 [GeV] +Cell[5,1] 0.00021473714657941 [GeV] +Cell[10,12] 0.0001997736522874 [GeV] +Cell[17,29] 0.0012870973148868 [GeV] +Cell[3,40] 1.9384667393751e-07 [GeV] +Cell[6,39] 0.00039555298277048 [GeV] +Cell[2,41] 0.0018805333126758 [GeV] +Cell[2,27] 0.00021998381062303 [GeV] +Cell[0,45] 0.0014681585814124 [GeV] +Cell[1,9] 1.2498988490847e-05 [GeV] +Cell[3,15] 0.0028363276088463 [GeV] +Cell[5,31] 1.337470888393e-05 [GeV] +Cell[1,10] 0.0013559004158758 [GeV] +Cell[2,9] 3.7439717561938e-07 [GeV] +Cell[2,10] 9.1737223556265e-08 [GeV] +Cell[5,12] 0.00040075743899558 [GeV] +Cell[1,15] 0.00028222711697413 [GeV] +Cell[1,44] 0.0045297136821038 [GeV] +Cell[1,43] 0.0086361038726597 [GeV] +Cell[1,26] 0.00017404794928552 [GeV] +Cell[5,15] 0.013169059540182 [GeV] +Cell[1,23] 0.0092922128790034 [GeV] +Cell[1,24] 0.0025219374044545 [GeV] +Cell[1,17] 1.1904693644738e-07 [GeV] +Cell[1,35] 4.9964203655691e-05 [GeV] +Cell[2,25] 0.00035714385283427 [GeV] +Cell[1,25] 0.00077843451923775 [GeV] +Cell[1,16] 0.00064932942626695 [GeV] +Cell[0,26] 0.014052988316279 [GeV] +Cell[1,29] 0.0031667663276307 [GeV] +Cell[0,25] 0.00058199820346601 [GeV] +Cell[1,30] 0.0040967128887274 [GeV] +Cell[2,17] 1.5014028141422e-06 [GeV] +Cell[0,32] 0.0027407445897836 [GeV] +Cell[0,42] 0.0049588164774895 [GeV] +Cell[2,28] 4.4381480722677e-07 [GeV] +Cell[1,38] 0.0028919716210754 [GeV] +Cell[2,12] 0.0051477420776347 [GeV] +Cell[2,18] 6.7285509430803e-10 [GeV] +Cell[4,35] 6.9481066602748e-06 [GeV] +Cell[1,36] 0.00051099891 [GeV] +### Total energy deposition in calorimeter by a source track in 156 cells : 3.9035187395201 (GeV) + +Source track ID 4503 (pi-,5.4478295055095[GeV]) at (-328.81968525105,-376.66645004752,-1979.3567851996) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[0,30] 0.028058794085469 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.028058794085469 (GeV) + +Source track ID 3223 (pi-,5.0454226716242[GeV]) at (-463.63025060177,-187.208415214,-1932.4173165878) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[0,26] 0.11399917693218 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.11399917693218 (GeV) + +Source track ID 4262 (pi-,26.431092315386[GeV]) at (-349.02210036685,-358.0273361847,-1955.6133753692) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[3,14] 0.0028399220077951 [GeV] +Cell[0,30] 0.084574845796515 [GeV] +Cell[0,17] 0.00099775622798583 [GeV] +Cell[4,44] 0.0019426835137538 [GeV] +Cell[0,39] 0.00051099891 [GeV] +Cell[0,16] 0.00051099891 [GeV] +### Total energy deposition in calorimeter by a source track in 6 cells : 0.09137720536605 (GeV) + +Source track ID 4263 (pi+,1.182706293339[GeV]) at (-498.98699166831,31.811666819036,-1752.4972285563) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[0,22] 0.00032680763734098 [GeV] +Cell[0,23] 0.17757469786471 [GeV] +Cell[1,23] 0.062056200674015 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.23995770617607 (GeV) + +Source track ID 4260 (gamma,1.5279055119092[GeV]) at (-73.254817076876,-494.60462166768,-436.1129448509) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[7,9] 0.00051865672569852 [GeV] +Cell[7,11] 0.0020591572812315 [GeV] +Cell[7,33] 0.00084512883078743 [GeV] +Cell[7,13] 0.00051099891 [GeV] +Cell[7,34] 1.3849969234041 [GeV] +Cell[6,35] 0.0026163025304422 [GeV] +Cell[6,34] 0.0021315744006904 [GeV] +Cell[8,34] 0.004536094121794 [GeV] +Cell[7,0] 0.00051099891 [GeV] +Cell[7,35] 0.1177403141718 [GeV] +Cell[5,20] 0.00051099891 [GeV] +Cell[6,4] 0.00076128704738732 [GeV] +Cell[8,35] 0.0026027892630014 [GeV] +Cell[7,36] 0.0061878273069349 [GeV] +Cell[12,11] 0.00051099891 [GeV] +### Total energy deposition in calorimeter by a source track in 15 cells : 1.5270400507239 (GeV) + +Source track ID 4261 (gamma,2.1921548366006[GeV]) at (-105.19675666694,-488.80839025814,-488.29268935044) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[7,33] 0.057389590989559 [GeV] +Cell[7,34] 2.0137062443466 [GeV] +Cell[8,33] 0.0010918996744814 [GeV] +Cell[6,35] 0.0029024994093749 [GeV] +Cell[6,34] 0.084952489745583 [GeV] +Cell[10,44] 0.00020393391680616 [GeV] +Cell[8,34] 0.00084464000938956 [GeV] +Cell[12,13] 0.00066026674273481 [GeV] +Cell[7,3] 0.00049062893967232 [GeV] +Cell[7,35] 0.015204934673233 [GeV] +Cell[4,1] 0.001233516436868 [GeV] +Cell[13,5] 0.00052394274719003 [GeV] +Cell[6,33] 0.010724219012203 [GeV] +Cell[7,16] 0.0019072126614775 [GeV] +### Total energy deposition in calorimeter by a source track in 14 cells : 2.1918360193052 (GeV) + +Source track ID 4258 (gamma,0.076632669216442[GeV]) at (-300.43599530426,399.67263194462,200.63471905095) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[11,17] 0.019263829233155 [GeV] +Cell[13,29] 0.00041632011721045 [GeV] +Cell[13,4] 0.002297451132864 [GeV] +Cell[11,15] 0.0027263967071899 [GeV] +Cell[11,16] 0.051928672026023 [GeV] +### Total energy deposition in calorimeter by a source track in 5 cells : 0.076632669216442 (GeV) + +Source track ID 4259 (gamma,0.17932025858732[GeV]) at (-255.57095801075,429.74816511705,-559.80028272113) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[5,16] 0.00019979793542106 [GeV] +Cell[7,16] 0.10434083282594 [GeV] +Cell[7,15] 0.0097710345651909 [GeV] +Cell[6,15] 0.021979344315956 [GeV] +Cell[5,15] 6.9320077231409e-05 [GeV] +Cell[6,16] 0.04295992886759 [GeV] +### Total energy deposition in calorimeter by a source track in 6 cells : 0.17932025858732 (GeV) + +Source track ID 3227 (pi-,0.22764227171079[GeV]) at (24.443105674596,499.40217719287,-1276.3543377465) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[4,24] 1.7725429645452e-06 [GeV] +Cell[5,24] 0.0015012266992914 [GeV] +Cell[4,33] 0.00010765547973642 [GeV] +Cell[5,34] 1.7791142454371e-08 [GeV] +Cell[5,35] 1.7177351050123e-05 [GeV] +Cell[3,14] 4.0775330649922e-05 [GeV] +Cell[4,12] 0.004877113664731 [GeV] +Cell[3,3] 1.5053420851473e-05 [GeV] +Cell[6,35] 0.0001634391645548 [GeV] +Cell[3,13] 0.0012338794261207 [GeV] +Cell[3,12] 0.0031193897878714 [GeV] +Cell[3,11] 0.10625255994 [GeV] +Cell[4,3] 0.00056630543642586 [GeV] +Cell[4,2] 1.0128592293768e-09 [GeV] +Cell[9,0] 1.5586006092008e-06 [GeV] +Cell[5,37] 0.0011361767847354 [GeV] +Cell[4,11] 0.0023201004391034 [GeV] +Cell[4,10] 0.00060726827006772 [GeV] +Cell[4,31] 2.3288794182008e-10 [GeV] +Cell[3,24] 3.2678710113601e-05 [GeV] +Cell[4,14] 0.0011813593370006 [GeV] +Cell[5,30] 2.0154151687166e-05 [GeV] +Cell[3,10] 9.356765863231e-07 [GeV] +Cell[4,15] 3.9742441913404e-08 [GeV] +Cell[5,23] 0.00067870915824005 [GeV] +Cell[4,13] 0.0019380302369911 [GeV] +Cell[0,44] 1.4632935344707e-06 [GeV] +Cell[10,4] 2.508022589609e-09 [GeV] +Cell[5,32] 0.0012122631570983 [GeV] +Cell[4,32] 3.4242138765421e-06 [GeV] +Cell[5,31] 2.1325931738829e-05 [GeV] +Cell[5,25] 0.0014876919952449 [GeV] +Cell[5,26] 0.0032721946018447 [GeV] +Cell[3,27] 1.8474344018614e-05 [GeV] +Cell[2,10] 8.7653688751743e-12 [GeV] +Cell[5,36] 0.0003282231851419 [GeV] +### Total energy deposition in calorimeter by a source track in 36 cells : 0.132158441628 (GeV) + +Source track ID 4175 (gamma,0.31054837923301[GeV]) at (447.33313202151,223.36756478018,253.2607105202) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[11,4] 0.011230976474893 [GeV] +Cell[11,1] 0.00027408297957184 [GeV] +Cell[11,3] 0.29836329819543 [GeV] +Cell[10,3] 0.00068002158311216 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.31054837923301 (GeV) + +Source track ID 4176 (gamma,0.15995014937721[GeV]) at (486.22068693794,-116.57376889164,276.4597100284) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[6,21] 0.00051053253925406 [GeV] +Cell[13,17] 0.00012768605033153 [GeV] +Cell[11,45] 0.010183382188182 [GeV] +Cell[11,46] 0.14869034005115 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.15951194082891 (GeV) + +Source track ID 4153 (pi+,0.58332069850112[GeV]) at (-499.07068879111,30.470437961528,861.55199953713) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[10,31] 0.00015295568892374 [GeV] +Cell[12,3] 6.2573908280683e-08 [GeV] +Cell[9,16] 0.00023304067682414 [GeV] +Cell[13,34] 0.0005280274736864 [GeV] +Cell[14,41] 1.1638986700291e-07 [GeV] +Cell[15,21] 0.00035035608013755 [GeV] +Cell[15,23] 0.0014272898607963 [GeV] +Cell[14,20] 1.685693860054e-10 [GeV] +Cell[14,24] 1.3554483416556e-08 [GeV] +Cell[12,2] 4.8180063458858e-09 [GeV] +Cell[12,4] 0.00091543079222561 [GeV] +Cell[15,44] 9.0304903569631e-06 [GeV] +Cell[12,16] 1.7080656194594e-05 [GeV] +Cell[12,17] 5.3607471199939e-05 [GeV] +Cell[14,23] 0.2211915671576 [GeV] +Cell[19,41] 0.00027402279331477 [GeV] +Cell[14,42] 6.0371704384011e-05 [GeV] +Cell[15,42] 3.2997678499669e-07 [GeV] +Cell[15,43] 0.00096577329565309 [GeV] +Cell[14,21] 9.7538587770828e-05 [GeV] +Cell[14,22] 0.29043407217847 [GeV] +Cell[15,20] 4.211072570115e-07 [GeV] +Cell[15,22] 0.0071111818754665 [GeV] +### Total energy deposition in calorimeter by a source track in 23 cells : 0.52382229537189 (GeV) + +Source track ID 4150 (gamma,1.004682788758[GeV]) at (-131.64954595362,-482.35712604895,294.93687511083) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[11,32] 0.0035279424564331 [GeV] +Cell[10,9] 0.0014640595657095 [GeV] +Cell[11,11] 0.00051099891 [GeV] +Cell[11,34] 0.13686479670955 [GeV] +Cell[11,33] 0.84883543509775 [GeV] +Cell[11,36] 0.0039842118063011 [GeV] +Cell[11,35] 0.0015480841167415 [GeV] +Cell[12,33] 0.0037314945529871 [GeV] +Cell[12,34] 0.0029325007691827 [GeV] +Cell[16,1] 0.0012832647733916 [GeV] +### Total energy deposition in calorimeter by a source track in 10 cells : 1.004682788758 (GeV) + +Source track ID 4151 (gamma,1.1635719616336[GeV]) at (-189.42310937636,-462.72981926194,253.06734531357) +Original primary track ID 31 (unknown,691.32334101424[GeV]) +Cell[11,31] 0.0016052582726309 [GeV] +Cell[11,32] 0.27632937527863 [GeV] +Cell[12,32] 0.0001310391933527 [GeV] +Cell[10,32] 0.0057776897006289 [GeV] +Cell[10,33] 0.0014689735328733 [GeV] +Cell[11,34] 0.0055450547246431 [GeV] +Cell[11,33] 0.87190994206497 [GeV] +Cell[12,33] 9.9258263456187e-05 [GeV] +Cell[12,34] 0.0006993905759773 [GeV] +### Total energy deposition in calorimeter by a source track in 9 cells : 1.1635659816072 (GeV) + +Source track ID 3171 (e-,0.028303040585226[GeV]) at (-496.27812320587,60.893549964364,1225.1633449969) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[12,33] 0.00020369577562718 [GeV] +Cell[15,28] 0.00024953402196015 [GeV] +Cell[16,23] 0.027163224023765 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.027616453821353 (GeV) + +Source track ID 3175 (gamma,0.1147388312569[GeV]) at (-316.78320391748,386.84415688463,469.37107222594) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[13,18] 0.00018649191478935 [GeV] +Cell[13,17] 0.00093691889253957 [GeV] +Cell[12,16] 0.012828438585751 [GeV] +Cell[12,17] 0.10078698186382 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.1147388312569 (GeV) + +Source track ID 3172 (e+,0.023585623493272[GeV]) at (-479.2662804402,142.49151705633,1119.9309463194) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[15,21] 0.02158604443303 [GeV] +Cell[15,23] 0.00051099891 [GeV] +Cell[15,22] 0.0019995790602415 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.024096622403272 (GeV) + +Source track ID 2631 (pi+,0.2774334190146[GeV]) at (269.68233454883,421.03614860519,8.619020259551) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[9,6] 0.036488261912827 [GeV] +Cell[10,7] 0.074066692861451 [GeV] +Cell[10,6] 0.072337328747217 [GeV] +Cell[10,22] 0.0032899795416247 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.18618226306312 (GeV) + +Source track ID 3160 (gamma,0.67224858404432[GeV]) at (444.05232278979,-229.82065752449,-518.95902141246) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[7,7] 0.0048918665518133 [GeV] +Cell[6,43] 0.0011232076729611 [GeV] +Cell[7,30] 0.00086522624181292 [GeV] +Cell[7,46] 0.00039796677374609 [GeV] +Cell[7,45] 0.00066808942021404 [GeV] +Cell[8,23] 0.00051099891 [GeV] +Cell[6,29] 0.00072940162487259 [GeV] +Cell[6,44] 0.0099798774254524 [GeV] +Cell[7,44] 0.62866868152072 [GeV] +Cell[8,26] 0.00098077400606711 [GeV] +Cell[2,32] 0.00067935104277775 [GeV] +Cell[7,43] 0.0071074546525672 [GeV] +Cell[7,42] 0.00066204164357692 [GeV] +Cell[6,42] 0.0003759618629381 [GeV] +Cell[1,17] 0.0045124723591834 [GeV] +### Total energy deposition in calorimeter by a source track in 15 cells : 0.66215337170871 (GeV) + +Source track ID 3161 (gamma,0.13757172036947[GeV]) at (417.90941872043,-274.50267347469,-190.74597406709) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[9,43] 0.046397268800841 [GeV] +Cell[9,42] 0.0010142854128092 [GeV] +Cell[8,43] 0.090160166155815 [GeV] +### Total energy deposition in calorimeter by a source track in 3 cells : 0.13757172036947 (GeV) + +Source track ID 3151 (kaon-,1.169441787252[GeV]) at (474.57476985148,-157.41279433521,-16.91035051583) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[11,31] 1.9252198683262e-07 [GeV] +Cell[10,31] 1.7769052647054e-09 [GeV] +Cell[10,0] 0.020424640354196 [GeV] +Cell[9,46] 0.59976016122232 [GeV] +Cell[9,0] 0.0031817978953572 [GeV] +Cell[10,46] 0.075004587657159 [GeV] +Cell[10,45] 0.0036808967730885 [GeV] +Cell[10,44] 0.00586267731567 [GeV] +Cell[9,43] 0.00069678193509594 [GeV] +Cell[9,42] 5.6418951243131e-06 [GeV] +Cell[2,37] 8.5576757555827e-08 [GeV] +Cell[6,3] 3.1599495559931e-07 [GeV] +Cell[10,47] 0.014421229135603 [GeV] +Cell[11,47] 0.0016498828901783 [GeV] +Cell[12,47] 0.0011177473056183 [GeV] +Cell[12,46] 0.000564589731334 [GeV] +Cell[9,44] 0.0009255117197564 [GeV] +Cell[9,45] 0.19990762873555 [GeV] +Cell[11,44] 3.5253469832242e-10 [GeV] +Cell[10,43] 0.0063090236920101 [GeV] +Cell[9,47] 0.034570488318206 [GeV] +Cell[9,1] 0.00047612435562576 [GeV] +### Total energy deposition in calorimeter by a source track in 22 cells : 0.96856000715504 (GeV) + +Source track ID 3142 (gamma,9.9412985081284e-05[GeV]) at (487.25000548357,-112.19372601111,-264.66921682627) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[8,46] 9.9412985081284e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 9.9412985081284e-05 (GeV) + +Source track ID 3144 (gamma,0.0012153793306318[GeV]) at (331.95284723305,-373.90815344664,-452.98766587922) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[7,41] 0.0012153793306318 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0012153793306318 (GeV) + +Source track ID 3145 (gamma,0.0016433757270598[GeV]) at (287.17225332215,-409.3068493464,-63.050290947246) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[9,40] 0.0016433757270598 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0016433757270598 (GeV) + +Source track ID 3139 (gamma,0.75885122891297[GeV]) at (497.51078043776,-49.829944292692,326.48051535188) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[8,21] 0.0015276890946981 [GeV] +Cell[12,45] 0.0015601865033007 [GeV] +Cell[13,17] 0.00051099891 [GeV] +Cell[10,12] 8.6374205239957e-05 [GeV] +Cell[11,47] 0.72499638306303 [GeV] +Cell[11,0] 0.0027904270900139 [GeV] +Cell[12,47] 0.0086446130520429 [GeV] +Cell[12,46] 0.0035918416517039 [GeV] +Cell[11,46] 0.011109459292767 [GeV] +Cell[12,0] 0.0010168376002678 [GeV] +Cell[12,1] 0.0011713722001065 [GeV] +### Total energy deposition in calorimeter by a source track in 11 cells : 0.75700618266317 (GeV) + +Source track ID 2933 (e-,0.00056575177847315[GeV]) at (-475.72557046617,153.89990774735,1704.4054477535) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[18,21] 9.2815498258335e-06 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 9.2815498258335e-06 (GeV) + +Source track ID 2879 (e-,0.001324888257379[GeV]) at (-416.50592690729,276.62757066333,1977.1488301067) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[19,19] 0.00081388934737903 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00081388934737903 (GeV) + +Source track ID 2862 (gamma,0.12620965025075[GeV]) at (-487.28249692595,-112.05252424469,703.88980989713) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[7,47] 0.00042006114877804 [GeV] +Cell[13,26] 0.011424473361419 [GeV] +Cell[13,25] 0.11223329026016 [GeV] +Cell[14,26] 0.00051099891 [GeV] +Cell[13,24] 0.0015638138180307 [GeV] +### Total energy deposition in calorimeter by a source track in 5 cells : 0.12615263749839 (GeV) + +Source track ID 2863 (gamma,0.088297327870564[GeV]) at (61.272134076859,-496.23152417563,76.525370512992) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[10,37] 0.0096080118581017 [GeV] +Cell[10,36] 0.078357490123021 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.087965501981123 (GeV) + +Source track ID 2636 (pi+,0.88674454250485[GeV]) at (5.6800775284358,499.96773567828,752.24962529859) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[15,14] 2.4498180326646e-05 [GeV] +Cell[12,3] 0.00027604843686368 [GeV] +Cell[13,3] 0.0087685557511222 [GeV] +Cell[14,7] 0.0053763304246182 [GeV] +Cell[14,4] 0.004343385528897 [GeV] +Cell[13,7] 0.0011608642927766 [GeV] +Cell[15,12] 5.5715920266039e-05 [GeV] +Cell[14,9] 0.0016406904028434 [GeV] +Cell[13,6] 0.00073069130615363 [GeV] +Cell[13,8] 4.3204007597524e-06 [GeV] +Cell[12,5] 2.2246206447107e-07 [GeV] +Cell[12,2] 0.003514897806324 [GeV] +Cell[13,4] 0.012324829711172 [GeV] +Cell[13,5] 0.0023639396362412 [GeV] +Cell[13,2] 2.0350177932187e-06 [GeV] +Cell[15,3] 8.9254275394524e-08 [GeV] +Cell[12,4] 0.00023861247304558 [GeV] +Cell[14,8] 0.00072435273647409 [GeV] +Cell[15,11] 0.014606597354189 [GeV] +Cell[15,4] 8.2930619896615e-08 [GeV] +Cell[12,6] 5.6767545174807e-08 [GeV] +Cell[15,34] 5.631497034517e-05 [GeV] +Cell[15,9] 8.5182841136543e-05 [GeV] +Cell[16,13] 2.0559137965392e-09 [GeV] +Cell[16,12] 0.00056560665809548 [GeV] +Cell[16,10] 0.0023452353871826 [GeV] +Cell[16,11] 0.0034122098125636 [GeV] +Cell[15,13] 2.7265511532619e-05 [GeV] +Cell[14,12] 0.075915366852789 [GeV] +Cell[14,11] 0.32369612761639 [GeV] +Cell[14,13] 0.0020098189987245 [GeV] +Cell[14,5] 0.0050891520506265 [GeV] +Cell[13,11] 0.079886867989695 [GeV] +Cell[15,10] 0.013349675018687 [GeV] +Cell[14,10] 0.0053127496470879 [GeV] +Cell[14,6] 0.017048857609955 [GeV] +### Total energy deposition in calorimeter by a source track in 36 cells : 0.5849572498151 (GeV) + +Source track ID 2775 (pi-,0.65423006095301[GeV]) at (-91.34562210632,-491.58516792313,1124.9742879626) +Original primary track ID 41 (unknown,2.6699951779791[GeV]) +Cell[16,31] 3.7809992227153e-05 [GeV] +Cell[6,9] 0.0013483920713711 [GeV] +Cell[6,10] 5.5006239563227e-12 [GeV] +Cell[6,8] 2.4188048194674e-05 [GeV] +Cell[16,32] 3.4353182360064e-05 [GeV] +Cell[17,32] 0.0014103333791359 [GeV] +Cell[16,30] 8.0027962789018e-06 [GeV] +Cell[16,0] 4.5735305661765e-08 [GeV] +Cell[15,36] 2.5452704903728e-08 [GeV] +Cell[17,0] 6.0556350774732e-07 [GeV] +Cell[16,38] 1.2759119272232e-10 [GeV] +Cell[16,29] 5.4878618129806e-09 [GeV] +Cell[17,38] 4.3405452743173e-10 [GeV] +Cell[14,36] 2.3943698579387e-11 [GeV] +Cell[15,35] 0.0015650766800955 [GeV] +Cell[17,33] 7.9638835669698e-05 [GeV] +Cell[14,35] 1.605998412515e-06 [GeV] +Cell[15,37] 2.2933481840255e-06 [GeV] +Cell[17,36] 0.00039660780936549 [GeV] +Cell[17,35] 0.012164152368785 [GeV] +Cell[17,34] 0.13298850482891 [GeV] +Cell[16,34] 0.086020372583928 [GeV] +Cell[16,35] 0.13321274907841 [GeV] +Cell[18,34] 5.8227260918784e-06 [GeV] +Cell[17,37] 2.5023651346601e-07 [GeV] +Cell[16,37] 0.00022948119641683 [GeV] +Cell[16,36] 0.011087255150544 [GeV] +Cell[15,34] 0.089669015744328 [GeV] +Cell[15,33] 1.9854842702216e-06 [GeV] +Cell[16,33] 0.010237190286368 [GeV] +Cell[18,36] 0.00076561255007136 [GeV] +Cell[17,31] 7.9199823316571e-05 [GeV] +Cell[17,47] 0.0014311595412399 [GeV] +Cell[16,47] 5.5919547513668e-06 [GeV] +### Total energy deposition in calorimeter by a source track in 34 cells : 0.48280732852571 (GeV) + +Source track ID 2615 (gamma,0.00050362352098594[GeV]) at (16.105706127177,-499.74053891009,-15.208314967066) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[1,33] 0.00031622865533443 [GeV] -Cell[3,39] 0.0075006684992195 [GeV] -Cell[0,19] 0.00051099891 [GeV] -Cell[1,12] 0.0028692186795771 [GeV] -Cell[1,3] 0.00062395927799742 [GeV] +Cell[9,36] 0.00050362352098594 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00050362352098594 (GeV) + +Source track ID 2616 (gamma,0.014925081946934[GeV]) at (16.152966015869,-499.73901357498,-12.216987790877) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[9,36] 0.014925081946934 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.014925081946934 (GeV) + +Source track ID 2583 (e-,0.16703239258157[GeV]) at (108.9098377213,-487.99451559164,-12.909045231299) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[9,38] 0.050895203789931 [GeV] +Cell[10,37] 0.0039732217996452 [GeV] +Cell[10,38] 0.0038831454469719 [GeV] +Cell[7,19] 7.4404253045596e-05 [GeV] +Cell[10,39] 0.011821641245248 [GeV] +Cell[9,46] 0.0053686199091256 [GeV] +Cell[9,39] 0.0010283350069036 [GeV] +Cell[11,38] 0.00016811909532095 [GeV] +Cell[12,0] 0.0001449644705886 [GeV] +Cell[10,3] 0.00062154802420287 [GeV] +Cell[9,37] 0.087115376417818 [GeV] +Cell[9,47] 0.0004593893513338 [GeV] +### Total energy deposition in calorimeter by a source track in 12 cells : 0.16555396881013 (GeV) + +Source track ID 2585 (gamma,0.00031468892901605[GeV]) at (-25.733348303704,-499.3373556876,-8.1411712644855) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[9,35] 0.00031468892901605 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.00031468892901605 (GeV) + +Source track ID 2593 (gamma,0.018132231758721[GeV]) at (-482.06211349612,132.72572746704,35.163252675701) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[10,22] 0.0032261429595408 [GeV] +Cell[10,21] 0.01490608879918 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.018132231758721 (GeV) + +Source track ID 2597 (gamma,0.0015431754006085[GeV]) at (-294.23866372102,-404.25685989439,-466.73606814902) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[7,31] 0.0015431754006085 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0015431754006085 (GeV) + +Source track ID 2599 (gamma,0.0013771509138193[GeV]) at (-405.43191499908,-292.61743334972,-618.86400235164) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[6,28] 0.0013771509138193 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0013771509138193 (GeV) + +Source track ID 2600 (gamma,0.0011339582091126[GeV]) at (-495.44134409319,67.363748137479,-1241.4965703618) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[3,22] 0.00046551419875247 [GeV] +Cell[3,23] 0.0006684440103601 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.0011339582091126 (GeV) + +Source track ID 2603 (gamma,0.00051099891[GeV]) at (-154.6436521132,-475.48432241357,-48.2610624792) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[5,8] 0.00018137500518484 [GeV] +Cell[9,33] 0.00032962390481516 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.00051099891 (GeV) + +Source track ID 2582 (gamma,0.33413532464401[GeV]) at (245.8933673121,435.35784351717,97.500310757389) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[10,8] 0.27826392885354 [GeV] +Cell[10,7] 0.052714864912574 [GeV] +Cell[10,6] 0.00045039875481636 [GeV] +Cell[10,23] 0.00049676627381516 [GeV] +Cell[10,9] 0.0015769861998034 [GeV] +Cell[2,3] 0.00024978585550371 [GeV] +Cell[11,8] 0.00010714810327417 [GeV] +### Total energy deposition in calorimeter by a source track in 7 cells : 0.33385987895332 (GeV) + +Source track ID 2484 (pi-,1.7948318543035[GeV]) at (442.22572072864,-233.31612015898,-1858.454053079) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[7,31] 5.8111399994232e-06 [GeV] +Cell[9,8] 7.9498483766635e-05 [GeV] +Cell[6,10] 0.00027041392970428 [GeV] +Cell[7,47] 1.7349040514091e-05 [GeV] +Cell[5,46] 0.0037245488026806 [GeV] +Cell[7,46] 1.2920152454171e-05 [GeV] +Cell[10,1] 4.761723219417e-06 [GeV] +Cell[3,14] 0.0030312654773919 [GeV] +Cell[1,42] 0.0044176866919526 [GeV] +Cell[8,30] 1.9446724618319e-06 [GeV] +Cell[7,23] 0.0016006742042583 [GeV] +Cell[3,13] 5.3192789429204e-05 [GeV] +Cell[3,12] 1.767021528417e-05 [GeV] +Cell[7,24] 0.00067140636983351 [GeV] +Cell[0,36] 1.2449053569071e-05 [GeV] +Cell[5,17] 4.417407134315e-05 [GeV] +Cell[9,0] 5.6810684310904e-05 [GeV] +Cell[0,35] 0.0022227524195768 [GeV] +Cell[0,38] 3.218430414563e-06 [GeV] +Cell[0,37] 0.0016634396328116 [GeV] +Cell[7,25] 0.00012348022557321 [GeV] +Cell[0,20] 0.0013884557625142 [GeV] +Cell[0,19] 0.00056063350647798 [GeV] +Cell[9,2] 7.6629914401565e-06 [GeV] +Cell[0,21] 0.00043399599616928 [GeV] +Cell[0,22] 0.0016329061560185 [GeV] +Cell[1,45] 0.00084886569163962 [GeV] +Cell[1,46] 2.8858368306146e-06 [GeV] +Cell[0,18] 0.00068092027827936 [GeV] +Cell[8,3] 0.00012203823496736 [GeV] +Cell[8,4] 1.3300609862199e-05 [GeV] +Cell[1,4] 0.0030013983836338 [GeV] +Cell[1,34] 0.00098871667244157 [GeV] +Cell[1,0] 1.3982955715619e-07 [GeV] +Cell[1,47] 1.5396720793888e-06 [GeV] +Cell[0,46] 0.0016898444597477 [GeV] +Cell[0,15] 5.3400255274028e-06 [GeV] +Cell[0,43] 0.028669118618272 [GeV] +Cell[0,17] 0.00056667415949488 [GeV] +Cell[2,45] 1.3779516954628e-05 [GeV] +Cell[0,41] 3.2256028282518e-07 [GeV] +Cell[1,37] 2.9103830456734e-13 [GeV] +Cell[1,3] 0.0017856382232727 [GeV] +Cell[2,42] 9.0908735564426e-05 [GeV] +Cell[0,44] 0.80112457775756 [GeV] +Cell[2,36] 4.4042282181181e-05 [GeV] +Cell[17,13] 1.6974498488707e-05 [GeV] +Cell[7,38] 5.3548532596324e-06 [GeV] +Cell[0,1] 2.6422697352245e-05 [GeV] +Cell[0,45] 0.056142980281334 [GeV] +Cell[3,15] 4.4077389058657e-05 [GeV] +Cell[9,47] 3.8922623390799e-05 [GeV] +Cell[1,15] 0.00014351953120786 [GeV] +Cell[1,44] 0.0016665219913961 [GeV] +Cell[1,43] 5.0562586386604e-07 [GeV] +Cell[1,35] 2.8661415562965e-06 [GeV] +Cell[1,16] 1.6094160877401e-05 [GeV] +Cell[0,42] 0.0083166357957931 [GeV] +Cell[1,36] 0.00046551111940346 [GeV] +Cell[9,1] 0.0011169286598832 [GeV] +Cell[2,13] 2.0621877105441e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 61 cells : 0.92973311141758 (GeV) + +Source track ID 2195 (gamma,0.16498092085606[GeV]) at (-167.27757076682,471.18808804802,-1116.9833782498) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[3,13] 0.0015413320194647 [GeV] +Cell[4,14] 0.15845924121995 [GeV] +Cell[4,15] 0.0016093429903198 [GeV] +Cell[4,13] 0.0027633331063784 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.16437324933611 (GeV) + +Source track ID 2059 (gamma,8.4450532563742e-05[GeV]) at (444.19052769072,229.5534253934,-1233.1061534673) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[3,3] 8.4450532563742e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 8.4450532563742e-05 (GeV) + +Source track ID 2062 (gamma,0.0038811537407086[GeV]) at (52.694276588652,-497.21556010929,-1206.9241012741) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[3,37] 0.0038811537407086 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0038811537407086 (GeV) + +Source track ID 2055 (e-,0.017483390886821[GeV]) at (499.30906087193,-26.276638506396,-1676.9184299584) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[1,47] 0.01655349597758 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.01655349597758 (GeV) + +Source track ID 2053 (gamma,0.00032826008926735[GeV]) at (192.79407488303,-461.33550122443,-486.35155023664) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[7,38] 0.00017321293437539 [GeV] +Cell[7,39] 0.00015338796167261 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.000326600896048 (GeV) + +Source track ID 2054 (gamma,0.77353931528222[GeV]) at (193.2239012045,-461.15563967419,-1884.3170215907) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[3,5] 0.0011071616313518 [GeV] +Cell[2,15] 0.00021278201654255 [GeV] +Cell[0,38] 0.21061022267831 [GeV] +Cell[4,16] 0.00051099891 [GeV] +Cell[1,47] 0.00060241530755447 [GeV] +Cell[0,14] 0.000503427689311 [GeV] +Cell[0,40] 0.0009245766461643 [GeV] +Cell[0,39] 0.50030415515126 [GeV] +Cell[0,16] 0.00037665883308688 [GeV] +Cell[2,11] 0.00068387050194423 [GeV] +### Total energy deposition in calorimeter by a source track in 10 cells : 0.71583626936553 (GeV) + +Source track ID 2013 (pi+,0.23580710989866[GeV]) at (55.676602507589,496.89044661093,-1604.8920792115) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[7,34] 0.00073351210082164 [GeV] +Cell[1,22] 0.00051099891 [GeV] +Cell[1,11] 0.14001459143386 [GeV] +Cell[1,25] 0.0034688575408022 [GeV] +Cell[0,32] 0.00079790982566191 [GeV] +Cell[2,18] 0.00078070404765567 [GeV] +### Total energy deposition in calorimeter by a source track in 6 cells : 0.1463065738588 (GeV) + +Source track ID 2010 (gamma,0.59980090891317[GeV]) at (255.70125305304,-429.67065199651,-1133.3038195604) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[4,40] 0.52023741106873 [GeV] +Cell[4,37] 0.00025660077020123 [GeV] +Cell[5,16] 0.00046028440321703 [GeV] +Cell[4,39] 0.027683480399251 [GeV] +Cell[5,40] 0.00051099891 [GeV] +Cell[2,31] 0.0004519767736056 [GeV] +Cell[2,30] 0.00070909123664177 [GeV] +Cell[3,35] 0.0058507182595716 [GeV] +Cell[3,38] 0.001754958007529 [GeV] +Cell[3,40] 0.025089941823416 [GeV] +Cell[3,39] 0.012699166012264 [GeV] +Cell[1,23] 0.00073569171411817 [GeV] +Cell[3,17] 0.00039994420899336 [GeV] +### Total energy deposition in calorimeter by a source track in 13 cells : 0.59684026358754 (GeV) + +Source track ID 2011 (gamma,0.053266099197347[GeV]) at (183.99446161117,464.9150869744,-1027.4556901239) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[4,8] 0.0026641935620771 [GeV] +Cell[4,9] 0.045244825241474 [GeV] +Cell[3,2] 0.0015053845959652 [GeV] +Cell[5,38] 0.00037129715323232 [GeV] +### Total energy deposition in calorimeter by a source track in 4 cells : 0.049785700552749 (GeV) + +Source track ID 2008 (gamma,0.39597382458922[GeV]) at (-372.59430032481,-333.42688458711,-1802.3851762703) +Original primary track ID 43 (unknown,52.984237098069[GeV]) +Cell[5,46] 0.00061444370776457 [GeV] +Cell[1,41] 0.00030663887523674 [GeV] +Cell[9,16] 0.0017581674346327 [GeV] +Cell[0,30] 0.003702911289754 [GeV] +Cell[0,29] 0.37037791254644 [GeV] +Cell[0,28] 0.0010858910355385 [GeV] +Cell[7,41] 0.00051099891 [GeV] +Cell[0,8] 0.00026842163456933 [GeV] +Cell[3,42] 0.00050059442208744 [GeV] +Cell[1,4] 0.0030488879215376 [GeV] +Cell[0,31] 0.001146432091659 [GeV] +Cell[1,7] 0.00046629787801388 [GeV] Cell[3,0] 0.00051099891 [GeV] -Cell[2,20] 0.0012450775154697 [GeV] -Cell[4,40] 0.50389455491829 [GeV] -Cell[1,16] 0.00024551483369427 [GeV] -Cell[4,12] 0.00036407739393158 [GeV] -Cell[1,9] 0.0038058856195197 [GeV] -Cell[3,41] 0.0026683652696929 [GeV] -Cell[3,40] 0.015572261159612 [GeV] -Cell[2,29] 0.0018061340489294 [GeV] -Cell[12,15] 0.00086343479307336 [GeV] -Cell[14,17] 0.0021166820885695 [GeV] -Cell[4,41] 0.00036587634773661 [GeV] -Cell[4,42] 0.0004540296640343 [GeV] -Cell[3,34] 0.0029448125751815 [GeV] -Cell[4,39] 0.048456789452779 [GeV] -Cell[4,11] 0.00065840578970454 [GeV] -Cell[6,23] 0.00051952669964012 [GeV] -### Total energy deposition in calorimeter by a source track in 22 cells : 0.59831350110199 (GeV) +Cell[3,37] 0.00044006103667085 [GeV] +Cell[11,20] 0.00021281058513199 [GeV] +Cell[0,45] 0.00051099891 [GeV] +### Total energy deposition in calorimeter by a source track in 16 cells : 0.38546246718904 (GeV) -Source track ID 1615 (gamma,0.053266099197347[GeV]) at (183.99450012634,464.91507173166,-1027.4558743765) +Source track ID 2009 (gamma,0.02130681471934[GeV]) at (476.42903504164,151.70818886696,-84.417526405024) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[4,9] 0.051633959690665 [GeV] -Cell[4,10] 0.0016321395066825 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.053266099197347 (GeV) +Cell[9,10] 0.0002276094860577 [GeV] +Cell[9,2] 0.02079581580934 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.021023425295398 (GeV) -Source track ID 1612 (gamma,0.39597382458922[GeV]) at (-372.59429837738,-333.42688676331,-1802.3852009406) +Source track ID 2007 (gamma,0.19239638056034[GeV]) at (-414.65187723724,279.39903490105,-1130.2071590749) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[0,15] 0.00051099891 [GeV] -Cell[0,29] 0.36012074137106 [GeV] -Cell[2,39] 0.0017672510622852 [GeV] -Cell[2,11] 0.00081076408540766 [GeV] -Cell[0,28] 0.0071376069534371 [GeV] -Cell[0,45] 0.00026569473325782 [GeV] -Cell[16,43] 0.00032054386071305 [GeV] -Cell[1,29] 0.001389606215098 [GeV] -Cell[1,30] 0.0017449159747646 [GeV] -Cell[6,14] 0.00037873915495729 [GeV] -Cell[0,7] 0.0014202207083712 [GeV] -### Total energy deposition in calorimeter by a source track in 11 cells : 0.37586708302935 (GeV) +Cell[4,42] 0.00029793049830825 [GeV] +Cell[4,19] 0.17717067617624 [GeV] +Cell[5,19] 0.00056094331022329 [GeV] +Cell[4,25] 0.00051099891 [GeV] +Cell[1,27] 0.0006835358109753 [GeV] +Cell[3,42] 0.00051099891 [GeV] +Cell[3,18] 0.00051099891 [GeV] +Cell[3,1] 0.00031841214381533 [GeV] +Cell[4,20] 0.0044116062434064 [GeV] +Cell[1,37] 0.00051099891 [GeV] +Cell[4,38] 0.00044539530199462 [GeV] +Cell[4,32] 0.00054885221855852 [GeV] +Cell[1,10] 0.0045209209945823 [GeV] +### Total energy deposition in calorimeter by a source track in 13 cells : 0.1910022683381 (GeV) -Source track ID 1613 (gamma,0.02130681471934[GeV]) at (476.42903950586,151.70817484739,-84.417661518957) +Source track ID 1923 (gamma,0.25162621009879[GeV]) at (499.02634681191,-31.188221936503,957.00756966456) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[8,2] 0.0015547139460991 [GeV] -Cell[9,2] 0.019752100773241 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.02130681471934 (GeV) +Cell[15,14] 0.001456462529507 [GeV] +Cell[15,27] 0.00051099891 [GeV] +Cell[14,47] 0.21258926781157 [GeV] +Cell[15,46] 0.00085867309738632 [GeV] +Cell[15,0] 0.0028392892926467 [GeV] +Cell[15,9] 0.0010381506654173 [GeV] +Cell[15,47] 0.03233336779227 [GeV] +### Total energy deposition in calorimeter by a source track in 7 cells : 0.25162621009879 (GeV) -Source track ID 1611 (gamma,0.19239638056034[GeV]) at (-414.65188656689,279.39902105505,-1130.207227793) +Source track ID 1705 (gamma,0.23940053141976[GeV]) at (-378.3099211302,-326.92752036875,1067.9856374504) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[3,1] 0.00051099891 [GeV] -Cell[4,18] 0.00047372206028153 [GeV] -Cell[4,19] 0.17396933943537 [GeV] -Cell[2,5] 0.0050602054881979 [GeV] -Cell[2,10] 0.00015755674630137 [GeV] -Cell[3,40] 0.00049787860719936 [GeV] -Cell[3,19] 0.010389437401234 [GeV] -Cell[4,20] 0.00048268035815566 [GeV] -Cell[4,44] 0.00050111938990402 [GeV] -### Total energy deposition in calorimeter by a source track in 9 cells : 0.19204293839664 (GeV) +Cell[4,24] 0.00034250182920215 [GeV] +Cell[15,30] 0.0011457975289435 [GeV] +Cell[15,46] 0.00066090401687952 [GeV] +Cell[15,29] 0.2333696504992 [GeV] +Cell[15,37] 0.0017150073814939 [GeV] +Cell[15,20] 0.0014871741732419 [GeV] +Cell[19,10] 0.00051099891 [GeV] +### Total energy deposition in calorimeter by a source track in 7 cells : 0.23923203433896 (GeV) -Source track ID 1525 (gamma,0.25162621009879[GeV]) at (499.02634652624,-31.188226507317,957.00764397888) +Source track ID 1507 (gamma,0.41164872010706[GeV]) at (-456.42208927564,204.15405070991,168.67820253855) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[14,27] 0.00051099891 [GeV] -Cell[14,0] 0.0016773664200566 [GeV] -Cell[16,47] 0.00040882173073463 [GeV] -Cell[14,46] 0.00051099891 [GeV] -Cell[14,47] 0.215893152157 [GeV] -Cell[16,34] 0.00051099891 [GeV] -Cell[19,38] 0.00051099891 [GeV] -Cell[15,0] 0.0028349561579182 [GeV] -Cell[15,47] 0.027989309175097 [GeV] -Cell[16,22] 0.00033012751154388 [GeV] -Cell[16,46] 0.0004484813064483 [GeV] -### Total energy deposition in calorimeter by a source track in 11 cells : 0.25162621009879 (GeV) +Cell[10,22] 0.0016882322185061 [GeV] +Cell[10,21] 0.014178592076857 [GeV] +Cell[11,21] 0.01187398939073 [GeV] +Cell[10,20] 0.14159009721346 [GeV] +Cell[10,19] 0.0010386322905244 [GeV] +Cell[11,20] 0.24127917691698 [GeV] +### Total energy deposition in calorimeter by a source track in 6 cells : 0.41164872010706 (GeV) -Source track ID 1382 (gamma,4.5169457731185e-06[GeV]) at (-485.1716667835,-120.86543654214,1341.2855671777) +Source track ID 1508 (gamma,0.17556583448629[GeV]) at (-370.26450201706,336.01219999586,-37.728299353738) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[16,25] 4.5169457731185e-06 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 4.5169457731185e-06 (GeV) +Cell[10,22] 0.00051099891 [GeV] +Cell[9,19] 0.0058992737574905 [GeV] +Cell[9,15] 0.0014069814418747 [GeV] +Cell[9,17] 0.00098709531206089 [GeV] +Cell[9,18] 0.16676148506487 [GeV] +### Total energy deposition in calorimeter by a source track in 5 cells : 0.17556583448629 (GeV) -Source track ID 1306 (e-,0.00080046723299694[GeV]) at (-498.93091477229,-32.679386231787,1894.2992279969) +Source track ID 1506 (gamma,0.41324573943274[GeV]) at (303.44001238969,-397.39672731534,976.47730315274) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[18,17] 1.6144393238189e-06 [GeV] -Cell[19,24] 4.2885426897308e-06 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 5.9029820135497e-06 (GeV) +Cell[15,19] 0.00051099891 [GeV] +Cell[14,40] 0.040616326105327 [GeV] +Cell[15,40] 0.2754737851918 [GeV] +Cell[14,41] 0.00761720962789 [GeV] +Cell[15,41] 0.070699748596749 [GeV] +Cell[16,40] 0.0069342802828883 [GeV] +Cell[14,39] 0.00039725465411453 [GeV] +Cell[16,46] 0.0028951982048695 [GeV] +Cell[15,42] 0.00069694304690158 [GeV] +Cell[18,12] 0.00066620177445481 [GeV] +### Total energy deposition in calorimeter by a source track in 10 cells : 0.406507946395 (GeV) -Source track ID 1288 (gamma,0.23940053141976[GeV]) at (-378.30991345997,-326.9275292445,1067.9855878407) +Source track ID 1398 (pi-,0.22444316533953[GeV]) at (322.10596142016,382.42352126614,-1273.7128150604) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[15,32] 0.00092549009182832 [GeV] -Cell[15,30] 0.00044100110377116 [GeV] -Cell[16,29] 0.0026488601338689 [GeV] -Cell[12,40] 0.0023677857397798 [GeV] -Cell[15,28] 0.003831873660345 [GeV] -Cell[15,29] 0.22664668536908 [GeV] -Cell[14,29] 0.0025388353210867 [GeV] -### Total energy deposition in calorimeter by a source track in 7 cells : 0.23940053141976 (GeV) +Cell[3,6] 0.17599170824816 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.17599170824816 (GeV) -Source track ID 1059 (gamma,0.41164872010706[GeV]) at (-456.42208718711,204.15405537917,168.67819602614) +Source track ID 1399 (pi+,1.0810413915747[GeV]) at (389.64192256543,-313.33555843459,506.03961338007) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[11,21] 0.0017812486901363 [GeV] -Cell[12,17] 0.0039975052278963 [GeV] -Cell[11,24] 0.00011452959440955 [GeV] -Cell[12,20] 0.0031505578103333 [GeV] -Cell[11,20] 0.012832000483288 [GeV] -Cell[10,20] 0.37675748914068 [GeV] -Cell[11,19] 0.00051099891 [GeV] -Cell[9,47] 0.00182321728685 [GeV] -Cell[10,21] 0.0086436379455888 [GeV] -Cell[11,47] 0.00033985097838971 [GeV] -Cell[10,22] 0.0001677893317541 [GeV] -### Total energy deposition in calorimeter by a source track in 11 cells : 0.41011882539932 (GeV) +Cell[8,8] 8.680197907961e-05 [GeV] +Cell[8,11] 0.0010172726932048 [GeV] +Cell[8,7] 1.059002202237e-05 [GeV] +Cell[10,27] 0.00074541859689475 [GeV] +Cell[9,21] 4.347574152996e-05 [GeV] +Cell[13,27] 0.0001430007661229 [GeV] +Cell[13,32] 1.0359004198108e-05 [GeV] +Cell[17,32] 1.2249839755896e-08 [GeV] +Cell[16,30] 3.7744448854937e-07 [GeV] +Cell[14,43] 0.0016733584794263 [GeV] +Cell[13,26] 0.0037665816991113 [GeV] +Cell[12,26] 2.1511679777177e-05 [GeV] +Cell[13,28] 0.0029192104996907 [GeV] +Cell[12,27] 0.001896214834696 [GeV] +Cell[14,45] 3.3252608773182e-08 [GeV] +Cell[13,39] 1.0634792539236e-05 [GeV] +Cell[12,15] 0.00039063267408778 [GeV] +Cell[10,24] 5.0446833483875e-09 [GeV] +Cell[10,23] 1.9204178693144e-06 [GeV] +Cell[14,44] 1.1651415051006e-05 [GeV] +Cell[13,41] 0.0064865151146468 [GeV] +Cell[7,34] 0.00012602632639755 [GeV] +Cell[8,33] 0.00083298998855912 [GeV] +Cell[8,31] 0.00026281228652988 [GeV] +Cell[15,19] 9.0469503650183e-05 [GeV] +Cell[16,19] 4.2564916308038e-05 [GeV] +Cell[8,34] 0.00063805988850891 [GeV] +Cell[11,40] 9.9072744944579e-05 [GeV] +Cell[13,38] 0.0039122805547663 [GeV] +Cell[10,26] 0.00023003738051318 [GeV] +Cell[11,39] 9.2152022995606e-05 [GeV] +Cell[12,44] 0.0042513732244606 [GeV] +Cell[12,45] 6.906385367416e-05 [GeV] +Cell[12,37] 0.0069291635547834 [GeV] +Cell[13,43] 0.010523986829295 [GeV] +Cell[13,44] 0.0044425007000556 [GeV] +Cell[14,40] 0.0017840471622548 [GeV] +Cell[14,41] 0.0071312542482676 [GeV] +Cell[15,41] 1.916821863847e-05 [GeV] +Cell[13,35] 0.0018427807013179 [GeV] +Cell[13,36] 0.0072033821495395 [GeV] +Cell[11,38] 0.00022079117508849 [GeV] +Cell[12,25] 0.0025911906621146 [GeV] +Cell[13,37] 0.047876825627501 [GeV] +Cell[14,20] 0.00021433362550079 [GeV] +Cell[14,19] 0.00034342103684924 [GeV] +Cell[16,6] 0.0089656444899359 [GeV] +Cell[12,46] 1.3917373726144e-05 [GeV] +Cell[16,29] 6.8030549516607e-07 [GeV] +Cell[11,42] 7.0838551400243e-05 [GeV] +Cell[9,14] 7.1037123097994e-07 [GeV] +Cell[12,5] 4.3921000906266e-07 [GeV] +Cell[12,41] 0.007399717344975 [GeV] +Cell[12,40] 0.0011484066456322 [GeV] +Cell[11,43] 0.00016038906683309 [GeV] +Cell[12,42] 0.4002871757415 [GeV] +Cell[13,46] 5.0992263936678e-08 [GeV] +Cell[14,36] 0.0024600852117197 [GeV] +Cell[15,0] 1.1384901357815e-05 [GeV] +Cell[17,33] 0.00091310853742143 [GeV] +Cell[13,45] 0.000733453313521 [GeV] +Cell[15,29] 7.2166440077126e-09 [GeV] +Cell[12,43] 0.017494338516164 [GeV] +Cell[13,42] 0.0058642135158335 [GeV] +Cell[10,5] 8.2216236914974e-06 [GeV] +Cell[13,40] 2.7257152877155e-05 [GeV] +Cell[15,11] 2.5386795792656e-05 [GeV] +Cell[11,15] 0.00022844593454454 [GeV] +Cell[14,38] 0.0019239486764801 [GeV] +Cell[12,6] 1.3147957390174e-05 [GeV] +Cell[14,35] 0.00042496671927427 [GeV] +Cell[14,37] 0.0023098986887417 [GeV] +Cell[17,35] 0.00023237051131287 [GeV] +Cell[17,34] 0.00012853991094516 [GeV] +Cell[16,34] 0.00036310654036492 [GeV] +Cell[14,18] 5.4574630630668e-06 [GeV] +Cell[11,19] 0.0023243908088035 [GeV] +Cell[15,6] 1.1839758137739e-06 [GeV] +Cell[16,33] 7.6622174237855e-06 [GeV] +Cell[14,42] 9.0490077511959e-05 [GeV] +Cell[16,5] 0.001976503735877 [GeV] +Cell[11,20] 2.6568352904064e-05 [GeV] +Cell[8,16] 0.00073862345512828 [GeV] +Cell[9,22] 0.00099582108210382 [GeV] +Cell[15,20] 3.3942725276574e-06 [GeV] +Cell[15,5] 1.4407069337267e-05 [GeV] +Cell[15,22] 5.7535004452802e-06 [GeV] +Cell[15,47] 1.0952976241242e-05 [GeV] +Cell[11,16] 8.3871486822318e-10 [GeV] +Cell[9,15] 2.2329010497515e-06 [GeV] +Cell[8,14] 4.2272829979311e-06 [GeV] +Cell[12,19] 9.5276446120351e-07 [GeV] +Cell[8,15] 0.0050592346156263 [GeV] +Cell[9,17] 2.5805765389578e-05 [GeV] +Cell[8,17] 0.0022233301100278 [GeV] +Cell[9,18] 3.2571892120359e-08 [GeV] +Cell[15,10] 0.0026809789870495 [GeV] +### Total energy deposition in calorimeter by a source track in 97 cells : 0.58841318342555 (GeV) -Source track ID 1065 (gamma,0.002668280524687[GeV]) at (-370.31613043327,335.95529991493,-37.160387452246) +Source track ID 1396 (gamma,0.028595474656773[GeV]) at (328.18598608029,377.21871446219,-300.64102316435) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,18] 0.002668280524687 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.002668280524687 (GeV) +Cell[8,6] 0.027854001350287 [GeV] +Cell[8,5] 0.00074147330648574 [GeV] +### Total energy deposition in calorimeter by a source track in 2 cells : 0.028595474656773 (GeV) -Source track ID 1066 (gamma,0.047228206518042[GeV]) at (-371.36391353266,334.7967200044,-37.03723867487) +Source track ID 1397 (gamma,0.46372847760985[GeV]) at (-465.99474907509,181.24263801447,-913.38295181026) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,19] 0.0058548402885405 [GeV] -Cell[9,18] 0.036478136229637 [GeV] -### Total energy deposition in calorimeter by a source track in 2 cells : 0.042332976518178 (GeV) +Cell[5,35] 0.00050953145403952 [GeV] +Cell[9,43] 0.0035805270345938 [GeV] +Cell[4,30] 0.0013517079849142 [GeV] +Cell[8,2] 0.00055012829402719 [GeV] +Cell[4,21] 0.042919801185251 [GeV] +Cell[1,39] 0.00046554575810051 [GeV] +Cell[4,23] 0.00060213189402128 [GeV] +Cell[4,22] 0.0014628327135358 [GeV] +Cell[4,14] 0.0017743760121126 [GeV] +Cell[2,32] 0.0010267542285575 [GeV] +Cell[5,20] 0.015931864644338 [GeV] +Cell[5,22] 0.0013519505672294 [GeV] +Cell[2,27] 0.00042872610726764 [GeV] +Cell[5,21] 0.39130789878604 [GeV] +Cell[6,27] 0.00046470094581851 [GeV] +### Total energy deposition in calorimeter by a source track in 15 cells : 0.46372847760985 (GeV) -Source track ID 1069 (gamma,6.9879294615368e-05[GeV]) at (-372.07712488329,334.0039118612,-56.591349451823) +Source track ID 1394 (gamma,0.21067608644927[GeV]) at (-247.62061579186,-434.37775108177,-1046.3393928474) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,18] 6.9879294615368e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 6.9879294615368e-05 (GeV) +Cell[6,10] 0.00037112146244669 [GeV] +Cell[9,7] 0.00014345191749906 [GeV] +Cell[4,8] 0.00051099891 [GeV] +Cell[4,9] 0.00051099891 [GeV] +Cell[4,16] 0.0022560779445062 [GeV] +Cell[4,31] 0.014871701376993 [GeV] +Cell[4,6] 0.00032443719931905 [GeV] +Cell[5,2] 0.00039859145081437 [GeV] +Cell[4,32] 0.18656119710599 [GeV] +Cell[2,17] 0.0016150277868166 [GeV] +### Total energy deposition in calorimeter by a source track in 10 cells : 0.20756360406438 (GeV) -Source track ID 1070 (gamma,0.00025373940538694[GeV]) at (-363.5144605003,343.30341828647,-101.95739713303) +Source track ID 1392 (gamma,0.06726801612498[GeV]) at (-461.11391336902,-193.32345666656,-562.35064332244) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,18] 0.00025373940538694 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00025373940538694 (GeV) +Cell[8,9] 0.0004886368808159 [GeV] +Cell[6,26] 0.0015259356041188 [GeV] +Cell[7,27] 0.047657254494239 [GeV] +Cell[6,45] 0.0004148983667663 [GeV] +Cell[7,26] 0.0014429571137356 [GeV] +Cell[7,38] 0.00053231316151068 [GeV] +Cell[6,27] 0.015206020503844 [GeV] +### Total energy deposition in calorimeter by a source track in 7 cells : 0.06726801612503 (GeV) -Source track ID 1074 (gamma,0.00090085691783976[GeV]) at (-321.38414793284,383.03032446202,-124.66527318523) +Source track ID 1393 (gamma,1.2213291054873[GeV]) at (-495.81010294645,64.593666997899,-1525.287124143) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,17] 0.00090085691783976 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00090085691783976 (GeV) +Cell[7,8] 0.00051099891 [GeV] +Cell[7,45] 0.00051099891 [GeV] +Cell[4,9] 0.0017767992759265 [GeV] +Cell[1,21] 0.002717697085608 [GeV] +Cell[1,46] 0.00051099891 [GeV] +Cell[0,4] 0.00078737217078756 [GeV] +Cell[0,8] 7.9941323693818e-05 [GeV] +Cell[1,4] 0.00048074164917907 [GeV] +Cell[1,22] 0.025076607099192 [GeV] +Cell[0,13] 0.00077649660516651 [GeV] +Cell[0,12] 0.0016250307263139 [GeV] +Cell[0,9] 0.00072255347501011 [GeV] +Cell[2,22] 0.57249755948023 [GeV] +Cell[2,45] 0.00013335710685744 [GeV] +Cell[2,23] 0.52477907884969 [GeV] +Cell[2,2] 0.00051099891 [GeV] +Cell[1,28] 0.00051099891 [GeV] +Cell[2,26] 0.0027253689149308 [GeV] +Cell[2,24] 0.0030074207663055 [GeV] +Cell[2,29] 0.00051099891 [GeV] +Cell[2,38] 0.0003611867675175 [GeV] +Cell[1,23] 0.027065565796879 [GeV] +Cell[1,24] 0.0023453087542823 [GeV] +Cell[1,30] 0.00059094966217112 [GeV] +Cell[2,18] 0.0019768804074102 [GeV] +Cell[2,13] 0.00051099891 [GeV] +### Total energy deposition in calorimeter by a source track in 26 cells : 1.1731029082872 (GeV) -Source track ID 1075 (gamma,0.00023827884498555[GeV]) at (-347.52263160245,359.4829905908,-133.00950430301) +Source track ID 91 (pi-,0.25912129694877[GeV]) at (498.75433374597,35.272008301347,-1484.8769172826) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,17] 0.00023827884498555 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00023827884498555 (GeV) +Cell[3,4] 0.0011505453898814 [GeV] +Cell[3,5] 0.00057564036119481 [GeV] +Cell[2,15] 0.0082985956979791 [GeV] +Cell[4,5] 1.3916951575084e-05 [GeV] +Cell[2,1] 0.00046132348522883 [GeV] +Cell[2,5] 1.8054128980111e-05 [GeV] +Cell[3,0] 9.0022907256753e-06 [GeV] +Cell[2,3] 0.00033118246161359 [GeV] +Cell[2,2] 0.00054052520334187 [GeV] +Cell[2,0] 0.19021748392639 [GeV] +Cell[2,40] 2.985314061516e-05 [GeV] +### Total energy deposition in calorimeter by a source track in 11 cells : 0.20164612303752 (GeV) -Source track ID 1078 (gamma,0.00028122281857773[GeV]) at (232.108597264,442.86069940348,-189.06225916058) +Source track ID 95 (gamma,0.0043312571612404[GeV]) at (-2319.9672603558,920.1972257551,-2000) Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,8] 0.00028122281857773 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00028122281857773 (GeV) - -Source track ID 1079 (gamma,0.00039031275062622[GeV]) at (212.97091197632,452.37527634915,482.35611495151) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[12,8] 0.00039031275062622 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00039031275062622 (GeV) - -Source track ID 1081 (gamma,4.751919006275e-05[GeV]) at (-355.68311096495,351.41076331595,-97.710136648059) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,18] 4.751919006275e-05 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 4.751919006275e-05 (GeV) - -Source track ID 1084 (gamma,0.0002638026157505[GeV]) at (-409.55563054196,286.81733819869,-124.45441955085) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,19] 0.0002638026157505 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.0002638026157505 (GeV) - -Source track ID 1063 (gamma,0.00087703767272447[GeV]) at (-370.11683163474,336.1748517374,-37.611079101537) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,18] 0.00087703767272447 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00087703767272447 (GeV) - -Source track ID 1064 (gamma,0.00022855302488016[GeV]) at (-369.8297046876,336.49069753959,-37.204038595101) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,18] 0.00022855302488016 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00022855302488016 (GeV) - -Source track ID 1062 (e+,0.091001877938387[GeV]) at (-361.86570544302,345.04088340982,-37.826324227368) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[10,6] 0.00029180040618578 [GeV] -Cell[9,32] 0.00011679248760089 [GeV] -Cell[10,19] 0.0025705481590987 [GeV] -Cell[10,18] 0.0069165393706035 [GeV] -Cell[9,18] 0.068994521880011 [GeV] -Cell[9,17] 0.012150369781065 [GeV] -### Total energy deposition in calorimeter by a source track in 6 cells : 0.091040572084565 (GeV) - -Source track ID 1058 (gamma,0.41324573943274[GeV]) at (303.44001238969,-397.39672731534,976.47730315274) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[11,5] 0.00090782335704494 [GeV] -Cell[13,10] 0.00051099891 [GeV] -Cell[14,40] 0.12605241595795 [GeV] -Cell[15,40] 0.20957736095212 [GeV] -Cell[15,41] 0.056620036401652 [GeV] -Cell[14,7] 0.0015312921830096 [GeV] -Cell[14,41] 0.018045811670966 [GeV] -### Total energy deposition in calorimeter by a source track in 7 cells : 0.41324573943274 (GeV) - -Source track ID 1045 (neutron,1.0430453879836[GeV]) at (-304.525867717,396.56524796206,33.413986643443) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[9,11] 1.1814237404906e-07 [GeV] -Cell[9,12] 0.00065549083207679 [GeV] -Cell[12,32] 0.001299133102549 [GeV] -Cell[13,32] 2.0445658243261e-05 [GeV] -Cell[12,31] 4.1236915819809e-06 [GeV] -Cell[9,16] 0.0024835722154135 [GeV] -Cell[10,12] 9.9651515483856e-10 [GeV] -Cell[10,17] 0.0069620744428413 [GeV] -Cell[11,18] 0.0031615528158713 [GeV] -Cell[10,14] 0.002618758131871 [GeV] -Cell[11,15] 3.7158755352948e-05 [GeV] -Cell[12,15] 3.0714640161023e-08 [GeV] -Cell[9,14] 1.6157597089659e-05 [GeV] -Cell[10,15] 0.0035643430759827 [GeV] -Cell[11,16] 0.013857228538035 [GeV] -Cell[10,18] 5.5934615715387e-05 [GeV] -Cell[9,15] 0.0033732928469768 [GeV] -Cell[9,17] 0.0002356894169909 [GeV] -Cell[10,13] 2.5545056414558e-05 [GeV] -Cell[10,16] 0.012880176725174 [GeV] -### Total energy deposition in calorimeter by a source track in 20 cells : 0.051250827371709 (GeV) - -Source track ID 1046 (neutron,1.0138225390163[GeV]) at (487.499632616,111.10404222738,-1652.4146451406) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[3,13] 0.0013645833238292 [GeV] -Cell[1,44] 3.30408992304e-05 [GeV] -Cell[5,28] 0.00033708714205056 [GeV] -Cell[2,25] 0.00085282011966499 [GeV] -Cell[4,28] 3.2009429414757e-06 [GeV] -Cell[0,1] 1.3222535168097e-05 [GeV] -Cell[4,31] 2.4391923899429e-06 [GeV] -Cell[1,1] 0.018827524046639 [GeV] -Cell[0,2] 1.1910902103409e-05 [GeV] -Cell[2,44] 0.0032350739823505 [GeV] -Cell[4,27] 1.4057974447496e-05 [GeV] -Cell[1,0] 0.00329712276557 [GeV] -Cell[0,0] 1.2556291613919e-06 [GeV] -Cell[1,2] 0.0025624583316111 [GeV] -Cell[3,14] 3.1436268886978e-05 [GeV] -Cell[4,30] 7.143136463128e-08 [GeV] -Cell[4,29] 0.00098655492870614 [GeV] -Cell[0,3] 0.00033632973847057 [GeV] -### Total energy deposition in calorimeter by a source track in 18 cells : 0.031910190154586 (GeV) - -Source track ID 1048 (neutron,0.94197111698454[GeV]) at (-417.27526435956,-275.46570340726,-430.73705619877) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[7,29] 0.0016529189818009 [GeV] -Cell[7,28] 0.00073724725581815 [GeV] -Cell[3,37] 2.1852044676507e-07 [GeV] -Cell[4,36] 1.5368091973528e-05 [GeV] -Cell[3,36] 4.1141013298329e-09 [GeV] -### Total energy deposition in calorimeter by a source track in 5 cells : 0.0024057569641407 (GeV) - -Source track ID 1049 (gamma,0.00055749678750891[GeV]) at (-317.89359735668,385.93219710155,-1067.6843282631) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[4,17] 0.00055749678750891 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.00055749678750891 (GeV) - -Source track ID 1028 (pi+,1.0810849811086[GeV]) at (389.50074984128,-313.51102990657,505.69052558703) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[8,19] 1.2703306356343e-07 [GeV] -Cell[14,30] 1.976977398499e-07 [GeV] -Cell[8,15] 1.1516672543621e-08 [GeV] -Cell[14,31] 1.8857535906136e-09 [GeV] -Cell[12,31] 7.9890421795881e-07 [GeV] -Cell[13,27] 0.003525890857108 [GeV] -Cell[13,28] 9.1875463419456e-05 [GeV] -Cell[12,29] 0.00014046391205193 [GeV] -Cell[12,40] 0.0058420052573913 [GeV] -Cell[13,40] 0.00041014113503343 [GeV] -Cell[12,39] 1.0740010911832e-05 [GeV] -Cell[13,39] 0.0011347332846379 [GeV] -Cell[14,18] 2.8302019927651e-09 [GeV] -Cell[12,30] 0.00099245955281924 [GeV] -Cell[13,30] 2.1197221940383e-08 [GeV] -Cell[7,21] 5.259871886301e-05 [GeV] -Cell[13,45] 0.00071341697198704 [GeV] -Cell[11,44] 3.2387615647167e-09 [GeV] -Cell[12,44] 0.0064776632542998 [GeV] -Cell[12,45] 2.443833896541e-05 [GeV] -Cell[13,44] 6.2931595869031e-07 [GeV] -Cell[13,43] 0.096016825962152 [GeV] -Cell[13,42] 0.0089463057409177 [GeV] -Cell[13,41] 0.022520504956609 [GeV] -Cell[12,43] 0.19347604330068 [GeV] -Cell[12,4] 0.096208951545134 [GeV] -Cell[11,45] 1.6643479933805e-05 [GeV] -Cell[11,41] 4.725466965283e-09 [GeV] -Cell[12,42] 0.35048069330316 [GeV] -Cell[7,20] 1.1476867628517e-05 [GeV] -Cell[14,41] 1.1273970017101e-08 [GeV] -Cell[12,41] 0.0079069487938644 [GeV] -Cell[7,19] 0.00017336198841633 [GeV] -Cell[9,14] 0.00054118505956319 [GeV] -Cell[9,15] 3.8843544939482e-07 [GeV] -Cell[8,14] 3.6292476579547e-11 [GeV] -Cell[18,15] 0.0016582123225425 [GeV] -### Total energy deposition in calorimeter by a source track in 37 cells : 0.79737577816886 (GeV) - -Source track ID 1025 (gamma,0.028595474656773[GeV]) at (328.18596657903,377.21873142858,-300.64107892844) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[8,6] 0.028595474656773 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.028595474656773 (GeV) - -Source track ID 1026 (gamma,0.46372847760985[GeV]) at (-465.99474804388,181.24264066582,-913.38295549595) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[1,45] 0.00092101152186914 [GeV] -Cell[6,11] 0.00027917614939123 [GeV] -Cell[5,22] 0.0021842055561344 [GeV] -Cell[5,20] 0.021371618181018 [GeV] -Cell[1,42] 0.00051099891 [GeV] -Cell[3,4] 0.00024974507061085 [GeV] -Cell[3,20] 0.0024038068535416 [GeV] -Cell[4,21] 0.063286425348964 [GeV] -Cell[4,20] 0.0017447682246365 [GeV] -Cell[5,21] 0.36872207926216 [GeV] -### Total energy deposition in calorimeter by a source track in 10 cells : 0.46167383507832 (GeV) - -Source track ID 1023 (gamma,0.21067608644927[GeV]) at (-247.62061594019,-434.37775099721,-1046.3393947538) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[8,46] 0.00059837062615568 [GeV] -Cell[4,32] 0.18832940294016 [GeV] -Cell[5,1] 0.0011409337557265 [GeV] -Cell[4,31] 0.019983060094423 [GeV] -Cell[4,0] 0.00062431903279818 [GeV] -### Total energy deposition in calorimeter by a source track in 5 cells : 0.21067608644927 (GeV) - -Source track ID 1021 (gamma,0.06726801612498[GeV]) at (-461.11393189451,-193.32341247967,-562.35084146085) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[7,27] 0.031632383947628 [GeV] -Cell[1,0] 0.00051099891 [GeV] -Cell[6,27] 0.0011434685871097 [GeV] -Cell[6,26] 0.00075375829340859 [GeV] -Cell[7,26] 0.033227406386833 [GeV] -### Total energy deposition in calorimeter by a source track in 5 cells : 0.06726801612498 (GeV) - -Source track ID 1022 (gamma,1.2213291054873[GeV]) at (-495.81010367367,64.593661415869,-1525.287107199) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[3,9] 0.00086954958975896 [GeV] -Cell[1,22] 0.15807513848062 [GeV] -Cell[1,24] 0.0037029895497519 [GeV] -Cell[1,42] 0.0010988907639948 [GeV] -Cell[1,21] 0.00051099891 [GeV] -Cell[1,23] 0.25638493659935 [GeV] -Cell[2,22] 0.20198359737292 [GeV] -Cell[2,21] 0.00047481488524407 [GeV] -Cell[4,0] 0.00057753772551546 [GeV] -Cell[0,11] 0.00051099891 [GeV] -Cell[2,20] 0.00028334335672411 [GeV] -Cell[2,23] 0.58309258381859 [GeV] -Cell[1,0] 0.00039315522143596 [GeV] -Cell[2,24] 3.1180548412965e-06 [GeV] -Cell[1,11] 0.0028009594401743 [GeV] -Cell[2,6] 0.00054870639728918 [GeV] -Cell[0,46] 0.0017428371126482 [GeV] -Cell[1,32] 0.0011543011518482 [GeV] -### Total energy deposition in calorimeter by a source track in 18 cells : 1.2142084573407 (GeV) - -Source track ID 95 (gamma,0.005521493256262[GeV]) at (-494.1335470829,-76.367778855162,-1984.6479199657) -Original primary track ID 43 (unknown,52.984237098069[GeV]) -Cell[0,25] 0.005010494346262 [GeV] -### Total energy deposition in calorimeter by a source track in 1 cells : 0.005010494346262 (GeV) +Cell[0,21] 0.0043312571612404 [GeV] +### Total energy deposition in calorimeter by a source track in 1 cells : 0.0043312571612404 (GeV) >>> Summary of Event 0 Tracker hits -------------------------------------------------------------- -1557 hits are stored in RE01TrackerHitsCollection. +1419 hits are stored in RE01TrackerHitsCollection. Calorimeter hits -------------------------------------------------------------- -922 hits are stored in RE01CalorimeterHitsCollection. - Total energy deposition in calorimeter : 152.48906209252 (GeV) +942 hits are stored in RE01CalorimeterHitsCollection. + Total energy deposition in calorimeter : 148.65196863174 (GeV) Trajectories in tracker -------------------------------------------------------------- diff --git a/examples/extended/runAndEvent/RE02/.README.txt b/examples/extended/runAndEvent/RE02/.README.txt deleted file mode 100644 index 1af2af4477..0000000000 --- a/examples/extended/runAndEvent/RE02/.README.txt +++ /dev/null @@ -1,250 +0,0 @@ - -///\file "runAndEvent/RE02/.README.txt" -///\brief Example RE02 README page - -/*! \page ExampleRE02 Example RE02 - - This example simulates a simplified water phantom measurement - in medical application with demonstration of primitive scorers. - This example also demonstrates nested parameterised volume which - realizes segmented boxes using a combination of replicated volumes - and a parameterised volume. - - ---- (Tips) - - This example creates 100 x 100 x 200 boxes using Nested Parameterised - Volume for realistic situation of medical application. - This is very memory consumption if normal Parameterised Volume is used, - and needs roughly more than 1 GB memory for execution. However, - NestedParameterised volume effectively works to reduce the memory consumption, - and it only needs less than 100 MB memory for execution. - -\section RE02_s1- GEOMETRY DEFINITION - - The setup contains a water phantom as target by default. The world volume - is 200 cm x 200 cm x 200 cm box filled with air. The water phantom is box shape - and the size of 200 mm x 200 mm x 400 mm. The volume of water phantom is divided - into 100 x 100 x 1 towers using replicated volume,(RE02DetectorConstruction), - and then those towers are segmented into 200 boxes with respect to z axis - using nested parameterized volume,(RE02NestedPhantomParameterisation). - e.g. The volume of water phantom is divided into 100 x 100 x 200 boxes, - and a voxel size is 2.0 mm x 2.0 mm x 2.0 mm. - - For demonstration purpose of the nested parameterised volume, - (RE02NestedPhantomParameterisation), materials are assigned as water (lead) - in even (odd) order segments, alternately. - The simulation for homogeneous water phantom is also possible using an option. - - ---- Tips(1) - - If you want to reduce number of segments of water phantom, - please change following numbers which represent number of segments - in x, y, z axis, respectively.The following code can be found in - exampleRE02.cc. -\verbatim - RE02DetectorConstruction* detector = new RE02DetectorConstruction; - detector->SetNumberOfSegmentsInPhantom(100,100,200); - Nx, Ny, Nz -\endverbatim - ---- Tips(2) - - If you want to set all materials to water, - please use the following method. The following code can be found in - exampleRE02.cc. -\verbatim - detector->SetLeadSegment(FALSE); // Homogeneous water phantom - -\endverbatim - - The geometry and sensitive detector are constructed in - RE02DetectorConstruction class. - (See \ref RE02_s4 "SCORER " for detail descriptions about sensitive detector.) - -\section RE02_s2 PHYSICS LIST - - The particle's type and the physic processes which is available - in this example are set in PhysicsList class. - - The PhysicsList is originally copied from extended example, - (example/extended/analysis/A01). - Full set of particles (baryons, bosons and mesons) are created, and - Standard EM Physics and Low/High Energy parameterized models - for hadrons are applied. The detail description will be found in - example/extended/analysis/A01/README. - Specially, the PhysicsList was modified in this example, - to use Binary cascade model for hadron physics at low energy (<4GeV) - and inelastic process for generic ions with BinaryLightIonReaction. - The data files for physics processes have to be assigned using - environment variables. - - RE02PhysicsList is optimized for robustness and is not optimized for - any particular cases. If you will do precise calculation for your - use-case, please consider utilizing hadronic_lists, and defines the - production cut properly. - The default CutValue defines the production threshold of secondary - particles (mainly Ionisation and Bremsstrahlung processes are - concerned by this CutValue). - -\section RE02_s3 RUNS and EVENTS - -\subsection RE02_s31 Primary particles - - The primary kinematics consists of a single particle which hits the - target perpendicular to the input face. The default type of the particle - and its energy are set in the RE02PrimaryGeneratorAction class. - However it can be changed via the G4 build-in commands of ParticleGun - class. - The RE02PrimaryGeneratorAction class introduces a beam spot size - that makes initial particle position of x,y randomized using a Gaussian - random function, where the center position is fixed to (0,0). - The standard deviation of the beam spot size is given in - RE02PrimaryGeneratorAction as 10 mm. - - \subsection RE02_s32 Event - - An EVENT represents a simulation of one primary particle. - A RUN is a set of events. - - The user has control: - - at Begin and End of each run (class RunAction) - - at Begin and End of each event (class EventAction) - - at Begin and End of each track (class TrackingAction, not used here) - - at End of each step (class SteppingAction, not used here) - -\section RE02_s4 SCORER - -\subsection RE02_s41 Concrete Scorer - - This example introduces concrete primitive scorer (PS) and filter - classes for easy scoring. Those primitive scorers are registered to - MultiFunctionalDetector which is a concrete class of sensitive - detector(SD). Then the MultiFunctionalDetector is attached to - the logical volume of sensitive geometry. - A MultiFunctionalDetector, PrimitiveScorers, and SDFilters are - created and assigned to the logical volume of water phantom in - DetectorConstruction. - - A primitive scorer can score one kind of physical quantity, and - creates one hits collection per event. The quantity is collected in - G4THitsMap with the copy number of geometry. Here collection name is - given as "MultiFunctionalDetector Name"/"PrimitiveScorer Name". - A primitive scorer can have one filter (SDFilter) for selecting hits - to be used for the quantity. - - Since the geometry is constructed using nested parameterisation, - the copy number of geometry is defined as follows, -\verbatim - copy number of geometry = iy*Nx*Ny+ix*Nz+iz, -\endverbatim - - where Nx,Ny,Nz is total number of segmentation in x, y, and z axis,respectively, - and ix,iy,iz is a copy number of the mother volume, the grand mother volume, - and this volume, respectively. - This conversion is described in GetIndex() method in PrimitiveScorer. - - \subsection RE02_s42 The physical quantities scored in this example are: - - - Total energy deposit \n - - unit: Energy, collName: totalEDep - - Energy deposit by protons \n - - unit: Energy, collName: protonEDep - - Number of steps of protons \n - - unit: - , collName: protonNStep - - Cell Flux of charged tracks which pass through the geometry\n - - unit: Length/Volume, collName: chargedPassCellFlux - - Cell Flux of all charged tracks\n - - unit: Length/Volume, collName: chargedCellFlux - - Flux of charged particle at -Z surface of the BOX geometry, - where incident angle at the surface is taken into account.\n - - unit: Surface^(-1), collName: chargedSurfFlux - - Surface current of gamma at -Z surface of the BOX geometry. - The energy of gammas are from 1. keV to 10. keV. - The incident angle is not taken into account.\n - - unit: Surface^(-1), collName: gammaSurfCurr000 - - Same as previous one, but different energy bin. - The energy of gammas are from 10. keV to 100. keV.\n - - unit: Surface^(-1), collName: gammaSurfCurr001 - - Same as previous one, but different energy bin. - The energy of gammas are from 100. keV to 1. MeV. \n - - unit: Surface^(-1), collName: gammaSurfCurr002 - - Same as previous one, except for energy bin. - The energy of gammas are from 1. MeV to 10. MeV. \n - - unit: Surface^(-1), collName: gammaSurfCurr003 - -\subsection RE02_s43 Accumulating quantities during a RUN - - A PrimitiveScorer creates one hits collection per event. - The physical quantity in the hits collection need to be accumulated - into another G4THitsMap object during a RUN, in order to obtain - integrated flux or dose in a RUN. The accumulation of quantities - are done at RE02Run class. - - RE02Run class can automatically generate G4THitsMap objects for a RUN, - and accumulate physical quantities of an event into it. The accumulation - is done at RE02Run::RecordEvent(G4Event* aEvent). - - \subsection RE02_s44 Generate a Run object, and print results - - The RE02Run object is generated at RE02RunAction::GenerateRun(). - The accumulated physical quantities are printed at the end of RUN - ( RE02RunAction::EndOfEvent() ). This example prints only selected - physical quantities. - - -\section RE02_s5 VISUALIZATION - - The Visualization Manager is set in the main () (see RE02.cc). - The initialization of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main when running in interactive mode. - - The tracks are automatically drawn at the end of event and erased at - the beginning of the next run. - - The visualization (with OpenGL driver) assumes two things: - -# the visualization & interfaces categories have been compiled - with the environment variable G4VIS_BUILD_OPENGLX_DRIVER. - -# exampleRE02.cc has been compiled with G4VIS_USE_OPENGLX. - - (The same with DAWNFILE instead of OPENGLX) - - -\section RE02_s6 USER INTERFACES - - The default command interface, called G4UIterminal, is done via - standard G4cin/G4cout. - On Linux and Sun-cc on can use a smarter command interface G4UItcsh. - It is enough to set the environment variable G4UI_USE_TCSH before - compiling exampleRE02.cc - - - \section RE02_s7 HOW TO START ? - - - Execute RE02 in 'batch' mode from macro files (without visualization) -\verbatim -% exampleRE02 run1.mac -\endverbatim - - - Execute RE02 in 'interactive mode' with visualization -\verbatim -% exampleRE02 -.... -Idle> type your commands. For instance: -Idle> /run/beamOn 10 -.... -Idle> /control/execute run2.mac -.... -Idle> exit -\endverbatim - - - Macros are for different primary particles. - - vis.mac : 200 MeV proton with visualization - - run1.mac : 150 MeV proton - - run2.mac : 195 MeV/u Carbon ion - - run3.mac : 30 MeV electron - - run4.mac : 60 keV gamma - -*/ - - - diff --git a/examples/extended/runAndEvent/RE02/CMakeLists.txt b/examples/extended/runAndEvent/RE02/CMakeLists.txt index e4a6fbd493..00d8d0035f 100644 --- a/examples/extended/runAndEvent/RE02/CMakeLists.txt +++ b/examples/extended/runAndEvent/RE02/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(RE02) #---------------------------------------------------------------------------- diff --git a/examples/extended/runAndEvent/RE02/README b/examples/extended/runAndEvent/RE02/README deleted file mode 100644 index adf5808e17..0000000000 --- a/examples/extended/runAndEvent/RE02/README +++ /dev/null @@ -1,238 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - ExampleRE02 - ----------- - - - This example simulates a simplified water phantom measurement - in medical application with demonstration of primitive scorers. - This example also demonstrates nested parameterised volume which - realizes segmented boxes using a combination of replicated volumes - and a parameterised volume. - - (Tips) - This example creates 100 x 100 x 200 boxes using Nested Parameterised - Volume for realistic situation of medical application. - This is very memory consumption if normal Parameterised Volume is used, - and needs roughly more than 1 GB memory for execution. However, - NestedParameterised volume effectively works to reduce the memory consumption, - and it only needs less than 100 MB memory for execution. - - 1- GEOMETRY DEFINITION - - The setup contains a water phantom as target by default. The world volume - is 200 cm x 200 cm x 200 cm box filled with air. The water phantom is box shape - and the size of 200 mm x 200 mm x 400 mm. The volume of water phantom is divided - into 100 x 100 x 1 towers using replicated volume,(RE02DetectorConstruction), - and then those towers are segmented into 200 boxes with respect to z axis - using nested parameterized volume,(RE02NestedPhantomParameterisation). - e.g. The volume of water phantom is divided into 100 x 100 x 200 boxes, - and a voxel size is 2.0 mm x 2.0 mm x 2.0 mm. - - For demonstration purpose of the nested parameterised volume, - (RE02NestedPhantomParameterisation), materials are assigned as water (lead) - in even (odd) order segments, alternately. - The simulation for homogeneous water phantom is also possible using an option. - - ---- Tips(1) - *If you want to reduce number of segments of water phantom, - please change following numbers which represent number of segments - in x, y, z axis, respectively.The following code can be found in - exampleRE02.cc. - - RE02DetectorConstruction* detector = new RE02DetectorConstruction; - detector->SetNumberOfSegmentsInPhantom(100,100,200); - Nx, Ny, Nz - ---- Tips(2) - *If you want to set all materials to water, - please use the following method. The following code can be found in - exampleRE02.cc. - - detector->SetLeadSegment(FALSE); // Homogeneous water phantom - ---- - - The geometry and sensitive detector are constructed in - RE02DetectorConstruction class. - (See "4- SCORER " for detail descriptions about sensitive detector.) - - 2- PHYSICS LIST - - The particle's type and the physic processes which is available - in this example are set in PhysicsList class. - - The PhysicsList is originally copied from extended example, - (example/extended/analysis/A01). - Full set of particles (baryons, bosons and mesons) are created, and - Standard EM Physics and Low/High Energy parameterized models - for hadrons are applied. The detail description will be found in - example/extended/analysis/A01/README. - Specially, the PhysicsList was modified in this example, - to use Binary cascade model for hadron physics at low energy (<4GeV) - and inelastic process for generic ions with BinaryLightIonReaction. - The data files for physics processes have to be assigned using - environment variables. - - RE02PhysicsList is optimized for robustness and is not optimized for - any particular cases. If you will do precise calculation for your - use-case, please consider utilizing hadronic_lists, and defines the - production cut properly. - The default CutValue defines the production threshold of secondary - particles (mainly Ionisation and Bremsstrahlung processes are - concerned by this CutValue). - - 3- RUNS and EVENTS - - - Primary particles. - The primary kinematics consists of a single particle which hits the - target perpendicular to the input face. The default type of the particle - and its energy are set in the RE02PrimaryGeneratorAction class. - However it can be changed via the G4 build-in commands of ParticleGun - class. - The RE02PrimaryGeneratorAction class introduces a beam spot size - that makes initial particle position of x,y randomized using a Gaussian - random function, where the center position is fixed to (0,0). - The standard deviation of the beam spot size is given in - RE02PrimaryGeneratorAction as 10 mm. - - An EVENT represents a simulation of one primary particle. - A RUN is a set of events. - - The user has control: - -at Begin and End of each run (class RunAction) - -at Begin and End of each event (class EventAction) - -at Begin and End of each track (class TrackingAction, not used here) - -at End of each step (class SteppingAction, not used here) - - 4- SCORER - - - Concrete Scorer - This example introduces concrete primitive scorer (PS) and filter - classes for easy scoring. Those primitive scorers are registered to - MultiFunctionalDetector which is a concrete class of sensitive - detector(SD). Then the MultiFunctionalDetector is attached to - the logical volume of sensitive geometry. - A MultiFunctionalDetector, PrimitiveScorers, and SDFilters are - created and assigned to the logical volume of water phantom in - DetectorConstruction. - - A primitive scorer can score one kind of physical quantity, and - creates one hits collection per event. The quantity is collected in - G4THitsMap with the copy number of geometry. Here collection name is - given as /. - A primitive scorer can have one filter (SDFilter) for selecting hits - to be used for the quantity. - - Since the geometry is constructed using nested parameterisation, - the copy number of geometry is defined as follows, - - copy number of geometry = iy*Nx*Ny+ix*Nz+iz, - - where Nx,Ny,Nz is total number of segmentation in x, y, and z axis,respectively, - and ix,iy,iz is a copy number of the mother volume, the grand mother volume, - and this volume, respectively. - This conversion is described in GetIndex() method in PrimitiveScorer. - - The physical quantities scored in this example are: - ---------------------------------------------------- - - Total energy deposit - unit: Energy, collName: totalEDep - - Energy deposit by protons - unit: Energy, collName: protonEDep - - Number of steps of protons - unit: - , collName: protonNStep - - Cell Flux of charged tracks which pass through the geometry - unit: Length/Volume, collName: chargedPassCellFlux - - Cell Flux of all charged tracks - unit: Length/Volume, collName: chargedCellFlux - - Flux of charged particle at -Z surface of the BOX geometry, - where incident angle at the surface is taken into account. - unit: Surface^(-1), collName: chargedSurfFlux - - Surface current of gamma at -Z surface of the BOX geometry. - The energy of gammas are from 1. keV to 10. keV. - The incident angle is not taken into account. - unit: Surface^(-1), collName: gammaSurfCurr000 - - Same as previous one, but different energy bin. - The energy of gammas are from 10. keV to 100. keV. - unit: Surface^(-1), collName: gammaSurfCurr001 - - Same as previous one, but different energy bin. - The energy of gammas are from 100. keV to 1. MeV. - unit: Surface^(-1), collName: gammaSurfCurr002 - - Same as previous one, except for energy bin. - The energy of gammas are from 1. MeV to 10. MeV. - unit: Surface^(-1), collName: gammaSurfCurr003 - ------------------------------------------------- - - - Accumulating quantities during a RUN - A PrimitiveScorer creates one hits collection per event. - The physical quantity in the hits collection need to be accumulated - into another G4THitsMap object during a RUN, in order to obtain - integrated flux or dose in a RUN. The accumulation of quantities - are done at RE02Run class. - - RE02Run class can automatically generate G4THitsMap objects for a RUN, - and accumulate physical quantities of an event into it. The accumulation - is done at RE02Run::RecordEvent(G4Event* aEvent). - - - Generate a Run object, and print results - The RE02Run object is generated at RE02RunAction::GenerateRun(). - The accumulated physical quantities are printed at the end of RUN - ( RE02RunAction::EndOfEvent() ). This example prints only selected - physical quantities. - - - 5- VISUALIZATION - - The Visualization Manager is set in the main(). - The initialization of the drawing is done via a set of /vis/ commands - in the macro vis.mac. This macro is automatically read from - the main when running in interactive mode. - - The tracks are automatically drawn at the end of event and erased at - the beginning of the next run. - - The visualization (with OpenGL driver) assumes two things: - 1- the visualization & interfaces categories have been compiled - with the environment variable G4VIS_BUILD_OPENGLX_DRIVER. - 2- exampleRE02.cc has been compiled with G4VIS_USE_OPENGLX. - - (The same with DAWNFILE instead of OPENGLX) - - - 6- USER INTERFACES - - The default command interface, called G4UIterminal, is done via - standard G4cin/G4cout. - On Linux and Sun-cc on can use a smarter command interface G4UItcsh. - It is enough to set the environment variable G4UI_USE_TCSH before - compiling exampleRE02.cc - - - 7- HOW TO START ? - - - execute RE02 in 'batch' mode from macro files (without visualization) - % exampleRE02 run1.mac - - - execute RE02 in 'interactive mode' with visualization - % exampleRE02 - .... - Idle> type your commands. For instance: - Idle> /run/beamOn 10 - .... - Idle> /control/execute run2.mac - .... - Idle> exit - - - macros are for different primary particles. - vis.mac : 200 MeV proton with visualization - run1.mac : 150 MeV proton - run2.mac : 195 MeV/u Carbon ion - run3.mac : 30 MeV electron - run4.mac : 60 keV gamma - - - - diff --git a/examples/extended/runAndEvent/RE02/run.out b/examples/extended/runAndEvent/RE02/run.out index f961d0960a..fa64589554 100644 --- a/examples/extended/runAndEvent/RE02/run.out +++ b/examples/extended/runAndEvent/RE02/run.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -39,10 +39,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -208,32 +206,99 @@ gamma /gun/direction 0 0 1 # /run/beamOn 10 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -243,25 +308,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -271,29 +336,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -301,31 +366,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -334,12 +399,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -347,12 +412,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -360,31 +425,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -392,31 +457,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -424,31 +489,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -456,32 +521,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -489,32 +554,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -522,31 +587,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -554,27 +619,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -583,18 +648,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: Binary Cascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -602,69 +667,69 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -672,13 +737,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -686,13 +751,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -700,13 +765,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -714,13 +779,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofWithBinaryCascadeCaptureAtRest @@ -728,13 +793,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofWithBinaryCascadeCaptureAtRest @@ -742,13 +807,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -756,62 +821,62 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -819,28 +884,28 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -848,29 +913,29 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -878,27 +943,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: Binary Cascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -906,13 +971,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -935,7 +1000,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -958,21 +1022,21 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_WATER Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.51944 keV e- 276.265 keV e+ 270.751 keV proton 70 keV + Energy thresholds : gamma 2.52562 keV e- 277.64 keV e+ 270.815 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_Pb Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 94.5861 keV e- 1.00386 MeV e+ 951.321 keV proton 70 keV + Energy thresholds : gamma 94.659 keV e- 1.00699 MeV e+ 946.934 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1032,8 +1096,24 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 -3.7 1.18 -188 0.268 0 0 0 PhantomSens initStep - 1 -3.7 1.17 -188 0.145 0.123 0.0848 0.0848 PhantomSens eBrem - 2 -3.7 1.17 -188 0 0.145 0.0492 0.134 PhantomSens eIoni + 1 -3.7 1.17 -188 0.0614 0.0896 0.0849 0.0849 PhantomSens eBrem + 2 -3.7 1.17 -188 0 0.0614 0.0125 0.0973 PhantomSens eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 3, Parent ID = 2 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -3.7 1.17 -188 0.117 0 0 0 PhantomSens initStep + 1 -3.71 1.16 -188 0 0.0158 0.0192 0.0192 PhantomSens phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 3 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -3.71 1.16 -188 0.101 0 0 0 PhantomSens initStep + 1 -3.71 1.16 -188 0 0.101 0.0278 0.0278 PhantomSens eIoni >>> Event 0 ********************************************************************************************************* @@ -1041,26 +1121,19 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.802 -0.701 -1e+03 0.356 0 0 0 World initStep - 1 0.802 -0.701 -200 0.356 0 800 800 PhantomSens Transportation - 2 0.802 -0.701 -200 0.326 0 0.259 800 PhantomSens compt - 3 1.17 -0.983 -199 0 0.0883 0.942 801 PhantomSens phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 1.17 -0.983 -199 0.238 0 0 0 PhantomSens initStep - 1 1.17 -0.982 -199 0 0.238 0.106 0.106 PhantomSens eIoni + 0 -3.66 -0.148 -1e+03 0.356 0 0 0 World initStep + 1 -3.66 -0.148 -200 0.356 0 800 800 PhantomSens Transportation + 2 -3.66 -0.148 -198 0.356 0 2 802 PhantomSens Transportation + 3 -3.66 -0.148 -196 0.356 0 2 804 PhantomSens Transportation + 4 -3.66 -0.148 -196 0 0.0883 0.276 804 PhantomSens phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 0.802 -0.701 -200 0.0298 0 0 0 PhantomSens initStep - 1 0.802 -0.701 -200 0 0.0298 0.00385 0.00385 PhantomSens eIoni + 0 -3.66 -0.148 -196 0.268 0 0 0 PhantomSens initStep + 1 -3.66 -0.149 -196 0 0.268 0.126 0.126 PhantomSens eIoni >>> Event 1 ********************************************************************************************************* @@ -1068,28 +1141,19 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -1.09 -1.74 -1e+03 0.356 0 0 0 World initStep - 1 -1.09 -1.74 -200 0.356 0 800 800 PhantomSens Transportation - 2 -1.09 -1.74 -200 0.335 0 0.385 800 PhantomSens compt - 3 -0.977 -2 -199 0.335 0 0.688 801 PhantomSens Transportation - 4 -0.797 -2.41 -198 0.335 0 1.09 802 PhantomSens Transportation - 5 -0.736 -2.56 -198 0 0.0883 0.373 803 PhantomSens phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -0.736 -2.56 -198 0.247 0 0 0 PhantomSens initStep - 1 -0.731 -2.55 -198 0 0.247 0.112 0.112 PhantomSens eIoni + 0 -1.95 2.7 -1e+03 0.356 0 0 0 World initStep + 1 -1.95 2.7 -200 0.356 0 800 800 PhantomSens Transportation + 2 -1.95 2.7 -199 0 0.0883 0.931 801 PhantomSens phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -1.09 -1.74 -200 0.0211 0 0 0 PhantomSens initStep - 1 -1.09 -1.74 -200 0 0.0211 0.00222 0.00222 PhantomSens eIoni + 0 -1.95 2.7 -199 0.268 0 0 0 PhantomSens initStep + 1 -1.95 2.72 -199 0.231 0.0371 0.0263 0.0263 PhantomSens msc + 2 -1.96 2.74 -199 0.157 0.0731 0.0318 0.0582 PhantomSens msc + 3 -1.96 2.74 -199 0 0.157 0.0563 0.114 PhantomSens eIoni >>> Event 2 ********************************************************************************************************* @@ -1097,19 +1161,28 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 2.4 -2.75 -1e+03 0.356 0 0 0 World initStep - 1 2.4 -2.75 -200 0.356 0 800 800 PhantomSens Transportation - 2 2.4 -2.75 -198 0.356 0 2 802 PhantomSens Transportation - 3 2.4 -2.75 -196 0.356 0 2 804 PhantomSens Transportation - 4 2.4 -2.75 -195 0 0.0883 0.676 805 PhantomSens phot + 0 1.5 -1.32 -1e+03 0.356 0 0 0 World initStep + 1 1.5 -1.32 -200 0.356 0 800 800 PhantomSens Transportation + 2 1.5 -1.32 -198 0.356 0 2 802 PhantomSens Transportation + 3 1.5 -1.32 -196 0.356 0 2 804 PhantomSens Transportation + 4 1.5 -1.32 -196 0.186 0 0.433 804 PhantomSens compt + 5 1.77 -1.06 -196 0 0.0883 0.395 805 PhantomSens phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 1.77 -1.06 -196 0.0975 0 0 0 PhantomSens initStep + 1 1.77 -1.06 -196 0 0.0975 0.0263 0.0263 PhantomSens eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 2.4 -2.75 -195 0.268 0 0 0 PhantomSens initStep - 1 2.4 -2.75 -195 0 0.268 0.126 0.126 PhantomSens eIoni + 0 1.5 -1.32 -196 0.17 0 0 0 PhantomSens initStep + 1 1.5 -1.32 -196 0 0.17 0.0635 0.0635 PhantomSens eIoni >>> Event 3 ********************************************************************************************************* @@ -1117,21 +1190,37 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -2.06 3.75 -1e+03 0.356 0 0 0 World initStep - 1 -2.06 3.75 -200 0.356 0 800 800 PhantomSens Transportation - 2 -2.06 3.75 -199 0 0.00355 0.887 801 PhantomSens phot + 0 0.111 -1.23 -1e+03 0.356 0 0 0 World initStep + 1 0.111 -1.23 -200 0.356 0 800 800 PhantomSens Transportation + 2 0.111 -1.23 -198 0.274 0 1.97 802 PhantomSens compt + 3 0.101 -1.19 -198 0.274 0 0.0463 802 PhantomSens Transportation + 4 1.39e-17 -0.831 -198 0.274 0 0.46 802 PhantomSens Transportation + 5 -0.00553 -0.811 -198 0 0.0883 0.0251 803 PhantomSens phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName + 0 -0.00553 -0.811 -198 0.186 0 0 0 PhantomSens initStep + 1 -0.00432 -0.811 -198 0.182 0.00329 0.00364 0.00364 PhantomSens msc + 2 -0.00679 -0.812 -198 0.178 0.00412 0.00282 0.00646 PhantomSens msc + 3 -0.00981 -0.811 -198 0.174 0.00399 0.00418 0.0106 PhantomSens msc + 4 -0.013 -0.814 -198 0.164 0.00992 0.00615 0.0168 PhantomSens msc + 5 -0.0125 -0.82 -198 0.153 0.0117 0.00906 0.0258 PhantomSens msc + 6 -0.00799 -0.817 -198 0.114 0.0387 0.00707 0.0329 PhantomSens msc + 7 -0.0113 -0.819 -198 0.101 0.0128 0.00507 0.038 PhantomSens msc + 8 -0.0111 -0.824 -198 0.0931 0.00807 0.00715 0.0451 PhantomSens msc + 9 -0.0125 -0.828 -198 0.0772 0.0158 0.00563 0.0508 PhantomSens msc + 10 -0.0127 -0.829 -198 0 0.0772 0.0181 0.0689 PhantomSens eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -2.06 3.75 -199 0.352 0 0 0 PhantomSens initStep - 1 -2.05 3.73 -199 0.317 0.0358 0.0379 0.0379 PhantomSens msc - 2 -2.04 3.71 -199 0.285 0.032 0.0316 0.0694 PhantomSens msc - 3 -2.06 3.71 -199 0.259 0.0255 0.0251 0.0945 PhantomSens msc - 4 -2.04 3.73 -199 0.214 0.0447 0.0386 0.133 PhantomSens msc - 5 -2.04 3.73 -199 0 0.214 0.0905 0.224 PhantomSens eIoni + 0 0.111 -1.23 -198 0.0821 0 0 0 PhantomSens initStep + 1 0.112 -1.23 -198 0 0.0821 0.0199 0.0199 PhantomSens eIoni >>> Event 4 ********************************************************************************************************* @@ -1139,18 +1228,18 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -4.42 4.55 -1e+03 0.356 0 0 0 World initStep - 1 -4.42 4.55 -200 0.356 0 800 800 PhantomSens Transportation - 2 -4.42 4.55 -198 0.356 0 2 802 PhantomSens Transportation - 3 -4.42 4.55 -198 0 0.0883 0.271 802 PhantomSens phot + 0 1.22 -4.08 -1e+03 0.356 0 0 0 World initStep + 1 1.22 -4.08 -200 0.356 0 800 800 PhantomSens Transportation + 2 1.22 -4.08 -198 0.356 0 2 802 PhantomSens Transportation + 3 1.22 -4.08 -196 0 0.0883 1.84 804 PhantomSens phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -4.42 4.55 -198 0.268 0 0 0 PhantomSens initStep - 1 -4.42 4.55 -198 0 0.268 0.126 0.126 PhantomSens eIoni + 0 1.22 -4.08 -196 0.268 0 0 0 PhantomSens initStep + 1 1.22 -4.09 -196 0 0.268 0.126 0.126 PhantomSens eIoni >>> Event 5 ********************************************************************************************************* @@ -1158,17 +1247,32 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -1.58 -3.16 -1e+03 0.356 0 0 0 World initStep - 1 -1.58 -3.16 -200 0.356 0 800 800 PhantomSens Transportation - 2 -1.58 -3.16 -199 0 0.0883 0.874 801 PhantomSens phot + 0 -2.76 2.01 -1e+03 0.356 0 0 0 World initStep + 1 -2.76 2.01 -200 0.356 0 800 800 PhantomSens Transportation + 2 -2.76 2.01 -198 0.356 0 2 802 PhantomSens Transportation + 3 -2.76 2.01 -196 0.356 0 2 804 PhantomSens Transportation + 4 -2.76 2.01 -194 0 0.0158 1.62 806 PhantomSens phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -1.58 -3.16 -199 0.268 0 0 0 PhantomSens initStep - 1 -1.58 -3.16 -199 0 0.268 0.126 0.126 PhantomSens eIoni + 0 -2.76 2.01 -194 0.34 0 0 0 PhantomSens initStep + 1 -2.76 2.01 -194 0.303 0.0369 0.00625 0.00625 PhantomSens msc + 2 -2.76 2.01 -194 0.28 0.0233 0.0104 0.0167 PhantomSens msc + 3 -2.76 2.02 -194 0.274 0.00629 0.0079 0.0246 PhantomSens msc + 4 -2.75 2.01 -194 0.259 0.0149 0.0102 0.0348 PhantomSens msc + 5 -2.75 2.02 -194 0.244 0.0147 0.00777 0.0426 PhantomSens msc + 6 -2.74 2.01 -194 0.232 0.0118 0.00872 0.0513 PhantomSens msc + 7 -2.74 2.01 -194 0.224 0.00831 0.00746 0.0587 PhantomSens msc + 8 -2.73 2.01 -194 0.213 0.0105 0.00683 0.0656 PhantomSens msc + 9 -2.73 2.01 -194 0.207 0.00683 0.00734 0.0729 PhantomSens msc + 10 -2.72 2.01 -194 0.193 0.0136 0.00668 0.0796 PhantomSens msc + 11 -2.72 2.02 -194 0.183 0.0102 0.00713 0.0867 PhantomSens msc + 12 -2.72 2.02 -194 0.172 0.011 0.00959 0.0963 PhantomSens msc + 13 -2.73 2.03 -194 0.15 0.0218 0.0145 0.111 PhantomSens msc + 14 -2.73 2.03 -194 0 0.15 0.0521 0.163 PhantomSens eIoni >>> Event 6 ********************************************************************************************************* @@ -1176,17 +1280,17 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -4.61 4.64 -1e+03 0.356 0 0 0 World initStep - 1 -4.61 4.64 -200 0.356 0 800 800 PhantomSens Transportation - 2 -4.61 4.64 -200 0 0.0883 0.104 800 PhantomSens phot + 0 1.64 -1.4 -1e+03 0.356 0 0 0 World initStep + 1 1.64 -1.4 -200 0.356 0 800 800 PhantomSens Transportation + 2 1.64 -1.4 -199 0 0.0883 1.35 801 PhantomSens phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -4.61 4.64 -200 0.268 0 0 0 PhantomSens initStep - 1 -4.6 4.64 -200 0 0.268 0.126 0.126 PhantomSens eIoni + 0 1.64 -1.4 -199 0.268 0 0 0 PhantomSens initStep + 1 1.64 -1.4 -199 0 0.268 0.126 0.126 PhantomSens eIoni >>> Event 7 ********************************************************************************************************* @@ -1194,27 +1298,17 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 1.1 -3.06 -1e+03 0.356 0 0 0 World initStep - 1 1.1 -3.06 -200 0.356 0 800 800 PhantomSens Transportation - 2 1.1 -3.06 -198 0.356 0 2 802 PhantomSens Transportation - 3 1.1 -3.06 -196 0.195 0 1.58 804 PhantomSens compt - 4 1.31 -3.25 -196 0 0.0153 0.291 804 PhantomSens phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 1.31 -3.25 -196 0.18 0 0 0 PhantomSens initStep - 1 1.31 -3.25 -196 0 0.18 0.0694 0.0694 PhantomSens eIoni + 0 -4.19 -0.654 -1e+03 0.356 0 0 0 World initStep + 1 -4.19 -0.654 -200 0.356 0 800 800 PhantomSens Transportation + 2 -4.19 -0.654 -199 0 0.0883 0.604 801 PhantomSens phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 1.1 -3.06 -196 0.161 0 0 0 PhantomSens initStep - 1 1.1 -3.06 -196 0 0.161 0.058 0.058 PhantomSens eIoni + 0 -4.19 -0.654 -199 0.268 0 0 0 PhantomSens initStep + 1 -4.18 -0.66 -199 0 0.268 0.126 0.126 PhantomSens eIoni >>> Event 8 ********************************************************************************************************* @@ -1222,22 +1316,23 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -4.41 4.44 -1e+03 0.356 0 0 0 World initStep - 1 -4.41 4.44 -200 0.356 0 800 800 PhantomSens Transportation - 2 -4.41 4.44 -199 0 0.0883 0.75 801 PhantomSens phot + 0 -4.58 3.15 -1e+03 0.356 0 0 0 World initStep + 1 -4.58 3.15 -200 0.356 0 800 800 PhantomSens Transportation + 2 -4.58 3.15 -198 0.356 0 2 802 PhantomSens Transportation + 3 -4.58 3.15 -196 0 0.0883 1.85 804 PhantomSens phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -4.41 4.44 -199 0.268 0 0 0 PhantomSens initStep - 1 -4.41 4.44 -199 0 0.268 0.126 0.126 PhantomSens eIoni + 0 -4.58 3.15 -196 0.268 0 0 0 PhantomSens initStep + 1 -4.58 3.15 -196 0 0.268 0.126 0.126 PhantomSens eIoni >>> Event 9 Run terminated. Run Summary Number of events processed : 10 - User=0.000000s Real=0.001896s Sys=0.000000s + User=0.000000s Real=0.002491s Sys=0.000000s PrimitiveScorer RUN PhantomSD,totalEDep Number of entries 10 PrimitiveScorer RUN PhantomSD,protonEDep @@ -1255,213 +1350,213 @@ Run Summary PrimitiveScorer RUN PhantomSD,gammaSurfCurr001 Number of entries 0 PrimitiveScorer RUN PhantomSD,gammaSurfCurr002 - Number of entries 18 + Number of entries 21 PrimitiveScorer RUN PhantomSD,gammaSurfCurr003 Number of entries 0 ============================================================= Number of event processed : 10 ============================================================= #Z Cell# totalEDep protonEDep protonNStep chargedPassCellFlux chargedCellFlux chargedSurfFlux gammaSurfCurr000 gammaSurfCurr001 gammaSurfCurr002 gammaSurfCurr003 - 0 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 1 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 2 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 3 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 4 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 5 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 6 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 7 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 8 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 9 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 10 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 11 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 12 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 13 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 14 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 15 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 16 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 17 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 18 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 19 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 20 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 21 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 22 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 23 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 24 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 25 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 26 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 27 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 28 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 29 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 30 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 31 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 32 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 33 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 34 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 35 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 36 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 37 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 38 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 39 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 40 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 41 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 42 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 43 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 44 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 45 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 46 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 47 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 48 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 49 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 50 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 51 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 52 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 53 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 54 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 55 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 56 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 57 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 58 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 59 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 60 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 61 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 62 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 63 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 64 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 65 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 66 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 67 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 68 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 69 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 70 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 71 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 72 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 73 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 74 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 75 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 76 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 77 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 78 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 79 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 80 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 81 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 82 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 83 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 84 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 85 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 86 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 87 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 88 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 89 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 90 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 91 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 92 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 93 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 94 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 95 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 96 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 97 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 98 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 99 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 100 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 101 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 102 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 103 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 104 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 105 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 106 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 107 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 108 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 109 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 110 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 111 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 112 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 113 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 114 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 115 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 116 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 117 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 118 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 119 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 120 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 121 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 122 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 123 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 124 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 125 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 126 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 127 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 128 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 129 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 130 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 131 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 132 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 133 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 134 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 135 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 136 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 137 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 138 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 139 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 140 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 141 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 142 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 143 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 144 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 145 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 146 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 147 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 148 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 149 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 150 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 151 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 152 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 153 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 154 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 155 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 156 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 157 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 158 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 159 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 160 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 161 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 162 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 163 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 164 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 165 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 166 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 167 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 168 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 169 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 170 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 171 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 172 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 173 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 174 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 175 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 176 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 177 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 178 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 179 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 180 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 181 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 182 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 183 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 184 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 185 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 186 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 187 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 188 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 189 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 190 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 191 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 192 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 193 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 194 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 195 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 196 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 197 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 198 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 199 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 0 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 1 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 2 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 3 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 4 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 5 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 6 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 7 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 8 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 9 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 10 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 11 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 12 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 13 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 14 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 15 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 16 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 17 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 18 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 19 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 20 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 21 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 22 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 23 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 24 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 25 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 26 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 27 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 28 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 29 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 30 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 31 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 32 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 33 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 34 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 35 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 36 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 37 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 38 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 39 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 40 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 41 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 42 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 43 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 44 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 45 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 46 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 47 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 48 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 49 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 50 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 51 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 52 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 53 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 54 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 55 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 56 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 57 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 58 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 59 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 60 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 61 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 62 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 63 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 64 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 65 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 66 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 67 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 68 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 69 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 70 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 71 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 72 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 73 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 74 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 75 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 76 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 77 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 78 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 79 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 80 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 81 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 82 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 83 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 84 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 85 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 86 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 87 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 88 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 89 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 90 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 91 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 92 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 93 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 94 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 95 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 96 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 97 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 98 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 99 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 100 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 101 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 102 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 103 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 104 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 105 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 106 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 107 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 108 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 109 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 110 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 111 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 112 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 113 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 114 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 115 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 116 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 117 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 118 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 119 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 120 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 121 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 122 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 123 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 124 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 125 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 126 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 127 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 128 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 129 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 130 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 131 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 132 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 133 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 134 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 135 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 136 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 137 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 138 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 139 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 140 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 141 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 142 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 143 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 144 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 145 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 146 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 147 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 148 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 149 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 150 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 151 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 152 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 153 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 154 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 155 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 156 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 157 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 158 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 159 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 160 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 161 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 162 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 163 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 164 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 165 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 166 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 167 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 168 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 169 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 170 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 171 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 172 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 173 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 174 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 175 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 176 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 177 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 178 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 179 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 180 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 181 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 182 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 183 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 184 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 185 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 186 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 187 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 188 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 189 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 190 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 191 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 192 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 193 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 194 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 195 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 196 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 197 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 198 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 199 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 ============================================= 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. @@ -1487,6 +1582,8 @@ G4RNGHelper object is deleted. ================== Deleting memory pools =================== Pool ID '20G4NavigationLevelRep', size : 0.00769 MB Pool ID '24G4ReferenceCountedHandleIvE', size : 0.000961 MB +Pool ID '16G4SmartVoxelNode', size : 0.0192 MB +Pool ID '17G4SmartVoxelProxy', size : 0.00961 MB Pool ID '16G4HitsCollection', size : 0 MB Pool ID '7G4Event', size : 0.000961 MB Pool ID '15G4PrimaryVertex', size : 0.000961 MB @@ -1496,8 +1593,8 @@ Pool ID '17G4DynamicParticle', size : 0.000961 MB Pool ID '7G4Track', size : 0.000961 MB Pool ID '18G4TouchableHistory', size : 0.000961 MB Pool ID '15G4CountedObjectIvE', size : 0.000961 MB -Number of memory pools allocated: 11 of which, static: 0 -Dynamic pools deleted: 11 / Total memory freed: 0.016 MB +Number of memory pools allocated: 13 of which, static: 0 +Dynamic pools deleted: 13 / Total memory freed: 0.045 MB ============================================================ G4Allocator objects are deleted. UImanager deleted. diff --git a/examples/extended/runAndEvent/RE02/run3.out b/examples/extended/runAndEvent/RE02/run3.out index cc3e97bd6c..04fd381743 100644 --- a/examples/extended/runAndEvent/RE02/run3.out +++ b/examples/extended/runAndEvent/RE02/run3.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -39,10 +39,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -206,32 +204,99 @@ gamma /gun/direction 0 0 1 # /run/beamOn 10000 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -241,25 +306,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -269,29 +334,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -299,31 +364,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -332,12 +397,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -345,12 +410,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -358,31 +423,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -390,31 +455,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -422,31 +487,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -454,32 +519,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -487,32 +552,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -520,31 +585,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -552,27 +617,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -581,18 +646,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: Binary Cascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -600,69 +665,69 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -670,13 +735,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -684,13 +749,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -698,13 +763,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -712,13 +777,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofWithBinaryCascadeCaptureAtRest @@ -726,13 +791,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofWithBinaryCascadeCaptureAtRest @@ -740,13 +805,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -754,62 +819,62 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -817,28 +882,28 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -846,29 +911,29 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -876,27 +941,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: Binary Cascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -904,13 +969,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -933,7 +998,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -956,21 +1020,21 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_WATER Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.51944 keV e- 276.265 keV e+ 270.751 keV proton 70 keV + Energy thresholds : gamma 2.52562 keV e- 277.64 keV e+ 270.815 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_Pb Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 94.5861 keV e- 1.00386 MeV e+ 951.321 keV proton 70 keV + Energy thresholds : gamma 94.659 keV e- 1.00699 MeV e+ 946.934 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1040,231 +1104,231 @@ See commands in /vis/modeling/trajectories/ for other options. Run terminated. Run Summary Number of events processed : 10000 - User=10.350000s Real=10.783275s Sys=0.040000s + User=10.230000s Real=10.502362s Sys=0.050000s PrimitiveScorer RUN PhantomSD,totalEDep - Number of entries 51611 + Number of entries 51167 PrimitiveScorer RUN PhantomSD,protonEDep - Number of entries 34 + Number of entries 20 PrimitiveScorer RUN PhantomSD,protonNStep - Number of entries 34 + Number of entries 20 PrimitiveScorer RUN PhantomSD,chargedPassCellFlux - Number of entries 20145 + Number of entries 20150 PrimitiveScorer RUN PhantomSD,chargedCellFlux - Number of entries 51437 + Number of entries 51024 PrimitiveScorer RUN PhantomSD,chargedSurfFlux - Number of entries 11706 + Number of entries 11656 PrimitiveScorer RUN PhantomSD,gammaSurfCurr000 - Number of entries 37 + Number of entries 35 PrimitiveScorer RUN PhantomSD,gammaSurfCurr001 - Number of entries 358 + Number of entries 381 PrimitiveScorer RUN PhantomSD,gammaSurfCurr002 - Number of entries 51131 + Number of entries 50511 PrimitiveScorer RUN PhantomSD,gammaSurfCurr003 - Number of entries 71145 + Number of entries 71531 ============================================================= Number of event processed : 10000 ============================================================= #Z Cell# totalEDep protonEDep protonNStep chargedPassCellFlux chargedCellFlux chargedSurfFlux gammaSurfCurr000 gammaSurfCurr001 gammaSurfCurr002 gammaSurfCurr003 - 0 44.374 MeV 0 meV 0 2828.6 /cm2 2990.57 /cm2 2583.86 /cm2 0 /cm2 0 /cm2 600 /cm2 325 /cm2 - 1 511.69 MeV 0 meV 0 3582.03 /cm2 4859.67 /cm2 3273.1 /cm2 0 /cm2 50 /cm2 850 /cm2 675 /cm2 - 2 51.4022 MeV 0 meV 0 3286.39 /cm2 3574.3 /cm2 5121.21 /cm2 0 /cm2 25 /cm2 2700 /cm2 3200 /cm2 - 3 312.666 MeV 0 meV 0 1408.65 /cm2 2916.92 /cm2 2634.39 /cm2 0 /cm2 50 /cm2 2750 /cm2 3050 /cm2 - 4 18.8442 MeV 0 meV 0 1029.04 /cm2 1212.97 /cm2 3497.79 /cm2 0 /cm2 0 /cm2 2850 /cm2 3625 /cm2 - 5 93.6496 MeV 0 meV 0 278.798 /cm2 838.626 /cm2 1354.5 /cm2 0 /cm2 0 /cm2 2400 /cm2 3525 /cm2 - 6 9.31337 MeV 0 meV 0 524.824 /cm2 592.411 /cm2 271.529 /cm2 0 /cm2 0 /cm2 1650 /cm2 2825 /cm2 - 7 48.4987 MeV 0 meV 0 124.863 /cm2 435.577 /cm2 1381.09 /cm2 0 /cm2 0 /cm2 1525 /cm2 2125 /cm2 - 8 2.82696 MeV 0 meV 0 148.577 /cm2 191.45 /cm2 834.354 /cm2 0 /cm2 25 /cm2 1000 /cm2 1900 /cm2 - 9 31.7185 MeV 0 meV 0 35.229 /cm2 289.397 /cm2 127.881 /cm2 0 /cm2 0 /cm2 1050 /cm2 1650 /cm2 - 10 6.26421 MeV 0 meV 0 318.604 /cm2 412.064 /cm2 381.32 /cm2 0 /cm2 0 /cm2 750 /cm2 1475 /cm2 - 11 21.639 MeV 0 meV 0 38.4482 /cm2 192.241 /cm2 537.577 /cm2 0 /cm2 25 /cm2 500 /cm2 1500 /cm2 - 12 1.6342 MeV 0 meV 0 93.0518 /cm2 112.343 /cm2 67.4739 /cm2 0 /cm2 0 /cm2 625 /cm2 1125 /cm2 - 13 15.8768 MeV 0 meV 0 15.2082 /cm2 140.174 /cm2 0 /cm2 0 /cm2 0 /cm2 425 /cm2 1025 /cm2 - 14 2.11351 MeV 0 meV 0 126.997 /cm2 137.448 /cm2 270.721 /cm2 0 /cm2 0 /cm2 300 /cm2 1150 /cm2 - 15 3.40751 MeV 0 meV 0 0 /cm2 21.7825 /cm2 0 /cm2 0 /cm2 0 /cm2 350 /cm2 950 /cm2 - 16 43.7036 keV 0 meV 0 1.13308 /cm2 1.35197 /cm2 0 /cm2 0 /cm2 0 /cm2 275 /cm2 900 /cm2 - 17 1.68578 MeV 0 meV 0 0.976383 /cm2 12.4356 /cm2 0 /cm2 0 /cm2 0 /cm2 125 /cm2 800 /cm2 - 18 25.1324 keV 0 meV 0 0 /cm2 0.161938 /cm2 0 /cm2 0 /cm2 0 /cm2 150 /cm2 700 /cm2 - 19 4.73869 MeV 0 meV 0 5.10973 /cm2 39.0963 /cm2 0 /cm2 0 /cm2 0 /cm2 150 /cm2 575 /cm2 - 20 152.272 keV 0 meV 0 9.25601 /cm2 9.25601 /cm2 0 /cm2 0 /cm2 0 /cm2 225 /cm2 500 /cm2 - 21 1.3811 MeV 0 meV 0 4.13294 /cm2 13.7976 /cm2 61.697 /cm2 0 /cm2 0 /cm2 100 /cm2 350 /cm2 - 22 265.791 keV 0 meV 0 13.5859 /cm2 13.5859 /cm2 0 /cm2 0 /cm2 0 /cm2 125 /cm2 350 /cm2 - 23 7.79674 MeV 0 meV 0 33.0057 /cm2 76.753 /cm2 0 /cm2 0 /cm2 0 /cm2 175 /cm2 300 /cm2 - 24 575.175 keV 0 meV 0 22.7216 /cm2 25.6812 /cm2 0 /cm2 0 /cm2 0 /cm2 150 /cm2 300 /cm2 - 25 5.49251 MeV 0 meV 0 11.0373 /cm2 51.3634 /cm2 82.134 /cm2 0 /cm2 0 /cm2 175 /cm2 300 /cm2 - 26 38.6939 keV 0 meV 0 0 /cm2 0.346844 /cm2 0 /cm2 0 /cm2 0 /cm2 100 /cm2 200 /cm2 - 27 2.33882 MeV 0 meV 0 25.4756 /cm2 26.6679 /cm2 0 /cm2 0 /cm2 0 /cm2 100 /cm2 175 /cm2 - 28 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 75 /cm2 100 /cm2 - 29 991.943 keV 0 meV 0 0 /cm2 5.42984 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 100 /cm2 - 30 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 75 /cm2 75 /cm2 - 31 583.864 keV 0 meV 0 0 /cm2 3.51852 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 50 /cm2 - 32 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 50 /cm2 - 33 349.792 keV 0 meV 0 0 /cm2 1.51701 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 34 376.427 keV 0 meV 0 26.7081 /cm2 26.7081 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 35 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 25 /cm2 - 36 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 50 /cm2 - 37 510.999 keV 0 meV 0 0 /cm2 2.38286 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 25 /cm2 - 38 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 - 39 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 25 /cm2 - 40 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 - 41 686.696 keV 0 meV 0 0 /cm2 6.9778 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 42 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 43 299.5 keV 0 meV 0 0 /cm2 1.73242 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 44 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 0 /cm2 - 45 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 0 /cm2 - 46 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 47 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 48 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 49 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 50 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 51 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 52 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 53 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 54 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 55 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 56 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 57 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 58 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 59 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 60 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 61 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 62 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 63 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 64 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 65 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 66 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 67 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 68 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 69 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 70 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 71 2.12523 MeV 0 meV 0 0 /cm2 9.59787 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 - 72 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 73 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 74 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 75 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 76 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 77 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 78 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 79 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 80 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 81 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 82 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 83 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 84 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 85 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 86 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 87 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 88 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 89 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 90 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 91 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 92 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 93 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 94 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 95 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 96 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 97 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 98 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 99 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 100 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 101 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 102 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 103 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 104 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 105 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 106 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 107 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 108 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 109 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 110 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 111 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 112 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 113 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 114 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 115 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 116 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 117 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 118 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 119 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 120 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 121 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 122 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 123 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 124 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 125 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 126 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 127 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 128 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 129 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 130 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 131 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 132 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 133 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 134 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 135 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 136 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 137 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 138 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 139 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 140 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 141 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 142 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 143 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 144 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 145 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 146 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 147 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 148 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 149 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 150 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 151 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 152 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 153 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 154 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 155 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 156 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 157 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 158 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 159 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 160 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 161 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 162 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 163 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 164 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 165 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 166 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 167 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 168 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 169 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 170 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 171 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 172 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 173 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 174 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 175 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 176 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 177 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 178 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 179 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 180 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 181 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 182 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 183 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 184 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 185 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 186 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 187 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 188 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 189 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 190 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 191 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 192 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 193 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 194 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 195 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 196 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 197 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 198 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 199 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 0 41.5614 MeV 0 eV 0 2826.99 /cm2 2963.74 /cm2 2453.26 /cm2 0 /cm2 0 /cm2 475 /cm2 225 /cm2 + 1 498.656 MeV 0 eV 0 3585.49 /cm2 4655.89 /cm2 3295.48 /cm2 0 /cm2 50 /cm2 775 /cm2 675 /cm2 + 2 61.9233 MeV 0 eV 0 3804.23 /cm2 4181.86 /cm2 5740.73 /cm2 0 /cm2 50 /cm2 3150 /cm2 4050 /cm2 + 3 324.32 MeV 0 eV 0 1545.85 /cm2 2986.79 /cm2 5107.22 /cm2 0 /cm2 50 /cm2 3675 /cm2 3850 /cm2 + 4 18.5022 MeV 0 eV 0 1174.87 /cm2 1243.64 /cm2 1615.67 /cm2 0 /cm2 0 /cm2 3700 /cm2 3950 /cm2 + 5 79.4457 MeV 0 eV 0 265.564 /cm2 713.323 /cm2 1121.73 /cm2 0 /cm2 0 /cm2 2825 /cm2 3025 /cm2 + 6 8.6539 MeV 0 eV 0 484.407 /cm2 596.733 /cm2 335.801 /cm2 0 /cm2 0 /cm2 1875 /cm2 3075 /cm2 + 7 53.8827 MeV 0 eV 0 67.858 /cm2 495.337 /cm2 921.38 /cm2 0 /cm2 0 /cm2 2075 /cm2 2400 /cm2 + 8 6.3593 MeV 0 eV 0 398.329 /cm2 431.282 /cm2 388.212 /cm2 0 /cm2 25 /cm2 1450 /cm2 2200 /cm2 + 9 41.0452 MeV 0 eV 0 61.7136 /cm2 349.248 /cm2 1410.11 /cm2 0 /cm2 0 /cm2 1150 /cm2 1725 /cm2 + 10 4.39207 MeV 0 eV 0 236.536 /cm2 275.591 /cm2 409.643 /cm2 0 /cm2 0 /cm2 1025 /cm2 1625 /cm2 + 11 21.1676 MeV 0 eV 0 46.5241 /cm2 185.235 /cm2 164.782 /cm2 0 /cm2 0 /cm2 800 /cm2 1350 /cm2 + 12 408.111 keV 0 eV 0 26.5722 /cm2 26.6899 /cm2 0 /cm2 0 /cm2 0 /cm2 500 /cm2 1150 /cm2 + 13 9.25828 MeV 0 eV 0 35.7306 /cm2 78.2958 /cm2 0 /cm2 0 /cm2 0 /cm2 600 /cm2 1250 /cm2 + 14 1.84762 MeV 0 eV 0 88.2541 /cm2 116.454 /cm2 0 /cm2 0 /cm2 0 /cm2 575 /cm2 1100 /cm2 + 15 20.7947 MeV 0 eV 0 2.49752 /cm2 181.19 /cm2 162.895 /cm2 0 /cm2 0 /cm2 425 /cm2 1000 /cm2 + 16 297.711 keV 0 eV 0 25.8258 /cm2 25.8258 /cm2 31.4846 /cm2 0 /cm2 0 /cm2 425 /cm2 550 /cm2 + 17 18.6033 MeV 0 eV 0 63.4187 /cm2 173.684 /cm2 165.946 /cm2 0 /cm2 0 /cm2 375 /cm2 550 /cm2 + 18 3.43488 MeV 0 eV 0 164.261 /cm2 221.575 /cm2 304.919 /cm2 0 /cm2 0 /cm2 400 /cm2 700 /cm2 + 19 10.158 MeV 0 eV 0 16.1468 /cm2 86.1228 /cm2 223.791 /cm2 0 /cm2 25 /cm2 350 /cm2 625 /cm2 + 20 1.48003 MeV 0 eV 0 68.2004 /cm2 93.4164 /cm2 0 /cm2 0 /cm2 0 /cm2 200 /cm2 475 /cm2 + 21 8.8471 MeV 0 eV 0 21.5247 /cm2 76.1015 /cm2 103.07 /cm2 0 /cm2 0 /cm2 150 /cm2 425 /cm2 + 22 1.38815 MeV 0 eV 0 111.619 /cm2 111.619 /cm2 244.26 /cm2 0 /cm2 0 /cm2 250 /cm2 275 /cm2 + 23 2.4236 MeV 0 eV 0 14.7003 /cm2 22.6435 /cm2 1336.58 /cm2 0 /cm2 0 /cm2 150 /cm2 325 /cm2 + 24 378.136 keV 0 eV 0 26.4647 /cm2 26.4647 /cm2 26.0312 /cm2 0 /cm2 0 /cm2 75 /cm2 300 /cm2 + 25 6.85174 MeV 0 eV 0 0 /cm2 65.4276 /cm2 38.1203 /cm2 0 /cm2 0 /cm2 175 /cm2 325 /cm2 + 26 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 325 /cm2 + 27 1.02207 MeV 0 eV 0 0 /cm2 4.02953 /cm2 0 /cm2 0 /cm2 0 /cm2 75 /cm2 200 /cm2 + 28 244.355 keV 0 eV 0 0 /cm2 10.4686 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 250 /cm2 + 29 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 175 /cm2 + 30 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 175 /cm2 + 31 383.861 keV 0 eV 0 3.42614 /cm2 3.42614 /cm2 0 /cm2 0 /cm2 0 /cm2 75 /cm2 100 /cm2 + 32 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 150 /cm2 + 33 1.56066 MeV 0 eV 0 17.2858 /cm2 17.2858 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 150 /cm2 + 34 419.97 keV 0 eV 0 9.97245 /cm2 9.97245 /cm2 44.0299 /cm2 0 /cm2 0 /cm2 25 /cm2 175 /cm2 + 35 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 150 /cm2 + 36 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 175 /cm2 + 37 4.96032 MeV 0 eV 0 0 /cm2 38.8207 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 150 /cm2 + 38 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 75 /cm2 + 39 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 75 /cm2 + 40 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 75 /cm2 + 41 602.032 keV 0 eV 0 0 /cm2 4.49231 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 + 42 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 + 43 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 + 44 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 + 45 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 46 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 47 590.869 keV 0 eV 0 0 /cm2 4.78935 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 25 /cm2 + 48 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 49 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 50 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 51 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 52 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 53 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 54 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 + 55 717.407 keV 0 eV 0 5.44346 /cm2 6.42002 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 + 56 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 + 57 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 + 58 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 50 /cm2 + 59 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 60 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 61 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 62 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 63 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 64 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 65 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 66 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 67 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 68 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 69 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 70 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 71 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 72 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 73 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 74 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 75 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 76 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 77 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 78 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 79 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 80 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 81 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 82 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 83 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 84 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 85 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 86 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 87 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 88 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 89 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 90 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 91 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 92 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 93 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 94 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 95 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 96 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 97 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 98 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 99 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 100 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 101 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 102 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 103 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 104 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 105 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 106 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 25 /cm2 + 107 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 108 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 109 665.944 keV 0 eV 0 0 /cm2 5.56123 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 110 119.48 keV 0 eV 0 9.79293 /cm2 9.79293 /cm2 29.9088 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 111 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 112 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 113 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 114 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 115 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 116 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 117 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 118 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 119 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 120 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 121 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 122 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 123 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 124 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 125 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 126 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 127 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 128 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 129 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 130 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 131 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 132 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 133 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 134 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 135 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 136 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 137 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 138 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 139 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 140 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 141 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 142 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 143 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 144 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 145 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 146 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 147 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 148 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 149 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 150 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 151 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 152 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 153 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 154 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 155 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 156 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 157 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 158 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 159 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 160 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 161 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 162 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 163 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 164 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 165 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 166 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 167 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 168 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 169 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 170 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 171 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 172 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 173 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 174 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 175 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 176 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 177 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 178 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 179 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 180 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 181 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 182 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 183 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 184 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 185 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 186 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 187 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 188 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 189 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 190 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 191 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 192 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 193 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 194 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 195 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 196 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 197 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 198 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 199 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 ============================================= 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. @@ -1290,19 +1354,21 @@ G4RNGHelper object is deleted. ================== Deleting memory pools =================== Pool ID '20G4NavigationLevelRep', size : 0.0279 MB Pool ID '24G4ReferenceCountedHandleIvE', size : 0.000961 MB +Pool ID '16G4SmartVoxelNode', size : 0.0192 MB +Pool ID '17G4SmartVoxelProxy', size : 0.00961 MB Pool ID '16G4HitsCollection', size : 0 MB Pool ID '7G4Event', size : 0.000961 MB Pool ID '15G4PrimaryVertex', size : 0.000961 MB Pool ID '17G4PrimaryParticle', size : 0.000961 MB Pool ID '15G4HCofThisEvent', size : 0.000961 MB -Pool ID '17G4DynamicParticle', size : 0.0115 MB -Pool ID '7G4Track', size : 0.0231 MB +Pool ID '17G4DynamicParticle', size : 0.0106 MB +Pool ID '7G4Track', size : 0.0202 MB Pool ID '18G4TouchableHistory', size : 0.00192 MB Pool ID '15G4CountedObjectIvE', size : 0.000961 MB Pool ID '10G4Fragment', size : 0.00192 MB -Pool ID '17G4ReactionProduct', size : 0.00192 MB -Number of memory pools allocated: 13 of which, static: 0 -Dynamic pools deleted: 13 / Total memory freed: 0.074 MB +Pool ID '17G4ReactionProduct', size : 0.000961 MB +Number of memory pools allocated: 15 of which, static: 0 +Dynamic pools deleted: 15 / Total memory freed: 0.098 MB ============================================================ G4Allocator objects are deleted. UImanager deleted. diff --git a/examples/extended/runAndEvent/RE02/run4.out b/examples/extended/runAndEvent/RE02/run4.out index b6111b115a..1f8cc6e66a 100644 --- a/examples/extended/runAndEvent/RE02/run4.out +++ b/examples/extended/runAndEvent/RE02/run4.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -39,10 +39,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -208,32 +206,99 @@ gamma /gun/direction 0 0 1 # /run/beamOn 10000 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -243,25 +308,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -271,29 +336,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -301,31 +366,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -334,12 +399,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -347,12 +412,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -360,31 +425,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -392,31 +457,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -424,31 +489,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -456,32 +521,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -489,32 +554,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -522,31 +587,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -554,27 +619,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -583,18 +648,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: Binary Cascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -602,69 +667,69 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -672,13 +737,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -686,13 +751,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -700,13 +765,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV - Model: FTFP: 0 meV ---> 25 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 25 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -714,13 +779,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofWithBinaryCascadeCaptureAtRest @@ -728,13 +793,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofWithBinaryCascadeCaptureAtRest @@ -742,13 +807,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -756,62 +821,62 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -819,28 +884,28 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -848,29 +913,29 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -878,27 +943,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: QGSB: 12 GeV ---> 100 TeV Model: FTFB: 3 GeV ---> 25 GeV - Model: Binary Cascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: QGSP: 12 GeV ---> 100 TeV Model: FTFP: 3 GeV ---> 25 GeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -906,13 +971,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -935,7 +1000,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -958,21 +1022,21 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_WATER Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.51944 keV e- 276.265 keV e+ 270.751 keV proton 70 keV + Energy thresholds : gamma 2.52562 keV e- 277.64 keV e+ 270.815 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_Pb Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 94.5861 keV e- 1.00386 MeV e+ 951.321 keV proton 70 keV + Energy thresholds : gamma 94.659 keV e- 1.00699 MeV e+ 946.934 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1042,23 +1106,23 @@ See commands in /vis/modeling/trajectories/ for other options. Run terminated. Run Summary Number of events processed : 10000 - User=0.140000s Real=0.140238s Sys=0.000000s + User=0.140000s Real=0.138927s Sys=0.000000s PrimitiveScorer RUN PhantomSD,totalEDep - Number of entries 81 + Number of entries 82 PrimitiveScorer RUN PhantomSD,protonEDep Number of entries 0 PrimitiveScorer RUN PhantomSD,protonNStep Number of entries 0 PrimitiveScorer RUN PhantomSD,chargedPassCellFlux - Number of entries 17 + Number of entries 13 PrimitiveScorer RUN PhantomSD,chargedCellFlux - Number of entries 81 + Number of entries 82 PrimitiveScorer RUN PhantomSD,chargedSurfFlux - Number of entries 28 + Number of entries 27 PrimitiveScorer RUN PhantomSD,gammaSurfCurr000 Number of entries 0 PrimitiveScorer RUN PhantomSD,gammaSurfCurr001 - Number of entries 62 + Number of entries 69 PrimitiveScorer RUN PhantomSD,gammaSurfCurr002 Number of entries 0 PrimitiveScorer RUN PhantomSD,gammaSurfCurr003 @@ -1067,206 +1131,206 @@ Run Summary Number of event processed : 10000 ============================================================= #Z Cell# totalEDep protonEDep protonNStep chargedPassCellFlux chargedCellFlux chargedSurfFlux gammaSurfCurr000 gammaSurfCurr001 gammaSurfCurr002 gammaSurfCurr003 - 0 245.782 keV 0 meV 0 0 /cm2 2.3738 /cm2 0 /cm2 0 /cm2 9175 /cm2 0 /cm2 0 /cm2 - 1 21.0145 MeV 0 meV 0 0 /cm2 37.0873 /cm2 107.232 /cm2 0 /cm2 8925 /cm2 0 /cm2 0 /cm2 - 2 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 3 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 4 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 5 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 6 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 7 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 8 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 9 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 10 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 11 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 12 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 13 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 14 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 15 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 16 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 17 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 18 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 19 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 20 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 21 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 22 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 23 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 24 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 25 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 26 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 27 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 28 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 29 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 30 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 31 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 32 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 33 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 34 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 35 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 36 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 37 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 38 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 39 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 40 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 41 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 42 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 43 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 44 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 45 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 46 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 47 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 48 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 49 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 50 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 51 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 52 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 53 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 54 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 55 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 56 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 57 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 58 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 59 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 60 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 61 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 62 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 63 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 64 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 65 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 66 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 67 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 68 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 69 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 70 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 71 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 72 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 73 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 74 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 75 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 76 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 77 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 78 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 79 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 80 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 81 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 82 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 83 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 84 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 85 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 86 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 87 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 88 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 89 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 90 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 91 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 92 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 93 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 94 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 95 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 96 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 97 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 98 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 99 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 100 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 101 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 102 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 103 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 104 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 105 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 106 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 107 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 108 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 109 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 110 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 111 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 112 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 113 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 114 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 115 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 116 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 117 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 118 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 119 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 120 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 121 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 122 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 123 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 124 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 125 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 126 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 127 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 128 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 129 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 130 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 131 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 132 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 133 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 134 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 135 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 136 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 137 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 138 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 139 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 140 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 141 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 142 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 143 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 144 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 145 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 146 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 147 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 148 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 149 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 150 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 151 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 152 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 153 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 154 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 155 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 156 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 157 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 158 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 159 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 160 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 161 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 162 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 163 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 164 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 165 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 166 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 167 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 168 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 169 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 170 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 171 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 172 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 173 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 174 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 175 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 176 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 177 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 178 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 179 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 180 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 181 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 182 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 183 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 184 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 185 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 186 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 187 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 188 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 189 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 190 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 191 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 192 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 193 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 194 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 195 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 196 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 197 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 198 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 - 199 0 meV 0 meV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 0 203.783 keV 0 eV 0 0 /cm2 1.25328 /cm2 0 /cm2 0 /cm2 9175 /cm2 0 /cm2 0 /cm2 + 1 20.7763 MeV 0 eV 0 0 /cm2 36.5946 /cm2 52.9344 /cm2 0 /cm2 8775 /cm2 0 /cm2 0 /cm2 + 2 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 3 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 4 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 5 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 6 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 7 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 8 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 9 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 10 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 11 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 12 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 13 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 14 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 15 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 16 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 17 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 18 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 19 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 20 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 21 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 22 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 23 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 24 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 25 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 26 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 27 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 28 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 29 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 30 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 31 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 32 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 33 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 34 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 35 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 36 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 37 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 38 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 39 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 40 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 41 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 42 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 43 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 44 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 45 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 46 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 47 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 48 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 49 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 50 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 51 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 52 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 53 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 54 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 55 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 56 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 57 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 58 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 59 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 60 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 61 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 62 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 63 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 64 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 65 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 66 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 67 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 68 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 69 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 70 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 71 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 72 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 73 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 74 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 75 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 76 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 77 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 78 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 79 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 80 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 81 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 82 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 83 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 84 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 85 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 86 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 87 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 88 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 89 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 90 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 91 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 92 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 93 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 94 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 95 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 96 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 97 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 98 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 99 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 100 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 101 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 102 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 103 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 104 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 105 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 106 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 107 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 108 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 109 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 110 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 111 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 112 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 113 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 114 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 115 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 116 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 117 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 118 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 119 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 120 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 121 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 122 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 123 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 124 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 125 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 126 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 127 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 128 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 129 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 130 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 131 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 132 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 133 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 134 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 135 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 136 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 137 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 138 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 139 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 140 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 141 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 142 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 143 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 144 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 145 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 146 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 147 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 148 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 149 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 150 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 151 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 152 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 153 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 154 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 155 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 156 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 157 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 158 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 159 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 160 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 161 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 162 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 163 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 164 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 165 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 166 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 167 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 168 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 169 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 170 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 171 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 172 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 173 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 174 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 175 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 176 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 177 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 178 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 179 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 180 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 181 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 182 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 183 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 184 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 185 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 186 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 187 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 188 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 189 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 190 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 191 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 192 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 193 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 194 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 195 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 196 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 197 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 198 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 + 199 0 eV 0 eV 0 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 0 /cm2 ============================================= 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. @@ -1292,6 +1356,8 @@ G4RNGHelper object is deleted. ================== Deleting memory pools =================== Pool ID '20G4NavigationLevelRep', size : 0.00865 MB Pool ID '24G4ReferenceCountedHandleIvE', size : 0.000961 MB +Pool ID '16G4SmartVoxelNode', size : 0.0192 MB +Pool ID '17G4SmartVoxelProxy', size : 0.00961 MB Pool ID '16G4HitsCollection', size : 0 MB Pool ID '7G4Event', size : 0.000961 MB Pool ID '15G4PrimaryVertex', size : 0.000961 MB @@ -1301,8 +1367,8 @@ Pool ID '17G4DynamicParticle', size : 0.00192 MB Pool ID '7G4Track', size : 0.00288 MB Pool ID '18G4TouchableHistory', size : 0.000961 MB Pool ID '15G4CountedObjectIvE', size : 0.000961 MB -Number of memory pools allocated: 11 of which, static: 0 -Dynamic pools deleted: 11 / Total memory freed: 0.02 MB +Number of memory pools allocated: 13 of which, static: 0 +Dynamic pools deleted: 13 / Total memory freed: 0.049 MB ============================================================ G4Allocator objects are deleted. UImanager deleted. diff --git a/examples/extended/runAndEvent/RE03/.README.txt b/examples/extended/runAndEvent/RE03/.README.txt deleted file mode 100644 index cc2d912140..0000000000 --- a/examples/extended/runAndEvent/RE03/.README.txt +++ /dev/null @@ -1,59 +0,0 @@ - -///\file "runAndEvent/RE03/.README.txt" -///\brief Example RE03 README page - -/*! \page ExampleRE03 Example RE03 - - - Contact : M.Asai (SLAC), A.Kimura (AIT), T.Aso (TNCMT) - -\section RE03_s1 Introduction - - This example demonstrates how to use UI-command base scoring. -It create parallel world(s) for defining scoring mesh(es). - - Due to some performance overhead, this functionality is not -provided by default. To get it included, the pointer to -G4ScoringManager must be accessed. The access to the static -method G4ScoringManager::GetScoringManager() activates this -functionality. - -\subsection RE03_s11 Geometry and primary particle - - It has just one water box in the world volume filled by air. -No detector in the mass geometry. Particle gun shoots a gamma -into the water box. - -\subsection RE03_s12 Physics - - The physics list is taken from referenced physics-list QGS_BIC -in Geant4. - -\section RE03_s2 Macro files - - "run1.mac" through "run4.mac" macro files should be used -independently. Each macro file create its own scoring parallel -world(s). "vis.mac", "drawSlices.mac" and "drawCylinderSlices.mac" -are used internally. Each macro should work for both interactively -and batch, but interactive mode is advised for better visualization. - - IMPORTANT: DO NOT use more than one of these macro files in one -execution of this example. - -\section RE03_s3 RE03UserScoreWriter - - G4ScoringManager has a default score writer which dumps every -entry of one quantity of a mesh for all quantities of the mesh -one by one in CSV format. To alternate the file format the user -can implement his/her own score writer deriving from G4VUserScoreWriter -base class and set it to G4ScoringManager. To demonstrate this, -RE03UserScoreWriter is included in this example. To use this -alternative writer, un-comment its instantiation in RE03.cc. - -*/ - - - - - - diff --git a/examples/extended/runAndEvent/RE03/CMakeLists.txt b/examples/extended/runAndEvent/RE03/CMakeLists.txt index c9af2246f0..786b770677 100644 --- a/examples/extended/runAndEvent/RE03/CMakeLists.txt +++ b/examples/extended/runAndEvent/RE03/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(RE03) #---------------------------------------------------------------------------- diff --git a/examples/extended/runAndEvent/RE03/README b/examples/extended/runAndEvent/RE03/README deleted file mode 100644 index bfd1a8cad5..0000000000 --- a/examples/extended/runAndEvent/RE03/README +++ /dev/null @@ -1,55 +0,0 @@ - - RE03 - An extended example for run and event - -------------------------------------------- - - Contact : M.Asai (SLAC), A.Kimura (AIT), T.Aso (TNCMT) - -1. Introduction - - This example demonstrates how to use UI-command base scoring. -It create parallel world(s) for defining scoring mesh(es). - - Due to some performance overhead, this functionality is not -provided by default. To get it included, the pointer to -G4ScoringManager must be accessed. The access to the static -method G4ScoringManager::GetScoringManager() activates this -functionality. - -1.1 Geometry and primary particle - - It has just one water box in the world volume filled by air. -No detector in the mass geometry. Particle gun shoots a gamma -into the water box. - -1.2 Physics - - The physics list is taken from referenced physics-list QGS_BIC -in Geant4. - -2. Macro files - - "run1.mac" through "run4.mac" macro files should be used -independently. Each macro file create its own scoring parallel -world(s). "vis.mac", "drawSlices.mac" and "drawCylinderSlices.mac" -are used internally. Each macro should work for both interactively -and batch, but interactive mode is advised for better visualization. - - IMPORTANT: DO NOT use more than one of these macro files in one -execution of this example. - -3. RE03UserScoreWriter - - G4ScoringManager has a default score writer which dumps every -entry of one quantity of a mesh for all quantities of the mesh -one by one in CSV format. To alternate the file format the user -can implement his/her own score writer deriving from G4VUserScoreWriter -base class and set it to G4ScoringManager. To demonstrate this, -RE03UserScoreWriter is included in this example. To use this -alternative writer, un-comment its instantiation in RE03.cc. - - - - - - - diff --git a/examples/extended/runAndEvent/RE04/.README.txt b/examples/extended/runAndEvent/RE04/.README.txt deleted file mode 100644 index 0086136147..0000000000 --- a/examples/extended/runAndEvent/RE04/.README.txt +++ /dev/null @@ -1,97 +0,0 @@ - -///\file "runAndEvent/RE04/.README.txt" -///\brief Example RE04 README page - -/*! \page ExampleRE04 Example RE04 - - - Contact : M.Asai (SLAC) - -\section RE04_s1 Introduction - - This example demonstrates how to define a layered mass -geometry in parallel world. In the mass (tracking) world, -there are two boxes only. One is the world volume and the -other is a box in the world. They both are made of air. -Thus, if tracks do not see materials (water and lead) -defined in the parallel world, they rarely interact. -In the parallel world, there are boxes made of water and -lead. - -\subsection RE04_s11 Geometry - - RE04DetectorConstruction defines the mass (tracking) -geometry. It firstly defines all materials which apear -either in mass world or parallel world. Then in SetupGeometry() -method, it defines the world volume and a box named "phantom". -Both boxes are made of air. - - RE04ParallelWorldConstruction defines the parallel world. -For a parallel world, solid, logical and physical volumes -which represent parallel world must not be created here but -should be taken through G4VUserParallelWorld::GetWorld() -method which creates clones of solid, logical and physical -volumes of the world volume of the mass world. Please note -that this cloned logical volume of the parallel world volume -does not have a valid pointer to aa material but null. - - In the parallel world, if a logical volume has a valid -material pointer, a track in this volume (precisely saying -a physical volume which is made of this logical volume) -will see the material defined in this logical volume, -regardless of the material in the mass geometry. If a -logical volume has a null material pointer, a track will -see the ordinary material defined in the mass world. - - RE04ParallelWorldConstruction defines one placement -volume of box-shape, which is made of water, and a mother -box (placement volume with null material pointer), which -contains parameterized volumes. RE04ParallelWorldParam -class defines a parameterization of the parameterized -volume "paraPara", which represents two boxes at different -locations and made of water and lead respectively. - -\subsection RE04_s12 Physics - - RE04PhysicsList uses ordinary physics builders. It also -defines G4ParallelWorldProcess which deals with the parallel -world. This G4ParallelWorldProcess is an extension of -G4ParallelWorldScoringProcess. If SetLayeredMaterialFlag() -of this process class is invoked, in addition to taking -care of sensitive detectors in the parallel world, it also -takes care of layered mass geometry. If this set method is -not invoked, it behaves exactly same as G4ParallelWorldScoringProcess. -The constructor of G4ParallelWorldProcess takes the name -of the parallel world physical volume as an argument. - - G4ParallelWorldProcess may be associated only to some -limited kinds of particle types. The parallel world is -seen only bythe particles which have G4ParallelWorldProcess -in their process manager objects. In this RE04 example -G4ParallelWorldProcess is defined to all particle types -except ChargedGeantino. Thus, if you shoot CargedGeantino, -it won't see any volume boundary defined in the parallel -world. - -\section RE04_s2 Macro files - - The macro file "score.mac" defines a scoring mesh which covers -the "Phantom" and scores energy deposition. It shoots 1000 -primary particles (by default 10 GeV muon-). Though the mass -world has only air, given tracks, both primary muons and -secondary particles see water and lead defined in the parallel -world, you will see the energy deposition is not evenly -distributed. - -\section RE04_s3 User action classes - - In the main () of RE04.cc, three user action classes, i.e. -RE04EventAction, RE04TrackingAction and RE04SteppingAction, -are commented out. By using RE04SteppingAction, you will -see a material name which a track sees for each step. -By using RE04EventAction and RE04TrackingAction, you will -see the similar information for all trajectories of one -event. - -*/ - diff --git a/examples/extended/runAndEvent/RE04/CMakeLists.txt b/examples/extended/runAndEvent/RE04/CMakeLists.txt index 02c6393a4f..8eb898b943 100644 --- a/examples/extended/runAndEvent/RE04/CMakeLists.txt +++ b/examples/extended/runAndEvent/RE04/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(RE04) #---------------------------------------------------------------------------- diff --git a/examples/extended/runAndEvent/RE04/README b/examples/extended/runAndEvent/RE04/README deleted file mode 100644 index f8515eb600..0000000000 --- a/examples/extended/runAndEvent/RE04/README +++ /dev/null @@ -1,92 +0,0 @@ - - RE04 - An extended example for run and event - -------------------------------------------- - - Contact : M.Asai (SLAC) - -1. Introduction - - This example demonstrates how to define a layered mass -geometry in parallel world. In the mass (tracking) world, -there are two boxes only. One is the world volume and the -other is a box in the world. They both are made of air. -Thus, if tracks do not see materials (water and lead) -defined in the parallel world, they rarely interact. -In the parallel world, there are boxes made of water and -lead. - -1.1 Geometry - - RE04DetectorConstruction defines the mass (tracking) -geometry. It firstly defines all materials which apear -either in mass world or parallel world. Then in SetupGeometry() -method, it defines the world volume and a box named "phantom". -Both boxes are made of air. - - RE04ParallelWorldConstruction defines the parallel world. -For a parallel world, solid, logical and physical volumes -which represent parallel world must not be created here but -should be taken through G4VUserParallelWorld::GetWorld() -method which creates clones of solid, logical and physical -volumes of the world volume of the mass world. Please note -that this cloned logical volume of the parallel world volume -does not have a valid pointer to aa material but null. - - In the parallel world, if a logical volume has a valid -material pointer, a track in this volume (precisely saying -a physical volume which is made of this logical volume) -will see the material defined in this logical volume, -regardless of the material in the mass geometry. If a -logical volume has a null material pointer, a track will -see the ordinary material defined in the mass world. - - RE04ParallelWorldConstruction defines one placement -volume of box-shape, which is made of water, and a mother -box (placement volume with null material pointer), which -contains parameterized volumes. RE04ParallelWorldParam -class defines a parameterization of the parameterized -volume "paraPara", which represents two boxes at different -locations and made of water and lead respectively. - -1.2 Physics - - RE04PhysicsList uses ordinary physics builders. It also -defines G4ParallelWorldProcess which deals with the parallel -world. This G4ParallelWorldProcess is an extension of -G4ParallelWorldScoringProcess. If SetLayeredMaterialFlag() -of this process class is invoked, in addition to taking -care of sensitive detectors in the parallel world, it also -takes care of layered mass geometry. If this set method is -not invoked, it behaves exactly same as G4ParallelWorldScoringProcess. -The constructor of G4ParallelWorldProcess takes the name -of the parallel world physical volume as an argument. - - G4ParallelWorldProcess may be associated only to some -limited kinds of particle types. The parallel world is -seen only bythe particles which have G4ParallelWorldProcess -in their process manager objects. In this RE04 example -G4ParallelWorldProcess is defined to all particle types -except ChargedGeantino. Thus, if you shoot CargedGeantino, -it won't see any volume boundary defined in the parallel -world. - -2. Macro files - - The macro file "score.mac" defines a scoring mesh which covers -the "Phantom" and scores energy deposition. It shoots 1000 -primary particles (by default 10 GeV muon-). Though the mass -world has only air, given tracks, both primary muons and -secondary particles see water and lead defined in the parallel -world, you will see the energy deposition is not evenly -distributed. - -3. User action classes - - In the main() of RE04.cc, three user action classes, i.e. -RE04EventAction, RE04TrackingAction and RE04SteppingAction, -are commented out. By using RE04SteppingAction, you will -see a material name which a track sees for each step. -By using RE04EventAction and RE04TrackingAction, you will -see the similar information for all trajectories of one -event. - diff --git a/examples/extended/runAndEvent/RE04/exampleRE04.out b/examples/extended/runAndEvent/RE04/exampleRE04.out index 1919d46608..8c0fa6118a 100644 --- a/examples/extended/runAndEvent/RE04/exampleRE04.out +++ b/examples/extended/runAndEvent/RE04/exampleRE04.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -29,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -143,32 +141,99 @@ The materials defined are : ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 .... G4ScoringMessenger::MeshBinCommand - G4ScoringBox +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -178,25 +243,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -206,29 +271,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -236,31 +301,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -269,12 +334,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -282,12 +347,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -295,31 +360,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -327,31 +392,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -359,31 +424,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -391,32 +456,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -424,32 +489,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -457,31 +522,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -489,27 +554,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -518,17 +583,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -536,67 +601,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -604,13 +669,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -618,13 +683,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -632,12 +697,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -645,13 +710,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -659,13 +724,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -673,13 +738,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -687,60 +752,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -748,27 +813,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -776,25 +841,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -802,25 +867,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -828,13 +893,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -857,7 +922,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= diff --git a/examples/extended/runAndEvent/RE05/.README.txt b/examples/extended/runAndEvent/RE05/.README.txt deleted file mode 100644 index ced5b09ab4..0000000000 --- a/examples/extended/runAndEvent/RE05/.README.txt +++ /dev/null @@ -1,64 +0,0 @@ - -///\file "runAndEvent/RE05/.README.txt" -///\brief Example RE05 README page - -/*! \page ExampleRE05 Example RE05 - - Example RE05 has a simplified collider detector geometry. This example -demonstrates the following features. \n - It was moved in extended examples from novice/N04 with removal of -novice examples. - -\section RE05_s1 PYTHIA primary events - - RE05PrimaryGeneratorAction has G4HEPEvtInterface as the generator. -G4HEPEvtInterface accesses to "pythia_event.data", which contains three -events of Higgs generation produced by PYTHIA. "pythia_main.f" is an -example FORTRAN code of PYTHIA for generating this event sample. - -\section RE05_s2 Readout geometry - - RE05DetectorConstruction defines a simplified collider detecor -geometry, a tracker made of cylindrical tubes, a calorimeter made of -cylindrical tubes, and muon trackers made of planes. - - The cylindrical calorimeter is made of tubes of lead and a scintillator. -Energy deposition in the scintillator is accumulated by RE05CalorimeterSD -sensitive detector, which is assigned to a dedicated parallel world, -RE05CalorimeterParallelWorld, which defines the phi-z cell. - -\section RE05_s3 Physics processes - - The example uses the QBBC physics list, which includes electromagnetic -and hadronic interactions. - -\section RE05_s4 Event filtering by the stacking mechanism - - Higgs events in "pythia_event.data" have two lepton pairs produced -by the Higgs decay via Z0. At the first stage of each event, only the -primary muons are tracked without tracking secondaries. then the number -of hits on the muon trackers are examined. At the next stage, only -the primary charged particles are tracked only inside the barrel -tracking area and the isolation of the primary muons are examined. -At the third stage, all particles in the RoI (Region of Interest) along -the isolated muons are tracked. All these examinations are applied in -RE05StackingAction. - -\section RE05_s5 How to start - -- Execute RE05 in 'batch' mode from macro files -\verbatim -% exampleRE05 exampleRE05.in -\endverbatim - -- Execute RE05 in 'interactive mode' with visualization -\verbatim -% exampleRE05 -.... -Idle> type your commands. For instance: -Idle> /run/beamOn 3 -.... -Idle> exit -\endverbatim - -*/ diff --git a/examples/extended/runAndEvent/RE05/CMakeLists.txt b/examples/extended/runAndEvent/RE05/CMakeLists.txt index 7c5a8f4ff9..d88c56c806 100644 --- a/examples/extended/runAndEvent/RE05/CMakeLists.txt +++ b/examples/extended/runAndEvent/RE05/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(RE05) #---------------------------------------------------------------------------- diff --git a/examples/extended/runAndEvent/RE05/History b/examples/extended/runAndEvent/RE05/History index 059cad3fb6..6f821456ef 100644 --- a/examples/extended/runAndEvent/RE05/History +++ b/examples/extended/runAndEvent/RE05/History @@ -16,6 +16,9 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +18-10-21 B. Morgan (exampleRE05-V10-07-01) +- Use std::string member functions from G4String in place of synonyms + 02-10-21 M. Asai (exampleRE05-V10-07-00) - Migration to the new SteppingVerbose. diff --git a/examples/extended/runAndEvent/RE05/README b/examples/extended/runAndEvent/RE05/README deleted file mode 100644 index 1aea136648..0000000000 --- a/examples/extended/runAndEvent/RE05/README +++ /dev/null @@ -1,61 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - Example RE05 - ------------ - - Example RE05 has a simplified collider detector geometry. This example -demonstrates the following features. - It was moved in extended examples from novice/N04 with removal of -novice examples. - -1. PYTHIA primary events. - - RE05PrimaryGeneratorAction has G4HEPEvtInterface as the generator. -G4HEPEvtInterface accesses to "pythia_event.data", which contains three -events of Higgs generation produced by PYTHIA. "pythia_main.f" is an -example FORTRAN code of PYTHIA for generating this event sample. - -2. Readout geometry - - RE05DetectorConstruction defines a simplified collider detecor -geometry, tracker made of cylindrical tubes, calorimeter made of -cylindrical tubes, and muon trackers made of planes. - - The cylindrical calorimeter is made of tubes of lead and a scintillator. -Energy deposition in the scintillator is accumulated by RE05CalorimeterSD -sensitive detector, which is assigned to a dedicated parallel world, -RE05CalorimeterParallelWorld, which defines the phi-z cell. - -3. Physics processes - - The example uses the QBBC physics list, which includes electromagnetic -and hadronic interactions. - -4. Event filtering by the stacking mechanism. - - Higgs events in "pythia_event.data" have two lepton pairs produced -by the Higgs decay via Z0. At the first stage of each event, only the -primary muons are tracked without tracking secondaries. then the number -of hits on the muon trackers are examined. At the next stage, only -the primary charged particles are tracked only inside the barrel -tracking area and the isolation of the primary muons are examined. -At the third stage, all particles in the RoI (Region of Interest) along -the isolated muons are tracked. All these examinations are applied in -RE05StackingAction. - -5. How to start - -- Execute RE05 in 'batch' mode from macro files - % exampleRE05 exampleRE05.in - -- Execute RE05 in 'interactive mode' with visualization - % exampleRE05 - .... - Idle> type your commands. For instance: - Idle> /run/beamOn 3 - .... - Idle> exit diff --git a/examples/extended/runAndEvent/RE05/exampleRE05.out b/examples/extended/runAndEvent/RE05/exampleRE05.out index b951a4d0f6..5397338b4a 100644 --- a/examples/extended/runAndEvent/RE05/exampleRE05.out +++ b/examples/extended/runAndEvent/RE05/exampleRE05.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -35,10 +35,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -82,32 +80,99 @@ Some /vis commands (optionally) take a string to specify colour. "/vis/list" to see available colours. /run/verbose 2 /run/beamOn 10 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -117,25 +182,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -145,29 +210,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -175,31 +240,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -208,12 +273,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -221,12 +286,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -234,31 +299,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -266,31 +331,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -298,31 +363,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -330,32 +395,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -363,32 +428,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -396,31 +461,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -428,27 +493,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -457,18 +522,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -476,71 +541,71 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: ionElastic - Model: NNDiffuseElastic: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: NNDiffuseElastic: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -548,13 +613,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -562,13 +627,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -576,12 +641,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -589,13 +654,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -603,13 +668,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -617,13 +682,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -631,60 +696,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -692,27 +757,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -720,27 +785,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -748,26 +813,26 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -775,13 +840,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -804,7 +869,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -828,35 +892,35 @@ Region -- -- appears in world vo Index : 0 used in the geometry : Yes Material : Air Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : ArgonGas Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : Silicon Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 5.87535 keV e- 424.726 keV e+ 410.692 keV proton 70 keV + Energy thresholds : gamma 5.85422 keV e- 423.34 keV e+ 409.007 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 3 used in the geometry : Yes Material : Scintillator Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.09434 keV e- 281.891 keV e+ 276.265 keV proton 70 keV + Energy thresholds : gamma 2.09753 keV e- 281.859 keV e+ 275.031 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 4 used in the geometry : Yes Material : Lead Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 94.5861 keV e- 1.00386 MeV e+ 951.321 keV proton 70 keV + Energy thresholds : gamma 94.659 keV e- 1.00699 MeV e+ 946.934 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -891,9 +955,9 @@ See commands in /vis/modeling/trajectories/ for other options. ### Run 0 start. G4HEPEvtInterface - reading 484 HEPEvt particles from pythia_event.data. >>> Event 0 - 26 hits are stored in RE05TrackerHitsCollection. - 45 hits are stored in RE05CalorimeterHitsCollection. - Total energy deposition in calorimeter : 6.360953041639 (GeV) + 39 hits are stored in RE05TrackerHitsCollection. + 46 hits are stored in RE05CalorimeterHitsCollection. + Total energy deposition in calorimeter : 5.1957010042874 (GeV) 1 hits are stored in RE05MuonHitsCollection. G4HEPEvtInterface - reading 755 HEPEvt particles from pythia_event.data. >>> Event 1 @@ -911,19 +975,19 @@ G4HEPEvtInterface - reading 448 HEPEvt particles from pythia_event.data. >>> Event 3 0 hits are stored in RE05TrackerHitsCollection. 3 hits are stored in RE05CalorimeterHitsCollection. - Total energy deposition in calorimeter : 0.52827293067357 (GeV) + Total energy deposition in calorimeter : 0.52326704920221 (GeV) 0 hits are stored in RE05MuonHitsCollection. G4HEPEvtInterface - reading 945 HEPEvt particles from pythia_event.data. >>> Event 4 - 89 hits are stored in RE05TrackerHitsCollection. - 67 hits are stored in RE05CalorimeterHitsCollection. - Total energy deposition in calorimeter : 13.297623034912 (GeV) + 84 hits are stored in RE05TrackerHitsCollection. + 61 hits are stored in RE05CalorimeterHitsCollection. + Total energy deposition in calorimeter : 10.179828859 (GeV) 1 hits are stored in RE05MuonHitsCollection. G4HEPEvtInterface - reading 837 HEPEvt particles from pythia_event.data. >>> Event 5 - 45 hits are stored in RE05TrackerHitsCollection. - 6 hits are stored in RE05CalorimeterHitsCollection. - Total energy deposition in calorimeter : 2.8888611989697 (GeV) + 43 hits are stored in RE05TrackerHitsCollection. + 7 hits are stored in RE05CalorimeterHitsCollection. + Total energy deposition in calorimeter : 2.8944514399101 (GeV) 1 hits are stored in RE05MuonHitsCollection. G4HEPEvtInterface - reading 603 HEPEvt particles from pythia_event.data. >>> Event 6 @@ -933,26 +997,26 @@ G4HEPEvtInterface - reading 603 HEPEvt particles from pythia_event.data. 0 hits are stored in RE05MuonHitsCollection. G4HEPEvtInterface - reading 627 HEPEvt particles from pythia_event.data. >>> Event 7 - 55 hits are stored in RE05TrackerHitsCollection. - 29 hits are stored in RE05CalorimeterHitsCollection. - Total energy deposition in calorimeter : 9.0296459958097 (GeV) + 33 hits are stored in RE05TrackerHitsCollection. + 30 hits are stored in RE05CalorimeterHitsCollection. + Total energy deposition in calorimeter : 7.2005529139009 (GeV) 1 hits are stored in RE05MuonHitsCollection. G4HEPEvtInterface - reading 682 HEPEvt particles from pythia_event.data. >>> Event 8 - 50 hits are stored in RE05TrackerHitsCollection. - 45 hits are stored in RE05CalorimeterHitsCollection. - Total energy deposition in calorimeter : 8.5703523682035 (GeV) + 53 hits are stored in RE05TrackerHitsCollection. + 52 hits are stored in RE05CalorimeterHitsCollection. + Total energy deposition in calorimeter : 10.403375068953 (GeV) 1 hits are stored in RE05MuonHitsCollection. G4HEPEvtInterface - reading 330 HEPEvt particles from pythia_event.data. >>> Event 9 - 17 hits are stored in RE05TrackerHitsCollection. - 21 hits are stored in RE05CalorimeterHitsCollection. - Total energy deposition in calorimeter : 5.6016919334411 (GeV) + 16 hits are stored in RE05TrackerHitsCollection. + 18 hits are stored in RE05CalorimeterHitsCollection. + Total energy deposition in calorimeter : 4.5446010998816 (GeV) 1 hits are stored in RE05MuonHitsCollection. Run terminated. Run Summary Number of events processed : 10 - User=1.800000s Real=1.821338s Sys=0.000000s + User=1.610000s Real=1.707431s Sys=0.020000s 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. "/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated. @@ -972,31 +1036,33 @@ G4SDManager deleted. EventManager deleted. Units table cleared. TransportationManager deleted. -Total navigation history collections cleaned: 405 +Total navigation history collections cleaned: 409 G4RNGHelper object is deleted. ================== Deleting memory pools =================== -Pool ID '20G4NavigationLevelRep', size : 0.662 MB +Pool ID '20G4NavigationLevelRep', size : 0.669 MB Pool ID '24G4ReferenceCountedHandleIvE', size : 0.000961 MB +Pool ID '16G4SmartVoxelNode', size : 0.00385 MB +Pool ID '17G4SmartVoxelProxy', size : 0.00192 MB Pool ID '7G4Event', size : 0.000961 MB Pool ID '17G4PrimaryParticle', size : 0.13 MB Pool ID '16G4HEPEvtParticle', size : 0.0221 MB Pool ID '15G4PrimaryVertex', size : 0.000961 MB Pool ID '15G4HCofThisEvent', size : 0.000961 MB Pool ID '16G4HitsCollection', size : 0.000961 MB -Pool ID '17G4DynamicParticle', size : 0.702 MB -Pool ID '7G4Track', size : 1.2 MB +Pool ID '17G4DynamicParticle', size : 0.677 MB +Pool ID '7G4Track', size : 1.15 MB Pool ID '18G4TouchableHistory', size : 0.049 MB Pool ID '15G4CountedObjectIvE', size : 0.00673 MB Pool ID '12G4Trajectory', size : 0.0279 MB -Pool ID '17G4TrajectoryPoint', size : 0.159 MB +Pool ID '17G4TrajectoryPoint', size : 0.15 MB Pool ID '14RE05TrackerHit', size : 0.00385 MB -Pool ID '18RE05CalorimeterHit', size : 0.00961 MB +Pool ID '18RE05CalorimeterHit', size : 0.00865 MB Pool ID '11RE05MuonHit', size : 0.000961 MB Pool ID '21G4TrajectoryContainer', size : 0.000961 MB -Pool ID '10G4Fragment', size : 0.00769 MB -Pool ID '17G4ReactionProduct', size : 0.0115 MB -Number of memory pools allocated: 20 of which, static: 0 -Dynamic pools deleted: 20 / Total memory freed: 3 MB +Pool ID '10G4Fragment', size : 0.00865 MB +Pool ID '17G4ReactionProduct', size : 0.00865 MB +Number of memory pools allocated: 22 of which, static: 0 +Dynamic pools deleted: 22 / Total memory freed: 2.9 MB ============================================================ G4Allocator objects are deleted. UImanager deleted. diff --git a/examples/extended/runAndEvent/RE05/src/RE05SteppingAction.cc b/examples/extended/runAndEvent/RE05/src/RE05SteppingAction.cc index 4879094bf6..750d918746 100644 --- a/examples/extended/runAndEvent/RE05/src/RE05SteppingAction.cc +++ b/examples/extended/runAndEvent/RE05/src/RE05SteppingAction.cc @@ -71,11 +71,11 @@ void RE05SteppingAction::UserSteppingAction(const G4Step * theStep) G4StepPoint * thePrePoint = theStep->GetPreStepPoint(); G4VPhysicalVolume * thePrePV = thePrePoint->GetPhysicalVolume(); G4String thePrePVname = thePrePV->GetName(); - if(thePrePVname(0,4)=="calo") { return; } + if(thePrePVname.substr(0,4)=="calo") { return; } G4StepPoint * thePostPoint = theStep->GetPostStepPoint(); G4VPhysicalVolume * thePostPV = thePostPoint->GetPhysicalVolume(); G4String thePostPVname = thePostPV->GetName(); - if(thePostPVname(0,4)!="calo") { return; } + if(thePostPVname.substr(0,4)!="calo") { return; } // then suspend the track theTrack->SetTrackStatus(fSuspend); diff --git a/examples/extended/runAndEvent/RE06/.README.txt b/examples/extended/runAndEvent/RE06/.README.txt deleted file mode 100644 index 6242323acb..0000000000 --- a/examples/extended/runAndEvent/RE06/.README.txt +++ /dev/null @@ -1,213 +0,0 @@ - -///\file "runAndEvent/RE06/.README.txt" -///\brief Example RE06 README page - -/*! \page ExampleRE06 Example RE06 - - This example simulates three simplified sandwitch calorimeters. - The main features demonstrated in this example are : - --# Utilizing a concrete run class derived from G4Run base class for - accumulating physics quantities for a run --# Changing calorimeter geometries without re-building a world volume --# Defining geometrical regions and setting production thresholds - for each region --# Demonstrating the use of primitive scorer and filter classes without - implementing sensitive detector class --# Demonstrating the use of parallel scoring geometry and associating - parallel world scoring process --# Measuring the timing spent for each region, both for all particle - types and for e+/e- - - It was moved in extended examples from novice/N07 with removal of - novice examples. - - Note: Since this example utilizes its own RE06SteppingVerbose for the - timing measurement, the user cannot get the ordinary verbosity with - /tracking/verbose. - -\section RE06_s1 Utilizing a concrete run class derived from G4Run base class for accumulating physics quantities for a run - - G4Run is a class the user can inherit and create his/her own concrete - class for accumulating information useful to him/her. It has a virtual - method RecordEvent(const G4Event*), which will be invoked by G4RunManager - at the end of processing each event. By implemeting this method in the - user'r concrete run class, he/she can store information associating with - G4Event class itself and hits collections attached with G4Event. In this - example, RE06Run is the class derived from G4Run. In the method - RE06Run::RecordEvent(const G4Event*), in addition to counting the - number of events, all hits collections are accessed to accumulate - energy depositions, step lengths and number of steps. - - In case the user create his/her own run class, an object of this class - must be instantiated in the method GenerateRun() of his/her concrete - class derived from G4UserRunAction base class. The pointer to this run - object must be returned by this method. In this example, RE06RunAction - is the class which instantiating RE06Run class object. In - RE06RunAction::EndOfRunAction(const G4Run*) method, RE06Run object - is analized to output the run summary. - - It should be noted that some information about generated secondaries - are collected in RE06StackinAction instead of sensitive detector class. - RE06StackingAction::ClassifyNewTrack(const G4Track*) method is used - not for classifying tracks sent to the stack, but for accessing to all - secondaries generated in an event. - -\section RE06_s2 Changing calorimeter geometries without re-building a world volume - - In RE06DetectorConstruction, all solids, logical and physical volumes - are constructed only once at the first invocation of Constuct() method. - Positions and number of slices are changed not by re-constructing another - objects but by modifying data members of already existing objects as - it is implemented in RE06DetectorConstruction::SetNumberOfLayers(G4int) - for changing the number of parameterized volumes, and also - RE06DetectorConstruction::SetSerialGeometry(G4bool) for changing the - position of placed volumes. - -\section RE06_s3 Defining geometrical regions and setting production thresholds for each region - - Setting production thresholds (so-called production cuts) to individual - region of a detector geometry is the new feature provided by Geant4 5.1 - release. This feature is also called as "Cuts per region". - - Please note that this new feature is supporsed to be used only by the - users, - a) who is simulating most complex geometry such as an LHC detector, - b) and who has enough experience of simulating EM showers in matter. - We strongly recommend to compare the simulated results of this new - feature with the results of the same geometry but having uniform - production thresholds. Setting completely different cut values for - individual region may break the coherent and comprehensive accuracy - of the simulation. Thus such cut values should be carefully optimized - by the user with comparison with results of uniform cuts. - - In RE06DetectorConstruction::Construct(), Three objects of G4Region - class are instantiated and set to the logical volumes of each of three - calorimeter modules. Also, these individual logical volumes are - registered as "root logical volume" so that all daghter volumes in - these logical volumes are also affected by the corresponding regions. - - In RE06PhysicsList::SetCuts(), in addition to set the default threshold - values for the world volume, three threshold values are set to three - calorimeter regions respectively. By setting production thresholds to - a region, gamma, electron or positron will not be generated as a - secondary if its range is shorter than the production threshold of that - particular region. Please note that some EM processes still generate - such secondary below threshold. - -\section RE06_s4 Demonstrating the use of primitive scorer and filter classes without implementing sensitive detector class - - In RE06DetectorConstruction::SetupDetector() method, concrete classes - G4PSEnergyDeposit, G4PSNofSecondary, G4PSTrackLength, G4PSNofStep and - G4PSMinKinEAtGeneration, all of thich are derivalable of G4VPrimitiveScorer, - are used to define the sensitivity of the calorimeter. All of them are - registered to G4MultiFunctionalDetector and this detector object is set - to the logical volume. G4SDParticleFilter is used to define the particle - type(s) to be scored. - - In RE06Run::RecordEvent() method, the way of retreiving G4THitsMap - from each primitive scorer via G4HCofThisEvent is demonstrated. - In RE06RunAction::EndOfRunAction(), Run is summarized with data kept - in RE06Run class object. - -\section RE06_s5 Demonstrating the use of parallel scoring geometry and associating parallel world scoring process - - In RE06PhysicsList::ConstructGeneral(), G4ParallelWorldScoringProcess is - assigned to all the particle types. This process invokes sensitive detectors - (and scorers) defined in the parallel world "ParallelScoringWorld", the - name of the parallel world which is defined in main() (exampleRE06.cc) as - an argument of RE06ParallelWorld constructor. - - As implemented in RE06ParallelWorld::SetupGeometry(), the world volume of - the parallel world is obtained by GetWorld() method as a clone copy of the - world volume of the mass geometry. The user should not create the world volume. - - RE06ParallelWorld defines three cylindrical volumes, each of them is - located at the same position as three sandwitch calorimeters defined - in the mass geometry (RE06DetectorConstruction). Each cylinder is replicated - in Rho to define 20 layers, and scores the same quantities as the mass geometry. - These three cylinders are relocated accordingly when the mass geometry is - modified by RE06DetectorConstruction::SetSerialGeometry(). - -\section RE06_s6 Measuring the timing spent for each region, both for all particle types and for e+/e- - - RE06SteppingVerbose class has two G4SliceTimer class objects for each - detector region. One G4SliceTimer is measuring the time spent by a step - in a region for all types of particles, and another is measuring for - e+/e- only. - - RE06SteppingVerbose::InitializeTimers() is invoked by RE06RunAction:: - BeginOfRunAction(), and checks the number of regions appear in the - geometry and instantiates the necessary number of timers. Thus, this - RE06SteppingVerbose class can be used for any kind of geometry the user - defines without any modification. Given G4VSteppingVerbose is not invoked - if the verbosity of G4SteppingManager is 0, this verbosity is set to 1. - - NewStep() and StepInfo() are the methods defined in G4VSteppingVerbose - base class, and they are invoked at the beginning and the end of every - step, respectively, from G4SteppingManager. Thus, these methods are - utilized in RE06SteppingVerbose to start/resume and pause the timer. - - RE06SteppingVerbose::Report() method is used by RE06RunAction:: - EndOfRunAction() to get the timing measured. - -\section RE06_s7 Macro files - - - exampleRE06.in \n - To be used for batch mode. The reference output file is made by this - macro file. - - - sample.mac \n - To be used for interactive mode. Issue "/control/execute sample.mac" - when "Idle>" prompt appears. - - - vis.mac \n - Setting visualization parameters. This macro file will be called - automatically when interactive execution starts. - -\section RE06_s8 UI commands defined in this example - -
      -Command /RE06/setAbsMat
      -Guidance :
      -Select Material of the Absorber.
      -
      -Parameter : choice
      - Parameter type  : s
      - Omittable       : False
      - Candidates      : Aluminium liquidArgon Lead Water Scintillator Air Galactic 
      -
      -
      -
      -Command /RE06/setGapMat
      -Guidance :
      -Select Material of the Gap.
      -
      -Parameter : choice
      - Parameter type  : s
      - Omittable       : False
      - Candidates      : Aluminium liquidArgon Lead Water Scintillator Air Galactic 
      -
      -
      -
      -Command /RE06/numberOfLayers
      -Guidance :
      -Set number of layers.
      - Range of parameters : nl>0
      -
      -Parameter : nl
      - Parameter type  : i
      - Omittable       : False
      -
      -
      -
      -Command /RE06/serialGeometry
      -Guidance :
      -Select calorimeters to be placed in serial or parallel.
      -
      -Parameter : serialize
      - Parameter type  : b
      - Omittable       : False
      -
      -
      -*/ diff --git a/examples/extended/runAndEvent/RE06/CMakeLists.txt b/examples/extended/runAndEvent/RE06/CMakeLists.txt index 17c76dc563..83ebb74f4e 100644 --- a/examples/extended/runAndEvent/RE06/CMakeLists.txt +++ b/examples/extended/runAndEvent/RE06/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(RE06) #---------------------------------------------------------------------------- diff --git a/examples/extended/runAndEvent/RE06/History b/examples/extended/runAndEvent/RE06/History index 38225f6bed..34e3793e1b 100644 --- a/examples/extended/runAndEvent/RE06/History +++ b/examples/extended/runAndEvent/RE06/History @@ -16,6 +16,10 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Oct. 05, 2021 M. Asai (exampleRE06-V10-07-01) +- Changing the order of deleting RE06SteppingVerbose to be prior to + the deletion of RunManager. Addressing to the Valgring warning message. + Feb. 10, 2021 M. Asai (exampleRE06-V10-07-00) - Migration to new SteppingVerbose. diff --git a/examples/extended/runAndEvent/RE06/README b/examples/extended/runAndEvent/RE06/README deleted file mode 100644 index 09db343697..0000000000 --- a/examples/extended/runAndEvent/RE06/README +++ /dev/null @@ -1,222 +0,0 @@ -------------------------------------------------------------------- - - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - ExampleRE06 - ---------- - - - This example simulates three simplified sandwitch calorimeters. - The main features demonstrated in this example are : - - 1. Utilizing a concrete run class derived from G4Run base class for - accumulating physics quantities for a run - 2. Changing calorimeter geometries without re-building a world volume - 3. Defining geometrical regions and setting production thresholds - for each region - 4. Demonstrating the use of primitive scorer and filter classes without - implementing sensitive detector class - 5. Demonstrating the use of parallel scoring geometry and associating - parallel world scoring process - 6. Measuring the timing spent for each region, both for all particle - types and for e+/e- - - It was moved in extended examples from novice/N07 with removal of - novice examples. - - ********************************************************************** - Note: Since this example utilizes its own RE06SteppingVerbose for the - timing measurement, the user cannot get the ordinary verbosity with - /tracking/verbose. - ********************************************************************** - - 1- Utilizing a concrete run class derived from G4Run base class for - accumulating physics quantities for a run - - G4Run is a class the user can inherit and create his/her own concrete - class for accumulating information useful to him/her. It has a virtual - method RecordEvent(const G4Event*), which will be invoked by G4RunManager - at the end of processing each event. By implemeting this method in the - user'r concrete run class, he/she can store information associating with - G4Event class itself and hits collections attached with G4Event. In this - example, RE06Run is the class derived from G4Run. In the method - RE06Run::RecordEvent(const G4Event*), in addition to counting the - number of events, all hits collections are accessed to accumulate - energy depositions, step lengths and number of steps. - - In case the user create his/her own run class, an object of this class - must be instantiated in the method GenerateRun() of his/her concrete - class derived from G4UserRunAction base class. The pointer to this run - object must be returned by this method. In this example, RE06RunAction - is the class which instantiating RE06Run class object. In - RE06RunAction::EndOfRunAction(const G4Run*) method, RE06Run object - is analized to output the run summary. - - It should be noted that some information about generated secondaries - are collected in RE06StackinAction instead of sensitive detector class. - RE06StackingAction::ClassifyNewTrack(const G4Track*) method is used - not for classifying tracks sent to the stack, but for accessing to all - secondaries generated in an event. - - 2- Changing calorimeter geometries without re-building a world volume - - In RE06DetectorConstruction, all solids, logical and physical volumes - are constructed only once at the first invocation of Constuct() method. - Positions and number of slices are changed not by re-constructing another - objects but by modifying data members of already existing objects as - it is implemented in RE06DetectorConstruction::SetNumberOfLayers(G4int) - for changing the number of parameterized volumes, and also - RE06DetectorConstruction::SetSerialGeometry(G4bool) for changing the - position of placed volumes. - - 3- Defining geometrical regions and setting production thresholds - for each region - - Setting production thresholds (so-called production cuts) to individual - region of a detector geometry is the new feature provided by Geant4 5.1 - release. This feature is also called as "Cuts per region". - - Please note that this new feature is supporsed to be used only by the - users, - a) who is simulating most complex geometry such as an LHC detector, - b) and who has enough experience of simulating EM showers in matter. - We strongly recommend to compare the simulated results of this new - feature with the results of the same geometry but having uniform - production thresholds. Setting completely different cut values for - individual region may break the coherent and comprehensive accuracy - of the simulation. Thus such cut values should be carefully optimized - by the user with comparison with results of uniform cuts. - - In RE06DetectorConstruction::Construct(), Three objects of G4Region - class are instantiated and set to the logical volumes of each of three - calorimeter modules. Also, these individual logical volumes are - registered as "root logical volume" so that all daghter volumes in - these logical volumes are also affected by the corresponding regions. - - In RE06PhysicsList::SetCuts(), in addition to set the default threshold - values for the world volume, three threshold values are set to three - calorimeter regions respectively. By setting production thresholds to - a region, gamma, electron or positron will not be generated as a - secondary if its range is shorter than the production threshold of that - particular region. Please note that some EM processes still generate - such secondary below threshold. - - 4- Demonstrating the use of primitive scorer and filter classes without - implementing sensitive detector class - - In RE06DetectorConstruction::SetupDetector() method, concrete classes - G4PSEnergyDeposit, G4PSNofSecondary, G4PSTrackLength, G4PSNofStep and - G4PSMinKinEAtGeneration, all of thich are derivalable of G4VPrimitiveScorer, - are used to define the sensitivity of the calorimeter. All of them are - registered to G4MultiFunctionalDetector and this detector object is set - to the logical volume. G4SDParticleFilter is used to define the particle - type(s) to be scored. - - In RE06Run::RecordEvent() method, the way of retreiving G4THitsMap - from each primitive scorer via G4HCofThisEvent is demonstrated. - In RE06RunAction::EndOfRunAction(), Run is summarized with data kept - in RE06Run class object. - - 5- Demonstrating the use of parallel scoring geometry and associating - parallel world scoring process - - In RE06PhysicsList::ConstructGeneral(), G4ParallelWorldScoringProcess is - assigned to all the particle types. This process invokes sensitive detectors - (and scorers) defined in the parallel world "ParallelScoringWorld", the - name of the parallel world which is defined in main() (exampleRE06.cc) as - an argument of RE06ParallelWorld constructor. - - As implemented in RE06ParallelWorld::SetupGeometry(), the world volume of - the parallel world is obtained by GetWorld() method as a clone copy of the - world volume of the mass geometry. The user should not create the world volume. - - RE06ParallelWorld defines three cylindrical volumes, each of them is - located at the same position as three sandwitch calorimeters defined - in the mass geometry (RE06DetectorConstruction). Each cylinder is replicated - in Rho to define 20 layers, and scores the same quantities as the mass geometry. - These three cylinders are relocated accordingly when the mass geometry is - modified by RE06DetectorConstruction::SetSerialGeometry(). - - 6- Measuring the timing spent for each region, both for all particle - types and for e+/e- - - RE06SteppingVerbose class has two G4SliceTimer class objects for each - detector region. One G4SliceTimer is measuring the time spent by a step - in a region for all types of particles, and another is measuring for - e+/e- only. - - RE06SteppingVerbose::InitializeTimers() is invoked by RE06RunAction:: - BeginOfRunAction(), and checks the number of regions appear in the - geometry and instantiates the necessary number of timers. Thus, this - RE06SteppingVerbose class can be used for any kind of geometry the user - defines without any modification. Given G4VSteppingVerbose is not invoked - if the verbosity of G4SteppingManager is 0, this verbosity is set to 1. - - NewStep() and StepInfo() are the methods defined in G4VSteppingVerbose - base class, and they are invoked at the beginning and the end of every - step, respectively, from G4SteppingManager. Thus, these methods are - utilized in RE06SteppingVerbose to start/resume and pause the timer. - - RE06SteppingVerbose::Report() method is used by RE06RunAction:: - EndOfRunAction() to get the timing measured. - - 7- Macro files - - exampleRE06.in - To be used for batch mode. The reference output file is made by this - macro file. - - sample.mac - To be used for interactive mode. Issue "/control/execute sample.mac" - when "Idle>" prompt appears. - - vis.mac - Setting visualization parameters. This macro file will be called - automatically when interactive execution starts. - - 8- UI commands defined in this example - -Command /RE06/setAbsMat -Guidance : -Select Material of the Absorber. - -Parameter : choice - Parameter type : s - Omittable : False - Candidates : Aluminium liquidArgon Lead Water Scintillator Air Galactic - - - -Command /RE06/setGapMat -Guidance : -Select Material of the Gap. - -Parameter : choice - Parameter type : s - Omittable : False - Candidates : Aluminium liquidArgon Lead Water Scintillator Air Galactic - - - -Command /RE06/numberOfLayers -Guidance : -Set number of layers. - Range of parameters : nl>0 - -Parameter : nl - Parameter type : i - Omittable : False - - - -Command /RE06/serialGeometry -Guidance : -Select calorimeters to be placed in serial or parallel. - -Parameter : serialize - Parameter type : b - Omittable : False - - diff --git a/examples/extended/runAndEvent/RE06/exampleRE06.cc b/examples/extended/runAndEvent/RE06/exampleRE06.cc index 8fc7ece44a..2c2a35e7fc 100644 --- a/examples/extended/runAndEvent/RE06/exampleRE06.cc +++ b/examples/extended/runAndEvent/RE06/exampleRE06.cc @@ -112,9 +112,9 @@ int main(int argc,char** argv) // owned and deleted by the run manager, so they should not // be deleted in the main() program ! + delete verbosity; delete visManager; delete runManager; - delete verbosity; return 0; } diff --git a/examples/extended/runAndEvent/RE06/exampleRE06.out b/examples/extended/runAndEvent/RE06/exampleRE06.out index c0307a407d..2ff49c94d1 100644 --- a/examples/extended/runAndEvent/RE06/exampleRE06.out +++ b/examples/extended/runAndEvent/RE06/exampleRE06.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -29,10 +29,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -220,32 +218,99 @@ Region -- -- appears in world volume Materials : Lead liquidArgon Production cuts : gamma 10 cm e- 10 cm e+ 10 cm proton 10 cm /run/beamOn 10 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -255,25 +320,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -283,29 +348,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -313,31 +378,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -346,12 +411,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -359,12 +424,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -372,31 +437,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -404,31 +469,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -436,31 +501,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -468,32 +533,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -501,32 +566,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -534,31 +599,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -566,27 +631,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -595,17 +660,17 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -613,67 +678,67 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -681,13 +746,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -695,13 +760,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -709,12 +774,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -722,13 +787,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -736,13 +801,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -750,13 +815,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -764,60 +829,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -825,27 +890,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -853,25 +918,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -879,25 +944,25 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -905,13 +970,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV ================================================================ ### G4LevelReader: broken transition 0 from level 24 to 24 for isotope Z= 89 A= 219 - use ground level @@ -935,7 +1000,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -945,49 +1009,49 @@ Max 2J for sampling of angular correlations 10 Index : 0 used in the geometry : Yes Material : Galactic Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Lead Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 101.843 keV e- 1.36749 MeV e+ 1.27862 MeV proton 100 keV + Energy thresholds : gamma 101.8 keV e- 1.37159 MeV e+ 1.2826 MeV proton 100 keV Region(s) which use this couple : Calor-A Index : 2 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 6.19986 keV e- 344.855 keV e+ 333.46 keV proton 100 keV + Energy thresholds : gamma 6.18824 keV e- 346.458 keV e+ 335.417 keV proton 100 keV Region(s) which use this couple : Calor-A Index : 3 used in the geometry : Yes Material : Lead Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 101.843 keV e- 1.36749 MeV e+ 1.27862 MeV proton 100 keV + Energy thresholds : gamma 101.8 keV e- 1.37159 MeV e+ 1.2826 MeV proton 100 keV Region(s) which use this couple : Calor-B Index : 4 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 6.19986 keV e- 344.855 keV e+ 333.46 keV proton 100 keV + Energy thresholds : gamma 6.18824 keV e- 346.458 keV e+ 335.417 keV proton 100 keV Region(s) which use this couple : Calor-B Index : 5 used in the geometry : Yes Material : Lead Range cuts : gamma 10 cm e- 10 cm e+ 10 cm proton 10 cm - Energy thresholds : gamma 2.21848 MeV e- 430.674 MeV e+ 408.132 MeV proton 10 MeV + Energy thresholds : gamma 2.1815 MeV e- 434.385 MeV e+ 405.822 MeV proton 10 MeV Region(s) which use this couple : Calor-C Index : 6 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 10 cm e- 10 cm e+ 10 cm proton 10 cm - Energy thresholds : gamma 56.567 keV e- 24.5965 MeV e+ 22.6909 MeV proton 10 MeV + Energy thresholds : gamma 56.4682 keV e- 24.394 MeV e+ 22.8153 MeV proton 10 MeV Region(s) which use this couple : Calor-C @@ -999,7 +1063,7 @@ See commands in /vis/modeling/trajectories/ for other options. Run terminated. Run Summary Number of events processed : 10 - User=2.160000s Real=2.909659s Sys=0.580000s + User=0.800000s Real=1.026460s Sys=0.200000s ############################################################ Run Summary - Number of events : 10 ############################################################ @@ -1007,124 +1071,124 @@ Region : Calor-A Production thresholds : gamma 1 mm e- 1 mm e+ 1 mm Energy deposition in an event : - Absorber 2.88909 GeV Gap 358.764 MeV + Absorber 2.88218 GeV Gap 334.08 MeV Number of secondaries in an event : - gamma in Absorber 821.3 in Gap 50.8 - e- in Absorber 1365.3 in Gap 152.4 - e+ in Absorber 80.7 in Gap 2 + gamma in Absorber 813 in Gap 37 + e- in Absorber 1348.8 in Gap 131.6 + e+ in Absorber 81.2 in Gap 2 Minimum kinetic energy of generated secondaries : - gamma in Absorber 57.8745 keV in Gap 6.23047 keV - e- in Absorber 71.0546 eV in Gap 107.959 eV - e+ in Absorber 3.62931 keV in Gap 348.145 keV + gamma in Absorber 68.494 keV in Gap 6.22632 keV + e- in Absorber 32.668 eV in Gap 147.653 eV + e+ in Absorber 13.2609 keV in Gap 442.062 keV Total track length of e+/e- in an event : - Absorber 1.09825 m Gap 78.3694 cm + Absorber 1.09788 m Gap 66.3582 cm Total number of steps of e+/e- in an event : - Absorber 3539.9 Gap 578.7 + Absorber 3446 Gap 464.8 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 3011.32 785.3 1139.3 67.7 1610.57 3236 - 1 146.976 56 215.2 9 171.88 526.3 - 2 51.238 20.1 86.3 4.2 58.3627 188.7 - 3 20.3126 6.6 35 1 23.7477 78.9 - 4 5.8846 0.6 15.2 0.1 5.11367 39.2 - 5 6.12406 1.6 10.1 0.3 6.45107 19.6 - 6 2.13509 1 5.3 0.2 1.68845 11.2 - 7 1.36189 0.3 4.2 0 1.84145 7.3 - 8 1.19305 0.4 2.3 0.2 0.764237 3.8 - 9 0.496718 0.1 1.7 0 0.419235 2.7 - 10 0.251688 0.1 1 0 0.199591 1.9 - 11 0.185874 0 0.8 0 0.302454 1.2 - 12 0.188821 0 0.6 0 0.505671 0.8 - 13 0.144839 0 0.5 0 0.067562 0.7 - 14 0.00628369 0 0 0 0 0 - 15 0 0 0 0 0 0 - 16 0.0162712 0 0.1 0 0.00148589 0.2 - 17 0.0155764 0 0.1 0 0.0272741 0.1 - 18 0.00134402 0 0 0 0 0 - 19 0.000428499 0 0 0 0 0 + 0 2992.25 768.8 1114.2 69.5 1528.89 3097.4 + 1 131.181 51.5 197.9 8.6 147.12 441.7 + 2 51.1801 17.2 88.7 2.8 49.6787 195.8 + 3 19.6339 6.7 37.8 1.2 17.3827 86.4 + 4 9.63085 2.9 16.8 0.6 8.38184 38.6 + 5 5.40684 1.5 11.1 0.3 4.17141 25.4 + 6 3.25439 1 6.5 0.2 2.42414 12.5 + 7 1.42049 0.1 2.5 0 1.01326 4.9 + 8 0.967774 0.2 1.7 0 1.03948 3.1 + 9 0.445083 0 0.8 0 0.499421 1.3 + 10 0.387616 0.1 1.1 0 0.344626 1.8 + 11 0.157866 0 0.7 0 0.101626 0.9 + 12 0.0414512 0 0.1 0 0.00689201 0.2 + 13 0.140344 0 0.1 0 0.0851635 0.2 + 14 0.0170533 0 0 0 0 0 + 15 0.0444543 0 0.2 0 0.0504035 0.3 + 16 0.0141224 0 0.1 0 6.30674e-06 0.1 + 17 0.00651497 0 0 0 0 0 + 18 0.0701554 0 0.1 0 0.275212 0.2 + 19 0.00310568 0 0 0 0 0 ############################################################ Region : Calor-B Production thresholds : gamma 1 mm e- 1 mm e+ 1 mm Energy deposition in an event : - Absorber 7.44416 GeV Gap 726.28 MeV + Absorber 2.7378 GeV Gap 342.553 MeV Number of secondaries in an event : - gamma in Absorber 3348.5 in Gap 175.5 - e- in Absorber 5471 in Gap 494 - e+ in Absorber 368.6 in Gap 9.6 + gamma in Absorber 719.5 in Gap 44.3 + e- in Absorber 1231.2 in Gap 134.4 + e+ in Absorber 73.4 in Gap 2.1 Minimum kinetic energy of generated secondaries : - gamma in Absorber 23.1876 keV in Gap 6.20448 keV - e- in Absorber 115.753 eV in Gap 129.4 eV - e+ in Absorber 2.21781 keV in Gap 37.8761 keV + gamma in Absorber 101.807 keV in Gap 6.21296 keV + e- in Absorber 225.978 eV in Gap 126.374 eV + e+ in Absorber 17.9206 keV in Gap 548.831 keV Total track length of e+/e- in an event : - Absorber 4.34476 m Gap 2.56173 m + Absorber 98.9294 cm Gap 70.7441 cm Total number of steps of e+/e- in an event : - Absorber 13948.3 Gap 1744.1 + Absorber 3170.6 Gap 521.5 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 7214.91 3175.3 4419.5 315.8 5904.53 12171.5 - 1 589.802 228.7 877.1 40 632.596 2044.7 - 2 195.922 67.8 332.5 13.2 197.429 764.2 - 3 76.7946 22.7 146.5 3.6 75.1903 303.9 - 4 39.108 11.5 75.4 2.3 35.0577 155.3 - 5 22.4302 8.1 41.8 1.6 28.0088 96.8 - 6 13.2273 4.5 25.9 0.6 15.4487 61.8 - 7 7.28375 2.5 17.8 0.7 6.4346 35.5 - 8 3.62764 1.1 10.4 0.2 3.51907 17.6 - 9 2.93628 0.6 7.3 0.1 2.80315 15.4 - 10 0.947893 0.1 3.6 0 0.549729 6.6 - 11 0.991636 0.2 2.5 0 1.70112 7.3 - 12 0.389768 0 0.9 0 0.460858 3 - 13 0.984466 0.5 1.5 0.1 2.02137 4.3 - 14 0.327035 0.1 0.5 0 0.31692 1.3 - 15 0.123438 0.1 0.4 0 0.048909 0.7 - 16 0.128363 0 0.3 0 0.063795 0.4 - 17 0.0565233 0 0.1 0 0.0161249 0.2 - 18 0.0573093 0 0.1 0 0.0113214 0.2 - 19 0.0185573 0 0 0 0 0 + 0 2876.92 692.2 1038.2 62.9 1483.45 2934.9 + 1 116.04 42.3 172.3 7.4 119.19 405.8 + 2 42.4089 13.7 72.7 2.1 46.0948 164.5 + 3 24.8504 9.3 39.6 1.6 28.7404 99.2 + 4 8.07509 2.2 18.1 0.5 7.20388 35.5 + 5 6.12003 2.2 10.9 0.6 4.6046 22.8 + 6 2.41281 1 5.2 0.3 1.65911 9 + 7 2.23221 0.6 4.2 0 4.94796 13.7 + 8 0.743676 0.3 1.7 0.1 0.478964 3 + 9 0.0303462 0 0.4 0 0.00684801 0.5 + 10 0.160183 0 0.7 0 0.0618489 1 + 11 0.00126546 0 0 0 0 0 + 12 0.0353762 0 0.2 0 0.0162252 0.3 + 13 0.100353 0 0.4 0 0.184033 0.6 + 14 0.0102721 0 0 0 0 0 + 15 0.0502845 0 0.3 0 0.0147473 0.4 + 16 0.0077132 0 0 0 0 0 + 17 0.0154661 0 0.2 0 0.00116616 0.2 + 18 0.0147115 0 0 0 0 0 + 19 0.0980555 0 0.5 0 0.0798108 0.7 ############################################################ Region : Calor-C Production thresholds : gamma 10 cm e- 10 cm e+ 10 cm Energy deposition in an event : - Absorber 3.87807 GeV Gap 382.735 MeV + Absorber 2.66587 GeV Gap 292.488 MeV Number of secondaries in an event : - gamma in Absorber 362.6 in Gap 35.6 - e- in Absorber 638.8 in Gap 58.9 - e+ in Absorber 103.1 in Gap 4.6 + gamma in Absorber 128.1 in Gap 11.4 + e- in Absorber 233.1 in Gap 20.9 + e+ in Absorber 34.2 in Gap 1.4 Minimum kinetic energy of generated secondaries : - gamma in Absorber 6.91488 keV in Gap 56.8857 keV - e- in Absorber 240.969 eV in Gap 133.27 eV - e+ in Absorber 40.6578 keV in Gap 286.504 keV + gamma in Absorber 47.3342 keV in Gap 64.2915 keV + e- in Absorber 287.916 eV in Gap 340.349 eV + e+ in Absorber 13.6722 keV in Gap 322.188 keV Total track length of e+/e- in an event : - Absorber 1.03582 m Gap 67.3074 cm + Absorber 35.722 cm Gap 24.0512 cm Total number of steps of e+/e- in an event : - Absorber 1897.9 Gap 283 + Absorber 653.4 Gap 101.7 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 4061.78 361.5 486.9 92.7 1514.76 1654.9 - 1 116.35 22.1 107.8 9.2 114.792 291.8 - 2 40.8132 7.2 48.1 2.9 38.3118 114.4 - 3 17.9211 3.3 23.3 1.5 16.5888 55.2 - 4 12.5615 1.8 12.9 0.8 11.6823 30.3 - 5 4.08906 0.4 6.7 0.1 5.6335 12.4 - 6 1.92323 0.5 3.9 0.2 1.91138 6.5 - 7 2.12775 0.5 1.8 0.2 1.31103 3.9 - 8 1.23493 0.4 3 0.1 1.07528 4.6 - 9 0.698836 0 1 0 0.431869 2 - 10 0.143589 0.1 0.4 0 0.358136 0.8 - 11 0.644106 0 0.9 0 1.88087 2.4 - 12 0.112918 0 0.2 0 0.0462299 0.4 - 13 0.026215 0 0 0 0 0 - 14 0.0101137 0 0 0 0 0 - 15 0.0247276 0 0.1 0 0.0123477 0.1 - 16 0.107478 0.2 0.3 0 0.0488848 0.5 - 17 0.0662149 0 0.1 0 0.00798934 0.2 - 18 0.123813 0.2 0.3 0 0.0433378 0.5 - 19 0.0145266 0 0 0 0 0 + 0 2891.97 124.7 172.3 31 523.067 563.2 + 1 35.3582 6.6 38.4 2.6 42.494 97.1 + 2 14.368 2.1 16.8 1 15.284 40.3 + 3 5.43382 1.4 9.2 0.4 5.41965 17.8 + 4 2.49981 1.1 5 0.3 2.89238 8.5 + 5 2.6112 0.6 2.9 0.1 3.66956 5.4 + 6 2.15936 0.6 2.4 0.1 1.64922 7.4 + 7 1.5693 1.2 3.1 0 1.85475 5 + 8 0.526103 0.4 1 0 0.29614 1.7 + 9 0.48036 0.2 0.8 0.1 0.240574 1.8 + 10 0.452177 0.4 0.8 0 0.225895 2.3 + 11 0.0884186 0 0.6 0 0.0347529 3.5 + 12 0.0218552 0 0 0 0 0 + 13 0.0248538 0 0 0 0 0 + 14 0.0373057 0 0 0 0 0 + 15 0.0139608 0 0 0 0 0 + 16 0.0217585 0 0 0 0 0 + 17 0.0171414 0 0 0 0 0 + 18 0.0522284 0 0.1 0 0.0181961 0.2 + 19 0.180057 0.2 0.2 0 0.268289 0.3 ############################################################ 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. @@ -1136,49 +1200,49 @@ layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt Index : 0 used in the geometry : Yes Material : Galactic Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Lead Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 101.843 keV e- 1.36749 MeV e+ 1.27862 MeV proton 100 keV + Energy thresholds : gamma 101.8 keV e- 1.37159 MeV e+ 1.2826 MeV proton 100 keV Region(s) which use this couple : Calor-A Index : 2 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 6.19986 keV e- 344.855 keV e+ 333.46 keV proton 100 keV + Energy thresholds : gamma 6.18824 keV e- 346.458 keV e+ 335.417 keV proton 100 keV Region(s) which use this couple : Calor-A Index : 3 used in the geometry : Yes Material : Lead Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 101.843 keV e- 1.36749 MeV e+ 1.27862 MeV proton 100 keV + Energy thresholds : gamma 101.8 keV e- 1.37159 MeV e+ 1.2826 MeV proton 100 keV Region(s) which use this couple : Calor-B Index : 4 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 6.19986 keV e- 344.855 keV e+ 333.46 keV proton 100 keV + Energy thresholds : gamma 6.18824 keV e- 346.458 keV e+ 335.417 keV proton 100 keV Region(s) which use this couple : Calor-B Index : 5 used in the geometry : Yes Material : Lead Range cuts : gamma 10 cm e- 10 cm e+ 10 cm proton 10 cm - Energy thresholds : gamma 2.21848 MeV e- 430.674 MeV e+ 408.132 MeV proton 10 MeV + Energy thresholds : gamma 2.1815 MeV e- 434.385 MeV e+ 405.822 MeV proton 10 MeV Region(s) which use this couple : Calor-C Index : 6 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 10 cm e- 10 cm e+ 10 cm proton 10 cm - Energy thresholds : gamma 56.567 keV e- 24.5965 MeV e+ 22.6909 MeV proton 10 MeV + Energy thresholds : gamma 56.4682 keV e- 24.394 MeV e+ 22.8153 MeV proton 10 MeV Region(s) which use this couple : Calor-C @@ -1228,421 +1292,54 @@ Region -- -- appears in world volume Production cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm /run/beamOn 10 -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - ========= Table of registered couples ============================ Index : 0 used in the geometry : Yes Material : Galactic Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Lead Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 47.1807 keV e- 384 keV e+ 371.312 keV proton 20 keV + Energy thresholds : gamma 47.4695 keV e- 385.269 keV e+ 369.258 keV proton 20 keV Region(s) which use this couple : Calor-A Index : 2 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 2.80544 keV e- 124.173 keV e+ 122.515 keV proton 20 keV + Energy thresholds : gamma 2.80452 keV e- 124.86 keV e+ 122.461 keV proton 20 keV Region(s) which use this couple : Calor-A Index : 3 used in the geometry : Yes Material : Lead Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 120.879 keV e- 2.64203 MeV e+ 2.43733 MeV proton 200 keV + Energy thresholds : gamma 120.814 keV e- 2.63486 MeV e+ 2.44154 MeV proton 200 keV Region(s) which use this couple : Calor-B Index : 4 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 8.73423 keV e- 567.027 keV e+ 540.972 keV proton 200 keV + Energy thresholds : gamma 8.70369 keV e- 565.299 keV e+ 542.893 keV proton 200 keV Region(s) which use this couple : Calor-B Index : 5 used in the geometry : Yes Material : Lead Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 419.056 keV e- 35.1199 MeV e+ 32.6175 MeV proton 2 MeV + Energy thresholds : gamma 420.413 keV e- 35.3541 MeV e+ 32.7569 MeV proton 2 MeV Region(s) which use this couple : Calor-C Index : 6 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 27.0103 keV e- 4.22893 MeV e+ 4.00759 MeV proton 2 MeV + Energy thresholds : gamma 26.998 keV e- 4.26714 MeV e+ 3.98966 MeV proton 2 MeV Region(s) which use this couple : Calor-C @@ -1652,7 +1349,7 @@ Index : 6 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 10 - User=1.050000s Real=1.356878s Sys=0.300000s + User=1.300000s Real=1.662707s Sys=0.330000s ############################################################ Run Summary - Number of events : 10 ############################################################ @@ -1660,124 +1357,124 @@ Region : Calor-A Production thresholds : gamma 200 um e- 200 um e+ 200 um Energy deposition in an event : - Absorber 3.09512 GeV Gap 391.358 MeV + Absorber 3.70011 GeV Gap 444.579 MeV Number of secondaries in an event : - gamma in Absorber 1192.8 in Gap 70 - e- in Absorber 2056.6 in Gap 270.5 - e+ in Absorber 94.1 in Gap 3.5 + gamma in Absorber 1670.5 in Gap 94.5 + e- in Absorber 2766.4 in Gap 346.7 + e+ in Absorber 131.1 in Gap 4.4 Minimum kinetic energy of generated secondaries : - gamma in Absorber 23.8648 keV in Gap 2.82828 keV - e- in Absorber 2.89786 eV in Gap 24.4086 eV - e+ in Absorber 12.2738 keV in Gap 211.484 keV + gamma in Absorber 47.4724 keV in Gap 2.80962 keV + e- in Absorber 8.77761 eV in Gap 20.2252 eV + e+ in Absorber 9.7329 keV in Gap 54.734 keV Total track length of e+/e- in an event : - Absorber 1.31476 m Gap 96.9237 cm + Absorber 1.79163 m Gap 1.25065 m Total number of steps of e+/e- in an event : - Absorber 5084.8 Gap 779.2 + Absorber 6938.8 Gap 1038.2 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 3161.32 1118.6 1822.5 80.2 1953.42 4715.1 - 1 194.264 89.9 276.2 10.7 210.277 663.3 - 2 66.1034 30.9 113.5 3.4 63.205 252.9 - 3 27.0573 11.8 52.5 1.9 25.2481 107.2 - 4 21.6733 5.5 28.3 0.6 15.3593 55.5 - 5 6.18948 2.8 14.2 0.5 4.9463 26.9 - 6 5.20564 1.8 10.4 0.3 5.55126 23 - 7 1.8765 0.3 3.1 0 1.34374 7.9 - 8 0.340135 0.1 1.4 0 0.751336 2.8 - 9 0.337399 0.2 1.1 0 0.159179 2.1 - 10 0.933652 0.2 1.7 0 3.04562 3 - 11 0.188109 0.3 0.6 0 0.0783955 1.5 - 12 0.427863 0.3 1 0 0.306104 1.8 - 13 0.343201 0.1 0.4 0 0.254492 0.7 - 14 0.109473 0 0.2 0 0.0508631 0.3 - 15 0.00933149 0 0 0 0 0 - 16 0.0105596 0 0 0 0 0 - 17 0.00746395 0 0 0 0 0 - 18 0.0126043 0 0 0 0 0 - 19 0.0146859 0 0 0 0 0 + 0 3803.17 1598.4 2480.3 113.9 2676.98 6525.4 + 1 211.072 106.3 364.4 13.4 233.901 855.6 + 2 61.7518 29.8 128.5 3.3 62.4489 292.2 + 3 27.2898 11.6 57.3 2 26.8312 123.4 + 4 16.0011 6.6 30.7 1.1 16.4332 65.2 + 5 11.7206 4.7 19.3 0.6 12.5107 43.5 + 6 5.29584 2.4 11.6 0.4 5.27577 24.5 + 7 3.42604 1.7 7.2 0.3 4.01323 15 + 8 1.25056 0.6 3.9 0.1 1.28624 6.5 + 9 0.712869 0.5 2.5 0 0.516178 6.1 + 10 1.94773 1.8 4.7 0.3 1.44879 12.7 + 11 0.0476792 0 0.3 0 0.00430612 0.5 + 12 0.268884 0.2 0.9 0 0.156375 3.9 + 13 0.164254 0 0.3 0 0.223856 0.6 + 14 0.054208 0 0.3 0 0.0326655 0.3 + 15 0.0139626 0 0 0 0 0 + 16 0.10906 0 0.2 0 0.0491916 0.4 + 17 0.185177 0.2 0.3 0.1 0.100951 0.6 + 18 0.00895042 0 0 0 0 0 + 19 0.0104449 0 0 0 0 0 ############################################################ Region : Calor-B Production thresholds : gamma 2 mm e- 2 mm e+ 2 mm Energy deposition in an event : - Absorber 2.67486 GeV Gap 347.623 MeV + Absorber 2.6517 GeV Gap 329.292 MeV Number of secondaries in an event : - gamma in Absorber 644.6 in Gap 41.6 - e- in Absorber 1095.2 in Gap 116.5 - e+ in Absorber 72.5 in Gap 1.7 + gamma in Absorber 631.3 in Gap 31.5 + e- in Absorber 1054.1 in Gap 106.9 + e+ in Absorber 68.2 in Gap 2.1 Minimum kinetic energy of generated secondaries : - gamma in Absorber 6.74171 keV in Gap 8.88744 keV - e- in Absorber 253.032 eV in Gap 209.419 eV - e+ in Absorber 5.39414 keV in Gap 837.4 keV + gamma in Absorber 110.685 keV in Gap 8.84673 keV + e- in Absorber 104.181 eV in Gap 135.789 eV + e+ in Absorber 8.09808 keV in Gap 84.0128 keV Total track length of e+/e- in an event : - Absorber 89.9437 cm Gap 71.603 cm + Absorber 87.6112 cm Gap 61.1413 cm Total number of steps of e+/e- in an event : - Absorber 2781.4 Gap 437.1 + Absorber 2680.5 Gap 375.5 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 2810.06 618.1 881.9 60.6 1392.07 2467.4 - 1 129.604 42.3 184.1 7.3 133.423 406 - 2 46.3093 15.1 74.3 3.5 51.2429 178.2 - 3 16.6149 5.9 32.7 1.5 17.0694 77.3 - 4 8.16337 2.1 15.9 0.7 11.0301 40.6 - 5 5.68264 1.7 9.9 0.4 4.37528 21 - 6 1.49847 0.4 5.1 0.1 1.08579 7.9 - 7 2.23612 0.6 3.1 0.1 1.85341 9.1 - 8 0.507934 0 1.9 0 0.552848 3.8 - 9 0.854794 0 1.5 0 0.841898 4.4 - 10 0.183021 0 0.4 0 0.131506 0.7 - 11 0.0562841 0 0.1 0 0.0908611 0.1 - 12 0.00426448 0 0 0 0 0 - 13 0.0658397 0 0.3 0 0.0470303 0.4 - 14 0.224373 0 0.3 0 0.426187 0.7 - 15 0.00703852 0 0 0 0 0 - 16 0.354568 0 0.2 0 1.22961 0.9 - 17 0.0143108 0 0 0 0 0 - 18 0.0173906 0 0 0 0 0 - 19 0.0104141 0 0 0 0 0 + 0 2769.75 589.2 837.4 56.8 1253.2 2336.2 + 1 127.752 45.7 172 8.5 153.995 405.6 + 2 45.0527 14.1 76.1 2.7 49.5359 167.1 + 3 18.1872 5.8 33.8 1 15.4304 66.6 + 4 8.19202 3.2 15.6 0.5 6.31064 35.8 + 5 5.60734 1.9 10.4 0.5 4.19495 17.5 + 6 1.33189 0.4 4 0.1 0.799537 7.6 + 7 1.19624 0.4 4 0 0.732647 5.8 + 8 1.83921 1.2 3.3 0.2 1.10298 6.4 + 9 0.595264 0 1 0 1.4906 1.9 + 10 0.902553 0.7 2 0 0.564225 3.5 + 11 0.161517 0 0.4 0 0.0640646 0.6 + 12 0.0537411 0 0.2 0 0.0041969 0.3 + 13 0.0940009 0.2 0.3 0 0.0186484 0.5 + 14 0.0326054 0 0 0 0 0 + 15 0.0303653 0 0 0 0 0 + 16 0.0465357 0 0.2 0 0.0141026 0.3 + 17 0.0705307 0 0.3 0 0.0706971 0.3 + 18 0.011752 0 0 0 0 0 + 19 0.0161871 0 0 0 0 0 ############################################################ Region : Calor-C Production thresholds : gamma 2 cm e- 2 cm e+ 2 cm Energy deposition in an event : - Absorber 2.61966 GeV Gap 326.447 MeV + Absorber 2.90678 GeV Gap 333.39 MeV Number of secondaries in an event : - gamma in Absorber 349.8 in Gap 27.5 - e- in Absorber 674.9 in Gap 60.3 - e+ in Absorber 62.1 in Gap 2.2 + gamma in Absorber 464.8 in Gap 29.5 + e- in Absorber 869.8 in Gap 78.4 + e+ in Absorber 83.5 in Gap 2.7 Minimum kinetic energy of generated secondaries : - gamma in Absorber 4.70969 keV in Gap 28.7438 keV - e- in Absorber 286.501 eV in Gap 162.209 eV - e+ in Absorber 11.4453 keV in Gap 519.01 keV + gamma in Absorber 266.52 keV in Gap 27.0114 keV + e- in Absorber 376.409 eV in Gap 111.39 eV + e+ in Absorber 14.0459 keV in Gap 362.563 keV Total track length of e+/e- in an event : - Absorber 68.8777 cm Gap 48.1986 cm + Absorber 89.9405 cm Gap 53.7797 cm Total number of steps of e+/e- in an event : - Absorber 1692.4 Gap 243 + Absorber 2212.2 Gap 302.4 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 2774.22 340.1 500.5 52.8 997.723 1433.2 - 1 107.09 24.2 133.1 7.2 106.185 298.8 - 2 35.8158 8.4 53.6 2.8 35.1353 106.7 - 3 15.494 2.3 23.8 0.8 19.0603 49.7 - 4 5.52732 0.7 8.7 0.1 5.49 19.9 - 5 2.68308 0.3 5.2 0.1 2.79987 9 - 6 2.66856 0.6 4.9 0.3 2.11952 9 - 7 0.758663 0.2 1.4 0.1 0.644703 2.4 - 8 0.437455 0 1.1 0 0.539359 1.8 - 9 0.532251 0 0.9 0 0.306882 1.5 - 10 0.544465 0.5 1.1 0.1 0.663989 2.2 - 11 0.130117 0 0.6 0 0.054147 0.8 - 12 0.0978788 0 0.3 0 0.0414581 0.4 - 13 0.0119981 0 0 0 0 0 - 14 0.0363879 0 0 0 0 0 - 15 0.0139563 0 0 0 0 0 - 16 0.0070533 0 0 0 0 0 - 17 0.00588973 0 0 0 0 0 - 18 0.00997559 0 0 0 0 0 - 19 0.0107503 0 0 0 0 0 + 0 3019.52 445.3 645.7 71.8 1208.61 1825.4 + 1 130.22 32.3 161.9 9.3 133.11 394.4 + 2 46.9924 8.9 66.1 2.6 48.8112 140.1 + 3 22.7699 4.5 39.2 1.6 22.5289 81.4 + 4 10.0224 1.2 14.8 0.3 12.026 29.6 + 5 4.28245 1 8 0.3 4.75521 14.7 + 6 3.18571 0.9 5.2 0.3 3.93611 11.4 + 7 1.38244 0 3 0 1.60071 10.2 + 8 0.336098 0.1 1.2 0 0.21093 1.7 + 9 0.209604 0 0.2 0 0.129014 0.4 + 10 0.0602302 0 0.4 0 0.00830713 0.8 + 11 0.166784 0 0.5 0 0.565144 1.2 + 12 0.190706 0 0.5 0 0.460823 0.8 + 13 0.109037 0 0.5 0 0.0424065 0.6 + 14 0.192283 0.1 0.5 0 0.0884938 1 + 15 0.0318805 0 0.1 0 0.0125788 0.1 + 16 0.352499 0 0.2 0 0.232637 0.5 + 17 0.129663 0 0.2 0 0.0749984 0.3 + 18 0.00265214 0 0 0 0 0 + 19 0.00672161 0 0 0 0 0 ############################################################ 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. @@ -1789,49 +1486,49 @@ layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt Index : 0 used in the geometry : Yes Material : Galactic Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : Lead Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 47.1807 keV e- 384 keV e+ 371.312 keV proton 20 keV + Energy thresholds : gamma 47.4695 keV e- 385.269 keV e+ 369.258 keV proton 20 keV Region(s) which use this couple : Calor-A Index : 2 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 2.80544 keV e- 124.173 keV e+ 122.515 keV proton 20 keV + Energy thresholds : gamma 2.80452 keV e- 124.86 keV e+ 122.461 keV proton 20 keV Region(s) which use this couple : Calor-A Index : 3 used in the geometry : Yes Material : Lead Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 120.879 keV e- 2.64203 MeV e+ 2.43733 MeV proton 200 keV + Energy thresholds : gamma 120.814 keV e- 2.63486 MeV e+ 2.44154 MeV proton 200 keV Region(s) which use this couple : Calor-B Index : 4 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 8.73423 keV e- 567.027 keV e+ 540.972 keV proton 200 keV + Energy thresholds : gamma 8.70369 keV e- 565.299 keV e+ 542.893 keV proton 200 keV Region(s) which use this couple : Calor-B Index : 5 used in the geometry : Yes Material : Lead Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 419.056 keV e- 35.1199 MeV e+ 32.6175 MeV proton 2 MeV + Energy thresholds : gamma 420.413 keV e- 35.3541 MeV e+ 32.7569 MeV proton 2 MeV Region(s) which use this couple : Calor-C Index : 6 used in the geometry : Yes Material : liquidArgon Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 27.0103 keV e- 4.22893 MeV e+ 4.00759 MeV proton 2 MeV + Energy thresholds : gamma 26.998 keV e- 4.26714 MeV e+ 3.98966 MeV proton 2 MeV Region(s) which use this couple : Calor-C @@ -1882,451 +1579,84 @@ Region -- -- appears in world volume Production cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm /run/beamOn 10 -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - ========= Table of registered couples ============================ Index : 0 used in the geometry : Yes Material : Galactic Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : No Material : Lead Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 47.1807 keV e- 384 keV e+ 371.312 keV proton 20 keV + Energy thresholds : gamma 47.4695 keV e- 385.269 keV e+ 369.258 keV proton 20 keV Index : 2 used in the geometry : No Material : liquidArgon Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 2.80544 keV e- 124.173 keV e+ 122.515 keV proton 20 keV + Energy thresholds : gamma 2.80452 keV e- 124.86 keV e+ 122.461 keV proton 20 keV Index : 3 used in the geometry : No Material : Lead Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 120.879 keV e- 2.64203 MeV e+ 2.43733 MeV proton 200 keV + Energy thresholds : gamma 120.814 keV e- 2.63486 MeV e+ 2.44154 MeV proton 200 keV Index : 4 used in the geometry : No Material : liquidArgon Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 8.73423 keV e- 567.027 keV e+ 540.972 keV proton 200 keV + Energy thresholds : gamma 8.70369 keV e- 565.299 keV e+ 542.893 keV proton 200 keV Index : 5 used in the geometry : No Material : Lead Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 419.056 keV e- 35.1199 MeV e+ 32.6175 MeV proton 2 MeV + Energy thresholds : gamma 420.413 keV e- 35.3541 MeV e+ 32.7569 MeV proton 2 MeV Index : 6 used in the geometry : No Material : liquidArgon Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 27.0103 keV e- 4.22893 MeV e+ 4.00759 MeV proton 2 MeV + Energy thresholds : gamma 26.998 keV e- 4.26714 MeV e+ 3.98966 MeV proton 2 MeV Index : 7 used in the geometry : Yes Material : Aluminium Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 3.25242 keV e- 200.096 keV e+ 196.103 keV proton 20 keV + Energy thresholds : gamma 3.24445 keV e- 200.856 keV e+ 196.179 keV proton 20 keV Region(s) which use this couple : Calor-A Index : 8 used in the geometry : Yes Material : Water Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 1.48165 keV e- 128.416 keV e+ 125.853 keV proton 20 keV + Energy thresholds : gamma 1.48803 keV e- 127.8 keV e+ 125.72 keV proton 20 keV Region(s) which use this couple : Calor-A Index : 9 used in the geometry : Yes Material : Aluminium Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 9.59585 keV e- 1.03121 MeV e+ 977.24 keV proton 200 keV + Energy thresholds : gamma 9.5836 keV e- 1.02736 MeV e+ 978.45 keV proton 200 keV Region(s) which use this couple : Calor-B Index : 10 used in the geometry : Yes Material : Water Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 3.92577 keV e- 570.85 keV e+ 548.291 keV proton 200 keV + Energy thresholds : gamma 3.93359 keV e- 570.74 keV e+ 551.016 keV proton 200 keV Region(s) which use this couple : Calor-B Index : 11 used in the geometry : Yes Material : Aluminium Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 28.1217 keV e- 9.47216 MeV e+ 8.85655 MeV proton 2 MeV + Energy thresholds : gamma 28.2387 keV e- 9.46673 MeV e+ 8.85305 MeV proton 2 MeV Region(s) which use this couple : Calor-C Index : 12 used in the geometry : Yes Material : Water Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 10.4017 keV e- 4.22893 MeV e+ 3.95409 MeV proton 2 MeV + Energy thresholds : gamma 10.4337 keV e- 4.1971 MeV e+ 3.95504 MeV proton 2 MeV Region(s) which use this couple : Calor-C @@ -2336,7 +1666,7 @@ Index : 12 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 10 - User=0.390000s Real=0.516810s Sys=0.110000s + User=0.570000s Real=1.019958s Sys=0.180000s ############################################################ Run Summary - Number of events : 10 ############################################################ @@ -2344,124 +1674,124 @@ Region : Calor-A Production thresholds : gamma 200 um e- 200 um e+ 200 um Energy deposition in an event : - Absorber 578.842 MeV Gap 255.114 MeV + Absorber 544.496 MeV Gap 238.018 MeV Number of secondaries in an event : - gamma in Absorber 40 in Gap 13.4 - e- in Absorber 298.9 in Gap 155.3 - e+ in Absorber 1.2 in Gap 0.6 + gamma in Absorber 36.5 in Gap 9.1 + e- in Absorber 255.2 in Gap 134.1 + e+ in Absorber 0.9 in Gap 0.2 Minimum kinetic energy of generated secondaries : - gamma in Absorber 3.30067 keV in Gap 1.74684 keV - e- in Absorber 110.16 eV in Gap 122.61 eV - e+ in Absorber 354.718 keV in Gap 1.09512 MeV + gamma in Absorber 3.29431 keV in Gap 1.60029 keV + e- in Absorber 138.896 eV in Gap 133.417 eV + e+ in Absorber 930.157 keV in Gap 28.5088 MeV Total track length of e+/e- in an event : - Absorber 45.8035 cm Gap 43.6117 cm + Absorber 37.3857 cm Gap 33.9766 cm Total number of steps of e+/e- in an event : - Absorber 590.3 Gap 325.8 + Absorber 506.8 Gap 282.1 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 788.019 45 276.8 0.8 761.543 637.7 - 1 27.7584 5.5 42.3 0.6 86.8682 87 - 2 6.6002 1.3 31.9 0.1 18.7619 48.2 - 3 1.21911 0.1 19.3 0 2.48367 24.2 - 4 1.29842 0 14.5 0 3.12548 18.5 - 5 4.16086 0.8 15.7 0.2 12.6769 22.8 - 6 0.903898 0.2 11.6 0 1.33745 14.9 - 7 0.457063 0 6.9 0 0.679244 8.5 - 8 1.94366 0.5 7.6 0.1 4.42845 10.8 - 9 0.483533 0 6.5 0 0.988893 13 - 10 0.167292 0 3.7 0 0.16426 7.9 - 11 0.286327 0 4 0 0.423589 4.5 - 12 0.0684529 0 2.3 0 0.0387681 2.7 - 13 0.158078 0 2.2 0 0.149885 2.5 - 14 0.109578 0 1.4 0 0.174596 1.9 - 15 0.0868853 0 1.8 0 0.0509368 2 - 16 0.0584419 0 1.2 0 0.0473155 1.3 - 17 0.0137855 0 1.2 0 0.00299711 1.3 - 18 0.0710741 0 1.1 0 0.0869828 1.5 - 19 0.0117153 0 0.6 0 0.00485675 0.6 + 0 750.538 38.2 253.5 0.8 624.278 577.5 + 1 18.7238 5 31.4 0.2 57.6907 67.8 + 2 5.89708 1.2 20.7 0 15.214 30.9 + 3 0.780213 0.1 13.7 0 1.17857 16.3 + 4 1.20702 0.2 16.6 0 3.37127 23.2 + 5 1.4478 0.3 12.5 0.1 3.52812 16.6 + 6 0.671168 0.1 9.6 0 0.954346 12.8 + 7 1.18552 0.4 6.2 0 2.7361 9 + 8 0.627528 0 7.2 0 1.26178 11.2 + 9 0.163731 0 3.2 0 0.289663 3.7 + 10 0.0599371 0 2.5 0 0.0302521 2.5 + 11 0.38728 0.1 3.4 0 0.652154 4.3 + 12 0.174357 0 0.9 0 0.694443 1.3 + 13 0.178547 0 1 0 0.834733 1.5 + 14 0.0489033 0 1 0 0.0661933 1 + 15 0.026527 0 0.7 0 0.0165894 0.9 + 16 0.0457429 0 1 0 0.0408962 1.3 + 17 0.159954 0 0.8 0 0.517653 1.7 + 18 0.109432 0 2.2 0 0.170635 4.2 + 19 0.0397761 0 0.4 0 0.0528977 0.4 ############################################################ Region : Calor-B Production thresholds : gamma 2 mm e- 2 mm e+ 2 mm Energy deposition in an event : - Absorber 559.741 MeV Gap 250.341 MeV + Absorber 1.36878 GeV Gap 572.126 MeV Number of secondaries in an event : - gamma in Absorber 28.7 in Gap 8.9 - e- in Absorber 148.8 in Gap 72.4 - e+ in Absorber 0.7 in Gap 0.6 + gamma in Absorber 236.9 in Gap 66 + e- in Absorber 1333.9 in Gap 512.1 + e+ in Absorber 18.2 in Gap 5 Minimum kinetic energy of generated secondaries : - gamma in Absorber 9.92738 keV in Gap 3.93075 keV - e- in Absorber 100.237 eV in Gap 140.691 eV - e+ in Absorber 531.398 keV in Gap 506.692 keV + gamma in Absorber 9.62627 keV in Gap 3.94655 keV + e- in Absorber 103.214 eV in Gap 112.401 eV + e+ in Absorber 104.278 keV in Gap 272.644 keV Total track length of e+/e- in an event : - Absorber 34.1908 cm Gap 37.2044 cm + Absorber 2.19296 m Gap 2.04213 m Total number of steps of e+/e- in an event : - Absorber 336.1 Gap 188.5 + Absorber 2466.1 Gap 1058.4 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 767.123 29.1 79.2 0.5 579.233 306.4 - 1 27.612 5.5 28.8 0.5 95.4418 63.2 - 2 4.85148 1 22.2 0.1 16.4692 33.1 - 3 2.57979 0.6 15.7 0.1 5.67462 22.1 - 4 2.43924 0.7 14.9 0 5.15351 23.4 - 5 2.62789 0.6 12.7 0.1 7.91427 17.9 - 6 0.536158 0 11.5 0 0.769802 13.2 - 7 0.633056 0 7.5 0 1.18196 9.7 - 8 0.396787 0 8 0 0.449415 10.1 - 9 0.298802 0 6.1 0 0.281145 8.2 - 10 0.0894024 0 1.6 0 0.0628907 2 - 11 0.0555157 0 1.6 0 0.0330427 1.9 - 12 0.184314 0 0.9 0 0.502122 1.2 - 13 0.0595431 0 1.6 0 0.0433612 1.9 - 14 0.142464 0 2.5 0 0.186066 2.9 - 15 0.0741386 0 1.8 0 0.0477672 2 - 16 0.172825 0 2.7 0 0.195246 2.9 - 17 0.153289 0.1 1 0 0.253943 1.6 - 18 0 0 0 0 0 0 - 19 0.0500571 0 0.7 0 0.0572926 0.7 + 0 1490.03 208.5 361.3 14 2904.61 1237.5 + 1 205.816 47 269.3 3 670.104 564.6 + 2 83.6836 18.3 235.5 2.2 247.087 385.7 + 3 54.5784 11.1 205.4 1.1 146.822 301.7 + 4 32.7444 5.7 160.9 1 92.7987 226.5 + 5 24.2211 4.9 133.4 0.8 64.3918 188.7 + 6 14.0122 2 105 0.2 35.7691 141.6 + 7 10.4495 1.4 83.1 0.4 24.3037 109.1 + 8 7.06407 1.8 69.1 0.2 17.0327 88.7 + 9 5.53367 0.9 52.7 0.1 10.6945 69.8 + 10 2.69428 0.1 38.9 0.1 3.99993 48.2 + 11 1.83051 0.2 34 0 1.69565 40.3 + 12 1.09147 0.1 20.7 0 1.38055 24.5 + 13 1.97994 0.2 19.7 0 2.62111 23.6 + 14 1.26544 0.2 12.1 0 3.35914 16.1 + 15 1.37565 0.4 12.7 0.1 3.902 17.1 + 16 0.670062 0 8.1 0 1.15276 10.3 + 17 0.571931 0.1 7.6 0 1.28378 10.7 + 18 0.404991 0 6.5 0 0.702415 7.9 + 19 0.128796 0 3.8 0 0.0901017 4.2 ############################################################ Region : Calor-C Production thresholds : gamma 2 cm e- 2 cm e+ 2 cm Energy deposition in an event : - Absorber 1.09293 GeV Gap 461.495 MeV + Absorber 628.917 MeV Gap 271.314 MeV Number of secondaries in an event : - gamma in Absorber 132.7 in Gap 40.3 - e- in Absorber 755.9 in Gap 286 - e+ in Absorber 11.6 in Gap 2.2 + gamma in Absorber 32.1 in Gap 11.3 + e- in Absorber 180.9 in Gap 81.7 + e+ in Absorber 2.4 in Gap 0.6 Minimum kinetic energy of generated secondaries : - gamma in Absorber 28.8627 keV in Gap 10.537 keV - e- in Absorber 108.963 eV in Gap 106.385 eV - e+ in Absorber 327.537 keV in Gap 603.41 keV + gamma in Absorber 28.4073 keV in Gap 11.5148 keV + e- in Absorber 133.463 eV in Gap 131.947 eV + e+ in Absorber 324.524 keV in Gap 390.312 keV Total track length of e+/e- in an event : - Absorber 1.3657 m Gap 1.33511 m + Absorber 36.1013 cm Gap 36.5893 cm Total number of steps of e+/e- in an event : - Absorber 1326.6 Gap 543.5 + Absorber 328.3 Gap 153.5 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 1313.29 132.3 190.8 10 2017.82 629 - 1 125.624 22.1 171.4 1.5 386.889 327.1 - 2 49.6412 8.8 142.4 1 146.054 221 - 3 24.0829 4.2 111.3 0.5 61.8149 154.3 - 4 14.8512 1.8 96.8 0.4 34.42 128.4 - 5 7.45825 1.6 75.6 0.2 14.6783 93.2 - 6 4.42339 0.6 56.7 0 8.74605 70.3 - 7 2.97196 0.3 45.3 0 4.78645 56.2 - 8 2.92117 0.2 34.8 0 5.38045 43.7 - 9 1.67371 0.1 28.7 0 2.61143 37.6 - 10 1.03187 0 22 0 1.31492 26.4 - 11 0.83959 0 13.8 0 1.20126 17.2 - 12 1.69253 0.5 12.4 0.1 3.7425 15.5 - 13 1.0782 0.1 10.7 0 3.12558 14.7 - 14 0.425603 0 7.3 0 0.9223 8.8 - 15 0.225431 0 4.2 0 0.22131 4.9 - 16 0.234114 0 3.7 0 0.216035 4.6 - 17 0.515224 0.3 3.3 0.1 2.82847 4.2 - 18 0.598412 0.1 2.3 0 2.59222 3.4 - 19 0.243562 0 2.1 0 0.464782 2.4 + 0 826.323 31.5 48.2 1.7 517.779 159.5 + 1 37.6782 7 37.4 0.5 107.884 76.8 + 2 10.3815 1.8 34.6 0.5 29.5154 52.1 + 3 8.86786 1.5 34.7 0 23.1929 51.6 + 4 8.24276 1.2 26.1 0.2 26.1216 36.8 + 5 4.0233 0.4 20 0.1 11.8019 28.2 + 6 1.13286 0 13.6 0 3.13974 16.7 + 7 0.863013 0 11 0 2.34954 12.9 + 8 0.448797 0 5.5 0 1.25185 7.7 + 9 0.321416 0 7.7 0 0.27561 8.3 + 10 0.289042 0 6.4 0 0.215097 9.4 + 11 0.199496 0 3.6 0 0.348265 4.1 + 12 0.108942 0 3.2 0 0.06707 3.8 + 13 0.0976274 0 2.2 0 0.064145 2.6 + 14 0.274965 0 1.8 0 0.486166 2.6 + 15 0.031145 0 1.6 0 0.0126054 1.8 + 16 0.0779399 0 0.9 0 0.0778902 0.9 + 17 0.108303 0 0.9 0 0.274519 1.2 + 18 0.431564 0 1.4 0 0.952299 2 + 19 0.28257 0 0.9 0 1.04311 1.9 ############################################################ 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. @@ -2473,79 +1803,79 @@ layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt Index : 0 used in the geometry : Yes Material : Galactic Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : No Material : Lead Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 47.1807 keV e- 384 keV e+ 371.312 keV proton 20 keV + Energy thresholds : gamma 47.4695 keV e- 385.269 keV e+ 369.258 keV proton 20 keV Index : 2 used in the geometry : No Material : liquidArgon Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 2.80544 keV e- 124.173 keV e+ 122.515 keV proton 20 keV + Energy thresholds : gamma 2.80452 keV e- 124.86 keV e+ 122.461 keV proton 20 keV Index : 3 used in the geometry : No Material : Lead Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 120.879 keV e- 2.64203 MeV e+ 2.43733 MeV proton 200 keV + Energy thresholds : gamma 120.814 keV e- 2.63486 MeV e+ 2.44154 MeV proton 200 keV Index : 4 used in the geometry : No Material : liquidArgon Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 8.73423 keV e- 567.027 keV e+ 540.972 keV proton 200 keV + Energy thresholds : gamma 8.70369 keV e- 565.299 keV e+ 542.893 keV proton 200 keV Index : 5 used in the geometry : No Material : Lead Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 419.056 keV e- 35.1199 MeV e+ 32.6175 MeV proton 2 MeV + Energy thresholds : gamma 420.413 keV e- 35.3541 MeV e+ 32.7569 MeV proton 2 MeV Index : 6 used in the geometry : No Material : liquidArgon Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 27.0103 keV e- 4.22893 MeV e+ 4.00759 MeV proton 2 MeV + Energy thresholds : gamma 26.998 keV e- 4.26714 MeV e+ 3.98966 MeV proton 2 MeV Index : 7 used in the geometry : Yes Material : Aluminium Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 3.25242 keV e- 200.096 keV e+ 196.103 keV proton 20 keV + Energy thresholds : gamma 3.24445 keV e- 200.856 keV e+ 196.179 keV proton 20 keV Region(s) which use this couple : Calor-A Index : 8 used in the geometry : Yes Material : Water Range cuts : gamma 200 um e- 200 um e+ 200 um proton 200 um - Energy thresholds : gamma 1.48165 keV e- 128.416 keV e+ 125.853 keV proton 20 keV + Energy thresholds : gamma 1.48803 keV e- 127.8 keV e+ 125.72 keV proton 20 keV Region(s) which use this couple : Calor-A Index : 9 used in the geometry : Yes Material : Aluminium Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 9.59585 keV e- 1.03121 MeV e+ 977.24 keV proton 200 keV + Energy thresholds : gamma 9.5836 keV e- 1.02736 MeV e+ 978.45 keV proton 200 keV Region(s) which use this couple : Calor-B Index : 10 used in the geometry : Yes Material : Water Range cuts : gamma 2 mm e- 2 mm e+ 2 mm proton 2 mm - Energy thresholds : gamma 3.92577 keV e- 570.85 keV e+ 548.291 keV proton 200 keV + Energy thresholds : gamma 3.93359 keV e- 570.74 keV e+ 551.016 keV proton 200 keV Region(s) which use this couple : Calor-B Index : 11 used in the geometry : Yes Material : Aluminium Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 28.1217 keV e- 9.47216 MeV e+ 8.85655 MeV proton 2 MeV + Energy thresholds : gamma 28.2387 keV e- 9.46673 MeV e+ 8.85305 MeV proton 2 MeV Region(s) which use this couple : Calor-C Index : 12 used in the geometry : Yes Material : Water Range cuts : gamma 2 cm e- 2 cm e+ 2 cm proton 2 cm - Energy thresholds : gamma 10.4017 keV e- 4.22893 MeV e+ 3.95409 MeV proton 2 MeV + Energy thresholds : gamma 10.4337 keV e- 4.1971 MeV e+ 3.95504 MeV proton 2 MeV Region(s) which use this couple : Calor-C @@ -2595,451 +1925,84 @@ Region -- -- appears in world volume Production cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm /run/beamOn 10 -phot: for gamma SubType=12 BuildTable=0 - LambdaPrime table from 200 keV to 100 TeV in 61 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo - -compt: for gamma SubType=13 BuildTable=1 - Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 - LambdaPrime table from 1 MeV to 100 TeV in 56 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV - -conv: for gamma SubType=14 BuildTable=1 - Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai - -Rayl: for gamma SubType=11 BuildTable=1 - Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 - LambdaPrime table from 100 keV to 100 TeV in 63 bins - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator - -msc: for e- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e- XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for e+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV - StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm - -eIoni: for e+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV - -eBrem: for e+ XStype:4 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai - eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai - -annihil: for e+ XStype:2 SubType=5 BuildTable=0 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV - -CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 100 MeV Emax= 100 TeV - -msc: for proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for GenericIon SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for GenericIon XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - Stopping Power data for 17 ion/material pairs - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -msc: for alpha SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -ionIoni: for alpha XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV - BetheBloch : Emin=7.9452 MeV Emax= 100 TeV - -msc: for anti_proton SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for anti_proton XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV - BetheBloch : Emin= 2 MeV Emax= 100 TeV - -hBrems: for anti_proton XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for anti_proton XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 17x1001 from 7.50618 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for kaon- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for kaon- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV - BetheBloch : Emin=1.05231 MeV Emax= 100 TeV - -hBrems: for kaon- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for kaon- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 18x1001 from 3.94942 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of kaon+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for mu- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -muIoni: for mu- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV - BetheBloch : Emin= 200 keV Emax= 1 GeV - MuBetheBloch : Emin= 1 GeV Emax= 100 TeV - -muBrems: for mu- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -muPairProd: for mu- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 21x1001 from 1 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of mu+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi+ SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi+ XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi+ XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi+ XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - -msc: for pi- SubType= 10 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV - StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm - -hIoni: for pi- XStype:1 SubType=2 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV - BetheBloch : Emin=297.505 keV Emax= 100 TeV - -hBrems: for pi- XStype:1 SubType=3 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -hPairProd: for pi- XStype:1 SubType=4 - dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 - Sampling table 20x1001 from 1.11656 GeV to 100 TeV - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi - -CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 - Used Lambda table of pi+ - ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 - ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV - ========= Table of registered couples ============================ Index : 0 used in the geometry : Yes Material : Galactic Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : No Material : Lead Range cuts : gamma 10 um e- 10 um e+ 10 um proton 10 um - Energy thresholds : gamma 5.995 keV e- 58.1082 keV e+ 56.9484 keV proton 1 keV + Energy thresholds : gamma 5.9847 keV e- 57.918 keV e+ 56.8398 keV proton 1 keV Index : 2 used in the geometry : No Material : liquidArgon Range cuts : gamma 10 um e- 10 um e+ 10 um proton 10 um - Energy thresholds : gamma 990 eV e- 14.5951 keV e+ 14.2339 keV proton 1 keV + Energy thresholds : gamma 1 keV e- 14.1149 keV e+ 13.8266 keV proton 1 keV Index : 3 used in the geometry : No Material : Lead Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 29.4761 keV e- 241.522 keV e+ 231.977 keV proton 10 keV + Energy thresholds : gamma 29.3967 keV e- 240.671 keV e+ 232.59 keV proton 10 keV Index : 4 used in the geometry : No Material : liquidArgon Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 1.9981 keV e- 82.4135 keV e+ 81.8616 keV proton 10 keV + Energy thresholds : gamma 1.995 keV e- 82.6928 keV e+ 81.3743 keV proton 10 keV Index : 5 used in the geometry : No Material : Lead Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 101.843 keV e- 1.36749 MeV e+ 1.27862 MeV proton 100 keV + Energy thresholds : gamma 101.8 keV e- 1.37159 MeV e+ 1.2826 MeV proton 100 keV Index : 6 used in the geometry : No Material : liquidArgon Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 6.19986 keV e- 344.855 keV e+ 333.46 keV proton 100 keV + Energy thresholds : gamma 6.18824 keV e- 346.458 keV e+ 335.417 keV proton 100 keV Index : 7 used in the geometry : Yes Material : Aluminium Range cuts : gamma 10 um e- 10 um e+ 10 um proton 10 um - Energy thresholds : gamma 990 eV e- 34.1725 keV e+ 33.9436 keV proton 1 keV + Energy thresholds : gamma 1 keV e- 34.1087 keV e+ 33.7276 keV proton 1 keV Region(s) which use this couple : Calor-A Index : 8 used in the geometry : Yes Material : Water Range cuts : gamma 10 um e- 10 um e+ 10 um proton 10 um - Energy thresholds : gamma 990 eV e- 14.0874 keV e+ 14.0874 keV proton 1 keV + Energy thresholds : gamma 1 keV e- 13.8272 keV e+ 13.5614 keV proton 1 keV Region(s) which use this couple : Calor-A Index : 9 used in the geometry : Yes Material : Aluminium Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 2.3478 keV e- 131.031 keV e+ 128.416 keV proton 10 keV + Energy thresholds : gamma 2.34188 keV e- 131.243 keV e+ 128.772 keV proton 10 keV Region(s) which use this couple : Calor-B Index : 10 used in the geometry : Yes Material : Water Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 1.10981 keV e- 84.6589 keV e+ 83.5287 keV proton 10 keV + Energy thresholds : gamma 1.11071 keV e- 85.0292 keV e+ 83.8928 keV proton 10 keV Region(s) which use this couple : Calor-B Index : 11 used in the geometry : Yes Material : Aluminium Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 6.90363 keV e- 598.345 keV e+ 570.85 keV proton 100 keV + Energy thresholds : gamma 6.91818 keV e- 597.592 keV e+ 574.294 keV proton 100 keV Region(s) which use this couple : Calor-C Index : 12 used in the geometry : Yes Material : Water Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 2.94056 keV e- 351.877 keV e+ 342.545 keV proton 100 keV + Energy thresholds : gamma 2.93516 keV e- 351.296 keV e+ 341.588 keV proton 100 keV Region(s) which use this couple : Calor-C @@ -3049,7 +2012,7 @@ Index : 12 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 10 - User=1.520000s Real=1.994138s Sys=0.420000s + User=0.410000s Real=0.590154s Sys=0.120000s ############################################################ Run Summary - Number of events : 10 ############################################################ @@ -3057,124 +2020,124 @@ Region : Calor-A Production thresholds : gamma 10 um e- 10 um e+ 10 um Energy deposition in an event : - Absorber 1.57301 GeV Gap 687.563 MeV + Absorber 563.872 MeV Gap 238.774 MeV Number of secondaries in an event : - gamma in Absorber 390.5 in Gap 107.7 - e- in Absorber 3766 in Gap 2972.1 - e+ in Absorber 19.4 in Gap 5.5 + gamma in Absorber 53 in Gap 10.9 + e- in Absorber 1016.5 in Gap 934.5 + e+ in Absorber 1.4 in Gap 0.1 Minimum kinetic energy of generated secondaries : - gamma in Absorber 995.904 eV in Gap 1.00096 keV - e- in Absorber 1.47703 eV in Gap 103.988 eV - e+ in Absorber 51.7655 keV in Gap 211.83 keV + gamma in Absorber 1.01255 keV in Gap 1.17735 keV + e- in Absorber 10.2321 eV in Gap 103.532 eV + e+ in Absorber 126.944 keV in Gap 3.21881 MeV Total track length of e+/e- in an event : - Absorber 2.92128 m Gap 2.81039 m + Absorber 45.102 cm Gap 37.1802 cm Total number of steps of e+/e- in an event : - Absorber 6789.7 Gap 5353.6 + Absorber 1511.8 Gap 1286.4 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 1787.57 375.8 4281.4 18.6 4313.71 8106.1 - 1 265.242 79.1 872.6 2.8 880.601 1735.3 - 2 93.3429 21.7 439.9 1.6 279.51 737.5 - 3 44.3576 10.1 276.4 0.6 110.111 421 - 4 21.1856 3.7 209.2 0.5 44.2957 286.7 - 5 10.4022 1.7 150.6 0.3 22.2058 192.9 - 6 11.6064 1.7 126.4 0.2 27.8879 169.6 - 7 6.35285 0.9 94.3 0.1 14.0228 124 - 8 3.62911 0.9 63.2 0.1 5.11104 80.5 - 9 4.36831 0.9 53.5 0 9.69148 70.9 - 10 3.87677 0.8 44.9 0.1 9.63868 60.1 - 11 1.51688 0.3 31.7 0 1.70588 38.3 - 12 2.26559 0.3 26.9 0 4.66982 36.2 - 13 0.765432 0 14.1 0 0.993641 17.2 - 14 1.41722 0.1 16.3 0 3.76217 22.2 - 15 0.696292 0 10.3 0 0.42716 12.8 - 16 0.5301 0.2 5.8 0 0.893093 7.6 - 17 0.224578 0 5.9 0 0.264944 6.5 - 18 0.379268 0 6.1 0 0.487601 7.4 - 19 0.301455 0 3.9 0 0.574643 4.4 + 0 760.339 52 1713.1 0.5 695.679 2409.5 + 1 17.8369 5.7 61.9 0.5 61.3789 121.9 + 2 9.94291 2.4 45.1 0.2 28.9351 81.5 + 3 5.0897 1.4 32.1 0.1 15.3926 47.8 + 4 3.01513 0.9 21.4 0 8.35725 30.5 + 5 1.54905 0.6 21.5 0.1 3.3038 28.7 + 6 1.31158 0.4 13.4 0.1 2.76133 19 + 7 1.22754 0.3 9.3 0 2.64578 13.3 + 8 0.538069 0 5.7 0 0.932785 8.7 + 9 0.632613 0.1 5.2 0 1.42725 8.9 + 10 0.357524 0 5 0 0.701357 7.1 + 11 0.172843 0 2.3 0 0.436722 2.7 + 12 0.201273 0 4.1 0 0.502874 5.5 + 13 0.067086 0 1.6 0 0.0646473 2.3 + 14 0.0566397 0 2.5 0 0.0269893 2.9 + 15 0.101351 0.1 1.8 0 0.122333 2.2 + 16 0.0493828 0 1.6 0 0.0261289 1.7 + 17 0.0504548 0 1.2 0 0.033042 1.4 + 18 0.064068 0 1.2 0 0.0636968 1.4 + 19 0.028868 0 0.5 0 0.0230509 0.6 ############################################################ Region : Calor-B Production thresholds : gamma 100 um e- 100 um e+ 100 um Energy deposition in an event : - Absorber 565.581 MeV Gap 251.831 MeV + Absorber 554.497 MeV Gap 240.388 MeV Number of secondaries in an event : - gamma in Absorber 45.6 in Gap 13 - e- in Absorber 366.6 in Gap 197.5 - e+ in Absorber 1.4 in Gap 0.4 + gamma in Absorber 38.4 in Gap 9.8 + e- in Absorber 351.6 in Gap 178.7 + e+ in Absorber 0.9 in Gap 0.1 Minimum kinetic energy of generated secondaries : - gamma in Absorber 2.39208 keV in Gap 1.23456 keV - e- in Absorber 120.94 eV in Gap 116.086 eV - e+ in Absorber 1.8185 MeV in Gap 2.62771 MeV + gamma in Absorber 2.34528 keV in Gap 1.22385 keV + e- in Absorber 109.953 eV in Gap 298.718 eV + e+ in Absorber 406.725 keV in Gap 6.79658 MeV Total track length of e+/e- in an event : - Absorber 43.4603 cm Gap 42.7172 cm + Absorber 40.729 cm Gap 36.4993 cm Total number of steps of e+/e- in an event : - Absorber 665.2 Gap 383 + Absorber 631 Gap 345.8 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 777.211 47.7 392.4 0.9 741.285 781.1 - 1 20.0355 6.5 43.4 0.3 64.4461 84 - 2 8.10979 2.3 29.6 0.3 26.6177 51.4 - 3 2.96242 0.3 20.3 0 7.46293 28.8 - 4 2.74492 0.9 18.3 0.1 6.39831 24.7 - 5 0.650042 0 12.8 0 0.771436 15.2 - 6 1.75741 0.1 10.4 0 5.55188 14 - 7 0.392505 0.1 8.4 0 0.546076 10.6 - 8 0.113895 0 4.3 0 0.0693879 5.2 - 9 0.639203 0.2 3.1 0.1 1.68361 4.3 - 10 0.14331 0 3.5 0 0.181762 3.7 - 11 0.226855 0 2.2 0 0.435142 3 - 12 0.138936 0 1.8 0 0.493328 2.3 - 13 0.427823 0.1 1.7 0 1.12937 3.1 - 14 0.31789 0 1.8 0 1.26783 4 - 15 0.179949 0.1 2.3 0 0.332502 2.9 - 16 0.0356754 0 0.8 0 0.0444398 0.8 - 17 0.131922 0 1.9 0 0.180867 1.9 - 18 0.775823 0.3 2 0.1 1.90489 3.5 - 19 0.0582727 0 1.5 0 0.0509525 1.6 + 0 756.905 40.8 378.1 0.5 656.077 739.5 + 1 23.5508 5.1 39.4 0.4 79.6404 84.9 + 2 4.13641 0.6 22.3 0 13.6723 36 + 3 3.72205 0.7 20.8 0.1 8.40679 26.4 + 4 1.99817 0.4 16.8 0 5.36847 21.9 + 5 1.75244 0.4 13.5 0 4.06703 18.4 + 6 0.542396 0.2 9.4 0 0.714323 12.7 + 7 0.557607 0 6.6 0 0.95212 8.4 + 8 0.265104 0 6.6 0 0.210405 8 + 9 0.369857 0 4.7 0 0.570201 5.5 + 10 0.0937997 0 2.9 0 0.0414898 3.5 + 11 0.320264 0 3.2 0 1.37526 4.2 + 12 0.232814 0 1.2 0 0.445772 1.4 + 13 0.131165 0 1.7 0 0.284119 2 + 14 0.0244845 0 1.2 0 0.0135641 1.4 + 15 0 0 0 0 0 0 + 16 0 0 0 0 0 0 + 17 0 0 0 0 0 0 + 18 0.013731 0 0.2 0 0.0106878 0.2 + 19 0 0 0 0 0 0 ############################################################ Region : Calor-C Production thresholds : gamma 1 mm e- 1 mm e+ 1 mm Energy deposition in an event : - Absorber 528.167 MeV Gap 236.357 MeV + Absorber 534.872 MeV Gap 232.072 MeV Number of secondaries in an event : - gamma in Absorber 21.3 in Gap 6.4 - e- in Absorber 126.8 in Gap 62.1 - e+ in Absorber 0.5 in Gap 0 + gamma in Absorber 26 in Gap 6.5 + e- in Absorber 136 in Gap 70 + e+ in Absorber 0.7 in Gap 0 Minimum kinetic energy of generated secondaries : - gamma in Absorber 6.95013 keV in Gap 3.26311 keV - e- in Absorber 107.683 eV in Gap 129.819 eV - e+ in Absorber 1.00894 MeV in Gap 2.88022e+295 J + gamma in Absorber 7.02882 keV in Gap 2.97887 keV + e- in Absorber 106.264 eV in Gap 120.335 eV + e+ in Absorber 382.65 keV in Gap 2.88022e+295 J Total track length of e+/e- in an event : - Absorber 29.1242 cm Gap 30.7424 cm + Absorber 31.1695 cm Gap 28.5517 cm Total number of steps of e+/e- in an event : - Absorber 306.7 Gap 175.5 + Absorber 316.6 Gap 183.1 ------------------------------------------------------------ Scores in parallel geometry layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt - 0 747.451 24.5 100.1 0.3 551.424 350.6 - 1 9.24048 1.9 19.3 0 30.5902 36.2 - 2 3.06307 1.1 15.9 0.2 6.8228 25.3 - 3 0.937415 0 11.3 0 2.27035 14.9 - 4 0.527124 0 9.3 0 1.09471 13.7 - 5 1.39949 0.2 8.8 0 3.1803 10.9 - 6 0.473787 0 5.7 0 0.741191 7.2 - 7 0.436031 0 5.4 0 0.900247 6.5 - 8 0.118065 0 3.2 0 0.11497 4.2 - 9 0.189913 0 1.6 0 0.283395 2.5 - 10 0.179907 0 1.3 0 0.568526 1.7 - 11 0.0142781 0 0.6 0 0.00697961 0.6 - 12 0.0474313 0 0.8 0 0.101535 0.9 - 13 0.0328963 0 0.9 0 0.0202019 1 - 14 0.290673 0 1.8 0 0.443422 2.6 - 15 0.0669646 0 0.6 0 0.0804559 0.7 - 16 0.0115631 0 0.7 0 0.00373045 0.8 - 17 0.00623785 0 0.1 0 0.00276369 0.2 - 18 0.011596 0 0.4 0 0.00715725 0.5 - 19 0.00635618 0 0.3 0 0.002344 0.3 + 0 745.117 29.2 104.2 0.6 538.173 345.3 + 1 13.3452 1.9 21.1 0.1 41.5511 42.9 + 2 2.82104 0.2 16.7 0 6.36545 27.5 + 3 1.12192 0.4 14.5 0 2.77034 19.3 + 4 1.26173 0.4 11.5 0 2.6023 16.9 + 5 0.913223 0.2 7.3 0 2.01255 9.5 + 6 0.74512 0 8.1 0 1.24717 9.9 + 7 0.233802 0 5.3 0 0.199859 6.2 + 8 0.171539 0 4.3 0 0.237938 5.3 + 9 0.273527 0 3.8 0 0.544639 4.5 + 10 0.438889 0 2.3 0 0.822573 3 + 11 0.046379 0 1 0 0.14935 1.9 + 12 0.105607 0 0.4 0 0.177558 0.8 + 13 0.0339886 0 1.3 0 0.0206086 1.4 + 14 0.0689439 0 1.7 0 0.0446613 2 + 15 0.140632 0.1 1.2 0 0.193421 1.6 + 16 0.0948267 0.1 0.8 0 0.0962639 1.1 + 17 0 0 0 0 0 0 + 18 0 0 0 0 0 0 + 19 0.00290489 0 0.2 0 0.000541223 0.2 ############################################################ 0 events have been kept for refreshing and/or reviewing. "/vis/reviewKeptEvents" to review them one by one. @@ -3186,79 +2149,79 @@ layer eDep/evt nGamma/evt nElec/evt nPosi/evt stpLen/evt nStep/evt Index : 0 used in the geometry : Yes Material : Galactic Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : No Material : Lead Range cuts : gamma 10 um e- 10 um e+ 10 um proton 10 um - Energy thresholds : gamma 5.995 keV e- 58.1082 keV e+ 56.9484 keV proton 1 keV + Energy thresholds : gamma 5.9847 keV e- 57.918 keV e+ 56.8398 keV proton 1 keV Index : 2 used in the geometry : No Material : liquidArgon Range cuts : gamma 10 um e- 10 um e+ 10 um proton 10 um - Energy thresholds : gamma 990 eV e- 14.5951 keV e+ 14.2339 keV proton 1 keV + Energy thresholds : gamma 1 keV e- 14.1149 keV e+ 13.8266 keV proton 1 keV Index : 3 used in the geometry : No Material : Lead Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 29.4761 keV e- 241.522 keV e+ 231.977 keV proton 10 keV + Energy thresholds : gamma 29.3967 keV e- 240.671 keV e+ 232.59 keV proton 10 keV Index : 4 used in the geometry : No Material : liquidArgon Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 1.9981 keV e- 82.4135 keV e+ 81.8616 keV proton 10 keV + Energy thresholds : gamma 1.995 keV e- 82.6928 keV e+ 81.3743 keV proton 10 keV Index : 5 used in the geometry : No Material : Lead Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 101.843 keV e- 1.36749 MeV e+ 1.27862 MeV proton 100 keV + Energy thresholds : gamma 101.8 keV e- 1.37159 MeV e+ 1.2826 MeV proton 100 keV Index : 6 used in the geometry : No Material : liquidArgon Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 6.19986 keV e- 344.855 keV e+ 333.46 keV proton 100 keV + Energy thresholds : gamma 6.18824 keV e- 346.458 keV e+ 335.417 keV proton 100 keV Index : 7 used in the geometry : Yes Material : Aluminium Range cuts : gamma 10 um e- 10 um e+ 10 um proton 10 um - Energy thresholds : gamma 990 eV e- 34.1725 keV e+ 33.9436 keV proton 1 keV + Energy thresholds : gamma 1 keV e- 34.1087 keV e+ 33.7276 keV proton 1 keV Region(s) which use this couple : Calor-A Index : 8 used in the geometry : Yes Material : Water Range cuts : gamma 10 um e- 10 um e+ 10 um proton 10 um - Energy thresholds : gamma 990 eV e- 14.0874 keV e+ 14.0874 keV proton 1 keV + Energy thresholds : gamma 1 keV e- 13.8272 keV e+ 13.5614 keV proton 1 keV Region(s) which use this couple : Calor-A Index : 9 used in the geometry : Yes Material : Aluminium Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 2.3478 keV e- 131.031 keV e+ 128.416 keV proton 10 keV + Energy thresholds : gamma 2.34188 keV e- 131.243 keV e+ 128.772 keV proton 10 keV Region(s) which use this couple : Calor-B Index : 10 used in the geometry : Yes Material : Water Range cuts : gamma 100 um e- 100 um e+ 100 um proton 100 um - Energy thresholds : gamma 1.10981 keV e- 84.6589 keV e+ 83.5287 keV proton 10 keV + Energy thresholds : gamma 1.11071 keV e- 85.0292 keV e+ 83.8928 keV proton 10 keV Region(s) which use this couple : Calor-B Index : 11 used in the geometry : Yes Material : Aluminium Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 6.90363 keV e- 598.345 keV e+ 570.85 keV proton 100 keV + Energy thresholds : gamma 6.91818 keV e- 597.592 keV e+ 574.294 keV proton 100 keV Region(s) which use this couple : Calor-C Index : 12 used in the geometry : Yes Material : Water Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm - Energy thresholds : gamma 2.94056 keV e- 351.877 keV e+ 342.545 keV proton 100 keV + Energy thresholds : gamma 2.93516 keV e- 351.296 keV e+ 341.588 keV proton 100 keV Region(s) which use this couple : Calor-C @@ -3268,7 +2231,7 @@ Graphics systems deleted. Visualization Manager deleting... G4 kernel has come to Quit state. ================== Deleting memory pools =================== -Number of memory pools allocated: 13 of which, static: 0 -Dynamic pools deleted: 13 / Total memory freed: 0.79 MB +Number of memory pools allocated: 15 of which, static: 0 +Dynamic pools deleted: 15 / Total memory freed: 0.82 MB ============================================================ RunManagerKernel is deleted. Good bye :) diff --git a/examples/extended/runAndEvent/RE07/CMakeLists.txt b/examples/extended/runAndEvent/RE07/CMakeLists.txt new file mode 100644 index 0000000000..ca792aac38 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/CMakeLists.txt @@ -0,0 +1,55 @@ +#---------------------------------------------------------------------------- +# Setup the project +cmake_minimum_required(VERSION 3.16...3.21) +project(RE07) + +#---------------------------------------------------------------------------- +# Find Geant4 package, activating all available UI and Vis drivers by default +# You can set WITH_GEANT4_UIVIS to OFF via the command line or ccmake/cmake-gui +# to build a batch mode only executable +# +option(WITH_GEANT4_UIVIS "Build example with Geant4 UI and Vis drivers" ON) +if(WITH_GEANT4_UIVIS) + find_package(Geant4 REQUIRED ui_all vis_all) +else() + find_package(Geant4 REQUIRED) +endif() + +#---------------------------------------------------------------------------- +# Setup Geant4 include directories and compile definitions +# +include(${Geant4_USE_FILE}) +include_directories(${PROJECT_SOURCE_DIR}/include + ${Geant4_INCLUDE_DIR}) + +#---------------------------------------------------------------------------- +# Define sources for this project +# +set(sources + exampleRE07.cc + src/ActionInitialization.cc + src/DetectorConstruction.cc + src/DetectorMessenger.cc + src/EmStandardPhysicsTrackingManager.cc + src/EventAction.cc + src/PhysicsList.cc + src/PhysicsListEmSpecialized.cc + src/PhysicsListEmStandardTracking.cc + src/PhysicsListMessenger.cc + src/PrimaryGeneratorAction.cc + src/RunAction.cc + src/Run.cc + src/SpecializedTrackingManager.cc + src/SteppingAction.cc + src/TrackingAction.cc) + +#---------------------------------------------------------------------------- +# Add the executable, and link it to the Geant4 libraries +# +add_executable(exampleRE07 ${sources}) +target_link_libraries(exampleRE07 ${Geant4_LIBRARIES}) + +#---------------------------------------------------------------------------- +# Install the executable to 'bin' directory under CMAKE_INSTALL_PREFIX +# +install(TARGETS exampleRE07 DESTINATION bin) diff --git a/examples/extended/runAndEvent/RE07/History b/examples/extended/runAndEvent/RE07/History new file mode 100644 index 0000000000..72b6ba8a7b --- /dev/null +++ b/examples/extended/runAndEvent/RE07/History @@ -0,0 +1,22 @@ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + Example RE07 History file + ------------------------- +This file should be used by the G4 example coordinator to briefly +summarize all major modifications introduced in the code and keep +track of all tags. + + ---------------------------------------------------------- + * Reverse chronological order (last date on top), please * + ---------------------------------------------------------- + +Nov. 12, 2021 J. Hahnfeld (exampleRE07-V10-07-01) +- SpecializedTrackingManager: Fix condition for particles switching + regions (entering or exiting the Back region in this case) + +Oct. 31, 2021 J. Hahnfeld (exampleRE07-V10-07-00) +- Created diff --git a/examples/extended/runAndEvent/RE07/exampleRE07.cc b/examples/extended/runAndEvent/RE07/exampleRE07.cc new file mode 100644 index 0000000000..925ac3acbc --- /dev/null +++ b/examples/extended/runAndEvent/RE07/exampleRE07.cc @@ -0,0 +1,81 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file RE07/exampleRE07.cc +/// \brief Main program of the RE07 example +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... + +#include "ActionInitialization.hh" +#include "DetectorConstruction.hh" +#include "PhysicsList.hh" + +#include "G4RunManagerFactory.hh" +#include "G4UImanager.hh" +#include "G4ios.hh" + +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... + +int main(int argc, char** argv) +{ + if(argc < 2) + { + G4cerr << "No macro file provided, exiting!" << G4endl; + return 1; + } + + // Creating run manager + std::unique_ptr runManager( + G4RunManagerFactory::CreateRunManager()); + + if(argc == 3) + { + G4int nThreads = G4UIcommand::ConvertToInt(argv[2]); + runManager->SetNumberOfThreads(nThreads); + } + + // set mandatory initialization classes + DetectorConstruction* detector = new DetectorConstruction; + runManager->SetUserInitialization(detector); + runManager->SetUserInitialization(new PhysicsList); + + // set user action classes + runManager->SetUserInitialization(new ActionInitialization(detector)); + + // get the pointer to the User Interface manager + G4UImanager* UImanager = G4UImanager::GetUIpointer(); + + G4String command = "/control/execute "; + G4String fileName = argv[1]; + UImanager->ApplyCommand(command + fileName); + + return 0; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/include/ActionInitialization.hh b/examples/extended/runAndEvent/RE07/include/ActionInitialization.hh new file mode 100644 index 0000000000..029bf89714 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/ActionInitialization.hh @@ -0,0 +1,53 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +/// \file ActionInitialization.hh +/// \brief Definition of the ActionInitialization class + +#ifndef ActionInitialization_h +#define ActionInitialization_h 1 + +#include "G4VUserActionInitialization.hh" + +class DetectorConstruction; + +/// Action initialization class. +/// + +class ActionInitialization : public G4VUserActionInitialization +{ + public: + ActionInitialization(DetectorConstruction*); + ~ActionInitialization() override; + + void BuildForMaster() const override; + void Build() const override; + + private: + DetectorConstruction* fDetector; +}; + +#endif diff --git a/examples/extended/runAndEvent/RE07/include/DetectorConstruction.hh b/examples/extended/runAndEvent/RE07/include/DetectorConstruction.hh new file mode 100644 index 0000000000..0b0b906cc7 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/DetectorConstruction.hh @@ -0,0 +1,124 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file include/DetectorConstruction.hh +/// \brief Definition of the DetectorConstruction class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef DetectorConstruction_h +#define DetectorConstruction_h 1 + +#include "G4Cache.hh" +#include "G4VUserDetectorConstruction.hh" +#include "globals.hh" + +#include + +class G4Box; +class G4LogicalVolume; +class G4VPhysicalVolume; +class G4Material; +class DetectorMessenger; + +class G4GlobalMagFieldMessenger; + +const G4int kMaxAbsor = 10; // 0 + 9 + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DetectorConstruction : public G4VUserDetectorConstruction +{ + public: + DetectorConstruction(); + + public: + void SetNbOfAbsor(G4int); + void SetAbsorMaterial(G4int, const G4String&); + void SetAbsorThickness(G4int, G4double); + + void SetWorldMaterial(const G4String&); + void SetCalorSizeYZ(G4double); + void SetNbOfLayers(G4int); + + G4VPhysicalVolume* Construct() override; + void ConstructSDandField() override; + + public: + void PrintCalorParameters(); + + G4double GetWorldSizeX() const { return fWorldSizeX; }; + G4double GetWorldSizeYZ() const { return fWorldSizeYZ; }; + + G4double GetCalorThickness() const { return fCalorThickness; }; + G4double GetCalorSizeYZ() const { return fCalorSizeYZ; }; + + G4int GetNbOfLayers() const { return fNbOfLayers; }; + + G4int GetNbOfAbsor() const { return fNbOfAbsor; }; + G4double GetAbsorThickness(G4int i) const { return fAbsorThickness[i]; }; + const G4Material* GetAbsorMaterial(G4int i) const + { + return fAbsorMaterial[i]; + }; + + const G4VPhysicalVolume* GetphysiWorld() const { return fPhysiWorld; }; + const G4Material* GetWorldMaterial() const { return fWorldMaterial; }; + + private: + void ComputeCalorParameters(); + + G4int fNbOfAbsor; + G4Material* fAbsorMaterial[kMaxAbsor]; + G4double fAbsorThickness[kMaxAbsor]; + + G4int fNbOfLayers; + G4double fLayerThickness; + + G4double fCalorSizeYZ; + G4double fCalorThickness; + + G4Material* fWorldMaterial; + G4double fWorldSizeYZ; + G4double fWorldSizeX; + + G4LogicalVolume* fLogicWorld; + G4VPhysicalVolume* fPhysiWorld; + + G4LogicalVolume* fLogicLayerFront; + G4LogicalVolume* fLogicLayerBack; + + G4LogicalVolume* fLogicAbsorFront[kMaxAbsor]; + G4LogicalVolume* fLogicAbsorBack[kMaxAbsor]; + + std::unique_ptr fDetectorMessenger; + G4Cache fFieldMessenger; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/runAndEvent/RE07/include/DetectorMessenger.hh b/examples/extended/runAndEvent/RE07/include/DetectorMessenger.hh new file mode 100644 index 0000000000..e7a3dac528 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/DetectorMessenger.hh @@ -0,0 +1,71 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file include/DetectorMessenger.hh +/// \brief Definition of the DetectorMessenger class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef DetectorMessenger_h +#define DetectorMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +#include + +class DetectorConstruction; +class G4UIdirectory; +class G4UIcommand; +class G4UIcmdWithAnInteger; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithoutParameter; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DetectorMessenger : public G4UImessenger +{ + public: + DetectorMessenger(DetectorConstruction*); + ~DetectorMessenger(); + + void SetNewValue(G4UIcommand*, G4String) override; + + private: + DetectorConstruction* fDetector; + + std::unique_ptr fDetDir; + + std::unique_ptr fSizeYZCmd; + std::unique_ptr fNbLayersCmd; + std::unique_ptr fNbAbsorCmd; + std::unique_ptr fAbsorCmd; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/advanced/gammaray_telescope/include/GammaRayTelEMlowePhysics.hh b/examples/extended/runAndEvent/RE07/include/EmStandardPhysicsTrackingManager.hh similarity index 51% rename from examples/advanced/gammaray_telescope/include/GammaRayTelEMlowePhysics.hh rename to examples/extended/runAndEvent/RE07/include/EmStandardPhysicsTrackingManager.hh index 436c4f81bb..06eda284cc 100644 --- a/examples/advanced/gammaray_telescope/include/GammaRayTelEMlowePhysics.hh +++ b/examples/extended/runAndEvent/RE07/include/EmStandardPhysicsTrackingManager.hh @@ -23,49 +23,75 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // +// EmStandardPhysicsTrackingManager // +// Class description: // -// -// ------------------------------------------------------------ -// GEANT 4 class header file -// Class Description: -// This class is an derived class of G4VPhysicsConstructor +// An implementation of the G4VTrackingManager interface for e-/e+ and gamma +// with the same processes as G4EmStandardPhysics. // -// ------------------------------------------- -// History -// first version 12 Nov. 2000 by H.Kurashige -// ------------------------------------------------------------ -#ifndef GammaRayTelEMlowePhysics_h -#define GammaRayTelEMlowePhysics_h 1 +// Original author: Jonas Hahnfeld, 2021 +#ifndef EmStandardPhysicsTrackingManager_h +#define EmStandardPhysicsTrackingManager_h 1 + +#include "G4VTrackingManager.hh" #include "globals.hh" -#include "G4ios.hh" -#include "G4VPhysicsConstructor.hh" +class G4eMultipleScattering; +class G4CoulombScattering; +class G4eIonisation; +class G4eBremsstrahlung; +class G4eplusAnnihilation; +class G4ComptonScattering; +class G4GammaConversion; +class G4PhotoElectricEffect; +class G4RayleighScattering; -class GammaRayTelEMlowePhysics : public G4VPhysicsConstructor +class EmStandardPhysicsTrackingManager : public G4VTrackingManager { - public: - GammaRayTelEMlowePhysics(const G4String& name ="LowE EM"); - virtual ~GammaRayTelEMlowePhysics(); + public: + EmStandardPhysicsTrackingManager(); + ~EmStandardPhysicsTrackingManager(); - public: - // This method will be invoked in the Construct() method. - // each particle type will be instantiated - virtual void ConstructParticle(); - - // This method will be invoked in the Construct() method. - // each physics process will be instantiated and - // registered to the process manager of each particle type - virtual void ConstructProcess(); + void BuildPhysicsTable(const G4ParticleDefinition&) override; + void PreparePhysicsTable(const G4ParticleDefinition&) override; + + void HandOverOneTrack(G4Track* aTrack) override; + + private: + void TrackElectron(G4Track* aTrack); + void TrackPositron(G4Track* aTrack); + void TrackGamma(G4Track* aTrack); + + struct + { + G4eMultipleScattering* msc; + G4eIonisation* ioni; + G4eBremsstrahlung* brems; + G4CoulombScattering* ss; + } fElectronProcs; + + struct + { + G4eMultipleScattering* msc; + G4eIonisation* ioni; + G4eBremsstrahlung* brems; + G4eplusAnnihilation* annihilation; + G4CoulombScattering* ss; + } fPositronProcs; + + struct + { + G4PhotoElectricEffect* pe; + G4ComptonScattering* compton; + G4GammaConversion* conversion; + G4RayleighScattering* rayleigh; + } fGammaProcs; + + static EmStandardPhysicsTrackingManager* masterTrackingManager; }; - #endif - - - - - diff --git a/examples/extended/runAndEvent/RE07/include/EventAction.hh b/examples/extended/runAndEvent/RE07/include/EventAction.hh new file mode 100644 index 0000000000..e80d073f02 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/EventAction.hh @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file include/EventAction.hh +/// \brief Definition of the EventAction class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef EventAction_h +#define EventAction_h 1 + +#include "DetectorConstruction.hh" +#include "G4UserEventAction.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class EventAction : public G4UserEventAction +{ + public: + EventAction(DetectorConstruction*); + + void BeginOfEventAction(const G4Event*) override; + void EndOfEventAction(const G4Event*) override; + + void SumEnergy(G4int k, G4double de, G4double dl) + { + fEnergyDeposit[k] += de; + fTrackLengthCh[k] += dl; + }; + + private: + DetectorConstruction* fDetector; + + G4double fEnergyDeposit[kMaxAbsor]; + G4double fTrackLengthCh[kMaxAbsor]; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/runAndEvent/RE07/include/PhysicsList.hh b/examples/extended/runAndEvent/RE07/include/PhysicsList.hh new file mode 100644 index 0000000000..ddbc7e9c14 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/PhysicsList.hh @@ -0,0 +1,62 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file PhysicsList.hh +/// \brief Definition of the PhysicsList class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysicsList_h +#define PhysicsList_h 1 + +#include "G4VUserPhysicsList.hh" +#include "globals.hh" + +#include + +class G4VPhysicsConstructor; +class PhysicsListMessenger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysicsList : public G4VUserPhysicsList +{ + public: + PhysicsList(); + + void ConstructParticle() override; + void ConstructProcess() override; + void SetMode(const G4String& name); + + private: + std::unique_ptr fMessenger; + std::unique_ptr fEmPhysicsList; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/runAndEvent/RE07/include/PhysicsListEmSpecialized.hh b/examples/extended/runAndEvent/RE07/include/PhysicsListEmSpecialized.hh new file mode 100644 index 0000000000..ac89d64e1f --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/PhysicsListEmSpecialized.hh @@ -0,0 +1,53 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file include/PhysicsListEmSpecialized.hh +/// \brief Definition of the PhysicsListEmSpecialized class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysicsListEmSpecialized_h +#define PhysicsListEmSpecialized_h 1 + +#include "G4EmStandardPhysics.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysicsListEmSpecialized : public G4EmStandardPhysics +{ + public: + PhysicsListEmSpecialized(G4int ver = 1, const G4String& name = ""); + ~PhysicsListEmSpecialized(); + + public: + void ConstructProcess() override; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/runAndEvent/RE07/include/PhysicsListEmStandardTracking.hh b/examples/extended/runAndEvent/RE07/include/PhysicsListEmStandardTracking.hh new file mode 100644 index 0000000000..547785ef17 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/PhysicsListEmStandardTracking.hh @@ -0,0 +1,54 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file include/PhysicsListEmStandardTracking.hh +/// \brief Definition of the PhysicsListEmStandardTracking class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysicsListEmStandardTracking_h +#define PhysicsListEmStandardTracking_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysicsListEmStandardTracking : public G4VPhysicsConstructor +{ + public: + PhysicsListEmStandardTracking(G4int ver = 1); + ~PhysicsListEmStandardTracking(); + + public: + void ConstructParticle() override; + void ConstructProcess() override; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/hadronic/Hadr04/include/NeutronHPMessenger.hh b/examples/extended/runAndEvent/RE07/include/PhysicsListMessenger.hh similarity index 79% rename from examples/extended/hadronic/Hadr04/include/NeutronHPMessenger.hh rename to examples/extended/runAndEvent/RE07/include/PhysicsListMessenger.hh index 8577c39f78..176be24c63 100644 --- a/examples/extended/hadronic/Hadr04/include/NeutronHPMessenger.hh +++ b/examples/extended/runAndEvent/RE07/include/PhysicsListMessenger.hh @@ -23,38 +23,38 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -/// \file NeutronHPMessenger.hh -/// \brief Definition of the NeutronHPMessenger class +/// \file PhysicsListMessenger.hh +/// \brief Definition of the PhysicsListMessenger class // // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef NeutronHPMessenger_h -#define NeutronHPMessenger_h 1 +#ifndef PhysicsListMessenger_h +#define PhysicsListMessenger_h 1 -#include "globals.hh" #include "G4UImessenger.hh" +#include "globals.hh" -class NeutronHPphysics; -class G4UIdirectory; -class G4UIcmdWithABool; +#include + +class PhysicsList; +class G4UIcmdWithAString; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class NeutronHPMessenger: public G4UImessenger +class PhysicsListMessenger : public G4UImessenger { - public: - NeutronHPMessenger(NeutronHPphysics*); - ~NeutronHPMessenger(); - - virtual void SetNewValue(G4UIcommand*, G4String); - - private: - NeutronHPphysics* fNeutronPhysics; - - G4UIdirectory* fPhysDir; - G4UIcmdWithABool* fThermalCmd; + public: + PhysicsListMessenger(PhysicsList*); + ~PhysicsListMessenger(); + + void SetNewValue(G4UIcommand*, G4String) override; + + private: + PhysicsList* fPhysicsList; + + std::unique_ptr fModeCmd; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/analysis/AnaEx03/shared/include/PrimaryGeneratorAction.hh b/examples/extended/runAndEvent/RE07/include/PrimaryGeneratorAction.hh similarity index 85% rename from examples/extended/analysis/AnaEx03/shared/include/PrimaryGeneratorAction.hh rename to examples/extended/runAndEvent/RE07/include/PrimaryGeneratorAction.hh index 8da549b116..e38d750164 100644 --- a/examples/extended/analysis/AnaEx03/shared/include/PrimaryGeneratorAction.hh +++ b/examples/extended/runAndEvent/RE07/include/PrimaryGeneratorAction.hh @@ -23,23 +23,22 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -/// \file PrimaryGeneratorAction.hh +/// \file include/PrimaryGeneratorAction.hh /// \brief Definition of the PrimaryGeneratorAction class // // -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #ifndef PrimaryGeneratorAction_h #define PrimaryGeneratorAction_h 1 +#include "G4ParticleGun.hh" #include "G4VUserPrimaryGeneratorAction.hh" #include "globals.hh" -class G4ParticleGun; +#include + class G4Event; class DetectorConstruction; @@ -47,19 +46,20 @@ class DetectorConstruction; class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { -public: - PrimaryGeneratorAction(DetectorConstruction*); - virtual ~PrimaryGeneratorAction(); + public: + PrimaryGeneratorAction(DetectorConstruction*); - virtual void GeneratePrimaries(G4Event*); + public: + void SetDefaultKinematic(); + void GeneratePrimaries(G4Event*) override; -private: - G4ParticleGun* fParticleGun; //pointer a to G4 class - DetectorConstruction* fDetector; //pointer to the geometry + G4ParticleGun* GetParticleGun() { return fParticleGun.get(); }; + + private: + std::unique_ptr fParticleGun; + DetectorConstruction* fDetector; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - - diff --git a/examples/extended/runAndEvent/RE07/include/Run.hh b/examples/extended/runAndEvent/RE07/include/Run.hh new file mode 100644 index 0000000000..81d0001b47 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/Run.hh @@ -0,0 +1,86 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file include/Run.hh +/// \brief Definition of the Run class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef Run_h +#define Run_h 1 + +#include "DetectorConstruction.hh" + +#include "G4Run.hh" +#include "globals.hh" +#include + +class DetectorConstruction; +class G4ParticleDefinition; +class G4Track; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class Run : public G4Run +{ + public: + Run(DetectorConstruction*); + ~Run(); + + public: + void SetPrimary(G4ParticleDefinition* particle, G4double energy); + + void FillPerEvent(G4int, G4double, G4double); + + void AddChargedStep(); + void AddNeutralStep(); + void AddSecondaryTrack(const G4Track*); + + void Merge(const G4Run*) override; + void EndOfRun(); + + private: + DetectorConstruction* fDetector; + G4ParticleDefinition* fParticle; + G4double fEkin; + + G4double fSumEAbs[kMaxAbsor], fSum2EAbs[kMaxAbsor]; + G4double fSumLAbs[kMaxAbsor], fSum2LAbs[kMaxAbsor]; + + std::vector fEnergyDeposit[kMaxAbsor]; + + G4double fChargedStep; + G4double fNeutralStep; + + G4int fN_gamma; + G4int fN_elec; + G4int fN_pos; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/analysis/AnaEx03/shared/include/RunAction.hh b/examples/extended/runAndEvent/RE07/include/RunAction.hh similarity index 80% rename from examples/extended/analysis/AnaEx03/shared/include/RunAction.hh rename to examples/extended/runAndEvent/RE07/include/RunAction.hh index 15bf61a2e0..d707eba64d 100644 --- a/examples/extended/analysis/AnaEx03/shared/include/RunAction.hh +++ b/examples/extended/runAndEvent/RE07/include/RunAction.hh @@ -23,49 +23,45 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -/// \file RunAction.hh +/// \file include/RunAction.hh /// \brief Definition of the RunAction class // // -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #ifndef RunAction_h #define RunAction_h 1 +#include "G4Timer.hh" #include "G4UserRunAction.hh" #include "globals.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class G4Run; -class HistoManager; +class Run; +class DetectorConstruction; +class PrimaryGeneratorAction; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... class RunAction : public G4UserRunAction { -public: - RunAction(HistoManager*); - virtual ~RunAction(); + public: + RunAction(DetectorConstruction*, PrimaryGeneratorAction* prim = 0); - virtual void BeginOfRunAction(const G4Run*); - virtual void EndOfRunAction(const G4Run*); - - void FillPerEvent(G4double, G4double, G4double, G4double); + G4Run* GenerateRun() override; + void BeginOfRunAction(const G4Run*) override; + void EndOfRunAction(const G4Run*) override; -private: - HistoManager* fHistoManager; + private: + G4Timer fTimer; - G4double fSumEAbs, fSum2EAbs; - G4double fSumEGap, fSum2EGap; - - G4double fSumLAbs, fSum2LAbs; - G4double fSumLGap, fSum2LGap; + DetectorConstruction* fDetector; + PrimaryGeneratorAction* fPrimary; + Run* fRun; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - diff --git a/examples/extended/medical/electronScattering/include/PhysListEmStandardSS.hh b/examples/extended/runAndEvent/RE07/include/SpecializedTrackingManager.hh similarity index 72% rename from examples/extended/medical/electronScattering/include/PhysListEmStandardSS.hh rename to examples/extended/runAndEvent/RE07/include/SpecializedTrackingManager.hh index 67a2fc6316..7bd1fe8b75 100644 --- a/examples/extended/medical/electronScattering/include/PhysListEmStandardSS.hh +++ b/examples/extended/runAndEvent/RE07/include/SpecializedTrackingManager.hh @@ -23,45 +23,45 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -/// \file medical/electronScattering/include/PhysListEmStandardSS.hh -/// \brief Definition of the PhysListEmStandardSS class +/// \file include/SpecializedTrackingManager.hh +/// \brief Definition of the SpecializedTrackingManager class // // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef PhysListEmStandardSS_h -#define PhysListEmStandardSS_h 1 +#ifndef SpecializedTrackingManager_h +#define SpecializedTrackingManager_h 1 -#include "G4VPhysicsConstructor.hh" -#include "globals.hh" +#include "G4VTrackingManager.hh" + +class G4Region; + +#include //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class PhysListEmStandardSS : public G4VPhysicsConstructor +class SpecializedTrackingManager : public G4VTrackingManager { -public: - PhysListEmStandardSS(const G4String& name = "standardSS"); - ~PhysListEmStandardSS(); + public: + SpecializedTrackingManager(); + ~SpecializedTrackingManager(); -public: - // This method is dummy for physics - virtual void ConstructParticle() {}; - - // This method will be invoked in the Construct() method. - // each physics process will be instantiated and - // registered to the process manager of each particle type - virtual void ConstructProcess(); + void BuildPhysicsTable(const G4ParticleDefinition&) override; + + void PreparePhysicsTable(const G4ParticleDefinition&) override; + + void HandOverOneTrack(G4Track* aTrack) override; + void FlushEvent() override; + + private: + void StepInBackRegion(G4Track* aTrack); + void StepOutside(G4Track* aTrack); + + std::vector fBufferedTracks; + G4Region* fBackRegion = nullptr; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - - - - - - - - diff --git a/examples/extended/analysis/AnaEx03/shared/include/SteppingAction.hh b/examples/extended/runAndEvent/RE07/include/SteppingAction.hh similarity index 92% rename from examples/extended/analysis/AnaEx03/shared/include/SteppingAction.hh rename to examples/extended/runAndEvent/RE07/include/SteppingAction.hh index b7a9a421a9..6739aecb2c 100644 --- a/examples/extended/analysis/AnaEx03/shared/include/SteppingAction.hh +++ b/examples/extended/runAndEvent/RE07/include/SteppingAction.hh @@ -23,13 +23,10 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -/// \file SteppingAction.hh +/// \file include/SteppingAction.hh /// \brief Definition of the SteppingAction class // // -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -37,6 +34,7 @@ #define SteppingAction_h 1 #include "G4UserSteppingAction.hh" +#include "globals.hh" class DetectorConstruction; class EventAction; @@ -45,15 +43,14 @@ class EventAction; class SteppingAction : public G4UserSteppingAction { -public: + public: SteppingAction(DetectorConstruction*, EventAction*); - virtual ~SteppingAction(); - virtual void UserSteppingAction(const G4Step*); - -private: + void UserSteppingAction(const G4Step*) override; + + private: DetectorConstruction* fDetector; - EventAction* fEventAction; + EventAction* fEventAct; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/include/TrackingAction.hh b/examples/extended/runAndEvent/RE07/include/TrackingAction.hh new file mode 100644 index 0000000000..f013023d1b --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/TrackingAction.hh @@ -0,0 +1,53 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file include/TrackingAction.hh +/// \brief Definition of the TrackingAction class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef TrackingAction_h +#define TrackingAction_h 1 + +#include "G4UserTrackingAction.hh" +#include "globals.hh" + +class DetectorConstruction; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class TrackingAction : public G4UserTrackingAction +{ + public: + TrackingAction(); + + void PreUserTrackingAction(const G4Track*) override; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/runAndEvent/RE07/include/TrackingManagerHelper.hh b/examples/extended/runAndEvent/RE07/include/TrackingManagerHelper.hh new file mode 100644 index 0000000000..e0a0842a89 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/TrackingManagerHelper.hh @@ -0,0 +1,110 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// TrackingManagerHelper +// +// Class description: +// +// Helper class for reducing the effort required to implement a custom tracking +// manager. It implements a stepping loop that calls user actions as the generic +// tracking and stepping managers do, and it implements navigation for charged +// particles in energy-preserving fields and for neutral particles. +// +// Original author: Jonas Hahnfeld, 2021 + +#ifndef TrackingManagerHelper_hh +#define TrackingManagerHelper_hh 1 + +#include "G4TrackVector.hh" +#include "globals.hh" + +class G4Step; +class G4Track; + +class TrackingManagerHelper +{ + public: + class Physics + { + public: + virtual void StartTracking(G4Track*) {} + virtual void EndTracking() {} + + // Combines AlongStep and PostStep; the implementation needs to remember + // the right value to pass as previousStepSize to G4VProcess. + virtual G4double GetPhysicalInteractionLength(const G4Track& track) = 0; + + // This method is called for every step after navigation. The updated + // position is stored in the G4Step's post-step point. Any particle change + // should be applied directly to the step, UpdateTrack() will be called + // automatically after this method returns. If secondaries should be given + // back to the G4EventManager, put them into the container passed as the + // last argument. + virtual void AlongStepDoIt(G4Track& track, G4Step& step, + G4TrackVector& secondaries) = 0; + + // This method is called unless the track has been killed during this step. + // If secondaries should be given back to the G4EventManager, put them into + // the container passed as the last argument. + virtual void PostStepDoIt(G4Track& track, G4Step& step, + G4TrackVector& secondaries) = 0; + + virtual bool HasAtRestProcesses() { return false; } + + // This method is called when a track is stopped, but still alive. If + // secondaries should be given back to the G4EventManager, put them into + // the container passed as the last argument. + virtual void AtRestDoIt(G4Track& track, G4Step& step, + G4TrackVector& secondaries) + { + (void) track; + (void) step; + (void) secondaries; + } + }; + + class Navigation + { + public: + virtual G4double MakeStep(G4Track& track, G4Step& step, + G4double physicalStep) = 0; + + virtual void FinishStep(G4Track& track, G4Step& step) = 0; + }; + + template + static void TrackParticle(G4Track* aTrack, PhysicsImpl& physics, + NavigationImpl& navigation); + + template + static void TrackChargedParticle(G4Track* aTrack, PhysicsImpl& physics); + + template + static void TrackNeutralParticle(G4Track* aTrack, PhysicsImpl& physics); +}; + +#include "TrackingManagerHelper.icc" + +#endif diff --git a/examples/extended/runAndEvent/RE07/include/TrackingManagerHelper.icc b/examples/extended/runAndEvent/RE07/include/TrackingManagerHelper.icc new file mode 100644 index 0000000000..e1fc764437 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/include/TrackingManagerHelper.icc @@ -0,0 +1,596 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// TrackingManagerHelper +// +// Class description: +// +// Helper class for reducing the effort required to implement a custom tracking +// manager. It implements a stepping loop that calls user actions as the generic +// tracking and stepping managers do, and it implements navigation for charged +// particles in energy-preserving fields and for neutral particles. +// +// Original author: Jonas Hahnfeld, 2021 + +#include "G4EventManager.hh" +#include "G4Step.hh" +#include "G4StepPoint.hh" +#include "G4Track.hh" +#include "G4TrackVector.hh" +#include "G4UserSteppingAction.hh" +#include "G4UserTrackingAction.hh" +#include "G4VSensitiveDetector.hh" + +#include "G4Field.hh" +#include "G4FieldManager.hh" +#include "G4FieldManagerStore.hh" +#include "G4GeometryTolerance.hh" +#include "G4LogicalVolume.hh" +#include "G4Navigator.hh" +#include "G4PropagatorInField.hh" +#include "G4Region.hh" +#include "G4SafetyHelper.hh" +#include "G4TouchableHandle.hh" +#include "G4TouchableHistory.hh" +#include "G4TransportationManager.hh" +#include "G4VPhysicalVolume.hh" + +template +void TrackingManagerHelper::TrackParticle(G4Track* aTrack, PhysicsImpl& physics, + NavigationImpl& navigation) +{ + // Prepare for calling the user action. + auto* evtMgr = G4EventManager::GetEventManager(); + auto* userTrackingAction = evtMgr->GetUserTrackingAction(); + auto* userSteppingAction = evtMgr->GetUserSteppingAction(); + + // Locate the track in geometry. + { + auto* transMgr = G4TransportationManager::GetTransportationManager(); + auto* linearNavigator = transMgr->GetNavigatorForTracking(); + + const G4ThreeVector& pos = aTrack->GetPosition(); + const G4ThreeVector& dir = aTrack->GetMomentumDirection(); + + // Do not assign directly, doesn't work if the handle is empty. + G4TouchableHandle touchableHandle; + if(aTrack->GetTouchableHandle()) + { + touchableHandle = aTrack->GetTouchableHandle(); + // FIXME: This assumes we only ever have G4TouchableHistorys! + auto* touchableHistory = (G4TouchableHistory*) touchableHandle(); + G4VPhysicalVolume* oldTopVolume = touchableHandle->GetVolume(); + G4VPhysicalVolume* newTopVolume = + linearNavigator->ResetHierarchyAndLocate(pos, dir, *touchableHistory); + // TODO: WHY?! + if(newTopVolume != oldTopVolume || + oldTopVolume->GetRegularStructureId() == 1) + { + touchableHandle = linearNavigator->CreateTouchableHistory(); + aTrack->SetTouchableHandle(touchableHandle); + } + } + else + { + linearNavigator->LocateGlobalPointAndSetup(pos, &dir, false, false); + touchableHandle = linearNavigator->CreateTouchableHistory(); + aTrack->SetTouchableHandle(touchableHandle); + } + aTrack->SetNextTouchableHandle(touchableHandle); + } + + // Prepare data structures used while tracking. + G4Step step; + step.NewSecondaryVector(); + G4StepPoint& preStepPoint = *step.GetPreStepPoint(); + step.InitializeStep(aTrack); + aTrack->SetStep(&step); + G4TrackVector secondaries; + + // Start of tracking: Inform user and processes. + if(userTrackingAction) + { + userTrackingAction->PreUserTrackingAction(aTrack); + } + + physics.StartTracking(aTrack); + + while(aTrack->GetTrackStatus() == fAlive) + { + // Beginning of this step: Prepare data structures. + aTrack->IncrementCurrentStepNumber(); + + step.CopyPostToPreStepPoint(); + step.ResetTotalEnergyDeposit(); + aTrack->SetTouchableHandle(aTrack->GetNextTouchableHandle()); + + auto* lvol = aTrack->GetTouchable()->GetVolume()->GetLogicalVolume(); + preStepPoint.SetMaterial(lvol->GetMaterial()); + preStepPoint.SetMaterialCutsCouple(lvol->GetMaterialCutsCouple()); + + // Query step lengths from pyhsics and geometry, decide on limit. + G4double physicalStep = physics.GetPhysicalInteractionLength(*aTrack); + G4double geometryStep = navigation.MakeStep(*aTrack, step, physicalStep); + + bool geometryLimitedStep = geometryStep < physicalStep; + G4double finalStep = geometryLimitedStep ? geometryStep : physicalStep; + + step.SetStepLength(finalStep); + aTrack->SetStepLength(finalStep); + + // Call AlongStepDoIt in every step. + physics.AlongStepDoIt(*aTrack, step, secondaries); + step.UpdateTrack(); + + if(aTrack->GetTrackStatus() == fAlive && + aTrack->GetKineticEnergy() < DBL_MIN) + { + if(physics.HasAtRestProcesses()) + { + aTrack->SetTrackStatus(fStopButAlive); + } + else + { + aTrack->SetTrackStatus(fStopAndKill); + } + } + + navigation.FinishStep(*aTrack, step); + + // Check if the track left the world. + if(aTrack->GetNextVolume() == nullptr) + { + aTrack->SetTrackStatus(fStopAndKill); + } + + // The check should rather check for == fAlive and avoid calling + // PostStepDoIt for fStopButAlive, but the generic stepping loop + // does it like this... + if(aTrack->GetTrackStatus() != fStopAndKill) + { + physics.PostStepDoIt(*aTrack, step, secondaries); + } + + // Need to get the true step length, not the geometry step length! + aTrack->AddTrackLength(step.GetStepLength()); + + // End of this step: Call sensitive detector and stepping actions. + if(step.GetControlFlag() != AvoidHitInvocation) + { + auto* sensitive = lvol->GetSensitiveDetector(); + if(sensitive) + { + sensitive->Hit(&step); + } + } + + if(userSteppingAction) + { + userSteppingAction->UserSteppingAction(&step); + } + + auto* regionalAction = lvol->GetRegion()->GetRegionalSteppingAction(); + if(regionalAction) + { + regionalAction->UserSteppingAction(&step); + } + } + + if(aTrack->GetTrackStatus() == fStopButAlive && + aTrack->GetNextVolume() != nullptr) + { + // Do one final step. + aTrack->IncrementCurrentStepNumber(); + + step.CopyPostToPreStepPoint(); + step.ResetTotalEnergyDeposit(); + + physics.AtRestDoIt(*aTrack, step, secondaries); + + // End of this step: Call sensitive detector and stepping actions. + auto* lvol = aTrack->GetTouchable()->GetVolume()->GetLogicalVolume(); + if(step.GetControlFlag() != AvoidHitInvocation) + { + auto sensitive = lvol->GetSensitiveDetector(); + if(sensitive) + { + sensitive->Hit(&step); + } + } + + if(userSteppingAction) + { + userSteppingAction->UserSteppingAction(&step); + } + + auto* regionalAction = lvol->GetRegion()->GetRegionalSteppingAction(); + if(regionalAction) + { + regionalAction->UserSteppingAction(&step); + } + } + + // End of tracking: Inform processes and user. + physics.EndTracking(); + + if(userTrackingAction) + { + userTrackingAction->PostUserTrackingAction(aTrack); + } + + evtMgr->StackTracks(&secondaries); + + step.DeleteSecondaryVector(); +} + +template +void TrackingManagerHelper::TrackChargedParticle(G4Track* aTrack, + PhysicsImpl& physics) +{ + class ChargedNavigation final : public Navigation + { + public: + ChargedNavigation() + { + auto* transMgr = G4TransportationManager::GetTransportationManager(); + fLinearNavigator = transMgr->GetNavigatorForTracking(); + fFieldPropagator = transMgr->GetPropagatorInField(); + fSafetyHelper = transMgr->GetSafetyHelper(); + kCarTolerance = + 0.5 * G4GeometryTolerance::GetInstance()->GetSurfaceTolerance(); + + // Reset sstate of field propagator and all chord finders. + fFieldPropagator->ClearPropagatorState(); + + auto* fieldMgrStore = G4FieldManagerStore::GetInstance(); + fieldMgrStore->ClearAllChordFindersState(); + } + + G4double MakeStep(G4Track& track, G4Step& step, + G4double physicalStep) override + { + G4ThreeVector pos = track.GetPosition(); + G4ThreeVector dir = track.GetMomentumDirection(); + G4StepPoint& postStepPoint = *step.GetPostStepPoint(); + + bool fieldExertsForce = false; + if(auto* fieldMgr = + fFieldPropagator->FindAndSetFieldManager(track.GetVolume())) + { + fieldMgr->ConfigureForTrack(&track); + if(const G4Field* ptrField = fieldMgr->GetDetectorField()) + { + fieldExertsForce = true; + } + } + + G4double endpointDistance; + G4double safety = 0.0; + // Setting a fallback value for safety is required in case of where very + // short steps where the field propagator returns immediately without + // calling geometry. + const G4double shiftSquare = (pos - fSafetyOrigin).mag2(); + if(shiftSquare < sqr(fSafety)) + { + safety = fSafety - std::sqrt(shiftSquare); + } + + if(fieldExertsForce) + { + const G4DynamicParticle* pParticle = track.GetDynamicParticle(); + const G4double particleCharge = pParticle->GetCharge(); + const G4double particleMass = pParticle->GetMass(); + const G4double magneticMoment = pParticle->GetMagneticMoment(); + const G4ThreeVector particleSpin = pParticle->GetPolarization(); + const G4double kineticEnergy = pParticle->GetKineticEnergy(); + const auto pParticleDef = pParticle->GetDefinition(); + const auto particlePDGSpin = pParticleDef->GetPDGSpin(); + const auto particlePDGMagM = pParticleDef->GetPDGMagneticMoment(); + + auto equationOfMotion = fFieldPropagator->GetCurrentEquationOfMotion(); + equationOfMotion->SetChargeMomentumMass( + G4ChargeState(particleCharge, magneticMoment, particlePDGSpin), + pParticle->GetTotalMomentum(), particleMass); + + const G4ThreeVector startPosition = pos; + const G4ThreeVector startDirection = dir; + G4FieldTrack aFieldTrack(startPosition, + track.GetGlobalTime(), // Lab. + dir, kineticEnergy, particleMass, + particleCharge, particleSpin, particlePDGMagM, + 0.0, // Length along track + particlePDGSpin); + + // Do the Transport in the field (non recti-linear) + // + fGeometryLimitedStep = false; + const G4double lengthAlongCurve = fFieldPropagator->ComputeStep( + aFieldTrack, physicalStep, safety, track.GetVolume(), + kineticEnergy < 250.0); + if(lengthAlongCurve < physicalStep) + { + physicalStep = lengthAlongCurve; + fGeometryLimitedStep = true; + } + fSafetyHelper->SetCurrentSafety(safety, pos); + fSafetyOrigin = pos; + fSafety = safety; + + if(fFieldPropagator->IsParticleLooping()) + { + track.SetTrackStatus(fStopAndKill); + } + + pos = aFieldTrack.GetPosition(); + dir = aFieldTrack.GetMomentumDir(); + + postStepPoint.SetPosition(pos); + postStepPoint.SetMomentumDirection(dir); + + endpointDistance = (startPosition - pos).mag(); + } + else + { + fGeometryLimitedStep = false; + G4double linearStepLength = + fLinearNavigator->ComputeStep(pos, dir, physicalStep, safety); + if(linearStepLength < physicalStep) + { + physicalStep = linearStepLength; + fGeometryLimitedStep = true; + } + fSafetyHelper->SetCurrentSafety(safety, pos); + fSafetyOrigin = pos; + fSafety = safety; + + // Update the position. + pos += physicalStep * dir; + postStepPoint.SetPosition(pos); + + endpointDistance = physicalStep; + } + + // Update global, local, and proper time. + double velocity = track.GetVelocity(); + double deltaTime = 0; + if(velocity > 0) + { + deltaTime = physicalStep / velocity; + } + + postStepPoint.AddGlobalTime(deltaTime); + postStepPoint.AddLocalTime(deltaTime); + + double restMass = track.GetDynamicParticle()->GetMass(); + double deltaProperTime = deltaTime * (restMass / track.GetTotalEnergy()); + postStepPoint.AddProperTime(deltaProperTime); + + // Compute safety, including the call to safetyHelper, but don't set the + // safety in the post-step point to mimick the generic stepping loop. + if(safety > physicalStep) + { + safety -= physicalStep; + } + else if(safety < endpointDistance) + { + safety = fLinearNavigator->ComputeSafety(pos); + fSafetyHelper->SetCurrentSafety(safety, pos); + fSafetyOrigin = pos; + fSafety = safety; + } + else + { + safety = 0; + } + if(safety < kCarTolerance) + { + fPostStepSafety = kCarTolerance; + } + else + { + fPostStepSafety = safety; + } + + return physicalStep; + } + + void FinishStep(G4Track& track, G4Step& step) override + { + // Now set the safety that was computed in MakeStep. + G4StepPoint& postStepPoint = *step.GetPostStepPoint(); + postStepPoint.SetSafety(fPostStepSafety); + + G4TouchableHandle touchableHandle = track.GetTouchableHandle(); + const G4ThreeVector& pos = track.GetPosition(); + if(fGeometryLimitedStep) + { + // Relocate the particle. + fLinearNavigator->SetGeometricallyLimitedStep(); + fLinearNavigator->LocateGlobalPointAndUpdateTouchableHandle( + pos, track.GetMomentumDirection(), touchableHandle, true); + const G4VPhysicalVolume* newVolume = touchableHandle->GetVolume(); + if(newVolume == nullptr) + { + postStepPoint.SetStepStatus(fWorldBoundary); + } + else + { + postStepPoint.SetStepStatus(fGeomBoundary); + } + } + else + { + // Move the Navigator's location. + fLinearNavigator->LocateGlobalPointWithinVolume(pos); + } + + postStepPoint.SetTouchableHandle(touchableHandle); + track.SetNextTouchableHandle(touchableHandle); + } + + private: + G4Navigator* fLinearNavigator; + G4PropagatorInField* fFieldPropagator; + G4SafetyHelper* fSafetyHelper; + G4ThreeVector fSafetyOrigin; + G4double fSafety = 0; + G4double fPostStepSafety = 0; + G4double kCarTolerance; + G4bool fGeometryLimitedStep; + }; + + ChargedNavigation navigation; + TrackParticle(aTrack, physics, navigation); +} + +template +void TrackingManagerHelper::TrackNeutralParticle(G4Track* aTrack, + PhysicsImpl& physics) +{ + class NeutralNavigation final : public Navigation + { + public: + NeutralNavigation() + { + auto* transMgr = G4TransportationManager::GetTransportationManager(); + fLinearNavigator = transMgr->GetNavigatorForTracking(); + fSafetyHelper = transMgr->GetSafetyHelper(); + kCarTolerance = + 0.5 * G4GeometryTolerance::GetInstance()->GetSurfaceTolerance(); + } + + G4double MakeStep(G4Track& track, G4Step& step, + G4double physicalStep) override + { + G4ThreeVector pos = track.GetPosition(); + G4ThreeVector dir = track.GetMomentumDirection(); + G4StepPoint& postStepPoint = *step.GetPostStepPoint(); + + G4double safety = 0.0; + const G4double shiftSquare = (pos - fSafetyOrigin).mag2(); + if(shiftSquare < sqr(fSafety)) + { + safety = fSafety - std::sqrt(shiftSquare); + } + + fGeometryLimitedStep = false; + G4double linearStepLength = + fLinearNavigator->ComputeStep(pos, dir, physicalStep, safety); + if(linearStepLength < physicalStep) + { + physicalStep = linearStepLength; + fGeometryLimitedStep = true; + } + fSafetyHelper->SetCurrentSafety(safety, pos); + fSafetyOrigin = pos; + fSafety = safety; + + // Update the position. + pos += physicalStep * dir; + postStepPoint.SetPosition(pos); + + // Update global, local, and proper time. + double velocity = track.GetVelocity(); + double deltaTime = 0; + if(velocity > 0) + { + deltaTime = physicalStep / velocity; + } + postStepPoint.AddGlobalTime(deltaTime); + postStepPoint.AddLocalTime(deltaTime); + + double restMass = track.GetDynamicParticle()->GetMass(); + double deltaProperTime = deltaTime * (restMass / track.GetTotalEnergy()); + postStepPoint.AddProperTime(deltaProperTime); + + // Compute safety, but don't set the safety in the post-step point to + // mimick the generic stepping loop. + if(safety > physicalStep) + { + safety -= physicalStep; + } + else + { + safety = 0; + } + if(safety < kCarTolerance) + { + fPostStepSafety = kCarTolerance; + } + else + { + fPostStepSafety = safety; + } + + return physicalStep; + } + + void FinishStep(G4Track& track, G4Step& step) override + { + // Now set the safety that was computed in MakeStep. + G4StepPoint& postStepPoint = *step.GetPostStepPoint(); + postStepPoint.SetSafety(fPostStepSafety); + + G4TouchableHandle touchableHandle = track.GetTouchableHandle(); + const G4ThreeVector& pos = track.GetPosition(); + if(fGeometryLimitedStep) + { + // Relocate the particle. + fLinearNavigator->SetGeometricallyLimitedStep(); + fLinearNavigator->LocateGlobalPointAndUpdateTouchableHandle( + pos, track.GetMomentumDirection(), touchableHandle, true); + const G4VPhysicalVolume* newVolume = touchableHandle->GetVolume(); + if(newVolume == nullptr) + { + postStepPoint.SetStepStatus(fWorldBoundary); + } + else + { + postStepPoint.SetStepStatus(fGeomBoundary); + } + } + else + { + // Move the Navigator's location. + fLinearNavigator->LocateGlobalPointWithinVolume(pos); + } + + postStepPoint.SetTouchableHandle(touchableHandle); + track.SetNextTouchableHandle(touchableHandle); + } + + private: + G4Navigator* fLinearNavigator; + G4SafetyHelper* fSafetyHelper; + G4ThreeVector fSafetyOrigin; + G4double fSafety = 0; + G4double fPostStepSafety = 0; + G4double kCarTolerance; + G4bool fGeometryLimitedStep; + }; + + NeutralNavigation navigation; + TrackParticle(aTrack, physics, navigation); +} diff --git a/examples/extended/runAndEvent/RE07/processes.mac b/examples/extended/runAndEvent/RE07/processes.mac new file mode 100644 index 0000000000..a2b79b324a --- /dev/null +++ b/examples/extended/runAndEvent/RE07/processes.mac @@ -0,0 +1,5 @@ +/setMode processes +/run/numberOfThreads 1 + +/run/initialize +/run/beamOn 1000 diff --git a/examples/extended/runAndEvent/RE07/specialized.mac b/examples/extended/runAndEvent/RE07/specialized.mac new file mode 100644 index 0000000000..0e973fae0b --- /dev/null +++ b/examples/extended/runAndEvent/RE07/specialized.mac @@ -0,0 +1,5 @@ +/setMode specialized +/run/numberOfThreads 1 + +/run/initialize +/run/beamOn 1000 diff --git a/examples/extended/runAndEvent/RE07/src/ActionInitialization.cc b/examples/extended/runAndEvent/RE07/src/ActionInitialization.cc new file mode 100644 index 0000000000..cfcdf23ffd --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/ActionInitialization.cc @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +/// \file ActionInitialization.cc +/// \brief Implementation of the ActionInitialization class + +#include "ActionInitialization.hh" +#include "DetectorConstruction.hh" +#include "EventAction.hh" +#include "PrimaryGeneratorAction.hh" +#include "RunAction.hh" +#include "SteppingAction.hh" +#include "TrackingAction.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::ActionInitialization(DetectorConstruction* det) + : G4VUserActionInitialization() + , fDetector(det) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +ActionInitialization::~ActionInitialization() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::BuildForMaster() const +{ + SetUserAction(new RunAction(fDetector)); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void ActionInitialization::Build() const +{ + PrimaryGeneratorAction* prim = new PrimaryGeneratorAction(fDetector); + SetUserAction(prim); + + RunAction* run = new RunAction(fDetector, prim); + SetUserAction(run); + + EventAction* event = new EventAction(fDetector); + SetUserAction(event); + + SetUserAction(new TrackingAction); + + SetUserAction(new SteppingAction(fDetector, event)); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/src/DetectorConstruction.cc b/examples/extended/runAndEvent/RE07/src/DetectorConstruction.cc new file mode 100644 index 0000000000..608402e2a1 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/DetectorConstruction.cc @@ -0,0 +1,379 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file src/DetectorConstruction.cc +/// \brief Implementation of the DetectorConstruction class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "DetectorConstruction.hh" +#include "DetectorMessenger.hh" + +#include "G4Box.hh" +#include "G4LogicalVolume.hh" +#include "G4Material.hh" +#include "G4NistManager.hh" +#include "G4PVPlacement.hh" +#include "G4PVReplica.hh" +#include "G4ProductionCutsTable.hh" +#include "G4Region.hh" + +#include "G4PhysicalConstants.hh" +#include "G4RunManager.hh" +#include "G4SystemOfUnits.hh" +#include "G4UnitsTable.hh" + +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorConstruction::DetectorConstruction() + : fWorldMaterial(nullptr) + , fLogicWorld(nullptr) + , fPhysiWorld(nullptr) + , fLogicLayerFront(nullptr) + , fLogicLayerBack(nullptr) +{ + for(G4int i = 0; i < kMaxAbsor; ++i) + { + fAbsorMaterial[i] = nullptr; + fAbsorThickness[i] = 0.0; + fLogicAbsorFront[i] = nullptr; + fLogicAbsorBack[i] = nullptr; + } + + // default parameter values of the calorimeter + fNbOfAbsor = 2; + fAbsorThickness[1] = 2.3 * mm; + fAbsorThickness[2] = 5.7 * mm; + fNbOfLayers = 50; + fCalorSizeYZ = 40. * cm; + ComputeCalorParameters(); + + // materials + SetWorldMaterial("G4_Galactic"); + SetAbsorMaterial(1, "G4_Pb"); + SetAbsorMaterial(2, "G4_lAr"); + + // create commands for interactive definition of the calorimeter + fDetectorMessenger.reset(new DetectorMessenger(this)); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::ComputeCalorParameters() +{ + // Compute derived parameters of the calorimeter + fLayerThickness = 0.; + for(G4int iAbs = 1; iAbs <= fNbOfAbsor; iAbs++) + { + fLayerThickness += fAbsorThickness[iAbs]; + } + fCalorThickness = fNbOfLayers * fLayerThickness; + fWorldSizeX = 1.2 * fCalorThickness; + fWorldSizeYZ = 1.2 * fCalorSizeYZ; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4VPhysicalVolume* DetectorConstruction::Construct() +{ + if(fPhysiWorld) + { + return fPhysiWorld; + } + // complete the Calor parameters definition + ComputeCalorParameters(); + + // + // World + // + auto* solidWorld = new G4Box("World", // its name + fWorldSizeX / 2, fWorldSizeYZ / 2, + fWorldSizeYZ / 2); // its size + + fLogicWorld = new G4LogicalVolume(solidWorld, // its solid + fWorldMaterial, // its material + "World"); // its name + + fPhysiWorld = new G4PVPlacement(0, // no rotation + G4ThreeVector(), // at (0,0,0) + fLogicWorld, // its fLogical volume + "World", // its name + 0, // its mother volume + false, // no boolean operation + 0); // copy number + // + // Calorimeter + // + + auto* solidCalor = new G4Box("Calorimeter", fCalorThickness / 2, + fCalorSizeYZ / 2, fCalorSizeYZ / 2); + + auto* logicCalor = + new G4LogicalVolume(solidCalor, fWorldMaterial, "Calorimeter"); + + new G4PVPlacement(0, // no rotation + G4ThreeVector(), // at (0,0,0) + logicCalor, // its fLogical volume + "Calorimeter", // its name + fLogicWorld, // its mother volume + false, // no boolean operation + 0); // copy number + + // + // Layers + // + + auto* solidLayer = + new G4Box("Layer", fLayerThickness / 2, fCalorSizeYZ / 2, fCalorSizeYZ / 2); + + fLogicLayerFront = + new G4LogicalVolume(solidLayer, fWorldMaterial, "Layer-front"); + fLogicLayerBack = + new G4LogicalVolume(solidLayer, fWorldMaterial, "Layer-back"); + G4double xfront = -0.5 * fCalorThickness; + for(G4int l = 0; l < fNbOfLayers; ++l) + { + G4double xcenter = xfront + 0.5 * fLayerThickness; + xfront += fLayerThickness; + G4LogicalVolume* logicLayer = fLogicLayerFront; + if(xcenter > 0) + { + logicLayer = fLogicLayerBack; + } + + new G4PVPlacement(0, G4ThreeVector(xcenter, 0, 0), logicLayer, "Layer", + logicCalor, false, l); + } + + // + // Regions + // + + auto* regionFront = new G4Region("Front"); + regionFront->SetProductionCuts(G4ProductionCutsTable::GetProductionCutsTable() + ->GetDefaultProductionCuts()); + regionFront->AddRootLogicalVolume(fLogicLayerFront); + auto* regionBack = new G4Region("Back"); + regionBack->SetProductionCuts(G4ProductionCutsTable::GetProductionCutsTable() + ->GetDefaultProductionCuts()); + regionBack->AddRootLogicalVolume(fLogicLayerBack); + + // + // Absorbers + // + + xfront = -0.5 * fLayerThickness; + for(G4int k = 1; k <= fNbOfAbsor; ++k) + { + auto* solidAbsor = + new G4Box("Absorber", // its name + fAbsorThickness[k] / 2, fCalorSizeYZ / 2, fCalorSizeYZ / 2); + + fLogicAbsorFront[k] = + new G4LogicalVolume(solidAbsor, // its solid + fAbsorMaterial[k], // its material + fAbsorMaterial[k]->GetName()); + fLogicAbsorBack[k] = new G4LogicalVolume(solidAbsor, // its solid + fAbsorMaterial[k], // its material + fAbsorMaterial[k]->GetName()); + + G4double xcenter = xfront + 0.5 * fAbsorThickness[k]; + xfront += fAbsorThickness[k]; + new G4PVPlacement(0, G4ThreeVector(xcenter, 0., 0.), fLogicAbsorFront[k], + fAbsorMaterial[k]->GetName(), fLogicLayerFront, false, + k); // copy number + new G4PVPlacement(0, G4ThreeVector(xcenter, 0., 0.), fLogicAbsorBack[k], + fAbsorMaterial[k]->GetName(), fLogicLayerBack, false, + k); // copy number + } + + PrintCalorParameters(); + + // always return the fPhysical World + // + return fPhysiWorld; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::PrintCalorParameters() +{ + G4cout << "\n-------------------------------------------------------------" + << "\n ---> The calorimeter is " << fNbOfLayers << " layers of:"; + for(G4int i = 1; i <= fNbOfAbsor; ++i) + { + G4cout << "\n \t" << std::setw(12) << fAbsorMaterial[i]->GetName() << ": " + << std::setw(6) << G4BestUnit(fAbsorThickness[i], "Length"); + } + G4cout << "\n-------------------------------------------------------------\n"; + + G4cout << "\n" << fWorldMaterial << G4endl; + for(G4int j = 1; j <= fNbOfAbsor; ++j) + { + G4cout << "\n" << fAbsorMaterial[j] << G4endl; + } + G4cout << "\n-------------------------------------------------------------\n"; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetWorldMaterial(const G4String& material) +{ + // search the material by its name + G4Material* pttoMaterial = + G4NistManager::Instance()->FindOrBuildMaterial(material); + if(pttoMaterial) + { + fWorldMaterial = pttoMaterial; + if(fLogicWorld) + { + fLogicWorld->SetMaterial(fWorldMaterial); + fLogicLayerFront->SetMaterial(fWorldMaterial); + fLogicLayerBack->SetMaterial(fWorldMaterial); + G4RunManager::GetRunManager()->PhysicsHasBeenModified(); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetNbOfLayers(G4int ival) +{ + // set the number of Layers + // + if(ival < 2) + { + G4cout << "\n --->warning from SetfNbOfLayers: " << ival + << " must be at least 2. Command refused" << G4endl; + return; + } + fNbOfLayers = ival; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetNbOfAbsor(G4int ival) +{ + // set the number of Absorbers + // + if(ival < 1 || ival > (kMaxAbsor - 1)) + { + G4cout << "\n ---> warning from SetfNbOfAbsor: " << ival + << " must be at least 1 and and most " << kMaxAbsor - 1 + << ". Command refused" << G4endl; + return; + } + fNbOfAbsor = ival; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetAbsorMaterial(G4int ival, + const G4String& material) +{ + // search the material by its name + // + if(ival > fNbOfAbsor || ival <= 0) + { + G4cout << "\n --->warning from SetAbsorMaterial: absor number " << ival + << " out of range. Command refused" << G4endl; + return; + } + + G4Material* pttoMaterial = + G4NistManager::Instance()->FindOrBuildMaterial(material); + if(pttoMaterial) + { + fAbsorMaterial[ival] = pttoMaterial; + if(fLogicAbsorFront[ival]) + { + fLogicAbsorFront[ival]->SetMaterial(pttoMaterial); + fLogicAbsorBack[ival]->SetMaterial(pttoMaterial); + G4RunManager::GetRunManager()->PhysicsHasBeenModified(); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetAbsorThickness(G4int ival, G4double val) +{ + // change Absorber thickness + // + if(ival > fNbOfAbsor || ival <= 0) + { + G4cout << "\n --->warning from SetAbsorThickness: absor number " << ival + << " out of range. Command refused" << G4endl; + return; + } + if(val <= DBL_MIN) + { + G4cout << "\n --->warning from SetAbsorThickness: thickness " << val + << " out of range. Command refused" << G4endl; + return; + } + fAbsorThickness[ival] = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetCalorSizeYZ(G4double val) +{ + // change the transverse size + // + if(val <= DBL_MIN) + { + G4cout << "\n --->warning from SetfCalorSizeYZ: thickness " << val + << " out of range. Command refused" << G4endl; + return; + } + fCalorSizeYZ = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4AutoDelete.hh" +#include "G4GlobalMagFieldMessenger.hh" + +void DetectorConstruction::ConstructSDandField() +{ + if(fFieldMessenger.Get() == nullptr) + { + // Create global magnetic field messenger. + // Uniform magnetic field is then created automatically if + // the field value is not zero. + G4ThreeVector fieldValue = G4ThreeVector(); + G4GlobalMagFieldMessenger* msg = new G4GlobalMagFieldMessenger(fieldValue); + // msg->SetVerboseLevel(1); + G4AutoDelete::Register(msg); + fFieldMessenger.Put(msg); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/src/DetectorMessenger.cc b/examples/extended/runAndEvent/RE07/src/DetectorMessenger.cc new file mode 100644 index 0000000000..d7dfbb4879 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/DetectorMessenger.cc @@ -0,0 +1,140 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file src/DetectorMessenger.cc +/// \brief Implementation of the DetectorMessenger class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "DetectorMessenger.hh" + +#include + +#include "DetectorConstruction.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithAnInteger.hh" +#include "G4UIcmdWithoutParameter.hh" +#include "G4UIcommand.hh" +#include "G4UIdirectory.hh" +#include "G4UIparameter.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorMessenger::DetectorMessenger(DetectorConstruction* Det) + : G4UImessenger() + , fDetector(Det) +{ + fDetDir.reset(new G4UIdirectory("/det/")); + fDetDir->SetGuidance("detector construction commands"); + + fSizeYZCmd.reset(new G4UIcmdWithADoubleAndUnit("/det/setSizeYZ", this)); + fSizeYZCmd->SetGuidance("Set tranverse size of the calorimeter"); + fSizeYZCmd->SetParameterName("Size", false); + fSizeYZCmd->SetRange("Size>0."); + fSizeYZCmd->SetUnitCategory("Length"); + fSizeYZCmd->AvailableForStates(G4State_PreInit); + fSizeYZCmd->SetToBeBroadcasted(false); + + fNbLayersCmd.reset(new G4UIcmdWithAnInteger("/det/setNbOfLayers", this)); + fNbLayersCmd->SetGuidance("Set number of layers."); + fNbLayersCmd->SetParameterName("NbLayers", false); + fNbLayersCmd->SetRange("NbLayers>0"); + fNbLayersCmd->AvailableForStates(G4State_PreInit); + fNbLayersCmd->SetToBeBroadcasted(false); + + fNbAbsorCmd.reset(new G4UIcmdWithAnInteger("/det/setNbOfAbsor", this)); + fNbAbsorCmd->SetGuidance("Set number of Absorbers."); + fNbAbsorCmd->SetParameterName("NbAbsor", false); + fNbAbsorCmd->SetRange("NbAbsor>0"); + fNbAbsorCmd->AvailableForStates(G4State_PreInit); + fNbAbsorCmd->SetToBeBroadcasted(false); + + fAbsorCmd.reset(new G4UIcommand("/det/setAbsor", this)); + fAbsorCmd->SetGuidance("Set the absor nb, the material, the thickness."); + fAbsorCmd->SetGuidance(" absor number : from 1 to NbOfAbsor"); + fAbsorCmd->SetGuidance(" material name"); + fAbsorCmd->SetGuidance(" thickness (with unit) : t>0."); + // + G4UIparameter* AbsNbPrm = new G4UIparameter("AbsorNb", 'i', false); + AbsNbPrm->SetGuidance("absor number : from 1 to NbOfAbsor"); + AbsNbPrm->SetParameterRange("AbsorNb>0"); + fAbsorCmd->SetParameter(AbsNbPrm); + // + G4UIparameter* MatPrm = new G4UIparameter("material", 's', false); + MatPrm->SetGuidance("material name"); + fAbsorCmd->SetParameter(MatPrm); + // + G4UIparameter* ThickPrm = new G4UIparameter("thickness", 'd', false); + ThickPrm->SetGuidance("thickness of absorber"); + ThickPrm->SetParameterRange("thickness>0."); + fAbsorCmd->SetParameter(ThickPrm); + // + G4UIparameter* unitPrm = new G4UIparameter("unit", 's', false); + unitPrm->SetGuidance("unit of thickness"); + G4String unitList = G4UIcommand::UnitsList(G4UIcommand::CategoryOf("mm")); + unitPrm->SetParameterCandidates(unitList); + fAbsorCmd->SetParameter(unitPrm); + // + fAbsorCmd->AvailableForStates(G4State_PreInit); + fAbsorCmd->SetToBeBroadcasted(false); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorMessenger::~DetectorMessenger() = default; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if(command == fSizeYZCmd.get()) + { + fDetector->SetCalorSizeYZ(fSizeYZCmd->GetNewDoubleValue(newValue)); + } + else if(command == fNbLayersCmd.get()) + { + fDetector->SetNbOfLayers(fNbLayersCmd->GetNewIntValue(newValue)); + } + else if(command == fNbAbsorCmd.get()) + { + fDetector->SetNbOfAbsor(fNbAbsorCmd->GetNewIntValue(newValue)); + } + else if(command == fAbsorCmd.get()) + { + G4int num; + G4double tick; + G4String unt, mat; + std::istringstream is(newValue); + is >> num >> mat >> tick >> unt; + G4String material = mat; + tick *= G4UIcommand::ValueOf(unt); + fDetector->SetAbsorMaterial(num, material); + fDetector->SetAbsorThickness(num, tick); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/src/EmStandardPhysicsTrackingManager.cc b/examples/extended/runAndEvent/RE07/src/EmStandardPhysicsTrackingManager.cc new file mode 100644 index 0000000000..3c2a461321 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/EmStandardPhysicsTrackingManager.cc @@ -0,0 +1,790 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Implementation of a custom tracking manager for e-/e+ and gamma, using +// the same processes as defined in G4EmStandardPhysics. +// +// Original author: Jonas Hahnfeld, 2021 + +#include "EmStandardPhysicsTrackingManager.hh" +#include "TrackingManagerHelper.hh" + +#include "G4CoulombScattering.hh" +#include "G4UrbanMscModel.hh" +#include "G4WentzelVIModel.hh" +#include "G4eBremsstrahlung.hh" +#include "G4eCoulombScatteringModel.hh" +#include "G4eIonisation.hh" +#include "G4eMultipleScattering.hh" +#include "G4eplusAnnihilation.hh" + +#include "G4ComptonScattering.hh" +#include "G4GammaConversion.hh" +#include "G4KleinNishinaModel.hh" +#include "G4LivermorePhotoElectricModel.hh" +#include "G4LivermorePolarizedRayleighModel.hh" +#include "G4PhotoElectricAngularGeneratorPolarized.hh" +#include "G4PhotoElectricEffect.hh" +#include "G4RayleighScattering.hh" + +#include "G4EmParameters.hh" +#include "G4SystemOfUnits.hh" + +#include "G4Electron.hh" +#include "G4Gamma.hh" +#include "G4Positron.hh" + +EmStandardPhysicsTrackingManager* + EmStandardPhysicsTrackingManager::masterTrackingManager = nullptr; + +EmStandardPhysicsTrackingManager::EmStandardPhysicsTrackingManager() +{ + G4EmParameters* param = G4EmParameters::Instance(); + G4double highEnergyLimit = param->MscEnergyLimit(); + G4bool polar = param->EnablePolarisation(); + + // e- + { + G4eMultipleScattering* msc = new G4eMultipleScattering; + G4UrbanMscModel* msc1 = new G4UrbanMscModel; + G4WentzelVIModel* msc2 = new G4WentzelVIModel; + msc1->SetHighEnergyLimit(highEnergyLimit); + msc2->SetLowEnergyLimit(highEnergyLimit); + msc->SetEmModel(msc1); + msc->SetEmModel(msc2); + fElectronProcs.msc = msc; + + fElectronProcs.ioni = new G4eIonisation; + fElectronProcs.brems = new G4eBremsstrahlung; + + G4CoulombScattering* ss = new G4CoulombScattering; + G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel; + ssm->SetLowEnergyLimit(highEnergyLimit); + ssm->SetActivationLowEnergyLimit(highEnergyLimit); + ss->SetEmModel(ssm); + ss->SetMinKinEnergy(highEnergyLimit); + fElectronProcs.ss = ss; + } + + // e+ + { + G4eMultipleScattering* msc = new G4eMultipleScattering; + G4UrbanMscModel* msc1 = new G4UrbanMscModel; + G4WentzelVIModel* msc2 = new G4WentzelVIModel; + msc1->SetHighEnergyLimit(highEnergyLimit); + msc2->SetLowEnergyLimit(highEnergyLimit); + msc->SetEmModel(msc1); + msc->SetEmModel(msc2); + fPositronProcs.msc = msc; + + fPositronProcs.ioni = new G4eIonisation; + fPositronProcs.brems = new G4eBremsstrahlung; + fPositronProcs.annihilation = new G4eplusAnnihilation; + + G4CoulombScattering* ss = new G4CoulombScattering; + G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel; + ssm->SetLowEnergyLimit(highEnergyLimit); + ssm->SetActivationLowEnergyLimit(highEnergyLimit); + ss->SetEmModel(ssm); + ss->SetMinKinEnergy(highEnergyLimit); + fPositronProcs.ss = ss; + } + + { + G4PhotoElectricEffect* pe = new G4PhotoElectricEffect; + G4VEmModel* peModel = new G4LivermorePhotoElectricModel; + if(polar) + { + peModel->SetAngularDistribution( + new G4PhotoElectricAngularGeneratorPolarized); + } + pe->SetEmModel(peModel); + fGammaProcs.pe = pe; + + G4ComptonScattering* cs = new G4ComptonScattering; + if(polar) + { + cs->SetEmModel(new G4KleinNishinaModel); + } + fGammaProcs.compton = cs; + + fGammaProcs.conversion = new G4GammaConversion; + + G4RayleighScattering* rl = new G4RayleighScattering; + if(polar) + { + rl->SetEmModel(new G4LivermorePolarizedRayleighModel); + } + fGammaProcs.rayleigh = rl; + } + + if(masterTrackingManager == nullptr) + { + masterTrackingManager = this; + } + else + { + fElectronProcs.msc->SetMasterProcess( + masterTrackingManager->fElectronProcs.msc); + fElectronProcs.ss->SetMasterProcess( + masterTrackingManager->fElectronProcs.ss); + fElectronProcs.ioni->SetMasterProcess( + masterTrackingManager->fElectronProcs.ioni); + fElectronProcs.brems->SetMasterProcess( + masterTrackingManager->fElectronProcs.brems); + + fPositronProcs.msc->SetMasterProcess( + masterTrackingManager->fPositronProcs.msc); + fPositronProcs.ss->SetMasterProcess( + masterTrackingManager->fPositronProcs.ss); + fPositronProcs.ioni->SetMasterProcess( + masterTrackingManager->fPositronProcs.ioni); + fPositronProcs.brems->SetMasterProcess( + masterTrackingManager->fPositronProcs.brems); + fPositronProcs.annihilation->SetMasterProcess( + masterTrackingManager->fPositronProcs.annihilation); + + fGammaProcs.pe->SetMasterProcess(masterTrackingManager->fGammaProcs.pe); + fGammaProcs.compton->SetMasterProcess( + masterTrackingManager->fGammaProcs.compton); + fGammaProcs.conversion->SetMasterProcess( + masterTrackingManager->fGammaProcs.conversion); + fGammaProcs.rayleigh->SetMasterProcess( + masterTrackingManager->fGammaProcs.rayleigh); + } +} + +EmStandardPhysicsTrackingManager::~EmStandardPhysicsTrackingManager() +{ + if(masterTrackingManager == this) + { + masterTrackingManager = nullptr; + } +} + +void EmStandardPhysicsTrackingManager::BuildPhysicsTable( + const G4ParticleDefinition& part) +{ + if(&part == G4Electron::Definition()) + { + fElectronProcs.msc->BuildPhysicsTable(part); + fElectronProcs.ioni->BuildPhysicsTable(part); + fElectronProcs.brems->BuildPhysicsTable(part); + fElectronProcs.ss->BuildPhysicsTable(part); + } + else if(&part == G4Positron::Definition()) + { + fPositronProcs.msc->BuildPhysicsTable(part); + fPositronProcs.ioni->BuildPhysicsTable(part); + fPositronProcs.brems->BuildPhysicsTable(part); + fPositronProcs.annihilation->BuildPhysicsTable(part); + fPositronProcs.ss->BuildPhysicsTable(part); + } + else if(&part == G4Gamma::Definition()) + { + fGammaProcs.pe->BuildPhysicsTable(part); + fGammaProcs.compton->BuildPhysicsTable(part); + fGammaProcs.conversion->BuildPhysicsTable(part); + fGammaProcs.rayleigh->BuildPhysicsTable(part); + } +} + +void EmStandardPhysicsTrackingManager::PreparePhysicsTable( + const G4ParticleDefinition& part) +{ + if(&part == G4Electron::Definition()) + { + fElectronProcs.msc->PreparePhysicsTable(part); + fElectronProcs.ioni->PreparePhysicsTable(part); + fElectronProcs.brems->PreparePhysicsTable(part); + fElectronProcs.ss->PreparePhysicsTable(part); + } + else if(&part == G4Positron::Definition()) + { + fPositronProcs.msc->PreparePhysicsTable(part); + fPositronProcs.ioni->PreparePhysicsTable(part); + fPositronProcs.brems->PreparePhysicsTable(part); + fPositronProcs.annihilation->PreparePhysicsTable(part); + fPositronProcs.ss->PreparePhysicsTable(part); + } + else if(&part == G4Gamma::Definition()) + { + fGammaProcs.pe->PreparePhysicsTable(part); + fGammaProcs.compton->PreparePhysicsTable(part); + fGammaProcs.conversion->PreparePhysicsTable(part); + fGammaProcs.rayleigh->PreparePhysicsTable(part); + } +} + +void EmStandardPhysicsTrackingManager::TrackElectron(G4Track* aTrack) +{ + class ElectronPhysics final : public TrackingManagerHelper::Physics + { + public: + ElectronPhysics(EmStandardPhysicsTrackingManager& mgr) + : fMgr(mgr) + {} + + void StartTracking(G4Track* aTrack) override + { + auto& electronProcs = fMgr.fElectronProcs; + + electronProcs.msc->StartTracking(aTrack); + electronProcs.ioni->StartTracking(aTrack); + electronProcs.brems->StartTracking(aTrack); + electronProcs.ss->StartTracking(aTrack); + + fPreviousStepLength = 0; + } + void EndTracking() override + { + auto& electronProcs = fMgr.fElectronProcs; + + electronProcs.msc->EndTracking(); + electronProcs.ioni->EndTracking(); + electronProcs.brems->EndTracking(); + electronProcs.ss->EndTracking(); + } + + G4double GetPhysicalInteractionLength(const G4Track& track) override + { + auto& electronProcs = fMgr.fElectronProcs; + G4double physIntLength, proposedSafety = DBL_MAX; + G4ForceCondition condition; + G4GPILSelection selection; + + fProposedStep = DBL_MAX; + fSelected = -1; + + physIntLength = + electronProcs.ss->PostStepGPIL(track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 0; + } + + physIntLength = electronProcs.brems->PostStepGPIL( + track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 1; + } + + physIntLength = electronProcs.ioni->PostStepGPIL( + track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 2; + } + + physIntLength = electronProcs.ioni->AlongStepGPIL( + track, fPreviousStepLength, fProposedStep, proposedSafety, &selection); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = -1; + } + + physIntLength = electronProcs.msc->AlongStepGPIL( + track, fPreviousStepLength, fProposedStep, proposedSafety, &selection); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + // Check if MSC actually wants to win, in most cases it only limits the + // step size. + if(selection == CandidateForSelection) + { + fSelected = -1; + } + } + + return fProposedStep; + } + + void AlongStepDoIt(G4Track& track, G4Step& step, G4TrackVector&) override + { + if(step.GetStepLength() == fProposedStep) + { + step.GetPostStepPoint()->SetStepStatus(fAlongStepDoItProc); + } + else + { + // Remember that the step was limited by geometry. + fSelected = -1; + } + auto& electronProcs = fMgr.fElectronProcs; + G4VParticleChange* particleChange; + + particleChange = electronProcs.msc->AlongStepDoIt(track, step); + particleChange->UpdateStepForAlongStep(&step); + track.SetTrackStatus(particleChange->GetTrackStatus()); + particleChange->Clear(); + + particleChange = electronProcs.ioni->AlongStepDoIt(track, step); + particleChange->UpdateStepForAlongStep(&step); + track.SetTrackStatus(particleChange->GetTrackStatus()); + particleChange->Clear(); + + fPreviousStepLength = step.GetStepLength(); + } + + void PostStepDoIt(G4Track& track, G4Step& step, + G4TrackVector& secondaries) override + { + if(fSelected < 0) + { + return; + } + step.GetPostStepPoint()->SetStepStatus(fPostStepDoItProc); + + auto& electronProcs = fMgr.fElectronProcs; + G4VProcess* process = nullptr; + G4VParticleChange* particleChange = nullptr; + + switch(fSelected) + { + case 0: + process = electronProcs.ss; + particleChange = electronProcs.ss->PostStepDoIt(track, step); + break; + case 1: + process = electronProcs.brems; + particleChange = electronProcs.brems->PostStepDoIt(track, step); + break; + case 2: + process = electronProcs.ioni; + particleChange = electronProcs.ioni->PostStepDoIt(track, step); + break; + } + + particleChange->UpdateStepForPostStep(&step); + step.UpdateTrack(); + + int numSecondaries = particleChange->GetNumberOfSecondaries(); + for(int i = 0; i < numSecondaries; i++) + { + G4Track* secondary = particleChange->GetSecondary(i); + secondary->SetParentID(track.GetTrackID()); + secondary->SetCreatorProcess(process); + secondaries.push_back(secondary); + } + + track.SetTrackStatus(particleChange->GetTrackStatus()); + particleChange->Clear(); + } + + private: + EmStandardPhysicsTrackingManager& fMgr; + G4double fPreviousStepLength; + G4double fProposedStep; + G4int fSelected; + }; + + ElectronPhysics physics(*this); + TrackingManagerHelper::TrackChargedParticle(aTrack, physics); +} + +void EmStandardPhysicsTrackingManager::TrackPositron(G4Track* aTrack) +{ + class PositronPhysics final : public TrackingManagerHelper::Physics + { + public: + PositronPhysics(EmStandardPhysicsTrackingManager& mgr) + : fMgr(mgr) + {} + + void StartTracking(G4Track* aTrack) override + { + auto& positronProcs = fMgr.fPositronProcs; + + positronProcs.msc->StartTracking(aTrack); + positronProcs.ioni->StartTracking(aTrack); + positronProcs.brems->StartTracking(aTrack); + positronProcs.annihilation->StartTracking(aTrack); + positronProcs.ss->StartTracking(aTrack); + + fPreviousStepLength = 0; + } + void EndTracking() override + { + auto& positronProcs = fMgr.fPositronProcs; + + positronProcs.msc->EndTracking(); + positronProcs.ioni->EndTracking(); + positronProcs.brems->EndTracking(); + positronProcs.annihilation->EndTracking(); + positronProcs.ss->EndTracking(); + } + + G4double GetPhysicalInteractionLength(const G4Track& track) override + { + auto& positronProcs = fMgr.fPositronProcs; + G4double physIntLength, proposedSafety = DBL_MAX; + G4ForceCondition condition; + G4GPILSelection selection; + + fProposedStep = DBL_MAX; + fSelected = -1; + + physIntLength = + positronProcs.ss->PostStepGPIL(track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 0; + } + + physIntLength = positronProcs.annihilation->PostStepGPIL( + track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 1; + } + + physIntLength = positronProcs.brems->PostStepGPIL( + track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 2; + } + + physIntLength = positronProcs.ioni->PostStepGPIL( + track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 3; + } + + physIntLength = positronProcs.ioni->AlongStepGPIL( + track, fPreviousStepLength, fProposedStep, proposedSafety, &selection); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = -1; + } + + physIntLength = positronProcs.msc->AlongStepGPIL( + track, fPreviousStepLength, fProposedStep, proposedSafety, &selection); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + // Check if MSC actually wants to win, in most cases it only limits the + // step size. + if(selection == CandidateForSelection) + { + fSelected = -1; + } + } + + return fProposedStep; + } + + void AlongStepDoIt(G4Track& track, G4Step& step, G4TrackVector&) override + { + if(step.GetStepLength() == fProposedStep) + { + step.GetPostStepPoint()->SetStepStatus(fAlongStepDoItProc); + } + else + { + // Remember that the step was limited by geometry. + fSelected = -1; + } + auto& positronProcs = fMgr.fPositronProcs; + G4VParticleChange* particleChange; + + particleChange = positronProcs.msc->AlongStepDoIt(track, step); + particleChange->UpdateStepForAlongStep(&step); + track.SetTrackStatus(particleChange->GetTrackStatus()); + particleChange->Clear(); + + particleChange = positronProcs.ioni->AlongStepDoIt(track, step); + particleChange->UpdateStepForAlongStep(&step); + track.SetTrackStatus(particleChange->GetTrackStatus()); + particleChange->Clear(); + + fPreviousStepLength = step.GetStepLength(); + } + + void PostStepDoIt(G4Track& track, G4Step& step, + G4TrackVector& secondaries) override + { + if(fSelected < 0) + { + return; + } + step.GetPostStepPoint()->SetStepStatus(fPostStepDoItProc); + + auto& positronProcs = fMgr.fPositronProcs; + G4VProcess* process; + G4VParticleChange* particleChange = nullptr; + + switch(fSelected) + { + case 0: + process = positronProcs.ss; + particleChange = positronProcs.ss->PostStepDoIt(track, step); + break; + case 1: + process = positronProcs.annihilation; + particleChange = + positronProcs.annihilation->PostStepDoIt(track, step); + break; + case 2: + process = positronProcs.brems; + particleChange = positronProcs.brems->PostStepDoIt(track, step); + break; + case 3: + process = positronProcs.ioni; + particleChange = positronProcs.ioni->PostStepDoIt(track, step); + break; + } + + particleChange->UpdateStepForPostStep(&step); + step.UpdateTrack(); + + int numSecondaries = particleChange->GetNumberOfSecondaries(); + for(int i = 0; i < numSecondaries; i++) + { + G4Track* secondary = particleChange->GetSecondary(i); + secondary->SetParentID(track.GetTrackID()); + secondary->SetCreatorProcess(process); + secondaries.push_back(secondary); + } + + track.SetTrackStatus(particleChange->GetTrackStatus()); + particleChange->Clear(); + } + + G4bool HasAtRestProcesses() override { return true; } + + void AtRestDoIt(G4Track& track, G4Step& step, + G4TrackVector& secondaries) override + { + auto& positronProcs = fMgr.fPositronProcs; + // Annihilate the positron at rest. + G4VParticleChange* particleChange = + positronProcs.annihilation->AtRestDoIt(track, step); + particleChange->UpdateStepForAtRest(&step); + step.UpdateTrack(); + + int numSecondaries = particleChange->GetNumberOfSecondaries(); + for(int i = 0; i < numSecondaries; i++) + { + G4Track* secondary = particleChange->GetSecondary(i); + secondary->SetParentID(track.GetTrackID()); + secondary->SetCreatorProcess(positronProcs.annihilation); + secondaries.push_back(secondary); + } + + track.SetTrackStatus(particleChange->GetTrackStatus()); + particleChange->Clear(); + } + + private: + EmStandardPhysicsTrackingManager& fMgr; + G4double fPreviousStepLength; + G4double fProposedStep; + G4int fSelected; + }; + + PositronPhysics physics(*this); + TrackingManagerHelper::TrackChargedParticle(aTrack, physics); +} + +void EmStandardPhysicsTrackingManager::TrackGamma(G4Track* aTrack) +{ + class GammaPhysics final : public TrackingManagerHelper::Physics + { + public: + GammaPhysics(EmStandardPhysicsTrackingManager& mgr) + : fMgr(mgr) + {} + + void StartTracking(G4Track* aTrack) override + { + auto& gammaProcs = fMgr.fGammaProcs; + + gammaProcs.pe->StartTracking(aTrack); + gammaProcs.compton->StartTracking(aTrack); + gammaProcs.conversion->StartTracking(aTrack); + gammaProcs.rayleigh->StartTracking(aTrack); + + fPreviousStepLength = 0; + } + void EndTracking() override + { + auto& gammaProcs = fMgr.fGammaProcs; + + gammaProcs.pe->EndTracking(); + gammaProcs.compton->EndTracking(); + gammaProcs.conversion->EndTracking(); + gammaProcs.rayleigh->EndTracking(); + } + + G4double GetPhysicalInteractionLength(const G4Track& track) override + { + auto& gammaProcs = fMgr.fGammaProcs; + G4double physIntLength; + G4ForceCondition condition; + + fProposedStep = DBL_MAX; + fSelected = -1; + + physIntLength = gammaProcs.rayleigh->PostStepGPIL( + track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 0; + } + + physIntLength = gammaProcs.conversion->PostStepGPIL( + track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 1; + } + + physIntLength = gammaProcs.compton->PostStepGPIL( + track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 2; + } + + physIntLength = + gammaProcs.pe->PostStepGPIL(track, fPreviousStepLength, &condition); + if(physIntLength < fProposedStep) + { + fProposedStep = physIntLength; + fSelected = 3; + } + + return fProposedStep; + } + + void AlongStepDoIt(G4Track&, G4Step& step, G4TrackVector&) override + { + if(step.GetStepLength() == fProposedStep) + { + step.GetPostStepPoint()->SetStepStatus(fAlongStepDoItProc); + } + else + { + // Remember that the step was limited by geometry. + fSelected = -1; + } + fPreviousStepLength = step.GetStepLength(); + } + + void PostStepDoIt(G4Track& track, G4Step& step, + G4TrackVector& secondaries) override + { + if(fSelected < 0) + { + return; + } + step.GetPostStepPoint()->SetStepStatus(fPostStepDoItProc); + + auto& gammaProcs = fMgr.fGammaProcs; + G4VProcess* process = nullptr; + G4VParticleChange* particleChange = nullptr; + + switch(fSelected) + { + case 0: + process = gammaProcs.rayleigh; + particleChange = gammaProcs.rayleigh->PostStepDoIt(track, step); + break; + case 1: + process = gammaProcs.conversion; + particleChange = gammaProcs.conversion->PostStepDoIt(track, step); + break; + case 2: + process = gammaProcs.compton; + particleChange = gammaProcs.compton->PostStepDoIt(track, step); + break; + case 3: + process = gammaProcs.pe; + particleChange = gammaProcs.pe->PostStepDoIt(track, step); + break; + } + + particleChange->UpdateStepForPostStep(&step); + step.UpdateTrack(); + + int numSecondaries = particleChange->GetNumberOfSecondaries(); + for(int i = 0; i < numSecondaries; i++) + { + G4Track* secondary = particleChange->GetSecondary(i); + secondary->SetParentID(track.GetTrackID()); + secondary->SetCreatorProcess(process); + secondaries.push_back(secondary); + } + + track.SetTrackStatus(particleChange->GetTrackStatus()); + particleChange->Clear(); + } + + private: + EmStandardPhysicsTrackingManager& fMgr; + G4double fPreviousStepLength; + G4double fProposedStep; + G4int fSelected; + }; + + GammaPhysics physics(*this); + TrackingManagerHelper::TrackNeutralParticle(aTrack, physics); +} + +void EmStandardPhysicsTrackingManager::HandOverOneTrack(G4Track* aTrack) +{ + const G4ParticleDefinition* part = aTrack->GetParticleDefinition(); + + if(part == G4Electron::Definition()) + { + TrackElectron(aTrack); + } + else if(part == G4Positron::Definition()) + { + TrackPositron(aTrack); + } + else if(part == G4Gamma::Definition()) + { + TrackGamma(aTrack); + } + + aTrack->SetTrackStatus(fStopAndKill); + delete aTrack; +} diff --git a/examples/basic/B3/B3a/src/B3aActionInitialization.cc b/examples/extended/runAndEvent/RE07/src/EventAction.cc similarity index 73% rename from examples/basic/B3/B3a/src/B3aActionInitialization.cc rename to examples/extended/runAndEvent/RE07/src/EventAction.cc index 5766e89d08..beb9878819 100644 --- a/examples/basic/B3/B3a/src/B3aActionInitialization.cc +++ b/examples/extended/runAndEvent/RE07/src/EventAction.cc @@ -23,44 +23,48 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // +/// \file src/EventAction.cc +/// \brief Implementation of the EventAction class // -/// \file B3aActionInitialization.cc -/// \brief Implementation of the B3aActionInitialization class +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "B3aActionInitialization.hh" -#include "B3aRunAction.hh" -#include "B3aEventAction.hh" -#include "B3PrimaryGeneratorAction.hh" -#include "B3StackingAction.hh" +#include "EventAction.hh" + +#include "Run.hh" + +#include "G4Event.hh" +#include "G4RunManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3aActionInitialization::B3aActionInitialization() - : G4VUserActionInitialization() +EventAction::EventAction(DetectorConstruction* det) + : G4UserEventAction() + , fDetector(det) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -B3aActionInitialization::~B3aActionInitialization() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void B3aActionInitialization::BuildForMaster() const +void EventAction::BeginOfEventAction(const G4Event*) { - SetUserAction(new B3aRunAction); + for(G4int k = 0; k < kMaxAbsor; k++) + { + fEnergyDeposit[k] = fTrackLengthCh[k] = 0.0; + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void B3aActionInitialization::Build() const +void EventAction::EndOfEventAction(const G4Event*) { - B3aRunAction* runAction = new B3aRunAction(); - SetUserAction(runAction); + Run* run = + static_cast(G4RunManager::GetRunManager()->GetNonConstCurrentRun()); - SetUserAction(new B3aEventAction(runAction)); - SetUserAction(new B3PrimaryGeneratorAction); - SetUserAction(new B3StackingAction); + for(G4int k = 1; k <= fDetector->GetNbOfAbsor(); k++) + { + run->FillPerEvent(k, fEnergyDeposit[k], fTrackLengthCh[k]); + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/src/PhysicsList.cc b/examples/extended/runAndEvent/RE07/src/PhysicsList.cc new file mode 100644 index 0000000000..8ad8f08f2c --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/PhysicsList.cc @@ -0,0 +1,107 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file PhysicsList.cc +/// \brief Implementation of the PhysicsList class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysicsList.hh" +#include "PhysicsListMessenger.hh" + +#include "PhysicsListEmSpecialized.hh" +#include "PhysicsListEmStandardTracking.hh" + +#include "G4EmStandardPhysics.hh" + +#include "G4BaryonConstructor.hh" +#include "G4BosonConstructor.hh" +#include "G4IonConstructor.hh" +#include "G4LeptonConstructor.hh" +#include "G4MesonConstructor.hh" +#include "G4ShortLivedConstructor.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsList::PhysicsList() +{ + SetVerboseLevel(0); + + fMessenger.reset(new PhysicsListMessenger(this)); + // By default, use the standard physics list with processes. + fEmPhysicsList.reset(new G4EmStandardPhysics(GetVerboseLevel())); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::ConstructParticle() +{ + G4BaryonConstructor::ConstructParticle(); + G4BosonConstructor::ConstructParticle(); + G4IonConstructor::ConstructParticle(); + G4LeptonConstructor::ConstructParticle(); + G4MesonConstructor::ConstructParticle(); + G4ShortLivedConstructor::ConstructParticle(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::ConstructProcess() +{ + AddTransportation(); + fEmPhysicsList->ConstructProcess(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetMode(const G4String& name) +{ + if(verboseLevel > -1) + { + G4cout << "PhysicsList::SetMode: <" << name << ">" << G4endl; + } + + if(name == "processes") + { + fEmPhysicsList.reset(new G4EmStandardPhysics(GetVerboseLevel())); + } + else if(name == "tracking") + { + fEmPhysicsList.reset(new PhysicsListEmStandardTracking(GetVerboseLevel())); + } + else if(name == "specialized") + { + fEmPhysicsList.reset(new PhysicsListEmSpecialized(GetVerboseLevel())); + } + else + { + G4cout << "PhysicsList::SetMode: <" << name << ">" + << " is not defined" << G4endl; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/src/PhysicsListEmSpecialized.cc b/examples/extended/runAndEvent/RE07/src/PhysicsListEmSpecialized.cc new file mode 100644 index 0000000000..ee144b7531 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/PhysicsListEmSpecialized.cc @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysicsListEmSpecialized.hh" + +#include "SpecializedTrackingManager.hh" + +#include "G4Electron.hh" +#include "G4Gamma.hh" +#include "G4ParticleDefinition.hh" +#include "G4Positron.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListEmSpecialized::PhysicsListEmSpecialized(G4int ver, + const G4String& name) + : G4EmStandardPhysics(ver, name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListEmSpecialized::~PhysicsListEmSpecialized() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsListEmSpecialized::ConstructProcess() +{ + G4EmStandardPhysics::ConstructProcess(); + + G4Electron::Definition()->SetTrackingManager(new SpecializedTrackingManager); +} diff --git a/examples/extended/hadronic/Hadr07/src/NeutronHPMessenger.cc b/examples/extended/runAndEvent/RE07/src/PhysicsListEmStandardTracking.cc similarity index 65% rename from examples/extended/hadronic/Hadr07/src/NeutronHPMessenger.cc rename to examples/extended/runAndEvent/RE07/src/PhysicsListEmStandardTracking.cc index 8e9f8bb4b1..9af14216f6 100644 --- a/examples/extended/hadronic/Hadr07/src/NeutronHPMessenger.cc +++ b/examples/extended/runAndEvent/RE07/src/PhysicsListEmStandardTracking.cc @@ -23,49 +23,52 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -/// \file NeutronHPMessenger.cc -/// \brief Implementation of the NeutronHPMessenger class -// // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "NeutronHPMessenger.hh" +#include "PhysicsListEmStandardTracking.hh" -#include "HadronElasticPhysicsHP.hh" +#include "EmStandardPhysicsTrackingManager.hh" -#include "G4UIdirectory.hh" -#include "G4UIcmdWithABool.hh" +#include "G4Electron.hh" +#include "G4EmBuilder.hh" +#include "G4Gamma.hh" +#include "G4ParticleDefinition.hh" +#include "G4Positron.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -NeutronHPMessenger::NeutronHPMessenger(HadronElasticPhysicsHP* phys) -:G4UImessenger(),fNeutronPhysics(phys), - fPhysDir(0), fThermalCmd(0) -{ - fPhysDir = new G4UIdirectory("/testhadr/phys/"); - fPhysDir->SetGuidance("physics list commands"); - - fThermalCmd = new G4UIcmdWithABool("/testhadr/phys/thermalScattering",this); - fThermalCmd->SetGuidance("set thermal scattering model"); - fThermalCmd->SetParameterName("thermal",false); - fThermalCmd->AvailableForStates(G4State_PreInit); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -NeutronHPMessenger::~NeutronHPMessenger() +PhysicsListEmStandardTracking::PhysicsListEmStandardTracking(G4int ver) + : G4VPhysicsConstructor("EmStandardTracking") { - delete fThermalCmd; - delete fPhysDir; + SetVerboseLevel(ver); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void NeutronHPMessenger::SetNewValue(G4UIcommand* command, G4String newValue) -{ - if (command == fThermalCmd) - {fNeutronPhysics->SetThermalPhysics(fThermalCmd->GetNewBoolValue(newValue));} +PhysicsListEmStandardTracking::~PhysicsListEmStandardTracking() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsListEmStandardTracking::ConstructParticle() +{ + // Taken care of in PhysicsList.cc } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsListEmStandardTracking::ConstructProcess() +{ + G4EmBuilder::PrepareEMPhysics(); + + // Register custom tracking manager for e-/e+ and gammas. Note that tracking + // managers take precendence over processes registered in the G4ProcessManager + // and hides them, so additional physics constructors like G4EmExtraPhysics + // will not work! + auto* trackingManager = new EmStandardPhysicsTrackingManager; + + G4Electron::Definition()->SetTrackingManager(trackingManager); + G4Positron::Definition()->SetTrackingManager(trackingManager); + G4Gamma::Definition()->SetTrackingManager(trackingManager); +} diff --git a/examples/extended/runAndEvent/RE07/src/PhysicsListMessenger.cc b/examples/extended/runAndEvent/RE07/src/PhysicsListMessenger.cc new file mode 100644 index 0000000000..b54a135f65 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/PhysicsListMessenger.cc @@ -0,0 +1,66 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file PhysicsListMessenger.cc +/// \brief Implementation of the PhysicsListMessenger class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysicsListMessenger.hh" + +#include "G4UIcmdWithAString.hh" +#include "G4UIdirectory.hh" +#include "PhysicsList.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListMessenger::PhysicsListMessenger(PhysicsList* pPhys) + : G4UImessenger() + , fPhysicsList(pPhys) +{ + fModeCmd.reset(new G4UIcmdWithAString("/setMode", this)); + fModeCmd->SetGuidance("Add physics mode."); + fModeCmd->SetParameterName("mode", false); + fModeCmd->AvailableForStates(G4State_PreInit); + fModeCmd->SetToBeBroadcasted(false); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListMessenger::~PhysicsListMessenger() = default; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsListMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if(command == fModeCmd.get()) + { + fPhysicsList->SetMode(newValue); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/analysis/AnaEx03/shared/src/PrimaryGeneratorAction.cc b/examples/extended/runAndEvent/RE07/src/PrimaryGeneratorAction.cc similarity index 74% rename from examples/extended/analysis/AnaEx03/shared/src/PrimaryGeneratorAction.cc rename to examples/extended/runAndEvent/RE07/src/PrimaryGeneratorAction.cc index 779587b9bd..e7eae3be52 100644 --- a/examples/extended/analysis/AnaEx03/shared/src/PrimaryGeneratorAction.cc +++ b/examples/extended/runAndEvent/RE07/src/PrimaryGeneratorAction.cc @@ -23,12 +23,10 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -/// \file PrimaryGeneratorAction.cc +/// \file src/PrimaryGeneratorAction.cc /// \brief Implementation of the PrimaryGeneratorAction class // // -// -// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -36,51 +34,37 @@ #include "DetectorConstruction.hh" -#include "G4Event.hh" +#include "G4Electron.hh" #include "G4ParticleGun.hh" -#include "G4ParticleTable.hh" -#include "G4ParticleDefinition.hh" #include "G4SystemOfUnits.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PrimaryGeneratorAction::PrimaryGeneratorAction(DetectorConstruction* DC) -: G4VUserPrimaryGeneratorAction(), - fParticleGun(0), - fDetector(DC) +PrimaryGeneratorAction::PrimaryGeneratorAction(DetectorConstruction* det) + : fDetector(det) { - G4int n_particle = 1; - fParticleGun = new G4ParticleGun(n_particle); - - // default particle kinematic - - G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); - G4String particleName; - G4ParticleDefinition* particle - = particleTable->FindParticle(particleName="e-"); - fParticleGun->SetParticleDefinition(particle); - fParticleGun->SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.)); - fParticleGun->SetParticleEnergy(500.*MeV); - G4double position = -0.5*(fDetector->GetWorldSizeX()); - fParticleGun->SetParticlePosition(G4ThreeVector(position,0.*cm,0.*cm)); - + G4int numberOfParticles = 1; + fParticleGun.reset(new G4ParticleGun(numberOfParticles)); + SetDefaultKinematic(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PrimaryGeneratorAction::~PrimaryGeneratorAction() +void PrimaryGeneratorAction::SetDefaultKinematic() { - delete fParticleGun; + G4ParticleDefinition* particle = G4Electron::Definition(); + fParticleGun->SetParticleDefinition(particle); + fParticleGun->SetParticleMomentumDirection(G4ThreeVector(1, 0, 0)); + fParticleGun->SetParticleEnergy(1 * GeV); + G4double position = -0.5 * fDetector->GetWorldSizeX(); + fParticleGun->SetParticlePosition(G4ThreeVector(position, 0, 0)); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { - //this function is called at the begining of event - // fParticleGun->GeneratePrimaryVertex(anEvent); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - diff --git a/examples/extended/runAndEvent/RE07/src/Run.cc b/examples/extended/runAndEvent/RE07/src/Run.cc new file mode 100644 index 0000000000..d0e8360dc2 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/Run.cc @@ -0,0 +1,229 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file src/Run.cc +/// \brief Implementation of the Run class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "Run.hh" +#include "DetectorConstruction.hh" +#include "PrimaryGeneratorAction.hh" + +#include "G4Electron.hh" +#include "G4Gamma.hh" +#include "G4ParticleDefinition.hh" +#include "G4ParticleTable.hh" +#include "G4Positron.hh" +#include "G4Track.hh" + +#include "G4SystemOfUnits.hh" +#include "G4UnitsTable.hh" + +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Run::Run(DetectorConstruction* det) + : G4Run() + , fDetector(det) + , fParticle(nullptr) + , fEkin(0.) + , fChargedStep(0) + , fNeutralStep(0) + , fN_gamma(0) + , fN_elec(0) + , fN_pos(0) +{ + // initialize cumulative quantities + // + for(G4int k = 0; k < kMaxAbsor; k++) + { + fSumEAbs[k] = fSum2EAbs[k] = fSumLAbs[k] = fSum2LAbs[k] = 0.; + fEnergyDeposit[k].clear(); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +Run::~Run() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Run::SetPrimary(G4ParticleDefinition* particle, G4double energy) +{ + fParticle = particle; + fEkin = energy; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Run::FillPerEvent(G4int kAbs, G4double EAbs, G4double LAbs) +{ + // accumulate statistic with restriction + // + fEnergyDeposit[kAbs].push_back(EAbs); + fSumEAbs[kAbs] += EAbs; + fSum2EAbs[kAbs] += EAbs * EAbs; + fSumLAbs[kAbs] += LAbs; + fSum2LAbs[kAbs] += LAbs * LAbs; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Run::AddChargedStep() { fChargedStep += 1.0; } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Run::AddNeutralStep() { fNeutralStep += 1.0; } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Run::AddSecondaryTrack(const G4Track* track) +{ + const G4ParticleDefinition* d = track->GetDefinition(); + if(d == G4Gamma::Gamma()) + { + ++fN_gamma; + } + else if(d == G4Electron::Electron()) + { + ++fN_elec; + } + else if(d == G4Positron::Positron()) + { + ++fN_pos; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Run::Merge(const G4Run* run) +{ + const Run* localRun = static_cast(run); + + // pass information about primary particle + fParticle = localRun->fParticle; + fEkin = localRun->fEkin; + + // accumulate sums + // + for(G4int k = 0; k < kMaxAbsor; k++) + { + fSumEAbs[k] += localRun->fSumEAbs[k]; + fSum2EAbs[k] += localRun->fSum2EAbs[k]; + fSumLAbs[k] += localRun->fSumLAbs[k]; + fSum2LAbs[k] += localRun->fSum2LAbs[k]; + } + + fChargedStep += localRun->fChargedStep; + fNeutralStep += localRun->fNeutralStep; + + fN_gamma += localRun->fN_gamma; + fN_elec += localRun->fN_elec; + fN_pos += localRun->fN_pos; + + G4Run::Merge(run); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void Run::EndOfRun() +{ + G4int nEvt = numberOfEvent; + G4double norm = G4double(nEvt); + if(norm > 0) + norm = 1. / norm; + G4double qnorm = std::sqrt(norm); + + fChargedStep *= norm; + fNeutralStep *= norm; + + // compute and print statistic + // + G4double beamEnergy = fEkin; + G4double sqbeam = std::sqrt(beamEnergy / GeV); + + G4double MeanEAbs, MeanEAbs2, rmsEAbs, resolution, rmsres; + G4double MeanLAbs, MeanLAbs2, rmsLAbs; + + std::ios::fmtflags mode = G4cout.flags(); + G4int prec = G4cout.precision(2); + G4cout << "\n------------------------------------------------------------\n"; + G4cout << std::setw(14) << "material" << std::setw(17) << "Edep RMS" + << std::setw(33) << "sqrt(E0(GeV))*rmsE/Emean" << std::setw(23) + << "total tracklen \n \n"; + + for(G4int k = 1; k <= fDetector->GetNbOfAbsor(); k++) + { + MeanEAbs = fSumEAbs[k] * norm; + MeanEAbs2 = fSum2EAbs[k] * norm; + rmsEAbs = std::sqrt(std::abs(MeanEAbs2 - MeanEAbs * MeanEAbs)); + + resolution = 100. * sqbeam * rmsEAbs / MeanEAbs; + rmsres = resolution * qnorm; + + // Save mean and RMS + fSumEAbs[k] = MeanEAbs; + fSum2EAbs[k] = rmsEAbs; + + MeanLAbs = fSumLAbs[k] * norm; + MeanLAbs2 = fSum2LAbs[k] * norm; + rmsLAbs = std::sqrt(std::abs(MeanLAbs2 - MeanLAbs * MeanLAbs)); + + // print + // + G4cout << std::setw(14) << fDetector->GetAbsorMaterial(k)->GetName() << ": " + << std::setprecision(5) << std::setw(6) + << G4BestUnit(MeanEAbs, "Energy") << " : " << std::setprecision(4) + << std::setw(5) << G4BestUnit(rmsEAbs, "Energy") << std::setw(10) + << resolution << " +- " << std::setw(5) << rmsres << " %" + << std::setprecision(3) << std::setw(10) + << G4BestUnit(MeanLAbs, "Length") << " +- " << std::setw(4) + << G4BestUnit(rmsLAbs, "Length") << G4endl; + } + G4cout << "\n------------------------------------------------------------\n"; + + G4cout << " Beam particle " << fParticle->GetParticleName() + << " E = " << G4BestUnit(beamEnergy, "Energy") << G4endl; + G4cout << " Mean number of gamma " << (G4double) fN_gamma * norm + << G4endl; + G4cout << " Mean number of e- " << (G4double) fN_elec * norm + << G4endl; + G4cout << " Mean number of e+ " << (G4double) fN_pos * norm + << G4endl; + G4cout << std::setprecision(6) << " Mean number of charged steps " + << fChargedStep << G4endl; + G4cout << " Mean number of neutral steps " << fNeutralStep << G4endl; + G4cout << "------------------------------------------------------------\n" + << G4endl; + + G4cout.setf(mode, std::ios::floatfield); + G4cout.precision(prec); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/src/RunAction.cc b/examples/extended/runAndEvent/RE07/src/RunAction.cc new file mode 100644 index 0000000000..03fb5f125a --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/RunAction.cc @@ -0,0 +1,98 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file src/RunAction.cc +/// \brief Implementation of the RunAction class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "RunAction.hh" + +#include "DetectorConstruction.hh" +#include "G4RunManager.hh" +#include "G4Timer.hh" +#include "PrimaryGeneratorAction.hh" +#include "Randomize.hh" +#include "Run.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +RunAction::RunAction(DetectorConstruction* det, PrimaryGeneratorAction* prim) + : G4UserRunAction() + , fDetector(det) + , fPrimary(prim) + , fRun(nullptr) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4Run* RunAction::GenerateRun() +{ + fRun = new Run(fDetector); + return fRun; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunAction::BeginOfRunAction(const G4Run*) +{ + // keep run condition + if(fPrimary) + { + G4ParticleDefinition* particle = + fPrimary->GetParticleGun()->GetParticleDefinition(); + G4double energy = fPrimary->GetParticleGun()->GetParticleEnergy(); + fRun->SetPrimary(particle, energy); + } + + if(isMaster) + { + fTimer.Start(); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunAction::EndOfRunAction(const G4Run*) +{ + // compute and print statistic + if(isMaster) + { + fTimer.Stop(); + if(!((G4RunManager::GetRunManager()->GetRunManagerType() == + G4RunManager::sequentialRM))) + { + G4cout << "\n" + << "Total number of events: " << fRun->GetNumberOfEvent() + << G4endl; + G4cout << "Master thread time: " << fTimer << G4endl; + } + fRun->EndOfRun(); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/src/SpecializedTrackingManager.cc b/examples/extended/runAndEvent/RE07/src/SpecializedTrackingManager.cc new file mode 100644 index 0000000000..7cb33354a3 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/SpecializedTrackingManager.cc @@ -0,0 +1,257 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "SpecializedTrackingManager.hh" + +#include "G4EventManager.hh" +#include "G4ProcessManager.hh" +#include "G4RegionStore.hh" +#include "G4StackManager.hh" +#include "G4TrackingManager.hh" + +#include "G4SystemOfUnits.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SpecializedTrackingManager::SpecializedTrackingManager() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SpecializedTrackingManager::~SpecializedTrackingManager() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SpecializedTrackingManager::BuildPhysicsTable( + const G4ParticleDefinition& part) +{ + if(fBackRegion == nullptr) + { + fBackRegion = G4RegionStore::GetInstance()->GetRegion("Back", false); + } + + G4ProcessManager* pManager = part.GetProcessManager(); + G4ProcessManager* pManagerShadow = part.GetMasterProcessManager(); + + G4ProcessVector* pVector = pManager->GetProcessList(); + for(std::size_t j = 0; j < pVector->size(); ++j) + { + if(pManagerShadow == pManager) + { + (*pVector)[j]->BuildPhysicsTable(part); + } + else + { + (*pVector)[j]->BuildWorkerPhysicsTable(part); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SpecializedTrackingManager::PreparePhysicsTable( + const G4ParticleDefinition& part) +{ + G4ProcessManager* pManager = part.GetProcessManager(); + G4ProcessManager* pManagerShadow = part.GetMasterProcessManager(); + + G4ProcessVector* pVector = pManager->GetProcessList(); + for(std::size_t j = 0; j < pVector->size(); ++j) + { + if(pManagerShadow == pManager) + { + (*pVector)[j]->PreparePhysicsTable(part); + } + else + { + (*pVector)[j]->PrepareWorkerPhysicsTable(part); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SpecializedTrackingManager::HandOverOneTrack(G4Track* aTrack) +{ + if(aTrack->GetKineticEnergy() < 100 * MeV) + { + // If the particle energy is lower than 100 MeV, track it immediately by + // passing to the generic G4TrackingManager. This avoids storing lower + // energy particles in the buffer and feeding it through the specialized + // tracking. + G4EventManager* eventManager = G4EventManager::GetEventManager(); + G4TrackingManager* trackManager = eventManager->GetTrackingManager(); + + trackManager->ProcessOneTrack(aTrack); + if(aTrack->GetTrackStatus() != fStopAndKill) + { + G4Exception("SpecializedTrackingManager::HandOverOneTrack", "NotStopped", + FatalException, "track was not stopped"); + } + + G4TrackVector* secondaries = trackManager->GimmeSecondaries(); + eventManager->StackTracks(secondaries); + delete aTrack; + return; + } + + fBufferedTracks.push_back(aTrack); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SpecializedTrackingManager::FlushEvent() +{ + G4EventManager* eventManager = G4EventManager::GetEventManager(); + G4TrackingManager* trackManager = eventManager->GetTrackingManager(); + G4SteppingManager* steppingManager = trackManager->GetSteppingManager(); + G4TrackVector* secondaries = trackManager->GimmeSecondaries(); + + for(G4Track* aTrack : fBufferedTracks) + { + // Clear secondary particle vector + for(std::size_t itr = 0; itr < secondaries->size(); ++itr) + { + delete(*secondaries)[itr]; + } + secondaries->clear(); + + steppingManager->SetInitialStep(aTrack); + + G4UserTrackingAction* userTrackingAction = + trackManager->GetUserTrackingAction(); + if(userTrackingAction != nullptr) + { + userTrackingAction->PreUserTrackingAction(aTrack); + } + + // Give SteppingManger the maxmimum number of processes + steppingManager->GetProcessNumber(); + + // Give track the pointer to the Step + aTrack->SetStep(steppingManager->GetStep()); + + // Inform beginning of tracking to physics processes + aTrack->GetDefinition()->GetProcessManager()->StartTracking(aTrack); + + // Track the particle Step-by-Step while it is alive + while((aTrack->GetTrackStatus() == fAlive) || + (aTrack->GetTrackStatus() == fStopButAlive)) + { + G4Region* region = aTrack->GetVolume()->GetLogicalVolume()->GetRegion(); + if(region == fBackRegion) + { + StepInBackRegion(aTrack); + } + else + { + StepOutside(aTrack); + } + } + + aTrack->GetDefinition()->GetProcessManager()->EndTracking(); + + if(userTrackingAction != nullptr) + { + userTrackingAction->PostUserTrackingAction(aTrack); + } + + eventManager->StackTracks(secondaries); + delete aTrack; + } + + fBufferedTracks.clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SpecializedTrackingManager::StepInBackRegion(G4Track* aTrack) +{ + G4EventManager* eventManager = G4EventManager::GetEventManager(); + G4TrackingManager* trackManager = eventManager->GetTrackingManager(); + G4SteppingManager* steppingManager = trackManager->GetSteppingManager(); + + // Track the particle Step-by-Step while it is alive and inside the "Back" + // region of the detector. Implement a low-energy cut-off for particles + // below 100 MeV. More specialized handling would also be possible, such + // as only killing particles in non-sensitive materials / volumes. + while((aTrack->GetTrackStatus() == fAlive) || + (aTrack->GetTrackStatus() == fStopButAlive)) + { + aTrack->IncrementCurrentStepNumber(); + steppingManager->Stepping(); + + if(aTrack->GetTrackStatus() != fStopAndKill) + { + // Switch the touchable to update the volume, which is checked in the + // condition below and at the call site. + aTrack->SetTouchableHandle(aTrack->GetNextTouchableHandle()); + G4Region* region = aTrack->GetVolume()->GetLogicalVolume()->GetRegion(); + if(region != fBackRegion) + { + return; + } + + if(aTrack->GetKineticEnergy() < 100 * MeV) + { + // Kill the particle. + aTrack->SetTrackStatus(fStopAndKill); + } + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SpecializedTrackingManager::StepOutside(G4Track* aTrack) +{ + G4EventManager* eventManager = G4EventManager::GetEventManager(); + G4TrackingManager* trackManager = eventManager->GetTrackingManager(); + G4SteppingManager* steppingManager = trackManager->GetSteppingManager(); + + // Track the particle Step-by-Step while it is alive and still outside of + // the "Back" region. + while((aTrack->GetTrackStatus() == fAlive) || + (aTrack->GetTrackStatus() == fStopButAlive)) + { + aTrack->IncrementCurrentStepNumber(); + steppingManager->Stepping(); + + if(aTrack->GetTrackStatus() != fStopAndKill) + { + // Switch the touchable to update the volume, which is checked in the + // condition below and at the call site. + aTrack->SetTouchableHandle(aTrack->GetNextTouchableHandle()); + G4Region* region = aTrack->GetVolume()->GetLogicalVolume()->GetRegion(); + if(region == fBackRegion) + { + return; + } + } + } +} diff --git a/examples/extended/runAndEvent/RE07/src/SteppingAction.cc b/examples/extended/runAndEvent/RE07/src/SteppingAction.cc new file mode 100644 index 0000000000..e0c9c7dfa9 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/SteppingAction.cc @@ -0,0 +1,98 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file src/SteppingAction.cc +/// \brief Implementation of the SteppingAction class +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "SteppingAction.hh" + +#include "DetectorConstruction.hh" +#include "EventAction.hh" +#include "Run.hh" + +#include "G4PhysicalConstants.hh" +#include "G4Positron.hh" +#include "G4RunManager.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SteppingAction::SteppingAction(DetectorConstruction* det, EventAction* evt) + : G4UserSteppingAction() + , fDetector(det) + , fEventAct(evt) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SteppingAction::UserSteppingAction(const G4Step* aStep) +{ + // track informations + const G4StepPoint* prePoint = aStep->GetPreStepPoint(); + + // if World, return + // + G4VPhysicalVolume* volume = prePoint->GetTouchableHandle()->GetVolume(); + // if sum of absorbers do not fill exactly a layer: check material, not + // volume. + const G4Material* mat = volume->GetLogicalVolume()->GetMaterial(); + if(mat == fDetector->GetWorldMaterial()) + return; + + const G4ParticleDefinition* particle = aStep->GetTrack()->GetDefinition(); + + // here we are in an absorber. Locate it + // + G4int absorNum = prePoint->GetTouchableHandle()->GetCopyNumber(0); + // G4int layerNum = prePoint->GetTouchableHandle()->GetCopyNumber(1); + + // get Run + Run* run = + static_cast(G4RunManager::GetRunManager()->GetNonConstCurrentRun()); + + // collect energy deposit taking into account track weight + G4double edep = + aStep->GetTotalEnergyDeposit() * aStep->GetTrack()->GetWeight(); + + // collect step length of charged particles + G4double stepl = 0.; + if(particle->GetPDGCharge() != 0.) + { + stepl = aStep->GetStepLength(); + run->AddChargedStep(); + } + else + { + run->AddNeutralStep(); + } + + // sum up per event + fEventAct->SumEnergy(absorNum, edep, stepl); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/src/TrackingAction.cc b/examples/extended/runAndEvent/RE07/src/TrackingAction.cc new file mode 100644 index 0000000000..9423feb8a5 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/src/TrackingAction.cc @@ -0,0 +1,62 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/// \file src/TrackingAction.cc +/// \brief Implementation of the TrackingAction class +// +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "TrackingAction.hh" + +#include "Run.hh" + +#include "G4PhysicalConstants.hh" +#include "G4Positron.hh" +#include "G4RunManager.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +TrackingAction::TrackingAction() + : G4UserTrackingAction() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void TrackingAction::PreUserTrackingAction(const G4Track* track) +{ + // get Run + Run* run = + static_cast(G4RunManager::GetRunManager()->GetNonConstCurrentRun()); + + if(track->GetTrackID() != 1) + { + run->AddSecondaryTrack(track); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/runAndEvent/RE07/tracking.mac b/examples/extended/runAndEvent/RE07/tracking.mac new file mode 100644 index 0000000000..46004a71e1 --- /dev/null +++ b/examples/extended/runAndEvent/RE07/tracking.mac @@ -0,0 +1,5 @@ +/setMode tracking +/run/numberOfThreads 1 + +/run/initialize +/run/beamOn 1000 diff --git a/examples/extended/runAndEvent/README b/examples/extended/runAndEvent/README deleted file mode 100644 index 0a959ee0a4..0000000000 --- a/examples/extended/runAndEvent/README +++ /dev/null @@ -1,61 +0,0 @@ - - Geant4 extended examples - run and event - ---------------------------------------- - - Examples in this directory demonstrate the use of some features in -Run and Event categories. Since these categories are on the top of -hierarchy of Geant4 structure to control the full functionarities of -Geant4, some examples contain features in other categories such as -Tracking, Track, Particles, Detector responces, and even some cases -Geometry and Processes. - -RE01 ----- - - This example demonstrates how to connect the information between -primary particles and hits. It also utilizes some user-information -classes. Readout geometry is implemented as a parallel world. -Decay of "Unknown" particle (that may represent whatever a particle -Geant4 does not know how to deal with) is taken care as "pre-assigned -decay products". - -RE02 ----- - - This example demonstrates how to accumulate the physics quantities -such as energy deposition and dose for a run. It also demonstrates -the use of primitive scorers. - -RE03 ----- - - This example demonstrates how to use UI-command base scoring. -It create parallel world(s) for defining scoring mesh(es). - -RE04 ----- - - This example demonstrates how to define layered mass geometry in -a parallel world and use it in a simulation. - -RE05 ----- - - Defines a simplified collider detector setup. -Demonstrates interfacing to the PYTHIA primary generator. Includes -the definition of a 'readout' geometry. Exercises event filtering using -the stacking mechanism. Includes visualization. -It was moved in extended examples from novice/N04 with removal of -novice examples. - -RE06 ----- - -Implements three simplified sandwitch calorimeters. -Shows how to modify part of the geometry setup at run-time. Includes -detector description parameterisation by materials. Demonstrates -sharing of a sensitive detector definition for different sub-detectors. -Defines different geometrical regions with different production -thresholds. Shows customization of the G4Run. -It was moved in extended examples from novice/N07 with removal of -novice examples. diff --git a/examples/extended/visualization/.README.txt b/examples/extended/visualization/.README.txt deleted file mode 100644 index 396ef36124..0000000000 --- a/examples/extended/visualization/.README.txt +++ /dev/null @@ -1,28 +0,0 @@ - -///\file "visualization/.README.txt" -///\brief Examples visualization README page - -/*! \page Examples_visualization Category "visualization" - -Examples in this directory demonstrate the use of Geant4 visualization. - -\link Examplestandalone standalone \endlink - -This example illustrates how one might use the Geant Visualization -System as a "stand alone" graphics library and viewer. - -\link Exampleperspective perspective \endlink - -This example is another example of using the Geant Visualization -System as a "stand-alone" graphics library and viewer. - -\link ExampleuserVisAction userVisAction \endlink - -This example illustrates how to create a "vis action". - -\link Examplemovies movies \endlink - -This example illustrates how to create movies. - -*/ - diff --git a/examples/extended/visualization/CMakeLists.txt b/examples/extended/visualization/CMakeLists.txt index 6009e91a31..f6abaf99d9 100644 --- a/examples/extended/visualization/CMakeLists.txt +++ b/examples/extended/visualization/CMakeLists.txt @@ -1,6 +1,6 @@ #---Adding all visualization examples subdirectories explicitly -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) add_subdirectory(perspective) add_subdirectory(standalone) diff --git a/examples/extended/visualization/README b/examples/extended/visualization/README deleted file mode 100644 index 31deb8dafb..0000000000 --- a/examples/extended/visualization/README +++ /dev/null @@ -1,27 +0,0 @@ - - Geant4 extended examples - visualization - ----------------------------------------- - -Examples in this directory demonstrate the use of Geant4 visualization. - -standalone ------------ - -This example illustrates how one might use the Geant Visualization -System as a "stand alone" graphics library and viewer. - -perspective ------------ - -This example is another example of using the Geant Visualization -System as a "stand-alone" graphics library and viewer. - -userVisAction -------------- - -This example illustrates how to create a "vis action". - -movies ------- - -This example illustrates how to create movies. diff --git a/examples/extended/visualization/movies/.README.txt b/examples/extended/visualization/movies/.README.txt deleted file mode 100644 index 1f0634b37b..0000000000 --- a/examples/extended/visualization/movies/.README.txt +++ /dev/null @@ -1,92 +0,0 @@ -///\file "visualization/movies/.README.txt" -///\brief Example movies README page - -/*! \page ExampleMovies Example movies - -examples/extended/visualization/movies - -This example illustrates how to create a movie. - -See https://geant4-userdoc.web.cern.ch/UsersGuides/ForApplicationDeveloper/html/Visualization/makingamovie.html#. - -A) USING /vis/viewer/save AND /vis/viewer/interpolate -===================================================== - -1) a) To see a pre-prepared example, start this example in interactive mode - (i.e., without any command line arguments). Just type - /vis/viewer/interpolate viewfiles/movie-1 - If you want to see an electromagnetic shower - /run/beamOn - /vis/viewer/interpolate viewfiles/movie-1 - - b) To make your own movie, save a sequence of views with - "/vis/viewer/save". Then "fly through" with "/vis/viewer/interpolate". - - The procedure is: choose a view, save, choose another view, save, and - so on until you have, say, 10 saved views. Then you may - /vis/viewer/interpolate - - Note: This saves views to your current working directory. It is - always good to remove any pre-existing saved files: - rm *.g4view - or save them, e.g. - mkdir views - mv *.g4view views - which can subsequently be interpolated with - /vis/viewer/interpolate views - - c) Then you have a choice of how to export the movie - see 3 below. - -2) You can use time-slicing to see particles progress through time - - a) To see a pre-prepared example - /vis/modeling/trajectories/drawByCharge-0/default/setTimeSliceInterval 0.01 ns - /run/beamOn - /vis/viewer/interpolate viewfiles/movie-2 - - b) To make your own movie - /vis/scene/add/trajectories rich - /vis/modeling/trajectories/drawByCharge-0/default/setTimeSliceInterval 0.01 ns - # Optionally add features (see guidance on /vis/viewer/set/timeWindow/) - /vis/viewer/set/timeWindow/displayLightFront true 0 0 -20 cm -0.01 ns - /vis/viewer/set/timeWindow/displayHeadTime true - /vis/viewer/set/timeWindow/fadeFactor 1 - /run/beamOn - # Then set a time window and save - /vis/viewer/set/timeWindow/startTime 0 ns .1 ns - /vis/viewer/save - # Then zoom, pan etc to a view of interest - # Then set the next time window and save - /vis/viewer/set/timeWindow/startTime .5 ns .1 ns - /vis/viewer/save - # Then zoom, pan etc to a view of interest - # Then set the next time window and save - /vis/viewer/set/timeWindow/startTime 1 ns .1 ns - /vis/viewer/save - # Then another view, the next time window, and a save... - # ...repeat a few more times - # Then try - /vis/viewer/interpolate - -3) How to export images using /vis/viewer/interpolate (OpenGL only) - /vis/viewer/interpolate ! ! ! ! export - This produces lots of files. - You can change export format with (for example) - /vis/ogl/set/exportFormat jpg - Then import them into your favourite movie maker - see - https://geant4-userdoc.web.cern.ch/UsersGuides/ForApplicationDeveloper/html/Visualization/makingamovie.html# - -B) THE OLD WAY -============== - -These files are inherited from the old "novice" example N03. They draw (and -optionally, save) views using a macro loop. They have not been tested -recently. Best to run in batch mode in the build directory. E.g. - - ./movies -m visTutor/exN03Vis12.mac - ./movies -m visTutor/exN03Vis13.mac - - -John Allison -15th February 2021 -*/ diff --git a/examples/extended/visualization/movies/CMakeLists.txt b/examples/extended/visualization/movies/CMakeLists.txt index 0ddb64ad44..9466d0a78b 100644 --- a/examples/extended/visualization/movies/CMakeLists.txt +++ b/examples/extended/visualization/movies/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project # -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(movies) #---------------------------------------------------------------------------- diff --git a/examples/extended/visualization/movies/History b/examples/extended/visualization/movies/History index e6a4732d4f..bd0038705a 100644 --- a/examples/extended/visualization/movies/History +++ b/examples/extended/visualization/movies/History @@ -15,6 +15,9 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +14th July 2021 J. Allison (exam-ext-vis-movies-V10-07-03) +- Replace /vis/ogl/printEPS with /vis/ogl/export in relevant macros. + 22nd May 2021 J. Allison (exam-ext-vis-movies-V10-07-02) - Minor improvements to README files. diff --git a/examples/extended/visualization/movies/README b/examples/extended/visualization/movies/README deleted file mode 100644 index 2dd34a2c8b..0000000000 --- a/examples/extended/visualization/movies/README +++ /dev/null @@ -1,91 +0,0 @@ - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - examples/extended/visualization/movies - -------------------------------------- - -This example illustrates how to create a movie. - -See https://geant4-userdoc.web.cern.ch/UsersGuides/ForApplicationDeveloper/html/Visualization/makingamovie.html#. - -A) USING /vis/viewer/save AND /vis/viewer/interpolate -===================================================== - -1) a) To see a pre-prepared example, start this example in interactive mode - (i.e., without any command line arguments). Just type - /vis/viewer/interpolate viewfiles/movie-1 - If you want to see an electromagnetic shower - /run/beamOn - /vis/viewer/interpolate viewfiles/movie-1 - - b) To make your own movie, save a sequence of views with - "/vis/viewer/save". Then "fly through" with "/vis/viewer/interpolate". - - The procedure is: choose a view, save, choose another view, save, and - so on until you have, say, 10 saved views. Then you may - /vis/viewer/interpolate - - Note: This saves views to your current working directory. It is - always good to remove any pre-existing saved files: - rm *.g4view - or save them, e.g. - mkdir views - mv *.g4view views - which can subsequently be interpolated with - /vis/viewer/interpolate views - - c) Then you have a choice of how to export the movie - see 3 below. - -2) You can use time-slicing to see particles progress through time - - a) To see a pre-prepared example - /vis/modeling/trajectories/drawByCharge-0/default/setTimeSliceInterval 0.01 ns - /run/beamOn - /vis/viewer/interpolate viewfiles/movie-2 - - b) To make your own movie - /vis/scene/add/trajectories rich - /vis/modeling/trajectories/drawByCharge-0/default/setTimeSliceInterval 0.01 ns - # Optionally add features (see guidance on /vis/viewer/set/timeWindow/) - /vis/viewer/set/timeWindow/displayLightFront true 0 0 -20 cm -0.01 ns - /vis/viewer/set/timeWindow/displayHeadTime true - /vis/viewer/set/timeWindow/fadeFactor 1 - /run/beamOn - # Then set a time window and save - /vis/viewer/set/timeWindow/startTime 0 ns .1 ns - /vis/viewer/save - # Then zoom, pan etc to a view of interest - # Then set the next time window and save - /vis/viewer/set/timeWindow/startTime .5 ns .1 ns - /vis/viewer/save - # Then zoom, pan etc to a view of interest - # Then set the next time window and save - /vis/viewer/set/timeWindow/startTime 1 ns .1 ns - /vis/viewer/save - # Then another view, the next time window, and a save... - # ...repeat a few more times - # Then try - /vis/viewer/interpolate - -3) How to export images using /vis/viewer/interpolate (OpenGL only) - /vis/viewer/interpolate ! ! ! ! export - This produces lots of files. - You can change export format with (for example) - /vis/ogl/set/exportFormat jpg - Then import them into your favourite movie maker - see - https://geant4-userdoc.web.cern.ch/UsersGuides/ForApplicationDeveloper/html/Visualization/makingamovie.html# - -B) THE OLD WAY -============== - -These files are inherited from the old "novice" example N03. They draw (and -optionally, save) views using a macro loop. They have not been tested -recently. Best to run in batch mode in the build directory. E.g. - - ./movies -m visTutor/exN03Vis12.mac - ./movies -m visTutor/exN03Vis13.mac - - -John Allison -15th February 2021 diff --git a/examples/extended/visualization/movies/visTutor/exN03Vis12.loop b/examples/extended/visualization/movies/visTutor/exN03Vis12.loop index 451cfd047e..1328738081 100644 --- a/examples/extended/visualization/movies/visTutor/exN03Vis12.loop +++ b/examples/extended/visualization/movies/visTutor/exN03Vis12.loop @@ -1,4 +1,4 @@ # exN03Vis12.loop /vis/viewer/set/timeWindow/startTime {startTime} ns {timeRange} ns -# Print eps file -#/vis/ogl/printEPS +# Export if required +#/vis/ogl/export diff --git a/examples/extended/visualization/movies/visTutor/exN03Vis13.loop b/examples/extended/visualization/movies/visTutor/exN03Vis13.loop index d15693be23..dac499453d 100644 --- a/examples/extended/visualization/movies/visTutor/exN03Vis13.loop +++ b/examples/extended/visualization/movies/visTutor/exN03Vis13.loop @@ -3,5 +3,5 @@ /vis/viewer/set/timeWindow/endTime {endTime} ns {timeRange} ns # Force refresh here (since auto-refresh switched off in main mac). /vis/viewer/refresh -# Print eps file -#/vis/ogl/printEPS +# Export if required +#/vis/ogl/export diff --git a/examples/extended/visualization/perspective/.README.txt b/examples/extended/visualization/perspective/.README.txt deleted file mode 100644 index d7efe3e274..0000000000 --- a/examples/extended/visualization/perspective/.README.txt +++ /dev/null @@ -1,28 +0,0 @@ -///\file "visualization/perspective/.README.txt" -///\brief Example perspective README page - -/*! \page Exampleperspective Example perspective - -examples/extended/visualization/perspective - -This example is another example of using the Geant Visualization -System as a "stand-alone" graphics library and viewer. See -\ref Examplestandalone for a simpler introductory explanation. - -The particular feature of this example is the addition of "perspective -lines". The direction of these lines is controlled by - -\verbatim -/perspectiveDemo/optionString x -\endverbatim - -See vis.mac. - -Notes: -- /perspectiveDemo/scene is not used at present. -- visXm.mac is specially for use with G4UIXm and OGL*Xm. - -John Allison -11th June 2012 - -*/ diff --git a/examples/extended/visualization/perspective/CMakeLists.txt b/examples/extended/visualization/perspective/CMakeLists.txt index 94aa210483..fe47a43f33 100644 --- a/examples/extended/visualization/perspective/CMakeLists.txt +++ b/examples/extended/visualization/perspective/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(perspective) #---------------------------------------------------------------------------- diff --git a/examples/extended/visualization/perspective/History b/examples/extended/visualization/perspective/History index 2196fa2b26..8a9d755608 100644 --- a/examples/extended/visualization/perspective/History +++ b/examples/extended/visualization/perspective/History @@ -15,6 +15,9 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +25th October 2021 B.Morgan (exam-ext-vis-persp-V10-07-00) +- Use G4StrUtil functions replacing deprecated G4String member functions + 3rd November 2020 B. Morgan (exam-ext-vis-persp-V10-06-00) - Support same CMake version range as core Geant4 diff --git a/examples/extended/visualization/perspective/README b/examples/extended/visualization/perspective/README deleted file mode 100644 index db0a4e9485..0000000000 --- a/examples/extended/visualization/perspective/README +++ /dev/null @@ -1,25 +0,0 @@ - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - examples/extended/visualization/perspective - ------------------------------------------ - -This example is another example of using the Geant Visualization -System as a "stand-alone" graphics library and viewer. See -examples/extended/visualization/standalone for a simpler -introductory explanation. - -The particular feature of this example is the addition of "perspective -lines". The direction of these lines is controlled by - - /perspectiveDemo/optionString x - -See vis.mac. - -Notes: -- /perspectiveDemo/scene is not used at present. -- visXm.mac is specially for use with G4UIXm and OGL*Xm. - -John Allison -11th June 2012 diff --git a/examples/extended/visualization/perspective/src/PerspectiveVisAction.cc b/examples/extended/visualization/perspective/src/PerspectiveVisAction.cc index 3c02e128b3..3310017ee2 100644 --- a/examples/extended/visualization/perspective/src/PerspectiveVisAction.cc +++ b/examples/extended/visualization/perspective/src/PerspectiveVisAction.cc @@ -180,10 +180,10 @@ void PerspectiveVisAction::ExtendedDraw // Draw extended edges as requested... G4bool any = false, A = false, X = false, Y = false, Z = false; - if (fOptionString.contains("a")) {A = true; any = true;} - if (fOptionString.contains("x")) {X = true; any = true;} - if (fOptionString.contains("y")) {Y = true; any = true;} - if (fOptionString.contains("z")) {Z = true; any = true;} + if (G4StrUtil::contains(fOptionString, "a")) {A = true; any = true;} + if (G4StrUtil::contains(fOptionString, "x")) {X = true; any = true;} + if (G4StrUtil::contains(fOptionString, "y")) {Y = true; any = true;} + if (G4StrUtil::contains(fOptionString, "z")) {Z = true; any = true;} if (any) { G4Polyhedron* polyhedron = solid.GetPolyhedron(); diff --git a/examples/extended/visualization/standalone/.README.txt b/examples/extended/visualization/standalone/.README.txt deleted file mode 100644 index 4330a79a42..0000000000 --- a/examples/extended/visualization/standalone/.README.txt +++ /dev/null @@ -1,41 +0,0 @@ -///\file "visualization/standalone/.README.txt" -///\brief Example standalone README page - -/*! \page Examplestandalone Example standalone - -examples/extended/visualization/standalone - - -This example illustrates how one might use the Geant Visualization -System as a "stand alone" graphics library and viewer. It makes use -of the "user action" feature of the Geant4 vis manager - for a fuller -example of the use of this feature see -examples/extended/visualization/userVisAction. - -1) Define a G4VUserVisAction that implements a Draw method. An - example is provided - see StandaloneVisAction.hh/cc. - StandaloneVisAction::Draw illustrates: - a) a simple box; - b) a Boolean solid; - c) an alternative way of drawing a solid by obtaining the - polyhedral representation. - The last is included for interest, not as a recommendation. - -2) In the main () program (see standalone.cc), StandaloneVisAction must be instantiated and - its pointer registered with the visualization manager. You may - optionally specify an extent at this point to assist the viewers to - locate the objects. - -3) To visualise, use the usual Geant4 vis commands to create a view - and scene, then add the vis action to the scene, optionally with an - extent - see standalone.mac. - -Note: The system needs an "extent" in order to point the virtual -camera and adjust its field of view, etc. This defines the "standard -view". You may zoom, etc., from this standard view. The extent may -be specified as suggested above or by using /vis/scene/add/extent. - - -John Allison -27th November 2014 -*/ diff --git a/examples/extended/visualization/standalone/CMakeLists.txt b/examples/extended/visualization/standalone/CMakeLists.txt index b80385f55f..4d45fa0c38 100644 --- a/examples/extended/visualization/standalone/CMakeLists.txt +++ b/examples/extended/visualization/standalone/CMakeLists.txt @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(standalone) #---------------------------------------------------------------------------- diff --git a/examples/extended/visualization/standalone/README b/examples/extended/visualization/standalone/README deleted file mode 100644 index 8797c59551..0000000000 --- a/examples/extended/visualization/standalone/README +++ /dev/null @@ -1,39 +0,0 @@ - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - examples/extended/visualization/standalone - ------------------------------------------ - -This example illustrates how one might use the Geant Visualization -System as a "stand alone" graphics library and viewer. It makes use -of the "user action" feature of the Geant4 vis manager - for a fuller -example of the use of this feature see -examples/extended/visualization/userVisAction. - -1) Define a G4VUserVisAction that implements a Draw method. An - example is provided - see StandaloneVisAction.hh/cc. - StandaloneVisAction::Draw illustrates: - a) a simple box; - b) a Boolean solid; - c) an alternative way of drawing a solid by obtaining the - polyhedral representation. - The last is included for interest, not as a recommendation. - -2) In the main program, StandaloneVisAction must be instantiated and - its pointer registered with the visualization manager. You may - optionally specify an extent at this point to assist the viewers to - locate the objects. - -3) To visualise, use the usual Geant4 vis commands to create a view - and scene, then add the vis action to the scene, optionally with an - extent - see standalone.mac. - -Note: The system needs an "extent" in order to point the virtual -camera and adjust its field of view, etc. This defines the "standard -view". You may zoom, etc., from this standard view. The extent may -be specified as suggested above or by using /vis/scene/add/extent. - - -John Allison -27th November 2014 diff --git a/examples/extended/visualization/userVisAction/.README.txt b/examples/extended/visualization/userVisAction/.README.txt deleted file mode 100644 index ade896a360..0000000000 --- a/examples/extended/visualization/userVisAction/.README.txt +++ /dev/null @@ -1,38 +0,0 @@ -///\file "visualization/userVisAction/.README.txt" -///\brief Example userVisAction README page - -/*! \page ExampleuserVisAction Example userVisAction - -examples/extended/visualization/userVisAction - -This example illustrates how to create a "vis action". - -The idea is that you register a vis action with the vis manager and -activate it by a command /vis/scene/add/userAction. In this case, it -draws a simple logo. - -1) UVA_VisAction.cc defines a G4VUserVisAction and implements a Draw - method. - -2) In the main () program (see userVisAction.cc), UVA_VisAction is instantiated and - its pointer registerd with the visualization manager. You may - optionally specify an extent at this point to assist the viewers to - locate the objects. - -3) To visualise, use the usual Geant4 vis commands to create a view - and scene, then add the vis action to the scene with -\verbatim -/vis/scene/add/userAction -\endverbatim - see vis.mac. - -Note: The system needs an "extent" in order to point the virtual -camera and adjust its field of view, etc. This defines the "standard -view". You may zoom, etc., from this standard view. The extent may -be specified as suggested above or by using /vis/scene/add/extent. - - -John Allison -27th November 2014 - -*/ diff --git a/examples/extended/visualization/userVisAction/CMakeLists.txt b/examples/extended/visualization/userVisAction/CMakeLists.txt index e664958673..586bf90454 100644 --- a/examples/extended/visualization/userVisAction/CMakeLists.txt +++ b/examples/extended/visualization/userVisAction/CMakeLists.txt @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # Setup the project -cmake_minimum_required(VERSION 3.12...3.20) +cmake_minimum_required(VERSION 3.16...3.21) project(userVisAction) #---------------------------------------------------------------------------- diff --git a/examples/extended/visualization/userVisAction/README b/examples/extended/visualization/userVisAction/README deleted file mode 100644 index 42a6feb88d..0000000000 --- a/examples/extended/visualization/userVisAction/README +++ /dev/null @@ -1,33 +0,0 @@ - ========================================================= - Geant4 - an Object-Oriented Toolkit for Simulation in HEP - ========================================================= - - examples/extended/visualization/userVisAction - --------------------------------------------- - -This example illustrates how to create a "vis action". - -The idea is that you register a vis action with the vis manager and -activate it by a command /vis/scene/add/userAction. In this case, it -draws a simple logo. - -1) UVA_VisAction.cc defines a G4VUserVisAction and implements a Draw - method. - -2) In the main program, UVA_VisAction is instantiated and - its pointer registerd with the visualization manager. You may - optionally specify an extent at this point to assist the viewers to - locate the objects. - -3) To visualise, use the usual Geant4 vis commands to create a view - and scene, then add the vis action to the scene with - /vis/scene/add/userAction - see vis.mac. - -Note: The system needs an "extent" in order to point the virtual -camera and adjust its field of view, etc. This defines the "standard -view". You may zoom, etc., from this standard view. The extent may -be specified as suggested above or by using /vis/scene/add/extent. - - -John Allison -27th November 2014 diff --git a/examples/extended/visualization/userVisAction/run1.out b/examples/extended/visualization/userVisAction/run1.out index 2c59e348d8..5228bb8333 100644 --- a/examples/extended/visualization/userVisAction/run1.out +++ b/examples/extended/visualization/userVisAction/run1.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -28,10 +28,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -74,9 +72,9 @@ End of Run User Vis Actions: none Some /vis commands (optionally) take a string to specify colour. "/vis/list" to see available colours. -Checking overlaps for volume Envelope (G4Box) ... OK! -Checking overlaps for volume Shape1 (G4Cons) ... OK! -Checking overlaps for volume Shape2 (G4Trd) ... OK! +Checking overlaps for volume Envelope:0 (G4Box) ... OK! +Checking overlaps for volume Shape1:0 (G4Cons) ... OK! +Checking overlaps for volume Shape2:0 (G4Trd) ... OK! ### HadronInelasticQBBC Construct Process: Emin(FTFP)= 3 GeV Emax(FTFP)= 100000 GeV Emin(BERT)= 1 GeV Emax(BERT)= 6 GeV Emax(BERTpions)= 12 GeV @@ -92,32 +90,99 @@ Checking overlaps for volume Shape2 (G4Trd) ... OK! /gun/energy 6 MeV # /run/beamOn 5 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -127,25 +192,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -155,29 +220,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -185,31 +250,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -218,12 +283,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -231,12 +296,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -244,31 +309,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -276,31 +341,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -308,31 +373,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -340,32 +405,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -373,32 +438,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -406,31 +471,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -438,27 +503,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -467,18 +532,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -486,71 +551,71 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: ionElastic - Model: NNDiffuseElastic: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: NNDiffuseElastic: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -558,13 +623,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -572,13 +637,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -586,12 +651,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -599,13 +664,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -613,13 +678,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -627,13 +692,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -641,60 +706,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -702,27 +767,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -730,27 +795,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -758,26 +823,26 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -785,13 +850,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -814,7 +879,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -837,28 +901,28 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_WATER Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.51944 keV e- 276.265 keV e+ 270.751 keV proton 70 keV + Energy thresholds : gamma 2.52562 keV e- 277.64 keV e+ 270.815 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_A-150_TISSUE Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.27786 keV e- 299.466 keV e+ 293.489 keV proton 70 keV + Energy thresholds : gamma 2.28364 keV e- 301.335 keV e+ 293.733 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 3 used in the geometry : Yes Material : G4_BONE_COMPACT_ICRU Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 3.95224 keV e- 397.122 keV e+ 384 keV proton 70 keV + Energy thresholds : gamma 3.93535 keV e- 398.373 keV e+ 386.308 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -910,14 +974,14 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 0.957 73.9 -65.6 4.21 0 0 0 Envelope initStep - 1 -0.269 74.4 -59.8 3.25 0.962 6.26 6.26 Envelope eIoni - 2 -0.127 75.1 -55.1 2.4 0.853 5.1 11.4 Envelope eIoni - 3 -0.4 75.6 -51.5 1.68 0.713 4.07 15.4 Envelope eIoni - 4 -1.01 76.5 -48.9 1.16 0.527 3.19 18.6 Envelope eIoni - 5 -1.04 75.1 -47.3 0.793 0.364 2.52 21.1 Envelope eIoni - 6 -0.648 73.7 -47 0.437 0.356 2.02 23.2 Envelope eIoni - 7 -0.799 72.9 -46.9 0.0579 0.379 1.35 24.5 Envelope eIoni - 8 -0.809 72.9 -47 0 0.0579 0.0562 24.6 Envelope eIoni + 1 -0.269 74.4 -59.8 3.25 0.964 6.26 6.26 Envelope eIoni + 2 -0.127 75.1 -55.1 2.39 0.855 5.1 11.4 Envelope eIoni + 3 -0.4 75.6 -51.5 1.68 0.711 4.06 15.4 Envelope eIoni + 4 -1.01 76.4 -48.9 1.16 0.524 3.19 18.6 Envelope eIoni + 5 -1.04 75.1 -47.3 0.795 0.363 2.52 21.1 Envelope eIoni + 6 -0.647 73.7 -47 0.439 0.356 2.02 23.2 Envelope eIoni + 7 -0.798 72.9 -47 0.0608 0.378 1.36 24.5 Envelope eIoni + 8 -0.809 72.9 -47 0 0.0608 0.0613 24.6 Envelope eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 1, Parent ID = 0 @@ -936,22 +1000,22 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 -20.4 -71 -61.9 5.7 0 0 0 Envelope initStep 1 -20.2 -70.8 -54.2 4.41 1.29 8.04 8.04 Envelope eIoni - 2 -20.7 -70.7 -48.1 3.33 1.08 6.5 14.5 Envelope eIoni - 3 -20.2 -68.6 -44.9 2.02 0.689 4.04 18.6 Envelope eIoni - 4 -20.3 -66.7 -42.3 1.51 0.517 3.61 22.2 Envelope eIoni - 5 -21.3 -65.4 -40.4 1.02 0.484 2.97 25.2 Envelope eIoni - 6 -22.8 -64.7 -39.4 0.566 0.457 2.34 27.5 Envelope eIoni - 7 -23 -64.5 -38.4 0.26 0.307 1.64 29.2 Envelope eIoni - 8 -23.1 -64.4 -38.1 0 0.26 0.68 29.8 Envelope eIoni + 2 -20.7 -70.7 -48.1 3.34 1.08 6.5 14.5 Envelope eIoni + 3 -20.2 -68.6 -44.8 2.01 0.708 4.14 18.7 Envelope eIoni + 4 -20.3 -66.7 -42.2 1.49 0.519 3.6 22.3 Envelope eIoni + 5 -21.3 -65.4 -40.3 1.01 0.484 2.95 25.2 Envelope eIoni + 6 -22.8 -64.7 -39.4 0.553 0.457 2.33 27.6 Envelope eIoni + 7 -23 -64.5 -38.4 0.251 0.302 1.62 29.2 Envelope eIoni + 8 -23.1 -64.5 -38.1 0 0.251 0.647 29.8 Envelope eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 2 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 -20.2 -68.6 -44.9 0.613 0 0 0 Envelope initStep - 1 -20.1 -69.1 -43.8 0.207 0.406 1.73 1.73 Envelope eIoni - 2 -20.2 -69 -43.6 0 0.207 0.476 2.2 Envelope eIoni + 0 -20.2 -68.6 -44.8 0.614 0 0 0 Envelope initStep + 1 -20.1 -69 -43.8 0.209 0.404 1.73 1.73 Envelope eIoni + 2 -20.1 -69 -43.5 0 0.209 0.486 2.22 Envelope eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 1, Parent ID = 0 @@ -997,12 +1061,12 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 50.1 -65.6 -69.6 2.56 0 0 0 Envelope initStep - 1 48.2 -65.5 -66.2 1.94 0.62 4.27 4.27 Envelope eIoni - 2 47.4 -64.3 -63.4 1.45 0.493 3.51 7.78 Envelope eIoni - 3 46.3 -64.4 -61.2 0.897 0.554 2.9 10.7 Envelope eIoni - 4 45 -65.5 -61.2 0.554 0.343 2.17 12.9 Envelope eIoni - 5 44.2 -65.5 -60.6 0.183 0.371 1.62 14.5 Envelope eIoni - 6 44.1 -65.5 -60.4 0 0.183 0.391 14.9 Envelope eIoni + 1 48.2 -65.5 -66.2 1.94 0.621 4.27 4.27 Envelope eIoni + 2 47.4 -64.3 -63.4 1.45 0.494 3.51 7.78 Envelope eIoni + 3 46.3 -64.4 -61.2 0.895 0.554 2.9 10.7 Envelope eIoni + 4 45 -65.5 -61.2 0.551 0.344 2.17 12.8 Envelope eIoni + 5 44.2 -65.5 -60.6 0.18 0.371 1.61 14.5 Envelope eIoni + 6 44.1 -65.5 -60.4 0 0.18 0.382 14.8 Envelope eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 @@ -1010,13 +1074,13 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 62 -65.5 -95.2 3.15 0 0 0 Envelope initStep - 1 63.6 -65.5 -90.8 2.39 0.763 4.98 4.98 Envelope eIoni - 2 66 -65.4 -88.1 1.82 0.564 4.06 9.04 Envelope eIoni - 3 67.3 -67.2 -86.1 1.3 0.52 3.37 12.4 Envelope eIoni - 4 66.8 -68.5 -84.2 0.772 0.533 2.71 15.1 Envelope eIoni - 5 67.9 -69 -83.4 0.365 0.407 1.99 17.1 Envelope eIoni - 6 68.4 -69.1 -83.1 0.0303 0.335 1.12 18.2 Envelope eIoni - 7 68.4 -69.1 -83.1 0 0.0303 0.018 18.2 Envelope eIoni + 1 63.6 -65.5 -90.8 2.39 0.764 4.98 4.98 Envelope eIoni + 2 66 -65.4 -88.1 1.83 0.563 4.06 9.04 Envelope eIoni + 3 67.3 -67.2 -86.1 1.3 0.521 3.36 12.4 Envelope eIoni + 4 66.8 -68.5 -84.2 0.772 0.532 2.71 15.1 Envelope eIoni + 5 67.9 -69 -83.4 0.363 0.409 1.99 17.1 Envelope eIoni + 6 68.4 -69.1 -83.1 0.0318 0.331 1.12 18.2 Envelope eIoni + 7 68.4 -69.1 -83.1 0 0.0318 0.0196 18.2 Envelope eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 1, Parent ID = 0 @@ -1031,7 +1095,7 @@ Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolu Run terminated. Run Summary Number of events processed : 5 - User=0.000000s Real=0.001309s Sys=0.000000s + User=0.000000s Real=0.001514s Sys=0.000000s --------------------End of Global Run----------------------- The run consists of 5 gamma of 6 MeV @@ -1068,28 +1132,28 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 69.99999999999999 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_WATER Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 2.519443689999526 keV e- 276.2650242766716 keV e+ 270.7512371977519 keV proton 69.99999999999999 keV + Energy thresholds : gamma 2.525620909006347 keV e- 277.6404681912384 keV e+ 270.8148294280157 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_A-150_TISSUE Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 2.277861824750698 keV e- 299.4661435146966 keV e+ 293.4893009628447 keV proton 69.99999999999999 keV + Energy thresholds : gamma 2.283643816825727 keV e- 301.3346317840945 keV e+ 293.7333821937841 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 3 used in the geometry : Yes Material : G4_BONE_COMPACT_ICRU Range cuts : gamma 699.9999999999999 um e- 699.9999999999999 um e+ 699.9999999999999 um proton 699.9999999999999 um - Energy thresholds : gamma 3.952238766484486 keV e- 397.1221526194081 keV e+ 384.0004092871193 keV proton 69.99999999999999 keV + Energy thresholds : gamma 3.935347501285622 keV e- 398.3729057909528 keV e+ 386.3080862918633 keV proton 69.99999999999999 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -1103,66 +1167,68 @@ Index : 3 used in the geometry : Yes Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName 0 69 -12.8 -150 210 0 0 0 Envelope initStep - 1 69 -12.8 -119 196 13.5 30.7 30.7 Envelope hIoni + 1 69 -12.8 -119 196 13.7 31.1 31.1 Envelope hIoni :----- List of 2ndaries - #SpawnInStep= 1(Rest= 0,Along= 0,Post= 1), #SpawnTotal= 1 --------------- - : 69 -12.8 -119 0.395 e- + : 69 -12.8 -119 0.396 e- :----------------------------------------------------------------- EndOf2ndaries Info --------------- - 2 68.7 -13 -68.3 172 24 51 81.7 Envelope hIoni - 3 68.6 -13 -52.5 164 7.59 15.7 97.5 Envelope hIoni + 2 68.7 -13 -68 172 24.1 50.9 82 Envelope hIoni + 3 68.6 -13 -51.2 163 8.12 16.8 98.8 Envelope hIoni :----- List of 2ndaries - #SpawnInStep= 1(Rest= 0,Along= 0,Post= 1), #SpawnTotal= 2 --------------- - : 68.6 -13 -52.5 0.282 e- + : 68.6 -13 -51.2 0.283 e- :----------------------------------------------------------------- EndOf2ndaries Info --------------- - 4 66.4 -10.4 -15.3 145 19.5 37.5 135 Envelope hIoni - 5 64.5 -7.91 14.6 128 16.8 30 165 Envelope hIoni - 6 63.1 -5.85 38.6 114 14.2 24.2 189 Envelope hIoni - 7 62 -4.1 58.2 101 12.6 19.7 209 Envelope hIoni - 8 61.1 -2.64 74.1 89.1 12 16 225 Envelope hIoni - 9 60.5 -1.41 86.8 78.6 10.5 12.8 238 Envelope hIoni - 10 60 -0.556 96.7 69.3 9.33 9.95 248 Shape2 Transportation - 11 59.8 -0.327 100 63.9 5.37 3.33 251 Envelope Transportation - 12 59.5 0.194 107 55.8 8.1 7.13 258 Envelope hIoni - 13 59.3 0.613 113 48.9 6.94 5.62 264 Envelope hIoni - 14 59.1 0.95 117 42.9 5.94 4.46 268 Envelope hIoni - 15 58.9 1.27 121 37.6 5.3 3.56 272 Envelope hIoni - 16 58.8 1.59 123 32.9 4.68 2.84 274 Envelope hIoni - 17 58.6 1.79 126 28.8 4.17 2.27 277 Envelope hIoni - 18 58.5 1.97 128 25 3.75 1.81 279 Envelope hIoni - 19 58.4 2.1 129 21.7 3.3 1.44 280 Envelope hIoni - 20 58.3 2.2 130 18.9 2.8 1.15 281 Envelope hIoni - 21 58.2 2.3 131 16.3 2.64 0.934 282 Envelope hIoni - 22 58.2 2.37 132 14 2.28 0.749 283 Envelope hIoni - 23 58.1 2.41 132 11.7 2.27 0.608 283 Envelope hIoni - 24 58.1 2.44 133 9.69 2.05 0.484 284 Envelope hIoni - 25 58.1 2.47 133 7.69 2 0.387 284 Envelope hIoni - 26 58.1 2.49 134 5.83 1.86 0.305 285 Envelope hIoni - 27 58 2.51 134 3.91 1.92 0.239 285 Envelope hIoni - 28 58 2.52 134 1.84 2.07 0.174 285 Envelope hIoni - 29 58 2.53 134 0.0966 1.75 0.0661 285 Envelope hIoni - 30 58 2.53 134 0 0.0966 0.00168 285 Envelope hIoni + 4 66.3 -10.5 -14.3 144 19.4 37.1 136 Envelope hIoni + 5 64.3 -8.11 15.3 127 16.6 29.7 166 Envelope hIoni + 6 62.9 -6.12 39.1 113 14.1 24 190 Envelope hIoni + 7 61.7 -4.42 58.5 101 12.6 19.5 209 Envelope hIoni + 8 60.8 -3.01 74.2 88.7 11.9 15.9 225 Envelope hIoni + 9 60.1 -1.81 86.9 78.3 10.5 12.7 238 Envelope hIoni + 10 60 -1.59 89.6 75.7 2.52 2.7 240 Shape2 Transportation + 11 59.7 -1.16 95.2 67 8.73 5.64 246 Shape2 hIoni + 12 59.5 -0.802 99.7 58.4 8.63 4.56 251 Shape2 hIoni + 13 59.5 -0.778 100 57.8 0.533 0.293 251 Envelope Transportation + 14 59.3 -0.298 106 50.6 7.29 5.98 257 Envelope hIoni + 15 59.3 0.0426 111 44.5 6.01 4.73 262 Envelope hIoni + 16 59.3 0.255 114 39 5.55 3.79 265 Envelope hIoni + 17 59.4 0.389 117 34.1 4.94 3.02 268 Envelope hIoni + 18 59.4 0.458 120 29.8 4.21 2.4 271 Envelope hIoni + 19 59.5 0.529 122 26.2 3.68 1.92 273 Envelope hIoni + 20 59.5 0.59 123 22.7 3.42 1.55 274 Envelope hIoni + 21 59.5 0.659 125 19.7 3.04 1.24 275 Envelope hIoni + 22 59.6 0.691 126 16.9 2.78 0.991 276 Envelope hIoni + 23 59.6 0.726 126 14.6 2.33 0.791 277 Envelope hIoni + 24 59.6 0.755 127 12.5 2.13 0.642 278 Envelope hIoni + 25 59.6 0.778 128 10.3 2.14 0.521 278 Envelope hIoni + 26 59.6 0.794 128 8.29 2.02 0.415 279 Envelope hIoni + 27 59.6 0.81 128 6.4 1.89 0.328 279 Envelope hIoni + 28 59.6 0.82 129 4.48 1.93 0.258 279 Envelope hIoni + 29 59.6 0.833 129 2.49 1.99 0.193 280 Envelope hIoni + 30 59.6 0.841 129 0.0272 2.46 0.109 280 Envelope hIoni + 31 59.6 0.841 129 0 0.0272 0.000784 280 Envelope hIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 68.6 -13 -52.5 0.282 0 0 0 Envelope initStep - 1 68.5 -12.9 -52.2 0 0.282 0.77 0.77 Envelope eIoni + 0 68.6 -13 -51.2 0.283 0 0 0 Envelope initStep + 1 68.4 -12.9 -50.8 0 0.283 0.775 0.775 Envelope eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName - 0 69 -12.8 -119 0.395 0 0 0 Envelope initStep - 1 69.2 -12.9 -119 0 0.395 1.23 1.23 Envelope eIoni + 0 69 -12.8 -119 0.396 0 0 0 Envelope initStep + 1 69.2 -12.9 -118 0.0153 0.381 1.23 1.23 Envelope eIoni + 2 69.2 -12.9 -118 0 0.0153 0.00537 1.23 Envelope eIoni Run terminated. Run Summary Number of events processed : 1 - User=0.000000s Real=0.000535s Sys=0.000000s + User=0.000000s Real=0.000725s Sys=0.000000s --------------------End of Global Run----------------------- The run consists of 1 proton of 210 MeV - Dose in scoring volume : 0.4971503441774667 picoGy +- 0 picoGy + Dose in scoring volume : 1.655180340737739 picoGy +- 0 picoGy ------------------------------------------------------------ 0 events have been kept for refreshing and/or reviewing. @@ -1188,6 +1254,8 @@ G4RNGHelper object is deleted. ================== Deleting memory pools =================== Pool ID '20G4NavigationLevelRep', size : 0.00865 MB Pool ID '24G4ReferenceCountedHandleIvE', size : 0.000961 MB +Pool ID '16G4SmartVoxelNode', size : 0.000961 MB +Pool ID '17G4SmartVoxelProxy', size : 0.000961 MB Pool ID '7G4Event', size : 0.000961 MB Pool ID '15G4PrimaryVertex', size : 0.000961 MB Pool ID '17G4PrimaryParticle', size : 0.000961 MB @@ -1195,8 +1263,8 @@ Pool ID '17G4DynamicParticle', size : 0.000961 MB Pool ID '7G4Track', size : 0.00192 MB Pool ID '18G4TouchableHistory', size : 0.000961 MB Pool ID '15G4CountedObjectIvE', size : 0.000961 MB -Number of memory pools allocated: 9 of which, static: 0 -Dynamic pools deleted: 9 / Total memory freed: 0.017 MB +Number of memory pools allocated: 11 of which, static: 0 +Dynamic pools deleted: 11 / Total memory freed: 0.019 MB ============================================================ G4Allocator objects are deleted. UImanager deleted. diff --git a/examples/extended/visualization/userVisAction/run2.out b/examples/extended/visualization/userVisAction/run2.out index 829ba6547d..aeab3099e6 100644 --- a/examples/extended/visualization/userVisAction/run2.out +++ b/examples/extended/visualization/userVisAction/run2.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -28,10 +28,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -74,9 +72,9 @@ End of Run User Vis Actions: none Some /vis commands (optionally) take a string to specify colour. "/vis/list" to see available colours. -Checking overlaps for volume Envelope (G4Box) ... OK! -Checking overlaps for volume Shape1 (G4Cons) ... OK! -Checking overlaps for volume Shape2 (G4Trd) ... OK! +Checking overlaps for volume Envelope:0 (G4Box) ... OK! +Checking overlaps for volume Shape1:0 (G4Cons) ... OK! +Checking overlaps for volume Shape2:0 (G4Trd) ... OK! ### HadronInelasticQBBC Construct Process: Emin(FTFP)= 3 GeV Emax(FTFP)= 100000 GeV Emin(BERT)= 1 GeV Emax(BERT)= 6 GeV Emax(BERTpions)= 12 GeV @@ -92,32 +90,99 @@ Checking overlaps for volume Shape2 (G4Trd) ... OK! # /run/printProgress 100 /run/beamOn 1000 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -127,25 +192,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -155,29 +220,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -185,31 +250,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -218,12 +283,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -231,12 +296,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -244,31 +309,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -276,31 +341,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -308,31 +373,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -340,32 +405,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -373,32 +438,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -406,31 +471,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -438,27 +503,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -467,18 +532,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -486,71 +551,71 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: ionElastic - Model: NNDiffuseElastic: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: NNDiffuseElastic: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -558,13 +623,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -572,13 +637,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -586,12 +651,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -599,13 +664,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -613,13 +678,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -627,13 +692,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -641,60 +706,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -702,27 +767,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -730,27 +795,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -758,26 +823,26 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -785,13 +850,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -814,7 +879,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -837,28 +901,28 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_WATER Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.51944 keV e- 276.265 keV e+ 270.751 keV proton 70 keV + Energy thresholds : gamma 2.52562 keV e- 277.64 keV e+ 270.815 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_A-150_TISSUE Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.27786 keV e- 299.466 keV e+ 293.489 keV proton 70 keV + Energy thresholds : gamma 2.28364 keV e- 301.335 keV e+ 293.733 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 3 used in the geometry : Yes Material : G4_BONE_COMPACT_ICRU Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 3.95224 keV e- 397.122 keV e+ 384 keV proton 70 keV + Energy thresholds : gamma 3.93535 keV e- 398.373 keV e+ 386.308 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -895,11 +959,11 @@ See commands in /vis/modeling/trajectories/ for other options. Run terminated. Run Summary Number of events processed : 1000 - User=0.030000s Real=0.030352s Sys=0.000000s + User=0.030000s Real=0.028562s Sys=0.000000s --------------------End of Global Run----------------------- The run consists of 1000 gamma of 6 MeV - Dose in scoring volume : 44.869 picoGy +- 3.95368 picoGy + Dose in scoring volume : 42.6381 picoGy +- 3.85445 picoGy ------------------------------------------------------------ 0 events have been kept for refreshing and/or reviewing. @@ -932,28 +996,28 @@ Region -- -- is not associated to any world. Index : 0 used in the geometry : Yes Material : G4_AIR Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV + Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes Material : G4_WATER Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.51944 keV e- 276.265 keV e+ 270.751 keV proton 70 keV + Energy thresholds : gamma 2.52562 keV e- 277.64 keV e+ 270.815 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes Material : G4_A-150_TISSUE Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 2.27786 keV e- 299.466 keV e+ 293.489 keV proton 70 keV + Energy thresholds : gamma 2.28364 keV e- 301.335 keV e+ 293.733 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 3 used in the geometry : Yes Material : G4_BONE_COMPACT_ICRU Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um - Energy thresholds : gamma 3.95224 keV e- 397.122 keV e+ 384 keV proton 70 keV + Energy thresholds : gamma 3.93535 keV e- 398.373 keV e+ 386.308 keV proton 70 keV Region(s) which use this couple : DefaultRegionForTheWorld @@ -973,11 +1037,11 @@ Index : 3 used in the geometry : Yes Run terminated. Run Summary Number of events processed : 1000 - User=0.230000s Real=0.226592s Sys=0.000000s + User=0.230000s Real=0.234993s Sys=0.000000s --------------------End of Global Run----------------------- The run consists of 1000 proton of 210 MeV - Dose in scoring volume : 5.16668 nanoGy +- 146.593 picoGy + Dose in scoring volume : 4.86323 nanoGy +- 146.722 picoGy ------------------------------------------------------------ 0 events have been kept for refreshing and/or reviewing. @@ -998,22 +1062,24 @@ G4SDManager deleted. EventManager deleted. Units table cleared. TransportationManager deleted. -Total navigation history collections cleaned: 14 +Total navigation history collections cleaned: 11 G4RNGHelper object is deleted. ================== Deleting memory pools =================== -Pool ID '20G4NavigationLevelRep', size : 0.0202 MB +Pool ID '20G4NavigationLevelRep', size : 0.0154 MB Pool ID '24G4ReferenceCountedHandleIvE', size : 0.000961 MB +Pool ID '16G4SmartVoxelNode', size : 0.000961 MB +Pool ID '17G4SmartVoxelProxy', size : 0.000961 MB Pool ID '7G4Event', size : 0.000961 MB Pool ID '15G4PrimaryVertex', size : 0.000961 MB Pool ID '17G4PrimaryParticle', size : 0.000961 MB -Pool ID '17G4DynamicParticle', size : 0.00481 MB -Pool ID '7G4Track', size : 0.00865 MB -Pool ID '18G4TouchableHistory', size : 0.00192 MB +Pool ID '17G4DynamicParticle', size : 0.00769 MB +Pool ID '7G4Track', size : 0.0144 MB +Pool ID '18G4TouchableHistory', size : 0.000961 MB Pool ID '15G4CountedObjectIvE', size : 0.000961 MB -Pool ID '10G4Fragment', size : 0.00192 MB Pool ID '17G4ReactionProduct', size : 0.00192 MB -Number of memory pools allocated: 11 of which, static: 0 -Dynamic pools deleted: 11 / Total memory freed: 0.044 MB +Pool ID '10G4Fragment', size : 0.00192 MB +Number of memory pools allocated: 13 of which, static: 0 +Dynamic pools deleted: 13 / Total memory freed: 0.049 MB ============================================================ G4Allocator objects are deleted. UImanager deleted. diff --git a/examples/extended/visualization/userVisAction/userVisAction.out b/examples/extended/visualization/userVisAction/userVisAction.out index 4aad556ff2..7ac168b8fe 100644 --- a/examples/extended/visualization/userVisAction/userVisAction.out +++ b/examples/extended/visualization/userVisAction/userVisAction.out @@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo ************************************************************** - Geant4 version Name: geant4-10-07-ref-06 (25-June-2021) + Geant4 version Name: geant4-11-00-ref-00 (10-December-2021) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 @@ -28,10 +28,8 @@ You have successfully registered the following graphics systems. Registered graphics systems are: ASCIITree (ATree) DAWNFILE (DAWNFILE) - G4HepRep (HepRepXML) G4HepRepFile (HepRepFile) RayTracer (RayTracer) - VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) gMocrenFile (gMocrenFile) OpenGLImmediateQt (OGLIQt, OGLI) @@ -74,40 +72,107 @@ End of Run User Vis Actions: none Some /vis commands (optionally) take a string to specify colour. "/vis/list" to see available colours. -Checking overlaps for volume Envelope (G4Box) ... OK! -Checking overlaps for volume Shape1 (G4Cons) ... OK! -Checking overlaps for volume Shape2 (G4Trd) ... OK! +Checking overlaps for volume Envelope:0 (G4Box) ... OK! +Checking overlaps for volume Shape1:0 (G4Cons) ... OK! +Checking overlaps for volume Shape2:0 (G4Trd) ... OK! ### HadronInelasticQBBC Construct Process: Emin(FTFP)= 3 GeV Emax(FTFP)= 100000 GeV Emin(BERT)= 1 GeV Emax(BERT)= 6 GeV Emax(BERTpions)= 12 GeV Emin(BIC) = 0 GeV Emax(BIC)= 1.5 GeV. ### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0 +======================================================================= +====== Electromagnetic Physics Parameters ======== +======================================================================= +LPM effect enabled 1 +Enable creation and use of sampling tables 0 +Apply cuts on all EM processes 0 +Use general process 0 +Enable linear polarisation for gamma 0 +Enable sampling of quantum entanglement 0 +X-section factor for integral approach 0.8 +Min kinetic energy for tables 100 eV +Max kinetic energy for tables 100 TeV +Number of bins per decade of a table 7 +Verbose level 1 +Verbose level for worker thread 0 +Bremsstrahlung energy threshold above which + primary e+- is added to the list of secondary 100 TeV +Bremsstrahlung energy threshold above which primary + muon/hadron is added to the list of secondary 100 TeV +Lowest triplet kinetic energy 1 MeV +Enable sampling of gamma linear polarisation 0 +5D gamma conversion model type 0 +5D gamma conversion model on isolated ion 0 +Livermore data directory livermore +======================================================================= +====== Ionisation Parameters ======== +======================================================================= +Step function for e+- (0.2, 1 mm) +Step function for muons/hadrons (0.2, 0.1 mm) +Step function for light ions (0.2, 0.1 mm) +Step function for general ions (0.2, 0.1 mm) +Lowest e+e- kinetic energy 1 keV +Lowest muon/hadron kinetic energy 1 keV +Fluctuations of dE/dx are enabled 1 +Use ICRU90 data 0 +Use built-in Birks satuaration 0 +Build CSDA range enabled 0 +Use cut as a final range enabled 0 +Enable angular generator interface 0 +Max kinetic energy for CSDA tables 1 GeV +Max kinetic energy for NIEL computation 0 eV +Linear loss limit 0.01 +Read data from file for e+e- pair production by mu 0 +======================================================================= +====== Multiple Scattering Parameters ======== +======================================================================= +Type of msc step limit algorithm for e+- 1 +Type of msc step limit algorithm for muons/hadrons 0 +Msc lateral displacement for e+- enabled 1 +Msc lateral displacement for muons and hadrons 0 +Urban msc model lateral displacement alg96 1 +Range factor for msc step limit for e+- 0.04 +Range factor for msc step limit for muons/hadrons 0.2 +Geometry factor for msc step limitation of e+- 2.5 +Safety factor for msc step limit for e+- 0.6 +Skin parameter for msc step limitation of e+- 1 +Lambda limit for msc step limit for e+- 1 mm +Use Mott correction for e- scattering 0 +Factor used for dynamic computation of angular + limit between single and multiple scattering 1 +Fixed angular limit between single + and multiple scattering 3.1416 rad +Upper energy limit for e+- multiple scattering 100 MeV +Type of electron single scattering model 0 +Type of nuclear form-factor 1 +Screening factor 1 +======================================================================= phot: for gamma SubType=12 BuildTable=0 LambdaPrime table from 200 keV to 100 TeV in 61 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermorePhElectric : Emin= 0 meV Emax= 100 TeV SauterGavrila Fluo + LivermorePhElectric : Emin= 0 eV Emax= 100 TeV SauterGavrila Fluo compt: for gamma SubType=13 BuildTable=1 Lambda table from 100 eV to 1 MeV, 7 bins/decade, spline: 1 LambdaPrime table from 1 MeV to 100 TeV in 56 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Klein-Nishina : Emin= 0 meV Emax= 100 TeV + Klein-Nishina : Emin= 0 eV Emax= 100 TeV conv: for gamma SubType=14 BuildTable=1 Lambda table from 1.022 MeV to 100 TeV, 18 bins/decade, spline: 1 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BetheHeitlerLPM : Emin= 0 meV Emax= 100 TeV ModifiedTsai + BetheHeitlerLPM : Emin= 0 eV Emax= 100 TeV ModifiedTsai Rayl: for gamma SubType=11 BuildTable=1 Lambda table from 100 eV to 100 keV, 7 bins/decade, spline: 0 LambdaPrime table from 100 keV to 100 TeV in 63 bins ===== EM models for the G4Region DefaultRegionForTheWorld ====== - LivermoreRayleigh : Emin= 0 meV Emax= 100 TeV CullenGenerator + LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator msc: for e- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -117,25 +182,25 @@ eIoni: for e- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e- XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai CoulombScat: for e- XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for e+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 MeV Nbins=42 100 eV - 100 MeV + UrbanMsc : Emin= 0 eV Emax= 100 MeV Nbins=42 100 eV - 100 MeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm @@ -145,29 +210,29 @@ eIoni: for e+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MollerBhabha : Emin= 0 meV Emax= 100 TeV + MollerBhabha : Emin= 0 eV Emax= 100 TeV eBrem: for e+ XStype:4 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eBremSB : Emin= 0 meV Emax= 1 GeV ModifiedTsai + eBremSB : Emin= 0 eV Emax= 1 GeV ModifiedTsai eBremLPM : Emin= 1 GeV Emax= 100 TeV ModifiedTsai annihil: for e+ XStype:2 SubType=5 BuildTable=0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eplus2gg : Emin= 0 meV Emax= 100 TeV + eplus2gg : Emin= 0 eV Emax= 100 TeV CoulombScat: for e+ XStype:3 SubType=1 BuildTable=1 - Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from 100 MeV to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== eCoulombScattering : Emin= 100 MeV Emax= 100 TeV msc: for proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for proton XStype:1 SubType=2 @@ -175,31 +240,31 @@ hIoni: for proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 2 MeV + Bragg : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for GenericIon SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for GenericIon XStype:1 SubType=2 @@ -208,12 +273,12 @@ ionIoni: for GenericIon XStype:1 SubType=2 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 Stopping Power data for 17 ion/material pairs ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax= 2 MeV + BraggIon : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV msc: for alpha SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - UrbanMsc : Emin= 0 meV Emax= 100 TeV + UrbanMsc : Emin= 0 eV Emax= 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm ionIoni: for alpha XStype:1 SubType=2 @@ -221,12 +286,12 @@ ionIoni: for alpha XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - BraggIon : Emin= 0 meV Emax=7.9452 MeV + BraggIon : Emin= 0 eV Emax=7.9452 MeV BetheBloch : Emin=7.9452 MeV Emax= 100 TeV msc: for anti_proton SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for anti_proton XStype:1 SubType=2 @@ -234,31 +299,31 @@ hIoni: for anti_proton XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 2 MeV + ICRU73QO : Emin= 0 eV Emax= 2 MeV BetheBloch : Emin= 2 MeV Emax= 100 TeV hBrems: for anti_proton XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for anti_proton XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 17x1001 from 7.50618 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for anti_proton XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon+ XStype:1 SubType=2 @@ -266,31 +331,31 @@ hIoni: for kaon+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=1.05231 MeV + Bragg : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for kaon- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for kaon- XStype:1 SubType=2 @@ -298,31 +363,31 @@ hIoni: for kaon- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=1.05231 MeV + ICRU73QO : Emin= 0 eV Emax=1.05231 MeV BetheBloch : Emin=1.05231 MeV Emax= 100 TeV hBrems: for kaon- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for kaon- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 18x1001 from 3.94942 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for kaon- XStype:3 SubType=1 BuildTable=1 Used Lambda table of kaon+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu+ XStype:1 SubType=2 @@ -330,32 +395,32 @@ muIoni: for mu+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax= 200 keV + Bragg : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for mu- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm muIoni: for mu- XStype:1 SubType=2 @@ -363,32 +428,32 @@ muIoni: for mu- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax= 200 keV + ICRU73QO : Emin= 0 eV Emax= 200 keV BetheBloch : Emin= 200 keV Emax= 1 GeV MuBetheBloch : Emin= 1 GeV Emax= 100 TeV muBrems: for mu- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - MuBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + MuBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi muPairProd: for mu- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 21x1001 from 1 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - muPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + muPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for mu- XStype:3 SubType=1 BuildTable=1 Used Lambda table of mu+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi+ SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi+ XStype:1 SubType=2 @@ -396,31 +461,31 @@ hIoni: for pi+ XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - Bragg : Emin= 0 meV Emax=297.505 keV + Bragg : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi+ XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi+ XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi+ XStype:3 SubType=1 BuildTable=1 - Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda table from threshold to 100 TeV, 7 bins/decade, spline: 0 ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV msc: for pi- SubType= 10 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - WentzelVIUni : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV + WentzelVIUni : Emin= 0 eV Emax= 100 TeV Nbins=84 100 eV - 100 TeV StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm hIoni: for pi- XStype:1 SubType=2 @@ -428,27 +493,27 @@ hIoni: for pi- XStype:1 SubType=2 Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - ICRU73QO : Emin= 0 meV Emax=297.505 keV + ICRU73QO : Emin= 0 eV Emax=297.505 keV BetheBloch : Emin=297.505 keV Emax= 100 TeV hBrems: for pi- XStype:1 SubType=3 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hBrem : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hBrem : Emin= 0 eV Emax= 100 TeV ModifiedMephi hPairProd: for pi- XStype:1 SubType=4 dE/dx and range tables from 100 eV to 100 TeV in 84 bins - Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1 + Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 0 Sampling table 20x1001 from 1.11656 GeV to 100 TeV ===== EM models for the G4Region DefaultRegionForTheWorld ====== - hPairProd : Emin= 0 meV Emax= 100 TeV ModifiedMephi + hPairProd : Emin= 0 eV Emax= 100 TeV ModifiedMephi CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Used Lambda table of pi+ ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531 ===== EM models for the G4Region DefaultRegionForTheWorld ====== - eCoulombScattering : Emin= 0 meV Emax= 100 TeV + eCoulombScattering : Emin= 0 eV Emax= 100 TeV ==================================================================== HADRONIC PROCESSES SUMMARY (verbose level 1) @@ -457,18 +522,18 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for neutron Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronElasticXS: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV Process: neutronInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4NeutronInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV Process: nCapture - Model: nRadCapture: 0 meV ---> 100 TeV - Cr_sctns: G4NeutronCaptureXS: 0 meV ---> 100 TeV + Model: nRadCapture: 0 eV ---> 100 TeV + Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV Process: nKiller @@ -476,71 +541,71 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for B- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: B-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for D- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: D-Inelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for GenericIon Process: ionInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: ionElastic - Model: NNDiffuseElastic: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: NNDiffuseElastic: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: He3Inelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: alphaInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for anti_He3 Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_He3Inelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -548,13 +613,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_alpha Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_alphaInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -562,13 +627,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_deuteronInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -576,12 +641,12 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: anti_lambdaInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hFritiofCaptureAtRest @@ -589,13 +654,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_neutron Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_neutronInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -603,13 +668,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_proton Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100.1 MeV + Model: hElasticLHEP: 0 eV ---> 100.1 MeV Model: AntiAElastic: 100 MeV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_protonInelastic - Model: FTFP: 0 meV ---> 100 TeV - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV ---> 100 TeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -617,13 +682,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for anti_triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100.1 MeV/n + Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: anti_tritonInelastic - Model: FTFP: 0 meV/n ---> 100 TeV/n - Cr_sctns: AntiAGlauber: 0 meV ---> 25.6 PeV + Model: FTFP: 0 eV /n ---> 100 TeV/n + Cr_sctns: AntiAGlauber: 0 eV ---> 25.6 PeV Process: hFritiofCaptureAtRest @@ -631,60 +696,60 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for deuteron Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: dInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV --------------------------------------------------- Hadronic Processes for e+ - Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Process: positronNuclear + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for e- Process: electronNuclear - Model: G4ElectroVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: ElectroNuclearXS: 0 meV ---> 100 TeV + Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for gamma Process: photonNuclear - Model: GammaNPreco: 0 meV ---> 200 MeV + Model: GammaNPreco: 0 eV ---> 200 MeV Model: BertiniCascade: 199 MeV ---> 6 GeV Model: TheoFSGenerator: 3 GeV ---> 100 TeV - Cr_sctns: PhotoNuclearXS: 0 meV ---> 100 TeV + Cr_sctns: GammaNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon+ Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon+Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for kaon- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: kaon-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -692,27 +757,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for lambda Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: lambdaInelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu+ Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for mu- Process: muonNuclear - Model: G4MuonVDNuclearModel: 0 meV ---> 1 PeV - Cr_sctns: KokoulinMuonNuclearXS: 0 meV ---> 100 TeV + Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV + Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV Process: muMinusCaptureAtRest @@ -720,27 +785,27 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for pi+ Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi+Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for pi- Process: hadElastic - Model: hElasticGlauber: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticGlauber: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: pi-Inelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 12 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -748,26 +813,26 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for proton Process: hadElastic - Model: hElasticCHIPS: 0 meV ---> 100 TeV - Cr_sctns: BarashenkovGlauberGribov: 0 meV ---> 100 TeV + Model: hElasticCHIPS: 0 eV ---> 100 TeV + Cr_sctns: BarashenkovGlauberGribov: 0 eV ---> 100 TeV Process: protonInelastic Model: FTFP: 3 GeV ---> 100 TeV Model: BertiniCascade: 1 GeV ---> 6 GeV - Model: Binary Cascade: 0 meV ---> 1.5 GeV - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 100 TeV + Model: Binary Cascade: 0 eV ---> 1.5 GeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 100 TeV --------------------------------------------------- Hadronic Processes for sigma- Process: hadElastic - Model: hElasticLHEP: 0 meV ---> 100 TeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: hElasticLHEP: 0 eV ---> 100 TeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: sigma-Inelastic Model: FTFP: 3 GeV ---> 100 TeV - Model: BertiniCascade: 0 meV ---> 6 GeV - Cr_sctns: Glauber-Gribov: 0 meV ---> 100 TeV + Model: BertiniCascade: 0 eV ---> 6 GeV + Cr_sctns: Glauber-Gribov: 0 eV ---> 100 TeV Process: hBertiniCaptureAtRest @@ -775,13 +840,13 @@ CoulombScat: for pi- XStype:3 SubType=1 BuildTable=1 Hadronic Processes for triton Process: hadElastic - Model: hElasticLHEP: 0 meV/n ---> 100 TeV/n - Cr_sctns: Glauber-Gribov Nucl-nucl: 0 meV ---> 25.6 PeV + Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n + Cr_sctns: Glauber-Gribov Nucl-nucl: 0 eV ---> 25.6 PeV Process: tInelastic - Model: Binary Light Ion Cascade: 0 meV/n ---> 6 GeV/n + Model: Binary Light Ion Cascade: 0 eV /n ---> 6 GeV/n Model: FTFP: 3 GeV/n ---> 100 TeV/n - Cr_sctns: G4ParticleInelasticXS: 0 meV ---> 25.6 PeV + Cr_sctns: G4ParticleInelasticXS: 0 eV ---> 25.6 PeV ================================================================ ======================================================================= @@ -804,7 +869,6 @@ Time limit for long lived isomeres (ns) 1 Isomer production flag 1 Internal e- conversion flag 1 Store e- internal conversion data 0 -Electron internal conversion ID 3 Correlated gamma emission flag 0 Max 2J for sampling of angular correlations 10 ======================================================================= @@ -824,7 +888,7 @@ See commands in /vis/modeling/trajectories/ for other options. --------------------End of Global Run----------------------- The run consists of 1000 gamma of 6 MeV - Dose in scoring volume : 44.869 picoGy +- 3.95368 picoGy + Dose in scoring volume : 42.6381 picoGy +- 3.85445 picoGy ------------------------------------------------------------ 0 events have been kept for refreshing and/or reviewing. @@ -844,7 +908,7 @@ See commands in /vis/modeling/trajectories/ for other options. --------------------End of Global Run----------------------- The run consists of 1000 proton of 210 MeV - Dose in scoring volume : 5.16668 nanoGy +- 146.593 picoGy + Dose in scoring volume : 4.86323 nanoGy +- 146.722 picoGy ------------------------------------------------------------ 0 events have been kept for refreshing and/or reviewing. diff --git a/source/GNUmakefile b/source/GNUmakefile index 71ad84acd3..1fc8d31358 100644 --- a/source/GNUmakefile +++ b/source/GNUmakefile @@ -167,8 +167,8 @@ endif banner: @$(ECHO) "*************************************************************" - @$(ECHO) " Installation Geant4 version geant4-11-00-beta-01 " - @$(ECHO) " Copyright (C) 1994-2021 Geant4 Collaboration " + @$(ECHO) " Installation Geant4 version geant4-11-00 " + @$(ECHO) " Copyright (C) 1994-2022 Geant4 Collaboration " @$(ECHO) "*************************************************************" clean_libs:: diff --git a/source/analysis/CMakeLists.txt b/source/analysis/CMakeLists.txt index 84ffa180ad..9f2c3920ce 100644 --- a/source/analysis/CMakeLists.txt +++ b/source/analysis/CMakeLists.txt @@ -2,7 +2,6 @@ if(GEANT4_USE_FREETYPE) add_definitions(-DTOOLS_USE_FREETYPE) - add_definitions(-DTOOLS_USE_EXPAT) endif() set(G4analysis_COMPONENTS diff --git a/source/analysis/History b/source/analysis/History index 4bc12edffc..15840601e8 100644 --- a/source/analysis/History +++ b/source/analysis/History @@ -16,6 +16,188 @@ committal in the SVN repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +November 15, 2021 I. Hrivnacova (analysis-V10-07-30) +- Fixed remaining Coverity issues + +November 15, 2021 I. Hrivnacova (analysis-V10-07-29) +- Fixed Coverity issues + +November 09, 2021 I. Hrivnacova (analysis-V10-07-28) +- Fix in G4MPIToolsManager: do not call Receive() twice + +November 05, 2021 I. Hrivnacova (analysis-V10-07-27) +- Added new public function G4VAnalysisManager::Clear() + that deletes all allocated analysis objects and clears + their collections. + This function should be used as a replacement for deleting + the analysis manager in the applications that allocate the + analysis data in begin of run and deleted the analysis + manager in end of run. +- Minor code clean-up + +November 04, 2021 I. Hrivnacova (analysis-V10-07-26) +- Renamed G4VAnalysisReader::ReadNtuple(const G4String&) + back in GetNtuple. Cannot reproduce the ambiguity error + with GetNtuple(G4int). + +October 28, 2021 I. Hrivnacova (analysis-V10-07-25) +- Moved data members initialization in header files; + added deleted default constructor where appropriate, + added explicit keyword to one argument construtors where + missing +- Use brace data members initialization everywhere +- Implemented missing WriteOnAscii() - for h2,h3,p1,p2 +- Use fonts from tools in G4PlotManager.cc +- Removed CMake -DTOOLS_USE_EXPAT definition (not needed) +- Added G4ToolsAnalysisMessenger that implements "get" commands + /analysis/hn|pn/get id + +October 27, 2021 B.Morgan (analysis-V10-07-24) +- Use G4StrUtil functions replacing deprecated G4String member functions + +October 26, 2021 I. Hrivnacova (analysis-V10-07-23) +- Fixed G4*RFileManager destructors; + thanks to B. Morgan for spotting this bug + +October 25, 2021 I. Hrivnacova (analysis-V10-07-22) +- Added public function G4VAnalysisManager::Reset() + - Needed when calling files are closed without reset + by calling analysisManager->CloseFile(false) + (see B5 example with interactive plotting) +- Minor fixes: + - Do not issue same log messages from generic analysis manager + and generic file manager + - Do not call SetIsEmpty() twice in Hdf5 + +October 22, 2021 I. Hrivnacova (analysis-V10-07-21) +- Support for ntuple columns of string vector type + for Xml, Hdf5 output type: + - added helper code for Xml reader, no update needed for Hdf5 + +October 19, 2021 I. Hrivnacova (analysis-V10-07-20) +- Implemented support for file system directories with Csv output + as proposed in [GitHub PR #32](https://github.com/Geant4/geant4/pull/32) +- Fixed reading objects from files with directories (Root, Hdf5) +- Implemented handling directories in Generic analysis manager +- Clean-up in G4ToolsAnalysisManager +- Reimplemented utility functions GetBaseName(), GetExtension() using + library + +October 6, 2021 I. Hrivnacova (analysis-V10-07-19) +- Added new G4AnalysisManager.hh header defining + using G4AnalysisManager = G4GenericAnalysisManager +- Removed g4csv.hh, g4hdf5.hh, g4root.hh, g4xml.hh +- Reduced output specific type definitions in + g4xyz_defs.hh to ntuple end rntuple types +- Removed g4analysis.hh with the + G4Analysis::MasterInstance() factory method +- Removed the default value ("root") for the default file type + in G4GenericAnalysisManager - the default must be set by + user if using fileNames without extensions +- Updated exception codes and messages in accummulables + +September 20, 2021 I. Hrivnacova (analysis-V10-07-18) +- clang-tidy performance fixes: + - use const auto&, std::move where appropriate + - revisited passing by std::shared_ptr +- clang-tidy modernize fixes: + - use make_unique, nullptr, auto, emplace_back, using + - use default for disabled constructors and destructors, + delete for private member functions not implemented +- Removed explicit for constructors with more than 1 parameters + +September 17, 2021 I. Hrivnacova (analysis-V10-07-17) +- Fixed evaluation of result of deleting empty file + in G4RootAnalysisManager causing wrong warnings + +September 3, 2021 I. Hrivnacova (analysis-V10-07-16) +- Added support for ntuple columns of string vectors via + new public functions in G4VAnalysisManager and G4VAnalysisReader: + G4bool SetNtupleSColumn(const G4String& columnName, + std::vector& vector) final; + G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, + std::vector& vector) = 0; + +August 31, 2021 I. Hrivnacova (analysis-V10-07-15) +- Code clean-up: + - Review of static data members: + - changed static const to static constexpr where possible + or inline static const otherwise (for G4String) + - declares static data members inline and moved their initialization + in header file + - Be consistent: + - "" for includes from g4tools + - "fk" prefix for class constexpr data names + - Template argument names: + HT, NT, FT for histogram/profile, ntuple, file types + - Removed redundant includes of "G4Threading.hh", + +August 26, 2021 B. Morgan (analysis-V10-07-14) +- Remove default: in switch for GetMergeFunction + - Prevents accidental fall through of Windows + +August 25, 2021 I. Hrivnacova (analysis-V10-07-13) +- Separated Hn/Pn object file handling from output specific analysis readers + in Hn file manager classes for reading (G4XHnRFileManager) +- Replaced the explicit Read[Hn|Pn] functions in the analysis readers + by a common implementation in G4ToolsAnalysisReader + using the newly introduced Hn file manager classes for reading +- Separated ReadNtuple functions from the analysis readers in + the RNtuple manager classes +- Renamed G4VAnalysisReader::GetNtuple(const G4String&) in ReadNtuple + to avoid ambiguity with GetNtuple(G4int). + Note that this change brings backward incompatibility. +- Using more shared pointers + +August 18, 2021 I. Hrivnacova (analysis-V10-07-12) +- Simplified verbosity messages +- Plus more simplifications in Warn calls +- Separated inline functions from G4MPIToolsManager.hh + to new .icc + +August 16, 2021 I. Hrivnacova (analysis-V10-07-11) +- Simplified calls to G4Exceptions: + - Added G4Analysis::Warn() and changed the calls to G4Exception in + all analysis classes (except accummulables) + - Reduced exception classification to + Analysis_F001: Fatal exceptions - all fatal exception + Analysis_W001: Warnings - all warnings +- Replaced some constants with constexpr + +August 12, 2021 I. Hrivnacova (analysis-V10-07-10) +- Replaced the explicit Write[Hn|Pn] functions in the analysis managers + by a common implementation in G4ToolsAnalysisManager::WriteImpl() and Merge() + using the new Hn file manager classes introduced for the generic file manager + last year. + The same code is now used for writing histograms/profiles by specific analysis managers and the generic analysis manager. +- Added new G4ToolsAnalysisManager::IsEmpty() function +- Removed trailing whitespaces + +August 6, 2021 I. Hrivnacova (analysis-V10-07-09) +- Added new G4VAnalysisReader public function + G4bool CloseFiles(G4bool reset = true); + to be called by user before the end of program + and its implementation for all readers. + This prevents from errors in the Hdf5 read test + after migration of the readers to G4ThreadLocalSingleton. + +July 19, 2021 I. Hrivnacova (analysis-V10-07-08) +- Migration to G4ThreadLocalSingleton: + in all specific analysis manager and reader classes. + After this migration the singleton instances are deletes + by the Geant4 kernel, that's why their deleting has to be + removed from the client code. +- Removed isMaster argument from managers/reders constructors, + and retrieve this info from G4Threading where needed. + +July 15, 2021 I. Hrivnacova (analysis-V10-07-07) +- Replaced G4Analysis::make_unique with std::make_unique +- Using [[maybe_unused]] where appropriate + +June 29, 2021 G. Cosmo (analysis-V10-07-06) +- Fixed compilation errors in G4CsvAnalysisReader and G4XmlAnalysisReader + occurring with c++20 enabled. + May 25, 2021 B. Morgan (analysis-V10-07-05) - Move fonts/ directory and install logic to g4tools external, as prime interface to Freetype. diff --git a/source/analysis/accumulables/include/G4Accumulable.hh b/source/analysis/accumulables/include/G4Accumulable.hh index 41ca1ad333..bf47d9ea69 100644 --- a/source/analysis/accumulables/include/G4Accumulable.hh +++ b/source/analysis/accumulables/include/G4Accumulable.hh @@ -40,16 +40,18 @@ template class G4Accumulable : public G4VAccumulable { public: - G4Accumulable(const G4String& name, T initValue, + G4Accumulable(const G4String& name, T initValue, G4MergeMode mergeMode = G4MergeMode::kAddition); - G4Accumulable(T initValue, + G4Accumulable(T initValue, G4MergeMode mergeMode = G4MergeMode::kAddition); G4Accumulable(const G4Accumulable& rhs); + G4Accumulable(G4Accumulable&& rhs); G4Accumulable() = delete; - virtual ~G4Accumulable(); + virtual ~G4Accumulable() = default; - // operators + // Operators G4Accumulable& operator= (const G4Accumulable& rhs); + G4Accumulable& operator= (G4Accumulable&& rhs); G4Accumulable& operator+=(const G4Accumulable& rhs); G4Accumulable& operator*=(const G4Accumulable& rhs); G4Accumulable operator++(int); // postfix increment @@ -59,16 +61,16 @@ class G4Accumulable : public G4VAccumulable G4Accumulable& operator+=(const T& rhs); G4Accumulable& operator*=(const T& rhs); - // methods + // Methods virtual void Merge(const G4VAccumulable& other) final; virtual void Reset() final; - // get methods + // Get methods T GetValue() const; G4MergeMode GetMergeMode() const; private: - // data members + // Data members T fValue; T fInitValue; G4MergeMode fMergeMode; diff --git a/source/analysis/accumulables/include/G4Accumulable.icc b/source/analysis/accumulables/include/G4Accumulable.icc index 72d5ef6e97..8a49e8528a 100644 --- a/source/analysis/accumulables/include/G4Accumulable.icc +++ b/source/analysis/accumulables/include/G4Accumulable.icc @@ -35,7 +35,7 @@ using namespace G4Accumulables; //_____________________________________________________________________________ -template +template G4Accumulable::G4Accumulable(const G4String& name, T initValue, G4MergeMode mergeMode) : G4VAccumulable(name), fValue(initValue), @@ -45,7 +45,7 @@ G4Accumulable::G4Accumulable(const G4String& name, T initValue, G4MergeMode m {} //_____________________________________________________________________________ -template +template G4Accumulable::G4Accumulable(T initValue, G4MergeMode mergeMode) : G4VAccumulable(), fValue(initValue), @@ -55,7 +55,7 @@ G4Accumulable::G4Accumulable(T initValue, G4MergeMode mergeMode) {} //_____________________________________________________________________________ -template +template G4Accumulable::G4Accumulable(const G4Accumulable& rhs) : G4VAccumulable(rhs), fValue(rhs.fValue), @@ -65,12 +65,17 @@ G4Accumulable::G4Accumulable(const G4Accumulable& rhs) {} //_____________________________________________________________________________ -template -G4Accumulable::~G4Accumulable() +template +G4Accumulable::G4Accumulable(G4Accumulable&& rhs) + : G4VAccumulable(rhs), + fValue(std::move(rhs.fValue)), + fInitValue(std::move(rhs.fInitValue)), + fMergeMode(rhs.fMergeMode), + fMergeFunction(rhs.fMergeFunction) {} //_____________________________________________________________________________ -template +template G4Accumulable& G4Accumulable::operator=(const G4Accumulable& rhs) { @@ -90,7 +95,27 @@ G4Accumulable::operator=(const G4Accumulable& rhs) } //_____________________________________________________________________________ -template +template +G4Accumulable& +G4Accumulable::operator=(G4Accumulable&& rhs) +{ + // check assignment to self + if (this == &rhs) return *this; + + // base class assignment + G4VAccumulable::operator=(rhs); + + // this class data assignment + fValue = std::move(rhs.fValue); + fInitValue = std::move(rhs.fInitValue); + fMergeMode = rhs.fMergeMode; + fMergeFunction = rhs.fMergeFunction; + + return *this; +} + +//_____________________________________________________________________________ +template G4Accumulable& G4Accumulable::operator+=(const G4Accumulable& rhs) { @@ -100,7 +125,7 @@ G4Accumulable::operator+=(const G4Accumulable& rhs) } //_____________________________________________________________________________ -template +template G4Accumulable& G4Accumulable::operator*=(const G4Accumulable& rhs) { @@ -110,7 +135,7 @@ G4Accumulable::operator*=(const G4Accumulable& rhs) } //_____________________________________________________________________________ -template +template G4Accumulable& G4Accumulable::operator=(const T& value) { @@ -120,7 +145,7 @@ G4Accumulable::operator=(const T& value) } //_____________________________________________________________________________ -template +template G4Accumulable& G4Accumulable::operator+=(const T& value) { @@ -130,7 +155,7 @@ G4Accumulable::operator+=(const T& value) } //_____________________________________________________________________________ -template +template G4Accumulable& G4Accumulable::operator*=(const T& value) { @@ -140,18 +165,18 @@ G4Accumulable::operator*=(const T& value) } //_____________________________________________________________________________ -template -G4Accumulable +template +G4Accumulable G4Accumulable::operator++(int) { // postfix increment G4Accumulable temp = *this; fValue++; return temp; -} +} //_____________________________________________________________________________ -template +template G4Accumulable& G4Accumulable::operator++() { @@ -161,7 +186,7 @@ G4Accumulable::operator++() } //_____________________________________________________________________________ -template +template void G4Accumulable::Merge(const G4VAccumulable& other) { // G4cout << "Merging other: " << other.GetName() << " " << static_cast&>(other).fValue << G4endl; @@ -171,14 +196,14 @@ void G4Accumulable::Merge(const G4VAccumulable& other) } //_____________________________________________________________________________ -template +template void G4Accumulable::Reset() { fValue = fInitValue; } //_____________________________________________________________________________ -template +template T G4Accumulable::GetValue() const { return fValue; diff --git a/source/analysis/accumulables/include/G4AccumulableManager.hh b/source/analysis/accumulables/include/G4AccumulableManager.hh index 7131834c5a..aa7fc341a7 100644 --- a/source/analysis/accumulables/include/G4AccumulableManager.hh +++ b/source/analysis/accumulables/include/G4AccumulableManager.hh @@ -37,51 +37,56 @@ #include #include +class G4AccumulableManager; class G4AnalysisManagerState; class G4VAccumulable; +template +class G4ThreadLocalSingleton; class G4AccumulableManager { + friend class G4ThreadLocalSingleton; + public: virtual ~G4AccumulableManager(); - - // static methods + + // Static methods static G4AccumulableManager* Instance(); - + // Methods // Create accumulables // template - G4Accumulable* - CreateAccumulable(const G4String& name, T value, + G4Accumulable* + CreateAccumulable(const G4String& name, T value, G4MergeMode mergeMode = G4MergeMode::kAddition); - template - G4Accumulable* - CreateAccumulable(T value, + template + G4Accumulable* + CreateAccumulable(T value, G4MergeMode mergeMode = G4MergeMode::kAddition); // Register existing accumulables - // + // // templated accumulable - template + template G4bool RegisterAccumulable(G4Accumulable& accumulable); // user defined accumulable G4bool RegisterAccumulable(G4VAccumulable* accumulable); // Access registered accumulables - // + // // Via name // templated accumulable - template + template G4Accumulable* GetAccumulable(const G4String& name, G4bool warn = true) const; // user defined accumulable G4VAccumulable* GetAccumulable(const G4String& name, G4bool warn = true) const; // Via id (in the order of registering) // templated accumulable - template + template G4Accumulable* GetAccumulable(G4int id, G4bool warn = true) const; // user defined accumulable G4VAccumulable* GetAccumulable(G4int id, G4bool warn = true) const; @@ -98,26 +103,25 @@ class G4AccumulableManager void Reset(); private: - // hide ctor requiring master/worker specification - G4AccumulableManager(G4bool isMaster); + // Hide singleton ctor + G4AccumulableManager(); - // metods + // Methods // Generate generic accumulable name: accumulableN, where N is the actual number of accumulables G4String GenerateName() const; - // Check if a name is already used in a map and print a warning + // Check if a name is already used in a map and print a warning G4bool CheckName(const G4String& name, const G4String& where) const; - template + template G4Accumulable* GetAccumulable(G4VAccumulable* accumulable, G4bool warn) const; - // constants + // Constants const G4String kBaseName = "accumulable"; - // static data members - static G4AccumulableManager* fgMasterInstance; - static G4ThreadLocal G4AccumulableManager* fgInstance; + // Static data members + inline static G4AccumulableManager* fgMasterInstance { nullptr }; - // data members + // Data members std::vector fVector; std::map fMap; std::vector fAccumulablesToDelete; diff --git a/source/analysis/accumulables/include/G4AccumulableManager.icc b/source/analysis/accumulables/include/G4AccumulableManager.icc index cc29bc8fd1..bb3b69dcfc 100644 --- a/source/analysis/accumulables/include/G4AccumulableManager.icc +++ b/source/analysis/accumulables/include/G4AccumulableManager.icc @@ -25,21 +25,21 @@ // //_____________________________________________________________________________ -template -G4Accumulable* +template +G4Accumulable* G4AccumulableManager::GetAccumulable(G4VAccumulable* accumulable, G4bool warn) const { // Do not check type if nullptr if ( ! accumulable ) return nullptr; // check type - G4Accumulable* taccumulable = dynamic_cast*>(accumulable); + auto taccumulable = dynamic_cast*>(accumulable); if ( ! taccumulable && warn ) { G4ExceptionDescription description; - description << " " << "Accumulable " << accumulable->GetName() + description << " " << "Accumulable " << accumulable->GetName() << " has different type"; - G4Exception("G4AccumulableManager::GetAccumulable", - "Analysis_W011", JustWarning, description); + G4Exception("G4AccumulableManager::GetAccumulable", + "Analysis_W001", JustWarning, description); return nullptr; } @@ -47,13 +47,13 @@ G4AccumulableManager::GetAccumulable(G4VAccumulable* accumulable, G4bool warn) c } //_____________________________________________________________________________ -template -G4Accumulable* +template +G4Accumulable* G4AccumulableManager::CreateAccumulable( const G4String& name, T value, G4MergeMode mergeMode) { // do not accept name if it is already used - if ( ! CheckName(name, "CreateAccumulable") ) return 0; + if ( ! CheckName(name, "CreateAccumulable") ) return 0; // create accumulable auto accumulable = new G4Accumulable(name, value, mergeMode); @@ -66,8 +66,8 @@ G4AccumulableManager::CreateAccumulable( } //_____________________________________________________________________________ -template -G4Accumulable* +template +G4Accumulable* G4AccumulableManager::CreateAccumulable( T value, G4MergeMode mergeMode) { @@ -75,15 +75,15 @@ G4AccumulableManager::CreateAccumulable( } //_____________________________________________________________________________ -template +template G4bool G4AccumulableManager::RegisterAccumulable(G4Accumulable& accumulable) { return RegisterAccumulable(&accumulable); } //_____________________________________________________________________________ -template -G4Accumulable* +template +G4Accumulable* G4AccumulableManager::GetAccumulable(const G4String& name, G4bool warn) const { // get G4VParammeter from the map @@ -92,8 +92,8 @@ G4AccumulableManager::GetAccumulable(const G4String& name, G4bool warn) const } //_____________________________________________________________________________ -template -G4Accumulable* +template +G4Accumulable* G4AccumulableManager::GetAccumulable(G4int id, G4bool warn) const { // get G4VParammeter from the map @@ -120,14 +120,14 @@ inline std::vector::iterator G4AccumulableManager::End() } //_____________________________________________________________________________ -inline std::vector::const_iterator +inline std::vector::const_iterator G4AccumulableManager::BeginConst() const { return fVector.begin(); } //_____________________________________________________________________________ -inline std::vector::const_iterator +inline std::vector::const_iterator G4AccumulableManager::EndConst() const { return fVector.end(); diff --git a/source/analysis/accumulables/include/G4MergeMode.hh b/source/analysis/accumulables/include/G4MergeMode.hh index 499f8acc1a..85ffd54f2b 100644 --- a/source/analysis/accumulables/include/G4MergeMode.hh +++ b/source/analysis/accumulables/include/G4MergeMode.hh @@ -30,6 +30,7 @@ #define G4MergeMode_h 1 #include "globals.hh" +#include "G4Exception.hh" #include #include @@ -41,7 +42,7 @@ enum class G4MergeMode { kMultiplication, // "And" if boolean type kMaximum, // "Or" if boolean type kMinimum // "And" if boolean type -}; +}; // Generic merge function template @@ -62,7 +63,7 @@ G4MergeFunction GetMergeFunction(G4MergeMode mergeMode) case G4MergeMode::kMultiplication: return [](const T& x, const T& y) { return x * y; }; - + case G4MergeMode::kMaximum: // return std::bind([](const T& x, const T& y) { return std::max(x,y);}); return [](const T& x, const T& y) { return std::max(x,y); }; @@ -70,10 +71,13 @@ G4MergeFunction GetMergeFunction(G4MergeMode mergeMode) case G4MergeMode::kMinimum: // return std::bind([](const T& x, const T& y) { return std::min(x,y);}); return [](const T& x, const T& y) { return std::min(x,y); }; - - default: - return [](const T&, const T&) { return 0.0; }; } + + // Must never get here, but we need a return to satisfy MSVC + G4Exception("G4Accumulables::GetMergeFunction", + "Analysis_F001", FatalException, + "Undefined merge mode"); + return [](const T&, const T&) { return T(); }; } template diff --git a/source/analysis/accumulables/include/G4VAccumulable.hh b/source/analysis/accumulables/include/G4VAccumulable.hh index afb975402d..669bd6be3c 100644 --- a/source/analysis/accumulables/include/G4VAccumulable.hh +++ b/source/analysis/accumulables/include/G4VAccumulable.hh @@ -41,17 +41,19 @@ class G4VAccumulable public: G4VAccumulable(const G4String& name = ""); - G4VAccumulable(const G4VAccumulable& rhs); - virtual ~G4VAccumulable() {} + G4VAccumulable(const G4VAccumulable& rhs) = default; + G4VAccumulable(G4VAccumulable&& rhs) = default; + virtual ~G4VAccumulable() = default; - // operators - G4VAccumulable& operator=(const G4VAccumulable& rhs); + // Operators + G4VAccumulable& operator=(const G4VAccumulable& rhs) = default; + G4VAccumulable& operator=(G4VAccumulable&& rhs) = default; - // methods + // Methods virtual void Merge(const G4VAccumulable& other) = 0; virtual void Reset() = 0; - // get methods + // Get methods G4String GetName() const; protected: diff --git a/source/analysis/accumulables/include/G4VAccumulable.icc b/source/analysis/accumulables/include/G4VAccumulable.icc index 2ebcabe985..4d19e7e12f 100644 --- a/source/analysis/accumulables/include/G4VAccumulable.icc +++ b/source/analysis/accumulables/include/G4VAccumulable.icc @@ -29,21 +29,8 @@ inline G4VAccumulable::G4VAccumulable(const G4String& name) : fName(name) {} -//_____________________________________________________________________________ -inline G4VAccumulable::G4VAccumulable(const G4VAccumulable& rhs) - : fName(rhs.fName) -{} - -//_____________________________________________________________________________ -inline G4VAccumulable& G4VAccumulable::operator=(const G4VAccumulable& rhs) -{ - fName = rhs.fName; - - return *this; -} - //_____________________________________________________________________________ inline G4String G4VAccumulable::GetName() const -{ +{ return fName; } diff --git a/source/analysis/accumulables/src/G4AccumulableManager.cc b/source/analysis/accumulables/src/G4AccumulableManager.cc index d2455a7e5c..43cd0d87b1 100644 --- a/source/analysis/accumulables/src/G4AccumulableManager.cc +++ b/source/analysis/accumulables/src/G4AccumulableManager.cc @@ -27,6 +27,7 @@ // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) #include "G4AccumulableManager.hh" +#include "G4ThreadLocalSingleton.hh" #include "G4Threading.hh" #include "G4AutoLock.hh" @@ -37,36 +38,17 @@ namespace { G4Mutex mergeMutex = G4MUTEX_INITIALIZER; } -G4AccumulableManager* G4AccumulableManager::fgMasterInstance = nullptr; -G4ThreadLocal G4AccumulableManager* G4AccumulableManager::fgInstance = nullptr; - //_____________________________________________________________________________ G4AccumulableManager* G4AccumulableManager::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4AccumulableManager(isMaster); - } - - return fgInstance; -} + static G4ThreadLocalSingleton instance; + return instance.Instance(); +} //_____________________________________________________________________________ -G4AccumulableManager::G4AccumulableManager(G4bool isMaster) - : fVector(), - fMap() +G4AccumulableManager::G4AccumulableManager() { - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description - << " " - << "G4AccumulableAnalysisManager already exists." - << "Cannot create another instance."; - G4Exception("G4AccumulableAnalysisManager::G4AccumulableAnalysisManager()", - "Analysis_F001", FatalException, description); - } - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; } //_____________________________________________________________________________ @@ -97,13 +79,13 @@ G4String G4AccumulableManager::GenerateName() const G4bool G4AccumulableManager::CheckName(const G4String& name, const G4String& where) const { if ( fMap.find(name) == fMap.end() ) return true; - + G4ExceptionDescription description; - description << " " << "Name " << name << " is already used." << G4endl; - description << " " << "Parameter will be not created/registered."; + description << "Name " << name << " is already used." << G4endl; + description << "Parameter will be not created/registered."; G4String method("G4AccumulableManager::"); method.append(where); - G4Exception(method, "Analysis_W002", JustWarning, description); + G4Exception(method, "Analysis_W001", JustWarning, description); return false; } @@ -115,9 +97,9 @@ G4bool G4AccumulableManager::CheckName(const G4String& name, const G4String& whe G4bool G4AccumulableManager::RegisterAccumulable(G4VAccumulable* accumulable) { auto name = accumulable->GetName(); - + // do not accept name if it is already used - if ( ! CheckName(name, "RegisterAccumulable") ) return false; + if ( ! CheckName(name, "RegisterAccumulable") ) return false; // generate name if empty if ( ! name.length() ) { @@ -131,7 +113,7 @@ G4bool G4AccumulableManager::RegisterAccumulable(G4VAccumulable* accumulable) } //_____________________________________________________________________________ -G4VAccumulable* +G4VAccumulable* G4AccumulableManager::GetAccumulable(const G4String& name, G4bool warn) const { // get G4VParammeter from the map @@ -139,9 +121,9 @@ G4AccumulableManager::GetAccumulable(const G4String& name, G4bool warn) const if ( it == fMap.end() ) { if ( warn) { G4ExceptionDescription description; - description << " " << "accumulable " << name << " does not exist."; - G4Exception("G4AccumulableManager::GetAccumulable", - "Analysis_W011", JustWarning, description); + description << "Accumulable " << name << " does not exist."; + G4Exception("G4AccumulableManager::GetAccumulable", + "Analysis_W001", JustWarning, description); } return nullptr; } @@ -150,16 +132,16 @@ G4AccumulableManager::GetAccumulable(const G4String& name, G4bool warn) const } //_____________________________________________________________________________ -G4VAccumulable* +G4VAccumulable* G4AccumulableManager::GetAccumulable(G4int id, G4bool warn) const { // get G4VParammeter from the vector if ( id < 0 || id >= G4int(fVector.size()) ) { if ( warn) { G4ExceptionDescription description; - description << " " << "accumulable " << id << " does not exist."; - G4Exception("G4AccumulableManager::GetAccumulable", - "Analysis_W011", JustWarning, description); + description << "Accumulable " << id << " does not exist."; + G4Exception("G4AccumulableManager::GetAccumulable", + "Analysis_W001", JustWarning, description); } return nullptr; } @@ -168,7 +150,7 @@ G4AccumulableManager::GetAccumulable(G4int id, G4bool warn) const } //_____________________________________________________________________________ -void G4AccumulableManager::Merge() +void G4AccumulableManager::Merge() { // Do nothing if there are no accumulables registered // or if master thread @@ -177,18 +159,17 @@ void G4AccumulableManager::Merge() // The manager on mastter must exist if ( ! fgMasterInstance ) { G4ExceptionDescription description; - description - << " " << "No master G4AccumulableManager instance exists." - << G4endl - << " " << "Accumulables will not be merged."; + description + << "No master G4AccumulableManager instance exists." << G4endl + << "Accumulables will not be merged."; G4Exception("G4AccumulableManager::Merge()", - "Analysis_W031", JustWarning, description); + "Analysis_W001", JustWarning, description); return; } // The worker manager just merges its accumulables to the master // This operation needs a lock - // G4cout << "Go to merge accumulables" << G4endl; + // G4cout << "Go to merge accumulables" << G4endl; G4AutoLock lock(&mergeMutex); // the other manager has the vector with the "same" accumulables @@ -198,7 +179,7 @@ void G4AccumulableManager::Merge() // G4VAccumulable* accumulable = *(it++); // masterAccumulable->Merge(*(accumulable)); itMaster->Merge(*(*(it++))); - } + } lock.unlock(); } @@ -206,10 +187,10 @@ void G4AccumulableManager::Merge() void G4AccumulableManager::Reset() { // Reset histograms and profiles - + for ( auto it : fVector ) { it->Reset(); - } -} - + } +} + diff --git a/source/analysis/accumulables/src/G4MergeMode.cc b/source/analysis/accumulables/src/G4MergeMode.cc index f0ed9d299b..db92fb5815 100644 --- a/source/analysis/accumulables/src/G4MergeMode.cc +++ b/source/analysis/accumulables/src/G4MergeMode.cc @@ -37,12 +37,12 @@ G4MergeMode GetMergeMode(const G4String& mergeModeName) { else if ( mergeModeName == "*" ) { return G4MergeMode::kMultiplication; } else { G4ExceptionDescription description; - description - << " \"" << mergeModeName << "\" merge mode is not supported." << G4endl - << " " << "Addition will be applied."; + description + << "\"" << mergeModeName << "\" merge mode is not supported." << G4endl + << "Addition will be applied."; G4Exception("G4Analysis::GetMergeMode", - "Analysis_W013", JustWarning, description); - return G4MergeMode::kAddition; + "Analysis_W001", JustWarning, description); + return G4MergeMode::kAddition; } } diff --git a/source/analysis/csv/include/G4CsvAnalysisManager.hh b/source/analysis/csv/include/G4CsvAnalysisManager.hh index de4c136dd1..3bc1b5eb84 100644 --- a/source/analysis/csv/include/G4CsvAnalysisManager.hh +++ b/source/analysis/csv/include/G4CsvAnalysisManager.hh @@ -25,7 +25,7 @@ // // The main manager for Csv analysis. -// It delegates most of functions to the object specific managers. +// It delegates most of functions to the object specific managers. // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) @@ -38,17 +38,22 @@ #include "tools/wcsv_ntuple" #include +#include +class G4CsvAnalysisManager; class G4CsvFileManager; class G4CsvNtupleFileManager; +template +class G4ThreadLocalSingleton; class G4CsvAnalysisManager : public G4ToolsAnalysisManager { + friend class G4ThreadLocalSingleton; + public: - explicit G4CsvAnalysisManager(G4bool isMaster = true); ~G4CsvAnalysisManager(); - - // static methods + + // Static methods static G4CsvAnalysisManager* Instance(); static G4bool IsInstance(); @@ -61,40 +66,31 @@ class G4CsvAnalysisManager : public G4ToolsAnalysisManager std::vector::iterator EndNtuple(); std::vector::const_iterator BeginConstNtuple() const; std::vector::const_iterator EndConstNtuple() const; - + // Csv format specific option void SetIsCommentedHeader(G4bool isCommentedHeader); void SetIsHippoHeader(G4bool isHippoHeader); protected: - // virtual methods from base class + // Virtual methods from base class virtual G4bool OpenFileImpl(const G4String& fileName) final; virtual G4bool WriteImpl() final; - virtual G4bool CloseFileImpl(G4bool reset) final; + virtual G4bool CloseFileImpl(G4bool reset) final; + virtual G4bool ResetImpl() final; virtual G4bool IsOpenFileImpl() const final; private: - // static data members + G4CsvAnalysisManager(); + + // Static data members // - static G4CsvAnalysisManager* fgMasterInstance; - static G4ThreadLocal G4CsvAnalysisManager* fgInstance; - - // methods - // - template - G4bool WriteT(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType); - G4bool WriteH1(); - G4bool WriteH2(); - G4bool WriteH3(); - G4bool WriteP1(); - G4bool WriteP2(); - G4bool Reset(); - - // data members - std::shared_ptr fFileManager; - std::shared_ptr fNtupleFileManager; + inline static G4CsvAnalysisManager* fgMasterInstance { nullptr }; + inline static G4ThreadLocal G4bool fgIsInstance { false }; + static constexpr std::string_view fkClass { "G4CsvAnalysisManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; + std::shared_ptr fNtupleFileManager { nullptr }; }; #include "G4CsvAnalysisManager.icc" diff --git a/source/analysis/csv/include/G4CsvAnalysisManager.icc b/source/analysis/csv/include/G4CsvAnalysisManager.icc index 228d4e1ac3..e5b6a9b09b 100644 --- a/source/analysis/csv/include/G4CsvAnalysisManager.icc +++ b/source/analysis/csv/include/G4CsvAnalysisManager.icc @@ -27,128 +27,6 @@ #include "G4CsvNtupleManager.hh" #include "G4CsvNtupleFileManager.hh" #include "G4CsvFileManager.hh" -#include "G4AnalysisUtilities.hh" - -#include "tools/wcsv_histo" - -//_____________________________________________________________________________ -template <> -inline -G4bool G4CsvAnalysisManager::WriteT(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType) -{ - for ( G4int i=0; iGetActivation(); - auto name = info->GetName(); - // skip writing if activation is enabled and H1 is inactivated - if ( fState.GetIsActivation() && ( ! activation ) ) continue; - auto ht = htVector[i]; - auto fileName = fFileManager->GetHnFileName(hnType, name); - std::ofstream hnFile(fileName); - - // Do nothing if there is no file - if ( ! hnFile.is_open() ) return false; - - auto result - = tools::wcsv::pto(hnFile, ht->s_cls(), *ht); - - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "saving " << hnType << " " << name << " failed"; - G4Exception("G4CsvAnalysisManager::Write()", - "Analysis_W022", JustWarning, description); - return false; - } - hnFile.close(); -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1()->Message("write", "file", fileName); -#endif - } - - return true; -} - -//_____________________________________________________________________________ -template <> -inline -G4bool G4CsvAnalysisManager::WriteT(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType) -{ - for ( G4int i=0; iGetActivation(); - auto name = info->GetName(); - // skip writing if activation is enabled and H1 is inactivated - if ( fState.GetIsActivation() && ( ! activation ) ) continue; - auto ht = htVector[i]; - auto fileName = fFileManager->GetHnFileName(hnType, name); - std::ofstream hnFile(fileName); - - // Do nothing if there is no file - if ( ! hnFile.is_open() ) return false; - - auto result - = tools::wcsv::pto(hnFile, ht->s_cls(), *ht); - - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "saving " << hnType << " " << name << " failed"; - G4Exception("G4CsvAnalysisManager::Write()", - "Analysis_W022", JustWarning, description); - return false; - } - hnFile.close(); -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1()->Message("write", "file", fileName); -#endif - } - - return true; -} - -//_____________________________________________________________________________ -template -inline -G4bool G4CsvAnalysisManager::WriteT(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType) -{ - for ( G4int i=0; iGetActivation(); - auto name = info->GetName(); - // skip writing if activation is enabled and H1 is inactivated - if ( fState.GetIsActivation() && ( ! activation ) ) continue; - auto ht = htVector[i]; - auto fileName = fFileManager->GetHnFileName(hnType, name); - std::ofstream hnFile(fileName); - - // Do nothing if there is no file - if ( ! hnFile.is_open() ) return false; - - auto result - = tools::wcsv::hto(hnFile, ht->s_cls(), *ht); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "saving " << hnType << " " << name << " failed"; - G4Exception("G4CsvAnalysisManager::Write()", - "Analysis_W022", JustWarning, description); - return false; - } - hnFile.close(); -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1()->Message("write", "file", fileName); -#endif - } - - return true; -} //_____________________________________________________________________________ inline @@ -162,55 +40,55 @@ inline tools::wcsv::ntuple* G4CsvAnalysisManager::GetNtuple() const { return fNtupleFileManager->GetNtupleManager()->GetNtuple(); -} +} //_____________________________________________________________________________ inline tools::wcsv::ntuple* G4CsvAnalysisManager::GetNtuple(G4int ntupleId) const { return fNtupleFileManager->GetNtupleManager()->GetNtuple(ntupleId); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4CsvAnalysisManager::BeginNtuple() { return fNtupleFileManager->GetNtupleManager()->BeginNtuple(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4CsvAnalysisManager::EndNtuple() { return fNtupleFileManager->GetNtupleManager()->EndNtuple(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4CsvAnalysisManager::BeginConstNtuple() const { return fNtupleFileManager->GetNtupleManager()->BeginConstNtuple(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4CsvAnalysisManager::EndConstNtuple() const { return fNtupleFileManager->GetNtupleManager()->EndConstNtuple(); -} +} //_____________________________________________________________________________ inline void G4CsvAnalysisManager::SetIsCommentedHeader(G4bool isCommentedHeader) { fNtupleFileManager->GetNtupleManager()->SetIsCommentedHeader(isCommentedHeader); -} +} //_____________________________________________________________________________ inline void G4CsvAnalysisManager::SetIsHippoHeader(G4bool isHippoHeader) { fNtupleFileManager->GetNtupleManager()->SetIsHippoHeader(isHippoHeader); -} +} diff --git a/source/analysis/csv/include/G4CsvAnalysisReader.hh b/source/analysis/csv/include/G4CsvAnalysisReader.hh index 3db2631af4..44cd4b9f3e 100644 --- a/source/analysis/csv/include/G4CsvAnalysisReader.hh +++ b/source/analysis/csv/include/G4CsvAnalysisReader.hh @@ -25,7 +25,7 @@ // // The main manager for Csv analysis reader. -// It delegates most of functions to the object specific managers. +// It delegates most of functions to the object specific managers. // Author: Ivana Hrivnacova, 05/09/2014 (ivana@ipno.in2p3.fr) @@ -35,66 +35,51 @@ #include "G4ToolsAnalysisReader.hh" #include "globals.hh" -#include "tools/histo/h1d" -#include "tools/histo/h2d" -#include "tools/histo/h3d" -#include "tools/histo/p1d" -#include "tools/histo/p2d" #include "tools/rcsv_ntuple" -class G4H1ToolsManager; -class G4H2ToolsManager; -class G4H3ToolsManager; -class G4P1ToolsManager; -class G4P2ToolsManager; +#include +#include + +class G4CsvAnalysisReader; class G4CsvRNtupleManager; class G4CsvRFileManager; - +template +class G4ThreadLocalSingleton; + class G4CsvAnalysisReader : public G4ToolsAnalysisReader { + friend class G4ThreadLocalSingleton; + public: - explicit G4CsvAnalysisReader(G4bool isMaster = true); virtual ~G4CsvAnalysisReader(); - - // static methods + + // Static methods static G4CsvAnalysisReader* Instance(); // Access methods tools::rcsv::ntuple* GetNtuple() const; tools::rcsv::ntuple* GetNtuple(G4int ntupleId) const; using G4VAnalysisReader::GetNtuple; - + protected: - // virtual methods from base class - virtual G4int ReadH1Impl(const G4String& h1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadH2Impl(const G4String& h2Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadH3Impl(const G4String& h3Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadP1Impl(const G4String& p1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadP2Impl(const G4String& p2Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadNtupleImpl(const G4String& ntupleName, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; + // Virtual methods from base class + virtual G4bool CloseFilesImpl(G4bool reset) final; private: - // static data members - static G4CsvAnalysisReader* fgMasterInstance; - static G4ThreadLocal G4CsvAnalysisReader* fgInstance; + G4CsvAnalysisReader(); - // methods - G4String GetHnFileName(const G4String& hnType, - const G4String& hnName, - const G4String& baseFileName, - G4bool isUserFileName) const; - + // Static data members + inline static G4CsvAnalysisReader* fgMasterInstance { nullptr }; + + // Methods G4bool Reset(); - // data members - G4CsvRNtupleManager* fNtupleManager; - G4CsvRFileManager* fFileManager; + // Static data members + static constexpr std::string_view fkClass { "G4CsvAnalysisReader" }; + + // Data members + std::shared_ptr fNtupleManager { nullptr }; + std::shared_ptr fFileManager { nullptr }; }; #include "G4CsvAnalysisReader.icc" diff --git a/source/analysis/csv/include/G4CsvAnalysisReader.icc b/source/analysis/csv/include/G4CsvAnalysisReader.icc index 7fac576002..f801c670b5 100644 --- a/source/analysis/csv/include/G4CsvAnalysisReader.icc +++ b/source/analysis/csv/include/G4CsvAnalysisReader.icc @@ -28,15 +28,16 @@ #include "G4CsvRNtupleManager.hh" +//_____________________________________________________________________________ inline tools::rcsv::ntuple* G4CsvAnalysisReader::GetNtuple() const { return fNtupleManager->GetNtuple(); -} +} //_____________________________________________________________________________ inline tools::rcsv::ntuple* G4CsvAnalysisReader::GetNtuple(G4int ntupleId) const { return fNtupleManager->GetNtuple(ntupleId); -} +} diff --git a/source/analysis/csv/include/G4CsvFileManager.hh b/source/analysis/csv/include/G4CsvFileManager.hh index ebc0e946ec..73d882de6b 100644 --- a/source/analysis/csv/include/G4CsvFileManager.hh +++ b/source/analysis/csv/include/G4CsvFileManager.hh @@ -37,6 +37,8 @@ #include "tools/wcsv_ntuple" +#include + // Type aliases using CsvNtupleDescription = G4TNtupleDescription; @@ -44,8 +46,9 @@ class G4CsvFileManager : public G4VTFileManager { public: explicit G4CsvFileManager(const G4AnalysisManagerState& state); - ~G4CsvFileManager(); - + G4CsvFileManager() = delete; + ~G4CsvFileManager() = default; + using G4BaseFileManager::GetNtupleFileName; using G4VTFileManager::WriteFile; using G4VTFileManager::CloseFile; @@ -53,21 +56,42 @@ class G4CsvFileManager : public G4VTFileManager // Methods to manipulate output files virtual G4bool OpenFile(const G4String& fileName) final; + virtual G4bool SetHistoDirectoryName(const G4String& dirName) final; + virtual G4bool SetNtupleDirectoryName(const G4String& dirName) final; + virtual G4String GetFileType() const final { return "csv"; } // Specific methods for files per objects G4bool CreateNtupleFile(CsvNtupleDescription* ntupleDescription); - G4bool CloseNtupleFile(CsvNtupleDescription* ntupleDescription); + G4bool CloseNtupleFile(CsvNtupleDescription* ntupleDescription); + + G4bool IsHistoDirectory() const; + G4bool IsNtupleDirectory() const; protected: // Methods derived from templated base class virtual std::shared_ptr CreateFileImpl(const G4String& fileName) final; virtual G4bool WriteFileImpl(std::shared_ptr file) final; - virtual G4bool CloseFileImpl(std::shared_ptr file) final; + virtual G4bool CloseFileImpl(std::shared_ptr file) final; private: // Utility method - G4String GetNtupleFileName(CsvNtupleDescription* ntupleDescription); + G4String GetNtupleFileName(CsvNtupleDescription* ntupleDescription); + + // Static data members + static constexpr std::string_view fkClass { "G4CsvFileManager" }; + + // Data members + G4bool fIsHistoDirectory { false }; + G4bool fIsNtupleDirectory { false }; }; +// inline functions + +inline G4bool G4CsvFileManager::IsHistoDirectory() const +{ return fIsHistoDirectory; } + +inline G4bool G4CsvFileManager::IsNtupleDirectory() const +{ return fIsNtupleDirectory; } + #endif diff --git a/source/analysis/csv/include/G4CsvHnFileManager.hh b/source/analysis/csv/include/G4CsvHnFileManager.hh index de3aaa9e39..91e9586a01 100644 --- a/source/analysis/csv/include/G4CsvHnFileManager.hh +++ b/source/analysis/csv/include/G4CsvHnFileManager.hh @@ -33,6 +33,8 @@ #include "G4VTHnFileManager.hh" +#include + class G4CsvFileManager; template @@ -40,9 +42,10 @@ class G4CsvHnFileManager : public G4VTHnFileManager { public: - G4CsvHnFileManager(G4CsvFileManager* fileManger) + explicit G4CsvHnFileManager(G4CsvFileManager* fileManger) : G4VTHnFileManager(), fFileManager(fileManger) {} - virtual ~G4CsvHnFileManager() {} + G4CsvHnFileManager() = delete; + virtual ~G4CsvHnFileManager() = default; // Methods for writing objects virtual G4bool WriteExtra(HT* ht, const G4String& htName, const G4String& fileName) final; @@ -52,7 +55,10 @@ class G4CsvHnFileManager : public G4VTHnFileManager private: // Methods G4bool Write(std::ofstream& hnfile, HT* ht); - + + // Static data members + static constexpr std::string_view fkClass { "G4CsvHnFileManager" }; + // Data members G4CsvFileManager* fFileManager; }; diff --git a/source/analysis/csv/include/G4CsvHnFileManager.icc b/source/analysis/csv/include/G4CsvHnFileManager.icc index e815e87d0a..ef0909415e 100644 --- a/source/analysis/csv/include/G4CsvHnFileManager.icc +++ b/source/analysis/csv/include/G4CsvHnFileManager.icc @@ -35,8 +35,6 @@ #include "tools/histo/p1d" #include "tools/histo/p2d" -#include - //_____________________________________________________________________________ template <> inline @@ -79,12 +77,11 @@ G4bool G4CsvHnFileManager::WriteExtra( auto result = Write(hnFile, ht); if ( ! result ) { - G4ExceptionDescription description; - description << " " << "saving " << G4Analysis::GetHnType() << " " << htName << " failed"; - G4Exception("G4CsvAnalysisManager::WriteExtra()", - "Analysis_W022", JustWarning, description); - return false; - } + G4Analysis::Warn( + "Saving " + G4Analysis::GetHnType() + " " + htName + " failed", + fkClass, "WriteExtra"); + return false; + } hnFile.close(); return true; } @@ -107,14 +104,19 @@ G4bool G4CsvHnFileManager::Write( // If histogram file name was not defined per object // a file should be created from the provided default file name auto hnFileName = fFileManager->GetHnFileName(G4Analysis::GetHnType(), htName); + + // If histo directory name is set and if this directory exists + // add directory path to hnFileName + if ( fFileManager->IsHistoDirectory() ) { + hnFileName = "./" + fFileManager->GetHistoDirectoryName() + "/" + hnFileName; + } + if ( ! hnFileName.empty() ) { hnFile = fFileManager->CreateTFile(hnFileName); } + if ( ! hnFile ) { - G4ExceptionDescription description; - description << "Failed to get Csv file " << fileName; - G4Exception("G4CsvHnFileManager::Write()", - "Analysis_W022", JustWarning, description); + G4Analysis::Warn("Failed to get Csv file " + fileName, fkClass, "Write"); return false; } else { fileName = hnFileName; diff --git a/source/analysis/csv/include/G4CsvHnRFileManager.hh b/source/analysis/csv/include/G4CsvHnRFileManager.hh new file mode 100644 index 0000000000..4d62441d7a --- /dev/null +++ b/source/analysis/csv/include/G4CsvHnRFileManager.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +// The manager class for histogram/profile reading from a Csv file. + +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) + +#ifndef G4CsvHnRFileManager_h +#define G4CsvHnRFileManager_h 1 + +#include "G4VTHnRFileManager.hh" + +#include + +class G4CsvRFileManager; + +template +class G4CsvHnRFileManager : public G4VTHnRFileManager +{ + public: + explicit G4CsvHnRFileManager(G4CsvRFileManager* rfileManger) + : G4VTHnRFileManager(), fRFileManager(rfileManger) {} + G4CsvHnRFileManager() = delete; + virtual ~G4CsvHnRFileManager() = default; + + // Methods for writing objects + virtual HT* Read(const G4String& htName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; + + private: + // Methods + G4String GetHnFileName(const G4String& hnType, const G4String& hnName, + const G4String& baseFileName, G4bool isUserFileName) const; + HT* ReadT(std::istream& hnFile, const G4String& fileName, + std::string_view inFunction); + + // Static data members + static constexpr std::string_view fkClass { "G4CsvHnRFileManager" }; + // Data members + G4CsvRFileManager* fRFileManager; +}; + +// inline functions + +#include "G4CsvHnRFileManager.icc" + +#endif diff --git a/source/analysis/csv/include/G4CsvHnRFileManager.icc b/source/analysis/csv/include/G4CsvHnRFileManager.icc new file mode 100644 index 0000000000..da697eb63e --- /dev/null +++ b/source/analysis/csv/include/G4CsvHnRFileManager.icc @@ -0,0 +1,98 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) + +#include "G4AnalysisUtilities.hh" + +#include "tools/rcsv_histo" + +//_____________________________________________________________________________ +template +inline +G4String G4CsvHnRFileManager::GetHnFileName( + const G4String& hnType, const G4String& hnName, + const G4String& fileName, G4bool isUserFileName) const +{ + if ( isUserFileName ) { + return fRFileManager->GetFullFileName(fileName); + } + else { + return fRFileManager->GetHnFileName(hnType, hnName); + } +} + +//_____________________________________________________________________________ +template +inline +HT* G4CsvHnRFileManager::ReadT( + std::istream& htFile, const G4String& fileName, std::string_view inFunction) +{ + tools::rcsv::histo handler(htFile); + std::string objectTypeInFile; + void* object; + auto verbose = false; + if ( ! handler.read(G4cout, objectTypeInFile, object, verbose) ) { + G4Analysis::Warn( + "Cannot get " + G4Analysis::GetHnType() + " in file " + fileName, + fkClass, inFunction); + return nullptr; + } + if ( objectTypeInFile.compare(HT::s_class()) != 0 ) { + G4Analysis::Warn( + "Object type read in " + G4Analysis::GetHnType() +" does not match", + fkClass, inFunction); + return nullptr; + } + + return static_cast(object); +} + +//_____________________________________________________________________________ +template +inline +HT* G4CsvHnRFileManager::Read( + const G4String& htName, const G4String& fileName, const G4String& dirName, + G4bool isUserFileName) +{ + // Get file name + auto htFileName = + GetHnFileName(G4Analysis::GetHnType(), htName, fileName, isUserFileName); + + // Update directory path + if ( ! dirName.empty() ) { + htFileName = "./" + dirName + "/" + htFileName; + } + + std::ifstream htFile(htFileName); + if ( ! htFile.is_open() ) { + G4Analysis::Warn("Cannot open file " + htFileName, fkClass, "Read"); + return nullptr; + } + + auto ht = ReadT(htFile, htFileName, "Read"); + return ht; +} diff --git a/source/analysis/csv/include/G4CsvNtupleFileManager.hh b/source/analysis/csv/include/G4CsvNtupleFileManager.hh index ea0aa5e42b..b25cfcf1d3 100644 --- a/source/analysis/csv/include/G4CsvNtupleFileManager.hh +++ b/source/analysis/csv/include/G4CsvNtupleFileManager.hh @@ -34,6 +34,8 @@ #include "G4VNtupleFileManager.hh" #include "globals.hh" +#include + class G4CsvFileManager; class G4CsvNtupleManager; class G4VNtupleManager; @@ -45,7 +47,8 @@ class G4CsvNtupleFileManager : public G4VNtupleFileManager public: explicit G4CsvNtupleFileManager(const G4AnalysisManagerState& state); - ~G4CsvNtupleFileManager(); + G4CsvNtupleFileManager() = delete; + virtual ~G4CsvNtupleFileManager() = default; virtual std::shared_ptr CreateNtupleManager() override; @@ -53,19 +56,22 @@ class G4CsvNtupleFileManager : public G4VNtupleFileManager virtual G4bool ActionAtOpenFile(const G4String& fileName) override; virtual G4bool ActionAtWrite() override; virtual G4bool ActionAtCloseFile(G4bool reset) override; - virtual G4bool Reset() override; + virtual G4bool Reset() override; void SetFileManager(std::shared_ptr fileManager); std::shared_ptr GetNtupleManager() const; private: - // methods + // Methods G4bool CloseNtupleFiles(); - // data members - std::shared_ptr fFileManager; - std::shared_ptr fNtupleManager; + // Static data members + static constexpr std::string_view fkClass { "G4CsvNtupleFileManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; + std::shared_ptr fNtupleManager { nullptr }; }; // inline functions diff --git a/source/analysis/csv/include/G4CsvNtupleManager.hh b/source/analysis/csv/include/G4CsvNtupleManager.hh index 1f743b31cf..c537bb9ec5 100644 --- a/source/analysis/csv/include/G4CsvNtupleManager.hh +++ b/source/analysis/csv/include/G4CsvNtupleManager.hh @@ -37,21 +37,23 @@ #include "tools/wcsv_ntuple" #include +#include // Types alias using CsvNtupleDescription = G4TNtupleDescription; class G4CsvFileManager; -class G4CsvNtupleManager : public G4TNtupleManager +class G4CsvNtupleManager : public G4TNtupleManager { friend class G4CsvAnalysisManager; friend class G4CsvNtupleFileManager; public: explicit G4CsvNtupleManager(const G4AnalysisManagerState& state); - ~G4CsvNtupleManager(); + G4CsvNtupleManager() = delete; + virtual ~G4CsvNtupleManager() = default; private: // Functions specific to the output type @@ -64,7 +66,7 @@ class G4CsvNtupleManager : public G4TNtupleManager fFileManager; - G4bool fIsCommentedHeader; - G4bool fIsHippoHeader; + std::shared_ptr fFileManager { nullptr }; + G4bool fIsCommentedHeader { true }; + G4bool fIsHippoHeader { false }; }; // inline functions -inline void +inline void G4CsvNtupleManager::SetFileManager(std::shared_ptr fileManager) { fFileManager = fileManager; } -inline const std::vector*>& +inline const std::vector*>& G4CsvNtupleManager::GetNtupleDescriptionVector() const { return fNtupleDescriptionVector; } diff --git a/source/analysis/csv/include/G4CsvRFileManager.hh b/source/analysis/csv/include/G4CsvRFileManager.hh index d2780a7775..968bca0a5b 100644 --- a/source/analysis/csv/include/G4CsvRFileManager.hh +++ b/source/analysis/csv/include/G4CsvRFileManager.hh @@ -31,29 +31,37 @@ #ifndef G4CsvRFileManager_h #define G4CsvRFileManager_h 1 -#include "G4BaseFileManager.hh" +#include "G4VRFileManager.hh" #include "globals.hh" #include #include +#include class G4AnalysisManagerState; -class G4CsvRFileManager : public G4BaseFileManager +class G4CsvRFileManager : public G4VRFileManager { public: explicit G4CsvRFileManager(const G4AnalysisManagerState& state); + G4CsvRFileManager() = delete; ~G4CsvRFileManager(); virtual G4String GetFileType() const final { return "csv"; } + // Methods from base class + virtual void CloseFiles() final {} + // Methods to manipulate input files virtual G4bool OpenRFile(const G4String& fileName); // Specific methods for files per objects std::ifstream* GetRFile(const G4String& fileName) const; - + private: + // Static data members + static constexpr std::string_view fkClass { "G4CsvRFileManager" }; + // data members std::map fRFiles; }; diff --git a/source/analysis/csv/include/G4CsvRNtupleManager.hh b/source/analysis/csv/include/G4CsvRNtupleManager.hh index 83a5ed1b2b..d3e3dfab46 100644 --- a/source/analysis/csv/include/G4CsvRNtupleManager.hh +++ b/source/analysis/csv/include/G4CsvRNtupleManager.hh @@ -37,19 +37,38 @@ #include "tools/rcsv_ntuple" +#include + +class G4CsvRFileManager; + class G4CsvRNtupleManager : public G4TRNtupleManager { friend class G4CsvAnalysisReader; - protected: + public: explicit G4CsvRNtupleManager(const G4AnalysisManagerState& state); - virtual ~G4CsvRNtupleManager(); - + G4CsvRNtupleManager() = delete; + virtual ~G4CsvRNtupleManager() = default; + private: - // Methods from the templated base class - // + // Set methods + void SetFileManager(std::shared_ptr fileManager); + + // Methods from the base class + virtual G4int ReadNtupleImpl(const G4String& ntupleName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; virtual G4bool GetTNtupleRow(G4TRNtupleDescription* ntupleDescription) final; -}; + + // Static data members + static constexpr std::string_view fkClass { "G4CsvRNtupleManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; +}; + +inline void +G4CsvRNtupleManager::SetFileManager(std::shared_ptr fileManager) +{ fFileManager = fileManager; } #endif diff --git a/source/analysis/csv/include/g4csv_defs.hh b/source/analysis/csv/include/g4csv_defs.hh index e6fad70b8c..a0f7075287 100644 --- a/source/analysis/csv/include/g4csv_defs.hh +++ b/source/analysis/csv/include/g4csv_defs.hh @@ -30,20 +30,10 @@ #define g4csv_defs_h #include "tools/wcsv_ntuple" -#include "G4CsvAnalysisManager.hh" -#include "G4CsvAnalysisReader.hh" #include "g4hntools_defs.hh" -namespace G4Csv -{ - // Ntuple types - using G4Ntuple = tools::wcsv::ntuple; - using G4NtupleIterator = std::vector::iterator; - using G4NtupleConstIterator = std::vector::const_iterator; - - // Managers - using G4AnalysisManager = G4CsvAnalysisManager; - using G4AnalysisReader = G4CsvAnalysisReader; -} +// Csv output specific types +using G4CsvNtuple = tools::wcsv::ntuple; +using G4CsvRNtuple = tools::wcsv::ntuple; #endif diff --git a/source/analysis/csv/sources.cmake b/source/analysis/csv/sources.cmake index 3f543f16e3..56b9f3fd46 100644 --- a/source/analysis/csv/sources.cmake +++ b/source/analysis/csv/sources.cmake @@ -10,12 +10,13 @@ geant4_add_module(G4csv G4CsvFileManager.hh G4CsvHnFileManager.hh G4CsvHnFileManager.icc + G4CsvHnRFileManager.hh + G4CsvHnRFileManager.icc G4CsvNtupleFileManager.hh G4CsvNtupleManager.hh G4CsvRFileManager.hh G4CsvRNtupleManager.hh g4csv_defs.hh - g4csv.hh SOURCES G4CsvAnalysisManager.cc G4CsvAnalysisReader.cc diff --git a/source/analysis/csv/src/G4CsvAnalysisManager.cc b/source/analysis/csv/src/G4CsvAnalysisManager.cc index 4cdffdb7d3..b598eb052c 100644 --- a/source/analysis/csv/src/G4CsvAnalysisManager.cc +++ b/source/analysis/csv/src/G4CsvAnalysisManager.cc @@ -29,66 +29,33 @@ #include "G4CsvAnalysisManager.hh" #include "G4CsvFileManager.hh" #include "G4CsvNtupleFileManager.hh" -#include "G4AnalysisVerbose.hh" #include "G4AnalysisManagerState.hh" +#include "G4AnalysisUtilities.hh" #include "G4UnitsTable.hh" +#include "G4ThreadLocalSingleton.hh" #include "G4Threading.hh" -#include "G4AutoLock.hh" -#include - -// mutex in a file scope - -namespace { - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH1Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH2Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH3Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging P1 profiles - G4Mutex mergeP1Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging P2 profiles - G4Mutex mergeP2Mutex = G4MUTEX_INITIALIZER; -} - -G4CsvAnalysisManager* G4CsvAnalysisManager::fgMasterInstance = nullptr; -G4ThreadLocal G4CsvAnalysisManager* G4CsvAnalysisManager::fgInstance = nullptr; +using namespace G4Analysis; //_____________________________________________________________________________ G4CsvAnalysisManager* G4CsvAnalysisManager::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4CsvAnalysisManager(isMaster); - } - - return fgInstance; + static G4ThreadLocalSingleton instance; + fgIsInstance = true; + return instance.Instance(); } //_____________________________________________________________________________ G4bool G4CsvAnalysisManager::IsInstance() { - return ( fgInstance != 0 ); -} + return fgIsInstance; +} //_____________________________________________________________________________ -G4CsvAnalysisManager::G4CsvAnalysisManager(G4bool isMaster) - : G4ToolsAnalysisManager("Csv", isMaster), - fFileManager(nullptr), - fNtupleFileManager(nullptr) +G4CsvAnalysisManager::G4CsvAnalysisManager() + : G4ToolsAnalysisManager("Csv") { - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description << " " - << "G4CsvAnalysisManager already exists." - << "Cannot create another instance."; - G4Exception("G4CsvAnalysisManager::G4CsvAnalysisManager()", - "Analysis_F001", FatalException, description); - } - - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; // File Manager fFileManager = std::make_shared(fState); @@ -102,151 +69,15 @@ G4CsvAnalysisManager::G4CsvAnalysisManager(G4bool isMaster) //_____________________________________________________________________________ G4CsvAnalysisManager::~G4CsvAnalysisManager() -{ +{ if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; - fgInstance = nullptr; + fgIsInstance = false; } -// -// private methods +// +// protected methods // -//_____________________________________________________________________________ -G4bool G4CsvAnalysisManager::WriteH1() -{ - auto h1Vector = fH1Manager->GetH1Vector(); - auto hnVector = fH1Manager->GetHnVector(); - - if ( ! h1Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(h1Vector, hnVector, "h1"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH1(&mergeH1Mutex); - fgMasterInstance->fH1Manager->AddH1Vector(h1Vector); - lH1.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4CsvAnalysisManager::WriteH2() -{ - auto h2Vector = fH2Manager->GetH2Vector(); - auto hnVector = fH2Manager->GetHnVector(); - - if ( ! h2Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(h2Vector, hnVector, "h2"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH2(&mergeH2Mutex); - fgMasterInstance->fH2Manager->AddH2Vector(h2Vector); - lH2.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4CsvAnalysisManager::WriteH3() -{ - auto h3Vector = fH3Manager->GetH3Vector(); - auto hnVector = fH3Manager->GetHnVector(); - - if ( ! h3Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(h3Vector, hnVector, "h3"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH3(&mergeH3Mutex); - fgMasterInstance->fH3Manager->AddH3Vector(h3Vector); - lH3.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4CsvAnalysisManager::WriteP1() -{ - auto p1Vector = fP1Manager->GetP1Vector(); - auto hnVector = fP1Manager->GetHnVector(); - - if ( ! p1Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(p1Vector, hnVector, "p1"); - } - else { - // The worker manager just adds its profiles to the master - // This operation needs a lock - G4AutoLock lP1(&mergeP1Mutex); - fgMasterInstance->fP1Manager->AddP1Vector(p1Vector); - lP1.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4CsvAnalysisManager::WriteP2() -{ - auto p2Vector = fP2Manager->GetP2Vector(); - auto hnVector = fP2Manager->GetHnVector(); - - if ( ! p2Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(p2Vector, hnVector, "p2"); - } - else { - // The worker manager just adds its profiles to the master - // This operation needs a lock - G4AutoLock lP2(&mergeP2Mutex); - fgMasterInstance->fP2Manager->AddP2Vector(p2Vector); - lP2.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4CsvAnalysisManager::Reset() -{ -// Reset histograms and ntuple - - auto finalResult = true; - - auto result = G4ToolsAnalysisManager::Reset(); - finalResult = finalResult && result; - - result = fNtupleFileManager->Reset(); - finalResult = finalResult && result; - - return finalResult; -} - //_____________________________________________________________________________ G4bool G4CsvAnalysisManager::OpenFileImpl(const G4String& fileName) { @@ -254,80 +85,43 @@ G4bool G4CsvAnalysisManager::OpenFileImpl(const G4String& fileName) // and set it to base class which takes then their ownership SetNtupleManager(fNtupleFileManager->CreateNtupleManager()); - auto finalResult = true; + auto result = true; // Save file name in file manager - auto result = fFileManager->OpenFile(fileName); - finalResult = finalResult && result; + result &= fFileManager->OpenFile(fileName); // Open ntuple files and create ntuples from bookings - result = fNtupleFileManager->ActionAtOpenFile(fFileManager->GetFullFileName()); - finalResult = finalResult && result; + result &= fNtupleFileManager->ActionAtOpenFile(fFileManager->GetFullFileName()); - return finalResult; + return result; } //_____________________________________________________________________________ -G4bool G4CsvAnalysisManager::WriteImpl() +G4bool G4CsvAnalysisManager::WriteImpl() { // nothing to be done for Csv file - auto finalResult = true; - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("write", "files", ""); + auto result = true; + + Message(kVL4, "write", "files"); + + if ( G4Threading::IsWorkerThread() ) { + result &= G4ToolsAnalysisManager::Merge(); } -#endif - - - if ( ! fgMasterInstance && - ( ( ! fH1Manager->IsEmpty() ) || ( ! fH2Manager->IsEmpty() ) || - ( ! fH3Manager->IsEmpty() ) || ( ! fP1Manager->IsEmpty() ) || - ( ! fP2Manager->IsEmpty() ) ) ) { - - G4ExceptionDescription description; - description - << " " << "No master G4CsvAnalysisManager instance exists." - << G4endl - << " " << "Histogram data will not be merged."; - G4Exception("G4CsvAnalysisManager::Write()", - "Analysis_W031", JustWarning, description); + else { + // Write all histograms/profile on master + result &= G4ToolsAnalysisManager::WriteImpl(); } - // H1 - auto result = WriteH1(); - finalResult = finalResult && result; - - // H2 - result = WriteH2(); - finalResult = finalResult && result; - - // H3 - result = WriteH3(); - finalResult = finalResult && result; - - // P1 - result = WriteP1(); - finalResult = finalResult && result; - - // P2 - result = WriteP2(); - finalResult = finalResult && result; - // Ntuples // Nothing to be done // Write ASCII if activated - // Not available + // Not available //if ( IsAscii() ) { - // result = WriteAscii(); - //} + // result &= WriteAscii(); + //} -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("write", "files", "", finalResult); - } -#endif + Message(kVL3, "write", "files", "", result); return result; } @@ -335,29 +129,38 @@ G4bool G4CsvAnalysisManager::WriteImpl() //_____________________________________________________________________________ G4bool G4CsvAnalysisManager::CloseFileImpl(G4bool reset) { - auto finalResult = true; + auto result = true; // close open files - auto result = fFileManager->CloseFiles(); - finalResult = finalResult && result; - + result &= fFileManager->CloseFiles(); + // Histogram and profile files are created/closed indivudually for each - // object in WriteHn{Pn] function - - result = fNtupleFileManager->ActionAtCloseFile(reset); - finalResult = finalResult && result; + // object in WriteT function + + result &= fNtupleFileManager->ActionAtCloseFile(reset); // Reset data if ( reset ) { result = Reset(); if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Resetting data failed"; - G4Exception("G4CsvAnalysisManager::CloseFile()", - "Analysis_W021", JustWarning, description); + Warn("Resetting data failed", fkClass, "CloseFileImpl"); } } - finalResult = finalResult && result; - return finalResult; -} + return result; +} + +//_____________________________________________________________________________ +G4bool G4CsvAnalysisManager::ResetImpl() +{ +// Reset histograms and ntuple + + auto result = true; + + result &= G4ToolsAnalysisManager::ResetImpl(); + if ( fNtupleFileManager != nullptr ) { + result &= fNtupleFileManager->Reset(); + } + + return result; +} diff --git a/source/analysis/csv/src/G4CsvAnalysisReader.cc b/source/analysis/csv/src/G4CsvAnalysisReader.cc index a5124a5b21..9b598d491d 100644 --- a/source/analysis/csv/src/G4CsvAnalysisReader.cc +++ b/source/analysis/csv/src/G4CsvAnalysisReader.cc @@ -29,98 +29,29 @@ #include "G4CsvAnalysisReader.hh" #include "G4CsvRFileManager.hh" #include "G4CsvRNtupleManager.hh" -#include "G4AnalysisVerbose.hh" -#include "G4AnalysisUtilities.hh" +#include "G4ThreadLocalSingleton.hh" #include "G4Threading.hh" -#include -#include - -#include -#include - using namespace G4Analysis; -G4CsvAnalysisReader* G4CsvAnalysisReader::fgMasterInstance = nullptr; -G4ThreadLocal G4CsvAnalysisReader* G4CsvAnalysisReader::fgInstance = nullptr; - -// -// utility functions -// - -namespace { - -//_____________________________________________________________________________ -void* ReadObject(std::istream& hnFile, - const G4String& objectType, - const G4String& fileName, - const G4String& inFunction) -{ - tools::rcsv::histo handler(hnFile); - std::string objectTypeInFile; - void* object; - auto verbose = false; - if ( ! handler.read(G4cout, objectTypeInFile, object, verbose) ) { - G4ExceptionDescription description; - description - << " " - << "Cannot get "<< objectType << " in file " << fileName; - G4String inFunctionFull = "G4CsvAnalysisReader::"; - inFunctionFull.append(inFunction); - G4Exception(inFunctionFull, "Analysis_WR011", JustWarning, description); - return nullptr; - } - if ( objectTypeInFile != objectType ) { - G4ExceptionDescription description; - description - << " " - << "Object type read in "<< fileName - << " does not match" << G4endl; - G4String inFunctionFull = "G4CsvAnalysisReader::"; - inFunctionFull.append(inFunction); - G4Exception(inFunctionFull, "Analysis_WR011", JustWarning, description); - return nullptr; - } - - return object; -} - -} - //_____________________________________________________________________________ G4CsvAnalysisReader* G4CsvAnalysisReader::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4CsvAnalysisReader(isMaster); - } - - return fgInstance; -} + static G4ThreadLocalSingleton instance; + return instance.Instance(); +} //_____________________________________________________________________________ -G4CsvAnalysisReader::G4CsvAnalysisReader(G4bool isMaster) - : G4ToolsAnalysisReader("Csv", isMaster), - fNtupleManager(nullptr), - fFileManager(nullptr) +G4CsvAnalysisReader::G4CsvAnalysisReader() + : G4ToolsAnalysisReader("Csv") { - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description - << " " - << "G4CsvAnalysisReader already exists." - << "Cannot create another instance."; - G4Exception("G4CsvAnalysisReader::G4CsvAnalysisReader()", - "Analysis_F001", FatalException, description); - } - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; // Create managers - fNtupleManager = new G4CsvRNtupleManager(fState); - fFileManager = new G4CsvRFileManager(fState); - // The managers will be deleted by the base class - + fNtupleManager = std::make_shared(fState); + fFileManager = std::make_shared(fState); + fNtupleManager->SetFileManager(fFileManager); + // Set managers to base class SetNtupleManager(fNtupleManager); SetFileManager(fFileManager); @@ -130,290 +61,43 @@ G4CsvAnalysisReader::G4CsvAnalysisReader(G4bool isMaster) G4CsvAnalysisReader::~G4CsvAnalysisReader() { if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; - fgInstance = nullptr; } -// +// // private methods // -//_____________________________________________________________________________ -G4String G4CsvAnalysisReader::GetHnFileName( - const G4String& hnType, - const G4String& hnName, - const G4String& fileName, - G4bool isUserFileName) const -{ - if ( isUserFileName ) { - return fFileManager->GetFullFileName(fileName); - } - else { - return fFileManager->GetHnFileName(hnType, hnName); - } -} - //_____________________________________________________________________________ G4bool G4CsvAnalysisReader::Reset() { // Reset histograms and ntuple - auto finalResult = true; - - auto result = G4ToolsAnalysisReader::Reset(); - finalResult = finalResult && result; - - result = fNtupleManager->Reset(); - finalResult = finalResult && result; - - return finalResult; -} - -// + auto result = true; + + result &= G4ToolsAnalysisReader::Reset(); + result &= fNtupleManager->Reset(); + + return result; +} + +// // protected methods // //_____________________________________________________________________________ -G4int G4CsvAnalysisReader::ReadH1Impl(const G4String& h1Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool isUserFileName) +G4bool G4CsvAnalysisReader::CloseFilesImpl(G4bool reset) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("get", "h1", h1Name); -#endif + Message(kVL4, "close", "files"); - // open file - auto h1FileName = GetHnFileName("h1", h1Name, fileName, isUserFileName); - std::ifstream hnFile(h1FileName); - if ( ! hnFile.is_open() ) { - G4ExceptionDescription description; - description << " " << "Cannot open file " << h1FileName; - G4Exception("G4CsvAnalysisReader::ReadH1Impl()", - "Analysis_WR001", JustWarning, description); - return kInvalidId; + auto result = true; + + if (reset) { + result &= Reset(); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("open", "read file", h1FileName); -#endif - void* object - = ReadObject(hnFile, tools::histo::h1d::s_class(), h1FileName, "ReadH1Impl"); - if ( ! object ) return kInvalidId; - - auto h1 = static_cast(object); - auto id = fH1Manager->AddH1(h1Name, h1); + fFileManager->CloseFiles(); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h1", h1Name, id > kInvalidId); -#endif - - return id; -} + Message(kVL2, "close", "files", "", result); -//_____________________________________________________________________________ -G4int G4CsvAnalysisReader::ReadH2Impl(const G4String& h2Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool isUserFileName) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h2", h2Name); -#endif - - // open file - auto h2FileName = GetHnFileName("h2", h2Name, fileName, isUserFileName); - std::ifstream hnFile(h2FileName); - if ( ! hnFile.is_open() ) { - G4ExceptionDescription description; - description << " " << "Cannot open file " << h2FileName; - G4Exception("G4CsvAnalysisReader::ReadH2Impl()", - "Analysis_WR001", JustWarning, description); - return kInvalidId; - } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("open", "read file", h2FileName); -#endif - - void* object - = ReadObject(hnFile, tools::histo::h2d::s_class(), h2FileName, "ReadH2Impl"); - if ( ! object ) return kInvalidId; - - auto h2 = static_cast(object); - auto id = fH2Manager->AddH2(h2Name, h2); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h2", h2Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4CsvAnalysisReader::ReadH3Impl(const G4String& h3Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool isUserFileName) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h3", h3Name); -#endif - - // open file - auto h3FileName = GetHnFileName("h3", h3Name, fileName, isUserFileName); - std::ifstream hnFile(h3FileName); - if ( ! hnFile.is_open() ) { - G4ExceptionDescription description; - description << " " << "Cannot open file " << h3FileName; - G4Exception("G4CsvAnalysisReader::ReadH3Impl()", - "Analysis_WR001", JustWarning, description); - return kInvalidId; - } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("open", "read file", h3FileName); -#endif - - void* object - = ReadObject(hnFile, tools::histo::h3d::s_class(), h3FileName, "ReadH3Impl"); - if ( ! object ) return kInvalidId; - - auto h3 = static_cast(object); - auto id = fH3Manager->AddH3(h3Name, h3); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h3", h3Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4CsvAnalysisReader::ReadP1Impl(const G4String& p1Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool isUserFileName) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "p1", p1Name); -#endif - - // open file - G4String p1FileName = GetHnFileName("p1", p1Name, fileName, isUserFileName); - std::ifstream hnFile(p1FileName); - if ( ! hnFile.is_open() ) { - G4ExceptionDescription description; - description << " " << "Cannot open file " << p1FileName; - G4Exception("G4CsvAnalysisReader::ReadP1Impl()", - "Analysis_WR001", JustWarning, description); - return kInvalidId; - } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("open", "read file", p1FileName); -#endif - - void* object - = ReadObject(hnFile, tools::histo::p1d::s_class(), fileName, "ReadP1Impl"); - if ( ! object ) return kInvalidId; - - auto p1 = static_cast(object); - auto id = fP1Manager->AddP1(p1Name, p1); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "p1", p1Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4CsvAnalysisReader::ReadP2Impl(const G4String& p2Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool isUserFileName) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "p2", p2Name); -#endif - - // open file - G4String p2FileName = GetHnFileName("p2", p2Name, fileName, isUserFileName); - std::ifstream hnFile(p2FileName); - if ( ! hnFile.is_open() ) { - G4ExceptionDescription description; - description << " " << "Cannot open file " << p2FileName; - G4Exception("G4CsvAnalysisReader::ReadP2Impl()", - "Analysis_WR001", JustWarning, description); - return kInvalidId; - } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("open", "read file", p2FileName); -#endif - - void* object - = ReadObject(hnFile, tools::histo::p2d::s_class(), p2FileName, "ReadP2Impl"); - if ( ! object ) return kInvalidId; - - auto p2 = static_cast(object); - auto id = fP2Manager->AddP2(p2Name, p2); - - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "p2", p2Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4CsvAnalysisReader::ReadNtupleImpl(const G4String& ntupleName, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool isUserFileName) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "ntuple", ntupleName); -#endif - - // Ntuples are saved per object and per thread - // but apply the ntuple name and the thread suffixes - // only if fileName is not provided explicitly - G4String fullFileName = fileName; - if ( ! isUserFileName ) { - fullFileName = fFileManager->GetNtupleFileName(ntupleName); - } - - // Open file - if ( ! fFileManager->OpenRFile(fullFileName) ) return kInvalidId; - auto ntupleFile = fFileManager->GetRFile(fullFileName); - - // Create ntuple - auto rntuple = new tools::rcsv::ntuple(*ntupleFile); - auto id = fNtupleManager->SetNtuple(new G4TRNtupleDescription(rntuple)); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "ntuple", ntupleName, id > kInvalidId); -#endif - - return id; -} + return result; +} diff --git a/source/analysis/csv/src/G4CsvFileManager.cc b/source/analysis/csv/src/G4CsvFileManager.cc index 48f969d001..64037a3941 100644 --- a/source/analysis/csv/src/G4CsvFileManager.cc +++ b/source/analysis/csv/src/G4CsvFileManager.cc @@ -30,6 +30,7 @@ #include "G4CsvHnFileManager.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" +#include "G4Filesystem.hh" using namespace G4Analysis; using namespace tools; @@ -43,14 +44,10 @@ G4CsvFileManager::G4CsvFileManager(const G4AnalysisManagerState& state) fH2FileManager = std::make_shared>(this); fH3FileManager = std::make_shared>(this); fP1FileManager = std::make_shared>(this); - fP2FileManager = std::make_shared>(this); + fP2FileManager = std::make_shared>(this); } -//_____________________________________________________________________________ -G4CsvFileManager::~G4CsvFileManager() -{} - -// +// // private methods // @@ -66,10 +63,15 @@ G4String G4CsvFileManager::GetNtupleFileName(CsvNtupleDescription* ntupleDescrip // compose ntuple file name from the default file name ntupleFileName = GetNtupleFileName(ntupleDescription->fNtupleBooking.name()); } - return ntupleFileName; -} -// + if ( IsNtupleDirectory() ) { + ntupleFileName = "./" + GetNtupleDirectoryName() + "/" + ntupleFileName; + } + + return ntupleFileName; +} + +// // protected methods // @@ -78,11 +80,7 @@ std::shared_ptr G4CsvFileManager::CreateFileImpl(const G4String& { std::shared_ptr file = std::make_shared(fileName); if ( file->fail() ) { - file = nullptr; - G4ExceptionDescription description; - description << " " << "Cannot create file " << fileName; - G4Exception("G4CsvFileManager::CreateFileImpl()", - "Analysis_W001", JustWarning, description); + Warn("Cannot create file " + fileName, fkClass, "CreateFileImpl"); return nullptr; } @@ -93,21 +91,21 @@ std::shared_ptr G4CsvFileManager::CreateFileImpl(const G4String& G4bool G4CsvFileManager::WriteFileImpl(std::shared_ptr /*file*/) { // Nothing to be done here - return true; + return true; } //_____________________________________________________________________________ -G4bool G4CsvFileManager::CloseFileImpl(std::shared_ptr file) +G4bool G4CsvFileManager::CloseFileImpl(std::shared_ptr file) { if ( ! file ) return false; // close file - file->close(); + file->close(); return true; } -// +// // public methods // @@ -118,10 +116,40 @@ G4bool G4CsvFileManager::OpenFile(const G4String& fileName) fFileName = fileName; fIsOpenFile = true; - + return true; -} - +} + +//_____________________________________________________________________________ +G4bool G4CsvFileManager::SetHistoDirectoryName(const G4String& dirName) +{ + // A directory is taken into account only if it exists in file system + if ( G4fs::is_directory(dirName.data()) ) { + fIsHistoDirectory = G4VFileManager::SetHistoDirectoryName(dirName); + return fIsHistoDirectory; + } + + G4Analysis::Warn("Directory " + dirName + " does not exists.\n" + "Histograms will be written in the current directory.", + fkClass, "SetHistoDirectoryName"); + return false; +} + +//_____________________________________________________________________________ +G4bool G4CsvFileManager::SetNtupleDirectoryName(const G4String& dirName) +{ + // A directory is taken into account only if it exists in file system + if ( G4fs::is_directory(dirName.data()) ) { + fIsNtupleDirectory = G4VFileManager::SetNtupleDirectoryName(dirName); + return fIsNtupleDirectory; + } + + G4Analysis::Warn("Directory " + dirName + " does not exists.\n" + "Ntuples will be written in the current directory.", + fkClass, "SetNtupleDirectoryName"); + return false; +} + //_____________________________________________________________________________ G4bool G4CsvFileManager::CreateNtupleFile( CsvNtupleDescription* ntupleDescription) @@ -129,11 +157,7 @@ G4bool G4CsvFileManager::CreateNtupleFile( // get ntuple file name per object (if defined) auto ntupleFileName = GetNtupleFileName(ntupleDescription); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("create", "ntuple file", ntupleFileName); - } -#endif + Message(kVL4, "create", "ntuple file", ntupleFileName); // update file name if it is already in use while ( GetTFile(ntupleFileName, false) ) { @@ -142,23 +166,16 @@ G4bool G4CsvFileManager::CreateNtupleFile( auto newName = GetBaseName(oldName) + "_bis." + GetExtension(oldName); ntupleDescription->fFileName = newName; - G4ExceptionDescription description; - description - << "Ntuple filename " << oldName << " is already in use." << G4endl - << "It will be replaced with : " << newName; - G4Exception("G4CsvFileManager::CreateFileImpl()", - "Analysis_W001", JustWarning, description); + Warn("Ntuple filename " + oldName + " is already in use.\n" + + "It will be replaced with : " + newName, + fkClass, "CreateNtupleFile"); ntupleFileName = GetNtupleFileName(ntupleDescription); } ntupleDescription->fFile = CreateTFile(ntupleFileName); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("create", "ntuple file", ntupleFileName); - } -#endif + + Message(kVL2, "create", "ntuple file", ntupleFileName); return (ntupleDescription->fFile != nullptr); } @@ -170,32 +187,21 @@ G4bool G4CsvFileManager::CloseNtupleFile( // Do nothing if there is no file if ( ! ntupleDescription->fFile ) return true; - auto finalResult = true; + auto result = true; auto ntupleFileName = GetNtupleFileName(ntupleDescription); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4() ->Message("close", "ntuple file", ntupleFileName); - } -#endif + Message(kVL4, "close", "ntuple file", ntupleFileName); // close file - auto result = CloseTFile(ntupleFileName); - finalResult = result && finalResult; - + result &= CloseTFile(ntupleFileName); // Notify not empty file - result = SetIsEmpty(ntupleFileName, ! ntupleDescription->fHasFill); - finalResult = result && finalResult; + result &= SetIsEmpty(ntupleFileName, ! ntupleDescription->fHasFill); // Reset file info in ntuple description ntupleDescription->fFile.reset(); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("close", "ntuple file", ntupleFileName); - } -#endif + Message(kVL2, "close", "ntuple file", ntupleFileName); - return finalResult; + return result; } diff --git a/source/analysis/csv/src/G4CsvNtupleFileManager.cc b/source/analysis/csv/src/G4CsvNtupleFileManager.cc index dbe010d078..3a7e27e8f5 100644 --- a/source/analysis/csv/src/G4CsvNtupleFileManager.cc +++ b/source/analysis/csv/src/G4CsvNtupleFileManager.cc @@ -32,24 +32,14 @@ #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" -#include "G4Threading.hh" - -#include - using namespace G4Analysis; //_____________________________________________________________________________ G4CsvNtupleFileManager::G4CsvNtupleFileManager(const G4AnalysisManagerState& state) - : G4VNtupleFileManager(state, "csv"), - fFileManager(nullptr), - fNtupleManager(nullptr) + : G4VNtupleFileManager(state, "csv") {} -//_____________________________________________________________________________ -G4CsvNtupleFileManager::~G4CsvNtupleFileManager() -{} - -// +// // private methods // @@ -58,17 +48,16 @@ G4bool G4CsvNtupleFileManager::CloseNtupleFiles() { // Close ntuple files - auto finalResult = true; + auto result = true; auto ntupleVector = fNtupleManager->GetNtupleDescriptionVector(); for ( auto ntupleDescription : ntupleVector) { - auto result = fFileManager->CloseNtupleFile(ntupleDescription); - finalResult = finalResult && result; + result &= fFileManager->CloseNtupleFile(ntupleDescription); } - return finalResult; -} + return result; +} -// +// // public methods // @@ -79,7 +68,7 @@ std::shared_ptr G4CsvNtupleFileManager::CreateNtupleManager() fNtupleManager = std::make_shared(fState); fNtupleManager->SetFileManager(fFileManager); - + return fNtupleManager; } @@ -88,7 +77,7 @@ G4bool G4CsvNtupleFileManager::ActionAtOpenFile(const G4String& /*fileName*/) { // G4cout << "G4CsvNtupleFileManager::ActionAtOpenFile" << G4endl; - // Create ntuples if they are booked + // Create ntuples if they are booked // (The files will be created with creating ntuples) fNtupleManager->CreateNtuplesFromBooking( fBookingManager->GetNtupleBookingVector()); @@ -105,29 +94,24 @@ G4bool G4CsvNtupleFileManager::ActionAtWrite() //_____________________________________________________________________________ G4bool G4CsvNtupleFileManager::ActionAtCloseFile(G4bool reset) { - auto finalResult = true; + auto result = true; // close ntuple files - auto result = CloseNtupleFiles(); - finalResult = finalResult && result; + result &= CloseNtupleFiles(); if ( ! reset ) { - // The ntuples must be always reset when closing file) + // The ntuples must be always reset when closing file) result = Reset(); if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Resetting data failed"; - G4Exception("G4CsvNtupleFileManager::CloseFile()", - "Analysis_W021", JustWarning, description); + Warn("Resetting data failed", fkClass, "ActionAtCloseFile"); } - finalResult = finalResult && result; } - return finalResult; + return result; } //_____________________________________________________________________________ G4bool G4CsvNtupleFileManager::Reset() { - return fNtupleManager->Reset(true); + return fNtupleManager->Reset(); } diff --git a/source/analysis/csv/src/G4CsvNtupleManager.cc b/source/analysis/csv/src/G4CsvNtupleManager.cc index cd89194391..334b4b5409 100644 --- a/source/analysis/csv/src/G4CsvNtupleManager.cc +++ b/source/analysis/csv/src/G4CsvNtupleManager.cc @@ -31,29 +31,18 @@ #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" -#include "G4Threading.hh" - -#include - using namespace G4Analysis; -// +// // utility methods // //_____________________________________________________________________________ G4CsvNtupleManager::G4CsvNtupleManager(const G4AnalysisManagerState& state) - : G4TNtupleManager(state), - fFileManager(nullptr), - fIsCommentedHeader(true), - fIsHippoHeader(false) + : G4TNtupleManager(state) {} -//_____________________________________________________________________________ -G4CsvNtupleManager::~G4CsvNtupleManager() -{} - -// +// // private methods // @@ -87,20 +76,14 @@ void G4CsvNtupleManager::FinishTNtuple( // Return if creating ntuple failed if ( ! ntupleDescription->fNtuple ) { - G4ExceptionDescription description; - description << "Creating ntuple has failed. "; - G4Exception("G4CsvNtupleManager::FinishTNtuple()", - "Analysis_W022", JustWarning, description); + Warn("Creating ntuple has failed.", fkClass, "FinishTNtuple"); return; } // Write header if ntuple already exists if ( ! WriteHeader(ntupleDescription->fNtuple) ) { - G4ExceptionDescription description; - description << "Writing ntuple header has failed. "; - G4Exception("G4CsvNtupleManager::FinishTNtuple()", - "Analysis_W022", JustWarning, description); + Warn("Writing ntuple header has failed.", fkClass, "FinishTNtuple"); } } @@ -110,17 +93,17 @@ G4bool G4CsvNtupleManager::WriteHeader(tools::wcsv::ntuple* ntuple) const // Write header if ntuple already exists and if this option is activated. // When both Hippo and Commented headers are selected, only Commented // header, which reading is supported. -// Return false only if an error occurred. +// Return false only if an error occurred. if ( fIsCommentedHeader ) { return ntuple->write_commented_header(G4cout); } - + // write hippo header (if activated and if not commented header) if ( fIsHippoHeader ) { ntuple->write_hippo_header(); return true; } - + return true; } diff --git a/source/analysis/csv/src/G4CsvRFileManager.cc b/source/analysis/csv/src/G4CsvRFileManager.cc index 2c4087c895..e61ff50aa2 100644 --- a/source/analysis/csv/src/G4CsvRFileManager.cc +++ b/source/analysis/csv/src/G4CsvRFileManager.cc @@ -27,73 +27,71 @@ // Author: Ivana Hrivnacova, 21/10/2014 (ivana@ipno.in2p3.fr) #include "G4CsvRFileManager.hh" +#include "G4CsvHnRFileManager.hh" #include "G4AnalysisManagerState.hh" +#include "G4AnalysisUtilities.hh" + +using namespace G4Analysis; +using namespace tools; //_____________________________________________________________________________ G4CsvRFileManager::G4CsvRFileManager(const G4AnalysisManagerState& state) - : G4BaseFileManager(state), - fRFiles() + : G4VRFileManager(state) { + // Create helpers defined in the base class + fH1RFileManager = std::make_shared>(this); + fH2RFileManager = std::make_shared>(this); + fH3RFileManager = std::make_shared>(this); + fP1RFileManager = std::make_shared>(this); + fP2RFileManager = std::make_shared>(this); } //_____________________________________________________________________________ G4CsvRFileManager::~G4CsvRFileManager() -{ - for (G4int i=0; iMessage("open", "read analysis file", fileName); -#endif + Message(kVL4, "open", "read analysis file", fileName); // create new file - std::ifstream* newFile = new std::ifstream(fileName); + auto newFile = new std::ifstream(fileName); if ( ! newFile->is_open() ) { - G4ExceptionDescription description; - description << " " << "Cannot open file " << fileName; - G4Exception("G4CsvAnalysisReader::OpenRFile()", - "Analysis_WR001", JustWarning, description); + Warn("Cannot open file " + fileName, fkClass, "OpenRFile"); return false; } // add file in a map and delete the previous file if it exists - std::map::iterator it - = fRFiles.find(fileName); - if ( it != fRFiles.end() ) { + auto it = fRFiles.find(fileName); + if ( it != fRFiles.end() ) { delete it->second; it->second = newFile; } else { fRFiles[fileName] = newFile; - } + } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("open", "read analysis file", fileName); -#endif + Message(kVL1, "open", "read analysis file", fileName); return true; -} - +} + //_____________________________________________________________________________ std::ifstream* G4CsvRFileManager::GetRFile(const G4String& fileName) const -{ - std::map::const_iterator it - = fRFiles.find(fileName); +{ + auto it = fRFiles.find(fileName); if ( it != fRFiles.end() ) return it->second; else { return nullptr; - } + } } diff --git a/source/analysis/csv/src/G4CsvRNtupleManager.cc b/source/analysis/csv/src/G4CsvRNtupleManager.cc index d7117ecd29..13cc9cf484 100644 --- a/source/analysis/csv/src/G4CsvRNtupleManager.cc +++ b/source/analysis/csv/src/G4CsvRNtupleManager.cc @@ -27,21 +27,55 @@ // Author: Ivana Hrivnacova, 25/07/2014 (ivana@ipno.in2p3.fr) #include "G4CsvRNtupleManager.hh" +#include "G4CsvRFileManager.hh" #include "G4AnalysisManagerState.hh" +#include "G4AnalysisUtilities.hh" + +using namespace G4Analysis; //_____________________________________________________________________________ G4CsvRNtupleManager::G4CsvRNtupleManager(const G4AnalysisManagerState& state) : G4TRNtupleManager(state) {} -//_____________________________________________________________________________ -G4CsvRNtupleManager::~G4CsvRNtupleManager() -{} - -// +// // private methods // +//_____________________________________________________________________________ +G4int G4CsvRNtupleManager::ReadNtupleImpl(const G4String& ntupleName, + const G4String& fileName, + const G4String& dirName, + G4bool isUserFileName) +{ + Message(kVL4, "read", "ntuple", ntupleName); + + // Ntuples are saved per object and per thread + // but apply the ntuple name and the thread suffixes + // only if fileName is not provided explicitly + G4String fullFileName = fileName; + if ( ! isUserFileName ) { + fullFileName = fFileManager->GetNtupleFileName(ntupleName); + } + + // Update directory path + if ( ! dirName.empty() ) { + fullFileName = "./" + dirName + "/" + fullFileName; + } + + // Open file + if ( ! fFileManager->OpenRFile(fullFileName) ) return kInvalidId; + auto ntupleFile = fFileManager->GetRFile(fullFileName); + + // Create ntuple + auto rntuple = new tools::rcsv::ntuple(*ntupleFile); + auto id = SetNtuple(new G4TRNtupleDescription(rntuple)); + + Message(kVL2, "read", "ntuple", ntupleName, id > kInvalidId); + + return id; +} + //_____________________________________________________________________________ G4bool G4CsvRNtupleManager::GetTNtupleRow( G4TRNtupleDescription* ntupleDescription) @@ -52,12 +86,7 @@ G4bool G4CsvRNtupleManager::GetTNtupleRow( if ( ! isInitialized ) { auto ntupleBinding = ntupleDescription->fNtupleBinding; if ( ! ntuple->initialize(G4cout, *ntupleBinding) ) { - G4ExceptionDescription description; - description - << " " - << "Ntuple initialization failed !!"; - G4Exception("G4CsvRNtuple::GetNtupleRow()", - "Analysis_WR021", JustWarning, description); + Warn("Ntuple initialization failed !!", fkClass, "GetTNtupleRow"); return false; } ntupleDescription->fIsInitialized = true; @@ -67,15 +96,10 @@ G4bool G4CsvRNtupleManager::GetTNtupleRow( auto next = ntuple->next(); if ( next ) { if ( ! ntuple->get_row() ) { - G4ExceptionDescription description; - description - << " " - << "Ntuple get_row() failed !!"; - G4Exception("G4CsvRNtuple::GetTNtupleRow()", - "Analysis_WR021", JustWarning, description); + Warn("Ntuple get_row() failed !!", fkClass, "GetTNtupleRow"); return false; } - } + } return next; -} +} diff --git a/source/analysis/exception_classification.txt b/source/analysis/exception_classification.txt index fb4dd6eea1..05dcfa24cc 100644 --- a/source/analysis/exception_classification.txt +++ b/source/analysis/exception_classification.txt @@ -1,33 +1,7 @@ -Analysis_F001: Fatal exception when trying to create a singleton manager twice - -Analysis_F002: Fatal exception when selecting non-existing output type. - -Analysis_W001: Cannot create file or directory for output - -Analysis_W002: Cannot create an object for output - -Analysis_W011: Cannot manipulate an object which does not exist - -Analysis_W012: Cannot set an object name - -Analysis_W013: Cannot apply an attribute to an object - -Analysis_W014: Cannot access an attribute of an object - -Analysis_W021: Writing or closing a file has failed - -Analysis_W022: Writing an object on file has failed - -Analysis_W031: Merging data has failed - -Analysis_W041: Requested feature is not available with selected output. - -Analysis_W051: Selected output type is not supported. - -Analysis_WR001: Cannot open a file for reading - -Analysis_WR011: Cannot access an object in a file - -Analysis_WR021: Reading an object from a file has failed +Analysis_F001: Fatal exceptions: + When trying to create a singleton manager twice + When selecting non-existing output type. +Analysis_W001: Warnings: + All cases when a JustWarning exception is issued diff --git a/source/analysis/csv/include/g4csv.hh b/source/analysis/factory/include/G4AnalysisManager.hh similarity index 88% rename from source/analysis/csv/include/g4csv.hh rename to source/analysis/factory/include/G4AnalysisManager.hh index 09d210da42..43b63e6bd1 100644 --- a/source/analysis/csv/include/g4csv.hh +++ b/source/analysis/factory/include/G4AnalysisManager.hh @@ -24,13 +24,13 @@ // ******************************************************************** // -// Author: Ivana Hrivnacova, 15/06/2011 (ivana@ipno.in2p3.fr) +// Author: Ivana Hrivnacova, 21/09/2021 (ivana@ipno.in2p3.fr) -#ifndef g4csv_h -#define g4csv_h +#ifndef G4AnalysisManager_h +#define G4AnalysisManager_h -#include "g4csv_defs.hh" +#include "G4GenericAnalysisManager.hh" -using namespace G4Csv; +using G4AnalysisManager = G4GenericAnalysisManager; #endif diff --git a/source/analysis/factory/include/G4GenericAnalysisManager.hh b/source/analysis/factory/include/G4GenericAnalysisManager.hh index fe3884d4e2..b692b746ca 100644 --- a/source/analysis/factory/include/G4GenericAnalysisManager.hh +++ b/source/analysis/factory/include/G4GenericAnalysisManager.hh @@ -25,7 +25,7 @@ // // The main manager for Root analysis. -// It delegates most of functions to the object specific managers. +// It delegates most of functions to the object specific managers. // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) @@ -34,24 +34,28 @@ #include "G4ToolsAnalysisManager.hh" #include "G4THnManager.hh" -#include "G4Threading.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" #include +#include +class G4GenericAnalysisManager; class G4GenericFileManager; class G4HnInformation; class G4VNtupleFileManager; +template +class G4ThreadLocalSingleton; class G4GenericAnalysisManager : public G4ToolsAnalysisManager { friend class G4RootMpiAnalysisManager; + friend class G4ThreadLocalSingleton; public: - explicit G4GenericAnalysisManager(G4bool isMaster = true); virtual ~G4GenericAnalysisManager(); - - // static methods + + // Static methods static G4GenericAnalysisManager* Instance(); static G4bool IsInstance(); @@ -62,51 +66,53 @@ class G4GenericAnalysisManager : public G4ToolsAnalysisManager virtual void SetBasketSize(unsigned int basketSize) override; virtual void SetBasketEntries(unsigned int basketEntries) override; - // new functions - G4bool Merge(); - - // write in an extra file + // write in an extra file G4bool WriteH1(G4int id, const G4String& fileName); G4bool WriteH2(G4int id, const G4String& fileName); G4bool WriteH3(G4int id, const G4String& fileName); G4bool WriteP1(G4int id, const G4String& fileName); G4bool WriteP2(G4int id, const G4String& fileName); - // set default output type (backward compatibility) + // Set default output type (backward compatibility) // this type will be used for file names without extension void SetDefaultFileType(const G4String& value); G4String GetDefaultFileType() const; protected: - // virtual methods from base class + // Virtual methods from base class virtual G4bool OpenFileImpl(const G4String& fileName) override; virtual G4bool WriteImpl() final; - virtual G4bool CloseFileImpl(G4bool reset = true) override; + virtual G4bool CloseFileImpl(G4bool reset = true) override; + virtual G4bool ResetImpl() final; virtual G4bool IsOpenFileImpl() const final; - virtual G4bool Reset() final; + // File manager access + virtual std::shared_ptr GetFileManager(const G4String& fileName) final; + private: - // methods + G4GenericAnalysisManager(); + // Methods void CreateNtupleFileManager(const G4String& fileName); - // static data members - static G4GenericAnalysisManager* fgMasterInstance; - static G4ThreadLocal G4GenericAnalysisManager* fgInstance; + // Static data members + inline static G4GenericAnalysisManager* fgMasterInstance { nullptr }; + inline static G4ThreadLocal G4bool fgIsInstance { false }; + static constexpr std::string_view fkClass { "G4GenericAnalysisManager" }; - // data members - std::shared_ptr fFileManager; + // Data members + std::shared_ptr fFileManager { nullptr }; // add G4GenericNtupleManager // this class will be analogic to file managers but with ntuples - std::shared_ptr fNtupleFileManager; + std::shared_ptr fNtupleFileManager { nullptr }; - // data members - G4bool fIsNtupleMergingSet = false; - G4int fNofNtupleFiles = 0; - G4bool fMergeNtuples = false; - G4bool fNtupleRowWise = false; - G4bool fNtupleRowMode = true; - unsigned int fBasketSize = fgkDefaultBasketSize; - unsigned int fBasketEntries = fgkDefaultBasketEntries; + // Data members + G4bool fIsNtupleMergingSet { false }; + G4int fNofNtupleFiles { 0 }; + G4bool fMergeNtuples { false }; + G4bool fNtupleRowWise { false }; + G4bool fNtupleRowMode { true }; + unsigned int fBasketSize { G4Analysis::kDefaultBasketSize }; + unsigned int fBasketEntries { G4Analysis::kDefaultBasketEntries }; }; #include "G4GenericAnalysisManager.icc" diff --git a/source/analysis/factory/include/G4GenericAnalysisManager.icc b/source/analysis/factory/include/G4GenericAnalysisManager.icc index 55f01f4337..d2e9ea67a5 100644 --- a/source/analysis/factory/include/G4GenericAnalysisManager.icc +++ b/source/analysis/factory/include/G4GenericAnalysisManager.icc @@ -27,6 +27,13 @@ #include "G4GenericFileManager.hh" #include "G4AutoLock.hh" +//_____________________________________________________________________________ +inline std::shared_ptr G4GenericAnalysisManager::GetFileManager( + const G4String& fileName) +{ + return fFileManager->GetFileManager(fileName); +} + //_____________________________________________________________________________ inline void G4GenericAnalysisManager::SetNtupleMerging( G4bool mergeNtuples, G4int nofReducedNtupleFiles) diff --git a/source/analysis/factory/include/G4GenericFileManager.hh b/source/analysis/factory/include/G4GenericFileManager.hh index 3b56fe4231..ae23f66ce8 100644 --- a/source/analysis/factory/include/G4GenericFileManager.hh +++ b/source/analysis/factory/include/G4GenericFileManager.hh @@ -37,6 +37,7 @@ #include #include +#include class G4HnInformation; class G4VNtupleFileManager; @@ -52,7 +53,7 @@ class G4GenericFileManager : public G4VFileManager { public: explicit G4GenericFileManager(const G4AnalysisManagerState& state); - virtual ~G4GenericFileManager(); + virtual ~G4GenericFileManager() = default; // Method to manipulate a default file virtual G4bool OpenFile(const G4String& fileName) final; @@ -63,50 +64,58 @@ class G4GenericFileManager : public G4VFileManager virtual G4bool CloseFiles() final; virtual G4bool DeleteEmptyFiles() final; + // Clear all data + virtual void Clear() final; + // Methods applied to file per name virtual G4bool CreateFile(const G4String& fileName) final; virtual G4bool WriteFile(const G4String& fileName) final; virtual G4bool CloseFile(const G4String& fileName) final; virtual G4bool SetIsEmpty(const G4String& fileName, G4bool isEmpty) final; + virtual G4bool SetHistoDirectoryName(const G4String& dirName); + virtual G4bool SetNtupleDirectoryName(const G4String& dirName); + virtual G4String GetFileType() const final { return ""; } - // set default output type (backward compatibility) + // Set default output type (backward compatibility) // this type will be used for file names without extension void SetDefaultFileType(const G4String& value); G4String GetDefaultFileType() const; - template - G4bool WriteT(const std::vector& htVector, - const std::vector& hnVector); + // Get file manager for a specific output type + std::shared_ptr GetFileManager(const G4String& fileName); - template - G4bool WriteTExtra(const G4String& fileName, T* ht, const G4String& htName); + template + G4bool WriteTExtra(const G4String& fileName, HT* ht, const G4String& htName); - // methods + // Methods std::shared_ptr CreateNtupleFileManager(G4AnalysisOutput output); private: - // methods + // Methods void CreateFileManager(G4AnalysisOutput output); - std::shared_ptr GetFileManager(G4AnalysisOutput output) const; - std::shared_ptr GetFileManager(const G4String& fileName); + std::shared_ptr GetFileManager(G4AnalysisOutput output) const; - // constants - static const G4String fgkDefaultFileType; + // Static data members + static constexpr std::string_view fkClass { "G4GenericFileManager" }; + // inline static const G4String fgkDefaultFileType { "root" }; + // inline static const G4String fgkDefaultFileType { "undefined" }; - // data members + // Data members G4String fDefaultFileType; - std::shared_ptr fDefaultFileManager; - std::vector> fFileManagers; - - std::shared_ptr fCsvFileManager; + std::shared_ptr fDefaultFileManager { nullptr }; + std::vector> fFileManagers { + // Csv, Hdf5, Root, Xml + nullptr, nullptr, nullptr, nullptr + }; + std::shared_ptr fCsvFileManager { nullptr }; #ifdef TOOLS_USE_HDF5 - std::shared_ptr fHdf5FileManager; + std::shared_ptr fHdf5FileManager { nullptr }; #endif - std::shared_ptr fRootFileManager; - std::shared_ptr fXmlFileManager; - G4bool fHdf5Warn; + std::shared_ptr fRootFileManager { nullptr }; + std::shared_ptr fXmlFileManager { nullptr }; + G4bool fHdf5Warn { true }; }; #include "G4GenericFileManager.icc" diff --git a/source/analysis/factory/include/G4GenericFileManager.icc b/source/analysis/factory/include/G4GenericFileManager.icc index f111f9f9b5..de966cf8be 100644 --- a/source/analysis/factory/include/G4GenericFileManager.icc +++ b/source/analysis/factory/include/G4GenericFileManager.icc @@ -33,122 +33,26 @@ inline G4String G4GenericFileManager::GetDefaultFileType() const } //_____________________________________________________________________________ -template -inline -G4bool G4GenericFileManager::WriteT(const std::vector& htVector, - const std::vector& hnVector) -{ - auto finalResult = true; - - for ( G4int i=0; iGetActivation(); - // skip writing if activation is enabled and H1 is inactivated - if ( fState.GetIsActivation() && ( ! activation ) ) continue; - - auto name = info->GetName(); - auto ht = htVector[i]; - - auto fileName = info->GetFileName(); - - auto fileManager = fDefaultFileManager; - auto fileKind = "default"; - if ( fileName == "" ) { - fileName = fileManager->GetFileName(); - } else { - fileManager = GetFileManager(fileName); - fileKind = "extra"; - // skip writing if cannot get file manager (wrong file extension) - if ( ! fileManager ) { - if ( G4Analysis::GetExtension(fileName) != "hdf5" || fHdf5Warn ) { - G4ExceptionDescription description; - description - << "Cannot get file manager for " << fileKind << " file " << fileName << "." << G4endl - << "Writing " << G4Analysis::GetHnType() << " " << name - << " will be skipped."; - G4Exception("G4GenericFileManager::WriteT", - "Analysis_W022", JustWarning, description); - } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - G4ExceptionDescription description; - description << " " << name << " in the " << fileKind << " file " << fileName; - fState.GetVerboseL3() - ->Message("write", G4Analysis::GetHnType(), description, false); - } -#endif - continue; - } - } - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " " << name << " in the " << fileKind << " file " << fileName; - fState.GetVerboseL3() - ->Message("write", G4Analysis::GetHnType(), description); - } -#endif - - auto result = fileManager->GetHnFileManager()->Write(ht, name, fileName); - if ( ! result ) { - G4ExceptionDescription description; - description - << "Writing " << G4Analysis::GetHnType() << " " << name - << " to file " << fileName << " failed."; - G4Exception("G4GenericManager::WriteT()", - "Analysis_W022", JustWarning, description); - } - finalResult = result && finalResult; - - // notify that file has a written object - fileManager->SetIsEmpty(fileName, false); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - G4ExceptionDescription description; - description << " " << name << " in the " << fileKind << " file " << fileName; - fState.GetVerboseL3() - ->Message("write", G4Analysis::GetHnType(), description, finalResult); - } -#endif - } - - return finalResult; -} - -//_____________________________________________________________________________ -template -inline +template +inline G4bool G4GenericFileManager::WriteTExtra( - const G4String& fileName, T* ht, const G4String& htName) + const G4String& fileName, HT* ht, const G4String& htName) { - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description - << fileName << " with " << G4Analysis::GetHnType() << " " << htName; - fState.GetVerboseL4()->Message("write", "extra file", description); - } + Message(G4Analysis::kVL4, "write", "extra file", + fileName + " with " + G4Analysis::GetHnType() + " " + htName); std::shared_ptr fileManager = GetFileManager(fileName); if ( ! fileManager ) { - G4ExceptionDescription description; - description - << "Cannot get file manager for file " << fileName << "." << G4endl - << "Writing " << G4Analysis::GetHnType() << " " << htName - << " failed."; - G4Exception("G4GenericFileManager::WriteTExtra", - "Analysis_W022", JustWarning, description); + G4Analysis::Warn( + "Cannot get file manager for " + fileName + " .\n" + + "Writing " + G4Analysis::GetHnType() + " " + htName + " failed.", + fkClass, "WriteTExtra"); return false; } - auto result = fileManager->GetHnFileManager()->WriteExtra(ht, htName, fileName); + auto result = fileManager->GetHnFileManager()->WriteExtra(ht, htName, fileName); -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) { - fState.GetVerboseL1()->Message("write", "extra file", fileName, result); - } -#endif + Message(G4Analysis::kVL1, "write", "extra file", fileName, result); - return result; + return result; } diff --git a/source/analysis/factory/sources.cmake b/source/analysis/factory/sources.cmake index 150b9c3465..873bdbb9b4 100644 --- a/source/analysis/factory/sources.cmake +++ b/source/analysis/factory/sources.cmake @@ -8,14 +8,12 @@ endif() # Define the Geant4 Module. geant4_add_module(G4analysisfac PUBLIC_HEADERS - g4analysis.hh - g4analysis_defs.hh + G4AnalysisManager.hh G4GenericAnalysisManager.hh G4GenericAnalysisManager.icc G4GenericFileManager.hh G4GenericFileManager.icc SOURCES - g4analysis.cc G4GenericAnalysisManager.cc G4GenericFileManager.cc) diff --git a/source/analysis/factory/src/G4GenericAnalysisManager.cc b/source/analysis/factory/src/G4GenericAnalysisManager.cc index 54aa8d12aa..648e695855 100644 --- a/source/analysis/factory/src/G4GenericAnalysisManager.cc +++ b/source/analysis/factory/src/G4GenericAnalysisManager.cc @@ -28,85 +28,63 @@ #include "G4GenericAnalysisManager.hh" #include "G4GenericFileManager.hh" -#include "G4AnalysisVerbose.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" #include "G4NtupleBookingManager.hh" #include "G4VNtupleFileManager.hh" - -#include -#include +#include "G4ThreadLocalSingleton.hh" +#include "G4Exception.hh" using namespace G4Analysis; +using std::to_string; // mutex in a file scope namespace { -//Mutex to lock master manager when merging histograms -G4Mutex mergeHnMutex = G4MUTEX_INITIALIZER; - -void WriteHnException(const G4String& hnType, G4int id) +//_____________________________________________________________________________ +void WriteHnWarning(const G4String& hnType, G4int id, + std::string_view inClass, + std::string_view inFunction) { - G4String inFunction = "G4GenericAnalysisManager::Write" + hnType; - G4ExceptionDescription description; - description << "Failed to get " << hnType << " id " << id << G4endl; - G4Exception(inFunction, "Analysis_W022", JustWarning, description); + Warn("Failed to get " + hnType + " id " + to_string(id), inClass, inFunction); } } -G4GenericAnalysisManager* G4GenericAnalysisManager::fgMasterInstance = nullptr; -G4ThreadLocal G4GenericAnalysisManager* G4GenericAnalysisManager::fgInstance = nullptr; - //_____________________________________________________________________________ G4GenericAnalysisManager* G4GenericAnalysisManager::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4GenericAnalysisManager(isMaster); - } - - return fgInstance; -} + static G4ThreadLocalSingleton instance; + fgIsInstance = true; + return instance.Instance(); +} //_____________________________________________________________________________ G4bool G4GenericAnalysisManager::IsInstance() { - return ( fgInstance != nullptr ); -} + return fgIsInstance; +} //_____________________________________________________________________________ -G4GenericAnalysisManager::G4GenericAnalysisManager(G4bool isMaster) - : G4ToolsAnalysisManager("", isMaster), - fFileManager(nullptr), - fNtupleFileManager(nullptr) +G4GenericAnalysisManager::G4GenericAnalysisManager() + : G4ToolsAnalysisManager("") { - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description - << " " - << "G4GenericAnalysisManager already exists." - << "Cannot create another instance."; - G4Exception("G4GenericAnalysisManager::G4GenericAnalysisManager()", - "Analysis_F001", FatalException, description); - } - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; // File manager fFileManager = std::make_shared(fState); - SetFileManager(fFileManager); + SetFileManager(fFileManager); } //_____________________________________________________________________________ G4GenericAnalysisManager::~G4GenericAnalysisManager() { if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; - fgInstance = nullptr; + fgIsInstance = false; } -// +// // private methods // @@ -114,84 +92,70 @@ G4GenericAnalysisManager::~G4GenericAnalysisManager() void G4GenericAnalysisManager::CreateNtupleFileManager(const G4String& fileName) { if ( fNtupleFileManager ) { - G4ExceptionDescription description; - description - << " " - << "The ntuple file manager already exists."; - G4Exception("G4GenericAnalysisManager::CreateNtupleFileManager", - "Analysis_W002", JustWarning, description); + Warn("The ntuple file manager already exists.", + fkClass, "CreateNtupleFileManager"); return; } auto fileType = GetExtension(fileName); auto output = G4Analysis::GetOutput(fileType); if ( output == G4AnalysisOutput::kNone ) { - G4ExceptionDescription description; - description - << "The file type " << fileType << "is not supported."; - G4Exception("G4GenericAnalysisManager::CreateNtupleFileManager", - "Analysis_W051", JustWarning, description); + Warn("The file type " + fileType + "is not supported.", + fkClass, "CreateNtupleFileManager"); return; } // Set file type to booked ntuples fNtupleBookingManager->SetFileType(fileType); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("create", "ntuple file manager", fileType); - } -#endif + Message(kVL4, "create", "ntuple file manager", fileType); fNtupleFileManager = fFileManager->CreateNtupleFileManager(output); if (fNtupleFileManager) { fNtupleFileManager->SetBookingManager(fNtupleBookingManager); + + if ( fNtupleFileManager->IsNtupleMergingSupported() ) { + // set merginng + fNtupleFileManager->SetNtupleMerging(fMergeNtuples, fNofNtupleFiles); + fNtupleFileManager->SetNtupleRowWise(fNtupleRowWise, fNtupleRowMode); + fNtupleFileManager->SetBasketSize(fBasketSize); + fNtupleFileManager->SetBasketEntries(fBasketEntries); + } + else if ( fIsNtupleMergingSet && fMergeNtuples ) { + Warn("Ntuple merging is not available with " + fileType + " output.\n" + + "Setting is ignored.", + fkClass, "CreateNtupleFileManager"); + } } - if ( fNtupleFileManager->IsNtupleMergingSupported() ) { - // set merginng - fNtupleFileManager->SetNtupleMerging(fMergeNtuples, fNofNtupleFiles); - fNtupleFileManager->SetNtupleRowWise(fNtupleRowWise, fNtupleRowMode); - fNtupleFileManager->SetBasketSize(fBasketSize); - fNtupleFileManager->SetBasketEntries(fBasketEntries); - } - else if ( fIsNtupleMergingSet && fMergeNtuples ) { - G4ExceptionDescription description; - description - << " " << "Ntuple merging is not available with " - << fileType << " output." << G4endl - << " " << "Setting is ignored."; - G4Exception("G4GenericAnalysisManager::CreateNtupleFileManager", - "Analysis_W041", JustWarning, description); - } - -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("create", "ntuple file manager", fileType, true); - } -#endif + Message(kVL3, "create", "ntuple file manager", fileType); } -// +// // protected methods // //_____________________________________________________________________________ G4bool G4GenericAnalysisManager::OpenFileImpl(const G4String& fileName) { + Message(kVL4, "open", "file", fileName); + // Add file name extension, if missing auto fullFileName = fileName; if ( ! GetExtension(fileName).size() ) { - // G4cout << "File type is not defined, using default: " << fFileManager->GetDefaultFileType() << G4endl; + auto defaultFileType = fFileManager->GetDefaultFileType(); + // G4cout << "File type is not defined, using default: " << defaultFileType << G4endl; + if ( ! defaultFileType.size() ) { + G4Exception("G4GenericAnalysisManager::OpenFileImpl", "Analysis_F001", + FatalException, + G4String("Cannot open file \"" + fileName + "\".\n" + "Please, use a file name with an extension or define the default file type\n" + "via G4AnalysisManager::SetDefaultFileType()")); + } + fullFileName = fileName + "." + fFileManager->GetDefaultFileType(); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("open (generic)", "file", fileName); - } -#endif - // Create ntuple file manager if there are booked ntuples if (! fNtupleFileManager) { CreateNtupleFileManager(fullFileName); @@ -203,202 +167,106 @@ G4bool G4GenericAnalysisManager::OpenFileImpl(const G4String& fileName) SetNtupleManager(fNtupleFileManager->CreateNtupleManager()); } - auto finalResult = true; + auto result = true; // Open file for histograms/profiles - auto result = fFileManager->OpenFile(fullFileName); - finalResult = finalResult && result; + result &= fFileManager->OpenFile(fullFileName); // Open ntuple file(s) and create ntuples from bookings if (fNtupleFileManager) { - result = fNtupleFileManager->ActionAtOpenFile(fullFileName); - finalResult = finalResult && result; + result &= fNtupleFileManager->ActionAtOpenFile(fullFileName); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("open (generic)", "file", fileName, finalResult); - } -#endif - return finalResult; + Message(kVL3, "open", "file", fileName); + + return result; } - + //_____________________________________________________________________________ -G4bool G4GenericAnalysisManager::WriteImpl() +G4bool G4GenericAnalysisManager::WriteImpl() { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("write (generic)", "files", ""); - } -#endif + Message(kVL4, "write", "files"); - auto finalResult = true; auto result = true; - - if ( ! fgMasterInstance && - ( ( ! fH1Manager->IsEmpty() ) || ( ! fH2Manager->IsEmpty() ) || - ( ! fH3Manager->IsEmpty() ) || ( ! fP1Manager->IsEmpty() ) || - ( ! fP2Manager->IsEmpty() ) ) ) { - G4ExceptionDescription description; - description - << " " << "No master G4GenericAnalysisManager instance exists." - << G4endl - << " " << "Histogram/profile data will not be merged."; - G4Exception("G4GenericAnalysisManager::Write()", - "Analysis_W031", JustWarning, description); - } - if ( G4Threading::IsWorkerThread() ) { - result = Merge(); - finalResult = finalResult && result; + result &= G4ToolsAnalysisManager::Merge(); } else { - // GO ON - // Open all files registered with objects fFileManager->OpenFiles(); // Write all histograms/profile on master - // - result = fFileManager->WriteT(fH1Manager->GetH1Vector(), fH1Manager->GetHnVector()); - finalResult = finalResult && result; - - result = fFileManager->WriteT(fH2Manager->GetH2Vector(), fH2Manager->GetHnVector()); - finalResult = finalResult && result; - - result = fFileManager->WriteT(fH3Manager->GetH3Vector(), fH3Manager->GetHnVector()); - finalResult = finalResult && result; - - result = fFileManager->WriteT(fP1Manager->GetP1Vector(), fP1Manager->GetHnVector()); - finalResult = finalResult && result; - - result = fFileManager->WriteT(fP2Manager->GetP2Vector(), fP2Manager->GetHnVector()); - finalResult = finalResult && result; + result &= G4ToolsAnalysisManager::WriteImpl(); } // Ntuples if (fNtupleFileManager) { - result = fNtupleFileManager->ActionAtWrite(); - finalResult = finalResult && result; + result &= fNtupleFileManager->ActionAtWrite(); } // File - result = fFileManager->WriteFiles(); - finalResult = finalResult && result; + result &= fFileManager->WriteFiles(); // Write ASCII if activated if ( IsAscii() ) { - result = WriteAscii(fFileManager->GetFileName()); - finalResult = finalResult && result; + result &= WriteAscii(fFileManager->GetFileName()); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("write (generic)", "files", "", finalResult); - } -#endif + Message(kVL3, "write", "files", "", result); - return finalResult; + return result; } //_____________________________________________________________________________ G4bool G4GenericAnalysisManager::CloseFileImpl(G4bool reset) { - auto finalResult = true; - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("close (generic)", "files", ""); - } -#endif + Message(kVL4, "close", "files"); + auto result = true; if (fNtupleFileManager) { - auto result = fNtupleFileManager->ActionAtCloseFile(reset); - finalResult = finalResult && result; + result &= fNtupleFileManager->ActionAtCloseFile(reset); } // close file - auto result = fFileManager->CloseFiles(); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Closing files failed"; - G4Exception("G4GenericAnalysisManager::CloseFile()", - "Analysis_W021", JustWarning, description); + if ( ! fFileManager->CloseFiles() ) { + Warn("Closing files failed", fkClass, "CloseFileImpl"); + result = false; } - finalResult = finalResult && result; // delete empty files - result = fFileManager->DeleteEmptyFiles(); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Deleting empty files failed"; - G4Exception("G4GenericAnalysisManager::CloseFile()", - "Analysis_W021", JustWarning, description); + if ( ! fFileManager->DeleteEmptyFiles() ) { + Warn("Deleting empty files failed", fkClass, "CloseFileImpl"); + result = false; } - finalResult = finalResult && result; if ( reset ) { - result = Reset(); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Resetting data failed"; - G4Exception("G4GenericAnalysisManager::CloseFile()", - "Analysis_W021", JustWarning, description); + if ( ! Reset() ) { + Warn("Resetting data failed", fkClass, "CloseFileImpl"); + result = false; } } - finalResult = finalResult && result; -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("close (generic)", "files", "", finalResult); - } -#endif + Message(kVL3, "close", "files", "", result); - return finalResult; + return result; } //_____________________________________________________________________________ -G4bool G4GenericAnalysisManager::Reset() +G4bool G4GenericAnalysisManager::ResetImpl() { // Reset histograms and ntuple - auto finalResult = true; + Message(kVL4, "reset", ""); - auto result = G4ToolsAnalysisManager::Reset(); - finalResult = finalResult && result; - - result = fNtupleFileManager->Reset(); - finalResult = result && finalResult; - - return finalResult; -} - -//_____________________________________________________________________________ -G4bool G4GenericAnalysisManager::Merge() -{ - // Nothing to be done on master - if ( ! G4Threading::IsWorkerThread() ) return false; - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("merge (generic) on worker", "histograms", ""); + auto result = true; + result &= G4ToolsAnalysisManager::ResetImpl(); + if ( fNtupleFileManager != nullptr ) { + result &= fNtupleFileManager->Reset(); } -#endif - // The worker manager just adds its histograms to the master - fH1Manager->Merge(mergeHnMutex, fgMasterInstance->fH1Manager); - fH2Manager->Merge(mergeHnMutex, fgMasterInstance->fH2Manager); - fH3Manager->Merge(mergeHnMutex, fgMasterInstance->fH3Manager); - fP1Manager->Merge(mergeHnMutex, fgMasterInstance->fP1Manager); - fP2Manager->Merge(mergeHnMutex, fgMasterInstance->fP2Manager); + Message(kVL3, "reset", "", "", result); -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("merge (generic) on worker", "histograms", "", true); - } -#endif - - return true; + return result; } //_____________________________________________________________________________ @@ -412,9 +280,9 @@ G4bool G4GenericAnalysisManager::WriteH1(G4int id, const G4String& fileName) auto h1d = GetH1(id, false); if ( ! h1d ) { - WriteHnException("H1", id); + WriteHnWarning("H1", id, fkClass, "WriteH1"); return false; - } + } auto h1Name = GetH1Name(id); return fFileManager->WriteTExtra(fileName, h1d, h1Name); @@ -431,9 +299,9 @@ G4bool G4GenericAnalysisManager::WriteH2(G4int id, const G4String& fileName) auto h2d = GetH2(id, false); if ( ! h2d ) { - WriteHnException("H2", id); + WriteHnWarning("H2", id, fkClass, "WriteH2"); return false; - } + } auto h2Name = GetH2Name(id); return fFileManager->WriteTExtra(fileName, h2d, h2Name); @@ -449,9 +317,9 @@ G4bool G4GenericAnalysisManager::WriteH3(G4int id, const G4String& fileName) auto h3d = GetH3(id, false); if ( ! h3d ) { - WriteHnException("H3", id); + WriteHnWarning("H3", id, fkClass, "WriteH3"); return false; - } + } auto h3Name = GetH3Name(id); return fFileManager->WriteTExtra(fileName, h3d, h3Name); @@ -468,9 +336,9 @@ G4bool G4GenericAnalysisManager::WriteP1(G4int id, const G4String& fileName) auto p1d = GetP1(id, false); if ( ! p1d ) { - WriteHnException("P1", id); + WriteHnWarning("P1", id, fkClass, "WriteP1"); return false; - } + } auto p1Name = GetP1Name(id); return fFileManager->WriteTExtra(fileName, p1d, p1Name); @@ -486,9 +354,9 @@ G4bool G4GenericAnalysisManager::WriteP2(G4int id, const G4String& fileName) auto p2d = GetP2(id, false); if ( ! p2d ) { - WriteHnException("P2", id); + WriteHnWarning("P2", id, fkClass, "WriteP2"); return false; - } + } auto p2Name = GetP2Name(id); return fFileManager->WriteTExtra(fileName, p2d, p2Name); diff --git a/source/analysis/factory/src/G4GenericFileManager.cc b/source/analysis/factory/src/G4GenericFileManager.cc index 4d8b2b53df..00c0d58d9b 100644 --- a/source/analysis/factory/src/G4GenericFileManager.cc +++ b/source/analysis/factory/src/G4GenericFileManager.cc @@ -40,52 +40,27 @@ #include "G4XmlFileManager.hh" #include "G4XmlNtupleFileManager.hh" -#include -#include - using namespace G4Analysis; namespace { -void FileManagerException(const G4String& fileName, const G4String& functionName, - const G4String& exceptionClassification, G4bool hdf5Warn = true) +//_____________________________________________________________________________ +void FileManagerWarning(const G4String& fileName, + std::string_view className, + std::string_view functionName, + G4bool hdf5Warn = true) { if ( GetExtension(fileName) == "hdf5" && ( ! hdf5Warn ) ) return; - G4String where = "G4GenericFileManager::" + functionName; - G4String what = "Analysis_" + exceptionClassification; - G4ExceptionDescription description; - description << "Cannot get file manager for " << fileName; - G4Exception(where, what, JustWarning, description); + Warn("Cannot get file manager for " + fileName, + className, functionName); } } -// static data -const G4String G4GenericFileManager::fgkDefaultFileType = "root"; - //_____________________________________________________________________________ G4GenericFileManager::G4GenericFileManager(const G4AnalysisManagerState& state) - : G4VFileManager(state), - fDefaultFileType(fgkDefaultFileType), - fDefaultFileManager(nullptr), - fFileManagers - { nullptr, // Csv - nullptr, // Hdf5 - nullptr, // Generic - nullptr // Xml - }, - fCsvFileManager(nullptr), -#ifdef TOOLS_USE_HDF5 - fHdf5FileManager(nullptr), -#endif - fRootFileManager(nullptr), - fXmlFileManager(nullptr), - fHdf5Warn(true) -{} - -//_____________________________________________________________________________ -G4GenericFileManager::~G4GenericFileManager() + : G4VFileManager(state) {} // @@ -95,20 +70,13 @@ G4GenericFileManager::~G4GenericFileManager() //_____________________________________________________________________________ void G4GenericFileManager::CreateFileManager(G4AnalysisOutput output) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("create", "file manager", GetOutputName(output)); - } -#endif + Message(kVL4, "create", "file manager", GetOutputName(output)); - auto outputId = static_cast(output); + auto outputId = static_cast(output); if ( fFileManagers[outputId] ) { - G4ExceptionDescription description; - description - << " " - << "The file manager of " << G4Analysis::GetOutputName(output) << " type already exists."; - G4Exception("G4GenericFileManager::CreateFileManager", - "Analysis_W002", JustWarning, description); + Warn("The file manager of " + G4Analysis::GetOutputName(output) + + " type already exists.", + fkClass, "CreateFileManager"); return; } @@ -118,16 +86,13 @@ void G4GenericFileManager::CreateFileManager(G4AnalysisOutput output) fCsvFileManager = std::make_shared(fState); fFileManagers[outputId] = fCsvFileManager; break; - case G4AnalysisOutput::kHdf5: + case G4AnalysisOutput::kHdf5: #ifdef TOOLS_USE_HDF5 fHdf5FileManager = std::make_shared(fState); fFileManagers[outputId] = fHdf5FileManager; #else if ( fHdf5Warn) { - G4ExceptionDescription description; - description << "Hdf5 type is not available."; - G4Exception("G4GenericFileManager::CreateFileManager", - "Analysis_W051", JustWarning, description); + Warn("Hdf5 type is not available.", fkClass, "CreateFileManager"); fHdf5Warn = false; } #endif @@ -141,30 +106,31 @@ void G4GenericFileManager::CreateFileManager(G4AnalysisOutput output) fFileManagers[outputId] = fXmlFileManager ; break; case G4AnalysisOutput::kNone: - G4ExceptionDescription description; - description - << G4Analysis::GetOutputName(output) << " type is not supported."; - G4Exception("G4GenericFileManager::CreateFileManager", - "Analysis_W051", JustWarning, description); - break; + Warn(G4Analysis::GetOutputName(output) + " type is not supported.", + fkClass, "CreateFileManager"); + return; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("create", "file manager", GetOutputName(output)); + // Pass directory names (only if set) + if ( ! GetHistoDirectoryName().empty() ) { + fFileManagers[outputId]->SetHistoDirectoryName(GetHistoDirectoryName()); } -#endif + if ( ! GetNtupleDirectoryName().empty() ) { + fFileManagers[outputId]->SetNtupleDirectoryName(GetNtupleDirectoryName()); + } + + Message(kVL3, "create", "file manager", GetOutputName(output)); } //_____________________________________________________________________________ -std::shared_ptr +std::shared_ptr G4GenericFileManager::GetFileManager(G4AnalysisOutput output) const { return fFileManagers[static_cast(output)]; } //_____________________________________________________________________________ -std::shared_ptr +std::shared_ptr G4GenericFileManager::GetFileManager(const G4String& fileName) { // Get file extension @@ -176,12 +142,8 @@ G4GenericFileManager::GetFileManager(const G4String& fileName) auto output = G4Analysis::GetOutput(extension); if ( output == G4AnalysisOutput::kNone ) { - G4ExceptionDescription description; - description - << " " - << "The file extension " << extension << "is not supported."; - G4Exception("G4GenericFileManager::GetFileManager", - "Analysis_W051", JustWarning, description); + Warn("The file extension " + extension + "is not supported.", + fkClass, "GetFileManager"); return nullptr; } @@ -207,45 +169,30 @@ G4bool G4GenericFileManager::OpenFile(const G4String& fileName) if ( fDefaultFileManager && (fDefaultFileManager != fileManager) ) { // Print warning if default output changed // (maybe be not needed?) - G4ExceptionDescription description; - description - << "Default file manager changed (old: " - << fDefaultFileManager->GetFileType() - << ", new:" << fileManager->GetFileType() << ")"; - G4Exception("G4GenericFileManager::OpenFile", - "Analysis_W001", JustWarning, description); - } - fDefaultFileManager = fileManager; - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("open", "analysis file", fileName); + Warn("Default file manager changed " + "(old: " +fDefaultFileManager->GetFileType() + + ", new:" + fileManager->GetFileType() + ")", + fkClass, "OpenFile"); } -#endif + fDefaultFileManager = fileManager; + fDefaultFileType = fileManager->GetFileType(); + + Message(kVL4, "open", "analysis file", fileName); - auto finalResult = true; auto result = true; - // Save the default file name + // Save the default file name // both in the generic file manager and the output specific one - result = SetFileName(fileName); - finalResult = finalResult && result; - result = fDefaultFileManager->SetFileName(fileName); - finalResult = finalResult && result; + result &= SetFileName(fileName); + result &= fDefaultFileManager->SetFileName(fileName); + result &= fDefaultFileManager->OpenFile(fileName); - result = fDefaultFileManager->OpenFile(fileName); - finalResult = finalResult && result; - -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) { - fState.GetVerboseL1()->Message("open", "analysis file", fileName, finalResult); - } -#endif - - fLockDirectoryNames = true; + LockDirectoryNames(); fIsOpenFile = true; - return finalResult; + Message(kVL1, "open", "analysis file", fileName, result); + + return result; } //_____________________________________________________________________________ @@ -253,70 +200,46 @@ G4bool G4GenericFileManager::OpenFiles() { // Open all files regeistered with objects -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("open", "analysis files", ""); - } -#endif + Message(kVL4, "open", "analysis files"); - auto finalResult = true; auto result = true; // process names registered in base file manager - for ( auto fileName : GetFileNames() ) { + for ( const auto& fileName : GetFileNames() ) { auto fileManager = GetFileManager(fileName); if ( ! fileManager ) { - FileManagerException(fileName, "OpenFiles", "W001", fHdf5Warn); + FileManagerWarning(fileName, fkClass, "OpenFiles", fHdf5Warn); continue; } - result = fileManager->CreateFile(fileName); - finalResult = result && finalResult; + result &= fileManager->CreateFile(fileName); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("open", "analysis files", "", finalResult); - } -#endif + Message(kVL3, "open", "analysis files", "", result); - return finalResult; + return result; } //_____________________________________________________________________________ G4bool G4GenericFileManager::WriteFiles() { -// Finish write for all files regeistered with objects +// Finish write for all files registered with objects -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("write", "files", ""); - } -#endif + Message(kVL4, "write", "analysis files"); - auto finalResult = true; auto result = true; - for ( auto fileManager : fFileManagers ) { + for ( const auto& fileManager : fFileManagers ) { if ( ! fileManager ) continue; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("write", fileManager->GetFileType(), "files"); - } -#endif + Message(kVL4, "write", fileManager->GetFileType(), "files"); - result = fileManager->WriteFiles(); - finalResult = result && finalResult; + result &= fileManager->WriteFiles(); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("write", "files", "", finalResult); - } -#endif + Message(kVL3, "write", "analysis files", "", result); - return finalResult; + return result; } //_____________________________________________________________________________ @@ -324,35 +247,21 @@ G4bool G4GenericFileManager::CloseFiles() { // Close all files regeistered with objects -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("close", "files", ""); - } -#endif + Message(kVL4, "close", "analysis files"); - auto finalResult = true; auto result = true; - for ( auto fileManager : fFileManagers ) { + for ( const auto& fileManager : fFileManagers ) { if ( ! fileManager ) continue; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("close", fileManager->GetFileType(), "files"); - } -#endif + Message(kVL4, "close", fileManager->GetFileType(), "files"); - result = fileManager->CloseFiles(); - finalResult = result && finalResult; + result &= fileManager->CloseFiles(); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("close", "files", "", finalResult); - } -#endif + Message(kVL3, "close", "analysis files", "", result); - return finalResult; + return result; } //_____________________________________________________________________________ @@ -360,35 +269,34 @@ G4bool G4GenericFileManager::DeleteEmptyFiles() { // Close all files regeistered with objects -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("delete", "empty files", ""); - } -#endif + Message(kVL4, "delete", "empty files"); - auto finalResult = true; auto result = true; - for ( auto fileManager : fFileManagers ) { + for ( const auto& fileManager : fFileManagers ) { if ( ! fileManager ) continue; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("delete", fileManager->GetFileType(), "files"); - } -#endif + Message(kVL4, "delete", fileManager->GetFileType(), "empty files"); - result = fileManager->DeleteEmptyFiles(); - finalResult = result && finalResult; + result &= fileManager->DeleteEmptyFiles(); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3()->Message("delete", "empty files", "", finalResult); - } -#endif + Message(kVL3, "delete", "empty files", "", result); - return finalResult; + return result; +} + +//_____________________________________________________________________________ +void G4GenericFileManager::Clear() +{ +// Clear files data + + for ( const auto& fileManager : fFileManagers ) { + if ( ! fileManager ) continue; + + fileManager->Clear(); + } + UnlockDirectoryNames(); } //_____________________________________________________________________________ @@ -398,7 +306,7 @@ G4bool G4GenericFileManager::CreateFile(const G4String& fileName) auto fileManager = GetFileManager(fileName); if ( ! fileManager ) { - FileManagerException(fileName, "CreateFile", "W001", fHdf5Warn); + FileManagerWarning(fileName, fkClass, "CreateFile", fHdf5Warn); return false; } @@ -412,7 +320,7 @@ G4bool G4GenericFileManager::WriteFile(const G4String& fileName) auto fileManager = GetFileManager(fileName); if ( ! fileManager ) { - FileManagerException(fileName, "WriteFile", "W021", fHdf5Warn); + FileManagerWarning(fileName, fkClass, "WriteFile", fHdf5Warn); return false; } @@ -426,7 +334,7 @@ G4bool G4GenericFileManager::CloseFile(const G4String& fileName) auto fileManager = GetFileManager(fileName); if ( ! fileManager ) { - FileManagerException(fileName, "CloseFile", "W021", fHdf5Warn); + FileManagerWarning(fileName, fkClass, "CloseFile", fHdf5Warn); return false; } @@ -438,25 +346,48 @@ G4bool G4GenericFileManager::SetIsEmpty(const G4String& fileName, G4bool isEmpty { auto fileManager = GetFileManager(fileName); if ( ! fileManager ) { - FileManagerException(fileName, "SetIsEmpty", "W021", fHdf5Warn); + FileManagerWarning(fileName, fkClass, "SetIsEmpty", fHdf5Warn); return false; } return fileManager->SetIsEmpty(fileName, isEmpty); } +//_____________________________________________________________________________ +G4bool G4GenericFileManager::SetHistoDirectoryName(const G4String& dirName) +{ + auto result = G4VFileManager::SetHistoDirectoryName(dirName); + + for (auto fileManager : fFileManagers ) { + if ( fileManager != nullptr ) { + result &= fileManager->SetHistoDirectoryName(dirName); + } + } + return result; +} + +//_____________________________________________________________________________ +G4bool G4GenericFileManager::SetNtupleDirectoryName(const G4String& dirName) +{ + auto result = G4VFileManager::SetNtupleDirectoryName(dirName); + + for (auto fileManager : fFileManagers ) { + if ( fileManager != nullptr ) { + result &= fileManager->SetNtupleDirectoryName(dirName); + } + } + return result; +} + //_____________________________________________________________________________ void G4GenericFileManager::SetDefaultFileType(const G4String& value) { // Check if value correspond to a valid file type auto output = G4Analysis::GetOutput(value); if ( output == G4AnalysisOutput::kNone ) { - G4ExceptionDescription description; - description - << "The file type " << value << "is not supported." << G4endl - << "The default type " << fDefaultFileType << " will be used."; - G4Exception("G4GenericFileManager::SetDeafultFileType", - "Analysis_W051", JustWarning, description); + Warn("The file type " + value + "is not supported.\n" + + "The default type " + fDefaultFileType + " will be used.", + fkClass, "SetDeafultFileType"); return; } @@ -464,7 +395,7 @@ void G4GenericFileManager::SetDefaultFileType(const G4String& value) } //_____________________________________________________________________________ -std::shared_ptr +std::shared_ptr G4GenericFileManager::CreateNtupleFileManager(G4AnalysisOutput output) { if ( ! GetFileManager(output) ) { @@ -480,7 +411,7 @@ G4GenericFileManager::CreateNtupleFileManager(G4AnalysisOutput output) ntupleFileManager->SetFileManager(fCsvFileManager); vNtupleFileManager = ntupleFileManager; break; - } + } case G4AnalysisOutput::kHdf5: { #ifdef TOOLS_USE_HDF5 auto ntupleFileManager = std::make_shared(fState); @@ -508,13 +439,9 @@ G4GenericFileManager::CreateNtupleFileManager(G4AnalysisOutput output) } if ( ! vNtupleFileManager ) { - G4ExceptionDescription description; - description - << " " - << "Failed to create ntuple file manager of " << G4Analysis::GetOutputName(output) << " type." - << failure; - G4Exception("G4GenericFileManager::CreateNtupleFileManager", - "Analysis_W002", JustWarning, description); + Warn("Failed to create ntuple file manager of " + + G4Analysis::GetOutputName(output) + " type.\n" + failure, + fkClass, "CreateNtupleFileManager"); } return vNtupleFileManager; diff --git a/source/analysis/factory/src/g4analysis.cc b/source/analysis/factory/src/g4analysis.cc deleted file mode 100644 index 66202de603..0000000000 --- a/source/analysis/factory/src/g4analysis.cc +++ /dev/null @@ -1,91 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// - -// Author: Ivana Hrivnacova, 09/09/2019 (ivana@ipno.in2p3.fr) - -#include "g4analysis.hh" -#include "G4AnalysisUtilities.hh" -#include "G4CsvAnalysisManager.hh" -#include "G4RootAnalysisManager.hh" -#include "G4XmlAnalysisManager.hh" -#ifdef TOOLS_USE_HDF5 -#include "G4Hdf5AnalysisManager.hh" -#endif -#include "G4Exception.hh" - -namespace { - -void DoFatalException(const G4String& outputName) -{ - G4ExceptionDescription description; - description - << " \"" << outputName << "\" output type is not supported." << G4endl - << " " << "Analysis manager cannot be created."; - G4Exception("G4Analysis::ManagerInstance", - "Analysis_F002", FatalException, description); -} - -} - -namespace G4Analysis -{ - -G4ToolsAnalysisManager* ManagerInstance(const G4String& outputName) -{ - // Get output type - G4AnalysisOutput outputType = GetOutput(outputName, false); - if ( outputType == G4AnalysisOutput::kNone ) { - DoFatalException(outputName); - return nullptr; - } - - // Create the analysis manager of a selected type - switch ( outputType ) { - case G4AnalysisOutput::kCsv: - return G4CsvAnalysisManager::Instance(); - break; -#ifdef TOOLS_USE_HDF5 - case G4AnalysisOutput::kHdf5: - return G4Hdf5AnalysisManager::Instance(); - break; -#endif - case G4AnalysisOutput::kRoot: - return G4RootAnalysisManager::Instance(); - break; - case G4AnalysisOutput::kXml: - return G4XmlAnalysisManager::Instance(); - break; - case G4AnalysisOutput::kNone: - default: - break; - } - - // should never reach this line - DoFatalException(outputName); - return nullptr; -} - -} diff --git a/source/analysis/hdf5/include/G4Hdf5AnalysisManager.hh b/source/analysis/hdf5/include/G4Hdf5AnalysisManager.hh index 319f6a5758..341a497a13 100644 --- a/source/analysis/hdf5/include/G4Hdf5AnalysisManager.hh +++ b/source/analysis/hdf5/include/G4Hdf5AnalysisManager.hh @@ -25,7 +25,7 @@ // // The main manager for Hdf5 analysis. -// It delegates most of functions to the object specific managers. +// It delegates most of functions to the object specific managers. // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) @@ -38,17 +38,22 @@ #include "tools/hdf5/ntuple" #include +#include +class G4Hdf5AnalysisManager; class G4Hdf5FileManager; class G4Hdf5NtupleFileManager; +template +class G4ThreadLocalSingleton; class G4Hdf5AnalysisManager : public G4ToolsAnalysisManager { + friend class G4ThreadLocalSingleton; + public: - explicit G4Hdf5AnalysisManager(G4bool isMaster = true); - ~G4Hdf5AnalysisManager(); - - // static methods + virtual ~G4Hdf5AnalysisManager(); + + // Static methods static G4Hdf5AnalysisManager* Instance(); static G4bool IsInstance(); @@ -61,42 +66,26 @@ class G4Hdf5AnalysisManager : public G4ToolsAnalysisManager std::vector::iterator EndNtuple(); std::vector::const_iterator BeginConstNtuple() const; std::vector::const_iterator EndConstNtuple() const; - + protected: - // virtual methods from base class + // Virtual methods from base class virtual G4bool OpenFileImpl(const G4String& fileName) final; virtual G4bool WriteImpl() final; - virtual G4bool CloseFileImpl(G4bool reset) final; + virtual G4bool CloseFileImpl(G4bool reset) final; + virtual G4bool ResetImpl() final; virtual G4bool IsOpenFileImpl() const final; private: - // constants - static constexpr unsigned int fgkDefaultBasketSize = 32000; + G4Hdf5AnalysisManager(); - // static data members - static G4Hdf5AnalysisManager* fgMasterInstance; - static G4ThreadLocal G4Hdf5AnalysisManager* fgInstance; + // Static data members + inline static G4Hdf5AnalysisManager* fgMasterInstance { nullptr }; + inline static G4ThreadLocal G4bool fgIsInstance { false }; + static constexpr std::string_view fkClass { "G4Hdf5AnalysisManager" }; - // methods - template - G4bool WriteHn(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType); - template - G4bool WritePn(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType); - G4bool WriteDirectory(); - G4bool WriteH1(); - G4bool WriteH2(); - G4bool WriteH3(); - G4bool WriteP1(); - G4bool WriteP2(); - G4bool Reset(); - - // data members - std::shared_ptr fNtupleFileManager; - std::shared_ptr fFileManager; + // Data members + std::shared_ptr fNtupleFileManager { nullptr }; + std::shared_ptr fFileManager { nullptr }; }; #include "G4Hdf5AnalysisManager.icc" diff --git a/source/analysis/hdf5/include/G4Hdf5AnalysisManager.icc b/source/analysis/hdf5/include/G4Hdf5AnalysisManager.icc index 62209e57ce..e0419a2254 100644 --- a/source/analysis/hdf5/include/G4Hdf5AnalysisManager.icc +++ b/source/analysis/hdf5/include/G4Hdf5AnalysisManager.icc @@ -30,84 +30,6 @@ #include "G4Hdf5NtupleManager.hh" #include "G4Hdf5FileManager.hh" -#include "tools/hdf5/h2file" - -//_____________________________________________________________________________ -template -inline -G4bool G4Hdf5AnalysisManager::WriteHn(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType) -{ - auto directory = fFileManager->GetHistoDirectory(); - // Do nothing if there is no directory - if ( directory < 0 ) return false; - - for ( G4int i=0; iGetActivation(); - auto name = info->GetName(); - // skip writing if inactivated - if ( fState.GetIsActivation() && ( ! activation ) ) continue; - auto ht = htVector[i]; -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3()->Message("write", hnType, name); -#endif - - G4bool result - = tools::hdf5::write_histo(G4cout, directory, name, *ht); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "saving " << hnType << " " << name << " failed"; - G4Exception("G4Hdf5AnalysisManager::Write()", - "Analysis_W022", JustWarning, description); - return false; - } - fFileManager->LockDirectoryNames(); - } - - return true; -} - -//_____________________________________________________________________________ -template -inline -G4bool G4Hdf5AnalysisManager::WritePn(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType) -{ - auto directory = fFileManager->GetHistoDirectory(); - // Do nothing if there is no directory - if ( directory < 0 ) return false; - - for ( G4int i=0; iGetActivation(); - auto name = info->GetName(); - // skip writing if inactivated - if ( fState.GetIsActivation() && ( ! activation ) ) continue; - auto ht = htVector[i]; -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3()->Message("write", hnType, name); -#endif - - G4bool result - = tools::hdf5::write_profile(G4cout, directory, name, *ht); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "saving " << hnType << " " << name << " failed"; - G4Exception("G4Hdf5AnalysisManager::Write()", - "Analysis_W022", JustWarning, description); - return false; - } - fFileManager->LockDirectoryNames(); - } - - return true; -} - //_____________________________________________________________________________ inline G4bool G4Hdf5AnalysisManager::IsOpenFileImpl() const @@ -120,41 +42,41 @@ inline tools::hdf5::ntuple* G4Hdf5AnalysisManager::GetNtuple() const { return fNtupleFileManager->GetNtupleManager()->GetNtuple(); -} +} //_____________________________________________________________________________ inline tools::hdf5::ntuple* G4Hdf5AnalysisManager::GetNtuple(G4int ntupleId) const { return fNtupleFileManager->GetNtupleManager()->GetNtuple(ntupleId); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4Hdf5AnalysisManager::BeginNtuple() { return fNtupleFileManager->GetNtupleManager()->BeginNtuple(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4Hdf5AnalysisManager::EndNtuple() { return fNtupleFileManager->GetNtupleManager()->EndNtuple(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4Hdf5AnalysisManager::BeginConstNtuple() const { return fNtupleFileManager->GetNtupleManager()->BeginConstNtuple(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4Hdf5AnalysisManager::EndConstNtuple() const { return fNtupleFileManager->GetNtupleManager()->EndConstNtuple(); -} +} diff --git a/source/analysis/hdf5/include/G4Hdf5AnalysisReader.hh b/source/analysis/hdf5/include/G4Hdf5AnalysisReader.hh index fab48459d0..24320c1100 100644 --- a/source/analysis/hdf5/include/G4Hdf5AnalysisReader.hh +++ b/source/analysis/hdf5/include/G4Hdf5AnalysisReader.hh @@ -25,7 +25,7 @@ // // The main manager for Hdf5 analysis reader. -// It delegates most of functions to the object specific managers. +// It delegates most of functions to the object specific managers. // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) @@ -35,68 +35,49 @@ #include "G4ToolsAnalysisReader.hh" #include "globals.hh" -#include "tools/histo/h1d" -#include "tools/histo/h2d" -#include "tools/histo/h3d" -#include "tools/histo/p1d" -#include "tools/histo/p2d" #include "tools/hdf5/ntuple" +#include +#include + +class G4Hdf5AnalysisReader; class G4Hdf5RFileManager; -class G4H1ToolsManager; -class G4H2ToolsManager; -class G4H3ToolsManager; -class G4P1ToolsManager; -class G4P2ToolsManager; class G4Hdf5RNtupleManager; - +template +class G4ThreadLocalSingleton; + class G4Hdf5AnalysisReader : public G4ToolsAnalysisReader { + friend class G4ThreadLocalSingleton; + public: - explicit G4Hdf5AnalysisReader(G4bool isMaster = true); virtual ~G4Hdf5AnalysisReader(); - - // static methods + + // Static methods static G4Hdf5AnalysisReader* Instance(); - + // Access methods tools::hdf5::ntuple* GetNtuple() const; tools::hdf5::ntuple* GetNtuple(G4int ntupleId) const; using G4VAnalysisReader::GetNtuple; - - protected: - // virtual methods from base class - virtual G4int ReadH1Impl(const G4String& h1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadH2Impl(const G4String& h2Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadH3Impl(const G4String& h3Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadP1Impl(const G4String& p1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadP2Impl(const G4String& p2Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadNtupleImpl(const G4String& ntupleName, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - - private: - // static data members - static G4Hdf5AnalysisReader* fgMasterInstance; - static G4ThreadLocal G4Hdf5AnalysisReader* fgInstance; - // methods - // - template - T* ReadHnImpl(const G4String& htName, const G4String& fileName, - const G4String& dirName); - template - T* ReadPnImpl(const G4String& ptName, const G4String& fileName, - const G4String& dirName); + protected: + // Virtual methods from base class + virtual G4bool CloseFilesImpl(G4bool reset) final; + + private: + G4Hdf5AnalysisReader(); + + // Methods G4bool Reset(); - // data members - G4Hdf5RNtupleManager* fNtupleManager; - G4Hdf5RFileManager* fFileManager; + // Static data members + inline static G4Hdf5AnalysisReader* fgMasterInstance { nullptr }; + static constexpr std::string_view fkClass { "G4Hdf5AnalysisReader" }; + + // Data members + std::shared_ptr fNtupleManager { nullptr }; + std::shared_ptr fFileManager { nullptr }; }; #include "G4Hdf5AnalysisReader.icc" diff --git a/source/analysis/hdf5/include/G4Hdf5AnalysisReader.icc b/source/analysis/hdf5/include/G4Hdf5AnalysisReader.icc index 7caaf56526..f3ca790c9a 100644 --- a/source/analysis/hdf5/include/G4Hdf5AnalysisReader.icc +++ b/source/analysis/hdf5/include/G4Hdf5AnalysisReader.icc @@ -24,86 +24,18 @@ // ******************************************************************** // -#include "G4Hdf5RFileManager.hh" - -#include - -// //_____________________________________________________________________________ -// inline -// tools::hdf5::ntuple* G4Hdf5AnalysisReader::GetNtuple() const -// { -// return fNtupleManager->GetNtuple(); -// } - -// //_____________________________________________________________________________ -// inline -// tools::hdf5::ntuple* G4Hdf5AnalysisReader::GetNtuple(G4int ntupleId) const -// { -// return fNtupleManager->GetNtuple(ntupleId); -// } +#include "G4Hdf5RNtupleManager.hh" //_____________________________________________________________________________ -template -T* G4Hdf5AnalysisReader::ReadHnImpl( - const G4String& htName, const G4String& fileName, - const G4String& dirName) -{ - // Get directory - auto directory = fFileManager->GetHistoRDirectory(fileName, dirName, false); - if ( directory < 0 ) return nullptr; - - // Read hn - T* ht; - auto result = tools::hdf5::read_histo(G4cout, directory, htName, ht); - if ( ! result ) return nullptr; - - if ( ! ht ) { - G4ExceptionDescription description; - description - << " " - << "Streaming " << htName << " from file " << fileName << " failed."; - G4Exception("G4Hdf5AnalysisReader::ReadHnImpl", - "Analysis_WR011", JustWarning, description); - - // when failure, directory and file should be closed - // ::H5Gclose(histos); - // ::H5Fclose(file); - - return nullptr; - } - - return ht; -} - -//_____________________________________________________________________________ -template -T* G4Hdf5AnalysisReader::ReadPnImpl( - const G4String& ptName, const G4String& fileName, - const G4String& dirName) +inline +tools::hdf5::ntuple* G4Hdf5AnalysisReader::GetNtuple() const { - // Get directory - auto directory = fFileManager->GetHistoRDirectory(fileName, dirName, false); - if ( directory < 0 ) return nullptr; + return fNtupleManager->GetNtuple(); +} - // Read hn - T* pt; - auto result = tools::hdf5::read_profile(G4cout, directory, ptName, pt); - if ( ! result ) return nullptr; - - if ( ! pt ) { - G4ExceptionDescription description; - description - << " " - << "Streaming " << ptName << " from file " << fileName << " failed."; - G4Exception("G4Hdf5AnalysisReader::ReadPnImpl", - "Analysis_WR011", JustWarning, description); - - // when failure, directory and file should be closed - // ::H5Gclose(histos); - // ::H5Fclose(file); - - return nullptr; - } - - return pt; -} +//_____________________________________________________________________________ +inline +tools::hdf5::ntuple* G4Hdf5AnalysisReader::GetNtuple(G4int ntupleId) const +{ + return fNtupleManager->GetNtuple(ntupleId); +} diff --git a/source/analysis/hdf5/include/G4Hdf5FileManager.hh b/source/analysis/hdf5/include/G4Hdf5FileManager.hh index 6aab65347f..780649fafb 100644 --- a/source/analysis/hdf5/include/G4Hdf5FileManager.hh +++ b/source/analysis/hdf5/include/G4Hdf5FileManager.hh @@ -32,12 +32,14 @@ #define G4Hdf5FileManager_h 1 #include "G4VTFileManager.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" #include "tools/hdf5/ntuple" // for hid_t #include #include +#include using G4Hdf5File = std::tuple; using Hdf5NtupleDescription = G4TNtupleDescription; @@ -46,7 +48,8 @@ class G4Hdf5FileManager : public G4VTFileManager { public: explicit G4Hdf5FileManager(const G4AnalysisManagerState& state); - ~G4Hdf5FileManager(); + G4Hdf5FileManager() = delete; + ~G4Hdf5FileManager() = default; using G4BaseFileManager::GetNtupleFileName; using G4VTFileManager::WriteFile; @@ -59,7 +62,7 @@ class G4Hdf5FileManager : public G4VTFileManager // Specific methods for files per objects G4bool CreateNtupleFile(Hdf5NtupleDescription* ntupleDescription); - G4bool CloseNtupleFile(Hdf5NtupleDescription* ntupleDescription); + G4bool CloseNtupleFile(Hdf5NtupleDescription* ntupleDescription); // Set methods void SetBasketSize(unsigned int basketSize); @@ -67,30 +70,31 @@ class G4Hdf5FileManager : public G4VTFileManager // Get methods hid_t GetHistoDirectory() const; hid_t GetNtupleDirectory() const; - unsigned int GetBasketSize() const; - + unsigned int GetBasketSize() const; + protected: - // // Methods derived from templated base class + // // Methods derived from base class virtual std::shared_ptr CreateFileImpl(const G4String& fileName) final; virtual G4bool WriteFileImpl(std::shared_ptr file) final; - virtual G4bool CloseFileImpl(std::shared_ptr file) final; + virtual G4bool CloseFileImpl(std::shared_ptr file) final; private: - hid_t CreateDirectory(hid_t& file, const G4String& directoryName, + hid_t CreateDirectory(hid_t& file, const G4String& directoryName, const G4String& objectType); G4String GetNtupleFileName(Hdf5NtupleDescription* ntupleDescription); - // constants - static const G4String fgkDefaultDirectoryName; - + // Static data members + static constexpr std::string_view fkClass { "G4Hdf5FileManager" }; + inline static const G4String fgkDefaultDirectoryName { "default" }; + // data members - unsigned int fBasketSize; + unsigned int fBasketSize { G4Analysis::kDefaultBasketSize }; }; // inline functions //_____________________________________________________________________________ -inline void G4Hdf5FileManager::SetBasketSize(unsigned int basketSize) +inline void G4Hdf5FileManager::SetBasketSize(unsigned int basketSize) { fBasketSize = basketSize; } //_____________________________________________________________________________ diff --git a/source/analysis/hdf5/include/G4Hdf5HnFileManager.hh b/source/analysis/hdf5/include/G4Hdf5HnFileManager.hh index 11fc1dae1e..301ff5bf79 100644 --- a/source/analysis/hdf5/include/G4Hdf5HnFileManager.hh +++ b/source/analysis/hdf5/include/G4Hdf5HnFileManager.hh @@ -35,15 +35,18 @@ #include "tools/hdf5/ntuple" // for hid_t +#include + class G4Hdf5FileManager; template class G4Hdf5HnFileManager : public G4VTHnFileManager { public: - G4Hdf5HnFileManager(G4Hdf5FileManager* fileManger) - : G4VTHnFileManager(), fFileManager(fileManger) {} - virtual ~G4Hdf5HnFileManager() {} + explicit G4Hdf5HnFileManager(G4Hdf5FileManager* fileManger) + : G4VTHnFileManager(), fFileManager(fileManger) {} + G4Hdf5HnFileManager() = delete; + virtual ~G4Hdf5HnFileManager() = default; // Methods for writing objects // Write to a new file (the file is closed after write) @@ -51,11 +54,13 @@ class G4Hdf5HnFileManager : public G4VTHnFileManager // Write to the default file (handled with OpenFile()/CloseFile methods) virtual G4bool Write(HT* ht, const G4String& htName, G4String& fileName) final; - private: + private: // Methods G4bool WriteImpl(hid_t hdirectory, HT* ht, const G4String& htName); + // Static data members + static constexpr std::string_view fkClass { "G4Hdf5HnFileManager" }; // Data members - G4Hdf5FileManager* fFileManager; + G4Hdf5FileManager* fFileManager { nullptr }; }; // inline functions diff --git a/source/analysis/hdf5/include/G4Hdf5HnFileManager.icc b/source/analysis/hdf5/include/G4Hdf5HnFileManager.icc index 73dd17afcd..58170d4be1 100644 --- a/source/analysis/hdf5/include/G4Hdf5HnFileManager.icc +++ b/source/analysis/hdf5/include/G4Hdf5HnFileManager.icc @@ -26,6 +26,8 @@ // // Author: Ivana Hrivnacova, 15/09/2020 (ivana@ipno.in2p3.fr) +#include "G4AnalysisUtilities.hh" + #include "tools/hdf5/header" #include "tools/hdf5/h2file" #include "tools/histo/h1d" @@ -71,7 +73,7 @@ G4bool G4Hdf5HnFileManager::WriteExtra( { // create a new file // create new file - hid_t hfile = ::H5Fcreate(fileName, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + hid_t hfile = ::H5Fcreate(fileName, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); // Do nothing if there is no file // (te error should be handled by caller) @@ -126,11 +128,9 @@ G4bool G4Hdf5HnFileManager::Write( auto hdirectory = std::get<1>(*fFileManager->GetTFile(fileName)); if ( hdirectory < 0 ) { - G4ExceptionDescription description; - description - << "Failed to get Hdf5 file " << fileName << " histo directory."; - G4Exception("G4Hdf5HnFileManager::Write()", - "Analysis_W022", JustWarning, description); + G4Analysis::Warn( + "Failed to get Hdf5 file " + fileName + " histo directory.", + fkClass, "Write"); return false; } diff --git a/source/analysis/hdf5/include/G4Hdf5HnRFileManager.hh b/source/analysis/hdf5/include/G4Hdf5HnRFileManager.hh new file mode 100644 index 0000000000..8fda512718 --- /dev/null +++ b/source/analysis/hdf5/include/G4Hdf5HnRFileManager.hh @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +// The manager class for histogram/profile reading from a Hdf5 file. + +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) + +#ifndef G4Hdf5HnRFileManager_h +#define G4Hdf5HnRFileManager_h 1 + +#include "G4VTHnRFileManager.hh" + +#include "tools/hdf5/ntuple" // for hid_t + +#include + +class G4Hdf5RFileManager; + +template +class G4Hdf5HnRFileManager : public G4VTHnRFileManager +{ + public: + explicit G4Hdf5HnRFileManager(G4Hdf5RFileManager* rfileManger) + : G4VTHnRFileManager(), fRFileManager(rfileManger) {} + G4Hdf5HnRFileManager() = delete; + virtual ~G4Hdf5HnRFileManager() = default; + + // Methods for writing objects + virtual HT* Read(const G4String& htName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; + + private: + // Methods + G4bool ReadT(hid_t directory, const G4String& htName, HT*& ht); + + // Static data members + static constexpr std::string_view fkClass { "G4Hdf5HnRFileManager" }; + // Data members + G4Hdf5RFileManager* fRFileManager { nullptr }; +}; + +// inline functions + +#include "G4Hdf5HnRFileManager.icc" + +#endif diff --git a/source/analysis/hdf5/include/G4Hdf5HnRFileManager.icc b/source/analysis/hdf5/include/G4Hdf5HnRFileManager.icc new file mode 100644 index 0000000000..34e3a74031 --- /dev/null +++ b/source/analysis/hdf5/include/G4Hdf5HnRFileManager.icc @@ -0,0 +1,89 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) + +#include "G4AnalysisUtilities.hh" + +#include "tools/hdf5/header" +#include "tools/hdf5/h2file" +#include "tools/histo/h1d" +#include "tools/histo/h2d" +#include "tools/histo/h3d" +#include "tools/histo/p1d" +#include "tools/histo/p2d" + +#include "tools/hdf5/h2file" + +//_____________________________________________________________________________ +template +inline +G4bool G4Hdf5HnRFileManager::ReadT( + hid_t directory, const G4String& htName, HT*& ht) +{ + return tools::hdf5::read_histo(G4cout, directory, htName, ht); +} + +//_____________________________________________________________________________ +template <> +inline +G4bool G4Hdf5HnRFileManager::ReadT( + hid_t directory, const G4String& htName, tools::histo::p1d*& ht) +{ + return tools::hdf5::read_profile(G4cout, directory, htName, ht); +} + +//_____________________________________________________________________________ +template <> +inline +G4bool G4Hdf5HnRFileManager::ReadT( + hid_t directory, const G4String& htName, tools::histo::p2d*& ht) +{ + return tools::hdf5::read_profile(G4cout, directory, htName, ht); +} + +//_____________________________________________________________________________ +template +inline +HT* G4Hdf5HnRFileManager::Read( + const G4String& htName, const G4String& fileName, const G4String& dirName, + G4bool /*isUserFileName*/) +{ + // Get directory + auto directory = fRFileManager->GetHistoRDirectory(fileName, dirName, false); + if ( directory < 0 ) return nullptr; + + // Read hn + HT* ht = nullptr; + if ( ! ReadT(directory, htName, ht) ) { + G4Analysis::Warn( + "Streaming " + htName + " from file " + fileName + " failed.", + fkClass, "ReadTImpl"); + return nullptr; + } + + return ht; +} diff --git a/source/analysis/hdf5/include/G4Hdf5NtupleFileManager.hh b/source/analysis/hdf5/include/G4Hdf5NtupleFileManager.hh index ff7c42842f..6b12f0fadf 100644 --- a/source/analysis/hdf5/include/G4Hdf5NtupleFileManager.hh +++ b/source/analysis/hdf5/include/G4Hdf5NtupleFileManager.hh @@ -34,6 +34,8 @@ #include "G4VNtupleFileManager.hh" #include "globals.hh" +#include + class G4Hdf5FileManager; class G4Hdf5NtupleManager; class G4VNtupleManager; @@ -45,7 +47,8 @@ class G4Hdf5NtupleFileManager : public G4VNtupleFileManager public: explicit G4Hdf5NtupleFileManager(const G4AnalysisManagerState& state); - ~G4Hdf5NtupleFileManager(); + G4Hdf5NtupleFileManager() = delete; + virtual ~G4Hdf5NtupleFileManager() = default; virtual std::shared_ptr CreateNtupleManager() override; @@ -53,19 +56,22 @@ class G4Hdf5NtupleFileManager : public G4VNtupleFileManager virtual G4bool ActionAtOpenFile(const G4String& fileName) override; virtual G4bool ActionAtWrite() override; virtual G4bool ActionAtCloseFile(G4bool reset) override; - virtual G4bool Reset() override; + virtual G4bool Reset() override; void SetFileManager(std::shared_ptr fileManager); std::shared_ptr GetNtupleManager() const; private: - // methods + // Methods G4bool CloseNtupleFiles(); - // data members - std::shared_ptr fFileManager; - std::shared_ptr fNtupleManager; + // Static data members + static constexpr std::string_view fkClass { "G4Hdf5NtupleFileManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; + std::shared_ptr fNtupleManager { nullptr }; }; inline void G4Hdf5NtupleFileManager::SetFileManager( @@ -76,4 +82,3 @@ inline std::shared_ptr G4Hdf5NtupleFileManager::GetNtupleMa { return fNtupleManager; } #endif - diff --git a/source/analysis/hdf5/include/G4Hdf5NtupleManager.hh b/source/analysis/hdf5/include/G4Hdf5NtupleManager.hh index 9271f24237..35bd73bdd9 100644 --- a/source/analysis/hdf5/include/G4Hdf5NtupleManager.hh +++ b/source/analysis/hdf5/include/G4Hdf5NtupleManager.hh @@ -24,7 +24,7 @@ // ******************************************************************** // -// Manager class for Hdf5 ntuples +// Manager class for Hdf5 ntuples // // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) @@ -32,6 +32,7 @@ #define G4Hdf5NtupleManager_h 1 #include "G4TNtupleManager.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" #include "tools/hdf5/ntuple" @@ -54,23 +55,24 @@ G4bool G4TNtupleManager::FillNtupleTColumn( class G4Hdf5NtupleManager : public G4TNtupleManager + G4Hdf5File> { friend class G4Hdf5AnalysisManager; friend class G4Hdf5NtupleFileManager; public: explicit G4Hdf5NtupleManager(const G4AnalysisManagerState& state); - ~G4Hdf5NtupleManager(); + G4Hdf5NtupleManager() = delete; + virtual ~G4Hdf5NtupleManager() = default; private: // Set methods void SetFileManager(std::shared_ptr fileManager); - + // Access to ntuple vector (needed for Write()) const std::vector& GetNtupleDescriptionVector() const; - // Utility function + // Utility function void CreateTNtuple(Hdf5NtupleDescription* ntupleDescription, G4bool warn); // Methods from the templated base class @@ -82,18 +84,22 @@ class G4Hdf5NtupleManager : public G4TNtupleManager fFileManager; + // Static data members + static constexpr std::string_view fkClass { "G4Hdf5NtupleManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; }; // inline functions -inline void +using std::to_string; + +inline void G4Hdf5NtupleManager::SetFileManager(std::shared_ptr fileManager) { fFileManager = fileManager; } -inline const std::vector& +inline const std::vector& G4Hdf5NtupleManager::GetNtupleDescriptionVector() const { return fNtupleDescriptionVector; } @@ -103,9 +109,9 @@ inline G4bool G4TNtupleManager::FillNtupleTColu G4int ntupleId, G4int columnId, const std::string& value) { if ( fState.GetIsActivation() && ( ! GetActivation(ntupleId) ) ) { - //G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; - return false; - } + //G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; + return false; + } // get ntuple auto ntuple = GetNtupleInFunction(ntupleId, "FillNtupleTColumn"); @@ -114,11 +120,9 @@ inline G4bool G4TNtupleManager::FillNtupleTColu // get generic column auto index = columnId - fFirstNtupleColumnId; if ( index < 0 || index >= G4int(ntuple->columns().size()) ) { - G4ExceptionDescription description; - description << " " << "ntupleId " << ntupleId - << " columnId " << columnId << " does not exist."; - G4Exception("G4TNtupleManager::FillNtupleTColumn()", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + "ntupleId " + to_string(ntupleId) + " columnId " + to_string(columnId) + + " does not exist.", fkClass, "FillNtupleTColumn"); return false; } auto icolumn = ntuple->columns()[index]; @@ -126,26 +130,23 @@ inline G4bool G4TNtupleManager::FillNtupleTColu // get column and check its type auto column = dynamic_cast(icolumn); if ( ! column ) { - G4ExceptionDescription description; - description << " Column type does not match: " - << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - G4Exception("G4TNtupleManager:FillNtupleTColumn", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + "Column type does not match: ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + " value " + value, + fkClass, "FillNtupleTColumn"); return false; - } + } column->fill(value); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("fill", "ntuple T column", description); - } -#endif - return true; + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "fill", "ntuple T column", + " ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + + " value " + G4Analysis::ToString(value)); + } + + return true; } #endif diff --git a/source/analysis/hdf5/include/G4Hdf5RFileManager.hh b/source/analysis/hdf5/include/G4Hdf5RFileManager.hh index 2bb01cb5cb..37a3449e2b 100644 --- a/source/analysis/hdf5/include/G4Hdf5RFileManager.hh +++ b/source/analysis/hdf5/include/G4Hdf5RFileManager.hh @@ -31,41 +31,50 @@ #ifndef G4Hdf5RFileManager_h #define G4Hdf5RFileManager_h 1 -#include "G4BaseFileManager.hh" +#include "G4VRFileManager.hh" #include "globals.hh" #include "tools/hdf5/ntuple" #include +#include +#include -class G4Hdf5RFileManager : public G4BaseFileManager +using G4Hdf5File = std::tuple; + +class G4Hdf5RFileManager : public G4VRFileManager { public: explicit G4Hdf5RFileManager(const G4AnalysisManagerState& state); - virtual ~G4Hdf5RFileManager(); + G4Hdf5RFileManager() = delete; + virtual ~G4Hdf5RFileManager() = default; virtual G4String GetFileType() const final { return "hdf5"; } + // Methods from base class + virtual void CloseFiles() final; + // Get methods - hid_t GetRFile(const G4String& fileName, G4bool isPerThread) const; + G4Hdf5File* GetRFile(const G4String& fileName, G4bool isPerThread); hid_t GetHistoRDirectory(const G4String& fileName, const G4String& dirName, G4bool isPerThread); hid_t GetNtupleRDirectory(const G4String& fileName, const G4String& dirName, G4bool isPerThread); private: - // constants - static const G4String fgkDefaultDirectoryName; - - // methods + // Methods hid_t OpenRFile(const G4String& fileName, G4bool isPerThread); hid_t OpenDirectory(hid_t file, const G4String& directoryName); hid_t GetRDirectory(const G4String& directoryType, const G4String& fileName, const G4String& dirName, G4bool isPerThread); - // data members - std::map fRFiles; + // Static data members + static constexpr std::string_view fkClass { "G4Hdf5RFileManager" }; + inline static const G4String fgkDefaultDirectoryName { "default" }; + + // Data members + std::map fRFiles; }; #endif diff --git a/source/analysis/hdf5/include/G4Hdf5RNtupleManager.hh b/source/analysis/hdf5/include/G4Hdf5RNtupleManager.hh index 73e30fe58a..e572bceb90 100644 --- a/source/analysis/hdf5/include/G4Hdf5RNtupleManager.hh +++ b/source/analysis/hdf5/include/G4Hdf5RNtupleManager.hh @@ -37,24 +37,40 @@ #include "tools/hdf5/ntuple" +#include + +class G4Hdf5RFileManager; + class G4Hdf5RNtupleManager : public G4TRNtupleManager { friend class G4Hdf5AnalysisReader; - protected: + public: explicit G4Hdf5RNtupleManager(const G4AnalysisManagerState& state); - virtual ~G4Hdf5RNtupleManager(); + G4Hdf5RNtupleManager() = delete; + virtual ~G4Hdf5RNtupleManager() = default; private: - // Methods from the templated base class - // + // Set methods + void SetFileManager(std::shared_ptr fileManager); + + // Methods from the base class + virtual G4int ReadNtupleImpl(const G4String& ntupleName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; virtual G4bool GetTNtupleRow(G4TRNtupleDescription* ntupleDescription) final; -}; + + // Static data members + static constexpr std::string_view fkClass { "G4Hdf5RNtupleManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; +}; // // inline functions -// inline G4int G4Hdf5RNtupleManager::GetNofNtuples() const -// { return fNtupleVector.size(); } +inline void +G4Hdf5RNtupleManager::SetFileManager(std::shared_ptr fileManager) +{ fFileManager = fileManager; } #endif diff --git a/source/analysis/hdf5/include/g4hdf5.hh b/source/analysis/hdf5/include/g4hdf5.hh deleted file mode 100644 index f75e128eba..0000000000 --- a/source/analysis/hdf5/include/g4hdf5.hh +++ /dev/null @@ -1,38 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// - -// Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) - -#ifndef g4hdf5_h -#define g4hdf5_h - -#include "g4hdf5_defs.hh" - -using namespace G4Hdf5; - -#endif - - diff --git a/source/analysis/hdf5/include/g4hdf5_defs.hh b/source/analysis/hdf5/include/g4hdf5_defs.hh index 75c6690dad..6e01302a38 100644 --- a/source/analysis/hdf5/include/g4hdf5_defs.hh +++ b/source/analysis/hdf5/include/g4hdf5_defs.hh @@ -30,25 +30,10 @@ #define g4hdf5_defs_h #include "tools/hdf5/ntuple" -#include "G4Hdf5AnalysisManager.hh" -#include "G4Hdf5AnalysisReader.hh" #include "g4hntools_defs.hh" -namespace G4Hdf5 -{ - // Ntuple types - using G4Ntuple = tools::hdf5::ntuple; - using G4NtupleIterator = std::vector::iterator; - using G4NtupleConstIterator = std::vector::const_iterator; - - // RNtuple types - using G4RNtuple = tools::hdf5::ntuple; - - // Managers - using G4AnalysisManager = G4Hdf5AnalysisManager; - using G4AnalysisReader = G4Hdf5AnalysisReader; -} +// Hdf5 output specific types +using G4Hdf5Ntuple = tools::hdf5::ntuple; +using G4Hdf5RNtuple = tools::hdf5::ntuple; #endif - - diff --git a/source/analysis/hdf5/sources.cmake b/source/analysis/hdf5/sources.cmake index 74f1bb26a6..9487feea02 100644 --- a/source/analysis/hdf5/sources.cmake +++ b/source/analysis/hdf5/sources.cmake @@ -10,12 +10,13 @@ geant4_add_module(G4hdf5 G4Hdf5FileManager.hh G4Hdf5HnFileManager.hh G4Hdf5HnFileManager.icc + G4Hdf5HnRFileManager.hh + G4Hdf5HnRFileManager.icc G4Hdf5NtupleManager.hh G4Hdf5NtupleFileManager.hh G4Hdf5RNtupleManager.hh G4Hdf5RFileManager.hh g4hdf5_defs.hh - g4hdf5.hh SOURCES G4Hdf5AnalysisManager.cc G4Hdf5AnalysisReader.cc diff --git a/source/analysis/hdf5/src/G4Hdf5AnalysisManager.cc b/source/analysis/hdf5/src/G4Hdf5AnalysisManager.cc index 826a2fceba..d921326413 100644 --- a/source/analysis/hdf5/src/G4Hdf5AnalysisManager.cc +++ b/source/analysis/hdf5/src/G4Hdf5AnalysisManager.cc @@ -31,6 +31,7 @@ #include "G4Hdf5NtupleFileManager.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" +#include "G4ThreadLocalSingleton.hh" #include "G4Threading.hh" #include "G4AutoLock.hh" @@ -41,72 +42,44 @@ using namespace G4Analysis; namespace { //Mutex to lock master manager when opening a file G4Mutex openFileMutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH1Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH2Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH3Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging P1 profiles - G4Mutex mergeP1Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging P2 profiles - G4Mutex mergeP2Mutex = G4MUTEX_INITIALIZER; //Mutex to lock master manager when closing a file G4Mutex closeFileMutex = G4MUTEX_INITIALIZER; -} +} -G4Hdf5AnalysisManager* G4Hdf5AnalysisManager::fgMasterInstance = nullptr; -G4ThreadLocal G4Hdf5AnalysisManager* G4Hdf5AnalysisManager::fgInstance = nullptr; +// G4Hdf5AnalysisManager* G4Hdf5AnalysisManager::fgMasterInstance = nullptr; +// G4ThreadLocal G4bool G4Hdf5AnalysisManager::fgIsInstance = false; //_____________________________________________________________________________ G4Hdf5AnalysisManager* G4Hdf5AnalysisManager::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4Hdf5AnalysisManager(isMaster); - } - - return fgInstance; + static G4ThreadLocalSingleton instance; + fgIsInstance = true; + return instance.Instance(); } //_____________________________________________________________________________ G4bool G4Hdf5AnalysisManager::IsInstance() { - return ( fgInstance != 0 ); -} + return fgIsInstance; +} //_____________________________________________________________________________ -G4Hdf5AnalysisManager::G4Hdf5AnalysisManager(G4bool isMaster) - : G4ToolsAnalysisManager("Hdf5", isMaster), - fNtupleFileManager(nullptr), - fFileManager(nullptr) +G4Hdf5AnalysisManager::G4Hdf5AnalysisManager() + : G4ToolsAnalysisManager("Hdf5") { #ifdef G4MULTITHREADED #ifndef H5_HAVE_THREADSAFE - G4ExceptionDescription message; - message - << "Your HDF5 lib is not built with H5_HAVE_THREADSAFE."; G4Exception("G4Hdf5AnalysisManager::G4Hdf5AnalysisManager", - "Analysis_F002", FatalException, message); + "Analysis_F001", FatalException, + "Your HDF5 lib is not built with H5_HAVE_THREADSAFE."); #endif #endif - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description - << " " - << "G4Hdf5AnalysisManager already exists." - << "Cannot create another instance."; - G4Exception("G4Hdf5AnalysisManager::G4Hdf5AnalysisManager", - "Analysis_F001", FatalException, description); - } - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; - + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; + // File manager fFileManager = std::make_shared(fState); SetFileManager(fFileManager); - fFileManager->SetBasketSize(fgkDefaultBasketSize); // Ntuple file manager fNtupleFileManager = std::make_shared(fState); @@ -116,152 +89,12 @@ G4Hdf5AnalysisManager::G4Hdf5AnalysisManager(G4bool isMaster) //_____________________________________________________________________________ G4Hdf5AnalysisManager::~G4Hdf5AnalysisManager() -{ +{ if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; - fgInstance = nullptr; + fgIsInstance = false; } -// -// private methods // - -//_____________________________________________________________________________ -G4bool G4Hdf5AnalysisManager::WriteH1() -{ - auto h1Vector = fH1Manager->GetH1Vector(); - auto hnVector = fH1Manager->GetHnVector(); - - if ( ! h1Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteHn(h1Vector, hnVector, "h1"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH1(&mergeH1Mutex); - fgMasterInstance->fH1Manager->AddH1Vector(h1Vector); - lH1.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4Hdf5AnalysisManager::WriteH2() -{ - auto h2Vector = fH2Manager->GetH2Vector(); - auto hnVector = fH2Manager->GetHnVector(); - - if ( ! h2Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteHn(h2Vector, hnVector, "h2"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH2(&mergeH2Mutex); - fgMasterInstance->fH2Manager->AddH2Vector(h2Vector); - lH2.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4Hdf5AnalysisManager::WriteH3() -{ - auto h3Vector = fH3Manager->GetH3Vector(); - auto hnVector = fH3Manager->GetHnVector(); - - if ( ! h3Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteHn(h3Vector, hnVector, "h3"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH3(&mergeH3Mutex); - fgMasterInstance->fH3Manager->AddH3Vector(h3Vector); - lH3.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4Hdf5AnalysisManager::WriteP1() -{ - auto p1Vector = fP1Manager->GetP1Vector(); - auto hnVector = fP1Manager->GetHnVector(); - - if ( ! p1Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WritePn(p1Vector, hnVector, "p1"); - } - else { - // The worker manager just adds its profiles to the master - // This operation needs a lock - G4AutoLock lP1(&mergeP1Mutex); - fgMasterInstance->fP1Manager->AddP1Vector(p1Vector); - lP1.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4Hdf5AnalysisManager::WriteP2() -{ - auto p2Vector = fP2Manager->GetP2Vector(); - auto hnVector = fP2Manager->GetHnVector(); - - if ( ! p2Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WritePn(p2Vector, hnVector, "p2"); - } - else { - // The worker manager just adds its profiles to the master - // This operation needs a lock - G4AutoLock lP2(&mergeP2Mutex); - fgMasterInstance->fP2Manager->AddP2Vector(p2Vector); - lP2.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4Hdf5AnalysisManager::Reset() -{ -// Reset histograms and ntuple - - auto finalResult = true; - - auto result = G4ToolsAnalysisManager::Reset(); - finalResult = finalResult && result; - - result = fNtupleFileManager->Reset(); - finalResult = finalResult && result; - - return finalResult; -} - -// // protected methods // @@ -272,89 +105,75 @@ G4bool G4Hdf5AnalysisManager::OpenFileImpl(const G4String& fileName) // and set it to base class which takes then their ownership SetNtupleManager(fNtupleFileManager->CreateNtupleManager()); - auto finalResult = true; + auto result = true; G4AutoLock lock(&openFileMutex); - auto result = fFileManager->OpenFile(fileName); - finalResult = finalResult && result; - - result = fNtupleFileManager->ActionAtOpenFile(fFileManager->GetFullFileName()); - finalResult = finalResult && result; + result &= fFileManager->OpenFile(fileName); + result &= fNtupleFileManager->ActionAtOpenFile(fFileManager->GetFullFileName()); lock.unlock(); - return finalResult; -} + return result; +} //_____________________________________________________________________________ -G4bool G4Hdf5AnalysisManager::WriteImpl() +G4bool G4Hdf5AnalysisManager::WriteImpl() { - auto finalResult = true; + auto result = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("write", "files", ""); + Message(kVL4, "write", "files"); + + if ( G4Threading::IsWorkerThread() ) { + result &= G4ToolsAnalysisManager::Merge(); } -#endif + else { + // Open all files registered with objects + fFileManager->OpenFiles(); - auto result = WriteH1(); - finalResult = finalResult && result; + // Write all histograms/profile on master + result &= G4ToolsAnalysisManager::WriteImpl(); + } - // H2 - result = WriteH2(); - finalResult = finalResult && result; - - // H3 - result = WriteH3(); - finalResult = finalResult && result; - - // P1 - result = WriteP1(); - finalResult = finalResult && result; - - // P2 - result = WriteP2(); - finalResult = finalResult && result; - // Write ASCII if activated if ( IsAscii() ) { - result = WriteAscii(fFileManager->GetFileName()); - finalResult = finalResult && result; - } - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("write", "files", "", finalResult); + result &= WriteAscii(fFileManager->GetFileName()); } -#endif - return finalResult; + Message(kVL3, "write", "files", "", result); + + return result; } //_____________________________________________________________________________ G4bool G4Hdf5AnalysisManager::CloseFileImpl(G4bool reset) { - auto finalResult = true; + auto result = true; G4AutoLock lock(&closeFileMutex); - auto result = fFileManager->CloseFiles(); - finalResult = finalResult && result; + result &= fFileManager->CloseFiles(); if ( reset ) { // reset data - result = Reset(); + result = ResetImpl(); if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Resetting data failed"; - G4Exception("G4Hdf5AnalysisManager::CloseFile()", - "Analysis_W021", JustWarning, description); + Warn("Resetting data failed", fkClass, "OpenDirectory"); } } - finalResult = finalResult && result; - - result = fNtupleFileManager->ActionAtCloseFile(reset); - finalResult = finalResult && result; + result &= fNtupleFileManager->ActionAtCloseFile(reset); lock.unlock(); - return finalResult; + return result; +} + +//_____________________________________________________________________________ +G4bool G4Hdf5AnalysisManager::ResetImpl() +{ + auto result = true; + + result &= G4ToolsAnalysisManager::ResetImpl(); + if ( fNtupleFileManager != nullptr ) { + result &= fNtupleFileManager->Reset(); + } + + return result; } diff --git a/source/analysis/hdf5/src/G4Hdf5AnalysisReader.cc b/source/analysis/hdf5/src/G4Hdf5AnalysisReader.cc index e6cd9ad603..e77a1fc367 100644 --- a/source/analysis/hdf5/src/G4Hdf5AnalysisReader.cc +++ b/source/analysis/hdf5/src/G4Hdf5AnalysisReader.cc @@ -27,52 +27,31 @@ // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) #include "G4Hdf5AnalysisReader.hh" +#include "G4Hdf5RFileManager.hh" #include "G4Hdf5RNtupleManager.hh" -#include "G4AnalysisVerbose.hh" -#include "G4AnalysisUtilities.hh" +#include "G4ThreadLocalSingleton.hh" #include "G4Threading.hh" -#include -#include - using namespace G4Analysis; -G4Hdf5AnalysisReader* G4Hdf5AnalysisReader::fgMasterInstance = nullptr; -G4ThreadLocal G4Hdf5AnalysisReader* G4Hdf5AnalysisReader::fgInstance = nullptr; - //_____________________________________________________________________________ G4Hdf5AnalysisReader* G4Hdf5AnalysisReader::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4Hdf5AnalysisReader(isMaster); - } - - return fgInstance; -} + static G4ThreadLocalSingleton instance; + return instance.Instance(); +} //_____________________________________________________________________________ -G4Hdf5AnalysisReader::G4Hdf5AnalysisReader(G4bool isMaster) - : G4ToolsAnalysisReader("Hdf5", isMaster), - fNtupleManager(nullptr), - fFileManager(nullptr) +G4Hdf5AnalysisReader::G4Hdf5AnalysisReader() + : G4ToolsAnalysisReader("Hdf5") { - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description - << " " - << "G4Hdf5AnalysisReader already exists." - << "Cannot create another instance."; - G4Exception("G4Hdf5AnalysisReader::G4Hdf5AnalysisReader()", - "Analysis_F001", FatalException, description); - } - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; // Create managers - fNtupleManager = new G4Hdf5RNtupleManager(fState); - fFileManager = new G4Hdf5RFileManager(fState); - + fNtupleManager = std::make_shared(fState); + fFileManager = std::make_shared(fState); + fNtupleManager->SetFileManager(fFileManager); + // Set managers to base class SetNtupleManager(fNtupleManager); SetFileManager(fFileManager); @@ -82,10 +61,9 @@ G4Hdf5AnalysisReader::G4Hdf5AnalysisReader(G4bool isMaster) G4Hdf5AnalysisReader::~G4Hdf5AnalysisReader() { if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; - fgInstance = nullptr; } -// +// // private methods // @@ -94,179 +72,32 @@ G4bool G4Hdf5AnalysisReader::Reset() { // Reset histograms and ntuple - auto finalResult = true; - - auto result = G4ToolsAnalysisReader::Reset(); - finalResult = finalResult && result; + auto result = true; - result = fNtupleManager->Reset(); - finalResult = finalResult && result; - - return finalResult; -} - -// + result &= G4ToolsAnalysisReader::Reset(); + result &= fNtupleManager->Reset(); + + return result; +} + +// // protected methods // //_____________________________________________________________________________ -G4int G4Hdf5AnalysisReader::ReadH1Impl(const G4String& h1Name, - const G4String& fileName, - const G4String& dirName, - G4bool /*isUserFileName*/) +G4bool G4Hdf5AnalysisReader::CloseFilesImpl(G4bool reset) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h1", h1Name); -#endif + Message(kVL4, "close", "files"); - auto h1 = ReadHnImpl(h1Name, fileName, dirName); - - if ( ! h1 ) return kInvalidId; - - auto id = fH1Manager->AddH1(h1Name, h1); + auto result = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h1", h1Name, id > kInvalidId); -#endif - - return id; -} + if (reset) { + result &= Reset(); + } -//_____________________________________________________________________________ -G4int G4Hdf5AnalysisReader::ReadH2Impl(const G4String& h2Name, - const G4String& fileName, - const G4String& dirName, - G4bool /*isUserFileName*/) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h2", h2Name); -#endif + fFileManager->CloseFiles(); - auto h2 = ReadHnImpl(h2Name, fileName, dirName); - - if ( ! h2 ) return kInvalidId; - - auto id = fH2Manager->AddH2(h2Name, h2); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h2", h2Name, id > kInvalidId); -#endif - - return id; -} + Message(kVL2, "close", "files", "", result); -//_____________________________________________________________________________ -G4int G4Hdf5AnalysisReader::ReadH3Impl(const G4String& h3Name, - const G4String& fileName, - const G4String& dirName, - G4bool /*isUserFileName*/) -{ - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h3", h3Name); -#endif - - auto h3 = ReadHnImpl(h3Name, fileName, dirName); - - if ( ! h3 ) return kInvalidId; - - auto id = fH3Manager->AddH3(h3Name, h3); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h3", h3Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4Hdf5AnalysisReader::ReadP1Impl(const G4String& p1Name, - const G4String& fileName, - const G4String& dirName, - G4bool /*isUserFileName*/) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "p1", p1Name); -#endif - - auto p1 = ReadPnImpl(p1Name, fileName, dirName); - - if ( ! p1 ) return kInvalidId; - - auto id = fP1Manager->AddP1(p1Name, p1); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "p1", p1Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4Hdf5AnalysisReader::ReadP2Impl(const G4String& p2Name, - const G4String& fileName, - const G4String& dirName, - G4bool /*isUserFileName*/) -{ - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "p2", p2Name); -#endif - - auto p2 = ReadPnImpl(p2Name, fileName, dirName); - - if ( ! p2 ) return kInvalidId; - - auto id = fP2Manager->AddP2(p2Name, p2); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "p2", p2Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4Hdf5AnalysisReader::ReadNtupleImpl(const G4String& ntupleName, - const G4String& fileName, - const G4String& dirName, - G4bool isUserFileName) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "ntuple", ntupleName); -#endif - - // Ntuples are saved in files per thread - // but apply thethe thread suffix only if fileName is not provided explicitly - G4String fullFileName = fileName; - if ( ! isUserFileName ) { - fullFileName = fFileManager->GetFullFileName(); - } - - // Get directory - auto directory = fFileManager->GetNtupleRDirectory(fullFileName, dirName, false); - if ( directory < 0 ) return kInvalidId; - - // Create ntuple - auto rntuple = new tools::hdf5::ntuple(G4cout, directory, ntupleName); - auto rntupleDescription = new G4TRNtupleDescription(rntuple); - auto id = fNtupleManager->SetNtuple(rntupleDescription); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "ntuple", ntupleName, id > kInvalidId); -#endif - - return id; -} + return result; +} diff --git a/source/analysis/hdf5/src/G4Hdf5FileManager.cc b/source/analysis/hdf5/src/G4Hdf5FileManager.cc index 07960f74be..204dc458d3 100644 --- a/source/analysis/hdf5/src/G4Hdf5FileManager.cc +++ b/source/analysis/hdf5/src/G4Hdf5FileManager.cc @@ -42,29 +42,21 @@ using namespace tools; namespace { //Mutex to lock master manager when closing a file G4Mutex closeFileMutex = G4MUTEX_INITIALIZER; -} - -//_____________________________________________________________________________ -const G4String G4Hdf5FileManager::fgkDefaultDirectoryName = "default"; +} //_____________________________________________________________________________ G4Hdf5FileManager::G4Hdf5FileManager(const G4AnalysisManagerState& state) - : G4VTFileManager(state), - fBasketSize(0) // TO DO: check default value !! (433 in test) + : G4VTFileManager(state) { // Create helpers defined in the base class fH1FileManager = std::make_shared>(this); fH2FileManager = std::make_shared>(this); fH3FileManager = std::make_shared>(this); fP1FileManager = std::make_shared>(this); - fP2FileManager = std::make_shared>(this); + fP2FileManager = std::make_shared>(this); } -//_____________________________________________________________________________ -G4Hdf5FileManager::~G4Hdf5FileManager() -{} - -// +// // private methods // @@ -85,12 +77,7 @@ hid_t G4Hdf5FileManager::CreateDirectory(hid_t& file, newDirectoryName += objectType; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4() - ->Message("create", "directory for " + objectType, newDirectoryName); - } -#endif + Message(kVL4, "create", "directory for " + objectType, newDirectoryName); auto success = true; @@ -100,39 +87,29 @@ hid_t G4Hdf5FileManager::CreateDirectory(hid_t& file, // be the default value but 0 is what is found in examples, and in the code, if we pass 0, clearly some // default value is taken. if ( directory < 0 ) { - G4ExceptionDescription description; - description << " " - << "cannot create directory " << directoryName; - G4Exception("G4Hdf5FileManager::CreateDirectory()", - "Analysis_W001", JustWarning, description); + Warn("Cannot create directory " + directoryName, + fkClass, "CreateDirectory"); success = false; } else { // write atb (header?) auto result = hdf5::write_atb(directory, "type", "directory"); if ( !result) { - G4ExceptionDescription description; - description << " " - << "write_atb class failed for " << directoryName; - G4Exception("G4Hdf5FileManager::CreateDirectory()", - "Analysis_W001", JustWarning, description); + Warn("Write_atb class failed for " + directoryName, + fkClass, "CreateDirectory"); success = false; } } -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2() - ->Message("create", "directory for " + objectType, newDirectoryName, success); - } -#endif + Message(kVL2, "create", "directory for " + objectType, newDirectoryName, success); + return directory; } //_____________________________________________________________________________ G4String G4Hdf5FileManager::GetNtupleFileName(Hdf5NtupleDescription* ntupleDescription) { - // get ntuple file name + // get ntuple file name auto ntupleFileName = ntupleDescription->fFileName; if ( ntupleFileName.size() ) { // update filename per object per thread @@ -142,9 +119,9 @@ G4String G4Hdf5FileManager::GetNtupleFileName(Hdf5NtupleDescription* ntupleDescr ntupleFileName = GetFullFileName(); } return ntupleFileName; -} +} -// +// // protected methods // @@ -157,19 +134,14 @@ std::shared_ptr G4Hdf5FileManager::CreateFileImpl(const G4String& fi // Do nothing if there is no file // (the error should be handled by caller) if ( file < 0 ) { - G4ExceptionDescription description; - description << " " << "::H5Fcreate failed " << fileName; - G4Exception("G4Hdf5AnalysisManager::CreateFileImpl()", - "Analysis_W001", JustWarning, description); + Warn("::H5Fcreate failed " + fileName, fkClass, "CreateFileImpl"); return std::make_shared(-1, -1, -1); } // create a header with general infos if(!tools::hdf5::write_header(file)) { - G4ExceptionDescription description; - description << " " << "tools::hdf5::write_header() failed for " << fileName; - G4Exception("G4Hdf5AnalysisManager::CreateFileImpl()", - "Analysis_W001", JustWarning, description); + Warn("tools::hdf5::write_header() failed for " + fileName, + fkClass, "CreateFileImpl"); return std::make_shared(-1, -1, -1); } @@ -177,7 +149,7 @@ std::shared_ptr G4Hdf5FileManager::CreateFileImpl(const G4String& fi auto hdirectory = CreateDirectory(file, fHistoDirectoryName, "histograms"); if ( hdirectory < 0 ) { - // Warnin is issued in CreateDirectory + // Warning is issued in CreateDirectory return std::make_shared(-1, -1, -1); } @@ -227,30 +199,23 @@ G4bool G4Hdf5FileManager::OpenFile(const G4String& fileName) auto name = GetFullFileName(); if ( fFile ) { - G4ExceptionDescription description; - description - << "File " << fileName << " already exists."; - G4Exception("G4Hdf5FileManager::OpenFile()", - "Analysis_W001", JustWarning, description); + Warn("File " + fileName + " already exists.", fkClass, "OpenFile"); fFile.reset(); } // create new file fFile = CreateTFile(name); if ( ! fFile ) { - G4ExceptionDescription description; - description << "Failed to create file " << fileName; - G4Exception("G4Hdf5FileManager::OpenFile()", - "Analysis_W001", JustWarning, description); + Warn("Failed to create file " + fileName, fkClass, "OpenFile"); return false; } - fLockDirectoryNames = true; + LockDirectoryNames(); fIsOpenFile = true; return true; } - + //_____________________________________________________________________________ G4bool G4Hdf5FileManager::CreateNtupleFile( Hdf5NtupleDescription* ntupleDescription) @@ -272,7 +237,7 @@ G4bool G4Hdf5FileManager::CloseNtupleFile( Hdf5NtupleDescription* ntupleDescription) { // Do nothing if there is no file - if ( ! ntupleDescription->fFile ) return true; + if ( ntupleDescription->fFile == nullptr ) return true; // Ntuple files will be closed with CloseFiles() calls ntupleDescription->fFile.reset(); diff --git a/source/analysis/hdf5/src/G4Hdf5NtupleFileManager.cc b/source/analysis/hdf5/src/G4Hdf5NtupleFileManager.cc index bb353dd252..c0c0451520 100644 --- a/source/analysis/hdf5/src/G4Hdf5NtupleFileManager.cc +++ b/source/analysis/hdf5/src/G4Hdf5NtupleFileManager.cc @@ -32,28 +32,18 @@ #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" -#include "G4Threading.hh" - -#include - using namespace G4Analysis; -// +// // utility methods // //_____________________________________________________________________________ G4Hdf5NtupleFileManager::G4Hdf5NtupleFileManager(const G4AnalysisManagerState& state) - : G4VNtupleFileManager(state, "hdf5"), - fFileManager(nullptr), - fNtupleManager(nullptr) + : G4VNtupleFileManager(state, "hdf5") {} -//_____________________________________________________________________________ -G4Hdf5NtupleFileManager::~G4Hdf5NtupleFileManager() -{} - -// +// // private methods // @@ -62,14 +52,13 @@ G4bool G4Hdf5NtupleFileManager::CloseNtupleFiles() { // Close ntuple files - auto finalResult = true; + auto result = true; auto ntupleVector = fNtupleManager->GetNtupleDescriptionVector(); for ( auto ntupleDescription : ntupleVector) { - auto result = fFileManager->CloseNtupleFile(ntupleDescription); - finalResult = finalResult && result; + result &= fFileManager->CloseNtupleFile(ntupleDescription); } - return finalResult; + return result; } // @@ -90,7 +79,7 @@ std::shared_ptr G4Hdf5NtupleFileManager::CreateNtupleManager() //_____________________________________________________________________________ G4bool G4Hdf5NtupleFileManager::ActionAtOpenFile(const G4String& /*fileName*/) { - // Create ntuples if they are booked + // Create ntuples if they are booked // (The files will be created with creating ntuples) fNtupleManager->CreateNtuplesFromBooking( fBookingManager->GetNtupleBookingVector()); @@ -101,50 +90,31 @@ G4bool G4Hdf5NtupleFileManager::ActionAtOpenFile(const G4String& /*fileName*/) //_____________________________________________________________________________ G4bool G4Hdf5NtupleFileManager::ActionAtWrite() { - // notify that ntuple file is not empty - - auto finalResult = true; - - // Notify that ntuple files are not empty - auto ntupleVector - = fNtupleManager->GetNtupleDescriptionVector(); - - for ( auto ntupleDescription : ntupleVector) { - if (ntupleDescription->fFile) { - auto result = fFileManager->SetIsEmpty(ntupleDescription->fFileName, false); - finalResult = finalResult && result; - } - } - - return finalResult; + // Nothing to be done + return true; } //_____________________________________________________________________________ G4bool G4Hdf5NtupleFileManager::ActionAtCloseFile(G4bool reset) { - auto finalResult = true; + auto result = true; // Close ntuple files - auto result = CloseNtupleFiles(); - finalResult = finalResult && result; + result &= CloseNtupleFiles(); if ( ! reset ) { - // The ntuples must be always reset when closing file) + // The ntuples must be always reset when closing file) result = Reset(); if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Resetting data failed"; - G4Exception("G4Hdf5NtupleFileManager::CloseFile()", - "Analysis_W021", JustWarning, description); + Warn("Resetting data failed", fkClass, "ActionAtCloseFile"); } - finalResult = finalResult && result; } - return finalResult; + return result; } //_____________________________________________________________________________ G4bool G4Hdf5NtupleFileManager::Reset() { - return fNtupleManager->Reset(true); + return fNtupleManager->Reset(); } diff --git a/source/analysis/hdf5/src/G4Hdf5NtupleManager.cc b/source/analysis/hdf5/src/G4Hdf5NtupleManager.cc index 5212df3273..45089e3da5 100644 --- a/source/analysis/hdf5/src/G4Hdf5NtupleManager.cc +++ b/source/analysis/hdf5/src/G4Hdf5NtupleManager.cc @@ -34,22 +34,14 @@ #include "tools/ntuple_booking" -#include -//#include - using namespace G4Analysis; //_____________________________________________________________________________ G4Hdf5NtupleManager::G4Hdf5NtupleManager(const G4AnalysisManagerState& state) - : G4TNtupleManager(state), - fFileManager(nullptr) + : G4TNtupleManager(state) {} -//_____________________________________________________________________________ -G4Hdf5NtupleManager::~G4Hdf5NtupleManager() -{} - -// +// // private methods // //_____________________________________________________________________________ @@ -68,11 +60,8 @@ void G4Hdf5NtupleManager::CreateTNtuple( // Check file if ( ! ntupleFile ) { if (warn) { - G4String inFunction = "G4Hdf5NtupleManager::::CreateTNtuple"; - G4ExceptionDescription description; - description << " " - << "Cannot create ntuple. Ntuple file does not exist." << G4endl; - G4Exception(inFunction, "Analysis_W002", JustWarning, description); + Warn( "Cannot create ntuple. Ntuple file does not exist.", + fkClass, "CreateTNtuple"); } return; } @@ -88,7 +77,7 @@ void G4Hdf5NtupleManager::CreateTNtuple( G4cout, directory, ntupleDescription->fNtupleBooking, compressionLevel, basketSize); - fNtupleVector.push_back(ntupleDescription->fNtuple); + fNtupleVector.push_back(ntupleDescription->fNtuple); } //_____________________________________________________________________________ diff --git a/source/analysis/hdf5/src/G4Hdf5RFileManager.cc b/source/analysis/hdf5/src/G4Hdf5RFileManager.cc index bf58f1de2b..8a24d35a04 100644 --- a/source/analysis/hdf5/src/G4Hdf5RFileManager.cc +++ b/source/analysis/hdf5/src/G4Hdf5RFileManager.cc @@ -27,33 +27,30 @@ // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) #include "G4Hdf5RFileManager.hh" +#include "G4Hdf5HnRFileManager.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" #include "tools/hdf5/h2file" -#include - -#include -#include +#include "tools/hdf5/group_exists" +#include "tools/zlib" using namespace G4Analysis; - -//_____________________________________________________________________________ -const G4String G4Hdf5RFileManager::fgkDefaultDirectoryName = "default"; +using namespace tools; //_____________________________________________________________________________ G4Hdf5RFileManager::G4Hdf5RFileManager(const G4AnalysisManagerState& state) - : G4BaseFileManager(state), - fRFiles() + : G4VRFileManager(state) { + // Create helpers defined in the base class + fH1RFileManager = std::make_shared>(this); + fH2RFileManager = std::make_shared>(this); + fH3RFileManager = std::make_shared>(this); + fP1RFileManager = std::make_shared>(this); + fP2RFileManager = std::make_shared>(this); } -//_____________________________________________________________________________ -G4Hdf5RFileManager::~G4Hdf5RFileManager() -{ -} - -// +// // private methods // @@ -64,93 +61,71 @@ hid_t G4Hdf5RFileManager::OpenRFile(const G4String& fileName, // Get full file name G4String name = GetFullFileName(fileName, isPerThread); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("open", "read analysis file", name); -#endif + Message(kVL4, "open", "read analysis file", name); // create new file hid_t newFile = H5Fopen(name, H5F_ACC_RDONLY, H5P_DEFAULT); if ( newFile < 0 ) { - G4ExceptionDescription description; - description << " " << "Cannot open file " << name; - G4Exception("G4Hdf5RFileManager::OpenFile()", - "Analysis_WR001", JustWarning, description); - return false; + Warn("Cannot open file " + name, fkClass, "OpenRFile"); + return kInvalidId; } // newFile->add_unziper('Z',tools::decompress_buffer); - + // add file in a map - std::map::iterator it - = fRFiles.find(name); - if ( it != fRFiles.end() ) { - it->second = newFile; - } - else { - fRFiles[name] = newFile; - } + fRFiles[name] = G4Hdf5File(newFile, kInvalidId, kInvalidId); -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("open", "read analysis file", name); -#endif + Message(kVL1, "open", "read analysis file", name); + + return newFile; +} - return true; -} - //_____________________________________________________________________________ hid_t G4Hdf5RFileManager::OpenDirectory(hid_t file, const G4String& directoryName) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("open", "read directory", directoryName); - } -#endif - + Message(kVL4, "open", "read directory", directoryName); + auto directory = tools_H5Gopen(file, directoryName); if ( directory < 0 ) { - G4ExceptionDescription description; - description << " " - << "cannot open directory " << directoryName; - G4Exception("G4Hdf5RFileManager::OpenDirectory()", - "Analysis_W001", JustWarning, description); - return kInvalidId; - } + Warn("Cannot open directory " + directoryName, fkClass, "OpenDirectory"); + return kInvalidId; + } else { -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("open", "read directory", directoryName); - } -#endif + Message(kVL2, "open", "read directory", directoryName); return directory; - } + } } //_____________________________________________________________________________ hid_t G4Hdf5RFileManager::GetRDirectory(const G4String& directoryType, - const G4String& fileName, - const G4String& dirName, - G4bool isPerThread) + const G4String& fileName, + const G4String& dirName, + G4bool isPerThread) { // Get or open a file auto rfile = GetRFile(fileName, isPerThread); - if ( rfile < 0 ) { - // Try to open it if not found in the map - if ( ! OpenRFile(fileName, isPerThread) ) return kInvalidId; + if ( ! rfile ) { + // Try to open it if not found in the map + if ( OpenRFile(fileName, isPerThread) < 0 ) return kInvalidId; rfile = GetRFile(fileName, isPerThread); } + auto isHistograms = (directoryType == "histograms"); + + // Get directory if already open + hid_t directory = kInvalidId; + if ( isHistograms ) { + directory = std::get<1>(*rfile); + } else { + directory = std::get<2>(*rfile); + } + if ( directory != kInvalidId ) { + return directory; + } + // Use default directory name if not specified auto newDirName = dirName; if ( newDirName == "" ) { - // if ( fDefaultDirectory > 0 ) { - // // Return the default directory if the name is not set and the default directory - // // already exists - // directory = fDefaultDirectory; - // return true; - // } else { // Create the default directory if the name is not set and the default directory // does not yet exist newDirName = fgkDefaultDirectoryName; @@ -159,28 +134,35 @@ hid_t G4Hdf5RFileManager::GetRDirectory(const G4String& directoryType, } // Open directory - return OpenDirectory(rfile, newDirName); -} + directory = OpenDirectory(std::get<0>(*rfile), newDirName); + // Update + if ( isHistograms ) { + std::get<1>(*rfile) = directory; + } else { + std::get<2>(*rfile) = directory; + } + + return directory; +} // // public methods // //_____________________________________________________________________________ -hid_t G4Hdf5RFileManager::GetRFile(const G4String& fileName, - G4bool isPerThread) const -{ +G4Hdf5File* G4Hdf5RFileManager::GetRFile(const G4String& fileName, + G4bool isPerThread) +{ // Get full file name G4String name = GetFullFileName(fileName, isPerThread); - std::map::const_iterator it - = fRFiles.find(name); + auto it = fRFiles.find(name); if ( it != fRFiles.end() ) - return it->second; + return &(it->second); else { - return kInvalidId; - } + return nullptr; + } } //_____________________________________________________________________________ @@ -197,4 +179,19 @@ hid_t G4Hdf5RFileManager::GetNtupleRDirectory(const G4String& fileName, const G4 return GetRDirectory("ntuples", fileName, dirName, isPerThread); } - +//_____________________________________________________________________________ +void G4Hdf5RFileManager::CloseFiles() +{ + // Close all open directories and file + for ( auto [key, rfile] : fRFiles ) { + if (std::get<1>(rfile) != kInvalidId) { + ::H5Gclose(std::get<1>(rfile)); + } + if (std::get<2>(rfile) != kInvalidId) { + ::H5Gclose(std::get<2>(rfile)); + } + if (std::get<0>(rfile) != kInvalidId) { + ::H5Fclose(std::get<0>(rfile)); + } + } +} diff --git a/source/analysis/hdf5/src/G4Hdf5RNtupleManager.cc b/source/analysis/hdf5/src/G4Hdf5RNtupleManager.cc index e3f153ad96..bc4a8483fc 100644 --- a/source/analysis/hdf5/src/G4Hdf5RNtupleManager.cc +++ b/source/analysis/hdf5/src/G4Hdf5RNtupleManager.cc @@ -27,20 +27,48 @@ // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) #include "G4Hdf5RNtupleManager.hh" +#include "G4Hdf5RFileManager.hh" + +using namespace G4Analysis; //_____________________________________________________________________________ G4Hdf5RNtupleManager::G4Hdf5RNtupleManager(const G4AnalysisManagerState& state) : G4TRNtupleManager(state) {} -//_____________________________________________________________________________ -G4Hdf5RNtupleManager::~G4Hdf5RNtupleManager() -{} - -// +// // private methods // +//_____________________________________________________________________________ +G4int G4Hdf5RNtupleManager::ReadNtupleImpl(const G4String& ntupleName, + const G4String& fileName, + const G4String& dirName, + G4bool isUserFileName) +{ + Message(kVL4, "read", "ntuple", ntupleName); + + // Ntuples are saved in files per thread + // but apply thethe thread suffix only if fileName is not provided explicitly + G4String fullFileName = fileName; + if ( ! isUserFileName ) { + fullFileName = fFileManager->GetFullFileName(); + } + + // Get directory + auto directory = fFileManager->GetNtupleRDirectory(fullFileName, dirName, false); + if ( directory < 0 ) return kInvalidId; + + // Create ntuple + auto rntuple = new tools::hdf5::ntuple(G4cout, directory, ntupleName); + auto rntupleDescription = new G4TRNtupleDescription(rntuple); + auto id = SetNtuple(rntupleDescription); + + Message(kVL2, "read", "ntuple", ntupleName, id > kInvalidId); + + return id; +} + //_____________________________________________________________________________ G4bool G4Hdf5RNtupleManager::GetTNtupleRow( G4TRNtupleDescription* ntupleDescription) @@ -51,26 +79,16 @@ G4bool G4Hdf5RNtupleManager::GetTNtupleRow( if ( ! isInitialized ) { auto ntupleBinding = ntupleDescription->fNtupleBinding; if ( ! ntuple->initialize(G4cout, *ntupleBinding) ) { - G4ExceptionDescription description; - description - << " " - << "Ntuple initialization failed !!"; - G4Exception("G4Hdf5RNtuple::GetNtupleRow()", - "Analysis_WR021", JustWarning, description); + Warn("Ntuple initialization failed !!", fkClass, "GetTNtupleRow"); return false; } ntupleDescription->fIsInitialized = true; } if ( ! ntuple->get_row() ) { - G4ExceptionDescription description; - description - << " " - << "Ntuple get_row() failed !!"; - G4Exception("G4Hdf5RNtuple::GetNtupleRow()", - "Analysis_WR021", JustWarning, description); + Warn( "Ntuple get_row() failed !!", fkClass, "GetTNtupleRow"); return false; } return true; -} +} diff --git a/source/analysis/hntools/include/G4BaseHistoUtilities.hh b/source/analysis/hntools/include/G4BaseHistoUtilities.hh index 9dbb11426e..b75ced5610 100644 --- a/source/analysis/hntools/include/G4BaseHistoUtilities.hh +++ b/source/analysis/hntools/include/G4BaseHistoUtilities.hh @@ -42,7 +42,7 @@ using G4ToolsBaseHisto = tools::histo::base_histo; // Access to data parameters -// +// G4int GetNbins(const G4ToolsBaseHisto& baseHisto, G4int dimension); G4double GetMin(const G4ToolsBaseHisto& baseHisto, G4int dimension); G4double GetMax(const G4ToolsBaseHisto& baseHisto, G4int dimension); @@ -58,7 +58,7 @@ G4bool SetAxisTitle(G4ToolsBaseHisto& baseHisto, G4int dimension, const G4String // Accessors G4String GetTitle(const G4ToolsBaseHisto& baseHisto); -G4String GetAxisTitle(const G4ToolsBaseHisto& baseHisto, G4int dimension, +G4String GetAxisTitle(const G4ToolsBaseHisto& baseHisto, G4int dimension, const G4String& hnType); } diff --git a/source/analysis/hntools/include/G4H1ToolsManager.hh b/source/analysis/hntools/include/G4H1ToolsManager.hh index dcd2b42526..f5465056ab 100644 --- a/source/analysis/hntools/include/G4H1ToolsManager.hh +++ b/source/analysis/hntools/include/G4H1ToolsManager.hh @@ -26,7 +26,7 @@ // Manager class for tools::histo::h1d. // It implements functions specific to the H1 type -// (defined in g4tools). +// (defined in g4tools). // // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) @@ -41,10 +41,11 @@ #include #include #include +#include namespace tools { -namespace histo { -class h1d; +namespace histo { +class h1d; } } @@ -53,28 +54,29 @@ class G4H1ToolsManager : public G4VH1Manager, { public: explicit G4H1ToolsManager(const G4AnalysisManagerState& state); - virtual ~G4H1ToolsManager(); + G4H1ToolsManager() = delete; + virtual ~G4H1ToolsManager() = default; // Method to add histograms read from a file G4int AddH1(const G4String& name, tools::histo::h1d* h1d); // Method for merge (MT) void AddH1Vector(const std::vector& h1Vector); - + // Access methods // tools::histo::h1d* GetH1(G4int id, G4bool warn = true, G4bool onlyIfActive = true) const; - + // Iterators std::vector::iterator BeginH1(); std::vector::iterator EndH1(); std::vector::const_iterator BeginConstH1() const; std::vector::const_iterator EndConstH1() const; - + // Access to histogram vector (needed for Write()) const std::vector& GetH1Vector() const; - const std::vector& GetHnVector() const; - + const std::vector& GetHnVector() const; + protected: // Virtual functions from base class // @@ -90,7 +92,7 @@ class G4H1ToolsManager : public G4VH1Manager, const std::vector& edges, const G4String& unitName = "none", const G4String& fcnName = "none") final; - + virtual G4bool SetH1(G4int id, G4int nbins, G4double xmin, G4double xmax, const G4String& unitName = "none", @@ -101,7 +103,7 @@ class G4H1ToolsManager : public G4VH1Manager, const G4String& unitName = "none", const G4String& fcnName = "none") final; virtual G4bool ScaleH1(G4int id, G4double factor) final; - + // Method to fill histograms // virtual G4bool FillH1(G4int id, G4double value, G4double weight = 1.0) final; @@ -136,16 +138,16 @@ class G4H1ToolsManager : public G4VH1Manager, virtual std::shared_ptr GetHnManager() final; private: - // methods + // Methods // - void AddH1Information(const G4String& name, - const G4String& unitName, + void AddH1Information(const G4String& name, + const G4String& unitName, const G4String& fcnName, G4BinScheme binScheme) const; - // data members - //static constexpr G4int kDimension = 1; // not yet supported on vc12 - static const G4int kDimension; + // Static data members + static constexpr std::string_view fkClass { "G4H1ToolsManager" }; + static constexpr G4int fkDimension = 1; }; // inline methods @@ -156,11 +158,11 @@ inline std::vector::iterator G4H1ToolsManager::BeginH1() inline std::vector::iterator G4H1ToolsManager::EndH1() { return EndT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4H1ToolsManager::BeginConstH1() const { return BeginConstT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4H1ToolsManager::EndConstH1() const { return EndConstT(); } @@ -170,7 +172,7 @@ inline const std::vector& G4H1ToolsManager::GetH1Vector() co inline const std::vector& G4H1ToolsManager::GetHnVector() const { return fHnManager->GetHnVector(); } -inline std::shared_ptr G4H1ToolsManager::GetHnManager() +inline std::shared_ptr G4H1ToolsManager::GetHnManager() { return std::shared_ptr(fHnManager); } #endif diff --git a/source/analysis/hntools/include/G4H2ToolsManager.hh b/source/analysis/hntools/include/G4H2ToolsManager.hh index 79d4a70dbf..1b46c50ce6 100644 --- a/source/analysis/hntools/include/G4H2ToolsManager.hh +++ b/source/analysis/hntools/include/G4H2ToolsManager.hh @@ -26,7 +26,7 @@ // Manager class for tools::histo::h2d. // It implements functions specific to the H2 type -// (defined in g4tools). +// (defined in g4tools). // // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) @@ -41,10 +41,11 @@ #include #include #include +#include namespace tools { -namespace histo { -class h2d; +namespace histo { +class h2d; } } @@ -53,13 +54,13 @@ class G4H2ToolsManager : public G4VH2Manager, { public: explicit G4H2ToolsManager(const G4AnalysisManagerState& state); - virtual ~G4H2ToolsManager(); + virtual ~G4H2ToolsManager() = default; // Method to add histograms read from a file G4int AddH2(const G4String& name, tools::histo::h2d* h2d); // Method for merge (MT) void AddH2Vector(const std::vector& h2Vector); - + // Access methods // tools::histo::h2d* GetH2(G4int id, G4bool warn = true, @@ -69,11 +70,11 @@ class G4H2ToolsManager : public G4VH2Manager, std::vector::iterator EndH2(); std::vector::const_iterator BeginConstH2() const; std::vector::const_iterator EndConstH2() const; - + // Access to histogram vector (needed for Write()) const std::vector& GetH2Vector() const; const std::vector& GetHnVector() const; - + protected: // Virtual functions from base class // @@ -81,48 +82,48 @@ class G4H2ToolsManager : public G4VH2Manager, // Methods to create histograms // virtual G4int CreateH2(const G4String& name, const G4String& title, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear") final; - + virtual G4int CreateH2(const G4String& name, const G4String& title, const std::vector& xedges, const std::vector& yedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none") final; - + virtual G4bool SetH2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear") final; - + virtual G4bool SetH2(G4int id, const std::vector& xedges, const std::vector& yedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none") final; virtual G4bool ScaleH2(G4int id, G4double factor) final; - + // Method to fill histograms // virtual G4bool FillH2(G4int id, G4double xvalue, G4double yvalue, G4double weight = 1.0) final; - + // Methods to manipulate histograms // @@ -139,7 +140,7 @@ class G4H2ToolsManager : public G4VH2Manager, virtual G4double GetH2Ymin(G4int id) const final; virtual G4double GetH2Ymax(G4int id) const final; virtual G4double GetH2YWidth(G4int id) const final; - + // Setters for attributes for plotting virtual G4bool SetH2Title(G4int id, const G4String& title) final; virtual G4bool SetH2XAxisTitle(G4int id, const G4String& title) final; @@ -151,26 +152,25 @@ class G4H2ToolsManager : public G4VH2Manager, virtual G4String GetH2XAxisTitle(G4int id) const final; virtual G4String GetH2YAxisTitle(G4int id) const final; virtual G4String GetH2ZAxisTitle(G4int id) const final; - + // Write data on ASCII file virtual G4bool WriteOnAscii(std::ofstream& output) final; - + // Access to Hn manager virtual std::shared_ptr GetHnManager() final; private: - void AddH2Information(const G4String& name, - const G4String& xunitName, - const G4String& yunitName, + void AddH2Information(const G4String& name, + const G4String& xunitName, + const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, G4BinScheme xbinScheme, G4BinScheme ybinScheme) const; - - // data members - // - // static constexpr G4int kDimension = 2; // not yet supported on vc12 - static const G4int kDimension; + + // Static data members + static constexpr std::string_view fkClass { "G4H2ToolsManager" }; + static constexpr G4int fkDimension = 2; }; // inline methods @@ -180,11 +180,11 @@ inline std::vector::iterator G4H2ToolsManager::BeginH2() inline std::vector::iterator G4H2ToolsManager::EndH2() { return EndT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4H2ToolsManager::BeginConstH2() const { return BeginConstT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4H2ToolsManager::EndConstH2() const { return EndConstT(); } @@ -194,7 +194,7 @@ inline const std::vector& G4H2ToolsManager::GetH2Vector() co inline const std::vector& G4H2ToolsManager::GetHnVector() const { return fHnManager->GetHnVector(); } -inline std::shared_ptr G4H2ToolsManager::GetHnManager() +inline std::shared_ptr G4H2ToolsManager::GetHnManager() { return std::shared_ptr(fHnManager); } #endif diff --git a/source/analysis/hntools/include/G4H3ToolsManager.hh b/source/analysis/hntools/include/G4H3ToolsManager.hh index 5834199758..1bb32fb0c5 100644 --- a/source/analysis/hntools/include/G4H3ToolsManager.hh +++ b/source/analysis/hntools/include/G4H3ToolsManager.hh @@ -26,7 +26,7 @@ // Manager class for tools::histo::h3d. // It implements functions specific to the H3 type -// (defined in g4tools). +// (defined in g4tools). // // Author: Ivana Hrivnacova, 24/07/2014 (ivana@ipno.in2p3.fr) @@ -42,10 +42,11 @@ #include #include #include +#include namespace tools { -namespace histo { -class h3d; +namespace histo { +class h3d; } } @@ -54,13 +55,13 @@ class G4H3ToolsManager : public G4VH3Manager, { public: explicit G4H3ToolsManager(const G4AnalysisManagerState& state); - virtual ~G4H3ToolsManager(); + virtual ~G4H3ToolsManager() = default; // Method to add histograms read from a file G4int AddH3(const G4String& name, tools::histo::h3d* h3d); // Method for merge (MT) void AddH3Vector(const std::vector& h3Vector); - + // Access methods // tools::histo::h3d* GetH3(G4int id, G4bool warn = true, @@ -70,11 +71,11 @@ class G4H3ToolsManager : public G4VH3Manager, std::vector::iterator EndH3(); std::vector::const_iterator BeginConstH3() const; std::vector::const_iterator EndConstH3() const; - + // Access to histogram vector (needed for Write()) const std::vector& GetH3Vector() const; const std::vector& GetHnVector() const; - + protected: // Virtual functions from base class // @@ -82,63 +83,63 @@ class G4H3ToolsManager : public G4VH3Manager, // Methods to create histograms // virtual G4int CreateH3(const G4String& name, const G4String& title, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4int nzbins, G4double zmin, G4double zmax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear", const G4String& zbinScheme = "linear") final; - + virtual G4int CreateH3(const G4String& name, const G4String& title, const std::vector& xedges, const std::vector& yedges, const std::vector& zedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none") final; - + virtual G4bool SetH3(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4int nzbins, G4double zmin, G4double zmax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear", const G4String& zbinScheme = "linear") final; - + virtual G4bool SetH3(G4int id, const std::vector& xedges, const std::vector& yedges, const std::vector& zedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none") final; virtual G4bool ScaleH3(G4int id, G4double factor) final; - + // Method to fill histograms // - virtual G4bool FillH3(G4int id, + virtual G4bool FillH3(G4int id, G4double xvalue, G4double yvalue, G4double zvalue, G4double weight = 1.0) final; - + // Methods to manipulate histograms // @@ -159,7 +160,7 @@ class G4H3ToolsManager : public G4VH3Manager, virtual G4double GetH3Zmin(G4int id) const final; virtual G4double GetH3Zmax(G4int id) const final; virtual G4double GetH3ZWidth(G4int id) const final; - + // Setters for attributes for plotting virtual G4bool SetH3Title(G4int id, const G4String& title) final; virtual G4bool SetH3XAxisTitle(G4int id, const G4String& title) final; @@ -171,28 +172,28 @@ class G4H3ToolsManager : public G4VH3Manager, virtual G4String GetH3XAxisTitle(G4int id) const final; virtual G4String GetH3YAxisTitle(G4int id) const final; virtual G4String GetH3ZAxisTitle(G4int id) const final; - + // Write data on ASCII file virtual G4bool WriteOnAscii(std::ofstream& output) final; - + // Access to Hn manager virtual std::shared_ptr GetHnManager() final; private: - void AddH3Information(const G4String& name, - const G4String& xunitName, - const G4String& yunitName, - const G4String& zunitName, + void AddH3Information(const G4String& name, + const G4String& xunitName, + const G4String& yunitName, + const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, G4BinScheme xbinScheme, G4BinScheme ybinScheme, G4BinScheme zbinScheme) const; - - // data members - // static constexpr G4int kDimension = 3; // not yet supported on vc12 - static const G4int kDimension; + + // Static data members + static constexpr std::string_view fkClass { "G4H3ToolsManager" }; + static constexpr G4int fkDimension = 3; }; // inline methods @@ -202,11 +203,11 @@ inline std::vector::iterator G4H3ToolsManager::BeginH3() inline std::vector::iterator G4H3ToolsManager::EndH3() { return EndT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4H3ToolsManager::BeginConstH3() const { return BeginConstT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4H3ToolsManager::EndConstH3() const { return EndConstT(); } @@ -216,7 +217,7 @@ inline const std::vector& G4H3ToolsManager::GetH3Vector() co inline const std::vector& G4H3ToolsManager::GetHnVector() const { return fHnManager->GetHnVector(); } -inline std::shared_ptr G4H3ToolsManager::GetHnManager() +inline std::shared_ptr G4H3ToolsManager::GetHnManager() { return std::shared_ptr(fHnManager); } #endif diff --git a/source/analysis/hntools/include/G4MPIToolsManager.hh b/source/analysis/hntools/include/G4MPIToolsManager.hh index f354d04351..bd8986b562 100644 --- a/source/analysis/hntools/include/G4MPIToolsManager.hh +++ b/source/analysis/hntools/include/G4MPIToolsManager.hh @@ -35,10 +35,11 @@ #include "G4HnInformation.hh" #include "G4ios.hh" -#include -#include +#include "tools/impi_world" +#include "tools/histo/hmpi" #include +#include class G4MPIToolsManager { @@ -46,213 +47,35 @@ class G4MPIToolsManager G4MPIToolsManager(const G4AnalysisManagerState& state, tools::histo::hmpi* hmpi) : fState(state), fHmpi(hmpi) {} - virtual ~G4MPIToolsManager() {} - + G4MPIToolsManager() = delete; + virtual ~G4MPIToolsManager() = default; + public: - // methods - template - G4bool Merge(const std::vector& htVector, + // Methods + template + G4bool Merge(const std::vector& htVector, const std::vector& hnVector); - private: - // methods - template + private: + // Methods + template G4bool Send(G4int nofActiveT, - const std::vector& htVector, + const std::vector& htVector, const std::vector& hnVector); - template + template G4bool Receive(G4int nofActiveT, - const std::vector& htVector, + const std::vector& htVector, const std::vector& hnVector); - // data members + // Static data members + static constexpr std::string_view fkClass { "G4MPIToolsManager" }; + + // Data members const G4AnalysisManagerState& fState; tools::histo::hmpi* fHmpi; }; // inline functions - -//_____________________________________________________________________________ -template -G4bool G4MPIToolsManager::Send(G4int nofActiveT, - const std::vector& htVector, - const std::vector& hnVector) -{ - G4bool finalResult = true; - - // send object to destination rank - // G4cout << "Begin send for " << nofActiveT << G4endl; - fHmpi->beg_send(nofActiveT); - - // pack objects - for ( G4int i=0; iGetActivation() ) ) ) continue; - // pack histogram for sending - // G4cout << "Packed " << i << "th T" << G4endl; - auto ht = htVector[i]; - auto result = fHmpi->pack(*ht); - finalResult = result && finalResult; - } - - //G4cout << "Go to send all " << G4endl; - if ( ! fHmpi->send(fHmpi->rank()) ) { - G4ExceptionDescription description; - description << " Rank: " << fHmpi->rank() << " : can't send histos."; - G4Exception("G4H1ToolsManager::Receieve", - "Analysis_W031", JustWarning, description); - return false; - } - - return finalResult; -} - -//_____________________________________________________________________________ -template -G4bool G4MPIToolsManager::Receive(G4int nofActiveT, - const std::vector& htVector, - const std::vector& hnVector) -{ - G4int commSize; - G4bool result = fHmpi->comm_size(commSize); - if ( ! result ) { - G4ExceptionDescription description; - description - << " Failed to get MPI commander size." << G4endl - << " Merging will not be performed."; - G4Exception("G4H1ToolsManager::Merge", - "Analysis_W031", JustWarning, description); - return false; - } - - // get objects from source ranks - for (G4int srank = 0; srank < commSize; ++srank) { - - // skip destination rank - if ( srank == fHmpi->rank() ) continue; - - // get objects from this source rank - //G4cout << "Go to wait_histos " << rank << G4endl; - using class_pointer = std::pair; - std::vector hs; - if ( ! fHmpi->wait_histos(srank, hs) ) { - G4ExceptionDescription description; - description << " wait_histos from " << srank << " : failed."; - G4Exception("G4H1ToolsManager::Receieve", - "Analysis_W031", JustWarning, description); - return false; - } - - // check that we got the right number of objects - if ( G4int(hs.size()) != nofActiveT ) { - G4ExceptionDescription description; - description << " srank: " << srank << " : got " << hs.size() << " objects, " - << "while " << nofActiveT << " were expected." << G4endl; - G4Exception("G4H1ToolsManager::Receieve", - "Analysis_W031", JustWarning, description); - return false; - } - - // merge the objects to destination rank - G4int counter = 0; - for ( G4int i=0; iGetActivation() ) ) ) continue; - // merge histograms - auto ht = htVector[i]; - auto newHt = static_cast(hs[counter++].second); - ht->add(*newHt); - } - } - return true; -} - - -//_____________________________________________________________________________ -template -inline G4bool G4MPIToolsManager::Merge(const std::vector& htVector, - const std::vector& hnVector) -{ - if ( ! htVector.size() ) return true; - - // Get number of objects to be sent - G4int nofActiveT = 0; - if ( fState.GetIsActivation() ) { - // only activated histograms will be treated - for ( G4int i=0; iGetActivation(); - if ( activation ) ++nofActiveT; - } - } else { - nofActiveT = G4int(htVector.size()); - } - - if ( ! nofActiveT ) return true; - - G4int commRank; - if ( ! fHmpi->comm_rank(commRank) ) { - G4ExceptionDescription description; - description - << " Failed to get MPI commander rank." << G4endl - << " Merging will not be performed."; - G4Exception("G4H1ToolsManager::Merge", - "Analysis_W031", JustWarning, description); - return false; - } - - G4bool finalResult = true; - - if ( commRank != fHmpi->rank() ) { - -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - G4ExceptionDescription description; - description << "on rank " << commRank - << " destination rank: " << fHmpi->rank(); - fState.GetVerboseL4()->Message("mpi send", "Hn|Pn", description); - } -#endif - - auto result = Send(nofActiveT, htVector, hnVector); - - finalResult = result && finalResult; - -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) { - G4ExceptionDescription description; - description << "on rank " << commRank - << " destination rank: " << fHmpi->rank(); - fState.GetVerboseL1()->Message("send", "Hn|Pn", description); - } -#endif - - } else { - -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - G4ExceptionDescription description; - description << "on rank " << commRank - << " destination rank: " << fHmpi->rank(); - fState.GetVerboseL4()->Message("mpi wait_histos", "Hn|Pn", description); - } -#endif - - auto result = Receive(nofActiveT, htVector, hnVector); - - finalResult = result && finalResult; - -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) { - G4ExceptionDescription description; - description << "on rank " << commRank - << " destination rank: " << fHmpi->rank(); - fState.GetVerboseL1()->Message("mpi wait_histos", "Hn|Pn", description); - } -#endif - } - return finalResult; -} +#include "G4MPIToolsManager.icc" #endif diff --git a/source/analysis/hntools/include/G4MPIToolsManager.icc b/source/analysis/hntools/include/G4MPIToolsManager.icc new file mode 100644 index 0000000000..cbdfa28c51 --- /dev/null +++ b/source/analysis/hntools/include/G4MPIToolsManager.icc @@ -0,0 +1,181 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +// The manager class for MPI applications. + +// Author: Ivana Hrivnacova, 25/06/2015 (ivana@ipno.in2p3.fr) + +using std::to_string; + +//_____________________________________________________________________________ +template +inline +G4bool G4MPIToolsManager::Send(G4int nofActiveT, + const std::vector& htVector, + const std::vector& hnVector) +{ + auto result = true; + + // send object to destination rank + // G4cout << "Begin send for " << nofActiveT << G4endl; + fHmpi->beg_send(nofActiveT); + + // pack objects + for ( G4int i=0; iGetActivation() ) ) ) continue; + // pack histogram for sending + // G4cout << "Packed " << i << "th T" << G4endl; + auto ht = htVector[i]; + result &= fHmpi->pack(*ht); + } + + //G4cout << "Go to send all " << G4endl; + if ( ! fHmpi->send(fHmpi->rank()) ) { + G4Analysis::Warn( + "Rank: " + to_string(fHmpi->rank()) + " : can't send histos.", + fkClass, "Send"); + return false; + } + + return result; +} + +//_____________________________________________________________________________ +template +inline +G4bool G4MPIToolsManager::Receive(G4int nofActiveT, + const std::vector& htVector, + const std::vector& hnVector) +{ + G4int commSize; + G4bool result = fHmpi->comm_size(commSize); + if ( ! result ) { + G4Analysis::Warn( + "Failed to get MPI commander size.\nMerging will not be performed.", + fkClass, "Receive"); + return false; + } + + // get objects from source ranks + for (G4int srank = 0; srank < commSize; ++srank) { + + // skip destination rank + if ( srank == fHmpi->rank() ) continue; + + // get objects from this source rank + // G4cout << "Go to wait_histos " << srank << G4endl; + using class_pointer = std::pair; + std::vector hs; + if ( ! fHmpi->wait_histos(srank, hs) ) { + G4Analysis::Warn( + "Wait_histos from " + to_string(srank) + " : failed.", + fkClass, "Receive"); + return false; + } + + // check that we got the right number of objects + if ( G4int(hs.size()) != nofActiveT ) { + G4Analysis::Warn( + "srank: " + to_string(srank) + " : got " + to_string(hs.size()) + + " objects, while " + to_string(nofActiveT) +" were expected.", + fkClass, "Receive"); + return false; + } + + // merge the objects to destination rank + G4int counter = 0; + for ( G4int i=0; iGetActivation() ) ) ) continue; + // merge histograms + auto ht = htVector[i]; + auto newHt = static_cast(hs[counter++].second); + ht->add(*newHt); + } + } + return true; +} + + +//_____________________________________________________________________________ +template +inline +G4bool G4MPIToolsManager::Merge(const std::vector& htVector, + const std::vector& hnVector) +{ + if ( ! htVector.size() ) return true; + + // Get number of objects to be sent + G4int nofActiveT = 0; + if ( fState.GetIsActivation() ) { + // only activated histograms will be treated + for ( G4int i=0; iGetActivation(); + if ( activation ) ++nofActiveT; + } + } else { + nofActiveT = G4int(htVector.size()); + } + + if ( ! nofActiveT ) return true; + + G4int commRank; + if ( ! fHmpi->comm_rank(commRank) ) { + G4Analysis::Warn( + "Failed to get MPI commander rank.\nMerging will not be performed.", + fkClass, "Merge"); + return false; + } + + auto result = true; + + if ( commRank != fHmpi->rank() ) { + fState.Message(G4Analysis::kVL3, "mpi send", "Hn|Pn", + "on rank " + to_string(commRank) + + " destination rank: " + to_string(fHmpi->rank())); + + result &= Send(nofActiveT, htVector, hnVector); + + fState.Message(G4Analysis::kVL1, "mpi send", "Hn|Pn", + "on rank " + to_string(commRank) + + " destination rank: " + to_string(fHmpi->rank())); + + } else { + fState.Message(G4Analysis::kVL3, "mpi wait_histos", "Hn|Pn", + "on rank " + to_string(commRank) + + " destination rank: " + to_string(fHmpi->rank())); + + result &= Receive(nofActiveT, htVector, hnVector); + + fState.Message(G4Analysis::kVL1, "mpi wait_histos", "Hn|Pn", + "on rank " + to_string(commRank) + + " destination rank: " + to_string(fHmpi->rank())); + } + return result; +} diff --git a/source/analysis/hntools/include/G4P1ToolsManager.hh b/source/analysis/hntools/include/G4P1ToolsManager.hh index f058cc5365..40beaf7b44 100644 --- a/source/analysis/hntools/include/G4P1ToolsManager.hh +++ b/source/analysis/hntools/include/G4P1ToolsManager.hh @@ -26,7 +26,7 @@ // Manager class for tools::histo::P1d. // It implements functions specific to the P1 type -// (defined in g4tools). +// (defined in g4tools). // // Author: Ivana Hrivnacova, 24/07/2014 (ivana@ipno.in2p3.fr) @@ -42,10 +42,11 @@ #include #include #include +#include namespace tools { -namespace histo { -class p1d; +namespace histo { +class p1d; } } @@ -54,28 +55,29 @@ class G4P1ToolsManager : public G4VP1Manager, { public: explicit G4P1ToolsManager(const G4AnalysisManagerState& state); - virtual ~G4P1ToolsManager(); + G4P1ToolsManager() = delete; + virtual ~G4P1ToolsManager() = default; // Method to add profiles read from a file G4int AddP1(const G4String& name, tools::histo::p1d* p1d); // Method for merge (MT) void AddP1Vector(const std::vector& p1Vector); - + // Access methods // tools::histo::p1d* GetP1(G4int id, G4bool warn = true, G4bool onlyIfActive = true) const; - + // Iterators std::vector::iterator BeginP1(); std::vector::iterator EndP1(); std::vector::const_iterator BeginConstP1() const; std::vector::const_iterator EndConstP1() const; - + // Access to profile vector (needed for Write()) const std::vector& GetP1Vector() const; - const std::vector& GetHnVector() const; - + const std::vector& GetHnVector() const; + protected: // Virtual functions from base class // @@ -85,39 +87,39 @@ class G4P1ToolsManager : public G4VP1Manager, virtual G4int CreateP1(const G4String& name, const G4String& title, G4int nbins, G4double xmin, G4double xmax, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinScheme = "linear") final; virtual G4int CreateP1(const G4String& name, const G4String& title, const std::vector& edges, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none") final; - + virtual G4bool SetP1(G4int id, G4int nbins, G4double xmin, G4double xmax, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinScheme = "linear") final; virtual G4bool SetP1(G4int id, const std::vector& edges, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none") final; virtual G4bool ScaleP1(G4int id, G4double factor) final; - + // Method to fill profiles // - virtual G4bool FillP1(G4int id, G4double xvalue, G4double yvalue, + virtual G4bool FillP1(G4int id, G4double xvalue, G4double yvalue, G4double weight = 1.0) final; // Access methods @@ -146,24 +148,24 @@ class G4P1ToolsManager : public G4VP1Manager, virtual G4String GetP1YAxisTitle(G4int id) const final; // Write data on ASCII file - //virtual G4bool WriteOnAscii(std::ofstream& output) final; + virtual G4bool WriteOnAscii(std::ofstream& output) final; // Access to Hn manager virtual std::shared_ptr GetHnManager() final; private: - // methods + // Methods // - void AddP1Information(const G4String& name, - const G4String& xunitName, - const G4String& yunitName, + void AddP1Information(const G4String& name, + const G4String& xunitName, + const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, G4BinScheme xbinScheme) const; - // data members - //static constexpr G4int kDimension = 1; // not yet supported on vc12 - static const G4int kDimension; + // Static data members + static constexpr std::string_view fkClass { "G4P1ToolsManager" }; + static constexpr G4int fkDimension = 2; }; // inline methods @@ -174,11 +176,11 @@ inline std::vector::iterator G4P1ToolsManager::BeginP1() inline std::vector::iterator G4P1ToolsManager::EndP1() { return EndT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4P1ToolsManager::BeginConstP1() const { return BeginConstT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4P1ToolsManager::EndConstP1() const { return EndConstT(); } diff --git a/source/analysis/hntools/include/G4P2ToolsManager.hh b/source/analysis/hntools/include/G4P2ToolsManager.hh index 6ecdd8d22d..24dade5eb0 100644 --- a/source/analysis/hntools/include/G4P2ToolsManager.hh +++ b/source/analysis/hntools/include/G4P2ToolsManager.hh @@ -26,7 +26,7 @@ // Manager class for tools::histo::p2d. // It implements functions specific to the P2 type -// (defined in g4tools). +// (defined in g4tools). // // Author: Ivana Hrivnacova, 24/07/2014 (ivana@ipno.in2p3.fr) @@ -41,10 +41,11 @@ #include #include #include +#include namespace tools { -namespace histo { -class p2d; +namespace histo { +class p2d; } } @@ -53,13 +54,14 @@ class G4P2ToolsManager : public G4VP2Manager, { public: explicit G4P2ToolsManager(const G4AnalysisManagerState& state); - virtual ~G4P2ToolsManager(); + G4P2ToolsManager() = delete; + virtual ~G4P2ToolsManager() = default; // Method to add histograms read from a file G4int AddP2(const G4String& name, tools::histo::p2d* p2d); // Method for merge (MT) void AddP2Vector(const std::vector& p2Vector); - + // Access methods // tools::histo::p2d* GetP2(G4int id, G4bool warn = true, @@ -69,11 +71,11 @@ class G4P2ToolsManager : public G4VP2Manager, std::vector::iterator EndP2(); std::vector::const_iterator BeginConstP2() const; std::vector::const_iterator EndConstP2() const; - + // Access to histogram vector (needed for Write()) const std::vector& GetP2Vector() const; const std::vector& GetHnVector() const; - + protected: // Virtual functions from base class // @@ -81,61 +83,61 @@ class G4P2ToolsManager : public G4VP2Manager, // Methods to create histograms // virtual G4int CreateP2(const G4String& name, const G4String& title, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear") final; - + virtual G4int CreateP2(const G4String& name, const G4String& title, const std::vector& xedges, const std::vector& yedges, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none") final; - + virtual G4bool SetP2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear") final; - + virtual G4bool SetP2(G4int id, const std::vector& xedges, const std::vector& yedges, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none") final; virtual G4bool ScaleP2(G4int id, G4double factor) final; - + // Method to fill histograms // - virtual G4bool FillP2(G4int id, + virtual G4bool FillP2(G4int id, G4double xvalue, G4double yvalue, G4double zvalue, G4double weight = 1.0) final; - + // Methods to manipulate histograms // @@ -154,7 +156,7 @@ class G4P2ToolsManager : public G4VP2Manager, virtual G4double GetP2YWidth(G4int id) const final; virtual G4double GetP2Zmin(G4int id) const final; virtual G4double GetP2Zmax(G4int id) const final; - + // Setters for attributes for plotting virtual G4bool SetP2Title(G4int id, const G4String& title) final; virtual G4bool SetP2XAxisTitle(G4int id, const G4String& title) final; @@ -166,27 +168,27 @@ class G4P2ToolsManager : public G4VP2Manager, virtual G4String GetP2XAxisTitle(G4int id) const final; virtual G4String GetP2YAxisTitle(G4int id) const final; virtual G4String GetP2ZAxisTitle(G4int id) const final; - + // Write data on ASCII file virtual G4bool WriteOnAscii(std::ofstream& output) final; - + // Access to Hn manager virtual std::shared_ptr GetHnManager() final; private: - void AddP2Information(const G4String& name, - const G4String& xunitName, - const G4String& yunitName, - const G4String& zunitName, + void AddP2Information(const G4String& name, + const G4String& xunitName, + const G4String& yunitName, + const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, G4BinScheme xbinScheme, G4BinScheme ybinScheme) const; - - // data members - // static constexpr G4int kDimension = 2; // not yet supported on vc12 - static const G4int kDimension; + + // Static data members + static constexpr std::string_view fkClass { "G4P2ToolsManager" }; + static constexpr G4int fkDimension = 3; }; // inline methods @@ -197,11 +199,11 @@ inline std::vector::iterator G4P2ToolsManager::BeginP2() inline std::vector::iterator G4P2ToolsManager::EndP2() { return EndT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4P2ToolsManager::BeginConstP2() const { return BeginConstT(); } -inline std::vector::const_iterator +inline std::vector::const_iterator G4P2ToolsManager::EndConstP2() const { return EndConstT(); } @@ -211,7 +213,7 @@ inline const std::vector& G4P2ToolsManager::GetP2Vector() co inline const std::vector& G4P2ToolsManager::GetHnVector() const { return fHnManager->GetHnVector(); } -inline std::shared_ptr G4P2ToolsManager::GetHnManager() +inline std::shared_ptr G4P2ToolsManager::GetHnManager() { return std::shared_ptr(fHnManager); } #endif diff --git a/source/analysis/hntools/include/G4ToolsAnalysisManager.hh b/source/analysis/hntools/include/G4ToolsAnalysisManager.hh index 4bf4cb5700..0266233372 100644 --- a/source/analysis/hntools/include/G4ToolsAnalysisManager.hh +++ b/source/analysis/hntools/include/G4ToolsAnalysisManager.hh @@ -32,14 +32,16 @@ #define G4ToolsAnalysisManager_h 1 #include "G4VAnalysisManager.hh" +#include "G4ToolsAnalysisMessenger.hh" #include "globals.hh" -#include "tools/histo/h1d" -#include "tools/histo/h2d" -#include "tools/histo/h3d" -#include "tools/histo/p1d" -#include "tools/histo/p2d" -#include "tools/wroot/ntuple" +#include "tools/histo/h1d" +#include "tools/histo/h2d" +#include "tools/histo/h3d" +#include "tools/histo/p1d" +#include "tools/histo/p2d" + +#include class G4H1ToolsManager; class G4H2ToolsManager; @@ -49,17 +51,18 @@ class G4P2ToolsManager; namespace tools { namespace histo { -class hmpi; -} +class hmpi; } - +} + class G4ToolsAnalysisManager : public G4VAnalysisManager { + friend class G4ToolsAnalysisMessenger; + public: - explicit G4ToolsAnalysisManager(const G4String& type, G4bool isMaster = true); virtual ~G4ToolsAnalysisManager(); - - // static methods + + // Static methods static G4ToolsAnalysisManager* Instance(); static G4bool IsInstance(); @@ -80,56 +83,65 @@ class G4ToolsAnalysisManager : public G4VAnalysisManager std::vector::iterator EndH1(); std::vector::const_iterator BeginConstH1() const; std::vector::const_iterator EndConstH1() const; - + std::vector::iterator BeginH2(); std::vector::iterator EndH2(); std::vector::const_iterator BeginConstH2() const; std::vector::const_iterator EndConstH2() const; - + std::vector::iterator BeginH3(); std::vector::iterator EndH3(); std::vector::const_iterator BeginConstH3() const; std::vector::const_iterator EndConstH3() const; - + std::vector::iterator BeginP1(); std::vector::iterator EndP1(); std::vector::const_iterator BeginConstP1() const; std::vector::const_iterator EndConstP1() const; - + std::vector::iterator BeginP2(); std::vector::iterator EndP2(); std::vector::const_iterator BeginConstP2() const; std::vector::const_iterator EndConstP2() const; - - std::vector::iterator BeginNtuple(); - std::vector::iterator EndNtuple(); - std::vector::const_iterator BeginConstNtuple() const; - std::vector::const_iterator EndConstNtuple() const; protected: - // virtual methods from base class + explicit G4ToolsAnalysisManager(const G4String& type); + + // Virtual methods from base class virtual G4bool PlotImpl() final; virtual G4bool MergeImpl(tools::histo::hmpi* hmpi) final; - // methods - G4bool Reset(); + virtual G4bool WriteImpl() override; + virtual G4bool ResetImpl() override; + virtual void ClearImpl() override; - // static data members - static G4ThreadLocal G4ToolsAnalysisManager* fgToolsInstance; + // Methods + G4bool Merge(); + G4bool IsEmpty(); - // data members - G4H1ToolsManager* fH1Manager; - G4H2ToolsManager* fH2Manager; - G4H3ToolsManager* fH3Manager; - G4P1ToolsManager* fP1Manager; - G4P2ToolsManager* fP2Manager; + // Static data members + inline static G4ToolsAnalysisManager* fgMasterToolsInstance { nullptr }; + inline static G4ThreadLocal G4ToolsAnalysisManager* fgToolsInstance { nullptr }; + static constexpr std::string_view fkClass { "G4ToolsAnalysisManager" }; + + // Data members + G4H1ToolsManager* fH1Manager { nullptr }; + G4H2ToolsManager* fH2Manager { nullptr }; + G4H3ToolsManager* fH3Manager { nullptr }; + G4P1ToolsManager* fP1Manager { nullptr }; + G4P2ToolsManager* fP2Manager { nullptr }; private: - // // static data members - // static G4ThreadLocal G4ToolsAnalysisManager* fgToolsInstance; + // // Static data members + // Static G4ThreadLocal G4ToolsAnalysisManager* fgToolsInstance; + // Methods + template + G4bool WriteT(const std::vector& htVector, + const std::vector& hnVector); + // Data members + std::unique_ptr fMessenger; }; #include "G4ToolsAnalysisManager.icc" #endif - diff --git a/source/analysis/hntools/include/G4ToolsAnalysisManager.icc b/source/analysis/hntools/include/G4ToolsAnalysisManager.icc index c61d6e2cd3..62260a6391 100644 --- a/source/analysis/hntools/include/G4ToolsAnalysisManager.icc +++ b/source/analysis/hntools/include/G4ToolsAnalysisManager.icc @@ -24,6 +24,7 @@ // ******************************************************************** // +#include "G4HnInformation.hh" #include "G4H1ToolsManager.hh" #include "G4H2ToolsManager.hh" #include "G4H3ToolsManager.hh" @@ -31,41 +32,98 @@ #include "G4P2ToolsManager.hh" //_____________________________________________________________________________ -inline +template +inline +G4bool G4ToolsAnalysisManager::WriteT(const std::vector& htVector, + const std::vector& hnVector) +{ + auto result = true; + + for ( G4int i=0; iGetActivation(); + // skip writing if activation is enabled and H1 is inactivated + if ( fState.GetIsActivation() && ( ! activation ) ) continue; + + auto name = info->GetName(); + auto ht = htVector[i]; + + auto fileName = info->GetFileName(); + auto fileManager = GetFileManager(fileName); + + // skip writing if cannot get file manager (wrong file extension) + if ( ! fileManager ) { + G4Analysis::Warn( + "Cannot get file manager for file " + fileName + ".\n" + + "Writing " + G4Analysis::GetHnType() + " " + name + " will be skipped.", + fkClass, "WriteT"); + continue; + } + + auto fileKind = " in file "; + if ( fileName != "" ) { + fileKind = " in extra file "; + } else { + fileName = fileManager->GetFullFileName(); + } + + Message(G4Analysis::kVL4, "write", G4Analysis::GetHnType(), + name + fileKind + fileName); + + if ( ! fileManager->GetHnFileManager()->Write(ht, name, fileName) ) { + G4Analysis::Warn( + "Writing " + G4Analysis::GetHnType() + " " + name + + " to file " + fileName + " failed.", + fkClass, "WriteT"); + result = false; + } + + // notify that file has a written object + fileManager->SetIsEmpty(fileName, false); + + Message(G4Analysis::kVL3, "write", G4Analysis::GetHnType(), + name + " in the " + fileKind + " file " + fileName); + } + + return result; +} + +//_____________________________________________________________________________ +inline tools::histo::h1d* G4ToolsAnalysisManager::GetH1(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return fH1Manager->GetH1(id, warn, onlyIfActive); } //_____________________________________________________________________________ -inline +inline tools::histo::h2d* G4ToolsAnalysisManager::GetH2(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return fH2Manager->GetH2(id, warn, onlyIfActive); } //_____________________________________________________________________________ -inline +inline tools::histo::h3d* G4ToolsAnalysisManager::GetH3(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return fH3Manager->GetH3(id, warn, onlyIfActive); } //_____________________________________________________________________________ -inline +inline tools::histo::p1d* G4ToolsAnalysisManager::GetP1(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return fP1Manager->GetP1(id, warn, onlyIfActive); } //_____________________________________________________________________________ -inline +inline tools::histo::p2d* G4ToolsAnalysisManager::GetP2(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return fP2Manager->GetP2(id, warn, onlyIfActive); } @@ -75,148 +133,148 @@ inline std::vector::iterator G4ToolsAnalysisManager::BeginH1() { return fH1Manager->BeginH1(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4ToolsAnalysisManager::EndH1() { return fH1Manager->EndH1(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::BeginConstH1() const { return fH1Manager->BeginConstH1(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::EndConstH1() const { return fH1Manager->EndConstH1(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4ToolsAnalysisManager::BeginH2() { return fH2Manager->BeginH2(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4ToolsAnalysisManager::EndH2() { return fH2Manager->EndH2(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::BeginConstH2() const { return fH2Manager->BeginConstH2(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::EndConstH2() const { return fH2Manager->EndConstH2(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4ToolsAnalysisManager::BeginH3() { return fH3Manager->BeginH3(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4ToolsAnalysisManager::EndH3() { return fH3Manager->EndH3(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::BeginConstH3() const { return fH3Manager->BeginConstH3(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::EndConstH3() const { return fH3Manager->EndConstH3(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4ToolsAnalysisManager::BeginP1() { return fP1Manager->BeginP1(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4ToolsAnalysisManager::EndP1() { return fP1Manager->EndP1(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::BeginConstP1() const { return fP1Manager->BeginConstP1(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::EndConstP1() const { return fP1Manager->EndConstP1(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4ToolsAnalysisManager::BeginP2() { return fP2Manager->BeginP2(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4ToolsAnalysisManager::EndP2() { return fP2Manager->EndP2(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::BeginConstP2() const { return fP2Manager->BeginConstP2(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4ToolsAnalysisManager::EndConstP2() const { return fP2Manager->EndConstP2(); -} +} diff --git a/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorMessenger.hh b/source/analysis/hntools/include/G4ToolsAnalysisMessenger.hh similarity index 54% rename from environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorMessenger.hh rename to source/analysis/hntools/include/G4ToolsAnalysisMessenger.hh index 40ec817aaf..786a8f6981 100644 --- a/environments/g4py/tests/g4pytest/ExN03geom/ExN03DetectorMessenger.hh +++ b/source/analysis/hntools/include/G4ToolsAnalysisMessenger.hh @@ -23,52 +23,66 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // + +// The messenger class for tools objects getters. // -// -// +// Author: Ivana Hrivnacova, 29/10/2021 (ivana@ipno.in2p3.fr) -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +#ifndef G4ToolsAnalysisMessenger_h +#define G4ToolsAnalysisMessenger_h 1 -#ifndef ExN03DetectorMessenger_h -#define ExN03DetectorMessenger_h 1 - -#include "globals.hh" #include "G4UImessenger.hh" +#include "G4THnManager.hh" +#include "globals.hh" -class ExN03DetectorConstruction; -class G4UIdirectory; -class G4UIcmdWithAString; -class G4UIcmdWithAnInteger; -class G4UIcmdWithADoubleAndUnit; -class G4UIcmdWithoutParameter; +#include -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +class G4ToolsAnalysisManager; +class G4UIcommand; -class ExN03DetectorMessenger: public G4UImessenger +class G4ToolsAnalysisMessenger : public G4UImessenger { public: - ExN03DetectorMessenger(ExN03DetectorConstruction* ); - ~ExN03DetectorMessenger(); - - void SetNewValue(G4UIcommand*, G4String); - + explicit G4ToolsAnalysisMessenger(G4ToolsAnalysisManager* manager); + virtual ~G4ToolsAnalysisMessenger(); + + // Methods + G4String GetCurrentValue (G4UIcommand* command); + virtual void SetNewValue(G4UIcommand* command, G4String value) final; + private: - ExN03DetectorConstruction* ExN03Detector; - - G4UIdirectory* N03Dir; - G4UIdirectory* detDir; - G4UIcmdWithAString* AbsMaterCmd; - G4UIcmdWithAString* GapMaterCmd; - G4UIcmdWithADoubleAndUnit* AbsThickCmd; - G4UIcmdWithADoubleAndUnit* GapThickCmd; - G4UIcmdWithADoubleAndUnit* SizeYZCmd; - G4UIcmdWithAnInteger* NbLayersCmd; - G4UIcmdWithADoubleAndUnit* MagFieldCmd; - G4UIcmdWithoutParameter* UpdateCmd; + // Methods + template + G4String GetHnAddress(G4int id, G4THnManager* htManager) const; + + // Data members + G4ToolsAnalysisManager* fManager; ///< Associated class + std::unique_ptr fGetH1Cmd; + std::unique_ptr fGetH2Cmd; + std::unique_ptr fGetH3Cmd; + std::unique_ptr fGetP1Cmd; + std::unique_ptr fGetP2Cmd; + G4String fH1Value; + G4String fH2Value; + G4String fH3Value; + G4String fP1Value; + G4String fP2Value; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// inline functions + +template +inline +G4String G4ToolsAnalysisMessenger::GetHnAddress( + G4int id, G4THnManager* htManager) const +{ + auto ht = htManager->GetT(id); + if ( ht != nullptr ) { + std::ostringstream os; + os << static_cast(ht); + return os.str(); + } + return G4String(); +} #endif - diff --git a/source/analysis/hntools/include/G4ToolsAnalysisReader.hh b/source/analysis/hntools/include/G4ToolsAnalysisReader.hh index db4a8cff9d..3036fcb305 100644 --- a/source/analysis/hntools/include/G4ToolsAnalysisReader.hh +++ b/source/analysis/hntools/include/G4ToolsAnalysisReader.hh @@ -32,14 +32,14 @@ #define G4ToolsAnalysisReader_h 1 #include "G4VAnalysisReader.hh" +#include "G4THnManager.hh" #include "globals.hh" -#include "tools/histo/h1d" -#include "tools/histo/h2d" -#include "tools/histo/h3d" -#include "tools/histo/p1d" -#include "tools/histo/p2d" -#include "tools/wroot/ntuple" +#include "tools/histo/h1d" +#include "tools/histo/h2d" +#include "tools/histo/h3d" +#include "tools/histo/p1d" +#include "tools/histo/p2d" class G4H1ToolsManager; class G4H2ToolsManager; @@ -49,33 +49,55 @@ class G4P2ToolsManager; namespace tools { namespace histo { -class hmpi; -} +class hmpi; } - +} + class G4ToolsAnalysisReader : public G4VAnalysisReader { public: - explicit G4ToolsAnalysisReader(const G4String& type, G4bool isMaster = true); - virtual ~G4ToolsAnalysisReader(); - + virtual ~G4ToolsAnalysisReader() = default; + // Access methods tools::histo::h1d* GetH1(G4int id, G4bool warn = true) const; tools::histo::h2d* GetH2(G4int id, G4bool warn = true) const; tools::histo::h3d* GetH3(G4int id, G4bool warn = true) const; tools::histo::p1d* GetP1(G4int id, G4bool warn = true) const; tools::histo::p2d* GetP2(G4int id, G4bool warn = true) const; - + protected: - // methods + explicit G4ToolsAnalysisReader(const G4String& type); + + // Virtual methods from base class + virtual G4int ReadH1Impl(const G4String& h1Name, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; + virtual G4int ReadH2Impl(const G4String& h2Name, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; + virtual G4int ReadH3Impl(const G4String& h3Name, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; + virtual G4int ReadP1Impl(const G4String& p1Name, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; + virtual G4int ReadP2Impl(const G4String& p2Name, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; + + // Fuction specific to output type + template + G4int ReadTImpl(const G4String& htName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName, + G4THnManager* htManager); + + // Methods G4bool Reset(); - // data members - G4H1ToolsManager* fH1Manager; - G4H2ToolsManager* fH2Manager; - G4H3ToolsManager* fH3Manager; - G4P1ToolsManager* fP1Manager; - G4P2ToolsManager* fP2Manager; + // Static data members + static constexpr std::string_view fkClass { "G4ToolsAnalysisReader" }; + + // Data members + G4H1ToolsManager* fH1Manager { nullptr }; + G4H2ToolsManager* fH2Manager { nullptr }; + G4H3ToolsManager* fH3Manager { nullptr }; + G4P1ToolsManager* fP1Manager { nullptr }; + G4P2ToolsManager* fP2Manager { nullptr }; }; #include "G4ToolsAnalysisReader.icc" diff --git a/source/analysis/hntools/include/G4ToolsAnalysisReader.icc b/source/analysis/hntools/include/G4ToolsAnalysisReader.icc index 56c35f41bc..d383673296 100644 --- a/source/analysis/hntools/include/G4ToolsAnalysisReader.icc +++ b/source/analysis/hntools/include/G4ToolsAnalysisReader.icc @@ -29,38 +29,70 @@ #include "G4H3ToolsManager.hh" #include "G4P1ToolsManager.hh" #include "G4P2ToolsManager.hh" +#include "G4AnalysisUtilities.hh" //_____________________________________________________________________________ -inline -tools::histo::h1d* G4ToolsAnalysisReader::GetH1(G4int id, G4bool warn) const +template +inline +G4int G4ToolsAnalysisReader::ReadTImpl( + const G4String& htName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName, + G4THnManager* htManager) +{ + Message(G4Analysis::kVL4, "read", G4Analysis::GetHnType(), htName); + + // Read hn + auto ht = fVFileManager->GetHnRFileManager()->Read( + htName, fileName, dirName, isUserFileName); + + if ( ! ht ) { + G4Analysis::Warn( + "Streaming " + htName + " from file " + fileName + + " directory " + dirName + " failed.", + fkClass, "ReadTImpl"); + return G4Analysis::kInvalidId; + } + + auto id = htManager->RegisterT(static_cast(ht), htName); + + Message(G4Analysis::kVL2, "read", G4Analysis::GetHnType(), htName, + id > G4Analysis::kInvalidId); + + return id; + +} + +//_____________________________________________________________________________ +inline +tools::histo::h1d* G4ToolsAnalysisReader::GetH1(G4int id, G4bool warn) const { return fH1Manager->GetH1(id, warn, false); } //_____________________________________________________________________________ -inline -tools::histo::h2d* G4ToolsAnalysisReader::GetH2(G4int id, G4bool warn) const +inline +tools::histo::h2d* G4ToolsAnalysisReader::GetH2(G4int id, G4bool warn) const { return fH2Manager->GetH2(id, warn, false); } //_____________________________________________________________________________ -inline -tools::histo::h3d* G4ToolsAnalysisReader::GetH3(G4int id, G4bool warn) const +inline +tools::histo::h3d* G4ToolsAnalysisReader::GetH3(G4int id, G4bool warn) const { return fH3Manager->GetH3(id, warn, false); } //_____________________________________________________________________________ -inline -tools::histo::p1d* G4ToolsAnalysisReader::GetP1(G4int id, G4bool warn) const +inline +tools::histo::p1d* G4ToolsAnalysisReader::GetP1(G4int id, G4bool warn) const { return fP1Manager->GetP1(id, warn, false); } //_____________________________________________________________________________ -inline -tools::histo::p2d* G4ToolsAnalysisReader::GetP2(G4int id, G4bool warn) const +inline +tools::histo::p2d* G4ToolsAnalysisReader::GetP2(G4int id, G4bool warn) const { return fP2Manager->GetP2(id, warn, false); } diff --git a/source/analysis/hntools/include/g4hntools_defs.hh b/source/analysis/hntools/include/g4hntools_defs.hh index 67a9ea7d12..7f2439f1de 100644 --- a/source/analysis/hntools/include/g4hntools_defs.hh +++ b/source/analysis/hntools/include/g4hntools_defs.hh @@ -41,12 +41,12 @@ using G4H1Iterator = std::vector::iterator; using G4H1ConstIterator = std::vector::const_iterator; // H2 types -using G4H2 = tools::histo::h2d; +using G4H2 = tools::histo::h2d; using G4H2Iterator = std::vector::iterator; using G4H2ConstIterator = std::vector::const_iterator; // H3 types -using G4H3 = tools::histo::h3d; +using G4H3 = tools::histo::h3d; using G4H3Iterator = std::vector::iterator; using G4H3ConstIterator = std::vector::const_iterator; @@ -62,4 +62,4 @@ using G4P2ConstIterator = std::vector::const_iterator; #endif - + diff --git a/source/analysis/hntools/sources.cmake b/source/analysis/hntools/sources.cmake index f8b0f123a6..8cf84fa979 100644 --- a/source/analysis/hntools/sources.cmake +++ b/source/analysis/hntools/sources.cmake @@ -5,6 +5,7 @@ geant4_add_module(G4hntools PUBLIC_HEADERS G4BaseHistoUtilities.hh G4MPIToolsManager.hh + G4MPIToolsManager.icc G4H1ToolsManager.hh G4H2ToolsManager.hh G4H3ToolsManager.hh @@ -12,6 +13,7 @@ geant4_add_module(G4hntools G4P2ToolsManager.hh G4ToolsAnalysisManager.hh G4ToolsAnalysisManager.icc + G4ToolsAnalysisMessenger.hh G4ToolsAnalysisReader.hh G4ToolsAnalysisReader.icc g4hntools_defs.hh @@ -23,6 +25,7 @@ geant4_add_module(G4hntools G4P1ToolsManager.cc G4P2ToolsManager.cc G4ToolsAnalysisManager.cc + G4ToolsAnalysisMessenger.cc G4ToolsAnalysisReader.cc) geant4_module_link_libraries(G4hntools PUBLIC G4analysismng G4globman G4tools) diff --git a/source/analysis/hntools/src/G4BaseHistoUtilities.cc b/source/analysis/hntools/src/G4BaseHistoUtilities.cc index db02230f38..43a9a9ebfa 100644 --- a/source/analysis/hntools/src/G4BaseHistoUtilities.cc +++ b/source/analysis/hntools/src/G4BaseHistoUtilities.cc @@ -31,6 +31,8 @@ #include "tools/histo/axis" +using std::to_string; + namespace G4Analysis { @@ -38,7 +40,7 @@ namespace G4Analysis G4int GetNbins(const G4ToolsBaseHisto& baseHisto, G4int dimension) { return baseHisto.get_axis(dimension).bins(); -} +} //_____________________________________________________________________________ G4double GetMin(const G4ToolsBaseHisto& baseHisto, G4int dimension) @@ -46,7 +48,7 @@ G4double GetMin(const G4ToolsBaseHisto& baseHisto, G4int dimension) // Returns min data value return baseHisto.get_axis(dimension).lower_edge(); -} +} //_____________________________________________________________________________ G4double GetMax(const G4ToolsBaseHisto& baseHisto, G4int dimension) @@ -54,7 +56,7 @@ G4double GetMax(const G4ToolsBaseHisto& baseHisto, G4int dimension) // Returns max data value return baseHisto.get_axis(dimension).upper_edge(); -} +} //_____________________________________________________________________________ G4double GetWidth(const G4ToolsBaseHisto& baseHisto, G4int dimension, @@ -62,79 +64,68 @@ G4double GetWidth(const G4ToolsBaseHisto& baseHisto, G4int dimension, { auto nbins = baseHisto.get_axis(dimension).bins(); if ( ! nbins ) { - G4String functionName = "Get"; - functionName += hnType; - functionName += "Width"; - G4ExceptionDescription description; - description << " nbins = 0 (for " << hnType << ")."; - G4Exception(functionName, "Analysis_W014", JustWarning, description); + Warn("nbins = 0 ! for " + hnType, kNamespaceName, "GetWidth"); return 0.; - } - - return ( baseHisto.get_axis(dimension).upper_edge() + } + + return ( baseHisto.get_axis(dimension).upper_edge() - baseHisto.get_axis(dimension).lower_edge() )/nbins; -} +} //_____________________________________________________________________________ G4bool SetTitle(G4ToolsBaseHisto& baseHisto, const G4String& title) { return baseHisto.set_title(title); -} +} //_____________________________________________________________________________ -G4bool SetAxisTitle(G4ToolsBaseHisto& baseHisto, G4int dimension, +G4bool SetAxisTitle(G4ToolsBaseHisto& baseHisto, G4int dimension, const G4String& title) { if ( dimension == kX ) { baseHisto.add_annotation(tools::histo::key_axis_x_title(), title); } - else if ( dimension == kY ) { + else if ( dimension == kY ) { baseHisto.add_annotation(tools::histo::key_axis_y_title(), title); } - else if ( dimension == kZ ) { + else if ( dimension == kZ ) { baseHisto.add_annotation(tools::histo::key_axis_z_title(), title); } - + return true; -} +} //_____________________________________________________________________________ G4String GetTitle(const G4ToolsBaseHisto& baseHisto) { return baseHisto.title(); -} +} //_____________________________________________________________________________ G4String GetAxisTitle(const G4ToolsBaseHisto& baseHisto, G4int dimension, - const G4String& hnType) + const G4String& hnType) { G4String title; G4bool result = false; if ( dimension == kX ) { result = baseHisto.annotation(tools::histo::key_axis_x_title(), title); - } - else if ( dimension == kY ) { + } + else if ( dimension == kY ) { result = baseHisto.annotation(tools::histo::key_axis_y_title(), title); } - else if ( dimension == kZ ) { + else if ( dimension == kZ ) { result = baseHisto.annotation(tools::histo::key_axis_z_title(), title); } if ( ! result ) { - G4String axes("xyz"); - G4String axis = axes(dimension, 1); - G4String functionName = "Get"; - functionName += hnType; - functionName += axis; - functionName += "Title"; - G4ExceptionDescription description; - description << " Failed to get " << axis << " axis " << hnType << " title."; - G4Exception(functionName, "Analysis_W014", JustWarning, description); + Warn("Got wrong dimension " + to_string(dimension) + " for " + hnType, + kNamespaceName, "GetAxisTitle"); + return ""; } - - return title; -} -} + return title; +} + +} diff --git a/source/analysis/hntools/src/G4H1ToolsManager.cc b/source/analysis/hntools/src/G4H1ToolsManager.cc index 3858f1aaee..529ccf2888 100644 --- a/source/analysis/hntools/src/G4H1ToolsManager.cc +++ b/source/analysis/hntools/src/G4H1ToolsManager.cc @@ -36,9 +36,7 @@ #include using namespace G4Analysis; - -// static definitions -const G4int G4H1ToolsManager::kDimension = 1; +using std::to_string; // // Constructors, destructor @@ -50,10 +48,6 @@ G4H1ToolsManager::G4H1ToolsManager(const G4AnalysisManagerState& state) G4THnManager(state, "H1") {} -//_____________________________________________________________________________ -G4H1ToolsManager::~G4H1ToolsManager() -{} - // // Utility functions // @@ -63,7 +57,7 @@ namespace { //_____________________________________________________________________________ void UpdateH1Information(G4HnInformation* hnInformation, - const G4String& unitName, + const G4String& unitName, const G4String& fcnName, G4BinScheme binScheme) { @@ -72,45 +66,43 @@ void UpdateH1Information(G4HnInformation* hnInformation, //_____________________________________________________________________________ void AddH1Annotation(tools::histo::h1d* h1d, - const G4String& unitName, + const G4String& unitName, const G4String& fcnName) -{ +{ G4String axisTitle; - UpdateTitle(axisTitle, unitName, fcnName); + UpdateTitle(axisTitle, unitName, fcnName); h1d->add_annotation(tools::histo::key_axis_x_title(), axisTitle); -} +} //_____________________________________________________________________________ tools::histo::h1d* CreateToolsH1(const G4String& title, - G4int nbins, G4double xmin, G4double xmax, + G4int nbins, G4double xmin, G4double xmax, const G4String& unitName, const G4String& fcnName, - const G4String& binSchemeName) + const G4String& binSchemeName, + std::string_view className) { auto unit = GetUnitValue(unitName); auto fcn = GetFunction(fcnName); auto binScheme = GetBinScheme(binSchemeName); - + if ( binScheme != G4BinScheme::kLog ) { if ( binScheme == G4BinScheme::kUser ) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4H1ToolsManager::CreateH1", - "Analysis_W013", JustWarning, description); - } + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "CreateToolsH1"); + } return new tools::histo::h1d(title, nbins, fcn(xmin/unit), fcn(xmax/unit)); } else { // Compute edges std::vector edges; ComputeEdges(nbins, xmin, xmax, unit, fcn, binScheme, edges); - return new tools::histo::h1d(title, edges); + return new tools::histo::h1d(title, edges); } -} +} //_____________________________________________________________________________ tools::histo::h1d* CreateToolsH1(const G4String& title, @@ -121,19 +113,20 @@ tools::histo::h1d* CreateToolsH1(const G4String& title, auto unit = GetUnitValue(unitName); auto fcn = GetFunction(fcnName); - // Apply function + // Apply function std::vector newEdges; ComputeEdges(edges, unit, fcn, newEdges); - - return new tools::histo::h1d(title, newEdges); -} + + return new tools::histo::h1d(title, newEdges); +} //_____________________________________________________________________________ void ConfigureToolsH1(tools::histo::h1d* h1d, - G4int nbins, G4double xmin, G4double xmax, + G4int nbins, G4double xmin, G4double xmax, const G4String& unitName, const G4String& fcnName, - const G4String& binSchemeName) + const G4String& binSchemeName, + std::string_view className) { auto unit = GetUnitValue(unitName); auto fcn = GetFunction(fcnName); @@ -143,13 +136,11 @@ void ConfigureToolsH1(tools::histo::h1d* h1d, if ( binScheme == G4BinScheme::kUser ) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4H1ToolsManager::SetH1", - "Analysis_W013", JustWarning, description); - } + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "ConfigureToolsH1"); + + } h1d->configure(nbins, fcn(xmin/unit), fcn(xmax/unit)); } else { @@ -158,7 +149,7 @@ void ConfigureToolsH1(tools::histo::h1d* h1d, ComputeEdges(nbins, xmin, xmax, unit, fcn, binScheme, edges); h1d->configure(edges); } -} +} //_____________________________________________________________________________ void ConfigureToolsH1(tools::histo::h1d* h1d, @@ -177,21 +168,21 @@ void ConfigureToolsH1(tools::histo::h1d* h1d, } -// +// // private methods // //_____________________________________________________________________________ -void G4H1ToolsManager::AddH1Information(const G4String& name, - const G4String& unitName, +void G4H1ToolsManager::AddH1Information(const G4String& name, + const G4String& unitName, const G4String& fcnName, G4BinScheme binScheme) const { - auto hnInformation = fHnManager->AddHnInformation(name, kDimension); + auto hnInformation = fHnManager->AddHnInformation(name, fkDimension); hnInformation->AddDimension(unitName, fcnName, binScheme); -} +} -// +// // protected methods // @@ -201,88 +192,79 @@ G4int G4H1ToolsManager::CreateH1(const G4String& name, const G4String& title, const G4String& unitName, const G4String& fcnName, const G4String& binSchemeName) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "H1", name); -#endif - + Message(kVL4, "create", "H1", name); + // Create H1 auto h1d - = CreateToolsH1(title, nbins, xmin, xmax, unitName, fcnName, binSchemeName); - + = CreateToolsH1(title, nbins, xmin, xmax, unitName, fcnName, binSchemeName, + fkClass); + // Add annotation - AddH1Annotation(h1d, unitName, fcnName); - + AddH1Annotation(h1d, unitName, fcnName); + // Save H1 information auto binScheme = GetBinScheme(binSchemeName); AddH1Information(name, unitName, fcnName, binScheme); - - // Register histogram - auto id = RegisterT(h1d, name); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "H1", name); -#endif + + // Register histogram + auto id = RegisterT(h1d, name); + + Message(kVL2, "create", "H1", name); + return id; -} +} //_____________________________________________________________________________ G4int G4H1ToolsManager::CreateH1(const G4String& name, const G4String& title, const std::vector& edges, const G4String& unitName, const G4String& fcnName) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "H1", name); -#endif - auto h1d + Message(kVL4, "create", "H1", name); + + auto h1d = CreateToolsH1(title, edges, unitName, fcnName); - + // Add annotation - AddH1Annotation(h1d, unitName, fcnName); - + AddH1Annotation(h1d, unitName, fcnName); + // Save H1 information AddH1Information(name, unitName, fcnName, G4BinScheme::kUser); - - // Register histogram - auto id = RegisterT(h1d, name); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "H1", name); -#endif + + // Register histogram + auto id = RegisterT(h1d, name); + + Message(kVL2, "create", "H1", name); + return id; -} +} //_____________________________________________________________________________ G4bool G4H1ToolsManager::SetH1(G4int id, G4int nbins, G4double xmin, G4double xmax, const G4String& unitName, const G4String& fcnName, const G4String& binSchemeName) -{ +{ auto h1d = GetTInFunction(id, "SetH1", false, false); if ( ! h1d ) return false; auto info = fHnManager->GetHnInformation(id,"SetH1"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "H1", info->GetName()); -#endif + + Message(kVL4, "configure", "H1", info->GetName()); // Configure tools h1 - ConfigureToolsH1(h1d, nbins, xmin, xmax, unitName, fcnName, binSchemeName); + ConfigureToolsH1(h1d, nbins, xmin, xmax, unitName, fcnName, binSchemeName, + fkClass); // Add annotation - AddH1Annotation(h1d, unitName, fcnName); - + AddH1Annotation(h1d, unitName, fcnName); + // Update information auto binScheme = GetBinScheme(binSchemeName); UpdateH1Information(info, unitName, fcnName, binScheme); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } @@ -296,27 +278,25 @@ G4bool G4H1ToolsManager::SetH1(G4int id, if ( ! h1d ) return false; auto info = fHnManager->GetHnInformation(id,"SetH1"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "H1", info->GetName()); -#endif + + Message(kVL4, "configure", "H1", info->GetName()); // Configure tools h1 ConfigureToolsH1(h1d, edges, unitName, fcnName); - - // Add annotation - AddH1Annotation(h1d, unitName, fcnName); - // Update information + // Add annotation + AddH1Annotation(h1d, unitName, fcnName); + + // Update information UpdateH1Information(info, unitName, fcnName, G4BinScheme::kUser); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } - - + + //_____________________________________________________________________________ G4bool G4H1ToolsManager::ScaleH1(G4int id, G4double factor) { @@ -324,7 +304,7 @@ G4bool G4H1ToolsManager::ScaleH1(G4int id, G4double factor) if ( ! h1d ) return false; return h1d->scale(factor); -} +} //_____________________________________________________________________________ G4bool G4H1ToolsManager::FillH1(G4int id, G4double value, G4double weight) @@ -333,22 +313,21 @@ G4bool G4H1ToolsManager::FillH1(G4int id, G4double value, G4double weight) if ( ! h1d ) return false; if ( fState.GetIsActivation() && ( ! fHnManager->GetActivation(id) ) ) { - //G4cout << "Skipping FillH1 for " << id << G4endl; - return false; - } + //G4cout << "Skipping FillH1 for " << id << G4endl; + return false; + } - auto info + auto info = fHnManager->GetHnDimensionInformation(id, kX, "FillH1"); h1d->fill(info->fFcn(value/info->fUnit), weight); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " id " << id << " value " << value - << " fcn(value/unit) " << info->fFcn(value/info->fUnit) - << " weight " << weight; - fState.GetVerboseL4()->Message("fill", "H1", description); - } -#endif + + if ( IsVerbose(kVL4) ) { + Message(kVL4, "fill", "H1", + " id " + to_string(id) + " value " + to_string(value) + + " fcn(value/unit) " + to_string(info->fFcn(value/info->fUnit)) + + " weight " + to_string(weight)); + } + return true; } @@ -356,16 +335,16 @@ G4bool G4H1ToolsManager::FillH1(G4int id, G4double value, G4double weight) G4int G4H1ToolsManager::GetH1Id(const G4String& name, G4bool warn) const { return GetTId(name, warn); -} +} //_____________________________________________________________________________ G4int G4H1ToolsManager::GetH1Nbins(G4int id) const { auto h1d = GetTInFunction(id, "GetH1Nbins"); if ( ! h1d ) return 0; - + return GetNbins(*h1d, kX); -} +} //_____________________________________________________________________________ G4double G4H1ToolsManager::GetH1Xmin(G4int id) const @@ -374,82 +353,82 @@ G4double G4H1ToolsManager::GetH1Xmin(G4int id) const auto h1d = GetTInFunction(id, "GetH1Xmin"); if ( ! h1d ) return 0.; - + return GetMin(*h1d, kX); -} +} //_____________________________________________________________________________ G4double G4H1ToolsManager::GetH1Xmax(G4int id) const { auto h1d = GetTInFunction(id, "GetH1Xmax"); if ( ! h1d ) return 0.; - + return GetMax(*h1d, kX); -} +} //_____________________________________________________________________________ G4double G4H1ToolsManager::GetH1Width(G4int id) const { auto h1d = GetTInFunction(id, "GetH1XWidth", true, false); if ( ! h1d ) return 0.; - + return GetWidth(*h1d, kX, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4bool G4H1ToolsManager::SetH1Title(G4int id, const G4String& title) { auto h1d = GetTInFunction(id, "SetH1Title"); if ( ! h1d ) return false; - + return SetTitle(*h1d, title); -} +} //_____________________________________________________________________________ G4bool G4H1ToolsManager::SetH1XAxisTitle(G4int id, const G4String& title) { auto h1d = GetTInFunction(id, "SetH1XAxisTitle"); if ( ! h1d ) return false; - + return SetAxisTitle(*h1d, kX, title); -} +} //_____________________________________________________________________________ G4bool G4H1ToolsManager::SetH1YAxisTitle(G4int id, const G4String& title) { auto h1d = GetTInFunction(id, "SetH1YAxisTitle"); if ( ! h1d ) return false; - + return SetAxisTitle(*h1d, kY, title); -} +} //_____________________________________________________________________________ G4String G4H1ToolsManager::GetH1Title(G4int id) const { auto h1d = GetTInFunction(id, "GetH1Title"); if ( ! h1d ) return ""; - + return GetTitle(*h1d); -} +} //_____________________________________________________________________________ -G4String G4H1ToolsManager::GetH1XAxisTitle(G4int id) const +G4String G4H1ToolsManager::GetH1XAxisTitle(G4int id) const { auto h1d = GetTInFunction(id, "GetH1XAxisTitle"); if ( ! h1d ) return ""; - + return GetAxisTitle(*h1d, kX, fHnManager->GetHnType()); } //_____________________________________________________________________________ -G4String G4H1ToolsManager::GetH1YAxisTitle(G4int id) const +G4String G4H1ToolsManager::GetH1YAxisTitle(G4int id) const { auto h1d = GetTInFunction(id, "GetH1YAxisTitle"); if ( ! h1d ) return ""; - + return GetAxisTitle(*h1d, kY, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4bool G4H1ToolsManager::WriteOnAscii(std::ofstream& output) @@ -458,58 +437,53 @@ G4bool G4H1ToolsManager::WriteOnAscii(std::ofstream& output) // According to the implementation by Michel Maire, originally in // extended examples. - // h1 histograms + // Do nothing if no histograms are selected + if ( ! fHnManager->IsAscii() ) return true; + + // Write h1 histograms for ( G4int i=0; iGetFirstId(); - auto info = fHnManager->GetHnInformation(id,"WriteOnAscii"); + auto info = fHnManager->GetHnInformation(id,"WriteOnAscii"); // skip writing if activation is enabled and H1 is inactivated - if ( ! info->GetAscii() ) continue; + if ( ! info->GetAscii() ) continue; auto h1 = fTVector[i]; -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3()->Message("write on ascii", "h1d", info->GetName()); -#endif - - output << "\n 1D histogram " << id << ": " << h1->title() - << "\n \n \t X \t\t Y" << G4endl; - + Message(kVL3, "write on ascii", "h1d", info->GetName()); + + output << "\n 1D histogram " << id << ": " << h1->title() + << "\n \n \t X \t\t Bin Height" << G4endl; + for (G4int j=0; j< G4int(h1->axis().bins()); ++j) { - output << " " << j << "\t" + output << " " << j << "\t" << h1->axis().bin_center(j) << "\t" << h1->bin_height(j) << G4endl; - } + } } - - return true; -} -// + return output.good(); +} + +// // public methods // //_____________________________________________________________________________ G4int G4H1ToolsManager::AddH1(const G4String& name, tools::histo::h1d* h1d) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("add", "H1", name); -#endif - + Message(kVL4, "add", "H1", name); + // Add annotation - AddH1Annotation(h1d, "none", "none"); + AddH1Annotation(h1d, "none", "none"); // Add information AddH1Information(name, "none", "none", G4BinScheme::kLinear); - - // Register histogram - auto id = RegisterT(h1d, name); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("add", "H1", name); -#endif + + // Register histogram + auto id = RegisterT(h1d, name); + + Message(kVL2, "add", "H1", name); + return id; -} +} //_____________________________________________________________________________ @@ -517,11 +491,11 @@ void G4H1ToolsManager::AddH1Vector( const std::vector& h1Vector) { AddTVector(h1Vector); -} +} //_____________________________________________________________________________ tools::histo::h1d* G4H1ToolsManager::GetH1(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return GetTInFunction(id, "GetH1", warn, onlyIfActive); } diff --git a/source/analysis/hntools/src/G4H2ToolsManager.cc b/source/analysis/hntools/src/G4H2ToolsManager.cc index eb6b16d5a8..04a33faf1c 100644 --- a/source/analysis/hntools/src/G4H2ToolsManager.cc +++ b/source/analysis/hntools/src/G4H2ToolsManager.cc @@ -36,9 +36,7 @@ #include using namespace G4Analysis; - -// static definitions -const G4int G4H2ToolsManager::kDimension = 2; +using std::to_string; //_____________________________________________________________________________ G4H2ToolsManager::G4H2ToolsManager(const G4AnalysisManagerState& state) @@ -46,10 +44,6 @@ G4H2ToolsManager::G4H2ToolsManager(const G4AnalysisManagerState& state) G4THnManager(state, "H2") {} -//_____________________________________________________________________________ -G4H2ToolsManager::~G4H2ToolsManager() -{} - // // Utility functions // @@ -58,8 +52,8 @@ namespace { //_____________________________________________________________________________ void UpdateH2Information(G4HnInformation* hnInformation, - const G4String& xunitName, - const G4String& yunitName, + const G4String& xunitName, + const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, G4BinScheme xbinScheme, @@ -67,23 +61,23 @@ void UpdateH2Information(G4HnInformation* hnInformation, { hnInformation->SetDimension(kX, xunitName, xfcnName, xbinScheme); hnInformation->SetDimension(kY, yunitName, yfcnName, ybinScheme); -} - +} + //_____________________________________________________________________________ void AddH2Annotation(tools::histo::h2d* h2d, - const G4String& xunitName, - const G4String& yunitName, + const G4String& xunitName, + const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName) -{ +{ G4String xaxisTitle; G4String yaxisTitle; - UpdateTitle(xaxisTitle, xunitName, xfcnName); - UpdateTitle(yaxisTitle, yunitName, yfcnName); + UpdateTitle(xaxisTitle, xunitName, xfcnName); + UpdateTitle(yaxisTitle, yunitName, yfcnName); h2d->add_annotation(tools::histo::key_axis_x_title(), xaxisTitle); h2d->add_annotation(tools::histo::key_axis_y_title(), yaxisTitle); -} - +} + //_____________________________________________________________________________ tools::histo::h2d* CreateToolsH2( const G4String& title, @@ -91,10 +85,12 @@ tools::histo::h2d* CreateToolsH2( G4int nybins, G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, - const G4String& xfcnName, + const G4String& xfcnName, const G4String& yfcnName, const G4String& xbinSchemeName, - const G4String& ybinSchemeName) + const G4String& ybinSchemeName, + std::string_view className) + { auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); @@ -102,22 +98,19 @@ tools::histo::h2d* CreateToolsH2( auto yfcn = GetFunction(yfcnName); auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); - + if ( xbinScheme != G4BinScheme::kLog && ybinScheme != G4BinScheme::kLog) { if ( xbinScheme == G4BinScheme::kUser || ybinScheme == G4BinScheme::kUser) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4H2ToolsManager::CreateH2", - "Analysis_W013", JustWarning, description); - } - return new tools::histo::h2d(title, - nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "CreateToolsH2"); + } + return new tools::histo::h2d(title, + nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), nybins, yfcn(ymin/yunit), yfcn(ymax/yunit)); - // h2 objects are deleted in destructor and reset when + // h2 objects are deleted in destructor and reset when // closing a file. } else { @@ -126,9 +119,9 @@ tools::histo::h2d* CreateToolsH2( ComputeEdges(nxbins, xmin, xmax, xunit, xfcn, xbinScheme, xedges); std::vector yedges; ComputeEdges(nybins, ymin, ymax, yunit, yfcn, ybinScheme, yedges); - return new tools::histo::h2d(title, xedges, yedges); + return new tools::histo::h2d(title, xedges, yedges); } -} +} //_____________________________________________________________________________ tools::histo::h2d* CreateToolsH2( @@ -139,22 +132,22 @@ tools::histo::h2d* CreateToolsH2( const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName) -{ +{ auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); auto xfcn = GetFunction(xfcnName); auto yfcn = GetFunction(yfcnName); - // Apply function + // Apply function std::vector xnewEdges; ComputeEdges(xedges, xunit, xfcn, xnewEdges); std::vector ynewEdges; ComputeEdges(yedges, yunit, yfcn, ynewEdges); - - return new tools::histo::h2d(title, xnewEdges, ynewEdges); - // h2 objects are deleted in destructor and reset when + + return new tools::histo::h2d(title, xnewEdges, ynewEdges); + // h2 objects are deleted in destructor and reset when // closing a file. -} +} //_____________________________________________________________________________ void ConfigureToolsH2(tools::histo::h2d* h2d, @@ -162,10 +155,11 @@ void ConfigureToolsH2(tools::histo::h2d* h2d, G4int nybins, G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, - const G4String& xfcnName, + const G4String& xfcnName, const G4String& yfcnName, const G4String& xbinSchemeName, - const G4String& ybinSchemeName) + const G4String& ybinSchemeName, + std::string_view className) { auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); @@ -173,19 +167,16 @@ void ConfigureToolsH2(tools::histo::h2d* h2d, auto yfcn = GetFunction(yfcnName); auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); - + if ( xbinScheme != G4BinScheme::kLog && ybinScheme != G4BinScheme::kLog) { if ( xbinScheme == G4BinScheme::kUser || ybinScheme == G4BinScheme::kUser) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4H2ToolsManager::CreateH2", - "Analysis_W013", JustWarning, description); - } - h2d->configure(nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "ConfigureToolsH2"); + } + h2d->configure(nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), nybins, yfcn(ymin/yunit), yfcn(ymax/yunit)); } else { @@ -196,7 +187,7 @@ void ConfigureToolsH2(tools::histo::h2d* h2d, ComputeEdges(nybins, ymin, ymax, yunit, yfcn, ybinScheme, yedges); h2d->configure(xedges, yedges); } -} +} //_____________________________________________________________________________ void ConfigureToolsH2(tools::histo::h2d* h2d, @@ -228,20 +219,20 @@ void ConfigureToolsH2(tools::histo::h2d* h2d, // //_____________________________________________________________________________ -void G4H2ToolsManager::AddH2Information(const G4String& name, - const G4String& xunitName, - const G4String& yunitName, +void G4H2ToolsManager::AddH2Information(const G4String& name, + const G4String& xunitName, + const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, G4BinScheme xbinScheme, G4BinScheme ybinScheme) const { - auto hnInformation = fHnManager->AddHnInformation(name, 2); + auto hnInformation = fHnManager->AddHnInformation(name, fkDimension); hnInformation->AddDimension(xunitName, xfcnName, xbinScheme); hnInformation->AddDimension(yunitName, yfcnName, ybinScheme); -} +} -// +// // protected methods // @@ -251,38 +242,33 @@ G4int G4H2ToolsManager::CreateH2(const G4String& name, const G4String& title, G4int nybins, G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName) - + { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "H2", name); -#endif + Message(kVL4, "create", "H2", name); + tools::histo::h2d* h2d - = CreateToolsH2(title, nxbins, xmin, xmax, nybins, ymin, ymax, - xunitName, yunitName, xfcnName, yfcnName, - xbinSchemeName, ybinSchemeName); - + = CreateToolsH2(title, nxbins, xmin, xmax, nybins, ymin, ymax, + xunitName, yunitName, xfcnName, yfcnName, + xbinSchemeName, ybinSchemeName, fkClass); + // Add annotation - AddH2Annotation(h2d, xunitName, yunitName, xfcnName, yfcnName); - + AddH2Annotation(h2d, xunitName, yunitName, xfcnName, yfcnName); + // Save H2 information auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); AddH2Information( name, xunitName, yunitName, xfcnName, yfcnName, xbinScheme, ybinScheme); - - // Register histogram - G4int id = RegisterT(h2d, name); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "H2", name); -#endif + // Register histogram + G4int id = RegisterT(h2d, name); + + Message(kVL2, "create", "H2", name); return id; -} +} //_____________________________________________________________________________ G4int G4H2ToolsManager::CreateH2(const G4String& name, const G4String& title, @@ -290,60 +276,54 @@ G4int G4H2ToolsManager::CreateH2(const G4String& name, const G4String& title, const std::vector& yedges, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName) - + { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "H2", name); -#endif + Message(kVL4, "create", "H2", name); + tools::histo::h2d* h2d - = CreateToolsH2(title, xedges, yedges, - xunitName, yunitName, xfcnName, yfcnName); - + = CreateToolsH2(title, xedges, yedges, + xunitName, yunitName, xfcnName, yfcnName); + // Add annotation - AddH2Annotation(h2d, xunitName, yunitName, xfcnName, yfcnName); - + AddH2Annotation(h2d, xunitName, yunitName, xfcnName, yfcnName); + // Save H2 information AddH2Information( name, xunitName, yunitName, xfcnName, yfcnName, G4BinScheme::kUser, G4BinScheme::kUser); - - // Register histogram - G4int id = RegisterT(h2d, name); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "H2", name); -#endif + // Register histogram + G4int id = RegisterT(h2d, name); + + Message(kVL2, "create", "H2", name); return id; -} +} //_____________________________________________________________________________ G4bool G4H2ToolsManager::SetH2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName) -{ +{ auto h2d = GetTInFunction(id, "SetH2", false, false); if ( ! h2d ) return false; auto info = fHnManager->GetHnInformation(id, "SetH2"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "H2", info->GetName()); -#endif + + Message(kVL4, "configure", "H2", info->GetName()); // Configure tools h2 ConfigureToolsH2( - h2d, nxbins, xmin, xmax, nybins, ymin, ymax, - xunitName, yunitName, xfcnName, yfcnName, xbinSchemeName, ybinSchemeName); + h2d, nxbins, xmin, xmax, nybins, ymin, ymax, + xunitName, yunitName, xfcnName, yfcnName, xbinSchemeName, ybinSchemeName, + fkClass); // Add annotation - AddH2Annotation(h2d, xunitName, yunitName, xfcnName, yfcnName); - + AddH2Annotation(h2d, xunitName, yunitName, xfcnName, yfcnName); + // Update information auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); @@ -351,43 +331,41 @@ G4bool G4H2ToolsManager::SetH2(G4int id, info, xunitName, yunitName, xfcnName, yfcnName, xbinScheme, ybinScheme); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } - + //_____________________________________________________________________________ G4bool G4H2ToolsManager::SetH2(G4int id, const std::vector& xedges, const std::vector& yedges, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName) -{ +{ auto h2d = GetTInFunction(id, "SetH2", false, false); if ( ! h2d ) return false; auto info = fHnManager->GetHnInformation(id, "SetH2"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "H2", info->GetName()); -#endif + + Message(kVL4, "configure", "H2", info->GetName()); // Configure tools h2 ConfigureToolsH2(h2d, xedges, yedges, xunitName, yunitName, xfcnName, yfcnName); // Add annotation - AddH2Annotation(h2d, xunitName, yunitName, xfcnName, yfcnName); - + AddH2Annotation(h2d, xunitName, yunitName, xfcnName, yfcnName); + // Update information UpdateH2Information( info, xunitName, yunitName, xfcnName, yfcnName, G4BinScheme::kUser, G4BinScheme::kUser); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } - + //_____________________________________________________________________________ G4bool G4H2ToolsManager::ScaleH2(G4int id, G4double factor) { @@ -395,39 +373,38 @@ G4bool G4H2ToolsManager::ScaleH2(G4int id, G4double factor) if ( ! h2d ) return false; return h2d->scale(factor); -} - +} + //_____________________________________________________________________________ -G4bool G4H2ToolsManager::FillH2(G4int id, - G4double xvalue, G4double yvalue, - G4double weight) +G4bool G4H2ToolsManager::FillH2(G4int id, + G4double xvalue, G4double yvalue, + G4double weight) { auto h2d = GetTInFunction(id, "FillH2", true, false); if ( ! h2d ) return false; if ( fState.GetIsActivation() && ( ! fHnManager->GetActivation(id) ) ) { - return false; - } + return false; + } - G4HnDimensionInformation* xInfo + G4HnDimensionInformation* xInfo = fHnManager->GetHnDimensionInformation(id, kX, "FillH2"); - G4HnDimensionInformation* yInfo + G4HnDimensionInformation* yInfo = fHnManager->GetHnDimensionInformation(id, kY, "FillH2"); - h2d->fill(xInfo->fFcn(xvalue/xInfo->fUnit), + h2d->fill(xInfo->fFcn(xvalue/xInfo->fUnit), yInfo->fFcn(yvalue/yInfo->fUnit), weight); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " id " << id - << " xvalue " << xvalue - << " xfcn(xvalue/xunit) " << xInfo->fFcn(xvalue/xInfo->fUnit) - << " yvalue " << yvalue - << " yfcn(yvalue/yunit) " << yInfo->fFcn(yvalue/yInfo->fUnit) - << " weight " << weight; - fState.GetVerboseL4()->Message("fill", "H2", description); - } -#endif + + if ( IsVerbose(kVL4) ) { + Message(kVL4, "fill", "H2", + " id " + to_string(id) + + " xvalue " + to_string(xvalue) + + " xfcn(xvalue/xunit) " + to_string(xInfo->fFcn(xvalue/xInfo->fUnit)) + + " yvalue " + to_string(yvalue) + + " yfcn(yvalue/yunit) " + to_string(yInfo->fFcn(yvalue/yInfo->fUnit)) + + " weight " + to_string(weight)); + } + return true; } @@ -435,16 +412,16 @@ G4bool G4H2ToolsManager::FillH2(G4int id, G4int G4H2ToolsManager::GetH2Id(const G4String& name, G4bool warn) const { return GetTId(name, warn); -} - +} + //_____________________________________________________________________________ G4int G4H2ToolsManager::GetH2Nxbins(G4int id) const { auto h2d = GetTInFunction(id, "GetH2NXbins"); if ( ! h2d ) return 0; - + return GetNbins(*h2d, kX); -} +} //_____________________________________________________________________________ G4double G4H2ToolsManager::GetH2Xmin(G4int id) const @@ -453,36 +430,36 @@ G4double G4H2ToolsManager::GetH2Xmin(G4int id) const auto h2d = GetTInFunction(id, "GetH2Xmin"); if ( ! h2d ) return 0.; - + return GetMin(*h2d, kX); -} +} //_____________________________________________________________________________ G4double G4H2ToolsManager::GetH2Xmax(G4int id) const { auto h2d = GetTInFunction(id, "GetH2Xmax"); if ( ! h2d ) return 0.; - + return GetMax(*h2d, kX); -} +} //_____________________________________________________________________________ G4double G4H2ToolsManager::GetH2XWidth(G4int id) const { auto h2d = GetTInFunction(id, "GetH2XWidth", true, false); if ( ! h2d ) return 0.; - + return GetWidth(*h2d, kX, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4int G4H2ToolsManager::GetH2Nybins(G4int id) const { auto h2d = GetTInFunction(id, "GetH2NYbins"); if ( ! h2d ) return 0; - + return GetNbins(*h2d, kY); -} +} //_____________________________________________________________________________ G4double G4H2ToolsManager::GetH2Ymin(G4int id) const @@ -491,148 +468,166 @@ G4double G4H2ToolsManager::GetH2Ymin(G4int id) const auto h2d = GetTInFunction(id, "GetH2Ymin"); if ( ! h2d ) return 0.; - + return GetMin(*h2d, kY); -} +} //_____________________________________________________________________________ G4double G4H2ToolsManager::GetH2Ymax(G4int id) const { auto h2d = GetTInFunction(id, "GetH2Ymax"); if ( ! h2d ) return 0.; - + return GetMax(*h2d, kY); -} +} //_____________________________________________________________________________ G4double G4H2ToolsManager::GetH2YWidth(G4int id) const { auto h2d = GetTInFunction(id, "GetH2YWidth", true, false); if ( ! h2d ) return 0.; - + return GetWidth(*h2d, kY, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4bool G4H2ToolsManager::SetH2Title(G4int id, const G4String& title) { auto h2d = GetTInFunction(id, "SetH2Title"); if ( ! h2d ) return false; - + return SetTitle(*h2d, title); -} +} //_____________________________________________________________________________ G4bool G4H2ToolsManager::SetH2XAxisTitle(G4int id, const G4String& title) { auto h2d = GetTInFunction(id, "SetH2XAxisTitle"); if ( ! h2d ) return false; - + return SetAxisTitle(*h2d, kX, title); -} +} //_____________________________________________________________________________ G4bool G4H2ToolsManager::SetH2YAxisTitle(G4int id, const G4String& title) { auto h2d = GetTInFunction(id, "SetH2YAxisTitle"); if ( ! h2d ) return false; - + return SetAxisTitle(*h2d, kY, title); -} +} //_____________________________________________________________________________ G4bool G4H2ToolsManager::SetH2ZAxisTitle(G4int id, const G4String& title) { auto h2d = GetTInFunction(id, "SetH2ZAxisTitle"); if ( ! h2d ) return false; - + return SetAxisTitle(*h2d, kZ, title); -} +} //_____________________________________________________________________________ G4String G4H2ToolsManager::GetH2Title(G4int id) const { auto h2d = GetTInFunction(id, "GetH2Title"); if ( ! h2d ) return ""; - + return GetTitle(*h2d); -} +} //_____________________________________________________________________________ -G4String G4H2ToolsManager::GetH2XAxisTitle(G4int id) const +G4String G4H2ToolsManager::GetH2XAxisTitle(G4int id) const { auto h2d = GetTInFunction(id, "GetH2XAxisTitle"); if ( ! h2d ) return ""; - + return GetAxisTitle(*h2d, kX, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4String G4H2ToolsManager::GetH2YAxisTitle(G4int id) const +G4String G4H2ToolsManager::GetH2YAxisTitle(G4int id) const { auto h2d = GetTInFunction(id, "GetH2YAxisTitle"); if ( ! h2d ) return ""; - + return GetAxisTitle(*h2d, kY, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4String G4H2ToolsManager::GetH2ZAxisTitle(G4int id) const +G4String G4H2ToolsManager::GetH2ZAxisTitle(G4int id) const { auto h2d = GetTInFunction(id, "GetH2ZAxisTitle"); if ( ! h2d ) return ""; - + return GetAxisTitle(*h2d, kZ, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4bool G4H2ToolsManager::WriteOnAscii(std::ofstream& /*output*/) +G4bool G4H2ToolsManager::WriteOnAscii(std::ofstream& output) { // Write selected objects on ASCII file -// According to the implementation by Michel Maire, originally in -// extended examples. -// Not yet available for H2 - return ! fHnManager->IsAscii(); -} + // Do nothing if no histograms are selected + if ( ! fHnManager->IsAscii() ) return true; + + // Write h2 histograms + for ( G4int i=0; iGetFirstId(); + auto info = fHnManager->GetHnInformation(id,"WriteOnAscii"); + // skip writing if activation is enabled and H1 is inactivated + if ( ! info->GetAscii() ) continue; + auto h2 = fTVector[i]; + + Message(kVL3, "write on ascii", "h2d", info->GetName()); + + output << "\n 2D histogram " << id << ": " << h2->title() + << "\n \n \t \t X \t\t Y \t\t Bin Height" << G4endl; + + for (G4int j=0; j< G4int(h2->axis_x().bins()); ++j) { + for (G4int k=0; k< G4int(h2->axis_y().bins()); ++k) { + output << " " << j << "\t" << k << "\t" + << h2->axis_x().bin_center(j) << "\t" + << h2->axis_y().bin_center(k) << "\t" + << h2->bin_height(j, k) << G4endl; + } + } + } + + return output.good(); +} // // public methods -// +// //_____________________________________________________________________________ G4int G4H2ToolsManager::AddH2(const G4String& name, tools::histo::h2d* h2d) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("add", "H2", name); -#endif + Message(kVL4, "add", "H2", name); // Add annotation - AddH2Annotation(h2d, "none", "none", "none", "none"); + AddH2Annotation(h2d, "none", "none", "none", "none"); // Add information - AddH2Information(name, "none", "none", "none", "none", + AddH2Information(name, "none", "none", "none", "none", G4BinScheme::kLinear, G4BinScheme::kLinear); - - // Register histogram - G4int id = RegisterT(h2d, name); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("add", "H2", name); -#endif + + // Register histogram + G4int id = RegisterT(h2d, name); + + Message(kVL2, "add", "H2", name); + return id; -} +} //_____________________________________________________________________________ void G4H2ToolsManager::AddH2Vector( const std::vector& h2Vector) { AddTVector(h2Vector); -} +} //_____________________________________________________________________________ tools::histo::h2d* G4H2ToolsManager::GetH2(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return GetTInFunction(id, "GetH2", warn, onlyIfActive); } diff --git a/source/analysis/hntools/src/G4H3ToolsManager.cc b/source/analysis/hntools/src/G4H3ToolsManager.cc index 8360338a2f..23daea01c9 100644 --- a/source/analysis/hntools/src/G4H3ToolsManager.cc +++ b/source/analysis/hntools/src/G4H3ToolsManager.cc @@ -36,9 +36,7 @@ #include using namespace G4Analysis; - -// static definitions -const G4int G4H3ToolsManager::kDimension = 3; +using std::to_string; //_____________________________________________________________________________ G4H3ToolsManager::G4H3ToolsManager(const G4AnalysisManagerState& state) @@ -46,10 +44,6 @@ G4H3ToolsManager::G4H3ToolsManager(const G4AnalysisManagerState& state) G4THnManager(state, "H3") {} -//_____________________________________________________________________________ -G4H3ToolsManager::~G4H3ToolsManager() -{} - // // Utility functions // @@ -58,9 +52,9 @@ namespace { //_____________________________________________________________________________ void UpdateH3Information(G4HnInformation* hnInformation, - const G4String& xunitName, - const G4String& yunitName, - const G4String& zunitName, + const G4String& xunitName, + const G4String& yunitName, + const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, @@ -71,28 +65,28 @@ void UpdateH3Information(G4HnInformation* hnInformation, hnInformation->SetDimension(kX, xunitName, xfcnName, xbinScheme); hnInformation->SetDimension(kY, yunitName, yfcnName, ybinScheme); hnInformation->SetDimension(kZ, zunitName, zfcnName, zbinScheme); -} - +} + //_____________________________________________________________________________ void AddH3Annotation(tools::histo::h3d* h3d, - const G4String& xunitName, - const G4String& yunitName, - const G4String& zunitName, + const G4String& xunitName, + const G4String& yunitName, + const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) -{ +{ G4String xaxisTitle; G4String yaxisTitle; G4String zaxisTitle; - UpdateTitle(xaxisTitle, xunitName, xfcnName); - UpdateTitle(yaxisTitle, yunitName, yfcnName); - UpdateTitle(zaxisTitle, zunitName, zfcnName); + UpdateTitle(xaxisTitle, xunitName, xfcnName); + UpdateTitle(yaxisTitle, yunitName, yfcnName); + UpdateTitle(zaxisTitle, zunitName, zfcnName); h3d->add_annotation(tools::histo::key_axis_x_title(), xaxisTitle); h3d->add_annotation(tools::histo::key_axis_y_title(), yaxisTitle); h3d->add_annotation(tools::histo::key_axis_z_title(), zaxisTitle); -} - +} + //_____________________________________________________________________________ tools::histo::h3d* CreateToolsH3( const G4String& title, @@ -102,12 +96,13 @@ tools::histo::h3d* CreateToolsH3( const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, - const G4String& xfcnName, + const G4String& xfcnName, const G4String& zfcnName, const G4String& yfcnName, const G4String& xbinSchemeName, const G4String& ybinSchemeName, - const G4String& zbinSchemeName) + const G4String& zbinSchemeName, + std::string_view className) { auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); @@ -118,23 +113,20 @@ tools::histo::h3d* CreateToolsH3( auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); auto zbinScheme = GetBinScheme(zbinSchemeName); - + if ( xbinScheme != G4BinScheme::kLog && ybinScheme != G4BinScheme::kLog && zbinScheme != G4BinScheme::kLog) { if ( xbinScheme == G4BinScheme::kUser || ybinScheme == G4BinScheme::kUser || zbinScheme == G4BinScheme::kUser) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4H3ToolsManager::CreateH3", - "Analysis_W013", JustWarning, description); - } - return new tools::histo::h3d(title, - nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "CreateToolsH3"); + } + return new tools::histo::h3d(title, + nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), nybins, yfcn(ymin/yunit), yfcn(ymax/yunit), nzbins, zfcn(zmin/zunit), zfcn(zmax/zunit)); - // h3 objects are deleted in destructor and reset when + // h3 objects are deleted in destructor and reset when // closing a file. } else { @@ -145,9 +137,9 @@ tools::histo::h3d* CreateToolsH3( ComputeEdges(nybins, ymin, ymax, yunit, yfcn, ybinScheme, yedges); std::vector zedges; ComputeEdges(nzbins, zmin, zmax, zunit, zfcn, zbinScheme, zedges); - return new tools::histo::h3d(title, xedges, yedges, zedges); + return new tools::histo::h3d(title, xedges, yedges, zedges); } -} +} //_____________________________________________________________________________ tools::histo::h3d* CreateToolsH3( @@ -161,7 +153,7 @@ tools::histo::h3d* CreateToolsH3( const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) -{ +{ auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); auto zunit = GetUnitValue(zunitName); @@ -169,18 +161,18 @@ tools::histo::h3d* CreateToolsH3( auto yfcn = GetFunction(yfcnName); auto zfcn = GetFunction(zfcnName); - // Apply function + // Apply function std::vector xnewEdges; ComputeEdges(xedges, xunit, xfcn, xnewEdges); std::vector ynewEdges; ComputeEdges(yedges, yunit, yfcn, ynewEdges); std::vector znewEdges; ComputeEdges(zedges, zunit, zfcn, znewEdges); - - return new tools::histo::h3d(title, xnewEdges, ynewEdges, znewEdges); - // h3 objects are deleted in destructor and reset when + + return new tools::histo::h3d(title, xnewEdges, ynewEdges, znewEdges); + // h3 objects are deleted in destructor and reset when // closing a file. -} +} //_____________________________________________________________________________ void ConfigureToolsH3(tools::histo::h3d* h3d, @@ -190,12 +182,13 @@ void ConfigureToolsH3(tools::histo::h3d* h3d, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, - const G4String& xfcnName, + const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, const G4String& xbinSchemeName, const G4String& ybinSchemeName, - const G4String& zbinSchemeName) + const G4String& zbinSchemeName, + std::string_view className) { auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); @@ -206,19 +199,16 @@ void ConfigureToolsH3(tools::histo::h3d* h3d, auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); auto zbinScheme = GetBinScheme(zbinSchemeName); - + if ( xbinScheme != G4BinScheme::kLog && ybinScheme != G4BinScheme::kLog && zbinScheme != G4BinScheme::kLog) { if ( xbinScheme == G4BinScheme::kUser || ybinScheme == G4BinScheme::kUser || zbinScheme == G4BinScheme::kUser) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4H3ToolsManager::CreateH3", - "Analysis_W013", JustWarning, description); - } - h3d->configure(nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "ConfigureToolsH3"); + } + h3d->configure(nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), nybins, yfcn(ymin/yunit), yfcn(ymax/yunit), nzbins, zfcn(zmin/zunit), zfcn(zmax/zunit)); } @@ -232,7 +222,7 @@ void ConfigureToolsH3(tools::histo::h3d* h3d, ComputeEdges(nzbins, zmin, zmax, zunit, zfcn, zbinScheme, zedges); h3d->configure(xedges, yedges, zedges); } -} +} //_____________________________________________________________________________ void ConfigureToolsH3(tools::histo::h3d* h3d, @@ -272,10 +262,10 @@ void ConfigureToolsH3(tools::histo::h3d* h3d, // //_____________________________________________________________________________ -void G4H3ToolsManager::AddH3Information(const G4String& name, - const G4String& xunitName, - const G4String& yunitName, - const G4String& zunitName, +void G4H3ToolsManager::AddH3Information(const G4String& name, + const G4String& xunitName, + const G4String& yunitName, + const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, @@ -283,13 +273,13 @@ void G4H3ToolsManager::AddH3Information(const G4String& name, G4BinScheme ybinScheme, G4BinScheme zbinScheme) const { - auto hnInformation = fHnManager->AddHnInformation(name, 3); + auto hnInformation = fHnManager->AddHnInformation(name, fkDimension); hnInformation->AddDimension(xunitName, xfcnName, xbinScheme); hnInformation->AddDimension(yunitName, yfcnName, ybinScheme); hnInformation->AddDimension(zunitName, zfcnName, zbinScheme); -} +} -// +// // protected methods // @@ -298,48 +288,43 @@ G4int G4H3ToolsManager::CreateH3(const G4String& name, const G4String& title, G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4int nzbins, G4double zmin, G4double zmax, - const G4String& xunitName, const G4String& yunitName, + const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, - const G4String& zfcnName, - const G4String& xbinSchemeName, + const G4String& zfcnName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName, const G4String& zbinSchemeName) - + { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "H3", name); -#endif + Message(kVL4, "create", "H3", name); + tools::histo::h3d* h3d - = CreateToolsH3(title, + = CreateToolsH3(title, nxbins, xmin, xmax, nybins, ymin, ymax, nzbins, zmin, zmax, - xunitName, yunitName, zunitName, - xfcnName, yfcnName, zfcnName, - xbinSchemeName, ybinSchemeName, zbinSchemeName); - + xunitName, yunitName, zunitName, + xfcnName, yfcnName, zfcnName, + xbinSchemeName, ybinSchemeName, zbinSchemeName, fkClass); + // Add annotation AddH3Annotation(h3d, xunitName, yunitName, zunitName, - xfcnName, yfcnName, zfcnName); - + xfcnName, yfcnName, zfcnName); + // Save H3 information auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); auto zbinScheme = GetBinScheme(zbinSchemeName); AddH3Information( - name, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, + name, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, xbinScheme, ybinScheme, zbinScheme); - - // Register histogram - G4int id = RegisterT(h3d, name); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "H3", name); -#endif + // Register histogram + G4int id = RegisterT(h3d, name); + + Message(kVL2, "create", "H3", name); return id; -} +} //_____________________________________________________________________________ G4int G4H3ToolsManager::CreateH3(const G4String& name, const G4String& title, @@ -350,68 +335,61 @@ G4int G4H3ToolsManager::CreateH3(const G4String& name, const G4String& title, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) - + { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "H3", name); -#endif + Message(kVL4, "create", "H3", name); + tools::histo::h3d* h3d - = CreateToolsH3(title, xedges, yedges, zedges, - xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); - + = CreateToolsH3(title, xedges, yedges, zedges, + xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); + // Add annotation - AddH3Annotation(h3d, xunitName, yunitName, zunitName, - xfcnName, yfcnName, zfcnName); - + AddH3Annotation(h3d, xunitName, yunitName, zunitName, + xfcnName, yfcnName, zfcnName); + // Save H3 information AddH3Information( - name, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, + name, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, G4BinScheme::kUser, G4BinScheme::kUser, G4BinScheme::kUser); - - // Register histogram - G4int id = RegisterT(h3d, name); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "H3", name); -#endif + // Register histogram + G4int id = RegisterT(h3d, name); + + Message(kVL2, "create", "H3", name); return id; -} +} //_____________________________________________________________________________ G4bool G4H3ToolsManager::SetH3(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4int nzbins, G4double zmin, G4double zmax, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName, const G4String& zbinSchemeName) -{ +{ auto h3d = GetTInFunction(id, "SetH3", false, false); if ( ! h3d ) return false; auto info = fHnManager->GetHnInformation(id, "SetH3"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "H3", info->GetName()); -#endif + + Message(kVL4, "configure", "H3", info->GetName()); // Configure tools h3 ConfigureToolsH3( h3d, nxbins, xmin, xmax, nybins, ymin, ymax, nzbins, zmin, zmax, - xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, - xbinSchemeName, ybinSchemeName, zbinSchemeName); + xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, + xbinSchemeName, ybinSchemeName, zbinSchemeName, fkClass); // Add annotation - AddH3Annotation(h3d, xunitName, yunitName, zunitName, - xfcnName, yfcnName, zfcnName); - + AddH3Annotation(h3d, xunitName, yunitName, zunitName, + xfcnName, yfcnName, zfcnName); + // Update information auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); @@ -421,11 +399,11 @@ G4bool G4H3ToolsManager::SetH3(G4int id, xbinScheme, ybinScheme, zbinScheme); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } - + //_____________________________________________________________________________ G4bool G4H3ToolsManager::SetH3(G4int id, const std::vector& xedges, @@ -435,35 +413,33 @@ G4bool G4H3ToolsManager::SetH3(G4int id, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) -{ +{ auto h3d = GetTInFunction(id, "SetH3", false, false); if ( ! h3d ) return false; auto info = fHnManager->GetHnInformation(id, "SetH3"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "H3", info->GetName()); -#endif + + Message(kVL4, "configure", "H3", info->GetName()); // Configure tools h3 - ConfigureToolsH3(h3d, xedges, yedges, zedges, + ConfigureToolsH3(h3d, xedges, yedges, zedges, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); // Add annotation - AddH3Annotation(h3d, xunitName, yunitName, zunitName, - xfcnName, yfcnName, zfcnName); - + AddH3Annotation(h3d, xunitName, yunitName, zunitName, + xfcnName, yfcnName, zfcnName); + // Update information UpdateH3Information( info, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, G4BinScheme::kUser, G4BinScheme::kUser, G4BinScheme::kUser); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } - + //_____________________________________________________________________________ G4bool G4H3ToolsManager::ScaleH3(G4int id, G4double factor) { @@ -471,10 +447,10 @@ G4bool G4H3ToolsManager::ScaleH3(G4int id, G4double factor) if ( ! h3d ) return false; return h3d->scale(factor); -} - +} + //_____________________________________________________________________________ -G4bool G4H3ToolsManager::FillH3(G4int id, +G4bool G4H3ToolsManager::FillH3(G4int id, G4double xvalue, G4double yvalue, G4double zvalue, G4double weight) { @@ -482,33 +458,32 @@ G4bool G4H3ToolsManager::FillH3(G4int id, if ( ! h3d ) return false; if ( fState.GetIsActivation() && ( ! fHnManager->GetActivation(id) ) ) { - return false; - } + return false; + } - G4HnDimensionInformation* xInfo + G4HnDimensionInformation* xInfo = fHnManager->GetHnDimensionInformation(id, kX, "FillH3"); - G4HnDimensionInformation* yInfo + G4HnDimensionInformation* yInfo = fHnManager->GetHnDimensionInformation(id, kY, "FillH3"); - G4HnDimensionInformation* zInfo + G4HnDimensionInformation* zInfo = fHnManager->GetHnDimensionInformation(id, kZ, "FillH3"); - h3d->fill(xInfo->fFcn(xvalue/xInfo->fUnit), - yInfo->fFcn(yvalue/yInfo->fUnit), + h3d->fill(xInfo->fFcn(xvalue/xInfo->fUnit), + yInfo->fFcn(yvalue/yInfo->fUnit), zInfo->fFcn(zvalue/zInfo->fUnit), weight); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " id " << id - << " xvalue " << xvalue - << " xfcn(xvalue/xunit) " << xInfo->fFcn(xvalue/xInfo->fUnit) - << " yvalue " << yvalue - << " yfcn(yvalue/yunit) " << yInfo->fFcn(yvalue/yInfo->fUnit) - << " zvalue " << zvalue - << " zfcn(zvalue/zunit) " << zInfo->fFcn(zvalue/zInfo->fUnit) - << " weight " << weight; - fState.GetVerboseL4()->Message("fill", "H3", description); - } -#endif + + if ( IsVerbose(kVL4) ) { + Message(kVL4, "fill", "H3", + " id " + to_string(id) + + " xvalue " + to_string(xvalue) + + " xfcn(xvalue/xunit) " + to_string(xInfo->fFcn(xvalue/xInfo->fUnit)) + + " yvalue " + to_string(yvalue) + + " yfcn(yvalue/yunit) " + to_string(yInfo->fFcn(yvalue/yInfo->fUnit)) + + " zvalue " + to_string(zvalue) + + " zfcn(zvalue/zunit) " + to_string(zInfo->fFcn(zvalue/zInfo->fUnit)) + + " weight " + to_string(weight)); + } + return true; } @@ -516,16 +491,16 @@ G4bool G4H3ToolsManager::FillH3(G4int id, G4int G4H3ToolsManager::GetH3Id(const G4String& name, G4bool warn) const { return GetTId(name, warn); -} - +} + //_____________________________________________________________________________ G4int G4H3ToolsManager::GetH3Nxbins(G4int id) const { auto h3d = GetTInFunction(id, "GetH3NXbins"); if ( ! h3d ) return 0; - + return GetNbins(*h3d, kX); -} +} //_____________________________________________________________________________ G4double G4H3ToolsManager::GetH3Xmin(G4int id) const @@ -534,36 +509,36 @@ G4double G4H3ToolsManager::GetH3Xmin(G4int id) const auto h3d = GetTInFunction(id, "GetH3Xmin"); if ( ! h3d ) return 0.; - + return GetMin(*h3d, kX); -} +} //_____________________________________________________________________________ G4double G4H3ToolsManager::GetH3Xmax(G4int id) const { auto h3d = GetTInFunction(id, "GetH3Xmax"); if ( ! h3d ) return 0.; - + return GetMax(*h3d, kX); -} +} //_____________________________________________________________________________ G4double G4H3ToolsManager::GetH3XWidth(G4int id) const { auto h3d = GetTInFunction(id, "GetH3XWidth", true, false); if ( ! h3d ) return 0.; - + return GetWidth(*h3d, kX, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4int G4H3ToolsManager::GetH3Nybins(G4int id) const { auto h3d = GetTInFunction(id, "GetH3NYbins"); if ( ! h3d ) return 0; - + return GetNbins(*h3d, kY); -} +} //_____________________________________________________________________________ G4double G4H3ToolsManager::GetH3Ymin(G4int id) const @@ -572,36 +547,36 @@ G4double G4H3ToolsManager::GetH3Ymin(G4int id) const auto h3d = GetTInFunction(id, "GetH3Ymin"); if ( ! h3d ) return 0.; - + return GetMin(*h3d, kY); -} +} //_____________________________________________________________________________ G4double G4H3ToolsManager::GetH3Ymax(G4int id) const { auto h3d = GetTInFunction(id, "GetH3Ymax"); if ( ! h3d ) return 0.; - + return GetMax(*h3d, kY); -} +} //_____________________________________________________________________________ G4double G4H3ToolsManager::GetH3YWidth(G4int id) const { auto h3d = GetTInFunction(id, "GetH3YWidth", true, false); if ( ! h3d ) return 0.; - + return GetWidth(*h3d, kY, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4int G4H3ToolsManager::GetH3Nzbins(G4int id) const { auto h3d = GetTInFunction(id, "GetH3NZbins"); if ( ! h3d ) return 0; - + return GetNbins(*h3d, kZ); -} +} //_____________________________________________________________________________ G4double G4H3ToolsManager::GetH3Zmin(G4int id) const @@ -610,149 +585,170 @@ G4double G4H3ToolsManager::GetH3Zmin(G4int id) const auto h3d = GetTInFunction(id, "GetH3Zmin"); if ( ! h3d ) return 0.; - + return GetMin(*h3d, kZ); -} +} //_____________________________________________________________________________ G4double G4H3ToolsManager::GetH3Zmax(G4int id) const { auto h3d = GetTInFunction(id, "GetH3Zmax"); if ( ! h3d ) return 0.; - + return GetMax(*h3d, kZ); -} +} //_____________________________________________________________________________ G4double G4H3ToolsManager::GetH3ZWidth(G4int id) const { auto h3d = GetTInFunction(id, "GetH3ZWidth", true, false); if ( ! h3d ) return 0.; - + return GetWidth(*h3d, kZ, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4bool G4H3ToolsManager::SetH3Title(G4int id, const G4String& title) { auto h3d = GetTInFunction(id, "SetH3Title"); if ( ! h3d ) return false; - + return SetTitle(*h3d, title); -} +} //_____________________________________________________________________________ G4bool G4H3ToolsManager::SetH3XAxisTitle(G4int id, const G4String& title) { auto h3d = GetTInFunction(id, "SetH3XAxisTitle"); if ( ! h3d ) return false; - + return SetAxisTitle(*h3d, kX, title); -} +} //_____________________________________________________________________________ G4bool G4H3ToolsManager::SetH3YAxisTitle(G4int id, const G4String& title) { auto h3d = GetTInFunction(id, "SetH3YAxisTitle"); if ( ! h3d ) return false; - + return SetAxisTitle(*h3d, kY, title); -} +} //_____________________________________________________________________________ G4bool G4H3ToolsManager::SetH3ZAxisTitle(G4int id, const G4String& title) { auto h3d = GetTInFunction(id, "SetH3ZAxisTitle"); if ( ! h3d ) return false; - + return SetAxisTitle(*h3d, kZ, title); -} +} //_____________________________________________________________________________ G4String G4H3ToolsManager::GetH3Title(G4int id) const { auto h3d = GetTInFunction(id, "GetH3Title"); if ( ! h3d ) return ""; - + return GetTitle(*h3d); -} +} //_____________________________________________________________________________ -G4String G4H3ToolsManager::GetH3XAxisTitle(G4int id) const +G4String G4H3ToolsManager::GetH3XAxisTitle(G4int id) const { auto h3d = GetTInFunction(id, "GetH3XAxisTitle"); if ( ! h3d ) return ""; - + return GetAxisTitle(*h3d, kX, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4String G4H3ToolsManager::GetH3YAxisTitle(G4int id) const +G4String G4H3ToolsManager::GetH3YAxisTitle(G4int id) const { auto h3d = GetTInFunction(id, "GetH3YAxisTitle"); if ( ! h3d ) return ""; - + return GetAxisTitle(*h3d, kY, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4String G4H3ToolsManager::GetH3ZAxisTitle(G4int id) const +G4String G4H3ToolsManager::GetH3ZAxisTitle(G4int id) const { auto h3d = GetTInFunction(id, "GetH3ZAxisTitle"); if ( ! h3d ) return ""; - + return GetAxisTitle(*h3d, kZ, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4bool G4H3ToolsManager::WriteOnAscii(std::ofstream& /*output*/) +G4bool G4H3ToolsManager::WriteOnAscii(std::ofstream& output) { // Write selected objects on ASCII file -// According to the implementation by Michel Maire, originally in -// extended examples. -// Not yet available for H3 - return ! fHnManager->IsAscii(); -} + // Do nothing if no histograms are selected + if ( ! fHnManager->IsAscii() ) return true; + + // Write h3 histograms + for ( G4int i=0; iGetFirstId(); + auto info = fHnManager->GetHnInformation(id,"WriteOnAscii"); + // skip writing if activation is enabled and H1 is inactivated + if ( ! info->GetAscii() ) continue; + auto h3 = fTVector[i]; + + Message(kVL3, "write on ascii", "h3d", info->GetName()); + + output << "\n 3D histogram " << id << ": " << h3->title() + << "\n \n \t \t \t X \t\t Y \t\t Z \t\t Bin Height" << G4endl; + + for (G4int j=0; j< G4int(h3->axis_x().bins()); ++j) { + for (G4int k=0; k< G4int(h3->axis_y().bins()); ++k) { + for (G4int l=0; l< G4int(h3->axis_y().bins()); ++l) { + output << " " << j << "\t" << k << "\t" << l << "\t" + << h3->axis_x().bin_center(j) << "\t" + << h3->axis_y().bin_center(k) << "\t" + << h3->axis_y().bin_center(l) << "\t" + << h3->bin_height(j, k, l) << G4endl; + } + } + } + } + + return output.good(); +} // // public methods -// +// //_____________________________________________________________________________ G4int G4H3ToolsManager::AddH3(const G4String& name, tools::histo::h3d* h3d) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("add", "H3", name); -#endif + Message(kVL4, "add", "H3", name); // Add annotation - AddH3Annotation(h3d, "none", "none", "none", "none", "none", "none"); + AddH3Annotation(h3d, "none", "none", "none", "none", "none", "none"); // Add information - AddH3Information(name, "none", "none", "none", "none", "none", "none", + AddH3Information(name, "none", "none", "none", "none", "none", "none", G4BinScheme::kLinear, G4BinScheme::kLinear, G4BinScheme::kLinear); - - // Register histogram - G4int id = RegisterT(h3d, name); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("add", "H3", name); -#endif + + // Register histogram + G4int id = RegisterT(h3d, name); + + Message(kVL2, "add", "H3", name); + return id; -} +} //_____________________________________________________________________________ void G4H3ToolsManager::AddH3Vector( const std::vector& h3Vector) { AddTVector(h3Vector); -} +} //_____________________________________________________________________________ tools::histo::h3d* G4H3ToolsManager::GetH3(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return GetTInFunction(id, "GetH3", warn, onlyIfActive); } diff --git a/source/analysis/hntools/src/G4P1ToolsManager.cc b/source/analysis/hntools/src/G4P1ToolsManager.cc index 00aa6ea34a..8d52c742ab 100644 --- a/source/analysis/hntools/src/G4P1ToolsManager.cc +++ b/source/analysis/hntools/src/G4P1ToolsManager.cc @@ -36,9 +36,7 @@ #include using namespace G4Analysis; - -// static definitions -const G4int G4P1ToolsManager::kDimension = 1; +using std::to_string; // // Constructors, destructor @@ -50,10 +48,6 @@ G4P1ToolsManager::G4P1ToolsManager(const G4AnalysisManagerState& state) G4THnManager(state, "P1") {} -//_____________________________________________________________________________ -G4P1ToolsManager::~G4P1ToolsManager() -{} - // // Utility functions // @@ -62,64 +56,62 @@ namespace { //_____________________________________________________________________________ void UpdateP1Information(G4HnInformation* hnInformation, - const G4String& xunitName, - const G4String& yunitName, + const G4String& xunitName, + const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, G4BinScheme xbinScheme) { hnInformation->SetDimension(kX, xunitName, xfcnName, xbinScheme); hnInformation->SetDimension(kY, yunitName, yfcnName, G4BinScheme::kLinear); -} +} //_____________________________________________________________________________ void AddP1Annotation(tools::histo::p1d* p1d, - const G4String& xunitName, - const G4String& yunitName, + const G4String& xunitName, + const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName) -{ +{ G4String xaxisTitle; G4String yaxisTitle; - UpdateTitle(xaxisTitle, xunitName, xfcnName); - UpdateTitle(yaxisTitle, yunitName, yfcnName); + UpdateTitle(xaxisTitle, xunitName, xfcnName); + UpdateTitle(yaxisTitle, yunitName, yfcnName); p1d->add_annotation(tools::histo::key_axis_x_title(), xaxisTitle); p1d->add_annotation(tools::histo::key_axis_y_title(), yaxisTitle); -} +} //_____________________________________________________________________________ tools::histo::p1d* CreateToolsP1(const G4String& title, - G4int nbins, G4double xmin, G4double xmax, + G4int nbins, G4double xmin, G4double xmax, G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, - const G4String& xfcnName, + const G4String& xfcnName, const G4String& yfcnName, - const G4String& xbinSchemeName) + const G4String& xbinSchemeName, + std::string_view className) { auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); auto xfcn = GetFunction(xfcnName); auto yfcn = GetFunction(yfcnName); auto xbinScheme = GetBinScheme(xbinSchemeName); - + if ( xbinScheme != G4BinScheme::kLog ) { if ( xbinScheme == G4BinScheme::kUser ) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4P1ToolsManager::CreateP1", - "Analysis_W013", JustWarning, description); - } - if ( ymin == 0. && ymax == 0.) { - return new tools::histo::p1d(title, + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "CreateToolsP1"); + } + if ( ymin == 0. && ymax == 0.) { + return new tools::histo::p1d(title, nbins, xfcn(xmin/xunit), xfcn(xmax/xunit)); - } else { - return new tools::histo::p1d(title, - nbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + } else { + return new tools::histo::p1d(title, + nbins, xfcn(xmin/xunit), xfcn(xmax/xunit), yfcn(ymin/yunit), yfcn(ymax/yunit)); } } @@ -127,13 +119,13 @@ tools::histo::p1d* CreateToolsP1(const G4String& title, // Compute edges std::vector edges; ComputeEdges(nbins, xmin, xmax, xunit, xfcn, xbinScheme, edges); - if ( ymin == 0. && ymax == 0.) { + if ( ymin == 0. && ymax == 0.) { return new tools::histo::p1d(title, edges); } else { - return new tools::histo::p1d(title, edges, yfcn(ymin/yunit), yfcn(ymax/yunit)); + return new tools::histo::p1d(title, edges, yfcn(ymin/yunit), yfcn(ymax/yunit)); } } -} +} //_____________________________________________________________________________ tools::histo::p1d* CreateToolsP1(const G4String& title, @@ -149,22 +141,23 @@ tools::histo::p1d* CreateToolsP1(const G4String& title, auto xfcn = GetFunction(xfcnName); auto yfcn = GetFunction(yfcnName); - // Apply function + // Apply function std::vector newEdges; ComputeEdges(edges, xunit, xfcn, newEdges); - - return new tools::histo::p1d(title, newEdges, yfcn(ymin/yunit), yfcn(ymax/yunit)); -} + + return new tools::histo::p1d(title, newEdges, yfcn(ymin/yunit), yfcn(ymax/yunit)); +} //_____________________________________________________________________________ void ConfigureToolsP1(tools::histo::p1d* p1d, - G4int nbins, G4double xmin, G4double xmax, - G4double ymin, G4double ymax, + G4int nbins, G4double xmin, G4double xmax, + G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, - const G4String& xbinSchemeName) + const G4String& xbinSchemeName, + std::string_view className) { auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); @@ -176,17 +169,14 @@ void ConfigureToolsP1(tools::histo::p1d* p1d, if ( xbinScheme == G4BinScheme::kUser ) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4P1ToolsManager::SetP1", - "Analysis_W013", JustWarning, description); + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "ConfigureToolsP1"); } if ( ymin == 0. && ymax == 0. ) { p1d->configure(nbins, xfcn(xmin/xunit), xfcn(xmax/xunit)); - } else { - p1d->configure(nbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + } else { + p1d->configure(nbins, xfcn(xmin/xunit), xfcn(xmax/xunit), yfcn(ymin/yunit), yfcn(ymax/yunit)); } } @@ -196,16 +186,16 @@ void ConfigureToolsP1(tools::histo::p1d* p1d, ComputeEdges(nbins, xmin, xmax, xunit, xfcn, xbinScheme, edges); if ( ymin == 0. && ymax == 0. ) { p1d->configure(edges); - } else { + } else { p1d->configure(edges, yfcn(ymin/yunit), yfcn(ymax/yunit)); } } -} +} //_____________________________________________________________________________ void ConfigureToolsP1(tools::histo::p1d* p1d, const std::vector& edges, - G4double ymin, G4double ymax, + G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, @@ -228,24 +218,24 @@ void ConfigureToolsP1(tools::histo::p1d* p1d, } -// +// // private methods // //_____________________________________________________________________________ -void G4P1ToolsManager::AddP1Information(const G4String& name, - const G4String& xunitName, - const G4String& yunitName, +void G4P1ToolsManager::AddP1Information(const G4String& name, + const G4String& xunitName, + const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, G4BinScheme xbinScheme) const { - auto hnInformation = fHnManager->AddHnInformation(name, 2); + auto hnInformation = fHnManager->AddHnInformation(name, fkDimension); hnInformation->AddDimension(xunitName, xfcnName, xbinScheme); hnInformation->AddDimension(yunitName, yfcnName, G4BinScheme::kLinear); -} +} -// +// // protected methods // @@ -257,32 +247,28 @@ G4int G4P1ToolsManager::CreateP1(const G4String& name, const G4String& title, const G4String& xfcnName, const G4String& yfcnName, const G4String& xbinSchemeName) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "P1", name); -#endif + Message(kVL4, "create", "P1", name); + tools::histo::p1d* p1d - = CreateToolsP1(title, nbins, xmin, xmax, ymin, ymax, - xunitName, yunitName, xfcnName, yfcnName, - xbinSchemeName); - + = CreateToolsP1(title, nbins, xmin, xmax, ymin, ymax, + xunitName, yunitName, xfcnName, yfcnName, + xbinSchemeName, fkClass); + // Add annotation - AddP1Annotation(p1d, xunitName, yunitName, xfcnName, yfcnName); - + AddP1Annotation(p1d, xunitName, yunitName, xfcnName, yfcnName); + // Save P1 information auto xbinScheme = GetBinScheme(xbinSchemeName); AddP1Information( name, xunitName, yunitName, xfcnName, yfcnName, xbinScheme); - - // Register profile - G4int id = RegisterT(p1d, name); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "P1", name); -#endif + + // Register profile + G4int id = RegisterT(p1d, name); + + Message(kVL2, "create", "P1", name); + return id; -} +} //_____________________________________________________________________________ G4int G4P1ToolsManager::CreateP1(const G4String& name, const G4String& title, @@ -291,30 +277,26 @@ G4int G4P1ToolsManager::CreateP1(const G4String& name, const G4String& title, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "P1", name); -#endif - tools::histo::p1d* p1d - = CreateToolsP1(title, edges, ymin, ymax, + Message(kVL4, "create", "P1", name); + + tools::histo::p1d* p1d + = CreateToolsP1(title, edges, ymin, ymax, xunitName, yunitName, xfcnName, yfcnName); - + // Add annotation - AddP1Annotation(p1d, xunitName, yunitName, xfcnName, yfcnName); - + AddP1Annotation(p1d, xunitName, yunitName, xfcnName, yfcnName); + // Save P1 information AddP1Information( name, xunitName, yunitName, xfcnName, yfcnName, G4BinScheme::kUser); - - // Register profile - G4int id = RegisterT(p1d, name); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "P1", name); -#endif + + // Register profile + G4int id = RegisterT(p1d, name); + + Message(kVL2, "create", "P1", name); + return id; -} +} //_____________________________________________________________________________ G4bool G4P1ToolsManager::SetP1(G4int id, @@ -323,32 +305,30 @@ G4bool G4P1ToolsManager::SetP1(G4int id, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& xbinSchemeName) -{ +{ auto p1d = GetTInFunction(id, "SetP1", false, false); if ( ! p1d ) return false; auto info = fHnManager->GetHnInformation(id,"SetP1"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "P1", info->GetName()); -#endif + + Message(kVL4, "configure", "P1", info->GetName()); // Configure tools p1 ConfigureToolsP1( - p1d, nbins, xmin, xmax, ymin, ymax, - xunitName, yunitName, xfcnName, yfcnName, xbinSchemeName); + p1d, nbins, xmin, xmax, ymin, ymax, + xunitName, yunitName, xfcnName, yfcnName, xbinSchemeName, fkClass); // Add annotation - AddP1Annotation(p1d, xunitName, yunitName, xfcnName, yfcnName); - + AddP1Annotation(p1d, xunitName, yunitName, xfcnName, yfcnName); + // Update information auto xbinScheme = GetBinScheme(xbinSchemeName); UpdateP1Information( info, xunitName, yunitName, xfcnName, yfcnName, xbinScheme); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } @@ -363,29 +343,27 @@ G4bool G4P1ToolsManager::SetP1(G4int id, if ( ! p1d ) return false; auto info = fHnManager->GetHnInformation(id,"SetP1"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "P1", info->GetName()); -#endif + + Message(kVL4, "configure", "P1", info->GetName()); // Configure tools p1 - ConfigureToolsP1(p1d, edges, ymin, ymax, + ConfigureToolsP1(p1d, edges, ymin, ymax, xunitName, yunitName, xfcnName, yfcnName); - - // Add annotation - AddP1Annotation(p1d, xunitName, yunitName, xfcnName, yfcnName); - // Update information + // Add annotation + AddP1Annotation(p1d, xunitName, yunitName, xfcnName, yfcnName); + + // Update information UpdateP1Information( info, xunitName, yunitName, xfcnName, yfcnName, G4BinScheme::kUser); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } - - + + //_____________________________________________________________________________ G4bool G4P1ToolsManager::ScaleP1(G4int id, G4double factor) { @@ -393,40 +371,38 @@ G4bool G4P1ToolsManager::ScaleP1(G4int id, G4double factor) if ( ! p1d ) return false; return p1d->scale(factor); -} +} //_____________________________________________________________________________ -G4bool G4P1ToolsManager::FillP1(G4int id, G4double xvalue, G4double yvalue, +G4bool G4P1ToolsManager::FillP1(G4int id, G4double xvalue, G4double yvalue, G4double weight) { auto p1d = GetTInFunction(id, "FillP1", true, false); if ( ! p1d ) return false; if ( fState.GetIsActivation() && ( ! fHnManager->GetActivation(id) ) ) { - //G4cout << "Skipping FillP1 for " << id << G4endl; - return false; - } + //G4cout << "Skipping FillP1 for " << id << G4endl; + return false; + } - auto xInfo + auto xInfo = fHnManager->GetHnDimensionInformation(id, kX, "FillP1"); - auto yInfo + auto yInfo = fHnManager->GetHnDimensionInformation(id, kY, "FillP1"); - p1d->fill(xInfo->fFcn(xvalue/xInfo->fUnit), + p1d->fill(xInfo->fFcn(xvalue/xInfo->fUnit), yInfo->fFcn(yvalue/yInfo->fUnit), weight); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " id " << id - << " xvalue " << xvalue - << " xfcn(xvalue/xunit) " << xInfo->fFcn(xvalue/xInfo->fUnit) - << " yvalue " << yvalue - << " yfcn(yvalue/yunit) " << yInfo->fFcn(yvalue/yInfo->fUnit) - << " weight " << weight; - fState.GetVerboseL4()->Message("fill", "P1", description); - } -#endif + if ( IsVerbose(kVL4) ) { + Message(kVL4, "fill", "P1", + " id " + to_string(id) + + " xvalue " + to_string(xvalue) + + " xfcn(xvalue/xunit) " + to_string(xInfo->fFcn(xvalue/xInfo->fUnit)) + + " yvalue " + to_string(yvalue) + + " yfcn(yvalue/yunit) " + to_string(yInfo->fFcn(yvalue/yInfo->fUnit)) + + " weight " + to_string(weight)); + } + return true; } @@ -434,16 +410,16 @@ G4bool G4P1ToolsManager::FillP1(G4int id, G4double xvalue, G4double yvalue, G4int G4P1ToolsManager::GetP1Id(const G4String& name, G4bool warn) const { return GetTId(name, warn); -} +} //_____________________________________________________________________________ G4int G4P1ToolsManager::GetP1Nbins(G4int id) const { auto p1d = GetTInFunction(id, "GetP1Nbins"); if ( ! p1d ) return 0; - + return GetNbins(*p1d, kX); -} +} //_____________________________________________________________________________ G4double G4P1ToolsManager::GetP1Xmin(G4int id) const @@ -452,27 +428,27 @@ G4double G4P1ToolsManager::GetP1Xmin(G4int id) const auto p1d = GetTInFunction(id, "GetP1Xmin"); if ( ! p1d ) return 0.; - + return GetMin(*p1d, kX); -} +} //_____________________________________________________________________________ G4double G4P1ToolsManager::GetP1Xmax(G4int id) const { auto p1d = GetTInFunction(id, "GetP1Xmax"); if ( ! p1d ) return 0.; - + return GetMax(*p1d, kX); -} +} //_____________________________________________________________________________ G4double G4P1ToolsManager::GetP1XWidth(G4int id) const { auto p1d = GetTInFunction(id, "GetP1XWidth", true, false); if ( ! p1d ) return 0.; - + return GetWidth(*p1d, kX, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4double G4P1ToolsManager::GetP1Ymin(G4int id) const @@ -481,111 +457,140 @@ G4double G4P1ToolsManager::GetP1Ymin(G4int id) const auto p1d = GetTInFunction(id, "GetP1Ymin"); if ( ! p1d ) return 0.; - + return p1d->min_v(); -} +} //_____________________________________________________________________________ G4double G4P1ToolsManager::GetP1Ymax(G4int id) const { auto p1d = GetTInFunction(id, "GetP1Ymax"); if ( ! p1d ) return 0.; - + return p1d->max_v(); -} +} //_____________________________________________________________________________ G4bool G4P1ToolsManager::SetP1Title(G4int id, const G4String& title) { auto p1d = GetTInFunction(id, "SetP1Title"); if ( ! p1d ) return false; - + return SetTitle(*p1d, title); -} +} //_____________________________________________________________________________ G4bool G4P1ToolsManager::SetP1XAxisTitle(G4int id, const G4String& title) { auto p1d = GetTInFunction(id, "SetP1XAxisTitle"); if ( ! p1d ) return false; - + return SetAxisTitle(*p1d, kX, title); -} +} //_____________________________________________________________________________ G4bool G4P1ToolsManager::SetP1YAxisTitle(G4int id, const G4String& title) { auto p1d = GetTInFunction(id, "SetP1YAxisTitle"); if ( ! p1d ) return false; - + return SetAxisTitle(*p1d, kY, title); -} +} //_____________________________________________________________________________ G4String G4P1ToolsManager::GetP1Title(G4int id) const { auto p1d = GetTInFunction(id, "GetP1Title"); if ( ! p1d ) return ""; - + return GetTitle(*p1d); -} +} //_____________________________________________________________________________ -G4String G4P1ToolsManager::GetP1XAxisTitle(G4int id) const +G4String G4P1ToolsManager::GetP1XAxisTitle(G4int id) const { auto p1d = GetTInFunction(id, "GetP1XAxisTitle"); if ( ! p1d ) return ""; return GetAxisTitle(*p1d, kX, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4String G4P1ToolsManager::GetP1YAxisTitle(G4int id) const +G4String G4P1ToolsManager::GetP1YAxisTitle(G4int id) const { auto p1d = GetTInFunction(id, "GetP1YAxisTitle"); if ( ! p1d ) return ""; - - return GetAxisTitle(*p1d, kY, fHnManager->GetHnType()); -} -// + return GetAxisTitle(*p1d, kY, fHnManager->GetHnType()); +} + +//_____________________________________________________________________________ +G4bool G4P1ToolsManager::WriteOnAscii(std::ofstream& output) +{ +// Write selected objects on ASCII file + + // Do nothing if no histograms are selected + if ( ! fHnManager->IsAscii() ) return true; + + // Write p1 histograms + for ( G4int i=0; iGetFirstId(); + auto info = fHnManager->GetHnInformation(id,"WriteOnAscii"); + // skip writing if activation is enabled and H1 is inactivated + if ( ! info->GetAscii() ) continue; + auto p1 = fTVector[i]; + + Message(kVL3, "write on ascii", "p1d", info->GetName()); + + output << "\n 1D profile " << id << ": " << p1->title() + << "\n \n \t X \t\t MeanY" << G4endl; + + for (G4int j=0; j< G4int(p1->axis().bins()); ++j) { + auto sw = p1->bin_Sw(j); + auto svw = p1->bin_Svw(j); + auto mean = ( sw != 0. ) ? (svw / sw) : 0.; + output << " " << j << "\t" + << p1->axis().bin_center(j) << "\t" + << mean << G4endl; + } + } + + return output.good(); +} + +// // public methods // //_____________________________________________________________________________ G4int G4P1ToolsManager::AddP1(const G4String& name, tools::histo::p1d* p1d) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("add", "P1", name); -#endif - + Message(kVL4, "add", "P1", name); + // Add annotation - AddP1Annotation(p1d, "none", "none", "none", "none"); + AddP1Annotation(p1d, "none", "none", "none", "none"); // Add information AddP1Information(name, "none", "none", "none", "none", G4BinScheme::kLinear); - - // Register profile - auto id = RegisterT(p1d, name); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("add", "P1", name); -#endif + + // Register profile + auto id = RegisterT(p1d, name); + + Message(kVL2, "add", "P1", name); + return id; -} +} //_____________________________________________________________________________ void G4P1ToolsManager::AddP1Vector( const std::vector& p1Vector) { AddTVector(p1Vector); -} +} //_____________________________________________________________________________ tools::histo::p1d* G4P1ToolsManager::GetP1(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return GetTInFunction(id, "GetP1", warn, onlyIfActive); } diff --git a/source/analysis/hntools/src/G4P2ToolsManager.cc b/source/analysis/hntools/src/G4P2ToolsManager.cc index 8717d013ff..3986edaec1 100644 --- a/source/analysis/hntools/src/G4P2ToolsManager.cc +++ b/source/analysis/hntools/src/G4P2ToolsManager.cc @@ -36,9 +36,7 @@ #include using namespace G4Analysis; - -// static definitions -const G4int G4P2ToolsManager::kDimension = 2; +using std::to_string; //_____________________________________________________________________________ G4P2ToolsManager::G4P2ToolsManager(const G4AnalysisManagerState& state) @@ -46,10 +44,6 @@ G4P2ToolsManager::G4P2ToolsManager(const G4AnalysisManagerState& state) G4THnManager(state, "P2") {} -//_____________________________________________________________________________ -G4P2ToolsManager::~G4P2ToolsManager() -{} - // // Utility functions // @@ -58,9 +52,9 @@ namespace { //_____________________________________________________________________________ void UpdateP2Information(G4HnInformation* hnInformation, - const G4String& xunitName, - const G4String& yunitName, - const G4String& zunitName, + const G4String& xunitName, + const G4String& yunitName, + const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, @@ -70,28 +64,28 @@ void UpdateP2Information(G4HnInformation* hnInformation, hnInformation->SetDimension(kX, xunitName, xfcnName, xbinScheme); hnInformation->SetDimension(kY, yunitName, yfcnName, ybinScheme); hnInformation->SetDimension(kZ, zunitName, zfcnName, G4BinScheme::kLinear); -} - +} + //_____________________________________________________________________________ void AddP2Annotation(tools::histo::p2d* p2d, - const G4String& xunitName, - const G4String& yunitName, - const G4String& zunitName, + const G4String& xunitName, + const G4String& yunitName, + const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) -{ +{ G4String xaxisTitle; G4String yaxisTitle; G4String zaxisTitle; - UpdateTitle(xaxisTitle, xunitName, xfcnName); - UpdateTitle(yaxisTitle, yunitName, yfcnName); - UpdateTitle(zaxisTitle, zunitName, zfcnName); + UpdateTitle(xaxisTitle, xunitName, xfcnName); + UpdateTitle(yaxisTitle, yunitName, yfcnName); + UpdateTitle(zaxisTitle, zunitName, zfcnName); p2d->add_annotation(tools::histo::key_axis_x_title(), xaxisTitle); p2d->add_annotation(tools::histo::key_axis_y_title(), yaxisTitle); p2d->add_annotation(tools::histo::key_axis_z_title(), zaxisTitle); -} - +} + //_____________________________________________________________________________ tools::histo::p2d* CreateToolsP2( const G4String& title, @@ -101,11 +95,12 @@ tools::histo::p2d* CreateToolsP2( const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, - const G4String& xfcnName, + const G4String& xfcnName, const G4String& zfcnName, const G4String& yfcnName, const G4String& xbinSchemeName, - const G4String& ybinSchemeName) + const G4String& ybinSchemeName, + std::string_view className) { auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); @@ -115,30 +110,27 @@ tools::histo::p2d* CreateToolsP2( auto zfcn = GetFunction(zfcnName); auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); - + if ( xbinScheme != G4BinScheme::kLog && ybinScheme != G4BinScheme::kLog) { if ( xbinScheme == G4BinScheme::kUser || ybinScheme == G4BinScheme::kUser ) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4P2ToolsManager::CreateP2", - "Analysis_W013", JustWarning, description); - } - if ( zmin == 0. && zmax == 0.) { - return new tools::histo::p2d(title, - nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "CreateToolsP2"); + } + if ( zmin == 0. && zmax == 0.) { + return new tools::histo::p2d(title, + nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), nybins, yfcn(ymin/yunit), yfcn(ymax/yunit)); - // p2 objects are deleted in destructor and reset when + // p2 objects are deleted in destructor and reset when // closing a file. } else { - return new tools::histo::p2d(title, - nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + return new tools::histo::p2d(title, + nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), nybins, yfcn(ymin/yunit), yfcn(ymax/yunit), zfcn(zmin/zunit), zfcn(zmax/zunit)); - // p2 objects are deleted in destructor and reset when + // p2 objects are deleted in destructor and reset when // closing a file. } } @@ -148,14 +140,14 @@ tools::histo::p2d* CreateToolsP2( ComputeEdges(nxbins, xmin, xmax, xunit, xfcn, xbinScheme, xedges); std::vector yedges; ComputeEdges(nybins, ymin, ymax, yunit, yfcn, ybinScheme, yedges); - if ( zmin == 0. && zmax == 0.) { - return new tools::histo::p2d(title, xedges, yedges); + if ( zmin == 0. && zmax == 0.) { + return new tools::histo::p2d(title, xedges, yedges); } else { - return new tools::histo::p2d(title, xedges, yedges, - zfcn(zmin/zunit), zfcn(zmax/zunit)); + return new tools::histo::p2d(title, xedges, yedges, + zfcn(zmin/zunit), zfcn(zmax/zunit)); } } -} +} //_____________________________________________________________________________ tools::histo::p2d* CreateToolsP2( @@ -169,7 +161,7 @@ tools::histo::p2d* CreateToolsP2( const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) -{ +{ auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); auto zunit = GetUnitValue(zunitName); @@ -177,23 +169,23 @@ tools::histo::p2d* CreateToolsP2( auto yfcn = GetFunction(yfcnName); auto zfcn = GetFunction(zfcnName); - // Apply function + // Apply function std::vector xnewEdges; ComputeEdges(xedges, xunit, xfcn, xnewEdges); std::vector ynewEdges; ComputeEdges(yedges, yunit, yfcn, ynewEdges); - - if ( zmin == 0. && zmax == 0.) { - return new tools::histo::p2d(title, xnewEdges, ynewEdges); - // p2 objects are deleted in destructor and reset when + + if ( zmin == 0. && zmax == 0.) { + return new tools::histo::p2d(title, xnewEdges, ynewEdges); + // p2 objects are deleted in destructor and reset when // closing a file. } else { - return new tools::histo::p2d(title, xnewEdges, ynewEdges, - zfcn(zmin/zunit), zfcn(zmax/zunit)); - // p2 objects are deleted in destructor and reset when + return new tools::histo::p2d(title, xnewEdges, ynewEdges, + zfcn(zmin/zunit), zfcn(zmax/zunit)); + // p2 objects are deleted in destructor and reset when // closing a file. } -} +} //_____________________________________________________________________________ void ConfigureToolsP2(tools::histo::p2d* p2d, @@ -203,11 +195,12 @@ void ConfigureToolsP2(tools::histo::p2d* p2d, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, - const G4String& xfcnName, + const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, const G4String& xbinSchemeName, - const G4String& ybinSchemeName) + const G4String& ybinSchemeName, + std::string_view className) { auto xunit = GetUnitValue(xunitName); auto yunit = GetUnitValue(yunitName); @@ -217,23 +210,20 @@ void ConfigureToolsP2(tools::histo::p2d* p2d, auto zfcn = GetFunction(zfcnName); auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); - + if ( xbinScheme != G4BinScheme::kLog && ybinScheme != G4BinScheme::kLog) { if ( xbinScheme == G4BinScheme::kUser || ybinScheme == G4BinScheme::kUser) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4P2ToolsManager::CreateP2", - "Analysis_W013", JustWarning, description); - } + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values.", + className, "ConfigureToolsP2"); + } if ( zmin == 0. && zmax == 0. ) { - p2d->configure(nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + p2d->configure(nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), nybins, yfcn(ymin/yunit), yfcn(ymax/yunit)); } else { - p2d->configure(nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), + p2d->configure(nxbins, xfcn(xmin/xunit), xfcn(xmax/xunit), nybins, yfcn(ymin/yunit), yfcn(ymax/yunit), zfcn(zmin/zunit), zfcn(zmax/zunit)); } @@ -248,9 +238,9 @@ void ConfigureToolsP2(tools::histo::p2d* p2d, p2d->configure(xedges, yedges); } else { p2d->configure(xedges, yedges, zfcn(zmin/zunit), zfcn(zmax/zunit)); - } + } } -} +} //_____________________________________________________________________________ void ConfigureToolsP2(tools::histo::p2d* p2d, @@ -292,23 +282,23 @@ void ConfigureToolsP2(tools::histo::p2d* p2d, // //_____________________________________________________________________________ -void G4P2ToolsManager::AddP2Information(const G4String& name, - const G4String& xunitName, - const G4String& yunitName, - const G4String& zunitName, +void G4P2ToolsManager::AddP2Information(const G4String& name, + const G4String& xunitName, + const G4String& yunitName, + const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, G4BinScheme xbinScheme, G4BinScheme ybinScheme) const { - auto hnInformation = fHnManager->AddHnInformation(name, 3); + auto hnInformation = fHnManager->AddHnInformation(name, fkDimension); hnInformation->AddDimension(xunitName, xfcnName, xbinScheme); hnInformation->AddDimension(yunitName, yfcnName, ybinScheme); hnInformation->AddDimension(zunitName, zfcnName, G4BinScheme::kLinear); -} +} -// +// // protected methods // @@ -317,46 +307,41 @@ G4int G4P2ToolsManager::CreateP2(const G4String& name, const G4String& title, G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4double zmin, G4double zmax, - const G4String& xunitName, const G4String& yunitName, + const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, - const G4String& zfcnName, - const G4String& xbinSchemeName, + const G4String& zfcnName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName) - + { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "P2", name); -#endif + Message(kVL4, "create", "P2", name); + tools::histo::p2d* p2d - = CreateToolsP2(title, + = CreateToolsP2(title, nxbins, xmin, xmax, nybins, ymin, ymax, zmin, zmax, - xunitName, yunitName, zunitName, - xfcnName, yfcnName, zfcnName, - xbinSchemeName, ybinSchemeName); - + xunitName, yunitName, zunitName, + xfcnName, yfcnName, zfcnName, + xbinSchemeName, ybinSchemeName, fkClass); + // Add annotation AddP2Annotation(p2d, xunitName, yunitName, zunitName, - xfcnName, yfcnName, zfcnName); - + xfcnName, yfcnName, zfcnName); + // Save P2 information auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); AddP2Information( - name, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, + name, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, xbinScheme, ybinScheme); - - // Register profile - G4int id = RegisterT(p2d, name); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "P2", name); -#endif + // Register profile + G4int id = RegisterT(p2d, name); + + Message(kVL2, "create", "P2", name); return id; -} +} //_____________________________________________________________________________ G4int G4P2ToolsManager::CreateP2(const G4String& name, const G4String& title, @@ -367,67 +352,60 @@ G4int G4P2ToolsManager::CreateP2(const G4String& name, const G4String& title, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) - + { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "P2", name); -#endif + Message(kVL4, "create", "P2", name); + tools::histo::p2d* p2d - = CreateToolsP2(title, xedges, yedges, zmin, zmax, - xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); - + = CreateToolsP2(title, xedges, yedges, zmin, zmax, + xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); + // Add annotation AddP2Annotation( - p2d, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); - + p2d, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); + // Save P2 information AddP2Information( - name, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, + name, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, G4BinScheme::kUser, G4BinScheme::kUser); - - // Register profile - G4int id = RegisterT(p2d, name); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("create", "P2", name); -#endif + // Register profile + G4int id = RegisterT(p2d, name); + + Message(kVL2, "create", "P2", name); return id; -} +} //_____________________________________________________________________________ G4bool G4P2ToolsManager::SetP2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4double zmin, G4double zmax, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName) -{ +{ auto p2d = GetTInFunction(id, "SetP2", false, false); if ( ! p2d ) return false; auto info = fHnManager->GetHnInformation(id, "SetP2"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "P2", info->GetName()); -#endif + + Message(kVL4, "configure", "P2", info->GetName()); // Configure tools p2 ConfigureToolsP2( p2d, nxbins, xmin, xmax, nybins, ymin, ymax, zmin, zmax, - xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, - xbinSchemeName, ybinSchemeName); + xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, + xbinSchemeName, ybinSchemeName, fkClass); // Add annotation - AddP2Annotation(p2d, xunitName, yunitName, zunitName, - xfcnName, yfcnName, zfcnName); - + AddP2Annotation(p2d, xunitName, yunitName, zunitName, + xfcnName, yfcnName, zfcnName); + // Update information auto xbinScheme = GetBinScheme(xbinSchemeName); auto ybinScheme = GetBinScheme(ybinSchemeName); @@ -436,11 +414,11 @@ G4bool G4P2ToolsManager::SetP2(G4int id, xbinScheme, ybinScheme); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } - + //_____________________________________________________________________________ G4bool G4P2ToolsManager::SetP2(G4int id, const std::vector& xedges, @@ -450,35 +428,33 @@ G4bool G4P2ToolsManager::SetP2(G4int id, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) -{ +{ auto p2d = GetTInFunction(id, "SetP2", false, false); if ( ! p2d ) return false; auto info = fHnManager->GetHnInformation(id, "SetP2"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("configure", "P2", info->GetName()); -#endif + + Message(kVL4, "configure", "P2", info->GetName()); // Configure tools p2 - ConfigureToolsP2(p2d, xedges, yedges, zmin, zmax, + ConfigureToolsP2(p2d, xedges, yedges, zmin, zmax, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); // Add annotation - AddP2Annotation(p2d, xunitName, yunitName, zunitName, - xfcnName, yfcnName, zfcnName); - + AddP2Annotation(p2d, xunitName, yunitName, zunitName, + xfcnName, yfcnName, zfcnName); + // Update information UpdateP2Information( info, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, G4BinScheme::kUser, G4BinScheme::kUser); // Set activation - fHnManager->SetActivation(id, true); - + fHnManager->SetActivation(id, true); + return true; } - + //_____________________________________________________________________________ G4bool G4P2ToolsManager::ScaleP2(G4int id, G4double factor) { @@ -486,10 +462,10 @@ G4bool G4P2ToolsManager::ScaleP2(G4int id, G4double factor) if ( ! p2d ) return false; return p2d->scale(factor); -} - +} + //_____________________________________________________________________________ -G4bool G4P2ToolsManager::FillP2(G4int id, +G4bool G4P2ToolsManager::FillP2(G4int id, G4double xvalue, G4double yvalue, G4double zvalue, G4double weight) { @@ -497,35 +473,32 @@ G4bool G4P2ToolsManager::FillP2(G4int id, if ( ! p2d ) return false; if ( fState.GetIsActivation() && ( ! fHnManager->GetActivation(id) ) ) { - return false; - } + return false; + } - auto xInfo + auto xInfo = fHnManager->GetHnDimensionInformation(id, kX, "FillP2"); - auto yInfo + auto yInfo = fHnManager->GetHnDimensionInformation(id, kY, "FillP2"); - auto zInfo + auto zInfo = fHnManager->GetHnDimensionInformation(id, kZ, "FillP2"); - p2d->fill(xInfo->fFcn(xvalue/xInfo->fUnit), - yInfo->fFcn(yvalue/yInfo->fUnit), + p2d->fill(xInfo->fFcn(xvalue/xInfo->fUnit), + yInfo->fFcn(yvalue/yInfo->fUnit), zInfo->fFcn(zvalue/zInfo->fUnit), weight); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - //description << " id " << id - // << " xvalue " << xvalue << " yvalue " << yvalue << " zvalue " << zvalue; - description << " id " << id - << " xvalue " << xvalue - << " xfcn(xvalue/xunit) " << xInfo->fFcn(xvalue/xInfo->fUnit) - << " yvalue " << yvalue - << " yfcn(yvalue/yunit) " << yInfo->fFcn(yvalue/yInfo->fUnit) - << " zvalue " << zvalue - << " zfcn(zvalue/zunit) " << zInfo->fFcn(zvalue/zInfo->fUnit) - << " weight " << weight; - fState.GetVerboseL4()->Message("fill", "P2", description); - } -#endif + + if ( IsVerbose(kVL4) ) { + Message(kVL4, "fill", "P2", + " id " + to_string(id) + + " xvalue " + to_string(xvalue) + + " xfcn(xvalue/xunit) " + to_string(xInfo->fFcn(xvalue/xInfo->fUnit)) + + " yvalue " + to_string(yvalue) + + " yfcn(yvalue/yunit) " + to_string(yInfo->fFcn(yvalue/yInfo->fUnit)) + + " zvalue " + to_string(zvalue) + + " zfcn(zvalue/zunit) " + to_string(zInfo->fFcn(zvalue/zInfo->fUnit)) + + " weight " + to_string(weight)); + } + return true; } @@ -533,16 +506,16 @@ G4bool G4P2ToolsManager::FillP2(G4int id, G4int G4P2ToolsManager::GetP2Id(const G4String& name, G4bool warn) const { return GetTId(name, warn); -} - +} + //_____________________________________________________________________________ G4int G4P2ToolsManager::GetP2Nxbins(G4int id) const { auto p2d = GetTInFunction(id, "GetP2NXbins"); if ( ! p2d ) return 0; - + return GetNbins(*p2d, kX); -} +} //_____________________________________________________________________________ G4double G4P2ToolsManager::GetP2Xmin(G4int id) const @@ -553,34 +526,34 @@ G4double G4P2ToolsManager::GetP2Xmin(G4int id) const if ( ! p2d ) return 0.; return GetMin(*p2d, kX); -} +} //_____________________________________________________________________________ G4double G4P2ToolsManager::GetP2Xmax(G4int id) const { auto p2d = GetTInFunction(id, "GetP2Xmax"); if ( ! p2d ) return 0.; - + return GetMax(*p2d, kX); -} +} //_____________________________________________________________________________ G4double G4P2ToolsManager::GetP2XWidth(G4int id) const { auto p2d = GetTInFunction(id, "GetP2XWidth", true, false); if ( ! p2d ) return 0.; - + return GetWidth(*p2d, kX, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4int G4P2ToolsManager::GetP2Nybins(G4int id) const { auto p2d = GetTInFunction(id, "GetP2NYbins"); if ( ! p2d ) return 0; - + return GetNbins(*p2d, kY); -} +} //_____________________________________________________________________________ G4double G4P2ToolsManager::GetP2Ymin(G4int id) const @@ -589,27 +562,27 @@ G4double G4P2ToolsManager::GetP2Ymin(G4int id) const auto p2d = GetTInFunction(id, "GetP2Ymin"); if ( ! p2d ) return 0.; - + return GetMin(*p2d, kY); -} +} //_____________________________________________________________________________ G4double G4P2ToolsManager::GetP2Ymax(G4int id) const { auto p2d = GetTInFunction(id, "GetP2Ymax"); if ( ! p2d ) return 0.; - + return GetMax(*p2d, kY); -} +} //_____________________________________________________________________________ G4double G4P2ToolsManager::GetP2YWidth(G4int id) const { auto p2d = GetTInFunction(id, "GetP2YWidth", true, false); if ( ! p2d ) return 0.; - + return GetWidth(*p2d, kY, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ G4double G4P2ToolsManager::GetP2Zmin(G4int id) const @@ -618,140 +591,161 @@ G4double G4P2ToolsManager::GetP2Zmin(G4int id) const auto p2d = GetTInFunction(id, "GetP2Zmin"); if ( ! p2d ) return 0.; - + return GetMin(*p2d, kZ); -} +} //_____________________________________________________________________________ G4double G4P2ToolsManager::GetP2Zmax(G4int id) const { auto p2d = GetTInFunction(id, "GetP2Zmax"); if ( ! p2d ) return 0.; - + return GetMax(*p2d, kZ); -} +} //_____________________________________________________________________________ G4bool G4P2ToolsManager::SetP2Title(G4int id, const G4String& title) { auto p2d = GetTInFunction(id, "SetP2Title"); if ( ! p2d ) return false; - + return SetTitle(*p2d, title); -} +} //_____________________________________________________________________________ G4bool G4P2ToolsManager::SetP2XAxisTitle(G4int id, const G4String& title) { auto p2d = GetTInFunction(id, "SetP2XAxisTitle"); if ( ! p2d ) return false; - + return SetAxisTitle(*p2d, kX, title); -} +} //_____________________________________________________________________________ G4bool G4P2ToolsManager::SetP2YAxisTitle(G4int id, const G4String& title) { auto p2d = GetTInFunction(id, "SetP2YAxisTitle"); if ( ! p2d ) return false; - + return SetAxisTitle(*p2d, kY, title); -} +} //_____________________________________________________________________________ G4bool G4P2ToolsManager::SetP2ZAxisTitle(G4int id, const G4String& title) { auto p2d = GetTInFunction(id, "SetP2ZAxisTitle"); if ( ! p2d ) return false; - + return SetAxisTitle(*p2d, kZ, title); -} +} //_____________________________________________________________________________ G4String G4P2ToolsManager::GetP2Title(G4int id) const { auto p2d = GetTInFunction(id, "GetP2Title"); if ( ! p2d ) return ""; - + return GetTitle(*p2d); -} +} //_____________________________________________________________________________ -G4String G4P2ToolsManager::GetP2XAxisTitle(G4int id) const +G4String G4P2ToolsManager::GetP2XAxisTitle(G4int id) const { auto p2d = GetTInFunction(id, "GetP2XAxisTitle"); if ( ! p2d ) return ""; - + return GetAxisTitle(*p2d, kX, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4String G4P2ToolsManager::GetP2YAxisTitle(G4int id) const +G4String G4P2ToolsManager::GetP2YAxisTitle(G4int id) const { auto p2d = GetTInFunction(id, "GetP2YAxisTitle"); if ( ! p2d ) return ""; - + return GetAxisTitle(*p2d, kY, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4String G4P2ToolsManager::GetP2ZAxisTitle(G4int id) const +G4String G4P2ToolsManager::GetP2ZAxisTitle(G4int id) const { auto p2d = GetTInFunction(id, "GetP2ZAxisTitle"); if ( ! p2d ) return ""; - + return GetAxisTitle(*p2d, kZ, fHnManager->GetHnType()); -} +} //_____________________________________________________________________________ -G4bool G4P2ToolsManager::WriteOnAscii(std::ofstream& /*output*/) +G4bool G4P2ToolsManager::WriteOnAscii(std::ofstream& output) { // Write selected objects on ASCII file -// According to the implementation by Michel Maire, originally in -// extended examples. -// Not yet available for P2 - return ! fHnManager->IsAscii(); -} + // Do nothing if no histograms are selected + if ( ! fHnManager->IsAscii() ) return true; + + // Write p2 histograms + for ( G4int i=0; iGetFirstId(); + auto info = fHnManager->GetHnInformation(id,"WriteOnAscii"); + // skip writing if activation is enabled and H1 is inactivated + if ( ! info->GetAscii() ) continue; + auto p2 = fTVector[i]; + + Message(kVL3, "write on ascii", "p2d", info->GetName()); + + output << "\n 2D profile " << id << ": " << p2->title() + << "\n \n \t \t X \t\t Y \t\t MeanZ" << G4endl; + + for (G4int j=0; j< G4int(p2->axis_x().bins()); ++j) { + for (G4int k=0; k< G4int(p2->axis_y().bins()); ++k) { + auto sw = p2->bin_Sw(j, k); + auto svw = p2->bin_Svw(j, k); + auto mean = ( sw != 0. ) ? (svw / sw) : 0.; + output << " " << j << "\t" << k << "\t" + << p2->axis_x().bin_center(j) << "\t" + << p2->axis_y().bin_center(k) << "\t" + << mean << G4endl; + } + } + } + + return output.good(); +} // // public methods -// +// //_____________________________________________________________________________ G4int G4P2ToolsManager::AddP2(const G4String& name, tools::histo::p2d* p2d) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("add", "P2", name); -#endif + Message(kVL4, "add", "P2", name); // Add annotation - AddP2Annotation(p2d, "none", "none", "none", "none", "none", "none"); + AddP2Annotation(p2d, "none", "none", "none", "none", "none", "none"); // Add information - AddP2Information(name, "none", "none", "none", "none", "none", "none", + AddP2Information(name, "none", "none", "none", "none", "none", "none", G4BinScheme::kLinear, G4BinScheme::kLinear); - - // Register profile - G4int id = RegisterT(p2d, name); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("add", "P2", name); -#endif + + // Register profile + G4int id = RegisterT(p2d, name); + + Message(kVL2, "add", "P2", name); + return id; -} +} //_____________________________________________________________________________ void G4P2ToolsManager::AddP2Vector( const std::vector& p2Vector) { AddTVector(p2Vector); -} +} //_____________________________________________________________________________ tools::histo::p2d* G4P2ToolsManager::GetP2(G4int id, G4bool warn, - G4bool onlyIfActive) const + G4bool onlyIfActive) const { return GetTInFunction(id, "GetP2", warn, onlyIfActive); } diff --git a/source/analysis/hntools/src/G4ToolsAnalysisManager.cc b/source/analysis/hntools/src/G4ToolsAnalysisManager.cc index ea691c563f..1df93bdb6d 100644 --- a/source/analysis/hntools/src/G4ToolsAnalysisManager.cc +++ b/source/analysis/hntools/src/G4ToolsAnalysisManager.cc @@ -35,31 +35,34 @@ #include "G4PlotManager.hh" #include "G4MPIToolsManager.hh" #include "G4AnalysisUtilities.hh" +#include "G4AutoLock.hh" +#include "G4Threading.hh" -G4ThreadLocal G4ToolsAnalysisManager* G4ToolsAnalysisManager::fgToolsInstance = nullptr; +using namespace G4Analysis; + +namespace { + //Mutex to lock master manager when merging histograms + G4Mutex mergeHnMutex = G4MUTEX_INITIALIZER; +} //_____________________________________________________________________________ G4ToolsAnalysisManager* G4ToolsAnalysisManager::Instance() { return fgToolsInstance; -} +} //_____________________________________________________________________________ G4bool G4ToolsAnalysisManager::IsInstance() { - return ( fgToolsInstance != 0 ); -} + return ( fgToolsInstance != nullptr ); +} //_____________________________________________________________________________ -G4ToolsAnalysisManager::G4ToolsAnalysisManager(const G4String& type, G4bool isMaster) - : G4VAnalysisManager(type, isMaster), - fH1Manager(nullptr), - fH2Manager(nullptr), - fH3Manager(nullptr), - fP1Manager(nullptr), - fP2Manager(nullptr) +G4ToolsAnalysisManager::G4ToolsAnalysisManager(const G4String& type) + : G4VAnalysisManager(type) { // Set instance pointer + if ( ! G4Threading::IsWorkerThread() ) fgMasterToolsInstance = this; fgToolsInstance = this; // Create managers @@ -69,7 +72,7 @@ G4ToolsAnalysisManager::G4ToolsAnalysisManager(const G4String& type, G4bool isMa fP1Manager = new G4P1ToolsManager(fState); fP2Manager = new G4P2ToolsManager(fState); // The managers will be deleted by the base class - + // Set managers to base class which takes then their ownership SetH1Manager(fH1Manager); SetH2Manager(fH2Manager); @@ -79,11 +82,15 @@ G4ToolsAnalysisManager::G4ToolsAnalysisManager(const G4String& type, G4bool isMa // Plot manager SetPlotManager(std::make_shared(fState)); + + // Messenger + fMessenger = std::make_unique(this); } //_____________________________________________________________________________ G4ToolsAnalysisManager::~G4ToolsAnalysisManager() { + if ( fState.GetIsMaster() ) fgMasterToolsInstance = nullptr; fgToolsInstance = nullptr; } @@ -92,115 +99,164 @@ G4ToolsAnalysisManager::~G4ToolsAnalysisManager() // //_____________________________________________________________________________ -G4bool G4ToolsAnalysisManager::PlotImpl() +G4bool G4ToolsAnalysisManager::PlotImpl() { // Only master thread performs plotting if ( G4Threading::IsWorkerThread() ) return true; - auto finalResult = true; + auto result = true; // Open output file fPlotManager->OpenFile(fVFileManager->GetPlotFileName()); // H1 - auto result - = fPlotManager->PlotAndWrite(fH1Manager->GetH1Vector(), + result + &= fPlotManager->PlotAndWrite(fH1Manager->GetH1Vector(), fH1Manager->GetHnVector()); - finalResult = finalResult && result; // H2 - result - = fPlotManager->PlotAndWrite(fH2Manager->GetH2Vector(), + result + &= fPlotManager->PlotAndWrite(fH2Manager->GetH2Vector(), fH2Manager->GetHnVector()); - finalResult = finalResult && result; // H3 // not yet available in tools // P1 - result - = fPlotManager->PlotAndWrite(fP1Manager->GetP1Vector(), + result + &= fPlotManager->PlotAndWrite(fP1Manager->GetP1Vector(), fP1Manager->GetHnVector()); - finalResult = finalResult && result; // P2 // not yet available in tools // Close output file - result = fPlotManager->CloseFile(); - finalResult = finalResult && result; + result &= fPlotManager->CloseFile(); - return finalResult; + return result; } //_____________________________________________________________________________ -G4bool G4ToolsAnalysisManager::MergeImpl(tools::histo::hmpi* hmpi) +G4bool G4ToolsAnalysisManager::MergeImpl(tools::histo::hmpi* hmpi) { // if ( G4Threading::IsWorkerThread() ) return true; if ( ! hmpi ) return false; - G4bool finalResult = true; + auto result = true; // Create MPI manager G4MPIToolsManager mpiToolsManager(fState, hmpi); // H1 - G4bool result - = mpiToolsManager.Merge(fH1Manager->GetH1Vector(), + result + &= mpiToolsManager.Merge(fH1Manager->GetH1Vector(), fH1Manager->GetHnVector()); - finalResult = finalResult && result; // H2 - result - = mpiToolsManager.Merge(fH2Manager->GetH2Vector(), + result + &= mpiToolsManager.Merge(fH2Manager->GetH2Vector(), fH2Manager->GetHnVector()); - finalResult = finalResult && result; // H3 - result - = mpiToolsManager.Merge(fH3Manager->GetH3Vector(), + result + &= mpiToolsManager.Merge(fH3Manager->GetH3Vector(), fH3Manager->GetHnVector()); - finalResult = finalResult && result; // P1 - result - = mpiToolsManager.Merge(fP1Manager->GetP1Vector(), + result + &= mpiToolsManager.Merge(fP1Manager->GetP1Vector(), fP1Manager->GetHnVector()); - finalResult = finalResult && result; // P2 - result - = mpiToolsManager.Merge(fP2Manager->GetP2Vector(), + result + &= mpiToolsManager.Merge(fP2Manager->GetP2Vector(), fP2Manager->GetHnVector()); - finalResult = finalResult && result; - return finalResult; + return result; } //_____________________________________________________________________________ -G4bool G4ToolsAnalysisManager::Reset() +G4bool G4ToolsAnalysisManager::WriteImpl() +{ + // Nothing to be done on worker + if ( G4Threading::IsWorkerThread() ) return false; + + auto result = true; + + // Write all histograms/profile on master + result &=WriteT(fH1Manager->GetH1Vector(), fH1Manager->GetHnVector()); + result &=WriteT(fH2Manager->GetH2Vector(), fH2Manager->GetHnVector()); + result &=WriteT(fH3Manager->GetH3Vector(), fH3Manager->GetHnVector()); + result &=WriteT(fP1Manager->GetP1Vector(), fP1Manager->GetHnVector()); + result &=WriteT(fP2Manager->GetP2Vector(), fP2Manager->GetHnVector()); + + return result; +} + +//_____________________________________________________________________________ +G4bool G4ToolsAnalysisManager::ResetImpl() { // Reset histograms and profiles - auto finalResult = true; - - auto result = fH1Manager->Reset(); - finalResult = finalResult && result; + auto result = true; - result = fH2Manager->Reset(); - finalResult = finalResult && result; - - result = fH3Manager->Reset(); - finalResult = finalResult && result; - - result = fP1Manager->Reset(); - finalResult = finalResult && result; - - result = fP2Manager->Reset(); - finalResult = finalResult && result; - - return finalResult; -} + result &= fH1Manager->Reset(); + result &= fH2Manager->Reset(); + result &= fH3Manager->Reset(); + result &= fP1Manager->Reset(); + result &= fP2Manager->Reset(); + + return result; +} + +//_____________________________________________________________________________ +void G4ToolsAnalysisManager::ClearImpl() +{ +// Reset histograms and profiles + + fH1Manager->ClearData(); + fH2Manager->ClearData(); + fH3Manager->ClearData(); + fP1Manager->ClearData(); + fP2Manager->ClearData(); +} + +//_____________________________________________________________________________ +G4bool G4ToolsAnalysisManager::Merge() +{ + // Nothing to be done on master + if ( ! G4Threading::IsWorkerThread() ) return false; + + if ( ! fgMasterToolsInstance ) { + if (! IsEmpty() ) { + Warn("No master G4AnalysisManager instance exists.\n" + "Histogram/profile data will not be merged.", + fkClass, "Merge"); + return false; + } + return true; + } + + Message(kVL4, "merge on worker", "histograms"); + + // The worker manager just adds its histograms to the master + fH1Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fH1Manager); + fH2Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fH2Manager); + fH3Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fH3Manager); + fP1Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fP1Manager); + fP2Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fP2Manager); + + Message(kVL3, "merge on worker", "histograms"); + + return true; +} + +//_____________________________________________________________________________ +G4bool G4ToolsAnalysisManager::IsEmpty() +{ + return fH1Manager->IsEmpty() && fH2Manager->IsEmpty() && fH3Manager->IsEmpty() && + fP1Manager->IsEmpty() && fP2Manager->IsEmpty(); +} diff --git a/source/analysis/hntools/src/G4ToolsAnalysisMessenger.cc b/source/analysis/hntools/src/G4ToolsAnalysisMessenger.cc new file mode 100644 index 0000000000..e6f3f564a1 --- /dev/null +++ b/source/analysis/hntools/src/G4ToolsAnalysisMessenger.cc @@ -0,0 +1,98 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +// Author: Ivana Hrivnacova, 29/10/2021 (ivana@ipno.in2p3.fr) + +#include "G4ToolsAnalysisMessenger.hh" +#include "G4ToolsAnalysisManager.hh" +#include "G4AnalysisUtilities.hh" +#include "G4AnalysisMessengerHelper.hh" + +#include "G4UIcommand.hh" +#include "G4UIparameter.hh" + +using namespace G4Analysis; + +//_____________________________________________________________________________ +G4ToolsAnalysisMessenger::G4ToolsAnalysisMessenger(G4ToolsAnalysisManager* manager) + : G4UImessenger(), + fManager(manager) +{ + // Create get commands + G4AnalysisMessengerHelper helper("h1"); + fGetH1Cmd = helper.CreateGetCommand(this); + + helper.SetHnType("h2"); + fGetH2Cmd = helper.CreateGetCommand(this); + + helper.SetHnType("h3"); + fGetH3Cmd = helper.CreateGetCommand(this); + + helper.SetHnType("p1"); + fGetP1Cmd = helper.CreateGetCommand(this); + + helper.SetHnType("p2"); + fGetP2Cmd = helper.CreateGetCommand(this); +} + +//_____________________________________________________________________________ +G4ToolsAnalysisMessenger::~G4ToolsAnalysisMessenger() = default; + +/// +// public functions +// + +//_____________________________________________________________________________ +G4String G4ToolsAnalysisMessenger::GetCurrentValue (G4UIcommand* command) +{ + if ( command == fGetH1Cmd.get() ) return fH1Value; + if ( command == fGetH2Cmd.get() ) return fH2Value; + if ( command == fGetH3Cmd.get() ) return fH3Value; + if ( command == fGetP1Cmd.get() ) return fP1Value; + if ( command == fGetP2Cmd.get() ) return fP2Value; + return ""; +} + +//_____________________________________________________________________________ +void G4ToolsAnalysisMessenger::SetNewValue(G4UIcommand* command, G4String value) +{ + auto id = G4UIcommand::ConvertToInt(value); + if ( command == fGetH1Cmd.get() ) { + fH1Value = GetHnAddress(id, fManager->fH1Manager); + } + else if ( command == fGetH2Cmd.get() ) { + fH2Value = GetHnAddress(id, fManager->fH2Manager); + } + else if ( command == fGetH3Cmd.get() ) { + fH3Value = GetHnAddress(id, fManager->fH3Manager); + } + else if ( command == fGetP1Cmd.get() ) { + fP1Value = GetHnAddress(id, fManager->fP1Manager); + } + else if ( command == fGetP2Cmd.get() ) { + fP2Value = GetHnAddress(id, fManager->fP2Manager); + } +} diff --git a/source/analysis/hntools/src/G4ToolsAnalysisReader.cc b/source/analysis/hntools/src/G4ToolsAnalysisReader.cc index 71e8eabaf1..5150be5304 100644 --- a/source/analysis/hntools/src/G4ToolsAnalysisReader.cc +++ b/source/analysis/hntools/src/G4ToolsAnalysisReader.cc @@ -32,16 +32,10 @@ #include "G4H3ToolsManager.hh" #include "G4P1ToolsManager.hh" #include "G4P2ToolsManager.hh" -#include "G4MPIToolsManager.hh" //_____________________________________________________________________________ -G4ToolsAnalysisReader::G4ToolsAnalysisReader(const G4String& type, G4bool isMaster) - : G4VAnalysisReader(type, isMaster), - fH1Manager(nullptr), - fH2Manager(nullptr), - fH3Manager(nullptr), - fP1Manager(nullptr), - fP2Manager(nullptr) +G4ToolsAnalysisReader::G4ToolsAnalysisReader(const G4String& type) + : G4VAnalysisReader(type) { // Create managers fH1Manager = new G4H1ToolsManager(fState); @@ -50,7 +44,7 @@ G4ToolsAnalysisReader::G4ToolsAnalysisReader(const G4String& type, G4bool isMast fP1Manager = new G4P1ToolsManager(fState); fP2Manager = new G4P2ToolsManager(fState); // The managers will be deleted by the base class - + // Set managers to base class which takes then their ownership SetH1Manager(fH1Manager); SetH2Manager(fH2Manager); @@ -59,35 +53,72 @@ G4ToolsAnalysisReader::G4ToolsAnalysisReader(const G4String& type, G4bool isMast SetP2Manager(fP2Manager); } -//_____________________________________________________________________________ -G4ToolsAnalysisReader::~G4ToolsAnalysisReader() -{} - // // protected methods // +//_____________________________________________________________________________ +G4int G4ToolsAnalysisReader::ReadH1Impl(const G4String& h1Name, + const G4String& fileName, + const G4String& dirName, + G4bool isUserFileName) +{ + return ReadTImpl( + h1Name, fileName, dirName, isUserFileName, fH1Manager); +} + +//_____________________________________________________________________________ +G4int G4ToolsAnalysisReader::ReadH2Impl(const G4String& h2Name, + const G4String& fileName, + const G4String& dirName, + G4bool isUserFileName) +{ + return ReadTImpl( + h2Name, fileName, dirName, isUserFileName, fH2Manager); +} + +//_____________________________________________________________________________ +G4int G4ToolsAnalysisReader::ReadH3Impl(const G4String& h3Name, + const G4String& fileName, + const G4String& dirName, + G4bool isUserFileName) +{ + return ReadTImpl( + h3Name, fileName, dirName, isUserFileName, fH3Manager); +} + +//_____________________________________________________________________________ +G4int G4ToolsAnalysisReader::ReadP1Impl(const G4String& p1Name, + const G4String& fileName, + const G4String& dirName, + G4bool isUserFileName) +{ + return ReadTImpl( + p1Name, fileName, dirName, isUserFileName, fP1Manager); +} + +//_____________________________________________________________________________ +G4int G4ToolsAnalysisReader::ReadP2Impl(const G4String& p2Name, + const G4String& fileName, + const G4String& dirName, + G4bool isUserFileName) +{ + return ReadTImpl( + p2Name, fileName, dirName, isUserFileName, fP2Manager); +} + //_____________________________________________________________________________ G4bool G4ToolsAnalysisReader::Reset() { // Reset histograms and profiles - auto finalResult = true; - - auto result = fH1Manager->Reset(); - finalResult = finalResult && result; + auto result = true; - result = fH2Manager->Reset(); - finalResult = finalResult && result; - - result = fH3Manager->Reset(); - finalResult = finalResult && result; - - result = fP1Manager->Reset(); - finalResult = finalResult && result; - - result = fP2Manager->Reset(); - finalResult = finalResult && result; - - return finalResult; -} + result &= fH1Manager->Reset(); + result &= fH2Manager->Reset(); + result &= fH3Manager->Reset(); + result &= fP1Manager->Reset(); + result &= fP2Manager->Reset(); + + return result; +} diff --git a/source/analysis/management/include/G4AnalysisManagerState.hh b/source/analysis/management/include/G4AnalysisManagerState.hh index b4ececde99..0a0d4ed55f 100644 --- a/source/analysis/management/include/G4AnalysisManagerState.hh +++ b/source/analysis/management/include/G4AnalysisManagerState.hh @@ -31,9 +31,10 @@ #ifndef G4AnalysisManagerState_h #define G4AnalysisManagerState_h 1 +#include "G4AnalysisVerbose.hh" #include "globals.hh" -#include "G4AnalysisVerbose.hh" -#include "G4Threading.hh" + +#include class G4AnalysisManagerState { @@ -42,46 +43,45 @@ class G4AnalysisManagerState friend class G4VAnalysisReader; friend class G4ParameterManager; - public: + public: G4AnalysisManagerState(const G4String& type, G4bool isMaster); + // disabled constructors, operators + G4AnalysisManagerState() = delete; + G4AnalysisManagerState(const G4AnalysisManagerState&) = delete; + G4AnalysisManagerState& operator=(const G4AnalysisManagerState&) = delete; + + // Methods + void Message([[maybe_unused]] G4int level, + [[maybe_unused]] const G4String& action, + [[maybe_unused]] const G4String& objectType, + [[maybe_unused]] const G4String& objectName = "", + [[maybe_unused]] G4bool success = true) const; // get methods G4String GetType() const; G4bool GetIsMaster() const; G4bool GetIsActivation() const; G4int GetVerboseLevel() const; - const G4AnalysisVerbose* GetVerboseL1() const; - const G4AnalysisVerbose* GetVerboseL2() const; - const G4AnalysisVerbose* GetVerboseL3() const; - const G4AnalysisVerbose* GetVerboseL4() const; + G4bool IsVerbose(G4int verboseLevel) const; G4int GetCompressionLevel() const; private: - // disabled constructors, operators - G4AnalysisManagerState(); - G4AnalysisManagerState(const G4AnalysisManagerState&); - G4AnalysisManagerState& operator=(const G4AnalysisManagerState&); - // set methods // (hidden from all clients except for G4VAnalysisManager friend) void SetIsActivation(G4bool isActivation); void SetVerboseLevel(G4int verboseLevel); void SetCompressionLevel(G4int level); - // data members + // Static data members + static constexpr std::string_view fkClass { "G4AnalysisManagerState" }; + + // Data members G4String fType; G4bool fIsMaster; - G4bool fIsActivation; - G4int fVerboseLevel; - G4int fCompressionLevel; - G4AnalysisVerbose fVerboseL1; - G4AnalysisVerbose fVerboseL2; - G4AnalysisVerbose fVerboseL3; - G4AnalysisVerbose fVerboseL4; - G4AnalysisVerbose* fpVerboseL1; - G4AnalysisVerbose* fpVerboseL2; - G4AnalysisVerbose* fpVerboseL3; - G4AnalysisVerbose* fpVerboseL4; + G4bool fIsActivation { false }; + G4int fVerboseLevel { 0 }; + G4int fCompressionLevel { 1 }; + G4AnalysisVerbose fVerbose; }; // inline functions @@ -104,17 +104,8 @@ inline G4bool G4AnalysisManagerState::GetIsActivation() const inline G4int G4AnalysisManagerState::GetVerboseLevel() const { return fVerboseLevel; } -inline const G4AnalysisVerbose* G4AnalysisManagerState::GetVerboseL1() const -{ return fpVerboseL1; } - -inline const G4AnalysisVerbose* G4AnalysisManagerState::GetVerboseL2() const -{ return fpVerboseL2; } - -inline const G4AnalysisVerbose* G4AnalysisManagerState::GetVerboseL3() const -{ return fpVerboseL3; } - -inline const G4AnalysisVerbose* G4AnalysisManagerState::GetVerboseL4() const -{ return fpVerboseL4; } +inline G4bool G4AnalysisManagerState::IsVerbose(G4int verboseLevel) const +{ return fVerboseLevel == verboseLevel; } inline G4int G4AnalysisManagerState::GetCompressionLevel() const { return fCompressionLevel; } diff --git a/source/analysis/management/include/G4AnalysisMessenger.hh b/source/analysis/management/include/G4AnalysisMessenger.hh index 6e199afc7b..c5e2c7ff09 100644 --- a/source/analysis/management/include/G4AnalysisMessenger.hh +++ b/source/analysis/management/include/G4AnalysisMessenger.hh @@ -58,21 +58,22 @@ class G4AnalysisMessenger : public G4UImessenger { public: explicit G4AnalysisMessenger(G4VAnalysisManager* manager); + G4AnalysisMessenger() = delete; virtual ~G4AnalysisMessenger(); - - // methods + + // Methods void SetH1HnManager(G4HnManager& h1HnManager); void SetH2HnManager(G4HnManager& h2HnManager); void SetH3HnManager(G4HnManager& h3HnManager); void SetP1HnManager(G4HnManager& p1HnManager); void SetP2HnManager(G4HnManager& p2HnManager); - // methods + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; private: - // data members - G4VAnalysisManager* fManager; ///< Associated class + // Data members + G4VAnalysisManager* fManager { nullptr }; ///< Associated class std::unique_ptr fFileMessenger; std::unique_ptr fH1Messenger; std::unique_ptr fH2Messenger; @@ -85,12 +86,12 @@ class G4AnalysisMessenger : public G4UImessenger std::unique_ptr fH3HnMessenger; std::unique_ptr fP1HnMessenger; std::unique_ptr fP2HnMessenger; - - std::unique_ptr fAnalysisDir; - std::unique_ptr fSetActivationCmd; - std::unique_ptr fVerboseCmd; - std::unique_ptr fCompressionCmd; + + std::unique_ptr fAnalysisDir; + std::unique_ptr fSetActivationCmd; + std::unique_ptr fVerboseCmd; + std::unique_ptr fCompressionCmd; }; - + #endif diff --git a/source/analysis/management/include/G4AnalysisMessengerHelper.hh b/source/analysis/management/include/G4AnalysisMessengerHelper.hh index 1b30b9e73e..e4eff0073c 100644 --- a/source/analysis/management/include/G4AnalysisMessengerHelper.hh +++ b/source/analysis/management/include/G4AnalysisMessengerHelper.hh @@ -36,6 +36,7 @@ #include "globals.hh" #include +#include class G4VAnalysisManager; class G4UIdirectory; @@ -46,43 +47,37 @@ class G4AnalysisMessengerHelper public: // types struct BinData { - BinData() : - fNbins(0), - fVmin(0.), - fVmax(0.), - fSunit(""), - fSfcn(""), - fSbinScheme("") {} - G4int fNbins; - G4double fVmin; - G4double fVmax; + BinData() {} + G4int fNbins { 0 }; + G4double fVmin { 0. }; + G4double fVmax { 0. }; G4String fSunit; G4String fSfcn; G4String fSbinScheme; }; // types struct ValueData { - ValueData() : - fVmin(0.), - fVmax(0.), - fSunit(""), - fSfcn("") {} - G4double fVmin; - G4double fVmax; + ValueData() {} + G4double fVmin { 0. }; + G4double fVmax { 0. }; G4String fSunit; G4String fSfcn; }; public: - // Make available utility Update method + // Make available utility Update method friend class G4HnMessenger; public: explicit G4AnalysisMessengerHelper(const G4String& hnType); - ~G4AnalysisMessengerHelper(); - - // methods to create commands - std::unique_ptr CreateHnDirectory() const; + G4AnalysisMessengerHelper() = delete; + ~G4AnalysisMessengerHelper() = default; + + // Methods to create commands + std::unique_ptr CreateHnDirectory() const; + + std::unique_ptr CreateGetCommand( + G4UImessenger* messenger) const; std::unique_ptr CreateSetTitleCommand( G4UImessenger* messenger) const; @@ -95,23 +90,34 @@ class G4AnalysisMessengerHelper std::unique_ptr CreateSetAxisLogCommand(const G4String& axis, G4UImessenger* messenger) const; - // methods to read command paremeters - void GetBinData(BinData& data, std::vector& parameters, + // Methods to read command paremeters + void GetBinData(BinData& data, std::vector& parameters, G4int& counter) const; - void GetValueData(ValueData& data, std::vector& parameters, + void GetValueData(ValueData& data, std::vector& parameters, G4int& counter) const; + // Set methods + void SetHnType(const G4String& hnType); + // warnings void WarnAboutParameters(G4UIcommand* command, G4int nofParameters) const; void WarnAboutSetCommands() const; private: - // methods + // Methods G4String Update(const G4String& str, const G4String& axis = "") const; - // data members + // Static data members + static constexpr std::string_view fkClass { "G4AnalysisMessengerHelper" }; + + // Data members G4String fHnType; }; - + +// inline functions + +inline void G4AnalysisMessengerHelper::SetHnType(const G4String& hnType) +{ fHnType = hnType; } + #endif diff --git a/source/analysis/management/include/G4AnalysisUtilities.hh b/source/analysis/management/include/G4AnalysisUtilities.hh index faf044f0b4..54c1ddf873 100644 --- a/source/analysis/management/include/G4AnalysisUtilities.hh +++ b/source/analysis/management/include/G4AnalysisUtilities.hh @@ -29,10 +29,12 @@ #ifndef G4AnalysisUtilities_h #define G4AnalysisUtilities_h 1 +#include "G4Exception.hh" #include "globals.hh" #include #include +#include // Enumeration for definition of available output types @@ -42,26 +44,34 @@ enum class G4AnalysisOutput { kRoot, kXml, kNone -}; +}; -namespace G4Analysis +namespace G4Analysis { // Constant expressions -// -// constexpr G4int kX = 0; // not yet supported on vc12 -// constexpr G4int kY = 1; // not yet supported on vc12 -// constexpr G4int kZ = 2; // not yet supported on vc12 -const G4int kX = 0; // not yet supported on vc12 -const G4int kY = 1; // not yet supported on vc12 -const G4int kZ = 2; // not yet supported on vc12 +// +constexpr G4int kX { 0 }; +constexpr G4int kY { 1 }; +constexpr G4int kZ { 2 }; +constexpr G4int kInvalidId { -1 }; +constexpr G4int kVL0 { 0 }; +constexpr G4int kVL1 { 1 }; +constexpr G4int kVL2 { 2 }; +constexpr G4int kVL3 { 3 }; +constexpr G4int kVL4 { 4 }; +constexpr unsigned int kDefaultBasketSize = 32000; +constexpr unsigned int kDefaultBasketEntries = 4000; +constexpr std::string_view kNamespaceName { "G4Analysis" }; -// Invalid object Id -// -// constexpr G4int kInvalidId = -1; // not yet supported on vc12 -const G4int kInvalidId = -1; // not yet supported on vc12 +// Warning +// +void Warn(const G4String& message, + const std::string_view inClass, + const std::string_view inFunction); // Utility functions for checking input parameters +// G4bool CheckNbins(G4int nbins); G4bool CheckMinMax(G4double xmin, G4double xmax, const G4String& fcnName = "none", @@ -69,29 +79,22 @@ G4bool CheckMinMax(G4double xmin, G4double xmax, G4bool CheckEdges(const std::vector& edges); G4bool CheckName(const G4String& name, const G4String& objectType); -// Get unit value with added handling of "none" +// Get unit value with added handling of "none" G4double GetUnitValue(const G4String& unit); // Add unit & fcn to the title -void UpdateTitle(G4String& title, +void UpdateTitle(G4String& title, const G4String& unitName, const G4String& fcnName); - -// Tokenizer with taking into account composed strings within "" + +// Tokenizer with taking into account composed strings within "" void Tokenize(const G4String& line, std::vector& tokens); -// make-unique utility, not yet availabla in C++11 -template -std::unique_ptr make_unique(Args&&... args) -{ - return std::unique_ptr(new T(std::forward(args)...)); -} - -// get output type from name +// Get output type from name G4AnalysisOutput GetOutput(const G4String& outputName, G4bool warn = true); size_t GetOutputId(const G4String& outputName, G4bool warn = true); G4String GetOutputName(G4AnalysisOutput outputType); -// get short hnType from the tools object +// Get short hnType from the tools object template G4String GetHnType() { @@ -102,6 +105,27 @@ G4String GetHnType() return hnTypeLong.substr(14, 2); } +// template +// G4bool IsProfile() +// { +// // tools::histo::h1d etc. +// G4String hnTypeLong = HT::s_class(); + +// // tools::histo::h1d -> h1 etc. +// return (hnTypeLong.substr(14, 1) == "p"); +// } + +// String conversion +template +inline +std::string ToString(const T& value) +{ return std::to_string(value); } + +template <> +inline +std::string ToString(const std::string& value) +{ return value; } + // File names utilities // Get file base name (without dot) @@ -116,8 +140,8 @@ G4String GetExtension(const G4String& fileName, // - add file extension if not present G4String GetHnFileName( const G4String& fileName, - const G4String& fileType, - const G4String& hnType, + const G4String& fileType, + const G4String& hnType, const G4String& hnName); // Compose and return the ntuple specific file name: @@ -126,7 +150,7 @@ G4String GetHnFileName( // - add file extension if not present G4String GetNtupleFileName( const G4String& fileName, - const G4String& fileType, + const G4String& fileType, const G4String& ntupleName); // Compose and return the ntuple specific file name: @@ -135,7 +159,7 @@ G4String GetNtupleFileName( // - add file extension if not present G4String GetNtupleFileName( const G4String& fileName, - const G4String& fileType, + const G4String& fileType, G4int ntupleFileNumber); // Update file base name with the thread suffix: diff --git a/source/analysis/management/include/G4AnalysisVerbose.hh b/source/analysis/management/include/G4AnalysisVerbose.hh index c01e2fe512..d755213497 100644 --- a/source/analysis/management/include/G4AnalysisVerbose.hh +++ b/source/analysis/management/include/G4AnalysisVerbose.hh @@ -33,29 +33,31 @@ #include "globals.hh" +#include + class G4AnalysisVerbose { public: - G4AnalysisVerbose(G4int verboseLevel); - ~G4AnalysisVerbose(); + G4AnalysisVerbose(); + ~G4AnalysisVerbose() = default; - void Message(const G4String& action, - const G4String& object, + void Message(G4int verboseLevel, + const G4String& action, + const G4String& object, const G4String& objectName, G4bool success = true) const; - void Message(const G4String& action, - const G4String& object, - G4ExceptionDescription& description, - G4bool success = true) const; - private: - // data members - // - G4String fToBeDoneText; - G4String fDoneText; - G4String fFailureText; + // Static data members + static constexpr int fkMaxLevel = 4; + + // Data members + std::array fDoneText + { G4String("- done"), G4String("- done"), G4String(), G4String() }; + std::array fToBeDoneText + { G4String(), G4String(), G4String("done "), G4String("going to ") }; + G4String fFailureText + { "has failed" }; }; #endif - diff --git a/source/analysis/management/include/G4BaseAnalysisManager.hh b/source/analysis/management/include/G4BaseAnalysisManager.hh index 98581cca0f..8038fb4d7b 100644 --- a/source/analysis/management/include/G4BaseAnalysisManager.hh +++ b/source/analysis/management/include/G4BaseAnalysisManager.hh @@ -38,13 +38,14 @@ #include "G4AnalysisManagerState.hh" +#include + class G4BaseAnalysisManager { public: explicit G4BaseAnalysisManager(const G4AnalysisManagerState& state); - virtual ~G4BaseAnalysisManager(); - - // methods + G4BaseAnalysisManager() = delete; + virtual ~G4BaseAnalysisManager() = default; // The ids of objects are generated automatically // starting from 0; with the following function it is possible to @@ -56,21 +57,43 @@ class G4BaseAnalysisManager G4int GetFirstId() const; protected: - // data members + // Methods for verbose + G4bool IsVerbose(G4int verboseLevel) const; + void Message(G4int level, + const G4String& action, + const G4String& objectType, + const G4String& objectName = "", + G4bool success = true) const; + + // Data members const G4AnalysisManagerState& fState; - G4int fFirstId; - G4bool fLockFirstId; + G4int fFirstId { 0 }; + G4bool fLockFirstId { false }; + + private: + // Static data members + static constexpr std::string_view fkClass { "G4BaseAnalysisManager" }; }; // inline functions +inline G4bool G4BaseAnalysisManager::IsVerbose(G4int verboseLevel) const +{ return fState.IsVerbose(verboseLevel); } + +inline void G4BaseAnalysisManager::Message( + G4int level, const G4String& action, const G4String& objectType, + const G4String& objectName, G4bool success) const +{ + fState.Message(level, action, objectType, objectName, success); +} + inline void G4BaseAnalysisManager::SetLockFirstId(G4bool lockFirstId) { fLockFirstId = lockFirstId; -} +} inline G4int G4BaseAnalysisManager::GetFirstId() const { return fFirstId; -} +} #endif diff --git a/source/analysis/management/include/G4BaseFileManager.hh b/source/analysis/management/include/G4BaseFileManager.hh index 42837c0fdf..f71ddfb04b 100644 --- a/source/analysis/management/include/G4BaseFileManager.hh +++ b/source/analysis/management/include/G4BaseFileManager.hh @@ -40,7 +40,8 @@ class G4BaseFileManager { public: explicit G4BaseFileManager(const G4AnalysisManagerState& state); - virtual ~G4BaseFileManager(); + G4BaseFileManager() = delete; + virtual ~G4BaseFileManager() = default; virtual G4bool SetFileName(const G4String& fileName); // Set the base file name (without extension) @@ -50,7 +51,7 @@ class G4BaseFileManager void AddFileName(const G4String& fileName); // For handling multiple files // Save file name in a vector if not yet present - + G4String GetFileName() const; // Return the base file name (without extension) G4String GetFullFileName(const G4String& baseFileName = "", @@ -61,7 +62,7 @@ class G4BaseFileManager const std::vector& GetFileNames() const; // Return the file names vector - G4String GetHnFileName(const G4String& hnType, + G4String GetHnFileName(const G4String& hnType, const G4String& hnName) const; // Compose and return the histogram or profile specific file name: // - add _hn_hnName suffix to the file base name @@ -72,17 +73,24 @@ class G4BaseFileManager // - add _nt_ntupleName suffix to the file base name // - add _tN suffix if called on thread worker // - add file extension if not present - + G4String GetNtupleFileName(G4int ntupleFileNumber) const; // Compose and return the ntuple specific file name: - // - add _mN suffix to the file base name + // - add _mN suffix to the file base name // - add file extension if not present - + G4String GetPlotFileName() const; // Return the file name for batch plotting output protected: - // data members + // Methods for verbose + void Message(G4int level, + const G4String& action, + const G4String& objectType, + const G4String& objectName = "", + G4bool success = true) const; + + // Data members const G4AnalysisManagerState& fState; G4String fFileName; // to be changed in fDefaultFileName std::vector fFileNames; @@ -92,7 +100,7 @@ inline G4bool G4BaseFileManager::SetFileName(const G4String& fileName) { // CHECK if still needed in this base class fFileName = fileName; return true; -} +} inline G4String G4BaseFileManager::GetFileName() const { return fFileName; @@ -102,4 +110,11 @@ inline const std::vector& G4BaseFileManager::GetFileNames() const { return fFileNames; } +inline void G4BaseFileManager::Message( + G4int level, const G4String& action, const G4String& objectType, + const G4String& objectName, G4bool success) const +{ + fState.Message(level, action, objectType, objectName, success); +} + #endif diff --git a/source/analysis/management/include/G4BaseNtupleManager.hh b/source/analysis/management/include/G4BaseNtupleManager.hh index 540c29edff..25dcce3873 100644 --- a/source/analysis/management/include/G4BaseNtupleManager.hh +++ b/source/analysis/management/include/G4BaseNtupleManager.hh @@ -24,8 +24,8 @@ // ******************************************************************** // -// The base class for Ntuple managers. -// It implements common functions independent from the output type. +// The base class for Ntuple managers. +// It implements common functions independent from the output type. // // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) @@ -39,7 +39,8 @@ class G4BaseNtupleManager : public G4VNtupleManager { public: explicit G4BaseNtupleManager(const G4AnalysisManagerState& state); - virtual ~G4BaseNtupleManager(); + G4BaseNtupleManager() = delete; + virtual ~G4BaseNtupleManager() = default; // deleted copy constructor & assignment operator G4BaseNtupleManager(const G4BaseNtupleManager& rhs) = delete; @@ -50,18 +51,18 @@ class G4BaseNtupleManager : public G4VNtupleManager virtual G4int CreateNtuple(G4NtupleBooking* booking) = 0; // Methods to fill ntuples - // Methods for ntuple with id = FirstNtupleId + // Methods for ntuple with id = FirstNtupleId virtual G4bool FillNtupleIColumn(G4int id, G4int value) final; virtual G4bool FillNtupleFColumn(G4int id, G4float value) final; virtual G4bool FillNtupleDColumn(G4int id, G4double value) final; virtual G4bool FillNtupleSColumn(G4int id, const G4String& value) final; virtual G4bool AddNtupleRow() final; - // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) + // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) virtual G4bool FillNtupleIColumn(G4int ntupleId, G4int columnId, G4int value) = 0; virtual G4bool FillNtupleFColumn(G4int ntupleId, G4int columnId, G4float value) = 0; virtual G4bool FillNtupleDColumn(G4int ntupleId, G4int columnId, G4double value) = 0; - virtual G4bool FillNtupleSColumn(G4int ntupleId, G4int columnId, + virtual G4bool FillNtupleSColumn(G4int ntupleId, G4int columnId, const G4String& value) = 0; virtual G4bool AddNtupleRow(G4int ntupleId) = 0; @@ -69,7 +70,7 @@ class G4BaseNtupleManager : public G4VNtupleManager virtual G4bool SetFirstNtupleColumnId(G4int firstId) final; protected: - G4int fFirstNtupleColumnId; + G4int fFirstNtupleColumnId { 0 }; }; #endif diff --git a/source/analysis/management/include/G4BaseRNtupleManager.hh b/source/analysis/management/include/G4BaseRNtupleManager.hh index ab59a62c39..14731fe43f 100644 --- a/source/analysis/management/include/G4BaseRNtupleManager.hh +++ b/source/analysis/management/include/G4BaseRNtupleManager.hh @@ -24,8 +24,8 @@ // ******************************************************************** // -// The base class for read Ntuple manager. -// It defines functions independent from the output type. +// The base class for read Ntuple manager. +// It defines functions independent from the output type. // // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) @@ -45,57 +45,61 @@ class G4BaseRNtupleManager : public G4VRNtupleManager public: explicit G4BaseRNtupleManager(const G4AnalysisManagerState& state); - virtual ~G4BaseRNtupleManager(); + virtual ~G4BaseRNtupleManager() = default; - // deleted copy constructor & assignment operator + // deleted default © constructors & assignment operator + G4BaseRNtupleManager() = delete; G4BaseRNtupleManager(const G4BaseRNtupleManager& rhs) = delete; G4BaseRNtupleManager& operator=(const G4BaseRNtupleManager& rhs) = delete; - protected: + protected: // Methods to read ntuple from a file - // Methods for ntuple with id = FirstNtupleId - virtual G4bool SetNtupleIColumn(const G4String& columnName, + // Methods for ntuple with id = FirstNtupleId + virtual G4bool SetNtupleIColumn(const G4String& columnName, G4int& value) final; - virtual G4bool SetNtupleFColumn(const G4String& columnName, + virtual G4bool SetNtupleFColumn(const G4String& columnName, G4float& value) final; - virtual G4bool SetNtupleDColumn(const G4String& columnName, + virtual G4bool SetNtupleDColumn(const G4String& columnName, G4double& value) final; - virtual G4bool SetNtupleSColumn(const G4String& columnName, + virtual G4bool SetNtupleSColumn(const G4String& columnName, G4String& value) final; - // Methods for ntuple with id > FirstNtupleId - virtual G4bool SetNtupleIColumn(G4int ntupleId, + // Methods for ntuple with id > FirstNtupleId + virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, G4int& value)= 0; - virtual G4bool SetNtupleFColumn(G4int ntupleId, + virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, G4float& value)= 0; - virtual G4bool SetNtupleDColumn(G4int ntupleId, + virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, G4double& value)= 0; - virtual G4bool SetNtupleSColumn(G4int ntupleId, + virtual G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, G4String& value)= 0; // Bind the ntuple columns of vector type - // Methods for ntuple with id = FirstNtupleId - virtual G4bool SetNtupleIColumn(const G4String& columnName, + // Methods for ntuple with id = FirstNtupleId + virtual G4bool SetNtupleIColumn(const G4String& columnName, std::vector& vector) final; - virtual G4bool SetNtupleFColumn(const G4String& columnName, + virtual G4bool SetNtupleFColumn(const G4String& columnName, std::vector& vector) final; - virtual G4bool SetNtupleDColumn(const G4String& columnName, + virtual G4bool SetNtupleDColumn(const G4String& columnName, std::vector& vector) final; - // Methods for ntuple with id > FirstNtupleId - virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleSColumn(const G4String& columnName, + std::vector& vector) final; + // Methods for ntuple with id > FirstNtupleId + virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) = 0; - virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) = 0; - virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) = 0; + virtual G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, + std::vector& vector) = 0; virtual G4bool GetNtupleRow() final; virtual G4bool GetNtupleRow(G4int ntupleId) = 0; - + // Access methods virtual G4int GetNofNtuples() const = 0; private: - // methods + // Methods G4int GetCurrentNtupleId() const; }; - -#endif +#endif diff --git a/source/analysis/management/include/G4BinScheme.hh b/source/analysis/management/include/G4BinScheme.hh index ab61221cee..2fca5b902c 100644 --- a/source/analysis/management/include/G4BinScheme.hh +++ b/source/analysis/management/include/G4BinScheme.hh @@ -40,20 +40,20 @@ enum class G4BinScheme { kLinear, kLog, kUser -}; +}; // Utility function namespace G4Analysis { G4BinScheme GetBinScheme(const G4String& binSchemeName); -void ComputeEdges(G4int nbins, G4double xmin, G4double xmax, +void ComputeEdges(G4int nbins, G4double xmin, G4double xmax, G4double unit, G4Fcn fcn, G4BinScheme, std::vector& edges); -void ComputeEdges(const std::vector& edges, - G4double unit, G4Fcn fcn, +void ComputeEdges(const std::vector& edges, + G4double unit, G4Fcn fcn, std::vector& newEdges); } -#endif +#endif diff --git a/source/analysis/management/include/G4Fcn.hh b/source/analysis/management/include/G4Fcn.hh index bfb06e95f8..f23a114107 100644 --- a/source/analysis/management/include/G4Fcn.hh +++ b/source/analysis/management/include/G4Fcn.hh @@ -42,4 +42,4 @@ namespace G4Analysis { G4Fcn GetFunction(const G4String& fcnName); } -#endif +#endif diff --git a/source/analysis/management/include/G4FileMessenger.hh b/source/analysis/management/include/G4FileMessenger.hh index 6484e29294..4aea3b6732 100644 --- a/source/analysis/management/include/G4FileMessenger.hh +++ b/source/analysis/management/include/G4FileMessenger.hh @@ -48,17 +48,18 @@ class G4FileMessenger : public G4UImessenger { public: explicit G4FileMessenger(G4VAnalysisManager* manager); + G4FileMessenger() = delete; virtual ~G4FileMessenger(); - - // methods + + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; - - G4VAnalysisManager* fManager; ///< Associated class - + + G4VAnalysisManager* fManager { nullptr }; ///< Associated class + std::unique_ptr fSetFileNameCmd; std::unique_ptr fSetHistoDirNameCmd; std::unique_ptr fSetNtupleDirNameCmd; }; - + #endif diff --git a/source/analysis/management/include/G4H1Messenger.hh b/source/analysis/management/include/G4H1Messenger.hh index cb32be1f64..2998900d5d 100644 --- a/source/analysis/management/include/G4H1Messenger.hh +++ b/source/analysis/management/include/G4H1Messenger.hh @@ -50,28 +50,29 @@ class G4H1Messenger : public G4UImessenger { public: explicit G4H1Messenger(G4VAnalysisManager* manager); + G4H1Messenger() = delete; virtual ~G4H1Messenger(); - - // methods + + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; - + private: void CreateH1Cmd(); void SetH1Cmd(); - - G4VAnalysisManager* fManager; ///< Associated class - std::unique_ptr fHelper; + + G4VAnalysisManager* fManager { nullptr }; ///< Associated class + std::unique_ptr fHelper; std::unique_ptr fDirectory; std::unique_ptr fCreateH1Cmd; std::unique_ptr fSetH1Cmd; std::unique_ptr fSetH1XCmd; - std::unique_ptr fSetH1TitleCmd; - std::unique_ptr fSetH1XAxisCmd; - std::unique_ptr fSetH1YAxisCmd; + std::unique_ptr fSetH1TitleCmd; + std::unique_ptr fSetH1XAxisCmd; + std::unique_ptr fSetH1YAxisCmd; std::unique_ptr fSetH1XAxisLogCmd; std::unique_ptr fSetH1YAxisLogCmd; }; - + #endif diff --git a/source/analysis/management/include/G4H2Messenger.hh b/source/analysis/management/include/G4H2Messenger.hh index 0d3ea2b8b3..323bcb7674 100644 --- a/source/analysis/management/include/G4H2Messenger.hh +++ b/source/analysis/management/include/G4H2Messenger.hh @@ -34,6 +34,7 @@ #include "G4UImessenger.hh" #include "G4AnalysisMessengerHelper.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" #include @@ -46,33 +47,34 @@ class G4H2Messenger : public G4UImessenger { public: explicit G4H2Messenger(G4VAnalysisManager* manager); + G4H2Messenger() = delete; virtual ~G4H2Messenger(); - - // methods + + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; - + private: void CreateH2Cmd(); void SetH2Cmd(); - - G4VAnalysisManager* fManager; ///< Associated class - std::unique_ptr fHelper; + + G4VAnalysisManager* fManager { nullptr }; ///< Associated class + std::unique_ptr fHelper; std::unique_ptr fDirectory; - + std::unique_ptr fCreateH2Cmd; std::unique_ptr fSetH2Cmd; std::unique_ptr fSetH2XCmd; std::unique_ptr fSetH2YCmd; - std::unique_ptr fSetH2TitleCmd; - std::unique_ptr fSetH2XAxisCmd; - std::unique_ptr fSetH2YAxisCmd; + std::unique_ptr fSetH2TitleCmd; + std::unique_ptr fSetH2XAxisCmd; + std::unique_ptr fSetH2YAxisCmd; std::unique_ptr fSetH2ZAxisCmd; std::unique_ptr fSetH2XAxisLogCmd; std::unique_ptr fSetH2YAxisLogCmd; std::unique_ptr fSetH2ZAxisLogCmd; - G4int fXId; + G4int fXId { G4Analysis::kInvalidId }; G4AnalysisMessengerHelper::BinData fXData; }; - + #endif diff --git a/source/analysis/management/include/G4H3Messenger.hh b/source/analysis/management/include/G4H3Messenger.hh index 7a47f03cf5..8391a38e9a 100644 --- a/source/analysis/management/include/G4H3Messenger.hh +++ b/source/analysis/management/include/G4H3Messenger.hh @@ -34,6 +34,7 @@ #include "G4UImessenger.hh" #include "G4AnalysisMessengerHelper.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" #include @@ -46,36 +47,37 @@ class G4H3Messenger : public G4UImessenger { public: explicit G4H3Messenger(G4VAnalysisManager* manager); + G4H3Messenger() = delete; virtual ~G4H3Messenger(); - - // methods + + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; - + private: void CreateH3Cmd(); void SetH3Cmd(); - - G4VAnalysisManager* fManager; ///< Associated class - std::unique_ptr fHelper; + + G4VAnalysisManager* fManager { nullptr }; ///< Associated class + std::unique_ptr fHelper; std::unique_ptr fDirectory; - + std::unique_ptr fCreateH3Cmd; std::unique_ptr fSetH3Cmd; std::unique_ptr fSetH3XCmd; std::unique_ptr fSetH3YCmd; std::unique_ptr fSetH3ZCmd; - std::unique_ptr fSetH3TitleCmd; - std::unique_ptr fSetH3XAxisCmd; - std::unique_ptr fSetH3YAxisCmd; - std::unique_ptr fSetH3ZAxisCmd; + std::unique_ptr fSetH3TitleCmd; + std::unique_ptr fSetH3XAxisCmd; + std::unique_ptr fSetH3YAxisCmd; + std::unique_ptr fSetH3ZAxisCmd; std::unique_ptr fSetH3XAxisLogCmd; std::unique_ptr fSetH3YAxisLogCmd; std::unique_ptr fSetH3ZAxisLogCmd; - G4int fXId; - G4int fYId; + G4int fXId { G4Analysis::kInvalidId }; + G4int fYId { G4Analysis::kInvalidId }; G4AnalysisMessengerHelper::BinData fXData; G4AnalysisMessengerHelper::BinData fYData; }; - + #endif diff --git a/source/analysis/management/include/G4HnInformation.hh b/source/analysis/management/include/G4HnInformation.hh index 3d33ed9e7c..c8c8f96ee1 100644 --- a/source/analysis/management/include/G4HnInformation.hh +++ b/source/analysis/management/include/G4HnInformation.hh @@ -24,7 +24,7 @@ // ******************************************************************** // -// Data class for the added Hn/Pn information (not available in g4tools). +// Data class for the added Hn/Pn information (not available in g4tools). // // Author: Ivana Hrivnacova, 04/07/2012 (ivana@ipno.in2p3.fr) @@ -32,80 +32,49 @@ #define G4HnInformation_h 1 #include "globals.hh" -#include "G4Fcn.hh" -#include "G4BinScheme.hh" -#include "G4AnalysisUtilities.hh" +#include "G4Fcn.hh" +#include "G4BinScheme.hh" +#include "G4AnalysisUtilities.hh" // The additional Hn information per dimension struct G4HnDimensionInformation { - G4HnDimensionInformation() - : fUnitName(), - fFcnName(), - fUnit(), - fFcn(nullptr), - fBinScheme(G4BinScheme::kLinear) - {} - - G4HnDimensionInformation( + G4HnDimensionInformation( const G4String& unitName, const G4String& fcnName, - G4double unit, + G4double unit, G4Fcn fcn, - G4BinScheme binScheme) - : fUnitName(unitName), + G4BinScheme binScheme) + : fUnitName(unitName), fFcnName(fcnName), - fUnit(unit), + fUnit(unit), fFcn(fcn), fBinScheme(binScheme) {} - - G4HnDimensionInformation(const G4HnDimensionInformation& rhs) - : fUnitName(rhs.fUnitName), - fFcnName(rhs.fFcnName), - fUnit(rhs.fUnit), - fFcn(rhs.fFcn), - fBinScheme(rhs.fBinScheme) - {} - - G4HnDimensionInformation& operator=(const G4HnDimensionInformation& rhs) - { - // check assignment to self - if (this == &rhs) return *this; - - fUnitName = rhs.fUnitName; - fFcnName = rhs.fFcnName; - fUnit = rhs.fUnit; - fFcn = rhs.fFcn; - fBinScheme = rhs.fBinScheme; - - return *this; - } + + G4HnDimensionInformation() = default; + G4HnDimensionInformation(const G4HnDimensionInformation& rhs) = default; + G4HnDimensionInformation& operator=(const G4HnDimensionInformation& rhs) = default; //G4String fName; G4String fUnitName; G4String fFcnName; - G4double fUnit; + G4double fUnit; G4Fcn fFcn; G4BinScheme fBinScheme; -}; +}; class G4HnInformation { public: G4HnInformation(const G4String& name, G4int nofDimensions) - : fName(name), - fHnDimensionInformations(), - fIsLogAxis({ false, false, false }), - fActivation(true), - fAscii(false), - fPlotting(false), - fFileName("") { fHnDimensionInformations.reserve(nofDimensions); } + : fName(name) + { fHnDimensionInformations.reserve(nofDimensions); } // Deleted default constructor - G4HnInformation() = delete; - + G4HnInformation() = delete; + // Set methods void AddHnDimensionInformation( const G4HnDimensionInformation& hnDimensionInformation); @@ -118,7 +87,7 @@ class G4HnInformation void SetAscii(G4bool ascii); void SetPlotting(G4bool plotting); void SetFileName(G4String fileName); - + // Get methods G4String GetName() const; G4HnDimensionInformation* GetHnDimensionInformation(G4int dimension); @@ -132,10 +101,10 @@ class G4HnInformation // Data members G4String fName; std::vector fHnDimensionInformations; - std::vector fIsLogAxis; - G4bool fActivation; - G4bool fAscii; - G4bool fPlotting; + std::vector fIsLogAxis { false, false, false }; + G4bool fActivation { true }; + G4bool fAscii { false }; + G4bool fPlotting { false }; G4String fFileName; }; @@ -146,16 +115,16 @@ inline void G4HnInformation::AddHnDimensionInformation( { fHnDimensionInformations.push_back(hnDimensionInformation); } inline void G4HnInformation::AddDimension( - const G4String& unitName, const G4String& fcnName, G4BinScheme binScheme) + const G4String& unitName, const G4String& fcnName, G4BinScheme binScheme) { auto unit = G4Analysis::GetUnitValue(unitName); auto fcn = G4Analysis::GetFunction(fcnName); - fHnDimensionInformations.push_back( - G4HnDimensionInformation(unitName, fcnName, unit, fcn, binScheme)); + fHnDimensionInformations.emplace_back( + unitName, fcnName, unit, fcn, binScheme); } inline void G4HnInformation::SetDimension(G4int dimension, - const G4String& unitName, const G4String& fcnName, G4BinScheme binScheme) + const G4String& unitName, const G4String& fcnName, G4BinScheme binScheme) { auto info = GetHnDimensionInformation(dimension); auto unit = G4Analysis::GetUnitValue(unitName); diff --git a/source/analysis/management/include/G4HnManager.hh b/source/analysis/management/include/G4HnManager.hh index 51a69694a2..b3734018ce 100644 --- a/source/analysis/management/include/G4HnManager.hh +++ b/source/analysis/management/include/G4HnManager.hh @@ -26,7 +26,7 @@ // Class for management of G4HnInformation. // It implements functions handling the added H1/H2 information -// (not available in g4tools). +// (not available in g4tools). // // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) @@ -38,6 +38,7 @@ #include "globals.hh" #include +#include class G4VFileManager; @@ -46,20 +47,23 @@ class G4HnManager : public G4BaseAnalysisManager public: G4HnManager(const G4String& hnType, const G4AnalysisManagerState& state); + G4HnManager() = delete; virtual ~G4HnManager(); // Methods to manipulate additional information G4HnInformation* AddHnInformation(const G4String& name, G4int nofDimensions); - // Access methofd + void ClearData(); + + // Access methofd G4HnInformation* GetHnInformation(G4int id, - G4String functionName = "", + std::string_view functionName, G4bool warn = true) const; G4HnDimensionInformation* GetHnDimensionInformation(G4int id, G4int dimension, - G4String functionName = "", + std::string_view functionName, G4bool warn = true) const; const std::vector& GetHnVector() const; @@ -77,7 +81,7 @@ class G4HnManager : public G4BaseAnalysisManager // Return false if there is no object selected for ASCII output, // return true otherwise G4bool IsAscii() const; - + // Plotting option // Return false if there is no object selected for plotting, @@ -122,16 +126,19 @@ class G4HnManager : public G4BaseAnalysisManager void SetPlotting(G4HnInformation* info, G4bool plotting); void SetFileName(G4HnInformation* info, const G4String& fileName); + // Static data members + static constexpr std::string_view fkClass { "G4HnManager" }; + // Data members G4String fHnType; - G4int fNofActiveObjects; - G4int fNofAsciiObjects; - G4int fNofPlottingObjects; - G4int fNofFileNameObjects; + G4int fNofActiveObjects { 0 }; + G4int fNofAsciiObjects { 0 }; + G4int fNofPlottingObjects { 0 }; + G4int fNofFileNameObjects { 0 }; // Additional histograms/ntuple properties not included in tools std::vector fHnVector; - std::shared_ptr fFileManager; + std::shared_ptr fFileManager { nullptr }; }; inline G4int G4HnManager::GetNofHns() const diff --git a/source/analysis/management/include/G4HnMessenger.hh b/source/analysis/management/include/G4HnMessenger.hh index 4499d3863d..651ccfe79c 100644 --- a/source/analysis/management/include/G4HnMessenger.hh +++ b/source/analysis/management/include/G4HnMessenger.hh @@ -48,11 +48,12 @@ class G4HnMessenger : public G4UImessenger { public: explicit G4HnMessenger(G4HnManager& manager); + G4HnMessenger() = delete; virtual ~G4HnMessenger(); - - // methods + + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; - + private: void SetHnAsciiCmd(); void SetHnActivationCmd(); @@ -61,7 +62,7 @@ class G4HnMessenger : public G4UImessenger void SetHnPlottingToAllCmd(); void SetHnFileNameCmd(); void SetHnFileNameToAllCmd(); - + G4HnManager& fManager; ///< Associated class std::unique_ptr fHelper; diff --git a/source/analysis/management/include/G4NtupleBookingManager.hh b/source/analysis/management/include/G4NtupleBookingManager.hh index 7b918fb1d1..808dac430d 100644 --- a/source/analysis/management/include/G4NtupleBookingManager.hh +++ b/source/analysis/management/include/G4NtupleBookingManager.hh @@ -24,7 +24,7 @@ // ******************************************************************** // -// Class template for ntuple managers for all output types. +// Manager class for ntuple booking for all output types. // // Author: Ivana Hrivnacova, 19/06/2015 (ivana@ipno.in2p3.fr) @@ -32,26 +32,23 @@ #define G4NtupleBookingManager_h 1 #include "G4BaseAnalysisManager.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" #include "tools/ntuple_booking" #include +#include struct G4NtupleBooking { - G4NtupleBooking() - : fNtupleBooking(), - fNtupleId(-1), - fFileName(), - fActivation(true) {} - - ~G4NtupleBooking() {} + G4NtupleBooking() {} + ~G4NtupleBooking() = default; tools::ntuple_booking fNtupleBooking; - G4int fNtupleId; + G4int fNtupleId { G4Analysis::kInvalidId }; G4String fFileName; - G4bool fActivation; + G4bool fActivation { true }; }; class G4NtupleBookingManager : public G4BaseAnalysisManager @@ -62,6 +59,7 @@ class G4NtupleBookingManager : public G4BaseAnalysisManager public: explicit G4NtupleBookingManager(const G4AnalysisManagerState& state); + G4NtupleBookingManager() = delete; ~G4NtupleBookingManager(); const std::vector& GetNtupleBookingVector() const; @@ -79,29 +77,31 @@ class G4NtupleBookingManager : public G4BaseAnalysisManager // Create columns in the last created ntuple (from base class) // Create columns in the last created ntuple - G4int CreateNtupleIColumn(const G4String& name, + G4int CreateNtupleIColumn(const G4String& name, std::vector* vector); G4int CreateNtupleFColumn(const G4String& name, std::vector* vector) ; G4int CreateNtupleDColumn(const G4String& name, std::vector* vector); - G4int CreateNtupleSColumn(const G4String& name); - G4NtupleBooking* FinishNtuple() ; + G4int CreateNtupleSColumn(const G4String& name, + std::vector* vector); + G4NtupleBooking* FinishNtuple() ; // Create columns in the ntuple with given id - G4int CreateNtupleIColumn(G4int ntupleId, + G4int CreateNtupleIColumn(G4int ntupleId, const G4String& name, std::vector* vector); - G4int CreateNtupleFColumn(G4int ntupleId, + G4int CreateNtupleFColumn(G4int ntupleId, const G4String& name, std::vector* vector); - G4int CreateNtupleDColumn(G4int ntupleId, + G4int CreateNtupleDColumn(G4int ntupleId, const G4String& name, std::vector* vector); - G4int CreateNtupleSColumn(G4int ntupleId, const G4String& name); + G4int CreateNtupleSColumn(G4int ntupleId, + const G4String& name, std::vector* vector); G4NtupleBooking* FinishNtuple(G4int ntupleId); - // The ntuple column ids are generated automatically starting from 0; - // with the following function it is possible to change it + // The ntuple column ids are generated automatically starting from 0; + // with the following function it is possible to change it // to start from another value - G4bool SetFirstNtupleColumnId(G4int firstId); + G4bool SetFirstNtupleColumnId(G4int firstId); G4int GetFirstNtupleColumnId() const; // Activation option @@ -119,25 +119,31 @@ class G4NtupleBookingManager : public G4BaseAnalysisManager G4int GetNofNtupleBookings() const; // G4int GetNofNtuples() const; + // Clear data + void ClearData(); + // Data members std::vector fNtupleBookingVector; private: - // methods + // Methods // Common implementation G4NtupleBooking* GetNtupleBookingInFunction( - G4int id, - G4String function, + G4int id, + std::string_view function, G4bool warn = true) const; - template - G4int CreateNtupleTColumn(G4int ntupleId, + template + G4int CreateNtupleTColumn(G4int ntupleId, const G4String& name, std::vector* vector); G4int GetCurrentNtupleId() const; - // data members + // Static data members + static constexpr std::string_view fkClass { "G4NtupleBookingManager" }; + + // Data members G4String fFileType; - G4int fFirstNtupleColumnId; - G4bool fLockFirstNtupleColumnId; + G4int fFirstNtupleColumnId { 0 }; + G4bool fLockFirstNtupleColumnId { false }; }; #include "G4NtupleBookingManager.icc" diff --git a/source/analysis/management/include/G4NtupleBookingManager.icc b/source/analysis/management/include/G4NtupleBookingManager.icc index 25fa7753ef..efb18e5ca1 100644 --- a/source/analysis/management/include/G4NtupleBookingManager.icc +++ b/source/analysis/management/include/G4NtupleBookingManager.icc @@ -36,18 +36,13 @@ template G4int G4NtupleBookingManager::CreateNtupleTColumn( G4int ntupleId, const G4String& name, std::vector* vector) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << name << " ntupleId " << ntupleId; - fState.GetVerboseL4()->Message("create", "ntuple T column", description); - } -#endif - - auto g4NtupleBooking + Message(G4Analysis::kVL4, "create", "ntuple T column", + " ntupleId " + std::to_string(ntupleId)); + + auto g4NtupleBooking = GetNtupleBookingInFunction(ntupleId, "CreateNtupleTColumn"); - if ( ! g4NtupleBooking ) return G4Analysis::kInvalidId; - + if ( ! g4NtupleBooking ) return G4Analysis::kInvalidId; + // Save column info in booking auto& ntupleBooking = g4NtupleBooking->fNtupleBooking; auto index = ntupleBooking.columns().size(); @@ -55,18 +50,13 @@ G4int G4NtupleBookingManager::CreateNtupleTColumn( ntupleBooking.template add_column(name); else ntupleBooking.template add_column(name, *vector); - + // Create column if ntuple already exists // CreateTColumnInNtuple(ntupleBooking, name, vector); fLockFirstNtupleColumnId = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - G4ExceptionDescription description; - description << name << " ntupleId " << ntupleId; - fState.GetVerboseL2()->Message("create", "ntuple T column", description); - } -#endif + Message(G4Analysis::kVL2, "create", "ntuple T column", + name + " ntupleId " + std::to_string(ntupleId)); return G4int(index + fFirstNtupleColumnId); } @@ -88,7 +78,7 @@ inline G4int G4NtupleBookingManager::GetCurrentNtupleId() const // //_____________________________________________________________________________ -inline const std::vector& +inline const std::vector& G4NtupleBookingManager::GetNtupleBookingVector() const { return fNtupleBookingVector; diff --git a/source/analysis/management/include/G4NtupleMessenger.hh b/source/analysis/management/include/G4NtupleMessenger.hh index 2461cc25de..49f34a46d9 100644 --- a/source/analysis/management/include/G4NtupleMessenger.hh +++ b/source/analysis/management/include/G4NtupleMessenger.hh @@ -36,6 +36,7 @@ #include "globals.hh" #include +#include class G4VAnalysisManager; class G4UIcommand; @@ -46,19 +47,25 @@ class G4NtupleMessenger : public G4UImessenger { public: explicit G4NtupleMessenger(G4VAnalysisManager* manager); + G4NtupleMessenger() = delete; virtual ~G4NtupleMessenger(); - - // methods + + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; - + private: + // Methods void SetActivationCmd(); void SetActivationToAllCmd(); void SetFileNameCmd(); void SetFileNameToAllCmd(); - - G4VAnalysisManager* fManager; ///< Associated class - + + // Static data members + static constexpr std::string_view fkClass { "G4NtupleMessenger" }; + + // Data members + G4VAnalysisManager* fManager { nullptr }; ///< Associated class + std::unique_ptr fNtupleDir; std::unique_ptr fSetActivationCmd; std::unique_ptr fSetActivationAllCmd; @@ -67,4 +74,3 @@ class G4NtupleMessenger : public G4UImessenger }; #endif - diff --git a/source/analysis/management/include/G4P1Messenger.hh b/source/analysis/management/include/G4P1Messenger.hh index f585b924dc..6dbb9306c2 100644 --- a/source/analysis/management/include/G4P1Messenger.hh +++ b/source/analysis/management/include/G4P1Messenger.hh @@ -34,6 +34,7 @@ #include "G4UImessenger.hh" #include "G4AnalysisMessengerHelper.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" #include @@ -46,31 +47,32 @@ class G4P1Messenger : public G4UImessenger { public: explicit G4P1Messenger(G4VAnalysisManager* manager); + G4P1Messenger() = delete; virtual ~G4P1Messenger(); - - // methods + + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; - + private: void CreateP1Cmd(); void SetP1Cmd(); - - G4VAnalysisManager* fManager; ///< Associated class - std::unique_ptr fHelper; + + G4VAnalysisManager* fManager { nullptr }; ///< Associated class + std::unique_ptr fHelper; std::unique_ptr fDirectory; - + std::unique_ptr fCreateP1Cmd; std::unique_ptr fSetP1Cmd; std::unique_ptr fSetP1XCmd; std::unique_ptr fSetP1YCmd; - std::unique_ptr fSetP1TitleCmd; - std::unique_ptr fSetP1XAxisCmd; - std::unique_ptr fSetP1YAxisCmd; + std::unique_ptr fSetP1TitleCmd; + std::unique_ptr fSetP1XAxisCmd; + std::unique_ptr fSetP1YAxisCmd; std::unique_ptr fSetP1XAxisLogCmd; std::unique_ptr fSetP1YAxisLogCmd; - G4int fXId; - G4AnalysisMessengerHelper::BinData fXData; + G4int fXId { G4Analysis::kInvalidId }; + G4AnalysisMessengerHelper::BinData fXData; }; - + #endif diff --git a/source/analysis/management/include/G4P2Messenger.hh b/source/analysis/management/include/G4P2Messenger.hh index a2832e6d46..a348d717c6 100644 --- a/source/analysis/management/include/G4P2Messenger.hh +++ b/source/analysis/management/include/G4P2Messenger.hh @@ -34,6 +34,7 @@ #include "G4UImessenger.hh" #include "G4AnalysisMessengerHelper.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" #include @@ -46,36 +47,37 @@ class G4P2Messenger : public G4UImessenger { public: explicit G4P2Messenger(G4VAnalysisManager* manager); + G4P2Messenger() = delete; virtual ~G4P2Messenger(); - - // methods + + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; - + private: void CreateP2Cmd(); void SetP2Cmd(); - - G4VAnalysisManager* fManager; ///< Associated class - std::unique_ptr fHelper; + + G4VAnalysisManager* fManager { nullptr }; ///< Associated class + std::unique_ptr fHelper; std::unique_ptr fDirectory; - + std::unique_ptr fCreateP2Cmd; std::unique_ptr fSetP2Cmd; std::unique_ptr fSetP2XCmd; std::unique_ptr fSetP2YCmd; std::unique_ptr fSetP2ZCmd; - std::unique_ptr fSetP2TitleCmd; - std::unique_ptr fSetP2XAxisCmd; - std::unique_ptr fSetP2YAxisCmd; - std::unique_ptr fSetP2ZAxisCmd; + std::unique_ptr fSetP2TitleCmd; + std::unique_ptr fSetP2XAxisCmd; + std::unique_ptr fSetP2YAxisCmd; + std::unique_ptr fSetP2ZAxisCmd; std::unique_ptr fSetP2XAxisLogCmd; std::unique_ptr fSetP2YAxisLogCmd; std::unique_ptr fSetP2ZAxisLogCmd; - G4int fXId; - G4int fYId; + G4int fXId { G4Analysis::kInvalidId }; + G4int fYId { G4Analysis::kInvalidId }; G4AnalysisMessengerHelper::BinData fXData; G4AnalysisMessengerHelper::BinData fYData; }; - + #endif diff --git a/source/analysis/management/include/G4PlotManager.hh b/source/analysis/management/include/G4PlotManager.hh index 756c41a4c5..b15d04ef5b 100644 --- a/source/analysis/management/include/G4PlotManager.hh +++ b/source/analysis/management/include/G4PlotManager.hh @@ -35,35 +35,40 @@ #include "G4PlotParameters.hh" #include "G4HnInformation.hh" -#include +#include "tools/viewplot" #include #include +#include class G4PlotManager { public: explicit G4PlotManager(const G4AnalysisManagerState& state); - ~G4PlotManager(); + ~G4PlotManager() = default; // deleted functions + G4PlotManager() = delete; G4PlotManager(const G4PlotManager& rhs) = delete; G4PlotManager& operator=(const G4PlotManager& rhs) = delete; - + public: - // methods + // Methods G4bool OpenFile(const G4String& fileName); - template - G4bool PlotAndWrite(const std::vector& htVector, + template + G4bool PlotAndWrite(const std::vector& htVector, const std::vector& hnVector); G4bool CloseFile(); - private: - // methods + private: + // Methods G4int GetNofPlotsPerPage() const; G4bool WritePage(); - // data members + // Static data members + static constexpr std::string_view fkClass { "G4PlotManager" }; + + // Data members const G4AnalysisManagerState& fState; G4PlotParameters fPlotParameters; std::unique_ptr fViewer; @@ -78,19 +83,19 @@ inline G4int G4PlotManager::GetNofPlotsPerPage() const //_____________________________________________________________________________ -template -inline G4bool G4PlotManager::PlotAndWrite(const std::vector& htVector, +template +inline G4bool G4PlotManager::PlotAndWrite(const std::vector& htVector, const std::vector& hnVector) { if ( ! htVector.size() ) return true; - fViewer->plots().init_sg(); + fViewer->plots().init_sg(); //it will recreate the sg::plotters and then reset the styles on new ones. fViewer->set_cols_rows(fPlotParameters.GetColumns(), fPlotParameters.GetRows()); fViewer->plots().set_current_plotter(0); - G4bool finalResult = true; - G4bool isWriteNeeded = false; + auto result = true; + auto isWriteNeeded = false; for ( G4int i=0; i& htVector, if ( ( ! plotting ) || ( fState.GetIsActivation() && ( ! activation ) ) ) continue; - T* ht = htVector[i]; + HT* ht = htVector[i]; // plot this object fViewer->plot(*ht); @@ -144,30 +149,25 @@ inline G4bool G4PlotManager::PlotAndWrite(const std::vector& htVector, } isWriteNeeded = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3()->Message("plotting", "hd|pd", name); -#endif + fState.Message(G4Analysis::kVL3, "plotting", "hd|pd", name); // write a page if number of plots per page is achieved - if ( G4int(fViewer->plots().current_index()) == (GetNofPlotsPerPage() - 1) ) { - G4bool result = WritePage(); - finalResult = result && finalResult; + if ( G4int(fViewer->plots().current_index()) == (GetNofPlotsPerPage() - 1) ) { + result &= WritePage(); isWriteNeeded = false; } // Prepare for the next plot - fViewer->plots().next(); + fViewer->plots().next(); } // write a page if loop is finished and there are plots to be written if ( isWriteNeeded ) { - G4bool result = WritePage(); - finalResult = result && finalResult; + result &= WritePage(); } // add test of result - return finalResult; + return result; } #endif diff --git a/source/analysis/management/include/G4PlotMessenger.hh b/source/analysis/management/include/G4PlotMessenger.hh index 04e41e35fa..84a7135a3f 100644 --- a/source/analysis/management/include/G4PlotMessenger.hh +++ b/source/analysis/management/include/G4PlotMessenger.hh @@ -47,24 +47,25 @@ class G4PlotMessenger : public G4UImessenger { public: explicit G4PlotMessenger(G4PlotParameters* plotParameters); + G4PlotMessenger() = delete; virtual ~G4PlotMessenger(); - - // methods + + // Methods virtual void SetNewValue(G4UIcommand* command, G4String value) final; - + private: void SetStyleCmd(); void SetLayoutCmd(); void SetDimensionsCmd(); - - G4PlotParameters* fPlotParameters; ///< Associated class - std::unique_ptr fHelper; + + G4PlotParameters* fPlotParameters { nullptr }; ///< Associated class + std::unique_ptr fHelper; std::unique_ptr fDirectory; std::unique_ptr fSetLayoutCmd; std::unique_ptr fSetDimensionsCmd; std::unique_ptr fSetStyleCmd; }; - + #endif diff --git a/source/analysis/management/include/G4PlotParameters.hh b/source/analysis/management/include/G4PlotParameters.hh index 218d44652e..f83350fb1c 100644 --- a/source/analysis/management/include/G4PlotParameters.hh +++ b/source/analysis/management/include/G4PlotParameters.hh @@ -24,7 +24,7 @@ // ******************************************************************** // -// The data class which defined the configuration parameters for plotting +// The data class which defined the configuration parameters for plotting // which can be modified via UI commands. // // Author: Ivana Hrivnacova, 21/10/2015 (ivana@ipno.in2p3.fr) @@ -36,22 +36,23 @@ #include "G4PlotMessenger.hh" #include +#include -class G4PlotParameters +class G4PlotParameters { public: G4PlotParameters(); // setters - void SetLayout(G4int columns, G4int rows); + void SetLayout(G4int columns, G4int rows); void SetDimensions(G4int width, G4int height); void SetStyle(const G4String& style); // getters // limits - G4int GetMaxColumns(); + G4int GetMaxColumns(); G4int GetMaxRows(); - G4String GetAvailableStyles(); + G4String GetAvailableStyles(); // data G4int GetColumns() const; G4int GetRows() const; @@ -60,36 +61,51 @@ class G4PlotParameters G4float GetScale() const; G4String GetStyle() const; - private: - // data members + private: + // Static data members + static constexpr std::string_view fkClass { "G4PlotParameters" }; + static constexpr G4int fkHRDefaultWidth { 2000 }; + static constexpr G4int fkLRDefaultWidth { 700 }; + static constexpr G4int fkDefaultColumns { 1 }; + static constexpr G4int fkDefaultRows { 2 }; + static constexpr G4float fkDefaultScale { 0.9f }; +#if defined(TOOLS_USE_FREETYPE) + //Have vertical A4 : + static constexpr G4int fkDefaultWidth { fkHRDefaultWidth }; + static constexpr G4int fkDefaultHeight { static_cast(29.7f/21.0f*fkHRDefaultWidth) }; + // limits + static constexpr G4int fkMaxColumns { 3 }; + static constexpr G4int fkMaxRows { 5 }; +#else + //Have vertical A4 : + static constexpr G4int fkDefaultWidth { fkLRDefaultWidth }; + static constexpr G4int fkDefaultHeight { static_cast(29.7f/21.0f*fkLRDefaultWidth) }; + // limits + static constexpr G4int fkMaxColumns { 2 }; + static constexpr G4int fkMaxRows { 3 }; +#endif + + // Data members std::unique_ptr fMessenger; // defaults - G4int fDefaultColumns; - G4int fDefaultRows; - G4int fDefaultWidth; - G4int fDefaultHeight; G4String fDefaultStyle; - G4float fDefaultScale; - // limits - G4int fMaxColumns; - G4int fMaxRows; - G4String fAvailableStyles; + G4String fAvailableStyles; // data - G4int fColumns; - G4int fRows; - G4int fWidth; - G4int fHeight; - G4float fScale; + G4int fColumns { fkDefaultColumns }; + G4int fRows { fkDefaultRows }; + G4int fWidth { fkDefaultWidth }; + G4int fHeight { fkDefaultHeight }; + G4float fScale { fkDefaultScale }; G4String fStyle; -}; +}; // inline functions inline G4int G4PlotParameters::GetMaxColumns() -{ return fMaxColumns; } +{ return fkMaxColumns; } inline G4int G4PlotParameters::GetMaxRows() -{ return fMaxRows; } +{ return fkMaxRows; } inline G4String G4PlotParameters::GetAvailableStyles() { return fAvailableStyles; } diff --git a/source/analysis/management/include/G4TFileInformation.hh b/source/analysis/management/include/G4TFileInformation.hh index 998a2be5c4..b74215d88a 100644 --- a/source/analysis/management/include/G4TFileInformation.hh +++ b/source/analysis/management/include/G4TFileInformation.hh @@ -39,21 +39,17 @@ template struct G4TFileInformation { - G4TFileInformation(const G4String fileName) - : fFileName(fileName), - fFile(nullptr), - fIsOpen(false), - fIsEmpty(true), - fIsDeleted(false) {} + G4TFileInformation(const G4String fileName) + : fFileName(fileName) {} - ~G4TFileInformation() - {} + G4TFileInformation() = default; + ~G4TFileInformation() = default; G4String fFileName; - std::shared_ptr fFile; - G4bool fIsOpen; - G4bool fIsEmpty; - G4bool fIsDeleted; + std::shared_ptr fFile { nullptr }; + G4bool fIsOpen { false }; + G4bool fIsEmpty { true }; + G4bool fIsDeleted { false }; }; #endif diff --git a/source/analysis/management/include/G4TFileManager.hh b/source/analysis/management/include/G4TFileManager.hh index 48e8653175..793e65cb1f 100644 --- a/source/analysis/management/include/G4TFileManager.hh +++ b/source/analysis/management/include/G4TFileManager.hh @@ -33,14 +33,16 @@ #include #include +#include template class G4TFileManager { public: explicit G4TFileManager(const G4AnalysisManagerState& state); + G4TFileManager() = delete; virtual ~G4TFileManager(); - + // Per file methods // (implements all tests and warnings, fills the map) std::shared_ptr CreateTFile(const G4String& fileName); @@ -56,6 +58,9 @@ class G4TFileManager G4bool CloseFiles(); G4bool DeleteEmptyFiles(); + // Clear all data + void ClearData(); + protected: // Methods to be implemented per file type manipulate file virtual std::shared_ptr CreateFileImpl(const G4String& fileName) = 0; @@ -64,17 +69,20 @@ class G4TFileManager private: // Methods - void FileNotFoundException(const G4String& fileName, - const G4String& functionName) const; - G4TFileInformation* GetFileInfoInFunction(const G4String& fileName, - G4String functionName, G4bool warn = true) const; - std::shared_ptr GetFileInFunction(const G4String& fileName, - G4String functionName, G4bool warn = true) const; + void FileNotFoundWarning(const G4String& fileName, + std::string_view functionName) const; + G4TFileInformation* GetFileInfoInFunction(const G4String& fileName, + std::string_view functionName, G4bool warn = true) const; + std::shared_ptr GetFileInFunction(const G4String& fileName, + std::string_view functionName, G4bool warn = true) const; G4bool WriteTFile(std::shared_ptr file, const G4String& fileName); G4bool CloseTFile(std::shared_ptr file, const G4String& fileName); G4bool DeleteEmptyFile(const G4String& fileName); + // Static data members + static constexpr std::string_view fkClass { "G4TFileManager" }; + // Data members const G4AnalysisManagerState& fAMState; std::map*> fFileMap; diff --git a/source/analysis/management/include/G4TFileManager.icc b/source/analysis/management/include/G4TFileManager.icc index 368a58a155..99fbee220f 100644 --- a/source/analysis/management/include/G4TFileManager.icc +++ b/source/analysis/management/include/G4TFileManager.icc @@ -26,6 +26,8 @@ // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) +#include "G4AnalysisUtilities.hh" + //_____________________________________________________________________________ template inline @@ -38,7 +40,7 @@ template inline G4TFileManager::~G4TFileManager() { - for ( auto mapElement : fFileMap ) { + for ( const auto& mapElement : fFileMap ) { delete mapElement.second; } } @@ -50,28 +52,25 @@ G4TFileManager::~G4TFileManager() //_____________________________________________________________________________ template inline -void -G4TFileManager::FileNotFoundException(const G4String& fileName, - const G4String& functionName) const +void +G4TFileManager::FileNotFoundWarning(const G4String& fileName, + std::string_view functionName) const { - G4ExceptionDescription description; - description - << "Failed to get file " << fileName; - G4Exception(functionName, "Analysis_W011", JustWarning, description); + G4Analysis::Warn("Failed to get file " + fileName, fkClass, functionName); } //_____________________________________________________________________________ template inline -G4TFileInformation* -G4TFileManager::GetFileInfoInFunction(const G4String& fileName, - G4String functionName, G4bool warn ) const +G4TFileInformation* +G4TFileManager::GetFileInfoInFunction(const G4String& fileName, + std::string_view functionName, G4bool warn ) const { // Find the file information in the map auto it = fFileMap.find(fileName); if ( it == fFileMap.end() ) { if (warn) { - FileNotFoundException(fileName, functionName); + FileNotFoundWarning(fileName, functionName); } return nullptr; } @@ -82,9 +81,9 @@ G4TFileManager::GetFileInfoInFunction(const G4String& fileName, //_____________________________________________________________________________ template inline -std::shared_ptr +std::shared_ptr G4TFileManager::GetFileInFunction(const G4String& fileName, - G4String functionName, G4bool warn) const + std::string_view functionName, G4bool warn) const { // Find the file information in the map auto fileInfo = GetFileInfoInFunction(fileName, functionName, warn); @@ -93,9 +92,9 @@ G4TFileManager::GetFileInFunction(const G4String& fileName, // Check if the file is open if ( ! fileInfo->fFile ) { if (warn) { - FileNotFoundException(fileName, functionName); + FileNotFoundWarning(fileName, functionName); } - return nullptr; + return nullptr; } return fileInfo->fFile; @@ -104,24 +103,15 @@ G4TFileManager::GetFileInFunction(const G4String& fileName, //_____________________________________________________________________________ template inline -#ifdef G4VERBOSE -G4bool G4TFileManager::WriteTFile(std::shared_ptr file, const G4String& fileName) -#else -G4bool G4TFileManager::WriteTFile(std::shared_ptr file, const G4String& /*fileName*/) -#endif +G4bool G4TFileManager::WriteTFile(std::shared_ptr file, + [[maybe_unused]] const G4String& fileName) { -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL4() ) - fAMState.GetVerboseL4()->Message("write", "file", fileName); -#endif + fAMState.Message(G4Analysis::kVL4, "write", "file", fileName); // Write the found file auto result = WriteFileImpl(file); -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL1() ) - fAMState.GetVerboseL1()->Message("write", "file", fileName); -#endif + fAMState.Message(G4Analysis::kVL1, "write", "file", fileName, result); return result; } @@ -129,24 +119,15 @@ G4bool G4TFileManager::WriteTFile(std::shared_ptr file, const G4String& //_____________________________________________________________________________ template inline -#ifdef G4VERBOSE -G4bool G4TFileManager::CloseTFile(std::shared_ptr file, const G4String& fileName) -#else -G4bool G4TFileManager::CloseTFile(std::shared_ptr file, const G4String& /*fileName*/) -#endif +G4bool G4TFileManager::CloseTFile(std::shared_ptr file, + [[maybe_unused]] const G4String& fileName) { -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL4() ) - fAMState.GetVerboseL4()->Message("close", "file", fileName); -#endif + fAMState.Message(G4Analysis::kVL4, "close", "file", fileName); // Close the found file auto result = CloseFileImpl(file); -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL1() ) - fAMState.GetVerboseL1()->Message("close", "file", fileName); -#endif + fAMState.Message(G4Analysis::kVL1, "close", "file", fileName, result); return result; } @@ -156,23 +137,28 @@ template inline G4bool G4TFileManager::DeleteEmptyFile(const G4String& fileName) { -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL4() ) { - fAMState.GetVerboseL4()->Message("delete", "empty file", fileName); - } -#endif + fAMState.Message(G4Analysis::kVL4, "delete", "empty file", fileName); auto result = ! std::remove(fileName); -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL1() ) { - fAMState.GetVerboseL1()->Message("delete", "empty file", fileName, result); - } -#endif + fAMState.Message(G4Analysis::kVL1, "delete", "empty file", fileName, result); return result; } +//_____________________________________________________________________________ +template +inline +void G4TFileManager::ClearData() +{ + for ( const auto& mapElement : fFileMap ) { + delete mapElement.second; + } + fFileMap.clear(); + + fAMState.Message(G4Analysis::kVL2, "clear", "files"); +} + // // public functions // @@ -184,42 +170,27 @@ std::shared_ptr G4TFileManager::CreateTFile(const G4String& fileName) { // Check if file already exists if ( GetFileInFunction(fileName, "CreateTFile", false) ) { - G4ExceptionDescription description; - description - << "File " << fileName << " already exists."; - G4Exception("G4TFileManager::CreateTFile", - "Analysis_W001", JustWarning, description); - // return it->second->fFile; + G4Analysis::Warn("File " + fileName + " already exists.", + fkClass, "CreateTFile"); return nullptr; } auto fileInformation = GetFileInfoInFunction(fileName, "CreateTFile", false); if ( ! fileInformation ) { -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL4() ) { - fAMState.GetVerboseL4()->Message("create", "fileInformation", fileName); - } -#endif + fAMState.Message(G4Analysis::kVL4, "create", "fileInformation", fileName); + // Create file information and save it in the map fileInformation = new G4TFileInformation(fileName); fFileMap[fileName] = fileInformation; } // Create file and save it in fileInformation -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL4() ) { - fAMState.GetVerboseL4()->Message("create", "file", fileName); - } -#endif + fAMState.Message(G4Analysis::kVL4, "create", "file", fileName); // Let concrete class create a file auto file = CreateFileImpl(fileName); if ( ! file ) { - G4ExceptionDescription description; - description - << "Failed to create file " << fileName; - G4Exception("G4TFileManager::CreateTFile", - "Analysis_W001", JustWarning, description); + G4Analysis::Warn("Failed to create file " + fileName, fkClass, "CreateTFile"); return nullptr; } // Save file in fileInformation @@ -228,11 +199,7 @@ std::shared_ptr G4TFileManager::CreateTFile(const G4String& fileName) fileInformation->fIsEmpty = true; fileInformation->fIsDeleted = false; -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL1() ) { - fAMState.GetVerboseL1()->Message("create", "file", fileName); - } -#endif + fAMState.Message(G4Analysis::kVL1, "create", "file", fileName); // Return created file return file; @@ -267,7 +234,7 @@ G4bool G4TFileManager::CloseTFile(const G4String& fileName) // Get file from the file information auto file = fileInfo->fFile; if ( ! file ) { - FileNotFoundException(fileName, "CloseTFile"); + FileNotFoundWarning(fileName, "CloseTFile"); return false; } @@ -291,23 +258,17 @@ G4bool G4TFileManager::SetIsEmpty(const G4String& fileName, G4bool isEmpty) // Warning is issued in GetFileFunction if ( ! fileInfo ) return false; -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL4() ) { - fAMState.GetVerboseL4()->Message("notify not empty", "file", fileName); - } -#endif + fAMState.Message(G4Analysis::kVL4, "notify not empty", "file", fileName); // Set notification to file information if ( fileInfo->fIsEmpty ) { // do not revert information if file is not empty fileInfo->fIsEmpty = isEmpty; - } -#ifdef G4VERBOSE - if ( fAMState.GetVerboseL2() ) { - fAMState.GetVerboseL2()->Message("notify not empty", "file", fileName); + if ( ! isEmpty ) { + fAMState.Message(G4Analysis::kVL3, "notify not empty", "file", fileName); + } } -#endif return true; } @@ -327,19 +288,18 @@ template inline G4bool G4TFileManager::OpenFiles() { - bool finalResult = true; - for ( auto mapElement : fFileMap ) { + auto result = true; + for ( const auto& mapElement : fFileMap ) { auto fileInformation = mapElement.second; // Do nothing if file was open by user explicitly if ( fileInformation->fFile ) { - G4cout << " ... skipping open file for " << fileInformation->fFileName << G4endl; + // G4cout << "... skipping open file for " << fileInformation->fFileName << G4endl; continue; } - - auto result = CreateTFile(fileInformation->fFileName); - finalResult = result && finalResult; + + result &= (CreateTFile(fileInformation->fFileName) != nullptr); } - return finalResult; + return result; } //_____________________________________________________________________________ @@ -347,17 +307,16 @@ template inline G4bool G4TFileManager::WriteFiles() { - bool finalResult = true; - for ( auto mapElement : fFileMap ) { + auto result = true; + for ( const auto& mapElement : fFileMap ) { auto fileInformation = mapElement.second; if ( ! fileInformation->fIsOpen ) { // G4cout << "skipping write for file " << fileInformation->fFileName << G4endl; continue; } - auto result = WriteTFile(fileInformation->fFile, fileInformation->fFileName); - finalResult = result && finalResult; + result &= WriteTFile(fileInformation->fFile, fileInformation->fFileName); } - return finalResult; + return result; } //_____________________________________________________________________________ @@ -365,15 +324,14 @@ template inline G4bool G4TFileManager::CloseFiles() { - bool finalResult = true; - for ( auto mapElement : fFileMap ) { + auto result = true; + for ( const auto& mapElement : fFileMap ) { auto fileInformation = mapElement.second; if ( ! fileInformation->fIsOpen ) { // G4cout << "skipping close for file " << fileInformation->fFileName << G4endl; continue; } - auto result = CloseTFile(fileInformation->fFile, fileInformation->fFileName); - finalResult = result && finalResult; + result &= CloseTFile(fileInformation->fFile, fileInformation->fFileName); // Update file information fileInformation->fFile.reset(); @@ -383,7 +341,7 @@ G4bool G4TFileManager::CloseFiles() // As the files were set to nullptr, clear should not be needed // fFileMap.clear(); - return finalResult; + return result; } //_____________________________________________________________________________ @@ -391,20 +349,19 @@ template inline G4bool G4TFileManager::DeleteEmptyFiles() { - bool finalResult = true; - for ( auto mapElement : fFileMap ) { + auto result = true; + for ( const auto& mapElement : fFileMap ) { auto fileInformation = mapElement.second; if ( (! fileInformation->fIsEmpty) || fileInformation->fIsDeleted ) { // G4cout << "skipping delete for file " << fileInformation->fFileName << G4endl; continue; } - auto result = DeleteEmptyFile(fileInformation->fFileName); - finalResult = result && finalResult; + result &= DeleteEmptyFile(fileInformation->fFileName); // Update file information fileInformation->fIsDeleted = true; } - return finalResult; + return result; } diff --git a/source/analysis/management/include/G4THnManager.hh b/source/analysis/management/include/G4THnManager.hh index df8c586b87..0b4b0abade 100644 --- a/source/analysis/management/include/G4THnManager.hh +++ b/source/analysis/management/include/G4THnManager.hh @@ -39,50 +39,70 @@ #include #include #include +#include class G4AnalysisManagerState; class G4HnManager; -template +template class G4THnManager { public: G4THnManager(const G4AnalysisManagerState& state, const G4String& hnType); + G4THnManager() = delete; virtual ~G4THnManager(); + G4int RegisterT(HT* t, const G4String& name); + // Reset data G4bool Reset(); + + // Clear data + void ClearData(); + // Return true if the H1 vector is empty - G4bool IsEmpty() const; + G4bool IsEmpty() const; // Method for merge (MT) - void AddTVector(const std::vector& tVector); + void AddTVector(const std::vector& tVector); // New method for merge - void Merge(G4Mutex& mergeMutex, G4THnManager* masterInstance); + void Merge(G4Mutex& mergeMutex, G4THnManager* masterInstance); + + // Get method + HT* GetT(G4int id) const; protected: // Iterators - typename std::vector::iterator BeginT(); - typename std::vector::iterator EndT(); - typename std::vector::const_iterator BeginConstT() const; - typename std::vector::const_iterator EndConstT() const; + typename std::vector::iterator BeginT(); + typename std::vector::iterator EndT(); + typename std::vector::const_iterator BeginConstT() const; + typename std::vector::const_iterator EndConstT() const; - T* GetTInFunction(G4int id, - G4String functionName, + HT* GetTInFunction(G4int id, + std::string_view functionName, G4bool warn = true, G4bool onlyIfActive = true) const; - G4int RegisterT(T* t, const G4String& name); - G4int GetTId(const G4String& name, G4bool warn = true) const; - // data members + // Methods for verbose + G4bool IsVerbose(G4int verboseLevel) const; + void Message(G4int level, + const G4String& action, + const G4String& objectType, + const G4String& objectName = "", + G4bool success = true) const; + + // Static data members + static constexpr std::string_view fkClass { "G4THnManager" }; + + // Data members const G4AnalysisManagerState& fState; - std::vector fTVector; - std::map fNameIdMap; - std::shared_ptr fHnManager; + std::vector fTVector; + std::map fNameIdMap; + std::shared_ptr fHnManager { nullptr }; }; // inline functions @@ -90,4 +110,3 @@ class G4THnManager #include "G4THnManager.icc" #endif - diff --git a/source/analysis/management/include/G4THnManager.icc b/source/analysis/management/include/G4THnManager.icc index c6b54531a1..856d5a1b5b 100644 --- a/source/analysis/management/include/G4THnManager.icc +++ b/source/analysis/management/include/G4THnManager.icc @@ -31,115 +31,107 @@ #include "G4AnalysisUtilities.hh" #include "G4AutoLock.hh" -#include +using std::to_string; //_____________________________________________________________________________ -template -G4THnManager::G4THnManager(const G4AnalysisManagerState& state, +template +G4THnManager::G4THnManager(const G4AnalysisManagerState& state, const G4String& hnType) - : fState(state), - fTVector(), - fNameIdMap(), - fHnManager(nullptr) + : fState(state) { fHnManager = std::make_shared(hnType, state); } //_____________________________________________________________________________ -template -G4THnManager::~G4THnManager() +template +G4THnManager::~G4THnManager() { for ( auto t : fTVector ) { delete t; - } + } } -// +// // protected methods // //_____________________________________________________________________________ -template -T* G4THnManager::GetTInFunction(G4int id, - G4String functionName, G4bool warn, - G4bool onlyIfActive) const +template +HT* G4THnManager::GetTInFunction(G4int id, + std::string_view functionName, G4bool warn, + G4bool onlyIfActive) const { G4int index = id - fHnManager->GetFirstId(); if ( index < 0 || index >= G4int(fTVector.size()) ) { if ( warn) { - G4String inFunction = "G4THnManager::"; - inFunction += functionName; - G4ExceptionDescription description; - description << " " << "histogram " << id << " does not exist."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); + G4Analysis::Warn("Histogram " + to_string(id) + " does not exist.", + fkClass, functionName); } - return nullptr; + return nullptr; } - - // Do not return histogram if inactive + + // Do not return histogram if inactive if ( fState.GetIsActivation() && onlyIfActive && ( ! fHnManager->GetActivation(id) ) ) { - return nullptr; - } - + return nullptr; + } + return fTVector[index]; -} +} //_____________________________________________________________________________ -template -G4int G4THnManager::RegisterT(T* t, const G4String& name) -{ - G4int index = fTVector.size(); - fTVector.push_back(t); - - fHnManager->SetLockFirstId(true); - fNameIdMap[name] = index + fHnManager->GetFirstId(); - return index + fHnManager->GetFirstId(); -} - -//_____________________________________________________________________________ -template -G4int G4THnManager::GetTId(const G4String& name, G4bool warn) const +template +G4int G4THnManager::GetTId(const G4String& name, G4bool warn) const { auto it = fNameIdMap.find(name); - if ( it == fNameIdMap.end() ) { + if ( it == fNameIdMap.end() ) { if ( warn) { - G4String inFunction = "G4THnManager::GetH1Id"; - G4ExceptionDescription description; - description << " " << "histogram " << name << " does not exist."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); + G4Analysis::Warn("histogram " + name + " does not exist.", + fkClass, "GetTId"); } - return G4Analysis::kInvalidId; + return G4Analysis::kInvalidId; } return it->second; -} +} //_____________________________________________________________________________ -template -void G4THnManager::AddTVector(const std::vector& tVector) +template +G4bool G4THnManager::IsVerbose(G4int verboseLevel) const { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("merge", "all " + fHnManager->GetHnType(), ""); -#endif + return fState.IsVerbose(verboseLevel); +} + +//_____________________________________________________________________________ +template +void G4THnManager::Message( + G4int level, const G4String& action, const G4String& objectType, + const G4String& objectName, G4bool success) const +{ + fState.Message(level, action, objectType, objectName, success); +} + +//_____________________________________________________________________________ +template +void G4THnManager::AddTVector(const std::vector& tVector) +{ + Message(G4Analysis::kVL4, "merge", "all " + fHnManager->GetHnType()); + // std::vector::const_iterator itw = h1Vector.begin(); // std::vector::iterator it; // for (it = fH1Vector.begin(); it != fH1Vector.end(); it++ ) { // (*it)->add(*(*itw++)); - // } + // } auto itw = tVector.begin(); for ( auto t : fTVector ) { t->add(*(*itw++)); - } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1()->Message("merge", "all " + fHnManager->GetHnType(), ""); -#endif -} + } + + Message(G4Analysis::kVL1, "merge", "all " + fHnManager->GetHnType()); +} //_____________________________________________________________________________ -template -void G4THnManager::Merge( - G4Mutex& mergeMutex, G4THnManager* masterInstance) +template +void G4THnManager::Merge( + G4Mutex& mergeMutex, G4THnManager* masterInstance) { G4AutoLock lH1(&mergeMutex); masterInstance->AddTVector(fTVector); @@ -147,56 +139,93 @@ void G4THnManager::Merge( } //_____________________________________________________________________________ -template -typename std::vector::iterator G4THnManager::BeginT() -{ - return fTVector.begin(); +template +typename std::vector::iterator G4THnManager::BeginT() +{ + return fTVector.begin(); } //_____________________________________________________________________________ -template -typename std::vector::iterator G4THnManager::EndT() -{ - return fTVector.end(); +template +typename std::vector::iterator G4THnManager::EndT() +{ + return fTVector.end(); } //_____________________________________________________________________________ -template -typename std::vector::const_iterator G4THnManager::BeginConstT() const -{ - return fTVector.begin(); +template +typename std::vector::const_iterator G4THnManager::BeginConstT() const +{ + return fTVector.begin(); } //_____________________________________________________________________________ -template -typename std::vector::const_iterator G4THnManager::EndConstT() const -{ - return fTVector.end(); +template +typename std::vector::const_iterator G4THnManager::EndConstT() const +{ + return fTVector.end(); } -// +// // public methods // //_____________________________________________________________________________ -template -G4bool G4THnManager::Reset() +template +G4int G4THnManager::RegisterT(HT* t, const G4String& name) { -// Reset histograms and ntuple + G4int index = fTVector.size(); + fTVector.push_back(t); - G4bool finalResult = true; - - for ( auto t : fTVector ) { - G4bool result = t->reset(); - if ( ! result ) finalResult = false; - } - - return finalResult; -} + fHnManager->SetLockFirstId(true); + fNameIdMap[name] = index + fHnManager->GetFirstId(); + return index + fHnManager->GetFirstId(); +} //_____________________________________________________________________________ -template -G4bool G4THnManager::IsEmpty() const +template +G4bool G4THnManager::Reset() +{ +// Reset histograms + + auto result = true; + + for ( auto t : fTVector ) { + result &= t->reset(); + } + + return result; +} + +//_____________________________________________________________________________ +template +void +G4THnManager::ClearData() +{ + for ( auto t : fTVector ) { + delete t; + } + + fTVector.clear(); + fNameIdMap.clear(); + + if ( fHnManager != nullptr ) { + fHnManager->ClearData(); + } + + Message(G4Analysis::kVL2, "clear", G4Analysis::GetHnType()); +} + +//_____________________________________________________________________________ +template +G4bool G4THnManager::IsEmpty() const { return ! fTVector.size(); -} +} + +//_____________________________________________________________________________ +template +HT* G4THnManager::GetT(G4int id) const +{ + return GetTInFunction(id, "GetT"); +} diff --git a/source/analysis/management/include/G4TNtupleDescription.hh b/source/analysis/management/include/G4TNtupleDescription.hh index 96d7332406..921cfbe562 100644 --- a/source/analysis/management/include/G4TNtupleDescription.hh +++ b/source/analysis/management/include/G4TNtupleDescription.hh @@ -39,30 +39,26 @@ #include -template +template struct G4TNtupleDescription { - G4TNtupleDescription(G4NtupleBooking* g4NtupleBooking) - : fFile(nullptr), - fNtuple(nullptr), - fNtupleBooking(g4NtupleBooking->fNtupleBooking), + G4TNtupleDescription(G4NtupleBooking* g4NtupleBooking) + : fNtupleBooking(g4NtupleBooking->fNtupleBooking), fFileName(g4NtupleBooking->fFileName), - fActivation(g4NtupleBooking->fActivation), - fIsNtupleOwner(true), - fHasFill(false) {} + fActivation(g4NtupleBooking->fActivation) + {} + G4TNtupleDescription() = delete; ~G4TNtupleDescription() - { - if ( fIsNtupleOwner ) delete fNtuple; - } + { if ( fIsNtupleOwner ) delete fNtuple; } - std::shared_ptr fFile; - TN* fNtuple; - tools::ntuple_booking fNtupleBooking; + std::shared_ptr fFile { nullptr }; + NT* fNtuple { nullptr }; + tools::ntuple_booking fNtupleBooking; G4String fFileName; G4bool fActivation; - G4bool fIsNtupleOwner; - G4bool fHasFill; + G4bool fIsNtupleOwner { true }; + G4bool fHasFill { false }; }; -#endif +#endif diff --git a/source/analysis/management/include/G4TNtupleManager.hh b/source/analysis/management/include/G4TNtupleManager.hh index 04eb18155b..e9cea8159a 100644 --- a/source/analysis/management/include/G4TNtupleManager.hh +++ b/source/analysis/management/include/G4TNtupleManager.hh @@ -36,39 +36,42 @@ #include "globals.hh" #include +#include -// TN - ntuple type, TF - file type -template +// NT - ntuple type, FT - file type +template class G4TNtupleManager : public G4BaseNtupleManager { public: explicit G4TNtupleManager(const G4AnalysisManagerState& state); + G4TNtupleManager() = delete; ~G4TNtupleManager(); protected: - // Methods to manipulate ntuples + // Methods to manipulate ntuples virtual G4int CreateNtuple(G4NtupleBooking* ntupleBooking) override; virtual void CreateNtuplesFromBooking( const std::vector& ntupleBookings); - // virtual void CreateNtuplesFromBooking(); - virtual G4bool Reset(G4bool deleteNtuple); + + virtual G4bool Reset(); + virtual void Clear() override; // Methods to create ntuples // are implemented in G4NtupleBookingManager base class // Methods to fill ntuples - // Methods for ntuple with id = FirstNtupleId (from base class) + // Methods for ntuple with id = FirstNtupleId (from base class) using G4BaseNtupleManager::FillNtupleIColumn; using G4BaseNtupleManager::FillNtupleFColumn; using G4BaseNtupleManager::FillNtupleDColumn; using G4BaseNtupleManager::FillNtupleSColumn; using G4BaseNtupleManager::AddNtupleRow; - // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) + // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) virtual G4bool FillNtupleIColumn(G4int ntupleId, G4int columnId, G4int value) final; virtual G4bool FillNtupleFColumn(G4int ntupleId, G4int columnId, G4float value) final; virtual G4bool FillNtupleDColumn(G4int ntupleId, G4int columnId, G4double value) final; - virtual G4bool FillNtupleSColumn(G4int ntupleId, G4int columnId, + virtual G4bool FillNtupleSColumn(G4int ntupleId, G4int columnId, const G4String& value) final; virtual G4bool AddNtupleRow(G4int ntupleId) override; @@ -79,45 +82,48 @@ class G4TNtupleManager : public G4BaseNtupleManager { virtual G4bool GetActivation(G4int ntupleId) const final; // Access methods - TN* GetNtuple() const; - TN* GetNtuple(G4int ntupleId) const; + NT* GetNtuple() const; + NT* GetNtuple(G4int ntupleId) const; virtual G4int GetNofNtuples() const final; // Iterators - typename std::vector::iterator BeginNtuple(); - typename std::vector::iterator EndNtuple(); - typename std::vector::const_iterator BeginConstNtuple() const; - typename std::vector::const_iterator EndConstNtuple() const; - + typename std::vector::iterator BeginNtuple(); + typename std::vector::iterator EndNtuple(); + typename std::vector::const_iterator BeginConstNtuple() const; + typename std::vector::const_iterator EndConstNtuple() const; + // Data members - std::vector*> fNtupleDescriptionVector; - std::vector fNtupleVector; + std::vector*> fNtupleDescriptionVector; + std::vector fNtupleVector; private: - // methods + // Methods // Fuctions which are specific to output type // virtual void CreateTNtupleFromBooking( - G4TNtupleDescription* ntupleDescription) = 0; + G4TNtupleDescription* ntupleDescription) = 0; virtual void FinishTNtuple( - G4TNtupleDescription* ntupleDescription, + G4TNtupleDescription* ntupleDescription, G4bool fromBooking) = 0; // Common implementation // - G4TNtupleDescription* GetNtupleDescriptionInFunction(G4int id, - G4String function, + G4TNtupleDescription* GetNtupleDescriptionInFunction(G4int id, + std::string_view function, G4bool warn = true) const; - TN* GetNtupleInFunction(G4int id, - G4String function, + NT* GetNtupleInFunction(G4int id, + std::string_view function, G4bool warn = true) const; // template functions for filling ntuple columns - template + template G4bool FillNtupleTColumn(G4int ntupleId, G4int columnId, const T& value); + + // Static data members + static constexpr std::string_view fkClass { "G4TNtupleManager" }; }; #include "G4TNtupleManager.icc" diff --git a/source/analysis/management/include/G4TNtupleManager.icc b/source/analysis/management/include/G4TNtupleManager.icc index e1810b98dd..3736fa6996 100644 --- a/source/analysis/management/include/G4TNtupleManager.icc +++ b/source/analysis/management/include/G4TNtupleManager.icc @@ -27,81 +27,75 @@ #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" +using std::to_string; + // // private template functions // //_____________________________________________________________________________ -template -G4TNtupleManager::G4TNtupleManager( +template +G4TNtupleManager::G4TNtupleManager( const G4AnalysisManagerState& state) - : G4BaseNtupleManager(state), - fNtupleDescriptionVector(), - fNtupleVector() + : G4BaseNtupleManager(state) {} //_____________________________________________________________________________ -template -G4TNtupleManager::~G4TNtupleManager() -{ +template +G4TNtupleManager::~G4TNtupleManager() +{ for ( auto ntupleDescription : fNtupleDescriptionVector ) { delete ntupleDescription; - } + } } //_____________________________________________________________________________ -template -G4TNtupleDescription* -G4TNtupleManager::GetNtupleDescriptionInFunction( - G4int id, G4String functionName, G4bool warn) const +template +G4TNtupleDescription* +G4TNtupleManager::GetNtupleDescriptionInFunction( + G4int id, std::string_view functionName, G4bool warn) const { auto index = id - fFirstId; if ( index < 0 || index >= G4int(fNtupleDescriptionVector.size()) ) { if ( warn) { - G4String inFunction = "G4TNtupleManager::"; - inFunction += functionName; - G4ExceptionDescription description; - description << " " << "ntuple " << id << " does not exist."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); + G4Analysis::Warn("Ntuple " + to_string(id) + " does not exist.", + fkClass, functionName); } - return nullptr; + return nullptr; } return fNtupleDescriptionVector[index]; } //_____________________________________________________________________________ -template -TN* G4TNtupleManager::GetNtupleInFunction( - G4int id, G4String functionName, G4bool warn) const +template +NT* G4TNtupleManager::GetNtupleInFunction( + G4int id, std::string_view functionName, G4bool warn) const { auto ntupleDescription = GetNtupleDescriptionInFunction(id, functionName); if ( ! ntupleDescription ) return nullptr; if ( ! ntupleDescription->fNtuple ) { if ( warn ) { - G4String inFunction = "G4TNtupleManager::"; - inFunction += functionName; - G4ExceptionDescription description; - description << " " << "ntupleId " << id << " does not exist."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); + G4Analysis::Warn("Ntuple " + to_string(id) + " does not exist.", + fkClass, functionName); } return nullptr; - } + } return ntupleDescription->fNtuple; } //_____________________________________________________________________________ -template +template template -G4bool G4TNtupleManager::FillNtupleTColumn( +G4bool G4TNtupleManager::FillNtupleTColumn( G4int ntupleId, G4int columnId, const T& value) { if ( fState.GetIsActivation() && ( ! GetActivation(ntupleId) ) ) { - //G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; - return false; - } + //G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; + return false; + } // get ntuple auto ntuple = GetNtupleInFunction(ntupleId, "FillNtupleTColumn"); @@ -110,38 +104,35 @@ G4bool G4TNtupleManager::FillNtupleTColumn( // get generic column auto index = columnId - fFirstNtupleColumnId; if ( index < 0 || index >= G4int(ntuple->columns().size()) ) { - G4ExceptionDescription description; - description << " " << "ntupleId " << ntupleId - << " columnId " << columnId << " does not exist."; - G4Exception("G4TNtupleManager::FillNtupleTColumn()", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + "Ntuple " + to_string(ntupleId) + " column " + to_string(columnId) + + " does not exist.", + fkClass, "FillNtupleTColumn"); return false; } auto icolumn = ntuple->columns()[index]; // get column and check its type - auto column = dynamic_cast* >(icolumn); + auto column = dynamic_cast* >(icolumn); if ( ! column ) { - G4ExceptionDescription description; - description << " Column type does not match: " - << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - G4Exception("G4TNtupleManager:FillNtupleTColumn", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + "Column type does not match: " + " ntuple " + to_string(ntupleId) + " column " + to_string(columnId) + + " value " + G4Analysis::ToString(value), + fkClass, "FillNtupleTColumn"); return false; - } + } column->fill(value); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("fill", "ntuple T column", description); - } -#endif - return true; + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "fill", "ntuple T column", + " ntupleId " + to_string(ntupleId) + + " column " + to_string(columnId) + + " value " + G4Analysis::ToString(value)); + } + + return true; } // @@ -149,17 +140,11 @@ G4bool G4TNtupleManager::FillNtupleTColumn( // //_____________________________________________________________________________ -template -G4int G4TNtupleManager::CreateNtuple(G4NtupleBooking* ntupleBooking) +template +G4int G4TNtupleManager::CreateNtuple(G4NtupleBooking* ntupleBooking) { - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4() - ->Message("create from booking", "ntuple", - ntupleBooking->fNtupleBooking.name()); - } -#endif + Message(G4Analysis::kVL4, "create from booking", "ntuple", + ntupleBooking->fNtupleBooking.name()); // The ntuple index auto index = ntupleBooking->fNtupleId - fFirstId; @@ -170,11 +155,9 @@ G4int G4TNtupleManager::CreateNtuple(G4NtupleBooking* ntupleBooking) if ( index < G4int(fNtupleDescriptionVector.size()) && fNtupleDescriptionVector[index] ) { delete fNtupleDescriptionVector[index]; - G4ExceptionDescription description; - description - << "Ntuple description " << ntupleBooking->fNtupleId << " already exists."; - G4Exception("G4TNtupleManager::CreateNtuple", - "Analysis_W002", JustWarning, description); + G4Analysis::Warn( + "Ntuple description " + to_string(ntupleBooking->fNtupleId) + + " already exists.", fkClass, "CreateNtuple"); } // Allocate the vector element(s) @@ -183,20 +166,18 @@ G4int G4TNtupleManager::CreateNtuple(G4NtupleBooking* ntupleBooking) } // Create ntuple description from ntuple booking. - auto ntupleDescription = new G4TNtupleDescription(ntupleBooking); + auto ntupleDescription = new G4TNtupleDescription(ntupleBooking); fNtupleDescriptionVector[index] = ntupleDescription; - // Do not create ntuple if it is inactivated - if ( fState.GetIsActivation() && + // Do not create ntuple if it is inactivated + if ( fState.GetIsActivation() && ( ! ntupleDescription->fActivation ) ) return G4Analysis::kInvalidId; - + // Do not create ntuple if it already exists if ( ntupleDescription->fNtuple ) { - G4ExceptionDescription description; - description - << "Ntuple " << ntupleBooking->fNtupleId << " already exists."; - G4Exception("G4TNtupleManager::CreateNtuple", - "Analysis_W002", JustWarning, description); + G4Analysis::Warn( + "Ntuple " + to_string(ntupleBooking->fNtupleId) + + " already exists.", fkClass, "CreateNtuple"); return ntupleBooking->fNtupleId; } @@ -207,19 +188,15 @@ G4int G4TNtupleManager::CreateNtuple(G4NtupleBooking* ntupleBooking) auto fromBooking = true; FinishTNtuple(ntupleDescription, fromBooking); -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3() - ->Message("create from booking", "ntuple", - ntupleBooking->fNtupleBooking.name()); -#endif + Message(G4Analysis::kVL3, "create from booking", "ntuple", + ntupleBooking->fNtupleBooking.name()); return ntupleBooking->fNtupleId; } //_____________________________________________________________________________ -template -void G4TNtupleManager::CreateNtuplesFromBooking( +template +void G4TNtupleManager::CreateNtuplesFromBooking( const std::vector& ntupleBookings) { // Create ntuple from ntuple bookings. @@ -231,114 +208,113 @@ void G4TNtupleManager::CreateNtuplesFromBooking( } //_____________________________________________________________________________ -template -G4bool -G4TNtupleManager::Reset(G4bool /*deleteNtuple*/) +template +G4bool +G4TNtupleManager::Reset() { for ( auto ntupleDescription : fNtupleDescriptionVector ) { - // if ( deleteNtuple ) { - // delete ntupleDescription->fNtuple; - // } - // ntupleDescription->fNtuple = 0; delete ntupleDescription; } fNtupleDescriptionVector.clear(); fNtupleVector.clear(); - + return true; -} +} //_____________________________________________________________________________ -template -G4bool G4TNtupleManager::FillNtupleIColumn( +template +void +G4TNtupleManager::Clear() +{ + // Reset function clears all data + Reset(); + + Message(G4Analysis::kVL2, "clear", "ntuples"); +} + +//_____________________________________________________________________________ +template +G4bool G4TNtupleManager::FillNtupleIColumn( G4int ntupleId, G4int columnId, G4int value) { return FillNtupleTColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ -template -G4bool G4TNtupleManager::FillNtupleFColumn( +template +G4bool G4TNtupleManager::FillNtupleFColumn( G4int ntupleId, G4int columnId, G4float value) { return FillNtupleTColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ -template -G4bool G4TNtupleManager::FillNtupleDColumn( +template +G4bool G4TNtupleManager::FillNtupleDColumn( G4int ntupleId, G4int columnId, G4double value) { return FillNtupleTColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ -template -G4bool G4TNtupleManager::FillNtupleSColumn( +template +G4bool G4TNtupleManager::FillNtupleSColumn( G4int ntupleId, G4int columnId, const G4String& value) { return FillNtupleTColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ -template -G4bool G4TNtupleManager::AddNtupleRow( +template +G4bool G4TNtupleManager::AddNtupleRow( G4int ntupleId) -{ +{ if ( fState.GetIsActivation() && ( ! GetActivation(ntupleId) ) ) { - //G4cout << "Skipping AddNtupleRow for " << ntupleId << G4endl; - return false; - } + //G4cout << "Skipping AddNtupleRow for " << ntupleId << G4endl; + return false; + } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId; - fState.GetVerboseL4()->Message("add", "ntuple row", description); - } -#endif + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "add", "ntuple row", + " ntupleId " + to_string(ntupleId)); + } auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "AddNtupleRow"); if ( ! ntupleDescription ) return false; auto ntuple = ntupleDescription->fNtuple; if ( ! ntuple ) return false; - + auto result = ntuple->add_row(); if ( ! result ) { - G4ExceptionDescription description; - description << " " << " ntupleId " << ntupleId - << "adding row has failed."; - G4Exception("G4TNtupleManager::AddTNtupleRow()", - "Analysis_W002", JustWarning, description); - } + G4Analysis::Warn( + "Ntuple " + to_string(ntupleId) + " adding row has failed.", + fkClass, "AddTNtupleRow"); + } ntupleDescription->fHasFill = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId; - fState.GetVerboseL4()->Message("add", "ntuple row", description); - } -#endif + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "add", "ntuple row", + " ntupleId " + to_string(ntupleId)); + } return true; } //_____________________________________________________________________________ -template -void G4TNtupleManager::SetActivation( +template +void G4TNtupleManager::SetActivation( G4bool activation) { for ( auto ntupleDescription : fNtupleDescriptionVector ) { ntupleDescription->fActivation = activation; - } + } } //_____________________________________________________________________________ -template -void G4TNtupleManager::SetActivation( +template +void G4TNtupleManager::SetActivation( G4int ntupleId, G4bool activation) { auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "SetActivation"); @@ -348,8 +324,8 @@ void G4TNtupleManager::SetActivation( } //_____________________________________________________________________________ -template -G4bool G4TNtupleManager::GetActivation( +template +G4bool G4TNtupleManager::GetActivation( G4int ntupleId) const { auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "GetActivation"); @@ -359,59 +335,59 @@ G4bool G4TNtupleManager::GetActivation( } //_____________________________________________________________________________ -template -TN* -G4TNtupleManager::GetNtuple() const +template +NT* +G4TNtupleManager::GetNtuple() const { return GetNtuple(fFirstId); -} +} //_____________________________________________________________________________ -template -TN* -G4TNtupleManager::GetNtuple(G4int ntupleId) const +template +NT* +G4TNtupleManager::GetNtuple(G4int ntupleId) const { auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "GetNtuple"); - if ( ! ntupleDescription ) return nullptr; - - return ntupleDescription->fNtuple; -} + if ( ! ntupleDescription ) return nullptr; + + return ntupleDescription->fNtuple; +} //_____________________________________________________________________________ -template -typename std::vector::iterator -G4TNtupleManager::BeginNtuple() -{ +template +typename std::vector::iterator +G4TNtupleManager::BeginNtuple() +{ return fNtupleVector.begin(); } //_____________________________________________________________________________ -template -typename std::vector::iterator -G4TNtupleManager::EndNtuple() -{ - return fNtupleVector.end(); -} - -//_____________________________________________________________________________ -template -typename std::vector::const_iterator -G4TNtupleManager::BeginConstNtuple() const -{ - return fNtupleVector.begin(); -} - -//_____________________________________________________________________________ -template -typename std::vector::const_iterator -G4TNtupleManager::EndConstNtuple() const -{ +template +typename std::vector::iterator +G4TNtupleManager::EndNtuple() +{ return fNtupleVector.end(); } //_____________________________________________________________________________ -template -G4int G4TNtupleManager::GetNofNtuples() const -{ +template +typename std::vector::const_iterator +G4TNtupleManager::BeginConstNtuple() const +{ + return fNtupleVector.begin(); +} + +//_____________________________________________________________________________ +template +typename std::vector::const_iterator +G4TNtupleManager::EndConstNtuple() const +{ + return fNtupleVector.end(); +} + +//_____________________________________________________________________________ +template +G4int G4TNtupleManager::GetNofNtuples() const +{ return G4int(fNtupleVector.size()); } diff --git a/source/analysis/management/include/G4TRNtupleDescription.hh b/source/analysis/management/include/G4TRNtupleDescription.hh index 7f49b937b7..fd33784e04 100644 --- a/source/analysis/management/include/G4TRNtupleDescription.hh +++ b/source/analysis/management/include/G4TRNtupleDescription.hh @@ -24,7 +24,7 @@ // ******************************************************************** // -// Structure containing the information related to rroot ntuple +// Structure containing the information related to rntuple // // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) @@ -36,34 +36,35 @@ #include #include -namespace tools { +namespace tools { class ntuple_binding; } -template +template struct G4TRNtupleDescription { - G4TRNtupleDescription(TNTUPLE* rntuple) + G4TRNtupleDescription(NT* rntuple) : fNtuple(rntuple), - fNtupleBinding(new tools::ntuple_binding()), - fIsInitialized(false), - fIVectorBindingMap(), - fFVectorBindingMap(), - fDVectorBindingMap() {} + fNtupleBinding(new tools::ntuple_binding()) + {} + G4TRNtupleDescription() = delete; ~G4TRNtupleDescription() - { + { delete fNtupleBinding; - delete fNtuple; // CHECK + delete fNtuple; {for ( auto mapElement : fIVectorBindingMap ) { - delete mapElement.first; + delete mapElement.first; }} {for ( auto mapElement : fFVectorBindingMap ) { - delete mapElement.first; + delete mapElement.first; }} {for ( auto mapElement : fDVectorBindingMap ) { - delete mapElement.first; + delete mapElement.first; + }} + {for ( auto mapElement : fSVectorBindingMap ) { + delete mapElement.first; }} } @@ -72,14 +73,15 @@ struct G4TRNtupleDescription // deleted assignement operator G4TRNtupleDescription& operator=(G4TRNtupleDescription& rhs) = delete; - TNTUPLE* fNtuple; - tools::ntuple_binding* fNtupleBinding; - G4bool fIsInitialized; + NT* fNtuple { nullptr }; + tools::ntuple_binding* fNtupleBinding { nullptr }; + G4bool fIsInitialized { false }; // needed for XML - std::map* > fIVectorBindingMap; - std::map* > fFVectorBindingMap; - std::map* > fDVectorBindingMap; + std::map* > fIVectorBindingMap; + std::map* > fFVectorBindingMap; + std::map* > fDVectorBindingMap; + std::map* > fSVectorBindingMap; }; #endif diff --git a/source/analysis/management/include/G4TRNtupleManager.hh b/source/analysis/management/include/G4TRNtupleManager.hh index b67a90559f..69a867c86c 100644 --- a/source/analysis/management/include/G4TRNtupleManager.hh +++ b/source/analysis/management/include/G4TRNtupleManager.hh @@ -36,80 +36,87 @@ #include "globals.hh" #include +#include -template +template class G4TRNtupleManager : public G4BaseRNtupleManager { protected: explicit G4TRNtupleManager(const G4AnalysisManagerState& state); + G4TRNtupleManager() = delete; virtual ~G4TRNtupleManager(); - // Methods to manipulate ntuples + // Methods to manipulate ntuples G4bool IsEmpty() const; G4bool Reset(); // Access methods - TNTUPLE* GetNtuple() const; - TNTUPLE* GetNtuple(G4int ntupleId) const; + NT* GetNtuple() const; + NT* GetNtuple(G4int ntupleId) const; - // Functions independent from the output type + // Functions independent from the output type // // Methods to read ntuple from a file - G4int SetNtuple(G4TRNtupleDescription* rntupleDescription); + G4int SetNtuple(G4TRNtupleDescription* rntupleDescription); - // Methods to bind ntuple (from base class) - using G4BaseRNtupleManager::SetNtupleIColumn; - using G4BaseRNtupleManager::SetNtupleFColumn; - using G4BaseRNtupleManager::SetNtupleDColumn; - using G4BaseRNtupleManager::SetNtupleSColumn; + // Methods to bind ntuple (from base class) + using G4BaseRNtupleManager::SetNtupleIColumn; + using G4BaseRNtupleManager::SetNtupleFColumn; + using G4BaseRNtupleManager::SetNtupleDColumn; + using G4BaseRNtupleManager::SetNtupleSColumn; // Methods to bind ntuple - virtual G4bool SetNtupleIColumn(G4int ntupleId, + virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, G4int& value) final; - virtual G4bool SetNtupleFColumn(G4int ntupleId, + virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, G4float& value) final; - virtual G4bool SetNtupleDColumn(G4int ntupleId, + virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, G4double& value) final; - virtual G4bool SetNtupleSColumn(G4int ntupleId, + virtual G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, G4String& value) final; // Bind the ntuple columns of vector type - virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) override; - virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) override; - virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) override; + virtual G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, + std::vector& vector) override; using G4BaseRNtupleManager::GetNtupleRow; virtual G4bool GetNtupleRow(G4int ntupleId) final; - + // Access methods virtual G4int GetNofNtuples() const final; - + // Utility method - G4TRNtupleDescription* GetNtupleDescriptionInFunction(G4int id, - G4String function, + G4TRNtupleDescription* GetNtupleDescriptionInFunction(G4int id, + std::string_view function, G4bool warn = true) const; private: // Fuctions which are specific to output type // - virtual G4bool GetTNtupleRow(G4TRNtupleDescription* rntupleDescription) = 0; + virtual G4bool GetTNtupleRow(G4TRNtupleDescription* rntupleDescription) = 0; // Common implementation // - template - G4bool SetNtupleTColumn(G4int ntupleId, const G4String& name, + template + G4bool SetNtupleTColumn(G4int ntupleId, const G4String& name, T& value); - template - G4bool SetNtupleTColumn(G4int ntupleId, const G4String& name, + template + G4bool SetNtupleTColumn(G4int ntupleId, const G4String& name, std::vector& vector); - // data members - std::vector*> fNtupleDescriptionVector; -}; + // Static data members + static constexpr std::string_view fkClass { "G4TRNtupleManager" }; + + // Data members + std::vector*> fNtupleDescriptionVector; +}; #include "G4TRNtupleManager.icc" diff --git a/source/analysis/management/include/G4TRNtupleManager.icc b/source/analysis/management/include/G4TRNtupleManager.icc index 104c3279ca..834a1e8c84 100644 --- a/source/analysis/management/include/G4TRNtupleManager.icc +++ b/source/analysis/management/include/G4TRNtupleManager.icc @@ -29,267 +29,245 @@ #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" +using std::to_string; + //_____________________________________________________________________________ -template -G4TRNtupleManager::G4TRNtupleManager(const G4AnalysisManagerState& state) - : G4BaseRNtupleManager(state), - fNtupleDescriptionVector() +template +G4TRNtupleManager::G4TRNtupleManager(const G4AnalysisManagerState& state) + : G4BaseRNtupleManager(state) {} //_____________________________________________________________________________ -template -G4TRNtupleManager::~G4TRNtupleManager() -{ +template +G4TRNtupleManager::~G4TRNtupleManager() +{ for ( auto ntupleDescription : fNtupleDescriptionVector ) { delete ntupleDescription; - } + } } -// +// // private methods // //_____________________________________________________________________________ -template -G4TRNtupleDescription* -G4TRNtupleManager::GetNtupleDescriptionInFunction( - G4int id, G4String functionName, G4bool warn) const -{ +template +G4TRNtupleDescription* +G4TRNtupleManager::GetNtupleDescriptionInFunction( + G4int id, std::string_view functionName, G4bool warn) const +{ G4int index = id - fFirstId; if ( index < 0 || index >= G4int(fNtupleDescriptionVector.size()) ) { if ( warn) { - G4String inFunction = "G4TRNtupleManager::"; - inFunction += functionName; - G4ExceptionDescription description; - description << " " << "ntuple " << id << " does not exist."; - G4Exception(inFunction, "Analysis_WR011", JustWarning, description); + G4Analysis::Warn("ntuple " + to_string(id) + " does not exist.", + fkClass, functionName); } - return nullptr; + return nullptr; } - + return fNtupleDescriptionVector[index]; } //_____________________________________________________________________________ -template -template -G4bool -G4TRNtupleManager::SetNtupleTColumn( +template +template +G4bool +G4TRNtupleManager::SetNtupleTColumn( G4int ntupleId, const G4String& columnName, T& value) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL4()->Message("set", "ntuple I column", description); - } -#endif + Message(G4Analysis::kVL4, "set", "ntuple T column", + " ntupleId " + to_string(ntupleId) + " " + columnName); auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "SetNtupleTColumn"); - if ( ! ntupleDescription ) return false; - + if ( ! ntupleDescription ) return false; + auto ntupleBinding = ntupleDescription->fNtupleBinding; ntupleBinding->add_column(columnName, value); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL2()->Message("set", "ntuple I colum", description, true); - } -#endif + Message(G4Analysis::kVL2, "set", "ntuple T column", + " ntupleId " + to_string(ntupleId) + " " + columnName); return true; } //_____________________________________________________________________________ -template -template -G4bool -G4TRNtupleManager::SetNtupleTColumn( +template +template +G4bool +G4TRNtupleManager::SetNtupleTColumn( G4int ntupleId, const G4String& columnName, std::vector& vector) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL4()->Message("set", "ntuple I column", description); - } -#endif + Message(G4Analysis::kVL4, "set", "ntuple T column", + " ntupleId " + to_string(ntupleId) + " " + columnName); auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "SetNtupleTColumn"); - if ( ! ntupleDescription ) return false; - + if ( ! ntupleDescription ) return false; + auto ntupleBinding = ntupleDescription->fNtupleBinding; ntupleBinding->add_column(columnName, vector); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL2()->Message("set", "ntuple T colum", description, true); - } -#endif + Message(G4Analysis::kVL2, "set", "ntuple T column", + " ntupleId " + to_string(ntupleId) + " " + columnName); + return true; } -// +// // protected methods // //_____________________________________________________________________________ -template -G4bool G4TRNtupleManager::IsEmpty() const +template +G4bool G4TRNtupleManager::IsEmpty() const { return ! fNtupleDescriptionVector.size(); -} - +} + //_____________________________________________________________________________ -template -G4bool G4TRNtupleManager::Reset() +template +G4bool G4TRNtupleManager::Reset() { // Reset ntuples for ( auto ntupleDescription : fNtupleDescriptionVector ) { - ntupleDescription->fNtuple=0; - } - + delete ntupleDescription->fNtuple; + ntupleDescription->fNtuple=nullptr; + } return true; -} +} //_____________________________________________________________________________ -template -TNTUPLE* -G4TRNtupleManager::GetNtuple() const +template +NT* +G4TRNtupleManager::GetNtuple() const { - return GetNtuple(fFirstId); -} + return GetNtuple(fFirstId); +} //_____________________________________________________________________________ -template -TNTUPLE* -G4TRNtupleManager::GetNtuple( +template +NT* +G4TRNtupleManager::GetNtuple( G4int ntupleId) const { auto rntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "GetNtuple"); - if ( ! rntupleDescription ) return nullptr; + if ( ! rntupleDescription ) return nullptr; - return rntupleDescription->fNtuple; -} + return rntupleDescription->fNtuple; +} //_____________________________________________________________________________ -template -G4int G4TRNtupleManager::SetNtuple( - G4TRNtupleDescription* rntupleDescription) +template +G4int G4TRNtupleManager::SetNtuple( + G4TRNtupleDescription* rntupleDescription) { G4int id = fNtupleDescriptionVector.size() + fFirstId; fNtupleDescriptionVector.push_back(rntupleDescription); - + return id; -} +} //_____________________________________________________________________________ -template -G4bool -G4TRNtupleManager::SetNtupleIColumn( +template +G4bool +G4TRNtupleManager::SetNtupleIColumn( G4int ntupleId, const G4String& columnName, G4int& value) { return SetNtupleTColumn(ntupleId, columnName, value); } //_____________________________________________________________________________ -template -G4bool -G4TRNtupleManager::SetNtupleFColumn( +template +G4bool +G4TRNtupleManager::SetNtupleFColumn( G4int ntupleId, const G4String& columnName, G4float& value) -{ +{ return SetNtupleTColumn(ntupleId, columnName, value); } //_____________________________________________________________________________ -template -G4bool -G4TRNtupleManager::SetNtupleDColumn( +template +G4bool +G4TRNtupleManager::SetNtupleDColumn( G4int ntupleId, const G4String& columnName, G4double& value) -{ +{ return SetNtupleTColumn(ntupleId, columnName, value); } //_____________________________________________________________________________ -template -G4bool -G4TRNtupleManager::SetNtupleIColumn( +template +G4bool +G4TRNtupleManager::SetNtupleIColumn( G4int ntupleId, const G4String& columnName, std::vector& vector) { return SetNtupleTColumn(ntupleId, columnName, vector); } //_____________________________________________________________________________ -template -G4bool -G4TRNtupleManager::SetNtupleFColumn( +template +G4bool +G4TRNtupleManager::SetNtupleFColumn( G4int ntupleId, const G4String& columnName, std::vector& vector) { return SetNtupleTColumn(ntupleId, columnName, vector); } //_____________________________________________________________________________ -template -G4bool -G4TRNtupleManager::SetNtupleDColumn( +template +G4bool +G4TRNtupleManager::SetNtupleDColumn( G4int ntupleId, const G4String& columnName, std::vector& vector) { return SetNtupleTColumn(ntupleId, columnName, vector); } //_____________________________________________________________________________ -template -G4bool -G4TRNtupleManager::SetNtupleSColumn( +template +G4bool +G4TRNtupleManager::SetNtupleSColumn( G4int ntupleId, const G4String& columnName, G4String& value) -{ +{ return SetNtupleTColumn(ntupleId, columnName, value); } //_____________________________________________________________________________ -template -G4bool G4TRNtupleManager::GetNtupleRow(G4int ntupleId) +template +G4bool +G4TRNtupleManager::SetNtupleSColumn( + G4int ntupleId, const G4String& columnName, std::vector& vector) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId; - fState.GetVerboseL4()->Message("get", "ntuple row", description); - } -#endif + return SetNtupleTColumn(ntupleId, columnName, vector); +} - auto ntupleDescription +//_____________________________________________________________________________ +template +G4bool G4TRNtupleManager::GetNtupleRow(G4int ntupleId) +{ + Message(G4Analysis::kVL4, "get", "ntuple row", + "ntupleId " + to_string(ntupleId)); + + auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "GetNtupleRow"); - if ( ! ntupleDescription ) return false; - + if ( ! ntupleDescription ) return false; + auto next = GetTNtupleRow(ntupleDescription); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId; - fState.GetVerboseL2()->Message("get", "ntuple row", description, true); - } -#endif + Message(G4Analysis::kVL2, "get", "ntuple row", + "ntupleId " + to_string(ntupleId)); return next; } //_____________________________________________________________________________ -template -G4int -G4TRNtupleManager::GetNofNtuples() const -{ - return G4int(fNtupleDescriptionVector.size()); +template +G4int +G4TRNtupleManager::GetNofNtuples() const +{ + return G4int(fNtupleDescriptionVector.size()); } diff --git a/source/analysis/management/include/G4VAnalysisManager.hh b/source/analysis/management/include/G4VAnalysisManager.hh index de78e3f5a9..e5888017b1 100644 --- a/source/analysis/management/include/G4VAnalysisManager.hh +++ b/source/analysis/management/include/G4VAnalysisManager.hh @@ -29,7 +29,7 @@ // Individual use of the component managers is disabled // (except for file manager and Hn manager which are also used from // other object managers). -// The functions which has to be implemented in concrete managers +// The functions which has to be implemented in concrete managers // are declared as virtual protected. // Author: Ivana Hrivnacova, 09/07/2013 (ivana@ipno.in2P2.fr) @@ -43,7 +43,7 @@ #include #include #include - +#include class G4AnalysisMessenger; class G4NtupleBookingManager; @@ -59,25 +59,24 @@ class G4PlotManager; namespace tools { namespace histo{ -class hmpi; -} +class hmpi; +} } class G4VAnalysisManager { public: - G4VAnalysisManager(const G4String& type, G4bool isMaster); - virtual ~G4VAnalysisManager(); - - // Methods for handling files + // Methods for handling files G4bool OpenFile(const G4String& fileName = ""); - G4bool Write(); + G4bool Write(); G4bool CloseFile(G4bool reset = true); + G4bool Reset(); + void Clear(); G4bool Merge(tools::histo::hmpi* hmpi); G4bool Plot(); G4bool IsOpenFile() const; - // Methods for handling files and directories names + // Methods for handling files and directories names G4bool SetFileName(const G4String& fileName); G4bool SetHistoDirectoryName(const G4String& dirName); G4bool SetNtupleDirectoryName(const G4String& dirName); @@ -102,48 +101,48 @@ class G4VAnalysisManager const G4String& fcnName = "none"); G4int CreateH2(const G4String& name, const G4String& title, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinSchemeName = "linear", const G4String& ybinSchemeName = "linear"); - + G4int CreateH2(const G4String& name, const G4String& title, const std::vector& xedges, const std::vector& yedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none"); - + G4int CreateH3(const G4String& name, const G4String& title, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4int nzbins, G4double zmin, G4double zmax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinSchemeName = "linear", const G4String& ybinSchemeName = "linear", const G4String& zbinSchemeName = "linear"); - + G4int CreateH3(const G4String& name, const G4String& title, const std::vector& xedges, const std::vector& yedges, const std::vector& zedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none"); - + G4bool SetH1(G4int id, G4int nbins, G4double xmin, G4double xmax, const G4String& unitName = "none", @@ -156,11 +155,11 @@ class G4VAnalysisManager const G4String& fcnName = "none"); G4bool SetH2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinSchemeName = "linear", const G4String& ybinSchemeName = "linear"); @@ -168,19 +167,19 @@ class G4VAnalysisManager G4bool SetH2(G4int id, const std::vector& xedges, const std::vector& yedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none"); G4bool SetH3(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nzbins, G4double zmin, G4double zmax, G4int nybins, G4double ymin, G4double ymax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinSchemeName = "linear", @@ -191,82 +190,82 @@ class G4VAnalysisManager const std::vector& xedges, const std::vector& yedges, const std::vector& zedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none"); G4bool ScaleH1(G4int id, G4double factor); - G4bool ScaleH2(G4int id, G4double factor); - G4bool ScaleH3(G4int id, G4double factor); - + G4bool ScaleH2(G4int id, G4double factor); + G4bool ScaleH3(G4int id, G4double factor); + // Methods for handling profiles // G4int CreateP1(const G4String& name, const G4String& title, G4int nbins, G4double xmin, G4double xmax, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinSchemeName = "linear"); G4int CreateP1(const G4String& name, const G4String& title, const std::vector& edges, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none"); - + G4int CreateP2(const G4String& name, const G4String& title, G4int nxbins, G4double xmin, G4double xmax, - G4int nybins, G4double ymin, G4double ymax, + G4int nybins, G4double ymin, G4double ymax, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", - const G4String& xbinSchemeName = "linear", + const G4String& xbinSchemeName = "linear", const G4String& ybinSchemeName = "linear"); G4int CreateP2(const G4String& name, const G4String& title, const std::vector& xedges, const std::vector& yedges, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none"); - + G4bool SetP1(G4int id, G4int nbins, G4double xmin, G4double xmax, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinSchemeName = "linear"); G4bool SetP1(G4int id, const std::vector& edges, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none"); - + G4bool SetP2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, - G4int nybins, G4double ymin, G4double ymax, + G4int nxbins, G4double xmin, G4double xmax, + G4int nybins, G4double ymin, G4double ymax, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinSchemeName = "linear", @@ -275,10 +274,10 @@ class G4VAnalysisManager const std::vector& xedges, const std::vector& yedges, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none"); @@ -302,7 +301,9 @@ class G4VAnalysisManager const G4String& name, std::vector& vector); G4int CreateNtupleDColumn( const G4String& name, std::vector& vector); - void FinishNtuple(); + G4int CreateNtupleSColumn( + const G4String& name, std::vector& vector); + void FinishNtuple(); // Create columns in the ntuple with given id G4int CreateNtupleIColumn(G4int ntupleId, const G4String& name); @@ -311,17 +312,19 @@ class G4VAnalysisManager G4int CreateNtupleSColumn(G4int ntupleId, const G4String& name); // Create columns of vector in the ntuple with given id - G4int CreateNtupleIColumn(G4int ntupleId, + G4int CreateNtupleIColumn(G4int ntupleId, const G4String& name, std::vector& vector); - G4int CreateNtupleFColumn(G4int ntupleId, + G4int CreateNtupleFColumn(G4int ntupleId, const G4String& name, std::vector& vector); - G4int CreateNtupleDColumn(G4int ntupleId, + G4int CreateNtupleDColumn(G4int ntupleId, const G4String& name, std::vector& vector); + G4int CreateNtupleSColumn(G4int ntupleId, + const G4String& name, std::vector& vector); + + void FinishNtuple(G4int ntupleId); - void FinishNtuple(G4int ntupleId); - // MT/MPI - virtual void SetNtupleMerging(G4bool mergeNtuples, + virtual void SetNtupleMerging(G4bool mergeNtuples, G4int nofReducedNtupleFiles = 0); virtual void SetNtupleRowWise(G4bool rowWise, G4bool rowMode = true); virtual void SetBasketSize(unsigned int basketSize); @@ -339,37 +342,37 @@ class G4VAnalysisManager G4bool SetFirstP2Id(G4int firstId); G4bool SetFirstNtupleId(G4int firstId); G4bool SetFirstNtupleColumnId(G4int firstId); - + // Methods to fill histograms G4bool FillH1(G4int id, G4double value, G4double weight = 1.0); G4bool FillH2(G4int id, G4double xvalue, G4double yvalue, G4double weight = 1.0); - G4bool FillH3(G4int id, + G4bool FillH3(G4int id, G4double xvalue, G4double yvalue, G4double zvalue, G4double weight = 1.0); // Methods to fill profiles - G4bool FillP1(G4int id, G4double xvalue, G4double yvalue, + G4bool FillP1(G4int id, G4double xvalue, G4double yvalue, G4double weight = 1.0); - G4bool FillP2(G4int id, - G4double xvalue, G4double yvalue, G4double zvalue, + G4bool FillP2(G4int id, + G4double xvalue, G4double yvalue, G4double zvalue, G4double weight = 1.0); - + // Methods to fill ntuples - // Methods for ntuple with id = FirstNtupleId + // Methods for ntuple with id = FirstNtupleId G4bool FillNtupleIColumn(G4int id, G4int value); G4bool FillNtupleFColumn(G4int id, G4float value); G4bool FillNtupleDColumn(G4int id, G4double value); G4bool FillNtupleSColumn(G4int id, const G4String& value); G4bool AddNtupleRow(); - // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) + // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) G4bool FillNtupleIColumn(G4int ntupleId, G4int columnId, G4int value); G4bool FillNtupleFColumn(G4int ntupleId, G4int columnId, G4float value); G4bool FillNtupleDColumn(G4int ntupleId, G4int columnId, G4double value); G4bool FillNtupleSColumn(G4int ntupleId, G4int id, const G4String& value); G4bool AddNtupleRow(G4int ntupleId); - + // Activation option - + // When this option is enabled, only the histograms/profiles marked as activated // are returned, filled or saved on file. // No warning is issued when Get or Fill is called on inactive histogram. @@ -400,7 +403,7 @@ class G4VAnalysisManager G4int GetFirstP2Id() const; G4int GetFirstNtupleId() const; G4int GetFirstNtupleColumnId() const; - + G4int GetNofH1s() const; G4int GetNofH2s() const; G4int GetNofH3s() const; @@ -414,7 +417,7 @@ class G4VAnalysisManager G4int GetH3Id(const G4String& name, G4bool warn = true) const; G4int GetP1Id(const G4String& name, G4bool warn = true) const; G4int GetP2Id(const G4String& name, G4bool warn = true) const; - + // Methods to manipulate histogram, profiles & ntuples additional information // void SetH1Activation(G4bool activation); @@ -452,7 +455,7 @@ class G4VAnalysisManager void SetNtupleFileName(const G4String& fileName); void SetNtupleFileName(G4int id, const G4String& fileName); - + // Access to histogram & profiles parameters // G4int GetH1Nbins(G4int id) const; @@ -623,20 +626,33 @@ class G4VAnalysisManager G4int GetVerboseLevel() const; // The manager type (starts with an uppercase letter) - G4String GetType() const; + G4String GetType() const; // The manager file type (starts with a lowercase letter) - G4String GetFileType() const; - + G4String GetFileType() const; + protected: - // virtual methods + G4VAnalysisManager(const G4String& type); + G4VAnalysisManager() = delete; + virtual ~G4VAnalysisManager(); + + // Virtual methods virtual G4bool OpenFileImpl(const G4String& fileName) = 0; virtual G4bool WriteImpl() = 0; virtual G4bool CloseFileImpl(G4bool reset) = 0; + virtual G4bool ResetImpl() = 0; + virtual void ClearImpl() = 0; virtual G4bool PlotImpl() = 0; virtual G4bool MergeImpl(tools::histo::hmpi* hmpi) = 0; virtual G4bool IsOpenFileImpl() const = 0; - - // methods + + // Methods + void Message(G4int level, + const G4String& action, + const G4String& objectType, + const G4String& objectName = "", + G4bool success = true) const; + + // Methods void SetH1Manager(G4VH1Manager* h1Manager); void SetH2Manager(G4VH2Manager* h2Manager); void SetH3Manager(G4VH3Manager* h3Manager); @@ -647,27 +663,29 @@ class G4VAnalysisManager void SetPlotManager(std::shared_ptr plotManager); // Methods to manipulate additional information - G4bool WriteAscii(const G4String& fileName); + G4bool WriteAscii(const G4String& fileName); - // constants - static constexpr unsigned int fgkDefaultBasketSize = 32000; - static constexpr unsigned int fgkDefaultBasketEntries = 4000; + // File manager access + virtual std::shared_ptr GetFileManager(const G4String& fileName); - // data members + // Data members G4AnalysisManagerState fState; - std::shared_ptr fVFileManager; - std::shared_ptr fPlotManager; - std::shared_ptr fNtupleBookingManager; - std::shared_ptr fVNtupleManager; + std::shared_ptr fVFileManager { nullptr }; + std::shared_ptr fPlotManager { nullptr }; + std::shared_ptr fNtupleBookingManager { nullptr }; + std::shared_ptr fVNtupleManager { nullptr }; private: - // data members + // Static data members + static constexpr std::string_view fkClass { "G4VAnalysisManager" }; + + // Data members std::unique_ptr fMessenger; - std::shared_ptr fH1HnManager; - std::shared_ptr fH2HnManager; - std::shared_ptr fH3HnManager; - std::shared_ptr fP1HnManager; - std::shared_ptr fP2HnManager; + std::shared_ptr fH1HnManager { nullptr }; + std::shared_ptr fH2HnManager { nullptr }; + std::shared_ptr fH3HnManager { nullptr }; + std::shared_ptr fP1HnManager { nullptr }; + std::shared_ptr fP2HnManager { nullptr }; std::unique_ptr fVH1Manager; std::unique_ptr fVH2Manager; std::unique_ptr fVH3Manager; @@ -678,5 +696,5 @@ class G4VAnalysisManager // inline functions #include "G4VAnalysisManager.icc" - + #endif diff --git a/source/analysis/management/include/G4VAnalysisManager.icc b/source/analysis/management/include/G4VAnalysisManager.icc index 3d91d64cc5..030b135711 100644 --- a/source/analysis/management/include/G4VAnalysisManager.icc +++ b/source/analysis/management/include/G4VAnalysisManager.icc @@ -35,683 +35,692 @@ #include "G4VFileManager.hh" //_____________________________________________________________________________ -inline +inline +void G4VAnalysisManager::Message( + G4int level, const G4String& action, const G4String& objectType, + const G4String& objectName, G4bool success) const +{ + fState.Message(level, action, objectType, objectName, success); +} + +//_____________________________________________________________________________ +inline G4bool G4VAnalysisManager::FillH1(G4int id, G4double value, G4double weight) { return fVH1Manager->FillH1(id, value, weight); } //_____________________________________________________________________________ -inline -G4bool G4VAnalysisManager::FillH2(G4int id, - G4double xvalue, G4double yvalue, +inline +G4bool G4VAnalysisManager::FillH2(G4int id, + G4double xvalue, G4double yvalue, G4double weight) { return fVH2Manager->FillH2(id, xvalue, yvalue, weight); } //_____________________________________________________________________________ -inline -G4bool G4VAnalysisManager::FillH3(G4int id, - G4double xvalue, G4double yvalue, G4double zvalue, +inline +G4bool G4VAnalysisManager::FillH3(G4int id, + G4double xvalue, G4double yvalue, G4double zvalue, G4double weight) { return fVH3Manager->FillH3(id, xvalue, yvalue, zvalue, weight); } //_____________________________________________________________________________ -inline -G4bool G4VAnalysisManager::FillP1(G4int id, G4double xvalue, G4double yvalue, +inline +G4bool G4VAnalysisManager::FillP1(G4int id, G4double xvalue, G4double yvalue, G4double weight) { return fVP1Manager->FillP1(id, xvalue, yvalue, weight); } //_____________________________________________________________________________ -inline -G4bool G4VAnalysisManager::FillP2(G4int id, - G4double xvalue, G4double yvalue, G4double zvalue, +inline +G4bool G4VAnalysisManager::FillP2(G4int id, + G4double xvalue, G4double yvalue, G4double zvalue, G4double weight) { return fVP2Manager->FillP2(id, xvalue, yvalue, zvalue, weight); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::FillNtupleIColumn(G4int columnId, G4int value) { return fVNtupleManager->FillNtupleIColumn(columnId, value); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::FillNtupleFColumn(G4int columnId, G4float value) { return fVNtupleManager->FillNtupleFColumn(columnId, value); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::FillNtupleDColumn(G4int columnId, G4double value) { return fVNtupleManager->FillNtupleDColumn(columnId, value); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::FillNtupleSColumn(G4int columnId, const G4String& value) { return fVNtupleManager->FillNtupleSColumn(columnId, value); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::AddNtupleRow() -{ +{ return fVNtupleManager->AddNtupleRow(); -} +} //_____________________________________________________________________________ -inline -G4bool G4VAnalysisManager::FillNtupleIColumn(G4int ntupleId, G4int columnId, +inline +G4bool G4VAnalysisManager::FillNtupleIColumn(G4int ntupleId, G4int columnId, G4int value) { return fVNtupleManager->FillNtupleIColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ -inline -G4bool G4VAnalysisManager::FillNtupleFColumn(G4int ntupleId, G4int columnId, +inline +G4bool G4VAnalysisManager::FillNtupleFColumn(G4int ntupleId, G4int columnId, G4float value) { return fVNtupleManager->FillNtupleFColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ -inline -G4bool G4VAnalysisManager::FillNtupleDColumn(G4int ntupleId, G4int columnId, +inline +G4bool G4VAnalysisManager::FillNtupleDColumn(G4int ntupleId, G4int columnId, G4double value) { return fVNtupleManager->FillNtupleDColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ -inline -G4bool G4VAnalysisManager::FillNtupleSColumn(G4int ntupleId, G4int columnId, +inline +G4bool G4VAnalysisManager::FillNtupleSColumn(G4int ntupleId, G4int columnId, const G4String& value) { return fVNtupleManager->FillNtupleSColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::AddNtupleRow(G4int ntupleId) -{ +{ return fVNtupleManager->AddNtupleRow(ntupleId); } //_____________________________________________________________________________ -inline -G4bool G4VAnalysisManager::GetActivation() const +inline +G4bool G4VAnalysisManager::GetActivation() const { return fState.GetIsActivation(); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetH1Id(const G4String& name, G4bool warn) const { return fVH1Manager->GetH1Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetH2Id(const G4String& name, G4bool warn) const { return fVH2Manager->GetH2Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetH3Id(const G4String& name, G4bool warn) const { return fVH3Manager->GetH3Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetP1Id(const G4String& name, G4bool warn) const { return fVP1Manager->GetP1Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetP2Id(const G4String& name, G4bool warn) const { return fVP2Manager->GetP2Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetH1Nbins(G4int id) const { return fVH1Manager->GetH1Nbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH1Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH1Manager->GetH1Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH1Xmax(G4int id) const { return fVH1Manager->GetH1Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH1Width(G4int id) const { return fVH1Manager->GetH1Width(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetH2Nxbins(G4int id) const -{ +{ return fVH2Manager->GetH2Nxbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH2Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH2Manager->GetH2Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH2Xmax(G4int id) const { return fVH2Manager->GetH2Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH2XWidth(G4int id) const { return fVH2Manager->GetH2XWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetH2Nybins(G4int id) const { return fVH2Manager->GetH2Nybins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH2Ymin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH2Manager->GetH2Ymin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH2Ymax(G4int id) const { return fVH2Manager->GetH2Ymax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH2YWidth(G4int id) const { return fVH2Manager->GetH2YWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetH3Nxbins(G4int id) const -{ +{ return fVH3Manager->GetH3Nxbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH3Manager->GetH3Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3Xmax(G4int id) const { return fVH3Manager->GetH3Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3XWidth(G4int id) const { return fVH3Manager->GetH3XWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetH3Nybins(G4int id) const { return fVH3Manager->GetH3Nybins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3Ymin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH3Manager->GetH3Ymin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3Ymax(G4int id) const { return fVH3Manager->GetH3Ymax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3YWidth(G4int id) const { return fVH3Manager->GetH3YWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetH3Nzbins(G4int id) const { return fVH3Manager->GetH3Nzbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3Zmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH3Manager->GetH3Zmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3Zmax(G4int id) const { return fVH3Manager->GetH3Zmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3ZWidth(G4int id) const { return fVH3Manager->GetH3ZWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetP1Nbins(G4int id) const -{ +{ return fVP1Manager->GetP1Nbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP1Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP1Manager->GetP1Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP1Xmax(G4int id) const { return fVP1Manager->GetP1Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP1XWidth(G4int id) const { return fVP1Manager->GetP1XWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP1Ymin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP1Manager->GetP1Ymin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP1Ymax(G4int id) const { return fVP1Manager->GetP1Ymax(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetP2Nxbins(G4int id) const -{ +{ return fVP2Manager->GetP2Nxbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP2Manager->GetP2Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2Xmax(G4int id) const { return fVP2Manager->GetP2Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2XWidth(G4int id) const { return fVP2Manager->GetP2XWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisManager::GetP2Nybins(G4int id) const { return fVP2Manager->GetP2Nybins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2Ymin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP2Manager->GetP2Ymin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2Ymax(G4int id) const { return fVP2Manager->GetP2Ymax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2YWidth(G4int id) const { return fVP2Manager->GetP2YWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2Zmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP2Manager->GetP2Zmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2Zmax(G4int id) const { return fVP2Manager->GetP2Zmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetH1Name(G4int id) const { return fH1HnManager->GetName(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH1Unit(G4int id) const { return fH1HnManager->GetXUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH1Activation(G4int id) const { return fH1HnManager->GetActivation(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH1Ascii(G4int id) const { return fH1HnManager->GetAscii(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH1Plotting(G4int id) const { return fH1HnManager->GetPlotting(id); -} +} //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetH2Name(G4int id) const { return fH2HnManager->GetName(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH2XUnit(G4int id) const { return fH2HnManager->GetXUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH2YUnit(G4int id) const { return fH2HnManager->GetYUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH2Activation(G4int id) const { return fH2HnManager->GetActivation(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH2Ascii(G4int id) const { return fH2HnManager->GetAscii(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH2Plotting(G4int id) const { return fH2HnManager->GetPlotting(id); -} +} //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetH3Name(G4int id) const { return fH3HnManager->GetName(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3XUnit(G4int id) const { return fH3HnManager->GetXUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3YUnit(G4int id) const { return fH3HnManager->GetYUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetH3ZUnit(G4int id) const { return fH3HnManager->GetZUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH3Activation(G4int id) const { return fH3HnManager->GetActivation(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH3Ascii(G4int id) const { return fH3HnManager->GetAscii(id); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH3Plotting(G4int id) const { return fH3HnManager->GetPlotting(id); } //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetP1Name(G4int id) const { return fP1HnManager->GetName(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP1XUnit(G4int id) const { return fP1HnManager->GetXUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP1YUnit(G4int id) const { return fP1HnManager->GetYUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP1Activation(G4int id) const { return fP1HnManager->GetActivation(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP1Ascii(G4int id) const { return fP1HnManager->GetAscii(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP1Plotting(G4int id) const { return fP1HnManager->GetPlotting(id); -} +} //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetP2Name(G4int id) const { return fP2HnManager->GetName(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2XUnit(G4int id) const { return fP2HnManager->GetXUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2YUnit(G4int id) const { return fP2HnManager->GetYUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisManager::GetP2ZUnit(G4int id) const { return fP2HnManager->GetZUnit(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP2Activation(G4int id) const { return fP2HnManager->GetActivation(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP2Ascii(G4int id) const { return fP2HnManager->GetAscii(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP2Plotting(G4int id) const { return fP2HnManager->GetPlotting(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetNtupleActivation(G4int id) const { if ( fVNtupleManager ) { @@ -723,434 +732,434 @@ G4bool G4VAnalysisManager::GetNtupleActivation(G4int id) const } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH1Title(G4int id, const G4String& title) { return fVH1Manager->SetH1Title(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH1XAxisTitle(G4int id, const G4String& title) { return fVH1Manager->SetH1XAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH1YAxisTitle(G4int id, const G4String& title) { return fVH1Manager->SetH1YAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH1XAxisIsLog(G4int id, G4bool isLog) { return fH1HnManager->SetXAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH1YAxisIsLog(G4int id, G4bool isLog) { return fH1HnManager->SetYAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH2Title(G4int id, const G4String& title) { return fVH2Manager->SetH2Title(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH2XAxisTitle(G4int id, const G4String& title) { return fVH2Manager->SetH2XAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH2YAxisTitle(G4int id, const G4String& title) { return fVH2Manager->SetH2YAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH2ZAxisTitle(G4int id, const G4String& title) { return fVH2Manager->SetH2ZAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH2XAxisIsLog(G4int id, G4bool isLog) { return fH2HnManager->SetXAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH2YAxisIsLog(G4int id, G4bool isLog) { return fH2HnManager->SetYAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH2ZAxisIsLog(G4int id, G4bool isLog) { return fH2HnManager->SetZAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH3Title(G4int id, const G4String& title) { return fVH3Manager->SetH3Title(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH3XAxisTitle(G4int id, const G4String& title) { return fVH3Manager->SetH3XAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH3YAxisTitle(G4int id, const G4String& title) { return fVH3Manager->SetH3YAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH3ZAxisTitle(G4int id, const G4String& title) { return fVH3Manager->SetH3ZAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH3XAxisIsLog(G4int id, G4bool isLog) { return fH3HnManager->SetXAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH3YAxisIsLog(G4int id, G4bool isLog) { return fH3HnManager->SetYAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetH3ZAxisIsLog(G4int id, G4bool isLog) { return fH3HnManager->SetZAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP1Title(G4int id, const G4String& title) { return fVP1Manager->SetP1Title(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP1XAxisTitle(G4int id, const G4String& title) { return fVP1Manager->SetP1XAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP1YAxisTitle(G4int id, const G4String& title) { return fVP1Manager->SetP1YAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP1XAxisIsLog(G4int id, G4bool isLog) { return fP1HnManager->SetXAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP1YAxisIsLog(G4int id, G4bool isLog) { return fP1HnManager->SetYAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP2Title(G4int id, const G4String& title) { return fVP2Manager->SetP2Title(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP2XAxisTitle(G4int id, const G4String& title) { return fVP2Manager->SetP2XAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP2YAxisTitle(G4int id, const G4String& title) { return fVP2Manager->SetP2YAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP2ZAxisTitle(G4int id, const G4String& title) { return fVP2Manager->SetP2ZAxisTitle(id, title); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP2XAxisIsLog(G4int id, G4bool isLog) { return fP2HnManager->SetXAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP2YAxisIsLog(G4int id, G4bool isLog) { return fP2HnManager->SetYAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::SetP2ZAxisIsLog(G4int id, G4bool isLog) { return fP2HnManager->SetZAxisIsLog(id, isLog); } //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetH1Title(G4int id) const { return fVH1Manager->GetH1Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetH1XAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetH1XAxisTitle(G4int id) const { return fVH1Manager->GetH1XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetH1YAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetH1YAxisTitle(G4int id) const { return fVH1Manager->GetH1YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH1XAxisIsLog(G4int id) const { return fH1HnManager->GetXAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH1YAxisIsLog(G4int id) const { return fH1HnManager->GetYAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetH2Title(G4int id) const { return fVH2Manager->GetH2Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetH2XAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetH2XAxisTitle(G4int id) const { return fVH2Manager->GetH2XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetH2YAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetH2YAxisTitle(G4int id) const { return fVH2Manager->GetH2YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetH2ZAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetH2ZAxisTitle(G4int id) const { return fVH2Manager->GetH2ZAxisTitle(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH2XAxisIsLog(G4int id) const { return fH2HnManager->GetXAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH2YAxisIsLog(G4int id) const { return fH2HnManager->GetYAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH2ZAxisIsLog(G4int id) const { return fH2HnManager->GetZAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetH3Title(G4int id) const { return fVH3Manager->GetH3Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetH3XAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetH3XAxisTitle(G4int id) const { return fVH3Manager->GetH3XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetH3YAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetH3YAxisTitle(G4int id) const { return fVH3Manager->GetH3YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetH3ZAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetH3ZAxisTitle(G4int id) const { return fVH3Manager->GetH3ZAxisTitle(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH3XAxisIsLog(G4int id) const { return fH3HnManager->GetXAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH3YAxisIsLog(G4int id) const { return fH3HnManager->GetYAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetH3ZAxisIsLog(G4int id) const { return fH3HnManager->GetZAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetP1Title(G4int id) const { return fVP1Manager->GetP1Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetP1XAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetP1XAxisTitle(G4int id) const { return fVP1Manager->GetP1XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetP1YAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetP1YAxisTitle(G4int id) const { return fVP1Manager->GetP1YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP1XAxisIsLog(G4int id) const { return fP1HnManager->GetXAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP1YAxisIsLog(G4int id) const { return fP1HnManager->GetYAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisManager::GetP2Title(G4int id) const { return fVP2Manager->GetP2Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetP2XAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetP2XAxisTitle(G4int id) const { return fVP2Manager->GetP2XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetP2YAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetP2YAxisTitle(G4int id) const { return fVP2Manager->GetP2YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetP2ZAxisTitle(G4int id) const +inline +G4String G4VAnalysisManager::GetP2ZAxisTitle(G4int id) const { return fVP2Manager->GetP2ZAxisTitle(id); -} +} //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP2XAxisIsLog(G4int id) const { return fP2HnManager->GetXAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP2YAxisIsLog(G4int id) const { return fP2HnManager->GetYAxisIsLog(id); } //_____________________________________________________________________________ -inline +inline G4bool G4VAnalysisManager::GetP2ZAxisIsLog(G4int id) const { return fP2HnManager->GetZAxisIsLog(id); @@ -1158,22 +1167,22 @@ G4bool G4VAnalysisManager::GetP2ZAxisIsLog(G4int id) const //_____________________________________________________________________________ -inline -G4int G4VAnalysisManager::GetVerboseLevel() const +inline +G4int G4VAnalysisManager::GetVerboseLevel() const { return fState.GetVerboseLevel(); -} - -//_____________________________________________________________________________ -inline -G4String G4VAnalysisManager::GetType() const -{ - return fState.GetType(); -} +} //_____________________________________________________________________________ inline -G4String G4VAnalysisManager::GetFileType() const +G4String G4VAnalysisManager::GetType() const +{ + return fState.GetType(); +} + +//_____________________________________________________________________________ +inline +G4String G4VAnalysisManager::GetFileType() const { return fVFileManager->GetFileType(); -} +} diff --git a/source/analysis/management/include/G4VAnalysisReader.hh b/source/analysis/management/include/G4VAnalysisReader.hh index f7642e3f44..d5c1578e84 100644 --- a/source/analysis/management/include/G4VAnalysisReader.hh +++ b/source/analysis/management/include/G4VAnalysisReader.hh @@ -29,7 +29,7 @@ // Individual use of the component managers is disabled // (except for file manager and Hn manager which are also used from // other object managers). -// The functions which has to be implemented in concrete managers +// The functions which has to be implemented in concrete managers // are declared as virtual protected. // Author: Ivana Hrivnacova, 09/04/2014 (ivana@ipno.in2p3.fr) @@ -42,36 +42,37 @@ #include #include +#include class G4HnManager; -class G4BaseFileManager; class G4VH1Manager; class G4VH2Manager; class G4VH3Manager; class G4VP1Manager; class G4VP2Manager; class G4VRNtupleManager; +class G4VRFileManager; class G4VAnalysisReader { public: - G4VAnalysisReader(const G4String& type, G4bool isMaster); virtual ~G4VAnalysisReader(); - - // Methods for handling files - // G4bool OpenFile(const G4String& fileName = ""); - // Methods for handling files and directories names + // Methods for handling files + // G4bool OpenFile(const G4String& fileName = ""); + G4bool CloseFiles(G4bool reset = true); + + // Methods for handling files and directories names void SetFileName(const G4String& fileName); G4String GetFileName() const; - + // Methods to read histograms from a file G4int ReadH1(const G4String& h1Name, const G4String& fileName = "", const G4String& dirName = ""); G4int ReadH2(const G4String& h2Name, const G4String& fileName = "", const G4String& dirName = ""); G4int ReadH3(const G4String& h3Name, const G4String& fileName = "", const G4String& dirName = ""); G4int ReadP1(const G4String& h1Name, const G4String& fileName = "", const G4String& dirName = ""); G4int ReadP2(const G4String& h2Name, const G4String& fileName = "", const G4String& dirName = ""); - + // The ids of histograms and ntuples are generated automatically // starting from 0; with following functions it is possible to // change the first Id to start from other value @@ -86,35 +87,39 @@ class G4VAnalysisReader // Methods to read ntuple from a file G4int GetNtuple(const G4String& ntupleName, const G4String& fileName = "", const G4String& dirName = ""); - + // Methods for ntuple with id = FirstNtupleId G4bool SetNtupleIColumn(const G4String& columnName, G4int& value); G4bool SetNtupleFColumn(const G4String& columnName, G4float& value); G4bool SetNtupleDColumn(const G4String& columnName, G4double& value); G4bool SetNtupleSColumn(const G4String& columnName, G4String& value); // Bind the ntuple colums of vector type - G4bool SetNtupleIColumn(const G4String& columnName, + G4bool SetNtupleIColumn(const G4String& columnName, std::vector& vector); - G4bool SetNtupleFColumn(const G4String& columnName, + G4bool SetNtupleFColumn(const G4String& columnName, std::vector& vector); - G4bool SetNtupleDColumn(const G4String& columnName, + G4bool SetNtupleDColumn(const G4String& columnName, std::vector& vector); - // Methods for ntuple with id > FirstNtupleId - G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, + G4bool SetNtupleSColumn(const G4String& columnName, + std::vector& vector); + // Methods for ntuple with id > FirstNtupleId + G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, G4int& value); - G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, + G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, G4float& value); - G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, + G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, G4double& value); - G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, + G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, G4String& value); // Bind the ntuple colums of vector type - G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, + G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, std::vector& vector); - G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, + G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, std::vector& vector); - G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, + G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, std::vector& vector); + G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, + std::vector& vector); G4bool GetNtupleRow(); G4bool GetNtupleRow(G4int ntupleId); @@ -139,7 +144,7 @@ class G4VAnalysisReader G4int GetH3Id(const G4String& name, G4bool warn = true) const; G4int GetP1Id(const G4String& name, G4bool warn = true) const; G4int GetP2Id(const G4String& name, G4bool warn = true) const; - + // Access to histogram & profiles parameters // G4int GetH1Nbins(G4int id) const; @@ -218,12 +223,14 @@ class G4VAnalysisReader G4int GetVerboseLevel() const; // The manager type (starts with an uppercase letter) - G4String GetType() const; + G4String GetType() const; // The manager file type (starts with a lowercase letter) - G4String GetFileType() const; - + G4String GetFileType() const; + protected: - // virtual methods + explicit G4VAnalysisReader(const G4String& type); + + // Virtual methods virtual G4int ReadH1Impl(const G4String& h1Name, const G4String& fileName, const G4String& dirName, G4bool isUserFileName) = 0; virtual G4int ReadH2Impl(const G4String& h2Name, const G4String& fileName, @@ -234,35 +241,45 @@ class G4VAnalysisReader const G4String& dirName, G4bool isUserFileName) = 0; virtual G4int ReadP2Impl(const G4String& p2Name, const G4String& fileName, const G4String& dirName, G4bool isUserFileName) = 0; - virtual G4int ReadNtupleImpl(const G4String& ntupleName, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) = 0; - - // methods + virtual G4bool CloseFilesImpl(G4bool reset) = 0; + + void Message(G4int level, + const G4String& action, + const G4String& objectType, + const G4String& objectName = "", + G4bool success = true) const; + + // Methods void SetH1Manager(G4VH1Manager* h1Manager); void SetH2Manager(G4VH2Manager* h2Manager); void SetH3Manager(G4VH3Manager* h3Manager); void SetP1Manager(G4VP1Manager* p1Manager); void SetP2Manager(G4VP2Manager* p2Manager); - void SetNtupleManager(G4VRNtupleManager* ntupleManager); - void SetFileManager(G4BaseFileManager* fileManager); + void SetNtupleManager(std::shared_ptr ntupleManager); + void SetFileManager(std::shared_ptr fileManager); - // data members + // Data members G4AnalysisManagerState fState; + protected: + std::shared_ptr fVFileManager { nullptr }; + private: - // data members - std::unique_ptr fVH1Manager; - std::unique_ptr fVH2Manager; - std::unique_ptr fVH3Manager; - std::unique_ptr fVP1Manager; - std::unique_ptr fVP2Manager; - std::unique_ptr fVNtupleManager; - std::unique_ptr fFileManager; + // Static data members + static constexpr std::string_view fkClass { "G4VAnalysisReader" }; + + // Data members + std::unique_ptr fVH1Manager; + std::unique_ptr fVH2Manager; + std::unique_ptr fVH3Manager; + std::unique_ptr fVP1Manager; + std::unique_ptr fVP2Manager; + std::shared_ptr fVNtupleManager { nullptr }; }; // inline functions #include "G4VAnalysisReader.icc" - + #endif diff --git a/source/analysis/management/include/G4VAnalysisReader.icc b/source/analysis/management/include/G4VAnalysisReader.icc index 4ba72315c0..1aa34a6828 100644 --- a/source/analysis/management/include/G4VAnalysisReader.icc +++ b/source/analysis/management/include/G4VAnalysisReader.icc @@ -30,490 +30,498 @@ #include "G4VH3Manager.hh" #include "G4VP1Manager.hh" #include "G4VP2Manager.hh" -#include "G4VNtupleManager.hh" -#include "G4BaseFileManager.hh" +#include "G4VRFileManager.hh" //_____________________________________________________________________________ -inline +inline +void G4VAnalysisReader::Message( + G4int level, const G4String& action, const G4String& objectType, + const G4String& objectName, G4bool success) const +{ + fState.Message(level, action, objectType, objectName, success); +} + +//_____________________________________________________________________________ +inline G4int G4VAnalysisReader::GetH1Id(const G4String& name, G4bool warn) const { return fVH1Manager->GetH1Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetH2Id(const G4String& name, G4bool warn) const { return fVH2Manager->GetH2Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetH3Id(const G4String& name, G4bool warn) const { return fVH3Manager->GetH3Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetP1Id(const G4String& name, G4bool warn) const { return fVP1Manager->GetP1Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetP2Id(const G4String& name, G4bool warn) const { return fVP2Manager->GetP2Id(name, warn); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetH1Nbins(G4int id) const { return fVH1Manager->GetH1Nbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH1Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH1Manager->GetH1Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH1Xmax(G4int id) const { return fVH1Manager->GetH1Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH1Width(G4int id) const { return fVH1Manager->GetH1Width(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetH2Nxbins(G4int id) const -{ +{ return fVH2Manager->GetH2Nxbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH2Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH2Manager->GetH2Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH2Xmax(G4int id) const { return fVH2Manager->GetH2Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH2XWidth(G4int id) const { return fVH2Manager->GetH2XWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetH2Nybins(G4int id) const { return fVH2Manager->GetH2Nybins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH2Ymin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH2Manager->GetH2Ymin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH2Ymax(G4int id) const { return fVH2Manager->GetH2Ymax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH2YWidth(G4int id) const { return fVH2Manager->GetH2YWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetH3Nxbins(G4int id) const -{ +{ return fVH3Manager->GetH3Nxbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH3Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH3Manager->GetH3Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH3Xmax(G4int id) const { return fVH3Manager->GetH3Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH3XWidth(G4int id) const { return fVH3Manager->GetH3XWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetH3Nybins(G4int id) const { return fVH3Manager->GetH3Nybins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH3Ymin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH3Manager->GetH3Ymin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH3Ymax(G4int id) const { return fVH3Manager->GetH3Ymax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH3YWidth(G4int id) const { return fVH3Manager->GetH3YWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetH3Nzbins(G4int id) const { return fVH3Manager->GetH3Nzbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH3Zmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVH3Manager->GetH3Zmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH3Zmax(G4int id) const { return fVH3Manager->GetH3Zmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetH3ZWidth(G4int id) const { return fVH3Manager->GetH3ZWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetP1Nbins(G4int id) const -{ +{ return fVP1Manager->GetP1Nbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP1Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP1Manager->GetP1Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP1Xmax(G4int id) const { return fVP1Manager->GetP1Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP1XWidth(G4int id) const { return fVP1Manager->GetP1XWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP1Ymin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP1Manager->GetP1Ymin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP1Ymax(G4int id) const { return fVP1Manager->GetP1Ymax(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetP2Nxbins(G4int id) const -{ +{ return fVP2Manager->GetP2Nxbins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP2Xmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP2Manager->GetP2Xmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP2Xmax(G4int id) const { return fVP2Manager->GetP2Xmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP2XWidth(G4int id) const { return fVP2Manager->GetP2XWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4int G4VAnalysisReader::GetP2Nybins(G4int id) const { return fVP2Manager->GetP2Nybins(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP2Ymin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP2Manager->GetP2Ymin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP2Ymax(G4int id) const { return fVP2Manager->GetP2Ymax(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP2YWidth(G4int id) const { return fVP2Manager->GetP2YWidth(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP2Zmin(G4int id) const { // Returns xmin value with applied unit and histogram function return fVP2Manager->GetP2Zmin(id); -} +} //_____________________________________________________________________________ -inline +inline G4double G4VAnalysisReader::GetP2Zmax(G4int id) const { return fVP2Manager->GetP2Zmax(id); -} +} //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisReader::GetH1Title(G4int id) const { return fVH1Manager->GetH1Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetH1XAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetH1XAxisTitle(G4int id) const { return fVH1Manager->GetH1XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetH1YAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetH1YAxisTitle(G4int id) const { return fVH1Manager->GetH1YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisReader::GetH2Title(G4int id) const { return fVH2Manager->GetH2Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetH2XAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetH2XAxisTitle(G4int id) const { return fVH2Manager->GetH2XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetH2YAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetH2YAxisTitle(G4int id) const { return fVH2Manager->GetH2YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetH2ZAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetH2ZAxisTitle(G4int id) const { return fVH2Manager->GetH2ZAxisTitle(id); -} +} //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisReader::GetH3Title(G4int id) const { return fVH3Manager->GetH3Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetH3XAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetH3XAxisTitle(G4int id) const { return fVH3Manager->GetH3XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetH3YAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetH3YAxisTitle(G4int id) const { return fVH3Manager->GetH3YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetH3ZAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetH3ZAxisTitle(G4int id) const { return fVH3Manager->GetH3ZAxisTitle(id); -} +} //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisReader::GetP1Title(G4int id) const { return fVP1Manager->GetP1Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetP1XAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetP1XAxisTitle(G4int id) const { return fVP1Manager->GetP1XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetP1YAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetP1YAxisTitle(G4int id) const { return fVP1Manager->GetP1YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline +inline G4String G4VAnalysisReader::GetP2Title(G4int id) const { return fVP2Manager->GetP2Title(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetP2XAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetP2XAxisTitle(G4int id) const { return fVP2Manager->GetP2XAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetP2YAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetP2YAxisTitle(G4int id) const { return fVP2Manager->GetP2YAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetP2ZAxisTitle(G4int id) const +inline +G4String G4VAnalysisReader::GetP2ZAxisTitle(G4int id) const { return fVP2Manager->GetP2ZAxisTitle(id); -} +} //_____________________________________________________________________________ -inline -G4int G4VAnalysisReader::GetVerboseLevel() const +inline +G4int G4VAnalysisReader::GetVerboseLevel() const { return fState.GetVerboseLevel(); -} - -//_____________________________________________________________________________ -inline -G4String G4VAnalysisReader::GetType() const -{ - return fFileManager->GetFileType(); -} +} //_____________________________________________________________________________ inline -G4String G4VAnalysisReader::GetFileType() const +G4String G4VAnalysisReader::GetType() const { - return fFileManager->GetFileType(); -} + return fVFileManager->GetFileType(); +} + +//_____________________________________________________________________________ +inline +G4String G4VAnalysisReader::GetFileType() const +{ + return fVFileManager->GetFileType(); +} diff --git a/source/analysis/management/include/G4VFileManager.hh b/source/analysis/management/include/G4VFileManager.hh index c8773ffc30..0928ee5385 100644 --- a/source/analysis/management/include/G4VFileManager.hh +++ b/source/analysis/management/include/G4VFileManager.hh @@ -35,13 +35,16 @@ #include "G4VTHnFileManager.hh" #include "globals.hh" +#include +#include + namespace tools { -namespace histo { -class h1d; -class h2d; -class h3d; -class p1d; -class p2d; +namespace histo { +class h1d; +class h2d; +class h3d; +class p1d; +class p2d; } } @@ -49,8 +52,9 @@ class G4VFileManager : public G4BaseFileManager { public: explicit G4VFileManager(const G4AnalysisManagerState& state); - virtual ~G4VFileManager(); - + G4VFileManager() = delete; + virtual ~G4VFileManager() = default; + // Method to open default file virtual G4bool OpenFile(const G4String& fileName) = 0; @@ -65,12 +69,16 @@ class G4VFileManager : public G4BaseFileManager virtual G4bool CloseFiles() = 0; virtual G4bool DeleteEmptyFiles() = 0; + // Clear all data + virtual void Clear() = 0; + // Methods for handling files and directories names virtual G4bool SetFileName(const G4String& fileName) final; - G4bool SetHistoDirectoryName(const G4String& dirName); - G4bool SetNtupleDirectoryName(const G4String& dirName); + virtual G4bool SetHistoDirectoryName(const G4String& dirName); + virtual G4bool SetNtupleDirectoryName(const G4String& dirName); void LockDirectoryNames(); + void UnlockDirectoryNames(); G4bool IsOpenFile() const; G4String GetHistoDirectoryName() const; @@ -81,18 +89,21 @@ class G4VFileManager : public G4BaseFileManager std::shared_ptr> GetHnFileManager() const; protected: - // data members + // Static data members + static constexpr std::string_view fkClass { "G4VFileManager" }; + + // Data members G4String fHistoDirectoryName; - G4String fNtupleDirectoryName; - G4bool fIsOpenFile; - G4bool fLockDirectoryNames; + G4String fNtupleDirectoryName; + G4bool fIsOpenFile { false }; + G4bool fLockDirectoryNames { false }; // FileManagers per object type - std::shared_ptr> fH1FileManager; - std::shared_ptr> fH2FileManager; - std::shared_ptr> fH3FileManager; - std::shared_ptr> fP1FileManager; - std::shared_ptr> fP2FileManager; + std::shared_ptr> fH1FileManager { nullptr }; + std::shared_ptr> fH2FileManager { nullptr }; + std::shared_ptr> fH3FileManager { nullptr }; + std::shared_ptr> fP1FileManager { nullptr }; + std::shared_ptr> fP2FileManager { nullptr }; }; // inline functions @@ -100,42 +111,45 @@ class G4VFileManager : public G4BaseFileManager inline void G4VFileManager::LockDirectoryNames() { fLockDirectoryNames = true; } +inline void G4VFileManager::UnlockDirectoryNames() +{ fLockDirectoryNames = false; } + inline G4bool G4VFileManager::IsOpenFile() const { return fIsOpenFile; } -inline G4String G4VFileManager::GetHistoDirectoryName() const -{ return fHistoDirectoryName; } +inline G4String G4VFileManager::GetHistoDirectoryName() const +{ return fHistoDirectoryName; } -inline G4String G4VFileManager::GetNtupleDirectoryName() const +inline G4String G4VFileManager::GetNtupleDirectoryName() const { return fNtupleDirectoryName; } template <> inline -std::shared_ptr> +std::shared_ptr> G4VFileManager::GetHnFileManager() const { return fH1FileManager; } template <> inline -std::shared_ptr> +std::shared_ptr> G4VFileManager::GetHnFileManager() const { return fH2FileManager; } template <> inline -std::shared_ptr> +std::shared_ptr> G4VFileManager::GetHnFileManager() const { return fH3FileManager; } template <> inline -std::shared_ptr> +std::shared_ptr> G4VFileManager::GetHnFileManager() const { return fP1FileManager; } template <> inline -std::shared_ptr> +std::shared_ptr> G4VFileManager::GetHnFileManager() const { return fP2FileManager; } diff --git a/source/analysis/management/include/G4VH1Manager.hh b/source/analysis/management/include/G4VH1Manager.hh index 708ec37137..b08ba460a8 100644 --- a/source/analysis/management/include/G4VH1Manager.hh +++ b/source/analysis/management/include/G4VH1Manager.hh @@ -40,13 +40,13 @@ class G4HnManager; class G4VH1Manager { - // Disable using the object managers outside + // Disable using the object managers outside friend class G4VAnalysisManager; friend class G4VAnalysisReader; public: - G4VH1Manager() {} - virtual ~G4VH1Manager() {} + G4VH1Manager() = default; + virtual ~G4VH1Manager() = default; // deleted copy constructor & assignment operator G4VH1Manager(const G4VH1Manager& rhs) = delete; @@ -75,7 +75,7 @@ class G4VH1Manager const G4String& fcnName = "none") = 0; virtual G4bool ScaleH1(G4int id, G4double factor) = 0; - + // Methods to fill histograms virtual G4bool FillH1(G4int id, G4double value, G4double weight = 1.0) = 0; diff --git a/source/analysis/management/include/G4VH2Manager.hh b/source/analysis/management/include/G4VH2Manager.hh index e23b41014a..b9f40bfd82 100644 --- a/source/analysis/management/include/G4VH2Manager.hh +++ b/source/analysis/management/include/G4VH2Manager.hh @@ -45,8 +45,8 @@ class G4VH2Manager friend class G4VAnalysisReader; public: - G4VH2Manager() {} - virtual ~G4VH2Manager() {} + G4VH2Manager() = default; + virtual ~G4VH2Manager() = default; // deleted copy constructor & assignment operator G4VH2Manager(const G4VH2Manager& rhs) = delete; @@ -55,39 +55,39 @@ class G4VH2Manager protected: // Methods for handling histograms virtual G4int CreateH2(const G4String& name, const G4String& title, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear") = 0; - + virtual G4int CreateH2(const G4String& name, const G4String& title, const std::vector& xedges, const std::vector& yedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none") = 0; - + virtual G4bool SetH2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", - const G4String& yfcnName = "none", + const G4String& xfcnName = "none", + const G4String& yfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear") = 0; virtual G4bool SetH2(G4int id, const std::vector& xedges, const std::vector& yedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none") = 0; virtual G4bool ScaleH2(G4int id, G4double factor) = 0; @@ -95,7 +95,7 @@ class G4VH2Manager // Methods to fill histograms virtual G4bool FillH2(G4int id, G4double xvalue, G4double yvalue, G4double weight = 1.0) = 0; - + // Access methods virtual G4int GetH2Id(const G4String& name, G4bool warn = true) const = 0; diff --git a/source/analysis/management/include/G4VH3Manager.hh b/source/analysis/management/include/G4VH3Manager.hh index 3b605fe5aa..57a901ecb8 100644 --- a/source/analysis/management/include/G4VH3Manager.hh +++ b/source/analysis/management/include/G4VH3Manager.hh @@ -45,8 +45,8 @@ class G4VH3Manager friend class G4VAnalysisReader; public: - G4VH3Manager() {} - virtual ~G4VH3Manager() {} + G4VH3Manager() = default; + virtual ~G4VH3Manager() = default; // deleted copy constructor & assignment operator G4VH3Manager(const G4VH3Manager& rhs) = delete; @@ -55,38 +55,38 @@ class G4VH3Manager protected: // Methods for handling histograms virtual G4int CreateH3(const G4String& name, const G4String& title, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4int nzbins, G4double zmin, G4double zmax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear", const G4String& zbinScheme = "linear") = 0; - + virtual G4int CreateH3(const G4String& name, const G4String& title, const std::vector& xedges, const std::vector& yedges, const std::vector& zedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none") = 0; - + virtual G4bool SetH3(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nzbins, G4double zmin, G4double zmax, G4int nybins, G4double ymin, G4double ymax, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinScheme = "linear", @@ -97,20 +97,20 @@ class G4VH3Manager const std::vector& xedges, const std::vector& yedges, const std::vector& zedges, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none") = 0; virtual G4bool ScaleH3(G4int id, G4double factor) = 0; // Methods to fill histograms - virtual G4bool FillH3(G4int id, + virtual G4bool FillH3(G4int id, G4double xvalue, G4double yvalue, G4double zvalue, G4double weight = 1.0) = 0; - + // Access methods virtual G4int GetH3Id(const G4String& name, G4bool warn = true) const = 0; diff --git a/source/analysis/management/include/G4VNtupleFileManager.hh b/source/analysis/management/include/G4VNtupleFileManager.hh index 7e3f0a4b87..a2f926de5b 100644 --- a/source/analysis/management/include/G4VNtupleFileManager.hh +++ b/source/analysis/management/include/G4VNtupleFileManager.hh @@ -34,6 +34,9 @@ #include "G4AnalysisManagerState.hh" #include "globals.hh" +#include +#include + class G4VNtupleManager; class G4NtupleBookingManager; @@ -44,16 +47,17 @@ class G4VNtupleFileManager friend class G4VAnalysisManager; public: - explicit G4VNtupleFileManager(const G4AnalysisManagerState& state, - const G4String& fileType); - virtual ~G4VNtupleFileManager(); + G4VNtupleFileManager(const G4AnalysisManagerState& state, + const G4String& fileType); + G4VNtupleFileManager() = delete; + virtual ~G4VNtupleFileManager() = default; // deleted copy constructor & assignment operator G4VNtupleFileManager(const G4VNtupleFileManager& rhs) = delete; G4VNtupleFileManager& operator=(const G4VNtupleFileManager& rhs) = delete; // MT/MPI - virtual void SetNtupleMerging(G4bool mergeNtuples, + virtual void SetNtupleMerging(G4bool mergeNtuples, G4int nofReducedNtupleFiles = 0); virtual void SetNtupleRowWise(G4bool rowWise, G4bool rowMode = true); virtual void SetBasketSize(unsigned int basketSize); @@ -73,10 +77,21 @@ class G4VNtupleFileManager G4String GetFileType() const; protected: - // static data members + // Methods for verbose + void Message(G4int level, + const G4String& action, + const G4String& objectType, + const G4String& objectName = "", + G4bool success = true) const; + + // Static data members const G4AnalysisManagerState& fState; - G4String fFileType; - std::shared_ptr fBookingManager; + G4String fFileType; + std::shared_ptr fBookingManager { nullptr }; + + private: + // Static data members + static constexpr std::string_view fkClass { "G4VNtupleFileManager" }; }; // inline functions @@ -93,4 +108,11 @@ inline G4String G4VNtupleFileManager::GetFileType() const { return fFileType; } +inline void G4VNtupleFileManager::Message( + G4int level, const G4String& action, const G4String& objectType, + const G4String& objectName, G4bool success) const +{ + fState.Message(level, action, objectType, objectName, success); +} + #endif diff --git a/source/analysis/management/include/G4VNtupleManager.hh b/source/analysis/management/include/G4VNtupleManager.hh index cd91169b7c..4278679a44 100644 --- a/source/analysis/management/include/G4VNtupleManager.hh +++ b/source/analysis/management/include/G4VNtupleManager.hh @@ -24,8 +24,8 @@ // ******************************************************************** // -// The pure abstract base class for Ntuple manager. -// It defines functions independent from the output type. +// The pure abstract base class for Ntuple manager. +// It defines functions independent from the output type. // // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) @@ -48,7 +48,8 @@ class G4VNtupleManager : public G4BaseAnalysisManager public: explicit G4VNtupleManager(const G4AnalysisManagerState& state) : G4BaseAnalysisManager(state) {} - virtual ~G4VNtupleManager() {} + G4VNtupleManager() = delete; + virtual ~G4VNtupleManager() = default; // deleted copy constructor & assignment operator G4VNtupleManager(const G4VNtupleManager& rhs) = delete; @@ -58,45 +59,19 @@ class G4VNtupleManager : public G4BaseAnalysisManager // Methods for handling ntuples virtual G4int CreateNtuple(G4NtupleBooking* booking) = 0; - // // Create columns in the last created ntuple - // virtual G4int CreateNtupleIColumn(const G4String& name, - // std::vector* vector) = 0; - // virtual G4int CreateNtupleFColumn(const G4String& name, - // std::vector* vector) = 0; - // virtual G4int CreateNtupleDColumn(const G4String& name, - // std::vector* vector) = 0; - // virtual G4int CreateNtupleSColumn(const G4String& name) = 0; - // virtual void FinishNtuple() = 0; - - // // Create columns in the ntuple with given id - // virtual G4int CreateNtupleIColumn(G4int ntupleId, const G4String& name, - // std::vector* vector) = 0; - // virtual G4int CreateNtupleFColumn(G4int ntupleId, const G4String& name, - // std::vector* vector) = 0; - // virtual G4int CreateNtupleDColumn(G4int ntupleId, const G4String& name, - // std::vector* vector) = 0; - // virtual G4int CreateNtupleSColumn(G4int ntupleId, const G4String& name) = 0; - // virtual void FinishNtuple(G4int ntupleId) = 0; - - // The ntuple column ids are generated automatically starting from 0; - // with the following function it is possible to change it - // to start from another value - // virtual void SetFirstNtupleColumnId(G4int firstId) = 0; - // virtual G4int GetFirstNtupleColumnId() const = 0; - // Methods to fill ntuples - // Methods for ntuple with id = FirstNtupleId + // Methods for ntuple with id = FirstNtupleId virtual G4bool FillNtupleIColumn(G4int id, G4int value) = 0; virtual G4bool FillNtupleFColumn(G4int id, G4float value) = 0; virtual G4bool FillNtupleDColumn(G4int id, G4double value) = 0; virtual G4bool FillNtupleSColumn(G4int id, const G4String& value) = 0; virtual G4bool AddNtupleRow() = 0; - // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) + // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) virtual G4bool FillNtupleIColumn(G4int ntupleId, G4int columnId, G4int value) = 0; virtual G4bool FillNtupleFColumn(G4int ntupleId, G4int columnId, G4float value) = 0; virtual G4bool FillNtupleDColumn(G4int ntupleId, G4int columnId, G4double value) = 0; - virtual G4bool FillNtupleSColumn(G4int ntupleId, G4int columnId, + virtual G4bool FillNtupleSColumn(G4int ntupleId, G4int columnId, const G4String& value) = 0; virtual G4bool AddNtupleRow(G4int ntupleId) = 0; @@ -105,17 +80,15 @@ class G4VNtupleManager : public G4BaseAnalysisManager virtual void SetActivation(G4int id, G4bool activation) = 0; virtual G4bool GetActivation(G4int id) const = 0; - // // File name option - // virtual void SetFileName(const G4String& fileName) = 0; - // virtual void SetFileName(G4int id, const G4String& fileName) = 0; - // virtual G4String GetFileName(G4int id) const = 0; - // Access methods virtual G4int GetNofNtuples() const = 0; // virtual G4int GetNofNtupleBookings() const = 0; // Set first column Id virtual G4bool SetFirstNtupleColumnId(G4int firstId) = 0; + + // Clear all date + virtual void Clear() = 0; }; #endif diff --git a/source/analysis/management/include/G4VP1Manager.hh b/source/analysis/management/include/G4VP1Manager.hh index 91e7833ff8..f6e9f45777 100644 --- a/source/analysis/management/include/G4VP1Manager.hh +++ b/source/analysis/management/include/G4VP1Manager.hh @@ -40,13 +40,13 @@ class G4HnManager; class G4VP1Manager { - // Disable using the object managers outside + // Disable using the object managers outside friend class G4VAnalysisManager; friend class G4VAnalysisReader; public: - G4VP1Manager() {} - virtual ~G4VP1Manager() {} + G4VP1Manager() = default; + virtual ~G4VP1Manager() = default; // deleted copy constructor & assignment operator G4VP1Manager(const G4VP1Manager& rhs) = delete; @@ -57,39 +57,39 @@ class G4VP1Manager virtual G4int CreateP1(const G4String& name, const G4String& title, G4int nbins, G4double xmin, G4double xmax, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinScheme = "linear") = 0; virtual G4int CreateP1(const G4String& name, const G4String& title, const std::vector& edges, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none") = 0; virtual G4bool SetP1(G4int id, G4int nbins, G4double xmin, G4double xmax, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& xbinScheme = "linear") = 0; virtual G4bool SetP1(G4int id, const std::vector& edges, G4double ymin = 0, G4double ymax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none") = 0; virtual G4bool ScaleP1(G4int id, G4double factor) = 0; - + // Methods to fill profiles - virtual G4bool FillP1(G4int id, G4double xvalue, G4double yvalue, + virtual G4bool FillP1(G4int id, G4double xvalue, G4double yvalue, G4double weight = 1.0) = 0; // Access methods @@ -114,7 +114,7 @@ class G4VP1Manager virtual G4String GetP1YAxisTitle(G4int id) const = 0; // Methods to manipulate profiles - // virtual G4bool WriteOnAscii(std::ofstream& output) = 0; + virtual G4bool WriteOnAscii(std::ofstream& output) = 0; // Access to Hn manager virtual std::shared_ptr GetHnManager() = 0; diff --git a/source/analysis/management/include/G4VP2Manager.hh b/source/analysis/management/include/G4VP2Manager.hh index c8048b74d5..3188c7b4ec 100644 --- a/source/analysis/management/include/G4VP2Manager.hh +++ b/source/analysis/management/include/G4VP2Manager.hh @@ -45,8 +45,8 @@ class G4VP2Manager friend class G4VAnalysisReader; public: - G4VP2Manager() {} - virtual ~G4VP2Manager() {} + G4VP2Manager() = default; + virtual ~G4VP2Manager() = default; // deleted copy constructor & assignment operator G4VP2Manager(const G4VP2Manager& rhs) = delete; @@ -55,37 +55,37 @@ class G4VP2Manager protected: // Methods for handling histograms virtual G4int CreateP2(const G4String& name, const G4String& title, - G4int nxbins, G4double xmin, G4double xmax, - G4int nybins, G4double ymin, G4double ymax, + G4int nxbins, G4double xmin, G4double xmax, + G4int nybins, G4double ymin, G4double ymax, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinScheme = "linear", const G4String& ybinScheme = "linear") = 0; - + virtual G4int CreateP2(const G4String& name, const G4String& title, const std::vector& xedges, const std::vector& yedges, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none") = 0; - + virtual G4bool SetP2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, - G4int nybins, G4double ymin, G4double ymax, + G4int nxbins, G4double xmin, G4double xmax, + G4int nybins, G4double ymin, G4double ymax, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none", const G4String& xbinScheme = "linear", @@ -95,20 +95,20 @@ class G4VP2Manager const std::vector& xedges, const std::vector& yedges, G4double zmin = 0, G4double zmax = 0, - const G4String& xunitName = "none", + const G4String& xunitName = "none", const G4String& yunitName = "none", const G4String& zunitName = "none", - const G4String& xfcnName = "none", + const G4String& xfcnName = "none", const G4String& yfcnName = "none", const G4String& zfcnName = "none") = 0; virtual G4bool ScaleP2(G4int id, G4double factor) = 0; // Methods to fill histograms - virtual G4bool FillP2(G4int id, + virtual G4bool FillP2(G4int id, G4double xvalue, G4double yvalue, G4double zvalue, G4double weight = 1.0) = 0; - + // Access methods virtual G4int GetP2Id(const G4String& name, G4bool warn = true) const = 0; diff --git a/source/analysis/management/include/G4VRFileManager.hh b/source/analysis/management/include/G4VRFileManager.hh new file mode 100644 index 0000000000..8717ecee22 --- /dev/null +++ b/source/analysis/management/include/G4VRFileManager.hh @@ -0,0 +1,110 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +// Base class for readers file managers. +// +// Author: Ivana Hrivnacova, 06/08/2021 (ivana@ijclab.in2p3.fr) + +#ifndef G4VRFileManager_h +#define G4VRFileManager_h 1 + +#include "G4BaseFileManager.hh" +#include "G4VTHnRFileManager.hh" + +#include +#include + +namespace tools { +namespace histo { +class h1d; +class h2d; +class h3d; +class p1d; +class p2d; +} +} + +class G4VRFileManager : public G4BaseFileManager +{ + public: + explicit G4VRFileManager(const G4AnalysisManagerState& state) + : G4BaseFileManager(state) {} + G4VRFileManager() = delete; + virtual ~G4VRFileManager() = default; + + // Methods applied to all registered files + virtual void CloseFiles() = 0; + + // Access to helpers + template + std::shared_ptr> GetHnRFileManager() const; + + protected: + // Static data members + static constexpr std::string_view fkClass { "G4VRFileManager" }; + + // Data members + // FileManagers per object type + std::shared_ptr> fH1RFileManager { nullptr }; + std::shared_ptr> fH2RFileManager { nullptr }; + std::shared_ptr> fH3RFileManager { nullptr }; + std::shared_ptr> fP1RFileManager { nullptr }; + std::shared_ptr> fP2RFileManager { nullptr }; +}; + +// inline functions + +template <> +inline +std::shared_ptr> +G4VRFileManager::GetHnRFileManager() const +{ return fH1RFileManager; } + +template <> +inline +std::shared_ptr> +G4VRFileManager::GetHnRFileManager() const +{ return fH2RFileManager; } + +template <> +inline +std::shared_ptr> +G4VRFileManager::GetHnRFileManager() const +{ return fH3RFileManager; } + +template <> +inline +std::shared_ptr> +G4VRFileManager::GetHnRFileManager() const +{ return fP1RFileManager; } + +template <> +inline +std::shared_ptr> +G4VRFileManager::GetHnRFileManager() const +{ return fP2RFileManager; } + +#endif diff --git a/source/analysis/management/include/G4VRNtupleManager.hh b/source/analysis/management/include/G4VRNtupleManager.hh index 268f29de02..2540161053 100644 --- a/source/analysis/management/include/G4VRNtupleManager.hh +++ b/source/analysis/management/include/G4VRNtupleManager.hh @@ -24,7 +24,7 @@ // ******************************************************************** // -// The pure abstract base class for read Ntuple manager. +// The pure abstract base class for read Ntuple manager. // // Author: Ivana Hrivnacova, 09/04/2014 (ivana@ipno.in2p3.fr) @@ -45,52 +45,62 @@ class G4VRNtupleManager : public G4BaseAnalysisManager public: explicit G4VRNtupleManager(const G4AnalysisManagerState& state) : G4BaseAnalysisManager(state) {} - virtual ~G4VRNtupleManager() {} + G4VRNtupleManager() = delete; + virtual ~G4VRNtupleManager() = default; // deleted copy constructor & assignment operator G4VRNtupleManager(const G4VRNtupleManager& rhs) = delete; G4VRNtupleManager& operator=(const G4VRNtupleManager& rhs) = delete; - protected: + protected: // Methods to read ntuple from a file - // Methods for ntuple with id = FirstNtupleId - virtual G4bool SetNtupleIColumn(const G4String& columnName, + virtual G4int ReadNtupleImpl(const G4String& ntupleName, + const G4String& fileName, + const G4String& dirName, + G4bool isUserFileName) = 0; + + // Methods for ntuple with id = FirstNtupleId + virtual G4bool SetNtupleIColumn(const G4String& columnName, G4int& value) = 0; - virtual G4bool SetNtupleFColumn(const G4String& columnName, + virtual G4bool SetNtupleFColumn(const G4String& columnName, G4float& value) = 0; - virtual G4bool SetNtupleDColumn(const G4String& columnName, + virtual G4bool SetNtupleDColumn(const G4String& columnName, G4double& value) = 0; - virtual G4bool SetNtupleSColumn(const G4String& columnName, + virtual G4bool SetNtupleSColumn(const G4String& columnName, G4String& value) = 0; // Bind the ntuple columns of vector type - virtual G4bool SetNtupleIColumn(const G4String& columnName, + virtual G4bool SetNtupleIColumn(const G4String& columnName, std::vector& vector) = 0; - virtual G4bool SetNtupleFColumn(const G4String& columnName, + virtual G4bool SetNtupleFColumn(const G4String& columnName, std::vector& vector) = 0; - virtual G4bool SetNtupleDColumn(const G4String& columnName, + virtual G4bool SetNtupleDColumn(const G4String& columnName, std::vector& vector) = 0; - // Methods for ntuple with id > FirstNtupleId - virtual G4bool SetNtupleIColumn(G4int ntupleId, + virtual G4bool SetNtupleSColumn(const G4String& columnName, + std::vector& vector) = 0; + // Methods for ntuple with id > FirstNtupleId + virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, G4int& value)= 0; - virtual G4bool SetNtupleFColumn(G4int ntupleId, + virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, G4float& value)= 0; - virtual G4bool SetNtupleDColumn(G4int ntupleId, + virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, G4double& value)= 0; - virtual G4bool SetNtupleSColumn(G4int ntupleId, + virtual G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, G4String& value)= 0; // Bind the ntuple columns of vector type - virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) = 0; - virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) = 0; - virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) = 0; + virtual G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, + std::vector& vector) = 0; virtual G4bool GetNtupleRow() = 0; virtual G4bool GetNtupleRow(G4int ntupleId) = 0; - + // Access methods virtual G4int GetNofNtuples() const = 0; }; - + #endif diff --git a/source/analysis/management/include/G4VTFileManager.hh b/source/analysis/management/include/G4VTFileManager.hh index 8535f34fab..b79cdef4b7 100644 --- a/source/analysis/management/include/G4VTFileManager.hh +++ b/source/analysis/management/include/G4VTFileManager.hh @@ -44,8 +44,8 @@ class G4VTFileManager : public G4VFileManager, { public: explicit G4VTFileManager(const G4AnalysisManagerState& state) - : G4VFileManager(state), G4TFileManager(state), fFile(nullptr) {} - ~G4VTFileManager() {} + : G4VFileManager(state), G4TFileManager(state) {} + virtual ~G4VTFileManager() = default; using G4VFileManager::WriteFile; using G4VFileManager::CloseFile; @@ -61,13 +61,16 @@ class G4VTFileManager : public G4VFileManager, virtual G4bool CloseFiles() final; virtual G4bool DeleteEmptyFiles() final; + // Clear all data + virtual void Clear() final; + // Get method std::shared_ptr GetFile() const; protected: // Data members // Default file - created at OpenFile call - std::shared_ptr fFile; + std::shared_ptr fFile { nullptr }; }; //_____________________________________________________________________________ @@ -131,6 +134,15 @@ G4bool G4VTFileManager::DeleteEmptyFiles() return G4TFileManager::DeleteEmptyFiles(); } +//_____________________________________________________________________________ +template +inline +void G4VTFileManager::Clear() +{ + G4TFileManager::ClearData(); + UnlockDirectoryNames(); +} + //_____________________________________________________________________________ template inline std::shared_ptr G4VTFileManager::GetFile() const diff --git a/source/analysis/management/include/G4VTHnFileManager.hh b/source/analysis/management/include/G4VTHnFileManager.hh index 0b0ca8ca52..fec3ebc9e8 100644 --- a/source/analysis/management/include/G4VTHnFileManager.hh +++ b/source/analysis/management/include/G4VTHnFileManager.hh @@ -31,17 +31,14 @@ #ifndef G4VTHnFileManager_h #define G4VTHnFileManager_h 1 -#include "G4BaseFileManager.hh" #include "globals.hh" -class G4AnalysisManagerState; - template class G4VTHnFileManager { public: - G4VTHnFileManager() {} - virtual ~G4VTHnFileManager() {} + G4VTHnFileManager() = default; + virtual ~G4VTHnFileManager() = default; // Methods for writing objects // Write a single object to an extra file (the file is closed after write) diff --git a/environments/g4py/tests/gtest01/module/QMaterials.hh b/source/analysis/management/include/G4VTHnRFileManager.hh similarity index 76% rename from environments/g4py/tests/gtest01/module/QMaterials.hh rename to source/analysis/management/include/G4VTHnRFileManager.hh index 8d9dab8996..dcc6c672d0 100644 --- a/environments/g4py/tests/gtest01/module/QMaterials.hh +++ b/source/analysis/management/include/G4VTHnRFileManager.hh @@ -23,28 +23,26 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// QMaterials.hh + +// Templated base class for histogram/profile reading from a file. // -// 2005 Q -// ==================================================================== -#ifndef Q_MATERIALS_H -#define Q_MATERIALS_H +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) + +#ifndef G4VTHnRFileManager_h +#define G4VTHnRFileManager_h 1 #include "globals.hh" -// ==================================================================== -// -// class definition -// -// ==================================================================== -class QMaterials { -public: - QMaterials(); - ~QMaterials(); +template +class G4VTHnRFileManager +{ + public: + G4VTHnRFileManager() = default; + virtual ~G4VTHnRFileManager() = default; - void Construct(); + // Methods for reading objects + virtual HT* Read(const G4String& htName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) = 0; }; #endif - diff --git a/source/analysis/management/sources.cmake b/source/analysis/management/sources.cmake index 45d07d5a2c..52b052f1ff 100644 --- a/source/analysis/management/sources.cmake +++ b/source/analysis/management/sources.cmake @@ -56,9 +56,11 @@ geant4_add_module(G4analysismng G4VNtupleManager.hh G4VP1Manager.hh G4VP2Manager.hh + G4VRFileManager.hh G4VRNtupleManager.hh G4VTFileManager.hh G4VTHnFileManager.hh + G4VTHnRFileManager.hh SOURCES G4AnalysisVerbose.cc G4AnalysisManagerState.cc diff --git a/source/analysis/management/src/G4AnalysisManagerState.cc b/source/analysis/management/src/G4AnalysisManagerState.cc index c0fcc53509..681cb52118 100644 --- a/source/analysis/management/src/G4AnalysisManagerState.cc +++ b/source/analysis/management/src/G4AnalysisManagerState.cc @@ -27,68 +27,52 @@ // Author: Ivana Hrivnacova, 09/07/2013 (ivana@ipno.in2p3.fr) #include "G4AnalysisManagerState.hh" +#include "G4AnalysisUtilities.hh" #include "G4UnitsTable.hh" -#include +using namespace G4Analysis; //_____________________________________________________________________________ G4AnalysisManagerState::G4AnalysisManagerState( const G4String& type, G4bool isMaster) : fType(type), - fIsMaster(isMaster), - fIsActivation(false), - fVerboseLevel(0), - fCompressionLevel(1), - fVerboseL1(1), - fVerboseL2(2), - fVerboseL3(3), - fVerboseL4(4), - fpVerboseL1(0), - fpVerboseL2(0), - fpVerboseL3(0), - fpVerboseL4(0) -{ -} + fIsMaster(isMaster) +{} // // private methods // //_____________________________________________________________________________ -void G4AnalysisManagerState::SetVerboseLevel(G4int verboseLevel) +void G4AnalysisManagerState::SetVerboseLevel(G4int verboseLevel) { - if ( verboseLevel == fVerboseLevel || verboseLevel < 0 ) return; - + if ( verboseLevel == fVerboseLevel ) return; + + if ( verboseLevel < 0 ) { + Warn("Cannot set value < 0", fkClass, "SetVerboseLevel"); + return; + } + fVerboseLevel = verboseLevel; - - if ( verboseLevel == 0 ) { - fpVerboseL1 = nullptr; - fpVerboseL2 = nullptr; - fpVerboseL3 = nullptr; - fpVerboseL4 = nullptr; - } - else if ( verboseLevel == 1 ) { - fpVerboseL1 = &fVerboseL1; - fpVerboseL2 = nullptr; - fpVerboseL3 = nullptr; - fpVerboseL4 = nullptr; - } - else if ( verboseLevel == 2 ) { - fpVerboseL1 = &fVerboseL1; - fpVerboseL2 = &fVerboseL2; - fpVerboseL3 = nullptr; - fpVerboseL4 = nullptr; - } - else if ( verboseLevel == 3 ) { - fpVerboseL1 = &fVerboseL1; - fpVerboseL2 = &fVerboseL2; - fpVerboseL3 = &fVerboseL3; - fpVerboseL4 = nullptr; - } - else if ( verboseLevel > 3 ) { - fpVerboseL1 = &fVerboseL1; - fpVerboseL2 = &fVerboseL2; - fpVerboseL3 = &fVerboseL3; - fpVerboseL4 = &fVerboseL4; - } +} + +// +// public methods +// + +//_____________________________________________________________________________ +void G4AnalysisManagerState::Message( + [[maybe_unused]] G4int level, + [[maybe_unused]] const G4String& action, + [[maybe_unused]] const G4String& objectType, + [[maybe_unused]] const G4String& objectName, + [[maybe_unused]] G4bool success ) const +{ +#ifdef G4VERBOSE + // Skip message if of higher level than that is set + if (fVerboseLevel < level) return; + + // Print message + fVerbose.Message(level, action, objectType, objectName, success); +#endif } diff --git a/source/analysis/management/src/G4AnalysisMessenger.cc b/source/analysis/management/src/G4AnalysisMessenger.cc index 28b043c32f..541442cf57 100644 --- a/source/analysis/management/src/G4AnalysisMessenger.cc +++ b/source/analysis/management/src/G4AnalysisMessenger.cc @@ -46,28 +46,12 @@ using namespace G4Analysis; //_____________________________________________________________________________ G4AnalysisMessenger::G4AnalysisMessenger(G4VAnalysisManager* manager) : G4UImessenger(), - fManager(manager), - fFileMessenger(nullptr), - fH1Messenger(nullptr), - fH2Messenger(nullptr), - fH3Messenger(nullptr), - fP1Messenger(nullptr), - fP2Messenger(nullptr), - fNtupleMessenger(nullptr), - fH1HnMessenger(nullptr), - fH2HnMessenger(nullptr), - fH3HnMessenger(nullptr), - fP1HnMessenger(nullptr), - fP2HnMessenger(nullptr), - fAnalysisDir(nullptr), - fSetActivationCmd(nullptr), - fVerboseCmd(nullptr), - fCompressionCmd(nullptr) -{ - fAnalysisDir = G4Analysis::make_unique("/analysis/"); + fManager(manager) +{ + fAnalysisDir = std::make_unique("/analysis/"); fAnalysisDir->SetGuidance("analysis control"); - fSetActivationCmd = G4Analysis::make_unique("/analysis/setActivation",this); + fSetActivationCmd = std::make_unique("/analysis/setActivation",this); G4String guidance = "Set activation. \n"; guidance += "When this option is enabled, only the histograms marked as activated\n"; guidance += "are returned, filled or saved on file.\n"; @@ -75,28 +59,27 @@ G4AnalysisMessenger::G4AnalysisMessenger(G4VAnalysisManager* manager) fSetActivationCmd->SetGuidance(guidance); fSetActivationCmd->SetParameterName("Activation",false); - fVerboseCmd = G4Analysis::make_unique("/analysis/verbose",this); + fVerboseCmd = std::make_unique("/analysis/verbose",this); fVerboseCmd->SetGuidance("Set verbose level"); fVerboseCmd->SetParameterName("VerboseLevel",false); fVerboseCmd->SetRange("VerboseLevel>=0 && VerboseLevel<=4"); - - fCompressionCmd = G4Analysis::make_unique("/analysis/compression",this); + + fCompressionCmd = std::make_unique("/analysis/compression",this); fCompressionCmd->SetGuidance("Set compression level"); fCompressionCmd->SetParameterName("CompressionLevel",false); fCompressionCmd->SetRange("CompressionLevel>=0 && CompressionLevel<=4"); - - fFileMessenger = G4Analysis::make_unique(manager); - fH1Messenger = G4Analysis::make_unique(manager); - fH2Messenger = G4Analysis::make_unique(manager); - fH3Messenger = G4Analysis::make_unique(manager); - fP1Messenger = G4Analysis::make_unique(manager); - fP2Messenger = G4Analysis::make_unique(manager); - fNtupleMessenger = G4Analysis::make_unique(manager); + + fFileMessenger = std::make_unique(manager); + fH1Messenger = std::make_unique(manager); + fH2Messenger = std::make_unique(manager); + fH3Messenger = std::make_unique(manager); + fP1Messenger = std::make_unique(manager); + fP2Messenger = std::make_unique(manager); + fNtupleMessenger = std::make_unique(manager); } //_____________________________________________________________________________ -G4AnalysisMessenger::~G4AnalysisMessenger() -{} +G4AnalysisMessenger::~G4AnalysisMessenger() = default; // // public functions @@ -105,43 +88,43 @@ G4AnalysisMessenger::~G4AnalysisMessenger() //_____________________________________________________________________________ void G4AnalysisMessenger::SetH1HnManager(G4HnManager& h1HnManager) { - fH1HnMessenger = G4Analysis::make_unique(h1HnManager); -} + fH1HnMessenger = std::make_unique(h1HnManager); +} //_____________________________________________________________________________ void G4AnalysisMessenger::SetH2HnManager(G4HnManager& h2HnManager) { - fH2HnMessenger = G4Analysis::make_unique(h2HnManager); -} + fH2HnMessenger = std::make_unique(h2HnManager); +} //_____________________________________________________________________________ void G4AnalysisMessenger::SetH3HnManager(G4HnManager& h3HnManager) { - fH3HnMessenger = G4Analysis::make_unique(h3HnManager); -} + fH3HnMessenger = std::make_unique(h3HnManager); +} //_____________________________________________________________________________ void G4AnalysisMessenger::SetP1HnManager(G4HnManager& p1HnManager) { - fP1HnMessenger = G4Analysis::make_unique(p1HnManager); -} + fP1HnMessenger = std::make_unique(p1HnManager); +} //_____________________________________________________________________________ void G4AnalysisMessenger::SetP2HnManager(G4HnManager& p2HnManager) { - fP2HnMessenger = G4Analysis::make_unique(p2HnManager); -} + fP2HnMessenger = std::make_unique(p2HnManager); +} //_____________________________________________________________________________ void G4AnalysisMessenger::SetNewValue(G4UIcommand* command, G4String newValues) { if ( command == fSetActivationCmd.get() ) { fManager->SetActivation(fSetActivationCmd->GetNewBoolValue(newValues)); - } + } else if ( command == fVerboseCmd.get() ) { fManager->SetVerboseLevel(fVerboseCmd->GetNewIntValue(newValues)); - } + } else if ( command == fCompressionCmd.get() ) { fManager->SetCompressionLevel(fCompressionCmd->GetNewIntValue(newValues)); - } -} + } +} diff --git a/source/analysis/management/src/G4AnalysisMessengerHelper.cc b/source/analysis/management/src/G4AnalysisMessengerHelper.cc index 66dad816cc..30b6e68777 100644 --- a/source/analysis/management/src/G4AnalysisMessengerHelper.cc +++ b/source/analysis/management/src/G4AnalysisMessengerHelper.cc @@ -39,11 +39,11 @@ #include "G4UIparameter.hh" #include "G4Tokenizer.hh" -#include #include #include using namespace G4Analysis; +using std::to_string; namespace { @@ -54,7 +54,7 @@ G4String ObjectType(const G4String& hnType) if (first == "h") { return "Histogram"; } else if (first == "p") { - return "Profile"; + return "Profile"; } else { // other possibilitied not handled return ""; @@ -69,20 +69,16 @@ void Replace(std::string& str, const std::string& from, const std::string& to) { while ((start_pos = str.find(from, start_pos)) != std::string::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' - } -} + } +} -} +} //_____________________________________________________________________________ G4AnalysisMessengerHelper::G4AnalysisMessengerHelper(const G4String& hnType) : fHnType(hnType) {} -//_____________________________________________________________________________ -G4AnalysisMessengerHelper::~G4AnalysisMessengerHelper() -{} - // // private functions // @@ -93,30 +89,27 @@ G4String G4AnalysisMessengerHelper::Update(const G4String& str, const G4String& G4String newStr(str); // Hn, Pn - G4String upperHnType(str); - upperHnType.toUpper(); + G4String upperHnType = G4StrUtil::to_upper_copy(str); Replace(newStr, "UHNTYPE_", upperHnType); // hn, pn Replace(newStr, "HNTYPE_", fHnType); - + // n = 1,2,3 G4String second = fHnType.substr(1,1); Replace(newStr, "NDIM_", second); - + // histogram, profile - G4String lowerObjectType(ObjectType(fHnType)); - lowerObjectType.toLower(); + G4String lowerObjectType = G4StrUtil::to_lower_copy(ObjectType(fHnType)); Replace(newStr, "LOBJECT", lowerObjectType); - + // Histogram, Profile Replace(newStr, "OBJECT", ObjectType(fHnType)); - + // X, Y, Z - G4String upperAxis(axis); - upperAxis.toUpper(); + G4String upperAxis = G4StrUtil::to_upper_copy(axis); Replace(newStr, "UAXIS", upperAxis); - + // x, y, z Replace(newStr, "AXIS", axis); @@ -129,7 +122,7 @@ G4String G4AnalysisMessengerHelper::Update(const G4String& str, const G4String& // //_____________________________________________________________________________ -std::unique_ptr +std::unique_ptr G4AnalysisMessengerHelper::CreateHnDirectory() const { std::unique_ptr directory(new G4UIdirectory(Update("/analysis/HNTYPE_/"))); @@ -138,7 +131,24 @@ G4AnalysisMessengerHelper::CreateHnDirectory() const } //_____________________________________________________________________________ -std::unique_ptr +std::unique_ptr +G4AnalysisMessengerHelper::CreateGetCommand(G4UImessenger* messenger) const +{ + auto parId = new G4UIparameter("id", 'i', false); + parId->SetGuidance(Update("OBJECT id")); + parId->SetParameterRange("id>=0"); + + std::unique_ptr command( + new G4UIcommand(Update("/analysis/HNTYPE_/get"), messenger)); + command->SetGuidance(Update("Get the address of the NDIM_D LOBJECT of given id")); + command->SetParameter(parId); + command->AvailableForStates(G4State_Idle, G4State_GeomClosed, G4State_EventProc); + + return command; +} + +//_____________________________________________________________________________ +std::unique_ptr G4AnalysisMessengerHelper::CreateSetTitleCommand(G4UImessenger* messenger) const { auto parId = new G4UIparameter("id", 'i', false); @@ -157,27 +167,27 @@ G4AnalysisMessengerHelper::CreateSetTitleCommand(G4UImessenger* messenger) const command->AvailableForStates(G4State_PreInit, G4State_Idle); return command; -} +} //_____________________________________________________________________________ -std::unique_ptr +std::unique_ptr G4AnalysisMessengerHelper::CreateSetBinsCommand(const G4String& axis, G4UImessenger* messenger) const { auto parId = new G4UIparameter("id", 'i', false); parId->SetGuidance(Update( "OBJECT id")); parId->SetParameterRange("id>=0"); - + auto parNbins = new G4UIparameter("nbins", 'i', false); parNbins->SetGuidance("Number of bins"); - + auto parValMin = new G4UIparameter("valMin", 'd', false); parValMin->SetGuidance("Minimum value, expressed in unit"); - + auto parValMax = new G4UIparameter("valMax", 'd', false); parValMax->SetGuidance("Maximum value, expressed in unit"); - + auto parValUnit = new G4UIparameter("valUnit", 's', true); parValUnit->SetGuidance("The unit applied to filled values and valMin, valMax"); parValUnit->SetDefaultValue("none"); @@ -193,12 +203,12 @@ G4AnalysisMessengerHelper::CreateSetBinsCommand(const G4String& axis, auto parValBinScheme = new G4UIparameter("valBinScheme", 's', true); parValBinScheme->SetParameterCandidates("linear log"); G4String binSchemeGuidance = "The binning scheme (linear, log).\n"; - binSchemeGuidance + binSchemeGuidance += "Note that the unit and fcn parameters cannot be omitted in this case,\n"; binSchemeGuidance += "but none value should be used instead."; parValBinScheme->SetGuidance(binSchemeGuidance); parValBinScheme->SetDefaultValue("linear"); - + auto commandName = Update("/analysis/HNTYPE_/setUAXIS", axis); std::unique_ptr command( new G4UIcommand(Update("/analysis/HNTYPE_/setUAXIS", axis), messenger)); @@ -215,10 +225,10 @@ G4AnalysisMessengerHelper::CreateSetBinsCommand(const G4String& axis, command->AvailableForStates(G4State_PreInit, G4State_Idle); return command; -} +} //_____________________________________________________________________________ - std::unique_ptr + std::unique_ptr G4AnalysisMessengerHelper::CreateSetValuesCommand(const G4String& axis, G4UImessenger* messenger) const { @@ -228,10 +238,10 @@ G4AnalysisMessengerHelper::CreateSetBinsCommand(const G4String& axis, auto parValMin = new G4UIparameter("valMin", 'd', false); parValMin->SetGuidance(Update("Minimum AXIS-value expressed in unit", axis)); - + auto parValMax = new G4UIparameter("valMax", 'd', false); parValMax->SetGuidance(Update("Maximum AXIS-value expressed in unit", axis)); - + auto parValUnit = new G4UIparameter("valUnit", 's', true); parValUnit->SetGuidance("The unit applied to filled values and valMin, valMax"); parValUnit->SetDefaultValue("none"); @@ -255,12 +265,12 @@ G4AnalysisMessengerHelper::CreateSetBinsCommand(const G4String& axis, command->SetParameter(parValUnit); command->SetParameter(parValFcn); command->AvailableForStates(G4State_PreInit, G4State_Idle); - + return command; -} +} //_____________________________________________________________________________ -std::unique_ptr +std::unique_ptr G4AnalysisMessengerHelper::CreateSetAxisCommand(const G4String& axis, G4UImessenger* messenger) const { @@ -271,7 +281,7 @@ G4AnalysisMessengerHelper::CreateSetAxisCommand(const G4String& axis, auto parAxis = new G4UIparameter("axis", 's', false); parAxis->SetGuidance(Update("Histogram AXIS-axis title", axis)); - std::unique_ptr command( + std::unique_ptr command( new G4UIcommand(Update("/analysis/HNTYPE_/setUAXISaxis", axis), messenger)); command->SetGuidance(Update("Set AXIS-axis title for the NDIM_D LOBJECT of given id", axis)); command->SetParameter(parId); @@ -282,7 +292,7 @@ G4AnalysisMessengerHelper::CreateSetAxisCommand(const G4String& axis, } //_____________________________________________________________________________ -std::unique_ptr +std::unique_ptr G4AnalysisMessengerHelper::CreateSetAxisLogCommand(const G4String& axis, G4UImessenger* messenger) const { @@ -293,7 +303,7 @@ G4AnalysisMessengerHelper::CreateSetAxisLogCommand(const G4String& axis, auto parAxisLog = new G4UIparameter("axis", 'b', false); parAxisLog->SetGuidance(Update("Histogram AXIS-axis log scale", axis)); - std::unique_ptr command( + std::unique_ptr command( new G4UIcommand(Update("/analysis/HNTYPE_/setUAXISaxisLog", axis), messenger)); command->SetGuidance( Update("Activate AXIS-axis log scale for plotting of the NDIM_D LOBJECT of given id", axis)); @@ -305,54 +315,45 @@ G4AnalysisMessengerHelper::CreateSetAxisLogCommand(const G4String& axis, } //_____________________________________________________________________________ -void G4AnalysisMessengerHelper::GetBinData(BinData& data, - std::vector& parameters, +void G4AnalysisMessengerHelper::GetBinData(BinData& data, + std::vector& parameters, G4int& counter) const { - data.fNbins = G4UIcommand::ConvertToInt(parameters[counter++]); - data.fVmin = G4UIcommand::ConvertToDouble(parameters[counter++]); - data.fVmax = G4UIcommand::ConvertToDouble(parameters[counter++]); ; + data.fNbins = G4UIcommand::ConvertToInt(parameters[counter++]); + data.fVmin = G4UIcommand::ConvertToDouble(parameters[counter++]); + data.fVmax = G4UIcommand::ConvertToDouble(parameters[counter++]); ; data.fSunit = parameters[counter++]; data.fSfcn = parameters[counter++]; data.fSbinScheme = parameters[counter++]; } //_____________________________________________________________________________ -void G4AnalysisMessengerHelper::GetValueData(ValueData& data, - std::vector& parameters, +void G4AnalysisMessengerHelper::GetValueData(ValueData& data, + std::vector& parameters, G4int& counter) const { - data.fVmin = G4UIcommand::ConvertToDouble(parameters[counter++]); - data.fVmax = G4UIcommand::ConvertToDouble(parameters[counter++]); ; + data.fVmin = G4UIcommand::ConvertToDouble(parameters[counter++]); + data.fVmax = G4UIcommand::ConvertToDouble(parameters[counter++]); ; data.fSunit = parameters[counter++]; data.fSfcn = parameters[counter++]; } //_____________________________________________________________________________ -void G4AnalysisMessengerHelper::WarnAboutParameters(G4UIcommand* command, +void G4AnalysisMessengerHelper::WarnAboutParameters(G4UIcommand* command, G4int nofParameters) const { - G4ExceptionDescription description; - description - << "Got wrong number of \"" << command->GetCommandName() - << "\" parameters: " << nofParameters - << " instead of " << command->GetParameterEntries() - << " expected" << G4endl; - G4String methodName(Update("G4UHNTYPE_Messenger::SetNewValue")); - G4Exception(methodName, - "Analysis_W013", JustWarning, description); + Warn( + "Got wrong number of \"" + command->GetCommandName() + + "\" parameters: " + to_string(nofParameters) + + " instead of " + to_string(command->GetParameterEntries()) + " expected", + fkClass, "WarnAboutParameters"); } //_____________________________________________________________________________ void G4AnalysisMessengerHelper::WarnAboutSetCommands() const { - G4ExceptionDescription description; - description - << "Command setX, setY, setZ must be called successively in this order. " << G4endl - << "Command was ignored." << G4endl; - G4String methodName(Update("G4UHNTYPE_Messenger::SetNewValue")); - G4Exception(methodName, - "Analysis_W013", JustWarning, description); + Warn( + "Command setX, setY, setZ must be called successively in this order.\n" + "Command was ignored.", + fkClass, "WarnAboutSetCommands"); } - - diff --git a/source/analysis/management/src/G4AnalysisUtilities.cc b/source/analysis/management/src/G4AnalysisUtilities.cc index 1fe29f7445..6d1ec2fe4a 100644 --- a/source/analysis/management/src/G4AnalysisUtilities.cc +++ b/source/analysis/management/src/G4AnalysisUtilities.cc @@ -28,14 +28,18 @@ #include "G4AnalysisUtilities.hh" #include "G4BinScheme.hh" +#include "G4Exception.hh" #include "G4UnitsTable.hh" #include "G4String.hh" #include "G4Threading.hh" +#include "G4Filesystem.hh" + +using std::to_string; namespace { //_____________________________________________________________________________ -G4bool GetToken(const G4String& line, G4String& token, +G4bool GetToken(const G4String& line, G4String& token, std::string::size_type begIdx, std::string::size_type& endIdx) { while ( line[begIdx] == ' ') ++begIdx; // Loop checking, 23.06.2015, I. Hrivnacova @@ -51,84 +55,73 @@ G4bool GetToken(const G4String& line, G4String& token, token = line.substr(begIdx, endIdx-begIdx); } return ( token.length() > 0 ); -} +} } namespace G4Analysis { +//_____________________________________________________________________________ +void Warn(const G4String& message, + const std::string_view inClass, + const std::string_view inFunction) +{ + auto source = std::string(inClass) + "::" + std::string(inFunction); + G4Exception(source.data(), "Analysis_W001", JustWarning, message); +} + //_____________________________________________________________________________ G4bool CheckNbins(G4int nbins) { if ( nbins <= 0 ) { - G4ExceptionDescription description; - description - << " Illegal value of number of bins: nbins <= 0" << G4endl; - G4Exception("G4VAnalysisManager::CheckNbins", - "Analysis_W013", JustWarning, description); + Warn("Illegal value of number of bins: nbins <= 0", + kNamespaceName, "CheckNbins"); return false; } else - return true; -} + return true; +} //_____________________________________________________________________________ -G4bool CheckMinMax(G4double xmin, G4double xmax, +G4bool CheckMinMax(G4double xmin, G4double xmax, const G4String& fcnName, const G4String& binSchemeName) { auto result = true; - + if ( xmax <= xmin ) { - G4ExceptionDescription description; - description - << " Illegal values of (xmin >= xmax)" << G4endl; - G4Exception("G4VAnalysisManager::CheckMinMax", - "Analysis_W013", JustWarning, description); - + Warn("Illegal value of number of (xmin >= xmax)", + kNamespaceName, "CheckMinMax"); result = false; } - + if ( ( fcnName != "none" ) && ( binSchemeName != "linear" ) ) { - G4ExceptionDescription description; - description - << " Combining Function and Binning scheme is not supported." - << G4endl; - G4Exception("G4VAnalysisManager::CheckMinMax", - "Analysis_W013", JustWarning, description); - + Warn("Combining Function and Binning scheme is not supported.", + kNamespaceName, "CheckMinMax"); result = false; } - + if ( ( GetBinScheme(binSchemeName) == G4BinScheme::kLog || fcnName == "log" || fcnName == "log10" ) && ( xmin == 0 ) ) { - G4ExceptionDescription description; - description - << " Illegal value of (xmin = 0) with logarithmic function or binning" - << G4endl; - G4Exception("G4VAnalysisManager::CheckMinMax", - "Analysis_W013", JustWarning, description); - + Warn("Illegal value of (xmin = 0) with logarithmic function or binning", + kNamespaceName, "CheckMinMax"); result = false; } - + return result; -} +} //_____________________________________________________________________________ G4bool CheckEdges(const std::vector& edges) { if ( edges.size() <= 1 ) { - G4ExceptionDescription description; - description - << " Illegal edges vector (size <= 1)" << G4endl; - G4Exception("G4VAnalysisManager::CheckEdges", - "Analysis_W013", JustWarning, description); + Warn("Illegal edges vector (size <= 1)", + kNamespaceName, "CheckEdges"); return false; } else - return true; + return true; } @@ -136,16 +129,12 @@ G4bool CheckEdges(const std::vector& edges) G4bool CheckName(const G4String& name, const G4String& objectType) { if ( ! name.size() ) { - G4ExceptionDescription description; - description - << " Empty " << objectType << " name is not allowed." << G4endl - << " " << objectType << " was not created." << G4endl; - G4Exception("G4VAnalysisManager::CheckName", - "Analysis_W013", JustWarning, description); + Warn("Empty " + objectType + " name is not allowed.\n" + + objectType + " was not created.", kNamespaceName, "CheckEdges"); return false; } else - return true; + return true; } //_____________________________________________________________________________ @@ -154,35 +143,35 @@ G4double GetUnitValue(const G4String& unit) G4double value = 1.; if ( unit != "none" ) { value = G4UnitDefinition::GetValueOf(unit); - if ( value == 0. ) value = 1.; - } + if ( value == 0. ) value = 1.; + } return value; -} +} //_____________________________________________________________________________ -void UpdateTitle(G4String& title, - const G4String& unitName, +void UpdateTitle(G4String& title, + const G4String& unitName, const G4String& fcnName) { if ( fcnName != "none" ) { title += " "; title += fcnName; title += "("; } if ( unitName != "none" ) { title += " ["; title += unitName; title += "]";} if ( fcnName != "none" ) { title += ")"; } -} +} //_____________________________________________________________________________ void Tokenize(const G4String& line, std::vector& tokens) { // Define start values std::string::size_type begIdx = 0; - std::string::size_type endIdx = 0; + std::string::size_type endIdx = 0; G4String token; - + do { if ( GetToken(line, token, begIdx, endIdx) ) { //G4cout << "got token: '" << token << "'" << G4endl; //G4cout << "beg, end: " << begIdx << ", " << endIdx << G4endl; tokens.push_back(token); - } + } begIdx = endIdx + 1; } while ( endIdx < line.length() ); // Loop checking, 23.06.2015, I. Hrivnacova @@ -197,13 +186,10 @@ G4AnalysisOutput GetOutput(const G4String& outputName, G4bool warn) { else if ( outputName == "none" ) { return G4AnalysisOutput::kNone; } else { if (warn) { - G4ExceptionDescription description; - description - << " \"" << outputName << "\" output type is not supported." << G4endl; - G4Exception("G4Analysis::GetOutputType", - "Analysis_W051", JustWarning, description); + Warn("\"" + outputName + "\" output type is not supported.", + kNamespaceName, "GetOutput"); } - return G4AnalysisOutput::kNone; + return G4AnalysisOutput::kNone; } } @@ -213,10 +199,10 @@ G4String GetOutputName(G4AnalysisOutput output) { case G4AnalysisOutput::kCsv: return "csv"; break; - case G4AnalysisOutput::kHdf5: + case G4AnalysisOutput::kHdf5: return "hdf5"; break; - case G4AnalysisOutput::kRoot: + case G4AnalysisOutput::kRoot: return "root"; break; case G4AnalysisOutput::kXml: @@ -227,12 +213,9 @@ G4String GetOutputName(G4AnalysisOutput output) { break; } // should never reach this line - G4ExceptionDescription description; - description - << " \"" << static_cast(output) << "\" is not handled." << G4endl - << " " << "none type will be used."; - G4Exception("G4Analysis::GetOutputName", - "Analysis_W051", JustWarning, description); + Warn("\"" + to_string(static_cast(output)) + + "\" output type is not supported.", + kNamespaceName, "CheckOutputName"); return "none"; } @@ -241,12 +224,13 @@ G4String GetBaseName(const G4String& fileName) { // Get file base name (without dot) - G4String name = fileName; - if ( name.rfind(".") != std::string::npos ) { - name = name.substr(0, name.rfind(".")); + G4fs::path filePath(fileName.data()); + if ( filePath.has_parent_path()) { + return filePath.parent_path().string() + "/" + filePath.stem().string(); } - return name; -} + + return filePath.stem().string(); +} //_____________________________________________________________________________ G4String GetExtension(const G4String& fileName, @@ -255,21 +239,21 @@ G4String GetExtension(const G4String& fileName, // Get file base extension (without dot) // If fileName is provided without extension, return defaultExtension - G4String extension; - if ( fileName.rfind(".") != std::string::npos ) { - extension = fileName.substr(fileName.rfind(".") + 1); + G4fs::path filePath(fileName.data()); + if ( filePath.has_extension() ) { + auto extension = filePath.extension().string(); + // remove "." + return extension.substr(1, extension.length()); } - if ( ! extension.size() ) { - extension = defaultExtension; - } - return extension; + + return defaultExtension; } //_____________________________________________________________________________ G4String GetHnFileName( const G4String& fileName, - const G4String& fileType, - const G4String& hnType, + const G4String& fileType, + const G4String& hnType, const G4String& hnName) { // Compose and return the histogram or profile specific file name: @@ -277,7 +261,7 @@ G4String GetHnFileName( // - add file extension if not present auto name = GetBaseName(fileName); - + // Add _hnType_hnName name.append("_"); name.append(hnType); @@ -297,7 +281,7 @@ G4String GetHnFileName( //_____________________________________________________________________________ G4String GetNtupleFileName( const G4String& fileName, - const G4String& fileType, + const G4String& fileType, const G4String& ntupleName) { // Compose and return the ntuple specific file name: @@ -306,7 +290,7 @@ G4String GetNtupleFileName( // - add file extension if not present auto name = GetBaseName(fileName); - + // Add ntupleName name.append("_nt_"); name.append(ntupleName); @@ -317,7 +301,7 @@ G4String GetNtupleFileName( os << G4Threading::G4GetThreadId(); name.append("_t"); name.append(os.str()); - } + } // Add file extension auto extension = GetExtension(fileName, fileType); @@ -325,14 +309,14 @@ G4String GetNtupleFileName( name.append("."); name.append(extension); } - + return name; } //_____________________________________________________________________________ G4String GetNtupleFileName( const G4String& fileName, - const G4String& fileType, + const G4String& fileType, G4int ntupleFileNumber) { // Compose and return the ntuple specific file name: @@ -340,7 +324,7 @@ G4String GetNtupleFileName( // - add file extension if not present auto name = GetBaseName(fileName); - + // Add _M followed by ntupleFileNumber std::ostringstream os; os << ntupleFileNumber; @@ -353,7 +337,7 @@ G4String GetNtupleFileName( name.append("."); name.append(extension); } - + return name; } diff --git a/source/analysis/management/src/G4AnalysisVerbose.cc b/source/analysis/management/src/G4AnalysisVerbose.cc index be534332e6..6ae53c6473 100644 --- a/source/analysis/management/src/G4AnalysisVerbose.cc +++ b/source/analysis/management/src/G4AnalysisVerbose.cc @@ -28,39 +28,32 @@ #include "G4AnalysisVerbose.hh" #include "G4UnitsTable.hh" - -#include +#include "G4ios.hh" //_____________________________________________________________________________ -G4AnalysisVerbose::G4AnalysisVerbose(G4int verboseLevel) - : fToBeDoneText(), - fDoneText(), - fFailureText() -{ - if ( verboseLevel == 1 ) fDoneText = "- done"; - if ( verboseLevel == 2 ) fDoneText = "- done"; - if ( verboseLevel == 3 ) fToBeDoneText = "done "; - if ( verboseLevel == 4 ) fToBeDoneText = "going to "; - fFailureText = "has failed"; -} +G4AnalysisVerbose::G4AnalysisVerbose() +{} -//_____________________________________________________________________________ -G4AnalysisVerbose::~G4AnalysisVerbose() -{ -} - -// +// // public method // //_____________________________________________________________________________ -void G4AnalysisVerbose::Message(const G4String& action, - const G4String& object, +void G4AnalysisVerbose::Message(G4int level, + const G4String& action, + const G4String& object, const G4String& objectName, G4bool success) const { + if ( level == 0 ) return; + + if ( level < 0 || level > fkMaxLevel ) { + // add exception + return; + } + G4cout << "... " - << fToBeDoneText + << fToBeDoneText[level-1] << action << " " << object; @@ -71,32 +64,9 @@ void G4AnalysisVerbose::Message(const G4String& action, } if ( success ) - G4cout << " " << fDoneText; - else + G4cout << " " << fDoneText[level-1]; + else G4cout << " " << fFailureText; - - G4cout << G4endl; -} - -//_____________________________________________________________________________ -void G4AnalysisVerbose::Message(const G4String& action, - const G4String& object, - G4ExceptionDescription& description, - G4bool success) const -{ - G4cout << "... " - << fToBeDoneText - << action - << " " - << object - << " : " - << description.str() - << " "; - if ( success ) - G4cout << fDoneText; - else - G4cout << fFailureText; - G4cout << G4endl; -} +} diff --git a/source/analysis/management/src/G4BaseAnalysisManager.cc b/source/analysis/management/src/G4BaseAnalysisManager.cc index 129119c288..dd75a62560 100644 --- a/source/analysis/management/src/G4BaseAnalysisManager.cc +++ b/source/analysis/management/src/G4BaseAnalysisManager.cc @@ -28,37 +28,30 @@ #include "G4BaseAnalysisManager.hh" #include "G4AnalysisManagerState.hh" +#include "G4AnalysisUtilities.hh" -#include +using namespace G4Analysis; //_____________________________________________________________________________ G4BaseAnalysisManager::G4BaseAnalysisManager( const G4AnalysisManagerState& state) - : fState(state), - fFirstId(0), - fLockFirstId(false) + : fState(state) {} -//_____________________________________________________________________________ -G4BaseAnalysisManager::~G4BaseAnalysisManager() -{} - -// +// // public methods // //_____________________________________________________________________________ -G4bool G4BaseAnalysisManager::SetFirstId(G4int firstId) +G4bool G4BaseAnalysisManager::SetFirstId(G4int firstId) { if ( fLockFirstId ) { - G4ExceptionDescription description; - description - << "Cannot set FirstId as its value was already used."; - G4Exception("G4BaseAnalysisManager::SetFirstId()", - "Analysis_W013", JustWarning, description); + Warn("Cannot set FirstId as its value was already used.", + fkClass, "SetFirstId"); + return false; - } + } fFirstId = firstId; return true; -} +} diff --git a/source/analysis/management/src/G4BaseFileManager.cc b/source/analysis/management/src/G4BaseFileManager.cc index 7380b1636d..fda5c8ed53 100644 --- a/source/analysis/management/src/G4BaseFileManager.cc +++ b/source/analysis/management/src/G4BaseFileManager.cc @@ -33,18 +33,10 @@ //_____________________________________________________________________________ G4BaseFileManager::G4BaseFileManager(const G4AnalysisManagerState& state) - : fState(state), - fFileName(""), - fFileNames() -{ -} + : fState(state) +{} -//_____________________________________________________________________________ -G4BaseFileManager::~G4BaseFileManager() -{ -} - -// +// // public methods // @@ -54,7 +46,7 @@ void G4BaseFileManager::AddFileName(const G4String& fileName) // G4cout << "registering " << fileName << " in manager of " << GetFileType() << G4endl; // Do nothing in file name is already present - for ( auto name : fFileNames ) { + for ( const auto& name : fFileNames ) { if ( name == fileName ) return; } @@ -62,11 +54,9 @@ void G4BaseFileManager::AddFileName(const G4String& fileName) } //_____________________________________________________________________________ -G4String G4BaseFileManager::GetFileType() const +G4String G4BaseFileManager::GetFileType() const { - G4String fileType = fState.GetType(); - fileType.toLower(); - return fileType; + return G4StrUtil::to_lower_copy(fState.GetType()); } //_____________________________________________________________________________ @@ -105,16 +95,16 @@ G4String G4BaseFileManager::GetHnFileName(const G4String& hnType, } //_____________________________________________________________________________ -G4String G4BaseFileManager::GetNtupleFileName(const G4String& ntupleName) const -{ +G4String G4BaseFileManager::GetNtupleFileName(const G4String& ntupleName) const +{ return G4Analysis::GetNtupleFileName(fFileName, GetFileType(), ntupleName); -} +} //_____________________________________________________________________________ -G4String G4BaseFileManager::GetNtupleFileName(G4int ntupleFileNumber) const -{ +G4String G4BaseFileManager::GetNtupleFileName(G4int ntupleFileNumber) const +{ return G4Analysis::GetNtupleFileName(fFileName, GetFileType(), ntupleFileNumber); -} +} //_____________________________________________________________________________ G4String G4BaseFileManager::GetPlotFileName() const diff --git a/source/analysis/management/src/G4BaseNtupleManager.cc b/source/analysis/management/src/G4BaseNtupleManager.cc index dca3ab3373..b310c5a56d 100644 --- a/source/analysis/management/src/G4BaseNtupleManager.cc +++ b/source/analysis/management/src/G4BaseNtupleManager.cc @@ -30,16 +30,9 @@ //_____________________________________________________________________________ G4BaseNtupleManager::G4BaseNtupleManager(const G4AnalysisManagerState& state) - : G4VNtupleManager(state), - fFirstNtupleColumnId(0) - // fLockFirstNtupleColumnId(false) + : G4VNtupleManager(state) {} -//_____________________________________________________________________________ -G4BaseNtupleManager::~G4BaseNtupleManager() -{ -} - //_____________________________________________________________________________ G4bool G4BaseNtupleManager::FillNtupleIColumn(G4int id, G4int value) { diff --git a/source/analysis/management/src/G4BaseRNtupleManager.cc b/source/analysis/management/src/G4BaseRNtupleManager.cc index e3b4b50503..dff77e1b98 100644 --- a/source/analysis/management/src/G4BaseRNtupleManager.cc +++ b/source/analysis/management/src/G4BaseRNtupleManager.cc @@ -31,13 +31,7 @@ //_____________________________________________________________________________ G4BaseRNtupleManager::G4BaseRNtupleManager(const G4AnalysisManagerState& state) : G4VRNtupleManager(state) -{ -} - -//_____________________________________________________________________________ -G4BaseRNtupleManager::~G4BaseRNtupleManager() -{ -} +{} // // private methods @@ -49,55 +43,62 @@ G4int G4BaseRNtupleManager::GetCurrentNtupleId() const } //_____________________________________________________________________________ -G4bool G4BaseRNtupleManager::SetNtupleIColumn(const G4String& columnName, +G4bool G4BaseRNtupleManager::SetNtupleIColumn(const G4String& columnName, G4int& value) { return SetNtupleIColumn(GetCurrentNtupleId(), columnName, value); } //_____________________________________________________________________________ -G4bool G4BaseRNtupleManager::SetNtupleFColumn(const G4String& columnName, +G4bool G4BaseRNtupleManager::SetNtupleFColumn(const G4String& columnName, G4float& value) { - return SetNtupleFColumn(GetCurrentNtupleId(), columnName, value); + return SetNtupleFColumn(GetCurrentNtupleId(), columnName, value); } //_____________________________________________________________________________ -G4bool G4BaseRNtupleManager::SetNtupleDColumn(const G4String& columnName, +G4bool G4BaseRNtupleManager::SetNtupleDColumn(const G4String& columnName, G4double& value) { - return SetNtupleDColumn(GetCurrentNtupleId(), columnName, value); + return SetNtupleDColumn(GetCurrentNtupleId(), columnName, value); } //_____________________________________________________________________________ -G4bool G4BaseRNtupleManager::SetNtupleSColumn(const G4String& columnName, +G4bool G4BaseRNtupleManager::SetNtupleSColumn(const G4String& columnName, G4String& value) { - return SetNtupleSColumn(GetCurrentNtupleId(), columnName, value); + return SetNtupleSColumn(GetCurrentNtupleId(), columnName, value); } //_____________________________________________________________________________ -G4bool G4BaseRNtupleManager::SetNtupleIColumn(const G4String& columnName, +G4bool G4BaseRNtupleManager::SetNtupleIColumn(const G4String& columnName, std::vector& vector) { return SetNtupleIColumn(GetCurrentNtupleId(), columnName, vector); } //_____________________________________________________________________________ -G4bool G4BaseRNtupleManager::SetNtupleFColumn(const G4String& columnName, +G4bool G4BaseRNtupleManager::SetNtupleFColumn(const G4String& columnName, std::vector& vector) { return SetNtupleFColumn(GetCurrentNtupleId(), columnName, vector); } //_____________________________________________________________________________ -G4bool G4BaseRNtupleManager::SetNtupleDColumn(const G4String& columnName, +G4bool G4BaseRNtupleManager::SetNtupleDColumn(const G4String& columnName, std::vector& vector) { return SetNtupleDColumn(GetCurrentNtupleId(), columnName, vector); } +//_____________________________________________________________________________ +G4bool G4BaseRNtupleManager::SetNtupleSColumn(const G4String& columnName, + std::vector& vector) +{ + return SetNtupleSColumn(GetCurrentNtupleId(), columnName, vector); +} + //_____________________________________________________________________________ G4bool G4BaseRNtupleManager::GetNtupleRow() { - return GetNtupleRow(fFirstId); + return GetNtupleRow(fFirstId); } diff --git a/source/analysis/management/src/G4BinScheme.cc b/source/analysis/management/src/G4BinScheme.cc index 865c598b14..5f06840f19 100644 --- a/source/analysis/management/src/G4BinScheme.cc +++ b/source/analysis/management/src/G4BinScheme.cc @@ -27,6 +27,7 @@ // Author: Ivana Hrivnacova, 22/08/2013 (ivana@ipno.in2p3.fr) #include "G4BinScheme.hh" +#include "G4AnalysisUtilities.hh" namespace G4Analysis { @@ -36,23 +37,20 @@ G4BinScheme GetBinScheme(const G4String& binSchemeName) { G4BinScheme binScheme = G4BinScheme::kLinear; if ( binSchemeName != "linear" ) { - if ( binSchemeName == "log" ) + if ( binSchemeName == "log" ) binScheme = G4BinScheme::kLog; else { // There is no name associated with G4BinScheme::kUser - G4ExceptionDescription description; - description - << " \"" << binSchemeName << "\" binning scheme is not supported." << G4endl - << " " << "Linear binning will be applied."; - G4Exception("G4Analysis::GetBinScheme", - "Analysis_W013", JustWarning, description); - } + Warn("\"" + binSchemeName + "\" binning scheme is not supported.\n" + "Linear binning will be applied.", + kNamespaceName, "GetBinScheme"); + } } - return binScheme; + return binScheme; } //_____________________________________________________________________________ -void ComputeEdges(G4int nbins, G4double xmin, G4double xmax, +void ComputeEdges(G4int nbins, G4double xmin, G4double xmax, G4double unit, G4Fcn fcn, G4BinScheme binScheme, std::vector& edges) { @@ -69,10 +67,10 @@ void ComputeEdges(G4int nbins, G4double xmin, G4double xmax, edges.push_back(binValue); binValue += dx; } - } + } else if ( binScheme == G4BinScheme::kLog ) { - // do not apply fcn - auto dlog + // do not apply fcn + auto dlog = (std::log10(xumax) - std::log10(xumin))/ nbins; auto dx = std::pow(10, dlog); auto binValue = xumin; @@ -81,21 +79,18 @@ void ComputeEdges(G4int nbins, G4double xmin, G4double xmax, binValue *= dx; } } - else if ( binScheme == G4BinScheme::kUser ) { + else if ( binScheme == G4BinScheme::kUser ) { // This should never happen, but let's make sure about it // by issuing a warning - G4ExceptionDescription description; - description - << " User binning scheme setting was ignored." << G4endl - << " Linear binning will be applied with given (nbins, xmin, xmax) values"; - G4Exception("G4Analysis::ComputeEdges", - "Analysis_W013", JustWarning, description); - } -} + Warn("User binning scheme setting was ignored.\n" + "Linear binning will be applied with given (nbins, xmin, xmax) values", + kNamespaceName, "GetBinScheme"); + } +} //_____________________________________________________________________________ -void ComputeEdges(const std::vector& edges, - G4double unit, G4Fcn fcn, +void ComputeEdges(const std::vector& edges, + G4double unit, G4Fcn fcn, std::vector& newBins) { // Apply function to defined edges @@ -104,5 +99,5 @@ void ComputeEdges(const std::vector& edges, newBins.push_back(fcn(element/unit)); } } - + } diff --git a/source/analysis/management/src/G4Fcn.cc b/source/analysis/management/src/G4Fcn.cc index 14efda368a..1ad2cc949e 100644 --- a/source/analysis/management/src/G4Fcn.cc +++ b/source/analysis/management/src/G4Fcn.cc @@ -27,6 +27,7 @@ // Author: Ivana Hrivnacova, 22/08/2013 (ivana@ipno.in2p3.fr) #include "G4Fcn.hh" +#include "G4AnalysisUtilities.hh" namespace G4Analysis { @@ -40,15 +41,13 @@ G4Fcn GetFunction(const G4String& fcnName) else if ( fcnName == "log10") fcn = std::log10; else if ( fcnName == "exp" ) fcn = std::exp; else { - G4ExceptionDescription description; - description - << " \"" << fcnName << "\" function is not supported." << G4endl - << " " << "No function will be applied to histogram values."; - G4Exception("G4Analysis::GetFunction", - "Analysis_W013", JustWarning, description); - } + Warn( + "\"" + fcnName + "\" function is not supported.\n" + + "No function will be applied to histogram values.", + kNamespaceName, "GetFunction"); + } } - return fcn; + return fcn; } - + } diff --git a/source/analysis/management/src/G4FileMessenger.cc b/source/analysis/management/src/G4FileMessenger.cc index 08b6fe4997..898b1fb379 100644 --- a/source/analysis/management/src/G4FileMessenger.cc +++ b/source/analysis/management/src/G4FileMessenger.cc @@ -38,30 +38,26 @@ using namespace G4Analysis; //_____________________________________________________________________________ G4FileMessenger::G4FileMessenger(G4VAnalysisManager* manager) : G4UImessenger(), - fManager(manager), - fSetFileNameCmd(nullptr), - fSetHistoDirNameCmd(nullptr), - fSetNtupleDirNameCmd(nullptr) -{ - fSetFileNameCmd = G4Analysis::make_unique("/analysis/setFileName",this); + fManager(manager) +{ + fSetFileNameCmd = std::make_unique("/analysis/setFileName",this); fSetFileNameCmd->SetGuidance("Set name for the histograms & ntuple file"); fSetFileNameCmd->SetParameterName("Filename", false); fSetFileNameCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - - fSetHistoDirNameCmd = G4Analysis::make_unique("/analysis/setHistoDirName",this); + + fSetHistoDirNameCmd = std::make_unique("/analysis/setHistoDirName",this); fSetHistoDirNameCmd->SetGuidance("Set name for the histograms directory"); fSetHistoDirNameCmd->SetParameterName("HistoDirName", false); fSetHistoDirNameCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - - fSetNtupleDirNameCmd = G4Analysis::make_unique("/analysis/setNtupleDirName",this); + + fSetNtupleDirNameCmd = std::make_unique("/analysis/setNtupleDirName",this); fSetNtupleDirNameCmd->SetGuidance("Set name for the ntuple directory"); fSetNtupleDirNameCmd->SetParameterName("NtupleDirName", false); fSetNtupleDirNameCmd->AvailableForStates(G4State_PreInit, G4State_Idle); } //_____________________________________________________________________________ -G4FileMessenger::~G4FileMessenger() -{} +G4FileMessenger::~G4FileMessenger() = default; // // public functions @@ -72,11 +68,11 @@ void G4FileMessenger::SetNewValue(G4UIcommand* command, G4String newValues) if ( command == fSetFileNameCmd.get() ) { G4cout << "Set file name: " << newValues << G4endl; fManager->SetFileName(newValues); - } + } else if ( command == fSetHistoDirNameCmd.get() ) { fManager->SetHistoDirectoryName(newValues); - } + } else if ( command == fSetNtupleDirNameCmd.get() ) { fManager->SetNtupleDirectoryName(newValues); - } -} + } +} diff --git a/source/analysis/management/src/G4H1Messenger.cc b/source/analysis/management/src/G4H1Messenger.cc index cfa2114f58..b901d49c06 100644 --- a/source/analysis/management/src/G4H1Messenger.cc +++ b/source/analysis/management/src/G4H1Messenger.cc @@ -40,7 +40,6 @@ #include "G4UIparameter.hh" #include "G4Tokenizer.hh" -#include #include using namespace G4Analysis; @@ -48,16 +47,9 @@ using namespace G4Analysis; //_____________________________________________________________________________ G4H1Messenger::G4H1Messenger(G4VAnalysisManager* manager) : G4UImessenger(), - fManager(manager), - fHelper(nullptr), - fDirectory(nullptr), - fCreateH1Cmd(nullptr), - fSetH1Cmd(nullptr), - fSetH1TitleCmd(nullptr), - fSetH1XAxisCmd(nullptr), - fSetH1YAxisCmd(nullptr) -{ - fHelper = G4Analysis::make_unique("h1"); + fManager(manager) +{ + fHelper = std::make_unique("h1"); fDirectory = fHelper->CreateHnDirectory(); @@ -75,8 +67,7 @@ G4H1Messenger::G4H1Messenger(G4VAnalysisManager* manager) } //_____________________________________________________________________________ -G4H1Messenger::~G4H1Messenger() -{} +G4H1Messenger::~G4H1Messenger() = default; // // private functions @@ -87,7 +78,7 @@ void G4H1Messenger::CreateH1Cmd() { auto h1Name = new G4UIparameter("name", 's', false); h1Name->SetGuidance("Histogram name (label)"); - + auto h1Title = new G4UIparameter("title", 's', false); h1Title->SetGuidance("Histogram title"); @@ -95,12 +86,12 @@ void G4H1Messenger::CreateH1Cmd() h1Nbins0->SetGuidance("Number of bins (default = 100)"); h1Nbins0->SetGuidance("Can be reset with /analysis/h1/set command"); h1Nbins0->SetDefaultValue(100); - + auto h1ValMin0 = new G4UIparameter("valMin0", 'd', true); h1ValMin0->SetGuidance("Minimum value, expressed in unit (default = 0.)"); h1ValMin0->SetGuidance("Can be reset with /analysis/h1/set command"); h1ValMin0->SetDefaultValue(0.); - + auto h1ValMax0 = new G4UIparameter("valMax0", 'd', true); h1ValMax0->SetGuidance("Maximum value, expressed in unit (default = 1.)"); h1ValMax0->SetGuidance("Can be reset with /analysis/h1/set command"); @@ -109,7 +100,7 @@ void G4H1Messenger::CreateH1Cmd() auto h1ValUnit0 = new G4UIparameter("valUnit0", 's', true); h1ValUnit0->SetGuidance("The unit applied to filled values and valMin0, valMax0"); h1ValUnit0->SetDefaultValue("none"); - + auto h1ValFcn0 = new G4UIparameter("valFcn0", 's', true); G4String fcnGuidance = "The function applied to filled values (log, log10, exp).\n"; fcnGuidance += "Note that the unit parameter cannot be omitted in this case,\n"; @@ -117,17 +108,17 @@ void G4H1Messenger::CreateH1Cmd() h1ValFcn0->SetGuidance(fcnGuidance); h1ValFcn0->SetParameterCandidates("log log10 exp none"); h1ValFcn0->SetDefaultValue("none"); - + auto h1ValBinScheme0 = new G4UIparameter("valBinScheme0", 's', true); G4String binSchemeGuidance = "The binning scheme (linear, log).\n"; h1ValBinScheme0->SetParameterCandidates("linear log"); - binSchemeGuidance + binSchemeGuidance += "Note that the unit and fcn parameters cannot be omitted in this case,\n"; binSchemeGuidance += "but none value should be used instead."; h1ValBinScheme0->SetGuidance(binSchemeGuidance); h1ValBinScheme0->SetDefaultValue("linear"); - - fCreateH1Cmd = G4Analysis::make_unique("/analysis/h1/create", this); + + fCreateH1Cmd = std::make_unique("/analysis/h1/create", this); fCreateH1Cmd->SetGuidance("Create 1D histogram"); fCreateH1Cmd->SetParameter(h1Name); fCreateH1Cmd->SetParameter(h1Title); @@ -138,7 +129,7 @@ void G4H1Messenger::CreateH1Cmd() fCreateH1Cmd->SetParameter(h1ValFcn0); fCreateH1Cmd->SetParameter(h1ValBinScheme0); fCreateH1Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} //_____________________________________________________________________________ @@ -147,16 +138,16 @@ void G4H1Messenger::SetH1Cmd() auto h1Id = new G4UIparameter("id", 'i', false); h1Id->SetGuidance("Histogram id"); h1Id->SetParameterRange("id>=0"); - + auto h1Nbins = new G4UIparameter("nbins", 'i', false); h1Nbins->SetGuidance("Number of bins"); - + auto h1ValMin = new G4UIparameter("valMin", 'd', false); h1ValMin->SetGuidance("Minimum value, expressed in unit"); - + auto h1ValMax = new G4UIparameter("valMax", 'd', false); h1ValMax->SetGuidance("Maximum value, expressed in unit"); - + auto h1ValUnit = new G4UIparameter("valUnit", 's', true); h1ValUnit->SetGuidance("The unit applied to filled values and valMin, valMax"); h1ValUnit->SetDefaultValue("none"); @@ -172,13 +163,13 @@ void G4H1Messenger::SetH1Cmd() auto h1ValBinScheme = new G4UIparameter("valBinScheme", 's', true); h1ValBinScheme->SetParameterCandidates("linear log"); G4String binSchemeGuidance = "The binning scheme (linear, log).\n"; - binSchemeGuidance + binSchemeGuidance += "Note that the unit and fcn parameters cannot be omitted in this case,\n"; binSchemeGuidance += "but none value should be used instead."; h1ValBinScheme->SetGuidance(binSchemeGuidance); h1ValBinScheme->SetDefaultValue("linear"); - - fSetH1Cmd = G4Analysis::make_unique("/analysis/h1/set", this); + + fSetH1Cmd = std::make_unique("/analysis/h1/set", this); fSetH1Cmd->SetGuidance("Set parameters for the 1D histogram of given id:"); fSetH1Cmd->SetGuidance(" nbins; valMin; valMax; unit; function; binScheme"); fSetH1Cmd->SetParameter(h1Id); @@ -189,7 +180,7 @@ void G4H1Messenger::SetH1Cmd() fSetH1Cmd->SetParameter(h1ValFcn); fSetH1Cmd->SetParameter(h1ValBinScheme); fSetH1Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} // // public functions @@ -206,18 +197,18 @@ void G4H1Messenger::SetNewValue(G4UIcommand* command, G4String newValues) // Should never happen but let's check anyway for consistency fHelper->WarnAboutParameters(command, parameters.size()); return; - } + } - if ( command == fCreateH1Cmd.get() ) { + if ( command == fCreateH1Cmd.get() ) { auto counter = 0; auto name = parameters[counter++]; auto title = parameters[counter++]; G4AnalysisMessengerHelper::BinData xdata; fHelper->GetBinData(xdata, parameters, counter); auto unit = GetUnitValue(xdata.fSunit); - fManager->CreateH1(name, title, - xdata.fNbins, xdata.fVmin*unit, xdata.fVmax*unit, - xdata.fSunit, xdata.fSfcn, xdata.fSbinScheme); + fManager->CreateH1(name, title, + xdata.fNbins, xdata.fVmin*unit, xdata.fVmax*unit, + xdata.fSunit, xdata.fSfcn, xdata.fSbinScheme); } else if ( command == fSetH1Cmd.get() ) { auto counter = 0; @@ -225,9 +216,9 @@ void G4H1Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::BinData xdata; fHelper->GetBinData(xdata, parameters, counter); auto unit = GetUnitValue(xdata.fSunit); - fManager->SetH1(id, - xdata.fNbins, xdata.fVmin*unit, xdata.fVmax*unit, - xdata.fSunit, xdata.fSfcn, xdata.fSbinScheme); + fManager->SetH1(id, + xdata.fNbins, xdata.fVmin*unit, xdata.fVmax*unit, + xdata.fSunit, xdata.fSfcn, xdata.fSbinScheme); } else if ( command == fSetH1XCmd.get() ) { auto counter = 0; @@ -235,27 +226,27 @@ void G4H1Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::BinData xdata; fHelper->GetBinData(xdata, parameters, counter); auto unit = GetUnitValue(xdata.fSunit); - fManager->SetH1(id, - xdata.fNbins, xdata.fVmin*unit, xdata.fVmax*unit, - xdata.fSunit, xdata.fSfcn, xdata.fSbinScheme); + fManager->SetH1(id, + xdata.fNbins, xdata.fVmin*unit, xdata.fVmax*unit, + xdata.fSunit, xdata.fSfcn, xdata.fSbinScheme); } else if ( command == fSetH1TitleCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto title = parameters[counter++]; - fManager->SetH1Title(id, title); + fManager->SetH1Title(id, title); } else if ( command == fSetH1XAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto xaxis = parameters[counter++]; - fManager->SetH1XAxisTitle(id, xaxis); + fManager->SetH1XAxisTitle(id, xaxis); } else if ( command == fSetH1YAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto yaxis = parameters[counter++]; - fManager->SetH1YAxisTitle(id, yaxis); + fManager->SetH1YAxisTitle(id, yaxis); } else if ( command == fSetH1XAxisLogCmd.get() ) { auto counter = 0; diff --git a/source/analysis/management/src/G4H2Messenger.cc b/source/analysis/management/src/G4H2Messenger.cc index c4422e3913..79283f4ea6 100644 --- a/source/analysis/management/src/G4H2Messenger.cc +++ b/source/analysis/management/src/G4H2Messenger.cc @@ -28,33 +28,19 @@ #include "G4H2Messenger.hh" #include "G4VAnalysisManager.hh" -#include "G4AnalysisUtilities.hh" #include "G4UIdirectory.hh" #include "G4UIcommand.hh" #include "G4UIparameter.hh" -#include - using namespace G4Analysis; //_____________________________________________________________________________ G4H2Messenger::G4H2Messenger(G4VAnalysisManager* manager) : G4UImessenger(), - fManager(manager), - fHelper(nullptr), - fDirectory(nullptr), - fCreateH2Cmd(nullptr), - fSetH2Cmd(nullptr), - fSetH2XCmd(nullptr), - fSetH2YCmd(nullptr), - fSetH2TitleCmd(nullptr), - fSetH2XAxisCmd(nullptr), - fSetH2YAxisCmd(nullptr), - fXId(-1), - fXData() -{ - fHelper = G4Analysis::make_unique("h2"); + fManager(manager) +{ + fHelper = std::make_unique("h2"); fDirectory = fHelper->CreateHnDirectory(); @@ -63,7 +49,7 @@ G4H2Messenger::G4H2Messenger(G4VAnalysisManager* manager) SetH2Cmd(); fSetH2XCmd = fHelper->CreateSetBinsCommand("x", this); fSetH2YCmd = fHelper->CreateSetBinsCommand("y", this); - + fSetH2TitleCmd = fHelper->CreateSetTitleCommand(this); fSetH2XAxisCmd = fHelper->CreateSetAxisCommand("x", this); fSetH2YAxisCmd = fHelper->CreateSetAxisCommand("y", this); @@ -74,8 +60,7 @@ G4H2Messenger::G4H2Messenger(G4VAnalysisManager* manager) } //_____________________________________________________________________________ -G4H2Messenger::~G4H2Messenger() -{} +G4H2Messenger::~G4H2Messenger() = default; // // private functions @@ -86,7 +71,7 @@ void G4H2Messenger::CreateH2Cmd() { auto h2Name = new G4UIparameter("name", 's', false); h2Name->SetGuidance("Histogram name (label)"); - + auto h2Title = new G4UIparameter("title", 's', false); h2Title->SetGuidance("Histogram title"); @@ -94,12 +79,12 @@ void G4H2Messenger::CreateH2Cmd() h2xNbins0->SetGuidance("Number of x-bins (default = 100)"); h2xNbins0->SetGuidance("Can be reset with /analysis/h2/set command"); h2xNbins0->SetDefaultValue(100); - + auto h2xValMin0 = new G4UIparameter("xvalMin0", 'd', true); h2xValMin0->SetGuidance("Minimum x-value, expressed in unit (default = 0.)"); h2xValMin0->SetGuidance("Can be reset with /analysis/h2/set command"); h2xValMin0->SetDefaultValue(0.); - + auto h2xValMax0 = new G4UIparameter("xvalMax0", 'd', true); h2xValMax0->SetGuidance("Maximum x-value, expressed in unit (default = 1.)"); h2xValMax0->SetGuidance("Can be reset with /analysis/h2/set command"); @@ -108,29 +93,29 @@ void G4H2Messenger::CreateH2Cmd() auto h2xValUnit0 = new G4UIparameter("xvalUnit0", 's', true); h2xValUnit0->SetGuidance("The unit applied to filled x-values and xvalMin0, xvalMax0"); h2xValUnit0->SetDefaultValue("none"); - + auto h2xValFcn0 = new G4UIparameter("xvalFcn0", 's', true); G4String fcnxGuidance = "The function applied to filled x-values (log, log10, exp, none)."; h2xValFcn0->SetGuidance(fcnxGuidance); h2xValFcn0->SetParameterCandidates("log log10 exp none"); h2xValFcn0->SetDefaultValue("none"); - + auto h2xValBinScheme0 = new G4UIparameter("xvalBinScheme0", 's', true); G4String xbinSchemeGuidance = "The binning scheme (linear, log)."; h2xValBinScheme0->SetParameterCandidates("linear log"); h2xValBinScheme0->SetGuidance(xbinSchemeGuidance); h2xValBinScheme0->SetDefaultValue("linear"); - + auto h2yNbins0 = new G4UIparameter("ynbins0", 'i', true); h2yNbins0->SetGuidance("Number of y-bins (default = 100)"); h2yNbins0->SetGuidance("Can be reset with /analysis/h2/set command"); h2yNbins0->SetDefaultValue(100); - + auto h2yValMin0 = new G4UIparameter("yvalMin0", 'd', true); h2yValMin0->SetGuidance("Minimum y-value, expressed in unit (default = 0.)"); h2yValMin0->SetGuidance("Can be reset with /analysis/h2/set command"); h2yValMin0->SetDefaultValue(0.); - + auto h2yValMax0 = new G4UIparameter("yvalMax0", 'd', true); h2yValMax0->SetGuidance("Maximum y-value, expressed in unit (default = 1.)"); h2yValMax0->SetGuidance("Can be reset with /analysis/h2/set command"); @@ -139,7 +124,7 @@ void G4H2Messenger::CreateH2Cmd() auto h2yValUnit0 = new G4UIparameter("yvalUnit0", 's', true); h2yValUnit0->SetGuidance("The unit applied to filled y-values and yvalMin0, yvalMax0"); h2yValUnit0->SetDefaultValue("none"); - + auto h2yValFcn0 = new G4UIparameter("yvalFcn0", 's', true); G4String fcnyGuidance = "The function applied to filled y-values (log, log10, exp, none)."; h2yValFcn0->SetGuidance(fcnyGuidance); @@ -151,8 +136,8 @@ void G4H2Messenger::CreateH2Cmd() h2yValBinScheme0->SetParameterCandidates("linear log"); h2yValBinScheme0->SetGuidance(ybinSchemeGuidance); h2yValBinScheme0->SetDefaultValue("linear"); - - fCreateH2Cmd = G4Analysis::make_unique("/analysis/h2/create", this); + + fCreateH2Cmd = std::make_unique("/analysis/h2/create", this); fCreateH2Cmd->SetGuidance("Create 2D histogram"); fCreateH2Cmd->SetParameter(h2Name); fCreateH2Cmd->SetParameter(h2Title); @@ -169,7 +154,7 @@ void G4H2Messenger::CreateH2Cmd() fCreateH2Cmd->SetParameter(h2yValFcn0); fCreateH2Cmd->SetParameter(h2yValBinScheme0); fCreateH2Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} //_____________________________________________________________________________ @@ -178,58 +163,58 @@ void G4H2Messenger::SetH2Cmd() auto h2Id = new G4UIparameter("id", 'i', false); h2Id->SetGuidance("Histogram id"); h2Id->SetParameterRange("id>=0"); - + auto h2xNbins = new G4UIparameter("xnbins", 'i', false); h2xNbins->SetGuidance("Number of x-bins"); - + auto h2xValMin = new G4UIparameter("xvalMin", 'd', false); h2xValMin->SetGuidance("Minimum x-value, expressed in unit"); - + auto h2xValMax = new G4UIparameter("xvalMax", 'd', false); h2xValMax->SetGuidance("Maximum x-value, expressed in unit"); - + auto h2xValUnit = new G4UIparameter("xvalUnit", 's', false); h2xValUnit->SetGuidance("The unit applied to filled x-values and xvalMin, xvalMax"); h2xValUnit->SetDefaultValue("none"); - + auto h2xValFcn = new G4UIparameter("xvalFcn", 's', false); h2xValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnxGuidance = "The function applied to filled x-values (log, log10, exp, none)."; h2xValFcn->SetGuidance(fcnxGuidance); h2xValFcn->SetDefaultValue("none"); - + auto h2xValBinScheme = new G4UIparameter("xvalBinScheme", 's', true); G4String xbinSchemeGuidance = "The binning scheme (linear, log)."; h2xValBinScheme->SetParameterCandidates("linear log"); h2xValBinScheme->SetGuidance(xbinSchemeGuidance); h2xValBinScheme->SetDefaultValue("linear"); - + auto h2yNbins = new G4UIparameter("nybins", 'i', false); h2yNbins->SetGuidance("Number of y-bins"); - + auto h2yValMin = new G4UIparameter("yvalMin", 'd', false); h2yValMin->SetGuidance("Minimum y-value, expressed in unit"); - + auto h2yValMax = new G4UIparameter("yvalMax", 'd', false); h2yValMax->SetGuidance("Maximum y-value, expressed in unit"); - + auto h2yValUnit = new G4UIparameter("yvalUnit", 's', true); h2yValUnit->SetGuidance("The unit applied to filled y-values and yvalMin, yvalMax"); h2yValUnit->SetDefaultValue("none"); - + auto h2yValFcn = new G4UIparameter("yvalFcn", 's', false); h2yValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnyGuidance = "The function applied to filled y-values (log, log10, exp, none)."; h2yValFcn->SetGuidance(fcnyGuidance); h2yValFcn->SetDefaultValue("none"); - + auto h2yValBinScheme = new G4UIparameter("yvalBinScheme", 's', true); G4String ybinSchemeGuidance = "The binning scheme (linear, log)."; h2yValBinScheme->SetParameterCandidates("linear log"); h2yValBinScheme->SetGuidance(ybinSchemeGuidance); h2yValBinScheme->SetDefaultValue("linear"); - fSetH2Cmd = G4Analysis::make_unique("/analysis/h2/set", this); + fSetH2Cmd = std::make_unique("/analysis/h2/set", this); fSetH2Cmd->SetGuidance("Set parameters for the 2D histogram of given id:"); fSetH2Cmd->SetGuidance(" nxbins; xvalMin; xvalMax; xunit; xfunction; xbinScheme"); fSetH2Cmd->SetGuidance(" nybins; yvalMin; yvalMax; yunit; yfunction; ybinScheme"); @@ -247,7 +232,7 @@ void G4H2Messenger::SetH2Cmd() fSetH2Cmd->SetParameter(h2yValFcn); fSetH2Cmd->SetParameter(h2yValBinScheme); fSetH2Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} // @@ -265,9 +250,9 @@ void G4H2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) // Should never happen but let's check anyway for consistency fHelper->WarnAboutParameters(command, parameters.size()); return; - } + } - if ( command == fCreateH2Cmd.get() ) { + if ( command == fCreateH2Cmd.get() ) { auto counter = 0; auto name = parameters[counter++]; auto title = parameters[counter++]; @@ -277,14 +262,14 @@ void G4H2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::BinData ydata; fHelper->GetBinData(ydata, parameters, counter); auto yunit = GetUnitValue(ydata.fSunit); - fManager->CreateH2(name, title, - xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, - ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, - xdata.fSunit, ydata.fSunit, - xdata.fSfcn, ydata.fSfcn, - xdata.fSbinScheme, ydata.fSbinScheme); + fManager->CreateH2(name, title, + xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, + ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, + xdata.fSunit, ydata.fSunit, + xdata.fSfcn, ydata.fSfcn, + xdata.fSbinScheme, ydata.fSbinScheme); } - else if ( command == fSetH2Cmd.get() ) { + else if ( command == fSetH2Cmd.get() ) { auto counter = 0; auto id = G4UIcommand::ConvertToInt(parameters[counter++]); G4AnalysisMessengerHelper::BinData xdata; @@ -293,20 +278,20 @@ void G4H2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::BinData ydata; fHelper->GetBinData(ydata, parameters, counter); auto yunit = GetUnitValue(ydata.fSunit); - fManager->SetH2(id, - xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, - ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, - xdata.fSunit, ydata.fSunit, - xdata.fSfcn, ydata.fSfcn, - xdata.fSbinScheme, ydata.fSbinScheme); + fManager->SetH2(id, + xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, + ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, + xdata.fSunit, ydata.fSunit, + xdata.fSfcn, ydata.fSfcn, + xdata.fSbinScheme, ydata.fSbinScheme); } - else if ( command == fSetH2XCmd.get() ) { + else if ( command == fSetH2XCmd.get() ) { // Only save values auto counter = 0; fXId = G4UIcommand::ConvertToInt(parameters[counter++]); fHelper->GetBinData(fXData, parameters, counter); } - else if ( command == fSetH2YCmd.get() ) { + else if ( command == fSetH2YCmd.get() ) { // Check if setX command was called auto counter = 0; auto id = G4UIcommand::ConvertToInt(parameters[counter++]); @@ -318,37 +303,37 @@ void G4H2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::BinData ydata; fHelper->GetBinData(ydata, parameters, counter); auto yunit = GetUnitValue(ydata.fSunit); - fManager->SetH2(id, + fManager->SetH2(id, fXData.fNbins, fXData.fVmin*xunit, fXData.fVmax*xunit, - ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, - fXData.fSunit, ydata.fSunit, - fXData.fSfcn, ydata.fSfcn, - fXData.fSbinScheme, ydata.fSbinScheme); - fXId = -1; + ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, + fXData.fSunit, ydata.fSunit, + fXData.fSfcn, ydata.fSfcn, + fXData.fSbinScheme, ydata.fSbinScheme); + fXId = -1; } - else if ( command == fSetH2TitleCmd.get() ) { + else if ( command == fSetH2TitleCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto title = parameters[counter++]; - fManager->SetH2Title(id, title); + fManager->SetH2Title(id, title); } - else if ( command == fSetH2XAxisCmd.get() ) { + else if ( command == fSetH2XAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto xaxis = parameters[counter++]; - fManager->SetH2XAxisTitle(id, xaxis); + fManager->SetH2XAxisTitle(id, xaxis); } - else if ( command == fSetH2YAxisCmd.get() ) { + else if ( command == fSetH2YAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto yaxis = parameters[counter++]; - fManager->SetH2YAxisTitle(id, yaxis); + fManager->SetH2YAxisTitle(id, yaxis); } - else if ( command == fSetH2ZAxisCmd.get() ) { + else if ( command == fSetH2ZAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto zaxis = parameters[counter++]; - fManager->SetH2ZAxisTitle(id, zaxis); + fManager->SetH2ZAxisTitle(id, zaxis); } else if ( command == fSetH2XAxisLogCmd.get() ) { auto counter = 0; diff --git a/source/analysis/management/src/G4H3Messenger.cc b/source/analysis/management/src/G4H3Messenger.cc index 59f2b81e40..c936d2e0bd 100644 --- a/source/analysis/management/src/G4H3Messenger.cc +++ b/source/analysis/management/src/G4H3Messenger.cc @@ -28,37 +28,19 @@ #include "G4H3Messenger.hh" #include "G4VAnalysisManager.hh" -#include "G4AnalysisUtilities.hh" #include "G4UIdirectory.hh" #include "G4UIcommand.hh" #include "G4UIparameter.hh" -#include - using namespace G4Analysis; //_____________________________________________________________________________ G4H3Messenger::G4H3Messenger(G4VAnalysisManager* manager) : G4UImessenger(), - fManager(manager), - fHelper(nullptr), - fDirectory(nullptr), - fCreateH3Cmd(nullptr), - fSetH3Cmd(nullptr), - fSetH3XCmd(nullptr), - fSetH3YCmd(nullptr), - fSetH3ZCmd(nullptr), - fSetH3TitleCmd(nullptr), - fSetH3XAxisCmd(nullptr), - fSetH3YAxisCmd(nullptr), - fSetH3ZAxisCmd(nullptr), - fXId(-1), - fYId(-1), - fXData(), - fYData() -{ - fHelper = G4Analysis::make_unique("h3"); + fManager(manager) +{ + fHelper = std::make_unique("h3"); fDirectory = fHelper->CreateHnDirectory(); @@ -67,7 +49,7 @@ G4H3Messenger::G4H3Messenger(G4VAnalysisManager* manager) SetH3Cmd(); fSetH3XCmd = fHelper->CreateSetBinsCommand("x", this); fSetH3YCmd = fHelper->CreateSetBinsCommand("y", this); - + fSetH3TitleCmd = fHelper->CreateSetTitleCommand(this); fSetH3XAxisCmd = fHelper->CreateSetAxisCommand("x", this); fSetH3YAxisCmd = fHelper->CreateSetAxisCommand("y", this); @@ -78,8 +60,7 @@ G4H3Messenger::G4H3Messenger(G4VAnalysisManager* manager) } //_____________________________________________________________________________ -G4H3Messenger::~G4H3Messenger() -{} +G4H3Messenger::~G4H3Messenger() = default; // // private functions @@ -90,7 +71,7 @@ void G4H3Messenger::CreateH3Cmd() { auto h3Name = new G4UIparameter("name", 's', false); h3Name->SetGuidance("Histogram name (label)"); - + auto h3Title = new G4UIparameter("title", 's', false); h3Title->SetGuidance("Histogram title"); @@ -98,12 +79,12 @@ void G4H3Messenger::CreateH3Cmd() h3xNbins0->SetGuidance("Number of x-bins (default = 100)"); h3xNbins0->SetGuidance("Can be reset with /analysis/h3/set command"); h3xNbins0->SetDefaultValue(100); - + auto h3xValMin0 = new G4UIparameter("xvalMin0", 'd', true); h3xValMin0->SetGuidance("Minimum x-value, expressed in unit (default = 0.)"); h3xValMin0->SetGuidance("Can be reset with /analysis/h3/set command"); h3xValMin0->SetDefaultValue(0.); - + auto h3xValMax0 = new G4UIparameter("xvalMax0", 'd', true); h3xValMax0->SetGuidance("Maximum x-value, expressed in unit (default = 1.)"); h3xValMax0->SetGuidance("Can be reset with /analysis/h3/set command"); @@ -112,29 +93,29 @@ void G4H3Messenger::CreateH3Cmd() auto h3xValUnit0 = new G4UIparameter("xvalUnit0", 's', true); h3xValUnit0->SetGuidance("The unit applied to filled x-values and xvalMin0, xvalMax0"); h3xValUnit0->SetDefaultValue("none"); - + auto h3xValFcn0 = new G4UIparameter("xvalFcn0", 's', true); G4String fcnxGuidance = "The function applied to filled x-values (log, log10, exp, none)."; h3xValFcn0->SetGuidance(fcnxGuidance); h3xValFcn0->SetParameterCandidates("log log10 exp none"); h3xValFcn0->SetDefaultValue("none"); - + auto h3xValBinScheme0 = new G4UIparameter("xvalBinScheme0", 's', true); G4String xbinSchemeGuidance = "The binning scheme (linear, log)."; h3xValBinScheme0->SetParameterCandidates("linear log"); h3xValBinScheme0->SetGuidance(xbinSchemeGuidance); h3xValBinScheme0->SetDefaultValue("linear"); - + auto h3yNbins0 = new G4UIparameter("ynbins0", 'i', true); h3yNbins0->SetGuidance("Number of y-bins (default = 100)"); h3yNbins0->SetGuidance("Can be reset with /analysis/h3/set command"); h3yNbins0->SetDefaultValue(100); - + auto h3yValMin0 = new G4UIparameter("yvalMin0", 'd', true); h3yValMin0->SetGuidance("Minimum y-value, expressed in unit (default = 0.)"); h3yValMin0->SetGuidance("Can be reset with /analysis/h3/set command"); h3yValMin0->SetDefaultValue(0.); - + auto h3yValMax0 = new G4UIparameter("yvalMax0", 'd', true); h3yValMax0->SetGuidance("Maximum y-value, expressed in unit (default = 1.)"); h3yValMax0->SetGuidance("Can be reset with /analysis/h3/set command"); @@ -143,7 +124,7 @@ void G4H3Messenger::CreateH3Cmd() auto h3yValUnit0 = new G4UIparameter("yvalUnit0", 's', true); h3yValUnit0->SetGuidance("The unit applied to filled y-values and yvalMin0, yvalMax0"); h3yValUnit0->SetDefaultValue("none"); - + auto h3yValFcn0 = new G4UIparameter("yvalFcn0", 's', true); G4String fcnyGuidance = "The function applied to filled y-values (log, log10, exp, none)."; h3yValFcn0->SetGuidance(fcnyGuidance); @@ -155,17 +136,17 @@ void G4H3Messenger::CreateH3Cmd() h3yValBinScheme0->SetParameterCandidates("linear log"); h3yValBinScheme0->SetGuidance(ybinSchemeGuidance); h3yValBinScheme0->SetDefaultValue("linear"); - + auto h3zNbins0 = new G4UIparameter("znbins0", 'i', true); h3zNbins0->SetGuidance("Number of z-bins (default = 100)"); h3zNbins0->SetGuidance("Can be reset with /analysis/h3/set command"); h3zNbins0->SetDefaultValue(100); - + auto h3zValMin0 = new G4UIparameter("zvalMin0", 'd', true); h3zValMin0->SetGuidance("Minimum z-value, expressed in unit (default = 0.)"); h3zValMin0->SetGuidance("Can be reset with /analysis/h3/set command"); h3zValMin0->SetDefaultValue(0.); - + auto h3zValMax0 = new G4UIparameter("zvalMax0", 'd', true); h3zValMax0->SetGuidance("Maximum z-value, expressed in unit (default = 1.)"); h3zValMax0->SetGuidance("Can be reset with /analysis/h3/set command"); @@ -174,7 +155,7 @@ void G4H3Messenger::CreateH3Cmd() auto h3zValUnit0 = new G4UIparameter("zvalUnit0", 's', true); h3zValUnit0->SetGuidance("The unit applied to filled z-values and zvalMin0, zvalMax0"); h3zValUnit0->SetDefaultValue("none"); - + auto h3zValFcn0 = new G4UIparameter("zvalFcn0", 's', true); G4String fcnzGuidance = "The function applied to filled z-values (log, log10, exp, none)."; h3zValFcn0->SetGuidance(fcnzGuidance); @@ -186,8 +167,8 @@ void G4H3Messenger::CreateH3Cmd() h3zValBinScheme0->SetParameterCandidates("linear log"); h3zValBinScheme0->SetGuidance(zbinSchemeGuidance); h3zValBinScheme0->SetDefaultValue("linear"); - - fCreateH3Cmd = G4Analysis::make_unique("/analysis/h3/create", this); + + fCreateH3Cmd = std::make_unique("/analysis/h3/create", this); fCreateH3Cmd->SetGuidance("Create 3D histogram"); fCreateH3Cmd->SetParameter(h3Name); fCreateH3Cmd->SetParameter(h3Title); @@ -210,7 +191,7 @@ void G4H3Messenger::CreateH3Cmd() fCreateH3Cmd->SetParameter(h3zValFcn0); fCreateH3Cmd->SetParameter(h3zValBinScheme0); fCreateH3Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} //_____________________________________________________________________________ @@ -219,83 +200,83 @@ void G4H3Messenger::SetH3Cmd() auto h3Id = new G4UIparameter("id", 'i', false); h3Id->SetGuidance("Histogram id"); h3Id->SetParameterRange("id>=0"); - + auto h3xNbins = new G4UIparameter("xnbins", 'i', false); h3xNbins->SetGuidance("Number of x-bins"); - + auto h3xValMin = new G4UIparameter("xvalMin", 'd', false); h3xValMin->SetGuidance("Minimum x-value, expressed in unit"); - + auto h3xValMax = new G4UIparameter("xvalMax", 'd', false); h3xValMax->SetGuidance("Maximum x-value, expressed in unit"); - + auto h3xValUnit = new G4UIparameter("xvalUnit", 's', false); h3xValUnit->SetGuidance("The unit applied to filled x-values and xvalMin0, xvalMax0"); h3xValUnit->SetDefaultValue("none"); - + auto h3xValFcn = new G4UIparameter("xvalFcn", 's', false); h3xValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnxGuidance = "The function applied to filled x-values (log, log10, exp, none)."; h3xValFcn->SetGuidance(fcnxGuidance); h3xValFcn->SetDefaultValue("none"); - + auto h3xValBinScheme = new G4UIparameter("xvalBinScheme", 's', true); G4String xbinSchemeGuidance = "The binning scheme (linear, log)."; h3xValBinScheme->SetParameterCandidates("linear log"); h3xValBinScheme->SetGuidance(xbinSchemeGuidance); h3xValBinScheme->SetDefaultValue("linear"); - + auto h3yNbins = new G4UIparameter("nybins", 'i', false); h3yNbins->SetGuidance("Number of y-bins"); - + auto h3yValMin = new G4UIparameter("yvalMin", 'd', false); h3yValMin->SetGuidance("Minimum y-value, expressed in unit"); - + auto h3yValMax = new G4UIparameter("yvalMax", 'd', false); h3yValMax->SetGuidance("Maximum y-value, expressed in unit"); - + auto h3yValUnit = new G4UIparameter("yvalUnit", 's', true); h3yValUnit->SetGuidance("The unit applied to filled y-values and yvalMin0, yvalMax0"); h3yValUnit->SetDefaultValue("none"); - + auto h3yValFcn = new G4UIparameter("yvalFcn", 's', false); h3yValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnyGuidance = "The function applied to filled y-values (log, log10, exp, none)."; h3yValFcn->SetGuidance(fcnyGuidance); h3yValFcn->SetDefaultValue("none"); - + auto h3yValBinScheme = new G4UIparameter("yvalBinScheme", 's', true); G4String ybinSchemeGuidance = "The binning scheme (linear, log)."; h3yValBinScheme->SetParameterCandidates("linear log"); h3yValBinScheme->SetGuidance(ybinSchemeGuidance); h3yValBinScheme->SetDefaultValue("linear"); - + auto h3zNbins = new G4UIparameter("nzbins", 'i', false); h3zNbins->SetGuidance("Number of z-bins"); - + auto h3zValMin = new G4UIparameter("zvalMin", 'd', false); h3zValMin->SetGuidance("Minimum z-value, expressed in unit"); - + auto h3zValMax = new G4UIparameter("zvalMax", 'd', false); h3zValMax->SetGuidance("Maximum z-value, expressed in unit"); - + auto h3zValUnit = new G4UIparameter("zvalUnit", 's', true); h3zValUnit->SetGuidance("The unit applied to filled z-values and zvalMin0, zvalMax0"); h3zValUnit->SetDefaultValue("none"); - + auto h3zValFcn = new G4UIparameter("zvalFcn", 's', false); h3zValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnzGuidance = "The function applied to filled z-values (log, log10, exp, none)."; h3zValFcn->SetGuidance(fcnzGuidance); h3zValFcn->SetDefaultValue("none"); - + auto h3zValBinScheme = new G4UIparameter("zvalBinScheme", 's', true); G4String zbinSchemeGuidance = "The binning scheme (linear, log)."; h3zValBinScheme->SetParameterCandidates("linear log"); h3zValBinScheme->SetGuidance(zbinSchemeGuidance); h3zValBinScheme->SetDefaultValue("linear"); - - fSetH3Cmd = G4Analysis::make_unique("/analysis/h3/set", this); + + fSetH3Cmd = std::make_unique("/analysis/h3/set", this); fSetH3Cmd->SetGuidance("Set parameters for the 3D histogram of given id:"); fSetH3Cmd->SetGuidance(" nxbins; xvalMin; xvalMax; xunit; xfunction; xbinScheme"); fSetH3Cmd->SetGuidance(" nybins; yvalMin; yvalMax; yunit; yfunction; ybinScheme"); @@ -320,7 +301,7 @@ void G4H3Messenger::SetH3Cmd() fSetH3Cmd->SetParameter(h3zValFcn); fSetH3Cmd->SetParameter(h3zValBinScheme); fSetH3Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} // @@ -338,9 +319,9 @@ void G4H3Messenger::SetNewValue(G4UIcommand* command, G4String newValues) // Should never happen but let's check anyway for consistency fHelper->WarnAboutParameters(command, parameters.size()); return; - } + } - if ( command == fCreateH3Cmd.get() ) { + if ( command == fCreateH3Cmd.get() ) { auto counter = 0; auto name = parameters[counter++]; auto title = parameters[counter++]; @@ -353,15 +334,15 @@ void G4H3Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::BinData zdata; fHelper->GetBinData(zdata, parameters, counter); auto zunit = GetUnitValue(zdata.fSunit); - fManager->CreateH3(name, title, - xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, - ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, - zdata.fNbins, zdata.fVmin*zunit, zdata.fVmax*zunit, + fManager->CreateH3(name, title, + xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, + ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, + zdata.fNbins, zdata.fVmin*zunit, zdata.fVmax*zunit, xdata.fSunit, ydata.fSunit, zdata.fSunit, xdata.fSfcn, ydata.fSfcn, zdata.fSfcn, - xdata.fSbinScheme, ydata.fSbinScheme, zdata.fSbinScheme); + xdata.fSbinScheme, ydata.fSbinScheme, zdata.fSbinScheme); } - else if ( command == fSetH3Cmd.get() ) { + else if ( command == fSetH3Cmd.get() ) { auto counter = 0; auto id = G4UIcommand::ConvertToInt(parameters[counter++]); G4AnalysisMessengerHelper::BinData xdata; @@ -373,31 +354,31 @@ void G4H3Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::BinData zdata; fHelper->GetBinData(zdata, parameters, counter); auto zunit = GetUnitValue(zdata.fSunit); - fManager->SetH3(id, - xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, - ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, - zdata.fNbins, zdata.fVmin*zunit, zdata.fVmax*zunit, + fManager->SetH3(id, + xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, + ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, + zdata.fNbins, zdata.fVmin*zunit, zdata.fVmax*zunit, xdata.fSunit, ydata.fSunit, zdata.fSunit, xdata.fSfcn, ydata.fSfcn, zdata.fSfcn, - xdata.fSbinScheme, ydata.fSbinScheme, zdata.fSbinScheme); + xdata.fSbinScheme, ydata.fSbinScheme, zdata.fSbinScheme); } - else if ( command == fSetH3XCmd.get() ) { + else if ( command == fSetH3XCmd.get() ) { // Only save values auto counter = 0; fXId = G4UIcommand::ConvertToInt(parameters[counter++]); fHelper->GetBinData(fXData, parameters, counter); } - else if ( command == fSetH3YCmd.get() ) { + else if ( command == fSetH3YCmd.get() ) { // Only save values auto counter = 0; fYId = G4UIcommand::ConvertToInt(parameters[counter++]); fHelper->GetBinData(fYData, parameters, counter); } - else if ( command == fSetH3ZCmd.get() ) { + else if ( command == fSetH3ZCmd.get() ) { auto counter = 0; auto id = G4UIcommand::ConvertToInt(parameters[counter++]); // Check if setX and setY command was called - if ( fXId == -1 || fXId != id || + if ( fXId == -1 || fXId != id || fYId == -1 || fYId != id ) { fHelper->WarnAboutSetCommands(); return; @@ -407,39 +388,39 @@ void G4H3Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::BinData zdata; fHelper->GetBinData(zdata, parameters, counter); auto zunit = GetUnitValue(zdata.fSunit); - fManager->SetH3(id, + fManager->SetH3(id, fXData.fNbins, fXData.fVmin*xunit, fXData.fVmax*xunit, fYData.fNbins, fYData.fVmin*yunit, fYData.fVmax*yunit, - zdata.fNbins, zdata.fVmin*zunit, zdata.fVmax*zunit, - fXData.fSunit, fYData.fSunit, zdata.fSunit, + zdata.fNbins, zdata.fVmin*zunit, zdata.fVmax*zunit, + fXData.fSunit, fYData.fSunit, zdata.fSunit, fXData.fSfcn, fYData.fSfcn, zdata.fSfcn, - fXData.fSbinScheme, fYData.fSbinScheme, zdata.fSbinScheme); - fXId = -1; - fYId = -1; + fXData.fSbinScheme, fYData.fSbinScheme, zdata.fSbinScheme); + fXId = -1; + fYId = -1; } - else if ( command == fSetH3TitleCmd.get() ) { + else if ( command == fSetH3TitleCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto title = parameters[counter++]; - fManager->SetH3Title(id, title); + fManager->SetH3Title(id, title); } - else if ( command == fSetH3XAxisCmd.get() ) { + else if ( command == fSetH3XAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto xaxis = parameters[counter++]; - fManager->SetH3XAxisTitle(id, xaxis); + fManager->SetH3XAxisTitle(id, xaxis); } - else if ( command == fSetH3YAxisCmd.get() ) { + else if ( command == fSetH3YAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto yaxis = parameters[counter++]; - fManager->SetH3YAxisTitle(id, yaxis); + fManager->SetH3YAxisTitle(id, yaxis); } - else if ( command == fSetH3ZAxisCmd.get() ) { + else if ( command == fSetH3ZAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto zaxis = parameters[counter++]; - fManager->SetH3ZAxisTitle(id, zaxis); + fManager->SetH3ZAxisTitle(id, zaxis); } else if ( command == fSetH3XAxisLogCmd.get() ) { auto counter = 0; diff --git a/source/analysis/management/src/G4HnManager.cc b/source/analysis/management/src/G4HnManager.cc index 775c25f4a3..452061a52c 100644 --- a/source/analysis/management/src/G4HnManager.cc +++ b/source/analysis/management/src/G4HnManager.cc @@ -31,20 +31,14 @@ #include "G4AnalysisUtilities.hh" using namespace G4Analysis; +using std::to_string; //_____________________________________________________________________________ G4HnManager::G4HnManager(const G4String& hnType, const G4AnalysisManagerState& state) : G4BaseAnalysisManager(state), - fHnType(hnType), - fNofActiveObjects(0), - fNofAsciiObjects(0), - fNofPlottingObjects(0), - fNofFileNameObjects(0), - fHnVector(), - fFileManager(nullptr) -{ -} + fHnType(hnType) +{} //_____________________________________________________________________________ G4HnManager::~G4HnManager() @@ -99,12 +93,9 @@ void G4HnManager::SetFileName(G4HnInformation* info, const G4String& fileName) if (fFileManager) { fFileManager->AddFileName(fileName); } else { - G4ExceptionDescription description; - description - << "Failed to set fileName " << fileName << " for object " << info->GetName() << G4endl - << "File manager is not set."; - G4Exception("G4HnManager::SetFileName", - "Analysis_W012", JustWarning, description); + Warn("Failed to set fileName " + fileName + + " for object " + info->GetName() + ".\nFile manager is not set.", + fkClass, "SetFileName"); return; } @@ -115,7 +106,7 @@ void G4HnManager::SetFileName(G4HnInformation* info, const G4String& fileName) } } -// +// // public methods // @@ -127,34 +118,37 @@ G4HnInformation* G4HnManager::AddHnInformation(const G4String& name, G4int nofD ++fNofActiveObjects; return info; -} +} //_____________________________________________________________________________ -G4HnInformation* G4HnManager::GetHnInformation(G4int id, - G4String functionName, G4bool warn) const +void G4HnManager::ClearData() +{ + for ( auto info : fHnVector ) { + delete info; + } + fHnVector.clear(); + SetLockFirstId(false); +} + +//_____________________________________________________________________________ +G4HnInformation* G4HnManager::GetHnInformation(G4int id, + std::string_view functionName, G4bool warn) const { G4int index = id - fFirstId; if ( index < 0 || index >= G4int(fHnVector.size()) ) { if ( warn ) { - G4String inFunction = "G4HnManager::"; - if ( functionName.size() ) - inFunction += functionName; - else - inFunction += "GetHnInformation"; - G4ExceptionDescription description; - description << " " << fHnType << " histogram " << id - << " does not exist."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); - } - return nullptr; + Warn(fHnType + " histogram " + to_string(id) + " does not exist.", + fkClass, functionName); + } + return nullptr; } return fHnVector[index]; -} +} //_____________________________________________________________________________ -G4HnDimensionInformation* G4HnManager::GetHnDimensionInformation(G4int id, +G4HnDimensionInformation* G4HnManager::GetHnDimensionInformation(G4int id, G4int dimension, - G4String functionName, G4bool warn) const + std::string_view functionName, G4bool warn) const { auto info = GetHnInformation(id, functionName, warn); if ( ! info ) return nullptr; @@ -166,19 +160,19 @@ G4HnDimensionInformation* G4HnManager::GetHnDimensionInformation(G4int id, G4bool G4HnManager::IsActive() const { return ( fNofActiveObjects > 0 ); -} +} //_____________________________________________________________________________ G4bool G4HnManager::IsAscii() const { return ( fNofAsciiObjects > 0 ); -} +} //_____________________________________________________________________________ G4bool G4HnManager::IsPlotting() const { return ( fNofPlottingObjects > 0 ); -} +} //_____________________________________________________________________________ G4bool G4HnManager::IsFileName() const @@ -196,7 +190,7 @@ void G4HnManager::SetActivation(G4int id, G4bool activation) if ( ! info ) return; SetActivation(info, activation); -} +} //_____________________________________________________________________________ void G4HnManager::SetActivation(G4bool activation) @@ -221,14 +215,14 @@ void G4HnManager::SetAscii(G4int id, G4bool ascii) // Do nothing if ascii does not change if ( info->GetAscii() == ascii ) return; - + // Change ascii and account it in fNofAsciiObjects info->SetAscii(ascii); - if ( ascii ) + if ( ascii ) fNofAsciiObjects++; else - fNofAsciiObjects--; -} + fNofAsciiObjects--; +} //_____________________________________________________________________________ void G4HnManager::SetPlotting(G4int id, G4bool plotting) @@ -258,7 +252,7 @@ void G4HnManager::SetFileName(G4int id, const G4String& fileName) if ( ! info ) return; SetFileName(info, fileName); -} +} //_____________________________________________________________________________ void G4HnManager::SetFileName(const G4String& fileName) @@ -268,7 +262,7 @@ void G4HnManager::SetFileName(const G4String& fileName) for ( auto info : fHnVector ) { SetFileName(info, fileName); } -} +} //_____________________________________________________________________________ G4bool G4HnManager::SetXAxisIsLog(G4int id, G4bool isLog) @@ -309,9 +303,9 @@ G4String G4HnManager::GetName(G4int id) const auto info = GetHnInformation(id, "GetName"); if ( ! info ) return ""; - + return info->GetName(); -} +} //_____________________________________________________________________________ G4double G4HnManager::GetXUnit(G4int id) const @@ -319,9 +313,9 @@ G4double G4HnManager::GetXUnit(G4int id) const auto info = GetHnDimensionInformation(id, kX, "GetXUnit"); if ( ! info ) return 1.0; - + return info->fUnit; -} +} //_____________________________________________________________________________ G4double G4HnManager::GetYUnit(G4int id) const @@ -329,9 +323,9 @@ G4double G4HnManager::GetYUnit(G4int id) const auto info = GetHnDimensionInformation(id, kY, "GetYUnit"); if ( ! info ) return 1.0; - + return info->fUnit; -} +} //_____________________________________________________________________________ G4double G4HnManager::GetZUnit(G4int id) const @@ -339,9 +333,9 @@ G4double G4HnManager::GetZUnit(G4int id) const auto info = GetHnDimensionInformation(id, kZ, "GetZUnit"); if ( ! info ) return 1.0; - + return info->fUnit; -} +} //_____________________________________________________________________________ G4bool G4HnManager::GetXAxisIsLog(G4int id) const @@ -349,9 +343,9 @@ G4bool G4HnManager::GetXAxisIsLog(G4int id) const auto info = GetHnInformation(id, "GetXAxisIsLog"); if ( ! info ) return false; - + return info->GetIsLogAxis(kX); -} +} //_____________________________________________________________________________ G4bool G4HnManager::GetYAxisIsLog(G4int id) const @@ -359,9 +353,9 @@ G4bool G4HnManager::GetYAxisIsLog(G4int id) const auto info = GetHnInformation(id, "GetYAxisIsLog"); if ( ! info ) return 1.0; - + return info->GetIsLogAxis(kY); -} +} //_____________________________________________________________________________ G4bool G4HnManager::GetZAxisIsLog(G4int id) const @@ -369,9 +363,9 @@ G4bool G4HnManager::GetZAxisIsLog(G4int id) const auto info = GetHnInformation(id, "GetZAxisIsLog"); if ( ! info ) return 1.0; - + return info->GetIsLogAxis(kZ); -} +} //_____________________________________________________________________________ G4bool G4HnManager::GetActivation(G4int id) const @@ -379,9 +373,9 @@ G4bool G4HnManager::GetActivation(G4int id) const auto info = GetHnInformation(id, "GetActivation"); if ( ! info ) return true; - + return info->GetActivation(); -} +} //_____________________________________________________________________________ G4bool G4HnManager::GetAscii(G4int id) const @@ -389,9 +383,9 @@ G4bool G4HnManager::GetAscii(G4int id) const auto info = GetHnInformation(id, "GetAscii"); if ( ! info ) return false; - + return info->GetAscii(); -} +} //_____________________________________________________________________________ G4bool G4HnManager::GetPlotting(G4int id) const @@ -399,7 +393,7 @@ G4bool G4HnManager::GetPlotting(G4int id) const auto info = GetHnInformation(id, "GetPlotting"); if ( ! info ) return false; - + return info->GetPlotting(); } @@ -409,6 +403,6 @@ G4String G4HnManager::GetFileName(G4int id) const auto info = GetHnInformation(id, "GetFileName"); if ( ! info ) return ""; - + return info->GetFileName(); } diff --git a/source/analysis/management/src/G4HnMessenger.cc b/source/analysis/management/src/G4HnMessenger.cc index d89f18bb57..eee1806255 100644 --- a/source/analysis/management/src/G4HnMessenger.cc +++ b/source/analysis/management/src/G4HnMessenger.cc @@ -39,23 +39,12 @@ using namespace G4Analysis; -#include - G4HnMessenger::G4HnMessenger(G4HnManager& manager) : G4UImessenger(), - fManager(manager), - fHelper(nullptr), - fSetHnAsciiCmd(nullptr), - fSetHnActivationCmd(nullptr), - fSetHnActivationAllCmd(nullptr), - fSetHnPlottingCmd(nullptr), - fSetHnPlottingAllCmd(nullptr), - fSetHnFileNameCmd(nullptr), - fSetHnFileNameAllCmd(nullptr) -{ - G4String hnType = fManager.GetHnType(); - hnType.toLower(); - fHelper = G4Analysis::make_unique(hnType); + fManager(manager) +{ + G4String hnType = G4StrUtil::to_lower_copy(fManager.GetHnType()); + fHelper = std::make_unique(hnType); SetHnAsciiCmd(); SetHnActivationCmd(); @@ -67,8 +56,7 @@ G4HnMessenger::G4HnMessenger(G4HnManager& manager) } //_____________________________________________________________________________ -G4HnMessenger::~G4HnMessenger() -{} +G4HnMessenger::~G4HnMessenger() = default; // // private functions @@ -78,7 +66,7 @@ G4HnMessenger::~G4HnMessenger() void G4HnMessenger::SetHnAsciiCmd() { fSetHnAsciiCmd - = G4Analysis::make_unique(fHelper->Update("/analysis/HNTYPE_/setAscii"), this); + = std::make_unique(fHelper->Update("/analysis/HNTYPE_/setAscii"), this); fSetHnAsciiCmd->SetGuidance( fHelper->Update("Print NDIM_D LOBJECT of given id on ascii file.")); @@ -98,25 +86,25 @@ void G4HnMessenger::SetHnActivationCmd() hnActivation->SetGuidance(fHelper->Update("OBJECT activation")); hnActivation->SetDefaultValue("none"); - fSetHnActivationCmd - = G4Analysis::make_unique(fHelper->Update("/analysis/HNTYPE_/setActivation"), this); + fSetHnActivationCmd + = std::make_unique(fHelper->Update("/analysis/HNTYPE_/setActivation"), this); fSetHnActivationCmd->SetGuidance( fHelper->Update("Set activation for the NDIM_D LOBJECT of given id")); fSetHnActivationCmd->SetParameter(hnId); fSetHnActivationCmd->SetParameter(hnActivation); fSetHnActivationCmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} //_____________________________________________________________________________ void G4HnMessenger::SetHnActivationToAllCmd() { - fSetHnActivationAllCmd - = G4Analysis::make_unique(fHelper->Update("/analysis/HNTYPE_/setActivationToAll"), this); + fSetHnActivationAllCmd + = std::make_unique(fHelper->Update("/analysis/HNTYPE_/setActivationToAll"), this); fSetHnActivationAllCmd->SetGuidance( fHelper->Update("Set activation to all NDIM_D LOBJECTs")); fSetHnActivationAllCmd->SetParameterName("Activation",false); -} - +} + //_____________________________________________________________________________ void G4HnMessenger::SetHnPlottingCmd() { @@ -128,24 +116,24 @@ void G4HnMessenger::SetHnPlottingCmd() hnPlotting->SetGuidance(fHelper->Update("(In)Activate OBJECT plotting")); hnPlotting->SetDefaultValue("none"); - fSetHnPlottingCmd - = G4Analysis::make_unique(fHelper->Update("/analysis/HNTYPE_/setPlotting"), this); + fSetHnPlottingCmd + = std::make_unique(fHelper->Update("/analysis/HNTYPE_/setPlotting"), this); fSetHnPlottingCmd->SetGuidance( fHelper->Update("(In)Activate batch plotting of the NDIM_D LOBJECT of given id")); fSetHnPlottingCmd->SetParameter(hnId); fSetHnPlottingCmd->SetParameter(hnPlotting); fSetHnPlottingCmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} //_____________________________________________________________________________ void G4HnMessenger::SetHnPlottingToAllCmd() { - fSetHnPlottingAllCmd - = G4Analysis::make_unique(fHelper->Update("/analysis/HNTYPE_/setPlottingToAll"), this); + fSetHnPlottingAllCmd + = std::make_unique(fHelper->Update("/analysis/HNTYPE_/setPlottingToAll"), this); fSetHnPlottingAllCmd->SetGuidance( fHelper->Update("(In)Activate batch plotting of all NDIM_D LOBJECTs")); fSetHnPlottingAllCmd->SetParameterName("Plotting",false); -} +} //_____________________________________________________________________________ void G4HnMessenger::SetHnFileNameCmd() @@ -159,7 +147,7 @@ void G4HnMessenger::SetHnFileNameCmd() hnFileName->SetDefaultValue("none"); fSetHnFileNameCmd - = G4Analysis::make_unique(fHelper->Update("/analysis/HNTYPE_/setFileName"), this); + = std::make_unique(fHelper->Update("/analysis/HNTYPE_/setFileName"), this); fSetHnFileNameCmd->SetGuidance( fHelper->Update("Set the NDIM_D LOBJECT of given id output file name")); fSetHnFileNameCmd->SetParameter(hnId); @@ -171,7 +159,7 @@ void G4HnMessenger::SetHnFileNameCmd() void G4HnMessenger::SetHnFileNameToAllCmd() { fSetHnFileNameAllCmd - = G4Analysis::make_unique(fHelper->Update("/analysis/HNTYPE_/setFileNameToAll"), this); + = std::make_unique(fHelper->Update("/analysis/HNTYPE_/setFileNameToAll"), this); fSetHnFileNameAllCmd->SetGuidance( fHelper->Update("Set output file name for all NDIM_D LOBJECTs")); fSetHnFileNameAllCmd->SetParameterName("FileName",false); @@ -224,7 +212,7 @@ void G4HnMessenger::SetNewValue(G4UIcommand* command, G4String newValues) fHelper->WarnAboutParameters(command, parameters.size()); } } - else if ( command == fSetHnPlottingAllCmd.get() ) { + else if ( command == fSetHnPlottingAllCmd.get() ) { auto activation = fSetHnPlottingAllCmd->GetNewBoolValue(newValues); fManager.SetPlotting(activation); } diff --git a/source/analysis/management/src/G4NtupleBookingManager.cc b/source/analysis/management/src/G4NtupleBookingManager.cc index 0d0d5a1616..8706817a77 100644 --- a/source/analysis/management/src/G4NtupleBookingManager.cc +++ b/source/analysis/management/src/G4NtupleBookingManager.cc @@ -31,6 +31,7 @@ #include "G4AnalysisUtilities.hh" using namespace G4Analysis; +using std::to_string; // // private template functions @@ -39,38 +40,31 @@ using namespace G4Analysis; //_____________________________________________________________________________ G4NtupleBookingManager::G4NtupleBookingManager( const G4AnalysisManagerState& state) - : G4BaseAnalysisManager(state), - fNtupleBookingVector(), - fFileType(), - fFirstNtupleColumnId(0), - fLockFirstNtupleColumnId(false) + : G4BaseAnalysisManager(state) {} //_____________________________________________________________________________ G4NtupleBookingManager::~G4NtupleBookingManager() -{ +{ for ( auto ntupleBooking : fNtupleBookingVector ) { delete ntupleBooking; - } + } } //_____________________________________________________________________________ G4NtupleBooking* G4NtupleBookingManager::GetNtupleBookingInFunction( - G4int id, G4String functionName, G4bool warn) const -{ + G4int id, std::string_view functionName, G4bool warn) const +{ auto index = id - fFirstId; if ( index < 0 || index >= G4int(fNtupleBookingVector.size()) ) { if ( warn) { - G4String inFunction = "G4NtupleBookingManager::"; - inFunction += functionName; - G4ExceptionDescription description; - description << " " << "ntuple booking " << id << " does not exist."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); + Warn("Ntuple booking " + to_string(id) + " does not exist.", + fkClass, functionName); } - return nullptr; + return nullptr; } - + return fNtupleBookingVector[index]; } @@ -82,16 +76,13 @@ G4NtupleBookingManager::GetNtupleBookingInFunction( G4bool G4NtupleBookingManager::IsEmpty() const { return ! fNtupleBookingVector.size(); -} - +} + //_____________________________________________________________________________ G4int G4NtupleBookingManager::CreateNtuple( const G4String& name, const G4String& title) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "ntuple booking", name); -#endif + Message(kVL4, "create", "ntuple booking", name); // Create ntuple description auto index = fNtupleBookingVector.size(); @@ -106,19 +97,14 @@ G4int G4NtupleBookingManager::CreateNtuple( // Create ntuple fLockFirstId = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - G4ExceptionDescription description; - description << name << " ntupleId " << ntupleBooking->fNtupleId; - fState.GetVerboseL2()->Message("create", "ntuple booking", description); - } -#endif + Message(kVL2, "create", "ntuple booking", + name + " ntupleId " + to_string(ntupleBooking->fNtupleId)); return ntupleBooking->fNtupleId; -} +} //_____________________________________________________________________________ -G4int G4NtupleBookingManager::CreateNtupleIColumn(const G4String& name, +G4int G4NtupleBookingManager::CreateNtupleIColumn(const G4String& name, std::vector* vector) { return CreateNtupleIColumn(GetCurrentNtupleId(), name, vector); @@ -139,9 +125,10 @@ G4int G4NtupleBookingManager::CreateNtupleDColumn(const G4String& name, } //_____________________________________________________________________________ -G4int G4NtupleBookingManager::CreateNtupleSColumn(const G4String& name) +G4int G4NtupleBookingManager::CreateNtupleSColumn(const G4String& name, + std::vector* vector) { - return CreateNtupleSColumn(GetCurrentNtupleId(), name); + return CreateNtupleSColumn(GetCurrentNtupleId(), name, vector); } //_____________________________________________________________________________ @@ -155,50 +142,47 @@ G4int G4NtupleBookingManager::CreateNtupleIColumn( G4int ntupleId, const G4String& name, std::vector* vector) { return CreateNtupleTColumn(ntupleId, name, vector); -} +} //_____________________________________________________________________________ G4int G4NtupleBookingManager::CreateNtupleFColumn( G4int ntupleId, const G4String& name, std::vector* vector) { return CreateNtupleTColumn(ntupleId, name, vector); -} +} //_____________________________________________________________________________ G4int G4NtupleBookingManager::CreateNtupleDColumn( G4int ntupleId, const G4String& name, std::vector* vector) { return CreateNtupleTColumn(ntupleId, name, vector); -} +} //_____________________________________________________________________________ G4int G4NtupleBookingManager::CreateNtupleSColumn( - G4int ntupleId, const G4String& name) + G4int ntupleId, const G4String& name, std::vector* vector) { - return CreateNtupleTColumn(ntupleId, name, nullptr); -} + return CreateNtupleTColumn(ntupleId, name, vector); +} //_____________________________________________________________________________ G4NtupleBooking* G4NtupleBookingManager::FinishNtuple( G4int ntupleId) -{ +{ // Nothing to be done for booking, return GetNtupleBookingInFunction(ntupleId, "FinishNtuple"); } //_____________________________________________________________________________ -G4bool G4NtupleBookingManager::SetFirstNtupleColumnId(G4int firstId) -{ +G4bool G4NtupleBookingManager::SetFirstNtupleColumnId(G4int firstId) +{ if ( fLockFirstNtupleColumnId ) { - G4ExceptionDescription description; - description - << "Cannot set FirstNtupleColumnId as its value was already used."; - G4Exception("G4BaseNtupleManager::SetFirstNtupleColumnId()", - "Analysis_W013", JustWarning, description); + Warn("Cannot set FirstNtupleColumnId as its value was already used.", + fkClass, "SetFirstNtupleColumnId"); return false; - } + } - fFirstNtupleColumnId = firstId; + fFirstNtupleColumnId = firstId; return true; } @@ -208,14 +192,14 @@ void G4NtupleBookingManager::SetActivation( { for ( auto ntupleBooking : fNtupleBookingVector ) { ntupleBooking->fActivation = activation; - } + } } //_____________________________________________________________________________ void G4NtupleBookingManager::SetActivation( G4int ntupleId, G4bool activation) { - auto ntupleBooking + auto ntupleBooking = GetNtupleBookingInFunction(ntupleId, "SetActivation"); if ( ! ntupleBooking ) return; @@ -226,7 +210,7 @@ void G4NtupleBookingManager::SetActivation( G4bool G4NtupleBookingManager::GetActivation( G4int ntupleId) const { - auto ntupleBooking + auto ntupleBooking = GetNtupleBookingInFunction(ntupleId, "GetActivation"); if ( ! ntupleBooking ) return false; @@ -259,11 +243,8 @@ void G4NtupleBookingManager::SetFileName( // Check if valid extension (if present) auto output = G4Analysis::GetOutput(extension); if ( output == G4AnalysisOutput::kNone ) { - G4ExceptionDescription description; - description - << "The file extension " << extension << "is not supported."; - G4Exception("G4NtupleBookingManager::SetFileName", - "Analysis_W051", JustWarning, description); + Warn("The file extension " + extension + " is not supported.", + fkClass, "SetFileName"); return; } } @@ -291,6 +272,18 @@ G4String G4NtupleBookingManager::GetFileName( return ntupleBooking->fFileName; } +//_____________________________________________________________________________ +void G4NtupleBookingManager::ClearData() +{ + for ( auto ntupleBooking : fNtupleBookingVector ) { + delete ntupleBooking; + } + fNtupleBookingVector.clear(); + fLockFirstNtupleColumnId = false; + + Message(G4Analysis::kVL2, "clear", "ntupleBookings"); +} + // // public methods // @@ -316,15 +309,10 @@ void G4NtupleBookingManager::SetFileType(const G4String& fileType) // multiple file types are not suported auto baseFileName = GetBaseName(ntupleBooking->fFileName); auto ntupleFileName = baseFileName + "." + fFileType; - if ( extension.size()) { - G4ExceptionDescription description; - description - << "Writing ntuples in files of different output types " - << fFileType << ", " << extension << " is not supported." << G4endl - << "Ntuple " << ntupleBooking->fNtupleBooking.name() - << " will be written in " << ntupleFileName; - G4Exception("G4NtupleBookingManager::SetFileType", - "Analysis_W051", JustWarning, description); + if ( extension.size() ) { + Warn("Writing ntuples in files of different output types " + + fFileType + ", " + extension + " is not supported.", + fkClass, "SetFileType"); } // Save the info in ntuple description diff --git a/source/analysis/management/src/G4NtupleMessenger.cc b/source/analysis/management/src/G4NtupleMessenger.cc index aeedb8dff8..3454c324af 100644 --- a/source/analysis/management/src/G4NtupleMessenger.cc +++ b/source/analysis/management/src/G4NtupleMessenger.cc @@ -35,22 +35,20 @@ #include "G4UIcmdWithABool.hh" #include "G4UIcmdWithAString.hh" -#include - using namespace G4Analysis; +using std::to_string; namespace { -void WrongParametersException( - const G4String& commandName, std::size_t got, std::size_t expected) +//_____________________________________________________________________________ +void WrongParametersWarning( + const G4String& commandName, std::size_t got, std::size_t expected, + std::string_view className) { - G4ExceptionDescription description; - description - << "Got wrong number of \"" << commandName - << "\" parameters: " << got << " instead of " << expected - << " expected" << G4endl; - G4Exception("G4NtupleMessenger::SetNewValue", - "Analysis_W013", JustWarning, description); + Warn( + "Got wrong number of \"" + commandName + "\" parameters: " + + to_string(got) + " instead of " + to_string(expected) + " expected", + className, "SetNewValue"); } } @@ -58,15 +56,11 @@ void WrongParametersException( //_____________________________________________________________________________ G4NtupleMessenger::G4NtupleMessenger(G4VAnalysisManager* manager) : G4UImessenger(), - fManager(manager), - fSetActivationCmd(nullptr), - fSetActivationAllCmd(nullptr), - fSetFileNameCmd(nullptr), - fSetFileNameAllCmd(nullptr) + fManager(manager) { - fNtupleDir = G4Analysis::make_unique("/analysis/ntuple/"); + fNtupleDir = std::make_unique("/analysis/ntuple/"); fNtupleDir->SetGuidance("ntuple control"); - + SetActivationCmd(); SetActivationToAllCmd(); SetFileNameCmd(); @@ -74,9 +68,7 @@ G4NtupleMessenger::G4NtupleMessenger(G4VAnalysisManager* manager) } //_____________________________________________________________________________ -G4NtupleMessenger::~G4NtupleMessenger() -{ -} +G4NtupleMessenger::~G4NtupleMessenger() = default; // // public functions @@ -93,25 +85,25 @@ void G4NtupleMessenger::SetActivationCmd() ntupleActivation->SetGuidance("Ntuple activation"); ntupleActivation->SetDefaultValue("none"); - fSetActivationCmd = G4Analysis::make_unique("/analysis/ntuple/setActivation", this); + fSetActivationCmd = std::make_unique("/analysis/ntuple/setActivation", this); G4String guidance("Set activation for the ntuple of given id"); fSetActivationCmd->SetGuidance(guidance); fSetActivationCmd->SetParameter(ntupleId); fSetActivationCmd->SetParameter(ntupleActivation); fSetActivationCmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} //_____________________________________________________________________________ void G4NtupleMessenger::SetActivationToAllCmd() { - fSetActivationAllCmd - = G4Analysis::make_unique("/analysis/ntuple/setActivationToAll", this); + fSetActivationAllCmd + = std::make_unique("/analysis/ntuple/setActivationToAll", this); G4String guidance("Set activation to all ntuples"); fSetActivationAllCmd->SetGuidance(guidance); fSetActivationAllCmd->SetParameterName("AllNtupleActivation",false); -} - +} + //_____________________________________________________________________________ void G4NtupleMessenger::SetFileNameCmd() { @@ -123,7 +115,7 @@ void G4NtupleMessenger::SetFileNameCmd() ntupleFileName->SetGuidance("Ntuple file name"); ntupleFileName->SetDefaultValue("none"); - fSetFileNameCmd = G4Analysis::make_unique("/analysis/ntuple/setFileName", this); + fSetFileNameCmd = std::make_unique("/analysis/ntuple/setFileName", this); G4String guidance("Set file name for the ntuple of given id"); fSetFileNameCmd->SetGuidance(guidance); @@ -136,7 +128,7 @@ void G4NtupleMessenger::SetFileNameCmd() void G4NtupleMessenger::SetFileNameToAllCmd() { fSetFileNameAllCmd - = G4Analysis::make_unique("/analysis/ntuple/setFileNameToAll", this); + = std::make_unique("/analysis/ntuple/setFileNameToAll", this); G4String guidance("Set file name to all ntuples"); fSetFileNameAllCmd->SetGuidance(guidance); fSetFileNameAllCmd->SetParameterName("AllNtupleFileName",false); @@ -158,18 +150,18 @@ void G4NtupleMessenger::SetNewValue(G4UIcommand* command, G4String newValues) auto counter = 0; auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto activation = G4UIcommand::ConvertToBool(parameters[counter++]); - fManager->SetNtupleActivation(id, activation); + fManager->SetNtupleActivation(id, activation); } else { // Should never happen but let's check anyway for consistency - WrongParametersException(command->GetCommandName(), - parameters.size(),command->GetParameterEntries()); - } + WrongParametersWarning(command->GetCommandName(), + parameters.size(),command->GetParameterEntries(), fkClass); + } } else if ( command == fSetActivationAllCmd.get() ) { auto activation = fSetActivationAllCmd->GetNewBoolValue(newValues); fManager->SetNtupleActivation(activation); - } + } else if ( command == fSetFileNameCmd.get() ) { // tokenize parameters in a vector std::vector parameters; @@ -183,8 +175,8 @@ void G4NtupleMessenger::SetNewValue(G4UIcommand* command, G4String newValues) } else { // Should never happen but let's check anyway for consistency - WrongParametersException(command->GetCommandName(), - parameters.size(),command->GetParameterEntries()); + WrongParametersWarning(command->GetCommandName(), + parameters.size(),command->GetParameterEntries(), fkClass); } } else if ( command == fSetFileNameAllCmd.get() ) { diff --git a/source/analysis/management/src/G4P1Messenger.cc b/source/analysis/management/src/G4P1Messenger.cc index 0bafbab632..70583f5adf 100644 --- a/source/analysis/management/src/G4P1Messenger.cc +++ b/source/analysis/management/src/G4P1Messenger.cc @@ -28,31 +28,19 @@ #include "G4P1Messenger.hh" #include "G4VAnalysisManager.hh" -#include "G4AnalysisUtilities.hh" #include "G4UIdirectory.hh" #include "G4UIcommand.hh" #include "G4UIparameter.hh" -#include - using namespace G4Analysis; //_____________________________________________________________________________ G4P1Messenger::G4P1Messenger(G4VAnalysisManager* manager) : G4UImessenger(), - fManager(manager), - fHelper(nullptr), - fDirectory(nullptr), - fCreateP1Cmd(nullptr), - fSetP1Cmd(nullptr), - fSetP1TitleCmd(nullptr), - fSetP1XAxisCmd(nullptr), - fSetP1YAxisCmd(nullptr), - fXId(-1), - fXData() -{ - fHelper = G4Analysis::make_unique("p1"); + fManager(manager) +{ + fHelper = std::make_unique("p1"); fDirectory = fHelper->CreateHnDirectory(); @@ -61,7 +49,7 @@ G4P1Messenger::G4P1Messenger(G4VAnalysisManager* manager) SetP1Cmd(); fSetP1XCmd = fHelper->CreateSetBinsCommand("x", this); fSetP1YCmd = fHelper->CreateSetValuesCommand("y", this); - + fSetP1TitleCmd = fHelper->CreateSetTitleCommand(this); fSetP1XAxisCmd = fHelper->CreateSetAxisCommand("x", this); fSetP1YAxisCmd = fHelper->CreateSetAxisCommand("y", this); @@ -70,8 +58,7 @@ G4P1Messenger::G4P1Messenger(G4VAnalysisManager* manager) } //_____________________________________________________________________________ -G4P1Messenger::~G4P1Messenger() -{} +G4P1Messenger::~G4P1Messenger() = default; // // private functions @@ -82,7 +69,7 @@ void G4P1Messenger::CreateP1Cmd() { auto p1Name = new G4UIparameter("name", 's', false); p1Name->SetGuidance("Profile name (label)"); - + auto p1Title = new G4UIparameter("title", 's', false); p1Title->SetGuidance("Profile title"); @@ -90,12 +77,12 @@ void G4P1Messenger::CreateP1Cmd() p1xNbins0->SetGuidance("Number of x-bins (default = 100)"); p1xNbins0->SetGuidance("Can be reset with /analysis/p1/set command"); p1xNbins0->SetDefaultValue(100); - + auto p1xValMin0 = new G4UIparameter("xvalMin0", 'd', true); p1xValMin0->SetGuidance("Minimum x-value, expressed in unit (default = 0.)"); p1xValMin0->SetGuidance("Can be reset with /analysis/p1/set command"); p1xValMin0->SetDefaultValue(0.); - + auto p1xValMax0 = new G4UIparameter("xvalMax0", 'd', true); p1xValMax0->SetGuidance("Maximum x-value, expressed in unit (default = 1.)"); p1xValMax0->SetGuidance("Can be reset with /analysis/p1/set command"); @@ -104,7 +91,7 @@ void G4P1Messenger::CreateP1Cmd() auto p1xValUnit0 = new G4UIparameter("xvalUnit0", 's', true); p1xValUnit0->SetGuidance("The unit applied to filled x-values and xvalMin0, xvalMax0"); p1xValUnit0->SetDefaultValue("none"); - + auto p1xValFcn0 = new G4UIparameter("xvalFcn0", 's', true); G4String fcnxGuidance = "The function applied to filled x-values (log, log10, exp, none).\n"; fcnxGuidance += "Note that the unit parameter cannot be omitted in this case,\n"; @@ -112,21 +99,21 @@ void G4P1Messenger::CreateP1Cmd() p1xValFcn0->SetGuidance(fcnxGuidance); p1xValFcn0->SetParameterCandidates("log log10 exp none"); p1xValFcn0->SetDefaultValue("none"); - + auto p1xValBinScheme0 = new G4UIparameter("xvalBinScheme0", 's', true); G4String binSchemeGuidance = "The binning scheme (linear, log).\n"; p1xValBinScheme0->SetParameterCandidates("linear log"); - binSchemeGuidance + binSchemeGuidance += "Note that the unit and fcn parameters cannot be omitted in this case,\n"; binSchemeGuidance += "but none value should be used instead."; p1xValBinScheme0->SetGuidance(binSchemeGuidance); p1xValBinScheme0->SetDefaultValue("linear"); - + auto p1yValMin0 = new G4UIparameter("yvalMin0", 'd', true); p1yValMin0->SetGuidance("Minimum y-value, expressed in unit (default = 0.)"); p1yValMin0->SetGuidance("Can be reset with /analysis/p1/set command"); p1yValMin0->SetDefaultValue(0.); - + auto p1yValMax0 = new G4UIparameter("yvalMax0", 'd', true); p1yValMax0->SetGuidance("Maximum y-value, expressed in unit (default = 1.)"); p1yValMax0->SetGuidance("Can be reset with /analysis/p1/set command"); @@ -135,7 +122,7 @@ void G4P1Messenger::CreateP1Cmd() auto p1yValUnit0 = new G4UIparameter("yvalUnit0", 's', true); p1yValUnit0->SetGuidance("The unit applied to filled y-values and yvalMin0, yvalMax0"); p1yValUnit0->SetDefaultValue("none"); - + auto p1yValFcn0 = new G4UIparameter("yvalFcn0", 's', true); G4String fcnyGuidance = "The function applied to filled y-values (log, log10, exp, none).\n"; fcnyGuidance += "Note that the unit parameter cannot be omitted in this case,\n"; @@ -143,8 +130,8 @@ void G4P1Messenger::CreateP1Cmd() p1yValFcn0->SetGuidance(fcnyGuidance); p1yValFcn0->SetParameterCandidates("log log10 exp none"); p1yValFcn0->SetDefaultValue("none"); - - fCreateP1Cmd = G4Analysis::make_unique("/analysis/p1/create", this); + + fCreateP1Cmd = std::make_unique("/analysis/p1/create", this); fCreateP1Cmd->SetGuidance("Create 1D profile"); fCreateP1Cmd->SetParameter(p1Name); fCreateP1Cmd->SetParameter(p1Title); @@ -159,7 +146,7 @@ void G4P1Messenger::CreateP1Cmd() fCreateP1Cmd->SetParameter(p1yValUnit0); fCreateP1Cmd->SetParameter(p1yValFcn0); fCreateP1Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} //_____________________________________________________________________________ @@ -168,20 +155,20 @@ void G4P1Messenger::SetP1Cmd() auto p1Id = new G4UIparameter("id", 'i', false); p1Id->SetGuidance("Profile id"); p1Id->SetParameterRange("id>=0"); - + auto p1xNbins = new G4UIparameter("xnbins", 'i', false); p1xNbins->SetGuidance("Number of x-bins"); - + auto p1xValMin = new G4UIparameter("xvalMin", 'd', false); p1xValMin->SetGuidance("Minimum x-value, expressed in unit"); - + auto p1xValMax = new G4UIparameter("xvalMax", 'd', false); p1xValMax->SetGuidance("Maximum x-value, expressed in unit"); - + auto p1xValUnit = new G4UIparameter("xvalUnit", 's', true); p1xValUnit->SetGuidance("The unit applied to filled x-values and xvalMin0, xvalMax0"); p1xValUnit->SetDefaultValue("none"); - + auto p1xValFcn = new G4UIparameter("xvalFcn", 's', true); p1xValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnxGuidance = "The function applied to filled x-values (log, log10, exp, none).\n"; @@ -189,26 +176,26 @@ void G4P1Messenger::SetP1Cmd() fcnxGuidance += "but none value should be used instead."; p1xValFcn->SetGuidance(fcnxGuidance); p1xValFcn->SetDefaultValue("none"); - + auto p1xValBinScheme = new G4UIparameter("xvalBinScheme", 's', true); G4String binSchemeGuidance = "The binning scheme (linear, log).\n"; p1xValBinScheme->SetParameterCandidates("linear log"); - binSchemeGuidance + binSchemeGuidance += "Note that the unit and fcn parameters cannot be omitted in this case,\n"; binSchemeGuidance += "but none value should be used instead."; p1xValBinScheme->SetGuidance(binSchemeGuidance); p1xValBinScheme->SetDefaultValue("linear"); - + auto p1yValMin = new G4UIparameter("yvalMin", 'd', true); p1yValMin->SetGuidance("Minimum y-value, expressed in unit"); - + auto p1yValMax = new G4UIparameter("yvalMax", 'd', true); p1yValMax->SetGuidance("Maximum y-value, expressed in unit"); - + auto p1yValUnit = new G4UIparameter("yvalUnit", 's', true); p1yValUnit->SetGuidance("The unit applied to filled y-values and yvalMin0, yvalMax0"); p1yValUnit->SetDefaultValue("none"); - + auto p1yValFcn = new G4UIparameter("yvalFcn", 's', true); p1yValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnyGuidance = "The function applied to filled y-values (log, log10, exp, none).\n"; @@ -216,8 +203,8 @@ void G4P1Messenger::SetP1Cmd() fcnyGuidance += "but none value should be used instead."; p1yValFcn->SetGuidance(fcnyGuidance); p1yValFcn->SetDefaultValue("none"); - - fSetP1Cmd = G4Analysis::make_unique("/analysis/p1/set", this); + + fSetP1Cmd = std::make_unique("/analysis/p1/set", this); fSetP1Cmd->SetGuidance("Set parameters for the 1D profile of given id:"); fSetP1Cmd->SetGuidance(" nbins; xvalMin; xvalMax; xunit; xfunction; xbinScheme"); fSetP1Cmd->SetGuidance(" yvalMin; yvalMax; yunit; yfunction"); @@ -233,7 +220,7 @@ void G4P1Messenger::SetP1Cmd() fSetP1Cmd->SetParameter(p1yValUnit); fSetP1Cmd->SetParameter(p1yValFcn); fSetP1Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} // // public functions @@ -250,9 +237,9 @@ void G4P1Messenger::SetNewValue(G4UIcommand* command, G4String newValues) // Should never happen but let's check anyway for consistency fHelper->WarnAboutParameters(command, parameters.size()); return; - } + } - if ( command == fCreateP1Cmd.get() ) { + if ( command == fCreateP1Cmd.get() ) { auto counter = 0; auto name = parameters[counter++]; auto title = parameters[counter++]; @@ -262,14 +249,14 @@ void G4P1Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::ValueData ydata; fHelper->GetValueData(ydata, parameters, counter); auto yunit = GetUnitValue(ydata.fSunit); - fManager->CreateP1(name, title, - xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, - ydata.fVmin*yunit, ydata.fVmax*yunit, - xdata.fSunit, ydata.fSunit, - xdata.fSfcn, ydata.fSfcn, - xdata.fSbinScheme); + fManager->CreateP1(name, title, + xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, + ydata.fVmin*yunit, ydata.fVmax*yunit, + xdata.fSunit, ydata.fSunit, + xdata.fSfcn, ydata.fSfcn, + xdata.fSbinScheme); } - else if ( command == fSetP1Cmd.get() ) { + else if ( command == fSetP1Cmd.get() ) { auto counter = 0; auto id = G4UIcommand::ConvertToInt(parameters[counter++]); G4AnalysisMessengerHelper::BinData xdata; @@ -278,14 +265,14 @@ void G4P1Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::ValueData ydata; fHelper->GetValueData(ydata, parameters, counter); auto yunit = GetUnitValue(ydata.fSunit); - fManager->SetP1(id, - xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, - ydata.fVmin*yunit, ydata.fVmax*yunit, - xdata.fSunit, ydata.fSunit, - xdata.fSfcn, ydata.fSfcn, - xdata.fSbinScheme); + fManager->SetP1(id, + xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, + ydata.fVmin*yunit, ydata.fVmax*yunit, + xdata.fSunit, ydata.fSunit, + xdata.fSfcn, ydata.fSfcn, + xdata.fSbinScheme); } - else if ( command == fSetP1XCmd.get() ) { + else if ( command == fSetP1XCmd.get() ) { // Save values auto counter = 0; fXId = G4UIcommand::ConvertToInt(parameters[counter++]); @@ -293,14 +280,14 @@ void G4P1Messenger::SetNewValue(G4UIcommand* command, G4String newValues) // Set values // (another set may follow if setY is also called) auto xunit = GetUnitValue(fXData.fSunit); - fManager->SetP1(fXId, - fXData.fNbins, fXData.fVmin*xunit, fXData.fVmax*xunit, - 0., 0., - fXData.fSunit, "none", - fXData.fSfcn, "none", - fXData.fSbinScheme); + fManager->SetP1(fXId, + fXData.fNbins, fXData.fVmin*xunit, fXData.fVmax*xunit, + 0., 0., + fXData.fSunit, "none", + fXData.fSfcn, "none", + fXData.fSbinScheme); } - else if ( command == fSetP1YCmd.get() ) { + else if ( command == fSetP1YCmd.get() ) { // Check if setX command was called auto counter = 0; auto id = G4UIcommand::ConvertToInt(parameters[counter++]); @@ -312,31 +299,31 @@ void G4P1Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::ValueData ydata; fHelper->GetValueData(ydata, parameters, counter); auto yunit = GetUnitValue(ydata.fSunit); - fManager->SetP1(id, + fManager->SetP1(id, fXData.fNbins, fXData.fVmin*xunit, fXData.fVmax*xunit, - ydata.fVmin*yunit, ydata.fVmax*yunit, - fXData.fSunit, ydata.fSunit, - fXData.fSfcn, ydata.fSfcn, - fXData.fSbinScheme); - fXId = -1; + ydata.fVmin*yunit, ydata.fVmax*yunit, + fXData.fSunit, ydata.fSunit, + fXData.fSfcn, ydata.fSfcn, + fXData.fSbinScheme); + fXId = -1; } - else if ( command == fSetP1TitleCmd.get() ) { + else if ( command == fSetP1TitleCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto title = parameters[counter++]; - fManager->SetP1Title(id, title); + fManager->SetP1Title(id, title); } - else if ( command == fSetP1XAxisCmd.get() ) { + else if ( command == fSetP1XAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto xaxis = parameters[counter++]; - fManager->SetP1XAxisTitle(id, xaxis); + fManager->SetP1XAxisTitle(id, xaxis); } - else if ( command == fSetP1YAxisCmd.get() ) { + else if ( command == fSetP1YAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto yaxis = parameters[counter++]; - fManager->SetP1YAxisTitle(id, yaxis); + fManager->SetP1YAxisTitle(id, yaxis); } else if ( command == fSetP1XAxisLogCmd.get() ) { auto counter = 0; diff --git a/source/analysis/management/src/G4P2Messenger.cc b/source/analysis/management/src/G4P2Messenger.cc index 9eb06fbead..ce1ced8f06 100644 --- a/source/analysis/management/src/G4P2Messenger.cc +++ b/source/analysis/management/src/G4P2Messenger.cc @@ -28,36 +28,19 @@ #include "G4P2Messenger.hh" #include "G4VAnalysisManager.hh" -#include "G4AnalysisUtilities.hh" #include "G4UIdirectory.hh" #include "G4UIcommand.hh" #include "G4UIparameter.hh" -#include - using namespace G4Analysis; //_____________________________________________________________________________ G4P2Messenger::G4P2Messenger(G4VAnalysisManager* manager) : G4UImessenger(), - fManager(manager), - fHelper(nullptr), - fDirectory(nullptr), - fCreateP2Cmd(nullptr), - fSetP2Cmd(nullptr), - fSetP2XCmd(nullptr), - fSetP2YCmd(nullptr), - fSetP2ZCmd(nullptr), - fSetP2TitleCmd(nullptr), - fSetP2XAxisCmd(nullptr), - fSetP2YAxisCmd(nullptr), - fXId(-1), - fYId(-1), - fXData(), - fYData() -{ - fHelper = G4Analysis::make_unique("p2"); + fManager(manager) +{ + fHelper = std::make_unique("p2"); fDirectory = fHelper->CreateHnDirectory(); @@ -78,8 +61,7 @@ G4P2Messenger::G4P2Messenger(G4VAnalysisManager* manager) } //_____________________________________________________________________________ -G4P2Messenger::~G4P2Messenger() -{} +G4P2Messenger::~G4P2Messenger() = default; // // private functions @@ -90,7 +72,7 @@ void G4P2Messenger::CreateP2Cmd() { auto p2Name = new G4UIparameter("name", 's', false); p2Name->SetGuidance("Profile name (label)"); - + auto p2Title = new G4UIparameter("title", 's', false); p2Title->SetGuidance("Profile title"); @@ -98,12 +80,12 @@ void G4P2Messenger::CreateP2Cmd() p2xNbins0->SetGuidance("Number of x-bins (default = 100)"); p2xNbins0->SetGuidance("Can be reset with /analysis/p2/set command"); p2xNbins0->SetDefaultValue(100); - + auto p2xValMin0 = new G4UIparameter("xvalMin0", 'd', true); p2xValMin0->SetGuidance("Minimum x-value, expressed in unit (default = 0.)"); p2xValMin0->SetGuidance("Can be reset with /analysis/p2/set command"); p2xValMin0->SetDefaultValue(0.); - + auto p2xValMax0 = new G4UIparameter("xvalMax0", 'd', true); p2xValMax0->SetGuidance("Maximum x-value, expressed in unit (default = 1.)"); p2xValMax0->SetGuidance("Can be reset with /analysis/p2/set command"); @@ -112,29 +94,29 @@ void G4P2Messenger::CreateP2Cmd() auto p2xValUnit0 = new G4UIparameter("xvalUnit0", 's', true); p2xValUnit0->SetGuidance("The unit applied to filled x-values and xvalMin0, xvalMax0"); p2xValUnit0->SetDefaultValue("none"); - + auto p2xValFcn0 = new G4UIparameter("xvalFcn0", 's', true); G4String fcnxGuidance = "The function applied to filled x-values (log, log10, exp, none)."; p2xValFcn0->SetGuidance(fcnxGuidance); p2xValFcn0->SetParameterCandidates("log log10 exp none"); p2xValFcn0->SetDefaultValue("none"); - + auto p2xValBinScheme0 = new G4UIparameter("xvalBinScheme0", 's', true); G4String binSchemeGuidance = "The binning scheme (linear, log)."; p2xValBinScheme0->SetParameterCandidates("linear log"); p2xValBinScheme0->SetGuidance(binSchemeGuidance); p2xValBinScheme0->SetDefaultValue("linear"); - + auto p2yNbins0 = new G4UIparameter("ynbins0", 'i', true); p2yNbins0->SetGuidance("Number of y-bins (default = 100)"); p2yNbins0->SetGuidance("Can be reset with /analysis/p2/set command"); p2yNbins0->SetDefaultValue(100); - + auto p2yValMin0 = new G4UIparameter("yvalMin0", 'd', true); p2yValMin0->SetGuidance("Minimum y-value, expressed in unit (default = 0.)"); p2yValMin0->SetGuidance("Can be reset with /analysis/p2/set command"); p2yValMin0->SetDefaultValue(0.); - + auto p2yValMax0 = new G4UIparameter("yvalMax0", 'd', true); p2yValMax0->SetGuidance("Maximum y-value, expressed in unit (default = 1.)"); p2yValMax0->SetGuidance("Can be reset with /analysis/p2/set command"); @@ -143,23 +125,23 @@ void G4P2Messenger::CreateP2Cmd() auto p2yValUnit0 = new G4UIparameter("yvalUnit0", 's', true); p2yValUnit0->SetGuidance("The unit applied to filled y-values and yvalMin0, yvalMax0"); p2yValUnit0->SetDefaultValue("none"); - + auto p2yValFcn0 = new G4UIparameter("yvalFcn0", 's', true); G4String fcnyGuidance = "The function applied to filled y-values (log, log10, exp, none)."; p2yValFcn0->SetGuidance(fcnyGuidance); p2yValFcn0->SetParameterCandidates("log log10 exp none"); p2yValFcn0->SetDefaultValue("none"); - + auto p2yValBinScheme0 = new G4UIparameter("yvalBinScheme0", 's', true); p2yValBinScheme0->SetParameterCandidates("linear log"); p2yValBinScheme0->SetGuidance(binSchemeGuidance); p2yValBinScheme0->SetDefaultValue("linear"); - + auto p2zValMin0 = new G4UIparameter("zvalMin0", 'd', true); p2zValMin0->SetGuidance("Minimum z-value, expressed in unit (default = 0.)"); p2zValMin0->SetGuidance("Can be reset with /analysis/p2/set command"); p2zValMin0->SetDefaultValue(0.); - + auto p2zValMax0 = new G4UIparameter("zvalMax0", 'd', true); p2zValMax0->SetGuidance("Maximum z-value, expressed in unit (default = 1.)"); p2zValMax0->SetGuidance("Can be reset with /analysis/p2/set command"); @@ -168,14 +150,14 @@ void G4P2Messenger::CreateP2Cmd() auto p2zValUnit0 = new G4UIparameter("zvalUnit0", 's', true); p2zValUnit0->SetGuidance("The unit applied to filled z-values and zvalMin0, zvalMax0"); p2zValUnit0->SetDefaultValue("none"); - + auto p2zValFcn0 = new G4UIparameter("zvalFcn0", 's', true); G4String fcnzGuidance = "The function applied to filled z-values (log, log10, exp, none)."; p2zValFcn0->SetGuidance(fcnzGuidance); p2zValFcn0->SetParameterCandidates("log log10 exp none"); p2zValFcn0->SetDefaultValue("none"); - - fCreateP2Cmd = G4Analysis::make_unique("/analysis/p2/create", this); + + fCreateP2Cmd = std::make_unique("/analysis/p2/create", this); fCreateP2Cmd->SetGuidance("Create 2D profile"); fCreateP2Cmd->SetParameter(p2Name); fCreateP2Cmd->SetParameter(p2Title); @@ -196,7 +178,7 @@ void G4P2Messenger::CreateP2Cmd() fCreateP2Cmd->SetParameter(p2zValUnit0); fCreateP2Cmd->SetParameter(p2zValFcn0); fCreateP2Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} //_____________________________________________________________________________ @@ -205,73 +187,73 @@ void G4P2Messenger::SetP2Cmd() auto p2Id = new G4UIparameter("id", 'i', false); p2Id->SetGuidance("Profile id"); p2Id->SetParameterRange("id>=0"); - + auto p2xNbins = new G4UIparameter("xnbins", 'i', false); p2xNbins->SetGuidance("Number of x-bins"); - + auto p2xValMin = new G4UIparameter("xvalMin", 'd', false); p2xValMin->SetGuidance("Minimum x-value, expressed in unit"); - + auto p2xValMax = new G4UIparameter("xvalMax", 'd', false); p2xValMax->SetGuidance("Maximum x-value, expressed in unit"); - + auto p2xValUnit = new G4UIparameter("xvalUnit", 's', true); p2xValUnit->SetGuidance("The unit applied to filled x-values and xvalMin0, xvalMax0"); p2xValUnit->SetDefaultValue("none"); - + auto p2xValFcn = new G4UIparameter("xvalFcn", 's', true); p2xValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnxGuidance = "The function applied to filled x-values (log, log10, exp, none)."; p2xValFcn->SetGuidance(fcnxGuidance); p2xValFcn->SetDefaultValue("none"); - + auto p2xValBinScheme = new G4UIparameter("xvalBinScheme", 's', true); G4String binSchemeGuidance = "The binning scheme (linear, log)."; p2xValBinScheme->SetParameterCandidates("linear log"); p2xValBinScheme->SetGuidance(binSchemeGuidance); p2xValBinScheme->SetDefaultValue("linear"); - + auto p2yNbins = new G4UIparameter("nybins", 'i', true); p2yNbins->SetGuidance("Number of y-bins"); - + auto p2yValMin = new G4UIparameter("yvalMin", 'd', true); p2yValMin->SetGuidance("Minimum y-value, expressed in unit"); - + auto p2yValMax = new G4UIparameter("yvalMax", 'd', true); p2yValMax->SetGuidance("Maximum y-value, expressed in unit"); - + auto p2yValUnit = new G4UIparameter("yvalUnit", 's', true); p2yValUnit->SetGuidance("The unit applied to filled y-values and yvalMin0, yvalMax0"); p2yValUnit->SetDefaultValue("none"); - + auto p2yValFcn = new G4UIparameter("yvalFcn", 's', true); p2yValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnyGuidance = "The function applied to filled y-values (log, log10, exp, none)."; p2yValFcn->SetGuidance(fcnyGuidance); p2yValFcn->SetDefaultValue("none"); - + auto p2yValBinScheme = new G4UIparameter("yvalBinScheme", 's', true); p2yValBinScheme->SetParameterCandidates("linear log"); p2yValBinScheme->SetGuidance(binSchemeGuidance); p2yValBinScheme->SetDefaultValue("linear"); - + auto p2zValMin = new G4UIparameter("zvalMin", 'd', true); p2zValMin->SetGuidance("Minimum z-value, expressed in unit"); - + auto p2zValMax = new G4UIparameter("zvalMax", 'd', true); p2zValMax->SetGuidance("Maximum z-value, expressed in unit"); - + auto p2zValUnit = new G4UIparameter("zvalUnit", 's', true); p2zValUnit->SetGuidance("The unit applied to filled z-values and zvalMin0, zvalMax0"); p2zValUnit->SetDefaultValue("none"); - + auto p2zValFcn = new G4UIparameter("zvalFcn", 's', true); p2zValFcn->SetParameterCandidates("log log10 exp none"); G4String fcnzGuidance = "The function applied to filled z-values (log, log10, exp, none)."; p2zValFcn->SetGuidance(fcnzGuidance); p2zValFcn->SetDefaultValue("none"); - - fSetP2Cmd = G4Analysis::make_unique("/analysis/p2/set", this); + + fSetP2Cmd = std::make_unique("/analysis/p2/set", this); fSetP2Cmd->SetGuidance("Set parameters for the 2D profile of given id:"); fSetP2Cmd->SetGuidance(" nxbins; xvalMin; xvalMax; xunit; xbinScheme"); fSetP2Cmd->SetGuidance(" nybins; yvalMin; yvalMax; yunit; ybinScheme"); @@ -294,7 +276,7 @@ void G4P2Messenger::SetP2Cmd() fSetP2Cmd->SetParameter(p2zValUnit); fSetP2Cmd->SetParameter(p2zValFcn); fSetP2Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} // @@ -312,9 +294,9 @@ void G4P2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) // Should never happen but let's check anyway for consistency fHelper->WarnAboutParameters(command, parameters.size()); return; - } + } - if ( command == fCreateP2Cmd.get() ) { + if ( command == fCreateP2Cmd.get() ) { auto counter = 0; auto name = parameters[counter++]; auto title = parameters[counter++]; @@ -327,15 +309,15 @@ void G4P2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::ValueData zdata; fHelper->GetValueData(zdata, parameters, counter); auto zunit = GetUnitValue(zdata.fSunit); - fManager->CreateP2(name, title, - xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, - ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, - zdata.fVmin*zunit, zdata.fVmax*zunit, + fManager->CreateP2(name, title, + xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, + ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, + zdata.fVmin*zunit, zdata.fVmax*zunit, xdata.fSunit, ydata.fSunit, zdata.fSunit, xdata.fSfcn, ydata.fSfcn, zdata.fSfcn, - xdata.fSbinScheme, ydata.fSbinScheme); + xdata.fSbinScheme, ydata.fSbinScheme); } - else if ( command == fSetP2Cmd.get() ) { + else if ( command == fSetP2Cmd.get() ) { auto counter = 0; auto id = G4UIcommand::ConvertToInt(parameters[counter++]); G4AnalysisMessengerHelper::BinData xdata; @@ -347,21 +329,21 @@ void G4P2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::ValueData zdata; fHelper->GetValueData(zdata, parameters, counter); auto zunit = GetUnitValue(zdata.fSunit); - fManager->SetP2(id, - xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, - ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, - zdata.fVmin*zunit, zdata.fVmax*zunit, + fManager->SetP2(id, + xdata.fNbins, xdata.fVmin*xunit, xdata.fVmax*xunit, + ydata.fNbins, ydata.fVmin*yunit, ydata.fVmax*yunit, + zdata.fVmin*zunit, zdata.fVmax*zunit, xdata.fSunit, ydata.fSunit, zdata.fSunit, xdata.fSfcn, ydata.fSfcn, zdata.fSfcn, - xdata.fSbinScheme, ydata.fSbinScheme); + xdata.fSbinScheme, ydata.fSbinScheme); } - else if ( command == fSetP2XCmd.get() ) { + else if ( command == fSetP2XCmd.get() ) { // Only save values auto counter = 0; fXId = G4UIcommand::ConvertToInt(parameters[counter++]); fHelper->GetBinData(fXData, parameters, counter); } - else if ( command == fSetP2YCmd.get() ) { + else if ( command == fSetP2YCmd.get() ) { // Save values auto counter = 0; fYId = G4UIcommand::ConvertToInt(parameters[counter++]); @@ -375,19 +357,19 @@ void G4P2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) // (another set may follow if setZ is also called) auto xunit = GetUnitValue(fXData.fSunit); auto yunit = GetUnitValue(fYData.fSunit); - fManager->SetP2(fYId, + fManager->SetP2(fYId, fXData.fNbins, fXData.fVmin*xunit, fXData.fVmax*xunit, fYData.fNbins, fYData.fVmin*yunit, fYData.fVmax*yunit, - 0., 0., + 0., 0., fXData.fSunit, fYData.fSunit, "none", fXData.fSfcn, fYData.fSfcn, "none", - fXData.fSbinScheme, fYData.fSbinScheme); + fXData.fSbinScheme, fYData.fSbinScheme); } - else if ( command == fSetP2ZCmd.get() ) { + else if ( command == fSetP2ZCmd.get() ) { auto counter = 0; auto id = G4UIcommand::ConvertToInt(parameters[counter++]); // Check if setX and setY command was called - if ( fXId == -1 || fXId != id || + if ( fXId == -1 || fXId != id || fYId == -1 || fYId != id ) { fHelper->WarnAboutSetCommands(); return; @@ -397,39 +379,39 @@ void G4P2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) G4AnalysisMessengerHelper::ValueData zdata; fHelper->GetValueData(zdata, parameters, counter); auto zunit = GetUnitValue(zdata.fSunit); - fManager->SetP2(id, + fManager->SetP2(id, fXData.fNbins, fXData.fVmin*xunit, fXData.fVmax*xunit, fYData.fNbins, fYData.fVmin*yunit, fYData.fVmax*yunit, - zdata.fVmin*zunit, zdata.fVmax*zunit, + zdata.fVmin*zunit, zdata.fVmax*zunit, fXData.fSunit, fYData.fSunit, zdata.fSunit, fXData.fSfcn, fYData.fSfcn, zdata.fSfcn, - fXData.fSbinScheme, fYData.fSbinScheme); - fXId = -1; - fYId = -1; + fXData.fSbinScheme, fYData.fSbinScheme); + fXId = -1; + fYId = -1; } - else if ( command == fSetP2TitleCmd.get() ) { + else if ( command == fSetP2TitleCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto title = parameters[counter++]; - fManager->SetP2Title(id, title); + fManager->SetP2Title(id, title); } - else if ( command == fSetP2XAxisCmd.get() ) { + else if ( command == fSetP2XAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto xaxis = parameters[counter++]; - fManager->SetP2XAxisTitle(id, xaxis); + fManager->SetP2XAxisTitle(id, xaxis); } - else if ( command == fSetP2YAxisCmd.get() ) { + else if ( command == fSetP2YAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto yaxis = parameters[counter++]; - fManager->SetP2YAxisTitle(id, yaxis); + fManager->SetP2YAxisTitle(id, yaxis); } - else if ( command == fSetP2ZAxisCmd.get() ) { + else if ( command == fSetP2ZAxisCmd.get() ) { auto counter = 0; - auto id = G4UIcommand::ConvertToInt(parameters[counter++]); + auto id = G4UIcommand::ConvertToInt(parameters[counter++]); auto zaxis = parameters[counter++]; - fManager->SetP2ZAxisTitle(id, zaxis); + fManager->SetP2ZAxisTitle(id, zaxis); } else if ( command == fSetP2XAxisLogCmd.get() ) { auto counter = 0; @@ -449,4 +431,4 @@ void G4P2Messenger::SetNewValue(G4UIcommand* command, G4String newValues) auto zaxisLog = G4UIcommand::ConvertToBool(parameters[counter++]); fManager->SetP2ZAxisIsLog(id, zaxisLog); } -} +} diff --git a/source/analysis/management/src/G4PlotManager.cc b/source/analysis/management/src/G4PlotManager.cc index 5f99f799f9..62768657a2 100644 --- a/source/analysis/management/src/G4PlotManager.cc +++ b/source/analysis/management/src/G4PlotManager.cc @@ -28,17 +28,20 @@ #include "G4HnInformation.hh" #include "G4PlotManager.hh" +#include "G4AnalysisUtilities.hh" #include "G4ios.hh" #if defined(TOOLS_USE_FREETYPE) -#include -#include -#include +#include "tools/sg/text_freetype" +#include "tools/xml/xml_style" +#include "tools/xml/wrap_viewplot_fonts_google_style" //inlib/xml/viewplot.style file embeded in an inline function. +#include "tools/font/lato_regular_ttf" +#include "tools/font/roboto_bold_ttf" namespace { -// from g4tools/test/viewplot.cpp +// from g4tools/test/viewplot.cpp //_____________________________________________________________________________ void HD_style(tools::sg::plots& a_plots,float a_line_width) { std::vector plotters; @@ -71,10 +74,10 @@ void HD_style(tools::sg::plots& a_plots,float a_line_width) { _plotter->z_axis().labels_style().line_width = a_line_width; _plotter->z_axis().mag_style().line_width = a_line_width; _plotter->z_axis().title_style().line_width = a_line_width; - } + } } -// from g4tools/test/viewplot.cpp +// from g4tools/test/viewplot.cpp //_____________________________________________________________________________ void regions_style(tools::sg::plots& a_plots,float a_plotter_scale = 1) { // Rescale some plotter parameters (for example margins) according to the number of regions. @@ -119,10 +122,10 @@ void regions_style(tools::sg::plots& a_plots,float a_plotter_scale = 1) { _plotter->x_axis().label_height = _plotter->x_axis().label_height * hfac * label_cooking; _plotter->y_axis().label_height = _plotter->y_axis().label_height * hfac * label_cooking; - } + } } -// from g4tools/test/viewplot.cpp +// from g4tools/test/viewplot.cpp //_____________________________________________________________________________ bool load_embeded_styles(tools::xml::styles& a_styles) { std::string ss; @@ -140,9 +143,7 @@ bool load_embeded_styles(tools::xml::styles& a_styles) { } #endif -// -// static data -// +using namespace G4Analysis; // // ctors, dtor @@ -150,63 +151,49 @@ bool load_embeded_styles(tools::xml::styles& a_styles) { //_____________________________________________________________________________ G4PlotManager::G4PlotManager(const G4AnalysisManagerState& state) - : fState(state), - fPlotParameters(), - fViewer(nullptr), - fFileName() + : fState(state) { #if defined(TOOLS_USE_FREETYPE) ////////////////////////////////////////////////////////////////////////////// /// plotting, high resolution with freetype fonts and by using styles : ////// ////////////////////////////////////////////////////////////////////////////// -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - G4cout << "... using high resolution with Freetype fonts" << G4endl; -#endif + fState.Message(kVL1, "... using high resolution with Freetype fonts", ""); //Have vertical A4 : // unsigned int ww = 2000; //to have better antialising on freetype fonts. // float A4 = 29.7f/21.0f; // unsigned int wh = (unsigned int)(float(ww)*A4*0.80); static tools::sg::text_freetype ttf; - fViewer.reset(new tools::viewplot(G4cout, ttf, + ttf.add_embedded_font(tools::sg::font_lato_regular_ttf(),tools::font::lato_regular_ttf); + ttf.add_embedded_font(tools::sg::font_roboto_bold_ttf(),tools::font::roboto_bold_ttf); + fViewer = std::make_unique(G4cout, ttf, fPlotParameters.GetColumns(), - fPlotParameters.GetRows(), - fPlotParameters.GetWidth(), - fPlotParameters.GetHeight())); + fPlotParameters.GetRows(), + fPlotParameters.GetWidth(), + fPlotParameters.GetHeight()); fViewer->plots().view_border = false; load_embeded_styles(fViewer->styles()); fViewer->styles().add_colormap("default",tools::sg::style_default_colormap()); fViewer->styles().add_colormap("ROOT",tools::sg::style_ROOT_colormap()); #else // cretae a viewer with default parameters -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - G4cout << "... using low resolution with Hershey fonts" << G4endl; -#endif - fViewer.reset(new tools::viewplot(G4cout, - fPlotParameters.GetColumns(), - fPlotParameters.GetRows(), - fPlotParameters.GetWidth(), - fPlotParameters.GetHeight())); + fState.Message(kVL1, "... using low resolution with Hershey fonts", ""); + fViewer = std::make_unique(G4cout, + fPlotParameters.GetColumns(), + fPlotParameters.GetRows(), + fPlotParameters.GetWidth(), + fPlotParameters.GetHeight()); fViewer->plots().view_border = false; #endif } -//_____________________________________________________________________________ -G4PlotManager::~G4PlotManager() -{} - -// +// // private methods // //_____________________________________________________________________________ G4bool G4PlotManager::WritePage() { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("write a page in", "plot file", fFileName); -#endif + fState.Message(kVL4, "write a page in", "plot file", fFileName); #if defined(TOOLS_USE_FREETYPE) HD_style(fViewer->plots(), 5); @@ -215,51 +202,37 @@ G4bool G4PlotManager::WritePage() G4bool result = fViewer->write_page(); if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Cannot write a page in the plot file " << fFileName; - G4Exception("G4PlotManager::WritePage()", - "Analysis_W022", JustWarning, description); + Warn("Cannot write a page in the plot file " + fFileName, + fkClass, "WritePage"); } // clear viewers plots - fViewer->plots().init_sg(); + fViewer->plots().init_sg(); //it will recreate the sg::plotters and then reset the styles on new ones. -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3()->Message("write a page in", "plot file", fFileName); -#endif + fState.Message(kVL3, "write a page in", "plot file", fFileName); return result; -} +} -// +// // public methods // //_____________________________________________________________________________ G4bool G4PlotManager::OpenFile(const G4String& fileName) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("open", "plot file", fileName); -#endif + fState.Message(kVL4, "open", "plot file", fileName); // Keep filename for logging fFileName = fileName; G4bool result = fViewer->open_file(fileName); if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Cannot open plot file " << fileName; - G4Exception("G4PlotManager::OpenFile()", - "Analysis_W001", JustWarning, description); + Warn("Cannot open plot file " + fileName, fkClass, "OpenFile"); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1()->Message("open", "plot file", fileName); -#endif + fState.Message(kVL1, "open", "plot file", fileName); return result; } @@ -267,23 +240,14 @@ G4bool G4PlotManager::OpenFile(const G4String& fileName) //_____________________________________________________________________________ G4bool G4PlotManager::CloseFile() { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("close", "plot file", fFileName); -#endif + fState.Message(kVL4, "close", "plot file", fFileName); G4bool result = fViewer->close_file(); if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Cannot close the plot file."; - G4Exception("G4PlotManager::CloseFile()", - "Analysis_W021", JustWarning, description); + Warn("Cannot close the plot file", fkClass, "CloseFile"); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1()->Message("close", "plot file", fFileName); -#endif + fState.Message(kVL1, "close", "plot file", fFileName); return result; } diff --git a/source/analysis/management/src/G4PlotMessenger.cc b/source/analysis/management/src/G4PlotMessenger.cc index 9bd3c2aa39..4f36a9a669 100644 --- a/source/analysis/management/src/G4PlotMessenger.cc +++ b/source/analysis/management/src/G4PlotMessenger.cc @@ -37,23 +37,17 @@ #include "G4UIcmdWithAString.hh" //#include "G4Tokenizer.hh" -#include -#include #include using namespace G4Analysis; +using std::to_string; //_____________________________________________________________________________ G4PlotMessenger::G4PlotMessenger(G4PlotParameters* plotParameters) : G4UImessenger(), - fPlotParameters(plotParameters), - fHelper(nullptr), - fDirectory(nullptr), - fSetLayoutCmd(nullptr), - fSetDimensionsCmd(nullptr), - fSetStyleCmd(nullptr) -{ - fHelper = G4Analysis::make_unique("plot"); + fPlotParameters(plotParameters) +{ + fHelper = std::make_unique("plot"); fDirectory = fHelper->CreateHnDirectory(); @@ -63,8 +57,7 @@ G4PlotMessenger::G4PlotMessenger(G4PlotParameters* plotParameters) } //_____________________________________________________________________________ -G4PlotMessenger::~G4PlotMessenger() -{} +G4PlotMessenger::~G4PlotMessenger() = default; // // private functions @@ -73,7 +66,7 @@ G4PlotMessenger::~G4PlotMessenger() //_____________________________________________________________________________ void G4PlotMessenger::SetStyleCmd() { - fSetStyleCmd = G4Analysis::make_unique("/analysis/plot/setStyle",this); + fSetStyleCmd = std::make_unique("/analysis/plot/setStyle",this); #if defined(TOOLS_USE_FREETYPE) fSetStyleCmd->SetGuidance("Set plotting style from: "); fSetStyleCmd->SetGuidance(" ROOT_default: ROOT style with high resolution fonts"); @@ -96,54 +89,52 @@ void G4PlotMessenger::SetLayoutCmd() auto columns = new G4UIparameter("columns", 'i', false); columns->SetGuidance("The number of columns in the page layout."); G4String range = "columns>=1 && columns<="; - std::ostringstream osMaxColumns; - osMaxColumns << fPlotParameters->GetMaxColumns(); - range.append(osMaxColumns.str()); + auto maxColumns = fPlotParameters->GetMaxColumns(); + range.append(to_string(maxColumns)); columns->SetParameterRange(range); - + auto rows = new G4UIparameter("rows", 'i', false); rows->SetGuidance("The number of rows in the page layout."); range = "rows>=1 && rows<="; - std::ostringstream osMaxRows; - osMaxRows << fPlotParameters->GetMaxRows(); - range.append(osMaxRows.str()); + auto maxRows = fPlotParameters->GetMaxRows(); + range.append(to_string(maxRows)); rows->SetParameterRange(range); - fSetLayoutCmd = G4Analysis::make_unique("/analysis/plot/setLayout", this); + fSetLayoutCmd = std::make_unique("/analysis/plot/setLayout", this); // Guidance text: // Set page layout (number of columns and rows per page). - // Supported layouts: + // Supported layouts: // columns = 1 .. maxValueAllowed // rows = 1 .. maxValueAllowed, and >= columns fSetLayoutCmd->SetGuidance("Set page layout (number of columns and rows per page)."); fSetLayoutCmd->SetGuidance(" Supported layouts: "); G4String guidance = " columns = 1 .. "; - guidance.append(osMaxColumns.str()); + guidance.append(to_string(maxColumns)); fSetLayoutCmd->SetGuidance(guidance); guidance = " rows = 1 .. "; - guidance.append(osMaxRows.str()); + guidance.append(to_string(maxRows)); guidance.append(" and >= columns"); fSetLayoutCmd->SetGuidance(guidance); fSetLayoutCmd->SetParameter(columns); fSetLayoutCmd->SetParameter(rows); fSetLayoutCmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} //_____________________________________________________________________________ void G4PlotMessenger::SetDimensionsCmd() { auto width = new G4UIparameter("width", 'i', false); width->SetGuidance("The page width."); - + auto height = new G4UIparameter("height", 'i', false); height->SetGuidance("The page height."); - - fSetDimensionsCmd = G4Analysis::make_unique("/analysis/plot/setDimensions", this); + + fSetDimensionsCmd = std::make_unique("/analysis/plot/setDimensions", this); fSetDimensionsCmd->SetGuidance("Set the plotter window size (width and height) in pixels."); fSetDimensionsCmd->SetParameter(width); fSetDimensionsCmd->SetParameter(height); fSetDimensionsCmd->AvailableForStates(G4State_PreInit, G4State_Idle); -} +} // // public functions @@ -160,9 +151,9 @@ void G4PlotMessenger::SetNewValue(G4UIcommand* command, G4String newValues) // Should never happen but let's check anyway for consistency fHelper->WarnAboutParameters(command, parameters.size()); return; - } + } - if ( command == fSetLayoutCmd.get() ) { + if ( command == fSetLayoutCmd.get() ) { auto counter = 0; auto columns = G4UIcommand::ConvertToInt(parameters[counter++]); auto rows = G4UIcommand::ConvertToInt(parameters[counter++]); @@ -179,4 +170,4 @@ void G4PlotMessenger::SetNewValue(G4UIcommand* command, G4String newValues) fPlotParameters->SetStyle(newValues); } #endif -} +} diff --git a/source/analysis/management/src/G4PlotParameters.cc b/source/analysis/management/src/G4PlotParameters.cc index 19ab92a855..6e6c6d98fa 100644 --- a/source/analysis/management/src/G4PlotParameters.cc +++ b/source/analysis/management/src/G4PlotParameters.cc @@ -31,37 +31,22 @@ #include "G4AnalysisUtilities.hh" #include "globals.hh" +using namespace G4Analysis; +using std::to_string; + //_____________________________________________________________________________ G4PlotParameters::G4PlotParameters() : fMessenger(nullptr), - fDefaultColumns(1), - fDefaultRows (2), #if defined(TOOLS_USE_FREETYPE) - //Have vertical A4 : - fDefaultWidth(2000), - fDefaultHeight((G4int)(29.7f/21.0f*fDefaultWidth)), fDefaultStyle("ROOT_default"), - fDefaultScale(0.9f), - fMaxColumns(3), - fMaxRows (5), - fAvailableStyles("ROOT_default hippodrow inlib_default"), + fAvailableStyles("ROOT_default hippodrow inlib_default"), #else - fDefaultWidth (700), - fDefaultHeight((G4int)(29.7f/21.0f*fDefaultWidth)), fDefaultStyle("inlib_default"), - fDefaultScale(0.9f), - fMaxColumns(2), - fMaxRows (3), fAvailableStyles("inlib_default"), #endif - fColumns(fDefaultColumns), - fRows(fDefaultRows), - fWidth(fDefaultWidth), - fHeight(fDefaultHeight), - fScale(fDefaultScale), fStyle(fDefaultStyle) { - fMessenger = G4Analysis::make_unique(this); + fMessenger = std::make_unique(this); } // @@ -72,17 +57,14 @@ G4PlotParameters::G4PlotParameters() void G4PlotParameters::SetLayout(G4int columns, G4int rows) { if ( columns > rows || - columns < 1 || columns > fMaxColumns || - rows < 1 || rows > fMaxRows ) { - G4ExceptionDescription description; - description - << "Layout: " << columns << " x " << rows << " was ignored." << G4endl - << "Supported layouts: " << G4endl - << " columns <= rows" << G4endl - << " columns = 1 .. " << fMaxColumns << G4endl - << " rows = 1 .. " << fMaxRows << G4endl; - G4Exception("G4PlotParameters::SetLayout", - "Analysis_W013", JustWarning, description); + columns < 1 || columns > fkMaxColumns || + rows < 1 || rows > fkMaxRows ) { + Warn("Layout: " + to_string(columns) + " x " + to_string(rows) + + " was ignored.\n" + "Supported layouts (columns <= rows): \n" + + " columns = 1 .. " + to_string(fkMaxColumns) + "\n" + + " rows = 1 .. " + to_string(fkMaxRows), + fkClass, "SetLayout"); return; } fColumns = columns; @@ -90,9 +72,9 @@ void G4PlotParameters::SetLayout(G4int columns, G4int rows) } //_____________________________________________________________________________ -void G4PlotParameters::SetDimensions(G4int width, G4int height) -{ - fWidth = width; +void G4PlotParameters::SetDimensions(G4int width, G4int height) +{ + fWidth = width; fHeight = height; } @@ -102,20 +84,17 @@ void G4PlotParameters::SetStyle(const G4String& style) // Set style and update scale according to the style selected if ( fAvailableStyles.find(style) == std::string::npos ) { - G4ExceptionDescription description; - description - << "Style: " << style << " was ignored." << G4endl - << "Supported styles: " << fAvailableStyles << G4endl; - G4Exception("G4PlotParameters::SetLayout", - "Analysis_W013", JustWarning, description); + Warn("Style: " + style + " was ignored.\n" + + "Supported styles: " + fAvailableStyles, + fkClass, "SetStyle"); return; } fStyle = style; if ( fStyle == "ROOT_default" ) { - fScale = fDefaultScale; + fScale = fkDefaultScale; } else { - fScale = 1.f; + fScale = 1.f; } } diff --git a/source/analysis/management/src/G4VAnalysisManager.cc b/source/analysis/management/src/G4VAnalysisManager.cc index d1cce834de..674387195c 100644 --- a/source/analysis/management/src/G4VAnalysisManager.cc +++ b/source/analysis/management/src/G4VAnalysisManager.cc @@ -38,58 +38,38 @@ #include "G4VNtupleManager.hh" #include "G4VFileManager.hh" #include "G4NtupleBookingManager.hh" - -#include +#include "G4Threading.hh" using namespace G4Analysis; namespace { //_____________________________________________________________________________ -void NtupleMergingWarning(const G4String& functionName, +void NtupleMergingWarning(std::string_view className, + std::string_view functionName, const G4String& outputType) { - G4ExceptionDescription description; - description - << " " << "Ntuple merging is not available with " - << outputType << " output." << G4endl - << " " << "Setting is ignored."; - G4Exception(functionName, "Analysis_W041", JustWarning, description); + G4Analysis::Warn( + "Ntuple merging is not available with " + outputType + " output.\n" + + "Setting is ignored.", className, functionName); } } +// +// protected methods +// + //_____________________________________________________________________________ -G4VAnalysisManager::G4VAnalysisManager(const G4String& type, G4bool isMaster) - : fState(type, isMaster), - fVFileManager(nullptr), - fPlotManager(nullptr), - fNtupleBookingManager(nullptr), - fVNtupleManager(nullptr), - fMessenger(G4Analysis::make_unique(this)), - fH1HnManager(nullptr), - fH2HnManager(nullptr), - fH3HnManager(nullptr), - fP1HnManager(nullptr), - fP2HnManager(nullptr), - fVH1Manager(nullptr), - fVH2Manager(nullptr), - fVH3Manager(nullptr), - fVP1Manager(nullptr), - fVP2Manager(nullptr) +G4VAnalysisManager::G4VAnalysisManager(const G4String& type) + : fState(type, ! G4Threading::IsWorkerThread()) { + fMessenger = std::make_unique(this); fNtupleBookingManager = std::make_shared(fState); } //_____________________________________________________________________________ -G4VAnalysisManager::~G4VAnalysisManager() -{ - // delete fVNtupleManager; -} - -// -// protected methods -// +G4VAnalysisManager::~G4VAnalysisManager() = default; //_____________________________________________________________________________ void G4VAnalysisManager::SetH1Manager(G4VH1Manager* h1Manager) @@ -139,7 +119,7 @@ void G4VAnalysisManager::SetP2Manager(G4VP2Manager* p2Manager) //_____________________________________________________________________________ void G4VAnalysisManager::SetNtupleManager(std::shared_ptr ntupleManager) { - fVNtupleManager = ntupleManager; + fVNtupleManager = std::move(ntupleManager); fVNtupleManager->SetFirstId(fNtupleBookingManager->GetFirstId()); fVNtupleManager->SetFirstNtupleColumnId(fNtupleBookingManager->GetFirstNtupleColumnId()); } @@ -153,67 +133,68 @@ void G4VAnalysisManager::SetFileManager(std::shared_ptr fileMana if ( fH2HnManager != nullptr ) fH2HnManager->SetFileManager(fileManager); if ( fH3HnManager != nullptr ) fH3HnManager->SetFileManager(fileManager); if ( fP1HnManager != nullptr ) fP1HnManager->SetFileManager(fileManager); - if ( fP2HnManager != nullptr ) fP2HnManager->SetFileManager(fileManager); -} + if ( fP2HnManager != nullptr ) fP2HnManager->SetFileManager(std::move(fileManager)); +} //_____________________________________________________________________________ void G4VAnalysisManager::SetPlotManager(std::shared_ptr plotManager) { - fPlotManager = plotManager; -} + fPlotManager = std::move(plotManager); +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::WriteAscii(const G4String& fileName) { - G4bool finalResult = true; + // Do not write on workers + if ( ! fState.GetIsMaster() ) return true; + + auto result = true; // Replace or add file extension .ascii G4String name(fileName); - if ( name.find(".") != std::string::npos ) { - name.erase(name.find("."), name.length()); + if ( name.find(".") != std::string::npos ) { + name.erase(name.find("."), name.length()); } name.append(".ascii"); -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3()->Message("write ASCII", "file", name); -#endif - + Message(kVL3, "write ASCII", "file", name); + std::ofstream output(name, std::ios::out); if ( ! output ) { - G4ExceptionDescription description; - description - << "Cannot open file. File name is not defined."; - G4Exception("G4VAnalysisManager::WriteAscii()", - "Analysis_W001", JustWarning, description); + Warn("Cannot open file. File name is not defined.", + fkClass, "WriteAscii"); return false; } output.setf( std::ios::scientific, std::ios::floatfield ); - G4bool result = fVH1Manager->WriteOnAscii(output); - finalResult = finalResult && result; - - result = fVH2Manager->WriteOnAscii(output); - finalResult = finalResult && result; + result &= fVH1Manager->WriteOnAscii(output); + result &= fVH2Manager->WriteOnAscii(output); + result &= fVH3Manager->WriteOnAscii(output); + result &= fVP1Manager->WriteOnAscii(output); + result &= fVP2Manager->WriteOnAscii(output); - result = fVH3Manager->WriteOnAscii(output); - finalResult = finalResult && result; + Message(kVL1, "write ASCII", "file", name, result); - //result = fVP1Manager->WriteOnAscii(output); - //finalResult = finalResult && result; + return result; +} - //result = fVP2Manager->WriteOnAscii(output); - //finalResult = finalResult && result; +//_____________________________________________________________________________ +std::shared_ptr +G4VAnalysisManager::GetFileManager(const G4String& fileName) +{ + // Check if file type corresponds the manager output type + G4String extension = GetExtension(fileName); + if ( extension.size() && extension != GetFileType() ) { + Warn( + "The file extension differs from " + GetFileType() + " output type.\n" + + GetFileType() + " output type will be used.", + fkClass, "GetFileManager"); + } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1()->Message("write ASCII", "file", name, result); -#endif - - return finalResult; -} + return fVFileManager; +} -// +// // public methods // @@ -223,75 +204,90 @@ G4bool G4VAnalysisManager::OpenFile(const G4String& fileName) if ( fileName != "" ) { return OpenFileImpl(fileName); } - else { + else { if ( fVFileManager->GetFileName() == "" ) { - G4ExceptionDescription description; - description - << "Cannot open file. File name is not defined."; - G4Exception("G4VFileManager::OpenFile()", - "Analysis_W001", JustWarning, description); + Warn("Cannot open file. File name is not defined.", fkClass, "OpenFile"); return false; - } + } return OpenFileImpl(fVFileManager->GetFileName()); } -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::Write() { - G4bool finalResult = true; + auto result = true; - G4bool result = WriteImpl(); - finalResult = finalResult && result; - + result &= WriteImpl(); if ( IsPlotting() ) { - result = PlotImpl(); - finalResult = finalResult && result; + result &= PlotImpl(); } - return finalResult; -} + return result; +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::CloseFile(G4bool reset) { return CloseFileImpl(reset); -} +} + +//_____________________________________________________________________________ +G4bool G4VAnalysisManager::Reset() +{ + return ResetImpl(); +} + +//_____________________________________________________________________________ +void G4VAnalysisManager::Clear() +{ + Message(kVL4, "clear", "all data"); + + // clear hntools objects + ClearImpl(); + + // clear remaining data + fNtupleBookingManager->ClearData(); + if ( fVNtupleManager != nullptr ) fVNtupleManager->Clear(); + if ( fVFileManager != nullptr ) fVFileManager->Clear(); + + Message(kVL1, "clear", "all data"); +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::Merge(tools::histo::hmpi* hmpi) { return MergeImpl(hmpi); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::Plot() { return PlotImpl(); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::IsOpenFile() const { return IsOpenFileImpl(); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetFileName(const G4String& fileName) -{ - return fVFileManager->SetFileName(fileName); +{ + return fVFileManager->SetFileName(fileName); } //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetHistoDirectoryName(const G4String& dirName) -{ - return fVFileManager->SetHistoDirectoryName(dirName); +{ + return fVFileManager->SetHistoDirectoryName(dirName); } //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetNtupleDirectoryName(const G4String& dirName) -{ - return fVFileManager->SetNtupleDirectoryName(dirName); +{ + return fVFileManager->SetNtupleDirectoryName(dirName); } //_____________________________________________________________________________ @@ -301,21 +297,21 @@ void G4VAnalysisManager::SetCompressionLevel(G4int level) } //_____________________________________________________________________________ -G4String G4VAnalysisManager::GetFileName() const -{ - return fVFileManager->GetFileName(); +G4String G4VAnalysisManager::GetFileName() const +{ + return fVFileManager->GetFileName(); } //_____________________________________________________________________________ -G4String G4VAnalysisManager::GetHistoDirectoryName() const -{ - return fVFileManager->GetHistoDirectoryName(); +G4String G4VAnalysisManager::GetHistoDirectoryName() const +{ + return fVFileManager->GetHistoDirectoryName(); } - + //_____________________________________________________________________________ G4String G4VAnalysisManager::GetNtupleDirectoryName() const { - return fVFileManager->GetNtupleDirectoryName(); + return fVFileManager->GetNtupleDirectoryName(); } //_____________________________________________________________________________ @@ -334,9 +330,9 @@ G4int G4VAnalysisManager::CreateH1(const G4String& name, const G4String& title, if ( ! CheckNbins(nbins) ) return kInvalidId; if ( ! CheckMinMax(xmin, xmax, fcnName, binSchemeName) ) return kInvalidId; - return fVH1Manager->CreateH1(name, title, nbins, xmin, xmax, + return fVH1Manager->CreateH1(name, title, nbins, xmin, xmax, unitName, fcnName, binSchemeName); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateH1(const G4String& name, const G4String& title, @@ -347,7 +343,7 @@ G4int G4VAnalysisManager::CreateH1(const G4String& name, const G4String& title, if ( ! CheckEdges(edges) ) return kInvalidId; return fVH1Manager->CreateH1(name, title, edges, unitName, fcnName); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateH2(const G4String& name, const G4String& title, @@ -355,23 +351,23 @@ G4int G4VAnalysisManager::CreateH2(const G4String& name, const G4String& title, G4int nybins, G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName) - + { if ( ! CheckName(name, "H2") ) return kInvalidId; - + if ( ! CheckNbins(nxbins) ) return kInvalidId; if ( ! CheckMinMax(xmin, xmax, xfcnName, xbinSchemeName) ) return kInvalidId; if ( ! CheckNbins(nybins) ) return kInvalidId; if ( ! CheckMinMax(ymin, ymax, yfcnName, ybinSchemeName) ) return kInvalidId; - return fVH2Manager->CreateH2(name, title, - nxbins, xmin, xmax, nybins, ymin, ymax, - xunitName, yunitName, xfcnName, yfcnName, + return fVH2Manager->CreateH2(name, title, + nxbins, xmin, xmax, nybins, ymin, ymax, + xunitName, yunitName, xfcnName, yfcnName, xbinSchemeName, ybinSchemeName); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateH2(const G4String& name, const G4String& title, @@ -379,17 +375,17 @@ G4int G4VAnalysisManager::CreateH2(const G4String& name, const G4String& title, const std::vector& yedges, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName) - + { if ( ! CheckName(name, "H2") ) return kInvalidId; - + if ( ! CheckEdges(xedges) ) return kInvalidId; if ( ! CheckEdges(yedges) ) return kInvalidId; - return fVH2Manager->CreateH2(name, title, + return fVH2Manager->CreateH2(name, title, xedges, yedges, xunitName, yunitName, xfcnName, yfcnName); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateH3(const G4String& name, const G4String& title, @@ -398,15 +394,15 @@ G4int G4VAnalysisManager::CreateH3(const G4String& name, const G4String& title, G4int nzbins, G4double zmin, G4double zmax, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, - const G4String& xfcnName, const G4String& yfcnName, + const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName, const G4String& zbinSchemeName) - + { if ( ! CheckName(name, "H3") ) return kInvalidId; - + if ( ! CheckNbins(nxbins) ) return kInvalidId; if ( ! CheckMinMax(xmin, xmax, xfcnName, xbinSchemeName) ) return kInvalidId; @@ -416,13 +412,13 @@ G4int G4VAnalysisManager::CreateH3(const G4String& name, const G4String& title, if ( ! CheckNbins(nzbins) ) return kInvalidId; if ( ! CheckMinMax(zmin, zmax, zfcnName, zbinSchemeName) ) return kInvalidId; - return fVH3Manager->CreateH3(name, title, - nxbins, xmin, xmax, nybins, ymin, ymax, + return fVH3Manager->CreateH3(name, title, + nxbins, xmin, xmax, nybins, ymin, ymax, nzbins, zmin, zmax, - xunitName, yunitName, zunitName, + xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, xbinSchemeName, ybinSchemeName, zbinSchemeName); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateH3(const G4String& name, const G4String& title, @@ -431,91 +427,91 @@ G4int G4VAnalysisManager::CreateH3(const G4String& name, const G4String& title, const std::vector& zedges, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, - const G4String& xfcnName, const G4String& yfcnName, + const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) - + { if ( ! CheckName(name, "H3") ) return kInvalidId; - + if ( ! CheckEdges(xedges) ) return kInvalidId; if ( ! CheckEdges(yedges) ) return kInvalidId; if ( ! CheckEdges(zedges) ) return kInvalidId; - return fVH3Manager->CreateH3(name, title, - xedges, yedges, zedges, + return fVH3Manager->CreateH3(name, title, + xedges, yedges, zedges, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetH1(G4int id, G4int nbins, G4double xmin, G4double xmax, const G4String& unitName, const G4String& fcnName, const G4String& binSchemeName) -{ +{ if ( ! CheckNbins(nbins) ) return kInvalidId; if ( ! CheckMinMax(xmin, xmax, fcnName, binSchemeName) ) return kInvalidId; - return fVH1Manager->SetH1(id, nbins, xmin, xmax, unitName, fcnName, binSchemeName); + return fVH1Manager->SetH1(id, nbins, xmin, xmax, unitName, fcnName, binSchemeName); } - + //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetH1(G4int id, const std::vector& edges, const G4String& unitName, const G4String& fcnName) -{ +{ if ( ! CheckEdges(edges) ) return kInvalidId; - return fVH1Manager->SetH1(id, edges, unitName, fcnName); + return fVH1Manager->SetH1(id, edges, unitName, fcnName); } - + //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetH2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName) -{ +{ if ( ! CheckNbins(nxbins) ) return kInvalidId; if ( ! CheckMinMax(xmin, xmax, xfcnName, xbinSchemeName) ) return kInvalidId; if ( ! CheckNbins(nybins) ) return kInvalidId; if ( ! CheckMinMax(ymin, ymax, yfcnName, ybinSchemeName) ) return kInvalidId; - return fVH2Manager->SetH2(id, nxbins, xmin, xmax, nybins, ymin, ymax, + return fVH2Manager->SetH2(id, nxbins, xmin, xmax, nybins, ymin, ymax, xunitName, yunitName, xfcnName, yfcnName, xbinSchemeName, ybinSchemeName); } - + //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetH2(G4int id, const std::vector& xedges, const std::vector& yedges, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName) -{ +{ if ( ! CheckEdges(xedges) ) return kInvalidId; if ( ! CheckEdges(yedges) ) return kInvalidId; - return fVH2Manager->SetH2(id, xedges, yedges, + return fVH2Manager->SetH2(id, xedges, yedges, xunitName, yunitName, xfcnName, yfcnName); } - + //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetH3(G4int id, - G4int nxbins, G4double xmin, G4double xmax, + G4int nxbins, G4double xmin, G4double xmax, G4int nybins, G4double ymin, G4double ymax, G4int nzbins, G4double zmin, G4double zmax, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, - const G4String& xfcnName, const G4String& yfcnName, + const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName, const G4String& zbinSchemeName) -{ +{ if ( ! CheckNbins(nxbins) ) return kInvalidId; if ( ! CheckMinMax(xmin, xmax, xfcnName, xbinSchemeName) ) return kInvalidId; @@ -525,14 +521,14 @@ G4bool G4VAnalysisManager::SetH3(G4int id, if ( ! CheckNbins(nzbins) ) return kInvalidId; if ( ! CheckMinMax(zmin, zmax, zfcnName, zbinSchemeName) ) return kInvalidId; - return fVH3Manager->SetH3(id, - nxbins, xmin, xmax, nybins, ymin, ymax, + return fVH3Manager->SetH3(id, + nxbins, xmin, xmax, nybins, ymin, ymax, nzbins, zmin, zmax, - xunitName, yunitName, zunitName, + xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, xbinSchemeName, ybinSchemeName, zbinSchemeName); } - + //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetH3(G4int id, const std::vector& xedges, @@ -540,36 +536,36 @@ G4bool G4VAnalysisManager::SetH3(G4int id, const std::vector& zedges, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, - const G4String& xfcnName, const G4String& yfcnName, + const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) -{ +{ if ( ! CheckEdges(xedges) ) return kInvalidId; if ( ! CheckEdges(yedges) ) return kInvalidId; if ( ! CheckEdges(zedges) ) return kInvalidId; return fVH3Manager->SetH3(id, xedges, yedges, zedges, - xunitName, yunitName, zunitName, + xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); } - + //_____________________________________________________________________________ G4bool G4VAnalysisManager::ScaleH1(G4int id, G4double factor) { return fVH1Manager->ScaleH1(id, factor); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::ScaleH2(G4int id, G4double factor) { return fVH2Manager->ScaleH2(id, factor); -} - +} + //_____________________________________________________________________________ G4bool G4VAnalysisManager::ScaleH3(G4int id, G4double factor) { return fVH3Manager->ScaleH3(id, factor); -} - +} + //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateP1(const G4String& name, const G4String& title, G4int nbins, G4double xmin, G4double xmax, @@ -587,9 +583,9 @@ G4int G4VAnalysisManager::CreateP1(const G4String& name, const G4String& title, } return fVP1Manager->CreateP1(name, title, nbins, xmin, xmax, ymin, ymax, - xunitName, yunitName, xfcnName, yfcnName, + xunitName, yunitName, xfcnName, yfcnName, xbinSchemeName); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateP1(const G4String& name, const G4String& title, @@ -605,20 +601,20 @@ G4int G4VAnalysisManager::CreateP1(const G4String& name, const G4String& title, if ( ! CheckMinMax(ymin, ymax) ) return kInvalidId; } - return fVP1Manager->CreateP1(name, title, edges, ymin, ymax, + return fVP1Manager->CreateP1(name, title, edges, ymin, ymax, xunitName, yunitName, xfcnName, yfcnName); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateP2(const G4String& name, const G4String& title, G4int nxbins, G4double xmin, G4double xmax, - G4int nybins, G4double ymin, G4double ymax, + G4int nybins, G4double ymin, G4double ymax, G4double zmin, G4double zmax, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName) { if ( ! CheckName(name, "P2") ) return kInvalidId; @@ -630,13 +626,13 @@ G4int G4VAnalysisManager::CreateP2(const G4String& name, const G4String& title, if ( ! CheckMinMax(zmin, zmax) ) return kInvalidId; } - return fVP2Manager->CreateP2(name, title, + return fVP2Manager->CreateP2(name, title, nxbins, xmin, xmax, nybins, ymin, ymax, zmin, zmax, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, xbinSchemeName, ybinSchemeName); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateP2(const G4String& name, const G4String& title, @@ -656,10 +652,10 @@ G4int G4VAnalysisManager::CreateP2(const G4String& name, const G4String& title, if ( ! CheckMinMax(zmin, zmax) ) return kInvalidId; } - return fVP2Manager->CreateP2(name, title, xedges, yedges, zmin, zmax, + return fVP2Manager->CreateP2(name, title, xedges, yedges, zmin, zmax, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetP1(G4int id, @@ -668,7 +664,7 @@ G4bool G4VAnalysisManager::SetP1(G4int id, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& xbinSchemeName) -{ +{ if ( ! CheckNbins(nbins) ) return kInvalidId; if ( ! CheckMinMax(xmin, xmax, xfcnName, xbinSchemeName) ) return kInvalidId; if ( ymin != 0. || ymax != 0. ) { @@ -676,38 +672,38 @@ G4bool G4VAnalysisManager::SetP1(G4int id, if ( ! CheckMinMax(ymin, ymax) ) return kInvalidId; } - return fVP1Manager->SetP1(id, nbins, xmin, xmax, ymin, ymax, - xunitName, yunitName, xfcnName, yfcnName, + return fVP1Manager->SetP1(id, nbins, xmin, xmax, ymin, ymax, + xunitName, yunitName, xfcnName, yfcnName, xbinSchemeName); } - + //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetP1(G4int id, const std::vector& edges, G4double ymin, G4double ymax, const G4String& xunitName, const G4String& yunitName, const G4String& xfcnName, const G4String& yfcnName) -{ +{ if ( ! CheckEdges(edges) ) return kInvalidId; if ( ymin != 0. || ymax != 0. ) { // Do not check default values if ( ! CheckMinMax(ymin, ymax) ) return kInvalidId; } - return fVP1Manager->SetP1(id, edges, ymin, ymax, - xunitName, yunitName, xfcnName, yfcnName); + return fVP1Manager->SetP1(id, edges, ymin, ymax, + xunitName, yunitName, xfcnName, yfcnName); } - + //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetP2(G4int id, - G4int nxbins, G4double xmin, G4double xmax, - G4int nybins, G4double ymin, G4double ymax, + G4int nxbins, G4double xmin, G4double xmax, + G4int nybins, G4double ymin, G4double ymax, G4double zmin, G4double zmax, const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName, - const G4String& xbinSchemeName, + const G4String& xbinSchemeName, const G4String& ybinSchemeName) { if ( ! CheckNbins(nxbins) ) return kInvalidId; @@ -719,22 +715,22 @@ G4bool G4VAnalysisManager::SetP2(G4int id, if ( ! CheckMinMax(zmin, zmax) ) return kInvalidId; } - return fVP2Manager->SetP2(id, nxbins, xmin, xmax, nybins, ymin, ymax, + return fVP2Manager->SetP2(id, nxbins, xmin, xmax, nybins, ymin, ymax, zmin, zmax, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName, xbinSchemeName, ybinSchemeName); } - + //_____________________________________________________________________________ G4bool G4VAnalysisManager::SetP2(G4int id, const std::vector& xedges, const std::vector& yedges, G4double zmin, G4double zmax, - const G4String& xunitName, + const G4String& xunitName, const G4String& yunitName, const G4String& zunitName, - const G4String& xfcnName, + const G4String& xfcnName, const G4String& yfcnName, const G4String& zfcnName) { @@ -745,7 +741,7 @@ G4bool G4VAnalysisManager::SetP2(G4int id, if ( ! CheckMinMax(zmin, zmax) ) return kInvalidId; } - return fVP2Manager->SetP2(id, xedges, yedges, zmin, zmax, + return fVP2Manager->SetP2(id, xedges, yedges, zmin, zmax, xunitName, yunitName, zunitName, xfcnName, yfcnName, zfcnName); } @@ -754,85 +750,94 @@ G4bool G4VAnalysisManager::SetP2(G4int id, G4bool G4VAnalysisManager::ScaleP1(G4int id, G4double factor) { return fVP1Manager->ScaleP1(id, factor); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::ScaleP2(G4int id, G4double factor) { return fVP2Manager->ScaleP2(id, factor); -} +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtuple(const G4String& name, +G4int G4VAnalysisManager::CreateNtuple(const G4String& name, const G4String& title) { if ( ! CheckName(name, "Ntuple") ) return kInvalidId; return fNtupleBookingManager->CreateNtuple(name, title); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateNtupleIColumn(const G4String& name) { if ( ! CheckName(name, "NtupleIColumn") ) return kInvalidId; - return fNtupleBookingManager->CreateNtupleIColumn(name, 0); -} + return fNtupleBookingManager->CreateNtupleIColumn(name, nullptr); +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateNtupleFColumn(const G4String& name) { if ( ! CheckName(name, "NtupleFColumn") ) return kInvalidId; - return fNtupleBookingManager->CreateNtupleFColumn(name, 0); -} + return fNtupleBookingManager->CreateNtupleFColumn(name, nullptr); +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateNtupleDColumn(const G4String& name) { if ( ! CheckName(name, "NtupleDColumn") ) return kInvalidId; - return fNtupleBookingManager->CreateNtupleDColumn(name, 0); -} + return fNtupleBookingManager->CreateNtupleDColumn(name, nullptr); +} //_____________________________________________________________________________ G4int G4VAnalysisManager::CreateNtupleSColumn(const G4String& name) { if ( ! CheckName(name, "NtupleSColumn") ) return kInvalidId; - return fNtupleBookingManager->CreateNtupleSColumn(name); -} + return fNtupleBookingManager->CreateNtupleSColumn(name, nullptr); +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleIColumn(const G4String& name, +G4int G4VAnalysisManager::CreateNtupleIColumn(const G4String& name, std::vector& vector) { if ( ! CheckName(name, "NtupleIColumn") ) return kInvalidId; return fNtupleBookingManager->CreateNtupleIColumn(name, &vector); -} +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleFColumn(const G4String& name, +G4int G4VAnalysisManager::CreateNtupleFColumn(const G4String& name, std::vector& vector) { if ( ! CheckName(name, "NtupleFColumn") ) return kInvalidId; return fNtupleBookingManager->CreateNtupleFColumn(name, &vector); -} +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleDColumn(const G4String& name, +G4int G4VAnalysisManager::CreateNtupleDColumn(const G4String& name, std::vector& vector) { if ( ! CheckName(name, "NtupleDColumn") ) return kInvalidId; return fNtupleBookingManager->CreateNtupleDColumn(name, &vector); -} +} + +//_____________________________________________________________________________ +G4int G4VAnalysisManager::CreateNtupleSColumn(const G4String& name, + std::vector& vector) +{ + if ( ! CheckName(name, "NtupleDColumn") ) return kInvalidId; + + return fNtupleBookingManager->CreateNtupleSColumn(name, &vector); +} //_____________________________________________________________________________ void G4VAnalysisManager::FinishNtuple() -{ +{ auto ntupleBooking = fNtupleBookingManager->FinishNtuple(); if ( fVNtupleManager ) { @@ -841,23 +846,23 @@ void G4VAnalysisManager::FinishNtuple() } //_____________________________________________________________________________ -void G4VAnalysisManager::SetNtupleMerging(G4bool /*mergeNtuples*/, +void G4VAnalysisManager::SetNtupleMerging(G4bool /*mergeNtuples*/, G4int /*nofReducedNtupleFiles*/) { // The function is overridden in the managers which supports ntuple merging // Here we give just a warning that the feature is not available. - NtupleMergingWarning("G4VAnalysisManager::SetNtupleMerging", GetType()); + NtupleMergingWarning(fkClass, "SetNtupleMerging", GetType()); } //_____________________________________________________________________________ -void G4VAnalysisManager::SetNtupleRowWise(G4bool /*rowWise*/, +void G4VAnalysisManager::SetNtupleRowWise(G4bool /*rowWise*/, G4bool /*rowMode*/) { // The function is overridden in the managers which supports ntuple merging // Here we give just a warning that the feature is not available. - NtupleMergingWarning("G4VAnalysisManager::SetNtupleRowWise", GetType()); + NtupleMergingWarning(fkClass, "SetNtupleRowWise", GetType()); } //_____________________________________________________________________________ @@ -866,7 +871,7 @@ void G4VAnalysisManager::SetBasketSize(unsigned int /*basketSize*/) // The function is overridden in the managers which supports ntuple merging // Here we give just a warning that the feature is not available. - NtupleMergingWarning("G4VAnalysisManager::SetBasketSize", GetType()); + NtupleMergingWarning(fkClass, "SetBasketSize", GetType()); } //_____________________________________________________________________________ @@ -875,183 +880,179 @@ void G4VAnalysisManager::SetBasketEntries(unsigned int /*basketEntries*/) // The function is overridden in the managers which supports ntuple merging // Here we give just a warning that the feature is not available. - NtupleMergingWarning("G4VAnalysisManager::SetBasketEntries", GetType()); + NtupleMergingWarning(fkClass, "SetBasketEntries", GetType()); } //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleIColumn(G4int ntupleId, +G4int G4VAnalysisManager::CreateNtupleIColumn(G4int ntupleId, const G4String& name) { if ( ! CheckName(name, "NtupleIColumn") ) return kInvalidId; - return fNtupleBookingManager->CreateNtupleIColumn(ntupleId, name, 0); -} + return fNtupleBookingManager->CreateNtupleIColumn(ntupleId, name, nullptr); +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleFColumn(G4int ntupleId, +G4int G4VAnalysisManager::CreateNtupleFColumn(G4int ntupleId, const G4String& name) { if ( ! CheckName(name, "NtupleFColumn") ) return kInvalidId; - return fNtupleBookingManager->CreateNtupleFColumn(ntupleId, name, 0); -} + return fNtupleBookingManager->CreateNtupleFColumn(ntupleId, name, nullptr); +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleDColumn(G4int ntupleId, - const G4String& name) +G4int G4VAnalysisManager::CreateNtupleDColumn(G4int ntupleId, + const G4String& name) { if ( ! CheckName(name, "NtupleDColumn") ) return kInvalidId; - return fNtupleBookingManager->CreateNtupleDColumn(ntupleId, name, 0); -} + return fNtupleBookingManager->CreateNtupleDColumn(ntupleId, name, nullptr); +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleSColumn(G4int ntupleId, - const G4String& name) +G4int G4VAnalysisManager::CreateNtupleSColumn(G4int ntupleId, + const G4String& name) { if ( ! CheckName(name, "NtupleSColumn") ) return kInvalidId; - return fNtupleBookingManager->CreateNtupleSColumn(ntupleId, name); -} + return fNtupleBookingManager->CreateNtupleSColumn(ntupleId, name, nullptr); +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleIColumn(G4int ntupleId, - const G4String& name, +G4int G4VAnalysisManager::CreateNtupleIColumn(G4int ntupleId, + const G4String& name, std::vector& vector) { if ( ! CheckName(name, "NtupleIColumn") ) return kInvalidId; return fNtupleBookingManager->CreateNtupleIColumn(ntupleId, name, &vector); -} +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleFColumn(G4int ntupleId, - const G4String& name, +G4int G4VAnalysisManager::CreateNtupleFColumn(G4int ntupleId, + const G4String& name, std::vector& vector) { if ( ! CheckName(name, "NtupleFColumn") ) return kInvalidId; return fNtupleBookingManager->CreateNtupleFColumn(ntupleId, name, &vector); -} +} //_____________________________________________________________________________ -G4int G4VAnalysisManager::CreateNtupleDColumn(G4int ntupleId, - const G4String& name, +G4int G4VAnalysisManager::CreateNtupleDColumn(G4int ntupleId, + const G4String& name, std::vector& vector) { if ( ! CheckName(name, "NtupleDColumn") ) return kInvalidId; return fNtupleBookingManager->CreateNtupleDColumn(ntupleId, name, &vector); -} +} + +//_____________________________________________________________________________ +G4int G4VAnalysisManager::CreateNtupleSColumn(G4int ntupleId, + const G4String& name, + std::vector& vector) +{ + if ( ! CheckName(name, "NtupleDColumn") ) return kInvalidId; + + return fNtupleBookingManager->CreateNtupleSColumn(ntupleId, name, &vector); +} //_____________________________________________________________________________ void G4VAnalysisManager::FinishNtuple(G4int ntupleId) -{ +{ auto ntupleBooking = fNtupleBookingManager->FinishNtuple(ntupleId); if ( fVNtupleManager ) { fVNtupleManager->CreateNtuple(ntupleBooking); } } - + //_____________________________________________________________________________ -G4bool G4VAnalysisManager::SetFirstHistoId(G4int firstId) +G4bool G4VAnalysisManager::SetFirstHistoId(G4int firstId) { - G4bool finalResult = true; + auto result = true; - G4bool result = SetFirstH1Id(firstId); - finalResult = finalResult && result; - - result = SetFirstH2Id(firstId); - finalResult = finalResult && result; + result &= SetFirstH1Id(firstId); + result &= SetFirstH2Id(firstId); + result &= SetFirstH3Id(firstId); - result = SetFirstH3Id(firstId); - finalResult = finalResult && result; - - return finalResult; -} + return result; +} //_____________________________________________________________________________ -G4bool G4VAnalysisManager::SetFirstH1Id(G4int firstId) +G4bool G4VAnalysisManager::SetFirstH1Id(G4int firstId) { return fH1HnManager->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisManager::SetFirstH2Id(G4int firstId) +G4bool G4VAnalysisManager::SetFirstH2Id(G4int firstId) { return fH2HnManager->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisManager::SetFirstH3Id(G4int firstId) +G4bool G4VAnalysisManager::SetFirstH3Id(G4int firstId) { return fH3HnManager->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisManager::SetFirstProfileId(G4int firstId) +G4bool G4VAnalysisManager::SetFirstProfileId(G4int firstId) { - G4bool finalResult = true; + auto result = true; - G4bool result = SetFirstP1Id(firstId); - finalResult = finalResult && result; - - result = SetFirstP2Id(firstId); - finalResult = finalResult && result; - - return finalResult; -} + result &= SetFirstP1Id(firstId); + result &= SetFirstP2Id(firstId); + + return result; +} //_____________________________________________________________________________ -G4bool G4VAnalysisManager::SetFirstP1Id(G4int firstId) +G4bool G4VAnalysisManager::SetFirstP1Id(G4int firstId) { return fP1HnManager->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisManager::SetFirstP2Id(G4int firstId) +G4bool G4VAnalysisManager::SetFirstP2Id(G4int firstId) { return fP2HnManager->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisManager::SetFirstNtupleId(G4int firstId) +G4bool G4VAnalysisManager::SetFirstNtupleId(G4int firstId) { - auto finalResult = true; - - auto result = fNtupleBookingManager->SetFirstId(firstId); - finalResult = finalResult && result; + auto result = true; + result &= fNtupleBookingManager->SetFirstId(firstId); if ( fVNtupleManager ) { - result = fVNtupleManager->SetFirstId(firstId); - finalResult = finalResult && result; + result &= fVNtupleManager->SetFirstId(firstId); } - return finalResult; -} + return result; +} //_____________________________________________________________________________ -G4bool G4VAnalysisManager::SetFirstNtupleColumnId(G4int firstId) +G4bool G4VAnalysisManager::SetFirstNtupleColumnId(G4int firstId) { - auto finalResult = true; - - auto result = fNtupleBookingManager->SetFirstNtupleColumnId(firstId); - finalResult = finalResult && result; + auto result = true; + result &= fNtupleBookingManager->SetFirstNtupleColumnId(firstId); if ( fVNtupleManager ) { - result = fVNtupleManager->SetFirstNtupleColumnId(firstId); - finalResult = finalResult && result; + result &= fVNtupleManager->SetFirstNtupleColumnId(firstId); } - return finalResult; + return result; } // Fill methods in .icc //_____________________________________________________________________________ -void G4VAnalysisManager::SetActivation(G4bool activation) +void G4VAnalysisManager::SetActivation(G4bool activation) { fState.SetIsActivation(activation); } @@ -1061,40 +1062,40 @@ void G4VAnalysisManager::SetActivation(G4bool activation) //_____________________________________________________________________________ G4bool G4VAnalysisManager::IsActive() const { -// Return true if activation option is selected and any of managers has +// Return true if activation option is selected and any of managers has // an activated object. - return fState.GetIsActivation() && - ( fH1HnManager->IsActive() || - fH2HnManager->IsActive() || - fH3HnManager->IsActive() || - fP1HnManager->IsActive() || + return fState.GetIsActivation() && + ( fH1HnManager->IsActive() || + fH2HnManager->IsActive() || + fH3HnManager->IsActive() || + fP1HnManager->IsActive() || fP2HnManager->IsActive() ); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::IsAscii() const { // Return true any of managers has an object with activated ASCII option. - return ( fH1HnManager->IsAscii() || + return ( fH1HnManager->IsAscii() || fH2HnManager->IsAscii() || fH3HnManager->IsAscii() || fP1HnManager->IsAscii() || fP2HnManager->IsAscii() ); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisManager::IsPlotting() const { // Return true any of managers has an object with activated plotting option. - return ( fH1HnManager->IsPlotting() || + return ( fH1HnManager->IsPlotting() || fH2HnManager->IsPlotting() || fH3HnManager->IsPlotting() || fP1HnManager->IsPlotting() || fP2HnManager->IsPlotting() ); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetFirstH1Id() const @@ -1102,7 +1103,7 @@ G4int G4VAnalysisManager::GetFirstH1Id() const // Return first H1 id return fH1HnManager->GetFirstId(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetFirstH2Id() const @@ -1110,7 +1111,7 @@ G4int G4VAnalysisManager::GetFirstH2Id() const // Return first H2 id return fH2HnManager->GetFirstId(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetFirstH3Id() const @@ -1118,7 +1119,7 @@ G4int G4VAnalysisManager::GetFirstH3Id() const // Return first H3 id return fH3HnManager->GetFirstId(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetFirstP1Id() const @@ -1126,7 +1127,7 @@ G4int G4VAnalysisManager::GetFirstP1Id() const // Return first P1 id return fP1HnManager->GetFirstId(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetFirstP2Id() const @@ -1134,7 +1135,7 @@ G4int G4VAnalysisManager::GetFirstP2Id() const // Return first P2 id return fP2HnManager->GetFirstId(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetFirstNtupleId() const @@ -1142,7 +1143,7 @@ G4int G4VAnalysisManager::GetFirstNtupleId() const // Return first Ntuple id return fNtupleBookingManager->GetFirstId(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetFirstNtupleColumnId() const @@ -1150,45 +1151,45 @@ G4int G4VAnalysisManager::GetFirstNtupleColumnId() const // Return first Ntuple column id return fNtupleBookingManager->GetFirstNtupleColumnId(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetNofH1s() const { return fH1HnManager->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetNofH2s() const { return fH2HnManager->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetNofH3s() const { return fH3HnManager->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetNofP1s() const { return fP1HnManager->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetNofP2s() const { return fP2HnManager->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisManager::GetNofNtuples() const { return fVNtupleManager->GetNofNtuples(); -} +} -// GetH1Id(), GetH2Id in .icc +// GetH1Id(), GetH2Id in .icc //_____________________________________________________________________________ void G4VAnalysisManager::SetH1Activation(G4int id, G4bool activation) @@ -1196,7 +1197,7 @@ void G4VAnalysisManager::SetH1Activation(G4int id, G4bool activation) // Set activation to a given H1 object fH1HnManager->SetActivation(id, activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetH1Activation(G4bool activation) @@ -1204,24 +1205,24 @@ void G4VAnalysisManager::SetH1Activation(G4bool activation) // Set activation to all H1 objects fH1HnManager->SetActivation(activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetH1Ascii(G4int id, G4bool ascii) { fH1HnManager->SetAscii(id, ascii); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetH1Plotting(G4int id, G4bool plotting) { fH1HnManager->SetPlotting(id, plotting); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetH1FileName(G4int id, const G4String& fileName) { - fH1HnManager->SetFileName(id, fileName); + fH1HnManager->SetFileName(id, fileName); } //_____________________________________________________________________________ @@ -1230,7 +1231,7 @@ void G4VAnalysisManager::SetH2Activation(G4int id, G4bool activation) // Set activation to a given H2 object fH2HnManager->SetActivation(id, activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetH2Activation(G4bool activation) @@ -1238,7 +1239,7 @@ void G4VAnalysisManager::SetH2Activation(G4bool activation) // Set activation to all H2 objects fH2HnManager->SetActivation(activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetH2Ascii(G4int id, G4bool ascii) @@ -1250,12 +1251,12 @@ void G4VAnalysisManager::SetH2Ascii(G4int id, G4bool ascii) void G4VAnalysisManager::SetH2Plotting(G4int id, G4bool plotting) { fH2HnManager->SetPlotting(id, plotting); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetH2FileName(G4int id, const G4String& fileName) { - fH2HnManager->SetFileName(id, fileName); + fH2HnManager->SetFileName(id, fileName); } //_____________________________________________________________________________ @@ -1264,7 +1265,7 @@ void G4VAnalysisManager::SetH3Activation(G4int id, G4bool activation) // Set activation to a given H3 object fH3HnManager->SetActivation(id, activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetH3Activation(G4bool activation) @@ -1272,7 +1273,7 @@ void G4VAnalysisManager::SetH3Activation(G4bool activation) // Set activation to all H3 objects fH3HnManager->SetActivation(activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetH3Ascii(G4int id, G4bool ascii) @@ -1289,7 +1290,7 @@ void G4VAnalysisManager::SetH3Plotting(G4int id, G4bool plotting) //_____________________________________________________________________________ void G4VAnalysisManager::SetH3FileName(G4int id, const G4String& fileName) { - fH3HnManager->SetFileName(id, fileName); + fH3HnManager->SetFileName(id, fileName); } //_____________________________________________________________________________ @@ -1298,7 +1299,7 @@ void G4VAnalysisManager::SetP1Activation(G4int id, G4bool activation) // Set activation to a given P1 object fP1HnManager->SetActivation(id, activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetP1Activation(G4bool activation) @@ -1306,7 +1307,7 @@ void G4VAnalysisManager::SetP1Activation(G4bool activation) // Set activation to all P1 objects fP1HnManager->SetActivation(activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetP1Ascii(G4int id, G4bool ascii) @@ -1318,12 +1319,12 @@ void G4VAnalysisManager::SetP1Ascii(G4int id, G4bool ascii) void G4VAnalysisManager::SetP1Plotting(G4int id, G4bool plotting) { fP1HnManager->SetPlotting(id, plotting); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetP1FileName(G4int id, const G4String& fileName) { - fP1HnManager->SetFileName(id, fileName); + fP1HnManager->SetFileName(id, fileName); } //_____________________________________________________________________________ @@ -1332,7 +1333,7 @@ void G4VAnalysisManager::SetP2Activation(G4int id, G4bool activation) // Set activation to a given P2 object fP2HnManager->SetActivation(id, activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetP2Activation(G4bool activation) @@ -1340,7 +1341,7 @@ void G4VAnalysisManager::SetP2Activation(G4bool activation) // Set activation to all P2 objects fP2HnManager->SetActivation(activation); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetP2Ascii(G4int id, G4bool ascii) @@ -1352,12 +1353,12 @@ void G4VAnalysisManager::SetP2Ascii(G4int id, G4bool ascii) void G4VAnalysisManager::SetP2Plotting(G4int id, G4bool plotting) { fP2HnManager->SetPlotting(id, plotting); -} +} //_____________________________________________________________________________ void G4VAnalysisManager::SetP2FileName(G4int id, const G4String& fileName) { - fP2HnManager->SetFileName(id, fileName); + fP2HnManager->SetFileName(id, fileName); } //_____________________________________________________________________________ @@ -1401,10 +1402,10 @@ void G4VAnalysisManager::SetNtupleFileName(const G4String& fileName) // Access methods in .icc //_____________________________________________________________________________ -void G4VAnalysisManager::SetVerboseLevel(G4int verboseLevel) +void G4VAnalysisManager::SetVerboseLevel(G4int verboseLevel) { fState.SetVerboseLevel(verboseLevel); -} +} -// GetVerboseLevel() in .icc +// GetVerboseLevel() in .icc diff --git a/source/analysis/management/src/G4VAnalysisReader.cc b/source/analysis/management/src/G4VAnalysisReader.cc index bbdeb2f704..f39e72e916 100644 --- a/source/analysis/management/src/G4VAnalysisReader.cc +++ b/source/analysis/management/src/G4VAnalysisReader.cc @@ -28,7 +28,6 @@ #include "G4VAnalysisReader.hh" #include "G4AnalysisUtilities.hh" -#include "G4BaseFileManager.hh" #include "G4HnManager.hh" #include "G4VH1Manager.hh" #include "G4VH2Manager.hh" @@ -36,445 +35,433 @@ #include "G4VP1Manager.hh" #include "G4VP2Manager.hh" #include "G4VRNtupleManager.hh" - -#include +#include "G4VRFileManager.hh" +#include "G4Threading.hh" using namespace G4Analysis; //_____________________________________________________________________________ -G4VAnalysisReader::G4VAnalysisReader(const G4String& type, G4bool isMaster) - : fState(type, isMaster), - fVH1Manager(nullptr), - fVH2Manager(nullptr), - fVH3Manager(nullptr), - fVP1Manager(nullptr), - fVP2Manager(nullptr), - fVNtupleManager(nullptr), - fFileManager(nullptr) +G4VAnalysisReader::G4VAnalysisReader(const G4String& type) + : fState(type, ! G4Threading::IsWorkerThread()) {} //_____________________________________________________________________________ -G4VAnalysisReader::~G4VAnalysisReader() -{} +G4VAnalysisReader::~G4VAnalysisReader() = default; -// +// // protected methods // - + //_____________________________________________________________________________ void G4VAnalysisReader::SetH1Manager(G4VH1Manager* h1Manager) { fVH1Manager.reset(h1Manager); -} +} //_____________________________________________________________________________ void G4VAnalysisReader::SetH2Manager(G4VH2Manager* h2Manager) { fVH2Manager.reset(h2Manager); -} +} //_____________________________________________________________________________ void G4VAnalysisReader::SetH3Manager(G4VH3Manager* h3Manager) { fVH3Manager.reset(h3Manager); -} +} //_____________________________________________________________________________ void G4VAnalysisReader::SetP1Manager(G4VP1Manager* p1Manager) { fVP1Manager.reset(p1Manager); -} +} //_____________________________________________________________________________ void G4VAnalysisReader::SetP2Manager(G4VP2Manager* p2Manager) { fVP2Manager.reset(p2Manager); -} +} //_____________________________________________________________________________ -void G4VAnalysisReader::SetNtupleManager(G4VRNtupleManager* ntupleManager) +void G4VAnalysisReader::SetNtupleManager(std::shared_ptr ntupleManager) { - fVNtupleManager.reset(ntupleManager); -} + fVNtupleManager = std::move(ntupleManager); +} //_____________________________________________________________________________ -void G4VAnalysisReader::SetFileManager(G4BaseFileManager* fileManager) +void G4VAnalysisReader::SetFileManager(std::shared_ptr fileManager) { - fFileManager.reset(fileManager); -} + fVFileManager = std::move(fileManager); +} -// +// // public methods // +//_____________________________________________________________________________ +G4bool G4VAnalysisReader::CloseFiles(G4bool reset) +{ + return CloseFilesImpl(reset); +} + //_____________________________________________________________________________ void G4VAnalysisReader::SetFileName(const G4String& fileName) -{ - fFileManager->SetFileName(fileName); +{ + fVFileManager->SetFileName(fileName); } //_____________________________________________________________________________ -G4String G4VAnalysisReader::GetFileName() const -{ - return fFileManager->GetFileName(); +G4String G4VAnalysisReader::GetFileName() const +{ + return fVFileManager->GetFileName(); } //_____________________________________________________________________________ -G4int G4VAnalysisReader::ReadH1(const G4String& h1Name, +G4int G4VAnalysisReader::ReadH1(const G4String& h1Name, const G4String& fileName, const G4String& dirName) { if ( fileName != "" ) { return ReadH1Impl(h1Name, fileName, dirName, true); } - else { - if ( fFileManager->GetFileName() == "" ) { - G4ExceptionDescription description; - description - << "Cannot get H1. File name has to be set first."; - G4Exception("G4VAnalysisReader::ReadH1()", - "Analysis_WR011", JustWarning, description); + else { + if ( fVFileManager->GetFileName() == "" ) { + Warn("Cannot get H1 " + h1Name + ". File name has to be set first.", + fkClass, "ReadH1"); return kInvalidId; - } - return ReadH1Impl(h1Name, fFileManager->GetFileName(), dirName, false); - } -} + } + return ReadH1Impl(h1Name, fVFileManager->GetFileName(), dirName, false); + } +} //_____________________________________________________________________________ -G4int G4VAnalysisReader::ReadH2(const G4String& h2Name, +G4int G4VAnalysisReader::ReadH2(const G4String& h2Name, const G4String& fileName, const G4String& dirName) { if ( fileName != "" ) { return ReadH2Impl(h2Name, fileName, dirName, true); } - else { - if ( fFileManager->GetFileName() == "" ) { - G4ExceptionDescription description; - description - << "Cannot get H2. File name has to be set first."; - G4Exception("G4VAnalysisReader::ReadH2()", - "Analysis_WR011", JustWarning, description); + else { + if ( fVFileManager->GetFileName() == "" ) { + Warn("Cannot get H2 " + h2Name + ". File name has to be set first.", + fkClass, "ReadH2"); return kInvalidId; - } - return ReadH2Impl(h2Name, fFileManager->GetFileName(), dirName, false); - } -} + } + return ReadH2Impl(h2Name, fVFileManager->GetFileName(), dirName, false); + } +} //_____________________________________________________________________________ -G4int G4VAnalysisReader::ReadH3(const G4String& h3Name, +G4int G4VAnalysisReader::ReadH3(const G4String& h3Name, const G4String& fileName, const G4String& dirName) { if ( fileName != "" ) { return ReadH3Impl(h3Name, fileName, dirName, true); } - else { - if ( fFileManager->GetFileName() == "" ) { - G4ExceptionDescription description; - description - << "Cannot get H3. File name has to be set first."; - G4Exception("G4VAnalysisReader::ReadH2()", - "Analysis_WR011", JustWarning, description); + else { + if ( fVFileManager->GetFileName() == "" ) { + Warn("Cannot get H3 " + h3Name + ". File name has to be set first.", + fkClass, "ReadH3"); return kInvalidId; - } - return ReadH3Impl(h3Name, fFileManager->GetFileName(), dirName, false); - } -} + } + return ReadH3Impl(h3Name, fVFileManager->GetFileName(), dirName, false); + } +} //_____________________________________________________________________________ -G4int G4VAnalysisReader::ReadP1(const G4String& p1Name, +G4int G4VAnalysisReader::ReadP1(const G4String& p1Name, const G4String& fileName, const G4String& dirName) { if ( fileName != "" ) { return ReadP1Impl(p1Name, fileName, dirName, true); } - else { - if ( fFileManager->GetFileName() == "" ) { - G4ExceptionDescription description; - description - << "Cannot get P1. File name has to be set first."; - G4Exception("G4VAnalysisReader::ReadP1()", - "Analysis_WR011", JustWarning, description); + else { + if ( fVFileManager->GetFileName() == "" ) { + Warn("Cannot get P1 " + p1Name + ". File name has to be set first.", + fkClass, "ReadP1"); return kInvalidId; - } - return ReadP1Impl(p1Name, fFileManager->GetFileName(), dirName, false); - } -} + } + return ReadP1Impl(p1Name, fVFileManager->GetFileName(), dirName, false); + } +} //_____________________________________________________________________________ -G4int G4VAnalysisReader::ReadP2(const G4String& p2Name, +G4int G4VAnalysisReader::ReadP2(const G4String& p2Name, const G4String& fileName, const G4String& dirName) { if ( fileName != "" ) { return ReadP2Impl(p2Name, fileName, dirName, true); } - else { - if ( fFileManager->GetFileName() == "" ) { - G4ExceptionDescription description; - description - << "Cannot get P2. File name has to be set first."; - G4Exception("G4VAnalysisReader::ReadP2()", - "Analysis_WR011", JustWarning, description); + else { + if ( fVFileManager->GetFileName() == "" ) { + Warn("Cannot get P2 " + p2Name + ". File name has to be set first.", + fkClass, "ReadP2"); return kInvalidId; - } - return ReadP2Impl(p2Name, fFileManager->GetFileName(), dirName, false); - } -} + } + return ReadP2Impl(p2Name, fVFileManager->GetFileName(), dirName, false); + } +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetFirstHistoId(G4int firstId) +G4bool G4VAnalysisReader::SetFirstHistoId(G4int firstId) { - G4bool finalResult = true; + auto result = true; - G4bool result = SetFirstH1Id(firstId); - finalResult = finalResult && result; - - result = SetFirstH2Id(firstId); - finalResult = finalResult && result; + result &= SetFirstH1Id(firstId); + result &= SetFirstH2Id(firstId); + result &= SetFirstH3Id(firstId); - result = SetFirstH3Id(firstId); - finalResult = finalResult && result; - - return finalResult; -} + return result; +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetFirstH1Id(G4int firstId) +G4bool G4VAnalysisReader::SetFirstH1Id(G4int firstId) { return fVH1Manager->GetHnManager()->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetFirstH2Id(G4int firstId) +G4bool G4VAnalysisReader::SetFirstH2Id(G4int firstId) { return fVH2Manager->GetHnManager()->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetFirstH3Id(G4int firstId) +G4bool G4VAnalysisReader::SetFirstH3Id(G4int firstId) { return fVH3Manager->GetHnManager()->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetFirstProfileId(G4int firstId) +G4bool G4VAnalysisReader::SetFirstProfileId(G4int firstId) { - G4bool finalResult = true; + auto result = true; - G4bool result = SetFirstP1Id(firstId); - finalResult = finalResult && result; - - result = SetFirstP2Id(firstId); - finalResult = finalResult && result; + result &= SetFirstP1Id(firstId); + result &= SetFirstP2Id(firstId); - return finalResult; -} + return result; +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetFirstP1Id(G4int firstId) +G4bool G4VAnalysisReader::SetFirstP1Id(G4int firstId) { return fVP1Manager->GetHnManager()->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetFirstP2Id(G4int firstId) +G4bool G4VAnalysisReader::SetFirstP2Id(G4int firstId) { return fVP2Manager->GetHnManager()->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetFirstNtupleId(G4int firstId) +G4bool G4VAnalysisReader::SetFirstNtupleId(G4int firstId) { return fVNtupleManager->SetFirstId(firstId); -} +} //_____________________________________________________________________________ -G4int G4VAnalysisReader::GetNtuple(const G4String& ntupleName, +G4int G4VAnalysisReader::GetNtuple(const G4String& ntupleName, const G4String& fileName, const G4String& dirName) { if ( fileName != "" ) { - return ReadNtupleImpl(ntupleName, fileName, dirName, true); + return fVNtupleManager->ReadNtupleImpl(ntupleName, fileName, dirName, true); } - else { + else { // Check if fileName was set - if ( fFileManager->GetFileName() == "" ) { - G4ExceptionDescription description; - description - << "Cannot get Ntuple. File name has to be set first."; - G4Exception("G4VAnalysisReader::GetNtuple()", - "Analysis_WR011", JustWarning, description); + if ( fVFileManager->GetFileName() == "" ) { + Warn("Cannot read Ntuple " + ntupleName += ". File name has to be set first.", + fkClass, "ReadNtuple"); return kInvalidId; - } - return ReadNtupleImpl(ntupleName, fFileManager->GetFileName(), dirName, false); - } -} + } + return fVNtupleManager->ReadNtupleImpl( + ntupleName, fVFileManager->GetFileName(), dirName, false); + } +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleIColumn(const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleIColumn(const G4String& columnName, G4int& value) { return fVNtupleManager->SetNtupleIColumn(columnName, value); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleFColumn(const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleFColumn(const G4String& columnName, G4float& value) { return fVNtupleManager->SetNtupleFColumn(columnName, value); -} - +} + //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleDColumn(const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleDColumn(const G4String& columnName, G4double& value) { return fVNtupleManager->SetNtupleDColumn(columnName, value); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleSColumn(const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleSColumn(const G4String& columnName, G4String& value) { return fVNtupleManager->SetNtupleSColumn(columnName, value); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleIColumn(const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleIColumn(const G4String& columnName, std::vector& vector) { return fVNtupleManager->SetNtupleIColumn(columnName, vector); -} - +} + //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleFColumn(const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleFColumn(const G4String& columnName, std::vector& vector) { return fVNtupleManager->SetNtupleFColumn(columnName, vector); -} - +} + //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleDColumn(const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleDColumn(const G4String& columnName, std::vector& vector) { return fVNtupleManager->SetNtupleDColumn(columnName, vector); -} - +} + +//_____________________________________________________________________________ +G4bool G4VAnalysisReader::SetNtupleSColumn(const G4String& columnName, + std::vector& vector) +{ + return fVNtupleManager->SetNtupleSColumn(columnName, vector); +} + //_____________________________________________________________________________ G4bool G4VAnalysisReader::SetNtupleIColumn(G4int ntupleId, - const G4String& columnName, + const G4String& columnName, G4int& value) { return fVNtupleManager->SetNtupleIColumn(ntupleId, columnName, value); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisReader::SetNtupleFColumn(G4int ntupleId, - const G4String& columnName, + const G4String& columnName, G4float& value) { return fVNtupleManager->SetNtupleFColumn(ntupleId, columnName, value); -} - +} + //_____________________________________________________________________________ G4bool G4VAnalysisReader::SetNtupleDColumn(G4int ntupleId, - const G4String& columnName, + const G4String& columnName, G4double& value) { return fVNtupleManager->SetNtupleDColumn(ntupleId, columnName, value); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisReader::SetNtupleSColumn(G4int ntupleId, - const G4String& columnName, + const G4String& columnName, G4String& value) { return fVNtupleManager->SetNtupleSColumn(ntupleId, columnName, value); -} +} //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleIColumn(G4int ntupleId, - const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleIColumn(G4int ntupleId, + const G4String& columnName, std::vector& vector) { return fVNtupleManager->SetNtupleIColumn(ntupleId, columnName, vector); } - + //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleFColumn(G4int ntupleId, - const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleFColumn(G4int ntupleId, + const G4String& columnName, std::vector& vector) { return fVNtupleManager->SetNtupleFColumn(ntupleId, columnName, vector); } //_____________________________________________________________________________ -G4bool G4VAnalysisReader::SetNtupleDColumn(G4int ntupleId, - const G4String& columnName, +G4bool G4VAnalysisReader::SetNtupleDColumn(G4int ntupleId, + const G4String& columnName, std::vector& vector) { return fVNtupleManager->SetNtupleDColumn(ntupleId, columnName, vector); } +//_____________________________________________________________________________ +G4bool G4VAnalysisReader::SetNtupleSColumn(G4int ntupleId, + const G4String& columnName, + std::vector& vector) +{ + return fVNtupleManager->SetNtupleSColumn(ntupleId, columnName, vector); +} + //_____________________________________________________________________________ G4bool G4VAnalysisReader::GetNtupleRow() { return fVNtupleManager->GetNtupleRow(); -} +} //_____________________________________________________________________________ G4bool G4VAnalysisReader::GetNtupleRow(G4int ntupleId) { return fVNtupleManager->GetNtupleRow(ntupleId); -} +} //_____________________________________________________________________________ G4int G4VAnalysisReader::GetNofH1s() const { return fVH1Manager->GetHnManager()->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisReader::GetNofH2s() const { return fVH2Manager->GetHnManager()->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisReader::GetNofH3s() const { return fVH3Manager->GetHnManager()->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisReader::GetNofP1s() const { return fVP1Manager->GetHnManager()->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisReader::GetNofP2s() const { return fVP2Manager->GetHnManager()->GetNofHns(); -} +} //_____________________________________________________________________________ G4int G4VAnalysisReader::GetNofNtuples() const { return fVNtupleManager->GetNofNtuples(); -} +} -// GetH1Id(), GetH2Id in .icc +// GetH1Id(), GetH2Id in .icc // Access methods in .icc //_____________________________________________________________________________ -void G4VAnalysisReader::SetVerboseLevel(G4int verboseLevel) +void G4VAnalysisReader::SetVerboseLevel(G4int verboseLevel) { fState.SetVerboseLevel(verboseLevel); -} +} -// GetVerboseLevel() in .icc +// GetVerboseLevel() in .icc diff --git a/source/analysis/management/src/G4VFileManager.cc b/source/analysis/management/src/G4VFileManager.cc index ffd830640d..26d495fd4f 100644 --- a/source/analysis/management/src/G4VFileManager.cc +++ b/source/analysis/management/src/G4VFileManager.cc @@ -30,32 +30,19 @@ #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" -#include "G4Threading.hh" +using namespace G4Analysis; //_____________________________________________________________________________ G4VFileManager::G4VFileManager(const G4AnalysisManagerState& state) - : G4BaseFileManager(state), - fHistoDirectoryName(""), - fNtupleDirectoryName(""), - fIsOpenFile(false), - fLockDirectoryNames(false), - fH1FileManager(nullptr), - fH2FileManager(nullptr), - fH3FileManager(nullptr), - fP1FileManager(nullptr), - fP2FileManager(nullptr) + : G4BaseFileManager(state) {} -//_____________________________________________________________________________ -G4VFileManager::~G4VFileManager() -{} - -// +// // public methods // //_____________________________________________________________________________ -G4bool G4VFileManager::SetFileName(const G4String& fileName) +G4bool G4VFileManager::SetFileName(const G4String& fileName) { // Check extension auto name = fileName; @@ -63,45 +50,34 @@ G4bool G4VFileManager::SetFileName(const G4String& fileName) if ( extension.size() && GetFileType().size() && extension != GetFileType() ) { // replace extension name = G4Analysis::GetBaseName(fileName) + "." + GetFileType(); - G4ExceptionDescription description; - description - << fileName << " file extension is not valid for " - << GetFileType() << " output." << G4endl - << name << " will be used."; - G4Exception("G4VFileManager::SetFileName()", - "Analysis_W012", JustWarning, description); - } + Warn(fileName + " file extension is not valid for " + GetFileType() + " output.\n" + + name + " will be used.", fkClass, "SetFileName"); + } return G4BaseFileManager::SetFileName(name); } //_____________________________________________________________________________ -G4bool G4VFileManager::SetHistoDirectoryName(const G4String& dirName) +G4bool G4VFileManager::SetHistoDirectoryName(const G4String& dirName) { if ( fLockDirectoryNames ) { - G4ExceptionDescription description; - description - << "Cannot set Histo directory name as its value was already used."; - G4Exception("G4VFileManager::SetHistoDirectoryName()", - "Analysis_W012", JustWarning, description); + Warn("Cannot set Histo directory name as its value was already used.", + fkClass, "SetHistoDirectoryName"); return false; - } + } fHistoDirectoryName = dirName; return true; -} +} //_____________________________________________________________________________ -G4bool G4VFileManager::SetNtupleDirectoryName(const G4String& dirName) +G4bool G4VFileManager::SetNtupleDirectoryName(const G4String& dirName) { if ( fLockDirectoryNames ) { - G4ExceptionDescription description; - description - << "Cannot set Ntuple directory name as its value was already used."; - G4Exception("G4VFileManager::SetNtupleDirectoryName()", - "Analysis_W012", JustWarning, description); + Warn("Cannot set Ntuple directory name as its value was already used.", + fkClass, "SetNtupleDirectoryName"); return false; - } + } fNtupleDirectoryName = dirName; return true; diff --git a/source/analysis/management/src/G4VNtupleFileManager.cc b/source/analysis/management/src/G4VNtupleFileManager.cc index afc4efe48d..014c5d4193 100644 --- a/source/analysis/management/src/G4VNtupleFileManager.cc +++ b/source/analysis/management/src/G4VNtupleFileManager.cc @@ -27,22 +27,20 @@ // Author: Ivana Hrivnacova, 15/09/2020 (ivana@ipno.in2p3.fr) #include "G4VNtupleFileManager.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" -#include +using namespace G4Analysis; namespace { //_____________________________________________________________________________ -void NtupleMergingWarning(const G4String& functionName, +void NtupleMergingWarning(std::string_view className, + std::string_view functionName, const G4String& outputType) { - G4ExceptionDescription description; - description - << " " << "Ntuple merging is not available with " - << outputType << " output." << G4endl - << " " << "Setting is ignored."; - G4Exception(functionName, "Analysis_W041", JustWarning, description); + Warn("Ntuple merging is not available with " + outputType + " output.\n" + + "Setting is ignored.", className, functionName); } } @@ -51,32 +49,27 @@ void NtupleMergingWarning(const G4String& functionName, G4VNtupleFileManager::G4VNtupleFileManager(const G4AnalysisManagerState& state, const G4String& fileType) : fState(state), - fFileType(fileType), - fBookingManager(nullptr) + fFileType(fileType) {} -//_____________________________________________________________________________ -G4VNtupleFileManager::~G4VNtupleFileManager() -{} - -//_____________________________________________________________________________ -void G4VNtupleFileManager::SetNtupleMerging(G4bool /*mergeNtuples*/, +///_____________________________________________________________________________ +void G4VNtupleFileManager::SetNtupleMerging(G4bool /*mergeNtuples*/, G4int /*nofReducedNtupleFiles*/) { // The function is overridden in the managers which supports ntuple merging // Here we give just a warning that the feature is not available. - NtupleMergingWarning("G4VNtupleFileManager::SetNtupleMerging", fFileType); + NtupleMergingWarning(fkClass, "SetNtupleMerging", fFileType); } //_____________________________________________________________________________ -void G4VNtupleFileManager::SetNtupleRowWise(G4bool /*rowWise*/, +void G4VNtupleFileManager::SetNtupleRowWise(G4bool /*rowWise*/, G4bool /*rowMode*/) { // The function is overridden in the managers which supports ntuple merging // Here we give just a warning that the feature is not available. - NtupleMergingWarning("G4VNtupleFileManager::SetNtupleRowWise", fFileType); + NtupleMergingWarning(fkClass, "SetNtupleRowWise", fFileType); } //_____________________________________________________________________________ @@ -85,7 +78,7 @@ void G4VNtupleFileManager::SetBasketSize(unsigned int /*basketSize*/) // The function is overridden in the managers which supports ntuple merging // Here we give just a warning that the feature is not available. - NtupleMergingWarning("G4VNtupleFileManager::SetBasketSize", fFileType); + NtupleMergingWarning(fkClass, "SetBasketSize", fFileType); } //_____________________________________________________________________________ @@ -94,5 +87,5 @@ void G4VNtupleFileManager::SetBasketEntries(unsigned int /*basketEntries*/) // The function is overridden in the managers which supports ntuple merging // Here we give just a warning that the feature is not available. - NtupleMergingWarning("G4VNtupleFileManager::SetBasketEntries", fFileType); + NtupleMergingWarning(fkClass, "SetBasketEntries", fFileType); } diff --git a/source/analysis/root/include/G4RootAnalysisManager.hh b/source/analysis/root/include/G4RootAnalysisManager.hh index 008e21167f..a979bd57ea 100644 --- a/source/analysis/root/include/G4RootAnalysisManager.hh +++ b/source/analysis/root/include/G4RootAnalysisManager.hh @@ -25,7 +25,7 @@ // // The main manager for Root analysis. -// It delegates most of functions to the object specific managers. +// It delegates most of functions to the object specific managers. // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) @@ -39,25 +39,29 @@ #include "tools/histo/hmpi" #include +#include +class G4RootAnalysisManager; class G4RootFileManager; class G4RootNtupleFileManager; +template +class G4ThreadLocalSingleton; namespace tools { namespace wroot { -class directory; +class directory; } } class G4RootAnalysisManager : public G4ToolsAnalysisManager { friend class G4RootMpiAnalysisManager; + friend class G4ThreadLocalSingleton; public: - explicit G4RootAnalysisManager(G4bool isMaster = true); virtual ~G4RootAnalysisManager(); - - // static methods + + // Static methods static G4RootAnalysisManager* Instance(); static G4bool IsInstance(); @@ -72,7 +76,7 @@ class G4RootAnalysisManager : public G4ToolsAnalysisManager std::vector::const_iterator EndConstNtuple() const; // MT/MPI - virtual void SetNtupleMerging(G4bool mergeNtuples, + virtual void SetNtupleMerging(G4bool mergeNtuples, G4int nofReducedNtupleFiles = 0) override; virtual void SetNtupleRowWise(G4bool rowWise, G4bool rowMode = true) override; virtual void SetBasketSize(unsigned int basketSize) override; @@ -82,31 +86,21 @@ class G4RootAnalysisManager : public G4ToolsAnalysisManager // virtual methods from base class virtual G4bool OpenFileImpl(const G4String& fileName) override; virtual G4bool WriteImpl() override; - virtual G4bool CloseFileImpl(G4bool reset) override; + virtual G4bool CloseFileImpl(G4bool reset) override; + virtual G4bool ResetImpl() override; virtual G4bool IsOpenFileImpl() const final; - // virtual functions (overriden in MPI implementation) - virtual G4bool Reset(); - private: - // static data members - static G4RootAnalysisManager* fgMasterInstance; - static G4ThreadLocal G4RootAnalysisManager* fgInstance; + G4RootAnalysisManager(); - // methods - template - G4bool WriteT(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType); - G4bool WriteH1(); - G4bool WriteH2(); - G4bool WriteH3(); - G4bool WriteP1(); - G4bool WriteP2(); + // Static data members + inline static G4RootAnalysisManager* fgMasterInstance { nullptr }; + inline static G4ThreadLocal G4bool fgIsInstance { false }; + static constexpr std::string_view fkClass { "G4RootAnalysisManager" }; - // data members - std::shared_ptr fFileManager; - std::shared_ptr fNtupleFileManager; + // data members + std::shared_ptr fFileManager { nullptr }; + std::shared_ptr fNtupleFileManager { nullptr }; }; #include "G4RootAnalysisManager.icc" diff --git a/source/analysis/root/include/G4RootAnalysisManager.icc b/source/analysis/root/include/G4RootAnalysisManager.icc index c0a1e4cbde..441b7619f5 100644 --- a/source/analysis/root/include/G4RootAnalysisManager.icc +++ b/source/analysis/root/include/G4RootAnalysisManager.icc @@ -28,46 +28,6 @@ #include "G4RootNtupleFileManager.hh" #include "G4RootFileManager.hh" -#include "tools/wroot/to" -#include "tools/wroot/file" - -//_____________________________________________________________________________ -template -inline -G4bool G4RootAnalysisManager::WriteT(const std::vector& htVector, - const std::vector& hnVector, - const G4String& hnType) -{ - // Do nothing if there is no file - if ( ! fFileManager->GetFile() ) return true; - - auto directory = std::get<1>(*fFileManager->GetFile()); - - for ( G4int i=0; iGetActivation(); - auto name = info->GetName(); - // skip writing if activation is enabled and H1 is inactivated - if ( fState.GetIsActivation() && ( ! activation ) ) continue; - auto ht = htVector[i]; -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3()->Message("write", hnType, name); -#endif - G4bool result - = to(*directory, *ht, name); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "saving " << hnType << " " << name << " failed"; - G4Exception("G4RootAnalysisManager::Write()", - "Analysis_W022", JustWarning, description); - return false; - } - } - - return true; -} - //_____________________________________________________________________________ inline G4bool G4RootAnalysisManager::IsOpenFileImpl() const @@ -80,41 +40,41 @@ inline tools::wroot::ntuple* G4RootAnalysisManager::GetNtuple() const { return fNtupleFileManager->GetNtupleManager()->GetNtuple(); -} +} //_____________________________________________________________________________ inline tools::wroot::ntuple* G4RootAnalysisManager::GetNtuple(G4int ntupleId) const { return fNtupleFileManager->GetNtupleManager()->GetNtuple(ntupleId); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4RootAnalysisManager::BeginNtuple() { return fNtupleFileManager->GetNtupleManager()->BeginNtuple(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4RootAnalysisManager::EndNtuple() { return fNtupleFileManager->GetNtupleManager()->EndNtuple(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4RootAnalysisManager::BeginConstNtuple() const { return fNtupleFileManager->GetNtupleManager()->BeginConstNtuple(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4RootAnalysisManager::EndConstNtuple() const { return fNtupleFileManager->GetNtupleManager()->EndConstNtuple(); -} +} diff --git a/source/analysis/root/include/G4RootAnalysisReader.hh b/source/analysis/root/include/G4RootAnalysisReader.hh index 2d77b6dbce..7293f49f3a 100644 --- a/source/analysis/root/include/G4RootAnalysisReader.hh +++ b/source/analysis/root/include/G4RootAnalysisReader.hh @@ -25,7 +25,7 @@ // // The main manager for Root analysis reader. -// It delegates most of functions to the object specific managers. +// It delegates most of functions to the object specific managers. // Author: Ivana Hrivnacova, 09/04/2014 (ivana@ipno.in2p3.fr) @@ -35,66 +35,51 @@ #include "G4ToolsAnalysisReader.hh" #include "globals.hh" -#include "tools/histo/h1d" -#include "tools/histo/h2d" -#include "tools/histo/h3d" -#include "tools/histo/p1d" -#include "tools/histo/p2d" #include "tools/rroot/ntuple" +#include +#include + +class G4RootAnalysisReader; class G4RootRFileManager; -class G4H1ToolsManager; -class G4H2ToolsManager; -class G4H3ToolsManager; -class G4P1ToolsManager; -class G4P2ToolsManager; class G4RootRNtupleManager; - +template +class G4ThreadLocalSingleton; + class G4RootAnalysisReader : public G4ToolsAnalysisReader { + friend class G4ThreadLocalSingleton; + public: - explicit G4RootAnalysisReader(G4bool isMaster = true); virtual ~G4RootAnalysisReader(); - - // static methods + + // Static methods static G4RootAnalysisReader* Instance(); - + // Access methods tools::rroot::ntuple* GetNtuple() const; tools::rroot::ntuple* GetNtuple(G4int ntupleId) const; using G4VAnalysisReader::GetNtuple; - - protected: - // virtual methods from base class - virtual G4int ReadH1Impl(const G4String& h1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadH2Impl(const G4String& h2Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadH3Impl(const G4String& h3Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadP1Impl(const G4String& p1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadP2Impl(const G4String& p2Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadNtupleImpl(const G4String& ntupleName, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - - private: - // static data members - static G4RootAnalysisReader* fgMasterInstance; - static G4ThreadLocal G4RootAnalysisReader* fgInstance; - // methods - // - tools::rroot::buffer* GetBuffer( - const G4String& fileName, - const G4String& name, - const G4String& inFunction); + protected: + G4RootAnalysisReader(); + + // // Virtual methods from base class + virtual G4bool CloseFilesImpl(G4bool reset) final; + + private: + // Static data members + inline static G4RootAnalysisReader* fgMasterInstance { nullptr }; + + // Methods G4bool Reset(); - // data members - G4RootRNtupleManager* fNtupleManager; - G4RootRFileManager* fFileManager; + // Static data members + static constexpr std::string_view fkClass { "G4RootAnalysisReader" }; + + // Data members + std::shared_ptr fNtupleManager { nullptr }; + std::shared_ptr fFileManager { nullptr }; }; #include "G4RootAnalysisReader.icc" diff --git a/source/analysis/root/include/G4RootAnalysisReader.icc b/source/analysis/root/include/G4RootAnalysisReader.icc index 0217d5694c..886189cc71 100644 --- a/source/analysis/root/include/G4RootAnalysisReader.icc +++ b/source/analysis/root/include/G4RootAnalysisReader.icc @@ -31,11 +31,11 @@ inline tools::rroot::ntuple* G4RootAnalysisReader::GetNtuple() const { return fNtupleManager->GetNtuple(); -} +} //_____________________________________________________________________________ inline tools::rroot::ntuple* G4RootAnalysisReader::GetNtuple(G4int ntupleId) const { return fNtupleManager->GetNtuple(ntupleId); -} +} diff --git a/source/analysis/root/include/G4RootFileManager.hh b/source/analysis/root/include/G4RootFileManager.hh index 1db3b51fa9..339c676582 100644 --- a/source/analysis/root/include/G4RootFileManager.hh +++ b/source/analysis/root/include/G4RootFileManager.hh @@ -33,16 +33,18 @@ #include "G4VTFileManager.hh" #include "G4RootFileDef.hh" +#include "G4AnalysisUtilities.hh" #include "globals.hh" #include #include #include +#include namespace tools { namespace wroot{ -class ntuple; -} +class ntuple; +} } // Types alias @@ -52,7 +54,8 @@ class G4RootFileManager : public G4VTFileManager { public: explicit G4RootFileManager(const G4AnalysisManagerState& state); - virtual ~G4RootFileManager(); + G4RootFileManager() = delete; + virtual ~G4RootFileManager() = default; using G4BaseFileManager::GetNtupleFileName; using G4VTFileManager::WriteFile; @@ -64,13 +67,13 @@ class G4RootFileManager : public G4VTFileManager virtual G4String GetFileType() const final { return "root"; } // Specific methods for files per objects - std::shared_ptr CreateNtupleFile(RootNtupleDescription* ntupleDescription, + std::shared_ptr CreateNtupleFile(RootNtupleDescription* ntupleDescription, G4int mainNumber = -1); - std::shared_ptr GetNtupleFile(RootNtupleDescription* ntupleDescription, + std::shared_ptr GetNtupleFile(RootNtupleDescription* ntupleDescription, G4bool perThread = true, G4int mainNumber = -1) const; G4bool WriteNtupleFile(RootNtupleDescription* ntupleDescription); - G4bool CloseNtupleFile(RootNtupleDescription* ntupleDescription); + G4bool CloseNtupleFile(RootNtupleDescription* ntupleDescription); // Set methods void SetBasketSize(unsigned int basketSize); @@ -84,32 +87,35 @@ class G4RootFileManager : public G4VTFileManager // Methods derived from templated base class virtual std::shared_ptr CreateFileImpl(const G4String& fileName) final; virtual G4bool WriteFileImpl(std::shared_ptr file) final; - virtual G4bool CloseFileImpl(std::shared_ptr file) final; + virtual G4bool CloseFileImpl(std::shared_ptr file) final; private: - // methods + // Methods tools::wroot::directory* CreateDirectory( - std::shared_ptr rfile, - const G4String& directoryName, + tools::wroot::file* rfile, + const G4String& directoryName, const G4String& objectType) const; G4String GetNtupleFileName( - RootNtupleDescription* ntupleDescription, + RootNtupleDescription* ntupleDescription, G4bool perThread = true, G4int mainNumber = -1) const; - // data members - unsigned int fBasketSize; - unsigned int fBasketEntries; + // Static data members + static constexpr std::string_view fkClass { "G4RootFileManager" }; + + // Data members + unsigned int fBasketSize { G4Analysis::kDefaultBasketSize }; + unsigned int fBasketEntries { G4Analysis::kDefaultBasketEntries }; }; // inline functions //_____________________________________________________________________________ -inline void G4RootFileManager::SetBasketSize(unsigned int basketSize) +inline void G4RootFileManager::SetBasketSize(unsigned int basketSize) { fBasketSize = basketSize; } //_____________________________________________________________________________ -inline void G4RootFileManager::SetBasketEntries(unsigned int basketEntries) +inline void G4RootFileManager::SetBasketEntries(unsigned int basketEntries) { fBasketEntries = basketEntries; } //_____________________________________________________________________________ diff --git a/source/analysis/root/include/G4RootHnFileManager.hh b/source/analysis/root/include/G4RootHnFileManager.hh index 2abaac3763..060f90abc8 100644 --- a/source/analysis/root/include/G4RootHnFileManager.hh +++ b/source/analysis/root/include/G4RootHnFileManager.hh @@ -34,15 +34,18 @@ #include "G4VTHnFileManager.hh" #include "globals.hh" +#include + class G4RootFileManager; template class G4RootHnFileManager : public G4VTHnFileManager { public: - G4RootHnFileManager(G4RootFileManager* fileManger) + explicit G4RootHnFileManager(G4RootFileManager* fileManger) : G4VTHnFileManager(), fFileManager(fileManger) {} - virtual ~G4RootHnFileManager() {} + G4RootHnFileManager() = delete; + virtual ~G4RootHnFileManager() = default; // Methods for writing objects // Write to a new file (the file is closed after write) @@ -50,12 +53,15 @@ class G4RootHnFileManager : public G4VTHnFileManager // Write to the default file (handled with OpenFile()/CloseFile methods) virtual G4bool Write(HT* ht, const G4String& htName, G4String& fileName) final; - private: + private: // Methods G4bool Write(tools::wroot::directory* directory, HT* ht, const G4String& htName); + // Static data members + static constexpr std::string_view fkClass { "G4RootHnFileManager" }; + // Data members - G4RootFileManager* fFileManager; + G4RootFileManager* fFileManager { nullptr }; }; #include "G4RootHnFileManager.icc" diff --git a/source/analysis/root/include/G4RootHnFileManager.icc b/source/analysis/root/include/G4RootHnFileManager.icc index daf38afe74..ca1fa61d22 100644 --- a/source/analysis/root/include/G4RootHnFileManager.icc +++ b/source/analysis/root/include/G4RootHnFileManager.icc @@ -26,6 +26,8 @@ // Author: Ivana Hrivnacova, 15/09/2020 (ivana@ipno.in2p3.fr) +#include "G4AnalysisUtilities.hh" + #include "tools/wroot/to" #include "tools/wroot/file" #include "tools/zlib" @@ -44,11 +46,10 @@ template G4bool G4RootHnFileManager::WriteExtra( HT* ht, const G4String& htName, const G4String& fileName) { - auto finalResult = true; auto result = true; // // create a new file - tools::wroot::file* rfile = new tools::wroot::file(G4cout, fileName); + auto rfile = new tools::wroot::file(G4cout, fileName); // TO DO // rfile->add_ziper('Z', tools::compress_buffer); // rfile->set_compression(fState.GetCompressionLevel()); @@ -59,18 +60,16 @@ G4bool G4RootHnFileManager::WriteExtra( if ( ! hdirectory ) return false; // write histo - result = Write(hdirectory, ht, htName); - finalResult = result && finalResult; + result &= Write(hdirectory, ht, htName); // write file unsigned int n; - result = rfile->write(n); - finalResult = result && finalResult; + result &= rfile->write(n); // close file rfile->close(); - return finalResult; + return result; } //_____________________________________________________________________________ @@ -87,11 +86,9 @@ G4bool G4RootHnFileManager::Write( auto hdirectory = std::get<1>(*fFileManager->GetTFile(fileName)); if ( hdirectory == nullptr ) { - G4ExceptionDescription description; - description - << "Failed to get Root file " << fileName << " histo directory."; - G4Exception("G4RootHnFileManager::Write()", - "Analysis_W022", JustWarning, description); + G4Analysis::Warn( + "Failed to get Root file " + fileName + " histo directory.", + fkClass, "Write"); return false; } diff --git a/source/analysis/root/include/G4RootHnRFileManager.hh b/source/analysis/root/include/G4RootHnRFileManager.hh new file mode 100644 index 0000000000..30ca2c6084 --- /dev/null +++ b/source/analysis/root/include/G4RootHnRFileManager.hh @@ -0,0 +1,79 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +// The manager class for histogram/profile reading from a Root file. + +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) + +#ifndef G4RootHnRFileManager_h +#define G4RootHnRFileManager_h 1 + +#include "G4VTHnRFileManager.hh" + +#include +#include + +class G4RootRFileManager; + +namespace tools { +namespace rroot { +class buffer; +class TDirectory; +} +} + +template +class G4RootHnRFileManager : public G4VTHnRFileManager +{ + public: + explicit G4RootHnRFileManager(G4RootRFileManager* rfileManger) + : G4VTHnRFileManager(), fRFileManager(rfileManger) {} + G4RootHnRFileManager() = delete; + virtual ~G4RootHnRFileManager() = default; + + // Methods for reading objects + virtual HT* Read(const G4String& htName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; + + private: + // Methods + std::tuple GetBuffer( + const G4String& fileName, + const G4String& dirName, + const G4String& name); + HT* ReadT(tools::rroot::buffer* buffer); + + // Static data members + static constexpr std::string_view fkClass { "G4RootHnRFileManager" }; + // Data members + G4RootRFileManager* fRFileManager { nullptr }; +}; + +// inline functions + +#include "G4RootHnRFileManager.icc" + +#endif diff --git a/source/analysis/root/include/G4RootHnRFileManager.icc b/source/analysis/root/include/G4RootHnRFileManager.icc new file mode 100644 index 0000000000..02d892e53c --- /dev/null +++ b/source/analysis/root/include/G4RootHnRFileManager.icc @@ -0,0 +1,169 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) + +#include "G4AnalysisUtilities.hh" + +#include "tools/rroot/file" +#include "tools/rroot/rall" +#include "tools/rroot/streamers" + +//_____________________________________________________________________________ +template +inline +std::tuple +G4RootHnRFileManager::GetBuffer( + const G4String& fileName, const G4String& dirName, const G4String& objectName) +{ +// Get buffer for reading histogram or profile specified by objectNmae +// for a file specified by fileName; +// Open the file if it was not yet open + + // Histograms and profiles are not saved per thread + G4bool isPerThread = false; + + // Get or open a file + auto rfile = fRFileManager->GetRFile(fileName, isPerThread); + if ( ! rfile ) { + if ( ! fRFileManager->OpenRFile(fileName, isPerThread) ) { + return std::tuple(nullptr, nullptr); + } + rfile = fRFileManager->GetRFile(fileName, isPerThread); + } + + // Get key + tools::rroot::key* key = nullptr; + tools::rroot::TDirectory* newDir = nullptr; + if ( ! dirName.empty() ) { + newDir = tools::rroot::find_dir(rfile->dir(), dirName); + if ( newDir ) { + key = newDir->find_key(objectName); + } + else { + G4Analysis::Warn( + "Directory " + dirName + " not found in file " + fileName + ".", + fkClass, "GetBuffer"); + return std::tuple(nullptr, nullptr); + } + } + else { + key = rfile->dir().find_key(objectName); + } + + if ( ! key ) { + G4Analysis::Warn( + "Key " + objectName + " for Histogram/Profile not found in file " + + fileName + ", directory " + dirName, fkClass, "GetBuffer"); + return std::tuple(nullptr, newDir); + } + + unsigned int size; + char* charBuffer = key->get_object_buffer(*rfile, size); + + if ( ! charBuffer ) { + G4Analysis::Warn( + "Cannot get " + objectName + " in file " + fileName, + fkClass, "GetBuffer"); + return std::tuple(nullptr, newDir); + } + + auto verbose = false; + return std::tuple(new tools::rroot::buffer(G4cout, rfile->byte_swap(), size, charBuffer, + key->key_length(), verbose), newDir); +} + +//_____________________________________________________________________________ +template <> +inline +tools::histo::h1d* G4RootHnRFileManager::ReadT( + tools::rroot::buffer* buffer) +{ + return tools::rroot::TH1D_stream(*buffer); +} + +//_____________________________________________________________________________ +template <> +inline +tools::histo::h2d* G4RootHnRFileManager::ReadT( + tools::rroot::buffer* buffer) +{ + return tools::rroot::TH2D_stream(*buffer); +} + +//_____________________________________________________________________________ +template <> +inline +tools::histo::h3d* G4RootHnRFileManager::ReadT( + tools::rroot::buffer* buffer) +{ + return tools::rroot::TH3D_stream(*buffer); +} + +//_____________________________________________________________________________ +template <> +inline +tools::histo::p1d* G4RootHnRFileManager::ReadT( + tools::rroot::buffer* buffer) +{ + return tools::rroot::TProfile_stream(*buffer); +} + +//_____________________________________________________________________________ +template <> +inline +tools::histo::p2d* G4RootHnRFileManager::ReadT( + tools::rroot::buffer* buffer) +{ + return tools::rroot::TProfile2D_stream(*buffer); +} + +//_____________________________________________________________________________ +template +inline +HT* G4RootHnRFileManager::Read( + const G4String& htName, const G4String& fileName, const G4String& dirName, + G4bool /*isUserFileName*/) +{ + auto [buffer, newDir] = GetBuffer(fileName, dirName, htName); + if ( ! buffer ) { + delete newDir; + return nullptr; + } + + auto ht = ReadT(buffer); + delete buffer; + delete newDir; + + if ( ! ht ) { + G4Analysis::Warn( + "Streaming " + htName + " in file " + fileName + " failed.", + fkClass, "Read"); + return nullptr; + } + + return ht; +} diff --git a/source/analysis/root/include/G4RootMainNtupleManager.hh b/source/analysis/root/include/G4RootMainNtupleManager.hh index 05966ff991..c2acda7f85 100644 --- a/source/analysis/root/include/G4RootMainNtupleManager.hh +++ b/source/analysis/root/include/G4RootMainNtupleManager.hh @@ -39,6 +39,7 @@ #include "globals.hh" #include +#include class G4RootFileManager; class G4RootNtupleManager; @@ -59,18 +60,20 @@ class G4RootMainNtupleManager : public G4BaseAnalysisManager friend class G4RootNtupleManager; public: - explicit G4RootMainNtupleManager( + G4RootMainNtupleManager( G4RootNtupleManager* ntupleBuilder, - G4NtupleBookingManager* bookingManager, + std::shared_ptr bookingManager, G4bool rowWise, G4int fileNumber, const G4AnalysisManagerState& state); - ~G4RootMainNtupleManager(); + G4RootMainNtupleManager() = delete; + virtual ~G4RootMainNtupleManager() = default; protected: - // Methods to manipulate ntuples + // Methods to manipulate ntuples void CreateNtuple(RootNtupleDescription* ntupleDescription, G4bool warn = true); G4bool Merge(); - G4bool Reset(G4bool deleteNtuple); + G4bool Reset(); + void ClearData(); // Set/get methods void SetFileManager(std::shared_ptr fileManager); @@ -78,15 +81,18 @@ class G4RootMainNtupleManager : public G4BaseAnalysisManager std::shared_ptr GetNtupleFile(RootNtupleDescription* ntupleDescription) const; // Access functions - const std::vector& GetNtupleVector() + const std::vector& GetNtupleVector() { return fNtupleVector; } unsigned int GetBasketEntries() const; private: + // Static data members + static constexpr std::string_view fkClass { "G4RootMainNtupleManager" }; + // Data members - G4RootNtupleManager* fNtupleBuilder; - G4NtupleBookingManager* fBookingManager; - std::shared_ptr fFileManager; + G4RootNtupleManager* fNtupleBuilder { nullptr }; + std::shared_ptr fBookingManager { nullptr }; + std::shared_ptr fFileManager { nullptr }; G4bool fRowWise; G4int fFileNumber; std::vector fNtupleVector; diff --git a/source/analysis/root/include/G4RootNtupleFileManager.hh b/source/analysis/root/include/G4RootNtupleFileManager.hh index 9611ed776e..e84f3ba29a 100644 --- a/source/analysis/root/include/G4RootNtupleFileManager.hh +++ b/source/analysis/root/include/G4RootNtupleFileManager.hh @@ -34,6 +34,8 @@ #include "G4VNtupleFileManager.hh" +#include + class G4RootFileManager; class G4RootNtupleManager; class G4RootPNtupleManager; @@ -52,10 +54,11 @@ class G4RootNtupleFileManager : public G4VNtupleFileManager public: explicit G4RootNtupleFileManager(const G4AnalysisManagerState& state); + G4RootNtupleFileManager() = delete; virtual ~G4RootNtupleFileManager(); // MT/MPI - virtual void SetNtupleMerging(G4bool mergeNtuples, + virtual void SetNtupleMerging(G4bool mergeNtuples, G4int nofReducedNtupleFiles = 0) override; virtual void SetNtupleRowWise(G4bool rowWise, G4bool rowMode = true) override; virtual void SetBasketSize(unsigned int basketSize) override; @@ -64,10 +67,10 @@ class G4RootNtupleFileManager : public G4VNtupleFileManager // virtual methods from base class virtual G4bool ActionAtOpenFile(const G4String& fileName) override; virtual G4bool ActionAtWrite() override; - virtual G4bool ActionAtCloseFile(G4bool reset) override; + virtual G4bool ActionAtCloseFile(G4bool reset) override; virtual G4bool Reset() override; virtual G4bool IsNtupleMergingSupported() const override; - + virtual std::shared_ptr CreateNtupleManager() override; void SetFileManager(std::shared_ptr fileManager); @@ -76,23 +79,25 @@ class G4RootNtupleFileManager : public G4VNtupleFileManager std::shared_ptr GetNtupleManager() const; private: - // static data members + // Static data members static G4RootNtupleFileManager* fgMasterInstance; void SetNtupleMergingMode(G4bool mergeNtuples, G4int nofNtupleFiles); G4int GetNtupleFileNumber(); G4bool CloseNtupleFiles(); - // data members - G4bool fIsInitialized; - G4int fNofNtupleFiles; - G4bool fNtupleRowWise; - G4bool fNtupleRowMode; - G4NtupleMergeMode fNtupleMergeMode; - std::shared_ptr fNtupleManager; - std::shared_ptr fSlaveNtupleManager; + // Static data members + static constexpr std::string_view fkClass { "G4RootNtupleFileManager" }; - std::shared_ptr fFileManager; + // data members + G4bool fIsInitialized { false }; + G4int fNofNtupleFiles { 0 }; + G4bool fNtupleRowWise { false }; + G4bool fNtupleRowMode { true }; + G4NtupleMergeMode fNtupleMergeMode { G4NtupleMergeMode::kNone }; + std::shared_ptr fNtupleManager { nullptr }; + std::shared_ptr fSlaveNtupleManager { nullptr }; + std::shared_ptr fFileManager { nullptr }; }; inline void G4RootNtupleFileManager::SetFileManager( diff --git a/source/analysis/root/include/G4RootNtupleManager.hh b/source/analysis/root/include/G4RootNtupleManager.hh index c9c9933536..716435372c 100644 --- a/source/analysis/root/include/G4RootNtupleManager.hh +++ b/source/analysis/root/include/G4RootNtupleManager.hh @@ -38,6 +38,8 @@ #include "tools/wroot/ntuple" +#include + class G4RootMainNtupleManager; class G4NtupleBookingManager; class G4RootFileManager; @@ -54,7 +56,7 @@ G4bool G4TNtupleManager::FillNtupleTColumn( class G4RootNtupleManager : public G4TNtupleManager + G4RootFile> { friend class G4RootAnalysisManager; friend class G4RootMainNtupleManager; @@ -63,11 +65,12 @@ class G4RootNtupleManager : public G4TNtupleManager bookingManger, + G4RootNtupleManager(const G4AnalysisManagerState& state, + const std::shared_ptr& bookingManger, G4int nofMainManagers, G4int nofReducedFiles, G4bool rowWise, G4bool rowMode); - virtual ~G4RootNtupleManager(); + G4RootNtupleManager() = delete; + virtual ~G4RootNtupleManager() = default; private: // Methods from the templated base class @@ -76,11 +79,12 @@ class G4RootNtupleManager : public G4TNtupleManager fileManager); + void SetFileManager(const std::shared_ptr& fileManager); void SetNtupleFile(std::shared_ptr file); void SetNtupleRowWise(G4bool rowWise, G4bool rowMode); @@ -90,14 +94,16 @@ class G4RootNtupleManager : public G4TNtupleManager fFileManager; + // Static data members + static constexpr std::string_view fkClass { "G4RootNtupleManager" }; + + // Rata members + std::shared_ptr fFileManager { nullptr }; std::vector> fMainNtupleManagers; - std::shared_ptr fNtupleFile; + std::shared_ptr fNtupleFile { nullptr }; G4bool fRowWise; G4bool fRowMode; -}; +}; #include "G4RootNtupleManager.icc" diff --git a/source/analysis/root/include/G4RootNtupleManager.icc b/source/analysis/root/include/G4RootNtupleManager.icc index 51dead7d61..6153d06d3e 100644 --- a/source/analysis/root/include/G4RootNtupleManager.icc +++ b/source/analysis/root/include/G4RootNtupleManager.icc @@ -26,15 +26,19 @@ // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) +#include "G4AnalysisUtilities.hh" + +using std::to_string; + //_____________________________________________________________________________ -inline void G4RootNtupleManager::SetNtupleFile(std::shared_ptr file) +inline void G4RootNtupleManager::SetNtupleFile(std::shared_ptr file) { - fNtupleFile = file; + fNtupleFile = std::move(file); } //_____________________________________________________________________________ -inline const -std::vector* >& +inline const +std::vector* >& G4RootNtupleManager::GetNtupleDescriptionVector() const { return fNtupleDescriptionVector; @@ -47,44 +51,38 @@ inline G4bool G4TNtupleManager::FillNtupleTCol G4int ntupleId, G4int columnId, const std::string& value) { if ( fState.GetIsActivation() && ( ! GetActivation(ntupleId) ) ) { - //G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; - return false; - } + //G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; + return false; + } auto ntuple = GetNtupleInFunction(ntupleId, "FillNtupleTColumn"); if ( ! ntuple ) return false; auto index = columnId - fFirstNtupleColumnId; if ( index < 0 || index >= G4int(ntuple->columns().size()) ) { - G4ExceptionDescription description; - description << " " << "ntupleId " << ntupleId - << " columnId " << columnId << " does not exist."; - G4Exception("G4RootNtupleManager::FillNtupleTColumn()", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + "ntupleId " + to_string(ntupleId) + " columnId " + to_string(columnId) + + " does not exist.", + fkClass, "FillNtupleTColumn"); return false; } auto icolumn = ntuple->columns()[index]; auto column = dynamic_cast(icolumn); if ( ! column ) { - G4ExceptionDescription description; - description << " Column type does not match: " - << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - G4Exception("G4RootNtupleManager:FillNtupleColumn", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + "Column type does not match: ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + " value " + value, + fkClass, "FillNtupleTColumn"); return false; - } + } column->fill(value); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("fill", "ntuple T column", description); - } -#endif - return true; + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "fill", "ntuple T column", + " ntupleId " + to_string(ntupleId) + " columnId " + to_string(columnId) + + " value " + value); + } + return true; } diff --git a/source/analysis/root/include/G4RootPNtupleDescription.hh b/source/analysis/root/include/G4RootPNtupleDescription.hh index 31450d90f1..3e33ea0399 100644 --- a/source/analysis/root/include/G4RootPNtupleDescription.hh +++ b/source/analysis/root/include/G4RootPNtupleDescription.hh @@ -52,21 +52,18 @@ using RootNtupleDescription = G4TNtupleDescription fMainBranches; + tools::wroot::imt_ntuple* fNtuple { nullptr }; + tools::wroot::base_pntuple* fBasePNtuple { nullptr }; + std::vector fMainBranches; }; -#endif +#endif diff --git a/source/analysis/root/include/G4RootPNtupleManager.hh b/source/analysis/root/include/G4RootPNtupleManager.hh index adb389b8b7..11d1767fbc 100644 --- a/source/analysis/root/include/G4RootPNtupleManager.hh +++ b/source/analysis/root/include/G4RootPNtupleManager.hh @@ -39,6 +39,7 @@ #include "globals.hh" #include +#include class G4RootMainNtupleManager; @@ -54,20 +55,20 @@ class imt_ntuple; // with replacement tools::mutex -> G4Mutex class mutex : public virtual tools::wroot::imutex { - typedef tools::wroot::imutex parent; + using parent = tools::wroot::imutex; public: virtual bool lock() { // G4cout << "!!! Mutex lock" << G4endl; - m_mutex.lock(); + m_mutex.lock(); return true;} virtual bool unlock() { - m_mutex.unlock(); + m_mutex.unlock(); // G4cout << "!!! Mutex unlock" << G4endl; return true; } //virtual bool trylock() {return m_mutex.trylock();} public: mutex(G4AutoLock& a_mutex):m_mutex(a_mutex){} - virtual ~mutex(){} + virtual ~mutex() = default; protected: mutex(const mutex& a_from):parent(a_from),m_mutex(a_from.m_mutex){} mutex& operator=(const mutex&){return *this;} @@ -81,11 +82,12 @@ class G4RootPNtupleManager : public G4BaseNtupleManager friend class G4RootNtupleFileManager; public: - explicit G4RootPNtupleManager(const G4AnalysisManagerState& state, - std::shared_ptr bookingManger, - std::shared_ptr main, - G4bool rowWise, G4bool rowMode); - ~G4RootPNtupleManager(); + G4RootPNtupleManager(const G4AnalysisManagerState& state, + std::shared_ptr bookingManger, + std::shared_ptr main, + G4bool rowWise, G4bool rowMode); + G4RootPNtupleManager() = delete; + virtual ~G4RootPNtupleManager(); private: // Methods to manipulate ntuples @@ -100,23 +102,23 @@ class G4RootPNtupleManager : public G4BaseNtupleManager virtual G4int CreateNtuple(G4NtupleBooking* booking) final; // Methods to fill ntuples - // Methods for ntuple with id = FirstNtupleId (from base class) + // Methods for ntuple with id = FirstNtupleId (from base class) using G4BaseNtupleManager::FillNtupleIColumn; using G4BaseNtupleManager::FillNtupleFColumn; using G4BaseNtupleManager::FillNtupleDColumn; using G4BaseNtupleManager::FillNtupleSColumn; using G4BaseNtupleManager::AddNtupleRow; - // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) + // Methods for ntuple with id > FirstNtupleId (when more ntuples exist) virtual G4bool FillNtupleIColumn(G4int ntupleId, G4int columnId, G4int value) final; virtual G4bool FillNtupleFColumn(G4int ntupleId, G4int columnId, G4float value) final; virtual G4bool FillNtupleDColumn(G4int ntupleId, G4int columnId, G4double value) final; - virtual G4bool FillNtupleSColumn(G4int ntupleId, G4int columnId, + virtual G4bool FillNtupleSColumn(G4int ntupleId, G4int columnId, const G4String& value) final; virtual G4bool AddNtupleRow(G4int ntupleId) final; virtual G4bool Merge() final; - // Reset - virtual G4bool Reset(G4bool deleteNtuple) final; + // Clear all data + virtual void Clear() final; // Activation option // @@ -131,19 +133,22 @@ class G4RootPNtupleManager : public G4BaseNtupleManager void SetNtupleRowWise(G4bool rowWise, G4bool rowMode); private: - G4RootPNtupleDescription* - GetNtupleDescriptionInFunction(G4int id, G4String function, G4bool warn = true) const; - tools::wroot::base_pntuple* - GetNtupleInFunction(G4int id, G4String function, G4bool warn = true) const; - tools::wroot::ntuple* - GetMainNtupleInFunction(G4int id, G4String function, G4bool warn = true) const; + G4RootPNtupleDescription* + GetNtupleDescriptionInFunction(G4int id, std::string_view function, G4bool warn = true) const; + tools::wroot::base_pntuple* + GetNtupleInFunction(G4int id, std::string_view function, G4bool warn = true) const; + tools::wroot::ntuple* + GetMainNtupleInFunction(G4int id, std::string_view function, G4bool warn = true) const; - template + template G4bool FillNtupleTColumn(G4int ntupleId, G4int columnId, const T& value); - template + template G4bool FillNtupleTColumn(G4int columnId, const T& value); + // Static data members + static constexpr std::string_view fkClass { "G4RootPNtupleManager" }; + // Data members std::shared_ptr fBookingManager; std::shared_ptr fMainNtupleManager; @@ -151,7 +156,7 @@ class G4RootPNtupleManager : public G4BaseNtupleManager std::vector fNtupleVector; G4bool fRowWise; G4bool fRowMode; - G4bool fCreateNtuples; + G4bool fCreateNtuples { true }; }; #include "G4RootPNtupleManager.icc" diff --git a/source/analysis/root/include/G4RootPNtupleManager.icc b/source/analysis/root/include/G4RootPNtupleManager.icc index 88213b4d5b..9fd67eaca9 100644 --- a/source/analysis/root/include/G4RootPNtupleManager.icc +++ b/source/analysis/root/include/G4RootPNtupleManager.icc @@ -26,6 +26,8 @@ // Author: Ivana Hrivnacova, 04/10/2016 (ivana@ipno.in2p3.fr) +using std::to_string; + //_____________________________________________________________________________ template <> inline G4bool G4RootPNtupleManager::FillNtupleTColumn( @@ -36,55 +38,48 @@ inline G4bool G4RootPNtupleManager::FillNtupleTColumn( } if ( fState.GetIsActivation() && ( ! GetActivation(ntupleId) ) ) { - G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; - return false; - } + G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; + return false; + } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("fill", "pntuple T column", description); - } -#endif + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "fill", "pntuple T column", + " ntupleId " + to_string(ntupleId) + " columnId " + to_string(columnId) + + " value " + G4Analysis::ToString(value)); + } auto ntuple = GetNtupleInFunction(ntupleId, "FillNtupleTColumn"); if ( ! ntuple ) return false; auto index = columnId - fFirstNtupleColumnId; if ( index < 0 || index >= G4int(ntuple->columns().size()) ) { - G4ExceptionDescription description; - description << " " << "ntupleId " << ntupleId - << " columnId " << columnId << " does not exist."; - G4Exception("G4RootNtupleManager::FillNtupleTColumn()", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + "ntupleId " + to_string(ntupleId) + " columnId " + to_string(columnId) + + " does not exist.", + fkClass, "FillNtupleTColumn"); return false; } auto icolumn = ntuple->columns()[index]; auto column = dynamic_cast(icolumn); if ( ! column ) { - G4ExceptionDescription description; - description << " Column type does not match: " - << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - G4Exception("G4RootNtupleManager:FillNtupleColumn", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + " Column type does not match: ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + " value " + value, + fkClass, "FillNtupleTColumn"); return false; - } + } column->fill(value); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("done fill", "pntuple T column", description); - } -#endif - return true; + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "done fill", "pntuple T column", + " ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + + " value " + value); + } + + return true; } //_____________________________________________________________________________ @@ -97,18 +92,16 @@ G4bool G4RootPNtupleManager::FillNtupleTColumn( } if ( fState.GetIsActivation() && ( ! GetActivation(ntupleId) ) ) { - G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; - return false; - } + G4cout << "Skipping FillNtupleIColumn for " << ntupleId << G4endl; + return false; + } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("fill", "pntuple T column", description); - } -#endif + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "fill", "pntuple T column", + " ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + + " value " + G4Analysis::ToString(value)); + } // get ntuple auto ntuple = GetNtupleInFunction(ntupleId, "FillNtupleTColumn"); @@ -117,11 +110,10 @@ G4bool G4RootPNtupleManager::FillNtupleTColumn( // get generic column auto index = columnId - fFirstNtupleColumnId; if ( index < 0 || index >= G4int(ntuple->columns().size()) ) { - G4ExceptionDescription description; - description << " " << "ntupleId " << ntupleId - << " columnId " << columnId << " does not exist."; - G4Exception("G4TNtupleManager::FillNtupleTColumn()", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + "ntupleId " + to_string(ntupleId) + " columnId " + to_string(columnId) + + " does not exist.", + fkClass, "FillNtupleTColumn"); return false; } auto icolumn = ntuple->columns()[index]; @@ -129,30 +121,27 @@ G4bool G4RootPNtupleManager::FillNtupleTColumn( // get column and check its type auto column = dynamic_cast* >(icolumn); if ( ! column ) { - G4ExceptionDescription description; - description << " Column type does not match: " - << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - G4Exception("G4TNtupleManager:FillNtupleTColumn", - "Analysis_W011", JustWarning, description); + G4Analysis::Warn( + " Column type does not match: ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + " value " + G4Analysis::ToString(value), + fkClass, "FillNtupleTColumn"); return false; - } + } column->fill(value); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId - << " columnId " << columnId << " value " << value; - fState.GetVerboseL4()->Message("done fill", "pntuple T column", description); - } -#endif - return true; + if ( IsVerbose(G4Analysis::kVL4) ) { + Message(G4Analysis::kVL4, "done fill", "pntuple T column", + " ntupleId " + to_string(ntupleId) + + " columnId " + to_string(columnId) + + " value " + G4Analysis::ToString(value)); + } + + return true; } //_____________________________________________________________________________ -template +template G4bool G4RootPNtupleManager::FillNtupleTColumn(G4int columnId, const T& value) { return FillNtupleTColumn(0, columnId, value); } diff --git a/source/analysis/root/include/G4RootRFileManager.hh b/source/analysis/root/include/G4RootRFileManager.hh index d98e3432a9..79e25177c4 100644 --- a/source/analysis/root/include/G4RootRFileManager.hh +++ b/source/analysis/root/include/G4RootRFileManager.hh @@ -31,35 +31,43 @@ #ifndef G4RootRFileManager_h #define G4RootRFileManager_h 1 -#include "G4BaseFileManager.hh" +#include "G4VRFileManager.hh" #include "globals.hh" #include +#include namespace tools { -namespace rroot { -class file; +namespace rroot { +class file; //class directory; } -} +} -class G4RootRFileManager : public G4BaseFileManager +class G4RootRFileManager : public G4VRFileManager { public: explicit G4RootRFileManager(const G4AnalysisManagerState& state); + G4RootRFileManager() = delete; virtual ~G4RootRFileManager(); virtual G4String GetFileType() const final { return "Root"; } + // Methods from base class + virtual void CloseFiles() final {} + // Methods to manipulate input files virtual G4bool OpenRFile(const G4String& fileName, G4bool isPerThread); - + // Get methods - tools::rroot::file* GetRFile(const G4String& fileName, + tools::rroot::file* GetRFile(const G4String& fileName, G4bool isPerThread) const; private: + // Static data members + static constexpr std::string_view fkClass { "G4RootRFileManager" }; + // data members std::map fRFiles; }; diff --git a/source/analysis/root/include/G4RootRNtupleManager.hh b/source/analysis/root/include/G4RootRNtupleManager.hh index fbd59f0fce..f60a8d1f2e 100644 --- a/source/analysis/root/include/G4RootRNtupleManager.hh +++ b/source/analysis/root/include/G4RootRNtupleManager.hh @@ -37,23 +37,39 @@ #include "tools/rroot/ntuple" -#include +#include +class G4RootRFileManager; struct G4RootRNtupleDescription; class G4RootRNtupleManager : public G4TRNtupleManager { friend class G4RootAnalysisReader; - protected: + public: explicit G4RootRNtupleManager(const G4AnalysisManagerState& state); - virtual ~G4RootRNtupleManager(); - + G4RootRNtupleManager() = delete; + virtual ~G4RootRNtupleManager() = default; + private: - // Methods from the templated base class - // + // Set methods + void SetFileManager(std::shared_ptr fileManager); + + // Methods from the base class + virtual G4int ReadNtupleImpl(const G4String& ntupleName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; virtual G4bool GetTNtupleRow(G4TRNtupleDescription* ntupleDescription) final; -}; + + // Static data members + static constexpr std::string_view fkClass { "G4RootPNtupleManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; +}; + +inline void +G4RootRNtupleManager::SetFileManager(std::shared_ptr fileManager) +{ fFileManager = fileManager; } #endif diff --git a/source/analysis/root/include/g4root.hh b/source/analysis/root/include/g4root.hh deleted file mode 100644 index 4c215a3e18..0000000000 --- a/source/analysis/root/include/g4root.hh +++ /dev/null @@ -1,38 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// - -// Author: Ivana Hrivnacova, 15/06/2011 (ivana@ipno.in2p3.fr) - -#ifndef g4root_h -#define g4root_h - -#include "g4root_defs.hh" - -using namespace G4Root; - -#endif - - diff --git a/source/analysis/root/include/g4root_defs.hh b/source/analysis/root/include/g4root_defs.hh index 3634a98c81..08af48e21d 100644 --- a/source/analysis/root/include/g4root_defs.hh +++ b/source/analysis/root/include/g4root_defs.hh @@ -31,25 +31,11 @@ #include "tools/wroot/ntuple" #include "tools/rroot/ntuple" -#include "G4RootAnalysisManager.hh" -#include "G4RootAnalysisReader.hh" #include "g4hntools_defs.hh" -namespace G4Root -{ - // Ntuple types - using G4Ntuple = tools::wroot::ntuple; - using G4NtupleIterator = std::vector::iterator; - using G4NtupleConstIterator = std::vector::const_iterator; - - // RNtuple types - using G4RNtuple = tools::rroot::ntuple; - - // Managers - using G4AnalysisManager = G4RootAnalysisManager; - using G4AnalysisReader = G4RootAnalysisReader; -} +// Root output specific types +using G4RootNtuple = tools::wroot::ntuple; +using G4RootRNtuple = tools::rroot::ntuple; #endif - diff --git a/source/analysis/root/sources.cmake b/source/analysis/root/sources.cmake index d249ba7f03..2ba063823f 100644 --- a/source/analysis/root/sources.cmake +++ b/source/analysis/root/sources.cmake @@ -11,6 +11,8 @@ geant4_add_module(G4root G4RootFileManager.hh G4RootHnFileManager.hh G4RootHnFileManager.icc + G4RootHnRFileManager.hh + G4RootHnRFileManager.icc G4RootMainNtupleManager.hh G4RootNtupleFileManager.hh G4RootNtupleManager.hh @@ -21,7 +23,6 @@ geant4_add_module(G4root G4RootRFileManager.hh G4RootRNtupleManager.hh g4root_defs.hh - g4root.hh SOURCES G4RootAnalysisManager.cc G4RootAnalysisReader.cc diff --git a/source/analysis/root/src/G4RootAnalysisManager.cc b/source/analysis/root/src/G4RootAnalysisManager.cc index 7fb8246c72..8fd6728f6c 100644 --- a/source/analysis/root/src/G4RootAnalysisManager.cc +++ b/source/analysis/root/src/G4RootAnalysisManager.cc @@ -29,231 +29,51 @@ #include "G4RootAnalysisManager.hh" #include "G4RootFileManager.hh" #include "G4RootNtupleFileManager.hh" -#include "G4AnalysisVerbose.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" - +#include "G4ThreadLocalSingleton.hh" #include "G4Threading.hh" -#include "G4AutoLock.hh" - -#include -#include using namespace G4Analysis; -// mutex in a file scope - -namespace { - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH1Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH2Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH3Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging P1 profiles - G4Mutex mergeP1Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging P2 profiles - G4Mutex mergeP2Mutex = G4MUTEX_INITIALIZER; -} - -G4RootAnalysisManager* G4RootAnalysisManager::fgMasterInstance = nullptr; -G4ThreadLocal G4RootAnalysisManager* G4RootAnalysisManager::fgInstance = nullptr; - //_____________________________________________________________________________ G4RootAnalysisManager* G4RootAnalysisManager::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4RootAnalysisManager(isMaster); - } - - return fgInstance; -} + static G4ThreadLocalSingleton instance; + fgIsInstance = true; + return instance.Instance(); +} //_____________________________________________________________________________ G4bool G4RootAnalysisManager::IsInstance() { - return ( fgInstance != nullptr ); -} + return fgIsInstance; +} //_____________________________________________________________________________ -G4RootAnalysisManager::G4RootAnalysisManager(G4bool isMaster) - : G4ToolsAnalysisManager("Root", isMaster), - fFileManager(nullptr), - fNtupleFileManager(nullptr) +G4RootAnalysisManager::G4RootAnalysisManager() + : G4ToolsAnalysisManager("Root") { - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description - << " " - << "G4RootAnalysisManager already exists." - << "Cannot create another instance."; - G4Exception("G4RootAnalysisManager::G4RootAnalysisManager()", - "Analysis_F001", FatalException, description); - } - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; // File manager fFileManager = std::make_shared(fState); SetFileManager(fFileManager); - fFileManager->SetBasketSize(fgkDefaultBasketSize); - fFileManager->SetBasketEntries(fgkDefaultBasketEntries); // Ntuple file manager fNtupleFileManager = std::make_shared(fState); fNtupleFileManager->SetFileManager(fFileManager); fNtupleFileManager->SetBookingManager(fNtupleBookingManager); } - + //_____________________________________________________________________________ G4RootAnalysisManager::~G4RootAnalysisManager() { if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; - fgInstance = nullptr; + fgIsInstance = false; } -// -// private methods // - -//_____________________________________________________________________________ -G4bool G4RootAnalysisManager::WriteH1() -{ - auto h1Vector = fH1Manager->GetH1Vector(); - auto hnVector = fH1Manager->GetHnVector(); - - if ( ! h1Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(h1Vector, hnVector, "h1"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH1(&mergeH1Mutex); - fgMasterInstance->fH1Manager->AddH1Vector(h1Vector); - lH1.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4RootAnalysisManager::WriteH2() -{ - auto h2Vector = fH2Manager->GetH2Vector(); - auto hnVector = fH2Manager->GetHnVector(); - - if ( ! h2Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(h2Vector, hnVector, "h2"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH2(&mergeH2Mutex); - fgMasterInstance->fH2Manager->AddH2Vector(h2Vector); - lH2.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4RootAnalysisManager::WriteH3() -{ - auto h3Vector = fH3Manager->GetH3Vector(); - auto hnVector = fH3Manager->GetHnVector(); - - if ( ! h3Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(h3Vector, hnVector, "h3"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH3(&mergeH3Mutex); - fgMasterInstance->fH3Manager->AddH3Vector(h3Vector); - lH3.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4RootAnalysisManager::WriteP1() -{ - auto p1Vector = fP1Manager->GetP1Vector(); - auto hnVector = fP1Manager->GetHnVector(); - - if ( ! p1Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(p1Vector, hnVector, "p1"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lP1(&mergeP1Mutex); - fgMasterInstance->fP1Manager->AddP1Vector(p1Vector); - lP1.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4RootAnalysisManager::WriteP2() -{ - auto p2Vector = fP2Manager->GetP2Vector(); - auto hnVector = fP2Manager->GetHnVector(); - - if ( ! p2Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - result = WriteT(p2Vector, hnVector, "p2"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lP2(&mergeP2Mutex); - fgMasterInstance->fP2Manager->AddP2Vector(p2Vector); - lP2.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4RootAnalysisManager::Reset() -{ -// Reset histograms and ntuple - - auto finalResult = true; - - auto result = G4ToolsAnalysisManager::Reset(); - finalResult = finalResult && result; - - result = fNtupleFileManager->Reset(); - finalResult = result && finalResult; - - return finalResult; -} - -// // protected methods // @@ -264,159 +84,118 @@ G4bool G4RootAnalysisManager::OpenFileImpl(const G4String& fileName) // and set it to base class which takes then their ownership SetNtupleManager(fNtupleFileManager->CreateNtupleManager()); - auto finalResult = true; + auto result = true; // Open file if ( fNtupleFileManager->GetMergeMode() != G4NtupleMergeMode::kSlave ) { - auto result = fFileManager->OpenFile(fileName); - finalResult = finalResult && result; + result &= fFileManager->OpenFile(fileName); } // Open ntuple file(s) and create ntuples from bookings - auto result = fNtupleFileManager->ActionAtOpenFile(fFileManager->GetFullFileName()); - finalResult = finalResult && result; + result &= fNtupleFileManager->ActionAtOpenFile(fFileManager->GetFullFileName()); - return finalResult; -} + return result; +} //_____________________________________________________________________________ -G4bool G4RootAnalysisManager::WriteImpl() +G4bool G4RootAnalysisManager::WriteImpl() { - auto finalResult = true; + auto result = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("write", "files", ""); -#endif + Message(kVL4, "write", "files"); - if ( ! fgMasterInstance && - ( ( ! fH1Manager->IsEmpty() ) || ( ! fH2Manager->IsEmpty() ) || - ( ! fH3Manager->IsEmpty() ) || ( ! fP1Manager->IsEmpty() ) || - ( ! fP2Manager->IsEmpty() ) ) ) { - G4ExceptionDescription description; - description - << " " << "No master G4RootAnalysisManager instance exists." - << G4endl - << " " << "Histogram/profile data will not be merged."; - G4Exception("G4RootAnalysisManager::Write()", - "Analysis_W031", JustWarning, description); + if ( G4Threading::IsWorkerThread() ) { + result &= G4ToolsAnalysisManager::Merge(); } - - // H1 - auto result = WriteH1(); - finalResult = finalResult && result; + else { + // Open all files registered with objects + fFileManager->OpenFiles(); - // H2 - result = WriteH2(); - finalResult = finalResult && result; - - // H3 - result = WriteH3(); - finalResult = finalResult && result; - - // P1 - result = WriteP1(); - finalResult = finalResult && result; - - // P2 - result = WriteP2(); - finalResult = finalResult && result; + // Write all histograms/profile on master + result &= G4ToolsAnalysisManager::WriteImpl(); + } // Ntuples - result = fNtupleFileManager->ActionAtWrite(); - finalResult = finalResult && result; + result &= fNtupleFileManager->ActionAtWrite(); // File if ( fNtupleFileManager->GetMergeMode() != G4NtupleMergeMode::kSlave ) { // write all open files - result = fFileManager->WriteFiles(); - finalResult = finalResult && result; + result &= fFileManager->WriteFiles(); } // Write ASCII if activated if ( IsAscii() ) { - result = WriteAscii(fFileManager->GetFileName()); - finalResult = finalResult && result; - } - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("write", "files", "", finalResult); + result &= WriteAscii(fFileManager->GetFileName()); } -#endif - return finalResult; + Message(kVL3, "write", "files", "", result); + + return result; } //_____________________________________________________________________________ G4bool G4RootAnalysisManager::CloseFileImpl(G4bool reset) { - auto finalResult = true; - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("close", "files", ""); -#endif - auto result = true; - if ( reset ) { - result = Reset(); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Resetting data failed"; - G4Exception("G4RootAnalysisManager::CloseFile()", - "Analysis_W021", JustWarning, description); - } - } - finalResult = finalResult && result; - result = fNtupleFileManager->ActionAtCloseFile(reset); - finalResult = finalResult && result; + Message(kVL4, "close", "files"); + + if ( reset ) { + if ( ! Reset() ) { + Warn("Resetting data failed", fkClass, "CloseFileImpl"); + result = false; + } + } + + result &= fNtupleFileManager->ActionAtCloseFile(reset); if ( fNtupleFileManager->GetMergeMode() != G4NtupleMergeMode::kSlave ) { // close all open files - result = fFileManager->CloseFiles(); - finalResult = finalResult && result; + result &= fFileManager->CloseFiles(); } // No files clean-up in sequential mode - if ( ! G4Threading::IsMultithreadedApplication() ) return finalResult; + if ( ! G4Threading::IsMultithreadedApplication() ) return result; G4bool isNtupleManagerEmpty = fNtupleBookingManager->IsEmpty(); // Delete files if empty in MT mode - if ( ( fState.GetIsMaster() && - fH1Manager->IsEmpty() && fH2Manager->IsEmpty() && fH3Manager->IsEmpty() && - fP1Manager->IsEmpty() && fP2Manager->IsEmpty() && isNtupleManagerEmpty ) || - ( ( ! fState.GetIsMaster() ) && isNtupleManagerEmpty && - fNtupleFileManager->GetMergeMode() == G4NtupleMergeMode::kNone ) ) { + if ( ( fState.GetIsMaster() && G4ToolsAnalysisManager::IsEmpty() && + isNtupleManagerEmpty ) || + ( (! fState.GetIsMaster()) && isNtupleManagerEmpty && + fNtupleFileManager->GetMergeMode() == G4NtupleMergeMode::kNone ) ) { - result = ! std::remove(fFileManager->GetFullFileName()); - // std::remove returns 0 when success - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Removing file " - << fFileManager->GetFullFileName() << " failed"; - G4Exception("G4RootAnalysisManager::CloseFile()", - "Analysis_W021", JustWarning, description); - } - finalResult = finalResult && result; -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("delete", "empty file", fFileManager->GetFullFileName()); -#endif + if ( std::remove(fFileManager->GetFullFileName()) ) { + // std::remove returns 0 when success + Warn( "Removing file " + fFileManager->GetFullFileName() + " failed", + fkClass, "CloseFileImpl"); + result = false; + } + + Message(kVL1, "delete", "empty file", fFileManager->GetFullFileName()); } else { -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2() - ->Message("close", "files", ""); -#endif + Message(kVL3, "close", "files"); } - return finalResult; + return result; +} + +//_____________________________________________________________________________ +G4bool G4RootAnalysisManager::ResetImpl() +{ +// Reset histograms and ntuple + + auto result = true; + + result &= G4ToolsAnalysisManager::ResetImpl(); + if ( fNtupleFileManager != nullptr ) { + result &= fNtupleFileManager->Reset(); + } + + return result; } // @@ -424,20 +203,20 @@ G4bool G4RootAnalysisManager::CloseFileImpl(G4bool reset) // //_____________________________________________________________________________ -void G4RootAnalysisManager::SetNtupleMerging(G4bool mergeNtuples, +void G4RootAnalysisManager::SetNtupleMerging(G4bool mergeNtuples, G4int nofNtupleFiles) { fNtupleFileManager->SetNtupleMerging(mergeNtuples, nofNtupleFiles); } //_____________________________________________________________________________ -void G4RootAnalysisManager::SetNtupleRowWise(G4bool rowWise, G4bool rowMode) +void G4RootAnalysisManager::SetNtupleRowWise(G4bool rowWise, G4bool rowMode) { fNtupleFileManager->SetNtupleRowWise(rowWise, rowMode); } //_____________________________________________________________________________ -void G4RootAnalysisManager::SetBasketSize(unsigned int basketSize) +void G4RootAnalysisManager::SetBasketSize(unsigned int basketSize) { fFileManager->SetBasketSize(basketSize); } diff --git a/source/analysis/root/src/G4RootAnalysisReader.cc b/source/analysis/root/src/G4RootAnalysisReader.cc index 8c3a22770b..438f86a786 100644 --- a/source/analysis/root/src/G4RootAnalysisReader.cc +++ b/source/analysis/root/src/G4RootAnalysisReader.cc @@ -29,58 +29,30 @@ #include "G4RootAnalysisReader.hh" #include "G4RootRFileManager.hh" #include "G4RootRNtupleManager.hh" -#include "G4AnalysisVerbose.hh" #include "G4AnalysisUtilities.hh" +#include "G4ThreadLocalSingleton.hh" #include "G4Threading.hh" -#include -#include -#include -#include -#include - -#include -#include - using namespace G4Analysis; -G4RootAnalysisReader* G4RootAnalysisReader::fgMasterInstance = nullptr; -G4ThreadLocal G4RootAnalysisReader* G4RootAnalysisReader::fgInstance = nullptr; - //_____________________________________________________________________________ G4RootAnalysisReader* G4RootAnalysisReader::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4RootAnalysisReader(isMaster); - } - - return fgInstance; -} + static G4ThreadLocalSingleton instance; + return instance.Instance(); +} //_____________________________________________________________________________ -G4RootAnalysisReader::G4RootAnalysisReader(G4bool isMaster) - : G4ToolsAnalysisReader("Root", isMaster), - fNtupleManager(nullptr), - fFileManager(nullptr) +G4RootAnalysisReader::G4RootAnalysisReader() + : G4ToolsAnalysisReader("Root") { - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description - << " " - << "G4RootAnalysisReader already exists." - << "Cannot create another instance."; - G4Exception("G4RootAnalysisReader::G4RootAnalysisReader()", - "Analysis_F001", FatalException, description); - } - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; // Create managers - fNtupleManager = new G4RootRNtupleManager(fState); - fFileManager = new G4RootRFileManager(fState); - // The managers will be deleted by the base class - + fNtupleManager = std::make_shared(fState); + fFileManager = std::make_shared(fState); + fNtupleManager->SetFileManager(fFileManager); + // Set managers to base class SetNtupleManager(fNtupleManager); SetFileManager(fFileManager); @@ -90,349 +62,43 @@ G4RootAnalysisReader::G4RootAnalysisReader(G4bool isMaster) G4RootAnalysisReader::~G4RootAnalysisReader() { if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; - fgInstance = nullptr; } -// +// // private methods // -//_____________________________________________________________________________ -tools::rroot::buffer* G4RootAnalysisReader::GetBuffer( - const G4String& fileName, - const G4String& objectName, - const G4String& inFunction) -{ -// Get buffer for reading histogram or profile specified by objectNmae -// for a file specified by fileName; -// open the file if it was not yet open - - // Histograms and profiles are not saved per thread - G4bool isPerThread = false; - - // Get or open a file - auto rfile = fFileManager->GetRFile(fileName, isPerThread); - if ( ! rfile ) { - if ( ! fFileManager->OpenRFile(fileName, isPerThread) ) return nullptr; - rfile = fFileManager->GetRFile(fileName, isPerThread); - } - - auto key - = ( ! rfile ) ? nullptr : rfile->dir().find_key(objectName); - - unsigned int size; - //char* charBuffer - // = ( ! key ) ? 0 : key->get_object_buffer(size); - char* charBuffer = 0; - if ( key ) charBuffer = key->get_object_buffer(*rfile, size); - - if ( ! charBuffer ) { - G4ExceptionDescription description; - description - << " " - << "Cannot get " << objectName << " in file " << fileName; - G4Exception(inFunction, "Analysis_WR011", JustWarning, description); - return nullptr; - } - - auto verbose = false; - return new tools::rroot::buffer(G4cout, rfile->byte_swap(), size, charBuffer, - key->key_length(), verbose); -} - //_____________________________________________________________________________ G4bool G4RootAnalysisReader::Reset() { // Reset histograms and ntuple - auto finalResult = true; - - auto result = G4ToolsAnalysisReader::Reset(); - finalResult = finalResult && result; + auto result = true; - result = fNtupleManager->Reset(); - finalResult = finalResult && result; - - return finalResult; -} - -// + result &= G4ToolsAnalysisReader::Reset(); + result &= fNtupleManager->Reset(); + + return result; +} + +// // protected methods // //_____________________________________________________________________________ -G4int G4RootAnalysisReader::ReadH1Impl(const G4String& h1Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) +G4bool G4RootAnalysisReader::CloseFilesImpl(G4bool reset) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h1", h1Name); -#endif + Message(kVL4, "close", "files"); - auto buffer = GetBuffer(fileName, h1Name, "ReadH1Impl"); - if ( ! buffer ) return kInvalidId; - - auto h1 = tools::rroot::TH1D_stream(*buffer); - delete buffer; - - if ( ! h1 ) { - G4ExceptionDescription description; - description - << " " - << "Streaming " << h1Name << " in file " << fileName << " failed."; - G4Exception("G4RootAnalysisReader::ReadH1Impl", - "Analysis_WR011", JustWarning, description); - return kInvalidId; - } - - auto id = fH1Manager->AddH1(h1Name, h1); + auto result = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h1", h1Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4RootAnalysisReader::ReadH2Impl(const G4String& h2Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h2", h2Name); -#endif - - auto buffer = GetBuffer(fileName, h2Name, "ReadH2Impl"); - if ( ! buffer ) return kInvalidId; - - // if h2Name represents H1, then we get !! - // tools::rroot::buffer::check_byte_count : object of class "TNamed" read too few bytes (603979762 missing). - // tools::rroot::buffer::check_byte_count : "TNamed" streamer not in sync with data on file, fix streamer. - // Segmentation fault (core dumped) - - auto h2 = tools::rroot::TH2D_stream(*buffer); - delete buffer; - - if ( ! h2 ) { - G4ExceptionDescription description; - description - << " " - << "Streaming " << h2Name << " in file " << fileName << " failed."; - G4Exception("G4RootAnalysisReader::ReadH2Impl", - "Analysis_WR011", JustWarning, description); - return kInvalidId; - } - - auto id = fH2Manager->AddH2(h2Name, h2); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h2", h2Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4RootAnalysisReader::ReadH3Impl(const G4String& h3Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) -{ - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h3", h3Name); -#endif - - auto buffer = GetBuffer(fileName, h3Name, "ReadH3Impl"); - if ( ! buffer ) return kInvalidId; - - auto h3 = tools::rroot::TH3D_stream(*buffer); - delete buffer; - - if ( ! h3 ) { - G4ExceptionDescription description; - description - << " " - << "Streaming " << h3Name << " in file " << fileName << " failed."; - G4Exception("G4RootAnalysisReader::ReadH3Impl", - "Analysis_WR011", JustWarning, description); - return kInvalidId; - } - - auto id = fH3Manager->AddH3(h3Name, h3); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h3", h3Name, id > kInvalidId); -#endif - - return id; -/* - // not yet available - return kInvalidId; -*/ -} - -//_____________________________________________________________________________ -G4int G4RootAnalysisReader::ReadP1Impl(const G4String& p1Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "p1", p1Name); -#endif - - auto buffer = GetBuffer(fileName, p1Name, "ReadP1Impl"); - if ( ! buffer ) return kInvalidId; - - auto p1 = tools::rroot::TProfile_stream(*buffer); - delete buffer; - - if ( ! p1 ) { - G4ExceptionDescription description; - description - << " " - << "Streaming " << p1Name << " in file " << fileName << " failed."; - G4Exception("G4RootAnalysisReader::ReadP1Impl", - "Analysis_WR011", JustWarning, description); - return kInvalidId; - } - - auto id = fP1Manager->AddP1(p1Name, p1); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "p1", p1Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4RootAnalysisReader::ReadP2Impl(const G4String& p2Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) -{ - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "p2", p2Name); -#endif - - auto buffer = GetBuffer(fileName, p2Name, "ReadP2Impl"); - if ( ! buffer ) return kInvalidId; - - auto p2 = tools::rroot::TProfile2D_stream(*buffer); - delete buffer; - - if ( ! p2 ) { - G4ExceptionDescription description; - description - << " " - << "Streaming " << p2Name << " in file " << fileName << " failed."; - G4Exception("G4RootAnalysisReader::ReadP2Impl", - "Analysis_WR011", JustWarning, description); - return kInvalidId; - } - - auto id = fP2Manager->AddP2(p2Name, p2); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "p2", p2Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4RootAnalysisReader::ReadNtupleImpl(const G4String& ntupleName, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool isUserFileName) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "ntuple", ntupleName); -#endif - - // Ntuples are saved per thread - // but do not apply the thread suffix if fileName is provided explicitly - auto isPerThread = true; - if ( isUserFileName ) isPerThread = false; - - // Get or open a file - auto rfile = fFileManager->GetRFile(fileName, isPerThread); - if ( ! rfile ) { - if ( ! fFileManager->OpenRFile(fileName, isPerThread) ) return kInvalidId; - rfile = fFileManager->GetRFile(fileName, isPerThread); - } - - auto key = rfile->dir().find_key(ntupleName); - if ( ! key ) { - G4ExceptionDescription description; - description - << " " - << "Key " << ntupleName << " for Ntuple not found in file " << fileName; - G4Exception("G4RootAnalysisReader::ReadNtupleImpl()", - "Analysis_WR011", JustWarning, description); - return kInvalidId; + if (reset) { + result &= Reset(); } - unsigned int size; - char* charBuffer = key->get_object_buffer(*rfile, size); - if ( ! charBuffer ) { - G4ExceptionDescription description; - description - << " " - << "Cannot get data buffer for Ntuple " << ntupleName << " in file " << fileName; - G4Exception("G4RootAnalysisReader::ReadNtupleImpl()", - "Analysis_WR021", JustWarning, description); - return kInvalidId; - } - - auto verbose = false; - auto buffer - = new tools::rroot::buffer(G4cout, rfile->byte_swap(), size, charBuffer, - key->key_length(), verbose); - buffer->set_map_objs(true); + fFileManager->CloseFiles(); - auto fac = new tools::rroot::fac(G4cout); + Message(kVL2, "close", "files", "", result); - auto tree = new tools::rroot::tree(*rfile, *fac); - if ( ! tree->stream(*buffer) ) { - G4ExceptionDescription description; - description - << " " - << "TTree streaming failed for Ntuple " << ntupleName << " in file " << fileName; - G4Exception("G4RootAnalysisReader::ReadNtupleImpl()", - "Analysis_WR021", JustWarning, description); - - delete buffer; - delete tree; - return kInvalidId; - } - - auto rntuple = new tools::rroot::ntuple(*tree); //use the flat ntuple API. - auto rntupleDescription = new G4TRNtupleDescription(rntuple); - - auto id = fNtupleManager->SetNtuple(rntupleDescription); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "ntuple", ntupleName, id > kInvalidId); -#endif - - return id; -} + return result; +} diff --git a/source/analysis/root/src/G4RootFileManager.cc b/source/analysis/root/src/G4RootFileManager.cc index 6e437175c6..cbc7dbd571 100644 --- a/source/analysis/root/src/G4RootFileManager.cc +++ b/source/analysis/root/src/G4RootFileManager.cc @@ -35,17 +35,12 @@ #include "tools/wroot/to" #include "tools/zlib" -#include -#include - using namespace tools; using namespace G4Analysis; //_____________________________________________________________________________ G4RootFileManager::G4RootFileManager(const G4AnalysisManagerState& state) - : G4VTFileManager(state), - fBasketSize(0), - fBasketEntries(0) + : G4VTFileManager(state) { // Create helpers defined in the base class fH1FileManager = std::make_shared>(this); @@ -55,52 +50,33 @@ G4RootFileManager::G4RootFileManager(const G4AnalysisManagerState& state) fP2FileManager = std::make_shared>(this); } -//_____________________________________________________________________________ -G4RootFileManager::~G4RootFileManager() -{} - // // private methods // //_____________________________________________________________________________ tools::wroot::directory* G4RootFileManager::CreateDirectory( - std::shared_ptr rfile, -#ifdef G4VERBOSE - const G4String& directoryName, const G4String& objectType) const -#else - const G4String& directoryName, const G4String& /*objectType*/) const -#endif + tools::wroot::file* rfile, + const G4String& directoryName, [[maybe_unused]] const G4String& objectType) const { if ( ! rfile ) return nullptr; if ( directoryName == "" ) { // Do not create a new directory if its name is not set return &(rfile->dir()); - } - -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4() - ->Message("create", "directory for " + objectType, directoryName); -#endif - + } + + Message(kVL4, "create", "directory for " + objectType, directoryName); + auto directory = rfile->dir().mkdir(directoryName); if ( ! directory ) { - G4ExceptionDescription description; - description << " " - << "cannot create directory " << directoryName; - G4Exception("G4RootFileManager::CreateDirectory()", - "Analysis_W001", JustWarning, description); - return nullptr; - } -#ifdef G4VERBOSE + Warn("Cannot create directory " + directoryName, fkClass, "CreateDirectory"); + return nullptr; + } else { - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2() - ->Message("create", "directory for " + objectType, directoryName); - } -#endif + Message(kVL2, "create", "directory for " + objectType, directoryName); + } + return directory; } @@ -125,49 +101,46 @@ G4String G4RootFileManager::GetNtupleFileName( // update filename per mainNumber if ( mainNumber > -1 ) { // update filename per mainNumber - ntupleFileName + ntupleFileName = G4Analysis::GetNtupleFileName(ntupleFileName, GetFileType(), mainNumber); } return ntupleFileName; -} +} // // protected methods // //_____________________________________________________________________________ -std::shared_ptr +std::shared_ptr G4RootFileManager::CreateFileImpl(const G4String& fileName) { // create file std::shared_ptr file = std::make_shared(G4cout, fileName); file->add_ziper('Z',compress_buffer); file->set_compression(fState.GetCompressionLevel()); - + if ( ! file->is_open() ) { - G4ExceptionDescription description; - description << " " << "Cannot create file " << fileName; - G4Exception("G4RootFileManager::CreateFileImpl()", - "Analysis_W001", JustWarning, description); + Warn("Cannot create file " + fileName, fkClass, "CreateFileImpl"); return std::make_shared(nullptr, nullptr, nullptr); } // create histo directory - tools::wroot::directory* hdirectory - = CreateDirectory(file, fHistoDirectoryName, "histograms"); + tools::wroot::directory* hdirectory + = CreateDirectory(file.get(), fHistoDirectoryName, "histograms"); if ( ! hdirectory ) { // Warning is issued in CreateDirectory return std::make_shared(nullptr, nullptr, nullptr); - } + } // create ntuple directory - tools::wroot::directory* ndirectory - = CreateDirectory(file, fNtupleDirectoryName, "ntuples"); + tools::wroot::directory* ndirectory + = CreateDirectory(file.get(), fNtupleDirectoryName, "ntuples"); if ( ! ndirectory ) { // Warning is issued in CreateDirectory return std::make_shared(nullptr, nullptr, nullptr); - } + } return std::make_shared(file, hdirectory, ndirectory); } @@ -184,7 +157,7 @@ G4bool G4RootFileManager::WriteFileImpl(std::shared_ptr file) } //_____________________________________________________________________________ -G4bool G4RootFileManager::CloseFileImpl(std::shared_ptr file) +G4bool G4RootFileManager::CloseFileImpl(std::shared_ptr file) { // New prototype: called by G4TFileManager base classe @@ -209,25 +182,19 @@ G4bool G4RootFileManager::OpenFile(const G4String& fileName) auto name = GetFullFileName(); if ( fFile ) { - G4ExceptionDescription description; - description << "File " << fileName << " already exists."; - G4Exception("G4RootFileManager::OpenFile()", - "Analysis_W001", JustWarning, description); + Warn("File " + fileName + " already exists.", fkClass, "OpenFile"); fFile.reset(); } // Create file (and save in in the file map) fFile = CreateTFile(name); if ( ! fFile ) { - G4ExceptionDescription description; - description << "Failed to create file " << fileName; - G4Exception("G4RootFileManager::OpenFile()", - "Analysis_W001", JustWarning, description); + Warn("Failed to create file " + fileName, fkClass, "OpenFile"); return false; } + LockDirectoryNames(); fIsOpenFile = true; - fLockDirectoryNames = true; return true; } @@ -268,7 +235,7 @@ std::shared_ptr G4RootFileManager::GetNtupleFile( G4bool G4RootFileManager::CloseNtupleFile( RootNtupleDescription* ntupleDescription) { - auto finalResult = true; + auto result = true; if ( ntupleDescription->fFile ) { // Ntuple files are registered in file manager map. @@ -276,10 +243,9 @@ G4bool G4RootFileManager::CloseNtupleFile( ntupleDescription->fFile.reset(); // Notify not empty file auto ntupleFileName = GetNtupleFileName(ntupleDescription); - auto result = SetIsEmpty(ntupleFileName, ! ntupleDescription->fHasFill); - finalResult = result && finalResult; + result &= SetIsEmpty(ntupleFileName, ! ntupleDescription->fHasFill); } - return finalResult; + return result; } diff --git a/source/analysis/root/src/G4RootMainNtupleManager.cc b/source/analysis/root/src/G4RootMainNtupleManager.cc index 16ab891898..39e7cce449 100644 --- a/source/analysis/root/src/G4RootMainNtupleManager.cc +++ b/source/analysis/root/src/G4RootMainNtupleManager.cc @@ -34,29 +34,22 @@ #include "tools/wroot/file" #include "tools/wroot/ntuple" +using namespace G4Analysis; + //_____________________________________________________________________________ G4RootMainNtupleManager::G4RootMainNtupleManager( G4RootNtupleManager* ntupleBuilder, - G4NtupleBookingManager* bookingManager, + std::shared_ptr bookingManager, G4bool rowWise, G4int fileNumber, const G4AnalysisManagerState& state) : G4BaseAnalysisManager(state), fNtupleBuilder(ntupleBuilder), - fBookingManager(bookingManager), - fFileManager(nullptr), + fBookingManager(std::move(bookingManager)), fRowWise(rowWise), - fFileNumber(fileNumber), - fNtupleVector(), - fNtupleDescriptionVector() + fFileNumber(fileNumber) {} -//_____________________________________________________________________________ -G4RootMainNtupleManager::~G4RootMainNtupleManager() -{ - // ntuple objects are deleted automatically when closing a file -} - // // protected functions // @@ -71,12 +64,9 @@ void G4RootMainNtupleManager::CreateNtuple(RootNtupleDescription* ntupleDescript auto ntupleFile = fFileManager->CreateNtupleFile(ntupleDescription, fFileNumber); if ( ! ntupleFile ) { if ( warn ) { - G4ExceptionDescription description; - description - << "Ntuple file must be defined first." << G4endl - << "Cannot create main ntuple."; - G4Exception("G4RootMainAnalysisManager::CreateNtuple", - "Analysis_W002", JustWarning, description); + Warn("Ntuple file must be defined first.\n" + "Cannot create main ntuple.", + fkClass, "CreateNtuple"); } return; } @@ -84,11 +74,7 @@ void G4RootMainNtupleManager::CreateNtuple(RootNtupleDescription* ntupleDescript // Get ntuple booking auto ntupleBooking = ntupleDescription->fNtupleBooking; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4() - ->Message("create", "main ntuple", ntupleBooking.name()); -#endif + Message(kVL4, "create", "main ntuple", ntupleBooking.name()); // Create ntuple auto ntuple = new tools::wroot::ntuple(*std::get<2>(*ntupleFile), ntupleBooking, fRowWise); @@ -99,11 +85,7 @@ void G4RootMainNtupleManager::CreateNtuple(RootNtupleDescription* ntupleDescript fNtupleVector.push_back(ntuple); fNtupleDescriptionVector.push_back(ntupleDescription); -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3() - ->Message("create", "main ntuple", ntupleBooking.name()); -#endif + Message(kVL3, "create", "main ntuple", ntupleBooking.name()); } //_____________________________________________________________________________ @@ -126,24 +108,29 @@ G4bool G4RootMainNtupleManager::Merge() } //_____________________________________________________________________________ -G4bool G4RootMainNtupleManager::Reset(G4bool deleteNtuple) +G4bool G4RootMainNtupleManager::Reset() { - for ( auto ntuple : fNtupleVector ) { - if ( deleteNtuple ) { - delete ntuple; - } - } + // ntuple object is deleted automatically when closing a file + + fNtupleVector.clear(); + fNtupleDescriptionVector.clear(); - fNtupleVector.clear(); - fNtupleDescriptionVector.clear(); - return true; } //_____________________________________________________________________________ -std::shared_ptr +void G4RootMainNtupleManager::ClearData() +{ + // Reset function clears all data + Reset(); + + Message(G4Analysis::kVL2, "clear", "main ntuples"); +} + +//_____________________________________________________________________________ +std::shared_ptr G4RootMainNtupleManager::GetNtupleFile(RootNtupleDescription* ntupleDescription) const -{ +{ auto perThread = false; return fFileManager->GetNtupleFile(ntupleDescription, perThread, fFileNumber); } diff --git a/source/analysis/root/src/G4RootNtupleFileManager.cc b/source/analysis/root/src/G4RootNtupleFileManager.cc index a28ae5adb3..efc375d615 100644 --- a/source/analysis/root/src/G4RootNtupleFileManager.cc +++ b/source/analysis/root/src/G4RootNtupleFileManager.cc @@ -32,53 +32,24 @@ #include "G4RootMainNtupleManager.hh" #include "G4RootPNtupleManager.hh" #include "G4VAnalysisManager.hh" -#include "G4AnalysisVerbose.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" #include "G4Threading.hh" #include "G4AutoLock.hh" -#include -#include - -namespace { - -void MergingException(const G4String& functionName, - G4ExceptionDescription& description) -{ - G4String inFunction = "G4RootNtupleFileManager::" + functionName; - G4Exception(inFunction, "Analysis_W013", JustWarning, description); -} - -} - using namespace G4Analysis; using std::make_shared; +using std::to_string; + + G4RootNtupleFileManager* G4RootNtupleFileManager::fgMasterInstance = nullptr; //_____________________________________________________________________________ G4RootNtupleFileManager::G4RootNtupleFileManager(const G4AnalysisManagerState& state) - : G4VNtupleFileManager(state, "root"), - fIsInitialized(false), - fNofNtupleFiles(0), - fNtupleRowWise(false), - fNtupleRowMode(true), - fNtupleMergeMode(G4NtupleMergeMode::kNone), - fNtupleManager(nullptr), - fSlaveNtupleManager(nullptr), - fFileManager(nullptr) + : G4VNtupleFileManager(state, "root") { - if ( G4Threading::IsMasterThread() && fgMasterInstance ) { - G4ExceptionDescription description; - description - << " " - << "G4RootNtupleFileManager already exists." - << "Cannot create another instance."; - G4Exception("G4RootNtupleFileManager::G4RootNtupleFileManager()", - "Analysis_F001", FatalException, description); - } if ( G4Threading::IsMasterThread() ) fgMasterInstance = this; // Do not merge ntuples by default @@ -91,45 +62,37 @@ G4RootNtupleFileManager::G4RootNtupleFileManager(const G4AnalysisManagerState& s //_____________________________________________________________________________ G4RootNtupleFileManager::~G4RootNtupleFileManager() { - if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; + if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; } -// +// // private methods // //_____________________________________________________________________________ -void G4RootNtupleFileManager::SetNtupleMergingMode(G4bool mergeNtuples, +void G4RootNtupleFileManager::SetNtupleMergingMode(G4bool mergeNtuples, G4int nofNtupleFiles) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("set", "ntuple merging mode", ""); - } -#endif + Message(kVL4, "set", "ntuple merging mode"); auto canMerge = true; // Illegal situations if ( mergeNtuples && ( ! G4Threading::IsMultithreadedApplication() ) ) { - G4ExceptionDescription description; - description - << "Merging ntuples is not applicable in sequential application." << G4endl - << "Setting was ignored."; - MergingException("SetNtupleMergingMode", description); - canMerge = false; + Warn("Merging ntuples is not applicable in sequential application.\n" + "Setting was ignored.", + fkClass, "SetNtupleMergingMode"); + canMerge = false; } // Illegal situations if ( mergeNtuples && G4Threading::IsMultithreadedApplication() && ( ! fgMasterInstance ) ) { - G4ExceptionDescription description; - description - << "Merging ntuples requires G4AnalysisManager instance on master." << G4endl - << "Setting was ignored."; - MergingException("SetNtupleMergingMode", description); - canMerge = false; + Warn("Merging ntuples requires G4AnalysisManager instance on master.\n" + "Setting was ignored.", + fkClass, "SetNtupleMergingMode"); + canMerge = false; } G4String mergingMode; @@ -140,34 +103,28 @@ void G4RootNtupleFileManager::SetNtupleMergingMode(G4bool mergeNtuples, else { // Set the number of reduced ntuple files fNofNtupleFiles = nofNtupleFiles; - + // Check the number of reduced ntuple files if ( fNofNtupleFiles < 0 ) { - G4ExceptionDescription description; - description - << "Number of reduced files must be [0, nofThreads]." << G4endl - << "Cannot set " << nofNtupleFiles << " files" << G4endl - << "Ntuples will be merged in a single file."; - MergingException("SetNtupleMergingMode", description); + Warn("Number of reduced files must be [0, nofThreads].\n" + "Cannot set " + to_string(nofNtupleFiles) +" files.\n" + + "Setting was ignored.", + fkClass, "SetNtupleMergingMode"); fNofNtupleFiles = 0; } - + // Forced merging mode G4bool isMaster = ! G4Threading::IsWorkerThread(); if ( isMaster ) { fNtupleMergeMode = G4NtupleMergeMode::kMain; mergingMode = "G4NtupleMergeMode::kMain"; } else { - fNtupleMergeMode = G4NtupleMergeMode::kSlave; + fNtupleMergeMode = G4NtupleMergeMode::kSlave; mergingMode = "G4NtupleMergeMode::kSlave"; } } -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("set", "ntuple merging mode", mergingMode); - } -#endif + Message(kVL2, "set", "ntuple merging mode", mergingMode); } //_____________________________________________________________________________ @@ -187,59 +144,53 @@ G4bool G4RootNtupleFileManager::CloseNtupleFiles() { // Close ntuple files - auto finalResult = true; + auto result = true; auto ntupleVector = fNtupleManager->GetNtupleDescriptionVector(); for ( auto ntupleDescription : ntupleVector) { - auto result = fFileManager->CloseNtupleFile(ntupleDescription); - finalResult = finalResult && result; + result &= fFileManager->CloseNtupleFile(ntupleDescription); } - return finalResult; + return result; } -// +// // public methods // //_____________________________________________________________________________ -void G4RootNtupleFileManager::SetNtupleMerging(G4bool mergeNtuples, +void G4RootNtupleFileManager::SetNtupleMerging(G4bool mergeNtuples, G4int nofNtupleFiles) { if ( fIsInitialized ) { - G4ExceptionDescription description; - description - << "Cannot change merging mode." << G4endl - << "The function must be called before OpenFile()."; - MergingException("SetNtupleMerging", description); - return; + Warn("Cannot change merging mode.\n" + "The function must be called before OpenFile().", + fkClass, "SetNtupleMerging"); + return; } - // Set ntuple merging mode + // Set ntuple merging mode SetNtupleMergingMode(mergeNtuples, nofNtupleFiles); } //_____________________________________________________________________________ -void G4RootNtupleFileManager::SetNtupleRowWise(G4bool rowWise, G4bool rowMode) +void G4RootNtupleFileManager::SetNtupleRowWise(G4bool rowWise, G4bool rowMode) { -#ifdef G4VERBOSE + // Print info even when setting makes no effect // (as we do not get printed the default setting in the output) G4String rowWiseMode; if ( rowWise ) { rowWiseMode = "row-wise with extra branch"; - } + } else if ( rowMode ) { rowWiseMode = "row-wise"; } else { - rowWiseMode = "column-wise"; + rowWiseMode = "column-wise"; } - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("set", "ntuple merging row mode", rowWiseMode); -#endif + Message(kVL1, "set", "ntuple merging row mode", rowWiseMode); // Do nothing if the mode is not changed if ( fNtupleRowWise == rowWise && fNtupleRowMode == rowMode ) return; @@ -257,7 +208,7 @@ void G4RootNtupleFileManager::SetNtupleRowWise(G4bool rowWise, G4bool rowMode) } //_____________________________________________________________________________ -void G4RootNtupleFileManager::SetBasketSize(unsigned int basketSize) +void G4RootNtupleFileManager::SetBasketSize(unsigned int basketSize) { fFileManager->SetBasketSize(basketSize); } @@ -275,10 +226,7 @@ std::shared_ptr G4RootNtupleFileManager::CreateNtupleManager() // If ntuple merging is activated, managers of different types are created // on master/worker. -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("create", "ntuple manager", ""); -#endif + Message(kVL4, "create", "ntuple manager"); // Check that file manager and anaysis manager are set ! @@ -286,7 +234,7 @@ std::shared_ptr G4RootNtupleFileManager::CreateNtupleManager() switch ( fNtupleMergeMode ) { case G4NtupleMergeMode::kNone: - fNtupleManager + fNtupleManager = make_shared( fState, fBookingManager, 0, 0, fNtupleRowWise, fNtupleRowMode); fNtupleManager->SetFileManager(fFileManager); @@ -297,7 +245,7 @@ std::shared_ptr G4RootNtupleFileManager::CreateNtupleManager() G4int nofMainManagers = fNofNtupleFiles; if ( ! nofMainManagers ) nofMainManagers = 1; // create one manager if merging required into the histos & profiles files - fNtupleManager + fNtupleManager = make_shared( fState, fBookingManager, nofMainManagers, fNofNtupleFiles, fNtupleRowWise, fNtupleRowMode); fNtupleManager->SetFileManager(fFileManager); @@ -308,32 +256,28 @@ std::shared_ptr G4RootNtupleFileManager::CreateNtupleManager() case G4NtupleMergeMode::kSlave: fNtupleManager = fgMasterInstance->fNtupleManager; // The master class is used only in Get* functions - auto mainNtupleManager - = fNtupleManager->GetMainNtupleManager(GetNtupleFileNumber()); - fSlaveNtupleManager + auto mainNtupleManager + = fNtupleManager->GetMainNtupleManager(GetNtupleFileNumber()); + fSlaveNtupleManager = make_shared( fState, fBookingManager, mainNtupleManager, fNtupleRowWise, fNtupleRowMode); activeNtupleManager = fSlaveNtupleManager; break; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - G4String mergeMode; - switch ( fNtupleMergeMode ) { - case G4NtupleMergeMode::kNone: - mergeMode = ""; - break; - case G4NtupleMergeMode::kMain: - mergeMode = "main "; - break; - case G4NtupleMergeMode::kSlave: - mergeMode = "slave "; - break; - } - fState.GetVerboseL3()->Message("create", mergeMode + "ntuple manager", ""); + G4String mergeMode; + switch ( fNtupleMergeMode ) { + case G4NtupleMergeMode::kNone: + mergeMode = ""; + break; + case G4NtupleMergeMode::kMain: + mergeMode = "main "; + break; + case G4NtupleMergeMode::kSlave: + mergeMode = "slave "; + break; } -#endif + Message(kVL3, "create", mergeMode + "ntuple manager"); fIsInitialized = true; @@ -341,37 +285,24 @@ std::shared_ptr G4RootNtupleFileManager::CreateNtupleManager() } //_____________________________________________________________________________ -#ifdef G4VERBOSE -G4bool G4RootNtupleFileManager::ActionAtOpenFile(const G4String& fileName) -#else -G4bool G4RootNtupleFileManager::ActionAtOpenFile(const G4String& /*fileName*/) -#endif +G4bool G4RootNtupleFileManager::ActionAtOpenFile([[maybe_unused]] const G4String& fileName) { // Check if fNtupleBookingManager is set - auto finalResult = true; - - if ( fNtupleMergeMode == G4NtupleMergeMode::kNone || + if ( fNtupleMergeMode == G4NtupleMergeMode::kNone || fNtupleMergeMode == G4NtupleMergeMode::kMain ) { -#ifdef G4VERBOSE G4String objectType = "analysis file"; if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) { objectType = "main analysis file"; } - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("open", objectType, fileName); -#endif + Message(kVL4, "open", objectType, fileName); // Creating files is triggered from CreateNtuple fNtupleManager->CreateNtuplesFromBooking( fBookingManager->GetNtupleBookingVector()); -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) { - fState.GetVerboseL1()->Message("open", objectType, fileName, finalResult); - } -#endif + Message(kVL1, "open", objectType, fileName); } // Creating ntuples from main is triggered from the first Fill call @@ -380,69 +311,56 @@ G4bool G4RootNtupleFileManager::ActionAtOpenFile(const G4String& /*fileName*/) // fSlaveNtupleManager->CreateNtuplesFromMain(); // } - return finalResult; -} - + return true; +} + //_____________________________________________________________________________ G4bool G4RootNtupleFileManager::ActionAtWrite() { if ( fNtupleMergeMode == G4NtupleMergeMode::kNone ) { return true; } - - auto finalResult = true; + + auto result = true; G4String ntupleType; if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) ntupleType = "main ntuples"; if ( fNtupleMergeMode == G4NtupleMergeMode::kSlave ) ntupleType = "slave ntuples"; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("merge", ntupleType, ""); -#endif + Message(kVL4, "merge", ntupleType); if ( fNtupleMergeMode == G4NtupleMergeMode::kMain ) { - auto result = fNtupleManager->Merge(); - finalResult = result && finalResult; - } - - if ( fNtupleMergeMode == G4NtupleMergeMode::kSlave ) { - auto result = fSlaveNtupleManager->Merge(); - finalResult = result && finalResult; + result &= fNtupleManager->Merge(); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1()->Message("merge", ntupleType, ""); -#endif - - return finalResult; + if ( fNtupleMergeMode == G4NtupleMergeMode::kSlave ) { + result &= fSlaveNtupleManager->Merge(); + } + + Message(kVL1, "merge", ntupleType, "", result); + + return result; } //_____________________________________________________________________________ G4bool G4RootNtupleFileManager::ActionAtCloseFile(G4bool reset) { - auto finalResult = true; + auto result = true; // close files if ( fNtupleMergeMode != G4NtupleMergeMode::kSlave ) { - auto result = CloseNtupleFiles(); - finalResult = finalResult && result; + result &= CloseNtupleFiles(); } if ( ! reset ) { - // The ntuples must be always reset when closing file) - auto result = Reset(); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Resetting data failed"; - G4Exception("G4RootNtupleFileManager::CloseFile()", - "Analysis_W021", JustWarning, description); + // The ntuples must be always reset when closing file) + if ( ! Reset() ) { + Warn("Resetting data failed", fkClass, "ActionAtCloseFile"); + result = false; } - finalResult = finalResult && result; } - return finalResult; + return result; } //_____________________________________________________________________________ @@ -451,11 +369,11 @@ G4bool G4RootNtupleFileManager::Reset() // Reset ntuples auto result = true; - - if ( fNtupleMergeMode == G4NtupleMergeMode::kNone || + + if ( fNtupleMergeMode == G4NtupleMergeMode::kNone || fNtupleMergeMode == G4NtupleMergeMode::kMain ) { - result = fNtupleManager->Reset(false); - } + result &= fNtupleManager->Reset(); + } return result; } diff --git a/source/analysis/root/src/G4RootNtupleManager.cc b/source/analysis/root/src/G4RootNtupleManager.cc index ea081cd4aa..94c277d33f 100644 --- a/source/analysis/root/src/G4RootNtupleManager.cc +++ b/source/analysis/root/src/G4RootNtupleManager.cc @@ -35,16 +35,14 @@ #include "tools/wroot/file" using namespace G4Analysis; +using std::to_string; //_____________________________________________________________________________ G4RootNtupleManager::G4RootNtupleManager(const G4AnalysisManagerState& state, - std::shared_ptr bookingManger, + const std::shared_ptr& bookingManger, G4int nofMainManagers, G4int nofFiles, G4bool rowWise, G4bool rowMode) : G4TNtupleManager(state), - fFileManager(nullptr), - fMainNtupleManagers(), - fNtupleFile(nullptr), fRowWise(rowWise), fRowMode(rowMode) { @@ -56,15 +54,11 @@ G4RootNtupleManager::G4RootNtupleManager(const G4AnalysisManagerState& state, } fMainNtupleManagers.push_back( std::make_shared( - this, bookingManger.get(), rowWise, fileNumber, fState)); + this, bookingManger, rowWise, fileNumber, fState)); } } -//_____________________________________________________________________________ -G4RootNtupleManager::~G4RootNtupleManager() -{} - -// +// // private methods // @@ -75,38 +69,34 @@ void G4RootNtupleManager::CreateTNtupleFromBooking( if ( ! fMainNtupleManagers.size() ) { // No merging if ( ntupleDescription->fNtuple ) { - G4String inFunction = "G4RootNtupleManager::::CreateTNtupleFromBooking"; - G4ExceptionDescription description; - description << "Cannot create ntuple. Ntuple already exists." << G4endl; - G4Exception(inFunction, "Analysis_W002", JustWarning, description); + Warn("Cannot create ntuple. Ntuple already exists.", + fkClass, "CreateTNtupleFromBooking"); return; - } - + } + // Create ntuple file from ntuple description auto ntupleFile = fFileManager->CreateNtupleFile(ntupleDescription); if ( ! ntupleFile ) { - G4String inFunction = "G4RootNtupleManager::::CreateTNtupleFromBooking"; - G4ExceptionDescription description; - description << "Cannot create ntuple. Ntuple file does not exist." << G4endl; - G4Exception(inFunction, "Analysis_W002", JustWarning, description); + Warn("Cannot create ntuple. Ntuple file does not exist.", + fkClass, "CreateTNtupleFromBooking"); return; } - + auto directory = std::get<2>(*ntupleFile); ntupleDescription->fNtuple = new tools::wroot::ntuple( *directory, ntupleDescription->fNtupleBooking, fRowWise); - + auto basketSize = fFileManager->GetBasketSize(); ntupleDescription->fNtuple->set_basket_size(basketSize); - - ntupleDescription->fIsNtupleOwner = false; + + ntupleDescription->fIsNtupleOwner = false; // ntuple object is deleted automatically when closing a file fNtupleVector.push_back(ntupleDescription->fNtuple); - } + } else { - // Merging activated - for ( auto manager : fMainNtupleManagers ) { + // Merging activated + for ( const auto& manager : fMainNtupleManagers ) { manager->CreateNtuple(ntupleDescription); } } @@ -120,41 +110,51 @@ void G4RootNtupleManager::FinishTNtuple( } //_____________________________________________________________________________ -G4bool G4RootNtupleManager::Reset(G4bool deleteNtuple) +G4bool G4RootNtupleManager::Reset() { - G4TNtupleManager ::Reset(deleteNtuple); + G4TNtupleManager ::Reset(); // this will clear ntuple vector - auto finalResult = true; + auto result = true; - for ( auto manager : fMainNtupleManagers ) { - auto result = manager->Reset(false); - finalResult = result && finalResult; + for ( const auto& manager : fMainNtupleManagers ) { + result &= manager->Reset(); } - return finalResult; + return result; +} + +//_____________________________________________________________________________ +void G4RootNtupleManager::Clear() +{ + G4TNtupleManager ::Clear(); + // this will clear ntuple vector + + for ( const auto& manager : fMainNtupleManagers ) { + manager->ClearData(); + } } //_____________________________________________________________________________ G4bool G4RootNtupleManager::Merge() { - auto finalResult = true; + auto result = true; - for ( auto manager : fMainNtupleManagers ) { - auto result = manager->Merge(); - finalResult = result && finalResult; + for ( const auto& manager : fMainNtupleManagers ) { + result &= manager->Merge(); } - return finalResult; + return result; } //_____________________________________________________________________________ -void G4RootNtupleManager::SetFileManager(std::shared_ptr fileManager) -{ - fFileManager = fileManager; +void G4RootNtupleManager::SetFileManager( + const std::shared_ptr& fileManager) +{ + fFileManager = fileManager; - for ( auto mainNtupleManager : fMainNtupleManagers) { - mainNtupleManager->SetFileManager(fileManager); + for ( const auto& manager : fMainNtupleManagers ) { + manager->SetFileManager(fileManager); } } @@ -176,11 +176,9 @@ std::shared_ptr G4RootNtupleManager::GetMainNtupleManager(G4int index) const { if ( index < 0 || index >= G4int(fMainNtupleManagers.size()) ) { - G4String inFunction = "G4RootNtupleManager::::GetMainNtupleManager"; - G4ExceptionDescription description; - description << " " << "main ntuple manager " << index << " does not exist."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); - return nullptr; + Warn("main ntuple manager " + to_string(index) + " does not exist.", + fkClass, "GetMainNtupleManager"); + return nullptr; } return fMainNtupleManagers[index]; @@ -188,28 +186,22 @@ G4RootNtupleManager::GetMainNtupleManager(G4int index) const //_____________________________________________________________________________ unsigned int G4RootNtupleManager::GetBasketSize() const -{ +{ if ( ! fFileManager ) { - G4String inFunction = "G4RootNtupleManager::::GetBasketSize"; - G4ExceptionDescription description; - description << " " << "File manager must be defined first."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); - return 0; + Warn("File manager must be defined first.", fkClass, "GetBasketSize"); + return 0; } - return fFileManager->GetBasketSize(); + return fFileManager->GetBasketSize(); } //_____________________________________________________________________________ unsigned int G4RootNtupleManager::GetBasketEntries() const -{ +{ if ( ! fFileManager ) { - G4String inFunction = "G4RootNtupleManager::::GetBasketEntries"; - G4ExceptionDescription description; - description << " " << "File manager must be defined first."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); - return 0; + Warn("File manager must be defined first.", fkClass, "GetBasketEntries"); + return 0; } - return fFileManager->GetBasketEntries(); + return fFileManager->GetBasketEntries(); } diff --git a/source/analysis/root/src/G4RootPNtupleManager.cc b/source/analysis/root/src/G4RootPNtupleManager.cc index ce5a799137..26e60e656d 100644 --- a/source/analysis/root/src/G4RootPNtupleManager.cc +++ b/source/analysis/root/src/G4RootPNtupleManager.cc @@ -34,6 +34,9 @@ #include "tools/wroot/file" #include "tools/wroot/ntuple" +using namespace G4Analysis; +using std::to_string; + // mutex in a file scope namespace { @@ -41,13 +44,13 @@ namespace { G4Mutex pntupleMutex = G4MUTEX_INITIALIZER; //_____________________________________________________________________________ -void NotExistException(const G4String& what, G4int id, const G4String& functionName) +void NotExistWarning(const G4String& what, G4int id, + std::string_view className, + std::string_view functionName) { - G4String inFunction = "G4RootPNtupleManager::"; - inFunction += functionName; - G4ExceptionDescription description; - description << what << " id= " << id << " does not exist."; - G4Exception(inFunction, "Analysis_W011", JustWarning, description); + Warn(what + " id= " + to_string(id) + " does not exist.", + className, functionName); + } } @@ -58,13 +61,10 @@ G4RootPNtupleManager::G4RootPNtupleManager(const G4AnalysisManagerState& state, std::shared_ptr main, G4bool rowWise, G4bool rowMode) : G4BaseNtupleManager(state), - fBookingManager(bookingManger), - fMainNtupleManager(main), - fNtupleDescriptionVector(), - fNtupleVector(), + fBookingManager(std::move(bookingManger)), + fMainNtupleManager(std::move(main)), fRowWise(rowWise), - fRowMode(rowMode), - fCreateNtuples(true) + fRowMode(rowMode) {} //_____________________________________________________________________________ @@ -72,7 +72,7 @@ G4RootPNtupleManager::~G4RootPNtupleManager() { for ( auto ntupleDescription : fNtupleDescriptionVector ) { delete ntupleDescription; - } + } } // @@ -80,53 +80,53 @@ G4RootPNtupleManager::~G4RootPNtupleManager() // //_____________________________________________________________________________ -G4RootPNtupleDescription* +G4RootPNtupleDescription* G4RootPNtupleManager::GetNtupleDescriptionInFunction( - G4int id, G4String functionName, G4bool warn) const -{ + G4int id, std::string_view functionName, G4bool warn) const +{ auto index = id - fFirstId; if ( index < 0 || index >= G4int(fNtupleDescriptionVector.size()) ) { if ( warn) { - NotExistException("ntuple description", id, functionName); + NotExistWarning("ntuple description", id, fkClass, functionName); } - return nullptr; + return nullptr; } - + return fNtupleDescriptionVector[index]; } //_____________________________________________________________________________ -tools::wroot::base_pntuple* +tools::wroot::base_pntuple* G4RootPNtupleManager::GetNtupleInFunction( - G4int id, G4String functionName, G4bool warn) const -{ + G4int id, std::string_view functionName, G4bool warn) const +{ auto ntupleDescription = GetNtupleDescriptionInFunction(id, functionName); if ( ! ntupleDescription ) return nullptr; if ( ! ntupleDescription->fBasePNtuple ) { if ( warn ) { - NotExistException("ntuple", id, functionName); + NotExistWarning("ntuple", id, fkClass, functionName); } return nullptr; - } + } return ntupleDescription->fBasePNtuple; } //_____________________________________________________________________________ tools::wroot::ntuple* G4RootPNtupleManager::GetMainNtupleInFunction( - G4int id, G4String functionName, G4bool warn) const -{ + G4int id, std::string_view functionName, G4bool warn) const +{ auto& mainNtupleVector = fMainNtupleManager->GetNtupleVector(); auto index = id - fFirstId; if ( index < 0 || index >= G4int(mainNtupleVector.size()) ) { if ( warn) { - NotExistException("main ntuple", id, functionName); + NotExistWarning("main ntuple", id, fkClass, functionName); } - return nullptr; + return nullptr; } - + return mainNtupleVector[index]; } @@ -139,20 +139,12 @@ void G4RootPNtupleManager::CreateNtupleFromMain( G4RootPNtupleDescription* ntupleDescription, tools::wroot::ntuple* mainNtuple) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4() - ->Message("create from main", "pntuple", mainNtuple->name()); - } -#endif + Message(kVL4, "create from main", "pntuple", mainNtuple->name()); auto file = fMainNtupleManager->GetNtupleFile(&ntupleDescription->fDescription); if ( ! file ) { - G4String inFunction = "G4RootPNtupleManager::::CreateNtupleFromMain"; - G4ExceptionDescription description; - description - << "Cannot create pntuple. Main ntuple file does not exist." << G4endl; - G4Exception(inFunction, "Analysis_W002", JustWarning, description); + Warn("Cannot create pntuple. Main ntuple file does not exist.", + fkClass, "CreateNtupleFromMain"); return; } @@ -165,55 +157,50 @@ void G4RootPNtupleManager::CreateNtupleFromMain( G4bool verbose = true; if ( fRowWise ) { auto mainBranch = mainNtuple->get_row_wise_branch(); - tools::wroot::mt_ntuple_row_wise* mtNtuple + auto mtNtuple = new tools::wroot::mt_ntuple_row_wise( G4cout, rfile->byte_swap(), rfile->compression(), mainNtuple->dir().seek_directory(), - *mainBranch, mainBranch->basket_size(), + *mainBranch, mainBranch->basket_size(), ntupleDescription->fDescription.fNtupleBooking, verbose); ntupleDescription->fNtuple = static_cast(mtNtuple); ntupleDescription->fBasePNtuple = static_cast(mtNtuple); - } + } else { std::vector basketSizes; tools_vforcit(tools::wroot::branch*, ntupleDescription->fMainBranches, it) { basketSizes.push_back((*it)->basket_size()); } auto basketEntries = fMainNtupleManager->GetBasketEntries(); - - tools::wroot::mt_ntuple_column_wise* mtNtuple = + + auto mtNtuple = new tools::wroot::mt_ntuple_column_wise( G4cout, rfile->byte_swap(), rfile->compression(), mainNtuple->dir().seek_directory(), ntupleDescription->fMainBranches, basketSizes, - ntupleDescription->fDescription.fNtupleBooking, + ntupleDescription->fDescription.fNtupleBooking, fRowMode, basketEntries, verbose); - + ntupleDescription->fNtuple = static_cast(mtNtuple); ntupleDescription->fBasePNtuple = static_cast(mtNtuple); } - ntupleDescription->fDescription.fIsNtupleOwner = true; + ntupleDescription->fDescription.fIsNtupleOwner = true; // // pntuple object is not deleted automatically - fNtupleVector.push_back(ntupleDescription->fNtuple); + fNtupleVector.push_back(ntupleDescription->fNtuple); -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3() - ->Message("create from main", "pntuple", mainNtuple->name()); - } -#endif + Message(kVL3, "create from main", "pntuple", mainNtuple->name()); } //_____________________________________________________________________________ void G4RootPNtupleManager::CreateNtuplesFromMain() { -// Create ntuple from booking (if not yet done) and main ntuple +// Create ntuple from booking (if not yet done) and main ntuple // This function is called from the first Fill call. // Create pntuple descriptions from ntuple booking. @@ -221,13 +208,13 @@ void G4RootPNtupleManager::CreateNtuplesFromMain() for ( auto g4NtupleBooking : g4NtupleBookings ) { auto ntupleDescription = new G4RootPNtupleDescription(g4NtupleBooking); // Save g4booking, activation in pntuple booking - fNtupleDescriptionVector.push_back(ntupleDescription); + fNtupleDescriptionVector.push_back(ntupleDescription); } auto& mainNtupleVector = fMainNtupleManager->GetNtupleVector(); G4int lcounter = 0; - for ( auto mainNtuple : mainNtupleVector ) { + for ( auto mainNtuple : mainNtupleVector ) { auto& ntupleDescription = fNtupleDescriptionVector[lcounter++]; CreateNtupleFromMain(ntupleDescription, mainNtuple); } @@ -242,55 +229,51 @@ G4int G4RootPNtupleManager::CreateNtuple(G4NtupleBooking* /*booking*/) // Nothing to be done here. return G4Analysis::kInvalidId; -} +} //_____________________________________________________________________________ G4bool G4RootPNtupleManager::FillNtupleIColumn( G4int ntupleId, G4int columnId, G4int value) { return FillNtupleTColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ G4bool G4RootPNtupleManager::FillNtupleFColumn( G4int ntupleId, G4int columnId, G4float value) { return FillNtupleTColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ G4bool G4RootPNtupleManager::FillNtupleDColumn( G4int ntupleId, G4int columnId, G4double value) { return FillNtupleTColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ G4bool G4RootPNtupleManager::FillNtupleSColumn( G4int ntupleId, G4int columnId, const G4String& value) { return FillNtupleTColumn(ntupleId, columnId, value); -} +} //_____________________________________________________________________________ G4bool G4RootPNtupleManager::AddNtupleRow(G4int ntupleId) -{ +{ if (fCreateNtuples) { CreateNtuplesFromMain(); } if ( fState.GetIsActivation() && ( ! GetActivation(ntupleId) ) ) { - //G4cout << "Skipping AddNtupleRow for " << ntupleId << G4endl; - return false; - } + //G4cout << "Skipping AddNtupleRow for " << ntupleId << G4endl; + return false; + } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId; - fState.GetVerboseL4()->Message("add", "pntuple row", description); - } -#endif + if ( IsVerbose(kVL4) ) { + Message(kVL4, "add", "pntuple row", " ntupleId " + to_string(ntupleId)); + } auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "AddNtupleRow"); if ( ! ntupleDescription ) return false; @@ -300,26 +283,20 @@ G4bool G4RootPNtupleManager::AddNtupleRow(G4int ntupleId) G4AutoLock lock(&pntupleMutex); lock.unlock(); mutex toolsLock(lock); - auto result + auto result = ntupleDescription->fNtuple->add_row(toolsLock, *rfile); if ( ! result ) { - G4ExceptionDescription description; - description << " " << " ntupleId " << ntupleId - << "adding row has failed."; - G4Exception("G4RootPNtupleManager::AddNtupleRow()", - "Analysis_W022", JustWarning, description); + Warn("NtupleId " + to_string(ntupleId) + "adding row failed.", + fkClass, "AddNtupleRow"); } ntupleDescription->fDescription.fHasFill = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId; - fState.GetVerboseL3()->Message("add", "pntuple row", description); - } -#endif + if ( IsVerbose(kVL3) ) { + Message(kVL3, "add", "pntuple row", " ntupleId " + to_string(ntupleId)); + } + return true; } @@ -335,57 +312,47 @@ G4bool G4RootPNtupleManager::Merge() continue; } -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4() - ->Message("merge", "pntuple", ntupleDescription->fDescription.fNtupleBooking.name()); - } -#endif - + if ( IsVerbose(kVL4) ) { + Message(kVL4, "merge", "pntuple", ntupleDescription->fDescription.fNtupleBooking.name()); + } + auto rfile = std::get<0>(*ntupleDescription->fDescription.fFile); G4AutoLock lock(&pntupleMutex); lock.unlock(); mutex toolsLock(lock); - auto result + auto result = ntupleDescription->fNtuple->end_fill(toolsLock, *rfile); if ( ! result ) { - G4ExceptionDescription description; - description << " " << " ntuple " << ntupleDescription->fDescription.fNtupleBooking.name() - << "end fill has failed."; - G4Exception("G4RootPNtupleManager::Merge()", - "Analysis_W031", JustWarning, description); + Warn("Ntuple " + ntupleDescription->fDescription.fNtupleBooking.name() + + "end fill has failed.", fkClass, "Merge"); } delete ntupleDescription->fNtuple; ntupleDescription->fNtuple = nullptr; - -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) { - fState.GetVerboseL3() - ->Message("merge", "pntuple", ntupleDescription->fDescription.fNtupleBooking.name()); - } -#endif + + if ( IsVerbose(kVL3) ) { + Message(kVL3, "merge", "pntuple", ntupleDescription->fDescription.fNtupleBooking.name()); + } + } return true; } //_____________________________________________________________________________ -G4bool G4RootPNtupleManager::Reset(G4bool deleteNtuple) +void G4RootPNtupleManager::Clear() { for ( auto ntupleDescription : fNtupleDescriptionVector ) { - if ( deleteNtuple ) { - delete ntupleDescription->fNtuple; - } - ntupleDescription->fNtuple = nullptr; + delete ntupleDescription->fNtuple; } - fNtupleVector.clear(); - - return true; -} + fNtupleDescriptionVector.clear(); + fNtupleVector.clear(); + + Message(kVL2, "clear", "pntuples"); +} //_____________________________________________________________________________ @@ -394,7 +361,7 @@ void G4RootPNtupleManager::SetActivation( { for ( auto ntupleDescription : fNtupleDescriptionVector ) { ntupleDescription->fDescription.fActivation = activation; - } + } } //_____________________________________________________________________________ @@ -426,7 +393,7 @@ G4int G4RootPNtupleManager::GetNofNtuples() const //_____________________________________________________________________________ void G4RootPNtupleManager::SetNtupleRowWise(G4bool rowWise, G4bool rowMode) -{ +{ fRowWise = rowWise; fRowMode = rowMode; } diff --git a/source/analysis/root/src/G4RootRFileManager.cc b/source/analysis/root/src/G4RootRFileManager.cc index 255c5e0fa4..fbd326ac88 100644 --- a/source/analysis/root/src/G4RootRFileManager.cc +++ b/source/analysis/root/src/G4RootRFileManager.cc @@ -27,28 +27,34 @@ // Author: Ivana Hrivnacova, 10/09/2014 (ivana@ipno.in2p3.fr) #include "G4RootRFileManager.hh" +#include "G4RootHnRFileManager.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" #include "tools/rroot/file" -#include +#include "tools/zlib" -#include -#include +using namespace G4Analysis; +using namespace tools; //_____________________________________________________________________________ G4RootRFileManager::G4RootRFileManager(const G4AnalysisManagerState& state) - : G4BaseFileManager(state), - fRFiles() + : G4VRFileManager(state) { + // Create helpers defined in the base class + fH1RFileManager = std::make_shared>(this); + fH2RFileManager = std::make_shared>(this); + fH3RFileManager = std::make_shared>(this); + fP1RFileManager = std::make_shared>(this); + fP2RFileManager = std::make_shared>(this); } //_____________________________________________________________________________ G4RootRFileManager::~G4RootRFileManager() -{ - for (G4int i=0; iMessage("open", "read analysis file", name); -#endif + Message(kVL4, "open", "read analysis file", name); // create new file - tools::rroot::file* newFile = new tools::rroot::file(G4cout, name); + auto newFile = new tools::rroot::file(G4cout, name); newFile->add_unziper('Z',tools::decompress_buffer); - + if ( ! newFile->is_open() ) { - G4ExceptionDescription description; - description << " " << "Cannot open file " << name; - G4Exception("G4RootRFileManager::OpenFile()", - "Analysis_WR001", JustWarning, description); + Warn("Cannot open file " + name, fkClass, "OpenRFile"); delete newFile; return false; } // add file in a map and delete the previous file if it exists - std::map::iterator it - = fRFiles.find(name); - if ( it != fRFiles.end() ) { + auto it = fRFiles.find(name); + if ( it != fRFiles.end() ) { delete it->second; it->second = newFile; } else { fRFiles[name] = newFile; - } + } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("open", "read analysis file", name); -#endif + Message(kVL1, "open", "read analysis file", name); return true; -} - +} + //_____________________________________________________________________________ tools::rroot::file* G4RootRFileManager::GetRFile(const G4String& fileName, G4bool isPerThread) const -{ +{ // Get full file name G4String name = GetFullFileName(fileName, isPerThread); - std::map::const_iterator it - = fRFiles.find(name); + auto it = fRFiles.find(name); if ( it != fRFiles.end() ) return it->second; else { return nullptr; - } + } } diff --git a/source/analysis/root/src/G4RootRNtupleManager.cc b/source/analysis/root/src/G4RootRNtupleManager.cc index 16248e229e..4b08e0a843 100644 --- a/source/analysis/root/src/G4RootRNtupleManager.cc +++ b/source/analysis/root/src/G4RootRNtupleManager.cc @@ -27,21 +27,112 @@ // Author: Ivana Hrivnacova, 09/04/2014 (ivana@ipno.in2p3.fr) #include "G4RootRNtupleManager.hh" +#include "G4RootRFileManager.hh" #include "G4AnalysisManagerState.hh" +#include "G4AnalysisUtilities.hh" + +#include "tools/rroot/file" +#include "tools/rroot/rall" +#include "tools/rroot/streamers" +#include "tools/rroot/fac" +#include "tools/rroot/tree" + +using namespace G4Analysis; //_____________________________________________________________________________ G4RootRNtupleManager::G4RootRNtupleManager(const G4AnalysisManagerState& state) : G4TRNtupleManager(state) {} -//_____________________________________________________________________________ -G4RootRNtupleManager::~G4RootRNtupleManager() -{} - -// +// // private methods // +//_____________________________________________________________________________ +G4int G4RootRNtupleManager::ReadNtupleImpl(const G4String& ntupleName, + const G4String& fileName, + const G4String& dirName, + G4bool isUserFileName) +{ + Message(kVL4, "read", "ntuple", ntupleName); + + // Ntuples are saved per thread + // but do not apply the thread suffix if fileName is provided explicitly + auto isPerThread = true; + if ( isUserFileName ) isPerThread = false; + + // Get or open a file + auto rfile = fFileManager->GetRFile(fileName, isPerThread); + if ( ! rfile ) { + if ( ! fFileManager->OpenRFile(fileName, isPerThread) ) return kInvalidId; + rfile = fFileManager->GetRFile(fileName, isPerThread); + } + + // Get key + tools::rroot::key* key = nullptr; + tools::rroot::TDirectory* newDir = nullptr; + if ( ! dirName.empty() ) { + newDir = tools::rroot::find_dir(rfile->dir(), dirName); + if ( newDir ) { + key = newDir->find_key(ntupleName); + } + else { + G4Analysis::Warn( + "Directory " + dirName + " not found in file " + fileName + ".", + fkClass, "ReadNtupleImpl"); + return kInvalidId; + } + } + else { + key = rfile->dir().find_key(ntupleName); + } + + if ( ! key ) { + Warn("Key " + ntupleName + " for Ntuple not found in file " + fileName + + ", directory " + dirName, fkClass, "ReadNtupleImpl"); + delete newDir; + return kInvalidId; + } + + unsigned int size; + char* charBuffer = key->get_object_buffer(*rfile, size); + if ( ! charBuffer ) { + Warn("Cannot get data buffer for Ntuple " + ntupleName + + " in file " + fileName, fkClass, "ReadNtupleImpl"); + delete newDir; + return kInvalidId; + } + + auto verbose = false; + auto buffer + = new tools::rroot::buffer(G4cout, rfile->byte_swap(), size, charBuffer, + key->key_length(), verbose); + buffer->set_map_objs(true); + + auto fac = new tools::rroot::fac(G4cout); + + auto tree = new tools::rroot::tree(*rfile, *fac); + if ( ! tree->stream(*buffer) ) { + Warn("TTree streaming failed for Ntuple " + ntupleName + + " in file " + fileName, + fkClass, "ReadNtupleImpl"); + + delete buffer; + delete tree; + delete newDir; + return kInvalidId; + } + + auto rntuple = new tools::rroot::ntuple(*tree); //use the flat ntuple API. + auto rntupleDescription = new G4TRNtupleDescription(rntuple); + + auto id = SetNtuple(rntupleDescription); + + Message(kVL2, "read", "ntuple", ntupleName, id > kInvalidId); + + return id; +} + //_____________________________________________________________________________ G4bool G4RootRNtupleManager::GetTNtupleRow( G4TRNtupleDescription* ntupleDescription) @@ -53,12 +144,7 @@ G4bool G4RootRNtupleManager::GetTNtupleRow( if ( ! isInitialized ) { if ( ! ntuple->initialize(G4cout, *ntupleBinding) ) { - G4ExceptionDescription description; - description - << " " - << "Ntuple initialization failed !!"; - G4Exception("G4RootRNtuple::GetTNtupleRow()", - "Analysis_WR021", JustWarning, description); + Warn("Ntuple initialization failed !!", fkClass, "GetTNtupleRow"); return false; } ntupleDescription->fIsInitialized = true; @@ -68,15 +154,10 @@ G4bool G4RootRNtupleManager::GetTNtupleRow( auto next = ntuple->next(); if ( next ) { if ( ! ntuple->get_row() ) { - G4ExceptionDescription description; - description - << " " - << "Ntuple get_row() failed !!"; - G4Exception("G4RootRNtuple::GetTNtupleRow()", - "Analysis_WR021", JustWarning, description); + Warn("Ntuple get_row() failed !!", fkClass, "GetTNtupleRow"); return false; } - } + } return next; -} +} diff --git a/source/analysis/xml/include/G4XmlAnalysisManager.hh b/source/analysis/xml/include/G4XmlAnalysisManager.hh index d6722e9ca9..49343737d5 100644 --- a/source/analysis/xml/include/G4XmlAnalysisManager.hh +++ b/source/analysis/xml/include/G4XmlAnalysisManager.hh @@ -25,7 +25,7 @@ // // The main manager for Xml analysis. -// It delegates most of functions to the object specific managers. +// It delegates most of functions to the object specific managers. // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) @@ -38,17 +38,22 @@ #include "tools/waxml/ntuple" #include +#include +class G4XmlAnalysisManager; class G4XmlFileManager; class G4XmlNtupleFileManager; +template +class G4ThreadLocalSingleton; class G4XmlAnalysisManager : public G4ToolsAnalysisManager { + friend class G4ThreadLocalSingleton; + public: - explicit G4XmlAnalysisManager(G4bool isMaster = true); - ~G4XmlAnalysisManager(); - - // static methods + virtual ~G4XmlAnalysisManager(); + + // Static methods static G4XmlAnalysisManager* Instance(); static G4bool IsInstance(); @@ -61,37 +66,26 @@ class G4XmlAnalysisManager : public G4ToolsAnalysisManager std::vector::iterator EndNtuple(); std::vector::const_iterator BeginConstNtuple() const; std::vector::const_iterator EndConstNtuple() const; - + protected: - // virtual methods from base class + // Virtual methods from base class virtual G4bool OpenFileImpl(const G4String& fileName) final; virtual G4bool WriteImpl() final; - virtual G4bool CloseFileImpl(G4bool reset) final; + virtual G4bool CloseFileImpl(G4bool reset) final; + virtual G4bool ResetImpl() final; virtual G4bool IsOpenFileImpl() const final; private: - // static data members - static G4XmlAnalysisManager* fgMasterInstance; - static G4ThreadLocal G4XmlAnalysisManager* fgInstance; + G4XmlAnalysisManager(); - // methods - template - G4bool WriteT(const std::vector& htVector, - const std::vector& hnVector, - const G4String& directoryName, - const G4String& hnType); - G4bool WriteH1(); - G4bool WriteH2(); - G4bool WriteH3(); - G4bool WriteP1(); - G4bool WriteP2(); - G4bool WriteNtuple(); - G4bool CloseNtupleFiles(); - G4bool Reset(); + // Static data members + inline static G4XmlAnalysisManager* fgMasterInstance { nullptr }; + inline static G4ThreadLocal G4bool fgIsInstance { false }; + static constexpr std::string_view fkClass { "G4XmlAnalysisManager" }; - // data members - std::shared_ptr fFileManager; - std::shared_ptr fNtupleFileManager; + // Data members + std::shared_ptr fFileManager { nullptr }; + std::shared_ptr fNtupleFileManager { nullptr }; }; #include "G4XmlAnalysisManager.icc" diff --git a/source/analysis/xml/include/G4XmlAnalysisManager.icc b/source/analysis/xml/include/G4XmlAnalysisManager.icc index 141ca901db..d3e806bc00 100644 --- a/source/analysis/xml/include/G4XmlAnalysisManager.icc +++ b/source/analysis/xml/include/G4XmlAnalysisManager.icc @@ -28,48 +28,6 @@ #include "G4XmlNtupleManager.hh" #include "G4XmlFileManager.hh" -#include "tools/waxml/histos" - -//_____________________________________________________________________________ -template -inline -G4bool G4XmlAnalysisManager::WriteT(const std::vector& htVector, - const std::vector& hnVector, - const G4String& directoryName, - const G4String& hnType) -{ - for ( G4int i=0; iGetActivation(); - auto name = info->GetName(); - // skip writing if inactivated - if ( fState.GetIsActivation() && ( ! activation ) ) continue; - auto ht = htVector[i]; -#ifdef G4VERBOSE - if ( fState.GetVerboseL3() ) - fState.GetVerboseL3()->Message("write", hnType, name); -#endif - G4String path = "/"; - path.append(directoryName); - std::shared_ptr hnFile = fFileManager->GetFile(); - // Do nothing if there is no file - if ( ! hnFile.get() ) return false; - - G4bool result - = tools::waxml::write(*hnFile, *ht, path, name); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "saving " << hnType << " " << name << " failed"; - G4Exception("G4XmlAnalysisManager::Write()", - "Analysis_W022", JustWarning, description); - return false; - } - fFileManager->LockDirectoryNames(); - } - - return true; -} - //_____________________________________________________________________________ inline G4bool G4XmlAnalysisManager::IsOpenFileImpl() const @@ -82,41 +40,41 @@ inline tools::waxml::ntuple* G4XmlAnalysisManager::GetNtuple() const { return fNtupleFileManager->GetNtupleManager()->GetNtuple(); -} +} //_____________________________________________________________________________ inline tools::waxml::ntuple* G4XmlAnalysisManager::GetNtuple(G4int ntupleId) const { return fNtupleFileManager->GetNtupleManager()->GetNtuple(ntupleId); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4XmlAnalysisManager::BeginNtuple() { return fNtupleFileManager->GetNtupleManager()->BeginNtuple(); -} +} //_____________________________________________________________________________ inline std::vector::iterator G4XmlAnalysisManager::EndNtuple() { return fNtupleFileManager->GetNtupleManager()->EndNtuple(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4XmlAnalysisManager::BeginConstNtuple() const { return fNtupleFileManager->GetNtupleManager()->BeginConstNtuple(); -} +} //_____________________________________________________________________________ inline -std::vector::const_iterator +std::vector::const_iterator G4XmlAnalysisManager::EndConstNtuple() const { return fNtupleFileManager->GetNtupleManager()->EndConstNtuple(); -} +} diff --git a/source/analysis/xml/include/G4XmlAnalysisReader.hh b/source/analysis/xml/include/G4XmlAnalysisReader.hh index 73834a1b43..e1d2e03f8e 100644 --- a/source/analysis/xml/include/G4XmlAnalysisReader.hh +++ b/source/analysis/xml/include/G4XmlAnalysisReader.hh @@ -25,7 +25,7 @@ // // The main manager for Xml analysis reader. -// It delegates most of functions to the object specific managers. +// It delegates most of functions to the object specific managers. // Author: Ivana Hrivnacova, 25/07/2014 (ivana@ipno.in2p3.fr) @@ -35,66 +35,51 @@ #include "G4ToolsAnalysisReader.hh" #include "globals.hh" -#include "tools/histo/h1d" -#include "tools/histo/h2d" -#include "tools/histo/h3d" -#include "tools/histo/p1d" -#include "tools/histo/p2d" #include "tools/raxml" +#include +#include + +class G4XmlAnalysisReader; class G4XmlRFileManager; -class G4H1ToolsManager; -class G4H2ToolsManager; -class G4H3ToolsManager; -class G4P1ToolsManager; -class G4P2ToolsManager; class G4XmlRNtupleManager; - +template +class G4ThreadLocalSingleton; + class G4XmlAnalysisReader : public G4ToolsAnalysisReader { + friend class G4ThreadLocalSingleton; + public: - explicit G4XmlAnalysisReader(G4bool isMaster = true); virtual ~G4XmlAnalysisReader(); - - // static methods + + // Static methods static G4XmlAnalysisReader* Instance(); // Access methods tools::aida::ntuple* GetNtuple() const; tools::aida::ntuple* GetNtuple(G4int ntupleId) const; using G4VAnalysisReader::GetNtuple; - + protected: - // virtual methods from base class - virtual G4int ReadH1Impl(const G4String& h1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadH2Impl(const G4String& h1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadH3Impl(const G4String& h1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadP1Impl(const G4String& h1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadP2Impl(const G4String& h1Name, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; - virtual G4int ReadNtupleImpl(const G4String& ntupleName, const G4String& fileName, - const G4String& dirName, G4bool isUserFileName) final; + G4XmlAnalysisReader(); + + // Virtual methods from base class + virtual G4bool CloseFilesImpl(G4bool reset) final; private: - // static data members - static G4XmlAnalysisReader* fgMasterInstance; - static G4ThreadLocal G4XmlAnalysisReader* fgInstance; + // Static data members + inline static G4XmlAnalysisReader* fgMasterInstance { nullptr }; - // methods - tools::raxml_out* GetHandler( - const G4String& fileName, - const G4String& objectName, - const G4String& objectType, - const G4String& inFunction); + // Methods G4bool Reset(); - // data members - G4XmlRNtupleManager* fNtupleManager; - G4XmlRFileManager* fFileManager; + // Static data members + static constexpr std::string_view fkClass { "G4XmlAnalysisReader" }; + + // Data members + std::shared_ptr fNtupleManager { nullptr }; + std::shared_ptr fFileManager { nullptr }; }; #include "G4XmlAnalysisReader.icc" diff --git a/source/analysis/xml/include/G4XmlAnalysisReader.icc b/source/analysis/xml/include/G4XmlAnalysisReader.icc index dabcb68c72..3336a6c842 100644 --- a/source/analysis/xml/include/G4XmlAnalysisReader.icc +++ b/source/analysis/xml/include/G4XmlAnalysisReader.icc @@ -26,20 +26,18 @@ // Author: Ivana Hrivnacova, 25/07/2014 (ivana@ipno.in2p3.fr) -//#include "G4XmlRNtupleManager.hh" +#include "G4XmlRNtupleManager.hh" //_____________________________________________________________________________ inline tools::aida::ntuple* G4XmlAnalysisReader::GetNtuple() const { - //return fNtupleManager->GetNtuple(); - return nullptr; -} + return fNtupleManager->GetNtuple(); +} //_____________________________________________________________________________ inline -tools::aida::ntuple* G4XmlAnalysisReader::GetNtuple(G4int /*ntupleId*/) const +tools::aida::ntuple* G4XmlAnalysisReader::GetNtuple(G4int ntupleId) const { - //return fNtupleManager->GetNtuple(ntupleId); - return nullptr; -} + return fNtupleManager->GetNtuple(ntupleId); +} diff --git a/source/analysis/xml/include/G4XmlFileManager.hh b/source/analysis/xml/include/G4XmlFileManager.hh index fb7308f565..68a17532d2 100644 --- a/source/analysis/xml/include/G4XmlFileManager.hh +++ b/source/analysis/xml/include/G4XmlFileManager.hh @@ -40,6 +40,7 @@ #include #include +#include // Type aliases using XmlNtupleDescription = G4TNtupleDescription; @@ -50,7 +51,8 @@ class G4XmlFileManager : public G4VTFileManager { public: explicit G4XmlFileManager(const G4AnalysisManagerState& state); - ~G4XmlFileManager(); + G4XmlFileManager() = delete; + virtual ~G4XmlFileManager() = default; using G4BaseFileManager::GetNtupleFileName; using G4VTFileManager::WriteFile; @@ -63,17 +65,20 @@ class G4XmlFileManager : public G4VTFileManager // Specific methods for files per objects G4bool CreateNtupleFile(XmlNtupleDescription* ntupleDescription); - G4bool CloseNtupleFile(XmlNtupleDescription* ntupleDescription); - + G4bool CloseNtupleFile(XmlNtupleDescription* ntupleDescription); + protected: // Methods derived from templated base class virtual std::shared_ptr CreateFileImpl(const G4String& fileName) final; virtual G4bool WriteFileImpl(std::shared_ptr file) final; - virtual G4bool CloseFileImpl(std::shared_ptr file) final; + virtual G4bool CloseFileImpl(std::shared_ptr file) final; private: - // utility method + // Utility method G4String GetNtupleFileName(XmlNtupleDescription* ntupleDescription); + + // Static data members + static constexpr std::string_view fkClass { "G4XmlFileManager" }; }; #endif diff --git a/source/analysis/xml/include/G4XmlHnFileManager.hh b/source/analysis/xml/include/G4XmlHnFileManager.hh index aebf8cb378..424c6e1bc9 100644 --- a/source/analysis/xml/include/G4XmlHnFileManager.hh +++ b/source/analysis/xml/include/G4XmlHnFileManager.hh @@ -33,6 +33,8 @@ #include "G4VTHnFileManager.hh" +#include + class G4XmlFileManager; template @@ -41,7 +43,8 @@ class G4XmlHnFileManager : public G4VTHnFileManager public: G4XmlHnFileManager(G4XmlFileManager* fileManger) : G4VTHnFileManager(), fFileManager(fileManger) {} - virtual ~G4XmlHnFileManager() {} + G4XmlHnFileManager() = delete; + virtual ~G4XmlHnFileManager() = default; // Methods for writing objects // Write to a new file (the file is closed after write) @@ -49,9 +52,11 @@ class G4XmlHnFileManager : public G4VTHnFileManager // Write to the default file (handled with OpenFile()/CloseFile methods) virtual G4bool Write(HT* ht, const G4String& htName, G4String& fileName) final; - private: + private: + // Static data members + static constexpr std::string_view fkClass { "G4XmlHnFileManager" }; // Data members - G4XmlFileManager* fFileManager; + G4XmlFileManager* fFileManager { nullptr }; }; // inline functions diff --git a/source/analysis/xml/include/G4XmlHnFileManager.icc b/source/analysis/xml/include/G4XmlHnFileManager.icc index b95778c6f6..b7ec36e116 100644 --- a/source/analysis/xml/include/G4XmlHnFileManager.icc +++ b/source/analysis/xml/include/G4XmlHnFileManager.icc @@ -26,6 +26,8 @@ // Author: Ivana Hrivnacova, 15/09/2020 (ivana@ipno.in2p3.fr) +#include "G4AnalysisUtilities.hh" + #include "tools/waxml/histos" #include "tools/waxml/begend" @@ -63,7 +65,7 @@ G4bool G4XmlHnFileManager::WriteExtra( template G4bool G4XmlHnFileManager::Write( HT* ht, const G4String& htName, G4String& fileName) -{ +{ if ( fileName.empty()) { // should not happen G4cerr << "!!! Xml file name not defined." << G4endl; @@ -73,13 +75,9 @@ G4bool G4XmlHnFileManager::Write( auto hnFile = fFileManager->GetTFile(fileName); if ( hnFile == nullptr ) { - // TO DO: give an exception, - // this prototype can be used only with OpenFile() mode - G4ExceptionDescription description; - description - << "Failed to get Xml file " << fileName; - G4Exception("G4XmlHnFileManager::Write()", - "Analysis_W022", JustWarning, description); + // This prototype can be used only with OpenFile() mode + G4Analysis::Warn( + G4String("Failed to get Xml file ") + fileName, fkClass, "Write"); return false; } diff --git a/source/analysis/xml/include/G4XmlHnRFileManager.hh b/source/analysis/xml/include/G4XmlHnRFileManager.hh new file mode 100644 index 0000000000..c23a0b47bf --- /dev/null +++ b/source/analysis/xml/include/G4XmlHnRFileManager.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +// The manager class for histogram/profile reading from a Xml file. + +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) + +#ifndef G4XmlHnRFileManager_h +#define G4XmlHnRFileManager_h 1 + +#include "G4VTHnRFileManager.hh" + +#include + +class G4XmlRFileManager; + +template +class G4XmlHnRFileManager : public G4VTHnRFileManager +{ + public: + G4XmlHnRFileManager(G4XmlRFileManager* rfileManger) + : G4VTHnRFileManager(), fRFileManager(rfileManger) {} + G4XmlHnRFileManager() = delete; + virtual ~G4XmlHnRFileManager() = default; + + // Methods for writing objects + virtual HT* Read(const G4String& htName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; + + private: + // Static data members + static constexpr std::string_view fkClass { "G4XmlHnRFileManager" }; + // Data members + G4XmlRFileManager* fRFileManager { nullptr }; +}; + +// inline functions + +#include "G4XmlHnRFileManager.icc" + +#endif diff --git a/examples/advanced/lAr_calorimeter/include/FCALAnalysisManager.hh b/source/analysis/xml/include/G4XmlHnRFileManager.icc similarity index 76% rename from examples/advanced/lAr_calorimeter/include/FCALAnalysisManager.hh rename to source/analysis/xml/include/G4XmlHnRFileManager.icc index 37a1fb3fa0..80a82d0938 100644 --- a/examples/advanced/lAr_calorimeter/include/FCALAnalysisManager.hh +++ b/source/analysis/xml/include/G4XmlHnRFileManager.icc @@ -23,26 +23,20 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// GEANT4 tag // -// Author: Patricia Mendez (patricia.mendez@cern.ch) -// -// History: -// ----------- -// 12 Feb 2003 Patricia Mendez created -// 11 Mar 2013 Luciano Pandola Migrated to g4tools (removed AIDA dependency) -// -// ------------------------------------------------------------------- - -#ifndef FCALANALYSISMANAGER_HH -#define FCALANALYSISMANAGER_HH - -// comment g4root.hh and uncomment g4xml.hh for a XML-based output file - -#include "g4root.hh" -//#include "g4xml.hh" - -#endif +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) +#include "tools/raxml" +//_____________________________________________________________________________ +template +inline +HT* G4XmlHnRFileManager::Read( + const G4String& htName, const G4String& fileName, const G4String& /*dirName*/, + G4bool /*isUserFileName*/) +{ + auto handler = fRFileManager->GetHandler(fileName, htName, "Read"); + if ( ! handler ) return nullptr; + return static_cast(handler->object()); +} diff --git a/source/analysis/xml/include/G4XmlNtupleFileManager.hh b/source/analysis/xml/include/G4XmlNtupleFileManager.hh index 42839d547b..0d9e3ffb2e 100644 --- a/source/analysis/xml/include/G4XmlNtupleFileManager.hh +++ b/source/analysis/xml/include/G4XmlNtupleFileManager.hh @@ -45,27 +45,31 @@ class G4XmlNtupleFileManager : public G4VNtupleFileManager { public: explicit G4XmlNtupleFileManager(const G4AnalysisManagerState& state); - ~G4XmlNtupleFileManager(); - + G4XmlNtupleFileManager() = delete; + virtual ~G4XmlNtupleFileManager() = default; + virtual std::shared_ptr CreateNtupleManager() override; // Methods to be performed at file management virtual G4bool ActionAtOpenFile(const G4String& fileName) override; virtual G4bool ActionAtWrite() override; virtual G4bool ActionAtCloseFile(G4bool reset) override; - virtual G4bool Reset() override; + virtual G4bool Reset() override; void SetFileManager(std::shared_ptr fileManager); std::shared_ptr GetNtupleManager() const; private: - // methods + // Methods G4bool CloseNtupleFiles(); - // data members - std::shared_ptr fFileManager; - std::shared_ptr fNtupleManager; + // Static data members + static constexpr std::string_view fkClass { "G4XmlNtupleFileManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; + std::shared_ptr fNtupleManager { nullptr }; }; // inline functions diff --git a/source/analysis/xml/include/G4XmlNtupleManager.hh b/source/analysis/xml/include/G4XmlNtupleManager.hh index 3aae86b5e8..67f0b1f94e 100644 --- a/source/analysis/xml/include/G4XmlNtupleManager.hh +++ b/source/analysis/xml/include/G4XmlNtupleManager.hh @@ -24,7 +24,7 @@ // ******************************************************************** // -// Manager class for Xml ntuples +// Manager class for Xml ntuples // // Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr) @@ -38,6 +38,7 @@ #include #include +#include // Types alias using XmlNtupleDescription = G4TNtupleDescription; @@ -45,14 +46,15 @@ using XmlNtupleDescription = G4TNtupleDescription + std::ofstream> { friend class G4XmlAnalysisManager; friend class G4XmlNtupleFileManager; public: explicit G4XmlNtupleManager(const G4AnalysisManagerState& state); - ~G4XmlNtupleManager(); + G4XmlNtupleManager() = delete; + virtual ~G4XmlNtupleManager() = default; private: // Functions specific to the output type @@ -60,7 +62,7 @@ class G4XmlNtupleManager : public G4TNtupleManager fileManager); - + // Access to ntuple vector (needed for Write()) const std::vector& GetNtupleDescriptionVector() const; @@ -73,18 +75,20 @@ class G4XmlNtupleManager : public G4TNtupleManager fFileManager; + // Static data members + static constexpr std::string_view fkClass { "G4XmNtupleManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; }; // inline functions -inline void +inline void G4XmlNtupleManager::SetFileManager(std::shared_ptr fileManager) { fFileManager = fileManager; } -inline const std::vector*>& +inline const std::vector*>& G4XmlNtupleManager::GetNtupleDescriptionVector() const { return fNtupleDescriptionVector; } diff --git a/source/analysis/xml/include/G4XmlRFileManager.hh b/source/analysis/xml/include/G4XmlRFileManager.hh index 5a58678f09..089494862b 100644 --- a/source/analysis/xml/include/G4XmlRFileManager.hh +++ b/source/analysis/xml/include/G4XmlRFileManager.hh @@ -31,33 +31,48 @@ #ifndef G4XmlRFileManager_h #define G4XmlRFileManager_h 1 -#include "G4BaseFileManager.hh" +#include "G4VRFileManager.hh" #include "globals.hh" -#include +#include "tools/raxml" -#include +#include class G4AnalysisManagerState; -class G4XmlRFileManager : public G4BaseFileManager +class G4XmlRFileManager : public G4VRFileManager { public: explicit G4XmlRFileManager(const G4AnalysisManagerState& state); - ~G4XmlRFileManager(); + G4XmlRFileManager() = delete; + virtual ~G4XmlRFileManager(); virtual G4String GetFileType() const final { return "xml"; } + // Methods from base class + virtual void CloseFiles() final {} + // Methods to manipulate input files virtual G4bool OpenRFile(const G4String& fileName); // Specific methods for files per objects tools::raxml* GetRFile(const G4String& fileName) const; - + + // Helper method + template + tools::raxml_out* GetHandler(const G4String& fileName, + const G4String& objectName, + std::string_view inFunction); + private: - // data members - tools::xml::default_factory* fReadFactory; + // Static data members + static constexpr std::string_view fkClass { "G4XmRFileManager" }; + + // Data members + tools::xml::default_factory* fReadFactory { nullptr }; std::map fRFiles; }; +#include "G4XmlRFileManager.icc" + #endif diff --git a/environments/g4py/tests/g4pytest/EMSTDpl/pyEMSTDpl.cc b/source/analysis/xml/include/G4XmlRFileManager.icc similarity index 55% rename from environments/g4py/tests/g4pytest/EMSTDpl/pyEMSTDpl.cc rename to source/analysis/xml/include/G4XmlRFileManager.icc index c21c4ef42d..63df5adc52 100644 --- a/environments/g4py/tests/g4pytest/EMSTDpl/pyEMSTDpl.cc +++ b/source/analysis/xml/include/G4XmlRFileManager.icc @@ -23,53 +23,51 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// pyEMSTDpl.cc // -// [Qgeom] -// a site-module of Geant4Py -// -// Electron/Gamma EM-standard physics list -// -// 2005 Q -// ==================================================================== -#include -#include "G4RunManager.hh" -#include "PhysicsListEMstd.hh" +// Author: Ivana Hrivnacova, 26/08/2021 (ivana@ipno.in2p3.fr) -using namespace boost::python; +#include "G4AnalysisUtilities.hh" -// ==================================================================== -// thin wrappers -// ==================================================================== -namespace pyEMSTDpl { - -PhysicsListEMstd* Construct() +//_____________________________________________________________________________ +template +inline +tools::raxml_out* G4XmlRFileManager::GetHandler( + const G4String& fileName, const G4String& objectName, + std::string_view inFunction) { - PhysicsListEMstd* pl= new PhysicsListEMstd; +// Get buffer for reading object specified by objectName and objectType +// for a file specified by fileName; +// open the file if it was not yet open - G4RunManager* runMgr= G4RunManager::GetRunManager(); - runMgr-> SetUserInitialization(pl); - - return pl; -} - -} - -using namespace pyEMSTDpl; - -// ==================================================================== -// Expose to Python -// ==================================================================== - -BOOST_PYTHON_MODULE(_EMSTDpl) { - - class_ > - ("PhysicsListEMstd", "Electron/Gamma EM-standard physics list") - ; - - // --- - def("Construct", Construct, - return_value_policy()); + // Histograms and profiles are not saved per thread + // and ntuple file name is already updated + auto rfile = GetRFile(fileName); + if ( ! rfile ) { + if ( ! OpenRFile(fileName) ) return nullptr; + rfile = GetRFile(fileName); + } + tools::raxml_out* handler = nullptr; + if ( rfile ) { + std::vector& objects = rfile->objects(); + std::vector::iterator it; + for (it = objects.begin(); it!=objects.end(); ++it) { + tools::raxml_out& object = *it; + if ( (object.cls().compare(HT::s_class()) == 0) && + (object.name().compare(objectName) == 0) ) { + handler = &object; + handler->disown(); + break; + } + } + } + + if ( ! handler ) { + G4Analysis::Warn( + "Cannot get " + objectName + " in file " + fileName, + fkClass, inFunction); + return nullptr; + } + + return handler; } diff --git a/source/analysis/xml/include/G4XmlRNtupleManager.hh b/source/analysis/xml/include/G4XmlRNtupleManager.hh index 3fe7037310..1798a64305 100644 --- a/source/analysis/xml/include/G4XmlRNtupleManager.hh +++ b/source/analysis/xml/include/G4XmlRNtupleManager.hh @@ -38,40 +38,60 @@ #include "tools/raxml" #include +#include +class G4XmlRFileManager; struct G4XmlRNtupleDescription; class G4XmlRNtupleManager : public G4TRNtupleManager { friend class G4XmlAnalysisReader; - protected: - G4XmlRNtupleManager(const G4AnalysisManagerState& state); - virtual ~G4XmlRNtupleManager(); + public: + explicit G4XmlRNtupleManager(const G4AnalysisManagerState& state); + G4XmlRNtupleManager() = delete; + virtual ~G4XmlRNtupleManager() = default; - // Methods from base classes - using G4BaseRNtupleManager::SetNtupleIColumn; - using G4BaseRNtupleManager::SetNtupleFColumn; - using G4BaseRNtupleManager::SetNtupleDColumn; - using G4TRNtupleManager::SetNtupleIColumn; - using G4TRNtupleManager::SetNtupleFColumn; - using G4TRNtupleManager::SetNtupleDColumn; + protected: + // Set methods + void SetFileManager(std::shared_ptr fileManager); + + // Methods from base classes + using G4BaseRNtupleManager::SetNtupleIColumn; + using G4BaseRNtupleManager::SetNtupleFColumn; + using G4BaseRNtupleManager::SetNtupleDColumn; + using G4TRNtupleManager::SetNtupleIColumn; + using G4TRNtupleManager::SetNtupleFColumn; + using G4TRNtupleManager::SetNtupleDColumn; + using G4TRNtupleManager::SetNtupleSColumn; // Override base class functions for vector columns // in order to fill the maps - - virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, + + virtual G4bool SetNtupleIColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) final; - virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleFColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) final; - virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, + virtual G4bool SetNtupleDColumn(G4int ntupleId, const G4String& columnName, std::vector& vector) final; + virtual G4bool SetNtupleSColumn(G4int ntupleId, const G4String& columnName, + std::vector& vector) final; private: - // Methods from the templated base class - // + // Methods from the base class + virtual G4int ReadNtupleImpl(const G4String& ntupleName, const G4String& fileName, + const G4String& dirName, G4bool isUserFileName) final; virtual G4bool GetTNtupleRow(G4TRNtupleDescription* ntupleDescription) final; -}; + + // Static data members + static constexpr std::string_view fkClass { "G4XmlRNtupleManager" }; + + // Data members + std::shared_ptr fFileManager { nullptr }; +}; + +inline void +G4XmlRNtupleManager::SetFileManager(std::shared_ptr fileManager) +{ fFileManager = fileManager; } #endif - diff --git a/source/analysis/xml/include/g4xml.hh b/source/analysis/xml/include/g4xml.hh deleted file mode 100644 index 5b80a3239a..0000000000 --- a/source/analysis/xml/include/g4xml.hh +++ /dev/null @@ -1,38 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// - -// Author: Ivana Hrivnacova, 15/06/2011 (ivana@ipno.in2p3.fr) - -#ifndef g4xml_h -#define g4xml_h - -#include "g4xml_defs.hh" - -using namespace G4Xml; - -#endif - - diff --git a/source/analysis/xml/include/g4xml_defs.hh b/source/analysis/xml/include/g4xml_defs.hh index b4eeb68b75..9f3e514d18 100644 --- a/source/analysis/xml/include/g4xml_defs.hh +++ b/source/analysis/xml/include/g4xml_defs.hh @@ -30,25 +30,12 @@ #define g4xml_defs_h #include "tools/waxml/ntuple" -#include "G4XmlAnalysisManager.hh" -#include "G4XmlAnalysisReader.hh" #include "g4hntools_defs.hh" -namespace G4Xml -{ - // Ntuple types - using G4Ntuple = tools::waxml::ntuple; - using G4NtupleIterator = std::vector::iterator; - using G4NtupleConstIterator = std::vector::const_iterator; - - // RNtuple types - using G4RNtuple = tools::aida::ntuple; - - // Managers - using G4AnalysisManager = G4XmlAnalysisManager; - using G4AnalysisReader = G4XmlAnalysisReader; -} +// Xml output specific types +using G4XmlNtuple = tools::waxml::ntuple; +using G4XmlRNtuple = tools::aida::ntuple; #endif - + diff --git a/source/analysis/xml/sources.cmake b/source/analysis/xml/sources.cmake index 12d6566fba..ccc964f5fa 100644 --- a/source/analysis/xml/sources.cmake +++ b/source/analysis/xml/sources.cmake @@ -10,12 +10,14 @@ geant4_add_module(G4xml G4XmlFileManager.hh G4XmlHnFileManager.hh G4XmlHnFileManager.icc + G4XmlHnRFileManager.hh + G4XmlHnRFileManager.icc G4XmlNtupleFileManager.hh G4XmlNtupleManager.hh G4XmlRFileManager.hh + G4XmlRFileManager.icc G4XmlRNtupleManager.hh g4xml_defs.hh - g4xml.hh SOURCES G4XmlAnalysisManager.cc G4XmlAnalysisReader.cc diff --git a/source/analysis/xml/src/G4XmlAnalysisManager.cc b/source/analysis/xml/src/G4XmlAnalysisManager.cc index 05ca36eeb6..672e46b2b5 100644 --- a/source/analysis/xml/src/G4XmlAnalysisManager.cc +++ b/source/analysis/xml/src/G4XmlAnalysisManager.cc @@ -31,64 +31,32 @@ #include "G4XmlNtupleFileManager.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" +#include "G4ThreadLocalSingleton.hh" #include "G4Threading.hh" -#include "G4AutoLock.hh" +using namespace G4Analysis; using std::make_shared; -// mutex in a file scope - -namespace { - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH1Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH2Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging H1 histograms - G4Mutex mergeH3Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging P1 profiles - G4Mutex mergeP1Mutex = G4MUTEX_INITIALIZER; - //Mutex to lock master manager when merging P2 profiles - G4Mutex mergeP2Mutex = G4MUTEX_INITIALIZER; -} - -G4XmlAnalysisManager* G4XmlAnalysisManager::fgMasterInstance = nullptr; -G4ThreadLocal G4XmlAnalysisManager* G4XmlAnalysisManager::fgInstance = nullptr; - //_____________________________________________________________________________ G4XmlAnalysisManager* G4XmlAnalysisManager::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4XmlAnalysisManager(isMaster); - } - - return fgInstance; + static G4ThreadLocalSingleton instance; + fgIsInstance = true; + return instance.Instance(); } //_____________________________________________________________________________ G4bool G4XmlAnalysisManager::IsInstance() { - return ( fgInstance != 0 ); -} + return fgIsInstance; +} //_____________________________________________________________________________ -G4XmlAnalysisManager::G4XmlAnalysisManager(G4bool isMaster) - : G4ToolsAnalysisManager("Xml", isMaster), - fFileManager(nullptr), - fNtupleFileManager(nullptr) +G4XmlAnalysisManager::G4XmlAnalysisManager() + : G4ToolsAnalysisManager("Xml") { - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description - << " " - << "G4XmlAnalysisManager already exists." - << "Cannot create another instance."; - G4Exception("G4XmlAnalysisManager::G4XmlAnalysisManager", - "Analysis_F001", FatalException, description); - } - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; - + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; + // File Manager fFileManager = std::make_shared(fState); SetFileManager(fFileManager); @@ -101,157 +69,12 @@ G4XmlAnalysisManager::G4XmlAnalysisManager(G4bool isMaster) //_____________________________________________________________________________ G4XmlAnalysisManager::~G4XmlAnalysisManager() -{ +{ if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; - fgInstance = nullptr; + fgIsInstance = false; } -// -// private methods // - -//_____________________________________________________________________________ -G4bool G4XmlAnalysisManager::WriteH1() -{ - auto h1Vector = fH1Manager->GetH1Vector(); - auto hnVector = fH1Manager->GetHnVector(); - - if ( ! h1Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - auto directoryName = fFileManager->GetHistoDirectoryName(); - result = WriteT(h1Vector, hnVector, directoryName, "h1"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH1(&mergeH1Mutex); - fgMasterInstance->fH1Manager->AddH1Vector(h1Vector); - lH1.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4XmlAnalysisManager::WriteH2() -{ - auto h2Vector = fH2Manager->GetH2Vector(); - auto hnVector = fH2Manager->GetHnVector(); - - if ( ! h2Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - auto directoryName = fFileManager->GetHistoDirectoryName(); - result = WriteT(h2Vector, hnVector, directoryName, "h2"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH2(&mergeH2Mutex); - fgMasterInstance->fH2Manager->AddH2Vector(h2Vector); - lH2.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4XmlAnalysisManager::WriteH3() -{ - auto h3Vector = fH3Manager->GetH3Vector(); - auto hnVector = fH3Manager->GetHnVector(); - - if ( ! h3Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - auto directoryName = fFileManager->GetHistoDirectoryName(); - result = WriteT(h3Vector, hnVector, directoryName, "h3"); - } - else { - // The worker manager just adds its histograms to the master - // This operation needs a lock - G4AutoLock lH3(&mergeH3Mutex); - fgMasterInstance->fH3Manager->AddH3Vector(h3Vector); - lH3.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4XmlAnalysisManager::WriteP1() -{ - auto p1Vector = fP1Manager->GetP1Vector(); - auto hnVector = fP1Manager->GetHnVector(); - - if ( ! p1Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - auto directoryName = fFileManager->GetHistoDirectoryName(); - result = WriteT(p1Vector, hnVector, directoryName, "p1"); - } - else { - // The worker manager just adds its profiles to the master - // This operation needs a lock - G4AutoLock lP1(&mergeP1Mutex); - fgMasterInstance->fP1Manager->AddP1Vector(p1Vector); - lP1.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4XmlAnalysisManager::WriteP2() -{ - auto p2Vector = fP2Manager->GetP2Vector(); - auto hnVector = fP2Manager->GetHnVector(); - - if ( ! p2Vector.size() ) return true; - - auto result = true; - - if ( ! G4Threading::IsWorkerThread() ) { - auto directoryName = fFileManager->GetHistoDirectoryName(); - result = WriteT(p2Vector, hnVector, directoryName, "p2"); - } - else { - // The worker manager just adds its profiles to the master - // This operation needs a lock - G4AutoLock lP2(&mergeP2Mutex); - fgMasterInstance->fP2Manager->AddP2Vector(p2Vector); - lP2.unlock(); - } - - return result; -} - -//_____________________________________________________________________________ -G4bool G4XmlAnalysisManager::Reset() -{ -// Reset histograms and ntuple - - auto finalResult = true; - - auto result = G4ToolsAnalysisManager::Reset(); - finalResult = finalResult && result; - - result = fNtupleFileManager->Reset(); - finalResult = finalResult && result; - - return finalResult; -} - -// // protected methods // @@ -262,144 +85,102 @@ G4bool G4XmlAnalysisManager::OpenFileImpl(const G4String& fileName) // and set it to base class which takes then their ownership SetNtupleManager(fNtupleFileManager->CreateNtupleManager()); - auto finalResult = true; + auto result = true; // Save file name in file manager - auto result = fFileManager->OpenFile(fileName); - finalResult = finalResult && result; + result &= fFileManager->OpenFile(fileName); // Open ntuple files and create ntuples from bookings - result = fNtupleFileManager->ActionAtOpenFile(fFileManager->GetFullFileName()); - finalResult = finalResult && result; + result &= fNtupleFileManager->ActionAtOpenFile(fFileManager->GetFullFileName()); + + return result; +} - return finalResult; -} - //_____________________________________________________________________________ -G4bool G4XmlAnalysisManager::WriteImpl() +G4bool G4XmlAnalysisManager::WriteImpl() { - auto finalResult = true; + auto result = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("write", "files", ""); - } -#endif + Message(kVL4, "write", "files"); - // ntuples + // ntuples fNtupleFileManager->ActionAtWrite(); - if ( ! fgMasterInstance && - ( ( ! fH1Manager->IsEmpty() ) || ( ! fH2Manager->IsEmpty() ) || - ( ! fH3Manager->IsEmpty() ) || ( ! fP1Manager->IsEmpty() ) || - ( ! fP2Manager->IsEmpty() ) ) ) { - - G4ExceptionDescription description; - description - << " " << "No master G4XmlAnalysisManager instance exists." - << G4endl - << " " << "Histogram data will not be merged."; - G4Exception("G4XmlAnalysisManager::Write()", - "Analysis_W031", JustWarning, description); + if ( G4Threading::IsWorkerThread() ) { + result &= G4ToolsAnalysisManager::Merge(); } + else { + // Open all files registered with objects + fFileManager->OpenFiles(); - // H1 - auto result = WriteH1(); - finalResult = finalResult && result; - - // H2 - result = WriteH2(); - finalResult = finalResult && result; - - // H3 - result = WriteH3(); - finalResult = finalResult && result; - - // P1 - result = WriteP1(); - finalResult = finalResult && result; - - // P2 - result = WriteP2(); - finalResult = finalResult && result; + // Write all histograms/profile on master + result &= G4ToolsAnalysisManager::WriteImpl(); + } // Write ASCII if activated if ( IsAscii() ) { - result = WriteAscii(fFileManager->GetFileName()); - finalResult = finalResult && result; + result &= WriteAscii(fFileManager->GetFileName()); } -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("write", "files", "", finalResult); - } -#endif + // File + result &= fFileManager->WriteFiles(); - return finalResult; + Message(kVL3, "write", "files", "", result); + + return result; } //_____________________________________________________________________________ G4bool G4XmlAnalysisManager::CloseFileImpl(G4bool reset) { - auto finalResult = true; + auto result = true; -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("close", "files", ""); -#endif + Message(kVL4, "close", "files"); + + // Close open files + result &= fFileManager->CloseFiles(); - // close open files - auto result = fFileManager->CloseFiles(); - finalResult = finalResult && result; - - // Close Hn file - // result = fFileManager->CloseHnFile(); - // finalResult = finalResult && result; - // Close ntuple files - result = fNtupleFileManager->ActionAtCloseFile(reset); - finalResult = finalResult && result; + result &= fNtupleFileManager->ActionAtCloseFile(reset); // Reset data if ( reset ) { - result = Reset(); - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Resetting data failed"; - G4Exception("G4XmlAnalysisManager::CloseFile()", - "Analysis_W021", JustWarning, description); + if ( ! Reset() ) { + Warn("Resetting data failed", fkClass, "CloseFileImpl"); + result = false; } - finalResult = finalResult && result; } // delete files if empty // (ntuple files are created only if an ntuple is created) - if ( fFileManager->GetFile() && - fH1Manager->IsEmpty() && fH2Manager->IsEmpty() && fH3Manager->IsEmpty() && - fP1Manager->IsEmpty() && fP2Manager->IsEmpty() ) { - result = ! std::remove(fFileManager->GetFullFileName()); - // std::remove returns 0 when success - if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Removing file " - << fFileManager->GetFullFileName() << " failed"; - G4Exception("G4XmlAnalysisManager::CloseFile()", - "Analysis_W021", JustWarning, description); - } - finalResult = finalResult && result; -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("delete", "empty file", fFileManager->GetFullFileName()); -#endif + if ( fFileManager->GetFile() && G4ToolsAnalysisManager::IsEmpty() ) { + if ( std::remove(fFileManager->GetFullFileName()) ) { + // std::remove returns 0 when success + Warn(G4String( + "Removing file ") + fFileManager->GetFullFileName() + " failed", + fkClass, "CloseFileImpl"); + result = false; + } + Message(kVL1, "delete", "empty file", fFileManager->GetFullFileName()); } else { -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2() - ->Message("close", "files", ""); -#endif + Message(kVL3, "close", "files"); } - return finalResult; + return result; +} + +//_____________________________________________________________________________ +G4bool G4XmlAnalysisManager::ResetImpl() +{ +// Reset histograms and ntuple + + auto result = true; + + result &= G4ToolsAnalysisManager::ResetImpl(); + if ( fNtupleFileManager != nullptr ) { + result &= fNtupleFileManager->Reset(); + } + + return result; } diff --git a/source/analysis/xml/src/G4XmlAnalysisReader.cc b/source/analysis/xml/src/G4XmlAnalysisReader.cc index 92e09b96e7..f54fbf283b 100644 --- a/source/analysis/xml/src/G4XmlAnalysisReader.cc +++ b/source/analysis/xml/src/G4XmlAnalysisReader.cc @@ -28,58 +28,31 @@ #include "G4XmlAnalysisReader.hh" #include "G4XmlRFileManager.hh" -#include "G4H1ToolsManager.hh" -#include "G4H2ToolsManager.hh" -#include "G4H3ToolsManager.hh" -#include "G4P1ToolsManager.hh" -#include "G4P2ToolsManager.hh" #include "G4XmlRNtupleManager.hh" -#include "G4AnalysisVerbose.hh" #include "G4AnalysisUtilities.hh" +#include "G4ThreadLocalSingleton.hh" #include "G4Threading.hh" -#include -#include - using namespace G4Analysis; -G4XmlAnalysisReader* G4XmlAnalysisReader::fgMasterInstance = nullptr; -G4ThreadLocal G4XmlAnalysisReader* G4XmlAnalysisReader::fgInstance = 0; - //_____________________________________________________________________________ G4XmlAnalysisReader* G4XmlAnalysisReader::Instance() { - if ( fgInstance == nullptr ) { - G4bool isMaster = ! G4Threading::IsWorkerThread(); - fgInstance = new G4XmlAnalysisReader(isMaster); - } - - return fgInstance; -} + static G4ThreadLocalSingleton instance; + return instance.Instance(); +} //_____________________________________________________________________________ -G4XmlAnalysisReader::G4XmlAnalysisReader(G4bool isMaster) - : G4ToolsAnalysisReader("Xml", isMaster), - fNtupleManager(nullptr), - fFileManager(nullptr) +G4XmlAnalysisReader::G4XmlAnalysisReader() + : G4ToolsAnalysisReader("Xml") { - if ( ( isMaster && fgMasterInstance ) || ( fgInstance ) ) { - G4ExceptionDescription description; - description - << " " - << "G4XmlAnalysisReader already exists." - << "Cannot create another instance."; - G4Exception("G4XmlAnalysisReader::G4XmlAnalysisReader()", - "Analysis_F001", FatalException, description); - } - if ( isMaster ) fgMasterInstance = this; - fgInstance = this; + if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this; // Create managers - fNtupleManager = new G4XmlRNtupleManager(fState); - fFileManager = new G4XmlRFileManager(fState); - // The managers will be deleted by the base class - + fNtupleManager = std::make_shared(fState); + fFileManager = std::make_shared(fState); + fNtupleManager->SetFileManager(fFileManager); + // Set managers to base class SetNtupleManager(fNtupleManager); SetFileManager(fFileManager); @@ -89,240 +62,43 @@ G4XmlAnalysisReader::G4XmlAnalysisReader(G4bool isMaster) G4XmlAnalysisReader::~G4XmlAnalysisReader() { if ( fState.GetIsMaster() ) fgMasterInstance = nullptr; - fgInstance = nullptr; } -// +// // private methods // -//_____________________________________________________________________________ -tools::raxml_out* G4XmlAnalysisReader::GetHandler( - const G4String& fileName, - const G4String& objectName, - const G4String& objectType, - const G4String& inFunction) -{ -// Get buffer for reading object specified by objectName and objectType -// for a file specified by fileName; -// open the file if it was not yet open - - // Histograms and profiles are not saved per thread - // and ntuple file name is already updated - auto rfile = fFileManager->GetRFile(fileName); - if ( ! rfile ) { - if ( ! fFileManager->OpenRFile(fileName) ) return nullptr; - rfile = fFileManager->GetRFile(fileName); - } - - tools::raxml_out* handler = nullptr; - if ( rfile ) { - std::vector& objects = rfile->objects(); - std::vector::iterator it; - for (it = objects.begin(); it!=objects.end(); ++it) { - tools::raxml_out& object = *it; - if ( object.cls() == objectType && object.name() == objectName ) { - handler = &object; - break; - } - } - } - - if ( ! handler ) { - G4ExceptionDescription description; - description - << " " - << "Cannot get "<< objectName << " in file " << fileName; - G4String inFunctionFull = "G4XmlAnalysisReader::"; - inFunctionFull.append(inFunction); - G4Exception(inFunctionFull, "Analysis_WR011", JustWarning, description); - return nullptr; - } - - return handler; -} - //_____________________________________________________________________________ G4bool G4XmlAnalysisReader::Reset() { // Reset histograms and ntuple - auto finalResult = true; - - auto result = G4ToolsAnalysisReader::Reset(); - finalResult = finalResult && result; - - result = fNtupleManager->Reset(); - finalResult = finalResult && result; - - return finalResult; -} - -// + auto result = true; + + result &= G4ToolsAnalysisReader::Reset(); + result &= fNtupleManager->Reset(); + + return result; +} + +// // protected methods // //_____________________________________________________________________________ -G4int G4XmlAnalysisReader::ReadH1Impl(const G4String& h1Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) +G4bool G4XmlAnalysisReader::CloseFilesImpl(G4bool reset) { -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h1", h1Name); -#endif + Message(kVL4, "close", "files"); - tools::raxml_out* handler - = GetHandler(fileName, h1Name, tools::histo::h1d::s_class(), "ReadH1Impl"); - if ( ! handler ) return kInvalidId; + auto result = true; - auto h1 = static_cast(handler->object()); - auto id = fH1Manager->AddH1(h1Name, h1); + if (reset) { + result &= Reset(); + } -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h1", h1Name, id > kInvalidId); -#endif - - return id; -} + fFileManager->CloseFiles(); -//_____________________________________________________________________________ -G4int G4XmlAnalysisReader::ReadH2Impl(const G4String& h2Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h2", h2Name); -#endif + Message(kVL2, "close", "files", "", result); - auto handler - = GetHandler(fileName, h2Name, tools::histo::h2d::s_class(), "ReadH2Impl"); - if ( ! handler ) return kInvalidId; - - auto h2 = static_cast(handler->object()); - auto id = fH2Manager->AddH2(h2Name, h2); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h2", h2Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4XmlAnalysisReader::ReadH3Impl(const G4String& h3Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "h3", h3Name); -#endif - - auto handler - = GetHandler(fileName, h3Name, tools::histo::h3d::s_class(), "ReadH3Impl"); - if ( ! handler ) return kInvalidId; - - auto h3 = static_cast(handler->object()); - auto id = fH3Manager->AddH3(h3Name, h3); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "h3", h3Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4XmlAnalysisReader::ReadP1Impl(const G4String& p1Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "p1", p1Name); -#endif - - auto handler - = GetHandler(fileName, p1Name, tools::histo::p1d::s_class(), "ReadP1Impl"); - if ( ! handler ) return kInvalidId; - - auto p1 = static_cast(handler->object()); - auto id = fP1Manager->AddP1(p1Name, p1); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "p1", p1Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4XmlAnalysisReader::ReadP2Impl(const G4String& p2Name, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool /*isUserFileName*/) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "p2", p2Name); -#endif - - auto handler - = GetHandler(fileName, p2Name, tools::histo::p2d::s_class(), "ReadP2Impl"); - if ( ! handler ) return kInvalidId; - - auto p2 = static_cast(handler->object()); - auto id = fP2Manager->AddP2(p2Name, p2); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "p2", p2Name, id > kInvalidId); -#endif - - return id; -} - -//_____________________________________________________________________________ -G4int G4XmlAnalysisReader::ReadNtupleImpl(const G4String& ntupleName, - const G4String& fileName, - const G4String& /*dirName*/, - G4bool isUserFileName) -{ -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) - fState.GetVerboseL4()->Message("read", "ntuple", ntupleName); -#endif - - // Ntuples are saved per object and per thread - // but apply the ntuple name and the thread suffixes - // only if fileName is not provided explicitly - auto fullFileName = fileName; - if ( ! isUserFileName ) { - fullFileName = fFileManager->GetNtupleFileName(ntupleName); - } - - auto handler - = GetHandler(fullFileName, ntupleName, tools::aida::ntuple::s_class(), - "ReadNtupleImpl"); - if ( ! handler ) return kInvalidId; - - auto rntuple = static_cast(handler->object()); - auto id = fNtupleManager->SetNtuple(new G4TRNtupleDescription(rntuple)); - -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) - fState.GetVerboseL2()->Message("read", "ntuple", ntupleName, id > kInvalidId); -#endif - - return id; -} + return result; +} diff --git a/source/analysis/xml/src/G4XmlFileManager.cc b/source/analysis/xml/src/G4XmlFileManager.cc index fed3cc7b0e..6bd6319322 100644 --- a/source/analysis/xml/src/G4XmlFileManager.cc +++ b/source/analysis/xml/src/G4XmlFileManager.cc @@ -48,11 +48,7 @@ G4XmlFileManager::G4XmlFileManager(const G4AnalysisManagerState& state) fP2FileManager = std::make_shared>(this); } -//_____________________________________________________________________________ -G4XmlFileManager::~G4XmlFileManager() -{} - -// +// // private methods // @@ -69,9 +65,9 @@ G4String G4XmlFileManager::GetNtupleFileName(XmlNtupleDescription* ntupleDescrip ntupleFileName = GetNtupleFileName(ntupleDescription->fNtupleBooking.name()); } return ntupleFileName; -} +} -// +// // protected methods // @@ -80,11 +76,7 @@ std::shared_ptr G4XmlFileManager::CreateFileImpl(const G4String& { std::shared_ptr file = std::make_shared(fileName); if ( file->fail() ) { - file = nullptr; - G4ExceptionDescription description; - description << " " << "Cannot create file " << fileName; - G4Exception("G4XmlFileManager::CreateFileImpl()", - "Analysis_W001", JustWarning, description); + Warn(G4String("Cannot create file ") + fileName, fkClass, "CreateFileImpl"); return nullptr; } @@ -96,22 +88,22 @@ std::shared_ptr G4XmlFileManager::CreateFileImpl(const G4String& G4bool G4XmlFileManager::WriteFileImpl(std::shared_ptr /*file*/) { // Nothing to be done here - return true; + return true; } //_____________________________________________________________________________ -G4bool G4XmlFileManager::CloseFileImpl(std::shared_ptr file) +G4bool G4XmlFileManager::CloseFileImpl(std::shared_ptr file) { if ( ! file ) return false; // close file waxml::end(*file); - file->close(); + file->close(); return true; } -// +// // public methods // @@ -123,10 +115,7 @@ G4bool G4XmlFileManager::OpenFile(const G4String& fileName) auto name = GetFullFileName(fFileName); if ( fFile ) { - G4ExceptionDescription description; - description << "File " << fileName << " already exists."; - G4Exception("G4XmlFileManager::OpenFile()", - "Analysis_W001", JustWarning, description); + Warn(G4String("File ") + fileName + " already exists.", fkClass, "OpenFile"); fFile.reset(); } @@ -135,10 +124,7 @@ G4bool G4XmlFileManager::OpenFile(const G4String& fileName) // Create file (and save in in the file map (on master only) fFile = CreateTFile(name); if ( ! fFile) { - G4ExceptionDescription description; - description << "Failed to create file " << fileName; - G4Exception("G4XmlFileManager::OpenFile()", - "Analysis_W001", JustWarning, description); + Warn(G4String("Failed to create file") + fileName, fkClass, "OpenFile"); return false; } } @@ -146,8 +132,8 @@ G4bool G4XmlFileManager::OpenFile(const G4String& fileName) fIsOpenFile = true; return true; -} - +} + //_____________________________________________________________________________ G4bool G4XmlFileManager::CreateNtupleFile( XmlNtupleDescription* ntupleDescription) @@ -155,11 +141,7 @@ G4bool G4XmlFileManager::CreateNtupleFile( // get ntuple file name per object (if defined) auto ntupleFileName = GetNtupleFileName(ntupleDescription); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("create", "ntuple file", ntupleFileName); - } -#endif + Message(kVL4, "create", "ntuple file", ntupleFileName); // update file name if it is already in use while ( GetTFile(ntupleFileName, false) ) { @@ -168,26 +150,19 @@ G4bool G4XmlFileManager::CreateNtupleFile( auto newName = GetBaseName(oldName) + "_bis." + GetExtension(oldName); ntupleDescription->fFileName = newName; - G4ExceptionDescription description; - description - << "Ntuple filename " << oldName << " is already in use." << G4endl - << "It will be replaced with : " << newName; - G4Exception("G4XmlFileManager::CreateFileImpl()", - "Analysis_W001", JustWarning, description); + Warn(G4String( "Ntuple filename ") + oldName + " is already in use.\n" + + "It will be replaced with : " + newName, + fkClass, "CreateNtupleFile"); ntupleFileName = GetNtupleFileName(ntupleDescription); } ntupleDescription->fFile = CreateTFile(ntupleFileName); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("create", "ntuple file", ntupleFileName); - } -#endif + Message(kVL2, "create", "ntuple file", ntupleFileName); return (ntupleDescription->fFile != nullptr); -} +} //_____________________________________________________________________________ G4bool G4XmlFileManager::CloseNtupleFile( @@ -196,32 +171,21 @@ G4bool G4XmlFileManager::CloseNtupleFile( // Do nothing if there is no file if ( ! ntupleDescription->fFile ) return true; - auto finalResult = true; + auto result = true; auto ntupleFileName = GetNtupleFileName(ntupleDescription); -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - fState.GetVerboseL4()->Message("close", "ntuple file", ntupleFileName); - } -#endif - - // close file - auto result = CloseTFile(ntupleFileName); - finalResult = result && finalResult; + Message(kVL4, "close", "ntuple file", ntupleFileName); + // Close file + result &= CloseTFile(ntupleFileName); // Notify not empty file - result = SetIsEmpty(ntupleFileName, ! ntupleDescription->fHasFill); - finalResult = result && finalResult; + result &=SetIsEmpty(ntupleFileName, ! ntupleDescription->fHasFill); // Reset file info in ntuple description ntupleDescription->fFile.reset(); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - fState.GetVerboseL2()->Message("close", "ntuple file", ntupleFileName); - } -#endif + Message(kVL2, "close", "ntuple file", ntupleFileName); - return result; + return result; } diff --git a/source/analysis/xml/src/G4XmlNtupleFileManager.cc b/source/analysis/xml/src/G4XmlNtupleFileManager.cc index c289f43614..b3df48f833 100644 --- a/source/analysis/xml/src/G4XmlNtupleFileManager.cc +++ b/source/analysis/xml/src/G4XmlNtupleFileManager.cc @@ -31,23 +31,17 @@ #include "G4XmlNtupleManager.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" -#include "G4Threading.hh" #include "G4AutoLock.hh" +using namespace G4Analysis; using std::make_shared; //_____________________________________________________________________________ G4XmlNtupleFileManager::G4XmlNtupleFileManager(const G4AnalysisManagerState& state) - : G4VNtupleFileManager(state, "csv"), - fFileManager(nullptr), - fNtupleManager(nullptr) + : G4VNtupleFileManager(state, "csv") {} -//_____________________________________________________________________________ -G4XmlNtupleFileManager::~G4XmlNtupleFileManager() -{} - -// +// // private methods // @@ -56,17 +50,16 @@ G4bool G4XmlNtupleFileManager::CloseNtupleFiles() { // Close ntuple files - auto finalResult = true; + auto result = true; auto ntupleVector = fNtupleManager->GetNtupleDescriptionVector(); for ( auto ntupleDescription : ntupleVector) { - auto result = fFileManager->CloseNtupleFile(ntupleDescription); - finalResult = finalResult && result; + result &= fFileManager->CloseNtupleFile(ntupleDescription); } - return finalResult; -} + return result; +} -// +// // public methods // @@ -75,7 +68,7 @@ std::shared_ptr G4XmlNtupleFileManager::CreateNtupleManager() { fNtupleManager = std::make_shared(fState); fNtupleManager->SetFileManager(fFileManager); - + return fNtupleManager; } @@ -86,44 +79,39 @@ G4bool G4XmlNtupleFileManager::ActionAtOpenFile(const G4String& /*fileName*/) // (The files will be created with creating ntuples) fNtupleManager->CreateNtuplesFromBooking( fBookingManager->GetNtupleBookingVector()); - + return true; -} - +} + //_____________________________________________________________________________ -G4bool G4XmlNtupleFileManager::ActionAtWrite() +G4bool G4XmlNtupleFileManager::ActionAtWrite() { auto ntupleVector = fNtupleManager->GetNtupleDescriptionVector(); for ( auto ntuple : ntupleVector ) { if ( ntuple->fNtuple ) ntuple->fNtuple->write_trailer(); } - + return true; } //_____________________________________________________________________________ G4bool G4XmlNtupleFileManager::ActionAtCloseFile(G4bool reset) { - auto finalResult = true; - + auto result = true; + // Close ntuple files - auto result = CloseNtupleFiles(); - finalResult = finalResult && result; + result &= CloseNtupleFiles(); // Reset data if ( ! reset ) { result = Reset(); if ( ! result ) { - G4ExceptionDescription description; - description << " " << "Resetting data failed"; - G4Exception("G4XmlNtupleFileManager::CloseFile()", - "Analysis_W021", JustWarning, description); + Warn("Resetting data failed", fkClass, "ActionAtCloseFile"); } - finalResult = finalResult && result; } - return finalResult; + return result; } //_____________________________________________________________________________ @@ -131,6 +119,6 @@ G4bool G4XmlNtupleFileManager::Reset() { // Reset histograms and ntuple - return fNtupleManager->Reset(true); -} - + return fNtupleManager->Reset(); +} + diff --git a/source/analysis/xml/src/G4XmlNtupleManager.cc b/source/analysis/xml/src/G4XmlNtupleManager.cc index c39e890fdd..2a13cb5e3f 100644 --- a/source/analysis/xml/src/G4XmlNtupleManager.cc +++ b/source/analysis/xml/src/G4XmlNtupleManager.cc @@ -30,27 +30,18 @@ #include "G4XmlFileManager.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" -#include "G4Threading.hh" #include "G4UnitsTable.hh" #include "tools/ntuple_booking" -#include -//#include - using namespace G4Analysis; //_____________________________________________________________________________ G4XmlNtupleManager::G4XmlNtupleManager(const G4AnalysisManagerState& state) - : G4TNtupleManager(state), - fFileManager(nullptr) + : G4TNtupleManager(state) {} -//_____________________________________________________________________________ -G4XmlNtupleManager::~G4XmlNtupleManager() -{} - -// +// // private methods // @@ -65,7 +56,7 @@ void G4XmlNtupleManager::CreateTNtupleFromBooking( ntupleDescription->fNtuple = new tools::waxml::ntuple( *(ntupleDescription->fFile), G4cerr, ntupleDescription->fNtupleBooking); - fNtupleVector.push_back(ntupleDescription->fNtuple); + fNtupleVector.push_back(ntupleDescription->fNtuple); } //_____________________________________________________________________________ @@ -84,10 +75,7 @@ void G4XmlNtupleManager::FinishTNtuple( // Return if creating ntuple failed if ( ! ntupleDescription->fNtuple ) { - G4ExceptionDescription description; - description << "Creating ntuple has failed. "; - G4Exception("G4XmlNtupleManager::FinishTNtuple()", - "Analysis_W022", JustWarning, description); + Warn("Creating ntuple has failed. ", fkClass, "FinishTNtuple"); return; } @@ -95,7 +83,7 @@ void G4XmlNtupleManager::FinishTNtuple( G4String path = "/"; path.append(fFileManager->GetNtupleDirectoryName()); ntupleDescription->fNtuple - ->write_header(path, ntupleDescription->fNtupleBooking.name(), - ntupleDescription->fNtupleBooking.title()); + ->write_header(path, ntupleDescription->fNtupleBooking.name(), + ntupleDescription->fNtupleBooking.title()); fFileManager->LockDirectoryNames(); } diff --git a/source/analysis/xml/src/G4XmlRFileManager.cc b/source/analysis/xml/src/G4XmlRFileManager.cc index 6f1108da68..02f6f6cd6c 100644 --- a/source/analysis/xml/src/G4XmlRFileManager.cc +++ b/source/analysis/xml/src/G4XmlRFileManager.cc @@ -27,29 +27,38 @@ // Author: Ivana Hrivnacova, 10/09/2014 (ivana@ipno.in2p3.fr) #include "G4XmlRFileManager.hh" +#include "G4XmlHnRFileManager.hh" #include "G4AnalysisManagerState.hh" #include "G4AnalysisUtilities.hh" -#include "tools/waxml/begend" +#include "tools/raxml" + +using namespace G4Analysis; +using namespace tools; //_____________________________________________________________________________ G4XmlRFileManager::G4XmlRFileManager(const G4AnalysisManagerState& state) - : G4BaseFileManager(state), - fReadFactory(0), - fRFiles() + : G4VRFileManager(state) { + // Create helpers defined in the base class + fH1RFileManager = std::make_shared>(this); + fH2RFileManager = std::make_shared>(this); + fH3RFileManager = std::make_shared>(this); + fP1RFileManager = std::make_shared>(this); + fP2RFileManager = std::make_shared>(this); } //_____________________________________________________________________________ G4XmlRFileManager::~G4XmlRFileManager() -{ - for (G4int i=0; iMessage("open", "read analysis file", name); -#endif + Message(kVL4, "open", "read analysis file", name); G4bool verbose = false; // create factory (if it does not yet exist) if ( ! fReadFactory ) { fReadFactory = new tools::xml::default_factory(); - } + } // create new file - tools::raxml* newFile - = new tools::raxml(*fReadFactory, G4cout, verbose); + auto newFile = new tools::raxml(*fReadFactory, G4cout, verbose); - // clear objects + // clear objects // (this should not be needed when starting a new raxml) std::vector& objs = newFile->objects(); objs.clear(); G4bool compressed = false; if ( ! newFile->load_file(name, compressed) ) { - G4ExceptionDescription description; - description << " " << "Cannot open file " << name; - G4Exception("G4XmlRFileManager::OpenRFile()", - "Analysis_WR001", JustWarning, description); + Warn(G4String( "Cannot open file ") + name, fkClass, "OpenRFile"); delete newFile; return false; } // add file in a map and delete the previous file if it exists - std::map::iterator it - = fRFiles.find(name); - if ( it != fRFiles.end() ) { + auto it = fRFiles.find(name); + if ( it != fRFiles.end() ) { delete it->second; it->second = newFile; } else { fRFiles[name] = newFile; - } + } -#ifdef G4VERBOSE - if ( fState.GetVerboseL1() ) - fState.GetVerboseL1() - ->Message("open", "read analysis file", name); -#endif + Message(kVL1, "open", "read analysis file", name); return true; -} - +} + //_____________________________________________________________________________ tools::raxml* G4XmlRFileManager::GetRFile(const G4String& fileName) const -{ +{ // Get full file name (add only extension) G4bool isPerThread = false; G4String name = GetFullFileName(fileName, isPerThread); - std::map::const_iterator it - = fRFiles.find(name); + auto it = fRFiles.find(name); if ( it != fRFiles.end() ) return it->second; else { return nullptr; - } + } } diff --git a/source/analysis/xml/src/G4XmlRNtupleManager.cc b/source/analysis/xml/src/G4XmlRNtupleManager.cc index 7b6ede9b93..9532162a6f 100644 --- a/source/analysis/xml/src/G4XmlRNtupleManager.cc +++ b/source/analysis/xml/src/G4XmlRNtupleManager.cc @@ -27,9 +27,14 @@ // Author: Ivana Hrivnacova, 25/07/2014 (ivana@ipno.in2p3.fr) #include "G4XmlRNtupleManager.hh" +#include "G4XmlRFileManager.hh" #include "G4AnalysisManagerState.hh" +#include "G4AnalysisUtilities.hh" -// +using namespace G4Analysis; +using std::to_string; + +// // utility function (to be provided in tools) // @@ -61,32 +66,51 @@ G4XmlRNtupleManager::G4XmlRNtupleManager(const G4AnalysisManagerState& state) : G4TRNtupleManager(state) {} -//_____________________________________________________________________________ -G4XmlRNtupleManager::~G4XmlRNtupleManager() -{} - -// +// // private methods // //_____________________________________________________________________________ -G4bool G4XmlRNtupleManager::SetNtupleIColumn(G4int ntupleId, - const G4String& columnName, +G4int G4XmlRNtupleManager::ReadNtupleImpl(const G4String& ntupleName, + const G4String& fileName, + const G4String& /*dirName*/, + G4bool isUserFileName) +{ + Message(kVL4, "read", "ntuple", ntupleName); + + // Ntuples are saved per object and per thread + // but apply the ntuple name and the thread suffixes + // only if fileName is not provided explicitly + auto fullFileName = fileName; + if ( ! isUserFileName ) { + fullFileName = fFileManager->GetNtupleFileName(ntupleName); + } + + auto handler = fFileManager->GetHandler( + fullFileName, ntupleName, "ReadNtupleImpl"); + if ( ! handler ) return kInvalidId; + + auto rntuple = static_cast(handler->object()); + auto id = SetNtuple(new G4TRNtupleDescription(rntuple)); + + Message(kVL2, "read", "ntuple", ntupleName, id > kInvalidId); + + return id; +} + +//_____________________________________________________________________________ +G4bool G4XmlRNtupleManager::SetNtupleIColumn(G4int ntupleId, + const G4String& columnName, std::vector& vector) { // Override base class default implementation -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL4()->Message("set", "ntuple I column", description); - } -#endif + Message(kVL4, "set", "ntuple I column", + " ntupleId " + to_string(ntupleId) + " " + columnName); auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "SetNtupleIColumn"); - if ( ! ntupleDescription ) return false; - + if ( ! ntupleDescription ) return false; + // not supported //tools::ntuple_binding* ntupleBinding = ntupleDescription->fNtupleBinding; //ntupleBinding->add_column(columnName, vector); @@ -96,35 +120,26 @@ G4bool G4XmlRNtupleManager::SetNtupleIColumn(G4int ntupleId, tools::ntuple_binding* ntupleBinding = ntupleDescription->fNtupleBinding; ntupleBinding->add_column_cid(columnName, *subNtuple); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL2()->Message("set", "ntuple I column", description, true); - } -#endif + Message(kVL2, "set", "ntuple I column", + " ntupleId " + to_string(ntupleId) + " " + columnName); return true; } //_____________________________________________________________________________ -G4bool G4XmlRNtupleManager::SetNtupleFColumn(G4int ntupleId, - const G4String& columnName, +G4bool G4XmlRNtupleManager::SetNtupleFColumn(G4int ntupleId, + const G4String& columnName, std::vector& vector) { // Override base class default implementation -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL4()->Message("set", "ntuple F column of vector", description); - } -#endif + Message(kVL4, "set", "ntuple F column", + " ntupleId " + to_string(ntupleId) + " " + columnName); + auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "SetNtupleFColumn"); - if ( ! ntupleDescription ) return false; - + if ( ! ntupleDescription ) return false; + // not supported //tools::ntuple_binding* ntupleBinding = ntupleDescription->fNtupleBinding; //ntupleBinding->add_column(columnName, vector); @@ -134,35 +149,25 @@ G4bool G4XmlRNtupleManager::SetNtupleFColumn(G4int ntupleId, tools::ntuple_binding* ntupleBinding = ntupleDescription->fNtupleBinding; ntupleBinding->add_column_cid(columnName, *subNtuple); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL2()->Message("set", "ntuple F column", description, true); - } -#endif + Message(kVL4, "set", "ntuple F column", + " ntupleId " + to_string(ntupleId) + " " + columnName); return true; } //_____________________________________________________________________________ -G4bool G4XmlRNtupleManager::SetNtupleDColumn(G4int ntupleId, - const G4String& columnName, +G4bool G4XmlRNtupleManager::SetNtupleDColumn(G4int ntupleId, + const G4String& columnName, std::vector& vector) { // Override base class default implementation -#ifdef G4VERBOSE - if ( fState.GetVerboseL4() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL4()->Message("set", "ntuple D column of vector", description); - } -#endif + Message(kVL4, "set", "ntuple D column", + " ntupleId " + to_string(ntupleId) + " " + columnName); auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "SetNtupleDColumn"); - if ( ! ntupleDescription ) return false; - + if ( ! ntupleDescription ) return false; + // not supported //tools::ntuple_binding* ntupleBinding = ntupleDescription->fNtupleBinding; //ntupleBinding->add_column(columnName, vector); @@ -172,13 +177,36 @@ G4bool G4XmlRNtupleManager::SetNtupleDColumn(G4int ntupleId, tools::ntuple_binding* ntupleBinding = ntupleDescription->fNtupleBinding; ntupleBinding->add_column_cid(columnName, *subNtuple); -#ifdef G4VERBOSE - if ( fState.GetVerboseL2() ) { - G4ExceptionDescription description; - description << " ntupleId " << ntupleId << " " << columnName; - fState.GetVerboseL2()->Message("set", "ntuple D column", description, true); - } -#endif + Message(kVL2, "set", "ntuple D column", + " ntupleId " + to_string(ntupleId) + " " + columnName); + + return true; +} + +//_____________________________________________________________________________ +G4bool G4XmlRNtupleManager::SetNtupleSColumn(G4int ntupleId, + const G4String& columnName, + std::vector& vector) +{ +// Override base class default implementation + + Message(kVL4, "set", "ntuple S column", + " ntupleId " + to_string(ntupleId) + " " + columnName); + + auto ntupleDescription = GetNtupleDescriptionInFunction(ntupleId, "SetNtupleSColumn"); + if ( ! ntupleDescription ) return false; + + // not supported + //tools::ntuple_binding* ntupleBinding = ntupleDescription->fNtupleBinding; + //ntupleBinding->add_column(columnName, vector); + + auto subNtuple = new tools::aida::ntuple(G4cout, columnName); + ntupleDescription->fSVectorBindingMap[subNtuple] = &vector; + tools::ntuple_binding* ntupleBinding = ntupleDescription->fNtupleBinding; + ntupleBinding->add_column_cid(columnName, *subNtuple); + + Message(kVL2, "set", "ntuple S column", + " ntupleId " + to_string(ntupleId) + " " + columnName); return true; } @@ -193,12 +221,7 @@ G4bool G4XmlRNtupleManager::GetTNtupleRow( if ( ! isInitialized ) { tools::ntuple_binding* ntupleBinding = ntupleDescription->fNtupleBinding; if ( ! ntuple->set_binding(std::cout, *ntupleBinding) ) { - G4ExceptionDescription description; - description - << " " - << "Ntuple initialization failed !!"; - G4Exception("G4XmlRNtuple::GetNtupleRow()", - "Analysis_WR021", JustWarning, description); + Warn("Ntuple initialization failed !!", fkClass, "GetTNtupleRow"); return false; } ntupleDescription->fIsInitialized = true; @@ -208,33 +231,24 @@ G4bool G4XmlRNtupleManager::GetTNtupleRow( G4bool next = ntuple->next(); if ( next ) { if ( ! ntuple->get_row() ) { - G4ExceptionDescription description; - description - << " " - << "Ntuple get_row() failed !!"; - G4Exception("G4XmlRNtuple::GetNtupleRow()", - "Analysis_WR021", JustWarning, description); + Warn("Ntuple get_row() failed !!", fkClass, "GetTNtupleRow"); return false; } // fill vector from sub ntuples - - {std::map* >::iterator it; - for ( it = ntupleDescription->fIVectorBindingMap.begin(); - it != ntupleDescription->fIVectorBindingMap.end(); it++) { - tools::aida::to_vector(*(it->first), *(it->second)); - }} - {std::map* >::iterator it; - for ( it = ntupleDescription->fFVectorBindingMap.begin(); - it != ntupleDescription->fFVectorBindingMap.end(); it++) { - tools::aida::to_vector(*(it->first), *(it->second)); - }} - {std::map* >::iterator it; - for ( it = ntupleDescription->fDVectorBindingMap.begin(); - it != ntupleDescription->fDVectorBindingMap.end(); it++) { - tools::aida::to_vector(*(it->first), *(it->second)); - }} - } + for ( auto [key, value] : ntupleDescription->fIVectorBindingMap) { + tools::aida::to_vector(*key, *value); + } + for ( auto [key, value] : ntupleDescription->fFVectorBindingMap) { + tools::aida::to_vector(*key, *value); + } + for ( auto [key, value] : ntupleDescription->fDVectorBindingMap) { + tools::aida::to_vector(*key, *value); + } + for ( auto [key, value] : ntupleDescription->fSVectorBindingMap) { + tools::aida::to_vector(*key, *value); + } + } return next; -} +} diff --git a/source/digits_hits/History b/source/digits_hits/History index a9376cd306..ac9802b734 100644 --- a/source/digits_hits/History +++ b/source/digits_hits/History @@ -16,6 +16,12 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +October 25th, 2021 B.Morgan (digits_hits-V10-07-03) +- Use G4StrUtil functions replacing deprecated G4String member functions + +October 18th, 2021 B. Morgan (digits_hits-V10-07-02) +- Use std::string member functions from G4String in place of synonyms + April 21st, 2021 J. Madsen (digit_hits-V10-07-01) - make G4digits_hits-format diff --git a/source/digits_hits/detector/History b/source/digits_hits/detector/History index 909bf89069..09decbca55 100644 --- a/source/digits_hits/detector/History +++ b/source/digits_hits/detector/History @@ -16,6 +16,11 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +August 9th, 2021 I. Hrivnacova (det-V10-07-01) +- Updated G4TScoreHistFiller for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + April 1, 2021 B. Morgan (det-V10-07-00) - Migrate build to modular CMake API diff --git a/source/digits_hits/detector/include/G4TScoreHistFiller.hh b/source/digits_hits/detector/include/G4TScoreHistFiller.hh index 0eb4e87dbc..e865982111 100644 --- a/source/digits_hits/detector/include/G4TScoreHistFiller.hh +++ b/source/digits_hits/detector/include/G4TScoreHistFiller.hh @@ -79,7 +79,6 @@ class G4TScoreHistFiller : public G4VScoreHistFiller // data members T* fAnalysisManager = nullptr; G4int fVerboseLevel = 0; - G4bool fHasAnalysisManager = false; G4bool fIsInitialized = false; }; diff --git a/source/digits_hits/detector/include/G4TScoreHistFiller.icc b/source/digits_hits/detector/include/G4TScoreHistFiller.icc index 8b8ad0a55b..8c56704a2f 100644 --- a/source/digits_hits/detector/include/G4TScoreHistFiller.icc +++ b/source/digits_hits/detector/include/G4TScoreHistFiller.icc @@ -42,18 +42,12 @@ G4TScoreHistFiller::G4TScoreHistFiller() template G4TScoreHistFiller::~G4TScoreHistFiller() { - if(fHasAnalysisManager) - { - delete fAnalysisManager; - } } template void G4TScoreHistFiller::CreateAnalysisManager() { - // create analysis manager - if(!T::IsInstance()) - fHasAnalysisManager = true; + // get/create analysis manager fAnalysisManager = T::Instance(); fAnalysisManager->SetVerboseLevel(fVerboseLevel); diff --git a/source/digits_hits/detector/src/G4HCtable.cc b/source/digits_hits/detector/src/G4HCtable.cc index 141618b885..8fb349af5e 100644 --- a/source/digits_hits/detector/src/G4HCtable.cc +++ b/source/digits_hits/detector/src/G4HCtable.cc @@ -48,7 +48,7 @@ G4int G4HCtable::Registor(G4String SDname, G4String HCname) G4int G4HCtable::GetCollectionID(G4String HCname) const { G4int i = -1; - if(HCname.index("/") == std::string::npos) // HCname only + if(HCname.find("/") == std::string::npos) // HCname only { for(size_t j = 0; j < HClist.size(); j++) { diff --git a/source/digits_hits/detector/src/G4SDManager.cc b/source/digits_hits/detector/src/G4SDManager.cc index acbce1c1db..d13b209db5 100644 --- a/source/digits_hits/detector/src/G4SDManager.cc +++ b/source/digits_hits/detector/src/G4SDManager.cc @@ -71,9 +71,9 @@ void G4SDManager::AddNewDetector(G4VSensitiveDetector* aSD) { G4int numberOfCollections = aSD->GetNumberOfCollections(); G4String pathName = aSD->GetPathName(); - if(pathName(0) != '/') - pathName.prepend("/"); - if(pathName(pathName.length() - 1) != '/') + if(pathName[0] != '/') + pathName.insert(0, "/"); + if(pathName.back() != '/') pathName += "/"; treeTop->AddNewDetector(aSD, pathName); if(numberOfCollections < 1) @@ -125,8 +125,8 @@ void G4SDManager::TerminateCurrentEvent(G4HCofThisEvent* HCE) void G4SDManager::Activate(G4String dName, G4bool activeFlag) { G4String pathName = dName; - if(pathName(0) != '/') - pathName.prepend("/"); + if(pathName[0] != '/') + pathName.insert(0, "/"); treeTop->Activate(pathName, activeFlag); } @@ -134,8 +134,8 @@ G4VSensitiveDetector* G4SDManager::FindSensitiveDetector(G4String dName, G4bool warning) { G4String pathName = dName; - if(pathName(0) != '/') - pathName.prepend("/"); + if(pathName[0] != '/') + pathName.insert(0, "/"); return treeTop->FindSensitiveDetector(pathName, warning); } diff --git a/source/digits_hits/detector/src/G4SDStructure.cc b/source/digits_hits/detector/src/G4SDStructure.cc index f15831dce1..30308fb7c9 100644 --- a/source/digits_hits/detector/src/G4SDStructure.cc +++ b/source/digits_hits/detector/src/G4SDStructure.cc @@ -38,9 +38,9 @@ G4SDStructure::G4SDStructure(const G4String& aPath) G4int i = dirName.length(); if(i > 1) { - dirName.remove(i - 1); - G4int isl = dirName.last('/'); - dirName.remove(0, isl + 1); + dirName.erase(i - 1); + G4int isl = dirName.rfind('/'); + dirName.erase(0, isl + 1); dirName += "/"; } } @@ -64,15 +64,15 @@ void G4SDStructure::AddNewDetector(G4VSensitiveDetector* aSD, const G4String& treeStructure) { G4String remainingPath = treeStructure; - remainingPath.remove(0, pathName.length()); - if(!remainingPath.isNull()) + remainingPath.erase(0, pathName.length()); + if(!remainingPath.empty()) { // The detector should be kept in subdirectory. // First, check if the subdirectoy exists. G4String subD = ExtractDirName(remainingPath); G4SDStructure* tgtSDS = FindSubDirectory(subD); if(tgtSDS == nullptr) { // Subdirectory not found. Create a new directory. - subD.prepend(pathName); + subD.insert(0, pathName); tgtSDS = new G4SDStructure(subD); structure.push_back(tgtSDS); } @@ -132,17 +132,17 @@ void G4SDStructure::RemoveSD(G4VSensitiveDetector* sd) G4String G4SDStructure::ExtractDirName(const G4String& aName) { G4String subD = aName; - G4int i = aName.first('/'); - if(i != G4int(std::string::npos)) - subD.remove(i + 1); + auto i = aName.find('/'); + if(i != G4String::npos) + subD.erase(i + 1); return subD; } void G4SDStructure::Activate(const G4String& aName, G4bool sensitiveFlag) { G4String aPath = aName; - aPath.remove(0, pathName.length()); - if(aPath.first('/') != std::string::npos) + aPath.erase(0, pathName.length()); + if(aPath.find('/') != std::string::npos) { // Command is ordered for a subdirectory. G4String subD = ExtractDirName(aPath); G4SDStructure* tgtSDS = FindSubDirectory(subD); @@ -155,7 +155,7 @@ void G4SDStructure::Activate(const G4String& aName, G4bool sensitiveFlag) tgtSDS->Activate(aName, sensitiveFlag); } } - else if(aPath.isNull()) + else if(aPath.empty()) { // Command is ordered for all detectors in this directory. for(auto det : detector) det->Activate(sensitiveFlag); @@ -180,8 +180,8 @@ G4VSensitiveDetector* G4SDStructure::FindSensitiveDetector( const G4String& aName, G4bool warning) { G4String aPath = aName; - aPath.remove(0, pathName.length()); - if(aPath.first('/') != std::string::npos) + aPath.erase(0, pathName.length()); + if(aPath.find('/') != std::string::npos) { // SD exists in sub-directory G4String subD = ExtractDirName(aPath); G4SDStructure* tgtSDS = FindSubDirectory(subD); diff --git a/source/digits_hits/detector/src/G4VSensitiveDetector.cc b/source/digits_hits/detector/src/G4VSensitiveDetector.cc index 0b0af88ef1..79d8e01b67 100644 --- a/source/digits_hits/detector/src/G4VSensitiveDetector.cc +++ b/source/digits_hits/detector/src/G4VSensitiveDetector.cc @@ -35,7 +35,7 @@ G4VSensitiveDetector::G4VSensitiveDetector(G4String name) , ROgeometry(nullptr) , filter(nullptr) { - size_t sLast = name.last('/'); + size_t sLast = name.rfind('/'); if(sLast == std::string::npos) { // detector name only SensitiveDetectorName = name; @@ -44,11 +44,11 @@ G4VSensitiveDetector::G4VSensitiveDetector(G4String name) else { // name conatin the directory path SensitiveDetectorName = name; - SensitiveDetectorName.remove(0, sLast + 1); + SensitiveDetectorName.erase(0, sLast + 1); thePathName = name; - thePathName.remove(sLast + 1, name.length() - sLast); - if(thePathName(0) != '/') - thePathName.prepend("/"); + thePathName.erase(sLast + 1); + if(thePathName[0] != '/') + thePathName.insert(0, "/"); } fullPathName = thePathName + SensitiveDetectorName; } diff --git a/source/digits_hits/scorer/History b/source/digits_hits/scorer/History index 1c1ea86516..af7c4273ea 100644 --- a/source/digits_hits/scorer/History +++ b/source/digits_hits/scorer/History @@ -16,6 +16,10 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +September 27th, 2021 M. Asai (detscorer-V10-07-01) +- Fix indexing of cylindrical scoring mesh commands. + Co-working with detutil-V10-07-05. Addressing to bug report #2418. + April 1, 2021 B. Morgan (detscorer-V10-07-00) - Migrate build to modular CMake API diff --git a/source/digits_hits/scorer/include/G4PSCellFluxForCylinder3D.hh b/source/digits_hits/scorer/include/G4PSCellFluxForCylinder3D.hh index 7c89af75f7..7aac0e5421 100644 --- a/source/digits_hits/scorer/include/G4PSCellFluxForCylinder3D.hh +++ b/source/digits_hits/scorer/include/G4PSCellFluxForCylinder3D.hh @@ -59,7 +59,7 @@ class G4PSCellFluxForCylinder3D : public G4PSCellFlux3D G4int depj = 1, G4int depk = 0); virtual ~G4PSCellFluxForCylinder3D(); - void SetCylinderSize(G4double dr, G4double dz); + void SetCylinderSize(G4ThreeVector cylSize, G4double startAng, G4double angSpan); void SetNumberOfSegments(G4int nSeg[3]); protected: // with description @@ -68,6 +68,7 @@ class G4PSCellFluxForCylinder3D : public G4PSCellFlux3D private: // Order of segmentation (Z PHI R) in CylinderMesh G4ThreeVector cylinderSize; + G4double fAngle[2]; G4int nSegment[3]; }; #endif diff --git a/source/digits_hits/scorer/include/G4PSDoseDepositForCylinder3D.hh b/source/digits_hits/scorer/include/G4PSDoseDepositForCylinder3D.hh index 49207b5c6b..e38fff8e79 100644 --- a/source/digits_hits/scorer/include/G4PSDoseDepositForCylinder3D.hh +++ b/source/digits_hits/scorer/include/G4PSDoseDepositForCylinder3D.hh @@ -53,7 +53,7 @@ class G4PSDoseDepositForCylinder3D : public G4PSDoseDeposit3D virtual ~G4PSDoseDepositForCylinder3D(); - void SetCylinderSize(G4double dr, G4double dz); + void SetCylinderSize(G4ThreeVector cylSize, G4double startAng, G4double angSpan); void SetNumberOfSegments(G4int nSeg[3]); protected: // with description @@ -62,6 +62,7 @@ class G4PSDoseDepositForCylinder3D : public G4PSDoseDeposit3D private: // Order of segmentation (Z PHI R) in CylinderMesh G4ThreeVector cylinderSize; + G4double fAngle[2]; G4int nSegment[3]; }; #endif diff --git a/source/digits_hits/scorer/include/G4PSPassageCellFluxForCylinder3D.hh b/source/digits_hits/scorer/include/G4PSPassageCellFluxForCylinder3D.hh index 62a2217cb6..57c0e0cb39 100644 --- a/source/digits_hits/scorer/include/G4PSPassageCellFluxForCylinder3D.hh +++ b/source/digits_hits/scorer/include/G4PSPassageCellFluxForCylinder3D.hh @@ -57,7 +57,7 @@ class G4PSPassageCellFluxForCylinder3D : public G4PSPassageCellFlux3D G4int depk = 0); virtual ~G4PSPassageCellFluxForCylinder3D(); - void SetCylinderSize(G4double dr, G4double dz); + void SetCylinderSize(G4ThreeVector cylSize, G4double startAng, G4double angSpan); void SetNumberOfSegments(G4int nSeg[3]); protected: // with description @@ -66,6 +66,7 @@ class G4PSPassageCellFluxForCylinder3D : public G4PSPassageCellFlux3D private: // Order of segmentation (Z PHI R) in CylinderMesh G4ThreeVector cylinderSize; + G4double fAngle[2]; G4int nSegment[3]; }; #endif diff --git a/source/digits_hits/scorer/src/G4PSCellFluxForCylinder3D.cc b/source/digits_hits/scorer/src/G4PSCellFluxForCylinder3D.cc index 3a08dcd26d..2e04b0bc6f 100644 --- a/source/digits_hits/scorer/src/G4PSCellFluxForCylinder3D.cc +++ b/source/digits_hits/scorer/src/G4PSCellFluxForCylinder3D.cc @@ -69,11 +69,11 @@ G4PSCellFluxForCylinder3D::G4PSCellFluxForCylinder3D(G4String name, G4PSCellFluxForCylinder3D::~G4PSCellFluxForCylinder3D() { ; } -void G4PSCellFluxForCylinder3D::SetCylinderSize(G4double dr, G4double dz) +void G4PSCellFluxForCylinder3D::SetCylinderSize(G4ThreeVector cylSize, G4double StartAng, G4double AngSpan) { - cylinderSize.setX(dz); // Z Phi R - cylinderSize.setY(twopi); // Z Phi R - cylinderSize.setZ(dr); // Z Phi R + cylinderSize = cylSize; // rMin, rMax, halfZ + fAngle[0] = StartAng; + fAngle[1] = AngSpan; } void G4PSCellFluxForCylinder3D::SetNumberOfSegments(G4int nSeg[3]) { @@ -84,13 +84,14 @@ void G4PSCellFluxForCylinder3D::SetNumberOfSegments(G4int nSeg[3]) G4double G4PSCellFluxForCylinder3D::ComputeVolume(G4Step*, G4int idx) { - G4double r0 = (cylinderSize[2] / nSegment[2]) * (idx); - G4double r1 = (cylinderSize[2] / nSegment[2]) * (idx + 1); + G4double dr = (cylinderSize[1] - cylinderSize[0]) / nSegment[2]; + G4double r0 = cylinderSize[0] + dr * (idx); + G4double r1 = cylinderSize[0] + dr * (idx + 1); G4double dRArea = (r1 * r1 - r0 * r0) * pi; // cylinderSize is given in Half Size - G4double fullz = cylinderSize[0] / nSegment[0] * 2.; - G4double phiRatio = 1. / nSegment[1]; + G4double fullz = cylinderSize[2] / nSegment[0] * 2.; + G4double phiRatio = (fAngle[1] / (CLHEP::twopi*rad)) / nSegment[1]; G4double v = dRArea * fullz * phiRatio; if(verboseLevel > 9) diff --git a/source/digits_hits/scorer/src/G4PSDoseDepositForCylinder3D.cc b/source/digits_hits/scorer/src/G4PSDoseDepositForCylinder3D.cc index 430646033c..05ba535560 100644 --- a/source/digits_hits/scorer/src/G4PSDoseDepositForCylinder3D.cc +++ b/source/digits_hits/scorer/src/G4PSDoseDepositForCylinder3D.cc @@ -28,6 +28,7 @@ // G4PSDoseDepositForCylinder3D #include "G4PSDoseDepositForCylinder3D.hh" #include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" //////////////////////////////////////////////////////////////////////////////// // (Description) @@ -60,11 +61,11 @@ G4PSDoseDepositForCylinder3D::G4PSDoseDepositForCylinder3D(G4String name, G4PSDoseDepositForCylinder3D::~G4PSDoseDepositForCylinder3D() { ; } -void G4PSDoseDepositForCylinder3D::SetCylinderSize(G4double dr, G4double dz) +void G4PSDoseDepositForCylinder3D::SetCylinderSize(G4ThreeVector cylSize, G4double StartAng, G4double AngSpan) { - cylinderSize.setX(dz); // Z Phi R - cylinderSize.setY(twopi); // Z Phi R - cylinderSize.setZ(dr); // Z Phi R + cylinderSize = cylSize; // rMin, rMax, halfZ + fAngle[0] = StartAng; + fAngle[1] = AngSpan; } void G4PSDoseDepositForCylinder3D::SetNumberOfSegments(G4int nSeg[3]) { @@ -74,14 +75,22 @@ void G4PSDoseDepositForCylinder3D::SetNumberOfSegments(G4int nSeg[3]) } G4double G4PSDoseDepositForCylinder3D::ComputeVolume(G4Step*, G4int idx) { - G4double r0 = (cylinderSize[2] / nSegment[2]) * (idx); - G4double r1 = (cylinderSize[2] / nSegment[2]) * (idx + 1); + G4double dr = (cylinderSize[1] - cylinderSize[0]) / nSegment[2]; + G4double r0 = cylinderSize[0] + dr * (idx); + G4double r1 = cylinderSize[0] + dr * (idx + 1); G4double dRArea = (r1 * r1 - r0 * r0) * pi; // cylinderSize is given in Half Size - G4double fullz = cylinderSize[0] / nSegment[0] * 2.; - G4double phiRatio = 1. / nSegment[1]; + G4double fullz = cylinderSize[2] / nSegment[0] * 2.; + G4double phiRatio = (fAngle[1] / (CLHEP::twopi*rad)) / nSegment[1]; G4double v = dRArea * fullz * phiRatio; + if(verboseLevel > 9) + { + G4cout << " r0= " << r0 / cm << " r1= " << r1 / cm + << " fullz=" << fullz / cm << G4endl; + G4cout << " idx= " << idx << " v(cm3)= " << v / cm3 << G4endl; + } + return v; } diff --git a/source/digits_hits/scorer/src/G4PSPassageCellFluxForCylinder3D.cc b/source/digits_hits/scorer/src/G4PSPassageCellFluxForCylinder3D.cc index d4f84da189..4fafb0429e 100644 --- a/source/digits_hits/scorer/src/G4PSPassageCellFluxForCylinder3D.cc +++ b/source/digits_hits/scorer/src/G4PSPassageCellFluxForCylinder3D.cc @@ -28,6 +28,7 @@ // G4PSPassageCellFluxForCylinder3D #include "G4PSPassageCellFluxForCylinder3D.hh" #include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" /////////////////////////////////////////////////////////////////////////////// // (Description) @@ -60,11 +61,11 @@ G4PSPassageCellFluxForCylinder3D::G4PSPassageCellFluxForCylinder3D( G4PSPassageCellFluxForCylinder3D::~G4PSPassageCellFluxForCylinder3D() { ; } -void G4PSPassageCellFluxForCylinder3D::SetCylinderSize(G4double dr, G4double dz) +void G4PSPassageCellFluxForCylinder3D::SetCylinderSize(G4ThreeVector cylSize, G4double StartAng, G4double AngSpan) { - cylinderSize.setX(dz); // Z Phi R - cylinderSize.setY(twopi); // Z Phi R - cylinderSize.setZ(dr); // Z Phi R + cylinderSize = cylSize; // rMin, rMax, halfZ + fAngle[0] = StartAng; + fAngle[1] = AngSpan; } void G4PSPassageCellFluxForCylinder3D::SetNumberOfSegments(G4int nSeg[3]) { @@ -74,14 +75,22 @@ void G4PSPassageCellFluxForCylinder3D::SetNumberOfSegments(G4int nSeg[3]) } G4double G4PSPassageCellFluxForCylinder3D::ComputeVolume(G4Step*, G4int idx) { - G4double r0 = (cylinderSize[2] / nSegment[2]) * (idx); - G4double r1 = (cylinderSize[2] / nSegment[2]) * (idx + 1); + G4double dr = (cylinderSize[1] - cylinderSize[0]) / nSegment[2]; + G4double r0 = cylinderSize[0] + dr * (idx); + G4double r1 = cylinderSize[0] + dr * (idx + 1); G4double dRArea = (r1 * r1 - r0 * r0) * pi; // cylinderSize is given in Half Size - G4double fullz = cylinderSize[0] / nSegment[0] * 2.; - G4double phiRatio = 1. / nSegment[1]; + G4double fullz = cylinderSize[2] / nSegment[0] * 2.; + G4double phiRatio = (fAngle[1] / (CLHEP::twopi*rad)) / nSegment[1]; G4double v = dRArea * fullz * phiRatio; + if(verboseLevel > 9) + { + G4cout << " r0= " << r0 / cm << " r1= " << r1 / cm + << " fullz=" << fullz / cm << G4endl; + G4cout << " idx= " << idx << " v(cm3)= " << v / cm3 << G4endl; + } + return v; } diff --git a/source/digits_hits/utils/History b/source/digits_hits/utils/History index 7bf178bd4b..6bbec932dc 100644 --- a/source/digits_hits/utils/History +++ b/source/digits_hits/utils/History @@ -1,4 +1,3 @@ -------------------------------------------------------------------- ========================================================= Geant4 - an Object-Oriented Toolkit for Simulation in HEP @@ -16,6 +15,23 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +October 7th, 2021 I. Hrivnacova (detutil-V10-07-06) +- Updated G4TScoreNtupleWriter for changes in the analysis category: + added fDefaultFileType (with default value "root") and its setter + +September 27th, 2021 M. Asai (detutil-V10-07-05) +- Fix indexing of cylindrical scoring mesh commands. + Co-working with detscorer-V10-07-01. Addressing to bug report #2418. + +August 23rd, 2021 M. Asai (detutil-V10-07-04) +- G4VScoringMesh : Correct the warning messages when the size or number + of bins have already been set but tried to change. + +July 22nd, 2021 I. Hrivnacova (detutil-V10-07-03) +- Updated G4TScoreNtupleWriter for changes in the analysis category: + removed deleting of the analysis manager, + as this is now done by the Geant4 kernel. + April 15th, 2021 M. Asai (detutil-V10-07-02) - Making sure probe commands are not unnecessarily broadcasted to the worker threads. diff --git a/source/digits_hits/utils/include/G4ScoringCylinder.hh b/source/digits_hits/utils/include/G4ScoringCylinder.hh index ad46436823..83a7c16a53 100644 --- a/source/digits_hits/utils/include/G4ScoringCylinder.hh +++ b/source/digits_hits/utils/include/G4ScoringCylinder.hh @@ -53,8 +53,9 @@ class G4ScoringCylinder : public G4VScoringMesh virtual void DrawColumn(RunScore* map, G4VScoreColorMap* colorMap, G4int idxProj, G4int idxColumn); - void SetRMax(G4double rMax) { fSize[0] = rMax; } - void SetZSize(G4double zSize) { fSize[1] = zSize; } // half height + void SetRMin(G4double rMin) { fSize[0] = rMin; } + void SetRMax(G4double rMax) { fSize[1] = rMax; } + void SetZSize(G4double zSize) { fSize[2] = zSize; } // half height void RegisterPrimitives(std::vector& vps); diff --git a/source/digits_hits/utils/include/G4TScoreNtupleWriter.hh b/source/digits_hits/utils/include/G4TScoreNtupleWriter.hh index 39abe34f68..a2ae8909d5 100644 --- a/source/digits_hits/utils/include/G4TScoreNtupleWriter.hh +++ b/source/digits_hits/utils/include/G4TScoreNtupleWriter.hh @@ -68,6 +68,7 @@ class G4TScoreNtupleWriter : public G4VScoreNtupleWriter virtual void Write(); // set methods + void SetDefaultFileType(const G4String& value); void SetFileName(const G4String& fileName); void SetVerboseLevel(G4int value); @@ -87,9 +88,9 @@ class G4TScoreNtupleWriter : public G4VScoreNtupleWriter G4TScoreNtupleWriterMessenger* fMessenger; std::vector fHCIds; T* fAnalysisManager; + G4String fDefaultFileType; G4String fFileName; G4int fVerboseLevel; - G4bool fHasAnalysisManager; G4bool fHasAnalysisFile; G4bool fIsBooked; G4bool fIsInitialized; diff --git a/source/digits_hits/utils/include/G4TScoreNtupleWriter.icc b/source/digits_hits/utils/include/G4TScoreNtupleWriter.icc index 54d5186828..06e5a5a621 100644 --- a/source/digits_hits/utils/include/G4TScoreNtupleWriter.icc +++ b/source/digits_hits/utils/include/G4TScoreNtupleWriter.icc @@ -43,9 +43,9 @@ G4TScoreNtupleWriter::G4TScoreNtupleWriter() , fMessenger(nullptr) , fHCIds() , fAnalysisManager(nullptr) + , fDefaultFileType("root") , fFileName("scoring") , fVerboseLevel(1) - , fHasAnalysisManager(false) , fHasAnalysisFile(false) , fIsBooked(false) , fIsInitialized(false) @@ -61,11 +61,6 @@ G4TScoreNtupleWriter::G4TScoreNtupleWriter() template G4TScoreNtupleWriter::~G4TScoreNtupleWriter() { - if(fHasAnalysisManager) - { - delete fAnalysisManager; - } - delete fMessenger; } @@ -80,11 +75,10 @@ void G4TScoreNtupleWriter::CreateAnalysisManager() if(fAnalysisManager) return; - // create analysis manager - if(!T::IsInstance()) - fHasAnalysisManager = true; + // create/get analysis manager fAnalysisManager = T::Instance(); + fAnalysisManager->SetDefaultFileType(fDefaultFileType); fAnalysisManager->SetVerboseLevel(fVerboseLevel); } @@ -322,12 +316,12 @@ void G4TScoreNtupleWriter::Write() //_____________________________________________________________________________ template -void G4TScoreNtupleWriter::SetVerboseLevel(G4int value) +void G4TScoreNtupleWriter::SetDefaultFileType(const G4String& value) { - fVerboseLevel = value; + fDefaultFileType = value; if(fAnalysisManager) { - fAnalysisManager->SetVerboseLevel(value); + fAnalysisManager->SetDefaultFileType(value); } } @@ -337,3 +331,14 @@ void G4TScoreNtupleWriter::SetFileName(const G4String& fileName) { fFileName = fileName; } + +//_____________________________________________________________________________ +template +void G4TScoreNtupleWriter::SetVerboseLevel(G4int value) +{ + fVerboseLevel = value; + if(fAnalysisManager) + { + fAnalysisManager->SetVerboseLevel(value); + } +} diff --git a/source/digits_hits/utils/include/G4VScoringMesh.hh b/source/digits_hits/utils/include/G4VScoringMesh.hh index 1052e352d0..da4e023424 100644 --- a/source/digits_hits/utils/include/G4VScoringMesh.hh +++ b/source/digits_hits/utils/include/G4VScoringMesh.hh @@ -125,6 +125,9 @@ class G4VScoringMesh G4ThreeVector GetSize() const; // set starting and span angles (used only for tube segment) void SetAngles(G4double, G4double); + // get angles (used only for tube segment) + inline G4double GetStartAngle() const { return fAngle[0]; } + inline G4double GetAngleSpan() const { return fAngle[1]; } // set position of center of this mesh void SetCenterPosition(G4double centerPosition[3]); // get position of center of this mesh diff --git a/source/digits_hits/utils/src/G4ScoreQuantityMessenger.cc b/source/digits_hits/utils/src/G4ScoreQuantityMessenger.cc index cdca9eea99..732acf2487 100644 --- a/source/digits_hits/utils/src/G4ScoreQuantityMessenger.cc +++ b/source/digits_hits/utils/src/G4ScoreQuantityMessenger.cc @@ -313,8 +313,7 @@ void G4ScoreQuantityMessenger::SetNewValue(G4UIcommand* command, { G4PSCellFluxForCylinder3D* pps = new G4PSCellFluxForCylinder3D(token[0]); - G4ThreeVector msize = mesh->GetSize(); // gevin in R Z N/A - pps->SetCylinderSize(msize[0], msize[1]); // given in dr dz + pps->SetCylinderSize(mesh->GetSize(),mesh->GetStartAngle(),mesh->GetAngleSpan()); G4int nSeg[3]; mesh->GetNumberOfSegments(nSeg); pps->SetNumberOfSegments(nSeg); @@ -348,8 +347,7 @@ void G4ScoreQuantityMessenger::SetNewValue(G4UIcommand* command, { G4PSPassageCellFluxForCylinder3D* pps = new G4PSPassageCellFluxForCylinder3D(token[0]); - G4ThreeVector msize = mesh->GetSize(); // gevin in R Z N/A - pps->SetCylinderSize(msize[0], msize[1]); // given in dr dz + pps->SetCylinderSize(mesh->GetSize(),mesh->GetStartAngle(),mesh->GetAngleSpan()); G4int nSeg[3]; mesh->GetNumberOfSegments(nSeg); pps->SetNumberOfSegments(nSeg); @@ -401,8 +399,7 @@ void G4ScoreQuantityMessenger::SetNewValue(G4UIcommand* command, G4PSDoseDepositForCylinder3D* pps = new G4PSDoseDepositForCylinder3D(token[0]); pps->SetUnit(token[1]); - G4ThreeVector msize = mesh->GetSize(); // gevin in R Z N/A - pps->SetCylinderSize(msize[0], msize[1]); // given in dr dz + pps->SetCylinderSize(mesh->GetSize(),mesh->GetStartAngle(),mesh->GetAngleSpan()); G4int nSeg[3]; mesh->GetNumberOfSegments(nSeg); pps->SetNumberOfSegments(nSeg); @@ -820,7 +817,7 @@ void G4ScoreQuantityMessenger::FillTokenVec(G4String newValues, { G4Tokenizer next(newValues); G4String val; - while(!(val = next()).isNull()) + while(!(val = next()).empty()) { // Loop checking 12.18.2015 M.Asai token.push_back(val); } diff --git a/source/digits_hits/utils/src/G4ScoringCylinder.cc b/source/digits_hits/utils/src/G4ScoringCylinder.cc index d4d48df84e..b4f6fb08a5 100644 --- a/source/digits_hits/utils/src/G4ScoringCylinder.cc +++ b/source/digits_hits/utils/src/G4ScoringCylinder.cc @@ -79,7 +79,10 @@ void G4ScoringCylinder::SetupGeometry(G4VPhysicalVolume* fWorldPhys) G4String tubsName = fWorldName + "_mesh"; if(verboseLevel > 9) - G4cout << "R max., Dz =: " << fSize[0] << ", " << fSize[1] << G4endl; + { + G4cout << "R min, R max., Dz =: " << fSize[0] << ", " << fSize[1] + << ", " << fSize[2] << G4endl; + } G4VSolid* tubsSolid = new G4Tubs(tubsName + "0", // name fSize[0], // R min fSize[1], // R max diff --git a/source/digits_hits/utils/src/G4ScoringMessenger.cc b/source/digits_hits/utils/src/G4ScoringMessenger.cc index 98e5ab3a3a..4eaa14f2e7 100644 --- a/source/digits_hits/utils/src/G4ScoringMessenger.cc +++ b/source/digits_hits/utils/src/G4ScoringMessenger.cc @@ -987,7 +987,7 @@ void G4ScoringMessenger::FillTokenVec(G4String newValues, G4TokenVec& token) { G4Tokenizer next(newValues); G4String val; - while(!(val = next()).isNull()) + while(!(val = next()).empty()) { // Loop checking 12.18.2015 M.Asai token.push_back(val); } diff --git a/source/digits_hits/utils/src/G4VScoringMesh.cc b/source/digits_hits/utils/src/G4VScoringMesh.cc index 86246893b8..19afca1fa6 100644 --- a/source/digits_hits/utils/src/G4VScoringMesh.cc +++ b/source/digits_hits/utils/src/G4VScoringMesh.cc @@ -89,10 +89,17 @@ void G4VScoringMesh::SetSize(G4double size[3]) if(!sizeIsSet) { sizeIsSet = true; + for(int i = 0; i < 3; i++) + { + fSize[i] = size[i]; + } } - for(int i = 0; i < 3; i++) + else { - fSize[i] = size[i]; + G4String message = " Mesh size has already been set and it cannot be changed.\n"; + message += " This method is ignored."; + G4Exception("G4VScoringMesh::SetSize()", + "DigiHitsUtilsScoreVScoringMesh000", JustWarning, message); } } G4ThreeVector G4VScoringMesh::GetSize() const @@ -124,7 +131,8 @@ void G4VScoringMesh::SetNumberOfSegments(G4int nSegment[3]) } else { - G4String message = " The size of scoring segments can not be changed."; + G4String message = " Number of bins has already been set and it cannot be changed.\n"; + message += " This method is ignored."; G4Exception("G4VScoringMesh::SetNumberOfSegments()", "DigiHitsUtilsScoreVScoringMesh000", JustWarning, message); } diff --git a/source/event/History b/source/event/History index 38d9c30686..055b8cb898 100644 --- a/source/event/History +++ b/source/event/History @@ -16,6 +16,22 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +October 31st, 2021 J. Hahnfeld (event-V10-07-08) +- G4EventManager: Make StackTracks public + +October 25th, 2021 B.Morgan (event-V10-07-07) +- Use G4StrUtil functions replacing deprecated G4String member functions + +October 21st, 2021 J. Hahnfeld (event-V10-07-06) +- G4EventManager: Hand over track to custom tracking manager, + if registered for the particle + +October 18th, 2021 B.Morgan (event-V10-07-05) +- Use std::string member functions from G4String in place of synonyms + +August 21th, 2021 V.Ivanchenko (event-V10-07-04) +- G4SPSEneDistribution - use more optimal access to G4PhysicsVector + June 7th, 2021 M. Asai (event-V10-07-03) - Fix the default value of /gps/ang/maxphi command. Addressing to the bug report 2383. diff --git a/source/event/include/G4EventManager.hh b/source/event/include/G4EventManager.hh index 623861bb17..a38eebf01d 100644 --- a/source/event/include/G4EventManager.hh +++ b/source/event/include/G4EventManager.hh @@ -88,6 +88,10 @@ class G4EventManager // object has valid primary vertices/particles, they will be added to // the given "trackvector" input. + void StackTracks(G4TrackVector* trackVector, G4bool IDhasAlreadySet= false); + // Helper function to stack a vector of tracks for processing in the + // current event. + inline const G4Event* GetConstCurrentEvent() { return currentEvent; } inline G4Event* GetNonconstCurrentEvent() @@ -156,7 +160,6 @@ class G4EventManager private: void DoProcessing(G4Event* anEvent); - void StackTracks(G4TrackVector* trackVector, G4bool IDhasAlreadySet= false); private: diff --git a/source/event/src/G4AdjointStackingAction.cc b/source/event/src/G4AdjointStackingAction.cc index d26bc16ebe..7846caab93 100644 --- a/source/event/src/G4AdjointStackingAction.cc +++ b/source/event/src/G4AdjointStackingAction.cc @@ -55,7 +55,7 @@ G4AdjointStackingAction::ClassifyNewTrack(const G4Track * aTrack) { G4ClassificationOfNewTrack classification = fUrgent; G4String partType = aTrack->GetParticleDefinition()->GetParticleType(); - adjoint_mode = partType.contains(G4String("adjoint")); + adjoint_mode = G4StrUtil::contains(partType, "adjoint"); if (!adjoint_mode ) { if (!reclassification_stage) diff --git a/source/event/src/G4EventManager.cc b/source/event/src/G4EventManager.cc index d2135dc197..27aaf7b9ac 100644 --- a/source/event/src/G4EventManager.cc +++ b/source/event/src/G4EventManager.cc @@ -32,6 +32,8 @@ #include "G4ios.hh" #include "G4EvManMessenger.hh" #include "G4Event.hh" +#include "G4ParticleDefinition.hh" +#include "G4VTrackingManager.hh" #include "G4UserEventAction.hh" #include "G4UserStackingAction.hh" #include "G4SDManager.hh" @@ -43,6 +45,8 @@ #include "G4Profiler.hh" #include "G4TiMemory.hh" +#include + G4ThreadLocal G4EventManager* G4EventManager::fpEventManager = nullptr; G4EventManager* G4EventManager::GetEventManager() @@ -155,90 +159,128 @@ void G4EventManager::DoProcessing(G4Event* anEvent) G4cout << "!!!!!!! Now start processing an event !!!!!!!" << G4endl; } #endif - - G4VTrajectory* previousTrajectory; - while( (track=trackContainer->PopNextTrack(&previousTrajectory)) != nullptr ) - { // Loop checking 12.28.2015 M.Asai -#ifdef G4VERBOSE - if ( verboseLevel > 1 ) - { - G4cout << "Track " << track << " (trackID " << track->GetTrackID() - << ", parentID " << track->GetParentID() - << ") is passed to G4TrackingManager." << G4endl; - } -#endif + std::unordered_set trackingManagersToFlush; - tracking = true; - trackManager->ProcessOneTrack( track ); - istop = track->GetTrackStatus(); - tracking = false; + do + { + G4VTrajectory* previousTrajectory; + while( (track=trackContainer->PopNextTrack(&previousTrajectory)) != nullptr ) + { // Loop checking 12.28.2015 M.Asai -#ifdef G4VERBOSE - if ( verboseLevel > 0 ) - { - G4cout << "Track (trackID " << track->GetTrackID() - << ", parentID " << track->GetParentID() - << ") is processed with stopping code " << istop << G4endl; - } -#endif + const G4ParticleDefinition* partDef = track->GetParticleDefinition(); + G4VTrackingManager* particleTrackingManager = partDef->GetTrackingManager(); - G4VTrajectory* aTrajectory = nullptr; -#ifdef G4_STORE_TRAJECTORY - aTrajectory = trackManager->GimmeTrajectory(); - - if(previousTrajectory != nullptr) - { - previousTrajectory->MergeTrajectory(aTrajectory); - delete aTrajectory; - aTrajectory = previousTrajectory; - } - if(aTrajectory&&(istop!=fStopButAlive)&&(istop!=fSuspend)) - { - if(trajectoryContainer == nullptr) + if (particleTrackingManager != nullptr) { - trajectoryContainer = new G4TrajectoryContainer; - currentEvent->SetTrajectoryContainer(trajectoryContainer); - } - trajectoryContainer->insert(aTrajectory); - } +#ifdef G4VERBOSE + if ( verboseLevel > 1 ) + { + G4cout << "Track " << track << " (trackID " << track->GetTrackID() + << ", parentID " << track->GetParentID() + << ") is handed over to custom TrackingManager." << G4endl; + } #endif - G4TrackVector* secondaries = trackManager->GimmeSecondaries(); - switch (istop) - { - case fStopButAlive: - case fSuspend: - trackContainer->PushOneTrack( track, aTrajectory ); - StackTracks( secondaries ); - break; + particleTrackingManager->HandOverOneTrack(track); + // The particle's tracking manager may either track immediately or + // defer processing until FlushEvent is called. Thus, we must neither + // check the track's status nor stack secondaries. - case fPostponeToNextEvent: - trackContainer->PushOneTrack( track ); - StackTracks( secondaries ); - break; + // Remember this tracking manager to later call FlushEvent. + trackingManagersToFlush.insert(particleTrackingManager); - case fStopAndKill: - StackTracks( secondaries ); - delete track; - break; - - case fAlive: - G4Exception("G4EventManager::DoProcessing", "Event004", JustWarning, - "Illegal trackstatus returned from G4TrackingManager."\ - " Continue with simulation."); - break; - case fKillTrackAndSecondaries: - if( secondaries ) + } else { +#ifdef G4VERBOSE + if ( verboseLevel > 1 ) { - for(std::size_t i=0; isize(); ++i) - { delete (*secondaries)[i]; } - secondaries->clear(); + G4cout << "Track " << track << " (trackID " << track->GetTrackID() + << ", parentID " << track->GetParentID() + << ") is passed to G4TrackingManager." << G4endl; } - delete track; - break; +#endif + + tracking = true; + trackManager->ProcessOneTrack( track ); + istop = track->GetTrackStatus(); + tracking = false; + +#ifdef G4VERBOSE + if ( verboseLevel > 0 ) + { + G4cout << "Track (trackID " << track->GetTrackID() + << ", parentID " << track->GetParentID() + << ") is processed with stopping code " << istop << G4endl; + } +#endif + + G4VTrajectory* aTrajectory = nullptr; +#ifdef G4_STORE_TRAJECTORY + aTrajectory = trackManager->GimmeTrajectory(); + + if(previousTrajectory != nullptr) + { + previousTrajectory->MergeTrajectory(aTrajectory); + delete aTrajectory; + aTrajectory = previousTrajectory; + } + if(aTrajectory&&(istop!=fStopButAlive)&&(istop!=fSuspend)) + { + if(trajectoryContainer == nullptr) + { + trajectoryContainer = new G4TrajectoryContainer; + currentEvent->SetTrajectoryContainer(trajectoryContainer); + } + trajectoryContainer->insert(aTrajectory); + } +#endif + + G4TrackVector* secondaries = trackManager->GimmeSecondaries(); + switch (istop) + { + case fStopButAlive: + case fSuspend: + trackContainer->PushOneTrack( track, aTrajectory ); + StackTracks( secondaries ); + break; + + case fPostponeToNextEvent: + trackContainer->PushOneTrack( track ); + StackTracks( secondaries ); + break; + + case fStopAndKill: + StackTracks( secondaries ); + delete track; + break; + + case fAlive: + G4Exception("G4EventManager::DoProcessing", "Event004", JustWarning, + "Illegal trackstatus returned from G4TrackingManager."\ + " Continue with simulation."); + break; + case fKillTrackAndSecondaries: + if( secondaries ) + { + for(std::size_t i=0; isize(); ++i) + { delete (*secondaries)[i]; } + secondaries->clear(); + } + delete track; + break; + } + } } - } + + // Flush all tracking managers, which may have deferred processing until now. + for (G4VTrackingManager *tm : trackingManagersToFlush) + { + tm->FlushEvent(); + } + trackingManagersToFlush.clear(); + + // Check if flushing one of the tracking managers stacked new secondaries. + } while (trackContainer->GetNUrgentTrack() > 0); #ifdef G4VERBOSE if ( verboseLevel > 0 ) @@ -352,7 +394,8 @@ void G4EventManager::ProcessOneEvent(G4TrackVector* trackVector, { std::ostringstream oss; CLHEP::HepRandom::saveFullState(oss); - anEvent->SetRandomNumberStatus(*randStat=oss.str()); + (*randStat) = oss.str(); + anEvent->SetRandomNumberStatus(*randStat); } StackTracks(trackVector,false); DoProcessing(anEvent); diff --git a/source/event/src/G4GeneralParticleSourceMessenger.cc b/source/event/src/G4GeneralParticleSourceMessenger.cc index 3524e26c44..0476dcc0ef 100644 --- a/source/event/src/G4GeneralParticleSourceMessenger.cc +++ b/source/event/src/G4GeneralParticleSourceMessenger.cc @@ -1514,7 +1514,7 @@ void G4GeneralParticleSourceMessenger::IonCommand(G4String newValues) fAtomicNumber = StoI(next()); fAtomicMass = StoI(next()); G4String sQ = next(); - if (sQ.isNull()) + if (sQ.empty()) { fIonCharge = fAtomicNumber; } @@ -1522,7 +1522,7 @@ void G4GeneralParticleSourceMessenger::IonCommand(G4String newValues) { fIonCharge = StoI(sQ); sQ = next(); - if (sQ.isNull()) + if (sQ.empty()) { fIonExciteEnergy = 0.0; } @@ -1563,7 +1563,7 @@ void G4GeneralParticleSourceMessenger::IonLvlCommand(G4String newValues) fAtomicNumberL = StoI(next()); fAtomicMassL = StoI(next()); G4String sQ = next(); - if (sQ.isNull()) + if (sQ.empty()) { fIonChargeL = fAtomicNumberL; } @@ -1571,7 +1571,7 @@ void G4GeneralParticleSourceMessenger::IonLvlCommand(G4String newValues) { fIonChargeL = StoI(sQ); sQ = next(); - if (sQ.isNull()) + if (sQ.empty()) { fIonEnergyLevel = 0; } diff --git a/source/event/src/G4ParticleGunMessenger.cc b/source/event/src/G4ParticleGunMessenger.cc index 006dd1a138..9756cc3b53 100644 --- a/source/event/src/G4ParticleGunMessenger.cc +++ b/source/event/src/G4ParticleGunMessenger.cc @@ -344,7 +344,7 @@ void G4ParticleGunMessenger::IonLevelCommand(const G4String& newValues) fAtomicNumber = StoI(next()); fAtomicMass = StoI(next()); G4String sQ = next(); - if (sQ.isNull() || StoI(sQ)<0) + if (sQ.empty() || StoI(sQ)<0) { fIonCharge = fAtomicNumber; } @@ -353,7 +353,7 @@ void G4ParticleGunMessenger::IonLevelCommand(const G4String& newValues) fIonCharge = StoI(sQ); } sQ = next(); - if (sQ.isNull()) + if (sQ.empty()) { fIonEnergyLevel = 0; } @@ -389,18 +389,18 @@ void G4ParticleGunMessenger::IonCommand(const G4String& newValues) fIonExciteEnergy = 0.0; fIonFloatingLevelBase = '\0'; G4String sQ = next(); - if (!(sQ.isNull())) + if (!(sQ.empty())) { if (StoI(sQ)>=0) fIonCharge = StoI(sQ); sQ = next(); - if (!(sQ.isNull())) + if (!(sQ.empty())) { fIonExciteEnergy = StoD(sQ) * keV; sQ = next(); - if (sQ.isNull()||sQ=="noFloat") + if (sQ.empty()||sQ=="noFloat") { fIonFloatingLevelBase = '\0'; } else { fIonFloatingLevelBase = sQ[(std::size_t)0]; } diff --git a/source/event/src/G4SPSEneDistribution.cc b/source/event/src/G4SPSEneDistribution.cc index 96c9a1bea7..165f222157 100644 --- a/source/event/src/G4SPSEneDistribution.cc +++ b/source/event/src/G4SPSEneDistribution.cc @@ -563,8 +563,8 @@ void G4SPSEneDistribution::ArbInterpolate(const G4String& IType) G4AutoLock l(&mutex); IntType = IType; - ArbEmax = ArbEnergyH.GetMaxLowEdgeEnergy(); - ArbEmin = ArbEnergyH.GetMinLowEdgeEnergy(); + ArbEmax = ArbEnergyH.GetMaxEnergy(); + ArbEmin = ArbEnergyH.Energy(0); // Now interpolate points diff --git a/source/externals/History b/source/externals/History index c059e145c0..98bc2d8cf3 100644 --- a/source/externals/History +++ b/source/externals/History @@ -16,6 +16,16 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +01 September 2021 - G.Cosmo (externals-V10-07-07) +- Synchronised with CLHEP-2.4.5.1: + o New random engine RANLUX++ and related helper classes (J.Hahnfeld). + RANLUX++ is an extension of RANLUX and uses the equivalent LCG to + offer a much higher luxury level at better performance. It inherits + the excellent statistical properties and passes the full BigCrush. + +07 July 2021 - G.Cosmo (externals-V10-07-06) +- CLHEP: Fixed seeding in Ranlux64Engine (J.Hahnfeld). + 03 June 2021, B. Morgan (externals-V10-07-05) - PTL: Hide PTL_... options from clients building Geant4 - Forward relevant Geant4 options to PTL: TBB, sanitizer, locks diff --git a/source/externals/clhep/CMakeLists.txt b/source/externals/clhep/CMakeLists.txt index e07bef6cc2..a96219e40f 100644 --- a/source/externals/clhep/CMakeLists.txt +++ b/source/externals/clhep/CMakeLists.txt @@ -51,6 +51,9 @@ set(G4clhep_HEADERS include/CLHEP/Geometry/Point3D.h include/CLHEP/Geometry/Transform3D.h include/CLHEP/Geometry/Vector3D.h + include/CLHEP/Random/ranluxpp/helpers.h + include/CLHEP/Random/ranluxpp/mulmod.h + include/CLHEP/Random/ranluxpp/ranlux_lcg.h include/CLHEP/Random/DoubConv.h include/CLHEP/Random/DualRand.h include/CLHEP/Random/EngineFactory.h @@ -96,6 +99,7 @@ set(G4clhep_HEADERS include/CLHEP/Random/Randomize.h include/CLHEP/Random/RanecuEngine.h include/CLHEP/Random/Ranlux64Engine.h + include/CLHEP/Random/RanluxppEngine.h include/CLHEP/Random/RanluxEngine.h include/CLHEP/Random/RanshiEngine.h include/CLHEP/Random/SeedTable.h @@ -194,6 +198,7 @@ set(G4clhep_SOURCES src/RandStudentT.cc src/RanecuEngine.cc src/Ranlux64Engine.cc + src/RanluxppEngine.cc src/RanluxEngine.cc src/RanshiEngine.cc src/RotationA.cc diff --git a/source/externals/clhep/History b/source/externals/clhep/History index c874f6ff8e..9491efd99c 100644 --- a/source/externals/clhep/History +++ b/source/externals/clhep/History @@ -16,13 +16,29 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +01 September 2021 - G.Cosmo +- Synchronised with CLHEP-2.4.5.1. + * Random (J.Hahnfeld) + o Introducing new random engine RANLUX++ and related helper classes. + RANLUX++ is an extension of RANLUX and uses the equivalent LCG to + offer a much higher luxury level at better performance. It inherits + the excellent statistical properties and passes the full BigCrush. + +07 July 2021 - G.Cosmo +- Random (J.Hahnfeld) + o Fixed seeding in Ranlux64Engine. + +28 May 2021 - G.Cosmo +- Synchronised with CLHEP-2.4.4.2. + 07 May 2021 - G.Cosmo - Units (M.Maire) o Added in SystemOfUnits.h: minute, hour, day, year and millielectronvolt. o Added in PhysicalConstants.h: Bohr_magneton and nuclear_magneton. 06 May 2021 - G.Cosmo -- Fixed trivial compilation warnings on gcc-11 in Random headers. +- Random (G.Cosmo) + o Fixed trivial compilation warnings on gcc-11 in Random headers. 11 November 2020 - G.Cosmo - Synchronised with CLHEP-2.4.4.0: diff --git a/source/externals/clhep/include/CLHEP/Random/Randomize.h b/source/externals/clhep/include/CLHEP/Random/Randomize.h index 9d18f8cae4..83339d01a2 100644 --- a/source/externals/clhep/include/CLHEP/Random/Randomize.h +++ b/source/externals/clhep/include/CLHEP/Random/Randomize.h @@ -31,6 +31,7 @@ #include "CLHEP/Random/RanecuEngine.h" #include "CLHEP/Random/RanluxEngine.h" #include "CLHEP/Random/Ranlux64Engine.h" +#include "CLHEP/Random/RanluxppEngine.h" #include "CLHEP/Random/RanshiEngine.h" // Including distributions ... diff --git a/source/externals/clhep/include/CLHEP/Random/RanluxppEngine.h b/source/externals/clhep/include/CLHEP/Random/RanluxppEngine.h new file mode 100644 index 0000000000..8aa5133bfd --- /dev/null +++ b/source/externals/clhep/include/CLHEP/Random/RanluxppEngine.h @@ -0,0 +1,104 @@ +// +// -*- C++ -*- +// +// ----------------------------------------------------------------------- +// HEP Random +// --- RanluxppEngine --- +// class header file +// ----------------------------------------------------------------------- +// Implementation of the RANLUX++ generator +// +// RANLUX++ is an LCG equivalent of RANLUX using 576 bit numbers. +// +// References: +// A. Sibidanov +// A revision of the subtract-with-borrow random numbergenerators +// Computer Physics Communications, 221(2017), 299-303 +// +// J. Hahnfeld, L. Moneta +// A Portable Implementation of RANLUX++ +// vCHEP2021 + +#ifndef RanluxppEngine_h +#define RanluxppEngine_h + +#include "CLHEP/Random/RandomEngine.h" + +namespace CLHEP { + +/** + * @author Jonas Hahnfeld + * @ingroup random + */ +class RanluxppEngine final : public HepRandomEngine { + +public: + RanluxppEngine(); + RanluxppEngine(long seed); + RanluxppEngine(std::istream &is); + virtual ~RanluxppEngine(); + // Constructors and destructor + + double flat() override; + // It returns a pseudo random number between 0 and 1, + // excluding the end points. + + void flatArray(const int size, double *vect) override; + // Fills the array "vect" of specified size with flat random values. + + void setSeed(long seed, int dummy = 0) override; + // Sets the state of the algorithm according to seed. + + void setSeeds(const long *seeds, int dummy = 0) override; + // Sets the state of the algorithm according to the zero terminated + // array of seeds. Only the first seed is used. + + void skip(uint64_t n); + // Skip `n` random numbers without generating them. + + void saveStatus(const char filename[] = "Ranluxpp.conf") const override; + // Saves in named file the current engine status. + + void restoreStatus(const char filename[] = "Ranluxpp.conf") override; + // Reads from named file the last saved engine status and restores it. + + void showStatus() const override; + // Dumps the engine status on the screen. + + std::string name() const override; + + // Optional methods to serialize the engine's state into vectors and streams. + static std::string engineName(); + static std::string beginTag(); + + std::ostream &put(std::ostream &os) const override; + std::istream &get(std::istream &is) override; + + std::istream &getState(std::istream &is) override; + + std::vector put() const override; + bool get(const std::vector &v) override; + bool getState(const std::vector &v) override; + + // Save and restore to/from streams + operator double() override { return flat(); } + operator float() override { return float(flat()); } + operator unsigned int() override { return (unsigned int)nextRandomBits(); } + + // 1 value for the engine ID, 2 * 9 values for the state, and 2 more values + // for the carry bit and the position. + static const unsigned int VECTOR_STATE_SIZE = 21; + +private: + void advance(); + uint64_t nextRandomBits(); + + uint64_t fState[9]; ///< RANLUX state of the generator + unsigned fCarry; ///< Carry bit of the RANLUX state + int fPosition = 0; ///< Current position in bits + +}; // RanluxppEngine + +} // namespace CLHEP + +#endif diff --git a/source/externals/clhep/include/CLHEP/Random/ranluxpp/helpers.h b/source/externals/clhep/include/CLHEP/Random/ranluxpp/helpers.h new file mode 100644 index 0000000000..644f3be367 --- /dev/null +++ b/source/externals/clhep/include/CLHEP/Random/ranluxpp/helpers.h @@ -0,0 +1,151 @@ +// +// -*- C++ -*- +// +// ----------------------------------------------------------------------- +// HEP Random +// --- RanluxppEngine --- +// helper implementation file +// ----------------------------------------------------------------------- + +#ifndef RANLUXPP_HELPERS_H +#define RANLUXPP_HELPERS_H + +#include + +/// Compute `a + b` and set `overflow` accordingly. +static inline uint64_t add_overflow(uint64_t a, uint64_t b, + unsigned &overflow) { + uint64_t add = a + b; + overflow = (add < a); + return add; +} + +/// Compute `a + b` and increment `carry` if there was an overflow +static inline uint64_t add_carry(uint64_t a, uint64_t b, unsigned &carry) { + unsigned overflow; + uint64_t add = add_overflow(a, b, overflow); + // Do NOT branch on overflow to avoid jumping code, just add 0 if there was + // no overflow. + carry += overflow; + return add; +} + +/// Compute `a - b` and set `overflow` accordingly +static inline uint64_t sub_overflow(uint64_t a, uint64_t b, + unsigned &overflow) { + uint64_t sub = a - b; + overflow = (sub > a); + return sub; +} + +/// Compute `a - b` and increment `carry` if there was an overflow +static inline uint64_t sub_carry(uint64_t a, uint64_t b, unsigned &carry) { + unsigned overflow; + uint64_t sub = sub_overflow(a, b, overflow); + // Do NOT branch on overflow to avoid jumping code, just add 0 if there was + // no overflow. + carry += overflow; + return sub; +} + +/// Update r = r - (t1 + t2) + (t3 + t2) * b ** 10 +/// +/// This function also yields cbar = floor(r / m) as its return value (int64_t +/// because the value can be -1). With an initial value of r = t0, this can +/// be used for computing the remainder after division by m (see the function +/// mod_m in mulmod.h). The function to_ranlux passes r = 0 and uses only the +/// return value to obtain the decimal expansion after divison by m. +static inline int64_t compute_r(const uint64_t *upper, uint64_t *r) { + // Subtract t1 (24 * 24 = 576 bits) + unsigned carry = 0; + for (int i = 0; i < 9; i++) { + uint64_t r_i = r[i]; + r_i = sub_overflow(r_i, carry, carry); + + uint64_t t1_i = upper[i]; + r_i = sub_carry(r_i, t1_i, carry); + r[i] = r_i; + } + int64_t c = -((int64_t)carry); + + // Subtract t2 (only 240 bits, so need to extend) + carry = 0; + for (int i = 0; i < 9; i++) { + uint64_t r_i = r[i]; + r_i = sub_overflow(r_i, carry, carry); + + uint64_t t2_bits = 0; + if (i < 4) { + t2_bits += upper[i + 5] >> 16; + if (i < 3) { + t2_bits += upper[i + 6] << 48; + } + } + r_i = sub_carry(r_i, t2_bits, carry); + r[i] = r_i; + } + c -= carry; + + // r += (t3 + t2) * 2 ** 240 + carry = 0; + { + uint64_t r_3 = r[3]; + // 16 upper bits + uint64_t t2_bits = (upper[5] >> 16) << 48; + uint64_t t3_bits = (upper[0] << 48); + + r_3 = add_carry(r_3, t2_bits, carry); + r_3 = add_carry(r_3, t3_bits, carry); + + r[3] = r_3; + } + for (int i = 0; i < 3; i++) { + uint64_t r_i = r[i + 4]; + r_i = add_overflow(r_i, carry, carry); + + uint64_t t2_bits = (upper[5 + i] >> 32) + (upper[6 + i] << 32); + uint64_t t3_bits = (upper[i] >> 16) + (upper[1 + i] << 48); + + r_i = add_carry(r_i, t2_bits, carry); + r_i = add_carry(r_i, t3_bits, carry); + + r[i + 4] = r_i; + } + { + uint64_t r_7 = r[7]; + r_7 = add_overflow(r_7, carry, carry); + + uint64_t t2_bits = (upper[8] >> 32); + uint64_t t3_bits = (upper[3] >> 16) + (upper[4] << 48); + + r_7 = add_carry(r_7, t2_bits, carry); + r_7 = add_carry(r_7, t3_bits, carry); + + r[7] = r_7; + } + { + uint64_t r_8 = r[8]; + r_8 = add_overflow(r_8, carry, carry); + + uint64_t t3_bits = (upper[4] >> 16) + (upper[5] << 48); + + r_8 = add_carry(r_8, t3_bits, carry); + + r[8] = r_8; + } + c += carry; + + // c = floor(r / 2 ** 576) has been computed along the way via the carry + // flags. Now if c = 0 and the value currently stored in r is greater or + // equal to m, we need cbar = 1 and subtract m, otherwise cbar = c. The + // value currently in r is greater or equal to m, if and only if one of + // the last 240 bits is set and the upper bits are all set. + bool greater_m = r[0] | r[1] | r[2] | (r[3] & 0x0000ffffffffffff); + greater_m &= (r[3] >> 48) == 0xffff; + for (int i = 4; i < 9; i++) { + greater_m &= (r[i] == UINT64_MAX); + } + return c + (c == 0 && greater_m); +} + +#endif diff --git a/source/externals/clhep/include/CLHEP/Random/ranluxpp/mulmod.h b/source/externals/clhep/include/CLHEP/Random/ranluxpp/mulmod.h new file mode 100644 index 0000000000..5beb641258 --- /dev/null +++ b/source/externals/clhep/include/CLHEP/Random/ranluxpp/mulmod.h @@ -0,0 +1,255 @@ +// +// -*- C++ -*- +// +// ----------------------------------------------------------------------- +// HEP Random +// --- RanluxppEngine --- +// helper implementation file +// ----------------------------------------------------------------------- + +#ifndef RANLUXPP_MULMOD_H +#define RANLUXPP_MULMOD_H + +#include "helpers.h" + +#include + +/// Multiply two 576 bit numbers, stored as 9 numbers of 64 bits each +/// +/// \param[in] in1 first factor as 9 numbers of 64 bits each +/// \param[in] in2 second factor as 9 numbers of 64 bits each +/// \param[out] out result with 18 numbers of 64 bits each +static void multiply9x9(const uint64_t *in1, const uint64_t *in2, + uint64_t *out) { + uint64_t next = 0; + unsigned nextCarry = 0; + +#if defined(__clang__) || defined(__INTEL_COMPILER) +#pragma unroll +#elif defined(__GNUC__) && __GNUC__ >= 8 +// This pragma was introduced in GCC version 8. +#pragma GCC unroll 18 +#endif + for (int i = 0; i < 18; i++) { + uint64_t current = next; + unsigned carry = nextCarry; + + next = 0; + nextCarry = 0; + +#if defined(__clang__) || defined(__INTEL_COMPILER) +#pragma unroll +#elif defined(__GNUC__) && __GNUC__ >= 8 +// This pragma was introduced in GCC version 8. +#pragma GCC unroll 9 +#endif + for (int j = 0; j < 9; j++) { + int k = i - j; + if (k < 0 || k >= 9) + continue; + + uint64_t fac1 = in1[j]; + uint64_t fac2 = in2[k]; +#if defined(__SIZEOF_INT128__) && !defined(CLHEP_NO_INT128) +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#endif + unsigned __int128 prod = fac1; + prod = prod * fac2; + + uint64_t upper = prod >> 64; + uint64_t lower = static_cast(prod); +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#else + uint64_t upper1 = fac1 >> 32; + uint64_t lower1 = static_cast(fac1); + + uint64_t upper2 = fac2 >> 32; + uint64_t lower2 = static_cast(fac2); + + // Multiply 32-bit parts, each product has a maximum value of + // (2 ** 32 - 1) ** 2 = 2 ** 64 - 2 * 2 ** 32 + 1. + uint64_t upper = upper1 * upper2; + uint64_t middle1 = upper1 * lower2; + uint64_t middle2 = lower1 * upper2; + uint64_t lower = lower1 * lower2; + + // When adding the two products, the maximum value for middle is + // 2 * 2 ** 64 - 4 * 2 ** 32 + 2, which exceeds a uint64_t. + unsigned overflow; + uint64_t middle = add_overflow(middle1, middle2, overflow); + // Handling the overflow by a multiplication with 0 or 1 is cheaper + // than branching with an if statement, which the compiler does not + // optimize to this equivalent code. Note that we could do entirely + // without this overflow handling when summing up the intermediate + // products differently as described in the following SO answer: + // https://stackoverflow.com/a/51587262 + // However, this approach takes at least the same amount of thinking + // why a) the code gives the same results without b) overflowing due + // to the mixture of 32 bit arithmetic. Moreover, my tests show that + // the scheme implemented here is actually slightly more performant. + uint64_t overflow_add = overflow * (uint64_t(1) << 32); + // This addition can never overflow because the maximum value of upper + // is 2 ** 64 - 2 * 2 ** 32 + 1 (see above). When now adding another + // 2 ** 32, the result is 2 ** 64 - 2 ** 32 + 1 and still smaller than + // the maximum 2 ** 64 - 1 that can be stored in a uint64_t. + upper += overflow_add; + + uint64_t middle_upper = middle >> 32; + uint64_t middle_lower = middle << 32; + + lower = add_overflow(lower, middle_lower, overflow); + upper += overflow; + + // This still can't overflow since the maximum of middle_upper is + // - 2 ** 32 - 4 if there was an overflow for middle above, bringing + // the maximum value of upper to 2 ** 64 - 2. + // - otherwise upper still has the initial maximum value given above + // and the addition of a value smaller than 2 ** 32 brings it to + // a maximum value of 2 ** 64 - 2 ** 32 + 2. + // (Both cases include the increment to handle the overflow in lower.) + // + // All the reasoning makes perfect sense given that the product of two + // 64 bit numbers is smaller than or equal to + // (2 ** 64 - 1) ** 2 = 2 ** 128 - 2 * 2 ** 64 + 1 + // with the upper bits matching the 2 ** 64 - 2 of the first case. + upper += middle_upper; +#endif + + // Add to current, remember carry. + current = add_carry(current, lower, carry); + + // Add to next, remember nextCarry. + next = add_carry(next, upper, nextCarry); + } + + next = add_carry(next, carry, nextCarry); + + out[i] = current; + } +} + +/// Compute a value congruent to mul modulo m less than 2 ** 576 +/// +/// \param[in] mul product from multiply9x9 with 18 numbers of 64 bits each +/// \param[out] out result with 9 numbers of 64 bits each +/// +/// \f$ m = 2^{576} - 2^{240} + 1 \f$ +/// +/// The result in out is guaranteed to be smaller than the modulus. +static void mod_m(const uint64_t *mul, uint64_t *out) { + uint64_t r[9]; + // Assign r = t0 + for (int i = 0; i < 9; i++) { + r[i] = mul[i]; + } + + int64_t c = compute_r(mul + 9, r); + + // To update r = r - c * m, it suffices to know c * (-2 ** 240 + 1) + // because the 2 ** 576 will cancel out. Also note that c may be zero, but + // the operation is still performed to avoid branching. + + // c * (-2 ** 240 + 1) in 576 bits looks as follows, depending on c: + // - if c = 0, the number is zero. + // - if c = 1: bits 576 to 240 are set, + // bits 239 to 1 are zero, and + // the last one is set + // - if c = -1, which corresponds to all bits set (signed int64_t): + // bits 576 to 240 are zero and the rest is set. + // Note that all bits except the last are exactly complimentary (unless c = 0) + // and the last byte is conveniently represented by c already. + // Now construct the three bit patterns from c, their names correspond to the + // assembly implementation by Alexei Sibidanov. + + // c = 0 -> t0 = 0; c = 1 -> t0 = 0; c = -1 -> all bits set (sign extension) + // (The assembly implementation shifts by 63, which gives the same result.) + int64_t t0 = c >> 1; + + // Left shifting negative values is undefined behavior until C++20, cast to + // unsigned. + uint64_t c_unsigned = static_cast(c); + + // c = 0 -> t2 = 0; c = 1 -> upper 16 bits set; c = -1 -> lower 48 bits set + int64_t t2 = t0 - (c_unsigned << 48); + + // c = 0 -> t1 = 0; c = 1 -> all bits set (sign extension); c = -1 -> t1 = 0 + // (The assembly implementation shifts by 63, which gives the same result.) + int64_t t1 = t2 >> 48; + + unsigned carry = 0; + { + uint64_t r_0 = r[0]; + + uint64_t out_0 = sub_carry(r_0, c, carry); + out[0] = out_0; + } + for (int i = 1; i < 3; i++) { + uint64_t r_i = r[i]; + r_i = sub_overflow(r_i, carry, carry); + + uint64_t out_i = sub_carry(r_i, t0, carry); + out[i] = out_i; + } + { + uint64_t r_3 = r[3]; + r_3 = sub_overflow(r_3, carry, carry); + + uint64_t out_3 = sub_carry(r_3, t2, carry); + out[3] = out_3; + } + for (int i = 4; i < 9; i++) { + uint64_t r_i = r[i]; + r_i = sub_overflow(r_i, carry, carry); + + uint64_t out_i = sub_carry(r_i, t1, carry); + out[i] = out_i; + } +} + +/// Combine multiply9x9 and mod_m with internal temporary storage +/// +/// \param[in] in1 first factor with 9 numbers of 64 bits each +/// \param[inout] inout second factor and also the output of the same size +/// +/// The result in inout is guaranteed to be smaller than the modulus. +static void mulmod(const uint64_t *in1, uint64_t *inout) { + uint64_t mul[2 * 9] = {0}; + multiply9x9(in1, inout, mul); + mod_m(mul, inout); +} + +/// Compute base to the n modulo m +/// +/// \param[in] base with 9 numbers of 64 bits each +/// \param[out] res output with 9 numbers of 64 bits each +/// \param[in] n exponent +/// +/// The arguments base and res may point to the same location. +static void powermod(const uint64_t *base, uint64_t *res, uint64_t n) { + uint64_t fac[9] = {0}; + fac[0] = base[0]; + res[0] = 1; + for (int i = 1; i < 9; i++) { + fac[i] = base[i]; + res[i] = 0; + } + + uint64_t mul[18] = {0}; + while (n) { + if (n & 1) { + multiply9x9(res, fac, mul); + mod_m(mul, res); + } + n >>= 1; + if (!n) + break; + multiply9x9(fac, fac, mul); + mod_m(mul, fac); + } +} + +#endif diff --git a/source/externals/clhep/include/CLHEP/Random/ranluxpp/ranlux_lcg.h b/source/externals/clhep/include/CLHEP/Random/ranluxpp/ranlux_lcg.h new file mode 100644 index 0000000000..2e716c6e55 --- /dev/null +++ b/source/externals/clhep/include/CLHEP/Random/ranluxpp/ranlux_lcg.h @@ -0,0 +1,88 @@ +// +// -*- C++ -*- +// +// ----------------------------------------------------------------------- +// HEP Random +// --- RanluxppEngine --- +// helper implementation file +// ----------------------------------------------------------------------- + +#ifndef RANLUXPP_RANLUX_LCG_H +#define RANLUXPP_RANLUX_LCG_H + +#include "helpers.h" + +#include + +/// Convert RANLUX numbers to an LCG state +/// +/// \param[in] ranlux the RANLUX numbers as 576 bits +/// \param[out] lcg the 576 bits of the LCG state, smaller than m +/// \param[in] c the carry bit of the RANLUX state +/// +/// \f$ m = 2^{576} - 2^{240} + 1 \f$ +static void to_lcg(const uint64_t *ranlux, unsigned c, uint64_t *lcg) { + unsigned carry = 0; + // Subtract the final 240 bits. + for (int i = 0; i < 9; i++) { + uint64_t ranlux_i = ranlux[i]; + uint64_t lcg_i = sub_overflow(ranlux_i, carry, carry); + + uint64_t bits = 0; + if (i < 4) { + bits += ranlux[i + 5] >> 16; + if (i < 3) { + bits += ranlux[i + 6] << 48; + } + } + lcg_i = sub_carry(lcg_i, bits, carry); + lcg[i] = lcg_i; + } + + // Add and propagate the carry bit. + for (int i = 0; i < 9; i++) { + lcg[i] = add_overflow(lcg[i], c, c); + } +} + +/// Convert an LCG state to RANLUX numbers +/// +/// \param[in] lcg the 576 bits of the LCG state, must be smaller than m +/// \param[out] ranlux the RANLUX numbers as 576 bits +/// \param[out] c the carry bit of the RANLUX state +/// +/// \f$ m = 2^{576} - 2^{240} + 1 \f$ +static void to_ranlux(const uint64_t *lcg, uint64_t *ranlux, unsigned &c_out) { + uint64_t r[9] = {0}; + int64_t c = compute_r(lcg, r); + + // ranlux = t1 + t2 + c + unsigned carry = 0; + for (int i = 0; i < 9; i++) { + uint64_t in_i = lcg[i]; + uint64_t tmp_i = add_overflow(in_i, carry, carry); + + uint64_t bits = 0; + if (i < 4) { + bits += lcg[i + 5] >> 16; + if (i < 3) { + bits += lcg[i + 6] << 48; + } + } + tmp_i = add_carry(tmp_i, bits, carry); + ranlux[i] = tmp_i; + } + + // If c = -1, we need to add it to all components. + int64_t c1 = c >> 1; + ranlux[0] = add_overflow(ranlux[0], c, carry); + for (int i = 1; i < 9; i++) { + uint64_t ranlux_i = ranlux[i]; + ranlux_i = add_overflow(ranlux_i, carry, carry); + ranlux_i = add_carry(ranlux_i, c1, carry); + } + + c_out = carry; +} + +#endif diff --git a/source/externals/clhep/src/EngineFactory.cc b/source/externals/clhep/src/EngineFactory.cc index 909f3d7db3..dc99fbab2f 100644 --- a/source/externals/clhep/src/EngineFactory.cc +++ b/source/externals/clhep/src/EngineFactory.cc @@ -17,6 +17,7 @@ #include "CLHEP/Random/MTwistEngine.h" #include "CLHEP/Random/RanecuEngine.h" #include "CLHEP/Random/Ranlux64Engine.h" +#include "CLHEP/Random/RanluxppEngine.h" #include "CLHEP/Random/RanluxEngine.h" #include "CLHEP/Random/RanshiEngine.h" #include "CLHEP/Random/NonRandomEngine.h" @@ -56,6 +57,7 @@ HepRandomEngine* EngineFactory::newEngine(std::istream& is) { eptr = makeAnEngine (tag, is); if (eptr) return eptr; eptr = makeAnEngine (tag, is); if (eptr) return eptr; eptr = makeAnEngine (tag, is); if (eptr) return eptr; + eptr = makeAnEngine (tag, is); if (eptr) return eptr; eptr = makeAnEngine (tag, is); if (eptr) return eptr; eptr = makeAnEngine (tag, is); if (eptr) return eptr; eptr = makeAnEngine (tag, is); if (eptr) return eptr; @@ -76,6 +78,7 @@ EngineFactory::newEngine(std::vector const & v) { eptr = makeAnEngine (v); if (eptr) return eptr; eptr = makeAnEngine (v); if (eptr) return eptr; eptr = makeAnEngine (v); if (eptr) return eptr; + eptr = makeAnEngine (v); if (eptr) return eptr; eptr = makeAnEngine (v); if (eptr) return eptr; eptr = makeAnEngine (v); if (eptr) return eptr; eptr = makeAnEngine (v); if (eptr) return eptr; diff --git a/source/externals/clhep/src/Ranlux64Engine.cc b/source/externals/clhep/src/Ranlux64Engine.cc index f2017fefef..8cc585b875 100644 --- a/source/externals/clhep/src/Ranlux64Engine.cc +++ b/source/externals/clhep/src/Ranlux64Engine.cc @@ -252,7 +252,7 @@ void Ranlux64Engine::update() { // Now when we return, there are 12 fresh usable numbers in s[11] ... s[0] - index = 11; + index = 12; } // update() @@ -450,7 +450,8 @@ void Ranlux64Engine::setSeed(long seed, int lux) { carry = 0.0; if ( randoms[11] == 0. ) carry = twoToMinus_48(); - index = 11; + // Perform an update before returning the first random number. + index = -1; } // setSeed() @@ -523,7 +524,8 @@ void Ranlux64Engine::setSeeds(const long * seeds, int lux) { carry = 0.0; if ( randoms[11] == 0. ) carry = twoToMinus_48(); - index = 11; + // Perform an update before returning the first random number. + index = -1; } diff --git a/source/externals/clhep/src/RanluxppEngine.cc b/source/externals/clhep/src/RanluxppEngine.cc new file mode 100644 index 0000000000..bfe810cfdb --- /dev/null +++ b/source/externals/clhep/src/RanluxppEngine.cc @@ -0,0 +1,305 @@ +// +// -*- C++ -*- +// +// ----------------------------------------------------------------------- +// HEP Random +// --- RanluxppEngine --- +// class implementation file +// ----------------------------------------------------------------------- +// Implementation of the RANLUX++ generator +// +// RANLUX++ is an LCG equivalent of RANLUX using 576 bit numbers. +// +// The idea of the generator (such as the initialization method) and the algorithm +// for the modulo operation are described in +// A. Sibidanov, *A revision of the subtract-with-borrow random numbergenerators*, +// *Computer Physics Communications*, 221(2017), 299-303, +// preprint https://arxiv.org/pdf/1705.03123.pdf +// +// The code is loosely based on the Assembly implementation by A. Sibidanov +// available at https://github.com/sibidanov/ranluxpp/. +// +// Compared to the original generator, this implementation contains a fix to ensure +// that the modulo operation of the LCG always returns the smallest value congruent +// to the modulus (based on notes by M. Lüscher). Also, the generator converts the +// LCG state back to RANLUX numbers (implementation based on notes by M. Lüscher). +// This avoids a bias in the generated numbers because the upper bits of the LCG +// state, that is smaller than the modulus \f$ m = 2^{576} - 2^{240} + 1 \f$ (not +// a power of 2!), have a higher probability of being 0 than 1. And finally, this +// implementation draws 48 random bits for each generated floating point number +// (instead of 52 bits as in the original generator) to maintain the theoretical +// properties from understanding the original transition function of RANLUX as a +// chaotic dynamical system. +// +// These modifications and the portable implementation in general are described in +// J. Hahnfeld, L. Moneta, *A Portable Implementation of RANLUX++*, vCHEP2021 +// preprint https://arxiv.org/pdf/2106.02504.pdf + +#include "CLHEP/Random/RanluxppEngine.h" + +#include "CLHEP/Random/engineIDulong.h" +#include "CLHEP/Utility/atomic_int.h" + +#include "CLHEP/Random/ranluxpp/mulmod.h" +#include "CLHEP/Random/ranluxpp/ranlux_lcg.h" + +#include +#include +#include + +namespace CLHEP { + +namespace { +// Number of instances with automatic seed selection. +CLHEP_ATOMIC_INT_TYPE numberOfEngines(0); + +const uint64_t kA_2048[] = { + 0xed7faa90747aaad9, 0x4cec2c78af55c101, 0xe64dcb31c48228ec, + 0x6d8a15a13bee7cb0, 0x20b2ca60cb78c509, 0x256c3d3c662ea36c, + 0xff74e54107684ed2, 0x492edfcc0cc8e753, 0xb48c187cf5b22097, +}; +} // namespace + +RanluxppEngine::RanluxppEngine() : HepRandomEngine() { + int numEngines = ++numberOfEngines; + setSeed(numEngines); +} + +RanluxppEngine::RanluxppEngine(long seed) : HepRandomEngine() { + theSeed = seed; + setSeed(seed); +} + +RanluxppEngine::RanluxppEngine(std::istream &is) : HepRandomEngine() { + get(is); +} + +RanluxppEngine::~RanluxppEngine() = default; + +static constexpr int kMaxPos = 9 * 64; +static constexpr int kBits = 48; + +void RanluxppEngine::advance() { + uint64_t lcg[9]; + to_lcg(fState, fCarry, lcg); + mulmod(kA_2048, lcg); + to_ranlux(lcg, fState, fCarry); + fPosition = 0; +} + +uint64_t RanluxppEngine::nextRandomBits() { + if (fPosition + kBits > kMaxPos) { + advance(); + } + + int idx = fPosition / 64; + int offset = fPosition % 64; + int numBits = 64 - offset; + + uint64_t bits = fState[idx] >> offset; + if (numBits < kBits) { + bits |= fState[idx + 1] << numBits; + } + bits &= ((uint64_t(1) << kBits) - 1); + + fPosition += kBits; + assert(fPosition <= kMaxPos && "position out of range!"); + + return bits; +} + +double RanluxppEngine::flat() { + // RandomEngine wants a "double random values ranging between ]0,1[", so + // exclude all zero bits. + uint64_t random; + do { + random = nextRandomBits(); + } while (random == 0); + + static constexpr double div = 1.0 / (uint64_t(1) << kBits); + return random * div; +} + +void RanluxppEngine::flatArray(const int size, double *vect) { + for (int i = 0; i < size; i++) { + vect[i] = flat(); + } +} + +void RanluxppEngine::setSeed(long seed, int) { + theSeed = seed; + + uint64_t lcg[9]; + lcg[0] = 1; + for (int i = 1; i < 9; i++) { + lcg[i] = 0; + } + + uint64_t a_seed[9]; + // Skip 2 ** 96 states. + powermod(kA_2048, a_seed, uint64_t(1) << 48); + powermod(a_seed, a_seed, uint64_t(1) << 48); + // Skip more states according to seed. + powermod(a_seed, a_seed, seed); + mulmod(a_seed, lcg); + + to_ranlux(lcg, fState, fCarry); + fPosition = 0; +} + +void RanluxppEngine::setSeeds(const long *seeds, int) { + theSeeds = seeds; + setSeed(*seeds, 0); +} + +void RanluxppEngine::skip(uint64_t n) { + int left = (kMaxPos - fPosition) / kBits; + assert(left >= 0 && "position was out of range!"); + if (n < (uint64_t)left) { + // Just skip the next few entries in the currently available bits. + fPosition += n * kBits; + return; + } + + n -= left; + // Need to advance and possibly skip over blocks. + int nPerState = kMaxPos / kBits; + int skip = (n / nPerState); + + uint64_t a_skip[9]; + powermod(kA_2048, a_skip, skip + 1); + + uint64_t lcg[9]; + to_lcg(fState, fCarry, lcg); + mulmod(a_skip, lcg); + to_ranlux(lcg, fState, fCarry); + + // Potentially skip numbers in the freshly generated block. + int remaining = n - skip * nPerState; + assert(remaining >= 0 && "should not end up at a negative position!"); + fPosition = remaining * kBits; + assert(fPosition <= kMaxPos && "position out of range!"); +} + +void RanluxppEngine::saveStatus(const char filename[]) const { + std::ofstream os(filename); + put(os); + os.close(); +} + +void RanluxppEngine::restoreStatus(const char filename[]) { + std::ifstream is(filename); + get(is); + is.close(); +} + +void RanluxppEngine::showStatus() const { + std::cout + << "--------------------- RanluxppEngine status --------------------" + << std::endl; + std::cout << " fState[] = {"; + std::cout << std::hex << std::setfill('0'); + for (int i = 0; i < 9; i++) { + if (i % 3 == 0) { + std::cout << std::endl << " "; + } else { + std::cout << " "; + } + std::cout << "0x" << std::setw(16) << fState[i] << ","; + } + std::cout << std::endl << " }" << std::endl; + std::cout << std::dec; + std::cout << " fCarry = " << fCarry << ", fPosition = " << fPosition + << std::endl; + std::cout + << "----------------------------------------------------------------" + << std::endl; +} + +std::string RanluxppEngine::name() const { return engineName(); } + +std::string RanluxppEngine::engineName() { return "RanluxppEngine"; } + +std::string RanluxppEngine::beginTag() { return "RanluxppEngine-begin"; } + +std::ostream &RanluxppEngine::put(std::ostream &os) const { + os << beginTag() << "\n"; + const std::vector state = put(); + for (unsigned long v : state) { + os << v << "\n"; + } + return os; +} + +std::istream &RanluxppEngine::get(std::istream &is) { + std::string tag; + is >> tag; + if (tag != beginTag()) { + is.clear(std::ios::badbit | is.rdstate()); + std::cerr << "No RanluxppEngine found at current position\n"; + return is; + } + return getState(is); +} + +std::istream &RanluxppEngine::getState(std::istream &is) { + std::vector state; + state.reserve(VECTOR_STATE_SIZE); + for (unsigned int i = 0; i < VECTOR_STATE_SIZE; i++) { + unsigned long v; + is >> v; + state.push_back(v); + } + + getState(state); + return is; +} + +std::vector RanluxppEngine::put() const { + std::vector v; + v.reserve(VECTOR_STATE_SIZE); + v.push_back(engineIDulong()); + + // unsigned long is only guaranteed to be 32 bit wide, so chop up the 64 bit + // values in fState. + for (int i = 0; i < 9; i++) { + unsigned long lower = static_cast(fState[i]); + v.push_back(lower); + unsigned long upper = static_cast(fState[i] >> 32); + v.push_back(upper); + } + + v.push_back(fCarry); + v.push_back(fPosition); + return v; +} + +bool RanluxppEngine::get(const std::vector &v) { + if (v[0] != engineIDulong()) { + std::cerr << "RanluxppEngine::get(): " + << "vector has wrong ID word - state unchanged" << std::endl; + return false; + } + return getState(v); +} + +bool RanluxppEngine::getState(const std::vector &v) { + if (v.size() != VECTOR_STATE_SIZE) { + std::cerr << "RanluxppEngine::getState(): " + << "vector has wrong length - state unchanged" << std::endl; + return false; + } + + // Assemble the state vector (see RanluxppEngine::put). + for (int i = 0; i < 9; i++) { + uint64_t lower = v[2 * i + 1]; + uint64_t upper = v[2 * i + 2]; + fState[i] = (upper << 32) + lower; + } + fCarry = v[19]; + fPosition = v[20]; + + return true; +} + +} // namespace CLHEP diff --git a/source/externals/expat/README b/source/externals/expat/README deleted file mode 100644 index 1f88467d1b..0000000000 --- a/source/externals/expat/README +++ /dev/null @@ -1,139 +0,0 @@ - - Expat, Release 2.1.0 - -This is Expat, a C library for parsing XML, written by James Clark. -Expat is a stream-oriented XML parser. This means that you register -handlers with the parser before starting the parse. These handlers -are called when the parser discovers the associated structures in the -document being parsed. A start tag is an example of the kind of -structures for which you may register handlers. - -Windows users should use the expat_win32bin package, which includes -both precompiled libraries and executables, and source code for -developers. - -Expat is free software. You may copy, distribute, and modify it under -the terms of the License contained in the file COPYING distributed -with this package. This license is the same as the MIT/X Consortium -license. - -Versions of Expat that have an odd minor version (the middle number in -the release above), are development releases and should be considered -as beta software. Releases with even minor version numbers are -intended to be production grade software. - -If you are building Expat from a check-out from the CVS repository, -you need to run a script that generates the configure script using the -GNU autoconf and libtool tools. To do this, you need to have -autoconf 2.58 or newer. Run the script like this: - - ./buildconf.sh - -Once this has been done, follow the same instructions as for building -from a source distribution. - -To build Expat from a source distribution, you first run the -configuration shell script in the top level distribution directory: - - ./configure - -There are many options which you may provide to configure (which you -can discover by running configure with the --help option). But the -one of most interest is the one that sets the installation directory. -By default, the configure script will set things up to install -libexpat into /usr/local/lib, expat.h into /usr/local/include, and -xmlwf into /usr/local/bin. If, for example, you'd prefer to install -into /home/me/mystuff/lib, /home/me/mystuff/include, and -/home/me/mystuff/bin, you can tell configure about that with: - - ./configure --prefix=/home/me/mystuff - -Another interesting option is to enable 64-bit integer support for -line and column numbers and the over-all byte index: - - ./configure CPPFLAGS=-DXML_LARGE_SIZE - -However, such a modification would be a breaking change to the ABI -and is therefore not recommended for general use - e.g. as part of -a Linux distribution - but rather for builds with special requirements. - -After running the configure script, the "make" command will build -things and "make install" will install things into their proper -location. Have a look at the "Makefile" to learn about additional -"make" options. Note that you need to have write permission into -the directories into which things will be installed. - -If you are interested in building Expat to provide document -information in UTF-16 encoding rather than the default UTF-8, follow -these instructions (after having run "make distclean"): - - 1. For UTF-16 output as unsigned short (and version/error - strings as char), run: - - ./configure CPPFLAGS=-DXML_UNICODE - - For UTF-16 output as wchar_t (incl. version/error strings), - run: - - ./configure CFLAGS="-g -O2 -fshort-wchar" \ - CPPFLAGS=-DXML_UNICODE_WCHAR_T - - 2. Edit the MakeFile, changing: - - LIBRARY = libexpat.la - - to: - - LIBRARY = libexpatw.la - - (Note the additional "w" in the library name.) - - 3. Run "make buildlib" (which builds the library only). - Or, to save step 2, run "make buildlib LIBRARY=libexpatw.la". - - 4. Run "make installlib" (which installs the library only). - Or, if step 2 was omitted, run "make installlib LIBRARY=libexpatw.la". - -Using DESTDIR or INSTALL_ROOT is enabled, with INSTALL_ROOT being the default -value for DESTDIR, and the rest of the make file using only DESTDIR. -It works as follows: - $ make install DESTDIR=/path/to/image -overrides the in-makefile set DESTDIR, while both - $ INSTALL_ROOT=/path/to/image make install - $ make install INSTALL_ROOT=/path/to/image -use DESTDIR=$(INSTALL_ROOT), even if DESTDIR eventually is defined in the -environment, because variable-setting priority is -1) commandline -2) in-makefile -3) environment - -Note: This only applies to the Expat library itself, building UTF-16 versions -of xmlwf and the tests is currently not supported. - -Note for Solaris users: The "ar" command is usually located in -"/usr/ccs/bin", which is not in the default PATH. You will need to -add this to your path for the "make" command, and probably also switch -to GNU make (the "make" found in /usr/ccs/bin does not seem to work -properly -- appearantly it does not understand .PHONY directives). If -you're using ksh or bash, use this command to build: - - PATH=/usr/ccs/bin:$PATH make - -When using Expat with a project using autoconf for configuration, you -can use the probing macro in conftools/expat.m4 to determine how to -include Expat. See the comments at the top of that file for more -information. - -A reference manual is available in the file doc/reference.html in this -distribution. - -The homepage for this project is http://www.libexpat.org/. There -are links there to connect you to the bug reports page. If you need -to report a bug when you don't have access to a browser, you may also -send a bug report by email to expat-bugs@mail.libexpat.org. - -Discussion related to the direction of future expat development takes -place on expat-discuss@mail.libexpat.org. Archives of this list and -other Expat-related lists may be found at: - - http://mail.libexpat.org/mailman/listinfo/ diff --git a/source/externals/g4tools/CMakeLists.txt b/source/externals/g4tools/CMakeLists.txt index 08bb2f25c6..0829ba9237 100644 --- a/source/externals/g4tools/CMakeLists.txt +++ b/source/externals/g4tools/CMakeLists.txt @@ -1,7 +1,7 @@ # - Build for G4tools as an "external" # It can be built as a standard module, but we don't declare the headers # so that their nested structure can be retained on install -geant4_add_module(G4tools SOURCES csz_inflate.cc) +geant4_add_module(G4tools SOURCES dummy.cc) geant4_add_category(G4tools MODULES G4tools) @@ -19,4 +19,4 @@ install(FILES tools.license DESTINATION ${CMAKE_INSTALL_DATADIR}) # if(GEANT4_USE_FREETYPE) install(DIRECTORY fonts/ DESTINATION ${CMAKE_INSTALL_DATADIR}/fonts) -endif() \ No newline at end of file +endif() diff --git a/source/externals/g4tools/History b/source/externals/g4tools/History index fb3ab9fdf4..50920aab80 100644 --- a/source/externals/g4tools/History +++ b/source/externals/g4tools/History @@ -2,6 +2,44 @@ # - It is NOT a substitute for good git commit messages! # - All entries must be in reverse time order (most recent data on top)! +9 November 2021 I. Hrivnacova (g4tools-V10-07-11) +- Restored files for MPI + +25 October 2021, G. Barrand (g4tools-V10-07-10) +- tools/tokenize: to help parsing some Geant4 commands "new value". + It permits to get arguments within double quotes to handle, for example, file path that + may contains spaces or a color given as "r g b". +- tools/sg/event_dispatcher,bcbk,ecbk,cbks: classes to have a mechanism in G4/G4ToolsSGSceneHandler + so that tools::sg::plots be properly resized when doing a mouse G4Viewer resize. +- tools/sg/plotter_some_styles: have the plotting setup of ROOT_default, hippodraw, style done in C++ + to avoid the usage of expat for these defaults styles. +- tools/sg/light_off: a node to switch off light in a sub scene graph. +- tools/Qt/sg_viewer: in dstor, reset the "interactors" to null in the glarea. + +21 October 2021 G. Barrand (g4tools-V10-07-09) +- tools/hdf5/ntuple: add code to write/read a column of vectors of strings. +- tools/waxml/ntuple: add code to write a column of vectors of strings. + +19 October 2021 I. Hrivnacova (g4tools-V10-07-08) +- Added rroot/rall and rroot/THistogram needed for + tools::rroot::find_dir (used in Root analysis reader) + +13 October 2021 Guy Barrand (g4tools-V10-07-07) +- sg/base_freetype, text_freetype: modifs to be able to handle embedded fonts. +- font/lato_regular_ttf: embedded lato_regular.ttf font. +- font/roboto_bold_ttf: embedded roboto_bold.ttf font. +- sg/text_hershey_marker, text_freetype_marker: modifs to avoid 'squashing' of text. +- sg/render_action, GL_viewer, atb_vertices: handle transparency by using a two pass rendering method. +- sg/gl2ps_actions/2format: avoid a warning if returning false. +- have 5.6.0 in tools/version. + +08th October 2021, G. Barrand (g4tools-V10-07-06) +- remove the files not used by other Geant4 categories (up so far analysis and visualization). +- remove the test directory. It will be maintained in github/gbarrand/g4tools. +- remove the not used src/csz_inflate.cc file but have a dummy.cc for Geant4/cmake. +- CMakeLists.txt: refer to src/dummy.cc (instead of src/csz_inflate.cc) when declaring the g4tools module. +- have 5.5.0 in tools/version. + 25th May 2021, B. Morgan (g4tools-V10-07-05) - Move fonts from analysis category to tools to assist cross-category use diff --git a/source/externals/g4tools/History_tools b/source/externals/g4tools/History_tools index 10efe9c6d7..3484fda0a3 100644 --- a/source/externals/g4tools/History_tools +++ b/source/externals/g4tools/History_tools @@ -1,3 +1,26 @@ +5.6.0: +- tools/tokenize: to help parsing some Geant4 commands "new value". +- tools/sg/event_dispatcher,bcbk,ecbk,cbks: classes to have a mechanism in G4/G4ToolsSGSceneHandler + so that tools::sg::plots be properly resized when doing a mouse G4Viewer resize. +- tools/sg/plotter_some_styles: have the plotting setup of ROOT_default, hippodraw, style done in C++ + to avoid the usage of expat for these defaults styles. +- tools/sg/light_off: a node to switch off light in a sub scene graph. +- tools/Qt/sg_viewer: in dstor, reset the "interactor" to null in the glarea. +- tools/waxml/ntuple: add code to write a column of vectors of strings. +- tools/hdf5/ntuple: add code to write/read a column of vectors of strings. +- add back: tools/rroot/rall, THistogram. +- sg//base_freetype, text_freetype: modifs to be able to handle embedded fonts. +- font/lato_regular_ttf: embedded lato_regular.ttf font. +- font/roboto_bold_ttf: embedded roboto_bold.ttf font. +- sg/text_hershey_marker, text_freetype_marker: modifs to avoid 'squashing' of text. +- sg/render_action, GL_viewer, atb_vertices: handle transparency by using a two pass rendering method. +- sg/gl2ps_actions/2format: avoid a warning if returning false. +- have 5.6.0 in tools/version. + +5.5.0: + - in geant4 repository remove the files not used by other Geant4 categories. + - in geant4 repository remove the test directory. + - in geant4 repository remove the not used src/csz_inflate.cc file but have a dummy.cc for Geant4/cmake. - tools/zb/polygon: in scan() : initialize ET,AET,SLLBlock, before calling CreateETandAET, to quiet g++-11 -Wmaybe-uninitialized warnings. diff --git a/source/externals/g4tools/include/tools/Cocoa/session.hm b/source/externals/g4tools/include/tools/Cocoa/session.hm deleted file mode 100644 index 9314e45ff2..0000000000 --- a/source/externals/g4tools/include/tools/Cocoa/session.hm +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_Cocoa_session_hm -#define tools_Cocoa_session_hm - -#include - -namespace tools { -namespace Cocoa { - -class isession { -public: - virtual ~isession(){} -public: - virtual void terminate() = 0; -}; - -}} - -#if MAC_OS_X_VERSION_MAX_ALLOWED <= 1050 -@interface tools_Cocoa_session_app_delegate : NSObject { -#else -@interface tools_Cocoa_session_app_delegate : NSObject { -#endif - NSApplication* m_app; - tools::Cocoa::isession* m_session; -} -- (id)init:(NSApplication*)a_app; -- (void)dealloc; -- (void)applicationDidFinishLaunching:(NSNotification*)a_notification; -- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)a_app; -- (void)set_session:(tools::Cocoa::isession*)a_session; -@end -@implementation tools_Cocoa_session_app_delegate -- (id)init:(NSApplication*)a_app { - if(self = [super init]) {} - m_app = a_app; - m_session = 0; - return self; -} -- (void)dealloc {[super dealloc];} -- (void)applicationDidFinishLaunching:(NSNotification*)a_notification { - [m_app activateIgnoringOtherApps:YES]; -} -- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)a_app { - if(m_session) m_session->terminate(); - return NSTerminateNow; -} -- (void)set_session:(tools::Cocoa::isession*)a_session { - m_session = a_session; -} -@end - -#include - -namespace tools { -namespace Cocoa { - -class session : public virtual isession { - typedef isession parent; -public: - virtual void terminate() {} -public: - session(std::ostream& a_out) - :m_out(a_out),m_pool(0),m_app(0),m_to_exit(false) - { - m_pool = [[NSAutoreleasePool alloc] init]; - m_app = [NSApplication sharedApplication]; - - tools_Cocoa_session_app_delegate* app_del = [[tools_Cocoa_session_app_delegate alloc] init:m_app]; - [m_app setDelegate:app_del]; - [app_del set_session:this]; - - [m_app setActivationPolicy:NSApplicationActivationPolicyRegular]; //so that change of NSCursor works. - //[m_app activateIgnoringOtherApps:YES]; //done in the app_delegate, so that menu works at startup. - - {id menubar = [[NSMenu new] autorelease]; - id appMenuItem = [[NSMenuItem new] autorelease]; - [menubar addItem:appMenuItem]; - id appMenu = [[NSMenu new] autorelease]; - id appName = [[NSProcessInfo processInfo] processName]; - id quitTitle = [@"Quit " stringByAppendingString:appName]; - id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:quitTitle action:@selector(terminate:) keyEquivalent:@"q"] autorelease]; - [appMenu addItem:quitMenuItem]; - [appMenuItem setSubmenu:appMenu]; - [m_app setMainMenu:menubar];} - } - virtual ~session() { - [m_pool release]; - } -protected: - session(const session& a_from):parent(a_from),m_out(a_from.m_out),m_pool(0),m_app(0),m_to_exit(false) {} - session& operator=(const session&){return *this;} -public: - std::ostream& out() const {return m_out;} - bool is_valid() const {return true;} - bool steer() { - if(!m_app) return false; - m_to_exit = false; - NSDate* date = [NSDate distantFuture]; //it will permit to block on the below. - while(!m_to_exit) { - NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; -#if MAC_OS_X_VERSION_MAX_ALLOWED <= 1060 //macarts. - NSEvent* event = [m_app nextEventMatchingMask:NSAnyEventMask -#else - NSEvent* event = [m_app nextEventMatchingMask:NSEventMaskAny -#endif - untilDate:date inMode:NSDefaultRunLoopMode dequeue:YES]; - if(event) { - [m_app sendEvent:event]; - [m_app updateWindows]; - } - [pool release]; - } - return true; - } - - bool sync() { - if(!m_app) return false; - NSDate* date = [NSDate distantPast]; //not blocking. - //NSDate* date = [NSDate distantFuture]; //blocking. - while(true) { - NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; -#if MAC_OS_X_VERSION_MAX_ALLOWED <= 1060 //macarts. - NSEvent* event = [m_app nextEventMatchingMask:NSAnyEventMask -#else - NSEvent* event = [m_app nextEventMatchingMask:NSEventMaskAny -#endif - untilDate:date inMode:NSDefaultRunLoopMode dequeue:YES]; - if(event) { - [m_app sendEvent:event]; - [m_app updateWindows]; - } - [pool release]; - if(!event) break; - } - return true; - } - -public: - NSWindow* create_window(const char* a_title,int a_x,int a_y,unsigned int a_width,unsigned int a_height) { - if(!m_app) return 0L; - - NSScreen* screen = 0; - {unsigned int monitor = 0; - NSArray* scrs = [NSScreen screens]; - int number = [scrs count]; - if(int(monitor)set_size(w,h); - [[self openGLContext] makeCurrentContext]; - m_viewer->render(); - [[self openGLContext] flushBuffer]; -} -@end - -#if MAC_OS_X_VERSION_MAX_ALLOWED <= 1050 -@interface tools_Cocoa_sg_viewer_win_delegate : NSObject { -#else -@interface tools_Cocoa_sg_viewer_win_delegate : NSObject { -#endif - tools::Cocoa::session* m_session; -} -- (id)init:(tools::Cocoa::session*)a_session; -- (void)dealloc; -- (void)windowWillClose:(NSNotification*)a_not; -@end -@implementation tools_Cocoa_sg_viewer_win_delegate -- (id)init:(tools::Cocoa::session*)a_session { - if(self = [super init]) {} - m_session = a_session; - return self; -} -- (void)dealloc {[super dealloc];} -- (void)windowWillClose:(NSNotification*)a_not { - m_session->set_to_exit(); -} -@end - -namespace tools { -namespace Cocoa { - -class sg_viewer : public sg::GL_viewer { - TOOLS_HEADER(sg_viewer,tools::Cocoa::sg_viewer,sg::GL_viewer) -public: - sg_viewer(session& a_session, - int a_x = 0,int a_y = 0, - unsigned int a_width = 500,unsigned int a_height = 500, - const std::string& a_win_title = "") - :parent(a_session.out(),a_width,a_height) - ,m_session(a_session) - ,m_win(0),m_GLView(0) - { - m_win = m_session.create_window(a_win_title.c_str(),a_x,a_y,a_width,a_height); - if(!m_win) return; //throw - - tools_Cocoa_sg_viewer_win_delegate* _win_delegate = [[tools_Cocoa_sg_viewer_win_delegate alloc] init:&a_session]; - [m_win setDelegate:_win_delegate]; - - NSRect rect; - rect = [m_win frame]; - rect = [m_win contentRectForFrameRect:rect]; //window content true size. - m_GLView = [[tools_Cocoa_sg_viewer_GLView alloc] init:rect viewer:this]; - [m_win setContentView:m_GLView]; - [m_GLView release]; - } - virtual ~sg_viewer() { - if(m_win) { - m_session.delete_window(m_win); - //m_session.sync(); - } - } -protected: - sg_viewer(const sg_viewer& a_from) - :parent(a_from) - ,m_session(a_from.m_session) - ,m_win(0),m_GLView(0) - {} - sg_viewer& operator=(const sg_viewer& a_from) { - parent::operator=(a_from); - return *this; - } -public: - bool has_window() const {return m_win?true:false;} - bool show() { - if(!m_win) return false; - m_session.show_window(m_win); - return true; - } - void win_render() { - [[m_GLView openGLContext] makeCurrentContext]; - render(); - [[m_GLView openGLContext] flushBuffer]; - } -protected: - session& m_session; - NSWindow* m_win; - tools_Cocoa_sg_viewer_GLView* m_GLView; -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/Qt/plots_glarea b/source/externals/g4tools/include/tools/Qt/plots_glarea deleted file mode 100644 index 70fedffb23..0000000000 --- a/source/externals/g4tools/include/tools/Qt/plots_glarea +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_Qt_plots_glarea -#define tools_Qt_plots_glarea - -#include - -#include "../sg/GL_plots_viewer" - -namespace tools { -namespace Qt { - -class plots_glarea : public QGLWidget { - typedef QGLWidget parent; -public: - virtual void initialieGL() {} - virtual void resizeGL(int a_w,int a_h){ - //::printf("debug : resize : %d %d\n",a_w,a_h); -#if QT_VERSION < 0x050000 -#else - m_width = a_w; - m_height = a_h; -#endif - } - //virtual void paintGL(); - virtual void paintGL() { -#if QT_VERSION < 0x050000 - //::printf("debug : tools::Qt::plots_glarea::paintGL %d %d\n",width(),height()); - m_viewer.set_size(width(),height()); -#else - //::printf("debug : tools::Qt::plots_glarea::paintGL %d %d\n",m_width,m_height); - m_viewer.set_size(m_width,m_height); -#endif - m_viewer.render(); - } - -public: - plots_glarea(QWidget* a_parent,tools::sg::GL_plots_viewer& a_viewer):parent(a_parent),m_viewer(a_viewer){} - virtual ~plots_glarea(){} -protected: - tools::sg::GL_plots_viewer& m_viewer; -#if QT_VERSION < 0x050000 -#else -protected: - int m_width; - int m_height; -#endif -}; - -}} - -#endif - diff --git a/source/externals/g4tools/include/tools/Qt/sg_viewer b/source/externals/g4tools/include/tools/Qt/sg_viewer index 37be777aa2..e2afbeaf96 100644 --- a/source/externals/g4tools/include/tools/Qt/sg_viewer +++ b/source/externals/g4tools/include/tools/Qt/sg_viewer @@ -11,10 +11,8 @@ #include //For QT_VERSION. #if QT_VERSION < 0x050000 -#include #include #else -#include #include #endif @@ -47,6 +45,7 @@ public: m_shell->setLayout(layout); } virtual ~sg_viewer() { + if(m_glarea) m_glarea->set_device_interactor(0); if(m_shell && m_own_shell) { m_session.delete_window(m_shell); //m_session.sync(); diff --git a/source/externals/g4tools/include/tools/Windows/WinTk b/source/externals/g4tools/include/tools/Windows/WinTk deleted file mode 100644 index 5cdf0ed560..0000000000 --- a/source/externals/g4tools/include/tools/Windows/WinTk +++ /dev/null @@ -1,810 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_Windows_WinTk -#define tools_Windows_WinTk - -#include "../Windows/tools" //and not "tools", because this fancy VisualC++ will not find the file! - -#include -#include -#ifdef TOOLS_MEM -#include -#endif - -#include - -namespace tools { -namespace WinTk { - -class Component; - -class CallbackData { -public: - CallbackData():x(0),y(0),wparam(0),lparam(0){} -public: - std::string value; - int x; - int y; - WPARAM wparam; - LPARAM lparam; -}; - -typedef void (*Callback)(Component&,CallbackData&,void*); - -class Component { - typedef std::vector< std::pair > Callbacks; - typedef std::pair NamedCallbacks; -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::WinTk::Component) -#endif -public: - Component(const std::string& aType):fType(aType),fWindow(0),fParent(0){ -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - } - Component(const std::string& aType,Component& aParent):fType(aType),fWindow(0),fParent(&aParent) { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - } - virtual ~Component() { -#ifdef TOOLS_MEM - tools::mem::decrement(s_class().c_str()); -#endif - } -protected: - Component(Component&) { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - } - Component& operator=(Component&) {return *this;} -public: - std::string name() const {return fName;} - void setName(const std::string& aName) {fName = aName;} - - const std::string& type() const {return fType;} - HWND nativeWindow() {return fWindow;} - Component* parent() const {return fParent;} - virtual void show() { - //if(!fWindow) return; - //::ShowWindow(fWindow,SW_SHOWDEFAULT); - } - void hide() { - if(!fWindow) return; - ::ShowWindow(fWindow,SW_HIDE); - } - - virtual bool size(unsigned int& aWidth,unsigned int& aHeight) { - aWidth = 0; - aHeight = 0; - if(!fWindow) return false; - RECT rect; - ::GetClientRect(fWindow,&rect); - aWidth = rect.right-rect.left; - aHeight = rect.bottom-rect.top; - return true; - } - virtual bool position(int& aX,int& aY) { - aX = 0; - aY = 0; - if(!fWindow) return false; - RECT rect; - ::GetClientRect(fWindow,&rect); - aX = rect.left; - aY = rect.top; - return true; - } - Component* findFather(const std::string& aType) { - if(aType==type()) return this; - Component* parent = fParent; - while(parent) { - if(aType==parent->type()) return parent; - parent = parent->fParent; - } - return 0; - } - - bool setBackground(double aR,double aG,double aB){ - if(!fWindow) return false; - - int r = int(aR*255.0); - if((r<0)||(r>255)) return false; - int g = int(aG*255.0); - if((g<0)||(g>255)) return false; - int b = int(aB*255.0); - if((b<0)||(b>255)) return false; - -/* - //COLORREF cr = RGB(r,g,b); - HBRUSH brush = ::CreateSolidBrush(RGB(r,g,b)); - ::printf("debug : WinTk::Component::setBackground : brush %lu\n",brush); - - HBRUSH prev = (HBRUSH)::GetClassLongPtr(fWindow,GCLP_HBRBACKGROUND); - ::printf("debug : WinTk::Component::setBackground : prev brush %lu\n",prev); - - {WNDCLASSEX wc; - ::GetClassInfoEx(::GetModuleHandle(NULL),WC_STATIC,&wc); - ::printf("debug : prev brush xxx %lu\n",wc.hbrBackground);} - - ULONG_PTR stat = - ::SetClassLongPtr(fWindow,GCLP_HBRBACKGROUND,(LONG_PTR)brush); - if(prev && !stat) { - ::printf("debug : WinTk::Component::setBackground : SetClassLongPtr failed.\n"); - return false; - } - - {ULONG_PTR stat = - ::SetClassLongPtr(fWindow,GCLP_HBRBACKGROUND,(LONG_PTR)brush); - ::printf("debug : WinTk::Component::setBackground : SetClassLongPtr failed.yyy %lu.\n",stat);} - - {WNDCLASSEX wc; - ::GetClassInfoEx(::GetModuleHandle(NULL),WC_STATIC,&wc); - ::printf("debug : prev brush yyy %lu\n",wc.hbrBackground);} - - if(!::InvalidateRect(fWindow,NULL,TRUE)) { - ::printf("debug : WinTk::Component::setBackground : InvalidateRect failed.\n"); - return false; - } - - //::DeleteObject(brush); - return true; - */ - return false; - } -public: - void addCallback(const std::string& aName,Callback aFunction,void* aTag) { - NamedCallbacks* cbks = 0; - std::vector::iterator it; - for(it=fCallbacks.begin();it!=fCallbacks.end();++it) { - if(aName==(*it).first) { - cbks = &(*it); - break; - } - } - if(!cbks) { - fCallbacks.push_back(std::pair(aName,Callbacks())); - cbks = &(fCallbacks.back()); - } - cbks->second.push_back(std::pair(aFunction,aTag)); - } - void removeCallback(const std::string& aName,Callback aFunction,void* aTag) { - NamedCallbacks* cbks = 0; - std::vector::iterator it; - for(it=fCallbacks.begin();it!=fCallbacks.end();++it) { - if(aName==(*it).first) { - cbks = &(*it); - break; - } - } - if(cbks) { - Callbacks::iterator it; - for(it=cbks->second.begin();it!=cbks->second.end();++it) { - if( (aFunction==(*it).first) && (aTag==(*it).second) ) { - cbks->second.erase(it); - return; - } - } - } - } - - bool executeCallbacks(const std::string& aName,CallbackData& aData) { - std::vector::const_iterator it; - for(it=fCallbacks.begin();it!=fCallbacks.end();++it) { - if(aName==(*it).first) { - const Callbacks& cbks = (*it).second; - Callbacks::const_iterator it2; - for(it2=cbks.begin();it2!=cbks.end();++it2) { - Callback cbk = (*it2).first; - if(cbk) { - HWND back_fWindow = fWindow; - cbk(*this,aData,(*it2).second); - // The callback may have destroyed the Component and - // the native HWND. The below checks that. - // In a proc, it is better to not use the HWND - // (or the Component) after calling executeCallbacks. - if(back_fWindow && !::GetWindowLongPtr(back_fWindow,GWLP_USERDATA)) { - //::printf("WinTk::Component::executeCallbacks : WARNING : A callback destroyed the native HWND window !\n"); - return false; - } - } - } - return true; - } - } - return false; - } - bool hasCallbacks(const std::string& aName) const { - std::vector::const_iterator it; - for(it=fCallbacks.begin();it!=fCallbacks.end();++it) { - if(aName==(*it).first) return true; - } - return false; - } -protected: - static void wm__destroy(HWND aWindow) { - Component* This = (Component*)::GetWindowLongPtr(aWindow,GWLP_USERDATA); - if(This) { //How to be sure that we have a Component* ??? - if(This->fWindow!=aWindow) { - ::printf("WinTk::Component::wm_destroy : HWND mismatch !\n"); - } - if(This->hasCallbacks("WM_DESTROY")) { - CallbackData data; - This->executeCallbacks("WM_DESTROY",data); - } - This->fWindow = 0; - } - ::SetWindowLongPtr(aWindow,GWLP_USERDATA,LONG_PTR(NULL)); - } -protected: - // WM_PARENTNOTIFY is sent within the CreateWindow of the child. - // When received by the parent, the parent Post (not Send) to itself - // a WM_TK_CHILDCREATED in order to be notify of the child creation - // out of any CreateWindow. -#define WM_TK_CHILDCREATED ((WM_USER)+888) -#define WM_TK_CHILDDELETED ((WM_USER)+889) -#define TK_KEY 127 // To be sure that it is a message of our own. - static LRESULT CALLBACK containerProc(HWND aWindow,UINT aMessage,WPARAM aWParam,LPARAM aLParam) { - ////////////////////////////////////////////////////////////////////////////// - // Some child send notification message to their parent (instead of sending - // the message to themselves !). This procedure is used by containers - // to forward these messages to the child. - //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// - switch(aMessage) { - case WM_PARENTNOTIFY:{ - if(aWParam==WM_CREATE) { - ::PostMessage(aWindow,WM_TK_CHILDCREATED,TK_KEY,0); - return 0; - } else if(aWParam==WM_DESTROY) { - ::PostMessage(aWindow,WM_TK_CHILDDELETED,TK_KEY,0); - return 0; - } - }break; - case WM_TK_CHILDCREATED:{ - if(aWParam==TK_KEY) { - RECT rect; - ::GetClientRect(aWindow,&rect); - LPARAM size = MAKELPARAM(rect.right-rect.left,rect.bottom-rect.top); - ::SendMessage(aWindow,WM_SIZE,(WPARAM)0,size); - return 0; - } - }break; - case WM_TK_CHILDDELETED:{ - if(aWParam==TK_KEY) { - } - }break; - case WM_NOTIFY:{ //Coming from a child (combobox, scrollbar, toolbar). - NMHDR* nmhdr = (NMHDR*)aLParam; - HWND from_win = nmhdr->hwndFrom; - if(from_win!=aWindow) { - ::SendMessage(from_win,aMessage,aWParam,aLParam); - } - }return 0; - case WM_COMMAND: - case WM_VSCROLL: - case WM_HSCROLL:{ - ::SendMessage((HWND)aLParam,aMessage,aWParam,(LPARAM)0); - }return 0; - } - return TRUE; //Not handled. - } -#undef WM_TK_CHILDCREATED -#undef WM_TK_CHILDDELETED -#undef TK_KEY -protected: - void destroy() { - if(hasCallbacks("delete")) { - CallbackData data; - executeCallbacks("delete",data); - } - if(fWindow) { - ::SetWindowLongPtr(fWindow,GWLP_USERDATA,LONG_PTR(NULL)); - ::DestroyWindow(fWindow); - fWindow = 0; - } - } - void rubberDrawLine(POINT& aBegin,POINT& aEnd) { - if(!fWindow) return; - HPEN pen = ::CreatePen(PS_SOLID,5,RGB(0,0,0)); - HDC hdc = ::GetWindowDC(fWindow); - HPEN oldPen = SelectPen(hdc,pen); - int oldROP = ::SetROP2(hdc,R2_NOT); - POINT pt; - ::MoveToEx(hdc,aBegin.x,aBegin.y,&pt); - ::LineTo(hdc,aEnd.x,aEnd.y); - ::SetROP2(hdc,oldROP); - SelectPen(hdc,oldPen); - ::ReleaseDC(fWindow,hdc); - ::DeletePen(pen); - } - void rubberDrawRect(POINT& aBegin,POINT& aEnd) { - if(!fWindow) return; - HPEN pen = ::CreatePen(PS_SOLID,0,RGB(0,0,0)); - HDC hdc = ::GetWindowDC(fWindow); - HPEN oldPen = SelectPen(hdc,pen); - int oldROP = ::SetROP2(hdc,R2_NOT); - POINT pt; - ::MoveToEx(hdc,aBegin.x,aBegin.y,&pt); - ::LineTo(hdc,aBegin.x,aEnd.y); - ::LineTo(hdc,aEnd.x,aEnd.y); - ::LineTo(hdc,aEnd.x,aBegin.y); - ::LineTo(hdc,aBegin.x,aBegin.y); - ::SetROP2(hdc,oldROP); - SelectPen(hdc,oldPen); - ::ReleaseDC(fWindow,hdc); - ::DeletePen(pen); - } -private: - std::string fType; -protected: - HWND fWindow; - Component* fParent; - std::vector fCallbacks; - std::string fName; -}; - -class Shell; -typedef void(*SetFocusCallback)(Shell*,void*); - -class Shell : public Component { -public: - Shell(unsigned int aMask) - :Component("Shell") - ,fFocusWindow(0) - ,fSetFocusCallback(0) - ,fSetFocusTag(0) - ,fAcceleratorTable(0) - { - static char sWindowClassName[] = "WinTk::Shell"; - static bool done = false; - if(!done) { - WNDCLASS wc; - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = (WNDPROC)Shell::proc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = ::GetModuleHandle(NULL); - wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL,IDC_ARROW); - wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); - wc.lpszMenuName = sWindowClassName; - wc.lpszClassName = sWindowClassName; - ::RegisterClass(&wc); - done = true; - } - - fWindow = ::CreateWindow(sWindowClassName, - NULL, - aMask, //WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT,CW_USEDEFAULT, - 400,400, - NULL,NULL, - ::GetModuleHandle(NULL), - NULL); - if(!fWindow) return; - ::SetWindowLongPtr(fWindow,GWLP_USERDATA,LONG_PTR(this)); - } - virtual ~Shell() { - if(fAcceleratorTable) { - ::DestroyAcceleratorTable(fAcceleratorTable); - fAcceleratorTable = 0; - } - destroy(); - } -protected: - Shell(Shell& a_from):Component(a_from) {} - Shell& operator=(Shell&) {return *this;} -public: - virtual void show() { - if(!fWindow) return; - ::SetForegroundWindow(fWindow); - ::ShowWindow(fWindow,SW_SHOWDEFAULT); - ::UpdateWindow(fWindow); - ::DrawMenuBar(fWindow); - } - void setTitle(const std::string& aString) { - if(!fWindow) return; - ::SetWindowText(fWindow,aString.c_str()); - } - void setGeometry(int aX,int aY,unsigned int aWidth,unsigned int aHeight) { - ////////////////////////////////////////////////////////////////////////////// - // Given width, height is the desired client area. - //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// - if(!fWindow) return; - int hborder = ::GetSystemMetrics(SM_CYCAPTION); - if(::GetWindowLongPtr(fWindow,GWLP_ID)) // Has a menubar. - hborder += ::GetSystemMetrics(SM_CYMENU); - ::MoveWindow(fWindow,aX,aY,aWidth,hborder + aHeight,TRUE); - } - void setSize(unsigned int aWidth,unsigned int aHeight) { - ////////////////////////////////////////////////////////////////////////////// - // Given width, height is the desired client area. - //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// - if(!fWindow) return; - int hborder = ::GetSystemMetrics(SM_CYCAPTION); - RECT rect; - ::GetWindowRect(fWindow,&rect); - ::MoveWindow(fWindow,rect.left,rect.top,aWidth,hborder + aHeight,TRUE); - } - void setFocusWindow(HWND aWindow) {fFocusWindow = aWindow;} - HWND focusWindow() {return fFocusWindow;} - - void setSetFocusCallback(SetFocusCallback aCallback,void* aTag) { - fSetFocusCallback = aCallback; - fSetFocusTag = aTag; - } - void callSetFocusCallback() { - if(!fSetFocusCallback) return; - fSetFocusCallback(this,fSetFocusTag); - } - HACCEL nativeAcceleratorTable() {return fAcceleratorTable;} - - bool addAccelerator(const std::string& aString,int aID) { - //printf("debug : accel : %s %d\n",aString.c_str(),aID); - // aString should be of the form : "a" or "Ctrl+a". - ACCEL acc; - //acc.fVirt : FALT, FCONTROL, FNOINVERT, FSHIFT, FVIRTKEY - {acc.cmd = aID; - std::vector words; - std::string s(aString); - tools::touppercase(s); - tools::words(s,"+",false,words); - if(words.size()==1) { - acc.fVirt = FVIRTKEY; - if(!string_to_VK(words[0],acc.key)) return false; - } else if((words.size()==2)&&(words[1].size())) { - if(words[0]=="CTRL") { - acc.fVirt = FCONTROL; - } else if(words[0]=="ALT") { - acc.fVirt = FALT; - } else if(words[0]=="SHIFT") { - acc.fVirt = FSHIFT; - } else { - return false; - } - acc.fVirt |= FVIRTKEY; - if(!string_to_VK(words[1],acc.key)) return false; - } else { - return false; - }} - - if(!fAcceleratorTable) { - fAcceleratorTable = ::CreateAcceleratorTable(&acc,1); - } else { - int n = ::CopyAcceleratorTable(fAcceleratorTable,NULL,0); - ACCEL* tbl = new ACCEL[n+1]; - ::CopyAcceleratorTable(fAcceleratorTable,tbl,n); - ACCEL& tacc = tbl[n]; - tacc.fVirt = acc.fVirt; - tacc.key = acc.key; - tacc.cmd = acc.cmd; - ::DestroyAcceleratorTable(fAcceleratorTable); - fAcceleratorTable = ::CreateAcceleratorTable(tbl,n+1); - delete [] tbl; - } - - return true; - } -private: - - static bool string_to_VK(const std::string& aString,WORD& a_VK) { - //VK_xxx are defined in WinUser.h - if(aString.size()==1) { a_VK = aString[0];return true;} //WM_W is 'W' - -#define S_VK(aWhat) \ - if(!::strcmp(aString.c_str(),#aWhat)) { a_VK = VK_##aWhat;return true;} - - S_VK(BACK) - S_VK(TAB) - S_VK(CLEAR) - S_VK(RETURN) - S_VK(ESCAPE) - S_VK(SPACE) - - S_VK(UP) - S_VK(DOWN) - S_VK(LEFT) - S_VK(RIGHT) - - S_VK(F1) - S_VK(F2) - S_VK(F3) - S_VK(F4) - S_VK(F5) - S_VK(F6) - S_VK(F7) - S_VK(F8) - S_VK(F9) - S_VK(F10) - S_VK(F11) - S_VK(F12) - S_VK(F13) - S_VK(F14) - S_VK(F15) - S_VK(F16) - S_VK(F17) - S_VK(F18) - S_VK(F19) - S_VK(F20) - S_VK(F21) - S_VK(F22) - S_VK(F23) - S_VK(F24) - - //FIXME : handle other keys ? NUMPAD[0-9] - -#undef S_VK - - return false; - } - - static LRESULT CALLBACK proc(HWND aWindow,UINT aMessage,WPARAM aWParam,LPARAM aLParam) { - switch (aMessage) { - // Same logic as containerProc : - case WM_NOTIFY:{ //Coming from a child (combobox, scrollbar, toolbar). - NMHDR* nmhdr = (NMHDR*)aLParam; - HWND from_win = nmhdr->hwndFrom; - if(from_win!=aWindow) { - ::SendMessage(from_win,aMessage,aWParam,aLParam); - } - }return 0; - // Else : - case WM_SIZE:{ // Assume one child window ! FIXME : have a message if not. - int width = LOWORD(aLParam); - int height = HIWORD(aLParam); - HWND hwnd = GetFirstChild(aWindow); - if(hwnd) { - //FIXME : have to treat the case of TOOLBAR not being the first. - if(GetClassName(hwnd)==std::string(TOOLBARCLASSNAME)) { - HWND next = GetNextSibling(hwnd); - // Share area between toolbar and second child : - RECT rect; - ::GetWindowRect(hwnd,&rect); - int htb = rect.bottom-rect.top; - SetGeometry(next,0,htb,width,height-htb); - } else { - SetGeometry(hwnd,0,0,width,height); - } - } - }return 0; - case WM_SETFOCUS:{ - Shell* This = (Shell*)::GetWindowLongPtr(aWindow,GWLP_USERDATA); - if(This) { - This->callSetFocusCallback(); - HWND win = This->focusWindow(); - if(win) ::SetFocus(win); - } - }return 0; - case WM_INITMENUPOPUP:{ //0x0117 - //aWParam is the HMENU (from CreatePopupMenu) - //aLParam is the MenuItemCount - Shell* This = (Shell*)::GetWindowLongPtr(aWindow,GWLP_USERDATA); - if(This) { - CallbackData data; - data.wparam = aWParam; - This->executeCallbacks("cascading",data); - } - } return 0; - case WM_COMMAND:{ //Coming from a menu item, a toolbar ! - if(aLParam) { - // From a toolbar ; send it back to it : - ::SendMessage((HWND)aLParam,aMessage,aWParam,0); - } else { - //if(HIWORD(aWParam)==1) { //From an accelerator. - //} - // From a menu item : - Shell* This = (Shell*)::GetWindowLongPtr(aWindow,GWLP_USERDATA); - if(This) { - CallbackData data; - data.wparam = LOWORD(aWParam); - This->executeCallbacks("activate",data); - } - } - }return 0; - case WM_CLOSE:{ - Shell* This = (Shell*)::GetWindowLongPtr(aWindow,GWLP_USERDATA); - if(This) { - if(This->hasCallbacks("close")) { - CallbackData data; - This->executeCallbacks("close",data); - } - } - }break; //NOTE : can't be return 0. - case WM_DESTROY:wm__destroy(aWindow);return 0; - } - return (DefWindowProc(aWindow,aMessage,aWParam,aLParam)); - } -private: - HWND fFocusWindow; - SetFocusCallback fSetFocusCallback; - void* fSetFocusTag; - HACCEL fAcceleratorTable; -}; - -class OpenGLArea : public Component { -public: - OpenGLArea(Component& aParent) - :Component("OpenGLArea",aParent) - ,fContext(0) - ,fHDC(0) - { - if(!fParent || !fParent->nativeWindow()) return; - HWND parent = fParent->nativeWindow(); - - static char sOpenGLAreaClassName[] = "WinTk::OpenGLArea"; - static bool done = false; - if(!done) { - WNDCLASS wc; - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = (WNDPROC)OpenGLArea::proc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = GetWindowInstance(parent), - wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL,IDC_ARROW); - wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); - wc.lpszMenuName = sOpenGLAreaClassName; - wc.lpszClassName = sOpenGLAreaClassName; - ::RegisterClass(&wc); - done = true; - } - - // The WS_BORDER is needed. Else probleme of size at startup. - RECT rect; - ::GetClientRect(parent,&rect); - fWindow = ::CreateWindow(sOpenGLAreaClassName, - NULL, - WS_CHILD | WS_VISIBLE, - 0,0, - rect.right-rect.left, - rect.bottom-rect.top, - parent,NULL, - GetWindowInstance(parent), - NULL); - if(!fWindow) return; - ::SetWindowLongPtr(fWindow,GWLP_USERDATA,LONG_PTR(this)); - - // initialize OpenGL rendering : - fHDC = ::GetDC(fWindow); - if( fHDC && SetWindowPixelFormat(fHDC) ) { - fContext = ::wglCreateContext(fHDC); - } - } - virtual ~OpenGLArea() { - if(wglGetCurrentContext()!=NULL) wglMakeCurrent(NULL,NULL); - if(fContext) { - wglDeleteContext(fContext); - fContext = 0; - } - destroy(); - } -protected: - OpenGLArea(OpenGLArea& a_from):Component(a_from) {} - OpenGLArea& operator=(OpenGLArea&) {return *this;} -public: - bool write_gl2ps(const std::string&,const std::string&); -private: - static LRESULT CALLBACK proc(HWND aWindow,UINT aMessage,WPARAM aWParam,LPARAM aLParam) { - switch (aMessage) { - case WM_PAINT:{ - PAINTSTRUCT ps; - HDC hDC = BeginPaint(aWindow,&ps); - OpenGLArea* This = (OpenGLArea*)::GetWindowLongPtr(aWindow,GWLP_USERDATA); - if(This) { - HDC hdc = This->fHDC; - HGLRC context = This->fContext; - if(hdc && context) { - ::wglMakeCurrent(hdc,context); - // User OpenGL paint code : - - CallbackData data; - data.wparam = aWParam; - data.lparam = aLParam; - This->executeCallbacks("paint",data); - - ::SwapBuffers(hdc); - } - } - EndPaint(aWindow,&ps); - }return 0; - case WM_LBUTTONDOWN:{ - OpenGLArea* This = (OpenGLArea*)::GetWindowLongPtr(aWindow,GWLP_USERDATA); - if(This) { - CallbackData data; - data.wparam = aWParam; - data.lparam = aLParam; - data.value = "ButtonPress"; - data.x = LOWORD(aLParam); - data.y = HIWORD(aLParam); - This->executeCallbacks("event",data); - } - }return 0; - case WM_LBUTTONUP:{ - OpenGLArea* This = (OpenGLArea*)::GetWindowLongPtr(aWindow,GWLP_USERDATA); - if(This) { - CallbackData data; - data.wparam = aWParam; - data.lparam = aLParam; - data.value = "ButtonRelease"; - data.x = LOWORD(aLParam); - data.y = HIWORD(aLParam); - This->executeCallbacks("event",data); - } - } return 0; - case WM_MOUSEMOVE:{ - unsigned int state = aWParam; - if((state & MK_LBUTTON)==MK_LBUTTON) { - OpenGLArea* This = (OpenGLArea*)::GetWindowLongPtr(aWindow,GWLP_USERDATA); - if(This) { - CallbackData data; - data.wparam = aWParam; - data.lparam = aLParam; - data.value = "MotionNotify"; - data.x = LOWORD(aLParam); - data.y = HIWORD(aLParam); - This->executeCallbacks("event",data); - } - } - }return 0; - case WM_DESTROY:wm__destroy(aWindow);return 0; - } - return (DefWindowProc(aWindow,aMessage,aWParam,aLParam)); - } - static bool SetWindowPixelFormat(HDC aHdc) { - PIXELFORMATDESCRIPTOR pfd; - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; - pfd.dwFlags = - PFD_DRAW_TO_WINDOW | - PFD_SUPPORT_OPENGL | - PFD_DOUBLEBUFFER | - PFD_STEREO_DONTCARE; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = 32; - pfd.cRedBits = 8; - pfd.cRedShift = 16; - pfd.cGreenBits = 8; - pfd.cGreenShift = 8; - pfd.cBlueBits = 8; - pfd.cBlueShift = 0; - pfd.cAlphaBits = 0; - pfd.cAlphaShift = 0; - pfd.cAccumBits = 64; - pfd.cAccumRedBits = 16; - pfd.cAccumGreenBits = 16; - pfd.cAccumBlueBits = 16; - pfd.cAccumAlphaBits = 0; - pfd.cDepthBits = 32; - pfd.cStencilBits = 8; - pfd.cAuxBuffers = 0; - pfd.iLayerType = PFD_MAIN_PLANE; - pfd.bReserved = 0; - pfd.dwLayerMask = 0; - pfd.dwVisibleMask = 0; - pfd.dwDamageMask = 0; - - int pixelIndex = ::ChoosePixelFormat(aHdc,&pfd); - if (pixelIndex==0) { - // Let's choose a default index. - pixelIndex = 1; - if (::DescribePixelFormat(aHdc, - pixelIndex, - sizeof(PIXELFORMATDESCRIPTOR), - &pfd)==0) { - return false; - } - } - - if (::SetPixelFormat(aHdc,pixelIndex,&pfd)==FALSE) return false; - return true; - } -private: - HGLRC fContext; - HDC fHDC; -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/Windows/tools b/source/externals/g4tools/include/tools/Windows/tools deleted file mode 100644 index 4d2db3673c..0000000000 --- a/source/externals/g4tools/include/tools/Windows/tools +++ /dev/null @@ -1,601 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_Windows_tools -#define tools_Windows_tools - -#include -#include - -#include - -namespace tools { -namespace WinTk { - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -inline bool GetClassName(HWND aWindow,std::string& a_value) { - if(!aWindow) {a_value.clear();return false;} - char className[256]; - ::GetClassName(aWindow,className,128); - a_value = std::string(className); - return true; -} - -inline HWND GetChildByClassName(HWND aWindow,const std::string& aClassName) { - // A CBS_SIMPLE has two children of class ComboLBox and Edit. - // At creation, a CBS_DROPDOWN has one child of class Edit. - if(!aWindow) return NULL; - HWND child = GetFirstChild(aWindow); - std::string ss; - while(child) { - GetClassName(child,ss); - if(ss==aClassName) return child; - child = GetNextSibling(child); - } - return NULL; -} - -inline void SetGeometry(HWND aWindow,int aX,int aY,unsigned int aWidth,unsigned int aHeight) { - if(!aWindow) return; - std::string className; - GetClassName(aWindow,className); - if(className=="ComboBox") { - // For a Combo the height is the visible part + the height of the list ! - // (A combo may have no edit control). - ::MoveWindow(aWindow,aX,aY,aWidth,200,TRUE); - } else { - ::MoveWindow(aWindow,aX,aY,aWidth,aHeight,TRUE); - } -} - -inline void GetSize(HWND aWindow,int& aWidth,int& aHeight) { - RECT rect; - ::GetWindowRect(aWindow,&rect); - aWidth = rect.right-rect.left; - aHeight = rect.bottom-rect.top; -} - -inline unsigned int GetNumberOfChildren(HWND aWindow) { - unsigned int number = 0; - HWND child = GetFirstChild(aWindow); - while(child) { - number++; - child = GetNextSibling(child); - } - return number; -} - -inline HWND GetLastChild(HWND aWindow) { - HWND child = GetFirstChild(aWindow); - while(child) { - HWND next = GetNextSibling(child); - if(!next) return child; - child = next; - } - return 0; -} - -inline void GetText(HWND aWindow,std::string& a_value) { - int l = ::GetWindowTextLength(aWindow); - a_value.resize(l); - ::GetWindowText(aWindow,(char*)a_value.c_str(),l+1); -} - -/* -inline void PrintChildren(HWND aWindow) { - // A CBS_SIMPLE has two children of class ComboLBox and Edit. - // At creation, a CBS_DROPDOWN has one child of class Edit. - if(!aWindow) return; - HWND child = GetFirstChild(aWindow); - while(child) { - //printf("debug : window : %ld, child : %ld class \"%s\"\n", - // aWindow,child,ClassName(child).c_str()); - child = GetNextSibling(child); - } -} -*/ - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -inline bool IsStyle(HWND aWindow,LONG aStyle) { - LONG_PTR style = ::GetWindowLongPtr(aWindow,GWL_STYLE); - return ( ((style & aStyle ) == aStyle) ? true : false); -} - -inline void ChangeStyle(HWND aWindow,LONG aStyle,bool aValue) { - LONG_PTR style = ::GetWindowLongPtr(aWindow,GWL_STYLE); - if(aValue) { //Enable style. - style = style | aStyle; - } else { //Disbale style. - style = style & ~aStyle; - } - ::SetWindowLongPtr(aWindow,GWL_STYLE,style); -} - -inline bool IsShell(HWND aWindow) { - if(IsStyle(aWindow,WS_OVERLAPPEDWINDOW)) return true; - if(IsStyle(aWindow,WS_POPUP)) return true; - return false; -} - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -inline HWND GetShell(HWND aWindow) { - HWND window = aWindow; - if(IsShell(window)) return window; - while(true) { - HWND parent = GetParent(window); - if(!parent) return window; - if(IsShell(parent)) return parent; - window = parent; - } - return 0; -} - -inline bool Show(HWND aWindow) { - HWND shell = GetShell(aWindow); - if(!shell) return false; - ::SetForegroundWindow(shell); - ::ShowWindow(shell,SW_SHOWDEFAULT); - ::UpdateWindow(shell); - ::DrawMenuBar(shell); - return true; -} - -inline bool Hide(HWND aWindow) { - HWND shell = GetShell(aWindow); - if(!shell) return false; - ::ShowWindow(shell,SW_HIDE); - return true; -} - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -inline bool IsTabStop(HWND aWindow) { - LONG_PTR style = ::GetWindowLongPtr(aWindow,GWL_STYLE); - return ((style & WS_TABSTOP ) == WS_TABSTOP ? true : false); -} - -inline HWND GetTabStopInTree(HWND aWindow,bool aForward) { - if(IsTabStop(aWindow)) return aWindow; - HWND child = aForward ? GetFirstChild(aWindow) : GetLastChild(aWindow); - while(child) { - HWND tabStop = GetTabStopInTree(child,aForward); - if(tabStop) return tabStop; - child = aForward ? GetNextSibling(child) : GetPrevSibling(child); - } - return NULL; -} - -inline HWND GetTabStopInSibling(HWND aWindow,bool aForward) { - if(!aWindow) return NULL; - HWND child = aForward ? GetNextSibling(aWindow) : GetPrevSibling(aWindow); - while(child) { - HWND tabStop = GetTabStopInTree(child,aForward); - if(tabStop) return tabStop; - child = aForward ? GetNextSibling(child) : GetPrevSibling(child); - } - return NULL; -} - -inline HWND GetTabStop(HWND aDialog,HWND aWindow,bool aForward = true) { - if(!aWindow) return NULL; - HWND window = aWindow; - while(window && (window!=aDialog) ) { - HWND tabStop = GetTabStopInSibling(window,aForward); - if(tabStop) return tabStop; - window = GetParent(window); - } - return GetTabStopInTree(aDialog,aForward); -} - -inline HBITMAP CreateDIB(HDC aDC,int aWidth,int aHeight,int aBPP /*16||24||32*/,void** aBits) { - if((aBPP!=24) && (aBPP!=32)) return 0; - - BITMAPINFO format; - BITMAPINFOHEADER* header = (BITMAPINFOHEADER*)&format; - header->biSize = sizeof(BITMAPINFOHEADER); - header->biWidth = aWidth; - header->biHeight = -aHeight; - header->biPlanes = 1; - header->biBitCount = aBPP; - header->biCompression = BI_RGB; - header->biSizeImage = 0; - header->biXPelsPerMeter = 0; - header->biYPelsPerMeter = 0; - header->biClrUsed = 0; - header->biClrImportant = 0; - - UINT flag = DIB_RGB_COLORS; - HBITMAP bitmap = ::CreateDIBSection(aDC,&format,flag,(void**)aBits,NULL,0); - - if(!(*aBits)) return 0; - - return bitmap; -} - -}} - -#include - -namespace tools { -namespace WinTk { - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -inline bool TreeGetItemLabel(HWND aWindow,HTREEITEM aItem,std::string& a_value) { - TCHAR text[256]; - TV_ITEM item; - item.hItem = aItem; - item.mask = TVIF_TEXT; - item.pszText = text; - item.cchTextMax = 256; - if(!TreeView_GetItem(aWindow,&item)) {a_value.clear();return false;} - a_value = std::string(text); - return true; -} - -inline bool TreeIsItemBranch(HWND aWindow,HTREEITEM aItem) { - TV_ITEM item; - item.hItem = aItem; - item.mask = TVIF_CHILDREN; - if(!TreeView_GetItem(aWindow,&item)) return 0; - return item.cChildren?true:false; -} - -inline bool TreeIsItemExpanded(HWND aWindow,HTREEITEM aItem) { - TV_ITEM item; - item.hItem = aItem; - item.mask = TVIS_EXPANDED; - if(!TreeView_GetItem(aWindow,&item)) return 0; - return ((item.state & TVIS_EXPANDED)== TVIS_EXPANDED) ? true : false; -} - -inline void TreeGetItemPath(HWND aWindow,HTREEITEM aItem,std::string& a_value) { - HTREEITEM item = aItem; - a_value.clear(); - std::string ss; - while(item && (item!=TVI_ROOT)) { - TreeGetItemLabel(aWindow,item,ss); - std::string opath = a_value; - a_value = "\n"; - a_value += ss; - a_value += opath; - item = TreeView_GetParent(aWindow,item); - } - // Remove the leading \n - if(a_value.size()) a_value = a_value.substr(1,a_value.size()-1); -} - -inline void TreeGetItemXML(HWND aWindow,HTREEITEM aItem,std::string& a_value) { - //return a XML string representing this tree - std::string spaceItem = ""; - std::string spaceRoot = ""; - std::string ss; - a_value.clear(); - do { - a_value += spaceRoot + ""; - a_value += spaceItem + ""; - a_value += spaceItem + ""; - if (TreeIsItemExpanded(aWindow,aItem)) a_value.append("true"); - else a_value.append("false"); - a_value += ""; - if (TreeView_GetChild(aWindow,aItem)) { - TreeGetItemXML(aWindow,TreeView_GetChild(aWindow,aItem),ss); - a_value += ss; - } - a_value += spaceRoot + ""; - aItem = TreeView_GetNextSibling(aWindow,aItem); - } - while (aItem); -} - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -inline int smanip_axtoi(const std::string& a_string) { - // convert from ASCII hex to int - // Exa : "FF" -> 256. - int x = 0; - size_t n = a_string.size(); - // convert n nibbles - for (size_t i = 0; i < n; i++) { - char c = a_string[i]; - // numbers 0 - 9 - if ((c > 0x2F) && (c < 0x3A)) - x += ((c - 0x30) << ((n - i - 1) * 4)); - - // capital letters A - F - if ((c > 0x40) && (c < 0x47)) - x += ((c - 0x41 + 0x0A) << ((n - i - 1) * 4)); - - // lower case letters a - f - if ((c > 0x60) && (c < 0x67)) - x += ((c - 0x61 + 0x0A) << ((n - i - 1) * 4)); - } - return x; -} - -}} - -#include - -namespace tools { -namespace WinTk { - -inline HBITMAP ConvertXpmToDIB(HDC aDC,const std::vector& aXPM,int& aWidth,int& aHeight) { - // Convert from xpm to DIB (demands hex colors). - // From CoinWin/widgets/SoWinBitmapButton.cpp. - aWidth = 0; - aHeight = 0; - if(!aXPM.size()) return 0; - - std::vector vals; - tools::values(aXPM[0]," ",false,vals); - if(vals.size()!=4) return 0; - int width = vals[0]; - int height = vals[1]; - int numcol = vals[2]; - int numchars = vals[3]; - if(width<=0) return 0; - if(height<=0) return 0; - if(numcol<=0) return 0; - if(numchars<=0) return 0; - - // Check consistency : - if((height+numcol)!=aXPM.size()-1) return 0; - - size_t lcolor = 0; - int i; - for (i = 0; i < numcol; i++) { - std::string::size_type pos = aXPM[i+1].rfind("c #"); - if(pos==std::string::npos) continue; // May be "c None" - lcolor = aXPM[i+1].size()-(pos+3); - break; - } - //printf("debug : xpm : numcol %d (%d)\n",numcol,lcolor); - - if( (lcolor!=6) && (lcolor!=12) ) return 0; - - // create color lookup table - char* charlookuptable = new char[numcol * numchars]; - //long* colorlookuptable = new long[numcol]; - int* rlookuptable = new int[numcol]; - int* glookuptable = new int[numcol]; - int* blookuptable = new int[numcol]; - - bool done = true; - // get colors - for (i = 0; i < numcol; i++) { - - const std::string& line = aXPM[i+1]; - - // Check consistency : - if((int)line.size()>16; - g = (noneColor & 0x0000FF00)>>8; - b = noneColor & 0x000000FF; - } else { - r = rlookuptable[k]; - g = glookuptable[k]; - b = blookuptable[k]; - } - - if(pixelsize==4) { - ((unsigned char*)dest)[y + x + 0] = b; - ((unsigned char*)dest)[y + x + 1] = g; - ((unsigned char*)dest)[y + x + 2] = r; - ((unsigned char*)dest)[y + x + 3] = 0; - } else { - ((unsigned char*)dest)[y + x + 0] = b; - ((unsigned char*)dest)[y + x + 1] = g; - ((unsigned char*)dest)[y + x + 2] = r; - } - - // next pixel - break; - - } - - } - - } - - } - if(!done) { - //printf("debug : xpm : can'tread pixels.\n"); - ::DeleteObject(hbmp); - hbmp = 0; - } - } - - // cleanup - delete [] charlookuptable; - delete [] rlookuptable; - delete [] glookuptable; - delete [] blookuptable; - - if(hbmp) { - aWidth = width; - aHeight = height; - } - - return hbmp; -} - -}} - -#include - -namespace tools { -namespace WinTk { - -inline HBITMAP Read_Xpm(HDC aDC,const std::string& aFileName,int& aWidth,int& aHeight) { - aWidth = 0; - aHeight = 0; - std::vector text; - //std::string name; - //tools::file_name(aFileName,name); - if(!tools::file::read(aFileName,text)) return 0; - - std::vector xpm; - - {for(size_t index=0;index - -namespace tools { -namespace WinTk { - -inline HBITMAP ReadXpm(HDC aDC,const std::string& aFileName,int& aWidth,int& aHeight) { - std::string name; - tools::file_name(aFileName,name); - return Read_Xpm(aDC,name,aWidth,aHeight); -} - -}} - -#endif - diff --git a/source/externals/g4tools/include/tools/Xt/OpenGLArea.c b/source/externals/g4tools/include/tools/Xt/OpenGLArea.c deleted file mode 100644 index 3ec799e288..0000000000 --- a/source/externals/g4tools/include/tools/Xt/OpenGLArea.c +++ /dev/null @@ -1,531 +0,0 @@ -/* -#define DEBUG -*/ - -/*this*/ -#include "OpenGLAreaP.h" - -#include - -#include - -#include -#include - -#ifdef __cplusplus -extern "C"{ -#endif -static void InitializeClass(void); -static void InitializeWidget(Widget, Widget,ArgList,Cardinal*); -static void RealizeWidget(Widget, XtValueMask*, XSetWindowAttributes*); -static void DestroyWidget(Widget); -static void ChangeWidgetSize(Widget); -static void DrawWidget(Widget, XEvent*, Region); -static Boolean SetValues(Widget,Widget,Widget,ArgList,Cardinal *); - -static void EventHandler(Widget,XtPointer,XEvent*,Boolean*); -static int MakeCurrent(Widget); -static void XWidgetInstallColormap(Widget); -static void XWidgetUninstallColormap(Widget); -static Widget XWidgetGetShell(Widget); -#ifdef __cplusplus -} -#endif - -#define athis ((OpenGLAreaWidget)This)->openGLArea -#define acur ((OpenGLAreaWidget)a_current)->openGLArea -#define CWarn printf -#define CWarnF printf - -static XtResource resources [] = { - {XoNdoubleBufferOn,"DoubleBufferOn",XtRBoolean,sizeof(Boolean), - XtOffset(OpenGLAreaWidget,openGLArea.doubleBufferOn),XtRImmediate,(XtPointer)True}, - {XoNpaintCallback,XtCCallback,XtRCallback,sizeof(XtCallbackList), - XtOffset(OpenGLAreaWidget,openGLArea.paintCallback),XtRImmediate,(XtPointer)NULL}, - {XoNeventCallback,XtCCallback,XtRCallback,sizeof(XtCallbackList), - XtOffset(OpenGLAreaWidget,openGLArea.eventCallback),XtRImmediate,(XtPointer)NULL} -}; - -OpenGLAreaClassRec openGLAreaClassRec = { -/* Core Class Part */ -{ - (WidgetClass) &compositeClassRec, /* pointer to superclass ClassRec */ - "OpenGLArea", /* widget resource class name */ - sizeof(OpenGLAreaRec), /* size in bytes of widget record */ - InitializeClass, /* class_initialize */ - NULL, /* dynamic initialization */ - FALSE, /* has class been initialized? */ - InitializeWidget, /* initialize */ - NULL, /* notify that initialize called */ - RealizeWidget, /* XCreateWindow for widget */ - NULL, /* widget semantics name to proc mapWidget*/ - 0, /* number of entries in actions */ - resources, /* resources for subclass fields */ - XtNumber(resources), /* number of entries in resources */ - NULLQUARK, /* resource class quarkified */ - TRUE, /* compress MotionNotify for widget */ - TRUE, /* compress Expose events for widget*/ - TRUE, /* compress enter and leave events */ - TRUE, /* select for VisibilityNotify */ - DestroyWidget, /* free data for subclass pointers */ - ChangeWidgetSize, /* geom manager changed widget size */ - DrawWidget, /* rediplay window */ - SetValues, /* set subclass resource values */ - NULL, /* notify that SetValues called */ - XtInheritSetValuesAlmost, /* SetValues got "Almost" geo reply*/ - NULL, /* notify that get_values called */ - XtInheritAcceptFocus, /* assign input focus to widget */ - XtVersion, /* version of intrinsics used */ - NULL, /* list of callback offsets */ - XtInheritTranslations, /* translations */ - XtInheritQueryGeometry, /* return preferred geometry */ - XtInheritDisplayAccelerator, /* display your accelerator */ - NULL /* pointer to extension record */ -}, -/* Composite Class Part */ -{ - XtInheritGeometryManager, /* geometry manager for children */ - XtInheritChangeManaged, /* change managed state of child */ - XtInheritInsertChild, /* physically add child to parent */ - XtInheritDeleteChild, /* physically remove child */ - NULL /* pointer to extension record */ -}, -/* OpenGLArea */ -{ - NULL -} - -}; - -WidgetClass openGLAreaWidgetClass = (WidgetClass) &openGLAreaClassRec; - -static void InitializeClass(void) {} - -static void InitializeWidget(Widget a_request,Widget This,ArgList a_args,Cardinal* a_argn) { - if(a_request->core.width<=0) This->core.width = 100; - if(a_request->core.height<=0) This->core.height = 100; - -#ifdef DEBUG - printf ("debug : OpenGLArea : InitializeWidget : %s\n",XtName(This)); -#endif - - athis.visual = CopyFromParent; - athis.installColormap = False; - athis.glContext = NULL; - - {Display* display; - Screen* screen; - int iscreen; - XVisualInfo* vinfo; - display = XtDisplay(This); - screen = XtScreen(This); - iscreen = XScreenNumberOfScreen(screen); - - {int error,event; - if(glXQueryExtension(display,&error,&event)==0) { - CWarn ("X server does not have OpenGL extensions.\n"); - }} - - if(athis.doubleBufferOn==True) { - int atbs[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_ALPHA_SIZE, 1, - GLX_DEPTH_SIZE, 1, - GLX_DOUBLEBUFFER, - None - }; - vinfo = glXChooseVisual (display,iscreen,atbs); - if(vinfo==NULL) { /*GLX_ALPHA_SIZE : problem with Xming. Try without it.*/ - int atbs[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DEPTH_SIZE, 1, - GLX_DOUBLEBUFFER, - None - }; - vinfo = glXChooseVisual (display,iscreen,atbs); - } - } else { - int atbs[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_ALPHA_SIZE, 1, - GLX_DEPTH_SIZE, 1, - None - }; - vinfo = glXChooseVisual (display,iscreen,atbs); - if(vinfo==NULL) { /*GLX_ALPHA_SIZE : problem with Xming. Try without it.*/ - int atbs[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DEPTH_SIZE, 1, - None - }; - vinfo = glXChooseVisual (display,iscreen,atbs); - } - } - - if(vinfo==NULL) { - CWarn ("Can't choose a visual.\n"); - } else { - This->core.depth = vinfo->depth; - athis.visual = vinfo->visual; - if( (vinfo->depth ==DefaultDepth (display,iscreen)) && - (vinfo->visual==DefaultVisual(display,iscreen)) ) { - This->core.colormap = XDefaultColormap (display,iscreen); - athis.installColormap = False; - } else { - This->core.colormap = - XCreateColormap (display,XRootWindow(display,iscreen),vinfo->visual, AllocNone); - athis.installColormap = True; - } - if(This->core.colormap==0L) { - CWarn ("Can't get/create a X colormap.\n"); - } - athis.glContext = glXCreateContext (display,vinfo,NULL,GL_FALSE); - if(athis.glContext==NULL) { - CWarn ("Can't create a GLX context.\n"); - } - XFree(vinfo); - }} - - XtAddEventHandler(This,ButtonPressMask|ButtonReleaseMask|ButtonMotionMask,0,EventHandler,NULL); - -#ifdef DEBUG - printf("debug : OpenGLArea : InitializeWidget : end\n"); -#endif - - /*avoid C++ warnings*/ - a_request = NULL; - a_args = NULL; - a_argn = 0; -} - -static void RealizeWidget(Widget This,XtValueMask* a_mask,XSetWindowAttributes* a_watbs) { -#ifdef DEBUG - printf("debug : OpenGLArea : RealizeWidget : %s\n",XtName(This)); -#endif - - /*Have to create window ourselves due to OpenGL that compells it's visual.*/ - /*In principle colormap is correctly set in a_watbs.*/ - - XtCreateWindow(This,(unsigned int)InputOutput,athis.visual,*a_mask,a_watbs); - - /* Call the Realize procedure (XtInheritRealize) */ - if(openGLAreaWidgetClass->core_class.superclass->core_class.realize!=NULL) - (openGLAreaWidgetClass->core_class.superclass->core_class.realize)(This, a_mask, a_watbs); - - /*If window is delete, all seems ok.*/ - if(athis.installColormap==True) XWidgetInstallColormap(This); - - /*MakeCurrent(This);*/ - -#ifdef DEBUG - printf("debug : OpenGLArea : RealizeWidget : end\n"); -#endif -} - -static void DestroyWidget(Widget This) { - if(athis.installColormap==True) { - XWidgetUninstallColormap (This); - athis.installColormap = False; - XFreeColormap(XtDisplay(This),This->core.colormap); - } - if(athis.glContext!=NULL) { - glXMakeCurrent(XtDisplay(This),None,NULL); - glXDestroyContext(XtDisplay(This),athis.glContext); - athis.glContext = NULL; - } -} - -#define IFMOD(a_field) if(athis.a_field != acur.a_field) -static Boolean SetValues(Widget a_current,Widget a_request,Widget This,ArgList a_args,Cardinal* a_argn) { - IFMOD(doubleBufferOn) { - /* Can't change buffering here if X window is created. - With OpenGL, buffering fix parameter of the X window. - Buffering must be choosen before the execution of the - Realize method that create the window. */ - if(XtIsRealized(This) && (athis.installColormap==True)) { - CWarn("Can't change buffering after \"realization\" of the widget.\n"); - athis.doubleBufferOn = acur.doubleBufferOn; - } - } - /*avoid C++ warnings*/ - a_request = NULL; - a_args = NULL; - a_argn = 0; - return False; -} - -static void ChangeWidgetSize(Widget This) { -#ifdef DEBUG - printf("debug : OpenGLArea : ChangeWidgetSize : %s\n",XtName(This)); -#endif - - /* Call the Resize procedure (XtInheritResize) */ - if(openGLAreaWidgetClass->core_class.superclass->core_class.resize!=NULL) - (openGLAreaWidgetClass->core_class.superclass->core_class.resize)(This); - -#ifdef DEBUG - printf("debug : OpenGLArea : ChangeWidgetSize : end\n"); -#endif -} - -static void DrawWidget(Widget This,XEvent* a_event,Region a_region) { -#ifdef DEBUG - printf("debug : OpenGLArea : DrawWidget : %s\n",XtName(This)); -#endif - - if(openGLAreaWidgetClass->core_class.superclass->core_class.expose!=NULL) - (openGLAreaWidgetClass->core_class.superclass->core_class.expose)(This,a_event,a_region); - - if(MakeCurrent(This)==1) { -#ifdef DEBUG - printf("debug : OpenGLArea : DrawWidget : %s : MakeCurrent ok : call paintCallback...\n",XtName(This)); -#endif - XoAnyCallbackStruct value; - value.reason = XoCR_PAINT; - value.event = a_event; - XtCallCallbacks(This,XoNpaintCallback,(XtPointer)&value); - glXSwapBuffers(XtDisplay(This),XtWindow(This)); - glXMakeCurrent(XtDisplay(This),None,NULL); - } - -#ifdef DEBUG - printf("debug : OpenGLArea : DrawWidget : end\n"); -#endif - - /*avoid C++ warnings*/ - a_event = NULL; - a_region = NULL; -} - - -/*------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------*/ - -void OpenGLAreaPaint(Widget This) { - if(!XtIsRealized(This)) return; - if(MakeCurrent(This)==1) { - XoAnyCallbackStruct value; - value.reason = XoCR_PAINT; - value.event = 0; - XtCallCallbacks(This,XoNpaintCallback,(XtPointer)&value); - glXSwapBuffers(XtDisplay(This),XtWindow(This)); - glXMakeCurrent(XtDisplay(This),None,NULL); - } -} - -#ifdef TOOLS_XT_OPENGLAREA_HAS_GL2PS - -#include - -int OpenGLAreaWrite_gl2ps(Widget This,const char* aFileName,const char* opts) { - FILE* file; - int options; - int sort; - inlib_GLint vp[4]; - int bufsize = 0; - static inlib_gl2ps_gl_funcs_t s_OpenGL_funcs = { - glIsEnabled, - glBegin, - glEnd, - glGetFloatv, - glVertex3f, - glGetBooleanv, - glGetIntegerv, - glRenderMode, - glFeedbackBuffer, - glPassThrough - }; - - file = fopen(aFileName,"w"); - if(!file) return 1; - - inlib_c_gl2ps_set_gl_funcs(&s_OpenGL_funcs); - - options = TOOLS_GL2PS_OCCLUSION_CULL - | TOOLS_GL2PS_BEST_ROOT - | TOOLS_GL2PS_SILENT - | TOOLS_GL2PS_DRAW_BACKGROUND; - sort = TOOLS_GL2PS_BSP_SORT; - //sort = TOOLS_GL2PS_SIMPLE_SORT; - - vp[0] = 0; - vp[1] = 0; - vp[2] = This->core.width; - vp[3] = This->core.height; - - inlib_c_gl2psBeginPage("title","exlib_Xt_OpenGLArea", - vp,TOOLS_GL2PS_EPS,sort,options, - TOOLS_GL_RGBA,0, NULL,0,0,0,bufsize, - file,aFileName); - - {XoAnyCallbackStruct value; - value.reason = XoCR_PAINT; - value.event = 0; - XtCallCallbacks(This,XoNpaintCallback,(XtPointer)&value);} - - inlib_c_gl2psEndPage(); - - inlib_c_gl2ps_reset_gl_funcs(); - - fclose(file); - - return 0; -} - -#else -#ifdef __cplusplus -int OpenGLAreaWrite_gl2ps(Widget,const char*,const char*) {return 1;} -#else -int OpenGLAreaWrite_gl2ps(Widget w,const char* f,const char* o) {return 1;} -#endif -#endif - -/*------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------*/ -static int MakeCurrent(Widget This) { - if(This==NULL) return 0; - if(!XtIsRealized(This)) return 0; - if(athis.glContext==NULL) return 0; - return (int)glXMakeCurrent(XtDisplay(This),XtWindow(This),athis.glContext); -} - -static void EventHandler(Widget This,XtPointer a_tag,XEvent* a_event ,Boolean* a_continue) { - XoAnyCallbackStruct value; - value.reason = XoCR_EVENT; - value.event = a_event; - XtCallCallbacks(This,XoNeventCallback,(XtPointer)&value); - a_tag = NULL; - a_continue = NULL; -} - -/*------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------*/ -static void XWidgetInstallColormap(Widget This) { -/* - From Mesa/widgets/GLwDrawingArea.c/post_colormap routine. - Could use also XtSetWMColormapWindows. -*/ - Display* display; - XWindowAttributes watbs; - Widget shell; - Window* ws = NULL; - int wn = 0,found,count; - Window wshell,wthis; - Colormap cmapthis; -/*.........................................................................*/ - if(This==NULL) return; - if( !XtIsWidget(This) || !XtIsRealized(This) ) return; - shell = XWidgetGetShell (This); - if(shell==NULL) return; - display = XtDisplay (This); - wthis = XtWindow (This); - wshell = XtWindow (shell); - XGetWMColormapWindows (display,wshell, &ws, &wn); -/* Check if colormap of this is a colormap of a Window in list.*/ - XGetWindowAttributes (display,wthis,&watbs); - cmapthis = watbs.colormap; - found = -1; - for(count=0;count - -typedef struct _OpenGLAreaClassRec* OpenGLAreaWidgetClass; -typedef struct _OpenGLAreaRec* OpenGLAreaWidget; - -typedef struct { - int reason; - XEvent* event; -} XoAnyCallbackStruct; - -/* OpenGLArea */ -#define XoNdoubleBufferOn "doubleBufferOn" -#define XoNpaintCallback "paintCallback" -#define XoNeventCallback "eventCallback" - -#define XoCR_PAINT 1 -#define XoCR_EVENT 2 - -#ifdef __cplusplus -extern "C"{ -#endif -extern WidgetClass openGLAreaWidgetClass; - -void OpenGLAreaPaint(Widget); -int OpenGLAreaWrite_gl2ps(Widget,const char*,const char*); - -#ifdef __cplusplus -} -#endif - -#endif -/* -exlib_build_use Xt -*/ diff --git a/source/externals/g4tools/include/tools/Xt/OpenGLAreaP.h b/source/externals/g4tools/include/tools/Xt/OpenGLAreaP.h deleted file mode 100644 index 7ce46d628b..0000000000 --- a/source/externals/g4tools/include/tools/Xt/OpenGLAreaP.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef tools_Xt_OpenGLAreaP_h -#define tools_Xt_OpenGLAreaP_h - -#include "OpenGLArea.h" - -#include -#include -#include - -#include - -typedef struct -{ - void* extension; -} OpenGLAreaClassPart; - -typedef struct _OpenGLAreaClassRec -{ - CoreClassPart core_class; - CompositeClassPart composite_class; - OpenGLAreaClassPart openGLArea_class; -} OpenGLAreaClassRec; - -#ifdef __cplusplus -extern "C"{ -#endif -extern OpenGLAreaClassRec openGLAreaClassRec; -#ifdef __cplusplus -} -#endif - -typedef struct -{ - /*Resources :*/ - Boolean doubleBufferOn; - XtCallbackList paintCallback; - XtCallbackList eventCallback; - /**/ - Visual* visual; - Boolean installColormap; - GLXContext glContext; -} OpenGLAreaPart; - -typedef struct _OpenGLAreaRec -{ - CorePart core; - CompositePart composite; - OpenGLAreaPart openGLArea; -} OpenGLAreaRec; - -#endif -/* -exlib_build_use Xt -*/ diff --git a/source/externals/g4tools/include/tools/Xt/tools b/source/externals/g4tools/include/tools/Xt/tools deleted file mode 100644 index 6e4237c438..0000000000 --- a/source/externals/g4tools/include/tools/Xt/tools +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_Xt_tools -#define tools_Xt_tools - -#include -#include -#include - -inline Widget XWidgetGetShell(Widget aWidget){ - Widget widget = aWidget; - while(1) { - if(!widget) return 0; - if(XtIsShell(widget)) return widget; - widget = XtParent(widget); - } -} - -inline Pixel XWidgetGetPixelResource(Widget aWidget,const std::string& aName){ - Pixel pixel = 0L; - Arg args[1]; - XtSetArg(args[0],(char*)aName.c_str(),&pixel); - XtGetValues(aWidget,args,1); - return pixel; -} - -inline Pixel XWidgetConvertStringToPixel(Widget aWidget,const std::string& aString){ - if(aString.empty()) return 0L; - if( (aString=="None") || (aString=="none") ) - return XWidgetGetPixelResource(aWidget,std::string(XtNbackground)); - XrmValue from,to; - from.size = aString.size()+1; - from.addr = (XPointer)aString.c_str(); - XtConvert(aWidget,XtRString,&from,XtRPixel,&to); - if(to.addr==NULL) return 0L; - return (*((Pixel*)to.addr)); -} -inline void XWidgetSetString(Widget aWidget,const std::string& aName,const std::string& aValue,bool aFreePrevious = false){ - if(aFreePrevious) { - char* s = NULL; - Arg args[1]; - XtSetArg(args[0],(char*)aName.c_str(),&s); - XtGetValues(aWidget,args,1); - if(s!=NULL) XtFree(s); - } - Arg args[1]; - XtSetArg(args[0],(char*)aName.c_str(),XtNewString(aValue.c_str())); - XtSetValues(aWidget,args,1); -} -inline bool XWidgetGetString(Widget aWidget,const std::string& aName,std::string& a_value){ - // XtNgeometry, XtNtitle. - char* s = NULL; - Arg args[1]; - XtSetArg(args[0],(char*)aName.c_str(),&s); - XtGetValues(aWidget,args,1); - if(s==NULL) {a_value.clear();return false;} - a_value = std::string(s); - return true; -} - -#include - -inline bool XWidgetSendMessage(Widget aWidget,long a_1,long a_2) { - XClientMessageEvent event; - if(!XtIsRealized(aWidget)) return 0; - event.type = ClientMessage; - event.display = XtDisplay(aWidget); - event.window = XtWindow(aWidget); - event.message_type = XA_INTEGER; - event.format = 8; - event.data.l[0] = a_1; - event.data.l[1] = a_2; - event.data.l[2] = 0L; - event.data.l[3] = 0L; - event.data.l[4] = 0L; - if(XSendEvent(event.display,event.window,False,0L,(XEvent*)&event)==0) - return false; - XFlush(event.display); - return true; -} - -#include - -inline void XClassGetName(WidgetClass aClass,std::string& a_value){ - a_value = std::string((char*)aClass->core_class.class_name); -} -inline Boolean XClassIsSubclass(WidgetClass aClass,WidgetClass aParent){ - for (WidgetClass wc = aClass; wc != NULL; wc = wc->core_class.superclass) - if (wc == aParent) return True; - return False; -} - -inline Position XWidgetGetX(Widget aWidget){return aWidget->core.x;} -inline Position XWidgetGetY(Widget aWidget){return aWidget->core.y;} -inline Dimension XWidgetGetWidth(Widget aWidget){return aWidget->core.width;} -inline Dimension XWidgetGetHeight(Widget aWidget){return aWidget->core.height;} -inline void XWidgetGetClassName(Widget aWidget,std::string& a_value) { - WidgetClass wc = XtClass(aWidget); - a_value = std::string((char*)wc->core_class.class_name); -} -inline void XWidgetCompellResize(Widget aWidget){ - if(aWidget->core.widget_class->core_class.resize==NULL) return; - (aWidget->core.widget_class->core_class.resize)(aWidget); -} - -#include -inline int XWidgetGetChildrenNumber(Widget aWidget){ - if(!XtIsComposite(aWidget)) return 0; - CompositePart* cwp = &(((CompositeWidget)aWidget)->composite); - return cwp->num_children; -} -inline Widget XWidgetGetChild(Widget aWidget,unsigned int aIndex){ - if(!XtIsComposite(aWidget)) return 0; - CompositePart* cwp = &(((CompositeWidget)aWidget)->composite); - if(aIndex>=cwp->num_children) return 0; - return cwp->children[aIndex]; -} -inline Widget XWidgetGetFirstChild(Widget aWidget){ - if(!XtIsComposite(aWidget)) return 0; - CompositePart* cwp = &(((CompositeWidget)aWidget)->composite); - return (cwp->num_children?cwp->children[0]:0); -} - -#include - -inline void XWidgetGetChildren(Widget aWidget,std::vector& aList){ - aList.clear(); - if(!XtIsComposite(aWidget)) return; - CompositePart* cwp = &(((CompositeWidget)aWidget)->composite); - for (unsigned int count=0;countnum_children;count++) - aList.push_back(cwp->children[count]); -} -inline void XWidgetGetPopupChildren(Widget aWidget,std::vector& aList){ - aList.clear(); - if(!XtIsWidget(aWidget)) return; - for(int count=0;countcore.num_popups;count++) { - aList.push_back(aWidget->core.popup_list[count]); - } -} -inline Widget XWidgetFindChild(Widget aWidget,const std::string& aName){ - if(!XtIsComposite(aWidget)) return 0; - CompositePart* cwp = &(((CompositeWidget)aWidget)->composite); - for (unsigned int count=0;countnum_children;count++) { - if(aName==std::string(XtName(cwp->children[count]))) - return cwp->children[count]; - } - return 0; -} - -#include - -inline void XWidgetPrintChildren(Widget aWidget,std::ostream& a_out){ - int number = XWidgetGetChildrenNumber(aWidget); - a_out << "XWidgetPrintChildren :" - << " " << (unsigned long)aWidget - << " number " << number - << std::endl; - std::string scls; - for(int index=0;indexcore.num_popups << " popup children." << std::endl; - std::string scls; - for (unsigned int count=0;countcore.num_popups;count++) { - Widget w = aWidget->core.popup_list[count]; - XWidgetGetClassName(w,scls); - a_out << " " << count - << " child class " << scls - << " name " << std::string(XtName(w)) - << std::endl; - } -} -inline void XWidgetDumpChildren(Widget aWidget,std::ostream& a_out){ - a_out << "XWidgetDumpChildren :" - << " " << std::string(XtName(aWidget)) - << std::endl; - if(!XtIsComposite(aWidget)) return; - CompositePart* cwp = &(((CompositeWidget)aWidget)->composite); - a_out << " " << cwp->num_children << " children." << std::endl; - std::string scls; - for (unsigned int count=0;countnum_children;count++) { - Widget w = cwp->children[count]; - XWidgetGetClassName(w,scls); - a_out << " " << count - << " child class " << scls - << " name " << std::string(XtName(w)) - << std::endl; - } -} - -#endif diff --git a/source/externals/g4tools/include/tools/app b/source/externals/g4tools/include/tools/app deleted file mode 100644 index f55bbd66e8..0000000000 --- a/source/externals/g4tools/include/tools/app +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_app -#define tools_app - -#include "path_env" -#include "sout" -#include "file" -#include "forit" -#include "sys/dir" - -namespace tools { - -#ifdef __APPLE__ -inline bool is_mac_app(const std::string& a_arg0){ - if(a_arg0.empty()) return false; - std::string bname = base_name(dir_name(a_arg0)); - if(bname=="MacOS") return true; - return false; -} -#else -inline bool is_mac_app(const std::string&){return false;} -#endif - -inline bool program_path(const std::string& a_arg0,std::string& a_path) { - if(a_arg0.empty()) { - a_path = ""; - return false; - } - std::string path,name,suffix; - path_name_suffix(a_arg0,path,name,suffix); - if(path.empty()) { - std::string PATH; - if(get_env("PATH",PATH)) { - std::string program = a_arg0; -#ifdef _WIN32 - if(program.find(".exe")==std::string::npos) program += ".exe"; -#endif - std::vector paths; - words(PATH,psep(),false,paths); - tools_vforit(std::string,paths,it) { - std::string dir = *it; - if(file::exists(dir+sep()+program)) { - path = dir; - break; - } - } - } - } - if(path.empty()) { - a_path = ""; - return false; - } - if(!is_absolute_path(path)) { - std::string pwd; - if(!dir::pwd(pwd)) { - a_path = ""; - return false; - } - path = pwd+sep()+path; - } - //printf("debug : path : %s\n",path.c_str()); - a_path = path; - return true; -} - -inline bool if_mouse_startup(const std::string& a_arg0,const std::string& a_env_HOME_DIR,const std::vector& a_home_dirs,std::ostream& a_out){ - std::string exe_dir = dir_name(a_arg0); - std::string bname = base_name(exe_dir); - if(bname=="MacOS") { - // cd in a_doc_dir : - if(!dir::cd_home()) { - a_out << "if_mouse_startup : can't go home." << std::endl; - return false; - } - tools_vforcit(std::string,a_home_dirs,it) { - if(!dir::mkcd(*it)) { - a_out << "if_mouse_startup :" - << " can't mkcd " << sout(*it) - << std::endl; - return false; - } - } - - // set a_env_HOME_DIR from exe_dir : - std::string Contents_dir = dir_name(exe_dir); - if(!put_env(a_env_HOME_DIR,Contents_dir)) { - a_out << "if_mouse_startup :" - << " can't putenv " << a_env_HOME_DIR - << " to " << sout(Contents_dir) - << "." - << std::endl; - return false; - } - {std::vector vals; - vals.push_back(Contents_dir+"/bin"); - vals.push_back("."); // for on-the-fly compilation and loading : - if(!env_path_append("DYLD_LIBRARY_PATH",vals)) { - a_out << "if_mouse_startup :" - << " can't putenv DYLD_LIBRARY_PATH." - //<< " to " << sout(DYLD_LIBRARY_PATH) - << std::endl; - return false; - }} - -// {std::string DYLD_LIBRARY_PATH; -// if(!get_env("DYLD_LIBRARY_PATH",DYLD_LIBRARY_PATH)) {} -// a_out << "debug : DYLD_LIBRARY_PATH = " << sout(DYLD_LIBRARY_PATH) << std::endl;} - - if(!is_env("DISPLAY")) { - if(!put_env("DISPLAY",":0.0")) return false; - } - - } else if(bname=="bin") { - //Linux, Windows : mouse startup ? - -/* FIXME : do we want to treat the case of a terminal startup - whence the user did not ??? - If so if_mouse_startup should be renamed no_env_startup. - - } else if(exe_dir=="") { //for exa when typing "osc-plot". - if(!program_path(a_arg0,exe_dir)) { - a_out << "if_mouse_startup :" - << " program_path failed for " << sout(bname) << "." - << std::endl; - return false; - } - a_out << "if_mouse_startup :" - << " program_path is " << sout(exe_dir) << "." - << std::endl; - -#if defined(__APPLE__) || defined(Linux) - bool is_abs,is_win; - std::string drive; - std::vector words; - path_words(exe_dir,words,is_abs,is_win,drive); - std::vector::size_type n = words.size(); - - if( (n>=3) && - (words[n-1]=="bin") && - is_version(words[n-2]) && - (words[n-3].substr(0,4)=="osc_") - ){ - - std::string osc_vers_dir = dir_name(exe_dir); - - printf("debug : auto env 000 \"%s\"\n",osc_vers_dir.c_str()); - - //if(a_env_HOME_DIR.size()) { - if(!put_env(a_env_HOME_DIR,osc_vers_dir)) { - a_out << "arg0_setenv :" - << " can't putenv " << a_env_HOME_DIR - << " to " << sout(osc_vers_dir) - << "." - << std::endl; - return false; - } - //} - -#ifdef __APPLE__ - - {std::vector vals; - vals.push_back(osc_vers_dir+"/bin"); - vals.push_back(osc_vers_dir+"/lib"); - vals.push_back("."); // for on-the-fly compilation and loading : - if(!env_path_append("DYLD_LIBRARY_PATH",vals)) return false;} - -#else -#endif - - if(!is_env("DISPLAY")) { - if(!put_env("DISPLAY",":0.0")) return false; - } - - } -#endif -*/ - - } - - return true; -} - -inline void app_res_dir(const std::string& a_exe_path,std::string& a_res_dir) { - a_res_dir = a_exe_path+sep()+".."+sep()+"res"; -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/cmp b/source/externals/g4tools/include/tools/cmp deleted file mode 100644 index 87503589f2..0000000000 --- a/source/externals/g4tools/include/tools/cmp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_cmp -#define tools_cmp - -#include - -namespace tools { - -template -inline bool cmp(std::ostream& a_out, - const T& a_what, - const T& a_ref,const T& a_error = T()) { - if(a_what>a_ref) { - if((a_what-a_ref)>a_error) { - a_out << a_ref << " expected. Got " << a_what << std::endl; - return false; - } - } else { - if((a_ref-a_what)>a_error) { - a_out << a_ref << " expected. Got " << a_what << std::endl; - return false; - } - } - return true; -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/file_name b/source/externals/g4tools/include/tools/file_name deleted file mode 100644 index 1ca28dcbe8..0000000000 --- a/source/externals/g4tools/include/tools/file_name +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_file_name -#define tools_file_name - -#include "srep" - -#include - -namespace tools { - -// OpenPAW, Panoramix : -inline bool rep_env(std::string& a_string) { - char spec_char = '\n'; - std::string::size_type dollar; - while((dollar=a_string.find('$'))!=std::string::npos){ - std::string::size_type slash = a_string.find('/',dollar+1); - std::string::size_type back_slash = a_string.find('\\',dollar+1); - std::string::size_type pos = std::string::npos; - if(slash!=std::string::npos) { - if(back_slash!=std::string::npos) { - pos = slash xxd -i lato_regular.ttf > lato_regular_ttf + +namespace tools { +namespace font { + +inline const unsigned char* lato_regular_ttf(unsigned int& a_len) { + a_len = 75136; + static const unsigned char s_data[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x47, 0x50, 0x4f, 0x53, 0x50, 0x5a, 0x5f, 0x4a, 0x00, 0x01, 0x10, 0x08, + 0x00, 0x00, 0x14, 0x7c, 0x47, 0x53, 0x55, 0x42, 0x55, 0x0e, 0x54, 0x98, + 0x00, 0x01, 0x24, 0x84, 0x00, 0x00, 0x00, 0xfc, 0x4f, 0x53, 0x2f, 0x32, + 0xd9, 0xad, 0x7a, 0x69, 0x00, 0x00, 0xf7, 0xf8, 0x00, 0x00, 0x00, 0x60, + 0x63, 0x6d, 0x61, 0x70, 0xb1, 0x76, 0x8d, 0xa4, 0x00, 0x00, 0xf8, 0x58, + 0x00, 0x00, 0x01, 0x74, 0x63, 0x76, 0x74, 0x20, 0x06, 0xf7, 0x18, 0xa3, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x66, 0x70, 0x67, 0x6d, + 0x72, 0x5a, 0x72, 0x40, 0x00, 0x00, 0xf9, 0xcc, 0x00, 0x00, 0x06, 0xe5, + 0x67, 0x61, 0x73, 0x70, 0x00, 0x12, 0x00, 0x18, 0x00, 0x01, 0x0f, 0xfc, + 0x00, 0x00, 0x00, 0x0c, 0x67, 0x6c, 0x79, 0x66, 0x9f, 0x40, 0x8b, 0x5b, + 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0xf0, 0x0e, 0x68, 0x65, 0x61, 0x64, + 0xfc, 0x9c, 0xf2, 0x23, 0x00, 0x00, 0xf3, 0x64, 0x00, 0x00, 0x00, 0x36, + 0x68, 0x68, 0x65, 0x61, 0x0f, 0xb6, 0x07, 0xa5, 0x00, 0x00, 0xf7, 0xd4, + 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, 0x40, 0x5e, 0x5d, 0xcf, + 0x00, 0x00, 0xf3, 0x9c, 0x00, 0x00, 0x04, 0x38, 0x6c, 0x6f, 0x63, 0x61, + 0xad, 0x64, 0xed, 0x15, 0x00, 0x00, 0xf1, 0x3c, 0x00, 0x00, 0x02, 0x28, + 0x6d, 0x61, 0x78, 0x70, 0x02, 0x0c, 0x07, 0xf9, 0x00, 0x00, 0xf1, 0x1c, + 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2b, 0x1e, 0x3d, 0x87, + 0x00, 0x01, 0x01, 0x30, 0x00, 0x00, 0x0b, 0x6a, 0x70, 0x6f, 0x73, 0x74, + 0xaa, 0x11, 0x67, 0x13, 0x00, 0x01, 0x0c, 0x9c, 0x00, 0x00, 0x03, 0x5e, + 0x70, 0x72, 0x65, 0x70, 0xa6, 0x07, 0x95, 0x17, 0x00, 0x01, 0x00, 0xb4, + 0x00, 0x00, 0x00, 0x4b, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x00, 0x03, 0xfb, + 0x05, 0x99, 0x00, 0x25, 0x00, 0x35, 0x00, 0x39, 0x00, 0x3d, 0x00, 0xfe, + 0x40, 0x16, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x34, 0x32, + 0x2a, 0x28, 0x24, 0x22, 0x1f, 0x1d, 0x13, 0x12, 0x06, 0x04, 0x0a, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x43, 0x00, 0x01, 0x02, 0x00, + 0x01, 0x1e, 0x00, 0x03, 0x02, 0x01, 0x02, 0x03, 0x01, 0x32, 0x00, 0x01, + 0x04, 0x02, 0x01, 0x04, 0x30, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x02, + 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x05, 0x08, 0x04, 0x05, 0x01, 0x00, + 0x26, 0x00, 0x09, 0x09, 0x06, 0x00, 0x00, 0x24, 0x00, 0x06, 0x06, 0x0b, + 0x1f, 0x00, 0x08, 0x08, 0x07, 0x00, 0x00, 0x24, 0x00, 0x07, 0x07, 0x0c, + 0x07, 0x20, 0x09, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x41, 0x00, + 0x01, 0x02, 0x00, 0x01, 0x1e, 0x00, 0x03, 0x02, 0x01, 0x02, 0x03, 0x01, + 0x32, 0x00, 0x01, 0x04, 0x02, 0x01, 0x04, 0x30, 0x00, 0x06, 0x00, 0x09, + 0x00, 0x06, 0x09, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, + 0x02, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x05, 0x08, 0x04, 0x05, 0x01, + 0x00, 0x26, 0x00, 0x08, 0x08, 0x07, 0x00, 0x00, 0x24, 0x00, 0x07, 0x07, + 0x0f, 0x07, 0x20, 0x08, 0x1b, 0x40, 0x4a, 0x00, 0x01, 0x02, 0x00, 0x01, + 0x1e, 0x00, 0x03, 0x02, 0x01, 0x02, 0x03, 0x01, 0x32, 0x00, 0x01, 0x04, + 0x02, 0x01, 0x04, 0x30, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x09, 0x00, + 0x00, 0x26, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x02, 0x01, 0x00, 0x26, + 0x00, 0x04, 0x00, 0x05, 0x08, 0x04, 0x05, 0x01, 0x00, 0x26, 0x00, 0x08, + 0x07, 0x07, 0x08, 0x00, 0x00, 0x23, 0x00, 0x08, 0x08, 0x07, 0x00, 0x00, + 0x24, 0x00, 0x07, 0x08, 0x07, 0x00, 0x00, 0x21, 0x09, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x13, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, + 0x04, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x3e, 0x04, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x13, 0x34, 0x36, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x01, 0x21, 0x11, 0x21, + 0x37, 0x21, 0x11, 0x21, 0xfa, 0x19, 0x39, 0x44, 0x4f, 0x2e, 0x3f, 0x67, + 0x49, 0x29, 0x1e, 0x2d, 0x36, 0x30, 0x23, 0x04, 0x11, 0x7a, 0x0c, 0x04, + 0x1a, 0x2d, 0x37, 0x30, 0x20, 0x49, 0x39, 0x29, 0x38, 0x28, 0x1c, 0x0b, + 0x19, 0x0c, 0x63, 0x3e, 0x30, 0x16, 0x28, 0x1d, 0x11, 0x11, 0x1d, 0x28, + 0x16, 0x30, 0x3e, 0xfe, 0xa1, 0x03, 0xce, 0xfc, 0x32, 0x32, 0x03, 0x63, + 0xfc, 0x9d, 0x04, 0x75, 0x16, 0x26, 0x1d, 0x11, 0x23, 0x40, 0x5b, 0x38, + 0x37, 0x50, 0x3b, 0x2b, 0x26, 0x25, 0x17, 0x69, 0x75, 0x22, 0x33, 0x2b, + 0x28, 0x2e, 0x3a, 0x28, 0x33, 0x3c, 0x12, 0x16, 0x12, 0x16, 0xfc, 0xfb, + 0x2f, 0x40, 0x11, 0x1e, 0x29, 0x17, 0x17, 0x28, 0x1e, 0x11, 0x3f, 0x04, + 0xa4, 0xfa, 0x67, 0x36, 0x05, 0x2c, 0x00, 0x02, 0x00, 0xda, 0xff, 0xf1, + 0x01, 0xd3, 0x05, 0x99, 0x00, 0x0d, 0x00, 0x21, 0x00, 0x7e, 0x40, 0x0e, + 0x00, 0x00, 0x1e, 0x1c, 0x14, 0x12, 0x00, 0x0d, 0x00, 0x0d, 0x07, 0x06, + 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1b, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x24, 0x04, 0x01, 0x01, 0x01, 0x0b, 0x1f, 0x00, + 0x02, 0x02, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x12, 0x03, 0x20, + 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x19, 0x04, 0x01, 0x01, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x26, 0x00, 0x02, 0x02, 0x03, + 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x15, 0x03, 0x20, 0x03, 0x1b, 0x40, + 0x22, 0x04, 0x01, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x26, + 0x00, 0x02, 0x03, 0x03, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x03, + 0x01, 0x00, 0x24, 0x00, 0x03, 0x02, 0x03, 0x01, 0x00, 0x21, 0x04, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x14, 0x0e, 0x02, 0x07, 0x23, 0x2e, + 0x03, 0x35, 0x11, 0x03, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x01, 0xae, 0x03, 0x06, 0x09, + 0x06, 0x79, 0x06, 0x09, 0x06, 0x03, 0x2b, 0x13, 0x21, 0x2e, 0x1a, 0x1a, + 0x2e, 0x22, 0x13, 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, 0x21, 0x13, 0x05, + 0x99, 0xfd, 0xc4, 0x2d, 0x56, 0x57, 0x5b, 0x34, 0x34, 0x5b, 0x57, 0x56, + 0x2d, 0x02, 0x3c, 0xfa, 0xd5, 0x1a, 0x2e, 0x22, 0x14, 0x14, 0x22, 0x2e, + 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, 0x2d, 0x00, 0x02, 0x00, 0x98, + 0x03, 0x99, 0x02, 0x80, 0x05, 0x99, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x9b, + 0x40, 0x12, 0x0b, 0x0b, 0x00, 0x00, 0x0b, 0x15, 0x0b, 0x15, 0x11, 0x0f, + 0x00, 0x0a, 0x00, 0x0a, 0x06, 0x04, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x1b, 0x14, 0x0c, 0x09, 0x01, 0x04, 0x00, 0x01, 0x01, + 0x1e, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x05, 0x03, 0x04, + 0x03, 0x01, 0x01, 0x0b, 0x00, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, + 0x58, 0x40, 0x27, 0x14, 0x0c, 0x09, 0x01, 0x04, 0x00, 0x01, 0x01, 0x1e, + 0x05, 0x03, 0x04, 0x03, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x23, 0x05, + 0x03, 0x04, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x02, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x21, 0x04, 0x1b, 0x40, 0x2d, 0x14, 0x0c, 0x09, + 0x01, 0x04, 0x02, 0x03, 0x01, 0x1e, 0x04, 0x01, 0x01, 0x03, 0x00, 0x01, + 0x00, 0x00, 0x23, 0x05, 0x01, 0x03, 0x00, 0x02, 0x00, 0x03, 0x02, 0x01, + 0x00, 0x26, 0x04, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x21, 0x05, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x11, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x11, 0x21, 0x11, + 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x11, 0x01, 0x33, 0x10, + 0x03, 0x1c, 0x1f, 0x1a, 0x1d, 0x06, 0x10, 0x01, 0xe8, 0x10, 0x03, 0x1c, + 0x1f, 0x1a, 0x1d, 0x06, 0x10, 0x05, 0x99, 0xfe, 0xde, 0x9b, 0x20, 0x23, + 0x23, 0x20, 0x9b, 0x01, 0x22, 0xfe, 0xde, 0x9b, 0x20, 0x23, 0x23, 0x20, + 0x9b, 0x01, 0x22, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0x51, + 0x05, 0x99, 0x00, 0x3e, 0x00, 0x42, 0x01, 0x39, 0x40, 0x26, 0x00, 0x00, + 0x42, 0x41, 0x40, 0x3f, 0x00, 0x3e, 0x00, 0x3e, 0x38, 0x36, 0x35, 0x33, + 0x30, 0x2f, 0x2a, 0x28, 0x27, 0x26, 0x25, 0x23, 0x20, 0x1e, 0x1b, 0x1a, + 0x19, 0x18, 0x12, 0x10, 0x0f, 0x0d, 0x0a, 0x09, 0x03, 0x01, 0x11, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2d, 0x0e, 0x0c, 0x02, 0x04, + 0x10, 0x0d, 0x03, 0x03, 0x01, 0x00, 0x04, 0x01, 0x00, 0x00, 0x26, 0x09, + 0x01, 0x07, 0x07, 0x0b, 0x1f, 0x0f, 0x0b, 0x02, 0x05, 0x05, 0x06, 0x00, + 0x00, 0x24, 0x0a, 0x08, 0x02, 0x06, 0x06, 0x0e, 0x1f, 0x02, 0x01, 0x00, + 0x00, 0x0c, 0x00, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, + 0x2b, 0x09, 0x01, 0x07, 0x06, 0x07, 0x34, 0x0a, 0x08, 0x02, 0x06, 0x0f, + 0x0b, 0x02, 0x05, 0x04, 0x06, 0x05, 0x00, 0x02, 0x26, 0x0e, 0x0c, 0x02, + 0x04, 0x10, 0x0d, 0x03, 0x03, 0x01, 0x00, 0x04, 0x01, 0x00, 0x00, 0x26, + 0x02, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x38, 0x09, 0x01, 0x07, 0x06, 0x07, 0x34, 0x02, 0x01, + 0x00, 0x01, 0x00, 0x35, 0x0a, 0x08, 0x02, 0x06, 0x0f, 0x0b, 0x02, 0x05, + 0x04, 0x06, 0x05, 0x00, 0x02, 0x26, 0x0e, 0x0c, 0x02, 0x04, 0x01, 0x01, + 0x04, 0x00, 0x00, 0x23, 0x0e, 0x0c, 0x02, 0x04, 0x04, 0x01, 0x00, 0x00, + 0x24, 0x10, 0x0d, 0x03, 0x03, 0x01, 0x04, 0x01, 0x00, 0x00, 0x21, 0x06, + 0x1b, 0x40, 0x60, 0x00, 0x07, 0x09, 0x07, 0x34, 0x00, 0x09, 0x06, 0x09, + 0x34, 0x00, 0x02, 0x01, 0x00, 0x01, 0x02, 0x00, 0x32, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x08, 0x00, 0x0f, 0x0b, 0x08, 0x0f, 0x00, 0x02, 0x26, 0x00, + 0x0a, 0x00, 0x0b, 0x05, 0x0a, 0x0b, 0x01, 0x02, 0x26, 0x00, 0x06, 0x00, + 0x05, 0x04, 0x06, 0x05, 0x00, 0x00, 0x26, 0x00, 0x0e, 0x0d, 0x01, 0x0e, + 0x00, 0x00, 0x23, 0x00, 0x0c, 0x10, 0x01, 0x0d, 0x03, 0x0c, 0x0d, 0x00, + 0x00, 0x26, 0x00, 0x04, 0x00, 0x03, 0x01, 0x04, 0x03, 0x01, 0x00, 0x26, + 0x00, 0x0e, 0x0e, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x0e, 0x01, 0x00, + 0x00, 0x21, 0x0c, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x03, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x13, 0x23, 0x03, 0x0e, 0x01, 0x2b, + 0x01, 0x13, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x33, 0x13, + 0x23, 0x37, 0x3e, 0x01, 0x3b, 0x01, 0x13, 0x3e, 0x01, 0x3b, 0x01, 0x03, + 0x33, 0x13, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x03, 0x33, 0x07, 0x0e, + 0x01, 0x2b, 0x01, 0x03, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, + 0x25, 0x33, 0x13, 0x23, 0x03, 0x16, 0x54, 0x51, 0x17, 0x20, 0x01, 0x01, + 0x47, 0xf7, 0x47, 0x08, 0x2d, 0x1d, 0x4f, 0x55, 0x92, 0x17, 0x1a, 0x01, + 0x01, 0x08, 0xcc, 0x41, 0xe8, 0x0d, 0x05, 0x24, 0x27, 0x9e, 0x48, 0x06, + 0x2b, 0x1e, 0x50, 0x54, 0xf7, 0x54, 0x4f, 0x19, 0x21, 0x01, 0x49, 0xd4, + 0x0d, 0x05, 0x25, 0x26, 0x8a, 0x41, 0xb3, 0x18, 0x1a, 0x01, 0x01, 0x09, + 0xfd, 0x9c, 0xf7, 0x41, 0xf7, 0x01, 0xa7, 0xfe, 0x59, 0x22, 0x1b, 0x04, + 0x07, 0x05, 0x01, 0x5a, 0xfe, 0x9d, 0x25, 0x1f, 0x01, 0xa7, 0x17, 0x1c, + 0x05, 0x0c, 0x06, 0x39, 0x01, 0x46, 0x4a, 0x1d, 0x1c, 0x01, 0x66, 0x1e, + 0x22, 0xfe, 0x5a, 0x01, 0xa6, 0x1e, 0x18, 0x08, 0x05, 0xfe, 0x9d, 0x4b, + 0x1d, 0x1b, 0xfe, 0xba, 0x17, 0x1d, 0x05, 0x0b, 0x06, 0x39, 0x83, 0x01, + 0x46, 0x00, 0x00, 0x03, 0x00, 0x6a, 0xff, 0x12, 0x04, 0x24, 0x06, 0x67, + 0x00, 0x38, 0x00, 0x43, 0x00, 0x4e, 0x01, 0x55, 0x40, 0x0e, 0x38, 0x36, + 0x33, 0x32, 0x24, 0x22, 0x1c, 0x1a, 0x17, 0x16, 0x08, 0x06, 0x06, 0x07, + 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, 0x40, 0x48, 0x18, 0x01, 0x01, 0x02, + 0x4a, 0x28, 0x20, 0x1d, 0x04, 0x03, 0x01, 0x49, 0x3e, 0x29, 0x0d, 0x04, + 0x00, 0x03, 0x3f, 0x0c, 0x03, 0x03, 0x04, 0x00, 0x34, 0x00, 0x02, 0x05, + 0x04, 0x05, 0x1e, 0x00, 0x03, 0x01, 0x00, 0x01, 0x03, 0x00, 0x32, 0x00, + 0x00, 0x04, 0x01, 0x00, 0x04, 0x30, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, + 0x24, 0x00, 0x04, 0x04, 0x12, 0x1f, 0x00, 0x05, 0x05, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x01, 0x11, 0x05, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x48, 0x18, 0x01, 0x01, 0x02, 0x4a, 0x28, 0x20, 0x1d, + 0x04, 0x03, 0x01, 0x49, 0x3e, 0x29, 0x0d, 0x04, 0x00, 0x03, 0x3f, 0x0c, + 0x03, 0x03, 0x04, 0x00, 0x34, 0x00, 0x02, 0x05, 0x04, 0x05, 0x1e, 0x00, + 0x03, 0x01, 0x00, 0x01, 0x03, 0x00, 0x32, 0x00, 0x00, 0x04, 0x01, 0x00, + 0x04, 0x30, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x04, + 0x15, 0x1f, 0x00, 0x05, 0x05, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, + 0x11, 0x05, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x45, + 0x18, 0x01, 0x01, 0x02, 0x4a, 0x28, 0x20, 0x1d, 0x04, 0x03, 0x01, 0x49, + 0x3e, 0x29, 0x0d, 0x04, 0x00, 0x03, 0x3f, 0x0c, 0x03, 0x03, 0x04, 0x00, + 0x34, 0x00, 0x02, 0x05, 0x04, 0x05, 0x1e, 0x00, 0x03, 0x01, 0x00, 0x01, + 0x03, 0x00, 0x32, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x30, 0x00, 0x01, + 0x00, 0x05, 0x01, 0x05, 0x01, 0x00, 0x25, 0x00, 0x02, 0x02, 0x04, 0x01, + 0x00, 0x24, 0x00, 0x04, 0x04, 0x15, 0x04, 0x20, 0x06, 0x1b, 0x40, 0x4f, + 0x18, 0x01, 0x01, 0x02, 0x4a, 0x28, 0x20, 0x1d, 0x04, 0x03, 0x01, 0x49, + 0x3e, 0x29, 0x0d, 0x04, 0x00, 0x03, 0x3f, 0x0c, 0x03, 0x03, 0x04, 0x00, + 0x34, 0x00, 0x02, 0x05, 0x04, 0x05, 0x1e, 0x00, 0x03, 0x01, 0x00, 0x01, + 0x03, 0x00, 0x32, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x30, 0x00, 0x01, + 0x03, 0x05, 0x01, 0x01, 0x00, 0x23, 0x00, 0x02, 0x00, 0x04, 0x05, 0x02, + 0x04, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x05, 0x01, 0x00, 0x24, 0x00, + 0x05, 0x01, 0x05, 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x05, 0x2e, 0x01, 0x27, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, + 0x17, 0x13, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x3f, 0x01, 0x3e, 0x01, + 0x3b, 0x01, 0x07, 0x1e, 0x01, 0x17, 0x07, 0x06, 0x23, 0x22, 0x2e, 0x02, + 0x27, 0x03, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x0f, 0x01, 0x0e, 0x01, + 0x2b, 0x01, 0x01, 0x34, 0x2e, 0x02, 0x27, 0x03, 0x3e, 0x03, 0x01, 0x14, + 0x1e, 0x02, 0x17, 0x13, 0x0e, 0x03, 0x01, 0xf2, 0x79, 0xc7, 0x48, 0x35, + 0x07, 0x1a, 0x0e, 0x13, 0x30, 0x46, 0x61, 0x44, 0x25, 0x46, 0x87, 0x6b, + 0x41, 0x39, 0x6d, 0xa0, 0x68, 0x0a, 0x02, 0x1a, 0x16, 0x42, 0x0e, 0x69, + 0x98, 0x3c, 0x2b, 0x14, 0x1a, 0x0e, 0x29, 0x3a, 0x4c, 0x31, 0x21, 0x48, + 0x8c, 0x70, 0x45, 0x3c, 0x73, 0xa7, 0x6b, 0x0c, 0x02, 0x1b, 0x15, 0x42, + 0x01, 0x98, 0x25, 0x40, 0x56, 0x31, 0x22, 0x41, 0x65, 0x45, 0x23, 0xfd, + 0xd5, 0x22, 0x3c, 0x50, 0x2f, 0x1e, 0x41, 0x5f, 0x3d, 0x1e, 0x0c, 0x0b, + 0x61, 0x4b, 0x52, 0x0b, 0x0e, 0x26, 0x31, 0x2e, 0x08, 0x02, 0x13, 0x15, + 0x35, 0x55, 0x81, 0x61, 0x49, 0x8b, 0x6c, 0x45, 0x04, 0x90, 0x13, 0x1e, + 0xc6, 0x0d, 0x52, 0x3a, 0x42, 0x1e, 0x19, 0x21, 0x21, 0x07, 0xfe, 0x1c, + 0x16, 0x34, 0x52, 0x7b, 0x5c, 0x5a, 0x9e, 0x78, 0x4b, 0x06, 0xb0, 0x13, + 0x1d, 0x02, 0x85, 0x32, 0x48, 0x34, 0x26, 0x10, 0xfe, 0x0e, 0x06, 0x2d, + 0x46, 0x5d, 0x02, 0xd0, 0x30, 0x47, 0x36, 0x28, 0x10, 0x01, 0xc3, 0x06, + 0x28, 0x3c, 0x4b, 0x00, 0x00, 0x05, 0x00, 0x48, 0xff, 0xef, 0x05, 0xdb, + 0x05, 0xa7, 0x00, 0x13, 0x00, 0x27, 0x00, 0x31, 0x00, 0x45, 0x00, 0x59, + 0x01, 0x5c, 0x40, 0x16, 0x56, 0x54, 0x4c, 0x4a, 0x42, 0x40, 0x38, 0x36, + 0x31, 0x2f, 0x2c, 0x2a, 0x24, 0x22, 0x1a, 0x18, 0x10, 0x0e, 0x06, 0x04, + 0x0a, 0x07, 0x2b, 0x4b, 0xb0, 0x1c, 0x50, 0x58, 0x40, 0x30, 0x00, 0x03, + 0x00, 0x00, 0x07, 0x03, 0x00, 0x01, 0x00, 0x26, 0x00, 0x07, 0x00, 0x08, + 0x09, 0x07, 0x08, 0x01, 0x00, 0x26, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x24, 0x04, 0x01, 0x01, 0x01, 0x11, 0x1f, 0x00, 0x09, 0x09, 0x05, 0x01, + 0x00, 0x24, 0x06, 0x01, 0x05, 0x05, 0x0c, 0x05, 0x20, 0x06, 0x1b, 0x4b, + 0xb0, 0x22, 0x50, 0x58, 0x40, 0x34, 0x00, 0x03, 0x00, 0x00, 0x07, 0x03, + 0x00, 0x01, 0x00, 0x26, 0x00, 0x07, 0x00, 0x08, 0x09, 0x07, 0x08, 0x01, + 0x00, 0x26, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x04, 0x01, 0x01, + 0x01, 0x11, 0x1f, 0x00, 0x05, 0x05, 0x0c, 0x1f, 0x00, 0x09, 0x09, 0x06, + 0x01, 0x00, 0x24, 0x00, 0x06, 0x06, 0x12, 0x06, 0x20, 0x07, 0x1b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x38, 0x00, 0x03, 0x00, 0x00, 0x07, 0x03, + 0x00, 0x01, 0x00, 0x26, 0x00, 0x07, 0x00, 0x08, 0x09, 0x07, 0x08, 0x01, + 0x00, 0x26, 0x00, 0x04, 0x04, 0x0b, 0x1f, 0x00, 0x02, 0x02, 0x01, 0x01, + 0x00, 0x24, 0x00, 0x01, 0x01, 0x11, 0x1f, 0x00, 0x05, 0x05, 0x0c, 0x1f, + 0x00, 0x09, 0x09, 0x06, 0x01, 0x00, 0x24, 0x00, 0x06, 0x06, 0x12, 0x06, + 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x39, 0x00, 0x04, + 0x01, 0x02, 0x01, 0x04, 0x02, 0x32, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, + 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x00, 0x00, 0x07, 0x03, 0x00, 0x01, + 0x00, 0x26, 0x00, 0x07, 0x00, 0x08, 0x09, 0x07, 0x08, 0x01, 0x00, 0x26, + 0x00, 0x05, 0x05, 0x0f, 0x1f, 0x00, 0x09, 0x09, 0x06, 0x01, 0x00, 0x24, + 0x00, 0x06, 0x06, 0x15, 0x06, 0x20, 0x07, 0x1b, 0x40, 0x45, 0x00, 0x04, + 0x01, 0x02, 0x01, 0x04, 0x02, 0x32, 0x00, 0x05, 0x09, 0x06, 0x09, 0x05, + 0x06, 0x32, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, 0x01, 0x00, 0x26, + 0x00, 0x03, 0x00, 0x00, 0x07, 0x03, 0x00, 0x01, 0x00, 0x26, 0x00, 0x07, + 0x00, 0x08, 0x09, 0x07, 0x08, 0x01, 0x00, 0x26, 0x00, 0x09, 0x05, 0x06, + 0x09, 0x01, 0x00, 0x23, 0x00, 0x09, 0x09, 0x06, 0x01, 0x00, 0x24, 0x00, + 0x06, 0x09, 0x06, 0x01, 0x00, 0x21, 0x08, 0x59, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x07, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x01, 0x3e, + 0x01, 0x3b, 0x01, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, + 0x07, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, + 0x33, 0x32, 0x3e, 0x02, 0x02, 0xc3, 0x34, 0x57, 0x74, 0x3f, 0x44, 0x73, + 0x56, 0x30, 0x30, 0x56, 0x73, 0x44, 0x43, 0x75, 0x55, 0x31, 0x8b, 0x1c, + 0x31, 0x41, 0x25, 0x25, 0x41, 0x30, 0x1b, 0x1b, 0x30, 0x41, 0x25, 0x25, + 0x41, 0x31, 0x1c, 0x02, 0x80, 0x0d, 0x1d, 0x18, 0x80, 0xfb, 0xe9, 0x0a, + 0x1c, 0x13, 0x84, 0x05, 0x35, 0x34, 0x57, 0x73, 0x3f, 0x44, 0x73, 0x56, + 0x30, 0x30, 0x56, 0x73, 0x44, 0x43, 0x74, 0x56, 0x30, 0x8a, 0x1c, 0x31, + 0x41, 0x25, 0x25, 0x41, 0x30, 0x1b, 0x1b, 0x30, 0x41, 0x25, 0x25, 0x41, + 0x31, 0x1c, 0x04, 0x3f, 0x54, 0x85, 0x5b, 0x30, 0x30, 0x5b, 0x85, 0x54, + 0x56, 0x86, 0x5c, 0x30, 0x30, 0x5c, 0x86, 0x56, 0x42, 0x5c, 0x3b, 0x1a, + 0x1a, 0x3b, 0x5c, 0x42, 0x41, 0x5b, 0x39, 0x19, 0x19, 0x39, 0x5b, 0x01, + 0x77, 0x11, 0x13, 0xfa, 0x84, 0x0d, 0x10, 0x01, 0x52, 0x54, 0x84, 0x5b, + 0x30, 0x30, 0x5b, 0x84, 0x54, 0x56, 0x87, 0x5c, 0x30, 0x30, 0x5c, 0x87, + 0x56, 0x42, 0x5d, 0x3a, 0x1a, 0x1a, 0x3a, 0x5d, 0x42, 0x41, 0x5a, 0x39, + 0x19, 0x19, 0x39, 0x5a, 0x00, 0x02, 0x00, 0x52, 0xff, 0xf0, 0x05, 0x78, + 0x05, 0xa9, 0x00, 0x3f, 0x00, 0x4b, 0x01, 0x40, 0x40, 0x14, 0x01, 0x00, + 0x46, 0x44, 0x2f, 0x2d, 0x28, 0x26, 0x22, 0x20, 0x11, 0x0f, 0x09, 0x07, + 0x00, 0x3f, 0x01, 0x3f, 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x1e, 0x50, 0x58, + 0x40, 0x43, 0x05, 0x01, 0x01, 0x02, 0x38, 0x01, 0x03, 0x01, 0x49, 0x48, + 0x2b, 0x25, 0x1b, 0x05, 0x06, 0x03, 0x03, 0x1e, 0x00, 0x01, 0x02, 0x03, + 0x02, 0x01, 0x03, 0x32, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x24, 0x07, + 0x01, 0x00, 0x00, 0x11, 0x1f, 0x00, 0x03, 0x03, 0x04, 0x01, 0x00, 0x24, + 0x05, 0x01, 0x04, 0x04, 0x0c, 0x1f, 0x00, 0x06, 0x06, 0x04, 0x01, 0x00, + 0x24, 0x05, 0x01, 0x04, 0x04, 0x0c, 0x04, 0x20, 0x08, 0x1b, 0x4b, 0xb0, + 0x5f, 0x50, 0x58, 0x40, 0x41, 0x05, 0x01, 0x01, 0x02, 0x38, 0x01, 0x03, + 0x01, 0x49, 0x48, 0x2b, 0x25, 0x1b, 0x05, 0x06, 0x03, 0x03, 0x1e, 0x00, + 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x32, 0x00, 0x02, 0x02, 0x00, 0x01, + 0x00, 0x24, 0x07, 0x01, 0x00, 0x00, 0x11, 0x1f, 0x00, 0x03, 0x03, 0x04, + 0x01, 0x00, 0x24, 0x00, 0x04, 0x04, 0x0c, 0x1f, 0x00, 0x06, 0x06, 0x05, + 0x01, 0x00, 0x24, 0x00, 0x05, 0x05, 0x12, 0x05, 0x20, 0x08, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x3f, 0x05, 0x01, 0x01, 0x02, 0x38, 0x01, + 0x03, 0x01, 0x49, 0x48, 0x2b, 0x25, 0x1b, 0x05, 0x06, 0x03, 0x03, 0x1e, + 0x00, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x32, 0x07, 0x01, 0x00, 0x00, + 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x03, 0x04, 0x01, + 0x00, 0x24, 0x00, 0x04, 0x04, 0x0f, 0x1f, 0x00, 0x06, 0x06, 0x05, 0x01, + 0x00, 0x24, 0x00, 0x05, 0x05, 0x15, 0x05, 0x20, 0x07, 0x1b, 0x40, 0x46, + 0x05, 0x01, 0x01, 0x02, 0x38, 0x01, 0x03, 0x01, 0x49, 0x48, 0x2b, 0x25, + 0x1b, 0x05, 0x06, 0x03, 0x03, 0x1e, 0x00, 0x01, 0x02, 0x03, 0x02, 0x01, + 0x03, 0x32, 0x07, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, + 0x26, 0x00, 0x06, 0x04, 0x05, 0x06, 0x01, 0x00, 0x23, 0x00, 0x03, 0x00, + 0x04, 0x05, 0x03, 0x04, 0x01, 0x00, 0x26, 0x00, 0x06, 0x06, 0x05, 0x01, + 0x00, 0x24, 0x00, 0x05, 0x06, 0x05, 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x06, 0x23, + 0x22, 0x26, 0x27, 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, + 0x02, 0x17, 0x01, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x3b, 0x01, 0x0e, 0x01, + 0x07, 0x01, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x02, + 0x01, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x01, 0x0e, 0x01, 0x02, + 0x94, 0x4f, 0x82, 0x5f, 0x37, 0x04, 0x6f, 0x05, 0x04, 0x0d, 0x17, 0x05, + 0x07, 0x1f, 0x31, 0x45, 0x2e, 0x32, 0x50, 0x39, 0x1f, 0x11, 0x22, 0x36, + 0x26, 0x01, 0x9c, 0x26, 0x2d, 0x08, 0x02, 0x14, 0x12, 0x6e, 0x02, 0x46, + 0x42, 0x01, 0x2c, 0xac, 0x1d, 0x24, 0x16, 0x90, 0x5e, 0xf5, 0x93, 0x50, + 0x9a, 0x79, 0x4a, 0x2f, 0x53, 0x72, 0x44, 0x3d, 0x3a, 0x35, 0x64, 0x8f, + 0xfe, 0xcc, 0x30, 0x4e, 0x64, 0x34, 0x70, 0xb2, 0x44, 0xfe, 0x59, 0x6a, + 0x6b, 0x05, 0xa9, 0x33, 0x54, 0x6f, 0x3c, 0x16, 0x01, 0x0e, 0x12, 0x1a, + 0x38, 0x2e, 0x1e, 0x20, 0x39, 0x4d, 0x2d, 0x23, 0x40, 0x41, 0x45, 0x26, + 0xfe, 0x5d, 0x43, 0x93, 0x4a, 0x13, 0x16, 0x73, 0xde, 0x61, 0xfe, 0xd0, + 0x0e, 0x16, 0x91, 0x5b, 0x6a, 0x36, 0x67, 0x94, 0x5d, 0x46, 0x7d, 0x6a, + 0x54, 0x1e, 0x4d, 0x92, 0x4e, 0x49, 0x80, 0x5f, 0x37, 0xfb, 0xe3, 0x41, + 0x63, 0x44, 0x23, 0x52, 0x44, 0x01, 0xab, 0x39, 0x9f, 0x00, 0x00, 0x01, + 0x00, 0x98, 0x03, 0x99, 0x01, 0x33, 0x05, 0x99, 0x00, 0x0a, 0x00, 0x51, + 0x40, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0a, 0x06, 0x04, 0x03, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x16, 0x09, 0x01, 0x02, 0x00, + 0x01, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x02, 0x01, + 0x01, 0x01, 0x0b, 0x00, 0x20, 0x03, 0x1b, 0x40, 0x20, 0x09, 0x01, 0x02, + 0x00, 0x01, 0x01, 0x1e, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x23, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x21, 0x04, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x07, + 0x0e, 0x01, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x11, 0x01, 0x33, 0x10, 0x03, + 0x1c, 0x1f, 0x1a, 0x1d, 0x06, 0x10, 0x05, 0x99, 0xfe, 0xde, 0x9b, 0x20, + 0x23, 0x23, 0x20, 0x9b, 0x01, 0x22, 0x00, 0x01, 0x00, 0x86, 0xfe, 0xdb, + 0x02, 0x01, 0x06, 0x0f, 0x00, 0x1c, 0x00, 0x07, 0x40, 0x04, 0x14, 0x0a, + 0x01, 0x0b, 0x2b, 0x01, 0x14, 0x12, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, + 0x0f, 0x01, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x17, 0x1e, 0x01, + 0x15, 0x14, 0x07, 0x06, 0x02, 0x01, 0x21, 0x6e, 0x68, 0x06, 0x04, 0x0e, + 0x0b, 0x4f, 0x4b, 0x69, 0x41, 0x1e, 0x1e, 0x41, 0x69, 0x4b, 0x4f, 0x0b, + 0x0e, 0x0a, 0x69, 0x6d, 0x02, 0x75, 0xd6, 0xfe, 0x6d, 0xb7, 0x0b, 0x10, + 0x08, 0x0e, 0x12, 0x07, 0x30, 0x73, 0xe2, 0xe4, 0xe7, 0x7a, 0x79, 0xe8, + 0xe3, 0xe2, 0x74, 0x31, 0x07, 0x12, 0x0e, 0x0f, 0x13, 0xb6, 0xfe, 0x6c, + 0x00, 0x01, 0x00, 0x4a, 0xfe, 0xdb, 0x01, 0xc5, 0x06, 0x0f, 0x00, 0x1c, + 0x00, 0x07, 0x40, 0x04, 0x09, 0x13, 0x01, 0x0b, 0x2b, 0x01, 0x34, 0x02, + 0x27, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x1e, 0x03, 0x15, 0x14, 0x0e, + 0x02, 0x07, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x12, 0x01, + 0x2a, 0x6d, 0x69, 0x0a, 0x0e, 0x0b, 0x4f, 0x4b, 0x69, 0x41, 0x1e, 0x1e, + 0x41, 0x69, 0x4b, 0x4f, 0x0b, 0x0e, 0x04, 0x06, 0x68, 0x6e, 0x02, 0x75, + 0xd6, 0x01, 0x94, 0xb6, 0x13, 0x0f, 0x0e, 0x12, 0x07, 0x31, 0x74, 0xe2, + 0xe3, 0xe8, 0x79, 0x7a, 0xe7, 0xe4, 0xe2, 0x73, 0x30, 0x07, 0x12, 0x0e, + 0x08, 0x10, 0x0b, 0xb7, 0x01, 0x93, 0x00, 0x01, 0x00, 0x60, 0x03, 0x5f, + 0x02, 0xbc, 0x05, 0xe2, 0x00, 0x30, 0x00, 0x68, 0x40, 0x0a, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x30, 0x18, 0x17, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x19, + 0x50, 0x58, 0x40, 0x22, 0x2d, 0x29, 0x28, 0x24, 0x20, 0x1f, 0x1b, 0x13, + 0x10, 0x0f, 0x0b, 0x08, 0x07, 0x04, 0x0e, 0x01, 0x00, 0x01, 0x1e, 0x02, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0d, 0x01, + 0x20, 0x03, 0x1b, 0x40, 0x2b, 0x2d, 0x29, 0x28, 0x24, 0x20, 0x1f, 0x1b, + 0x13, 0x10, 0x0f, 0x0b, 0x08, 0x07, 0x04, 0x0e, 0x01, 0x00, 0x01, 0x1e, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x24, 0x02, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x04, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x35, 0x34, 0x36, 0x37, 0x06, 0x0f, 0x01, + 0x27, 0x37, 0x36, 0x37, 0x2e, 0x01, 0x2f, 0x01, 0x37, 0x17, 0x16, 0x17, + 0x2e, 0x01, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x07, 0x3e, 0x01, 0x3f, 0x01, + 0x17, 0x07, 0x0e, 0x01, 0x07, 0x1e, 0x01, 0x1f, 0x01, 0x07, 0x27, 0x2e, + 0x01, 0x27, 0x16, 0x1d, 0x01, 0x01, 0x62, 0x05, 0x07, 0x14, 0x21, 0xac, + 0x2c, 0xac, 0x24, 0x25, 0x14, 0x23, 0x12, 0xad, 0x2c, 0xad, 0x23, 0x16, + 0x09, 0x07, 0x58, 0x0e, 0x0b, 0x1b, 0x11, 0xac, 0x2c, 0xac, 0x11, 0x21, + 0x12, 0x12, 0x21, 0x11, 0xad, 0x2c, 0xad, 0x12, 0x1c, 0x0b, 0x10, 0x03, + 0x5f, 0xc5, 0x13, 0x22, 0x10, 0x19, 0x14, 0x63, 0x4b, 0x64, 0x15, 0x03, + 0x02, 0x0b, 0x0c, 0x65, 0x4b, 0x64, 0x14, 0x20, 0x12, 0x25, 0x14, 0xc6, + 0xc5, 0x29, 0x1f, 0x0f, 0x16, 0x0b, 0x63, 0x4b, 0x64, 0x0b, 0x0c, 0x02, + 0x02, 0x0b, 0x0b, 0x65, 0x4b, 0x64, 0x0b, 0x16, 0x10, 0x21, 0x27, 0xc6, + 0x00, 0x01, 0x00, 0x64, 0x00, 0xae, 0x04, 0x22, 0x04, 0x8e, 0x00, 0x0b, + 0x00, 0x75, 0x40, 0x12, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0b, 0x0a, 0x09, + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x07, 0x07, 0x2b, 0x4b, + 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x25, 0x06, 0x01, 0x05, 0x00, 0x02, 0x05, + 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x26, 0x06, 0x01, 0x05, 0x05, 0x02, 0x00, 0x00, 0x24, 0x00, + 0x02, 0x05, 0x02, 0x00, 0x00, 0x21, 0x04, 0x1b, 0x40, 0x2d, 0x06, 0x01, + 0x05, 0x00, 0x02, 0x05, 0x00, 0x00, 0x23, 0x00, 0x04, 0x00, 0x03, 0x01, + 0x04, 0x03, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x26, 0x06, 0x01, 0x05, 0x05, 0x02, 0x00, 0x00, 0x24, 0x00, + 0x02, 0x05, 0x02, 0x00, 0x00, 0x21, 0x05, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x02, + 0x8b, 0x01, 0x97, 0xfe, 0x69, 0x92, 0xfe, 0x6b, 0x01, 0x95, 0x04, 0x8e, + 0xfe, 0x55, 0x87, 0xfe, 0x52, 0x01, 0xae, 0x87, 0x01, 0xab, 0x00, 0x01, + 0x00, 0x5e, 0xfe, 0xf1, 0x01, 0x50, 0x00, 0xec, 0x00, 0x1e, 0x00, 0x5f, + 0x40, 0x06, 0x1b, 0x19, 0x06, 0x04, 0x02, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x12, 0x0f, 0x01, 0x01, 0x1b, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0c, 0x01, 0x20, 0x03, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x12, 0x0f, 0x01, 0x01, 0x1b, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0f, 0x01, 0x20, 0x03, + 0x1b, 0x40, 0x1b, 0x0f, 0x01, 0x01, 0x1b, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x21, 0x04, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x37, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x07, + 0x27, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x03, 0x37, 0x23, 0x22, 0x2e, 0x02, + 0x5e, 0x11, 0x1f, 0x2c, 0x1a, 0x1e, 0x2f, 0x1f, 0x10, 0x1a, 0x30, 0x47, + 0x2d, 0x1e, 0x0d, 0x0e, 0x0a, 0x1f, 0x20, 0x1b, 0x06, 0x0d, 0x1a, 0x2a, + 0x1f, 0x11, 0x7b, 0x17, 0x29, 0x1f, 0x12, 0x16, 0x27, 0x33, 0x1e, 0x2d, + 0x61, 0x5f, 0x5a, 0x26, 0x1d, 0x0c, 0x10, 0x0d, 0x0e, 0x0b, 0x25, 0x30, + 0x3a, 0x21, 0x12, 0x21, 0x2d, 0x00, 0x00, 0x01, 0x00, 0x64, 0x02, 0x0c, + 0x02, 0x52, 0x02, 0xa3, 0x00, 0x03, 0x00, 0x25, 0x40, 0x06, 0x03, 0x02, + 0x01, 0x00, 0x02, 0x07, 0x2b, 0x40, 0x17, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x00, 0x21, 0x03, 0xb0, 0x38, 0x2b, 0x13, 0x21, 0x15, + 0x21, 0x64, 0x01, 0xee, 0xfe, 0x12, 0x02, 0xa3, 0x97, 0x00, 0x00, 0x01, + 0x00, 0x58, 0xff, 0xf1, 0x01, 0x51, 0x00, 0xec, 0x00, 0x13, 0x00, 0x53, + 0x40, 0x06, 0x10, 0x0e, 0x06, 0x04, 0x02, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x12, 0x01, 0x20, 0x02, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, + 0x15, 0x01, 0x20, 0x02, 0x1b, 0x40, 0x17, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x21, 0x03, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x37, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x58, 0x13, 0x21, 0x2e, 0x1a, 0x1a, 0x2e, 0x22, 0x13, + 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, 0x21, 0x13, 0x6e, 0x1a, 0x2e, 0x22, + 0x14, 0x14, 0x22, 0x2e, 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, 0x2d, + 0x00, 0x01, 0xff, 0xf4, 0xff, 0xa6, 0x02, 0xf6, 0x05, 0xc1, 0x00, 0x09, + 0x00, 0x2d, 0x40, 0x06, 0x09, 0x07, 0x04, 0x02, 0x02, 0x07, 0x2b, 0x4b, + 0xb0, 0x8d, 0x50, 0x58, 0x40, 0x0c, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, + 0x01, 0x01, 0x0d, 0x01, 0x20, 0x02, 0x1b, 0x40, 0x0a, 0x00, 0x01, 0x00, + 0x01, 0x34, 0x00, 0x00, 0x00, 0x2b, 0x02, 0x59, 0xb0, 0x38, 0x2b, 0x17, + 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0xa1, 0x0e, 0x37, + 0x1d, 0x4b, 0x02, 0x59, 0x0d, 0x30, 0x21, 0x4b, 0x15, 0x23, 0x22, 0x05, + 0xd9, 0x20, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3c, 0xff, 0xf1, 0x04, 0x4c, + 0x05, 0xa9, 0x00, 0x13, 0x00, 0x27, 0x00, 0x77, 0x40, 0x0a, 0x24, 0x22, + 0x1a, 0x18, 0x10, 0x0e, 0x06, 0x04, 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x1a, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x11, 0x1f, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x12, 0x00, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x18, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, 0x01, 0x00, 0x26, + 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x15, 0x00, + 0x20, 0x03, 0x1b, 0x40, 0x21, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, + 0x01, 0x00, 0x26, 0x00, 0x03, 0x00, 0x00, 0x03, 0x01, 0x00, 0x23, 0x00, + 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, + 0x21, 0x04, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x14, 0x02, 0x0e, 0x01, + 0x23, 0x22, 0x2e, 0x01, 0x02, 0x35, 0x34, 0x12, 0x3e, 0x01, 0x33, 0x32, + 0x1e, 0x01, 0x12, 0x07, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x04, 0x4c, 0x51, 0x8c, 0xbf, + 0x6d, 0x6e, 0xbd, 0x8c, 0x50, 0x50, 0x8c, 0xbd, 0x6e, 0x6d, 0xbf, 0x8c, + 0x51, 0xb9, 0x37, 0x5d, 0x7a, 0x42, 0x42, 0x7a, 0x5c, 0x37, 0x37, 0x5c, + 0x7a, 0x42, 0x42, 0x7a, 0x5d, 0x37, 0x02, 0xcc, 0xbc, 0xfe, 0xed, 0xb4, + 0x58, 0x58, 0xb4, 0x01, 0x13, 0xbc, 0xbc, 0x01, 0x14, 0xb5, 0x58, 0x58, + 0xb5, 0xfe, 0xec, 0xbc, 0xa4, 0xdf, 0x88, 0x3b, 0x3b, 0x88, 0xdf, 0xa4, + 0xa4, 0xde, 0x88, 0x3b, 0x3b, 0x88, 0xde, 0x00, 0x00, 0x01, 0x00, 0xca, + 0x00, 0x00, 0x04, 0x1f, 0x05, 0x9c, 0x00, 0x12, 0x00, 0xcb, 0x40, 0x0c, + 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x09, 0x07, 0x01, 0x00, 0x05, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x23, 0x0c, 0x04, 0x02, 0x01, + 0x02, 0x01, 0x1e, 0x00, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00, 0x32, 0x00, + 0x02, 0x02, 0x0b, 0x1f, 0x03, 0x01, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, + 0x00, 0x04, 0x04, 0x0c, 0x04, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, + 0x58, 0x40, 0x20, 0x0c, 0x04, 0x02, 0x01, 0x02, 0x01, 0x1e, 0x00, 0x02, + 0x01, 0x02, 0x34, 0x00, 0x01, 0x00, 0x01, 0x34, 0x03, 0x01, 0x00, 0x00, + 0x04, 0x00, 0x02, 0x24, 0x00, 0x04, 0x04, 0x0f, 0x04, 0x20, 0x05, 0x1b, + 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x2a, 0x0c, 0x04, 0x02, 0x01, 0x02, + 0x01, 0x1e, 0x00, 0x02, 0x01, 0x02, 0x34, 0x00, 0x01, 0x00, 0x01, 0x34, + 0x03, 0x01, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x23, 0x03, 0x01, 0x00, + 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x21, + 0x06, 0x1b, 0x40, 0x2f, 0x0c, 0x04, 0x02, 0x01, 0x02, 0x01, 0x1e, 0x00, + 0x02, 0x01, 0x02, 0x34, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x03, 0x2a, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x23, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x02, 0x21, 0x07, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x25, 0x21, 0x11, + 0x34, 0x37, 0x05, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x01, 0x33, + 0x11, 0x21, 0x15, 0x21, 0x01, 0x1f, 0x01, 0x34, 0x03, 0xff, 0x00, 0x0a, + 0x14, 0x09, 0x0f, 0x18, 0x06, 0x38, 0x01, 0xaa, 0x91, 0x01, 0x1a, 0xfd, + 0x00, 0x88, 0x03, 0xd1, 0x2c, 0x2d, 0xdb, 0x08, 0x07, 0x0d, 0x09, 0x4d, + 0x01, 0x71, 0xfa, 0xec, 0x88, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, + 0x04, 0x24, 0x05, 0xa9, 0x00, 0x33, 0x00, 0xb6, 0x40, 0x10, 0x01, 0x00, + 0x2c, 0x2a, 0x24, 0x22, 0x14, 0x13, 0x10, 0x0d, 0x00, 0x33, 0x01, 0x33, + 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2d, 0x2f, 0x01, + 0x04, 0x03, 0x0b, 0x01, 0x02, 0x01, 0x02, 0x1e, 0x00, 0x04, 0x03, 0x01, + 0x03, 0x04, 0x01, 0x32, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x05, + 0x01, 0x00, 0x00, 0x11, 0x1f, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x24, + 0x00, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, + 0x58, 0x40, 0x2b, 0x2f, 0x01, 0x04, 0x03, 0x0b, 0x01, 0x02, 0x01, 0x02, + 0x1e, 0x00, 0x04, 0x03, 0x01, 0x03, 0x04, 0x01, 0x32, 0x05, 0x01, 0x00, + 0x00, 0x03, 0x04, 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x02, + 0x00, 0x00, 0x24, 0x00, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x05, 0x1b, 0x40, + 0x34, 0x2f, 0x01, 0x04, 0x03, 0x0b, 0x01, 0x02, 0x01, 0x02, 0x1e, 0x00, + 0x04, 0x03, 0x01, 0x03, 0x04, 0x01, 0x32, 0x05, 0x01, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, + 0x00, 0x23, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x24, 0x00, 0x02, 0x01, + 0x02, 0x00, 0x00, 0x21, 0x06, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x3e, 0x01, 0x33, 0x21, + 0x32, 0x16, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, 0x37, 0x01, 0x3e, 0x03, + 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x0e, 0x01, 0x23, + 0x22, 0x26, 0x2f, 0x01, 0x3e, 0x03, 0x02, 0x59, 0x5b, 0x9e, 0x73, 0x42, + 0x30, 0x52, 0x6b, 0x3c, 0xfe, 0x87, 0x28, 0x52, 0x26, 0x01, 0xe0, 0x1d, + 0x22, 0xfc, 0x44, 0x0f, 0x11, 0x01, 0xcb, 0x39, 0x5e, 0x43, 0x24, 0x28, + 0x46, 0x5e, 0x36, 0x36, 0x5c, 0x47, 0x31, 0x0a, 0x08, 0x20, 0x1a, 0x05, + 0x0b, 0x07, 0x5d, 0x0e, 0x50, 0x7b, 0x9f, 0x05, 0xa9, 0x36, 0x67, 0x94, + 0x5e, 0x50, 0x88, 0x7d, 0x75, 0x3d, 0xfe, 0x7e, 0x0b, 0x0d, 0x22, 0x1b, + 0x6c, 0x3d, 0x13, 0x28, 0x11, 0x01, 0xcd, 0x3a, 0x6b, 0x6c, 0x6f, 0x3f, + 0x3f, 0x5f, 0x3e, 0x1f, 0x20, 0x39, 0x4e, 0x2f, 0x1d, 0x1a, 0x01, 0x01, + 0x10, 0x62, 0x97, 0x66, 0x35, 0x00, 0x00, 0x01, 0x00, 0x6c, 0xff, 0xf0, + 0x04, 0x2e, 0x05, 0xa9, 0x00, 0x4a, 0x00, 0xfe, 0x40, 0x16, 0x01, 0x00, + 0x43, 0x41, 0x3b, 0x39, 0x31, 0x30, 0x2f, 0x2e, 0x26, 0x24, 0x1b, 0x19, + 0x13, 0x11, 0x00, 0x4a, 0x01, 0x4a, 0x09, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x43, 0x46, 0x01, 0x07, 0x06, 0x0a, 0x01, 0x04, 0x05, + 0x17, 0x01, 0x03, 0x02, 0x03, 0x1e, 0x00, 0x07, 0x06, 0x05, 0x06, 0x07, + 0x05, 0x32, 0x00, 0x02, 0x04, 0x03, 0x04, 0x02, 0x03, 0x32, 0x00, 0x05, + 0x00, 0x04, 0x02, 0x05, 0x04, 0x01, 0x00, 0x26, 0x00, 0x06, 0x06, 0x00, + 0x01, 0x00, 0x24, 0x08, 0x01, 0x00, 0x00, 0x11, 0x1f, 0x00, 0x03, 0x03, + 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x12, 0x01, 0x20, 0x08, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x41, 0x46, 0x01, 0x07, 0x06, 0x0a, + 0x01, 0x04, 0x05, 0x17, 0x01, 0x03, 0x02, 0x03, 0x1e, 0x00, 0x07, 0x06, + 0x05, 0x06, 0x07, 0x05, 0x32, 0x00, 0x02, 0x04, 0x03, 0x04, 0x02, 0x03, + 0x32, 0x08, 0x01, 0x00, 0x00, 0x06, 0x07, 0x00, 0x06, 0x01, 0x00, 0x26, + 0x00, 0x05, 0x00, 0x04, 0x02, 0x05, 0x04, 0x01, 0x00, 0x26, 0x00, 0x03, + 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, 0x20, 0x07, + 0x1b, 0x40, 0x4a, 0x46, 0x01, 0x07, 0x06, 0x0a, 0x01, 0x04, 0x05, 0x17, + 0x01, 0x03, 0x02, 0x03, 0x1e, 0x00, 0x07, 0x06, 0x05, 0x06, 0x07, 0x05, + 0x32, 0x00, 0x02, 0x04, 0x03, 0x04, 0x02, 0x03, 0x32, 0x08, 0x01, 0x00, + 0x00, 0x06, 0x07, 0x00, 0x06, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x04, + 0x02, 0x05, 0x04, 0x01, 0x00, 0x26, 0x00, 0x03, 0x01, 0x01, 0x03, 0x01, + 0x00, 0x23, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x03, + 0x01, 0x01, 0x00, 0x21, 0x08, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, + 0x1e, 0x01, 0x17, 0x1e, 0x03, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, + 0x02, 0x23, 0x35, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, + 0x02, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x3e, 0x03, 0x02, + 0x6c, 0x5b, 0x9a, 0x6f, 0x3e, 0x23, 0x41, 0x5c, 0x39, 0x8c, 0x8d, 0x4b, + 0x82, 0xad, 0x63, 0x72, 0xa2, 0x70, 0x48, 0x19, 0x4c, 0x15, 0x15, 0x14, + 0x1f, 0x08, 0x02, 0x04, 0x02, 0x0e, 0x28, 0x44, 0x65, 0x4b, 0x4b, 0x71, + 0x4b, 0x26, 0x1f, 0x51, 0x8f, 0x70, 0x5b, 0x81, 0x52, 0x25, 0x27, 0x44, + 0x5d, 0x36, 0x36, 0x5c, 0x47, 0x30, 0x0c, 0x08, 0x20, 0x19, 0x05, 0x0b, + 0x07, 0x5d, 0x0e, 0x50, 0x7b, 0x9f, 0x05, 0xa9, 0x34, 0x60, 0x88, 0x53, + 0x44, 0x6b, 0x51, 0x38, 0x11, 0x25, 0xae, 0x83, 0x63, 0x9e, 0x6f, 0x3b, + 0x39, 0x64, 0x89, 0x50, 0x20, 0x09, 0x11, 0x12, 0x04, 0x09, 0x05, 0x1d, + 0x49, 0x40, 0x2c, 0x31, 0x4e, 0x60, 0x2f, 0x3a, 0x60, 0x46, 0x28, 0x81, + 0x01, 0x26, 0x42, 0x5c, 0x38, 0x3e, 0x5c, 0x3c, 0x1e, 0x20, 0x39, 0x4f, + 0x2e, 0x1d, 0x1a, 0x01, 0x01, 0x10, 0x62, 0x97, 0x66, 0x35, 0x00, 0x02, + 0x00, 0x28, 0x00, 0x00, 0x04, 0x60, 0x05, 0x99, 0x00, 0x10, 0x00, 0x16, + 0x00, 0xc9, 0x40, 0x0e, 0x16, 0x15, 0x10, 0x0f, 0x0b, 0x09, 0x08, 0x07, + 0x06, 0x04, 0x01, 0x00, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x1e, 0x14, 0x01, 0x00, 0x04, 0x01, 0x1e, 0x05, 0x01, 0x00, 0x03, + 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x00, 0x26, 0x00, 0x04, 0x04, 0x0b, + 0x1f, 0x00, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, + 0x50, 0x58, 0x40, 0x20, 0x14, 0x01, 0x00, 0x04, 0x01, 0x1e, 0x05, 0x01, + 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x00, 0x26, 0x00, 0x04, + 0x04, 0x02, 0x00, 0x00, 0x24, 0x00, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x04, + 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x29, 0x14, 0x01, 0x00, 0x04, + 0x01, 0x1e, 0x00, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x23, 0x05, 0x01, + 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x00, 0x26, 0x00, 0x04, + 0x04, 0x02, 0x00, 0x00, 0x24, 0x00, 0x02, 0x04, 0x02, 0x00, 0x00, 0x21, + 0x05, 0x1b, 0x40, 0x31, 0x14, 0x01, 0x00, 0x04, 0x01, 0x1e, 0x00, 0x04, + 0x00, 0x02, 0x04, 0x00, 0x00, 0x23, 0x00, 0x05, 0x00, 0x03, 0x01, 0x05, + 0x03, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x01, + 0x00, 0x26, 0x00, 0x04, 0x04, 0x02, 0x00, 0x00, 0x24, 0x00, 0x02, 0x04, + 0x02, 0x00, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x33, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x22, 0x26, + 0x2f, 0x01, 0x01, 0x33, 0x03, 0x34, 0x36, 0x37, 0x01, 0x21, 0x03, 0x87, + 0xd9, 0x13, 0x14, 0xb2, 0x9d, 0xfd, 0x85, 0x14, 0x1d, 0x04, 0x12, 0x02, + 0xb9, 0xa6, 0x9d, 0x03, 0x05, 0xfd, 0xf7, 0x02, 0x01, 0x02, 0x05, 0x66, + 0x10, 0x16, 0xfe, 0x87, 0x01, 0x79, 0x17, 0x11, 0x5b, 0x03, 0x9d, 0xfe, + 0xbb, 0x1a, 0x3c, 0x20, 0xfd, 0x3b, 0x00, 0x01, 0x00, 0x6c, 0xff, 0xf0, + 0x03, 0xfe, 0x05, 0x99, 0x00, 0x2e, 0x00, 0xe0, 0x40, 0x10, 0x2e, 0x2d, + 0x29, 0x27, 0x1f, 0x1d, 0x1a, 0x18, 0x12, 0x10, 0x08, 0x06, 0x04, 0x02, + 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x3b, 0x05, 0x01, + 0x05, 0x01, 0x2c, 0x2b, 0x02, 0x03, 0x05, 0x16, 0x01, 0x02, 0x04, 0x03, + 0x1e, 0x00, 0x03, 0x05, 0x04, 0x05, 0x03, 0x04, 0x32, 0x00, 0x01, 0x00, + 0x05, 0x03, 0x01, 0x05, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x24, 0x00, 0x06, 0x06, 0x0b, 0x1f, 0x00, 0x04, 0x04, 0x02, 0x01, + 0x00, 0x24, 0x00, 0x02, 0x02, 0x12, 0x02, 0x20, 0x07, 0x1b, 0x4b, 0xb0, + 0x6c, 0x50, 0x58, 0x40, 0x39, 0x05, 0x01, 0x05, 0x01, 0x2c, 0x2b, 0x02, + 0x03, 0x05, 0x16, 0x01, 0x02, 0x04, 0x03, 0x1e, 0x00, 0x03, 0x05, 0x04, + 0x05, 0x03, 0x04, 0x32, 0x00, 0x06, 0x00, 0x00, 0x01, 0x06, 0x00, 0x01, + 0x00, 0x26, 0x00, 0x01, 0x00, 0x05, 0x03, 0x01, 0x05, 0x01, 0x00, 0x26, + 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x02, + 0x20, 0x06, 0x1b, 0x40, 0x42, 0x05, 0x01, 0x05, 0x01, 0x2c, 0x2b, 0x02, + 0x03, 0x05, 0x16, 0x01, 0x02, 0x04, 0x03, 0x1e, 0x00, 0x03, 0x05, 0x04, + 0x05, 0x03, 0x04, 0x32, 0x00, 0x06, 0x00, 0x00, 0x01, 0x06, 0x00, 0x01, + 0x00, 0x26, 0x00, 0x01, 0x00, 0x05, 0x03, 0x01, 0x05, 0x01, 0x00, 0x26, + 0x00, 0x04, 0x02, 0x02, 0x04, 0x01, 0x00, 0x23, 0x00, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x04, 0x02, 0x01, 0x00, 0x21, 0x07, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x14, 0x06, 0x23, 0x21, 0x03, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x27, + 0x37, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x27, 0x13, 0x21, 0x03, 0xd2, 0x30, + 0x39, 0xfe, 0x3e, 0x42, 0x70, 0x5f, 0x70, 0xab, 0x74, 0x3b, 0x50, 0x8b, + 0xbc, 0x6d, 0x3f, 0x74, 0x64, 0x56, 0x21, 0x36, 0x12, 0x1e, 0x13, 0x33, + 0x48, 0x61, 0x43, 0x4b, 0x78, 0x55, 0x2e, 0x27, 0x4f, 0x76, 0x4f, 0x36, + 0x74, 0x3e, 0x70, 0x74, 0x02, 0xa7, 0x05, 0x4b, 0x26, 0x31, 0xfe, 0x88, + 0x18, 0x42, 0x74, 0x9e, 0x5d, 0x72, 0xb8, 0x83, 0x46, 0x19, 0x2a, 0x36, + 0x1e, 0x4c, 0x1a, 0x1f, 0x26, 0x1f, 0x30, 0x59, 0x7c, 0x4d, 0x43, 0x6c, + 0x4c, 0x2a, 0x12, 0x14, 0x21, 0x02, 0x9e, 0x00, 0x00, 0x02, 0x00, 0x6c, + 0xff, 0xf0, 0x04, 0x32, 0x05, 0x99, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x9f, + 0x40, 0x10, 0x01, 0x00, 0x2b, 0x29, 0x21, 0x1f, 0x17, 0x15, 0x0b, 0x09, + 0x00, 0x1a, 0x01, 0x1a, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x24, 0x18, 0x01, 0x04, 0x00, 0x01, 0x1e, 0x05, 0x01, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x04, 0x01, 0x00, 0x26, 0x00, 0x02, 0x02, 0x0b, 0x1f, + 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x12, 0x01, + 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x24, 0x18, 0x01, + 0x04, 0x00, 0x01, 0x1e, 0x00, 0x02, 0x00, 0x02, 0x34, 0x05, 0x01, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x04, 0x01, 0x00, 0x26, 0x00, 0x03, 0x03, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, 0x20, 0x05, 0x1b, 0x40, + 0x2d, 0x18, 0x01, 0x04, 0x00, 0x01, 0x1e, 0x00, 0x02, 0x00, 0x02, 0x34, + 0x05, 0x01, 0x00, 0x00, 0x04, 0x03, 0x00, 0x04, 0x01, 0x00, 0x26, 0x00, + 0x03, 0x01, 0x01, 0x03, 0x01, 0x00, 0x23, 0x00, 0x03, 0x03, 0x01, 0x01, + 0x00, 0x24, 0x00, 0x01, 0x03, 0x01, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, + 0x01, 0x3e, 0x01, 0x01, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x02, 0x8a, 0x56, 0x9a, 0x74, + 0x44, 0x48, 0x81, 0xb6, 0x6d, 0x6c, 0xaf, 0x7c, 0x43, 0x54, 0x5b, 0x01, + 0x6b, 0x0e, 0x32, 0x20, 0x9e, 0xfe, 0x0f, 0x33, 0x7c, 0xfe, 0xd6, 0x28, + 0x4d, 0x6f, 0x47, 0x48, 0x74, 0x53, 0x2d, 0x2c, 0x50, 0x70, 0x43, 0x48, + 0x74, 0x51, 0x2b, 0x03, 0x6e, 0x39, 0x6d, 0x9f, 0x66, 0x63, 0xaa, 0x7e, + 0x48, 0x45, 0x7f, 0xb5, 0x70, 0x5e, 0xd4, 0x7a, 0x01, 0xe9, 0x12, 0x19, + 0xfd, 0x8b, 0x23, 0x27, 0xfe, 0x4c, 0x45, 0x72, 0x52, 0x2d, 0x2e, 0x52, + 0x70, 0x42, 0x46, 0x71, 0x4f, 0x2a, 0x31, 0x53, 0x6d, 0x00, 0x00, 0x01, + 0x00, 0x6e, 0x00, 0x00, 0x04, 0x3c, 0x05, 0x99, 0x00, 0x12, 0x00, 0x6a, + 0x40, 0x0c, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x0f, 0x0d, 0x09, 0x07, + 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x14, 0x00, 0x01, + 0x01, 0x02, 0x00, 0x00, 0x24, 0x03, 0x01, 0x02, 0x02, 0x0b, 0x1f, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x12, 0x03, 0x01, 0x02, 0x00, 0x01, 0x00, 0x02, 0x01, 0x01, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x02, 0x1b, 0x40, 0x1e, 0x00, + 0x00, 0x01, 0x00, 0x35, 0x03, 0x01, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, + 0x23, 0x03, 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x02, + 0x01, 0x01, 0x00, 0x21, 0x04, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x15, + 0x14, 0x06, 0x07, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x3e, 0x01, 0x37, + 0x21, 0x22, 0x26, 0x3d, 0x01, 0x04, 0x3c, 0x0f, 0x08, 0xfd, 0xaf, 0x0d, + 0x2e, 0x27, 0x7f, 0x02, 0x5a, 0x0d, 0x1b, 0x11, 0xfd, 0x14, 0x11, 0x1b, + 0x05, 0x99, 0x50, 0x22, 0x2c, 0x0f, 0xfb, 0x53, 0x1a, 0x25, 0x04, 0x9e, + 0x19, 0x2a, 0x13, 0x1b, 0x11, 0x79, 0x00, 0x03, 0x00, 0x60, 0xff, 0xf0, + 0x04, 0x26, 0x05, 0xa9, 0x00, 0x1f, 0x00, 0x33, 0x00, 0x47, 0x00, 0xc4, + 0x40, 0x1a, 0x35, 0x34, 0x21, 0x20, 0x01, 0x00, 0x3f, 0x3d, 0x34, 0x47, + 0x35, 0x47, 0x2b, 0x29, 0x20, 0x33, 0x21, 0x33, 0x11, 0x0f, 0x00, 0x1f, + 0x01, 0x1f, 0x09, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2e, + 0x18, 0x08, 0x02, 0x03, 0x04, 0x01, 0x1e, 0x08, 0x01, 0x04, 0x00, 0x03, + 0x02, 0x04, 0x03, 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x01, 0x11, 0x1f, 0x07, 0x01, 0x02, 0x02, 0x00, 0x01, + 0x00, 0x24, 0x06, 0x01, 0x00, 0x00, 0x12, 0x00, 0x20, 0x06, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x2c, 0x18, 0x08, 0x02, 0x03, 0x04, 0x01, + 0x1e, 0x00, 0x01, 0x00, 0x05, 0x04, 0x01, 0x05, 0x01, 0x00, 0x26, 0x08, + 0x01, 0x04, 0x00, 0x03, 0x02, 0x04, 0x03, 0x01, 0x00, 0x26, 0x07, 0x01, + 0x02, 0x02, 0x00, 0x01, 0x00, 0x24, 0x06, 0x01, 0x00, 0x00, 0x15, 0x00, + 0x20, 0x05, 0x1b, 0x40, 0x36, 0x18, 0x08, 0x02, 0x03, 0x04, 0x01, 0x1e, + 0x00, 0x01, 0x00, 0x05, 0x04, 0x01, 0x05, 0x01, 0x00, 0x26, 0x08, 0x01, + 0x04, 0x00, 0x03, 0x02, 0x04, 0x03, 0x01, 0x00, 0x26, 0x07, 0x01, 0x02, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x23, 0x07, 0x01, 0x02, 0x02, 0x00, 0x01, + 0x00, 0x24, 0x06, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x21, 0x06, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x05, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, + 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x27, 0x32, 0x3e, 0x02, + 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, + 0x13, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, + 0x15, 0x14, 0x1e, 0x02, 0x02, 0x43, 0x6b, 0xb2, 0x80, 0x46, 0x90, 0x86, + 0x71, 0x73, 0x3e, 0x72, 0x9f, 0x62, 0x61, 0xa0, 0x72, 0x3e, 0x74, 0x70, + 0x86, 0x90, 0x47, 0x7f, 0xb2, 0x6b, 0x46, 0x6f, 0x4d, 0x29, 0x31, 0x53, + 0x6c, 0x3b, 0x3b, 0x6c, 0x53, 0x31, 0x29, 0x4d, 0x6f, 0x46, 0x46, 0x63, + 0x3e, 0x1c, 0x21, 0x41, 0x61, 0x40, 0x40, 0x61, 0x41, 0x21, 0x1c, 0x3e, + 0x63, 0x10, 0x39, 0x6a, 0x97, 0x5e, 0x8a, 0xb3, 0x26, 0x2a, 0xa7, 0x74, + 0x4f, 0x8a, 0x66, 0x3a, 0x3a, 0x66, 0x8a, 0x4f, 0x74, 0xa7, 0x2a, 0x26, + 0xb3, 0x8a, 0x5e, 0x97, 0x6a, 0x39, 0x8e, 0x27, 0x47, 0x63, 0x3c, 0x4a, + 0x69, 0x42, 0x1f, 0x1f, 0x42, 0x69, 0x4a, 0x3c, 0x63, 0x47, 0x27, 0x02, + 0xb0, 0x2b, 0x47, 0x5c, 0x31, 0x32, 0x58, 0x42, 0x26, 0x26, 0x42, 0x58, + 0x32, 0x31, 0x5c, 0x47, 0x2b, 0x00, 0x00, 0x02, 0x00, 0x94, 0x00, 0x00, + 0x04, 0x36, 0x05, 0xa9, 0x00, 0x1f, 0x00, 0x33, 0x00, 0x9d, 0x40, 0x10, + 0x01, 0x00, 0x30, 0x2e, 0x26, 0x24, 0x19, 0x17, 0x0b, 0x09, 0x00, 0x1f, + 0x01, 0x1f, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x24, + 0x1d, 0x01, 0x00, 0x04, 0x01, 0x1e, 0x00, 0x04, 0x05, 0x01, 0x00, 0x02, + 0x04, 0x00, 0x01, 0x00, 0x26, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, + 0x00, 0x01, 0x01, 0x11, 0x1f, 0x00, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x05, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x22, 0x1d, 0x01, 0x00, 0x04, + 0x01, 0x1e, 0x00, 0x01, 0x00, 0x03, 0x04, 0x01, 0x03, 0x01, 0x00, 0x26, + 0x00, 0x04, 0x05, 0x01, 0x00, 0x02, 0x04, 0x00, 0x01, 0x00, 0x26, 0x00, + 0x02, 0x02, 0x0f, 0x02, 0x20, 0x04, 0x1b, 0x40, 0x2d, 0x1d, 0x01, 0x00, + 0x04, 0x01, 0x1e, 0x00, 0x02, 0x00, 0x02, 0x35, 0x00, 0x01, 0x00, 0x03, + 0x04, 0x01, 0x03, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x00, 0x04, 0x01, + 0x00, 0x23, 0x00, 0x04, 0x04, 0x00, 0x01, 0x00, 0x24, 0x05, 0x01, 0x00, + 0x04, 0x00, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x07, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x3e, 0x01, + 0x37, 0x0e, 0x01, 0x01, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x02, 0x25, 0x51, 0x91, 0x6e, + 0x41, 0x46, 0x7e, 0xae, 0x68, 0x67, 0xa8, 0x78, 0x41, 0x17, 0x2c, 0x3d, + 0x27, 0xfe, 0xa3, 0x0d, 0x30, 0x1f, 0xa4, 0x01, 0xb4, 0x16, 0x26, 0x11, + 0x37, 0x8a, 0x01, 0x19, 0x2b, 0x4c, 0x69, 0x3f, 0x42, 0x6d, 0x4d, 0x2a, + 0x27, 0x49, 0x69, 0x41, 0x48, 0x6f, 0x4c, 0x28, 0x02, 0x4c, 0x36, 0x69, + 0x99, 0x63, 0x5e, 0xa4, 0x7a, 0x46, 0x44, 0x7a, 0xaa, 0x67, 0x3e, 0x6f, + 0x6a, 0x69, 0x38, 0xfe, 0x08, 0x13, 0x17, 0x02, 0x3b, 0x1d, 0x34, 0x1a, + 0x2c, 0x2e, 0x01, 0xa3, 0x43, 0x6d, 0x4c, 0x29, 0x2b, 0x4c, 0x6a, 0x3f, + 0x44, 0x6b, 0x4a, 0x26, 0x2f, 0x4e, 0x66, 0x00, 0x00, 0x02, 0x00, 0x80, + 0xff, 0xf1, 0x01, 0x79, 0x03, 0xda, 0x00, 0x13, 0x00, 0x27, 0x00, 0x98, + 0x40, 0x0a, 0x24, 0x22, 0x1a, 0x18, 0x10, 0x0e, 0x06, 0x04, 0x04, 0x07, + 0x2b, 0x4b, 0xb0, 0x24, 0x50, 0x58, 0x40, 0x1a, 0x00, 0x03, 0x03, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x0e, 0x1f, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x12, 0x01, 0x20, 0x04, 0x1b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x18, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, + 0x03, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x12, 0x01, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x18, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x03, 0x01, 0x00, 0x26, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, + 0x20, 0x03, 0x1b, 0x40, 0x21, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x03, + 0x01, 0x00, 0x26, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x23, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x21, 0x04, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x37, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, + 0x11, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x2e, 0x02, 0x80, 0x13, 0x21, 0x2e, 0x1a, 0x1a, 0x2e, 0x22, + 0x13, 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, 0x21, 0x13, 0x13, 0x21, 0x2e, + 0x1a, 0x1a, 0x2e, 0x22, 0x13, 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, 0x21, + 0x13, 0x6e, 0x1a, 0x2e, 0x22, 0x14, 0x14, 0x22, 0x2e, 0x1a, 0x1b, 0x2d, + 0x22, 0x13, 0x13, 0x22, 0x2d, 0x03, 0x09, 0x1a, 0x2e, 0x22, 0x14, 0x14, + 0x22, 0x2e, 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, 0x2d, 0x00, 0x02, + 0x00, 0x80, 0xfe, 0xf1, 0x01, 0x79, 0x03, 0xda, 0x00, 0x1e, 0x00, 0x32, + 0x00, 0xa8, 0x40, 0x0a, 0x2f, 0x2d, 0x25, 0x23, 0x1b, 0x19, 0x06, 0x04, + 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x24, 0x50, 0x58, 0x40, 0x1e, 0x0f, 0x01, + 0x01, 0x1b, 0x00, 0x03, 0x03, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, + 0x0e, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, + 0x0c, 0x01, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1c, + 0x0f, 0x01, 0x01, 0x1b, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x03, 0x01, + 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, + 0x0c, 0x01, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x1c, + 0x0f, 0x01, 0x01, 0x1b, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x03, 0x01, + 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, + 0x0f, 0x01, 0x20, 0x04, 0x1b, 0x40, 0x25, 0x0f, 0x01, 0x01, 0x1b, 0x00, + 0x02, 0x00, 0x03, 0x00, 0x02, 0x03, 0x01, 0x00, 0x26, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, + 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x21, 0x05, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x27, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x03, 0x37, 0x23, + 0x22, 0x2e, 0x02, 0x03, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x86, 0x11, 0x1f, 0x2c, 0x1a, + 0x1e, 0x2f, 0x1f, 0x10, 0x1a, 0x30, 0x47, 0x2d, 0x1e, 0x0d, 0x0e, 0x0a, + 0x1f, 0x20, 0x1b, 0x06, 0x0d, 0x1a, 0x2a, 0x1f, 0x11, 0x06, 0x13, 0x21, + 0x2e, 0x1a, 0x1a, 0x2e, 0x22, 0x13, 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, + 0x21, 0x13, 0x7b, 0x17, 0x29, 0x1f, 0x12, 0x16, 0x27, 0x33, 0x1e, 0x2d, + 0x61, 0x5f, 0x5a, 0x26, 0x1d, 0x0c, 0x10, 0x0d, 0x0e, 0x0b, 0x25, 0x30, + 0x3a, 0x21, 0x12, 0x21, 0x2d, 0x02, 0xfc, 0x1a, 0x2e, 0x22, 0x14, 0x14, + 0x22, 0x2e, 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, 0x2d, 0x00, 0x01, + 0x00, 0x94, 0x00, 0xea, 0x03, 0x9a, 0x04, 0x57, 0x00, 0x12, 0x00, 0x07, + 0x40, 0x04, 0x01, 0x11, 0x01, 0x0b, 0x2b, 0x13, 0x01, 0x15, 0x14, 0x06, + 0x07, 0x05, 0x0e, 0x01, 0x07, 0x1e, 0x01, 0x17, 0x05, 0x1e, 0x01, 0x1d, + 0x01, 0x01, 0x94, 0x03, 0x06, 0x10, 0x14, 0xfe, 0x3f, 0x14, 0x2d, 0x19, + 0x19, 0x2d, 0x14, 0x01, 0xc1, 0x14, 0x10, 0xfc, 0xfa, 0x02, 0xc6, 0x01, + 0x91, 0x7f, 0x11, 0x19, 0x0a, 0xe4, 0x0b, 0x0f, 0x06, 0x05, 0x10, 0x0a, + 0xe3, 0x0a, 0x1a, 0x10, 0x80, 0x01, 0x92, 0x00, 0x00, 0x02, 0x00, 0x96, + 0x01, 0xb7, 0x03, 0xf1, 0x03, 0x8d, 0x00, 0x03, 0x00, 0x07, 0x00, 0x33, + 0x40, 0x0a, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x04, 0x07, + 0x2b, 0x40, 0x21, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x03, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x04, + 0xb0, 0x38, 0x2b, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x96, + 0x03, 0x5b, 0xfc, 0xa5, 0x03, 0x5b, 0xfc, 0xa5, 0x02, 0x3e, 0x87, 0x01, + 0xd6, 0x87, 0x00, 0x01, 0x00, 0xee, 0x00, 0xea, 0x03, 0xf3, 0x04, 0x57, + 0x00, 0x12, 0x00, 0x07, 0x40, 0x04, 0x10, 0x00, 0x01, 0x0b, 0x2b, 0x37, + 0x35, 0x34, 0x36, 0x37, 0x25, 0x3e, 0x01, 0x37, 0x2e, 0x01, 0x27, 0x25, + 0x2e, 0x01, 0x3d, 0x01, 0x01, 0x15, 0xee, 0x10, 0x14, 0x01, 0xc1, 0x14, + 0x2b, 0x19, 0x19, 0x2b, 0x14, 0xfe, 0x3f, 0x14, 0x10, 0x03, 0x05, 0xea, + 0x80, 0x10, 0x1a, 0x0a, 0xe3, 0x0a, 0x10, 0x05, 0x06, 0x0f, 0x0b, 0xe4, + 0x0a, 0x19, 0x11, 0x7f, 0xfe, 0x6f, 0x4a, 0x00, 0x00, 0x02, 0x00, 0x22, + 0xff, 0xf1, 0x02, 0xf8, 0x05, 0xa9, 0x00, 0x28, 0x00, 0x3c, 0x00, 0xc6, + 0x40, 0x0e, 0x39, 0x37, 0x2f, 0x2d, 0x27, 0x25, 0x22, 0x20, 0x13, 0x12, + 0x06, 0x04, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x33, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x01, 0x01, 0x03, 0x02, 0x1e, 0x00, 0x03, + 0x02, 0x01, 0x02, 0x03, 0x01, 0x32, 0x00, 0x01, 0x04, 0x02, 0x01, 0x04, + 0x30, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x11, + 0x1f, 0x00, 0x04, 0x04, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x05, 0x12, + 0x05, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x31, 0x00, + 0x01, 0x02, 0x00, 0x14, 0x01, 0x01, 0x03, 0x02, 0x1e, 0x00, 0x03, 0x02, + 0x01, 0x02, 0x03, 0x01, 0x32, 0x00, 0x01, 0x04, 0x02, 0x01, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x02, 0x01, 0x00, 0x26, 0x00, 0x04, + 0x04, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x05, 0x15, 0x05, 0x20, 0x06, + 0x1b, 0x40, 0x3a, 0x00, 0x01, 0x02, 0x00, 0x14, 0x01, 0x01, 0x03, 0x02, + 0x1e, 0x00, 0x03, 0x02, 0x01, 0x02, 0x03, 0x01, 0x32, 0x00, 0x01, 0x04, + 0x02, 0x01, 0x04, 0x30, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x02, 0x01, + 0x00, 0x26, 0x00, 0x04, 0x05, 0x05, 0x04, 0x01, 0x00, 0x23, 0x00, 0x04, + 0x04, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x04, 0x05, 0x01, 0x00, 0x21, + 0x07, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x3e, 0x03, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x0e, 0x04, 0x0f, 0x01, 0x23, 0x27, 0x35, 0x34, 0x3e, + 0x04, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x23, 0x22, 0x27, + 0x13, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x2e, 0x02, 0x22, 0x1f, 0x4b, 0x59, 0x67, 0x3c, 0x4f, 0x87, + 0x62, 0x38, 0x2d, 0x45, 0x52, 0x47, 0x33, 0x04, 0x12, 0x7a, 0x0c, 0x2d, + 0x45, 0x4f, 0x45, 0x2d, 0x22, 0x3a, 0x4f, 0x2d, 0x3d, 0x57, 0x3c, 0x25, + 0x0c, 0x19, 0x0e, 0x95, 0x13, 0x21, 0x2e, 0x1a, 0x1a, 0x2e, 0x22, 0x13, + 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, 0x21, 0x13, 0x05, 0x19, 0x1d, 0x34, + 0x28, 0x17, 0x2e, 0x54, 0x78, 0x4b, 0x4c, 0x6e, 0x53, 0x3d, 0x36, 0x36, + 0x21, 0x99, 0xa6, 0x0b, 0x2a, 0x41, 0x39, 0x39, 0x45, 0x58, 0x3c, 0x2b, + 0x46, 0x31, 0x1a, 0x1e, 0x24, 0x1e, 0x17, 0xfb, 0xa0, 0x1a, 0x2e, 0x22, + 0x14, 0x14, 0x22, 0x2e, 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, 0x2d, + 0x00, 0x02, 0x00, 0x56, 0xff, 0x11, 0x06, 0x1c, 0x05, 0x4f, 0x00, 0x51, + 0x00, 0x61, 0x01, 0x39, 0x40, 0x20, 0x53, 0x52, 0x01, 0x00, 0x5b, 0x59, + 0x52, 0x61, 0x53, 0x61, 0x47, 0x45, 0x3b, 0x39, 0x35, 0x33, 0x30, 0x2e, + 0x26, 0x24, 0x1c, 0x1a, 0x11, 0x0f, 0x07, 0x05, 0x00, 0x51, 0x01, 0x51, + 0x0d, 0x07, 0x2b, 0x4b, 0xb0, 0x43, 0x50, 0x58, 0x40, 0x50, 0x13, 0x01, + 0x0a, 0x02, 0x58, 0x03, 0x02, 0x03, 0x0a, 0x37, 0x01, 0x05, 0x06, 0x03, + 0x1e, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x05, 0x32, 0x00, 0x08, 0x00, + 0x04, 0x02, 0x08, 0x04, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x0a, 0x03, + 0x02, 0x0a, 0x01, 0x00, 0x26, 0x0c, 0x09, 0x02, 0x03, 0x01, 0x0b, 0x02, + 0x00, 0x06, 0x03, 0x00, 0x01, 0x00, 0x26, 0x00, 0x05, 0x07, 0x07, 0x05, + 0x01, 0x00, 0x23, 0x00, 0x05, 0x05, 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, + 0x05, 0x07, 0x01, 0x00, 0x21, 0x08, 0x1b, 0x4b, 0xb0, 0xc7, 0x50, 0x58, + 0x40, 0x57, 0x13, 0x01, 0x0a, 0x02, 0x58, 0x03, 0x02, 0x09, 0x0a, 0x37, + 0x01, 0x05, 0x06, 0x03, 0x1e, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x05, + 0x32, 0x00, 0x08, 0x00, 0x04, 0x02, 0x08, 0x04, 0x01, 0x00, 0x26, 0x00, + 0x02, 0x00, 0x0a, 0x09, 0x02, 0x0a, 0x01, 0x00, 0x26, 0x0c, 0x01, 0x09, + 0x03, 0x00, 0x09, 0x01, 0x00, 0x23, 0x00, 0x03, 0x01, 0x0b, 0x02, 0x00, + 0x06, 0x03, 0x00, 0x01, 0x00, 0x26, 0x00, 0x05, 0x07, 0x07, 0x05, 0x01, + 0x00, 0x23, 0x00, 0x05, 0x05, 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x05, + 0x07, 0x01, 0x00, 0x21, 0x09, 0x1b, 0x40, 0x58, 0x13, 0x01, 0x0a, 0x02, + 0x58, 0x03, 0x02, 0x09, 0x0a, 0x37, 0x01, 0x05, 0x06, 0x03, 0x1e, 0x00, + 0x06, 0x00, 0x05, 0x00, 0x06, 0x05, 0x32, 0x00, 0x08, 0x00, 0x04, 0x02, + 0x08, 0x04, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x0a, 0x09, 0x02, 0x0a, + 0x01, 0x00, 0x26, 0x0c, 0x01, 0x09, 0x00, 0x01, 0x00, 0x09, 0x01, 0x01, + 0x00, 0x26, 0x00, 0x03, 0x0b, 0x01, 0x00, 0x06, 0x03, 0x00, 0x01, 0x00, + 0x26, 0x00, 0x05, 0x07, 0x07, 0x05, 0x01, 0x00, 0x23, 0x00, 0x05, 0x05, + 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x05, 0x07, 0x01, 0x00, 0x21, 0x09, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x25, 0x22, 0x26, 0x27, 0x0e, 0x01, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x03, + 0x06, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, + 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x12, 0x1e, 0x01, 0x33, 0x32, + 0x36, 0x37, 0x36, 0x33, 0x32, 0x1f, 0x01, 0x06, 0x04, 0x23, 0x22, 0x24, + 0x26, 0x02, 0x35, 0x34, 0x3e, 0x04, 0x33, 0x32, 0x1e, 0x04, 0x15, 0x14, + 0x0e, 0x02, 0x25, 0x32, 0x3e, 0x02, 0x37, 0x13, 0x26, 0x23, 0x22, 0x0e, + 0x02, 0x15, 0x14, 0x16, 0x04, 0x8f, 0x4e, 0x62, 0x0d, 0x3a, 0x88, 0x4e, + 0x3c, 0x58, 0x3b, 0x1d, 0x41, 0x80, 0xbf, 0x7d, 0x43, 0x65, 0x2d, 0x5d, + 0x13, 0x12, 0x1f, 0x29, 0x17, 0x31, 0x58, 0x43, 0x27, 0x59, 0x9b, 0xd3, + 0x7a, 0x86, 0xea, 0xae, 0x64, 0x6b, 0xb9, 0xf9, 0x8f, 0x98, 0xe9, 0x55, + 0x0f, 0x0c, 0x15, 0x0a, 0x19, 0x6b, 0xfe, 0xef, 0xad, 0xad, 0xfe, 0xd6, + 0xdb, 0x7d, 0x37, 0x64, 0x8c, 0xac, 0xc6, 0x6c, 0x5c, 0xb0, 0x9d, 0x84, + 0x5f, 0x35, 0x3d, 0x6b, 0x91, 0xfe, 0x02, 0x1f, 0x3f, 0x3b, 0x31, 0x11, + 0x4c, 0x27, 0x2e, 0x4b, 0x7d, 0x5a, 0x33, 0x42, 0xba, 0x4b, 0x4e, 0x51, + 0x46, 0x29, 0x49, 0x64, 0x3a, 0x55, 0xad, 0x8b, 0x58, 0x15, 0x14, 0xfe, + 0x97, 0x4b, 0x31, 0x24, 0x2f, 0x1b, 0x0a, 0x38, 0x66, 0x8f, 0x57, 0x8a, + 0xd0, 0x8b, 0x45, 0x66, 0xb4, 0xf6, 0x91, 0xaa, 0xfe, 0xff, 0xae, 0x58, + 0x42, 0x33, 0x09, 0x18, 0x42, 0x48, 0x52, 0x6e, 0xcf, 0x01, 0x2c, 0xbe, + 0x6d, 0xca, 0xaf, 0x91, 0x67, 0x39, 0x28, 0x4e, 0x73, 0x95, 0xb7, 0x6b, + 0x6c, 0xb7, 0x86, 0x4c, 0x78, 0x14, 0x32, 0x56, 0x41, 0x01, 0x27, 0x09, + 0x3f, 0x66, 0x84, 0x45, 0x48, 0x57, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, + 0x05, 0x49, 0x05, 0x99, 0x00, 0x0d, 0x00, 0x15, 0x00, 0xbf, 0x40, 0x0c, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x09, 0x06, 0x05, 0x02, 0x00, 0x05, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1d, 0x12, 0x01, 0x04, 0x03, + 0x01, 0x1e, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0x00, 0x02, 0x26, + 0x00, 0x03, 0x03, 0x0b, 0x1f, 0x02, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x20, + 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x1d, 0x12, 0x01, 0x04, + 0x03, 0x01, 0x1e, 0x00, 0x03, 0x04, 0x03, 0x34, 0x00, 0x04, 0x00, 0x01, + 0x00, 0x04, 0x01, 0x00, 0x02, 0x26, 0x02, 0x01, 0x00, 0x00, 0x0f, 0x00, + 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x28, 0x12, 0x01, + 0x04, 0x03, 0x01, 0x1e, 0x00, 0x03, 0x04, 0x03, 0x34, 0x02, 0x01, 0x00, + 0x01, 0x00, 0x35, 0x00, 0x04, 0x01, 0x01, 0x04, 0x00, 0x00, 0x23, 0x00, + 0x04, 0x04, 0x01, 0x00, 0x02, 0x24, 0x00, 0x01, 0x04, 0x01, 0x00, 0x02, + 0x21, 0x06, 0x1b, 0x40, 0x2e, 0x12, 0x01, 0x04, 0x03, 0x01, 0x1e, 0x00, + 0x03, 0x04, 0x03, 0x34, 0x00, 0x02, 0x01, 0x00, 0x01, 0x02, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x33, 0x00, 0x04, 0x01, 0x01, 0x04, 0x00, 0x00, 0x23, + 0x00, 0x04, 0x04, 0x01, 0x00, 0x02, 0x24, 0x00, 0x01, 0x04, 0x01, 0x00, + 0x02, 0x21, 0x07, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x21, 0x23, 0x22, + 0x26, 0x27, 0x03, 0x21, 0x03, 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x33, 0x01, + 0x21, 0x03, 0x26, 0x27, 0x0e, 0x01, 0x07, 0x05, 0x49, 0x96, 0x1a, 0x20, + 0x08, 0x86, 0xfd, 0x7d, 0x86, 0x07, 0x22, 0x19, 0x96, 0x02, 0x3d, 0xc5, + 0xfe, 0x92, 0x02, 0x17, 0xe1, 0x16, 0x15, 0x0b, 0x15, 0x0a, 0x1a, 0x14, + 0x01, 0x5a, 0xfe, 0xa6, 0x12, 0x1c, 0x05, 0x99, 0xfc, 0x7b, 0x02, 0x47, + 0x36, 0x51, 0x29, 0x45, 0x1a, 0x00, 0x00, 0x03, 0x00, 0xae, 0x00, 0x00, + 0x04, 0xa0, 0x05, 0x99, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0xb9, + 0x40, 0x16, 0x15, 0x15, 0x00, 0x00, 0x2a, 0x28, 0x22, 0x20, 0x15, 0x1f, + 0x15, 0x1e, 0x18, 0x16, 0x00, 0x14, 0x00, 0x13, 0x03, 0x01, 0x08, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2c, 0x0c, 0x01, 0x03, 0x04, + 0x01, 0x1e, 0x00, 0x04, 0x07, 0x01, 0x03, 0x02, 0x04, 0x03, 0x01, 0x00, + 0x26, 0x00, 0x05, 0x05, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0b, + 0x1f, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x06, 0x01, 0x01, 0x01, + 0x0c, 0x01, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x2a, + 0x0c, 0x01, 0x03, 0x04, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, + 0x05, 0x01, 0x00, 0x26, 0x00, 0x04, 0x07, 0x01, 0x03, 0x02, 0x04, 0x03, + 0x01, 0x00, 0x26, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x06, 0x01, + 0x01, 0x01, 0x0f, 0x01, 0x20, 0x05, 0x1b, 0x40, 0x33, 0x0c, 0x01, 0x03, + 0x04, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x05, 0x01, 0x00, + 0x26, 0x00, 0x04, 0x07, 0x01, 0x03, 0x02, 0x04, 0x03, 0x01, 0x00, 0x26, + 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x01, + 0x01, 0x00, 0x24, 0x06, 0x01, 0x01, 0x02, 0x01, 0x01, 0x00, 0x21, 0x06, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x33, 0x11, 0x21, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x01, + 0x11, 0x21, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, + 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x21, 0xae, 0x01, 0xc9, 0x84, 0xbf, + 0x7b, 0x3b, 0x21, 0x43, 0x65, 0x44, 0x9d, 0xa0, 0x43, 0x81, 0xbb, 0x78, + 0xfe, 0xc7, 0x01, 0x36, 0x53, 0x77, 0x4d, 0x24, 0x9d, 0x9f, 0xfe, 0xcb, + 0x01, 0x00, 0x52, 0x78, 0x4f, 0x26, 0x98, 0xa0, 0xfe, 0xf9, 0x05, 0x99, + 0x34, 0x60, 0x8b, 0x57, 0x35, 0x62, 0x54, 0x42, 0x15, 0x1f, 0xa4, 0x86, + 0x5b, 0x96, 0x6c, 0x3b, 0x02, 0x8d, 0xfe, 0x0d, 0x26, 0x45, 0x5f, 0x39, + 0x6f, 0x81, 0x8a, 0x24, 0x40, 0x5b, 0x36, 0x7e, 0x76, 0x00, 0x00, 0x01, + 0x00, 0x5a, 0xff, 0xf0, 0x05, 0x09, 0x05, 0xa9, 0x00, 0x2e, 0x00, 0xcd, + 0x40, 0x12, 0x01, 0x00, 0x29, 0x27, 0x1f, 0x1d, 0x18, 0x16, 0x11, 0x0f, + 0x07, 0x05, 0x00, 0x2e, 0x01, 0x2e, 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x34, 0x13, 0x01, 0x03, 0x04, 0x03, 0x01, 0x05, 0x00, + 0x02, 0x1e, 0x00, 0x03, 0x04, 0x00, 0x04, 0x03, 0x00, 0x32, 0x06, 0x01, + 0x00, 0x05, 0x04, 0x00, 0x05, 0x30, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, + 0x24, 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x05, 0x05, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x01, 0x12, 0x01, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, + 0x50, 0x58, 0x40, 0x32, 0x13, 0x01, 0x03, 0x04, 0x03, 0x01, 0x05, 0x00, + 0x02, 0x1e, 0x00, 0x03, 0x04, 0x00, 0x04, 0x03, 0x00, 0x32, 0x06, 0x01, + 0x00, 0x05, 0x04, 0x00, 0x05, 0x30, 0x00, 0x02, 0x00, 0x04, 0x03, 0x02, + 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x15, 0x01, 0x20, 0x06, 0x1b, 0x40, 0x3b, 0x13, 0x01, 0x03, + 0x04, 0x03, 0x01, 0x05, 0x00, 0x02, 0x1e, 0x00, 0x03, 0x04, 0x00, 0x04, + 0x03, 0x00, 0x32, 0x06, 0x01, 0x00, 0x05, 0x04, 0x00, 0x05, 0x30, 0x00, + 0x02, 0x00, 0x04, 0x03, 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x01, + 0x01, 0x05, 0x01, 0x00, 0x23, 0x00, 0x05, 0x05, 0x01, 0x01, 0x00, 0x24, + 0x00, 0x01, 0x05, 0x01, 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x01, 0x32, 0x1f, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x02, + 0x35, 0x34, 0x12, 0x36, 0x24, 0x33, 0x32, 0x16, 0x17, 0x07, 0x0e, 0x01, + 0x23, 0x22, 0x2e, 0x04, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, + 0x33, 0x32, 0x3e, 0x02, 0x37, 0x36, 0x04, 0xa0, 0x10, 0x0d, 0x4c, 0x58, + 0xfb, 0xb1, 0x9b, 0xfc, 0xb2, 0x62, 0x69, 0xbe, 0x01, 0x09, 0xa0, 0x9e, + 0xe5, 0x59, 0x3f, 0x07, 0x12, 0x11, 0x0d, 0x1d, 0x28, 0x36, 0x4a, 0x62, + 0x40, 0x73, 0xbf, 0x8a, 0x4d, 0x4d, 0x85, 0xb6, 0x69, 0x40, 0x66, 0x57, + 0x4b, 0x26, 0x11, 0x01, 0x28, 0x0d, 0x53, 0x66, 0x72, 0x6b, 0xc1, 0x01, + 0x0e, 0xa2, 0xa2, 0x01, 0x0e, 0xc2, 0x6b, 0x62, 0x54, 0x59, 0x0a, 0x0d, + 0x13, 0x1c, 0x20, 0x1c, 0x13, 0x4f, 0x92, 0xd2, 0x82, 0x86, 0xd2, 0x91, + 0x4c, 0x0f, 0x20, 0x31, 0x22, 0x0f, 0x00, 0x02, 0x00, 0xae, 0x00, 0x00, + 0x05, 0x88, 0x05, 0x99, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x77, 0x40, 0x0a, + 0x16, 0x14, 0x13, 0x11, 0x09, 0x07, 0x06, 0x04, 0x04, 0x07, 0x2b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1a, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x01, 0x0b, 0x1f, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, + 0x50, 0x58, 0x40, 0x18, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, 0x01, + 0x00, 0x26, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x20, 0x03, 0x1b, 0x40, 0x21, 0x00, 0x01, 0x00, 0x02, 0x03, + 0x01, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x00, 0x00, 0x03, 0x01, 0x00, + 0x23, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x21, 0x04, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x14, 0x02, + 0x06, 0x04, 0x23, 0x21, 0x11, 0x21, 0x32, 0x04, 0x16, 0x12, 0x07, 0x34, + 0x2e, 0x02, 0x23, 0x21, 0x11, 0x21, 0x32, 0x3e, 0x02, 0x05, 0x88, 0x66, + 0xba, 0xfe, 0xfc, 0x9e, 0xfd, 0xe8, 0x02, 0x18, 0x9e, 0x01, 0x04, 0xba, + 0x66, 0xc7, 0x48, 0x84, 0xbc, 0x73, 0xfe, 0xab, 0x01, 0x55, 0x73, 0xbc, + 0x84, 0x48, 0x02, 0xcc, 0xa1, 0xfe, 0xf8, 0xbc, 0x67, 0x05, 0x99, 0x67, + 0xbd, 0xfe, 0xf8, 0xa1, 0x84, 0xd0, 0x90, 0x4c, 0xfb, 0xa1, 0x4c, 0x8f, + 0xd0, 0x00, 0x00, 0x01, 0x00, 0xae, 0x00, 0x00, 0x04, 0x21, 0x05, 0x99, + 0x00, 0x0b, 0x00, 0xa0, 0x40, 0x12, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0b, + 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x07, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x25, 0x00, 0x01, 0x00, 0x02, + 0x03, 0x01, 0x02, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x24, 0x06, 0x01, 0x05, 0x05, 0x0b, 0x1f, 0x00, 0x03, 0x03, 0x04, 0x00, + 0x00, 0x24, 0x00, 0x04, 0x04, 0x0c, 0x04, 0x20, 0x05, 0x1b, 0x4b, 0xb0, + 0x6c, 0x50, 0x58, 0x40, 0x23, 0x06, 0x01, 0x05, 0x00, 0x00, 0x01, 0x05, + 0x00, 0x00, 0x00, 0x26, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, 0x00, + 0x00, 0x26, 0x00, 0x03, 0x03, 0x04, 0x00, 0x00, 0x24, 0x00, 0x04, 0x04, + 0x0f, 0x04, 0x20, 0x04, 0x1b, 0x40, 0x2c, 0x06, 0x01, 0x05, 0x00, 0x00, + 0x01, 0x05, 0x00, 0x00, 0x00, 0x26, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, + 0x02, 0x00, 0x00, 0x26, 0x00, 0x03, 0x04, 0x04, 0x03, 0x00, 0x00, 0x23, + 0x00, 0x03, 0x03, 0x04, 0x00, 0x00, 0x24, 0x00, 0x04, 0x03, 0x04, 0x00, + 0x00, 0x21, 0x05, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x15, 0x21, 0x11, + 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x04, 0x21, 0xfd, 0x50, + 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0xb0, 0xfc, 0x8d, 0x05, 0x99, 0x9e, 0xfe, + 0x24, 0x98, 0xfe, 0x17, 0x9e, 0x05, 0x99, 0x00, 0x00, 0x01, 0x00, 0xae, + 0x00, 0x00, 0x04, 0x21, 0x05, 0x99, 0x00, 0x09, 0x00, 0x8b, 0x40, 0x10, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1e, + 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, 0x00, 0x00, 0x26, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x0b, 0x1f, 0x00, + 0x03, 0x03, 0x0c, 0x03, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x1c, 0x05, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, 0x00, 0x00, 0x26, 0x00, + 0x03, 0x03, 0x0f, 0x03, 0x20, 0x03, 0x1b, 0x40, 0x27, 0x00, 0x03, 0x02, + 0x03, 0x35, 0x05, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x01, 0x01, + 0x02, 0x00, 0x00, 0x24, 0x00, 0x02, 0x01, 0x02, 0x00, 0x00, 0x21, 0x05, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, + 0x11, 0x23, 0x11, 0x04, 0x21, 0xfd, 0x50, 0x02, 0x4c, 0xfd, 0xb4, 0xc3, + 0x05, 0x99, 0x9e, 0xfe, 0x0b, 0x9e, 0xfd, 0x98, 0x05, 0x99, 0x00, 0x01, + 0x00, 0x5a, 0xff, 0xf0, 0x05, 0x40, 0x05, 0xa9, 0x00, 0x34, 0x00, 0xe5, + 0x40, 0x14, 0x01, 0x00, 0x2c, 0x2a, 0x25, 0x23, 0x1d, 0x1b, 0x13, 0x11, + 0x0c, 0x0b, 0x08, 0x06, 0x00, 0x34, 0x01, 0x34, 0x08, 0x07, 0x2b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x3b, 0x21, 0x01, 0x05, 0x06, 0x05, 0x01, + 0x00, 0x01, 0x0d, 0x01, 0x03, 0x00, 0x03, 0x1e, 0x00, 0x05, 0x06, 0x02, + 0x06, 0x05, 0x02, 0x32, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x01, 0x01, + 0x00, 0x26, 0x00, 0x06, 0x06, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x04, + 0x11, 0x1f, 0x07, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, + 0x03, 0x12, 0x03, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, + 0x39, 0x21, 0x01, 0x05, 0x06, 0x05, 0x01, 0x00, 0x01, 0x0d, 0x01, 0x03, + 0x00, 0x03, 0x1e, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x02, 0x32, 0x00, + 0x04, 0x00, 0x06, 0x05, 0x04, 0x06, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x02, 0x01, 0x01, 0x00, 0x26, 0x07, 0x01, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x15, 0x03, 0x20, 0x06, 0x1b, 0x40, + 0x43, 0x21, 0x01, 0x05, 0x06, 0x05, 0x01, 0x00, 0x01, 0x0d, 0x01, 0x03, + 0x00, 0x03, 0x1e, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x02, 0x32, 0x00, + 0x04, 0x00, 0x06, 0x05, 0x04, 0x06, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x02, 0x01, 0x01, 0x00, 0x26, 0x07, 0x01, 0x00, 0x03, 0x03, + 0x00, 0x01, 0x00, 0x23, 0x07, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x24, + 0x00, 0x03, 0x00, 0x03, 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x25, 0x32, 0x3e, 0x02, 0x37, 0x11, 0x23, 0x22, 0x26, 0x3d, 0x01, + 0x21, 0x11, 0x0e, 0x03, 0x23, 0x22, 0x24, 0x26, 0x02, 0x35, 0x34, 0x12, + 0x36, 0x24, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x06, 0x23, 0x22, 0x27, + 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x03, 0x2d, + 0x3a, 0x61, 0x56, 0x4c, 0x26, 0xde, 0x13, 0x17, 0x01, 0xb8, 0x36, 0x75, + 0x85, 0x98, 0x59, 0x9c, 0xfe, 0xfc, 0xbc, 0x69, 0x67, 0xbf, 0x01, 0x0f, + 0xa8, 0x55, 0x92, 0x7d, 0x6a, 0x2e, 0x37, 0x11, 0x1b, 0x10, 0x13, 0x19, + 0x3e, 0x59, 0x79, 0x53, 0x79, 0xc4, 0x8a, 0x4a, 0x4d, 0x8c, 0xc0, 0x8d, + 0x0b, 0x16, 0x1f, 0x14, 0x01, 0x3c, 0x16, 0x10, 0x6e, 0xfd, 0xda, 0x27, + 0x3a, 0x27, 0x13, 0x6b, 0xc1, 0x01, 0x0e, 0xa2, 0xa4, 0x01, 0x0e, 0xc1, + 0x6a, 0x19, 0x2f, 0x43, 0x2a, 0x58, 0x1b, 0x0b, 0x0e, 0x28, 0x25, 0x1a, + 0x4f, 0x93, 0xd1, 0x82, 0x88, 0xd5, 0x94, 0x4e, 0x00, 0x01, 0x00, 0xae, + 0x00, 0x00, 0x05, 0x38, 0x05, 0x99, 0x00, 0x0b, 0x00, 0xb2, 0x40, 0x0e, + 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x18, 0x00, 0x04, + 0x00, 0x01, 0x00, 0x04, 0x01, 0x00, 0x00, 0x26, 0x05, 0x01, 0x03, 0x03, + 0x0b, 0x1f, 0x02, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x20, 0x03, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x1a, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, + 0x01, 0x00, 0x00, 0x26, 0x05, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x24, + 0x02, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x24, 0x05, 0x01, 0x03, 0x04, 0x00, 0x03, 0x00, 0x00, + 0x23, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0x00, 0x00, 0x26, 0x05, + 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x24, 0x02, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x21, 0x04, 0x1b, 0x40, 0x2b, 0x00, 0x05, 0x04, 0x00, 0x05, + 0x00, 0x00, 0x23, 0x00, 0x04, 0x00, 0x01, 0x02, 0x04, 0x01, 0x00, 0x00, + 0x26, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x02, 0x00, 0x00, 0x26, 0x00, + 0x05, 0x05, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x21, 0x05, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x21, 0x23, 0x11, 0x21, + 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x05, 0x38, 0xc3, 0xfc, + 0xfc, 0xc3, 0xc3, 0x03, 0x04, 0xc3, 0x02, 0x8c, 0xfd, 0x74, 0x05, 0x99, + 0xfd, 0x81, 0x02, 0x7f, 0x00, 0x01, 0x00, 0xd2, 0x00, 0x00, 0x01, 0x94, + 0x05, 0x99, 0x00, 0x03, 0x00, 0x51, 0x40, 0x06, 0x03, 0x02, 0x01, 0x00, + 0x02, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x0c, 0x00, 0x01, + 0x01, 0x0b, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x20, 0x02, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x0e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x02, 0x1b, 0x40, 0x17, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x23, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x21, 0x03, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x21, 0x23, 0x11, 0x33, 0x01, 0x94, 0xc2, 0xc2, 0x05, + 0x99, 0x00, 0x00, 0x01, 0x00, 0x3c, 0xff, 0xf0, 0x02, 0xc9, 0x05, 0x99, + 0x00, 0x17, 0x00, 0xad, 0x40, 0x0a, 0x17, 0x16, 0x11, 0x0f, 0x0e, 0x0c, + 0x06, 0x04, 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x1a, 0x50, 0x58, 0x40, 0x1a, + 0x07, 0x01, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x03, 0x03, 0x0b, 0x1f, 0x02, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x12, 0x00, + 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x21, 0x07, 0x01, + 0x00, 0x02, 0x01, 0x1e, 0x00, 0x01, 0x03, 0x02, 0x03, 0x01, 0x02, 0x32, + 0x00, 0x03, 0x03, 0x0b, 0x1f, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, + 0x58, 0x40, 0x1e, 0x07, 0x01, 0x00, 0x02, 0x01, 0x1e, 0x00, 0x03, 0x01, + 0x03, 0x34, 0x00, 0x01, 0x02, 0x01, 0x34, 0x00, 0x02, 0x02, 0x00, 0x01, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x15, 0x00, 0x20, 0x05, 0x1b, 0x40, 0x27, + 0x07, 0x01, 0x00, 0x02, 0x01, 0x1e, 0x00, 0x03, 0x01, 0x03, 0x34, 0x00, + 0x01, 0x02, 0x01, 0x34, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x23, + 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x27, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, + 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x02, 0xc9, 0x3b, 0x73, 0xa8, + 0x6d, 0x61, 0x69, 0x02, 0x06, 0x03, 0x02, 0x15, 0x15, 0x12, 0x3c, 0x32, + 0x42, 0x67, 0x47, 0x25, 0xc1, 0x01, 0xef, 0x78, 0xbe, 0x83, 0x46, 0x1c, + 0x1d, 0x39, 0x1c, 0x11, 0x15, 0x12, 0x28, 0x54, 0x83, 0x5a, 0x03, 0xae, + 0x00, 0x01, 0x00, 0xc2, 0x00, 0x00, 0x05, 0x3a, 0x05, 0x99, 0x00, 0x22, + 0x00, 0xca, 0x40, 0x0e, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1c, 0x13, 0x11, + 0x09, 0x07, 0x02, 0x00, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x1e, 0x0d, 0x01, 0x03, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x00, 0x03, 0x01, 0x00, 0x26, 0x05, 0x01, 0x01, 0x01, 0x0b, 0x1f, + 0x04, 0x01, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, + 0x50, 0x58, 0x40, 0x20, 0x0d, 0x01, 0x03, 0x00, 0x01, 0x1e, 0x00, 0x00, + 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, 0x26, 0x05, 0x01, 0x01, 0x01, + 0x02, 0x01, 0x00, 0x24, 0x04, 0x01, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x04, + 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x2a, 0x0d, 0x01, 0x03, 0x00, + 0x01, 0x1e, 0x05, 0x01, 0x01, 0x00, 0x02, 0x01, 0x01, 0x00, 0x23, 0x00, + 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, 0x26, 0x05, 0x01, 0x01, + 0x01, 0x02, 0x01, 0x00, 0x24, 0x04, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, + 0x21, 0x05, 0x1b, 0x40, 0x31, 0x0d, 0x01, 0x03, 0x00, 0x01, 0x1e, 0x00, + 0x01, 0x05, 0x02, 0x01, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x03, 0x04, + 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x04, 0x02, 0x05, 0x04, + 0x00, 0x00, 0x26, 0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, + 0x01, 0x02, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, + 0x01, 0x33, 0x32, 0x36, 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x01, 0x0e, + 0x01, 0x07, 0x1e, 0x01, 0x17, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x01, + 0x2e, 0x03, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x33, 0x01, 0x83, 0x49, 0x26, + 0x2d, 0x14, 0x01, 0xdd, 0x16, 0x29, 0x20, 0xa5, 0xfd, 0xde, 0x15, 0x25, + 0x15, 0x1c, 0x2a, 0x17, 0x02, 0x3a, 0xa8, 0x13, 0x1a, 0x13, 0x10, 0x08, + 0xfe, 0x11, 0x0b, 0x13, 0x19, 0x21, 0x18, 0x58, 0xc1, 0xc1, 0x03, 0x25, + 0x13, 0x17, 0x02, 0x1c, 0x19, 0x15, 0xfd, 0x97, 0x17, 0x20, 0x0a, 0x09, + 0x24, 0x1b, 0xfd, 0x59, 0x06, 0x0a, 0x10, 0x09, 0x02, 0x39, 0x0c, 0x11, + 0x0c, 0x05, 0xfd, 0x70, 0x05, 0x99, 0x00, 0x01, 0x00, 0xae, 0x00, 0x00, + 0x03, 0xdc, 0x05, 0x99, 0x00, 0x05, 0x00, 0x64, 0x40, 0x08, 0x05, 0x04, + 0x03, 0x02, 0x01, 0x00, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x13, 0x00, 0x02, 0x02, 0x0b, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x02, 0x24, 0x00, 0x01, 0x01, 0x0c, 0x01, 0x20, 0x03, 0x1b, 0x4b, 0xb0, + 0x6c, 0x50, 0x58, 0x40, 0x13, 0x00, 0x02, 0x00, 0x02, 0x34, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x24, 0x00, 0x01, 0x01, 0x0f, 0x01, 0x20, 0x03, + 0x1b, 0x40, 0x1c, 0x00, 0x02, 0x00, 0x02, 0x34, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x24, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x02, 0x21, 0x04, 0x59, 0x59, 0xb0, 0x38, 0x2b, + 0x25, 0x21, 0x15, 0x21, 0x11, 0x33, 0x01, 0x70, 0x02, 0x6c, 0xfc, 0xd2, + 0xc2, 0xa3, 0xa3, 0x05, 0x99, 0x00, 0x00, 0x01, 0x00, 0xae, 0x00, 0x00, + 0x06, 0x81, 0x05, 0x99, 0x00, 0x23, 0x00, 0xc0, 0x40, 0x0c, 0x20, 0x1e, + 0x1d, 0x1c, 0x16, 0x13, 0x0d, 0x0c, 0x0b, 0x09, 0x05, 0x07, 0x2b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1c, 0x03, 0x01, 0x02, 0x00, 0x01, 0x1e, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x01, 0x32, 0x04, 0x01, 0x00, 0x00, + 0x0b, 0x1f, 0x03, 0x01, 0x01, 0x01, 0x0c, 0x01, 0x20, 0x04, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x1e, 0x03, 0x01, 0x02, 0x00, 0x01, 0x1e, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x01, 0x32, 0x04, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x24, 0x03, 0x01, 0x01, 0x01, 0x0f, 0x01, 0x20, 0x04, + 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x28, 0x03, 0x01, 0x02, 0x00, + 0x01, 0x1e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x01, 0x32, 0x04, 0x01, + 0x00, 0x02, 0x01, 0x00, 0x01, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x24, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x05, + 0x1b, 0x40, 0x2f, 0x03, 0x01, 0x02, 0x04, 0x01, 0x1e, 0x00, 0x02, 0x04, + 0x03, 0x04, 0x02, 0x03, 0x32, 0x00, 0x00, 0x04, 0x01, 0x00, 0x01, 0x00, + 0x23, 0x00, 0x04, 0x00, 0x03, 0x01, 0x04, 0x03, 0x00, 0x00, 0x26, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x21, 0x06, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x1e, 0x01, 0x17, + 0x3e, 0x01, 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x11, 0x23, 0x11, 0x34, + 0x36, 0x37, 0x01, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x01, 0x1e, 0x01, 0x15, + 0x11, 0x23, 0x11, 0x33, 0x32, 0x16, 0x17, 0x01, 0x03, 0x6f, 0x0e, 0x15, + 0x0a, 0x0a, 0x16, 0x0e, 0x01, 0xe5, 0x0d, 0x1c, 0x1a, 0x8f, 0xaa, 0x02, + 0x02, 0xfe, 0x15, 0x19, 0x2d, 0x1c, 0x2d, 0x19, 0xfe, 0x0a, 0x03, 0x03, + 0xaa, 0x8f, 0x1a, 0x1c, 0x0d, 0x01, 0xef, 0x02, 0x06, 0x18, 0x35, 0x1b, + 0x1c, 0x33, 0x1a, 0x03, 0x71, 0x17, 0x0a, 0xfa, 0x67, 0x04, 0x1d, 0x15, + 0x30, 0x19, 0xfc, 0x80, 0x2d, 0x2d, 0x03, 0x83, 0x1a, 0x32, 0x15, 0xfb, + 0xe3, 0x05, 0x99, 0x0a, 0x17, 0xfc, 0x8e, 0x00, 0x00, 0x01, 0x00, 0xae, + 0x00, 0x00, 0x05, 0x38, 0x05, 0x99, 0x00, 0x16, 0x00, 0x92, 0x40, 0x0c, + 0x16, 0x15, 0x14, 0x13, 0x0c, 0x0a, 0x09, 0x08, 0x01, 0x00, 0x05, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x0f, 0x04, 0x01, 0x02, 0x00, + 0x00, 0x0b, 0x1f, 0x03, 0x01, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x02, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x11, 0x04, 0x01, 0x02, 0x00, 0x00, + 0x02, 0x01, 0x00, 0x24, 0x03, 0x01, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x02, + 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x1c, 0x04, 0x01, 0x02, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x23, 0x04, 0x01, 0x02, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x24, 0x03, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00, 0x21, 0x03, + 0x1b, 0x40, 0x27, 0x00, 0x00, 0x01, 0x04, 0x00, 0x28, 0x00, 0x01, 0x04, + 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x04, 0x00, 0x03, 0x02, 0x04, 0x03, + 0x00, 0x02, 0x26, 0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, + 0x01, 0x02, 0x01, 0x00, 0x21, 0x05, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, + 0x01, 0x32, 0x16, 0x17, 0x01, 0x2e, 0x01, 0x35, 0x11, 0x33, 0x11, 0x23, + 0x22, 0x26, 0x27, 0x01, 0x1e, 0x01, 0x15, 0x11, 0x23, 0x11, 0x33, 0x01, + 0x12, 0x1a, 0x19, 0x10, 0x03, 0x3e, 0x03, 0x02, 0xaa, 0x62, 0x17, 0x1f, + 0x0f, 0xfc, 0xc3, 0x02, 0x02, 0xaa, 0x64, 0x05, 0x99, 0x0d, 0x14, 0xfb, + 0xc8, 0x1a, 0x31, 0x17, 0x03, 0xf7, 0xfa, 0x67, 0x10, 0x13, 0x04, 0x37, + 0x19, 0x30, 0x14, 0xfc, 0x03, 0x05, 0x99, 0x00, 0x00, 0x02, 0x00, 0x5c, + 0xff, 0xf1, 0x05, 0xe1, 0x05, 0xa9, 0x00, 0x13, 0x00, 0x27, 0x00, 0x77, + 0x40, 0x0a, 0x24, 0x22, 0x1a, 0x18, 0x10, 0x0e, 0x06, 0x04, 0x04, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1a, 0x00, 0x02, 0x02, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x11, 0x1f, 0x00, 0x03, 0x03, 0x00, + 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x12, 0x00, 0x20, 0x04, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x18, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, + 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x15, 0x00, 0x20, 0x03, 0x1b, 0x40, 0x21, 0x00, 0x01, 0x00, + 0x02, 0x03, 0x01, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x23, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, + 0x03, 0x00, 0x01, 0x00, 0x21, 0x04, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x14, 0x02, 0x06, 0x04, 0x23, 0x22, 0x24, 0x26, 0x02, 0x35, 0x34, 0x12, + 0x36, 0x24, 0x33, 0x32, 0x04, 0x16, 0x12, 0x07, 0x34, 0x2e, 0x02, 0x23, + 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x05, + 0xe1, 0x66, 0xba, 0xfe, 0xfb, 0x9e, 0x9e, 0xfe, 0xfc, 0xba, 0x66, 0x66, + 0xba, 0x01, 0x04, 0x9e, 0x9e, 0x01, 0x05, 0xba, 0x66, 0xc7, 0x48, 0x84, + 0xbc, 0x74, 0x73, 0xbc, 0x85, 0x48, 0x48, 0x85, 0xbc, 0x73, 0x74, 0xbc, + 0x84, 0x48, 0x02, 0xcc, 0xa1, 0xfe, 0xf3, 0xc2, 0x6b, 0x6b, 0xc2, 0x01, + 0x0d, 0xa1, 0xa1, 0x01, 0x0d, 0xc3, 0x6c, 0x6c, 0xc3, 0xfe, 0xf3, 0xa1, + 0x84, 0xd2, 0x91, 0x4e, 0x4e, 0x91, 0xd2, 0x84, 0x84, 0xd1, 0x91, 0x4d, + 0x4d, 0x91, 0xd1, 0x00, 0x00, 0x02, 0x00, 0xc2, 0x00, 0x00, 0x04, 0x7f, + 0x05, 0x99, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x8b, 0x40, 0x10, 0x00, 0x00, + 0x19, 0x17, 0x11, 0x0f, 0x00, 0x0e, 0x00, 0x0d, 0x05, 0x03, 0x02, 0x01, + 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1e, 0x00, 0x03, + 0x05, 0x01, 0x02, 0x00, 0x03, 0x02, 0x01, 0x00, 0x26, 0x00, 0x04, 0x04, + 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0b, 0x1f, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x1c, + 0x00, 0x01, 0x00, 0x04, 0x03, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, 0x03, + 0x05, 0x01, 0x02, 0x00, 0x03, 0x02, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x20, 0x03, 0x1b, 0x40, 0x27, 0x00, 0x00, 0x02, 0x00, 0x35, + 0x00, 0x01, 0x00, 0x04, 0x03, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, 0x03, + 0x02, 0x02, 0x03, 0x01, 0x00, 0x23, 0x00, 0x03, 0x03, 0x02, 0x01, 0x00, + 0x24, 0x05, 0x01, 0x02, 0x03, 0x02, 0x01, 0x00, 0x21, 0x05, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x27, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, + 0x2b, 0x01, 0x01, 0x83, 0xc1, 0x01, 0xa7, 0x88, 0xc9, 0x84, 0x41, 0x46, + 0x87, 0xc8, 0x81, 0xe6, 0xe6, 0x53, 0x7f, 0x56, 0x2c, 0xa9, 0xab, 0xe6, + 0x02, 0x18, 0xfd, 0xe8, 0x05, 0x99, 0x3f, 0x74, 0xa4, 0x65, 0x64, 0xa6, + 0x78, 0x43, 0x9a, 0x2c, 0x4f, 0x6e, 0x42, 0x89, 0x9a, 0x00, 0x00, 0x02, + 0x00, 0x5c, 0xfe, 0xd8, 0x06, 0x24, 0x05, 0xa9, 0x00, 0x1c, 0x00, 0x30, + 0x00, 0xfb, 0x40, 0x0c, 0x2d, 0x2b, 0x23, 0x21, 0x19, 0x17, 0x0f, 0x0d, + 0x08, 0x06, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, 0x40, 0x26, + 0x0b, 0x05, 0x02, 0x01, 0x04, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x00, 0x35, + 0x00, 0x03, 0x03, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x11, 0x1f, + 0x00, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x12, 0x01, + 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x15, 0x50, 0x58, 0x40, 0x26, 0x0b, 0x05, + 0x02, 0x01, 0x04, 0x01, 0x1e, 0x00, 0x03, 0x03, 0x02, 0x01, 0x00, 0x24, + 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, + 0x00, 0x01, 0x01, 0x12, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x06, + 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x26, 0x0b, 0x05, 0x02, 0x01, + 0x04, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x03, 0x03, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x04, 0x04, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x12, 0x01, 0x20, 0x06, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x24, 0x0b, 0x05, 0x02, 0x01, 0x04, 0x01, + 0x1e, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x02, 0x00, 0x03, 0x04, 0x02, + 0x03, 0x01, 0x00, 0x26, 0x00, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x15, 0x01, 0x20, 0x05, 0x1b, 0x40, 0x2d, 0x0b, 0x05, 0x02, + 0x01, 0x04, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x02, 0x00, + 0x03, 0x04, 0x02, 0x03, 0x01, 0x00, 0x26, 0x00, 0x04, 0x01, 0x01, 0x04, + 0x01, 0x00, 0x23, 0x00, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x04, 0x01, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x01, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x23, 0x22, 0x26, 0x27, 0x03, + 0x0e, 0x01, 0x23, 0x22, 0x24, 0x26, 0x02, 0x35, 0x34, 0x12, 0x36, 0x24, + 0x33, 0x32, 0x04, 0x16, 0x12, 0x07, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, + 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x05, 0xe1, 0x29, + 0x4e, 0x70, 0x46, 0x01, 0x70, 0xa0, 0x24, 0x38, 0x17, 0xfc, 0x39, 0x7b, + 0x43, 0x9e, 0xfe, 0xfc, 0xba, 0x66, 0x66, 0xba, 0x01, 0x04, 0x9e, 0x9e, + 0x01, 0x05, 0xba, 0x66, 0xc7, 0x48, 0x84, 0xbc, 0x74, 0x73, 0xbc, 0x85, + 0x48, 0x48, 0x85, 0xbc, 0x73, 0x74, 0xbc, 0x84, 0x48, 0x02, 0xcc, 0x65, + 0xb6, 0x9d, 0x80, 0x2f, 0xfe, 0x73, 0x14, 0x19, 0x01, 0x12, 0x12, 0x14, + 0x6b, 0xc2, 0x01, 0x0d, 0xa1, 0xa1, 0x01, 0x0d, 0xc3, 0x6c, 0x6c, 0xc3, + 0xfe, 0xf3, 0xa1, 0x84, 0xd2, 0x91, 0x4e, 0x4e, 0x91, 0xd2, 0x84, 0x84, + 0xd1, 0x91, 0x4d, 0x4d, 0x91, 0xd1, 0x00, 0x02, 0x00, 0xc2, 0x00, 0x00, + 0x04, 0xe5, 0x05, 0x99, 0x00, 0x18, 0x00, 0x23, 0x00, 0xdf, 0x40, 0x12, + 0x00, 0x00, 0x23, 0x21, 0x1b, 0x19, 0x00, 0x18, 0x00, 0x17, 0x13, 0x11, + 0x05, 0x03, 0x02, 0x01, 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x25, 0x0e, 0x01, 0x03, 0x04, 0x01, 0x1e, 0x00, 0x04, 0x06, 0x01, + 0x03, 0x00, 0x04, 0x03, 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, 0x01, 0x01, + 0x00, 0x24, 0x00, 0x01, 0x01, 0x0b, 0x1f, 0x02, 0x01, 0x00, 0x00, 0x0c, + 0x00, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x23, 0x0e, + 0x01, 0x03, 0x04, 0x01, 0x1e, 0x00, 0x01, 0x00, 0x05, 0x04, 0x01, 0x05, + 0x01, 0x00, 0x26, 0x00, 0x04, 0x06, 0x01, 0x03, 0x00, 0x04, 0x03, 0x01, + 0x00, 0x26, 0x02, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x04, 0x1b, 0x4b, + 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x2e, 0x0e, 0x01, 0x03, 0x04, 0x01, 0x1e, + 0x02, 0x01, 0x00, 0x03, 0x00, 0x35, 0x00, 0x01, 0x00, 0x05, 0x04, 0x01, + 0x05, 0x01, 0x00, 0x26, 0x00, 0x04, 0x03, 0x03, 0x04, 0x01, 0x00, 0x23, + 0x00, 0x04, 0x04, 0x03, 0x01, 0x00, 0x24, 0x06, 0x01, 0x03, 0x04, 0x03, + 0x01, 0x00, 0x21, 0x06, 0x1b, 0x40, 0x34, 0x0e, 0x01, 0x03, 0x04, 0x01, + 0x1e, 0x00, 0x02, 0x03, 0x00, 0x03, 0x02, 0x00, 0x32, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x01, 0x00, 0x05, 0x04, 0x01, 0x05, 0x01, 0x00, 0x26, 0x00, + 0x04, 0x03, 0x03, 0x04, 0x01, 0x00, 0x23, 0x00, 0x04, 0x04, 0x03, 0x01, + 0x00, 0x24, 0x06, 0x01, 0x03, 0x04, 0x03, 0x01, 0x00, 0x21, 0x07, 0x59, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x16, 0x17, 0x01, 0x23, 0x22, 0x27, + 0x01, 0x2e, 0x01, 0x23, 0x27, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, + 0x2b, 0x01, 0x01, 0x83, 0xc1, 0x01, 0x95, 0x88, 0xc6, 0x81, 0x3e, 0x30, + 0x5b, 0x83, 0x53, 0x24, 0x1c, 0x01, 0xa2, 0xac, 0x35, 0x19, 0xfe, 0x8c, + 0x11, 0x28, 0x28, 0x93, 0xcb, 0x55, 0x81, 0x57, 0x2c, 0xa9, 0xa7, 0xd4, + 0x02, 0x56, 0xfd, 0xaa, 0x05, 0x99, 0x37, 0x68, 0x93, 0x5b, 0x4c, 0x84, + 0x69, 0x4a, 0x13, 0x15, 0x28, 0xfd, 0xc7, 0x29, 0x02, 0x00, 0x18, 0x15, + 0x8d, 0x29, 0x4b, 0x68, 0x3f, 0x80, 0x82, 0x00, 0x00, 0x01, 0x00, 0x3a, + 0xff, 0xf0, 0x03, 0xdb, 0x05, 0xa9, 0x00, 0x3d, 0x00, 0xc6, 0x40, 0x0e, + 0x3b, 0x39, 0x28, 0x26, 0x23, 0x21, 0x1c, 0x1a, 0x09, 0x07, 0x04, 0x02, + 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x33, 0x3d, 0x01, + 0x01, 0x05, 0x1e, 0x01, 0x04, 0x03, 0x02, 0x1e, 0x00, 0x00, 0x01, 0x03, + 0x01, 0x00, 0x03, 0x32, 0x00, 0x03, 0x04, 0x01, 0x03, 0x04, 0x30, 0x00, + 0x01, 0x01, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x05, 0x11, 0x1f, 0x00, + 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x12, 0x02, 0x20, + 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x31, 0x3d, 0x01, 0x01, + 0x05, 0x1e, 0x01, 0x04, 0x03, 0x02, 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, + 0x00, 0x03, 0x32, 0x00, 0x03, 0x04, 0x01, 0x03, 0x04, 0x30, 0x00, 0x05, + 0x00, 0x01, 0x00, 0x05, 0x01, 0x01, 0x00, 0x26, 0x00, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x02, 0x20, 0x06, 0x1b, 0x40, + 0x3a, 0x3d, 0x01, 0x01, 0x05, 0x1e, 0x01, 0x04, 0x03, 0x02, 0x1e, 0x00, + 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, 0x32, 0x00, 0x03, 0x04, 0x01, 0x03, + 0x04, 0x30, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x01, 0x01, 0x00, 0x26, + 0x00, 0x04, 0x02, 0x02, 0x04, 0x01, 0x00, 0x23, 0x00, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x04, 0x02, 0x01, 0x00, 0x21, 0x07, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x23, + 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x06, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x26, 0x27, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, + 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x06, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x16, 0x17, 0x03, 0x8c, 0x09, 0x14, 0x10, 0x11, 0x2d, 0x45, 0x61, 0x45, + 0x41, 0x64, 0x43, 0x22, 0x3b, 0x61, 0x7b, 0x81, 0x7b, 0x61, 0x3b, 0x40, + 0x7b, 0xb3, 0x72, 0x8b, 0xe5, 0x51, 0x38, 0x08, 0x17, 0x0e, 0x15, 0x36, + 0x51, 0x73, 0x53, 0x45, 0x6c, 0x4b, 0x28, 0x3b, 0x60, 0x7b, 0x81, 0x7b, + 0x60, 0x3b, 0x3b, 0x70, 0xa5, 0x6b, 0x78, 0xc6, 0x4a, 0x04, 0xb9, 0x0f, + 0x0f, 0x22, 0x29, 0x22, 0x23, 0x3c, 0x51, 0x2f, 0x3c, 0x4f, 0x38, 0x29, + 0x2c, 0x37, 0x54, 0x7a, 0x59, 0x5e, 0xa5, 0x7a, 0x46, 0x65, 0x56, 0x5c, + 0x0b, 0x0f, 0x2d, 0x36, 0x2d, 0x26, 0x45, 0x60, 0x3b, 0x41, 0x53, 0x38, + 0x27, 0x29, 0x36, 0x56, 0x81, 0x5f, 0x4c, 0x8e, 0x6e, 0x42, 0x4c, 0x48, + 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x04, 0x7e, 0x05, 0x99, 0x00, 0x07, + 0x00, 0x9d, 0x40, 0x0e, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x06, 0x05, + 0x04, 0x03, 0x02, 0x01, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x15, 0x02, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x24, 0x04, 0x01, + 0x03, 0x03, 0x0b, 0x1f, 0x00, 0x01, 0x01, 0x0c, 0x01, 0x20, 0x03, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x13, 0x04, 0x01, 0x03, 0x02, 0x01, + 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, 0x01, 0x01, 0x0f, 0x01, + 0x20, 0x02, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x1f, 0x00, 0x01, + 0x00, 0x01, 0x35, 0x04, 0x01, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x23, + 0x04, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x24, 0x02, 0x01, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x21, 0x04, 0x1b, 0x40, 0x25, 0x00, 0x02, 0x03, 0x00, + 0x00, 0x02, 0x2a, 0x00, 0x01, 0x00, 0x01, 0x35, 0x04, 0x01, 0x03, 0x02, + 0x00, 0x03, 0x00, 0x02, 0x23, 0x04, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x21, 0x05, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x04, + 0x7e, 0xfe, 0x31, 0xc2, 0xfe, 0x2f, 0x05, 0x99, 0xa3, 0xfb, 0x0a, 0x04, + 0xf6, 0xa3, 0x00, 0x01, 0x00, 0xa0, 0xff, 0xef, 0x05, 0x15, 0x05, 0x99, + 0x00, 0x19, 0x00, 0x9d, 0x40, 0x0e, 0x01, 0x00, 0x14, 0x13, 0x0e, 0x0c, + 0x07, 0x06, 0x00, 0x19, 0x01, 0x19, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x15, 0x03, 0x01, 0x01, 0x01, 0x0b, 0x1f, 0x04, 0x01, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x12, 0x02, 0x20, + 0x03, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x15, 0x03, 0x01, 0x01, + 0x00, 0x01, 0x34, 0x04, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x00, + 0x02, 0x02, 0x15, 0x02, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, + 0x40, 0x1f, 0x03, 0x01, 0x01, 0x00, 0x01, 0x34, 0x04, 0x01, 0x00, 0x02, + 0x02, 0x00, 0x01, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, + 0x24, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x21, 0x04, 0x1b, 0x40, 0x23, + 0x00, 0x01, 0x03, 0x01, 0x34, 0x00, 0x03, 0x00, 0x03, 0x34, 0x04, 0x01, + 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x21, 0x05, 0x59, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x25, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, + 0x11, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, + 0x14, 0x1e, 0x02, 0x02, 0xdb, 0x59, 0x8c, 0x61, 0x33, 0xc1, 0x4f, 0x93, + 0xd4, 0x84, 0x84, 0xd4, 0x94, 0x4f, 0xc1, 0x33, 0x61, 0x8d, 0x9a, 0x3c, + 0x6c, 0x96, 0x5a, 0x03, 0x67, 0xfc, 0x99, 0x7c, 0xd4, 0x9b, 0x58, 0x58, + 0x9b, 0xd4, 0x7c, 0x03, 0x67, 0xfc, 0x9a, 0x5a, 0x96, 0x6c, 0x3d, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x05, 0x47, 0x05, 0x99, 0x00, 0x12, + 0x00, 0x77, 0x40, 0x08, 0x12, 0x11, 0x10, 0x0e, 0x02, 0x00, 0x03, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x13, 0x08, 0x01, 0x02, 0x00, + 0x01, 0x1e, 0x01, 0x01, 0x00, 0x00, 0x0b, 0x1f, 0x00, 0x02, 0x02, 0x0c, + 0x02, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x13, 0x08, + 0x01, 0x02, 0x00, 0x01, 0x1e, 0x01, 0x01, 0x00, 0x02, 0x00, 0x34, 0x00, + 0x02, 0x02, 0x0f, 0x02, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, + 0x40, 0x11, 0x08, 0x01, 0x02, 0x00, 0x01, 0x1e, 0x01, 0x01, 0x00, 0x02, + 0x00, 0x34, 0x00, 0x02, 0x02, 0x2b, 0x03, 0x1b, 0x40, 0x15, 0x08, 0x01, + 0x02, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x00, 0x34, 0x00, 0x01, 0x02, + 0x01, 0x34, 0x00, 0x02, 0x02, 0x2b, 0x04, 0x59, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x13, 0x33, 0x32, 0x16, 0x17, 0x01, 0x1e, 0x01, 0x17, 0x3e, 0x01, + 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x01, 0x23, 0x08, 0x9b, 0x1a, 0x20, + 0x08, 0x01, 0x95, 0x0e, 0x17, 0x0b, 0x09, 0x15, 0x0e, 0x01, 0x93, 0x07, + 0x22, 0x19, 0x9c, 0xfd, 0xb8, 0xaf, 0x05, 0x99, 0x1a, 0x14, 0xfc, 0x0d, + 0x22, 0x50, 0x2b, 0x2b, 0x50, 0x22, 0x03, 0xf3, 0x11, 0x1d, 0xfa, 0x67, + 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x07, 0xe7, 0x05, 0x99, 0x00, 0x28, + 0x00, 0x93, 0x40, 0x0c, 0x28, 0x27, 0x20, 0x1f, 0x1e, 0x1c, 0x11, 0x0e, + 0x02, 0x00, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x17, + 0x23, 0x16, 0x08, 0x03, 0x03, 0x00, 0x01, 0x1e, 0x02, 0x01, 0x02, 0x00, + 0x00, 0x0b, 0x1f, 0x04, 0x01, 0x03, 0x03, 0x0c, 0x03, 0x20, 0x03, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x17, 0x23, 0x16, 0x08, 0x03, 0x03, + 0x00, 0x01, 0x1e, 0x02, 0x01, 0x02, 0x00, 0x03, 0x00, 0x34, 0x04, 0x01, + 0x03, 0x03, 0x0f, 0x03, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, + 0x40, 0x15, 0x23, 0x16, 0x08, 0x03, 0x03, 0x00, 0x01, 0x1e, 0x02, 0x01, + 0x02, 0x00, 0x03, 0x00, 0x34, 0x04, 0x01, 0x03, 0x03, 0x2b, 0x03, 0x1b, + 0x40, 0x21, 0x23, 0x16, 0x08, 0x03, 0x04, 0x02, 0x01, 0x1e, 0x00, 0x00, + 0x01, 0x00, 0x34, 0x00, 0x01, 0x02, 0x01, 0x34, 0x00, 0x02, 0x04, 0x02, + 0x34, 0x00, 0x04, 0x03, 0x04, 0x34, 0x00, 0x03, 0x03, 0x2b, 0x06, 0x59, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x33, 0x32, 0x16, 0x17, 0x01, 0x1e, + 0x01, 0x17, 0x3e, 0x01, 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x32, 0x16, + 0x17, 0x01, 0x16, 0x17, 0x3e, 0x01, 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, + 0x01, 0x23, 0x01, 0x26, 0x27, 0x0e, 0x01, 0x07, 0x01, 0x23, 0x0e, 0xa1, + 0x1a, 0x22, 0x06, 0x01, 0x28, 0x08, 0x0d, 0x06, 0x07, 0x0e, 0x09, 0x01, + 0x51, 0x06, 0x23, 0x19, 0x38, 0x1a, 0x21, 0x07, 0x01, 0x4f, 0x12, 0x0e, + 0x06, 0x0a, 0x08, 0x01, 0x29, 0x05, 0x23, 0x19, 0x97, 0xfe, 0x41, 0xae, + 0xfe, 0x95, 0x0b, 0x09, 0x05, 0x09, 0x05, 0xfe, 0x93, 0xae, 0x05, 0x99, + 0x1a, 0x14, 0xfc, 0x1c, 0x1b, 0x3e, 0x22, 0x22, 0x3f, 0x1a, 0x03, 0xe4, + 0x11, 0x1d, 0x1a, 0x14, 0xfc, 0x1c, 0x34, 0x43, 0x21, 0x3c, 0x1a, 0x03, + 0xe4, 0x12, 0x1c, 0xfa, 0x67, 0x04, 0x45, 0x1f, 0x29, 0x14, 0x25, 0x0f, + 0xfb, 0xbb, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xf6, 0x05, 0x99, + 0x00, 0x1b, 0x00, 0xa2, 0x40, 0x0a, 0x1b, 0x19, 0x11, 0x0f, 0x0d, 0x0b, + 0x03, 0x01, 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x15, + 0x0e, 0x00, 0x02, 0x02, 0x00, 0x01, 0x1e, 0x01, 0x01, 0x00, 0x00, 0x0b, + 0x1f, 0x03, 0x01, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x03, 0x1b, 0x4b, 0xb0, + 0x6c, 0x50, 0x58, 0x40, 0x17, 0x0e, 0x00, 0x02, 0x02, 0x00, 0x01, 0x1e, + 0x01, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x03, 0x01, 0x02, 0x02, + 0x0f, 0x02, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x21, + 0x0e, 0x00, 0x02, 0x02, 0x00, 0x01, 0x1e, 0x01, 0x01, 0x00, 0x02, 0x02, + 0x00, 0x01, 0x00, 0x23, 0x01, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, + 0x03, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00, 0x21, 0x04, 0x1b, 0x40, 0x28, + 0x0e, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1e, 0x00, 0x01, 0x03, 0x02, 0x01, + 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, + 0x26, 0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x01, 0x02, + 0x01, 0x00, 0x21, 0x05, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x09, 0x01, + 0x33, 0x32, 0x16, 0x17, 0x01, 0x36, 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, + 0x09, 0x01, 0x23, 0x22, 0x26, 0x27, 0x01, 0x06, 0x07, 0x01, 0x0e, 0x01, + 0x2b, 0x01, 0x01, 0xfb, 0xfe, 0x27, 0xc1, 0x15, 0x14, 0x08, 0x01, 0x76, + 0x07, 0x0e, 0x01, 0x61, 0x09, 0x15, 0x0f, 0xb9, 0xfe, 0x25, 0x01, 0xeb, + 0xc0, 0x16, 0x19, 0x08, 0xfe, 0x80, 0x07, 0x0b, 0xfe, 0x8a, 0x09, 0x17, + 0x15, 0xb4, 0x02, 0xe0, 0x02, 0xb9, 0x0e, 0x0d, 0xfd, 0xc2, 0x15, 0x19, + 0x02, 0x0c, 0x0e, 0x11, 0xfd, 0x50, 0xfd, 0x17, 0x17, 0x0e, 0x02, 0x59, + 0x15, 0x13, 0xfd, 0xcf, 0x0e, 0x17, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, + 0x04, 0xe4, 0x05, 0x99, 0x00, 0x14, 0x00, 0x7f, 0x40, 0x08, 0x14, 0x12, + 0x06, 0x04, 0x02, 0x01, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x15, 0x0c, 0x03, 0x00, 0x03, 0x00, 0x01, 0x01, 0x1e, 0x02, 0x01, + 0x01, 0x01, 0x0b, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x20, 0x03, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x15, 0x0c, 0x03, 0x00, 0x03, 0x00, + 0x01, 0x01, 0x1e, 0x02, 0x01, 0x01, 0x00, 0x01, 0x34, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x13, + 0x0c, 0x03, 0x00, 0x03, 0x00, 0x01, 0x01, 0x1e, 0x02, 0x01, 0x01, 0x00, + 0x01, 0x34, 0x00, 0x00, 0x00, 0x2b, 0x03, 0x1b, 0x40, 0x17, 0x0c, 0x03, + 0x00, 0x03, 0x00, 0x02, 0x01, 0x1e, 0x00, 0x01, 0x02, 0x01, 0x34, 0x00, + 0x02, 0x00, 0x02, 0x34, 0x00, 0x00, 0x00, 0x2b, 0x04, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x01, 0x33, 0x32, 0x16, 0x17, + 0x01, 0x1e, 0x01, 0x17, 0x3e, 0x01, 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, + 0x02, 0xd6, 0xc1, 0xfd, 0xf3, 0xaa, 0x1a, 0x1e, 0x0b, 0x01, 0x48, 0x14, + 0x1b, 0x0b, 0x0b, 0x1a, 0x14, 0x01, 0x47, 0x09, 0x1f, 0x19, 0xac, 0x02, + 0x3a, 0xfd, 0xc6, 0x02, 0x3a, 0x03, 0x5f, 0x1a, 0x13, 0xfd, 0xd3, 0x23, + 0x3e, 0x1e, 0x1f, 0x3e, 0x22, 0x02, 0x2d, 0x10, 0x1d, 0x00, 0x00, 0x01, + 0x00, 0x56, 0x00, 0x00, 0x04, 0x94, 0x05, 0x99, 0x00, 0x0d, 0x00, 0x7e, + 0x40, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x0d, 0x0c, 0x0b, 0x07, 0x06, + 0x05, 0x04, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1b, + 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, 0x24, 0x04, 0x01, 0x03, 0x03, 0x0b, + 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0c, + 0x01, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x19, 0x04, + 0x01, 0x03, 0x00, 0x02, 0x00, 0x03, 0x02, 0x00, 0x00, 0x26, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0f, 0x01, 0x20, 0x03, + 0x1b, 0x40, 0x22, 0x04, 0x01, 0x03, 0x00, 0x02, 0x00, 0x03, 0x02, 0x00, + 0x00, 0x26, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, + 0x04, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x15, 0x14, 0x07, 0x01, 0x21, + 0x15, 0x21, 0x35, 0x34, 0x37, 0x01, 0x21, 0x35, 0x04, 0x94, 0x15, 0xfc, + 0xd5, 0x03, 0x32, 0xfb, 0xd0, 0x13, 0x03, 0x2c, 0xfc, 0xe7, 0x05, 0x99, + 0x48, 0x22, 0x1e, 0xfb, 0x8d, 0x9e, 0x4c, 0x1e, 0x1b, 0x04, 0x76, 0x9e, + 0x00, 0x01, 0x00, 0x8e, 0xfe, 0xdf, 0x01, 0xfe, 0x05, 0xfd, 0x00, 0x0d, + 0x00, 0x38, 0x40, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x0d, 0x0a, 0x08, + 0x07, 0x05, 0x02, 0x01, 0x05, 0x07, 0x2b, 0x40, 0x22, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x00, 0x01, 0x01, 0x00, 0x26, 0x00, 0x02, 0x03, 0x03, 0x02, + 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, 0x24, 0x04, 0x01, + 0x03, 0x02, 0x03, 0x00, 0x00, 0x21, 0x04, 0xb0, 0x38, 0x2b, 0x13, 0x11, + 0x21, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x16, 0x1d, 0x01, + 0x8e, 0x01, 0x70, 0x1b, 0x16, 0xa9, 0xa9, 0x16, 0x1b, 0xfe, 0xdf, 0x07, + 0x1e, 0x46, 0x16, 0x19, 0xf9, 0xcd, 0x19, 0x17, 0x46, 0x00, 0x00, 0x01, + 0xff, 0xec, 0xff, 0xa6, 0x02, 0xef, 0x05, 0xc1, 0x00, 0x09, 0x00, 0x2d, + 0x40, 0x06, 0x07, 0x05, 0x02, 0x00, 0x02, 0x07, 0x2b, 0x4b, 0xb0, 0x8d, + 0x50, 0x58, 0x40, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x35, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x20, 0x02, 0x1b, 0x40, 0x0a, 0x00, 0x00, 0x01, 0x00, 0x34, + 0x00, 0x01, 0x01, 0x2b, 0x02, 0x59, 0xb0, 0x38, 0x2b, 0x03, 0x33, 0x32, + 0x16, 0x17, 0x01, 0x23, 0x22, 0x26, 0x27, 0x14, 0x4c, 0x21, 0x30, 0x0d, + 0x02, 0x59, 0x4b, 0x1d, 0x38, 0x0d, 0x05, 0xc1, 0x22, 0x20, 0xfa, 0x27, + 0x22, 0x23, 0x00, 0x01, 0x00, 0x5a, 0xfe, 0xdf, 0x01, 0xca, 0x05, 0xfd, + 0x00, 0x0d, 0x00, 0x33, 0x40, 0x0a, 0x0d, 0x0c, 0x0b, 0x0a, 0x07, 0x05, + 0x04, 0x02, 0x04, 0x07, 0x2b, 0x40, 0x21, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x02, 0x01, 0x01, 0x00, 0x26, 0x00, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x24, 0x00, 0x03, 0x00, 0x03, + 0x00, 0x00, 0x21, 0x04, 0xb0, 0x38, 0x2b, 0x17, 0x34, 0x36, 0x3b, 0x01, + 0x11, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x21, 0x11, 0x21, 0x5a, 0x1b, 0x16, + 0xa9, 0xa9, 0x16, 0x1b, 0x01, 0x70, 0xfe, 0x90, 0xdb, 0x14, 0x1c, 0x06, + 0x33, 0x1b, 0x14, 0x46, 0xf8, 0xe2, 0x00, 0x01, 0x00, 0x9e, 0x03, 0x13, + 0x03, 0xdd, 0x05, 0x99, 0x00, 0x11, 0x00, 0x5b, 0x40, 0x08, 0x11, 0x0f, + 0x04, 0x02, 0x01, 0x00, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x13, 0x0a, 0x01, 0x01, 0x00, 0x01, 0x1e, 0x02, 0x01, 0x01, 0x00, + 0x01, 0x35, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x20, 0x03, 0x1b, 0x4b, 0xb0, + 0xe8, 0x50, 0x58, 0x40, 0x11, 0x0a, 0x01, 0x01, 0x00, 0x01, 0x1e, 0x00, + 0x00, 0x01, 0x00, 0x34, 0x02, 0x01, 0x01, 0x01, 0x2b, 0x03, 0x1b, 0x40, + 0x15, 0x0a, 0x01, 0x02, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x02, 0x00, 0x34, + 0x00, 0x02, 0x01, 0x02, 0x34, 0x00, 0x01, 0x01, 0x2b, 0x04, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x33, 0x01, 0x23, 0x22, 0x26, 0x27, 0x03, 0x2e, + 0x01, 0x27, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x2b, 0x01, 0x02, 0x04, 0x73, + 0x01, 0x66, 0x81, 0x11, 0x18, 0x08, 0xc4, 0x0d, 0x13, 0x07, 0x0e, 0x17, + 0xc2, 0x08, 0x17, 0x14, 0x88, 0x05, 0x99, 0xfd, 0x7a, 0x14, 0x0e, 0x01, + 0x60, 0x17, 0x2b, 0x15, 0x2c, 0x2b, 0xfe, 0xa0, 0x0e, 0x14, 0x00, 0x01, + 0x00, 0x00, 0xfe, 0xe3, 0x03, 0x14, 0xff, 0x5b, 0x00, 0x03, 0x00, 0x2b, + 0x40, 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x02, 0x01, 0x03, 0x07, + 0x2b, 0x40, 0x19, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x23, + 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x21, 0x03, 0xb0, 0x38, 0x2b, 0x05, 0x15, 0x21, 0x35, 0x03, + 0x14, 0xfc, 0xec, 0xa5, 0x78, 0x78, 0x00, 0x01, 0x00, 0x26, 0x04, 0x8b, + 0x01, 0xb3, 0x05, 0xa9, 0x00, 0x09, 0x00, 0x33, 0x40, 0x0a, 0x01, 0x00, + 0x06, 0x04, 0x00, 0x09, 0x01, 0x09, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x0d, 0x00, 0x01, 0x00, 0x01, 0x35, 0x02, 0x01, 0x00, + 0x00, 0x11, 0x00, 0x20, 0x02, 0x1b, 0x40, 0x0b, 0x02, 0x01, 0x00, 0x01, + 0x00, 0x34, 0x00, 0x01, 0x01, 0x2b, 0x02, 0x59, 0xb0, 0x38, 0x2b, 0x13, + 0x32, 0x16, 0x1f, 0x01, 0x23, 0x22, 0x26, 0x27, 0x03, 0xcf, 0x21, 0x20, + 0x0e, 0x95, 0x66, 0x15, 0x1a, 0x0e, 0xea, 0x05, 0xa9, 0x15, 0x17, 0xf2, + 0x0d, 0x0f, 0x01, 0x02, 0x00, 0x02, 0x00, 0x5c, 0xff, 0xf0, 0x03, 0x7a, + 0x04, 0x07, 0x00, 0x29, 0x00, 0x39, 0x01, 0x32, 0x40, 0x16, 0x2b, 0x2a, + 0x31, 0x30, 0x2a, 0x39, 0x2b, 0x39, 0x25, 0x23, 0x1e, 0x1c, 0x19, 0x17, + 0x14, 0x13, 0x0b, 0x09, 0x02, 0x00, 0x09, 0x07, 0x2b, 0x4b, 0xb0, 0x1e, + 0x50, 0x58, 0x40, 0x39, 0x21, 0x01, 0x04, 0x03, 0x2f, 0x05, 0x02, 0x06, + 0x07, 0x02, 0x1e, 0x00, 0x04, 0x03, 0x02, 0x03, 0x04, 0x02, 0x32, 0x00, + 0x02, 0x00, 0x07, 0x06, 0x02, 0x07, 0x01, 0x00, 0x26, 0x00, 0x03, 0x03, + 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x05, 0x14, 0x1f, 0x08, 0x01, 0x06, + 0x06, 0x00, 0x01, 0x00, 0x24, 0x01, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x20, + 0x07, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x3d, 0x21, 0x01, 0x04, + 0x03, 0x2f, 0x05, 0x02, 0x06, 0x07, 0x02, 0x1e, 0x00, 0x04, 0x03, 0x02, + 0x03, 0x04, 0x02, 0x32, 0x00, 0x02, 0x00, 0x07, 0x06, 0x02, 0x07, 0x01, + 0x00, 0x26, 0x00, 0x03, 0x03, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x05, + 0x14, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x1f, 0x08, 0x01, 0x06, 0x06, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x12, 0x01, 0x20, 0x08, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x3b, 0x21, 0x01, 0x04, 0x03, 0x2f, 0x05, + 0x02, 0x06, 0x07, 0x02, 0x1e, 0x00, 0x04, 0x03, 0x02, 0x03, 0x04, 0x02, + 0x32, 0x00, 0x05, 0x00, 0x03, 0x04, 0x05, 0x03, 0x01, 0x00, 0x26, 0x00, + 0x02, 0x00, 0x07, 0x06, 0x02, 0x07, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x0f, 0x1f, 0x08, 0x01, 0x06, 0x06, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x01, 0x15, 0x01, 0x20, 0x07, 0x1b, 0x40, 0x48, 0x21, 0x01, 0x04, 0x03, + 0x2f, 0x05, 0x02, 0x06, 0x07, 0x02, 0x1e, 0x00, 0x04, 0x03, 0x02, 0x03, + 0x04, 0x02, 0x32, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, 0x01, 0x32, 0x00, + 0x05, 0x00, 0x03, 0x04, 0x05, 0x03, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, + 0x07, 0x06, 0x02, 0x07, 0x01, 0x00, 0x26, 0x08, 0x01, 0x06, 0x00, 0x01, + 0x06, 0x01, 0x00, 0x23, 0x08, 0x01, 0x06, 0x06, 0x01, 0x01, 0x00, 0x24, + 0x00, 0x01, 0x06, 0x01, 0x01, 0x00, 0x21, 0x08, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x21, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x0e, 0x03, 0x23, 0x22, + 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x01, 0x32, 0x3e, 0x02, 0x37, 0x35, 0x0e, 0x03, 0x15, 0x14, + 0x1e, 0x02, 0x03, 0x7a, 0x4f, 0x1a, 0x20, 0x05, 0x14, 0x28, 0x4c, 0x54, + 0x5f, 0x3a, 0x3b, 0x67, 0x4c, 0x2d, 0x42, 0x93, 0xee, 0xac, 0x65, 0x63, + 0x41, 0x59, 0x41, 0x2f, 0x17, 0x12, 0x1b, 0x08, 0x20, 0x54, 0xc2, 0x76, + 0x55, 0x84, 0x5a, 0x2e, 0xfe, 0x32, 0x2f, 0x4e, 0x45, 0x3f, 0x1e, 0x7b, + 0xac, 0x6c, 0x31, 0x1a, 0x2c, 0x3c, 0x10, 0x1a, 0x5e, 0x24, 0x39, 0x27, + 0x14, 0x21, 0x42, 0x65, 0x45, 0x3c, 0x6f, 0x56, 0x37, 0x04, 0x4f, 0x76, + 0x79, 0x21, 0x29, 0x21, 0x13, 0x0e, 0x39, 0x51, 0x50, 0x38, 0x64, 0x8e, + 0x55, 0xfd, 0xe5, 0x13, 0x23, 0x32, 0x20, 0xd3, 0x04, 0x1f, 0x32, 0x44, + 0x2a, 0x28, 0x3a, 0x25, 0x11, 0x00, 0x00, 0x02, 0x00, 0x98, 0xff, 0xf2, + 0x04, 0x16, 0x05, 0xc1, 0x00, 0x16, 0x00, 0x25, 0x01, 0x5f, 0x40, 0x16, + 0x18, 0x17, 0x00, 0x00, 0x1f, 0x1d, 0x17, 0x25, 0x18, 0x25, 0x00, 0x16, + 0x00, 0x15, 0x11, 0x0f, 0x07, 0x05, 0x02, 0x01, 0x08, 0x07, 0x2b, 0x4b, + 0xb0, 0x09, 0x50, 0x58, 0x40, 0x2b, 0x1b, 0x1a, 0x13, 0x03, 0x04, 0x05, + 0x04, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x0d, 0x1f, 0x07, 0x01, 0x04, 0x04, + 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x14, 0x1f, 0x00, 0x05, 0x05, + 0x02, 0x01, 0x00, 0x24, 0x06, 0x03, 0x02, 0x02, 0x02, 0x12, 0x02, 0x20, + 0x06, 0x1b, 0x4b, 0xb0, 0x22, 0x50, 0x58, 0x40, 0x2b, 0x1b, 0x1a, 0x13, + 0x03, 0x04, 0x05, 0x04, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x0d, 0x1f, 0x07, + 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x14, 0x1f, + 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x06, 0x03, 0x02, 0x02, 0x02, + 0x15, 0x02, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2f, + 0x1b, 0x1a, 0x13, 0x03, 0x04, 0x05, 0x04, 0x01, 0x1e, 0x00, 0x00, 0x00, + 0x0d, 0x1f, 0x07, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x01, 0x14, 0x1f, 0x06, 0x01, 0x03, 0x03, 0x0c, 0x1f, 0x00, 0x05, 0x05, + 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x02, 0x20, 0x07, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x2d, 0x1b, 0x1a, 0x13, 0x03, 0x04, + 0x05, 0x04, 0x01, 0x1e, 0x00, 0x01, 0x07, 0x01, 0x04, 0x05, 0x01, 0x04, + 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0d, 0x1f, 0x06, 0x01, 0x03, 0x03, + 0x0f, 0x1f, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, + 0x15, 0x02, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x8d, 0x50, 0x58, 0x40, 0x2c, + 0x1b, 0x1a, 0x13, 0x03, 0x04, 0x05, 0x04, 0x01, 0x1e, 0x00, 0x01, 0x07, + 0x01, 0x04, 0x05, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x02, + 0x05, 0x02, 0x01, 0x00, 0x25, 0x06, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x0d, 0x03, 0x20, 0x05, 0x1b, 0x40, 0x36, 0x1b, + 0x1a, 0x13, 0x03, 0x04, 0x05, 0x04, 0x01, 0x1e, 0x00, 0x01, 0x07, 0x01, + 0x04, 0x05, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x03, 0x02, 0x05, + 0x01, 0x00, 0x23, 0x00, 0x00, 0x06, 0x01, 0x03, 0x02, 0x00, 0x03, 0x01, + 0x00, 0x26, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x05, + 0x02, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x33, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x06, 0x23, 0x01, 0x22, + 0x06, 0x07, 0x11, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, + 0x98, 0xb3, 0x3f, 0xa3, 0x69, 0x58, 0x8e, 0x64, 0x36, 0x3c, 0x71, 0xa3, + 0x66, 0x62, 0x89, 0x33, 0x09, 0x08, 0x26, 0x01, 0x51, 0x57, 0x83, 0x37, + 0x30, 0x75, 0x48, 0x8e, 0x98, 0x23, 0x42, 0x60, 0x05, 0xc1, 0xfd, 0xa2, + 0x49, 0x59, 0x42, 0x83, 0xc1, 0x7e, 0x70, 0xc1, 0x8d, 0x51, 0x4c, 0x44, + 0x5c, 0x26, 0x03, 0x77, 0x50, 0x49, 0xfe, 0x16, 0x42, 0x36, 0xca, 0xbb, + 0x63, 0x8e, 0x5b, 0x2a, 0x00, 0x01, 0x00, 0x4a, 0xff, 0xf2, 0x03, 0x7f, + 0x04, 0x05, 0x00, 0x2a, 0x01, 0x02, 0x40, 0x0e, 0x28, 0x26, 0x1e, 0x1c, + 0x18, 0x16, 0x13, 0x11, 0x09, 0x07, 0x04, 0x02, 0x06, 0x07, 0x2b, 0x4b, + 0xb0, 0x09, 0x50, 0x58, 0x40, 0x33, 0x2a, 0x01, 0x01, 0x05, 0x1a, 0x01, + 0x02, 0x03, 0x02, 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, 0x32, + 0x00, 0x03, 0x02, 0x01, 0x03, 0x02, 0x30, 0x00, 0x01, 0x01, 0x05, 0x01, + 0x00, 0x24, 0x00, 0x05, 0x05, 0x14, 0x1f, 0x00, 0x02, 0x02, 0x04, 0x01, + 0x00, 0x24, 0x00, 0x04, 0x04, 0x12, 0x04, 0x20, 0x07, 0x1b, 0x4b, 0xb0, + 0x5f, 0x50, 0x58, 0x40, 0x33, 0x2a, 0x01, 0x01, 0x05, 0x1a, 0x01, 0x02, + 0x03, 0x02, 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, 0x32, 0x00, + 0x03, 0x02, 0x01, 0x03, 0x02, 0x30, 0x00, 0x01, 0x01, 0x05, 0x01, 0x00, + 0x24, 0x00, 0x05, 0x05, 0x14, 0x1f, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, + 0x24, 0x00, 0x04, 0x04, 0x15, 0x04, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, + 0x50, 0x58, 0x40, 0x31, 0x2a, 0x01, 0x01, 0x05, 0x1a, 0x01, 0x02, 0x03, + 0x02, 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, 0x32, 0x00, 0x03, + 0x02, 0x01, 0x03, 0x02, 0x30, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x01, + 0x01, 0x00, 0x26, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, + 0x04, 0x15, 0x04, 0x20, 0x06, 0x1b, 0x40, 0x3a, 0x2a, 0x01, 0x01, 0x05, + 0x1a, 0x01, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, + 0x03, 0x32, 0x00, 0x03, 0x02, 0x01, 0x03, 0x02, 0x30, 0x00, 0x05, 0x00, + 0x01, 0x00, 0x05, 0x01, 0x01, 0x00, 0x26, 0x00, 0x02, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, + 0x02, 0x04, 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, + 0x01, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x33, 0x32, 0x1f, 0x01, 0x0e, + 0x01, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, + 0x17, 0x03, 0x45, 0x08, 0x10, 0x0f, 0x0f, 0x23, 0x36, 0x4d, 0x38, 0x4a, + 0x72, 0x4d, 0x27, 0x2a, 0x4c, 0x6d, 0x44, 0x41, 0x54, 0x38, 0x24, 0x12, + 0x17, 0x0b, 0x32, 0x42, 0xc6, 0x6e, 0x5f, 0xa3, 0x78, 0x45, 0x3f, 0x79, + 0xb2, 0x73, 0x6a, 0xa4, 0x3f, 0x03, 0x41, 0x0b, 0x0c, 0x19, 0x1e, 0x19, + 0x35, 0x64, 0x8e, 0x58, 0x5c, 0x8f, 0x61, 0x33, 0x1f, 0x26, 0x1f, 0x11, + 0x41, 0x51, 0x4b, 0x46, 0x85, 0xc2, 0x7c, 0x71, 0xc0, 0x8b, 0x4e, 0x45, + 0x3f, 0x00, 0x00, 0x02, 0x00, 0x48, 0xff, 0xf2, 0x03, 0xc5, 0x05, 0xc1, + 0x00, 0x16, 0x00, 0x25, 0x01, 0x3b, 0x40, 0x16, 0x18, 0x17, 0x01, 0x00, + 0x1f, 0x1d, 0x17, 0x25, 0x18, 0x25, 0x15, 0x14, 0x11, 0x0f, 0x07, 0x05, + 0x00, 0x16, 0x01, 0x16, 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x22, 0x50, 0x58, + 0x40, 0x2e, 0x13, 0x01, 0x05, 0x02, 0x1b, 0x1a, 0x03, 0x03, 0x04, 0x05, + 0x02, 0x1e, 0x00, 0x03, 0x03, 0x0d, 0x1f, 0x00, 0x05, 0x05, 0x02, 0x01, + 0x00, 0x24, 0x00, 0x02, 0x02, 0x14, 0x1f, 0x07, 0x01, 0x04, 0x04, 0x00, + 0x01, 0x00, 0x24, 0x01, 0x06, 0x02, 0x00, 0x00, 0x0c, 0x00, 0x20, 0x06, + 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x32, 0x13, 0x01, 0x05, 0x02, + 0x1b, 0x1a, 0x03, 0x03, 0x04, 0x05, 0x02, 0x1e, 0x00, 0x03, 0x03, 0x0d, + 0x1f, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x14, + 0x1f, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x1f, 0x07, 0x01, 0x04, 0x04, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, 0x20, 0x07, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x30, 0x13, 0x01, 0x05, 0x02, 0x1b, 0x1a, + 0x03, 0x03, 0x04, 0x05, 0x02, 0x1e, 0x00, 0x02, 0x00, 0x05, 0x04, 0x02, + 0x05, 0x01, 0x00, 0x26, 0x00, 0x03, 0x03, 0x0d, 0x1f, 0x06, 0x01, 0x00, + 0x00, 0x0f, 0x1f, 0x07, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x15, 0x01, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x8d, 0x50, 0x58, + 0x40, 0x2f, 0x13, 0x01, 0x05, 0x02, 0x1b, 0x1a, 0x03, 0x03, 0x04, 0x05, + 0x02, 0x1e, 0x00, 0x02, 0x00, 0x05, 0x04, 0x02, 0x05, 0x01, 0x00, 0x26, + 0x07, 0x01, 0x04, 0x00, 0x01, 0x04, 0x01, 0x01, 0x00, 0x25, 0x06, 0x01, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x24, 0x00, 0x03, 0x03, 0x0d, 0x00, 0x20, + 0x05, 0x1b, 0x40, 0x3a, 0x13, 0x01, 0x05, 0x02, 0x1b, 0x1a, 0x03, 0x03, + 0x04, 0x05, 0x02, 0x1e, 0x00, 0x02, 0x00, 0x05, 0x04, 0x02, 0x05, 0x01, + 0x00, 0x26, 0x07, 0x01, 0x04, 0x00, 0x01, 0x04, 0x01, 0x00, 0x23, 0x00, + 0x03, 0x06, 0x01, 0x00, 0x01, 0x03, 0x00, 0x01, 0x00, 0x26, 0x07, 0x01, + 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x04, 0x01, 0x01, 0x00, + 0x21, 0x06, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x21, 0x22, 0x2f, + 0x01, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x16, 0x17, 0x11, 0x33, 0x11, 0x25, 0x32, 0x36, 0x37, 0x11, 0x2e, + 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x03, 0x5b, 0x26, 0x0a, + 0x10, 0x41, 0xa7, 0x6c, 0x57, 0x8e, 0x64, 0x36, 0x3c, 0x71, 0xa2, 0x67, + 0x5d, 0x84, 0x34, 0xb2, 0xfe, 0x3d, 0x57, 0x83, 0x37, 0x31, 0x75, 0x47, + 0x8e, 0x98, 0x22, 0x42, 0x60, 0x25, 0x7b, 0x4f, 0x5f, 0x43, 0x82, 0xc2, + 0x7e, 0x70, 0xc1, 0x8e, 0x51, 0x3f, 0x39, 0x02, 0x32, 0xfa, 0x3f, 0x82, + 0x50, 0x49, 0x01, 0xea, 0x42, 0x35, 0xca, 0xbb, 0x63, 0x8d, 0x5b, 0x2a, + 0x00, 0x02, 0x00, 0x4a, 0xff, 0xf2, 0x03, 0xc7, 0x04, 0x05, 0x00, 0x24, + 0x00, 0x2d, 0x01, 0x10, 0x40, 0x18, 0x26, 0x25, 0x01, 0x00, 0x29, 0x28, + 0x25, 0x2d, 0x26, 0x2d, 0x1c, 0x1a, 0x14, 0x12, 0x0f, 0x0d, 0x09, 0x07, + 0x00, 0x24, 0x01, 0x24, 0x09, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, + 0x40, 0x34, 0x16, 0x01, 0x02, 0x03, 0x01, 0x1e, 0x00, 0x03, 0x01, 0x02, + 0x01, 0x03, 0x02, 0x32, 0x00, 0x06, 0x00, 0x01, 0x03, 0x06, 0x01, 0x01, + 0x00, 0x26, 0x08, 0x01, 0x05, 0x05, 0x00, 0x01, 0x00, 0x24, 0x07, 0x01, + 0x00, 0x00, 0x14, 0x1f, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x00, + 0x04, 0x04, 0x12, 0x04, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x34, 0x16, 0x01, 0x02, 0x03, 0x01, 0x1e, 0x00, 0x03, 0x01, 0x02, + 0x01, 0x03, 0x02, 0x32, 0x00, 0x06, 0x00, 0x01, 0x03, 0x06, 0x01, 0x01, + 0x00, 0x26, 0x08, 0x01, 0x05, 0x05, 0x00, 0x01, 0x00, 0x24, 0x07, 0x01, + 0x00, 0x00, 0x14, 0x1f, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x00, + 0x04, 0x04, 0x15, 0x04, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x32, 0x16, 0x01, 0x02, 0x03, 0x01, 0x1e, 0x00, 0x03, 0x01, 0x02, + 0x01, 0x03, 0x02, 0x32, 0x07, 0x01, 0x00, 0x08, 0x01, 0x05, 0x06, 0x00, + 0x05, 0x01, 0x00, 0x26, 0x00, 0x06, 0x00, 0x01, 0x03, 0x06, 0x01, 0x01, + 0x00, 0x26, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x04, + 0x15, 0x04, 0x20, 0x06, 0x1b, 0x40, 0x3b, 0x16, 0x01, 0x02, 0x03, 0x01, + 0x1e, 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, 0x07, 0x01, 0x00, + 0x08, 0x01, 0x05, 0x06, 0x00, 0x05, 0x01, 0x00, 0x26, 0x00, 0x06, 0x00, + 0x01, 0x03, 0x06, 0x01, 0x01, 0x00, 0x26, 0x00, 0x02, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, + 0x02, 0x04, 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, + 0x01, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x21, 0x1e, 0x03, 0x33, + 0x32, 0x3e, 0x02, 0x33, 0x32, 0x1f, 0x01, 0x0e, 0x03, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x3e, 0x02, 0x17, 0x22, 0x06, 0x07, 0x21, 0x34, 0x2e, + 0x02, 0x02, 0x23, 0x5b, 0x9a, 0x70, 0x3f, 0x12, 0x19, 0xfd, 0x5e, 0x02, + 0x30, 0x54, 0x74, 0x48, 0x43, 0x61, 0x46, 0x2f, 0x11, 0x16, 0x0c, 0x32, + 0x21, 0x5c, 0x69, 0x70, 0x37, 0x69, 0xb1, 0x81, 0x48, 0x41, 0x7a, 0xb0, + 0x72, 0x81, 0x94, 0x12, 0x02, 0x27, 0x22, 0x42, 0x5f, 0x04, 0x05, 0x3d, + 0x73, 0xa9, 0x6c, 0x2a, 0x1c, 0x60, 0x8e, 0x5f, 0x2f, 0x1f, 0x24, 0x1f, + 0x11, 0x41, 0x28, 0x3b, 0x26, 0x13, 0x47, 0x89, 0xca, 0x83, 0x6a, 0xb8, + 0x87, 0x4d, 0x83, 0x95, 0x84, 0x3e, 0x67, 0x4b, 0x29, 0x00, 0x00, 0x01, + 0x00, 0x1a, 0x00, 0x00, 0x02, 0x94, 0x05, 0xae, 0x00, 0x1e, 0x01, 0x25, + 0x40, 0x12, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, + 0x15, 0x12, 0x0e, 0x0c, 0x07, 0x06, 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x32, + 0x50, 0x58, 0x40, 0x2b, 0x0f, 0x01, 0x02, 0x01, 0x01, 0x01, 0x05, 0x04, + 0x02, 0x1e, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, + 0x11, 0x1f, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x24, 0x03, 0x01, 0x00, + 0x00, 0x0e, 0x1f, 0x06, 0x01, 0x05, 0x05, 0x0c, 0x05, 0x20, 0x06, 0x1b, + 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x29, 0x0f, 0x01, 0x02, 0x01, 0x01, + 0x01, 0x05, 0x04, 0x02, 0x1e, 0x03, 0x01, 0x00, 0x00, 0x04, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x26, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x11, 0x1f, 0x06, 0x01, 0x05, 0x05, 0x0c, 0x05, 0x20, 0x05, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x27, 0x0f, 0x01, 0x02, 0x01, + 0x01, 0x01, 0x05, 0x04, 0x02, 0x1e, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, + 0x02, 0x01, 0x00, 0x26, 0x03, 0x01, 0x00, 0x00, 0x04, 0x05, 0x00, 0x04, + 0x00, 0x00, 0x26, 0x06, 0x01, 0x05, 0x05, 0x0f, 0x05, 0x20, 0x04, 0x1b, + 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x33, 0x0f, 0x01, 0x02, 0x01, 0x01, + 0x01, 0x05, 0x04, 0x02, 0x1e, 0x06, 0x01, 0x05, 0x04, 0x05, 0x35, 0x00, + 0x01, 0x00, 0x02, 0x00, 0x01, 0x02, 0x01, 0x00, 0x26, 0x03, 0x01, 0x00, + 0x04, 0x04, 0x00, 0x00, 0x00, 0x23, 0x03, 0x01, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x21, 0x06, 0x1b, 0x40, + 0x39, 0x0f, 0x01, 0x02, 0x01, 0x01, 0x01, 0x05, 0x04, 0x02, 0x1e, 0x00, + 0x00, 0x02, 0x03, 0x02, 0x00, 0x03, 0x32, 0x06, 0x01, 0x05, 0x04, 0x05, + 0x35, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x02, 0x01, 0x00, 0x26, 0x00, + 0x03, 0x04, 0x04, 0x03, 0x00, 0x00, 0x23, 0x00, 0x03, 0x03, 0x04, 0x00, + 0x00, 0x24, 0x00, 0x04, 0x03, 0x04, 0x00, 0x00, 0x21, 0x07, 0x59, 0x59, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x33, 0x11, 0x27, 0x2e, 0x01, 0x3d, 0x01, + 0x33, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x07, 0x0e, 0x01, 0x2b, + 0x01, 0x22, 0x0e, 0x02, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0xba, 0x70, + 0x15, 0x1b, 0xa0, 0x31, 0x5b, 0x80, 0x50, 0x44, 0x3a, 0x04, 0x01, 0x20, + 0x1d, 0x1f, 0x2e, 0x4b, 0x36, 0x1d, 0x01, 0x25, 0xfe, 0xe1, 0x03, 0x5d, + 0x0d, 0x05, 0x15, 0x14, 0x49, 0x62, 0x57, 0x87, 0x5d, 0x30, 0x14, 0x59, + 0x14, 0x08, 0x18, 0x36, 0x58, 0x41, 0x5d, 0x81, 0xfc, 0xa0, 0x00, 0x03, + 0x00, 0x32, 0xfe, 0x93, 0x03, 0xde, 0x04, 0x06, 0x00, 0x39, 0x00, 0x4d, + 0x00, 0x5d, 0x01, 0x60, 0x40, 0x1c, 0x4f, 0x4e, 0x01, 0x00, 0x57, 0x55, + 0x4e, 0x5d, 0x4f, 0x5d, 0x4a, 0x48, 0x40, 0x3e, 0x23, 0x21, 0x19, 0x17, + 0x10, 0x0e, 0x04, 0x03, 0x00, 0x39, 0x01, 0x39, 0x0b, 0x07, 0x2b, 0x4b, + 0xb0, 0x19, 0x50, 0x58, 0x40, 0x45, 0x08, 0x01, 0x07, 0x08, 0x32, 0x11, + 0x02, 0x02, 0x07, 0x41, 0x2a, 0x02, 0x05, 0x03, 0x03, 0x1e, 0x0a, 0x01, + 0x07, 0x00, 0x02, 0x03, 0x07, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x00, + 0x05, 0x06, 0x03, 0x05, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x0e, 0x1f, + 0x00, 0x08, 0x08, 0x00, 0x01, 0x00, 0x24, 0x09, 0x01, 0x00, 0x00, 0x14, + 0x1f, 0x00, 0x06, 0x06, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x04, 0x16, + 0x04, 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, 0x48, 0x08, + 0x01, 0x07, 0x08, 0x32, 0x11, 0x02, 0x02, 0x07, 0x41, 0x2a, 0x02, 0x05, + 0x03, 0x03, 0x1e, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x08, 0x32, 0x0a, + 0x01, 0x07, 0x00, 0x02, 0x03, 0x07, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, + 0x00, 0x05, 0x06, 0x03, 0x05, 0x01, 0x00, 0x26, 0x00, 0x08, 0x08, 0x00, + 0x01, 0x00, 0x24, 0x09, 0x01, 0x00, 0x00, 0x14, 0x1f, 0x00, 0x06, 0x06, + 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x04, 0x16, 0x04, 0x20, 0x08, 0x1b, + 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x45, 0x08, 0x01, 0x07, 0x08, 0x32, + 0x11, 0x02, 0x02, 0x07, 0x41, 0x2a, 0x02, 0x05, 0x03, 0x03, 0x1e, 0x00, + 0x01, 0x00, 0x08, 0x00, 0x01, 0x08, 0x32, 0x0a, 0x01, 0x07, 0x00, 0x02, + 0x03, 0x07, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x00, 0x05, 0x06, 0x03, + 0x05, 0x01, 0x00, 0x26, 0x00, 0x06, 0x00, 0x04, 0x06, 0x04, 0x01, 0x00, + 0x25, 0x00, 0x08, 0x08, 0x00, 0x01, 0x00, 0x24, 0x09, 0x01, 0x00, 0x00, + 0x14, 0x08, 0x20, 0x07, 0x1b, 0x40, 0x4f, 0x08, 0x01, 0x07, 0x08, 0x32, + 0x11, 0x02, 0x02, 0x07, 0x41, 0x2a, 0x02, 0x05, 0x03, 0x03, 0x1e, 0x00, + 0x01, 0x00, 0x08, 0x00, 0x01, 0x08, 0x32, 0x09, 0x01, 0x00, 0x00, 0x08, + 0x07, 0x00, 0x08, 0x01, 0x00, 0x26, 0x0a, 0x01, 0x07, 0x00, 0x02, 0x03, + 0x07, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x00, 0x05, 0x06, 0x03, 0x05, + 0x01, 0x00, 0x26, 0x00, 0x06, 0x04, 0x04, 0x06, 0x01, 0x00, 0x23, 0x00, + 0x06, 0x06, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x06, 0x04, 0x01, 0x00, + 0x21, 0x08, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x32, 0x16, 0x17, + 0x21, 0x15, 0x14, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x27, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x06, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x3e, + 0x02, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x02, 0x01, 0x34, 0x2e, 0x04, + 0x27, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x01, + 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, + 0x02, 0x01, 0xe7, 0x42, 0x73, 0x2f, 0x01, 0x13, 0x2a, 0x73, 0x22, 0x39, + 0x65, 0x8b, 0x53, 0x47, 0x3f, 0x20, 0x21, 0x3a, 0x60, 0x7a, 0x7f, 0x7a, + 0x60, 0x3a, 0x41, 0x7a, 0xb0, 0x6f, 0x6f, 0xa7, 0x6e, 0x37, 0x5f, 0x53, + 0x2b, 0x33, 0x10, 0x21, 0x30, 0x20, 0x4b, 0x55, 0x39, 0x66, 0x8d, 0x01, + 0x90, 0x2a, 0x48, 0x5e, 0x68, 0x6c, 0x31, 0x39, 0x47, 0x23, 0x48, 0x6d, + 0x4a, 0x48, 0x72, 0x4f, 0x2a, 0xfe, 0xc4, 0x36, 0x53, 0x38, 0x1c, 0x71, + 0x6c, 0x6b, 0x71, 0x1d, 0x38, 0x52, 0x04, 0x06, 0x1d, 0x1c, 0x42, 0x21, + 0x09, 0x10, 0x41, 0x50, 0x4a, 0x79, 0x56, 0x2e, 0x11, 0x14, 0x2e, 0x16, + 0x24, 0x25, 0x10, 0x04, 0x09, 0x16, 0x32, 0x58, 0x46, 0x41, 0x7a, 0x5f, + 0x39, 0x2c, 0x4a, 0x61, 0x35, 0x4b, 0x69, 0x1f, 0x14, 0x43, 0x38, 0x16, + 0x2f, 0x2e, 0x2a, 0x10, 0x2a, 0x8b, 0x5d, 0x4a, 0x79, 0x55, 0x2e, 0xfb, + 0xc3, 0x26, 0x2e, 0x19, 0x0c, 0x05, 0x06, 0x08, 0x1b, 0x4e, 0x36, 0x22, + 0x3b, 0x2b, 0x19, 0x1a, 0x30, 0x42, 0x02, 0x4e, 0x1e, 0x36, 0x4b, 0x2d, + 0x5d, 0x6e, 0x6e, 0x5d, 0x2d, 0x4b, 0x36, 0x1e, 0x00, 0x01, 0x00, 0x92, + 0x00, 0x00, 0x03, 0xdd, 0x05, 0xc1, 0x00, 0x15, 0x00, 0xf5, 0x40, 0x10, + 0x00, 0x00, 0x00, 0x15, 0x00, 0x15, 0x12, 0x10, 0x0d, 0x0c, 0x07, 0x05, + 0x02, 0x01, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x21, + 0x14, 0x03, 0x02, 0x02, 0x03, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x0d, 0x1f, + 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x14, 0x1f, + 0x05, 0x04, 0x02, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x05, 0x1b, 0x4b, 0xb0, + 0x6c, 0x50, 0x58, 0x40, 0x1f, 0x14, 0x03, 0x02, 0x02, 0x03, 0x01, 0x1e, + 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x00, 0x00, + 0x00, 0x0d, 0x1f, 0x05, 0x04, 0x02, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x04, + 0x1b, 0x4b, 0xb0, 0x8d, 0x50, 0x58, 0x40, 0x21, 0x14, 0x03, 0x02, 0x02, + 0x03, 0x01, 0x1e, 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, + 0x26, 0x05, 0x04, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x0d, 0x02, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, + 0x2a, 0x14, 0x03, 0x02, 0x02, 0x03, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x23, 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, + 0x00, 0x26, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x24, 0x05, 0x04, 0x02, + 0x02, 0x00, 0x02, 0x00, 0x00, 0x21, 0x05, 0x1b, 0x40, 0x2e, 0x14, 0x03, + 0x02, 0x04, 0x03, 0x01, 0x1e, 0x00, 0x02, 0x04, 0x02, 0x35, 0x00, 0x00, + 0x01, 0x04, 0x00, 0x00, 0x00, 0x23, 0x00, 0x01, 0x00, 0x03, 0x04, 0x01, + 0x03, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0x05, + 0x01, 0x04, 0x00, 0x04, 0x00, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x33, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, + 0x92, 0xb2, 0x41, 0x9e, 0x67, 0x53, 0x7f, 0x55, 0x2c, 0xb2, 0x69, 0x6c, + 0x4f, 0x89, 0x3a, 0x05, 0xc1, 0xfd, 0xac, 0x45, 0x53, 0x37, 0x65, 0x8e, + 0x56, 0xfd, 0x7b, 0x02, 0x85, 0x73, 0x7f, 0x4c, 0x41, 0xfd, 0x16, 0x00, + 0x00, 0x02, 0x00, 0x82, 0x00, 0x00, 0x01, 0x80, 0x05, 0xb3, 0x00, 0x03, + 0x00, 0x17, 0x00, 0xc2, 0x40, 0x0e, 0x00, 0x00, 0x14, 0x12, 0x0a, 0x08, + 0x00, 0x03, 0x00, 0x03, 0x02, 0x01, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x09, + 0x50, 0x58, 0x40, 0x19, 0x00, 0x02, 0x02, 0x03, 0x01, 0x00, 0x24, 0x00, + 0x03, 0x03, 0x11, 0x1f, 0x04, 0x01, 0x01, 0x01, 0x0e, 0x1f, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, + 0x19, 0x00, 0x02, 0x02, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x0d, + 0x1f, 0x04, 0x01, 0x01, 0x01, 0x0e, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x1b, 0x00, 0x02, + 0x02, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x0d, 0x1f, 0x04, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x20, + 0x04, 0x1b, 0x4b, 0xb0, 0x8d, 0x50, 0x58, 0x40, 0x18, 0x04, 0x01, 0x01, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x25, 0x00, 0x02, 0x02, 0x03, 0x01, + 0x00, 0x24, 0x00, 0x03, 0x03, 0x0d, 0x02, 0x20, 0x03, 0x1b, 0x40, 0x23, + 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x02, 0x01, 0x00, 0x26, 0x04, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x21, 0x04, 0x59, + 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x13, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x01, 0x58, 0xb2, 0xda, 0x15, 0x23, 0x2e, 0x1a, 0x1a, 0x2d, + 0x23, 0x14, 0x14, 0x23, 0x2d, 0x1a, 0x1a, 0x2e, 0x23, 0x15, 0x03, 0xf5, + 0xfc, 0x0b, 0x03, 0xf5, 0x01, 0x3e, 0x1a, 0x2d, 0x23, 0x14, 0x14, 0x23, + 0x2d, 0x1a, 0x1a, 0x2f, 0x23, 0x14, 0x14, 0x23, 0x2f, 0x00, 0x00, 0x02, + 0xff, 0xc8, 0xfe, 0x94, 0x01, 0x80, 0x05, 0xb3, 0x00, 0x14, 0x00, 0x28, + 0x01, 0x01, 0x40, 0x10, 0x00, 0x00, 0x25, 0x23, 0x1b, 0x19, 0x00, 0x14, + 0x00, 0x14, 0x11, 0x0c, 0x07, 0x05, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x09, + 0x50, 0x58, 0x40, 0x26, 0x09, 0x01, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x03, + 0x03, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x04, 0x11, 0x1f, 0x05, 0x01, + 0x02, 0x02, 0x0e, 0x1f, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x16, 0x00, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x49, 0x50, 0x58, + 0x40, 0x26, 0x09, 0x01, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x03, 0x03, 0x04, + 0x01, 0x00, 0x24, 0x00, 0x04, 0x04, 0x0d, 0x1f, 0x05, 0x01, 0x02, 0x02, + 0x0e, 0x1f, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x23, + 0x09, 0x01, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x25, 0x00, 0x03, 0x03, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, + 0x04, 0x0d, 0x1f, 0x05, 0x01, 0x02, 0x02, 0x0e, 0x02, 0x20, 0x05, 0x1b, + 0x4b, 0xb0, 0x8d, 0x50, 0x58, 0x40, 0x26, 0x09, 0x01, 0x00, 0x01, 0x01, + 0x1e, 0x05, 0x01, 0x02, 0x03, 0x01, 0x03, 0x02, 0x01, 0x32, 0x00, 0x01, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x25, 0x00, 0x03, 0x03, 0x04, 0x01, + 0x00, 0x24, 0x00, 0x04, 0x04, 0x0d, 0x03, 0x20, 0x05, 0x1b, 0x40, 0x30, + 0x09, 0x01, 0x00, 0x01, 0x01, 0x1e, 0x05, 0x01, 0x02, 0x03, 0x01, 0x03, + 0x02, 0x01, 0x32, 0x00, 0x04, 0x00, 0x03, 0x02, 0x04, 0x03, 0x01, 0x00, + 0x26, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x23, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x21, 0x06, + 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x11, 0x13, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x01, 0x58, 0x20, 0x45, 0x6d, + 0x4c, 0x21, 0x36, 0x1b, 0x08, 0x02, 0x0e, 0x0f, 0x08, 0x12, 0x0d, 0x4e, + 0x42, 0xda, 0x15, 0x23, 0x2e, 0x1a, 0x1a, 0x2d, 0x23, 0x14, 0x14, 0x23, + 0x2d, 0x1a, 0x1a, 0x2e, 0x23, 0x15, 0x03, 0xf5, 0xfb, 0xc0, 0x3d, 0x69, + 0x4e, 0x2d, 0x0a, 0x0a, 0x60, 0x0d, 0x07, 0x01, 0x49, 0x51, 0x04, 0x40, + 0x01, 0x3e, 0x1a, 0x2d, 0x23, 0x14, 0x14, 0x23, 0x2d, 0x1a, 0x1a, 0x2f, + 0x23, 0x14, 0x14, 0x23, 0x2f, 0x00, 0x00, 0x01, 0x00, 0x98, 0x00, 0x00, + 0x03, 0xf8, 0x05, 0xc1, 0x00, 0x1e, 0x01, 0x11, 0x40, 0x12, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x1e, 0x1d, 0x1c, 0x1b, 0x19, 0x14, 0x12, 0x0a, 0x08, + 0x03, 0x01, 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x23, + 0x0e, 0x01, 0x03, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, + 0x03, 0x01, 0x00, 0x26, 0x06, 0x01, 0x05, 0x05, 0x0d, 0x1f, 0x00, 0x01, + 0x01, 0x0e, 0x1f, 0x04, 0x01, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x05, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x25, 0x0e, 0x01, 0x03, 0x00, 0x01, + 0x1e, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, 0x26, 0x06, + 0x01, 0x05, 0x05, 0x0d, 0x1f, 0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, + 0x04, 0x01, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x8d, + 0x50, 0x58, 0x40, 0x28, 0x0e, 0x01, 0x03, 0x00, 0x01, 0x1e, 0x00, 0x01, + 0x00, 0x02, 0x01, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, + 0x03, 0x01, 0x00, 0x26, 0x04, 0x01, 0x02, 0x02, 0x05, 0x00, 0x00, 0x24, + 0x06, 0x01, 0x05, 0x05, 0x0d, 0x05, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x31, 0x0e, 0x01, 0x03, 0x00, 0x01, 0x1e, 0x06, 0x01, + 0x05, 0x01, 0x02, 0x05, 0x00, 0x00, 0x23, 0x00, 0x01, 0x00, 0x02, 0x01, + 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, + 0x26, 0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, 0x04, 0x01, 0x02, 0x01, + 0x02, 0x01, 0x00, 0x21, 0x06, 0x1b, 0x40, 0x32, 0x0e, 0x01, 0x03, 0x00, + 0x01, 0x1e, 0x00, 0x01, 0x00, 0x02, 0x01, 0x01, 0x00, 0x23, 0x00, 0x00, + 0x00, 0x03, 0x04, 0x00, 0x03, 0x01, 0x00, 0x26, 0x06, 0x01, 0x05, 0x00, + 0x04, 0x02, 0x05, 0x04, 0x00, 0x00, 0x26, 0x00, 0x01, 0x01, 0x02, 0x01, + 0x00, 0x24, 0x00, 0x02, 0x01, 0x02, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x36, 0x37, 0x01, + 0x3e, 0x01, 0x3b, 0x01, 0x01, 0x0e, 0x01, 0x07, 0x1e, 0x01, 0x17, 0x01, + 0x23, 0x22, 0x26, 0x27, 0x01, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, + 0x01, 0x4b, 0x2e, 0x14, 0x1a, 0x10, 0x01, 0x40, 0x0f, 0x1e, 0x19, 0xa2, + 0xfe, 0x8b, 0x0e, 0x1b, 0x11, 0x12, 0x1d, 0x0d, 0x01, 0x8c, 0xa0, 0x16, + 0x1f, 0x0e, 0xfe, 0xb3, 0x0f, 0x1e, 0x1e, 0x32, 0xb3, 0x05, 0xc1, 0xfc, + 0x9d, 0x0b, 0x11, 0x01, 0x57, 0x10, 0x14, 0xfe, 0x73, 0x11, 0x1a, 0x0a, + 0x0c, 0x1f, 0x14, 0xfe, 0x0c, 0x11, 0x12, 0x01, 0x9f, 0x15, 0x0d, 0xfe, + 0x1c, 0x05, 0xc1, 0x00, 0x00, 0x01, 0x00, 0xa6, 0x00, 0x00, 0x01, 0x58, + 0x05, 0xc1, 0x00, 0x03, 0x00, 0x6f, 0x40, 0x0a, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x03, 0x02, 0x01, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x0d, 0x02, 0x01, 0x01, 0x01, 0x0d, 0x1f, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x20, 0x02, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x0d, 0x02, + 0x01, 0x01, 0x01, 0x0d, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x02, + 0x1b, 0x4b, 0xb0, 0x8d, 0x50, 0x58, 0x40, 0x0f, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x24, 0x02, 0x01, 0x01, 0x01, 0x0d, 0x00, 0x20, 0x02, 0x1b, + 0x40, 0x19, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x23, 0x02, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x21, 0x03, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x23, + 0x11, 0x01, 0x58, 0xb2, 0x05, 0xc1, 0xfa, 0x3f, 0x05, 0xc1, 0x00, 0x01, + 0x00, 0x92, 0x00, 0x00, 0x05, 0xef, 0x04, 0x05, 0x00, 0x2a, 0x01, 0x1b, + 0x40, 0x16, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x2a, 0x27, 0x25, 0x22, 0x21, + 0x1c, 0x1a, 0x17, 0x16, 0x11, 0x0f, 0x09, 0x07, 0x03, 0x01, 0x09, 0x07, + 0x2b, 0x4b, 0xb0, 0x1e, 0x50, 0x58, 0x40, 0x21, 0x29, 0x0b, 0x05, 0x03, + 0x03, 0x04, 0x01, 0x1e, 0x06, 0x01, 0x04, 0x04, 0x00, 0x01, 0x00, 0x24, + 0x02, 0x01, 0x02, 0x00, 0x00, 0x0e, 0x1f, 0x08, 0x07, 0x05, 0x03, 0x03, + 0x03, 0x0c, 0x03, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, + 0x25, 0x29, 0x0b, 0x05, 0x03, 0x03, 0x04, 0x01, 0x1e, 0x00, 0x00, 0x00, + 0x0e, 0x1f, 0x06, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x02, 0x01, + 0x01, 0x01, 0x14, 0x1f, 0x08, 0x07, 0x05, 0x03, 0x03, 0x03, 0x0c, 0x03, + 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x25, 0x29, 0x0b, + 0x05, 0x03, 0x03, 0x04, 0x01, 0x1e, 0x02, 0x01, 0x01, 0x06, 0x01, 0x04, + 0x03, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x24, 0x08, 0x07, 0x05, 0x03, 0x03, 0x03, 0x0f, 0x03, 0x20, 0x04, 0x1b, + 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x2e, 0x29, 0x0b, 0x05, 0x03, 0x03, + 0x04, 0x01, 0x1e, 0x00, 0x00, 0x04, 0x03, 0x00, 0x01, 0x00, 0x23, 0x02, + 0x01, 0x01, 0x06, 0x01, 0x04, 0x03, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x24, 0x08, 0x07, 0x05, 0x03, 0x03, 0x00, + 0x03, 0x00, 0x00, 0x21, 0x05, 0x1b, 0x40, 0x40, 0x29, 0x0b, 0x05, 0x03, + 0x07, 0x04, 0x01, 0x1e, 0x00, 0x05, 0x07, 0x03, 0x07, 0x05, 0x03, 0x32, + 0x00, 0x03, 0x03, 0x33, 0x00, 0x00, 0x06, 0x07, 0x00, 0x01, 0x00, 0x23, + 0x00, 0x01, 0x00, 0x06, 0x04, 0x01, 0x06, 0x01, 0x00, 0x26, 0x00, 0x02, + 0x00, 0x04, 0x07, 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x24, 0x08, 0x01, 0x07, 0x00, 0x07, 0x00, 0x00, 0x21, 0x08, + 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x33, 0x11, 0x33, 0x32, 0x1f, + 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x03, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x92, 0x6a, + 0x26, 0x0a, 0x0d, 0x38, 0x8b, 0x5c, 0x67, 0x7f, 0x1c, 0x15, 0x45, 0x56, + 0x61, 0x32, 0x50, 0x7d, 0x57, 0x2e, 0xb2, 0x68, 0x63, 0x2c, 0x4f, 0x3c, + 0x23, 0xb2, 0x62, 0x5e, 0x42, 0x71, 0x2f, 0x03, 0xf5, 0x25, 0x68, 0x45, + 0x58, 0x72, 0x61, 0x37, 0x50, 0x34, 0x18, 0x33, 0x62, 0x8f, 0x5c, 0xfd, + 0x7b, 0x02, 0x85, 0x77, 0x7b, 0x1f, 0x3c, 0x5b, 0x3c, 0xfd, 0x7b, 0x02, + 0x85, 0x7a, 0x78, 0x47, 0x3d, 0xfd, 0x0d, 0x00, 0x00, 0x01, 0x00, 0x92, + 0x00, 0x00, 0x03, 0xdd, 0x04, 0x05, 0x00, 0x17, 0x00, 0xf3, 0x40, 0x10, + 0x00, 0x00, 0x00, 0x17, 0x00, 0x17, 0x14, 0x12, 0x0f, 0x0e, 0x09, 0x07, + 0x03, 0x01, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x1e, 0x50, 0x58, 0x40, 0x1d, + 0x16, 0x05, 0x02, 0x02, 0x03, 0x01, 0x1e, 0x00, 0x03, 0x03, 0x00, 0x01, + 0x00, 0x24, 0x01, 0x01, 0x00, 0x00, 0x0e, 0x1f, 0x05, 0x04, 0x02, 0x02, + 0x02, 0x0c, 0x02, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, + 0x21, 0x16, 0x05, 0x02, 0x02, 0x03, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x0e, + 0x1f, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x14, + 0x1f, 0x05, 0x04, 0x02, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x05, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x21, 0x16, 0x05, 0x02, 0x02, 0x03, 0x01, + 0x1e, 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x24, 0x05, 0x04, 0x02, 0x02, 0x02, 0x0f, + 0x02, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x2a, 0x16, + 0x05, 0x02, 0x02, 0x03, 0x01, 0x1e, 0x00, 0x00, 0x03, 0x02, 0x00, 0x01, + 0x00, 0x23, 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x24, 0x05, 0x04, 0x02, 0x02, 0x00, + 0x02, 0x00, 0x00, 0x21, 0x05, 0x1b, 0x40, 0x2e, 0x16, 0x05, 0x02, 0x04, + 0x03, 0x01, 0x1e, 0x00, 0x02, 0x04, 0x02, 0x35, 0x00, 0x00, 0x03, 0x04, + 0x00, 0x01, 0x00, 0x23, 0x00, 0x01, 0x00, 0x03, 0x04, 0x01, 0x03, 0x01, + 0x00, 0x26, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0x05, 0x01, 0x04, + 0x00, 0x04, 0x00, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x33, 0x11, 0x33, 0x32, 0x1f, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, + 0x92, 0x6a, 0x26, 0x0a, 0x0e, 0x42, 0xa3, 0x6b, 0x53, 0x7f, 0x55, 0x2c, + 0xb2, 0x69, 0x6c, 0x4f, 0x89, 0x3a, 0x03, 0xf5, 0x25, 0x6e, 0x49, 0x5a, + 0x37, 0x65, 0x8e, 0x56, 0xfd, 0x7b, 0x02, 0x85, 0x73, 0x7f, 0x4c, 0x41, + 0xfd, 0x16, 0x00, 0x02, 0x00, 0x48, 0xff, 0xf2, 0x04, 0x0e, 0x04, 0x05, + 0x00, 0x13, 0x00, 0x23, 0x00, 0xab, 0x40, 0x12, 0x15, 0x14, 0x01, 0x00, + 0x1b, 0x19, 0x14, 0x23, 0x15, 0x23, 0x0b, 0x09, 0x00, 0x13, 0x01, 0x13, + 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, 0x40, 0x1c, 0x00, 0x03, + 0x03, 0x00, 0x01, 0x00, 0x24, 0x04, 0x01, 0x00, 0x00, 0x14, 0x1f, 0x05, + 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x12, 0x01, + 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1c, 0x00, 0x03, + 0x03, 0x00, 0x01, 0x00, 0x24, 0x04, 0x01, 0x00, 0x00, 0x14, 0x1f, 0x05, + 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, + 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x1a, 0x04, 0x01, + 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, 0x26, 0x05, 0x01, 0x02, + 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, 0x20, 0x03, + 0x1b, 0x40, 0x24, 0x04, 0x01, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, + 0x00, 0x26, 0x05, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x23, 0x05, + 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x02, 0x01, 0x01, + 0x00, 0x21, 0x04, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, + 0x02, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x14, 0x1e, 0x02, 0x02, 0x2c, 0x6f, 0xb3, 0x7d, 0x43, 0x43, 0x7d, 0xb3, + 0x6f, 0x6f, 0xb3, 0x7e, 0x44, 0x44, 0x7e, 0xb3, 0x6f, 0x96, 0x94, 0x94, + 0x96, 0x4c, 0x70, 0x4b, 0x25, 0x25, 0x4b, 0x70, 0x04, 0x05, 0x4a, 0x88, + 0xc1, 0x77, 0x78, 0xc0, 0x88, 0x49, 0x49, 0x88, 0xc0, 0x78, 0x77, 0xc1, + 0x88, 0x4a, 0xfc, 0x78, 0xc9, 0xb4, 0xb5, 0xca, 0x34, 0x62, 0x8f, 0x5a, + 0x5a, 0x8e, 0x61, 0x34, 0x00, 0x02, 0x00, 0x92, 0xfe, 0xa9, 0x04, 0x0f, + 0x04, 0x07, 0x00, 0x16, 0x00, 0x25, 0x01, 0x75, 0x40, 0x16, 0x18, 0x17, + 0x00, 0x00, 0x1f, 0x1d, 0x17, 0x25, 0x18, 0x25, 0x00, 0x16, 0x00, 0x16, + 0x13, 0x11, 0x09, 0x07, 0x03, 0x01, 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x09, + 0x50, 0x58, 0x40, 0x2e, 0x1b, 0x1a, 0x05, 0x03, 0x05, 0x04, 0x15, 0x01, + 0x02, 0x05, 0x02, 0x1e, 0x07, 0x01, 0x04, 0x04, 0x00, 0x01, 0x00, 0x24, + 0x01, 0x01, 0x00, 0x00, 0x0e, 0x1f, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, + 0x24, 0x00, 0x02, 0x02, 0x12, 0x1f, 0x06, 0x01, 0x03, 0x03, 0x10, 0x03, + 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x1a, 0x50, 0x58, 0x40, 0x2e, 0x1b, 0x1a, + 0x05, 0x03, 0x05, 0x04, 0x15, 0x01, 0x02, 0x05, 0x02, 0x1e, 0x07, 0x01, + 0x04, 0x04, 0x00, 0x01, 0x00, 0x24, 0x01, 0x01, 0x00, 0x00, 0x0e, 0x1f, + 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x1f, + 0x06, 0x01, 0x03, 0x03, 0x10, 0x03, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x49, + 0x50, 0x58, 0x40, 0x32, 0x1b, 0x1a, 0x05, 0x03, 0x05, 0x04, 0x15, 0x01, + 0x02, 0x05, 0x02, 0x1e, 0x00, 0x00, 0x00, 0x0e, 0x1f, 0x07, 0x01, 0x04, + 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x14, 0x1f, 0x00, 0x05, + 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x1f, 0x06, 0x01, + 0x03, 0x03, 0x10, 0x03, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x34, 0x1b, 0x1a, 0x05, 0x03, 0x05, 0x04, 0x15, 0x01, 0x02, 0x05, + 0x02, 0x1e, 0x07, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x01, 0x14, 0x1f, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, + 0x02, 0x15, 0x1f, 0x06, 0x01, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x0e, 0x03, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x2f, 0x1b, 0x1a, 0x05, 0x03, 0x05, 0x04, 0x15, 0x01, 0x02, 0x05, + 0x02, 0x1e, 0x00, 0x01, 0x07, 0x01, 0x04, 0x05, 0x01, 0x04, 0x01, 0x00, + 0x26, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x03, 0x00, 0x00, 0x25, 0x00, + 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x02, 0x20, + 0x05, 0x1b, 0x40, 0x39, 0x1b, 0x1a, 0x05, 0x03, 0x05, 0x04, 0x15, 0x01, + 0x02, 0x05, 0x02, 0x1e, 0x00, 0x00, 0x04, 0x03, 0x00, 0x01, 0x00, 0x23, + 0x00, 0x01, 0x07, 0x01, 0x04, 0x05, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, + 0x05, 0x00, 0x02, 0x03, 0x05, 0x02, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x24, 0x06, 0x01, 0x03, 0x00, 0x03, 0x00, 0x00, 0x21, + 0x06, 0x59, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x11, 0x33, + 0x32, 0x1f, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x01, 0x22, 0x06, 0x07, 0x11, 0x1e, + 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x92, 0x6a, 0x26, 0x0a, + 0x0f, 0x41, 0xa7, 0x6d, 0x57, 0x8e, 0x64, 0x36, 0x3c, 0x70, 0xa3, 0x66, + 0x5e, 0x85, 0x33, 0x01, 0x11, 0x57, 0x83, 0x37, 0x31, 0x75, 0x48, 0x8d, + 0x98, 0x23, 0x42, 0x60, 0xfe, 0xa9, 0x05, 0x4c, 0x25, 0x78, 0x4f, 0x60, + 0x43, 0x83, 0xc2, 0x7e, 0x70, 0xc1, 0x8d, 0x51, 0x3e, 0x39, 0xfe, 0x40, + 0x04, 0xce, 0x50, 0x49, 0xfe, 0x16, 0x42, 0x36, 0xca, 0xbb, 0x63, 0x8e, + 0x5b, 0x2a, 0x00, 0x02, 0x00, 0x48, 0xfe, 0xa9, 0x03, 0xc5, 0x04, 0x07, + 0x00, 0x16, 0x00, 0x25, 0x01, 0x76, 0x40, 0x16, 0x18, 0x17, 0x00, 0x00, + 0x1f, 0x1d, 0x17, 0x25, 0x18, 0x25, 0x00, 0x16, 0x00, 0x15, 0x11, 0x0f, + 0x07, 0x05, 0x02, 0x01, 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, + 0x40, 0x2e, 0x13, 0x01, 0x05, 0x02, 0x1b, 0x1a, 0x03, 0x03, 0x04, 0x05, + 0x02, 0x1e, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x06, 0x03, 0x02, + 0x02, 0x02, 0x14, 0x1f, 0x07, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, + 0x00, 0x01, 0x01, 0x12, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x06, + 0x1b, 0x4b, 0xb0, 0x1a, 0x50, 0x58, 0x40, 0x2e, 0x13, 0x01, 0x05, 0x02, + 0x1b, 0x1a, 0x03, 0x03, 0x04, 0x05, 0x02, 0x1e, 0x00, 0x05, 0x05, 0x02, + 0x01, 0x00, 0x24, 0x06, 0x03, 0x02, 0x02, 0x02, 0x14, 0x1f, 0x07, 0x01, + 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x1f, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x49, 0x50, 0x58, + 0x40, 0x32, 0x13, 0x01, 0x05, 0x03, 0x1b, 0x1a, 0x03, 0x03, 0x04, 0x05, + 0x02, 0x1e, 0x06, 0x01, 0x03, 0x03, 0x0e, 0x1f, 0x00, 0x05, 0x05, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x14, 0x1f, 0x07, 0x01, 0x04, 0x04, + 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x1f, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x34, + 0x13, 0x01, 0x05, 0x03, 0x1b, 0x1a, 0x03, 0x03, 0x04, 0x05, 0x02, 0x1e, + 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x14, 0x1f, + 0x07, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, + 0x1f, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x24, 0x06, 0x01, 0x03, 0x03, + 0x0e, 0x00, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x2f, + 0x13, 0x01, 0x05, 0x03, 0x1b, 0x1a, 0x03, 0x03, 0x04, 0x05, 0x02, 0x1e, + 0x00, 0x02, 0x00, 0x05, 0x04, 0x02, 0x05, 0x01, 0x00, 0x26, 0x06, 0x01, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x25, 0x07, 0x01, 0x04, 0x04, + 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, 0x20, 0x05, 0x1b, + 0x40, 0x3a, 0x13, 0x01, 0x05, 0x03, 0x1b, 0x1a, 0x03, 0x03, 0x04, 0x05, + 0x02, 0x1e, 0x06, 0x01, 0x03, 0x05, 0x00, 0x03, 0x01, 0x00, 0x23, 0x00, + 0x02, 0x00, 0x05, 0x04, 0x02, 0x05, 0x01, 0x00, 0x26, 0x07, 0x01, 0x04, + 0x00, 0x01, 0x00, 0x04, 0x01, 0x01, 0x00, 0x26, 0x06, 0x01, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x21, 0x06, + 0x59, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x23, 0x11, + 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x16, 0x17, 0x37, 0x36, 0x33, 0x01, 0x32, 0x36, 0x37, 0x11, 0x2e, 0x01, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x03, 0xc5, 0xb2, 0x40, 0xa3, + 0x69, 0x57, 0x8e, 0x64, 0x36, 0x3c, 0x71, 0xa2, 0x67, 0x62, 0x89, 0x36, + 0x0c, 0x0a, 0x26, 0xfe, 0xa7, 0x57, 0x83, 0x37, 0x30, 0x76, 0x47, 0x8e, + 0x98, 0x22, 0x42, 0x60, 0x03, 0xf5, 0xfa, 0xb4, 0x01, 0xed, 0x4a, 0x5a, + 0x43, 0x82, 0xc2, 0x7e, 0x70, 0xc1, 0x8e, 0x51, 0x46, 0x40, 0x4f, 0x25, + 0xfc, 0x8d, 0x50, 0x49, 0x01, 0xea, 0x40, 0x37, 0xca, 0xbb, 0x63, 0x8d, + 0x5b, 0x2a, 0x00, 0x01, 0x00, 0x92, 0x00, 0x00, 0x02, 0xfa, 0x04, 0x07, + 0x00, 0x16, 0x00, 0xe1, 0x40, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x16, + 0x13, 0x11, 0x10, 0x0e, 0x0a, 0x08, 0x03, 0x01, 0x06, 0x07, 0x2b, 0x4b, + 0xb0, 0x1a, 0x50, 0x58, 0x40, 0x21, 0x0c, 0x01, 0x02, 0x00, 0x15, 0x06, + 0x02, 0x04, 0x02, 0x02, 0x1e, 0x03, 0x01, 0x02, 0x02, 0x00, 0x01, 0x00, + 0x24, 0x01, 0x01, 0x00, 0x00, 0x0e, 0x1f, 0x05, 0x01, 0x04, 0x04, 0x0c, + 0x04, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2c, 0x0c, + 0x01, 0x03, 0x00, 0x15, 0x06, 0x02, 0x04, 0x02, 0x02, 0x1e, 0x00, 0x02, + 0x03, 0x04, 0x03, 0x02, 0x04, 0x32, 0x00, 0x00, 0x00, 0x0e, 0x1f, 0x00, + 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x14, 0x1f, 0x05, + 0x01, 0x04, 0x04, 0x0c, 0x04, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, + 0x58, 0x40, 0x2c, 0x0c, 0x01, 0x03, 0x00, 0x15, 0x06, 0x02, 0x04, 0x02, + 0x02, 0x1e, 0x00, 0x02, 0x03, 0x04, 0x03, 0x02, 0x04, 0x32, 0x00, 0x01, + 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x0f, 0x04, 0x20, 0x05, 0x1b, + 0x40, 0x35, 0x0c, 0x01, 0x03, 0x00, 0x15, 0x06, 0x02, 0x04, 0x02, 0x02, + 0x1e, 0x00, 0x02, 0x03, 0x04, 0x03, 0x02, 0x04, 0x32, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x01, 0x00, 0x23, 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, + 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0x05, 0x01, + 0x04, 0x00, 0x04, 0x00, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x33, 0x11, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x3e, 0x01, 0x33, 0x32, + 0x16, 0x17, 0x07, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, + 0x92, 0x66, 0x1d, 0x16, 0x04, 0x0c, 0x34, 0x99, 0x67, 0x2a, 0x44, 0x1d, + 0x17, 0x07, 0x18, 0x0e, 0x3a, 0x34, 0x5d, 0x7d, 0x2a, 0x03, 0xf5, 0x16, + 0x1b, 0x9e, 0x6a, 0x77, 0x13, 0x11, 0x85, 0x19, 0x13, 0x6c, 0x67, 0xfd, + 0x7b, 0x00, 0x00, 0x01, 0x00, 0x3e, 0xff, 0xf0, 0x03, 0x0f, 0x04, 0x05, + 0x00, 0x3c, 0x00, 0xc6, 0x40, 0x0e, 0x3a, 0x38, 0x27, 0x25, 0x22, 0x20, + 0x1b, 0x19, 0x08, 0x06, 0x03, 0x01, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x33, 0x3c, 0x01, 0x01, 0x05, 0x1d, 0x01, 0x02, 0x04, + 0x02, 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, 0x32, 0x00, 0x03, + 0x04, 0x01, 0x03, 0x04, 0x30, 0x00, 0x01, 0x01, 0x05, 0x01, 0x00, 0x24, + 0x00, 0x05, 0x05, 0x14, 0x1f, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, + 0x00, 0x02, 0x02, 0x12, 0x02, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, + 0x58, 0x40, 0x31, 0x3c, 0x01, 0x01, 0x05, 0x1d, 0x01, 0x02, 0x04, 0x02, + 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, 0x32, 0x00, 0x03, 0x04, + 0x01, 0x03, 0x04, 0x30, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x01, 0x01, + 0x00, 0x26, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, + 0x15, 0x02, 0x20, 0x06, 0x1b, 0x40, 0x3a, 0x3c, 0x01, 0x01, 0x05, 0x1d, + 0x01, 0x02, 0x04, 0x02, 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, + 0x32, 0x00, 0x03, 0x04, 0x01, 0x03, 0x04, 0x30, 0x00, 0x05, 0x00, 0x01, + 0x00, 0x05, 0x01, 0x01, 0x00, 0x26, 0x00, 0x04, 0x02, 0x02, 0x04, 0x01, + 0x00, 0x23, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x04, + 0x02, 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x06, + 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x06, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x3e, 0x01, 0x33, + 0x32, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x06, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x02, 0xd6, 0x0c, 0x19, 0x0f, + 0x26, 0x37, 0x4c, 0x34, 0x2d, 0x48, 0x33, 0x1b, 0x2d, 0x4a, 0x5e, 0x63, + 0x5e, 0x4a, 0x2d, 0x32, 0x62, 0x8e, 0x5d, 0x6a, 0xac, 0x3c, 0x2a, 0x08, + 0x16, 0x12, 0x12, 0x28, 0x39, 0x51, 0x3d, 0x34, 0x4e, 0x34, 0x19, 0x2d, + 0x4a, 0x5f, 0x63, 0x5f, 0x4a, 0x2d, 0x30, 0x5c, 0x86, 0x56, 0x64, 0x9f, + 0x3a, 0x03, 0x4e, 0x16, 0x16, 0x1b, 0x17, 0x17, 0x28, 0x35, 0x1f, 0x27, + 0x34, 0x26, 0x1d, 0x21, 0x28, 0x3c, 0x57, 0x3d, 0x46, 0x77, 0x57, 0x32, + 0x45, 0x36, 0x44, 0x0d, 0x0e, 0x1c, 0x22, 0x1c, 0x1b, 0x2e, 0x3c, 0x22, + 0x2a, 0x37, 0x27, 0x1d, 0x20, 0x29, 0x3e, 0x5b, 0x41, 0x3a, 0x6b, 0x51, + 0x30, 0x3f, 0x37, 0x00, 0x00, 0x01, 0x00, 0x2c, 0xff, 0xf0, 0x02, 0xba, + 0x05, 0x3e, 0x00, 0x21, 0x01, 0x4f, 0x40, 0x14, 0x01, 0x00, 0x1d, 0x1b, + 0x18, 0x16, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0d, 0x06, 0x04, 0x00, 0x21, + 0x01, 0x21, 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x32, 0x50, 0x58, 0x40, 0x33, + 0x09, 0x01, 0x01, 0x03, 0x1f, 0x01, 0x00, 0x05, 0x02, 0x1e, 0x00, 0x02, + 0x03, 0x02, 0x34, 0x00, 0x06, 0x01, 0x05, 0x01, 0x06, 0x05, 0x32, 0x04, + 0x01, 0x01, 0x01, 0x03, 0x00, 0x00, 0x24, 0x00, 0x03, 0x03, 0x0e, 0x1f, + 0x00, 0x05, 0x05, 0x00, 0x01, 0x02, 0x24, 0x07, 0x01, 0x00, 0x00, 0x12, + 0x00, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x31, 0x09, + 0x01, 0x01, 0x03, 0x1f, 0x01, 0x00, 0x05, 0x02, 0x1e, 0x00, 0x02, 0x03, + 0x02, 0x34, 0x00, 0x06, 0x01, 0x05, 0x01, 0x06, 0x05, 0x32, 0x00, 0x03, + 0x04, 0x01, 0x01, 0x06, 0x03, 0x01, 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, + 0x00, 0x01, 0x02, 0x24, 0x07, 0x01, 0x00, 0x00, 0x12, 0x00, 0x20, 0x06, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x31, 0x09, 0x01, 0x01, 0x03, + 0x1f, 0x01, 0x00, 0x05, 0x02, 0x1e, 0x00, 0x02, 0x03, 0x02, 0x34, 0x00, + 0x06, 0x01, 0x05, 0x01, 0x06, 0x05, 0x32, 0x00, 0x03, 0x04, 0x01, 0x01, + 0x06, 0x03, 0x01, 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, 0x00, 0x01, 0x02, + 0x24, 0x07, 0x01, 0x00, 0x00, 0x15, 0x00, 0x20, 0x06, 0x1b, 0x4b, 0xb0, + 0xe8, 0x50, 0x58, 0x40, 0x3a, 0x09, 0x01, 0x01, 0x03, 0x1f, 0x01, 0x00, + 0x05, 0x02, 0x1e, 0x00, 0x02, 0x03, 0x02, 0x34, 0x00, 0x06, 0x01, 0x05, + 0x01, 0x06, 0x05, 0x32, 0x00, 0x03, 0x04, 0x01, 0x01, 0x06, 0x03, 0x01, + 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x00, 0x05, 0x01, 0x00, 0x23, 0x00, + 0x05, 0x05, 0x00, 0x01, 0x02, 0x24, 0x07, 0x01, 0x00, 0x05, 0x00, 0x01, + 0x02, 0x21, 0x07, 0x1b, 0x40, 0x40, 0x09, 0x01, 0x04, 0x03, 0x1f, 0x01, + 0x00, 0x05, 0x02, 0x1e, 0x00, 0x02, 0x03, 0x02, 0x34, 0x00, 0x01, 0x04, + 0x06, 0x04, 0x01, 0x06, 0x32, 0x00, 0x06, 0x05, 0x04, 0x06, 0x05, 0x30, + 0x00, 0x03, 0x00, 0x04, 0x01, 0x03, 0x04, 0x00, 0x00, 0x26, 0x00, 0x05, + 0x00, 0x00, 0x05, 0x01, 0x00, 0x23, 0x00, 0x05, 0x05, 0x00, 0x01, 0x02, + 0x24, 0x07, 0x01, 0x00, 0x05, 0x00, 0x01, 0x02, 0x21, 0x08, 0x59, 0x59, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x05, 0x22, 0x26, 0x35, 0x11, 0x23, 0x22, + 0x26, 0x3d, 0x01, 0x37, 0x13, 0x3e, 0x01, 0x3b, 0x01, 0x11, 0x21, 0x15, + 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x33, 0x32, 0x1f, 0x01, + 0x0e, 0x01, 0x01, 0xc5, 0x78, 0x81, 0x7a, 0x10, 0x16, 0xa6, 0x29, 0x02, + 0x16, 0x11, 0x5a, 0x01, 0x22, 0xfe, 0xde, 0x3e, 0x31, 0x1c, 0x29, 0x1e, + 0x15, 0x08, 0x0e, 0x0b, 0x34, 0x2e, 0x82, 0x10, 0x86, 0x7e, 0x02, 0x6c, + 0x13, 0x14, 0x47, 0x15, 0x01, 0x39, 0x0f, 0x13, 0xfe, 0xa3, 0x81, 0xfd, + 0xa0, 0x40, 0x3e, 0x0f, 0x12, 0x0f, 0x11, 0x55, 0x2b, 0x31, 0x00, 0x01, + 0x00, 0x7a, 0xff, 0xf0, 0x03, 0xc5, 0x03, 0xf5, 0x00, 0x17, 0x00, 0xf8, + 0x40, 0x10, 0x00, 0x00, 0x00, 0x17, 0x00, 0x17, 0x12, 0x10, 0x0c, 0x0a, + 0x09, 0x08, 0x05, 0x03, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x1e, 0x50, 0x58, + 0x40, 0x1d, 0x0e, 0x07, 0x02, 0x00, 0x01, 0x01, 0x1e, 0x05, 0x04, 0x02, + 0x01, 0x01, 0x0e, 0x1f, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x03, + 0x01, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, + 0x58, 0x40, 0x21, 0x0e, 0x07, 0x02, 0x00, 0x01, 0x01, 0x1e, 0x05, 0x04, + 0x02, 0x01, 0x01, 0x0e, 0x1f, 0x00, 0x02, 0x02, 0x0c, 0x1f, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x12, 0x03, 0x20, 0x05, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x23, 0x0e, 0x07, 0x02, 0x00, + 0x01, 0x01, 0x1e, 0x05, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, + 0x00, 0x02, 0x02, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x24, + 0x00, 0x03, 0x03, 0x15, 0x03, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, + 0x58, 0x40, 0x2a, 0x0e, 0x07, 0x02, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x00, + 0x02, 0x03, 0x00, 0x01, 0x00, 0x23, 0x05, 0x04, 0x02, 0x01, 0x00, 0x02, + 0x03, 0x01, 0x02, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, + 0x24, 0x00, 0x03, 0x00, 0x03, 0x01, 0x00, 0x21, 0x05, 0x1b, 0x40, 0x31, + 0x0e, 0x07, 0x02, 0x00, 0x04, 0x01, 0x1e, 0x05, 0x01, 0x04, 0x01, 0x00, + 0x01, 0x04, 0x00, 0x32, 0x00, 0x00, 0x02, 0x03, 0x00, 0x01, 0x00, 0x23, + 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, 0x01, 0x00, 0x26, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x00, 0x03, 0x01, 0x00, 0x21, + 0x06, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, 0x22, 0x2f, 0x01, 0x0e, + 0x01, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x01, 0x2c, 0x6a, 0x6b, 0x4e, + 0x8a, 0x3a, 0xb2, 0x6a, 0x26, 0x0a, 0x0e, 0x42, 0xa4, 0x6a, 0x53, 0x7f, + 0x56, 0x2b, 0x03, 0xf5, 0xfd, 0x7a, 0x73, 0x7e, 0x4a, 0x42, 0x02, 0xeb, + 0xfc, 0x0b, 0x25, 0x6d, 0x49, 0x59, 0x37, 0x64, 0x8e, 0x56, 0x02, 0x86, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x03, 0xed, 0x03, 0xf5, 0x00, 0x12, + 0x00, 0x77, 0x40, 0x08, 0x12, 0x11, 0x10, 0x0e, 0x02, 0x00, 0x03, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x13, 0x08, 0x01, 0x02, 0x00, + 0x01, 0x1e, 0x01, 0x01, 0x00, 0x00, 0x0e, 0x1f, 0x00, 0x02, 0x02, 0x0c, + 0x02, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x13, 0x08, + 0x01, 0x02, 0x00, 0x01, 0x1e, 0x01, 0x01, 0x00, 0x02, 0x00, 0x34, 0x00, + 0x02, 0x02, 0x0f, 0x02, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, + 0x40, 0x11, 0x08, 0x01, 0x02, 0x00, 0x01, 0x1e, 0x01, 0x01, 0x00, 0x02, + 0x00, 0x34, 0x00, 0x02, 0x02, 0x2b, 0x03, 0x1b, 0x40, 0x15, 0x08, 0x01, + 0x02, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x00, 0x34, 0x00, 0x01, 0x02, + 0x01, 0x34, 0x00, 0x02, 0x02, 0x2b, 0x04, 0x59, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x13, 0x33, 0x32, 0x16, 0x17, 0x01, 0x1e, 0x01, 0x17, 0x3e, 0x01, + 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x01, 0x23, 0x12, 0x92, 0x15, 0x1c, + 0x06, 0x01, 0x01, 0x0e, 0x10, 0x07, 0x08, 0x12, 0x0e, 0x01, 0x04, 0x06, + 0x1b, 0x14, 0x8b, 0xfe, 0x63, 0xa1, 0x03, 0xf5, 0x16, 0x0f, 0xfd, 0x74, + 0x24, 0x48, 0x23, 0x23, 0x48, 0x24, 0x02, 0x8c, 0x10, 0x15, 0xfc, 0x0b, + 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x05, 0xef, 0x03, 0xf7, 0x00, 0x2e, + 0x00, 0xb5, 0x40, 0x0c, 0x2e, 0x2c, 0x22, 0x20, 0x1f, 0x1d, 0x11, 0x0e, + 0x02, 0x00, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x17, + 0x27, 0x17, 0x08, 0x03, 0x03, 0x00, 0x01, 0x1e, 0x02, 0x01, 0x02, 0x00, + 0x00, 0x0e, 0x1f, 0x04, 0x01, 0x03, 0x03, 0x0c, 0x03, 0x20, 0x03, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x17, 0x27, 0x17, 0x08, 0x03, 0x03, + 0x00, 0x01, 0x1e, 0x02, 0x01, 0x02, 0x00, 0x03, 0x00, 0x34, 0x04, 0x01, + 0x03, 0x03, 0x0f, 0x03, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xc7, 0x50, 0x58, + 0x40, 0x15, 0x27, 0x17, 0x08, 0x03, 0x03, 0x00, 0x01, 0x1e, 0x02, 0x01, + 0x02, 0x00, 0x03, 0x00, 0x34, 0x04, 0x01, 0x03, 0x03, 0x2b, 0x03, 0x1b, + 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x19, 0x27, 0x17, 0x08, 0x03, 0x03, + 0x00, 0x01, 0x1e, 0x00, 0x01, 0x00, 0x01, 0x34, 0x02, 0x01, 0x00, 0x03, + 0x00, 0x34, 0x04, 0x01, 0x03, 0x03, 0x2b, 0x04, 0x1b, 0x40, 0x21, 0x27, + 0x17, 0x08, 0x03, 0x04, 0x02, 0x01, 0x1e, 0x00, 0x01, 0x00, 0x01, 0x34, + 0x00, 0x00, 0x02, 0x00, 0x34, 0x00, 0x02, 0x04, 0x02, 0x34, 0x00, 0x04, + 0x03, 0x04, 0x34, 0x00, 0x03, 0x03, 0x2b, 0x06, 0x59, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x13, 0x33, 0x32, 0x16, 0x17, 0x13, 0x1e, 0x01, 0x17, + 0x3e, 0x01, 0x37, 0x13, 0x3e, 0x01, 0x3b, 0x01, 0x32, 0x16, 0x17, 0x13, + 0x1e, 0x01, 0x17, 0x3e, 0x01, 0x37, 0x13, 0x3e, 0x01, 0x3b, 0x01, 0x01, + 0x23, 0x22, 0x27, 0x03, 0x2e, 0x01, 0x27, 0x0e, 0x01, 0x07, 0x03, 0x06, + 0x2b, 0x01, 0x0e, 0x8c, 0x16, 0x1c, 0x05, 0xc2, 0x08, 0x0e, 0x05, 0x08, + 0x14, 0x0b, 0xd6, 0x05, 0x19, 0x13, 0x4d, 0x14, 0x1a, 0x05, 0xd1, 0x0b, + 0x11, 0x08, 0x05, 0x10, 0x09, 0xc6, 0x05, 0x1c, 0x13, 0x86, 0xfe, 0xb8, + 0x8d, 0x1a, 0x0a, 0xe0, 0x08, 0x0a, 0x05, 0x05, 0x0a, 0x08, 0xe3, 0x0b, + 0x1e, 0x86, 0x03, 0xf5, 0x16, 0x0f, 0xfd, 0x74, 0x24, 0x43, 0x22, 0x22, + 0x43, 0x24, 0x02, 0x90, 0x0f, 0x14, 0x14, 0x0f, 0xfd, 0x70, 0x23, 0x44, + 0x21, 0x21, 0x48, 0x1f, 0x02, 0x8c, 0x10, 0x15, 0xfc, 0x0b, 0x22, 0x02, + 0xaf, 0x17, 0x2f, 0x17, 0x17, 0x30, 0x17, 0xfd, 0x52, 0x22, 0x00, 0x01, + 0x00, 0x1c, 0x00, 0x00, 0x03, 0xd2, 0x03, 0xf5, 0x00, 0x1b, 0x00, 0xaa, + 0x40, 0x0a, 0x1b, 0x19, 0x11, 0x0f, 0x0d, 0x0b, 0x03, 0x01, 0x04, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x17, 0x14, 0x0e, 0x06, 0x00, + 0x04, 0x02, 0x00, 0x01, 0x1e, 0x01, 0x01, 0x00, 0x00, 0x0e, 0x1f, 0x03, + 0x01, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, + 0x58, 0x40, 0x19, 0x14, 0x0e, 0x06, 0x00, 0x04, 0x02, 0x00, 0x01, 0x1e, + 0x01, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x03, 0x01, 0x02, 0x02, + 0x0f, 0x02, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x23, + 0x14, 0x0e, 0x06, 0x00, 0x04, 0x02, 0x00, 0x01, 0x1e, 0x01, 0x01, 0x00, + 0x02, 0x02, 0x00, 0x01, 0x00, 0x23, 0x01, 0x01, 0x00, 0x00, 0x02, 0x01, + 0x00, 0x24, 0x03, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00, 0x21, 0x04, 0x1b, + 0x40, 0x2a, 0x14, 0x0e, 0x06, 0x00, 0x04, 0x03, 0x01, 0x01, 0x1e, 0x00, + 0x01, 0x03, 0x02, 0x01, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x03, 0x02, + 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, + 0x00, 0x02, 0x01, 0x02, 0x01, 0x00, 0x21, 0x05, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x09, 0x01, 0x33, 0x32, 0x16, 0x17, 0x13, 0x36, 0x37, 0x13, + 0x3e, 0x01, 0x3b, 0x01, 0x09, 0x01, 0x23, 0x22, 0x26, 0x27, 0x03, 0x06, + 0x07, 0x03, 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x7f, 0xfe, 0xab, 0xab, 0x16, + 0x14, 0x08, 0xf8, 0x09, 0x11, 0xda, 0x0a, 0x14, 0x0f, 0xa4, 0xfe, 0xab, + 0x01, 0x63, 0xab, 0x16, 0x19, 0x08, 0xff, 0x07, 0x0e, 0xec, 0x0a, 0x17, + 0x14, 0x9f, 0x02, 0x07, 0x01, 0xee, 0x0e, 0x0d, 0xfe, 0x84, 0x1c, 0x1c, + 0x01, 0x40, 0x0e, 0x11, 0xfe, 0x1c, 0xfd, 0xef, 0x17, 0x0e, 0x01, 0x8d, + 0x1d, 0x17, 0xfe, 0xa7, 0x0e, 0x17, 0x00, 0x01, 0x00, 0x0e, 0xfe, 0xa9, + 0x03, 0xf0, 0x03, 0xf5, 0x00, 0x16, 0x00, 0x7b, 0x40, 0x08, 0x16, 0x14, + 0x08, 0x06, 0x04, 0x02, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x49, 0x50, 0x58, + 0x40, 0x14, 0x0e, 0x05, 0x02, 0x00, 0x01, 0x01, 0x1e, 0x02, 0x01, 0x01, + 0x01, 0x0e, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x03, 0x1b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x14, 0x0e, 0x05, 0x02, 0x00, 0x01, 0x01, + 0x1e, 0x00, 0x00, 0x01, 0x00, 0x35, 0x02, 0x01, 0x01, 0x01, 0x0e, 0x01, + 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x12, 0x0e, 0x05, + 0x02, 0x00, 0x01, 0x01, 0x1e, 0x02, 0x01, 0x01, 0x00, 0x01, 0x34, 0x00, + 0x00, 0x00, 0x2b, 0x03, 0x1b, 0x40, 0x16, 0x0e, 0x05, 0x02, 0x00, 0x02, + 0x01, 0x1e, 0x00, 0x01, 0x02, 0x01, 0x34, 0x00, 0x02, 0x00, 0x02, 0x34, + 0x00, 0x00, 0x00, 0x2b, 0x04, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x0e, 0x01, 0x2b, 0x01, 0x13, 0x01, 0x33, 0x32, 0x16, 0x17, 0x01, 0x1e, + 0x01, 0x17, 0x3e, 0x01, 0x37, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x01, 0xbb, + 0x09, 0x1b, 0x1c, 0x84, 0xb9, 0xfe, 0x5e, 0x9a, 0x17, 0x1a, 0x06, 0x01, + 0x0f, 0x09, 0x0d, 0x05, 0x07, 0x0e, 0x09, 0x01, 0x07, 0x06, 0x1d, 0x11, + 0x8e, 0xfe, 0xd5, 0x14, 0x18, 0x01, 0x92, 0x03, 0xba, 0x17, 0x0e, 0xfd, + 0x82, 0x16, 0x2c, 0x17, 0x17, 0x2c, 0x17, 0x02, 0x7d, 0x10, 0x15, 0x00, + 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x03, 0x55, 0x03, 0xf5, 0x00, 0x0f, + 0x00, 0x77, 0x40, 0x0a, 0x0f, 0x0e, 0x0d, 0x0c, 0x07, 0x06, 0x05, 0x04, + 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1a, 0x00, 0x02, + 0x02, 0x03, 0x00, 0x00, 0x24, 0x00, 0x03, 0x03, 0x0e, 0x1f, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0c, 0x01, 0x20, 0x04, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x18, 0x00, 0x03, 0x00, 0x02, + 0x00, 0x03, 0x02, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x24, 0x00, 0x01, 0x01, 0x0f, 0x01, 0x20, 0x03, 0x1b, 0x40, 0x21, 0x00, + 0x03, 0x00, 0x02, 0x00, 0x03, 0x02, 0x00, 0x00, 0x26, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x04, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x01, 0x14, 0x06, 0x07, 0x01, 0x21, 0x15, 0x21, 0x35, 0x34, 0x36, + 0x37, 0x01, 0x21, 0x35, 0x21, 0x03, 0x55, 0x0e, 0x0b, 0xfd, 0xdc, 0x02, + 0x29, 0xfd, 0x05, 0x0d, 0x0c, 0x02, 0x27, 0xfd, 0xdf, 0x02, 0xf0, 0x03, + 0xa9, 0x13, 0x23, 0x0e, 0xfd, 0x26, 0x8b, 0x4a, 0x0d, 0x23, 0x10, 0x02, + 0xdf, 0x8c, 0x00, 0x01, 0x00, 0x2c, 0xfe, 0xdf, 0x02, 0x00, 0x05, 0xfd, + 0x00, 0x40, 0x00, 0x47, 0x40, 0x0e, 0x38, 0x36, 0x33, 0x30, 0x18, 0x15, + 0x12, 0x10, 0x05, 0x04, 0x03, 0x02, 0x06, 0x07, 0x2b, 0x40, 0x31, 0x24, + 0x01, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x02, 0x00, 0x03, 0x01, 0x02, 0x03, + 0x01, 0x00, 0x26, 0x00, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x01, 0x00, + 0x26, 0x00, 0x04, 0x05, 0x05, 0x04, 0x01, 0x00, 0x23, 0x00, 0x04, 0x04, + 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x04, 0x05, 0x01, 0x00, 0x21, 0x06, + 0xb0, 0x38, 0x2b, 0x13, 0x34, 0x26, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x3b, 0x01, 0x15, 0x14, 0x06, 0x2b, + 0x01, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x07, + 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x32, + 0x16, 0x1d, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0xb5, + 0x46, 0x43, 0x43, 0x46, 0x10, 0x13, 0x10, 0x29, 0x53, 0x7b, 0x52, 0x35, + 0x1c, 0x0c, 0x14, 0x4d, 0x59, 0x0e, 0x12, 0x0e, 0x16, 0x29, 0x37, 0x21, + 0x21, 0x37, 0x29, 0x16, 0x0e, 0x12, 0x0e, 0x59, 0x4d, 0x14, 0x0c, 0x1c, + 0x35, 0x52, 0x7b, 0x53, 0x29, 0x10, 0x13, 0x10, 0x01, 0xa9, 0x3f, 0x51, + 0x6b, 0x50, 0x40, 0x32, 0x62, 0x62, 0x64, 0x34, 0x45, 0x74, 0x54, 0x2e, + 0x4f, 0x14, 0x12, 0x65, 0x56, 0x38, 0x68, 0x63, 0x62, 0x32, 0x26, 0x41, + 0x33, 0x25, 0x09, 0x09, 0x25, 0x34, 0x40, 0x25, 0x32, 0x62, 0x63, 0x68, + 0x38, 0x57, 0x64, 0x12, 0x14, 0x50, 0x2f, 0x54, 0x74, 0x45, 0x34, 0x63, + 0x63, 0x62, 0x00, 0x01, 0x00, 0xe6, 0xfe, 0xa9, 0x01, 0x70, 0x05, 0xfd, + 0x00, 0x03, 0x00, 0x3c, 0x40, 0x06, 0x03, 0x02, 0x01, 0x00, 0x02, 0x07, + 0x2b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, 0x0e, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x24, 0x00, 0x01, 0x01, 0x10, 0x01, 0x20, 0x02, 0x1b, 0x40, + 0x17, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x03, + 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x33, 0x11, 0x23, 0xe6, 0x8a, 0x8a, 0x05, + 0xfd, 0xf8, 0xac, 0x00, 0x00, 0x01, 0x00, 0x58, 0xfe, 0xdf, 0x02, 0x2c, + 0x05, 0xfd, 0x00, 0x40, 0x00, 0x47, 0x40, 0x0e, 0x3f, 0x3e, 0x3d, 0x3c, + 0x31, 0x2f, 0x2c, 0x29, 0x11, 0x0e, 0x0b, 0x09, 0x06, 0x07, 0x2b, 0x40, + 0x31, 0x1d, 0x01, 0x05, 0x04, 0x01, 0x1e, 0x00, 0x03, 0x00, 0x02, 0x04, + 0x03, 0x02, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x05, 0x01, 0x04, 0x05, + 0x01, 0x00, 0x26, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x23, 0x00, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x21, 0x06, 0xb0, 0x38, 0x2b, 0x01, 0x14, 0x1e, 0x02, 0x15, 0x14, 0x0e, + 0x02, 0x2b, 0x01, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x2e, 0x03, 0x35, 0x34, 0x3e, + 0x02, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x22, 0x26, 0x3d, 0x01, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x15, 0x22, + 0x06, 0x01, 0xa3, 0x10, 0x13, 0x10, 0x2a, 0x52, 0x7b, 0x52, 0x35, 0x1c, + 0x0c, 0x14, 0x4d, 0x59, 0x0e, 0x12, 0x0e, 0x16, 0x29, 0x37, 0x21, 0x21, + 0x37, 0x29, 0x16, 0x0e, 0x12, 0x0e, 0x59, 0x4d, 0x14, 0x0c, 0x1c, 0x35, + 0x52, 0x7b, 0x52, 0x2a, 0x10, 0x13, 0x10, 0x46, 0x43, 0x43, 0x46, 0x01, + 0xa9, 0x32, 0x62, 0x63, 0x63, 0x34, 0x45, 0x74, 0x54, 0x2f, 0x50, 0x14, + 0x12, 0x64, 0x57, 0x38, 0x68, 0x63, 0x62, 0x32, 0x25, 0x40, 0x34, 0x25, + 0x09, 0x09, 0x25, 0x33, 0x41, 0x26, 0x32, 0x62, 0x63, 0x68, 0x38, 0x56, + 0x65, 0x12, 0x14, 0x4f, 0x2e, 0x54, 0x74, 0x45, 0x34, 0x64, 0x62, 0x62, + 0x32, 0x40, 0x50, 0x6b, 0x51, 0x00, 0x00, 0x01, 0x00, 0x74, 0x01, 0x9e, + 0x04, 0x12, 0x03, 0x00, 0x00, 0x1b, 0x00, 0x47, 0x40, 0x12, 0x01, 0x00, + 0x18, 0x16, 0x12, 0x11, 0x0f, 0x0d, 0x0a, 0x08, 0x04, 0x03, 0x00, 0x1b, + 0x01, 0x1b, 0x07, 0x07, 0x2b, 0x40, 0x2d, 0x00, 0x01, 0x05, 0x01, 0x34, + 0x00, 0x04, 0x02, 0x04, 0x35, 0x06, 0x01, 0x00, 0x03, 0x02, 0x00, 0x01, + 0x00, 0x23, 0x00, 0x05, 0x00, 0x03, 0x02, 0x05, 0x03, 0x01, 0x00, 0x26, + 0x06, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x00, 0x02, + 0x01, 0x00, 0x21, 0x06, 0xb0, 0x38, 0x2b, 0x01, 0x32, 0x36, 0x37, 0x33, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x23, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x02, 0xf7, 0x41, 0x49, 0x01, + 0x90, 0x25, 0x45, 0x66, 0x40, 0x34, 0x66, 0x5f, 0x56, 0x24, 0x41, 0x49, + 0x01, 0x90, 0x25, 0x45, 0x65, 0x41, 0x34, 0x66, 0x5f, 0x56, 0x02, 0x65, + 0x55, 0x46, 0x43, 0x70, 0x50, 0x2c, 0x20, 0x27, 0x21, 0x54, 0x47, 0x43, + 0x70, 0x50, 0x2d, 0x21, 0x27, 0x21, 0x00, 0x02, 0x00, 0xda, 0xfe, 0xa9, + 0x01, 0xd4, 0x04, 0x05, 0x00, 0x0d, 0x00, 0x21, 0x00, 0x7d, 0x40, 0x0e, + 0x00, 0x00, 0x1e, 0x1c, 0x14, 0x12, 0x00, 0x0d, 0x00, 0x0d, 0x07, 0x06, + 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, 0x1b, 0x00, 0x03, + 0x03, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x14, 0x1f, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x24, 0x04, 0x01, 0x01, 0x01, 0x10, 0x01, 0x20, + 0x04, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x18, 0x00, 0x00, 0x04, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x25, 0x00, 0x03, 0x03, 0x02, 0x01, + 0x00, 0x24, 0x00, 0x02, 0x02, 0x14, 0x03, 0x20, 0x03, 0x1b, 0x40, 0x22, + 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x03, 0x01, 0x00, 0x26, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x24, 0x04, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x04, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x34, 0x3e, 0x02, 0x37, 0x33, 0x1e, 0x03, + 0x15, 0x11, 0x03, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x01, 0x06, 0x03, 0x06, 0x09, 0x06, + 0x79, 0x06, 0x09, 0x06, 0x03, 0xd5, 0x13, 0x22, 0x2d, 0x1b, 0x1a, 0x2d, + 0x22, 0x14, 0x14, 0x22, 0x2d, 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0xfe, 0xa9, + 0x02, 0x1d, 0x2d, 0x55, 0x57, 0x5c, 0x34, 0x34, 0x5c, 0x57, 0x55, 0x2d, + 0xfd, 0xe3, 0x04, 0xdf, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, 0x2d, 0x1b, + 0x1a, 0x2e, 0x22, 0x14, 0x14, 0x22, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x8a, + 0xff, 0x15, 0x04, 0x02, 0x04, 0xe6, 0x00, 0x2e, 0x00, 0x37, 0x01, 0x99, + 0x40, 0x10, 0x2e, 0x2c, 0x29, 0x28, 0x23, 0x21, 0x1e, 0x1d, 0x18, 0x16, + 0x0f, 0x0d, 0x0a, 0x09, 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, + 0x40, 0x45, 0x0b, 0x01, 0x00, 0x01, 0x33, 0x1c, 0x13, 0x10, 0x04, 0x02, + 0x00, 0x32, 0x26, 0x02, 0x03, 0x04, 0x2a, 0x00, 0x02, 0x06, 0x05, 0x04, + 0x1e, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, + 0x04, 0x32, 0x00, 0x04, 0x03, 0x00, 0x04, 0x03, 0x30, 0x00, 0x03, 0x03, + 0x05, 0x01, 0x02, 0x24, 0x00, 0x05, 0x05, 0x15, 0x1f, 0x00, 0x06, 0x06, + 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x14, 0x06, 0x20, 0x08, 0x1b, + 0x4b, 0xb0, 0x0b, 0x50, 0x58, 0x40, 0x45, 0x0b, 0x01, 0x00, 0x01, 0x33, + 0x1c, 0x13, 0x10, 0x04, 0x02, 0x00, 0x32, 0x26, 0x02, 0x03, 0x04, 0x2a, + 0x00, 0x02, 0x06, 0x05, 0x04, 0x1e, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, + 0x02, 0x00, 0x04, 0x00, 0x02, 0x04, 0x32, 0x00, 0x04, 0x03, 0x00, 0x04, + 0x03, 0x30, 0x00, 0x03, 0x03, 0x05, 0x01, 0x02, 0x24, 0x00, 0x05, 0x05, + 0x12, 0x1f, 0x00, 0x06, 0x06, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x14, 0x06, 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x45, + 0x0b, 0x01, 0x00, 0x01, 0x33, 0x1c, 0x13, 0x10, 0x04, 0x02, 0x00, 0x32, + 0x26, 0x02, 0x03, 0x04, 0x2a, 0x00, 0x02, 0x06, 0x05, 0x04, 0x1e, 0x00, + 0x01, 0x00, 0x01, 0x34, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x04, 0x32, + 0x00, 0x04, 0x03, 0x00, 0x04, 0x03, 0x30, 0x00, 0x03, 0x03, 0x05, 0x01, + 0x02, 0x24, 0x00, 0x05, 0x05, 0x15, 0x1f, 0x00, 0x06, 0x06, 0x00, 0x01, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x14, 0x06, 0x20, 0x08, 0x1b, 0x4b, 0xb0, + 0x6c, 0x50, 0x58, 0x40, 0x42, 0x0b, 0x01, 0x00, 0x01, 0x33, 0x1c, 0x13, + 0x10, 0x04, 0x02, 0x00, 0x32, 0x26, 0x02, 0x03, 0x04, 0x2a, 0x00, 0x02, + 0x06, 0x05, 0x04, 0x1e, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x02, 0x00, + 0x04, 0x00, 0x02, 0x04, 0x32, 0x00, 0x04, 0x03, 0x00, 0x04, 0x03, 0x30, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x01, 0x00, 0x25, 0x00, 0x03, 0x03, + 0x05, 0x01, 0x02, 0x24, 0x00, 0x05, 0x05, 0x15, 0x05, 0x20, 0x07, 0x1b, + 0x40, 0x4c, 0x0b, 0x01, 0x00, 0x01, 0x33, 0x1c, 0x13, 0x10, 0x04, 0x02, + 0x00, 0x32, 0x26, 0x02, 0x03, 0x04, 0x2a, 0x00, 0x02, 0x06, 0x05, 0x04, + 0x1e, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, + 0x04, 0x32, 0x00, 0x04, 0x03, 0x00, 0x04, 0x03, 0x30, 0x00, 0x00, 0x02, + 0x06, 0x00, 0x01, 0x00, 0x23, 0x00, 0x03, 0x00, 0x05, 0x06, 0x03, 0x05, + 0x01, 0x02, 0x26, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x24, 0x00, 0x06, + 0x00, 0x06, 0x01, 0x00, 0x21, 0x08, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x05, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x3f, 0x01, 0x3e, 0x01, + 0x3b, 0x01, 0x07, 0x1e, 0x01, 0x17, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x2e, + 0x02, 0x27, 0x03, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x0e, 0x01, + 0x0f, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x03, 0x14, 0x16, 0x17, 0x13, 0x0e, + 0x03, 0x02, 0x31, 0x5c, 0x9b, 0x71, 0x3f, 0x42, 0x7e, 0xb8, 0x77, 0x0c, + 0x02, 0x1b, 0x15, 0x42, 0x10, 0x52, 0x84, 0x36, 0x2e, 0x08, 0x0f, 0x0e, + 0x0c, 0x21, 0x2d, 0x3f, 0x2a, 0x34, 0x3f, 0x55, 0x3b, 0x26, 0x10, 0x0b, + 0x12, 0x05, 0x30, 0x3c, 0xb9, 0x6b, 0x0c, 0x02, 0x1b, 0x15, 0x42, 0xe7, + 0x87, 0x79, 0x34, 0x4c, 0x73, 0x4e, 0x27, 0x0b, 0x0a, 0x4f, 0x84, 0xb6, + 0x72, 0x6f, 0xbb, 0x8a, 0x51, 0x03, 0xb3, 0x14, 0x1d, 0xe9, 0x0c, 0x3f, + 0x31, 0x3e, 0x0b, 0x0b, 0x11, 0x18, 0x18, 0x07, 0xfd, 0x06, 0x04, 0x1f, + 0x22, 0x1c, 0x09, 0x07, 0x3f, 0x48, 0x4a, 0x07, 0xaf, 0x13, 0x1d, 0x02, + 0xe5, 0xa2, 0xc0, 0x17, 0x02, 0xf8, 0x06, 0x39, 0x63, 0x88, 0x00, 0x01, + 0x00, 0x34, 0x00, 0x00, 0x04, 0x5b, 0x05, 0xa8, 0x00, 0x3e, 0x01, 0x2f, + 0x40, 0x14, 0x3e, 0x3d, 0x36, 0x34, 0x2f, 0x2d, 0x27, 0x25, 0x22, 0x21, + 0x1c, 0x1a, 0x14, 0x12, 0x0b, 0x09, 0x04, 0x02, 0x09, 0x07, 0x2b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x39, 0x0f, 0x01, 0x02, 0x03, 0x37, 0x2b, + 0x02, 0x07, 0x06, 0x02, 0x1e, 0x00, 0x02, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x32, 0x04, 0x01, 0x00, 0x08, 0x01, 0x05, 0x06, 0x00, 0x05, 0x01, 0x00, + 0x26, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x11, + 0x1f, 0x00, 0x06, 0x06, 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x07, 0x0c, + 0x07, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x37, 0x0f, + 0x01, 0x02, 0x03, 0x37, 0x2b, 0x02, 0x07, 0x06, 0x02, 0x1e, 0x00, 0x02, + 0x03, 0x00, 0x03, 0x02, 0x00, 0x32, 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, + 0x03, 0x01, 0x00, 0x26, 0x04, 0x01, 0x00, 0x08, 0x01, 0x05, 0x06, 0x00, + 0x05, 0x01, 0x00, 0x26, 0x00, 0x06, 0x06, 0x07, 0x01, 0x00, 0x24, 0x00, + 0x07, 0x07, 0x0f, 0x07, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, + 0x40, 0x40, 0x0f, 0x01, 0x02, 0x03, 0x37, 0x2b, 0x02, 0x07, 0x06, 0x02, + 0x1e, 0x00, 0x02, 0x03, 0x00, 0x03, 0x02, 0x00, 0x32, 0x00, 0x01, 0x00, + 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x04, 0x01, 0x00, 0x08, 0x01, + 0x05, 0x06, 0x00, 0x05, 0x01, 0x00, 0x26, 0x00, 0x06, 0x07, 0x07, 0x06, + 0x01, 0x00, 0x23, 0x00, 0x06, 0x06, 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, + 0x06, 0x07, 0x01, 0x00, 0x21, 0x07, 0x1b, 0x40, 0x48, 0x0f, 0x01, 0x02, + 0x03, 0x37, 0x2b, 0x02, 0x07, 0x06, 0x02, 0x1e, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x02, 0x00, 0x32, 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, + 0x00, 0x26, 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x08, 0x00, 0x00, 0x26, + 0x00, 0x04, 0x00, 0x05, 0x06, 0x04, 0x05, 0x01, 0x00, 0x26, 0x00, 0x06, + 0x07, 0x07, 0x06, 0x01, 0x00, 0x23, 0x00, 0x06, 0x06, 0x07, 0x01, 0x00, + 0x24, 0x00, 0x07, 0x06, 0x07, 0x01, 0x00, 0x21, 0x08, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x13, 0x34, 0x36, 0x3b, 0x01, 0x11, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, + 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x11, 0x21, 0x15, 0x14, 0x06, + 0x23, 0x21, 0x15, 0x14, 0x06, 0x07, 0x3e, 0x01, 0x33, 0x21, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x21, 0x35, 0x3e, 0x03, 0x35, 0x11, 0x23, 0x34, 0x20, + 0x1d, 0x86, 0x36, 0x6e, 0xa4, 0x6e, 0x4e, 0x79, 0x5e, 0x45, 0x18, 0x48, + 0x0a, 0x15, 0x0a, 0x0e, 0x19, 0x0b, 0x14, 0x29, 0x33, 0x42, 0x2d, 0x3f, + 0x60, 0x40, 0x20, 0x01, 0xb9, 0x1e, 0x16, 0xfe, 0x7b, 0x39, 0x32, 0x1d, + 0x39, 0x1e, 0x02, 0xa4, 0x0b, 0x14, 0x1c, 0x12, 0xfc, 0x3c, 0x22, 0x3e, + 0x30, 0x1d, 0xc3, 0x02, 0xa0, 0x1a, 0x24, 0x01, 0x05, 0x5e, 0xa5, 0x7b, + 0x47, 0x27, 0x44, 0x5a, 0x34, 0x2e, 0x06, 0x05, 0x0b, 0x0e, 0x19, 0x2f, + 0x23, 0x15, 0x2a, 0x4e, 0x6e, 0x44, 0xfe, 0xf9, 0x48, 0x12, 0x1e, 0xf3, + 0x4b, 0x6d, 0x2d, 0x05, 0x07, 0x4c, 0x0e, 0x1b, 0x17, 0x0e, 0x73, 0x0a, + 0x22, 0x33, 0x45, 0x2e, 0x01, 0x21, 0x00, 0x02, 0x00, 0x84, 0x00, 0xe0, + 0x04, 0x04, 0x04, 0x60, 0x00, 0x23, 0x00, 0x37, 0x00, 0x95, 0x40, 0x0a, + 0x34, 0x32, 0x2a, 0x28, 0x1c, 0x1a, 0x0a, 0x08, 0x04, 0x07, 0x2b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x38, 0x0e, 0x0c, 0x06, 0x04, 0x04, 0x03, + 0x00, 0x21, 0x15, 0x0f, 0x03, 0x04, 0x02, 0x03, 0x1e, 0x18, 0x16, 0x03, + 0x01, 0x02, 0x03, 0x1e, 0x0d, 0x05, 0x02, 0x00, 0x1c, 0x20, 0x1f, 0x17, + 0x03, 0x01, 0x1b, 0x00, 0x02, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x25, + 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x14, 0x03, + 0x20, 0x06, 0x1b, 0x40, 0x42, 0x0e, 0x0c, 0x06, 0x04, 0x04, 0x03, 0x00, + 0x21, 0x15, 0x0f, 0x03, 0x04, 0x02, 0x03, 0x1e, 0x18, 0x16, 0x03, 0x01, + 0x02, 0x03, 0x1e, 0x0d, 0x05, 0x02, 0x00, 0x1c, 0x20, 0x1f, 0x17, 0x03, + 0x01, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, 0x26, + 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x21, 0x07, 0x59, + 0xb0, 0x38, 0x2b, 0x13, 0x34, 0x36, 0x37, 0x27, 0x37, 0x17, 0x3e, 0x01, + 0x33, 0x32, 0x16, 0x17, 0x37, 0x17, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, + 0x07, 0x17, 0x07, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, + 0x37, 0x2e, 0x01, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0xdf, 0x21, 0x1d, 0x99, 0x5b, + 0x97, 0x2c, 0x68, 0x3a, 0x39, 0x66, 0x2b, 0x99, 0x59, 0x97, 0x1f, 0x22, + 0x21, 0x1d, 0x98, 0x5b, 0x98, 0x2c, 0x68, 0x39, 0x39, 0x65, 0x2c, 0x99, + 0x59, 0x97, 0x1e, 0x22, 0x84, 0x23, 0x3e, 0x51, 0x2f, 0x2f, 0x53, 0x3d, + 0x24, 0x24, 0x3d, 0x53, 0x2f, 0x2f, 0x51, 0x3e, 0x23, 0x02, 0xa0, 0x39, + 0x65, 0x2c, 0x99, 0x5a, 0x98, 0x1f, 0x22, 0x21, 0x1e, 0x99, 0x5b, 0x98, + 0x2c, 0x67, 0x3a, 0x39, 0x66, 0x2b, 0x97, 0x5c, 0x98, 0x1e, 0x22, 0x21, + 0x1d, 0x99, 0x5b, 0x98, 0x2c, 0x67, 0x3a, 0x2e, 0x51, 0x3d, 0x24, 0x24, + 0x3d, 0x51, 0x2e, 0x2f, 0x52, 0x3e, 0x23, 0x23, 0x3e, 0x52, 0x00, 0x01, + 0x00, 0x2c, 0x00, 0x00, 0x04, 0x53, 0x05, 0x99, 0x00, 0x22, 0x01, 0x12, + 0x40, 0x18, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, + 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x10, 0x04, 0x02, 0x01, 0x00, + 0x0b, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2b, 0x0a, 0x01, + 0x00, 0x01, 0x01, 0x1e, 0x03, 0x01, 0x00, 0x0a, 0x01, 0x04, 0x05, 0x00, + 0x04, 0x00, 0x02, 0x26, 0x09, 0x01, 0x05, 0x08, 0x01, 0x06, 0x07, 0x05, + 0x06, 0x00, 0x00, 0x26, 0x02, 0x01, 0x01, 0x01, 0x0b, 0x1f, 0x00, 0x07, + 0x07, 0x0c, 0x07, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, + 0x2b, 0x0a, 0x01, 0x00, 0x01, 0x01, 0x1e, 0x02, 0x01, 0x01, 0x00, 0x01, + 0x34, 0x03, 0x01, 0x00, 0x0a, 0x01, 0x04, 0x05, 0x00, 0x04, 0x00, 0x02, + 0x26, 0x09, 0x01, 0x05, 0x08, 0x01, 0x06, 0x07, 0x05, 0x06, 0x00, 0x00, + 0x26, 0x00, 0x07, 0x07, 0x0f, 0x07, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x37, 0x0a, 0x01, 0x00, 0x01, 0x01, 0x1e, 0x02, 0x01, + 0x01, 0x00, 0x01, 0x34, 0x00, 0x07, 0x06, 0x07, 0x35, 0x03, 0x01, 0x00, + 0x0a, 0x01, 0x04, 0x05, 0x00, 0x04, 0x00, 0x02, 0x26, 0x09, 0x01, 0x05, + 0x06, 0x06, 0x05, 0x00, 0x00, 0x23, 0x09, 0x01, 0x05, 0x05, 0x06, 0x00, + 0x00, 0x24, 0x08, 0x01, 0x06, 0x05, 0x06, 0x00, 0x00, 0x21, 0x07, 0x1b, + 0x40, 0x4a, 0x0a, 0x01, 0x00, 0x02, 0x01, 0x1e, 0x00, 0x01, 0x02, 0x01, + 0x34, 0x00, 0x02, 0x00, 0x02, 0x34, 0x00, 0x07, 0x06, 0x07, 0x35, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x0a, 0x00, 0x02, 0x26, 0x00, 0x03, 0x00, + 0x04, 0x05, 0x03, 0x04, 0x00, 0x02, 0x26, 0x00, 0x05, 0x09, 0x06, 0x05, + 0x00, 0x00, 0x23, 0x00, 0x09, 0x00, 0x08, 0x06, 0x09, 0x08, 0x00, 0x00, + 0x26, 0x00, 0x05, 0x05, 0x06, 0x00, 0x00, 0x24, 0x00, 0x06, 0x05, 0x06, + 0x00, 0x00, 0x21, 0x0a, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x21, + 0x01, 0x33, 0x32, 0x16, 0x17, 0x01, 0x1e, 0x01, 0x17, 0x3e, 0x01, 0x37, + 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, + 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x92, 0x01, 0x32, + 0xfe, 0x68, 0x95, 0x1a, 0x1f, 0x0a, 0x01, 0x14, 0x0e, 0x14, 0x07, 0x07, + 0x12, 0x0e, 0x01, 0x13, 0x08, 0x21, 0x19, 0x96, 0xfe, 0x67, 0x01, 0x33, + 0xfe, 0xac, 0x01, 0x54, 0xfe, 0xac, 0xb3, 0xfe, 0xac, 0x01, 0x54, 0xfe, + 0xac, 0x02, 0x71, 0x03, 0x28, 0x19, 0x14, 0xfd, 0xca, 0x23, 0x3a, 0x1d, + 0x1d, 0x3b, 0x22, 0x02, 0x36, 0x11, 0x1c, 0xfc, 0xd8, 0x66, 0x69, 0x67, + 0xfe, 0xc5, 0x01, 0x3b, 0x67, 0x69, 0x00, 0x02, 0x00, 0xe6, 0xfe, 0xa9, + 0x01, 0x70, 0x05, 0xfd, 0x00, 0x03, 0x00, 0x07, 0x00, 0x54, 0x40, 0x0a, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x04, 0x07, 0x2b, 0x4b, + 0xb0, 0x49, 0x50, 0x58, 0x40, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x26, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, 0x24, 0x00, + 0x03, 0x03, 0x10, 0x03, 0x20, 0x03, 0x1b, 0x40, 0x21, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x26, 0x00, 0x02, 0x03, 0x03, 0x02, + 0x00, 0x00, 0x23, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, 0x24, 0x00, 0x03, + 0x02, 0x03, 0x00, 0x00, 0x21, 0x04, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x33, + 0x11, 0x23, 0x11, 0x33, 0x11, 0x23, 0xe6, 0x8a, 0x8a, 0x8a, 0x8a, 0x05, + 0xfd, 0xfc, 0xe6, 0xfe, 0xe1, 0xfc, 0xe5, 0x00, 0x00, 0x02, 0x00, 0x72, + 0xff, 0x83, 0x03, 0x87, 0x05, 0xa7, 0x00, 0x48, 0x00, 0x5a, 0x00, 0x97, + 0x40, 0x0e, 0x46, 0x44, 0x2d, 0x2b, 0x28, 0x26, 0x21, 0x1f, 0x08, 0x06, + 0x03, 0x01, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x37, + 0x48, 0x01, 0x01, 0x05, 0x58, 0x4e, 0x3d, 0x18, 0x04, 0x03, 0x00, 0x23, + 0x01, 0x02, 0x04, 0x03, 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, + 0x32, 0x00, 0x03, 0x04, 0x01, 0x03, 0x04, 0x30, 0x00, 0x04, 0x00, 0x02, + 0x04, 0x02, 0x01, 0x00, 0x25, 0x00, 0x01, 0x01, 0x05, 0x01, 0x00, 0x24, + 0x00, 0x05, 0x05, 0x11, 0x01, 0x20, 0x06, 0x1b, 0x40, 0x41, 0x48, 0x01, + 0x01, 0x05, 0x58, 0x4e, 0x3d, 0x18, 0x04, 0x03, 0x00, 0x23, 0x01, 0x02, + 0x04, 0x03, 0x1e, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, 0x32, 0x00, + 0x03, 0x04, 0x01, 0x03, 0x04, 0x30, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, + 0x01, 0x01, 0x00, 0x26, 0x00, 0x04, 0x02, 0x02, 0x04, 0x01, 0x00, 0x23, + 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x04, 0x02, 0x01, + 0x00, 0x21, 0x07, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x06, 0x23, 0x22, 0x2e, + 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x06, 0x15, 0x14, 0x06, + 0x07, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x2e, 0x06, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x16, 0x17, 0x01, 0x14, 0x1e, 0x02, 0x17, 0x3e, 0x01, 0x35, + 0x34, 0x2e, 0x04, 0x27, 0x0e, 0x01, 0x03, 0x31, 0x0c, 0x19, 0x0f, 0x26, + 0x37, 0x4c, 0x34, 0x30, 0x4d, 0x35, 0x1c, 0x31, 0x4f, 0x66, 0x69, 0x66, + 0x4f, 0x31, 0x4e, 0x54, 0x31, 0x3e, 0x32, 0x61, 0x8f, 0x5c, 0x6a, 0xac, + 0x3c, 0x29, 0x08, 0x17, 0x11, 0x12, 0x28, 0x3a, 0x55, 0x3f, 0x32, 0x4f, + 0x36, 0x1c, 0x32, 0x52, 0x68, 0x6e, 0x68, 0x52, 0x32, 0x56, 0x5d, 0x32, + 0x3f, 0x30, 0x5c, 0x86, 0x56, 0x64, 0x9f, 0x3a, 0xfd, 0xb7, 0x46, 0x6d, + 0x84, 0x3e, 0x36, 0x30, 0x1e, 0x34, 0x46, 0x4f, 0x54, 0x28, 0x42, 0x36, + 0x04, 0xf1, 0x16, 0x16, 0x1b, 0x17, 0x19, 0x2a, 0x38, 0x1f, 0x26, 0x39, + 0x2f, 0x2b, 0x2e, 0x37, 0x47, 0x5c, 0x3d, 0x51, 0x7f, 0x26, 0x25, 0x62, + 0x45, 0x46, 0x77, 0x57, 0x32, 0x45, 0x36, 0x44, 0x0d, 0x0e, 0x1c, 0x23, + 0x1c, 0x19, 0x2d, 0x3e, 0x26, 0x2d, 0x42, 0x33, 0x2a, 0x2c, 0x33, 0x46, + 0x5d, 0x40, 0x4e, 0x7d, 0x23, 0x26, 0x69, 0x4b, 0x3a, 0x6b, 0x50, 0x30, + 0x3e, 0x37, 0xfd, 0xa4, 0x33, 0x47, 0x39, 0x35, 0x1f, 0x1a, 0x4b, 0x2f, + 0x24, 0x38, 0x2e, 0x26, 0x23, 0x23, 0x14, 0x1e, 0x49, 0x00, 0x00, 0x02, + 0x00, 0x0e, 0x04, 0x9a, 0x02, 0x56, 0x05, 0x7b, 0x00, 0x13, 0x00, 0x27, + 0x00, 0x6f, 0x40, 0x0a, 0x24, 0x22, 0x1a, 0x18, 0x10, 0x0e, 0x06, 0x04, + 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x20, 0x50, 0x58, 0x40, 0x10, 0x02, 0x01, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x03, 0x01, 0x01, 0x01, 0x0b, 0x00, + 0x20, 0x02, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x1a, 0x03, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x23, 0x03, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x24, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x21, 0x03, + 0x1b, 0x40, 0x21, 0x00, 0x01, 0x03, 0x00, 0x01, 0x01, 0x00, 0x23, 0x00, + 0x03, 0x00, 0x02, 0x00, 0x03, 0x02, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x21, 0x04, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x05, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, + 0x02, 0xef, 0x12, 0x20, 0x29, 0x17, 0x16, 0x28, 0x1f, 0x12, 0x12, 0x1f, + 0x28, 0x16, 0x17, 0x29, 0x20, 0x12, 0x01, 0x67, 0x12, 0x1f, 0x29, 0x17, + 0x17, 0x29, 0x1e, 0x12, 0x12, 0x1e, 0x29, 0x17, 0x17, 0x29, 0x1f, 0x12, + 0x05, 0x09, 0x17, 0x28, 0x1e, 0x12, 0x12, 0x1e, 0x28, 0x17, 0x17, 0x2a, + 0x1f, 0x12, 0x12, 0x1f, 0x2a, 0x17, 0x17, 0x28, 0x1e, 0x12, 0x12, 0x1e, + 0x28, 0x17, 0x17, 0x2a, 0x1f, 0x12, 0x12, 0x1f, 0x2a, 0x00, 0x00, 0x03, + 0x00, 0x44, 0xff, 0xf2, 0x05, 0xf9, 0x05, 0xa8, 0x00, 0x2e, 0x00, 0x4a, + 0x00, 0x62, 0x01, 0x5a, 0x40, 0x16, 0x5f, 0x5d, 0x53, 0x51, 0x45, 0x43, + 0x37, 0x35, 0x2b, 0x29, 0x21, 0x1f, 0x1c, 0x1a, 0x15, 0x13, 0x0b, 0x09, + 0x04, 0x02, 0x0a, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, 0x40, 0x47, + 0x17, 0x01, 0x04, 0x02, 0x07, 0x01, 0x05, 0x00, 0x02, 0x1e, 0x00, 0x03, + 0x04, 0x00, 0x04, 0x03, 0x00, 0x32, 0x00, 0x00, 0x05, 0x04, 0x00, 0x05, + 0x30, 0x00, 0x02, 0x00, 0x04, 0x03, 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, + 0x05, 0x00, 0x01, 0x08, 0x05, 0x01, 0x01, 0x00, 0x26, 0x00, 0x09, 0x09, + 0x06, 0x01, 0x00, 0x24, 0x00, 0x06, 0x06, 0x11, 0x1f, 0x00, 0x08, 0x08, + 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x07, 0x12, 0x07, 0x20, 0x09, 0x1b, + 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x47, 0x17, 0x01, 0x04, 0x02, 0x07, + 0x01, 0x05, 0x00, 0x02, 0x1e, 0x00, 0x03, 0x04, 0x00, 0x04, 0x03, 0x00, + 0x32, 0x00, 0x00, 0x05, 0x04, 0x00, 0x05, 0x30, 0x00, 0x02, 0x00, 0x04, + 0x03, 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x01, 0x08, 0x05, + 0x01, 0x01, 0x00, 0x26, 0x00, 0x09, 0x09, 0x06, 0x01, 0x00, 0x24, 0x00, + 0x06, 0x06, 0x11, 0x1f, 0x00, 0x08, 0x08, 0x07, 0x01, 0x00, 0x24, 0x00, + 0x07, 0x07, 0x15, 0x07, 0x20, 0x09, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x45, 0x17, 0x01, 0x04, 0x02, 0x07, 0x01, 0x05, 0x00, 0x02, 0x1e, + 0x00, 0x03, 0x04, 0x00, 0x04, 0x03, 0x00, 0x32, 0x00, 0x00, 0x05, 0x04, + 0x00, 0x05, 0x30, 0x00, 0x06, 0x00, 0x09, 0x02, 0x06, 0x09, 0x01, 0x00, + 0x26, 0x00, 0x02, 0x00, 0x04, 0x03, 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, + 0x05, 0x00, 0x01, 0x08, 0x05, 0x01, 0x01, 0x00, 0x26, 0x00, 0x08, 0x08, + 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x07, 0x15, 0x07, 0x20, 0x08, 0x1b, + 0x40, 0x4e, 0x17, 0x01, 0x04, 0x02, 0x07, 0x01, 0x05, 0x00, 0x02, 0x1e, + 0x00, 0x03, 0x04, 0x00, 0x04, 0x03, 0x00, 0x32, 0x00, 0x00, 0x05, 0x04, + 0x00, 0x05, 0x30, 0x00, 0x06, 0x00, 0x09, 0x02, 0x06, 0x09, 0x01, 0x00, + 0x26, 0x00, 0x02, 0x00, 0x04, 0x03, 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, + 0x05, 0x00, 0x01, 0x08, 0x05, 0x01, 0x01, 0x00, 0x26, 0x00, 0x08, 0x07, + 0x07, 0x08, 0x01, 0x00, 0x23, 0x00, 0x08, 0x08, 0x07, 0x01, 0x00, 0x24, + 0x00, 0x07, 0x08, 0x07, 0x01, 0x00, 0x21, 0x09, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x0e, 0x01, + 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, + 0x07, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x01, 0x34, 0x3e, 0x04, 0x33, + 0x32, 0x1e, 0x04, 0x15, 0x14, 0x0e, 0x04, 0x23, 0x22, 0x2e, 0x04, 0x37, + 0x14, 0x1e, 0x04, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x04, 0x23, + 0x22, 0x0e, 0x02, 0x04, 0x06, 0x08, 0x0b, 0x06, 0x0b, 0x08, 0x06, 0x3d, + 0x39, 0xa6, 0x74, 0x62, 0xa1, 0x73, 0x3f, 0x45, 0x7a, 0xa7, 0x62, 0x6c, + 0x98, 0x39, 0x2e, 0x05, 0x10, 0x0c, 0x0e, 0x1f, 0x32, 0x4c, 0x3b, 0x46, + 0x71, 0x4f, 0x2b, 0x2b, 0x4c, 0x6a, 0x3e, 0x30, 0x42, 0x30, 0x25, 0xfc, + 0x52, 0x34, 0x5f, 0x86, 0xa2, 0xba, 0x65, 0x65, 0xbb, 0xa2, 0x86, 0x5f, + 0x34, 0x34, 0x5f, 0x86, 0xa2, 0xbb, 0x65, 0x65, 0xba, 0xa2, 0x86, 0x5f, + 0x34, 0x64, 0x2c, 0x52, 0x72, 0x8c, 0xa2, 0x58, 0x84, 0xe7, 0xab, 0x63, + 0x2d, 0x52, 0x73, 0x8c, 0xa3, 0x58, 0x84, 0xe6, 0xaa, 0x62, 0x01, 0xcf, + 0x05, 0x07, 0x06, 0x06, 0x40, 0x42, 0x49, 0x44, 0x7a, 0xa8, 0x64, 0x65, + 0xa9, 0x79, 0x43, 0x44, 0x37, 0x41, 0x06, 0x0c, 0x16, 0x1b, 0x17, 0x2d, + 0x54, 0x78, 0x4b, 0x4d, 0x79, 0x52, 0x2b, 0x0c, 0x14, 0x18, 0x01, 0x09, + 0x65, 0xbb, 0xa3, 0x85, 0x60, 0x34, 0x34, 0x60, 0x85, 0xa3, 0xbb, 0x65, + 0x64, 0xbb, 0xa2, 0x85, 0x60, 0x34, 0x34, 0x60, 0x85, 0xa2, 0xba, 0x65, + 0x59, 0xa4, 0x8f, 0x74, 0x53, 0x2d, 0x64, 0xad, 0xe9, 0x86, 0x59, 0xa6, + 0x8f, 0x76, 0x53, 0x2e, 0x65, 0xaf, 0xeb, 0x00, 0x00, 0x02, 0x00, 0x5c, + 0x03, 0x3f, 0x02, 0x54, 0x05, 0xaa, 0x00, 0x29, 0x00, 0x35, 0x00, 0xf4, + 0x40, 0x16, 0x2b, 0x2a, 0x2f, 0x2e, 0x2a, 0x35, 0x2b, 0x35, 0x25, 0x23, + 0x1e, 0x1c, 0x19, 0x17, 0x14, 0x13, 0x0b, 0x09, 0x02, 0x00, 0x09, 0x07, + 0x2b, 0x4b, 0xb0, 0x36, 0x50, 0x58, 0x40, 0x39, 0x21, 0x01, 0x03, 0x05, + 0x2d, 0x01, 0x06, 0x07, 0x05, 0x01, 0x00, 0x06, 0x03, 0x1e, 0x00, 0x04, + 0x03, 0x02, 0x03, 0x04, 0x02, 0x32, 0x00, 0x02, 0x00, 0x07, 0x06, 0x02, + 0x07, 0x01, 0x00, 0x26, 0x08, 0x01, 0x06, 0x01, 0x01, 0x00, 0x06, 0x00, + 0x01, 0x00, 0x25, 0x00, 0x03, 0x03, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, + 0x05, 0x11, 0x03, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, + 0x40, 0x21, 0x01, 0x03, 0x05, 0x2d, 0x01, 0x06, 0x07, 0x05, 0x01, 0x00, + 0x06, 0x03, 0x1e, 0x00, 0x04, 0x03, 0x02, 0x03, 0x04, 0x02, 0x32, 0x00, + 0x00, 0x06, 0x01, 0x06, 0x00, 0x01, 0x32, 0x00, 0x02, 0x00, 0x07, 0x06, + 0x02, 0x07, 0x01, 0x00, 0x26, 0x08, 0x01, 0x06, 0x00, 0x01, 0x06, 0x01, + 0x01, 0x00, 0x25, 0x00, 0x03, 0x03, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, + 0x05, 0x11, 0x03, 0x20, 0x07, 0x1b, 0x40, 0x4b, 0x21, 0x01, 0x03, 0x05, + 0x2d, 0x01, 0x06, 0x07, 0x05, 0x01, 0x00, 0x06, 0x03, 0x1e, 0x00, 0x04, + 0x03, 0x02, 0x03, 0x04, 0x02, 0x32, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, + 0x01, 0x32, 0x00, 0x05, 0x00, 0x03, 0x04, 0x05, 0x03, 0x01, 0x00, 0x26, + 0x00, 0x02, 0x00, 0x07, 0x06, 0x02, 0x07, 0x01, 0x00, 0x26, 0x08, 0x01, + 0x06, 0x00, 0x01, 0x06, 0x01, 0x00, 0x23, 0x08, 0x01, 0x06, 0x06, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x06, 0x01, 0x01, 0x00, 0x21, 0x08, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x0e, 0x03, + 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x3e, 0x01, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x01, 0x32, 0x36, 0x37, 0x35, 0x0e, 0x03, 0x15, + 0x14, 0x16, 0x02, 0x54, 0x3c, 0x12, 0x12, 0x08, 0x0c, 0x18, 0x2e, 0x32, + 0x38, 0x22, 0x26, 0x41, 0x30, 0x1b, 0x26, 0x58, 0x91, 0x6b, 0x3a, 0x39, + 0x26, 0x32, 0x25, 0x1d, 0x10, 0x0e, 0x14, 0x05, 0x16, 0x34, 0x79, 0x49, + 0x36, 0x54, 0x3a, 0x1e, 0xfe, 0xe1, 0x33, 0x4a, 0x24, 0x46, 0x61, 0x3c, + 0x1a, 0x34, 0x03, 0x48, 0x0b, 0x12, 0x31, 0x15, 0x20, 0x17, 0x0b, 0x14, + 0x29, 0x3c, 0x29, 0x22, 0x43, 0x35, 0x23, 0x02, 0x25, 0x3f, 0x3c, 0x12, + 0x15, 0x11, 0x0f, 0x0a, 0x2a, 0x31, 0x2e, 0x22, 0x3c, 0x54, 0x33, 0xfe, + 0xd6, 0x26, 0x23, 0x69, 0x02, 0x11, 0x1b, 0x23, 0x15, 0x2a, 0x22, 0x00, + 0x00, 0x02, 0x00, 0x8a, 0x00, 0x81, 0x03, 0x01, 0x03, 0xa2, 0x00, 0x14, + 0x00, 0x29, 0x00, 0x09, 0x40, 0x06, 0x17, 0x29, 0x02, 0x14, 0x02, 0x0b, + 0x2b, 0x13, 0x35, 0x13, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x03, 0x06, + 0x07, 0x16, 0x17, 0x13, 0x1e, 0x01, 0x15, 0x14, 0x0f, 0x01, 0x13, 0x35, + 0x13, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x03, 0x06, 0x07, 0x16, 0x17, + 0x13, 0x1e, 0x01, 0x15, 0x14, 0x0f, 0x01, 0x8a, 0xf9, 0x3a, 0x0e, 0x0e, + 0x0a, 0x9f, 0x0e, 0x0e, 0x0f, 0x0d, 0x9f, 0x05, 0x05, 0x1c, 0x3a, 0x2f, + 0xf9, 0x3a, 0x0e, 0x0e, 0x0a, 0x9f, 0x0e, 0x0e, 0x0f, 0x0d, 0x9f, 0x05, + 0x05, 0x1c, 0x3a, 0x02, 0x06, 0x17, 0x01, 0x85, 0x1c, 0x07, 0x16, 0x0d, + 0x11, 0x10, 0xfe, 0xfb, 0x18, 0x0d, 0x0e, 0x16, 0xfe, 0xfb, 0x08, 0x12, + 0x08, 0x1c, 0x0d, 0x1c, 0x01, 0x85, 0x17, 0x01, 0x85, 0x1c, 0x07, 0x16, + 0x0d, 0x11, 0x10, 0xfe, 0xfb, 0x18, 0x0d, 0x0e, 0x16, 0xfe, 0xfb, 0x08, + 0x12, 0x08, 0x1c, 0x0d, 0x1c, 0x00, 0x00, 0x01, 0x00, 0x94, 0x01, 0x3b, + 0x03, 0xf0, 0x02, 0xe3, 0x00, 0x05, 0x00, 0x52, 0x40, 0x08, 0x05, 0x04, + 0x03, 0x02, 0x01, 0x00, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, + 0x40, 0x1d, 0x00, 0x01, 0x02, 0x02, 0x01, 0x29, 0x00, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x24, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x00, 0x21, 0x04, 0x1b, 0x40, 0x1c, 0x00, 0x01, + 0x02, 0x01, 0x35, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x24, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, + 0x21, 0x04, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, + 0x94, 0x03, 0x5c, 0x97, 0xfd, 0x3b, 0x02, 0xe3, 0xfe, 0x58, 0x01, 0x21, + 0x00, 0x01, 0x00, 0x64, 0x02, 0x0c, 0x02, 0x52, 0x02, 0xa3, 0x00, 0x03, + 0x00, 0x25, 0x40, 0x06, 0x03, 0x02, 0x01, 0x00, 0x02, 0x07, 0x2b, 0x40, + 0x17, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x03, + 0xb0, 0x38, 0x2b, 0x13, 0x21, 0x15, 0x21, 0x64, 0x01, 0xee, 0xfe, 0x12, + 0x02, 0xa3, 0x97, 0x00, 0x00, 0x04, 0x00, 0x44, 0xff, 0xf2, 0x05, 0xf9, + 0x05, 0xa8, 0x00, 0x1b, 0x00, 0x33, 0x00, 0x49, 0x00, 0x56, 0x01, 0x8e, + 0x40, 0x1a, 0x34, 0x34, 0x56, 0x54, 0x4c, 0x4a, 0x34, 0x49, 0x34, 0x48, + 0x44, 0x42, 0x39, 0x37, 0x36, 0x35, 0x30, 0x2e, 0x24, 0x22, 0x16, 0x14, + 0x08, 0x06, 0x0b, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, 0x40, 0x3e, + 0x3e, 0x01, 0x07, 0x08, 0x01, 0x1e, 0x06, 0x01, 0x04, 0x07, 0x02, 0x07, + 0x04, 0x02, 0x32, 0x00, 0x05, 0x00, 0x09, 0x08, 0x05, 0x09, 0x01, 0x00, + 0x26, 0x00, 0x08, 0x0a, 0x01, 0x07, 0x04, 0x08, 0x07, 0x01, 0x00, 0x26, + 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x11, 0x1f, + 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x12, 0x01, + 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x3e, 0x3e, 0x01, + 0x07, 0x08, 0x01, 0x1e, 0x06, 0x01, 0x04, 0x07, 0x02, 0x07, 0x04, 0x02, + 0x32, 0x00, 0x05, 0x00, 0x09, 0x08, 0x05, 0x09, 0x01, 0x00, 0x26, 0x00, + 0x08, 0x0a, 0x01, 0x07, 0x04, 0x08, 0x07, 0x01, 0x00, 0x26, 0x00, 0x03, + 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x11, 0x1f, 0x00, 0x02, + 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, 0x20, 0x08, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x3c, 0x3e, 0x01, 0x07, 0x08, + 0x01, 0x1e, 0x06, 0x01, 0x04, 0x07, 0x02, 0x07, 0x04, 0x02, 0x32, 0x00, + 0x00, 0x00, 0x03, 0x05, 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, + 0x09, 0x08, 0x05, 0x09, 0x01, 0x00, 0x26, 0x00, 0x08, 0x0a, 0x01, 0x07, + 0x04, 0x08, 0x07, 0x01, 0x00, 0x26, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x45, 0x3e, 0x01, 0x07, 0x08, 0x01, 0x1e, 0x06, 0x01, + 0x04, 0x07, 0x02, 0x07, 0x04, 0x02, 0x32, 0x00, 0x00, 0x00, 0x03, 0x05, + 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x09, 0x08, 0x05, 0x09, + 0x01, 0x00, 0x26, 0x00, 0x08, 0x0a, 0x01, 0x07, 0x04, 0x08, 0x07, 0x01, + 0x00, 0x26, 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, + 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x21, + 0x08, 0x1b, 0x40, 0x4b, 0x3e, 0x01, 0x07, 0x08, 0x01, 0x1e, 0x00, 0x06, + 0x07, 0x04, 0x07, 0x06, 0x04, 0x32, 0x00, 0x04, 0x02, 0x07, 0x04, 0x02, + 0x30, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, + 0x05, 0x00, 0x09, 0x08, 0x05, 0x09, 0x01, 0x00, 0x26, 0x00, 0x08, 0x0a, + 0x01, 0x07, 0x06, 0x08, 0x07, 0x01, 0x00, 0x26, 0x00, 0x02, 0x01, 0x01, + 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x02, 0x01, 0x01, 0x00, 0x21, 0x09, 0x59, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x13, 0x34, 0x3e, 0x04, 0x33, 0x32, 0x1e, 0x04, 0x15, 0x14, + 0x0e, 0x04, 0x23, 0x22, 0x2e, 0x04, 0x37, 0x14, 0x1e, 0x04, 0x33, 0x32, + 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x04, 0x23, 0x22, 0x0e, 0x02, 0x05, 0x11, + 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x17, + 0x13, 0x23, 0x22, 0x27, 0x03, 0x2e, 0x01, 0x23, 0x27, 0x33, 0x32, 0x3e, + 0x02, 0x35, 0x34, 0x2e, 0x02, 0x2b, 0x01, 0x44, 0x34, 0x5f, 0x86, 0xa2, + 0xba, 0x65, 0x65, 0xbb, 0xa2, 0x86, 0x5f, 0x34, 0x34, 0x5f, 0x86, 0xa2, + 0xbb, 0x65, 0x65, 0xba, 0xa2, 0x86, 0x5f, 0x34, 0x64, 0x2c, 0x52, 0x72, + 0x8c, 0xa2, 0x58, 0x84, 0xe7, 0xab, 0x63, 0x2d, 0x52, 0x73, 0x8c, 0xa3, + 0x58, 0x84, 0xe6, 0xaa, 0x62, 0x01, 0xe6, 0x9c, 0x01, 0x20, 0xac, 0xa6, + 0x6b, 0x6a, 0x11, 0x19, 0x0b, 0xe4, 0x94, 0x21, 0x10, 0xc9, 0x09, 0x19, + 0x1a, 0x50, 0x74, 0x37, 0x4d, 0x2f, 0x15, 0x13, 0x2b, 0x46, 0x34, 0x84, + 0x02, 0xcc, 0x65, 0xbb, 0xa3, 0x85, 0x60, 0x34, 0x34, 0x60, 0x85, 0xa3, + 0xbb, 0x65, 0x64, 0xbb, 0xa2, 0x85, 0x60, 0x34, 0x34, 0x60, 0x85, 0xa2, + 0xba, 0x65, 0x59, 0xa4, 0x8f, 0x74, 0x53, 0x2d, 0x64, 0xad, 0xe9, 0x86, + 0x59, 0xa6, 0x8f, 0x76, 0x53, 0x2e, 0x65, 0xaf, 0xeb, 0xe0, 0xfe, 0x9e, + 0x03, 0x7c, 0x7d, 0x7a, 0x5e, 0x84, 0x19, 0x0a, 0x1e, 0x14, 0xfe, 0xb2, + 0x19, 0x01, 0x2e, 0x0d, 0x0e, 0x72, 0x15, 0x28, 0x3a, 0x26, 0x25, 0x38, + 0x24, 0x12, 0x00, 0x01, 0x00, 0x14, 0x04, 0xcf, 0x02, 0x52, 0x05, 0x44, + 0x00, 0x03, 0x00, 0x25, 0x40, 0x06, 0x03, 0x02, 0x01, 0x00, 0x02, 0x07, + 0x2b, 0x40, 0x17, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x21, 0x03, 0xb0, 0x38, 0x2b, 0x13, 0x21, 0x15, 0x21, 0x14, 0x02, 0x3e, + 0xfd, 0xc2, 0x05, 0x44, 0x75, 0x00, 0x00, 0x02, 0x00, 0x46, 0x03, 0x27, + 0x02, 0xd2, 0x05, 0xaa, 0x00, 0x13, 0x00, 0x27, 0x00, 0x53, 0x40, 0x0a, + 0x24, 0x22, 0x1a, 0x18, 0x10, 0x0e, 0x06, 0x04, 0x04, 0x07, 0x2b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x17, 0x00, 0x02, 0x00, 0x01, 0x02, 0x01, + 0x01, 0x00, 0x25, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x11, 0x03, 0x20, 0x03, 0x1b, 0x40, 0x21, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, + 0x00, 0x23, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x02, + 0x01, 0x01, 0x00, 0x21, 0x04, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, + 0x02, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, + 0x02, 0x23, 0x22, 0x0e, 0x02, 0x46, 0x32, 0x58, 0x77, 0x45, 0x45, 0x77, + 0x58, 0x32, 0x32, 0x58, 0x77, 0x45, 0x45, 0x77, 0x58, 0x32, 0x7f, 0x1e, + 0x36, 0x49, 0x2a, 0x2a, 0x48, 0x36, 0x1e, 0x1e, 0x36, 0x48, 0x2a, 0x2a, + 0x49, 0x36, 0x1e, 0x04, 0x68, 0x43, 0x76, 0x57, 0x32, 0x32, 0x57, 0x76, + 0x43, 0x42, 0x75, 0x57, 0x33, 0x33, 0x57, 0x75, 0x41, 0x2a, 0x49, 0x36, + 0x1f, 0x1f, 0x36, 0x49, 0x2a, 0x2a, 0x4a, 0x37, 0x1f, 0x1f, 0x37, 0x4a, + 0x00, 0x02, 0x00, 0x64, 0x00, 0x50, 0x04, 0x22, 0x04, 0xb2, 0x00, 0x0b, + 0x00, 0x0f, 0x00, 0x8b, 0x40, 0x16, 0x00, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, + 0x00, 0x0b, 0x00, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, + 0x02, 0x01, 0x09, 0x07, 0x2b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x2e, + 0x04, 0x01, 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x26, + 0x08, 0x01, 0x05, 0x00, 0x02, 0x06, 0x05, 0x02, 0x00, 0x00, 0x26, 0x00, + 0x06, 0x07, 0x07, 0x06, 0x00, 0x00, 0x23, 0x00, 0x06, 0x06, 0x07, 0x00, + 0x00, 0x24, 0x00, 0x07, 0x06, 0x07, 0x00, 0x00, 0x21, 0x05, 0x1b, 0x40, + 0x36, 0x00, 0x04, 0x00, 0x03, 0x01, 0x04, 0x03, 0x00, 0x00, 0x26, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x26, 0x08, 0x01, 0x05, + 0x00, 0x02, 0x06, 0x05, 0x02, 0x00, 0x00, 0x26, 0x00, 0x06, 0x07, 0x07, + 0x06, 0x00, 0x00, 0x23, 0x00, 0x06, 0x06, 0x07, 0x00, 0x00, 0x24, 0x00, + 0x07, 0x06, 0x07, 0x00, 0x00, 0x21, 0x06, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, + 0x21, 0x15, 0x21, 0x02, 0x8b, 0x01, 0x97, 0xfe, 0x69, 0x92, 0xfe, 0x6b, + 0x01, 0x95, 0xfe, 0x6b, 0x03, 0xbe, 0xfc, 0x42, 0x04, 0xb2, 0xfe, 0x88, + 0x88, 0xfe, 0x90, 0x01, 0x70, 0x88, 0x01, 0x78, 0xfc, 0x25, 0x87, 0x00, + 0x00, 0x01, 0x00, 0x52, 0x03, 0x84, 0x02, 0x51, 0x06, 0x65, 0x00, 0x2d, + 0x00, 0x80, 0x40, 0x10, 0x01, 0x00, 0x28, 0x26, 0x22, 0x20, 0x14, 0x13, + 0x10, 0x0d, 0x00, 0x2d, 0x01, 0x2d, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x2b, 0x2b, 0x01, 0x04, 0x03, 0x0b, 0x01, 0x02, 0x01, + 0x02, 0x1e, 0x00, 0x04, 0x03, 0x01, 0x03, 0x04, 0x01, 0x32, 0x05, 0x01, + 0x00, 0x00, 0x03, 0x04, 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x02, 0x02, + 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0e, 0x02, 0x20, 0x05, 0x1b, + 0x40, 0x34, 0x2b, 0x01, 0x04, 0x03, 0x0b, 0x01, 0x02, 0x01, 0x02, 0x1e, + 0x00, 0x04, 0x03, 0x01, 0x03, 0x04, 0x01, 0x32, 0x05, 0x01, 0x00, 0x00, + 0x03, 0x04, 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x01, 0x02, 0x02, 0x01, + 0x01, 0x00, 0x23, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x24, 0x00, 0x02, + 0x01, 0x02, 0x00, 0x00, 0x21, 0x06, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x0f, 0x01, 0x3e, 0x01, 0x3b, 0x01, + 0x32, 0x16, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x3e, 0x03, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, + 0x2f, 0x01, 0x3e, 0x01, 0x01, 0x5a, 0x34, 0x55, 0x3c, 0x21, 0x19, 0x2a, + 0x36, 0x1e, 0xa2, 0x17, 0x2f, 0x15, 0xc3, 0x15, 0x17, 0xfe, 0x01, 0x0a, + 0x0c, 0xdd, 0x19, 0x2c, 0x20, 0x13, 0x3c, 0x2d, 0x2e, 0x39, 0x0e, 0x08, + 0x13, 0x11, 0x04, 0x09, 0x05, 0x47, 0x0f, 0x8a, 0x06, 0x65, 0x1e, 0x36, + 0x4d, 0x2f, 0x28, 0x45, 0x3e, 0x3a, 0x1e, 0xa5, 0x06, 0x08, 0x16, 0x14, + 0x4d, 0x2b, 0x0d, 0x1c, 0x0c, 0xdb, 0x19, 0x34, 0x35, 0x35, 0x1b, 0x33, + 0x37, 0x30, 0x2a, 0x0e, 0x10, 0x01, 0x01, 0x0c, 0x6a, 0x6a, 0x00, 0x01, + 0x00, 0x54, 0x03, 0x7c, 0x02, 0x52, 0x06, 0x65, 0x00, 0x3d, 0x00, 0xb2, + 0x40, 0x16, 0x01, 0x00, 0x36, 0x34, 0x30, 0x2e, 0x2a, 0x29, 0x28, 0x27, + 0x1f, 0x1d, 0x18, 0x16, 0x10, 0x0e, 0x00, 0x3d, 0x01, 0x3d, 0x09, 0x07, + 0x2b, 0x4b, 0xb0, 0x4b, 0x50, 0x58, 0x40, 0x41, 0x39, 0x01, 0x07, 0x06, + 0x07, 0x01, 0x04, 0x05, 0x14, 0x01, 0x03, 0x02, 0x03, 0x1e, 0x00, 0x07, + 0x06, 0x05, 0x06, 0x07, 0x05, 0x32, 0x00, 0x02, 0x04, 0x03, 0x04, 0x02, + 0x03, 0x32, 0x08, 0x01, 0x00, 0x00, 0x06, 0x07, 0x00, 0x06, 0x01, 0x00, + 0x26, 0x00, 0x05, 0x00, 0x04, 0x02, 0x05, 0x04, 0x01, 0x00, 0x26, 0x00, + 0x01, 0x01, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x0e, 0x01, 0x20, + 0x07, 0x1b, 0x40, 0x4a, 0x39, 0x01, 0x07, 0x06, 0x07, 0x01, 0x04, 0x05, + 0x14, 0x01, 0x03, 0x02, 0x03, 0x1e, 0x00, 0x07, 0x06, 0x05, 0x06, 0x07, + 0x05, 0x32, 0x00, 0x02, 0x04, 0x03, 0x04, 0x02, 0x03, 0x32, 0x08, 0x01, + 0x00, 0x00, 0x06, 0x07, 0x00, 0x06, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, + 0x04, 0x02, 0x05, 0x04, 0x01, 0x00, 0x26, 0x00, 0x03, 0x01, 0x01, 0x03, + 0x01, 0x00, 0x23, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x03, 0x01, 0x01, 0x00, 0x21, 0x08, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x27, 0x37, 0x36, 0x33, 0x32, 0x17, 0x1e, 0x03, 0x33, + 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x35, 0x3e, 0x01, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x2f, + 0x01, 0x3e, 0x03, 0x01, 0x62, 0x33, 0x52, 0x3b, 0x20, 0x77, 0x42, 0x45, + 0x2a, 0x45, 0x5b, 0x30, 0x39, 0x54, 0x3d, 0x2b, 0x0f, 0x37, 0x0f, 0x0e, + 0x1d, 0x0b, 0x06, 0x12, 0x1e, 0x2b, 0x20, 0x1f, 0x2f, 0x20, 0x10, 0x11, + 0x27, 0x41, 0x2f, 0x57, 0x47, 0x3a, 0x30, 0x30, 0x39, 0x0c, 0x08, 0x11, + 0x0f, 0x04, 0x09, 0x05, 0x43, 0x07, 0x2c, 0x41, 0x54, 0x06, 0x65, 0x1d, + 0x33, 0x44, 0x28, 0x80, 0x2d, 0x13, 0x4e, 0x3e, 0x37, 0x54, 0x39, 0x1d, + 0x19, 0x31, 0x48, 0x2f, 0x18, 0x06, 0x17, 0x0d, 0x20, 0x1c, 0x13, 0x14, + 0x1f, 0x28, 0x15, 0x1e, 0x2b, 0x1c, 0x0e, 0x57, 0x01, 0x3c, 0x34, 0x32, + 0x34, 0x2f, 0x28, 0x10, 0x0f, 0x01, 0x01, 0x0c, 0x35, 0x4f, 0x35, 0x1b, + 0x00, 0x01, 0x00, 0xc4, 0x04, 0x8b, 0x02, 0x55, 0x05, 0xa9, 0x00, 0x09, + 0x00, 0x33, 0x40, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x05, 0x03, + 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x0d, 0x00, 0x00, + 0x01, 0x00, 0x35, 0x02, 0x01, 0x01, 0x01, 0x11, 0x01, 0x20, 0x02, 0x1b, + 0x40, 0x0b, 0x02, 0x01, 0x01, 0x00, 0x01, 0x34, 0x00, 0x00, 0x00, 0x2b, + 0x02, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x03, 0x0e, 0x01, 0x2b, 0x01, 0x37, + 0x3e, 0x01, 0x33, 0x02, 0x55, 0xe9, 0x0e, 0x1b, 0x15, 0x6a, 0x94, 0x0e, + 0x21, 0x20, 0x05, 0xa9, 0xfe, 0xfe, 0x0f, 0x0d, 0xf2, 0x17, 0x15, 0x00, + 0x00, 0x01, 0x00, 0x7a, 0xfe, 0xa9, 0x03, 0xc5, 0x03, 0xf5, 0x00, 0x1d, + 0x01, 0x59, 0x40, 0x12, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x1d, 0x1a, 0x18, + 0x12, 0x10, 0x0c, 0x0a, 0x09, 0x08, 0x05, 0x03, 0x07, 0x07, 0x2b, 0x4b, + 0xb0, 0x49, 0x50, 0x58, 0x40, 0x26, 0x0e, 0x07, 0x02, 0x00, 0x01, 0x14, + 0x01, 0x02, 0x00, 0x02, 0x1e, 0x06, 0x05, 0x02, 0x01, 0x01, 0x0e, 0x1f, + 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x03, 0x01, 0x02, 0x02, 0x0c, + 0x1f, 0x00, 0x04, 0x04, 0x10, 0x04, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x4d, + 0x50, 0x58, 0x40, 0x28, 0x0e, 0x07, 0x02, 0x00, 0x01, 0x14, 0x01, 0x02, + 0x00, 0x02, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x03, 0x01, + 0x02, 0x02, 0x0c, 0x1f, 0x00, 0x04, 0x04, 0x01, 0x00, 0x00, 0x24, 0x06, + 0x05, 0x02, 0x01, 0x01, 0x0e, 0x04, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x2c, 0x0e, 0x07, 0x02, 0x00, 0x01, 0x14, 0x01, 0x03, + 0x00, 0x02, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, + 0x03, 0x0c, 0x1f, 0x00, 0x02, 0x02, 0x0c, 0x1f, 0x00, 0x04, 0x04, 0x01, + 0x00, 0x00, 0x24, 0x06, 0x05, 0x02, 0x01, 0x01, 0x0e, 0x04, 0x20, 0x06, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x2e, 0x0e, 0x07, 0x02, 0x00, + 0x01, 0x14, 0x01, 0x03, 0x00, 0x02, 0x1e, 0x00, 0x04, 0x01, 0x04, 0x01, + 0x00, 0x22, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, + 0x0f, 0x1f, 0x06, 0x05, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, 0x00, + 0x02, 0x02, 0x0f, 0x02, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, + 0x40, 0x32, 0x0e, 0x07, 0x02, 0x00, 0x01, 0x14, 0x01, 0x03, 0x00, 0x02, + 0x1e, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, 0x26, 0x06, + 0x05, 0x02, 0x01, 0x00, 0x02, 0x04, 0x01, 0x02, 0x01, 0x00, 0x26, 0x06, + 0x05, 0x02, 0x01, 0x01, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x01, 0x04, + 0x01, 0x00, 0x21, 0x05, 0x1b, 0x40, 0x38, 0x0e, 0x07, 0x02, 0x00, 0x05, + 0x14, 0x01, 0x03, 0x00, 0x02, 0x1e, 0x06, 0x01, 0x05, 0x00, 0x04, 0x05, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, + 0x26, 0x00, 0x01, 0x00, 0x02, 0x04, 0x01, 0x02, 0x01, 0x00, 0x26, 0x06, + 0x01, 0x05, 0x05, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x05, 0x04, 0x01, + 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, 0x22, + 0x2f, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x1e, 0x01, 0x15, 0x11, + 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, 0x2c, 0x6c, 0x69, 0x4e, 0x8a, 0x3a, + 0xb2, 0x6a, 0x26, 0x0a, 0x0e, 0x43, 0x8d, 0x57, 0x4a, 0x70, 0x27, 0x07, + 0x06, 0x59, 0x26, 0x29, 0x03, 0xf5, 0xfd, 0x6e, 0x6d, 0x78, 0x4a, 0x42, + 0x02, 0xeb, 0xfc, 0x0b, 0x25, 0x6d, 0x48, 0x44, 0x33, 0x2e, 0x2a, 0x57, + 0x26, 0xfe, 0xe9, 0x28, 0x24, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, + 0xff, 0x37, 0x05, 0x16, 0x05, 0x99, 0x00, 0x13, 0x00, 0xa2, 0x40, 0x12, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x12, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, + 0x04, 0x03, 0x02, 0x01, 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x1d, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0x32, 0x03, 0x01, + 0x01, 0x01, 0x33, 0x02, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x24, 0x06, + 0x01, 0x05, 0x05, 0x0b, 0x00, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, + 0x58, 0x40, 0x27, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0x32, 0x03, + 0x01, 0x01, 0x01, 0x33, 0x06, 0x01, 0x05, 0x00, 0x00, 0x05, 0x01, 0x00, + 0x23, 0x06, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00, 0x24, 0x02, 0x01, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x21, 0x05, 0x1b, 0x40, 0x32, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x2a, 0x00, 0x04, 0x03, 0x02, 0x04, 0x03, 0x30, 0x00, + 0x03, 0x01, 0x02, 0x03, 0x01, 0x30, 0x00, 0x01, 0x01, 0x33, 0x06, 0x01, + 0x05, 0x02, 0x02, 0x05, 0x01, 0x00, 0x23, 0x06, 0x01, 0x05, 0x05, 0x02, + 0x00, 0x00, 0x24, 0x00, 0x02, 0x05, 0x02, 0x00, 0x00, 0x21, 0x07, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, + 0x23, 0x11, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x05, 0x16, + 0xdb, 0x9d, 0xfe, 0xeb, 0x9d, 0x68, 0xa6, 0x75, 0x3f, 0x3f, 0x75, 0xa6, + 0x68, 0x05, 0x99, 0x99, 0xfa, 0x37, 0x05, 0xc9, 0xfa, 0x37, 0x03, 0x5d, + 0x3d, 0x69, 0x8e, 0x51, 0x56, 0x8d, 0x65, 0x38, 0x00, 0x01, 0x00, 0x7c, + 0x01, 0xbd, 0x01, 0xa7, 0x02, 0xe8, 0x00, 0x13, 0x00, 0x25, 0x40, 0x06, + 0x10, 0x0e, 0x06, 0x04, 0x02, 0x07, 0x2b, 0x40, 0x17, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, + 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x21, 0x03, 0xb0, 0x38, 0x2b, 0x13, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x7c, 0x17, 0x29, 0x36, 0x1e, 0x1f, 0x38, 0x28, 0x18, + 0x18, 0x28, 0x38, 0x1f, 0x1e, 0x36, 0x29, 0x17, 0x02, 0x51, 0x1f, 0x38, + 0x28, 0x18, 0x18, 0x28, 0x38, 0x1f, 0x1e, 0x36, 0x29, 0x17, 0x17, 0x29, + 0x36, 0x00, 0x00, 0x01, 0x00, 0x84, 0xfe, 0xa1, 0x01, 0xef, 0x00, 0x0a, + 0x00, 0x1d, 0x00, 0xc3, 0x40, 0x0e, 0x01, 0x00, 0x19, 0x17, 0x0f, 0x0e, + 0x06, 0x04, 0x00, 0x1d, 0x01, 0x1d, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x09, + 0x50, 0x58, 0x40, 0x21, 0x10, 0x0d, 0x02, 0x00, 0x02, 0x1b, 0x01, 0x03, + 0x00, 0x02, 0x1e, 0x00, 0x02, 0x00, 0x00, 0x02, 0x28, 0x01, 0x04, 0x02, + 0x00, 0x00, 0x03, 0x01, 0x02, 0x24, 0x00, 0x03, 0x03, 0x10, 0x03, 0x20, + 0x04, 0x1b, 0x4b, 0xb0, 0x15, 0x50, 0x58, 0x40, 0x20, 0x10, 0x0d, 0x02, + 0x00, 0x02, 0x1b, 0x01, 0x03, 0x00, 0x02, 0x1e, 0x00, 0x02, 0x00, 0x02, + 0x34, 0x01, 0x04, 0x02, 0x00, 0x00, 0x03, 0x01, 0x02, 0x24, 0x00, 0x03, + 0x03, 0x10, 0x03, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, + 0x24, 0x10, 0x0d, 0x02, 0x00, 0x02, 0x1b, 0x01, 0x03, 0x01, 0x02, 0x1e, + 0x00, 0x02, 0x00, 0x02, 0x34, 0x04, 0x01, 0x00, 0x01, 0x00, 0x34, 0x00, + 0x01, 0x01, 0x03, 0x01, 0x02, 0x24, 0x00, 0x03, 0x03, 0x10, 0x03, 0x20, + 0x05, 0x1b, 0x40, 0x2d, 0x10, 0x0d, 0x02, 0x00, 0x02, 0x1b, 0x01, 0x03, + 0x01, 0x02, 0x1e, 0x00, 0x02, 0x00, 0x02, 0x34, 0x04, 0x01, 0x00, 0x01, + 0x00, 0x34, 0x00, 0x01, 0x03, 0x03, 0x01, 0x01, 0x00, 0x23, 0x00, 0x01, + 0x01, 0x03, 0x01, 0x02, 0x24, 0x00, 0x03, 0x01, 0x03, 0x01, 0x02, 0x21, + 0x06, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x17, 0x32, 0x1e, 0x02, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x37, 0x33, 0x07, 0x1e, 0x01, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x36, 0xac, 0x06, + 0x10, 0x16, 0x20, 0x15, 0x2a, 0x2b, 0x16, 0x29, 0x3c, 0x26, 0x2b, 0x70, + 0x18, 0x5a, 0x51, 0x20, 0x39, 0x50, 0x30, 0x29, 0x4a, 0x1f, 0x11, 0x06, + 0xf7, 0x07, 0x09, 0x07, 0x21, 0x1a, 0x13, 0x1a, 0x12, 0x0c, 0x05, 0x8d, + 0x50, 0x14, 0x45, 0x36, 0x20, 0x33, 0x24, 0x13, 0x11, 0x0e, 0x37, 0x12, + 0x00, 0x01, 0x00, 0x78, 0x03, 0x84, 0x02, 0x44, 0x06, 0x5f, 0x00, 0x0f, + 0x00, 0xa2, 0x40, 0x0c, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x07, 0x05, + 0x01, 0x00, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x24, 0x50, 0x58, 0x40, 0x21, + 0x09, 0x03, 0x02, 0x03, 0x01, 0x02, 0x01, 0x1e, 0x00, 0x02, 0x01, 0x02, + 0x34, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, + 0x24, 0x03, 0x01, 0x00, 0x00, 0x0e, 0x04, 0x20, 0x05, 0x1b, 0x4b, 0xb0, + 0xe8, 0x50, 0x58, 0x40, 0x2b, 0x09, 0x03, 0x02, 0x03, 0x01, 0x02, 0x01, + 0x1e, 0x00, 0x02, 0x01, 0x02, 0x34, 0x00, 0x01, 0x00, 0x01, 0x34, 0x03, + 0x01, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x23, 0x03, 0x01, 0x00, 0x00, + 0x04, 0x00, 0x02, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x21, 0x06, + 0x1b, 0x40, 0x30, 0x09, 0x03, 0x02, 0x03, 0x01, 0x02, 0x01, 0x1e, 0x00, + 0x02, 0x01, 0x02, 0x34, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x03, 0x2a, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x23, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x02, 0x21, 0x07, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x33, 0x11, 0x37, + 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, + 0xad, 0x93, 0x04, 0x6b, 0x0c, 0x0e, 0x17, 0x09, 0x27, 0xde, 0x6c, 0x82, + 0xfe, 0x69, 0x03, 0xd9, 0x01, 0xb8, 0x2b, 0x58, 0x09, 0x0e, 0x38, 0xbe, + 0xfd, 0x7a, 0x55, 0x00, 0x00, 0x02, 0x00, 0x48, 0x03, 0x3c, 0x02, 0xb1, + 0x05, 0xa9, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x60, 0x40, 0x12, 0x15, 0x14, + 0x01, 0x00, 0x1b, 0x19, 0x14, 0x1f, 0x15, 0x1f, 0x0b, 0x09, 0x00, 0x13, + 0x01, 0x13, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x19, + 0x05, 0x01, 0x02, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x25, 0x00, 0x03, + 0x03, 0x00, 0x01, 0x00, 0x24, 0x04, 0x01, 0x00, 0x00, 0x11, 0x03, 0x20, + 0x03, 0x1b, 0x40, 0x24, 0x04, 0x01, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, + 0x01, 0x00, 0x26, 0x05, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x23, + 0x05, 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x02, 0x01, + 0x01, 0x00, 0x21, 0x04, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, + 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, + 0x01, 0x7e, 0x46, 0x71, 0x50, 0x2c, 0x2c, 0x50, 0x71, 0x46, 0x47, 0x72, + 0x51, 0x2c, 0x2c, 0x51, 0x72, 0x47, 0x54, 0x53, 0x53, 0x54, 0x57, 0x53, + 0x53, 0x05, 0xa9, 0x2b, 0x50, 0x73, 0x47, 0x48, 0x74, 0x51, 0x2b, 0x2b, + 0x51, 0x74, 0x48, 0x47, 0x73, 0x50, 0x2b, 0xfd, 0xfd, 0x69, 0x64, 0x64, + 0x68, 0x68, 0x64, 0x64, 0x69, 0x00, 0x00, 0x02, 0x00, 0x96, 0x00, 0x81, + 0x03, 0x0d, 0x03, 0xa2, 0x00, 0x12, 0x00, 0x25, 0x00, 0x09, 0x40, 0x06, + 0x25, 0x15, 0x10, 0x00, 0x02, 0x0b, 0x2b, 0x37, 0x27, 0x26, 0x35, 0x34, + 0x37, 0x13, 0x36, 0x37, 0x26, 0x27, 0x03, 0x26, 0x35, 0x34, 0x3f, 0x01, + 0x13, 0x15, 0x25, 0x15, 0x03, 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x36, + 0x37, 0x26, 0x27, 0x03, 0x26, 0x35, 0x34, 0x3f, 0x01, 0xec, 0x3a, 0x1c, + 0x0a, 0x9f, 0x0d, 0x0e, 0x0c, 0x0f, 0x9f, 0x0a, 0x1c, 0x3a, 0xf9, 0x01, + 0x28, 0xf9, 0x3a, 0x1c, 0x0a, 0x9f, 0x0d, 0x0e, 0x0c, 0x0f, 0x9f, 0x0a, + 0x1c, 0x3a, 0x81, 0x1c, 0x0d, 0x1c, 0x11, 0x11, 0x01, 0x05, 0x18, 0x0c, + 0x0b, 0x1a, 0x01, 0x05, 0x11, 0x11, 0x1c, 0x0d, 0x1c, 0xfe, 0x7b, 0x17, + 0x17, 0x17, 0xfe, 0x7b, 0x1c, 0x0d, 0x1c, 0x11, 0x11, 0x01, 0x05, 0x18, + 0x0c, 0x0b, 0x1a, 0x01, 0x05, 0x11, 0x11, 0x1c, 0x0d, 0x1c, 0x00, 0x04, + 0x00, 0x66, 0x00, 0x00, 0x05, 0x7c, 0x05, 0x9a, 0x00, 0x10, 0x00, 0x20, + 0x00, 0x26, 0x00, 0x30, 0x01, 0xb5, 0x40, 0x1c, 0x30, 0x2e, 0x2b, 0x29, + 0x26, 0x25, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x18, 0x16, 0x12, 0x11, + 0x10, 0x0f, 0x0b, 0x09, 0x08, 0x07, 0x06, 0x04, 0x01, 0x00, 0x0d, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x40, 0x1a, 0x14, 0x13, 0x03, + 0x06, 0x07, 0x24, 0x01, 0x00, 0x09, 0x02, 0x1e, 0x00, 0x06, 0x07, 0x05, + 0x07, 0x06, 0x05, 0x32, 0x08, 0x01, 0x05, 0x00, 0x09, 0x00, 0x05, 0x09, + 0x00, 0x02, 0x26, 0x0a, 0x01, 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x01, + 0x01, 0x00, 0x26, 0x0c, 0x01, 0x07, 0x07, 0x0b, 0x1f, 0x00, 0x04, 0x04, + 0x02, 0x01, 0x00, 0x24, 0x0b, 0x01, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x07, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x3d, 0x1a, 0x14, 0x13, 0x03, + 0x06, 0x07, 0x24, 0x01, 0x00, 0x09, 0x02, 0x1e, 0x0c, 0x01, 0x07, 0x06, + 0x07, 0x34, 0x00, 0x06, 0x05, 0x06, 0x34, 0x08, 0x01, 0x05, 0x00, 0x09, + 0x00, 0x05, 0x09, 0x00, 0x02, 0x26, 0x0a, 0x01, 0x00, 0x03, 0x01, 0x01, + 0x02, 0x00, 0x01, 0x01, 0x00, 0x26, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, + 0x24, 0x0b, 0x01, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x07, 0x1b, 0x4b, 0xb0, + 0x4e, 0x50, 0x58, 0x40, 0x46, 0x1a, 0x14, 0x13, 0x03, 0x06, 0x07, 0x24, + 0x01, 0x00, 0x09, 0x02, 0x1e, 0x0c, 0x01, 0x07, 0x06, 0x07, 0x34, 0x00, + 0x06, 0x05, 0x06, 0x34, 0x00, 0x04, 0x09, 0x02, 0x04, 0x00, 0x00, 0x23, + 0x08, 0x01, 0x05, 0x00, 0x09, 0x00, 0x05, 0x09, 0x00, 0x02, 0x26, 0x0a, + 0x01, 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x00, 0x26, 0x00, + 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, 0x0b, 0x01, 0x02, 0x04, 0x02, 0x01, + 0x00, 0x21, 0x08, 0x1b, 0x4b, 0xb8, 0x03, 0xe8, 0x50, 0x58, 0x40, 0x4a, + 0x1a, 0x14, 0x13, 0x03, 0x06, 0x0c, 0x24, 0x01, 0x00, 0x09, 0x02, 0x1e, + 0x00, 0x07, 0x0c, 0x07, 0x34, 0x00, 0x0c, 0x06, 0x0c, 0x34, 0x00, 0x06, + 0x05, 0x06, 0x34, 0x00, 0x04, 0x09, 0x02, 0x04, 0x00, 0x00, 0x23, 0x08, + 0x01, 0x05, 0x00, 0x09, 0x00, 0x05, 0x09, 0x00, 0x02, 0x26, 0x0a, 0x01, + 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x02, 0x26, 0x00, 0x04, + 0x04, 0x02, 0x01, 0x00, 0x24, 0x0b, 0x01, 0x02, 0x04, 0x02, 0x01, 0x00, + 0x21, 0x09, 0x1b, 0x40, 0x5f, 0x1a, 0x14, 0x13, 0x03, 0x06, 0x0c, 0x24, + 0x01, 0x00, 0x09, 0x02, 0x1e, 0x00, 0x07, 0x0c, 0x07, 0x34, 0x00, 0x0c, + 0x06, 0x0c, 0x34, 0x00, 0x06, 0x05, 0x06, 0x34, 0x00, 0x08, 0x05, 0x04, + 0x05, 0x08, 0x2a, 0x00, 0x0b, 0x01, 0x02, 0x01, 0x0b, 0x02, 0x32, 0x00, + 0x04, 0x09, 0x02, 0x04, 0x00, 0x00, 0x23, 0x00, 0x05, 0x00, 0x09, 0x00, + 0x05, 0x09, 0x00, 0x02, 0x26, 0x00, 0x0a, 0x00, 0x03, 0x01, 0x0a, 0x03, + 0x01, 0x02, 0x26, 0x00, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x01, 0x01, 0x00, + 0x26, 0x00, 0x04, 0x04, 0x02, 0x00, 0x00, 0x24, 0x00, 0x02, 0x04, 0x02, + 0x00, 0x00, 0x21, 0x0c, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x33, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x23, 0x35, 0x21, 0x22, 0x26, + 0x2f, 0x01, 0x01, 0x33, 0x25, 0x33, 0x11, 0x37, 0x07, 0x06, 0x23, 0x22, + 0x2f, 0x01, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x05, 0x34, 0x36, 0x37, + 0x03, 0x33, 0x05, 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x3e, 0x01, 0x3b, 0x01, + 0x05, 0x0f, 0x6d, 0x0e, 0x0d, 0x52, 0x6d, 0xfe, 0xce, 0x12, 0x15, 0x02, + 0x0a, 0x01, 0x56, 0x7c, 0xfb, 0x8c, 0x93, 0x04, 0x6b, 0x0c, 0x0e, 0x17, + 0x09, 0x27, 0xde, 0x6c, 0x82, 0xfe, 0x69, 0x04, 0x07, 0x02, 0x03, 0xf1, + 0xec, 0xfd, 0x10, 0x13, 0x2c, 0x1d, 0x4c, 0x03, 0x32, 0x12, 0x2e, 0x20, + 0x4d, 0x01, 0x0b, 0x41, 0x0b, 0x0f, 0xb0, 0xb0, 0x10, 0x0c, 0x39, 0x01, + 0xd4, 0x3b, 0x01, 0xb8, 0x2b, 0x58, 0x09, 0x0e, 0x38, 0xbe, 0xfd, 0x7a, + 0x55, 0xc3, 0x13, 0x2c, 0x17, 0xfe, 0xb9, 0xd6, 0x1f, 0x16, 0x05, 0x5c, + 0x1d, 0x20, 0x00, 0x03, 0x00, 0x66, 0x00, 0x00, 0x05, 0x5d, 0x05, 0x9a, + 0x00, 0x2d, 0x00, 0x3d, 0x00, 0x47, 0x01, 0xe6, 0x40, 0x1e, 0x01, 0x00, + 0x47, 0x45, 0x42, 0x40, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x35, 0x33, + 0x2f, 0x2e, 0x28, 0x26, 0x22, 0x20, 0x14, 0x13, 0x10, 0x0d, 0x00, 0x2d, + 0x01, 0x2d, 0x0d, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x4b, + 0x37, 0x31, 0x30, 0x03, 0x06, 0x07, 0x2b, 0x01, 0x04, 0x03, 0x0b, 0x01, + 0x02, 0x01, 0x03, 0x1e, 0x00, 0x06, 0x07, 0x05, 0x07, 0x06, 0x05, 0x32, + 0x00, 0x04, 0x03, 0x01, 0x03, 0x04, 0x01, 0x32, 0x08, 0x01, 0x05, 0x00, + 0x09, 0x03, 0x05, 0x09, 0x00, 0x02, 0x26, 0x0c, 0x01, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x03, 0x01, 0x00, 0x26, 0x0b, 0x01, 0x07, 0x07, 0x0b, 0x1f, + 0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, 0x0a, 0x01, 0x02, 0x02, 0x0c, + 0x02, 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x48, 0x37, + 0x31, 0x30, 0x03, 0x06, 0x07, 0x2b, 0x01, 0x04, 0x03, 0x0b, 0x01, 0x02, + 0x01, 0x03, 0x1e, 0x0b, 0x01, 0x07, 0x06, 0x07, 0x34, 0x00, 0x06, 0x05, + 0x06, 0x34, 0x00, 0x04, 0x03, 0x01, 0x03, 0x04, 0x01, 0x32, 0x08, 0x01, + 0x05, 0x00, 0x09, 0x03, 0x05, 0x09, 0x00, 0x02, 0x26, 0x0c, 0x01, 0x00, + 0x00, 0x03, 0x04, 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x02, + 0x01, 0x00, 0x24, 0x0a, 0x01, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x08, 0x1b, + 0x4b, 0xb0, 0x4e, 0x50, 0x58, 0x40, 0x51, 0x37, 0x31, 0x30, 0x03, 0x06, + 0x07, 0x2b, 0x01, 0x04, 0x03, 0x0b, 0x01, 0x02, 0x01, 0x03, 0x1e, 0x0b, + 0x01, 0x07, 0x06, 0x07, 0x34, 0x00, 0x06, 0x05, 0x06, 0x34, 0x00, 0x04, + 0x03, 0x01, 0x03, 0x04, 0x01, 0x32, 0x08, 0x01, 0x05, 0x00, 0x09, 0x03, + 0x05, 0x09, 0x00, 0x02, 0x26, 0x0c, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, + 0x03, 0x01, 0x00, 0x26, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x23, + 0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, 0x0a, 0x01, 0x02, 0x01, 0x02, + 0x01, 0x00, 0x21, 0x09, 0x1b, 0x4b, 0xb8, 0x03, 0xe8, 0x50, 0x58, 0x40, + 0x55, 0x37, 0x31, 0x30, 0x03, 0x06, 0x0b, 0x2b, 0x01, 0x04, 0x03, 0x0b, + 0x01, 0x02, 0x01, 0x03, 0x1e, 0x00, 0x07, 0x0b, 0x07, 0x34, 0x00, 0x0b, + 0x06, 0x0b, 0x34, 0x00, 0x06, 0x05, 0x06, 0x34, 0x00, 0x04, 0x03, 0x01, + 0x03, 0x04, 0x01, 0x32, 0x08, 0x01, 0x05, 0x00, 0x09, 0x03, 0x05, 0x09, + 0x00, 0x02, 0x26, 0x0c, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x03, 0x01, + 0x02, 0x26, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x23, 0x00, 0x01, + 0x01, 0x02, 0x01, 0x00, 0x24, 0x0a, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, + 0x21, 0x0a, 0x1b, 0x40, 0x62, 0x37, 0x31, 0x30, 0x03, 0x06, 0x0b, 0x2b, + 0x01, 0x04, 0x03, 0x0b, 0x01, 0x0a, 0x01, 0x03, 0x1e, 0x00, 0x07, 0x0b, + 0x07, 0x34, 0x00, 0x0b, 0x06, 0x0b, 0x34, 0x00, 0x06, 0x05, 0x06, 0x34, + 0x00, 0x08, 0x05, 0x00, 0x05, 0x08, 0x2a, 0x00, 0x04, 0x03, 0x01, 0x03, + 0x04, 0x01, 0x32, 0x00, 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x02, 0x32, 0x00, + 0x05, 0x00, 0x09, 0x03, 0x05, 0x09, 0x00, 0x02, 0x26, 0x0c, 0x01, 0x00, + 0x00, 0x03, 0x04, 0x00, 0x03, 0x01, 0x02, 0x26, 0x00, 0x01, 0x0a, 0x02, + 0x01, 0x01, 0x00, 0x23, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x24, 0x00, + 0x02, 0x01, 0x02, 0x00, 0x00, 0x21, 0x0c, 0x59, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x01, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x0f, 0x01, + 0x3e, 0x01, 0x3b, 0x01, 0x32, 0x16, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, + 0x3f, 0x01, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x0e, + 0x01, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x3e, 0x01, 0x25, 0x33, 0x11, 0x37, + 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, + 0x13, 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x04, 0x66, + 0x34, 0x55, 0x3c, 0x21, 0x19, 0x2a, 0x36, 0x1e, 0xa2, 0x17, 0x2f, 0x15, + 0xc3, 0x15, 0x17, 0xfe, 0x01, 0x0a, 0x0c, 0xdd, 0x19, 0x2c, 0x20, 0x13, + 0x3c, 0x2d, 0x2e, 0x39, 0x0e, 0x08, 0x13, 0x11, 0x04, 0x09, 0x05, 0x47, + 0x0f, 0x8a, 0xfc, 0x9c, 0x93, 0x04, 0x6b, 0x0c, 0x0e, 0x17, 0x09, 0x27, + 0xde, 0x6c, 0x82, 0xfe, 0x69, 0xeb, 0x13, 0x2c, 0x1d, 0x4c, 0x03, 0x32, + 0x12, 0x2e, 0x20, 0x4d, 0x02, 0xe1, 0x1e, 0x36, 0x4d, 0x2f, 0x28, 0x45, + 0x3e, 0x3a, 0x1e, 0xa5, 0x06, 0x08, 0x16, 0x14, 0x4d, 0x2b, 0x0d, 0x1c, + 0x0c, 0xdb, 0x19, 0x34, 0x35, 0x35, 0x1b, 0x33, 0x37, 0x30, 0x2a, 0x0e, + 0x10, 0x01, 0x01, 0x0c, 0x6a, 0x6a, 0x33, 0x01, 0xb8, 0x2b, 0x58, 0x09, + 0x0e, 0x38, 0xbe, 0xfd, 0x7a, 0x55, 0xfd, 0x76, 0x1f, 0x16, 0x05, 0x5c, + 0x1d, 0x20, 0x00, 0x04, 0x00, 0x44, 0x00, 0x00, 0x05, 0x7d, 0x05, 0xa0, + 0x00, 0x10, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x5e, 0x02, 0x61, 0x40, 0x26, + 0x12, 0x11, 0x5e, 0x5c, 0x59, 0x57, 0x54, 0x53, 0x47, 0x45, 0x41, 0x3f, + 0x3b, 0x3a, 0x39, 0x38, 0x30, 0x2e, 0x29, 0x27, 0x21, 0x1f, 0x11, 0x4e, + 0x12, 0x4e, 0x10, 0x0f, 0x0b, 0x09, 0x08, 0x07, 0x06, 0x04, 0x01, 0x00, + 0x11, 0x07, 0x2b, 0x4b, 0xb0, 0x43, 0x50, 0x58, 0x40, 0x5f, 0x4a, 0x01, + 0x0c, 0x0b, 0x18, 0x01, 0x09, 0x0a, 0x25, 0x01, 0x08, 0x07, 0x52, 0x01, + 0x00, 0x06, 0x04, 0x1e, 0x00, 0x0c, 0x0b, 0x0a, 0x0b, 0x0c, 0x0a, 0x32, + 0x00, 0x07, 0x09, 0x08, 0x09, 0x07, 0x08, 0x32, 0x00, 0x0a, 0x00, 0x09, + 0x07, 0x0a, 0x09, 0x01, 0x00, 0x26, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, + 0x06, 0x01, 0x00, 0x26, 0x0d, 0x01, 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, + 0x01, 0x01, 0x02, 0x26, 0x00, 0x0b, 0x0b, 0x05, 0x01, 0x00, 0x24, 0x0f, + 0x10, 0x02, 0x05, 0x05, 0x0b, 0x1f, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, + 0x24, 0x0e, 0x01, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x0a, 0x1b, 0x4b, 0xb0, + 0x5f, 0x50, 0x58, 0x40, 0x63, 0x4a, 0x01, 0x0c, 0x0b, 0x18, 0x01, 0x09, + 0x0a, 0x25, 0x01, 0x08, 0x07, 0x52, 0x01, 0x00, 0x06, 0x04, 0x1e, 0x00, + 0x0c, 0x0b, 0x0a, 0x0b, 0x0c, 0x0a, 0x32, 0x00, 0x07, 0x09, 0x08, 0x09, + 0x07, 0x08, 0x32, 0x00, 0x0a, 0x00, 0x09, 0x07, 0x0a, 0x09, 0x01, 0x00, + 0x26, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x06, 0x01, 0x00, 0x26, 0x0d, + 0x01, 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x02, 0x26, 0x00, + 0x0f, 0x0f, 0x0b, 0x1f, 0x00, 0x0b, 0x0b, 0x05, 0x01, 0x00, 0x24, 0x10, + 0x01, 0x05, 0x05, 0x0b, 0x1f, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, + 0x0e, 0x01, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x0b, 0x1b, 0x4b, 0xb0, 0x6c, + 0x50, 0x58, 0x40, 0x64, 0x4a, 0x01, 0x0c, 0x0b, 0x18, 0x01, 0x09, 0x0a, + 0x25, 0x01, 0x08, 0x07, 0x52, 0x01, 0x00, 0x06, 0x04, 0x1e, 0x00, 0x0f, + 0x05, 0x0b, 0x05, 0x0f, 0x0b, 0x32, 0x00, 0x0c, 0x0b, 0x0a, 0x0b, 0x0c, + 0x0a, 0x32, 0x00, 0x07, 0x09, 0x08, 0x09, 0x07, 0x08, 0x32, 0x10, 0x01, + 0x05, 0x00, 0x0b, 0x0c, 0x05, 0x0b, 0x01, 0x00, 0x26, 0x00, 0x0a, 0x00, + 0x09, 0x07, 0x0a, 0x09, 0x01, 0x00, 0x26, 0x00, 0x08, 0x00, 0x06, 0x00, + 0x08, 0x06, 0x01, 0x00, 0x26, 0x0d, 0x01, 0x00, 0x03, 0x01, 0x01, 0x02, + 0x00, 0x01, 0x01, 0x02, 0x26, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, + 0x0e, 0x01, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x0a, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x6d, 0x4a, 0x01, 0x0c, 0x0b, 0x18, 0x01, 0x09, 0x0a, + 0x25, 0x01, 0x08, 0x07, 0x52, 0x01, 0x00, 0x06, 0x04, 0x1e, 0x00, 0x0f, + 0x05, 0x0b, 0x05, 0x0f, 0x0b, 0x32, 0x00, 0x0c, 0x0b, 0x0a, 0x0b, 0x0c, + 0x0a, 0x32, 0x00, 0x07, 0x09, 0x08, 0x09, 0x07, 0x08, 0x32, 0x10, 0x01, + 0x05, 0x00, 0x0b, 0x0c, 0x05, 0x0b, 0x01, 0x00, 0x26, 0x00, 0x0a, 0x00, + 0x09, 0x07, 0x0a, 0x09, 0x01, 0x00, 0x26, 0x00, 0x04, 0x06, 0x02, 0x04, + 0x00, 0x00, 0x23, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x06, 0x01, 0x00, + 0x26, 0x0d, 0x01, 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x02, + 0x26, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, 0x0e, 0x01, 0x02, 0x04, + 0x02, 0x01, 0x00, 0x21, 0x0b, 0x1b, 0x40, 0x7c, 0x4a, 0x01, 0x0c, 0x0b, + 0x18, 0x01, 0x09, 0x0a, 0x25, 0x01, 0x08, 0x07, 0x52, 0x01, 0x00, 0x06, + 0x04, 0x1e, 0x00, 0x0f, 0x05, 0x0b, 0x05, 0x0f, 0x0b, 0x32, 0x00, 0x0c, + 0x0b, 0x0a, 0x0b, 0x0c, 0x0a, 0x32, 0x00, 0x07, 0x09, 0x08, 0x09, 0x07, + 0x08, 0x32, 0x00, 0x0e, 0x01, 0x02, 0x01, 0x0e, 0x02, 0x32, 0x10, 0x01, + 0x05, 0x00, 0x0b, 0x0c, 0x05, 0x0b, 0x01, 0x00, 0x26, 0x00, 0x0a, 0x00, + 0x09, 0x07, 0x0a, 0x09, 0x01, 0x00, 0x26, 0x00, 0x04, 0x06, 0x02, 0x04, + 0x00, 0x00, 0x23, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x06, 0x01, 0x00, + 0x26, 0x00, 0x0d, 0x00, 0x03, 0x01, 0x0d, 0x03, 0x01, 0x02, 0x26, 0x00, + 0x00, 0x00, 0x01, 0x0e, 0x00, 0x01, 0x01, 0x00, 0x26, 0x00, 0x04, 0x04, + 0x02, 0x00, 0x00, 0x24, 0x00, 0x02, 0x04, 0x02, 0x00, 0x00, 0x21, 0x0d, + 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x33, 0x15, 0x14, 0x06, + 0x2b, 0x01, 0x15, 0x23, 0x35, 0x21, 0x22, 0x26, 0x2f, 0x01, 0x01, 0x33, + 0x01, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x36, 0x33, 0x32, 0x17, 0x1e, + 0x03, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x35, 0x3e, + 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, + 0x26, 0x2f, 0x01, 0x3e, 0x03, 0x01, 0x34, 0x36, 0x37, 0x03, 0x33, 0x05, + 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x05, 0x10, 0x6d, + 0x0e, 0x0d, 0x52, 0x6d, 0xfe, 0xce, 0x12, 0x15, 0x02, 0x0a, 0x01, 0x56, + 0x7c, 0xfc, 0x42, 0x33, 0x52, 0x3b, 0x20, 0x77, 0x42, 0x45, 0x2a, 0x45, + 0x5b, 0x30, 0x39, 0x54, 0x3d, 0x2b, 0x0f, 0x37, 0x0f, 0x0e, 0x1d, 0x0b, + 0x06, 0x12, 0x1e, 0x2b, 0x20, 0x1f, 0x2f, 0x20, 0x10, 0x11, 0x27, 0x41, + 0x2f, 0x57, 0x47, 0x3a, 0x30, 0x30, 0x39, 0x0c, 0x08, 0x11, 0x0f, 0x04, + 0x09, 0x05, 0x43, 0x07, 0x2c, 0x41, 0x54, 0x03, 0x82, 0x02, 0x03, 0xf1, + 0xec, 0xfd, 0x14, 0x13, 0x2c, 0x1d, 0x4c, 0x03, 0x32, 0x12, 0x2e, 0x20, + 0x4d, 0x01, 0x0b, 0x41, 0x0b, 0x0f, 0xb0, 0xb0, 0x10, 0x0c, 0x39, 0x01, + 0xd4, 0x02, 0xc7, 0x1d, 0x33, 0x44, 0x28, 0x80, 0x2d, 0x13, 0x4e, 0x3e, + 0x37, 0x54, 0x39, 0x1d, 0x19, 0x31, 0x48, 0x2f, 0x18, 0x06, 0x17, 0x0d, + 0x20, 0x1c, 0x13, 0x14, 0x1f, 0x28, 0x15, 0x1e, 0x2b, 0x1c, 0x0e, 0x57, + 0x01, 0x3c, 0x34, 0x32, 0x34, 0x2f, 0x28, 0x10, 0x0f, 0x01, 0x01, 0x0c, + 0x35, 0x4f, 0x35, 0x1b, 0xfc, 0x5c, 0x13, 0x2c, 0x17, 0xfe, 0xb9, 0xd6, + 0x1f, 0x16, 0x05, 0x5c, 0x1d, 0x20, 0x00, 0x02, 0x00, 0x2c, 0xfe, 0x9c, + 0x03, 0x02, 0x04, 0x05, 0x00, 0x29, 0x00, 0x3d, 0x00, 0xc5, 0x40, 0x0e, + 0x3a, 0x38, 0x30, 0x2e, 0x27, 0x25, 0x22, 0x20, 0x13, 0x12, 0x06, 0x04, + 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, 0x33, 0x14, 0x01, + 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x02, 0x1e, 0x00, 0x01, 0x05, 0x03, + 0x05, 0x01, 0x03, 0x32, 0x00, 0x03, 0x02, 0x05, 0x03, 0x02, 0x30, 0x00, + 0x05, 0x05, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x04, 0x14, 0x1f, 0x00, + 0x02, 0x02, 0x00, 0x01, 0x02, 0x24, 0x00, 0x00, 0x00, 0x16, 0x00, 0x20, + 0x07, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x30, 0x14, 0x01, 0x03, + 0x01, 0x00, 0x01, 0x00, 0x02, 0x02, 0x1e, 0x00, 0x01, 0x05, 0x03, 0x05, + 0x01, 0x03, 0x32, 0x00, 0x03, 0x02, 0x05, 0x03, 0x02, 0x30, 0x00, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x25, 0x00, 0x05, 0x05, 0x04, 0x01, + 0x00, 0x24, 0x00, 0x04, 0x04, 0x14, 0x05, 0x20, 0x06, 0x1b, 0x40, 0x3a, + 0x14, 0x01, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x02, 0x1e, 0x00, 0x01, + 0x05, 0x03, 0x05, 0x01, 0x03, 0x32, 0x00, 0x03, 0x02, 0x05, 0x03, 0x02, + 0x30, 0x00, 0x04, 0x00, 0x05, 0x01, 0x04, 0x05, 0x01, 0x00, 0x26, 0x00, + 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x00, 0x01, + 0x02, 0x24, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x21, 0x07, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x05, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x3e, 0x04, 0x3f, 0x01, 0x33, 0x17, 0x15, 0x14, 0x0e, 0x04, 0x15, 0x14, + 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x01, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x2e, 0x02, 0x03, 0x02, 0x1f, 0x4b, 0x58, 0x68, 0x3c, 0x4f, 0x87, 0x62, + 0x38, 0x2d, 0x45, 0x52, 0x47, 0x33, 0x04, 0x12, 0x7a, 0x0c, 0x2d, 0x45, + 0x4f, 0x45, 0x2d, 0x22, 0x3a, 0x4f, 0x2d, 0x3d, 0x57, 0x3c, 0x26, 0x0c, + 0x0e, 0x11, 0x07, 0xfe, 0x71, 0x13, 0x21, 0x2e, 0x1a, 0x1a, 0x2e, 0x22, + 0x13, 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, 0x21, 0x13, 0xd4, 0x1d, 0x34, + 0x28, 0x17, 0x2c, 0x52, 0x76, 0x4b, 0x4c, 0x6a, 0x4c, 0x36, 0x30, 0x31, + 0x21, 0x9a, 0xa7, 0x0c, 0x2c, 0x3e, 0x32, 0x2f, 0x3c, 0x50, 0x3b, 0x2c, + 0x45, 0x31, 0x1a, 0x1e, 0x24, 0x1e, 0x0c, 0x0b, 0x04, 0x10, 0x1a, 0x2e, + 0x22, 0x14, 0x14, 0x22, 0x2e, 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, + 0x2d, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x00, 0x05, 0x49, 0x06, 0xf6, + 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x08, 0x01, 0x6b, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x00, 0x05, 0x49, 0x06, 0xf6, + 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x0b, 0x01, 0x6b, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x00, 0x05, 0x49, 0x06, 0xdc, + 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x0c, 0x01, 0x76, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x00, 0x05, 0x49, 0x06, 0xd2, + 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x11, 0x01, 0x76, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x00, 0x05, 0x49, 0x06, 0xf2, + 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x09, 0x01, 0x76, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x00, 0x05, 0x49, 0x07, 0x2d, + 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x73, + 0x00, 0x00, 0x00, 0x02, 0xff, 0xe8, 0x00, 0x00, 0x06, 0xda, 0x05, 0x99, + 0x00, 0x12, 0x00, 0x18, 0x01, 0x1e, 0x40, 0x14, 0x14, 0x13, 0x12, 0x10, + 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, + 0x01, 0x00, 0x09, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x35, + 0x15, 0x01, 0x01, 0x00, 0x01, 0x1e, 0x00, 0x02, 0x00, 0x03, 0x08, 0x02, + 0x03, 0x00, 0x00, 0x26, 0x00, 0x08, 0x00, 0x06, 0x04, 0x08, 0x06, 0x00, + 0x00, 0x26, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x0b, 0x1f, 0x00, 0x04, 0x04, 0x05, 0x01, 0x00, 0x24, 0x07, 0x01, 0x05, + 0x05, 0x0c, 0x05, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, + 0x33, 0x15, 0x01, 0x01, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x01, 0x00, 0x00, 0x26, 0x00, 0x02, 0x00, 0x03, 0x08, 0x02, 0x03, + 0x00, 0x00, 0x26, 0x00, 0x08, 0x00, 0x06, 0x04, 0x08, 0x06, 0x00, 0x00, + 0x26, 0x00, 0x04, 0x04, 0x05, 0x01, 0x00, 0x24, 0x07, 0x01, 0x05, 0x05, + 0x0f, 0x05, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x3c, + 0x15, 0x01, 0x01, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x26, 0x00, 0x02, 0x00, 0x03, 0x08, 0x02, 0x03, 0x00, + 0x00, 0x26, 0x00, 0x08, 0x00, 0x06, 0x04, 0x08, 0x06, 0x00, 0x00, 0x26, + 0x00, 0x04, 0x05, 0x05, 0x04, 0x00, 0x00, 0x23, 0x00, 0x04, 0x04, 0x05, + 0x01, 0x00, 0x24, 0x07, 0x01, 0x05, 0x04, 0x05, 0x01, 0x00, 0x21, 0x07, + 0x1b, 0x40, 0x43, 0x15, 0x01, 0x01, 0x00, 0x01, 0x1e, 0x00, 0x07, 0x04, + 0x05, 0x04, 0x07, 0x05, 0x32, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x26, 0x00, 0x02, 0x00, 0x03, 0x08, 0x02, 0x03, 0x00, 0x00, + 0x26, 0x00, 0x08, 0x00, 0x06, 0x04, 0x08, 0x06, 0x00, 0x00, 0x26, 0x00, + 0x04, 0x07, 0x05, 0x04, 0x00, 0x00, 0x23, 0x00, 0x04, 0x04, 0x05, 0x00, + 0x00, 0x24, 0x00, 0x05, 0x04, 0x05, 0x00, 0x00, 0x21, 0x08, 0x59, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x21, 0x15, 0x21, 0x13, 0x21, 0x15, 0x21, + 0x13, 0x21, 0x15, 0x21, 0x03, 0x21, 0x03, 0x0e, 0x01, 0x2b, 0x01, 0x01, + 0x21, 0x03, 0x0e, 0x01, 0x07, 0x02, 0xdd, 0x03, 0xfd, 0xfd, 0x13, 0x3c, + 0x02, 0x2f, 0xfd, 0xe4, 0x3d, 0x02, 0x61, 0xfc, 0xfc, 0x31, 0xfd, 0xd4, + 0xb3, 0x0b, 0x25, 0x1a, 0x94, 0x01, 0xda, 0x01, 0xd1, 0x5e, 0x0c, 0x1d, + 0x0e, 0x05, 0x99, 0x9e, 0xfe, 0x24, 0x98, 0xfe, 0x17, 0x9e, 0x01, 0x88, + 0xfe, 0xa5, 0x14, 0x19, 0x02, 0x14, 0x02, 0xf1, 0x29, 0x45, 0x1f, 0x00, + 0x00, 0x01, 0x00, 0x5a, 0xfe, 0xa1, 0x05, 0x09, 0x05, 0xa9, 0x00, 0x4b, + 0x02, 0x7c, 0x40, 0x18, 0x01, 0x00, 0x47, 0x45, 0x3d, 0x3c, 0x38, 0x36, + 0x31, 0x2f, 0x27, 0x25, 0x20, 0x1e, 0x19, 0x17, 0x06, 0x04, 0x00, 0x4b, + 0x01, 0x4b, 0x0a, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, 0x40, 0x4b, + 0x1b, 0x01, 0x03, 0x04, 0x3a, 0x01, 0x05, 0x06, 0x3e, 0x0e, 0x0d, 0x03, + 0x00, 0x07, 0x49, 0x01, 0x08, 0x00, 0x04, 0x1e, 0x00, 0x03, 0x04, 0x06, + 0x04, 0x03, 0x06, 0x32, 0x00, 0x06, 0x05, 0x04, 0x06, 0x05, 0x30, 0x00, + 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, + 0x05, 0x05, 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x07, 0x15, 0x1f, 0x01, + 0x09, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x24, 0x00, 0x08, 0x08, 0x10, + 0x08, 0x20, 0x09, 0x1b, 0x4b, 0xb0, 0x0d, 0x50, 0x58, 0x40, 0x4b, 0x1b, + 0x01, 0x03, 0x04, 0x3a, 0x01, 0x05, 0x06, 0x3e, 0x0e, 0x0d, 0x03, 0x00, + 0x07, 0x49, 0x01, 0x08, 0x00, 0x04, 0x1e, 0x00, 0x03, 0x04, 0x06, 0x04, + 0x03, 0x06, 0x32, 0x00, 0x06, 0x05, 0x04, 0x06, 0x05, 0x30, 0x00, 0x04, + 0x04, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x05, + 0x05, 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x07, 0x12, 0x1f, 0x01, 0x09, + 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x24, 0x00, 0x08, 0x08, 0x10, 0x08, + 0x20, 0x09, 0x1b, 0x4b, 0xb0, 0x15, 0x50, 0x58, 0x40, 0x4b, 0x1b, 0x01, + 0x03, 0x04, 0x3a, 0x01, 0x05, 0x06, 0x3e, 0x0e, 0x0d, 0x03, 0x00, 0x07, + 0x49, 0x01, 0x08, 0x00, 0x04, 0x1e, 0x00, 0x03, 0x04, 0x06, 0x04, 0x03, + 0x06, 0x32, 0x00, 0x06, 0x05, 0x04, 0x06, 0x05, 0x30, 0x00, 0x04, 0x04, + 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x05, 0x05, + 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x07, 0x15, 0x1f, 0x01, 0x09, 0x02, + 0x00, 0x00, 0x08, 0x01, 0x00, 0x24, 0x00, 0x08, 0x08, 0x10, 0x08, 0x20, + 0x09, 0x1b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, 0x52, 0x1b, 0x01, 0x03, + 0x04, 0x3a, 0x01, 0x05, 0x06, 0x3e, 0x0e, 0x0d, 0x03, 0x00, 0x07, 0x49, + 0x01, 0x08, 0x01, 0x04, 0x1e, 0x00, 0x03, 0x04, 0x06, 0x04, 0x03, 0x06, + 0x32, 0x00, 0x06, 0x05, 0x04, 0x06, 0x05, 0x30, 0x09, 0x01, 0x00, 0x07, + 0x01, 0x07, 0x00, 0x01, 0x32, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, + 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x05, 0x05, 0x07, 0x01, 0x00, 0x24, + 0x00, 0x07, 0x07, 0x15, 0x1f, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x24, + 0x00, 0x08, 0x08, 0x10, 0x08, 0x20, 0x0a, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, + 0x58, 0x40, 0x4f, 0x1b, 0x01, 0x03, 0x04, 0x3a, 0x01, 0x05, 0x06, 0x3e, + 0x0e, 0x0d, 0x03, 0x00, 0x07, 0x49, 0x01, 0x08, 0x01, 0x04, 0x1e, 0x00, + 0x03, 0x04, 0x06, 0x04, 0x03, 0x06, 0x32, 0x00, 0x06, 0x05, 0x04, 0x06, + 0x05, 0x30, 0x09, 0x01, 0x00, 0x07, 0x01, 0x07, 0x00, 0x01, 0x32, 0x00, + 0x01, 0x00, 0x08, 0x01, 0x08, 0x01, 0x00, 0x25, 0x00, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x05, 0x05, 0x07, + 0x01, 0x00, 0x24, 0x00, 0x07, 0x07, 0x15, 0x07, 0x20, 0x09, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x4d, 0x1b, 0x01, 0x03, 0x04, 0x3a, 0x01, + 0x05, 0x06, 0x3e, 0x0e, 0x0d, 0x03, 0x00, 0x07, 0x49, 0x01, 0x08, 0x01, + 0x04, 0x1e, 0x00, 0x03, 0x04, 0x06, 0x04, 0x03, 0x06, 0x32, 0x00, 0x06, + 0x05, 0x04, 0x06, 0x05, 0x30, 0x09, 0x01, 0x00, 0x07, 0x01, 0x07, 0x00, + 0x01, 0x32, 0x00, 0x02, 0x00, 0x04, 0x03, 0x02, 0x04, 0x01, 0x00, 0x26, + 0x00, 0x01, 0x00, 0x08, 0x01, 0x08, 0x01, 0x00, 0x25, 0x00, 0x05, 0x05, + 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x07, 0x15, 0x07, 0x20, 0x08, 0x1b, + 0x40, 0x57, 0x1b, 0x01, 0x03, 0x04, 0x3a, 0x01, 0x05, 0x06, 0x3e, 0x0e, + 0x0d, 0x03, 0x00, 0x07, 0x49, 0x01, 0x08, 0x01, 0x04, 0x1e, 0x00, 0x03, + 0x04, 0x06, 0x04, 0x03, 0x06, 0x32, 0x00, 0x06, 0x05, 0x04, 0x06, 0x05, + 0x30, 0x09, 0x01, 0x00, 0x07, 0x01, 0x07, 0x00, 0x01, 0x32, 0x00, 0x02, + 0x00, 0x04, 0x03, 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x07, + 0x00, 0x05, 0x07, 0x01, 0x00, 0x26, 0x00, 0x01, 0x08, 0x08, 0x01, 0x01, + 0x00, 0x23, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x24, 0x00, 0x08, 0x01, + 0x08, 0x01, 0x00, 0x21, 0x09, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x05, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, + 0x02, 0x27, 0x37, 0x2e, 0x02, 0x02, 0x35, 0x34, 0x12, 0x36, 0x24, 0x33, + 0x32, 0x16, 0x17, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x04, 0x23, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x36, + 0x33, 0x32, 0x1f, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x1e, 0x01, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x36, 0x02, 0x83, 0x06, 0x10, + 0x16, 0x20, 0x15, 0x2a, 0x2b, 0x16, 0x29, 0x3c, 0x26, 0x24, 0x8b, 0xe2, + 0x9f, 0x56, 0x69, 0xbe, 0x01, 0x09, 0xa0, 0x9e, 0xe5, 0x59, 0x3f, 0x07, + 0x12, 0x11, 0x0d, 0x1d, 0x28, 0x36, 0x4a, 0x62, 0x40, 0x73, 0xbf, 0x8a, + 0x4d, 0x4d, 0x85, 0xb6, 0x69, 0x40, 0x66, 0x57, 0x4b, 0x26, 0x11, 0x10, + 0x10, 0x0d, 0x4c, 0x53, 0xe9, 0xa2, 0x10, 0x5a, 0x51, 0x20, 0x39, 0x50, + 0x30, 0x29, 0x4a, 0x1f, 0x11, 0x06, 0xf7, 0x07, 0x09, 0x07, 0x21, 0x1a, + 0x13, 0x1a, 0x12, 0x0c, 0x05, 0x76, 0x0c, 0x75, 0xbf, 0x01, 0x00, 0x99, + 0xa2, 0x01, 0x0e, 0xc2, 0x6b, 0x62, 0x54, 0x59, 0x0a, 0x0d, 0x13, 0x1c, + 0x20, 0x1c, 0x13, 0x4f, 0x92, 0xd2, 0x82, 0x86, 0xd2, 0x91, 0x4c, 0x0f, + 0x20, 0x31, 0x22, 0x0f, 0x0d, 0x53, 0x61, 0x70, 0x06, 0x37, 0x14, 0x45, + 0x36, 0x20, 0x33, 0x24, 0x13, 0x11, 0x0e, 0x37, 0x12, 0x00, 0xff, 0xff, + 0x00, 0xae, 0x00, 0x00, 0x04, 0x21, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x28, + 0x00, 0x00, 0x00, 0x07, 0x01, 0x08, 0x01, 0x37, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xae, 0x00, 0x00, 0x04, 0x21, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x28, + 0x00, 0x00, 0x00, 0x07, 0x01, 0x0b, 0x01, 0x37, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xae, 0x00, 0x00, 0x04, 0x21, 0x06, 0xdc, 0x02, 0x26, 0x00, 0x28, + 0x00, 0x00, 0x00, 0x07, 0x01, 0x0c, 0x01, 0x42, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xae, 0x00, 0x00, 0x04, 0x21, 0x06, 0xf2, 0x02, 0x26, 0x00, 0x28, + 0x00, 0x00, 0x00, 0x07, 0x01, 0x09, 0x01, 0x42, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xcc, 0x00, 0x00, 0x01, 0xbc, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x2c, + 0x00, 0x00, 0x00, 0x06, 0x01, 0x08, 0xf8, 0x00, 0xff, 0xff, 0x00, 0x9a, + 0x00, 0x00, 0x02, 0x8a, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x06, 0x01, 0x0b, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xef, 0x00, 0x00, + 0x02, 0x7b, 0x06, 0xdc, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x06, + 0x01, 0x0c, 0x03, 0x00, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x02, 0x78, + 0x06, 0xf2, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x06, 0x01, 0x09, + 0x02, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x05, 0xd1, 0x05, 0x99, + 0x00, 0x10, 0x00, 0x21, 0x00, 0xe1, 0x40, 0x12, 0x1e, 0x1c, 0x1b, 0x1a, + 0x19, 0x18, 0x17, 0x15, 0x10, 0x0f, 0x0e, 0x0c, 0x04, 0x02, 0x01, 0x00, + 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x26, 0x05, 0x01, + 0x00, 0x06, 0x01, 0x03, 0x07, 0x00, 0x03, 0x00, 0x00, 0x26, 0x00, 0x04, + 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0b, 0x1f, 0x00, 0x07, + 0x07, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x05, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x24, 0x00, 0x01, 0x00, 0x04, + 0x00, 0x01, 0x04, 0x01, 0x00, 0x26, 0x05, 0x01, 0x00, 0x06, 0x01, 0x03, + 0x07, 0x00, 0x03, 0x00, 0x00, 0x26, 0x00, 0x07, 0x07, 0x02, 0x01, 0x00, + 0x24, 0x00, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x2d, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x04, 0x01, + 0x00, 0x26, 0x05, 0x01, 0x00, 0x06, 0x01, 0x03, 0x07, 0x00, 0x03, 0x00, + 0x00, 0x26, 0x00, 0x07, 0x02, 0x02, 0x07, 0x01, 0x00, 0x23, 0x00, 0x07, + 0x07, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x07, 0x02, 0x01, 0x00, 0x21, + 0x05, 0x1b, 0x40, 0x35, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x04, 0x01, + 0x00, 0x26, 0x00, 0x05, 0x00, 0x06, 0x03, 0x05, 0x06, 0x00, 0x00, 0x26, + 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x03, 0x00, 0x00, 0x26, 0x00, 0x07, + 0x02, 0x02, 0x07, 0x01, 0x00, 0x23, 0x00, 0x07, 0x07, 0x02, 0x01, 0x00, + 0x24, 0x00, 0x02, 0x07, 0x02, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x13, 0x33, 0x11, 0x21, 0x32, 0x04, 0x16, 0x12, 0x15, + 0x14, 0x02, 0x06, 0x04, 0x23, 0x21, 0x11, 0x23, 0x25, 0x34, 0x2e, 0x02, + 0x23, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x32, 0x3e, 0x02, 0x32, + 0xc5, 0x02, 0x17, 0x9e, 0x01, 0x05, 0xba, 0x66, 0x66, 0xba, 0xfe, 0xfb, + 0x9e, 0xfd, 0xe9, 0xc5, 0x04, 0xd8, 0x48, 0x84, 0xbc, 0x74, 0xfe, 0xab, + 0x01, 0x7d, 0xfe, 0x83, 0x01, 0x55, 0x74, 0xbc, 0x84, 0x48, 0x03, 0x0c, + 0x02, 0x8d, 0x67, 0xbd, 0xfe, 0xf8, 0xa1, 0xa1, 0xfe, 0xf8, 0xbc, 0x67, + 0x02, 0x9a, 0x32, 0x84, 0xd0, 0x90, 0x4c, 0xfe, 0x10, 0x72, 0xfe, 0x03, + 0x4c, 0x8f, 0xd0, 0x00, 0xff, 0xff, 0x00, 0xae, 0x00, 0x00, 0x05, 0x38, + 0x06, 0xd2, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x00, 0x07, 0x01, 0x11, + 0x01, 0xda, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf1, 0x05, 0xe1, + 0x06, 0xf6, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x01, 0x08, + 0x01, 0xe3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf1, 0x05, 0xe1, + 0x06, 0xf6, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x01, 0x0b, + 0x01, 0xe3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf1, 0x05, 0xe1, + 0x06, 0xdc, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x01, 0x0c, + 0x01, 0xee, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf1, 0x05, 0xe1, + 0x06, 0xd2, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x01, 0x11, + 0x01, 0xee, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf1, 0x05, 0xe1, + 0x06, 0xf2, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x01, 0x09, + 0x01, 0xee, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7e, 0x00, 0xdb, 0x04, 0x03, + 0x04, 0x58, 0x00, 0x0b, 0x00, 0x07, 0x40, 0x04, 0x09, 0x05, 0x01, 0x0b, + 0x2b, 0x09, 0x02, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01, 0x37, 0x09, 0x01, + 0x03, 0xf9, 0xfe, 0xa8, 0x01, 0x62, 0x5f, 0xfe, 0x9e, 0xfe, 0x9b, 0x5f, + 0x01, 0x64, 0xfe, 0xa7, 0x5f, 0x01, 0x59, 0x01, 0x58, 0x03, 0xf6, 0xfe, + 0xa8, 0xfe, 0x9f, 0x60, 0x01, 0x62, 0xfe, 0x9c, 0x60, 0x01, 0x64, 0x01, + 0x59, 0x60, 0xfe, 0xa6, 0x01, 0x58, 0x00, 0x03, 0x00, 0x5c, 0xff, 0x93, + 0x05, 0xe1, 0x05, 0xda, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x38, 0x01, 0x12, + 0x40, 0x0e, 0x35, 0x33, 0x2a, 0x28, 0x1e, 0x1c, 0x17, 0x15, 0x0d, 0x0b, + 0x06, 0x04, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x1e, 0x50, 0x58, 0x40, 0x37, + 0x19, 0x01, 0x04, 0x02, 0x32, 0x31, 0x26, 0x25, 0x1f, 0x05, 0x05, 0x04, + 0x0e, 0x08, 0x02, 0x00, 0x05, 0x03, 0x1e, 0x00, 0x01, 0x00, 0x01, 0x35, + 0x00, 0x03, 0x03, 0x0d, 0x1f, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, + 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x05, 0x05, 0x00, 0x01, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, + 0x58, 0x40, 0x37, 0x19, 0x01, 0x04, 0x02, 0x32, 0x31, 0x26, 0x25, 0x1f, + 0x05, 0x05, 0x04, 0x0e, 0x08, 0x02, 0x00, 0x05, 0x03, 0x1e, 0x00, 0x03, + 0x02, 0x03, 0x34, 0x00, 0x01, 0x00, 0x01, 0x35, 0x00, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x05, 0x05, 0x00, + 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x12, 0x00, 0x20, 0x07, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x35, 0x19, 0x01, 0x04, 0x02, 0x32, 0x31, + 0x26, 0x25, 0x1f, 0x05, 0x05, 0x04, 0x0e, 0x08, 0x02, 0x00, 0x05, 0x03, + 0x1e, 0x00, 0x03, 0x02, 0x03, 0x34, 0x00, 0x01, 0x00, 0x01, 0x35, 0x00, + 0x02, 0x00, 0x04, 0x05, 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, + 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x15, 0x00, 0x20, 0x06, 0x1b, + 0x40, 0x3e, 0x19, 0x01, 0x04, 0x02, 0x32, 0x31, 0x26, 0x25, 0x1f, 0x05, + 0x05, 0x04, 0x0e, 0x08, 0x02, 0x00, 0x05, 0x03, 0x1e, 0x00, 0x03, 0x02, + 0x03, 0x34, 0x00, 0x01, 0x00, 0x01, 0x35, 0x00, 0x02, 0x00, 0x04, 0x05, + 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x00, 0x05, 0x01, 0x00, + 0x23, 0x00, 0x05, 0x05, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x05, 0x00, + 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x14, + 0x02, 0x06, 0x04, 0x23, 0x22, 0x26, 0x27, 0x07, 0x0e, 0x01, 0x2b, 0x01, + 0x13, 0x26, 0x02, 0x35, 0x34, 0x12, 0x36, 0x24, 0x33, 0x32, 0x16, 0x17, + 0x37, 0x3e, 0x01, 0x3b, 0x01, 0x07, 0x16, 0x12, 0x05, 0x14, 0x16, 0x17, + 0x01, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x02, 0x05, 0x34, 0x26, 0x27, 0x01, + 0x16, 0x33, 0x32, 0x3e, 0x02, 0x05, 0xe1, 0x66, 0xba, 0xfe, 0xfb, 0x9e, + 0x6c, 0xbc, 0x4f, 0x64, 0x16, 0x3a, 0x1d, 0x4e, 0xbf, 0x70, 0x7b, 0x66, + 0xba, 0x01, 0x04, 0x9e, 0x73, 0xc8, 0x53, 0x52, 0x14, 0x20, 0x20, 0x64, + 0xac, 0x67, 0x70, 0xfb, 0x41, 0x4b, 0x45, 0x02, 0x93, 0x3c, 0x94, 0x57, + 0x73, 0xbc, 0x85, 0x48, 0x03, 0xf8, 0x41, 0x3c, 0xfd, 0x71, 0x74, 0x9c, + 0x74, 0xbc, 0x84, 0x48, 0x02, 0xcc, 0xa1, 0xfe, 0xf3, 0xc2, 0x6b, 0x31, + 0x30, 0x88, 0x1d, 0x1a, 0x01, 0x04, 0x62, 0x01, 0x20, 0xb3, 0xa1, 0x01, + 0x0d, 0xc3, 0x6c, 0x3a, 0x36, 0x6f, 0x1b, 0x17, 0xeb, 0x62, 0xfe, 0xea, + 0xab, 0x87, 0xd3, 0x49, 0x03, 0x83, 0x2a, 0x2b, 0x4e, 0x91, 0xd2, 0x84, + 0x7e, 0xc9, 0x48, 0xfc, 0x84, 0x46, 0x4d, 0x91, 0xd1, 0x00, 0xff, 0xff, + 0x00, 0xa0, 0xff, 0xef, 0x05, 0x15, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x07, 0x01, 0x08, 0x01, 0x9d, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xa0, 0xff, 0xef, 0x05, 0x15, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x07, 0x01, 0x0b, 0x01, 0x9d, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xa0, 0xff, 0xef, 0x05, 0x15, 0x06, 0xdc, 0x02, 0x26, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x07, 0x01, 0x0c, 0x01, 0xa8, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xa0, 0xff, 0xef, 0x05, 0x15, 0x06, 0xf2, 0x02, 0x26, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x07, 0x01, 0x09, 0x01, 0xa8, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x08, 0x00, 0x00, 0x04, 0xe4, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x07, 0x01, 0x0b, 0x01, 0x39, 0x00, 0x00, 0x00, 0x02, + 0x00, 0xc2, 0x00, 0x00, 0x04, 0x7f, 0x05, 0x99, 0x00, 0x10, 0x00, 0x1b, + 0x00, 0x9c, 0x40, 0x12, 0x00, 0x00, 0x1b, 0x19, 0x13, 0x11, 0x00, 0x10, + 0x00, 0x0f, 0x07, 0x05, 0x04, 0x03, 0x02, 0x01, 0x07, 0x07, 0x2b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x21, 0x00, 0x02, 0x00, 0x05, 0x04, 0x02, + 0x05, 0x01, 0x00, 0x26, 0x00, 0x04, 0x06, 0x01, 0x03, 0x00, 0x04, 0x03, + 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x0b, 0x1f, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x23, 0x00, + 0x02, 0x00, 0x05, 0x04, 0x02, 0x05, 0x01, 0x00, 0x26, 0x00, 0x04, 0x06, + 0x01, 0x03, 0x00, 0x04, 0x03, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x04, 0x1b, 0x40, + 0x2c, 0x00, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x23, 0x00, 0x02, 0x00, + 0x05, 0x04, 0x02, 0x05, 0x01, 0x00, 0x26, 0x00, 0x04, 0x06, 0x01, 0x03, + 0x00, 0x04, 0x03, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x21, 0x05, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x27, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x26, 0x2b, 0x01, 0x01, 0x83, 0xc1, 0xc1, 0xe6, 0x88, 0xc9, 0x84, 0x41, + 0x46, 0x87, 0xc8, 0x81, 0xe6, 0xe6, 0x53, 0x7f, 0x56, 0x2c, 0xa9, 0xab, + 0xe6, 0x01, 0x10, 0xfe, 0xf0, 0x05, 0x99, 0xfe, 0xf8, 0x3f, 0x74, 0xa4, + 0x65, 0x64, 0xa6, 0x78, 0x43, 0x9a, 0x2c, 0x4f, 0x6e, 0x42, 0x89, 0x9a, + 0x00, 0x01, 0x00, 0xba, 0xff, 0xf0, 0x04, 0x76, 0x05, 0xae, 0x00, 0x48, + 0x00, 0xf1, 0x40, 0x12, 0x01, 0x00, 0x43, 0x42, 0x3d, 0x3b, 0x25, 0x23, + 0x20, 0x1e, 0x19, 0x17, 0x00, 0x48, 0x01, 0x48, 0x07, 0x07, 0x2b, 0x4b, + 0xb0, 0x1e, 0x50, 0x58, 0x40, 0x2a, 0x1b, 0x01, 0x01, 0x03, 0x01, 0x1e, + 0x00, 0x02, 0x04, 0x03, 0x04, 0x02, 0x03, 0x32, 0x00, 0x04, 0x04, 0x00, + 0x01, 0x00, 0x24, 0x06, 0x01, 0x00, 0x00, 0x11, 0x1f, 0x00, 0x03, 0x03, + 0x01, 0x01, 0x00, 0x24, 0x05, 0x01, 0x01, 0x01, 0x12, 0x01, 0x20, 0x06, + 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2e, 0x1b, 0x01, 0x05, 0x03, + 0x01, 0x1e, 0x00, 0x02, 0x04, 0x03, 0x04, 0x02, 0x03, 0x32, 0x00, 0x04, + 0x04, 0x00, 0x01, 0x00, 0x24, 0x06, 0x01, 0x00, 0x00, 0x11, 0x1f, 0x00, + 0x05, 0x05, 0x0c, 0x1f, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x12, 0x01, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x2c, 0x1b, 0x01, 0x05, 0x03, 0x01, 0x1e, 0x00, 0x02, 0x04, 0x03, + 0x04, 0x02, 0x03, 0x32, 0x06, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, 0x0f, 0x1f, 0x00, 0x03, 0x03, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x15, 0x01, 0x20, 0x06, 0x1b, 0x40, + 0x38, 0x1b, 0x01, 0x05, 0x03, 0x01, 0x1e, 0x00, 0x02, 0x04, 0x03, 0x04, + 0x02, 0x03, 0x32, 0x00, 0x05, 0x03, 0x01, 0x03, 0x05, 0x01, 0x32, 0x06, + 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x01, 0x00, 0x26, 0x00, 0x03, + 0x05, 0x01, 0x03, 0x01, 0x00, 0x23, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x03, 0x01, 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x04, 0x15, + 0x14, 0x1e, 0x04, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x2e, 0x04, 0x35, 0x34, 0x3e, 0x04, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x0e, 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x3e, 0x02, 0x02, 0xa1, 0x67, + 0x97, 0x62, 0x2f, 0x2b, 0x40, 0x4b, 0x40, 0x2b, 0x35, 0x50, 0x5d, 0x50, + 0x35, 0x39, 0x64, 0x87, 0x4f, 0x61, 0x9e, 0x3c, 0x29, 0x08, 0x17, 0x11, + 0x12, 0x28, 0x37, 0x4b, 0x35, 0x2c, 0x46, 0x31, 0x1a, 0x38, 0x54, 0x62, + 0x54, 0x38, 0x2d, 0x43, 0x4e, 0x43, 0x2d, 0x19, 0x38, 0x59, 0x3f, 0x44, + 0x6f, 0x4f, 0x2b, 0xb3, 0x45, 0x80, 0xb4, 0x05, 0xae, 0x3c, 0x5d, 0x6e, + 0x33, 0x3c, 0x56, 0x42, 0x32, 0x30, 0x33, 0x20, 0x27, 0x34, 0x2d, 0x2f, + 0x46, 0x66, 0x4e, 0x4e, 0x7a, 0x55, 0x2d, 0x45, 0x36, 0x44, 0x0d, 0x0e, + 0x1c, 0x22, 0x1c, 0x1b, 0x2e, 0x40, 0x25, 0x38, 0x46, 0x33, 0x2a, 0x3a, + 0x53, 0x42, 0x35, 0x4f, 0x3f, 0x36, 0x3c, 0x47, 0x30, 0x20, 0x41, 0x34, + 0x21, 0x2a, 0x54, 0x7e, 0x54, 0xfc, 0x26, 0x03, 0xe0, 0x68, 0xaa, 0x7a, + 0x42, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf0, 0x03, 0x7a, 0x05, 0xa9, + 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x00, 0x43, 0x00, 0xdd, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf0, 0x03, 0x7a, 0x05, 0xa9, + 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x00, 0x76, 0x00, 0xdd, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf0, 0x03, 0x7a, 0x05, 0x99, + 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x00, 0xdb, 0x00, 0xdd, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf0, 0x03, 0x7a, 0x05, 0x89, + 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x00, 0xe2, 0x00, 0xdd, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf0, 0x03, 0x7a, 0x05, 0x7b, + 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0xdd, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xf0, 0x03, 0x7a, 0x05, 0xde, + 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x00, 0xe0, 0x00, 0xde, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x5c, 0xff, 0xf0, 0x06, 0x0f, 0x04, 0x07, + 0x00, 0x43, 0x00, 0x51, 0x00, 0x5c, 0x03, 0xa2, 0x40, 0x26, 0x53, 0x52, + 0x01, 0x00, 0x58, 0x57, 0x52, 0x5c, 0x53, 0x5c, 0x4d, 0x4b, 0x45, 0x44, + 0x3f, 0x3d, 0x38, 0x36, 0x33, 0x31, 0x2e, 0x2d, 0x25, 0x23, 0x1d, 0x1b, + 0x14, 0x12, 0x0f, 0x0d, 0x09, 0x07, 0x00, 0x43, 0x01, 0x43, 0x10, 0x07, + 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, 0x40, 0x48, 0x41, 0x3b, 0x02, 0x08, + 0x07, 0x1f, 0x17, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x08, 0x07, 0x06, + 0x07, 0x08, 0x06, 0x32, 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, + 0x0d, 0x01, 0x06, 0x0a, 0x01, 0x01, 0x03, 0x06, 0x01, 0x01, 0x00, 0x26, + 0x0f, 0x0c, 0x02, 0x07, 0x07, 0x00, 0x01, 0x00, 0x24, 0x09, 0x0e, 0x02, + 0x00, 0x00, 0x14, 0x1f, 0x0b, 0x01, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, + 0x05, 0x01, 0x04, 0x04, 0x12, 0x04, 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x1c, + 0x50, 0x58, 0x40, 0x48, 0x41, 0x3b, 0x02, 0x08, 0x07, 0x1f, 0x17, 0x02, + 0x02, 0x03, 0x02, 0x1e, 0x00, 0x08, 0x07, 0x06, 0x07, 0x08, 0x06, 0x32, + 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, 0x0d, 0x01, 0x06, 0x0a, + 0x01, 0x01, 0x03, 0x06, 0x01, 0x01, 0x00, 0x26, 0x0f, 0x0c, 0x02, 0x07, + 0x07, 0x00, 0x01, 0x00, 0x24, 0x09, 0x0e, 0x02, 0x00, 0x00, 0x14, 0x1f, + 0x0b, 0x01, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, + 0x15, 0x04, 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x4d, 0x50, 0x58, 0x40, 0x54, + 0x41, 0x3b, 0x02, 0x08, 0x07, 0x1f, 0x17, 0x02, 0x02, 0x03, 0x02, 0x1e, + 0x00, 0x08, 0x07, 0x06, 0x07, 0x08, 0x06, 0x32, 0x00, 0x03, 0x01, 0x02, + 0x01, 0x03, 0x02, 0x32, 0x0d, 0x01, 0x06, 0x0a, 0x01, 0x01, 0x03, 0x06, + 0x01, 0x01, 0x00, 0x26, 0x0f, 0x0c, 0x02, 0x07, 0x07, 0x00, 0x01, 0x00, + 0x24, 0x09, 0x0e, 0x02, 0x00, 0x00, 0x14, 0x1f, 0x00, 0x02, 0x02, 0x04, + 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x15, 0x1f, 0x00, 0x0b, 0x0b, + 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x15, 0x04, 0x20, 0x0a, + 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x61, 0x41, 0x3b, 0x02, 0x08, + 0x07, 0x1f, 0x17, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x08, 0x07, 0x06, + 0x07, 0x08, 0x06, 0x32, 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, + 0x0d, 0x01, 0x06, 0x0a, 0x01, 0x01, 0x03, 0x06, 0x01, 0x01, 0x00, 0x26, + 0x0f, 0x01, 0x0c, 0x0c, 0x00, 0x01, 0x00, 0x24, 0x09, 0x0e, 0x02, 0x00, + 0x00, 0x14, 0x1f, 0x00, 0x07, 0x07, 0x00, 0x01, 0x00, 0x24, 0x09, 0x0e, + 0x02, 0x00, 0x00, 0x14, 0x1f, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, + 0x05, 0x01, 0x04, 0x04, 0x15, 0x1f, 0x00, 0x0b, 0x0b, 0x04, 0x01, 0x00, + 0x24, 0x05, 0x01, 0x04, 0x04, 0x15, 0x04, 0x20, 0x0c, 0x1b, 0x4b, 0xb0, + 0x6c, 0x50, 0x58, 0x40, 0x59, 0x41, 0x3b, 0x02, 0x08, 0x07, 0x1f, 0x17, + 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x08, 0x07, 0x06, 0x07, 0x08, 0x06, + 0x32, 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, 0x0f, 0x01, 0x0c, + 0x07, 0x00, 0x0c, 0x01, 0x00, 0x23, 0x09, 0x0e, 0x02, 0x00, 0x00, 0x07, + 0x08, 0x00, 0x07, 0x01, 0x00, 0x26, 0x0d, 0x01, 0x06, 0x0a, 0x01, 0x01, + 0x03, 0x06, 0x01, 0x01, 0x00, 0x26, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, + 0x24, 0x05, 0x01, 0x04, 0x04, 0x15, 0x1f, 0x00, 0x0b, 0x0b, 0x04, 0x01, + 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x15, 0x04, 0x20, 0x0a, 0x1b, 0x4b, + 0xb0, 0x8f, 0x50, 0x58, 0x40, 0x5d, 0x41, 0x3b, 0x02, 0x08, 0x07, 0x1f, + 0x17, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x08, 0x07, 0x06, 0x07, 0x08, + 0x06, 0x32, 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, 0x0f, 0x01, + 0x0c, 0x07, 0x00, 0x0c, 0x01, 0x00, 0x23, 0x09, 0x0e, 0x02, 0x00, 0x00, + 0x07, 0x08, 0x00, 0x07, 0x01, 0x00, 0x26, 0x0d, 0x01, 0x06, 0x0a, 0x01, + 0x01, 0x03, 0x06, 0x01, 0x01, 0x00, 0x26, 0x00, 0x02, 0x0b, 0x04, 0x02, + 0x01, 0x00, 0x23, 0x00, 0x0b, 0x04, 0x04, 0x0b, 0x01, 0x00, 0x23, 0x00, + 0x0b, 0x0b, 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x0b, 0x04, 0x01, + 0x00, 0x21, 0x0a, 0x1b, 0x4b, 0xb0, 0xc7, 0x50, 0x58, 0x40, 0x64, 0x41, + 0x3b, 0x02, 0x08, 0x07, 0x1f, 0x17, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, + 0x08, 0x07, 0x06, 0x07, 0x08, 0x06, 0x32, 0x00, 0x03, 0x0a, 0x02, 0x0a, + 0x03, 0x02, 0x32, 0x0f, 0x01, 0x0c, 0x07, 0x00, 0x0c, 0x01, 0x00, 0x23, + 0x09, 0x0e, 0x02, 0x00, 0x00, 0x07, 0x08, 0x00, 0x07, 0x01, 0x00, 0x26, + 0x00, 0x01, 0x0a, 0x06, 0x01, 0x01, 0x00, 0x23, 0x0d, 0x01, 0x06, 0x00, + 0x0a, 0x03, 0x06, 0x0a, 0x01, 0x00, 0x26, 0x00, 0x02, 0x0b, 0x04, 0x02, + 0x01, 0x00, 0x23, 0x00, 0x0b, 0x04, 0x04, 0x0b, 0x01, 0x00, 0x23, 0x00, + 0x0b, 0x0b, 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x0b, 0x04, 0x01, + 0x00, 0x21, 0x0b, 0x1b, 0x4b, 0xb0, 0x4e, 0x50, 0x58, 0x40, 0x66, 0x41, + 0x3b, 0x02, 0x08, 0x07, 0x1f, 0x17, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, + 0x08, 0x07, 0x06, 0x07, 0x08, 0x06, 0x32, 0x00, 0x03, 0x0a, 0x02, 0x0a, + 0x03, 0x02, 0x32, 0x0e, 0x01, 0x00, 0x0f, 0x01, 0x0c, 0x07, 0x00, 0x0c, + 0x01, 0x00, 0x26, 0x00, 0x09, 0x00, 0x07, 0x08, 0x09, 0x07, 0x01, 0x00, + 0x26, 0x00, 0x01, 0x0a, 0x06, 0x01, 0x01, 0x00, 0x23, 0x0d, 0x01, 0x06, + 0x00, 0x0a, 0x03, 0x06, 0x0a, 0x01, 0x00, 0x26, 0x00, 0x0b, 0x04, 0x05, + 0x0b, 0x01, 0x00, 0x23, 0x00, 0x02, 0x00, 0x04, 0x05, 0x02, 0x04, 0x01, + 0x00, 0x26, 0x00, 0x0b, 0x0b, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x0b, + 0x05, 0x01, 0x00, 0x21, 0x0b, 0x1b, 0x40, 0x67, 0x41, 0x3b, 0x02, 0x08, + 0x07, 0x1f, 0x17, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x08, 0x07, 0x0d, + 0x07, 0x08, 0x0d, 0x32, 0x00, 0x03, 0x0a, 0x02, 0x0a, 0x03, 0x02, 0x32, + 0x0e, 0x01, 0x00, 0x0f, 0x01, 0x0c, 0x07, 0x00, 0x0c, 0x01, 0x00, 0x26, + 0x00, 0x09, 0x00, 0x07, 0x08, 0x09, 0x07, 0x01, 0x00, 0x26, 0x00, 0x0d, + 0x00, 0x01, 0x0a, 0x0d, 0x01, 0x01, 0x00, 0x26, 0x00, 0x06, 0x00, 0x0a, + 0x03, 0x06, 0x0a, 0x01, 0x00, 0x26, 0x00, 0x0b, 0x04, 0x05, 0x0b, 0x01, + 0x00, 0x23, 0x00, 0x02, 0x00, 0x04, 0x05, 0x02, 0x04, 0x01, 0x00, 0x26, + 0x00, 0x0b, 0x0b, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x0b, 0x05, 0x01, + 0x00, 0x21, 0x0b, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x01, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x21, 0x1e, + 0x03, 0x33, 0x32, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x0e, 0x03, + 0x23, 0x22, 0x26, 0x27, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x3e, 0x02, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x23, 0x22, + 0x26, 0x2f, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x01, + 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x01, 0x22, + 0x0e, 0x02, 0x07, 0x21, 0x34, 0x2e, 0x02, 0x04, 0x8e, 0x52, 0x8d, 0x67, + 0x3b, 0x10, 0x19, 0xfd, 0x8d, 0x04, 0x2e, 0x4d, 0x69, 0x41, 0x45, 0x5c, + 0x3d, 0x26, 0x10, 0x0e, 0x12, 0x06, 0x2f, 0x21, 0x57, 0x63, 0x6a, 0x34, + 0x75, 0xbf, 0x37, 0x1b, 0x57, 0x6a, 0x77, 0x3b, 0x45, 0x72, 0x53, 0x2d, + 0x42, 0x93, 0xee, 0xac, 0x65, 0x63, 0x41, 0x59, 0x41, 0x2f, 0x17, 0x12, + 0x1b, 0x08, 0x20, 0x54, 0xb5, 0x71, 0x78, 0x92, 0x21, 0x36, 0xad, 0xfe, + 0xb6, 0x7b, 0xac, 0x6c, 0x31, 0x64, 0x51, 0x39, 0x63, 0x49, 0x2a, 0x01, + 0xbc, 0x3d, 0x60, 0x45, 0x29, 0x07, 0x01, 0xfc, 0x1f, 0x3c, 0x57, 0x04, + 0x05, 0x40, 0x7a, 0xaf, 0x70, 0x29, 0x1d, 0x5b, 0x87, 0x5a, 0x2c, 0x1d, + 0x24, 0x1d, 0x09, 0x08, 0x3d, 0x28, 0x3b, 0x26, 0x13, 0x71, 0x74, 0x3e, + 0x58, 0x38, 0x19, 0x23, 0x46, 0x6a, 0x48, 0x3c, 0x74, 0x5c, 0x3b, 0x04, + 0x32, 0x76, 0x7e, 0x23, 0x2a, 0x23, 0x13, 0x0e, 0x39, 0x51, 0x50, 0x66, + 0x5b, 0x58, 0x67, 0xfd, 0xe1, 0x05, 0x23, 0x38, 0x48, 0x2a, 0x57, 0x50, + 0x24, 0x4a, 0x6e, 0x4a, 0x01, 0xef, 0x29, 0x4e, 0x70, 0x46, 0x41, 0x6f, + 0x50, 0x2d, 0x00, 0x01, 0x00, 0x4a, 0xfe, 0xa1, 0x03, 0x7f, 0x04, 0x05, + 0x00, 0x48, 0x01, 0x67, 0x40, 0x16, 0x01, 0x00, 0x44, 0x42, 0x34, 0x32, + 0x2f, 0x2d, 0x25, 0x23, 0x20, 0x1e, 0x19, 0x17, 0x06, 0x04, 0x00, 0x48, + 0x01, 0x48, 0x09, 0x07, 0x2b, 0x4b, 0xb0, 0x15, 0x50, 0x58, 0x40, 0x46, + 0x1b, 0x01, 0x04, 0x02, 0x37, 0x01, 0x05, 0x06, 0x3b, 0x0e, 0x0d, 0x03, + 0x00, 0x05, 0x46, 0x01, 0x07, 0x00, 0x04, 0x1e, 0x00, 0x03, 0x04, 0x06, + 0x04, 0x03, 0x06, 0x32, 0x00, 0x06, 0x05, 0x04, 0x06, 0x05, 0x30, 0x00, + 0x05, 0x00, 0x04, 0x05, 0x00, 0x30, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, + 0x24, 0x00, 0x02, 0x02, 0x14, 0x1f, 0x01, 0x08, 0x02, 0x00, 0x00, 0x07, + 0x01, 0x02, 0x24, 0x00, 0x07, 0x07, 0x10, 0x07, 0x20, 0x08, 0x1b, 0x4b, + 0xb0, 0x49, 0x50, 0x58, 0x40, 0x4c, 0x1b, 0x01, 0x04, 0x02, 0x37, 0x01, + 0x05, 0x06, 0x3b, 0x0e, 0x0d, 0x03, 0x00, 0x05, 0x46, 0x01, 0x07, 0x01, + 0x04, 0x1e, 0x00, 0x03, 0x04, 0x06, 0x04, 0x03, 0x06, 0x32, 0x00, 0x06, + 0x05, 0x04, 0x06, 0x05, 0x30, 0x00, 0x05, 0x00, 0x04, 0x05, 0x00, 0x30, + 0x08, 0x01, 0x00, 0x01, 0x04, 0x00, 0x01, 0x30, 0x00, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x14, 0x1f, 0x00, 0x01, 0x01, 0x07, + 0x01, 0x02, 0x24, 0x00, 0x07, 0x07, 0x10, 0x07, 0x20, 0x09, 0x1b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x49, 0x1b, 0x01, 0x04, 0x02, 0x37, 0x01, + 0x05, 0x06, 0x3b, 0x0e, 0x0d, 0x03, 0x00, 0x05, 0x46, 0x01, 0x07, 0x01, + 0x04, 0x1e, 0x00, 0x03, 0x04, 0x06, 0x04, 0x03, 0x06, 0x32, 0x00, 0x06, + 0x05, 0x04, 0x06, 0x05, 0x30, 0x00, 0x05, 0x00, 0x04, 0x05, 0x00, 0x30, + 0x08, 0x01, 0x00, 0x01, 0x04, 0x00, 0x01, 0x30, 0x00, 0x01, 0x00, 0x07, + 0x01, 0x07, 0x01, 0x02, 0x25, 0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, + 0x00, 0x02, 0x02, 0x14, 0x04, 0x20, 0x08, 0x1b, 0x40, 0x53, 0x1b, 0x01, + 0x04, 0x02, 0x37, 0x01, 0x05, 0x06, 0x3b, 0x0e, 0x0d, 0x03, 0x00, 0x05, + 0x46, 0x01, 0x07, 0x01, 0x04, 0x1e, 0x00, 0x03, 0x04, 0x06, 0x04, 0x03, + 0x06, 0x32, 0x00, 0x06, 0x05, 0x04, 0x06, 0x05, 0x30, 0x00, 0x05, 0x00, + 0x04, 0x05, 0x00, 0x30, 0x08, 0x01, 0x00, 0x01, 0x04, 0x00, 0x01, 0x30, + 0x00, 0x02, 0x00, 0x04, 0x03, 0x02, 0x04, 0x01, 0x00, 0x26, 0x00, 0x01, + 0x07, 0x07, 0x01, 0x01, 0x00, 0x23, 0x00, 0x01, 0x01, 0x07, 0x01, 0x02, + 0x24, 0x00, 0x07, 0x01, 0x07, 0x01, 0x02, 0x21, 0x09, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x05, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x27, 0x37, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x16, 0x17, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x0e, + 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x33, 0x32, 0x16, + 0x1f, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x36, 0x01, 0x90, 0x06, 0x10, 0x16, 0x20, + 0x15, 0x2a, 0x2b, 0x16, 0x29, 0x3c, 0x26, 0x25, 0x53, 0x8d, 0x66, 0x3a, + 0x3f, 0x79, 0xb2, 0x73, 0x6a, 0xa4, 0x3f, 0x2f, 0x08, 0x10, 0x0f, 0x0f, + 0x23, 0x36, 0x4d, 0x38, 0x4a, 0x72, 0x4d, 0x27, 0x2a, 0x4c, 0x6d, 0x44, + 0x41, 0x54, 0x38, 0x24, 0x12, 0x0b, 0x11, 0x06, 0x32, 0x3b, 0xaa, 0x61, + 0x11, 0x5a, 0x51, 0x20, 0x39, 0x50, 0x30, 0x29, 0x4a, 0x1f, 0x11, 0x06, + 0xf7, 0x07, 0x09, 0x07, 0x21, 0x1a, 0x13, 0x1a, 0x12, 0x0c, 0x05, 0x79, + 0x0b, 0x4f, 0x84, 0xb6, 0x71, 0x71, 0xc0, 0x8b, 0x4e, 0x45, 0x3f, 0x40, + 0x0b, 0x0c, 0x19, 0x1e, 0x19, 0x35, 0x64, 0x8e, 0x58, 0x5c, 0x8f, 0x61, + 0x33, 0x1f, 0x26, 0x1f, 0x09, 0x08, 0x41, 0x48, 0x4a, 0x08, 0x3a, 0x14, + 0x45, 0x36, 0x20, 0x33, 0x24, 0x13, 0x11, 0x0e, 0x37, 0x12, 0xff, 0xff, + 0x00, 0x4a, 0xff, 0xf2, 0x03, 0xc7, 0x05, 0xa9, 0x02, 0x26, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x43, 0x00, 0xf4, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x4a, 0xff, 0xf2, 0x03, 0xc7, 0x05, 0xa9, 0x02, 0x26, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x76, 0x00, 0xf4, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x4a, 0xff, 0xf2, 0x03, 0xc7, 0x05, 0x99, 0x02, 0x26, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x07, 0x00, 0xdb, 0x00, 0xf4, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x4a, 0xff, 0xf2, 0x03, 0xc7, 0x05, 0x7b, 0x02, 0x26, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0xf4, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xf9, 0x00, 0x00, 0x01, 0x86, 0x05, 0xa9, 0x02, 0x26, 0x00, 0xc8, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x43, 0xd3, 0x00, 0xff, 0xff, 0x00, 0x97, + 0x00, 0x00, 0x02, 0x28, 0x05, 0xa9, 0x02, 0x26, 0x00, 0xc8, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x76, 0xd3, 0x00, 0xff, 0xff, 0xff, 0xd2, 0x00, 0x00, + 0x02, 0x36, 0x05, 0x99, 0x02, 0x26, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x06, + 0x00, 0xdb, 0xd2, 0x00, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x02, 0x29, + 0x05, 0x7b, 0x02, 0x26, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, + 0xd3, 0x00, 0x00, 0x02, 0x00, 0x4c, 0xff, 0xf3, 0x04, 0x05, 0x05, 0x86, + 0x00, 0x34, 0x00, 0x48, 0x00, 0x7d, 0x40, 0x0e, 0x36, 0x35, 0x40, 0x3e, + 0x35, 0x48, 0x36, 0x48, 0x2e, 0x2c, 0x24, 0x22, 0x05, 0x07, 0x2b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x2a, 0x3a, 0x30, 0x02, 0x02, 0x03, 0x01, + 0x1e, 0x34, 0x33, 0x19, 0x13, 0x12, 0x0f, 0x06, 0x07, 0x01, 0x1c, 0x00, + 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x04, 0x01, 0x02, + 0x02, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x15, 0x00, 0x20, 0x05, + 0x1b, 0x40, 0x34, 0x3a, 0x30, 0x02, 0x02, 0x03, 0x01, 0x1e, 0x34, 0x33, + 0x19, 0x13, 0x12, 0x0f, 0x06, 0x07, 0x01, 0x1c, 0x00, 0x01, 0x00, 0x03, + 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x04, 0x01, 0x02, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x23, 0x04, 0x01, 0x02, 0x02, 0x00, 0x01, 0x00, 0x24, 0x00, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x21, 0x06, 0x59, 0xb0, 0x38, 0x2b, 0x01, + 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x2e, 0x01, 0x27, 0x2e, 0x01, 0x35, + 0x34, 0x3f, 0x01, 0x1e, 0x01, 0x17, 0x37, 0x17, 0x16, 0x15, 0x14, 0x0f, + 0x01, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x2e, 0x01, 0x27, 0x07, 0x13, + 0x32, 0x3e, 0x02, 0x37, 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x1e, 0x02, 0x01, 0xa1, 0x04, 0x05, 0x17, 0x67, 0x2d, 0x65, 0x39, 0x12, + 0x19, 0x05, 0x14, 0x60, 0xb4, 0x51, 0xa7, 0x23, 0x08, 0x16, 0x61, 0x3c, + 0x63, 0x46, 0x27, 0x3e, 0x7b, 0xb7, 0x78, 0x62, 0xaa, 0x7d, 0x48, 0x3e, + 0x74, 0xa5, 0x68, 0x64, 0xb1, 0x41, 0x14, 0x75, 0x5e, 0xb8, 0x5f, 0x47, + 0x73, 0x51, 0x2e, 0x03, 0x10, 0x34, 0x4b, 0x63, 0x3e, 0x4b, 0x71, 0x4c, + 0x27, 0x2e, 0x50, 0x69, 0x04, 0x29, 0x07, 0x0d, 0x06, 0x16, 0x0f, 0x48, + 0x14, 0x22, 0x0e, 0x05, 0x1b, 0x17, 0x0f, 0x0e, 0x3e, 0x10, 0x3c, 0x30, + 0x7a, 0x39, 0x0d, 0x0b, 0x15, 0x10, 0x43, 0x31, 0x7c, 0x9b, 0xb9, 0x6e, + 0x8f, 0xe4, 0xa0, 0x56, 0x42, 0x7b, 0xb2, 0x70, 0x5e, 0xa7, 0x7e, 0x4a, + 0x56, 0x57, 0x88, 0xbe, 0x40, 0x87, 0xfc, 0x8c, 0x36, 0x6d, 0xa5, 0x6f, + 0x2b, 0x51, 0x3f, 0x25, 0x32, 0x57, 0x77, 0x44, 0x51, 0x7f, 0x56, 0x2d, + 0xff, 0xff, 0x00, 0x92, 0x00, 0x00, 0x03, 0xdd, 0x05, 0x89, 0x02, 0x26, + 0x00, 0x51, 0x00, 0x00, 0x00, 0x07, 0x00, 0xe2, 0x01, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x48, 0xff, 0xf2, 0x04, 0x0e, 0x05, 0xa9, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x00, 0x43, 0x00, 0xfb, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x48, 0xff, 0xf2, 0x04, 0x0e, 0x05, 0xa9, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x00, 0x76, 0x00, 0xfb, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x48, 0xff, 0xf2, 0x04, 0x0e, 0x05, 0x99, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x00, 0xdb, 0x00, 0xfb, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x48, 0xff, 0xf2, 0x04, 0x0e, 0x05, 0x89, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x00, 0xe2, 0x00, 0xfb, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x48, 0xff, 0xf2, 0x04, 0x0e, 0x05, 0x7b, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0xfb, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x64, 0x00, 0xbd, 0x04, 0x22, 0x04, 0x80, 0x00, 0x03, + 0x00, 0x17, 0x00, 0x2b, 0x00, 0x41, 0x40, 0x0e, 0x28, 0x26, 0x1e, 0x1c, + 0x14, 0x12, 0x0a, 0x08, 0x03, 0x02, 0x01, 0x00, 0x06, 0x07, 0x2b, 0x40, + 0x2b, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x03, 0x01, 0x00, 0x26, 0x00, + 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x00, 0x00, 0x26, 0x00, 0x04, 0x05, + 0x05, 0x04, 0x01, 0x00, 0x23, 0x00, 0x04, 0x04, 0x05, 0x01, 0x00, 0x24, + 0x00, 0x05, 0x04, 0x05, 0x01, 0x00, 0x21, 0x05, 0xb0, 0x38, 0x2b, 0x13, + 0x21, 0x15, 0x21, 0x01, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x11, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x64, + 0x03, 0xbe, 0xfc, 0x42, 0x01, 0x62, 0x13, 0x21, 0x2d, 0x1b, 0x1a, 0x2d, + 0x22, 0x14, 0x14, 0x22, 0x2d, 0x1a, 0x1b, 0x2d, 0x21, 0x13, 0x13, 0x21, + 0x2d, 0x1b, 0x1a, 0x2d, 0x22, 0x14, 0x14, 0x22, 0x2d, 0x1a, 0x1b, 0x2d, + 0x21, 0x13, 0x02, 0xe3, 0x87, 0x01, 0xa6, 0x1a, 0x2e, 0x22, 0x14, 0x14, + 0x22, 0x2e, 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, 0x2d, 0xfd, 0x53, + 0x1a, 0x2e, 0x22, 0x14, 0x14, 0x22, 0x2e, 0x1a, 0x1b, 0x2d, 0x22, 0x13, + 0x13, 0x22, 0x2d, 0x00, 0x00, 0x03, 0x00, 0x40, 0xff, 0xb4, 0x04, 0x2d, + 0x04, 0x49, 0x00, 0x21, 0x00, 0x2b, 0x00, 0x35, 0x01, 0x2b, 0x40, 0x12, + 0x2d, 0x2c, 0x2c, 0x35, 0x2d, 0x35, 0x28, 0x26, 0x21, 0x1f, 0x1a, 0x18, + 0x10, 0x0e, 0x09, 0x07, 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, + 0x40, 0x3c, 0x1c, 0x01, 0x04, 0x02, 0x34, 0x33, 0x25, 0x24, 0x00, 0x05, + 0x05, 0x04, 0x0b, 0x01, 0x00, 0x05, 0x03, 0x1e, 0x11, 0x01, 0x05, 0x01, + 0x1d, 0x00, 0x03, 0x02, 0x03, 0x34, 0x00, 0x01, 0x00, 0x01, 0x35, 0x00, + 0x04, 0x04, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x14, 0x1f, 0x06, + 0x01, 0x05, 0x05, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x12, 0x00, + 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x3c, 0x1c, 0x01, + 0x04, 0x02, 0x34, 0x33, 0x25, 0x24, 0x00, 0x05, 0x05, 0x04, 0x0b, 0x01, + 0x00, 0x05, 0x03, 0x1e, 0x11, 0x01, 0x05, 0x01, 0x1d, 0x00, 0x03, 0x02, + 0x03, 0x34, 0x00, 0x01, 0x00, 0x01, 0x35, 0x00, 0x04, 0x04, 0x02, 0x01, + 0x00, 0x24, 0x00, 0x02, 0x02, 0x14, 0x1f, 0x06, 0x01, 0x05, 0x05, 0x00, + 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x15, 0x00, 0x20, 0x08, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x3a, 0x1c, 0x01, 0x04, 0x02, 0x34, 0x33, + 0x25, 0x24, 0x00, 0x05, 0x05, 0x04, 0x0b, 0x01, 0x00, 0x05, 0x03, 0x1e, + 0x11, 0x01, 0x05, 0x01, 0x1d, 0x00, 0x03, 0x02, 0x03, 0x34, 0x00, 0x01, + 0x00, 0x01, 0x35, 0x00, 0x02, 0x00, 0x04, 0x05, 0x02, 0x04, 0x01, 0x00, + 0x26, 0x06, 0x01, 0x05, 0x05, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x20, 0x07, 0x1b, 0x40, 0x44, 0x1c, 0x01, 0x04, 0x02, 0x34, + 0x33, 0x25, 0x24, 0x00, 0x05, 0x05, 0x04, 0x0b, 0x01, 0x00, 0x05, 0x03, + 0x1e, 0x11, 0x01, 0x05, 0x01, 0x1d, 0x00, 0x03, 0x02, 0x03, 0x34, 0x00, + 0x01, 0x00, 0x01, 0x35, 0x00, 0x02, 0x00, 0x04, 0x05, 0x02, 0x04, 0x01, + 0x00, 0x26, 0x06, 0x01, 0x05, 0x00, 0x00, 0x05, 0x01, 0x00, 0x23, 0x06, + 0x01, 0x05, 0x05, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x05, 0x00, 0x01, + 0x00, 0x21, 0x08, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x1e, 0x01, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x0e, 0x01, 0x2b, + 0x01, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, + 0x37, 0x3e, 0x01, 0x3b, 0x01, 0x01, 0x14, 0x17, 0x01, 0x26, 0x23, 0x22, + 0x0e, 0x02, 0x01, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x27, 0x01, 0x16, 0x03, + 0x90, 0x3d, 0x42, 0x43, 0x7d, 0xb3, 0x6f, 0x4c, 0x83, 0x36, 0x37, 0x16, + 0x3b, 0x1d, 0x43, 0x91, 0x42, 0x46, 0x44, 0x7e, 0xb3, 0x6f, 0x4f, 0x87, + 0x38, 0x44, 0x14, 0x20, 0x20, 0x5a, 0xfc, 0xc9, 0x3b, 0x01, 0xb4, 0x49, + 0x6f, 0x4c, 0x74, 0x4f, 0x28, 0x01, 0x37, 0x4b, 0x73, 0x4f, 0x28, 0x34, + 0xfe, 0x4f, 0x46, 0x03, 0x74, 0x44, 0xbf, 0x76, 0x78, 0xc0, 0x88, 0x49, + 0x22, 0x20, 0x4a, 0x1d, 0x19, 0xc4, 0x45, 0xc2, 0x7c, 0x77, 0xc1, 0x88, + 0x4a, 0x26, 0x23, 0x5b, 0x1b, 0x17, 0xfd, 0xb1, 0xa0, 0x61, 0x02, 0x4e, + 0x38, 0x36, 0x64, 0x91, 0xfe, 0x24, 0x35, 0x64, 0x8f, 0x5a, 0x97, 0x60, + 0xfd, 0xb7, 0x30, 0x00, 0xff, 0xff, 0x00, 0x7a, 0xff, 0xf0, 0x03, 0xc5, + 0x05, 0xa9, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x00, 0x43, + 0x00, 0xf5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7a, 0xff, 0xf0, 0x03, 0xc5, + 0x05, 0xa9, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x00, 0x76, + 0x00, 0xf5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7a, 0xff, 0xf0, 0x03, 0xc5, + 0x05, 0x99, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x00, 0xdb, + 0x00, 0xf5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7a, 0xff, 0xf0, 0x03, 0xc5, + 0x05, 0x7b, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, + 0x00, 0xf5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0xa9, 0x03, 0xf0, + 0x05, 0xa9, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x76, + 0x00, 0xe4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x92, 0xfe, 0xa9, 0x04, 0x0f, + 0x05, 0xc1, 0x00, 0x14, 0x00, 0x23, 0x01, 0x7e, 0x40, 0x16, 0x16, 0x15, + 0x00, 0x00, 0x1d, 0x1b, 0x15, 0x23, 0x16, 0x23, 0x00, 0x14, 0x00, 0x14, + 0x11, 0x0f, 0x07, 0x05, 0x02, 0x01, 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x09, + 0x50, 0x58, 0x40, 0x32, 0x19, 0x18, 0x03, 0x03, 0x05, 0x04, 0x13, 0x01, + 0x02, 0x05, 0x02, 0x1e, 0x00, 0x00, 0x00, 0x0d, 0x1f, 0x07, 0x01, 0x04, + 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x14, 0x1f, 0x00, 0x05, + 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x12, 0x1f, 0x06, 0x01, + 0x03, 0x03, 0x10, 0x03, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x49, 0x50, 0x58, + 0x40, 0x32, 0x19, 0x18, 0x03, 0x03, 0x05, 0x04, 0x13, 0x01, 0x02, 0x05, + 0x02, 0x1e, 0x00, 0x00, 0x00, 0x0d, 0x1f, 0x07, 0x01, 0x04, 0x04, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x14, 0x1f, 0x00, 0x05, 0x05, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x1f, 0x06, 0x01, 0x03, 0x03, + 0x10, 0x03, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x34, + 0x19, 0x18, 0x03, 0x03, 0x05, 0x04, 0x13, 0x01, 0x02, 0x05, 0x02, 0x1e, + 0x07, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x14, + 0x1f, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, + 0x1f, 0x06, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x0d, 0x03, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x32, + 0x19, 0x18, 0x03, 0x03, 0x05, 0x04, 0x13, 0x01, 0x02, 0x05, 0x02, 0x1e, + 0x00, 0x01, 0x07, 0x01, 0x04, 0x05, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, + 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x1f, 0x06, + 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0d, 0x03, + 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x8d, 0x50, 0x58, 0x40, 0x30, 0x19, 0x18, + 0x03, 0x03, 0x05, 0x04, 0x13, 0x01, 0x02, 0x05, 0x02, 0x1e, 0x00, 0x01, + 0x07, 0x01, 0x04, 0x05, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, + 0x02, 0x03, 0x05, 0x02, 0x01, 0x00, 0x26, 0x06, 0x01, 0x03, 0x03, 0x00, + 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0d, 0x03, 0x20, 0x05, 0x1b, 0x40, + 0x39, 0x19, 0x18, 0x03, 0x03, 0x05, 0x04, 0x13, 0x01, 0x02, 0x05, 0x02, + 0x1e, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x01, 0x07, + 0x01, 0x04, 0x05, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x02, + 0x03, 0x05, 0x02, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x24, 0x06, 0x01, 0x03, 0x00, 0x03, 0x00, 0x00, 0x21, 0x06, 0x59, 0x59, + 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x11, 0x33, 0x11, 0x3e, 0x01, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x11, 0x01, 0x22, 0x06, 0x07, 0x11, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x2e, 0x02, 0x92, 0xb2, 0x3f, 0xa4, 0x69, 0x57, 0x8e, 0x64, 0x36, + 0x3c, 0x70, 0xa3, 0x66, 0x5f, 0x84, 0x33, 0x01, 0x11, 0x57, 0x83, 0x37, + 0x31, 0x75, 0x48, 0x8d, 0x98, 0x23, 0x42, 0x60, 0xfe, 0xa9, 0x07, 0x18, + 0xfd, 0xa1, 0x4a, 0x59, 0x42, 0x83, 0xc1, 0x7e, 0x70, 0xc1, 0x8d, 0x51, + 0x45, 0x3f, 0xfe, 0x33, 0x04, 0xce, 0x50, 0x49, 0xfe, 0x16, 0x42, 0x36, + 0xca, 0xbb, 0x63, 0x8e, 0x5b, 0x2a, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0xa9, + 0x03, 0xf0, 0x05, 0x7b, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x6a, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0xfe, 0xaa, + 0x05, 0x92, 0x05, 0x99, 0x00, 0x27, 0x00, 0x2f, 0x01, 0xac, 0x40, 0x18, + 0x01, 0x00, 0x29, 0x28, 0x24, 0x22, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x15, + 0x12, 0x11, 0x0e, 0x0d, 0x08, 0x06, 0x00, 0x27, 0x01, 0x27, 0x0a, 0x07, + 0x2b, 0x4b, 0xb0, 0x15, 0x50, 0x58, 0x40, 0x30, 0x2c, 0x01, 0x08, 0x05, + 0x04, 0x01, 0x01, 0x00, 0x02, 0x1e, 0x00, 0x08, 0x00, 0x03, 0x02, 0x08, + 0x03, 0x00, 0x02, 0x26, 0x00, 0x05, 0x05, 0x0b, 0x1f, 0x06, 0x04, 0x02, + 0x02, 0x02, 0x0c, 0x1f, 0x07, 0x09, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x01, 0x10, 0x01, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x49, + 0x50, 0x58, 0x40, 0x37, 0x2c, 0x01, 0x08, 0x05, 0x04, 0x01, 0x01, 0x07, + 0x02, 0x1e, 0x09, 0x01, 0x00, 0x02, 0x07, 0x02, 0x00, 0x07, 0x32, 0x00, + 0x08, 0x00, 0x03, 0x02, 0x08, 0x03, 0x00, 0x02, 0x26, 0x00, 0x05, 0x05, + 0x0b, 0x1f, 0x06, 0x04, 0x02, 0x02, 0x02, 0x0c, 0x1f, 0x00, 0x07, 0x07, + 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x10, 0x01, 0x20, 0x07, 0x1b, + 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x34, 0x2c, 0x01, 0x08, 0x05, 0x04, + 0x01, 0x01, 0x07, 0x02, 0x1e, 0x09, 0x01, 0x00, 0x02, 0x07, 0x02, 0x00, + 0x07, 0x32, 0x00, 0x08, 0x00, 0x03, 0x02, 0x08, 0x03, 0x00, 0x02, 0x26, + 0x00, 0x07, 0x00, 0x01, 0x07, 0x01, 0x01, 0x00, 0x25, 0x00, 0x05, 0x05, + 0x0b, 0x1f, 0x06, 0x04, 0x02, 0x02, 0x02, 0x0c, 0x02, 0x20, 0x06, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x34, 0x2c, 0x01, 0x08, 0x05, 0x04, + 0x01, 0x01, 0x07, 0x02, 0x1e, 0x00, 0x05, 0x08, 0x05, 0x34, 0x09, 0x01, + 0x00, 0x02, 0x07, 0x02, 0x00, 0x07, 0x32, 0x00, 0x08, 0x00, 0x03, 0x02, + 0x08, 0x03, 0x00, 0x02, 0x26, 0x00, 0x07, 0x00, 0x01, 0x07, 0x01, 0x01, + 0x00, 0x25, 0x06, 0x04, 0x02, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x06, 0x1b, + 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x42, 0x2c, 0x01, 0x08, 0x05, 0x04, + 0x01, 0x01, 0x07, 0x02, 0x1e, 0x00, 0x05, 0x08, 0x05, 0x34, 0x06, 0x04, + 0x02, 0x02, 0x03, 0x00, 0x03, 0x02, 0x00, 0x32, 0x09, 0x01, 0x00, 0x07, + 0x03, 0x00, 0x07, 0x30, 0x00, 0x08, 0x00, 0x03, 0x02, 0x08, 0x03, 0x00, + 0x02, 0x26, 0x00, 0x07, 0x01, 0x01, 0x07, 0x01, 0x00, 0x23, 0x00, 0x07, + 0x07, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x07, 0x01, 0x01, 0x00, 0x21, + 0x08, 0x1b, 0x40, 0x4e, 0x2c, 0x01, 0x08, 0x05, 0x04, 0x01, 0x01, 0x07, + 0x02, 0x1e, 0x00, 0x05, 0x08, 0x05, 0x34, 0x00, 0x06, 0x03, 0x04, 0x03, + 0x06, 0x04, 0x32, 0x00, 0x04, 0x02, 0x03, 0x04, 0x02, 0x30, 0x00, 0x02, + 0x00, 0x03, 0x02, 0x00, 0x30, 0x09, 0x01, 0x00, 0x07, 0x03, 0x00, 0x07, + 0x30, 0x00, 0x08, 0x00, 0x03, 0x06, 0x08, 0x03, 0x00, 0x02, 0x26, 0x00, + 0x07, 0x01, 0x01, 0x07, 0x01, 0x00, 0x23, 0x00, 0x07, 0x07, 0x01, 0x01, + 0x00, 0x24, 0x00, 0x01, 0x07, 0x01, 0x01, 0x00, 0x21, 0x0a, 0x59, 0x59, + 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x05, 0x32, 0x16, 0x1f, 0x01, 0x0e, + 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x22, 0x26, 0x27, 0x03, + 0x21, 0x03, 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x33, 0x01, 0x23, 0x0e, 0x03, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x01, 0x21, 0x03, 0x26, 0x27, + 0x0e, 0x01, 0x07, 0x05, 0x64, 0x07, 0x09, 0x02, 0x1c, 0x1e, 0x5d, 0x33, + 0x58, 0x65, 0x4f, 0x3c, 0x19, 0x20, 0x08, 0x86, 0xfd, 0x7d, 0x86, 0x07, + 0x22, 0x19, 0x96, 0x02, 0x3d, 0xc5, 0x02, 0x3d, 0x25, 0x14, 0x2a, 0x22, + 0x16, 0x31, 0x2a, 0x17, 0x1e, 0x14, 0x0d, 0xfc, 0x3f, 0x02, 0x17, 0xe1, + 0x16, 0x15, 0x0b, 0x15, 0x0a, 0xd3, 0x08, 0x05, 0x42, 0x17, 0x1d, 0x4f, + 0x42, 0x3a, 0x65, 0x26, 0x1a, 0x14, 0x01, 0x5a, 0xfe, 0xa6, 0x12, 0x1c, + 0x05, 0x99, 0xfa, 0x67, 0x0b, 0x1f, 0x27, 0x2f, 0x1a, 0x26, 0x2b, 0x07, + 0x09, 0x08, 0x02, 0xe7, 0x02, 0x47, 0x36, 0x51, 0x29, 0x45, 0x1a, 0x00, + 0x00, 0x02, 0x00, 0x5c, 0xfe, 0xaa, 0x03, 0xe8, 0x04, 0x07, 0x00, 0x43, + 0x00, 0x53, 0x01, 0xe5, 0x40, 0x1a, 0x45, 0x44, 0x4b, 0x4a, 0x44, 0x53, + 0x45, 0x53, 0x3f, 0x3d, 0x38, 0x36, 0x33, 0x31, 0x2e, 0x2d, 0x25, 0x23, + 0x15, 0x13, 0x0e, 0x0c, 0x09, 0x07, 0x0b, 0x07, 0x2b, 0x4b, 0xb0, 0x15, + 0x50, 0x58, 0x40, 0x4e, 0x3b, 0x01, 0x06, 0x05, 0x49, 0x1f, 0x02, 0x08, + 0x09, 0x1c, 0x00, 0x02, 0x03, 0x08, 0x11, 0x01, 0x02, 0x00, 0x04, 0x1e, + 0x00, 0x06, 0x05, 0x04, 0x05, 0x06, 0x04, 0x32, 0x00, 0x04, 0x00, 0x09, + 0x08, 0x04, 0x09, 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, 0x07, 0x01, 0x00, + 0x24, 0x00, 0x07, 0x07, 0x14, 0x1f, 0x0a, 0x01, 0x08, 0x08, 0x03, 0x01, + 0x00, 0x24, 0x00, 0x03, 0x03, 0x12, 0x1f, 0x01, 0x01, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x10, 0x02, 0x20, 0x09, 0x1b, 0x4b, + 0xb0, 0x49, 0x50, 0x58, 0x40, 0x55, 0x3b, 0x01, 0x06, 0x05, 0x49, 0x1f, + 0x02, 0x08, 0x09, 0x1c, 0x00, 0x02, 0x03, 0x08, 0x11, 0x01, 0x02, 0x00, + 0x04, 0x1e, 0x00, 0x06, 0x05, 0x04, 0x05, 0x06, 0x04, 0x32, 0x00, 0x01, + 0x03, 0x00, 0x03, 0x01, 0x00, 0x32, 0x00, 0x04, 0x00, 0x09, 0x08, 0x04, + 0x09, 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, 0x07, 0x01, 0x00, 0x24, 0x00, + 0x07, 0x07, 0x14, 0x1f, 0x0a, 0x01, 0x08, 0x08, 0x03, 0x01, 0x00, 0x24, + 0x00, 0x03, 0x03, 0x12, 0x1f, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, + 0x00, 0x02, 0x02, 0x10, 0x02, 0x20, 0x0a, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, + 0x58, 0x40, 0x52, 0x3b, 0x01, 0x06, 0x05, 0x49, 0x1f, 0x02, 0x08, 0x09, + 0x1c, 0x00, 0x02, 0x03, 0x08, 0x11, 0x01, 0x02, 0x00, 0x04, 0x1e, 0x00, + 0x06, 0x05, 0x04, 0x05, 0x06, 0x04, 0x32, 0x00, 0x01, 0x03, 0x00, 0x03, + 0x01, 0x00, 0x32, 0x00, 0x04, 0x00, 0x09, 0x08, 0x04, 0x09, 0x01, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x25, 0x00, 0x05, + 0x05, 0x07, 0x01, 0x00, 0x24, 0x00, 0x07, 0x07, 0x14, 0x1f, 0x0a, 0x01, + 0x08, 0x08, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x12, 0x03, 0x20, + 0x09, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x50, 0x3b, 0x01, 0x06, + 0x05, 0x49, 0x1f, 0x02, 0x08, 0x09, 0x1c, 0x00, 0x02, 0x03, 0x08, 0x11, + 0x01, 0x02, 0x00, 0x04, 0x1e, 0x00, 0x06, 0x05, 0x04, 0x05, 0x06, 0x04, + 0x32, 0x00, 0x01, 0x03, 0x00, 0x03, 0x01, 0x00, 0x32, 0x00, 0x07, 0x00, + 0x05, 0x06, 0x07, 0x05, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x09, 0x08, + 0x04, 0x09, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x01, + 0x00, 0x25, 0x0a, 0x01, 0x08, 0x08, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, + 0x03, 0x15, 0x03, 0x20, 0x08, 0x1b, 0x40, 0x5a, 0x3b, 0x01, 0x06, 0x05, + 0x49, 0x1f, 0x02, 0x08, 0x09, 0x1c, 0x00, 0x02, 0x03, 0x08, 0x11, 0x01, + 0x02, 0x00, 0x04, 0x1e, 0x00, 0x06, 0x05, 0x04, 0x05, 0x06, 0x04, 0x32, + 0x00, 0x01, 0x03, 0x00, 0x03, 0x01, 0x00, 0x32, 0x00, 0x07, 0x00, 0x05, + 0x06, 0x07, 0x05, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x09, 0x08, 0x04, + 0x09, 0x01, 0x00, 0x26, 0x0a, 0x01, 0x08, 0x00, 0x03, 0x01, 0x08, 0x03, + 0x01, 0x00, 0x26, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x23, 0x00, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, + 0x21, 0x09, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x21, 0x0e, 0x03, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x1f, 0x01, + 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x26, 0x2f, + 0x01, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x37, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x2f, 0x01, + 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x01, 0x32, 0x3e, 0x02, 0x37, + 0x35, 0x0e, 0x03, 0x15, 0x14, 0x1e, 0x02, 0x03, 0x7a, 0x14, 0x2a, 0x22, + 0x16, 0x31, 0x2a, 0x17, 0x1e, 0x14, 0x0d, 0x05, 0x07, 0x09, 0x02, 0x1c, + 0x1e, 0x5d, 0x33, 0x58, 0x65, 0x16, 0x27, 0x35, 0x1f, 0x18, 0x0a, 0x14, + 0x28, 0x4c, 0x54, 0x5f, 0x3a, 0x3b, 0x67, 0x4c, 0x2d, 0x42, 0x93, 0xee, + 0xac, 0x65, 0x63, 0x41, 0x59, 0x41, 0x2f, 0x17, 0x12, 0x1a, 0x09, 0x20, + 0x54, 0xc2, 0x76, 0x55, 0x84, 0x5a, 0x2e, 0xfe, 0x32, 0x2f, 0x4e, 0x45, + 0x3f, 0x1e, 0x7b, 0xac, 0x6c, 0x31, 0x1a, 0x2c, 0x3c, 0x0b, 0x1f, 0x27, + 0x2f, 0x1a, 0x26, 0x2b, 0x07, 0x09, 0x08, 0x08, 0x05, 0x42, 0x17, 0x1d, + 0x4f, 0x42, 0x1d, 0x38, 0x33, 0x2d, 0x13, 0x07, 0x20, 0x5e, 0x24, 0x39, + 0x27, 0x14, 0x21, 0x42, 0x65, 0x45, 0x3c, 0x6f, 0x56, 0x37, 0x04, 0x4f, + 0x76, 0x79, 0x21, 0x29, 0x21, 0x13, 0x0e, 0x39, 0x51, 0x50, 0x38, 0x64, + 0x8e, 0x55, 0xfd, 0xe5, 0x13, 0x23, 0x32, 0x20, 0xd3, 0x04, 0x1f, 0x32, + 0x44, 0x2a, 0x28, 0x3a, 0x25, 0x11, 0xff, 0xff, 0x00, 0x5a, 0xff, 0xf0, + 0x05, 0x09, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x00, 0x07, + 0x01, 0x0b, 0x01, 0xe9, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4a, 0xff, 0xf2, + 0x03, 0x7f, 0x05, 0xa9, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x76, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x00, 0xae, 0xfe, 0xaa, + 0x04, 0x34, 0x05, 0x99, 0x00, 0x26, 0x01, 0xd0, 0x40, 0x1a, 0x01, 0x00, + 0x23, 0x21, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, + 0x10, 0x0f, 0x0e, 0x0d, 0x08, 0x06, 0x00, 0x26, 0x01, 0x26, 0x0b, 0x07, + 0x2b, 0x4b, 0xb0, 0x15, 0x50, 0x58, 0x40, 0x39, 0x04, 0x01, 0x01, 0x00, + 0x01, 0x1e, 0x00, 0x05, 0x00, 0x06, 0x07, 0x05, 0x06, 0x00, 0x00, 0x26, + 0x00, 0x04, 0x04, 0x03, 0x00, 0x00, 0x24, 0x00, 0x03, 0x03, 0x0b, 0x1f, + 0x00, 0x07, 0x07, 0x02, 0x00, 0x00, 0x24, 0x08, 0x01, 0x02, 0x02, 0x0c, + 0x1f, 0x09, 0x0a, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x01, 0x10, 0x01, 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, + 0x40, 0x04, 0x01, 0x01, 0x09, 0x01, 0x1e, 0x0a, 0x01, 0x00, 0x02, 0x09, + 0x02, 0x00, 0x09, 0x32, 0x00, 0x05, 0x00, 0x06, 0x07, 0x05, 0x06, 0x00, + 0x00, 0x26, 0x00, 0x04, 0x04, 0x03, 0x00, 0x00, 0x24, 0x00, 0x03, 0x03, + 0x0b, 0x1f, 0x00, 0x07, 0x07, 0x02, 0x00, 0x00, 0x24, 0x08, 0x01, 0x02, + 0x02, 0x0c, 0x1f, 0x00, 0x09, 0x09, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x01, 0x10, 0x01, 0x20, 0x09, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, + 0x3d, 0x04, 0x01, 0x01, 0x09, 0x01, 0x1e, 0x0a, 0x01, 0x00, 0x02, 0x09, + 0x02, 0x00, 0x09, 0x32, 0x00, 0x05, 0x00, 0x06, 0x07, 0x05, 0x06, 0x00, + 0x00, 0x26, 0x00, 0x09, 0x00, 0x01, 0x09, 0x01, 0x01, 0x00, 0x25, 0x00, + 0x04, 0x04, 0x03, 0x00, 0x00, 0x24, 0x00, 0x03, 0x03, 0x0b, 0x1f, 0x00, + 0x07, 0x07, 0x02, 0x00, 0x00, 0x24, 0x08, 0x01, 0x02, 0x02, 0x0c, 0x02, + 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x3b, 0x04, 0x01, + 0x01, 0x09, 0x01, 0x1e, 0x0a, 0x01, 0x00, 0x02, 0x09, 0x02, 0x00, 0x09, + 0x32, 0x00, 0x03, 0x00, 0x04, 0x05, 0x03, 0x04, 0x00, 0x00, 0x26, 0x00, + 0x05, 0x00, 0x06, 0x07, 0x05, 0x06, 0x00, 0x00, 0x26, 0x00, 0x09, 0x00, + 0x01, 0x09, 0x01, 0x01, 0x00, 0x25, 0x00, 0x07, 0x07, 0x02, 0x00, 0x00, + 0x24, 0x08, 0x01, 0x02, 0x02, 0x0f, 0x02, 0x20, 0x07, 0x1b, 0x4b, 0xb0, + 0xe8, 0x50, 0x58, 0x40, 0x45, 0x04, 0x01, 0x01, 0x09, 0x01, 0x1e, 0x0a, + 0x01, 0x00, 0x02, 0x09, 0x02, 0x00, 0x09, 0x32, 0x00, 0x03, 0x00, 0x04, + 0x05, 0x03, 0x04, 0x00, 0x00, 0x26, 0x00, 0x05, 0x00, 0x06, 0x07, 0x05, + 0x06, 0x00, 0x00, 0x26, 0x00, 0x07, 0x08, 0x01, 0x02, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x26, 0x00, 0x09, 0x01, 0x01, 0x09, 0x01, 0x00, 0x23, 0x00, + 0x09, 0x09, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x09, 0x01, 0x01, 0x00, + 0x21, 0x08, 0x1b, 0x40, 0x4b, 0x04, 0x01, 0x01, 0x09, 0x01, 0x1e, 0x00, + 0x08, 0x07, 0x02, 0x02, 0x08, 0x2a, 0x0a, 0x01, 0x00, 0x02, 0x09, 0x02, + 0x00, 0x09, 0x32, 0x00, 0x03, 0x00, 0x04, 0x05, 0x03, 0x04, 0x00, 0x00, + 0x26, 0x00, 0x05, 0x00, 0x06, 0x07, 0x05, 0x06, 0x00, 0x00, 0x26, 0x00, + 0x07, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x00, 0x26, 0x00, 0x09, 0x01, + 0x01, 0x09, 0x01, 0x00, 0x23, 0x00, 0x09, 0x09, 0x01, 0x01, 0x00, 0x24, + 0x00, 0x01, 0x09, 0x01, 0x01, 0x00, 0x21, 0x09, 0x59, 0x59, 0x59, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x05, 0x32, 0x16, 0x1f, 0x01, 0x0e, 0x01, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, + 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x23, 0x0e, 0x03, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x3e, 0x02, 0x04, 0x06, 0x07, 0x09, 0x02, 0x1c, 0x1e, 0x5d, + 0x33, 0x58, 0x65, 0x4f, 0x3c, 0xfd, 0x5a, 0x03, 0x73, 0xfd, 0x50, 0x02, + 0x2d, 0xfd, 0xd3, 0x02, 0xb0, 0x5b, 0x14, 0x2a, 0x22, 0x16, 0x31, 0x2a, + 0x17, 0x1e, 0x14, 0x0d, 0xd3, 0x08, 0x05, 0x42, 0x17, 0x1d, 0x4f, 0x42, + 0x3a, 0x65, 0x26, 0x05, 0x99, 0x9e, 0xfe, 0x24, 0x98, 0xfe, 0x17, 0x9e, + 0x0b, 0x1f, 0x27, 0x2f, 0x1a, 0x26, 0x2b, 0x07, 0x09, 0x08, 0x00, 0x02, + 0x00, 0x4a, 0xfe, 0xaa, 0x03, 0xc7, 0x04, 0x05, 0x00, 0x3c, 0x00, 0x45, + 0x01, 0xbc, 0x40, 0x1e, 0x3e, 0x3d, 0x01, 0x00, 0x41, 0x40, 0x3d, 0x45, + 0x3e, 0x45, 0x39, 0x37, 0x2b, 0x29, 0x26, 0x24, 0x20, 0x1e, 0x18, 0x16, + 0x0e, 0x0d, 0x08, 0x06, 0x00, 0x3c, 0x01, 0x3c, 0x0c, 0x07, 0x2b, 0x4b, + 0xb0, 0x15, 0x50, 0x58, 0x40, 0x45, 0x2d, 0x01, 0x05, 0x06, 0x04, 0x01, + 0x01, 0x00, 0x02, 0x1e, 0x00, 0x06, 0x04, 0x05, 0x04, 0x06, 0x05, 0x32, + 0x00, 0x09, 0x00, 0x04, 0x06, 0x09, 0x04, 0x01, 0x00, 0x26, 0x0b, 0x01, + 0x08, 0x08, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x14, 0x1f, 0x00, + 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x1f, 0x07, + 0x0a, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x10, + 0x01, 0x20, 0x09, 0x1b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, 0x4c, 0x2d, + 0x01, 0x05, 0x06, 0x04, 0x01, 0x01, 0x07, 0x02, 0x1e, 0x00, 0x06, 0x04, + 0x05, 0x04, 0x06, 0x05, 0x32, 0x0a, 0x01, 0x00, 0x02, 0x07, 0x02, 0x00, + 0x07, 0x32, 0x00, 0x09, 0x00, 0x04, 0x06, 0x09, 0x04, 0x01, 0x00, 0x26, + 0x0b, 0x01, 0x08, 0x08, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x14, + 0x1f, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, + 0x1f, 0x00, 0x07, 0x07, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x10, + 0x01, 0x20, 0x0a, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x49, 0x2d, + 0x01, 0x05, 0x06, 0x04, 0x01, 0x01, 0x07, 0x02, 0x1e, 0x00, 0x06, 0x04, + 0x05, 0x04, 0x06, 0x05, 0x32, 0x0a, 0x01, 0x00, 0x02, 0x07, 0x02, 0x00, + 0x07, 0x32, 0x00, 0x09, 0x00, 0x04, 0x06, 0x09, 0x04, 0x01, 0x00, 0x26, + 0x00, 0x07, 0x00, 0x01, 0x07, 0x01, 0x01, 0x00, 0x25, 0x0b, 0x01, 0x08, + 0x08, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x14, 0x1f, 0x00, 0x05, + 0x05, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x15, 0x02, 0x20, 0x09, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x47, 0x2d, 0x01, 0x05, 0x06, + 0x04, 0x01, 0x01, 0x07, 0x02, 0x1e, 0x00, 0x06, 0x04, 0x05, 0x04, 0x06, + 0x05, 0x32, 0x0a, 0x01, 0x00, 0x02, 0x07, 0x02, 0x00, 0x07, 0x32, 0x00, + 0x03, 0x0b, 0x01, 0x08, 0x09, 0x03, 0x08, 0x01, 0x00, 0x26, 0x00, 0x09, + 0x00, 0x04, 0x06, 0x09, 0x04, 0x01, 0x00, 0x26, 0x00, 0x07, 0x00, 0x01, + 0x07, 0x01, 0x01, 0x00, 0x25, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x24, + 0x00, 0x02, 0x02, 0x15, 0x02, 0x20, 0x08, 0x1b, 0x40, 0x51, 0x2d, 0x01, + 0x05, 0x06, 0x04, 0x01, 0x01, 0x07, 0x02, 0x1e, 0x00, 0x06, 0x04, 0x05, + 0x04, 0x06, 0x05, 0x32, 0x0a, 0x01, 0x00, 0x02, 0x07, 0x02, 0x00, 0x07, + 0x32, 0x00, 0x03, 0x0b, 0x01, 0x08, 0x09, 0x03, 0x08, 0x01, 0x00, 0x26, + 0x00, 0x09, 0x00, 0x04, 0x06, 0x09, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, + 0x00, 0x02, 0x00, 0x05, 0x02, 0x01, 0x00, 0x26, 0x00, 0x07, 0x01, 0x01, + 0x07, 0x01, 0x00, 0x23, 0x00, 0x07, 0x07, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x07, 0x01, 0x01, 0x00, 0x21, 0x09, 0x59, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x05, 0x32, 0x16, 0x1f, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x37, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x21, 0x1e, 0x03, 0x33, 0x32, 0x3e, + 0x02, 0x33, 0x32, 0x1f, 0x01, 0x0e, 0x01, 0x07, 0x0e, 0x03, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x3e, 0x02, 0x03, 0x22, 0x06, 0x07, 0x21, 0x34, 0x2e, + 0x02, 0x02, 0xe9, 0x07, 0x09, 0x02, 0x1c, 0x1e, 0x5d, 0x33, 0x58, 0x65, + 0x42, 0x34, 0x67, 0xad, 0x7e, 0x46, 0x41, 0x7a, 0xb0, 0x6e, 0x5b, 0x9a, + 0x70, 0x3f, 0x12, 0x19, 0xfd, 0x5e, 0x02, 0x30, 0x54, 0x74, 0x48, 0x43, + 0x61, 0x46, 0x2f, 0x11, 0x16, 0x0c, 0x32, 0x32, 0x93, 0x52, 0x14, 0x27, + 0x21, 0x14, 0x31, 0x2a, 0x17, 0x1e, 0x14, 0x0d, 0xbd, 0x81, 0x94, 0x12, + 0x02, 0x27, 0x22, 0x42, 0x5f, 0xd3, 0x08, 0x05, 0x42, 0x17, 0x1d, 0x4f, + 0x42, 0x35, 0x5d, 0x25, 0x02, 0x48, 0x8a, 0xc8, 0x81, 0x6a, 0xb8, 0x87, + 0x4d, 0x3d, 0x73, 0xa9, 0x6c, 0x2a, 0x1c, 0x60, 0x8e, 0x5f, 0x2f, 0x1f, + 0x24, 0x1f, 0x11, 0x41, 0x3c, 0x47, 0x0e, 0x0b, 0x1f, 0x26, 0x2e, 0x19, + 0x26, 0x2b, 0x07, 0x09, 0x08, 0x04, 0x55, 0x95, 0x84, 0x3e, 0x67, 0x4b, + 0x29, 0x00, 0x00, 0x01, 0x00, 0xa6, 0x00, 0x00, 0x01, 0x58, 0x03, 0xf5, + 0x00, 0x03, 0x00, 0x59, 0x40, 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, + 0x02, 0x01, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x0d, + 0x02, 0x01, 0x01, 0x01, 0x0e, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x20, + 0x02, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x0f, 0x02, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x02, + 0x1b, 0x40, 0x19, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x23, + 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x21, 0x03, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x23, + 0x11, 0x01, 0x58, 0xb2, 0x03, 0xf5, 0xfc, 0x0b, 0x03, 0xf5, 0x00, 0x01, + 0x00, 0x2c, 0x00, 0x00, 0x04, 0x15, 0x05, 0x99, 0x00, 0x11, 0x00, 0x85, + 0x40, 0x08, 0x11, 0x10, 0x09, 0x08, 0x07, 0x06, 0x03, 0x07, 0x2b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x1e, 0x0f, 0x0b, 0x0a, 0x05, 0x01, 0x00, + 0x06, 0x00, 0x02, 0x01, 0x1e, 0x00, 0x02, 0x02, 0x0b, 0x1f, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x24, 0x00, 0x01, 0x01, 0x0c, 0x01, 0x20, 0x04, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x1e, 0x0f, 0x0b, 0x0a, 0x05, + 0x01, 0x00, 0x06, 0x00, 0x02, 0x01, 0x1e, 0x00, 0x02, 0x00, 0x02, 0x34, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x24, 0x00, 0x01, 0x01, 0x0f, 0x01, + 0x20, 0x04, 0x1b, 0x40, 0x27, 0x0f, 0x0b, 0x0a, 0x05, 0x01, 0x00, 0x06, + 0x00, 0x02, 0x01, 0x1e, 0x00, 0x02, 0x00, 0x02, 0x34, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x24, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x21, 0x05, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x01, 0x25, 0x15, 0x14, 0x07, 0x05, 0x11, 0x21, 0x15, 0x21, 0x11, + 0x07, 0x35, 0x34, 0x3f, 0x01, 0x11, 0x33, 0x01, 0xa9, 0x01, 0x80, 0x1b, + 0xfe, 0x9b, 0x02, 0x6c, 0xfc, 0xd2, 0xbb, 0x19, 0xa2, 0xc2, 0x03, 0x25, + 0xc4, 0x81, 0x1d, 0x0e, 0xbc, 0xfe, 0x22, 0xa3, 0x02, 0x2a, 0x5f, 0x85, + 0x1a, 0x0d, 0x56, 0x02, 0xcc, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, + 0x02, 0x4b, 0x05, 0xc1, 0x00, 0x10, 0x00, 0x9b, 0x40, 0x0a, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x10, 0x09, 0x08, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x18, 0x0f, 0x0b, 0x0a, 0x07, 0x02, 0x01, 0x06, 0x00, + 0x01, 0x01, 0x1e, 0x02, 0x01, 0x01, 0x01, 0x0d, 0x1f, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x18, + 0x0f, 0x0b, 0x0a, 0x07, 0x02, 0x01, 0x06, 0x00, 0x01, 0x01, 0x1e, 0x02, + 0x01, 0x01, 0x01, 0x0d, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x03, + 0x1b, 0x4b, 0xb0, 0x8d, 0x50, 0x58, 0x40, 0x1a, 0x0f, 0x0b, 0x0a, 0x07, + 0x02, 0x01, 0x06, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x24, 0x02, 0x01, 0x01, 0x01, 0x0d, 0x00, 0x20, 0x03, 0x1b, 0x40, + 0x24, 0x0f, 0x0b, 0x0a, 0x07, 0x02, 0x01, 0x06, 0x00, 0x01, 0x01, 0x1e, + 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x23, 0x02, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x21, + 0x04, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x11, 0x37, 0x15, 0x14, + 0x06, 0x0f, 0x01, 0x11, 0x23, 0x11, 0x07, 0x35, 0x34, 0x3f, 0x01, 0x11, + 0x01, 0x99, 0xb2, 0x0c, 0x0f, 0x97, 0xb2, 0xb1, 0x19, 0x98, 0x05, 0xc1, + 0xfd, 0xc2, 0x4d, 0x66, 0x10, 0x15, 0x07, 0x43, 0xfd, 0x05, 0x02, 0xb9, + 0x4c, 0x69, 0x1d, 0x0b, 0x44, 0x02, 0x7f, 0x00, 0xff, 0xff, 0x00, 0xae, + 0x00, 0x00, 0x05, 0x38, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x07, 0x01, 0x0b, 0x01, 0xd0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x92, + 0x00, 0x00, 0x03, 0xdd, 0x05, 0xa9, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x76, 0x01, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5c, + 0xff, 0xf2, 0x08, 0x27, 0x05, 0xa9, 0x00, 0x1c, 0x00, 0x30, 0x02, 0x32, + 0x40, 0x1a, 0x00, 0x00, 0x2d, 0x2b, 0x23, 0x21, 0x00, 0x1c, 0x00, 0x1c, + 0x19, 0x17, 0x0f, 0x0d, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, + 0x02, 0x01, 0x0b, 0x07, 0x2b, 0x4b, 0xb0, 0x1e, 0x50, 0x58, 0x40, 0x33, + 0x1b, 0x01, 0x01, 0x00, 0x0b, 0x01, 0x03, 0x02, 0x02, 0x1e, 0x00, 0x01, + 0x00, 0x02, 0x03, 0x01, 0x02, 0x00, 0x00, 0x26, 0x08, 0x01, 0x00, 0x00, + 0x06, 0x01, 0x00, 0x24, 0x0a, 0x07, 0x02, 0x06, 0x06, 0x11, 0x1f, 0x09, + 0x01, 0x03, 0x03, 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x0c, + 0x04, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x22, 0x50, 0x58, 0x40, 0x3f, 0x1b, + 0x01, 0x01, 0x00, 0x0b, 0x01, 0x03, 0x02, 0x02, 0x1e, 0x00, 0x01, 0x00, + 0x02, 0x03, 0x01, 0x02, 0x00, 0x00, 0x26, 0x08, 0x01, 0x00, 0x00, 0x06, + 0x01, 0x00, 0x24, 0x00, 0x06, 0x06, 0x11, 0x1f, 0x08, 0x01, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x24, 0x0a, 0x01, 0x07, 0x07, 0x0b, 0x1f, 0x09, 0x01, + 0x03, 0x03, 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x0c, 0x04, + 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x2c, 0x50, 0x58, 0x40, 0x4b, 0x1b, 0x01, + 0x01, 0x00, 0x0b, 0x01, 0x03, 0x02, 0x02, 0x1e, 0x00, 0x01, 0x00, 0x02, + 0x03, 0x01, 0x02, 0x00, 0x00, 0x26, 0x08, 0x01, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x24, 0x00, 0x06, 0x06, 0x11, 0x1f, 0x08, 0x01, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x24, 0x0a, 0x01, 0x07, 0x07, 0x0b, 0x1f, 0x09, 0x01, 0x03, + 0x03, 0x04, 0x00, 0x00, 0x24, 0x00, 0x04, 0x04, 0x0c, 0x1f, 0x09, 0x01, + 0x03, 0x03, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x05, 0x15, 0x05, 0x20, + 0x0a, 0x1b, 0x4b, 0xb0, 0x30, 0x50, 0x58, 0x40, 0x49, 0x1b, 0x01, 0x01, + 0x00, 0x0b, 0x01, 0x03, 0x02, 0x02, 0x1e, 0x00, 0x01, 0x00, 0x02, 0x03, + 0x01, 0x02, 0x00, 0x00, 0x26, 0x00, 0x08, 0x08, 0x06, 0x01, 0x00, 0x24, + 0x00, 0x06, 0x06, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x24, + 0x0a, 0x01, 0x07, 0x07, 0x0b, 0x1f, 0x09, 0x01, 0x03, 0x03, 0x04, 0x00, + 0x00, 0x24, 0x00, 0x04, 0x04, 0x0c, 0x1f, 0x09, 0x01, 0x03, 0x03, 0x05, + 0x01, 0x00, 0x24, 0x00, 0x05, 0x05, 0x15, 0x05, 0x20, 0x0a, 0x1b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x47, 0x1b, 0x01, 0x01, 0x00, 0x0b, 0x01, + 0x03, 0x02, 0x02, 0x1e, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, 0x00, + 0x00, 0x26, 0x00, 0x08, 0x08, 0x06, 0x01, 0x00, 0x24, 0x00, 0x06, 0x06, + 0x11, 0x1f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x24, 0x0a, 0x01, 0x07, + 0x07, 0x0b, 0x1f, 0x00, 0x03, 0x03, 0x04, 0x00, 0x00, 0x24, 0x00, 0x04, + 0x04, 0x0c, 0x1f, 0x00, 0x09, 0x09, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, + 0x05, 0x15, 0x05, 0x20, 0x0a, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, + 0x43, 0x1b, 0x01, 0x01, 0x00, 0x0b, 0x01, 0x03, 0x02, 0x02, 0x1e, 0x00, + 0x06, 0x00, 0x08, 0x00, 0x06, 0x08, 0x01, 0x00, 0x26, 0x0a, 0x01, 0x07, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x26, 0x00, 0x01, 0x00, 0x02, + 0x03, 0x01, 0x02, 0x00, 0x00, 0x26, 0x00, 0x03, 0x03, 0x04, 0x00, 0x00, + 0x24, 0x00, 0x04, 0x04, 0x0f, 0x1f, 0x00, 0x09, 0x09, 0x05, 0x01, 0x00, + 0x24, 0x00, 0x05, 0x05, 0x15, 0x05, 0x20, 0x08, 0x1b, 0x40, 0x4a, 0x1b, + 0x01, 0x01, 0x00, 0x0b, 0x01, 0x03, 0x02, 0x02, 0x1e, 0x00, 0x06, 0x00, + 0x08, 0x00, 0x06, 0x08, 0x01, 0x00, 0x26, 0x0a, 0x01, 0x07, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x00, 0x00, 0x26, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, + 0x02, 0x00, 0x00, 0x26, 0x00, 0x09, 0x04, 0x05, 0x09, 0x01, 0x00, 0x23, + 0x00, 0x03, 0x00, 0x04, 0x05, 0x03, 0x04, 0x00, 0x00, 0x26, 0x00, 0x09, + 0x09, 0x05, 0x01, 0x00, 0x24, 0x00, 0x05, 0x09, 0x05, 0x01, 0x00, 0x21, + 0x08, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x15, + 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x35, 0x0e, 0x01, + 0x23, 0x22, 0x2e, 0x01, 0x02, 0x35, 0x34, 0x12, 0x3e, 0x01, 0x33, 0x32, + 0x16, 0x17, 0x35, 0x03, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x08, 0x27, 0xfd, 0x50, 0x02, + 0x2d, 0xfd, 0xd3, 0x02, 0xb0, 0xfc, 0xa4, 0x54, 0xfe, 0xa1, 0x8e, 0xea, + 0xa8, 0x5c, 0x5c, 0xa8, 0xea, 0x8e, 0xa1, 0xfe, 0x54, 0x17, 0x40, 0x77, + 0xa9, 0x68, 0x68, 0xa9, 0x78, 0x41, 0x41, 0x78, 0xa9, 0x68, 0x68, 0xa9, + 0x77, 0x40, 0x05, 0x99, 0x9e, 0xfe, 0x24, 0x98, 0xfe, 0x17, 0x9e, 0xf0, + 0x78, 0x86, 0x6b, 0xc1, 0x01, 0x0d, 0xa1, 0xa1, 0x01, 0x0d, 0xc3, 0x6c, + 0x87, 0x79, 0xf0, 0xfd, 0x33, 0x84, 0xd3, 0x94, 0x4f, 0x4f, 0x94, 0xd3, + 0x84, 0x84, 0xd3, 0x93, 0x4e, 0x4e, 0x93, 0xd3, 0x00, 0x03, 0x00, 0x48, + 0xff, 0xf2, 0x06, 0x75, 0x04, 0x05, 0x00, 0x30, 0x00, 0x40, 0x00, 0x4b, + 0x02, 0x64, 0x40, 0x24, 0x42, 0x41, 0x32, 0x31, 0x01, 0x00, 0x47, 0x46, + 0x41, 0x4b, 0x42, 0x4b, 0x3a, 0x38, 0x31, 0x40, 0x32, 0x40, 0x2c, 0x2a, + 0x22, 0x20, 0x1c, 0x1a, 0x14, 0x12, 0x0f, 0x0d, 0x09, 0x07, 0x00, 0x30, + 0x01, 0x30, 0x0e, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, 0x40, 0x3e, + 0x2e, 0x01, 0x0a, 0x08, 0x1e, 0x16, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, + 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, 0x00, 0x0a, 0x00, 0x01, 0x03, + 0x0a, 0x01, 0x01, 0x00, 0x26, 0x0d, 0x09, 0x02, 0x08, 0x08, 0x00, 0x01, + 0x00, 0x24, 0x06, 0x0b, 0x02, 0x00, 0x00, 0x14, 0x1f, 0x0c, 0x07, 0x02, + 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x12, 0x04, + 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x36, 0x50, 0x58, 0x40, 0x3e, 0x2e, 0x01, + 0x0a, 0x08, 0x1e, 0x16, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x03, 0x01, + 0x02, 0x01, 0x03, 0x02, 0x32, 0x00, 0x0a, 0x00, 0x01, 0x03, 0x0a, 0x01, + 0x01, 0x00, 0x26, 0x0d, 0x09, 0x02, 0x08, 0x08, 0x00, 0x01, 0x00, 0x24, + 0x06, 0x0b, 0x02, 0x00, 0x00, 0x14, 0x1f, 0x0c, 0x07, 0x02, 0x02, 0x02, + 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x15, 0x04, 0x20, 0x07, + 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x4b, 0x2e, 0x01, 0x0a, 0x08, + 0x1e, 0x16, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x03, 0x01, 0x02, 0x01, + 0x03, 0x02, 0x32, 0x00, 0x0a, 0x00, 0x01, 0x03, 0x0a, 0x01, 0x01, 0x00, + 0x26, 0x0d, 0x01, 0x09, 0x09, 0x00, 0x01, 0x00, 0x24, 0x06, 0x0b, 0x02, + 0x00, 0x00, 0x14, 0x1f, 0x00, 0x08, 0x08, 0x00, 0x01, 0x00, 0x24, 0x06, + 0x0b, 0x02, 0x00, 0x00, 0x14, 0x1f, 0x0c, 0x07, 0x02, 0x02, 0x02, 0x04, + 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x15, 0x04, 0x20, 0x09, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x43, 0x2e, 0x01, 0x0a, 0x08, 0x1e, + 0x16, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, + 0x02, 0x32, 0x0d, 0x01, 0x09, 0x08, 0x00, 0x09, 0x01, 0x00, 0x23, 0x06, + 0x0b, 0x02, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x08, 0x01, 0x00, 0x26, 0x00, + 0x0a, 0x00, 0x01, 0x03, 0x0a, 0x01, 0x01, 0x00, 0x26, 0x0c, 0x07, 0x02, + 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x04, 0x15, 0x04, + 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x4e, 0x50, 0x58, 0x40, 0x4e, 0x2e, 0x01, + 0x0a, 0x08, 0x1e, 0x16, 0x02, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x03, 0x01, + 0x02, 0x01, 0x03, 0x02, 0x32, 0x0d, 0x01, 0x09, 0x08, 0x00, 0x09, 0x01, + 0x00, 0x23, 0x06, 0x0b, 0x02, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x08, 0x01, + 0x00, 0x26, 0x00, 0x0a, 0x00, 0x01, 0x03, 0x0a, 0x01, 0x01, 0x00, 0x26, + 0x0c, 0x07, 0x02, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x23, 0x0c, 0x07, + 0x02, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x02, 0x04, + 0x01, 0x00, 0x21, 0x08, 0x1b, 0x4b, 0xb8, 0x03, 0xe8, 0x50, 0x58, 0x40, + 0x54, 0x2e, 0x01, 0x0a, 0x08, 0x1e, 0x16, 0x02, 0x02, 0x03, 0x02, 0x1e, + 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, 0x0d, 0x01, 0x09, 0x08, + 0x00, 0x09, 0x01, 0x00, 0x23, 0x06, 0x0b, 0x02, 0x00, 0x00, 0x08, 0x0a, + 0x00, 0x08, 0x01, 0x00, 0x26, 0x00, 0x0a, 0x00, 0x01, 0x03, 0x0a, 0x01, + 0x01, 0x00, 0x26, 0x00, 0x02, 0x07, 0x04, 0x02, 0x01, 0x00, 0x23, 0x0c, + 0x01, 0x07, 0x04, 0x04, 0x07, 0x01, 0x00, 0x23, 0x0c, 0x01, 0x07, 0x07, + 0x04, 0x01, 0x00, 0x24, 0x05, 0x01, 0x04, 0x07, 0x04, 0x01, 0x00, 0x21, + 0x09, 0x1b, 0x40, 0x55, 0x2e, 0x01, 0x0a, 0x08, 0x1e, 0x16, 0x02, 0x02, + 0x03, 0x02, 0x1e, 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, 0x0b, + 0x01, 0x00, 0x0d, 0x01, 0x09, 0x08, 0x00, 0x09, 0x01, 0x00, 0x26, 0x00, + 0x06, 0x00, 0x08, 0x0a, 0x06, 0x08, 0x01, 0x00, 0x26, 0x00, 0x0a, 0x00, + 0x01, 0x03, 0x0a, 0x01, 0x01, 0x00, 0x26, 0x00, 0x02, 0x07, 0x04, 0x02, + 0x01, 0x00, 0x23, 0x0c, 0x01, 0x07, 0x00, 0x05, 0x04, 0x07, 0x05, 0x01, + 0x00, 0x26, 0x00, 0x02, 0x02, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x02, + 0x04, 0x01, 0x00, 0x21, 0x09, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x01, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x21, 0x1e, + 0x03, 0x33, 0x32, 0x3e, 0x02, 0x33, 0x32, 0x1f, 0x01, 0x0e, 0x03, 0x23, + 0x22, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x01, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x01, 0x22, 0x0e, + 0x02, 0x07, 0x21, 0x34, 0x2e, 0x02, 0x04, 0xf4, 0x52, 0x8d, 0x67, 0x3b, + 0x10, 0x19, 0xfd, 0x8d, 0x04, 0x2e, 0x4d, 0x69, 0x41, 0x3d, 0x59, 0x40, + 0x2d, 0x12, 0x15, 0x0c, 0x33, 0x21, 0x57, 0x63, 0x6a, 0x34, 0x77, 0xbf, + 0x37, 0x36, 0xc1, 0x89, 0x64, 0xa4, 0x75, 0x40, 0x40, 0x77, 0xa7, 0x66, + 0x83, 0xbe, 0x35, 0x32, 0xbb, 0xfd, 0xa7, 0x8b, 0x88, 0x22, 0x44, 0x68, + 0x45, 0x47, 0x68, 0x45, 0x22, 0x89, 0x03, 0x65, 0x3d, 0x60, 0x45, 0x2a, + 0x07, 0x01, 0xfc, 0x1f, 0x3c, 0x57, 0x04, 0x05, 0x40, 0x7a, 0xaf, 0x70, + 0x29, 0x1d, 0x5b, 0x87, 0x5a, 0x2c, 0x1f, 0x24, 0x1f, 0x11, 0x41, 0x28, + 0x3b, 0x26, 0x13, 0x73, 0x77, 0x70, 0x7a, 0x49, 0x88, 0xc0, 0x78, 0x77, + 0xc1, 0x88, 0x4a, 0x79, 0x6e, 0x69, 0x7e, 0xfc, 0x78, 0xc9, 0xb4, 0x5a, + 0x8f, 0x62, 0x34, 0x34, 0x62, 0x8f, 0x5a, 0xb4, 0xc9, 0x03, 0x05, 0x29, + 0x4e, 0x70, 0x46, 0x41, 0x6f, 0x50, 0x2d, 0x00, 0xff, 0xff, 0x00, 0x3a, + 0xff, 0xf0, 0x03, 0xdb, 0x06, 0xf6, 0x00, 0x26, 0x00, 0x36, 0x00, 0x00, + 0x00, 0x07, 0x01, 0x0b, 0x01, 0x06, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3e, + 0xff, 0xf0, 0x03, 0x0f, 0x05, 0xa9, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x76, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3a, + 0xff, 0xf0, 0x03, 0xdb, 0x06, 0xdc, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, + 0x00, 0x07, 0x01, 0x0d, 0x01, 0x10, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3e, + 0xff, 0xf0, 0x03, 0x0f, 0x05, 0x99, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xdc, 0x00, 0x97, 0x00, 0x00, 0xff, 0xff, 0x00, 0x08, + 0x00, 0x00, 0x04, 0xe4, 0x06, 0xf2, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, + 0x00, 0x07, 0x01, 0x09, 0x01, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, + 0x00, 0x00, 0x04, 0x94, 0x06, 0xf6, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, + 0x00, 0x07, 0x01, 0x0b, 0x01, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, + 0x00, 0x00, 0x03, 0x55, 0x05, 0xa9, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x76, 0x00, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, + 0x00, 0x00, 0x04, 0x94, 0x07, 0x13, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, + 0x00, 0x07, 0x01, 0x0f, 0x01, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, + 0x00, 0x00, 0x03, 0x55, 0x05, 0xba, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xdf, 0x00, 0xb5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, + 0x00, 0x00, 0x04, 0x94, 0x06, 0xdc, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, + 0x00, 0x07, 0x01, 0x0d, 0x01, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, + 0x00, 0x00, 0x03, 0x55, 0x05, 0x99, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xdc, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6a, + 0xfe, 0xa0, 0x03, 0xf2, 0x05, 0xae, 0x00, 0x23, 0x00, 0xf9, 0x40, 0x14, + 0x00, 0x00, 0x00, 0x23, 0x00, 0x23, 0x22, 0x21, 0x1c, 0x1a, 0x17, 0x16, + 0x13, 0x12, 0x08, 0x06, 0x04, 0x03, 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x49, + 0x50, 0x58, 0x40, 0x2c, 0x0d, 0x01, 0x01, 0x06, 0x01, 0x1e, 0x05, 0x01, + 0x02, 0x07, 0x01, 0x06, 0x01, 0x02, 0x06, 0x00, 0x00, 0x26, 0x00, 0x04, + 0x04, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x11, 0x1f, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x02, 0x24, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x06, + 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x29, 0x0d, 0x01, 0x01, 0x06, + 0x01, 0x1e, 0x05, 0x01, 0x02, 0x07, 0x01, 0x06, 0x01, 0x02, 0x06, 0x00, + 0x00, 0x26, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0x25, 0x00, + 0x04, 0x04, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x11, 0x04, 0x20, + 0x05, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x33, 0x0d, 0x01, 0x01, + 0x06, 0x01, 0x1e, 0x00, 0x03, 0x00, 0x04, 0x02, 0x03, 0x04, 0x01, 0x00, + 0x26, 0x05, 0x01, 0x02, 0x07, 0x01, 0x06, 0x01, 0x02, 0x06, 0x00, 0x00, + 0x26, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x23, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x02, 0x24, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0x21, 0x06, + 0x1b, 0x40, 0x3a, 0x0d, 0x01, 0x01, 0x06, 0x01, 0x1e, 0x00, 0x02, 0x04, + 0x05, 0x04, 0x02, 0x05, 0x32, 0x00, 0x03, 0x00, 0x04, 0x02, 0x03, 0x04, + 0x01, 0x00, 0x26, 0x00, 0x05, 0x07, 0x01, 0x06, 0x01, 0x05, 0x06, 0x00, + 0x00, 0x26, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x23, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x02, 0x24, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0x21, + 0x07, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x03, 0x0e, 0x01, 0x23, + 0x35, 0x34, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x13, 0x27, 0x2e, 0x01, 0x3d, + 0x01, 0x33, 0x37, 0x3e, 0x01, 0x33, 0x15, 0x14, 0x06, 0x23, 0x22, 0x0e, + 0x02, 0x0f, 0x01, 0x21, 0x15, 0x02, 0xa1, 0x59, 0x19, 0xef, 0xd6, 0x3c, + 0x2d, 0x51, 0x3f, 0x2c, 0x08, 0x59, 0x9b, 0x15, 0x15, 0xd5, 0x15, 0x18, + 0xeb, 0xda, 0x1c, 0x1f, 0x2e, 0x51, 0x40, 0x2d, 0x09, 0x16, 0x01, 0x42, + 0x03, 0x00, 0xfd, 0x26, 0xcd, 0xb9, 0x5e, 0x39, 0x1a, 0x3a, 0x5c, 0x44, + 0x02, 0xd0, 0x0f, 0x02, 0x19, 0x13, 0x49, 0xa8, 0xc6, 0xbf, 0x62, 0x1d, + 0x17, 0x1a, 0x3a, 0x5d, 0x44, 0xa2, 0x81, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x04, 0x91, 0x02, 0x64, 0x05, 0x99, 0x00, 0x0d, 0x00, 0x5b, 0x40, 0x08, + 0x0d, 0x0c, 0x0b, 0x09, 0x02, 0x00, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x13, 0x05, 0x01, 0x00, 0x02, 0x01, 0x1e, 0x01, 0x01, + 0x00, 0x02, 0x00, 0x35, 0x00, 0x02, 0x02, 0x0b, 0x02, 0x20, 0x03, 0x1b, + 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x11, 0x05, 0x01, 0x00, 0x02, 0x01, + 0x1e, 0x00, 0x02, 0x00, 0x02, 0x34, 0x01, 0x01, 0x00, 0x00, 0x2b, 0x03, + 0x1b, 0x40, 0x15, 0x05, 0x01, 0x01, 0x02, 0x01, 0x1e, 0x00, 0x02, 0x01, + 0x02, 0x34, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x00, 0x00, 0x2b, 0x04, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x23, 0x22, 0x2f, 0x02, 0x0f, 0x01, + 0x0e, 0x01, 0x2b, 0x01, 0x13, 0x33, 0x02, 0x64, 0x77, 0x15, 0x13, 0x80, + 0x11, 0x10, 0x81, 0x06, 0x16, 0x0c, 0x7b, 0xdf, 0xa6, 0x04, 0x91, 0x0e, + 0x7e, 0x11, 0x11, 0x7e, 0x05, 0x09, 0x01, 0x08, 0x00, 0x01, 0x00, 0x00, + 0x04, 0x91, 0x02, 0x64, 0x05, 0x99, 0x00, 0x11, 0x00, 0x5b, 0x40, 0x08, + 0x11, 0x10, 0x0f, 0x0d, 0x02, 0x00, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x13, 0x07, 0x01, 0x02, 0x00, 0x01, 0x1e, 0x00, 0x02, + 0x00, 0x02, 0x35, 0x01, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x20, 0x03, 0x1b, + 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x11, 0x07, 0x01, 0x02, 0x00, 0x01, + 0x1e, 0x01, 0x01, 0x00, 0x02, 0x00, 0x34, 0x00, 0x02, 0x02, 0x2b, 0x03, + 0x1b, 0x40, 0x15, 0x07, 0x01, 0x02, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x01, + 0x00, 0x34, 0x00, 0x01, 0x02, 0x01, 0x34, 0x00, 0x02, 0x02, 0x2b, 0x04, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x11, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x16, + 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x03, 0x23, 0x7b, + 0x0c, 0x16, 0x06, 0x80, 0x0b, 0x06, 0x05, 0x07, 0x05, 0x80, 0x06, 0x17, + 0x0b, 0x77, 0xdf, 0xa6, 0x05, 0x99, 0x0a, 0x05, 0x7d, 0x09, 0x0a, 0x05, + 0x0a, 0x04, 0x7d, 0x06, 0x09, 0xfe, 0xf8, 0x00, 0xff, 0xff, 0x00, 0x14, + 0x04, 0xcf, 0x02, 0x52, 0x05, 0x44, 0x02, 0x06, 0x00, 0x71, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x20, 0x04, 0x8c, 0x02, 0x44, 0x05, 0x99, 0x00, 0x15, + 0x00, 0x7a, 0x40, 0x0e, 0x01, 0x00, 0x11, 0x10, 0x0c, 0x0a, 0x06, 0x05, + 0x00, 0x15, 0x01, 0x15, 0x05, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x12, 0x00, 0x02, 0x04, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x25, + 0x03, 0x01, 0x01, 0x01, 0x0b, 0x01, 0x20, 0x02, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x1e, 0x03, 0x01, 0x01, 0x02, 0x01, 0x34, 0x00, 0x02, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, + 0x24, 0x04, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x21, 0x04, 0x1b, 0x40, + 0x22, 0x00, 0x01, 0x03, 0x01, 0x34, 0x00, 0x03, 0x02, 0x03, 0x34, 0x00, + 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x00, 0x01, + 0x00, 0x24, 0x04, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x21, 0x05, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x22, 0x2e, 0x02, 0x35, 0x33, 0x14, 0x1e, + 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x33, 0x14, 0x0e, 0x02, 0x01, 0x32, + 0x4d, 0x68, 0x41, 0x1c, 0x7e, 0x0e, 0x22, 0x39, 0x2b, 0x2b, 0x39, 0x22, + 0x0e, 0x7e, 0x1c, 0x41, 0x69, 0x04, 0x8c, 0x2b, 0x49, 0x62, 0x37, 0x21, + 0x39, 0x28, 0x17, 0x17, 0x28, 0x39, 0x21, 0x37, 0x62, 0x49, 0x2b, 0x00, + 0x00, 0x01, 0x00, 0xb4, 0x04, 0xbd, 0x01, 0xb1, 0x05, 0xba, 0x00, 0x13, + 0x00, 0x1c, 0x40, 0x06, 0x10, 0x0e, 0x06, 0x04, 0x02, 0x07, 0x2b, 0x40, + 0x0e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0d, + 0x00, 0x20, 0x02, 0xb0, 0x38, 0x2b, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x01, 0xb1, + 0x15, 0x23, 0x2e, 0x1a, 0x1a, 0x2d, 0x22, 0x14, 0x14, 0x22, 0x2d, 0x1a, + 0x1a, 0x2e, 0x23, 0x15, 0x05, 0x3a, 0x1a, 0x2d, 0x22, 0x14, 0x14, 0x22, + 0x2d, 0x1a, 0x1a, 0x2f, 0x23, 0x14, 0x14, 0x23, 0x2f, 0x00, 0x00, 0x02, + 0x00, 0x6a, 0x04, 0x6b, 0x01, 0xfb, 0x05, 0xde, 0x00, 0x13, 0x00, 0x1f, + 0x00, 0x53, 0x40, 0x0a, 0x1e, 0x1c, 0x18, 0x16, 0x10, 0x0e, 0x06, 0x04, + 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x1c, 0x50, 0x58, 0x40, 0x17, 0x00, 0x02, + 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x25, 0x00, 0x03, 0x03, 0x00, 0x01, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x0d, 0x03, 0x20, 0x03, 0x1b, 0x40, 0x21, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x02, + 0x01, 0x01, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x21, 0x04, 0x59, 0xb0, 0x38, + 0x2b, 0x13, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x2e, 0x02, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x6a, 0x20, 0x37, 0x48, 0x28, 0x29, 0x49, + 0x38, 0x20, 0x20, 0x38, 0x49, 0x29, 0x28, 0x48, 0x37, 0x20, 0x64, 0x36, + 0x2f, 0x2d, 0x37, 0x37, 0x2d, 0x2f, 0x36, 0x05, 0x23, 0x2a, 0x44, 0x32, + 0x1b, 0x1b, 0x32, 0x44, 0x2a, 0x29, 0x44, 0x30, 0x1b, 0x1b, 0x30, 0x44, + 0x29, 0x2c, 0x38, 0x38, 0x2c, 0x2d, 0x38, 0x38, 0x00, 0x01, 0x00, 0x86, + 0xfe, 0xaa, 0x01, 0xf1, 0x00, 0x0d, 0x00, 0x1c, 0x00, 0x88, 0x40, 0x0c, + 0x01, 0x00, 0x19, 0x17, 0x08, 0x06, 0x00, 0x1c, 0x01, 0x1c, 0x04, 0x07, + 0x2b, 0x4b, 0xb0, 0x15, 0x50, 0x58, 0x40, 0x1b, 0x04, 0x01, 0x01, 0x00, + 0x01, 0x1e, 0x10, 0x0f, 0x02, 0x00, 0x1c, 0x02, 0x03, 0x02, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x10, 0x01, 0x20, 0x04, 0x1b, + 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, 0x1f, 0x04, 0x01, 0x01, 0x02, 0x01, + 0x1e, 0x10, 0x0f, 0x02, 0x00, 0x1c, 0x03, 0x01, 0x00, 0x02, 0x00, 0x34, + 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x10, 0x01, + 0x20, 0x05, 0x1b, 0x40, 0x28, 0x04, 0x01, 0x01, 0x02, 0x01, 0x1e, 0x10, + 0x0f, 0x02, 0x00, 0x1c, 0x03, 0x01, 0x00, 0x02, 0x00, 0x34, 0x00, 0x02, + 0x01, 0x01, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x05, 0x32, 0x16, 0x1f, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x3e, 0x02, 0x37, 0x17, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x3e, 0x02, 0x01, 0xc3, 0x07, 0x09, 0x02, 0x1c, 0x1e, 0x5d, 0x33, + 0x58, 0x65, 0x19, 0x2b, 0x3b, 0x22, 0x5c, 0x14, 0x2a, 0x22, 0x16, 0x31, + 0x2a, 0x17, 0x1e, 0x14, 0x0d, 0xd3, 0x08, 0x05, 0x42, 0x17, 0x1d, 0x4f, + 0x42, 0x1f, 0x3b, 0x36, 0x2f, 0x13, 0x0d, 0x0b, 0x1f, 0x27, 0x2f, 0x1a, + 0x26, 0x2b, 0x07, 0x09, 0x08, 0x00, 0x00, 0x01, 0x00, 0x12, 0x04, 0xae, + 0x02, 0x59, 0x05, 0x89, 0x00, 0x1a, 0x00, 0xd3, 0x40, 0x12, 0x01, 0x00, + 0x17, 0x15, 0x11, 0x10, 0x0f, 0x0d, 0x0a, 0x08, 0x04, 0x03, 0x00, 0x1a, + 0x01, 0x1a, 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x2e, 0x50, 0x58, 0x40, 0x1a, + 0x06, 0x01, 0x00, 0x04, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00, 0x25, 0x00, + 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x05, 0x01, 0x01, 0x01, 0x0b, 0x03, + 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0x4d, 0x50, 0x58, 0x40, 0x25, 0x06, 0x01, + 0x00, 0x03, 0x02, 0x00, 0x01, 0x00, 0x23, 0x05, 0x01, 0x01, 0x00, 0x03, + 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x06, 0x01, 0x00, 0x00, 0x02, 0x01, + 0x00, 0x24, 0x04, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00, 0x21, 0x04, 0x1b, + 0x4b, 0xb0, 0x70, 0x50, 0x58, 0x40, 0x2c, 0x00, 0x01, 0x05, 0x00, 0x05, + 0x01, 0x00, 0x32, 0x06, 0x01, 0x00, 0x03, 0x02, 0x00, 0x01, 0x00, 0x23, + 0x00, 0x05, 0x00, 0x03, 0x02, 0x05, 0x03, 0x01, 0x00, 0x26, 0x06, 0x01, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x04, 0x01, 0x02, 0x00, 0x02, 0x01, + 0x00, 0x21, 0x05, 0x1b, 0x40, 0x33, 0x00, 0x01, 0x05, 0x00, 0x05, 0x01, + 0x00, 0x32, 0x00, 0x04, 0x03, 0x02, 0x03, 0x04, 0x02, 0x32, 0x06, 0x01, + 0x00, 0x03, 0x02, 0x00, 0x01, 0x00, 0x23, 0x00, 0x05, 0x00, 0x03, 0x04, + 0x05, 0x03, 0x01, 0x00, 0x26, 0x06, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, + 0x24, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x32, 0x36, 0x37, 0x33, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x23, 0x22, 0x07, 0x23, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x01, 0xa1, 0x24, 0x27, 0x01, 0x6c, 0x19, 0x2f, 0x41, 0x28, + 0x23, 0x3d, 0x36, 0x30, 0x17, 0x48, 0x02, 0x6f, 0x1a, 0x30, 0x42, 0x27, + 0x23, 0x3d, 0x36, 0x2f, 0x05, 0x2d, 0x2a, 0x2c, 0x2f, 0x4f, 0x38, 0x1f, + 0x1d, 0x22, 0x1d, 0x58, 0x30, 0x4f, 0x39, 0x1f, 0x1d, 0x22, 0x1d, 0x00, + 0x00, 0x02, 0x00, 0x5e, 0x04, 0x8b, 0x02, 0xe7, 0x05, 0xa9, 0x00, 0x09, + 0x00, 0x13, 0x00, 0x83, 0x40, 0x12, 0x0a, 0x0a, 0x00, 0x00, 0x0a, 0x13, + 0x0a, 0x12, 0x0f, 0x0d, 0x00, 0x09, 0x00, 0x08, 0x05, 0x03, 0x06, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x12, 0x02, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x24, 0x05, 0x03, 0x04, 0x03, 0x01, 0x01, 0x11, 0x00, + 0x20, 0x02, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x1e, 0x05, 0x03, + 0x04, 0x03, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x23, 0x05, 0x03, 0x04, + 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x02, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x21, 0x03, 0x1b, 0x40, 0x27, 0x05, 0x01, 0x03, 0x01, 0x02, + 0x01, 0x03, 0x02, 0x32, 0x00, 0x00, 0x02, 0x00, 0x35, 0x04, 0x01, 0x01, + 0x03, 0x02, 0x01, 0x01, 0x00, 0x23, 0x04, 0x01, 0x01, 0x01, 0x02, 0x01, + 0x00, 0x24, 0x00, 0x02, 0x01, 0x02, 0x01, 0x00, 0x21, 0x05, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x03, 0x0e, 0x01, 0x2b, 0x01, 0x37, 0x3e, 0x01, + 0x33, 0x21, 0x03, 0x0e, 0x01, 0x2b, 0x01, 0x37, 0x3e, 0x01, 0x33, 0x01, + 0xad, 0xc7, 0x0c, 0x1d, 0x15, 0x4a, 0x8a, 0x0d, 0x21, 0x21, 0x01, 0xb0, + 0xf3, 0x0e, 0x1b, 0x14, 0x56, 0xb4, 0x10, 0x1e, 0x21, 0x05, 0xa9, 0xfe, + 0xfe, 0x10, 0x0c, 0xf2, 0x17, 0x15, 0xfe, 0xfe, 0x0f, 0x0d, 0xf2, 0x16, + 0x16, 0x00, 0x00, 0x01, 0x00, 0x30, 0xff, 0xf4, 0x04, 0xaf, 0x03, 0xf5, + 0x00, 0x21, 0x01, 0x22, 0x40, 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x20, + 0x1b, 0x1a, 0x17, 0x14, 0x0e, 0x0c, 0x09, 0x08, 0x07, 0x06, 0x05, 0x03, + 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x28, 0x50, 0x58, 0x40, 0x24, 0x10, 0x01, + 0x01, 0x04, 0x01, 0x1e, 0x05, 0x02, 0x02, 0x00, 0x00, 0x06, 0x01, 0x00, + 0x24, 0x07, 0x01, 0x06, 0x06, 0x0e, 0x1f, 0x00, 0x04, 0x04, 0x01, 0x01, + 0x00, 0x24, 0x03, 0x01, 0x01, 0x01, 0x0c, 0x01, 0x20, 0x05, 0x1b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x28, 0x10, 0x01, 0x01, 0x04, 0x01, 0x1e, + 0x05, 0x02, 0x02, 0x00, 0x00, 0x06, 0x01, 0x00, 0x24, 0x07, 0x01, 0x06, + 0x06, 0x0e, 0x1f, 0x00, 0x01, 0x01, 0x0c, 0x1f, 0x00, 0x04, 0x04, 0x03, + 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x15, 0x03, 0x20, 0x06, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x26, 0x10, 0x01, 0x01, 0x04, 0x01, 0x1e, + 0x07, 0x01, 0x06, 0x05, 0x02, 0x02, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x01, 0x01, 0x0f, 0x1f, 0x00, 0x04, 0x04, 0x03, 0x01, 0x00, + 0x24, 0x00, 0x03, 0x03, 0x15, 0x03, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x32, 0x10, 0x01, 0x01, 0x04, 0x01, 0x1e, 0x00, 0x01, + 0x04, 0x03, 0x04, 0x01, 0x03, 0x32, 0x07, 0x01, 0x06, 0x05, 0x02, 0x02, + 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x26, 0x00, 0x04, 0x01, 0x03, 0x04, + 0x01, 0x00, 0x23, 0x00, 0x04, 0x04, 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, + 0x04, 0x03, 0x01, 0x00, 0x21, 0x06, 0x1b, 0x40, 0x3e, 0x10, 0x01, 0x01, + 0x04, 0x01, 0x1e, 0x00, 0x05, 0x06, 0x02, 0x02, 0x05, 0x2a, 0x00, 0x00, + 0x02, 0x04, 0x02, 0x00, 0x2a, 0x00, 0x01, 0x04, 0x03, 0x04, 0x01, 0x03, + 0x32, 0x07, 0x01, 0x06, 0x00, 0x02, 0x00, 0x06, 0x02, 0x00, 0x00, 0x26, + 0x00, 0x04, 0x01, 0x03, 0x04, 0x01, 0x00, 0x23, 0x00, 0x04, 0x04, 0x03, + 0x01, 0x00, 0x24, 0x00, 0x03, 0x04, 0x03, 0x01, 0x00, 0x21, 0x08, 0x59, + 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x15, 0x14, 0x06, 0x2b, 0x01, + 0x11, 0x23, 0x11, 0x21, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x3e, 0x03, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x04, 0xaf, 0x1e, 0x1d, 0x88, 0xb2, 0xfe, 0x73, 0x79, 0x81, 0x22, + 0x42, 0x1f, 0x07, 0x02, 0x08, 0x10, 0x1a, 0x14, 0x42, 0x39, 0xbd, 0x09, + 0x11, 0x1a, 0x11, 0x03, 0xf5, 0x48, 0x17, 0x24, 0xfc, 0x8e, 0x03, 0x72, + 0xfd, 0x82, 0x77, 0x89, 0x0c, 0x11, 0x4b, 0x09, 0x0b, 0x05, 0x01, 0x3e, + 0x42, 0x02, 0x7c, 0x40, 0x0b, 0x18, 0x13, 0x0d, 0x00, 0x01, 0x00, 0x9c, + 0x02, 0x0d, 0x03, 0xbc, 0x02, 0x8f, 0x00, 0x03, 0x00, 0x25, 0x40, 0x06, + 0x03, 0x02, 0x01, 0x00, 0x02, 0x07, 0x2b, 0x40, 0x17, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x03, 0xb0, 0x38, 0x2b, 0x13, + 0x21, 0x15, 0x21, 0x9c, 0x03, 0x20, 0xfc, 0xe0, 0x02, 0x8f, 0x82, 0x00, + 0x00, 0x01, 0x00, 0x9c, 0x02, 0x0d, 0x05, 0xce, 0x02, 0x8f, 0x00, 0x03, + 0x00, 0x25, 0x40, 0x06, 0x03, 0x02, 0x01, 0x00, 0x02, 0x07, 0x2b, 0x40, + 0x17, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x03, + 0xb0, 0x38, 0x2b, 0x13, 0x21, 0x15, 0x21, 0x9c, 0x05, 0x32, 0xfa, 0xce, + 0x02, 0x8f, 0x82, 0x00, 0x00, 0x01, 0x00, 0x3a, 0x03, 0xf4, 0x01, 0x27, + 0x05, 0xf9, 0x00, 0x18, 0x00, 0x07, 0x40, 0x04, 0x06, 0x00, 0x01, 0x0b, + 0x2b, 0x13, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x17, 0x1e, 0x01, 0x15, + 0x14, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, + 0x72, 0x1d, 0x1b, 0x59, 0x50, 0x37, 0x08, 0x05, 0x0a, 0x10, 0x1e, 0x18, + 0x0e, 0x13, 0x17, 0x07, 0x1b, 0x03, 0xf4, 0x30, 0x61, 0x30, 0x5a, 0xa5, + 0x45, 0x22, 0x05, 0x0c, 0x06, 0x0e, 0x0a, 0x14, 0x2c, 0x31, 0x36, 0x1e, + 0x20, 0x44, 0x26, 0x0b, 0x0c, 0x18, 0x0a, 0x00, 0x00, 0x01, 0x00, 0x5a, + 0x03, 0xdf, 0x01, 0x46, 0x05, 0xe4, 0x00, 0x18, 0x00, 0x07, 0x40, 0x04, + 0x00, 0x06, 0x01, 0x0b, 0x2b, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, + 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x27, + 0x26, 0x35, 0x34, 0x37, 0x01, 0x0f, 0x1d, 0x1a, 0x59, 0x4f, 0x37, 0x08, + 0x05, 0x0a, 0x10, 0x1e, 0x18, 0x0e, 0x13, 0x17, 0x07, 0x1b, 0x05, 0xe4, + 0x30, 0x60, 0x30, 0x5b, 0xa5, 0x45, 0x22, 0x05, 0x0c, 0x06, 0x0e, 0x0a, + 0x13, 0x2d, 0x31, 0x36, 0x1e, 0x20, 0x44, 0x26, 0x0b, 0x0b, 0x18, 0x0b, + 0x00, 0x01, 0x00, 0x5a, 0xfe, 0xec, 0x01, 0x46, 0x00, 0xf1, 0x00, 0x18, + 0x00, 0x07, 0x40, 0x04, 0x00, 0x06, 0x01, 0x0b, 0x2b, 0x25, 0x1e, 0x01, + 0x15, 0x14, 0x06, 0x07, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x3e, 0x03, + 0x35, 0x34, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x01, 0x0f, 0x1d, 0x1a, + 0x59, 0x4f, 0x37, 0x08, 0x05, 0x0a, 0x10, 0x1e, 0x18, 0x0e, 0x13, 0x17, + 0x07, 0x1b, 0xf1, 0x30, 0x60, 0x30, 0x5b, 0xa5, 0x45, 0x22, 0x05, 0x0c, + 0x06, 0x0e, 0x0a, 0x13, 0x2d, 0x31, 0x36, 0x1e, 0x20, 0x44, 0x26, 0x0b, + 0x0b, 0x18, 0x0b, 0x00, 0x00, 0x02, 0x00, 0x3a, 0x03, 0xf4, 0x02, 0x57, + 0x05, 0xf9, 0x00, 0x18, 0x00, 0x31, 0x00, 0x09, 0x40, 0x06, 0x1f, 0x19, + 0x06, 0x00, 0x02, 0x0b, 0x2b, 0x13, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, + 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x17, + 0x16, 0x15, 0x14, 0x07, 0x17, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x17, + 0x1e, 0x01, 0x15, 0x14, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x17, 0x16, + 0x15, 0x14, 0x07, 0x72, 0x1d, 0x1b, 0x59, 0x50, 0x37, 0x08, 0x05, 0x0a, + 0x10, 0x1e, 0x18, 0x0e, 0x13, 0x17, 0x07, 0x1b, 0xc3, 0x1d, 0x1b, 0x59, + 0x50, 0x37, 0x08, 0x05, 0x0a, 0x10, 0x1e, 0x18, 0x0e, 0x13, 0x17, 0x07, + 0x1b, 0x03, 0xf4, 0x30, 0x61, 0x30, 0x5a, 0xa5, 0x45, 0x22, 0x05, 0x0c, + 0x06, 0x0e, 0x0a, 0x14, 0x2c, 0x31, 0x36, 0x1e, 0x20, 0x44, 0x26, 0x0b, + 0x0c, 0x18, 0x0a, 0x2c, 0x30, 0x61, 0x30, 0x5a, 0xa5, 0x45, 0x22, 0x05, + 0x0c, 0x06, 0x0e, 0x0a, 0x14, 0x2c, 0x31, 0x36, 0x1e, 0x20, 0x44, 0x26, + 0x0b, 0x0c, 0x18, 0x0a, 0x00, 0x02, 0x00, 0x5a, 0x03, 0xdf, 0x02, 0x76, + 0x05, 0xe4, 0x00, 0x18, 0x00, 0x31, 0x00, 0x09, 0x40, 0x06, 0x19, 0x1f, + 0x00, 0x06, 0x02, 0x0b, 0x2b, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, + 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x27, + 0x26, 0x35, 0x34, 0x37, 0x25, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x27, + 0x2e, 0x01, 0x35, 0x34, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x27, 0x26, + 0x35, 0x34, 0x37, 0x01, 0x0f, 0x1d, 0x1a, 0x59, 0x4f, 0x37, 0x08, 0x05, + 0x0a, 0x10, 0x1e, 0x18, 0x0e, 0x13, 0x17, 0x07, 0x1b, 0x01, 0x9d, 0x1d, + 0x1a, 0x59, 0x4f, 0x37, 0x08, 0x05, 0x0a, 0x10, 0x1e, 0x18, 0x0e, 0x13, + 0x17, 0x07, 0x1b, 0x05, 0xe4, 0x30, 0x60, 0x30, 0x5b, 0xa5, 0x45, 0x22, + 0x05, 0x0c, 0x06, 0x0e, 0x0a, 0x13, 0x2d, 0x31, 0x36, 0x1e, 0x20, 0x44, + 0x26, 0x0b, 0x0b, 0x18, 0x0b, 0x2c, 0x30, 0x60, 0x30, 0x5b, 0xa5, 0x45, + 0x22, 0x05, 0x0c, 0x06, 0x0e, 0x0a, 0x13, 0x2d, 0x31, 0x36, 0x1e, 0x20, + 0x44, 0x26, 0x0b, 0x0b, 0x18, 0x0b, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0xec, + 0x02, 0x76, 0x00, 0xf1, 0x00, 0x18, 0x00, 0x31, 0x00, 0x09, 0x40, 0x06, + 0x19, 0x1f, 0x00, 0x06, 0x02, 0x0b, 0x2b, 0x25, 0x1e, 0x01, 0x15, 0x14, + 0x06, 0x07, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x3e, 0x03, 0x35, 0x34, + 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x25, 0x1e, 0x01, 0x15, 0x14, 0x06, + 0x07, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x26, + 0x27, 0x26, 0x35, 0x34, 0x37, 0x01, 0x0f, 0x1d, 0x1a, 0x59, 0x4f, 0x37, + 0x08, 0x05, 0x0a, 0x10, 0x1e, 0x18, 0x0e, 0x13, 0x17, 0x07, 0x1b, 0x01, + 0x9d, 0x1d, 0x1a, 0x59, 0x4f, 0x37, 0x08, 0x05, 0x0a, 0x10, 0x1e, 0x18, + 0x0e, 0x13, 0x17, 0x07, 0x1b, 0xf1, 0x30, 0x60, 0x30, 0x5b, 0xa5, 0x45, + 0x22, 0x05, 0x0c, 0x06, 0x0e, 0x0a, 0x13, 0x2d, 0x31, 0x36, 0x1e, 0x20, + 0x44, 0x26, 0x0b, 0x0b, 0x18, 0x0b, 0x2c, 0x30, 0x60, 0x30, 0x5b, 0xa5, + 0x45, 0x22, 0x05, 0x0c, 0x06, 0x0e, 0x0a, 0x13, 0x2d, 0x31, 0x36, 0x1e, + 0x20, 0x44, 0x26, 0x0b, 0x0b, 0x18, 0x0b, 0x00, 0x00, 0x01, 0x00, 0x76, + 0xfe, 0x9a, 0x04, 0x12, 0x05, 0xc2, 0x00, 0x1f, 0x01, 0x6e, 0x40, 0x0e, + 0x1f, 0x1e, 0x1b, 0x19, 0x16, 0x15, 0x12, 0x10, 0x0c, 0x0a, 0x04, 0x02, + 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x3d, 0x50, 0x58, 0x40, 0x2b, 0x0d, 0x09, + 0x02, 0x00, 0x01, 0x0e, 0x08, 0x02, 0x03, 0x00, 0x1c, 0x18, 0x02, 0x04, + 0x03, 0x03, 0x1e, 0x00, 0x01, 0x01, 0x0d, 0x1f, 0x05, 0x01, 0x03, 0x03, + 0x00, 0x01, 0x00, 0x24, 0x02, 0x01, 0x00, 0x00, 0x0e, 0x1f, 0x00, 0x04, + 0x04, 0x16, 0x04, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, + 0x29, 0x0d, 0x09, 0x02, 0x00, 0x01, 0x0e, 0x08, 0x02, 0x03, 0x00, 0x1c, + 0x18, 0x02, 0x04, 0x03, 0x03, 0x1e, 0x02, 0x01, 0x00, 0x05, 0x01, 0x03, + 0x04, 0x00, 0x03, 0x00, 0x00, 0x26, 0x00, 0x01, 0x01, 0x0d, 0x1f, 0x00, + 0x04, 0x04, 0x16, 0x04, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x7c, 0x50, 0x58, + 0x40, 0x2b, 0x0d, 0x09, 0x02, 0x00, 0x01, 0x0e, 0x08, 0x02, 0x03, 0x00, + 0x1c, 0x18, 0x02, 0x04, 0x03, 0x03, 0x1e, 0x02, 0x01, 0x00, 0x05, 0x01, + 0x03, 0x04, 0x00, 0x03, 0x00, 0x00, 0x26, 0x00, 0x04, 0x04, 0x01, 0x01, + 0x00, 0x24, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x20, 0x04, 0x1b, 0x4b, 0xb0, + 0x4e, 0x50, 0x58, 0x40, 0x34, 0x0d, 0x09, 0x02, 0x00, 0x01, 0x0e, 0x08, + 0x02, 0x03, 0x00, 0x1c, 0x18, 0x02, 0x04, 0x03, 0x03, 0x1e, 0x00, 0x01, + 0x00, 0x04, 0x01, 0x01, 0x00, 0x23, 0x02, 0x01, 0x00, 0x05, 0x01, 0x03, + 0x04, 0x00, 0x03, 0x00, 0x00, 0x26, 0x00, 0x01, 0x01, 0x04, 0x01, 0x00, + 0x24, 0x00, 0x04, 0x01, 0x04, 0x01, 0x00, 0x21, 0x05, 0x1b, 0x4b, 0xb8, + 0x03, 0xe8, 0x50, 0x58, 0x40, 0x3b, 0x0d, 0x09, 0x02, 0x00, 0x01, 0x0e, + 0x08, 0x02, 0x03, 0x02, 0x1c, 0x18, 0x02, 0x04, 0x03, 0x03, 0x1e, 0x00, + 0x01, 0x00, 0x04, 0x01, 0x01, 0x00, 0x23, 0x00, 0x00, 0x02, 0x03, 0x00, + 0x01, 0x00, 0x23, 0x00, 0x02, 0x05, 0x01, 0x03, 0x04, 0x02, 0x03, 0x00, + 0x00, 0x26, 0x00, 0x01, 0x01, 0x04, 0x01, 0x00, 0x24, 0x00, 0x04, 0x01, + 0x04, 0x01, 0x00, 0x21, 0x06, 0x1b, 0x40, 0x3c, 0x0d, 0x09, 0x02, 0x00, + 0x01, 0x0e, 0x08, 0x02, 0x05, 0x02, 0x1c, 0x18, 0x02, 0x04, 0x03, 0x03, + 0x1e, 0x00, 0x01, 0x00, 0x04, 0x01, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x05, 0x03, 0x00, 0x05, 0x00, 0x00, 0x26, 0x00, 0x02, 0x00, 0x03, 0x04, + 0x02, 0x03, 0x00, 0x00, 0x26, 0x00, 0x01, 0x01, 0x04, 0x01, 0x00, 0x24, + 0x00, 0x04, 0x01, 0x04, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, 0x59, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x17, + 0x03, 0x36, 0x33, 0x32, 0x17, 0x03, 0x3e, 0x01, 0x37, 0x32, 0x16, 0x1d, + 0x01, 0x21, 0x11, 0x13, 0x06, 0x23, 0x22, 0x27, 0x13, 0x11, 0x21, 0x76, + 0x29, 0x2b, 0x22, 0x4c, 0x50, 0x50, 0x27, 0x18, 0x28, 0x35, 0x37, 0x26, + 0x17, 0x4e, 0xa1, 0x45, 0x2c, 0x28, 0xfe, 0x78, 0x17, 0x26, 0x37, 0x35, + 0x28, 0x18, 0xfe, 0x77, 0x03, 0x96, 0x1f, 0x30, 0x09, 0x0a, 0x0c, 0x03, + 0x01, 0xe8, 0x17, 0x17, 0xfe, 0x18, 0x07, 0x1a, 0x01, 0x30, 0x1f, 0x3c, + 0xfe, 0x60, 0xfc, 0xf7, 0x17, 0x17, 0x03, 0x09, 0x01, 0xa0, 0x00, 0x01, + 0x00, 0x76, 0xfe, 0x9a, 0x04, 0x12, 0x05, 0xc2, 0x00, 0x2f, 0x01, 0xe4, + 0x40, 0x16, 0x2f, 0x2e, 0x2d, 0x2c, 0x29, 0x27, 0x23, 0x21, 0x1d, 0x1b, + 0x18, 0x17, 0x16, 0x15, 0x12, 0x10, 0x0c, 0x0a, 0x04, 0x02, 0x0a, 0x07, + 0x2b, 0x4b, 0xb0, 0x3d, 0x50, 0x58, 0x40, 0x3c, 0x0d, 0x09, 0x02, 0x00, + 0x01, 0x0e, 0x08, 0x02, 0x03, 0x00, 0x25, 0x1f, 0x02, 0x05, 0x04, 0x24, + 0x20, 0x02, 0x06, 0x05, 0x04, 0x1e, 0x08, 0x01, 0x04, 0x07, 0x01, 0x05, + 0x06, 0x04, 0x05, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x0d, 0x1f, 0x09, + 0x01, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x02, 0x01, 0x00, 0x00, 0x0e, + 0x1f, 0x00, 0x06, 0x06, 0x16, 0x06, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x49, + 0x50, 0x58, 0x40, 0x3a, 0x0d, 0x09, 0x02, 0x00, 0x01, 0x0e, 0x08, 0x02, + 0x03, 0x00, 0x25, 0x1f, 0x02, 0x05, 0x04, 0x24, 0x20, 0x02, 0x06, 0x05, + 0x04, 0x1e, 0x02, 0x01, 0x00, 0x09, 0x01, 0x03, 0x04, 0x00, 0x03, 0x00, + 0x00, 0x26, 0x08, 0x01, 0x04, 0x07, 0x01, 0x05, 0x06, 0x04, 0x05, 0x01, + 0x00, 0x26, 0x00, 0x01, 0x01, 0x0d, 0x1f, 0x00, 0x06, 0x06, 0x16, 0x06, + 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x7c, 0x50, 0x58, 0x40, 0x3c, 0x0d, 0x09, + 0x02, 0x00, 0x01, 0x0e, 0x08, 0x02, 0x03, 0x00, 0x25, 0x1f, 0x02, 0x05, + 0x04, 0x24, 0x20, 0x02, 0x06, 0x05, 0x04, 0x1e, 0x02, 0x01, 0x00, 0x09, + 0x01, 0x03, 0x04, 0x00, 0x03, 0x00, 0x00, 0x26, 0x08, 0x01, 0x04, 0x07, + 0x01, 0x05, 0x06, 0x04, 0x05, 0x01, 0x00, 0x26, 0x00, 0x06, 0x06, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0d, 0x06, 0x20, 0x05, 0x1b, 0x4b, + 0xb0, 0x4e, 0x50, 0x58, 0x40, 0x45, 0x0d, 0x09, 0x02, 0x00, 0x01, 0x0e, + 0x08, 0x02, 0x03, 0x00, 0x25, 0x1f, 0x02, 0x05, 0x04, 0x24, 0x20, 0x02, + 0x06, 0x05, 0x04, 0x1e, 0x00, 0x01, 0x00, 0x06, 0x01, 0x01, 0x00, 0x23, + 0x02, 0x01, 0x00, 0x09, 0x01, 0x03, 0x04, 0x00, 0x03, 0x00, 0x00, 0x26, + 0x08, 0x01, 0x04, 0x07, 0x01, 0x05, 0x06, 0x04, 0x05, 0x01, 0x00, 0x26, + 0x00, 0x01, 0x01, 0x06, 0x01, 0x00, 0x24, 0x00, 0x06, 0x01, 0x06, 0x01, + 0x00, 0x21, 0x06, 0x1b, 0x4b, 0xb8, 0x03, 0xe8, 0x50, 0x58, 0x40, 0x4c, + 0x0d, 0x09, 0x02, 0x00, 0x01, 0x0e, 0x08, 0x02, 0x03, 0x02, 0x25, 0x1f, + 0x02, 0x05, 0x04, 0x24, 0x20, 0x02, 0x06, 0x05, 0x04, 0x1e, 0x00, 0x01, + 0x00, 0x06, 0x01, 0x01, 0x00, 0x23, 0x00, 0x00, 0x02, 0x03, 0x00, 0x01, + 0x00, 0x23, 0x00, 0x02, 0x09, 0x01, 0x03, 0x04, 0x02, 0x03, 0x00, 0x00, + 0x26, 0x08, 0x01, 0x04, 0x07, 0x01, 0x05, 0x06, 0x04, 0x05, 0x01, 0x00, + 0x26, 0x00, 0x01, 0x01, 0x06, 0x01, 0x00, 0x24, 0x00, 0x06, 0x01, 0x06, + 0x01, 0x00, 0x21, 0x07, 0x1b, 0x40, 0x55, 0x0d, 0x09, 0x02, 0x00, 0x01, + 0x0e, 0x08, 0x02, 0x09, 0x02, 0x25, 0x1f, 0x02, 0x07, 0x08, 0x24, 0x20, + 0x02, 0x06, 0x05, 0x04, 0x1e, 0x00, 0x01, 0x00, 0x06, 0x01, 0x01, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x09, 0x00, 0x00, 0x26, 0x00, + 0x02, 0x00, 0x03, 0x04, 0x02, 0x03, 0x00, 0x00, 0x26, 0x00, 0x08, 0x00, + 0x07, 0x05, 0x08, 0x07, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x05, 0x06, + 0x04, 0x05, 0x01, 0x00, 0x26, 0x00, 0x01, 0x01, 0x06, 0x01, 0x00, 0x24, + 0x00, 0x06, 0x01, 0x06, 0x01, 0x00, 0x21, 0x08, 0x59, 0x59, 0x59, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x17, + 0x03, 0x36, 0x33, 0x32, 0x17, 0x03, 0x3e, 0x01, 0x37, 0x32, 0x16, 0x1d, + 0x01, 0x21, 0x11, 0x21, 0x15, 0x14, 0x06, 0x23, 0x2e, 0x01, 0x27, 0x13, + 0x06, 0x23, 0x22, 0x27, 0x13, 0x0e, 0x01, 0x07, 0x22, 0x26, 0x3d, 0x01, + 0x21, 0x11, 0x21, 0x76, 0x29, 0x2b, 0x22, 0x4c, 0x50, 0x50, 0x27, 0x18, + 0x28, 0x35, 0x37, 0x26, 0x17, 0x4e, 0xa1, 0x45, 0x2c, 0x28, 0xfe, 0x78, + 0x01, 0x88, 0x28, 0x2c, 0x45, 0xa1, 0x4e, 0x17, 0x26, 0x37, 0x35, 0x28, + 0x18, 0x4e, 0xa2, 0x45, 0x2b, 0x29, 0x01, 0x89, 0xfe, 0x77, 0x03, 0x96, + 0x1f, 0x30, 0x09, 0x0a, 0x0c, 0x03, 0x01, 0xe8, 0x17, 0x17, 0xfe, 0x18, + 0x07, 0x1a, 0x01, 0x30, 0x1f, 0x3c, 0xfd, 0xa8, 0x3c, 0x1f, 0x30, 0x01, + 0x19, 0x07, 0xfe, 0x19, 0x17, 0x17, 0x01, 0xe7, 0x07, 0x19, 0x01, 0x30, + 0x1f, 0x3c, 0x02, 0x58, 0x00, 0x01, 0x00, 0xd0, 0x00, 0xe0, 0x03, 0xb7, + 0x03, 0xc8, 0x00, 0x13, 0x00, 0x3c, 0x40, 0x06, 0x10, 0x0e, 0x06, 0x04, + 0x02, 0x07, 0x2b, 0x4b, 0xb0, 0x17, 0x50, 0x58, 0x40, 0x0e, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0e, 0x01, 0x20, 0x02, + 0x1b, 0x40, 0x17, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x23, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x21, 0x03, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0xd0, 0x3b, + 0x64, 0x87, 0x4c, 0x4d, 0x88, 0x65, 0x3b, 0x3b, 0x65, 0x88, 0x4d, 0x4c, + 0x87, 0x64, 0x3b, 0x02, 0x53, 0x4d, 0x88, 0x65, 0x3b, 0x3b, 0x65, 0x88, + 0x4d, 0x4d, 0x87, 0x64, 0x3b, 0x3b, 0x64, 0x87, 0x00, 0x03, 0x00, 0x58, + 0xff, 0xf1, 0x05, 0x56, 0x00, 0xec, 0x00, 0x13, 0x00, 0x27, 0x00, 0x3b, + 0x00, 0x9d, 0x40, 0x0e, 0x38, 0x36, 0x2e, 0x2c, 0x24, 0x22, 0x1a, 0x18, + 0x10, 0x0e, 0x06, 0x04, 0x06, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x12, 0x04, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x24, 0x05, + 0x03, 0x02, 0x01, 0x01, 0x12, 0x01, 0x20, 0x02, 0x1b, 0x4b, 0xb0, 0x6c, + 0x50, 0x58, 0x40, 0x12, 0x04, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x24, 0x05, 0x03, 0x02, 0x01, 0x01, 0x15, 0x01, 0x20, 0x02, 0x1b, 0x4b, + 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x1d, 0x04, 0x02, 0x02, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x00, 0x23, 0x04, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x24, 0x05, 0x03, 0x02, 0x01, 0x00, 0x01, 0x01, 0x00, 0x21, 0x03, 0x1b, + 0x40, 0x2b, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x00, 0x23, 0x00, 0x04, + 0x00, 0x05, 0x03, 0x04, 0x05, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x03, + 0x01, 0x02, 0x03, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x21, 0x05, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x25, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x25, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x58, 0x13, 0x21, 0x2e, 0x1a, 0x1a, 0x2e, 0x22, 0x13, + 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, 0x21, 0x13, 0x04, 0x05, 0x13, 0x21, + 0x2e, 0x1a, 0x1a, 0x2e, 0x22, 0x13, 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, + 0x21, 0x13, 0xfd, 0xfd, 0x13, 0x21, 0x2e, 0x1a, 0x1a, 0x2e, 0x22, 0x13, + 0x13, 0x22, 0x2e, 0x1a, 0x1a, 0x2e, 0x21, 0x13, 0x6e, 0x1a, 0x2e, 0x22, + 0x14, 0x14, 0x22, 0x2e, 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, 0x2d, + 0x1b, 0x1a, 0x2e, 0x22, 0x14, 0x14, 0x22, 0x2e, 0x1a, 0x1b, 0x2d, 0x22, + 0x13, 0x13, 0x22, 0x2d, 0x1b, 0x1a, 0x2e, 0x22, 0x14, 0x14, 0x22, 0x2e, + 0x1a, 0x1b, 0x2d, 0x22, 0x13, 0x13, 0x22, 0x2d, 0x00, 0x07, 0x00, 0x48, + 0xff, 0xef, 0x08, 0xb9, 0x05, 0xa7, 0x00, 0x13, 0x00, 0x27, 0x00, 0x31, + 0x00, 0x45, 0x00, 0x59, 0x00, 0x6d, 0x00, 0x81, 0x01, 0xdb, 0x40, 0x1e, + 0x7e, 0x7c, 0x74, 0x72, 0x6a, 0x68, 0x60, 0x5e, 0x56, 0x54, 0x4c, 0x4a, + 0x42, 0x40, 0x38, 0x36, 0x31, 0x2f, 0x2c, 0x2a, 0x24, 0x22, 0x1a, 0x18, + 0x10, 0x0e, 0x06, 0x04, 0x0e, 0x07, 0x2b, 0x4b, 0xb0, 0x1c, 0x50, 0x58, + 0x40, 0x34, 0x00, 0x03, 0x00, 0x00, 0x07, 0x03, 0x00, 0x01, 0x00, 0x26, + 0x0b, 0x01, 0x07, 0x0c, 0x01, 0x08, 0x09, 0x07, 0x08, 0x01, 0x00, 0x26, + 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x04, 0x01, 0x01, 0x01, 0x11, + 0x1f, 0x0d, 0x01, 0x09, 0x09, 0x05, 0x01, 0x00, 0x24, 0x0a, 0x06, 0x02, + 0x05, 0x05, 0x0c, 0x05, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x22, 0x50, 0x58, + 0x40, 0x38, 0x00, 0x03, 0x00, 0x00, 0x07, 0x03, 0x00, 0x01, 0x00, 0x26, + 0x0b, 0x01, 0x07, 0x0c, 0x01, 0x08, 0x09, 0x07, 0x08, 0x01, 0x00, 0x26, + 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x04, 0x01, 0x01, 0x01, 0x11, + 0x1f, 0x00, 0x05, 0x05, 0x0c, 0x1f, 0x0d, 0x01, 0x09, 0x09, 0x06, 0x01, + 0x00, 0x24, 0x0a, 0x01, 0x06, 0x06, 0x12, 0x06, 0x20, 0x07, 0x1b, 0x4b, + 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x3c, 0x00, 0x03, 0x00, 0x00, 0x07, 0x03, + 0x00, 0x01, 0x00, 0x26, 0x0b, 0x01, 0x07, 0x0c, 0x01, 0x08, 0x09, 0x07, + 0x08, 0x01, 0x00, 0x26, 0x00, 0x04, 0x04, 0x0b, 0x1f, 0x00, 0x02, 0x02, + 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x11, 0x1f, 0x00, 0x05, 0x05, + 0x0c, 0x1f, 0x0d, 0x01, 0x09, 0x09, 0x06, 0x01, 0x00, 0x24, 0x0a, 0x01, + 0x06, 0x06, 0x12, 0x06, 0x20, 0x08, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x3d, 0x00, 0x04, 0x01, 0x02, 0x01, 0x04, 0x02, 0x32, 0x00, 0x01, + 0x00, 0x02, 0x03, 0x01, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x00, 0x00, + 0x07, 0x03, 0x00, 0x01, 0x00, 0x26, 0x0b, 0x01, 0x07, 0x0c, 0x01, 0x08, + 0x09, 0x07, 0x08, 0x01, 0x00, 0x26, 0x00, 0x05, 0x05, 0x0f, 0x1f, 0x0d, + 0x01, 0x09, 0x09, 0x06, 0x01, 0x00, 0x24, 0x0a, 0x01, 0x06, 0x06, 0x15, + 0x06, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x4a, 0x00, + 0x04, 0x01, 0x02, 0x01, 0x04, 0x02, 0x32, 0x00, 0x05, 0x09, 0x06, 0x09, + 0x05, 0x06, 0x32, 0x00, 0x01, 0x00, 0x02, 0x03, 0x01, 0x02, 0x01, 0x00, + 0x26, 0x00, 0x03, 0x00, 0x00, 0x07, 0x03, 0x00, 0x01, 0x00, 0x26, 0x0b, + 0x01, 0x07, 0x0c, 0x01, 0x08, 0x09, 0x07, 0x08, 0x01, 0x00, 0x26, 0x0d, + 0x01, 0x09, 0x05, 0x06, 0x09, 0x01, 0x00, 0x23, 0x0d, 0x01, 0x09, 0x09, + 0x06, 0x01, 0x00, 0x24, 0x0a, 0x01, 0x06, 0x09, 0x06, 0x01, 0x00, 0x21, + 0x08, 0x1b, 0x40, 0x59, 0x00, 0x04, 0x01, 0x02, 0x01, 0x04, 0x02, 0x32, + 0x00, 0x05, 0x0d, 0x0a, 0x0d, 0x05, 0x0a, 0x32, 0x00, 0x01, 0x00, 0x02, + 0x03, 0x01, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x00, 0x00, 0x07, 0x03, + 0x00, 0x01, 0x00, 0x26, 0x00, 0x0b, 0x00, 0x0c, 0x08, 0x0b, 0x0c, 0x01, + 0x00, 0x26, 0x00, 0x07, 0x00, 0x08, 0x09, 0x07, 0x08, 0x01, 0x00, 0x26, + 0x00, 0x09, 0x0d, 0x06, 0x09, 0x01, 0x00, 0x23, 0x00, 0x0d, 0x00, 0x0a, + 0x06, 0x0d, 0x0a, 0x01, 0x00, 0x26, 0x00, 0x09, 0x09, 0x06, 0x01, 0x00, + 0x24, 0x00, 0x06, 0x09, 0x06, 0x01, 0x00, 0x21, 0x0a, 0x59, 0x59, 0x59, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x07, 0x34, 0x2e, + 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, + 0x02, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x01, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x07, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x25, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x07, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, + 0x32, 0x3e, 0x02, 0x02, 0xc3, 0x34, 0x57, 0x74, 0x3f, 0x44, 0x73, 0x56, + 0x30, 0x30, 0x56, 0x73, 0x44, 0x43, 0x75, 0x55, 0x31, 0x8b, 0x1c, 0x31, + 0x41, 0x25, 0x25, 0x41, 0x30, 0x1b, 0x1b, 0x30, 0x41, 0x25, 0x25, 0x41, + 0x31, 0x1c, 0x02, 0x85, 0x09, 0x1c, 0x18, 0x80, 0xfb, 0xe9, 0x0a, 0x1c, + 0x13, 0x84, 0x05, 0x35, 0x34, 0x57, 0x73, 0x3f, 0x44, 0x73, 0x56, 0x30, + 0x30, 0x56, 0x73, 0x44, 0x43, 0x74, 0x56, 0x30, 0x8a, 0x1c, 0x31, 0x41, + 0x25, 0x25, 0x41, 0x30, 0x1b, 0x1b, 0x30, 0x41, 0x25, 0x25, 0x41, 0x31, + 0x1c, 0x03, 0x68, 0x34, 0x57, 0x74, 0x3f, 0x44, 0x73, 0x56, 0x30, 0x30, + 0x56, 0x73, 0x44, 0x43, 0x75, 0x55, 0x31, 0x8b, 0x1c, 0x31, 0x41, 0x25, + 0x25, 0x41, 0x30, 0x1b, 0x1b, 0x30, 0x41, 0x25, 0x25, 0x41, 0x31, 0x1c, + 0x04, 0x3f, 0x54, 0x85, 0x5b, 0x30, 0x30, 0x5b, 0x85, 0x54, 0x56, 0x86, + 0x5c, 0x30, 0x30, 0x5c, 0x86, 0x56, 0x42, 0x5c, 0x3b, 0x1a, 0x1a, 0x3b, + 0x5c, 0x42, 0x41, 0x5b, 0x39, 0x19, 0x19, 0x39, 0x5b, 0x01, 0x7d, 0x0d, + 0x11, 0xfa, 0x84, 0x0d, 0x10, 0x01, 0x52, 0x54, 0x84, 0x5b, 0x30, 0x30, + 0x5b, 0x84, 0x54, 0x56, 0x87, 0x5c, 0x30, 0x30, 0x5c, 0x87, 0x56, 0x42, + 0x5d, 0x3a, 0x1a, 0x1a, 0x3a, 0x5d, 0x42, 0x41, 0x5a, 0x39, 0x19, 0x19, + 0x39, 0x5a, 0x41, 0x54, 0x84, 0x5b, 0x30, 0x30, 0x5b, 0x84, 0x54, 0x56, + 0x87, 0x5c, 0x30, 0x30, 0x5c, 0x87, 0x56, 0x42, 0x5d, 0x3a, 0x1a, 0x1a, + 0x3a, 0x5d, 0x42, 0x41, 0x5a, 0x39, 0x19, 0x19, 0x39, 0x5a, 0x00, 0x01, + 0x00, 0x8a, 0x00, 0x81, 0x01, 0xd9, 0x03, 0xa2, 0x00, 0x14, 0x00, 0x07, + 0x40, 0x04, 0x02, 0x14, 0x01, 0x0b, 0x2b, 0x13, 0x35, 0x13, 0x17, 0x1e, + 0x01, 0x15, 0x14, 0x07, 0x03, 0x06, 0x07, 0x16, 0x17, 0x13, 0x1e, 0x01, + 0x15, 0x14, 0x0f, 0x01, 0x8a, 0xf9, 0x3a, 0x0e, 0x0e, 0x0a, 0x9f, 0x0e, + 0x0e, 0x0f, 0x0d, 0x9f, 0x05, 0x05, 0x1c, 0x3a, 0x02, 0x06, 0x17, 0x01, + 0x85, 0x1c, 0x07, 0x16, 0x0d, 0x11, 0x10, 0xfe, 0xfb, 0x18, 0x0d, 0x0e, + 0x16, 0xfe, 0xfb, 0x08, 0x12, 0x08, 0x1c, 0x0d, 0x1c, 0x00, 0x00, 0x01, + 0x00, 0x96, 0x00, 0x81, 0x01, 0xe5, 0x03, 0xa2, 0x00, 0x12, 0x00, 0x07, + 0x40, 0x04, 0x12, 0x02, 0x01, 0x0b, 0x2b, 0x01, 0x15, 0x03, 0x27, 0x26, + 0x35, 0x34, 0x37, 0x13, 0x36, 0x37, 0x26, 0x27, 0x03, 0x26, 0x35, 0x34, + 0x3f, 0x01, 0x01, 0xe5, 0xf9, 0x3a, 0x1c, 0x0a, 0x9f, 0x0d, 0x0e, 0x0c, + 0x0f, 0x9f, 0x0a, 0x1c, 0x3a, 0x02, 0x1d, 0x17, 0xfe, 0x7b, 0x1c, 0x0d, + 0x1c, 0x11, 0x11, 0x01, 0x05, 0x18, 0x0c, 0x0b, 0x1a, 0x01, 0x05, 0x11, + 0x11, 0x1c, 0x0d, 0x1c, 0x00, 0x01, 0xff, 0x44, 0x00, 0x00, 0x03, 0x23, + 0x05, 0x99, 0x00, 0x09, 0x00, 0x42, 0x40, 0x06, 0x09, 0x07, 0x04, 0x02, + 0x02, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x0c, 0x00, 0x01, + 0x01, 0x0b, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x20, 0x02, 0x1b, 0x4b, + 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x20, 0x02, 0x1b, 0x40, 0x0a, 0x00, 0x01, 0x00, + 0x01, 0x34, 0x00, 0x00, 0x00, 0x2b, 0x02, 0x59, 0x59, 0xb0, 0x38, 0x2b, + 0x27, 0x0e, 0x01, 0x2b, 0x01, 0x01, 0x3e, 0x01, 0x3b, 0x01, 0x14, 0x13, + 0x2c, 0x1d, 0x4c, 0x03, 0x32, 0x12, 0x2e, 0x20, 0x4d, 0x35, 0x1f, 0x16, + 0x05, 0x5c, 0x1d, 0x20, 0x00, 0x01, 0x00, 0x22, 0xff, 0xf1, 0x04, 0x72, + 0x05, 0xa7, 0x00, 0x47, 0x01, 0x8d, 0x40, 0x1e, 0x47, 0x46, 0x40, 0x3f, + 0x3e, 0x3d, 0x39, 0x37, 0x32, 0x30, 0x2b, 0x29, 0x27, 0x25, 0x22, 0x21, + 0x1b, 0x19, 0x16, 0x15, 0x13, 0x11, 0x0e, 0x0c, 0x07, 0x05, 0x01, 0x00, + 0x0e, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x4c, 0x09, 0x01, + 0x02, 0x03, 0x35, 0x01, 0x08, 0x09, 0x02, 0x1e, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x02, 0x00, 0x32, 0x00, 0x09, 0x07, 0x08, 0x07, 0x09, 0x08, 0x32, + 0x04, 0x01, 0x00, 0x0d, 0x01, 0x05, 0x06, 0x00, 0x05, 0x01, 0x00, 0x26, + 0x0c, 0x01, 0x06, 0x0b, 0x01, 0x07, 0x09, 0x06, 0x07, 0x01, 0x00, 0x26, + 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x11, 0x1f, + 0x00, 0x08, 0x08, 0x0a, 0x01, 0x00, 0x24, 0x00, 0x0a, 0x0a, 0x12, 0x0a, + 0x20, 0x09, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x4a, 0x09, 0x01, + 0x02, 0x03, 0x35, 0x01, 0x08, 0x09, 0x02, 0x1e, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x02, 0x00, 0x32, 0x00, 0x09, 0x07, 0x08, 0x07, 0x09, 0x08, 0x32, + 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x04, 0x01, + 0x00, 0x0d, 0x01, 0x05, 0x06, 0x00, 0x05, 0x01, 0x00, 0x26, 0x0c, 0x01, + 0x06, 0x0b, 0x01, 0x07, 0x09, 0x06, 0x07, 0x01, 0x00, 0x26, 0x00, 0x08, + 0x08, 0x0a, 0x01, 0x00, 0x24, 0x00, 0x0a, 0x0a, 0x15, 0x0a, 0x20, 0x08, + 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x53, 0x09, 0x01, 0x02, 0x03, + 0x35, 0x01, 0x08, 0x09, 0x02, 0x1e, 0x00, 0x02, 0x03, 0x00, 0x03, 0x02, + 0x00, 0x32, 0x00, 0x09, 0x07, 0x08, 0x07, 0x09, 0x08, 0x32, 0x00, 0x01, + 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x04, 0x01, 0x00, 0x0d, + 0x01, 0x05, 0x06, 0x00, 0x05, 0x01, 0x00, 0x26, 0x0c, 0x01, 0x06, 0x0b, + 0x01, 0x07, 0x09, 0x06, 0x07, 0x01, 0x00, 0x26, 0x00, 0x08, 0x0a, 0x0a, + 0x08, 0x01, 0x00, 0x23, 0x00, 0x08, 0x08, 0x0a, 0x01, 0x00, 0x24, 0x00, + 0x0a, 0x08, 0x0a, 0x01, 0x00, 0x21, 0x09, 0x1b, 0x40, 0x63, 0x09, 0x01, + 0x02, 0x03, 0x35, 0x01, 0x08, 0x09, 0x02, 0x1e, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x02, 0x00, 0x32, 0x00, 0x09, 0x07, 0x08, 0x07, 0x09, 0x08, 0x32, + 0x00, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, 0x00, 0x26, 0x00, 0x00, + 0x00, 0x0d, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x26, 0x00, 0x04, 0x00, 0x05, + 0x06, 0x04, 0x05, 0x01, 0x00, 0x26, 0x00, 0x0c, 0x00, 0x0b, 0x07, 0x0c, + 0x0b, 0x00, 0x00, 0x26, 0x00, 0x06, 0x00, 0x07, 0x09, 0x06, 0x07, 0x01, + 0x00, 0x26, 0x00, 0x08, 0x0a, 0x0a, 0x08, 0x01, 0x00, 0x23, 0x00, 0x08, + 0x08, 0x0a, 0x01, 0x00, 0x24, 0x00, 0x0a, 0x08, 0x0a, 0x01, 0x00, 0x21, + 0x0b, 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x33, 0x3e, 0x03, 0x33, + 0x32, 0x16, 0x17, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x21, 0x15, 0x14, 0x06, 0x23, 0x21, 0x0e, 0x01, 0x15, 0x1c, + 0x01, 0x17, 0x21, 0x15, 0x14, 0x06, 0x23, 0x21, 0x1e, 0x01, 0x33, 0x32, + 0x3e, 0x04, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x2e, + 0x02, 0x27, 0x23, 0x35, 0x33, 0x26, 0x34, 0x35, 0x34, 0x36, 0x37, 0x23, + 0x22, 0x93, 0x14, 0x5f, 0x8d, 0xb8, 0x6c, 0x86, 0xbe, 0x46, 0x3d, 0x08, + 0x10, 0x0e, 0x11, 0x25, 0x3e, 0x61, 0x4b, 0x92, 0xc1, 0x20, 0x02, 0x23, + 0x1b, 0x18, 0xfe, 0x04, 0x01, 0x01, 0x01, 0x01, 0xd3, 0x1c, 0x18, 0xfe, + 0x6a, 0x1c, 0xc0, 0x92, 0x36, 0x52, 0x3c, 0x2b, 0x20, 0x19, 0x0c, 0x08, + 0x0c, 0x08, 0x4b, 0x46, 0xd0, 0x8f, 0x74, 0xba, 0x88, 0x57, 0x10, 0x8e, + 0x86, 0x01, 0x01, 0x01, 0x87, 0x03, 0x83, 0x7e, 0xcb, 0x8f, 0x4c, 0x64, + 0x58, 0x44, 0x09, 0x0d, 0x26, 0x2e, 0x26, 0xc8, 0xc0, 0x37, 0x12, 0x1d, + 0x14, 0x28, 0x15, 0x10, 0x1e, 0x0f, 0x38, 0x11, 0x1d, 0xce, 0xce, 0x15, + 0x20, 0x25, 0x20, 0x15, 0x07, 0x07, 0x46, 0x66, 0x71, 0x4f, 0x93, 0xd3, + 0x83, 0x66, 0x0f, 0x1e, 0x10, 0x14, 0x29, 0x14, 0x00, 0x02, 0x00, 0x40, + 0x03, 0x49, 0x05, 0x29, 0x05, 0x99, 0x00, 0x1e, 0x00, 0x26, 0x00, 0xe7, + 0x40, 0x18, 0x1f, 0x1f, 0x1f, 0x26, 0x1f, 0x26, 0x25, 0x24, 0x23, 0x22, + 0x21, 0x20, 0x1c, 0x1a, 0x19, 0x18, 0x14, 0x11, 0x0d, 0x0c, 0x0b, 0x09, + 0x0a, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x35, 0x17, 0x16, + 0x0f, 0x0e, 0x03, 0x05, 0x02, 0x05, 0x01, 0x1e, 0x00, 0x02, 0x05, 0x01, + 0x05, 0x02, 0x01, 0x32, 0x07, 0x01, 0x05, 0x05, 0x00, 0x01, 0x00, 0x24, + 0x09, 0x08, 0x04, 0x03, 0x00, 0x00, 0x0b, 0x1f, 0x06, 0x03, 0x02, 0x01, + 0x01, 0x00, 0x01, 0x00, 0x24, 0x09, 0x08, 0x04, 0x03, 0x00, 0x00, 0x0b, + 0x01, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x34, 0x17, + 0x16, 0x0f, 0x0e, 0x03, 0x05, 0x02, 0x05, 0x01, 0x1e, 0x00, 0x02, 0x05, + 0x01, 0x05, 0x02, 0x01, 0x32, 0x09, 0x08, 0x04, 0x03, 0x00, 0x07, 0x01, + 0x05, 0x02, 0x00, 0x05, 0x00, 0x00, 0x26, 0x09, 0x08, 0x04, 0x03, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x24, 0x06, 0x03, 0x02, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x21, 0x05, 0x1b, 0x40, 0x4c, 0x17, 0x16, 0x0f, 0x0e, 0x03, 0x05, + 0x02, 0x05, 0x01, 0x1e, 0x00, 0x07, 0x08, 0x05, 0x05, 0x07, 0x2a, 0x00, + 0x02, 0x05, 0x06, 0x05, 0x02, 0x06, 0x32, 0x00, 0x06, 0x03, 0x05, 0x06, + 0x03, 0x30, 0x00, 0x00, 0x04, 0x01, 0x00, 0x01, 0x00, 0x23, 0x09, 0x01, + 0x08, 0x00, 0x05, 0x02, 0x08, 0x05, 0x00, 0x00, 0x26, 0x00, 0x04, 0x00, + 0x03, 0x01, 0x04, 0x03, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x09, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x1e, 0x01, 0x17, 0x3e, 0x01, 0x37, 0x13, 0x3e, + 0x01, 0x3b, 0x01, 0x11, 0x23, 0x11, 0x37, 0x03, 0x06, 0x2b, 0x01, 0x22, + 0x27, 0x03, 0x17, 0x11, 0x23, 0x11, 0x33, 0x32, 0x16, 0x17, 0x27, 0x15, + 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x03, 0xc3, 0x06, 0x0b, 0x04, 0x05, + 0x08, 0x08, 0xa9, 0x09, 0x10, 0x10, 0x6a, 0x6e, 0x09, 0xb7, 0x0d, 0x1f, + 0x12, 0x1f, 0x0c, 0xb8, 0x08, 0x6e, 0x6a, 0x11, 0x0e, 0x0b, 0xf4, 0xb4, + 0x7e, 0xb4, 0x04, 0x55, 0x0e, 0x19, 0x0e, 0x0e, 0x19, 0x0e, 0x01, 0x2f, + 0x0d, 0x08, 0xfd, 0xb0, 0x01, 0x6d, 0x4b, 0xfe, 0xb0, 0x1c, 0x1c, 0x01, + 0x4d, 0x48, 0xfe, 0x93, 0x02, 0x50, 0x08, 0x0d, 0x15, 0x69, 0xfe, 0x19, + 0x01, 0xe7, 0x69, 0x00, 0x00, 0x01, 0x00, 0x56, 0x00, 0x00, 0x05, 0x7e, + 0x05, 0xa9, 0x00, 0x37, 0x00, 0xe2, 0x40, 0x12, 0x00, 0x00, 0x00, 0x37, + 0x00, 0x36, 0x33, 0x32, 0x28, 0x26, 0x1c, 0x1b, 0x18, 0x16, 0x0c, 0x0a, + 0x07, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x26, 0x31, 0x1d, + 0x15, 0x01, 0x04, 0x02, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x01, + 0x00, 0x24, 0x00, 0x03, 0x03, 0x11, 0x1f, 0x04, 0x01, 0x02, 0x02, 0x01, + 0x01, 0x00, 0x24, 0x06, 0x05, 0x02, 0x01, 0x01, 0x0c, 0x01, 0x20, 0x05, + 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x24, 0x31, 0x1d, 0x15, 0x01, + 0x04, 0x02, 0x00, 0x01, 0x1e, 0x00, 0x03, 0x00, 0x00, 0x02, 0x03, 0x00, + 0x01, 0x00, 0x26, 0x04, 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x06, + 0x05, 0x02, 0x01, 0x01, 0x0f, 0x01, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0xe8, + 0x50, 0x58, 0x40, 0x2e, 0x31, 0x1d, 0x15, 0x01, 0x04, 0x02, 0x00, 0x01, + 0x1e, 0x00, 0x03, 0x00, 0x00, 0x02, 0x03, 0x00, 0x01, 0x00, 0x26, 0x04, + 0x01, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0x23, 0x04, 0x01, 0x02, 0x02, + 0x01, 0x01, 0x00, 0x24, 0x06, 0x05, 0x02, 0x01, 0x02, 0x01, 0x01, 0x00, + 0x21, 0x05, 0x1b, 0x40, 0x35, 0x31, 0x1d, 0x15, 0x01, 0x04, 0x02, 0x00, + 0x01, 0x1e, 0x00, 0x03, 0x00, 0x00, 0x02, 0x03, 0x00, 0x01, 0x00, 0x26, + 0x00, 0x02, 0x04, 0x01, 0x02, 0x00, 0x00, 0x23, 0x00, 0x04, 0x06, 0x01, + 0x05, 0x01, 0x04, 0x05, 0x01, 0x00, 0x26, 0x00, 0x02, 0x02, 0x01, 0x01, + 0x00, 0x24, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x21, 0x11, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x11, 0x21, 0x22, + 0x26, 0x3d, 0x01, 0x21, 0x35, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x15, 0x21, 0x15, 0x14, + 0x06, 0x23, 0x03, 0x44, 0x51, 0x88, 0x63, 0x37, 0x45, 0x7b, 0xa9, 0x64, + 0x64, 0xa9, 0x7b, 0x45, 0x37, 0x62, 0x89, 0x51, 0xfe, 0x08, 0x1e, 0x24, + 0x01, 0xa3, 0x60, 0x9b, 0x6c, 0x3b, 0x63, 0xaf, 0xf2, 0x8f, 0x8f, 0xf2, + 0xaf, 0x63, 0x3b, 0x6d, 0x9b, 0x60, 0x01, 0xa4, 0x24, 0x1e, 0x01, 0xb6, + 0x0f, 0x41, 0x67, 0x8f, 0x5d, 0x6b, 0xa3, 0x6d, 0x38, 0x38, 0x6d, 0xa3, + 0x6b, 0x5d, 0x8f, 0x67, 0x41, 0x0f, 0xfe, 0x4a, 0x23, 0x1c, 0x64, 0xae, + 0x17, 0x60, 0x88, 0xae, 0x65, 0x80, 0xd6, 0x9a, 0x56, 0x56, 0x9a, 0xd6, + 0x80, 0x65, 0xae, 0x88, 0x60, 0x17, 0xae, 0x64, 0x1c, 0x23, 0x00, 0x02, + 0x00, 0x5c, 0xff, 0xf3, 0x04, 0x32, 0x05, 0xa8, 0x00, 0x2a, 0x00, 0x3e, + 0x00, 0xdc, 0x40, 0x14, 0x2c, 0x2b, 0x36, 0x34, 0x2b, 0x3e, 0x2c, 0x3e, + 0x28, 0x26, 0x23, 0x21, 0x1a, 0x18, 0x10, 0x0e, 0x06, 0x04, 0x08, 0x07, + 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x38, 0x00, 0x01, 0x03, 0x00, + 0x30, 0x1c, 0x02, 0x05, 0x06, 0x02, 0x1e, 0x00, 0x04, 0x03, 0x02, 0x03, + 0x04, 0x02, 0x32, 0x00, 0x02, 0x00, 0x06, 0x05, 0x02, 0x06, 0x01, 0x00, + 0x26, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x11, + 0x1f, 0x07, 0x01, 0x05, 0x05, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, + 0x15, 0x01, 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x36, + 0x00, 0x01, 0x03, 0x00, 0x30, 0x1c, 0x02, 0x05, 0x06, 0x02, 0x1e, 0x00, + 0x04, 0x03, 0x02, 0x03, 0x04, 0x02, 0x32, 0x00, 0x00, 0x00, 0x03, 0x04, + 0x00, 0x03, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x06, 0x05, 0x02, 0x06, + 0x01, 0x00, 0x26, 0x07, 0x01, 0x05, 0x05, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x15, 0x01, 0x20, 0x06, 0x1b, 0x40, 0x40, 0x00, 0x01, 0x03, + 0x00, 0x30, 0x1c, 0x02, 0x05, 0x06, 0x02, 0x1e, 0x00, 0x04, 0x03, 0x02, + 0x03, 0x04, 0x02, 0x32, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x03, 0x01, + 0x00, 0x26, 0x00, 0x02, 0x00, 0x06, 0x05, 0x02, 0x06, 0x01, 0x00, 0x26, + 0x07, 0x01, 0x05, 0x01, 0x01, 0x05, 0x01, 0x00, 0x23, 0x07, 0x01, 0x05, + 0x05, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x05, 0x01, 0x01, 0x00, 0x21, + 0x07, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x3e, 0x03, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x02, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x13, 0x32, 0x3e, 0x02, 0x37, + 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x01, 0x5c, + 0x27, 0x49, 0x4e, 0x56, 0x33, 0x5a, 0x94, 0x68, 0x39, 0x49, 0x93, 0xdd, + 0x94, 0x56, 0x91, 0x68, 0x3a, 0x4c, 0x88, 0xbc, 0x70, 0x68, 0x9a, 0x30, + 0x02, 0x01, 0x8a, 0x7c, 0x2a, 0x47, 0x38, 0x2a, 0x0d, 0x0b, 0x13, 0x0b, + 0x78, 0x42, 0x77, 0x60, 0x47, 0x14, 0x0a, 0x26, 0x3e, 0x57, 0x3a, 0x54, + 0x82, 0x58, 0x2d, 0x20, 0x3c, 0x55, 0x05, 0x39, 0x1b, 0x2a, 0x1c, 0x0e, + 0x4a, 0x8c, 0xca, 0x80, 0xca, 0xfe, 0xaf, 0xf3, 0x87, 0x39, 0x6b, 0x98, + 0x5f, 0x73, 0xca, 0x94, 0x56, 0x59, 0x56, 0x25, 0x43, 0x1a, 0xc6, 0xcb, + 0x14, 0x19, 0x14, 0x0c, 0x12, 0xfb, 0x89, 0x37, 0x70, 0xaa, 0x73, 0x2c, + 0x53, 0x40, 0x26, 0x3e, 0x6d, 0x95, 0x57, 0x41, 0x66, 0x46, 0x25, 0x00, + 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x62, 0x05, 0x99, 0x00, 0x03, + 0x00, 0x0c, 0x00, 0x76, 0x40, 0x08, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x19, 0x09, 0x01, + 0x02, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x0b, 0x1f, 0x00, 0x02, 0x02, + 0x01, 0x00, 0x02, 0x24, 0x00, 0x01, 0x01, 0x0c, 0x01, 0x20, 0x04, 0x1b, + 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x19, 0x09, 0x01, 0x02, 0x00, 0x01, + 0x1e, 0x00, 0x00, 0x02, 0x00, 0x34, 0x00, 0x02, 0x02, 0x01, 0x00, 0x02, + 0x24, 0x00, 0x01, 0x01, 0x0f, 0x01, 0x20, 0x04, 0x1b, 0x40, 0x22, 0x09, + 0x01, 0x02, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x02, 0x00, 0x34, 0x00, 0x02, + 0x01, 0x01, 0x02, 0x00, 0x00, 0x23, 0x00, 0x02, 0x02, 0x01, 0x00, 0x02, + 0x24, 0x00, 0x01, 0x02, 0x01, 0x00, 0x02, 0x21, 0x05, 0x59, 0x59, 0xb0, + 0x38, 0x2b, 0x01, 0x33, 0x01, 0x21, 0x25, 0x21, 0x01, 0x2e, 0x01, 0x27, + 0x0e, 0x01, 0x07, 0x02, 0x60, 0xaf, 0x02, 0x53, 0xfa, 0xac, 0x01, 0x03, + 0x03, 0x4d, 0xfe, 0x80, 0x09, 0x14, 0x09, 0x09, 0x13, 0x09, 0x05, 0x99, + 0xfa, 0x67, 0x9c, 0x03, 0xbf, 0x17, 0x3a, 0x22, 0x22, 0x3b, 0x17, 0x00, + 0x00, 0x01, 0x00, 0x3e, 0xfe, 0xa9, 0x05, 0x19, 0x05, 0x99, 0x00, 0x0b, + 0x00, 0xb6, 0x40, 0x12, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0b, 0x0a, 0x09, + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x07, 0x07, 0x2b, 0x4b, + 0xb0, 0x49, 0x50, 0x58, 0x40, 0x17, 0x04, 0x02, 0x02, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x24, 0x06, 0x01, 0x05, 0x05, 0x0b, 0x1f, 0x03, 0x01, 0x01, + 0x01, 0x10, 0x01, 0x20, 0x03, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, + 0x17, 0x03, 0x01, 0x01, 0x00, 0x01, 0x35, 0x04, 0x02, 0x02, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x24, 0x06, 0x01, 0x05, 0x05, 0x0b, 0x00, 0x20, 0x03, + 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x21, 0x03, 0x01, 0x01, 0x00, + 0x01, 0x35, 0x06, 0x01, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x23, 0x06, + 0x01, 0x05, 0x05, 0x00, 0x00, 0x00, 0x24, 0x04, 0x02, 0x02, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x21, 0x04, 0x1b, 0x40, 0x32, 0x00, 0x04, 0x05, 0x02, + 0x02, 0x04, 0x2a, 0x00, 0x00, 0x02, 0x03, 0x02, 0x00, 0x2a, 0x00, 0x03, + 0x01, 0x02, 0x03, 0x01, 0x30, 0x00, 0x01, 0x01, 0x33, 0x06, 0x01, 0x05, + 0x04, 0x02, 0x05, 0x00, 0x02, 0x23, 0x06, 0x01, 0x05, 0x05, 0x02, 0x00, + 0x00, 0x24, 0x00, 0x02, 0x05, 0x02, 0x00, 0x00, 0x21, 0x07, 0x59, 0x59, + 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, + 0x23, 0x11, 0x23, 0x35, 0x05, 0x19, 0xbb, 0xb8, 0xfe, 0x0b, 0xb8, 0xbb, + 0x05, 0x99, 0x99, 0xf9, 0xa9, 0x06, 0x57, 0xf9, 0xa9, 0x06, 0x57, 0x99, + 0x00, 0x01, 0x00, 0x54, 0xfe, 0xa9, 0x05, 0x03, 0x05, 0x99, 0x00, 0x12, + 0x00, 0x8e, 0x40, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x03, 0x02, 0x01, 0x00, + 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x49, 0x50, 0x58, 0x40, 0x22, 0x0e, 0x05, + 0x04, 0x03, 0x02, 0x01, 0x01, 0x1e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x0b, 0x1f, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, + 0x24, 0x00, 0x03, 0x03, 0x10, 0x03, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x5f, + 0x50, 0x58, 0x40, 0x1f, 0x0e, 0x05, 0x04, 0x03, 0x02, 0x01, 0x01, 0x1e, + 0x00, 0x02, 0x00, 0x03, 0x02, 0x03, 0x00, 0x00, 0x25, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x20, 0x04, 0x1b, + 0x40, 0x29, 0x0e, 0x05, 0x04, 0x03, 0x02, 0x01, 0x01, 0x1e, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x26, 0x00, 0x02, 0x03, 0x03, + 0x02, 0x00, 0x00, 0x23, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, 0x24, 0x00, + 0x03, 0x02, 0x03, 0x00, 0x00, 0x21, 0x05, 0x59, 0x59, 0xb0, 0x38, 0x2b, + 0x13, 0x21, 0x15, 0x21, 0x01, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x34, + 0x36, 0x37, 0x09, 0x01, 0x2e, 0x01, 0x35, 0x54, 0x04, 0xaf, 0xfc, 0x65, + 0x02, 0x3d, 0xfd, 0xc3, 0x03, 0x9b, 0xfb, 0x51, 0x09, 0x0a, 0x02, 0x75, + 0xfd, 0x8b, 0x0b, 0x08, 0x05, 0x99, 0x99, 0xfd, 0x3b, 0x34, 0xfd, 0x3b, + 0x99, 0x41, 0x0e, 0x1d, 0x0c, 0x03, 0x02, 0x02, 0xfd, 0x0d, 0x1d, 0x0e, + 0x00, 0x01, 0x00, 0x94, 0x02, 0x5c, 0x03, 0xf0, 0x02, 0xe3, 0x00, 0x03, + 0x00, 0x25, 0x40, 0x06, 0x03, 0x02, 0x01, 0x00, 0x02, 0x07, 0x2b, 0x40, + 0x17, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x03, + 0xb0, 0x38, 0x2b, 0x13, 0x21, 0x15, 0x21, 0x94, 0x03, 0x5c, 0xfc, 0xa4, + 0x02, 0xe3, 0x87, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x04, 0xd7, + 0x06, 0xb0, 0x00, 0x17, 0x00, 0x83, 0x40, 0x0a, 0x17, 0x16, 0x15, 0x13, + 0x07, 0x05, 0x02, 0x00, 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, + 0x40, 0x1c, 0x0d, 0x01, 0x03, 0x00, 0x01, 0x1e, 0x00, 0x02, 0x01, 0x02, + 0x34, 0x00, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x00, 0x26, 0x00, + 0x03, 0x03, 0x0c, 0x03, 0x20, 0x04, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, + 0x40, 0x1c, 0x0d, 0x01, 0x03, 0x00, 0x01, 0x1e, 0x00, 0x02, 0x01, 0x02, + 0x34, 0x00, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x00, 0x26, 0x00, + 0x03, 0x03, 0x0f, 0x03, 0x20, 0x04, 0x1b, 0x40, 0x27, 0x0d, 0x01, 0x03, + 0x00, 0x01, 0x1e, 0x00, 0x02, 0x01, 0x02, 0x34, 0x00, 0x03, 0x00, 0x03, + 0x35, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x23, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x21, 0x06, + 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x21, + 0x32, 0x16, 0x17, 0x13, 0x1e, 0x01, 0x17, 0x3e, 0x01, 0x37, 0x01, 0x3e, + 0x01, 0x3b, 0x01, 0x01, 0x23, 0x01, 0x1e, 0xab, 0x1c, 0x29, 0x01, 0x4f, + 0x16, 0x1c, 0x05, 0x96, 0x0c, 0x0c, 0x04, 0x05, 0x0b, 0x09, 0x01, 0xb0, + 0x05, 0x1c, 0x14, 0x73, 0xfd, 0xd6, 0x95, 0x02, 0x97, 0x21, 0x29, 0x39, + 0x16, 0x0f, 0xfe, 0x65, 0x20, 0x44, 0x22, 0x1b, 0x38, 0x1d, 0x05, 0x47, + 0x10, 0x15, 0xf9, 0x50, 0x00, 0x03, 0x00, 0x3a, 0x00, 0xfe, 0x05, 0x20, + 0x03, 0xa0, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x4f, 0x00, 0xa5, 0x40, 0x1e, + 0x3d, 0x3c, 0x29, 0x28, 0x01, 0x00, 0x47, 0x45, 0x3c, 0x4f, 0x3d, 0x4f, + 0x33, 0x31, 0x28, 0x3b, 0x29, 0x3b, 0x1f, 0x1d, 0x15, 0x13, 0x0b, 0x09, + 0x00, 0x27, 0x01, 0x27, 0x0b, 0x07, 0x2b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, + 0x40, 0x34, 0x4b, 0x2d, 0x19, 0x05, 0x04, 0x04, 0x05, 0x01, 0x1e, 0x03, + 0x01, 0x02, 0x07, 0x01, 0x05, 0x04, 0x02, 0x05, 0x01, 0x00, 0x26, 0x0a, + 0x06, 0x09, 0x03, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x23, 0x0a, 0x06, + 0x09, 0x03, 0x04, 0x04, 0x00, 0x01, 0x00, 0x24, 0x01, 0x08, 0x02, 0x00, + 0x04, 0x00, 0x01, 0x00, 0x21, 0x05, 0x1b, 0x40, 0x42, 0x4b, 0x2d, 0x19, + 0x05, 0x04, 0x04, 0x05, 0x01, 0x1e, 0x00, 0x03, 0x00, 0x07, 0x05, 0x03, + 0x07, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x05, 0x04, 0x02, 0x05, 0x01, + 0x00, 0x26, 0x0a, 0x01, 0x06, 0x01, 0x00, 0x06, 0x01, 0x00, 0x23, 0x09, + 0x01, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0x01, 0x00, 0x26, 0x0a, 0x01, + 0x06, 0x06, 0x00, 0x01, 0x00, 0x24, 0x08, 0x01, 0x00, 0x06, 0x00, 0x01, + 0x00, 0x21, 0x07, 0x59, 0xb0, 0x38, 0x2b, 0x25, 0x22, 0x2e, 0x02, 0x27, + 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x17, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, + 0x02, 0x25, 0x32, 0x3e, 0x02, 0x37, 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, + 0x15, 0x14, 0x1e, 0x02, 0x21, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x22, 0x0e, 0x02, 0x07, 0x1e, 0x03, 0x03, 0xea, 0x38, 0x5b, 0x4d, + 0x41, 0x1c, 0x1d, 0x41, 0x4c, 0x5c, 0x37, 0x3e, 0x71, 0x55, 0x32, 0x32, + 0x55, 0x71, 0x3e, 0x37, 0x5c, 0x4c, 0x41, 0x1d, 0x1c, 0x41, 0x4d, 0x5b, + 0x38, 0x3e, 0x70, 0x56, 0x32, 0x32, 0x56, 0x70, 0xfd, 0x4f, 0x24, 0x3e, + 0x37, 0x32, 0x19, 0x19, 0x32, 0x37, 0x3e, 0x24, 0x24, 0x3f, 0x30, 0x1c, + 0x1c, 0x30, 0x3f, 0x02, 0x90, 0x24, 0x3f, 0x2f, 0x1c, 0x1c, 0x2f, 0x3f, + 0x24, 0x24, 0x3e, 0x38, 0x32, 0x19, 0x19, 0x32, 0x38, 0x3e, 0xfe, 0x22, + 0x3b, 0x4c, 0x2a, 0x2a, 0x4c, 0x3b, 0x22, 0x30, 0x59, 0x7c, 0x4c, 0x4c, + 0x7c, 0x58, 0x31, 0x22, 0x3b, 0x4c, 0x2a, 0x2a, 0x4c, 0x3b, 0x22, 0x31, + 0x58, 0x7c, 0x4c, 0x4c, 0x7c, 0x59, 0x30, 0x92, 0x1e, 0x35, 0x45, 0x27, + 0x27, 0x45, 0x34, 0x1f, 0x18, 0x2f, 0x48, 0x30, 0x30, 0x48, 0x2f, 0x18, + 0x18, 0x2f, 0x48, 0x30, 0x30, 0x48, 0x2f, 0x18, 0x1f, 0x34, 0x45, 0x27, + 0x27, 0x45, 0x35, 0x1e, 0x00, 0x01, 0xff, 0x96, 0xfe, 0xa2, 0x03, 0x5c, + 0x05, 0xa9, 0x00, 0x23, 0x00, 0x94, 0x40, 0x0a, 0x1f, 0x1c, 0x16, 0x14, + 0x0d, 0x0b, 0x04, 0x02, 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0x49, 0x50, 0x58, + 0x40, 0x24, 0x06, 0x01, 0x01, 0x00, 0x18, 0x01, 0x02, 0x03, 0x02, 0x1e, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x11, 0x1f, + 0x00, 0x03, 0x03, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x02, 0x10, 0x02, + 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x21, 0x06, 0x01, + 0x01, 0x00, 0x18, 0x01, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x03, 0x00, 0x02, + 0x03, 0x02, 0x01, 0x00, 0x25, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x11, 0x01, 0x20, 0x04, 0x1b, 0x40, 0x2b, 0x06, 0x01, + 0x01, 0x00, 0x18, 0x01, 0x02, 0x03, 0x02, 0x1e, 0x00, 0x00, 0x00, 0x01, + 0x03, 0x00, 0x01, 0x01, 0x00, 0x26, 0x00, 0x03, 0x02, 0x02, 0x03, 0x01, + 0x00, 0x23, 0x00, 0x03, 0x03, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x03, + 0x02, 0x01, 0x00, 0x21, 0x05, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x3e, + 0x01, 0x33, 0x32, 0x16, 0x17, 0x07, 0x0e, 0x03, 0x23, 0x22, 0x06, 0x07, + 0x03, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x27, 0x37, 0x3e, 0x03, 0x33, 0x32, + 0x3e, 0x02, 0x37, 0x01, 0x76, 0x15, 0xb4, 0x92, 0x26, 0x45, 0x20, 0x08, + 0x02, 0x08, 0x12, 0x1e, 0x18, 0x64, 0x6f, 0x0f, 0x82, 0x0d, 0x41, 0x63, + 0x81, 0x4b, 0x23, 0x4a, 0x1e, 0x0a, 0x03, 0x09, 0x14, 0x20, 0x19, 0x3a, + 0x57, 0x3d, 0x25, 0x08, 0x04, 0x43, 0xae, 0xb8, 0x0e, 0x10, 0x56, 0x09, + 0x0e, 0x0a, 0x05, 0x6d, 0x76, 0xfb, 0xfa, 0x66, 0x92, 0x5f, 0x2d, 0x0d, + 0x10, 0x4c, 0x0c, 0x0d, 0x06, 0x01, 0x1b, 0x3b, 0x5d, 0x42, 0x00, 0x02, + 0x00, 0xb0, 0x01, 0x7e, 0x03, 0xd8, 0x03, 0xc5, 0x00, 0x1b, 0x00, 0x37, + 0x01, 0x13, 0x40, 0x1a, 0x1d, 0x1c, 0x01, 0x00, 0x34, 0x32, 0x2b, 0x29, + 0x26, 0x24, 0x1c, 0x37, 0x1d, 0x37, 0x18, 0x16, 0x0f, 0x0d, 0x0a, 0x08, + 0x00, 0x1b, 0x01, 0x1b, 0x0a, 0x07, 0x2b, 0x4b, 0xb0, 0x09, 0x50, 0x58, + 0x40, 0x4e, 0x14, 0x05, 0x02, 0x00, 0x03, 0x13, 0x06, 0x02, 0x01, 0x02, + 0x30, 0x21, 0x02, 0x04, 0x07, 0x2f, 0x22, 0x02, 0x05, 0x06, 0x04, 0x1e, + 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x02, 0x01, 0x00, 0x26, 0x08, 0x01, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x01, 0x01, 0x00, 0x26, 0x09, 0x01, 0x04, + 0x06, 0x05, 0x04, 0x01, 0x00, 0x23, 0x00, 0x07, 0x00, 0x06, 0x05, 0x07, + 0x06, 0x01, 0x00, 0x26, 0x09, 0x01, 0x04, 0x04, 0x05, 0x01, 0x00, 0x24, + 0x00, 0x05, 0x04, 0x05, 0x01, 0x00, 0x21, 0x07, 0x1b, 0x4b, 0xb0, 0x15, + 0x50, 0x58, 0x40, 0x43, 0x14, 0x05, 0x02, 0x00, 0x03, 0x13, 0x06, 0x02, + 0x01, 0x02, 0x30, 0x21, 0x02, 0x04, 0x07, 0x2f, 0x22, 0x02, 0x05, 0x06, + 0x04, 0x1e, 0x08, 0x01, 0x00, 0x00, 0x01, 0x07, 0x00, 0x01, 0x01, 0x00, + 0x26, 0x00, 0x07, 0x00, 0x06, 0x05, 0x07, 0x06, 0x01, 0x00, 0x26, 0x09, + 0x01, 0x04, 0x00, 0x05, 0x04, 0x05, 0x01, 0x00, 0x25, 0x00, 0x02, 0x02, + 0x03, 0x01, 0x00, 0x24, 0x00, 0x03, 0x03, 0x0e, 0x02, 0x20, 0x06, 0x1b, + 0x40, 0x4e, 0x14, 0x05, 0x02, 0x00, 0x03, 0x13, 0x06, 0x02, 0x01, 0x02, + 0x30, 0x21, 0x02, 0x04, 0x07, 0x2f, 0x22, 0x02, 0x05, 0x06, 0x04, 0x1e, + 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x02, 0x01, 0x00, 0x26, 0x08, 0x01, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x01, 0x01, 0x00, 0x26, 0x09, 0x01, 0x04, + 0x06, 0x05, 0x04, 0x01, 0x00, 0x23, 0x00, 0x07, 0x00, 0x06, 0x05, 0x07, + 0x06, 0x01, 0x00, 0x26, 0x09, 0x01, 0x04, 0x04, 0x05, 0x01, 0x00, 0x24, + 0x00, 0x05, 0x04, 0x05, 0x01, 0x00, 0x21, 0x07, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x01, 0x32, 0x3e, 0x02, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x2e, + 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x1e, + 0x02, 0x13, 0x32, 0x3e, 0x02, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x2e, + 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x1e, + 0x02, 0x03, 0x13, 0x1d, 0x36, 0x2e, 0x22, 0x09, 0x19, 0x23, 0x70, 0x3d, + 0x34, 0x67, 0x65, 0x5f, 0x2d, 0x1e, 0x38, 0x2e, 0x22, 0x09, 0x1d, 0x23, + 0x71, 0x42, 0x35, 0x68, 0x64, 0x5f, 0x2d, 0x1d, 0x36, 0x2e, 0x22, 0x09, + 0x19, 0x23, 0x70, 0x3d, 0x34, 0x67, 0x65, 0x5f, 0x2d, 0x1e, 0x38, 0x2e, + 0x22, 0x09, 0x1d, 0x23, 0x71, 0x42, 0x35, 0x68, 0x64, 0x5f, 0x03, 0x5a, + 0x0e, 0x15, 0x18, 0x0b, 0x72, 0x2f, 0x2e, 0x21, 0x28, 0x21, 0x0d, 0x15, + 0x19, 0x0c, 0x6d, 0x33, 0x31, 0x21, 0x29, 0x21, 0xfe, 0xae, 0x0d, 0x15, + 0x18, 0x0b, 0x71, 0x30, 0x2e, 0x21, 0x29, 0x21, 0x0e, 0x15, 0x19, 0x0c, + 0x6d, 0x33, 0x31, 0x21, 0x28, 0x21, 0x00, 0x01, 0x00, 0x96, 0x00, 0xbb, + 0x03, 0xf1, 0x04, 0x7e, 0x00, 0x13, 0x00, 0xd1, 0x40, 0x16, 0x13, 0x12, + 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, + 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0a, 0x07, 0x2b, 0x4b, 0xb0, 0x0b, + 0x50, 0x58, 0x40, 0x32, 0x00, 0x01, 0x00, 0x00, 0x01, 0x28, 0x00, 0x06, + 0x05, 0x05, 0x06, 0x29, 0x02, 0x01, 0x00, 0x09, 0x01, 0x03, 0x04, 0x00, + 0x03, 0x00, 0x02, 0x26, 0x08, 0x01, 0x04, 0x05, 0x05, 0x04, 0x00, 0x00, + 0x23, 0x08, 0x01, 0x04, 0x04, 0x05, 0x00, 0x00, 0x24, 0x07, 0x01, 0x05, + 0x04, 0x05, 0x00, 0x00, 0x21, 0x06, 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, + 0x40, 0x30, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x06, 0x05, 0x06, 0x35, + 0x02, 0x01, 0x00, 0x09, 0x01, 0x03, 0x04, 0x00, 0x03, 0x00, 0x02, 0x26, + 0x08, 0x01, 0x04, 0x05, 0x05, 0x04, 0x00, 0x00, 0x23, 0x08, 0x01, 0x04, + 0x04, 0x05, 0x00, 0x00, 0x24, 0x07, 0x01, 0x05, 0x04, 0x05, 0x00, 0x00, + 0x21, 0x06, 0x1b, 0x40, 0x3f, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x06, + 0x05, 0x06, 0x35, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x09, 0x00, 0x00, + 0x26, 0x00, 0x02, 0x00, 0x03, 0x04, 0x02, 0x03, 0x00, 0x02, 0x26, 0x00, + 0x04, 0x08, 0x05, 0x04, 0x00, 0x00, 0x23, 0x00, 0x08, 0x00, 0x07, 0x05, + 0x08, 0x07, 0x00, 0x00, 0x26, 0x00, 0x04, 0x04, 0x05, 0x00, 0x00, 0x24, + 0x00, 0x05, 0x04, 0x05, 0x00, 0x00, 0x21, 0x08, 0x59, 0x59, 0xb0, 0x38, + 0x2b, 0x13, 0x21, 0x37, 0x33, 0x07, 0x33, 0x15, 0x21, 0x07, 0x21, 0x15, + 0x21, 0x07, 0x23, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x96, 0x01, 0xe9, + 0x72, 0x81, 0x72, 0xf1, 0xfe, 0xd0, 0x5f, 0x01, 0x8f, 0xfe, 0x32, 0x77, + 0x81, 0x77, 0xfe, 0xf4, 0x01, 0x4b, 0x5f, 0xfe, 0x56, 0x03, 0x8d, 0xf1, + 0xf1, 0x87, 0xc8, 0x87, 0xfc, 0xfc, 0x87, 0xc8, 0x00, 0x02, 0x00, 0x94, + 0x00, 0x50, 0x03, 0x9a, 0x04, 0x90, 0x00, 0x11, 0x00, 0x15, 0x00, 0x2d, + 0x40, 0x06, 0x15, 0x14, 0x13, 0x12, 0x02, 0x07, 0x2b, 0x40, 0x1f, 0x11, + 0x10, 0x08, 0x01, 0x00, 0x05, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x00, 0x21, 0x04, 0xb0, 0x38, 0x2b, 0x13, 0x01, 0x15, + 0x14, 0x06, 0x07, 0x05, 0x06, 0x07, 0x1e, 0x01, 0x17, 0x05, 0x1e, 0x01, + 0x1d, 0x01, 0x01, 0x11, 0x21, 0x15, 0x21, 0x94, 0x03, 0x06, 0x12, 0x1a, + 0xfe, 0x47, 0x2e, 0x33, 0x1a, 0x32, 0x15, 0x01, 0xb9, 0x19, 0x13, 0xfc, + 0xfa, 0x03, 0x06, 0xfc, 0xfa, 0x03, 0x17, 0x01, 0x79, 0x7a, 0x10, 0x1b, + 0x0c, 0xcf, 0x12, 0x0c, 0x05, 0x0f, 0x0a, 0xd1, 0x0c, 0x1b, 0x10, 0x7a, + 0x01, 0x7b, 0xfe, 0x0a, 0x87, 0x00, 0x00, 0x02, 0x00, 0xee, 0x00, 0x50, + 0x03, 0xf4, 0x04, 0x90, 0x00, 0x11, 0x00, 0x15, 0x00, 0x2d, 0x40, 0x06, + 0x15, 0x14, 0x13, 0x12, 0x02, 0x07, 0x2b, 0x40, 0x1f, 0x11, 0x09, 0x02, + 0x01, 0x00, 0x05, 0x01, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x23, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x21, 0x04, 0xb0, 0x38, 0x2b, 0x01, 0x15, 0x01, 0x35, 0x34, + 0x36, 0x37, 0x25, 0x36, 0x37, 0x2e, 0x01, 0x27, 0x25, 0x2e, 0x01, 0x3d, + 0x01, 0x01, 0x21, 0x35, 0x21, 0x03, 0xf4, 0xfc, 0xfa, 0x13, 0x19, 0x01, + 0xb9, 0x29, 0x38, 0x1b, 0x31, 0x15, 0xfe, 0x47, 0x1a, 0x12, 0x03, 0x06, + 0xfc, 0xfa, 0x03, 0x06, 0x03, 0x17, 0x4a, 0xfe, 0x85, 0x7a, 0x10, 0x1b, + 0x0c, 0xd1, 0x13, 0x0b, 0x06, 0x0e, 0x0a, 0xcf, 0x0b, 0x1c, 0x10, 0x7a, + 0xfb, 0xc0, 0x87, 0x00, 0x00, 0x02, 0x00, 0x80, 0xff, 0x89, 0x04, 0x08, + 0x05, 0xf2, 0x00, 0x05, 0x00, 0x14, 0x00, 0x30, 0x40, 0x06, 0x05, 0x04, + 0x02, 0x01, 0x02, 0x07, 0x2b, 0x40, 0x22, 0x11, 0x0e, 0x0a, 0x06, 0x03, + 0x00, 0x06, 0x01, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x21, 0x04, 0xb0, 0x38, 0x2b, 0x13, 0x01, 0x33, 0x09, + 0x01, 0x23, 0x03, 0x01, 0x1e, 0x01, 0x17, 0x3e, 0x01, 0x37, 0x09, 0x01, + 0x26, 0x27, 0x0e, 0x01, 0x07, 0x80, 0x01, 0x86, 0x7c, 0x01, 0x86, 0xfe, + 0x7a, 0x7c, 0xf2, 0x01, 0x14, 0x08, 0x0f, 0x05, 0x05, 0x0e, 0x09, 0x01, + 0x18, 0xfe, 0xe8, 0x12, 0x0a, 0x05, 0x0f, 0x08, 0x02, 0xbd, 0x03, 0x35, + 0xfc, 0xcb, 0xfc, 0xcc, 0x03, 0x34, 0xfd, 0xbb, 0x17, 0x26, 0x12, 0x12, + 0x26, 0x17, 0x02, 0x45, 0x02, 0x46, 0x2b, 0x23, 0x12, 0x26, 0x16, 0x00, + 0x00, 0x01, 0xff, 0xfe, 0xfe, 0xa9, 0x00, 0x02, 0x05, 0xc1, 0x00, 0x03, + 0x00, 0x42, 0x40, 0x06, 0x03, 0x02, 0x01, 0x00, 0x02, 0x07, 0x2b, 0x4b, + 0xb0, 0x49, 0x50, 0x58, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x1f, 0x00, + 0x01, 0x01, 0x10, 0x01, 0x20, 0x02, 0x1b, 0x4b, 0xb0, 0x8d, 0x50, 0x58, + 0x40, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x35, 0x00, 0x00, 0x00, 0x0d, 0x00, + 0x20, 0x02, 0x1b, 0x40, 0x0a, 0x00, 0x00, 0x01, 0x00, 0x34, 0x00, 0x01, + 0x01, 0x2b, 0x02, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x03, 0x33, 0x11, 0x23, + 0x02, 0x04, 0x04, 0x05, 0xc1, 0xf8, 0xe8, 0x00, 0x00, 0x01, 0x00, 0x1a, + 0x00, 0x00, 0x03, 0xcb, 0x05, 0xbf, 0x00, 0x21, 0x01, 0x6d, 0x40, 0x14, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, + 0x18, 0x13, 0x0e, 0x0c, 0x07, 0x06, 0x08, 0x07, 0x2b, 0x4b, 0xb0, 0x32, + 0x50, 0x58, 0x40, 0x2d, 0x11, 0x10, 0x02, 0x02, 0x01, 0x01, 0x01, 0x04, + 0x05, 0x02, 0x1e, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, + 0x01, 0x0d, 0x1f, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x24, 0x03, 0x01, + 0x00, 0x00, 0x0e, 0x1f, 0x07, 0x06, 0x02, 0x04, 0x04, 0x0c, 0x04, 0x20, + 0x06, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2b, 0x11, 0x10, 0x02, + 0x02, 0x01, 0x01, 0x01, 0x04, 0x05, 0x02, 0x1e, 0x03, 0x01, 0x00, 0x00, + 0x05, 0x04, 0x00, 0x05, 0x00, 0x00, 0x26, 0x00, 0x02, 0x02, 0x01, 0x01, + 0x00, 0x24, 0x00, 0x01, 0x01, 0x0d, 0x1f, 0x07, 0x06, 0x02, 0x04, 0x04, + 0x0c, 0x04, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, 0x2b, + 0x11, 0x10, 0x02, 0x02, 0x01, 0x01, 0x01, 0x04, 0x05, 0x02, 0x1e, 0x03, + 0x01, 0x00, 0x00, 0x05, 0x04, 0x00, 0x05, 0x00, 0x00, 0x26, 0x00, 0x02, + 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0d, 0x1f, 0x07, 0x06, + 0x02, 0x04, 0x04, 0x0f, 0x04, 0x20, 0x05, 0x1b, 0x4b, 0xb0, 0xc6, 0x50, + 0x58, 0x40, 0x2b, 0x11, 0x10, 0x02, 0x02, 0x01, 0x01, 0x01, 0x04, 0x05, + 0x02, 0x1e, 0x07, 0x06, 0x02, 0x04, 0x05, 0x04, 0x35, 0x03, 0x01, 0x00, + 0x00, 0x05, 0x04, 0x00, 0x05, 0x00, 0x00, 0x26, 0x00, 0x02, 0x02, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0d, 0x02, 0x20, 0x05, 0x1b, 0x4b, + 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x35, 0x11, 0x10, 0x02, 0x02, 0x01, 0x01, + 0x01, 0x04, 0x05, 0x02, 0x1e, 0x07, 0x06, 0x02, 0x04, 0x05, 0x04, 0x35, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x02, 0x01, 0x00, 0x26, 0x03, 0x01, + 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x23, 0x03, 0x01, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x24, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x21, 0x06, 0x1b, + 0x40, 0x41, 0x11, 0x10, 0x02, 0x02, 0x01, 0x01, 0x01, 0x06, 0x05, 0x02, + 0x1e, 0x00, 0x00, 0x02, 0x03, 0x02, 0x00, 0x03, 0x32, 0x07, 0x01, 0x06, + 0x05, 0x04, 0x05, 0x06, 0x04, 0x32, 0x00, 0x04, 0x04, 0x33, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x01, 0x02, 0x01, 0x00, 0x26, 0x00, 0x03, 0x05, 0x05, + 0x03, 0x00, 0x00, 0x23, 0x00, 0x03, 0x03, 0x05, 0x00, 0x00, 0x24, 0x00, + 0x05, 0x03, 0x05, 0x00, 0x00, 0x21, 0x08, 0x59, 0x59, 0x59, 0x59, 0x59, + 0xb0, 0x38, 0x2b, 0x33, 0x11, 0x27, 0x2e, 0x01, 0x3d, 0x01, 0x33, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x0e, 0x01, 0x23, 0x22, + 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, + 0xba, 0x70, 0x15, 0x1b, 0xa0, 0x3a, 0x74, 0xad, 0x73, 0x26, 0x4f, 0x1d, + 0x06, 0x02, 0x14, 0x13, 0x0b, 0x18, 0x0f, 0xb1, 0xa1, 0x02, 0x64, 0xb2, + 0xfe, 0x54, 0x03, 0x5d, 0x0d, 0x05, 0x15, 0x14, 0x49, 0x38, 0x5d, 0x9b, + 0x70, 0x3e, 0x0a, 0x0a, 0x5d, 0x0d, 0x07, 0x01, 0x93, 0x94, 0x33, 0xfc, + 0x1f, 0x03, 0x60, 0xfc, 0xa0, 0x00, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x00, + 0x03, 0xf2, 0x05, 0xb4, 0x00, 0x1f, 0x01, 0xa2, 0x40, 0x16, 0x00, 0x00, + 0x00, 0x1f, 0x00, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x18, 0x14, 0x13, 0x12, + 0x11, 0x0f, 0x0e, 0x0c, 0x07, 0x06, 0x09, 0x07, 0x2b, 0x4b, 0xb0, 0x26, + 0x50, 0x58, 0x40, 0x29, 0x01, 0x01, 0x03, 0x06, 0x01, 0x1e, 0x00, 0x04, + 0x04, 0x01, 0x01, 0x00, 0x24, 0x02, 0x01, 0x01, 0x01, 0x0d, 0x1f, 0x00, + 0x06, 0x06, 0x00, 0x00, 0x00, 0x24, 0x05, 0x01, 0x00, 0x00, 0x0e, 0x1f, + 0x08, 0x07, 0x02, 0x03, 0x03, 0x0c, 0x03, 0x20, 0x06, 0x1b, 0x4b, 0xb0, + 0x32, 0x50, 0x58, 0x40, 0x2d, 0x01, 0x01, 0x03, 0x06, 0x01, 0x1e, 0x00, + 0x02, 0x02, 0x11, 0x1f, 0x00, 0x04, 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, + 0x01, 0x01, 0x0d, 0x1f, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x24, 0x05, + 0x01, 0x00, 0x00, 0x0e, 0x1f, 0x08, 0x07, 0x02, 0x03, 0x03, 0x0c, 0x03, + 0x20, 0x07, 0x1b, 0x4b, 0xb0, 0x5f, 0x50, 0x58, 0x40, 0x2b, 0x01, 0x01, + 0x03, 0x06, 0x01, 0x1e, 0x05, 0x01, 0x00, 0x00, 0x06, 0x03, 0x00, 0x06, + 0x00, 0x00, 0x26, 0x00, 0x02, 0x02, 0x11, 0x1f, 0x00, 0x04, 0x04, 0x01, + 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0d, 0x1f, 0x08, 0x07, 0x02, 0x03, + 0x03, 0x0c, 0x03, 0x20, 0x06, 0x1b, 0x4b, 0xb0, 0x6c, 0x50, 0x58, 0x40, + 0x2d, 0x01, 0x01, 0x03, 0x06, 0x01, 0x1e, 0x05, 0x01, 0x00, 0x00, 0x06, + 0x03, 0x00, 0x06, 0x00, 0x00, 0x26, 0x00, 0x04, 0x04, 0x01, 0x01, 0x00, + 0x24, 0x00, 0x01, 0x01, 0x0d, 0x1f, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, + 0x24, 0x08, 0x07, 0x02, 0x03, 0x03, 0x0f, 0x03, 0x20, 0x06, 0x1b, 0x4b, + 0xb0, 0xa4, 0x50, 0x58, 0x40, 0x2a, 0x01, 0x01, 0x03, 0x06, 0x01, 0x1e, + 0x05, 0x01, 0x00, 0x00, 0x06, 0x03, 0x00, 0x06, 0x00, 0x00, 0x26, 0x00, + 0x02, 0x08, 0x07, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x25, 0x00, 0x04, + 0x04, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x20, 0x05, + 0x1b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x34, 0x01, 0x01, 0x03, 0x06, + 0x01, 0x1e, 0x00, 0x02, 0x04, 0x03, 0x02, 0x01, 0x00, 0x23, 0x00, 0x01, + 0x00, 0x04, 0x00, 0x01, 0x04, 0x01, 0x00, 0x26, 0x05, 0x01, 0x00, 0x00, + 0x06, 0x03, 0x00, 0x06, 0x00, 0x00, 0x26, 0x00, 0x02, 0x02, 0x03, 0x00, + 0x00, 0x24, 0x08, 0x07, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x21, 0x06, + 0x1b, 0x40, 0x42, 0x01, 0x01, 0x07, 0x06, 0x01, 0x1e, 0x00, 0x00, 0x04, + 0x05, 0x04, 0x00, 0x05, 0x32, 0x08, 0x01, 0x07, 0x06, 0x03, 0x06, 0x07, + 0x03, 0x32, 0x00, 0x02, 0x04, 0x03, 0x02, 0x01, 0x00, 0x23, 0x00, 0x01, + 0x00, 0x04, 0x00, 0x01, 0x04, 0x01, 0x00, 0x26, 0x00, 0x05, 0x00, 0x06, + 0x07, 0x05, 0x06, 0x00, 0x00, 0x26, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, + 0x24, 0x00, 0x03, 0x02, 0x03, 0x00, 0x00, 0x21, 0x08, 0x59, 0x59, 0x59, + 0x59, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x33, 0x11, 0x27, 0x2e, 0x01, 0x3d, + 0x01, 0x33, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x3b, 0x01, 0x11, + 0x23, 0x11, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, + 0x11, 0xba, 0x70, 0x15, 0x1b, 0xa0, 0x34, 0x68, 0x9c, 0x68, 0x53, 0x99, + 0x48, 0x64, 0xb2, 0x36, 0x6d, 0x28, 0x82, 0x8c, 0x01, 0x08, 0xfe, 0xfe, + 0x03, 0x5d, 0x0d, 0x05, 0x15, 0x14, 0x49, 0x36, 0x54, 0x97, 0x70, 0x42, + 0x0d, 0xfa, 0x59, 0x05, 0x2a, 0x02, 0x06, 0x95, 0x86, 0x36, 0x81, 0xfc, + 0xa0, 0x00, 0x00, 0x01, 0xff, 0xd4, 0x06, 0x0a, 0x01, 0xc4, 0x06, 0xf6, + 0x00, 0x09, 0x00, 0x1d, 0x40, 0x0a, 0x01, 0x00, 0x06, 0x04, 0x00, 0x09, + 0x01, 0x09, 0x03, 0x07, 0x2b, 0x40, 0x0b, 0x02, 0x01, 0x00, 0x01, 0x00, + 0x34, 0x00, 0x01, 0x01, 0x2b, 0x02, 0xb0, 0x38, 0x2b, 0x13, 0x32, 0x16, + 0x1f, 0x01, 0x23, 0x22, 0x26, 0x27, 0x25, 0x9d, 0x20, 0x20, 0x14, 0xd3, + 0x8b, 0x15, 0x18, 0x11, 0xfe, 0xd9, 0x06, 0xf6, 0x0d, 0x14, 0xcb, 0x07, + 0x0c, 0xd9, 0x00, 0x02, 0xff, 0xf0, 0x06, 0x16, 0x02, 0x76, 0x06, 0xf2, + 0x00, 0x13, 0x00, 0x27, 0x00, 0x56, 0x40, 0x0a, 0x24, 0x22, 0x1a, 0x18, + 0x10, 0x0e, 0x06, 0x04, 0x04, 0x07, 0x2b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, + 0x40, 0x1a, 0x03, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x23, 0x03, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x02, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x21, 0x03, 0x1b, 0x40, 0x21, 0x00, 0x01, 0x03, 0x00, 0x01, + 0x01, 0x00, 0x23, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x02, 0x01, 0x00, + 0x26, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x21, 0x04, 0x59, 0xb0, 0x38, 0x2b, 0x13, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, + 0x05, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x1e, 0x02, 0xcc, 0x12, 0x1e, 0x29, 0x17, 0x15, 0x27, 0x1e, + 0x12, 0x12, 0x1e, 0x27, 0x15, 0x17, 0x29, 0x1e, 0x12, 0x01, 0xaa, 0x12, + 0x1e, 0x28, 0x16, 0x17, 0x28, 0x1e, 0x11, 0x11, 0x1e, 0x28, 0x17, 0x16, + 0x28, 0x1e, 0x12, 0x06, 0x82, 0x16, 0x27, 0x1e, 0x11, 0x11, 0x1e, 0x27, + 0x16, 0x17, 0x29, 0x1e, 0x12, 0x12, 0x1e, 0x29, 0x17, 0x16, 0x27, 0x1e, + 0x11, 0x11, 0x1e, 0x27, 0x16, 0x17, 0x29, 0x1e, 0x12, 0x12, 0x1e, 0x29, + 0x00, 0x01, 0x00, 0x44, 0x06, 0x27, 0x02, 0x22, 0x06, 0x91, 0x00, 0x03, + 0x00, 0x25, 0x40, 0x06, 0x03, 0x02, 0x01, 0x00, 0x02, 0x07, 0x2b, 0x40, + 0x17, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x21, 0x03, + 0xb0, 0x38, 0x2b, 0x13, 0x21, 0x15, 0x21, 0x44, 0x01, 0xde, 0xfe, 0x22, + 0x06, 0x91, 0x6a, 0x00, 0x00, 0x01, 0x00, 0xa2, 0x06, 0x0a, 0x02, 0x92, + 0x06, 0xf6, 0x00, 0x0b, 0x00, 0x1d, 0x40, 0x0a, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x0a, 0x05, 0x03, 0x03, 0x07, 0x2b, 0x40, 0x0b, 0x02, 0x01, 0x01, + 0x00, 0x01, 0x34, 0x00, 0x00, 0x00, 0x2b, 0x02, 0xb0, 0x38, 0x2b, 0x01, + 0x05, 0x0e, 0x01, 0x2b, 0x01, 0x37, 0x3e, 0x03, 0x33, 0x02, 0x92, 0xfe, + 0xda, 0x11, 0x1a, 0x15, 0x8a, 0xd3, 0x0a, 0x11, 0x12, 0x16, 0x11, 0x06, + 0xf6, 0xd8, 0x0c, 0x08, 0xcb, 0x0a, 0x0c, 0x08, 0x03, 0x00, 0x00, 0x01, + 0xff, 0xec, 0x06, 0x0a, 0x02, 0x78, 0x06, 0xdc, 0x00, 0x10, 0x00, 0x3f, + 0x40, 0x08, 0x10, 0x0f, 0x0e, 0x0c, 0x02, 0x00, 0x03, 0x07, 0x2b, 0x4b, + 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x11, 0x07, 0x01, 0x00, 0x02, 0x01, 0x1e, + 0x00, 0x02, 0x00, 0x02, 0x34, 0x01, 0x01, 0x00, 0x00, 0x2b, 0x03, 0x1b, + 0x40, 0x15, 0x07, 0x01, 0x01, 0x02, 0x01, 0x1e, 0x00, 0x02, 0x01, 0x02, + 0x34, 0x00, 0x01, 0x00, 0x01, 0x34, 0x00, 0x00, 0x00, 0x2b, 0x04, 0x59, + 0xb0, 0x38, 0x2b, 0x01, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x06, + 0x0f, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x37, 0x33, 0x02, 0x78, 0x87, 0x0c, + 0x1c, 0x09, 0x82, 0x08, 0x04, 0x08, 0x04, 0x82, 0x09, 0x1c, 0x0c, 0x87, + 0xee, 0xb0, 0x06, 0x0a, 0x07, 0x06, 0x5f, 0x04, 0x04, 0x06, 0x02, 0x5f, + 0x06, 0x07, 0xd2, 0x00, 0x00, 0x01, 0xff, 0xec, 0x06, 0x0a, 0x02, 0x78, + 0x06, 0xdc, 0x00, 0x12, 0x00, 0x3f, 0x40, 0x08, 0x12, 0x10, 0x04, 0x02, + 0x01, 0x00, 0x03, 0x07, 0x2b, 0x4b, 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x11, + 0x0a, 0x01, 0x00, 0x01, 0x01, 0x1e, 0x02, 0x01, 0x01, 0x00, 0x01, 0x34, + 0x00, 0x00, 0x00, 0x2b, 0x03, 0x1b, 0x40, 0x15, 0x0a, 0x01, 0x00, 0x02, + 0x01, 0x1e, 0x00, 0x01, 0x02, 0x01, 0x34, 0x00, 0x02, 0x00, 0x02, 0x34, + 0x00, 0x00, 0x00, 0x2b, 0x04, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x23, 0x27, + 0x33, 0x32, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x17, 0x3e, 0x01, 0x3f, 0x01, + 0x3e, 0x01, 0x3b, 0x01, 0x01, 0x8a, 0xb0, 0xee, 0x87, 0x0c, 0x1c, 0x09, + 0x82, 0x03, 0x07, 0x02, 0x02, 0x07, 0x03, 0x82, 0x09, 0x1c, 0x0c, 0x87, + 0x06, 0x0a, 0xd2, 0x07, 0x06, 0x5e, 0x02, 0x06, 0x03, 0x03, 0x06, 0x02, + 0x5e, 0x06, 0x07, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x05, 0xf7, 0x02, 0x4a, + 0x06, 0xdc, 0x00, 0x0d, 0x00, 0x5f, 0x40, 0x0e, 0x01, 0x00, 0x0b, 0x0a, + 0x08, 0x06, 0x04, 0x03, 0x00, 0x0d, 0x01, 0x0d, 0x05, 0x07, 0x2b, 0x4b, + 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x1e, 0x03, 0x01, 0x01, 0x02, 0x01, 0x34, + 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, 0x00, + 0x01, 0x00, 0x24, 0x04, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x21, 0x04, + 0x1b, 0x40, 0x22, 0x00, 0x01, 0x03, 0x01, 0x34, 0x00, 0x03, 0x02, 0x03, + 0x34, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x23, 0x00, 0x02, 0x02, + 0x00, 0x01, 0x00, 0x24, 0x04, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x21, + 0x05, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x06, 0x01, 0x33, 0x89, 0x8e, 0x73, + 0x4e, 0x56, 0x56, 0x4e, 0x73, 0x8f, 0x05, 0xf7, 0x73, 0x72, 0x3b, 0x3d, + 0x3d, 0x3b, 0x69, 0x7c, 0x00, 0x01, 0x00, 0xb8, 0x06, 0x1f, 0x01, 0xac, + 0x07, 0x13, 0x00, 0x13, 0x00, 0x25, 0x40, 0x06, 0x10, 0x0e, 0x06, 0x04, + 0x02, 0x07, 0x2b, 0x40, 0x17, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x23, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x21, 0x03, 0xb0, 0x38, 0x2b, 0x01, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x01, + 0xac, 0x14, 0x22, 0x2d, 0x19, 0x18, 0x2c, 0x21, 0x13, 0x13, 0x21, 0x2c, + 0x18, 0x19, 0x2d, 0x22, 0x14, 0x06, 0x98, 0x18, 0x2c, 0x21, 0x14, 0x14, + 0x21, 0x2c, 0x18, 0x19, 0x2c, 0x22, 0x14, 0x14, 0x22, 0x2c, 0x00, 0x02, + 0x00, 0x76, 0x05, 0xcd, 0x01, 0xf1, 0x07, 0x2d, 0x00, 0x13, 0x00, 0x1f, + 0x00, 0x33, 0x40, 0x0a, 0x1e, 0x1c, 0x18, 0x16, 0x10, 0x0e, 0x06, 0x04, + 0x04, 0x07, 0x2b, 0x40, 0x21, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, + 0x01, 0x00, 0x26, 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x23, 0x00, + 0x02, 0x02, 0x01, 0x01, 0x00, 0x24, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, + 0x21, 0x04, 0xb0, 0x38, 0x2b, 0x13, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x37, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x76, 0x1f, 0x33, + 0x44, 0x26, 0x27, 0x45, 0x35, 0x1e, 0x1e, 0x35, 0x45, 0x27, 0x26, 0x44, + 0x33, 0x1f, 0x59, 0x36, 0x2f, 0x2d, 0x37, 0x37, 0x2d, 0x2f, 0x36, 0x06, + 0x7b, 0x27, 0x42, 0x2f, 0x1a, 0x1a, 0x2f, 0x42, 0x27, 0x26, 0x40, 0x2e, + 0x1a, 0x1a, 0x2e, 0x40, 0x26, 0x2b, 0x39, 0x39, 0x2b, 0x2d, 0x38, 0x38, + 0x00, 0x01, 0x00, 0x1a, 0x06, 0x08, 0x02, 0x56, 0x06, 0xd2, 0x00, 0x1b, + 0x00, 0xb0, 0x40, 0x12, 0x01, 0x00, 0x18, 0x16, 0x12, 0x11, 0x0f, 0x0d, + 0x0a, 0x08, 0x04, 0x03, 0x00, 0x1b, 0x01, 0x1b, 0x07, 0x07, 0x2b, 0x4b, + 0xb0, 0x5b, 0x50, 0x58, 0x40, 0x25, 0x06, 0x01, 0x00, 0x03, 0x02, 0x00, + 0x01, 0x00, 0x23, 0x05, 0x01, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x01, + 0x00, 0x26, 0x06, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x04, 0x01, + 0x02, 0x00, 0x02, 0x01, 0x00, 0x21, 0x04, 0x1b, 0x4b, 0xb0, 0x70, 0x50, + 0x58, 0x40, 0x2c, 0x00, 0x01, 0x05, 0x00, 0x05, 0x01, 0x00, 0x32, 0x06, + 0x01, 0x00, 0x03, 0x02, 0x00, 0x01, 0x00, 0x23, 0x00, 0x05, 0x00, 0x03, + 0x02, 0x05, 0x03, 0x01, 0x00, 0x26, 0x06, 0x01, 0x00, 0x00, 0x02, 0x01, + 0x00, 0x24, 0x04, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00, 0x21, 0x05, 0x1b, + 0x40, 0x33, 0x00, 0x01, 0x05, 0x00, 0x05, 0x01, 0x00, 0x32, 0x00, 0x04, + 0x03, 0x02, 0x03, 0x04, 0x02, 0x32, 0x06, 0x01, 0x00, 0x03, 0x02, 0x00, + 0x01, 0x00, 0x23, 0x00, 0x05, 0x00, 0x03, 0x04, 0x05, 0x03, 0x01, 0x00, + 0x26, 0x06, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, 0x00, + 0x02, 0x01, 0x00, 0x21, 0x06, 0x59, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x32, + 0x36, 0x37, 0x33, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x23, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x01, 0xab, + 0x23, 0x25, 0x01, 0x62, 0x16, 0x2a, 0x3e, 0x28, 0x23, 0x40, 0x3b, 0x34, + 0x18, 0x22, 0x25, 0x01, 0x64, 0x17, 0x2b, 0x3f, 0x27, 0x23, 0x40, 0x3a, + 0x34, 0x06, 0x7f, 0x29, 0x25, 0x2b, 0x48, 0x35, 0x1d, 0x1a, 0x1f, 0x1a, + 0x2b, 0x24, 0x2b, 0x49, 0x34, 0x1e, 0x1a, 0x1f, 0x1a, 0x00, 0x00, 0x02, + 0x00, 0x4e, 0x06, 0x0a, 0x02, 0xfa, 0x06, 0xeb, 0x00, 0x09, 0x00, 0x13, + 0x00, 0x68, 0x40, 0x12, 0x0a, 0x0a, 0x00, 0x00, 0x0a, 0x13, 0x0a, 0x12, + 0x0f, 0x0d, 0x00, 0x09, 0x00, 0x08, 0x05, 0x03, 0x06, 0x07, 0x2b, 0x4b, + 0xb0, 0xe8, 0x50, 0x58, 0x40, 0x1e, 0x05, 0x03, 0x04, 0x03, 0x01, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x23, 0x05, 0x03, 0x04, 0x03, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x24, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x21, 0x03, + 0x1b, 0x40, 0x27, 0x05, 0x01, 0x03, 0x01, 0x02, 0x01, 0x03, 0x02, 0x32, + 0x00, 0x00, 0x02, 0x00, 0x35, 0x04, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, + 0x00, 0x23, 0x04, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x24, 0x00, 0x02, + 0x01, 0x02, 0x01, 0x00, 0x21, 0x05, 0x59, 0xb0, 0x38, 0x2b, 0x01, 0x07, + 0x0e, 0x01, 0x2b, 0x01, 0x37, 0x3e, 0x01, 0x33, 0x21, 0x07, 0x0e, 0x01, + 0x2b, 0x01, 0x37, 0x3e, 0x01, 0x33, 0x01, 0xa8, 0xc7, 0x0e, 0x1b, 0x14, + 0x56, 0x8e, 0x10, 0x26, 0x21, 0x01, 0xc7, 0xf3, 0x11, 0x1d, 0x15, 0x60, + 0xb3, 0x13, 0x28, 0x20, 0x06, 0xeb, 0xc6, 0x0e, 0x0d, 0xb5, 0x14, 0x18, + 0xc6, 0x0d, 0x0e, 0xb5, 0x14, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x13, 0x00, 0x82, 0x00, 0x07, 0x00, 0x62, 0x00, 0x04, 0x00, 0x02, + 0x00, 0x22, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x00, 0x00, 0x90, 0x06, 0xe5, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0xd9, + 0x00, 0xd9, 0x01, 0x4c, 0x01, 0xc2, 0x02, 0xc3, 0x03, 0xe4, 0x05, 0x10, + 0x06, 0x21, 0x06, 0x61, 0x06, 0x94, 0x06, 0xc7, 0x07, 0x48, 0x07, 0x9b, + 0x07, 0xf9, 0x08, 0x19, 0x08, 0x62, 0x08, 0x8e, 0x09, 0x08, 0x09, 0x91, + 0x0a, 0x39, 0x0b, 0x1f, 0x0b, 0xad, 0x0c, 0x62, 0x0c, 0xf9, 0x0d, 0x51, + 0x0e, 0x17, 0x0e, 0xb4, 0x0f, 0x39, 0x0f, 0xd5, 0x0f, 0xfe, 0x10, 0x2b, + 0x10, 0x52, 0x11, 0x08, 0x12, 0x2b, 0x12, 0xb5, 0x13, 0x53, 0x13, 0xff, + 0x14, 0x69, 0x14, 0xd2, 0x15, 0x2d, 0x15, 0xec, 0x16, 0x5c, 0x16, 0x91, + 0x17, 0x0e, 0x17, 0xad, 0x17, 0xef, 0x18, 0x8c, 0x18, 0xfe, 0x19, 0x7a, + 0x19, 0xe9, 0x1a, 0xb3, 0x1b, 0x5c, 0x1c, 0x12, 0x1c, 0x73, 0x1c, 0xea, + 0x1d, 0x4a, 0x1d, 0xdb, 0x1e, 0x61, 0x1e, 0xc9, 0x1f, 0x24, 0x1f, 0x59, + 0x1f, 0x85, 0x1f, 0xb7, 0x20, 0x07, 0x20, 0x29, 0x20, 0x58, 0x21, 0x43, + 0x22, 0x2c, 0x22, 0xeb, 0x23, 0xc2, 0x24, 0x8d, 0x25, 0x4d, 0x26, 0x7e, + 0x27, 0x1c, 0x27, 0xa5, 0x28, 0x63, 0x29, 0x22, 0x29, 0x67, 0x2a, 0x32, + 0x2a, 0xd1, 0x2b, 0x5c, 0x2c, 0x51, 0x2d, 0x47, 0x2d, 0xdd, 0x2e, 0x92, + 0x2f, 0x6d, 0x30, 0x10, 0x30, 0x70, 0x31, 0x17, 0x31, 0x9f, 0x32, 0x08, + 0x32, 0x63, 0x32, 0xdb, 0x33, 0x06, 0x33, 0x7f, 0x33, 0xcd, 0x33, 0xcd, + 0x34, 0x40, 0x35, 0x61, 0x36, 0x4f, 0x36, 0xed, 0x37, 0xb1, 0x37, 0xee, + 0x38, 0xb5, 0x39, 0x27, 0x3a, 0x58, 0x3b, 0x20, 0x3b, 0x6b, 0x3b, 0xa4, + 0x3b, 0xc4, 0x3d, 0x01, 0x3d, 0x21, 0x3d, 0x84, 0x3d, 0xea, 0x3e, 0x6d, + 0x3f, 0x1c, 0x3f, 0x4c, 0x40, 0x28, 0x40, 0x9a, 0x40, 0xcd, 0x41, 0x5c, + 0x41, 0xca, 0x42, 0x2b, 0x42, 0x6f, 0x43, 0x97, 0x44, 0xf3, 0x46, 0xab, + 0x47, 0x63, 0x47, 0x6f, 0x47, 0x7b, 0x47, 0x87, 0x47, 0x93, 0x47, 0x9f, + 0x47, 0xab, 0x48, 0x6a, 0x4a, 0x13, 0x4a, 0x1f, 0x4a, 0x2b, 0x4a, 0x37, + 0x4a, 0x43, 0x4a, 0x4e, 0x4a, 0x59, 0x4a, 0x64, 0x4a, 0x6f, 0x4b, 0x18, + 0x4b, 0x24, 0x4b, 0x30, 0x4b, 0x3c, 0x4b, 0x48, 0x4b, 0x54, 0x4b, 0x60, + 0x4b, 0x85, 0x4c, 0x6b, 0x4c, 0x77, 0x4c, 0x83, 0x4c, 0x8f, 0x4c, 0x9b, + 0x4c, 0xa7, 0x4d, 0x20, 0x4d, 0xf9, 0x4e, 0x05, 0x4e, 0x11, 0x4e, 0x1d, + 0x4e, 0x29, 0x4e, 0x35, 0x4e, 0x41, 0x50, 0x93, 0x51, 0xab, 0x51, 0xb7, + 0x51, 0xc3, 0x51, 0xcf, 0x51, 0xdb, 0x51, 0xe6, 0x51, 0xf1, 0x51, 0xfc, + 0x52, 0x07, 0x52, 0xae, 0x52, 0xba, 0x52, 0xc6, 0x52, 0xd2, 0x52, 0xde, + 0x52, 0xea, 0x52, 0xf6, 0x53, 0x58, 0x54, 0x42, 0x54, 0x4e, 0x54, 0x5a, + 0x54, 0x66, 0x54, 0x72, 0x54, 0x7e, 0x55, 0x75, 0x55, 0x81, 0x56, 0xa4, + 0x58, 0x09, 0x58, 0x15, 0x58, 0x21, 0x59, 0x43, 0x5a, 0x83, 0x5a, 0xbd, + 0x5b, 0x21, 0x5b, 0x8e, 0x5b, 0x9a, 0x5b, 0xa6, 0x5d, 0x08, 0x5e, 0xa6, + 0x5e, 0xb2, 0x5e, 0xbe, 0x5e, 0xca, 0x5e, 0xd6, 0x5e, 0xe2, 0x5e, 0xee, + 0x5e, 0xfa, 0x5f, 0x06, 0x5f, 0x12, 0x5f, 0x1e, 0x5f, 0x2a, 0x5f, 0xde, + 0x60, 0x26, 0x60, 0x74, 0x60, 0x7c, 0x60, 0xdc, 0x61, 0x0b, 0x61, 0x64, + 0x61, 0xd5, 0x62, 0x68, 0x62, 0xcf, 0x63, 0x92, 0x63, 0xb2, 0x63, 0xd2, + 0x63, 0xfe, 0x64, 0x2a, 0x64, 0x56, 0x64, 0xa4, 0x64, 0xf3, 0x65, 0x42, + 0x66, 0x2d, 0x67, 0x68, 0x67, 0xa6, 0x68, 0x48, 0x69, 0xe7, 0x6a, 0x11, + 0x6a, 0x38, 0x6a, 0x6e, 0x6b, 0x96, 0x6c, 0x48, 0x6d, 0x05, 0x6d, 0xcc, + 0x6e, 0x26, 0x6e, 0x98, 0x6f, 0x04, 0x6f, 0x24, 0x6f, 0x90, 0x70, 0x50, + 0x70, 0xd1, 0x71, 0xad, 0x72, 0x38, 0x72, 0x79, 0x72, 0xba, 0x73, 0x00, + 0x73, 0x2e, 0x74, 0x17, 0x75, 0x17, 0x75, 0x3b, 0x75, 0xa0, 0x75, 0xc0, + 0x75, 0xe7, 0x76, 0x26, 0x76, 0x68, 0x76, 0xb0, 0x76, 0xe3, 0x77, 0x2c, + 0x77, 0xaf, 0x78, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1a, 0xa0, + 0xf4, 0x0e, 0x7d, 0xd1, 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x19, 0x07, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0xca, 0x93, 0x5e, 0x70, 0x00, 0x00, 0x00, 0x00, + 0xca, 0xdf, 0x2e, 0x85, 0xff, 0x44, 0xfe, 0x93, 0x08, 0xb9, 0x07, 0x2d, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x27, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x82, 0x00, 0x00, 0x02, 0xae, 0x00, 0xda, 0x03, 0x1a, 0x00, 0x98, + 0x04, 0x88, 0x00, 0x36, 0x04, 0x88, 0x00, 0x6a, 0x06, 0x24, 0x00, 0x48, + 0x05, 0x7e, 0x00, 0x52, 0x01, 0xcc, 0x00, 0x98, 0x02, 0x58, 0x00, 0x86, + 0x02, 0x58, 0x00, 0x4a, 0x03, 0x20, 0x00, 0x60, 0x04, 0x88, 0x00, 0x64, + 0x01, 0xa8, 0x00, 0x5e, 0x02, 0xb6, 0x00, 0x64, 0x01, 0xa8, 0x00, 0x58, + 0x02, 0xea, 0xff, 0xf4, 0x04, 0x88, 0x00, 0x3c, 0x04, 0x88, 0x00, 0xca, + 0x04, 0x88, 0x00, 0x68, 0x04, 0x88, 0x00, 0x6c, 0x04, 0x88, 0x00, 0x28, + 0x04, 0x88, 0x00, 0x6c, 0x04, 0x88, 0x00, 0x6c, 0x04, 0x88, 0x00, 0x6e, + 0x04, 0x88, 0x00, 0x60, 0x04, 0x88, 0x00, 0x94, 0x01, 0xf8, 0x00, 0x80, + 0x01, 0xf8, 0x00, 0x80, 0x04, 0x88, 0x00, 0x94, 0x04, 0x88, 0x00, 0x96, + 0x04, 0x88, 0x00, 0xee, 0x03, 0x1c, 0x00, 0x22, 0x06, 0x6c, 0x00, 0x56, + 0x05, 0x50, 0x00, 0x0a, 0x05, 0x0e, 0x00, 0xae, 0x05, 0x5a, 0x00, 0x5a, + 0x05, 0xe2, 0x00, 0xae, 0x04, 0x8a, 0x00, 0xae, 0x04, 0x6c, 0x00, 0xae, + 0x05, 0xbc, 0x00, 0x5a, 0x05, 0xe8, 0x00, 0xae, 0x02, 0x66, 0x00, 0xd2, + 0x03, 0x78, 0x00, 0x3c, 0x05, 0x52, 0x00, 0xc2, 0x04, 0x04, 0x00, 0xae, + 0x07, 0x30, 0x00, 0xae, 0x05, 0xe8, 0x00, 0xae, 0x06, 0x3c, 0x00, 0x5c, + 0x04, 0xc6, 0x00, 0xc2, 0x06, 0x3c, 0x00, 0x5c, 0x05, 0x08, 0x00, 0xc2, + 0x04, 0x24, 0x00, 0x3a, 0x04, 0x9c, 0x00, 0x1c, 0x05, 0xb4, 0x00, 0xa0, + 0x05, 0x50, 0x00, 0x08, 0x07, 0xf6, 0x00, 0x0e, 0x05, 0x06, 0x00, 0x0e, + 0x04, 0xea, 0x00, 0x08, 0x04, 0xe0, 0x00, 0x56, 0x02, 0x58, 0x00, 0x8e, + 0x02, 0xee, 0xff, 0xec, 0x02, 0x58, 0x00, 0x5a, 0x04, 0x88, 0x00, 0x9e, + 0x03, 0x14, 0x00, 0x00, 0x02, 0x66, 0x00, 0x26, 0x03, 0xf6, 0x00, 0x5c, + 0x04, 0x5e, 0x00, 0x98, 0x03, 0xa6, 0x00, 0x4a, 0x04, 0x5e, 0x00, 0x48, + 0x04, 0x18, 0x00, 0x4a, 0x02, 0xa2, 0x00, 0x1a, 0x03, 0xfe, 0x00, 0x32, + 0x04, 0x58, 0x00, 0x92, 0x02, 0x00, 0x00, 0x82, 0x01, 0xfc, 0xff, 0xc8, + 0x04, 0x18, 0x00, 0x98, 0x02, 0x00, 0x00, 0xa6, 0x06, 0x6a, 0x00, 0x92, + 0x04, 0x58, 0x00, 0x92, 0x04, 0x58, 0x00, 0x48, 0x04, 0x50, 0x00, 0x92, + 0x04, 0x5e, 0x00, 0x48, 0x03, 0x26, 0x00, 0x92, 0x03, 0x64, 0x00, 0x3e, + 0x02, 0xea, 0x00, 0x2c, 0x04, 0x58, 0x00, 0x7a, 0x04, 0x00, 0x00, 0x12, + 0x05, 0xfc, 0x00, 0x0e, 0x03, 0xf0, 0x00, 0x1c, 0x04, 0x00, 0x00, 0x0e, + 0x03, 0x9c, 0x00, 0x46, 0x02, 0x58, 0x00, 0x2c, 0x02, 0x58, 0x00, 0xe6, + 0x02, 0x58, 0x00, 0x58, 0x04, 0x88, 0x00, 0x74, 0x01, 0x82, 0x00, 0x00, + 0x02, 0xae, 0x00, 0xda, 0x04, 0x88, 0x00, 0x8a, 0x04, 0x88, 0x00, 0x34, + 0x04, 0x88, 0x00, 0x84, 0x04, 0x88, 0x00, 0x2c, 0x02, 0x58, 0x00, 0xe6, + 0x03, 0xee, 0x00, 0x72, 0x02, 0x66, 0x00, 0x0e, 0x06, 0x3c, 0x00, 0x44, + 0x02, 0xac, 0x00, 0x5c, 0x03, 0x9e, 0x00, 0x8a, 0x04, 0x88, 0x00, 0x94, + 0x02, 0xb6, 0x00, 0x64, 0x06, 0x3c, 0x00, 0x44, 0x02, 0x66, 0x00, 0x14, + 0x03, 0x1a, 0x00, 0x46, 0x04, 0x88, 0x00, 0x64, 0x02, 0x98, 0x00, 0x52, + 0x02, 0x98, 0x00, 0x54, 0x02, 0x66, 0x00, 0xc4, 0x04, 0x58, 0x00, 0x7a, + 0x05, 0x3a, 0x00, 0x2a, 0x02, 0x22, 0x00, 0x7c, 0x02, 0x66, 0x00, 0x84, + 0x02, 0x98, 0x00, 0x78, 0x02, 0xfa, 0x00, 0x48, 0x03, 0x9e, 0x00, 0x96, + 0x05, 0x90, 0x00, 0x66, 0x05, 0x90, 0x00, 0x66, 0x05, 0x92, 0x00, 0x44, + 0x03, 0x1c, 0x00, 0x2c, 0x05, 0x50, 0x00, 0x0a, 0x05, 0x50, 0x00, 0x0a, + 0x05, 0x50, 0x00, 0x0a, 0x05, 0x50, 0x00, 0x0a, 0x05, 0x50, 0x00, 0x0a, + 0x05, 0x50, 0x00, 0x0a, 0x07, 0x42, 0xff, 0xe8, 0x05, 0x5a, 0x00, 0x5a, + 0x04, 0x8a, 0x00, 0xae, 0x04, 0x8a, 0x00, 0xae, 0x04, 0x8a, 0x00, 0xae, + 0x04, 0x8a, 0x00, 0xae, 0x02, 0x66, 0xff, 0xcc, 0x02, 0x66, 0x00, 0x9a, + 0x02, 0x66, 0xff, 0xef, 0x02, 0x66, 0xff, 0xf2, 0x06, 0x2a, 0x00, 0x32, + 0x05, 0xe8, 0x00, 0xae, 0x06, 0x3c, 0x00, 0x5c, 0x06, 0x3c, 0x00, 0x5c, + 0x06, 0x3c, 0x00, 0x5c, 0x06, 0x3c, 0x00, 0x5c, 0x06, 0x3c, 0x00, 0x5c, + 0x04, 0x88, 0x00, 0x7e, 0x06, 0x3c, 0x00, 0x5c, 0x05, 0xb4, 0x00, 0xa0, + 0x05, 0xb4, 0x00, 0xa0, 0x05, 0xb4, 0x00, 0xa0, 0x05, 0xb4, 0x00, 0xa0, + 0x04, 0xea, 0x00, 0x08, 0x04, 0xc6, 0x00, 0xc2, 0x04, 0xc2, 0x00, 0xba, + 0x03, 0xf6, 0x00, 0x5c, 0x03, 0xf6, 0x00, 0x5c, 0x03, 0xf6, 0x00, 0x5c, + 0x03, 0xf6, 0x00, 0x5c, 0x03, 0xf6, 0x00, 0x5c, 0x03, 0xf6, 0x00, 0x5c, + 0x06, 0x60, 0x00, 0x5c, 0x03, 0xa6, 0x00, 0x4a, 0x04, 0x18, 0x00, 0x4a, + 0x04, 0x18, 0x00, 0x4a, 0x04, 0x18, 0x00, 0x4a, 0x04, 0x18, 0x00, 0x4a, + 0x02, 0x00, 0xff, 0xf9, 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0xff, 0xd2, + 0x02, 0x00, 0xff, 0xe1, 0x04, 0x52, 0x00, 0x4c, 0x04, 0x58, 0x00, 0x92, + 0x04, 0x58, 0x00, 0x48, 0x04, 0x58, 0x00, 0x48, 0x04, 0x58, 0x00, 0x48, + 0x04, 0x58, 0x00, 0x48, 0x04, 0x58, 0x00, 0x48, 0x04, 0x88, 0x00, 0x64, + 0x04, 0x58, 0x00, 0x40, 0x04, 0x58, 0x00, 0x7a, 0x04, 0x58, 0x00, 0x7a, + 0x04, 0x58, 0x00, 0x7a, 0x04, 0x58, 0x00, 0x7a, 0x04, 0x00, 0x00, 0x0e, + 0x04, 0x50, 0x00, 0x92, 0x04, 0x00, 0x00, 0x0e, 0x05, 0x50, 0x00, 0x0a, + 0x03, 0xf6, 0x00, 0x5c, 0x05, 0x5a, 0x00, 0x5a, 0x03, 0xa6, 0x00, 0x4a, + 0x04, 0xa4, 0x00, 0xae, 0x04, 0x18, 0x00, 0x4a, 0x02, 0x00, 0x00, 0xa6, + 0x04, 0x3e, 0x00, 0x2c, 0x02, 0x82, 0x00, 0x36, 0x05, 0xe8, 0x00, 0xae, + 0x04, 0x58, 0x00, 0x92, 0x08, 0x90, 0x00, 0x5c, 0x06, 0xc6, 0x00, 0x48, + 0x04, 0x48, 0x00, 0x3a, 0x03, 0x64, 0x00, 0x3e, 0x04, 0x24, 0x00, 0x3a, + 0x03, 0x64, 0x00, 0x3e, 0x04, 0xea, 0x00, 0x08, 0x04, 0xe0, 0x00, 0x56, + 0x03, 0x9c, 0x00, 0x46, 0x04, 0xe0, 0x00, 0x56, 0x03, 0x9c, 0x00, 0x46, + 0x04, 0xe0, 0x00, 0x56, 0x03, 0x9c, 0x00, 0x46, 0x04, 0x88, 0x00, 0x6a, + 0x02, 0x66, 0x00, 0x00, 0x02, 0x66, 0x00, 0x00, 0x02, 0x66, 0x00, 0x14, + 0x02, 0x66, 0x00, 0x20, 0x02, 0x66, 0x00, 0xb4, 0x02, 0x66, 0x00, 0x6a, + 0x02, 0x66, 0x00, 0x86, 0x02, 0x66, 0x00, 0x12, 0x02, 0x66, 0x00, 0x5e, + 0x04, 0xd4, 0x00, 0x30, 0x04, 0x58, 0x00, 0x9c, 0x06, 0x6a, 0x00, 0x9c, + 0x01, 0xa8, 0x00, 0x3a, 0x01, 0xa8, 0x00, 0x5a, 0x01, 0xa8, 0x00, 0x5a, + 0x02, 0xd8, 0x00, 0x3a, 0x02, 0xd8, 0x00, 0x5a, 0x02, 0xd8, 0x00, 0x5a, + 0x04, 0x88, 0x00, 0x76, 0x04, 0x88, 0x00, 0x76, 0x04, 0x88, 0x00, 0xd0, + 0x05, 0xae, 0x00, 0x58, 0x09, 0x02, 0x00, 0x48, 0x02, 0x78, 0x00, 0x8a, + 0x02, 0x78, 0x00, 0x96, 0x02, 0x66, 0xff, 0x44, 0x04, 0x88, 0x00, 0x22, + 0x05, 0xa0, 0x00, 0x40, 0x05, 0xd6, 0x00, 0x56, 0x04, 0x88, 0x00, 0x5c, + 0x05, 0x70, 0x00, 0x0e, 0x05, 0x58, 0x00, 0x3e, 0x05, 0x58, 0x00, 0x54, + 0x04, 0x88, 0x00, 0x94, 0x04, 0x7a, 0x00, 0x2e, 0x05, 0x58, 0x00, 0x3a, + 0x03, 0x20, 0xff, 0x96, 0x04, 0x88, 0x00, 0xb0, 0x04, 0x88, 0x00, 0x96, + 0x04, 0x88, 0x00, 0x94, 0x04, 0x88, 0x00, 0xee, 0x04, 0x88, 0x00, 0x80, + 0x00, 0x00, 0xff, 0xfe, 0x04, 0x74, 0x00, 0x1a, 0x04, 0xa4, 0x00, 0x1a, + 0x02, 0x66, 0xff, 0xd4, 0xff, 0xf0, 0x00, 0x44, 0x00, 0xa2, 0xff, 0xec, + 0xff, 0xec, 0x00, 0x1c, 0x00, 0xb8, 0x00, 0x76, 0x00, 0x1a, 0x00, 0x4e, + 0x00, 0x01, 0x00, 0x00, 0x07, 0xb6, 0xfe, 0x56, 0x00, 0x00, 0x09, 0x02, + 0xff, 0x44, 0xff, 0x43, 0x08, 0xb9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, + 0x00, 0x03, 0x04, 0x12, 0x01, 0x90, 0x00, 0x05, 0x00, 0x00, 0x05, 0x78, + 0x05, 0x14, 0x00, 0x00, 0x01, 0x18, 0x05, 0x78, 0x05, 0x14, 0x00, 0x00, + 0x03, 0xba, 0x00, 0x78, 0x01, 0xf4, 0x08, 0x03, 0x02, 0x0f, 0x05, 0x02, + 0x02, 0x02, 0x04, 0x03, 0x02, 0x03, 0x80, 0x00, 0x00, 0xaf, 0x40, 0x00, + 0x60, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x79, + 0x50, 0x4c, 0x00, 0x40, 0x00, 0x00, 0xfb, 0x02, 0x06, 0x4a, 0xfe, 0x7a, + 0x01, 0x90, 0x07, 0xb6, 0x01, 0xaa, 0x20, 0x00, 0x00, 0x93, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xf5, 0x05, 0x99, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x04, 0x01, 0x60, + 0x00, 0x00, 0x00, 0x54, 0x00, 0x40, 0x00, 0x05, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x7e, 0x00, 0xff, 0x01, 0x07, 0x01, 0x19, 0x01, 0x31, + 0x01, 0x44, 0x01, 0x53, 0x01, 0x5b, 0x01, 0x61, 0x01, 0x7e, 0x01, 0x92, + 0x02, 0xc7, 0x02, 0xc9, 0x02, 0xdd, 0x03, 0xc0, 0x20, 0x14, 0x20, 0x1a, + 0x20, 0x1e, 0x20, 0x22, 0x20, 0x26, 0x20, 0x30, 0x20, 0x3a, 0x20, 0x44, + 0x20, 0xac, 0x21, 0x22, 0x21, 0x26, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, + 0x22, 0x12, 0x22, 0x1a, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, + 0x22, 0x65, 0x25, 0xca, 0x26, 0x69, 0xfb, 0x02, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x00, 0x20, 0x00, 0xa0, 0x01, 0x04, 0x01, 0x18, + 0x01, 0x31, 0x01, 0x41, 0x01, 0x52, 0x01, 0x5a, 0x01, 0x60, 0x01, 0x78, + 0x01, 0x92, 0x02, 0xc6, 0x02, 0xc9, 0x02, 0xd8, 0x03, 0xc0, 0x20, 0x13, + 0x20, 0x18, 0x20, 0x1c, 0x20, 0x20, 0x20, 0x26, 0x20, 0x30, 0x20, 0x39, + 0x20, 0x44, 0x20, 0xac, 0x21, 0x22, 0x21, 0x26, 0x22, 0x02, 0x22, 0x06, + 0x22, 0x0f, 0x22, 0x11, 0x22, 0x1a, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, + 0x22, 0x60, 0x22, 0x64, 0x25, 0xca, 0x26, 0x69, 0xfb, 0x01, 0xff, 0xff, + 0x00, 0x01, 0xff, 0xf5, 0xff, 0xe3, 0xff, 0xc2, 0xff, 0xbe, 0xff, 0xae, + 0xff, 0x97, 0xff, 0x88, 0xff, 0x7b, 0xff, 0x75, 0xff, 0x71, 0xff, 0x5b, + 0xff, 0x48, 0xfe, 0x15, 0xfe, 0x14, 0xfe, 0x06, 0xfd, 0x24, 0xe0, 0xd2, + 0xe0, 0xcf, 0xe0, 0xce, 0xe0, 0xcd, 0xe0, 0xca, 0xe0, 0xc1, 0xe0, 0xb9, + 0xe0, 0xb0, 0xe0, 0x49, 0xdf, 0xd4, 0xdf, 0xd1, 0xde, 0xf6, 0xde, 0xf3, + 0xde, 0xeb, 0xde, 0xea, 0xde, 0xe3, 0xde, 0xe0, 0xde, 0xd4, 0xde, 0xb8, + 0xde, 0xa1, 0xde, 0x9e, 0xdb, 0x3a, 0xda, 0x9c, 0x06, 0x05, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x00, 0x2c, 0x20, 0x64, 0xb0, 0x20, 0x60, 0x66, 0x23, 0xb0, 0x00, + 0x50, 0x58, 0x65, 0x59, 0x2d, 0xb0, 0x01, 0x2c, 0x20, 0x64, 0x20, 0xb0, + 0xc0, 0x50, 0xb0, 0x04, 0x26, 0x5a, 0xb0, 0x04, 0x45, 0x5b, 0x58, 0x21, + 0x23, 0x21, 0x1b, 0x8a, 0x58, 0x20, 0xb0, 0x50, 0x50, 0x58, 0x21, 0xb0, + 0x40, 0x59, 0x1b, 0x20, 0xb0, 0x38, 0x50, 0x58, 0x21, 0xb0, 0x38, 0x59, + 0x59, 0x20, 0xb0, 0x09, 0x45, 0x61, 0x64, 0xb0, 0x28, 0x50, 0x58, 0x21, + 0xb0, 0x09, 0x45, 0x20, 0xb0, 0x30, 0x50, 0x58, 0x21, 0xb0, 0x30, 0x59, + 0x1b, 0x20, 0xb0, 0xc0, 0x50, 0x58, 0x20, 0x66, 0x20, 0x8a, 0x8a, 0x61, + 0x20, 0xb0, 0x0a, 0x50, 0x58, 0x60, 0x1b, 0x20, 0xb0, 0x20, 0x50, 0x58, + 0x21, 0xb0, 0x0a, 0x60, 0x1b, 0x20, 0xb0, 0x36, 0x50, 0x58, 0x21, 0xb0, + 0x36, 0x60, 0x1b, 0x60, 0x59, 0x59, 0x59, 0x1b, 0xb0, 0x00, 0x2b, 0x59, + 0x59, 0x23, 0xb0, 0x00, 0x50, 0x58, 0x65, 0x59, 0x59, 0x2d, 0xb0, 0x02, + 0x2c, 0xb0, 0x07, 0x23, 0x42, 0xb0, 0x06, 0x23, 0x42, 0xb0, 0x00, 0x23, + 0x42, 0xb0, 0x00, 0x43, 0xb0, 0x06, 0x43, 0x51, 0x58, 0xb0, 0x07, 0x43, + 0x2b, 0xb2, 0x00, 0x01, 0x00, 0x43, 0x60, 0x42, 0xb0, 0x16, 0x65, 0x1c, + 0x59, 0x2d, 0xb0, 0x03, 0x2c, 0xb0, 0x00, 0x43, 0x20, 0x45, 0x20, 0xb0, + 0x02, 0x45, 0x63, 0xb0, 0x01, 0x45, 0x62, 0x60, 0x44, 0x2d, 0xb0, 0x04, + 0x2c, 0xb0, 0x00, 0x43, 0x20, 0x45, 0x20, 0xb0, 0x00, 0x2b, 0x23, 0xb1, + 0x06, 0x04, 0x25, 0x60, 0x20, 0x45, 0x8a, 0x23, 0x61, 0x20, 0x64, 0x20, + 0xb0, 0x20, 0x50, 0x58, 0x21, 0xb0, 0x00, 0x1b, 0xb0, 0x30, 0x50, 0x58, + 0xb0, 0x20, 0x1b, 0xb0, 0x40, 0x59, 0x59, 0x23, 0xb0, 0x00, 0x50, 0x58, + 0x65, 0x59, 0xb0, 0x03, 0x25, 0x23, 0x61, 0x44, 0x44, 0x2d, 0xb0, 0x05, + 0x2c, 0xb0, 0x01, 0x60, 0x20, 0x20, 0xb0, 0x09, 0x43, 0x4a, 0xb0, 0x00, + 0x50, 0x58, 0x20, 0xb0, 0x09, 0x23, 0x42, 0x59, 0xb0, 0x0a, 0x43, 0x4a, + 0xb0, 0x00, 0x52, 0x58, 0x20, 0xb0, 0x0a, 0x23, 0x42, 0x59, 0x2d, 0xb0, + 0x06, 0x2c, 0xb0, 0x00, 0x43, 0xb0, 0x02, 0x25, 0x42, 0xb2, 0x00, 0x01, + 0x00, 0x43, 0x60, 0x42, 0xb1, 0x09, 0x02, 0x25, 0x42, 0xb1, 0x0a, 0x02, + 0x25, 0x42, 0xb0, 0x01, 0x16, 0x23, 0x20, 0xb0, 0x03, 0x25, 0x50, 0x58, + 0xb0, 0x00, 0x43, 0xb0, 0x04, 0x25, 0x42, 0x8a, 0x8a, 0x20, 0x8a, 0x23, + 0x61, 0xb0, 0x05, 0x2a, 0x21, 0x23, 0xb0, 0x01, 0x61, 0x20, 0x8a, 0x23, + 0x61, 0xb0, 0x05, 0x2a, 0x21, 0x1b, 0xb0, 0x00, 0x43, 0xb0, 0x02, 0x25, + 0x42, 0xb0, 0x02, 0x25, 0x61, 0xb0, 0x05, 0x2a, 0x21, 0x59, 0xb0, 0x09, + 0x43, 0x47, 0xb0, 0x0a, 0x43, 0x47, 0x60, 0xb0, 0x80, 0x62, 0x20, 0xb0, + 0x02, 0x45, 0x63, 0xb0, 0x01, 0x45, 0x62, 0x60, 0xb1, 0x00, 0x00, 0x13, + 0x23, 0x44, 0xb0, 0x01, 0x43, 0xb0, 0x00, 0x3e, 0xb2, 0x01, 0x01, 0x01, + 0x43, 0x60, 0x42, 0x2d, 0xb0, 0x07, 0x2c, 0x00, 0x20, 0x60, 0xb0, 0x01, + 0x61, 0xb3, 0x0b, 0x0b, 0x01, 0x00, 0x42, 0x8a, 0x60, 0xb1, 0x06, 0x02, + 0x2b, 0x2d, 0xb0, 0x08, 0x2c, 0x20, 0x60, 0xb0, 0x0b, 0x60, 0x20, 0x43, + 0x23, 0xb0, 0x01, 0x60, 0x43, 0xb0, 0x02, 0x25, 0xb0, 0x02, 0x25, 0x51, + 0x58, 0x23, 0x20, 0x3c, 0xb0, 0x01, 0x60, 0x23, 0xb0, 0x12, 0x65, 0x1c, + 0x1b, 0x21, 0x21, 0x59, 0x2d, 0xb0, 0x09, 0x2c, 0xb0, 0x08, 0x2b, 0xb0, + 0x08, 0x2a, 0x2d, 0xb0, 0x0a, 0x2c, 0x20, 0x20, 0x47, 0x20, 0x20, 0xb0, + 0x02, 0x45, 0x63, 0xb0, 0x01, 0x45, 0x62, 0x60, 0x23, 0x61, 0x38, 0x23, + 0x20, 0x8a, 0x55, 0x58, 0x20, 0x47, 0x20, 0x20, 0xb0, 0x02, 0x45, 0x63, + 0xb0, 0x01, 0x45, 0x62, 0x60, 0x23, 0x61, 0x38, 0x1b, 0x21, 0x59, 0x2d, + 0xb0, 0x0b, 0x2c, 0x00, 0xb0, 0x01, 0x16, 0xb0, 0x0a, 0x2a, 0xb0, 0x01, + 0x15, 0x30, 0x2d, 0xb0, 0x0c, 0x2c, 0x20, 0x35, 0xb0, 0x01, 0x60, 0x2d, + 0xb0, 0x0d, 0x2c, 0x00, 0xb0, 0x03, 0x45, 0x63, 0xb0, 0x01, 0x45, 0x62, + 0xb0, 0x00, 0x2b, 0xb0, 0x02, 0x45, 0x63, 0xb0, 0x01, 0x45, 0x62, 0xb0, + 0x00, 0x2b, 0xb0, 0x00, 0x16, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, + 0x3e, 0x23, 0x38, 0xb1, 0x0c, 0x01, 0x15, 0x2a, 0x2d, 0xb0, 0x0e, 0x2c, + 0x20, 0x3c, 0x20, 0x47, 0x20, 0xb0, 0x02, 0x45, 0x63, 0xb0, 0x01, 0x45, + 0x62, 0x60, 0xb0, 0x00, 0x43, 0x61, 0x38, 0x2d, 0xb0, 0x0f, 0x2c, 0x2e, + 0x17, 0x3c, 0x2d, 0xb0, 0x10, 0x2c, 0x20, 0x3c, 0x20, 0x47, 0x20, 0xb0, + 0x02, 0x45, 0x63, 0xb0, 0x01, 0x45, 0x62, 0x60, 0xb0, 0x00, 0x43, 0x61, + 0xb0, 0x01, 0x43, 0x63, 0x38, 0x2d, 0xb0, 0x11, 0x2c, 0xb1, 0x02, 0x00, + 0x16, 0x25, 0x20, 0x2e, 0x20, 0x47, 0xb0, 0x00, 0x23, 0x42, 0xb0, 0x02, + 0x25, 0x49, 0x8a, 0x8a, 0x47, 0x23, 0x47, 0x23, 0x61, 0x62, 0xb0, 0x01, + 0x23, 0x42, 0xb2, 0x10, 0x01, 0x01, 0x15, 0x14, 0x2a, 0x2d, 0xb0, 0x12, + 0x2c, 0xb0, 0x00, 0x16, 0xb0, 0x04, 0x25, 0xb0, 0x04, 0x25, 0x47, 0x23, + 0x47, 0x23, 0x61, 0xb0, 0x01, 0x2b, 0x65, 0x8a, 0x2e, 0x23, 0x20, 0x20, + 0x3c, 0x8a, 0x38, 0x2d, 0xb0, 0x13, 0x2c, 0xb0, 0x00, 0x16, 0xb0, 0x04, + 0x25, 0xb0, 0x04, 0x25, 0x20, 0x2e, 0x47, 0x23, 0x47, 0x23, 0x61, 0x20, + 0xb0, 0x05, 0x23, 0x42, 0xb0, 0x01, 0x2b, 0x20, 0xb0, 0x60, 0x50, 0x58, + 0x20, 0xb0, 0x40, 0x51, 0x58, 0xb3, 0x03, 0x20, 0x04, 0x20, 0x1b, 0xb3, + 0x03, 0x26, 0x04, 0x1a, 0x59, 0x42, 0x42, 0x23, 0x20, 0xb0, 0x08, 0x43, + 0x20, 0x8a, 0x23, 0x47, 0x23, 0x47, 0x23, 0x61, 0x23, 0x46, 0x60, 0xb0, + 0x05, 0x43, 0xb0, 0x80, 0x62, 0x60, 0x20, 0xb0, 0x00, 0x2b, 0x20, 0x8a, + 0x8a, 0x61, 0x20, 0xb0, 0x03, 0x43, 0x60, 0x64, 0x23, 0xb0, 0x04, 0x43, + 0x61, 0x64, 0x50, 0x58, 0xb0, 0x03, 0x43, 0x61, 0x1b, 0xb0, 0x04, 0x43, + 0x60, 0x59, 0xb0, 0x03, 0x25, 0xb0, 0x80, 0x62, 0x61, 0x23, 0x20, 0x20, + 0xb0, 0x04, 0x26, 0x23, 0x46, 0x61, 0x38, 0x1b, 0x23, 0xb0, 0x08, 0x43, + 0x46, 0xb0, 0x02, 0x25, 0xb0, 0x08, 0x43, 0x47, 0x23, 0x47, 0x23, 0x61, + 0x60, 0x20, 0xb0, 0x05, 0x43, 0xb0, 0x80, 0x62, 0x60, 0x23, 0x20, 0xb0, + 0x00, 0x2b, 0x23, 0xb0, 0x05, 0x43, 0x60, 0xb0, 0x00, 0x2b, 0xb0, 0x05, + 0x25, 0x61, 0xb0, 0x05, 0x25, 0xb0, 0x80, 0x62, 0xb0, 0x04, 0x26, 0x61, + 0x20, 0xb0, 0x04, 0x25, 0x60, 0x64, 0x23, 0xb0, 0x03, 0x25, 0x60, 0x64, + 0x50, 0x58, 0x21, 0x1b, 0x23, 0x21, 0x59, 0x23, 0x20, 0x20, 0xb0, 0x04, + 0x26, 0x23, 0x46, 0x61, 0x38, 0x59, 0x2d, 0xb0, 0x14, 0x2c, 0xb0, 0x00, + 0x16, 0x20, 0x20, 0x20, 0xb0, 0x05, 0x26, 0x20, 0x2e, 0x47, 0x23, 0x47, + 0x23, 0x61, 0x23, 0x3c, 0x38, 0x2d, 0xb0, 0x15, 0x2c, 0xb0, 0x00, 0x16, + 0x20, 0xb0, 0x08, 0x23, 0x42, 0x20, 0x20, 0x20, 0x46, 0x23, 0x47, 0xb0, + 0x00, 0x2b, 0x23, 0x61, 0x38, 0x2d, 0xb0, 0x16, 0x2c, 0xb0, 0x00, 0x16, + 0xb0, 0x03, 0x25, 0xb0, 0x02, 0x25, 0x47, 0x23, 0x47, 0x23, 0x61, 0xb0, + 0x00, 0x54, 0x58, 0x2e, 0x20, 0x3c, 0x23, 0x21, 0x1b, 0xb0, 0x02, 0x25, + 0xb0, 0x02, 0x25, 0x47, 0x23, 0x47, 0x23, 0x61, 0x20, 0xb0, 0x05, 0x25, + 0xb0, 0x04, 0x25, 0x47, 0x23, 0x47, 0x23, 0x61, 0xb0, 0x06, 0x25, 0xb0, + 0x05, 0x25, 0x49, 0xb0, 0x02, 0x25, 0x61, 0xb0, 0x01, 0x45, 0x63, 0x23, + 0x62, 0x63, 0xb0, 0x01, 0x45, 0x62, 0x60, 0x23, 0x2e, 0x23, 0x20, 0x20, + 0x3c, 0x8a, 0x38, 0x23, 0x21, 0x59, 0x2d, 0xb0, 0x17, 0x2c, 0xb0, 0x00, + 0x16, 0x20, 0xb0, 0x08, 0x43, 0x20, 0x2e, 0x47, 0x23, 0x47, 0x23, 0x61, + 0x20, 0x60, 0xb0, 0x20, 0x60, 0x66, 0xb0, 0x80, 0x62, 0x23, 0x20, 0x20, + 0x3c, 0x8a, 0x38, 0x2d, 0xb0, 0x18, 0x2c, 0x23, 0x20, 0x2e, 0x46, 0xb0, + 0x02, 0x25, 0x46, 0x52, 0x58, 0x20, 0x3c, 0x59, 0x2e, 0xb1, 0x09, 0x01, + 0x14, 0x2b, 0x2d, 0xb0, 0x19, 0x2c, 0x23, 0x20, 0x2e, 0x46, 0xb0, 0x02, + 0x25, 0x46, 0x50, 0x58, 0x20, 0x3c, 0x59, 0x2e, 0xb1, 0x09, 0x01, 0x14, + 0x2b, 0x2d, 0xb0, 0x1a, 0x2c, 0x23, 0x20, 0x2e, 0x46, 0xb0, 0x02, 0x25, + 0x46, 0x52, 0x58, 0x20, 0x3c, 0x59, 0x23, 0x20, 0x2e, 0x46, 0xb0, 0x02, + 0x25, 0x46, 0x50, 0x58, 0x20, 0x3c, 0x59, 0x2e, 0xb1, 0x09, 0x01, 0x14, + 0x2b, 0x2d, 0xb0, 0x1b, 0x2c, 0xb0, 0x00, 0x15, 0x20, 0x47, 0xb0, 0x00, + 0x23, 0x42, 0xb2, 0x00, 0x01, 0x01, 0x15, 0x14, 0x13, 0x2e, 0xb0, 0x0e, + 0x2a, 0x2d, 0xb0, 0x1c, 0x2c, 0xb0, 0x00, 0x15, 0x20, 0x47, 0xb0, 0x00, + 0x23, 0x42, 0xb2, 0x00, 0x01, 0x01, 0x15, 0x14, 0x13, 0x2e, 0xb0, 0x0e, + 0x2a, 0x2d, 0xb0, 0x1d, 0x2c, 0xb1, 0x00, 0x01, 0x14, 0x13, 0xb0, 0x0f, + 0x2a, 0x2d, 0xb0, 0x1e, 0x2c, 0xb0, 0x11, 0x2a, 0x2d, 0xb0, 0x23, 0x2c, + 0xb0, 0x12, 0x2b, 0x23, 0x20, 0x2e, 0x46, 0xb0, 0x02, 0x25, 0x46, 0x52, + 0x58, 0x20, 0x3c, 0x59, 0x2e, 0xb1, 0x09, 0x01, 0x14, 0x2b, 0x2d, 0xb0, + 0x26, 0x2c, 0xb0, 0x13, 0x2b, 0x8a, 0x20, 0x20, 0x3c, 0xb0, 0x05, 0x23, + 0x42, 0x8a, 0x38, 0x23, 0x20, 0x2e, 0x46, 0xb0, 0x02, 0x25, 0x46, 0x52, + 0x58, 0x20, 0x3c, 0x59, 0x2e, 0xb1, 0x09, 0x01, 0x14, 0x2b, 0xb0, 0x05, + 0x43, 0x2e, 0xb0, 0x09, 0x2b, 0x2d, 0xb0, 0x24, 0x2c, 0xb0, 0x00, 0x16, + 0xb0, 0x04, 0x25, 0xb0, 0x04, 0x26, 0x20, 0x2e, 0x47, 0x23, 0x47, 0x23, + 0x61, 0xb0, 0x01, 0x2b, 0x23, 0x20, 0x3c, 0x20, 0x2e, 0x23, 0x38, 0xb1, + 0x09, 0x01, 0x14, 0x2b, 0x2d, 0xb0, 0x21, 0x2c, 0xb1, 0x08, 0x04, 0x25, + 0x42, 0xb0, 0x00, 0x16, 0xb0, 0x04, 0x25, 0xb0, 0x04, 0x25, 0x20, 0x2e, + 0x47, 0x23, 0x47, 0x23, 0x61, 0x20, 0xb0, 0x05, 0x23, 0x42, 0xb0, 0x01, + 0x2b, 0x20, 0xb0, 0x60, 0x50, 0x58, 0x20, 0xb0, 0x40, 0x51, 0x58, 0xb3, + 0x03, 0x20, 0x04, 0x20, 0x1b, 0xb3, 0x03, 0x26, 0x04, 0x1a, 0x59, 0x42, + 0x42, 0x23, 0x20, 0x47, 0xb0, 0x05, 0x43, 0xb0, 0x80, 0x62, 0x60, 0x20, + 0xb0, 0x00, 0x2b, 0x20, 0x8a, 0x8a, 0x61, 0x20, 0xb0, 0x03, 0x43, 0x60, + 0x64, 0x23, 0xb0, 0x04, 0x43, 0x61, 0x64, 0x50, 0x58, 0xb0, 0x03, 0x43, + 0x61, 0x1b, 0xb0, 0x04, 0x43, 0x60, 0x59, 0xb0, 0x03, 0x25, 0xb0, 0x80, + 0x62, 0x61, 0xb0, 0x02, 0x25, 0x46, 0x61, 0x38, 0x23, 0x20, 0x3c, 0x23, + 0x38, 0x1b, 0x21, 0x20, 0x20, 0x46, 0x23, 0x47, 0xb0, 0x00, 0x2b, 0x23, + 0x61, 0x38, 0x21, 0x59, 0xb1, 0x09, 0x01, 0x14, 0x2b, 0x2d, 0xb0, 0x20, + 0x2c, 0xb0, 0x08, 0x23, 0x42, 0xb0, 0x1f, 0x2b, 0x2d, 0xb0, 0x22, 0x2c, + 0xb0, 0x12, 0x2b, 0x2e, 0xb1, 0x09, 0x01, 0x14, 0x2b, 0x2d, 0xb0, 0x25, + 0x2c, 0xb0, 0x13, 0x2b, 0x21, 0x23, 0x20, 0x20, 0x3c, 0xb0, 0x05, 0x23, + 0x42, 0x23, 0x38, 0xb1, 0x09, 0x01, 0x14, 0x2b, 0xb0, 0x05, 0x43, 0x2e, + 0xb0, 0x09, 0x2b, 0x2d, 0xb0, 0x1f, 0x2c, 0xb0, 0x00, 0x16, 0x45, 0x23, + 0x20, 0x2e, 0x20, 0x46, 0x8a, 0x23, 0x61, 0x38, 0xb1, 0x09, 0x01, 0x14, + 0x2b, 0x2d, 0xb0, 0x27, 0x2c, 0xb0, 0x14, 0x2b, 0x2e, 0xb1, 0x09, 0x01, + 0x14, 0x2b, 0x2d, 0xb0, 0x28, 0x2c, 0xb0, 0x14, 0x2b, 0xb0, 0x18, 0x2b, + 0x2d, 0xb0, 0x29, 0x2c, 0xb0, 0x14, 0x2b, 0xb0, 0x19, 0x2b, 0x2d, 0xb0, + 0x2a, 0x2c, 0xb0, 0x00, 0x16, 0xb0, 0x14, 0x2b, 0xb0, 0x1a, 0x2b, 0x2d, + 0xb0, 0x2b, 0x2c, 0xb0, 0x15, 0x2b, 0x2e, 0xb1, 0x09, 0x01, 0x14, 0x2b, + 0x2d, 0xb0, 0x2c, 0x2c, 0xb0, 0x15, 0x2b, 0xb0, 0x18, 0x2b, 0x2d, 0xb0, + 0x2d, 0x2c, 0xb0, 0x15, 0x2b, 0xb0, 0x19, 0x2b, 0x2d, 0xb0, 0x2e, 0x2c, + 0xb0, 0x15, 0x2b, 0xb0, 0x1a, 0x2b, 0x2d, 0xb0, 0x2f, 0x2c, 0xb0, 0x16, + 0x2b, 0x2e, 0xb1, 0x09, 0x01, 0x14, 0x2b, 0x2d, 0xb0, 0x30, 0x2c, 0xb0, + 0x16, 0x2b, 0xb0, 0x18, 0x2b, 0x2d, 0xb0, 0x31, 0x2c, 0xb0, 0x16, 0x2b, + 0xb0, 0x19, 0x2b, 0x2d, 0xb0, 0x32, 0x2c, 0xb0, 0x16, 0x2b, 0xb0, 0x1a, + 0x2b, 0x2d, 0xb0, 0x33, 0x2c, 0xb0, 0x17, 0x2b, 0x2e, 0xb1, 0x09, 0x01, + 0x14, 0x2b, 0x2d, 0xb0, 0x34, 0x2c, 0xb0, 0x17, 0x2b, 0xb0, 0x18, 0x2b, + 0x2d, 0xb0, 0x35, 0x2c, 0xb0, 0x17, 0x2b, 0xb0, 0x19, 0x2b, 0x2d, 0xb0, + 0x36, 0x2c, 0xb0, 0x17, 0x2b, 0xb0, 0x1a, 0x2b, 0x2d, 0xb0, 0x37, 0x2c, + 0x2b, 0x2d, 0xb0, 0x38, 0x2c, 0xb0, 0x37, 0x2a, 0xb0, 0x01, 0x15, 0x30, + 0x2d, 0x00, 0x00, 0x00, 0xb9, 0x08, 0x00, 0x08, 0x00, 0x63, 0x20, 0xb0, + 0x01, 0x23, 0x44, 0x20, 0xb0, 0x03, 0x23, 0x70, 0xb0, 0x14, 0x45, 0x20, + 0x20, 0xb0, 0x28, 0x60, 0x66, 0x20, 0x8a, 0x55, 0x58, 0xb0, 0x02, 0x25, + 0x61, 0xb0, 0x01, 0x45, 0x63, 0x23, 0x62, 0xb0, 0x02, 0x23, 0x44, 0xb3, + 0x09, 0x0a, 0x03, 0x02, 0x2b, 0xb3, 0x0b, 0x10, 0x03, 0x02, 0x2b, 0xb3, + 0x11, 0x16, 0x03, 0x02, 0x2b, 0x59, 0xb2, 0x04, 0x28, 0x06, 0x45, 0x52, + 0x44, 0xb3, 0x0b, 0x10, 0x04, 0x02, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x8b, 0x00, 0xb8, + 0x00, 0xb8, 0x00, 0x8b, 0x00, 0x8c, 0x05, 0x99, 0x00, 0x00, 0x05, 0xba, + 0x03, 0xf5, 0x00, 0x00, 0xfe, 0xa9, 0x05, 0xa9, 0xff, 0xf0, 0x05, 0xba, + 0x04, 0x05, 0xff, 0xf2, 0xfe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0xba, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x01, 0x14, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x08, + 0x01, 0x14, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x0e, + 0x01, 0x1c, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x54, + 0x01, 0x2a, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x18, + 0x01, 0x7e, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x50, + 0x01, 0x96, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x18, + 0x01, 0xe6, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x07, 0x00, 0x60, + 0x01, 0xfe, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x08, 0x00, 0x30, + 0x02, 0x5e, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x09, 0x00, 0x1e, + 0x02, 0x8e, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0a, 0x05, 0xb8, + 0x02, 0xac, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x30, + 0x08, 0x64, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0c, 0x00, 0x64, + 0x08, 0x94, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0d, 0x01, 0x84, + 0x08, 0xf8, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0e, 0x00, 0x34, + 0x0a, 0x7c, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, + 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, + 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, + 0x00, 0x30, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, + 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, + 0x00, 0x50, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, + 0x00, 0x20, 0x00, 0x4c, 0x00, 0x75, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x73, + 0x00, 0x7a, 0x00, 0x20, 0x00, 0x44, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x65, + 0x00, 0x64, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x63, 0x00, 0x20, 0x00, 0x77, + 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, + 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, + 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, + 0x00, 0x4e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, + 0x00, 0x4c, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x22, 0x00, 0x2e, + 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, + 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6e, + 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, + 0x00, 0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x20, + 0x00, 0x4f, 0x00, 0x70, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x46, + 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, + 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2c, + 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, + 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x31, + 0x00, 0x2e, 0x00, 0x4c, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x52, + 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, + 0x00, 0x74, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x61, + 0x00, 0x6e, 0x00, 0x64, 0x00, 0x4c, 0x00, 0x75, 0x00, 0x6b, 0x00, 0x61, + 0x00, 0x73, 0x00, 0x7a, 0x00, 0x44, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x65, + 0x00, 0x64, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x63, 0x00, 0x3a, 0x00, 0x20, + 0x00, 0x4c, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x52, + 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, + 0x00, 0x3a, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, + 0x00, 0x4c, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x52, + 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, + 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, + 0x00, 0x6e, 0x00, 0x20, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x30, + 0x00, 0x34, 0x00, 0x3b, 0x00, 0x20, 0x00, 0x57, 0x00, 0x65, 0x00, 0x73, + 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x2b, 0x00, 0x50, + 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x20, + 0x00, 0x6f, 0x00, 0x70, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x6f, + 0x00, 0x75, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x4c, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x6f, 0x00, 0x2d, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, + 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4c, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, + 0x00, 0x61, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, + 0x00, 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, + 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x50, + 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, + 0x00, 0x4c, 0x00, 0x75, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x73, 0x00, 0x7a, + 0x00, 0x20, 0x00, 0x44, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, + 0x00, 0x7a, 0x00, 0x69, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x74, 0x00, 0x79, + 0x00, 0x50, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, + 0x00, 0x20, 0x00, 0x4c, 0x00, 0x75, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x73, + 0x00, 0x7a, 0x00, 0x20, 0x00, 0x44, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x65, + 0x00, 0x64, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x63, 0x00, 0x4c, 0x00, 0x75, + 0x00, 0x6b, 0x00, 0x61, 0x00, 0x73, 0x00, 0x7a, 0x00, 0x20, 0x00, 0x44, + 0x00, 0x7a, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x69, + 0x00, 0x63, 0x00, 0x4c, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, + 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x73, + 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, + 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, + 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, + 0x00, 0x61, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x20, + 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6e, + 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, + 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x75, + 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x32, + 0x00, 0x30, 0x00, 0x31, 0x00, 0x30, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, + 0x00, 0x20, 0x00, 0x57, 0x00, 0x61, 0x00, 0x72, 0x00, 0x73, 0x00, 0x61, + 0x00, 0x77, 0x00, 0x2d, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, + 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, + 0x00, 0x67, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x4c, + 0x00, 0x75, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x73, 0x00, 0x7a, 0x00, 0x20, + 0x00, 0x44, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7a, + 0x00, 0x69, 0x00, 0x63, 0x00, 0x20, 0x00, 0x28, 0x00, 0x22, 0x00, 0x4c, + 0x00, 0x61, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x22, 0x00, 0x20, 0x00, 0x6d, + 0x00, 0x65, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x22, + 0x00, 0x53, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x72, + 0x00, 0x22, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x50, + 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x29, + 0x00, 0x2e, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, 0x20, 0x00, 0x74, + 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, + 0x00, 0x6f, 0x00, 0x20, 0x00, 0x63, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, + 0x00, 0x66, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x20, + 0x00, 0x62, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x63, + 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, + 0x00, 0x20, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, + 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x79, + 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6c, + 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x72, + 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x3a, + 0x00, 0x20, 0x00, 0x69, 0x00, 0x74, 0x00, 0x20, 0x00, 0x73, 0x00, 0x68, + 0x00, 0x6f, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x73, + 0x00, 0x65, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x71, 0x00, 0x75, + 0x00, 0x69, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, 0x00, 0x74, + 0x00, 0x72, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, + 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x22, 0x00, 0x20, + 0x00, 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x75, + 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, + 0x00, 0x20, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x79, 0x00, 0x20, + 0x00, 0x74, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x20, 0x00, 0x62, + 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x75, + 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, + 0x00, 0x70, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x73, + 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, + 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6c, + 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x69, 0x00, 0x74, + 0x00, 0x73, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6e, + 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, + 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, + 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x69, + 0x00, 0x7a, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x54, + 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x61, + 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6c, + 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x6f, + 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, + 0x00, 0x2c, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, + 0x00, 0x69, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, + 0x00, 0x6c, 0x00, 0x79, 0x00, 0x20, 0x00, 0x76, 0x00, 0x69, 0x00, 0x73, + 0x00, 0x69, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, + 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, + 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, + 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x67, + 0x00, 0x69, 0x00, 0x76, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, + 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x74, 0x00, 0x74, + 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, + 0x00, 0x73, 0x00, 0x20, 0x00, 0x66, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x69, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x61, 0x00, 0x72, 0x00, 0x20, 0x00, 0x68, + 0x00, 0x61, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x79, + 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x65, + 0x00, 0x6c, 0x00, 0x65, 0x00, 0x67, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x63, + 0x00, 0x65, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x74, 0x00, 0x20, + 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, + 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6d, + 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, + 0x00, 0x20, 0x00, 0x73, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6b, + 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, + 0x00, 0x72, 0x00, 0x69, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x6f, + 0x00, 0x6f, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x6b, + 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, + 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x74, + 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, + 0x00, 0x74, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x74, + 0x00, 0x20, 0x00, 0x4c, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, + 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, + 0x00, 0x73, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x64, + 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, + 0x00, 0x31, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x65, 0x00, 0x76, + 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, + 0x00, 0x75, 0x00, 0x67, 0x00, 0x68, 0x00, 0x20, 0x00, 0x69, 0x00, 0x74, + 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, + 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, + 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x20, 0x00, 0x61, + 0x00, 0x6e, 0x00, 0x79, 0x00, 0x20, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, + 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x74, + 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x20, + 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, + 0x00, 0x6d, 0x00, 0x69, 0x00, 0x2d, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x75, + 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, + 0x00, 0x65, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x73, + 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, + 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x74, 0x00, 0x74, + 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x67, 0x00, 0x69, + 0x00, 0x76, 0x00, 0x65, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x61, 0x00, 0x74, + 0x00, 0x6f, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x66, 0x00, 0x65, + 0x00, 0x65, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, + 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, + 0x00, 0x6d, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x77, + 0x00, 0x68, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, + 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, + 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x73, 0x00, 0x74, + 0x00, 0x72, 0x00, 0x75, 0x00, 0x63, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, + 0x00, 0x65, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x76, + 0x00, 0x69, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x73, + 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x69, + 0x00, 0x74, 0x00, 0x79, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, + 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, + 0x00, 0x75, 0x00, 0x73, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x73, 0x00, 0x73, + 0x00, 0x2e, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, + 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, + 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x61, + 0x00, 0x6e, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, + 0x00, 0x2f, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, + 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, + 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x61, + 0x00, 0x6e, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, + 0x00, 0x2f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, 0x00, 0x67, + 0x00, 0x6e, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x2f, 0x00, 0x4c, + 0x00, 0x75, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x73, 0x00, 0x7a, 0x00, 0x5f, + 0x00, 0x44, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7a, + 0x00, 0x69, 0x00, 0x63, 0x00, 0x2f, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, + 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, + 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, + 0x00, 0x30, 0x00, 0x31, 0x00, 0x30, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x30, + 0x00, 0x31, 0x00, 0x31, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, + 0x00, 0x74, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x61, + 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x75, 0x00, 0x6b, + 0x00, 0x61, 0x00, 0x73, 0x00, 0x7a, 0x00, 0x20, 0x00, 0x44, 0x00, 0x7a, + 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x63, + 0x00, 0x20, 0x00, 0x28, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, + 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, + 0x00, 0x2e, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x6c, + 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x6f, + 0x00, 0x6d, 0x00, 0x2f, 0x00, 0x29, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, + 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, + 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, + 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x4e, + 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, 0x00, 0x4c, + 0x00, 0x61, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x20, + 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, + 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, + 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, + 0x00, 0x20, 0x00, 0x53, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x20, 0x00, 0x4f, + 0x00, 0x70, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, + 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, + 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, + 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, + 0x00, 0x6e, 0x00, 0x20, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x20, + 0x00, 0x28, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, + 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x73, 0x00, 0x63, 0x00, 0x72, 0x00, 0x69, + 0x00, 0x70, 0x00, 0x74, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x73, 0x00, 0x69, + 0x00, 0x6c, 0x00, 0x2e, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2f, + 0x00, 0x4f, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x29, 0x00, 0x2e, 0x00, 0x68, + 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, + 0x00, 0x73, 0x00, 0x63, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x74, + 0x00, 0x73, 0x00, 0x2e, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x2e, + 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2f, 0x00, 0x4f, 0x00, 0x46, + 0x00, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x74, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x13, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, + 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, + 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, + 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, + 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, + 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, + 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, + 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, + 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, + 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, + 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, + 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, + 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, + 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, + 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x01, 0x03, 0x00, 0xa3, 0x00, 0x84, + 0x00, 0x85, 0x00, 0xbd, 0x00, 0x96, 0x00, 0xe8, 0x00, 0x86, 0x00, 0x8e, + 0x00, 0x8b, 0x00, 0x9d, 0x00, 0xa9, 0x00, 0xa4, 0x01, 0x04, 0x00, 0x8a, + 0x00, 0xda, 0x00, 0x83, 0x00, 0x93, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x8d, + 0x00, 0x97, 0x00, 0x88, 0x00, 0xc3, 0x00, 0xde, 0x00, 0xf1, 0x00, 0x9e, + 0x00, 0xaa, 0x00, 0xf5, 0x00, 0xf4, 0x00, 0xf6, 0x00, 0xa2, 0x00, 0xad, + 0x00, 0xc9, 0x00, 0xc7, 0x00, 0xae, 0x00, 0x62, 0x00, 0x63, 0x00, 0x90, + 0x00, 0x64, 0x00, 0xcb, 0x00, 0x65, 0x00, 0xc8, 0x00, 0xca, 0x00, 0xcf, + 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xe9, 0x00, 0x66, 0x00, 0xd3, + 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xaf, 0x00, 0x67, 0x00, 0xf0, 0x00, 0x91, + 0x00, 0xd6, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x68, 0x00, 0xeb, 0x00, 0xed, + 0x00, 0x89, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x6c, + 0x00, 0x6e, 0x00, 0xa0, 0x00, 0x6f, 0x00, 0x71, 0x00, 0x70, 0x00, 0x72, + 0x00, 0x73, 0x00, 0x75, 0x00, 0x74, 0x00, 0x76, 0x00, 0x77, 0x00, 0xea, + 0x00, 0x78, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x7b, 0x00, 0x7d, 0x00, 0x7c, + 0x00, 0xb8, 0x00, 0xa1, 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x80, 0x00, 0x81, + 0x00, 0xec, 0x00, 0xee, 0x00, 0xba, 0x01, 0x05, 0x01, 0x06, 0x00, 0xfd, + 0x00, 0xfe, 0x01, 0x07, 0x01, 0x08, 0x00, 0xd7, 0x00, 0xe2, 0x00, 0xe3, + 0x01, 0x09, 0x01, 0x0a, 0x00, 0xb0, 0x00, 0xb1, 0x01, 0x0b, 0x01, 0x0c, + 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xbb, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, + 0x01, 0x10, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xa6, 0x00, 0xd8, 0x00, 0xe1, + 0x01, 0x11, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xe0, 0x00, 0xd9, + 0x00, 0xdf, 0x00, 0x9b, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb6, 0x00, 0xb7, + 0x00, 0xc4, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xc5, 0x00, 0x82, 0x00, 0xc2, + 0x00, 0x87, 0x00, 0xab, 0x00, 0xc6, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xbc, + 0x01, 0x12, 0x00, 0x8c, 0x00, 0x9f, 0x00, 0x98, 0x00, 0xa8, 0x00, 0x9a, + 0x00, 0x99, 0x00, 0xef, 0x00, 0xa5, 0x00, 0x92, 0x00, 0x9c, 0x00, 0xa7, + 0x00, 0x8f, 0x00, 0x94, 0x00, 0x95, 0x00, 0xb9, 0x01, 0x13, 0x00, 0xc0, + 0x00, 0xc1, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, + 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, + 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x30, 0x41, + 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x30, 0x41, 0x44, 0x07, 0x41, 0x6f, + 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x61, 0x6f, 0x67, 0x6f, 0x6e, 0x65, + 0x6b, 0x07, 0x45, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x65, 0x6f, + 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x06, 0x4e, 0x61, 0x63, 0x75, 0x74, 0x65, + 0x06, 0x6e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x53, 0x61, 0x63, 0x75, + 0x74, 0x65, 0x06, 0x73, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x5a, 0x61, + 0x63, 0x75, 0x74, 0x65, 0x06, 0x7a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, + 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x7a, + 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x32, 0x43, 0x39, 0x04, 0x45, 0x75, 0x72, 0x6f, 0x07, 0x75, + 0x6e, 0x69, 0x32, 0x36, 0x36, 0x39, 0x0a, 0x67, 0x72, 0x61, 0x76, 0x65, + 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0d, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, + 0x69, 0x73, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0b, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x6e, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0a, 0x61, 0x63, 0x75, 0x74, + 0x65, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75, + 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0a, 0x63, + 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0a, 0x62, 0x72, + 0x65, 0x76, 0x65, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0e, 0x64, 0x6f, 0x74, + 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x09, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0a, 0x74, 0x69, + 0x6c, 0x64, 0x65, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x11, 0x68, 0x75, 0x6e, + 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x2e, 0x63, 0x61, + 0x73, 0x65, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x12, 0x00, 0x07, + 0xff, 0xff, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x30, + 0x00, 0x44, 0x00, 0x02, 0x44, 0x46, 0x4c, 0x54, 0x00, 0x0e, 0x6c, 0x61, + 0x74, 0x6e, 0x00, 0x1a, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x0e, + 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x01, 0x00, 0xf6, 0x00, 0x04, 0x00, 0x00, 0x00, 0x76, 0x12, 0x24, + 0x12, 0x24, 0x0b, 0x68, 0x12, 0x24, 0x10, 0xd0, 0x11, 0x86, 0x10, 0xd0, + 0x06, 0x58, 0x0c, 0x7e, 0x13, 0x52, 0x0d, 0x24, 0x0c, 0x7e, 0x01, 0xe6, + 0x0c, 0x3c, 0x09, 0x2c, 0x02, 0xb8, 0x0c, 0x7e, 0x03, 0xde, 0x0c, 0x7e, + 0x04, 0x98, 0x04, 0xea, 0x0c, 0x3c, 0x06, 0x58, 0x08, 0x06, 0x09, 0x2c, + 0x0e, 0x68, 0x10, 0x0e, 0x0b, 0x68, 0x13, 0x52, 0x0d, 0xd0, 0x0e, 0x16, + 0x0e, 0x16, 0x09, 0xf2, 0x0d, 0xd0, 0x0a, 0x84, 0x0d, 0xd0, 0x0d, 0xd0, + 0x0e, 0x16, 0x0e, 0x16, 0x0a, 0x3c, 0x0a, 0xd6, 0x0a, 0x72, 0x0a, 0x84, + 0x0a, 0xd6, 0x0b, 0x68, 0x12, 0x24, 0x11, 0x86, 0x11, 0x86, 0x0c, 0x7e, + 0x12, 0x24, 0x0b, 0xf2, 0x0b, 0xf2, 0x11, 0x86, 0x0b, 0xf2, 0x12, 0x24, + 0x11, 0x86, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, + 0x13, 0x52, 0x0d, 0x24, 0x0c, 0x7e, 0x0c, 0x7e, 0x0c, 0x7e, 0x0c, 0x7e, + 0x0c, 0x7e, 0x0c, 0x7e, 0x0c, 0x3c, 0x0c, 0x3c, 0x0c, 0x3c, 0x0c, 0x3c, + 0x0e, 0x68, 0x0c, 0x7e, 0x0d, 0xd0, 0x0d, 0xd0, 0x0d, 0xd0, 0x0d, 0xd0, + 0x0d, 0xd0, 0x0d, 0xd0, 0x0e, 0x16, 0x0e, 0x16, 0x0e, 0x16, 0x0e, 0x16, + 0x0e, 0x16, 0x0d, 0xd0, 0x0e, 0x16, 0x0e, 0x16, 0x0e, 0x16, 0x0e, 0x16, + 0x0e, 0x16, 0x0e, 0x16, 0x0e, 0x16, 0x13, 0x52, 0x0d, 0xd0, 0x0d, 0x24, + 0x0e, 0x16, 0x0d, 0x4e, 0x0d, 0xd0, 0x0e, 0x16, 0x0e, 0x68, 0x10, 0x0e, + 0x10, 0x0e, 0x10, 0x0e, 0x11, 0x86, 0x11, 0x86, 0x12, 0x24, 0x12, 0x24, + 0x10, 0xd0, 0x12, 0x24, 0x12, 0x24, 0x10, 0xd0, 0x11, 0x86, 0x11, 0x86, + 0x11, 0x86, 0x12, 0x24, 0x13, 0x52, 0x00, 0x01, 0x00, 0x76, 0x00, 0x05, + 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, + 0x00, 0x12, 0x00, 0x23, 0x00, 0x24, 0x00, 0x26, 0x00, 0x27, 0x00, 0x29, + 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, + 0x00, 0x35, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, + 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x44, 0x00, 0x45, + 0x00, 0x48, 0x00, 0x49, 0x00, 0x4b, 0x00, 0x4e, 0x00, 0x50, 0x00, 0x51, + 0x00, 0x52, 0x00, 0x53, 0x00, 0x55, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, + 0x00, 0x5c, 0x00, 0x5e, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x70, + 0x00, 0x72, 0x00, 0x74, 0x00, 0x75, 0x00, 0x79, 0x00, 0x7b, 0x00, 0x7c, + 0x00, 0x7d, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, + 0x00, 0x87, 0x00, 0x89, 0x00, 0x92, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, + 0x00, 0x97, 0x00, 0x98, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, + 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, + 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, + 0x00, 0xad, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, + 0x00, 0xb8, 0x00, 0xba, 0x00, 0xc0, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, + 0x00, 0xc7, 0x00, 0xc9, 0x00, 0xcc, 0x00, 0xce, 0x00, 0xd3, 0x00, 0xd4, + 0x00, 0xd6, 0x00, 0xd8, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, + 0x00, 0xe9, 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xef, 0x00, 0xf2, + 0x00, 0xf3, 0x00, 0xf6, 0x00, 0xf9, 0x00, 0x34, 0x00, 0x09, 0xff, 0x7c, + 0x00, 0x0f, 0xff, 0x4c, 0x00, 0x11, 0xff, 0x4c, 0x00, 0x12, 0xff, 0x7c, + 0x00, 0x1d, 0xff, 0xc4, 0x00, 0x1e, 0xff, 0xc4, 0x00, 0x22, 0x00, 0x1e, + 0x00, 0x24, 0xff, 0x7c, 0x00, 0x2d, 0xff, 0x3a, 0x00, 0x46, 0xff, 0xba, + 0x00, 0x47, 0xff, 0xba, 0x00, 0x48, 0xff, 0xba, 0x00, 0x50, 0xff, 0xc4, + 0x00, 0x51, 0xff, 0xc4, 0x00, 0x52, 0xff, 0xba, 0x00, 0x53, 0xff, 0xc4, + 0x00, 0x54, 0xff, 0xba, 0x00, 0x55, 0xff, 0xc4, 0x00, 0x58, 0xff, 0xc4, + 0x00, 0x77, 0xff, 0xc4, 0x00, 0x82, 0xff, 0x7c, 0x00, 0x83, 0xff, 0x7c, + 0x00, 0x84, 0xff, 0x7c, 0x00, 0x85, 0xff, 0x7c, 0x00, 0x86, 0xff, 0x7c, + 0x00, 0x87, 0xff, 0x7c, 0x00, 0x88, 0xff, 0x7c, 0x00, 0xa9, 0xff, 0xba, + 0x00, 0xaa, 0xff, 0xba, 0x00, 0xab, 0xff, 0xba, 0x00, 0xac, 0xff, 0xba, + 0x00, 0xad, 0xff, 0xba, 0x00, 0xb2, 0xff, 0xba, 0x00, 0xb3, 0xff, 0xc4, + 0x00, 0xb4, 0xff, 0xba, 0x00, 0xb5, 0xff, 0xba, 0x00, 0xb6, 0xff, 0xba, + 0x00, 0xb7, 0xff, 0xba, 0x00, 0xb8, 0xff, 0xba, 0x00, 0xba, 0xff, 0xba, + 0x00, 0xbb, 0xff, 0xc4, 0x00, 0xbc, 0xff, 0xc4, 0x00, 0xbd, 0xff, 0xc4, + 0x00, 0xbe, 0xff, 0xc4, 0x00, 0xc2, 0xff, 0x7c, 0x00, 0xc5, 0xff, 0xba, + 0x00, 0xc7, 0xff, 0xba, 0x00, 0xcc, 0xff, 0xc4, 0x00, 0xce, 0xff, 0xba, + 0x00, 0xe9, 0xff, 0x4c, 0x00, 0xec, 0xff, 0x4c, 0x00, 0xf9, 0xff, 0x7c, + 0x00, 0x49, 0x00, 0x05, 0xfe, 0xde, 0x00, 0x0a, 0xfe, 0xde, 0x00, 0x0d, + 0xfe, 0xde, 0x00, 0x0f, 0x00, 0x36, 0x00, 0x10, 0xff, 0x3a, 0x00, 0x11, + 0x00, 0x36, 0x00, 0x22, 0xff, 0xce, 0x00, 0x23, 0xff, 0xb0, 0x00, 0x26, + 0xff, 0xb0, 0x00, 0x2a, 0xff, 0xb0, 0x00, 0x32, 0xff, 0xb0, 0x00, 0x34, + 0xff, 0xb0, 0x00, 0x37, 0xff, 0x54, 0x00, 0x39, 0xff, 0x4a, 0x00, 0x3a, + 0xff, 0x68, 0x00, 0x3c, 0xff, 0x2c, 0x00, 0x3f, 0xff, 0x4a, 0x00, 0x46, + 0xff, 0xdc, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x52, + 0xff, 0xdc, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x59, 0xff, 0x94, 0x00, 0x5a, + 0xff, 0xb0, 0x00, 0x5c, 0xff, 0x94, 0x00, 0x6c, 0xfe, 0xde, 0x00, 0x6d, + 0xff, 0x3a, 0x00, 0x6f, 0xff, 0x3a, 0x00, 0x72, 0xfe, 0xde, 0x00, 0x74, + 0xff, 0x36, 0x00, 0x75, 0xff, 0x36, 0x00, 0x79, 0xff, 0x3a, 0x00, 0x7b, + 0xff, 0x36, 0x00, 0x7c, 0xfe, 0xde, 0x00, 0x7d, 0xff, 0x3a, 0x00, 0x89, + 0xff, 0xb0, 0x00, 0x94, 0xff, 0xb0, 0x00, 0x95, 0xff, 0xb0, 0x00, 0x96, + 0xff, 0xb0, 0x00, 0x97, 0xff, 0xb0, 0x00, 0x98, 0xff, 0xb0, 0x00, 0x9a, + 0xff, 0xb0, 0x00, 0x9f, 0xff, 0x2c, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0xaa, + 0xff, 0xdc, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xad, + 0xff, 0xdc, 0x00, 0xb2, 0xff, 0xdc, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xb5, + 0xff, 0xdc, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xb8, + 0xff, 0xdc, 0x00, 0xba, 0xff, 0xdc, 0x00, 0xc4, 0xff, 0xb0, 0x00, 0xc5, + 0xff, 0xdc, 0x00, 0xc7, 0xff, 0xdc, 0x00, 0xcd, 0xff, 0xb0, 0x00, 0xce, + 0xff, 0xdc, 0x00, 0xd3, 0xff, 0x2c, 0x00, 0xe5, 0xff, 0x3a, 0x00, 0xe6, + 0xff, 0x3a, 0x00, 0xe7, 0xfe, 0xde, 0x00, 0xe8, 0xfe, 0xde, 0x00, 0xe9, + 0x00, 0x36, 0x00, 0xea, 0xfe, 0xde, 0x00, 0xeb, 0xfe, 0xde, 0x00, 0xec, + 0x00, 0x36, 0x00, 0xef, 0xff, 0x3a, 0x00, 0xf2, 0xff, 0x3a, 0x00, 0xf3, + 0xff, 0x3a, 0x00, 0xf6, 0xfe, 0xde, 0x00, 0x2e, 0x00, 0x09, 0xff, 0x76, + 0x00, 0x0f, 0xff, 0x08, 0x00, 0x11, 0xff, 0x08, 0x00, 0x12, 0xff, 0x76, + 0x00, 0x24, 0xff, 0x76, 0x00, 0x2d, 0xff, 0x4a, 0x00, 0x44, 0xff, 0xce, + 0x00, 0x46, 0xff, 0xe2, 0x00, 0x47, 0xff, 0xe2, 0x00, 0x48, 0xff, 0xe2, + 0x00, 0x52, 0xff, 0xe2, 0x00, 0x54, 0xff, 0xe2, 0x00, 0x82, 0xff, 0x76, + 0x00, 0x83, 0xff, 0x76, 0x00, 0x84, 0xff, 0x76, 0x00, 0x85, 0xff, 0x76, + 0x00, 0x86, 0xff, 0x76, 0x00, 0x87, 0xff, 0x76, 0x00, 0x88, 0xff, 0x76, + 0x00, 0xa2, 0xff, 0xce, 0x00, 0xa3, 0xff, 0xce, 0x00, 0xa4, 0xff, 0xce, + 0x00, 0xa5, 0xff, 0xce, 0x00, 0xa6, 0xff, 0xce, 0x00, 0xa7, 0xff, 0xce, + 0x00, 0xa8, 0xff, 0xce, 0x00, 0xa9, 0xff, 0xe2, 0x00, 0xaa, 0xff, 0xe2, + 0x00, 0xab, 0xff, 0xe2, 0x00, 0xac, 0xff, 0xe2, 0x00, 0xad, 0xff, 0xe2, + 0x00, 0xb2, 0xff, 0xe2, 0x00, 0xb4, 0xff, 0xe2, 0x00, 0xb5, 0xff, 0xe2, + 0x00, 0xb6, 0xff, 0xe2, 0x00, 0xb7, 0xff, 0xe2, 0x00, 0xb8, 0xff, 0xe2, + 0x00, 0xba, 0xff, 0xe2, 0x00, 0xc2, 0xff, 0x76, 0x00, 0xc3, 0xff, 0xce, + 0x00, 0xc5, 0xff, 0xe2, 0x00, 0xc7, 0xff, 0xe2, 0x00, 0xce, 0xff, 0xe2, + 0x00, 0xe9, 0xff, 0x08, 0x00, 0xec, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x76, + 0x00, 0x14, 0x00, 0x23, 0xff, 0xd2, 0x00, 0x26, 0xff, 0xd2, 0x00, 0x2a, + 0xff, 0xd2, 0x00, 0x32, 0xff, 0xd2, 0x00, 0x34, 0xff, 0xd2, 0x00, 0x37, + 0xff, 0xcc, 0x00, 0x38, 0xff, 0xd6, 0x00, 0x89, 0xff, 0xd2, 0x00, 0x94, + 0xff, 0xd2, 0x00, 0x95, 0xff, 0xd2, 0x00, 0x96, 0xff, 0xd2, 0x00, 0x97, + 0xff, 0xd2, 0x00, 0x98, 0xff, 0xd2, 0x00, 0x9a, 0xff, 0xd2, 0x00, 0x9b, + 0xff, 0xd6, 0x00, 0x9c, 0xff, 0xd6, 0x00, 0x9d, 0xff, 0xd6, 0x00, 0x9e, + 0xff, 0xd6, 0x00, 0xc4, 0xff, 0xd2, 0x00, 0xcd, 0xff, 0xd2, 0x00, 0x5b, + 0x00, 0x09, 0xff, 0x7c, 0x00, 0x0f, 0xff, 0x4c, 0x00, 0x10, 0xff, 0x4c, + 0x00, 0x11, 0xff, 0x4c, 0x00, 0x12, 0xff, 0x7c, 0x00, 0x1d, 0xff, 0x60, + 0x00, 0x1e, 0xff, 0x60, 0x00, 0x23, 0xff, 0x9e, 0x00, 0x24, 0xff, 0x7c, + 0x00, 0x26, 0xff, 0x9e, 0x00, 0x2a, 0xff, 0x9e, 0x00, 0x2d, 0xff, 0x38, + 0x00, 0x32, 0xff, 0x9e, 0x00, 0x34, 0xff, 0x9e, 0x00, 0x44, 0xff, 0x06, + 0x00, 0x46, 0xff, 0x2e, 0x00, 0x47, 0xff, 0x2e, 0x00, 0x48, 0xff, 0x2e, + 0x00, 0x4a, 0xff, 0x44, 0x00, 0x50, 0xff, 0x60, 0x00, 0x51, 0xff, 0x60, + 0x00, 0x52, 0xff, 0x2e, 0x00, 0x53, 0xff, 0x60, 0x00, 0x54, 0xff, 0x2e, + 0x00, 0x55, 0xff, 0x60, 0x00, 0x56, 0xff, 0x5e, 0x00, 0x58, 0xff, 0x60, + 0x00, 0x59, 0xff, 0x4c, 0x00, 0x5a, 0xff, 0x74, 0x00, 0x5b, 0xff, 0x70, + 0x00, 0x5c, 0xff, 0x4c, 0x00, 0x5d, 0xff, 0x88, 0x00, 0x6d, 0xff, 0x4c, + 0x00, 0x6f, 0xff, 0x4c, 0x00, 0x77, 0xff, 0x60, 0x00, 0x79, 0xff, 0x4c, + 0x00, 0x7d, 0xff, 0x4c, 0x00, 0x82, 0xff, 0x7c, 0x00, 0x83, 0xff, 0x7c, + 0x00, 0x84, 0xff, 0x7c, 0x00, 0x85, 0xff, 0x7c, 0x00, 0x86, 0xff, 0x7c, + 0x00, 0x87, 0xff, 0x7c, 0x00, 0x88, 0xff, 0x7c, 0x00, 0x89, 0xff, 0x9e, + 0x00, 0x94, 0xff, 0x9e, 0x00, 0x95, 0xff, 0x9e, 0x00, 0x96, 0xff, 0x9e, + 0x00, 0x97, 0xff, 0x9e, 0x00, 0x98, 0xff, 0x9e, 0x00, 0x9a, 0xff, 0x9e, + 0x00, 0xa2, 0xff, 0x06, 0x00, 0xa3, 0xff, 0x06, 0x00, 0xa4, 0xff, 0x06, + 0x00, 0xa5, 0xff, 0x06, 0x00, 0xa6, 0xff, 0x06, 0x00, 0xa7, 0xff, 0x06, + 0x00, 0xa8, 0xff, 0x06, 0x00, 0xa9, 0xff, 0x2e, 0x00, 0xaa, 0xff, 0x2e, + 0x00, 0xab, 0xff, 0x2e, 0x00, 0xac, 0xff, 0x2e, 0x00, 0xad, 0xff, 0x2e, + 0x00, 0xb2, 0xff, 0x2e, 0x00, 0xb3, 0xff, 0x60, 0x00, 0xb4, 0xff, 0x2e, + 0x00, 0xb5, 0xff, 0x2e, 0x00, 0xb6, 0xff, 0x2e, 0x00, 0xb7, 0xff, 0x2e, + 0x00, 0xb8, 0xff, 0x2e, 0x00, 0xba, 0xff, 0x2e, 0x00, 0xbb, 0xff, 0x60, + 0x00, 0xbc, 0xff, 0x60, 0x00, 0xbd, 0xff, 0x60, 0x00, 0xbe, 0xff, 0x60, + 0x00, 0xc2, 0xff, 0x7c, 0x00, 0xc3, 0xff, 0x06, 0x00, 0xc4, 0xff, 0x9e, + 0x00, 0xc5, 0xff, 0x2e, 0x00, 0xc7, 0xff, 0x2e, 0x00, 0xcc, 0xff, 0x60, + 0x00, 0xcd, 0xff, 0x9e, 0x00, 0xce, 0xff, 0x2e, 0x00, 0xe5, 0xff, 0x4c, + 0x00, 0xe6, 0xff, 0x4c, 0x00, 0xe9, 0xff, 0x4c, 0x00, 0xec, 0xff, 0x4c, + 0x00, 0xef, 0xff, 0x4c, 0x00, 0xf2, 0xff, 0x4c, 0x00, 0xf3, 0xff, 0x4c, + 0x00, 0xf9, 0xff, 0x7c, 0x00, 0x6b, 0x00, 0x05, 0x00, 0x30, 0x00, 0x09, + 0xff, 0x78, 0x00, 0x0a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x30, 0x00, 0x0f, + 0xff, 0x40, 0x00, 0x10, 0xff, 0x90, 0x00, 0x11, 0xff, 0x40, 0x00, 0x12, + 0xff, 0x78, 0x00, 0x1d, 0xff, 0xa8, 0x00, 0x1e, 0xff, 0xa8, 0x00, 0x22, + 0x00, 0x30, 0x00, 0x23, 0xff, 0xcc, 0x00, 0x24, 0xff, 0x78, 0x00, 0x26, + 0xff, 0xcc, 0x00, 0x2a, 0xff, 0xcc, 0x00, 0x2d, 0xff, 0x68, 0x00, 0x32, + 0xff, 0xcc, 0x00, 0x34, 0xff, 0xcc, 0x00, 0x44, 0xff, 0x8c, 0x00, 0x46, + 0xff, 0x8c, 0x00, 0x47, 0xff, 0x8c, 0x00, 0x48, 0xff, 0x8c, 0x00, 0x49, + 0xff, 0xe2, 0x00, 0x4a, 0xff, 0x78, 0x00, 0x50, 0xff, 0xa8, 0x00, 0x51, + 0xff, 0xa8, 0x00, 0x52, 0xff, 0x8c, 0x00, 0x53, 0xff, 0xa8, 0x00, 0x54, + 0xff, 0x8c, 0x00, 0x55, 0xff, 0xa8, 0x00, 0x56, 0xff, 0x96, 0x00, 0x57, + 0xff, 0xd6, 0x00, 0x58, 0xff, 0xa8, 0x00, 0x59, 0xff, 0xd0, 0x00, 0x5b, + 0xff, 0xcc, 0x00, 0x5c, 0xff, 0xd0, 0x00, 0x5d, 0xff, 0xae, 0x00, 0x6c, + 0x00, 0x30, 0x00, 0x6d, 0xff, 0x90, 0x00, 0x6f, 0xff, 0x90, 0x00, 0x72, + 0x00, 0x30, 0x00, 0x74, 0x00, 0x3a, 0x00, 0x75, 0x00, 0x3a, 0x00, 0x77, + 0xff, 0xa8, 0x00, 0x79, 0xff, 0x90, 0x00, 0x7b, 0x00, 0x3a, 0x00, 0x7c, + 0x00, 0x30, 0x00, 0x7d, 0xff, 0x90, 0x00, 0x82, 0xff, 0x78, 0x00, 0x83, + 0xff, 0x78, 0x00, 0x84, 0xff, 0x78, 0x00, 0x85, 0xff, 0x78, 0x00, 0x86, + 0xff, 0x78, 0x00, 0x87, 0xff, 0x78, 0x00, 0x88, 0xff, 0x78, 0x00, 0x89, + 0xff, 0xcc, 0x00, 0x94, 0xff, 0xcc, 0x00, 0x95, 0xff, 0xcc, 0x00, 0x96, + 0xff, 0xcc, 0x00, 0x97, 0xff, 0xcc, 0x00, 0x98, 0xff, 0xcc, 0x00, 0x9a, + 0xff, 0xcc, 0x00, 0xa2, 0xff, 0x8c, 0x00, 0xa3, 0xff, 0x8c, 0x00, 0xa4, + 0xff, 0x8c, 0x00, 0xa5, 0xff, 0x8c, 0x00, 0xa6, 0xff, 0x8c, 0x00, 0xa7, + 0xff, 0x8c, 0x00, 0xa8, 0xff, 0x8c, 0x00, 0xa9, 0xff, 0x8c, 0x00, 0xaa, + 0xff, 0x8c, 0x00, 0xab, 0xff, 0x8c, 0x00, 0xac, 0xff, 0x8c, 0x00, 0xad, + 0xff, 0x8c, 0x00, 0xb2, 0xff, 0x8c, 0x00, 0xb3, 0xff, 0xa8, 0x00, 0xb4, + 0xff, 0x8c, 0x00, 0xb5, 0xff, 0x8c, 0x00, 0xb6, 0xff, 0x8c, 0x00, 0xb7, + 0xff, 0x8c, 0x00, 0xb8, 0xff, 0x8c, 0x00, 0xba, 0xff, 0x8c, 0x00, 0xbb, + 0xff, 0xa8, 0x00, 0xbc, 0xff, 0xa8, 0x00, 0xbd, 0xff, 0xa8, 0x00, 0xbe, + 0xff, 0xa8, 0x00, 0xc2, 0xff, 0x78, 0x00, 0xc3, 0xff, 0x8c, 0x00, 0xc4, + 0xff, 0xcc, 0x00, 0xc5, 0xff, 0x8c, 0x00, 0xc7, 0xff, 0x8c, 0x00, 0xcc, + 0xff, 0xa8, 0x00, 0xcd, 0xff, 0xcc, 0x00, 0xce, 0xff, 0x8c, 0x00, 0xe5, + 0xff, 0x90, 0x00, 0xe6, 0xff, 0x90, 0x00, 0xe7, 0x00, 0x30, 0x00, 0xe8, + 0x00, 0x30, 0x00, 0xe9, 0xff, 0x40, 0x00, 0xea, 0x00, 0x30, 0x00, 0xeb, + 0x00, 0x30, 0x00, 0xec, 0xff, 0x40, 0x00, 0xef, 0xff, 0x90, 0x00, 0xf2, + 0xff, 0x90, 0x00, 0xf3, 0xff, 0x90, 0x00, 0xf6, 0x00, 0x30, 0x00, 0xf9, + 0xff, 0x78, 0x00, 0x49, 0x00, 0x05, 0x00, 0x30, 0x00, 0x09, 0xff, 0xa2, + 0x00, 0x0a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x30, 0x00, 0x0f, 0xff, 0x86, + 0x00, 0x10, 0xff, 0xe0, 0x00, 0x11, 0xff, 0x86, 0x00, 0x12, 0xff, 0xa2, + 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0xff, 0xa2, 0x00, 0x2d, 0xff, 0x9a, + 0x00, 0x44, 0xff, 0xa8, 0x00, 0x46, 0xff, 0xe0, 0x00, 0x47, 0xff, 0xe0, + 0x00, 0x48, 0xff, 0xe0, 0x00, 0x4a, 0xff, 0x9e, 0x00, 0x52, 0xff, 0xe0, + 0x00, 0x54, 0xff, 0xe0, 0x00, 0x56, 0xff, 0xd2, 0x00, 0x6c, 0x00, 0x30, + 0x00, 0x6d, 0xff, 0xe0, 0x00, 0x6f, 0xff, 0xe0, 0x00, 0x72, 0x00, 0x30, + 0x00, 0x74, 0x00, 0x30, 0x00, 0x75, 0x00, 0x30, 0x00, 0x79, 0xff, 0xe0, + 0x00, 0x7b, 0x00, 0x30, 0x00, 0x7c, 0x00, 0x30, 0x00, 0x7d, 0xff, 0xe0, + 0x00, 0x82, 0xff, 0xa2, 0x00, 0x83, 0xff, 0xa2, 0x00, 0x84, 0xff, 0xa2, + 0x00, 0x85, 0xff, 0xa2, 0x00, 0x86, 0xff, 0xa2, 0x00, 0x87, 0xff, 0xa2, + 0x00, 0x88, 0xff, 0xa2, 0x00, 0xa2, 0xff, 0xa8, 0x00, 0xa3, 0xff, 0xa8, + 0x00, 0xa4, 0xff, 0xa8, 0x00, 0xa5, 0xff, 0xa8, 0x00, 0xa6, 0xff, 0xa8, + 0x00, 0xa7, 0xff, 0xa8, 0x00, 0xa8, 0xff, 0xa8, 0x00, 0xa9, 0xff, 0xe0, + 0x00, 0xaa, 0xff, 0xe0, 0x00, 0xab, 0xff, 0xe0, 0x00, 0xac, 0xff, 0xe0, + 0x00, 0xad, 0xff, 0xe0, 0x00, 0xb2, 0xff, 0xe0, 0x00, 0xb4, 0xff, 0xe0, + 0x00, 0xb5, 0xff, 0xe0, 0x00, 0xb6, 0xff, 0xe0, 0x00, 0xb7, 0xff, 0xe0, + 0x00, 0xb8, 0xff, 0xe0, 0x00, 0xba, 0xff, 0xe0, 0x00, 0xc2, 0xff, 0xa2, + 0x00, 0xc3, 0xff, 0xa8, 0x00, 0xc5, 0xff, 0xe0, 0x00, 0xc7, 0xff, 0xe0, + 0x00, 0xce, 0xff, 0xe0, 0x00, 0xe5, 0xff, 0xe0, 0x00, 0xe6, 0xff, 0xe0, + 0x00, 0xe7, 0x00, 0x30, 0x00, 0xe8, 0x00, 0x30, 0x00, 0xe9, 0xff, 0x86, + 0x00, 0xea, 0x00, 0x30, 0x00, 0xeb, 0x00, 0x30, 0x00, 0xec, 0xff, 0x86, + 0x00, 0xef, 0xff, 0xe0, 0x00, 0xf2, 0xff, 0xe0, 0x00, 0xf3, 0xff, 0xe0, + 0x00, 0xf6, 0x00, 0x30, 0x00, 0xf9, 0xff, 0xa2, 0x00, 0x31, 0x00, 0x10, + 0xff, 0xc2, 0x00, 0x23, 0xff, 0xe2, 0x00, 0x26, 0xff, 0xe2, 0x00, 0x2a, + 0xff, 0xe2, 0x00, 0x32, 0xff, 0xe2, 0x00, 0x34, 0xff, 0xe2, 0x00, 0x46, + 0xff, 0xdc, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x49, + 0xff, 0xcc, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x57, + 0xff, 0xae, 0x00, 0x59, 0xff, 0xbe, 0x00, 0x5a, 0xff, 0xc8, 0x00, 0x5c, + 0xff, 0xbe, 0x00, 0x6d, 0xff, 0xc2, 0x00, 0x6f, 0xff, 0xc2, 0x00, 0x79, + 0xff, 0xc2, 0x00, 0x7d, 0xff, 0xc2, 0x00, 0x89, 0xff, 0xe2, 0x00, 0x94, + 0xff, 0xe2, 0x00, 0x95, 0xff, 0xe2, 0x00, 0x96, 0xff, 0xe2, 0x00, 0x97, + 0xff, 0xe2, 0x00, 0x98, 0xff, 0xe2, 0x00, 0x9a, 0xff, 0xe2, 0x00, 0xa9, + 0xff, 0xdc, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xac, + 0xff, 0xdc, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xb2, 0xff, 0xdc, 0x00, 0xb4, + 0xff, 0xdc, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xb7, + 0xff, 0xdc, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xba, 0xff, 0xdc, 0x00, 0xc4, + 0xff, 0xe2, 0x00, 0xc5, 0xff, 0xdc, 0x00, 0xc7, 0xff, 0xdc, 0x00, 0xcd, + 0xff, 0xe2, 0x00, 0xce, 0xff, 0xdc, 0x00, 0xe5, 0xff, 0xc2, 0x00, 0xe6, + 0xff, 0xc2, 0x00, 0xef, 0xff, 0xc2, 0x00, 0xf2, 0xff, 0xc2, 0x00, 0xf3, + 0xff, 0xc2, 0x00, 0x12, 0x00, 0x05, 0x00, 0x44, 0x00, 0x0a, 0x00, 0x44, + 0x00, 0x0d, 0x00, 0x44, 0x00, 0x0f, 0xff, 0x7e, 0x00, 0x11, 0xff, 0x7e, + 0x00, 0x6c, 0x00, 0x44, 0x00, 0x72, 0x00, 0x44, 0x00, 0x74, 0x00, 0x64, + 0x00, 0x75, 0x00, 0x64, 0x00, 0x7b, 0x00, 0x64, 0x00, 0x7c, 0x00, 0x44, + 0x00, 0xe7, 0x00, 0x44, 0x00, 0xe8, 0x00, 0x44, 0x00, 0xe9, 0xff, 0x7e, + 0x00, 0xea, 0x00, 0x44, 0x00, 0xeb, 0x00, 0x44, 0x00, 0xec, 0xff, 0x7e, + 0x00, 0xf6, 0x00, 0x44, 0x00, 0x0d, 0x00, 0x0f, 0xff, 0x7c, 0x00, 0x11, + 0xff, 0x7c, 0x00, 0x44, 0xff, 0xda, 0x00, 0xa2, 0xff, 0xda, 0x00, 0xa3, + 0xff, 0xda, 0x00, 0xa4, 0xff, 0xda, 0x00, 0xa5, 0xff, 0xda, 0x00, 0xa6, + 0xff, 0xda, 0x00, 0xa7, 0xff, 0xda, 0x00, 0xa8, 0xff, 0xda, 0x00, 0xc3, + 0xff, 0xda, 0x00, 0xe9, 0xff, 0x7c, 0x00, 0xec, 0xff, 0x7c, 0x00, 0x04, + 0x00, 0x0f, 0xff, 0xc2, 0x00, 0x11, 0xff, 0xc2, 0x00, 0xe9, 0xff, 0xc2, + 0x00, 0xec, 0xff, 0xc2, 0x00, 0x14, 0x00, 0x46, 0xff, 0xc4, 0x00, 0x47, + 0xff, 0xc4, 0x00, 0x48, 0xff, 0xc4, 0x00, 0x52, 0xff, 0xc4, 0x00, 0x54, + 0xff, 0xc4, 0x00, 0xa9, 0xff, 0xc4, 0x00, 0xaa, 0xff, 0xc4, 0x00, 0xab, + 0xff, 0xc4, 0x00, 0xac, 0xff, 0xc4, 0x00, 0xad, 0xff, 0xc4, 0x00, 0xb2, + 0xff, 0xc4, 0x00, 0xb4, 0xff, 0xc4, 0x00, 0xb5, 0xff, 0xc4, 0x00, 0xb6, + 0xff, 0xc4, 0x00, 0xb7, 0xff, 0xc4, 0x00, 0xb8, 0xff, 0xc4, 0x00, 0xba, + 0xff, 0xc4, 0x00, 0xc5, 0xff, 0xc4, 0x00, 0xc7, 0xff, 0xc4, 0x00, 0xce, + 0xff, 0xc4, 0x00, 0x24, 0x00, 0x09, 0xff, 0xae, 0x00, 0x0f, 0xff, 0x7c, + 0x00, 0x11, 0xff, 0x7c, 0x00, 0x12, 0xff, 0xae, 0x00, 0x24, 0xff, 0xae, + 0x00, 0x46, 0xff, 0xe6, 0x00, 0x47, 0xff, 0xe6, 0x00, 0x48, 0xff, 0xe6, + 0x00, 0x52, 0xff, 0xe6, 0x00, 0x54, 0xff, 0xe6, 0x00, 0x82, 0xff, 0xae, + 0x00, 0x83, 0xff, 0xae, 0x00, 0x84, 0xff, 0xae, 0x00, 0x85, 0xff, 0xae, + 0x00, 0x86, 0xff, 0xae, 0x00, 0x87, 0xff, 0xae, 0x00, 0x88, 0xff, 0xae, + 0x00, 0xa9, 0xff, 0xe6, 0x00, 0xaa, 0xff, 0xe6, 0x00, 0xab, 0xff, 0xe6, + 0x00, 0xac, 0xff, 0xe6, 0x00, 0xad, 0xff, 0xe6, 0x00, 0xb2, 0xff, 0xe6, + 0x00, 0xb4, 0xff, 0xe6, 0x00, 0xb5, 0xff, 0xe6, 0x00, 0xb6, 0xff, 0xe6, + 0x00, 0xb7, 0xff, 0xe6, 0x00, 0xb8, 0xff, 0xe6, 0x00, 0xba, 0xff, 0xe6, + 0x00, 0xc2, 0xff, 0xae, 0x00, 0xc5, 0xff, 0xe6, 0x00, 0xc7, 0xff, 0xe6, + 0x00, 0xce, 0xff, 0xe6, 0x00, 0xe9, 0xff, 0x7c, 0x00, 0xec, 0xff, 0x7c, + 0x00, 0xf9, 0xff, 0xae, 0x00, 0x22, 0x00, 0x23, 0xff, 0xd8, 0x00, 0x26, + 0xff, 0xd8, 0x00, 0x2a, 0xff, 0xd8, 0x00, 0x32, 0xff, 0xd8, 0x00, 0x34, + 0xff, 0xd8, 0x00, 0x46, 0xff, 0xe0, 0x00, 0x47, 0xff, 0xe0, 0x00, 0x48, + 0xff, 0xe0, 0x00, 0x52, 0xff, 0xe0, 0x00, 0x54, 0xff, 0xe0, 0x00, 0x89, + 0xff, 0xd8, 0x00, 0x94, 0xff, 0xd8, 0x00, 0x95, 0xff, 0xd8, 0x00, 0x96, + 0xff, 0xd8, 0x00, 0x97, 0xff, 0xd8, 0x00, 0x98, 0xff, 0xd8, 0x00, 0x9a, + 0xff, 0xd8, 0x00, 0xa9, 0xff, 0xe0, 0x00, 0xaa, 0xff, 0xe0, 0x00, 0xab, + 0xff, 0xe0, 0x00, 0xac, 0xff, 0xe0, 0x00, 0xad, 0xff, 0xe0, 0x00, 0xb2, + 0xff, 0xe0, 0x00, 0xb4, 0xff, 0xe0, 0x00, 0xb5, 0xff, 0xe0, 0x00, 0xb6, + 0xff, 0xe0, 0x00, 0xb7, 0xff, 0xe0, 0x00, 0xb8, 0xff, 0xe0, 0x00, 0xba, + 0xff, 0xe0, 0x00, 0xc4, 0xff, 0xd8, 0x00, 0xc5, 0xff, 0xe0, 0x00, 0xc7, + 0xff, 0xe0, 0x00, 0xcd, 0xff, 0xd8, 0x00, 0xce, 0xff, 0xe0, 0x00, 0x12, + 0x00, 0x09, 0xff, 0x48, 0x00, 0x12, 0xff, 0x48, 0x00, 0x24, 0xff, 0x48, + 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x3c, 0x00, 0x28, + 0x00, 0x3f, 0x00, 0x3a, 0x00, 0x82, 0xff, 0x48, 0x00, 0x83, 0xff, 0x48, + 0x00, 0x84, 0xff, 0x48, 0x00, 0x85, 0xff, 0x48, 0x00, 0x86, 0xff, 0x48, + 0x00, 0x87, 0xff, 0x48, 0x00, 0x88, 0xff, 0x48, 0x00, 0x9f, 0x00, 0x28, + 0x00, 0xc2, 0xff, 0x48, 0x00, 0xd3, 0x00, 0x28, 0x00, 0xf9, 0xff, 0x48, + 0x00, 0x10, 0x00, 0x09, 0xff, 0xc8, 0x00, 0x0f, 0xff, 0xce, 0x00, 0x11, + 0xff, 0xce, 0x00, 0x12, 0xff, 0xc8, 0x00, 0x24, 0xff, 0xc8, 0x00, 0x82, + 0xff, 0xc8, 0x00, 0x83, 0xff, 0xc8, 0x00, 0x84, 0xff, 0xc8, 0x00, 0x85, + 0xff, 0xc8, 0x00, 0x86, 0xff, 0xc8, 0x00, 0x87, 0xff, 0xc8, 0x00, 0x88, + 0xff, 0xc8, 0x00, 0xc2, 0xff, 0xc8, 0x00, 0xe9, 0xff, 0xce, 0x00, 0xec, + 0xff, 0xce, 0x00, 0xf9, 0xff, 0xc8, 0x00, 0x29, 0x00, 0x05, 0xff, 0xd2, + 0x00, 0x09, 0xff, 0xd6, 0x00, 0x0a, 0xff, 0xd2, 0x00, 0x0c, 0xff, 0xd8, + 0x00, 0x0d, 0xff, 0xd2, 0x00, 0x0f, 0xff, 0xc8, 0x00, 0x11, 0xff, 0xc8, + 0x00, 0x12, 0xff, 0xd6, 0x00, 0x24, 0xff, 0xd6, 0x00, 0x37, 0xff, 0x9e, + 0x00, 0x39, 0xff, 0xcc, 0x00, 0x3b, 0xff, 0xe2, 0x00, 0x3c, 0xff, 0xb0, + 0x00, 0x3d, 0xff, 0xba, 0x00, 0x3f, 0xff, 0xcc, 0x00, 0x40, 0xff, 0xd8, + 0x00, 0x60, 0xff, 0xd8, 0x00, 0x6c, 0xff, 0xd2, 0x00, 0x72, 0xff, 0xd2, + 0x00, 0x7c, 0xff, 0xd2, 0x00, 0x82, 0xff, 0xd6, 0x00, 0x83, 0xff, 0xd6, + 0x00, 0x84, 0xff, 0xd6, 0x00, 0x85, 0xff, 0xd6, 0x00, 0x86, 0xff, 0xd6, + 0x00, 0x87, 0xff, 0xd6, 0x00, 0x88, 0xff, 0xd6, 0x00, 0x9f, 0xff, 0xb0, + 0x00, 0xc2, 0xff, 0xd6, 0x00, 0xd3, 0xff, 0xb0, 0x00, 0xd4, 0xff, 0xba, + 0x00, 0xd6, 0xff, 0xba, 0x00, 0xd8, 0xff, 0xba, 0x00, 0xe7, 0xff, 0xd2, + 0x00, 0xe8, 0xff, 0xd2, 0x00, 0xe9, 0xff, 0xc8, 0x00, 0xea, 0xff, 0xd2, + 0x00, 0xeb, 0xff, 0xd2, 0x00, 0xec, 0xff, 0xc8, 0x00, 0xf6, 0xff, 0xd2, + 0x00, 0xf9, 0xff, 0xd6, 0x00, 0x0a, 0x00, 0x10, 0xff, 0x6a, 0x00, 0x6d, + 0xff, 0x6a, 0x00, 0x6f, 0xff, 0x6a, 0x00, 0x79, 0xff, 0x6a, 0x00, 0x7d, + 0xff, 0x6a, 0x00, 0xe5, 0xff, 0x6a, 0x00, 0xe6, 0xff, 0x6a, 0x00, 0xef, + 0xff, 0x6a, 0x00, 0xf2, 0xff, 0x6a, 0x00, 0xf3, 0xff, 0x6a, 0x00, 0x20, + 0x00, 0x05, 0xff, 0x74, 0x00, 0x0a, 0xff, 0x74, 0x00, 0x0d, 0xff, 0x74, + 0x00, 0x10, 0xff, 0x80, 0x00, 0x39, 0xff, 0x5e, 0x00, 0x3a, 0xff, 0x86, + 0x00, 0x3c, 0xff, 0x68, 0x00, 0x3f, 0xff, 0x5e, 0x00, 0x59, 0xff, 0xc8, + 0x00, 0x5c, 0xff, 0xc8, 0x00, 0x6c, 0xff, 0x74, 0x00, 0x6d, 0xff, 0x80, + 0x00, 0x6f, 0xff, 0x80, 0x00, 0x72, 0xff, 0x74, 0x00, 0x74, 0xff, 0x7c, + 0x00, 0x75, 0xff, 0x7c, 0x00, 0x79, 0xff, 0x80, 0x00, 0x7b, 0xff, 0x7c, + 0x00, 0x7c, 0xff, 0x74, 0x00, 0x7d, 0xff, 0x80, 0x00, 0x9f, 0xff, 0x68, + 0x00, 0xd3, 0xff, 0x68, 0x00, 0xe5, 0xff, 0x80, 0x00, 0xe6, 0xff, 0x80, + 0x00, 0xe7, 0xff, 0x74, 0x00, 0xe8, 0xff, 0x74, 0x00, 0xea, 0xff, 0x74, + 0x00, 0xeb, 0xff, 0x74, 0x00, 0xef, 0xff, 0x80, 0x00, 0xf2, 0xff, 0x80, + 0x00, 0xf3, 0xff, 0x80, 0x00, 0xf6, 0xff, 0x74, 0x00, 0x11, 0x00, 0x05, + 0xff, 0xb8, 0x00, 0x0a, 0xff, 0xb8, 0x00, 0x0d, 0xff, 0xb8, 0x00, 0x59, + 0xff, 0xe0, 0x00, 0x5a, 0xff, 0xf0, 0x00, 0x5c, 0xff, 0xe0, 0x00, 0x6c, + 0xff, 0xb8, 0x00, 0x72, 0xff, 0xb8, 0x00, 0x74, 0xff, 0xb8, 0x00, 0x75, + 0xff, 0xb8, 0x00, 0x7b, 0xff, 0xb8, 0x00, 0x7c, 0xff, 0xb8, 0x00, 0xe7, + 0xff, 0xb8, 0x00, 0xe8, 0xff, 0xb8, 0x00, 0xea, 0xff, 0xb8, 0x00, 0xeb, + 0xff, 0xb8, 0x00, 0xf6, 0xff, 0xb8, 0x00, 0x14, 0x00, 0x05, 0xff, 0xa4, + 0x00, 0x0a, 0xff, 0xa4, 0x00, 0x0c, 0xff, 0xe0, 0x00, 0x0d, 0xff, 0xa4, + 0x00, 0x39, 0xff, 0x8c, 0x00, 0x3a, 0xff, 0xe0, 0x00, 0x3f, 0xff, 0x8c, + 0x00, 0x40, 0xff, 0xe0, 0x00, 0x59, 0xff, 0xe6, 0x00, 0x5b, 0xff, 0xc4, + 0x00, 0x5c, 0xff, 0xe6, 0x00, 0x60, 0xff, 0xe0, 0x00, 0x6c, 0xff, 0xa4, + 0x00, 0x72, 0xff, 0xa4, 0x00, 0x7c, 0xff, 0xa4, 0x00, 0xe7, 0xff, 0xa4, + 0x00, 0xe8, 0xff, 0xa4, 0x00, 0xea, 0xff, 0xa4, 0x00, 0xeb, 0xff, 0xa4, + 0x00, 0xf6, 0xff, 0xa4, 0x00, 0x69, 0x00, 0x05, 0x00, 0x1e, 0x00, 0x09, + 0xff, 0x5c, 0x00, 0x0a, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x1e, 0x00, 0x0f, + 0xff, 0x68, 0x00, 0x10, 0xff, 0x60, 0x00, 0x11, 0xff, 0x68, 0x00, 0x12, + 0xff, 0x5c, 0x00, 0x1d, 0xff, 0x86, 0x00, 0x1e, 0xff, 0x86, 0x00, 0x22, + 0x00, 0x22, 0x00, 0x23, 0xff, 0xb0, 0x00, 0x24, 0xff, 0x5c, 0x00, 0x26, + 0xff, 0xb0, 0x00, 0x2a, 0xff, 0xb0, 0x00, 0x2d, 0xff, 0x38, 0x00, 0x32, + 0xff, 0xb0, 0x00, 0x34, 0xff, 0xb0, 0x00, 0x44, 0xff, 0x80, 0x00, 0x46, + 0xff, 0x60, 0x00, 0x47, 0xff, 0x60, 0x00, 0x48, 0xff, 0x60, 0x00, 0x4a, + 0xff, 0x54, 0x00, 0x50, 0xff, 0x86, 0x00, 0x51, 0xff, 0x86, 0x00, 0x52, + 0xff, 0x60, 0x00, 0x53, 0xff, 0x86, 0x00, 0x54, 0xff, 0x60, 0x00, 0x55, + 0xff, 0x86, 0x00, 0x56, 0xff, 0x80, 0x00, 0x58, 0xff, 0x86, 0x00, 0x59, + 0xff, 0x9c, 0x00, 0x5a, 0xff, 0xa4, 0x00, 0x5b, 0xff, 0x7c, 0x00, 0x5c, + 0xff, 0x9c, 0x00, 0x6c, 0x00, 0x1e, 0x00, 0x6d, 0xff, 0x60, 0x00, 0x6f, + 0xff, 0x60, 0x00, 0x72, 0x00, 0x1e, 0x00, 0x74, 0x00, 0x32, 0x00, 0x75, + 0x00, 0x32, 0x00, 0x77, 0xff, 0x86, 0x00, 0x79, 0xff, 0x60, 0x00, 0x7b, + 0x00, 0x32, 0x00, 0x7c, 0x00, 0x1e, 0x00, 0x7d, 0xff, 0x60, 0x00, 0x82, + 0xff, 0x5c, 0x00, 0x83, 0xff, 0x5c, 0x00, 0x84, 0xff, 0x5c, 0x00, 0x85, + 0xff, 0x5c, 0x00, 0x86, 0xff, 0x5c, 0x00, 0x87, 0xff, 0x5c, 0x00, 0x88, + 0xff, 0x5c, 0x00, 0x89, 0xff, 0xb0, 0x00, 0x94, 0xff, 0xb0, 0x00, 0x95, + 0xff, 0xb0, 0x00, 0x96, 0xff, 0xb0, 0x00, 0x97, 0xff, 0xb0, 0x00, 0x98, + 0xff, 0xb0, 0x00, 0x9a, 0xff, 0xb0, 0x00, 0xa2, 0xff, 0x80, 0x00, 0xa3, + 0xff, 0x80, 0x00, 0xa4, 0xff, 0x80, 0x00, 0xa5, 0xff, 0x80, 0x00, 0xa6, + 0xff, 0x80, 0x00, 0xa7, 0xff, 0x80, 0x00, 0xa8, 0xff, 0x80, 0x00, 0xa9, + 0xff, 0x60, 0x00, 0xaa, 0xff, 0x60, 0x00, 0xab, 0xff, 0x60, 0x00, 0xac, + 0xff, 0x60, 0x00, 0xad, 0xff, 0x60, 0x00, 0xb2, 0xff, 0x60, 0x00, 0xb3, + 0xff, 0x86, 0x00, 0xb4, 0xff, 0x60, 0x00, 0xb5, 0xff, 0x60, 0x00, 0xb6, + 0xff, 0x60, 0x00, 0xb7, 0xff, 0x60, 0x00, 0xb8, 0xff, 0x60, 0x00, 0xba, + 0xff, 0x60, 0x00, 0xbb, 0xff, 0x86, 0x00, 0xbc, 0xff, 0x86, 0x00, 0xbd, + 0xff, 0x86, 0x00, 0xbe, 0xff, 0x86, 0x00, 0xc2, 0xff, 0x5c, 0x00, 0xc3, + 0xff, 0x80, 0x00, 0xc4, 0xff, 0xb0, 0x00, 0xc5, 0xff, 0x60, 0x00, 0xc7, + 0xff, 0x60, 0x00, 0xcc, 0xff, 0x86, 0x00, 0xcd, 0xff, 0xb0, 0x00, 0xce, + 0xff, 0x60, 0x00, 0xe5, 0xff, 0x60, 0x00, 0xe6, 0xff, 0x60, 0x00, 0xe7, + 0x00, 0x1e, 0x00, 0xe8, 0x00, 0x1e, 0x00, 0xe9, 0xff, 0x68, 0x00, 0xea, + 0x00, 0x1e, 0x00, 0xeb, 0x00, 0x1e, 0x00, 0xec, 0xff, 0x68, 0x00, 0xef, + 0xff, 0x60, 0x00, 0xf2, 0xff, 0x60, 0x00, 0xf3, 0xff, 0x60, 0x00, 0xf6, + 0x00, 0x1e, 0x00, 0xf9, 0xff, 0x5c, 0x00, 0x30, 0x00, 0x10, 0xff, 0xba, + 0x00, 0x22, 0x00, 0x22, 0x00, 0x23, 0xff, 0xc6, 0x00, 0x26, 0xff, 0xc6, + 0x00, 0x2a, 0xff, 0xc6, 0x00, 0x32, 0xff, 0xc6, 0x00, 0x34, 0xff, 0xc6, + 0x00, 0x46, 0xff, 0xda, 0x00, 0x47, 0xff, 0xda, 0x00, 0x48, 0xff, 0xda, + 0x00, 0x52, 0xff, 0xda, 0x00, 0x54, 0xff, 0xda, 0x00, 0x56, 0xff, 0xe4, + 0x00, 0x59, 0xff, 0xd8, 0x00, 0x5c, 0xff, 0xd8, 0x00, 0x6d, 0xff, 0xba, + 0x00, 0x6f, 0xff, 0xba, 0x00, 0x79, 0xff, 0xba, 0x00, 0x7d, 0xff, 0xba, + 0x00, 0x89, 0xff, 0xc6, 0x00, 0x94, 0xff, 0xc6, 0x00, 0x95, 0xff, 0xc6, + 0x00, 0x96, 0xff, 0xc6, 0x00, 0x97, 0xff, 0xc6, 0x00, 0x98, 0xff, 0xc6, + 0x00, 0x9a, 0xff, 0xc6, 0x00, 0xa9, 0xff, 0xda, 0x00, 0xaa, 0xff, 0xda, + 0x00, 0xab, 0xff, 0xda, 0x00, 0xac, 0xff, 0xda, 0x00, 0xad, 0xff, 0xda, + 0x00, 0xb2, 0xff, 0xda, 0x00, 0xb4, 0xff, 0xda, 0x00, 0xb5, 0xff, 0xda, + 0x00, 0xb6, 0xff, 0xda, 0x00, 0xb7, 0xff, 0xda, 0x00, 0xb8, 0xff, 0xda, + 0x00, 0xba, 0xff, 0xda, 0x00, 0xc4, 0xff, 0xc6, 0x00, 0xc5, 0xff, 0xda, + 0x00, 0xc7, 0xff, 0xda, 0x00, 0xcd, 0xff, 0xc6, 0x00, 0xce, 0xff, 0xda, + 0x00, 0xe5, 0xff, 0xba, 0x00, 0xe6, 0xff, 0xba, 0x00, 0xef, 0xff, 0xba, + 0x00, 0xf2, 0xff, 0xba, 0x00, 0xf3, 0xff, 0xba, 0x00, 0x2d, 0x00, 0x05, + 0xff, 0x1c, 0x00, 0x0a, 0xff, 0x1c, 0x00, 0x0d, 0xff, 0x1c, 0x00, 0x10, + 0xff, 0x78, 0x00, 0x23, 0xff, 0xc8, 0x00, 0x26, 0xff, 0xc8, 0x00, 0x2a, + 0xff, 0xc8, 0x00, 0x32, 0xff, 0xc8, 0x00, 0x34, 0xff, 0xc8, 0x00, 0x37, + 0xff, 0x4c, 0x00, 0x39, 0xff, 0x4c, 0x00, 0x3a, 0xff, 0x86, 0x00, 0x3c, + 0xff, 0x68, 0x00, 0x3f, 0xff, 0x4c, 0x00, 0x59, 0xff, 0x7c, 0x00, 0x5a, + 0xff, 0xc2, 0x00, 0x5c, 0xff, 0x7c, 0x00, 0x6c, 0xff, 0x1c, 0x00, 0x6d, + 0xff, 0x78, 0x00, 0x6f, 0xff, 0x78, 0x00, 0x72, 0xff, 0x1c, 0x00, 0x79, + 0xff, 0x78, 0x00, 0x7c, 0xff, 0x1c, 0x00, 0x7d, 0xff, 0x78, 0x00, 0x89, + 0xff, 0xc8, 0x00, 0x94, 0xff, 0xc8, 0x00, 0x95, 0xff, 0xc8, 0x00, 0x96, + 0xff, 0xc8, 0x00, 0x97, 0xff, 0xc8, 0x00, 0x98, 0xff, 0xc8, 0x00, 0x9a, + 0xff, 0xc8, 0x00, 0x9f, 0xff, 0x68, 0x00, 0xc4, 0xff, 0xc8, 0x00, 0xcd, + 0xff, 0xc8, 0x00, 0xd3, 0xff, 0x68, 0x00, 0xe5, 0xff, 0x78, 0x00, 0xe6, + 0xff, 0x78, 0x00, 0xe7, 0xff, 0x1c, 0x00, 0xe8, 0xff, 0x1c, 0x00, 0xea, + 0xff, 0x1c, 0x00, 0xeb, 0xff, 0x1c, 0x00, 0xef, 0xff, 0x78, 0x00, 0xf2, + 0xff, 0x78, 0x00, 0xf3, 0xff, 0x78, 0x00, 0xf6, 0xff, 0x1c, 0x00, 0x27, + 0x00, 0x05, 0xff, 0x4e, 0x00, 0x09, 0xff, 0xcc, 0x00, 0x0a, 0xff, 0x4e, + 0x00, 0x0d, 0xff, 0x4e, 0x00, 0x0f, 0xff, 0x78, 0x00, 0x11, 0xff, 0x78, + 0x00, 0x12, 0xff, 0xcc, 0x00, 0x24, 0xff, 0xcc, 0x00, 0x37, 0xff, 0x4c, + 0x00, 0x39, 0xff, 0x90, 0x00, 0x3a, 0xff, 0xe0, 0x00, 0x3b, 0xff, 0xc2, + 0x00, 0x3c, 0xff, 0x60, 0x00, 0x3d, 0xff, 0xd2, 0x00, 0x3f, 0xff, 0x90, + 0x00, 0x6c, 0xff, 0x4e, 0x00, 0x72, 0xff, 0x4e, 0x00, 0x7c, 0xff, 0x4e, + 0x00, 0x82, 0xff, 0xcc, 0x00, 0x83, 0xff, 0xcc, 0x00, 0x84, 0xff, 0xcc, + 0x00, 0x85, 0xff, 0xcc, 0x00, 0x86, 0xff, 0xcc, 0x00, 0x87, 0xff, 0xcc, + 0x00, 0x88, 0xff, 0xcc, 0x00, 0x9f, 0xff, 0x60, 0x00, 0xc2, 0xff, 0xcc, + 0x00, 0xd3, 0xff, 0x60, 0x00, 0xd4, 0xff, 0xd2, 0x00, 0xd6, 0xff, 0xd2, + 0x00, 0xd8, 0xff, 0xd2, 0x00, 0xe7, 0xff, 0x4e, 0x00, 0xe8, 0xff, 0x4e, + 0x00, 0xe9, 0xff, 0x78, 0x00, 0xea, 0xff, 0x4e, 0x00, 0xeb, 0xff, 0x4e, + 0x00, 0xec, 0xff, 0x78, 0x00, 0xf6, 0xff, 0x4e, 0x00, 0xf9, 0xff, 0xcc, + 0x00, 0x4b, 0x00, 0x09, 0xff, 0x4a, 0x00, 0x0f, 0xff, 0x1c, 0x00, 0x10, + 0xff, 0x4e, 0x00, 0x11, 0xff, 0x1c, 0x00, 0x12, 0xff, 0x4a, 0x00, 0x23, + 0xff, 0xd2, 0x00, 0x24, 0xff, 0x4a, 0x00, 0x26, 0xff, 0xd2, 0x00, 0x2a, + 0xff, 0xd2, 0x00, 0x32, 0xff, 0xd2, 0x00, 0x34, 0xff, 0xd2, 0x00, 0x39, + 0x00, 0x30, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x1e, 0x00, 0x3f, + 0x00, 0x30, 0x00, 0x44, 0xff, 0xc0, 0x00, 0x46, 0xff, 0xa4, 0x00, 0x47, + 0xff, 0xa4, 0x00, 0x48, 0xff, 0xa4, 0x00, 0x52, 0xff, 0xa4, 0x00, 0x54, + 0xff, 0xa4, 0x00, 0x6d, 0xff, 0x4e, 0x00, 0x6f, 0xff, 0x4e, 0x00, 0x79, + 0xff, 0x4e, 0x00, 0x7d, 0xff, 0x4e, 0x00, 0x82, 0xff, 0x4a, 0x00, 0x83, + 0xff, 0x4a, 0x00, 0x84, 0xff, 0x4a, 0x00, 0x85, 0xff, 0x4a, 0x00, 0x86, + 0xff, 0x4a, 0x00, 0x87, 0xff, 0x4a, 0x00, 0x88, 0xff, 0x4a, 0x00, 0x89, + 0xff, 0xd2, 0x00, 0x94, 0xff, 0xd2, 0x00, 0x95, 0xff, 0xd2, 0x00, 0x96, + 0xff, 0xd2, 0x00, 0x97, 0xff, 0xd2, 0x00, 0x98, 0xff, 0xd2, 0x00, 0x9a, + 0xff, 0xd2, 0x00, 0x9f, 0x00, 0x1e, 0x00, 0xa2, 0xff, 0xc0, 0x00, 0xa3, + 0xff, 0xc0, 0x00, 0xa4, 0xff, 0xc0, 0x00, 0xa5, 0xff, 0xc0, 0x00, 0xa6, + 0xff, 0xc0, 0x00, 0xa7, 0xff, 0xc0, 0x00, 0xa8, 0xff, 0xc0, 0x00, 0xa9, + 0xff, 0xa4, 0x00, 0xaa, 0xff, 0xa4, 0x00, 0xab, 0xff, 0xa4, 0x00, 0xac, + 0xff, 0xa4, 0x00, 0xad, 0xff, 0xa4, 0x00, 0xb2, 0xff, 0xa4, 0x00, 0xb4, + 0xff, 0xa4, 0x00, 0xb5, 0xff, 0xa4, 0x00, 0xb6, 0xff, 0xa4, 0x00, 0xb7, + 0xff, 0xa4, 0x00, 0xb8, 0xff, 0xa4, 0x00, 0xba, 0xff, 0xa4, 0x00, 0xc2, + 0xff, 0x4a, 0x00, 0xc3, 0xff, 0xc0, 0x00, 0xc4, 0xff, 0xd2, 0x00, 0xc5, + 0xff, 0xa4, 0x00, 0xc7, 0xff, 0xa4, 0x00, 0xcd, 0xff, 0xd2, 0x00, 0xce, + 0xff, 0xa4, 0x00, 0xd3, 0x00, 0x1e, 0x00, 0xe5, 0xff, 0x4e, 0x00, 0xe6, + 0xff, 0x4e, 0x00, 0xe9, 0xff, 0x1c, 0x00, 0xec, 0xff, 0x1c, 0x00, 0xef, + 0xff, 0x4e, 0x00, 0xf2, 0xff, 0x4e, 0x00, 0xf3, 0xff, 0x4e, 0x00, 0xf9, + 0xff, 0x4a, 0x00, 0x36, 0x00, 0x05, 0xff, 0x4a, 0x00, 0x0a, 0xff, 0x4a, + 0x00, 0x0d, 0xff, 0x4a, 0x00, 0x10, 0xff, 0xcc, 0x00, 0x22, 0xff, 0xc8, + 0x00, 0x23, 0xff, 0xd6, 0x00, 0x26, 0xff, 0xd6, 0x00, 0x2a, 0xff, 0xd6, + 0x00, 0x2d, 0x00, 0x32, 0x00, 0x32, 0xff, 0xd6, 0x00, 0x34, 0xff, 0xd6, + 0x00, 0x37, 0xff, 0x7c, 0x00, 0x38, 0xff, 0xc8, 0x00, 0x39, 0xff, 0x78, + 0x00, 0x3a, 0xff, 0xac, 0x00, 0x3c, 0xff, 0x5c, 0x00, 0x3f, 0xff, 0x78, + 0x00, 0x59, 0xff, 0xae, 0x00, 0x5c, 0xff, 0xae, 0x00, 0x6c, 0xff, 0x4a, + 0x00, 0x6d, 0xff, 0xcc, 0x00, 0x6f, 0xff, 0xcc, 0x00, 0x72, 0xff, 0x4a, + 0x00, 0x74, 0xff, 0x48, 0x00, 0x75, 0xff, 0x48, 0x00, 0x79, 0xff, 0xcc, + 0x00, 0x7b, 0xff, 0x48, 0x00, 0x7c, 0xff, 0x4a, 0x00, 0x7d, 0xff, 0xcc, + 0x00, 0x89, 0xff, 0xd6, 0x00, 0x94, 0xff, 0xd6, 0x00, 0x95, 0xff, 0xd6, + 0x00, 0x96, 0xff, 0xd6, 0x00, 0x97, 0xff, 0xd6, 0x00, 0x98, 0xff, 0xd6, + 0x00, 0x9a, 0xff, 0xd6, 0x00, 0x9b, 0xff, 0xc8, 0x00, 0x9c, 0xff, 0xc8, + 0x00, 0x9d, 0xff, 0xc8, 0x00, 0x9e, 0xff, 0xc8, 0x00, 0x9f, 0xff, 0x5c, + 0x00, 0xc4, 0xff, 0xd6, 0x00, 0xcd, 0xff, 0xd6, 0x00, 0xd3, 0xff, 0x5c, + 0x00, 0xe5, 0xff, 0xcc, 0x00, 0xe6, 0xff, 0xcc, 0x00, 0xe7, 0xff, 0x4a, + 0x00, 0xe8, 0xff, 0x4a, 0x00, 0xea, 0xff, 0x4a, 0x00, 0xeb, 0xff, 0x4a, + 0x00, 0xef, 0xff, 0xcc, 0x00, 0xf2, 0xff, 0xcc, 0x00, 0xf3, 0xff, 0xcc, + 0x00, 0xf6, 0xff, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x38, + 0x00, 0x70, 0x00, 0x02, 0x44, 0x46, 0x4c, 0x54, 0x00, 0x0e, 0x6c, 0x61, + 0x74, 0x6e, 0x00, 0x1e, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, + 0x00, 0x06, 0x63, 0x61, 0x73, 0x65, 0x00, 0x26, 0x63, 0x61, 0x73, 0x65, + 0x00, 0x26, 0x6c, 0x69, 0x67, 0x61, 0x00, 0x2c, 0x6c, 0x69, 0x67, 0x61, + 0x00, 0x2c, 0x73, 0x75, 0x70, 0x73, 0x00, 0x32, 0x73, 0x75, 0x70, 0x73, + 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x46, 0x00, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x02, 0x00, 0x1c, 0x00, 0x0b, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, + 0x01, 0x0b, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, + 0x01, 0x11, 0x01, 0x12, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x43, 0x00, 0x6a, + 0x00, 0x71, 0x00, 0x76, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xde, 0x00, 0xdf, + 0x00, 0xe0, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0c, 0x01, 0x06, 0x00, 0x02, 0x00, 0x4c, 0x01, 0x07, + 0x00, 0x02, 0x00, 0x4f, 0x00, 0x01, 0x00, 0x01, 0x00, 0x49, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x03, + 0x00, 0x7b, 0x00, 0x74, 0x00, 0x75, 0x00, 0x01, 0x00, 0x03, 0x00, 0x14, + 0x00, 0x15, 0x00, 0x16 +}; + return s_data; +} + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/font/roboto_bold_ttf b/source/externals/g4tools/include/tools/font/roboto_bold_ttf new file mode 100644 index 0000000000..0967a4a230 --- /dev/null +++ b/source/externals/g4tools/include/tools/font/roboto_bold_ttf @@ -0,0 +1,13969 @@ +// License text of the roboto fonts is in the file roboto_license + +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +#ifndef tools_font_roboto_bold_ttf +#define tools_font_roboto_bold_ttf + +// done with: +// macOS> xxd -i roboto_bold.ttf > roboto_bold_ttf + +namespace tools { +namespace font { + +inline const unsigned char* roboto_bold_ttf(unsigned int& a_len) { + a_len = 167336; + static const unsigned char s_data[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x04, 0x00, 0x20, + 0x47, 0x44, 0x45, 0x46, 0xb4, 0x42, 0xb0, 0x82, 0x00, 0x02, 0x10, 0x84, + 0x00, 0x00, 0x02, 0x62, 0x47, 0x50, 0x4f, 0x53, 0xf9, 0x6e, 0x4b, 0x86, + 0x00, 0x02, 0x12, 0xe8, 0x00, 0x00, 0x65, 0x2e, 0x47, 0x53, 0x55, 0x42, + 0xeb, 0x82, 0xe4, 0x59, 0x00, 0x02, 0x78, 0x18, 0x00, 0x00, 0x15, 0x90, + 0x4f, 0x53, 0x2f, 0x32, 0x98, 0xae, 0xb1, 0xa9, 0x00, 0x01, 0xfe, 0x90, + 0x00, 0x00, 0x00, 0x60, 0x63, 0x6d, 0x61, 0x70, 0xc6, 0xee, 0x51, 0x6d, + 0x00, 0x02, 0x04, 0x08, 0x00, 0x00, 0x06, 0x82, 0x63, 0x76, 0x74, 0x20, + 0x2b, 0x7e, 0x04, 0xb5, 0x00, 0x02, 0x0d, 0x74, 0x00, 0x00, 0x00, 0x48, + 0x66, 0x70, 0x67, 0x6d, 0x5f, 0xf2, 0x1a, 0xab, 0x00, 0x02, 0x0a, 0x8c, + 0x00, 0x00, 0x01, 0xbc, 0x67, 0x61, 0x73, 0x70, 0x00, 0x08, 0x00, 0x13, + 0x00, 0x02, 0x10, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x67, 0x6c, 0x79, 0x66, + 0x9f, 0x96, 0x48, 0xd9, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x01, 0xde, 0x90, + 0x68, 0x64, 0x6d, 0x78, 0x80, 0x8f, 0x8e, 0xa5, 0x00, 0x01, 0xfe, 0xf0, + 0x00, 0x00, 0x05, 0x18, 0x68, 0x65, 0x61, 0x64, 0xfc, 0xd7, 0xd2, 0x5c, + 0x00, 0x01, 0xe9, 0xfc, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, + 0x0b, 0x26, 0x0a, 0xda, 0x00, 0x01, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x24, + 0x68, 0x6d, 0x74, 0x78, 0x27, 0x9c, 0x11, 0x5d, 0x00, 0x01, 0xea, 0x34, + 0x00, 0x00, 0x14, 0x38, 0x6c, 0x6f, 0x63, 0x61, 0x77, 0xf3, 0xfa, 0x43, + 0x00, 0x01, 0xdf, 0xdc, 0x00, 0x00, 0x0a, 0x1e, 0x6d, 0x61, 0x78, 0x70, + 0x07, 0x3e, 0x03, 0x11, 0x00, 0x01, 0xdf, 0xbc, 0x00, 0x00, 0x00, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x35, 0xde, 0x64, 0x19, 0x00, 0x02, 0x0d, 0xbc, + 0x00, 0x00, 0x02, 0x9c, 0x70, 0x6f, 0x73, 0x74, 0xff, 0x6d, 0x00, 0x64, + 0x00, 0x02, 0x10, 0x58, 0x00, 0x00, 0x00, 0x20, 0x70, 0x72, 0x65, 0x70, + 0x2a, 0x76, 0x36, 0x30, 0x00, 0x02, 0x0c, 0x48, 0x00, 0x00, 0x01, 0x29, + 0x00, 0x05, 0x00, 0x64, 0x00, 0x00, 0x03, 0x28, 0x05, 0xb0, 0x00, 0x03, + 0x00, 0x06, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x50, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, + 0x59, 0xb2, 0x04, 0x02, 0x00, 0x11, 0x12, 0x39, 0xb2, 0x05, 0x02, 0x00, + 0x11, 0x12, 0x39, 0xb2, 0x07, 0x02, 0x00, 0x11, 0x12, 0x39, 0xb2, 0x08, + 0x02, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0xdc, 0xb2, 0x0c, 0x02, 0x00, + 0x11, 0x12, 0x39, 0xb2, 0x0d, 0x02, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x02, + 0x10, 0xb0, 0x0e, 0xdc, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x03, 0x11, + 0x01, 0x01, 0x11, 0x01, 0x03, 0x21, 0x01, 0x35, 0x01, 0x21, 0x03, 0x28, + 0xfd, 0x3c, 0x02, 0xc4, 0x36, 0xfe, 0xee, 0xfe, 0xba, 0x01, 0x0c, 0xe4, + 0x02, 0x03, 0xfe, 0xfe, 0x01, 0x02, 0xfd, 0xfd, 0x05, 0xb0, 0xfa, 0xa4, + 0x05, 0x07, 0xfd, 0x7d, 0x02, 0x77, 0xfb, 0x11, 0x02, 0x78, 0xfd, 0x5e, + 0x02, 0x5e, 0x88, 0x02, 0x5e, 0x00, 0x00, 0x02, 0x00, 0x7c, 0xff, 0xf0, + 0x01, 0xbf, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x3c, 0xb2, 0x04, + 0x0f, 0x10, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x01, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, + 0x3e, 0x59, 0xb1, 0x04, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0x30, 0x31, 0x01, 0x23, + 0x03, 0x21, 0x03, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x34, + 0x36, 0x01, 0x95, 0xf0, 0x22, 0x01, 0x34, 0x9a, 0x49, 0x59, 0x59, 0x49, + 0x48, 0x59, 0x59, 0x01, 0xbf, 0x03, 0xf1, 0xfb, 0x71, 0x56, 0x43, 0x42, + 0x56, 0x56, 0x84, 0x57, 0x00, 0x02, 0x00, 0x40, 0x03, 0xdb, 0x02, 0x4f, + 0x06, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x26, 0xb2, 0x04, 0x0a, 0x0b, + 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x08, 0xd0, 0x00, 0xb0, 0x03, + 0x2f, 0xb2, 0x02, 0x0a, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, + 0x07, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x08, 0xd0, 0x30, 0x31, 0x01, 0x03, + 0x23, 0x11, 0x33, 0x05, 0x03, 0x23, 0x11, 0x33, 0x01, 0x0a, 0x28, 0xa2, + 0xca, 0x01, 0x45, 0x27, 0xa2, 0xc9, 0x05, 0x76, 0xfe, 0x65, 0x02, 0x25, + 0x8a, 0xfe, 0x65, 0x02, 0x25, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, + 0x04, 0x9c, 0x05, 0xb0, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x9e, 0xb2, 0x1f, + 0x20, 0x21, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x10, 0xb0, 0x0e, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, + 0x1a, 0x0c, 0x3e, 0x59, 0xb2, 0x1d, 0x0c, 0x02, 0x11, 0x12, 0x39, 0x7c, + 0xb0, 0x1d, 0x2f, 0x18, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x1d, 0x10, 0xb0, 0x06, + 0xd0, 0xb0, 0x1d, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x0b, 0x2f, 0xb1, 0x08, + 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, + 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x08, + 0x10, 0xb0, 0x14, 0xd0, 0xb0, 0x1d, 0x10, 0xb0, 0x16, 0xd0, 0xb0, 0x00, + 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x1e, 0xd0, 0x30, 0x31, + 0x01, 0x23, 0x03, 0x23, 0x13, 0x23, 0x35, 0x21, 0x13, 0x23, 0x35, 0x21, + 0x13, 0x33, 0x03, 0x33, 0x13, 0x33, 0x03, 0x33, 0x15, 0x23, 0x03, 0x33, + 0x15, 0x23, 0x03, 0x23, 0x03, 0x33, 0x13, 0x23, 0x02, 0x9b, 0xc1, 0x48, + 0xb7, 0x48, 0xe3, 0x01, 0x01, 0x32, 0xe8, 0x01, 0x07, 0x49, 0xb6, 0x49, + 0xc2, 0x49, 0xb7, 0x49, 0xdb, 0xfa, 0x32, 0xe0, 0xfe, 0x48, 0xb7, 0x5b, + 0xc1, 0x32, 0xc2, 0x01, 0x9a, 0xfe, 0x66, 0x01, 0x9a, 0xac, 0x01, 0x1c, + 0xae, 0x01, 0xa0, 0xfe, 0x60, 0x01, 0xa0, 0xfe, 0x60, 0xae, 0xfe, 0xe4, + 0xac, 0xfe, 0x66, 0x02, 0x46, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x00, 0x5c, + 0xff, 0x29, 0x04, 0x37, 0x06, 0x97, 0x00, 0x2d, 0x00, 0x72, 0xb2, 0x2b, + 0x2e, 0x2f, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x21, 0x2f, 0x1b, 0xb1, 0x21, 0x0c, 0x3e, 0x59, 0xb2, 0x02, 0x21, 0x0a, + 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb0, 0x0d, 0xd0, 0xb2, 0x11, 0x0a, + 0x21, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x1a, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x21, + 0x10, 0xb0, 0x24, 0xd0, 0xb2, 0x28, 0x21, 0x0a, 0x11, 0x12, 0x39, 0xb0, + 0x21, 0x10, 0xb1, 0x2b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x2e, 0x04, 0x35, 0x34, 0x36, 0x37, + 0x35, 0x33, 0x15, 0x16, 0x16, 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x15, 0x14, 0x1e, 0x04, 0x15, 0x14, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, + 0x26, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x16, 0x5b, 0xda, + 0x9e, 0x71, 0x3f, 0xd8, 0xb3, 0xa0, 0xb1, 0xc8, 0xfe, 0xdf, 0x63, 0x53, + 0x52, 0x5a, 0x58, 0xef, 0x9a, 0x6a, 0x38, 0xd4, 0xba, 0x9f, 0xcd, 0xe1, + 0x01, 0x21, 0x71, 0x6a, 0x58, 0x66, 0x01, 0x7f, 0x52, 0x61, 0x52, 0x51, + 0x69, 0x8e, 0x62, 0xa9, 0xd8, 0x12, 0xd6, 0xd9, 0x19, 0xf5, 0xc3, 0x78, + 0x77, 0x5d, 0x52, 0x4c, 0x5c, 0x60, 0x55, 0x6b, 0x89, 0x5b, 0xaa, 0xd4, + 0x13, 0xc7, 0xc6, 0x16, 0xf7, 0xcd, 0x77, 0x7f, 0x5d, 0x00, 0x00, 0x05, + 0x00, 0x5f, 0xff, 0xec, 0x05, 0x90, 0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1a, + 0x00, 0x28, 0x00, 0x34, 0x00, 0x38, 0x00, 0x87, 0xb2, 0x37, 0x39, 0x3a, + 0x11, 0x12, 0x39, 0xb0, 0x37, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x14, 0xd0, + 0xb0, 0x37, 0x10, 0xb0, 0x21, 0xd0, 0xb0, 0x2f, 0xd0, 0x00, 0xb0, 0x35, + 0x2f, 0xb0, 0x37, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, + 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x25, 0x2f, + 0x1b, 0xb1, 0x25, 0x0c, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x0a, 0xd0, + 0xb0, 0x0a, 0x2f, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x25, 0x10, 0xb0, 0x1e, 0xd0, + 0xb0, 0x1e, 0x2f, 0xb0, 0x25, 0x10, 0xb1, 0x2c, 0x02, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1e, 0x10, 0xb1, 0x32, 0x02, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x17, 0x14, 0x16, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x35, 0x17, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, + 0x26, 0x22, 0x06, 0x15, 0x05, 0x27, 0x01, 0x17, 0x5f, 0xae, 0x8d, 0x8f, + 0xae, 0xae, 0x8d, 0x8e, 0xaf, 0xc0, 0x45, 0x70, 0x42, 0x42, 0x3a, 0x37, + 0x44, 0x01, 0xf8, 0xb0, 0x8c, 0x8e, 0xaf, 0xac, 0x8f, 0x90, 0xae, 0xc0, + 0x48, 0x36, 0x7a, 0x44, 0x70, 0x44, 0xfd, 0xfe, 0x8d, 0x02, 0xc7, 0x8d, + 0x04, 0x98, 0x86, 0xa7, 0xa5, 0x8d, 0x48, 0x87, 0xa4, 0xa5, 0x8c, 0x06, + 0x3c, 0x49, 0x4a, 0x3e, 0x4a, 0x3c, 0x4a, 0x49, 0x41, 0xfc, 0xd1, 0x87, + 0xa5, 0xa3, 0x8f, 0x48, 0x86, 0xa5, 0xa6, 0x89, 0x04, 0x37, 0x4e, 0x87, + 0x4c, 0x3c, 0x49, 0x49, 0x3f, 0xf5, 0x4c, 0x04, 0x72, 0x4c, 0x00, 0x03, + 0x00, 0x47, 0xff, 0xec, 0x05, 0x28, 0x05, 0xc4, 0x00, 0x1c, 0x00, 0x25, + 0x00, 0x30, 0x00, 0x74, 0xb2, 0x0f, 0x31, 0x32, 0x11, 0x12, 0x39, 0xb0, + 0x0f, 0x10, 0xb0, 0x1e, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x2a, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, + 0x0c, 0x3e, 0x59, 0xb2, 0x10, 0x09, 0x16, 0x11, 0x12, 0x39, 0xb2, 0x12, + 0x1a, 0x09, 0x11, 0x12, 0x39, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x20, 0x09, 0x16, 0x11, 0x12, 0x39, + 0xb2, 0x28, 0x09, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x10, 0xb1, 0x2e, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x13, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x07, 0x07, 0x13, 0x36, 0x35, 0x33, 0x10, 0x07, 0x17, 0x21, + 0x27, 0x06, 0x23, 0x22, 0x24, 0x25, 0x32, 0x37, 0x01, 0x07, 0x06, 0x15, + 0x14, 0x16, 0x03, 0x14, 0x17, 0x37, 0x36, 0x36, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x47, 0x71, 0x97, 0x41, 0x4a, 0xd7, 0xb6, 0xa3, 0xd1, 0xb0, 0x70, + 0xfb, 0x3b, 0xf6, 0x83, 0xda, 0xfe, 0xb8, 0x4b, 0xa1, 0xd1, 0xd8, 0xfe, + 0xfc, 0x01, 0xea, 0x68, 0x5d, 0xfe, 0xe1, 0x15, 0x59, 0x6f, 0x11, 0x58, + 0x4d, 0x3b, 0x2d, 0x4a, 0x3a, 0x3e, 0x4b, 0x01, 0x88, 0x65, 0xac, 0x69, + 0x57, 0x99, 0x53, 0xaa, 0xd5, 0xc2, 0x91, 0xae, 0x85, 0x51, 0xfe, 0xdc, + 0x74, 0x8c, 0xfe, 0xe4, 0xb0, 0xfd, 0x56, 0x6a, 0xe3, 0x05, 0x3a, 0x01, + 0x4c, 0x0f, 0x4c, 0x67, 0x57, 0x6d, 0x03, 0x75, 0x4b, 0x72, 0x33, 0x26, + 0x48, 0x64, 0x4a, 0x50, 0x00, 0x01, 0x00, 0x3f, 0x03, 0xd9, 0x01, 0x13, + 0x06, 0x00, 0x00, 0x04, 0x00, 0x17, 0xb2, 0x01, 0x05, 0x06, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x03, 0x2f, 0xb2, 0x02, 0x05, 0x03, 0x11, 0x12, 0x39, + 0xb0, 0x02, 0x2f, 0x30, 0x31, 0x01, 0x03, 0x23, 0x11, 0x33, 0x01, 0x13, + 0x1d, 0xb7, 0xd4, 0x05, 0x6d, 0xfe, 0x6c, 0x02, 0x27, 0x00, 0x00, 0x01, + 0x00, 0x7c, 0xfe, 0x39, 0x02, 0xa7, 0x06, 0x50, 0x00, 0x11, 0x00, 0x10, + 0xb2, 0x07, 0x12, 0x13, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, + 0x04, 0x2f, 0x30, 0x31, 0x13, 0x34, 0x12, 0x12, 0x37, 0x17, 0x06, 0x02, + 0x11, 0x15, 0x10, 0x12, 0x17, 0x07, 0x26, 0x02, 0x02, 0x27, 0x7c, 0x7a, + 0xee, 0x8b, 0x38, 0x92, 0xa4, 0xa2, 0x94, 0x38, 0x88, 0xeb, 0x7c, 0x04, + 0x02, 0x50, 0xe5, 0x01, 0x9e, 0x01, 0x3f, 0x3e, 0x9c, 0x6c, 0xfe, 0x3c, + 0xfe, 0xd2, 0x1f, 0xfe, 0xd1, 0xfe, 0x3a, 0x70, 0x99, 0x3d, 0x01, 0x35, + 0x01, 0x94, 0xdc, 0x00, 0x00, 0x01, 0x00, 0x28, 0xfe, 0x39, 0x02, 0x61, + 0x06, 0x50, 0x00, 0x11, 0x00, 0x10, 0xb2, 0x08, 0x12, 0x13, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x04, 0x2f, 0x30, 0x31, 0x01, 0x14, + 0x02, 0x02, 0x07, 0x27, 0x36, 0x12, 0x13, 0x35, 0x10, 0x02, 0x27, 0x37, + 0x16, 0x12, 0x12, 0x17, 0x02, 0x61, 0x82, 0xf4, 0x8b, 0x38, 0x8e, 0xa4, + 0x03, 0xa3, 0x92, 0x38, 0x88, 0xf1, 0x85, 0x03, 0x02, 0x39, 0xe2, 0xfe, + 0x5e, 0xfe, 0xc0, 0x3c, 0x99, 0x6b, 0x01, 0xbe, 0x01, 0x22, 0x35, 0x01, + 0x2b, 0x01, 0xc8, 0x72, 0x99, 0x3b, 0xfe, 0xca, 0xfe, 0x64, 0xdd, 0x00, + 0x00, 0x01, 0x00, 0x1b, 0x02, 0x3c, 0x03, 0x93, 0x05, 0xb0, 0x00, 0x0e, + 0x00, 0x20, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0xd0, 0x19, 0xb0, 0x00, 0x2f, 0x18, + 0xb0, 0x09, 0xd0, 0x19, 0xb0, 0x09, 0x2f, 0x18, 0x30, 0x31, 0x01, 0x25, + 0x37, 0x05, 0x03, 0x33, 0x03, 0x25, 0x17, 0x05, 0x13, 0x07, 0x03, 0x03, + 0x27, 0x01, 0x55, 0xfe, 0xc6, 0x3b, 0x01, 0x37, 0x14, 0xc4, 0x14, 0x01, + 0x2f, 0x3b, 0xfe, 0xc0, 0xd2, 0x9f, 0xb6, 0xb4, 0x9f, 0x03, 0xc2, 0x59, + 0xb5, 0x7d, 0x01, 0x5d, 0xfe, 0x9c, 0x7b, 0xb7, 0x59, 0xfe, 0xf6, 0x71, + 0x01, 0x24, 0xfe, 0xe6, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x39, 0x00, 0x92, + 0x04, 0x1f, 0x04, 0xb6, 0x00, 0x0b, 0x00, 0x1b, 0x00, 0xb0, 0x09, 0x2f, + 0xb0, 0x00, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0xd0, 0x30, 0x31, 0x01, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x02, + 0xb6, 0x01, 0x69, 0xfe, 0x97, 0xfe, 0xed, 0xfe, 0x96, 0x01, 0x6a, 0x01, + 0x13, 0x03, 0x2f, 0xfe, 0xfb, 0xfe, 0x68, 0x01, 0x98, 0x01, 0x05, 0x01, + 0x87, 0x00, 0x00, 0x01, 0x00, 0x23, 0xfe, 0x93, 0x01, 0x80, 0x00, 0xf6, + 0x00, 0x09, 0x00, 0x1f, 0xb2, 0x09, 0x0a, 0x0b, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x0a, 0x2f, 0xb1, 0x05, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0x30, 0x31, 0x13, + 0x27, 0x37, 0x36, 0x37, 0x35, 0x33, 0x07, 0x06, 0x06, 0xba, 0x97, 0x24, + 0x43, 0x02, 0xf4, 0x01, 0x01, 0x6e, 0xfe, 0x93, 0x4f, 0x41, 0x7a, 0x79, + 0xe0, 0xc8, 0x6f, 0xe2, 0x00, 0x01, 0x00, 0x6e, 0x01, 0xfb, 0x02, 0xa1, + 0x02, 0xe4, 0x00, 0x03, 0x00, 0x12, 0x00, 0xb0, 0x02, 0x2f, 0xb1, 0x01, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x21, 0x35, 0x21, 0x02, 0xa1, 0xfd, 0xcd, 0x02, 0x33, 0x01, 0xfb, + 0xe9, 0x00, 0x00, 0x01, 0x00, 0x7e, 0xff, 0xf5, 0x01, 0xc5, 0x01, 0x29, + 0x00, 0x0b, 0x00, 0x23, 0xb2, 0x03, 0x0c, 0x0d, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, + 0x59, 0xb1, 0x03, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x7e, 0x5d, 0x46, 0x47, 0x5d, 0x5c, 0x48, 0x47, 0x5c, + 0x8e, 0x45, 0x56, 0x56, 0x45, 0x44, 0x55, 0x55, 0x00, 0x01, 0xff, 0xf3, + 0xff, 0x83, 0x02, 0xe2, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x18, 0x3e, 0x59, 0x30, 0x31, 0x17, 0x23, 0x01, 0x33, 0xca, 0xd7, 0x02, + 0x18, 0xd7, 0x7d, 0x06, 0x2d, 0x00, 0x00, 0x02, 0x00, 0x5f, 0xff, 0xec, + 0x04, 0x37, 0x05, 0xc4, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x48, 0xb2, 0x03, + 0x1b, 0x1c, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb0, 0x10, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, + 0x3e, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x17, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, + 0x02, 0x23, 0x22, 0x02, 0x03, 0x11, 0x10, 0x12, 0x20, 0x12, 0x13, 0x25, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x04, 0x37, 0xfa, 0xf1, 0xee, 0xfc, 0x03, 0xfd, 0x01, 0xdc, 0xfc, + 0x03, 0xfe, 0xdf, 0x63, 0x69, 0x66, 0x61, 0x03, 0x61, 0x6b, 0x6a, 0x5e, + 0x02, 0x02, 0x5a, 0xfe, 0xd2, 0xfe, 0xc0, 0x01, 0x3a, 0x01, 0x25, 0x01, + 0x0c, 0x01, 0x31, 0x01, 0x3c, 0xfe, 0xc7, 0xfe, 0xdb, 0x1a, 0xb5, 0xa5, + 0x9d, 0xa7, 0xfe, 0x9e, 0xb2, 0xad, 0xa6, 0xab, 0x00, 0x01, 0x00, 0xa7, + 0x00, 0x00, 0x03, 0x21, 0x05, 0xb2, 0x00, 0x06, 0x00, 0x3a, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, + 0x59, 0xb2, 0x04, 0x00, 0x05, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, + 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x02, 0x03, 0x05, 0x11, 0x12, 0x39, 0x30, 0x31, 0x21, 0x21, 0x11, 0x05, + 0x35, 0x25, 0x33, 0x03, 0x21, 0xfe, 0xdf, 0xfe, 0xa7, 0x02, 0x5b, 0x1f, + 0x04, 0x5a, 0x6b, 0xeb, 0xd8, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, + 0x04, 0x49, 0x05, 0xc4, 0x00, 0x19, 0x00, 0x5b, 0xb2, 0x11, 0x1a, 0x1b, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, + 0xb1, 0x11, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x00, 0x18, 0x11, 0x12, + 0x39, 0xb2, 0x03, 0x11, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, + 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x0c, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb2, 0x16, 0x11, 0x00, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x21, 0x21, 0x35, 0x01, 0x36, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x14, 0x06, 0x07, 0x01, 0x21, 0x04, 0x49, 0xfc, 0x1a, 0x01, 0xd7, 0x61, + 0x5d, 0x62, 0x5b, 0x62, 0x71, 0xfe, 0xde, 0x7f, 0xe8, 0x93, 0xe1, 0xf9, + 0x70, 0x88, 0xfe, 0xb5, 0x02, 0x72, 0xc6, 0x01, 0xf6, 0x6a, 0x9e, 0x47, + 0x61, 0x6f, 0x87, 0x6e, 0x85, 0xdc, 0x7d, 0xd8, 0xc5, 0x6c, 0xe0, 0x95, + 0xfe, 0xa3, 0x00, 0x01, 0x00, 0x40, 0xff, 0xec, 0x04, 0x33, 0x05, 0xc4, + 0x00, 0x28, 0x00, 0x91, 0xb2, 0x07, 0x29, 0x2a, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0c, + 0x3e, 0x59, 0xb2, 0x01, 0x0f, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x2f, + 0xb4, 0x6f, 0x01, 0x7f, 0x01, 0x02, 0x5d, 0xb4, 0x7f, 0x01, 0x8f, 0x01, + 0x02, 0x71, 0xb4, 0xdf, 0x01, 0xef, 0x01, 0x02, 0x5d, 0xb2, 0xff, 0x01, + 0x01, 0x71, 0xb4, 0x39, 0x01, 0x49, 0x01, 0x02, 0x5d, 0xb0, 0x0f, 0x10, + 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x0a, 0x0f, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb1, 0x27, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x15, + 0x27, 0x01, 0x11, 0x12, 0x39, 0xb2, 0x1f, 0x1b, 0x0f, 0x11, 0x12, 0x39, + 0xb0, 0x1b, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x36, 0x33, 0x32, 0x04, 0x15, + 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x35, + 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, 0x01, 0x89, + 0x9a, 0x6e, 0x6a, 0x69, 0x5c, 0x53, 0x70, 0xfe, 0xdf, 0x7b, 0xdd, 0x85, + 0xe7, 0x01, 0x06, 0x7a, 0x63, 0x7b, 0x79, 0xfe, 0xe5, 0xe9, 0xda, 0xfe, + 0xeb, 0x01, 0x21, 0x7b, 0x5a, 0x67, 0x75, 0xf0, 0x99, 0x03, 0x58, 0x6e, + 0x5b, 0x58, 0x62, 0x5b, 0x49, 0x72, 0xb5, 0x66, 0xdd, 0xc2, 0x64, 0xa8, + 0x2d, 0x2c, 0xb0, 0x78, 0xc2, 0xea, 0xe6, 0xbd, 0x52, 0x68, 0x6d, 0x5a, + 0xda, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x04, 0x5f, 0x05, 0xb0, + 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x4a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x09, + 0x04, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x2f, 0xb1, 0x02, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x01, + 0x10, 0xb0, 0x0b, 0xd0, 0xb2, 0x08, 0x06, 0x0b, 0x11, 0x12, 0x39, 0xb2, + 0x0d, 0x09, 0x04, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x33, 0x15, 0x23, + 0x11, 0x21, 0x11, 0x21, 0x27, 0x01, 0x21, 0x01, 0x21, 0x11, 0x07, 0x03, + 0xba, 0xa5, 0xa5, 0xfe, 0xdf, 0xfd, 0xab, 0x0d, 0x02, 0x5f, 0x01, 0x24, + 0xfd, 0x9d, 0x01, 0x42, 0x13, 0x02, 0x24, 0xe9, 0xfe, 0xc5, 0x01, 0x3b, + 0xb6, 0x03, 0xbf, 0xfc, 0x74, 0x02, 0x02, 0x21, 0x00, 0x01, 0x00, 0x69, + 0xff, 0xec, 0x04, 0x42, 0x05, 0xb0, 0x00, 0x1f, 0x00, 0x6d, 0xb2, 0x16, + 0x20, 0x21, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, + 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, + 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x07, 0x01, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb1, 0x1c, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, 0x07, + 0x1c, 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x13, 0x16, 0x1c, 0x11, + 0x12, 0x39, 0xb2, 0x1f, 0x1c, 0x16, 0x11, 0x12, 0x39, 0x30, 0x31, 0x13, + 0x13, 0x21, 0x15, 0x21, 0x03, 0x36, 0x33, 0x32, 0x12, 0x15, 0x14, 0x06, + 0x06, 0x23, 0x22, 0x26, 0x26, 0x27, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x07, 0x8e, 0x54, 0x03, 0x30, 0xfd, + 0xbd, 0x24, 0x67, 0x74, 0xd0, 0xec, 0x77, 0xde, 0x97, 0x84, 0xe2, 0x83, + 0x04, 0x01, 0x1e, 0x09, 0x6d, 0x58, 0x62, 0x6a, 0x7a, 0x70, 0x67, 0x40, + 0x1c, 0x02, 0xcc, 0x02, 0xe4, 0xf1, 0xfe, 0xc7, 0x37, 0xfe, 0xfe, 0xe8, + 0x8d, 0xdf, 0x7b, 0x6b, 0xc2, 0x7c, 0x5b, 0x65, 0x8d, 0x81, 0x7c, 0x84, + 0x36, 0x1a, 0x00, 0x02, 0x00, 0x64, 0xff, 0xec, 0x04, 0x4f, 0x05, 0xbf, + 0x00, 0x16, 0x00, 0x23, 0x00, 0x5e, 0xb2, 0x17, 0x24, 0x25, 0x11, 0x12, + 0x39, 0xb0, 0x17, 0x10, 0xb0, 0x0e, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x07, 0x00, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb1, + 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x0e, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x15, 0x23, 0x06, 0x06, 0x07, 0x36, 0x33, + 0x32, 0x12, 0x15, 0x14, 0x06, 0x06, 0x23, 0x22, 0x00, 0x11, 0x35, 0x34, + 0x12, 0x24, 0x37, 0x03, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x03, 0x73, 0x1c, 0xc4, 0xef, 0x18, 0x74, 0xb1, + 0xbe, 0xe0, 0x7b, 0xe1, 0x8e, 0xe6, 0xfe, 0xe5, 0xb3, 0x01, 0x4f, 0xdd, + 0xea, 0x46, 0x72, 0x1b, 0x72, 0x67, 0x5d, 0x73, 0x74, 0x05, 0xbf, 0xee, + 0x03, 0xc6, 0xb0, 0x76, 0xfe, 0xf0, 0xde, 0x8e, 0xe6, 0x80, 0x01, 0x40, + 0x01, 0x0b, 0x68, 0xed, 0x01, 0x6b, 0xc7, 0x01, 0xfd, 0x27, 0x49, 0x3c, + 0x58, 0x91, 0xa3, 0x93, 0x75, 0x77, 0x92, 0x00, 0x00, 0x01, 0x00, 0x3d, + 0x00, 0x00, 0x04, 0x41, 0x05, 0xb0, 0x00, 0x06, 0x00, 0x33, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, + 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x03, 0x05, 0x11, 0x12, 0x39, 0x30, + 0x31, 0x01, 0x01, 0x21, 0x01, 0x21, 0x35, 0x21, 0x04, 0x41, 0xfd, 0xcd, + 0xfe, 0xcf, 0x02, 0x34, 0xfd, 0x2c, 0x04, 0x04, 0x05, 0x0e, 0xfa, 0xf2, + 0x04, 0xc6, 0xea, 0x00, 0x00, 0x03, 0x00, 0x5f, 0xff, 0xec, 0x04, 0x37, + 0x05, 0xc4, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x80, 0xb2, 0x14, + 0x2e, 0x2f, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x10, 0xb0, 0x1a, 0xd0, 0xb0, + 0x14, 0x10, 0xb0, 0x26, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, + 0x2f, 0x1b, 0xb1, 0x14, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb2, 0x2b, 0x09, 0x14, + 0x11, 0x12, 0x39, 0xb0, 0x2b, 0x2f, 0xb4, 0x6f, 0x2b, 0x7f, 0x2b, 0x02, + 0x5d, 0xb4, 0xdf, 0x2b, 0xef, 0x2b, 0x02, 0x5d, 0xb1, 0x1a, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x1a, 0x2b, + 0x11, 0x12, 0x39, 0xb2, 0x0e, 0x2b, 0x1a, 0x11, 0x12, 0x39, 0xb0, 0x09, + 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x14, 0x10, 0xb1, 0x26, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x16, 0x16, + 0x15, 0x14, 0x04, 0x20, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x32, 0x36, 0x04, 0x18, 0x6a, 0x5d, 0x6a, 0x7c, 0xfe, 0xf8, + 0xfe, 0x3a, 0xfe, 0xf6, 0x7c, 0x69, 0x5d, 0x69, 0xf8, 0xd5, 0xd4, 0xf9, + 0xfe, 0xfd, 0x6e, 0x5d, 0x5c, 0x6e, 0x6c, 0x60, 0x5e, 0x6b, 0x1e, 0x5a, + 0x52, 0x51, 0x5a, 0x5a, 0xa4, 0x59, 0x04, 0x2d, 0x6a, 0xa4, 0x31, 0x33, + 0xb3, 0x79, 0xc2, 0xe1, 0xe2, 0xc1, 0x79, 0xb4, 0x32, 0x31, 0xa4, 0x6a, + 0xba, 0xdd, 0xdb, 0xfc, 0xbb, 0x5f, 0x72, 0x71, 0x60, 0x5d, 0x72, 0x6e, + 0x02, 0xdc, 0x55, 0x67, 0x64, 0x58, 0x57, 0x6a, 0x6a, 0x00, 0x00, 0x02, + 0x00, 0x56, 0xff, 0xf2, 0x04, 0x2c, 0x05, 0xc4, 0x00, 0x15, 0x00, 0x22, + 0x00, 0x60, 0xb2, 0x16, 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, 0x16, 0x10, + 0xb0, 0x09, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, + 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, + 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, 0xb2, 0x16, 0x09, 0x12, 0x11, 0x12, + 0x39, 0x7c, 0xb0, 0x16, 0x2f, 0x18, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0x10, 0xb1, 0x13, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, + 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x06, 0x23, 0x22, 0x02, 0x35, 0x34, 0x36, 0x36, 0x33, + 0x32, 0x16, 0x12, 0x17, 0x15, 0x10, 0x00, 0x05, 0x07, 0x35, 0x37, 0x24, + 0x03, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x03, 0x07, 0x71, 0x97, 0xc1, 0xe8, 0x7d, 0xe0, 0x8c, 0x90, 0xe0, + 0x7c, 0x01, 0xfe, 0x96, 0xfe, 0xb4, 0x47, 0x40, 0x01, 0x79, 0xa2, 0x46, + 0x65, 0x1a, 0x70, 0x5e, 0x57, 0x70, 0x6d, 0x02, 0x46, 0x6f, 0x01, 0x09, + 0xe1, 0x8f, 0xef, 0x85, 0x90, 0xfe, 0xf2, 0xae, 0x6b, 0xfe, 0x94, 0xfe, + 0x60, 0x0e, 0x01, 0xf1, 0x01, 0x11, 0x01, 0xbf, 0x48, 0x33, 0x77, 0x93, + 0xa2, 0x9f, 0x78, 0x77, 0x99, 0x00, 0xff, 0xff, 0x00, 0x7d, 0xff, 0xf5, + 0x01, 0xc4, 0x04, 0x5c, 0x00, 0x26, 0x00, 0x12, 0xff, 0x00, 0x01, 0x07, + 0x00, 0x12, 0xff, 0xff, 0x03, 0x33, 0x00, 0x06, 0x00, 0xb0, 0x0f, 0x2f, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x39, 0xfe, 0x93, 0x01, 0xb3, 0x04, 0x5c, + 0x00, 0x27, 0x00, 0x12, 0xff, 0xee, 0x03, 0x33, 0x01, 0x06, 0x00, 0x10, + 0x16, 0x00, 0x00, 0x06, 0x00, 0xb0, 0x03, 0x2f, 0x30, 0x31, 0x00, 0x01, + 0x00, 0x36, 0x00, 0x89, 0x03, 0x93, 0x04, 0x4f, 0x00, 0x06, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x14, + 0x3e, 0x59, 0xb0, 0x02, 0xd0, 0xb0, 0x02, 0x2f, 0x30, 0x31, 0x01, 0x05, + 0x11, 0x01, 0x35, 0x01, 0x11, 0x01, 0x59, 0x02, 0x3a, 0xfc, 0xa3, 0x03, + 0x5d, 0x02, 0x6a, 0xc9, 0xfe, 0xe8, 0x01, 0x6d, 0xec, 0x01, 0x6d, 0xfe, + 0xe8, 0x00, 0x00, 0x02, 0x00, 0x88, 0x01, 0x39, 0x04, 0x06, 0x03, 0xd6, + 0x00, 0x03, 0x00, 0x07, 0x00, 0x27, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x03, + 0xd0, 0xb0, 0x03, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, + 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, 0x06, 0xfc, 0x82, 0x03, 0x7e, 0xfc, + 0x82, 0x03, 0x7e, 0x02, 0xea, 0xec, 0xfd, 0x63, 0xec, 0x00, 0x00, 0x01, + 0x00, 0x78, 0x00, 0x88, 0x03, 0xdf, 0x04, 0x4e, 0x00, 0x06, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, + 0x3e, 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x05, 0x2f, 0x30, 0x31, 0x01, 0x25, + 0x11, 0x01, 0x15, 0x01, 0x11, 0x02, 0xbd, 0xfd, 0xbb, 0x03, 0x67, 0xfc, + 0x99, 0x02, 0x6d, 0xcb, 0x01, 0x16, 0xfe, 0x93, 0xeb, 0xfe, 0x92, 0x01, + 0x17, 0x00, 0x00, 0x02, 0x00, 0x2d, 0xff, 0xf4, 0x03, 0xb2, 0x05, 0xc4, + 0x00, 0x18, 0x00, 0x22, 0x00, 0x60, 0xb2, 0x07, 0x23, 0x24, 0x11, 0x12, + 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x1c, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x21, 0x2f, 0x1b, 0xb1, 0x21, 0x0c, 0x3e, 0x59, 0xb1, 0x1b, + 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, + 0xd0, 0xb0, 0x00, 0x2f, 0xb2, 0x03, 0x00, 0x0e, 0x11, 0x12, 0x39, 0xb0, + 0x0e, 0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x0a, 0x0e, 0x00, 0x11, 0x12, 0x39, 0xb2, 0x15, 0x00, + 0x0e, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x34, 0x3e, 0x02, 0x35, 0x34, + 0x23, 0x22, 0x06, 0x07, 0x21, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, + 0x14, 0x06, 0x22, 0x26, 0x01, 0x5b, 0x44, 0xb5, 0x3c, 0x9c, 0x4a, 0x59, + 0x02, 0xfe, 0xde, 0x02, 0xf3, 0xd2, 0xd4, 0xea, 0x4c, 0x5f, 0x51, 0x4c, + 0x0b, 0x04, 0xfe, 0xe3, 0x5b, 0x8e, 0x5b, 0x59, 0x92, 0x59, 0x01, 0xbf, + 0x8c, 0xa6, 0xa1, 0x65, 0x38, 0xa9, 0x5b, 0x50, 0xbf, 0xd8, 0xcd, 0xbb, + 0x55, 0x97, 0x5c, 0x4d, 0x49, 0x62, 0x3d, 0xfe, 0xcd, 0x43, 0x57, 0x57, + 0x43, 0x42, 0x56, 0x56, 0x00, 0x02, 0x00, 0x4b, 0xfe, 0x3b, 0x06, 0xe0, + 0x05, 0x88, 0x00, 0x35, 0x00, 0x41, 0x00, 0x7e, 0xb2, 0x3a, 0x42, 0x43, + 0x11, 0x12, 0x39, 0xb0, 0x3a, 0x10, 0xb0, 0x23, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, + 0x03, 0xd0, 0xb0, 0x08, 0x10, 0xb1, 0x39, 0x07, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x08, 0x39, 0x11, 0x12, 0x39, + 0xb0, 0x08, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x0f, 0x2f, 0xb0, 0x39, 0x10, + 0xb0, 0x16, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x32, 0xd0, 0xb0, 0x32, 0x2f, + 0xb1, 0x1c, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x08, 0x10, 0xb0, 0x2a, 0xd0, 0xb0, 0x2a, 0x2f, 0xb1, 0x23, 0x07, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, + 0xb1, 0x3f, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x02, 0x02, 0x23, 0x22, 0x26, 0x27, 0x06, 0x23, 0x22, + 0x26, 0x37, 0x36, 0x12, 0x36, 0x33, 0x32, 0x17, 0x17, 0x03, 0x06, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x12, 0x00, 0x21, 0x22, 0x04, 0x02, 0x07, 0x02, + 0x00, 0x21, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x20, 0x24, 0x02, + 0x13, 0x12, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x06, 0x16, 0x33, + 0x32, 0x36, 0x37, 0x13, 0x26, 0x23, 0x22, 0x06, 0x06, 0xd5, 0x0b, 0xe7, + 0xc3, 0x56, 0x7d, 0x20, 0x64, 0xa1, 0x92, 0xa0, 0x14, 0x12, 0x83, 0xc8, + 0x74, 0x8f, 0x65, 0x3f, 0x33, 0x0a, 0x37, 0x3c, 0x5c, 0x7c, 0x06, 0x11, + 0xfe, 0xc5, 0xfe, 0xcb, 0xc1, 0xfe, 0xd2, 0xae, 0x0b, 0x10, 0x01, 0x3c, + 0x01, 0x3b, 0x53, 0xb6, 0x42, 0x26, 0x3d, 0xcf, 0x69, 0xfe, 0xf8, 0xfe, + 0x8c, 0xb7, 0x0c, 0x0c, 0xe4, 0x01, 0x89, 0xf7, 0xfb, 0x01, 0x6a, 0xb4, + 0xfc, 0x08, 0x0b, 0x44, 0x4c, 0x31, 0x58, 0x1d, 0x2a, 0x27, 0x29, 0x73, + 0x7f, 0x02, 0x18, 0xff, 0x00, 0xfe, 0xd3, 0x4a, 0x45, 0x8c, 0xf6, 0xca, + 0xa5, 0x01, 0x01, 0x8a, 0x42, 0x2b, 0xfd, 0xbe, 0x4f, 0x54, 0xd7, 0xae, + 0x01, 0x5d, 0x01, 0x77, 0xc4, 0xfe, 0x97, 0xe9, 0xfe, 0x9e, 0xfe, 0x7d, + 0x25, 0x1f, 0x9a, 0x28, 0x31, 0xd5, 0x01, 0x9f, 0x01, 0x20, 0x01, 0x14, + 0x01, 0xb6, 0xef, 0xd7, 0xfe, 0x70, 0xfe, 0x8d, 0x84, 0x89, 0x56, 0x51, + 0x01, 0xd9, 0x0d, 0xc4, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, + 0x05, 0xb0, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x47, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, + 0xb2, 0x09, 0x04, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x2f, 0xb1, 0x00, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, + 0x04, 0x02, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x21, 0x03, 0x21, 0x01, + 0x21, 0x01, 0x21, 0x01, 0x21, 0x03, 0x03, 0xb8, 0xfd, 0xf2, 0x64, 0xfe, + 0xc1, 0x02, 0x1e, 0x01, 0x16, 0x02, 0x21, 0xfe, 0xc1, 0xfd, 0xde, 0x01, + 0x6c, 0xb7, 0x01, 0x2c, 0xfe, 0xd4, 0x05, 0xb0, 0xfa, 0x50, 0x02, 0x1f, + 0x02, 0x21, 0x00, 0x03, 0x00, 0x82, 0x00, 0x00, 0x04, 0xbc, 0x05, 0xb0, + 0x00, 0x0e, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x96, 0xb2, 0x18, 0x1f, 0x20, + 0x11, 0x12, 0x39, 0xb0, 0x18, 0x10, 0xb0, 0x02, 0xd0, 0xb0, 0x18, 0x10, + 0xb0, 0x11, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, + 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x17, 0x00, 0x01, 0x11, 0x12, + 0x39, 0xb0, 0x17, 0x2f, 0xb4, 0xdf, 0x17, 0xef, 0x17, 0x02, 0x5d, 0xb4, + 0x7f, 0x17, 0x8f, 0x17, 0x02, 0x71, 0xb2, 0x1f, 0x17, 0x01, 0x72, 0xb2, + 0xff, 0x17, 0x01, 0x71, 0xb4, 0x0f, 0x17, 0x1f, 0x17, 0x02, 0x71, 0xb4, + 0x6f, 0x17, 0x7f, 0x17, 0x02, 0x5d, 0xb2, 0x8f, 0x17, 0x01, 0x72, 0xb1, + 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x08, 0x0f, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, + 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x33, 0x11, 0x21, 0x20, 0x04, 0x15, 0x14, 0x06, 0x07, 0x16, + 0x16, 0x15, 0x14, 0x04, 0x07, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, + 0x27, 0x25, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x82, 0x01, 0xfe, + 0x01, 0x09, 0x01, 0x12, 0x6e, 0x62, 0x70, 0x81, 0xfe, 0xf4, 0xf8, 0xfe, + 0xf6, 0x01, 0x01, 0x6a, 0x77, 0xcf, 0xfe, 0xed, 0xde, 0xe3, 0x73, 0x7c, + 0xd2, 0x05, 0xb0, 0xcb, 0xc4, 0x6b, 0xa3, 0x26, 0x1c, 0xaa, 0x7b, 0xd2, + 0xd8, 0x02, 0x02, 0x7a, 0xfe, 0x77, 0x65, 0x59, 0xc8, 0x03, 0xd4, 0x04, + 0xb1, 0x63, 0x57, 0x00, 0x00, 0x01, 0x00, 0x56, 0xff, 0xec, 0x04, 0xfb, + 0x05, 0xc4, 0x00, 0x1c, 0x00, 0x47, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x0b, 0x10, + 0xb0, 0x0f, 0xd0, 0xb0, 0x0b, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x19, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, + 0xb0, 0x1c, 0xd0, 0x30, 0x31, 0x01, 0x06, 0x00, 0x21, 0x20, 0x00, 0x11, + 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x00, 0x17, 0x21, 0x26, 0x26, 0x23, + 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0xf9, + 0x11, 0xfe, 0xc7, 0xff, 0x00, 0xfe, 0xe8, 0xfe, 0xbf, 0x94, 0x01, 0x13, + 0xb6, 0xfc, 0x01, 0x34, 0x18, 0xfe, 0xd4, 0x0b, 0x87, 0x8a, 0x96, 0x95, + 0x02, 0x8f, 0x9a, 0x8b, 0x89, 0x0a, 0x01, 0xe5, 0xeb, 0xfe, 0xf2, 0x01, + 0x79, 0x01, 0x49, 0x59, 0xd2, 0x01, 0x40, 0xab, 0xfe, 0xf2, 0xf4, 0x8d, + 0x7f, 0xd7, 0xe2, 0x6e, 0xec, 0xda, 0x7f, 0x85, 0x00, 0x02, 0x00, 0x82, + 0x00, 0x00, 0x04, 0xdb, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x3b, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x0c, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0d, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, + 0x11, 0x21, 0x32, 0x04, 0x12, 0x15, 0x15, 0x14, 0x02, 0x04, 0x07, 0x03, + 0x11, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x82, 0x01, 0xc0, + 0xc0, 0x01, 0x2f, 0xaa, 0xa7, 0xfe, 0xd0, 0xbf, 0x97, 0x91, 0xb0, 0xba, + 0x02, 0xb8, 0xb1, 0x05, 0xb0, 0xad, 0xfe, 0xc1, 0xcb, 0x43, 0xcb, 0xfe, + 0xc4, 0xae, 0x01, 0x04, 0xbd, 0xfc, 0x34, 0xe6, 0xd6, 0x4d, 0xde, 0xe5, + 0x00, 0x01, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x05, 0xb0, 0x00, 0x0b, + 0x00, 0x58, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x0b, 0x04, 0x06, 0x11, 0x12, 0x39, + 0xb0, 0x0b, 0x2f, 0xb4, 0x3a, 0x0b, 0x4a, 0x0b, 0x02, 0x5d, 0xb1, 0x00, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, + 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x15, 0x21, + 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0xee, 0xfd, 0xc0, 0x02, 0xa4, + 0xfc, 0x30, 0x03, 0xce, 0xfd, 0x5e, 0x02, 0x40, 0x02, 0x77, 0xfe, 0x7a, + 0xf1, 0x05, 0xb0, 0xf3, 0xfe, 0xa5, 0x00, 0x01, 0x00, 0x82, 0x00, 0x00, + 0x04, 0x36, 0x05, 0xb0, 0x00, 0x09, 0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb2, + 0x09, 0x02, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x2f, 0xb2, 0x9f, 0x09, + 0x01, 0x5d, 0xb4, 0x6c, 0x09, 0x7c, 0x09, 0x02, 0x5d, 0xb2, 0x49, 0x09, + 0x01, 0x5d, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0xee, 0xfd, 0xc0, 0xfe, 0xd4, 0x03, + 0xb4, 0xfd, 0x78, 0x02, 0x40, 0x02, 0x53, 0xfd, 0xad, 0x05, 0xb0, 0xf3, + 0xfe, 0x88, 0x00, 0x01, 0x00, 0x5e, 0xff, 0xec, 0x05, 0x02, 0x05, 0xc4, + 0x00, 0x20, 0x00, 0x73, 0xb2, 0x0c, 0x21, 0x22, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, + 0x3e, 0x59, 0xb2, 0x1f, 0x0c, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x2f, + 0xb4, 0xdf, 0x1f, 0xef, 0x1f, 0x02, 0x5d, 0xb2, 0x5f, 0x1f, 0x01, 0x5d, + 0xb2, 0x1f, 0x1f, 0x01, 0x71, 0xb2, 0x10, 0x1f, 0x0c, 0x11, 0x12, 0x39, + 0xb0, 0x0c, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1f, 0x10, 0xb1, 0x1e, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, + 0x06, 0x04, 0x23, 0x22, 0x24, 0x02, 0x27, 0x35, 0x34, 0x12, 0x24, 0x33, + 0x20, 0x04, 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x37, 0x35, 0x21, 0x35, 0x21, 0x05, 0x02, 0x51, 0xfe, + 0xd8, 0xb4, 0xbd, 0xfe, 0xe3, 0x9b, 0x02, 0x93, 0x01, 0x15, 0xba, 0x01, + 0x03, 0x01, 0x24, 0x1b, 0xfe, 0xdc, 0x14, 0x89, 0x78, 0x99, 0xa0, 0x01, + 0xae, 0xa8, 0xa9, 0x48, 0xfe, 0xef, 0x02, 0x3d, 0xb8, 0x61, 0x6b, 0xa5, + 0x01, 0x3a, 0xd4, 0x63, 0xda, 0x01, 0x3f, 0xa9, 0xf7, 0xec, 0x7d, 0x74, + 0xe6, 0xe3, 0x5d, 0xe5, 0xea, 0x48, 0xfb, 0xdd, 0x00, 0x01, 0x00, 0x82, + 0x00, 0x00, 0x05, 0x23, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x4d, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, + 0x0c, 0x3e, 0x59, 0xb2, 0x09, 0x0a, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x09, + 0x2f, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x05, 0x23, 0xfe, 0xd4, 0xfd, 0xb7, 0xfe, 0xd4, 0x01, + 0x2c, 0x02, 0x49, 0x01, 0x2c, 0x02, 0x70, 0xfd, 0x90, 0x05, 0xb0, 0xfd, + 0xb2, 0x02, 0x4e, 0x00, 0x00, 0x01, 0x00, 0x95, 0x00, 0x00, 0x01, 0xc1, + 0x05, 0xb0, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0x30, 0x31, 0x21, + 0x21, 0x11, 0x21, 0x01, 0xc1, 0xfe, 0xd4, 0x01, 0x2c, 0x05, 0xb0, 0x00, + 0x00, 0x01, 0x00, 0x28, 0xff, 0xec, 0x03, 0xf9, 0x05, 0xb0, 0x00, 0x10, + 0x00, 0x30, 0xb2, 0x06, 0x11, 0x12, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, + 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x21, 0x11, 0x14, 0x06, 0x06, 0x23, 0x22, 0x24, 0x35, + 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x02, 0xcd, 0x01, 0x2c, 0x7b, + 0xe0, 0x8d, 0xe7, 0xfe, 0xfe, 0x01, 0x2e, 0x5a, 0x61, 0x56, 0x66, 0x05, + 0xb0, 0xfc, 0x10, 0x8b, 0xd5, 0x74, 0xeb, 0xd7, 0x6b, 0x66, 0x76, 0x6d, + 0x00, 0x01, 0x00, 0x82, 0x00, 0x00, 0x05, 0x25, 0x05, 0xb0, 0x00, 0x0c, + 0x00, 0x4c, 0xb2, 0x00, 0x0d, 0x0e, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, + 0x3e, 0x59, 0xb2, 0x00, 0x04, 0x02, 0x11, 0x12, 0x39, 0xb2, 0x06, 0x04, + 0x02, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x07, 0x11, 0x21, 0x11, 0x21, + 0x11, 0x37, 0x01, 0x21, 0x01, 0x01, 0x21, 0x02, 0x4a, 0x9c, 0xfe, 0xd4, + 0x01, 0x2c, 0x84, 0x01, 0x73, 0x01, 0x71, 0xfd, 0xfb, 0x02, 0x14, 0xfe, + 0x9b, 0x02, 0x48, 0xa8, 0xfe, 0x60, 0x05, 0xb0, 0xfd, 0x6c, 0xb5, 0x01, + 0xdf, 0xfd, 0x79, 0xfc, 0xd7, 0x00, 0x00, 0x01, 0x00, 0x82, 0x00, 0x00, + 0x04, 0x2b, 0x05, 0xb0, 0x00, 0x05, 0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb1, + 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x25, 0x21, 0x15, 0x21, 0x11, 0x21, 0x01, 0xae, 0x02, 0x7d, 0xfc, + 0x57, 0x01, 0x2c, 0xf1, 0xf1, 0x05, 0xb0, 0x00, 0x00, 0x01, 0x00, 0x82, + 0x00, 0x00, 0x06, 0x7e, 0x05, 0xb0, 0x00, 0x0e, 0x00, 0x59, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x00, 0x04, 0x11, 0x12, 0x39, 0xb2, + 0x07, 0x00, 0x04, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x00, 0x04, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x09, 0x02, 0x21, 0x11, 0x21, 0x11, 0x13, 0x01, 0x23, + 0x01, 0x13, 0x11, 0x21, 0x11, 0x02, 0x0a, 0x01, 0x76, 0x01, 0x74, 0x01, + 0x8a, 0xfe, 0xd3, 0x1e, 0xfe, 0x77, 0xce, 0xfe, 0x78, 0x1e, 0xfe, 0xd4, + 0x05, 0xb0, 0xfb, 0xe0, 0x04, 0x20, 0xfa, 0x50, 0x01, 0x8e, 0x02, 0xaf, + 0xfb, 0xc3, 0x04, 0x3c, 0xfd, 0x52, 0xfe, 0x72, 0x05, 0xb0, 0x00, 0x01, + 0x00, 0x82, 0x00, 0x00, 0x05, 0x22, 0x05, 0xb0, 0x00, 0x09, 0x00, 0x4c, + 0xb2, 0x01, 0x0a, 0x0b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, + 0xb2, 0x02, 0x05, 0x00, 0x11, 0x12, 0x39, 0xb2, 0x07, 0x05, 0x00, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x21, 0x21, 0x01, 0x11, 0x21, 0x11, 0x21, 0x01, + 0x11, 0x21, 0x05, 0x22, 0xfe, 0xd4, 0xfd, 0xb8, 0xfe, 0xd4, 0x01, 0x2c, + 0x02, 0x49, 0x01, 0x2b, 0x03, 0xbe, 0xfc, 0x42, 0x05, 0xb0, 0xfc, 0x40, + 0x03, 0xc0, 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, 0x05, 0xc4, + 0x00, 0x10, 0x00, 0x1e, 0x00, 0x48, 0xb2, 0x04, 0x1f, 0x20, 0x11, 0x12, + 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x14, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x0c, + 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x04, 0x23, 0x22, + 0x24, 0x02, 0x27, 0x35, 0x34, 0x12, 0x24, 0x20, 0x04, 0x12, 0x15, 0x25, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x05, 0x2e, 0x98, 0xfe, 0xe5, 0xb7, 0xb5, 0xfe, 0xe4, 0x9c, 0x01, + 0x9b, 0x01, 0x1b, 0x01, 0x6c, 0x01, 0x1b, 0x9b, 0xfe, 0xd0, 0xa4, 0x98, + 0x97, 0xa4, 0x01, 0xa4, 0x9a, 0x97, 0xa2, 0x01, 0x02, 0xb7, 0xd7, 0xfe, + 0xbc, 0xb0, 0xae, 0x01, 0x43, 0xd2, 0x48, 0xd7, 0x01, 0x47, 0xaf, 0xaf, + 0xfe, 0xb9, 0xd6, 0x01, 0xe5, 0xee, 0xeb, 0xe3, 0x47, 0xdf, 0xf6, 0xed, + 0xe3, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, 0x00, 0x04, 0xdd, 0x05, 0xb0, + 0x00, 0x0b, 0x00, 0x14, 0x00, 0x4f, 0xb2, 0x0b, 0x15, 0x16, 0x11, 0x12, + 0x39, 0xb0, 0x0b, 0x10, 0xb0, 0x0d, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb2, 0x0c, + 0x03, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x2f, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, + 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, 0x16, 0x16, 0x15, 0x14, 0x04, + 0x21, 0x25, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x21, 0x01, 0xae, + 0xfe, 0xd4, 0x02, 0x38, 0xa4, 0xf9, 0x86, 0xfe, 0xdb, 0xfe, 0xfd, 0xfe, + 0xf9, 0x01, 0x0c, 0x77, 0x7d, 0x7e, 0x6f, 0xfe, 0xed, 0x02, 0x01, 0xfd, + 0xff, 0x05, 0xb0, 0x78, 0xdd, 0x8d, 0xd6, 0xf7, 0xf3, 0x70, 0x68, 0x6b, + 0x84, 0x02, 0x00, 0x02, 0x00, 0x54, 0xfe, 0xfc, 0x05, 0x2c, 0x05, 0xc4, + 0x00, 0x14, 0x00, 0x22, 0x00, 0x48, 0xb2, 0x08, 0x23, 0x24, 0x11, 0x12, + 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x1f, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x10, + 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x07, 0x17, 0x07, + 0x25, 0x06, 0x23, 0x22, 0x24, 0x02, 0x27, 0x35, 0x34, 0x12, 0x24, 0x20, + 0x04, 0x12, 0x15, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x05, 0x2c, 0x84, 0x75, 0xf2, 0xbf, 0xfe, + 0xca, 0x35, 0x39, 0xb5, 0xfe, 0xe4, 0x9c, 0x01, 0x9b, 0x01, 0x1b, 0x01, + 0x6c, 0x01, 0x1b, 0x9b, 0xfe, 0xd0, 0xa4, 0x98, 0x97, 0xa4, 0x01, 0xa4, + 0x9a, 0x97, 0xa2, 0x01, 0x02, 0xb7, 0xcc, 0xfe, 0xd3, 0x5b, 0xbe, 0xa9, + 0xf9, 0x09, 0xae, 0x01, 0x43, 0xd2, 0x48, 0xd7, 0x01, 0x47, 0xaf, 0xaf, + 0xfe, 0xb9, 0xd6, 0x01, 0xe5, 0xee, 0xeb, 0xe3, 0x47, 0xdf, 0xf6, 0xed, + 0xe3, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, 0x00, 0x04, 0xf0, 0x05, 0xb0, + 0x00, 0x0e, 0x00, 0x17, 0x00, 0x63, 0xb2, 0x05, 0x18, 0x19, 0x11, 0x12, + 0x39, 0xb0, 0x05, 0x10, 0xb0, 0x16, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb2, + 0x10, 0x04, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x2f, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0b, 0x00, + 0x04, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, + 0x21, 0x11, 0x21, 0x20, 0x04, 0x15, 0x14, 0x06, 0x07, 0x01, 0x15, 0x21, + 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x02, 0x9d, 0xef, + 0xfe, 0xd4, 0x02, 0x1d, 0x01, 0x02, 0x01, 0x18, 0x81, 0x83, 0x01, 0x3b, + 0xfe, 0xbe, 0xfe, 0x00, 0xf2, 0x71, 0x7c, 0x75, 0x79, 0xf1, 0x02, 0x15, + 0xfd, 0xeb, 0x05, 0xb0, 0xe6, 0xd2, 0x95, 0xc7, 0x3b, 0xfd, 0xad, 0x0e, + 0x03, 0x08, 0x73, 0x65, 0x67, 0x76, 0x00, 0x01, 0x00, 0x45, 0xff, 0xec, + 0x04, 0xa2, 0x05, 0xc4, 0x00, 0x27, 0x00, 0x66, 0xb2, 0x12, 0x28, 0x29, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, + 0xb1, 0x0a, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, + 0x1b, 0xb1, 0x1e, 0x0c, 0x3e, 0x59, 0xb2, 0x03, 0x1e, 0x0a, 0x11, 0x12, + 0x39, 0xb2, 0x0f, 0x0a, 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, + 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x03, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x23, 0x1e, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x1e, 0x10, + 0xb1, 0x25, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x34, 0x26, 0x24, 0x27, 0x26, 0x35, 0x34, 0x36, 0x36, + 0x33, 0x32, 0x16, 0x16, 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x17, 0x04, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x26, + 0x35, 0x21, 0x14, 0x21, 0x32, 0x36, 0x03, 0x75, 0x78, 0xfe, 0xc8, 0x5b, + 0xf8, 0x85, 0xf9, 0x9b, 0x9c, 0xf4, 0x87, 0xfe, 0xd4, 0x7e, 0x72, 0x6e, + 0x7a, 0x8f, 0x8b, 0x01, 0x00, 0xea, 0xfe, 0xe2, 0xf2, 0xa8, 0xfe, 0xec, + 0x91, 0x01, 0x2d, 0x01, 0x20, 0x6b, 0x78, 0x01, 0x7e, 0x55, 0x5b, 0x65, + 0x31, 0x86, 0xe3, 0x76, 0xb9, 0x68, 0x71, 0xce, 0x83, 0x64, 0x6f, 0x5d, + 0x4c, 0x47, 0x60, 0x2a, 0x4d, 0xe4, 0xaa, 0xbd, 0xd7, 0x7b, 0xd6, 0x8d, + 0xf1, 0x57, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x04, 0xca, 0x05, 0xb0, + 0x00, 0x07, 0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, + 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x00, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, + 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, + 0xca, 0xfe, 0x42, 0xfe, 0xd4, 0xfe, 0x48, 0x04, 0xa2, 0x04, 0xbd, 0xfb, + 0x43, 0x04, 0xbd, 0xf3, 0x00, 0x01, 0x00, 0x74, 0xff, 0xec, 0x04, 0xd0, + 0x05, 0xb0, 0x00, 0x10, 0x00, 0x3d, 0xb2, 0x04, 0x11, 0x12, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x00, 0x21, + 0x22, 0x00, 0x27, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x13, 0x11, + 0x04, 0xd0, 0xfe, 0xd5, 0xfe, 0xfd, 0xff, 0xfe, 0xd4, 0x03, 0x01, 0x2c, + 0x89, 0x79, 0xfd, 0x04, 0x05, 0xb0, 0xfc, 0x41, 0xef, 0xfe, 0xea, 0x01, + 0x0e, 0xec, 0x03, 0xca, 0xfc, 0x3f, 0x8f, 0x83, 0x01, 0x0a, 0x03, 0xc9, + 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x05, 0x34, 0x05, 0xb0, 0x00, 0x06, + 0x00, 0x38, 0xb2, 0x00, 0x07, 0x08, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, + 0x59, 0xb2, 0x00, 0x01, 0x03, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x01, + 0x21, 0x01, 0x21, 0x01, 0x21, 0x02, 0x9c, 0x01, 0x4a, 0x01, 0x4e, 0xfe, + 0x05, 0xfe, 0xc7, 0xfe, 0x07, 0x01, 0x4d, 0x01, 0x69, 0x04, 0x47, 0xfa, + 0x50, 0x05, 0xb0, 0x00, 0x00, 0x01, 0x00, 0x23, 0x00, 0x00, 0x06, 0xdf, + 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x60, 0xb2, 0x05, 0x0d, 0x0e, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, + 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, + 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, + 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x01, 0x03, 0x11, + 0x12, 0x39, 0xb2, 0x05, 0x01, 0x03, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x01, + 0x03, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x13, 0x21, 0x01, 0x21, 0x03, + 0x03, 0x21, 0x01, 0x21, 0x13, 0x13, 0x33, 0x04, 0xf0, 0xc4, 0x01, 0x2b, + 0xfe, 0xbd, 0xfe, 0xd2, 0xed, 0xed, 0xfe, 0xd2, 0xfe, 0xbd, 0x01, 0x2b, + 0xc5, 0xf0, 0xfe, 0x01, 0xa4, 0x04, 0x0c, 0xfa, 0x50, 0x03, 0xce, 0xfc, + 0x32, 0x05, 0xb0, 0xfb, 0xf6, 0x04, 0x0a, 0x00, 0x00, 0x01, 0x00, 0x16, + 0x00, 0x00, 0x05, 0x00, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x53, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, + 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x01, 0x04, 0x11, 0x12, 0x39, 0xb2, 0x06, + 0x01, 0x04, 0x11, 0x12, 0x39, 0xb2, 0x03, 0x00, 0x06, 0x11, 0x12, 0x39, + 0xb2, 0x09, 0x06, 0x00, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x01, 0x21, + 0x01, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, 0x01, 0x21, 0x02, 0x8b, 0x01, + 0x11, 0x01, 0x59, 0xfe, 0x58, 0x01, 0xb3, 0xfe, 0xa3, 0xfe, 0xe8, 0xfe, + 0xe8, 0xfe, 0xa3, 0x01, 0xb3, 0xfe, 0x58, 0x01, 0x59, 0x03, 0xba, 0x01, + 0xf6, 0xfd, 0x2e, 0xfd, 0x22, 0x01, 0xfe, 0xfe, 0x02, 0x02, 0xde, 0x02, + 0xd2, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x04, 0xef, 0x05, 0xb0, + 0x00, 0x08, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, + 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, + 0x2f, 0x1b, 0xb1, 0x07, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x01, 0x04, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x01, 0x21, 0x01, 0x11, 0x21, 0x11, + 0x01, 0x21, 0x02, 0x78, 0x01, 0x2f, 0x01, 0x48, 0xfe, 0x22, 0xfe, 0xcf, + 0xfe, 0x22, 0x01, 0x49, 0x03, 0x20, 0x02, 0x90, 0xfc, 0x60, 0xfd, 0xf0, + 0x02, 0x10, 0x03, 0xa0, 0x00, 0x01, 0x00, 0x49, 0x00, 0x00, 0x04, 0x9e, + 0x05, 0xb0, 0x00, 0x09, 0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x00, + 0x02, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x05, 0x07, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x25, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x35, + 0x21, 0x15, 0x01, 0xc0, 0x02, 0xde, 0xfb, 0xab, 0x02, 0xd0, 0xfd, 0x31, + 0x04, 0x44, 0xf1, 0xf1, 0xb0, 0x04, 0x0d, 0xf3, 0xac, 0x00, 0x00, 0x01, + 0x00, 0x78, 0xfe, 0xad, 0x02, 0x28, 0x06, 0x9e, 0x00, 0x07, 0x00, 0x24, + 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x07, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x03, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x23, 0x11, 0x33, 0x15, 0x21, 0x11, 0x21, 0x02, 0x28, 0x8e, 0x8e, + 0xfe, 0x50, 0x01, 0xb0, 0x05, 0xbf, 0xf9, 0xcd, 0xdf, 0x07, 0xf1, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xff, 0x83, 0x03, 0x87, 0x05, 0xb0, 0x00, 0x03, + 0x00, 0x13, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0x30, 0x31, 0x11, 0x21, 0x01, + 0x21, 0x01, 0x27, 0x02, 0x60, 0xfe, 0xd8, 0x05, 0xb0, 0xf9, 0xd3, 0x00, + 0x00, 0x01, 0x00, 0x0d, 0xfe, 0xad, 0x01, 0xbd, 0x06, 0x9e, 0x00, 0x07, + 0x00, 0x27, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x01, 0x2f, 0xb0, 0x02, 0x10, + 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x01, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x21, 0x11, 0x21, 0x35, 0x33, 0x11, + 0x23, 0x0d, 0x01, 0xb0, 0xfe, 0x50, 0x8f, 0x8f, 0x06, 0x9e, 0xf8, 0x0f, + 0xdf, 0x06, 0x33, 0x00, 0x00, 0x01, 0x00, 0x2c, 0x02, 0xd9, 0x03, 0x54, + 0x05, 0xb0, 0x00, 0x06, 0x00, 0x27, 0xb2, 0x00, 0x07, 0x08, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0xd0, 0xb2, 0x01, 0x07, 0x03, 0x11, 0x12, + 0x39, 0xb0, 0x01, 0x2f, 0xb0, 0x05, 0xd0, 0x30, 0x31, 0x01, 0x03, 0x23, + 0x01, 0x33, 0x01, 0x23, 0x01, 0xc0, 0xae, 0xe6, 0x01, 0x2b, 0xd2, 0x01, + 0x2b, 0xe5, 0x04, 0xa2, 0xfe, 0x37, 0x02, 0xd7, 0xfd, 0x29, 0x00, 0x01, + 0x00, 0x01, 0xff, 0x1e, 0x03, 0x90, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1a, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, + 0x30, 0x31, 0x05, 0x21, 0x35, 0x21, 0x03, 0x90, 0xfc, 0x71, 0x03, 0x8f, + 0xe2, 0xe2, 0x00, 0x01, 0x00, 0x34, 0x04, 0xca, 0x02, 0x35, 0x06, 0x00, + 0x00, 0x03, 0x00, 0x16, 0x00, 0xb0, 0x01, 0x2f, 0xb2, 0x0f, 0x01, 0x01, + 0x5d, 0xb0, 0x02, 0xd0, 0xb0, 0x02, 0x2f, 0xb2, 0x0f, 0x02, 0x01, 0x5d, + 0x30, 0x31, 0x01, 0x23, 0x01, 0x21, 0x02, 0x35, 0xed, 0xfe, 0xec, 0x01, + 0x3b, 0x04, 0xca, 0x01, 0x36, 0x00, 0x00, 0x02, 0x00, 0x44, 0xff, 0xec, + 0x04, 0x06, 0x04, 0x4e, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x79, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, + 0x3e, 0x59, 0xb2, 0x02, 0x04, 0x17, 0x11, 0x12, 0x39, 0xb2, 0x0b, 0x17, + 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0b, 0x2f, 0xb2, 0x8f, 0x0b, 0x01, 0x5d, + 0xb0, 0x17, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x12, 0x0b, 0x17, 0x11, 0x12, 0x39, 0x7c, 0xb0, + 0x12, 0x2f, 0x18, 0xb0, 0x04, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x23, 0x08, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, + 0x26, 0x27, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x33, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x11, 0x16, 0x17, 0x15, 0x25, 0x32, 0x36, 0x37, 0x35, 0x23, + 0x22, 0x07, 0x07, 0x14, 0x16, 0x02, 0xe2, 0x14, 0x09, 0x69, 0xa8, 0x9f, + 0xd1, 0xff, 0xf1, 0x85, 0x4d, 0x53, 0x49, 0x53, 0xfe, 0xdf, 0x74, 0xd4, + 0x84, 0xc8, 0xeb, 0x01, 0x2a, 0xfd, 0xed, 0x40, 0x6c, 0x1a, 0x6c, 0xd9, + 0x0e, 0x01, 0x4c, 0x27, 0x3a, 0x75, 0xb8, 0x8c, 0xac, 0xb8, 0x01, 0x3e, + 0x4b, 0x5a, 0x46, 0x3d, 0x5e, 0xa0, 0x5b, 0xc9, 0xb6, 0xfe, 0x2b, 0x9a, + 0x4f, 0x11, 0xc9, 0x39, 0x30, 0xba, 0x96, 0x11, 0x36, 0x46, 0x00, 0x02, + 0x00, 0x6f, 0xff, 0xec, 0x04, 0x3e, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x1b, + 0x00, 0x66, 0xb2, 0x13, 0x1c, 0x1d, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x10, + 0xb0, 0x0b, 0xd0, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb2, 0x05, + 0x0c, 0x06, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x0c, 0x06, 0x11, 0x12, 0x39, + 0xb0, 0x0c, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x02, 0x23, + 0x22, 0x27, 0x07, 0x21, 0x11, 0x21, 0x11, 0x36, 0x33, 0x32, 0x12, 0x11, + 0x25, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, + 0x04, 0x3e, 0xde, 0xc7, 0xb0, 0x69, 0x0d, 0xfe, 0xfc, 0x01, 0x21, 0x64, + 0xa3, 0xc6, 0xe1, 0xfe, 0xdf, 0x68, 0x67, 0x8a, 0x34, 0x35, 0x8b, 0x8c, + 0x2c, 0x15, 0x02, 0x13, 0xfe, 0xfc, 0xfe, 0xdd, 0x87, 0x73, 0x06, 0x00, + 0xfd, 0xd9, 0x75, 0xfe, 0xdd, 0xfe, 0xf8, 0x05, 0xa4, 0x97, 0x71, 0xfe, + 0x55, 0x72, 0x8a, 0x42, 0x00, 0x01, 0x00, 0x42, 0xff, 0xec, 0x03, 0xf6, + 0x04, 0x4e, 0x00, 0x1c, 0x00, 0x4d, 0xb2, 0x16, 0x1d, 0x1e, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x08, 0x0f, 0x11, 0x12, 0x39, 0xb2, + 0x13, 0x0f, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x10, 0xb1, 0x16, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, + 0x32, 0x36, 0x37, 0x21, 0x0e, 0x02, 0x23, 0x22, 0x00, 0x11, 0x35, 0x34, + 0x00, 0x33, 0x32, 0x16, 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x15, 0x14, 0x16, 0x02, 0x31, 0x50, 0x64, 0x02, 0x01, 0x0f, 0x01, 0x76, + 0xcd, 0x7c, 0xe8, 0xfe, 0xf4, 0x01, 0x0a, 0xe8, 0xcb, 0xf5, 0x02, 0xfe, + 0xf1, 0x02, 0x64, 0x52, 0x65, 0x67, 0x66, 0xd5, 0x58, 0x49, 0x6e, 0xb7, + 0x65, 0x01, 0x27, 0x01, 0x04, 0x13, 0xfa, 0x01, 0x2a, 0xe7, 0xc0, 0x54, + 0x69, 0x93, 0xa5, 0x1e, 0xa7, 0x92, 0x00, 0x02, 0x00, 0x42, 0xff, 0xec, + 0x04, 0x11, 0x06, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x63, 0xb2, 0x17, + 0x19, 0x1a, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x10, 0xb0, 0x04, 0xd0, 0x00, + 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, + 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, + 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x05, 0x03, 0x08, 0x11, 0x12, + 0x39, 0xb2, 0x0a, 0x03, 0x08, 0x11, 0x12, 0x39, 0xb1, 0x12, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, + 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x13, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x21, 0x11, 0x21, 0x27, + 0x06, 0x23, 0x22, 0x02, 0x25, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, + 0x23, 0x22, 0x42, 0xe3, 0xc5, 0x9e, 0x67, 0x01, 0x22, 0xfe, 0xfb, 0x0e, + 0x6c, 0xaa, 0xbf, 0xe7, 0x01, 0x21, 0x6a, 0x65, 0x86, 0x37, 0x36, 0x85, + 0xd1, 0x02, 0x25, 0xfd, 0x01, 0x2c, 0x76, 0x02, 0x28, 0xfa, 0x00, 0x73, + 0x87, 0x01, 0x2d, 0xf7, 0x98, 0xa2, 0x71, 0x01, 0xab, 0x71, 0x00, 0x02, + 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x04, 0x4e, 0x00, 0x15, 0x00, 0x1d, + 0x00, 0x76, 0xb2, 0x16, 0x1e, 0x1f, 0x11, 0x12, 0x39, 0xb0, 0x16, 0x10, + 0xb0, 0x08, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x1a, 0x08, 0x00, 0x11, 0x12, + 0x39, 0xb0, 0x1a, 0x2f, 0xb4, 0x1f, 0x1a, 0x2f, 0x1a, 0x02, 0x71, 0xb2, + 0x8f, 0x1a, 0x01, 0x5d, 0xb2, 0x5f, 0x1a, 0x01, 0x71, 0xb1, 0x0c, 0x08, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, + 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x12, 0x00, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb1, 0x16, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x05, 0x22, 0x00, 0x35, 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x12, 0x11, + 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x06, 0x03, 0x22, + 0x06, 0x07, 0x21, 0x35, 0x26, 0x26, 0x02, 0x61, 0xee, 0xfe, 0xd5, 0x7e, + 0xe7, 0x94, 0xde, 0xff, 0xfd, 0x4f, 0x0e, 0x8d, 0x6c, 0xa7, 0x5e, 0x8e, + 0x41, 0xde, 0xa8, 0x56, 0x6b, 0x0f, 0x01, 0x92, 0x02, 0x64, 0x14, 0x01, + 0x24, 0xf3, 0x1c, 0xa3, 0x01, 0x01, 0x8b, 0xfe, 0xe8, 0xfe, 0xff, 0x76, + 0x6a, 0x80, 0x79, 0x9f, 0x5c, 0x67, 0x03, 0x78, 0x74, 0x6c, 0x17, 0x60, + 0x69, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x02, 0xde, 0x06, 0x15, + 0x00, 0x14, 0x00, 0x65, 0xb2, 0x07, 0x15, 0x16, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x1a, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, + 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x01, 0x09, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0d, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, + 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x13, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, + 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, + 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0xbe, 0xa1, 0xa1, 0xd1, 0xbc, 0x3c, + 0x57, 0x03, 0x24, 0x34, 0xa3, 0xd7, 0xd7, 0x03, 0x66, 0xd4, 0x5c, 0xb6, + 0xc9, 0x14, 0xe0, 0x09, 0x99, 0x57, 0xd4, 0xfc, 0x9a, 0x00, 0x00, 0x02, + 0x00, 0x45, 0xfe, 0x56, 0x04, 0x22, 0x04, 0x4e, 0x00, 0x1b, 0x00, 0x26, + 0x00, 0x83, 0xb2, 0x24, 0x27, 0x28, 0x11, 0x12, 0x39, 0xb0, 0x24, 0x10, + 0xb0, 0x0c, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, + 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, + 0x2f, 0x1b, 0xb1, 0x18, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0e, 0x3e, 0x59, 0xb2, 0x05, 0x06, 0x18, + 0x11, 0x12, 0x39, 0xb2, 0x10, 0x0c, 0x18, 0x11, 0x12, 0x39, 0xb1, 0x12, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x16, + 0x06, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x18, 0x10, 0xb1, 0x1f, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, + 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x13, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x21, 0x11, 0x14, 0x06, + 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, + 0x06, 0x23, 0x22, 0x02, 0x35, 0x05, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, + 0x26, 0x23, 0x22, 0x06, 0x45, 0xed, 0xc9, 0xb2, 0x63, 0x0c, 0x01, 0x06, + 0x81, 0xea, 0x9d, 0x77, 0xe2, 0x3a, 0x80, 0x6c, 0x9a, 0x73, 0x80, 0x64, + 0xa3, 0xc3, 0xf1, 0x01, 0x21, 0x76, 0x67, 0x84, 0x39, 0x3a, 0x81, 0x68, + 0x77, 0x02, 0x25, 0xf9, 0x01, 0x30, 0x7a, 0x66, 0xfb, 0xea, 0x8e, 0xd2, + 0x6e, 0x5f, 0x4b, 0xb0, 0x79, 0x7b, 0x71, 0x3a, 0x71, 0x01, 0x31, 0xfc, + 0x09, 0x93, 0xa7, 0x63, 0x01, 0xc7, 0x63, 0xaa, 0x00, 0x01, 0x00, 0x68, + 0x00, 0x00, 0x04, 0x0f, 0x06, 0x00, 0x00, 0x10, 0x00, 0x4a, 0xb2, 0x0a, + 0x11, 0x12, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, + 0xb2, 0x00, 0x02, 0x05, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x10, 0xb1, 0x0a, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x36, 0x33, 0x20, 0x13, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, + 0x07, 0x11, 0x21, 0x11, 0x21, 0x01, 0x89, 0x73, 0xae, 0x01, 0x60, 0x05, + 0xfe, 0xdf, 0x50, 0x5d, 0x7f, 0x39, 0xfe, 0xdf, 0x01, 0x21, 0x03, 0xc4, + 0x8a, 0xfe, 0x67, 0xfd, 0x4b, 0x02, 0xad, 0x5d, 0x59, 0x62, 0xfc, 0xff, + 0x06, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x01, 0xb1, 0x05, 0xe7, + 0x00, 0x03, 0x00, 0x0e, 0x00, 0x3f, 0xb2, 0x07, 0x0f, 0x10, 0x11, 0x12, + 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x02, + 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x0d, 0x2f, 0xb1, 0x06, 0x06, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, + 0x21, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, + 0x01, 0xa0, 0xfe, 0xde, 0x01, 0x22, 0xfe, 0xcd, 0x57, 0x4b, 0x4a, 0x58, + 0x59, 0x92, 0x59, 0x04, 0x3a, 0x01, 0x18, 0x41, 0x54, 0x54, 0x41, 0x42, + 0x54, 0x54, 0x00, 0x02, 0xff, 0xa1, 0xfe, 0x4b, 0x01, 0xac, 0x05, 0xe7, + 0x00, 0x0c, 0x00, 0x16, 0x00, 0x4b, 0xb2, 0x03, 0x17, 0x18, 0x11, 0x12, + 0x39, 0xb0, 0x03, 0x10, 0xb0, 0x14, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb1, 0x09, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, + 0x10, 0xb0, 0x14, 0xd0, 0xb0, 0x14, 0x2f, 0xb1, 0x0f, 0x06, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, + 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x11, 0x03, 0x34, + 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x01, 0xa1, 0xbe, 0xb3, + 0x4b, 0x44, 0x34, 0x27, 0x83, 0x17, 0x57, 0x96, 0x57, 0x59, 0x92, 0x59, + 0x04, 0x3a, 0xfb, 0x8b, 0xb3, 0xc7, 0x11, 0xe5, 0x09, 0x8b, 0x04, 0x77, + 0x01, 0x18, 0x41, 0x54, 0x54, 0x41, 0x42, 0x54, 0x54, 0x00, 0x00, 0x01, + 0x00, 0x6f, 0x00, 0x00, 0x04, 0x5a, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x45, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x1a, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, + 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, + 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x08, 0x02, 0x11, 0x12, 0x39, + 0xb2, 0x06, 0x08, 0x02, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x07, 0x11, + 0x21, 0x11, 0x21, 0x11, 0x37, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, 0xf8, + 0x68, 0xfe, 0xdf, 0x01, 0x21, 0x38, 0x01, 0x15, 0x01, 0x5b, 0xfe, 0x79, + 0x01, 0xa9, 0xfe, 0xb4, 0x01, 0xb2, 0x68, 0xfe, 0xb6, 0x06, 0x00, 0xfc, + 0xad, 0x48, 0x01, 0x45, 0xfe, 0x3d, 0xfd, 0x89, 0x00, 0x01, 0x00, 0x7e, + 0x00, 0x00, 0x01, 0xa0, 0x06, 0x00, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x1a, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, + 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x01, 0xa0, 0xfe, 0xde, 0x01, + 0x22, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6f, 0x00, 0x00, 0x06, 0x7e, + 0x04, 0x4e, 0x00, 0x1d, 0x00, 0x78, 0xb2, 0x04, 0x1e, 0x1f, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, + 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, + 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, + 0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x07, 0x0b, + 0x11, 0x12, 0x39, 0xb2, 0x05, 0x07, 0x0b, 0x11, 0x12, 0x39, 0xb0, 0x07, + 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x18, 0xd0, 0x30, 0x31, 0x01, 0x17, 0x36, 0x33, 0x32, 0x17, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, + 0x07, 0x13, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x11, + 0x01, 0x7e, 0x09, 0x73, 0xc4, 0xd1, 0x4e, 0x72, 0xd3, 0xb0, 0xac, 0xfe, + 0xde, 0x48, 0x5b, 0x82, 0x32, 0x01, 0xfe, 0xdf, 0x4a, 0x59, 0x7b, 0x37, + 0xfe, 0xdf, 0x04, 0x3a, 0x79, 0x8d, 0xa5, 0xa5, 0xcd, 0xce, 0xfd, 0x4d, + 0x02, 0xb2, 0x5c, 0x55, 0x7c, 0xfd, 0x19, 0x02, 0xb1, 0x5e, 0x54, 0x66, + 0xfd, 0x03, 0x04, 0x3a, 0x00, 0x01, 0x00, 0x69, 0x00, 0x00, 0x04, 0x0f, + 0x04, 0x4e, 0x00, 0x11, 0x00, 0x54, 0xb2, 0x0c, 0x12, 0x13, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, + 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, + 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, + 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x00, 0x07, 0x11, 0x12, + 0x39, 0xb0, 0x03, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x11, + 0x01, 0x79, 0x09, 0x74, 0xc3, 0xac, 0xa8, 0x02, 0xfe, 0xdf, 0x50, 0x5d, + 0x7a, 0x3d, 0xfe, 0xdf, 0x04, 0x3a, 0x7d, 0x91, 0xca, 0xc9, 0xfd, 0x45, + 0x02, 0xb4, 0x5c, 0x53, 0x68, 0xfd, 0x05, 0x04, 0x3a, 0x00, 0x00, 0x02, + 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, 0x04, 0x4e, 0x00, 0x0d, 0x00, 0x19, + 0x00, 0x45, 0xb2, 0x11, 0x1a, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, + 0xb0, 0x04, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, + 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x17, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, + 0x34, 0x36, 0x36, 0x33, 0x32, 0x00, 0x17, 0x17, 0x14, 0x00, 0x20, 0x00, + 0x11, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x42, 0x7c, 0xe9, 0x9a, 0xdb, 0x01, 0x15, 0x10, 0x02, 0xfe, 0xea, + 0xfe, 0x2c, 0xfe, 0xe9, 0x01, 0x21, 0x74, 0x6c, 0x69, 0x76, 0x76, 0x6b, + 0x6a, 0x74, 0x02, 0x27, 0xa1, 0xfc, 0x8a, 0xfe, 0xf4, 0xe6, 0x4a, 0xf9, + 0xfe, 0xd3, 0x01, 0x2c, 0x01, 0x02, 0x08, 0x9a, 0xa3, 0xa1, 0xb1, 0x97, + 0xa6, 0xa5, 0x00, 0x02, 0x00, 0x6f, 0xfe, 0x60, 0x04, 0x3d, 0x04, 0x4e, + 0x00, 0x0f, 0x00, 0x19, 0x00, 0x70, 0xb2, 0x13, 0x1a, 0x1b, 0x11, 0x12, + 0x39, 0xb0, 0x13, 0x10, 0xb0, 0x04, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, + 0xb2, 0x05, 0x08, 0x03, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x08, 0x03, 0x11, + 0x12, 0x39, 0xb0, 0x0c, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, + 0x02, 0x23, 0x22, 0x27, 0x11, 0x21, 0x11, 0x21, 0x17, 0x36, 0x33, 0x32, + 0x12, 0x11, 0x25, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, + 0x04, 0x3d, 0xe3, 0xc1, 0xa4, 0x65, 0xfe, 0xdf, 0x01, 0x0c, 0x0a, 0x69, + 0xa9, 0xc8, 0xde, 0xfe, 0xdf, 0x6b, 0x66, 0x88, 0x33, 0x35, 0x88, 0xcf, + 0x02, 0x13, 0xfa, 0xfe, 0xd3, 0x72, 0xfe, 0x02, 0x05, 0xda, 0x6a, 0x7e, + 0xfe, 0xd8, 0xfe, 0xfc, 0x06, 0x97, 0xa4, 0x68, 0xfe, 0x45, 0x6b, 0x00, + 0x00, 0x02, 0x00, 0x42, 0xfe, 0x60, 0x04, 0x11, 0x04, 0x4e, 0x00, 0x0e, + 0x00, 0x19, 0x00, 0x6d, 0xb2, 0x17, 0x1a, 0x1b, 0x11, 0x12, 0x39, 0xb0, + 0x17, 0x10, 0xb0, 0x0b, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, + 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x05, + 0x06, 0x0c, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x06, 0x0c, 0x11, 0x12, 0x39, + 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x03, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, + 0x33, 0x11, 0x21, 0x11, 0x06, 0x23, 0x22, 0x02, 0x25, 0x14, 0x16, 0x33, + 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x06, 0x42, 0xe3, 0xc6, 0xae, 0x67, + 0x13, 0xfe, 0xfe, 0xde, 0x64, 0xa2, 0xc1, 0xe6, 0x01, 0x21, 0x6d, 0x63, + 0x85, 0x37, 0x36, 0x84, 0x64, 0x6e, 0x02, 0x27, 0xff, 0x01, 0x28, 0x85, + 0x71, 0xfa, 0x26, 0x01, 0xfd, 0x71, 0x01, 0x2c, 0xfa, 0x9b, 0xa2, 0x6a, + 0x01, 0xbf, 0x66, 0xa2, 0x00, 0x01, 0x00, 0x6f, 0x00, 0x00, 0x02, 0xd3, + 0x04, 0x4e, 0x00, 0x0d, 0x00, 0x47, 0xb2, 0x04, 0x0e, 0x0f, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, + 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x02, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x0b, 0x05, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, + 0x11, 0x21, 0x17, 0x36, 0x33, 0x32, 0x17, 0x02, 0xcf, 0x3b, 0x2d, 0xa4, + 0x33, 0xfe, 0xdf, 0x01, 0x11, 0x08, 0x57, 0x9a, 0x30, 0x2a, 0x03, 0x2b, + 0x08, 0x6f, 0xfd, 0x3c, 0x04, 0x3a, 0x81, 0x95, 0x0d, 0x00, 0x00, 0x01, + 0x00, 0x38, 0xff, 0xec, 0x03, 0xd2, 0x04, 0x4e, 0x00, 0x25, 0x00, 0x5d, + 0xb2, 0x1b, 0x26, 0x27, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0c, 0x3e, 0x59, 0xb2, 0x02, + 0x1b, 0x08, 0x11, 0x12, 0x39, 0xb2, 0x0b, 0x08, 0x1b, 0x11, 0x12, 0x39, + 0xb0, 0x08, 0x10, 0xb1, 0x0f, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x15, 0xd0, 0xb2, 0x1f, 0x08, + 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x1b, 0x10, 0xb1, 0x23, 0x09, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x26, + 0x27, 0x24, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x21, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x26, 0x35, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x02, + 0xb9, 0x69, 0x74, 0xfe, 0x7e, 0xef, 0xc1, 0xce, 0xf7, 0xfe, 0xdf, 0x50, + 0x55, 0x49, 0x50, 0x5b, 0xd8, 0x4a, 0xe5, 0xfe, 0xc9, 0x88, 0xd3, 0x78, + 0x01, 0x12, 0x04, 0x6a, 0x59, 0x53, 0x55, 0x01, 0x2b, 0x35, 0x3d, 0x18, + 0x51, 0xf7, 0x90, 0xc1, 0xc2, 0x9b, 0x3e, 0x51, 0x42, 0x33, 0x30, 0x3b, + 0x2b, 0x1b, 0x54, 0xcf, 0x94, 0xb7, 0x61, 0xa9, 0x62, 0x4d, 0x52, 0x3f, + 0x00, 0x01, 0x00, 0x0a, 0xff, 0xec, 0x02, 0x8d, 0x05, 0x44, 0x00, 0x14, + 0x00, 0x54, 0xb2, 0x00, 0x15, 0x16, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, + 0xb0, 0x13, 0x10, 0xb0, 0x01, 0xd0, 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, + 0xb0, 0x01, 0x10, 0xb1, 0x04, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x10, 0xd0, + 0x30, 0x31, 0x01, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, + 0x37, 0x15, 0x06, 0x23, 0x20, 0x03, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, + 0xc9, 0xb9, 0xb9, 0x2e, 0x41, 0x30, 0x25, 0x55, 0x5a, 0xfe, 0xd0, 0x06, + 0x9e, 0x9e, 0x05, 0x44, 0xfe, 0xf6, 0xd4, 0xfd, 0xe4, 0x3c, 0x34, 0x07, + 0xdb, 0x1a, 0x01, 0x33, 0x02, 0x47, 0xd4, 0x01, 0x0a, 0x00, 0x00, 0x01, + 0x00, 0x68, 0xff, 0xec, 0x04, 0x0f, 0x04, 0x3a, 0x00, 0x10, 0x00, 0x54, + 0xb2, 0x0a, 0x11, 0x12, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, + 0xb2, 0x00, 0x0d, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x10, 0xb1, 0x0a, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x25, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x21, 0x11, 0x14, 0x33, 0x32, + 0x37, 0x11, 0x21, 0x11, 0x21, 0x02, 0xf7, 0x6b, 0xbd, 0xae, 0xb7, 0x02, + 0x01, 0x21, 0x9a, 0x93, 0x37, 0x01, 0x22, 0xfe, 0xf0, 0x6e, 0x82, 0xc8, + 0xc1, 0x02, 0xc5, 0xfd, 0x45, 0xa9, 0x66, 0x02, 0xfe, 0xfb, 0xc6, 0x00, + 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x03, 0xfb, 0x04, 0x3a, 0x00, 0x06, + 0x00, 0x38, 0xb2, 0x00, 0x07, 0x08, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, + 0x59, 0xb2, 0x00, 0x05, 0x03, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x13, + 0x21, 0x01, 0x21, 0x01, 0x21, 0x02, 0x04, 0xc9, 0x01, 0x2e, 0xfe, 0x93, + 0xfe, 0xec, 0xfe, 0x93, 0x01, 0x2e, 0x01, 0x61, 0x02, 0xd9, 0xfb, 0xc6, + 0x04, 0x3a, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x05, 0xc1, 0x04, 0x3a, + 0x00, 0x0c, 0x00, 0x60, 0xb2, 0x05, 0x0d, 0x0e, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, + 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, + 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x0b, 0x03, 0x11, 0x12, 0x39, + 0xb2, 0x05, 0x0b, 0x03, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x0b, 0x03, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x01, 0x13, 0x21, 0x01, 0x23, 0x03, 0x03, 0x23, + 0x01, 0x21, 0x13, 0x13, 0x33, 0x04, 0x1c, 0x8e, 0x01, 0x17, 0xfe, 0xec, + 0xf2, 0xcd, 0xcd, 0xf1, 0xfe, 0xec, 0x01, 0x17, 0x8d, 0xc6, 0xd1, 0x01, + 0x89, 0x02, 0xb1, 0xfb, 0xc6, 0x02, 0xa9, 0xfd, 0x57, 0x04, 0x3a, 0xfd, + 0x50, 0x02, 0xb0, 0x00, 0x00, 0x01, 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, + 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb2, + 0x00, 0x0a, 0x04, 0x11, 0x12, 0x39, 0xb2, 0x06, 0x0a, 0x04, 0x11, 0x12, + 0x39, 0xb2, 0x03, 0x00, 0x06, 0x11, 0x12, 0x39, 0xb2, 0x09, 0x06, 0x00, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x13, 0x21, 0x01, 0x01, 0x21, 0x03, + 0x03, 0x21, 0x01, 0x01, 0x21, 0x02, 0x0b, 0xb6, 0x01, 0x35, 0xfe, 0xcc, + 0x01, 0x41, 0xfe, 0xca, 0xc1, 0xc0, 0xfe, 0xc9, 0x01, 0x41, 0xfe, 0xcd, + 0x01, 0x36, 0x02, 0xf7, 0x01, 0x43, 0xfd, 0xee, 0xfd, 0xd8, 0x01, 0x54, + 0xfe, 0xac, 0x02, 0x28, 0x02, 0x12, 0x00, 0x01, 0x00, 0x03, 0xfe, 0x4b, + 0x04, 0x01, 0x04, 0x3a, 0x00, 0x10, 0x00, 0x44, 0xb2, 0x00, 0x11, 0x12, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, + 0xb1, 0x01, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, + 0x1b, 0xb1, 0x0f, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, + 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, 0xb2, 0x00, 0x0f, 0x06, 0x11, + 0x12, 0x39, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x13, 0x21, 0x01, 0x07, 0x06, 0x23, 0x22, + 0x27, 0x35, 0x17, 0x32, 0x36, 0x37, 0x37, 0x01, 0x21, 0x02, 0x03, 0xc8, + 0x01, 0x36, 0xfe, 0x4d, 0x18, 0x61, 0xdf, 0x3f, 0x41, 0x2c, 0x52, 0x51, + 0x17, 0x22, 0xfe, 0x85, 0x01, 0x37, 0x01, 0x99, 0x02, 0xa1, 0xfb, 0x1e, + 0x39, 0xd4, 0x13, 0xdb, 0x01, 0x32, 0x3a, 0x59, 0x04, 0x3d, 0x00, 0x01, + 0x00, 0x4a, 0x00, 0x00, 0x03, 0xcc, 0x04, 0x3a, 0x00, 0x09, 0x00, 0x46, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x00, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x07, + 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x09, 0x05, 0x07, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, 0x21, + 0x15, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0xbb, 0x02, 0x11, + 0xfc, 0x7e, 0x01, 0xfd, 0xfe, 0x12, 0x03, 0x63, 0xe9, 0xe9, 0xb0, 0x02, + 0xa0, 0xea, 0xab, 0x00, 0x00, 0x01, 0x00, 0x30, 0xfe, 0x98, 0x02, 0x82, + 0x06, 0x3d, 0x00, 0x18, 0x00, 0x2d, 0xb2, 0x13, 0x19, 0x1a, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x2f, 0xb2, 0x06, 0x0c, 0x00, + 0x11, 0x12, 0x39, 0xb0, 0x06, 0x2f, 0xb1, 0x05, 0x09, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x13, 0x05, 0x06, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x01, 0x24, 0x11, 0x35, 0x34, 0x23, 0x35, 0x32, 0x37, + 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x15, 0x14, 0x07, 0x16, + 0x15, 0x15, 0x16, 0x17, 0x02, 0x4a, 0xfe, 0x98, 0xb2, 0xae, 0x04, 0xb4, + 0xb4, 0x38, 0x4c, 0x4e, 0x02, 0xb3, 0xb3, 0x05, 0x97, 0xfe, 0x98, 0x65, + 0x01, 0x6c, 0xc7, 0xd3, 0xcf, 0xc7, 0xd4, 0xb9, 0xe4, 0x33, 0xa1, 0x1c, + 0x8b, 0x7b, 0xd2, 0xe2, 0x5b, 0x5c, 0xe3, 0xd4, 0xea, 0x34, 0x00, 0x01, + 0x00, 0xad, 0xfe, 0xf2, 0x01, 0x5c, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x18, 0x3e, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x33, 0x01, + 0x5c, 0xaf, 0xaf, 0xfe, 0xf2, 0x06, 0xbe, 0x00, 0x00, 0x01, 0x00, 0x22, + 0xfe, 0x98, 0x02, 0x74, 0x06, 0x3d, 0x00, 0x17, 0x00, 0x2d, 0xb2, 0x05, + 0x18, 0x19, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x17, 0x2f, + 0xb2, 0x11, 0x0b, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, 0x12, + 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, + 0x12, 0x11, 0x11, 0x12, 0x39, 0x30, 0x31, 0x17, 0x36, 0x37, 0x35, 0x34, + 0x37, 0x26, 0x35, 0x35, 0x26, 0x27, 0x37, 0x16, 0x16, 0x17, 0x15, 0x16, + 0x33, 0x15, 0x22, 0x15, 0x15, 0x02, 0x05, 0x22, 0x98, 0x04, 0xb7, 0xb7, + 0x04, 0x98, 0x38, 0xb3, 0xb4, 0x01, 0x04, 0xae, 0xb2, 0x08, 0xfe, 0xa0, + 0xc6, 0x36, 0xec, 0xd4, 0xe2, 0x58, 0x58, 0xe7, 0xd1, 0xe9, 0x39, 0xa1, + 0x32, 0xe3, 0xb8, 0xd7, 0xc7, 0xcf, 0xd1, 0xd9, 0xfe, 0xa2, 0x63, 0x00, + 0x00, 0x01, 0x00, 0x6a, 0x01, 0x77, 0x04, 0xc5, 0x03, 0x3b, 0x00, 0x15, + 0x00, 0x33, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x12, 0xd0, 0xb0, 0x12, 0x2f, + 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x0e, 0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x0e, 0x10, + 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x04, 0xc5, 0xba, 0x93, 0x4a, 0x7f, 0xa6, 0x46, 0x3a, + 0x48, 0xd7, 0xb5, 0x96, 0x4e, 0x80, 0xa3, 0x43, 0x3b, 0x4b, 0x03, 0x19, + 0xba, 0xe8, 0x39, 0x9f, 0x64, 0x4e, 0x02, 0xba, 0xe2, 0x3c, 0x9b, 0x6a, + 0x4c, 0x00, 0x00, 0x02, 0x00, 0x80, 0xfe, 0x8f, 0x01, 0xc4, 0x04, 0x4d, + 0x00, 0x03, 0x00, 0x0c, 0x00, 0x32, 0xb2, 0x06, 0x0d, 0x0e, 0x11, 0x12, + 0x39, 0xb0, 0x06, 0x10, 0xb0, 0x00, 0xdc, 0x00, 0xb0, 0x02, 0x2f, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x14, 0x3e, 0x59, + 0xb1, 0x06, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x01, 0xd0, 0xb0, 0x01, 0x2f, 0x30, 0x31, 0x13, 0x33, 0x13, 0x21, + 0x01, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0xaa, 0xf1, 0x21, + 0xfe, 0xcd, 0x01, 0x3b, 0x5c, 0x8c, 0x5c, 0x59, 0x92, 0x59, 0x02, 0x7f, + 0xfc, 0x10, 0x05, 0x25, 0x43, 0x56, 0x56, 0x86, 0x56, 0x56, 0x00, 0x01, + 0x00, 0x63, 0xff, 0x0b, 0x04, 0x18, 0x05, 0x26, 0x00, 0x21, 0x00, 0x54, + 0xb2, 0x00, 0x22, 0x23, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x07, + 0xd0, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x0a, 0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x14, 0x10, 0xb0, 0x11, + 0xd0, 0xb0, 0x14, 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x14, 0x10, 0xb1, 0x1b, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x25, 0x32, 0x36, 0x37, 0x21, 0x06, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, + 0x02, 0x35, 0x35, 0x34, 0x12, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x17, + 0x21, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x02, 0x52, + 0x50, 0x64, 0x02, 0x01, 0x10, 0x02, 0xc1, 0x9b, 0xc8, 0xbb, 0xd4, 0xd2, + 0xbd, 0xc8, 0xa3, 0xb9, 0x02, 0xfe, 0xf0, 0x02, 0x64, 0x51, 0x66, 0x66, + 0x01, 0x67, 0xd5, 0x58, 0x49, 0x91, 0xd3, 0x1d, 0xea, 0xe9, 0x1e, 0x01, + 0x20, 0xe2, 0x16, 0xda, 0x01, 0x22, 0x20, 0xe0, 0xe1, 0x1d, 0xde, 0xa3, + 0x56, 0x67, 0x95, 0xa0, 0x21, 0xa8, 0x91, 0x00, 0x00, 0x01, 0x00, 0x63, + 0x00, 0x00, 0x04, 0x89, 0x05, 0xc3, 0x00, 0x1f, 0x00, 0x74, 0xb2, 0x1a, + 0x20, 0x21, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, + 0x2f, 0x1b, 0xb1, 0x12, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x1d, 0x12, 0x05, + 0x11, 0x12, 0x39, 0xb0, 0x1d, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x03, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0xd0, + 0xb0, 0x08, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x0c, 0xd0, + 0xb0, 0x1d, 0x10, 0xb0, 0x0e, 0xd0, 0xb2, 0x16, 0x12, 0x1d, 0x11, 0x12, + 0x39, 0xb0, 0x12, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x14, 0x07, 0x21, 0x15, + 0x21, 0x35, 0x33, 0x36, 0x35, 0x27, 0x23, 0x35, 0x33, 0x27, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x17, + 0x21, 0x15, 0x02, 0x34, 0x06, 0x3e, 0x02, 0x8d, 0xfb, 0xdd, 0x5c, 0x48, + 0x05, 0xa2, 0x9a, 0x07, 0xf7, 0xcf, 0xd4, 0xf2, 0xfe, 0xe1, 0x57, 0x51, + 0x42, 0x57, 0x09, 0x01, 0x35, 0x02, 0x40, 0x8b, 0x7b, 0x49, 0xf1, 0xf1, + 0x12, 0xa1, 0x9c, 0xec, 0xe3, 0xca, 0xea, 0xe1, 0xc0, 0x55, 0x5a, 0x62, + 0x60, 0xe3, 0xec, 0x00, 0x00, 0x02, 0x00, 0x51, 0xff, 0xe5, 0x05, 0x43, + 0x04, 0xf1, 0x00, 0x1b, 0x00, 0x2b, 0x00, 0x3b, 0xb2, 0x02, 0x2c, 0x2d, + 0x11, 0x12, 0x39, 0xb0, 0x02, 0x10, 0xb0, 0x20, 0xd0, 0x00, 0xb0, 0x10, + 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, + 0x3e, 0x59, 0xb1, 0x20, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x28, 0x08, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, 0x23, 0x22, 0x27, + 0x07, 0x27, 0x37, 0x26, 0x35, 0x34, 0x37, 0x27, 0x37, 0x17, 0x36, 0x33, + 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x15, 0x14, 0x07, 0x17, 0x07, 0x01, + 0x14, 0x16, 0x16, 0x33, 0x32, 0x36, 0x36, 0x35, 0x34, 0x26, 0x26, 0x23, + 0x22, 0x06, 0x06, 0x04, 0x31, 0x9f, 0xca, 0xcb, 0x9e, 0x81, 0x8d, 0x87, + 0x64, 0x6d, 0x90, 0x8d, 0x8e, 0x9b, 0xc1, 0xc2, 0x9b, 0x90, 0x8e, 0x94, + 0x6b, 0x62, 0x8b, 0x8e, 0xfc, 0x79, 0x6c, 0xbf, 0x6f, 0x6e, 0xbf, 0x6c, + 0x6c, 0xbe, 0x6f, 0x70, 0xbe, 0x6c, 0x6b, 0x7f, 0x7e, 0x84, 0x90, 0x89, + 0x9c, 0xc5, 0xcc, 0xa1, 0x93, 0x90, 0x91, 0x73, 0x75, 0x94, 0x91, 0x97, + 0x9f, 0xca, 0xc1, 0x9c, 0x8d, 0x91, 0x02, 0x7b, 0x76, 0xcb, 0x75, 0x75, + 0xcb, 0x76, 0x77, 0xc9, 0x74, 0x74, 0xc9, 0x00, 0x00, 0x01, 0x00, 0x0a, + 0x00, 0x00, 0x04, 0x3f, 0x05, 0xb0, 0x00, 0x16, 0x00, 0x71, 0xb2, 0x00, + 0x17, 0x18, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, + 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x0b, 0x01, + 0x11, 0x12, 0x39, 0xb2, 0x07, 0x01, 0x0b, 0x11, 0x12, 0x39, 0xb0, 0x07, + 0x2f, 0xb0, 0x03, 0xd0, 0xb0, 0x03, 0x2f, 0xb1, 0x05, 0x07, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x09, + 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, + 0xd0, 0xb0, 0x07, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x05, 0x10, 0xb0, 0x11, + 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x15, + 0xd0, 0x30, 0x31, 0x01, 0x13, 0x21, 0x01, 0x33, 0x15, 0x21, 0x15, 0x21, + 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x33, + 0x01, 0x21, 0x02, 0x26, 0xe0, 0x01, 0x39, 0xfe, 0xbe, 0xda, 0xfe, 0xe0, + 0x01, 0x20, 0xfe, 0xe0, 0xfe, 0xd4, 0xfe, 0xce, 0x01, 0x32, 0xfe, 0xce, + 0xf4, 0xfe, 0xbd, 0x01, 0x3b, 0x03, 0x7c, 0x02, 0x34, 0xfd, 0x36, 0xaf, + 0x73, 0xae, 0xfe, 0xea, 0x01, 0x16, 0xae, 0x73, 0xaf, 0x02, 0xca, 0x00, + 0x00, 0x02, 0x00, 0x80, 0xfe, 0xf2, 0x01, 0x84, 0x05, 0xb0, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x18, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb2, 0x05, 0x01, + 0x03, 0x2b, 0x30, 0x31, 0x13, 0x11, 0x21, 0x11, 0x11, 0x21, 0x11, 0x21, + 0x80, 0x01, 0x04, 0xfe, 0xfc, 0x01, 0x04, 0xfe, 0xf2, 0x03, 0x1b, 0xfc, + 0xe5, 0x03, 0xc8, 0x02, 0xf6, 0x00, 0x00, 0x02, 0x00, 0x5c, 0xfe, 0x3c, + 0x04, 0x9c, 0x05, 0xc4, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x86, 0xb2, 0x1e, + 0x3a, 0x3b, 0x11, 0x12, 0x39, 0xb0, 0x1e, 0x10, 0xb0, 0x39, 0xd0, 0x00, + 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, + 0x1e, 0x18, 0x3e, 0x59, 0xb2, 0x34, 0x07, 0x1e, 0x11, 0x12, 0x39, 0xb0, + 0x34, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x02, 0x13, 0x34, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, + 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x0b, 0x13, 0x0e, 0x11, 0x12, 0x39, 0xb2, 0x2e, 0x1e, 0x07, 0x11, + 0x12, 0x39, 0xb0, 0x2e, 0x10, 0xb1, 0x2a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x19, 0x2e, 0x2a, 0x11, 0x12, 0x39, + 0xb0, 0x1e, 0x10, 0xb1, 0x25, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x22, 0x2a, 0x25, 0x11, 0x12, 0x39, 0x30, 0x31, + 0x01, 0x14, 0x07, 0x16, 0x15, 0x14, 0x04, 0x23, 0x20, 0x24, 0x35, 0x25, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x24, 0x26, 0x26, 0x35, + 0x34, 0x37, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x04, 0x15, 0x21, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x04, 0x16, 0x16, 0x25, 0x06, + 0x15, 0x14, 0x16, 0x17, 0x17, 0x36, 0x35, 0x34, 0x26, 0x27, 0x04, 0x9c, + 0xa2, 0x87, 0xfe, 0xed, 0xf2, 0xfe, 0xff, 0xfe, 0xe1, 0x01, 0x21, 0x80, + 0x7f, 0x70, 0x74, 0x81, 0xfe, 0x93, 0xb9, 0x5b, 0xa2, 0x88, 0x01, 0x19, + 0xef, 0xf7, 0x01, 0x10, 0xfe, 0xdf, 0x7b, 0x6b, 0x6e, 0x78, 0x6f, 0x01, + 0x72, 0xc3, 0x5e, 0xfd, 0x2e, 0x4b, 0x53, 0x7c, 0xde, 0x52, 0x5b, 0x76, + 0x01, 0xe1, 0xb6, 0x59, 0x66, 0xba, 0xaf, 0xc7, 0xd6, 0xcb, 0x01, 0x59, + 0x5f, 0x4b, 0x3f, 0x41, 0x52, 0x65, 0x6e, 0x96, 0x6a, 0xb4, 0x5d, 0x67, + 0xb9, 0xab, 0xd2, 0xe2, 0xc9, 0x57, 0x6b, 0x4e, 0x44, 0x49, 0x4a, 0x62, + 0x6e, 0x99, 0x73, 0x2a, 0x63, 0x45, 0x4b, 0x28, 0x43, 0x2f, 0x5d, 0x3e, + 0x4f, 0x28, 0x00, 0x02, 0x00, 0x5e, 0x04, 0xd6, 0x03, 0x5a, 0x05, 0xd4, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x1e, 0x00, 0xb0, 0x03, 0x2f, 0xb1, 0x07, + 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, + 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x13, 0x2f, 0x30, 0x31, + 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x17, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x01, 0x73, 0x4e, + 0x3d, 0x3e, 0x4c, 0x4c, 0x7c, 0x4d, 0xd2, 0x51, 0x3a, 0x3b, 0x4f, 0x4c, + 0x7c, 0x4d, 0x05, 0x55, 0x35, 0x49, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x36, + 0x49, 0x4a, 0x35, 0x34, 0x4b, 0x4b, 0x00, 0x03, 0x00, 0x56, 0xff, 0xec, + 0x05, 0xe2, 0x05, 0xc4, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x37, 0x00, 0x95, + 0xb2, 0x1f, 0x38, 0x39, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x10, 0xb0, 0x09, + 0xd0, 0xb0, 0x1f, 0x10, 0xb0, 0x34, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x2c, 0x2f, 0x1b, 0xb1, 0x2c, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x34, 0x2f, 0x1b, 0xb1, 0x34, 0x0c, 0x3e, 0x59, 0xb2, 0x02, + 0x34, 0x2c, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb4, 0x0f, 0x02, 0x1f, + 0x02, 0x02, 0x5d, 0xb2, 0x0a, 0x2c, 0x34, 0x11, 0x12, 0x39, 0xb0, 0x0a, + 0x2f, 0xb4, 0x00, 0x0a, 0x10, 0x0a, 0x02, 0x5d, 0xb2, 0x0d, 0x0a, 0x02, + 0x11, 0x12, 0x39, 0xb0, 0x10, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, + 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x17, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, + 0xdc, 0x59, 0xb2, 0x1a, 0x02, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x2c, 0x10, + 0xb1, 0x1f, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x34, 0x10, 0xb1, 0x26, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x20, 0x26, 0x35, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x25, 0x34, 0x02, 0x24, + 0x23, 0x22, 0x04, 0x02, 0x10, 0x12, 0x04, 0x20, 0x24, 0x12, 0x25, 0x34, + 0x12, 0x24, 0x20, 0x04, 0x12, 0x15, 0x14, 0x02, 0x04, 0x23, 0x22, 0x24, + 0x02, 0x04, 0x5d, 0xaf, 0xfe, 0xc0, 0xbd, 0xbf, 0x9e, 0xa3, 0xad, 0x9c, + 0x5c, 0x58, 0x5c, 0x65, 0x01, 0x66, 0x5c, 0x59, 0x5a, 0x01, 0xa6, 0x96, + 0xfe, 0xee, 0xa3, 0x9f, 0xfe, 0xef, 0x9c, 0x9b, 0x01, 0x11, 0x01, 0x40, + 0x01, 0x13, 0x98, 0xfa, 0xef, 0xbb, 0x01, 0x4b, 0x01, 0x80, 0x01, 0x4b, + 0xbb, 0xbe, 0xfe, 0xb7, 0xbf, 0xc1, 0xfe, 0xb7, 0xbc, 0x02, 0x54, 0x98, + 0xa2, 0xd5, 0xb4, 0x71, 0xae, 0xd5, 0xa5, 0x95, 0x60, 0x53, 0x87, 0x71, + 0x7b, 0x75, 0x87, 0x51, 0x62, 0x85, 0xa6, 0x01, 0x1d, 0xab, 0xa4, 0xfe, + 0xe0, 0xfe, 0xac, 0xfe, 0xe0, 0xa7, 0xaa, 0x01, 0x20, 0xa7, 0xca, 0x01, + 0x5a, 0xc7, 0xc7, 0xfe, 0xa6, 0xca, 0xcc, 0xfe, 0xa5, 0xc6, 0xc8, 0x01, + 0x5a, 0x00, 0x00, 0x02, 0x00, 0x89, 0x02, 0xb3, 0x03, 0x0d, 0x05, 0xc4, + 0x00, 0x1b, 0x00, 0x25, 0x00, 0x70, 0xb2, 0x0e, 0x26, 0x27, 0x11, 0x12, + 0x39, 0xb0, 0x0e, 0x10, 0xb0, 0x1d, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x18, 0x3e, 0x59, 0xb2, 0x04, 0x26, + 0x15, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb2, 0x00, 0x04, 0x15, 0x11, + 0x12, 0x39, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x02, 0x04, 0x1c, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x04, + 0x15, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x2f, 0xb0, 0x15, 0x10, 0xb1, 0x0e, + 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x11, + 0x0a, 0x15, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x20, 0x0a, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x26, + 0x27, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x34, + 0x23, 0x22, 0x06, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, + 0x14, 0x17, 0x25, 0x32, 0x36, 0x37, 0x35, 0x23, 0x06, 0x06, 0x15, 0x14, + 0x02, 0x5c, 0x0a, 0x07, 0x4d, 0x7c, 0x76, 0x83, 0xa8, 0xad, 0x66, 0x74, + 0x41, 0x49, 0xad, 0xaf, 0x88, 0x87, 0x9c, 0x1a, 0xfe, 0xa0, 0x28, 0x54, + 0x1b, 0x6a, 0x4c, 0x56, 0x02, 0xc1, 0x1b, 0x29, 0x52, 0x7b, 0x69, 0x6e, + 0x79, 0x33, 0x7f, 0x33, 0x30, 0x0e, 0x68, 0x81, 0x90, 0x85, 0xfe, 0xc4, + 0x61, 0x51, 0x82, 0x25, 0x19, 0x88, 0x01, 0x3c, 0x31, 0x58, 0xff, 0xff, + 0x00, 0x4d, 0x00, 0x7d, 0x03, 0xa0, 0x03, 0x9c, 0x00, 0x26, 0x01, 0x92, + 0xe1, 0x00, 0x00, 0x07, 0x01, 0x92, 0x01, 0x62, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x7e, 0x01, 0x76, 0x03, 0xc1, 0x03, 0x25, 0x00, 0x05, 0x00, 0x1b, + 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x01, 0xd0, 0xb0, 0x01, 0x2f, 0xb0, 0x04, + 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x35, 0x21, 0x03, 0xc1, 0xc8, + 0xfd, 0x85, 0x03, 0x43, 0x01, 0x76, 0x01, 0x04, 0xab, 0x00, 0x00, 0x04, + 0x00, 0x56, 0xff, 0xec, 0x05, 0xe2, 0x05, 0xc4, 0x00, 0x0e, 0x00, 0x1c, + 0x00, 0x32, 0x00, 0x3b, 0x00, 0x92, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x03, 0x10, + 0xb1, 0x13, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x0b, 0x10, 0xb1, 0x1a, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x1e, 0x0b, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x1e, + 0x2f, 0xb2, 0x20, 0x03, 0x0b, 0x11, 0x12, 0x39, 0xb0, 0x20, 0x2f, 0xb4, + 0x00, 0x20, 0x10, 0x20, 0x02, 0x5d, 0xb2, 0x33, 0x1e, 0x20, 0x11, 0x12, + 0x39, 0xb0, 0x33, 0x2f, 0xb1, 0x1d, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x26, 0x1d, 0x33, 0x11, 0x12, 0x39, 0xb0, + 0x1e, 0x10, 0xb0, 0x2d, 0xd0, 0xb0, 0x2b, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, + 0x1b, 0xdc, 0x59, 0xb0, 0x20, 0x10, 0xb1, 0x3b, 0x0a, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x12, 0x24, + 0x20, 0x04, 0x12, 0x15, 0x14, 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x25, + 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x10, 0x12, 0x04, 0x20, 0x24, + 0x12, 0x25, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, + 0x16, 0x14, 0x16, 0x17, 0x15, 0x23, 0x26, 0x35, 0x34, 0x26, 0x23, 0x27, + 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x23, 0x56, 0xbb, 0x01, 0x4b, + 0x01, 0x80, 0x01, 0x4b, 0xbb, 0xbe, 0xfe, 0xb7, 0xbf, 0xc1, 0xfe, 0xb7, + 0xbc, 0x05, 0x11, 0x96, 0xfe, 0xee, 0xa3, 0x9f, 0xfe, 0xef, 0x9c, 0x9b, + 0x01, 0x11, 0x01, 0x40, 0x01, 0x13, 0x98, 0xfd, 0x25, 0x97, 0x01, 0x19, + 0x97, 0xae, 0x71, 0x3d, 0x31, 0x07, 0x0a, 0x9b, 0x0d, 0x42, 0x4d, 0x9e, + 0x88, 0x4a, 0x5f, 0x47, 0x5d, 0x8d, 0x02, 0xd9, 0xca, 0x01, 0x5a, 0xc7, + 0xc7, 0xfe, 0xa6, 0xca, 0xcc, 0xfe, 0xa5, 0xc6, 0xc8, 0x01, 0x5a, 0xcb, + 0xa6, 0x01, 0x1d, 0xab, 0xa4, 0xfe, 0xe0, 0xfe, 0xac, 0xfe, 0xe0, 0xa7, + 0xaa, 0x01, 0x20, 0x5b, 0xfe, 0xaf, 0x03, 0x52, 0x89, 0x7e, 0x70, 0x3e, + 0x1f, 0x6f, 0xa4, 0x44, 0x17, 0x10, 0x22, 0xa0, 0x4c, 0x43, 0x86, 0x40, + 0x34, 0x46, 0x3b, 0x01, 0x00, 0x01, 0x00, 0xa8, 0x05, 0x07, 0x03, 0x5a, + 0x05, 0xae, 0x00, 0x03, 0x00, 0x19, 0xb2, 0x00, 0x04, 0x05, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x02, 0x2f, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x03, + 0x5a, 0xfd, 0x4e, 0x02, 0xb2, 0x05, 0x07, 0xa7, 0x00, 0x02, 0x00, 0x7e, + 0x03, 0xa0, 0x02, 0x9a, 0x05, 0xc4, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x31, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, + 0x3e, 0x59, 0xb0, 0x0b, 0xd0, 0xb0, 0x0b, 0x2f, 0xb1, 0x08, 0x02, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, + 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x05, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0x7e, 0xa2, + 0x6e, 0x6d, 0x9f, 0x9f, 0x6d, 0x6c, 0xa4, 0x01, 0x10, 0x35, 0x45, 0x45, + 0x6a, 0x48, 0x49, 0x04, 0xb0, 0x72, 0xa2, 0xa1, 0xe6, 0x9d, 0x9d, 0x09, + 0x47, 0x35, 0x34, 0x4c, 0x4c, 0x68, 0x48, 0x00, 0x00, 0x02, 0x00, 0x59, + 0x00, 0x01, 0x03, 0xed, 0x05, 0x05, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x41, + 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, + 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x00, 0xd0, 0xb0, + 0x09, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x03, 0xd0, 0xb0, 0x0d, 0x10, 0xb1, 0x0e, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, 0x0e, 0x06, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, + 0x21, 0x35, 0x21, 0x11, 0x33, 0x01, 0x21, 0x35, 0x21, 0x02, 0xa5, 0x01, + 0x48, 0xfe, 0xb8, 0xfd, 0xfe, 0xb1, 0x01, 0x4f, 0xfd, 0x01, 0x2c, 0xfc, + 0xa0, 0x03, 0x60, 0x03, 0xae, 0xf1, 0xfe, 0x94, 0x01, 0x6c, 0xf1, 0x01, + 0x57, 0xfa, 0xfc, 0xeb, 0x00, 0x01, 0x00, 0x37, 0x02, 0x9b, 0x02, 0xb5, + 0x05, 0xbb, 0x00, 0x17, 0x00, 0x5b, 0xb2, 0x08, 0x18, 0x19, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, + 0x00, 0x10, 0x3e, 0x59, 0xb1, 0x16, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x16, 0x00, 0x11, 0x12, 0x39, 0xb2, + 0x03, 0x0f, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x10, 0xb1, 0x08, 0x02, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0b, 0x00, + 0x0f, 0x11, 0x12, 0x39, 0xb2, 0x14, 0x0f, 0x00, 0x11, 0x12, 0x39, 0x30, + 0x31, 0x01, 0x21, 0x35, 0x01, 0x36, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, + 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x07, + 0x21, 0x02, 0xb5, 0xfd, 0x94, 0x01, 0x1f, 0x38, 0x31, 0x5f, 0x32, 0x3b, + 0xce, 0xab, 0x87, 0x94, 0xa1, 0x48, 0x6c, 0x94, 0x01, 0x5f, 0x02, 0x9b, + 0x8a, 0x01, 0x01, 0x31, 0x54, 0x17, 0x54, 0x3e, 0x2f, 0x74, 0x9e, 0x81, + 0x77, 0x46, 0x74, 0x57, 0x73, 0x00, 0x00, 0x01, 0x00, 0x30, 0x02, 0x90, + 0x02, 0xb5, 0x05, 0xbb, 0x00, 0x24, 0x00, 0x93, 0xb2, 0x1e, 0x25, 0x26, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, + 0xb1, 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, + 0x1b, 0xb1, 0x17, 0x10, 0x3e, 0x59, 0xb2, 0x01, 0x17, 0x0d, 0x11, 0x12, + 0x39, 0x7c, 0xb0, 0x01, 0x2f, 0x18, 0xb2, 0xd0, 0x01, 0x01, 0x5d, 0xb6, + 0xa0, 0x01, 0xb0, 0x01, 0xc0, 0x01, 0x03, 0x71, 0xb6, 0x40, 0x01, 0x50, + 0x01, 0x60, 0x01, 0x03, 0x71, 0xb2, 0x90, 0x01, 0x01, 0x5d, 0xb4, 0x30, + 0x01, 0x40, 0x01, 0x02, 0x72, 0xb0, 0x0d, 0x10, 0xb1, 0x06, 0x02, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x0d, 0x01, + 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x23, 0xb0, 0x0a, 0x2b, 0x58, + 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x12, 0x23, 0x01, 0x11, 0x12, 0x39, 0xb2, + 0x1b, 0x23, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x10, 0xb1, 0x1e, 0x02, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, + 0x01, 0x11, 0x52, 0x77, 0x39, 0x31, 0x2a, 0x3b, 0xcd, 0xa9, 0x83, 0x91, + 0xab, 0x87, 0x96, 0xb7, 0x94, 0x8e, 0xac, 0xce, 0x44, 0x34, 0x3c, 0x35, + 0x7a, 0x5c, 0x04, 0x71, 0x58, 0x23, 0x2a, 0x1f, 0x1d, 0x66, 0x7b, 0x77, + 0x6b, 0x77, 0x32, 0x29, 0x8f, 0x69, 0x7f, 0x85, 0x72, 0x22, 0x31, 0x35, + 0x23, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x00, 0x65, 0x04, 0xca, 0x02, 0x65, + 0x06, 0x00, 0x00, 0x03, 0x00, 0x89, 0x00, 0xb0, 0x02, 0x2f, 0xb2, 0x0f, + 0x02, 0x01, 0x5d, 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0xb2, 0x0f, 0x00, + 0x01, 0x5d, 0xb2, 0x03, 0x02, 0x00, 0x11, 0x12, 0x39, 0x40, 0x21, 0x0b, + 0x03, 0x1b, 0x03, 0x2b, 0x03, 0x3b, 0x03, 0x4b, 0x03, 0x5b, 0x03, 0x6b, + 0x03, 0x7b, 0x03, 0x8b, 0x03, 0x9b, 0x03, 0xab, 0x03, 0xbb, 0x03, 0xcb, + 0x03, 0xdb, 0x03, 0xeb, 0x03, 0xfb, 0x03, 0x10, 0x5d, 0x40, 0x21, 0x0b, + 0x03, 0x1b, 0x03, 0x2b, 0x03, 0x3b, 0x03, 0x4b, 0x03, 0x5b, 0x03, 0x6b, + 0x03, 0x7b, 0x03, 0x8b, 0x03, 0x9b, 0x03, 0xab, 0x03, 0xbb, 0x03, 0xcb, + 0x03, 0xdb, 0x03, 0xeb, 0x03, 0xfb, 0x03, 0x10, 0x71, 0x40, 0x21, 0x0b, + 0x03, 0x1b, 0x03, 0x2b, 0x03, 0x3b, 0x03, 0x4b, 0x03, 0x5b, 0x03, 0x6b, + 0x03, 0x7b, 0x03, 0x8b, 0x03, 0x9b, 0x03, 0xab, 0x03, 0xbb, 0x03, 0xcb, + 0x03, 0xdb, 0x03, 0xeb, 0x03, 0xfb, 0x03, 0x10, 0x72, 0x30, 0x31, 0x01, + 0x21, 0x01, 0x23, 0x01, 0x2a, 0x01, 0x3b, 0xfe, 0xeb, 0xeb, 0x06, 0x00, + 0xfe, 0xca, 0x00, 0x01, 0x00, 0x8b, 0xfe, 0x60, 0x04, 0x4e, 0x04, 0x3a, + 0x00, 0x12, 0x00, 0x51, 0xb2, 0x0d, 0x13, 0x14, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, + 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, + 0x0d, 0x0c, 0x3e, 0x59, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0b, 0x07, 0x0d, 0x11, 0x12, 0x39, 0x30, + 0x31, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x21, 0x11, 0x21, + 0x27, 0x06, 0x23, 0x22, 0x27, 0x11, 0x21, 0x11, 0x01, 0xac, 0x51, 0x63, + 0x95, 0x38, 0x01, 0x21, 0xfe, 0xf3, 0x06, 0x59, 0x88, 0x66, 0x48, 0xfe, + 0xdf, 0x04, 0x3a, 0xfd, 0x91, 0x7e, 0x77, 0x69, 0x02, 0xfb, 0xfb, 0xc6, + 0x44, 0x59, 0x2d, 0xfe, 0x48, 0x05, 0xda, 0x00, 0x00, 0x01, 0x00, 0x4b, + 0x00, 0x00, 0x03, 0x65, 0x05, 0xb0, 0x00, 0x0a, 0x00, 0x2b, 0xb2, 0x02, + 0x0b, 0x0c, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, + 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x00, 0x08, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x21, 0x11, 0x23, 0x22, 0x24, 0x35, 0x34, + 0x24, 0x33, 0x21, 0x11, 0x02, 0x8a, 0x50, 0xe6, 0xfe, 0xf7, 0x01, 0x0a, + 0xe6, 0x01, 0x2a, 0x02, 0x08, 0xfe, 0xd6, 0xd5, 0xff, 0xfa, 0x50, 0x00, + 0x00, 0x01, 0x00, 0x8c, 0x02, 0x1f, 0x01, 0xd3, 0x03, 0x54, 0x00, 0x09, + 0x00, 0x19, 0xb2, 0x07, 0x0a, 0x0b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x02, + 0x2f, 0xb1, 0x07, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x8c, 0x5c, 0x8e, 0x5d, 0x5e, 0x46, 0x48, 0x5b, 0x02, 0xb9, 0x45, + 0x56, 0x56, 0x8a, 0x55, 0x57, 0x00, 0x00, 0x01, 0x00, 0x62, 0xfe, 0x32, + 0x01, 0xe4, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x30, 0xb2, 0x05, 0x0e, 0x0f, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x2f, 0xb2, 0x20, + 0x06, 0x01, 0x5d, 0xb0, 0x06, 0x10, 0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, + 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x0c, 0x07, 0x00, 0x11, 0x12, 0x39, 0xb2, + 0x01, 0x00, 0x0c, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, 0x07, 0x16, 0x15, + 0x14, 0x06, 0x23, 0x27, 0x32, 0x35, 0x34, 0x26, 0x27, 0x37, 0x01, 0x59, + 0x0b, 0x96, 0xb7, 0xa6, 0x07, 0x70, 0x43, 0x4b, 0x1f, 0x07, 0x3a, 0x1b, + 0x92, 0x6e, 0x80, 0xa7, 0x51, 0x2a, 0x1f, 0x05, 0x8f, 0x00, 0x00, 0x01, + 0x00, 0x87, 0x02, 0x9b, 0x02, 0x10, 0x05, 0xad, 0x00, 0x06, 0x00, 0x41, + 0xb2, 0x01, 0x07, 0x08, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb2, 0x04, + 0x00, 0x05, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, 0x03, 0x02, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x03, 0x05, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x07, 0x35, 0x25, 0x33, + 0x02, 0x10, 0xcc, 0xbd, 0x01, 0x76, 0x13, 0x02, 0x9b, 0x02, 0x24, 0x29, + 0x9e, 0x79, 0x00, 0x02, 0x00, 0x76, 0x02, 0xb2, 0x03, 0x2b, 0x05, 0xc4, + 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x35, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, 0xb2, 0x09, 0x1b, 0x02, + 0x11, 0x12, 0x39, 0xb0, 0x09, 0x2f, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x17, 0x02, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, + 0x34, 0x36, 0x20, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x17, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x76, 0xbf, 0x01, 0x36, 0xc0, 0xbc, 0x9d, 0x9e, 0xbe, 0xaf, + 0x5d, 0x50, 0x4e, 0x5b, 0x01, 0x5d, 0x4f, 0x4e, 0x5d, 0x04, 0x61, 0xa0, + 0xc3, 0xc2, 0xa6, 0x48, 0x9f, 0xc3, 0xc4, 0xa3, 0x05, 0x62, 0x6e, 0x6c, + 0x61, 0x50, 0x61, 0x6e, 0x6d, 0x66, 0xff, 0xff, 0x00, 0x55, 0x00, 0x7c, + 0x03, 0xb1, 0x03, 0x9b, 0x00, 0x26, 0x01, 0x93, 0x05, 0x00, 0x00, 0x07, + 0x01, 0x93, 0x01, 0x8e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0x00, 0x00, + 0x05, 0x6e, 0x05, 0xaa, 0x00, 0x27, 0x01, 0xc6, 0xff, 0xde, 0x02, 0x98, + 0x00, 0x27, 0x01, 0x94, 0x01, 0x1f, 0x00, 0x08, 0x01, 0x07, 0x02, 0x20, + 0x02, 0xae, 0x00, 0x00, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x54, 0x00, 0x00, 0x05, 0xc5, 0x05, 0xb0, 0x00, 0x27, 0x01, 0x94, + 0x00, 0xf5, 0x00, 0x08, 0x00, 0x27, 0x01, 0xc6, 0xff, 0xcd, 0x02, 0x9e, + 0x00, 0x07, 0x01, 0xc5, 0x03, 0x10, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5e, + 0x00, 0x00, 0x06, 0x0c, 0x05, 0xbb, 0x00, 0x27, 0x01, 0x94, 0x01, 0xc0, + 0x00, 0x08, 0x00, 0x27, 0x02, 0x20, 0x03, 0x4c, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x1f, 0x00, 0x2e, 0x02, 0x9b, 0x00, 0x02, 0x00, 0x45, 0xfe, 0x7f, + 0x03, 0xcc, 0x04, 0x4e, 0x00, 0x18, 0x00, 0x21, 0x00, 0x56, 0xb2, 0x08, + 0x22, 0x23, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x1c, 0xd0, 0x00, + 0xb0, 0x0f, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, + 0x1f, 0x14, 0x3e, 0x59, 0xb1, 0x1c, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x18, 0xd0, 0xb0, 0x18, 0x2f, 0xb2, 0x03, + 0x0f, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x10, 0xb1, 0x08, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0b, 0x0f, 0x18, + 0x11, 0x12, 0x39, 0xb2, 0x14, 0x18, 0x0f, 0x11, 0x12, 0x39, 0x30, 0x31, + 0x01, 0x14, 0x0e, 0x03, 0x15, 0x14, 0x33, 0x32, 0x36, 0x37, 0x21, 0x06, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x37, 0x36, 0x36, 0x37, 0x01, + 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x02, 0x9a, 0x3e, 0x9f, + 0x39, 0x1d, 0x9a, 0x4d, 0x5b, 0x02, 0x01, 0x21, 0x02, 0xf2, 0xd2, 0xd5, + 0xec, 0x99, 0x61, 0x32, 0x27, 0x02, 0x01, 0x24, 0x5c, 0x8c, 0x5c, 0x59, + 0x92, 0x59, 0x02, 0x83, 0x85, 0xa4, 0x94, 0x48, 0x4a, 0x2c, 0x9d, 0x5a, + 0x51, 0xc0, 0xd7, 0xcb, 0xbc, 0x9f, 0x99, 0x5d, 0x2d, 0x62, 0x59, 0x01, + 0x32, 0x43, 0x56, 0x56, 0x86, 0x56, 0x56, 0x00, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x00, 0x07, 0x49, 0x05, 0xb0, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x7b, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x11, 0x06, 0x00, 0x11, 0x12, 0x39, 0xb0, + 0x11, 0x2f, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0b, 0x00, 0x06, 0x11, 0x12, 0x39, + 0xb0, 0x0b, 0x2f, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x12, 0x06, 0x00, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x21, 0x21, 0x03, 0x21, 0x03, 0x21, 0x01, 0x21, 0x15, + 0x21, 0x13, 0x21, 0x15, 0x21, 0x13, 0x21, 0x01, 0x21, 0x03, 0x07, 0x49, + 0xfc, 0x7f, 0x0e, 0xfe, 0x42, 0xa7, 0xfe, 0xad, 0x03, 0x12, 0x03, 0xf8, + 0xfd, 0xaa, 0x0f, 0x01, 0xf6, 0xfe, 0x14, 0x10, 0x02, 0x6a, 0xfb, 0x30, + 0x01, 0x37, 0x18, 0x01, 0x4d, 0xfe, 0xb3, 0x05, 0xb0, 0xec, 0xfe, 0x9d, + 0xec, 0xfe, 0x76, 0x01, 0x59, 0x02, 0x3a, 0x00, 0x00, 0x01, 0x00, 0x41, + 0x00, 0xcd, 0x03, 0xf6, 0x04, 0x8f, 0x00, 0x0b, 0x00, 0x38, 0x00, 0xb0, + 0x03, 0x2f, 0xb2, 0x09, 0x0c, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x2f, + 0xb2, 0x0a, 0x09, 0x03, 0x11, 0x12, 0x39, 0xb2, 0x04, 0x03, 0x09, 0x11, + 0x12, 0x39, 0xb2, 0x01, 0x0a, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, + 0xb0, 0x05, 0xd0, 0xb2, 0x07, 0x04, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x09, + 0x10, 0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x13, 0x01, 0x01, 0x37, 0x01, 0x01, + 0x17, 0x01, 0x01, 0x07, 0x01, 0x01, 0x41, 0x01, 0x33, 0xfe, 0xcd, 0xaa, + 0x01, 0x30, 0x01, 0x31, 0xaa, 0xfe, 0xcd, 0x01, 0x33, 0xaa, 0xfe, 0xcf, + 0xfe, 0xd0, 0x01, 0x75, 0x01, 0x39, 0x01, 0x39, 0xa8, 0xfe, 0xc9, 0x01, + 0x37, 0xa8, 0xfe, 0xc7, 0xfe, 0xc7, 0xa8, 0x01, 0x36, 0xfe, 0xca, 0x00, + 0x00, 0x03, 0x00, 0x5d, 0xff, 0xa1, 0x05, 0x35, 0x05, 0xee, 0x00, 0x17, + 0x00, 0x20, 0x00, 0x29, 0x00, 0x55, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x1a, 0x10, + 0x04, 0x11, 0x12, 0x39, 0xb2, 0x23, 0x10, 0x04, 0x11, 0x12, 0x39, 0xb0, + 0x23, 0x10, 0xb0, 0x1b, 0xd0, 0xb0, 0x10, 0x10, 0xb1, 0x1d, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1a, 0x10, 0xb0, + 0x24, 0xd0, 0xb0, 0x04, 0x10, 0xb1, 0x26, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x04, 0x23, + 0x22, 0x27, 0x07, 0x23, 0x37, 0x26, 0x11, 0x35, 0x34, 0x12, 0x24, 0x33, + 0x32, 0x17, 0x37, 0x33, 0x07, 0x16, 0x11, 0x05, 0x14, 0x17, 0x01, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x05, 0x34, 0x27, 0x01, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x05, 0x35, 0x98, 0xfe, 0xe5, 0xb7, 0xa4, 0x83, 0x55, 0xbc, 0x8f, + 0xc5, 0x9b, 0x01, 0x1b, 0xb6, 0xaf, 0x8b, 0x4a, 0xbb, 0x86, 0xb3, 0xfc, + 0x58, 0x31, 0x01, 0xbf, 0x49, 0x6b, 0x97, 0xa4, 0x01, 0x02, 0x79, 0x26, + 0xfe, 0x48, 0x46, 0x5d, 0x97, 0xa3, 0x01, 0x02, 0xb7, 0xd7, 0xfe, 0xbc, + 0xb0, 0x46, 0x91, 0xf2, 0xc3, 0x01, 0x68, 0x39, 0xd7, 0x01, 0x47, 0xaf, + 0x52, 0x7c, 0xe3, 0xc6, 0xfe, 0xad, 0x3b, 0xac, 0x71, 0x02, 0xf5, 0x3d, + 0xeb, 0xe3, 0x05, 0x97, 0x69, 0xfd, 0x18, 0x2f, 0xed, 0xe3, 0x00, 0x02, + 0x00, 0x85, 0x00, 0x00, 0x04, 0x9d, 0x05, 0xb0, 0x00, 0x0d, 0x00, 0x15, + 0x00, 0x59, 0xb2, 0x10, 0x16, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x10, + 0xb0, 0x02, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, + 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x00, 0x0b, 0x11, 0x12, + 0x39, 0xb0, 0x01, 0x2f, 0xb2, 0x10, 0x00, 0x0b, 0x11, 0x12, 0x39, 0xb0, + 0x10, 0x2f, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x33, 0x1e, 0x02, + 0x15, 0x14, 0x04, 0x07, 0x23, 0x11, 0x21, 0x11, 0x01, 0x11, 0x33, 0x32, + 0x36, 0x34, 0x26, 0x27, 0x01, 0xa6, 0xe6, 0xa2, 0xef, 0x80, 0xfe, 0xeb, + 0xf0, 0xf2, 0xfe, 0xdf, 0x01, 0x21, 0xdf, 0x75, 0x82, 0x7f, 0x70, 0x05, + 0xb0, 0xfe, 0xf5, 0x01, 0x6f, 0xcd, 0x86, 0xca, 0xf4, 0x05, 0xfe, 0xe1, + 0x05, 0xb0, 0xfe, 0x0c, 0xfe, 0x4c, 0x76, 0xc4, 0x78, 0x02, 0x00, 0x01, + 0x00, 0x87, 0xff, 0xec, 0x04, 0xc8, 0x06, 0x17, 0x00, 0x29, 0x00, 0x5a, + 0xb2, 0x18, 0x2a, 0x2b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb2, + 0x0b, 0x05, 0x13, 0x11, 0x12, 0x39, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1f, 0x13, 0x05, 0x11, 0x12, + 0x39, 0xb0, 0x05, 0x10, 0xb1, 0x27, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, + 0x01, 0xa8, 0xfe, 0xdf, 0xf8, 0xe2, 0xbf, 0xe7, 0x6b, 0x3d, 0x58, 0x97, + 0xe6, 0xd7, 0x51, 0x9e, 0x28, 0x36, 0x62, 0x79, 0x4f, 0x54, 0x45, 0x52, + 0x96, 0x6e, 0x59, 0x44, 0x9f, 0x05, 0x04, 0x4d, 0xdc, 0xee, 0xc7, 0xab, + 0x6c, 0xae, 0x4d, 0x25, 0x4f, 0x4e, 0x86, 0x94, 0xb1, 0xc5, 0x20, 0x18, + 0xe5, 0x34, 0x49, 0x3f, 0x2e, 0x57, 0x42, 0x78, 0x96, 0x60, 0xb5, 0x4f, + 0x46, 0x53, 0xd5, 0x00, 0x00, 0x03, 0x00, 0x42, 0xff, 0xec, 0x06, 0x8d, + 0x04, 0x50, 0x00, 0x29, 0x00, 0x34, 0x00, 0x3c, 0x00, 0xde, 0xb2, 0x02, + 0x3d, 0x3e, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x10, 0xb0, 0x2d, 0xd0, 0xb0, + 0x02, 0x10, 0xb0, 0x38, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, + 0x2f, 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x02, + 0x1b, 0x00, 0x11, 0x12, 0x39, 0xb2, 0x0c, 0x1b, 0x00, 0x11, 0x12, 0x39, + 0xb0, 0x0c, 0x2f, 0xb2, 0x8f, 0x0c, 0x01, 0x5d, 0xb0, 0x17, 0x10, 0xb1, + 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x13, 0x0c, 0x17, 0x11, 0x12, 0x39, 0xb2, 0x19, 0x1b, 0x00, 0x11, 0x12, + 0x39, 0xb2, 0x39, 0x1b, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x39, 0x2f, 0xb2, + 0x8f, 0x39, 0x01, 0x5d, 0xb4, 0x1f, 0x39, 0x2f, 0x39, 0x02, 0x71, 0xb2, + 0x5f, 0x39, 0x01, 0x71, 0xb1, 0x1f, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x23, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x26, 0x00, 0x1f, 0x11, + 0x12, 0x39, 0xb0, 0x05, 0x10, 0xb1, 0x2a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x2e, 0x08, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb0, + 0x35, 0xd0, 0x30, 0x31, 0x05, 0x22, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x37, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x25, 0x34, 0x24, 0x33, 0x32, 0x17, 0x36, 0x17, 0x32, 0x12, 0x15, 0x15, + 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x25, 0x32, + 0x36, 0x37, 0x35, 0x23, 0x06, 0x06, 0x15, 0x14, 0x16, 0x01, 0x22, 0x06, + 0x07, 0x21, 0x35, 0x34, 0x26, 0x04, 0xde, 0xf7, 0x8b, 0x40, 0xcd, 0x7d, + 0xba, 0xd6, 0xf8, 0xf3, 0xa8, 0x51, 0x4d, 0x52, 0x5f, 0xfe, 0xdf, 0x01, + 0x05, 0xd0, 0xd3, 0x74, 0x7e, 0xc8, 0xd4, 0xf2, 0xfd, 0x64, 0x0b, 0x8b, + 0x75, 0x4d, 0x83, 0x57, 0x4d, 0x49, 0xd7, 0xfc, 0xb9, 0x31, 0x74, 0x27, + 0xa4, 0x5f, 0x6f, 0x51, 0x03, 0x13, 0x5a, 0x6d, 0x0d, 0x01, 0x7e, 0x57, + 0x14, 0x93, 0x45, 0x4e, 0xb2, 0xa1, 0x9d, 0xac, 0x01, 0x39, 0x4c, 0x56, + 0x47, 0x34, 0x13, 0x95, 0xbd, 0x6e, 0x70, 0x02, 0xfe, 0xf9, 0xe8, 0x9d, + 0x74, 0x7a, 0x20, 0x2d, 0xbd, 0x38, 0x40, 0xd4, 0x2d, 0x23, 0xbd, 0x01, + 0x54, 0x3d, 0x38, 0x43, 0x02, 0xa4, 0x73, 0x6d, 0x1c, 0x5e, 0x66, 0x00, + 0x00, 0x02, 0x00, 0x54, 0xff, 0xec, 0x04, 0x51, 0x06, 0x2b, 0x00, 0x1c, + 0x00, 0x28, 0x00, 0x5a, 0xb2, 0x07, 0x29, 0x2a, 0x11, 0x12, 0x39, 0xb0, + 0x07, 0x10, 0xb0, 0x25, 0xd0, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x1a, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, + 0x18, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x25, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x12, + 0x13, 0x15, 0x14, 0x02, 0x06, 0x23, 0x22, 0x26, 0x26, 0x35, 0x34, 0x12, + 0x33, 0x32, 0x17, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x37, 0x16, + 0x17, 0x37, 0x17, 0x03, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x03, 0x51, 0xff, 0x01, 0x85, 0xee, 0x93, 0x90, 0xe6, + 0x81, 0xf6, 0xce, 0x88, 0x6c, 0x31, 0x75, 0xbf, 0x4e, 0x98, 0x74, 0x94, + 0x5b, 0xee, 0xb2, 0xab, 0x4d, 0xac, 0x44, 0x93, 0x71, 0x73, 0x78, 0x62, + 0x67, 0x7a, 0x05, 0x19, 0xfe, 0xfa, 0xfe, 0x78, 0x4a, 0xac, 0xfe, 0xee, + 0x97, 0x7f, 0xe1, 0x88, 0xe7, 0x01, 0x0b, 0x4c, 0x98, 0x71, 0x7a, 0x72, + 0x61, 0x48, 0x27, 0xe0, 0x30, 0x84, 0x6d, 0x72, 0xfd, 0x25, 0x53, 0x95, + 0x81, 0x70, 0x8f, 0xb5, 0x9e, 0x00, 0x00, 0x03, 0x00, 0x3f, 0x00, 0x7f, + 0x04, 0x43, 0x04, 0xd9, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x5d, + 0xb2, 0x07, 0x1c, 0x1d, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x00, + 0xd0, 0xb0, 0x07, 0x10, 0xb0, 0x13, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x12, 0x3e, 0x59, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, + 0xb0, 0x0d, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x07, + 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x00, 0x10, 0xb0, + 0x13, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x19, 0xb0, + 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, + 0x21, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x04, 0x43, 0xfb, 0xfc, 0x04, 0x04, 0xfd, 0x5c, 0x5b, 0x48, 0x47, + 0x5d, 0x5a, 0x4a, 0x4b, 0x58, 0x5b, 0x48, 0x47, 0x5d, 0x5a, 0x4a, 0x4b, + 0x58, 0x02, 0x3b, 0xe6, 0x01, 0x20, 0x44, 0x54, 0x53, 0x45, 0x43, 0x53, + 0x54, 0xfd, 0x16, 0x44, 0x54, 0x53, 0x45, 0x43, 0x53, 0x54, 0x00, 0x03, + 0x00, 0x42, 0xff, 0x72, 0x04, 0x43, 0x04, 0xc0, 0x00, 0x14, 0x00, 0x1c, + 0x00, 0x24, 0x00, 0x68, 0xb2, 0x04, 0x25, 0x26, 0x11, 0x12, 0x39, 0xb0, + 0x04, 0x10, 0xb0, 0x1a, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x22, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, + 0x3e, 0x59, 0xb2, 0x17, 0x04, 0x0e, 0x11, 0x12, 0x39, 0xb2, 0x1f, 0x04, + 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x04, + 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x17, 0x10, 0xb0, 0x20, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x22, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x13, 0x34, 0x36, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x07, 0x16, 0x11, + 0x14, 0x00, 0x23, 0x22, 0x27, 0x07, 0x23, 0x37, 0x26, 0x01, 0x14, 0x17, + 0x01, 0x26, 0x23, 0x22, 0x06, 0x05, 0x34, 0x27, 0x01, 0x16, 0x33, 0x32, + 0x36, 0x42, 0x7c, 0xe9, 0x9a, 0x65, 0x55, 0x46, 0xa1, 0x67, 0xc8, 0xfe, + 0xea, 0xea, 0x5f, 0x51, 0x48, 0xa1, 0x67, 0xcf, 0x01, 0x21, 0x29, 0x01, + 0x04, 0x24, 0x2b, 0x6a, 0x74, 0x01, 0xbf, 0x25, 0xff, 0x00, 0x1e, 0x28, + 0x69, 0x76, 0x02, 0x27, 0xa1, 0xfc, 0x8a, 0x1d, 0x8f, 0xd3, 0x95, 0xfe, + 0xba, 0xf9, 0xfe, 0xd3, 0x1a, 0x94, 0xd4, 0x92, 0x01, 0x3a, 0x82, 0x4e, + 0x02, 0x14, 0x0e, 0xa5, 0x98, 0x72, 0x52, 0xfd, 0xf4, 0x0a, 0xa1, 0x00, + 0x00, 0x02, 0x00, 0x71, 0xfe, 0x60, 0x04, 0x3f, 0x06, 0x00, 0x00, 0x0f, + 0x00, 0x19, 0x00, 0x66, 0xb2, 0x13, 0x1a, 0x1b, 0x11, 0x12, 0x39, 0xb0, + 0x13, 0x10, 0xb0, 0x04, 0xd0, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, + 0xb2, 0x05, 0x0c, 0x03, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x0c, 0x03, 0x11, + 0x12, 0x39, 0xb0, 0x0c, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, + 0x02, 0x23, 0x22, 0x27, 0x11, 0x21, 0x11, 0x21, 0x11, 0x36, 0x33, 0x32, + 0x12, 0x11, 0x25, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, + 0x04, 0x3f, 0xe3, 0xc1, 0xa4, 0x64, 0xfe, 0xde, 0x01, 0x22, 0x64, 0xa2, + 0xc6, 0xe0, 0xfe, 0xdf, 0x6b, 0x66, 0x84, 0x36, 0x36, 0x86, 0xcf, 0x02, + 0x13, 0xfa, 0xfe, 0xd3, 0x71, 0xfe, 0x03, 0x07, 0xa0, 0xfd, 0xdd, 0x71, + 0xfe, 0xda, 0xfe, 0xf9, 0x07, 0x97, 0xa4, 0x66, 0xfe, 0x41, 0x69, 0x00, + 0x00, 0x02, 0x00, 0x42, 0xff, 0xec, 0x04, 0xaf, 0x06, 0x00, 0x00, 0x16, + 0x00, 0x20, 0x00, 0x8f, 0xb2, 0x1f, 0x21, 0x22, 0x11, 0x12, 0x39, 0xb0, + 0x1f, 0x10, 0xb0, 0x0d, 0xd0, 0x00, 0xb0, 0x13, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, + 0xb2, 0x2f, 0x13, 0x01, 0x5d, 0xb2, 0x0f, 0x13, 0x01, 0x5d, 0xb2, 0x16, + 0x02, 0x13, 0x11, 0x12, 0x39, 0xb0, 0x16, 0x2f, 0xb1, 0x00, 0x07, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x0c, 0x02, + 0x11, 0x12, 0x39, 0xb2, 0x0e, 0x0c, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x0f, + 0xd0, 0xb0, 0x16, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x06, 0x10, 0xb1, 0x1a, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, + 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x27, 0x06, 0x23, 0x22, 0x02, + 0x11, 0x34, 0x12, 0x33, 0x32, 0x17, 0x35, 0x23, 0x35, 0x33, 0x35, 0x21, + 0x15, 0x33, 0x01, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, + 0x04, 0xaf, 0x9e, 0xfe, 0xfb, 0x0e, 0x6c, 0xaa, 0xbf, 0xe7, 0xe3, 0xc5, + 0x9e, 0x67, 0xfc, 0xfc, 0x01, 0x22, 0x9e, 0xfc, 0xb4, 0x6a, 0x65, 0x86, + 0x37, 0x36, 0x85, 0xd1, 0x04, 0xc2, 0xfb, 0x3e, 0x73, 0x87, 0x01, 0x2d, + 0x01, 0x0c, 0xfd, 0x01, 0x2c, 0x76, 0xea, 0xb7, 0x87, 0x87, 0xfc, 0x97, + 0x98, 0xa2, 0x71, 0x01, 0xab, 0x71, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, + 0x05, 0xad, 0x05, 0xb0, 0x00, 0x13, 0x00, 0x17, 0x00, 0x6d, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, + 0x59, 0xb2, 0x14, 0x08, 0x0f, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x2f, 0xb2, + 0x10, 0x14, 0x0f, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x2f, 0xb0, 0x00, 0xd0, + 0xb0, 0x10, 0x10, 0xb1, 0x17, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x05, 0xd0, + 0xb0, 0x14, 0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x10, 0x10, + 0xb0, 0x0d, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x12, 0xd0, 0x30, 0x31, 0x01, + 0x33, 0x15, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x23, 0x35, + 0x33, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x01, 0x21, 0x35, 0x21, 0x05, + 0x33, 0x7a, 0x7a, 0xfe, 0xd4, 0xfd, 0xb7, 0xfe, 0xd3, 0x71, 0x71, 0x01, + 0x2d, 0x02, 0x49, 0x01, 0x2c, 0xfc, 0x8b, 0x02, 0x49, 0xfd, 0xb7, 0x04, + 0xc8, 0xae, 0xfb, 0xe6, 0x02, 0x70, 0xfd, 0x90, 0x04, 0x1a, 0xae, 0xe8, + 0xe8, 0xe8, 0xfd, 0xb2, 0xb8, 0x00, 0x00, 0x01, 0x00, 0x86, 0x00, 0x00, + 0x01, 0xa7, 0x04, 0x3a, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0x30, + 0x31, 0x21, 0x21, 0x11, 0x21, 0x01, 0xa7, 0xfe, 0xdf, 0x01, 0x21, 0x04, + 0x3a, 0x00, 0x00, 0x01, 0x00, 0x82, 0x00, 0x00, 0x04, 0x92, 0x04, 0x3a, + 0x00, 0x0c, 0x00, 0x60, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, + 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x02, + 0x08, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x2f, 0xb4, 0xdf, 0x06, 0xef, 0x06, + 0x02, 0x5d, 0xb2, 0x5f, 0x06, 0x01, 0x5d, 0xb1, 0x01, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x01, 0x06, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, + 0x01, 0x21, 0x01, 0x01, 0x21, 0x02, 0x19, 0x76, 0xfe, 0xdf, 0x01, 0x21, + 0x57, 0x01, 0x1a, 0x01, 0x6d, 0xfe, 0x84, 0x01, 0x8d, 0xfe, 0x8d, 0x01, + 0x8f, 0xfe, 0x71, 0x04, 0x3a, 0xfe, 0x69, 0x01, 0x97, 0xfd, 0xf7, 0xfd, + 0xcf, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x04, 0x4c, 0x05, 0xb0, + 0x00, 0x0d, 0x00, 0x5d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, + 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, + 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x0c, 0x06, 0x11, + 0x12, 0x39, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, 0x01, 0x10, 0xb1, + 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x03, 0xd0, 0xb0, 0x06, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x08, 0xd0, 0xb0, + 0x09, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x0a, 0xd0, 0x30, + 0x31, 0x01, 0x37, 0x15, 0x07, 0x11, 0x21, 0x15, 0x21, 0x11, 0x07, 0x35, + 0x37, 0x11, 0x21, 0x01, 0xcf, 0xd7, 0xd7, 0x02, 0x7d, 0xfc, 0x57, 0x86, + 0x86, 0x01, 0x2c, 0x03, 0x7f, 0x3e, 0xa6, 0x3e, 0xfe, 0x18, 0xf1, 0x02, + 0x82, 0x26, 0xa6, 0x26, 0x02, 0x88, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x00, + 0x02, 0x51, 0x06, 0x00, 0x00, 0x0b, 0x00, 0x4b, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x1a, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, + 0x01, 0x04, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0xd0, + 0xb0, 0x01, 0x10, 0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0xd0, 0xb0, 0x06, 0xd0, 0xb0, 0x07, 0xd0, + 0xb0, 0x00, 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x08, 0xd0, 0x30, 0x31, 0x01, + 0x37, 0x15, 0x07, 0x11, 0x21, 0x11, 0x07, 0x35, 0x37, 0x11, 0x21, 0x01, + 0xc3, 0x8e, 0x8e, 0xfe, 0xdf, 0x84, 0x84, 0x01, 0x21, 0x03, 0x8e, 0x2f, + 0xa6, 0x2f, 0xfd, 0x18, 0x02, 0x88, 0x2c, 0xa6, 0x2c, 0x02, 0xd2, 0x00, + 0x00, 0x01, 0x00, 0x80, 0xfe, 0x4b, 0x05, 0x20, 0x05, 0xb0, 0x00, 0x13, + 0x00, 0x5b, 0xb2, 0x06, 0x14, 0x15, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, + 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x39, + 0xb2, 0x12, 0x0e, 0x00, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x11, 0x14, + 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x35, 0x01, 0x11, + 0x21, 0x11, 0x21, 0x01, 0x11, 0x05, 0x20, 0xcc, 0xb7, 0x51, 0x42, 0x0e, + 0x2e, 0x35, 0x79, 0xfd, 0xb9, 0xfe, 0xd3, 0x01, 0x2d, 0x02, 0x47, 0x05, + 0xb0, 0xfa, 0x36, 0xc4, 0xd7, 0x11, 0xee, 0x0c, 0xae, 0x14, 0x03, 0xd4, + 0xfc, 0x2c, 0x05, 0xb0, 0xfc, 0x2d, 0x03, 0xd3, 0x00, 0x01, 0x00, 0x6c, + 0xfe, 0x4b, 0x04, 0x17, 0x04, 0x4e, 0x00, 0x1a, 0x00, 0x63, 0xb2, 0x0d, + 0x1b, 0x1c, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, + 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0c, 0x3e, 0x59, 0xb2, 0x01, + 0x18, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x0f, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, + 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x06, 0x23, + 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, + 0x07, 0x11, 0x21, 0x11, 0x01, 0x79, 0x0d, 0x71, 0xc4, 0xac, 0xaf, 0x01, + 0xca, 0xb3, 0x4e, 0x41, 0x0e, 0x2d, 0x36, 0x79, 0x4e, 0x56, 0x80, 0x44, + 0xfe, 0xdf, 0x04, 0x3a, 0x98, 0xac, 0xdc, 0xd8, 0xfd, 0x44, 0xc2, 0xd1, + 0x11, 0xe7, 0x0c, 0xad, 0x02, 0xb0, 0x6c, 0x63, 0x57, 0xfc, 0xf4, 0x04, + 0x3a, 0x00, 0x00, 0x02, 0x00, 0x60, 0xff, 0xec, 0x07, 0x54, 0x05, 0xc4, + 0x00, 0x17, 0x00, 0x23, 0x00, 0x96, 0xb2, 0x01, 0x24, 0x25, 0x11, 0x12, + 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x1a, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, + 0xb0, 0x0e, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x13, 0x00, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x13, + 0x2f, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x1d, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x21, 0x21, 0x06, 0x23, 0x22, 0x24, 0x02, 0x27, 0x11, 0x34, 0x12, 0x24, + 0x33, 0x32, 0x17, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, + 0x05, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x14, 0x16, + 0x07, 0x54, 0xfc, 0x8a, 0xa7, 0x79, 0xae, 0xfe, 0xec, 0x99, 0x03, 0x97, + 0x01, 0x15, 0xb0, 0x7b, 0xa7, 0x03, 0x74, 0xfd, 0x5f, 0x02, 0x3f, 0xfd, + 0xc1, 0x02, 0xa3, 0xfb, 0x6a, 0x5e, 0x68, 0x70, 0x58, 0x96, 0xa4, 0x01, + 0xa7, 0x14, 0x93, 0x01, 0x0b, 0xa9, 0x01, 0x3d, 0xad, 0x01, 0x11, 0x96, + 0x14, 0xf3, 0xfe, 0xa5, 0xeb, 0xfe, 0x7a, 0x1d, 0x0d, 0x03, 0xec, 0x0e, + 0xb9, 0xad, 0xfe, 0xcb, 0xb0, 0xbc, 0x00, 0x03, 0x00, 0x53, 0xff, 0xec, + 0x06, 0xeb, 0x04, 0x50, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x31, 0x00, 0x91, + 0xb2, 0x06, 0x32, 0x33, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb0, 0x23, + 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x2d, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0c, 0x3e, 0x59, 0xb2, + 0x06, 0x08, 0x17, 0x11, 0x12, 0x39, 0xb2, 0x2e, 0x08, 0x17, 0x11, 0x12, + 0x39, 0xb0, 0x2e, 0x2f, 0xb2, 0x8f, 0x2e, 0x01, 0x5d, 0xb4, 0x1f, 0x2e, + 0x2f, 0x2e, 0x02, 0x71, 0xb1, 0x0c, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x19, 0x08, 0x17, 0x11, + 0x12, 0x39, 0xb0, 0x21, 0xd0, 0xb0, 0x04, 0x10, 0xb1, 0x27, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2a, 0xd0, 0x30, + 0x31, 0x13, 0x34, 0x36, 0x36, 0x33, 0x32, 0x17, 0x36, 0x17, 0x32, 0x12, + 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, + 0x23, 0x22, 0x27, 0x06, 0x20, 0x00, 0x11, 0x05, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x25, 0x22, 0x06, 0x07, 0x21, + 0x35, 0x34, 0x26, 0x53, 0x7a, 0xe8, 0x9a, 0xe7, 0x8c, 0x86, 0xd7, 0xd6, + 0xf6, 0xfd, 0x72, 0x10, 0x83, 0x67, 0x55, 0x86, 0x52, 0x4f, 0x49, 0xda, + 0x77, 0xe9, 0x8c, 0x8a, 0xfe, 0x2e, 0xfe, 0xeb, 0x01, 0x21, 0x71, 0x6c, + 0x6a, 0x72, 0x74, 0x6a, 0x69, 0x72, 0x03, 0xab, 0x4d, 0x62, 0x10, 0x01, + 0x6f, 0x5d, 0x02, 0x27, 0xa1, 0xfb, 0x8b, 0x95, 0x97, 0x02, 0xfe, 0xfe, + 0xec, 0x9e, 0x71, 0x7d, 0x21, 0x2d, 0xbb, 0x3a, 0x41, 0x95, 0x95, 0x01, + 0x2b, 0x01, 0x03, 0x08, 0x9b, 0xa3, 0xa1, 0xb2, 0x99, 0xa4, 0xa4, 0xa4, + 0x72, 0x6b, 0x1a, 0x61, 0x62, 0x00, 0x00, 0x01, 0x00, 0x75, 0x00, 0x00, + 0x02, 0xa3, 0x06, 0x15, 0x00, 0x0c, 0x00, 0x33, 0xb2, 0x03, 0x0d, 0x0e, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x09, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, + 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x15, 0x11, + 0x75, 0xcf, 0xbf, 0x40, 0x60, 0x18, 0x2c, 0x35, 0x94, 0x04, 0x96, 0xb7, + 0xc8, 0x15, 0xdf, 0x0a, 0x99, 0xfb, 0x6e, 0x00, 0x00, 0x02, 0x00, 0x4b, + 0xff, 0xec, 0x05, 0x2e, 0x05, 0xc4, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x5e, + 0xb2, 0x00, 0x1e, 0x1f, 0x11, 0x12, 0x39, 0xb0, 0x16, 0xd0, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, + 0x59, 0xb2, 0x05, 0x0e, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x2f, 0xb0, + 0x0e, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x19, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x20, + 0x00, 0x11, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x24, + 0x33, 0x20, 0x00, 0x11, 0x15, 0x14, 0x02, 0x04, 0x03, 0x32, 0x36, 0x37, + 0x21, 0x15, 0x14, 0x16, 0x02, 0xbd, 0xfe, 0xd7, 0xfe, 0xb7, 0x03, 0xb6, + 0x07, 0xce, 0xc0, 0xcc, 0xb7, 0x31, 0x40, 0x01, 0x0e, 0x75, 0x01, 0x42, + 0x01, 0x71, 0xa2, 0xfe, 0xe0, 0xaf, 0x85, 0xaa, 0x12, 0xfd, 0x79, 0xa8, + 0x14, 0x01, 0x66, 0x01, 0x4d, 0x9b, 0xbc, 0xc7, 0x3f, 0xf7, 0x1e, 0x31, + 0xfe, 0x94, 0xfe, 0xbd, 0x8a, 0xbf, 0xfe, 0xcd, 0xad, 0x01, 0x05, 0xb4, + 0xa1, 0x1f, 0x98, 0x9e, 0x00, 0x01, 0xff, 0xdd, 0xfe, 0x4b, 0x02, 0xe6, + 0x06, 0x15, 0x00, 0x1d, 0x00, 0x74, 0xb2, 0x13, 0x1e, 0x1f, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, + 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, + 0x0f, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, + 0xb1, 0x1c, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, + 0x1b, 0xb1, 0x05, 0x0e, 0x3e, 0x59, 0xb0, 0x1c, 0x10, 0xb1, 0x00, 0x09, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, + 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x00, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x0e, 0xd0, 0xb0, 0x14, 0x10, + 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x23, 0x03, 0x14, 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, + 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, + 0x17, 0x07, 0x26, 0x23, 0x22, 0x15, 0x15, 0x33, 0x02, 0xa9, 0xcf, 0x01, + 0xc1, 0xac, 0x4e, 0x41, 0x0f, 0x1c, 0x7e, 0x32, 0xa1, 0xa1, 0x02, 0xd1, + 0xbc, 0x3f, 0x60, 0x18, 0x2a, 0x39, 0x91, 0xcf, 0x03, 0x66, 0xfc, 0x6b, + 0xbc, 0xca, 0x11, 0xe5, 0x0c, 0x4f, 0x4b, 0x03, 0x97, 0xd4, 0x64, 0xb3, + 0xc4, 0x15, 0xe0, 0x0a, 0x96, 0x5a, 0x00, 0x02, 0x00, 0x50, 0xff, 0xec, + 0x05, 0xbb, 0x06, 0x1e, 0x00, 0x18, 0x00, 0x26, 0x00, 0x5e, 0xb2, 0x04, + 0x27, 0x28, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x23, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb2, 0x10, 0x0d, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x2f, + 0xb1, 0x16, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x0d, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x23, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x04, + 0x23, 0x22, 0x24, 0x02, 0x27, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x16, + 0x17, 0x36, 0x36, 0x35, 0x33, 0x10, 0x07, 0x16, 0x17, 0x05, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x05, + 0x28, 0x98, 0xfe, 0xe5, 0xb7, 0xb5, 0xfe, 0xe4, 0x9c, 0x01, 0x9b, 0x01, + 0x1b, 0xb6, 0x89, 0xe1, 0x52, 0x49, 0x36, 0xc4, 0xe4, 0x4f, 0x02, 0xfe, + 0xd0, 0xa4, 0x98, 0x97, 0xa4, 0x01, 0xa4, 0x9a, 0x97, 0xa2, 0x01, 0x02, + 0xb7, 0xd7, 0xfe, 0xbc, 0xb0, 0xae, 0x01, 0x43, 0xd2, 0x48, 0xd7, 0x01, + 0x47, 0xaf, 0x61, 0x5b, 0x12, 0x90, 0x74, 0xfe, 0xa8, 0x4d, 0xa5, 0xd3, + 0x08, 0xe5, 0xee, 0xeb, 0xe3, 0x47, 0xdf, 0xf6, 0xed, 0xe3, 0x00, 0x02, + 0x00, 0x40, 0xff, 0xec, 0x04, 0xb7, 0x04, 0x9f, 0x00, 0x16, 0x00, 0x22, + 0x00, 0x5e, 0xb2, 0x13, 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x10, + 0xb0, 0x1a, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, + 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x04, 0x13, 0x11, 0x12, + 0x39, 0xb0, 0x06, 0x2f, 0xb1, 0x0c, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x13, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x20, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x13, 0x34, 0x36, 0x36, 0x33, 0x32, 0x17, 0x36, 0x36, 0x35, 0x33, 0x10, + 0x07, 0x16, 0x15, 0x15, 0x14, 0x06, 0x06, 0x23, 0x22, 0x00, 0x27, 0x25, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x40, + 0x7d, 0xea, 0x99, 0xed, 0x8c, 0x2e, 0x20, 0xb0, 0xb1, 0x3b, 0x7d, 0xe7, + 0x9b, 0xe0, 0xfe, 0xea, 0x0b, 0x01, 0x21, 0x74, 0x6c, 0x6a, 0x74, 0x74, + 0x6c, 0x6a, 0x74, 0x02, 0x27, 0xa2, 0xfc, 0x89, 0x9b, 0x1d, 0x79, 0x56, + 0xfe, 0xf0, 0x50, 0x7b, 0x9d, 0x15, 0xa2, 0xfc, 0x88, 0x01, 0x16, 0xec, + 0x24, 0x9a, 0xa3, 0xa2, 0xb0, 0x96, 0xa7, 0xa5, 0x00, 0x01, 0x00, 0x74, + 0xff, 0xec, 0x06, 0x54, 0x06, 0x01, 0x00, 0x19, 0x00, 0x56, 0xb2, 0x0d, + 0x1a, 0x1b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x00, + 0x0d, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x2f, 0xb1, 0x09, 0x0a, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x16, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x15, 0x3e, 0x02, 0x35, 0x33, 0x14, 0x06, 0x07, 0x11, 0x14, 0x00, + 0x21, 0x22, 0x00, 0x27, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x13, + 0x11, 0x04, 0xd0, 0x4b, 0x53, 0x25, 0xc1, 0xbb, 0xc9, 0xfe, 0xd5, 0xfe, + 0xfd, 0xff, 0xfe, 0xd4, 0x03, 0x01, 0x2c, 0x89, 0x79, 0xfd, 0x04, 0x05, + 0xb0, 0xe4, 0x06, 0x3d, 0x6f, 0x83, 0xf0, 0xda, 0x09, 0xfd, 0xc3, 0xef, + 0xfe, 0xea, 0x01, 0x0e, 0xec, 0x03, 0xca, 0xfc, 0x3f, 0x8f, 0x83, 0x01, + 0x0a, 0x03, 0xc9, 0x00, 0x00, 0x01, 0x00, 0x68, 0xff, 0xec, 0x05, 0x37, + 0x04, 0x99, 0x00, 0x18, 0x00, 0x6a, 0xb2, 0x07, 0x19, 0x1a, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, + 0x13, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, + 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb2, 0x15, 0x13, 0x04, 0x11, 0x12, + 0x39, 0xb0, 0x15, 0x2f, 0xb1, 0x03, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x13, 0x04, 0x11, 0x12, 0x39, 0xb0, + 0x08, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x11, 0x21, 0x27, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x11, 0x21, 0x11, 0x14, 0x33, 0x32, 0x37, 0x11, + 0x21, 0x15, 0x36, 0x36, 0x35, 0x05, 0x37, 0x8f, 0x99, 0xfe, 0xf0, 0x08, + 0x6b, 0xbd, 0xae, 0xb7, 0x02, 0x01, 0x21, 0x9a, 0x93, 0x37, 0x01, 0x22, + 0x44, 0x37, 0x04, 0x99, 0xb6, 0xaf, 0x10, 0xfc, 0xdc, 0x6e, 0x82, 0xc8, + 0xc1, 0x02, 0xc5, 0xfd, 0x45, 0xa9, 0x66, 0x02, 0xfe, 0x8b, 0x0f, 0x5e, + 0x7d, 0x00, 0x00, 0x01, 0xff, 0xad, 0xfe, 0x4b, 0x01, 0xb7, 0x04, 0x3a, + 0x00, 0x0c, 0x00, 0x30, 0xb2, 0x03, 0x0d, 0x0e, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, + 0x3e, 0x59, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x06, 0x06, 0x23, 0x22, 0x27, 0x37, + 0x16, 0x33, 0x32, 0x35, 0x11, 0x01, 0xb7, 0x01, 0xc7, 0xb4, 0x4d, 0x41, + 0x0e, 0x2c, 0x36, 0x79, 0x04, 0x3a, 0xfb, 0xa2, 0xc0, 0xd1, 0x11, 0xe5, + 0x0c, 0xb0, 0x04, 0x55, 0x00, 0x02, 0x00, 0x4e, 0xff, 0xec, 0x04, 0x01, + 0x04, 0x4f, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x68, 0xb2, 0x08, 0x1f, 0x20, + 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x17, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, + 0xb2, 0x0d, 0x00, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, + 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x13, 0x0d, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb1, + 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x0d, 0x10, 0xb1, 0x1a, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x00, 0x15, 0x15, 0x14, 0x06, 0x06, + 0x27, 0x22, 0x02, 0x35, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x07, 0x07, + 0x27, 0x36, 0x36, 0x13, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x02, + 0x00, 0xe3, 0x01, 0x1e, 0x79, 0xdf, 0x8f, 0xd8, 0xf4, 0x02, 0x8e, 0x10, + 0x83, 0x67, 0x8c, 0x65, 0x3c, 0x4f, 0x49, 0xd8, 0x93, 0x4d, 0x62, 0x10, + 0xfe, 0x91, 0x5c, 0x04, 0x4f, 0xfe, 0xd9, 0xf5, 0x1d, 0x9f, 0xff, 0x8c, + 0x01, 0x01, 0x03, 0xea, 0x9e, 0x70, 0x7e, 0x30, 0x1e, 0xbb, 0x3a, 0x42, + 0xfc, 0x87, 0x72, 0x6b, 0x1a, 0x60, 0x63, 0x00, 0x00, 0x01, 0x00, 0x7b, + 0x04, 0xdc, 0x03, 0x77, 0x06, 0x00, 0x00, 0x08, 0x00, 0x39, 0x00, 0xb0, + 0x04, 0x2f, 0xb2, 0x0f, 0x04, 0x01, 0x5d, 0xb0, 0x07, 0xd0, 0xb0, 0x07, + 0x2f, 0xb4, 0x0f, 0x07, 0x1f, 0x07, 0x02, 0x5d, 0xb2, 0x05, 0x04, 0x07, + 0x11, 0x12, 0x39, 0x19, 0xb0, 0x05, 0x2f, 0x18, 0xb0, 0x01, 0xd0, 0x19, + 0xb0, 0x01, 0x2f, 0x18, 0xb0, 0x04, 0x10, 0xb0, 0x02, 0xd0, 0xb2, 0x03, + 0x04, 0x07, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x15, 0x23, 0x27, 0x07, + 0x23, 0x35, 0x01, 0x33, 0x03, 0x77, 0xe6, 0x9a, 0x9a, 0xe2, 0x01, 0x28, + 0xa8, 0x04, 0xe8, 0x0c, 0x91, 0x91, 0x10, 0x01, 0x14, 0x00, 0x00, 0x01, + 0x00, 0x55, 0x04, 0xdd, 0x03, 0x68, 0x06, 0x01, 0x00, 0x08, 0x00, 0x25, + 0x00, 0xb0, 0x04, 0x2f, 0xb2, 0x0f, 0x04, 0x01, 0x5d, 0xb0, 0x01, 0xd0, + 0xb0, 0x01, 0x2f, 0xb4, 0x0f, 0x01, 0x1f, 0x01, 0x02, 0x5d, 0xb2, 0x00, + 0x04, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x08, 0xd0, 0xb0, 0x08, 0x2f, 0x30, + 0x31, 0x01, 0x37, 0x33, 0x15, 0x01, 0x23, 0x01, 0x35, 0x33, 0x01, 0xdf, + 0x92, 0xf7, 0xfe, 0xd2, 0xb7, 0xfe, 0xd2, 0xf7, 0x05, 0x72, 0x8f, 0x0b, + 0xfe, 0xe7, 0x01, 0x1b, 0x09, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x05, 0x07, + 0x03, 0x5a, 0x05, 0xae, 0x03, 0x06, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0a, + 0x00, 0xb0, 0x01, 0x2f, 0xb1, 0x02, 0x07, 0xf4, 0x30, 0x31, 0x00, 0x01, + 0x00, 0x6a, 0x04, 0xcd, 0x03, 0x1e, 0x05, 0xf6, 0x00, 0x0c, 0x00, 0x27, + 0xb2, 0x09, 0x0d, 0x0e, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x03, 0x2f, 0xb2, + 0x0f, 0x03, 0x01, 0x5d, 0xb1, 0x09, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x06, 0x2f, 0xb0, 0x0c, + 0xd0, 0x30, 0x31, 0x01, 0x14, 0x06, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x35, 0x03, 0x1e, 0xbf, 0xfe, 0xca, 0xbf, 0xcd, 0x4b, + 0x42, 0x41, 0x4a, 0x05, 0xf6, 0x85, 0xa4, 0xa2, 0x87, 0x3f, 0x45, 0x45, + 0x3f, 0x00, 0x00, 0x01, 0x00, 0x76, 0x04, 0xd6, 0x01, 0x9e, 0x05, 0xe7, + 0x00, 0x09, 0x00, 0x17, 0x00, 0xb0, 0x05, 0x2f, 0xb2, 0x0f, 0x05, 0x01, + 0x5d, 0xb1, 0x00, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x34, + 0x36, 0x01, 0x0a, 0x45, 0x4f, 0x4f, 0x45, 0x44, 0x50, 0x51, 0x05, 0xe7, + 0x4d, 0x78, 0x4c, 0x4c, 0x78, 0x4d, 0x00, 0x02, 0x00, 0x77, 0x04, 0x64, + 0x02, 0x35, 0x05, 0xfa, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x2a, 0xb2, 0x03, + 0x16, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb0, 0x14, 0xd0, 0x00, + 0xb0, 0x09, 0x2f, 0xb0, 0x03, 0xd0, 0xb0, 0x03, 0x2f, 0xb2, 0x3f, 0x03, + 0x01, 0x5d, 0xb0, 0x09, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x03, 0x10, 0xb0, + 0x14, 0xd0, 0x30, 0x31, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x22, 0x06, 0x77, 0x82, 0x5d, 0x5c, 0x83, 0x80, 0x5f, 0x61, 0x7e, 0x73, + 0x3a, 0x64, 0x3a, 0x3b, 0x62, 0x3b, 0x05, 0x2d, 0x56, 0x77, 0x75, 0x58, + 0x55, 0x74, 0x76, 0x53, 0x2c, 0x3f, 0x3f, 0x2c, 0x2e, 0x3f, 0x3f, 0x00, + 0x00, 0x01, 0x00, 0x21, 0xfe, 0x5a, 0x01, 0xa9, 0x00, 0x3c, 0x00, 0x0f, + 0x00, 0x1a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, + 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, + 0xdc, 0x59, 0x30, 0x31, 0x21, 0x06, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, + 0x17, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x01, 0x94, 0x4a, 0x50, + 0x42, 0x21, 0x2f, 0x1d, 0x49, 0x5c, 0x64, 0x7f, 0xdf, 0x2a, 0x51, 0x35, + 0x41, 0x14, 0x9d, 0x2c, 0x6f, 0x62, 0xac, 0x65, 0x00, 0x01, 0x00, 0x75, + 0x04, 0xe0, 0x03, 0x66, 0x05, 0xff, 0x00, 0x17, 0x00, 0x42, 0x00, 0xb0, + 0x03, 0x2f, 0xb0, 0x08, 0xd0, 0xb0, 0x08, 0x2f, 0xb6, 0x0f, 0x08, 0x1f, + 0x08, 0x2f, 0x08, 0x03, 0x5d, 0xb0, 0x03, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, + 0x0b, 0x2f, 0xb0, 0x08, 0x10, 0xb1, 0x0f, 0x07, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x14, 0x07, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb0, + 0x17, 0xd0, 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x23, + 0x22, 0x06, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, + 0x36, 0x35, 0x03, 0x66, 0x84, 0x5f, 0x26, 0x3b, 0x68, 0x2e, 0x1b, 0x23, + 0x31, 0xa8, 0x83, 0x5f, 0x1e, 0x35, 0x78, 0x2e, 0x19, 0x23, 0x33, 0x05, + 0xf4, 0x71, 0x99, 0x11, 0x38, 0x0d, 0x32, 0x2e, 0x0a, 0x6f, 0x9c, 0x0f, + 0x3a, 0x0c, 0x31, 0x2e, 0x00, 0x02, 0x00, 0x39, 0x04, 0xd2, 0x03, 0x7d, + 0x05, 0xff, 0x00, 0x03, 0x00, 0x07, 0x00, 0x40, 0x00, 0xb0, 0x02, 0x2f, + 0xb2, 0x0f, 0x02, 0x01, 0x5d, 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0xb4, + 0x0f, 0x00, 0x1f, 0x00, 0x02, 0x5d, 0xb0, 0x02, 0x10, 0xb0, 0x03, 0xd0, + 0x19, 0xb0, 0x03, 0x2f, 0x18, 0xb0, 0x00, 0x10, 0xb0, 0x05, 0xd0, 0xb0, + 0x05, 0x2f, 0xb0, 0x02, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x06, 0x2f, 0xb0, + 0x03, 0x10, 0xb0, 0x07, 0xd0, 0x19, 0xb0, 0x07, 0x2f, 0x18, 0x30, 0x31, + 0x01, 0x21, 0x01, 0x23, 0x03, 0x33, 0x03, 0x23, 0x02, 0x7a, 0x01, 0x03, + 0xfe, 0xf6, 0xda, 0xa6, 0xff, 0xe5, 0xd4, 0x05, 0xff, 0xfe, 0xd3, 0x01, + 0x2d, 0xfe, 0xd3, 0x00, 0x00, 0x02, 0x00, 0x8e, 0xfe, 0x71, 0x02, 0x03, + 0xff, 0xc7, 0x00, 0x09, 0x00, 0x13, 0x00, 0x29, 0xb2, 0x00, 0x14, 0x15, + 0x11, 0x12, 0x39, 0xb0, 0x0c, 0xd0, 0x00, 0x7d, 0xb0, 0x14, 0x2f, 0x18, + 0xb0, 0x00, 0xd0, 0x7c, 0xb0, 0x00, 0x2f, 0x18, 0xb0, 0x05, 0xd0, 0xb0, + 0x05, 0x2f, 0xb0, 0x0c, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x12, 0xd0, 0x30, + 0x31, 0x05, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x34, 0x36, 0x17, + 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x01, 0x4a, 0x51, + 0x68, 0x68, 0x51, 0x50, 0x6c, 0x6c, 0x05, 0x2b, 0x40, 0x28, 0x28, 0x40, + 0x2b, 0x39, 0x66, 0x8e, 0x62, 0x60, 0x92, 0x64, 0xad, 0x20, 0x2a, 0x2a, + 0x20, 0x22, 0x2b, 0x2b, 0x00, 0x01, 0xfc, 0x80, 0x04, 0xca, 0xfe, 0x81, + 0x06, 0x00, 0x00, 0x03, 0x00, 0x1c, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, + 0xd0, 0x19, 0xb0, 0x00, 0x2f, 0x18, 0xb0, 0x01, 0x10, 0xb0, 0x02, 0xd0, + 0xb0, 0x02, 0x2f, 0xb2, 0x0f, 0x02, 0x01, 0x5d, 0x30, 0x31, 0x01, 0x23, + 0x01, 0x21, 0xfe, 0x81, 0xed, 0xfe, 0xec, 0x01, 0x3c, 0x04, 0xca, 0x01, + 0x36, 0x00, 0x00, 0x01, 0xfd, 0x56, 0x04, 0xca, 0xff, 0x56, 0x06, 0x00, + 0x00, 0x03, 0x00, 0x1c, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x01, 0xd0, 0xb0, + 0x01, 0x2f, 0xb2, 0x0f, 0x01, 0x01, 0x5d, 0xb0, 0x02, 0x10, 0xb0, 0x03, + 0xd0, 0x19, 0xb0, 0x03, 0x2f, 0x18, 0x30, 0x31, 0x01, 0x21, 0x01, 0x23, + 0xfe, 0x1a, 0x01, 0x3c, 0xfe, 0xea, 0xea, 0x06, 0x00, 0xfe, 0xca, 0x00, + 0xff, 0xff, 0xfc, 0x61, 0x04, 0xe0, 0xff, 0x52, 0x05, 0xff, 0x00, 0x07, + 0x00, 0xa5, 0xfb, 0xec, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x1f, 0x04, 0xf3, + 0xfe, 0xa1, 0x06, 0x86, 0x00, 0x0e, 0x00, 0x29, 0x00, 0xb0, 0x00, 0x2f, + 0xb0, 0x07, 0xd0, 0xb0, 0x07, 0x2f, 0x40, 0x09, 0x0f, 0x07, 0x1f, 0x07, + 0x2f, 0x07, 0x3f, 0x07, 0x04, 0x5d, 0xb0, 0x06, 0xd0, 0xb2, 0x01, 0x00, + 0x06, 0x11, 0x12, 0x39, 0xb2, 0x0d, 0x00, 0x01, 0x11, 0x12, 0x39, 0x30, + 0x31, 0x01, 0x27, 0x36, 0x36, 0x35, 0x34, 0x23, 0x37, 0x32, 0x16, 0x15, + 0x14, 0x06, 0x07, 0x15, 0xfd, 0x32, 0x0f, 0x49, 0x41, 0x8e, 0x07, 0xbc, + 0xbf, 0x52, 0x44, 0x04, 0xf3, 0x86, 0x04, 0x1d, 0x20, 0x45, 0x87, 0x68, + 0x5b, 0x3b, 0x4b, 0x0a, 0x40, 0x00, 0x00, 0x02, 0xfb, 0xf0, 0x04, 0xe4, + 0xff, 0x56, 0x05, 0xee, 0x00, 0x03, 0x00, 0x07, 0x00, 0x37, 0x00, 0xb0, + 0x01, 0x2f, 0xb0, 0x00, 0xd0, 0x19, 0xb0, 0x00, 0x2f, 0x18, 0xb0, 0x01, + 0x10, 0xb0, 0x05, 0xd0, 0xb0, 0x05, 0x2f, 0xb0, 0x06, 0xd0, 0xb0, 0x06, + 0x2f, 0xb6, 0x0f, 0x06, 0x1f, 0x06, 0x2f, 0x06, 0x03, 0x5d, 0xb0, 0x03, + 0xd0, 0xb0, 0x03, 0x2f, 0xb0, 0x00, 0x10, 0xb0, 0x04, 0xd0, 0x19, 0xb0, + 0x04, 0x2f, 0x18, 0x30, 0x31, 0x01, 0x23, 0x01, 0x21, 0x01, 0x23, 0x03, + 0x21, 0xfe, 0x03, 0xef, 0xfe, 0xdc, 0x01, 0x1e, 0x02, 0x48, 0xe9, 0xf5, + 0x01, 0x18, 0x04, 0xe4, 0x01, 0x0a, 0xfe, 0xf6, 0x01, 0x0a, 0x00, 0x01, + 0xfd, 0x07, 0xfe, 0x8b, 0xfe, 0x4a, 0xff, 0xa0, 0x00, 0x0a, 0x00, 0x19, + 0x00, 0xb0, 0x03, 0x2f, 0xb4, 0x00, 0x03, 0x10, 0x03, 0x02, 0x5d, 0xb1, + 0x09, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x05, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, + 0xfd, 0x07, 0x5a, 0x47, 0x48, 0x5a, 0x59, 0x92, 0x58, 0xea, 0x3c, 0x4e, + 0x4e, 0x3c, 0x3b, 0x50, 0x50, 0x00, 0x00, 0x01, 0x00, 0xda, 0x04, 0xe8, + 0x02, 0x29, 0x06, 0x41, 0x00, 0x03, 0x00, 0x18, 0x00, 0xb0, 0x02, 0x2f, + 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0xb2, 0x03, 0x02, 0x00, 0x11, 0x12, + 0x39, 0x19, 0xb0, 0x03, 0x2f, 0x18, 0x30, 0x31, 0x01, 0x21, 0x03, 0x23, + 0x01, 0x23, 0x01, 0x06, 0xa3, 0xac, 0x06, 0x41, 0xfe, 0xa7, 0x00, 0x03, + 0x00, 0x66, 0x04, 0xd6, 0x03, 0xe4, 0x06, 0xd7, 0x00, 0x03, 0x00, 0x0d, + 0x00, 0x18, 0x00, 0x2d, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x03, 0xd0, 0xb0, + 0x03, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0xb0, 0x0b, 0x10, 0xb1, + 0x06, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x11, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x17, 0x2f, 0x30, + 0x31, 0x01, 0x21, 0x03, 0x23, 0x05, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x22, 0x26, 0x01, 0xfb, 0x01, 0x03, 0x9a, 0x94, 0xfe, 0x96, 0x4d, 0x7c, + 0x4c, 0x4c, 0x3e, 0x3d, 0x4e, 0x02, 0x69, 0x4f, 0x3b, 0x3a, 0x51, 0x4d, + 0x7c, 0x4c, 0x06, 0xd7, 0xfe, 0xb4, 0x36, 0x34, 0x4b, 0x4b, 0x68, 0x4a, + 0x49, 0x35, 0x35, 0x4a, 0x49, 0x36, 0x34, 0x4b, 0x4b, 0x00, 0xff, 0xff, + 0x00, 0x8c, 0x02, 0x1f, 0x01, 0xd3, 0x03, 0x54, 0x02, 0x06, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x84, 0x00, 0x00, 0x04, 0x3d, 0x05, 0xb0, + 0x00, 0x05, 0x00, 0x2c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, + 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x00, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x3d, 0xfd, 0x73, 0xfe, 0xd4, + 0x03, 0xb9, 0x04, 0xbd, 0xfb, 0x43, 0x05, 0xb0, 0x00, 0x02, 0x00, 0x14, + 0x00, 0x00, 0x05, 0xcd, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x06, 0x00, 0x30, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x0c, 0x3e, 0x59, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x02, 0x00, 0x11, 0x12, 0x39, 0x30, 0x31, + 0x01, 0x21, 0x01, 0x21, 0x25, 0x21, 0x01, 0x02, 0x59, 0x01, 0x37, 0x02, + 0x3d, 0xfa, 0x47, 0x01, 0x97, 0x02, 0x8d, 0xfe, 0xbb, 0x05, 0xb0, 0xfa, + 0x50, 0xf1, 0x03, 0x64, 0x00, 0x03, 0x00, 0x52, 0xff, 0xec, 0x05, 0x2a, + 0x05, 0xc4, 0x00, 0x03, 0x00, 0x14, 0x00, 0x22, 0x00, 0x6d, 0xb2, 0x08, + 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x01, 0xd0, 0xb0, + 0x08, 0x10, 0xb0, 0x1f, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, + 0x2f, 0x1b, 0xb1, 0x10, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb2, 0x02, 0x08, 0x10, + 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x02, 0x2f, 0x18, 0xb4, 0x30, 0x02, 0x40, + 0x02, 0x02, 0x5d, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x1f, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x21, 0x35, 0x21, 0x05, 0x14, 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x27, + 0x35, 0x34, 0x12, 0x24, 0x20, 0x04, 0x12, 0x15, 0x25, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x03, 0x85, + 0xfe, 0x81, 0x01, 0x7f, 0x01, 0xa5, 0x98, 0xfe, 0xe5, 0xb7, 0xb5, 0xfe, + 0xe4, 0x9c, 0x01, 0x9b, 0x01, 0x1b, 0x01, 0x6c, 0x01, 0x1b, 0x9b, 0xfe, + 0xd0, 0xa4, 0x98, 0x97, 0xa4, 0x01, 0xa4, 0x9a, 0x97, 0xa2, 0x01, 0x02, + 0x5f, 0xe8, 0x90, 0xd7, 0xfe, 0xbc, 0xb0, 0xae, 0x01, 0x43, 0xd2, 0x48, + 0xd7, 0x01, 0x47, 0xaf, 0xaf, 0xfe, 0xb9, 0xd6, 0x01, 0xe5, 0xee, 0xeb, + 0xe3, 0x47, 0xdf, 0xf6, 0xed, 0xe3, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, + 0x05, 0x1b, 0x05, 0xb0, 0x00, 0x06, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, + 0xb2, 0x00, 0x03, 0x01, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x01, 0x21, + 0x01, 0x21, 0x01, 0x21, 0x02, 0x95, 0xfe, 0xc0, 0xfe, 0xbb, 0x01, 0xe9, + 0x01, 0x38, 0x01, 0xea, 0xfe, 0xbb, 0x04, 0x13, 0xfb, 0xed, 0x05, 0xb0, + 0xfa, 0x50, 0x00, 0x03, 0x00, 0x5f, 0x00, 0x00, 0x04, 0x38, 0x05, 0xb0, + 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x6d, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb1, + 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x05, 0x02, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x2f, 0xb4, 0x6f, 0x05, + 0x7f, 0x05, 0x02, 0x5d, 0xb4, 0x7f, 0x05, 0x8f, 0x05, 0x02, 0x71, 0xb4, + 0xdf, 0x05, 0xef, 0x05, 0x02, 0x5d, 0xb2, 0xff, 0x05, 0x01, 0x71, 0xb2, + 0x8f, 0x05, 0x01, 0x72, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x37, 0x21, 0x15, + 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x5f, 0x03, 0xd9, + 0xfc, 0x27, 0x73, 0x02, 0xf3, 0xfd, 0x0d, 0x5b, 0x03, 0x96, 0xfc, 0x6a, + 0xf1, 0xf1, 0x03, 0x54, 0xe9, 0x03, 0x45, 0xf3, 0x00, 0x01, 0x00, 0x84, + 0x00, 0x00, 0x05, 0x24, 0x05, 0xb0, 0x00, 0x07, 0x00, 0x39, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x05, 0x24, 0xfe, 0xd3, 0xfd, 0xb9, 0xfe, 0xd4, 0x04, + 0xa0, 0x04, 0xbd, 0xfb, 0x43, 0x05, 0xb0, 0x00, 0x00, 0x01, 0x00, 0x48, + 0x00, 0x00, 0x04, 0x51, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x3e, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, + 0x59, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0xd0, 0x30, 0x31, + 0x01, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x01, 0x35, 0x21, 0x15, 0x21, + 0x01, 0x03, 0x3d, 0xfe, 0xa2, 0x02, 0x72, 0xfb, 0xf7, 0x01, 0xb7, 0xfe, + 0x49, 0x03, 0xf1, 0xfd, 0xab, 0x01, 0x59, 0x02, 0xd7, 0xfe, 0x1a, 0xf1, + 0x97, 0x02, 0x48, 0x02, 0x3a, 0x97, 0xf3, 0xfe, 0x29, 0x00, 0x00, 0x03, + 0x00, 0x49, 0x00, 0x00, 0x05, 0xea, 0x05, 0xb0, 0x00, 0x15, 0x00, 0x1c, + 0x00, 0x23, 0x00, 0x77, 0xb2, 0x0a, 0x24, 0x25, 0x11, 0x12, 0x39, 0xb0, + 0x0a, 0x10, 0xb0, 0x19, 0xd0, 0xb0, 0x0a, 0x10, 0xb0, 0x20, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, + 0x3e, 0x59, 0xb2, 0x13, 0x14, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x2f, + 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0xb2, 0x0b, 0x0a, 0x14, 0x11, 0x12, + 0x39, 0xb0, 0x0b, 0x2f, 0xb0, 0x08, 0xd0, 0xb0, 0x08, 0x2f, 0xb0, 0x0b, + 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x13, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x20, 0xd0, 0xb0, 0x19, 0x10, 0xb0, 0x21, + 0xd0, 0x30, 0x31, 0x01, 0x16, 0x04, 0x16, 0x15, 0x14, 0x06, 0x04, 0x07, + 0x15, 0x21, 0x35, 0x26, 0x24, 0x26, 0x35, 0x34, 0x12, 0x24, 0x37, 0x35, + 0x21, 0x01, 0x14, 0x16, 0x17, 0x11, 0x06, 0x06, 0x05, 0x34, 0x26, 0x27, + 0x11, 0x36, 0x36, 0x03, 0xb1, 0xab, 0x01, 0x02, 0x8c, 0x8c, 0xfe, 0xfb, + 0xa8, 0xfe, 0xd4, 0xaa, 0xfe, 0xfa, 0x8c, 0x8e, 0x01, 0x05, 0xa9, 0x01, + 0x2c, 0xfd, 0xbf, 0x94, 0x81, 0x83, 0x92, 0x03, 0x53, 0x8f, 0x83, 0x82, + 0x90, 0x05, 0x07, 0x07, 0x90, 0xff, 0xa2, 0x9f, 0xf8, 0x8d, 0x07, 0xa4, + 0xa4, 0x05, 0x8d, 0xf8, 0x9f, 0xa4, 0x01, 0x00, 0x91, 0x05, 0xa9, 0xfd, + 0x1d, 0x8a, 0x93, 0x07, 0x02, 0x59, 0x08, 0x9e, 0x8d, 0x8b, 0xa0, 0x08, + 0xfd, 0xa8, 0x08, 0x94, 0x00, 0x01, 0x00, 0x34, 0x00, 0x00, 0x05, 0x98, + 0x05, 0xb0, 0x00, 0x18, 0x00, 0x5d, 0xb2, 0x0c, 0x19, 0x1a, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, + 0x11, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, + 0xb1, 0x17, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, + 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x16, 0x04, 0x0b, 0x11, 0x12, + 0x39, 0xb0, 0x16, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, 0x16, 0x10, 0xb1, 0x0d, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, + 0xd0, 0x30, 0x31, 0x01, 0x36, 0x36, 0x35, 0x11, 0x21, 0x11, 0x02, 0x07, + 0x06, 0x07, 0x11, 0x21, 0x11, 0x26, 0x00, 0x03, 0x11, 0x21, 0x11, 0x14, + 0x16, 0x17, 0x11, 0x21, 0x03, 0x81, 0x76, 0x73, 0x01, 0x2e, 0x03, 0x9b, + 0x8c, 0xed, 0xfe, 0xd4, 0xfb, 0xfe, 0xdb, 0x01, 0x01, 0x2c, 0x81, 0x74, + 0x01, 0x2c, 0x02, 0x7a, 0x16, 0xb0, 0xa1, 0x01, 0xcf, 0xfe, 0x28, 0xfe, + 0xf5, 0x9f, 0x8e, 0x1a, 0xfe, 0x7a, 0x01, 0x85, 0x14, 0x01, 0x3c, 0x01, + 0x09, 0x01, 0xd2, 0xfe, 0x31, 0x9d, 0xb1, 0x17, 0x03, 0x34, 0x00, 0x01, + 0x00, 0x66, 0x00, 0x00, 0x04, 0xe9, 0x05, 0xc3, 0x00, 0x24, 0x00, 0x5e, + 0xb2, 0x06, 0x25, 0x26, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x0c, 0x3e, 0x59, 0xb0, + 0x0e, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x0d, 0xd0, 0xb0, 0x00, 0xd0, 0xb0, 0x19, 0x10, 0xb1, + 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x10, 0x10, 0xb0, 0x21, 0xd0, 0xb0, 0x22, 0xd0, 0x30, 0x31, 0x25, 0x36, + 0x13, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x12, 0x17, + 0x15, 0x21, 0x35, 0x33, 0x26, 0x02, 0x27, 0x35, 0x34, 0x12, 0x24, 0x33, + 0x32, 0x04, 0x12, 0x17, 0x15, 0x14, 0x02, 0x07, 0x33, 0x15, 0x21, 0x02, + 0xdf, 0xae, 0x0c, 0x01, 0x80, 0x73, 0x71, 0x81, 0x62, 0x60, 0xfe, 0x00, + 0xd9, 0x6d, 0x7c, 0x01, 0x92, 0x01, 0x08, 0xa7, 0xa5, 0x01, 0x07, 0x93, + 0x03, 0x7e, 0x6c, 0xd8, 0xfe, 0x08, 0xf8, 0x4b, 0x01, 0x89, 0x92, 0xb7, + 0xb9, 0xb9, 0xb7, 0x57, 0xe1, 0xfe, 0xf7, 0x25, 0xf8, 0xf4, 0x62, 0x01, + 0x17, 0x96, 0x59, 0xb1, 0x01, 0x1a, 0x9c, 0x99, 0xfe, 0xed, 0xac, 0x64, + 0x9b, 0xfe, 0xe9, 0x61, 0xf4, 0x00, 0x00, 0x02, 0x00, 0x49, 0xff, 0xeb, + 0x04, 0x7c, 0x04, 0x4e, 0x00, 0x16, 0x00, 0x20, 0x00, 0x7f, 0xb2, 0x1e, + 0x21, 0x22, 0x11, 0x12, 0x39, 0xb0, 0x1e, 0x10, 0xb0, 0x13, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x00, 0x0c, 0x11, + 0x12, 0x39, 0xb2, 0x15, 0x00, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x10, + 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x13, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x16, 0x33, 0x32, 0x37, 0x17, + 0x06, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x02, 0x27, 0x27, 0x10, 0x12, + 0x33, 0x32, 0x17, 0x37, 0x01, 0x10, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, + 0x22, 0x06, 0x04, 0x07, 0x03, 0x44, 0x0e, 0x08, 0x18, 0x32, 0x4b, 0xb5, + 0x44, 0x62, 0xb5, 0xb9, 0xe2, 0x0a, 0x01, 0xe4, 0xc4, 0xa5, 0x61, 0x15, + 0xfe, 0x5f, 0xcd, 0x77, 0x37, 0x37, 0x75, 0x63, 0x6c, 0x04, 0x3a, 0xfd, + 0x15, 0x76, 0x04, 0xd9, 0x19, 0xa7, 0xa6, 0x01, 0x07, 0xe5, 0x3d, 0x01, + 0x07, 0x01, 0x32, 0x96, 0x82, 0xfd, 0xc6, 0xfe, 0xd4, 0x60, 0x01, 0xc7, + 0x69, 0xac, 0x00, 0x02, 0x00, 0x8e, 0xfe, 0x6a, 0x04, 0x86, 0x05, 0xc4, + 0x00, 0x14, 0x00, 0x28, 0x00, 0x76, 0xb2, 0x00, 0x29, 0x2a, 0x11, 0x12, + 0x39, 0xb0, 0x18, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, + 0x2f, 0x1b, 0xb1, 0x0f, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x26, 0x0c, 0x00, + 0x11, 0x12, 0x39, 0xb0, 0x26, 0x2f, 0xb4, 0x6f, 0x26, 0x7f, 0x26, 0x02, + 0x5d, 0xb1, 0x25, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x06, 0x25, 0x26, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, + 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x0c, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x11, 0x21, 0x11, 0x34, 0x36, + 0x36, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x36, 0x02, 0x72, 0xd8, + 0xfd, 0x64, 0x5b, 0x7b, 0x83, 0xee, 0xd0, 0x9e, 0x7b, 0xfe, 0xdf, 0x7e, + 0xe0, 0x01, 0x3a, 0x63, 0x51, 0x55, 0x6e, 0x52, 0x86, 0x66, 0x78, 0x6d, + 0x6a, 0x61, 0x4e, 0xab, 0x05, 0xc4, 0xd0, 0xba, 0x64, 0xa2, 0x31, 0x2a, + 0xb8, 0x83, 0xcd, 0xe5, 0x4c, 0xfe, 0x32, 0x05, 0xa0, 0x7d, 0xcb, 0x72, + 0xfe, 0x60, 0x52, 0x64, 0x71, 0x63, 0xfd, 0x09, 0x3a, 0x73, 0x5a, 0x6c, + 0x79, 0xd3, 0x06, 0x00, 0x00, 0x01, 0x00, 0x11, 0xfe, 0x5f, 0x04, 0x06, + 0x04, 0x3a, 0x00, 0x08, 0x00, 0x38, 0xb2, 0x00, 0x09, 0x0a, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, + 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb2, 0x00, 0x07, 0x04, 0x11, 0x12, 0x39, + 0x30, 0x31, 0x01, 0x13, 0x21, 0x01, 0x11, 0x21, 0x11, 0x01, 0x21, 0x02, + 0x0f, 0xc9, 0x01, 0x2e, 0xfe, 0x95, 0xfe, 0xdf, 0xfe, 0x97, 0x01, 0x2e, + 0x01, 0x55, 0x02, 0xe5, 0xfb, 0xd4, 0xfe, 0x51, 0x01, 0xb8, 0x04, 0x23, + 0x00, 0x02, 0x00, 0x44, 0xff, 0xec, 0x04, 0x48, 0x06, 0x24, 0x00, 0x1d, + 0x00, 0x29, 0x00, 0x65, 0xb2, 0x14, 0x2a, 0x2b, 0x11, 0x12, 0x39, 0xb0, + 0x14, 0x10, 0xb0, 0x21, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, + 0x2f, 0x1b, 0xb1, 0x03, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0c, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, + 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x27, 0x03, 0x14, 0x11, 0x12, 0x39, 0xb0, 0x27, 0x10, 0xb1, 0x0e, 0x08, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1b, 0x27, + 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, + 0x33, 0x32, 0x17, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x04, + 0x16, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x36, + 0x37, 0x27, 0x26, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x27, 0x22, 0x06, 0xc0, 0xdd, 0xbe, 0x65, 0x5c, 0x44, 0x95, 0x57, 0x4b, + 0x56, 0x01, 0x3e, 0xd3, 0x64, 0xfe, 0xe7, 0xe7, 0xe9, 0xfe, 0xe5, 0xb3, + 0x88, 0x03, 0xbc, 0xa5, 0x7a, 0x69, 0x67, 0x78, 0x7e, 0x61, 0x68, 0x7b, + 0x04, 0xe1, 0x99, 0xaa, 0x19, 0x14, 0xde, 0x2f, 0x33, 0x2d, 0x50, 0x70, + 0xa8, 0xd6, 0x9e, 0xf3, 0xfe, 0xd3, 0x01, 0x23, 0xf8, 0x0b, 0x9e, 0xfc, + 0x23, 0x06, 0x61, 0xfd, 0xe3, 0x99, 0xac, 0xac, 0xad, 0x6f, 0xb8, 0x15, + 0xab, 0x00, 0x00, 0x01, 0x00, 0x5f, 0xff, 0xec, 0x04, 0x2f, 0x04, 0x4d, + 0x00, 0x26, 0x00, 0x85, 0xb2, 0x18, 0x27, 0x28, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x24, 0x2f, 0x1b, 0xb1, 0x24, 0x0c, + 0x3e, 0x59, 0xb2, 0x16, 0x08, 0x24, 0x11, 0x12, 0x39, 0xb0, 0x16, 0x2f, + 0xb2, 0xbf, 0x16, 0x01, 0x71, 0xb4, 0x1f, 0x16, 0x2f, 0x16, 0x02, 0x71, + 0xb2, 0x8f, 0x16, 0x01, 0x5d, 0xb1, 0x17, 0x08, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x17, 0x16, 0x11, 0x12, 0x39, + 0xb2, 0x0c, 0x16, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb1, 0x0f, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x24, + 0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x20, 0x24, 0x08, 0x11, 0x12, 0x39, 0xb4, 0x04, 0x20, 0x14, + 0x20, 0x02, 0x5d, 0x30, 0x31, 0x13, 0x34, 0x37, 0x26, 0x26, 0x35, 0x34, + 0x24, 0x33, 0x32, 0x04, 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x21, 0x14, 0x04, 0x23, 0x22, 0x24, 0x5f, 0xcc, 0x57, 0x62, + 0x01, 0x03, 0xe0, 0xc9, 0x01, 0x00, 0xfe, 0xdf, 0x65, 0x52, 0x51, 0x62, + 0x5a, 0x5a, 0xbb, 0xbf, 0xc4, 0x6d, 0x59, 0x5c, 0x6d, 0x01, 0x21, 0xfe, + 0xf6, 0xd0, 0xdf, 0xfe, 0xe9, 0x01, 0x32, 0xb8, 0x43, 0x24, 0x79, 0x48, + 0x93, 0xa8, 0xba, 0x91, 0x33, 0x3e, 0x42, 0x36, 0x34, 0x3e, 0xc1, 0x01, + 0x80, 0x37, 0x4b, 0x46, 0x35, 0x9a, 0xba, 0xb3, 0x00, 0x01, 0x00, 0x4c, + 0xfe, 0x7b, 0x03, 0xc8, 0x05, 0xb0, 0x00, 0x1e, 0x00, 0x49, 0xb2, 0x03, + 0x1f, 0x20, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, + 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x01, 0x1c, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x10, 0xb1, 0x08, 0x09, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x15, 0x01, 0x06, 0x06, 0x15, 0x14, 0x16, 0x16, 0x17, 0x16, 0x16, 0x15, + 0x14, 0x06, 0x07, 0x27, 0x36, 0x27, 0x36, 0x27, 0x27, 0x26, 0x26, 0x35, + 0x34, 0x12, 0x37, 0x37, 0x21, 0x35, 0x03, 0xc8, 0xfe, 0x99, 0x75, 0x56, + 0x48, 0xda, 0x35, 0x67, 0x55, 0x86, 0x62, 0x93, 0x60, 0x04, 0x04, 0x5d, + 0x5a, 0xb9, 0xa7, 0x7d, 0x93, 0xcb, 0xfd, 0xfa, 0x05, 0xb0, 0xa5, 0xfe, + 0x53, 0x85, 0xbd, 0x72, 0x52, 0x57, 0x3e, 0x13, 0x24, 0x6b, 0x53, 0x4b, + 0xc3, 0x45, 0x70, 0x65, 0x43, 0x3f, 0x1c, 0x17, 0x2f, 0xb4, 0x96, 0x99, + 0x01, 0x13, 0xae, 0xf0, 0xe8, 0x00, 0x00, 0x01, 0x00, 0x6c, 0xfe, 0x61, + 0x04, 0x17, 0x04, 0x4e, 0x00, 0x0f, 0x00, 0x54, 0xb2, 0x0a, 0x10, 0x11, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, + 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, + 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x00, 0x0d, + 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x36, 0x33, + 0x20, 0x13, 0x11, 0x21, 0x11, 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x11, + 0x01, 0x79, 0x0b, 0x77, 0xc0, 0x01, 0x54, 0x08, 0xfe, 0xde, 0x03, 0xa1, + 0x7f, 0x45, 0xfe, 0xdf, 0x04, 0x3a, 0x85, 0x99, 0xfe, 0x7b, 0xfb, 0x98, + 0x04, 0x5b, 0xa8, 0x5d, 0xfc, 0xf9, 0x04, 0x3a, 0x00, 0x03, 0x00, 0x70, + 0xff, 0xec, 0x04, 0x47, 0x05, 0xc4, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x1c, + 0x00, 0x6d, 0xb2, 0x03, 0x1d, 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, + 0xb0, 0x12, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x1a, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, + 0xb2, 0x16, 0x0a, 0x03, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x16, 0x2f, 0x18, + 0xb4, 0x30, 0x16, 0x40, 0x16, 0x02, 0x5d, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x12, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, + 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x10, 0x02, 0x23, 0x22, 0x00, 0x03, 0x11, 0x10, + 0x12, 0x33, 0x32, 0x00, 0x13, 0x05, 0x21, 0x15, 0x10, 0x33, 0x32, 0x13, + 0x01, 0x21, 0x35, 0x34, 0x26, 0x23, 0x22, 0x03, 0x04, 0x47, 0xfe, 0xec, + 0xe9, 0xff, 0x00, 0x04, 0xff, 0xec, 0xe7, 0x01, 0x01, 0x04, 0xfe, 0xdf, + 0xfe, 0x6b, 0xcc, 0xbb, 0x0d, 0xfe, 0x6c, 0x01, 0x95, 0x65, 0x66, 0xbc, + 0x0d, 0x02, 0x60, 0xfe, 0xd3, 0xfe, 0xb9, 0x01, 0x3e, 0x01, 0x25, 0x01, + 0x03, 0x01, 0x2e, 0x01, 0x44, 0xfe, 0xc7, 0xfe, 0xd9, 0xf8, 0x33, 0xfe, + 0x9c, 0x01, 0x30, 0x01, 0x46, 0x30, 0xb2, 0xad, 0xfe, 0xd3, 0x00, 0x01, + 0x00, 0x8a, 0xff, 0xf5, 0x02, 0x6f, 0x04, 0x3a, 0x00, 0x0c, 0x00, 0x29, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, + 0x0c, 0x3e, 0x59, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x03, 0x14, 0x16, 0x33, 0x32, 0x37, + 0x15, 0x06, 0x23, 0x20, 0x03, 0x11, 0x01, 0xac, 0x01, 0x2f, 0x41, 0x2c, + 0x28, 0x4e, 0x61, 0xfe, 0xcf, 0x05, 0x04, 0x3a, 0xfd, 0x18, 0x3c, 0x34, + 0x08, 0xdb, 0x1a, 0x01, 0x35, 0x03, 0x10, 0x00, 0x00, 0x01, 0x00, 0x07, + 0xff, 0xee, 0x04, 0x5b, 0x06, 0x0a, 0x00, 0x19, 0x00, 0x53, 0xb2, 0x02, + 0x1a, 0x1b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, + 0x0b, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x0f, 0x00, 0x10, 0x11, 0x12, 0x39, 0xb2, 0x12, 0x10, + 0x00, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x17, + 0x01, 0x17, 0x16, 0x17, 0x33, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x27, + 0x03, 0x03, 0x21, 0x01, 0x27, 0x26, 0x26, 0x23, 0x07, 0x27, 0x36, 0x01, + 0x1e, 0xc6, 0x45, 0x01, 0xa6, 0x10, 0x22, 0x34, 0x14, 0x10, 0x02, 0x29, + 0x45, 0x6f, 0x8d, 0x2a, 0xab, 0xdd, 0xfe, 0xc8, 0x01, 0x7f, 0x48, 0x14, + 0x3e, 0x2f, 0x3a, 0x06, 0x46, 0x06, 0x0a, 0xa3, 0xfb, 0xdd, 0x23, 0x48, + 0x01, 0x01, 0xe4, 0x07, 0x63, 0x71, 0x01, 0xd5, 0xfd, 0x69, 0x04, 0x21, + 0xa5, 0x32, 0x28, 0x03, 0xd7, 0x16, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x77, + 0x04, 0x01, 0x05, 0xc4, 0x00, 0x2c, 0x00, 0x5f, 0xb2, 0x1c, 0x2d, 0x2e, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x29, 0x2f, 0x1b, + 0xb1, 0x29, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, + 0x1b, 0xb1, 0x1b, 0x0c, 0x3e, 0x59, 0xb0, 0x29, 0x10, 0xb1, 0x03, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x29, + 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x2f, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1b, 0x10, 0xb1, 0x0f, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x24, + 0x0a, 0x09, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x33, 0x33, 0x15, 0x23, 0x20, 0x15, 0x14, 0x1f, 0x02, + 0x16, 0x07, 0x14, 0x06, 0x07, 0x27, 0x36, 0x35, 0x34, 0x27, 0x27, 0x2e, + 0x03, 0x35, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x16, + 0x17, 0x03, 0x9a, 0x5b, 0x54, 0x32, 0x73, 0x69, 0xec, 0x8f, 0x8b, 0xfe, + 0xbb, 0xf2, 0x94, 0x4c, 0xa7, 0x03, 0x89, 0x5e, 0x96, 0x5f, 0x75, 0x3b, + 0x6c, 0xaa, 0x75, 0x3e, 0x9b, 0x91, 0xd7, 0x01, 0x03, 0xda, 0x5c, 0x80, + 0x52, 0x04, 0xb0, 0x18, 0x0d, 0x4d, 0x3f, 0x94, 0xf1, 0xfa, 0xaf, 0x39, + 0x24, 0x19, 0x40, 0x9b, 0x4e, 0xc3, 0x42, 0x70, 0x63, 0x46, 0x42, 0x20, + 0x10, 0x21, 0x3f, 0x5f, 0x8f, 0x70, 0x8e, 0xbe, 0x2f, 0x4e, 0xbb, 0xb3, + 0xcd, 0x15, 0x1d, 0x00, 0x00, 0x01, 0x00, 0x34, 0xff, 0xf5, 0x04, 0xfe, + 0x04, 0x3a, 0x00, 0x14, 0x00, 0x5e, 0xb2, 0x0b, 0x15, 0x16, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, + 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, + 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x13, 0x10, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, + 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x00, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x0e, 0xd0, 0xb0, 0x11, 0xd0, 0xb0, + 0x12, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, + 0x15, 0x06, 0x23, 0x20, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x23, 0x35, + 0x21, 0x04, 0xe6, 0xab, 0x2d, 0x42, 0x2c, 0x28, 0x4e, 0x60, 0xfe, 0xd0, + 0x06, 0xfe, 0xec, 0xfe, 0xdf, 0xb1, 0x04, 0xb2, 0x03, 0x5d, 0xfd, 0xf5, + 0x3b, 0x35, 0x08, 0xdb, 0x1a, 0x01, 0x33, 0x02, 0x35, 0xfc, 0xa3, 0x03, + 0x5d, 0xdd, 0x00, 0x02, 0x00, 0x71, 0xfe, 0x60, 0x04, 0x3e, 0x04, 0x4e, + 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x59, 0xb2, 0x11, 0x1b, 0x1c, 0x11, 0x12, + 0x39, 0xb0, 0x11, 0x10, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb2, + 0x09, 0x00, 0x07, 0x11, 0x12, 0x39, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x17, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x32, 0x00, 0x11, 0x15, 0x14, 0x02, 0x23, 0x22, 0x27, 0x11, 0x21, 0x11, + 0x34, 0x00, 0x13, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x02, 0x5e, 0xe0, 0x01, 0x00, 0xe3, 0xc0, 0xa3, 0x66, 0xfe, + 0xdf, 0x01, 0x0e, 0x13, 0x38, 0x85, 0x64, 0x6a, 0x6b, 0x62, 0x59, 0x65, + 0x04, 0x4e, 0xfe, 0xce, 0xfe, 0xf1, 0x0d, 0xf8, 0xfe, 0xe4, 0x79, 0xfd, + 0xfb, 0x03, 0xd8, 0xf4, 0x01, 0x22, 0xfc, 0xe2, 0x5c, 0x97, 0xaa, 0xa2, + 0xad, 0xa5, 0x9e, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xfe, 0x8a, 0x03, 0xee, + 0x04, 0x4e, 0x00, 0x20, 0x00, 0x3c, 0xb2, 0x15, 0x21, 0x22, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x19, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb2, 0x04, 0x21, 0x00, 0x11, 0x12, + 0x39, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x19, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, 0x15, 0x21, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x04, 0x16, 0x16, 0x17, + 0x14, 0x06, 0x07, 0x27, 0x36, 0x27, 0x34, 0x27, 0x26, 0x26, 0x27, 0x35, + 0x34, 0x36, 0x36, 0x02, 0x33, 0xcb, 0xf0, 0xfe, 0xf0, 0x5b, 0x50, 0x64, + 0x6d, 0x01, 0x72, 0x01, 0x13, 0x6e, 0x39, 0x02, 0x89, 0x5a, 0x97, 0x5e, + 0x02, 0x6a, 0xed, 0xd8, 0x03, 0x79, 0xe3, 0x04, 0x4e, 0xe6, 0xc1, 0x56, + 0x67, 0x9c, 0x9b, 0x1f, 0x7c, 0x87, 0x4d, 0x3d, 0x5c, 0x47, 0x4f, 0xc6, + 0x3f, 0x72, 0x62, 0x46, 0x48, 0x18, 0x3e, 0xf4, 0xcb, 0x29, 0xa1, 0xfb, + 0x88, 0x00, 0x00, 0x02, 0x00, 0x42, 0xff, 0xec, 0x04, 0x7e, 0x04, 0x3a, + 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x4e, 0xb2, 0x0d, 0x1b, 0x1c, 0x11, 0x12, + 0x39, 0xb0, 0x0d, 0x10, 0xb0, 0x12, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x0d, + 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x18, 0xd0, 0x30, 0x31, + 0x01, 0x23, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x11, 0x35, 0x34, + 0x00, 0x33, 0x21, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x04, 0x7e, 0xfe, 0xaf, 0xfe, 0xf2, 0xe0, 0xe8, 0xfe, + 0xe9, 0x01, 0x13, 0xee, 0x02, 0x3b, 0xfc, 0xe5, 0x73, 0x6b, 0x62, 0x6b, + 0x6c, 0x63, 0x68, 0x74, 0x03, 0x50, 0x8e, 0xd9, 0xe4, 0xfe, 0xe7, 0x01, + 0x2a, 0x01, 0x04, 0x0d, 0xef, 0x01, 0x24, 0xfd, 0xd8, 0x9c, 0xa2, 0xa2, + 0xb1, 0x8e, 0x9b, 0x98, 0x00, 0x01, 0x00, 0x2c, 0xff, 0xec, 0x03, 0xfd, + 0x04, 0x3a, 0x00, 0x11, 0x00, 0x4b, 0xb2, 0x0b, 0x12, 0x13, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, + 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x05, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, + 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x0f, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, + 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, + 0x21, 0x35, 0x21, 0x03, 0xfd, 0xfe, 0x9c, 0x2a, 0x31, 0x2f, 0x33, 0x1e, + 0x55, 0x66, 0x96, 0xaa, 0x01, 0xfe, 0xb4, 0x03, 0xd1, 0x03, 0x52, 0xfd, + 0xf6, 0x3b, 0x36, 0x11, 0xdc, 0x20, 0xa9, 0xb2, 0x02, 0x0b, 0xe8, 0x00, + 0x00, 0x01, 0x00, 0x71, 0xff, 0xeb, 0x04, 0x10, 0x04, 0x3a, 0x00, 0x12, + 0x00, 0x3d, 0xb2, 0x0e, 0x13, 0x14, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, + 0x59, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x33, 0x32, 0x36, 0x35, 0x26, 0x03, + 0x21, 0x16, 0x11, 0x10, 0x00, 0x23, 0x22, 0x26, 0x27, 0x11, 0x01, 0x93, + 0x7e, 0x60, 0x7f, 0x04, 0x62, 0x01, 0x14, 0x72, 0xfe, 0xfc, 0xf1, 0xd0, + 0xd8, 0x02, 0x04, 0x3a, 0xfd, 0x6a, 0xd0, 0xcd, 0x95, 0xec, 0x01, 0x18, + 0xe4, 0xfe, 0xe0, 0xfe, 0xee, 0xfe, 0xc7, 0xdf, 0xcf, 0x02, 0xa1, 0x00, + 0x00, 0x02, 0x00, 0x36, 0xfe, 0x22, 0x05, 0xb4, 0x04, 0x49, 0x00, 0x19, + 0x00, 0x22, 0x00, 0x68, 0xb2, 0x0f, 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, + 0x0f, 0x10, 0xb0, 0x1a, 0xd0, 0x00, 0xb0, 0x18, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, + 0x59, 0xb0, 0x17, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0xd0, 0xb0, 0x10, 0x10, 0xb1, 0x20, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x05, 0x24, 0x00, 0x11, 0x34, 0x12, 0x37, 0x17, 0x06, 0x06, 0x07, 0x10, + 0x05, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x15, 0x14, 0x00, 0x05, + 0x11, 0x21, 0x01, 0x36, 0x36, 0x35, 0x26, 0x26, 0x23, 0x22, 0x15, 0x02, + 0x62, 0xfe, 0xf4, 0xfe, 0xe0, 0x78, 0x69, 0xc6, 0x3f, 0x45, 0x02, 0x01, + 0x0b, 0xaf, 0x82, 0x9b, 0xf4, 0x92, 0xfe, 0xdb, 0xfe, 0xf4, 0xfe, 0xdf, + 0x01, 0x21, 0x82, 0x8e, 0x02, 0x76, 0x65, 0x33, 0x0c, 0x21, 0x01, 0x3b, + 0x01, 0x03, 0x9a, 0x01, 0x07, 0x54, 0x9a, 0x45, 0xb6, 0x60, 0xfe, 0xcc, + 0x3c, 0x02, 0x3c, 0x81, 0xa9, 0x83, 0xff, 0x98, 0xf5, 0xfe, 0xd5, 0x1d, + 0xfe, 0x30, 0x02, 0xbe, 0x19, 0xa8, 0x8e, 0x8b, 0xa6, 0x34, 0x00, 0x01, + 0x00, 0x44, 0xfe, 0x22, 0x05, 0xb1, 0x04, 0x3a, 0x00, 0x17, 0x00, 0x50, + 0xb2, 0x00, 0x18, 0x19, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, + 0x0c, 0x3e, 0x59, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x24, 0x11, + 0x26, 0x03, 0x21, 0x16, 0x11, 0x10, 0x00, 0x05, 0x11, 0x21, 0x11, 0x24, + 0x00, 0x03, 0x11, 0x21, 0x11, 0x10, 0x17, 0x11, 0x03, 0x80, 0x01, 0x10, + 0x03, 0x69, 0x01, 0x0c, 0x81, 0xfe, 0xdd, 0xfe, 0xf2, 0xfe, 0xdf, 0xfe, + 0xfb, 0xfe, 0xed, 0x03, 0x01, 0x22, 0xf9, 0x04, 0x3a, 0xfc, 0xa8, 0x39, + 0x01, 0x38, 0xd5, 0x01, 0x12, 0xda, 0xfe, 0xf3, 0xfe, 0xf6, 0xfe, 0xc7, + 0x1d, 0xfe, 0x2f, 0x01, 0xd2, 0x20, 0x01, 0x29, 0x01, 0x04, 0x01, 0xf9, + 0xfe, 0x12, 0xfe, 0xd3, 0x3b, 0x03, 0x56, 0x00, 0x00, 0x01, 0x00, 0x53, + 0xff, 0xec, 0x06, 0x41, 0x04, 0x3a, 0x00, 0x22, 0x00, 0x5b, 0xb2, 0x1a, + 0x23, 0x24, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x0c, 0x3e, 0x59, 0xb1, 0x05, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x08, + 0x1d, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0xd0, 0xb2, 0x1a, 0x11, 0x17, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x02, 0x07, 0x14, 0x16, 0x33, 0x32, + 0x11, 0x11, 0x21, 0x11, 0x10, 0x33, 0x32, 0x36, 0x35, 0x26, 0x03, 0x21, + 0x16, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, + 0x02, 0x11, 0x10, 0x37, 0x01, 0xfc, 0x80, 0x07, 0x53, 0x4a, 0xa0, 0x01, + 0x31, 0xa0, 0x4c, 0x51, 0x07, 0x81, 0x01, 0x14, 0x95, 0xde, 0xd6, 0x6e, + 0xa5, 0x30, 0x31, 0xa4, 0x6d, 0xd7, 0xde, 0x95, 0x04, 0x3a, 0xfe, 0xf2, + 0xf6, 0xad, 0xb5, 0x01, 0x21, 0x01, 0x57, 0xfe, 0xa9, 0xfe, 0xdf, 0xbb, + 0xa7, 0xf8, 0x01, 0x0c, 0xe4, 0xfe, 0xe0, 0xfe, 0xdc, 0xfe, 0xda, 0x6c, + 0x68, 0x68, 0x6c, 0x01, 0x27, 0x01, 0x23, 0x01, 0x20, 0xe4, 0x00, 0x02, + 0x00, 0x75, 0xff, 0xec, 0x04, 0xb9, 0x05, 0xc4, 0x00, 0x1e, 0x00, 0x27, + 0x00, 0x6e, 0xb2, 0x06, 0x28, 0x29, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, + 0xb0, 0x1f, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, + 0xb1, 0x19, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb2, 0x1d, 0x06, 0x19, 0x11, 0x12, + 0x39, 0xb0, 0x1d, 0x2f, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0xd0, 0xb2, 0x0b, 0x06, 0x19, 0x11, + 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1d, 0x10, 0xb0, 0x22, 0xd0, 0xb0, + 0x19, 0x10, 0xb1, 0x25, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x06, 0x07, 0x15, 0x14, 0x00, 0x23, 0x22, + 0x00, 0x35, 0x35, 0x25, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, + 0x26, 0x02, 0x27, 0x35, 0x34, 0x36, 0x20, 0x16, 0x17, 0x11, 0x37, 0x25, + 0x14, 0x16, 0x17, 0x11, 0x26, 0x23, 0x22, 0x15, 0x04, 0xb9, 0x30, 0x41, + 0xfe, 0xf0, 0xdd, 0xd8, 0xfe, 0xf2, 0x01, 0x13, 0x7a, 0x67, 0x53, 0x5c, + 0xcb, 0xf5, 0x04, 0xd6, 0x01, 0x58, 0xc4, 0x02, 0x66, 0xfd, 0xb9, 0x5a, + 0x57, 0x02, 0x4f, 0x60, 0x02, 0x41, 0x10, 0x0c, 0x54, 0xe0, 0xfe, 0xfb, + 0x01, 0x0d, 0xd9, 0xed, 0x01, 0xf2, 0x6d, 0x83, 0x7d, 0x6f, 0x59, 0x2b, + 0x01, 0x0d, 0xb7, 0x22, 0xb8, 0xd8, 0xdd, 0xc0, 0xfe, 0xfa, 0x14, 0xf5, + 0x57, 0x86, 0x20, 0x01, 0x1a, 0x7c, 0x87, 0x00, 0x00, 0x01, 0xff, 0xe7, + 0x00, 0x00, 0x04, 0xd6, 0x05, 0xca, 0x00, 0x18, 0x00, 0x43, 0xb2, 0x00, + 0x19, 0x1a, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, + 0x2f, 0x1b, 0xb1, 0x15, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x0c, 0x15, + 0x11, 0x12, 0x39, 0xb0, 0x15, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x15, 0x10, + 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x08, 0xd0, 0x30, 0x31, 0x01, 0x13, 0x36, 0x36, 0x33, 0x32, 0x17, + 0x07, 0x27, 0x22, 0x07, 0x01, 0x11, 0x21, 0x11, 0x01, 0x26, 0x23, 0x07, + 0x27, 0x36, 0x33, 0x32, 0x16, 0x17, 0x02, 0x5e, 0xb6, 0x31, 0x94, 0x6b, + 0x49, 0x49, 0x26, 0x39, 0x44, 0x1f, 0xfe, 0xdf, 0xfe, 0xd2, 0xfe, 0xe2, + 0x1e, 0x46, 0x39, 0x23, 0x4b, 0x45, 0x71, 0x8e, 0x2e, 0x02, 0xff, 0x01, + 0xd7, 0x82, 0x72, 0x19, 0xe7, 0x05, 0x47, 0xfd, 0x60, 0xfe, 0x18, 0x01, + 0xe8, 0x02, 0xa0, 0x47, 0x05, 0xe7, 0x19, 0x6b, 0x74, 0x00, 0x00, 0x02, + 0x00, 0x14, 0xff, 0xec, 0x06, 0x95, 0x04, 0x3a, 0x00, 0x14, 0x00, 0x26, + 0x00, 0x72, 0xb2, 0x09, 0x27, 0x28, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x10, + 0xb0, 0x1e, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, + 0xb1, 0x13, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, + 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x13, 0x10, 0xb1, 0x00, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x09, + 0x13, 0x06, 0x11, 0x12, 0x39, 0xb0, 0x11, 0xd0, 0xb0, 0x12, 0xd0, 0xb0, + 0x17, 0xd0, 0xb0, 0x18, 0xd0, 0xb0, 0x0c, 0x10, 0xb1, 0x1d, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x20, 0x0c, 0x17, + 0x11, 0x12, 0x39, 0xb0, 0x24, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x16, 0x15, + 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x02, 0x11, + 0x34, 0x37, 0x23, 0x35, 0x21, 0x01, 0x26, 0x27, 0x21, 0x06, 0x07, 0x14, + 0x16, 0x33, 0x32, 0x11, 0x35, 0x21, 0x15, 0x10, 0x33, 0x32, 0x36, 0x06, + 0x95, 0x7e, 0x32, 0xd7, 0xd0, 0x73, 0xad, 0x32, 0x33, 0xac, 0x73, 0xd1, + 0xd7, 0x32, 0x74, 0x06, 0x81, 0xfe, 0x94, 0x04, 0x33, 0xfc, 0xbb, 0x32, + 0x04, 0x4c, 0x46, 0xaf, 0x01, 0x30, 0xaf, 0x46, 0x4c, 0x03, 0x6c, 0x94, + 0xa2, 0xfe, 0xdb, 0xfe, 0xdb, 0x6e, 0x6b, 0x6b, 0x6e, 0x01, 0x28, 0x01, + 0x22, 0xa2, 0x94, 0xce, 0xfd, 0xfc, 0x92, 0xa4, 0xa1, 0x95, 0xac, 0xb6, + 0x01, 0x21, 0xc0, 0xc0, 0xfe, 0xdf, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x1d, + 0xff, 0xef, 0x05, 0xc3, 0x05, 0xb0, 0x00, 0x1a, 0x00, 0x71, 0xb2, 0x13, + 0x1b, 0x1c, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, + 0x2f, 0x1b, 0xb1, 0x19, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x19, 0x10, + 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x04, 0x15, 0x19, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb0, 0x0c, + 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x18, + 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x36, 0x33, 0x20, 0x04, 0x15, 0x14, + 0x06, 0x07, 0x06, 0x21, 0x35, 0x20, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, + 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, 0x8d, 0xfe, 0x27, 0x85, 0x6e, + 0x01, 0x03, 0x01, 0x19, 0x47, 0x4c, 0x93, 0xfe, 0xfa, 0x01, 0x00, 0x84, + 0x7b, 0x75, 0x6f, 0xfe, 0xd3, 0xfe, 0x96, 0x04, 0x70, 0x04, 0xbd, 0xfe, + 0xa3, 0x1f, 0xed, 0xd7, 0x62, 0xb0, 0x3f, 0x7b, 0xe3, 0xd7, 0x66, 0x7c, + 0x17, 0xfd, 0x8c, 0x04, 0xbd, 0xf3, 0x00, 0x01, 0x00, 0x57, 0xff, 0xec, + 0x04, 0xfc, 0x05, 0xc4, 0x00, 0x1e, 0x00, 0x58, 0xb2, 0x03, 0x1f, 0x20, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, + 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, + 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x12, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x16, 0x0b, + 0x03, 0x11, 0x12, 0x39, 0xb0, 0x16, 0x2f, 0xb1, 0x17, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1b, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x06, 0x00, 0x21, 0x20, 0x00, 0x03, 0x35, 0x34, 0x12, 0x24, 0x33, + 0x32, 0x00, 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x21, 0x15, + 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0xfb, 0x11, 0xfe, 0xc9, + 0xfe, 0xfe, 0xfe, 0xeb, 0xfe, 0xbe, 0x03, 0x94, 0x01, 0x13, 0xb6, 0xfd, + 0x01, 0x33, 0x18, 0xfe, 0xd4, 0x0b, 0x87, 0x8a, 0x8c, 0x97, 0x0c, 0x01, + 0xbf, 0xfe, 0x41, 0x0a, 0x8d, 0x95, 0x87, 0x8c, 0x0a, 0x01, 0xe4, 0xe7, + 0xfe, 0xef, 0x01, 0x72, 0x01, 0x3f, 0x68, 0xd5, 0x01, 0x3f, 0xab, 0xfe, + 0xf1, 0xf4, 0x8d, 0x83, 0xbc, 0xc3, 0xf2, 0xbf, 0xc5, 0x81, 0x87, 0x00, + 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x08, 0x3a, 0x05, 0xb0, 0x00, 0x18, + 0x00, 0x21, 0x00, 0x77, 0xb2, 0x09, 0x22, 0x23, 0x11, 0x12, 0x39, 0xb0, + 0x09, 0x10, 0xb0, 0x19, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, + 0x2f, 0x1b, 0xb1, 0x17, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x17, + 0x08, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb0, 0x17, 0x10, 0xb1, 0x0a, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, + 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0x10, 0xb0, 0x1a, 0xd0, 0xb0, 0x1b, + 0xd0, 0x30, 0x31, 0x01, 0x33, 0x32, 0x16, 0x16, 0x15, 0x14, 0x00, 0x21, + 0x21, 0x11, 0x21, 0x03, 0x02, 0x02, 0x06, 0x07, 0x23, 0x35, 0x37, 0x36, + 0x36, 0x13, 0x13, 0x21, 0x11, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x27, 0x05, 0x22, 0xf1, 0xa2, 0xfc, 0x89, 0xfe, 0xd1, 0xfe, 0xff, 0xfd, + 0xeb, 0xfe, 0x7c, 0x18, 0x0f, 0x66, 0xc4, 0xaa, 0x4e, 0x32, 0x71, 0x61, + 0x0d, 0x19, 0x03, 0xd0, 0xef, 0x73, 0x89, 0x83, 0x6f, 0x03, 0xc1, 0x79, + 0xdc, 0x8b, 0xd6, 0xfe, 0xf5, 0x04, 0xbd, 0xfd, 0xfe, 0xfe, 0xfc, 0xfe, + 0xd5, 0x8b, 0x01, 0xf1, 0x05, 0x0f, 0xe7, 0x01, 0x28, 0x02, 0x9c, 0xfd, + 0x1f, 0xfe, 0x22, 0x87, 0x6b, 0x65, 0x84, 0x03, 0x00, 0x02, 0x00, 0x84, + 0x00, 0x00, 0x08, 0x3a, 0x05, 0xb0, 0x00, 0x13, 0x00, 0x1c, 0x00, 0xa1, + 0xb2, 0x01, 0x1d, 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x14, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, + 0x12, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, + 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, + 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x02, 0x0c, 0x11, 0x12, + 0x39, 0xb0, 0x01, 0x2f, 0xb4, 0xdf, 0x01, 0xef, 0x01, 0x02, 0x5d, 0xb4, + 0x0f, 0x01, 0x1f, 0x01, 0x02, 0x71, 0xb4, 0x6f, 0x01, 0x7f, 0x01, 0x02, + 0x5d, 0xb4, 0x7f, 0x01, 0x8f, 0x01, 0x02, 0x71, 0xb2, 0x04, 0x02, 0x0c, + 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb0, 0x01, 0x10, 0xb1, 0x0e, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, + 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x0c, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x33, 0x32, + 0x16, 0x16, 0x15, 0x14, 0x00, 0x07, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0xb0, + 0x02, 0x47, 0x01, 0x2c, 0xf2, 0xa2, 0xfa, 0x89, 0xfe, 0xd7, 0xf4, 0xfd, + 0xda, 0xfd, 0xb9, 0xfe, 0xd4, 0x01, 0x2c, 0x03, 0x73, 0xf0, 0x72, 0x8a, + 0x89, 0x74, 0x03, 0x4a, 0x02, 0x66, 0xfe, 0x08, 0x77, 0xd9, 0x8b, 0xd4, + 0xfe, 0xfa, 0x03, 0x02, 0x59, 0xfd, 0xa7, 0x05, 0xb0, 0xfd, 0x16, 0xfe, + 0x2d, 0x83, 0x69, 0x66, 0x81, 0x00, 0x00, 0x01, 0x00, 0x21, 0x00, 0x00, + 0x05, 0xb7, 0x05, 0xb0, 0x00, 0x15, 0x00, 0x5f, 0xb2, 0x0e, 0x16, 0x17, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, + 0xb1, 0x14, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, + 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, + 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x14, 0x10, 0xb1, 0x00, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, + 0x14, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, 0x0d, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, + 0x12, 0xd0, 0xb0, 0x13, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x36, 0x33, + 0x20, 0x04, 0x17, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, + 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, 0x79, 0xfe, 0x2d, 0x80, 0x59, 0x01, + 0x15, 0x01, 0x1f, 0x04, 0xfe, 0xd4, 0x7a, 0x92, 0x59, 0x80, 0xfe, 0xd4, + 0xfe, 0xa7, 0x04, 0x58, 0x04, 0xbd, 0xfe, 0xd5, 0x12, 0xf2, 0xe4, 0xfe, + 0x32, 0x01, 0xc3, 0x81, 0x6e, 0x12, 0xfd, 0x60, 0x04, 0xbd, 0xf3, 0x00, + 0x00, 0x01, 0x00, 0x75, 0xfe, 0x98, 0x05, 0x15, 0x05, 0xb0, 0x00, 0x0b, + 0x00, 0x49, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb1, 0x02, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, + 0xd0, 0x30, 0x31, 0x13, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x75, 0x01, 0x2c, 0x02, 0x47, 0x01, 0x2d, 0xfe, 0x54, + 0xfe, 0xd2, 0xfe, 0x3a, 0x05, 0xb0, 0xfb, 0x41, 0x04, 0xbf, 0xfa, 0x50, + 0xfe, 0x98, 0x01, 0x68, 0x00, 0x02, 0x00, 0x7f, 0x00, 0x00, 0x04, 0xc6, + 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x5e, 0xb2, 0x0f, 0x16, 0x17, + 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x10, 0xb0, 0x03, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, + 0xb0, 0x0b, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x0b, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x02, + 0x2f, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x33, 0x20, 0x04, + 0x15, 0x14, 0x00, 0x07, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x27, 0x04, 0x38, 0xfd, 0x76, 0xea, 0x01, 0x01, 0x01, + 0x2d, 0xfe, 0xd5, 0xf8, 0xfd, 0xdc, 0x03, 0xb9, 0xfd, 0x76, 0xef, 0x73, + 0x89, 0x83, 0x72, 0x04, 0xbd, 0xfe, 0xe6, 0xf9, 0xd3, 0xd4, 0xfe, 0xff, + 0x02, 0x05, 0xb0, 0xfd, 0x01, 0xfe, 0x40, 0x7e, 0x6a, 0x63, 0x73, 0x02, + 0x00, 0x02, 0x00, 0x19, 0xfe, 0x9a, 0x05, 0xe0, 0x05, 0xb0, 0x00, 0x0e, + 0x00, 0x14, 0x00, 0x5d, 0xb2, 0x12, 0x15, 0x16, 0x11, 0x12, 0x39, 0xb0, + 0x12, 0x10, 0xb0, 0x0b, 0xd0, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, + 0x01, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x06, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0xd0, 0xb0, + 0x0e, 0xd0, 0xb0, 0x0f, 0xd0, 0xb0, 0x10, 0xd0, 0xb0, 0x0b, 0x10, 0xb1, + 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x33, 0x36, 0x12, 0x37, + 0x13, 0x21, 0x11, 0x33, 0x21, 0x21, 0x11, 0x21, 0x03, 0x02, 0x05, 0xc8, + 0xfe, 0xeb, 0xfc, 0x92, 0xfe, 0xe4, 0x10, 0x6e, 0x59, 0x61, 0x11, 0x2a, + 0x03, 0xba, 0xaa, 0xfb, 0xff, 0x02, 0x2b, 0xfe, 0x8f, 0x19, 0x1e, 0xfe, + 0x9a, 0x01, 0x66, 0xfe, 0x9b, 0x02, 0x56, 0x4a, 0x01, 0x1f, 0xd4, 0x02, + 0x82, 0xfb, 0x41, 0x03, 0xcc, 0xfe, 0x81, 0xfe, 0x7f, 0x00, 0x00, 0x01, + 0x00, 0x11, 0x00, 0x00, 0x07, 0xfa, 0x05, 0xb0, 0x00, 0x15, 0x00, 0x8c, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, + 0x11, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, + 0x2f, 0x1b, 0xb1, 0x14, 0x0c, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x10, + 0xd0, 0xb0, 0x10, 0x2f, 0xb2, 0xdf, 0x10, 0x01, 0x5d, 0xb2, 0x6f, 0x10, + 0x01, 0x5d, 0xb2, 0x40, 0x10, 0x01, 0x5d, 0xb1, 0x00, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb2, 0x08, + 0x10, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x10, 0xb0, 0x0b, 0xd0, 0xb2, + 0x13, 0x00, 0x10, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, + 0x11, 0x23, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, 0x33, 0x11, 0x21, 0x11, + 0x33, 0x01, 0x21, 0x01, 0x01, 0x21, 0x05, 0x4e, 0xad, 0xfe, 0xd4, 0xb1, + 0xfe, 0xc3, 0xfe, 0x8a, 0x01, 0xc6, 0xfe, 0x50, 0x01, 0x75, 0x01, 0x44, + 0x95, 0x01, 0x2c, 0x92, 0x01, 0x3c, 0x01, 0x74, 0xfe, 0x58, 0x01, 0xbf, + 0xfe, 0x89, 0x02, 0x51, 0xfd, 0xaf, 0x02, 0x51, 0xfd, 0xaf, 0x03, 0x0d, + 0x02, 0xa3, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x5e, + 0xfc, 0xf2, 0x00, 0x01, 0x00, 0x43, 0xff, 0xed, 0x04, 0x94, 0x05, 0xc3, + 0x00, 0x29, 0x00, 0x72, 0xb2, 0x28, 0x2a, 0x2b, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0c, + 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x28, 0x0b, 0x17, 0x11, 0x12, 0x39, + 0xb0, 0x28, 0x2f, 0xb4, 0x6f, 0x28, 0x7f, 0x28, 0x02, 0x5d, 0xb4, 0xdf, + 0x28, 0xef, 0x28, 0x02, 0x5d, 0xb2, 0xff, 0x28, 0x01, 0x71, 0xb1, 0x25, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x11, + 0x25, 0x28, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x10, 0xb1, 0x1f, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x36, 0x33, 0x32, 0x04, + 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, + 0x26, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x23, 0x35, 0x33, 0x36, 0x03, 0x50, 0x82, 0x6b, 0x60, 0x7f, 0xfe, 0xd4, + 0x85, 0xf5, 0x91, 0xfc, 0x01, 0x1e, 0x75, 0x6c, 0x78, 0x80, 0xfe, 0xcd, + 0xfe, 0x9f, 0xfe, 0x83, 0x01, 0x2e, 0x88, 0x6a, 0x78, 0x8b, 0x7c, 0x77, + 0xb3, 0xb9, 0xd7, 0x04, 0x1f, 0x53, 0x5f, 0x5f, 0x4c, 0x76, 0xbd, 0x6a, + 0xd8, 0xc6, 0x61, 0xa6, 0x32, 0x2a, 0xab, 0x7f, 0xc4, 0xe7, 0x6d, 0xbd, + 0x7d, 0x4e, 0x69, 0x6c, 0x53, 0x72, 0x63, 0xeb, 0x03, 0x00, 0x00, 0x01, + 0x00, 0x78, 0x00, 0x00, 0x05, 0x18, 0x05, 0xb0, 0x00, 0x09, 0x00, 0x45, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, + 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, + 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x04, 0x00, 0x02, 0x11, 0x12, 0x39, + 0xb2, 0x09, 0x00, 0x02, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x21, 0x11, + 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0x11, 0x03, 0xeb, 0x01, 0x2d, 0xfe, + 0xd3, 0xfd, 0xb9, 0xfe, 0xd4, 0x01, 0x2c, 0x05, 0xb0, 0xfa, 0x50, 0x03, + 0xc7, 0xfc, 0x39, 0x05, 0xb0, 0xfc, 0x37, 0x00, 0x00, 0x01, 0x00, 0x28, + 0x00, 0x00, 0x05, 0x22, 0x05, 0xb0, 0x00, 0x10, 0x00, 0x4f, 0xb2, 0x04, + 0x11, 0x12, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x10, + 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x09, 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x03, 0x02, + 0x02, 0x06, 0x07, 0x23, 0x35, 0x37, 0x36, 0x36, 0x13, 0x13, 0x05, 0x22, + 0xfe, 0xd3, 0xfe, 0x7c, 0x18, 0x0f, 0x66, 0xc4, 0xaa, 0x4e, 0x32, 0x71, + 0x61, 0x0d, 0x19, 0x05, 0xb0, 0xfa, 0x50, 0x04, 0xbd, 0xfd, 0xfe, 0xfe, + 0xfc, 0xfe, 0xd5, 0x8b, 0x01, 0xf1, 0x05, 0x0f, 0xe7, 0x01, 0x28, 0x02, + 0x9c, 0x00, 0x00, 0x01, 0x00, 0x1f, 0xff, 0xeb, 0x04, 0xf1, 0x05, 0xb0, + 0x00, 0x10, 0x00, 0x44, 0xb2, 0x00, 0x11, 0x12, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, + 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x06, 0x01, 0x11, 0x12, 0x39, 0xb1, 0x0a, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x01, 0x21, 0x01, 0x07, 0x06, 0x23, 0x27, 0x27, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x37, 0x01, 0x21, 0x02, 0xa4, 0x01, 0x09, 0x01, 0x44, 0xfe, + 0x03, 0x29, 0x71, 0xe9, 0x69, 0x03, 0x18, 0x36, 0x3f, 0x4d, 0x1a, 0x25, + 0xfe, 0x01, 0x01, 0x43, 0x03, 0x00, 0x02, 0xb0, 0xfb, 0x4f, 0x4f, 0xc5, + 0x04, 0xf1, 0x04, 0x2c, 0x3b, 0x5f, 0x04, 0x0e, 0x00, 0x03, 0x00, 0x49, + 0xff, 0xc4, 0x06, 0x45, 0x05, 0xec, 0x00, 0x17, 0x00, 0x20, 0x00, 0x29, + 0x00, 0x4a, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x16, 0x2f, 0xb2, 0x15, 0x16, + 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x15, 0x2f, 0xb0, 0x00, 0xd0, 0xb2, 0x0b, + 0x0a, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x0b, 0x2f, 0xb0, 0x08, 0xd0, 0xb0, + 0x0b, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x20, 0xd0, 0xb0, 0x1f, 0x10, 0xb0, + 0x22, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x32, 0x04, 0x12, 0x15, 0x10, 0x00, + 0x21, 0x15, 0x21, 0x35, 0x23, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, + 0x37, 0x33, 0x35, 0x21, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, + 0x11, 0x21, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0xd9, + 0x12, 0xab, 0x01, 0x15, 0x9a, 0xfe, 0xb1, 0xfe, 0xe3, 0xfe, 0xdf, 0x13, + 0xad, 0xfe, 0xea, 0x99, 0x98, 0x01, 0x12, 0xa9, 0x1c, 0x01, 0x21, 0xfe, + 0xcc, 0x95, 0xab, 0xaa, 0x9a, 0x0f, 0x01, 0x21, 0x14, 0x93, 0xa9, 0xa6, + 0x9b, 0x05, 0x2e, 0x97, 0xfe, 0xea, 0xb1, 0xfe, 0xfa, 0xfe, 0xb4, 0xba, + 0xba, 0x95, 0x01, 0x0e, 0xad, 0xaf, 0x01, 0x14, 0x9b, 0x02, 0xbe, 0xfe, + 0x49, 0xbc, 0xab, 0xa0, 0xb7, 0x02, 0xbe, 0xfd, 0x42, 0xb9, 0xa0, 0xa7, + 0xbe, 0x00, 0x00, 0x01, 0x00, 0x75, 0xfe, 0xa1, 0x05, 0xdc, 0x05, 0xb0, + 0x00, 0x0b, 0x00, 0x3c, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb1, + 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x06, 0xd0, 0x30, 0x31, 0x13, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, + 0x03, 0x21, 0x11, 0x21, 0x75, 0x01, 0x2c, 0x02, 0x47, 0x01, 0x2d, 0xc7, + 0x14, 0xfe, 0xe8, 0xfb, 0xc5, 0x05, 0xb0, 0xfb, 0x41, 0x04, 0xbf, 0xfb, + 0x41, 0xfd, 0xb0, 0x01, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x89, 0x00, 0x00, + 0x05, 0x0c, 0x05, 0xb0, 0x00, 0x11, 0x00, 0x47, 0xb2, 0x05, 0x12, 0x13, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, + 0x1b, 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, + 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb2, 0x0e, 0x00, 0x01, 0x11, + 0x12, 0x39, 0xb0, 0x0e, 0x2f, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x06, + 0x23, 0x20, 0x24, 0x27, 0x11, 0x21, 0x11, 0x16, 0x16, 0x33, 0x32, 0x37, + 0x11, 0x05, 0x0c, 0xfe, 0xd3, 0x89, 0x95, 0xfe, 0xeb, 0xfe, 0xe1, 0x04, + 0x01, 0x2d, 0x01, 0x77, 0x93, 0x95, 0x89, 0x05, 0xb0, 0xfa, 0x50, 0x02, + 0x28, 0x1d, 0xf2, 0xe5, 0x01, 0xce, 0xfe, 0x38, 0x7d, 0x6e, 0x1d, 0x02, + 0x96, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x07, 0x2a, 0x05, 0xb0, + 0x00, 0x0b, 0x00, 0x49, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, + 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb1, 0x01, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0xd0, + 0xb0, 0x06, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xad, 0x01, 0x94, 0x01, 0x2d, 0x01, + 0x90, 0x01, 0x2c, 0xf9, 0x56, 0x05, 0xb0, 0xfb, 0x41, 0x04, 0xbf, 0xfb, + 0x41, 0x04, 0xbf, 0xfa, 0x50, 0x05, 0xb0, 0x00, 0x00, 0x01, 0x00, 0x80, + 0xfe, 0xa2, 0x07, 0xea, 0x05, 0xb0, 0x00, 0x0f, 0x00, 0x55, 0x00, 0xb0, + 0x0b, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, + 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, + 0xb1, 0x07, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, + 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x06, 0xd0, + 0xb0, 0x09, 0xd0, 0xb0, 0x0a, 0xd0, 0xb0, 0x02, 0xd0, 0x30, 0x31, 0x01, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x03, 0x21, + 0x11, 0x21, 0x11, 0x01, 0xad, 0x01, 0x94, 0x01, 0x2d, 0x01, 0x90, 0x01, + 0x2c, 0xc0, 0x14, 0xfe, 0xf4, 0xf9, 0xb6, 0x05, 0xb0, 0xfb, 0x41, 0x04, + 0xbf, 0xfb, 0x41, 0x04, 0xbf, 0xfb, 0x38, 0xfd, 0xba, 0x01, 0x5e, 0x05, + 0xb0, 0x00, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x05, 0xed, 0x05, 0xb0, + 0x00, 0x0c, 0x00, 0x15, 0x00, 0x61, 0xb2, 0x01, 0x16, 0x17, 0x11, 0x12, + 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x0d, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb2, 0x02, + 0x00, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x10, 0xb1, + 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x02, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x21, 0x11, 0x33, 0x20, + 0x04, 0x15, 0x14, 0x00, 0x07, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x27, 0x19, 0x02, 0xbc, 0xea, 0x01, 0x01, 0x01, + 0x2d, 0xfe, 0xd5, 0xf8, 0xfd, 0xdd, 0xfe, 0x72, 0x02, 0xbc, 0xef, 0x73, + 0x89, 0x83, 0x72, 0x05, 0xb0, 0xfd, 0xf3, 0xf9, 0xd3, 0xd4, 0xfe, 0xff, + 0x02, 0x04, 0xc6, 0xfd, 0xeb, 0xfe, 0x40, 0x7e, 0x6a, 0x63, 0x73, 0x02, + 0x00, 0x03, 0x00, 0x85, 0x00, 0x00, 0x06, 0x74, 0x05, 0xb0, 0x00, 0x0a, + 0x00, 0x0e, 0x00, 0x17, 0x00, 0x6f, 0xb2, 0x02, 0x18, 0x19, 0x11, 0x12, + 0x39, 0xb0, 0x02, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x13, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, + 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, + 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, + 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x09, 0x07, 0x11, 0x12, + 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x20, + 0x04, 0x15, 0x14, 0x00, 0x07, 0x21, 0x11, 0x21, 0x01, 0x21, 0x11, 0x21, + 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x01, 0xb3, 0xea, + 0x01, 0x01, 0x01, 0x2d, 0xfe, 0xd5, 0xf8, 0xfd, 0xdd, 0x01, 0x2e, 0x04, + 0xc1, 0xfe, 0xd4, 0x01, 0x2c, 0xfb, 0x3f, 0xef, 0x73, 0x89, 0x83, 0x72, + 0x03, 0xa3, 0xf9, 0xd3, 0xd4, 0xfe, 0xff, 0x02, 0x05, 0xb0, 0xfa, 0x50, + 0x05, 0xb0, 0xfd, 0x01, 0xfe, 0x40, 0x7e, 0x6a, 0x63, 0x73, 0x02, 0x00, + 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x04, 0xc6, 0x05, 0xb0, 0x00, 0x0a, + 0x00, 0x13, 0x00, 0x4f, 0xb2, 0x0d, 0x14, 0x15, 0x11, 0x12, 0x39, 0xb0, + 0x0d, 0x10, 0xb0, 0x01, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, + 0x2f, 0x1b, 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x09, 0x07, + 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x0c, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x33, 0x20, 0x04, 0x15, 0x14, 0x00, 0x07, 0x21, 0x11, 0x21, 0x11, 0x11, + 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x01, 0xae, 0xea, 0x01, 0x01, + 0x01, 0x2d, 0xfe, 0xd5, 0xf8, 0xfd, 0xdd, 0x01, 0x2e, 0xef, 0x73, 0x89, + 0x83, 0x72, 0x03, 0xa3, 0xf9, 0xd3, 0xd4, 0xfe, 0xff, 0x02, 0x05, 0xb0, + 0xfd, 0x01, 0xfe, 0x40, 0x7e, 0x6a, 0x63, 0x73, 0x02, 0x00, 0x00, 0x01, + 0x00, 0x3e, 0xff, 0xec, 0x04, 0xe2, 0x05, 0xc4, 0x00, 0x1e, 0x00, 0x5e, + 0xb2, 0x03, 0x1f, 0x20, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0c, 0x3e, 0x59, 0xb1, 0x03, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1b, + 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x09, 0x2f, 0xb2, 0x6f, 0x09, 0x01, 0x5d, + 0xb2, 0xdf, 0x09, 0x01, 0x5d, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x13, 0x10, 0xb1, 0x0c, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x21, 0x36, 0x00, 0x21, 0x32, 0x04, 0x12, 0x15, 0x15, 0x10, + 0x00, 0x21, 0x20, 0x00, 0x27, 0x01, 0x6b, 0x0d, 0x8c, 0x85, 0x93, 0x8e, + 0x0b, 0xfe, 0x34, 0x01, 0xcb, 0x0c, 0x97, 0x8c, 0x88, 0x88, 0x0b, 0xfe, + 0xd4, 0x16, 0x01, 0x31, 0x01, 0x00, 0xb6, 0x01, 0x13, 0x94, 0xfe, 0xbf, + 0xfe, 0xe8, 0xfe, 0xfe, 0xfe, 0xc9, 0x11, 0x01, 0xe4, 0x8d, 0x7b, 0xc3, + 0xbf, 0xf3, 0xc3, 0xbd, 0x81, 0x8f, 0xef, 0x01, 0x14, 0xab, 0xfe, 0xc1, + 0xd4, 0x5f, 0xfe, 0xbe, 0xfe, 0x87, 0x01, 0x11, 0xe7, 0x00, 0x00, 0x02, + 0x00, 0x8e, 0xff, 0xec, 0x07, 0x33, 0x05, 0xc4, 0x00, 0x17, 0x00, 0x25, + 0x00, 0x7a, 0xb2, 0x21, 0x26, 0x27, 0x11, 0x12, 0x39, 0xb0, 0x21, 0x10, + 0xb0, 0x12, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, + 0xb1, 0x13, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, + 0x1b, 0xb1, 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, + 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb2, 0x0f, 0x0a, 0x0d, + 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x0f, 0x2f, 0x18, 0xb1, 0x08, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x13, 0x10, 0xb1, + 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x04, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, + 0x27, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x36, 0x12, 0x24, 0x33, + 0x32, 0x04, 0x12, 0x15, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x07, 0x33, 0x98, 0xfe, 0xe5, 0xb7, + 0xa7, 0xfe, 0xf7, 0xa5, 0x13, 0xa7, 0xfe, 0xd4, 0x01, 0x2c, 0xa2, 0x09, + 0x9d, 0x01, 0x15, 0xb0, 0xb6, 0x01, 0x1b, 0x9b, 0xfe, 0xd0, 0xa4, 0x98, + 0x97, 0xa4, 0x01, 0xa4, 0x9a, 0x97, 0xa2, 0x01, 0x02, 0xb7, 0xd7, 0xfe, + 0xbc, 0xb0, 0x91, 0x01, 0x10, 0xb6, 0xfd, 0xbd, 0x05, 0xb0, 0xfd, 0x7c, + 0xc5, 0x01, 0x2e, 0xa5, 0xaf, 0xfe, 0xb9, 0xd6, 0x01, 0xe5, 0xee, 0xeb, + 0xe3, 0x47, 0xdf, 0xf6, 0xed, 0xe3, 0x00, 0x02, 0xff, 0xe4, 0x00, 0x00, + 0x04, 0x50, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x63, 0xb2, 0x10, + 0x15, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x10, 0xb0, 0x0a, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, + 0x0c, 0x3e, 0x59, 0xb2, 0x11, 0x0a, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x11, + 0x2f, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x05, 0x01, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, + 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x21, 0x11, 0x23, 0x01, 0x21, 0x01, 0x26, 0x11, 0x34, 0x24, 0x37, + 0x21, 0x11, 0x01, 0x14, 0x16, 0x33, 0x33, 0x11, 0x23, 0x22, 0x03, 0x23, + 0xf4, 0xfe, 0xf9, 0xfe, 0xbc, 0x01, 0x37, 0xe1, 0x01, 0x18, 0xfb, 0x02, + 0x03, 0xfd, 0x16, 0x77, 0x77, 0xcf, 0xcf, 0xee, 0x02, 0x0d, 0xfd, 0xf3, + 0x02, 0x6d, 0x7c, 0x01, 0x05, 0xd6, 0xea, 0x02, 0xfa, 0x50, 0x03, 0xd8, + 0x7a, 0x6e, 0x01, 0xcd, 0x00, 0x02, 0x00, 0x54, 0xff, 0xeb, 0x04, 0x50, + 0x06, 0x16, 0x00, 0x19, 0x00, 0x26, 0x00, 0x56, 0xb2, 0x0e, 0x27, 0x28, + 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x10, 0xb0, 0x1a, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x1a, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, + 0xb2, 0x00, 0x07, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb2, 0x18, + 0x00, 0x07, 0x11, 0x12, 0x39, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x20, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, + 0x12, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x11, 0x35, 0x12, 0x12, + 0x37, 0x36, 0x36, 0x35, 0x33, 0x14, 0x06, 0x07, 0x06, 0x06, 0x07, 0x36, + 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, + 0x26, 0x02, 0x88, 0xd0, 0xf8, 0xfe, 0xec, 0xe9, 0xea, 0xfe, 0xeb, 0x02, + 0xf3, 0xf4, 0x80, 0x4a, 0xea, 0xa9, 0xd8, 0x80, 0x94, 0x1a, 0x8a, 0x85, + 0x67, 0x75, 0x72, 0x6c, 0x69, 0x72, 0x01, 0x75, 0x03, 0xfe, 0xfe, 0xec, + 0xed, 0x0e, 0xea, 0xfe, 0xe6, 0x01, 0x31, 0x01, 0x06, 0x30, 0x01, 0x6d, + 0x01, 0x9d, 0x36, 0x1c, 0x37, 0x31, 0x9d, 0x9e, 0x2b, 0x1a, 0x96, 0x88, + 0x86, 0xea, 0x8a, 0x9b, 0x8a, 0x91, 0x8e, 0x8a, 0x18, 0x85, 0x8b, 0x00, + 0x00, 0x03, 0x00, 0x82, 0x00, 0x00, 0x04, 0x46, 0x04, 0x3a, 0x00, 0x0e, + 0x00, 0x15, 0x00, 0x1d, 0x00, 0x87, 0xb2, 0x02, 0x1e, 0x1f, 0x11, 0x12, + 0x39, 0xb0, 0x02, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x1c, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, + 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x16, 0x00, 0x01, 0x11, 0x12, 0x39, 0x7c, + 0xb0, 0x16, 0x2f, 0x18, 0xb4, 0xd0, 0x16, 0xe0, 0x16, 0x02, 0x5d, 0xb4, + 0x70, 0x16, 0x80, 0x16, 0x02, 0x71, 0xb4, 0x40, 0x16, 0x50, 0x16, 0x02, + 0x5d, 0xb2, 0x10, 0x16, 0x01, 0x72, 0xb1, 0x0f, 0x08, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x08, 0x0f, 0x16, 0x11, 0x12, + 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, 0x21, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, + 0x03, 0x15, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x33, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x23, 0x82, 0x01, 0xc4, 0xdd, 0xec, 0x63, 0x5f, 0x74, 0x85, + 0xe3, 0xd8, 0xe8, 0xe9, 0x99, 0x92, 0xf0, 0xb3, 0x98, 0x53, 0x55, 0xa3, + 0x04, 0x3a, 0x9c, 0x92, 0x4b, 0x77, 0x20, 0x16, 0x81, 0x5e, 0x97, 0x9e, + 0x01, 0xc1, 0xda, 0x6b, 0x6d, 0x02, 0xc2, 0x02, 0x60, 0x3b, 0x32, 0x00, + 0x00, 0x01, 0x00, 0x6f, 0x00, 0x00, 0x03, 0x50, 0x04, 0x3a, 0x00, 0x05, + 0x00, 0x2c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x03, 0x50, 0xfe, 0x40, 0xfe, 0xdf, 0x02, 0xe1, + 0x03, 0x50, 0xfc, 0xb0, 0x04, 0x3a, 0x00, 0x02, 0x00, 0x21, 0xfe, 0xbb, + 0x04, 0xea, 0x04, 0x3a, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x5d, 0xb2, 0x12, + 0x15, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x10, 0xb0, 0x0b, 0xd0, 0x00, + 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, + 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x07, 0xd0, 0xb0, + 0x09, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x07, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, + 0x10, 0xd0, 0xb0, 0x04, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x37, 0x36, 0x36, 0x37, 0x13, + 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x21, + 0x11, 0x23, 0x07, 0x02, 0x7e, 0x62, 0x46, 0x04, 0x08, 0x03, 0x1c, 0x9c, + 0xfe, 0xdf, 0xfd, 0x7f, 0xfe, 0xd9, 0x01, 0xb2, 0x01, 0x5b, 0xe1, 0x02, + 0x09, 0xe9, 0x68, 0xcc, 0xbb, 0x01, 0x62, 0xfc, 0xaf, 0xfd, 0xd2, 0x01, + 0x45, 0xfe, 0xbb, 0x02, 0x2e, 0x02, 0x62, 0x82, 0xfe, 0xd6, 0x00, 0x01, + 0x00, 0x27, 0x00, 0x00, 0x06, 0xba, 0x04, 0x3a, 0x00, 0x15, 0x00, 0x82, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, + 0x11, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, + 0x2f, 0x1b, 0xb1, 0x14, 0x0c, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x10, + 0xd0, 0xb0, 0x10, 0x2f, 0xb2, 0xdf, 0x10, 0x01, 0x5d, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, + 0xb2, 0x08, 0x10, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x10, 0xb0, 0x0b, + 0xd0, 0xb2, 0x13, 0x00, 0x10, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, + 0x11, 0x21, 0x11, 0x23, 0x03, 0x21, 0x01, 0x01, 0x21, 0x13, 0x33, 0x11, + 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, 0x21, 0x04, 0x80, 0x83, 0xfe, + 0xdf, 0x81, 0xd7, 0xfe, 0xa3, 0x01, 0x55, 0xfe, 0xaf, 0x01, 0x66, 0xe1, + 0x6a, 0x01, 0x21, 0x6c, 0xe2, 0x01, 0x66, 0xfe, 0xb1, 0x01, 0x58, 0xfe, + 0x9d, 0x01, 0x91, 0xfe, 0x6f, 0x01, 0x91, 0xfe, 0x6f, 0x02, 0x36, 0x02, + 0x04, 0xfe, 0x6c, 0x01, 0x94, 0xfe, 0x6c, 0x01, 0x94, 0xfe, 0x03, 0xfd, + 0xc3, 0x00, 0x00, 0x01, 0x00, 0x45, 0xff, 0xec, 0x03, 0xdb, 0x04, 0x4d, + 0x00, 0x26, 0x00, 0x84, 0xb2, 0x03, 0x27, 0x28, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0c, + 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x0a, 0x15, 0x11, 0x12, 0x39, + 0xb2, 0x25, 0x15, 0x0a, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x25, 0x2f, 0x18, + 0xb4, 0x40, 0x25, 0x50, 0x25, 0x02, 0x5d, 0xb4, 0xd0, 0x25, 0xe0, 0x25, + 0x02, 0x5d, 0xb4, 0x70, 0x25, 0x80, 0x25, 0x02, 0x71, 0xb1, 0x22, 0x08, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x10, 0x22, + 0x25, 0x11, 0x12, 0x39, 0xb2, 0x19, 0x15, 0x0a, 0x11, 0x12, 0x39, 0xb0, + 0x15, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x36, 0x02, 0xa7, 0x4b, 0x45, 0x47, + 0x59, 0xfe, 0xdf, 0xf4, 0xbe, 0xd1, 0xef, 0x57, 0x4f, 0xb9, 0xff, 0xd4, + 0xc5, 0xfe, 0x01, 0x21, 0x62, 0x4f, 0x4d, 0x56, 0x52, 0x52, 0x9d, 0xa7, + 0x87, 0x02, 0xfb, 0x39, 0x3f, 0x3b, 0x36, 0x93, 0xb8, 0xa4, 0x97, 0x48, + 0x79, 0x24, 0x41, 0xba, 0x95, 0xb1, 0xb8, 0x9c, 0x37, 0x44, 0x48, 0x3a, + 0x47, 0x3d, 0xbc, 0x04, 0x00, 0x01, 0x00, 0x6f, 0x00, 0x00, 0x04, 0x1c, + 0x04, 0x3a, 0x00, 0x09, 0x00, 0x45, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, + 0x04, 0x07, 0x02, 0x11, 0x12, 0x39, 0xb2, 0x09, 0x07, 0x02, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, + 0x11, 0x02, 0xfb, 0x01, 0x21, 0xfe, 0xdf, 0xfe, 0x96, 0xfe, 0xde, 0x01, + 0x22, 0x04, 0x3a, 0xfb, 0xc6, 0x02, 0x9c, 0xfd, 0x64, 0x04, 0x3a, 0xfd, + 0x65, 0x00, 0x00, 0x01, 0x00, 0x82, 0x00, 0x00, 0x04, 0x84, 0x04, 0x3a, + 0x00, 0x0c, 0x00, 0x58, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, + 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x02, 0x10, + 0xb0, 0x06, 0xd0, 0xb0, 0x06, 0x2f, 0xb2, 0xdf, 0x06, 0x01, 0x5d, 0xb1, + 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x0a, 0x01, 0x06, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, + 0x11, 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, 0x21, 0x02, 0x17, 0x74, + 0xfe, 0xdf, 0x01, 0x21, 0x67, 0xec, 0x01, 0x6d, 0xfe, 0x9e, 0x01, 0x83, + 0xfe, 0x7f, 0x01, 0x8f, 0xfe, 0x71, 0x04, 0x3a, 0xfe, 0x69, 0x01, 0x97, + 0xfd, 0xfd, 0xfd, 0xc9, 0x00, 0x01, 0x00, 0x16, 0x00, 0x00, 0x04, 0x1c, + 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x4f, 0xb2, 0x04, 0x10, 0x11, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, + 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x03, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, + 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x11, 0x21, 0x11, 0x23, 0x03, 0x02, 0x06, 0x07, 0x23, 0x27, + 0x37, 0x36, 0x36, 0x37, 0x13, 0x04, 0x1c, 0xfe, 0xdf, 0xff, 0x12, 0x11, + 0xb0, 0xae, 0x62, 0x03, 0x24, 0x4e, 0x48, 0x09, 0x14, 0x04, 0x3a, 0xfb, + 0xc6, 0x03, 0x50, 0xfe, 0xb2, 0xfe, 0xf5, 0xf4, 0x03, 0xeb, 0x03, 0x06, + 0xac, 0xcf, 0x01, 0xcb, 0x00, 0x01, 0x00, 0x82, 0x00, 0x00, 0x05, 0x87, + 0x04, 0x3a, 0x00, 0x0c, 0x00, 0x59, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, + 0xb2, 0x00, 0x0b, 0x03, 0x11, 0x12, 0x39, 0xb2, 0x05, 0x0b, 0x03, 0x11, + 0x12, 0x39, 0xb2, 0x08, 0x0b, 0x03, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x01, 0x21, 0x11, 0x21, 0x11, 0x01, 0x23, 0x03, 0x11, 0x21, 0x11, 0x21, + 0x03, 0x02, 0x01, 0x1b, 0x01, 0x6a, 0xfe, 0xdf, 0xfe, 0xfd, 0xc2, 0xfe, + 0xfe, 0xdf, 0x01, 0x67, 0x01, 0x55, 0x02, 0xe5, 0xfb, 0xc6, 0x02, 0x98, + 0xfd, 0x68, 0x02, 0x8d, 0xfd, 0x73, 0x04, 0x3a, 0x00, 0x01, 0x00, 0x6f, + 0x00, 0x00, 0x04, 0x19, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x54, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, + 0x0c, 0x3e, 0x59, 0xb2, 0x09, 0x00, 0x0a, 0x11, 0x12, 0x39, 0x7c, 0xb0, + 0x09, 0x2f, 0x18, 0xb2, 0x40, 0x09, 0x01, 0x5d, 0xb1, 0x02, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x19, + 0xfe, 0xde, 0xfe, 0x99, 0xfe, 0xdf, 0x01, 0x21, 0x01, 0x67, 0x01, 0x22, + 0x01, 0xa0, 0xfe, 0x60, 0x04, 0x3a, 0xfe, 0x4e, 0x01, 0xb2, 0x00, 0x01, + 0x00, 0x6f, 0x00, 0x00, 0x04, 0x1c, 0x04, 0x3a, 0x00, 0x07, 0x00, 0x39, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x1c, 0xfe, 0xde, 0xfe, 0x96, 0xfe, + 0xdf, 0x03, 0xad, 0x03, 0x50, 0xfc, 0xb0, 0x04, 0x3a, 0x00, 0x00, 0x01, + 0x00, 0x1f, 0x00, 0x00, 0x03, 0xf1, 0x04, 0x3a, 0x00, 0x07, 0x00, 0x32, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x0c, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, + 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x03, 0xf1, + 0xfe, 0xa5, 0xfe, 0xde, 0xfe, 0xab, 0x03, 0xd2, 0x03, 0x52, 0xfc, 0xae, + 0x03, 0x52, 0xe8, 0x00, 0x00, 0x03, 0x00, 0x44, 0xfe, 0x60, 0x05, 0x94, + 0x06, 0x00, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x2f, 0x00, 0x81, 0xb2, 0x07, + 0x30, 0x31, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x20, 0xd0, 0xb0, + 0x07, 0x10, 0xb0, 0x2a, 0xd0, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0e, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0c, + 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x23, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x28, 0xd0, 0xb0, + 0x1e, 0x10, 0xb0, 0x2d, 0xd0, 0x30, 0x31, 0x13, 0x10, 0x12, 0x33, 0x32, + 0x17, 0x11, 0x21, 0x11, 0x36, 0x33, 0x32, 0x12, 0x11, 0x14, 0x02, 0x23, + 0x22, 0x27, 0x11, 0x21, 0x11, 0x06, 0x23, 0x22, 0x02, 0x27, 0x25, 0x34, + 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x13, 0x25, 0x10, 0x33, + 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x06, 0x44, 0xd5, 0xbb, 0x49, 0x3c, + 0x01, 0x21, 0x3e, 0x4b, 0xbc, 0xd5, 0xd6, 0xb9, 0x4d, 0x3e, 0xfe, 0xdf, + 0x3c, 0x4b, 0xaf, 0xd4, 0x0a, 0x04, 0x2d, 0x62, 0x59, 0x1c, 0x21, 0x1c, + 0x23, 0xaa, 0x0e, 0xfc, 0xf4, 0xb7, 0x26, 0x17, 0x21, 0x1a, 0x59, 0x60, + 0x02, 0x15, 0x01, 0x05, 0x01, 0x34, 0x1d, 0x01, 0xcf, 0xfe, 0x30, 0x1e, + 0xfe, 0xcd, 0xfe, 0xe5, 0xf5, 0xfe, 0xe1, 0x1c, 0xfe, 0x58, 0x01, 0xa7, + 0x1b, 0x01, 0x06, 0xe4, 0x3f, 0xa2, 0xad, 0x07, 0xfd, 0x7d, 0x06, 0x01, + 0x02, 0x2a, 0xfe, 0xd5, 0x05, 0x02, 0x83, 0x07, 0xa9, 0x00, 0x00, 0x01, + 0x00, 0x6f, 0xfe, 0xbf, 0x04, 0xbe, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x3c, + 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb1, 0x02, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0x30, 0x31, + 0x13, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x03, 0x21, 0x11, 0x21, + 0x6f, 0x01, 0x21, 0x01, 0x6a, 0x01, 0x22, 0xa2, 0x14, 0xfe, 0xf3, 0xfc, + 0xd2, 0x04, 0x3a, 0xfc, 0xaf, 0x03, 0x51, 0xfc, 0xad, 0xfd, 0xd8, 0x01, + 0x41, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x00, 0x03, 0xff, 0x04, 0x3a, + 0x00, 0x11, 0x00, 0x47, 0xb2, 0x04, 0x12, 0x13, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x0c, 0x3e, 0x59, 0xb2, 0x0d, 0x10, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0d, + 0x2f, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, + 0x21, 0x11, 0x16, 0x16, 0x33, 0x32, 0x37, 0x11, 0x21, 0x03, 0xff, 0xfe, + 0xdf, 0x51, 0x46, 0xf5, 0xf8, 0x02, 0x01, 0x21, 0x01, 0x5a, 0x73, 0x48, + 0x4f, 0x01, 0x21, 0x01, 0x54, 0x0f, 0xd0, 0xc8, 0x01, 0x5d, 0xfe, 0xa3, + 0x5e, 0x51, 0x11, 0x01, 0xfb, 0x00, 0x00, 0x01, 0x00, 0x6f, 0x00, 0x00, + 0x06, 0x25, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x49, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, + 0x59, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x06, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x90, 0x01, + 0x29, 0x01, 0x22, 0x01, 0x29, 0x01, 0x21, 0xfa, 0x4a, 0x04, 0x3a, 0xfc, + 0xaf, 0x03, 0x51, 0xfc, 0xaf, 0x03, 0x51, 0xfb, 0xc6, 0x04, 0x3a, 0x00, + 0x00, 0x01, 0x00, 0x6c, 0xfe, 0xbf, 0x06, 0xf9, 0x04, 0x3a, 0x00, 0x0f, + 0x00, 0x4c, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb1, 0x01, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, + 0xd0, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x11, 0x33, 0x03, 0x21, 0x11, 0x21, 0x11, 0x01, 0x8d, + 0x01, 0x29, 0x01, 0x22, 0x01, 0x28, 0x01, 0x22, 0xd7, 0x14, 0xfe, 0xf3, + 0xfa, 0x94, 0x04, 0x3a, 0xfc, 0xaf, 0x03, 0x51, 0xfc, 0xaf, 0x03, 0x51, + 0xfc, 0xad, 0xfd, 0xd8, 0x01, 0x41, 0x04, 0x3a, 0x00, 0x02, 0x00, 0x21, + 0x00, 0x00, 0x05, 0x17, 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x61, + 0xb2, 0x01, 0x17, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x0e, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, + 0x0a, 0x0c, 0x3e, 0x59, 0xb2, 0x02, 0x00, 0x0a, 0x11, 0x12, 0x39, 0xb0, + 0x02, 0x2f, 0xb0, 0x00, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x0e, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, + 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x13, 0x21, 0x11, 0x33, 0x32, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, + 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x21, 0x02, 0x56, 0xcf, 0x8c, 0xd4, 0x71, 0xfd, 0xda, 0xfe, 0x16, 0xfe, + 0xcb, 0x02, 0x56, 0xcd, 0x56, 0x5c, 0x5a, 0x58, 0x04, 0x3a, 0xfe, 0xc3, + 0x5e, 0xaf, 0x74, 0xab, 0xd1, 0x03, 0x50, 0xfe, 0xc5, 0xfe, 0xd2, 0x50, + 0x45, 0x46, 0x53, 0x00, 0x00, 0x03, 0x00, 0x82, 0x00, 0x00, 0x06, 0x10, + 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x6f, 0xb2, 0x07, + 0x19, 0x1a, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, + 0x07, 0x10, 0xb0, 0x14, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x00, + 0x0e, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x10, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, + 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x33, 0x32, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, + 0x21, 0x01, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x01, 0xa4, 0xcf, 0x8c, 0xd4, 0x71, 0xfd, 0xda, 0xfe, 0x15, + 0x01, 0x22, 0x04, 0x6c, 0xfe, 0xdf, 0x01, 0x21, 0xfb, 0x94, 0xcd, 0x56, + 0x5c, 0x5a, 0x58, 0x02, 0xfd, 0x5e, 0xaf, 0x74, 0xab, 0xd1, 0x04, 0x3a, + 0xfb, 0xc6, 0x04, 0x3a, 0xfd, 0xdb, 0xfe, 0xd2, 0x50, 0x45, 0x46, 0x53, + 0x00, 0x02, 0x00, 0x82, 0x00, 0x00, 0x04, 0x44, 0x04, 0x3a, 0x00, 0x0b, + 0x00, 0x14, 0x00, 0x4f, 0xb2, 0x08, 0x15, 0x16, 0x11, 0x12, 0x39, 0xb0, + 0x08, 0x10, 0xb0, 0x0e, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x0a, 0x08, + 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0d, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x33, 0x32, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x11, + 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0xa4, 0xcf, 0x8c, + 0xd4, 0x71, 0xfd, 0xda, 0xfe, 0x15, 0x01, 0x22, 0xcd, 0x56, 0x5c, 0x5a, + 0x58, 0x02, 0xfd, 0x5e, 0xaf, 0x74, 0xab, 0xd1, 0x04, 0x3a, 0xfd, 0xdb, + 0xfe, 0xd2, 0x50, 0x45, 0x46, 0x53, 0x00, 0x01, 0x00, 0x3f, 0xff, 0xec, + 0x03, 0xee, 0x04, 0x4e, 0x00, 0x1e, 0x00, 0x6f, 0xb2, 0x10, 0x1f, 0x20, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, + 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x08, + 0x10, 0x11, 0x12, 0x39, 0xb2, 0x14, 0x10, 0x08, 0x11, 0x12, 0x39, 0xb0, + 0x10, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x1d, 0x08, 0x10, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x1d, + 0x2f, 0x18, 0xb4, 0x40, 0x1d, 0x50, 0x1d, 0x02, 0x5d, 0xb1, 0x1a, 0x08, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x36, 0x33, 0x32, 0x00, 0x11, 0x15, + 0x14, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x21, 0x35, 0x21, 0x26, 0x01, 0xf9, 0x4e, 0x5c, 0xfe, 0xf0, + 0x75, 0xcb, 0x7a, 0xe5, 0x01, 0x10, 0x78, 0xe3, 0x98, 0xc8, 0xf4, 0x01, + 0x10, 0x5d, 0x4f, 0x57, 0x6a, 0x0c, 0xfe, 0xde, 0x01, 0x22, 0x1d, 0x03, + 0x64, 0x57, 0x49, 0x6e, 0xb6, 0x66, 0xfe, 0xd5, 0xfe, 0xfe, 0x13, 0xa0, + 0xf9, 0x89, 0xe6, 0xc0, 0x53, 0x6b, 0x7b, 0x79, 0xb1, 0xeb, 0x00, 0x02, + 0x00, 0x86, 0xff, 0xec, 0x06, 0x3c, 0x04, 0x4e, 0x00, 0x13, 0x00, 0x1f, + 0x00, 0x8d, 0xb2, 0x14, 0x20, 0x21, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x10, + 0xb0, 0x0c, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, + 0x1b, 0xb1, 0x13, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, + 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x10, 0x13, + 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x01, 0x2f, 0x18, 0xb4, 0x90, 0x01, 0xa0, + 0x01, 0x02, 0x5d, 0xb2, 0x40, 0x01, 0x01, 0x5d, 0xb4, 0x00, 0x01, 0x10, + 0x01, 0x02, 0x5d, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1d, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x33, 0x36, 0x24, 0x33, 0x32, 0x00, 0x17, 0x17, 0x14, 0x00, 0x23, 0x22, + 0x24, 0x27, 0x23, 0x11, 0x21, 0x11, 0x21, 0x01, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0xa8, 0x9c, 0x20, 0x01, + 0x0b, 0xcb, 0xdb, 0x01, 0x15, 0x10, 0x02, 0xfe, 0xea, 0xea, 0xd3, 0xfe, + 0xf3, 0x1b, 0x99, 0xfe, 0xde, 0x01, 0x22, 0x01, 0xb4, 0x74, 0x6c, 0x6b, + 0x74, 0x76, 0x6b, 0x6a, 0x74, 0x02, 0x9b, 0xca, 0xe9, 0xfe, 0xf4, 0xe6, + 0x4a, 0xf9, 0xfe, 0xd3, 0xf4, 0xd1, 0xfe, 0x4f, 0x04, 0x3a, 0xfd, 0xd8, + 0x9a, 0xa3, 0xa2, 0xb0, 0x97, 0xa6, 0xa5, 0x00, 0x00, 0x02, 0x00, 0x29, + 0x00, 0x00, 0x03, 0xf5, 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x63, + 0xb2, 0x04, 0x16, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x11, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, + 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, + 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x0f, 0x00, 0x01, 0x11, 0x12, 0x39, + 0xb0, 0x0f, 0x2f, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x03, 0x0f, 0x11, 0x12, 0x39, 0xb0, 0x00, + 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x23, 0x03, 0x21, 0x13, 0x26, + 0x26, 0x35, 0x34, 0x36, 0x37, 0x13, 0x33, 0x11, 0x23, 0x22, 0x06, 0x14, + 0x16, 0x03, 0xf5, 0xfe, 0xe0, 0xb7, 0xd0, 0xfe, 0xdb, 0xec, 0x61, 0x69, + 0xf3, 0xcc, 0x05, 0xc6, 0xbc, 0x4d, 0x60, 0x5c, 0x04, 0x3a, 0xfb, 0xc6, + 0x01, 0x76, 0xfe, 0x8a, 0x01, 0xa7, 0x2d, 0x9a, 0x62, 0x9d, 0xc9, 0x04, + 0xfe, 0x06, 0x01, 0x12, 0x51, 0x74, 0x4c, 0x00, 0x00, 0x01, 0xff, 0xcc, + 0xfe, 0x4b, 0x04, 0x0f, 0x06, 0x00, 0x00, 0x21, 0x00, 0x8a, 0xb2, 0x0e, + 0x22, 0x23, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x1f, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, + 0xb2, 0xbf, 0x1f, 0x01, 0x5d, 0xb2, 0x2f, 0x1f, 0x01, 0x5d, 0xb2, 0x0f, + 0x1f, 0x01, 0x5d, 0xb2, 0x21, 0x1f, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x21, + 0x2f, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x02, 0x04, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, + 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x04, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x1a, 0xd0, 0xb0, 0x21, 0x10, 0xb0, + 0x1d, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x15, 0x36, 0x33, 0x20, 0x13, 0x11, + 0x14, 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, + 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, + 0x15, 0x33, 0x02, 0x87, 0xfe, 0x73, 0xae, 0x01, 0x60, 0x05, 0xc8, 0xb4, + 0x4e, 0x41, 0x0e, 0x2b, 0x38, 0x79, 0x50, 0x5d, 0x7f, 0x39, 0xfe, 0xdf, + 0x9c, 0x9c, 0x01, 0x21, 0xfe, 0x04, 0xa5, 0xe1, 0x8a, 0xfe, 0x67, 0xfd, + 0x29, 0xc1, 0xd2, 0x11, 0xe5, 0x0c, 0xb0, 0x02, 0xc7, 0x5e, 0x59, 0x62, + 0xfc, 0xff, 0x04, 0xa5, 0xb7, 0xa4, 0xa4, 0x00, 0x00, 0x01, 0x00, 0x40, + 0xff, 0xec, 0x03, 0xf5, 0x04, 0x4e, 0x00, 0x1d, 0x00, 0x82, 0xb2, 0x16, + 0x1e, 0x1f, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, + 0x2f, 0x1b, 0xb1, 0x0f, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x08, 0x0f, + 0x11, 0x12, 0x39, 0xb2, 0x13, 0x0f, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x0f, + 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x19, 0x0f, 0x08, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x19, 0x2f, + 0x18, 0xb2, 0x8f, 0x19, 0x01, 0x72, 0xb4, 0xef, 0x19, 0xff, 0x19, 0x02, + 0x71, 0xb4, 0x1f, 0x19, 0x2f, 0x19, 0x02, 0x71, 0xb2, 0xaf, 0x19, 0x01, + 0x72, 0xb2, 0xbf, 0x19, 0x01, 0x71, 0xb1, 0x1a, 0x08, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, 0x36, 0x37, + 0x21, 0x0e, 0x02, 0x23, 0x22, 0x00, 0x11, 0x35, 0x34, 0x00, 0x33, 0x32, + 0x16, 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, 0x07, 0x21, 0x15, 0x21, 0x16, + 0x16, 0x02, 0x2f, 0x50, 0x64, 0x02, 0x01, 0x10, 0x01, 0x77, 0xcd, 0x7c, + 0xe6, 0xfe, 0xf2, 0x01, 0x0a, 0xe9, 0xca, 0xf6, 0x02, 0xfe, 0xf0, 0x02, + 0x64, 0x51, 0xbc, 0x0f, 0x01, 0x31, 0xfe, 0xd1, 0x0c, 0x63, 0xd5, 0x58, + 0x49, 0x6f, 0xb6, 0x65, 0x01, 0x26, 0x01, 0x04, 0x14, 0xfa, 0x01, 0x2a, + 0xe7, 0xc0, 0x56, 0x67, 0xfb, 0xb1, 0x75, 0x6e, 0x00, 0x02, 0x00, 0x15, + 0x00, 0x00, 0x06, 0xb2, 0x04, 0x3a, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x7d, + 0xb2, 0x08, 0x20, 0x21, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x17, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, + 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, + 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x15, 0x07, 0x11, 0x12, 0x39, + 0xb0, 0x00, 0x2f, 0xb0, 0x15, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x10, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, + 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x07, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x21, 0x11, 0x23, 0x03, 0x02, 0x06, 0x07, 0x23, 0x27, 0x37, 0x36, + 0x36, 0x37, 0x13, 0x21, 0x11, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x04, 0x12, 0xc6, 0xe1, 0xf9, 0xfc, 0xdb, 0xfe, 0x15, 0xf5, 0x12, + 0x11, 0xad, 0xac, 0x68, 0x02, 0x24, 0x4e, 0x48, 0x09, 0x14, 0x03, 0x26, + 0xcd, 0x56, 0x5c, 0x5c, 0x56, 0x02, 0xe4, 0xca, 0xa7, 0xa8, 0xcb, 0x03, + 0x50, 0xfe, 0xb2, 0xfe, 0xf7, 0xf4, 0x05, 0xeb, 0x03, 0x06, 0xac, 0xcf, + 0x01, 0xcb, 0xfd, 0xc2, 0xfe, 0xeb, 0x4d, 0x41, 0x3e, 0x49, 0x00, 0x02, + 0x00, 0x6f, 0x00, 0x00, 0x06, 0xb9, 0x04, 0x3a, 0x00, 0x12, 0x00, 0x1b, + 0x00, 0x9a, 0xb2, 0x01, 0x1c, 0x1d, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, + 0xb0, 0x13, 0xdc, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, + 0xb1, 0x12, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, + 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x0f, 0x12, + 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x00, 0x2f, 0x18, 0xb2, 0x40, 0x00, 0x01, + 0x5d, 0xb4, 0x00, 0x00, 0x10, 0x00, 0x02, 0x5d, 0xb4, 0x90, 0x00, 0xa0, + 0x00, 0x02, 0x5d, 0xb2, 0x04, 0x0c, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x04, + 0x2f, 0xb0, 0x00, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x14, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x21, 0x11, 0x21, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x01, 0x90, 0x01, 0x67, 0x01, 0x22, 0xc6, 0xe1, + 0xf9, 0xfc, 0xdb, 0xfe, 0x15, 0xfe, 0x99, 0xfe, 0xdf, 0x01, 0x21, 0x02, + 0x89, 0xcd, 0x56, 0x5c, 0x5c, 0x56, 0x02, 0x98, 0x01, 0xa2, 0xfe, 0xaa, + 0xca, 0xa7, 0xa8, 0xcb, 0x01, 0xb0, 0xfe, 0x50, 0x04, 0x3a, 0xfd, 0xc2, + 0xfe, 0xeb, 0x4d, 0x41, 0x3e, 0x49, 0x00, 0x01, 0xff, 0xda, 0x00, 0x00, + 0x04, 0x0f, 0x06, 0x00, 0x00, 0x18, 0x00, 0x76, 0xb2, 0x0c, 0x19, 0x1a, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x15, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb2, 0x2f, + 0x15, 0x01, 0x5d, 0xb2, 0x0f, 0x15, 0x01, 0x5d, 0xb2, 0x18, 0x0f, 0x15, + 0x11, 0x12, 0x39, 0xb0, 0x18, 0x2f, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x04, 0x07, 0x11, 0x12, + 0x39, 0xb0, 0x04, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x18, + 0x10, 0xb0, 0x13, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x15, 0x36, 0x33, 0x20, + 0x13, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x11, + 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x21, 0x02, 0x95, 0xfe, 0xf4, 0x73, + 0xae, 0x01, 0x60, 0x05, 0xfe, 0xdf, 0x50, 0x5d, 0x7f, 0x39, 0xfe, 0xdf, + 0x8e, 0x8e, 0x01, 0x21, 0x01, 0x0c, 0x04, 0xb1, 0xed, 0x8a, 0xfe, 0x67, + 0xfd, 0x4b, 0x02, 0xad, 0x5d, 0x59, 0x62, 0xfc, 0xff, 0x04, 0xb1, 0xb7, + 0x98, 0x98, 0x00, 0x01, 0x00, 0x6f, 0xfe, 0x99, 0x04, 0x1c, 0x04, 0x3a, + 0x00, 0x0b, 0x00, 0x46, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, + 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x01, 0x90, 0x01, 0x6a, 0x01, 0x22, 0xfe, 0xba, 0xfe, 0xdf, + 0xfe, 0xba, 0x04, 0x3a, 0xfc, 0xaf, 0x03, 0x51, 0xfb, 0xc6, 0xfe, 0x99, + 0x01, 0x67, 0x04, 0x3a, 0x00, 0x01, 0x00, 0x77, 0xff, 0xeb, 0x07, 0x13, + 0x05, 0xb0, 0x00, 0x1c, 0x00, 0x61, 0xb2, 0x06, 0x1d, 0x1e, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, + 0xb1, 0x14, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, + 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x00, 0x04, 0x11, + 0x12, 0x39, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x18, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x14, 0x00, 0x23, + 0x22, 0x27, 0x06, 0x23, 0x22, 0x00, 0x35, 0x11, 0x21, 0x11, 0x10, 0x33, + 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, 0x33, 0x32, 0x36, 0x35, 0x11, + 0x07, 0x13, 0xfe, 0xf6, 0xe7, 0xe5, 0x78, 0x78, 0xe6, 0xe5, 0xfe, 0xf5, + 0x01, 0x2d, 0xc3, 0x5c, 0x6b, 0x01, 0x2e, 0xc6, 0x5b, 0x69, 0x05, 0xb0, + 0xfc, 0x23, 0xe1, 0xfe, 0xf9, 0xa2, 0xa2, 0x01, 0x06, 0xe3, 0x03, 0xdc, + 0xfc, 0x2c, 0xff, 0x00, 0x75, 0x80, 0x03, 0xdf, 0xfc, 0x2a, 0xfe, 0x75, + 0x80, 0x03, 0xdf, 0x00, 0x00, 0x01, 0x00, 0x64, 0xff, 0xeb, 0x06, 0x40, + 0x04, 0x3a, 0x00, 0x1b, 0x00, 0x61, 0xb2, 0x07, 0x1c, 0x1d, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, + 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, + 0xb1, 0x14, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, + 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb2, 0x07, 0x14, 0x04, 0x11, + 0x12, 0x39, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x18, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x06, 0x06, 0x07, + 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x21, 0x11, 0x16, + 0x33, 0x32, 0x37, 0x11, 0x21, 0x11, 0x16, 0x33, 0x32, 0x37, 0x11, 0x06, + 0x40, 0x02, 0xeb, 0xca, 0x02, 0xc9, 0x6a, 0x6e, 0xcd, 0xc7, 0xeb, 0x03, + 0x01, 0x22, 0x04, 0x8f, 0xa9, 0x03, 0x01, 0x22, 0x05, 0x9b, 0x93, 0x04, + 0x04, 0x3a, 0xfd, 0x7e, 0xd7, 0xf5, 0x01, 0x90, 0x90, 0xf4, 0xd5, 0x02, + 0x86, 0xfd, 0x76, 0xdc, 0xe0, 0x02, 0x86, 0xfd, 0x73, 0xd9, 0xdb, 0x02, + 0x8b, 0x00, 0x00, 0x02, 0xff, 0xe5, 0x00, 0x00, 0x04, 0x43, 0x06, 0x19, + 0x00, 0x11, 0x00, 0x1a, 0x00, 0x74, 0xb2, 0x14, 0x1b, 0x1c, 0x11, 0x12, + 0x39, 0xb0, 0x14, 0x10, 0xb0, 0x03, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb2, 0x11, + 0x0e, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, 0x00, 0x07, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x0e, 0x08, + 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x10, 0xb0, 0x0a, 0xd0, + 0xb0, 0x11, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x12, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, + 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x21, 0x11, 0x33, 0x16, 0x16, 0x10, 0x06, 0x07, 0x21, + 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x27, 0x02, 0xa4, 0xff, 0x00, 0xd3, 0xd4, 0xf8, + 0xf6, 0xd1, 0xfe, 0x06, 0x9d, 0x9d, 0x01, 0x22, 0x01, 0x00, 0xff, 0x00, + 0xcd, 0x57, 0x5b, 0x57, 0x54, 0x04, 0x3a, 0xfe, 0xdc, 0x02, 0xd6, 0xfe, + 0x9e, 0xd9, 0x03, 0x04, 0x3a, 0xb7, 0x01, 0x28, 0xfe, 0xd8, 0xfd, 0x3d, + 0xfe, 0xb9, 0x58, 0x4d, 0x48, 0x58, 0x02, 0x00, 0x00, 0x01, 0x00, 0x7d, + 0xff, 0xed, 0x06, 0xfa, 0x05, 0xc5, 0x00, 0x23, 0x00, 0x7e, 0xb2, 0x0d, + 0x24, 0x25, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x23, + 0x2f, 0x1b, 0xb1, 0x23, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0c, 0x3e, 0x59, 0xb2, 0x00, + 0x23, 0x20, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb0, 0x05, 0x10, 0xb1, + 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x00, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x1f, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0xd0, 0xb0, + 0x1b, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x36, 0x12, 0x24, 0x33, 0x32, 0x00, + 0x17, 0x21, 0x26, 0x26, 0x20, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x21, 0x06, 0x00, 0x23, 0x20, 0x00, 0x03, 0x23, + 0x11, 0x21, 0x11, 0x21, 0x01, 0xa9, 0xaf, 0x0e, 0x9d, 0x01, 0x07, 0xa8, + 0xfc, 0x01, 0x34, 0x18, 0xfe, 0xd4, 0x0b, 0x87, 0xfe, 0xec, 0x94, 0x0d, + 0x01, 0xad, 0xfe, 0x52, 0x08, 0x90, 0x91, 0x8a, 0x89, 0x0a, 0x01, 0x2c, + 0x11, 0xfe, 0xc7, 0xff, 0xfe, 0xf3, 0xfe, 0xc2, 0x0e, 0xad, 0xfe, 0xd4, + 0x01, 0x2c, 0x03, 0x5c, 0xbc, 0x01, 0x19, 0x94, 0xfe, 0xf2, 0xf4, 0x8d, + 0x7f, 0xb6, 0xbd, 0xea, 0xd0, 0xc0, 0x7d, 0x87, 0xeb, 0xfe, 0xf2, 0x01, + 0x5a, 0x01, 0x2b, 0xfd, 0x8e, 0x05, 0xb0, 0x00, 0x00, 0x01, 0x00, 0x75, + 0xff, 0xec, 0x05, 0xce, 0x04, 0x4e, 0x00, 0x21, 0x00, 0x9c, 0xb2, 0x03, + 0x22, 0x23, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, + 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, 0x1e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x0c, 0x3e, 0x59, 0xb2, 0x0e, + 0x20, 0x1e, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x0e, 0x2f, 0x18, 0xb4, 0x40, + 0x0e, 0x50, 0x0e, 0x02, 0x5d, 0xb4, 0xd0, 0x0e, 0xe0, 0x0e, 0x02, 0x5d, + 0xb0, 0x00, 0xd0, 0xb2, 0x07, 0x04, 0x19, 0x11, 0x12, 0x39, 0xb0, 0x04, + 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x0f, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x19, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x15, 0x19, 0x04, 0x11, + 0x12, 0x39, 0xb0, 0x0f, 0x10, 0xb0, 0x1c, 0xd0, 0x30, 0x31, 0x01, 0x33, + 0x36, 0x24, 0x33, 0x32, 0x16, 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, 0x07, + 0x21, 0x15, 0x21, 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, 0x06, 0x06, 0x23, + 0x22, 0x24, 0x27, 0x23, 0x11, 0x21, 0x11, 0x21, 0x01, 0x97, 0x87, 0x16, + 0x01, 0x04, 0xd4, 0xca, 0xf6, 0x02, 0xfe, 0xf1, 0x02, 0x64, 0x52, 0xb1, + 0x18, 0x01, 0x45, 0xfe, 0xba, 0x13, 0xb8, 0x50, 0x65, 0x02, 0x01, 0x0f, + 0x02, 0xff, 0xbf, 0xd5, 0xfe, 0xf8, 0x14, 0x86, 0xfe, 0xde, 0x01, 0x22, + 0x02, 0x7a, 0xda, 0xfa, 0xe7, 0xc0, 0x54, 0x69, 0xea, 0xb7, 0xee, 0x59, + 0x48, 0xa9, 0xe1, 0xfb, 0xdc, 0xfe, 0x3d, 0x04, 0x3a, 0x00, 0x00, 0x02, + 0x00, 0x0f, 0x00, 0x00, 0x05, 0x47, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x0e, + 0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb2, 0x0d, 0x08, 0x02, 0x11, + 0x12, 0x39, 0xb0, 0x0d, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb2, 0x0e, 0x08, 0x02, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, + 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x03, 0x03, 0x82, 0x60, 0xfa, + 0x55, 0x89, 0xfe, 0xc5, 0x02, 0x01, 0x01, 0x38, 0x01, 0xff, 0xfe, 0xc5, + 0xfe, 0x0b, 0x01, 0x27, 0x93, 0x01, 0xa3, 0xfe, 0x5d, 0x01, 0xa3, 0xfe, + 0x5d, 0x05, 0xb0, 0xfa, 0x50, 0x02, 0x73, 0x01, 0xc1, 0x00, 0x00, 0x02, + 0x00, 0x07, 0x00, 0x00, 0x04, 0x62, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x10, + 0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb2, 0x0d, 0x02, 0x08, 0x11, + 0x12, 0x39, 0xb0, 0x0d, 0x2f, 0xb1, 0x01, 0x08, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb2, 0x0f, 0x08, 0x02, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, + 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x33, 0x27, 0x27, 0x07, 0x02, 0xdc, + 0x4d, 0xbf, 0x45, 0x5d, 0xfe, 0xd9, 0x01, 0x99, 0x01, 0x29, 0x01, 0x99, + 0xfe, 0xd9, 0xfe, 0x91, 0xce, 0x49, 0x1e, 0x1e, 0x01, 0x0d, 0xfe, 0xf3, + 0x01, 0x0d, 0xfe, 0xf3, 0x04, 0x3a, 0xfb, 0xc6, 0x01, 0xc9, 0xd2, 0x80, + 0x80, 0x00, 0x00, 0x02, 0x00, 0x93, 0x00, 0x00, 0x07, 0x68, 0x05, 0xb0, + 0x00, 0x13, 0x00, 0x16, 0x00, 0x7d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, + 0x59, 0xb2, 0x15, 0x02, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x15, 0x2f, 0xb0, + 0x00, 0xd0, 0xb0, 0x15, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0xb0, 0x06, 0x10, 0xb0, + 0x0e, 0xd0, 0xb2, 0x16, 0x02, 0x04, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x21, 0x01, 0x21, 0x01, 0x21, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, + 0x21, 0x13, 0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0x21, 0x03, 0x01, 0xbf, + 0x01, 0x4d, 0x01, 0x25, 0x01, 0x38, 0x01, 0xff, 0xfe, 0xc5, 0x8a, 0x60, + 0xfa, 0x54, 0x8a, 0xfe, 0xc5, 0x93, 0xfe, 0xfc, 0xfe, 0xd4, 0x01, 0x2c, + 0x02, 0x7a, 0x01, 0x26, 0x93, 0x02, 0x72, 0x03, 0x3e, 0xfa, 0x50, 0x01, + 0xa3, 0xfe, 0x5d, 0x01, 0xa3, 0xfe, 0x5d, 0x01, 0xa3, 0xfe, 0x5d, 0x05, + 0xb0, 0xfc, 0xc3, 0x01, 0xbf, 0x00, 0x00, 0x02, 0x00, 0x7e, 0x00, 0x00, + 0x06, 0x4b, 0x04, 0x3a, 0x00, 0x13, 0x00, 0x18, 0x00, 0x80, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, + 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x10, 0x12, 0x11, 0x12, 0x39, + 0xb0, 0x00, 0x2f, 0xb0, 0x01, 0xd0, 0xb1, 0x0e, 0x08, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0xd0, 0xb0, 0x07, 0xd0, + 0xb0, 0x01, 0x10, 0xb0, 0x14, 0xd0, 0xb0, 0x15, 0xd0, 0xb2, 0x17, 0x12, + 0x04, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x33, 0x13, 0x21, 0x01, 0x21, + 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x21, 0x13, 0x23, 0x11, 0x21, + 0x11, 0x21, 0x01, 0x33, 0x27, 0x27, 0x07, 0x01, 0xa0, 0xfc, 0xed, 0x01, + 0x28, 0x01, 0x9a, 0xfe, 0xd9, 0x5f, 0x4d, 0xbf, 0x45, 0x5d, 0xfe, 0xd8, + 0x66, 0xb5, 0xfe, 0xde, 0x01, 0x22, 0x02, 0x15, 0xce, 0x49, 0x1e, 0x1e, + 0x01, 0xc8, 0x02, 0x72, 0xfb, 0xc6, 0x01, 0x0d, 0xfe, 0xf3, 0x01, 0x0d, + 0xfe, 0xf3, 0x01, 0x0d, 0xfe, 0xf3, 0x04, 0x3a, 0xfd, 0x8f, 0xd2, 0x80, + 0x80, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x06, 0x8b, 0x05, 0xb0, + 0x00, 0x19, 0x00, 0x1c, 0x00, 0x7c, 0xb2, 0x1a, 0x1d, 0x1e, 0x11, 0x12, + 0x39, 0xb0, 0x1a, 0x10, 0xb0, 0x0c, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, + 0xb2, 0x17, 0x18, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x2f, 0xb0, 0x00, + 0xd0, 0xb0, 0x17, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0xd0, 0xb0, 0x0e, 0xd0, 0xb2, 0x1a, + 0x18, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x18, 0x10, 0xb1, 0x1b, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x16, + 0x16, 0x17, 0x11, 0x21, 0x11, 0x26, 0x26, 0x27, 0x23, 0x11, 0x21, 0x11, + 0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x11, 0x36, 0x24, 0x25, 0x01, 0x21, + 0x01, 0x13, 0x21, 0x04, 0x9d, 0xf8, 0xf1, 0x05, 0xfe, 0xd4, 0x01, 0x69, + 0x7a, 0x5b, 0xfe, 0xd4, 0x6b, 0x82, 0x6d, 0x01, 0xfe, 0xd4, 0x01, 0x01, + 0x01, 0x01, 0x0e, 0xfe, 0x8c, 0x05, 0x0a, 0xfd, 0x7b, 0xbc, 0xfe, 0x88, + 0x03, 0x1f, 0x08, 0xdd, 0xd7, 0xfe, 0x9d, 0x01, 0x57, 0x71, 0x61, 0x02, + 0xfd, 0xd5, 0x02, 0x2b, 0x63, 0x71, 0xfe, 0xa9, 0x01, 0x55, 0xe6, 0xe3, + 0x02, 0x02, 0x90, 0xfd, 0x9e, 0x01, 0x6c, 0x00, 0x00, 0x02, 0x00, 0x6f, + 0x00, 0x00, 0x05, 0x6f, 0x04, 0x3a, 0x00, 0x18, 0x00, 0x1b, 0x00, 0x75, + 0xb2, 0x19, 0x1c, 0x1d, 0x11, 0x12, 0x39, 0xb0, 0x19, 0x10, 0xb0, 0x0b, + 0xd0, 0x00, 0xb0, 0x16, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, + 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, + 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb0, 0x16, 0x10, + 0xb0, 0x00, 0xd0, 0xb0, 0x16, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0xd0, 0xb2, 0x19, 0x17, + 0x04, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x16, 0x16, + 0x15, 0x15, 0x21, 0x35, 0x26, 0x26, 0x23, 0x11, 0x21, 0x11, 0x23, 0x22, + 0x06, 0x07, 0x15, 0x21, 0x35, 0x36, 0x36, 0x37, 0x01, 0x21, 0x01, 0x13, + 0x23, 0x03, 0xf8, 0xc1, 0xb6, 0xfe, 0xdf, 0x01, 0x58, 0x71, 0xfe, 0xdf, + 0x16, 0x67, 0x55, 0x01, 0xfe, 0xdf, 0x02, 0xbf, 0xc4, 0xfe, 0xef, 0x04, + 0x26, 0xfd, 0xed, 0x7e, 0xfb, 0x02, 0x60, 0x16, 0xd6, 0xbf, 0xb5, 0xbd, + 0x6f, 0x5c, 0xfe, 0x78, 0x01, 0x88, 0x5e, 0x6e, 0xbc, 0xbe, 0xc3, 0xce, + 0x13, 0x01, 0xd8, 0xfe, 0x3b, 0x01, 0x06, 0x00, 0x00, 0x02, 0x00, 0x95, + 0x00, 0x00, 0x08, 0xe0, 0x05, 0xb0, 0x00, 0x1f, 0x00, 0x22, 0x00, 0xa2, + 0xb2, 0x0a, 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb0, 0x22, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, + 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, + 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, + 0x2f, 0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0c, 0x3e, 0x59, 0xb2, 0x09, 0x07, 0x00, + 0x11, 0x12, 0x39, 0xb0, 0x09, 0x2f, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x0d, 0xd0, + 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x1a, 0xd0, 0xb0, 0x1b, 0xd0, 0xb2, 0x20, 0x07, 0x00, 0x11, 0x12, + 0x39, 0xb0, 0x0b, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x11, 0x34, 0x37, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0x21, 0x01, 0x16, 0x16, 0x17, 0x11, + 0x21, 0x11, 0x26, 0x26, 0x27, 0x23, 0x11, 0x21, 0x11, 0x23, 0x22, 0x06, + 0x07, 0x11, 0x01, 0x13, 0x21, 0x02, 0xc2, 0x2b, 0xfe, 0xd4, 0xfe, 0xd4, + 0x01, 0x2c, 0x03, 0x0f, 0xfe, 0x8e, 0x05, 0x0a, 0xfe, 0x8a, 0xf8, 0xf1, + 0x05, 0xfe, 0xd4, 0x01, 0x69, 0x7a, 0x5b, 0xfe, 0xd4, 0x6b, 0x82, 0x6d, + 0x01, 0x01, 0xf5, 0xbc, 0xfe, 0x88, 0x01, 0x52, 0x84, 0x62, 0xfd, 0xc8, + 0x05, 0xb0, 0xfd, 0x74, 0x02, 0x8c, 0xfd, 0x6f, 0x08, 0xdd, 0xd7, 0xfe, + 0x9d, 0x01, 0x57, 0x71, 0x61, 0x02, 0xfd, 0xd5, 0x02, 0x2b, 0x63, 0x71, + 0xfe, 0xa9, 0x03, 0x4e, 0x01, 0x6c, 0x00, 0x02, 0x00, 0x86, 0x00, 0x00, + 0x07, 0x9d, 0x04, 0x3a, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x99, 0xb2, 0x1b, + 0x22, 0x23, 0x11, 0x12, 0x39, 0xb0, 0x1b, 0x10, 0xb0, 0x21, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, + 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, + 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, + 0x1b, 0xb1, 0x17, 0x0c, 0x3e, 0x59, 0xb2, 0x09, 0x0b, 0x00, 0x11, 0x12, + 0x39, 0xb0, 0x09, 0x2f, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x04, + 0x10, 0xb0, 0x1a, 0xd0, 0xb0, 0x16, 0xd0, 0xb2, 0x1f, 0x0b, 0x00, 0x11, + 0x12, 0x39, 0xb0, 0x0b, 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x35, 0x34, 0x37, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0x21, 0x01, 0x16, 0x16, 0x15, + 0x15, 0x21, 0x35, 0x34, 0x26, 0x23, 0x11, 0x21, 0x11, 0x23, 0x22, 0x06, + 0x07, 0x15, 0x01, 0x13, 0x23, 0x02, 0x9c, 0x28, 0xfe, 0xe3, 0xfe, 0xdf, + 0x01, 0x21, 0x02, 0x79, 0xfe, 0xf1, 0x04, 0x26, 0xfe, 0xef, 0xc1, 0xb6, + 0xfe, 0xde, 0x55, 0x74, 0xfe, 0xdf, 0x16, 0x68, 0x55, 0x01, 0x01, 0x67, + 0x7d, 0xfa, 0xb5, 0x80, 0x5b, 0xfe, 0x70, 0x04, 0x3a, 0xfe, 0x2c, 0x01, + 0xd4, 0xfe, 0x26, 0x16, 0xd6, 0xbf, 0xb5, 0xb7, 0x71, 0x60, 0xfe, 0x78, + 0x01, 0x88, 0x5e, 0x6e, 0xbc, 0x02, 0x75, 0x01, 0x06, 0x00, 0x00, 0x02, + 0x00, 0x07, 0xfe, 0x40, 0x03, 0xb2, 0x07, 0x88, 0x00, 0x28, 0x00, 0x31, + 0x00, 0xac, 0xb2, 0x1f, 0x32, 0x33, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x10, + 0xb0, 0x29, 0xd0, 0x00, 0xb0, 0x2e, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb0, 0x05, + 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x25, 0x11, 0x05, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x25, 0x2f, + 0x18, 0xb4, 0x30, 0x25, 0x40, 0x25, 0x02, 0x5d, 0xb2, 0x80, 0x25, 0x01, + 0x5d, 0xb4, 0xa0, 0x25, 0xb0, 0x25, 0x02, 0x5d, 0xb1, 0x24, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0b, 0x24, 0x25, + 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0f, 0x2e, 0x01, 0x5d, 0xb0, + 0x2e, 0x10, 0xb0, 0x31, 0xd0, 0xb0, 0x31, 0x2f, 0xb4, 0x0f, 0x31, 0x1f, + 0x31, 0x02, 0x5d, 0xb2, 0x29, 0x2e, 0x31, 0x11, 0x12, 0x39, 0xb0, 0x2a, + 0xd0, 0xb0, 0x2a, 0x2f, 0x30, 0x31, 0x01, 0x34, 0x26, 0x23, 0x21, 0x35, + 0x21, 0x20, 0x04, 0x15, 0x14, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, + 0x23, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x26, 0x27, 0x34, 0x36, 0x37, + 0x33, 0x36, 0x36, 0x35, 0x34, 0x21, 0x23, 0x35, 0x33, 0x36, 0x36, 0x03, + 0x37, 0x33, 0x15, 0x01, 0x23, 0x01, 0x35, 0x33, 0x02, 0x64, 0x6f, 0x77, + 0xfe, 0xfb, 0x01, 0x02, 0x01, 0x00, 0x01, 0x0b, 0xe4, 0x84, 0x8c, 0xfe, + 0xf1, 0xf0, 0x38, 0x6d, 0x91, 0x52, 0x9a, 0xaa, 0x02, 0xb4, 0xa9, 0x4a, + 0x68, 0x7a, 0xfe, 0xe9, 0x8b, 0x9f, 0x67, 0x70, 0x79, 0x92, 0xf7, 0xfe, + 0xd2, 0xb7, 0xfe, 0xd2, 0xf7, 0x04, 0x18, 0x4c, 0x5b, 0xf1, 0xc6, 0xb6, + 0xed, 0x5d, 0x2a, 0xab, 0x7d, 0xc6, 0xe7, 0x02, 0x5c, 0x62, 0x3a, 0xb1, + 0x23, 0xc0, 0x92, 0x8c, 0x99, 0x02, 0x01, 0x65, 0x52, 0xdc, 0xf1, 0x02, + 0x5e, 0x03, 0x38, 0x8f, 0x0b, 0xfe, 0xe7, 0x01, 0x1b, 0x09, 0x00, 0x02, + 0x00, 0x1c, 0xfe, 0x50, 0x03, 0x98, 0x06, 0x05, 0x00, 0x25, 0x00, 0x2e, + 0x00, 0xa7, 0xb2, 0x1d, 0x2f, 0x30, 0x11, 0x12, 0x39, 0xb0, 0x1d, 0x10, + 0xb0, 0x26, 0xd0, 0x00, 0xb0, 0x2b, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0e, 0x3e, 0x59, 0xb0, 0x04, + 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x23, 0x04, 0x0f, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x23, 0x2f, + 0x18, 0xb4, 0x40, 0x23, 0x50, 0x23, 0x02, 0x5d, 0xb4, 0xd0, 0x23, 0xe0, + 0x23, 0x02, 0x5d, 0xb1, 0x22, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x22, 0x23, 0x11, 0x12, 0x39, 0xb0, 0x0f, + 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x0f, 0x2b, 0x01, 0x5d, 0xb0, 0x2b, 0x10, 0xb0, 0x2e, 0xd0, + 0xb0, 0x2e, 0x2f, 0xb4, 0x0f, 0x2e, 0x1f, 0x2e, 0x02, 0x5d, 0xb2, 0x26, + 0x2b, 0x2e, 0x11, 0x12, 0x39, 0xb0, 0x27, 0xd0, 0xb0, 0x27, 0x2f, 0x30, + 0x31, 0x01, 0x34, 0x23, 0x23, 0x35, 0x21, 0x16, 0x16, 0x15, 0x14, 0x07, + 0x16, 0x15, 0x14, 0x06, 0x07, 0x23, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, + 0x26, 0x27, 0x34, 0x36, 0x33, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, + 0x35, 0x33, 0x32, 0x03, 0x37, 0x33, 0x15, 0x01, 0x23, 0x01, 0x35, 0x33, + 0x02, 0x4a, 0xd3, 0xfe, 0x01, 0x0f, 0xed, 0xf6, 0xb0, 0xdd, 0xf7, 0xd1, + 0x3e, 0x7c, 0x81, 0x51, 0x88, 0xa0, 0x02, 0xa8, 0xa2, 0x35, 0x61, 0x7b, + 0xf0, 0x99, 0x9d, 0xbf, 0x73, 0x93, 0xf6, 0xfe, 0xd2, 0xb6, 0xfe, 0xd1, + 0xf7, 0x02, 0xf5, 0x72, 0xd3, 0x02, 0x9b, 0x8d, 0xa9, 0x4b, 0x42, 0xaa, + 0x95, 0xae, 0x02, 0x02, 0x5c, 0x63, 0x39, 0xa1, 0x2c, 0xc1, 0x78, 0x7d, + 0x8b, 0x44, 0x39, 0x85, 0xb4, 0x03, 0x03, 0x8f, 0x0b, 0xfe, 0xe7, 0x01, + 0x1a, 0x0a, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xec, 0x05, 0x32, 0x05, 0xc4, + 0x00, 0x10, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x85, 0xb2, 0x18, 0x1f, 0x20, + 0x11, 0x12, 0x39, 0xb0, 0x18, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x18, 0x10, + 0xb0, 0x11, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, + 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1b, 0x0c, 0x04, 0x11, 0x12, + 0x39, 0xb0, 0x1b, 0x2f, 0xb4, 0x6c, 0x1b, 0x7c, 0x1b, 0x02, 0x5d, 0xb2, + 0xcc, 0x1b, 0x01, 0x5d, 0xb4, 0x0c, 0x1b, 0x1c, 0x1b, 0x02, 0x71, 0xb2, + 0x9c, 0x1b, 0x01, 0x5d, 0xb2, 0x6c, 0x1b, 0x01, 0x71, 0xb4, 0x2c, 0x1b, + 0x3c, 0x1b, 0x02, 0x72, 0xb1, 0x15, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, + 0x04, 0x23, 0x22, 0x24, 0x02, 0x27, 0x35, 0x34, 0x12, 0x24, 0x20, 0x04, + 0x12, 0x15, 0x01, 0x32, 0x36, 0x37, 0x21, 0x16, 0x16, 0x13, 0x22, 0x06, + 0x07, 0x21, 0x26, 0x26, 0x05, 0x32, 0x98, 0xfe, 0xe5, 0xb7, 0xb5, 0xfe, + 0xe4, 0x9c, 0x01, 0x9b, 0x01, 0x1b, 0x01, 0x6c, 0x01, 0x1b, 0x9b, 0xfd, + 0x96, 0x8e, 0xa1, 0x0a, 0xfd, 0x8a, 0x0b, 0xa3, 0x8d, 0x8e, 0xa1, 0x0b, + 0x02, 0x75, 0x0b, 0xa3, 0x02, 0xb7, 0xd7, 0xfe, 0xbc, 0xb0, 0xae, 0x01, + 0x43, 0xd2, 0x48, 0xd7, 0x01, 0x47, 0xaf, 0xaf, 0xfe, 0xb9, 0xd6, 0xfd, + 0xea, 0xd4, 0xca, 0xca, 0xd4, 0x03, 0xea, 0xcf, 0xc7, 0xc7, 0xcf, 0x00, + 0x00, 0x03, 0x00, 0x40, 0xff, 0xec, 0x04, 0x41, 0x04, 0x4e, 0x00, 0x0f, + 0x00, 0x16, 0x00, 0x1d, 0x00, 0x70, 0xb2, 0x0c, 0x1e, 0x1f, 0x11, 0x12, + 0x39, 0xb0, 0x0c, 0x10, 0xb0, 0x10, 0xd0, 0xb0, 0x0c, 0x10, 0xb0, 0x17, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x04, 0x0c, 0x11, + 0x12, 0x39, 0x7c, 0xb0, 0x14, 0x2f, 0x18, 0xb4, 0x40, 0x14, 0x50, 0x14, + 0x02, 0x5d, 0xb0, 0x0c, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, 0xb1, 0x1a, 0x08, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, + 0x36, 0x36, 0x33, 0x32, 0x00, 0x11, 0x15, 0x14, 0x06, 0x06, 0x23, 0x22, + 0x00, 0x27, 0x01, 0x22, 0x06, 0x07, 0x21, 0x26, 0x26, 0x03, 0x32, 0x36, + 0x37, 0x21, 0x16, 0x16, 0x40, 0x7d, 0xea, 0x99, 0xea, 0x01, 0x17, 0x7d, + 0xe7, 0x9b, 0xe0, 0xfe, 0xea, 0x0b, 0x01, 0xff, 0x5b, 0x72, 0x0d, 0x01, + 0xb5, 0x0e, 0x71, 0x5a, 0x5b, 0x6e, 0x10, 0xfe, 0x4c, 0x0d, 0x70, 0x02, + 0x27, 0xa2, 0xfc, 0x89, 0xfe, 0xd3, 0xfe, 0xfc, 0x0b, 0xa2, 0xfc, 0x88, + 0x01, 0x16, 0xec, 0x01, 0x76, 0x7e, 0x71, 0x75, 0x7a, 0xfd, 0x71, 0x77, + 0x72, 0x6f, 0x7a, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x05, 0x08, + 0x05, 0xc2, 0x00, 0x0f, 0x00, 0x47, 0xb2, 0x01, 0x10, 0x11, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, + 0x0f, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, + 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x06, 0x0c, 0x11, 0x12, 0x39, + 0xb0, 0x06, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x37, 0x13, 0x36, 0x36, 0x33, + 0x17, 0x07, 0x23, 0x22, 0x07, 0x01, 0x21, 0x01, 0x21, 0x02, 0x79, 0x13, + 0x13, 0xcf, 0x39, 0xb2, 0x88, 0x27, 0x02, 0x1b, 0x56, 0x23, 0xfe, 0xb6, + 0xfe, 0xc9, 0xfe, 0x1a, 0x01, 0x3e, 0x01, 0x8b, 0x5b, 0x57, 0x02, 0xdb, + 0xb9, 0xa7, 0x01, 0xfc, 0x76, 0xfb, 0xb1, 0x05, 0xb0, 0x00, 0x00, 0x01, + 0x00, 0x11, 0x00, 0x00, 0x04, 0x24, 0x04, 0x4e, 0x00, 0x11, 0x00, 0x47, + 0xb2, 0x02, 0x12, 0x13, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb2, + 0x01, 0x10, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb1, 0x0a, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x17, 0x37, 0x13, 0x36, 0x36, 0x33, 0x32, 0x17, 0x07, 0x27, 0x22, 0x06, + 0x07, 0x03, 0x21, 0x01, 0x21, 0x01, 0xe2, 0x14, 0x13, 0x5d, 0x30, 0xa6, + 0x81, 0x41, 0x26, 0x18, 0x32, 0x26, 0x3c, 0x0d, 0xea, 0xfe, 0xec, 0xfe, + 0xa4, 0x01, 0x2e, 0x01, 0x9d, 0x6a, 0x6a, 0x01, 0x63, 0xa1, 0xad, 0x12, + 0xe5, 0x04, 0x3c, 0x2c, 0xfd, 0x0d, 0x04, 0x3a, 0x00, 0x02, 0x00, 0x5a, + 0xff, 0x79, 0x05, 0x32, 0x06, 0x27, 0x00, 0x14, 0x00, 0x27, 0x00, 0x57, + 0xb2, 0x06, 0x28, 0x29, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb0, 0x21, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, + 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x11, + 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x18, 0xd0, 0xb0, 0x07, 0x10, 0xb1, 0x21, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x24, + 0xd0, 0x30, 0x31, 0x01, 0x14, 0x02, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, + 0x00, 0x11, 0x35, 0x10, 0x00, 0x37, 0x35, 0x33, 0x15, 0x16, 0x00, 0x11, + 0x25, 0x34, 0x26, 0x27, 0x15, 0x23, 0x35, 0x06, 0x11, 0x15, 0x14, 0x16, + 0x17, 0x35, 0x33, 0x15, 0x36, 0x36, 0x35, 0x05, 0x32, 0x80, 0xee, 0xa0, + 0xc4, 0xee, 0xfe, 0xe8, 0x01, 0x16, 0xee, 0xc3, 0xf2, 0x01, 0x1f, 0xfe, + 0xd1, 0x75, 0x6d, 0xc3, 0xd4, 0x6e, 0x68, 0xc4, 0x6c, 0x73, 0x02, 0xb7, + 0xc3, 0xfe, 0xcd, 0xb9, 0x16, 0x79, 0x7b, 0x23, 0x01, 0x7c, 0x01, 0x29, + 0x3b, 0x01, 0x25, 0x01, 0x7b, 0x25, 0x6b, 0x69, 0x21, 0xfe, 0x85, 0xfe, + 0xcf, 0x08, 0xc0, 0xe5, 0x21, 0x66, 0x62, 0x4c, 0xfe, 0x81, 0x39, 0xba, + 0xe5, 0x25, 0x5d, 0x61, 0x22, 0xe7, 0xbf, 0x00, 0x00, 0x02, 0x00, 0x42, + 0xff, 0x85, 0x04, 0x43, 0x04, 0xb3, 0x00, 0x13, 0x00, 0x23, 0x00, 0x5a, + 0xb2, 0x0d, 0x24, 0x25, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb0, 0x14, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, + 0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x10, + 0x10, 0xb0, 0x0d, 0xd0, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1a, 0xd0, 0xb0, 0x14, + 0x10, 0xb0, 0x21, 0xd0, 0x30, 0x31, 0x13, 0x34, 0x12, 0x37, 0x35, 0x33, + 0x15, 0x16, 0x12, 0x15, 0x15, 0x14, 0x02, 0x07, 0x15, 0x23, 0x35, 0x26, + 0x02, 0x35, 0x01, 0x36, 0x35, 0x35, 0x34, 0x26, 0x27, 0x15, 0x23, 0x35, + 0x06, 0x11, 0x14, 0x17, 0x35, 0x33, 0x42, 0xe7, 0xc8, 0xa7, 0xc4, 0xe7, + 0xe9, 0xc8, 0xa6, 0xc6, 0xe4, 0x02, 0x50, 0x90, 0x47, 0x43, 0xa7, 0x8e, + 0x89, 0xa6, 0x02, 0x27, 0xdf, 0x01, 0x28, 0x1b, 0x6a, 0x6b, 0x1b, 0xfe, + 0xdb, 0xe7, 0x0f, 0xe2, 0xfe, 0xda, 0x19, 0x6c, 0x6d, 0x1b, 0x01, 0x25, + 0xe6, 0xfe, 0xcb, 0x39, 0xfd, 0x0e, 0x74, 0x9b, 0x1d, 0x61, 0x63, 0x38, + 0xfe, 0xf5, 0xf2, 0x3b, 0x6e, 0x00, 0x00, 0x03, 0x00, 0x77, 0xff, 0xeb, + 0x07, 0x02, 0x07, 0x25, 0x00, 0x2a, 0x00, 0x3e, 0x00, 0x47, 0x00, 0xa9, + 0xb2, 0x30, 0x48, 0x49, 0x11, 0x12, 0x39, 0xb0, 0x30, 0x10, 0xb0, 0x09, + 0xd0, 0xb0, 0x30, 0x10, 0xb0, 0x46, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x12, + 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x07, 0xd0, 0xb0, 0x12, + 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1e, 0x0b, 0x12, 0x11, 0x12, 0x39, 0xb0, + 0x23, 0xd0, 0xb0, 0x13, 0x10, 0xb0, 0x2a, 0xd0, 0xb0, 0x12, 0x10, 0xb0, + 0x36, 0xd0, 0xb0, 0x36, 0x2f, 0xb0, 0x2c, 0xd0, 0xb0, 0x2c, 0x2f, 0xb1, + 0x2b, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x2c, 0x10, 0xb0, 0x32, 0xd0, 0xb0, 0x32, 0x2f, 0xb1, 0x39, 0x0a, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x36, 0x10, 0xb0, + 0x42, 0xd0, 0xb0, 0x42, 0x2f, 0xb0, 0x47, 0xd0, 0xb0, 0x47, 0x2f, 0x30, + 0x31, 0x01, 0x32, 0x00, 0x15, 0x11, 0x14, 0x00, 0x23, 0x22, 0x27, 0x06, + 0x23, 0x22, 0x00, 0x35, 0x11, 0x34, 0x00, 0x33, 0x15, 0x22, 0x06, 0x15, + 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x13, 0x15, 0x23, 0x22, + 0x2e, 0x02, 0x23, 0x22, 0x15, 0x15, 0x23, 0x35, 0x34, 0x33, 0x32, 0x1e, + 0x02, 0x17, 0x01, 0x36, 0x37, 0x35, 0x33, 0x15, 0x14, 0x06, 0x07, 0x05, + 0x12, 0xe3, 0x01, 0x0d, 0xfe, 0xf5, 0xe5, 0xdd, 0x79, 0x79, 0xdc, 0xe5, + 0xfe, 0xf5, 0x01, 0x0d, 0xe3, 0x59, 0x6a, 0x6a, 0x59, 0x5c, 0x6b, 0x01, + 0x1d, 0x6b, 0x5c, 0x58, 0x6b, 0x6b, 0x58, 0x6f, 0x14, 0x52, 0x8a, 0xc9, + 0x2c, 0x16, 0x66, 0x85, 0xe8, 0x39, 0x6c, 0x79, 0x7a, 0x4a, 0xfd, 0xd8, + 0x41, 0x03, 0xa9, 0x60, 0x3b, 0x05, 0xb0, 0xfe, 0xf6, 0xe9, 0xfe, 0x1b, + 0xe3, 0xfe, 0xf6, 0x97, 0x97, 0x01, 0x0a, 0xe5, 0x01, 0xe7, 0xe5, 0x01, + 0x0a, 0xf3, 0x79, 0x83, 0xfe, 0x17, 0x83, 0x79, 0x75, 0x80, 0x01, 0x5e, + 0xfe, 0xa2, 0x80, 0x75, 0x79, 0x83, 0x01, 0xe9, 0x83, 0x79, 0x01, 0xf0, + 0x86, 0x22, 0x4d, 0x09, 0x69, 0x0f, 0x22, 0xdc, 0x25, 0x2f, 0x23, 0x01, + 0xfe, 0x8b, 0x52, 0x3c, 0x68, 0x67, 0x31, 0x78, 0x1f, 0x00, 0x00, 0x03, + 0x00, 0x6c, 0xff, 0xeb, 0x06, 0x06, 0x05, 0xd3, 0x00, 0x29, 0x00, 0x3c, + 0x00, 0x45, 0x00, 0xb0, 0xb2, 0x09, 0x46, 0x47, 0x11, 0x12, 0x39, 0xb0, + 0x09, 0x10, 0xb0, 0x30, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x44, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, + 0x3e, 0x59, 0xb0, 0x12, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, + 0x07, 0xd0, 0xb2, 0x09, 0x0b, 0x12, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x10, + 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x0b, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x1d, 0x0b, 0x12, 0x11, 0x12, 0x39, 0xb0, 0x22, + 0xd0, 0xb0, 0x13, 0x10, 0xb0, 0x29, 0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x35, + 0xd0, 0xb0, 0x35, 0x2f, 0xb0, 0x2b, 0xd0, 0xb0, 0x2b, 0x2f, 0xb1, 0x2a, + 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2b, + 0x10, 0xb0, 0x31, 0xd0, 0xb0, 0x31, 0x2f, 0xb1, 0x39, 0x0a, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x35, 0x10, 0xb0, 0x40, + 0xd0, 0xb0, 0x40, 0x2f, 0xb0, 0x45, 0xd0, 0xb0, 0x45, 0x2f, 0x30, 0x31, + 0x01, 0x32, 0x16, 0x17, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x06, 0x23, + 0x22, 0x26, 0x27, 0x35, 0x34, 0x36, 0x33, 0x15, 0x22, 0x06, 0x15, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x13, 0x15, 0x23, 0x22, 0x26, 0x27, + 0x26, 0x23, 0x22, 0x15, 0x15, 0x23, 0x35, 0x34, 0x36, 0x33, 0x32, 0x04, + 0x17, 0x01, 0x36, 0x37, 0x35, 0x33, 0x15, 0x14, 0x06, 0x07, 0x04, 0x3b, + 0xd2, 0xf8, 0x01, 0xe9, 0xc5, 0xbb, 0x64, 0x66, 0xb9, 0xc5, 0xe6, 0x03, + 0xf8, 0xd3, 0x4d, 0x5c, 0x4d, 0x3f, 0x95, 0x01, 0x14, 0x51, 0x44, 0x3f, + 0x4d, 0x5d, 0x4c, 0xcc, 0x18, 0x58, 0x98, 0x97, 0x33, 0x2a, 0x68, 0x85, + 0x7c, 0x6d, 0x53, 0x01, 0x1b, 0x76, 0xfd, 0xde, 0x41, 0x03, 0xa9, 0x60, + 0x3b, 0x04, 0x4b, 0xf6, 0xd7, 0xc4, 0xd7, 0xf8, 0x94, 0x94, 0xf4, 0xd1, + 0xcc, 0xd7, 0xf8, 0xe9, 0x6f, 0x77, 0xc2, 0x78, 0x6e, 0xf0, 0x9a, 0xa0, + 0x7a, 0x70, 0x6e, 0x78, 0xc2, 0x77, 0x6f, 0x01, 0xf9, 0x86, 0x29, 0x3b, + 0x14, 0x68, 0x10, 0x25, 0x70, 0x69, 0x77, 0x01, 0xfe, 0x91, 0x52, 0x3c, + 0x68, 0x67, 0x31, 0x78, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x77, 0xff, 0xeb, + 0x07, 0x13, 0x07, 0x1c, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x79, 0xb2, 0x06, + 0x25, 0x26, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb0, 0x21, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, + 0x3e, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0d, 0x10, 0xb0, 0x14, 0xd0, 0xb0, + 0x14, 0x2f, 0xb2, 0x06, 0x08, 0x14, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, + 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x18, 0xd0, 0xb0, 0x14, 0x10, 0xb0, 0x1c, 0xd0, 0xb0, 0x1c, 0x2f, + 0xb0, 0x14, 0x10, 0xb0, 0x23, 0xd0, 0xb0, 0x23, 0x2f, 0xb0, 0x24, 0xd0, + 0xb0, 0x24, 0x2f, 0xb1, 0x1e, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x24, 0x10, 0xb0, 0x21, 0xd0, 0x30, 0x31, 0x01, + 0x11, 0x14, 0x00, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x00, 0x35, 0x11, + 0x21, 0x11, 0x10, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, 0x33, + 0x32, 0x36, 0x35, 0x11, 0x25, 0x35, 0x21, 0x17, 0x21, 0x15, 0x23, 0x35, + 0x07, 0x13, 0xfe, 0xf6, 0xe7, 0xe5, 0x78, 0x78, 0xe6, 0xe5, 0xfe, 0xf5, + 0x01, 0x2d, 0xc3, 0x5c, 0x6b, 0x01, 0x2e, 0xc6, 0x5b, 0x69, 0xfc, 0x27, + 0x03, 0x74, 0x02, 0xfe, 0x96, 0xb5, 0x05, 0xb0, 0xfc, 0x23, 0xe1, 0xfe, + 0xf9, 0xa2, 0xa2, 0x01, 0x06, 0xe3, 0x03, 0xdc, 0xfc, 0x2c, 0xff, 0x00, + 0x75, 0x80, 0x03, 0xdf, 0xfc, 0x2a, 0xfe, 0x75, 0x80, 0x03, 0xdf, 0xe7, + 0x85, 0x85, 0x7f, 0x7f, 0x00, 0x02, 0x00, 0x64, 0xff, 0xeb, 0x06, 0x40, + 0x05, 0xb1, 0x00, 0x1b, 0x00, 0x23, 0x00, 0x88, 0xb2, 0x07, 0x24, 0x25, + 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x22, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, + 0x0c, 0x3e, 0x59, 0xb2, 0x07, 0x14, 0x04, 0x11, 0x12, 0x39, 0xb1, 0x11, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x18, + 0xd0, 0xb0, 0x14, 0x10, 0xb0, 0x22, 0xd0, 0xb0, 0x22, 0x2f, 0xb0, 0x23, + 0xd0, 0xb0, 0x23, 0x2f, 0xb1, 0x1d, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x23, 0x10, 0xb0, 0x20, 0xd0, 0x30, 0x31, + 0x01, 0x11, 0x06, 0x06, 0x07, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x26, + 0x27, 0x11, 0x21, 0x11, 0x16, 0x33, 0x32, 0x37, 0x11, 0x21, 0x11, 0x16, + 0x33, 0x32, 0x37, 0x11, 0x25, 0x35, 0x21, 0x17, 0x21, 0x15, 0x23, 0x35, + 0x06, 0x40, 0x02, 0xeb, 0xca, 0x02, 0xc9, 0x6a, 0x6e, 0xcd, 0xc7, 0xeb, + 0x03, 0x01, 0x22, 0x04, 0x8f, 0xa9, 0x03, 0x01, 0x22, 0x05, 0x9b, 0x93, + 0x04, 0xfc, 0x9a, 0x03, 0x38, 0x06, 0xfe, 0xaf, 0xb4, 0x04, 0x3a, 0xfd, + 0x7e, 0xd7, 0xf5, 0x01, 0x90, 0x90, 0xf4, 0xd5, 0x02, 0x86, 0xfd, 0x76, + 0xdc, 0xe0, 0x02, 0x86, 0xfd, 0x73, 0xd9, 0xdb, 0x02, 0x8b, 0xf1, 0x86, + 0x86, 0x7f, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x59, 0xfe, 0x97, 0x04, 0xab, + 0x05, 0xc5, 0x00, 0x19, 0x00, 0x4b, 0xb2, 0x18, 0x1a, 0x1b, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, + 0x1b, 0xb1, 0x0a, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, + 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb0, 0x0e, + 0xd0, 0xb0, 0x0a, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, + 0x26, 0x02, 0x35, 0x11, 0x34, 0x12, 0x24, 0x33, 0x20, 0x00, 0x15, 0x21, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x17, 0x33, 0x03, + 0x4e, 0xfe, 0xd4, 0xd2, 0xf7, 0x8b, 0x01, 0x02, 0xa5, 0x01, 0x05, 0x01, + 0x1b, 0xfe, 0xd4, 0x72, 0x82, 0x7a, 0x8c, 0x8b, 0x79, 0xc5, 0xfe, 0x97, + 0x01, 0x5c, 0x22, 0x01, 0x3e, 0xf3, 0x01, 0x26, 0xaf, 0x01, 0x13, 0x97, + 0xfe, 0xfc, 0xf7, 0x89, 0x7f, 0xbe, 0xac, 0xfe, 0xda, 0xa4, 0xc1, 0x01, + 0x00, 0x01, 0x00, 0x56, 0xfe, 0x93, 0x04, 0x04, 0x04, 0x4e, 0x00, 0x17, + 0x00, 0x42, 0xb2, 0x09, 0x18, 0x19, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, + 0xb0, 0x09, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x26, + 0x02, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x16, 0x15, 0x21, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x15, 0x10, 0x33, 0x33, 0x03, 0x05, 0xfe, 0xdf, + 0xb8, 0xd6, 0x01, 0x0e, 0xe5, 0xc9, 0xf2, 0xfe, 0xf0, 0x5e, 0x4d, 0x64, + 0x6d, 0x01, 0xd7, 0xb7, 0xfe, 0x93, 0x01, 0x61, 0x1e, 0x01, 0x22, 0xe1, + 0x15, 0xf8, 0x01, 0x2c, 0xe7, 0xc0, 0x53, 0x6a, 0x9c, 0x9b, 0x1f, 0xfe, + 0xc6, 0x00, 0x00, 0x01, 0x00, 0x6b, 0x00, 0x00, 0x04, 0x91, 0x05, 0x3e, + 0x00, 0x13, 0x00, 0x13, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0x30, 0x31, 0x01, + 0x05, 0x07, 0x25, 0x03, 0x23, 0x13, 0x25, 0x37, 0x05, 0x13, 0x25, 0x37, + 0x05, 0x13, 0x33, 0x03, 0x05, 0x07, 0x25, 0x02, 0x59, 0x01, 0x21, 0x48, + 0xfe, 0xdd, 0xb5, 0xaf, 0xe1, 0xfe, 0xdf, 0x47, 0x01, 0x25, 0xca, 0xfe, + 0xde, 0x49, 0x01, 0x23, 0xb9, 0xac, 0xe4, 0x01, 0x25, 0x4c, 0xfe, 0xe0, + 0x01, 0xc1, 0xac, 0x80, 0xaa, 0xfe, 0xc1, 0x01, 0x8e, 0xab, 0x80, 0xab, + 0x01, 0x68, 0xab, 0x82, 0xab, 0x01, 0x46, 0xfe, 0x6b, 0xab, 0x7f, 0xaa, + 0x00, 0x01, 0xfc, 0x73, 0x04, 0xa2, 0xff, 0x46, 0x05, 0xfd, 0x00, 0x07, + 0x00, 0x12, 0x00, 0xb0, 0x00, 0x2f, 0xb1, 0x03, 0x0a, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x15, 0x27, 0x37, + 0x21, 0x27, 0x17, 0x15, 0xfd, 0x24, 0xb1, 0x01, 0x02, 0x22, 0x01, 0xb1, + 0x05, 0x20, 0x7e, 0x01, 0xee, 0x6c, 0x01, 0xdc, 0x00, 0x01, 0xfc, 0x78, + 0x05, 0x17, 0xff, 0x72, 0x06, 0x15, 0x00, 0x12, 0x00, 0x30, 0x00, 0xb0, + 0x0d, 0x2f, 0xb0, 0x07, 0xd0, 0xb0, 0x07, 0x2f, 0xb1, 0x00, 0x0a, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb0, + 0x04, 0xd0, 0xb0, 0x04, 0x2f, 0xb0, 0x0d, 0x10, 0xb1, 0x0e, 0x0a, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, + 0x15, 0x15, 0x23, 0x35, 0x34, 0x23, 0x22, 0x07, 0x07, 0x06, 0x07, 0x23, + 0x35, 0x32, 0x3e, 0x02, 0xfe, 0x84, 0xee, 0x88, 0x6a, 0x2b, 0x32, 0x6d, + 0x99, 0x7c, 0x29, 0x5b, 0x72, 0xcf, 0x4a, 0x06, 0x15, 0xdc, 0x22, 0x10, + 0x68, 0x13, 0x29, 0x3a, 0x02, 0x86, 0x1a, 0x4e, 0x10, 0x00, 0x00, 0x01, + 0xfd, 0x96, 0x05, 0x1a, 0xfe, 0x8d, 0x06, 0x6b, 0x00, 0x05, 0x00, 0x0c, + 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x05, 0xd0, 0xb0, 0x05, 0x2f, 0x30, 0x31, + 0x01, 0x35, 0x33, 0x07, 0x17, 0x07, 0xfd, 0x96, 0xbd, 0x01, 0x3b, 0x52, + 0x05, 0xdc, 0x8f, 0xa1, 0x6c, 0x44, 0x00, 0x01, 0xfd, 0xa7, 0x05, 0x1a, + 0xfe, 0x9e, 0x06, 0x6b, 0x00, 0x05, 0x00, 0x0c, 0x00, 0xb0, 0x03, 0x2f, + 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0x30, 0x31, 0x01, 0x27, 0x37, 0x27, + 0x33, 0x15, 0xfd, 0xf9, 0x52, 0x3b, 0x01, 0xbd, 0x05, 0x1a, 0x44, 0x6c, + 0xa1, 0x8f, 0x00, 0x08, 0xfa, 0x30, 0xfe, 0xc4, 0x01, 0xcb, 0x05, 0xaf, + 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x35, 0x00, 0x42, 0x00, 0x4f, + 0x00, 0x5c, 0x00, 0x6a, 0x00, 0x7f, 0x00, 0xb0, 0x45, 0x2f, 0xb0, 0x53, + 0x2f, 0xb0, 0x60, 0x2f, 0xb0, 0x38, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, 0xb1, 0x09, 0x04, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x45, 0x10, 0xb0, + 0x10, 0xd0, 0xb0, 0x45, 0x10, 0xb1, 0x4c, 0x04, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0xd0, 0xb0, 0x53, 0x10, 0xb0, + 0x1e, 0xd0, 0xb0, 0x53, 0x10, 0xb1, 0x5a, 0x04, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x25, 0xd0, 0xb0, 0x60, 0x10, 0xb0, + 0x2b, 0xd0, 0xb0, 0x60, 0x10, 0xb1, 0x67, 0x04, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x32, 0xd0, 0xb0, 0x38, 0x10, 0xb1, + 0x3f, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, + 0x34, 0x26, 0x22, 0x06, 0x15, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x34, 0x36, 0x32, 0x16, + 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x34, 0x36, 0x32, + 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x13, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0xfd, 0x1d, 0x73, 0xbe, 0x74, 0x70, 0x33, 0x30, 0x2e, 0x33, 0x01, 0xde, + 0x74, 0x5d, 0x5f, 0x75, 0x71, 0x35, 0x2e, 0x2c, 0x33, 0x48, 0x75, 0x5d, + 0x5f, 0x74, 0x70, 0x35, 0x5c, 0x33, 0xfe, 0xcb, 0x74, 0x5d, 0x5f, 0x74, + 0x70, 0x35, 0x2e, 0x2d, 0x33, 0xfd, 0x4f, 0x73, 0xbe, 0x74, 0x70, 0x33, + 0x30, 0x2e, 0x33, 0xfd, 0x4d, 0x74, 0xbe, 0x74, 0x70, 0x33, 0x30, 0x2e, + 0x33, 0xfe, 0xde, 0x75, 0x5d, 0x5f, 0x74, 0x70, 0x35, 0x5c, 0x33, 0x35, + 0x75, 0x5d, 0x5f, 0x75, 0x71, 0x35, 0x2e, 0x2d, 0x33, 0x04, 0xf3, 0x54, + 0x68, 0x68, 0x54, 0x2e, 0x37, 0x35, 0x30, 0xfe, 0xeb, 0x54, 0x68, 0x67, + 0x55, 0x31, 0x34, 0x35, 0x30, 0xfe, 0x09, 0x55, 0x67, 0x68, 0x54, 0x31, + 0x34, 0x37, 0x2e, 0xfd, 0xf9, 0x54, 0x68, 0x68, 0x54, 0x31, 0x34, 0x37, + 0x2e, 0xfe, 0xe4, 0x54, 0x68, 0x68, 0x54, 0x2e, 0x37, 0x37, 0x2e, 0x05, + 0x1a, 0x54, 0x68, 0x68, 0x54, 0x2e, 0x37, 0x35, 0x30, 0xfe, 0x09, 0x55, + 0x67, 0x68, 0x54, 0x31, 0x34, 0x37, 0x2e, 0xfd, 0xf9, 0x55, 0x67, 0x67, + 0x55, 0x31, 0x34, 0x35, 0x30, 0x00, 0x00, 0x08, 0xfa, 0x70, 0xfe, 0x63, + 0x01, 0xaf, 0x05, 0xc6, 0x00, 0x04, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x13, + 0x00, 0x18, 0x00, 0x1d, 0x00, 0x22, 0x00, 0x27, 0x00, 0x39, 0x00, 0xb0, + 0x21, 0x2f, 0xb0, 0x12, 0x2f, 0xb0, 0x0b, 0x2f, 0xb0, 0x1b, 0x2f, 0xb0, + 0x26, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, + 0x16, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0e, 0x3e, 0x59, 0x30, 0x31, 0x05, 0x17, 0x03, 0x23, 0x13, + 0x03, 0x27, 0x13, 0x33, 0x03, 0x01, 0x37, 0x05, 0x15, 0x25, 0x05, 0x07, + 0x25, 0x35, 0x05, 0x01, 0x37, 0x25, 0x17, 0x05, 0x01, 0x07, 0x05, 0x27, + 0x25, 0x03, 0x27, 0x03, 0x37, 0x13, 0x01, 0x17, 0x13, 0x07, 0x03, 0xfe, + 0x73, 0x0b, 0x7a, 0x60, 0x46, 0x3a, 0x0c, 0x7a, 0x60, 0x46, 0x02, 0x1d, + 0x0d, 0x01, 0x4d, 0xfe, 0xa6, 0xfb, 0x75, 0x0d, 0xfe, 0xb3, 0x01, 0x5a, + 0x03, 0x9c, 0x02, 0x01, 0x40, 0x44, 0xfe, 0xdb, 0xfc, 0xf3, 0x02, 0xfe, + 0xc0, 0x45, 0x01, 0x26, 0x2b, 0x11, 0x94, 0x41, 0xc6, 0x03, 0x60, 0x10, + 0x95, 0x42, 0xc4, 0x3c, 0x0e, 0xfe, 0xad, 0x01, 0x61, 0x04, 0xa2, 0x0e, + 0x01, 0x52, 0xfe, 0xa0, 0xfe, 0x11, 0x0c, 0x7c, 0x62, 0x47, 0x3b, 0x0c, + 0x7c, 0x62, 0x47, 0x01, 0xae, 0x10, 0x99, 0x44, 0xc8, 0xfc, 0x8e, 0x11, + 0x99, 0x45, 0xc8, 0x02, 0xe4, 0x02, 0x01, 0x46, 0x45, 0xfe, 0xd5, 0xfc, + 0xe3, 0x02, 0xfe, 0xbb, 0x47, 0x01, 0x2b, 0x00, 0xff, 0xff, 0x00, 0x78, + 0xfe, 0x67, 0x05, 0xf7, 0x07, 0x2f, 0x00, 0x26, 0x00, 0xdc, 0x00, 0x00, + 0x00, 0x27, 0x00, 0xa1, 0x01, 0x07, 0x01, 0x39, 0x01, 0x07, 0x00, 0x10, + 0x04, 0x77, 0xff, 0xd4, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x6f, 0xfe, 0x67, 0x04, 0xfd, 0x05, 0xf1, + 0x00, 0x26, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x27, 0x00, 0xa1, 0x00, 0x87, + 0xff, 0xfb, 0x01, 0x07, 0x00, 0x10, 0x03, 0x7d, 0xff, 0xd4, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, + 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, 0x00, 0x02, 0xff, 0xe5, + 0x00, 0x00, 0x04, 0x43, 0x06, 0x4f, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x77, + 0xb2, 0x14, 0x1b, 0x1c, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x10, 0xb0, 0x03, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, + 0x10, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x00, 0x07, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x0c, 0x08, + 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x10, 0xb0, 0x0a, 0xd0, + 0xb0, 0x0b, 0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x13, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x21, 0x11, 0x33, 0x16, 0x16, 0x10, 0x06, 0x07, 0x21, 0x11, 0x23, 0x35, + 0x33, 0x35, 0x21, 0x15, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x27, 0x02, 0xa4, 0xff, 0x00, 0xd3, 0xd4, 0xf8, 0xf6, 0xd1, 0xfe, + 0x06, 0x9d, 0x9d, 0x01, 0x22, 0x01, 0x00, 0xff, 0x00, 0xcd, 0x57, 0x5b, + 0x57, 0x54, 0x04, 0xf9, 0xfe, 0x1d, 0x02, 0xd6, 0xfe, 0x9e, 0xd9, 0x03, + 0x04, 0xf9, 0xb7, 0x9f, 0x9f, 0xfc, 0x7e, 0xfe, 0xb9, 0x58, 0x4d, 0x48, + 0x58, 0x02, 0x00, 0x02, 0x00, 0x82, 0x00, 0x00, 0x04, 0xdd, 0x05, 0xb0, + 0x00, 0x0f, 0x00, 0x1c, 0x00, 0x4f, 0xb2, 0x1b, 0x1d, 0x1e, 0x11, 0x12, + 0x39, 0xb0, 0x1b, 0x10, 0xb0, 0x04, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb2, 0x17, + 0x03, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x2f, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, + 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, 0x16, 0x16, 0x15, 0x14, 0x07, + 0x17, 0x07, 0x27, 0x06, 0x23, 0x13, 0x36, 0x35, 0x34, 0x26, 0x27, 0x21, + 0x11, 0x21, 0x32, 0x37, 0x27, 0x37, 0x01, 0xae, 0xfe, 0xd4, 0x02, 0x38, + 0xa4, 0xf9, 0x86, 0x8a, 0x76, 0x66, 0x84, 0x7b, 0xaa, 0xda, 0x1a, 0x7e, + 0x6f, 0xfe, 0xed, 0x01, 0x0c, 0x42, 0x2e, 0x7b, 0x66, 0x02, 0x01, 0xfd, + 0xff, 0x05, 0xb0, 0x78, 0xdd, 0x8d, 0xce, 0x7c, 0x84, 0x5b, 0x94, 0x38, + 0x01, 0x5a, 0x2e, 0x43, 0x6b, 0x84, 0x02, 0xfe, 0x37, 0x10, 0x8b, 0x5b, + 0x00, 0x02, 0x00, 0x6f, 0xfe, 0x60, 0x04, 0x3d, 0x04, 0x4e, 0x00, 0x13, + 0x00, 0x22, 0x00, 0x70, 0xb2, 0x1c, 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, + 0x1c, 0x10, 0xb0, 0x10, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, + 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb2, 0x09, + 0x10, 0x07, 0x11, 0x12, 0x39, 0xb2, 0x0e, 0x10, 0x07, 0x11, 0x12, 0x39, + 0xb0, 0x10, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x07, 0x17, + 0x07, 0x27, 0x06, 0x23, 0x22, 0x27, 0x11, 0x21, 0x11, 0x21, 0x17, 0x36, + 0x33, 0x32, 0x12, 0x11, 0x25, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, + 0x33, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x04, 0x3d, 0x77, 0x65, 0x69, + 0x62, 0x57, 0x70, 0xa4, 0x65, 0xfe, 0xdf, 0x01, 0x0c, 0x0a, 0x69, 0xa9, + 0xc8, 0xde, 0xfe, 0xdf, 0x6b, 0x66, 0x88, 0x33, 0x35, 0x88, 0x3b, 0x2a, + 0x70, 0x68, 0x59, 0x19, 0x02, 0x13, 0xfe, 0xff, 0x97, 0x78, 0x58, 0x75, + 0x34, 0x72, 0xfe, 0x02, 0x05, 0xda, 0x6a, 0x7e, 0xfe, 0xd8, 0xfe, 0xfc, + 0x06, 0x97, 0xa4, 0x68, 0xfe, 0x45, 0x6b, 0x1c, 0x87, 0x59, 0x6c, 0x49, + 0x00, 0x01, 0x00, 0x7f, 0x00, 0x00, 0x04, 0x45, 0x07, 0x25, 0x00, 0x09, + 0x00, 0x33, 0xb2, 0x03, 0x0a, 0x0b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, + 0xb0, 0x06, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x15, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x04, 0x45, 0x0c, 0xfd, 0x73, 0xfe, 0xd3, 0x02, 0xa5, + 0x01, 0x21, 0x04, 0xc7, 0x0a, 0xfb, 0x43, 0x05, 0xb0, 0x01, 0x75, 0x00, + 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x03, 0x75, 0x05, 0x75, 0x00, 0x07, + 0x00, 0x2c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x75, 0xfe, 0x18, 0xfe, 0xdf, + 0x01, 0xe8, 0x01, 0x21, 0x03, 0x50, 0xfc, 0xb0, 0x04, 0x3a, 0x01, 0x3b, + 0x00, 0x01, 0x00, 0x84, 0xfe, 0xac, 0x04, 0xb4, 0x05, 0xb0, 0x00, 0x16, + 0x00, 0x5e, 0xb2, 0x03, 0x17, 0x18, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x0b, + 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, + 0x0c, 0x3e, 0x59, 0xb0, 0x15, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x15, 0x13, 0x11, 0x12, + 0x39, 0xb0, 0x03, 0x2f, 0xb0, 0x0b, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x11, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x21, 0x11, 0x33, 0x20, 0x00, 0x11, 0x14, 0x06, 0x07, 0x06, 0x23, + 0x27, 0x32, 0x36, 0x35, 0x12, 0x21, 0x23, 0x11, 0x21, 0x11, 0x21, 0x04, + 0x3d, 0xfd, 0x73, 0xa4, 0x01, 0x23, 0x01, 0x3d, 0x47, 0x49, 0x90, 0xff, + 0x01, 0x7e, 0x81, 0x02, 0xfe, 0xc0, 0xa5, 0xfe, 0xd4, 0x03, 0xb9, 0x04, + 0xbd, 0xfe, 0x87, 0xfe, 0xcd, 0xfe, 0xe8, 0x7e, 0xe1, 0x50, 0x9e, 0xdd, + 0xb2, 0xaf, 0x01, 0x6e, 0xfd, 0xa8, 0x05, 0xb0, 0x00, 0x01, 0x00, 0x6c, + 0xfe, 0xe2, 0x03, 0xf7, 0x04, 0x3a, 0x00, 0x15, 0x00, 0x4c, 0xb2, 0x0a, + 0x16, 0x17, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, 0xb0, + 0x14, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x03, 0x14, 0x12, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x2f, + 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x21, 0x15, 0x33, 0x20, 0x00, 0x15, 0x16, 0x02, 0x07, + 0x27, 0x36, 0x36, 0x37, 0x34, 0x26, 0x23, 0x23, 0x11, 0x21, 0x11, 0x21, + 0x03, 0x4d, 0xfe, 0x40, 0x2f, 0x01, 0x0e, 0x01, 0x2b, 0x02, 0xce, 0xa8, + 0x78, 0x61, 0x69, 0x01, 0x94, 0x7f, 0x34, 0xfe, 0xdf, 0x02, 0xe1, 0x03, + 0x50, 0xb7, 0xfe, 0xff, 0xe6, 0x93, 0xfe, 0xfb, 0x38, 0xc1, 0x2c, 0x80, + 0x63, 0x7e, 0x7d, 0xfe, 0x53, 0x04, 0x3a, 0x00, 0xff, 0xff, 0x00, 0x11, + 0xfe, 0x9b, 0x08, 0x7d, 0x05, 0xb0, 0x00, 0x26, 0x00, 0xda, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x51, 0x07, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, + 0xfe, 0x9b, 0x07, 0x2e, 0x04, 0x3a, 0x00, 0x26, 0x00, 0xee, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x51, 0x05, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x84, + 0xfe, 0x9b, 0x05, 0xb1, 0x05, 0xb0, 0x00, 0x26, 0x02, 0x2c, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x51, 0x04, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x9b, 0x04, 0xf8, 0x04, 0x3a, 0x00, 0x26, 0x00, 0xf1, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x51, 0x03, 0x7d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, + 0x00, 0x00, 0x05, 0x67, 0x05, 0xb0, 0x00, 0x14, 0x00, 0x5d, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, + 0x0c, 0x3e, 0x59, 0xb2, 0x0f, 0x0a, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x0f, + 0x2f, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x01, 0x08, 0x0f, 0x11, 0x12, 0x39, 0xb0, 0x05, 0xd0, 0xb0, + 0x0f, 0x10, 0xb0, 0x12, 0xd0, 0x30, 0x31, 0x09, 0x02, 0x21, 0x01, 0x23, + 0x15, 0x23, 0x35, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, + 0x11, 0x33, 0x13, 0x05, 0x3f, 0xfe, 0x84, 0x01, 0xa4, 0xfe, 0x80, 0xfe, + 0xf5, 0x36, 0xa7, 0x51, 0xfe, 0xd2, 0x01, 0x2e, 0x51, 0xa7, 0x25, 0xff, + 0x05, 0xb0, 0xfd, 0x66, 0xfc, 0xea, 0x02, 0x4f, 0xe4, 0xe4, 0xfd, 0xb1, + 0x05, 0xb0, 0xfd, 0xb3, 0x01, 0x02, 0xfe, 0xfe, 0x02, 0x4d, 0x00, 0x01, + 0x00, 0x82, 0x00, 0x00, 0x04, 0xd1, 0x04, 0x3a, 0x00, 0x14, 0x00, 0x61, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, + 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, + 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, + 0x0e, 0x2f, 0xb2, 0xdf, 0x0e, 0x01, 0x5d, 0xb1, 0x09, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x01, 0x09, 0x0e, 0x11, + 0x12, 0x39, 0xb0, 0x05, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x12, 0xd0, 0x30, + 0x31, 0x09, 0x02, 0x21, 0x03, 0x23, 0x15, 0x23, 0x35, 0x23, 0x11, 0x21, + 0x11, 0x21, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x13, 0x04, 0xc0, 0xfe, + 0xdb, 0x01, 0x36, 0xfe, 0x8e, 0xa6, 0x2f, 0x98, 0x4f, 0xfe, 0xdf, 0x01, + 0x21, 0x4f, 0x98, 0x2d, 0x9c, 0x04, 0x3a, 0xfd, 0xfe, 0xfd, 0xc8, 0x01, + 0x8f, 0xaa, 0xaa, 0xfe, 0x71, 0x04, 0x3a, 0xfe, 0x69, 0xbe, 0xbe, 0x01, + 0x97, 0x00, 0x00, 0x01, 0x00, 0x25, 0x00, 0x00, 0x06, 0xb6, 0x05, 0xb0, + 0x00, 0x0e, 0x00, 0x63, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb2, 0x08, 0x06, + 0x02, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb1, 0x01, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x04, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0c, + 0x01, 0x08, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, + 0x21, 0x35, 0x21, 0x11, 0x33, 0x01, 0x21, 0x01, 0x01, 0x21, 0x03, 0xd8, + 0xac, 0xfe, 0xd3, 0xfe, 0x26, 0x03, 0x07, 0x89, 0x01, 0x64, 0x01, 0x6e, + 0xfe, 0x3f, 0x01, 0xf0, 0xfe, 0x99, 0x02, 0x53, 0xfd, 0xad, 0x04, 0xc6, + 0xea, 0xfd, 0xb9, 0x02, 0x47, 0xfd, 0x4f, 0xfd, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x3a, 0x00, 0x00, 0x05, 0xc7, 0x04, 0x3a, 0x00, 0x0e, 0x00, 0x67, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, + 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, + 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x09, 0xd0, 0xb0, + 0x09, 0x2f, 0xb2, 0xdf, 0x09, 0x01, 0x5d, 0xb1, 0x00, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x04, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0c, + 0x00, 0x09, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, + 0x21, 0x35, 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, 0x21, 0x03, 0x5a, + 0x73, 0xfe, 0xdf, 0xfe, 0x74, 0x02, 0xad, 0x66, 0xed, 0x01, 0x6d, 0xfe, + 0x9e, 0x01, 0x82, 0xfe, 0x7f, 0x01, 0x8f, 0xfe, 0x71, 0x03, 0x4f, 0xeb, + 0xfe, 0x69, 0x01, 0x97, 0xfd, 0xfd, 0xfd, 0xc9, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x9b, 0x05, 0xfe, 0x05, 0xb0, 0x00, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x51, 0x04, 0x83, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6f, + 0xfe, 0x9b, 0x04, 0xf6, 0x04, 0x3a, 0x00, 0x26, 0x00, 0xf4, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x51, 0x03, 0x7b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x82, + 0x00, 0x00, 0x07, 0x92, 0x05, 0xb0, 0x00, 0x0d, 0x00, 0x5f, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, + 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x06, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x01, + 0x2f, 0xb0, 0x02, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, + 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x01, + 0xae, 0x02, 0x49, 0x03, 0x9b, 0xfd, 0x91, 0xfe, 0xd4, 0xfd, 0xb7, 0xfe, + 0xd4, 0x01, 0x2c, 0x03, 0x62, 0x02, 0x4e, 0xea, 0xfb, 0x3a, 0x02, 0x70, + 0xfd, 0x90, 0x05, 0xb0, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x05, 0x69, + 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x66, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb2, + 0x01, 0x06, 0x02, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x01, 0x2f, 0x18, 0xb2, + 0x40, 0x01, 0x01, 0x5d, 0xb0, 0x02, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x08, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, + 0x11, 0x21, 0x01, 0x8d, 0x01, 0x67, 0x02, 0x75, 0xfe, 0xad, 0xfe, 0xde, + 0xfe, 0x99, 0xfe, 0xdf, 0x01, 0x21, 0x02, 0x88, 0x01, 0xb2, 0xea, 0xfc, + 0xb0, 0x01, 0xa0, 0xfe, 0x60, 0x04, 0x3a, 0x00, 0x00, 0x01, 0x00, 0x84, + 0xfe, 0xaa, 0x08, 0x13, 0x05, 0xb0, 0x00, 0x18, 0x00, 0x6b, 0xb2, 0x12, + 0x19, 0x1a, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0c, 0x3e, 0x59, + 0xb2, 0x01, 0x17, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x2f, 0xb0, 0x09, + 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x20, + 0x00, 0x11, 0x14, 0x06, 0x07, 0x06, 0x23, 0x27, 0x32, 0x36, 0x35, 0x12, + 0x21, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x05, 0x24, + 0x8f, 0x01, 0x23, 0x01, 0x3d, 0x47, 0x49, 0x90, 0xff, 0x01, 0x7e, 0x81, + 0x02, 0xfe, 0xc0, 0x90, 0xfe, 0xd3, 0xfd, 0xb9, 0xfe, 0xd4, 0x04, 0xa0, + 0x03, 0x42, 0xfe, 0xcd, 0xfe, 0xe8, 0x7e, 0xe1, 0x50, 0x9e, 0xdd, 0xb2, + 0xaf, 0x01, 0x6e, 0xfd, 0xaa, 0x04, 0xbd, 0xfb, 0x43, 0x05, 0xb0, 0x00, + 0x00, 0x01, 0x00, 0x6c, 0xfe, 0xea, 0x06, 0xbe, 0x04, 0x3a, 0x00, 0x17, + 0x00, 0x59, 0xb2, 0x11, 0x18, 0x19, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x07, + 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, + 0x14, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x16, 0x10, 0x11, 0x12, 0x39, 0xb0, + 0x01, 0x2f, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x16, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x20, 0x04, 0x15, + 0x16, 0x02, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x23, 0x11, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x19, 0x55, 0x01, 0x15, + 0x01, 0x39, 0x02, 0xcc, 0xaa, 0x78, 0x61, 0x6a, 0x97, 0x89, 0x62, 0xfe, + 0xde, 0xfe, 0x96, 0xfe, 0xdf, 0x03, 0xad, 0x02, 0xa1, 0xff, 0xe9, 0x93, + 0xfe, 0xfd, 0x39, 0xc1, 0x2b, 0x80, 0x63, 0x78, 0x82, 0x02, 0xfe, 0x4b, + 0x03, 0x50, 0xfc, 0xb0, 0x04, 0x3a, 0x00, 0x02, 0x00, 0x5e, 0xff, 0xeb, + 0x06, 0x0e, 0x05, 0xc5, 0x00, 0x26, 0x00, 0x32, 0x00, 0x88, 0xb2, 0x04, + 0x33, 0x34, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x27, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, + 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x02, 0x04, 0x1d, 0x11, 0x12, 0x39, 0xb0, + 0x02, 0x2f, 0xb0, 0x0d, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x15, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, + 0x26, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x2a, 0x02, 0x1d, 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x10, 0xb0, 0x30, 0xd0, + 0x30, 0x31, 0x05, 0x22, 0x27, 0x06, 0x23, 0x22, 0x24, 0x02, 0x35, 0x35, + 0x34, 0x12, 0x36, 0x33, 0x15, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, + 0x37, 0x26, 0x11, 0x35, 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x12, 0x15, + 0x15, 0x10, 0x07, 0x16, 0x33, 0x01, 0x14, 0x16, 0x17, 0x36, 0x35, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x03, 0x06, 0x0e, 0xde, 0xb9, 0x9c, 0xc1, 0xc9, + 0xfe, 0xc1, 0xb4, 0x84, 0xf0, 0x96, 0x5d, 0x6e, 0x01, 0xd2, 0xac, 0x3c, + 0xcd, 0x6f, 0xc3, 0x7b, 0x86, 0xd3, 0x75, 0xa6, 0x52, 0x5e, 0xfd, 0x97, + 0x58, 0x55, 0x84, 0x4c, 0x54, 0x8c, 0x05, 0x0d, 0x44, 0x4c, 0xae, 0x01, + 0x3a, 0xc0, 0xd4, 0xaa, 0x01, 0x17, 0x9d, 0xfd, 0xc3, 0x98, 0xda, 0xc2, + 0xeb, 0x03, 0xc9, 0x01, 0x2f, 0xbe, 0x9c, 0xfe, 0x8b, 0x96, 0xfe, 0xec, + 0xac, 0xa8, 0xfe, 0xeb, 0xc7, 0x10, 0x02, 0x01, 0x73, 0xc1, 0x45, 0x86, + 0xe6, 0xc2, 0xa6, 0x92, 0xfe, 0xf2, 0x00, 0x02, 0x00, 0x55, 0xff, 0xe6, + 0x04, 0xf2, 0x04, 0x4e, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x88, 0xb2, 0x04, + 0x2f, 0x30, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x23, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x02, 0x04, 0x1a, 0x11, 0x12, 0x39, 0xb0, + 0x02, 0x2f, 0xb0, 0x0c, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x14, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, + 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x25, 0x02, 0x1a, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb0, 0x2b, 0xd0, + 0x30, 0x31, 0x05, 0x22, 0x27, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, + 0x36, 0x36, 0x33, 0x15, 0x06, 0x06, 0x15, 0x15, 0x14, 0x16, 0x17, 0x26, + 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x07, 0x16, + 0x33, 0x01, 0x14, 0x17, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x15, 0x04, 0xf2, 0xc7, 0x95, 0x7b, 0x8e, 0xfa, 0xfe, 0xc2, 0x6f, 0xc3, + 0x7a, 0x3a, 0x42, 0x8c, 0x72, 0x60, 0xbf, 0x97, 0x9d, 0xc7, 0x87, 0x48, + 0x54, 0xfe, 0x07, 0x5b, 0x68, 0x38, 0x29, 0x2a, 0x38, 0x1a, 0x35, 0x30, + 0x01, 0x38, 0xf6, 0x5a, 0x87, 0xdd, 0x77, 0xf1, 0x08, 0x7c, 0x64, 0x64, + 0x86, 0xaa, 0x04, 0x81, 0xb6, 0x9a, 0xb4, 0xeb, 0xfe, 0xfb, 0xcf, 0x8d, + 0xc8, 0x8b, 0x0e, 0x01, 0x7a, 0x89, 0x61, 0x51, 0x95, 0x91, 0x5c, 0x6f, + 0x64, 0x57, 0xff, 0xff, 0x00, 0x16, 0xfe, 0x9b, 0x05, 0x45, 0x05, 0xb0, + 0x00, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x03, 0xca, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x15, 0xfe, 0x9b, 0x04, 0x40, 0x04, 0x3a, + 0x00, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x02, 0xc5, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0xfe, 0xa1, 0x06, 0xd6, 0x05, 0xb0, + 0x00, 0x0f, 0x00, 0x5e, 0xb2, 0x03, 0x10, 0x11, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, + 0x02, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, + 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, + 0xb0, 0x05, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0xb0, 0x0b, 0xd0, + 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, + 0x11, 0x33, 0x03, 0x21, 0x11, 0x21, 0x01, 0x6e, 0xfe, 0xb4, 0x03, 0xc1, + 0xfe, 0xb8, 0x02, 0x47, 0x01, 0x2d, 0xc7, 0x14, 0xfe, 0xe8, 0xfb, 0xc4, + 0x04, 0xc6, 0xea, 0xea, 0xfc, 0x2b, 0x04, 0xbf, 0xfb, 0x41, 0xfd, 0xb0, + 0x01, 0x5f, 0x00, 0x01, 0x00, 0x2d, 0xfe, 0xbf, 0x05, 0x58, 0x04, 0x3a, + 0x00, 0x0f, 0x00, 0x4d, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x03, + 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x00, 0xd0, 0xb0, 0x0f, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x08, + 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x35, + 0x21, 0x15, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x03, 0x21, 0x11, + 0x21, 0x01, 0x09, 0xdc, 0x02, 0xc3, 0xc6, 0x01, 0x6a, 0x01, 0x22, 0xa2, + 0x14, 0xfe, 0xf3, 0xfc, 0xd2, 0x03, 0x50, 0xea, 0xea, 0xfd, 0x99, 0x03, + 0x51, 0xfc, 0xad, 0xfd, 0xd8, 0x01, 0x41, 0x00, 0xff, 0xff, 0x00, 0x89, + 0xfe, 0x9b, 0x05, 0xe3, 0x05, 0xb0, 0x00, 0x26, 0x00, 0xe1, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x51, 0x04, 0x68, 0x00, 0x00, 0xff, 0xff, 0x00, 0x58, + 0xfe, 0x9b, 0x04, 0xdc, 0x04, 0x3a, 0x00, 0x26, 0x00, 0xf9, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x51, 0x03, 0x61, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6e, + 0x00, 0x00, 0x04, 0xf0, 0x05, 0xb0, 0x00, 0x17, 0x00, 0x50, 0xb2, 0x04, + 0x18, 0x19, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x07, 0x00, + 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb0, 0x04, 0xd0, 0xb0, 0x07, + 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x13, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x14, 0x16, 0x17, 0x11, + 0x33, 0x11, 0x36, 0x37, 0x11, 0x21, 0x11, 0x21, 0x11, 0x06, 0x07, 0x15, + 0x23, 0x35, 0x26, 0x26, 0x27, 0x11, 0x01, 0x9a, 0x5d, 0x6b, 0xa6, 0x67, + 0x55, 0x01, 0x2c, 0xfe, 0xd4, 0x46, 0x76, 0xa6, 0xf9, 0xf9, 0x02, 0x05, + 0xb0, 0xfe, 0x3d, 0x72, 0x70, 0x0b, 0x01, 0x22, 0xfe, 0xdf, 0x09, 0x10, + 0x02, 0x96, 0xfa, 0x50, 0x02, 0x28, 0x0f, 0x0a, 0xe8, 0xe6, 0x0f, 0xf4, + 0xd8, 0x01, 0xc8, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, 0x04, 0x10, + 0x04, 0x3a, 0x00, 0x16, 0x00, 0x50, 0xb2, 0x06, 0x17, 0x18, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, + 0x15, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x0f, 0x15, 0x00, 0x11, 0x12, 0x39, + 0xb0, 0x0f, 0x2f, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x12, 0xd0, + 0x30, 0x31, 0x21, 0x21, 0x11, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x26, + 0x27, 0x11, 0x21, 0x11, 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x11, + 0x21, 0x04, 0x10, 0xfe, 0xde, 0x26, 0x36, 0xa6, 0xbd, 0xc3, 0x04, 0x01, + 0x21, 0x04, 0x5f, 0xa6, 0x2e, 0x2e, 0x01, 0x22, 0x01, 0x54, 0x08, 0x05, + 0x95, 0x99, 0x15, 0xc8, 0xae, 0x01, 0x64, 0xfe, 0x9b, 0x80, 0x1b, 0x01, + 0x02, 0xfe, 0xf4, 0x04, 0x0a, 0x01, 0xfc, 0x00, 0x00, 0x01, 0x00, 0x86, + 0x00, 0x00, 0x05, 0x09, 0x05, 0xb0, 0x00, 0x12, 0x00, 0x47, 0xb2, 0x06, + 0x13, 0x14, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, + 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x01, + 0x00, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x2f, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, 0x21, + 0x11, 0x36, 0x36, 0x33, 0x20, 0x04, 0x17, 0x11, 0x21, 0x11, 0x26, 0x26, + 0x23, 0x22, 0x07, 0x11, 0x86, 0x01, 0x2d, 0x2f, 0xad, 0x42, 0x01, 0x15, + 0x01, 0x1f, 0x04, 0xfe, 0xd3, 0x01, 0x77, 0x93, 0x91, 0x8d, 0x05, 0xb0, + 0xfd, 0xd7, 0x0a, 0x13, 0xf2, 0xe5, 0xfe, 0x33, 0x01, 0xc7, 0x7d, 0x6e, + 0x1e, 0xfd, 0x6c, 0x00, 0x00, 0x02, 0xff, 0xe5, 0xff, 0xe9, 0x05, 0xb0, + 0x05, 0xc4, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x67, 0xb2, 0x16, 0x25, 0x26, + 0x11, 0x12, 0x39, 0xb0, 0x16, 0x10, 0xb0, 0x1e, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, + 0xb2, 0x21, 0x0e, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x21, 0x2f, 0xb1, 0x12, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, + 0xd0, 0xb0, 0x21, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x17, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, + 0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x05, 0x20, 0x00, 0x11, 0x35, 0x26, 0x26, 0x35, 0x33, + 0x14, 0x17, 0x36, 0x12, 0x24, 0x17, 0x20, 0x00, 0x11, 0x15, 0x21, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x06, 0x03, 0x22, 0x06, 0x07, + 0x21, 0x35, 0x34, 0x26, 0x03, 0xbf, 0xfe, 0xc6, 0xfe, 0xa0, 0x99, 0xa7, + 0xc7, 0x79, 0x01, 0x9a, 0x01, 0x15, 0xa5, 0x01, 0x0c, 0x01, 0x2a, 0xfc, + 0xa1, 0xbd, 0xb1, 0xc7, 0xa7, 0x31, 0x44, 0xe3, 0xbd, 0x87, 0xa0, 0x02, + 0x02, 0x33, 0x88, 0x17, 0x01, 0x52, 0x01, 0x2b, 0x26, 0x1a, 0xe0, 0xb4, + 0xa6, 0x2e, 0xaa, 0x01, 0x16, 0x9e, 0x01, 0xfe, 0x98, 0xfe, 0xb3, 0x9a, + 0x15, 0xb5, 0xbb, 0x3e, 0xf7, 0x22, 0x2b, 0x04, 0xd2, 0xbb, 0x9a, 0x1f, + 0x97, 0x9f, 0x00, 0x02, 0xff, 0xbc, 0xff, 0xec, 0x04, 0xb2, 0x04, 0x4e, + 0x00, 0x19, 0x00, 0x21, 0x00, 0x7f, 0xb2, 0x1b, 0x22, 0x23, 0x11, 0x12, + 0x39, 0xb0, 0x1b, 0x10, 0xb0, 0x13, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x1e, + 0x0c, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x1e, 0x2f, 0xb4, 0x1f, 0x1e, 0x2f, + 0x1e, 0x02, 0x71, 0xb2, 0x8f, 0x1e, 0x01, 0x5d, 0xb2, 0x5f, 0x1e, 0x01, + 0x71, 0xb1, 0x10, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x03, 0xd0, 0xb0, 0x1e, 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x00, + 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x16, 0x0c, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x10, 0xb1, + 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x05, 0x22, 0x00, 0x27, 0x26, 0x26, 0x35, 0x33, 0x14, 0x17, 0x36, + 0x24, 0x33, 0x32, 0x12, 0x11, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, + 0x17, 0x06, 0x06, 0x03, 0x22, 0x06, 0x07, 0x21, 0x35, 0x26, 0x26, 0x02, + 0xf6, 0xe7, 0xfe, 0xdc, 0x0d, 0x8e, 0x94, 0xb5, 0x75, 0x1f, 0x01, 0x0a, + 0xc7, 0xdf, 0xfd, 0xfd, 0x50, 0x0e, 0x8c, 0x6c, 0xa7, 0x5e, 0x8e, 0x41, + 0xdd, 0xa9, 0x55, 0x6b, 0x0f, 0x01, 0x91, 0x02, 0x64, 0x14, 0x01, 0x0f, + 0xd6, 0x1e, 0xd0, 0x9f, 0x9d, 0x2e, 0xcb, 0xf0, 0xfe, 0xe7, 0xff, 0x00, + 0x76, 0x6a, 0x80, 0x79, 0x9f, 0x5c, 0x67, 0x03, 0x78, 0x74, 0x6c, 0x17, + 0x60, 0x69, 0x00, 0x01, 0x00, 0x80, 0xfe, 0xa3, 0x05, 0x0e, 0x05, 0xb0, + 0x00, 0x16, 0x00, 0x60, 0xb2, 0x0d, 0x17, 0x18, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, + 0x11, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, + 0xb1, 0x15, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, + 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb2, 0x14, 0x11, 0x0f, 0x11, 0x12, + 0x39, 0xb0, 0x14, 0x2f, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x14, 0x0e, 0x11, 0x12, 0x39, 0xb0, + 0x07, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x16, 0x12, 0x15, 0x14, 0x02, 0x06, 0x23, + 0x27, 0x32, 0x36, 0x35, 0x12, 0x21, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, + 0x33, 0x01, 0x21, 0x03, 0x37, 0xe2, 0xf5, 0x8b, 0xf5, 0xa8, 0x01, 0x7b, + 0x81, 0x02, 0xfe, 0xc7, 0xfc, 0xfe, 0xd2, 0x01, 0x2e, 0x63, 0x01, 0x66, + 0x01, 0x74, 0x03, 0x38, 0x22, 0xfe, 0xd5, 0xf6, 0xb4, 0xfe, 0xec, 0x8a, + 0xe6, 0xad, 0xae, 0x01, 0x6a, 0xfd, 0xb2, 0x05, 0xb0, 0xfd, 0xb7, 0x02, + 0x49, 0x00, 0x00, 0x01, 0x00, 0x82, 0xfe, 0xd2, 0x04, 0x63, 0x04, 0x3a, + 0x00, 0x15, 0x00, 0x52, 0xb2, 0x07, 0x16, 0x17, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, + 0x10, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, + 0xb1, 0x14, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, + 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x13, 0xd0, 0xb0, 0x13, 0x2f, + 0xb2, 0xdf, 0x13, 0x01, 0x5d, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x13, 0x0c, 0x11, 0x12, 0x39, + 0x30, 0x31, 0x01, 0x16, 0x16, 0x15, 0x16, 0x02, 0x07, 0x27, 0x36, 0x36, + 0x37, 0x34, 0x21, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x13, 0x21, + 0x03, 0x0d, 0xa4, 0xa9, 0x02, 0xcc, 0xaa, 0x78, 0x62, 0x68, 0x01, 0xfe, + 0xd0, 0x66, 0xfe, 0xdf, 0x01, 0x21, 0x57, 0xfc, 0x01, 0x6d, 0x02, 0x59, + 0x32, 0xe3, 0xa8, 0x90, 0xfe, 0xff, 0x39, 0xc1, 0x2b, 0x7d, 0x61, 0xf3, + 0xfe, 0x71, 0x04, 0x3a, 0xfe, 0x69, 0x01, 0x97, 0xff, 0xff, 0x00, 0x28, + 0xfe, 0x67, 0x05, 0xff, 0x05, 0xb0, 0x00, 0x26, 0x00, 0xdd, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x10, 0x04, 0x7f, 0xff, 0xd4, 0xff, 0xff, 0x00, 0x16, + 0xfe, 0x67, 0x04, 0xfe, 0x04, 0x3a, 0x00, 0x26, 0x00, 0xf2, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x10, 0x03, 0x7e, 0xff, 0xd4, 0x00, 0x01, 0x00, 0x84, + 0xfe, 0x4b, 0x05, 0x24, 0x05, 0xb0, 0x00, 0x14, 0x00, 0x91, 0xb2, 0x0a, + 0x15, 0x16, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, 0xb2, + 0x02, 0x00, 0x12, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x02, 0x2f, 0x18, 0xb4, + 0xa0, 0x02, 0xb0, 0x02, 0x02, 0x5d, 0xb4, 0x40, 0x02, 0x50, 0x02, 0x02, + 0x71, 0xb4, 0x30, 0x02, 0x40, 0x02, 0x02, 0x5d, 0xb4, 0x00, 0x02, 0x10, + 0x02, 0x02, 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x10, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x14, 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, + 0x33, 0x32, 0x35, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xb0, 0x02, 0x47, + 0x01, 0x2d, 0xce, 0xb6, 0x4f, 0x44, 0x0e, 0x2e, 0x36, 0x78, 0xfd, 0xb9, + 0xfe, 0xd4, 0x05, 0xb0, 0xfd, 0x95, 0x02, 0x6b, 0xfa, 0x38, 0xc8, 0xd5, + 0x11, 0xee, 0x0c, 0xad, 0x02, 0x68, 0xfd, 0xad, 0x05, 0xb0, 0x00, 0x01, + 0x00, 0x6c, 0xfe, 0x4b, 0x04, 0x16, 0x04, 0x3a, 0x00, 0x14, 0x00, 0x6d, + 0xb2, 0x0c, 0x15, 0x16, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, + 0xb2, 0x02, 0x12, 0x03, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x02, 0x2f, 0x18, + 0xb2, 0x40, 0x02, 0x01, 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x0d, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, + 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x06, 0x06, 0x23, 0x22, 0x27, + 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x8d, + 0x01, 0x67, 0x01, 0x22, 0x01, 0xc7, 0xb4, 0x4f, 0x41, 0x0f, 0x2b, 0x38, + 0x78, 0xfe, 0x99, 0xfe, 0xdf, 0x04, 0x3a, 0xfe, 0x4e, 0x01, 0xb2, 0xfb, + 0xa2, 0xc0, 0xd1, 0x11, 0xe5, 0x0c, 0xaf, 0x01, 0xbc, 0xfe, 0x60, 0x04, + 0x3a, 0x00, 0xff, 0xff, 0x00, 0x82, 0xfe, 0x67, 0x06, 0x03, 0x05, 0xb0, + 0x00, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x10, 0x04, 0x83, + 0xff, 0xd4, 0xff, 0xff, 0x00, 0x6f, 0xfe, 0x67, 0x04, 0xfb, 0x04, 0x3a, + 0x00, 0x26, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x07, 0x00, 0x10, 0x03, 0x7b, + 0xff, 0xd4, 0xff, 0xff, 0x00, 0x82, 0xfe, 0x67, 0x07, 0x59, 0x05, 0xb0, + 0x00, 0x26, 0x00, 0x31, 0x00, 0x00, 0x00, 0x07, 0x00, 0x10, 0x05, 0xd9, + 0xff, 0xd4, 0xff, 0xff, 0x00, 0x82, 0xfe, 0x67, 0x06, 0x68, 0x04, 0x3a, + 0x00, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x07, 0x00, 0x10, 0x04, 0xe8, + 0xff, 0xd4, 0x00, 0x02, 0x00, 0x4b, 0xff, 0xeb, 0x05, 0x2e, 0x05, 0xc4, + 0x00, 0x15, 0x00, 0x1d, 0x00, 0x61, 0xb2, 0x08, 0x1e, 0x1f, 0x11, 0x12, + 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x16, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb2, 0x0d, + 0x00, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x10, 0xb1, + 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x08, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x20, 0x00, 0x11, 0x15, + 0x14, 0x02, 0x04, 0x27, 0x20, 0x00, 0x11, 0x35, 0x21, 0x26, 0x26, 0x23, + 0x22, 0x07, 0x27, 0x36, 0x36, 0x13, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, + 0x16, 0x02, 0x6c, 0x01, 0x4c, 0x01, 0x76, 0xa2, 0xfe, 0xdf, 0xae, 0xfe, + 0xd7, 0xfe, 0xb7, 0x03, 0xb6, 0x07, 0xce, 0xc0, 0xcc, 0xb7, 0x31, 0x4f, + 0xec, 0xca, 0x85, 0xaa, 0x12, 0xfd, 0x79, 0xa8, 0x05, 0xc4, 0xfe, 0x94, + 0xfe, 0xbe, 0x8b, 0xbf, 0xfe, 0xcb, 0xac, 0x01, 0x01, 0x66, 0x01, 0x4d, + 0x9b, 0xbc, 0xc7, 0x3f, 0xf7, 0x25, 0x2a, 0xfb, 0x2d, 0xb4, 0xa1, 0x1f, + 0x98, 0x9e, 0x00, 0x01, 0x00, 0x50, 0xff, 0xeb, 0x04, 0x65, 0x05, 0xb0, + 0x00, 0x1b, 0x00, 0x6a, 0xb2, 0x0b, 0x1c, 0x1d, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, + 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb2, 0x05, 0x02, 0x0b, + 0x11, 0x12, 0x39, 0xb0, 0x05, 0x2f, 0xb0, 0x0b, 0x10, 0xb0, 0x10, 0xd0, + 0xb0, 0x0b, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb0, 0x1b, 0xd0, + 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x17, 0x01, 0x16, 0x16, 0x15, 0x14, + 0x04, 0x23, 0x22, 0x26, 0x26, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x02, 0xf0, 0xfd, 0x9f, 0x03, 0xb9, + 0x01, 0xfe, 0x9b, 0xb8, 0xc9, 0xfe, 0xde, 0xf6, 0x91, 0xeb, 0x81, 0x01, + 0x2c, 0x77, 0x5a, 0x6a, 0x82, 0x85, 0x91, 0x85, 0x04, 0xbd, 0xf3, 0xc8, + 0xfe, 0x7d, 0x21, 0xeb, 0xc1, 0xc3, 0xea, 0x68, 0xbf, 0x82, 0x52, 0x66, + 0x6a, 0x56, 0x89, 0x85, 0xbc, 0x00, 0x00, 0x01, 0x00, 0x52, 0xfe, 0x75, + 0x04, 0x5f, 0x04, 0x3a, 0x00, 0x1b, 0x00, 0x59, 0xb2, 0x0b, 0x1c, 0x1d, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x02, 0x00, + 0x11, 0x12, 0x39, 0xb2, 0x1b, 0x0b, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x1b, + 0x2f, 0xb1, 0x19, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x05, 0x1b, 0x19, 0x11, 0x12, 0x39, 0xb0, 0x0b, 0x10, 0xb1, + 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x21, 0x35, 0x21, 0x17, 0x01, 0x16, 0x16, 0x15, 0x14, 0x04, + 0x23, 0x22, 0x26, 0x26, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x23, 0x35, 0x02, 0xee, 0xfd, 0x9b, 0x03, 0xb7, 0x01, + 0xfe, 0x9a, 0xba, 0xca, 0xfe, 0xe0, 0xf3, 0x90, 0xea, 0x80, 0x01, 0x22, + 0x7b, 0x5d, 0x6c, 0x86, 0x87, 0x91, 0x89, 0x03, 0x50, 0xea, 0xbf, 0xfe, + 0x72, 0x20, 0xea, 0xc2, 0xc3, 0xe9, 0x68, 0xbe, 0x82, 0x54, 0x6a, 0x6e, + 0x58, 0x8b, 0x85, 0xb8, 0xff, 0xff, 0x00, 0x25, 0xfe, 0x4b, 0x04, 0x95, + 0x05, 0xb0, 0x00, 0x26, 0x00, 0xb1, 0x58, 0x00, 0x00, 0x26, 0x02, 0x26, + 0x98, 0x11, 0x01, 0x07, 0x02, 0x54, 0x01, 0x68, 0x00, 0x00, 0x00, 0x08, + 0x00, 0xb2, 0xcf, 0x09, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x16, + 0xfe, 0x45, 0x03, 0xa1, 0x04, 0x3a, 0x00, 0x26, 0x00, 0xec, 0x51, 0x00, + 0x00, 0x27, 0x02, 0x26, 0xff, 0x89, 0xff, 0x61, 0x01, 0x07, 0x02, 0x54, + 0x01, 0x23, 0xff, 0xfa, 0x00, 0x17, 0x00, 0xb2, 0xbf, 0x08, 0x01, 0x5d, + 0xb2, 0xcf, 0x09, 0x01, 0x5d, 0xb2, 0x50, 0x09, 0x01, 0x5d, 0xb2, 0x70, + 0x09, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x16, 0xfe, 0x4b, + 0x05, 0x8a, 0x05, 0xb0, 0x00, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x54, 0x03, 0xe1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x15, 0xfe, 0x4b, + 0x04, 0x85, 0x04, 0x3a, 0x00, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x54, 0x02, 0xdc, 0x00, 0x00, 0x00, 0x02, 0x00, 0x49, 0x00, 0x00, + 0x04, 0x8f, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x52, 0xb2, 0x04, + 0x16, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x0f, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, + 0x3e, 0x59, 0xb2, 0x00, 0x01, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, + 0xb0, 0x03, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, + 0x21, 0x22, 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x33, 0x13, 0x11, 0x23, + 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x03, 0x62, 0x01, 0x2d, 0xfd, 0xe3, + 0xa4, 0xfc, 0x89, 0x87, 0xfe, 0xa2, 0xf2, 0xf0, 0x73, 0x88, 0x84, 0x71, + 0x03, 0xc0, 0x01, 0xf0, 0xfa, 0x50, 0x79, 0xdc, 0x8c, 0x8a, 0xdb, 0x7a, + 0xfd, 0x31, 0x01, 0xdc, 0x83, 0x67, 0x69, 0x87, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x74, 0x00, 0x00, 0x06, 0xe9, 0x05, 0xb0, 0x00, 0x19, 0x00, 0x22, + 0x00, 0x55, 0xb2, 0x08, 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, + 0xb0, 0x1a, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, + 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x08, 0x09, 0x00, 0x11, 0x12, + 0x39, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0xd0, 0xb0, 0x08, + 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x21, 0x22, 0x26, 0x26, 0x35, 0x34, 0x00, 0x33, 0x33, + 0x11, 0x21, 0x11, 0x33, 0x36, 0x36, 0x37, 0x27, 0x26, 0x27, 0x21, 0x16, + 0x16, 0x07, 0x06, 0x02, 0x07, 0x25, 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x17, 0x02, 0x9b, 0xa4, 0xfb, 0x88, 0x01, 0x31, 0xfa, 0xed, 0x01, + 0x2d, 0x43, 0x55, 0x64, 0x06, 0x02, 0x0e, 0x2c, 0x01, 0x25, 0x1b, 0x2a, + 0x02, 0x04, 0xfb, 0xdc, 0xfe, 0x80, 0xf1, 0x72, 0x88, 0x84, 0x70, 0x79, + 0xdb, 0x8d, 0xd8, 0x01, 0x07, 0x01, 0xf0, 0xfb, 0x42, 0x02, 0x89, 0x7d, + 0x4d, 0xda, 0x74, 0x51, 0xff, 0x4b, 0xe6, 0xfe, 0xf1, 0x05, 0xf1, 0x01, + 0xdc, 0x83, 0x67, 0x69, 0x87, 0x02, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xe7, + 0x06, 0x86, 0x06, 0x18, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x7f, 0xb2, 0x19, + 0x2b, 0x2c, 0x11, 0x12, 0x39, 0xb0, 0x19, 0x10, 0xb0, 0x29, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x1a, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, + 0x1c, 0x0c, 0x3e, 0x59, 0xb2, 0x05, 0x03, 0x18, 0x11, 0x12, 0x39, 0xb0, + 0x18, 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x1a, 0x03, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, + 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x1c, 0x10, 0xb1, 0x27, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x10, 0x12, 0x33, 0x32, 0x17, 0x11, + 0x21, 0x11, 0x14, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x21, 0x16, + 0x16, 0x07, 0x0e, 0x02, 0x23, 0x04, 0x27, 0x06, 0x23, 0x22, 0x02, 0x35, + 0x01, 0x26, 0x23, 0x22, 0x06, 0x15, 0x10, 0x33, 0x32, 0x37, 0x27, 0x5a, + 0xe2, 0xc5, 0x95, 0x60, 0x01, 0x21, 0x44, 0x35, 0x65, 0x6a, 0x04, 0x04, + 0x41, 0x01, 0x1b, 0x1c, 0x29, 0x02, 0x02, 0x7e, 0xe4, 0x90, 0xfe, 0xf6, + 0x5e, 0x69, 0xc0, 0xc3, 0xe2, 0x02, 0x9c, 0x3d, 0x6f, 0x64, 0x6b, 0xcd, + 0x78, 0x3d, 0x07, 0x02, 0x15, 0x01, 0x06, 0x01, 0x33, 0x75, 0x02, 0x3f, + 0xfb, 0x61, 0x4d, 0x56, 0x02, 0xa7, 0x92, 0xbb, 0xd8, 0x66, 0xc7, 0x66, + 0xa8, 0xf8, 0x86, 0x04, 0xba, 0xb6, 0x01, 0x21, 0xfa, 0x01, 0x09, 0x54, + 0xac, 0xb7, 0xfe, 0xd5, 0x58, 0x4a, 0x00, 0x01, 0x00, 0x41, 0xff, 0xe3, + 0x05, 0xf1, 0x05, 0xb0, 0x00, 0x28, 0x00, 0x66, 0xb2, 0x0b, 0x29, 0x2a, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, + 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, + 0x1b, 0xb1, 0x22, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x29, 0x09, 0x11, 0x12, + 0x39, 0xb0, 0x01, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0f, 0x01, 0x00, 0x11, + 0x12, 0x39, 0xb0, 0x22, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1a, 0x22, 0x09, 0x11, 0x12, 0x39, + 0x30, 0x31, 0x13, 0x35, 0x33, 0x36, 0x36, 0x35, 0x34, 0x23, 0x21, 0x35, + 0x21, 0x04, 0x04, 0x15, 0x14, 0x05, 0x04, 0x17, 0x15, 0x06, 0x16, 0x33, + 0x36, 0x36, 0x37, 0x36, 0x27, 0x21, 0x16, 0x16, 0x07, 0x0e, 0x02, 0x23, + 0x04, 0x03, 0x35, 0x34, 0x26, 0x23, 0xcb, 0xc1, 0x84, 0x7a, 0xf5, 0xfe, + 0xac, 0x01, 0x61, 0x01, 0x02, 0x01, 0x12, 0xfe, 0xe4, 0x01, 0x11, 0x07, + 0x01, 0x2a, 0x25, 0x5d, 0x61, 0x05, 0x04, 0x41, 0x01, 0x26, 0x1a, 0x2b, + 0x02, 0x02, 0x82, 0xe8, 0x94, 0xfe, 0xa9, 0x13, 0x6a, 0x62, 0x02, 0x52, + 0xf6, 0x01, 0x62, 0x67, 0xa8, 0xf6, 0x02, 0xd4, 0xca, 0xed, 0x61, 0x3b, + 0xf6, 0x51, 0x29, 0x38, 0x02, 0xa3, 0x8d, 0xbb, 0xd8, 0x62, 0xca, 0x67, + 0xa9, 0xf8, 0x85, 0x08, 0x01, 0x5d, 0x3f, 0x5f, 0x74, 0x00, 0x00, 0x01, + 0x00, 0x2d, 0xff, 0xe2, 0x05, 0x13, 0x04, 0x3a, 0x00, 0x26, 0x00, 0x63, + 0xb2, 0x20, 0x27, 0x28, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb1, 0x02, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x07, + 0x0e, 0x1d, 0x11, 0x12, 0x39, 0xb2, 0x17, 0x27, 0x1d, 0x11, 0x12, 0x39, + 0xb0, 0x17, 0x2f, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x1d, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x24, 0x17, 0x14, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x01, 0x06, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x21, + 0x16, 0x16, 0x07, 0x06, 0x06, 0x23, 0x06, 0x26, 0x27, 0x35, 0x34, 0x23, + 0x23, 0x27, 0x33, 0x36, 0x35, 0x34, 0x23, 0x23, 0x27, 0x21, 0x16, 0x17, + 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x03, 0x16, 0x02, 0x46, 0x46, 0x4d, + 0x03, 0x04, 0x40, 0x01, 0x1a, 0x2d, 0x18, 0x01, 0x04, 0xe9, 0xbc, 0xb5, + 0xb6, 0x0a, 0x73, 0xfd, 0x02, 0xbe, 0x96, 0xa4, 0xff, 0x06, 0x01, 0x19, + 0xcc, 0x73, 0x73, 0xa4, 0xbd, 0x05, 0x01, 0x02, 0x5f, 0x02, 0x87, 0x77, + 0x99, 0xa6, 0x86, 0x80, 0x39, 0xcc, 0xf2, 0x03, 0x71, 0x83, 0x48, 0x68, + 0xdc, 0x02, 0x6d, 0x7f, 0xea, 0x03, 0x53, 0x54, 0x99, 0x9a, 0x4a, 0x2d, + 0xab, 0x00, 0x00, 0x01, 0x00, 0x41, 0xfe, 0x98, 0x04, 0x78, 0x05, 0xb0, + 0x00, 0x21, 0x00, 0x62, 0xb2, 0x03, 0x22, 0x23, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x17, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, + 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, + 0xb1, 0x1b, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x22, 0x09, 0x11, 0x12, 0x39, + 0xb0, 0x01, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0f, 0x00, 0x01, 0x11, 0x12, + 0x39, 0xb0, 0x1b, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x27, 0x33, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x21, 0x27, 0x21, 0x16, 0x04, 0x15, 0x14, 0x07, 0x16, 0x11, + 0x15, 0x33, 0x07, 0x06, 0x06, 0x07, 0x27, 0x37, 0x36, 0x37, 0x23, 0x26, + 0x27, 0x35, 0x34, 0x23, 0x82, 0x01, 0xfe, 0xe8, 0x7f, 0x71, 0xfe, 0xd0, + 0x06, 0x01, 0x45, 0xf3, 0x01, 0x0e, 0xe9, 0xf3, 0xe7, 0x01, 0x01, 0x6e, + 0x56, 0x97, 0x2c, 0x35, 0x06, 0xd3, 0x3c, 0x04, 0xe9, 0x02, 0x41, 0xe9, + 0x05, 0xc2, 0x67, 0x6e, 0xea, 0x04, 0xe3, 0xc9, 0xde, 0x67, 0x47, 0xfe, + 0xed, 0x66, 0xc8, 0x6f, 0xe2, 0x4a, 0x4f, 0x52, 0x67, 0x60, 0x31, 0xbd, + 0x6a, 0xe9, 0x00, 0x01, 0x00, 0x6d, 0xfe, 0x8b, 0x04, 0x54, 0x04, 0x3a, + 0x00, 0x21, 0x00, 0x62, 0xb2, 0x04, 0x22, 0x23, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x17, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, + 0x0a, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, + 0xb1, 0x1b, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x22, 0x0a, 0x11, 0x12, 0x39, + 0xb0, 0x01, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x10, 0x00, 0x01, 0x11, 0x12, + 0x39, 0xb0, 0x1b, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x27, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x27, 0x21, 0x27, 0x21, 0x32, 0x04, 0x15, 0x14, 0x07, 0x16, + 0x17, 0x33, 0x07, 0x06, 0x06, 0x07, 0x27, 0x37, 0x36, 0x37, 0x23, 0x26, + 0x27, 0x35, 0x26, 0x27, 0xa4, 0x01, 0xfc, 0x58, 0x59, 0x5d, 0x51, 0xfe, + 0xd3, 0x08, 0x01, 0x2e, 0xd8, 0x01, 0x00, 0x9f, 0xa8, 0x04, 0xd4, 0x01, + 0x01, 0x6e, 0x56, 0x97, 0x2a, 0x3a, 0x04, 0xe4, 0x1b, 0x01, 0x03, 0xae, + 0x01, 0x80, 0xca, 0x44, 0x39, 0x3c, 0x4e, 0x01, 0xe8, 0xbb, 0xa1, 0x9d, + 0x56, 0x40, 0xbd, 0xc8, 0x6f, 0xe2, 0x4a, 0x4f, 0x4c, 0x6f, 0x6b, 0x18, + 0x81, 0x51, 0x93, 0x03, 0x00, 0x01, 0x00, 0x40, 0xff, 0xeb, 0x07, 0x88, + 0x05, 0xb0, 0x00, 0x22, 0x00, 0x65, 0xb2, 0x00, 0x23, 0x24, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, + 0xb1, 0x1f, 0x0c, 0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, + 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x1f, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x17, 0x1f, 0x0d, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x21, 0x03, 0x02, 0x02, 0x06, 0x07, 0x23, 0x35, 0x37, 0x36, 0x36, 0x13, + 0x13, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x27, 0x21, + 0x16, 0x16, 0x07, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x03, 0xf0, 0xfe, + 0x99, 0x19, 0x0e, 0x65, 0xbf, 0xa6, 0x58, 0x32, 0x70, 0x60, 0x0e, 0x1a, + 0x03, 0xb2, 0x3f, 0x35, 0x5b, 0x6a, 0x04, 0x04, 0x41, 0x01, 0x27, 0x1a, + 0x2b, 0x02, 0x02, 0x7f, 0xe5, 0x90, 0xcd, 0xd3, 0x04, 0xba, 0xfe, 0x04, + 0xfe, 0xfe, 0xfe, 0xd4, 0x8d, 0x03, 0xf1, 0x05, 0x0f, 0xe4, 0x01, 0x1a, + 0x02, 0xad, 0xfb, 0xcd, 0x47, 0x57, 0x9f, 0x93, 0xbb, 0xd8, 0x62, 0xca, + 0x67, 0xa7, 0xf8, 0x87, 0xc9, 0xc6, 0x00, 0x01, 0x00, 0x3f, 0xff, 0xeb, + 0x06, 0x72, 0x04, 0x3a, 0x00, 0x21, 0x00, 0x65, 0xb2, 0x20, 0x22, 0x23, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, + 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, + 0x1b, 0xb1, 0x1e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, + 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x00, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, + 0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x1e, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x16, 0x1e, 0x0c, 0x11, 0x12, 0x39, 0x30, + 0x31, 0x01, 0x23, 0x03, 0x02, 0x06, 0x07, 0x23, 0x27, 0x37, 0x36, 0x36, + 0x37, 0x13, 0x21, 0x11, 0x14, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, + 0x21, 0x17, 0x16, 0x07, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x03, 0x00, + 0xdb, 0x12, 0x11, 0xb0, 0xae, 0x62, 0x03, 0x24, 0x4e, 0x48, 0x09, 0x14, + 0x03, 0x0b, 0x4a, 0x3e, 0x4e, 0x54, 0x02, 0x04, 0x40, 0x01, 0x1a, 0x17, + 0x30, 0x03, 0x02, 0x72, 0xcf, 0x83, 0xd2, 0xd6, 0x01, 0x03, 0x4d, 0xfe, + 0xb5, 0xfe, 0xf5, 0xf4, 0x03, 0xeb, 0x03, 0x06, 0xac, 0xcf, 0x01, 0xcb, + 0xfd, 0x3f, 0x49, 0x5a, 0x01, 0x92, 0x7f, 0xb5, 0xc8, 0x53, 0xb1, 0x79, + 0x9b, 0xe4, 0x7e, 0xc8, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x81, 0xff, 0xe3, + 0x07, 0x8a, 0x05, 0xb0, 0x00, 0x1c, 0x00, 0x7e, 0xb2, 0x13, 0x1d, 0x1e, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, + 0x1b, 0xb1, 0x18, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, + 0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb1, 0x04, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x11, 0x00, + 0x11, 0x12, 0x39, 0xb2, 0x1b, 0x00, 0x16, 0x11, 0x12, 0x39, 0x7c, 0xb0, + 0x1b, 0x2f, 0x18, 0xb4, 0xa0, 0x1b, 0xb0, 0x1b, 0x02, 0x5d, 0xb4, 0x00, + 0x1b, 0x10, 0x1b, 0x02, 0x5d, 0xb4, 0x30, 0x1b, 0x40, 0x1b, 0x02, 0x5d, + 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x11, 0x14, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, + 0x21, 0x16, 0x16, 0x07, 0x0e, 0x02, 0x23, 0x04, 0x03, 0x35, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x05, 0x1e, 0x3f, 0x33, 0x61, 0x66, + 0x04, 0x04, 0x41, 0x01, 0x26, 0x1b, 0x2b, 0x02, 0x02, 0x80, 0xe5, 0x91, + 0xfe, 0x78, 0x17, 0xfd, 0xbd, 0xfe, 0xd3, 0x01, 0x2d, 0x02, 0x43, 0x05, + 0xb0, 0xfb, 0xcd, 0x4a, 0x54, 0x02, 0xa3, 0x8d, 0xbb, 0xd8, 0x62, 0xca, + 0x67, 0xa7, 0xf8, 0x87, 0x08, 0x01, 0x98, 0xd8, 0xfd, 0xad, 0x05, 0xb0, + 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x01, 0x00, 0x5d, 0xff, 0xe7, 0x06, 0x63, + 0x04, 0x3a, 0x00, 0x1d, 0x00, 0x7f, 0xb2, 0x1c, 0x1e, 0x1f, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, + 0x1b, 0xb1, 0x1a, 0x0c, 0x3e, 0x59, 0xb2, 0x07, 0x08, 0x02, 0x11, 0x12, + 0x39, 0x7c, 0xb0, 0x07, 0x2f, 0x18, 0xb2, 0x40, 0x07, 0x01, 0x5d, 0xb4, + 0x90, 0x07, 0xa0, 0x07, 0x02, 0x5d, 0xb4, 0x00, 0x07, 0x10, 0x07, 0x02, + 0x5d, 0xb4, 0x30, 0x07, 0x40, 0x07, 0x02, 0x71, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1a, 0x10, 0xb1, + 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, + 0x14, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x21, 0x17, 0x16, 0x07, + 0x0e, 0x02, 0x23, 0x06, 0x26, 0x27, 0x02, 0xf1, 0xfe, 0x8e, 0xfe, 0xde, + 0x01, 0x22, 0x01, 0x72, 0x01, 0x21, 0x4a, 0x3e, 0x4e, 0x54, 0x03, 0x04, + 0x40, 0x01, 0x19, 0x17, 0x30, 0x03, 0x02, 0x72, 0xcf, 0x83, 0xc8, 0xd5, + 0x0c, 0x01, 0xaa, 0xfe, 0x56, 0x04, 0x3a, 0xfe, 0x5b, 0x01, 0xa5, 0xfd, + 0x3f, 0x4b, 0x58, 0x02, 0x91, 0x7f, 0xaf, 0xce, 0x53, 0xb1, 0x79, 0x9b, + 0xe4, 0x7e, 0x04, 0xc3, 0xcd, 0x00, 0x00, 0x01, 0x00, 0x46, 0xff, 0xeb, + 0x04, 0xd5, 0x05, 0xc5, 0x00, 0x20, 0x00, 0x42, 0xb2, 0x00, 0x21, 0x22, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, + 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x0e, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, + 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x05, 0x22, 0x24, 0x02, 0x27, 0x11, 0x34, 0x12, 0x24, 0x33, + 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, + 0x36, 0x36, 0x37, 0x36, 0x27, 0x21, 0x17, 0x16, 0x07, 0x06, 0x04, 0x02, + 0xbc, 0xb4, 0xfe, 0xe0, 0xa1, 0x01, 0x9f, 0x01, 0x22, 0xb5, 0xdf, 0x88, + 0x3e, 0x88, 0xa1, 0x91, 0xb8, 0xb7, 0x92, 0x71, 0x77, 0x03, 0x03, 0x35, + 0x01, 0x25, 0x27, 0x14, 0x02, 0x04, 0xfe, 0xdb, 0x15, 0x9d, 0x01, 0x19, + 0xaf, 0x01, 0x0b, 0xaf, 0x01, 0x1c, 0x9f, 0x59, 0xe1, 0x44, 0xd1, 0xa8, + 0xfe, 0xff, 0xa3, 0xd3, 0x02, 0x73, 0x66, 0x92, 0xc6, 0xa8, 0x58, 0x58, + 0xd6, 0xf9, 0x00, 0x01, 0x00, 0x46, 0xff, 0xeb, 0x04, 0x06, 0x04, 0x4e, + 0x00, 0x1e, 0x00, 0x46, 0xb2, 0x13, 0x1f, 0x20, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, + 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x05, 0x0b, 0x13, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x10, + 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x25, 0x36, 0x36, 0x37, 0x34, 0x27, 0x21, 0x16, 0x07, 0x06, + 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x36, 0x36, 0x33, 0x32, 0x17, + 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x02, 0x63, 0x44, + 0x3a, 0x02, 0x13, 0x01, 0x1a, 0x1c, 0x01, 0x04, 0xe0, 0xbe, 0xf0, 0xfe, + 0xd3, 0x82, 0xee, 0x99, 0xba, 0x60, 0x2e, 0x63, 0x89, 0x69, 0x7e, 0x88, + 0xd6, 0x02, 0x37, 0x3b, 0x70, 0x5f, 0x84, 0x4b, 0xa8, 0xb7, 0x01, 0x30, + 0xf9, 0x1e, 0x98, 0xf8, 0x8c, 0x42, 0xe4, 0x3a, 0xab, 0x8d, 0x22, 0x87, + 0xab, 0x00, 0x00, 0x01, 0x00, 0x1f, 0xff, 0xe7, 0x05, 0x64, 0x05, 0xb0, + 0x00, 0x19, 0x00, 0x48, 0xb2, 0x05, 0x1a, 0x1b, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0c, + 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0xb0, + 0x16, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, + 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x21, 0x16, 0x16, 0x07, 0x0e, + 0x02, 0x23, 0x06, 0x26, 0x27, 0x01, 0xcd, 0xfe, 0x52, 0x04, 0x80, 0xfe, + 0x5a, 0x3f, 0x34, 0x61, 0x66, 0x03, 0x04, 0x40, 0x01, 0x25, 0x1c, 0x29, + 0x02, 0x02, 0x7f, 0xe5, 0x90, 0xc5, 0xd0, 0x0a, 0x04, 0xba, 0xf6, 0xf6, + 0xfc, 0xc1, 0x48, 0x54, 0x02, 0xa3, 0x8d, 0xb7, 0xdc, 0x66, 0xc7, 0x66, + 0xa7, 0xf9, 0x86, 0x04, 0xc8, 0xcc, 0x00, 0x01, 0x00, 0x42, 0xff, 0xe7, + 0x04, 0xdb, 0x04, 0x3a, 0x00, 0x18, 0x00, 0x4f, 0xb2, 0x16, 0x19, 0x1a, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, + 0x1b, 0xb1, 0x15, 0x0c, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, + 0xb0, 0x05, 0xd0, 0xb0, 0x15, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0e, 0x15, 0x02, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, + 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x21, 0x16, 0x16, 0x07, 0x06, 0x06, + 0x23, 0x06, 0x26, 0x27, 0x01, 0x6a, 0xfe, 0xd8, 0x03, 0x8b, 0xfe, 0xbe, + 0x4a, 0x3d, 0x4e, 0x55, 0x03, 0x04, 0x40, 0x01, 0x1a, 0x2b, 0x1a, 0x01, + 0x04, 0xfb, 0xc9, 0xc9, 0xd3, 0x0c, 0x03, 0x50, 0xea, 0xea, 0xfe, 0x27, + 0x49, 0x58, 0x02, 0x6e, 0x63, 0x8c, 0x95, 0x73, 0x7a, 0x34, 0xcc, 0xf2, + 0x04, 0xc4, 0xcc, 0x00, 0x00, 0x01, 0x00, 0x6a, 0xff, 0xeb, 0x04, 0xf9, + 0x05, 0xc5, 0x00, 0x29, 0x00, 0x78, 0xb2, 0x27, 0x2a, 0x2b, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, + 0x0b, 0x0c, 0x3e, 0x59, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x25, 0x17, 0x0b, 0x11, 0x12, 0x39, 0x7c, + 0xb0, 0x25, 0x2f, 0x18, 0xb4, 0x00, 0x25, 0x10, 0x25, 0x02, 0x5d, 0xb4, + 0x30, 0x25, 0x40, 0x25, 0x02, 0x5d, 0xb2, 0x80, 0x25, 0x01, 0x5d, 0xb4, + 0xa0, 0x25, 0xb0, 0x25, 0x02, 0x5d, 0xb1, 0x26, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x11, 0x26, 0x25, 0x11, 0x12, + 0x39, 0xb0, 0x17, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x21, 0x14, 0x06, 0x04, 0x23, 0x20, 0x24, 0x35, 0x34, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x24, 0x21, 0x32, 0x16, 0x16, 0x15, 0x21, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x21, 0x33, 0x15, 0x23, 0x22, 0x06, + 0x01, 0x96, 0xa7, 0x85, 0x71, 0x9a, 0x01, 0x2c, 0x8f, 0xfe, 0xf6, 0x9e, + 0xfe, 0xef, 0xfe, 0xb9, 0x88, 0x81, 0x72, 0x81, 0x01, 0x35, 0x01, 0x0d, + 0x99, 0xfa, 0x90, 0xfe, 0xd3, 0x8b, 0x6b, 0x80, 0x95, 0x01, 0x08, 0xc4, + 0xc7, 0x8b, 0x91, 0x01, 0x9c, 0x57, 0x69, 0x68, 0x50, 0x7f, 0xc2, 0x68, + 0xe8, 0xc5, 0x7f, 0xab, 0x2a, 0x30, 0xa6, 0x63, 0xc6, 0xda, 0x68, 0xbf, + 0x78, 0x4c, 0x60, 0x61, 0x52, 0xc3, 0xeb, 0x63, 0xff, 0xff, 0x00, 0x28, + 0xfe, 0x4b, 0x06, 0x3f, 0x05, 0xb0, 0x00, 0x26, 0x00, 0xdd, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x54, 0x04, 0x96, 0x00, 0x00, 0xff, 0xff, 0x00, 0x16, + 0xfe, 0x4b, 0x05, 0x3e, 0x04, 0x3a, 0x00, 0x26, 0x00, 0xf2, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x54, 0x03, 0x95, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, + 0x04, 0x6f, 0x02, 0xcb, 0x05, 0xd7, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x1b, + 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x07, 0xd0, 0xb0, 0x07, 0x2f, 0xb0, 0x01, + 0xd0, 0xb0, 0x01, 0x2f, 0xb0, 0x0b, 0x10, 0xb0, 0x05, 0xd0, 0xb0, 0x05, + 0x2f, 0x30, 0x31, 0x01, 0x13, 0x33, 0x15, 0x03, 0x23, 0x01, 0x33, 0x15, + 0x16, 0x17, 0x07, 0x26, 0x26, 0x35, 0x01, 0x89, 0x6f, 0xd3, 0xe6, 0x5c, + 0xfe, 0xd2, 0xad, 0x01, 0x4c, 0x53, 0x4a, 0x5d, 0x04, 0x9b, 0x01, 0x3c, + 0x15, 0xfe, 0xc1, 0x01, 0x54, 0x5e, 0x7c, 0x38, 0x56, 0x23, 0x89, 0x5d, + 0xff, 0xff, 0x00, 0x6e, 0x01, 0xfb, 0x02, 0xa1, 0x02, 0xe4, 0x00, 0x06, + 0x00, 0x11, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0x01, 0xfb, 0x02, 0xa1, + 0x02, 0xe4, 0x00, 0x06, 0x00, 0x11, 0x00, 0x00, 0xff, 0xff, 0x00, 0x98, + 0x02, 0x54, 0x04, 0xa4, 0x03, 0x40, 0x00, 0x46, 0x01, 0xaf, 0xe8, 0x00, + 0x4c, 0xcd, 0x40, 0x00, 0xff, 0xff, 0x00, 0x6d, 0x02, 0x54, 0x05, 0xd2, + 0x03, 0x40, 0x00, 0x46, 0x01, 0xaf, 0x82, 0x00, 0x66, 0x66, 0x40, 0x00, + 0x00, 0x02, 0x00, 0x01, 0xfe, 0x60, 0x03, 0x90, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x27, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x05, 0x2f, + 0xb0, 0x02, 0xd0, 0xb0, 0x02, 0x2f, 0xb2, 0x00, 0x02, 0x01, 0x5d, 0xb0, + 0x01, 0xd0, 0xb0, 0x01, 0x2f, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x35, + 0x21, 0x35, 0x21, 0x03, 0x90, 0xfc, 0x71, 0x03, 0x8f, 0xfc, 0x71, 0x03, + 0x8f, 0xfe, 0x60, 0x99, 0x6e, 0x99, 0x00, 0x01, 0x00, 0x68, 0x04, 0x18, + 0x01, 0xa6, 0x06, 0x22, 0x00, 0x08, 0x00, 0x21, 0xb2, 0x08, 0x09, 0x0a, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x1a, 0x3e, 0x59, 0xb2, 0x05, 0x09, 0x00, 0x11, 0x12, 0x39, + 0xb0, 0x05, 0x2f, 0x30, 0x31, 0x01, 0x17, 0x06, 0x07, 0x15, 0x23, 0x35, + 0x34, 0x36, 0x01, 0x1e, 0x88, 0x56, 0x03, 0xe5, 0x69, 0x06, 0x22, 0x4f, + 0x88, 0x8c, 0xa7, 0x96, 0x5e, 0xd5, 0x00, 0x01, 0x00, 0x3a, 0x03, 0xf1, + 0x01, 0x79, 0x06, 0x00, 0x00, 0x08, 0x00, 0x21, 0xb2, 0x08, 0x09, 0x0a, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x1a, 0x3e, 0x59, 0xb2, 0x00, 0x09, 0x04, 0x11, 0x12, 0x39, + 0xb0, 0x00, 0x2f, 0x30, 0x31, 0x13, 0x27, 0x36, 0x37, 0x35, 0x33, 0x15, + 0x14, 0x06, 0xc2, 0x88, 0x56, 0x03, 0xe6, 0x64, 0x03, 0xf1, 0x4f, 0x87, + 0x90, 0xa9, 0x9b, 0x5a, 0xd2, 0x00, 0x00, 0x01, 0x00, 0x42, 0xfe, 0xcf, + 0x01, 0x81, 0x00, 0xe5, 0x00, 0x08, 0x00, 0x13, 0xb2, 0x08, 0x09, 0x0a, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, 0x00, + 0x2f, 0x30, 0x31, 0x13, 0x27, 0x36, 0x37, 0x35, 0x33, 0x07, 0x06, 0x06, + 0xca, 0x88, 0x4e, 0x03, 0xee, 0x01, 0x01, 0x63, 0xfe, 0xcf, 0x4f, 0x7e, + 0x94, 0xb5, 0xa6, 0x59, 0xce, 0x00, 0x00, 0x01, 0x00, 0x47, 0x03, 0xf1, + 0x01, 0x86, 0x06, 0x00, 0x00, 0x09, 0x00, 0x0c, 0x00, 0xb0, 0x09, 0x2f, + 0xb0, 0x05, 0xd0, 0xb0, 0x05, 0x2f, 0x30, 0x31, 0x01, 0x15, 0x16, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x35, 0x35, 0x01, 0x2d, 0x01, 0x25, 0x33, 0x88, + 0x52, 0x65, 0x06, 0x00, 0xa3, 0x47, 0x81, 0x55, 0x4f, 0x47, 0xd2, 0x5c, + 0x9a, 0x00, 0xff, 0xff, 0x00, 0x70, 0x04, 0x18, 0x03, 0x05, 0x06, 0x22, + 0x00, 0x26, 0x01, 0x84, 0x08, 0x00, 0x00, 0x07, 0x01, 0x84, 0x01, 0x5f, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x48, 0x03, 0xf1, 0x02, 0xe2, 0x06, 0x00, + 0x00, 0x26, 0x01, 0x85, 0x0e, 0x00, 0x00, 0x07, 0x01, 0x85, 0x01, 0x69, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x42, 0xfe, 0xbb, 0x02, 0xd9, 0x01, 0x07, + 0x00, 0x08, 0x00, 0x11, 0x00, 0x1f, 0xb2, 0x0a, 0x12, 0x13, 0x11, 0x12, + 0x39, 0xb0, 0x0a, 0x10, 0xb0, 0x05, 0xdc, 0x00, 0xb0, 0x04, 0x2f, 0xb0, + 0x0d, 0xd0, 0xb0, 0x09, 0xd0, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0xd0, 0x30, + 0x31, 0x13, 0x27, 0x36, 0x37, 0x35, 0x33, 0x07, 0x06, 0x06, 0x05, 0x27, + 0x36, 0x37, 0x35, 0x33, 0x07, 0x06, 0x06, 0xd1, 0x8f, 0x4e, 0x03, 0xee, + 0x01, 0x01, 0x5e, 0x01, 0x00, 0x8f, 0x56, 0x03, 0xee, 0x01, 0x02, 0x65, + 0xfe, 0xbb, 0x4f, 0x86, 0x9f, 0xd8, 0xc7, 0x61, 0xdb, 0x49, 0x4f, 0x94, + 0x92, 0xd7, 0xcb, 0x60, 0xda, 0x00, 0x00, 0x01, 0x00, 0x39, 0x00, 0x00, + 0x04, 0x17, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x4c, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, + 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0x30, 0x31, + 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, + 0x04, 0x17, 0xfe, 0x9f, 0xfe, 0xdf, 0xfe, 0xa4, 0x01, 0x5c, 0x01, 0x21, + 0x01, 0x61, 0x03, 0x49, 0xfc, 0xb7, 0x03, 0x49, 0xf1, 0x01, 0x76, 0xfe, + 0x8a, 0x00, 0x00, 0x01, 0x00, 0x62, 0xfe, 0x60, 0x04, 0x3f, 0x05, 0xb0, + 0x00, 0x13, 0x00, 0x7e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, + 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb1, + 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x0e, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x10, 0xd0, 0xb0, 0x11, 0xd0, 0xb0, + 0x06, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x13, 0xd0, 0x30, 0x31, 0x21, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, + 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x04, 0x3f, 0xfe, 0x9f, 0xfe, 0xde, + 0xfe, 0xa6, 0x01, 0x5a, 0xfe, 0xa6, 0x01, 0x5a, 0x01, 0x22, 0x01, 0x61, + 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x60, 0x01, 0xa0, 0xe9, 0x02, 0x67, 0xea, + 0x01, 0x76, 0xfe, 0x8a, 0xea, 0xfd, 0x99, 0x00, 0x00, 0x01, 0x00, 0x87, + 0x01, 0xf4, 0x02, 0x62, 0x03, 0xe4, 0x00, 0x0d, 0x00, 0x17, 0xb2, 0x0a, + 0x0e, 0x0f, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x0a, 0xb0, + 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x17, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x87, + 0x84, 0x68, 0x6c, 0x81, 0x02, 0x83, 0x6a, 0x69, 0x85, 0x02, 0xfe, 0x68, + 0x7e, 0x7c, 0x65, 0x2b, 0x67, 0x7d, 0x7c, 0x6b, 0xff, 0xff, 0x00, 0x85, + 0xff, 0xf5, 0x03, 0xa5, 0x01, 0x29, 0x00, 0x26, 0x00, 0x12, 0x07, 0x00, + 0x00, 0x07, 0x00, 0x12, 0x01, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, + 0xff, 0xf5, 0x05, 0x75, 0x01, 0x29, 0x00, 0x26, 0x00, 0x12, 0x07, 0x00, + 0x00, 0x27, 0x00, 0x12, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x12, + 0x03, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0x01, 0xdc, 0x01, 0xa9, + 0x03, 0x06, 0x00, 0x0b, 0x00, 0x19, 0xb2, 0x03, 0x0c, 0x0d, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x03, 0x2f, 0xb1, 0x09, 0x06, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x65, 0x57, 0x4b, 0x4b, 0x57, + 0x57, 0x4b, 0x4b, 0x57, 0x02, 0x71, 0x42, 0x53, 0x53, 0x42, 0x42, 0x53, + 0x53, 0x00, 0x00, 0x06, 0x00, 0x57, 0xff, 0xec, 0x07, 0x6c, 0x05, 0xc4, + 0x00, 0x15, 0x00, 0x23, 0x00, 0x27, 0x00, 0x34, 0x00, 0x41, 0x00, 0x4f, + 0x00, 0xae, 0xb2, 0x02, 0x50, 0x51, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x10, + 0xb0, 0x1b, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x26, 0xd0, 0xb0, 0x02, 0x10, + 0xb0, 0x28, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x35, 0xd0, 0xb0, 0x02, 0x10, + 0xb0, 0x47, 0xd0, 0x00, 0xb0, 0x24, 0x2f, 0xb0, 0x26, 0x2f, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, + 0xb0, 0x03, 0xd0, 0xb0, 0x03, 0x2f, 0xb0, 0x07, 0xd0, 0xb0, 0x07, 0x2f, + 0xb0, 0x12, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x0e, 0x2f, 0xb0, 0x19, 0x10, + 0xb0, 0x20, 0xd0, 0xb0, 0x20, 0x2f, 0xb0, 0x12, 0x10, 0xb1, 0x2b, 0x02, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, + 0xb1, 0x31, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x2b, 0x10, 0xb0, 0x38, 0xd0, 0xb0, 0x31, 0x10, 0xb0, 0x3e, 0xd0, + 0xb0, 0x20, 0x10, 0xb1, 0x45, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x19, 0x10, 0xb1, 0x4c, 0x02, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x36, 0x33, + 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x27, 0x06, 0x23, 0x22, 0x26, 0x35, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x01, 0x27, 0x01, 0x17, + 0x03, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x15, 0x05, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x03, 0x2c, 0xb0, 0x8c, 0x93, 0x51, 0x51, 0x92, + 0x8a, 0xb3, 0xad, 0x8e, 0x94, 0x51, 0x51, 0x91, 0x8e, 0xb0, 0xfd, 0x2b, + 0xa8, 0x85, 0x8d, 0xb0, 0xb0, 0x8b, 0x85, 0xaa, 0x01, 0x7f, 0x8d, 0x02, + 0xc7, 0x8d, 0xb0, 0x48, 0x35, 0x7a, 0x44, 0x38, 0x37, 0x44, 0x01, 0xc7, + 0x46, 0x37, 0x7a, 0x44, 0x38, 0x37, 0x44, 0xfb, 0x55, 0x43, 0x3a, 0x38, + 0x42, 0x44, 0x38, 0x39, 0x42, 0x01, 0x65, 0x81, 0xab, 0x69, 0x69, 0xa7, + 0x8c, 0x47, 0x80, 0xab, 0x69, 0x69, 0xab, 0x84, 0x03, 0x7c, 0x83, 0xaa, + 0xa9, 0x8a, 0x46, 0x82, 0xa9, 0xa9, 0x89, 0xfc, 0x1b, 0x4c, 0x04, 0x72, + 0x4c, 0xfc, 0x38, 0x39, 0x4c, 0x87, 0x4c, 0x3c, 0x49, 0x49, 0x3f, 0x4b, + 0x36, 0x4f, 0x87, 0x4c, 0x3c, 0x49, 0x49, 0x3f, 0x02, 0xe9, 0x3b, 0x4a, + 0x4a, 0x3e, 0x49, 0x3c, 0x4a, 0x4a, 0x40, 0x00, 0x00, 0x01, 0x00, 0x6c, + 0x00, 0x7d, 0x02, 0x3e, 0x03, 0x9c, 0x00, 0x06, 0x00, 0x10, 0x00, 0xb0, + 0x05, 0x2f, 0xb2, 0x02, 0x07, 0x05, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, + 0x30, 0x31, 0x01, 0x13, 0x23, 0x01, 0x35, 0x01, 0x33, 0x01, 0x4e, 0xf0, + 0xba, 0xfe, 0xe8, 0x01, 0x18, 0xba, 0x02, 0x0c, 0xfe, 0x71, 0x01, 0x86, + 0x13, 0x01, 0x86, 0x00, 0x00, 0x01, 0x00, 0x50, 0x00, 0x7c, 0x02, 0x23, + 0x03, 0x9b, 0x00, 0x06, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x2f, 0xb2, 0x03, + 0x07, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x2f, 0x30, 0x31, 0x01, 0x01, + 0x15, 0x01, 0x23, 0x13, 0x03, 0x01, 0x0b, 0x01, 0x18, 0xfe, 0xe8, 0xbb, + 0xf0, 0xf0, 0x03, 0x9b, 0xfe, 0x7a, 0x13, 0xfe, 0x7a, 0x01, 0x8f, 0x01, + 0x90, 0x00, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x6d, 0x03, 0x72, 0x05, 0x2b, + 0x00, 0x03, 0x00, 0x09, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x02, 0x2f, 0x30, + 0x31, 0x37, 0x27, 0x01, 0x17, 0xab, 0x8d, 0x02, 0xc7, 0x8d, 0x6d, 0x4c, + 0x04, 0x72, 0x4c, 0x00, 0xff, 0xff, 0x00, 0x35, 0x02, 0x9b, 0x02, 0xc0, + 0x05, 0xb0, 0x01, 0x07, 0x02, 0x20, 0x00, 0x00, 0x02, 0x9b, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, + 0x3e, 0x59, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x57, + 0x02, 0x8d, 0x03, 0x05, 0x05, 0xba, 0x00, 0x0f, 0x00, 0x54, 0xb2, 0x0a, + 0x10, 0x11, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x10, 0x3e, 0x59, 0xb2, 0x01, + 0x0d, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb1, 0x0a, 0x07, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x17, + 0x36, 0x33, 0x20, 0x13, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x07, 0x11, + 0x23, 0x11, 0xff, 0x20, 0x4b, 0x93, 0x01, 0x03, 0x05, 0xd4, 0x04, 0x7c, + 0x60, 0x25, 0xd5, 0x05, 0xae, 0x7b, 0x87, 0xfe, 0xd8, 0xfd, 0xfb, 0x01, + 0xc8, 0xae, 0x4f, 0xfd, 0xd9, 0x03, 0x21, 0x00, 0x00, 0x01, 0x00, 0x66, + 0x00, 0x00, 0x04, 0x89, 0x05, 0xc3, 0x00, 0x27, 0x00, 0xa0, 0xb2, 0x1f, + 0x28, 0x29, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, + 0x2f, 0x1b, 0xb1, 0x17, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb2, 0x27, 0x17, 0x06, + 0x11, 0x12, 0x39, 0xb0, 0x27, 0x2f, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x04, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0xd0, + 0xb0, 0x09, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x27, 0x10, + 0xb0, 0x0e, 0xd0, 0xb0, 0x27, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x13, 0x2f, + 0xb6, 0x0f, 0x13, 0x1f, 0x13, 0x2f, 0x13, 0x03, 0x5d, 0xb2, 0x9f, 0x13, + 0x01, 0x5d, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x17, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1b, 0x13, 0x1e, 0x11, 0x12, 0x39, + 0xb0, 0x13, 0x10, 0xb0, 0x22, 0xd0, 0xb0, 0x10, 0x10, 0xb0, 0x24, 0xd0, + 0x30, 0x31, 0x01, 0x21, 0x17, 0x14, 0x07, 0x21, 0x15, 0x21, 0x35, 0x33, + 0x36, 0x35, 0x27, 0x23, 0x35, 0x33, 0x27, 0x23, 0x35, 0x33, 0x27, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x17, 0x21, 0x15, 0x21, 0x17, 0x21, 0x03, 0x49, 0xfe, 0xf0, 0x01, 0x3e, + 0x02, 0x8d, 0xfb, 0xdd, 0x5c, 0x48, 0x02, 0xa2, 0x9d, 0x04, 0x99, 0x94, + 0x04, 0xf7, 0xcf, 0xd4, 0xf2, 0xfe, 0xe1, 0x57, 0x51, 0x43, 0x56, 0x05, + 0x01, 0x22, 0xfe, 0xe5, 0x04, 0x01, 0x17, 0x01, 0xd4, 0x1f, 0x7b, 0x49, + 0xf1, 0xf1, 0x12, 0xa1, 0x30, 0x9f, 0x6e, 0x9f, 0x8f, 0xca, 0xea, 0xe1, + 0xc0, 0x55, 0x5a, 0x62, 0x60, 0x8f, 0x9f, 0x6e, 0x00, 0x04, 0x00, 0x25, + 0x00, 0x00, 0x06, 0x5d, 0x05, 0xb0, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, + 0x00, 0x26, 0x00, 0xbf, 0xb2, 0x18, 0x27, 0x28, 0x11, 0x12, 0x39, 0xb0, + 0x18, 0x10, 0xb0, 0x1f, 0xd0, 0xb0, 0x18, 0x10, 0xb0, 0x21, 0xd0, 0xb0, + 0x18, 0x10, 0xb0, 0x26, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, + 0x2f, 0x1b, 0xb1, 0x16, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x05, + 0x16, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x2f, 0xb0, 0x01, 0xd0, 0xb0, + 0x01, 0x2f, 0xb2, 0x0f, 0x01, 0x01, 0x5d, 0xb1, 0x02, 0x02, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x06, + 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, + 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x05, 0x10, 0xb0, 0x10, + 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x14, + 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x05, 0x10, 0xb0, 0x1c, + 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x1e, 0xd0, 0xb0, 0x05, 0x10, 0xb0, 0x20, + 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x22, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x25, + 0xd0, 0x30, 0x31, 0x01, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, + 0x21, 0x01, 0x21, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, + 0x33, 0x11, 0x21, 0x01, 0x21, 0x11, 0x21, 0x01, 0x33, 0x35, 0x23, 0x05, + 0x33, 0x27, 0x23, 0x01, 0x35, 0x23, 0x05, 0x90, 0xcd, 0xcd, 0xcd, 0xcd, + 0xfe, 0xd3, 0xfe, 0xcc, 0xfe, 0xed, 0xfe, 0xd3, 0xca, 0xca, 0xca, 0xca, + 0x01, 0x2d, 0x01, 0x1d, 0x01, 0x2b, 0x01, 0x2c, 0xfe, 0x6d, 0x67, 0xc9, + 0xfe, 0x81, 0xb2, 0x63, 0x4f, 0x02, 0x48, 0x06, 0x03, 0xdb, 0xa0, 0xa2, + 0xa0, 0xfe, 0x07, 0x01, 0xf9, 0xfe, 0x07, 0x01, 0xf9, 0xa0, 0xa2, 0xa0, + 0x01, 0xd5, 0xfe, 0x2b, 0x01, 0xd5, 0xfc, 0xe9, 0xa2, 0xa2, 0xa2, 0xfe, + 0xb5, 0x09, 0x00, 0x02, 0x00, 0x8d, 0xff, 0xec, 0x06, 0x71, 0x05, 0xb0, + 0x00, 0x1e, 0x00, 0x27, 0x00, 0xa6, 0xb2, 0x22, 0x28, 0x29, 0x11, 0x12, + 0x39, 0xb0, 0x22, 0x10, 0xb0, 0x17, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, + 0x59, 0xb0, 0x1d, 0x10, 0xb1, 0x00, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x0d, + 0xd0, 0xb0, 0x0e, 0xd0, 0xb2, 0x20, 0x13, 0x15, 0x11, 0x12, 0x39, 0xb0, + 0x20, 0x2f, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x1d, 0x10, 0xb0, 0x1c, 0xd0, 0xb0, 0x1c, 0x2f, 0xb0, + 0x15, 0x10, 0xb1, 0x26, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, + 0x15, 0x06, 0x23, 0x20, 0x03, 0x11, 0x23, 0x06, 0x04, 0x07, 0x23, 0x11, + 0x21, 0x11, 0x21, 0x32, 0x04, 0x17, 0x33, 0x11, 0x21, 0x11, 0x33, 0x01, + 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x06, 0x66, 0xb8, 0x2d, + 0x42, 0x31, 0x23, 0x55, 0x59, 0xfe, 0xd0, 0x06, 0x65, 0x27, 0xfe, 0xf6, + 0xcd, 0x6d, 0xfe, 0xd0, 0x01, 0x98, 0xd9, 0x01, 0x10, 0x1f, 0x60, 0x01, + 0x21, 0xb8, 0xfb, 0x57, 0x68, 0x6c, 0x74, 0x75, 0x69, 0x6a, 0x03, 0x66, + 0xfd, 0xe4, 0x3b, 0x35, 0x07, 0xdb, 0x1a, 0x01, 0x33, 0x02, 0x47, 0xaa, + 0xb7, 0x01, 0xfd, 0xfc, 0x05, 0xb0, 0xc3, 0xb3, 0x01, 0x0a, 0xfe, 0xf6, + 0xfe, 0xc5, 0x75, 0x6b, 0x67, 0x6e, 0xff, 0xff, 0x00, 0x82, 0xff, 0xec, + 0x08, 0x62, 0x05, 0xb0, 0x00, 0x26, 0x00, 0x36, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x57, 0x04, 0x90, 0x00, 0x00, 0x00, 0x05, 0x00, 0x25, 0x00, 0x00, + 0x06, 0x50, 0x05, 0xb0, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2a, + 0x00, 0x2d, 0x00, 0xe0, 0xb2, 0x0e, 0x2e, 0x2f, 0x11, 0x12, 0x39, 0xb0, + 0x0e, 0x10, 0xb0, 0x22, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x27, 0xd0, 0xb0, + 0x0e, 0x10, 0xb0, 0x29, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x2d, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, + 0x0c, 0x3e, 0x59, 0xb2, 0x08, 0x02, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x08, + 0x2f, 0xb0, 0x04, 0xd0, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, 0x04, + 0x10, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0e, 0x02, 0x0c, 0x11, 0x12, 0x39, 0xb0, + 0x0e, 0x2f, 0xb0, 0x0a, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x08, 0x10, 0xb0, + 0x14, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x16, 0xd0, 0xb0, 0x04, 0x10, 0xb0, + 0x18, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x1a, 0xd0, 0xb0, 0x04, 0x10, 0xb0, + 0x1c, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x1e, 0xd0, 0xb0, 0x08, 0x10, 0xb0, + 0x20, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x22, 0xd0, 0xb0, 0x08, 0x10, 0xb0, + 0x24, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x26, 0xd0, 0xb2, 0x28, 0x02, 0x0c, + 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb0, 0x29, 0xd0, 0xb2, 0x2b, 0x02, + 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb0, 0x2c, 0xd0, 0x30, 0x31, + 0x01, 0x33, 0x13, 0x21, 0x03, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, + 0x03, 0x21, 0x03, 0x23, 0x03, 0x21, 0x03, 0x23, 0x35, 0x33, 0x27, 0x23, + 0x35, 0x33, 0x03, 0x21, 0x13, 0x33, 0x13, 0x21, 0x01, 0x33, 0x37, 0x23, + 0x05, 0x33, 0x37, 0x23, 0x01, 0x37, 0x23, 0x05, 0x37, 0x23, 0x03, 0xe4, + 0xc3, 0x2a, 0x01, 0x2b, 0x3a, 0x8e, 0xae, 0x19, 0xc7, 0xe6, 0x89, 0xfe, + 0xd0, 0x6e, 0x1a, 0x6c, 0xfe, 0xcf, 0x8a, 0xdd, 0xbe, 0x19, 0xa5, 0x86, + 0x3a, 0x01, 0x2b, 0x2a, 0xc5, 0x2b, 0x01, 0x03, 0xfe, 0x36, 0x72, 0x13, + 0x98, 0x02, 0x33, 0x70, 0x12, 0x95, 0xfe, 0x2c, 0x22, 0x44, 0x02, 0x42, + 0x21, 0x43, 0x04, 0x86, 0x01, 0x2a, 0xfe, 0xd6, 0xa0, 0x84, 0xa0, 0xfd, + 0x3e, 0x02, 0xc2, 0xfd, 0x3e, 0x02, 0xc2, 0xa0, 0x84, 0xa0, 0x01, 0x2a, + 0xfe, 0xd6, 0x01, 0x2a, 0xfd, 0xb2, 0x84, 0x84, 0x84, 0xfd, 0xeb, 0xf1, + 0xe9, 0xe9, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x00, 0x06, 0x83, 0x04, 0x3a, + 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x66, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb1, + 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x05, 0x11, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x2f, 0xb0, 0x00, 0x10, + 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x0f, 0x0a, 0x0b, 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x2f, 0x30, 0x31, + 0x01, 0x32, 0x16, 0x17, 0x11, 0x21, 0x11, 0x34, 0x26, 0x27, 0x21, 0x11, + 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, 0x36, 0x37, 0x11, 0x21, + 0x11, 0x06, 0x04, 0x21, 0x03, 0x5a, 0xc6, 0xb2, 0x03, 0xfe, 0xde, 0x49, + 0x66, 0xfe, 0x8c, 0xfe, 0xdf, 0x01, 0xad, 0x01, 0x21, 0x01, 0x6c, 0x6a, + 0x4c, 0x02, 0x01, 0x22, 0x01, 0xfe, 0xc0, 0xfe, 0xfa, 0x04, 0x3a, 0xb7, + 0xd2, 0xfe, 0xbb, 0x01, 0x36, 0x5a, 0x53, 0x01, 0xfc, 0xb0, 0x04, 0x3a, + 0xfb, 0xc6, 0x02, 0xcf, 0xfe, 0x1a, 0x4e, 0x57, 0x02, 0xac, 0xfd, 0x5d, + 0xb7, 0xe0, 0x00, 0x01, 0x00, 0x59, 0xff, 0xed, 0x04, 0x44, 0x05, 0xc3, + 0x00, 0x22, 0x00, 0x93, 0xb2, 0x1c, 0x23, 0x24, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, + 0x3e, 0x59, 0xb2, 0x22, 0x16, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x22, 0x2f, + 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x09, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x22, 0x10, + 0xb0, 0x0e, 0xd0, 0xb0, 0x22, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x13, 0x2f, + 0xb6, 0x0f, 0x13, 0x1f, 0x13, 0x2f, 0x13, 0x03, 0x5d, 0xb2, 0x9f, 0x13, + 0x01, 0x5d, 0xb1, 0x10, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x16, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x13, 0x10, 0xb0, 0x1d, 0xd0, 0xb0, + 0x10, 0x10, 0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x16, 0x16, 0x33, + 0x32, 0x37, 0x17, 0x06, 0x23, 0x20, 0x00, 0x27, 0x23, 0x35, 0x33, 0x35, + 0x23, 0x35, 0x33, 0x36, 0x00, 0x21, 0x32, 0x17, 0x07, 0x26, 0x23, 0x20, + 0x03, 0x21, 0x15, 0x21, 0x15, 0x21, 0x03, 0x7e, 0xfe, 0xb1, 0x05, 0x93, + 0x9b, 0x69, 0x55, 0x24, 0x7c, 0x84, 0xfe, 0xf9, 0xfe, 0xcd, 0x08, 0xa9, + 0xa9, 0xa9, 0xab, 0x11, 0x01, 0x3d, 0x01, 0x06, 0x69, 0x83, 0x24, 0x5e, + 0x5b, 0xfe, 0xe5, 0x1b, 0x01, 0x4d, 0xfe, 0xb1, 0x01, 0x4f, 0x02, 0x04, + 0x93, 0x94, 0x1f, 0xf2, 0x1d, 0x01, 0x1b, 0xfc, 0x98, 0x7c, 0x98, 0xfc, + 0x01, 0x17, 0x1f, 0xf3, 0x20, 0xfe, 0xdf, 0x98, 0x7c, 0x00, 0x00, 0x04, + 0x00, 0x25, 0x00, 0x00, 0x05, 0xd8, 0x05, 0xb0, 0x00, 0x1a, 0x00, 0x1f, + 0x00, 0x24, 0x00, 0x29, 0x01, 0x1f, 0xb2, 0x0c, 0x2a, 0x2b, 0x11, 0x12, + 0x39, 0xb0, 0x0c, 0x10, 0xb0, 0x1c, 0xd0, 0xb0, 0x0c, 0x10, 0xb0, 0x23, + 0xd0, 0xb0, 0x0c, 0x10, 0xb0, 0x28, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x0b, + 0x10, 0xb1, 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x09, 0x2f, 0x40, 0x1d, 0x00, 0x09, 0x10, + 0x09, 0x20, 0x09, 0x30, 0x09, 0x40, 0x09, 0x50, 0x09, 0x60, 0x09, 0x70, + 0x09, 0x80, 0x09, 0x90, 0x09, 0xa0, 0x09, 0xb0, 0x09, 0xc0, 0x09, 0xd0, + 0x09, 0x0e, 0x5d, 0xb0, 0x05, 0xd0, 0xb0, 0x05, 0x2f, 0x40, 0x0d, 0x90, + 0x05, 0xa0, 0x05, 0xb0, 0x05, 0xc0, 0x05, 0xd0, 0x05, 0xe0, 0x05, 0x06, + 0x5d, 0xb4, 0x30, 0x05, 0x40, 0x05, 0x02, 0x5d, 0xb2, 0x70, 0x05, 0x01, + 0x71, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x27, 0xd0, 0xb0, 0x27, 0x2f, 0x40, 0x21, 0x00, 0x27, 0x10, + 0x27, 0x20, 0x27, 0x30, 0x27, 0x40, 0x27, 0x50, 0x27, 0x60, 0x27, 0x70, + 0x27, 0x80, 0x27, 0x90, 0x27, 0xa0, 0x27, 0xb0, 0x27, 0xc0, 0x27, 0xd0, + 0x27, 0xe0, 0x27, 0xf0, 0x27, 0x10, 0x5d, 0x40, 0x17, 0x00, 0x27, 0x10, + 0x27, 0x20, 0x27, 0x30, 0x27, 0x40, 0x27, 0x50, 0x27, 0x60, 0x27, 0x70, + 0x27, 0x80, 0x27, 0x90, 0x27, 0xa0, 0x27, 0x0b, 0x71, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, + 0xb1, 0x08, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x09, 0x10, 0xb0, 0x20, 0xd0, 0xb0, 0x0f, 0xd0, 0xb0, 0x08, 0x10, + 0xb0, 0x1d, 0xd0, 0xb0, 0x12, 0xd0, 0xb0, 0x05, 0x10, 0xb0, 0x1e, 0xd0, + 0xb0, 0x1e, 0x2f, 0xb0, 0x14, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x26, 0xd0, + 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, + 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x04, 0x17, 0x33, 0x15, 0x23, + 0x17, 0x07, 0x33, 0x15, 0x23, 0x06, 0x04, 0x23, 0x13, 0x27, 0x21, 0x15, + 0x21, 0x25, 0x21, 0x26, 0x27, 0x21, 0x01, 0x21, 0x15, 0x21, 0x32, 0x01, + 0xfb, 0xfe, 0xd3, 0xa9, 0xa9, 0xa9, 0xa9, 0x02, 0x39, 0xb9, 0x01, 0x0a, + 0x3b, 0xd3, 0xaf, 0x01, 0x01, 0xaf, 0xd2, 0x37, 0xfe, 0xfb, 0xc3, 0xf3, + 0x02, 0xfe, 0x03, 0x01, 0xfe, 0xfe, 0x02, 0x01, 0xa8, 0x3e, 0x58, 0xfe, + 0xee, 0x01, 0x99, 0xfe, 0x67, 0x01, 0x0c, 0x56, 0x02, 0x01, 0xfd, 0xff, + 0x03, 0x11, 0xa0, 0x3e, 0xa0, 0x01, 0x21, 0x98, 0x89, 0xa0, 0x21, 0x1d, + 0xa0, 0x81, 0x8f, 0x01, 0xdd, 0x11, 0x3e, 0xde, 0x2d, 0x01, 0xfe, 0x54, + 0x1d, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x04, 0x10, 0x05, 0xb0, + 0x00, 0x19, 0x00, 0x79, 0xb2, 0x11, 0x1a, 0x1b, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, + 0x3e, 0x59, 0xb0, 0x18, 0x10, 0xb1, 0x01, 0x08, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x18, 0x10, 0xb1, 0x17, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x13, 0xd0, 0xb0, + 0x13, 0x2f, 0xb0, 0x03, 0xd0, 0xb0, 0x13, 0x10, 0xb1, 0x12, 0x08, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, + 0x12, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x0e, 0x2f, 0xb1, 0x09, 0x09, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0d, 0x09, 0x0e, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x16, 0x17, 0x33, 0x07, 0x23, + 0x06, 0x06, 0x07, 0x01, 0x15, 0x21, 0x01, 0x27, 0x33, 0x32, 0x37, 0x21, + 0x37, 0x21, 0x26, 0x27, 0x21, 0x37, 0x21, 0x03, 0xdc, 0xd1, 0x2e, 0x0e, + 0xc9, 0x35, 0x95, 0x17, 0xc0, 0xb4, 0x01, 0xb5, 0xfe, 0xb5, 0xfe, 0x1c, + 0x01, 0xed, 0xb9, 0x2f, 0xfe, 0x13, 0x34, 0x01, 0xb3, 0x31, 0xa6, 0xfe, + 0xf0, 0x3b, 0x03, 0xad, 0x04, 0xe9, 0x48, 0x5f, 0xc6, 0x95, 0xb0, 0x23, + 0xfd, 0xfa, 0x0e, 0x02, 0x37, 0xb0, 0x95, 0xc6, 0x79, 0x02, 0xf3, 0x00, + 0x00, 0x01, 0x00, 0x25, 0xff, 0xec, 0x04, 0x74, 0x05, 0xb0, 0x00, 0x1e, + 0x00, 0x95, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, + 0x11, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, + 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x13, 0x11, 0x05, 0x11, 0x12, 0x39, + 0xb0, 0x13, 0x2f, 0xb0, 0x17, 0xd0, 0xb0, 0x17, 0x2f, 0xb2, 0x00, 0x17, + 0x01, 0x5d, 0xb2, 0x60, 0x17, 0x01, 0x5d, 0xb1, 0x18, 0x09, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x19, 0xd0, 0xb0, 0x08, + 0xd0, 0xb0, 0x09, 0xd0, 0xb0, 0x17, 0x10, 0xb0, 0x16, 0xd0, 0xb0, 0x0b, + 0xd0, 0xb0, 0x0a, 0xd0, 0xb0, 0x13, 0x10, 0xb1, 0x14, 0x09, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x15, 0xd0, 0xb0, 0x0c, + 0xd0, 0xb0, 0x0d, 0xd0, 0xb0, 0x13, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x0f, + 0xd0, 0xb0, 0x0e, 0xd0, 0xb0, 0x05, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1e, 0x05, 0x11, 0x11, + 0x12, 0x39, 0xb0, 0x1e, 0x2f, 0x30, 0x31, 0x01, 0x15, 0x14, 0x02, 0x04, + 0x23, 0x22, 0x27, 0x11, 0x07, 0x35, 0x37, 0x35, 0x07, 0x35, 0x37, 0x11, + 0x21, 0x15, 0x37, 0x15, 0x07, 0x15, 0x37, 0x15, 0x07, 0x11, 0x36, 0x36, + 0x37, 0x35, 0x04, 0x74, 0x9a, 0xfe, 0xe3, 0xb7, 0x90, 0x96, 0xbb, 0xbb, + 0xbb, 0xbb, 0x01, 0x2b, 0xc4, 0xc4, 0xc4, 0xc4, 0x99, 0xa1, 0x01, 0x02, + 0xfb, 0x47, 0xd4, 0xfe, 0xbc, 0xb0, 0x14, 0x02, 0x71, 0x3d, 0xd5, 0x3d, + 0x78, 0x3d, 0xd5, 0x3d, 0x01, 0x1d, 0xbb, 0x41, 0xd5, 0x41, 0x78, 0x41, + 0xd4, 0x41, 0xfe, 0x0e, 0x02, 0xe8, 0xe4, 0x4b, 0x00, 0x01, 0x00, 0x44, + 0x00, 0x00, 0x05, 0x31, 0x04, 0x3a, 0x00, 0x18, 0x00, 0x60, 0xb2, 0x0b, + 0x19, 0x1a, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, + 0x2f, 0x1b, 0xb1, 0x18, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb2, 0x16, + 0x0a, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x16, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, + 0x00, 0x2f, 0xb0, 0x16, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x01, 0x16, + 0x00, 0x13, 0x15, 0x21, 0x35, 0x26, 0x26, 0x27, 0x11, 0x21, 0x11, 0x06, + 0x06, 0x15, 0x15, 0x21, 0x35, 0x34, 0x12, 0x36, 0x37, 0x35, 0x21, 0x03, + 0x4b, 0xdf, 0x01, 0x05, 0x02, 0xfe, 0xdf, 0x01, 0x68, 0x5c, 0xfe, 0xdf, + 0x5c, 0x69, 0xfe, 0xdf, 0x75, 0xdd, 0x94, 0x01, 0x21, 0x03, 0x61, 0x32, + 0xfe, 0x90, 0xfe, 0xf1, 0xb0, 0xaf, 0xa9, 0xdb, 0x30, 0xfd, 0x9d, 0x02, + 0x64, 0x30, 0xde, 0xad, 0xa9, 0xa8, 0xb5, 0x01, 0x24, 0xc0, 0x21, 0xd8, + 0x00, 0x02, 0x00, 0x33, 0x00, 0x00, 0x05, 0x59, 0x05, 0xb0, 0x00, 0x17, + 0x00, 0x1f, 0x00, 0x83, 0xb2, 0x19, 0x20, 0x21, 0x11, 0x12, 0x39, 0xb0, + 0x19, 0x10, 0xb0, 0x14, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, + 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x06, 0xd0, 0xb0, + 0x06, 0x2f, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, + 0x0a, 0x2f, 0xb2, 0x0f, 0x0a, 0x01, 0x5d, 0xb4, 0x5f, 0x0a, 0x6f, 0x0a, + 0x02, 0x5d, 0xb2, 0xdf, 0x0a, 0x01, 0x5d, 0xb1, 0x09, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x15, 0xd0, 0xb0, 0x06, + 0x10, 0xb0, 0x16, 0xd0, 0xb0, 0x0a, 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x0c, + 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x25, 0x21, 0x15, 0x21, 0x35, 0x23, 0x35, 0x33, 0x35, + 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x16, 0x16, 0x15, 0x14, 0x04, 0x21, + 0x21, 0x15, 0x21, 0x01, 0x21, 0x32, 0x35, 0x34, 0x26, 0x27, 0x21, 0x03, + 0x68, 0xfe, 0xc2, 0xfe, 0xd4, 0xcb, 0xcb, 0xcb, 0xcb, 0x02, 0x36, 0xa4, + 0xf8, 0x89, 0xfe, 0xdb, 0xfe, 0xfb, 0xfe, 0xfb, 0x01, 0x3e, 0xfe, 0xc2, + 0x01, 0x03, 0xfc, 0x80, 0x71, 0xfe, 0xf2, 0xc2, 0xc2, 0xc2, 0xf3, 0x4c, + 0xf3, 0x02, 0xbc, 0x76, 0xdb, 0x8c, 0xd8, 0xfa, 0x4c, 0x01, 0x3f, 0xdd, + 0x69, 0x81, 0x01, 0x00, 0x00, 0x04, 0x00, 0x64, 0xff, 0xec, 0x05, 0x90, + 0x05, 0xc5, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x34, 0x00, 0x38, 0x00, 0x8a, + 0xb2, 0x1b, 0x39, 0x3a, 0x11, 0x12, 0x39, 0xb0, 0x1b, 0x10, 0xb0, 0x00, + 0xd0, 0xb0, 0x1b, 0x10, 0xb0, 0x29, 0xd0, 0xb0, 0x1b, 0x10, 0xb0, 0x37, + 0xd0, 0x00, 0xb0, 0x35, 0x2f, 0xb0, 0x37, 0x2f, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x25, 0x2f, 0x1b, 0xb1, 0x25, 0x0c, 0x3e, 0x59, 0xb0, 0x09, + 0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x03, 0x2f, 0xb0, 0x09, 0x10, 0xb1, 0x10, + 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, + 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x25, 0x10, 0xb0, 0x1e, 0xd0, 0xb0, 0x1e, 0x2f, 0xb0, 0x25, + 0x10, 0xb1, 0x2c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x1e, 0x10, 0xb1, 0x32, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x35, 0x34, 0x36, 0x20, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x17, + 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, + 0x27, 0x01, 0x17, 0x02, 0xb4, 0x9f, 0x87, 0x86, 0xa4, 0xa2, 0x01, 0x0c, + 0xa2, 0xc0, 0x3b, 0x2d, 0x2f, 0x38, 0x37, 0x32, 0x2c, 0x3a, 0x01, 0x23, + 0xb0, 0x8c, 0x8e, 0xaf, 0xac, 0x8f, 0x90, 0xae, 0xc0, 0x48, 0x36, 0x7a, + 0x44, 0x70, 0x44, 0xfd, 0xf0, 0x8d, 0x02, 0xc7, 0x8d, 0x04, 0x29, 0x73, + 0x96, 0xa6, 0x8b, 0x47, 0x86, 0xa7, 0x97, 0x75, 0x2c, 0x39, 0x49, 0x3f, + 0x4b, 0x39, 0x4c, 0x38, 0x2b, 0xfd, 0x3c, 0x87, 0xa5, 0xa3, 0x8f, 0x48, + 0x86, 0xa5, 0xa6, 0x89, 0x04, 0x37, 0x4e, 0x87, 0x4c, 0x3c, 0x49, 0x49, + 0x3f, 0xf5, 0x4c, 0x04, 0x72, 0x4c, 0x00, 0x02, 0x00, 0x2a, 0xff, 0xeb, + 0x03, 0xad, 0x05, 0xda, 0x00, 0x18, 0x00, 0x21, 0x00, 0x5d, 0xb2, 0x01, + 0x22, 0x23, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x19, 0xd0, 0x00, + 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, + 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x07, 0x0d, 0x00, 0x11, 0x12, 0x39, 0xb0, + 0x07, 0x2f, 0xb1, 0x06, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x14, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x18, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb0, + 0x19, 0xd0, 0xb0, 0x0d, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x22, 0x24, 0x27, 0x35, + 0x06, 0x23, 0x35, 0x32, 0x37, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x15, 0x14, 0x02, 0x07, 0x15, 0x14, 0x16, 0x33, 0x03, 0x36, 0x35, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x15, 0x02, 0xe8, 0xf9, 0xfe, 0xf6, 0x01, 0x59, + 0x61, 0x61, 0x59, 0x04, 0xc5, 0xad, 0x98, 0xbb, 0xe0, 0xb9, 0x65, 0x6f, + 0xd4, 0x95, 0x2a, 0x1e, 0x4d, 0x15, 0xe9, 0xda, 0x11, 0x0f, 0xbb, 0x11, + 0x01, 0xa6, 0xce, 0xea, 0xbf, 0x9f, 0x27, 0x9a, 0xfe, 0xc8, 0x61, 0x37, + 0x7e, 0x72, 0x02, 0x15, 0x89, 0xc7, 0x1f, 0x30, 0x38, 0xaf, 0x00, 0x04, + 0x00, 0x80, 0x00, 0x00, 0x07, 0xb6, 0x05, 0xc0, 0x00, 0x03, 0x00, 0x10, + 0x00, 0x1e, 0x00, 0x28, 0x00, 0xa4, 0xb2, 0x1f, 0x29, 0x2a, 0x11, 0x12, + 0x39, 0xb0, 0x1f, 0x10, 0xb0, 0x01, 0xdc, 0xb0, 0x1f, 0x10, 0xb0, 0x04, + 0xdc, 0xb0, 0x1f, 0x10, 0xb0, 0x11, 0xdc, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x27, 0x2f, 0x1b, 0xb1, 0x27, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x25, 0x2f, 0x1b, 0xb1, 0x25, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x0c, 0x3e, + 0x59, 0xb0, 0x07, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x0d, 0x2f, 0xb0, 0x02, + 0xd0, 0xb0, 0x02, 0x2f, 0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x14, 0x02, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x1b, + 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x21, + 0x25, 0x20, 0x11, 0x12, 0x39, 0xb2, 0x26, 0x20, 0x25, 0x11, 0x12, 0x39, + 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x01, 0x34, 0x36, 0x20, 0x16, 0x15, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x17, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x21, 0x01, + 0x11, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, 0x07, 0x83, 0xfd, 0xab, 0x02, + 0x55, 0xfd, 0x7e, 0xc0, 0x01, 0x34, 0xc1, 0xbd, 0x9c, 0x9d, 0xbf, 0xaf, + 0x5d, 0x50, 0x4f, 0x5b, 0x5e, 0x4e, 0x4d, 0x5e, 0xfe, 0xd7, 0xfe, 0xc2, + 0xfe, 0x5a, 0xfe, 0xdd, 0x01, 0x3e, 0x01, 0xa7, 0x01, 0x22, 0x01, 0xa1, + 0x93, 0x02, 0x24, 0xa0, 0xc8, 0xc7, 0xa7, 0x3e, 0x9e, 0xc8, 0xc9, 0xa3, + 0x06, 0x63, 0x71, 0x72, 0x67, 0x3f, 0x62, 0x72, 0x72, 0x66, 0xfb, 0xac, + 0x03, 0xb3, 0xfc, 0x4d, 0x05, 0xb0, 0xfc, 0x4b, 0x03, 0xb5, 0x00, 0x02, + 0x00, 0x74, 0x03, 0x92, 0x04, 0x78, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x14, + 0x00, 0x6e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, + 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, + 0x1b, 0xb1, 0x13, 0x18, 0x3e, 0x59, 0xb2, 0x01, 0x15, 0x06, 0x11, 0x12, + 0x39, 0xb0, 0x01, 0x2f, 0xb2, 0x00, 0x09, 0x01, 0x11, 0x12, 0x39, 0xb2, + 0x03, 0x01, 0x06, 0x11, 0x12, 0x39, 0xb0, 0x04, 0xd0, 0xb2, 0x08, 0x01, + 0x09, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x06, + 0x10, 0xb0, 0x0d, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, + 0x01, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x0d, 0x10, 0xb0, 0x11, 0xd0, 0xb0, + 0x12, 0xd0, 0x30, 0x31, 0x01, 0x03, 0x23, 0x03, 0x11, 0x23, 0x11, 0x33, + 0x13, 0x13, 0x33, 0x11, 0x23, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, + 0x21, 0x03, 0xf8, 0x6f, 0x48, 0x6f, 0x80, 0x9e, 0x75, 0x7e, 0x95, 0x80, + 0xfe, 0x13, 0x81, 0x8e, 0x88, 0x01, 0x97, 0x04, 0xf2, 0xfe, 0xa0, 0x01, + 0x61, 0xfe, 0x9f, 0x02, 0x1e, 0xfe, 0x90, 0x01, 0x70, 0xfd, 0xe2, 0x01, + 0xb2, 0xfe, 0x51, 0x01, 0xaf, 0x6c, 0x00, 0x02, 0x00, 0x94, 0xff, 0xec, + 0x04, 0x8f, 0x04, 0x4e, 0x00, 0x15, 0x00, 0x1c, 0x00, 0x65, 0xb2, 0x02, + 0x1d, 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x10, 0xb0, 0x16, 0xdc, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, + 0x3e, 0x59, 0xb2, 0x1a, 0x0a, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x2f, + 0xb1, 0x0f, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x02, 0x10, 0xb1, 0x13, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x15, 0x0a, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x0a, + 0x10, 0xb1, 0x16, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x25, 0x06, 0x23, 0x22, 0x26, 0x02, 0x35, 0x34, 0x12, + 0x36, 0x33, 0x32, 0x16, 0x16, 0x17, 0x15, 0x21, 0x11, 0x16, 0x33, 0x32, + 0x37, 0x01, 0x22, 0x07, 0x11, 0x21, 0x11, 0x26, 0x04, 0x12, 0xb7, 0xbb, + 0x91, 0xf4, 0x87, 0x90, 0xf8, 0x84, 0x85, 0xe3, 0x84, 0x03, 0xfd, 0x00, + 0x77, 0x9a, 0xc4, 0xac, 0xfe, 0x90, 0x97, 0x7a, 0x02, 0x1c, 0x73, 0x5e, + 0x72, 0x9d, 0x01, 0x01, 0x93, 0x8f, 0x01, 0x03, 0x9f, 0x8b, 0xf3, 0x90, + 0x3e, 0xfe, 0xb8, 0x6e, 0x7a, 0x03, 0x2a, 0x7a, 0xfe, 0xeb, 0x01, 0x1e, + 0x71, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xf5, 0x05, 0xdf, 0x05, 0x98, + 0x00, 0x27, 0x01, 0xc6, 0xff, 0xda, 0x02, 0x86, 0x00, 0x27, 0x01, 0x94, + 0x01, 0x12, 0x00, 0x00, 0x01, 0x07, 0x02, 0x24, 0x03, 0x2d, 0x00, 0x00, + 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, + 0x05, 0x18, 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, 0x00, 0x48, 0xff, 0xf5, + 0x06, 0x7b, 0x05, 0xb4, 0x00, 0x27, 0x02, 0x1f, 0x00, 0x18, 0x02, 0x94, + 0x00, 0x27, 0x01, 0x94, 0x01, 0xab, 0x00, 0x00, 0x01, 0x07, 0x02, 0x24, + 0x03, 0xc9, 0x00, 0x00, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x10, 0x3e, 0x59, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x57, 0xff, 0xf5, 0x06, 0x68, 0x05, 0xac, 0x00, 0x27, + 0x02, 0x21, 0x00, 0x12, 0x02, 0x97, 0x00, 0x27, 0x01, 0x94, 0x01, 0x97, + 0x00, 0x00, 0x01, 0x07, 0x02, 0x24, 0x03, 0xb6, 0x00, 0x00, 0x00, 0x1d, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, + 0x10, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xf5, + 0x06, 0x32, 0x05, 0xa3, 0x00, 0x27, 0x02, 0x23, 0x00, 0x28, 0x02, 0x8e, + 0x00, 0x27, 0x01, 0x94, 0x01, 0x48, 0x00, 0x00, 0x01, 0x07, 0x02, 0x24, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x02, + 0x00, 0x59, 0xff, 0xeb, 0x04, 0x55, 0x06, 0x01, 0x00, 0x1a, 0x00, 0x27, + 0x00, 0x57, 0xb2, 0x14, 0x28, 0x29, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x10, + 0xb0, 0x21, 0xd0, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x0c, 0x14, + 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb0, 0x0c, 0x10, 0xb1, 0x05, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, + 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x14, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x17, 0x26, 0x26, 0x23, 0x22, + 0x07, 0x07, 0x27, 0x37, 0x36, 0x33, 0x20, 0x00, 0x13, 0x15, 0x14, 0x02, + 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x17, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x26, 0x26, 0x02, 0x35, 0xa5, + 0x73, 0x1f, 0xb1, 0x7e, 0x68, 0x49, 0x42, 0x2d, 0x3a, 0x73, 0x8b, 0x01, + 0x0f, 0x01, 0x2c, 0x03, 0x7d, 0xe9, 0x99, 0xe8, 0xfe, 0xeb, 0x01, 0x01, + 0xfe, 0x6b, 0x72, 0x70, 0x6b, 0x69, 0x75, 0x1f, 0x72, 0x04, 0x0c, 0x73, + 0xb4, 0xcc, 0x1a, 0x19, 0xcf, 0x1a, 0x32, 0xfe, 0x55, 0xfe, 0x73, 0x3e, + 0xc5, 0xfe, 0xce, 0xa9, 0x01, 0x21, 0xfa, 0x0d, 0xe4, 0x01, 0x15, 0xe9, + 0x94, 0xa0, 0x89, 0x92, 0xae, 0xad, 0x6e, 0x40, 0x46, 0x00, 0x00, 0x01, + 0x00, 0xa4, 0xff, 0x03, 0x04, 0xef, 0x05, 0xb0, 0x00, 0x07, 0x00, 0x28, + 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, + 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x01, 0xd0, 0xb0, + 0x06, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x05, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, + 0x04, 0xef, 0xfe, 0xde, 0xfd, 0xf9, 0xfe, 0xde, 0x04, 0x4b, 0xfd, 0x05, + 0xc9, 0xfa, 0x37, 0x06, 0xad, 0x00, 0x00, 0x01, 0x00, 0x39, 0xfe, 0xf3, + 0x04, 0xd4, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x37, 0x00, 0xb0, 0x03, 0x2f, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, + 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x08, 0x10, 0xb1, 0x0a, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, + 0xd0, 0x30, 0x31, 0x01, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x01, 0x35, + 0x21, 0x15, 0x21, 0x01, 0x03, 0xa3, 0xfe, 0x23, 0x03, 0x0e, 0xfb, 0x65, + 0x02, 0x3a, 0xfd, 0xc6, 0x04, 0x78, 0xfd, 0x18, 0x01, 0xda, 0x02, 0x46, + 0xfd, 0x96, 0xe9, 0x97, 0x02, 0xcd, 0x02, 0xc2, 0x97, 0xea, 0xfd, 0xa1, + 0x00, 0x01, 0x00, 0x93, 0x02, 0x54, 0x03, 0xf2, 0x03, 0x40, 0x00, 0x03, + 0x00, 0x12, 0x00, 0xb0, 0x02, 0x2f, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, + 0x03, 0xf2, 0xfc, 0xa1, 0x03, 0x5f, 0x02, 0x54, 0xec, 0x00, 0x00, 0x01, + 0x00, 0x37, 0x00, 0x00, 0x04, 0x6f, 0x05, 0xb0, 0x00, 0x08, 0x00, 0x3d, + 0xb2, 0x03, 0x09, 0x0a, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x07, 0x2f, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, + 0x59, 0xb2, 0x00, 0x01, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb1, + 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x01, 0x33, 0x01, 0x23, 0x03, 0x23, 0x35, 0x21, 0x02, 0x46, + 0x01, 0x42, 0xe7, 0xfe, 0x5a, 0xf6, 0xba, 0xe2, 0x01, 0x84, 0x01, 0x26, + 0x04, 0x8a, 0xfa, 0x50, 0x02, 0x0b, 0xec, 0x00, 0x00, 0x03, 0x00, 0x5e, + 0xff, 0xec, 0x07, 0xfd, 0x04, 0x4e, 0x00, 0x18, 0x00, 0x28, 0x00, 0x37, + 0x00, 0x6e, 0xb2, 0x06, 0x38, 0x39, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, + 0xb0, 0x20, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x30, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, + 0xb0, 0x10, 0xd0, 0xb0, 0x10, 0x2f, 0xb0, 0x16, 0xd0, 0xb0, 0x16, 0x2f, + 0xb2, 0x06, 0x16, 0x04, 0x11, 0x12, 0x39, 0xb2, 0x13, 0x16, 0x04, 0x11, + 0x12, 0x39, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x26, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2c, 0xd0, 0xb0, 0x1c, 0x10, 0xb0, + 0x35, 0xd0, 0x30, 0x31, 0x01, 0x14, 0x06, 0x06, 0x23, 0x20, 0x03, 0x02, + 0x21, 0x22, 0x00, 0x35, 0x35, 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, + 0x36, 0x36, 0x33, 0x32, 0x00, 0x05, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, + 0x07, 0x15, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x25, 0x14, 0x16, 0x33, 0x32, + 0x37, 0x36, 0x37, 0x35, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0xfd, 0x83, + 0xeb, 0x95, 0xfe, 0xdf, 0xac, 0xac, 0xfe, 0xdf, 0xe5, 0xfe, 0xe3, 0x80, + 0xeb, 0x95, 0x8d, 0xed, 0x55, 0x56, 0xeb, 0x8e, 0xe1, 0x01, 0x20, 0xfe, + 0xe6, 0x88, 0x6e, 0x8b, 0x61, 0x32, 0x11, 0x05, 0x3c, 0x53, 0x61, 0x38, + 0x72, 0x86, 0xfa, 0x94, 0x85, 0x73, 0x92, 0x65, 0x2d, 0x08, 0x12, 0x5f, + 0x79, 0x44, 0x6e, 0x88, 0x02, 0x12, 0x9d, 0xfd, 0x8c, 0x01, 0x38, 0xfe, + 0xc8, 0x01, 0x37, 0xf8, 0x0b, 0x9a, 0xff, 0x8f, 0x97, 0x98, 0x9a, 0x95, + 0xfe, 0xca, 0xf2, 0x8c, 0xab, 0x95, 0x4e, 0x48, 0x1d, 0x21, 0x83, 0x60, + 0x35, 0xac, 0x8a, 0x8b, 0xab, 0xb3, 0x51, 0x35, 0x1d, 0x4c, 0x94, 0x4b, + 0xaa, 0x00, 0x00, 0x01, 0xff, 0xa5, 0xfe, 0x4b, 0x02, 0xbd, 0x06, 0x15, + 0x00, 0x15, 0x00, 0x3f, 0xb2, 0x02, 0x16, 0x17, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x1a, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, + 0x3e, 0x59, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x14, 0x06, 0x23, 0x22, + 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, + 0x07, 0x26, 0x23, 0x22, 0x15, 0x01, 0xb1, 0xc8, 0xb4, 0x4c, 0x44, 0x10, + 0x30, 0x25, 0x81, 0x04, 0xd0, 0xbf, 0x3f, 0x60, 0x18, 0x2a, 0x37, 0x93, + 0x2f, 0xc0, 0xc6, 0x12, 0xe4, 0x0c, 0x90, 0x04, 0xd3, 0xb8, 0xc5, 0x15, + 0xde, 0x0a, 0x99, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0xf1, 0x04, 0x20, + 0x03, 0xfe, 0x00, 0x15, 0x00, 0x2a, 0x00, 0x7c, 0xb2, 0x10, 0x2b, 0x2c, + 0x11, 0x12, 0x39, 0xb0, 0x10, 0x10, 0xb0, 0x1b, 0xd0, 0x00, 0xb0, 0x03, + 0x2f, 0xb0, 0x08, 0xd0, 0xb0, 0x08, 0x2f, 0xb0, 0x03, 0x10, 0xb0, 0x0a, + 0xd0, 0xb0, 0x08, 0x10, 0xb1, 0x0d, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x12, 0x09, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb0, 0x15, + 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x18, 0x2f, 0xb0, 0x1d, + 0xd0, 0xb0, 0x1d, 0x2f, 0xb0, 0x18, 0x10, 0xb0, 0x1f, 0xd0, 0xb0, 0x1d, + 0x10, 0xb1, 0x22, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x18, 0x10, 0xb1, 0x27, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x22, 0x10, 0xb0, 0x2a, 0xd0, 0x30, 0x31, + 0x13, 0x36, 0x36, 0x33, 0x36, 0x17, 0x17, 0x16, 0x33, 0x32, 0x37, 0x15, + 0x06, 0x23, 0x22, 0x27, 0x27, 0x26, 0x07, 0x22, 0x06, 0x07, 0x15, 0x36, + 0x33, 0x36, 0x17, 0x17, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, + 0x27, 0x27, 0x26, 0x07, 0x22, 0x06, 0x07, 0x65, 0x30, 0x84, 0x42, 0x58, + 0x55, 0x8a, 0x52, 0x58, 0x7f, 0x65, 0x66, 0x77, 0x58, 0x52, 0x8a, 0x55, + 0x58, 0x45, 0x8b, 0x2d, 0x66, 0x88, 0x5a, 0x56, 0x8c, 0x4f, 0x56, 0x87, + 0x65, 0x66, 0x7e, 0x58, 0x52, 0x8a, 0x55, 0x58, 0x42, 0x84, 0x30, 0x03, + 0x92, 0x32, 0x38, 0x02, 0x26, 0x44, 0x26, 0x7e, 0xed, 0x6a, 0x26, 0x44, + 0x26, 0x02, 0x46, 0x38, 0xb7, 0x6a, 0x02, 0x27, 0x45, 0x24, 0x7e, 0xed, + 0x6a, 0x26, 0x44, 0x26, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x01, 0x00, 0x88, + 0x00, 0x61, 0x04, 0x06, 0x04, 0xab, 0x00, 0x13, 0x00, 0x39, 0x00, 0xb0, + 0x13, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x13, 0x10, 0xb0, 0x07, 0xd0, 0xb0, + 0x13, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x0f, 0x2f, 0xb1, 0x10, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0xd0, 0xb0, + 0x0f, 0x10, 0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x07, 0x27, 0x37, + 0x23, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x33, 0x15, + 0x21, 0x07, 0x21, 0x04, 0x06, 0xfd, 0xd6, 0x74, 0x77, 0x53, 0xbc, 0x01, + 0x3b, 0x6a, 0xfe, 0x5b, 0x02, 0x24, 0x73, 0x77, 0x51, 0xc1, 0xfe, 0xc0, + 0x6b, 0x01, 0xab, 0x01, 0x39, 0xd8, 0x3e, 0x9a, 0xec, 0xc5, 0xec, 0xd5, + 0x3f, 0x96, 0xec, 0xc5, 0xff, 0xff, 0x00, 0x36, 0x00, 0x28, 0x03, 0x9c, + 0x04, 0x98, 0x00, 0x67, 0x00, 0x20, 0x00, 0x00, 0x00, 0xb7, 0x40, 0x00, + 0x39, 0x9a, 0x01, 0x07, 0x01, 0xaf, 0xff, 0xaa, 0xfd, 0xd4, 0x00, 0x0d, + 0x00, 0xb2, 0x00, 0x0a, 0x01, 0x5d, 0xb2, 0x70, 0x0a, 0x01, 0x5d, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x78, 0x00, 0x28, 0x03, 0xdf, 0x04, 0x9d, + 0x00, 0x67, 0x00, 0x22, 0x00, 0x00, 0x00, 0xbd, 0x40, 0x00, 0x39, 0x9a, + 0x01, 0x07, 0x01, 0xaf, 0xff, 0xe6, 0xfd, 0xd4, 0x00, 0x0d, 0x00, 0xb2, + 0x00, 0x09, 0x01, 0x5d, 0xb2, 0x70, 0x09, 0x01, 0x5d, 0x30, 0x31, 0x00, + 0x00, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x03, 0xf7, 0x05, 0xb0, 0x00, 0x05, + 0x00, 0x09, 0x00, 0x38, 0xb2, 0x08, 0x0a, 0x0b, 0x11, 0x12, 0x39, 0xb0, + 0x08, 0x10, 0xb0, 0x01, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x00, 0x03, + 0x11, 0x12, 0x39, 0xb2, 0x08, 0x00, 0x03, 0x11, 0x12, 0x39, 0x30, 0x31, + 0x01, 0x33, 0x01, 0x01, 0x23, 0x01, 0x01, 0x03, 0x13, 0x13, 0x01, 0x8f, + 0xf7, 0x01, 0x71, 0xfe, 0x90, 0xf7, 0xfe, 0x8f, 0x01, 0xeb, 0xcc, 0xce, + 0xcb, 0x05, 0xb0, 0xfd, 0x27, 0xfd, 0x29, 0x02, 0xd7, 0x01, 0xa9, 0xfe, + 0x57, 0xfe, 0x58, 0x01, 0xa8, 0x00, 0xff, 0xff, 0x00, 0x8a, 0x00, 0xaf, + 0x01, 0xd1, 0x05, 0x16, 0x00, 0x27, 0x00, 0x12, 0x00, 0x0c, 0x00, 0xba, + 0x00, 0x07, 0x00, 0x12, 0x00, 0x0c, 0x03, 0xed, 0x00, 0x02, 0x00, 0x5a, + 0x02, 0x8d, 0x02, 0x37, 0x04, 0x39, 0x00, 0x03, 0x00, 0x07, 0x00, 0x2c, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, + 0x14, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, + 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0x30, 0x31, 0x13, 0x23, 0x11, 0x33, + 0x01, 0x23, 0x11, 0x33, 0xfd, 0xa3, 0xa3, 0x01, 0x3a, 0xa3, 0xa3, 0x02, + 0x8d, 0x01, 0xac, 0xfe, 0x54, 0x01, 0xac, 0x00, 0x00, 0x01, 0x00, 0x34, + 0xff, 0x6b, 0x01, 0x54, 0x01, 0x13, 0x00, 0x08, 0x00, 0x1e, 0x00, 0xb0, + 0x09, 0x2f, 0xb0, 0x04, 0xd0, 0xb0, 0x04, 0x2f, 0xb2, 0xa0, 0x04, 0x01, + 0x5d, 0xb4, 0x30, 0x04, 0x40, 0x04, 0x02, 0x5d, 0xb0, 0x00, 0xd0, 0xb0, + 0x00, 0x2f, 0x30, 0x31, 0x17, 0x27, 0x36, 0x37, 0x35, 0x33, 0x15, 0x14, + 0x06, 0xc3, 0x8f, 0x49, 0x03, 0xd4, 0x53, 0x95, 0x4f, 0x73, 0x7f, 0x67, + 0x47, 0x5d, 0xc6, 0x00, 0xff, 0xff, 0x00, 0x1d, 0x00, 0x00, 0x05, 0x3a, + 0x06, 0x15, 0x00, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x4a, + 0x02, 0x5c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x04, 0x5e, + 0x06, 0x15, 0x00, 0x15, 0x00, 0x19, 0x00, 0x85, 0xb2, 0x08, 0x1a, 0x1b, + 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x17, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x1a, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, + 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x01, 0x09, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0e, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, + 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x14, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, + 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x26, 0x23, + 0x22, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x21, 0x21, 0x11, 0x21, 0xb5, + 0xa1, 0xa1, 0x02, 0xf7, 0xe1, 0x87, 0xc1, 0x2a, 0x62, 0x6c, 0x3e, 0xca, + 0xd5, 0xd5, 0x02, 0x87, 0xfe, 0xde, 0x01, 0x22, 0x03, 0x66, 0xd4, 0x32, + 0xcc, 0xdd, 0x3b, 0xef, 0x1d, 0x11, 0xb3, 0x2c, 0xd4, 0xfc, 0x9a, 0x04, + 0x3a, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x04, 0x66, 0x06, 0x15, + 0x00, 0x16, 0x00, 0x5e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, + 0x1b, 0xb1, 0x12, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, + 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x12, 0x10, + 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x06, 0x10, 0xb1, 0x07, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x0e, 0xd0, + 0x30, 0x31, 0x01, 0x26, 0x23, 0x22, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, + 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, 0x05, 0x11, + 0x21, 0x03, 0x44, 0x56, 0x4a, 0xc4, 0xd7, 0xd7, 0xfe, 0xde, 0xa1, 0xa1, + 0x02, 0xe8, 0xd4, 0x97, 0x01, 0x53, 0xfe, 0xde, 0x05, 0x20, 0x0a, 0xa7, + 0x49, 0xd4, 0xfc, 0x9a, 0x03, 0x66, 0xd4, 0x54, 0xbc, 0xcb, 0x20, 0xfa, + 0x0b, 0x00, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x06, 0xed, 0x06, 0x15, + 0x00, 0x26, 0x00, 0x2a, 0x00, 0xc1, 0xb2, 0x13, 0x2b, 0x2c, 0x11, 0x12, + 0x39, 0xb0, 0x13, 0x10, 0xb0, 0x28, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x1a, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, 0x1e, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x29, 0x2f, 0x1b, 0xb1, 0x29, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, + 0x22, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x27, 0x2f, 0x1b, + 0xb1, 0x27, 0x0c, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x01, 0x09, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, + 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x15, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb0, 0x20, 0xd0, 0xb0, 0x21, 0xd0, 0xb0, + 0x24, 0xd0, 0xb0, 0x25, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, 0x35, 0x33, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x15, 0x15, + 0x21, 0x35, 0x36, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, + 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x21, + 0x11, 0x21, 0xbe, 0xa1, 0xa1, 0xd1, 0xbc, 0x3c, 0x57, 0x03, 0x24, 0x34, + 0xa3, 0x01, 0x64, 0x02, 0xf7, 0xe1, 0x86, 0xc3, 0x2a, 0x62, 0x6d, 0x3e, + 0xca, 0xd5, 0xd5, 0xfe, 0xde, 0xfe, 0x9c, 0x05, 0x0d, 0xfe, 0xde, 0x01, + 0x22, 0x03, 0x66, 0xd4, 0x5c, 0xb6, 0xc9, 0x14, 0xe0, 0x09, 0x99, 0x57, + 0x32, 0xcc, 0xdd, 0x3b, 0xef, 0x1d, 0x11, 0xb3, 0x2c, 0xd4, 0xfc, 0x9a, + 0x03, 0x66, 0xfc, 0x9a, 0x04, 0x3a, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, + 0x06, 0xed, 0x06, 0x15, 0x00, 0x27, 0x00, 0x9e, 0xb2, 0x13, 0x28, 0x29, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, + 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, + 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x0c, 0x3e, 0x59, 0xb0, + 0x03, 0x10, 0xb1, 0x01, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb0, 0x15, 0xd0, 0xb0, + 0x0d, 0x10, 0xb0, 0x1c, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x21, 0xd0, 0xb0, + 0x22, 0xd0, 0xb0, 0x25, 0xd0, 0xb0, 0x26, 0xd0, 0x30, 0x31, 0x33, 0x11, + 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, + 0x22, 0x15, 0x15, 0x21, 0x35, 0x36, 0x36, 0x33, 0x32, 0x05, 0x11, 0x21, + 0x11, 0x26, 0x23, 0x22, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x21, 0x11, + 0x21, 0x11, 0xbe, 0xa1, 0xa1, 0xd1, 0xbc, 0x3c, 0x57, 0x03, 0x24, 0x34, + 0xa3, 0x01, 0x64, 0x01, 0xeb, 0xd3, 0x90, 0x01, 0x5a, 0xfe, 0xde, 0x56, + 0x4b, 0xc4, 0xd7, 0xd7, 0xfe, 0xde, 0xfe, 0x9c, 0x03, 0x66, 0xd4, 0x5c, + 0xb6, 0xc9, 0x14, 0xe0, 0x09, 0x99, 0x57, 0x51, 0xbf, 0xcb, 0x20, 0xfa, + 0x0b, 0x05, 0x20, 0x0a, 0xa7, 0x49, 0xd4, 0xfc, 0x9a, 0x03, 0x66, 0xfc, + 0x9a, 0x00, 0x00, 0x01, 0x00, 0x1d, 0xff, 0xec, 0x05, 0x01, 0x06, 0x15, + 0x00, 0x23, 0x00, 0x97, 0xb2, 0x0e, 0x24, 0x25, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x1a, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, + 0x22, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, + 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, + 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x22, 0x10, 0xb1, 0x00, 0x09, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, + 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x00, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x0e, 0xd0, 0xb0, 0x1f, 0x10, + 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x0e, 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x19, 0xd0, 0x30, 0x31, 0x01, + 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x03, + 0x11, 0x23, 0x35, 0x33, 0x35, 0x26, 0x23, 0x22, 0x15, 0x11, 0x21, 0x11, + 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, 0x05, 0x11, 0x33, 0x04, + 0xf6, 0xb8, 0x2e, 0x41, 0x31, 0x23, 0x55, 0x59, 0xfe, 0xd0, 0x06, 0x9f, + 0x9f, 0x3f, 0x6b, 0x94, 0xfe, 0xdf, 0xa1, 0xa1, 0x02, 0xcf, 0xbd, 0xd8, + 0x01, 0x1a, 0xb8, 0x03, 0x66, 0xfd, 0xe4, 0x3c, 0x34, 0x07, 0xdb, 0x1a, + 0x01, 0x33, 0x02, 0x47, 0xd4, 0xd6, 0x1b, 0x99, 0xfb, 0x6e, 0x03, 0x66, + 0xd4, 0x64, 0xb2, 0xc5, 0x6b, 0xfe, 0x90, 0x00, 0x00, 0x01, 0x00, 0x38, + 0xff, 0xec, 0x06, 0xa7, 0x06, 0x18, 0x00, 0x4b, 0x00, 0xe5, 0xb2, 0x45, + 0x4c, 0x4d, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x46, + 0x2f, 0x1b, 0xb1, 0x46, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x3f, 0x2f, 0x1b, 0xb1, 0x3f, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x4a, 0x2f, 0x1b, 0xb1, 0x4a, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x2c, 0x2f, 0x1b, 0xb1, 0x2c, 0x0c, 0x3e, 0x59, + 0xb0, 0x4a, 0x10, 0xb1, 0x00, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x0d, 0xd0, + 0xb0, 0x0e, 0xd0, 0xb0, 0x46, 0x10, 0xb1, 0x14, 0x09, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1d, 0x3f, 0x2c, 0x11, 0x12, + 0x39, 0xb4, 0x0b, 0x1d, 0x1b, 0x1d, 0x02, 0x5d, 0xb0, 0x3f, 0x10, 0xb1, + 0x20, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x3a, 0x2c, 0x3f, 0x11, 0x12, 0x39, 0xb0, 0x3a, 0x10, 0xb1, 0x25, 0x09, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x31, 0x2c, + 0x3f, 0x11, 0x12, 0x39, 0xb4, 0x04, 0x31, 0x14, 0x31, 0x02, 0x5d, 0xb0, + 0x2c, 0x10, 0xb1, 0x34, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x41, 0x3f, 0x20, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x11, + 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x1e, 0x02, 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, + 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x26, 0x35, 0x21, + 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x24, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x15, 0x33, 0x06, 0x9c, 0xb9, 0x37, 0x38, 0x32, 0x23, 0x55, 0x5a, 0xfe, + 0xca, 0x9b, 0x9b, 0x5b, 0x50, 0x49, 0x52, 0x1a, 0x1f, 0x1a, 0xfe, 0xdf, + 0x50, 0x55, 0x49, 0x50, 0x5b, 0xd8, 0x4a, 0xe5, 0xfe, 0xc9, 0x88, 0xd3, + 0x78, 0x01, 0x12, 0x04, 0x6a, 0x59, 0x53, 0x55, 0x69, 0x74, 0xfe, 0x7e, + 0xef, 0xc1, 0x53, 0x4e, 0x2d, 0xe4, 0xbc, 0xd9, 0xec, 0xb9, 0x03, 0x66, + 0xfd, 0xec, 0x45, 0x33, 0x07, 0xdb, 0x1a, 0x01, 0x69, 0x02, 0x11, 0xd4, + 0x59, 0x54, 0x5d, 0x51, 0x46, 0x3b, 0x62, 0x64, 0x71, 0x4a, 0x3e, 0x51, + 0x42, 0x33, 0x30, 0x3b, 0x2b, 0x1b, 0x54, 0xcf, 0x94, 0xb7, 0x61, 0xa9, + 0x62, 0x4d, 0x52, 0x3f, 0x33, 0x35, 0x3d, 0x18, 0x51, 0xf7, 0x90, 0xc1, + 0x13, 0x67, 0x4e, 0x86, 0xa2, 0xc9, 0xc2, 0x53, 0x00, 0x16, 0x00, 0x57, + 0xfe, 0x72, 0x07, 0xea, 0x05, 0xae, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x28, + 0x00, 0x37, 0x00, 0x3d, 0x00, 0x43, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x56, + 0x00, 0x5a, 0x00, 0x5e, 0x00, 0x62, 0x00, 0x66, 0x00, 0x6a, 0x00, 0x6e, + 0x00, 0x76, 0x00, 0x7a, 0x00, 0x7e, 0x00, 0x82, 0x00, 0x86, 0x00, 0x8a, + 0x00, 0x8e, 0x01, 0x41, 0x00, 0xb0, 0x3d, 0x2f, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x46, 0x2f, 0x1b, 0xb1, 0x46, 0x18, 0x3e, 0x59, 0xb2, 0x7e, 0x49, + 0x03, 0x2b, 0xb2, 0x7a, 0x7b, 0x03, 0x2b, 0xb2, 0x82, 0x77, 0x03, 0x2b, + 0xb2, 0x7f, 0x3a, 0x03, 0x2b, 0xb2, 0x0a, 0x3d, 0x46, 0x11, 0x12, 0x39, + 0xb0, 0x0a, 0x2f, 0xb0, 0x03, 0xd0, 0xb0, 0x03, 0x2f, 0xb0, 0x0e, 0xd0, + 0xb0, 0x0e, 0x2f, 0xb0, 0x0a, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x0f, 0x2f, + 0xb2, 0x50, 0x0e, 0x0f, 0x11, 0x12, 0x39, 0xb0, 0x50, 0x2f, 0xb1, 0x6f, + 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x15, + 0x50, 0x6f, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x1e, 0x04, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, + 0x25, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x0f, 0x10, 0xb0, 0x29, 0xd0, 0xb0, 0x29, 0x2f, 0xb0, 0x0e, 0x10, 0xb0, + 0x2e, 0xd0, 0xb0, 0x2e, 0x2f, 0xb1, 0x34, 0x04, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x3d, 0x10, 0xb1, 0x3c, 0x05, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x3d, 0x10, 0xb0, + 0x6b, 0xd0, 0xb0, 0x67, 0xd0, 0xb0, 0x63, 0xd0, 0xb0, 0x3e, 0xd0, 0xb0, + 0x3c, 0x10, 0xb0, 0x6c, 0xd0, 0xb0, 0x68, 0xd0, 0xb0, 0x64, 0xd0, 0xb0, + 0x3f, 0xd0, 0xb0, 0x3a, 0x10, 0xb0, 0x41, 0xd0, 0xb0, 0x46, 0x10, 0xb0, + 0x60, 0xd0, 0xb0, 0x5c, 0xd0, 0xb0, 0x58, 0xd0, 0xb0, 0x4b, 0xd0, 0xb1, + 0x4a, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x5a, 0xd0, 0xb0, 0x5e, 0xd0, 0xb0, 0x62, 0xd0, 0xb0, 0x47, 0xd0, 0xb0, + 0x49, 0x10, 0xb0, 0x4e, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x51, 0x04, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, + 0x76, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x77, 0x10, 0xb0, 0x84, 0xd0, 0xb0, 0x7a, 0x10, 0xb0, 0x85, 0xd0, 0xb0, + 0x7b, 0x10, 0xb0, 0x88, 0xd0, 0xb0, 0x7e, 0x10, 0xb0, 0x89, 0xd0, 0xb0, + 0x7f, 0x10, 0xb0, 0x8c, 0xd0, 0xb0, 0x82, 0x10, 0xb0, 0x8d, 0xd0, 0x30, + 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x13, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, + 0x16, 0x15, 0x14, 0x23, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x33, 0x11, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x33, 0x14, 0x33, 0x32, 0x36, 0x35, 0x01, 0x11, 0x33, + 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x33, 0x11, 0x01, 0x11, 0x21, + 0x15, 0x23, 0x15, 0x25, 0x35, 0x21, 0x11, 0x23, 0x35, 0x01, 0x15, 0x33, + 0x32, 0x35, 0x34, 0x27, 0x13, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, + 0x21, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, + 0x21, 0x35, 0x21, 0x15, 0x13, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x23, + 0x01, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, + 0x25, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, + 0x03, 0x35, 0x81, 0x64, 0x66, 0x80, 0x02, 0x7e, 0x68, 0x65, 0x80, 0x02, + 0x43, 0xbc, 0x62, 0x72, 0x54, 0x32, 0x34, 0xd0, 0xfe, 0x8f, 0x4a, 0x41, + 0x40, 0x4a, 0x4a, 0x42, 0x40, 0x49, 0x03, 0xba, 0x5c, 0x69, 0x52, 0x58, + 0x6d, 0x5d, 0x68, 0x29, 0x36, 0xf9, 0xc4, 0x71, 0xc4, 0x05, 0x28, 0xc7, + 0x6f, 0xf8, 0x6d, 0x01, 0x35, 0xc4, 0x05, 0xec, 0x01, 0x36, 0x6f, 0xfc, + 0x5c, 0x7e, 0x67, 0x62, 0xcb, 0x01, 0x16, 0xfd, 0x5b, 0x01, 0x15, 0xfd, + 0x5c, 0x01, 0x14, 0x02, 0x0a, 0x01, 0x16, 0xfd, 0x5b, 0x01, 0x15, 0xfd, + 0x5c, 0x01, 0x14, 0xbc, 0x5d, 0x76, 0x3a, 0x3c, 0x5d, 0xfc, 0xf1, 0x71, + 0x71, 0x71, 0x71, 0x71, 0x71, 0x07, 0x22, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, + 0x6f, 0x01, 0xd4, 0x62, 0x79, 0x78, 0x5e, 0x75, 0x5f, 0x7c, 0x78, 0x5e, + 0xfe, 0xb3, 0x02, 0x25, 0x49, 0x4d, 0x54, 0x20, 0x0d, 0x46, 0x2d, 0x9b, + 0x01, 0x48, 0x45, 0x4e, 0x4e, 0x45, 0x70, 0x45, 0x4e, 0x4e, 0x45, 0x01, + 0x4f, 0xfe, 0x86, 0x4e, 0x5d, 0x51, 0x53, 0x5b, 0x36, 0x2c, 0xfc, 0xc9, + 0x01, 0x3b, 0xca, 0x71, 0x71, 0xca, 0xfe, 0xc5, 0x06, 0x1f, 0x01, 0x1d, + 0x74, 0xa9, 0xa9, 0x74, 0xfe, 0xe3, 0xa9, 0xfc, 0xb6, 0xa9, 0x53, 0x52, + 0x04, 0x03, 0x4a, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0xf9, 0x38, 0x71, + 0x71, 0x71, 0x71, 0x71, 0x71, 0x03, 0xc4, 0x50, 0x29, 0x1e, 0xfe, 0xd3, + 0xfc, 0x7e, 0xfa, 0xfc, 0x15, 0xf9, 0x7e, 0xfc, 0x7e, 0xfa, 0xfc, 0x15, + 0xf9, 0x00, 0x00, 0x05, 0x00, 0x5c, 0xfd, 0xd5, 0x07, 0xd7, 0x08, 0x73, + 0x00, 0x03, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x58, + 0x00, 0xb0, 0x21, 0x2f, 0xb0, 0x25, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, 0x00, + 0x2f, 0xb0, 0x21, 0x10, 0xb0, 0x02, 0xd0, 0xb0, 0x02, 0x2f, 0xb2, 0x1f, + 0x02, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x2f, 0xb2, 0x20, 0x1f, 0x01, + 0x5d, 0xb0, 0x1e, 0xd0, 0xb0, 0x1e, 0x2f, 0xb0, 0x1c, 0xd0, 0xb0, 0x1c, + 0x2f, 0xb2, 0x0d, 0x00, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x2f, 0xb2, + 0x07, 0x1c, 0x0d, 0x11, 0x12, 0x39, 0xb2, 0x11, 0x0d, 0x1c, 0x11, 0x12, + 0x39, 0xb0, 0x14, 0xd0, 0xb0, 0x14, 0x2f, 0xb2, 0x19, 0x1c, 0x0d, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x09, 0x03, 0x05, 0x34, 0x36, 0x37, 0x36, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x33, 0x36, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x14, 0x07, 0x06, 0x06, 0x15, 0x17, 0x23, 0x15, 0x33, 0x03, + 0x33, 0x15, 0x23, 0x03, 0x33, 0x15, 0x23, 0x04, 0x18, 0x03, 0xbf, 0xfc, + 0x41, 0xfc, 0x44, 0x04, 0x0f, 0x1e, 0x24, 0x4a, 0x5c, 0xa7, 0x95, 0x90, + 0xa0, 0x02, 0xcb, 0x02, 0x3a, 0x2b, 0x39, 0x38, 0x5d, 0x5b, 0x2f, 0xca, + 0xca, 0xca, 0x4b, 0x04, 0x04, 0x02, 0x04, 0x04, 0x06, 0x52, 0xfc, 0x31, + 0xfc, 0x31, 0x03, 0xcf, 0xf1, 0x3a, 0x3a, 0x18, 0x27, 0x87, 0x4a, 0x80, + 0x97, 0x8b, 0x7f, 0x33, 0x34, 0x40, 0x34, 0x5f, 0x3c, 0x41, 0x5c, 0x4c, + 0x5b, 0xaa, 0xfd, 0x4c, 0x04, 0x0a, 0x9e, 0x04, 0x00, 0x01, 0x00, 0x37, + 0x00, 0x00, 0x02, 0xb5, 0x03, 0x20, 0x00, 0x17, 0x00, 0x5b, 0xb2, 0x08, + 0x18, 0x19, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, + 0x2f, 0x1b, 0xb1, 0x0f, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb1, 0x16, 0x02, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x00, 0x16, + 0x11, 0x12, 0x39, 0xb2, 0x15, 0x16, 0x0f, 0x11, 0x12, 0x39, 0xb2, 0x03, + 0x0f, 0x15, 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x10, 0xb1, 0x08, 0x02, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0c, 0x00, 0x0f, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x21, 0x21, 0x35, 0x01, 0x36, 0x36, 0x35, + 0x34, 0x23, 0x22, 0x06, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x14, 0x06, 0x07, 0x07, 0x21, 0x02, 0xb5, 0xfd, 0x94, 0x01, 0x1f, 0x38, + 0x31, 0x5f, 0x32, 0x3b, 0xce, 0xab, 0x87, 0x94, 0xa1, 0x48, 0x6c, 0x94, + 0x01, 0x5f, 0x8a, 0x01, 0x01, 0x31, 0x54, 0x17, 0x54, 0x3e, 0x2f, 0x74, + 0x9e, 0x81, 0x77, 0x46, 0x74, 0x57, 0x73, 0x00, 0x00, 0x01, 0x00, 0x87, + 0x00, 0x00, 0x02, 0x10, 0x03, 0x12, 0x00, 0x06, 0x00, 0x36, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x12, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, + 0x59, 0xb2, 0x04, 0x05, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, + 0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x02, 0xd0, 0x30, 0x31, 0x21, 0x23, 0x11, 0x07, 0x35, 0x25, 0x33, 0x02, + 0x10, 0xcc, 0xbd, 0x01, 0x76, 0x13, 0x02, 0x24, 0x29, 0x9e, 0x79, 0x00, + 0x00, 0x02, 0x00, 0x47, 0xff, 0xf5, 0x02, 0xb2, 0x03, 0x20, 0x00, 0x0d, + 0x00, 0x18, 0x00, 0x48, 0xb2, 0x03, 0x19, 0x1a, 0x11, 0x12, 0x39, 0xb0, + 0x03, 0x10, 0xb0, 0x10, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, + 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x03, 0x10, 0xb1, 0x16, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x27, 0x34, 0x23, 0x22, 0x07, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x37, 0x02, 0xb2, 0xa1, 0x93, 0x95, 0xa0, 0x02, + 0xa4, 0x91, 0x92, 0xa4, 0xcc, 0x6a, 0x63, 0x04, 0x37, 0x32, 0x65, 0x03, + 0x01, 0x36, 0x9a, 0xa7, 0xa6, 0x93, 0xad, 0x9b, 0xaa, 0xac, 0x99, 0x09, + 0x96, 0x87, 0xc5, 0x54, 0x41, 0x8a, 0x00, 0x02, 0x00, 0x48, 0xff, 0xf0, + 0x03, 0xd0, 0x04, 0x9d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x67, 0xb2, 0x16, + 0x22, 0x23, 0x11, 0x12, 0x39, 0xb0, 0x16, 0x10, 0xb0, 0x09, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, + 0x3e, 0x59, 0xb2, 0x16, 0x09, 0x10, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x16, + 0x2f, 0x18, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x00, 0x02, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x10, + 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x09, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x10, 0x00, 0x05, 0x23, 0x35, + 0x32, 0x36, 0x36, 0x27, 0x32, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x15, 0x14, 0x16, 0x02, 0xaa, 0x61, 0x7f, 0xb8, 0xca, 0x74, 0xd0, 0x80, + 0xd4, 0xf0, 0xfe, 0xbc, 0xfe, 0xb4, 0x21, 0x97, 0x93, 0x55, 0x88, 0x66, + 0x33, 0x59, 0x4a, 0x49, 0x5a, 0x56, 0x01, 0xc4, 0x50, 0xcb, 0xb9, 0x72, + 0xc3, 0x70, 0xfb, 0xe4, 0x4d, 0xfe, 0xc1, 0xfe, 0xc1, 0x03, 0xe6, 0x2f, + 0x68, 0xde, 0x42, 0x6c, 0x63, 0x58, 0x6c, 0x53, 0x4f, 0x5b, 0x00, 0x03, + 0x00, 0x4f, 0xff, 0xf0, 0x03, 0xd8, 0x04, 0x9d, 0x00, 0x15, 0x00, 0x20, + 0x00, 0x2a, 0x00, 0x83, 0xb2, 0x08, 0x2b, 0x2c, 0x11, 0x12, 0x39, 0xb0, + 0x08, 0x10, 0xb0, 0x19, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x28, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, + 0x3e, 0x59, 0xb2, 0x28, 0x08, 0x13, 0x11, 0x12, 0x39, 0xb0, 0x28, 0x2f, + 0xb4, 0x6f, 0x28, 0x7f, 0x28, 0x02, 0x5d, 0xb2, 0xff, 0x28, 0x01, 0x5d, + 0xb2, 0x0f, 0x28, 0x01, 0x71, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x19, 0x28, 0x11, 0x12, 0x39, + 0xb2, 0x0e, 0x28, 0x19, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb1, 0x1e, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x13, + 0x10, 0xb1, 0x23, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x14, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, + 0x03, 0x34, 0x23, 0x22, 0x06, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0xbc, + 0xa5, 0x5a, 0x67, 0xf1, 0xd3, 0xd2, 0xf3, 0x68, 0x5a, 0xa7, 0xe3, 0xc5, + 0xc6, 0xe4, 0xfe, 0xfb, 0x5b, 0x4a, 0x48, 0x5a, 0x5a, 0x94, 0x59, 0x1c, + 0x89, 0x40, 0x46, 0x46, 0x42, 0x43, 0x44, 0x03, 0x53, 0xa8, 0x53, 0x29, + 0x8d, 0x61, 0x9e, 0xb3, 0xb4, 0x9d, 0x62, 0x8d, 0x28, 0x56, 0xa5, 0x97, + 0xb3, 0xb1, 0xfd, 0x71, 0x3f, 0x41, 0x41, 0x3f, 0x3e, 0x47, 0x47, 0x02, + 0x22, 0x73, 0x3c, 0x6e, 0x44, 0x44, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, + 0x03, 0xdb, 0x04, 0x8d, 0x00, 0x06, 0x00, 0x3a, 0xb2, 0x01, 0x07, 0x08, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, + 0xb1, 0x05, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, + 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x03, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x05, + 0x03, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x01, 0x21, 0x01, 0x21, 0x35, + 0x21, 0x03, 0xdb, 0xfe, 0x11, 0xfe, 0xcf, 0x01, 0xf0, 0xfd, 0x86, 0x03, + 0xaa, 0x03, 0xea, 0xfc, 0x16, 0x03, 0xa3, 0xea, 0x00, 0x02, 0x00, 0x4f, + 0xff, 0xf0, 0x03, 0xf0, 0x04, 0xa2, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x5e, + 0xb2, 0x14, 0x20, 0x21, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x10, 0xb0, 0x0c, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x00, 0x0c, 0x11, + 0x12, 0x39, 0xb0, 0x06, 0x2f, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x1a, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x15, + 0x22, 0x06, 0x07, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x35, 0x10, 0x00, 0x21, 0x03, 0x22, 0x06, 0x07, 0x15, 0x14, + 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x03, 0x26, 0xd4, 0xc5, 0x17, 0x67, + 0x9f, 0xad, 0xc7, 0xff, 0xc5, 0xe1, 0xfc, 0x01, 0x66, 0x01, 0x4f, 0xe2, + 0x41, 0x5b, 0x16, 0xb4, 0x4b, 0x60, 0x5c, 0x04, 0xa2, 0xed, 0x83, 0x8e, + 0x65, 0xd2, 0xb4, 0xaf, 0xe4, 0xf9, 0xe3, 0x49, 0x01, 0x36, 0x01, 0x57, + 0xfd, 0x81, 0x32, 0x1f, 0x36, 0xc5, 0x64, 0x4a, 0x4f, 0x4f, 0x00, 0x01, + 0x00, 0x4f, 0xff, 0xf0, 0x03, 0xda, 0x04, 0x8d, 0x00, 0x1a, 0x00, 0x6d, + 0xb2, 0x0c, 0x1b, 0x1c, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x01, + 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x07, 0x01, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb1, + 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x05, 0x07, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x10, 0xb1, 0x12, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x10, 0x12, + 0x17, 0x11, 0x12, 0x39, 0xb2, 0x1a, 0x17, 0x12, 0x11, 0x12, 0x39, 0x30, + 0x31, 0x13, 0x13, 0x21, 0x15, 0x21, 0x07, 0x36, 0x33, 0x32, 0x16, 0x10, + 0x06, 0x23, 0x22, 0x24, 0x27, 0x21, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x07, 0x07, 0x6b, 0x4f, 0x02, 0xdf, 0xfe, 0x0d, 0x1f, 0x6e, + 0x56, 0xc2, 0xcd, 0xf6, 0xce, 0xbd, 0xfe, 0xfa, 0x04, 0x01, 0x21, 0x07, + 0x9f, 0xa2, 0x5c, 0x5e, 0x5c, 0x3b, 0x15, 0x02, 0x35, 0x02, 0x58, 0xe7, + 0xd0, 0x28, 0xc5, 0xfe, 0x98, 0xe1, 0xc3, 0x95, 0x70, 0xaf, 0x4f, 0x5f, + 0x2a, 0x0f, 0x00, 0x02, 0x00, 0x33, 0x00, 0x00, 0x03, 0xf3, 0x04, 0x8d, + 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x57, 0xb2, 0x0e, 0x0f, 0x10, 0x11, 0x12, + 0x39, 0xb0, 0x0e, 0x10, 0xb0, 0x09, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x01, + 0x09, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x2f, 0xb1, 0x02, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb2, + 0x08, 0x04, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x0b, 0xd0, + 0xb2, 0x0d, 0x09, 0x04, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x33, 0x15, + 0x23, 0x15, 0x21, 0x35, 0x21, 0x27, 0x01, 0x21, 0x01, 0x33, 0x11, 0x07, + 0x03, 0x69, 0x8a, 0x8a, 0xfe, 0xdf, 0xfd, 0xfb, 0x10, 0x02, 0x15, 0x01, + 0x21, 0xfd, 0xe1, 0xfe, 0x12, 0x01, 0xd9, 0xea, 0xef, 0xef, 0xbd, 0x02, + 0xe1, 0xfd, 0x4c, 0x01, 0x4a, 0x1c, 0x00, 0x01, 0x00, 0x2f, 0xff, 0xf0, + 0x03, 0xd9, 0x04, 0x9d, 0x00, 0x26, 0x00, 0x83, 0xb2, 0x20, 0x27, 0x28, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, + 0xb1, 0x0e, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, + 0x1b, 0xb1, 0x19, 0x0c, 0x3e, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x01, 0x2f, + 0xb2, 0x6f, 0x01, 0x01, 0x5d, 0xb2, 0xff, 0x01, 0x01, 0x5d, 0xb2, 0x1f, + 0x01, 0x01, 0x5d, 0xb2, 0x8f, 0x01, 0x01, 0x71, 0xb0, 0x0e, 0x10, 0xb1, + 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x0e, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x01, 0x10, 0xb1, 0x25, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x25, 0x01, + 0x11, 0x12, 0x39, 0xb0, 0x19, 0x10, 0xb0, 0x1d, 0xd0, 0xb2, 0x04, 0x1d, + 0x01, 0x5d, 0xb0, 0x19, 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x07, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, 0x35, + 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x01, 0x72, + 0x82, 0x5a, 0x55, 0x56, 0x4d, 0x45, 0x58, 0xfe, 0xdf, 0xf4, 0xc2, 0xd6, + 0xf6, 0x6a, 0x5d, 0xdc, 0xfe, 0xf6, 0xd7, 0xce, 0xfb, 0x01, 0x22, 0x6a, + 0x4d, 0x54, 0x5c, 0xc0, 0x86, 0x02, 0xb3, 0x4b, 0x3d, 0x39, 0x40, 0x35, + 0x2c, 0x94, 0xb6, 0xb1, 0x9d, 0x58, 0x7f, 0x23, 0x3d, 0xd2, 0x9b, 0xbb, + 0xc2, 0xa5, 0x38, 0x47, 0x4b, 0x3e, 0x8e, 0x01, 0x00, 0x01, 0x00, 0x38, + 0x00, 0x00, 0x03, 0xe0, 0x04, 0x9d, 0x00, 0x18, 0x00, 0x56, 0xb2, 0x09, + 0x19, 0x1a, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, + 0x2f, 0x1b, 0xb1, 0x10, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb1, 0x17, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0xd0, 0xb2, + 0x03, 0x10, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x10, 0xb1, 0x09, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, + 0xb0, 0x0c, 0xd0, 0xb2, 0x16, 0x00, 0x10, 0x11, 0x12, 0x39, 0x30, 0x31, + 0x21, 0x21, 0x35, 0x01, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x15, 0x21, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x07, + 0x21, 0x03, 0xe0, 0xfc, 0x73, 0x01, 0xa6, 0x57, 0x4a, 0x4b, 0x4a, 0x50, + 0x5b, 0xfe, 0xde, 0xfe, 0xc4, 0xd4, 0xee, 0x7f, 0xb9, 0xb8, 0x02, 0x14, + 0xc3, 0x01, 0x80, 0x4c, 0x7d, 0x26, 0x3b, 0x47, 0x5d, 0x4b, 0xaf, 0xe2, + 0xbe, 0xac, 0x6c, 0xba, 0x93, 0x92, 0x00, 0x01, 0x00, 0x95, 0x00, 0x00, + 0x02, 0xe5, 0x04, 0x8a, 0x00, 0x06, 0x00, 0x41, 0xb2, 0x01, 0x07, 0x08, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, + 0xb1, 0x05, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x04, 0x00, 0x05, 0x11, 0x12, + 0x39, 0xb0, 0x04, 0x2f, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x03, 0x05, 0x11, 0x12, 0x39, 0x30, + 0x31, 0x21, 0x21, 0x11, 0x05, 0x35, 0x25, 0x33, 0x02, 0xe5, 0xfe, 0xdf, + 0xfe, 0xd1, 0x02, 0x34, 0x1c, 0x03, 0x38, 0x44, 0xe1, 0xb5, 0x00, 0x02, + 0x00, 0x4f, 0xff, 0xf0, 0x03, 0xd8, 0x04, 0x9d, 0x00, 0x0d, 0x00, 0x19, + 0x00, 0x48, 0xb2, 0x03, 0x1a, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, + 0xb0, 0x16, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, + 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, + 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x10, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, + 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x17, 0x25, 0x34, 0x23, 0x22, 0x07, 0x11, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x03, 0xd8, 0xec, 0xd8, 0xd7, 0xec, 0x02, 0xed, + 0xd6, 0xd5, 0xef, 0x02, 0xfe, 0xde, 0xa4, 0x9d, 0x05, 0x4e, 0x56, 0x53, + 0x4e, 0x01, 0x01, 0xcf, 0xe5, 0xfa, 0xf6, 0xe1, 0xf3, 0xe6, 0xfd, 0xfa, + 0xe2, 0x08, 0xea, 0xd9, 0xfe, 0xe8, 0x75, 0x75, 0x6f, 0x74, 0x00, 0x01, + 0x00, 0x37, 0x00, 0x00, 0x04, 0x04, 0x04, 0x8d, 0x00, 0x09, 0x00, 0x46, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x00, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x07, + 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x09, 0x05, 0x07, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, 0x21, + 0x15, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0xb6, 0x02, 0x4e, + 0xfc, 0x36, 0x02, 0x4a, 0xfd, 0xb3, 0x03, 0xc4, 0xe8, 0xe8, 0x98, 0x03, + 0x0b, 0xea, 0x95, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x04, 0x4f, + 0x04, 0x8d, 0x00, 0x08, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x00, + 0x01, 0x04, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x13, 0x21, 0x01, 0x11, + 0x21, 0x11, 0x01, 0x21, 0x02, 0x26, 0xef, 0x01, 0x3a, 0xfe, 0x65, 0xfe, + 0xde, 0xfe, 0x6d, 0x01, 0x38, 0x02, 0x9e, 0x01, 0xef, 0xfd, 0x09, 0xfe, + 0x6a, 0x01, 0xa2, 0x02, 0xeb, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, + 0x04, 0x5c, 0x04, 0x8d, 0x00, 0x0b, 0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, + 0x59, 0xb2, 0x00, 0x01, 0x04, 0x11, 0x12, 0x39, 0xb2, 0x06, 0x01, 0x04, + 0x11, 0x12, 0x39, 0xb2, 0x03, 0x00, 0x06, 0x11, 0x12, 0x39, 0xb2, 0x09, + 0x06, 0x00, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x13, 0x21, 0x01, 0x01, + 0x21, 0x03, 0x03, 0x21, 0x01, 0x01, 0x21, 0x02, 0x24, 0xce, 0x01, 0x4e, + 0xfe, 0x9a, 0x01, 0x82, 0xfe, 0xaa, 0xde, 0xd7, 0xfe, 0xb2, 0x01, 0x70, + 0xfe, 0x9a, 0x01, 0x4b, 0x03, 0x15, 0x01, 0x78, 0xfd, 0xbe, 0xfd, 0xb5, + 0x01, 0x7e, 0xfe, 0x82, 0x02, 0x4b, 0x02, 0x42, 0x00, 0x01, 0x00, 0x1f, + 0x00, 0x00, 0x05, 0xdb, 0x04, 0x8d, 0x00, 0x0c, 0x00, 0x60, 0xb2, 0x05, + 0x0d, 0x0e, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, + 0x2f, 0x1b, 0xb1, 0x09, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb2, + 0x00, 0x03, 0x01, 0x11, 0x12, 0x39, 0xb2, 0x05, 0x01, 0x06, 0x11, 0x12, + 0x39, 0xb2, 0x0a, 0x06, 0x09, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x13, + 0x21, 0x01, 0x21, 0x03, 0x03, 0x21, 0x01, 0x21, 0x13, 0x13, 0x33, 0x04, + 0x31, 0x94, 0x01, 0x16, 0xfe, 0xf3, 0xfe, 0xe0, 0xb2, 0xaf, 0xfe, 0xe0, + 0xfe, 0xf2, 0x01, 0x17, 0x94, 0xb4, 0xfe, 0x01, 0x74, 0x03, 0x19, 0xfb, + 0x73, 0x02, 0xdf, 0xfd, 0x21, 0x04, 0x8d, 0xfc, 0xe3, 0x03, 0x1d, 0x00, + 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x04, 0x89, 0x04, 0x8d, 0x00, 0x08, + 0x00, 0x31, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, + 0x03, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, + 0xb1, 0x07, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, + 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x03, 0x05, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x01, 0x17, 0x37, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, + 0x02, 0x37, 0x0b, 0x0b, 0x01, 0x0c, 0x01, 0x30, 0xfe, 0x56, 0xfe, 0xc8, + 0xfe, 0x58, 0x01, 0x2f, 0x01, 0x40, 0x37, 0x34, 0x03, 0x50, 0xfb, 0x73, + 0x04, 0x8d, 0x00, 0x01, 0x00, 0x5d, 0xff, 0xf0, 0x04, 0x30, 0x04, 0x8d, + 0x00, 0x10, 0x00, 0x36, 0xb2, 0x04, 0x11, 0x12, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x10, 0xd0, 0x30, 0x31, 0x01, 0x11, + 0x14, 0x04, 0x23, 0x22, 0x24, 0x35, 0x11, 0x21, 0x11, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x11, 0x04, 0x30, 0xfe, 0xfe, 0xe6, 0xe5, 0xfe, 0xfa, 0x01, + 0x22, 0x06, 0xc3, 0x61, 0x65, 0x04, 0x8d, 0xfd, 0x0e, 0xc7, 0xe4, 0xe4, + 0xc6, 0x02, 0xf3, 0xfc, 0xff, 0xb4, 0x5a, 0x67, 0x02, 0xf4, 0x00, 0x01, + 0x00, 0x20, 0x00, 0x00, 0x04, 0x2f, 0x04, 0x8d, 0x00, 0x07, 0x00, 0x2f, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x0c, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0x30, 0x31, 0x01, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, 0x2f, 0xfe, 0x86, 0xfe, + 0xde, 0xfe, 0x8d, 0x04, 0x0f, 0x03, 0xa3, 0xfc, 0x5d, 0x03, 0xa3, 0xea, + 0x00, 0x01, 0x00, 0x3a, 0xff, 0xf0, 0x04, 0x01, 0x04, 0x9d, 0x00, 0x26, + 0x00, 0x6c, 0xb2, 0x11, 0x27, 0x28, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x0c, 0x3e, 0x59, + 0xb2, 0x03, 0x1c, 0x0a, 0x11, 0x12, 0x39, 0xb2, 0x0e, 0x1c, 0x0a, 0x11, + 0x12, 0x39, 0xb2, 0x09, 0x0e, 0x01, 0x5d, 0xb2, 0x56, 0x0e, 0x01, 0x5d, + 0xb0, 0x0a, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x15, 0xd0, 0xb2, 0x21, 0x1c, + 0x0a, 0x11, 0x12, 0x39, 0xb2, 0x06, 0x21, 0x01, 0x5d, 0xb0, 0x1c, 0x10, + 0xb1, 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x34, 0x2e, 0x04, 0x35, 0x34, 0x36, 0x33, 0x32, 0x04, + 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x14, 0x16, 0x17, 0x16, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x26, 0x35, 0x21, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x02, 0xeb, 0x62, 0xec, 0xa1, 0x68, 0x32, 0xfa, 0xc5, 0xd7, + 0x01, 0x09, 0xfe, 0xdf, 0x67, 0x57, 0x4d, 0x60, 0x64, 0x74, 0xe9, 0xc9, + 0xf6, 0xd5, 0x91, 0xea, 0x7f, 0x01, 0x22, 0x73, 0x73, 0x4e, 0x5b, 0x01, + 0x39, 0x3a, 0x46, 0x38, 0x3f, 0x56, 0x71, 0x4e, 0x96, 0xc2, 0xc3, 0xa9, + 0x40, 0x56, 0x44, 0x66, 0x3f, 0x1d, 0x33, 0xb4, 0x99, 0x9c, 0xb5, 0x5e, + 0xae, 0x77, 0x5d, 0x52, 0x40, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x4c, 0x04, 0x8d, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x60, 0xb2, 0x00, + 0x16, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x14, 0xd0, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, + 0xb2, 0x10, 0x04, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x2f, 0xb1, 0x00, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0b, + 0x00, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb1, 0x14, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, + 0x11, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x01, 0x15, + 0x21, 0x01, 0x33, 0x32, 0x35, 0x34, 0x23, 0x23, 0x02, 0x3a, 0xb5, 0xfe, + 0xde, 0x01, 0xe6, 0xde, 0xf8, 0x67, 0x74, 0x01, 0x08, 0xfe, 0xc8, 0xfe, + 0x71, 0xc4, 0xb5, 0xbd, 0xbc, 0x01, 0x92, 0xfe, 0x6e, 0x04, 0x8d, 0xb7, + 0xa7, 0x7c, 0xa1, 0x33, 0xfe, 0x2d, 0x0c, 0x02, 0x7b, 0x95, 0x93, 0x00, + 0x00, 0x02, 0x00, 0x41, 0xff, 0x29, 0x04, 0x7f, 0x04, 0x9d, 0x00, 0x14, + 0x00, 0x22, 0x00, 0x48, 0xb2, 0x10, 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, + 0x10, 0x10, 0xb0, 0x18, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, + 0x2f, 0x1b, 0xb1, 0x10, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x10, 0x10, 0xb1, + 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x08, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x17, 0x07, 0x25, 0x06, + 0x23, 0x22, 0x00, 0x11, 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x16, 0x12, + 0x17, 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x04, 0x7f, 0x6f, 0x61, 0xc4, 0xb4, 0xfe, 0xf5, 0x29, + 0x2a, 0xf3, 0xfe, 0xd3, 0x86, 0xf8, 0xa1, 0x9e, 0xf7, 0x89, 0x01, 0xfe, + 0xdf, 0x86, 0x78, 0x7c, 0x82, 0x87, 0x78, 0x76, 0x87, 0x02, 0x2f, 0x9f, + 0xee, 0x4a, 0x93, 0x9c, 0xcd, 0x06, 0x01, 0x38, 0x01, 0x0d, 0x27, 0xac, + 0x01, 0x06, 0x8f, 0x8c, 0xfe, 0xfb, 0xaa, 0x05, 0xa6, 0xb2, 0xb2, 0xa6, + 0x2e, 0xa5, 0xb4, 0xb4, 0xa8, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x35, 0x04, 0x8d, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x4f, 0xb2, 0x0b, + 0x15, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x0b, 0x10, 0xb0, 0x0d, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, + 0x3e, 0x59, 0xb2, 0x0c, 0x03, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x2f, + 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x03, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, 0x16, + 0x16, 0x15, 0x14, 0x04, 0x23, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x27, 0x23, 0x01, 0x85, 0xfe, 0xde, 0x01, 0xf1, 0x8e, 0xdc, 0x77, 0xfe, + 0xfa, 0xe0, 0xca, 0xcf, 0x5c, 0x65, 0x65, 0x59, 0xd2, 0x01, 0x7f, 0xfe, + 0x81, 0x04, 0x8d, 0x65, 0xba, 0x75, 0xad, 0xcd, 0xe9, 0x4c, 0x43, 0x4d, + 0x5e, 0x01, 0x00, 0x02, 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, 0x04, 0x9d, + 0x00, 0x11, 0x00, 0x1f, 0x00, 0x48, 0xb2, 0x04, 0x20, 0x21, 0x11, 0x12, + 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x15, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x0d, + 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x06, 0x23, 0x22, + 0x26, 0x02, 0x27, 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x16, 0x12, 0x17, + 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x04, 0x7e, 0x86, 0xf9, 0x9e, 0x9f, 0xf9, 0x88, 0x01, 0x86, + 0xf8, 0xa1, 0x9e, 0xf7, 0x89, 0x01, 0xfe, 0xde, 0x85, 0x78, 0x7c, 0x81, + 0x84, 0x7b, 0x74, 0x87, 0x02, 0x2f, 0xab, 0xfe, 0xfa, 0x8e, 0x8c, 0x01, + 0x03, 0xa9, 0x34, 0xac, 0x01, 0x06, 0x8f, 0x8c, 0xfe, 0xfb, 0xaa, 0x05, + 0xa6, 0xb2, 0xb2, 0xa6, 0x2e, 0xa3, 0xb6, 0xb4, 0xa8, 0x00, 0x00, 0x01, + 0x00, 0x63, 0x00, 0x00, 0x04, 0x72, 0x04, 0x8d, 0x00, 0x09, 0x00, 0x45, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, + 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, + 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb2, 0x02, 0x05, 0x00, 0x11, 0x12, 0x39, + 0xb2, 0x07, 0x05, 0x00, 0x11, 0x12, 0x39, 0x30, 0x31, 0x21, 0x21, 0x01, + 0x11, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, 0x04, 0x72, 0xfe, 0xdf, 0xfe, + 0x34, 0xfe, 0xde, 0x01, 0x22, 0x01, 0xcc, 0x01, 0x21, 0x02, 0xd6, 0xfd, + 0x2a, 0x04, 0x8d, 0xfd, 0x29, 0x02, 0xd7, 0x00, 0x00, 0x01, 0x00, 0x63, + 0x00, 0x00, 0x05, 0xa3, 0x04, 0x8d, 0x00, 0x0e, 0x00, 0x60, 0xb2, 0x01, + 0x0f, 0x10, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, + 0x01, 0x00, 0x04, 0x11, 0x12, 0x39, 0xb2, 0x07, 0x00, 0x04, 0x11, 0x12, + 0x39, 0xb2, 0x0a, 0x00, 0x04, 0x11, 0x12, 0x39, 0x30, 0x31, 0x09, 0x02, + 0x21, 0x11, 0x21, 0x35, 0x13, 0x01, 0x23, 0x01, 0x13, 0x15, 0x21, 0x11, + 0x01, 0xe0, 0x01, 0x23, 0x01, 0x21, 0x01, 0x7f, 0xfe, 0xdd, 0x1e, 0xfe, + 0xc5, 0xc1, 0xfe, 0xc6, 0x1e, 0xfe, 0xdd, 0x04, 0x8d, 0xfc, 0xef, 0x03, + 0x11, 0xfb, 0x73, 0xec, 0x02, 0x64, 0xfc, 0xb0, 0x03, 0x4d, 0xfd, 0x9f, + 0xec, 0x04, 0x8d, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x03, 0x98, + 0x04, 0x8d, 0x00, 0x05, 0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, + 0x21, 0x15, 0x21, 0x11, 0x21, 0x01, 0x85, 0x02, 0x13, 0xfc, 0xcb, 0x01, + 0x22, 0xe8, 0xe8, 0x04, 0x8d, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x75, 0x04, 0x8d, 0x00, 0x0c, 0x00, 0x4c, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, + 0x59, 0xb2, 0x00, 0x02, 0x08, 0x11, 0x12, 0x39, 0xb2, 0x06, 0x02, 0x04, + 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x02, 0x08, 0x11, 0x12, 0x39, 0x30, 0x31, + 0x01, 0x07, 0x11, 0x21, 0x11, 0x21, 0x11, 0x37, 0x01, 0x21, 0x01, 0x01, + 0x21, 0x02, 0x04, 0x7f, 0xfe, 0xde, 0x01, 0x22, 0x62, 0x01, 0x19, 0x01, + 0x6a, 0xfe, 0x5e, 0x01, 0xad, 0xfe, 0xaa, 0x01, 0xb3, 0x7d, 0xfe, 0xca, + 0x04, 0x8d, 0xfe, 0x1a, 0x84, 0x01, 0x62, 0xfd, 0xf5, 0xfd, 0x7e, 0x00, + 0x00, 0x01, 0x00, 0x20, 0xff, 0xf0, 0x03, 0x79, 0x04, 0x8d, 0x00, 0x0d, + 0x00, 0x30, 0xb2, 0x05, 0x0e, 0x0f, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, + 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x21, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x21, + 0x14, 0x33, 0x32, 0x37, 0x02, 0x57, 0x01, 0x22, 0xeb, 0xb9, 0xd2, 0xe3, + 0x01, 0x22, 0x93, 0x80, 0x02, 0x04, 0x8d, 0xfc, 0xfd, 0xb8, 0xe2, 0xc9, + 0xbb, 0x9c, 0xab, 0x00, 0x00, 0x01, 0x00, 0x76, 0x00, 0x00, 0x01, 0x98, + 0x04, 0x8d, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0x30, 0x31, 0x21, + 0x21, 0x11, 0x21, 0x01, 0x98, 0xfe, 0xde, 0x01, 0x22, 0x04, 0x8d, 0x00, + 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x04, 0x73, 0x04, 0x8d, 0x00, 0x0b, + 0x00, 0x62, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, + 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, + 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x09, 0x00, 0x0a, 0x11, + 0x12, 0x39, 0x7c, 0xb0, 0x09, 0x2f, 0x18, 0xb4, 0x40, 0x09, 0x50, 0x09, + 0x02, 0x71, 0xb2, 0xc0, 0x09, 0x01, 0x5d, 0xb4, 0x30, 0x09, 0x40, 0x09, + 0x02, 0x5d, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x04, 0x73, 0xfe, 0xdf, 0xfe, 0x33, 0xfe, 0xde, + 0x01, 0x22, 0x01, 0xcd, 0x01, 0x21, 0x01, 0xc6, 0xfe, 0x3a, 0x04, 0x8d, + 0xfe, 0x22, 0x01, 0xde, 0x00, 0x01, 0x00, 0x49, 0xff, 0xf0, 0x04, 0x5b, + 0x04, 0x9d, 0x00, 0x1e, 0x00, 0x6b, 0xb2, 0x1c, 0x1f, 0x20, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, + 0x03, 0x0c, 0x3e, 0x59, 0xb2, 0x0e, 0x0a, 0x03, 0x11, 0x12, 0x39, 0xb2, + 0x0b, 0x0e, 0x01, 0x5d, 0xb0, 0x0a, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1d, + 0x0a, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x1d, 0x2f, 0xb4, 0x8f, 0x1d, 0x9f, + 0x1d, 0x02, 0x5d, 0xb1, 0x1c, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, 0x04, 0x23, 0x22, 0x00, 0x03, + 0x35, 0x10, 0x00, 0x33, 0x32, 0x04, 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x35, 0x23, 0x35, 0x21, + 0x04, 0x5b, 0x44, 0xfe, 0xfb, 0xa4, 0xfa, 0xfe, 0xda, 0x05, 0x01, 0x20, + 0xf4, 0xe6, 0x01, 0x00, 0x17, 0xfe, 0xe9, 0x0e, 0x63, 0x6b, 0x78, 0x83, + 0x01, 0x8a, 0x8c, 0x7e, 0x39, 0xe0, 0x02, 0x03, 0x8d, 0x47, 0x56, 0x01, + 0x25, 0x01, 0x01, 0x4e, 0x01, 0x08, 0x01, 0x31, 0xca, 0xca, 0x55, 0x56, + 0xa6, 0xa3, 0x44, 0xab, 0xa4, 0x2a, 0xa6, 0xcd, 0x00, 0x01, 0x00, 0x63, + 0x00, 0x00, 0x03, 0xa3, 0x04, 0x8d, 0x00, 0x09, 0x00, 0x4e, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, + 0x59, 0xb2, 0x09, 0x02, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x2f, 0xb4, + 0x6c, 0x09, 0x7c, 0x09, 0x02, 0x5d, 0xb2, 0x39, 0x09, 0x01, 0x5d, 0xb1, + 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x04, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, + 0x15, 0x21, 0x03, 0x6e, 0xfe, 0x17, 0xfe, 0xde, 0x03, 0x40, 0xfd, 0xe2, + 0x01, 0xe9, 0x01, 0xc6, 0xfe, 0x3a, 0x04, 0x8d, 0xea, 0xf4, 0x00, 0x01, + 0x00, 0x3a, 0xff, 0x13, 0x04, 0x01, 0x05, 0x73, 0x00, 0x2b, 0x00, 0x79, + 0xb2, 0x14, 0x2c, 0x2d, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x0c, 0x3e, 0x59, 0xb2, + 0x03, 0x22, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb0, 0x0d, 0xd0, + 0xb0, 0x0a, 0x10, 0xb1, 0x14, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x19, 0x09, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x11, 0x14, 0x19, 0x11, 0x12, + 0x39, 0xb0, 0x22, 0x10, 0xb1, 0x29, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x26, 0x29, 0x03, 0x11, 0x12, 0x39, 0x30, + 0x31, 0x01, 0x34, 0x2e, 0x04, 0x35, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, + 0x16, 0x16, 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x14, 0x16, 0x17, + 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x26, 0x35, + 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, 0xeb, 0x62, 0xec, 0xa1, 0x68, + 0x32, 0xd3, 0xb0, 0xa0, 0xb2, 0xca, 0xfe, 0xdf, 0x67, 0x57, 0x4d, 0x60, + 0x64, 0x74, 0xe9, 0xc9, 0xcb, 0xaf, 0xa0, 0xc6, 0xe5, 0x01, 0x22, 0x73, + 0x73, 0x4e, 0x5b, 0x01, 0x39, 0x3a, 0x46, 0x38, 0x3f, 0x56, 0x71, 0x4e, + 0x89, 0xbc, 0x10, 0xd9, 0xdc, 0x17, 0xbe, 0x91, 0x40, 0x56, 0x44, 0x66, + 0x3f, 0x1d, 0x33, 0xb4, 0x99, 0x8f, 0xae, 0x10, 0xe1, 0xe1, 0x13, 0xcb, + 0xa1, 0x5d, 0x52, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x04, 0x3f, + 0x04, 0x9d, 0x00, 0x1d, 0x00, 0x76, 0xb2, 0x19, 0x1e, 0x1f, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, + 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x1d, 0x12, 0x05, 0x11, 0x12, 0x39, 0xb0, + 0x1d, 0x2f, 0xb2, 0x9f, 0x1d, 0x01, 0x5d, 0xb1, 0x00, 0x07, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x03, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, + 0xd0, 0xb0, 0x08, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x1d, + 0x10, 0xb0, 0x0d, 0xd0, 0xb2, 0x16, 0x1d, 0x12, 0x11, 0x12, 0x39, 0xb0, + 0x12, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x06, 0x07, 0x21, 0x15, 0x21, 0x35, + 0x33, 0x36, 0x36, 0x27, 0x23, 0x35, 0x33, 0x27, 0x26, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x21, 0x34, 0x23, 0x22, 0x06, 0x17, 0x17, 0x21, 0x03, 0x6e, + 0xfe, 0x98, 0x02, 0x5d, 0x02, 0x98, 0xfc, 0x47, 0x0a, 0x29, 0x2b, 0x03, + 0xa1, 0x9c, 0x02, 0x06, 0xe3, 0xc6, 0xcb, 0xe3, 0xfe, 0xdf, 0x8b, 0x43, + 0x46, 0x05, 0x04, 0x01, 0x6f, 0x01, 0xdc, 0x90, 0x63, 0xe9, 0xe9, 0x0a, + 0x85, 0x64, 0xa7, 0x57, 0xd5, 0xee, 0xd9, 0xc6, 0xb7, 0x70, 0x6b, 0x57, + 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x03, 0xa0, 0x04, 0x8d, 0x00, 0x18, + 0x00, 0x73, 0xb2, 0x00, 0x19, 0x1a, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, + 0xb2, 0x00, 0x0c, 0x01, 0x11, 0x12, 0x39, 0xb2, 0x08, 0x01, 0x0c, 0x11, + 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb0, 0x03, 0xd0, 0x7c, 0xb0, 0x03, 0x2f, + 0x18, 0xb1, 0x05, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x10, + 0xd0, 0xb0, 0x05, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x15, + 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x01, 0x13, 0x21, + 0x03, 0x33, 0x15, 0x23, 0x07, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x35, + 0x21, 0x35, 0x21, 0x35, 0x27, 0x21, 0x35, 0x33, 0x03, 0x21, 0x01, 0xd3, + 0x9e, 0x01, 0x2f, 0xe7, 0xb2, 0xfa, 0x11, 0x01, 0x0b, 0xfe, 0xf5, 0xfe, + 0xdf, 0xfe, 0xf5, 0x01, 0x0b, 0x0b, 0xff, 0x00, 0xb8, 0xe6, 0x01, 0x30, + 0x02, 0xc8, 0x01, 0xc5, 0xfd, 0xe1, 0xa9, 0x29, 0x1b, 0xa7, 0xda, 0xda, + 0xa7, 0x2b, 0x19, 0xa9, 0x02, 0x1f, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, + 0x03, 0xa8, 0x04, 0x8d, 0x00, 0x05, 0x00, 0x33, 0xb2, 0x01, 0x06, 0x07, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0xa8, 0xfd, 0xdd, 0xfe, 0xde, 0x03, + 0x45, 0x03, 0xa3, 0xfc, 0x5d, 0x04, 0x8d, 0x00, 0x00, 0x02, 0xff, 0xff, + 0x00, 0x00, 0x04, 0x89, 0x04, 0x8d, 0x00, 0x03, 0x00, 0x08, 0x00, 0x3d, + 0xb2, 0x05, 0x09, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x10, 0xb0, 0x02, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, + 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x05, 0x02, 0x00, 0x11, 0x12, 0x39, 0xb1, + 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x21, 0x21, 0x01, 0x21, 0x03, 0x27, 0x07, 0x03, 0x21, 0x04, 0x89, + 0xfb, 0x76, 0x01, 0xa8, 0x01, 0x38, 0x92, 0x0b, 0x0b, 0xc0, 0x01, 0x98, + 0x04, 0x8d, 0xfe, 0xc2, 0x33, 0x36, 0xfd, 0x9d, 0x00, 0x03, 0x00, 0x40, + 0xff, 0xf0, 0x04, 0x7e, 0x04, 0x9d, 0x00, 0x03, 0x00, 0x15, 0x00, 0x23, + 0x00, 0x79, 0xb2, 0x08, 0x24, 0x25, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, + 0xb0, 0x01, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x19, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, + 0xb2, 0x03, 0x11, 0x08, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x03, 0x2f, 0x18, + 0xb2, 0xc0, 0x03, 0x01, 0x5d, 0xb4, 0x30, 0x03, 0x40, 0x03, 0x02, 0x5d, + 0xb4, 0x40, 0x03, 0x50, 0x03, 0x02, 0x71, 0xb1, 0x00, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x11, 0x10, 0xb1, 0x19, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, + 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x05, 0x14, 0x02, 0x06, 0x23, + 0x22, 0x26, 0x02, 0x27, 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x16, 0x12, + 0x17, 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x03, 0x1e, 0xfe, 0x8b, 0x01, 0x75, 0x01, 0x60, 0x86, + 0xf9, 0x9e, 0x9f, 0xf9, 0x88, 0x01, 0x86, 0xf8, 0xa1, 0x9e, 0xf7, 0x89, + 0x01, 0xfe, 0xde, 0x85, 0x78, 0x7c, 0x81, 0x84, 0x7b, 0x74, 0x87, 0x01, + 0xc7, 0xea, 0x82, 0xab, 0xfe, 0xfa, 0x8e, 0x8c, 0x01, 0x03, 0xa9, 0x34, + 0xac, 0x01, 0x06, 0x8f, 0x8c, 0xfe, 0xfb, 0xaa, 0x05, 0xa6, 0xb2, 0xb2, + 0xa6, 0x2e, 0xa3, 0xb6, 0xb4, 0xa8, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, + 0x04, 0x89, 0x04, 0x8d, 0x00, 0x08, 0x00, 0x38, 0xb2, 0x07, 0x09, 0x0a, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, + 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x07, 0x02, 0x00, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x21, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x27, + 0x07, 0x01, 0x2e, 0xfe, 0xd1, 0x01, 0xa8, 0x01, 0x38, 0x01, 0xaa, 0xfe, + 0xd0, 0xfe, 0xf4, 0x0b, 0x0b, 0x04, 0x8d, 0xfb, 0x73, 0x03, 0x4f, 0x33, + 0x36, 0x00, 0x00, 0x03, 0x00, 0x4a, 0x00, 0x00, 0x03, 0x60, 0x04, 0x8d, + 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x66, 0xb2, 0x04, 0x0c, 0x0d, + 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x01, 0xdc, 0xb0, 0x04, 0x10, + 0xb0, 0x09, 0xdc, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, + 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x0a, 0x00, 0x11, 0x12, + 0x39, 0xb0, 0x07, 0x2f, 0xb2, 0x50, 0x07, 0x01, 0x71, 0xb1, 0x04, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, + 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x21, 0x21, 0x35, 0x21, 0x27, 0x21, 0x35, 0x21, 0x37, 0x21, + 0x35, 0x21, 0x03, 0x60, 0xfc, 0xea, 0x03, 0x16, 0x51, 0xfd, 0x8c, 0x02, + 0x74, 0x51, 0xfc, 0xea, 0x03, 0x16, 0xe9, 0xfd, 0xea, 0xd3, 0xea, 0x00, + 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x04, 0x7c, 0x04, 0x8d, 0x00, 0x07, + 0x00, 0x40, 0xb2, 0x01, 0x08, 0x09, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, + 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x11, 0x21, + 0x11, 0x21, 0x04, 0x7c, 0xfe, 0xde, 0xfe, 0x2b, 0xfe, 0xde, 0x04, 0x19, + 0x03, 0xa3, 0xfc, 0x5d, 0x04, 0x8d, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, + 0x04, 0x04, 0x04, 0x8d, 0x00, 0x0c, 0x00, 0x45, 0xb2, 0x06, 0x0d, 0x0e, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, + 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x08, 0x10, + 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x07, 0xd0, 0x30, 0x31, 0x01, 0x03, 0x21, 0x15, 0x21, 0x35, 0x01, + 0x01, 0x35, 0x21, 0x15, 0x21, 0x13, 0x02, 0xa8, 0xef, 0x02, 0x4b, 0xfc, + 0x44, 0x01, 0x34, 0xfe, 0xcc, 0x03, 0xa1, 0xfd, 0xda, 0xe5, 0x02, 0x50, + 0xfe, 0x99, 0xe9, 0x98, 0x01, 0xc0, 0x01, 0x9e, 0x97, 0xea, 0xfe, 0xbd, + 0x00, 0x03, 0x00, 0x41, 0x00, 0x00, 0x05, 0x96, 0x04, 0x8d, 0x00, 0x11, + 0x00, 0x17, 0x00, 0x1c, 0x00, 0x71, 0xb2, 0x08, 0x1d, 0x1e, 0x11, 0x12, + 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x14, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x1a, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, + 0x07, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x11, 0x07, 0x11, 0x12, 0x39, 0xb0, + 0x00, 0x2f, 0xb2, 0x06, 0x07, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x2f, + 0xb0, 0x09, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x06, 0x10, + 0xb1, 0x1b, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x14, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x1a, 0x09, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x01, + 0x16, 0x04, 0x15, 0x14, 0x04, 0x07, 0x15, 0x21, 0x35, 0x26, 0x24, 0x35, + 0x34, 0x24, 0x37, 0x35, 0x21, 0x01, 0x06, 0x17, 0x11, 0x06, 0x06, 0x05, + 0x34, 0x27, 0x11, 0x36, 0x03, 0x7d, 0xfb, 0x01, 0x1e, 0xfe, 0xe1, 0xfa, + 0xfe, 0xdf, 0xfb, 0xfe, 0xe0, 0x01, 0x1c, 0xff, 0x01, 0x21, 0xfd, 0xe5, + 0x04, 0xfe, 0x7d, 0x7b, 0x03, 0x10, 0xf7, 0xf7, 0x04, 0x17, 0x0f, 0xf2, + 0xcd, 0xd2, 0xfd, 0x0f, 0x6b, 0x6b, 0x0f, 0xf8, 0xd5, 0xcf, 0xf2, 0x0f, + 0x76, 0xfd, 0xba, 0xe9, 0x16, 0x01, 0xf2, 0x0b, 0x78, 0x6e, 0xdb, 0x16, + 0xfe, 0x0e, 0x16, 0x00, 0x00, 0x01, 0x00, 0x41, 0x00, 0x00, 0x05, 0x4c, + 0x04, 0x8d, 0x00, 0x17, 0x00, 0x5d, 0xb2, 0x0b, 0x18, 0x19, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, + 0x16, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, + 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x0a, 0x04, 0x11, 0x12, + 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x15, + 0xd0, 0x30, 0x31, 0x01, 0x36, 0x36, 0x37, 0x11, 0x21, 0x11, 0x02, 0x00, + 0x07, 0x11, 0x21, 0x11, 0x26, 0x00, 0x11, 0x11, 0x21, 0x11, 0x16, 0x16, + 0x17, 0x11, 0x21, 0x03, 0x57, 0x6e, 0x64, 0x01, 0x01, 0x22, 0x01, 0xfe, + 0xfc, 0xf0, 0xfe, 0xdf, 0xf1, 0xfe, 0xfc, 0x01, 0x21, 0x01, 0x5f, 0x74, + 0x01, 0x21, 0x01, 0xfb, 0x12, 0xa2, 0xae, 0x01, 0x30, 0xfe, 0xd9, 0xfe, + 0xf8, 0xfe, 0xca, 0x18, 0xfe, 0xf0, 0x01, 0x0f, 0x18, 0x01, 0x37, 0x01, + 0x0d, 0x01, 0x22, 0xfe, 0xd5, 0x9c, 0xb1, 0x18, 0x02, 0x90, 0x00, 0x01, + 0x00, 0x4a, 0x00, 0x00, 0x04, 0x87, 0x04, 0x9d, 0x00, 0x23, 0x00, 0x55, + 0xb2, 0x07, 0x24, 0x25, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x0c, 0x3e, 0x59, 0xb0, + 0x19, 0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x20, 0xd0, 0xb0, 0x21, 0xd0, 0x30, + 0x31, 0x25, 0x36, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x15, 0x14, 0x16, 0x17, 0x15, 0x21, 0x35, 0x33, 0x26, 0x11, 0x35, 0x34, + 0x36, 0x36, 0x33, 0x32, 0x00, 0x15, 0x15, 0x14, 0x06, 0x07, 0x33, 0x15, + 0x21, 0x02, 0xa0, 0x64, 0x5f, 0x02, 0x83, 0x7b, 0x79, 0x82, 0x63, 0x67, + 0xfe, 0x29, 0xbd, 0xd2, 0x87, 0xf9, 0x9d, 0xec, 0x01, 0x34, 0x6c, 0x66, + 0xc3, 0xfe, 0x28, 0xef, 0x29, 0xa8, 0x91, 0x3d, 0x8f, 0x98, 0x96, 0x94, + 0x2c, 0x97, 0xb1, 0x28, 0xef, 0xeb, 0x9c, 0x01, 0x11, 0x16, 0x87, 0xe5, + 0x83, 0xfe, 0xe6, 0xe0, 0x16, 0x7f, 0xd7, 0x4c, 0xeb, 0x00, 0x00, 0x01, + 0x00, 0x20, 0xff, 0xec, 0x05, 0x74, 0x04, 0x8d, 0x00, 0x19, 0x00, 0x6e, + 0xb2, 0x16, 0x1a, 0x1b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0c, 0x3e, 0x59, 0xb0, + 0x02, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0xb2, 0x08, 0x02, 0x0e, + 0x11, 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb0, 0x0e, 0x10, 0xb1, 0x0f, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, + 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x07, 0x11, 0x21, 0x01, 0x75, 0xfe, 0xab, 0x03, 0xd2, 0xfe, 0xa5, + 0x80, 0x7d, 0xe3, 0xfd, 0xfd, 0xea, 0x67, 0x5f, 0x71, 0x72, 0x6a, 0x6f, + 0xfe, 0xde, 0x03, 0xa3, 0xea, 0xea, 0xc1, 0x20, 0xd7, 0xc5, 0xbd, 0xbd, + 0xdc, 0x4c, 0x4d, 0x61, 0x56, 0x1d, 0xfe, 0x05, 0x00, 0x01, 0x00, 0x40, + 0xff, 0xf0, 0x04, 0x52, 0x04, 0x9d, 0x00, 0x1b, 0x00, 0x93, 0xb2, 0x0a, + 0x1c, 0x1d, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, + 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb2, 0x0e, 0x0a, 0x03, + 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x13, 0x0a, 0x03, 0x11, 0x12, + 0x39, 0xb0, 0x13, 0x2f, 0xb4, 0x1f, 0x13, 0x2f, 0x13, 0x02, 0x72, 0xb4, + 0x8f, 0x13, 0x9f, 0x13, 0x02, 0x71, 0xb2, 0xff, 0x13, 0x01, 0x5d, 0xb2, + 0x0f, 0x13, 0x01, 0x71, 0xb4, 0x9f, 0x13, 0xaf, 0x13, 0x02, 0x72, 0xb4, + 0x6c, 0x13, 0x7c, 0x13, 0x02, 0x5d, 0xb4, 0x39, 0x13, 0x49, 0x13, 0x02, + 0x5d, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1b, 0x03, 0x0a, 0x11, 0x12, 0x39, 0x30, + 0x31, 0x01, 0x06, 0x04, 0x23, 0x22, 0x00, 0x03, 0x35, 0x10, 0x00, 0x33, + 0x32, 0x04, 0x17, 0x21, 0x26, 0x23, 0x22, 0x07, 0x21, 0x15, 0x21, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0x51, 0x0c, 0xfe, 0xeb, 0xe2, 0xf3, + 0xfe, 0xe9, 0x04, 0x01, 0x1b, 0xf1, 0xe2, 0x01, 0x10, 0x14, 0xfe, 0xdf, + 0x0a, 0xdb, 0xcb, 0x1b, 0x01, 0x4a, 0xfe, 0xb4, 0x0d, 0x6e, 0x6f, 0x6d, + 0x6f, 0x05, 0x01, 0x8f, 0xbf, 0xe0, 0x01, 0x29, 0x01, 0x05, 0x42, 0x01, + 0x05, 0x01, 0x38, 0xe2, 0xc7, 0xc0, 0xf9, 0xe9, 0x81, 0x79, 0x58, 0x5f, + 0x00, 0x02, 0x00, 0x1e, 0x00, 0x00, 0x07, 0x2e, 0x04, 0x8d, 0x00, 0x18, + 0x00, 0x21, 0x00, 0x7a, 0xb2, 0x04, 0x22, 0x23, 0x11, 0x12, 0x39, 0xb0, + 0x04, 0x10, 0xb0, 0x19, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, + 0x2f, 0x1b, 0xb1, 0x13, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x13, 0x10, + 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x0b, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x15, 0x13, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x15, + 0x2f, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x04, 0x23, 0x21, 0x11, + 0x21, 0x03, 0x06, 0x02, 0x06, 0x07, 0x23, 0x27, 0x37, 0x3e, 0x02, 0x37, + 0x13, 0x21, 0x11, 0x33, 0x32, 0x04, 0x05, 0x11, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x27, 0x07, 0x2e, 0xfe, 0xf4, 0xe5, 0xfe, 0x10, 0xfe, 0xdb, + 0x0c, 0x0c, 0x5c, 0xb8, 0xa1, 0x3a, 0x03, 0x2b, 0x46, 0x43, 0x22, 0x09, + 0x12, 0x03, 0x60, 0xcf, 0xe5, 0x01, 0x0b, 0xfd, 0x41, 0xd5, 0x5d, 0x6c, + 0x69, 0x59, 0x01, 0x8f, 0xb1, 0xde, 0x03, 0xa3, 0xfe, 0xd6, 0xf8, 0xfe, + 0xf9, 0x78, 0x02, 0xed, 0x06, 0x0b, 0x4e, 0xa3, 0xb3, 0x01, 0xeb, 0xfe, + 0x8b, 0xd9, 0x10, 0xfe, 0xba, 0x5f, 0x49, 0x46, 0x56, 0x02, 0x00, 0x02, + 0x00, 0x63, 0x00, 0x00, 0x07, 0x27, 0x04, 0x8d, 0x00, 0x12, 0x00, 0x1b, + 0x00, 0x9a, 0xb2, 0x01, 0x1c, 0x1d, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, + 0xb0, 0x13, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, + 0x1b, 0xb1, 0x11, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, + 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x02, 0x0b, + 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x01, 0x2f, 0x18, 0xb2, 0xc0, 0x01, 0x01, + 0x5d, 0xb4, 0x30, 0x01, 0x40, 0x01, 0x02, 0x5d, 0xb4, 0x40, 0x01, 0x50, + 0x01, 0x02, 0x71, 0xb2, 0x04, 0x02, 0x0b, 0x11, 0x12, 0x39, 0xb0, 0x04, + 0x2f, 0xb0, 0x01, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x14, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x21, 0x11, 0x21, 0x11, 0x33, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x27, 0x01, 0x85, 0x01, 0xc1, 0x01, 0x22, 0xcf, 0xe5, + 0x01, 0x0b, 0xfe, 0xf4, 0xe5, 0xfe, 0x10, 0xfe, 0x3f, 0xfe, 0xde, 0x01, + 0x22, 0x02, 0xe3, 0xd5, 0x59, 0x6f, 0x6d, 0x58, 0x02, 0xaf, 0x01, 0xde, + 0xfe, 0x8b, 0xd9, 0xb0, 0xb1, 0xde, 0x01, 0xc6, 0xfe, 0x3a, 0x04, 0x8d, + 0xfd, 0xa2, 0xfe, 0xba, 0x5c, 0x4c, 0x49, 0x54, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x20, 0x00, 0x00, 0x05, 0x74, 0x04, 0x8d, 0x00, 0x15, 0x00, 0x5c, + 0xb2, 0x07, 0x16, 0x17, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0c, 0x3e, 0x59, 0xb0, + 0x02, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0xb2, 0x08, 0x02, 0x0c, + 0x11, 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, + 0x15, 0x21, 0x15, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x21, 0x11, 0x34, + 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x01, 0x75, 0xfe, 0xab, 0x03, 0xd2, + 0xfe, 0xa5, 0x80, 0x78, 0xf2, 0xf1, 0x02, 0xfe, 0xde, 0x67, 0x7b, 0x6a, + 0x6f, 0xfe, 0xde, 0x03, 0xa3, 0xea, 0xea, 0xc1, 0x20, 0xd9, 0xd7, 0xfe, + 0xae, 0x01, 0x4a, 0x6e, 0x60, 0x1d, 0xfe, 0x05, 0x00, 0x01, 0x00, 0x63, + 0xfe, 0xa7, 0x04, 0x7c, 0x04, 0x8d, 0x00, 0x0b, 0x00, 0x50, 0xb2, 0x03, + 0x0c, 0x0d, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, + 0x59, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x11, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x7c, 0xfe, 0x91, 0xfe, 0xde, + 0xfe, 0x78, 0x01, 0x22, 0x01, 0xd5, 0x01, 0x22, 0xfe, 0xa7, 0x01, 0x59, + 0x04, 0x8d, 0xfc, 0x5c, 0x03, 0xa4, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x44, 0x04, 0x8d, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x61, 0xb2, 0x03, + 0x14, 0x15, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb0, 0x11, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, + 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x0b, 0x09, 0x11, 0x12, 0x39, + 0xb0, 0x03, 0x2f, 0xb0, 0x09, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x11, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x21, 0x15, 0x33, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, + 0x01, 0x32, 0x35, 0x34, 0x23, 0x23, 0x11, 0x03, 0xcb, 0xfd, 0xba, 0xcf, + 0xed, 0x01, 0x03, 0xfe, 0xfb, 0xea, 0xfe, 0x0e, 0x03, 0x68, 0xfe, 0x8f, + 0xc9, 0xcf, 0xcf, 0x03, 0xa4, 0xa9, 0xc9, 0xb1, 0xb2, 0xcf, 0x04, 0x8d, + 0xfc, 0x5c, 0x9a, 0x8f, 0xfe, 0xd7, 0x00, 0x02, 0x00, 0x21, 0xfe, 0xb3, + 0x05, 0x3a, 0x04, 0x8d, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x5d, 0xb2, 0x12, + 0x15, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x10, 0xb0, 0x09, 0xd0, 0x00, + 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, + 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x07, 0xd0, 0xb0, + 0x09, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x07, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, + 0x10, 0xd0, 0xb0, 0x04, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x37, 0x36, 0x36, 0x37, 0x13, + 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x21, + 0x11, 0x21, 0x07, 0x02, 0x7f, 0x60, 0x48, 0x06, 0x07, 0x03, 0x6a, 0x9c, + 0xfe, 0xdf, 0xfd, 0x29, 0xfe, 0xdf, 0x01, 0xb0, 0x01, 0xac, 0xfe, 0xd3, + 0x03, 0x0c, 0xe9, 0x66, 0xcd, 0xc2, 0x01, 0xaf, 0xfc, 0x5c, 0xfd, 0xca, + 0x01, 0x4d, 0xfe, 0xb3, 0x02, 0x36, 0x02, 0xba, 0xcb, 0xfe, 0xcb, 0x00, + 0x00, 0x01, 0x00, 0x16, 0x00, 0x00, 0x06, 0x59, 0x04, 0x8d, 0x00, 0x15, + 0x00, 0xa0, 0xb2, 0x01, 0x16, 0x17, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, + 0x14, 0x0c, 0x3e, 0x59, 0xb2, 0x10, 0x09, 0x02, 0x11, 0x12, 0x39, 0x7c, + 0xb0, 0x10, 0x2f, 0x18, 0xb4, 0x80, 0x10, 0x90, 0x10, 0x02, 0x5d, 0xb2, + 0xc0, 0x10, 0x01, 0x5d, 0xb4, 0x30, 0x10, 0x40, 0x10, 0x02, 0x5d, 0xb4, + 0x10, 0x10, 0x20, 0x10, 0x02, 0x71, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb2, 0x13, 0x10, + 0x00, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x10, 0xb0, 0x08, 0xd0, 0xb0, 0x10, + 0x10, 0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, + 0x03, 0x21, 0x01, 0x01, 0x21, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x13, + 0x21, 0x01, 0x01, 0x21, 0x04, 0x27, 0x5e, 0xfe, 0xdf, 0x61, 0xcf, 0xfe, + 0x9e, 0x01, 0x3d, 0xfe, 0xe2, 0x01, 0x50, 0xcb, 0x58, 0x01, 0x21, 0x57, + 0xca, 0x01, 0x50, 0xfe, 0xe1, 0x01, 0x3e, 0xfe, 0x9e, 0x01, 0xb8, 0xfe, + 0x48, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x5a, 0x02, 0x33, 0xfe, 0x3c, 0x01, + 0xc4, 0xfe, 0x3c, 0x01, 0xc4, 0xfd, 0xd5, 0xfd, 0x9e, 0x00, 0x00, 0x01, + 0x00, 0x3e, 0xff, 0xf0, 0x03, 0xfa, 0x04, 0x9d, 0x00, 0x26, 0x00, 0xa0, + 0xb2, 0x25, 0x27, 0x28, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x0a, + 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x06, 0x16, 0x0a, 0x11, 0x12, 0x39, 0xb2, 0x25, 0x0a, 0x16, + 0x11, 0x12, 0x39, 0xb0, 0x25, 0x2f, 0xb2, 0xfc, 0x25, 0x01, 0x5d, 0xb2, + 0x0c, 0x25, 0x01, 0x71, 0xb2, 0x3f, 0x25, 0x01, 0x71, 0xb2, 0xcf, 0x25, + 0x01, 0x71, 0xb2, 0x9f, 0x25, 0x01, 0x71, 0xb4, 0x6c, 0x25, 0x7c, 0x25, + 0x02, 0x5d, 0xb4, 0x39, 0x25, 0x49, 0x25, 0x02, 0x5d, 0xb1, 0x22, 0x08, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb4, 0xd6, 0x22, + 0xe6, 0x22, 0x02, 0x5d, 0xb2, 0x56, 0x22, 0x01, 0x5d, 0xb2, 0x10, 0x22, + 0x25, 0x11, 0x12, 0x39, 0xb2, 0x1a, 0x16, 0x0a, 0x11, 0x12, 0x39, 0xb0, + 0x16, 0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, + 0x14, 0x04, 0x23, 0x22, 0x24, 0x35, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x02, 0xc6, 0x5f, 0x57, 0x47, + 0x58, 0xfe, 0xde, 0xf8, 0xcb, 0xde, 0xf7, 0x68, 0x59, 0x68, 0x6c, 0xfe, + 0xfb, 0xe3, 0xd3, 0xfe, 0xff, 0x01, 0x22, 0x02, 0x5e, 0x56, 0x5f, 0x64, + 0xc4, 0x93, 0x9d, 0xa7, 0x03, 0x37, 0x3d, 0x41, 0x36, 0x2d, 0x98, 0xb3, + 0xa7, 0x95, 0x59, 0x8c, 0x28, 0x23, 0x8e, 0x5e, 0x9f, 0xb6, 0xbc, 0xa2, + 0x37, 0x41, 0x49, 0x43, 0x8d, 0x03, 0xc1, 0x04, 0x00, 0x01, 0x00, 0x63, + 0x00, 0x00, 0x04, 0x76, 0x04, 0x8d, 0x00, 0x09, 0x00, 0x4c, 0xb2, 0x00, + 0x0a, 0x0b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x04, + 0x00, 0x02, 0x11, 0x12, 0x39, 0xb2, 0x09, 0x00, 0x02, 0x11, 0x12, 0x39, + 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0x11, + 0x03, 0x54, 0x01, 0x22, 0xfe, 0xde, 0xfe, 0x31, 0xfe, 0xde, 0x01, 0x22, + 0x04, 0x8d, 0xfb, 0x73, 0x02, 0xda, 0xfd, 0x26, 0x04, 0x8d, 0xfd, 0x26, + 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x04, 0x52, 0x04, 0x8d, 0x00, 0x0c, + 0x00, 0x5b, 0xb2, 0x0a, 0x0d, 0x0e, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, + 0x3e, 0x59, 0xb2, 0x06, 0x02, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x2f, + 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x0a, 0x01, 0x06, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, + 0x21, 0x11, 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, 0x21, 0x01, 0xf6, + 0x71, 0xfe, 0xde, 0x01, 0x22, 0x6d, 0xf1, 0x01, 0x4c, 0xfe, 0xaf, 0x01, + 0x74, 0xfe, 0x9f, 0x01, 0xb8, 0xfe, 0x48, 0x04, 0x8d, 0xfe, 0x3c, 0x01, + 0xc4, 0xfd, 0xc9, 0xfd, 0xaa, 0x00, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x00, + 0x04, 0x6f, 0x04, 0x8d, 0x00, 0x11, 0x00, 0x4f, 0xb2, 0x04, 0x12, 0x13, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, + 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, + 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x03, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, + 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x03, 0x06, 0x02, 0x06, + 0x07, 0x23, 0x27, 0x37, 0x3e, 0x02, 0x37, 0x13, 0x04, 0x6f, 0xfe, 0xde, + 0xfe, 0xdb, 0x0c, 0x0d, 0x5c, 0xb5, 0x9f, 0x3e, 0x03, 0x1d, 0x4e, 0x46, + 0x24, 0x08, 0x14, 0x04, 0x8d, 0xfb, 0x73, 0x03, 0xa3, 0xfe, 0xda, 0xfd, + 0xfe, 0xfc, 0x79, 0x03, 0xed, 0x04, 0x0b, 0x4a, 0x9e, 0xa5, 0x02, 0x04, + 0x00, 0x01, 0x00, 0x1b, 0xff, 0xec, 0x04, 0x69, 0x04, 0x8d, 0x00, 0x10, + 0x00, 0x44, 0xb2, 0x05, 0x11, 0x12, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, + 0x59, 0xb2, 0x00, 0x07, 0x01, 0x11, 0x12, 0x39, 0xb1, 0x0b, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x13, + 0x21, 0x01, 0x07, 0x06, 0x07, 0x07, 0x27, 0x27, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x01, 0x21, 0x02, 0x5a, 0xdc, 0x01, 0x33, 0xfe, 0x64, 0x31, 0x65, + 0xba, 0x3c, 0x4f, 0x02, 0x18, 0x38, 0x32, 0x46, 0x1a, 0xfe, 0x49, 0x01, + 0x3a, 0x02, 0x62, 0x02, 0x2b, 0xfc, 0x7c, 0x5e, 0xb2, 0x0c, 0x01, 0x03, + 0xe9, 0x04, 0x28, 0x32, 0x03, 0x5f, 0x00, 0x01, 0x00, 0x63, 0xfe, 0xb3, + 0x05, 0x4f, 0x04, 0x8d, 0x00, 0x0b, 0x00, 0x46, 0xb2, 0x09, 0x0c, 0x0d, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb1, 0x00, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, + 0xd0, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x25, 0x33, 0x03, 0x21, 0x11, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x7c, 0xd3, 0x14, 0xfe, 0xf3, + 0xfc, 0x35, 0x01, 0x22, 0x01, 0xd5, 0x01, 0x22, 0xe9, 0xfd, 0xca, 0x01, + 0x4d, 0x04, 0x8d, 0xfc, 0x5c, 0x03, 0xa4, 0x00, 0x00, 0x01, 0x00, 0x46, + 0x00, 0x00, 0x04, 0x45, 0x04, 0x8d, 0x00, 0x11, 0x00, 0x47, 0xb2, 0x04, + 0x12, 0x13, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, + 0x2f, 0x1b, 0xb1, 0x08, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x0d, 0x08, + 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x2f, 0xb1, 0x04, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, + 0x06, 0x23, 0x20, 0x26, 0x27, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, + 0x37, 0x11, 0x21, 0x04, 0x45, 0xfe, 0xdf, 0x78, 0x62, 0xfe, 0xfa, 0xfb, + 0x03, 0x01, 0x22, 0x68, 0x7a, 0x68, 0x72, 0x01, 0x21, 0x01, 0x9b, 0x1f, + 0xd4, 0xd9, 0x01, 0x64, 0xfe, 0xa7, 0x6f, 0x60, 0x1d, 0x02, 0x0b, 0x00, + 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x06, 0x4b, 0x04, 0x8d, 0x00, 0x0b, + 0x00, 0x50, 0xb2, 0x05, 0x0c, 0x0d, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, + 0x3e, 0x59, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x08, 0xd0, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x21, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x06, 0x4b, + 0xfa, 0x18, 0x01, 0x22, 0x01, 0x41, 0x01, 0x22, 0x01, 0x41, 0x01, 0x22, + 0x04, 0x8d, 0xfc, 0x5c, 0x03, 0xa4, 0xfc, 0x5c, 0x03, 0xa4, 0x00, 0x01, + 0x00, 0x63, 0xfe, 0xb3, 0x07, 0x1e, 0x04, 0x8d, 0x00, 0x0f, 0x00, 0x59, + 0xb2, 0x0b, 0x10, 0x11, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x02, 0x2f, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, + 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0xd0, 0xb0, 0x09, 0xd0, 0xb0, 0x0c, 0xd0, + 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x25, 0x33, 0x03, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x06, 0x4b, 0xd3, + 0x14, 0xfe, 0xf3, 0xfa, 0x66, 0x01, 0x22, 0x01, 0x41, 0x01, 0x22, 0x01, + 0x41, 0x01, 0x22, 0xe9, 0xfd, 0xca, 0x01, 0x4d, 0x04, 0x8d, 0xfc, 0x5c, + 0x03, 0xa4, 0xfc, 0x5c, 0x03, 0xa4, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, + 0x05, 0x60, 0x04, 0x8d, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x61, 0xb2, 0x08, + 0x16, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x14, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, + 0x3e, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x07, 0x03, 0x11, 0x12, 0x39, + 0xb0, 0x0a, 0x2f, 0xb0, 0x03, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x13, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x32, 0x04, + 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x23, 0x11, 0x05, 0x60, 0xfe, + 0xf4, 0xe5, 0xfe, 0x10, 0xfe, 0x8b, 0x02, 0x97, 0xcf, 0xe5, 0x01, 0x0b, + 0xfe, 0x16, 0x5d, 0x6c, 0x69, 0x59, 0xdc, 0x01, 0x8f, 0xb1, 0xde, 0x03, + 0xa3, 0xea, 0xfe, 0x8b, 0xd9, 0xfe, 0xaa, 0x5f, 0x49, 0x46, 0x56, 0x02, + 0xfe, 0xba, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x05, 0xd7, 0x04, 0x8d, + 0x00, 0x26, 0x02, 0x08, 0x00, 0x00, 0x00, 0x07, 0x01, 0xe3, 0x04, 0x3f, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 0x04, 0x44, 0x04, 0x8d, + 0x00, 0x0a, 0x00, 0x13, 0x00, 0x52, 0xb2, 0x08, 0x14, 0x15, 0x11, 0x12, + 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x0b, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb2, 0x08, + 0x05, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb0, 0x03, 0x10, 0xb1, + 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x08, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, 0x11, + 0x33, 0x32, 0x04, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x23, 0x11, + 0x04, 0x44, 0xfe, 0xf4, 0xe5, 0xfe, 0x10, 0x01, 0x22, 0xcf, 0xe5, 0x01, + 0x0b, 0xfe, 0x16, 0x5d, 0x6c, 0x69, 0x59, 0xdc, 0x01, 0x8f, 0xb1, 0xde, + 0x04, 0x8d, 0xfe, 0x8b, 0xd9, 0xfe, 0xaa, 0x5f, 0x49, 0x46, 0x56, 0x02, + 0xfe, 0xba, 0x00, 0x01, 0x00, 0x31, 0xff, 0xf0, 0x04, 0x43, 0x04, 0x9d, + 0x00, 0x1c, 0x00, 0x90, 0xb2, 0x0b, 0x1d, 0x1e, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x0c, + 0x3e, 0x59, 0xb2, 0x00, 0x19, 0x12, 0x11, 0x12, 0x39, 0xb1, 0x03, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x12, + 0x19, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x2f, 0xb4, 0x1f, 0x09, 0x2f, 0x09, + 0x02, 0x72, 0xb4, 0x8f, 0x09, 0x9f, 0x09, 0x02, 0x71, 0xb2, 0xff, 0x09, + 0x01, 0x5d, 0xb2, 0x0f, 0x09, 0x01, 0x71, 0xb4, 0x9f, 0x09, 0xaf, 0x09, + 0x02, 0x72, 0xb4, 0x6c, 0x09, 0x7c, 0x09, 0x02, 0x5d, 0xb4, 0x39, 0x09, + 0x49, 0x09, 0x02, 0x5d, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0e, 0x12, 0x19, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x01, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, + 0x35, 0x21, 0x26, 0x23, 0x22, 0x06, 0x07, 0x21, 0x36, 0x24, 0x33, 0x32, + 0x00, 0x11, 0x15, 0x10, 0x00, 0x23, 0x22, 0x24, 0x27, 0x01, 0x53, 0x05, + 0x6f, 0x6d, 0x6e, 0x6e, 0x0d, 0xfe, 0xb5, 0x01, 0x4a, 0x1b, 0xcb, 0x6a, + 0x75, 0x05, 0xfe, 0xdf, 0x14, 0x01, 0x11, 0xe0, 0xf2, 0x01, 0x1b, 0xfe, + 0xe8, 0xf7, 0xe1, 0xfe, 0xeb, 0x0c, 0x01, 0x8f, 0x5f, 0x58, 0x79, 0x81, + 0xe9, 0xf9, 0x61, 0x5f, 0xc9, 0xe0, 0xfe, 0xc8, 0xfe, 0xf6, 0x30, 0xfe, + 0xf5, 0xfe, 0xd0, 0xe0, 0xbf, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xf0, + 0x06, 0x63, 0x04, 0x9d, 0x00, 0x14, 0x00, 0x22, 0x00, 0x8d, 0xb2, 0x1a, + 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb0, 0x10, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x0e, 0x09, 0x0c, 0x11, 0x12, 0x39, 0x7c, + 0xb0, 0x0e, 0x2f, 0x18, 0xb4, 0x40, 0x0e, 0x50, 0x0e, 0x02, 0x71, 0xb2, + 0xc0, 0x0e, 0x01, 0x5d, 0xb4, 0x30, 0x0e, 0x40, 0x0e, 0x02, 0x5d, 0xb1, + 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x11, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x06, 0x23, + 0x22, 0x24, 0x27, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x36, 0x00, + 0x33, 0x32, 0x00, 0x11, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x06, 0x63, 0x86, 0xf9, 0x9f, 0xd9, + 0xfe, 0xdc, 0x1e, 0xa5, 0xfe, 0xde, 0x01, 0x22, 0xa3, 0x18, 0x01, 0x24, + 0xdf, 0xf5, 0x01, 0x2b, 0xfe, 0xde, 0x85, 0x79, 0x7b, 0x82, 0x87, 0x78, + 0x75, 0x87, 0x02, 0x2f, 0xab, 0xfe, 0xfa, 0x8e, 0xfc, 0xdc, 0xfe, 0x38, + 0x04, 0x8d, 0xfe, 0x24, 0xe2, 0x01, 0x0a, 0xfe, 0xc4, 0xfe, 0xf5, 0x07, + 0xa6, 0xb2, 0xb2, 0xa6, 0x2e, 0xa5, 0xb4, 0xb4, 0xa8, 0x00, 0x00, 0x02, + 0x00, 0x36, 0x00, 0x00, 0x04, 0x1f, 0x04, 0x8d, 0x00, 0x0c, 0x00, 0x15, + 0x00, 0x63, 0xb2, 0x0b, 0x16, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x0b, 0x10, + 0xb0, 0x10, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, + 0xb1, 0x06, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, + 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb2, 0x11, 0x06, 0x00, 0x11, + 0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x01, 0x0a, 0x06, 0x11, 0x12, 0x39, + 0xb0, 0x06, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, 0x01, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x21, 0x11, 0x21, 0x11, 0x23, 0x03, 0x13, 0x14, 0x16, 0x33, 0x33, 0x11, + 0x23, 0x22, 0x06, 0x36, 0x01, 0x0a, 0xc3, 0xfd, 0xd9, 0x01, 0xcc, 0xfe, + 0xde, 0xbf, 0xcf, 0x2e, 0x58, 0x58, 0xb0, 0xb0, 0x51, 0x5f, 0x02, 0x0b, + 0x5c, 0xc4, 0xa4, 0xbe, 0xfb, 0x73, 0x01, 0x9b, 0xfe, 0x65, 0x03, 0x15, + 0x43, 0x4f, 0x01, 0x20, 0x4e, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, + 0x04, 0x1a, 0x04, 0x8d, 0x00, 0x0d, 0x00, 0x52, 0xb2, 0x01, 0x0e, 0x0f, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb2, 0x0d, 0x08, 0x02, 0x11, 0x12, + 0x39, 0xb0, 0x0d, 0x2f, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0d, 0x10, 0xb0, 0x06, + 0xd0, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, + 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x02, 0xc5, 0xcd, 0xfe, + 0xde, 0xcc, 0xcc, 0x03, 0x44, 0xfd, 0xde, 0xcd, 0x01, 0xd1, 0xfe, 0x2f, + 0x01, 0xd1, 0xb7, 0x02, 0x05, 0xea, 0xfe, 0xe5, 0x00, 0x01, 0x00, 0x16, + 0xfe, 0xb3, 0x06, 0xba, 0x04, 0x8d, 0x00, 0x19, 0x00, 0x9a, 0xb2, 0x08, + 0x1a, 0x1b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x16, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, + 0x0c, 0x3e, 0x59, 0xb2, 0x17, 0x0a, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x17, + 0x2f, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x00, 0x07, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x10, 0xb1, + 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x07, 0x10, 0xb0, 0x0b, 0xd0, 0xb2, 0x0f, 0x17, 0x07, 0x11, 0x12, 0x39, + 0xb0, 0x17, 0x10, 0xb0, 0x12, 0xd0, 0x30, 0x31, 0x01, 0x13, 0x33, 0x11, + 0x23, 0x11, 0x23, 0x03, 0x23, 0x11, 0x21, 0x11, 0x23, 0x03, 0x21, 0x01, + 0x01, 0x21, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x13, 0x21, 0x05, 0x1b, + 0xc5, 0xda, 0xef, 0xd4, 0xd0, 0x5e, 0xfe, 0xdf, 0x61, 0xcf, 0xfe, 0x9e, + 0x01, 0x3d, 0xfe, 0xe2, 0x01, 0x50, 0xcb, 0x58, 0x01, 0x21, 0x57, 0xca, + 0x01, 0x50, 0x02, 0x62, 0xfe, 0x86, 0xfd, 0xcb, 0x01, 0x4d, 0x01, 0xb8, + 0xfe, 0x48, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x5a, 0x02, 0x33, 0xfe, 0x3c, + 0x01, 0xc4, 0xfe, 0x3c, 0x01, 0xc4, 0x00, 0x01, 0x00, 0x63, 0xfe, 0xb3, + 0x04, 0xa6, 0x04, 0x8d, 0x00, 0x10, 0x00, 0x6d, 0xb2, 0x00, 0x11, 0x12, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, + 0x0d, 0x09, 0x0b, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x2f, 0xb1, 0x08, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x08, + 0x0d, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x13, 0x33, + 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, + 0x13, 0x21, 0x02, 0xde, 0xe3, 0xe5, 0xef, 0xc6, 0xfb, 0x71, 0xfe, 0xde, + 0x01, 0x22, 0x6d, 0xf1, 0x01, 0x4c, 0x02, 0x56, 0xfe, 0x92, 0xfd, 0xcb, + 0x01, 0x4d, 0x01, 0xb8, 0xfe, 0x48, 0x04, 0x8d, 0xfe, 0x3c, 0x01, 0xc4, + 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x04, 0xff, 0x04, 0x8d, 0x00, 0x14, + 0x00, 0x64, 0xb2, 0x0b, 0x15, 0x16, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, + 0x3e, 0x59, 0xb2, 0x00, 0x11, 0x13, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, + 0xb0, 0x04, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x08, 0x10, 0x00, 0x11, 0x12, + 0x39, 0xb0, 0x0c, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x35, 0x33, 0x15, 0x33, + 0x13, 0x21, 0x01, 0x01, 0x21, 0x03, 0x23, 0x15, 0x23, 0x35, 0x23, 0x11, + 0x21, 0x11, 0x21, 0x01, 0x85, 0x40, 0xa7, 0x33, 0xf1, 0x01, 0x4c, 0xfe, + 0xaf, 0x01, 0x74, 0xfe, 0x9f, 0xfb, 0x37, 0xa7, 0x40, 0xfe, 0xde, 0x01, + 0x22, 0x02, 0xc9, 0xda, 0xda, 0x01, 0xc4, 0xfd, 0xc9, 0xfd, 0xaa, 0x01, + 0xb8, 0xcd, 0xcd, 0xfe, 0x48, 0x04, 0x8d, 0x00, 0x00, 0x01, 0x00, 0x20, + 0x00, 0x00, 0x05, 0x85, 0x04, 0x8d, 0x00, 0x0e, 0x00, 0x6a, 0xb2, 0x00, + 0x0f, 0x10, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, + 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb2, 0x08, + 0x02, 0x06, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb1, 0x01, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, + 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x0c, 0x01, 0x08, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, + 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, 0x21, 0x03, + 0x2a, 0x71, 0xfe, 0xde, 0xfe, 0x89, 0x02, 0x99, 0x6c, 0xf2, 0x01, 0x4c, + 0xfe, 0xae, 0x01, 0x74, 0xfe, 0xa0, 0x01, 0xb8, 0xfe, 0x48, 0x03, 0xa3, + 0xea, 0xfe, 0x3c, 0x01, 0xc4, 0xfd, 0xc9, 0xfd, 0xaa, 0x00, 0x00, 0x02, + 0x00, 0x40, 0xff, 0xeb, 0x05, 0xd5, 0x04, 0xac, 0x00, 0x22, 0x00, 0x2f, + 0x00, 0x85, 0xb2, 0x14, 0x30, 0x31, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x10, + 0xb0, 0x23, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, + 0xb1, 0x0c, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, + 0x1b, 0xb1, 0x1a, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, + 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x02, 0x04, 0x1a, + 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x1a, 0x10, 0xb1, 0x2c, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0xd0, + 0xb0, 0x04, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x26, 0x14, 0x1a, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x05, 0x22, 0x27, 0x06, 0x23, 0x20, 0x00, 0x11, 0x35, + 0x34, 0x36, 0x36, 0x33, 0x15, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, + 0x26, 0x27, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x07, + 0x16, 0x33, 0x01, 0x14, 0x16, 0x17, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x15, 0x05, 0xd5, 0xeb, 0xb7, 0x97, 0xb0, 0xfe, 0xc4, 0xfe, + 0x90, 0x82, 0xea, 0x96, 0x67, 0x78, 0x02, 0xcf, 0xc4, 0xa1, 0x02, 0xea, + 0xc8, 0xd1, 0xef, 0x02, 0x95, 0x42, 0x63, 0xfd, 0x8e, 0x54, 0x51, 0x97, + 0x05, 0x49, 0x53, 0x4c, 0x59, 0x0d, 0x36, 0x3e, 0x01, 0x41, 0x01, 0x1e, + 0x38, 0xa1, 0xff, 0x8a, 0xf3, 0xa9, 0x93, 0x32, 0xaf, 0xbf, 0xa1, 0xfd, + 0x30, 0xe8, 0x01, 0x18, 0xfe, 0xf6, 0xe7, 0x58, 0xdf, 0xa8, 0x07, 0x01, + 0xad, 0x7f, 0xa4, 0x32, 0x6b, 0xd1, 0x39, 0x8e, 0x8a, 0x84, 0x87, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x04, 0x4f, 0x04, 0x8d, 0x00, 0x26, + 0x01, 0xd3, 0x00, 0x00, 0x00, 0x07, 0x02, 0x26, 0x00, 0x38, 0xfe, 0xcb, + 0x00, 0x01, 0x00, 0x03, 0xfe, 0xb3, 0x04, 0x9b, 0x04, 0x8d, 0x00, 0x0f, + 0x00, 0x69, 0xb2, 0x0a, 0x10, 0x11, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x07, + 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, + 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, + 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x09, 0x01, 0x11, 0x12, 0x39, + 0xb2, 0x0a, 0x01, 0x09, 0x11, 0x12, 0x39, 0xb2, 0x03, 0x0a, 0x00, 0x11, + 0x12, 0x39, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x0d, 0x00, 0x0a, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x13, 0x21, 0x01, 0x13, 0x33, 0x11, 0x23, 0x11, 0x23, 0x03, 0x03, 0x21, + 0x01, 0x01, 0x21, 0x02, 0x24, 0xce, 0x01, 0x4e, 0xfe, 0x9a, 0xe9, 0xd8, + 0xef, 0xa6, 0xde, 0xd7, 0xfe, 0xb2, 0x01, 0x70, 0xfe, 0x9a, 0x01, 0x4b, + 0x03, 0x15, 0x01, 0x78, 0xfd, 0xbe, 0xfe, 0x9d, 0xfd, 0xcb, 0x01, 0x4d, + 0x01, 0x7e, 0xfe, 0x82, 0x02, 0x4b, 0x02, 0x42, 0x00, 0x01, 0x00, 0x20, + 0xfe, 0xb3, 0x06, 0x63, 0x04, 0x8d, 0x00, 0x0f, 0x00, 0x5e, 0xb2, 0x09, + 0x10, 0x11, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x16, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, + 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x08, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0xb0, 0x0b, 0xd0, 0xb0, 0x00, 0x10, + 0xb0, 0x0c, 0xd0, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x25, 0x33, 0x03, 0x21, + 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, + 0x05, 0x8f, 0xd4, 0x14, 0xfe, 0xf4, 0xfc, 0x35, 0xfe, 0xa8, 0x03, 0xbc, + 0xfe, 0xbd, 0x01, 0xd5, 0x01, 0x21, 0xe9, 0xfd, 0xca, 0x01, 0x4d, 0x03, + 0xa3, 0xea, 0xea, 0xfd, 0x46, 0x03, 0xa4, 0x00, 0x00, 0x01, 0x00, 0x46, + 0x00, 0x00, 0x04, 0x45, 0x04, 0x8d, 0x00, 0x17, 0x00, 0x50, 0xb2, 0x04, + 0x18, 0x19, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, + 0x2f, 0x1b, 0xb1, 0x0b, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x10, 0x0b, + 0x00, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x2f, 0xb1, 0x07, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x10, + 0x10, 0xb0, 0x13, 0xd0, 0x30, 0x31, 0x21, 0x21, 0x11, 0x06, 0x07, 0x15, + 0x23, 0x35, 0x26, 0x26, 0x27, 0x11, 0x21, 0x11, 0x14, 0x16, 0x17, 0x35, + 0x33, 0x15, 0x36, 0x37, 0x11, 0x21, 0x04, 0x45, 0xfe, 0xdf, 0x46, 0x3e, + 0xa7, 0xdd, 0xd2, 0x04, 0x01, 0x22, 0x48, 0x49, 0xa7, 0x42, 0x42, 0x01, + 0x21, 0x01, 0x9b, 0x11, 0x08, 0xd3, 0xd0, 0x0f, 0xd3, 0xc4, 0x01, 0x68, + 0xfe, 0xa9, 0x61, 0x5d, 0x0d, 0xfb, 0xfc, 0x07, 0x11, 0x02, 0x0b, 0x00, + 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x04, 0x62, 0x04, 0x8d, 0x00, 0x11, + 0x00, 0x47, 0xb2, 0x04, 0x12, 0x13, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, + 0x59, 0xb2, 0x04, 0x00, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, + 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x13, 0x21, 0x11, 0x36, 0x33, 0x20, 0x16, 0x17, 0x11, 0x21, 0x11, + 0x26, 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x63, 0x01, 0x22, 0x78, 0x62, + 0x01, 0x08, 0xf7, 0x04, 0xfe, 0xdf, 0x02, 0x69, 0x77, 0x64, 0x76, 0xfe, + 0xde, 0x04, 0x8d, 0xfe, 0x64, 0x1f, 0xd3, 0xd5, 0xfe, 0x98, 0x01, 0x62, + 0x69, 0x5c, 0x1e, 0xfd, 0xf7, 0x00, 0x00, 0x02, 0x00, 0x15, 0xff, 0xf0, + 0x05, 0xdf, 0x04, 0xab, 0x00, 0x1a, 0x00, 0x22, 0x00, 0x67, 0xb2, 0x0d, + 0x23, 0x24, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb0, 0x1c, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, + 0x3e, 0x59, 0xb2, 0x1f, 0x0e, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x2f, + 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x03, 0xd0, 0xb0, 0x1f, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x00, 0x10, + 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x0e, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x20, 0x00, 0x27, 0x26, 0x26, 0x35, + 0x33, 0x14, 0x16, 0x17, 0x3e, 0x02, 0x33, 0x32, 0x00, 0x13, 0x15, 0x21, + 0x16, 0x21, 0x32, 0x37, 0x17, 0x06, 0x06, 0x03, 0x22, 0x06, 0x07, 0x21, + 0x35, 0x34, 0x26, 0x03, 0xfd, 0xfe, 0xf5, 0xfe, 0xb6, 0x18, 0xb5, 0xc6, + 0xe1, 0x4c, 0x4d, 0x0c, 0x97, 0xf9, 0x93, 0xfe, 0x01, 0x1e, 0x05, 0xfc, + 0xd2, 0x1a, 0x01, 0x32, 0xa2, 0x96, 0x46, 0x31, 0xdd, 0xae, 0x76, 0x8c, + 0x0c, 0x02, 0x0d, 0x88, 0x10, 0x01, 0x01, 0xe5, 0x09, 0xf1, 0xd0, 0x5f, + 0x76, 0x0b, 0x8e, 0xe1, 0x7c, 0xfe, 0xeb, 0xfe, 0xfc, 0xbd, 0xf9, 0x35, + 0xdb, 0x1a, 0x2c, 0x03, 0xd1, 0x88, 0x7b, 0x14, 0x73, 0x7c, 0x00, 0x02, + 0x00, 0x40, 0xff, 0xf0, 0x04, 0x91, 0x04, 0xab, 0x00, 0x14, 0x00, 0x1c, + 0x00, 0x61, 0xb2, 0x08, 0x1d, 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, + 0xb0, 0x15, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, + 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb2, 0x0d, 0x00, 0x08, 0x11, 0x12, + 0x39, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x15, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, + 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x20, 0x00, 0x11, 0x15, 0x14, 0x06, 0x04, 0x23, + 0x22, 0x00, 0x03, 0x35, 0x21, 0x26, 0x21, 0x22, 0x07, 0x27, 0x37, 0x36, + 0x01, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x02, 0x26, 0x01, 0x21, + 0x01, 0x4a, 0x91, 0xfe, 0xfd, 0x9c, 0xff, 0xfe, 0xe4, 0x06, 0x03, 0x2d, + 0x1a, 0xfe, 0xce, 0x98, 0x9f, 0x46, 0x19, 0xa2, 0x01, 0x01, 0x74, 0x8e, + 0x0c, 0xfd, 0xf3, 0x87, 0x04, 0xab, 0xfe, 0xd3, 0xfe, 0xf7, 0x61, 0x9f, + 0xfa, 0x8b, 0x01, 0x14, 0x01, 0x00, 0xc2, 0xf9, 0x35, 0xdb, 0x0a, 0x3c, + 0xfc, 0x2f, 0x87, 0x7c, 0x14, 0x74, 0x7b, 0x00, 0x00, 0x01, 0x00, 0x3e, + 0xff, 0xec, 0x03, 0xfb, 0x04, 0x8d, 0x00, 0x19, 0x00, 0x6d, 0xb2, 0x12, + 0x1a, 0x1b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, + 0x2f, 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, + 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x04, 0x00, 0x02, 0x11, 0x12, 0x39, 0xb2, 0x19, 0x0b, 0x02, 0x11, 0x12, + 0x39, 0xb0, 0x19, 0x2f, 0xb1, 0x18, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, 0x19, 0x18, 0x11, 0x12, 0x39, 0xb0, + 0x0b, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x0f, 0x18, 0x12, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x21, 0x35, 0x21, 0x17, 0x01, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, + 0x24, 0x35, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, + 0x35, 0x02, 0x77, 0xfd, 0xf1, 0x03, 0x6a, 0x01, 0xfe, 0xdd, 0x98, 0xb3, + 0xfe, 0xf9, 0xe2, 0xd3, 0xfe, 0xff, 0x01, 0x21, 0x02, 0x67, 0x58, 0x59, + 0x60, 0xd1, 0x84, 0x03, 0xa3, 0xea, 0xbe, 0xfe, 0xe0, 0x15, 0xba, 0x8b, + 0xaa, 0xbf, 0xbc, 0xa6, 0x3e, 0x3e, 0x49, 0x45, 0x9b, 0xc7, 0x00, 0x03, + 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, 0x04, 0x9d, 0x00, 0x11, 0x00, 0x18, + 0x00, 0x1f, 0x00, 0x83, 0xb2, 0x04, 0x20, 0x21, 0x11, 0x12, 0x39, 0xb0, + 0x04, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x19, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x16, 0x0d, 0x04, 0x11, 0x12, 0x39, + 0x7c, 0xb0, 0x16, 0x2f, 0x18, 0xb4, 0x30, 0x16, 0x40, 0x16, 0x02, 0x5d, + 0xb2, 0xc0, 0x16, 0x01, 0x5d, 0xb4, 0x40, 0x16, 0x50, 0x16, 0x02, 0x71, + 0xb4, 0xd0, 0x16, 0xe0, 0x16, 0x02, 0x71, 0xb0, 0x04, 0x10, 0xb1, 0x19, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x16, + 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x06, 0x23, 0x22, 0x26, 0x02, 0x27, + 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x16, 0x12, 0x17, 0x01, 0x22, 0x06, + 0x07, 0x21, 0x26, 0x26, 0x03, 0x32, 0x36, 0x37, 0x21, 0x16, 0x16, 0x04, + 0x7e, 0x86, 0xf9, 0x9e, 0x9f, 0xf9, 0x88, 0x01, 0x86, 0xf8, 0xa1, 0x9e, + 0xf7, 0x89, 0x01, 0xfd, 0xe1, 0x6a, 0x7c, 0x11, 0x01, 0xee, 0x12, 0x7f, + 0x64, 0x64, 0x7e, 0x12, 0xfe, 0x14, 0x12, 0x7e, 0x02, 0x2f, 0xab, 0xfe, + 0xfa, 0x8e, 0x8c, 0x01, 0x03, 0xa9, 0x34, 0xac, 0x01, 0x06, 0x8f, 0x8c, + 0xfe, 0xfb, 0xaa, 0x01, 0x53, 0x82, 0x7a, 0x7a, 0x82, 0xfd, 0x21, 0x82, + 0x77, 0x77, 0x82, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x04, 0x3f, + 0x04, 0x9d, 0x00, 0x26, 0x00, 0xde, 0xb2, 0x24, 0x27, 0x28, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x1d, 0x0c, 0x11, 0x12, 0x39, 0xb0, + 0x06, 0x2f, 0xb2, 0x5f, 0x06, 0x01, 0x5d, 0xb4, 0xaf, 0x06, 0xbf, 0x06, + 0x02, 0x5d, 0xb4, 0xdf, 0x06, 0xef, 0x06, 0x02, 0x5d, 0xb2, 0x0f, 0x06, + 0x01, 0x5d, 0xb2, 0x7f, 0x06, 0x01, 0x71, 0xb0, 0x01, 0xd0, 0xb0, 0x01, + 0x2f, 0xb6, 0x1f, 0x01, 0x2f, 0x01, 0x3f, 0x01, 0x03, 0x5d, 0xb6, 0xaf, + 0x01, 0xbf, 0x01, 0xcf, 0x01, 0x03, 0x5d, 0xb2, 0x00, 0x01, 0x01, 0x5d, + 0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x9f, 0x02, 0x01, 0x5d, 0xb0, 0x06, 0x10, 0xb1, 0x07, 0x02, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x9f, 0x07, 0x01, + 0x5d, 0xb0, 0x0c, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0xd0, 0xb0, 0x0f, 0xd0, 0xb0, 0x07, + 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x02, + 0x10, 0xb0, 0x16, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x01, + 0x10, 0xb0, 0x21, 0xd0, 0xb2, 0x5b, 0x21, 0x01, 0x5d, 0xb2, 0x0b, 0x21, + 0x01, 0x5d, 0xb0, 0x1d, 0x10, 0xb1, 0x23, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x5f, 0x23, 0x01, 0x5d, 0x30, 0x31, + 0x01, 0x21, 0x15, 0x21, 0x17, 0x15, 0x21, 0x15, 0x21, 0x06, 0x07, 0x21, + 0x15, 0x21, 0x35, 0x33, 0x36, 0x37, 0x23, 0x35, 0x33, 0x35, 0x27, 0x23, + 0x35, 0x33, 0x35, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x21, 0x34, 0x23, + 0x22, 0x06, 0x17, 0x01, 0xfb, 0x01, 0x73, 0xfe, 0x96, 0x02, 0x01, 0x68, + 0xfe, 0x71, 0x17, 0x21, 0x02, 0x98, 0xfc, 0x47, 0x0a, 0x2a, 0x16, 0x90, + 0xa1, 0x02, 0x9f, 0x9a, 0x06, 0xe3, 0xc6, 0xcb, 0xe3, 0xfe, 0xdf, 0x8b, + 0x43, 0x46, 0x05, 0x02, 0xce, 0xa8, 0x2a, 0x1c, 0xa8, 0x2d, 0x22, 0xe9, + 0xe9, 0x0b, 0x44, 0xa8, 0x0d, 0x39, 0xa8, 0x0c, 0xd5, 0xee, 0xcd, 0xbc, + 0xa1, 0x70, 0x6b, 0x00, 0x00, 0x01, 0x00, 0x47, 0xff, 0xf0, 0x03, 0xbc, + 0x04, 0x9f, 0x00, 0x22, 0x00, 0xbf, 0xb2, 0x01, 0x23, 0x24, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, + 0x09, 0x0c, 0x3e, 0x59, 0xb2, 0x22, 0x16, 0x09, 0x11, 0x12, 0x39, 0xb0, + 0x22, 0x2f, 0xb2, 0xff, 0x22, 0x01, 0x5d, 0xb2, 0x0f, 0x22, 0x01, 0x71, + 0xb2, 0x0f, 0x22, 0x01, 0x5d, 0xb4, 0x10, 0x22, 0x20, 0x22, 0x02, 0x5d, + 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x9f, 0x00, 0x01, 0x5d, 0xb0, 0x09, 0x10, 0xb1, 0x04, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, + 0x0c, 0xd0, 0xb0, 0x22, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x22, 0x10, 0xb0, + 0x13, 0xd0, 0xb0, 0x13, 0x2f, 0xb6, 0x1f, 0x13, 0x2f, 0x13, 0x3f, 0x13, + 0x03, 0x5d, 0xb4, 0xaf, 0x13, 0xbf, 0x13, 0x02, 0x5d, 0xb2, 0x00, 0x13, + 0x01, 0x5d, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x9f, 0x10, 0x01, 0x5d, 0xb0, 0x16, 0x10, 0xb1, 0x1b, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x5f, + 0x1b, 0x01, 0x5d, 0xb0, 0x13, 0x10, 0xb0, 0x1d, 0xd0, 0xb0, 0x10, 0x10, + 0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, + 0x17, 0x06, 0x23, 0x22, 0x24, 0x27, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, + 0x33, 0x36, 0x24, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x21, + 0x15, 0x21, 0x15, 0x21, 0x03, 0x66, 0xfe, 0x9d, 0x13, 0x68, 0x5d, 0x52, + 0x76, 0x18, 0x74, 0x6c, 0xd1, 0xfe, 0xf3, 0x1e, 0x98, 0x90, 0x90, 0x99, + 0x1e, 0x01, 0x0a, 0xd1, 0x75, 0x6e, 0x16, 0x65, 0x68, 0xae, 0x27, 0x01, + 0x62, 0xfe, 0x93, 0x01, 0x6d, 0x01, 0x74, 0x4e, 0x4d, 0x1a, 0xe4, 0x1f, + 0xca, 0xba, 0xa8, 0x4c, 0xa9, 0xbc, 0xd2, 0x21, 0xe4, 0x1c, 0xa5, 0xa9, + 0x4c, 0x00, 0x00, 0x04, 0x00, 0x63, 0x00, 0x00, 0x07, 0xd5, 0x04, 0x9f, + 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x27, 0x00, 0xb2, 0xb2, 0x1e, + 0x28, 0x29, 0x11, 0x12, 0x39, 0xb0, 0x1e, 0x10, 0xb0, 0x01, 0xd0, 0xb0, + 0x1e, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x1e, 0x10, 0xb0, 0x10, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x26, 0x2f, 0x1b, 0xb1, 0x26, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, + 0x1e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x21, 0x2f, 0x1b, + 0xb1, 0x21, 0x0c, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, + 0x0d, 0x2f, 0xb0, 0x03, 0xd0, 0xb0, 0x03, 0x2f, 0x40, 0x0b, 0x00, 0x03, + 0x10, 0x03, 0x20, 0x03, 0x30, 0x03, 0x40, 0x03, 0x05, 0x5d, 0xb1, 0x00, + 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, + 0x10, 0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x1a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x20, 0x23, 0x1e, 0x11, 0x12, 0x39, 0xb2, + 0x25, 0x23, 0x1e, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, 0x21, 0x35, 0x21, + 0x01, 0x34, 0x36, 0x20, 0x16, 0x15, 0x15, 0x14, 0x06, 0x20, 0x26, 0x35, + 0x17, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x01, 0x21, 0x01, 0x11, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, + 0x07, 0x9a, 0xfd, 0xbb, 0x02, 0x45, 0xfd, 0x86, 0xbf, 0x01, 0x36, 0xc0, + 0xbe, 0xfe, 0xca, 0xc1, 0xaf, 0x5a, 0x53, 0x50, 0x58, 0x02, 0x5d, 0x4f, + 0x4e, 0x5d, 0xfe, 0xa3, 0xfe, 0xdf, 0xfe, 0x34, 0xfe, 0xde, 0x01, 0x22, + 0x01, 0xcc, 0x01, 0x21, 0xe1, 0x94, 0x01, 0xdb, 0x96, 0xb9, 0xb8, 0x9c, + 0x3c, 0x96, 0xb8, 0xb8, 0x9b, 0x05, 0x57, 0x65, 0x62, 0x54, 0x47, 0x57, + 0x64, 0x63, 0x5b, 0xfc, 0xb3, 0x02, 0xd6, 0xfd, 0x2a, 0x04, 0x8d, 0xfd, + 0x29, 0x02, 0xd7, 0x00, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x04, 0xe9, + 0x04, 0x8d, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x97, 0xb2, 0x00, 0x20, 0x21, + 0x11, 0x12, 0x39, 0xb0, 0x18, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x16, 0xd0, + 0xb0, 0x16, 0x2f, 0xb0, 0x07, 0xd0, 0xb1, 0x04, 0x09, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x40, 0x09, 0x6f, 0x04, 0x7f, 0x04, + 0x8f, 0x04, 0x9f, 0x04, 0x04, 0x5d, 0xb0, 0x01, 0xd0, 0xb0, 0x16, 0x10, + 0xb0, 0x0a, 0xd0, 0xb0, 0x0a, 0x2f, 0xb2, 0xff, 0x0a, 0x01, 0x5d, 0xb4, + 0x0f, 0x0a, 0x1f, 0x0a, 0x02, 0x71, 0xb4, 0x1f, 0x0a, 0x2f, 0x0a, 0x02, + 0x5d, 0xb1, 0x09, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x40, 0x09, 0x6f, 0x09, 0x7f, 0x09, 0x8f, 0x09, 0x9f, 0x09, 0x04, + 0x5d, 0xb0, 0x14, 0xd0, 0xb0, 0x0a, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x0c, + 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x25, 0x21, 0x15, 0x21, 0x35, 0x23, 0x35, 0x33, 0x35, + 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x23, + 0x15, 0x21, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x03, + 0x49, 0xfe, 0xe2, 0xfe, 0xdf, 0xe2, 0xe2, 0xe2, 0xe2, 0x02, 0x04, 0xd8, + 0x01, 0x03, 0xfe, 0xfe, 0xdd, 0xdf, 0x01, 0x1e, 0xfe, 0xe2, 0xe3, 0x57, + 0x64, 0x64, 0x58, 0xe2, 0x84, 0x84, 0x84, 0xd0, 0x41, 0xd0, 0x02, 0x28, + 0xd4, 0xaa, 0xab, 0xcf, 0x41, 0x01, 0x11, 0x5a, 0x48, 0x46, 0x56, 0x00, + 0x00, 0x01, 0x00, 0x30, 0xff, 0xf5, 0x02, 0xb5, 0x03, 0x20, 0x00, 0x24, + 0x00, 0x9f, 0xb2, 0x1e, 0x25, 0x26, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x12, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0c, 0x3e, 0x59, + 0xb2, 0x01, 0x17, 0x0d, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x01, 0x2f, 0x18, + 0xb2, 0xd0, 0x01, 0x01, 0x5d, 0xb6, 0xa0, 0x01, 0xb0, 0x01, 0xc0, 0x01, + 0x03, 0x71, 0xb4, 0x50, 0x01, 0x60, 0x01, 0x02, 0x71, 0xb4, 0x90, 0x01, + 0xa0, 0x01, 0x02, 0x5d, 0xb4, 0x20, 0x01, 0x30, 0x01, 0x02, 0x72, 0xb0, + 0x0d, 0x10, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x09, 0x0d, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, + 0xb0, 0x23, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x12, + 0x23, 0x01, 0x11, 0x12, 0x39, 0xb2, 0x1b, 0x17, 0x0d, 0x11, 0x12, 0x39, + 0xb2, 0x56, 0x1b, 0x01, 0x5d, 0xb4, 0x35, 0x1b, 0x45, 0x1b, 0x02, 0x5d, + 0xb0, 0x17, 0x10, 0xb1, 0x1e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x01, 0x11, 0x52, 0x77, 0x39, 0x31, + 0x2a, 0x3b, 0xcd, 0xa9, 0x83, 0x91, 0xab, 0x87, 0x96, 0xb7, 0x94, 0x8e, + 0xac, 0xce, 0x44, 0x34, 0x3c, 0x35, 0x7a, 0x5c, 0x01, 0xd6, 0x58, 0x23, + 0x2a, 0x1f, 0x1d, 0x66, 0x7b, 0x77, 0x6b, 0x77, 0x32, 0x29, 0x8f, 0x69, + 0x7f, 0x85, 0x72, 0x22, 0x31, 0x35, 0x23, 0x5c, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x35, 0x00, 0x00, 0x02, 0xc0, 0x03, 0x15, 0x00, 0x0a, 0x00, 0x0e, + 0x00, 0x4a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, + 0x09, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, + 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x01, 0x09, 0x04, 0x11, 0x12, 0x39, + 0xb0, 0x01, 0x2f, 0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x0b, 0xd0, + 0xb2, 0x08, 0x0b, 0x06, 0x11, 0x12, 0x39, 0xb2, 0x0d, 0x09, 0x04, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x01, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, + 0x27, 0x01, 0x33, 0x01, 0x33, 0x35, 0x07, 0x02, 0x68, 0x58, 0x58, 0xcd, + 0xfe, 0xa6, 0x0c, 0x01, 0x65, 0xce, 0xfe, 0x91, 0xa2, 0x0e, 0x01, 0x46, + 0xa7, 0x9f, 0x9f, 0x87, 0x01, 0xef, 0xfe, 0x31, 0xd4, 0x16, 0x00, 0x01, + 0x00, 0x45, 0xff, 0xf5, 0x02, 0xb1, 0x03, 0x15, 0x00, 0x1b, 0x00, 0x72, + 0xb2, 0x0d, 0x1c, 0x1d, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb0, 0x02, + 0x10, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x07, 0x02, 0x0d, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb4, + 0x90, 0x07, 0xa0, 0x07, 0x02, 0x5d, 0xb0, 0x18, 0xb0, 0x0a, 0x2b, 0x58, + 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x05, 0x07, 0x18, 0x11, 0x12, 0x39, 0xb2, + 0x11, 0x0d, 0x07, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb1, 0x13, 0x02, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1b, 0x07, + 0x0d, 0x11, 0x12, 0x39, 0x30, 0x31, 0x13, 0x13, 0x21, 0x15, 0x21, 0x07, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x33, + 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x57, 0x36, + 0x01, 0xf7, 0xfe, 0xb0, 0x15, 0x3f, 0x45, 0x84, 0x8a, 0xaa, 0x8b, 0x81, + 0xb4, 0x02, 0xce, 0x04, 0x65, 0x68, 0x3b, 0x3d, 0x32, 0x33, 0x0d, 0x01, + 0x7d, 0x01, 0x98, 0xa2, 0x87, 0x1b, 0x84, 0x7a, 0x7b, 0x99, 0x85, 0x65, + 0x46, 0x71, 0x33, 0x3d, 0x1b, 0x0a, 0x00, 0x02, 0x00, 0x46, 0xff, 0xf5, + 0x02, 0xc3, 0x03, 0x25, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x68, 0xb2, 0x14, + 0x1e, 0x1f, 0x11, 0x12, 0x39, 0xb0, 0x14, 0x10, 0xb0, 0x0c, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x12, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x0c, 0x00, 0x11, 0x12, 0x39, + 0xb0, 0x06, 0x2f, 0xb4, 0x90, 0x06, 0xa0, 0x06, 0x02, 0x5d, 0xb0, 0x14, + 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xaf, 0x14, 0x01, + 0x5d, 0xb0, 0x0c, 0x10, 0xb1, 0x19, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x15, 0x22, 0x06, 0x07, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x34, + 0x36, 0x33, 0x03, 0x22, 0x07, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x02, 0x3a, 0x92, 0x81, 0x0f, 0x45, 0x6b, 0x76, 0x85, 0xad, 0x88, 0x99, + 0xac, 0x03, 0xf4, 0xe8, 0x9c, 0x4f, 0x24, 0x74, 0x2d, 0x42, 0x03, 0x25, + 0xa8, 0x56, 0x5a, 0x41, 0x8f, 0x79, 0x74, 0x9d, 0xa3, 0x95, 0x3d, 0xd0, + 0xeb, 0xfe, 0x46, 0x31, 0x26, 0x7b, 0x3e, 0x31, 0x63, 0x00, 0x00, 0x01, + 0x00, 0x33, 0x00, 0x00, 0x02, 0xb2, 0x03, 0x15, 0x00, 0x06, 0x00, 0x33, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x12, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x0c, 0x3e, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x05, 0x04, 0x11, 0x12, + 0x39, 0x30, 0x31, 0x01, 0x01, 0x23, 0x01, 0x21, 0x35, 0x21, 0x02, 0xb2, + 0xfe, 0xb5, 0xd8, 0x01, 0x4c, 0xfe, 0x58, 0x02, 0x7f, 0x02, 0xa2, 0xfd, + 0x5e, 0x02, 0x6f, 0xa6, 0x00, 0x03, 0x00, 0x47, 0xff, 0xf5, 0x02, 0xb2, + 0x03, 0x20, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x90, 0xb2, 0x07, + 0x25, 0x26, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x15, 0xd0, 0xb0, + 0x07, 0x10, 0xb0, 0x1f, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, + 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb2, 0x23, 0x07, 0x10, + 0x11, 0x12, 0x39, 0xb0, 0x23, 0x2f, 0xb2, 0x2f, 0x23, 0x01, 0x5d, 0xb2, + 0x3f, 0x23, 0x01, 0x72, 0xb2, 0x6f, 0x23, 0x01, 0x71, 0xb2, 0xff, 0x23, + 0x01, 0x72, 0xb4, 0x0c, 0x23, 0x1c, 0x23, 0x02, 0x5d, 0xb0, 0x15, 0xb0, + 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xaf, 0x15, 0x01, 0x5d, + 0xb2, 0x02, 0x15, 0x23, 0x11, 0x12, 0x39, 0xb2, 0x0c, 0x23, 0x15, 0x11, + 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb1, 0x1a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x1f, 0x02, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, + 0x07, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, + 0x35, 0x34, 0x36, 0x20, 0x16, 0x03, 0x34, 0x23, 0x22, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x03, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x02, + 0xa0, 0x6f, 0x81, 0xa3, 0x91, 0x90, 0xa7, 0x83, 0x71, 0x9e, 0x01, 0x0a, + 0x9f, 0xba, 0x6a, 0x67, 0x39, 0x30, 0x2f, 0x39, 0x13, 0x57, 0x55, 0x57, + 0x55, 0x02, 0x40, 0x72, 0x38, 0x3c, 0x80, 0x6c, 0x79, 0x79, 0x6c, 0x81, + 0x3b, 0x3a, 0x70, 0x68, 0x78, 0x76, 0xfe, 0x44, 0x51, 0x51, 0x28, 0x2d, + 0x2d, 0x01, 0x6c, 0x49, 0x49, 0x4d, 0x00, 0x02, 0x00, 0x43, 0xff, 0xf4, + 0x02, 0xae, 0x03, 0x20, 0x00, 0x14, 0x00, 0x1e, 0x00, 0x74, 0xb2, 0x15, + 0x1f, 0x20, 0x11, 0x12, 0x39, 0xb0, 0x15, 0x10, 0xb0, 0x08, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x12, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, + 0x3e, 0x59, 0xb2, 0x02, 0x10, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, + 0xb4, 0x9f, 0x02, 0xaf, 0x02, 0x02, 0x5d, 0xb6, 0x0c, 0x02, 0x1c, 0x02, + 0x2c, 0x02, 0x03, 0x5d, 0xb0, 0x10, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x15, + 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xbf, 0x15, 0x01, + 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x1a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x14, 0x06, 0x23, 0x23, 0x35, + 0x32, 0x36, 0x36, 0x27, 0x32, 0x37, 0x35, 0x34, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x01, 0xdd, 0x43, 0x50, 0x7b, 0x8c, 0xb2, 0x83, 0x90, 0xa5, 0x01, + 0xdd, 0xe9, 0x11, 0x6a, 0x5e, 0x36, 0x54, 0x3f, 0x21, 0x69, 0x2c, 0x3b, + 0x01, 0x2f, 0x34, 0x83, 0x83, 0x78, 0xa7, 0xa7, 0x99, 0x3b, 0xd8, 0xd9, + 0xa3, 0x1e, 0x41, 0x9d, 0x26, 0x4d, 0x75, 0x46, 0x37, 0x6b, 0x00, 0x01, + 0x00, 0x8d, 0x02, 0x89, 0x03, 0x48, 0x03, 0x40, 0x00, 0x03, 0x00, 0x1e, + 0xb2, 0x01, 0x04, 0x05, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x02, 0x2f, 0xb2, + 0xc0, 0x02, 0x01, 0x5d, 0xb1, 0x01, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x03, 0x48, + 0xfd, 0x45, 0x02, 0xbb, 0x02, 0x89, 0xb7, 0x00, 0x00, 0x03, 0x00, 0x90, + 0x04, 0x58, 0x02, 0xd2, 0x06, 0xc1, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x19, + 0x00, 0x4c, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x07, 0xd0, 0xb0, 0x07, 0x2f, + 0xb0, 0x02, 0xd0, 0xb0, 0x02, 0x2f, 0x40, 0x1b, 0x3f, 0x02, 0x4f, 0x02, + 0x5f, 0x02, 0x6f, 0x02, 0x7f, 0x02, 0x8f, 0x02, 0x9f, 0x02, 0xaf, 0x02, + 0xbf, 0x02, 0xcf, 0x02, 0xdf, 0x02, 0xef, 0x02, 0xff, 0x02, 0x0d, 0x5d, + 0xb2, 0x0f, 0x02, 0x01, 0x71, 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0xb2, + 0x4f, 0x00, 0x01, 0x5d, 0xb0, 0x0d, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x07, + 0x10, 0xb0, 0x18, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x05, 0x23, 0x07, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, + 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x01, 0xcd, 0x01, 0x05, + 0xfe, 0xf4, 0xb4, 0x82, 0x75, 0x55, 0x54, 0x73, 0x70, 0x57, 0x58, 0x72, + 0x70, 0x34, 0x4c, 0x30, 0x30, 0x4c, 0x34, 0x06, 0xc1, 0xcf, 0xe3, 0x4e, + 0x6d, 0x6c, 0x4f, 0x4d, 0x6a, 0x6b, 0x4c, 0x26, 0x32, 0x32, 0x26, 0x29, + 0x32, 0x32, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x03, 0xbc, 0x04, 0x8d, + 0x00, 0x0b, 0x00, 0x5d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, + 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x0b, 0x04, 0x06, 0x11, + 0x12, 0x39, 0xb0, 0x0b, 0x2f, 0xb2, 0x9f, 0x0b, 0x01, 0x72, 0xb4, 0x39, + 0x0b, 0x49, 0x0b, 0x02, 0x5d, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x02, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, + 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, + 0x21, 0x03, 0x66, 0xfe, 0x1f, 0x02, 0x36, 0xfc, 0xa8, 0x03, 0x59, 0xfd, + 0xc9, 0x01, 0xe1, 0x01, 0xe5, 0xfd, 0xe8, 0x04, 0x8d, 0xea, 0xd5, 0x00, + 0x00, 0x03, 0xff, 0xfb, 0xfe, 0x4a, 0x04, 0x1f, 0x04, 0x4e, 0x00, 0x2b, + 0x00, 0x37, 0x00, 0x44, 0x00, 0xa0, 0xb2, 0x07, 0x45, 0x46, 0x11, 0x12, + 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x31, 0xd0, 0xb0, 0x07, 0x10, 0xb0, 0x3b, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x28, 0x2f, 0x1b, 0xb1, 0x28, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, + 0x16, 0x0e, 0x3e, 0x59, 0xb0, 0x28, 0x10, 0xb0, 0x2b, 0xd0, 0xb0, 0x2b, + 0x2f, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x07, 0x16, 0x28, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb2, + 0x0e, 0x07, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x2f, 0xb1, 0x37, 0x09, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1d, 0x37, + 0x0e, 0x11, 0x12, 0x39, 0xb2, 0x21, 0x07, 0x28, 0x11, 0x12, 0x39, 0xb0, + 0x16, 0x10, 0xb1, 0x31, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x3b, 0x09, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x28, 0x10, 0xb1, 0x42, 0x09, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, + 0x16, 0x15, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x06, 0x15, 0x14, 0x16, + 0x17, 0x33, 0x16, 0x16, 0x15, 0x14, 0x06, 0x06, 0x23, 0x22, 0x26, 0x26, + 0x35, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x37, 0x26, 0x26, 0x35, 0x35, + 0x34, 0x24, 0x33, 0x32, 0x17, 0x21, 0x01, 0x06, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x23, 0x27, 0x03, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x04, 0x1f, 0x7d, 0x3c, 0xfe, + 0xfa, 0xce, 0x4e, 0x44, 0x19, 0x39, 0x3f, 0xc8, 0xb4, 0xc6, 0x91, 0xfd, + 0x9d, 0x94, 0xe2, 0x7d, 0x66, 0x5a, 0x2d, 0x74, 0x63, 0x6d, 0x01, 0x04, + 0xd2, 0x5a, 0x4e, 0x01, 0x6d, 0xfd, 0x2e, 0x40, 0x7c, 0x67, 0x77, 0x94, + 0x91, 0xec, 0x2a, 0x67, 0x51, 0x4c, 0x68, 0x65, 0xa2, 0x65, 0x03, 0xa0, + 0x57, 0x6b, 0x16, 0x9e, 0xd2, 0x10, 0x1b, 0x22, 0x26, 0x21, 0x01, 0x02, + 0x9d, 0x8f, 0x5b, 0xab, 0x65, 0x46, 0x80, 0x4e, 0x4f, 0x82, 0x27, 0x31, + 0x4b, 0x72, 0x4c, 0x31, 0xa3, 0x64, 0x16, 0xa5, 0xcb, 0x14, 0xfb, 0xd5, + 0x22, 0x49, 0x3b, 0x45, 0x4b, 0x38, 0x61, 0x01, 0x02, 0xbf, 0x40, 0x56, + 0x54, 0x44, 0x14, 0x42, 0x53, 0x53, 0x45, 0x00, 0x00, 0x02, 0x00, 0x49, + 0xff, 0xeb, 0x04, 0x5d, 0x04, 0x4e, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x70, + 0xb2, 0x1a, 0x1d, 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb0, 0x09, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, + 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x0c, 0x0f, 0x11, 0x12, + 0x39, 0xb2, 0x0b, 0x0c, 0x0f, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x10, 0xb1, + 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x09, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, 0x23, 0x22, 0x02, 0x27, 0x27, 0x10, + 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x03, 0x13, 0x23, 0x01, 0x10, 0x33, + 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x06, 0x03, 0x44, 0x70, + 0xd7, 0xc1, 0xe8, 0x0a, 0x01, 0xea, 0xcc, 0xd2, 0x6e, 0x18, 0xff, 0x6c, + 0x73, 0xff, 0xfe, 0x0d, 0xcd, 0x5a, 0x6d, 0x0a, 0x07, 0x6c, 0x5c, 0x63, + 0x6c, 0xa8, 0xbd, 0x01, 0x0a, 0xe4, 0x3c, 0x01, 0x05, 0x01, 0x34, 0xbd, + 0xa9, 0xfd, 0xe2, 0xfd, 0xe4, 0x02, 0x00, 0xfe, 0xd4, 0x91, 0x89, 0x42, + 0x91, 0xa3, 0xac, 0x00, 0x00, 0x02, 0x00, 0x84, 0x00, 0x00, 0x04, 0xfb, + 0x05, 0xb0, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x63, 0xb2, 0x18, 0x1f, 0x20, + 0x11, 0x12, 0x39, 0xb0, 0x18, 0x10, 0xb0, 0x16, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, + 0x59, 0xb2, 0x17, 0x03, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x2f, 0xb1, + 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x0a, 0x00, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb1, 0x1d, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x11, 0x21, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x16, 0x13, + 0x15, 0x14, 0x17, 0x15, 0x21, 0x26, 0x27, 0x35, 0x34, 0x27, 0x25, 0x33, + 0x32, 0x35, 0x34, 0x26, 0x23, 0x21, 0x01, 0xb0, 0xfe, 0xd4, 0x02, 0x40, + 0xf5, 0x01, 0x08, 0x7a, 0x8a, 0xef, 0x06, 0x49, 0xfe, 0xcc, 0x3c, 0x05, + 0xcd, 0xfe, 0xf7, 0xf6, 0xee, 0x76, 0x6c, 0xfe, 0xfe, 0x02, 0x39, 0xfd, + 0xc7, 0x05, 0xb0, 0xdd, 0xcf, 0x71, 0xa1, 0x37, 0x45, 0xfe, 0xf7, 0x55, + 0xc3, 0x39, 0x1c, 0x2f, 0xbe, 0x6b, 0xdb, 0x06, 0xf2, 0xc2, 0x65, 0x6b, + 0x00, 0x01, 0x00, 0x84, 0x00, 0x00, 0x05, 0x3a, 0x05, 0xb0, 0x00, 0x0c, + 0x00, 0x54, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, + 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x02, 0x04, 0x11, + 0x12, 0x39, 0xb0, 0x06, 0x2f, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x01, 0x06, 0x11, 0x12, 0x39, + 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x01, 0x21, + 0x01, 0x01, 0x21, 0x02, 0x5d, 0xad, 0xfe, 0xd4, 0x01, 0x2c, 0x89, 0x01, + 0x64, 0x01, 0x6e, 0xfe, 0x3f, 0x01, 0xf0, 0xfe, 0x9a, 0x02, 0x53, 0xfd, + 0xad, 0x05, 0xb0, 0xfd, 0xb9, 0x02, 0x47, 0xfd, 0x4f, 0xfd, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x71, 0x00, 0x00, 0x04, 0x4e, 0x06, 0x00, 0x00, 0x0c, + 0x00, 0x54, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, + 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, + 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x07, 0x08, 0x02, 0x11, + 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x00, 0x07, 0x11, 0x12, 0x39, + 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x13, 0x21, + 0x01, 0x01, 0x21, 0x01, 0xed, 0x5b, 0xfe, 0xdf, 0x01, 0x21, 0x51, 0xf6, + 0x01, 0x4e, 0xfe, 0xad, 0x01, 0x7a, 0xfe, 0xb3, 0x01, 0xc0, 0xfe, 0x40, + 0x06, 0x00, 0xfc, 0xa5, 0x01, 0x95, 0xfe, 0x11, 0xfd, 0xb5, 0x00, 0x01, + 0x00, 0x84, 0x00, 0x00, 0x05, 0x1c, 0x05, 0xb0, 0x00, 0x0a, 0x00, 0x53, + 0xb2, 0x08, 0x0b, 0x0c, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, + 0xb2, 0x00, 0x03, 0x01, 0x11, 0x12, 0x39, 0xb2, 0x05, 0x03, 0x01, 0x11, + 0x12, 0x39, 0xb2, 0x08, 0x00, 0x05, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, 0xb0, + 0xfe, 0xd4, 0x01, 0x2c, 0x01, 0xd9, 0x01, 0x74, 0xfd, 0xd6, 0x02, 0x49, + 0xfe, 0x89, 0x02, 0x85, 0xfd, 0x7b, 0x05, 0xb0, 0xfd, 0x7f, 0x02, 0x81, + 0xfd, 0x2e, 0xfd, 0x22, 0x00, 0x01, 0x00, 0x71, 0x00, 0x00, 0x04, 0x46, + 0x06, 0x18, 0x00, 0x0a, 0x00, 0x53, 0xb2, 0x08, 0x0b, 0x0c, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, + 0x03, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, + 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, + 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb2, 0x00, 0x06, 0x01, 0x11, 0x12, + 0x39, 0xb2, 0x05, 0x06, 0x01, 0x11, 0x12, 0x39, 0xb2, 0x08, 0x05, 0x00, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, + 0x21, 0x01, 0x01, 0x21, 0x01, 0x92, 0xfe, 0xdf, 0x01, 0x21, 0x01, 0x34, + 0x01, 0x55, 0xfe, 0x70, 0x01, 0xbb, 0xfe, 0xa9, 0x01, 0xda, 0xfe, 0x26, + 0x06, 0x18, 0xfc, 0x8d, 0x01, 0x95, 0xfe, 0x09, 0xfd, 0xbd, 0x00, 0x02, + 0x00, 0x63, 0x00, 0x00, 0x04, 0x34, 0x04, 0x8d, 0x00, 0x0b, 0x00, 0x15, + 0x00, 0x48, 0xb2, 0x15, 0x16, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x15, 0x10, + 0xb0, 0x0b, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, + 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x0c, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, + 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x33, 0x11, 0x21, 0x32, 0x04, 0x16, 0x17, 0x15, 0x14, 0x02, + 0x04, 0x23, 0x03, 0x11, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x27, + 0x63, 0x01, 0x8e, 0xa4, 0x01, 0x08, 0x95, 0x02, 0x93, 0xfe, 0xf9, 0xa6, + 0x6f, 0x6f, 0x94, 0x87, 0x02, 0x85, 0x8e, 0x04, 0x8d, 0x8c, 0xfd, 0x9e, + 0x37, 0x9f, 0xfe, 0xff, 0x8f, 0x03, 0xa3, 0xfd, 0x45, 0x97, 0xa3, 0x3c, + 0xa7, 0x9b, 0x03, 0x00, 0x00, 0x01, 0x00, 0x40, 0xff, 0xf0, 0x04, 0x52, + 0x04, 0x9d, 0x00, 0x19, 0x00, 0x50, 0xb2, 0x0a, 0x1a, 0x1b, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, + 0x03, 0x0c, 0x3e, 0x59, 0xb2, 0x0e, 0x0a, 0x03, 0x11, 0x12, 0x39, 0xb0, + 0x0a, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x19, 0x03, 0x0a, 0x11, 0x12, 0x39, + 0x30, 0x31, 0x01, 0x06, 0x04, 0x23, 0x22, 0x00, 0x03, 0x35, 0x10, 0x00, + 0x33, 0x32, 0x04, 0x17, 0x21, 0x26, 0x23, 0x22, 0x03, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x04, 0x51, 0x0c, 0xfe, 0xeb, 0xe2, 0xf3, 0xfe, + 0xe9, 0x04, 0x01, 0x1b, 0xf1, 0xe2, 0x01, 0x10, 0x14, 0xfe, 0xdf, 0x0a, + 0xdb, 0xe4, 0x07, 0x6f, 0x7e, 0x6d, 0x6f, 0x05, 0x01, 0x8f, 0xbf, 0xe0, + 0x01, 0x29, 0x01, 0x05, 0x42, 0x01, 0x05, 0x01, 0x38, 0xe2, 0xc7, 0xc0, + 0xfe, 0xc1, 0x4a, 0xb3, 0xa0, 0x58, 0x5f, 0x00, 0x00, 0x03, 0x00, 0x63, + 0x00, 0x00, 0x04, 0x22, 0x04, 0x8d, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x1e, + 0x00, 0xb4, 0xb2, 0x18, 0x1f, 0x20, 0x11, 0x12, 0x39, 0xb0, 0x18, 0x10, + 0xb0, 0x02, 0xd0, 0xb0, 0x18, 0x10, 0xb0, 0x11, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, + 0xb2, 0x17, 0x01, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x2f, 0xb4, 0x6c, + 0x17, 0x7c, 0x17, 0x02, 0x5d, 0xb4, 0xaf, 0x17, 0xbf, 0x17, 0x02, 0x5d, + 0xb2, 0x9f, 0x17, 0x01, 0x71, 0xb4, 0x8f, 0x17, 0x9f, 0x17, 0x02, 0x72, + 0xb2, 0xcf, 0x17, 0x01, 0x71, 0xb2, 0x3f, 0x17, 0x01, 0x71, 0xb2, 0xff, + 0x17, 0x01, 0x71, 0xb2, 0x0f, 0x17, 0x01, 0x72, 0xb2, 0xfc, 0x17, 0x01, + 0x5d, 0xb2, 0x0c, 0x17, 0x01, 0x71, 0xb2, 0x39, 0x17, 0x01, 0x5d, 0xb1, + 0x0f, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb4, + 0xd6, 0x0f, 0xe6, 0x0f, 0x02, 0x5d, 0xb2, 0x56, 0x0f, 0x01, 0x5d, 0xb2, + 0x08, 0x0f, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, + 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x03, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x27, 0x27, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x23, 0x63, 0x01, 0xc2, + 0xe9, 0xfa, 0x5b, 0x55, 0x62, 0x68, 0xee, 0xe3, 0xcc, 0xcc, 0x54, 0x5c, + 0x99, 0xe3, 0xb2, 0xaf, 0x55, 0x57, 0xb5, 0x04, 0x8d, 0xa5, 0x9d, 0x58, + 0x85, 0x1f, 0x19, 0x8c, 0x5c, 0xad, 0xa1, 0x01, 0xe5, 0xfd, 0x43, 0x37, + 0x7f, 0x04, 0xc3, 0x7a, 0x46, 0x3b, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00, + 0x04, 0xad, 0x04, 0x8d, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x47, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, + 0x3e, 0x59, 0xb2, 0x09, 0x04, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x2f, + 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x0a, 0x04, 0x02, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, 0x21, 0x07, + 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x03, 0x03, 0x36, 0xfe, 0x3d, + 0x52, 0xfe, 0xde, 0x01, 0xcd, 0x01, 0x10, 0x01, 0xd1, 0xfe, 0xdc, 0xfe, + 0x38, 0x01, 0x25, 0x93, 0xde, 0xde, 0x04, 0x8d, 0xfb, 0x73, 0x01, 0xb2, + 0x01, 0x8a, 0x00, 0x01, 0x00, 0x85, 0x04, 0x49, 0x01, 0xaa, 0x06, 0x16, + 0x00, 0x08, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x1a, 0x3e, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x04, 0x2f, + 0x30, 0x31, 0x01, 0x17, 0x06, 0x07, 0x07, 0x23, 0x35, 0x36, 0x36, 0x01, + 0x15, 0x95, 0x41, 0x02, 0x01, 0xe1, 0x01, 0x4f, 0x06, 0x16, 0x4e, 0x76, + 0x83, 0x86, 0x8c, 0x64, 0xb2, 0x00, 0x00, 0x02, 0x00, 0x6a, 0x04, 0xc9, + 0x03, 0x1f, 0x06, 0x6e, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x56, 0x00, 0xb0, + 0x03, 0x2f, 0xb2, 0x70, 0x03, 0x01, 0x5d, 0xb0, 0x07, 0xd0, 0xb0, 0x07, + 0x2f, 0x40, 0x0b, 0x0f, 0x07, 0x1f, 0x07, 0x2f, 0x07, 0x3f, 0x07, 0x4f, + 0x07, 0x05, 0x5d, 0xb0, 0x03, 0x10, 0xb1, 0x0a, 0x0a, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb0, 0x0d, 0xd0, + 0xb0, 0x0d, 0x2f, 0xb0, 0x07, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x11, 0x2f, + 0xb0, 0x0f, 0xd0, 0xb0, 0x0f, 0x2f, 0x40, 0x0d, 0x2f, 0x0f, 0x3f, 0x0f, + 0x4f, 0x0f, 0x5f, 0x0f, 0x6f, 0x0f, 0x7f, 0x0f, 0x06, 0x5d, 0x30, 0x31, + 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x25, 0x33, 0x17, 0x23, 0x03, 0x1f, 0xbe, 0x9d, 0x9c, 0xbe, + 0xbf, 0x51, 0x4a, 0x4b, 0x50, 0xfe, 0x7a, 0xcb, 0x7a, 0x97, 0x05, 0xb2, + 0x69, 0x80, 0x7f, 0x6a, 0x36, 0x3a, 0x3c, 0x34, 0xbc, 0xbb, 0x00, 0x02, + 0xfc, 0x9a, 0x04, 0xbb, 0xfe, 0xe2, 0x06, 0x7f, 0x00, 0x13, 0x00, 0x17, + 0x00, 0x9e, 0x00, 0xb0, 0x03, 0x2f, 0xb2, 0x0f, 0x03, 0x01, 0x5d, 0xb2, + 0x70, 0x03, 0x01, 0x5d, 0xb0, 0x06, 0xd0, 0xb0, 0x06, 0x2f, 0x40, 0x0f, + 0x0f, 0x06, 0x1f, 0x06, 0x2f, 0x06, 0x3f, 0x06, 0x4f, 0x06, 0x5f, 0x06, + 0x6f, 0x06, 0x07, 0x5d, 0xb0, 0x03, 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x09, + 0x2f, 0xb0, 0x06, 0x10, 0xb1, 0x0d, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x10, 0x0a, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb0, 0x13, + 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x16, 0xd0, 0x7c, 0xb0, 0x16, 0x2f, 0x18, + 0xb2, 0x0f, 0x16, 0x01, 0x71, 0x40, 0x13, 0x0f, 0x16, 0x1f, 0x16, 0x2f, + 0x16, 0x3f, 0x16, 0x4f, 0x16, 0x5f, 0x16, 0x6f, 0x16, 0x7f, 0x16, 0x8f, + 0x16, 0x09, 0x5d, 0xb0, 0x14, 0xd0, 0xb0, 0x14, 0x2f, 0x40, 0x0f, 0x0f, + 0x14, 0x1f, 0x14, 0x2f, 0x14, 0x3f, 0x14, 0x4f, 0x14, 0x5f, 0x14, 0x6f, + 0x14, 0x07, 0x5d, 0xb0, 0x16, 0x10, 0xb0, 0x17, 0xd0, 0x19, 0xb0, 0x17, + 0x2f, 0x18, 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x35, + 0x27, 0x33, 0x07, 0x23, 0xfe, 0xe2, 0x5f, 0x45, 0x39, 0x88, 0x29, 0x1c, + 0x26, 0x78, 0x5e, 0x45, 0x2b, 0x97, 0x28, 0x1b, 0x28, 0x84, 0xd1, 0xb4, + 0x9d, 0x05, 0x83, 0x4c, 0x69, 0x43, 0x31, 0x25, 0x22, 0x4a, 0x6c, 0x42, + 0x31, 0x24, 0xd9, 0xc3, 0x00, 0x02, 0x00, 0x83, 0x04, 0xec, 0x04, 0xa0, + 0x06, 0x82, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x4f, 0x00, 0xb0, 0x03, 0x2f, + 0xb2, 0x70, 0x03, 0x01, 0x5d, 0xb0, 0x05, 0xd0, 0xb0, 0x05, 0x2f, 0xb0, + 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0x40, 0x0b, 0x0f, 0x00, 0x1f, 0x00, 0x2f, + 0x00, 0x3f, 0x00, 0x4f, 0x00, 0x05, 0x5d, 0xb2, 0x06, 0x05, 0x00, 0x11, + 0x12, 0x39, 0x19, 0xb0, 0x06, 0x2f, 0x18, 0xb0, 0x02, 0xd0, 0x19, 0xb0, + 0x02, 0x2f, 0x18, 0xb2, 0x04, 0x03, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x03, + 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x09, 0x2f, 0xb0, 0x07, 0xd0, 0xb0, 0x07, + 0x2f, 0x30, 0x31, 0x01, 0x33, 0x05, 0x23, 0x27, 0x07, 0x23, 0x01, 0x33, + 0x03, 0x23, 0x01, 0xa0, 0xa3, 0x01, 0x1d, 0xd8, 0x97, 0x97, 0xd7, 0x03, + 0x36, 0xe7, 0xe3, 0xa7, 0x05, 0xd2, 0xe6, 0x7e, 0x7e, 0x01, 0x96, 0xfe, + 0xf0, 0x00, 0x00, 0x02, 0xff, 0x45, 0x04, 0xe6, 0x03, 0x61, 0x06, 0x7c, + 0x00, 0x06, 0x00, 0x0a, 0x00, 0x5d, 0x00, 0xb0, 0x03, 0x2f, 0xb2, 0x70, + 0x03, 0x01, 0x5d, 0xb0, 0x01, 0xd0, 0xb0, 0x01, 0x2f, 0xb0, 0x06, 0xd0, + 0xb0, 0x06, 0x2f, 0x40, 0x0b, 0x0f, 0x06, 0x1f, 0x06, 0x2f, 0x06, 0x3f, + 0x06, 0x4f, 0x06, 0x05, 0x5d, 0xb2, 0x04, 0x03, 0x06, 0x11, 0x12, 0x39, + 0x19, 0xb0, 0x04, 0x2f, 0x18, 0xb0, 0x00, 0xd0, 0x19, 0xb0, 0x00, 0x2f, + 0x18, 0xb2, 0x02, 0x03, 0x06, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb0, + 0x08, 0xd0, 0xb0, 0x08, 0x2f, 0xb0, 0x0a, 0xd0, 0xb0, 0x0a, 0x2f, 0x40, + 0x0b, 0x0f, 0x0a, 0x1f, 0x0a, 0x2f, 0x0a, 0x3f, 0x0a, 0x4f, 0x0a, 0x05, + 0x5d, 0x30, 0x31, 0x01, 0x23, 0x27, 0x07, 0x23, 0x25, 0x33, 0x05, 0x23, + 0x03, 0x33, 0x03, 0x61, 0xd7, 0x97, 0x97, 0xd8, 0x01, 0x1d, 0xa3, 0xfe, + 0x8a, 0xa7, 0xe2, 0xe6, 0x04, 0xe6, 0x7f, 0x7f, 0xe7, 0x60, 0x01, 0x0f, + 0x00, 0x02, 0x00, 0x84, 0x04, 0xec, 0x04, 0x1c, 0x06, 0xc0, 0x00, 0x06, + 0x00, 0x15, 0x00, 0x60, 0x00, 0xb0, 0x03, 0x2f, 0xb2, 0x70, 0x03, 0x01, + 0x5d, 0xb0, 0x05, 0xd0, 0xb0, 0x05, 0x2f, 0x40, 0x0b, 0x0f, 0x05, 0x1f, + 0x05, 0x2f, 0x05, 0x3f, 0x05, 0x4f, 0x05, 0x05, 0x5d, 0xb2, 0x04, 0x03, + 0x05, 0x11, 0x12, 0x39, 0x19, 0xb0, 0x04, 0x2f, 0x18, 0xb0, 0x00, 0xd0, + 0x19, 0xb0, 0x00, 0x2f, 0x18, 0xb0, 0x03, 0x10, 0xb0, 0x01, 0xd0, 0xb0, + 0x01, 0x2f, 0xb2, 0x02, 0x05, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x07, 0xd0, + 0xb0, 0x07, 0x2f, 0xb0, 0x0e, 0xd0, 0xb0, 0x0e, 0x2f, 0xb0, 0x0d, 0xd0, + 0xb2, 0x08, 0x07, 0x0d, 0x11, 0x12, 0x39, 0xb2, 0x14, 0x0e, 0x07, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x27, 0x07, 0x23, 0x25, 0x33, 0x17, + 0x27, 0x36, 0x36, 0x35, 0x34, 0x23, 0x37, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x07, 0x03, 0x61, 0xcf, 0x9f, 0xa0, 0xcf, 0x01, 0x18, 0xae, 0xba, + 0x0d, 0x3e, 0x37, 0x79, 0x06, 0x91, 0x92, 0x43, 0x3b, 0x01, 0x04, 0xec, + 0x86, 0x86, 0xe6, 0x67, 0x72, 0x03, 0x19, 0x1a, 0x3c, 0x71, 0x57, 0x4d, + 0x30, 0x43, 0x07, 0x37, 0x00, 0x02, 0x00, 0x84, 0x04, 0xec, 0x03, 0x61, + 0x06, 0xc7, 0x00, 0x06, 0x00, 0x1a, 0x00, 0xa5, 0x00, 0xb0, 0x03, 0x2f, + 0xb2, 0x70, 0x03, 0x01, 0x5d, 0xb0, 0x04, 0xd0, 0x19, 0xb0, 0x04, 0x2f, + 0x18, 0xb0, 0x00, 0xd0, 0x19, 0xb0, 0x00, 0x2f, 0x18, 0xb0, 0x03, 0x10, + 0xb0, 0x01, 0xd0, 0xb0, 0x01, 0x2f, 0xb0, 0x03, 0x10, 0xb0, 0x05, 0xd0, + 0xb0, 0x05, 0x2f, 0x40, 0x13, 0x0f, 0x05, 0x1f, 0x05, 0x2f, 0x05, 0x3f, + 0x05, 0x4f, 0x05, 0x5f, 0x05, 0x6f, 0x05, 0x7f, 0x05, 0x8f, 0x05, 0x09, + 0x5d, 0xb2, 0x02, 0x05, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0xd0, 0xb0, + 0x0a, 0x2f, 0x40, 0x0d, 0x3f, 0x0a, 0x4f, 0x0a, 0x5f, 0x0a, 0x6f, 0x0a, + 0x7f, 0x0a, 0x8f, 0x0a, 0x06, 0x5d, 0xb0, 0x0d, 0xd0, 0xb0, 0x0d, 0x2f, + 0x40, 0x0f, 0x0f, 0x0d, 0x1f, 0x0d, 0x2f, 0x0d, 0x3f, 0x0d, 0x4f, 0x0d, + 0x5f, 0x0d, 0x6f, 0x0d, 0x07, 0x5d, 0xb0, 0x0a, 0x10, 0xb0, 0x10, 0xd0, + 0xb0, 0x10, 0x2f, 0xb0, 0x0d, 0x10, 0xb1, 0x14, 0x0a, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x17, 0x0a, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, + 0xb0, 0x1a, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x27, 0x07, 0x23, 0x25, 0x33, + 0x37, 0x14, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x06, 0x15, 0x27, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x35, 0x03, 0x61, 0xcf, 0x9f, + 0xa0, 0xcf, 0x01, 0x20, 0x9e, 0xb4, 0x50, 0x39, 0x2e, 0x82, 0x23, 0x18, + 0x1d, 0x65, 0x4e, 0x38, 0x29, 0x86, 0x25, 0x18, 0x1e, 0x04, 0xec, 0x7e, + 0x7e, 0xe1, 0xd5, 0x41, 0x5b, 0x40, 0x2a, 0x1d, 0x1d, 0x41, 0x5c, 0x3e, + 0x2f, 0x1d, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x03, 0xa8, 0x05, 0xc4, + 0x00, 0x07, 0x00, 0x33, 0xb2, 0x03, 0x08, 0x09, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x02, 0x87, 0x01, 0x21, 0xfd, 0xdd, 0xfe, 0xde, 0x02, + 0x24, 0x05, 0xc4, 0xfd, 0xdf, 0xfc, 0x5d, 0x04, 0x8d, 0x00, 0x00, 0x02, + 0x00, 0x6a, 0x04, 0xc6, 0x03, 0x1f, 0x06, 0x6e, 0x00, 0x0c, 0x00, 0x10, + 0x00, 0x5a, 0x00, 0xb0, 0x03, 0x2f, 0xb2, 0x70, 0x03, 0x01, 0x5d, 0xb0, + 0x06, 0xd0, 0xb0, 0x06, 0x2f, 0x40, 0x0b, 0x0f, 0x06, 0x1f, 0x06, 0x2f, + 0x06, 0x3f, 0x06, 0x4f, 0x06, 0x05, 0x5d, 0xb0, 0x03, 0x10, 0xb1, 0x09, + 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, + 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x0c, 0x2f, 0xb0, 0x06, 0x10, 0xb0, 0x10, + 0xd0, 0xb0, 0x10, 0x2f, 0xb0, 0x0d, 0xd0, 0xb0, 0x0d, 0x2f, 0x40, 0x11, + 0x0f, 0x0d, 0x1f, 0x0d, 0x2f, 0x0d, 0x3f, 0x0d, 0x4f, 0x0d, 0x5f, 0x0d, + 0x6f, 0x0d, 0x7f, 0x0d, 0x08, 0x5d, 0x30, 0x31, 0x01, 0x14, 0x06, 0x20, + 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x27, 0x33, 0x07, + 0x23, 0x03, 0x1f, 0xbd, 0xfe, 0xc4, 0xbc, 0xbf, 0x51, 0x4a, 0x4b, 0x50, + 0x6f, 0xcb, 0xaf, 0x97, 0x05, 0xb0, 0x68, 0x82, 0x81, 0x69, 0x36, 0x3a, + 0x3c, 0x34, 0xbe, 0xbb, 0x00, 0x02, 0x00, 0x6a, 0x04, 0xc9, 0x03, 0x23, + 0x07, 0x0a, 0x00, 0x0d, 0x00, 0x1c, 0x00, 0x57, 0x00, 0xb0, 0x03, 0x2f, + 0xb2, 0x70, 0x03, 0x01, 0x5d, 0xb0, 0x07, 0xd0, 0xb0, 0x07, 0x2f, 0x40, + 0x0b, 0x0f, 0x07, 0x1f, 0x07, 0x2f, 0x07, 0x3f, 0x07, 0x4f, 0x07, 0x05, + 0x5d, 0xb0, 0x03, 0x10, 0xb1, 0x0a, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x0d, + 0x2f, 0xb0, 0x07, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x0e, 0x2f, 0xb0, 0x15, + 0xd0, 0xb0, 0x15, 0x2f, 0xb0, 0x14, 0xd0, 0xb2, 0x0f, 0x14, 0x0e, 0x11, + 0x12, 0x39, 0xb2, 0x1b, 0x0e, 0x15, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x27, 0x27, 0x36, 0x36, 0x35, 0x34, 0x23, 0x37, 0x32, 0x16, 0x15, + 0x14, 0x06, 0x07, 0x15, 0x03, 0x23, 0xbb, 0xa1, 0xa2, 0xbb, 0xc0, 0x4f, + 0x4e, 0x4a, 0x51, 0xfa, 0x0f, 0x47, 0x40, 0x8c, 0x07, 0xaa, 0xab, 0x4b, + 0x48, 0x05, 0xb0, 0x67, 0x80, 0x80, 0x67, 0x31, 0x3a, 0x39, 0x32, 0x1e, + 0x6b, 0x03, 0x17, 0x18, 0x35, 0x6a, 0x50, 0x47, 0x2d, 0x3b, 0x08, 0x35, + 0xff, 0xff, 0x00, 0x47, 0x02, 0x8d, 0x02, 0xb2, 0x05, 0xb8, 0x01, 0x07, + 0x01, 0xc7, 0x00, 0x00, 0x02, 0x98, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, 0x59, 0xb0, 0x10, + 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x35, 0x02, 0x98, 0x02, 0xc0, + 0x05, 0xad, 0x01, 0x07, 0x02, 0x20, 0x00, 0x00, 0x02, 0x98, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, + 0x3e, 0x59, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x45, + 0x02, 0x8d, 0x02, 0xb1, 0x05, 0xad, 0x01, 0x07, 0x02, 0x21, 0x00, 0x00, + 0x02, 0x98, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, + 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, 0x00, 0x46, + 0x02, 0x8d, 0x02, 0xc3, 0x05, 0xbd, 0x01, 0x07, 0x02, 0x22, 0x00, 0x00, + 0x02, 0x98, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x14, 0xd0, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x33, 0x02, 0x98, 0x02, 0xb2, 0x05, 0xad, 0x01, 0x07, + 0x02, 0x23, 0x00, 0x00, 0x02, 0x98, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x47, 0x02, 0x8d, 0x02, 0xb2, 0x05, 0xb8, 0x01, 0x07, + 0x02, 0x24, 0x00, 0x00, 0x02, 0x98, 0x00, 0x19, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x18, 0x3e, 0x59, 0xb0, 0x15, + 0xd0, 0xb0, 0x10, 0x10, 0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x43, 0x02, 0x8c, 0x02, 0xae, 0x05, 0xb8, 0x01, 0x07, 0x02, 0x25, + 0x00, 0x00, 0x02, 0x98, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x1a, 0xd0, 0x30, + 0x31, 0x00, 0x00, 0x01, 0x00, 0x58, 0xff, 0xeb, 0x05, 0x26, 0x05, 0xc5, + 0x00, 0x1c, 0x00, 0x50, 0xb2, 0x0c, 0x1d, 0x1e, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, + 0x3e, 0x59, 0xb2, 0x10, 0x0c, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x10, + 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x03, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x1c, 0x03, 0x0c, 0x11, 0x12, 0x39, 0x30, 0x31, + 0x01, 0x06, 0x00, 0x21, 0x22, 0x24, 0x02, 0x27, 0x35, 0x34, 0x12, 0x24, + 0x33, 0x20, 0x00, 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, 0x02, 0x15, 0x15, + 0x14, 0x12, 0x33, 0x20, 0x13, 0x05, 0x24, 0x17, 0xfe, 0xce, 0xfe, 0xfa, + 0xba, 0xfe, 0xdf, 0xa0, 0x02, 0xa0, 0x01, 0x22, 0xb9, 0x01, 0x06, 0x01, + 0x36, 0x17, 0xfe, 0xd3, 0x14, 0x8c, 0x86, 0x99, 0xb6, 0xb3, 0x9e, 0x01, + 0x01, 0x22, 0x01, 0xe5, 0xf4, 0xfe, 0xfa, 0xaf, 0x01, 0x45, 0xd4, 0x3c, + 0xd6, 0x01, 0x4c, 0xb4, 0xfe, 0xf0, 0xf3, 0x93, 0x7d, 0xfe, 0xfc, 0xdf, + 0x30, 0xe2, 0xfe, 0xff, 0x01, 0x09, 0x00, 0x01, 0x00, 0x58, 0xff, 0xeb, + 0x05, 0x26, 0x05, 0xc5, 0x00, 0x23, 0x00, 0x5f, 0xb2, 0x0e, 0x24, 0x25, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, + 0xb1, 0x0e, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, + 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x12, 0x0e, 0x05, 0x11, 0x12, + 0x39, 0xb0, 0x0e, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x22, 0x0e, 0x05, 0x11, + 0x12, 0x39, 0xb0, 0x22, 0x2f, 0xb1, 0x21, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, 0x06, 0x07, 0x06, + 0x23, 0x22, 0x24, 0x02, 0x27, 0x35, 0x34, 0x12, 0x24, 0x33, 0x20, 0x04, + 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, 0x02, 0x15, 0x15, 0x14, 0x12, 0x33, + 0x32, 0x36, 0x37, 0x35, 0x23, 0x35, 0x21, 0x05, 0x26, 0x20, 0x72, 0x48, + 0x94, 0xaf, 0xc4, 0xfe, 0xc6, 0xb0, 0x03, 0xa0, 0x01, 0x28, 0xba, 0x01, + 0x01, 0x01, 0x31, 0x1a, 0xfe, 0xdb, 0x11, 0x91, 0x7d, 0x9d, 0xc1, 0xd6, + 0xaf, 0x64, 0x76, 0x16, 0xff, 0x02, 0x2c, 0xb7, 0x29, 0x4f, 0x1b, 0x39, + 0xb2, 0x01, 0x42, 0xcc, 0x41, 0xd5, 0x01, 0x4c, 0xb8, 0xfd, 0xe7, 0x74, + 0x7d, 0xfe, 0xf9, 0xe3, 0x2e, 0xd8, 0xfe, 0xfa, 0x29, 0x17, 0xf7, 0xdd, + 0x00, 0x02, 0x00, 0x84, 0x00, 0x00, 0x05, 0x18, 0x05, 0xb0, 0x00, 0x0b, + 0x00, 0x15, 0x00, 0x48, 0xb2, 0x03, 0x16, 0x17, 0x11, 0x12, 0x39, 0xb0, + 0x03, 0x10, 0xb0, 0x15, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, + 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, + 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x00, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, 0x21, 0x32, 0x04, 0x12, 0x15, 0x15, + 0x14, 0x02, 0x04, 0x07, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, + 0x26, 0x27, 0x84, 0x01, 0xc5, 0xd2, 0x01, 0x4a, 0xb3, 0xb5, 0xfe, 0xb8, + 0xcf, 0x9c, 0x85, 0xcf, 0xe7, 0xdd, 0xce, 0x05, 0xb0, 0xb7, 0xfe, 0xba, + 0xc8, 0x29, 0xcb, 0xfe, 0xbd, 0xb3, 0x01, 0x04, 0xbd, 0xfc, 0x34, 0xf5, + 0xe2, 0x26, 0xd6, 0xf7, 0x02, 0x00, 0x00, 0x02, 0x00, 0x58, 0xff, 0xeb, + 0x05, 0x7c, 0x05, 0xc5, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x48, 0xb2, 0x04, + 0x20, 0x21, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x1c, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, + 0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1c, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, + 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x35, 0x34, 0x12, 0x24, 0x33, + 0x32, 0x04, 0x12, 0x15, 0x25, 0x34, 0x02, 0x23, 0x22, 0x02, 0x15, 0x15, + 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x05, 0x7c, 0xa8, 0xfe, 0xd1, 0xba, + 0xb5, 0xfe, 0xd1, 0xaf, 0xa9, 0x01, 0x2f, 0xb9, 0xba, 0x01, 0x2f, 0xaa, + 0xfe, 0xd5, 0xc8, 0xa0, 0x9d, 0xc8, 0xc7, 0xa0, 0x9f, 0xc7, 0x02, 0xc3, + 0xcd, 0xfe, 0xb2, 0xbd, 0xb8, 0x01, 0x51, 0xd1, 0x28, 0xcb, 0x01, 0x4f, + 0xbe, 0xbd, 0xfe, 0xb0, 0xcb, 0x02, 0xd2, 0x01, 0x0f, 0xfe, 0xf4, 0xdf, + 0x22, 0xd4, 0xfe, 0xef, 0x01, 0x0e, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x58, + 0xff, 0x03, 0x05, 0x7c, 0x05, 0xc5, 0x00, 0x14, 0x00, 0x21, 0x00, 0x48, + 0xb2, 0x08, 0x22, 0x23, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x10, 0xb0, 0x18, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x1e, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x14, 0x02, 0x07, 0x17, 0x07, 0x25, 0x06, 0x23, 0x22, 0x24, 0x02, + 0x35, 0x35, 0x34, 0x12, 0x24, 0x20, 0x04, 0x12, 0x17, 0x05, 0x34, 0x02, + 0x23, 0x22, 0x02, 0x15, 0x15, 0x14, 0x12, 0x20, 0x12, 0x35, 0x05, 0x7c, + 0x88, 0x7a, 0xea, 0xbf, 0xfe, 0xde, 0x4a, 0x4e, 0xbc, 0xfe, 0xd2, 0xa9, + 0xa7, 0x01, 0x2e, 0x01, 0x78, 0x01, 0x2c, 0xa9, 0x02, 0xfe, 0xd5, 0xc5, + 0xa3, 0xa0, 0xc5, 0xc4, 0x01, 0x46, 0xc3, 0x02, 0xcb, 0xc0, 0xfe, 0xc8, + 0x62, 0xc5, 0xa9, 0xf9, 0x11, 0xba, 0x01, 0x53, 0xd3, 0x18, 0xd3, 0x01, + 0x52, 0xbd, 0xb9, 0xfe, 0xb2, 0xd0, 0x09, 0xdf, 0x01, 0x0c, 0xfe, 0xf7, + 0xe9, 0x13, 0xdd, 0xfe, 0xf0, 0x01, 0x0e, 0xe4, 0x00, 0x01, 0x00, 0x8f, + 0x00, 0x00, 0x03, 0x08, 0x04, 0x8c, 0x00, 0x06, 0x00, 0x33, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x16, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, + 0x59, 0xb2, 0x04, 0x00, 0x05, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, + 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x21, 0x21, 0x11, 0x05, 0x35, 0x25, 0x33, 0x03, 0x08, 0xfe, 0xdf, + 0xfe, 0xa8, 0x02, 0x5a, 0x1f, 0x03, 0x34, 0x6b, 0xeb, 0xd8, 0x00, 0x01, + 0x00, 0x58, 0x00, 0x00, 0x04, 0x3a, 0x04, 0x9d, 0x00, 0x19, 0x00, 0x5b, + 0xb2, 0x09, 0x1a, 0x1b, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb1, 0x18, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, + 0x18, 0x00, 0x11, 0x12, 0x39, 0xb2, 0x03, 0x11, 0x18, 0x11, 0x12, 0x39, + 0xb0, 0x11, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x0c, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb2, 0x17, + 0x18, 0x11, 0x11, 0x12, 0x39, 0x30, 0x31, 0x21, 0x21, 0x35, 0x01, 0x36, + 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x05, 0x21, 0x04, 0x3a, 0xfc, + 0x36, 0x01, 0xfa, 0x43, 0x3c, 0x5d, 0x52, 0x58, 0x68, 0xfe, 0xde, 0x79, + 0xdd, 0x8c, 0xde, 0xef, 0x5d, 0x7f, 0xfe, 0xe7, 0x02, 0x28, 0xb5, 0x01, + 0xa6, 0x39, 0x61, 0x39, 0x41, 0x47, 0x63, 0x4e, 0x74, 0xbc, 0x68, 0xb6, + 0xa0, 0x60, 0xa4, 0x6f, 0xed, 0x00, 0x00, 0x01, 0x00, 0x0f, 0xfe, 0xa3, + 0x04, 0x09, 0x04, 0x8d, 0x00, 0x19, 0x00, 0x5c, 0xb2, 0x12, 0x1a, 0x1b, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x00, 0x02, + 0x11, 0x12, 0x39, 0xb2, 0x05, 0x0c, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x05, + 0x2f, 0xb0, 0x0c, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x18, 0x08, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x19, 0x18, 0x05, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x16, 0x16, + 0x15, 0x14, 0x06, 0x04, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x27, 0x23, 0x35, 0x02, 0x61, 0xfd, 0xf7, 0x03, 0x77, + 0xfe, 0xb4, 0xab, 0xdb, 0x9a, 0xfe, 0xe6, 0xb9, 0xc3, 0xca, 0x39, 0x9b, + 0xa7, 0x9a, 0xb7, 0x9e, 0xa9, 0x62, 0x03, 0xa3, 0xea, 0xa6, 0xfe, 0x8f, + 0x1a, 0xf7, 0xb0, 0xa2, 0xf0, 0x80, 0x67, 0xdd, 0x58, 0xa5, 0x86, 0x80, + 0x7f, 0x02, 0x8a, 0x00, 0x00, 0x02, 0x00, 0x2c, 0xfe, 0xd2, 0x04, 0x74, + 0x04, 0x8c, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x16, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, + 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x06, 0x10, 0xb0, 0x05, 0xd0, 0xb0, 0x05, 0x2f, 0xb2, 0x08, 0x06, + 0x09, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb0, 0x0c, 0xd0, 0xb2, 0x0d, + 0x09, 0x02, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, 0x33, 0x15, 0x23, 0x11, + 0x21, 0x11, 0x21, 0x27, 0x01, 0x21, 0x01, 0x21, 0x11, 0x07, 0x03, 0xd0, + 0xa4, 0xa4, 0xfe, 0xde, 0xfd, 0x8b, 0x0d, 0x02, 0x7f, 0x01, 0x25, 0xfd, + 0x7e, 0x01, 0x60, 0x15, 0xe9, 0xea, 0xfe, 0xd3, 0x01, 0x2d, 0xb7, 0x03, + 0xd6, 0xfc, 0x5d, 0x02, 0x19, 0x25, 0x00, 0x01, 0x00, 0x68, 0xfe, 0xa0, + 0x04, 0x36, 0x04, 0x8c, 0x00, 0x1c, 0x00, 0x60, 0xb2, 0x1a, 0x1d, 0x1e, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb1, 0x03, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x01, 0x0e, + 0x11, 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, 0x07, 0x1a, 0x11, 0x12, + 0x39, 0xb0, 0x0e, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x11, 0x14, 0x1a, 0x11, 0x12, 0x39, 0xb2, + 0x1c, 0x1a, 0x14, 0x11, 0x12, 0x39, 0x30, 0x31, 0x13, 0x13, 0x21, 0x15, + 0x21, 0x03, 0x36, 0x37, 0x32, 0x12, 0x15, 0x14, 0x06, 0x06, 0x23, 0x22, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x07, 0x8c, 0x4a, 0x03, 0x3b, 0xfd, 0xb0, 0x25, 0x52, 0x8d, 0xd3, 0xe8, + 0x88, 0xfa, 0xa8, 0xe8, 0xbc, 0x58, 0x3e, 0xa1, 0x4f, 0x8c, 0x9b, 0x79, + 0x6e, 0x79, 0x39, 0x01, 0x7d, 0x03, 0x0f, 0xf1, 0xfe, 0xd1, 0x2b, 0x02, + 0xfe, 0xff, 0xe9, 0x98, 0xf3, 0x84, 0x78, 0xd4, 0x2f, 0x33, 0x9e, 0x85, + 0x80, 0x92, 0x53, 0x00, 0x00, 0x01, 0x00, 0x3c, 0xfe, 0xd2, 0x04, 0x32, + 0x04, 0x8c, 0x00, 0x06, 0x00, 0x26, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x16, 0x3e, 0x59, 0xb1, + 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x00, 0x03, 0x05, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x01, 0x21, 0x01, + 0x21, 0x35, 0x21, 0x04, 0x32, 0xfd, 0xcb, 0xfe, 0xde, 0x02, 0x26, 0xfd, + 0x3b, 0x03, 0xf6, 0x03, 0xeb, 0xfa, 0xe7, 0x04, 0xd1, 0xe9, 0x00, 0x02, + 0x00, 0x6a, 0x04, 0xc4, 0x03, 0x1c, 0x06, 0xe4, 0x00, 0x0c, 0x00, 0x20, + 0x00, 0x83, 0x00, 0xb0, 0x03, 0x2f, 0xb2, 0x70, 0x03, 0x01, 0x5d, 0xb0, + 0x06, 0xd0, 0xb0, 0x06, 0x2f, 0x40, 0x09, 0x0f, 0x06, 0x1f, 0x06, 0x2f, + 0x06, 0x3f, 0x06, 0x04, 0x5d, 0xb0, 0x03, 0x10, 0xb1, 0x09, 0x0a, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb0, + 0x0c, 0xd0, 0xb0, 0x0c, 0x2f, 0xb0, 0x06, 0x10, 0xb0, 0x10, 0xd0, 0xb0, + 0x10, 0x2f, 0xb0, 0x13, 0xd0, 0xb0, 0x13, 0x2f, 0x40, 0x0f, 0x0f, 0x13, + 0x1f, 0x13, 0x2f, 0x13, 0x3f, 0x13, 0x4f, 0x13, 0x5f, 0x13, 0x6f, 0x13, + 0x07, 0x5d, 0xb0, 0x10, 0x10, 0xb0, 0x16, 0xd0, 0xb0, 0x16, 0x2f, 0xb0, + 0x13, 0x10, 0xb1, 0x1a, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x1d, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1a, 0x10, 0xb0, 0x20, 0xd0, 0x30, + 0x31, 0x01, 0x14, 0x06, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x35, 0x03, 0x1c, + 0xbf, 0xfe, 0xcc, 0xbf, 0xbe, 0x50, 0x4b, 0x49, 0x50, 0x8a, 0x5f, 0x45, + 0x39, 0x88, 0x29, 0x1c, 0x27, 0x78, 0x5e, 0x46, 0x29, 0x9a, 0x26, 0x1c, + 0x27, 0x05, 0xb0, 0x6b, 0x81, 0x81, 0x6b, 0x34, 0x38, 0x38, 0x34, 0x01, + 0x11, 0x4c, 0x69, 0x43, 0x31, 0x25, 0x22, 0x4a, 0x6c, 0x42, 0x31, 0x24, + 0x00, 0x01, 0x00, 0x5a, 0xfe, 0x9b, 0x01, 0x7b, 0x00, 0xcd, 0x00, 0x03, + 0x00, 0x12, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x02, 0xd0, 0xb0, 0x02, 0x2f, + 0xb0, 0x01, 0xd0, 0xb0, 0x01, 0x2f, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, + 0x01, 0x7b, 0xfe, 0xdf, 0x01, 0x21, 0xfe, 0x9b, 0x02, 0x32, 0x00, 0x02, + 0x00, 0x40, 0xff, 0xf0, 0x06, 0x6f, 0x04, 0x9d, 0x00, 0x15, 0x00, 0x1f, + 0x00, 0x99, 0xb2, 0x17, 0x20, 0x21, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x10, + 0xb0, 0x01, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, + 0xb1, 0x0b, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, + 0x1b, 0xb1, 0x0c, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, + 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, + 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x11, 0x00, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, 0x12, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, + 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x15, 0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x19, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, + 0x21, 0x05, 0x22, 0x26, 0x02, 0x27, 0x35, 0x34, 0x12, 0x36, 0x33, 0x05, + 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x05, 0x37, 0x11, + 0x27, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x06, 0x6e, 0xfd, 0x39, 0xfe, + 0xba, 0x9f, 0xf9, 0x88, 0x01, 0x86, 0xf8, 0xa1, 0x01, 0x48, 0x02, 0xc8, + 0xfd, 0xc9, 0x01, 0xe1, 0xfe, 0x1f, 0x02, 0x36, 0xfb, 0xf3, 0xb6, 0xb8, + 0x7c, 0x81, 0x84, 0x10, 0x8c, 0x01, 0x03, 0xa9, 0x34, 0xac, 0x01, 0x06, + 0x8f, 0x10, 0xea, 0xd5, 0xe9, 0xfd, 0x12, 0x09, 0x02, 0xcc, 0x0a, 0xb2, + 0xa6, 0x2e, 0xa3, 0xb6, 0x00, 0x02, 0x00, 0x60, 0xfe, 0xbf, 0x04, 0x5f, + 0x04, 0xa0, 0x00, 0x18, 0x00, 0x24, 0x00, 0x56, 0xb2, 0x19, 0x25, 0x26, + 0x11, 0x12, 0x39, 0xb0, 0x19, 0x10, 0xb0, 0x0b, 0xd0, 0x00, 0xb0, 0x14, + 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x16, + 0x3e, 0x59, 0xb0, 0x14, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x19, 0x0b, 0x14, 0x11, 0x12, 0x39, + 0x7c, 0xb0, 0x19, 0x2f, 0x18, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x1f, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x20, + 0x13, 0x06, 0x23, 0x22, 0x02, 0x35, 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, + 0x12, 0x17, 0x15, 0x14, 0x02, 0x04, 0x23, 0x22, 0x27, 0x37, 0x16, 0x13, + 0x32, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, + 0xf1, 0x01, 0x0f, 0x32, 0x77, 0xa4, 0xcc, 0xeb, 0x7e, 0xe1, 0x8b, 0x9c, + 0xf1, 0x86, 0x02, 0x8f, 0xfe, 0xf4, 0xb1, 0x91, 0x9e, 0x36, 0x78, 0xc6, + 0x95, 0x51, 0x77, 0x6d, 0x61, 0x78, 0x74, 0x58, 0x01, 0x51, 0x57, 0x01, + 0x10, 0xe7, 0x92, 0xef, 0x86, 0x86, 0xff, 0x00, 0xaa, 0xb8, 0xed, 0xfe, + 0xa9, 0xb5, 0x3e, 0xd8, 0x2d, 0x01, 0xd7, 0x56, 0xb2, 0x90, 0xa0, 0xa6, + 0x78, 0x81, 0x99, 0x00, 0x00, 0x01, 0xff, 0x9f, 0xfe, 0x4b, 0x01, 0xa9, + 0x01, 0x02, 0x00, 0x0c, 0x00, 0x28, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb1, + 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x0d, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x0c, 0x2f, 0x30, 0x31, 0x01, 0x11, + 0x06, 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x01, + 0xa9, 0x02, 0xc7, 0xb3, 0x4d, 0x41, 0x0e, 0x2b, 0x37, 0x78, 0x01, 0x02, + 0xfe, 0xd6, 0xbe, 0xcf, 0x11, 0xe7, 0x0c, 0xac, 0x01, 0x1f, 0xff, 0xff, + 0x00, 0x37, 0xfe, 0xa3, 0x04, 0x31, 0x04, 0x8d, 0x01, 0x06, 0x02, 0x4c, + 0x28, 0x00, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, 0x00, 0x61, + 0xfe, 0xa0, 0x04, 0x2f, 0x04, 0x8c, 0x01, 0x06, 0x02, 0x4e, 0xf9, 0x00, + 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, + 0x01, 0x16, 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, 0x00, 0x34, 0xfe, 0xd2, + 0x04, 0x7c, 0x04, 0x8c, 0x01, 0x06, 0x02, 0x4d, 0x08, 0x00, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x16, + 0x3e, 0x59, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x54, + 0x00, 0x00, 0x04, 0x36, 0x04, 0x9d, 0x01, 0x06, 0x02, 0x4b, 0xfc, 0x00, + 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, + 0x11, 0x16, 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, 0x00, 0x4e, 0xfe, 0xd2, + 0x04, 0x44, 0x04, 0x8c, 0x01, 0x06, 0x02, 0x4f, 0x12, 0x00, 0x00, 0x10, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x16, + 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, 0x00, 0x33, 0xff, 0xeb, 0x04, 0x65, + 0x04, 0x9f, 0x01, 0x06, 0x02, 0x65, 0xe7, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x16, 0x3e, 0x59, + 0xb0, 0x12, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5f, 0xff, 0xec, + 0x04, 0x4a, 0x05, 0xbf, 0x03, 0x06, 0x00, 0x1a, 0xfb, 0x00, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, + 0x3e, 0x59, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, + 0xfe, 0xbf, 0x04, 0x55, 0x04, 0xa0, 0x01, 0x06, 0x02, 0x53, 0xf6, 0x00, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, + 0x0b, 0x16, 0x3e, 0x59, 0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x5f, 0xff, 0xec, 0x04, 0x37, 0x05, 0xc4, 0x03, 0x06, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x19, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, + 0x1b, 0xb1, 0x14, 0x18, 0x3e, 0x59, 0xb0, 0x1a, 0xd0, 0xb0, 0x14, 0x10, + 0xb0, 0x26, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0xd9, 0x00, 0x00, + 0x03, 0x52, 0x04, 0x8c, 0x01, 0x06, 0x02, 0x4a, 0x4a, 0x00, 0x00, 0x10, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x16, + 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, 0xff, 0xad, 0xfe, 0x4b, 0x01, 0xb7, + 0x04, 0x3a, 0x02, 0x06, 0x00, 0x9c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xad, + 0xfe, 0x4b, 0x01, 0xb7, 0x04, 0x3a, 0x02, 0x06, 0x00, 0x9c, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x86, 0x00, 0x00, 0x01, 0xa7, 0x04, 0x3a, 0x02, 0x06, + 0x00, 0x8d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0xfe, 0x64, 0x01, 0xa7, + 0x04, 0x3a, 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x06, 0x00, 0xa4, + 0xdb, 0x0a, 0xff, 0xff, 0x00, 0x86, 0x00, 0x00, 0x01, 0xa7, 0x04, 0x3a, + 0x02, 0x06, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xeb, + 0x04, 0x31, 0x04, 0x9c, 0x00, 0x21, 0x00, 0x61, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x16, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x0c, 0x3e, 0x59, + 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb2, 0x19, 0x1f, 0x15, 0x11, 0x12, 0x39, 0xb0, 0x19, 0x2f, 0xb1, 0x08, + 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x19, + 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x15, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x37, 0x26, 0x23, 0x22, + 0x15, 0x11, 0x21, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x03, 0x16, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x02, 0x0e, 0x40, 0x3f, 0x41, + 0x49, 0x70, 0x69, 0x53, 0xae, 0x3b, 0x4e, 0x92, 0xfe, 0xe5, 0x01, 0xdb, + 0xd5, 0x84, 0xdb, 0x64, 0xe2, 0x96, 0xa6, 0xd5, 0xaf, 0x88, 0x69, 0xfc, + 0x30, 0x51, 0x44, 0x4e, 0x40, 0xb5, 0xdb, 0x3b, 0xde, 0xfd, 0x24, 0x02, + 0xec, 0xd7, 0xd9, 0x72, 0x7c, 0xfe, 0xf4, 0x1b, 0xa2, 0x83, 0xac, 0xcb, + 0x3a, 0x00, 0x00, 0x02, 0x00, 0x4c, 0xff, 0xeb, 0x04, 0x7e, 0x04, 0x9f, + 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x48, 0xb2, 0x03, 0x1d, 0x1e, 0x11, 0x12, + 0x39, 0xb0, 0x03, 0x10, 0xb0, 0x19, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x0b, + 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x00, 0x23, 0x22, 0x00, + 0x11, 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x16, 0x12, 0x05, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, + 0x7e, 0xfe, 0xde, 0xf5, 0xf7, 0xfe, 0xdc, 0x82, 0xf5, 0xa2, 0xa0, 0xf4, + 0x85, 0xfe, 0xdf, 0x82, 0x76, 0x75, 0x81, 0x02, 0x83, 0x77, 0x73, 0x81, + 0x02, 0x02, 0x3e, 0xfe, 0xea, 0xfe, 0xc3, 0x01, 0x3e, 0x01, 0x17, 0x0b, + 0xb9, 0x01, 0x0b, 0x90, 0x8d, 0xfe, 0xf3, 0xa5, 0xa0, 0xb6, 0xb2, 0x99, + 0x3f, 0xa2, 0xb6, 0xaf, 0x9e, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, + 0x03, 0xfd, 0x05, 0xb0, 0x00, 0x06, 0x00, 0x33, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, + 0x05, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x00, 0x03, 0x05, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x01, 0x21, 0x01, 0x21, 0x35, 0x21, 0x03, 0xfd, 0xfd, 0xe6, 0xfe, 0xde, + 0x02, 0x1c, 0xfd, 0x5b, 0x03, 0xc5, 0x05, 0x0e, 0xfa, 0xf2, 0x04, 0xc6, + 0xea, 0x00, 0x00, 0x02, 0x00, 0x6f, 0xff, 0xec, 0x04, 0x52, 0x06, 0x00, + 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x66, 0xb2, 0x13, 0x1b, 0x1c, 0x11, 0x12, + 0x39, 0xb0, 0x13, 0x10, 0xb0, 0x0c, 0xd0, 0x00, 0xb0, 0x09, 0x2f, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, + 0x3e, 0x59, 0xb2, 0x05, 0x0c, 0x06, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x0c, + 0x06, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, + 0x01, 0x14, 0x02, 0x23, 0x22, 0x27, 0x07, 0x23, 0x11, 0x21, 0x11, 0x36, + 0x33, 0x32, 0x12, 0x11, 0x25, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, + 0x33, 0x32, 0x36, 0x04, 0x52, 0xef, 0xca, 0xb2, 0x6b, 0x13, 0xfa, 0x01, + 0x21, 0x64, 0xa3, 0xcf, 0xec, 0xfe, 0xdf, 0x75, 0x6e, 0x86, 0x38, 0x3a, + 0x86, 0x6b, 0x76, 0x02, 0x11, 0xf7, 0xfe, 0xd2, 0x8d, 0x79, 0x06, 0x00, + 0xfd, 0xd9, 0x75, 0xfe, 0xd6, 0xfe, 0xfa, 0x08, 0x99, 0xa4, 0x68, 0xfe, + 0x43, 0x69, 0xa1, 0x00, 0x00, 0x01, 0x00, 0x44, 0xff, 0xec, 0x04, 0x0f, + 0x04, 0x4e, 0x00, 0x1a, 0x00, 0x4d, 0xb2, 0x15, 0x1b, 0x1c, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, + 0x07, 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x07, 0x0e, 0x11, 0x12, 0x39, 0xb2, + 0x12, 0x0e, 0x07, 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x10, 0xb1, 0x15, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, + 0x32, 0x36, 0x37, 0x21, 0x06, 0x04, 0x23, 0x22, 0x00, 0x11, 0x35, 0x34, + 0x00, 0x33, 0x32, 0x16, 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, + 0x15, 0x10, 0x02, 0x42, 0x50, 0x69, 0x04, 0x01, 0x10, 0x06, 0xfe, 0xfd, + 0xbf, 0xe9, 0xfe, 0xe6, 0x01, 0x16, 0xeb, 0xcb, 0xf9, 0x06, 0xfe, 0xf0, + 0x04, 0x68, 0x53, 0x69, 0x71, 0x01, 0xd5, 0x59, 0x48, 0xa9, 0xe1, 0x01, + 0x29, 0x01, 0x01, 0x14, 0xf5, 0x01, 0x2f, 0xe7, 0xc0, 0x54, 0x69, 0x9d, + 0x9a, 0x1f, 0xfe, 0xc7, 0x00, 0x02, 0x00, 0x44, 0xff, 0xec, 0x04, 0x26, + 0x06, 0x00, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x66, 0xb2, 0x18, 0x1b, 0x1c, + 0x11, 0x12, 0x39, 0xb0, 0x18, 0x10, 0xb0, 0x04, 0xd0, 0x00, 0xb0, 0x07, + 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, + 0x09, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x04, 0x09, 0x11, 0x12, 0x39, 0xb2, + 0x0b, 0x04, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb1, 0x13, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, + 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0x30, 0x31, 0x13, 0x34, 0x36, 0x36, 0x33, 0x32, 0x17, 0x11, 0x21, 0x11, + 0x23, 0x27, 0x06, 0x23, 0x22, 0x02, 0x25, 0x14, 0x16, 0x33, 0x32, 0x37, + 0x11, 0x26, 0x23, 0x22, 0x06, 0x44, 0x6e, 0xcb, 0x83, 0x9f, 0x66, 0x01, + 0x21, 0xfb, 0x14, 0x6d, 0xac, 0xc3, 0xf7, 0x01, 0x21, 0x78, 0x6a, 0x81, + 0x3d, 0x3c, 0x80, 0x6b, 0x79, 0x02, 0x26, 0xa2, 0xfd, 0x89, 0x75, 0x02, + 0x27, 0xfa, 0x00, 0x79, 0x8d, 0x01, 0x33, 0xf2, 0x8e, 0xad, 0x6a, 0x01, + 0xbd, 0x66, 0xac, 0x00, 0x00, 0x02, 0x00, 0x44, 0xfe, 0x56, 0x04, 0x26, + 0x04, 0x4e, 0x00, 0x17, 0x00, 0x22, 0x00, 0x83, 0xb2, 0x20, 0x23, 0x24, + 0x11, 0x12, 0x39, 0xb0, 0x20, 0x10, 0xb0, 0x0b, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0e, + 0x3e, 0x59, 0xb2, 0x05, 0x06, 0x15, 0x11, 0x12, 0x39, 0xb2, 0x0e, 0x0b, + 0x15, 0x11, 0x12, 0x39, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x13, 0x06, 0x15, 0x11, 0x12, 0x39, 0xb0, + 0x15, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x12, 0x33, 0x32, + 0x17, 0x37, 0x33, 0x11, 0x14, 0x00, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x06, 0x23, 0x22, 0x02, 0x25, 0x14, 0x16, 0x33, 0x32, + 0x37, 0x11, 0x26, 0x23, 0x22, 0x06, 0x44, 0xf4, 0xc7, 0xb5, 0x66, 0x11, + 0xfb, 0xfe, 0xee, 0xf9, 0xb7, 0x8b, 0x2e, 0x82, 0x73, 0x88, 0x81, 0x64, + 0xa4, 0xc2, 0xf7, 0x01, 0x21, 0x7a, 0x68, 0x82, 0x3c, 0x39, 0x83, 0x6a, + 0x7a, 0x02, 0x27, 0xfa, 0x01, 0x2d, 0x81, 0x6d, 0xfc, 0x1b, 0xf4, 0xfe, + 0xf5, 0x4b, 0xcf, 0x39, 0x8a, 0x9e, 0x73, 0x01, 0x31, 0xf5, 0x91, 0xab, + 0x66, 0x01, 0xc5, 0x62, 0xa9, 0x00, 0x00, 0x02, 0x00, 0x3c, 0xff, 0xec, + 0x04, 0x60, 0x04, 0x4e, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x45, 0xb2, 0x04, + 0x1c, 0x1d, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb0, 0x13, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, + 0x3e, 0x59, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x36, 0x33, + 0x32, 0x00, 0x11, 0x15, 0x14, 0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x05, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x3c, + 0x84, 0xf2, 0x9b, 0xec, 0x01, 0x27, 0x83, 0xf1, 0x9d, 0xef, 0xfe, 0xdc, + 0x01, 0x21, 0x83, 0x6f, 0x6e, 0x82, 0x82, 0x70, 0x6e, 0x82, 0x02, 0x27, + 0x9e, 0xfd, 0x8c, 0xfe, 0xd0, 0xff, 0x00, 0x0c, 0xa0, 0xfb, 0x8b, 0x01, + 0x32, 0xfd, 0x09, 0x95, 0xa8, 0xab, 0xa7, 0x8d, 0xb0, 0xae, 0x00, 0x02, + 0x00, 0x6f, 0xfe, 0x60, 0x04, 0x51, 0x04, 0x4e, 0x00, 0x10, 0x00, 0x1b, + 0x00, 0x70, 0xb2, 0x19, 0x1c, 0x1d, 0x11, 0x12, 0x39, 0xb0, 0x19, 0x10, + 0xb0, 0x0d, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, + 0xb1, 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, + 0x1b, 0xb1, 0x0a, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, + 0x2f, 0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x0d, 0x04, + 0x11, 0x12, 0x39, 0xb2, 0x0b, 0x0d, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x0d, + 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x06, 0x23, 0x22, + 0x27, 0x11, 0x21, 0x11, 0x21, 0x17, 0x36, 0x33, 0x32, 0x12, 0x17, 0x05, + 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x36, 0x04, 0x51, + 0x6d, 0xc9, 0x82, 0xa4, 0x65, 0xfe, 0xdf, 0x01, 0x09, 0x0c, 0x69, 0xaa, + 0xc9, 0xef, 0x02, 0xfe, 0xdf, 0x7c, 0x69, 0x83, 0x38, 0x3a, 0x83, 0x68, + 0x7b, 0x02, 0x12, 0x9e, 0xfd, 0x8b, 0x72, 0xfe, 0x02, 0x05, 0xda, 0x6c, + 0x80, 0xfe, 0xd7, 0xf8, 0x06, 0x93, 0xa9, 0x61, 0xfe, 0x35, 0x62, 0xab, + 0x00, 0x02, 0x00, 0x44, 0xfe, 0x60, 0x04, 0x26, 0x04, 0x4e, 0x00, 0x0f, + 0x00, 0x1a, 0x00, 0x6d, 0xb2, 0x18, 0x1b, 0x1c, 0x11, 0x12, 0x39, 0xb0, + 0x18, 0x10, 0xb0, 0x03, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, + 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb2, 0x05, + 0x03, 0x0c, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x03, 0x0c, 0x11, 0x12, 0x39, + 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, + 0x33, 0x11, 0x21, 0x11, 0x06, 0x23, 0x22, 0x02, 0x35, 0x05, 0x14, 0x16, + 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x06, 0x44, 0xf2, 0xcb, 0xac, + 0x6a, 0x14, 0xfb, 0xfe, 0xde, 0x65, 0xa0, 0xc4, 0xf7, 0x01, 0x21, 0x7b, + 0x68, 0x81, 0x3b, 0x3a, 0x80, 0x6a, 0x7b, 0x02, 0x26, 0xfa, 0x01, 0x2e, + 0x85, 0x71, 0xfa, 0x26, 0x01, 0xfb, 0x6f, 0x01, 0x31, 0xfc, 0x08, 0x90, + 0xac, 0x5f, 0x01, 0xd2, 0x5e, 0xac, 0x00, 0x02, 0x00, 0x48, 0xff, 0xec, + 0x04, 0x1e, 0x04, 0x4e, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x71, 0xb2, 0x0f, + 0x1f, 0x20, 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x10, 0xb0, 0x17, 0xd0, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, + 0x3e, 0x59, 0xb2, 0x1b, 0x08, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x1b, 0x2f, + 0xb2, 0x8f, 0x1b, 0x01, 0x5d, 0xb4, 0x1f, 0x1b, 0x2f, 0x1b, 0x02, 0x71, + 0xb1, 0x0c, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x13, 0x00, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x08, + 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x05, 0x22, 0x00, 0x35, 0x35, 0x34, 0x36, 0x36, 0x33, + 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, + 0x06, 0x06, 0x03, 0x22, 0x06, 0x07, 0x21, 0x35, 0x34, 0x26, 0x02, 0x73, + 0xf8, 0xfe, 0xcd, 0x7e, 0xe6, 0x95, 0xdf, 0xfe, 0xfd, 0x4f, 0x11, 0x9e, + 0x7f, 0x47, 0x9d, 0x3a, 0x37, 0x44, 0xcb, 0xa0, 0x56, 0x6d, 0x0f, 0x01, + 0x93, 0x63, 0x14, 0x01, 0x29, 0xf0, 0x1f, 0xa1, 0xff, 0x8a, 0xfe, 0xee, + 0xfd, 0x80, 0x73, 0x77, 0x27, 0x20, 0xc9, 0x30, 0x37, 0x03, 0x78, 0x75, + 0x6b, 0x1a, 0x62, 0x64, 0x00, 0x02, 0x00, 0x42, 0xfe, 0x56, 0x04, 0x11, + 0x04, 0x4e, 0x00, 0x18, 0x00, 0x23, 0x00, 0x83, 0xb2, 0x21, 0x24, 0x25, + 0x11, 0x12, 0x39, 0xb0, 0x21, 0x10, 0xb0, 0x11, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0e, + 0x3e, 0x59, 0xb2, 0x05, 0x06, 0x16, 0x11, 0x12, 0x39, 0xb2, 0x0e, 0x0b, + 0x16, 0x11, 0x12, 0x39, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x06, 0x16, 0x11, 0x12, 0x39, 0xb0, + 0x16, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x12, 0x33, 0x32, + 0x17, 0x37, 0x33, 0x11, 0x14, 0x00, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x35, 0x06, 0x23, 0x22, 0x02, 0x25, 0x14, 0x16, 0x33, + 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x06, 0x42, 0xe3, 0xc5, 0xb5, 0x66, + 0x11, 0xfb, 0xfe, 0xec, 0xf7, 0xb2, 0x85, 0x2d, 0x7f, 0x6b, 0x89, 0x81, + 0x66, 0xa2, 0xc0, 0xe6, 0x01, 0x22, 0x6a, 0x64, 0x86, 0x38, 0x37, 0x85, + 0x66, 0x6a, 0x02, 0x27, 0xff, 0x01, 0x28, 0x81, 0x6d, 0xfc, 0x16, 0xf3, + 0xfe, 0xf9, 0x46, 0xcf, 0x34, 0x88, 0x8c, 0x14, 0x73, 0x01, 0x2c, 0xfa, + 0x99, 0xa3, 0x6f, 0x01, 0xb3, 0x6b, 0xa1, 0x00, 0xff, 0xff, 0x00, 0x66, + 0x00, 0x00, 0x02, 0xe0, 0x05, 0xb2, 0x00, 0x06, 0x00, 0x15, 0xbf, 0x00, + 0x00, 0x03, 0x00, 0x56, 0xff, 0xed, 0x04, 0xdd, 0x04, 0x9d, 0x00, 0x1d, + 0x00, 0x26, 0x00, 0x33, 0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0c, 0x3e, 0x59, 0xb2, 0x14, + 0x0d, 0x00, 0x11, 0x12, 0x39, 0xb2, 0x1c, 0x00, 0x0d, 0x11, 0x12, 0x39, + 0xb0, 0x00, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x21, 0x00, 0x0d, 0x11, 0x12, 0x39, 0xb2, 0x2a, + 0x0d, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb1, 0x31, 0x09, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x22, + 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x07, 0x07, 0x17, 0x36, 0x35, 0x33, 0x14, 0x07, + 0x17, 0x21, 0x27, 0x06, 0x27, 0x32, 0x37, 0x27, 0x07, 0x06, 0x15, 0x14, + 0x16, 0x03, 0x14, 0x16, 0x17, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x02, 0x12, 0xc8, 0xf4, 0x51, 0x2c, 0x71, 0x51, 0x3f, 0xc6, + 0x9d, 0xa7, 0xc6, 0xb3, 0x36, 0xcf, 0x34, 0xf7, 0x80, 0xc8, 0xfe, 0xc7, + 0x3b, 0x98, 0xba, 0x5b, 0x47, 0xdc, 0x2c, 0x3a, 0x53, 0x1d, 0x2e, 0x26, + 0x29, 0x2e, 0x30, 0x3e, 0x31, 0x36, 0x36, 0x13, 0xaf, 0x8b, 0x6f, 0x55, + 0x2f, 0x47, 0x53, 0x80, 0x4b, 0x7a, 0xa4, 0xa6, 0x88, 0x96, 0x75, 0x23, + 0xcf, 0x54, 0x70, 0xdb, 0x94, 0xc7, 0x3b, 0x4e, 0xe6, 0x18, 0xdc, 0x1d, + 0x2a, 0x3a, 0x36, 0x3d, 0x02, 0x8e, 0x21, 0x40, 0x26, 0x1b, 0x1c, 0x36, + 0x25, 0x23, 0x32, 0x3a, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x03, 0xae, + 0x04, 0x8d, 0x00, 0x0d, 0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb2, 0x0d, 0x04, + 0x0b, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x2f, 0xb1, 0x00, 0x02, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x04, + 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x01, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x0d, 0x10, 0xb0, 0x0c, + 0xd0, 0xb0, 0x09, 0xd0, 0xb0, 0x08, 0xd0, 0x30, 0x31, 0x01, 0x07, 0x11, + 0x21, 0x15, 0x21, 0x11, 0x07, 0x35, 0x37, 0x11, 0x21, 0x11, 0x37, 0x02, + 0x90, 0xf5, 0x02, 0x13, 0xfc, 0xcb, 0x72, 0x72, 0x01, 0x22, 0xf5, 0x02, + 0xa8, 0x47, 0xfe, 0x87, 0xe8, 0x02, 0x0e, 0x21, 0xa6, 0x21, 0x01, 0xd9, + 0xfe, 0x7a, 0x47, 0x00, 0x00, 0x02, 0xff, 0xd7, 0x00, 0x00, 0x06, 0x12, + 0x04, 0x8d, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x88, 0xb2, 0x05, 0x13, 0x14, + 0x11, 0x12, 0x39, 0xb0, 0x05, 0x10, 0xb0, 0x11, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, + 0x59, 0xb2, 0x0f, 0x0a, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x2f, 0xb1, + 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x04, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb2, 0x11, 0x0a, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x2f, + 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x0a, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x12, 0x0a, 0x04, 0x11, 0x12, 0x39, 0x30, 0x31, + 0x01, 0x21, 0x13, 0x21, 0x15, 0x21, 0x27, 0x21, 0x07, 0x21, 0x01, 0x21, + 0x15, 0x21, 0x17, 0x21, 0x01, 0x33, 0x03, 0x05, 0xa8, 0xfe, 0x45, 0x0b, + 0x02, 0x1a, 0xfc, 0xd0, 0x09, 0xfe, 0x9e, 0x68, 0xfe, 0xc8, 0x02, 0x48, + 0x03, 0xc5, 0xfd, 0xf8, 0x08, 0x01, 0xc4, 0xfc, 0x3a, 0xee, 0x12, 0x01, + 0xe9, 0xfe, 0xfe, 0xe7, 0xe1, 0xe1, 0x04, 0x8d, 0xe8, 0xd4, 0xfe, 0xf5, + 0x01, 0xda, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 0x03, 0xe7, 0x04, 0x8d, + 0x00, 0x0c, 0x00, 0x15, 0x00, 0x59, 0xb2, 0x15, 0x16, 0x17, 0x11, 0x12, + 0x39, 0xb0, 0x15, 0x10, 0xb0, 0x09, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb2, 0x02, + 0x00, 0x0b, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb2, 0x0f, 0x00, 0x0b, + 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x2f, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x0d, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, + 0x21, 0x15, 0x33, 0x32, 0x04, 0x15, 0x14, 0x04, 0x07, 0x23, 0x15, 0x21, + 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x63, 0x01, 0x22, + 0x7d, 0xde, 0x01, 0x07, 0xfe, 0xfd, 0xdb, 0x84, 0xfe, 0xde, 0x01, 0x22, + 0x81, 0x5a, 0x67, 0x68, 0x55, 0x04, 0x8d, 0xa4, 0xd7, 0xae, 0xb2, 0xd5, + 0x01, 0xdc, 0x03, 0x00, 0xfe, 0xc5, 0x53, 0x4a, 0x48, 0x55, 0x01, 0x00, + 0x00, 0x03, 0x00, 0x40, 0xff, 0xc9, 0x04, 0x7e, 0x04, 0xbf, 0x00, 0x17, + 0x00, 0x20, 0x00, 0x29, 0x00, 0x6a, 0xb2, 0x07, 0x2a, 0x2b, 0x11, 0x12, + 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x1d, 0xd0, 0xb0, 0x07, 0x10, 0xb0, 0x26, + 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, + 0x07, 0x0c, 0x3e, 0x59, 0xb2, 0x1a, 0x13, 0x07, 0x11, 0x12, 0x39, 0xb2, + 0x1b, 0x13, 0x07, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x10, 0xb1, 0x1d, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x23, 0x13, + 0x07, 0x11, 0x12, 0x39, 0xb2, 0x24, 0x07, 0x13, 0x11, 0x12, 0x39, 0xb0, + 0x07, 0x10, 0xb1, 0x26, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x01, 0x16, 0x17, 0x15, 0x14, 0x02, 0x06, 0x23, + 0x22, 0x27, 0x07, 0x23, 0x37, 0x26, 0x27, 0x35, 0x34, 0x12, 0x36, 0x33, + 0x32, 0x17, 0x37, 0x33, 0x01, 0x14, 0x17, 0x01, 0x26, 0x23, 0x22, 0x06, + 0x15, 0x21, 0x34, 0x27, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x03, 0xee, + 0x8c, 0x04, 0x86, 0xf9, 0x9e, 0xa2, 0x82, 0x51, 0xa8, 0x8e, 0x8f, 0x03, + 0x86, 0xf8, 0xa1, 0xa5, 0x80, 0x50, 0xa8, 0xfc, 0xe6, 0x1b, 0x01, 0x75, + 0x3d, 0x56, 0x7c, 0x81, 0x01, 0xfa, 0x1a, 0xfe, 0x8d, 0x3b, 0x57, 0x74, + 0x87, 0x03, 0xf9, 0x99, 0xf7, 0x3a, 0xab, 0xfe, 0xfa, 0x8e, 0x4a, 0x71, + 0xc6, 0x9a, 0xfd, 0x36, 0xac, 0x01, 0x06, 0x8f, 0x4d, 0x6f, 0xfd, 0x70, + 0x68, 0x4b, 0x02, 0x08, 0x31, 0xb2, 0xa6, 0x64, 0x49, 0xfd, 0xfb, 0x2f, + 0xb4, 0xa8, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0xf9, 0x04, 0x8d, + 0x00, 0x13, 0x00, 0x17, 0x00, 0x91, 0xb2, 0x05, 0x18, 0x19, 0x11, 0x12, + 0x39, 0xb0, 0x05, 0x10, 0xb0, 0x14, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x16, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, + 0xb2, 0x13, 0x0c, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x2f, 0xb6, 0x0f, + 0x13, 0x1f, 0x13, 0x2f, 0x13, 0x03, 0x5d, 0xb1, 0x00, 0x07, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x15, 0x0c, 0x02, 0x11, + 0x12, 0x39, 0xb0, 0x15, 0x2f, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x08, 0xd0, 0xb0, + 0x13, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x13, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, + 0x00, 0x10, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x21, 0x35, + 0x21, 0x15, 0x33, 0x01, 0x21, 0x35, 0x21, 0x04, 0xf9, 0x5a, 0xfe, 0xe0, + 0xfe, 0x33, 0xfe, 0xde, 0x5a, 0x5a, 0x01, 0x22, 0x01, 0xcd, 0x01, 0x20, + 0x5a, 0xfc, 0xb9, 0x01, 0xcd, 0xfe, 0x33, 0x03, 0x51, 0xfc, 0xaf, 0x01, + 0xc6, 0xfe, 0x3a, 0x03, 0x51, 0xb7, 0x85, 0x85, 0x85, 0x85, 0xfe, 0xa7, + 0xa2, 0x00, 0x00, 0x01, 0x00, 0x63, 0xfe, 0x4b, 0x04, 0x72, 0x04, 0x8d, + 0x00, 0x13, 0x00, 0x5b, 0xb2, 0x02, 0x14, 0x15, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x16, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, + 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, + 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x0c, 0x00, 0x11, + 0x12, 0x39, 0xb2, 0x0e, 0x0c, 0x00, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, + 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x35, 0x01, 0x11, 0x21, 0x11, + 0x21, 0x01, 0x11, 0x21, 0x11, 0x06, 0x06, 0x02, 0xf6, 0x4f, 0x41, 0x0e, + 0x2d, 0x37, 0x78, 0xfe, 0x35, 0xfe, 0xde, 0x01, 0x22, 0x01, 0xcc, 0x01, + 0x21, 0x01, 0xc7, 0xfe, 0x4b, 0x11, 0xe7, 0x0c, 0xac, 0x1e, 0x02, 0xd5, + 0xfd, 0x2a, 0x04, 0x8d, 0xfd, 0x29, 0x02, 0xd7, 0xfb, 0x4f, 0xc0, 0xd1, + 0xff, 0xff, 0x00, 0x6e, 0x01, 0xfb, 0x02, 0xa1, 0x02, 0xe4, 0x02, 0x06, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x00, 0x00, 0x04, 0xf9, + 0x05, 0xb0, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x5f, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, + 0x04, 0x00, 0x05, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb2, 0x9f, 0x04, + 0x01, 0x5d, 0xb1, 0x01, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x11, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x12, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, + 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x04, 0x10, 0xb0, 0x1c, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, 0x35, 0x33, + 0x11, 0x21, 0x32, 0x04, 0x12, 0x15, 0x15, 0x14, 0x02, 0x04, 0x07, 0x13, + 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, + 0x33, 0xa0, 0xb4, 0xb4, 0x01, 0xc0, 0xc0, 0x01, 0x2f, 0xaa, 0xa7, 0xfe, + 0xd0, 0xbf, 0x44, 0xdb, 0x91, 0xb2, 0xba, 0xb8, 0xb1, 0x94, 0xdb, 0x02, + 0x82, 0xb7, 0x02, 0x77, 0xad, 0xfe, 0xc1, 0xcb, 0x43, 0xcb, 0xfe, 0xc4, + 0xae, 0x01, 0x02, 0x82, 0xfe, 0x6f, 0xeb, 0xda, 0x44, 0xde, 0xe5, 0xfe, + 0x7c, 0x00, 0x00, 0x02, 0xff, 0xec, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xb0, + 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb2, 0x04, 0x00, + 0x05, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb2, 0x6f, 0x04, 0x01, 0x71, + 0xb2, 0x9f, 0x04, 0x01, 0x5d, 0xb1, 0x01, 0x07, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x11, 0xd0, 0xb0, 0x00, 0x10, 0xb1, + 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x05, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x1c, 0xd0, 0x30, 0x31, 0x33, 0x11, + 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x04, 0x12, 0x15, 0x15, 0x14, 0x02, + 0x04, 0x07, 0x13, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, + 0x23, 0x23, 0x11, 0x33, 0xa0, 0xb4, 0xb4, 0x01, 0xc0, 0xc0, 0x01, 0x2f, + 0xaa, 0xa7, 0xfe, 0xd0, 0xbf, 0x44, 0xdb, 0x91, 0xb2, 0xba, 0xb8, 0xb1, + 0x94, 0xdb, 0x02, 0x82, 0xb7, 0x02, 0x77, 0xad, 0xfe, 0xc1, 0xcb, 0x43, + 0xcb, 0xfe, 0xc4, 0xae, 0x01, 0x02, 0x82, 0xfe, 0x6f, 0xeb, 0xda, 0x44, + 0xde, 0xe5, 0xfe, 0x7c, 0x00, 0x01, 0xff, 0xcb, 0x00, 0x00, 0x04, 0x2d, + 0x06, 0x00, 0x00, 0x18, 0x00, 0x76, 0xb2, 0x0c, 0x19, 0x1a, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x15, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, + 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb2, 0x2f, 0x15, 0x01, + 0x5d, 0xb2, 0x0f, 0x15, 0x01, 0x5d, 0xb2, 0x18, 0x0f, 0x15, 0x11, 0x12, + 0x39, 0xb0, 0x18, 0x2f, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x04, 0x07, 0x11, 0x12, 0x39, 0xb0, + 0x04, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x18, 0x10, 0xb0, + 0x13, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x15, 0x36, 0x33, 0x20, 0x13, 0x11, + 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x11, 0x23, 0x35, + 0x33, 0x35, 0x21, 0x15, 0x33, 0x02, 0x86, 0xdf, 0x73, 0xae, 0x01, 0x60, + 0x05, 0xfe, 0xdf, 0x50, 0x5d, 0x7f, 0x39, 0xfe, 0xdf, 0xbb, 0xbb, 0x01, + 0x21, 0xdf, 0x04, 0xc0, 0xfc, 0x8a, 0xfe, 0x67, 0xfd, 0x4b, 0x02, 0xad, + 0x5d, 0x59, 0x62, 0xfc, 0xff, 0x04, 0xc0, 0xb7, 0x89, 0x89, 0x00, 0x01, + 0x00, 0x28, 0x00, 0x00, 0x04, 0xca, 0x05, 0xb0, 0x00, 0x0f, 0x00, 0x4e, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x0c, 0x3e, 0x59, 0xb2, 0x0f, 0x0a, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x0f, + 0x2f, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x0a, + 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x0c, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, + 0x35, 0x33, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x33, 0x03, 0xc4, + 0xb8, 0xfe, 0xd4, 0xd7, 0xd7, 0xfe, 0x48, 0x04, 0xa2, 0xfe, 0x42, 0xb8, + 0x02, 0xed, 0xfd, 0x13, 0x02, 0xed, 0xb7, 0x01, 0x19, 0xf3, 0xf3, 0xfe, + 0xe7, 0x00, 0x00, 0x01, 0xff, 0xe2, 0xff, 0xec, 0x02, 0x9d, 0x05, 0x44, + 0x00, 0x1c, 0x00, 0x83, 0xb2, 0x00, 0x1d, 0x1e, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, + 0x0c, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, + 0xb0, 0x01, 0x10, 0xb1, 0x03, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x1a, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x06, + 0x2f, 0xb1, 0x07, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x11, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb0, 0x14, 0xd0, 0xb0, 0x06, + 0x10, 0xb0, 0x16, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x19, + 0xd0, 0x30, 0x31, 0x01, 0x11, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x03, 0x35, + 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x01, 0xc9, 0xb9, 0xb9, + 0xd4, 0xd4, 0x2e, 0x41, 0x30, 0x25, 0x55, 0x5a, 0xfe, 0xd1, 0x07, 0xc6, + 0xc6, 0x9e, 0x9e, 0x05, 0x44, 0xfe, 0xf6, 0xd4, 0x9b, 0xb7, 0xca, 0x3c, + 0x34, 0x07, 0xdb, 0x1a, 0x01, 0x31, 0xf7, 0xb7, 0x9b, 0xd4, 0x01, 0x0a, + 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x07, 0x36, 0x02, 0x26, + 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x01, 0x0f, 0x01, 0x36, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x07, 0x36, 0x02, 0x26, 0x00, 0x25, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0xc4, 0x01, 0x36, 0x00, 0x09, + 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x07, 0x36, 0x02, 0x26, 0x00, 0x25, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x00, 0xbd, 0x01, 0x36, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, + 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, + 0x00, 0x00, 0x05, 0x5c, 0x07, 0x33, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa5, 0x00, 0xc6, 0x01, 0x34, 0x00, 0x09, 0x00, 0xb0, + 0x04, 0x2f, 0xb0, 0x16, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, + 0x00, 0x00, 0x05, 0x5c, 0x07, 0x0a, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x6a, 0x00, 0xd8, 0x01, 0x36, 0xff, 0xff, 0x00, 0x07, + 0x00, 0x00, 0x05, 0x5c, 0x07, 0x8f, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa3, 0x01, 0x5f, 0x01, 0x95, 0x00, 0x0c, 0x00, 0xb0, + 0x04, 0x2f, 0xb0, 0x14, 0xdc, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x07, 0xce, 0x02, 0x26, 0x00, 0x25, + 0x00, 0x00, 0x01, 0x07, 0x02, 0x27, 0x01, 0x5a, 0x01, 0x0d, 0x00, 0x12, + 0x00, 0xb2, 0x2f, 0x0d, 0x01, 0x5d, 0xb2, 0x2f, 0x18, 0x01, 0x5d, 0xb2, + 0x2f, 0x1e, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x56, 0xfe, 0x31, + 0x04, 0xfb, 0x05, 0xc4, 0x02, 0x26, 0x00, 0x27, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x79, 0x01, 0xc4, 0xff, 0xff, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, + 0x04, 0x52, 0x07, 0x39, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x44, 0x00, 0xd6, 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0d, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, + 0x07, 0x39, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x01, 0x8b, 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x07, 0x39, + 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x00, 0x84, + 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x10, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x07, 0x0d, 0x02, 0x26, + 0x00, 0x29, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0x9f, 0x01, 0x39, + 0xff, 0xff, 0xff, 0xba, 0x00, 0x00, 0x01, 0xc1, 0x07, 0x39, 0x02, 0x26, + 0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0xff, 0x86, 0x01, 0x39, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, + 0x02, 0x18, 0x3e, 0x59, 0xb0, 0x05, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x95, 0x00, 0x00, 0x02, 0x9f, 0x07, 0x39, 0x02, 0x26, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x00, 0x3a, 0x01, 0x39, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, + 0x3e, 0x59, 0xb0, 0x06, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xaf, + 0x00, 0x00, 0x02, 0xab, 0x07, 0x39, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x9e, 0xff, 0x34, 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, + 0xb0, 0x08, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xad, 0x00, 0x00, + 0x02, 0xa9, 0x07, 0x0d, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x6a, 0xff, 0x4f, 0x01, 0x39, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, + 0x05, 0x22, 0x07, 0x33, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa5, 0x00, 0xe8, 0x01, 0x34, 0x00, 0x09, 0x00, 0xb0, 0x05, 0x2f, + 0xb0, 0x15, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, + 0x05, 0x2e, 0x07, 0x36, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x44, 0x01, 0x1d, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x20, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, + 0x07, 0x36, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x01, 0xd2, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x21, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, 0x07, 0x36, + 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x00, 0xcb, + 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, + 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x23, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, 0x07, 0x33, 0x02, 0x26, + 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa5, 0x00, 0xd4, 0x01, 0x34, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x22, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, 0x07, 0x0a, 0x02, 0x26, 0x00, 0x33, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0xe6, 0x01, 0x36, 0xff, 0xff, + 0x00, 0x74, 0xff, 0xec, 0x04, 0xd0, 0x07, 0x36, 0x02, 0x26, 0x00, 0x39, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x00, 0xf9, 0x01, 0x36, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, + 0x3e, 0x59, 0xb0, 0x12, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, + 0xff, 0xec, 0x04, 0xd0, 0x07, 0x36, 0x02, 0x26, 0x00, 0x39, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0xae, 0x01, 0x36, 0x00, 0x09, 0x00, 0xb0, + 0x00, 0x2f, 0xb0, 0x13, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, + 0xff, 0xec, 0x04, 0xd0, 0x07, 0x36, 0x02, 0x26, 0x00, 0x39, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x9e, 0x00, 0xa7, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, 0x3e, 0x59, + 0xb0, 0x15, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, 0xff, 0xec, + 0x04, 0xd0, 0x07, 0x0a, 0x02, 0x26, 0x00, 0x39, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x6a, 0x00, 0xc2, 0x01, 0x36, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, + 0x04, 0xef, 0x07, 0x36, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x75, 0x01, 0x8b, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x0b, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, + 0x06, 0x00, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, + 0x00, 0x82, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x2a, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, + 0x06, 0x00, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x01, 0x37, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x2c, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, + 0x06, 0x00, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, + 0x30, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, + 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x2e, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, 0x05, 0xfe, 0x02, 0x26, + 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa5, 0x39, 0xff, 0x00, 0x09, + 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x35, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, 0x05, 0xd4, 0x02, 0x26, 0x00, 0x45, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x4b, 0x00, 0xff, 0xff, 0x00, 0x44, + 0xff, 0xec, 0x04, 0x06, 0x06, 0x59, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa3, 0x00, 0xd2, 0x00, 0x5f, 0x00, 0x0c, 0x00, 0xb0, + 0x17, 0x2f, 0xb0, 0x33, 0xdc, 0xb0, 0x36, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, 0x06, 0x99, 0x02, 0x26, 0x00, 0x45, + 0x00, 0x00, 0x01, 0x07, 0x02, 0x27, 0x00, 0xcd, 0xff, 0xd8, 0x00, 0x3f, + 0x00, 0xb2, 0x00, 0x2c, 0x01, 0x71, 0xb2, 0x30, 0x2c, 0x01, 0x5d, 0xb2, + 0x70, 0x2c, 0x01, 0x5d, 0xb2, 0x50, 0x2c, 0x01, 0x5d, 0xb2, 0x70, 0x37, + 0x01, 0x5d, 0xb2, 0x00, 0x37, 0x01, 0x71, 0xb2, 0x50, 0x37, 0x01, 0x5d, + 0xb2, 0x30, 0x37, 0x01, 0x5d, 0xb2, 0x00, 0x3d, 0x01, 0x71, 0xb2, 0x30, + 0x3d, 0x01, 0x5d, 0xb2, 0x70, 0x3d, 0x01, 0x5d, 0xb2, 0x50, 0x3d, 0x01, + 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xfe, 0x31, 0x03, 0xf6, + 0x04, 0x4e, 0x02, 0x26, 0x00, 0x47, 0x00, 0x00, 0x00, 0x07, 0x00, 0x79, + 0x01, 0x41, 0xff, 0xff, 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, + 0x06, 0x00, 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x06, 0x00, 0x44, + 0x7b, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x1e, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x30, + 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x20, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, 0x29, 0x00, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x22, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x05, 0xd4, 0x02, 0x26, 0x00, 0x49, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x44, 0x00, 0xff, 0xff, 0xff, 0xa8, + 0x00, 0x00, 0x01, 0xa9, 0x05, 0xf1, 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x44, 0xff, 0x74, 0xff, 0xf1, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, + 0xb0, 0x05, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x86, 0x00, 0x00, + 0x02, 0x8d, 0x05, 0xf1, 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x75, 0x28, 0xf1, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x06, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0xff, 0x9d, 0x00, 0x00, 0x02, 0x99, 0x05, 0xf1, + 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0xff, 0x22, + 0xff, 0xf1, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x08, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0xff, 0x9b, 0x00, 0x00, 0x02, 0x97, 0x05, 0xc5, 0x02, 0x26, + 0x00, 0x8d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0xff, 0x3d, 0xff, 0xf1, + 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x04, 0x0f, 0x05, 0xfe, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa5, 0x51, 0xff, 0x00, 0x09, + 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x1d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, 0x06, 0x00, 0x02, 0x26, 0x00, 0x53, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x09, + 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x1a, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, 0x06, 0x00, 0x02, 0x26, 0x00, 0x53, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x50, 0x00, 0x00, 0x00, 0x09, + 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x1c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, 0x06, 0x00, 0x02, 0x26, 0x00, 0x53, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, 0x49, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, + 0xb0, 0x1e, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, + 0x04, 0x43, 0x05, 0xfe, 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x01, 0x06, + 0x00, 0xa5, 0x52, 0xff, 0x00, 0x09, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x25, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, + 0x05, 0xd4, 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, + 0x64, 0x00, 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, 0x04, 0x0f, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x59, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x00, 0x97, + 0x00, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, + 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x12, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, 0x04, 0x0f, 0x06, 0x00, 0x02, 0x26, + 0x00, 0x59, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x4c, 0x00, 0x00, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, + 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x13, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x68, 0xff, 0xec, 0x04, 0x0f, 0x06, 0x00, 0x02, 0x26, 0x00, 0x59, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, 0x45, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, + 0xb0, 0x15, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, + 0x04, 0x0f, 0x05, 0xd4, 0x02, 0x26, 0x00, 0x59, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x6a, 0x60, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x4b, 0x04, 0x01, + 0x06, 0x00, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x01, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x13, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x4b, 0x04, 0x01, + 0x05, 0xd4, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, + 0x2c, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x06, 0xe2, + 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x00, 0x70, 0x00, 0xb5, + 0x01, 0x34, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, 0x05, 0xad, 0x02, 0x26, + 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x00, 0x70, 0x28, 0xff, 0x00, 0x09, + 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x2a, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x07, 0x2c, 0x02, 0x26, 0x00, 0x25, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x00, 0xf1, 0x01, 0x36, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, + 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x44, + 0xff, 0xec, 0x04, 0x06, 0x05, 0xf6, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, + 0x01, 0x06, 0x00, 0xa1, 0x64, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x2d, + 0xdc, 0x30, 0x31, 0x00, 0x00, 0x02, 0x00, 0x07, 0xfe, 0x5a, 0x05, 0x5c, + 0x05, 0xb0, 0x00, 0x16, 0x00, 0x19, 0x00, 0x77, 0xb2, 0x19, 0x1a, 0x1b, + 0x11, 0x12, 0x39, 0xb0, 0x19, 0x10, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0e, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0c, + 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, + 0x1b, 0xdc, 0x59, 0xb0, 0x01, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x11, 0x2f, + 0xb2, 0x18, 0x00, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x18, 0x2f, 0xb1, 0x12, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x19, + 0x00, 0x01, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x01, 0x23, 0x06, 0x06, + 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x37, 0x03, 0x21, 0x03, 0x21, 0x01, 0x03, 0x21, 0x03, 0x03, 0x3b, 0x02, + 0x21, 0x54, 0x4a, 0x50, 0x42, 0x21, 0x2f, 0x1d, 0x49, 0x5c, 0x64, 0x7f, + 0x84, 0x61, 0xfd, 0xf2, 0x64, 0xfe, 0xc1, 0x02, 0x1e, 0x2a, 0x01, 0x6c, + 0xb7, 0x05, 0xb0, 0xfa, 0x50, 0x2a, 0x51, 0x35, 0x41, 0x14, 0x9d, 0x2c, + 0x6f, 0x62, 0x87, 0x59, 0x01, 0x21, 0xfe, 0xd4, 0x05, 0xb0, 0xfc, 0x6f, + 0x02, 0x21, 0x00, 0x02, 0x00, 0x44, 0xfe, 0x5a, 0x04, 0x06, 0x04, 0x4e, + 0x00, 0x2d, 0x00, 0x38, 0x00, 0xa6, 0xb2, 0x17, 0x39, 0x3a, 0x11, 0x12, + 0x39, 0xb0, 0x17, 0x10, 0xb0, 0x2f, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x29, 0x2f, 0x1b, 0xb1, 0x29, 0x0e, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, 0x1e, 0x0c, 0x3e, 0x59, + 0xb0, 0x00, 0xd0, 0xb0, 0x00, 0x2f, 0xb2, 0x02, 0x17, 0x1e, 0x11, 0x12, + 0x39, 0xb2, 0x0b, 0x17, 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x0b, 0x2f, 0xb2, + 0x8f, 0x0b, 0x01, 0x5d, 0xb0, 0x17, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x12, 0x0b, 0x17, 0x11, + 0x12, 0x39, 0x7c, 0xb0, 0x12, 0x2f, 0x18, 0xb0, 0x29, 0x10, 0xb0, 0x24, + 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x04, 0x10, 0xb1, + 0x2e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x0b, 0x10, 0xb1, 0x32, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0x30, 0x31, 0x25, 0x26, 0x27, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x37, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, + 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x16, 0x17, 0x15, 0x23, + 0x06, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x03, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x07, 0x07, 0x14, + 0x16, 0x02, 0xdf, 0x11, 0x09, 0x69, 0xa8, 0x9f, 0xd1, 0xff, 0xf1, 0x85, + 0x4d, 0x53, 0x49, 0x53, 0xfe, 0xdf, 0x74, 0xd4, 0x84, 0xc8, 0xeb, 0x01, + 0x2a, 0x30, 0x4a, 0x50, 0x42, 0x21, 0x2f, 0x1d, 0x49, 0x5c, 0x64, 0x7f, + 0x70, 0x40, 0x6c, 0x1a, 0x6c, 0xd9, 0x0e, 0x01, 0x4c, 0x05, 0x29, 0x33, + 0x75, 0xb8, 0x8c, 0xac, 0xb8, 0x01, 0x3e, 0x4b, 0x5a, 0x46, 0x3d, 0x5e, + 0xa0, 0x5b, 0xc9, 0xb6, 0xfe, 0x2b, 0x9a, 0x4f, 0x11, 0x2a, 0x51, 0x35, + 0x41, 0x14, 0x9d, 0x2c, 0x6f, 0x62, 0x83, 0x01, 0x1b, 0x39, 0x30, 0xba, + 0x96, 0x11, 0x36, 0x46, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0xfb, + 0x07, 0x3e, 0x02, 0x26, 0x00, 0x27, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x01, 0xc0, 0x01, 0x3e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x1f, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x03, 0xf6, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x47, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x26, + 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x0f, 0x2f, 0xb0, 0x1f, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0xfb, 0x07, 0x3e, + 0x02, 0x26, 0x00, 0x27, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x00, 0xb9, + 0x01, 0x3e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, + 0x1b, 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x1f, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x03, 0xf6, 0x06, 0x00, 0x02, 0x26, + 0x00, 0x47, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, 0x1f, 0x00, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x14, + 0x3e, 0x59, 0xb0, 0x1f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, + 0xff, 0xec, 0x04, 0xfb, 0x07, 0x36, 0x02, 0x26, 0x00, 0x27, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa2, 0x01, 0xa5, 0x01, 0x4f, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, 0x3e, 0x59, + 0xb0, 0x22, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, + 0x03, 0xf6, 0x05, 0xf8, 0x02, 0x26, 0x00, 0x47, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa2, 0x01, 0x0b, 0x00, 0x11, 0x00, 0x09, 0x00, 0xb0, 0x0f, 0x2f, + 0xb0, 0x22, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, + 0x04, 0xfb, 0x07, 0x3f, 0x02, 0x26, 0x00, 0x27, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x9f, 0x00, 0xd1, 0x01, 0x3e, 0x00, 0x09, 0x00, 0xb0, 0x0b, 0x2f, + 0xb0, 0x21, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, + 0x03, 0xf6, 0x06, 0x01, 0x02, 0x26, 0x00, 0x47, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9f, 0x37, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x0f, 0x2f, 0xb0, 0x21, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0xdb, + 0x07, 0x3a, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9f, + 0x00, 0x30, 0x01, 0x39, 0x00, 0x09, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x1a, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x05, 0x7f, + 0x06, 0x01, 0x00, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x07, 0x01, 0xba, + 0x04, 0x2b, 0x04, 0xee, 0x00, 0x06, 0x00, 0xb0, 0x1d, 0x2f, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x06, 0xe5, 0x02, 0x26, + 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x00, 0x70, 0x00, 0x7c, 0x01, 0x37, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x05, 0xad, 0x02, 0x26, 0x00, 0x49, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x70, 0x21, 0xff, 0x00, 0x09, 0x00, 0xb0, + 0x08, 0x2f, 0xb0, 0x1e, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x04, 0x52, 0x07, 0x2f, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa1, 0x00, 0xb8, 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, + 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, + 0x04, 0x1e, 0x05, 0xf6, 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x06, + 0x00, 0xa1, 0x5d, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x21, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x07, 0x31, + 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa2, 0x01, 0x70, + 0x01, 0x4a, 0x00, 0x09, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x11, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x05, 0xf8, + 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa2, 0x01, 0x15, + 0x00, 0x11, 0x00, 0x09, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x23, 0xdc, 0x30, + 0x31, 0x00, 0x00, 0x01, 0x00, 0x82, 0xfe, 0x5a, 0x04, 0x52, 0x05, 0xb0, + 0x00, 0x1b, 0x00, 0x89, 0xb2, 0x11, 0x1c, 0x1d, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0e, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, + 0x14, 0x0c, 0x3e, 0x59, 0xb2, 0x1b, 0x16, 0x04, 0x11, 0x12, 0x39, 0xb0, + 0x1b, 0x2f, 0xb4, 0x3a, 0x1b, 0x4a, 0x1b, 0x02, 0x5d, 0xb1, 0x00, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, + 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x03, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, + 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x16, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, + 0x21, 0x15, 0x23, 0x06, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, + 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, + 0x21, 0x03, 0xee, 0xfd, 0xc0, 0x02, 0xa4, 0x98, 0x4a, 0x50, 0x42, 0x21, + 0x2f, 0x1d, 0x49, 0x5c, 0x64, 0x7f, 0x74, 0xfd, 0xc7, 0x03, 0xce, 0xfd, + 0x5e, 0x02, 0x40, 0x02, 0x77, 0xfe, 0x7a, 0xf1, 0x2a, 0x51, 0x35, 0x41, + 0x14, 0x9d, 0x2c, 0x6f, 0x62, 0x7f, 0x56, 0x05, 0xb0, 0xf3, 0xfe, 0xa5, + 0x00, 0x02, 0x00, 0x48, 0xfe, 0x79, 0x04, 0x1e, 0x04, 0x4e, 0x00, 0x24, + 0x00, 0x2c, 0x00, 0x8a, 0xb2, 0x12, 0x2d, 0x2e, 0x11, 0x12, 0x39, 0xb0, + 0x12, 0x10, 0xb0, 0x25, 0xd0, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x14, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, 0xb1, + 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, + 0x02, 0x12, 0x22, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb0, 0x08, 0xb0, + 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x29, 0x1a, 0x12, 0x11, + 0x12, 0x39, 0xb0, 0x29, 0x2f, 0xb4, 0x1f, 0x29, 0x2f, 0x29, 0x02, 0x71, + 0xb2, 0x5f, 0x29, 0x01, 0x71, 0xb2, 0x8f, 0x29, 0x01, 0x5d, 0xb1, 0x1e, + 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x24, + 0x12, 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb1, 0x25, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, + 0x07, 0x33, 0x06, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x00, 0x35, 0x35, 0x34, 0x12, 0x36, + 0x33, 0x32, 0x12, 0x11, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x01, + 0x22, 0x06, 0x07, 0x21, 0x35, 0x26, 0x26, 0x04, 0x07, 0x3e, 0x73, 0x01, + 0x4a, 0x50, 0x42, 0x21, 0x2f, 0x1d, 0x49, 0x5c, 0x64, 0x7f, 0x3f, 0xd6, + 0xfe, 0xfb, 0x7e, 0xe7, 0x94, 0xde, 0xff, 0xfd, 0x4f, 0x0e, 0x8d, 0x6c, + 0xa7, 0x5e, 0xfe, 0xc7, 0x56, 0x6b, 0x0f, 0x01, 0x92, 0x02, 0x64, 0xaf, + 0x5b, 0x35, 0x2a, 0x51, 0x35, 0x41, 0x14, 0x9d, 0x2c, 0x6f, 0x62, 0x61, + 0x44, 0x13, 0x01, 0x1f, 0xdf, 0x1f, 0xa3, 0x01, 0x01, 0x8b, 0xfe, 0xe8, + 0xfe, 0xff, 0x76, 0x6a, 0x80, 0x79, 0x02, 0x16, 0x74, 0x6c, 0x17, 0x60, + 0x69, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x07, 0x3a, + 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9f, 0x00, 0x9c, + 0x01, 0x39, 0x00, 0x09, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x10, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x06, 0x01, + 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9f, 0x41, 0x00, + 0x00, 0x09, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x22, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x5e, 0xff, 0xec, 0x05, 0x02, 0x07, 0x3e, 0x02, 0x26, + 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x00, 0xc0, 0x01, 0x3e, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x23, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x45, 0xfe, 0x56, 0x04, 0x22, 0x06, 0x00, 0x02, 0x26, 0x00, 0x4b, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, 0x33, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, + 0xb0, 0x2b, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5e, 0xff, 0xec, + 0x05, 0x02, 0x07, 0x34, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa1, 0x00, 0xf4, 0x01, 0x3e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x24, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x45, 0xfe, 0x56, 0x04, 0x22, + 0x05, 0xf6, 0x02, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa1, + 0x67, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, + 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x2a, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x5e, 0xff, 0xec, 0x05, 0x02, 0x07, 0x36, 0x02, 0x26, + 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa2, 0x01, 0xac, 0x01, 0x4f, + 0x00, 0x09, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x26, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x45, 0xfe, 0x56, 0x04, 0x22, 0x05, 0xf8, 0x02, 0x26, + 0x00, 0x4b, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa2, 0x01, 0x1f, 0x00, 0x11, + 0x00, 0x09, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x2c, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x5e, 0xfd, 0xfa, 0x05, 0x02, 0x05, 0xc4, 0x02, 0x26, + 0x00, 0x2b, 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x01, 0xef, 0xfe, 0x8f, + 0xff, 0xff, 0x00, 0x45, 0xfe, 0x56, 0x04, 0x22, 0x06, 0xb8, 0x02, 0x26, + 0x00, 0x4b, 0x00, 0x00, 0x01, 0x07, 0x02, 0x34, 0x01, 0x30, 0x00, 0xa2, + 0x00, 0x09, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x2b, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x05, 0x23, 0x07, 0x39, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x00, 0xdb, 0x01, 0x39, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, + 0x07, 0x18, 0x3e, 0x59, 0xb0, 0x10, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x68, 0x00, 0x00, 0x04, 0x0f, 0x07, 0x7c, 0x02, 0x26, 0x00, 0x4c, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x00, 0x15, 0x01, 0x7c, 0x00, 0x09, + 0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x15, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0xff, 0xb2, 0x00, 0x00, 0x02, 0xa3, 0x07, 0x36, 0x02, 0x26, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa5, 0xff, 0x3d, 0x01, 0x37, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x18, + 0x3e, 0x59, 0xb0, 0x07, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xa0, + 0x00, 0x00, 0x02, 0x91, 0x05, 0xee, 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa5, 0xff, 0x2b, 0xff, 0xef, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, + 0xb0, 0x07, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00, + 0x02, 0x86, 0x06, 0xe5, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x70, 0xff, 0x2c, 0x01, 0x37, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, 0xb0, 0x05, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x02, 0x74, + 0x05, 0x9d, 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x70, + 0xff, 0x1a, 0xff, 0xef, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x05, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0xff, 0xd2, 0x00, 0x00, 0x02, 0x86, 0x07, 0x2f, + 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0xff, 0x68, + 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, 0xb0, 0x07, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x02, 0x74, 0x05, 0xe7, 0x02, 0x26, + 0x00, 0x8d, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0xff, 0x56, 0xff, 0xf1, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, + 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x07, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x17, 0xfe, 0x5c, 0x01, 0xc1, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2d, + 0x00, 0x00, 0x00, 0x06, 0x00, 0xa4, 0xf6, 0x02, 0xff, 0xff, 0x00, 0x03, + 0xfe, 0x5a, 0x01, 0xb1, 0x05, 0xe7, 0x02, 0x26, 0x00, 0x4d, 0x00, 0x00, + 0x00, 0x06, 0x00, 0xa4, 0xe2, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, + 0x01, 0xc1, 0x07, 0x31, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa2, 0x00, 0x1f, 0x01, 0x4a, 0x00, 0x09, 0x00, 0xb0, 0x02, 0x2f, + 0xb0, 0x09, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x95, 0xff, 0xec, + 0x06, 0x4e, 0x05, 0xb0, 0x00, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x2e, 0x02, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6d, 0xfe, 0x4b, + 0x03, 0xcb, 0x05, 0xe7, 0x00, 0x26, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x4e, 0x02, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xec, + 0x04, 0xd6, 0x07, 0x36, 0x02, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x9e, 0x01, 0x5f, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x13, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x97, 0xfe, 0x4b, 0x02, 0x93, + 0x05, 0xe6, 0x02, 0x26, 0x00, 0x9c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, + 0xff, 0x1c, 0xff, 0xe6, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x11, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, 0xfe, 0x3a, 0x05, 0x25, 0x05, 0xb0, + 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x01, 0xa4, + 0xfe, 0xcf, 0xff, 0xff, 0x00, 0x6f, 0xfe, 0x24, 0x04, 0x5a, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x01, 0x4b, + 0xfe, 0xb9, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x2b, 0x07, 0x36, + 0x02, 0x26, 0x00, 0x30, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x00, 0x2e, + 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, + 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0xb0, 0x08, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x02, 0x84, 0x07, 0x88, 0x02, 0x26, + 0x00, 0x50, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x00, 0x1f, 0x01, 0x88, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, + 0x03, 0x1a, 0x3e, 0x59, 0xb0, 0x06, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x82, 0xfe, 0x06, 0x04, 0x2b, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x01, 0x71, 0xfe, 0x9b, 0xff, 0xff, + 0x00, 0x5b, 0xfe, 0x06, 0x01, 0xa0, 0x06, 0x00, 0x02, 0x26, 0x00, 0x50, + 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x00, 0x27, 0xfe, 0x9b, 0xff, 0xff, + 0x00, 0x82, 0x00, 0x00, 0x04, 0x2b, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x30, + 0x00, 0x00, 0x01, 0x07, 0x01, 0xba, 0x02, 0x38, 0x04, 0x9d, 0x00, 0x10, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, + 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x03, 0x0f, + 0x06, 0x01, 0x00, 0x26, 0x00, 0x50, 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, + 0x01, 0xbb, 0x04, 0xee, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x2b, + 0x05, 0xb0, 0x02, 0x26, 0x00, 0x30, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa2, + 0x01, 0xda, 0xfd, 0xdf, 0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x03, 0x29, + 0x06, 0x00, 0x00, 0x26, 0x00, 0x50, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa2, + 0x01, 0x8b, 0xfd, 0xa7, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x05, 0x22, + 0x07, 0x36, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x01, 0xe6, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x04, 0x0f, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x4f, + 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x14, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, 0xfd, 0xfe, 0x05, 0x22, 0x05, 0xb0, + 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x01, 0xec, + 0xfe, 0x93, 0xff, 0xff, 0x00, 0x69, 0xfe, 0x06, 0x04, 0x0f, 0x04, 0x4e, + 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x01, 0x54, + 0xfe, 0x9b, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x05, 0x22, 0x07, 0x37, + 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9f, 0x00, 0xf7, + 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x04, 0x0f, 0x06, 0x01, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9f, 0x60, 0x00, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, + 0x3e, 0x59, 0xb0, 0x17, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x92, + 0x00, 0x00, 0x04, 0x0f, 0x06, 0x00, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x07, 0x01, 0xba, 0xff, 0x5e, 0x04, 0xed, 0x00, 0x09, 0x00, 0xb0, + 0x03, 0x2f, 0xb0, 0x12, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, + 0xff, 0xec, 0x05, 0x2e, 0x06, 0xe2, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x70, 0x00, 0xc3, 0x01, 0x34, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, + 0xb0, 0x20, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, + 0x04, 0x43, 0x05, 0xad, 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x70, 0x41, 0xff, 0x00, 0x09, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x1a, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, + 0x07, 0x2c, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, + 0x00, 0xff, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x22, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, 0x05, 0xf6, + 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa1, 0x7d, 0x00, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x1c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, 0x07, 0x35, 0x02, 0x26, 0x00, 0x33, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa6, 0x01, 0x58, 0x01, 0x36, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, + 0x3e, 0x59, 0xb0, 0x21, 0xdc, 0xb0, 0x25, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x42, 0xff, 0xec, 0x04, 0x53, 0x05, 0xff, 0x02, 0x26, 0x00, 0x53, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa6, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x1c, 0xdc, 0xb0, 0x1e, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0xf0, 0x07, 0x36, 0x02, 0x26, + 0x00, 0x36, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x66, 0x01, 0x36, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x1a, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x6f, 0x00, 0x00, 0x03, 0x0f, 0x06, 0x00, 0x02, 0x26, 0x00, 0x56, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x14, + 0x3e, 0x59, 0xb0, 0x10, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x06, 0x04, 0xf0, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, + 0x00, 0x07, 0x01, 0xba, 0x01, 0x7c, 0xfe, 0x9b, 0xff, 0xff, 0x00, 0x50, + 0xfe, 0x06, 0x02, 0xd3, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, + 0x00, 0x07, 0x01, 0xba, 0x00, 0x1c, 0xfe, 0x9b, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x04, 0xf0, 0x07, 0x37, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x9f, 0x00, 0x77, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, + 0xb0, 0x1d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x11, 0x00, 0x00, + 0x03, 0x24, 0x06, 0x01, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9f, 0xbc, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x12, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x45, 0xff, 0xec, 0x04, 0xa2, 0x07, 0x36, + 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x98, + 0x01, 0x36, 0x00, 0x09, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x2a, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x38, 0xff, 0xec, 0x03, 0xd2, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x21, + 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x28, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x45, 0xff, 0xec, 0x04, 0xa2, 0x07, 0x36, + 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x00, 0x91, + 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, + 0x1b, 0xb1, 0x0a, 0x18, 0x3e, 0x59, 0xb0, 0x2a, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x38, 0xff, 0xec, 0x03, 0xd2, 0x06, 0x00, 0x02, 0x26, + 0x00, 0x57, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, 0x1a, 0x00, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, + 0x3e, 0x59, 0xb0, 0x28, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x45, + 0xfe, 0x32, 0x04, 0xa2, 0x05, 0xc4, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x79, 0x01, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x38, + 0xfe, 0x29, 0x03, 0xd2, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x79, 0x01, 0x28, 0xff, 0xf7, 0xff, 0xff, 0x00, 0x45, + 0xfd, 0xfc, 0x04, 0xa2, 0x05, 0xc4, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, + 0x00, 0x07, 0x01, 0xba, 0x01, 0xa1, 0xfe, 0x91, 0xff, 0xff, 0x00, 0x38, + 0xfd, 0xf2, 0x03, 0xd2, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, + 0x00, 0x07, 0x01, 0xba, 0x01, 0x29, 0xfe, 0x87, 0xff, 0xff, 0x00, 0x45, + 0xff, 0xec, 0x04, 0xa2, 0x07, 0x37, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x9f, 0x00, 0xa9, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, 0x59, + 0xb0, 0x2c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x38, 0xff, 0xec, + 0x03, 0xd2, 0x06, 0x01, 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9f, 0x32, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x2a, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x28, 0xfe, 0x03, 0x04, 0xca, 0x05, 0xb0, + 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0xba, 0x01, 0x8c, + 0xfe, 0x98, 0x00, 0x08, 0x00, 0xb2, 0x50, 0x0d, 0x01, 0x5d, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x0a, 0xfd, 0xfc, 0x02, 0x8d, 0x05, 0x44, 0x02, 0x26, + 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x00, 0xc9, 0xfe, 0x91, + 0xff, 0xff, 0x00, 0x28, 0xfe, 0x39, 0x04, 0xca, 0x05, 0xb0, 0x02, 0x26, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x79, 0x01, 0x8b, 0x00, 0x07, + 0xff, 0xff, 0x00, 0x0a, 0xfe, 0x32, 0x02, 0xac, 0x05, 0x44, 0x02, 0x26, + 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x00, 0x79, 0x00, 0xc8, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x28, 0x00, 0x00, 0x04, 0xca, 0x07, 0x37, 0x02, 0x26, + 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9f, 0x00, 0x95, 0x01, 0x36, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x0a, 0xff, 0xec, 0x03, 0x51, 0x06, 0x83, 0x00, 0x26, 0x00, 0x58, + 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x01, 0xfd, 0x05, 0x70, 0xff, 0xff, + 0x00, 0x74, 0xff, 0xec, 0x04, 0xd0, 0x07, 0x33, 0x02, 0x26, 0x00, 0x39, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa5, 0x00, 0xb0, 0x01, 0x34, 0x00, 0x09, + 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x1c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x68, 0xff, 0xec, 0x04, 0x0f, 0x05, 0xfe, 0x02, 0x26, 0x00, 0x59, + 0x00, 0x00, 0x01, 0x06, 0x00, 0xa5, 0x4e, 0xff, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, + 0xb0, 0x14, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, 0xff, 0xec, + 0x04, 0xd0, 0x06, 0xe2, 0x02, 0x26, 0x00, 0x39, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x70, 0x00, 0x9f, 0x01, 0x34, 0x00, 0x09, 0x00, 0xb0, 0x00, 0x2f, + 0xb0, 0x11, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, + 0x04, 0x0f, 0x05, 0xad, 0x02, 0x26, 0x00, 0x59, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x70, 0x3d, 0xff, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x12, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, 0xff, 0xec, 0x04, 0xd0, 0x07, 0x2c, + 0x02, 0x26, 0x00, 0x39, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x00, 0xdb, + 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, + 0x1b, 0xb1, 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x14, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, 0x04, 0x0f, 0x05, 0xf6, 0x02, 0x26, + 0x00, 0x59, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa1, 0x79, 0x00, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, + 0x3e, 0x59, 0xb0, 0x14, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, + 0xff, 0xec, 0x04, 0xd0, 0x07, 0x8f, 0x02, 0x26, 0x00, 0x39, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa3, 0x01, 0x49, 0x01, 0x95, 0x00, 0x0c, 0x00, 0xb0, + 0x00, 0x2f, 0xb0, 0x1a, 0xdc, 0xb0, 0x1d, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x68, 0xff, 0xec, 0x04, 0x0f, 0x06, 0x59, 0x02, 0x26, 0x00, 0x59, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa3, 0x00, 0xe7, 0x00, 0x5f, 0x00, 0x0c, + 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x1a, 0xdc, 0xb0, 0x1d, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x74, 0xff, 0xec, 0x04, 0xd0, 0x07, 0x35, 0x02, 0x26, + 0x00, 0x39, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa6, 0x01, 0x34, 0x01, 0x36, + 0x00, 0x0c, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x13, 0xdc, 0xb0, 0x15, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, 0x04, 0x4f, 0x05, 0xff, + 0x02, 0x26, 0x00, 0x59, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa6, 0x00, 0xd2, + 0x00, 0x00, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, + 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x13, 0xdc, 0xb0, 0x17, 0xd0, + 0x30, 0x31, 0x00, 0x01, 0x00, 0x74, 0xfe, 0x9d, 0x04, 0xd0, 0x05, 0xb0, + 0x00, 0x1f, 0x00, 0x57, 0xb2, 0x1c, 0x20, 0x21, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, + 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, + 0xb1, 0x17, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, + 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb2, 0x04, 0x13, 0x00, 0x11, 0x12, + 0x39, 0xb0, 0x0e, 0x10, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, + 0xdc, 0x59, 0xb0, 0x13, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x06, 0x07, + 0x06, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x37, 0x20, 0x00, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, + 0x32, 0x13, 0x11, 0x04, 0xd0, 0x8c, 0x78, 0x38, 0x3a, 0x42, 0x21, 0x2f, + 0x1d, 0x49, 0x5c, 0x64, 0x7f, 0x22, 0xfe, 0xfd, 0xfe, 0xd4, 0x01, 0x2c, + 0x89, 0x79, 0xfd, 0x04, 0x05, 0xb0, 0xfc, 0x3f, 0xa5, 0xe4, 0x3b, 0x23, + 0x47, 0x2e, 0x41, 0x14, 0x9d, 0x2c, 0x6f, 0x62, 0x48, 0x36, 0x01, 0x13, + 0xf4, 0x03, 0xbd, 0xfc, 0x3f, 0x8f, 0x83, 0x01, 0x0a, 0x03, 0xc9, 0x00, + 0x00, 0x01, 0x00, 0x68, 0xfe, 0x5a, 0x04, 0x0f, 0x04, 0x3a, 0x00, 0x1f, + 0x00, 0x77, 0xb2, 0x1a, 0x20, 0x21, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x14, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x14, 0x3e, 0x59, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, + 0x0c, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb0, 0x05, 0xb0, 0x0a, 0x2b, 0x58, + 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x0f, + 0x2f, 0xb2, 0x10, 0x1d, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x10, 0xb1, + 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x21, 0x06, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x37, 0x27, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, + 0x21, 0x11, 0x14, 0x33, 0x32, 0x37, 0x11, 0x21, 0x11, 0x03, 0xf0, 0x4a, + 0x50, 0x42, 0x21, 0x2f, 0x1d, 0x49, 0x5c, 0x64, 0x7f, 0x81, 0x07, 0x6b, + 0xbd, 0xae, 0xb7, 0x02, 0x01, 0x21, 0x9a, 0x93, 0x37, 0x01, 0x22, 0x2a, + 0x51, 0x35, 0x41, 0x14, 0x9d, 0x2c, 0x6f, 0x62, 0x86, 0x58, 0x65, 0x82, + 0xc8, 0xc1, 0x02, 0xc5, 0xfd, 0x45, 0xa9, 0x66, 0x02, 0xfe, 0xfb, 0xc6, + 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, 0x06, 0xdf, 0x07, 0x36, 0x02, 0x26, + 0x00, 0x3b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x01, 0x90, 0x01, 0x36, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, + 0x09, 0x18, 0x3e, 0x59, 0xb0, 0x11, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x1c, 0x00, 0x00, 0x05, 0xc1, 0x06, 0x00, 0x02, 0x26, 0x00, 0x5b, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x9e, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, + 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x02, + 0x00, 0x00, 0x04, 0xef, 0x07, 0x36, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x9e, 0x00, 0x84, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, + 0xb0, 0x0b, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x4b, + 0x04, 0x01, 0x06, 0x00, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9e, 0x11, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, 0x59, 0xb0, 0x13, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x04, 0xef, 0x07, 0x0a, + 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0x9f, + 0x01, 0x36, 0xff, 0xff, 0x00, 0x49, 0x00, 0x00, 0x04, 0x9e, 0x07, 0x36, + 0x02, 0x26, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x85, + 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, + 0x1b, 0xb1, 0x07, 0x18, 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x4a, 0x00, 0x00, 0x03, 0xcc, 0x06, 0x00, 0x02, 0x26, + 0x00, 0x5e, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x1a, 0x00, 0x00, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, + 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x49, 0x00, 0x00, 0x04, 0x9e, 0x07, 0x2e, 0x02, 0x26, 0x00, 0x3e, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa2, 0x01, 0x6a, 0x01, 0x47, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x18, + 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4a, + 0x00, 0x00, 0x03, 0xcc, 0x05, 0xf8, 0x02, 0x26, 0x00, 0x5e, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa2, 0x00, 0xff, 0x00, 0x11, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, + 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x49, 0x00, 0x00, + 0x04, 0x9e, 0x07, 0x37, 0x02, 0x26, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x9f, 0x00, 0x96, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x18, 0x3e, 0x59, 0xb0, 0x0f, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4a, 0x00, 0x00, 0x03, 0xcc, + 0x06, 0x01, 0x02, 0x26, 0x00, 0x5e, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9f, + 0x2b, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, + 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x07, 0x49, 0x07, 0x42, 0x02, 0x26, + 0x00, 0x81, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x02, 0xb6, 0x01, 0x42, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x15, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x42, 0xff, 0xec, 0x06, 0x8d, 0x06, 0x01, 0x02, 0x26, 0x00, 0x86, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x02, 0x6d, 0x00, 0x01, 0x00, 0x09, + 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x3f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x5d, 0xff, 0xa1, 0x05, 0x35, 0x07, 0x80, 0x02, 0x26, 0x00, 0x83, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0xdb, 0x01, 0x80, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x18, + 0x3e, 0x59, 0xb0, 0x2c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, + 0xff, 0x72, 0x04, 0x43, 0x05, 0xfc, 0x02, 0x26, 0x00, 0x89, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0x2b, 0xff, 0xfc, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, + 0xb0, 0x27, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x93, 0x00, 0x00, + 0x04, 0x34, 0x04, 0x8d, 0x02, 0x26, 0x02, 0x30, 0x00, 0x00, 0x01, 0x07, + 0x02, 0x26, 0xff, 0x06, 0xff, 0x62, 0x00, 0x2c, 0x00, 0xb4, 0xbf, 0x18, + 0xcf, 0x18, 0x02, 0x5d, 0xb2, 0xaf, 0x19, 0x01, 0x71, 0xb2, 0x6f, 0x19, + 0x01, 0x72, 0xb4, 0x1f, 0x19, 0x2f, 0x19, 0x02, 0x5d, 0xb2, 0xdf, 0x19, + 0x01, 0x71, 0xb2, 0x8f, 0x19, 0x01, 0x71, 0xb4, 0xdf, 0x19, 0xef, 0x19, + 0x02, 0x5d, 0x30, 0x31, 0xff, 0xff, 0xff, 0x93, 0x00, 0x00, 0x04, 0x34, + 0x04, 0x8d, 0x02, 0x26, 0x02, 0x30, 0x00, 0x00, 0x01, 0x07, 0x02, 0x26, + 0xff, 0x06, 0xff, 0x62, 0x00, 0x2c, 0x00, 0xb4, 0xbf, 0x18, 0xcf, 0x18, + 0x02, 0x5d, 0xb2, 0xaf, 0x19, 0x01, 0x71, 0xb2, 0x6f, 0x19, 0x01, 0x72, + 0xb4, 0x1f, 0x19, 0x2f, 0x19, 0x02, 0x5d, 0xb2, 0xdf, 0x19, 0x01, 0x71, + 0xb2, 0x8f, 0x19, 0x01, 0x71, 0xb4, 0xdf, 0x19, 0xef, 0x19, 0x02, 0x5d, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x20, 0x00, 0x00, 0x04, 0x2f, 0x04, 0x8d, + 0x02, 0x26, 0x01, 0xd8, 0x00, 0x00, 0x01, 0x06, 0x02, 0x26, 0x22, 0x97, + 0x00, 0x08, 0x00, 0xb2, 0x00, 0x0a, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x04, 0xad, 0x06, 0x1e, 0x02, 0x26, 0x02, 0x33, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x00, 0xb3, 0x00, 0x1e, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, + 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x04, 0xad, 0x06, 0x1e, 0x02, 0x26, 0x02, 0x33, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0x68, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x16, 0x3e, 0x59, + 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x04, 0xad, 0x06, 0x1e, 0x02, 0x26, 0x02, 0x33, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9e, 0x61, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x04, 0xad, 0x06, 0x1b, + 0x02, 0x26, 0x02, 0x33, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa5, 0x6a, 0x1c, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, + 0x05, 0x16, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x04, 0xad, 0x05, 0xf2, 0x02, 0x26, 0x02, 0x33, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x7c, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x04, 0xad, 0x06, 0x77, 0x02, 0x26, 0x02, 0x33, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa3, 0x01, 0x03, 0x00, 0x7d, 0x00, 0x0c, 0x00, 0xb0, + 0x04, 0x2f, 0xb0, 0x14, 0xdc, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x04, 0xad, 0x06, 0xb7, 0x02, 0x26, 0x02, 0x33, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x27, 0x00, 0xfe, 0xff, 0xf6, 0xff, 0xff, + 0x00, 0x40, 0xfe, 0x34, 0x04, 0x52, 0x04, 0x9d, 0x02, 0x26, 0x02, 0x31, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x79, 0x01, 0x66, 0x00, 0x02, 0xff, 0xff, + 0x00, 0x63, 0x00, 0x00, 0x03, 0xbc, 0x06, 0x1e, 0x02, 0x26, 0x02, 0x28, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x00, 0x84, 0x00, 0x1e, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, + 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x63, + 0x00, 0x00, 0x03, 0xbc, 0x06, 0x1e, 0x02, 0x26, 0x02, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0x39, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x16, 0x3e, 0x59, + 0xb0, 0x0e, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x03, 0xbc, 0x06, 0x1e, 0x02, 0x26, 0x02, 0x28, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9e, 0x32, 0x1e, 0x00, 0x09, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x10, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x03, 0xbc, + 0x05, 0xf2, 0x02, 0x26, 0x02, 0x28, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, + 0x4d, 0x1e, 0xff, 0xff, 0xff, 0x98, 0x00, 0x00, 0x01, 0x99, 0x06, 0x1e, + 0x02, 0x26, 0x01, 0xe3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0xff, 0x64, + 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x05, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x76, 0x00, 0x00, 0x02, 0x7d, 0x06, 0x1e, 0x02, 0x26, + 0x01, 0xe3, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, 0x18, 0x1e, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x16, + 0x3e, 0x59, 0xb0, 0x06, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x8d, + 0x00, 0x00, 0x02, 0x89, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xe3, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x9e, 0xff, 0x12, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, + 0xb0, 0x08, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x8b, 0x00, 0x00, + 0x02, 0x87, 0x05, 0xf2, 0x02, 0x26, 0x01, 0xe3, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x6a, 0xff, 0x2d, 0x00, 0x1e, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x72, 0x06, 0x1b, 0x02, 0x26, 0x01, 0xde, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa5, 0x00, 0x82, 0x00, 0x1c, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, 0xb0, 0x0d, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, + 0x06, 0x1e, 0x02, 0x26, 0x01, 0xdd, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, + 0x00, 0xb8, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x16, 0x3e, 0x59, 0xb0, 0x21, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, 0x06, 0x1e, + 0x02, 0x26, 0x01, 0xdd, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x6d, + 0x00, 0x1e, 0x00, 0x09, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x22, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, 0x06, 0x1e, + 0x02, 0x26, 0x01, 0xdd, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, 0x66, 0x1e, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, + 0x0d, 0x16, 0x3e, 0x59, 0xb0, 0x24, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, 0x06, 0x1b, 0x02, 0x26, 0x01, 0xdd, + 0x00, 0x00, 0x01, 0x06, 0x00, 0xa5, 0x6f, 0x1c, 0x00, 0x09, 0x00, 0xb0, + 0x0d, 0x2f, 0xb0, 0x2b, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, + 0xff, 0xf0, 0x04, 0x7e, 0x05, 0xf2, 0x02, 0x26, 0x01, 0xdd, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x6a, 0x00, 0x81, 0x00, 0x1e, 0xff, 0xff, 0x00, 0x5d, + 0xff, 0xf0, 0x04, 0x30, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd7, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x44, 0x00, 0x9d, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x16, 0x3e, 0x59, + 0xb0, 0x12, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xf0, + 0x04, 0x30, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd7, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x75, 0x01, 0x52, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x16, 0x3e, 0x59, 0xb0, 0x13, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xf0, 0x04, 0x30, + 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd7, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, + 0x4b, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, + 0x1b, 0xb1, 0x09, 0x16, 0x3e, 0x59, 0xb0, 0x15, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x5d, 0xff, 0xf0, 0x04, 0x30, 0x05, 0xf2, 0x02, 0x26, + 0x01, 0xd7, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x66, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x04, 0x4f, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd3, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x2b, 0x00, 0x1e, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, + 0x3e, 0x59, 0xb0, 0x0b, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x04, 0xad, 0x05, 0xca, 0x02, 0x26, 0x02, 0x33, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x70, 0x59, 0x1c, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x0c, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x04, 0xad, + 0x06, 0x14, 0x02, 0x26, 0x02, 0x33, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, + 0x00, 0x95, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0x30, + 0x31, 0x00, 0x00, 0x02, 0xff, 0xff, 0xfe, 0x5a, 0x04, 0xad, 0x04, 0x8d, + 0x00, 0x16, 0x00, 0x19, 0x00, 0x77, 0xb2, 0x19, 0x1a, 0x1b, 0x11, 0x12, + 0x39, 0xb0, 0x19, 0x10, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0e, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0c, 0x3e, 0x59, + 0xb0, 0x0c, 0x10, 0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, + 0x59, 0xb0, 0x01, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x11, 0x2f, 0xb2, 0x17, + 0x14, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x2f, 0xb1, 0x12, 0x09, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x19, 0x00, 0x14, + 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x01, 0x23, 0x06, 0x06, 0x15, 0x14, + 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x27, + 0x21, 0x07, 0x21, 0x01, 0x03, 0x21, 0x03, 0x02, 0xdc, 0x01, 0xd1, 0x40, + 0x4a, 0x50, 0x42, 0x21, 0x2f, 0x1d, 0x49, 0x5c, 0x64, 0x7f, 0x89, 0x4d, + 0xfe, 0x3d, 0x52, 0xfe, 0xde, 0x01, 0xcd, 0x0b, 0x01, 0x25, 0x93, 0x04, + 0x8d, 0xfb, 0x73, 0x2a, 0x51, 0x35, 0x41, 0x14, 0x9d, 0x2c, 0x6f, 0x62, + 0x8a, 0x59, 0xd0, 0xde, 0x04, 0x8d, 0xfd, 0x25, 0x01, 0x8a, 0xff, 0xff, + 0x00, 0x40, 0xff, 0xf0, 0x04, 0x52, 0x06, 0x1e, 0x02, 0x26, 0x02, 0x31, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x63, 0x00, 0x1e, 0x00, 0x09, + 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x1c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x40, 0xff, 0xf0, 0x04, 0x52, 0x06, 0x1e, 0x02, 0x26, 0x02, 0x31, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, 0x5c, 0x1e, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, + 0xb0, 0x1e, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf0, + 0x04, 0x52, 0x06, 0x16, 0x02, 0x26, 0x02, 0x31, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa2, 0x01, 0x48, 0x00, 0x2f, 0x00, 0x09, 0x00, 0xb0, 0x0a, 0x2f, + 0xb0, 0x1f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf0, + 0x04, 0x52, 0x06, 0x1f, 0x02, 0x26, 0x02, 0x31, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9f, 0x74, 0x1e, 0x00, 0x09, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x1e, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x16, 0x00, 0x00, 0x04, 0x34, + 0x06, 0x1f, 0x02, 0x26, 0x02, 0x30, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9f, + 0xc1, 0x1e, 0x00, 0x09, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x1a, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x03, 0xbc, 0x05, 0xca, + 0x02, 0x26, 0x02, 0x28, 0x00, 0x00, 0x01, 0x06, 0x00, 0x70, 0x2a, 0x1c, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x16, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x63, 0x00, 0x00, 0x03, 0xbc, 0x06, 0x14, 0x02, 0x26, 0x02, 0x28, + 0x00, 0x00, 0x01, 0x06, 0x00, 0xa1, 0x66, 0x1e, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, + 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x03, 0xbc, 0x06, 0x16, 0x02, 0x26, 0x02, 0x28, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa2, 0x01, 0x1e, 0x00, 0x2f, 0x00, 0x09, 0x00, 0xb0, 0x06, 0x2f, + 0xb0, 0x11, 0xdc, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x63, 0xfe, 0x5a, + 0x03, 0xbc, 0x04, 0x8d, 0x00, 0x1b, 0x00, 0x82, 0xb2, 0x11, 0x1c, 0x1d, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, + 0xb1, 0x16, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, + 0x1b, 0xb1, 0x0f, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, + 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0c, 0x3e, 0x59, 0xb2, 0x1b, 0x16, 0x04, + 0x11, 0x12, 0x39, 0xb0, 0x1b, 0x2f, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, 0xb1, 0x02, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0xd0, + 0xb0, 0x0f, 0x10, 0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, + 0x59, 0xb0, 0x16, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x15, 0x21, 0x15, 0x23, + 0x06, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x37, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x03, 0x66, + 0xfe, 0x1f, 0x02, 0x36, 0x81, 0x4a, 0x50, 0x42, 0x21, 0x2f, 0x1d, 0x49, + 0x5c, 0x64, 0x7f, 0x74, 0xfe, 0x28, 0x03, 0x59, 0xfd, 0xc9, 0x01, 0xe1, + 0x01, 0xe5, 0xfd, 0xe8, 0x2a, 0x51, 0x35, 0x41, 0x14, 0x9d, 0x2c, 0x6f, + 0x62, 0x7f, 0x56, 0x04, 0x8d, 0xea, 0xd5, 0x00, 0xff, 0xff, 0x00, 0x63, + 0x00, 0x00, 0x03, 0xbc, 0x06, 0x1f, 0x02, 0x26, 0x02, 0x28, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x9f, 0x4a, 0x1e, 0x00, 0x09, 0x00, 0xb0, 0x06, 0x2f, + 0xb0, 0x10, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x49, 0xff, 0xf0, + 0x04, 0x5b, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xe5, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9e, 0x6a, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x23, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x49, 0xff, 0xf0, 0x04, 0x5b, 0x06, 0x14, + 0x02, 0x26, 0x01, 0xe5, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x00, 0x9e, + 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, + 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x22, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x49, 0xff, 0xf0, 0x04, 0x5b, 0x06, 0x16, 0x02, 0x26, + 0x01, 0xe5, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa2, 0x01, 0x56, 0x00, 0x2f, + 0x00, 0x09, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x24, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x49, 0xfd, 0xfe, 0x04, 0x5b, 0x04, 0x9d, 0x02, 0x26, + 0x01, 0xe5, 0x00, 0x00, 0x01, 0x07, 0x01, 0xba, 0x01, 0x8d, 0xfe, 0x93, + 0x00, 0x08, 0x00, 0xb2, 0x50, 0x23, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x63, 0x00, 0x00, 0x04, 0x73, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xe4, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x9e, 0x6c, 0x1e, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x16, 0x3e, 0x59, + 0xb0, 0x10, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, + 0x02, 0x81, 0x06, 0x1b, 0x02, 0x26, 0x01, 0xe3, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa5, 0xff, 0x1b, 0x00, 0x1c, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x16, 0x3e, 0x59, 0xb0, 0x07, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xb2, 0x00, 0x00, 0x02, 0x64, + 0x05, 0xca, 0x02, 0x26, 0x01, 0xe3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x70, + 0xff, 0x0a, 0x00, 0x1c, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x05, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x02, 0x64, 0x06, 0x14, + 0x02, 0x26, 0x01, 0xe3, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0xff, 0x46, + 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x16, 0x3e, 0x59, 0xb0, 0x07, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x25, 0xfe, 0x5a, 0x01, 0xad, 0x04, 0x8d, 0x02, 0x26, + 0x01, 0xe3, 0x00, 0x00, 0x00, 0x06, 0x00, 0xa4, 0x04, 0x00, 0xff, 0xff, + 0x00, 0x74, 0x00, 0x00, 0x01, 0x9c, 0x06, 0x16, 0x02, 0x26, 0x01, 0xe3, + 0x00, 0x00, 0x01, 0x06, 0x00, 0xa2, 0xfe, 0x2f, 0x00, 0x09, 0x00, 0xb0, + 0x02, 0x2f, 0xb0, 0x09, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x20, + 0xff, 0xf0, 0x04, 0x62, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xe2, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x9e, 0x00, 0xeb, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x16, 0x3e, 0x59, + 0xb0, 0x12, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x04, + 0x04, 0x75, 0x04, 0x8d, 0x02, 0x26, 0x01, 0xe1, 0x00, 0x00, 0x01, 0x07, + 0x01, 0xba, 0x01, 0x13, 0xfe, 0x99, 0x00, 0x08, 0x00, 0xb2, 0x50, 0x11, + 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x03, 0x98, + 0x06, 0x1e, 0x02, 0x26, 0x01, 0xe0, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, + 0x0e, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, + 0x1b, 0xb1, 0x05, 0x16, 0x3e, 0x59, 0xb0, 0x08, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x63, 0xfe, 0x04, 0x03, 0x98, 0x04, 0x8d, 0x02, 0x26, + 0x01, 0xe0, 0x00, 0x00, 0x01, 0x07, 0x01, 0xba, 0x01, 0x14, 0xfe, 0x99, + 0x00, 0x08, 0x00, 0xb2, 0x50, 0x0a, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x63, 0x00, 0x00, 0x03, 0x98, 0x04, 0x90, 0x02, 0x26, 0x01, 0xe0, + 0x00, 0x00, 0x01, 0x07, 0x01, 0xba, 0x01, 0xa4, 0x03, 0x7d, 0x00, 0x10, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, + 0x3e, 0x59, 0x30, 0x31, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x03, 0x98, + 0x04, 0x8d, 0x02, 0x26, 0x01, 0xe0, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa2, + 0x01, 0x80, 0xfd, 0x51, 0x00, 0x08, 0x00, 0xb2, 0x5f, 0x06, 0x01, 0x5d, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x04, 0x72, 0x06, 0x1e, + 0x02, 0x26, 0x01, 0xde, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x80, + 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, + 0x1b, 0xb1, 0x08, 0x16, 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x63, 0xfd, 0xfa, 0x04, 0x72, 0x04, 0x8d, 0x02, 0x26, + 0x01, 0xde, 0x00, 0x00, 0x00, 0x07, 0x01, 0xba, 0x01, 0x88, 0xfe, 0x8f, + 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x04, 0x72, 0x06, 0x1f, 0x02, 0x26, + 0x01, 0xde, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9f, 0x00, 0x91, 0x00, 0x1e, + 0x00, 0x09, 0x00, 0xb0, 0x05, 0x2f, 0xb0, 0x0e, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, 0x05, 0xca, 0x02, 0x26, + 0x01, 0xdd, 0x00, 0x00, 0x01, 0x06, 0x00, 0x70, 0x5e, 0x1c, 0x00, 0x09, + 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x20, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, 0x06, 0x14, 0x02, 0x26, 0x01, 0xdd, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x00, 0x9a, 0x00, 0x1e, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x16, + 0x3e, 0x59, 0xb0, 0x23, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, + 0xff, 0xf0, 0x04, 0x7e, 0x06, 0x1d, 0x02, 0x26, 0x01, 0xdd, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa6, 0x00, 0xf3, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0xb0, + 0x0d, 0x2f, 0xb0, 0x22, 0xdc, 0xb0, 0x24, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x63, 0x00, 0x00, 0x04, 0x4c, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xda, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x0d, 0x00, 0x1e, 0x00, 0x09, + 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x18, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x63, 0xfe, 0x04, 0x04, 0x4c, 0x04, 0x8d, 0x02, 0x26, 0x01, 0xda, + 0x00, 0x00, 0x01, 0x07, 0x01, 0xba, 0x01, 0x26, 0xfe, 0x99, 0x00, 0x08, + 0x00, 0xb2, 0x50, 0x1a, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x63, + 0x00, 0x00, 0x04, 0x4c, 0x06, 0x1f, 0x02, 0x26, 0x01, 0xda, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x9f, 0x1e, 0x1e, 0x00, 0x09, 0x00, 0xb0, 0x04, 0x2f, + 0xb0, 0x1a, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3a, 0xff, 0xf0, + 0x04, 0x01, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd9, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x75, 0x01, 0x4a, 0x00, 0x1e, 0x00, 0x09, 0x00, 0xb0, 0x0a, 0x2f, + 0xb0, 0x29, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3a, 0xff, 0xf0, + 0x04, 0x01, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd9, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9e, 0x43, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, 0x3e, 0x59, 0xb0, 0x2b, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x3a, 0xfe, 0x32, 0x04, 0x01, 0x04, 0x9d, + 0x02, 0x26, 0x01, 0xd9, 0x00, 0x00, 0x00, 0x07, 0x00, 0x79, 0x01, 0x50, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x3a, 0xff, 0xf0, 0x04, 0x01, 0x06, 0x1f, + 0x02, 0x26, 0x01, 0xd9, 0x00, 0x00, 0x01, 0x06, 0x00, 0x9f, 0x5b, 0x1e, + 0x00, 0x09, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x2b, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x20, 0xfe, 0x06, 0x04, 0x2f, 0x04, 0x8d, 0x02, 0x26, + 0x01, 0xd8, 0x00, 0x00, 0x01, 0x07, 0x01, 0xba, 0x01, 0x3a, 0xfe, 0x9b, + 0x00, 0x08, 0x00, 0xb2, 0x50, 0x0c, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x20, 0x00, 0x00, 0x04, 0x2f, 0x06, 0x1f, 0x02, 0x26, 0x01, 0xd8, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x9f, 0x44, 0x1e, 0x00, 0x09, 0x00, 0xb0, + 0x06, 0x2f, 0xb0, 0x0c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x20, + 0xfe, 0x3c, 0x04, 0x2f, 0x04, 0x8d, 0x02, 0x26, 0x01, 0xd8, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x79, 0x01, 0x39, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x5d, + 0xff, 0xf0, 0x04, 0x30, 0x06, 0x1b, 0x02, 0x26, 0x01, 0xd7, 0x00, 0x00, + 0x01, 0x06, 0x00, 0xa5, 0x54, 0x1c, 0x00, 0x09, 0x00, 0xb0, 0x00, 0x2f, + 0xb0, 0x1c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xf0, + 0x04, 0x30, 0x05, 0xca, 0x02, 0x26, 0x01, 0xd7, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x70, 0x43, 0x1c, 0x00, 0x09, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x11, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xf0, 0x04, 0x30, + 0x06, 0x14, 0x02, 0x26, 0x01, 0xd7, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa1, + 0x7f, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, + 0x1b, 0xb1, 0x10, 0x16, 0x3e, 0x59, 0xb0, 0x13, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x5d, 0xff, 0xf0, 0x04, 0x30, 0x06, 0x77, 0x02, 0x26, + 0x01, 0xd7, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa3, 0x00, 0xed, 0x00, 0x7d, + 0x00, 0x0c, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x1a, 0xdc, 0xb0, 0x1d, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xf0, 0x04, 0x55, 0x06, 0x1d, + 0x02, 0x26, 0x01, 0xd7, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa6, 0x00, 0xd8, + 0x00, 0x1e, 0x00, 0x0c, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x13, 0xdc, 0xb0, + 0x15, 0xd0, 0x30, 0x31, 0x00, 0x01, 0x00, 0x5d, 0xfe, 0x95, 0x04, 0x30, + 0x04, 0x8d, 0x00, 0x1e, 0x00, 0x57, 0xb2, 0x1a, 0x1f, 0x20, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, + 0x1b, 0xb1, 0x17, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, + 0x2f, 0x1b, 0xb1, 0x1e, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, 0xb2, 0x04, 0x12, 0x1e, + 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, + 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x12, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, + 0x06, 0x07, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x37, 0x26, 0x26, 0x27, 0x11, 0x21, 0x11, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x11, 0x04, 0x30, 0x90, 0x7c, 0x59, 0x42, 0x21, 0x2f, + 0x1d, 0x49, 0x5c, 0x64, 0x7f, 0x2b, 0xd1, 0xed, 0x02, 0x01, 0x22, 0x06, + 0xc3, 0x61, 0x65, 0x04, 0x8d, 0xfd, 0x0c, 0x95, 0xc5, 0x2c, 0x3f, 0x49, + 0x41, 0x14, 0x9d, 0x2c, 0x6f, 0x62, 0x4d, 0x3e, 0x0a, 0xe0, 0xb9, 0x02, + 0xf9, 0xfc, 0xff, 0xb4, 0x5a, 0x67, 0x02, 0xf4, 0xff, 0xff, 0x00, 0x1f, + 0x00, 0x00, 0x05, 0xdb, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd5, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x9e, 0x00, 0xfd, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x16, 0x3e, 0x59, + 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x04, 0x4f, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd3, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x9e, 0x24, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x16, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x04, 0x4f, 0x05, 0xf2, + 0x02, 0x26, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x3f, 0x1e, + 0xff, 0xff, 0x00, 0x37, 0x00, 0x00, 0x04, 0x04, 0x06, 0x1e, 0x02, 0x26, + 0x01, 0xd2, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x32, 0x00, 0x1e, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x16, 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x37, 0x00, 0x00, 0x04, 0x04, 0x06, 0x16, 0x02, 0x26, 0x01, 0xd2, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa2, 0x01, 0x17, 0x00, 0x2f, 0x00, 0x09, + 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x37, 0x00, 0x00, 0x04, 0x04, 0x06, 0x1f, 0x02, 0x26, 0x01, 0xd2, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x9f, 0x43, 0x1e, 0x00, 0x09, 0x00, 0xb0, + 0x07, 0x2f, 0xb0, 0x0e, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, + 0x00, 0x00, 0x05, 0x5c, 0x06, 0x41, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xae, 0xff, 0x6f, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xa5, + 0x00, 0x00, 0x04, 0x52, 0x06, 0x42, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xae, 0xfd, 0xcb, 0x00, 0x01, 0xff, 0xff, 0xfe, 0xa9, + 0x00, 0x00, 0x05, 0x23, 0x06, 0x3f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xae, 0xfd, 0xcf, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xaa, + 0x00, 0x00, 0x01, 0xc1, 0x06, 0x43, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xae, 0xfd, 0xd0, 0x00, 0x02, 0xff, 0xff, 0xff, 0x69, + 0xff, 0xec, 0x05, 0x42, 0x06, 0x41, 0x00, 0x26, 0x00, 0x33, 0x14, 0x00, + 0x00, 0x07, 0x00, 0xae, 0xfe, 0x8f, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xb3, + 0x00, 0x00, 0x05, 0x53, 0x06, 0x41, 0x00, 0x26, 0x00, 0x3d, 0x64, 0x00, + 0x00, 0x07, 0x00, 0xae, 0xfd, 0xd9, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x04, 0xfd, 0x06, 0x41, 0x00, 0x26, 0x00, 0xba, 0x14, 0x00, + 0x00, 0x07, 0x00, 0xae, 0xfe, 0xa5, 0x00, 0x00, 0xff, 0xff, 0xff, 0x72, + 0xff, 0xf5, 0x02, 0xf0, 0x06, 0xc2, 0x02, 0x26, 0x00, 0xc3, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xaf, 0xff, 0x0c, 0xff, 0xeb, 0x00, 0x12, 0x00, 0xb0, + 0x00, 0x2f, 0xb0, 0x18, 0xdc, 0xb0, 0x0d, 0xd0, 0xb0, 0x18, 0x10, 0xb0, + 0x1b, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, + 0x05, 0xb0, 0x02, 0x06, 0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x04, 0xbc, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x26, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x05, 0xb0, 0x02, 0x06, + 0x00, 0x29, 0x00, 0x00, 0xff, 0xff, 0x00, 0x49, 0x00, 0x00, 0x04, 0x9e, + 0x05, 0xb0, 0x02, 0x06, 0x00, 0x3e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x05, 0x23, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x01, 0xc1, 0x05, 0xb0, 0x02, 0x06, + 0x00, 0x2d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x05, 0x25, + 0x05, 0xb0, 0x02, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x06, 0x7e, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x31, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x05, 0x22, 0x05, 0xb0, 0x02, 0x06, + 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, + 0x05, 0xc4, 0x02, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x04, 0xdd, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x28, 0x00, 0x00, 0x04, 0xca, 0x05, 0xb0, 0x02, 0x06, + 0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x04, 0xef, + 0x05, 0xb0, 0x02, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x16, + 0x00, 0x00, 0x05, 0x00, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x3c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xad, 0x00, 0x00, 0x02, 0xa9, 0x07, 0x0d, 0x02, 0x26, + 0x00, 0x2d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0xff, 0x4f, 0x01, 0x39, + 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x04, 0xef, 0x07, 0x0a, 0x02, 0x26, + 0x00, 0x3d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0x9f, 0x01, 0x36, + 0xff, 0xff, 0x00, 0x49, 0xff, 0xeb, 0x04, 0x7c, 0x06, 0x41, 0x02, 0x26, + 0x00, 0xbb, 0x00, 0x00, 0x01, 0x07, 0x00, 0xae, 0x01, 0x27, 0x00, 0x00, + 0x00, 0x09, 0x00, 0xb0, 0x13, 0x2f, 0xb0, 0x23, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x5f, 0xff, 0xec, 0x04, 0x2f, 0x06, 0x41, 0x02, 0x26, + 0x00, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x00, 0xae, 0x01, 0x04, 0x00, 0x00, + 0x00, 0x09, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x29, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x6c, 0xfe, 0x61, 0x04, 0x17, 0x06, 0x41, 0x02, 0x26, + 0x00, 0xc1, 0x00, 0x00, 0x01, 0x07, 0x00, 0xae, 0x00, 0xfd, 0x00, 0x00, + 0x00, 0x09, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x12, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x8a, 0xff, 0xf5, 0x02, 0x6f, 0x06, 0x2c, 0x02, 0x26, + 0x00, 0xc3, 0x00, 0x00, 0x01, 0x06, 0x00, 0xae, 0xe6, 0xeb, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, + 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, + 0xff, 0xeb, 0x04, 0x10, 0x06, 0xd2, 0x02, 0x26, 0x00, 0xcb, 0x00, 0x00, + 0x01, 0x06, 0x00, 0xaf, 0x16, 0xfb, 0x00, 0x12, 0x00, 0xb0, 0x00, 0x2f, + 0xb0, 0x1e, 0xdc, 0xb0, 0x13, 0xd0, 0xb0, 0x1e, 0x10, 0xb0, 0x21, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x92, 0x04, 0x3a, + 0x02, 0x06, 0x00, 0x8e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, + 0x04, 0x43, 0x04, 0x4e, 0x02, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x8b, 0xfe, 0x60, 0x04, 0x4e, 0x04, 0x3a, 0x02, 0x06, 0x00, 0x76, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x03, 0xfb, 0x04, 0x3a, + 0x02, 0x06, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x19, 0xfe, 0x4b, + 0x04, 0x4a, 0x04, 0x4a, 0x00, 0x1d, 0x00, 0x6a, 0xb2, 0x14, 0x1e, 0x1f, + 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, + 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, + 0x1b, 0xb1, 0x05, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, + 0x2f, 0x1b, 0xb1, 0x0f, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0e, 0x3e, 0x59, 0xb2, 0x04, 0x05, 0x0f, + 0x11, 0x12, 0x39, 0xb0, 0x0f, 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x05, 0x0f, 0x11, 0x12, + 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, + 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x32, 0x16, 0x17, 0x17, 0x13, + 0x21, 0x01, 0x13, 0x16, 0x17, 0x17, 0x37, 0x07, 0x06, 0x07, 0x06, 0x26, + 0x26, 0x27, 0x27, 0x03, 0x21, 0x01, 0x03, 0x26, 0x23, 0x07, 0x27, 0x36, + 0xb6, 0x6d, 0x96, 0x32, 0x61, 0xce, 0x01, 0x25, 0xfe, 0x98, 0xbd, 0x2d, + 0x48, 0x20, 0x21, 0x19, 0x1d, 0x24, 0x58, 0x6f, 0x67, 0x40, 0x40, 0xe2, + 0xfe, 0xe2, 0x01, 0x77, 0xac, 0x2e, 0x7f, 0x41, 0x06, 0x4f, 0x04, 0x4a, + 0x68, 0x75, 0xdb, 0x01, 0xa8, 0xfd, 0x22, 0xfe, 0x59, 0x65, 0x0f, 0x04, + 0x01, 0xe5, 0x07, 0x02, 0x05, 0x33, 0x82, 0x9c, 0x91, 0xfe, 0x33, 0x03, + 0x04, 0x01, 0x88, 0x73, 0x06, 0xda, 0x17, 0x00, 0xff, 0xff, 0xff, 0xac, + 0xff, 0xf5, 0x02, 0xa8, 0x05, 0xbf, 0x02, 0x26, 0x00, 0xc3, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x6a, 0xff, 0x4e, 0xff, 0xeb, 0xff, 0xff, 0x00, 0x71, + 0xff, 0xeb, 0x04, 0x10, 0x05, 0xcf, 0x02, 0x26, 0x00, 0xcb, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x6a, 0x58, 0xfb, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, + 0x04, 0x43, 0x06, 0x41, 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xae, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x04, 0x2f, + 0xb0, 0x1c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, + 0x04, 0x10, 0x06, 0x3c, 0x02, 0x26, 0x00, 0xcb, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xae, 0x00, 0xf0, 0xff, 0xfb, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x15, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x53, 0xff, 0xec, 0x06, 0x41, + 0x06, 0x3b, 0x02, 0x26, 0x00, 0xce, 0x00, 0x00, 0x01, 0x07, 0x00, 0xae, + 0x02, 0x03, 0xff, 0xfa, 0x00, 0x09, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x25, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, + 0x07, 0x0d, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, + 0x00, 0x9f, 0x01, 0x39, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, 0x04, 0x3d, + 0x07, 0x39, 0x02, 0x26, 0x00, 0xb1, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x01, 0x78, 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x08, 0xdc, 0x30, + 0x31, 0x00, 0x00, 0x01, 0x00, 0x45, 0xff, 0xec, 0x04, 0xa2, 0x05, 0xc4, + 0x00, 0x27, 0x00, 0x66, 0xb2, 0x12, 0x28, 0x29, 0x11, 0x12, 0x39, 0x00, + 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x18, 0x3e, + 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, 0x1e, 0x0c, + 0x3e, 0x59, 0xb2, 0x03, 0x1e, 0x0a, 0x11, 0x12, 0x39, 0xb2, 0x0f, 0x0a, + 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x17, + 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x23, + 0x1e, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x1e, 0x10, 0xb1, 0x25, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, + 0x26, 0x24, 0x27, 0x26, 0x35, 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x16, + 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x04, + 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x26, 0x35, 0x21, 0x14, 0x21, + 0x32, 0x36, 0x03, 0x75, 0x78, 0xfe, 0xc8, 0x5b, 0xf8, 0x85, 0xf9, 0x9b, + 0x9c, 0xf4, 0x87, 0xfe, 0xd4, 0x7e, 0x72, 0x6e, 0x7a, 0x8f, 0x8b, 0x01, + 0x00, 0xea, 0xfe, 0xe2, 0xf2, 0xa8, 0xfe, 0xec, 0x91, 0x01, 0x2d, 0x01, + 0x20, 0x6b, 0x78, 0x01, 0x7e, 0x55, 0x5b, 0x65, 0x31, 0x86, 0xe3, 0x76, + 0xb9, 0x68, 0x71, 0xce, 0x83, 0x64, 0x6f, 0x5d, 0x4c, 0x47, 0x60, 0x2a, + 0x4d, 0xe4, 0xaa, 0xbd, 0xd7, 0x7b, 0xd6, 0x8d, 0xf1, 0x57, 0xff, 0xff, + 0x00, 0x95, 0x00, 0x00, 0x01, 0xc1, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x2d, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xad, 0x00, 0x00, 0x02, 0xa9, 0x07, 0x0d, + 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0xff, 0x4f, + 0x01, 0x39, 0xff, 0xff, 0x00, 0x28, 0xff, 0xec, 0x03, 0xf9, 0x05, 0xb0, + 0x02, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, + 0x05, 0x3a, 0x05, 0xb0, 0x02, 0x06, 0x02, 0x2c, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x82, 0x00, 0x00, 0x05, 0x25, 0x07, 0x36, 0x02, 0x26, 0x00, 0x2f, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x64, 0x01, 0x36, 0x00, 0x09, + 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x1f, 0xff, 0xeb, 0x04, 0xf1, 0x07, 0x2f, 0x02, 0x26, 0x00, 0xde, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x00, 0xd9, 0x01, 0x39, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, + 0x3e, 0x59, 0xb0, 0x14, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, + 0x00, 0x00, 0x05, 0x5c, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x25, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0xbc, 0x05, 0xb0, 0x02, 0x06, + 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, 0x04, 0x3d, + 0x05, 0xb0, 0x02, 0x06, 0x00, 0xb1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x04, 0x52, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x29, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x78, 0x00, 0x00, 0x05, 0x18, 0x07, 0x2f, 0x02, 0x26, + 0x00, 0xdc, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x01, 0x07, 0x01, 0x39, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x82, 0x00, 0x00, 0x06, 0x7e, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x31, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x05, 0x23, 0x05, 0xb0, + 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, + 0x05, 0x2e, 0x05, 0xc4, 0x02, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x84, 0x00, 0x00, 0x05, 0x24, 0x05, 0xb0, 0x02, 0x06, 0x00, 0xb6, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0xdd, 0x05, 0xb0, + 0x02, 0x06, 0x00, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, + 0x04, 0xfb, 0x05, 0xc4, 0x02, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x28, 0x00, 0x00, 0x04, 0xca, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x38, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x16, 0x00, 0x00, 0x05, 0x00, 0x05, 0xb0, + 0x02, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, + 0x04, 0x06, 0x04, 0x4e, 0x02, 0x06, 0x00, 0x45, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x04, 0x4e, 0x02, 0x06, 0x00, 0x49, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x6f, 0x00, 0x00, 0x04, 0x1c, 0x05, 0xf1, + 0x02, 0x26, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x00, 0x87, + 0xff, 0xfb, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, + 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, 0x04, 0x4e, 0x02, 0x06, + 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6f, 0xfe, 0x60, 0x04, 0x3d, + 0x04, 0x4e, 0x02, 0x06, 0x00, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, + 0xff, 0xec, 0x03, 0xf6, 0x04, 0x4e, 0x00, 0x1c, 0x00, 0x3f, 0xb2, 0x16, + 0x1d, 0x1e, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, + 0x2f, 0x1b, 0xb1, 0x0f, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, + 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, + 0x31, 0x25, 0x32, 0x36, 0x37, 0x21, 0x0e, 0x02, 0x23, 0x22, 0x00, 0x11, + 0x35, 0x34, 0x00, 0x33, 0x32, 0x16, 0x17, 0x21, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x15, 0x14, 0x16, 0x02, 0x31, 0x50, 0x64, 0x02, 0x01, 0x0f, + 0x01, 0x76, 0xcd, 0x7c, 0xe8, 0xfe, 0xf4, 0x01, 0x0a, 0xe8, 0xcb, 0xf5, + 0x02, 0xfe, 0xf1, 0x02, 0x64, 0x52, 0x65, 0x67, 0x66, 0xd5, 0x58, 0x49, + 0x6e, 0xb7, 0x65, 0x01, 0x27, 0x01, 0x04, 0x13, 0xfa, 0x01, 0x2a, 0xe7, + 0xc0, 0x54, 0x69, 0x93, 0xa5, 0x1e, 0xa7, 0x92, 0xff, 0xff, 0x00, 0x03, + 0xfe, 0x4b, 0x04, 0x01, 0x04, 0x3a, 0x02, 0x06, 0x00, 0x5d, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x04, 0x3a, 0x02, 0x06, + 0x00, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, + 0x05, 0xd4, 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, + 0x44, 0x00, 0xff, 0xff, 0x00, 0x6f, 0x00, 0x00, 0x03, 0x50, 0x05, 0xfb, + 0x02, 0x26, 0x00, 0xec, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x00, 0xba, + 0xff, 0xfb, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x08, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x38, 0xff, 0xec, 0x03, 0xd2, 0x04, 0x4e, 0x02, 0x06, + 0x00, 0x57, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6d, 0x00, 0x00, 0x01, 0xb1, + 0x05, 0xe7, 0x02, 0x06, 0x00, 0x4d, 0x00, 0x00, 0xff, 0xff, 0xff, 0x9b, + 0x00, 0x00, 0x02, 0x97, 0x05, 0xc5, 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x6a, 0xff, 0x3d, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xa1, + 0xfe, 0x4b, 0x01, 0xac, 0x05, 0xe7, 0x02, 0x06, 0x00, 0x4e, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x84, 0x05, 0xfb, 0x02, 0x26, + 0x00, 0xf1, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x53, 0xff, 0xfb, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x03, 0xfe, 0x4b, 0x04, 0x01, 0x05, 0xf6, 0x02, 0x26, 0x00, 0x5d, + 0x00, 0x00, 0x01, 0x06, 0x00, 0xa1, 0x45, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, 0x59, + 0xb0, 0x14, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, + 0x06, 0xdf, 0x07, 0x36, 0x02, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x44, 0x01, 0xe2, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x0e, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x05, 0xc1, + 0x06, 0x00, 0x02, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, + 0x01, 0x48, 0x00, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x14, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, 0x06, 0xdf, 0x07, 0x36, + 0x02, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x02, 0x97, + 0x01, 0x36, 0x00, 0x09, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x0f, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x05, 0xc1, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0xfd, + 0x00, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, + 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, 0x06, 0xdf, 0x07, 0x0a, 0x02, 0x26, + 0x00, 0x3b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x01, 0xab, 0x01, 0x36, + 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x05, 0xc1, 0x05, 0xd4, 0x02, 0x26, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x01, 0x11, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x04, 0xef, 0x07, 0x36, 0x02, 0x26, + 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x00, 0xd6, 0x01, 0x36, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x0a, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x03, 0xfe, 0x4b, 0x04, 0x01, 0x06, 0x00, 0x02, 0x26, 0x00, 0x5d, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x44, 0x63, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, + 0xb0, 0x12, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x03, 0xd9, + 0x01, 0x13, 0x06, 0x00, 0x02, 0x06, 0x00, 0x0b, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x40, 0x03, 0xdb, 0x02, 0x4f, 0x06, 0x00, 0x02, 0x06, 0x00, 0x06, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x7c, 0xff, 0xf0, 0x03, 0xec, 0x05, 0xb0, + 0x00, 0x26, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x05, 0x02, 0x2d, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x89, 0xfe, 0x4b, 0x02, 0x9c, 0x05, 0xe7, + 0x02, 0x26, 0x00, 0x9c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x9f, 0xff, 0x34, + 0xff, 0xe6, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, + 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb0, 0x12, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x3a, 0x03, 0xf1, 0x01, 0x79, 0x06, 0x00, 0x02, 0x06, + 0x01, 0x85, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x06, 0x7e, + 0x07, 0x36, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x02, 0x8c, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, 0xb0, 0x11, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x6f, 0x00, 0x00, 0x06, 0x7e, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x02, 0x99, + 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x20, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, 0xfe, 0x77, 0x05, 0x5c, 0x05, 0xb0, + 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa7, 0x01, 0x6d, + 0x00, 0x06, 0xff, 0xff, 0x00, 0x44, 0xfe, 0x81, 0x04, 0x06, 0x04, 0x4e, + 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa7, 0x00, 0x8f, + 0x00, 0x10, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x07, 0x39, + 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x00, 0xd6, + 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x78, 0x00, 0x00, 0x05, 0x18, 0x07, 0x39, 0x02, 0x26, + 0x00, 0xdc, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x01, 0x25, 0x01, 0x39, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x0b, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x06, 0x00, 0x02, 0x26, 0x00, 0x49, + 0x00, 0x00, 0x01, 0x06, 0x00, 0x44, 0x7b, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, + 0xb0, 0x1f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6f, 0x00, 0x00, + 0x04, 0x1c, 0x05, 0xfb, 0x02, 0x26, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x44, 0x00, 0xa5, 0xff, 0xfb, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x0b, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x34, 0x00, 0x00, 0x05, 0x98, + 0x05, 0xb0, 0x02, 0x06, 0x00, 0xb9, 0x00, 0x00, 0xff, 0xff, 0x00, 0x44, + 0xfe, 0x22, 0x05, 0xb1, 0x04, 0x3a, 0x02, 0x06, 0x00, 0xcd, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x05, 0x08, 0x07, 0x13, 0x02, 0x26, + 0x01, 0x19, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, 0x04, 0x5c, 0x01, 0x25, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, + 0x0f, 0x18, 0x3e, 0x59, 0xb0, 0x11, 0xdc, 0xb0, 0x15, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x04, 0x24, 0x05, 0xe2, 0x02, 0x26, + 0x01, 0x1a, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, 0x03, 0xfa, 0xff, 0xf4, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, + 0x11, 0x14, 0x3e, 0x59, 0xb0, 0x13, 0xdc, 0xb0, 0x17, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x42, 0xfe, 0x4b, 0x08, 0x87, 0x04, 0x4e, 0x00, 0x26, + 0x00, 0x53, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5d, 0x04, 0x86, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x56, 0xfe, 0x4b, 0x09, 0x87, 0x05, 0xc4, 0x00, 0x26, + 0x00, 0x33, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5d, 0x05, 0x86, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x43, 0xfe, 0x20, 0x04, 0x94, 0x05, 0xc3, 0x02, 0x26, + 0x00, 0xdb, 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x01, 0x87, 0xff, 0x85, + 0xff, 0xff, 0x00, 0x45, 0xfe, 0x21, 0x03, 0xdb, 0x04, 0x4d, 0x02, 0x26, + 0x00, 0xef, 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x01, 0x2a, 0xff, 0x86, + 0xff, 0xff, 0x00, 0x56, 0xfe, 0x28, 0x04, 0xfb, 0x05, 0xc4, 0x02, 0x26, + 0x00, 0x27, 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x01, 0xc3, 0xff, 0x8d, + 0xff, 0xff, 0x00, 0x42, 0xfe, 0x28, 0x03, 0xf6, 0x04, 0x4e, 0x02, 0x26, + 0x00, 0x47, 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x01, 0x40, 0xff, 0x8d, + 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x04, 0xef, 0x05, 0xb0, 0x02, 0x06, + 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x11, 0xfe, 0x5f, 0x04, 0x06, + 0x04, 0x3a, 0x02, 0x06, 0x00, 0xbd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x95, + 0x00, 0x00, 0x01, 0xc1, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x2d, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x11, 0x00, 0x00, 0x07, 0xfa, 0x07, 0x2f, 0x02, 0x26, + 0x00, 0xda, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x02, 0x3d, 0x01, 0x39, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, + 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x19, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x27, 0x00, 0x00, 0x06, 0xba, 0x05, 0xf1, 0x02, 0x26, 0x00, 0xee, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x01, 0xb2, 0xff, 0xfb, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, + 0x3e, 0x59, 0xb0, 0x19, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x95, + 0x00, 0x00, 0x01, 0xc1, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x2d, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x07, 0x2c, 0x02, 0x26, + 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x00, 0xf1, 0x01, 0x36, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, 0x05, 0xf6, 0x02, 0x26, 0x00, 0x45, + 0x00, 0x00, 0x01, 0x06, 0x00, 0xa1, 0x64, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, + 0xb0, 0x2d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, + 0x05, 0x5c, 0x07, 0x0a, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x6a, 0x00, 0xd8, 0x01, 0x36, 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, + 0x04, 0x06, 0x05, 0xd4, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x6a, 0x4b, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x07, 0x49, + 0x05, 0xb0, 0x02, 0x06, 0x00, 0x81, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, + 0xff, 0xec, 0x06, 0x8d, 0x04, 0x50, 0x02, 0x06, 0x00, 0x86, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x07, 0x2f, 0x02, 0x26, + 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x00, 0xb8, 0x01, 0x39, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x05, 0xf6, 0x02, 0x26, 0x00, 0x49, + 0x00, 0x00, 0x01, 0x06, 0x00, 0xa1, 0x5d, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, + 0xb0, 0x21, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4b, 0xff, 0xeb, + 0x05, 0x2e, 0x06, 0xde, 0x02, 0x26, 0x01, 0x58, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x6a, 0x00, 0xb3, 0x01, 0x0a, 0xff, 0xff, 0x00, 0x4e, 0xff, 0xec, + 0x04, 0x01, 0x04, 0x4f, 0x02, 0x06, 0x00, 0x9d, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x4e, 0xff, 0xec, 0x04, 0x01, 0x05, 0xd5, 0x02, 0x26, 0x00, 0x9d, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x46, 0x01, 0xff, 0xff, 0x00, 0x11, + 0x00, 0x00, 0x07, 0xfa, 0x07, 0x0d, 0x02, 0x26, 0x00, 0xda, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x6a, 0x02, 0x24, 0x01, 0x39, 0xff, 0xff, 0x00, 0x27, + 0x00, 0x00, 0x06, 0xba, 0x05, 0xcf, 0x02, 0x26, 0x00, 0xee, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x6a, 0x01, 0x99, 0xff, 0xfb, 0xff, 0xff, 0x00, 0x43, + 0xff, 0xed, 0x04, 0x94, 0x07, 0x12, 0x02, 0x26, 0x00, 0xdb, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x6a, 0x00, 0x8e, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x45, + 0xff, 0xec, 0x03, 0xdb, 0x05, 0xd4, 0x02, 0x26, 0x00, 0xef, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x6a, 0x38, 0x00, 0xff, 0xff, 0x00, 0x78, 0x00, 0x00, + 0x05, 0x18, 0x06, 0xe5, 0x02, 0x26, 0x00, 0xdc, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x70, 0x00, 0xcb, 0x01, 0x37, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x0b, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6f, 0x00, 0x00, 0x04, 0x1c, + 0x05, 0xa7, 0x02, 0x26, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x06, 0x00, 0x70, + 0x4b, 0xf9, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, + 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x0b, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x78, 0x00, 0x00, 0x05, 0x18, 0x07, 0x0d, 0x02, 0x26, + 0x00, 0xdc, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0xee, 0x01, 0x39, + 0xff, 0xff, 0x00, 0x6f, 0x00, 0x00, 0x04, 0x1c, 0x05, 0xcf, 0x02, 0x26, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x6e, 0xfb, 0xff, 0xff, + 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, 0x07, 0x0a, 0x02, 0x26, 0x00, 0x33, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0xe6, 0x01, 0x36, 0xff, 0xff, + 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, 0x05, 0xd4, 0x02, 0x26, 0x00, 0x53, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x64, 0x00, 0xff, 0xff, 0x00, 0x5a, + 0xff, 0xec, 0x05, 0x32, 0x05, 0xc4, 0x02, 0x06, 0x01, 0x17, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x40, 0xff, 0xec, 0x04, 0x41, 0x04, 0x4e, 0x02, 0x06, + 0x01, 0x18, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0xff, 0xec, 0x05, 0x32, + 0x07, 0x0b, 0x02, 0x26, 0x01, 0x17, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, + 0x00, 0xf8, 0x01, 0x37, 0xff, 0xff, 0x00, 0x40, 0xff, 0xec, 0x04, 0x41, + 0x05, 0xd4, 0x02, 0x26, 0x01, 0x18, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, + 0x5b, 0x00, 0xff, 0xff, 0x00, 0x3e, 0xff, 0xec, 0x04, 0xe2, 0x07, 0x13, + 0x02, 0x26, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0xb3, + 0x01, 0x3f, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xec, 0x03, 0xee, 0x05, 0xd4, + 0x02, 0x26, 0x00, 0xff, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x30, 0x00, + 0xff, 0xff, 0x00, 0x1f, 0xff, 0xeb, 0x04, 0xf1, 0x06, 0xe5, 0x02, 0x26, + 0x00, 0xde, 0x00, 0x00, 0x01, 0x07, 0x00, 0x70, 0x00, 0x9d, 0x01, 0x37, + 0x00, 0x09, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x11, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x03, 0xfe, 0x4b, 0x04, 0x01, 0x05, 0xad, 0x02, 0x26, + 0x00, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x00, 0x70, 0x09, 0xff, 0x00, 0x09, + 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x11, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x1f, 0xff, 0xeb, 0x04, 0xf1, 0x07, 0x0d, 0x02, 0x26, 0x00, 0xde, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 0xc0, 0x01, 0x39, 0xff, 0xff, + 0x00, 0x03, 0xfe, 0x4b, 0x04, 0x01, 0x05, 0xd4, 0x02, 0x26, 0x00, 0x5d, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x2c, 0x00, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xeb, 0x04, 0xf1, 0x07, 0x38, 0x02, 0x26, 0x00, 0xde, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa6, 0x01, 0x32, 0x01, 0x39, 0x00, 0x16, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x18, 0x3e, 0x59, + 0xb0, 0x17, 0xdc, 0xb0, 0x13, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x03, + 0xfe, 0x4b, 0x04, 0x1b, 0x05, 0xff, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa6, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x16, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, 0x59, + 0xb0, 0x13, 0xdc, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x89, + 0x00, 0x00, 0x05, 0x0c, 0x07, 0x0d, 0x02, 0x26, 0x00, 0xe1, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x6a, 0x01, 0x14, 0x01, 0x39, 0xff, 0xff, 0x00, 0x58, + 0x00, 0x00, 0x03, 0xff, 0x05, 0xcf, 0x02, 0x26, 0x00, 0xf9, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x6a, 0x63, 0xfb, 0xff, 0xff, 0x00, 0x85, 0x00, 0x00, + 0x06, 0x74, 0x07, 0x0d, 0x00, 0x26, 0x00, 0xe6, 0x05, 0x00, 0x00, 0x27, + 0x00, 0x2d, 0x04, 0xb3, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x01, 0xa9, + 0x01, 0x39, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x06, 0x10, 0x05, 0xcf, + 0x00, 0x26, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x27, 0x00, 0x8d, 0x04, 0x69, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x01, 0x7a, 0xff, 0xfb, 0xff, 0xff, + 0x00, 0x42, 0xff, 0xec, 0x04, 0x11, 0x06, 0x00, 0x02, 0x06, 0x00, 0x48, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x07, 0xfe, 0x91, 0x05, 0x5c, 0x05, 0xb0, + 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x05, 0x11, + 0x00, 0x06, 0xff, 0xff, 0x00, 0x44, 0xfe, 0x9b, 0x04, 0x06, 0x04, 0x4e, + 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x04, 0x33, + 0x00, 0x10, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x07, 0xba, + 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x00, 0xab, 0x05, 0x15, + 0x01, 0x34, 0x00, 0x09, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x0b, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, 0x06, 0x85, + 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x01, 0x07, 0x00, 0xab, 0x04, 0x88, + 0xff, 0xff, 0x00, 0x09, 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x2a, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x61, 0x07, 0x95, + 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x02, 0x37, 0x00, 0xc1, + 0x01, 0x13, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, + 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0xb0, 0x14, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0xd4, 0x06, 0x60, + 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x02, 0x37, 0x34, 0xde, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, + 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x2d, 0xdc, 0xb0, 0x33, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x5c, 0x07, 0x94, 0x02, 0x26, + 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x02, 0x38, 0x00, 0xc1, 0x01, 0x18, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0xb0, 0x13, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0xff, 0x79, 0xff, 0xec, 0x04, 0x06, 0x06, 0x5f, 0x02, 0x26, + 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x02, 0x38, 0x34, 0xe3, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, + 0x3e, 0x59, 0xb0, 0x2d, 0xdc, 0xb0, 0x32, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x07, 0xcd, 0x02, 0x26, 0x00, 0x25, + 0x00, 0x00, 0x01, 0x07, 0x02, 0x39, 0x00, 0xbf, 0x01, 0x0d, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, + 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0xb0, 0x20, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x44, 0xff, 0xec, 0x04, 0x4e, 0x06, 0x98, 0x02, 0x26, 0x00, 0x45, + 0x00, 0x00, 0x01, 0x06, 0x02, 0x39, 0x32, 0xd8, 0x00, 0x16, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, + 0xb0, 0x2b, 0xdc, 0xb0, 0x31, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x07, + 0x00, 0x00, 0x05, 0x5c, 0x07, 0xcf, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, + 0x01, 0x07, 0x02, 0x3a, 0x00, 0xc1, 0x01, 0x08, 0x00, 0x16, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x18, 0x3e, 0x59, + 0xb0, 0x0c, 0xdc, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x44, + 0xff, 0xec, 0x04, 0x06, 0x06, 0x9a, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, + 0x01, 0x06, 0x02, 0x3a, 0x34, 0xd3, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x2b, + 0xdc, 0xb0, 0x34, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x07, 0xfe, 0x91, + 0x05, 0x5c, 0x07, 0x36, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x00, 0x27, + 0x00, 0x9e, 0x00, 0xbd, 0x01, 0x36, 0x01, 0x07, 0x00, 0xad, 0x05, 0x11, + 0x00, 0x06, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x44, 0xfe, 0x9b, 0x04, 0x06, 0x06, 0x00, 0x02, 0x26, + 0x00, 0x45, 0x00, 0x00, 0x00, 0x26, 0x00, 0x9e, 0x30, 0x00, 0x01, 0x07, + 0x00, 0xad, 0x04, 0x33, 0x00, 0x10, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x2e, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, + 0x07, 0xa5, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x02, 0x3c, + 0x00, 0xed, 0x01, 0x37, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0xb0, + 0x1a, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, + 0x06, 0x6f, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x02, 0x3c, + 0x60, 0x01, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, + 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x2d, 0xdc, 0xb0, 0x39, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x07, 0xa5, + 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x02, 0x35, 0x00, 0xed, + 0x01, 0x37, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0xb0, 0x1c, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, 0x06, 0x6f, + 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x02, 0x35, 0x60, 0x01, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, + 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x2d, 0xdc, 0xb0, 0x3b, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x08, 0x38, 0x02, 0x26, + 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x02, 0x3d, 0x00, 0xe7, 0x01, 0x2e, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0xb0, 0x27, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, 0x07, 0x03, 0x02, 0x26, + 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x02, 0x3d, 0x5a, 0xf9, 0x00, 0x0c, + 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x2d, 0xdc, 0xb0, 0x38, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, 0x08, 0x17, 0x02, 0x26, + 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x02, 0x50, 0x00, 0xed, 0x01, 0x33, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0e, 0xdc, 0xb0, 0x1b, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x44, 0xff, 0xec, 0x04, 0x06, 0x06, 0xe2, 0x02, 0x26, + 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x02, 0x50, 0x60, 0xfe, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, + 0x3e, 0x59, 0xb0, 0x2d, 0xdc, 0xb0, 0x3a, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x07, 0xfe, 0x91, 0x05, 0x5c, 0x07, 0x2c, 0x02, 0x26, 0x00, 0x25, + 0x00, 0x00, 0x00, 0x27, 0x00, 0xa1, 0x00, 0xf1, 0x01, 0x36, 0x01, 0x07, + 0x00, 0xad, 0x05, 0x11, 0x00, 0x06, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0e, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x44, 0xfe, 0x9b, 0x04, 0x06, + 0x05, 0xf6, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x00, 0x26, 0x00, 0xa1, + 0x64, 0x00, 0x01, 0x07, 0x00, 0xad, 0x04, 0x33, 0x00, 0x10, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, + 0x3e, 0x59, 0xb0, 0x2d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x95, 0x04, 0x52, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0xd4, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x48, + 0xfe, 0x8b, 0x04, 0x1e, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0x90, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x04, 0x52, 0x07, 0xbd, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xab, 0x04, 0xdc, 0x01, 0x37, 0x00, 0x09, 0x00, 0xb0, + 0x06, 0x2f, 0xb0, 0x0c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x48, + 0xff, 0xec, 0x04, 0x1e, 0x06, 0x85, 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xab, 0x04, 0x81, 0xff, 0xff, 0x00, 0x09, 0x00, 0xb0, + 0x08, 0x2f, 0xb0, 0x1e, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x04, 0x52, 0x07, 0x36, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa5, 0x00, 0x8d, 0x01, 0x37, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, + 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, + 0x04, 0x1e, 0x05, 0xfe, 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x06, + 0x00, 0xa5, 0x32, 0xff, 0x00, 0x09, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x29, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x05, 0x28, + 0x07, 0x98, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x02, 0x37, + 0x00, 0x88, 0x01, 0x16, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x11, 0xdc, 0xb0, + 0x15, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, 0x04, 0xcd, + 0x06, 0x60, 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x06, 0x02, 0x37, + 0x2d, 0xde, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, + 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x21, 0xdc, 0xb0, 0x27, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0xff, 0xcd, 0x00, 0x00, 0x04, 0x52, 0x07, 0x97, + 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x02, 0x38, 0x00, 0x88, + 0x01, 0x1b, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, + 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0xb0, 0x14, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0xff, 0x72, 0xff, 0xec, 0x04, 0x1e, 0x06, 0x5f, + 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x06, 0x02, 0x38, 0x2d, 0xe3, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, + 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x21, 0xdc, 0xb0, 0x26, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x04, 0xa2, 0x07, 0xd0, 0x02, 0x26, + 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x02, 0x39, 0x00, 0x86, 0x01, 0x10, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0xb0, 0x13, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x48, 0xff, 0xec, 0x04, 0x47, 0x06, 0x98, 0x02, 0x26, + 0x00, 0x49, 0x00, 0x00, 0x01, 0x06, 0x02, 0x39, 0x2b, 0xd8, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, + 0x3e, 0x59, 0xb0, 0x21, 0xdc, 0xb0, 0x25, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x82, 0x00, 0x00, 0x04, 0x52, 0x07, 0xd2, 0x02, 0x26, 0x00, 0x29, + 0x00, 0x00, 0x01, 0x07, 0x02, 0x3a, 0x00, 0x88, 0x01, 0x0b, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, + 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x48, 0xff, 0xec, 0x04, 0x1e, 0x06, 0x9a, 0x02, 0x26, 0x00, 0x49, + 0x00, 0x00, 0x01, 0x06, 0x02, 0x3a, 0x2d, 0xd3, 0x00, 0x16, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, + 0xb0, 0x1f, 0xdc, 0xb0, 0x28, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x95, 0x04, 0x52, 0x07, 0x39, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, + 0x00, 0x27, 0x00, 0x9e, 0x00, 0x84, 0x01, 0x39, 0x01, 0x07, 0x00, 0xad, + 0x04, 0xd4, 0x00, 0x0a, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x10, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x48, 0xfe, 0x8b, 0x04, 0x1e, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x00, 0x26, 0x00, 0x9e, 0x29, 0x00, + 0x01, 0x07, 0x00, 0xad, 0x04, 0x90, 0x00, 0x00, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, + 0xb0, 0x22, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, + 0x02, 0x2c, 0x07, 0xbd, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xab, 0x03, 0x8b, 0x01, 0x37, 0x00, 0x09, 0x00, 0xb0, 0x02, 0x2f, + 0xb0, 0x04, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x86, 0x00, 0x00, + 0x02, 0x1a, 0x06, 0x75, 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xab, 0x03, 0x79, 0xff, 0xef, 0x00, 0x09, 0x00, 0xb0, 0x02, 0x2f, + 0xb0, 0x04, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0x8d, + 0x01, 0xcb, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x07, + 0x00, 0xad, 0x03, 0x81, 0x00, 0x02, 0xff, 0xff, 0x00, 0x6d, 0xfe, 0x95, + 0x01, 0xb1, 0x05, 0xe7, 0x02, 0x26, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x07, + 0x00, 0xad, 0x03, 0x66, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x56, 0xfe, 0x8b, + 0x05, 0x2e, 0x05, 0xc4, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x00, 0x07, + 0x00, 0xad, 0x05, 0x1e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0xfe, 0x85, + 0x04, 0x43, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x00, 0x07, + 0x00, 0xad, 0x04, 0x99, 0xff, 0xfa, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, + 0x05, 0x2e, 0x07, 0xba, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xab, 0x05, 0x23, 0x01, 0x34, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x1f, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, + 0x06, 0x85, 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x01, 0x07, 0x00, 0xab, + 0x04, 0xa1, 0xff, 0xff, 0x00, 0x09, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x1a, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x6f, + 0x07, 0x95, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x02, 0x37, + 0x00, 0xcf, 0x01, 0x13, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x22, 0xdc, 0xb0, + 0x28, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x04, 0xed, + 0x06, 0x60, 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x01, 0x06, 0x02, 0x37, + 0x4d, 0xde, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x1d, 0xdc, 0xb0, 0x23, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0x00, 0x14, 0xff, 0xec, 0x05, 0x2e, 0x07, 0x94, + 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x02, 0x38, 0x00, 0xcf, + 0x01, 0x18, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, + 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x22, 0xdc, 0xb0, 0x27, 0xd0, + 0x30, 0x31, 0xff, 0xff, 0xff, 0x92, 0xff, 0xec, 0x04, 0x43, 0x06, 0x5f, + 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x01, 0x06, 0x02, 0x38, 0x4d, 0xe3, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x1d, 0xdc, 0xb0, 0x22, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, 0x07, 0xcd, 0x02, 0x26, + 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x02, 0x39, 0x00, 0xcd, 0x01, 0x0d, + 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, + 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x22, 0xdc, 0xb0, 0x26, 0xd0, 0x30, 0x31, + 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x04, 0x67, 0x06, 0x98, 0x02, 0x26, + 0x00, 0x53, 0x00, 0x00, 0x01, 0x06, 0x02, 0x39, 0x4b, 0xd8, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, + 0x3e, 0x59, 0xb0, 0x1d, 0xdc, 0xb0, 0x21, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, 0x07, 0xcf, 0x02, 0x26, 0x00, 0x33, + 0x00, 0x00, 0x01, 0x07, 0x02, 0x3a, 0x00, 0xcf, 0x01, 0x08, 0x00, 0x16, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, + 0x3e, 0x59, 0xb0, 0x20, 0xdc, 0xb0, 0x29, 0xd0, 0x30, 0x31, 0xff, 0xff, + 0x00, 0x42, 0xff, 0xec, 0x04, 0x43, 0x06, 0x9a, 0x02, 0x26, 0x00, 0x53, + 0x00, 0x00, 0x01, 0x06, 0x02, 0x3a, 0x4d, 0xd3, 0x00, 0x16, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, + 0xb0, 0x1d, 0xdc, 0xb0, 0x24, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x56, + 0xfe, 0x8b, 0x05, 0x2e, 0x07, 0x36, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, + 0x00, 0x27, 0x00, 0x9e, 0x00, 0xcb, 0x01, 0x36, 0x01, 0x07, 0x00, 0xad, + 0x05, 0x1e, 0x00, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x23, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xfe, 0x85, 0x04, 0x43, 0x06, 0x00, + 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x00, 0x26, 0x00, 0x9e, 0x49, 0x00, + 0x01, 0x07, 0x00, 0xad, 0x04, 0x99, 0xff, 0xfa, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, + 0xb0, 0x1e, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x50, 0xff, 0xec, + 0x05, 0xbb, 0x07, 0x39, 0x02, 0x26, 0x00, 0x98, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x75, 0x01, 0xd1, 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x29, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xec, 0x04, 0xb7, + 0x06, 0x00, 0x02, 0x26, 0x00, 0x99, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x01, 0x51, 0x00, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x25, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x50, 0xff, 0xec, 0x05, 0xbb, 0x07, 0x39, + 0x02, 0x26, 0x00, 0x98, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x01, 0x1c, + 0x01, 0x39, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, + 0x1b, 0xb1, 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x28, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x40, 0xff, 0xec, 0x04, 0xb7, 0x06, 0x00, 0x02, 0x26, + 0x00, 0x99, 0x00, 0x00, 0x01, 0x07, 0x00, 0x44, 0x00, 0x9c, 0x00, 0x00, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, + 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x24, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x50, 0xff, 0xec, 0x05, 0xbb, 0x07, 0xbd, 0x02, 0x26, 0x00, 0x98, + 0x00, 0x00, 0x01, 0x07, 0x00, 0xab, 0x05, 0x22, 0x01, 0x37, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, + 0x3e, 0x59, 0xb0, 0x27, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, + 0xff, 0xec, 0x04, 0xb7, 0x06, 0x85, 0x02, 0x26, 0x00, 0x99, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xab, 0x04, 0xa2, 0xff, 0xff, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, + 0xb0, 0x23, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x50, 0xff, 0xec, + 0x05, 0xbb, 0x07, 0x36, 0x02, 0x26, 0x00, 0x98, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa5, 0x00, 0xd3, 0x01, 0x37, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x18, 0x3e, 0x59, 0xb0, 0x2a, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xec, 0x04, 0xb7, + 0x05, 0xfe, 0x02, 0x26, 0x00, 0x99, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa5, + 0x53, 0xff, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, + 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x26, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x50, 0xfe, 0x8b, 0x05, 0xbb, 0x06, 0x1e, 0x02, 0x26, + 0x00, 0x98, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x05, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x40, 0xfe, 0x82, 0x04, 0xb7, 0x04, 0x9f, 0x02, 0x26, + 0x00, 0x99, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x04, 0x98, 0xff, 0xf7, + 0xff, 0xff, 0x00, 0x74, 0xfe, 0x8b, 0x04, 0xd0, 0x05, 0xb0, 0x02, 0x26, + 0x00, 0x39, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x04, 0xf5, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x68, 0xfe, 0x8b, 0x04, 0x0f, 0x04, 0x3a, 0x02, 0x26, + 0x00, 0x59, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x04, 0x2f, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x74, 0xff, 0xec, 0x04, 0xd0, 0x07, 0xba, 0x02, 0x26, + 0x00, 0x39, 0x00, 0x00, 0x01, 0x07, 0x00, 0xab, 0x04, 0xff, 0x01, 0x34, + 0x00, 0x09, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x11, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, 0x04, 0x0f, 0x06, 0x85, 0x02, 0x26, + 0x00, 0x59, 0x00, 0x00, 0x01, 0x07, 0x00, 0xab, 0x04, 0x9d, 0xff, 0xff, + 0x00, 0x09, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x11, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x74, 0xff, 0xec, 0x06, 0x54, 0x07, 0x42, 0x02, 0x26, + 0x00, 0x9a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0xdb, 0x01, 0x42, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, + 0x19, 0x18, 0x3e, 0x59, 0xb0, 0x1c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x68, 0xff, 0xec, 0x05, 0x37, 0x05, 0xec, 0x02, 0x26, 0x00, 0x9b, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x01, 0x50, 0xff, 0xec, 0x00, 0x13, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x14, + 0x3e, 0x59, 0xb0, 0x1b, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, + 0xff, 0xec, 0x06, 0x54, 0x07, 0x42, 0x02, 0x26, 0x00, 0x9a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x44, 0x01, 0x26, 0x01, 0x42, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x18, 0x3e, 0x59, + 0xb0, 0x1b, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, + 0x05, 0x37, 0x05, 0xec, 0x02, 0x26, 0x00, 0x9b, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x44, 0x00, 0x9b, 0xff, 0xec, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x1a, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, 0xff, 0xec, 0x06, 0x54, + 0x07, 0xc6, 0x02, 0x26, 0x00, 0x9a, 0x00, 0x00, 0x01, 0x07, 0x00, 0xab, + 0x05, 0x2c, 0x01, 0x40, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x18, 0x3e, 0x59, 0xb0, 0x1a, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, 0x05, 0x37, 0x06, 0x70, + 0x02, 0x26, 0x00, 0x9b, 0x00, 0x00, 0x01, 0x07, 0x00, 0xab, 0x04, 0xa1, + 0xff, 0xea, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, + 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x19, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0x00, 0x74, 0xff, 0xec, 0x06, 0x54, 0x07, 0x3f, 0x02, 0x26, + 0x00, 0x9a, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa5, 0x00, 0xdd, 0x01, 0x40, + 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, + 0x19, 0x18, 0x3e, 0x59, 0xb0, 0x1d, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x68, 0xff, 0xec, 0x05, 0x37, 0x05, 0xe9, 0x02, 0x26, 0x00, 0x9b, + 0x00, 0x00, 0x01, 0x06, 0x00, 0xa5, 0x52, 0xea, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x14, 0x3e, 0x59, + 0xb0, 0x1c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, 0xfe, 0x82, + 0x06, 0x54, 0x06, 0x01, 0x02, 0x26, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x07, + 0x00, 0xad, 0x05, 0x22, 0xff, 0xf7, 0xff, 0xff, 0x00, 0x68, 0xfe, 0x8b, + 0x05, 0x37, 0x04, 0x99, 0x02, 0x26, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x07, + 0x00, 0xad, 0x04, 0x92, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0xfe, 0xad, + 0x04, 0xef, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x07, + 0x00, 0xad, 0x04, 0xce, 0x00, 0x22, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x1f, + 0x04, 0x01, 0x04, 0x3a, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x07, + 0x00, 0xad, 0x05, 0x72, 0xff, 0x94, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, + 0x04, 0xef, 0x07, 0xba, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xab, 0x04, 0xdc, 0x01, 0x34, 0x00, 0x09, 0x00, 0xb0, 0x01, 0x2f, + 0xb0, 0x09, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x4b, + 0x04, 0x01, 0x06, 0x85, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xab, 0x04, 0x69, 0xff, 0xff, 0x00, 0x09, 0x00, 0xb0, 0x01, 0x2f, + 0xb0, 0x11, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, + 0x04, 0xef, 0x07, 0x33, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, + 0x00, 0xa5, 0x00, 0x8d, 0x01, 0x34, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x0c, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x4b, 0x04, 0x01, + 0x05, 0xfe, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa5, + 0x1a, 0xff, 0x00, 0x09, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x1c, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, 0xfe, 0x95, 0x04, 0xae, 0x06, 0x00, + 0x00, 0x26, 0x00, 0x48, 0x00, 0x00, 0x00, 0x27, 0x02, 0x26, 0x01, 0x66, + 0x02, 0x3a, 0x01, 0x07, 0x00, 0x43, 0x00, 0x93, 0xff, 0x77, 0x00, 0x21, + 0x00, 0xb2, 0x60, 0x1a, 0x01, 0x71, 0xb2, 0xb0, 0x1a, 0x01, 0x5d, 0xb2, + 0x20, 0x1a, 0x01, 0x71, 0xb2, 0xf0, 0x1a, 0x01, 0x5d, 0xb2, 0x2f, 0x1b, + 0x01, 0x5d, 0xb2, 0x9f, 0x1b, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, + 0x00, 0x28, 0xfe, 0x9b, 0x04, 0xca, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x02, 0x4f, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x1f, 0xfe, 0x9b, 0x03, 0xf1, 0x04, 0x3a, 0x02, 0x26, 0x00, 0xf6, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x01, 0xf8, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x89, 0xfe, 0x9b, 0x05, 0x0c, 0x05, 0xb0, 0x02, 0x26, 0x00, 0xe1, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x02, 0xa6, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x58, 0xfe, 0x9b, 0x03, 0xff, 0x04, 0x3a, 0x02, 0x26, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x01, 0x9f, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x84, 0xfe, 0x9b, 0x04, 0x3d, 0x05, 0xb0, 0x02, 0x26, 0x00, 0xb1, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x01, 0x0d, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x6f, 0xfe, 0x9b, 0x03, 0x50, 0x04, 0x3a, 0x02, 0x26, 0x00, 0xec, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x00, 0xf2, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xe5, 0xfe, 0x2a, 0x05, 0xb0, 0x05, 0xc4, 0x02, 0x26, 0x01, 0x4c, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x02, 0xc4, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xbc, 0xfe, 0x32, 0x04, 0xb2, 0x04, 0x4e, 0x02, 0x26, 0x01, 0x4d, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x51, 0x01, 0xe3, 0xff, 0x97, 0xff, 0xff, + 0x00, 0x68, 0x00, 0x00, 0x04, 0x0f, 0x06, 0x00, 0x02, 0x06, 0x00, 0x4c, + 0x00, 0x00, 0x00, 0x02, 0xff, 0xd5, 0x00, 0x00, 0x04, 0xc6, 0x05, 0xb0, + 0x00, 0x12, 0x00, 0x1b, 0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb2, 0x02, 0x0a, + 0x0f, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb2, 0x0e, 0x0f, 0x02, 0x11, + 0x12, 0x39, 0xb0, 0x0e, 0x2f, 0xb1, 0x0b, 0x07, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, + 0x11, 0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x14, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, + 0x15, 0x33, 0x20, 0x04, 0x15, 0x14, 0x00, 0x07, 0x21, 0x11, 0x23, 0x35, + 0x33, 0x35, 0x21, 0x15, 0x33, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x27, 0x02, 0x90, 0xe2, 0xea, 0x01, 0x01, 0x01, 0x2d, 0xfe, 0xd5, + 0xf8, 0xfd, 0xdd, 0xab, 0xab, 0x01, 0x2e, 0xe2, 0xe2, 0xef, 0x73, 0x89, + 0x83, 0x72, 0x04, 0x41, 0x9e, 0xf9, 0xd3, 0xd4, 0xfe, 0xff, 0x02, 0x04, + 0x41, 0xb7, 0xb8, 0xb8, 0xfd, 0xb9, 0xfe, 0x40, 0x7e, 0x6a, 0x63, 0x73, + 0x02, 0x00, 0x00, 0x02, 0xff, 0xd5, 0x00, 0x00, 0x04, 0xc6, 0x05, 0xb0, + 0x00, 0x12, 0x00, 0x1b, 0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb2, 0x02, 0x0a, + 0x10, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb2, 0x11, 0x02, 0x10, 0x11, + 0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, 0x01, 0x07, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0xd0, 0xb0, 0x11, 0x10, 0xb0, + 0x0e, 0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x14, 0x01, 0xb0, + 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, + 0x15, 0x33, 0x20, 0x04, 0x15, 0x14, 0x00, 0x07, 0x21, 0x11, 0x23, 0x35, + 0x33, 0x35, 0x21, 0x15, 0x33, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x27, 0x02, 0x90, 0xe2, 0xea, 0x01, 0x01, 0x01, 0x2d, 0xfe, 0xd5, + 0xf8, 0xfd, 0xdd, 0xab, 0xab, 0x01, 0x2e, 0xe2, 0xe2, 0xef, 0x73, 0x89, + 0x83, 0x72, 0x04, 0x41, 0x9e, 0xf9, 0xd3, 0xd4, 0xfe, 0xff, 0x02, 0x04, + 0x41, 0xb7, 0xb8, 0xb8, 0xfd, 0xb9, 0xfe, 0x40, 0x7e, 0x6a, 0x63, 0x73, + 0x02, 0x00, 0x00, 0x01, 0xff, 0xe5, 0x00, 0x00, 0x04, 0x3d, 0x05, 0xb0, + 0x00, 0x0d, 0x00, 0x4b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, + 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, + 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb2, 0x0d, 0x08, 0x02, 0x11, + 0x12, 0x39, 0xb0, 0x0d, 0x2f, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0d, 0x10, 0xb0, + 0x06, 0xd0, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, + 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x02, 0xa0, 0xf0, + 0xfe, 0xd4, 0x9f, 0x9f, 0x03, 0xb9, 0xfd, 0x73, 0xf0, 0x02, 0x96, 0xfd, + 0x6a, 0x02, 0x96, 0xb7, 0x02, 0x63, 0xf3, 0xfe, 0x90, 0x00, 0x00, 0x01, + 0xff, 0xc6, 0x00, 0x00, 0x03, 0x50, 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x4b, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, + 0x0c, 0x3e, 0x59, 0xb2, 0x0d, 0x08, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x0d, + 0x2f, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0d, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x08, + 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, + 0x21, 0x15, 0x21, 0x15, 0x33, 0x02, 0x81, 0xf1, 0xfe, 0xdf, 0xa9, 0xa9, + 0x02, 0xe1, 0xfe, 0x40, 0xf1, 0x01, 0xc5, 0xfe, 0x3b, 0x01, 0xc5, 0xb7, + 0x01, 0xbe, 0xea, 0xd4, 0x00, 0x01, 0xff, 0xcc, 0x00, 0x00, 0x05, 0x4e, + 0x05, 0xb0, 0x00, 0x14, 0x00, 0x76, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb2, + 0x0e, 0x08, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x2f, 0xb1, 0x01, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x08, + 0x02, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb1, 0x04, 0x07, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb0, 0x0a, + 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x0c, 0xd0, 0xb2, 0x12, 0x01, 0x0e, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, + 0x35, 0x21, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x01, 0x21, 0x01, 0x01, + 0x21, 0x02, 0x71, 0xad, 0xfe, 0xd4, 0xcc, 0xcc, 0x01, 0x2c, 0xc3, 0xc3, + 0x89, 0x01, 0x64, 0x01, 0x6e, 0xfe, 0x3f, 0x01, 0xf0, 0xfe, 0x9a, 0x02, + 0x53, 0xfd, 0xad, 0x04, 0x4a, 0xb7, 0xaf, 0xaf, 0xb7, 0xe1, 0x02, 0x47, + 0xfd, 0x4f, 0xfd, 0x01, 0x00, 0x01, 0xff, 0xa8, 0x00, 0x00, 0x04, 0x62, + 0x06, 0x00, 0x00, 0x14, 0x00, 0x7a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, + 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb0, + 0x02, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x0e, 0x2f, 0xb2, 0xdf, 0x0e, 0x01, + 0x5d, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, + 0x59, 0xb2, 0x07, 0x08, 0x10, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x2f, 0xb1, + 0x04, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, + 0x07, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x0c, 0xd0, 0xb2, + 0x12, 0x01, 0x0e, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, + 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x33, 0x15, 0x23, 0x11, 0x33, + 0x13, 0x21, 0x01, 0x01, 0x21, 0x02, 0x01, 0x5b, 0xfe, 0xdf, 0xdd, 0xdd, + 0x01, 0x21, 0xbd, 0xbd, 0x51, 0xf6, 0x01, 0x4e, 0xfe, 0xad, 0x01, 0x7a, + 0xfe, 0xb3, 0x01, 0xc0, 0xfe, 0x40, 0x04, 0xb8, 0xb7, 0x91, 0x91, 0xb7, + 0xfd, 0xed, 0x01, 0x95, 0xfe, 0x11, 0xfd, 0xb5, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x00, 0x04, 0xef, 0x05, 0xb0, 0x00, 0x0e, 0x00, 0x57, 0xb2, 0x0a, + 0x0f, 0x10, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, + 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, + 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb2, 0x06, 0x08, + 0x02, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x2f, 0xb1, 0x05, 0x07, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0xd0, 0xb2, 0x0a, + 0x08, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb0, 0x0e, 0xd0, 0x30, + 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x01, 0x21, 0x01, + 0x01, 0x21, 0x01, 0x33, 0x03, 0xde, 0xcd, 0xfe, 0xcf, 0xbd, 0x66, 0xfe, + 0x79, 0x01, 0x49, 0x01, 0x2d, 0x01, 0x2f, 0x01, 0x48, 0xfe, 0x79, 0x76, + 0x02, 0x02, 0xfd, 0xfe, 0x02, 0x02, 0xb7, 0x02, 0xf7, 0xfd, 0x70, 0x02, + 0x90, 0xfd, 0x09, 0x00, 0x00, 0x01, 0x00, 0x11, 0xfe, 0x5f, 0x04, 0x06, + 0x04, 0x3a, 0x00, 0x0e, 0x00, 0x64, 0xb2, 0x0a, 0x0f, 0x10, 0x11, 0x12, + 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, + 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, + 0x0b, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, + 0xb1, 0x02, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, + 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, + 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb1, 0x06, 0x07, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x0b, 0x00, 0x11, + 0x12, 0x39, 0xb0, 0x0d, 0xd0, 0xb0, 0x0e, 0xd0, 0x30, 0x31, 0x25, 0x23, + 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x01, 0x21, 0x13, 0x13, 0x21, 0x01, + 0x33, 0x03, 0x70, 0xd5, 0xfe, 0xdf, 0xc5, 0x8a, 0xfe, 0xd2, 0x01, 0x2e, + 0xd0, 0xc9, 0x01, 0x2e, 0xfe, 0xd2, 0x98, 0x0b, 0xfe, 0x54, 0x01, 0xac, + 0xb7, 0x03, 0x78, 0xfd, 0x1b, 0x02, 0xe5, 0xfc, 0x88, 0x00, 0x00, 0x01, + 0x00, 0x16, 0x00, 0x00, 0x05, 0x00, 0x05, 0xb0, 0x00, 0x11, 0x00, 0x64, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x18, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, + 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, + 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, + 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x11, 0x0b, 0x02, 0x11, 0x12, 0x39, + 0xb0, 0x11, 0x2f, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, + 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x0b, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x07, + 0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x09, 0xd0, 0xb2, 0x0d, 0x0b, 0x02, 0x11, + 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, + 0x23, 0x35, 0x33, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, 0x33, 0x03, 0xec, + 0x70, 0x01, 0x84, 0xfe, 0xa3, 0xfe, 0xe8, 0xfe, 0xe8, 0xfe, 0xa3, 0x01, + 0x84, 0x69, 0x5b, 0xfe, 0x95, 0x01, 0x59, 0x01, 0x11, 0x01, 0x11, 0x01, + 0x59, 0xfe, 0x95, 0x62, 0x02, 0x8f, 0xfd, 0x71, 0x01, 0xfe, 0xfe, 0x02, + 0x02, 0x8f, 0xb7, 0x02, 0x6a, 0xfe, 0x0a, 0x01, 0xf6, 0xfd, 0x96, 0x00, + 0x00, 0x01, 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x04, 0x3a, 0x00, 0x11, + 0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, + 0x0b, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, + 0xb1, 0x0e, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, + 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, + 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb2, 0x11, 0x0e, 0x02, 0x11, + 0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, 0x00, 0x07, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x0e, 0x02, 0x11, 0x12, 0x39, + 0xb0, 0x07, 0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x09, 0xd0, 0xb2, 0x0d, 0x0e, + 0x02, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x01, 0x21, 0x03, 0x03, + 0x21, 0x01, 0x23, 0x35, 0x33, 0x03, 0x21, 0x13, 0x13, 0x21, 0x03, 0x33, + 0x03, 0x6f, 0x7a, 0x01, 0x0e, 0xfe, 0xca, 0xc1, 0xc0, 0xfe, 0xc9, 0x01, + 0x0e, 0x6f, 0x6b, 0xfc, 0x01, 0x36, 0xb2, 0xb6, 0x01, 0x35, 0xfd, 0x76, + 0x01, 0xd0, 0xfe, 0x30, 0x01, 0x54, 0xfe, 0xac, 0x01, 0xd0, 0xb7, 0x01, + 0xb3, 0xfe, 0xbd, 0x01, 0x43, 0xfe, 0x4d, 0x00, 0xff, 0xff, 0x00, 0x5f, + 0xff, 0xec, 0x04, 0x2f, 0x04, 0x4d, 0x02, 0x06, 0x00, 0xbf, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x04, 0x36, 0x05, 0xb0, 0x02, 0x26, + 0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x02, 0x26, 0xff, 0x66, 0xfe, 0x50, + 0x00, 0x0d, 0x00, 0xb2, 0x70, 0x0d, 0x01, 0x5d, 0xb2, 0x10, 0x0d, 0x01, + 0x71, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6d, 0x02, 0x54, 0x05, 0xd2, + 0x03, 0x40, 0x00, 0x46, 0x01, 0xaf, 0x82, 0x00, 0x66, 0x66, 0x40, 0x00, + 0xff, 0xff, 0x00, 0x46, 0x00, 0x00, 0x04, 0x49, 0x05, 0xc4, 0x02, 0x06, + 0x00, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xec, 0x04, 0x33, + 0x05, 0xc4, 0x02, 0x06, 0x00, 0x17, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, + 0x00, 0x00, 0x04, 0x5f, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x18, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x69, 0xff, 0xec, 0x04, 0x42, 0x05, 0xb0, 0x02, 0x06, + 0x00, 0x19, 0x00, 0x00, 0xff, 0xff, 0x00, 0x78, 0xff, 0xec, 0x04, 0x63, + 0x05, 0xbf, 0x00, 0x06, 0x00, 0x1a, 0x14, 0x00, 0xff, 0xff, 0x00, 0x73, + 0xff, 0xec, 0x04, 0x4b, 0x05, 0xc4, 0x00, 0x06, 0x00, 0x1c, 0x14, 0x00, + 0xff, 0xff, 0x00, 0x56, 0xff, 0xf2, 0x04, 0x2c, 0x05, 0xc4, 0x00, 0x06, + 0x00, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x73, 0xff, 0xec, 0x04, 0x4b, + 0x05, 0xc4, 0x00, 0x06, 0x00, 0x14, 0x14, 0x00, 0xff, 0xff, 0x00, 0x5e, + 0xff, 0xec, 0x05, 0x02, 0x07, 0x3e, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0xc7, 0x01, 0x3e, 0x00, 0x09, 0x00, 0xb0, + 0x0c, 0x2f, 0xb0, 0x23, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x45, + 0xfe, 0x56, 0x04, 0x22, 0x06, 0x00, 0x02, 0x26, 0x00, 0x4b, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0x3a, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb0, + 0x03, 0x2f, 0xb0, 0x29, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x05, 0x22, 0x07, 0x36, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x44, 0x01, 0x31, 0x01, 0x36, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, + 0xb0, 0x0b, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, + 0x04, 0x0f, 0x06, 0x00, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x44, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x14, 0x3e, 0x59, 0xb0, 0x13, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x5c, + 0x07, 0x23, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x04, 0x85, 0x01, 0x35, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x0c, 0xdc, 0xb0, + 0x10, 0xd0, 0x30, 0x31, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xec, 0x04, 0x06, + 0x05, 0xee, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x03, 0xf8, 0x00, 0x00, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x2b, 0xdc, 0xb0, + 0x2f, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x3c, 0x00, 0x00, 0x04, 0x52, + 0x07, 0x26, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x04, 0x4c, 0x01, 0x38, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0xb0, + 0x11, 0xd0, 0x30, 0x31, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xec, 0x04, 0x1e, + 0x05, 0xee, 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x03, 0xf1, 0x00, 0x00, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x14, 0x3e, 0x59, 0xb0, 0x1f, 0xdc, 0xb0, + 0x23, 0xd0, 0x30, 0x31, 0xff, 0xff, 0xfe, 0xeb, 0x00, 0x00, 0x02, 0x51, + 0x07, 0x26, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x02, 0xfb, 0x01, 0x38, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x18, 0x3e, 0x59, 0xb0, 0x05, 0xdc, 0xb0, + 0x09, 0xd0, 0x30, 0x31, 0xff, 0xff, 0xfe, 0xd9, 0x00, 0x00, 0x02, 0x3f, + 0x05, 0xde, 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x02, 0xe9, 0xff, 0xf0, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x14, 0x3e, 0x59, 0xb0, 0x05, 0xdc, 0xb0, + 0x09, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x2e, + 0x07, 0x23, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x04, 0x93, 0x01, 0x35, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, 0xb0, 0x20, 0xdc, 0xb0, + 0x24, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x01, 0xff, 0xec, 0x04, 0x43, + 0x05, 0xee, 0x02, 0x26, 0x00, 0x53, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x04, 0x11, 0x00, 0x00, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x14, 0x3e, 0x59, 0xb0, 0x1b, 0xdc, 0xb0, + 0x1f, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x04, 0xf0, + 0x07, 0x23, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x04, 0x27, 0x01, 0x35, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x18, 0x3e, 0x59, 0xb0, 0x19, 0xdc, 0xb0, + 0x1d, 0xd0, 0x30, 0x31, 0xff, 0xff, 0xff, 0x5b, 0x00, 0x00, 0x02, 0xd3, + 0x05, 0xee, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x03, 0x6b, 0x00, 0x00, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0xb0, + 0x13, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x5f, 0xff, 0xec, 0x04, 0xd0, + 0x07, 0x23, 0x02, 0x26, 0x00, 0x39, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x04, 0x6f, 0x01, 0x35, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x18, 0x3e, 0x59, 0xb0, 0x12, 0xdc, 0xb0, + 0x16, 0xd0, 0x30, 0x31, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xec, 0x04, 0x0f, + 0x05, 0xee, 0x02, 0x26, 0x00, 0x59, 0x00, 0x00, 0x01, 0x07, 0x00, 0xac, + 0x04, 0x0d, 0x00, 0x00, 0x00, 0x16, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x14, 0x3e, 0x59, 0xb0, 0x12, 0xdc, 0xb0, + 0x16, 0xd0, 0x30, 0x31, 0xff, 0xff, 0xfe, 0x85, 0x00, 0x00, 0x05, 0x3a, + 0x06, 0x41, 0x00, 0x26, 0x00, 0xd0, 0x64, 0x00, 0x00, 0x07, 0x00, 0xae, + 0xfd, 0xab, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0xfe, 0x95, 0x04, 0xbc, + 0x05, 0xb0, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, + 0x04, 0xb0, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x6f, 0xfe, 0x82, 0x04, 0x3e, + 0x06, 0x00, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, + 0x04, 0xea, 0xff, 0xf7, 0xff, 0xff, 0x00, 0x82, 0xfe, 0x95, 0x04, 0xdb, + 0x05, 0xb0, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, + 0x04, 0x67, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x42, 0xfe, 0x8b, 0x04, 0x11, + 0x06, 0x00, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, + 0x04, 0xa4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0xfe, 0x06, 0x04, 0xdb, + 0x05, 0xb0, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0xba, + 0x01, 0x28, 0xfe, 0x9b, 0x00, 0x0d, 0x00, 0xb2, 0x50, 0x1a, 0x01, 0x5d, + 0xb2, 0xb0, 0x1a, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x42, + 0xfd, 0xfc, 0x04, 0x11, 0x06, 0x00, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, + 0x00, 0x07, 0x01, 0xba, 0x01, 0x65, 0xfe, 0x91, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x95, 0x05, 0x23, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x05, 0x2b, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x68, + 0xfe, 0x95, 0x04, 0x0f, 0x06, 0x00, 0x02, 0x26, 0x00, 0x4c, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0x9e, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x05, 0x25, 0x07, 0x36, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0x64, 0x01, 0x36, 0x00, 0x09, 0x00, 0xb0, + 0x04, 0x2f, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6f, + 0x00, 0x00, 0x04, 0x5a, 0x07, 0x38, 0x02, 0x26, 0x00, 0x4f, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0x9b, 0x01, 0x38, 0x00, 0x09, 0x00, 0xb0, + 0x05, 0x2f, 0xb0, 0x0f, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0xc9, 0x05, 0x25, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0xe3, 0x00, 0x3e, 0xff, 0xff, 0x00, 0x6f, + 0xfe, 0xb3, 0x04, 0x5a, 0x06, 0x00, 0x02, 0x26, 0x00, 0x4f, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0x8a, 0x00, 0x28, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x95, 0x04, 0x2b, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0xb0, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x6d, + 0xfe, 0x95, 0x01, 0xb0, 0x06, 0x00, 0x02, 0x26, 0x00, 0x50, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x03, 0x66, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x95, 0x06, 0x7e, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x05, 0xd6, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x6f, + 0xfe, 0x95, 0x06, 0x7e, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x05, 0xdd, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x8d, 0x05, 0x22, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x05, 0x2b, 0x00, 0x02, 0xff, 0xff, 0x00, 0x69, + 0xfe, 0x95, 0x04, 0x0f, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0x93, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x56, + 0xff, 0xec, 0x05, 0x2e, 0x07, 0xd4, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, + 0x01, 0x07, 0x02, 0x36, 0x04, 0xf8, 0x01, 0x55, 0x00, 0x16, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x18, 0x3e, 0x59, + 0xb0, 0x22, 0xdc, 0xb0, 0x35, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x82, + 0x00, 0x00, 0x04, 0xdd, 0x07, 0x42, 0x02, 0x26, 0x00, 0x34, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0x68, 0x01, 0x42, 0x00, 0x09, 0x00, 0xb0, + 0x03, 0x2f, 0xb0, 0x17, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6f, + 0xfe, 0x60, 0x04, 0x3d, 0x05, 0xf7, 0x02, 0x26, 0x00, 0x54, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0x01, 0xa7, 0xff, 0xf7, 0x00, 0x09, 0x00, 0xb0, + 0x0c, 0x2f, 0xb0, 0x1c, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x82, + 0xfe, 0x95, 0x04, 0xf0, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0xbb, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x62, + 0xfe, 0x95, 0x02, 0xd3, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x03, 0x5b, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x45, + 0xfe, 0x8b, 0x04, 0xa2, 0x05, 0xc4, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x38, + 0xfe, 0x82, 0x03, 0xd2, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0x68, 0xff, 0xf7, 0xff, 0xff, 0x00, 0x28, + 0xfe, 0x92, 0x04, 0xca, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0xcb, 0x00, 0x07, 0xff, 0xff, 0x00, 0x0a, + 0xfe, 0x8b, 0x02, 0x8d, 0x05, 0x44, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x00, 0x07, 0x00, 0xad, 0x04, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x74, + 0xff, 0xec, 0x04, 0xd0, 0x07, 0xd4, 0x02, 0x26, 0x00, 0x39, 0x00, 0x00, + 0x01, 0x07, 0x02, 0x36, 0x04, 0xd4, 0x01, 0x55, 0x00, 0x16, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x18, 0x3e, 0x59, + 0xb0, 0x14, 0xdc, 0xb0, 0x27, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x07, + 0x00, 0x00, 0x05, 0x34, 0x07, 0x3f, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0xa5, 0x00, 0xaf, 0x01, 0x40, 0x00, 0x13, 0x00, 0xb0, + 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, + 0xb0, 0x0a, 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, + 0x03, 0xfb, 0x05, 0xf4, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x06, + 0x00, 0xa5, 0x1a, 0xf5, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, 0x59, 0xb0, 0x0a, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, 0xfe, 0x95, 0x05, 0x34, 0x05, 0xb0, + 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x04, 0xf4, + 0x00, 0x0a, 0xff, 0xff, 0x00, 0x0d, 0xfe, 0x95, 0x03, 0xfb, 0x04, 0x3a, + 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x04, 0x5e, + 0x00, 0x0a, 0xff, 0xff, 0x00, 0x23, 0xfe, 0x95, 0x06, 0xdf, 0x05, 0xb0, + 0x02, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x05, 0xda, + 0x00, 0x0a, 0xff, 0xff, 0x00, 0x1c, 0xfe, 0x95, 0x05, 0xc1, 0x04, 0x3a, + 0x02, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x05, 0x47, + 0x00, 0x0a, 0xff, 0xff, 0x00, 0x49, 0xfe, 0x95, 0x04, 0x9e, 0x05, 0xb0, + 0x02, 0x26, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x04, 0xca, + 0x00, 0x0a, 0xff, 0xff, 0x00, 0x4a, 0xfe, 0x95, 0x03, 0xcc, 0x04, 0x3a, + 0x02, 0x26, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, 0x04, 0x64, + 0x00, 0x0a, 0xff, 0xff, 0xfe, 0x17, 0xff, 0xec, 0x05, 0x74, 0x05, 0xd7, + 0x00, 0x26, 0x00, 0x33, 0x46, 0x00, 0x00, 0x07, 0x01, 0x71, 0xfd, 0xbc, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xdd, 0x00, 0x00, 0x04, 0xad, 0x05, 0x1e, + 0x02, 0x26, 0x02, 0x33, 0x00, 0x00, 0x00, 0x07, 0x00, 0xae, 0xff, 0x03, + 0xfe, 0xdd, 0xff, 0xff, 0xfe, 0xf6, 0x00, 0x00, 0x03, 0xf8, 0x05, 0x21, + 0x00, 0x26, 0x02, 0x28, 0x3c, 0x00, 0x00, 0x07, 0x00, 0xae, 0xfe, 0x1c, + 0xfe, 0xe0, 0xff, 0xff, 0xfe, 0xf0, 0x00, 0x00, 0x04, 0xaf, 0x05, 0x1a, + 0x00, 0x26, 0x01, 0xe4, 0x3c, 0x00, 0x00, 0x07, 0x00, 0xae, 0xfe, 0x16, + 0xfe, 0xd9, 0xff, 0xff, 0xfe, 0xf1, 0x00, 0x00, 0x01, 0xd4, 0x05, 0x21, + 0x00, 0x26, 0x01, 0xe3, 0x3c, 0x00, 0x00, 0x07, 0x00, 0xae, 0xfe, 0x17, + 0xfe, 0xe0, 0xff, 0xff, 0xff, 0x55, 0xff, 0xf0, 0x04, 0x88, 0x05, 0x1e, + 0x00, 0x26, 0x01, 0xdd, 0x0a, 0x00, 0x00, 0x07, 0x00, 0xae, 0xfe, 0x7b, + 0xfe, 0xdd, 0xff, 0xff, 0xfe, 0xba, 0x00, 0x00, 0x04, 0x8b, 0x05, 0x1e, + 0x00, 0x26, 0x01, 0xd3, 0x3c, 0x00, 0x00, 0x07, 0x00, 0xae, 0xfd, 0xe0, + 0xfe, 0xdd, 0xff, 0xff, 0xff, 0x62, 0x00, 0x00, 0x04, 0x91, 0x05, 0x1f, + 0x00, 0x26, 0x01, 0xf3, 0x0a, 0x00, 0x00, 0x07, 0x00, 0xae, 0xfe, 0x88, + 0xfe, 0xde, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x04, 0xad, 0x04, 0x8d, + 0x02, 0x06, 0x02, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x22, 0x04, 0x8d, 0x02, 0x06, 0x02, 0x32, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x63, 0x00, 0x00, 0x03, 0xbc, 0x04, 0x8d, 0x02, 0x06, 0x02, 0x28, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, 0x00, 0x00, 0x04, 0x04, 0x04, 0x8d, + 0x02, 0x06, 0x01, 0xd2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x73, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xe4, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x76, 0x00, 0x00, 0x01, 0x98, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xe3, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x04, 0x75, 0x04, 0x8d, + 0x02, 0x06, 0x01, 0xe1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x05, 0xa3, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xdf, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x63, 0x00, 0x00, 0x04, 0x72, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xde, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, 0x04, 0x9d, + 0x02, 0x06, 0x01, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x35, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xdc, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x20, 0x00, 0x00, 0x04, 0x2f, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xd8, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x04, 0x4f, 0x04, 0x8d, + 0x02, 0x06, 0x01, 0xd3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, + 0x04, 0x5c, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xd4, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x8b, 0x00, 0x00, 0x02, 0x87, 0x05, 0xf2, 0x02, 0x26, 0x01, 0xe3, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0xff, 0x2d, 0x00, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x04, 0x4f, 0x05, 0xf2, 0x02, 0x26, 0x01, 0xd3, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x6a, 0x3f, 0x1e, 0xff, 0xff, 0x00, 0x63, + 0x00, 0x00, 0x03, 0xbc, 0x05, 0xf2, 0x02, 0x26, 0x02, 0x28, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x6a, 0x4d, 0x1e, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x03, 0xa8, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xea, 0x00, 0x00, 0x01, 0x07, + 0x00, 0x75, 0x01, 0x13, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x08, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3a, 0xff, 0xf0, 0x04, 0x01, + 0x04, 0x9d, 0x02, 0x06, 0x01, 0xd9, 0x00, 0x00, 0xff, 0xff, 0x00, 0x76, + 0x00, 0x00, 0x01, 0x98, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xe3, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x8b, 0x00, 0x00, 0x02, 0x87, 0x05, 0xf2, 0x02, 0x26, + 0x01, 0xe3, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0xff, 0x2d, 0x00, 0x1e, + 0xff, 0xff, 0x00, 0x20, 0xff, 0xf0, 0x03, 0x79, 0x04, 0x8d, 0x02, 0x06, + 0x01, 0xe2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x04, 0x75, + 0x06, 0x1e, 0x02, 0x26, 0x01, 0xe1, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0x01, 0x0d, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x16, 0x3e, 0x59, 0xb0, 0x0f, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xec, 0x04, 0x69, 0x06, 0x14, + 0x02, 0x26, 0x02, 0x01, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, 0x00, 0x8e, + 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, + 0x1b, 0xb1, 0x10, 0x16, 0x3e, 0x59, 0xb0, 0x14, 0xdc, 0x30, 0x31, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x04, 0xad, 0x04, 0x8d, 0x02, 0x06, + 0x02, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x04, 0x22, + 0x04, 0x8d, 0x02, 0x06, 0x02, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, + 0x00, 0x00, 0x03, 0xa8, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xea, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x03, 0xbc, 0x04, 0x8d, 0x02, 0x06, + 0x02, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x04, 0x76, + 0x06, 0x14, 0x02, 0x26, 0x01, 0xfe, 0x00, 0x00, 0x01, 0x07, 0x00, 0xa1, + 0x00, 0xa7, 0x00, 0x1e, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, + 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x16, 0x3e, 0x59, 0xb0, 0x0d, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x05, 0xa3, 0x04, 0x8d, + 0x02, 0x06, 0x01, 0xdf, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x73, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xe4, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x40, 0xff, 0xf0, 0x04, 0x7e, 0x04, 0x9d, 0x02, 0x06, 0x01, 0xdd, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x04, 0x7c, 0x04, 0x8d, + 0x02, 0x06, 0x01, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, + 0x04, 0x35, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xdc, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x40, 0xff, 0xf0, 0x04, 0x52, 0x04, 0x9d, 0x02, 0x06, 0x02, 0x31, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x20, 0x00, 0x00, 0x04, 0x2f, 0x04, 0x8d, + 0x02, 0x06, 0x01, 0xd8, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, + 0x04, 0x5c, 0x04, 0x8d, 0x02, 0x06, 0x01, 0xd4, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x3e, 0xfe, 0x1f, 0x03, 0xfa, 0x04, 0x9d, 0x00, 0x29, 0x00, 0xaf, + 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, + 0x18, 0x0e, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, + 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x0a, 0x19, 0x11, + 0x12, 0x39, 0xb2, 0x27, 0x19, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x27, 0x2f, + 0xb2, 0xcf, 0x27, 0x01, 0x71, 0xb4, 0xaf, 0x27, 0xbf, 0x27, 0x02, 0x5d, + 0xb2, 0x3f, 0x27, 0x01, 0x71, 0xb2, 0x9f, 0x27, 0x01, 0x71, 0xb2, 0xff, + 0x27, 0x01, 0x5d, 0xb2, 0x0f, 0x27, 0x01, 0x71, 0xb4, 0x6f, 0x27, 0x7f, + 0x27, 0x02, 0x5d, 0xb2, 0xff, 0x27, 0x01, 0x71, 0xb2, 0x0f, 0x27, 0x01, + 0x72, 0xb2, 0x8f, 0x27, 0x01, 0x72, 0xb1, 0x26, 0x08, 0xb0, 0x0a, 0x2b, + 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x10, 0x26, 0x27, 0x11, 0x12, + 0x39, 0xb0, 0x19, 0x10, 0xb0, 0x16, 0xd0, 0xb2, 0x1d, 0x19, 0x0a, 0x11, + 0x12, 0x39, 0xb0, 0x19, 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x21, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, + 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x11, 0x21, 0x11, 0x26, 0x26, 0x35, + 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, + 0x36, 0x02, 0xc6, 0x5f, 0x57, 0x47, 0x58, 0xfe, 0xde, 0xf8, 0xcb, 0xde, + 0xf7, 0x68, 0x59, 0x68, 0x6c, 0xb2, 0xa5, 0xfe, 0xdf, 0x9c, 0xa8, 0x01, + 0x22, 0x02, 0x5e, 0x56, 0x5f, 0x64, 0xc4, 0x93, 0x9d, 0xa7, 0x03, 0x37, + 0x3d, 0x41, 0x36, 0x2d, 0x98, 0xb3, 0xa7, 0x95, 0x59, 0x8c, 0x28, 0x23, + 0x8e, 0x5e, 0x82, 0xad, 0x1b, 0xfe, 0x24, 0x01, 0xdf, 0x1f, 0xae, 0x83, + 0x37, 0x41, 0x49, 0x43, 0x8d, 0x03, 0xc1, 0x04, 0x00, 0x01, 0x00, 0x63, + 0xfe, 0x9b, 0x05, 0x50, 0x04, 0x8d, 0x00, 0x0f, 0x00, 0x6d, 0x00, 0xb0, + 0x01, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, + 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, + 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, + 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb2, 0x0b, 0x03, 0x09, 0x11, 0x12, 0x39, + 0x7c, 0xb0, 0x0b, 0x2f, 0x18, 0xb2, 0xc0, 0x0b, 0x01, 0x5d, 0xb4, 0x30, + 0x0b, 0x40, 0x0b, 0x02, 0x5d, 0xb4, 0x40, 0x0b, 0x50, 0x0b, 0x02, 0x71, + 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, + 0xb0, 0x09, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x03, 0x10, 0xb1, 0x0e, 0x01, + 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, + 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, + 0x21, 0x11, 0x33, 0x05, 0x50, 0xfe, 0xdf, 0xdd, 0xfe, 0x33, 0xfe, 0xde, + 0x01, 0x22, 0x01, 0xcd, 0x01, 0x21, 0xdd, 0xfe, 0x9b, 0x01, 0x65, 0x01, + 0xc6, 0xfe, 0x3a, 0x04, 0x8d, 0xfe, 0x22, 0x01, 0xde, 0xfc, 0x40, 0x00, + 0x00, 0x01, 0x00, 0x40, 0xfe, 0x2b, 0x04, 0x52, 0x04, 0x9d, 0x00, 0x1c, + 0x00, 0x60, 0xb2, 0x0d, 0x1d, 0x1e, 0x11, 0x12, 0x39, 0x00, 0xb0, 0x04, + 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x16, + 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, + 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, + 0x06, 0x0c, 0x3e, 0x59, 0xb2, 0x11, 0x0d, 0x03, 0x11, 0x12, 0x39, 0xb0, + 0x0d, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, + 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, + 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1c, 0x03, 0x0d, 0x11, 0x12, 0x39, + 0x30, 0x31, 0x01, 0x06, 0x06, 0x07, 0x11, 0x21, 0x11, 0x26, 0x02, 0x27, + 0x35, 0x10, 0x00, 0x33, 0x32, 0x04, 0x17, 0x21, 0x26, 0x23, 0x22, 0x03, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0x51, 0x0a, 0xc5, 0xa2, + 0xfe, 0xdf, 0xb5, 0xc8, 0x02, 0x01, 0x1b, 0xf1, 0xe2, 0x01, 0x10, 0x14, + 0xfe, 0xdf, 0x0a, 0xdb, 0xe4, 0x07, 0x6f, 0x7e, 0x6d, 0x6f, 0x05, 0x01, + 0x8f, 0x9e, 0xd4, 0x1f, 0xfe, 0x2d, 0x01, 0xd5, 0x28, 0x01, 0x1d, 0xdd, + 0x3e, 0x01, 0x05, 0x01, 0x38, 0xe2, 0xc7, 0xc0, 0xfe, 0xc1, 0x4a, 0xb3, + 0xa0, 0x58, 0x5f, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x04, 0x4f, + 0x04, 0x8d, 0x02, 0x06, 0x01, 0xd3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x15, + 0xfe, 0x20, 0x05, 0xdf, 0x04, 0xab, 0x02, 0x26, 0x02, 0x17, 0x00, 0x00, + 0x00, 0x07, 0x02, 0x51, 0x03, 0x0b, 0xff, 0x85, 0xff, 0xff, 0x00, 0x63, + 0x00, 0x00, 0x04, 0x76, 0x05, 0xca, 0x02, 0x26, 0x01, 0xfe, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x70, 0x6b, 0x1c, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, + 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x16, 0x3e, 0x59, 0xb0, 0x0b, + 0xdc, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xec, 0x04, 0x69, + 0x05, 0xca, 0x02, 0x26, 0x02, 0x01, 0x00, 0x00, 0x01, 0x06, 0x00, 0x70, + 0x52, 0x1c, 0x00, 0x09, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x11, 0xdc, 0x30, + 0x31, 0x00, 0xff, 0xff, 0x00, 0x41, 0x00, 0x00, 0x05, 0x96, 0x04, 0x8d, + 0x02, 0x06, 0x01, 0xf1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x76, 0xff, 0xf0, + 0x05, 0x88, 0x04, 0x8d, 0x00, 0x26, 0x01, 0xe3, 0x00, 0x00, 0x00, 0x07, + 0x01, 0xe2, 0x02, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00, + 0x06, 0x12, 0x06, 0x00, 0x02, 0x26, 0x02, 0x73, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x75, 0x02, 0x67, 0x00, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xc9, + 0x04, 0x7e, 0x06, 0x1e, 0x02, 0x26, 0x02, 0x75, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x75, 0x01, 0x6d, 0x00, 0x1e, 0xff, 0xff, 0x00, 0x3a, 0xfd, 0xfc, + 0x04, 0x01, 0x04, 0x9d, 0x02, 0x26, 0x01, 0xd9, 0x00, 0x00, 0x00, 0x07, + 0x01, 0xba, 0x01, 0x51, 0xfe, 0x91, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, + 0x05, 0xdb, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd5, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x44, 0x01, 0x4f, 0x00, 0x1e, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, + 0x05, 0xdb, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd5, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x75, 0x02, 0x04, 0x00, 0x1e, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, + 0x05, 0xdb, 0x05, 0xf2, 0x02, 0x26, 0x01, 0xd5, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x6a, 0x01, 0x18, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x04, 0x4f, 0x06, 0x1e, 0x02, 0x26, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x44, 0x76, 0x1e, 0xff, 0xff, 0x00, 0x07, 0xfe, 0x60, 0x05, 0x5c, + 0x05, 0xb0, 0x02, 0x26, 0x00, 0x25, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa4, + 0x01, 0x85, 0x00, 0x06, 0xff, 0xff, 0x00, 0x44, 0xfe, 0x6a, 0x04, 0x06, + 0x04, 0x4e, 0x02, 0x26, 0x00, 0x45, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa4, + 0x00, 0xa7, 0x00, 0x10, 0xff, 0xff, 0x00, 0x82, 0xfe, 0x64, 0x04, 0x52, + 0x05, 0xb0, 0x02, 0x26, 0x00, 0x29, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa4, + 0x01, 0x48, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x48, 0xfe, 0x5a, 0x04, 0x1e, + 0x04, 0x4e, 0x02, 0x26, 0x00, 0x49, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa4, + 0x01, 0x04, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5a, 0x04, 0xad, + 0x04, 0x8d, 0x02, 0x26, 0x02, 0x33, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa4, + 0x01, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x62, 0x03, 0xbc, + 0x04, 0x8d, 0x02, 0x26, 0x02, 0x28, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa4, + 0x00, 0xf7, 0x00, 0x08, 0xff, 0xff, 0x00, 0x6d, 0xfe, 0x95, 0x01, 0xb0, + 0x04, 0x3a, 0x02, 0x26, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x07, 0x00, 0xad, + 0x03, 0x66, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x05, 0x0e, 0x00, 0x8f, + 0x00, 0x16, 0x00, 0x4e, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x02, 0x32, 0x00, 0x06, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, + 0x00, 0x8c, 0x00, 0xb7, 0x01, 0x3c, 0x01, 0xb5, 0x02, 0x4b, 0x02, 0xd2, + 0x02, 0xed, 0x03, 0x1a, 0x03, 0x48, 0x03, 0x7b, 0x03, 0xa3, 0x03, 0xc8, + 0x03, 0xdf, 0x04, 0x06, 0x04, 0x1d, 0x04, 0x72, 0x04, 0xa1, 0x04, 0xf9, + 0x05, 0x7d, 0x05, 0xc2, 0x06, 0x2b, 0x06, 0x94, 0x06, 0xc2, 0x07, 0x49, + 0x07, 0xb3, 0x07, 0xc3, 0x07, 0xd3, 0x07, 0xf3, 0x08, 0x1b, 0x08, 0x3b, + 0x08, 0xa2, 0x09, 0x50, 0x09, 0x91, 0x0a, 0x10, 0x0a, 0x66, 0x0a, 0xaa, + 0x0a, 0xef, 0x0b, 0x2f, 0x0b, 0x9e, 0x0b, 0xde, 0x0b, 0xfa, 0x0c, 0x30, + 0x0c, 0x75, 0x0c, 0x9a, 0x0c, 0xe9, 0x0d, 0x27, 0x0d, 0x81, 0x0d, 0xcf, + 0x0e, 0x2f, 0x0e, 0x8b, 0x0e, 0xfb, 0x0f, 0x26, 0x0f, 0x66, 0x0f, 0x98, + 0x0f, 0xe8, 0x10, 0x33, 0x10, 0x64, 0x10, 0x9d, 0x10, 0xc2, 0x10, 0xda, + 0x11, 0x00, 0x11, 0x27, 0x11, 0x41, 0x11, 0x5b, 0x11, 0xd5, 0x12, 0x38, + 0x12, 0x8d, 0x12, 0xe9, 0x13, 0x57, 0x13, 0xa9, 0x14, 0x26, 0x14, 0x6b, + 0x14, 0xa7, 0x14, 0xf3, 0x15, 0x34, 0x15, 0x50, 0x15, 0xbc, 0x16, 0x07, + 0x16, 0x57, 0x16, 0xbc, 0x17, 0x1e, 0x17, 0x5d, 0x17, 0xc4, 0x18, 0x11, + 0x18, 0x5a, 0x18, 0x8b, 0x18, 0xda, 0x19, 0x23, 0x19, 0x67, 0x19, 0xa0, + 0x19, 0xdf, 0x19, 0xf6, 0x1a, 0x34, 0x1a, 0x71, 0x1a, 0xa5, 0x1b, 0x04, + 0x1b, 0x6e, 0x1b, 0xd0, 0x1c, 0x32, 0x1c, 0x53, 0x1c, 0xed, 0x1d, 0x1f, + 0x1d, 0xc5, 0x1e, 0x35, 0x1e, 0x41, 0x1e, 0x5f, 0x1f, 0x0a, 0x1f, 0x24, + 0x1f, 0x60, 0x1f, 0xa0, 0x1f, 0xf5, 0x20, 0x72, 0x20, 0xc5, 0x21, 0x10, + 0x21, 0x3c, 0x21, 0x5d, 0x21, 0x8f, 0x21, 0xc1, 0x22, 0x05, 0x22, 0x11, + 0x22, 0x2b, 0x22, 0x3c, 0x22, 0x4d, 0x22, 0xae, 0x23, 0x14, 0x23, 0x52, + 0x23, 0xc3, 0x24, 0x17, 0x24, 0x80, 0x25, 0x4a, 0x25, 0xb9, 0x26, 0x15, + 0x26, 0x88, 0x26, 0xe8, 0x27, 0x63, 0x27, 0xc3, 0x27, 0xdf, 0x28, 0x2d, + 0x28, 0x77, 0x28, 0xb6, 0x29, 0x08, 0x29, 0x65, 0x29, 0xeb, 0x2a, 0x81, + 0x2a, 0xb2, 0x2b, 0x16, 0x2b, 0x7d, 0x2b, 0xeb, 0x2c, 0x50, 0x2c, 0xa8, + 0x2d, 0x07, 0x2d, 0x38, 0x2d, 0xa0, 0x2d, 0xd1, 0x2d, 0xf9, 0x2e, 0x07, + 0x2e, 0x33, 0x2e, 0x53, 0x2e, 0x8c, 0x2e, 0xb4, 0x2e, 0xfa, 0x2f, 0x30, + 0x2f, 0x66, 0x2f, 0x83, 0x2f, 0xa0, 0x2f, 0xa9, 0x2f, 0xd9, 0x30, 0x0b, + 0x30, 0x2d, 0x30, 0x47, 0x30, 0x89, 0x30, 0x91, 0x30, 0xb8, 0x30, 0xe6, + 0x31, 0x59, 0x31, 0x87, 0x31, 0xd8, 0x32, 0x08, 0x32, 0x45, 0x32, 0xc0, + 0x33, 0x1d, 0x33, 0x87, 0x33, 0xfd, 0x34, 0x76, 0x34, 0xaa, 0x35, 0x1d, + 0x35, 0x98, 0x35, 0xf1, 0x36, 0x3a, 0x36, 0xa7, 0x36, 0xd6, 0x37, 0x2f, + 0x37, 0xa0, 0x37, 0xf3, 0x38, 0x4e, 0x38, 0xa1, 0x38, 0xf6, 0x39, 0x3c, + 0x39, 0x7e, 0x39, 0xef, 0x3a, 0x48, 0x3a, 0xaf, 0x3b, 0x26, 0x3b, 0x75, + 0x3b, 0xec, 0x3c, 0x51, 0x3c, 0xb4, 0x3d, 0x2a, 0x3d, 0xad, 0x3e, 0x04, + 0x3e, 0x42, 0x3e, 0x9a, 0x3e, 0xf3, 0x3f, 0x67, 0x3f, 0xdd, 0x40, 0x18, + 0x40, 0x63, 0x40, 0xa8, 0x41, 0x11, 0x41, 0x49, 0x41, 0x8f, 0x41, 0xce, + 0x42, 0x19, 0x42, 0x72, 0x42, 0xd8, 0x43, 0x25, 0x43, 0x8b, 0x44, 0x07, + 0x44, 0x60, 0x44, 0xca, 0x45, 0x3c, 0x45, 0x63, 0x45, 0xb9, 0x46, 0x27, + 0x46, 0xa0, 0x46, 0xdb, 0x47, 0x24, 0x47, 0x6c, 0x47, 0xb6, 0x47, 0xf9, + 0x48, 0x29, 0x48, 0x56, 0x48, 0xe3, 0x49, 0x1b, 0x49, 0x5f, 0x49, 0x9e, + 0x49, 0xe4, 0x4a, 0x3c, 0x4a, 0xa0, 0x4a, 0xeb, 0x4b, 0x53, 0x4b, 0xd0, + 0x4c, 0x2a, 0x4c, 0xa2, 0x4d, 0x14, 0x4d, 0x87, 0x4e, 0x03, 0x4e, 0x67, + 0x4e, 0xa4, 0x4f, 0x04, 0x4f, 0x63, 0x4f, 0xcc, 0x50, 0x4a, 0x50, 0xcf, + 0x51, 0x1d, 0x51, 0x6d, 0x51, 0xdb, 0x52, 0x4b, 0x52, 0xc0, 0x53, 0x2c, + 0x53, 0xbb, 0x54, 0x41, 0x54, 0xe3, 0x55, 0x7b, 0x55, 0xf8, 0x56, 0x66, + 0x56, 0xab, 0x56, 0xf2, 0x57, 0x5e, 0x57, 0xc3, 0x58, 0x7f, 0x59, 0x37, + 0x59, 0xae, 0x5a, 0x2c, 0x5a, 0x7e, 0x5a, 0xc7, 0x5a, 0xfc, 0x5b, 0x18, + 0x5b, 0x4f, 0x5b, 0x65, 0x5b, 0x7b, 0x5c, 0x4f, 0x5c, 0xc2, 0x5c, 0xdd, + 0x5c, 0xf8, 0x5d, 0x61, 0x5d, 0xba, 0x5e, 0x2c, 0x5e, 0x5c, 0x5e, 0x86, + 0x5e, 0xde, 0x5f, 0x2c, 0x5f, 0x38, 0x5f, 0x44, 0x5f, 0x50, 0x5f, 0x5c, + 0x5f, 0xb1, 0x60, 0x07, 0x60, 0x59, 0x60, 0xac, 0x60, 0xb8, 0x60, 0xc4, + 0x61, 0x10, 0x61, 0x60, 0x61, 0xc2, 0x62, 0x19, 0x62, 0xa9, 0x63, 0x31, + 0x63, 0x3d, 0x63, 0x49, 0x63, 0x97, 0x63, 0xdc, 0x63, 0xe8, 0x63, 0xf4, + 0x64, 0x46, 0x64, 0x96, 0x64, 0xdc, 0x65, 0x4d, 0x65, 0xc5, 0x66, 0x1f, + 0x66, 0x70, 0x66, 0x7c, 0x66, 0x88, 0x66, 0xf5, 0x67, 0x51, 0x67, 0x5d, + 0x67, 0x69, 0x67, 0x75, 0x67, 0x81, 0x67, 0xe7, 0x68, 0x49, 0x68, 0xa2, + 0x68, 0xb6, 0x68, 0xd3, 0x68, 0xdf, 0x68, 0xeb, 0x69, 0x3b, 0x69, 0x9f, + 0x6a, 0x23, 0x6a, 0x97, 0x6b, 0x05, 0x6b, 0x6b, 0x6b, 0xd2, 0x6c, 0x3f, + 0x6c, 0xab, 0x6d, 0x1c, 0x6d, 0x8f, 0x6d, 0xe7, 0x6e, 0x3b, 0x6e, 0x8b, + 0x6e, 0xde, 0x6f, 0x58, 0x6f, 0x64, 0x6f, 0x70, 0x6f, 0x9c, 0x6f, 0x9c, + 0x6f, 0x9c, 0x6f, 0x9c, 0x6f, 0x9c, 0x6f, 0x9c, 0x6f, 0x9c, 0x6f, 0x9c, + 0x6f, 0x9c, 0x6f, 0x9c, 0x6f, 0x9c, 0x6f, 0x9c, 0x6f, 0x9c, 0x6f, 0x9c, + 0x6f, 0xa4, 0x6f, 0xac, 0x6f, 0xb6, 0x6f, 0xc0, 0x6f, 0xe7, 0x70, 0x0b, + 0x70, 0x2f, 0x70, 0x4d, 0x70, 0x69, 0x70, 0x75, 0x70, 0x81, 0x70, 0xb3, + 0x70, 0xf3, 0x71, 0x56, 0x71, 0x7a, 0x71, 0x86, 0x71, 0x96, 0x71, 0xb9, + 0x72, 0x82, 0x72, 0x9e, 0x72, 0xbb, 0x72, 0xce, 0x72, 0xe2, 0x73, 0x2a, + 0x73, 0xb4, 0x74, 0x53, 0x74, 0xe5, 0x74, 0xf1, 0x75, 0xaf, 0x76, 0x15, + 0x76, 0x97, 0x77, 0x6b, 0x77, 0xd6, 0x78, 0x52, 0x78, 0xae, 0x79, 0x22, + 0x79, 0xb9, 0x7a, 0x1b, 0x7a, 0xb1, 0x7b, 0x0f, 0x7b, 0x73, 0x7b, 0x8d, + 0x7b, 0xae, 0x7b, 0xcf, 0x7b, 0xe9, 0x7c, 0x55, 0x7c, 0x7d, 0x7c, 0xb6, + 0x7c, 0xcd, 0x7d, 0x02, 0x7d, 0x8f, 0x7d, 0xd2, 0x7e, 0x52, 0x7e, 0x92, + 0x7e, 0xa9, 0x7e, 0xc0, 0x7e, 0xf9, 0x7f, 0x06, 0x7f, 0x30, 0x7f, 0x52, + 0x7f, 0x5e, 0x7f, 0xc9, 0x80, 0x1d, 0x80, 0xbb, 0x81, 0x43, 0x81, 0xc4, + 0x82, 0x9c, 0x82, 0x9c, 0x84, 0x0d, 0x84, 0x7c, 0x84, 0xd0, 0x84, 0xfc, + 0x85, 0x47, 0x85, 0xaf, 0x86, 0x31, 0x86, 0x62, 0x86, 0xc3, 0x87, 0x25, + 0x87, 0x6f, 0x87, 0xe8, 0x88, 0x3b, 0x88, 0x6d, 0x88, 0xbb, 0x88, 0xf4, + 0x89, 0x25, 0x89, 0x6e, 0x89, 0xbe, 0x89, 0xef, 0x8a, 0x29, 0x8a, 0x54, + 0x8a, 0xc3, 0x8b, 0x1a, 0x8b, 0x77, 0x8b, 0xc3, 0x8c, 0x1b, 0x8c, 0x56, + 0x8c, 0xa8, 0x8c, 0xcd, 0x8d, 0x12, 0x8d, 0x44, 0x8d, 0x60, 0x8d, 0xaa, + 0x8e, 0x12, 0x8e, 0x4f, 0x8e, 0xca, 0x8f, 0x34, 0x8f, 0x97, 0x8f, 0xc2, + 0x8f, 0xf8, 0x90, 0x6f, 0x90, 0xa3, 0x90, 0xf0, 0x91, 0x23, 0x91, 0x62, + 0x91, 0xd0, 0x92, 0x2d, 0x92, 0x8d, 0x92, 0xec, 0x93, 0x66, 0x93, 0xdd, + 0x94, 0x5b, 0x94, 0xae, 0x94, 0xef, 0x95, 0x43, 0x95, 0x9a, 0x96, 0x17, + 0x96, 0xa0, 0x96, 0xde, 0x97, 0x29, 0x97, 0x74, 0x97, 0xb9, 0x97, 0xf6, + 0x98, 0x3a, 0x98, 0x7b, 0x98, 0xc7, 0x99, 0x1f, 0x99, 0x2b, 0x99, 0x79, + 0x99, 0xf3, 0x9a, 0x73, 0x9a, 0xcb, 0x9b, 0x0e, 0x9b, 0x8b, 0x9b, 0xe2, + 0x9c, 0x3a, 0x9c, 0x8f, 0x9d, 0x1a, 0x9d, 0x26, 0x9d, 0x7e, 0x9d, 0xcc, + 0x9e, 0x1c, 0x9e, 0x61, 0x9e, 0xcf, 0x9f, 0x34, 0x9f, 0x95, 0xa0, 0x10, + 0xa0, 0xb8, 0xa1, 0x4d, 0xa1, 0xea, 0xa2, 0x66, 0xa2, 0xe9, 0xa3, 0x2b, + 0xa3, 0x8f, 0xa3, 0xf1, 0xa4, 0x1e, 0xa4, 0x9d, 0xa5, 0x05, 0xa5, 0x22, + 0xa5, 0x73, 0xa5, 0xba, 0xa6, 0x6c, 0xa6, 0xd6, 0xa7, 0x3a, 0xa7, 0x82, + 0xa7, 0xc9, 0xa8, 0x0e, 0xa8, 0x53, 0xa8, 0x9e, 0xa8, 0xf4, 0xa9, 0x7d, + 0xa9, 0xbd, 0xa9, 0xdd, 0xaa, 0x27, 0xaa, 0x9c, 0xaa, 0xdd, 0xab, 0x24, + 0xab, 0x7a, 0xab, 0xf7, 0xac, 0x25, 0xac, 0x70, 0xac, 0xc8, 0xac, 0xdc, + 0xac, 0xf0, 0xad, 0x02, 0xad, 0x16, 0xad, 0x28, 0xad, 0x3f, 0xad, 0x53, + 0xad, 0xaf, 0xae, 0x18, 0xae, 0x63, 0xae, 0xbe, 0xaf, 0x1e, 0xaf, 0x49, + 0xaf, 0xa1, 0xaf, 0xfa, 0xb0, 0x43, 0xb0, 0xa2, 0xb0, 0xc9, 0xb1, 0x3c, + 0xb1, 0x53, 0xb1, 0xd4, 0xb2, 0x3a, 0xb2, 0x67, 0xb2, 0x78, 0xb2, 0x89, + 0xb2, 0x9c, 0xb2, 0xad, 0xb2, 0xbe, 0xb2, 0xd1, 0xb2, 0xe4, 0xb2, 0xf7, + 0xb3, 0x0d, 0xb3, 0x1e, 0xb3, 0x26, 0xb3, 0x2e, 0xb3, 0x36, 0xb3, 0x41, + 0xb3, 0x49, 0xb3, 0xad, 0xb4, 0x03, 0xb4, 0x31, 0xb4, 0x92, 0xb4, 0xe6, + 0xb5, 0x46, 0xb5, 0xbf, 0xb6, 0x0f, 0xb6, 0x76, 0xb6, 0xd9, 0xb7, 0x44, + 0xb7, 0xbe, 0xb7, 0xc6, 0xb8, 0x46, 0xb8, 0x8e, 0xb8, 0xf9, 0xb9, 0x4c, + 0xb9, 0xc5, 0xba, 0x37, 0xba, 0x8a, 0xba, 0x8a, 0xba, 0x92, 0xba, 0xf1, + 0xbb, 0x52, 0xbb, 0xb5, 0xbb, 0xf9, 0xbc, 0x64, 0xbc, 0x7b, 0xbc, 0x8d, + 0xbc, 0xa4, 0xbc, 0xb6, 0xbc, 0xc2, 0xbc, 0xd5, 0xbc, 0xeb, 0xbc, 0xf7, + 0xbd, 0x0e, 0xbd, 0x25, 0xbd, 0x3c, 0xbd, 0x48, 0xbd, 0x5f, 0xbd, 0x76, + 0xbd, 0x8d, 0xbd, 0x99, 0xbd, 0xab, 0xbd, 0xc2, 0xbd, 0xd9, 0xbd, 0xf0, + 0xbe, 0x07, 0xbe, 0x13, 0xbe, 0x2a, 0xbe, 0x3c, 0xbe, 0x53, 0xbe, 0x5f, + 0xbe, 0x76, 0xbe, 0x88, 0xbe, 0x9a, 0xbe, 0xb0, 0xbe, 0xc1, 0xbe, 0xcc, + 0xbe, 0xdf, 0xbf, 0x0c, 0xbf, 0x18, 0xbf, 0x29, 0xbf, 0x3b, 0xbf, 0x51, + 0xbf, 0x5c, 0xbf, 0x73, 0xbf, 0x89, 0xbf, 0xa0, 0xbf, 0xac, 0xbf, 0xbd, + 0xbf, 0xcf, 0xbf, 0xe1, 0xbf, 0xf7, 0xc0, 0x08, 0xc0, 0x13, 0xc0, 0x2a, + 0xc0, 0x41, 0xc0, 0x57, 0xc0, 0x62, 0xc0, 0x74, 0xc0, 0x7f, 0xc0, 0x96, + 0xc0, 0xa7, 0xc0, 0xbe, 0xc0, 0xd4, 0xc1, 0x3f, 0xc1, 0xe2, 0xc1, 0xf9, + 0xc2, 0x0b, 0xc2, 0x22, 0xc2, 0x38, 0xc2, 0x4f, 0xc2, 0x61, 0xc2, 0x73, + 0xc2, 0x84, 0xc2, 0x96, 0xc2, 0xa6, 0xc2, 0xbd, 0xc2, 0xce, 0xc2, 0xe5, + 0xc2, 0xfb, 0xc3, 0x0d, 0xc3, 0x1f, 0xc3, 0x90, 0xc4, 0x1b, 0xc4, 0x2d, + 0xc4, 0x3e, 0xc4, 0x55, 0xc4, 0x6b, 0xc4, 0x82, 0xc4, 0x98, 0xc4, 0xaa, + 0xc4, 0xbc, 0xc4, 0xc8, 0xc4, 0xda, 0xc4, 0xf1, 0xc5, 0x03, 0xc5, 0x1a, + 0xc5, 0x31, 0xc5, 0x48, 0xc5, 0x5f, 0xc5, 0x76, 0xc5, 0x8d, 0xc5, 0x98, + 0xc5, 0xa3, 0xc5, 0xb5, 0xc5, 0xc1, 0xc5, 0xcd, 0xc5, 0xe4, 0xc5, 0xfb, + 0xc6, 0x07, 0xc6, 0x13, 0xc6, 0x2a, 0xc6, 0x41, 0xc6, 0x4d, 0xc6, 0x59, + 0xc6, 0x6e, 0xc6, 0x7a, 0xc6, 0x86, 0xc6, 0x92, 0xc6, 0xa9, 0xc6, 0xbb, + 0xc6, 0xc7, 0xc6, 0xd3, 0xc6, 0xea, 0xc7, 0x00, 0xc7, 0x12, 0xc7, 0x29, + 0xc7, 0x3a, 0xc7, 0x51, 0xc7, 0x67, 0xc7, 0x7f, 0xc7, 0x92, 0xc7, 0xa9, + 0xc7, 0xc0, 0xc7, 0xcc, 0xc7, 0xd8, 0xc7, 0xef, 0xc8, 0x05, 0xc8, 0x17, + 0xc8, 0x29, 0xc8, 0x40, 0xc8, 0x56, 0xc8, 0x62, 0xc8, 0x6e, 0xc8, 0x7a, + 0xc8, 0x86, 0xc8, 0x9d, 0xc8, 0xb3, 0xc8, 0xc4, 0xc8, 0xd0, 0xc8, 0xdc, + 0xc8, 0xe8, 0xc8, 0xff, 0xc9, 0x0b, 0xc9, 0x1d, 0xc9, 0x33, 0xc9, 0x45, + 0xc9, 0x5b, 0xc9, 0x72, 0xc9, 0x88, 0xc9, 0x9b, 0xc9, 0xae, 0xc9, 0xc1, + 0xc9, 0xd9, 0xca, 0x38, 0xca, 0xa4, 0xca, 0xbb, 0xca, 0xd2, 0xca, 0xe9, + 0xca, 0xff, 0xcb, 0x0b, 0xcb, 0x22, 0xcb, 0x39, 0xcb, 0x50, 0xcb, 0x67, + 0xcb, 0x7e, 0xcb, 0x94, 0xcb, 0xab, 0xcb, 0xbd, 0xcb, 0xd4, 0xcb, 0xeb, + 0xcc, 0x0e, 0xcc, 0x31, 0xcc, 0x41, 0xcc, 0x58, 0xcc, 0x6f, 0xcc, 0x85, + 0xcc, 0x9b, 0xcc, 0xa6, 0xcc, 0xb9, 0xcc, 0xc5, 0xcc, 0xd1, 0xcc, 0xe8, + 0xcc, 0xff, 0xcd, 0x10, 0xcd, 0x1b, 0xcd, 0x32, 0xcd, 0x48, 0xcd, 0x5f, + 0xcd, 0x6b, 0xcd, 0x82, 0xcd, 0x99, 0xcd, 0xab, 0xcd, 0xc1, 0xcd, 0xd2, + 0xcd, 0xde, 0xcd, 0xf5, 0xce, 0x0c, 0xce, 0x22, 0xce, 0x2d, 0xce, 0x44, + 0xce, 0x5a, 0xce, 0x71, 0xce, 0xdb, 0xce, 0xed, 0xcf, 0x03, 0xcf, 0x15, + 0xcf, 0x26, 0xcf, 0x37, 0xcf, 0x4d, 0xcf, 0x63, 0xcf, 0x75, 0xcf, 0xe2, + 0xcf, 0xf3, 0xd0, 0x09, 0xd0, 0x20, 0xd0, 0x32, 0xd0, 0x43, 0xd0, 0x59, + 0xd0, 0x70, 0xd0, 0x87, 0xd0, 0x9e, 0xd0, 0xa9, 0xd0, 0xba, 0xd0, 0xd1, + 0xd0, 0xe2, 0xd0, 0xf8, 0xd1, 0x09, 0xd1, 0x1e, 0xd1, 0x2f, 0xd1, 0x46, + 0xd1, 0x52, 0xd1, 0x64, 0xd1, 0x75, 0xd1, 0x8c, 0xd1, 0x9f, 0xd1, 0xb1, + 0xd1, 0xc2, 0xd1, 0xd3, 0xd1, 0xe5, 0xd1, 0xfb, 0xd2, 0x07, 0xd2, 0x18, + 0xd2, 0x29, 0xd2, 0x3a, 0xd2, 0x46, 0xd2, 0x57, 0xd2, 0x68, 0xd2, 0x7e, + 0xd2, 0x91, 0xd2, 0xa4, 0xd3, 0x00, 0xd3, 0x17, 0xd3, 0x2d, 0xd3, 0x38, + 0xd3, 0x4f, 0xd3, 0x61, 0xd3, 0x72, 0xd3, 0x7e, 0xd3, 0x8a, 0xd3, 0x96, + 0xd3, 0xa2, 0xd3, 0xae, 0xd3, 0xba, 0xd3, 0xc6, 0xd3, 0xdc, 0xd3, 0xe4, + 0xd3, 0xec, 0xd3, 0xf4, 0xd3, 0xfc, 0xd4, 0x04, 0xd4, 0x0c, 0xd4, 0x14, + 0xd4, 0x1c, 0xd4, 0x24, 0xd4, 0x2c, 0xd4, 0x34, 0xd4, 0x3c, 0xd4, 0x44, + 0xd4, 0x4c, 0xd4, 0x58, 0xd4, 0x64, 0xd4, 0x76, 0xd4, 0x88, 0xd4, 0x9a, + 0xd4, 0xb0, 0xd4, 0xc5, 0xd4, 0xcd, 0xd4, 0xd5, 0xd4, 0xdd, 0xd4, 0xe5, + 0xd5, 0x52, 0xd5, 0x5e, 0xd5, 0x69, 0xd5, 0x7b, 0xd5, 0x92, 0xd5, 0xa4, + 0xd5, 0xb0, 0xd5, 0xc7, 0xd6, 0x37, 0xd6, 0x3f, 0xd6, 0x4b, 0xd6, 0x53, + 0xd6, 0x5b, 0xd6, 0x6d, 0xd6, 0x84, 0xd6, 0x8c, 0xd6, 0x94, 0xd6, 0x9c, + 0xd6, 0xa4, 0xd6, 0xbb, 0xd6, 0xc3, 0xd6, 0xcb, 0xd6, 0xd3, 0xd6, 0xdb, + 0xd6, 0xe3, 0xd6, 0xeb, 0xd6, 0xf3, 0xd6, 0xfb, 0xd7, 0x03, 0xd7, 0x0b, + 0xd7, 0x22, 0xd7, 0x2a, 0xd7, 0x32, 0xd7, 0x80, 0xd7, 0x88, 0xd7, 0x90, + 0xd7, 0x9b, 0xd7, 0xb2, 0xd7, 0xba, 0xd7, 0xc2, 0xd7, 0xce, 0xd7, 0xd6, + 0xd7, 0xed, 0xd8, 0x03, 0xd8, 0x1a, 0xd8, 0x31, 0xd8, 0x43, 0xd8, 0x5a, + 0xd8, 0x66, 0xd8, 0x72, 0xd8, 0x89, 0xd8, 0x9f, 0xd8, 0xa7, 0xd8, 0xaf, + 0xd8, 0xbb, 0xd8, 0xd2, 0xd8, 0xda, 0xd8, 0xf1, 0xd9, 0x03, 0xd9, 0x0f, + 0xd9, 0x1b, 0xd9, 0x32, 0xd9, 0x49, 0xd9, 0x5f, 0xd9, 0x76, 0xd9, 0x7e, + 0xd9, 0x86, 0xd9, 0x9e, 0xd9, 0xb6, 0xd9, 0xc2, 0xd9, 0xce, 0xd9, 0xda, + 0xd9, 0xe6, 0xd9, 0xf2, 0xd9, 0xfe, 0xda, 0x06, 0xda, 0x0e, 0xda, 0x16, + 0xda, 0x2d, 0xda, 0x44, 0xda, 0x4c, 0xda, 0x63, 0xda, 0x79, 0xda, 0x85, + 0xda, 0x90, 0xda, 0x98, 0xda, 0xa0, 0xda, 0xb7, 0xda, 0xcd, 0xda, 0xd9, + 0xda, 0xe1, 0xda, 0xec, 0xda, 0xf8, 0xdb, 0x04, 0xdb, 0x10, 0xdb, 0x1b, + 0xdb, 0x32, 0xdb, 0x48, 0xdb, 0x54, 0xdb, 0x5f, 0xdb, 0x6b, 0xdb, 0x76, + 0xdb, 0x7e, 0xdb, 0x86, 0xdb, 0x92, 0xdb, 0x9d, 0xdb, 0xa9, 0xdb, 0xb4, + 0xdb, 0xc6, 0xdb, 0xd7, 0xdb, 0xe3, 0xdb, 0xee, 0xdc, 0x06, 0xdc, 0x1e, + 0xdc, 0x2a, 0xdc, 0x35, 0xdc, 0x45, 0xdc, 0x55, 0xdc, 0x5d, 0xdc, 0x69, + 0xdc, 0x75, 0xdc, 0x87, 0xdc, 0x99, 0xdc, 0xb1, 0xdc, 0xc8, 0xdc, 0xe0, + 0xdc, 0xf7, 0xdd, 0x0f, 0xdd, 0x26, 0xdd, 0x3e, 0xdd, 0x55, 0xdd, 0x70, + 0xdd, 0x8a, 0xdd, 0xa2, 0xdd, 0xb9, 0xdd, 0xd1, 0xdd, 0xe8, 0xde, 0x00, + 0xde, 0x12, 0xde, 0x2a, 0xde, 0x41, 0xde, 0x5c, 0xde, 0x76, 0xde, 0x82, + 0xde, 0x8e, 0xde, 0xa0, 0xde, 0xb2, 0xde, 0xc9, 0xde, 0xda, 0xde, 0xf2, + 0xdf, 0x09, 0xdf, 0x21, 0xdf, 0x38, 0xdf, 0x50, 0xdf, 0x67, 0xdf, 0x7f, + 0xdf, 0x96, 0xdf, 0xb1, 0xdf, 0xcb, 0xdf, 0xdd, 0xdf, 0xef, 0xdf, 0xfb, + 0xe0, 0x07, 0xe0, 0x13, 0xe0, 0x1f, 0xe0, 0x36, 0xe0, 0x48, 0xe0, 0x60, + 0xe0, 0x77, 0xe0, 0x8f, 0xe0, 0xa6, 0xe0, 0xbe, 0xe0, 0xd5, 0xe0, 0xed, + 0xe1, 0x04, 0xe1, 0x1f, 0xe1, 0x39, 0xe1, 0x50, 0xe1, 0x67, 0xe1, 0x7e, + 0xe1, 0x95, 0xe1, 0xac, 0xe1, 0xc3, 0xe1, 0xda, 0xe1, 0xf0, 0xe1, 0xfc, + 0xe2, 0x08, 0xe2, 0x14, 0xe2, 0x20, 0xe2, 0x32, 0xe2, 0x44, 0xe2, 0x5b, + 0xe2, 0x72, 0xe2, 0x89, 0xe2, 0xa0, 0xe2, 0xb7, 0xe2, 0xce, 0xe2, 0xe5, + 0xe2, 0xfb, 0xe3, 0x07, 0xe3, 0x13, 0xe3, 0x1f, 0xe3, 0x2b, 0xe3, 0x3d, + 0xe3, 0x4f, 0xe3, 0x66, 0xe3, 0x77, 0xe3, 0x99, 0xe3, 0xa5, 0xe3, 0xb1, + 0xe3, 0xbd, 0xe3, 0xc9, 0xe3, 0xd5, 0xe3, 0xe1, 0xe3, 0xed, 0xe3, 0xf9, + 0xe4, 0x01, 0xe4, 0x61, 0xe4, 0xc1, 0xe5, 0x01, 0xe5, 0x40, 0xe5, 0xa0, + 0xe6, 0x02, 0xe6, 0x4e, 0xe6, 0x9f, 0xe6, 0xfa, 0xe7, 0x52, 0xe7, 0x5a, + 0xe7, 0x6e, 0xe7, 0x78, 0xe7, 0x80, 0xe7, 0x88, 0xe7, 0x90, 0xe7, 0x98, + 0xe7, 0xa0, 0xe7, 0xa8, 0xe7, 0xb0, 0xe7, 0xb8, 0xe7, 0xca, 0xe7, 0xdc, + 0xe7, 0xf3, 0xe8, 0x0a, 0xe8, 0x22, 0xe8, 0x3a, 0xe8, 0x52, 0xe8, 0x6a, + 0xe8, 0x82, 0xe8, 0x9a, 0xe8, 0xb2, 0xe8, 0xca, 0xe8, 0xe2, 0xe8, 0xfa, + 0xe9, 0x12, 0xe9, 0x2a, 0xe9, 0x36, 0xe9, 0x42, 0xe9, 0x4e, 0xe9, 0x5a, + 0xe9, 0x66, 0xe9, 0x7a, 0xe9, 0x86, 0xe9, 0x92, 0xe9, 0x9e, 0xe9, 0xb0, + 0xe9, 0xc2, 0xe9, 0xce, 0xe9, 0xda, 0xe9, 0xe6, 0xe9, 0xf2, 0xe9, 0xfe, + 0xea, 0x0a, 0xea, 0x16, 0xea, 0x22, 0xea, 0x3a, 0xea, 0x4c, 0xea, 0x5e, + 0xea, 0x6a, 0xea, 0x76, 0xea, 0x82, 0xea, 0x8e, 0xea, 0x9a, 0xea, 0xa6, + 0xea, 0xbe, 0xea, 0xd5, 0xea, 0xeb, 0xea, 0xf7, 0xeb, 0x03, 0xeb, 0x0f, + 0xeb, 0x1b, 0xeb, 0x27, 0xeb, 0x33, 0xeb, 0x3f, 0xeb, 0x4b, 0xeb, 0x57, + 0xeb, 0x63, 0xeb, 0x6f, 0xeb, 0x7b, 0xeb, 0x87, 0xeb, 0x93, 0xeb, 0x9b, + 0xeb, 0xa3, 0xeb, 0xab, 0xeb, 0xb3, 0xeb, 0xbb, 0xeb, 0xc3, 0xeb, 0xcb, + 0xeb, 0xd3, 0xeb, 0xdb, 0xeb, 0xe3, 0xeb, 0xeb, 0xeb, 0xf3, 0xeb, 0xfb, + 0xec, 0x03, 0xec, 0x0f, 0xec, 0x1a, 0xec, 0x25, 0xec, 0x3c, 0xec, 0x44, + 0xec, 0x4c, 0xec, 0x58, 0xec, 0x60, 0xec, 0x77, 0xec, 0x8e, 0xec, 0x96, + 0xec, 0x9e, 0xec, 0xa6, 0xec, 0xae, 0xec, 0xc5, 0xec, 0xcd, 0xec, 0xd5, + 0xec, 0xdd, 0xec, 0xe5, 0xec, 0xed, 0xec, 0xf5, 0xec, 0xfd, 0xed, 0x05, + 0xed, 0x9a, 0xed, 0xf0, 0xee, 0x52, 0xee, 0x5a, 0xee, 0x66, 0xee, 0x7c, + 0xee, 0x8d, 0xee, 0x95, 0xee, 0xa1, 0xee, 0xad, 0xee, 0xb9, 0xee, 0xc5, + 0xee, 0xd1, 0xee, 0xdd, 0xee, 0xe9, 0xee, 0xf4, 0xef, 0x00, 0xef, 0x0c, + 0xef, 0x18, 0xef, 0x24, 0xef, 0x30, 0xef, 0x3c, 0xef, 0x48, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x23, 0x12, 0x5f, 0x6a, 0xcf, 0x44, + 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x19, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc4, 0xf0, 0x11, 0x2e, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x01, 0x52, 0xd6, + 0xfa, 0x30, 0xfd, 0xd5, 0x09, 0x87, 0x08, 0x73, 0x00, 0x01, 0x00, 0x09, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8c, 0x00, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, + 0x01, 0xfe, 0x00, 0x00, 0x02, 0x2d, 0x00, 0x7c, 0x02, 0x91, 0x00, 0x40, + 0x04, 0xc4, 0x00, 0x40, 0x04, 0x97, 0x00, 0x5c, 0x05, 0xe8, 0x00, 0x5f, + 0x05, 0x40, 0x00, 0x47, 0x01, 0x4b, 0x00, 0x3f, 0x02, 0xcf, 0x00, 0x7c, + 0x02, 0xd2, 0x00, 0x28, 0x03, 0xa0, 0x00, 0x1b, 0x04, 0x5e, 0x00, 0x39, + 0x01, 0xf4, 0x00, 0x23, 0x03, 0x1a, 0x00, 0x6e, 0x02, 0x53, 0x00, 0x7e, + 0x02, 0xfd, 0xff, 0xf3, 0x04, 0x97, 0x00, 0x5f, 0x04, 0x97, 0x00, 0xa7, + 0x04, 0x97, 0x00, 0x46, 0x04, 0x97, 0x00, 0x40, 0x04, 0x97, 0x00, 0x37, + 0x04, 0x97, 0x00, 0x69, 0x04, 0x97, 0x00, 0x64, 0x04, 0x97, 0x00, 0x3d, + 0x04, 0x97, 0x00, 0x5f, 0x04, 0x97, 0x00, 0x56, 0x02, 0x42, 0x00, 0x7d, + 0x02, 0x19, 0x00, 0x39, 0x04, 0x12, 0x00, 0x36, 0x04, 0x94, 0x00, 0x88, + 0x04, 0x22, 0x00, 0x78, 0x03, 0xfb, 0x00, 0x2d, 0x07, 0x29, 0x00, 0x4b, + 0x05, 0x62, 0x00, 0x07, 0x05, 0x1b, 0x00, 0x82, 0x05, 0x3c, 0x00, 0x56, + 0x05, 0x33, 0x00, 0x82, 0x04, 0x80, 0x00, 0x82, 0x04, 0x62, 0x00, 0x82, + 0x05, 0x73, 0x00, 0x5e, 0x05, 0xa7, 0x00, 0x82, 0x02, 0x55, 0x00, 0x95, + 0x04, 0x78, 0x00, 0x28, 0x05, 0x14, 0x00, 0x82, 0x04, 0x55, 0x00, 0x82, + 0x07, 0x02, 0x00, 0x82, 0x05, 0xa6, 0x00, 0x82, 0x05, 0x86, 0x00, 0x56, + 0x05, 0x29, 0x00, 0x82, 0x05, 0x86, 0x00, 0x54, 0x05, 0x1b, 0x00, 0x82, + 0x04, 0xeb, 0x00, 0x45, 0x04, 0xf3, 0x00, 0x28, 0x05, 0x44, 0x00, 0x74, + 0x05, 0x3b, 0x00, 0x07, 0x06, 0xff, 0x00, 0x23, 0x05, 0x15, 0x00, 0x16, + 0x04, 0xf2, 0x00, 0x02, 0x04, 0xd9, 0x00, 0x49, 0x02, 0x39, 0x00, 0x78, + 0x03, 0x60, 0x00, 0x00, 0x02, 0x39, 0x00, 0x0d, 0x03, 0x7f, 0x00, 0x2c, + 0x03, 0x92, 0x00, 0x01, 0x02, 0xa5, 0x00, 0x34, 0x04, 0x4a, 0x00, 0x44, + 0x04, 0x81, 0x00, 0x6f, 0x04, 0x2c, 0x00, 0x42, 0x04, 0x82, 0x00, 0x42, + 0x04, 0x53, 0x00, 0x48, 0x02, 0xde, 0x00, 0x1d, 0x04, 0x91, 0x00, 0x45, + 0x04, 0x7a, 0x00, 0x68, 0x02, 0x1f, 0x00, 0x6d, 0x02, 0x14, 0xff, 0xa1, + 0x04, 0x46, 0x00, 0x6f, 0x02, 0x1f, 0x00, 0x7e, 0x06, 0xed, 0x00, 0x6f, + 0x04, 0x7b, 0x00, 0x69, 0x04, 0x86, 0x00, 0x42, 0x04, 0x81, 0x00, 0x6f, + 0x04, 0x85, 0x00, 0x42, 0x02, 0xeb, 0x00, 0x6f, 0x04, 0x1d, 0x00, 0x38, + 0x02, 0xb4, 0x00, 0x0a, 0x04, 0x7a, 0x00, 0x68, 0x04, 0x0b, 0x00, 0x0d, + 0x05, 0xe1, 0x00, 0x1c, 0x04, 0x12, 0x00, 0x15, 0x04, 0x04, 0x00, 0x03, + 0x04, 0x12, 0x00, 0x4a, 0x02, 0xa4, 0x00, 0x30, 0x02, 0x06, 0x00, 0xad, + 0x02, 0xa4, 0x00, 0x22, 0x05, 0x30, 0x00, 0x6a, 0x02, 0x42, 0x00, 0x80, + 0x04, 0x9a, 0x00, 0x63, 0x04, 0xc1, 0x00, 0x63, 0x05, 0x8a, 0x00, 0x51, + 0x04, 0x4a, 0x00, 0x0a, 0x02, 0x04, 0x00, 0x80, 0x05, 0x07, 0x00, 0x5c, + 0x03, 0xbc, 0x00, 0x5e, 0x06, 0x46, 0x00, 0x56, 0x03, 0x8d, 0x00, 0x89, + 0x03, 0xff, 0x00, 0x4d, 0x04, 0x69, 0x00, 0x7e, 0x06, 0x46, 0x00, 0x56, + 0x04, 0x02, 0x00, 0xa8, 0x03, 0x1b, 0x00, 0x7e, 0x04, 0x4c, 0x00, 0x59, + 0x02, 0xfb, 0x00, 0x37, 0x02, 0xfb, 0x00, 0x30, 0x02, 0xa7, 0x00, 0x65, + 0x04, 0xed, 0x00, 0x8b, 0x03, 0xeb, 0x00, 0x4b, 0x02, 0x69, 0x00, 0x8c, + 0x02, 0x24, 0x00, 0x62, 0x02, 0xfb, 0x00, 0x87, 0x03, 0xa8, 0x00, 0x76, + 0x03, 0xff, 0x00, 0x55, 0x05, 0xbe, 0x00, 0x65, 0x06, 0x17, 0x00, 0x54, + 0x06, 0x77, 0x00, 0x5e, 0x03, 0xfb, 0x00, 0x45, 0x07, 0x85, 0x00, 0x02, + 0x04, 0x40, 0x00, 0x41, 0x05, 0x83, 0x00, 0x5d, 0x04, 0xde, 0x00, 0x85, + 0x05, 0x0c, 0x00, 0x87, 0x06, 0xc1, 0x00, 0x42, 0x04, 0x9a, 0x00, 0x54, + 0x04, 0x90, 0x00, 0x3f, 0x04, 0x84, 0x00, 0x42, 0x04, 0x8a, 0x00, 0x71, + 0x05, 0x0b, 0x00, 0x42, 0x05, 0xc2, 0x00, 0x20, 0x02, 0x31, 0x00, 0x86, + 0x04, 0xb8, 0x00, 0x82, 0x04, 0x76, 0x00, 0x1d, 0x02, 0x72, 0x00, 0x1e, + 0x05, 0xa0, 0x00, 0x80, 0x04, 0x84, 0x00, 0x6c, 0x07, 0xbf, 0x00, 0x60, + 0x07, 0x37, 0x00, 0x53, 0x02, 0x13, 0x00, 0x75, 0x05, 0x8f, 0x00, 0x4b, + 0x02, 0xe3, 0xff, 0xdd, 0x05, 0x9c, 0x00, 0x50, 0x04, 0xa6, 0x00, 0x40, + 0x05, 0xb3, 0x00, 0x74, 0x04, 0xe1, 0x00, 0x68, 0x02, 0x41, 0xff, 0xad, + 0x04, 0x3c, 0x00, 0x4e, 0x03, 0xf7, 0x00, 0x7b, 0x03, 0xc4, 0x00, 0x55, + 0x04, 0x02, 0x00, 0xa8, 0x03, 0x8d, 0x00, 0x6a, 0x02, 0x1f, 0x00, 0x76, + 0x02, 0xaa, 0x00, 0x77, 0x02, 0x68, 0x00, 0x21, 0x03, 0xd9, 0x00, 0x75, + 0x03, 0x48, 0x00, 0x39, 0x02, 0x83, 0x00, 0x8e, 0x00, 0x00, 0xfc, 0x80, + 0x00, 0x00, 0xfd, 0x56, 0x00, 0x00, 0xfc, 0x61, 0x00, 0x00, 0xfd, 0x1f, + 0x00, 0x00, 0xfb, 0xf0, 0x00, 0x00, 0xfd, 0x07, 0x02, 0xb2, 0x00, 0xda, + 0x04, 0x63, 0x00, 0x66, 0x02, 0x69, 0x00, 0x8c, 0x04, 0x75, 0x00, 0x84, + 0x05, 0xd9, 0x00, 0x14, 0x05, 0x81, 0x00, 0x52, 0x05, 0x2e, 0x00, 0x10, + 0x04, 0x89, 0x00, 0x5f, 0x05, 0xa9, 0x00, 0x84, 0x04, 0x89, 0x00, 0x48, + 0x06, 0x28, 0x00, 0x49, 0x05, 0xd0, 0x00, 0x34, 0x05, 0x60, 0x00, 0x66, + 0x04, 0x82, 0x00, 0x49, 0x04, 0xd0, 0x00, 0x8e, 0x04, 0x15, 0x00, 0x11, + 0x04, 0x84, 0x00, 0x44, 0x04, 0x73, 0x00, 0x5f, 0x04, 0x02, 0x00, 0x4c, + 0x04, 0x84, 0x00, 0x6c, 0x04, 0xb8, 0x00, 0x70, 0x02, 0xb2, 0x00, 0x8a, + 0x04, 0x63, 0x00, 0x07, 0x04, 0x3d, 0x00, 0x67, 0x05, 0x26, 0x00, 0x34, + 0x04, 0x84, 0x00, 0x71, 0x04, 0x1e, 0x00, 0x3f, 0x04, 0x94, 0x00, 0x42, + 0x04, 0x2a, 0x00, 0x2c, 0x04, 0x5e, 0x00, 0x71, 0x05, 0xf7, 0x00, 0x36, + 0x05, 0xf4, 0x00, 0x44, 0x06, 0x91, 0x00, 0x53, 0x04, 0xc3, 0x00, 0x75, + 0x04, 0xba, 0xff, 0xe7, 0x06, 0x9e, 0x00, 0x14, 0x05, 0xfb, 0x00, 0x1d, + 0x05, 0x47, 0x00, 0x57, 0x08, 0x76, 0x00, 0x28, 0x08, 0x78, 0x00, 0x84, + 0x06, 0x2c, 0x00, 0x21, 0x05, 0x9a, 0x00, 0x75, 0x05, 0x03, 0x00, 0x7f, + 0x05, 0xfb, 0x00, 0x19, 0x07, 0xfb, 0x00, 0x11, 0x04, 0xef, 0x00, 0x43, + 0x05, 0x9a, 0x00, 0x78, 0x05, 0xa6, 0x00, 0x28, 0x05, 0x0d, 0x00, 0x1f, + 0x06, 0x88, 0x00, 0x49, 0x06, 0x12, 0x00, 0x75, 0x05, 0x90, 0x00, 0x89, + 0x07, 0xab, 0x00, 0x80, 0x08, 0x2b, 0x00, 0x80, 0x06, 0x2a, 0x00, 0x19, + 0x06, 0xf9, 0x00, 0x85, 0x05, 0x01, 0x00, 0x80, 0x05, 0x34, 0x00, 0x3e, + 0x07, 0x8c, 0x00, 0x8e, 0x04, 0xc6, 0xff, 0xe4, 0x04, 0x8e, 0x00, 0x54, + 0x04, 0x87, 0x00, 0x82, 0x03, 0x5a, 0x00, 0x6f, 0x05, 0x0d, 0x00, 0x21, + 0x06, 0xd5, 0x00, 0x27, 0x04, 0x1c, 0x00, 0x45, 0x04, 0x8a, 0x00, 0x6f, + 0x04, 0x82, 0x00, 0x82, 0x04, 0x8c, 0x00, 0x16, 0x06, 0x13, 0x00, 0x82, + 0x04, 0x8a, 0x00, 0x6f, 0x04, 0x8a, 0x00, 0x6f, 0x04, 0x13, 0x00, 0x1f, + 0x05, 0xd8, 0x00, 0x44, 0x04, 0xe0, 0x00, 0x6f, 0x04, 0x6e, 0x00, 0x58, + 0x06, 0x9e, 0x00, 0x6f, 0x07, 0x33, 0x00, 0x6c, 0x05, 0x3f, 0x00, 0x21, + 0x06, 0x9f, 0x00, 0x82, 0x04, 0x77, 0x00, 0x82, 0x04, 0x29, 0x00, 0x3f, + 0x06, 0x7e, 0x00, 0x86, 0x04, 0x79, 0x00, 0x29, 0x04, 0x7a, 0xff, 0xcc, + 0x04, 0x29, 0x00, 0x40, 0x06, 0xde, 0x00, 0x15, 0x06, 0xe4, 0x00, 0x6f, + 0x04, 0x84, 0xff, 0xda, 0x04, 0x8a, 0x00, 0x6f, 0x07, 0x93, 0x00, 0x77, + 0x06, 0x90, 0x00, 0x64, 0x04, 0x76, 0xff, 0xe5, 0x07, 0x24, 0x00, 0x7d, + 0x06, 0x09, 0x00, 0x75, 0x05, 0x49, 0x00, 0x0f, 0x04, 0x79, 0x00, 0x07, + 0x07, 0x7b, 0x00, 0x93, 0x06, 0x63, 0x00, 0x7e, 0x06, 0xf9, 0x00, 0x6d, + 0x05, 0xde, 0x00, 0x6f, 0x09, 0x4d, 0x00, 0x95, 0x08, 0x0c, 0x00, 0x86, + 0x04, 0x1c, 0x00, 0x07, 0x04, 0x07, 0x00, 0x1c, 0x05, 0x81, 0x00, 0x5a, + 0x04, 0x84, 0x00, 0x40, 0x05, 0x24, 0x00, 0x0b, 0x04, 0x15, 0x00, 0x11, + 0x05, 0x81, 0x00, 0x5a, 0x04, 0x84, 0x00, 0x42, 0x07, 0x92, 0x00, 0x77, + 0x06, 0x77, 0x00, 0x6c, 0x07, 0x93, 0x00, 0x77, 0x06, 0x90, 0x00, 0x64, + 0x04, 0xf8, 0x00, 0x59, 0x04, 0x47, 0x00, 0x56, 0x04, 0xfb, 0x00, 0x6b, + 0x00, 0x00, 0xfc, 0x73, 0x00, 0x00, 0xfc, 0x78, 0x00, 0x00, 0xfd, 0x96, + 0x00, 0x00, 0xfd, 0xa7, 0x00, 0x00, 0xfa, 0x30, 0x00, 0x00, 0xfa, 0x70, + 0x06, 0x38, 0x00, 0x78, 0x05, 0x38, 0x00, 0x6f, 0x04, 0x76, 0xff, 0xe5, + 0x05, 0x08, 0x00, 0x82, 0x04, 0x82, 0x00, 0x6f, 0x04, 0x71, 0x00, 0x7f, + 0x03, 0xb1, 0x00, 0x6c, 0x04, 0xfb, 0x00, 0x84, 0x04, 0x3b, 0x00, 0x6c, + 0x08, 0x8d, 0x00, 0x11, 0x07, 0x45, 0x00, 0x27, 0x05, 0xf2, 0x00, 0x84, + 0x05, 0x33, 0x00, 0x82, 0x05, 0x4b, 0x00, 0x80, 0x04, 0xd1, 0x00, 0x82, + 0x06, 0x9b, 0x00, 0x25, 0x05, 0xb9, 0x00, 0x3a, 0x06, 0x40, 0x00, 0x82, + 0x05, 0x31, 0x00, 0x6f, 0x07, 0xe1, 0x00, 0x82, 0x05, 0xa6, 0x00, 0x6c, + 0x08, 0x5c, 0x00, 0x84, 0x06, 0xed, 0x00, 0x6c, 0x06, 0x6d, 0x00, 0x5e, + 0x05, 0x2a, 0x00, 0x55, 0x05, 0x55, 0x00, 0x16, 0x04, 0x57, 0x00, 0x15, + 0x07, 0x29, 0x00, 0x22, 0x05, 0x7f, 0x00, 0x2d, 0x06, 0x24, 0x00, 0x89, + 0x05, 0x17, 0x00, 0x58, 0x05, 0x71, 0x00, 0x6e, 0x04, 0x7b, 0x00, 0x68, + 0x05, 0x97, 0x00, 0x86, 0x06, 0x0e, 0xff, 0xe5, 0x04, 0xc8, 0xff, 0xbc, + 0x05, 0x32, 0x00, 0x80, 0x04, 0x91, 0x00, 0x82, 0x06, 0x40, 0x00, 0x28, + 0x05, 0x38, 0x00, 0x16, 0x05, 0xa8, 0x00, 0x84, 0x04, 0x84, 0x00, 0x6c, + 0x06, 0x44, 0x00, 0x82, 0x05, 0x35, 0x00, 0x6f, 0x07, 0x9a, 0x00, 0x82, + 0x06, 0xa3, 0x00, 0x82, 0x05, 0x8f, 0x00, 0x4b, 0x04, 0xa0, 0x00, 0x50, + 0x04, 0xa2, 0x00, 0x52, 0x04, 0xce, 0x00, 0x25, 0x03, 0xab, 0x00, 0x16, + 0x05, 0x9a, 0x00, 0x16, 0x04, 0x9c, 0x00, 0x15, 0x05, 0x01, 0x00, 0x49, + 0x07, 0x42, 0x00, 0x74, 0x06, 0xd4, 0x00, 0x5a, 0x06, 0x4d, 0x00, 0x41, + 0x05, 0x24, 0x00, 0x2d, 0x04, 0xaf, 0x00, 0x41, 0x04, 0x79, 0x00, 0x6d, + 0x07, 0xb8, 0x00, 0x40, 0x06, 0xc7, 0x00, 0x3f, 0x07, 0xf4, 0x00, 0x81, + 0x06, 0x9a, 0x00, 0x5d, 0x05, 0x11, 0x00, 0x46, 0x04, 0x3c, 0x00, 0x46, + 0x05, 0xa4, 0x00, 0x1f, 0x05, 0x19, 0x00, 0x42, 0x05, 0x3e, 0x00, 0x6a, + 0x06, 0x81, 0x00, 0x28, 0x05, 0x79, 0x00, 0x16, 0x03, 0x1f, 0x00, 0x5b, + 0x04, 0x14, 0x00, 0x00, 0x08, 0x29, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, + 0x08, 0x29, 0x00, 0x00, 0x02, 0xb9, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, + 0x01, 0x5c, 0x00, 0x00, 0x04, 0x7f, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, + 0x01, 0xa2, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x1b, 0x00, 0x6e, 0x03, 0x1b, 0x00, 0x6e, + 0x05, 0x0e, 0x00, 0x98, 0x06, 0x1b, 0x00, 0x6d, 0x03, 0x91, 0x00, 0x01, + 0x01, 0xdf, 0x00, 0x68, 0x01, 0xd6, 0x00, 0x3a, 0x01, 0xfc, 0x00, 0x42, + 0x01, 0xac, 0x00, 0x47, 0x03, 0x3f, 0x00, 0x70, 0x03, 0x45, 0x00, 0x48, + 0x03, 0x39, 0x00, 0x42, 0x04, 0x4e, 0x00, 0x39, 0x04, 0xa1, 0x00, 0x62, + 0x02, 0xe0, 0x00, 0x87, 0x04, 0x2c, 0x00, 0x85, 0x05, 0xeb, 0x00, 0x85, + 0x02, 0x0f, 0x00, 0x65, 0x07, 0xad, 0x00, 0x57, 0x02, 0x7e, 0x00, 0x6c, + 0x02, 0x6a, 0x00, 0x50, 0x03, 0x91, 0x00, 0x1e, 0x02, 0xfb, 0x00, 0x35, + 0x03, 0x58, 0x00, 0x57, 0x04, 0xc1, 0x00, 0x66, 0x06, 0x83, 0x00, 0x25, + 0x06, 0xe1, 0x00, 0x8d, 0x08, 0xae, 0x00, 0x82, 0x06, 0x75, 0x00, 0x25, + 0x06, 0xf2, 0x00, 0x6f, 0x04, 0x97, 0x00, 0x59, 0x05, 0xfd, 0x00, 0x25, + 0x04, 0x38, 0x00, 0x28, 0x04, 0xc0, 0x00, 0x25, 0x05, 0x75, 0x00, 0x44, + 0x05, 0xa4, 0x00, 0x33, 0x05, 0xe0, 0x00, 0x64, 0x03, 0xf3, 0x00, 0x2a, + 0x08, 0x1d, 0x00, 0x80, 0x05, 0x0d, 0x00, 0x74, 0x05, 0x10, 0x00, 0x94, + 0x06, 0x44, 0x00, 0x61, 0x06, 0xe4, 0x00, 0x48, 0x06, 0xd1, 0x00, 0x57, + 0x06, 0xe0, 0x00, 0x5b, 0x04, 0x94, 0x00, 0x59, 0x05, 0x8b, 0x00, 0xa4, + 0x05, 0x04, 0x00, 0x39, 0x04, 0x72, 0x00, 0x93, 0x04, 0x85, 0x00, 0x37, + 0x08, 0x5f, 0x00, 0x5e, 0x02, 0x4f, 0xff, 0xa5, 0x04, 0x9d, 0x00, 0x65, + 0x04, 0x94, 0x00, 0x88, 0x04, 0x13, 0x00, 0x36, 0x04, 0x22, 0x00, 0x78, + 0x04, 0x12, 0x00, 0x1f, 0x02, 0x5a, 0x00, 0x8a, 0x02, 0x91, 0x00, 0x5a, + 0x01, 0xd6, 0x00, 0x34, 0x05, 0x3a, 0x00, 0x1d, 0x04, 0xde, 0x00, 0x14, + 0x04, 0xe7, 0x00, 0x1d, 0x07, 0x6d, 0x00, 0x1d, 0x07, 0x6d, 0x00, 0x1d, + 0x05, 0x2c, 0x00, 0x1d, 0x06, 0xce, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x2c, 0x00, 0x57, 0x08, 0x35, 0x00, 0x5c, 0x02, 0xfa, 0x00, 0x37, + 0x02, 0xfa, 0x00, 0x87, 0x02, 0xfa, 0x00, 0x47, 0x04, 0x28, 0x00, 0x48, + 0x04, 0x28, 0x00, 0x4f, 0x04, 0x28, 0x00, 0x31, 0x04, 0x27, 0x00, 0x4f, + 0x04, 0x28, 0x00, 0x4f, 0x04, 0x28, 0x00, 0x33, 0x04, 0x28, 0x00, 0x2f, + 0x04, 0x28, 0x00, 0x38, 0x04, 0x28, 0x00, 0x95, 0x04, 0x28, 0x00, 0x4f, + 0x04, 0x31, 0x00, 0x37, 0x04, 0x4d, 0xff, 0xff, 0x04, 0x64, 0x00, 0x03, + 0x05, 0xfd, 0x00, 0x1f, 0x04, 0x88, 0xff, 0xff, 0x04, 0x8f, 0x00, 0x5d, + 0x04, 0x51, 0x00, 0x20, 0x04, 0x49, 0x00, 0x3a, 0x04, 0x76, 0x00, 0x63, + 0x04, 0xc0, 0x00, 0x41, 0x04, 0x78, 0x00, 0x63, 0x04, 0xc0, 0x00, 0x40, + 0x04, 0xd6, 0x00, 0x63, 0x06, 0x07, 0x00, 0x63, 0x03, 0xba, 0x00, 0x63, + 0x04, 0x64, 0x00, 0x63, 0x03, 0xdc, 0x00, 0x20, 0x02, 0x0f, 0x00, 0x76, + 0x04, 0xd7, 0x00, 0x63, 0x04, 0xa2, 0x00, 0x49, 0x03, 0xc3, 0x00, 0x63, + 0x04, 0x49, 0x00, 0x3a, 0x04, 0x92, 0x00, 0x40, 0x03, 0xa7, 0x00, 0x06, + 0x03, 0xc5, 0x00, 0x63, 0x04, 0x88, 0xff, 0xff, 0x04, 0xc0, 0x00, 0x40, + 0x04, 0x88, 0xff, 0xff, 0x03, 0xab, 0x00, 0x4a, 0x04, 0xe0, 0x00, 0x63, + 0x04, 0x42, 0x00, 0x48, 0x05, 0xd7, 0x00, 0x41, 0x05, 0x8d, 0x00, 0x41, + 0x04, 0xd1, 0x00, 0x4a, 0x05, 0xab, 0x00, 0x20, 0x04, 0x83, 0x00, 0x40, + 0x07, 0x65, 0x00, 0x1e, 0x07, 0x5e, 0x00, 0x63, 0x05, 0xb8, 0x00, 0x20, + 0x04, 0xe0, 0x00, 0x63, 0x04, 0x85, 0x00, 0x63, 0x05, 0x8b, 0x00, 0x21, + 0x06, 0x70, 0x00, 0x16, 0x04, 0x4a, 0x00, 0x3e, 0x04, 0xda, 0x00, 0x63, + 0x04, 0x69, 0x00, 0x63, 0x04, 0xd3, 0x00, 0x1e, 0x04, 0x6e, 0x00, 0x1b, + 0x05, 0x90, 0x00, 0x63, 0x04, 0xa9, 0x00, 0x46, 0x06, 0xaf, 0x00, 0x63, + 0x07, 0x5f, 0x00, 0x63, 0x05, 0x97, 0x00, 0x0a, 0x06, 0x3b, 0x00, 0x63, + 0x04, 0x7b, 0x00, 0x63, 0x04, 0x83, 0x00, 0x31, 0x06, 0xa4, 0x00, 0x63, + 0x04, 0x83, 0x00, 0x36, 0x04, 0x37, 0x00, 0x0a, 0x06, 0xe6, 0x00, 0x16, + 0x04, 0xbf, 0x00, 0x63, 0x05, 0x16, 0x00, 0x63, 0x05, 0xa3, 0x00, 0x20, + 0x06, 0x20, 0x00, 0x40, 0x04, 0x50, 0xff, 0xff, 0x04, 0xdb, 0x00, 0x03, + 0x06, 0xc3, 0x00, 0x20, 0x04, 0xa9, 0x00, 0x46, 0x04, 0xa9, 0x00, 0x63, + 0x06, 0x31, 0x00, 0x15, 0x04, 0xd2, 0x00, 0x40, 0x04, 0x4c, 0x00, 0x3e, + 0x04, 0xc0, 0x00, 0x40, 0x04, 0x92, 0x00, 0x40, 0x04, 0x03, 0x00, 0x47, + 0x08, 0x3b, 0x00, 0x63, 0x05, 0x2c, 0x00, 0x28, 0x02, 0xfa, 0x00, 0x30, + 0x02, 0xfa, 0x00, 0x35, 0x02, 0xfa, 0x00, 0x45, 0x02, 0xfa, 0x00, 0x46, + 0x02, 0xfa, 0x00, 0x33, 0x02, 0xfa, 0x00, 0x47, 0x02, 0xfa, 0x00, 0x43, + 0x03, 0xd2, 0x00, 0x8d, 0x02, 0xaa, 0x00, 0x90, 0x03, 0xdb, 0x00, 0x63, + 0x04, 0x3b, 0xff, 0xfb, 0x04, 0xad, 0x00, 0x49, 0x05, 0x39, 0x00, 0x84, + 0x05, 0x2b, 0x00, 0x84, 0x04, 0x47, 0x00, 0x71, 0x05, 0x30, 0x00, 0x84, + 0x04, 0x40, 0x00, 0x71, 0x04, 0x75, 0x00, 0x63, 0x04, 0x83, 0x00, 0x40, + 0x04, 0x6d, 0x00, 0x63, 0x04, 0xac, 0xff, 0xff, 0x02, 0x01, 0x00, 0x85, + 0x03, 0x9d, 0x00, 0x6a, 0x00, 0x00, 0xfc, 0x9a, 0x04, 0x07, 0x00, 0x83, + 0x04, 0x07, 0xff, 0x45, 0x04, 0x07, 0x00, 0x84, 0x04, 0x07, 0x00, 0x84, + 0x03, 0xc5, 0x00, 0x63, 0x03, 0x9d, 0x00, 0x6a, 0x03, 0x9d, 0x00, 0x6a, + 0x02, 0xfb, 0x00, 0x47, 0x02, 0xfb, 0x00, 0x35, 0x02, 0xfb, 0x00, 0x45, + 0x02, 0xfb, 0x00, 0x46, 0x02, 0xfb, 0x00, 0x33, 0x02, 0xfb, 0x00, 0x47, + 0x02, 0xfb, 0x00, 0x43, 0x05, 0x6a, 0x00, 0x58, 0x05, 0x92, 0x00, 0x58, + 0x05, 0x72, 0x00, 0x84, 0x05, 0xd6, 0x00, 0x58, 0x05, 0xd7, 0x00, 0x58, + 0x04, 0x68, 0x00, 0x8f, 0x04, 0x82, 0x00, 0x58, 0x04, 0x57, 0x00, 0x0f, + 0x04, 0xac, 0x00, 0x2c, 0x04, 0x6b, 0x00, 0x68, 0x04, 0x2e, 0x00, 0x3c, + 0x03, 0x9d, 0x00, 0x6a, 0x01, 0xd9, 0x00, 0x5a, 0x06, 0x8e, 0x00, 0x40, + 0x04, 0xa7, 0x00, 0x60, 0x02, 0x1b, 0xff, 0x9f, 0x04, 0x97, 0x00, 0x37, + 0x04, 0x97, 0x00, 0x61, 0x04, 0x97, 0x00, 0x34, 0x04, 0x97, 0x00, 0x54, + 0x04, 0x97, 0x00, 0x4e, 0x04, 0x97, 0x00, 0x33, 0x04, 0x97, 0x00, 0x5f, + 0x04, 0x97, 0x00, 0x56, 0x04, 0x97, 0x00, 0x5f, 0x04, 0x97, 0x00, 0xd9, + 0x02, 0x41, 0xff, 0xad, 0x02, 0x41, 0xff, 0xad, 0x02, 0x31, 0x00, 0x86, + 0x02, 0x31, 0xff, 0xfc, 0x02, 0x31, 0x00, 0x86, 0x04, 0x6d, 0x00, 0x63, + 0x04, 0xd2, 0x00, 0x4c, 0x04, 0x3e, 0x00, 0x38, 0x04, 0x91, 0x00, 0x6f, + 0x04, 0x46, 0x00, 0x44, 0x04, 0x98, 0x00, 0x44, 0x04, 0x96, 0x00, 0x44, + 0x04, 0x9c, 0x00, 0x3c, 0x04, 0x95, 0x00, 0x6f, 0x04, 0x9a, 0x00, 0x44, + 0x04, 0x53, 0x00, 0x48, 0x04, 0x91, 0x00, 0x42, 0x03, 0xd4, 0x00, 0x66, + 0x05, 0x35, 0x00, 0x56, 0x03, 0xd0, 0x00, 0x07, 0x06, 0x50, 0xff, 0xd7, + 0x04, 0x14, 0x00, 0x63, 0x04, 0xc0, 0x00, 0x40, 0x05, 0x30, 0x00, 0x36, + 0x04, 0xd6, 0x00, 0x63, 0x01, 0xfe, 0x00, 0x00, 0x03, 0x1a, 0x00, 0x6e, + 0x05, 0x51, 0xff, 0xec, 0x05, 0x51, 0xff, 0xec, 0x04, 0x98, 0xff, 0xcb, + 0x04, 0xf3, 0x00, 0x28, 0x02, 0xb4, 0xff, 0xe2, 0x05, 0x62, 0x00, 0x07, + 0x05, 0x62, 0x00, 0x07, 0x05, 0x62, 0x00, 0x07, 0x05, 0x62, 0x00, 0x07, + 0x05, 0x62, 0x00, 0x07, 0x05, 0x62, 0x00, 0x07, 0x05, 0x62, 0x00, 0x07, + 0x05, 0x3c, 0x00, 0x56, 0x04, 0x80, 0x00, 0x82, 0x04, 0x80, 0x00, 0x82, + 0x04, 0x80, 0x00, 0x82, 0x04, 0x80, 0x00, 0x82, 0x02, 0x55, 0xff, 0xba, + 0x02, 0x55, 0x00, 0x95, 0x02, 0x55, 0xff, 0xaf, 0x02, 0x55, 0xff, 0xad, + 0x05, 0xa6, 0x00, 0x82, 0x05, 0x86, 0x00, 0x56, 0x05, 0x86, 0x00, 0x56, + 0x05, 0x86, 0x00, 0x56, 0x05, 0x86, 0x00, 0x56, 0x05, 0x86, 0x00, 0x56, + 0x05, 0x44, 0x00, 0x74, 0x05, 0x44, 0x00, 0x74, 0x05, 0x44, 0x00, 0x74, + 0x05, 0x44, 0x00, 0x74, 0x04, 0xf2, 0x00, 0x02, 0x04, 0x4a, 0x00, 0x44, + 0x04, 0x4a, 0x00, 0x44, 0x04, 0x4a, 0x00, 0x44, 0x04, 0x4a, 0x00, 0x44, + 0x04, 0x4a, 0x00, 0x44, 0x04, 0x4a, 0x00, 0x44, 0x04, 0x4a, 0x00, 0x44, + 0x04, 0x2c, 0x00, 0x42, 0x04, 0x53, 0x00, 0x48, 0x04, 0x53, 0x00, 0x48, + 0x04, 0x53, 0x00, 0x48, 0x04, 0x53, 0x00, 0x48, 0x02, 0x31, 0xff, 0xa8, + 0x02, 0x31, 0x00, 0x86, 0x02, 0x31, 0xff, 0x9d, 0x02, 0x31, 0xff, 0x9b, + 0x04, 0x7b, 0x00, 0x69, 0x04, 0x86, 0x00, 0x42, 0x04, 0x86, 0x00, 0x42, + 0x04, 0x86, 0x00, 0x42, 0x04, 0x86, 0x00, 0x42, 0x04, 0x86, 0x00, 0x42, + 0x04, 0x7a, 0x00, 0x68, 0x04, 0x7a, 0x00, 0x68, 0x04, 0x7a, 0x00, 0x68, + 0x04, 0x7a, 0x00, 0x68, 0x04, 0x04, 0x00, 0x03, 0x04, 0x04, 0x00, 0x03, + 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, 0x05, 0x62, 0x00, 0x07, + 0x04, 0x4a, 0x00, 0x44, 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, + 0x05, 0x3c, 0x00, 0x56, 0x04, 0x2c, 0x00, 0x42, 0x05, 0x3c, 0x00, 0x56, + 0x04, 0x2c, 0x00, 0x42, 0x05, 0x3c, 0x00, 0x56, 0x04, 0x2c, 0x00, 0x42, + 0x05, 0x3c, 0x00, 0x56, 0x04, 0x2c, 0x00, 0x42, 0x05, 0x33, 0x00, 0x82, + 0x05, 0x18, 0x00, 0x42, 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, + 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, 0x04, 0x80, 0x00, 0x82, + 0x04, 0x53, 0x00, 0x48, 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, + 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, 0x05, 0x73, 0x00, 0x5e, + 0x04, 0x91, 0x00, 0x45, 0x05, 0x73, 0x00, 0x5e, 0x04, 0x91, 0x00, 0x45, + 0x05, 0x73, 0x00, 0x5e, 0x04, 0x91, 0x00, 0x45, 0x05, 0x73, 0x00, 0x5e, + 0x04, 0x91, 0x00, 0x45, 0x05, 0xa7, 0x00, 0x82, 0x04, 0x7a, 0x00, 0x68, + 0x02, 0x55, 0xff, 0xb2, 0x02, 0x31, 0xff, 0xa0, 0x02, 0x55, 0xff, 0xd4, + 0x02, 0x31, 0xff, 0xc2, 0x02, 0x55, 0xff, 0xd2, 0x02, 0x31, 0xff, 0xc0, + 0x02, 0x55, 0x00, 0x17, 0x02, 0x1f, 0x00, 0x03, 0x02, 0x55, 0x00, 0x95, + 0x06, 0xcd, 0x00, 0x95, 0x04, 0x33, 0x00, 0x6d, 0x04, 0x78, 0x00, 0x28, + 0x02, 0x41, 0xff, 0x97, 0x05, 0x14, 0x00, 0x82, 0x04, 0x46, 0x00, 0x6f, + 0x04, 0x55, 0x00, 0x82, 0x02, 0x1f, 0x00, 0x7e, 0x04, 0x55, 0x00, 0x82, + 0x02, 0x1f, 0x00, 0x5b, 0x04, 0x55, 0x00, 0x82, 0x02, 0xb5, 0x00, 0x7e, + 0x04, 0x55, 0x00, 0x82, 0x02, 0xfb, 0x00, 0x7e, 0x05, 0xa6, 0x00, 0x82, + 0x04, 0x7b, 0x00, 0x69, 0x05, 0xa6, 0x00, 0x82, 0x04, 0x7b, 0x00, 0x69, + 0x05, 0xa6, 0x00, 0x82, 0x04, 0x7b, 0x00, 0x69, 0x04, 0x7b, 0xff, 0x92, + 0x05, 0x86, 0x00, 0x56, 0x04, 0x86, 0x00, 0x42, 0x05, 0x86, 0x00, 0x56, + 0x04, 0x86, 0x00, 0x42, 0x05, 0x86, 0x00, 0x56, 0x04, 0x86, 0x00, 0x42, + 0x05, 0x1b, 0x00, 0x82, 0x02, 0xeb, 0x00, 0x6f, 0x05, 0x1b, 0x00, 0x82, + 0x02, 0xeb, 0x00, 0x50, 0x05, 0x1b, 0x00, 0x82, 0x02, 0xeb, 0x00, 0x11, + 0x04, 0xeb, 0x00, 0x45, 0x04, 0x1d, 0x00, 0x38, 0x04, 0xeb, 0x00, 0x45, + 0x04, 0x1d, 0x00, 0x38, 0x04, 0xeb, 0x00, 0x45, 0x04, 0x1d, 0x00, 0x38, + 0x04, 0xeb, 0x00, 0x45, 0x04, 0x1d, 0x00, 0x38, 0x04, 0xeb, 0x00, 0x45, + 0x04, 0x1d, 0x00, 0x38, 0x04, 0xf3, 0x00, 0x28, 0x02, 0xb4, 0x00, 0x0a, + 0x04, 0xf3, 0x00, 0x28, 0x02, 0xb4, 0x00, 0x0a, 0x04, 0xf3, 0x00, 0x28, + 0x02, 0xdc, 0x00, 0x0a, 0x05, 0x44, 0x00, 0x74, 0x04, 0x7a, 0x00, 0x68, + 0x05, 0x44, 0x00, 0x74, 0x04, 0x7a, 0x00, 0x68, 0x05, 0x44, 0x00, 0x74, + 0x04, 0x7a, 0x00, 0x68, 0x05, 0x44, 0x00, 0x74, 0x04, 0x7a, 0x00, 0x68, + 0x05, 0x44, 0x00, 0x74, 0x04, 0x7a, 0x00, 0x68, 0x05, 0x44, 0x00, 0x74, + 0x04, 0x7a, 0x00, 0x68, 0x06, 0xff, 0x00, 0x23, 0x05, 0xe1, 0x00, 0x1c, + 0x04, 0xf2, 0x00, 0x02, 0x04, 0x04, 0x00, 0x03, 0x04, 0xf2, 0x00, 0x02, + 0x04, 0xd9, 0x00, 0x49, 0x04, 0x12, 0x00, 0x4a, 0x04, 0xd9, 0x00, 0x49, + 0x04, 0x12, 0x00, 0x4a, 0x04, 0xd9, 0x00, 0x49, 0x04, 0x12, 0x00, 0x4a, + 0x07, 0x85, 0x00, 0x02, 0x06, 0xc1, 0x00, 0x42, 0x05, 0x83, 0x00, 0x5d, + 0x04, 0x84, 0x00, 0x42, 0x04, 0x75, 0xff, 0x93, 0x04, 0x75, 0xff, 0x93, + 0x04, 0x51, 0x00, 0x20, 0x04, 0xac, 0xff, 0xff, 0x04, 0xac, 0xff, 0xff, + 0x04, 0xac, 0xff, 0xff, 0x04, 0xac, 0xff, 0xff, 0x04, 0xac, 0xff, 0xff, + 0x04, 0xac, 0xff, 0xff, 0x04, 0xac, 0xff, 0xff, 0x04, 0x83, 0x00, 0x40, + 0x03, 0xdb, 0x00, 0x63, 0x03, 0xdb, 0x00, 0x63, 0x03, 0xdb, 0x00, 0x63, + 0x03, 0xdb, 0x00, 0x63, 0x02, 0x0f, 0xff, 0x98, 0x02, 0x0f, 0x00, 0x76, + 0x02, 0x0f, 0xff, 0x8d, 0x02, 0x0f, 0xff, 0x8b, 0x04, 0xd6, 0x00, 0x63, + 0x04, 0xc0, 0x00, 0x40, 0x04, 0xc0, 0x00, 0x40, 0x04, 0xc0, 0x00, 0x40, + 0x04, 0xc0, 0x00, 0x40, 0x04, 0xc0, 0x00, 0x40, 0x04, 0x8f, 0x00, 0x5d, + 0x04, 0x8f, 0x00, 0x5d, 0x04, 0x8f, 0x00, 0x5d, 0x04, 0x8f, 0x00, 0x5d, + 0x04, 0x4d, 0xff, 0xff, 0x04, 0xac, 0xff, 0xff, 0x04, 0xac, 0xff, 0xff, + 0x04, 0xac, 0xff, 0xff, 0x04, 0x83, 0x00, 0x40, 0x04, 0x83, 0x00, 0x40, + 0x04, 0x83, 0x00, 0x40, 0x04, 0x83, 0x00, 0x40, 0x04, 0x75, 0x00, 0x16, + 0x03, 0xdb, 0x00, 0x63, 0x03, 0xdb, 0x00, 0x63, 0x03, 0xdb, 0x00, 0x63, + 0x03, 0xdb, 0x00, 0x63, 0x03, 0xdb, 0x00, 0x63, 0x04, 0xa2, 0x00, 0x49, + 0x04, 0xa2, 0x00, 0x49, 0x04, 0xa2, 0x00, 0x49, 0x04, 0xa2, 0x00, 0x49, + 0x04, 0xd7, 0x00, 0x63, 0x02, 0x0f, 0xff, 0x90, 0x02, 0x0f, 0xff, 0xb2, + 0x02, 0x0f, 0xff, 0xb0, 0x02, 0x0f, 0x00, 0x25, 0x02, 0x0f, 0x00, 0x74, + 0x03, 0xdc, 0x00, 0x20, 0x04, 0x64, 0x00, 0x63, 0x03, 0xba, 0x00, 0x63, + 0x03, 0xba, 0x00, 0x63, 0x03, 0xba, 0x00, 0x63, 0x03, 0xba, 0x00, 0x63, + 0x04, 0xd6, 0x00, 0x63, 0x04, 0xd6, 0x00, 0x63, 0x04, 0xd6, 0x00, 0x63, + 0x04, 0xc0, 0x00, 0x40, 0x04, 0xc0, 0x00, 0x40, 0x04, 0xc0, 0x00, 0x40, + 0x04, 0x76, 0x00, 0x63, 0x04, 0x76, 0x00, 0x63, 0x04, 0x76, 0x00, 0x63, + 0x04, 0x49, 0x00, 0x3a, 0x04, 0x49, 0x00, 0x3a, 0x04, 0x49, 0x00, 0x3a, + 0x04, 0x49, 0x00, 0x3a, 0x04, 0x51, 0x00, 0x20, 0x04, 0x51, 0x00, 0x20, + 0x04, 0x51, 0x00, 0x20, 0x04, 0x8f, 0x00, 0x5d, 0x04, 0x8f, 0x00, 0x5d, + 0x04, 0x8f, 0x00, 0x5d, 0x04, 0x8f, 0x00, 0x5d, 0x04, 0x8f, 0x00, 0x5d, + 0x04, 0x8f, 0x00, 0x5d, 0x05, 0xfd, 0x00, 0x1f, 0x04, 0x4d, 0xff, 0xff, + 0x04, 0x4d, 0xff, 0xff, 0x04, 0x31, 0x00, 0x37, 0x04, 0x31, 0x00, 0x37, + 0x04, 0x31, 0x00, 0x37, 0x05, 0x62, 0x00, 0x07, 0x04, 0x80, 0xfe, 0xa5, + 0x05, 0xa7, 0xfe, 0xa9, 0x02, 0x55, 0xfe, 0xaa, 0x05, 0x9a, 0xff, 0x69, + 0x05, 0x56, 0xfe, 0xb3, 0x05, 0x74, 0xff, 0x7f, 0x02, 0xb2, 0xff, 0x72, + 0x05, 0x62, 0x00, 0x07, 0x05, 0x1b, 0x00, 0x82, 0x04, 0x80, 0x00, 0x82, + 0x04, 0xd9, 0x00, 0x49, 0x05, 0xa7, 0x00, 0x82, 0x02, 0x55, 0x00, 0x95, + 0x05, 0x14, 0x00, 0x82, 0x07, 0x02, 0x00, 0x82, 0x05, 0xa6, 0x00, 0x82, + 0x05, 0x86, 0x00, 0x56, 0x05, 0x29, 0x00, 0x82, 0x04, 0xf3, 0x00, 0x28, + 0x04, 0xf2, 0x00, 0x02, 0x05, 0x15, 0x00, 0x16, 0x02, 0x55, 0xff, 0xad, + 0x04, 0xf2, 0x00, 0x02, 0x04, 0x82, 0x00, 0x49, 0x04, 0x73, 0x00, 0x5f, + 0x04, 0x84, 0x00, 0x6c, 0x02, 0xb2, 0x00, 0x8a, 0x04, 0x5e, 0x00, 0x71, + 0x04, 0xb8, 0x00, 0x82, 0x04, 0x86, 0x00, 0x42, 0x04, 0xed, 0x00, 0x8b, + 0x04, 0x0b, 0x00, 0x0d, 0x04, 0x12, 0x00, 0x15, 0x02, 0xb2, 0xff, 0xac, + 0x04, 0x5e, 0x00, 0x71, 0x04, 0x86, 0x00, 0x42, 0x04, 0x5e, 0x00, 0x71, + 0x06, 0x91, 0x00, 0x53, 0x04, 0x80, 0x00, 0x82, 0x04, 0x75, 0x00, 0x84, + 0x04, 0xeb, 0x00, 0x45, 0x02, 0x55, 0x00, 0x95, 0x02, 0x55, 0xff, 0xad, + 0x04, 0x78, 0x00, 0x28, 0x05, 0x2b, 0x00, 0x84, 0x05, 0x14, 0x00, 0x82, + 0x05, 0x0d, 0x00, 0x1f, 0x05, 0x62, 0x00, 0x07, 0x05, 0x1b, 0x00, 0x82, + 0x04, 0x75, 0x00, 0x84, 0x04, 0x80, 0x00, 0x82, 0x05, 0x9a, 0x00, 0x78, + 0x07, 0x02, 0x00, 0x82, 0x05, 0xa7, 0x00, 0x82, 0x05, 0x86, 0x00, 0x56, + 0x05, 0xa9, 0x00, 0x84, 0x05, 0x29, 0x00, 0x82, 0x05, 0x3c, 0x00, 0x56, + 0x04, 0xf3, 0x00, 0x28, 0x05, 0x15, 0x00, 0x16, 0x04, 0x4a, 0x00, 0x44, + 0x04, 0x53, 0x00, 0x48, 0x04, 0x8a, 0x00, 0x6f, 0x04, 0x86, 0x00, 0x42, + 0x04, 0x81, 0x00, 0x6f, 0x04, 0x2c, 0x00, 0x42, 0x04, 0x04, 0x00, 0x03, + 0x04, 0x12, 0x00, 0x15, 0x04, 0x53, 0x00, 0x48, 0x03, 0x5a, 0x00, 0x6f, + 0x04, 0x1d, 0x00, 0x38, 0x02, 0x1f, 0x00, 0x6d, 0x02, 0x31, 0xff, 0x9b, + 0x02, 0x14, 0xff, 0xa1, 0x04, 0x82, 0x00, 0x82, 0x04, 0x04, 0x00, 0x03, + 0x06, 0xff, 0x00, 0x23, 0x05, 0xe1, 0x00, 0x1c, 0x06, 0xff, 0x00, 0x23, + 0x05, 0xe1, 0x00, 0x1c, 0x06, 0xff, 0x00, 0x23, 0x05, 0xe1, 0x00, 0x1c, + 0x04, 0xf2, 0x00, 0x02, 0x04, 0x04, 0x00, 0x03, 0x01, 0x4b, 0x00, 0x3f, + 0x02, 0x91, 0x00, 0x40, 0x04, 0x5a, 0x00, 0x7c, 0x02, 0x41, 0xff, 0x89, + 0x01, 0xd6, 0x00, 0x3a, 0x07, 0x02, 0x00, 0x82, 0x06, 0xed, 0x00, 0x6f, + 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, 0x04, 0x80, 0x00, 0x82, + 0x05, 0x9a, 0x00, 0x78, 0x04, 0x53, 0x00, 0x48, 0x04, 0x8a, 0x00, 0x6f, + 0x05, 0xd0, 0x00, 0x34, 0x05, 0xf4, 0x00, 0x44, 0x05, 0x24, 0x00, 0x0b, + 0x04, 0x15, 0xff, 0xea, 0x08, 0x8a, 0x00, 0x42, 0x09, 0x8a, 0x00, 0x56, + 0x04, 0xef, 0x00, 0x43, 0x04, 0x1c, 0x00, 0x45, 0x05, 0x3c, 0x00, 0x56, + 0x04, 0x2c, 0x00, 0x42, 0x04, 0xf2, 0x00, 0x02, 0x04, 0x15, 0x00, 0x11, + 0x02, 0x55, 0x00, 0x95, 0x07, 0xfb, 0x00, 0x11, 0x06, 0xd5, 0x00, 0x27, + 0x02, 0x55, 0x00, 0x95, 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, + 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, 0x07, 0x85, 0x00, 0x02, + 0x06, 0xc1, 0x00, 0x42, 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, + 0x05, 0x8f, 0x00, 0x4b, 0x04, 0x3c, 0x00, 0x4e, 0x04, 0x3c, 0x00, 0x4e, + 0x07, 0xfb, 0x00, 0x11, 0x06, 0xd5, 0x00, 0x27, 0x04, 0xef, 0x00, 0x43, + 0x04, 0x1c, 0x00, 0x45, 0x05, 0x9a, 0x00, 0x78, 0x04, 0x8a, 0x00, 0x6f, + 0x05, 0x9a, 0x00, 0x78, 0x04, 0x8a, 0x00, 0x6f, 0x05, 0x86, 0x00, 0x56, + 0x04, 0x86, 0x00, 0x42, 0x05, 0x81, 0x00, 0x5a, 0x04, 0x84, 0x00, 0x40, + 0x05, 0x81, 0x00, 0x5a, 0x04, 0x84, 0x00, 0x40, 0x05, 0x34, 0x00, 0x3e, + 0x04, 0x29, 0x00, 0x3f, 0x05, 0x0d, 0x00, 0x1f, 0x04, 0x04, 0x00, 0x03, + 0x05, 0x0d, 0x00, 0x1f, 0x04, 0x04, 0x00, 0x03, 0x05, 0x0d, 0x00, 0x1f, + 0x04, 0x04, 0x00, 0x03, 0x05, 0x90, 0x00, 0x89, 0x04, 0x6e, 0x00, 0x58, + 0x06, 0xf9, 0x00, 0x85, 0x06, 0x9f, 0x00, 0x82, 0x04, 0x82, 0x00, 0x42, + 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, 0x05, 0x62, 0x00, 0x07, + 0x04, 0x4a, 0x00, 0x44, 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, + 0x05, 0x62, 0x00, 0x06, 0x04, 0x4a, 0xff, 0x79, 0x05, 0x62, 0x00, 0x07, + 0x04, 0x4a, 0x00, 0x44, 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, + 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, 0x05, 0x62, 0x00, 0x07, + 0x04, 0x4a, 0x00, 0x44, 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, + 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, 0x05, 0x62, 0x00, 0x07, + 0x04, 0x4a, 0x00, 0x44, 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0x00, 0x44, + 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, 0x04, 0x80, 0x00, 0x82, + 0x04, 0x53, 0x00, 0x48, 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, + 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, 0x04, 0x80, 0xff, 0xcd, + 0x04, 0x53, 0xff, 0x72, 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, + 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, 0x04, 0x80, 0x00, 0x82, + 0x04, 0x53, 0x00, 0x48, 0x02, 0x55, 0x00, 0x95, 0x02, 0x31, 0x00, 0x86, + 0x02, 0x55, 0x00, 0x88, 0x02, 0x1f, 0x00, 0x6d, 0x05, 0x86, 0x00, 0x56, + 0x04, 0x86, 0x00, 0x42, 0x05, 0x86, 0x00, 0x56, 0x04, 0x86, 0x00, 0x42, + 0x05, 0x86, 0x00, 0x56, 0x04, 0x86, 0x00, 0x42, 0x05, 0x86, 0x00, 0x14, + 0x04, 0x86, 0xff, 0x92, 0x05, 0x86, 0x00, 0x56, 0x04, 0x86, 0x00, 0x42, + 0x05, 0x86, 0x00, 0x56, 0x04, 0x86, 0x00, 0x42, 0x05, 0x86, 0x00, 0x56, + 0x04, 0x86, 0x00, 0x42, 0x05, 0x9c, 0x00, 0x50, 0x04, 0xa6, 0x00, 0x40, + 0x05, 0x9c, 0x00, 0x50, 0x04, 0xa6, 0x00, 0x40, 0x05, 0x9c, 0x00, 0x50, + 0x04, 0xa6, 0x00, 0x40, 0x05, 0x9c, 0x00, 0x50, 0x04, 0xa6, 0x00, 0x40, + 0x05, 0x9c, 0x00, 0x50, 0x04, 0xa6, 0x00, 0x40, 0x05, 0x44, 0x00, 0x74, + 0x04, 0x7a, 0x00, 0x68, 0x05, 0x44, 0x00, 0x74, 0x04, 0x7a, 0x00, 0x68, + 0x05, 0xb3, 0x00, 0x74, 0x04, 0xe1, 0x00, 0x68, 0x05, 0xb3, 0x00, 0x74, + 0x04, 0xe1, 0x00, 0x68, 0x05, 0xb3, 0x00, 0x74, 0x04, 0xe1, 0x00, 0x68, + 0x05, 0xb3, 0x00, 0x74, 0x04, 0xe1, 0x00, 0x68, 0x05, 0xb3, 0x00, 0x74, + 0x04, 0xe1, 0x00, 0x68, 0x04, 0xf2, 0x00, 0x02, 0x04, 0x04, 0x00, 0x03, + 0x04, 0xf2, 0x00, 0x02, 0x04, 0x04, 0x00, 0x03, 0x04, 0xf2, 0x00, 0x02, + 0x04, 0x04, 0x00, 0x03, 0x04, 0xa0, 0x00, 0x42, 0x04, 0xf3, 0x00, 0x28, + 0x04, 0x13, 0x00, 0x1f, 0x05, 0x90, 0x00, 0x89, 0x04, 0x6e, 0x00, 0x58, + 0x04, 0x75, 0x00, 0x84, 0x03, 0x5a, 0x00, 0x6f, 0x06, 0x0e, 0xff, 0xe5, + 0x04, 0xc8, 0xff, 0xbc, 0x04, 0x7a, 0x00, 0x68, 0x05, 0x01, 0xff, 0xd5, + 0x05, 0x01, 0xff, 0xd5, 0x04, 0x75, 0xff, 0xe5, 0x03, 0x5a, 0xff, 0xc6, + 0x05, 0x3f, 0xff, 0xcc, 0x04, 0x5b, 0xff, 0xa8, 0x04, 0xf2, 0x00, 0x02, + 0x04, 0x15, 0x00, 0x11, 0x05, 0x15, 0x00, 0x16, 0x04, 0x12, 0x00, 0x15, + 0x04, 0x73, 0x00, 0x5f, 0x04, 0x62, 0xff, 0xf3, 0x06, 0x1b, 0x00, 0x6d, + 0x04, 0x97, 0x00, 0x46, 0x04, 0x97, 0x00, 0x40, 0x04, 0x97, 0x00, 0x37, + 0x04, 0x97, 0x00, 0x69, 0x04, 0xab, 0x00, 0x78, 0x04, 0xbf, 0x00, 0x73, + 0x04, 0xab, 0x00, 0x56, 0x04, 0xbf, 0x00, 0x73, 0x05, 0x73, 0x00, 0x5e, + 0x04, 0x91, 0x00, 0x45, 0x05, 0xa6, 0x00, 0x82, 0x04, 0x7b, 0x00, 0x69, + 0x05, 0x62, 0x00, 0x07, 0x04, 0x4a, 0xff, 0xe8, 0x04, 0x80, 0x00, 0x3c, + 0x04, 0x53, 0xff, 0xe1, 0x02, 0x55, 0xfe, 0xeb, 0x02, 0x31, 0xfe, 0xd9, + 0x05, 0x86, 0x00, 0x56, 0x04, 0x86, 0x00, 0x01, 0x05, 0x1b, 0x00, 0x17, + 0x02, 0xeb, 0xff, 0x5b, 0x05, 0x44, 0x00, 0x5f, 0x04, 0x7a, 0xff, 0xfd, + 0x05, 0x1e, 0xfe, 0x85, 0x05, 0x1b, 0x00, 0x82, 0x04, 0x81, 0x00, 0x6f, + 0x05, 0x33, 0x00, 0x82, 0x04, 0x82, 0x00, 0x42, 0x05, 0x33, 0x00, 0x82, + 0x04, 0x82, 0x00, 0x42, 0x05, 0xa7, 0x00, 0x82, 0x04, 0x7a, 0x00, 0x68, + 0x05, 0x14, 0x00, 0x82, 0x04, 0x46, 0x00, 0x6f, 0x05, 0x14, 0x00, 0x82, + 0x04, 0x46, 0x00, 0x6f, 0x04, 0x55, 0x00, 0x82, 0x02, 0x1f, 0x00, 0x6d, + 0x07, 0x02, 0x00, 0x82, 0x06, 0xed, 0x00, 0x6f, 0x05, 0xa6, 0x00, 0x82, + 0x04, 0x7b, 0x00, 0x69, 0x05, 0x86, 0x00, 0x56, 0x05, 0x29, 0x00, 0x82, + 0x04, 0x81, 0x00, 0x6f, 0x05, 0x1b, 0x00, 0x82, 0x02, 0xeb, 0x00, 0x62, + 0x04, 0xeb, 0x00, 0x45, 0x04, 0x1d, 0x00, 0x38, 0x04, 0xf3, 0x00, 0x28, + 0x02, 0xb4, 0x00, 0x0a, 0x05, 0x44, 0x00, 0x74, 0x05, 0x3b, 0x00, 0x07, + 0x04, 0x0b, 0x00, 0x0d, 0x05, 0x3b, 0x00, 0x07, 0x04, 0x0b, 0x00, 0x0d, + 0x06, 0xff, 0x00, 0x23, 0x05, 0xe1, 0x00, 0x1c, 0x04, 0xd9, 0x00, 0x49, + 0x04, 0x12, 0x00, 0x4a, 0x05, 0xcc, 0xfe, 0x17, 0x04, 0xac, 0xff, 0xdd, + 0x04, 0x17, 0xfe, 0xf6, 0x05, 0x13, 0xfe, 0xf0, 0x02, 0x4b, 0xfe, 0xf1, + 0x04, 0xca, 0xff, 0x55, 0x04, 0x89, 0xfe, 0xba, 0x04, 0xdb, 0xff, 0x62, + 0x04, 0xac, 0xff, 0xff, 0x04, 0x6d, 0x00, 0x63, 0x03, 0xdb, 0x00, 0x63, + 0x04, 0x31, 0x00, 0x37, 0x04, 0xd7, 0x00, 0x63, 0x02, 0x0f, 0x00, 0x76, + 0x04, 0x64, 0x00, 0x63, 0x06, 0x07, 0x00, 0x63, 0x04, 0xd6, 0x00, 0x63, + 0x04, 0xc0, 0x00, 0x40, 0x04, 0x78, 0x00, 0x63, 0x04, 0x51, 0x00, 0x20, + 0x04, 0x4d, 0xff, 0xff, 0x04, 0x64, 0x00, 0x03, 0x02, 0x0f, 0xff, 0x8b, + 0x04, 0x4d, 0xff, 0xff, 0x03, 0xdb, 0x00, 0x63, 0x03, 0xc5, 0x00, 0x63, + 0x04, 0x49, 0x00, 0x3a, 0x02, 0x0f, 0x00, 0x76, 0x02, 0x0f, 0xff, 0x8b, + 0x03, 0xdc, 0x00, 0x20, 0x04, 0x64, 0x00, 0x63, 0x04, 0x6e, 0x00, 0x1b, + 0x04, 0xac, 0xff, 0xff, 0x04, 0x6d, 0x00, 0x63, 0x03, 0xc5, 0x00, 0x63, + 0x03, 0xdb, 0x00, 0x63, 0x04, 0xda, 0x00, 0x63, 0x06, 0x07, 0x00, 0x63, + 0x04, 0xd7, 0x00, 0x63, 0x04, 0xc0, 0x00, 0x40, 0x04, 0xe0, 0x00, 0x63, + 0x04, 0x78, 0x00, 0x63, 0x04, 0x83, 0x00, 0x40, 0x04, 0x51, 0x00, 0x20, + 0x04, 0x64, 0x00, 0x03, 0x04, 0x4a, 0x00, 0x3e, 0x04, 0xd7, 0x00, 0x63, + 0x04, 0x83, 0x00, 0x40, 0x04, 0x4d, 0xff, 0xff, 0x06, 0x31, 0x00, 0x15, + 0x04, 0xda, 0x00, 0x63, 0x04, 0x6e, 0x00, 0x1b, 0x05, 0xd7, 0x00, 0x41, + 0x05, 0xeb, 0x00, 0x76, 0x06, 0x50, 0xff, 0xd7, 0x04, 0xc0, 0x00, 0x40, + 0x04, 0x49, 0x00, 0x3a, 0x05, 0xfd, 0x00, 0x1f, 0x05, 0xfd, 0x00, 0x1f, + 0x05, 0xfd, 0x00, 0x1f, 0x04, 0x4d, 0xff, 0xff, 0x05, 0x62, 0x00, 0x07, + 0x04, 0x4a, 0x00, 0x44, 0x04, 0x80, 0x00, 0x82, 0x04, 0x53, 0x00, 0x48, + 0x04, 0xac, 0xff, 0xff, 0x03, 0xdb, 0x00, 0x63, 0x02, 0x31, 0x00, 0x6d, + 0x00, 0x01, 0x00, 0x00, 0x07, 0x6c, 0xfe, 0x0c, 0x00, 0x00, 0x09, 0x8a, + 0xfa, 0x30, 0xfe, 0x35, 0x09, 0x87, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0e, + 0x00, 0x03, 0x04, 0xa7, 0x02, 0xbc, 0x00, 0x05, 0x00, 0x00, 0x05, 0x9a, + 0x05, 0x33, 0x00, 0x00, 0x01, 0x1f, 0x05, 0x9a, 0x05, 0x33, 0x00, 0x00, + 0x03, 0xd1, 0x00, 0x66, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x02, 0xff, 0x50, 0x00, + 0x20, 0x5b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x47, 0x4f, + 0x4f, 0x47, 0x00, 0x20, 0x00, 0x00, 0xff, 0xfd, 0x06, 0x00, 0xfe, 0x00, + 0x00, 0x66, 0x07, 0x9a, 0x02, 0x00, 0x20, 0x00, 0x01, 0x9f, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x3a, 0x05, 0xb0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x10, 0x09, 0x0b, 0x04, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x03, 0x05, 0x05, 0x07, 0x06, 0x01, 0x03, 0x03, + 0x04, 0x05, 0x02, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x03, 0x02, 0x05, 0x05, 0x05, 0x04, 0x08, 0x06, + 0x06, 0x06, 0x06, 0x05, 0x05, 0x06, 0x06, 0x03, 0x05, 0x06, 0x05, 0x08, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x06, 0x06, + 0x05, 0x03, 0x04, 0x03, 0x04, 0x04, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x03, 0x05, 0x05, 0x02, 0x02, 0x05, 0x02, 0x08, 0x05, 0x05, 0x05, 0x05, + 0x03, 0x05, 0x03, 0x05, 0x05, 0x07, 0x05, 0x05, 0x05, 0x03, 0x02, 0x03, + 0x06, 0x03, 0x05, 0x05, 0x06, 0x05, 0x02, 0x06, 0x04, 0x07, 0x04, 0x05, + 0x05, 0x07, 0x05, 0x04, 0x05, 0x03, 0x03, 0x03, 0x06, 0x04, 0x03, 0x02, + 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x04, 0x08, 0x05, 0x06, 0x05, 0x06, + 0x08, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x02, 0x05, 0x05, 0x03, 0x06, + 0x05, 0x09, 0x08, 0x02, 0x06, 0x03, 0x06, 0x05, 0x06, 0x05, 0x03, 0x05, + 0x04, 0x04, 0x05, 0x04, 0x02, 0x03, 0x03, 0x04, 0x04, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x03, 0x05, 0x07, 0x06, 0x06, 0x05, + 0x06, 0x05, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x03, 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, + 0x07, 0x05, 0x05, 0x07, 0x07, 0x06, 0x0a, 0x0a, 0x07, 0x06, 0x06, 0x07, + 0x09, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x09, 0x09, 0x07, 0x08, + 0x06, 0x06, 0x08, 0x05, 0x05, 0x05, 0x04, 0x06, 0x08, 0x05, 0x05, 0x05, + 0x05, 0x07, 0x05, 0x05, 0x05, 0x07, 0x05, 0x05, 0x07, 0x08, 0x06, 0x07, + 0x05, 0x05, 0x07, 0x05, 0x05, 0x05, 0x08, 0x08, 0x05, 0x05, 0x09, 0x07, + 0x05, 0x08, 0x07, 0x06, 0x05, 0x08, 0x07, 0x08, 0x07, 0x0a, 0x09, 0x05, + 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x07, 0x09, 0x07, 0x06, + 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x06, 0x05, 0x06, + 0x05, 0x05, 0x04, 0x06, 0x05, 0x0a, 0x08, 0x07, 0x06, 0x06, 0x05, 0x07, + 0x06, 0x07, 0x06, 0x09, 0x06, 0x09, 0x08, 0x07, 0x06, 0x06, 0x05, 0x08, + 0x06, 0x07, 0x06, 0x06, 0x05, 0x06, 0x07, 0x05, 0x06, 0x05, 0x07, 0x06, + 0x06, 0x05, 0x07, 0x06, 0x09, 0x07, 0x06, 0x05, 0x05, 0x05, 0x04, 0x06, + 0x05, 0x06, 0x08, 0x08, 0x07, 0x06, 0x05, 0x05, 0x09, 0x08, 0x09, 0x07, + 0x06, 0x05, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x05, 0x09, 0x05, 0x09, + 0x03, 0x02, 0x02, 0x05, 0x02, 0x02, 0x01, 0x01, 0x00, 0x04, 0x04, 0x06, + 0x07, 0x04, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x05, 0x05, 0x03, + 0x05, 0x07, 0x02, 0x09, 0x03, 0x03, 0x04, 0x03, 0x04, 0x05, 0x07, 0x08, + 0x0a, 0x07, 0x08, 0x05, 0x07, 0x05, 0x05, 0x06, 0x06, 0x07, 0x04, 0x09, + 0x06, 0x06, 0x07, 0x08, 0x08, 0x08, 0x05, 0x06, 0x06, 0x05, 0x05, 0x09, + 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x02, 0x06, 0x05, 0x06, + 0x08, 0x08, 0x06, 0x08, 0x00, 0x09, 0x09, 0x03, 0x03, 0x03, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x04, 0x05, + 0x04, 0x02, 0x05, 0x05, 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, 0x05, 0x05, + 0x04, 0x05, 0x05, 0x07, 0x06, 0x05, 0x06, 0x05, 0x08, 0x08, 0x06, 0x05, + 0x05, 0x06, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x05, 0x08, 0x08, + 0x06, 0x07, 0x05, 0x05, 0x07, 0x05, 0x05, 0x08, 0x05, 0x06, 0x06, 0x07, + 0x05, 0x05, 0x08, 0x05, 0x05, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x09, + 0x06, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x03, 0x04, 0x05, + 0x05, 0x06, 0x06, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 0x04, + 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x04, 0x02, 0x07, 0x05, 0x02, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x02, 0x02, 0x02, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x06, + 0x04, 0x07, 0x05, 0x05, 0x06, 0x05, 0x02, 0x03, 0x06, 0x06, 0x05, 0x06, + 0x03, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, + 0x05, 0x03, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x03, 0x02, 0x03, 0x02, + 0x03, 0x02, 0x03, 0x02, 0x03, 0x08, 0x05, 0x05, 0x03, 0x06, 0x05, 0x05, + 0x02, 0x05, 0x02, 0x05, 0x03, 0x05, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, + 0x05, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x03, 0x06, 0x03, + 0x06, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x08, 0x07, 0x06, 0x05, 0x06, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x06, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, + 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x04, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x05, 0x06, 0x03, 0x06, 0x06, 0x06, 0x03, 0x06, 0x06, 0x05, 0x05, + 0x06, 0x03, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x03, 0x06, + 0x05, 0x05, 0x05, 0x03, 0x05, 0x05, 0x05, 0x06, 0x05, 0x05, 0x03, 0x05, + 0x05, 0x05, 0x07, 0x05, 0x05, 0x06, 0x03, 0x03, 0x05, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x05, 0x05, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x05, + 0x02, 0x02, 0x02, 0x05, 0x05, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x06, + 0x05, 0x01, 0x03, 0x05, 0x03, 0x02, 0x08, 0x08, 0x06, 0x05, 0x05, 0x06, + 0x05, 0x05, 0x07, 0x07, 0x06, 0x05, 0x0a, 0x0b, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x03, 0x09, 0x08, 0x03, 0x06, 0x05, 0x06, 0x05, 0x08, 0x08, + 0x05, 0x05, 0x06, 0x05, 0x05, 0x09, 0x08, 0x06, 0x05, 0x06, 0x05, 0x06, + 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, + 0x05, 0x06, 0x05, 0x06, 0x05, 0x08, 0x07, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x03, 0x02, 0x03, 0x02, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x05, 0x06, 0x05, 0x06, 0x05, 0x05, 0x04, 0x07, 0x05, 0x05, 0x06, 0x06, + 0x05, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x05, 0x05, 0x07, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, + 0x05, 0x05, 0x05, 0x03, 0x02, 0x06, 0x05, 0x06, 0x03, 0x06, 0x05, 0x06, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x05, 0x02, 0x08, 0x08, 0x06, 0x05, 0x06, 0x06, 0x05, 0x06, 0x03, 0x06, + 0x05, 0x06, 0x03, 0x06, 0x06, 0x05, 0x06, 0x05, 0x08, 0x07, 0x05, 0x05, + 0x07, 0x05, 0x05, 0x06, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x05, + 0x05, 0x02, 0x05, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 0x05, + 0x04, 0x04, 0x05, 0x02, 0x02, 0x04, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, + 0x05, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x07, 0x05, 0x05, 0x07, 0x07, 0x07, 0x05, 0x05, 0x07, 0x07, 0x07, + 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x04, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x04, 0x06, 0x6e, 0x00, 0x00, 0x00, 0xf4, + 0x00, 0x80, 0x00, 0x06, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0d, + 0x00, 0x7e, 0x00, 0xa0, 0x00, 0xac, 0x00, 0xad, 0x00, 0xbf, 0x00, 0xc6, + 0x00, 0xcf, 0x00, 0xe6, 0x00, 0xef, 0x00, 0xfe, 0x01, 0x0f, 0x01, 0x11, + 0x01, 0x25, 0x01, 0x27, 0x01, 0x30, 0x01, 0x53, 0x01, 0x5f, 0x01, 0x67, + 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x8f, 0x01, 0x92, 0x01, 0xa1, 0x01, 0xb0, + 0x01, 0xf0, 0x01, 0xff, 0x02, 0x1b, 0x02, 0x37, 0x02, 0x59, 0x02, 0xbc, + 0x02, 0xc7, 0x02, 0xc9, 0x02, 0xdd, 0x02, 0xf3, 0x03, 0x01, 0x03, 0x03, + 0x03, 0x09, 0x03, 0x0f, 0x03, 0x23, 0x03, 0x8a, 0x03, 0x8c, 0x03, 0x92, + 0x03, 0xa1, 0x03, 0xb0, 0x03, 0xb9, 0x03, 0xc9, 0x03, 0xce, 0x03, 0xd2, + 0x03, 0xd6, 0x04, 0x25, 0x04, 0x2f, 0x04, 0x45, 0x04, 0x4f, 0x04, 0x62, + 0x04, 0x6f, 0x04, 0x79, 0x04, 0x86, 0x04, 0x9f, 0x04, 0xa9, 0x04, 0xb1, + 0x04, 0xba, 0x04, 0xce, 0x04, 0xd7, 0x04, 0xe1, 0x04, 0xf5, 0x05, 0x01, + 0x05, 0x10, 0x05, 0x13, 0x1e, 0x01, 0x1e, 0x3f, 0x1e, 0x85, 0x1e, 0xf1, + 0x1e, 0xf3, 0x1e, 0xf9, 0x1f, 0x4d, 0x20, 0x09, 0x20, 0x0b, 0x20, 0x11, + 0x20, 0x15, 0x20, 0x1e, 0x20, 0x22, 0x20, 0x27, 0x20, 0x30, 0x20, 0x33, + 0x20, 0x3a, 0x20, 0x3c, 0x20, 0x44, 0x20, 0x74, 0x20, 0x7f, 0x20, 0xa4, + 0x20, 0xaa, 0x20, 0xac, 0x20, 0xb1, 0x20, 0xba, 0x20, 0xbd, 0x21, 0x05, + 0x21, 0x13, 0x21, 0x16, 0x21, 0x22, 0x21, 0x26, 0x21, 0x2e, 0x21, 0x5e, + 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, 0x22, 0x12, 0x22, 0x1a, 0x22, 0x1e, + 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x65, 0x25, 0xca, 0xee, 0x02, + 0xf6, 0xc3, 0xfb, 0x04, 0xfe, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x20, 0x00, 0xa0, 0x00, 0xa1, + 0x00, 0xad, 0x00, 0xae, 0x00, 0xc0, 0x00, 0xc7, 0x00, 0xd0, 0x00, 0xe7, + 0x00, 0xf0, 0x00, 0xff, 0x01, 0x10, 0x01, 0x12, 0x01, 0x26, 0x01, 0x28, + 0x01, 0x31, 0x01, 0x54, 0x01, 0x60, 0x01, 0x68, 0x01, 0x7f, 0x01, 0x8f, + 0x01, 0x92, 0x01, 0xa0, 0x01, 0xaf, 0x01, 0xf0, 0x01, 0xfa, 0x02, 0x18, + 0x02, 0x37, 0x02, 0x59, 0x02, 0xbc, 0x02, 0xc6, 0x02, 0xc9, 0x02, 0xd8, + 0x02, 0xf3, 0x03, 0x00, 0x03, 0x03, 0x03, 0x09, 0x03, 0x0f, 0x03, 0x23, + 0x03, 0x84, 0x03, 0x8c, 0x03, 0x8e, 0x03, 0x93, 0x03, 0xa3, 0x03, 0xb1, + 0x03, 0xba, 0x03, 0xca, 0x03, 0xd1, 0x03, 0xd6, 0x04, 0x00, 0x04, 0x26, + 0x04, 0x30, 0x04, 0x46, 0x04, 0x50, 0x04, 0x63, 0x04, 0x70, 0x04, 0x7a, + 0x04, 0x88, 0x04, 0xa0, 0x04, 0xaa, 0x04, 0xb2, 0x04, 0xbb, 0x04, 0xcf, + 0x04, 0xd8, 0x04, 0xe2, 0x04, 0xf6, 0x05, 0x02, 0x05, 0x11, 0x1e, 0x00, + 0x1e, 0x3e, 0x1e, 0x80, 0x1e, 0xa0, 0x1e, 0xf2, 0x1e, 0xf4, 0x1f, 0x4d, + 0x20, 0x00, 0x20, 0x0a, 0x20, 0x10, 0x20, 0x13, 0x20, 0x17, 0x20, 0x20, + 0x20, 0x25, 0x20, 0x30, 0x20, 0x32, 0x20, 0x39, 0x20, 0x3c, 0x20, 0x44, + 0x20, 0x74, 0x20, 0x7f, 0x20, 0xa3, 0x20, 0xa6, 0x20, 0xab, 0x20, 0xb1, + 0x20, 0xb9, 0x20, 0xbc, 0x21, 0x05, 0x21, 0x13, 0x21, 0x16, 0x21, 0x22, + 0x21, 0x26, 0x21, 0x2e, 0x21, 0x5b, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, + 0x22, 0x11, 0x22, 0x1a, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, + 0x22, 0x64, 0x25, 0xca, 0xee, 0x01, 0xf6, 0xc3, 0xfb, 0x01, 0xfe, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0xff, 0xf6, 0xff, 0xe4, + 0x01, 0xd8, 0xff, 0xc2, 0x01, 0xcc, 0xff, 0xc1, 0x00, 0x00, 0x01, 0xbf, + 0x00, 0x00, 0x01, 0xba, 0x00, 0x00, 0x01, 0xb6, 0x00, 0x00, 0x01, 0xb4, + 0x00, 0x00, 0x01, 0xb2, 0x00, 0x00, 0x01, 0xaa, 0x00, 0x00, 0x01, 0xac, + 0xff, 0x16, 0xff, 0x07, 0xff, 0x05, 0xfe, 0xf8, 0xfe, 0xeb, 0x01, 0xee, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x65, 0xfe, 0x44, 0x01, 0x23, 0xfd, 0xd8, + 0xfd, 0xd7, 0xfd, 0xc9, 0xfd, 0xb4, 0xfd, 0xa8, 0xfd, 0xa7, 0xfd, 0xa2, + 0xfd, 0x9d, 0xfd, 0x8a, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xfd, 0x00, 0x00, + 0x00, 0x00, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xde, 0xfc, 0xfe, 0xfc, 0xfb, + 0x00, 0x00, 0xfc, 0xba, 0x00, 0x00, 0xfc, 0xb2, 0x00, 0x00, 0xfc, 0xa7, + 0x00, 0x00, 0xfc, 0xa1, 0x00, 0x00, 0xfc, 0x99, 0x00, 0x00, 0xfc, 0x91, + 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xfc, 0x5e, + 0x00, 0x00, 0xe5, 0xe2, 0xe5, 0xa2, 0xe5, 0x53, 0xe5, 0x7e, 0xe4, 0xe7, + 0xe5, 0x7c, 0xe5, 0x7d, 0xe1, 0x72, 0xe1, 0x73, 0xe1, 0x6f, 0x00, 0x00, + 0xe1, 0x6c, 0xe1, 0x6b, 0xe1, 0x69, 0xe1, 0x61, 0xe3, 0xa9, 0xe1, 0x59, + 0xe3, 0xa1, 0xe1, 0x50, 0xe1, 0x21, 0xe1, 0x17, 0x00, 0x00, 0xe0, 0xf2, + 0x00, 0x00, 0xe0, 0xed, 0xe0, 0xe6, 0xe0, 0xe5, 0xe0, 0x9e, 0xe0, 0x91, + 0xe0, 0x8f, 0xe0, 0x84, 0xdf, 0x94, 0xe0, 0x79, 0xe0, 0x4d, 0xdf, 0xaa, + 0xde, 0xac, 0xdf, 0x9e, 0xdf, 0x9d, 0xdf, 0x96, 0xdf, 0x93, 0xdf, 0x87, + 0xdf, 0x6b, 0xdf, 0x54, 0xdf, 0x51, 0xdb, 0xed, 0x13, 0xb7, 0x0a, 0xf7, + 0x06, 0xbb, 0x02, 0xc3, 0x01, 0xc7, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe4, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, + 0x01, 0x32, 0x00, 0x00, 0x01, 0x32, 0x00, 0x00, 0x01, 0x32, 0x00, 0x00, + 0x01, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x74, 0x01, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6c, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x74, 0x01, 0x90, 0x00, 0x00, 0x01, 0xa8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, + 0x02, 0x30, 0x00, 0x00, 0x02, 0x52, 0x00, 0x00, 0x02, 0x62, 0x00, 0x00, + 0x02, 0x8e, 0x00, 0x00, 0x02, 0x9a, 0x00, 0x00, 0x02, 0xbe, 0x00, 0x00, + 0x02, 0xce, 0x00, 0x00, 0x02, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0xc2, 0x00, 0x00, 0x02, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, + 0x00, 0x81, 0x02, 0x7b, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, 0x02, 0x92, + 0x02, 0x93, 0x02, 0x94, 0x00, 0x82, 0x00, 0x83, 0x02, 0x95, 0x02, 0x96, + 0x02, 0x97, 0x02, 0x98, 0x02, 0x99, 0x00, 0x84, 0x00, 0x85, 0x02, 0x9a, + 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x00, 0x86, + 0x00, 0x87, 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, + 0x02, 0xaf, 0x00, 0x88, 0x00, 0x89, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, + 0x02, 0xb3, 0x02, 0xb4, 0x00, 0x8a, 0x02, 0x7a, 0x00, 0x8b, 0x00, 0x8c, + 0x02, 0x7c, 0x00, 0x8d, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, + 0x02, 0xe7, 0x02, 0xe8, 0x00, 0x8e, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, + 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x00, 0x8f, + 0x00, 0x90, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, + 0x02, 0xf6, 0x02, 0xf7, 0x00, 0x91, 0x00, 0x92, 0x02, 0xf8, 0x02, 0xf9, + 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x00, 0x93, 0x00, 0x94, + 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, + 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x85, 0x02, 0xa0, 0x03, 0x2b, 0x03, 0x2c, + 0x03, 0x2d, 0x03, 0x2e, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0e, 0x03, 0x0f, + 0x00, 0xae, 0x00, 0xaf, 0x03, 0x86, 0x00, 0xb0, 0x03, 0x87, 0x03, 0x88, + 0x03, 0x89, 0x00, 0xb1, 0x00, 0xb2, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, + 0x00, 0xb3, 0x03, 0x93, 0x03, 0x94, 0x00, 0xb4, 0x03, 0x95, 0x03, 0x96, + 0x00, 0xb5, 0x03, 0x97, 0x00, 0xb6, 0x03, 0x98, 0x00, 0xb7, 0x03, 0x99, + 0x03, 0x9a, 0x00, 0xb8, 0x03, 0x9b, 0x00, 0xb9, 0x00, 0xba, 0x03, 0x9c, + 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, + 0x03, 0xa3, 0x00, 0xc4, 0x03, 0xa5, 0x03, 0xa6, 0x00, 0xc5, 0x03, 0xa4, + 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, + 0x00, 0xcc, 0x03, 0xa7, 0x00, 0xcd, 0x00, 0xce, 0x03, 0xe4, 0x03, 0xad, + 0x00, 0xd2, 0x03, 0xae, 0x00, 0xd3, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, + 0x03, 0xb2, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x03, 0xb4, 0x03, 0xe5, + 0x03, 0xb5, 0x00, 0xd7, 0x03, 0xb6, 0x00, 0xd8, 0x03, 0xb7, 0x03, 0xb8, + 0x00, 0xd9, 0x03, 0xb9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x03, 0xba, + 0x03, 0xb3, 0x00, 0xdd, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, + 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, 0x00, 0xde, 0x00, 0xdf, 0x03, 0xc2, + 0x03, 0xc3, 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x03, 0xc4, + 0x00, 0xee, 0x00, 0xef, 0x00, 0xf0, 0x03, 0xc5, 0x00, 0xf1, 0x00, 0xf2, + 0x00, 0xf3, 0x00, 0xf4, 0x03, 0xc6, 0x00, 0xf5, 0x03, 0xc7, 0x03, 0xc8, + 0x00, 0xf6, 0x03, 0xc9, 0x00, 0xf7, 0x03, 0xca, 0x03, 0xe6, 0x03, 0xcb, + 0x01, 0x02, 0x03, 0xcc, 0x01, 0x03, 0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, + 0x03, 0xd0, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x03, 0xd1, 0x03, 0xe7, + 0x03, 0xd2, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x04, 0x81, 0x03, 0xe8, + 0x03, 0xe9, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x03, 0xea, + 0x03, 0xeb, 0x03, 0xed, 0x03, 0xec, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, + 0x01, 0x2b, 0x04, 0x80, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, 0x01, 0x2f, + 0x01, 0x30, 0x04, 0x82, 0x04, 0x83, 0x01, 0x31, 0x01, 0x32, 0x01, 0x33, + 0x01, 0x34, 0x03, 0xee, 0x03, 0xef, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, + 0x01, 0x38, 0x04, 0x84, 0x04, 0x85, 0x03, 0xf0, 0x03, 0xf1, 0x04, 0x77, + 0x04, 0x78, 0x03, 0xf2, 0x03, 0xf3, 0x04, 0x86, 0x04, 0x87, 0x04, 0x7f, + 0x01, 0x4c, 0x01, 0x4d, 0x04, 0x7d, 0x04, 0x7e, 0x03, 0xf4, 0x03, 0xf5, + 0x03, 0xf6, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, + 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x04, 0x79, 0x04, 0x7a, 0x01, 0x56, + 0x01, 0x57, 0x01, 0x58, 0x04, 0x01, 0x04, 0x00, 0x04, 0x02, 0x04, 0x03, + 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x01, 0x59, 0x01, 0x5a, 0x04, 0x7b, + 0x04, 0x7c, 0x04, 0x1b, 0x04, 0x1c, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, + 0x01, 0x5e, 0x04, 0x88, 0x04, 0x89, 0x01, 0x5f, 0x04, 0x1d, 0x04, 0x8a, + 0x01, 0x6f, 0x01, 0x70, 0x01, 0x81, 0x01, 0x82, 0x04, 0x8c, 0x04, 0x8b, + 0x01, 0x97, 0x04, 0x76, 0x01, 0x9d, 0x00, 0x00, 0xb0, 0x00, 0x2c, 0x4b, + 0xb0, 0x09, 0x50, 0x58, 0xb1, 0x01, 0x01, 0x8e, 0x59, 0xb8, 0x01, 0xff, + 0x85, 0xb0, 0x44, 0x1d, 0xb1, 0x09, 0x03, 0x5f, 0x5e, 0x2d, 0xb0, 0x01, + 0x2c, 0x20, 0x20, 0x45, 0x69, 0x44, 0xb0, 0x01, 0x60, 0x2d, 0xb0, 0x02, + 0x2c, 0xb0, 0x01, 0x2a, 0x21, 0x2d, 0xb0, 0x03, 0x2c, 0x20, 0x46, 0xb0, + 0x03, 0x25, 0x46, 0x52, 0x58, 0x23, 0x59, 0x20, 0x8a, 0x20, 0x8a, 0x49, + 0x64, 0x8a, 0x20, 0x46, 0x20, 0x68, 0x61, 0x64, 0xb0, 0x04, 0x25, 0x46, + 0x20, 0x68, 0x61, 0x64, 0x52, 0x58, 0x23, 0x65, 0x8a, 0x59, 0x2f, 0x20, + 0xb0, 0x00, 0x53, 0x58, 0x69, 0x20, 0xb0, 0x00, 0x54, 0x58, 0x21, 0xb0, + 0x40, 0x59, 0x1b, 0x69, 0x20, 0xb0, 0x00, 0x54, 0x58, 0x21, 0xb0, 0x40, + 0x65, 0x59, 0x59, 0x3a, 0x2d, 0xb0, 0x04, 0x2c, 0x20, 0x46, 0xb0, 0x04, + 0x25, 0x46, 0x52, 0x58, 0x23, 0x8a, 0x59, 0x20, 0x46, 0x20, 0x6a, 0x61, + 0x64, 0xb0, 0x04, 0x25, 0x46, 0x20, 0x6a, 0x61, 0x64, 0x52, 0x58, 0x23, + 0x8a, 0x59, 0x2f, 0xfd, 0x2d, 0xb0, 0x05, 0x2c, 0x4b, 0x20, 0xb0, 0x03, + 0x26, 0x50, 0x58, 0x51, 0x58, 0xb0, 0x80, 0x44, 0x1b, 0xb0, 0x40, 0x44, + 0x59, 0x1b, 0x21, 0x21, 0x20, 0x45, 0xb0, 0xc0, 0x50, 0x58, 0xb0, 0xc0, + 0x44, 0x1b, 0x21, 0x59, 0x59, 0x2d, 0xb0, 0x06, 0x2c, 0x20, 0x20, 0x45, + 0x69, 0x44, 0xb0, 0x01, 0x60, 0x20, 0x20, 0x45, 0x7d, 0x69, 0x18, 0x44, + 0xb0, 0x01, 0x60, 0x2d, 0xb0, 0x07, 0x2c, 0xb0, 0x06, 0x2a, 0x2d, 0xb0, + 0x08, 0x2c, 0x4b, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, 0xb0, 0x40, 0x1b, + 0xb0, 0x00, 0x59, 0x8a, 0x8a, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, 0x23, + 0x21, 0xb0, 0x80, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, 0xb0, 0x03, + 0x26, 0x53, 0x58, 0x23, 0x21, 0xb0, 0xc0, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, + 0x59, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, 0x23, 0x21, 0xb8, 0x01, 0x00, + 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, + 0x23, 0x21, 0xb8, 0x01, 0x40, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, + 0xb0, 0x03, 0x26, 0x53, 0x58, 0xb0, 0x03, 0x25, 0x45, 0xb8, 0x01, 0x80, + 0x50, 0x58, 0x23, 0x21, 0xb8, 0x01, 0x80, 0x23, 0x21, 0x1b, 0xb0, 0x03, + 0x25, 0x45, 0x23, 0x21, 0x23, 0x21, 0x59, 0x1b, 0x21, 0x59, 0x44, 0x2d, + 0xb0, 0x09, 0x2c, 0x4b, 0x53, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21, 0x59, + 0x2d, 0xb0, 0x0a, 0x2c, 0xb0, 0x22, 0x45, 0x2d, 0xb0, 0x0b, 0x2c, 0xb0, + 0x23, 0x45, 0x2d, 0xb0, 0x0c, 0x2c, 0xb1, 0x27, 0x01, 0x88, 0x20, 0x8a, + 0x53, 0x58, 0xb9, 0x40, 0x00, 0x04, 0x00, 0x63, 0xb8, 0x08, 0x00, 0x88, + 0x54, 0x58, 0xb9, 0x00, 0x22, 0x03, 0xe8, 0x70, 0x59, 0x1b, 0xb0, 0x23, + 0x53, 0x58, 0xb0, 0x20, 0x88, 0xb8, 0x10, 0x00, 0x54, 0x58, 0xb9, 0x00, + 0x22, 0x03, 0xe8, 0x70, 0x59, 0x59, 0x59, 0x2d, 0xb0, 0x0d, 0x2c, 0xb0, + 0x40, 0x88, 0xb8, 0x20, 0x00, 0x5a, 0x58, 0xb1, 0x23, 0x00, 0x44, 0x1b, + 0xb9, 0x00, 0x23, 0x03, 0xe8, 0x44, 0x59, 0x2d, 0xb0, 0x0c, 0x2b, 0xb0, + 0x00, 0x2b, 0x00, 0xb2, 0x01, 0x0b, 0x02, 0x2b, 0x00, 0xb7, 0x01, 0x31, + 0x28, 0x1f, 0x16, 0x0e, 0x00, 0x08, 0x2b, 0xb7, 0x02, 0x44, 0x3a, 0x2c, + 0x20, 0x12, 0x00, 0x08, 0x2b, 0xb7, 0x03, 0x31, 0x28, 0x1f, 0x16, 0x0e, + 0x00, 0x08, 0x2b, 0xb7, 0x04, 0x91, 0x77, 0x5c, 0x3a, 0x23, 0x00, 0x08, + 0x2b, 0xb7, 0x05, 0x76, 0x60, 0x4b, 0x36, 0x1d, 0x00, 0x08, 0x2b, 0xb7, + 0x06, 0x25, 0x1f, 0x18, 0x11, 0x0b, 0x00, 0x08, 0x2b, 0xb7, 0x07, 0x42, + 0x36, 0x2a, 0x1e, 0x12, 0x00, 0x08, 0x2b, 0xb7, 0x08, 0x3a, 0x2f, 0x22, + 0x18, 0x0f, 0x00, 0x08, 0x2b, 0xb7, 0x09, 0x36, 0x2c, 0x22, 0x18, 0x0f, + 0x00, 0x08, 0x2b, 0xb7, 0x0a, 0x5b, 0x4b, 0x3a, 0x2a, 0x19, 0x00, 0x08, + 0x2b, 0xb7, 0x0b, 0xfb, 0xcd, 0xa0, 0x72, 0x45, 0x00, 0x08, 0x2b, 0x00, + 0xb2, 0x0c, 0x0b, 0x07, 0x2b, 0xb0, 0x00, 0x20, 0x45, 0x7d, 0x69, 0x18, + 0x44, 0xb2, 0x30, 0x0e, 0x01, 0x73, 0xb2, 0xb0, 0x10, 0x01, 0x73, 0xb2, + 0x50, 0x10, 0x01, 0x74, 0xb2, 0x80, 0x10, 0x01, 0x74, 0xb2, 0x70, 0x10, + 0x01, 0x75, 0xb2, 0x3f, 0x14, 0x01, 0x73, 0xb2, 0x5f, 0x14, 0x01, 0x73, + 0xb2, 0x7f, 0x14, 0x01, 0x73, 0xb2, 0x2f, 0x14, 0x01, 0x74, 0xb2, 0x4f, + 0x14, 0x01, 0x74, 0xb2, 0x6f, 0x14, 0x01, 0x74, 0xb2, 0x8f, 0x14, 0x01, + 0x74, 0xb2, 0xaf, 0x14, 0x01, 0x74, 0xb2, 0xff, 0x14, 0x01, 0x74, 0xb2, + 0x1f, 0x14, 0x01, 0x75, 0xb2, 0x3f, 0x14, 0x01, 0x75, 0xb2, 0x5f, 0x14, + 0x01, 0x75, 0xb2, 0x7f, 0x14, 0x01, 0x75, 0xb2, 0x0f, 0x18, 0x01, 0x73, + 0xb2, 0x6f, 0x18, 0x01, 0x75, 0xb2, 0x7f, 0x18, 0x01, 0x73, 0xb2, 0xef, + 0x18, 0x01, 0x73, 0xb2, 0x1f, 0x18, 0x01, 0x74, 0xb2, 0x5f, 0x18, 0x01, + 0x74, 0xb2, 0x8f, 0x18, 0x01, 0x74, 0xb2, 0xcf, 0x18, 0x01, 0x74, 0xb2, + 0xff, 0x18, 0x01, 0x74, 0xb2, 0x3f, 0x18, 0x01, 0x75, 0xb2, 0x2f, 0x1a, + 0x01, 0x73, 0xb2, 0x6f, 0x1a, 0x01, 0x73, 0xb2, 0x2f, 0x20, 0x01, 0x73, + 0xb2, 0x3f, 0x20, 0x01, 0x73, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0xe9, + 0x00, 0xa4, 0x00, 0xfe, 0x00, 0x4e, 0x00, 0x60, 0x01, 0x31, 0x00, 0xac, + 0x00, 0xc5, 0x00, 0xd4, 0x00, 0x7c, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x14, + 0xfe, 0x60, 0x00, 0x14, 0x02, 0x9b, 0x00, 0x20, 0x03, 0x21, 0x00, 0x0b, + 0x04, 0x3a, 0x00, 0x14, 0x04, 0x8d, 0x00, 0x10, 0x05, 0xb0, 0x00, 0x14, + 0x06, 0x18, 0x00, 0x15, 0x01, 0xa6, 0x00, 0x11, 0x06, 0xc0, 0x00, 0x0e, + 0x06, 0xdf, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x00, 0xa2, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x00, 0x5e, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x0c, + 0x00, 0x5e, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x08, + 0x00, 0x6a, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x16, + 0x00, 0x72, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x16, + 0x00, 0x72, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x26, + 0x00, 0x88, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x16, + 0x00, 0xae, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x07, 0x00, 0x40, + 0x00, 0xc4, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x09, 0x00, 0x0c, + 0x01, 0x04, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x14, + 0x01, 0x10, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0c, 0x00, 0x26, + 0x01, 0x24, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0d, 0x00, 0x5c, + 0x01, 0x4a, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0e, 0x00, 0x54, + 0x01, 0xa6, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, + 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x32, + 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6f, + 0x00, 0x6f, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x49, + 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6c, + 0x00, 0x6c, 0x00, 0x20, 0x00, 0x52, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, + 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, + 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2e, + 0x00, 0x52, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, + 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x52, 0x00, 0x6f, + 0x00, 0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x42, + 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, + 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x32, + 0x00, 0x2e, 0x00, 0x31, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x20, + 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x37, 0x00, 0x52, 0x00, 0x6f, + 0x00, 0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x2d, 0x00, 0x42, + 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x52, 0x00, 0x6f, 0x00, 0x62, + 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, + 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, + 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, + 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6f, + 0x00, 0x6f, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x47, + 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x47, + 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x2e, + 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x43, 0x00, 0x68, 0x00, 0x72, + 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6e, + 0x00, 0x20, 0x00, 0x52, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, + 0x00, 0x74, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x4c, 0x00, 0x69, + 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, + 0x00, 0x20, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, + 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x41, + 0x00, 0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, + 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, + 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, + 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x32, + 0x00, 0x2e, 0x00, 0x30, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, + 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, + 0x00, 0x2e, 0x00, 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, + 0x00, 0x65, 0x00, 0x2e, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2f, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, + 0x00, 0x65, 0x00, 0x73, 0x00, 0x2f, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x43, + 0x00, 0x45, 0x00, 0x4e, 0x00, 0x53, 0x00, 0x45, 0x00, 0x2d, 0x00, 0x32, + 0x00, 0x2e, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x6a, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0xff, 0xff, 0x00, 0x0f, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x28, 0x00, 0x02, 0x00, 0x59, 0x00, 0x25, 0x00, 0x3e, 0x00, 0x01, + 0x00, 0x45, 0x00, 0x5e, 0x00, 0x01, 0x00, 0x79, 0x00, 0x79, 0x00, 0x01, + 0x00, 0x81, 0x00, 0x81, 0x00, 0x01, 0x00, 0x83, 0x00, 0x83, 0x00, 0x01, + 0x00, 0x86, 0x00, 0x86, 0x00, 0x01, 0x00, 0x89, 0x00, 0x89, 0x00, 0x01, + 0x00, 0x8b, 0x00, 0x96, 0x00, 0x01, 0x00, 0x98, 0x00, 0x9d, 0x00, 0x01, + 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x01, 0x00, 0xa8, 0x00, 0xad, 0x00, 0x03, + 0x00, 0xb1, 0x00, 0xb1, 0x00, 0x01, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x01, + 0x00, 0xbf, 0x00, 0xbf, 0x00, 0x01, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0x01, + 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x01, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x01, + 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x01, 0x00, 0xcd, 0x00, 0xce, 0x00, 0x01, + 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x01, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0x01, + 0x00, 0xda, 0x00, 0xde, 0x00, 0x01, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0x01, + 0x00, 0xe5, 0x00, 0xe5, 0x00, 0x01, 0x00, 0xe7, 0x00, 0xe9, 0x00, 0x01, + 0x00, 0xeb, 0x00, 0xfb, 0x00, 0x01, 0x00, 0xfd, 0x00, 0xfd, 0x00, 0x01, + 0x00, 0xff, 0x01, 0x01, 0x00, 0x01, 0x01, 0x03, 0x01, 0x03, 0x00, 0x01, + 0x01, 0x08, 0x01, 0x09, 0x00, 0x01, 0x01, 0x16, 0x01, 0x1a, 0x00, 0x01, + 0x01, 0x1c, 0x01, 0x1c, 0x00, 0x01, 0x01, 0x20, 0x01, 0x22, 0x00, 0x01, + 0x01, 0x24, 0x01, 0x25, 0x00, 0x03, 0x01, 0x2a, 0x01, 0x2b, 0x00, 0x01, + 0x01, 0x33, 0x01, 0x34, 0x00, 0x01, 0x01, 0x36, 0x01, 0x36, 0x00, 0x01, + 0x01, 0x3b, 0x01, 0x3c, 0x00, 0x01, 0x01, 0x41, 0x01, 0x44, 0x00, 0x01, + 0x01, 0x47, 0x01, 0x48, 0x00, 0x01, 0x01, 0x4b, 0x01, 0x4d, 0x00, 0x01, + 0x01, 0x51, 0x01, 0x51, 0x00, 0x01, 0x01, 0x54, 0x01, 0x58, 0x00, 0x01, + 0x01, 0x5d, 0x01, 0x5e, 0x00, 0x01, 0x01, 0x62, 0x01, 0x62, 0x00, 0x01, + 0x01, 0x64, 0x01, 0x64, 0x00, 0x01, 0x01, 0x68, 0x01, 0x68, 0x00, 0x01, + 0x01, 0x6a, 0x01, 0x6c, 0x00, 0x01, 0x01, 0x6e, 0x01, 0x6e, 0x00, 0x01, + 0x01, 0x70, 0x01, 0x70, 0x00, 0x01, 0x01, 0xba, 0x01, 0xba, 0x00, 0x03, + 0x01, 0xbb, 0x01, 0xc1, 0x00, 0x02, 0x01, 0xd2, 0x01, 0xe6, 0x00, 0x01, + 0x01, 0xea, 0x01, 0xea, 0x00, 0x01, 0x01, 0xf3, 0x01, 0xf3, 0x00, 0x01, + 0x01, 0xf5, 0x01, 0xf5, 0x00, 0x01, 0x01, 0xfc, 0x01, 0xfe, 0x00, 0x01, + 0x02, 0x00, 0x02, 0x01, 0x00, 0x01, 0x02, 0x03, 0x02, 0x03, 0x00, 0x01, + 0x02, 0x07, 0x02, 0x07, 0x00, 0x01, 0x02, 0x09, 0x02, 0x0b, 0x00, 0x01, + 0x02, 0x11, 0x02, 0x11, 0x00, 0x01, 0x02, 0x16, 0x02, 0x18, 0x00, 0x01, + 0x02, 0x1a, 0x02, 0x1a, 0x00, 0x01, 0x02, 0x28, 0x02, 0x28, 0x00, 0x01, + 0x02, 0x2b, 0x02, 0x2b, 0x00, 0x01, 0x02, 0x2d, 0x02, 0x2d, 0x00, 0x01, + 0x02, 0x30, 0x02, 0x33, 0x00, 0x01, 0x02, 0x5f, 0x02, 0x63, 0x00, 0x01, + 0x02, 0x7a, 0x02, 0xe2, 0x00, 0x01, 0x02, 0xe5, 0x03, 0x8b, 0x00, 0x01, + 0x03, 0x8d, 0x03, 0xa4, 0x00, 0x01, 0x03, 0xa6, 0x03, 0xb2, 0x00, 0x01, + 0x03, 0xb4, 0x03, 0xbd, 0x00, 0x01, 0x03, 0xbf, 0x03, 0xda, 0x00, 0x01, + 0x03, 0xde, 0x03, 0xde, 0x00, 0x01, 0x03, 0xe0, 0x03, 0xe7, 0x00, 0x01, + 0x03, 0xe9, 0x03, 0xeb, 0x00, 0x01, 0x03, 0xee, 0x03, 0xf2, 0x00, 0x01, + 0x03, 0xf4, 0x04, 0x7c, 0x00, 0x01, 0x04, 0x7f, 0x04, 0x7f, 0x00, 0x01, + 0x04, 0x82, 0x04, 0x83, 0x00, 0x01, 0x04, 0x85, 0x04, 0x86, 0x00, 0x01, + 0x04, 0x88, 0x04, 0x8b, 0x00, 0x01, 0x04, 0x95, 0x04, 0xd0, 0x00, 0x01, + 0x04, 0xd2, 0x04, 0xf1, 0x00, 0x01, 0x04, 0xf3, 0x04, 0xfa, 0x00, 0x01, + 0x04, 0xfc, 0x04, 0xfd, 0x00, 0x01, 0x05, 0x07, 0x05, 0x0d, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x2c, + 0x00, 0x01, 0x00, 0x0e, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xa9, + 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xab, 0x00, 0xac, 0x00, 0xac, + 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x79, 0x00, 0xa4, 0x00, 0xad, 0x00, 0xad, 0x01, 0xba, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x04, + 0x44, 0x46, 0x4c, 0x54, 0x00, 0x1a, 0x63, 0x79, 0x72, 0x6c, 0x00, 0x1a, + 0x67, 0x72, 0x65, 0x6b, 0x00, 0x1a, 0x6c, 0x61, 0x74, 0x6e, 0x00, 0x1a, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x63, 0x70, 0x73, 0x70, 0x00, 0x0e, 0x6b, 0x65, + 0x72, 0x6e, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x06, 0x02, 0x10, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x05, + 0x00, 0x24, 0x00, 0x48, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x08, 0x00, 0x0a, + 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, + 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x26, + 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, + 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, + 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, + 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, + 0x00, 0x65, 0x00, 0x67, 0x00, 0x81, 0x00, 0x83, 0x00, 0x84, 0x00, 0x8c, + 0x00, 0x8f, 0x00, 0x91, 0x00, 0x93, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, + 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, + 0x00, 0xba, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, + 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, + 0x00, 0xdd, 0x00, 0xde, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, + 0x00, 0xe3, 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, + 0x00, 0xe9, 0x01, 0x2f, 0x01, 0x33, 0x01, 0x35, 0x01, 0x37, 0x01, 0x39, + 0x01, 0x3b, 0x01, 0x41, 0x01, 0x43, 0x01, 0x45, 0x01, 0x49, 0x01, 0x4b, + 0x01, 0x4c, 0x01, 0x58, 0x01, 0x59, 0x01, 0x97, 0x01, 0x9d, 0x01, 0xa2, + 0x01, 0xa5, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7d, 0x02, 0x7f, 0x02, 0x80, + 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, 0x02, 0x85, 0x02, 0x86, + 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x8c, + 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, 0x02, 0x92, + 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, 0x98, + 0x02, 0x99, 0x02, 0xb6, 0x02, 0xb8, 0x02, 0xba, 0x02, 0xbc, 0x02, 0xbe, + 0x02, 0xc0, 0x02, 0xc2, 0x02, 0xc4, 0x02, 0xc6, 0x02, 0xc8, 0x02, 0xca, + 0x02, 0xcc, 0x02, 0xce, 0x02, 0xd0, 0x02, 0xd2, 0x02, 0xd4, 0x02, 0xd6, + 0x02, 0xd8, 0x02, 0xda, 0x02, 0xdc, 0x02, 0xde, 0x02, 0xe0, 0x02, 0xe2, + 0x02, 0xe3, 0x02, 0xe5, 0x02, 0xe7, 0x02, 0xe9, 0x02, 0xeb, 0x02, 0xed, + 0x02, 0xef, 0x02, 0xf1, 0x02, 0xf3, 0x02, 0xf5, 0x02, 0xf8, 0x02, 0xfa, + 0x02, 0xfc, 0x02, 0xfe, 0x03, 0x00, 0x03, 0x02, 0x03, 0x04, 0x03, 0x06, + 0x03, 0x08, 0x03, 0x0a, 0x03, 0x0c, 0x03, 0x0e, 0x03, 0x10, 0x03, 0x12, + 0x03, 0x14, 0x03, 0x16, 0x03, 0x18, 0x03, 0x1a, 0x03, 0x1c, 0x03, 0x1e, + 0x03, 0x20, 0x03, 0x22, 0x03, 0x24, 0x03, 0x25, 0x03, 0x27, 0x03, 0x29, + 0x03, 0x2b, 0x03, 0x2d, 0x03, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, + 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x8c, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, + 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, + 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9c, + 0x03, 0x9d, 0x03, 0xad, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, + 0x03, 0xb2, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, + 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, + 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xd3, + 0x03, 0xd5, 0x03, 0xd7, 0x03, 0xd9, 0x03, 0xee, 0x03, 0xf0, 0x03, 0xf2, + 0x04, 0x07, 0x04, 0x0d, 0x04, 0x13, 0x04, 0x7d, 0x04, 0x82, 0x04, 0x86, + 0x05, 0x07, 0x05, 0x09, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, + 0x41, 0x7a, 0x00, 0x01, 0x03, 0xee, 0x00, 0x04, 0x00, 0x00, 0x01, 0xf2, + 0x07, 0xd0, 0x3c, 0x18, 0x3c, 0x18, 0x07, 0xfe, 0x08, 0x60, 0x3e, 0x50, + 0x3f, 0x08, 0x3c, 0x1e, 0x41, 0x2e, 0x3e, 0xd4, 0x08, 0x66, 0x3f, 0x76, + 0x3f, 0x76, 0x3f, 0x12, 0x3f, 0x60, 0x3f, 0x76, 0x3f, 0x76, 0x41, 0x2e, + 0x3f, 0xa2, 0x0c, 0x04, 0x0c, 0xd2, 0x3f, 0xec, 0x40, 0xbe, 0x40, 0xf6, + 0x3c, 0x30, 0x3d, 0xda, 0x41, 0x14, 0x0d, 0x48, 0x3e, 0xb2, 0x3f, 0xc0, + 0x3c, 0xda, 0x0d, 0x8e, 0x0e, 0xc4, 0x0e, 0xce, 0x3f, 0x98, 0x3f, 0x98, + 0x3e, 0xe2, 0x3f, 0xc0, 0x3f, 0xda, 0x0f, 0xd0, 0x40, 0xdc, 0x10, 0x36, + 0x3c, 0x8a, 0x40, 0xdc, 0x10, 0x50, 0x3f, 0xc0, 0x41, 0x2e, 0x10, 0x96, + 0x3d, 0x18, 0x3e, 0x50, 0x41, 0x2e, 0x3e, 0x50, 0x11, 0x18, 0x12, 0x16, + 0x13, 0x18, 0x13, 0xfa, 0x14, 0x9c, 0x40, 0xdc, 0x14, 0xa2, 0x3f, 0x98, + 0x17, 0x88, 0x19, 0x7a, 0x1a, 0x98, 0x1a, 0xb2, 0x1a, 0xb8, 0x1a, 0xbe, + 0x1d, 0xb8, 0x1d, 0xbe, 0x1d, 0xf8, 0x1e, 0x2e, 0x1e, 0xb8, 0x20, 0x42, + 0x22, 0x0c, 0x23, 0xe2, 0x3f, 0x76, 0x25, 0x30, 0x26, 0xda, 0x3c, 0x30, + 0x29, 0x3c, 0x3f, 0x76, 0x3f, 0x76, 0x3c, 0x90, 0x3f, 0x76, 0x3f, 0x76, + 0x3f, 0x76, 0x2a, 0x12, 0x2b, 0xc0, 0x3f, 0x76, 0x3c, 0xee, 0x2c, 0xaa, + 0x2d, 0x70, 0x2e, 0x02, 0x2e, 0x64, 0x2f, 0x4a, 0x3c, 0xe4, 0x2f, 0xdc, + 0x3c, 0x8a, 0x30, 0xb2, 0x30, 0xdc, 0x32, 0xb6, 0x3f, 0xc0, 0x36, 0x40, + 0x36, 0x7e, 0x37, 0xbc, 0x39, 0x8a, 0x3f, 0xc0, 0x38, 0x46, 0x38, 0xd4, + 0x38, 0xfe, 0x39, 0x54, 0x39, 0x8a, 0x3e, 0x50, 0x3e, 0xe2, 0x40, 0xbe, + 0x40, 0xdc, 0x39, 0xb0, 0x3f, 0xc0, 0x3d, 0x18, 0x3c, 0xe4, 0x3c, 0x30, + 0x3c, 0x8a, 0x3f, 0x12, 0x3f, 0x12, 0x3f, 0x12, 0x3f, 0x76, 0x3c, 0x30, + 0x3c, 0x8a, 0x3f, 0x76, 0x3f, 0x76, 0x41, 0x2e, 0x3c, 0xe4, 0x3c, 0x30, + 0x3c, 0x8a, 0x3c, 0x18, 0x39, 0xda, 0x3c, 0x18, 0x3c, 0x18, 0x3c, 0x18, + 0x41, 0x6a, 0x3b, 0x64, 0x3b, 0xb2, 0x41, 0x64, 0x3c, 0x0e, 0x41, 0x4c, + 0x41, 0x52, 0x41, 0x64, 0x41, 0x52, 0x41, 0x4c, 0x41, 0x4c, 0x41, 0x4c, + 0x41, 0x4c, 0x3c, 0x00, 0x41, 0x52, 0x3c, 0x1e, 0x41, 0x2e, 0x41, 0x2e, + 0x41, 0x2e, 0x41, 0x2e, 0x3f, 0xec, 0x3e, 0x50, 0x3e, 0x50, 0x3e, 0x50, + 0x3e, 0x50, 0x3e, 0x50, 0x3e, 0x50, 0x3e, 0x50, 0x3c, 0x1e, 0x3e, 0xd4, + 0x3e, 0xd4, 0x3e, 0xd4, 0x3e, 0xd4, 0x3f, 0x76, 0x3f, 0x76, 0x3f, 0x76, + 0x3f, 0x76, 0x3f, 0x76, 0x41, 0x2e, 0x41, 0x2e, 0x41, 0x2e, 0x41, 0x2e, + 0x41, 0x2e, 0x3d, 0xda, 0x3e, 0xb2, 0x3e, 0xb2, 0x3e, 0xb2, 0x3e, 0xb2, + 0x3e, 0xb2, 0x3e, 0xb2, 0x3e, 0xb2, 0x3c, 0xda, 0x3c, 0xda, 0x3c, 0xda, + 0x3c, 0xda, 0x3f, 0x98, 0x3e, 0xe2, 0x3e, 0xe2, 0x3e, 0xe2, 0x3e, 0xe2, + 0x3e, 0xe2, 0x40, 0xdc, 0x40, 0xdc, 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0x50, + 0x3e, 0xb2, 0x3e, 0x50, 0x3e, 0xb2, 0x3c, 0x1e, 0x3c, 0x1e, 0x3c, 0x1e, + 0x3c, 0x1e, 0x41, 0x2e, 0x3e, 0xd4, 0x3c, 0xda, 0x3e, 0xd4, 0x3c, 0xda, + 0x3e, 0xd4, 0x3c, 0xda, 0x3e, 0xd4, 0x3c, 0xda, 0x3e, 0xd4, 0x3c, 0xda, + 0x3f, 0x76, 0x3f, 0x98, 0x3f, 0x76, 0x3f, 0x76, 0x3f, 0x76, 0x3f, 0x76, + 0x3f, 0x76, 0x3f, 0x12, 0x3f, 0x60, 0x3f, 0x60, 0x3f, 0x60, 0x3f, 0x60, + 0x3f, 0x76, 0x3f, 0x98, 0x3f, 0x76, 0x3f, 0x98, 0x3f, 0x76, 0x3f, 0x98, + 0x3f, 0x98, 0x41, 0x2e, 0x3e, 0xe2, 0x41, 0x2e, 0x3e, 0xe2, 0x41, 0x2e, + 0x3e, 0xe2, 0x3f, 0xda, 0x3f, 0xda, 0x3f, 0xda, 0x3f, 0xec, 0x3f, 0xec, + 0x3f, 0xec, 0x40, 0xf6, 0x3d, 0xda, 0x40, 0xdc, 0x3d, 0xda, 0x41, 0x14, + 0x41, 0x14, 0x41, 0x14, 0x41, 0x64, 0x41, 0x64, 0x41, 0x6a, 0x41, 0x52, + 0x41, 0x52, 0x41, 0x52, 0x41, 0x52, 0x41, 0x52, 0x41, 0x52, 0x41, 0x52, + 0x41, 0x64, 0x41, 0x64, 0x41, 0x64, 0x41, 0x64, 0x41, 0x64, 0x41, 0x52, + 0x41, 0x52, 0x41, 0x52, 0x41, 0x64, 0x41, 0x4c, 0x3c, 0x0e, 0x3c, 0x0e, + 0x3c, 0x0e, 0x3c, 0x0e, 0x41, 0x64, 0x41, 0x64, 0x41, 0x64, 0x41, 0x6a, + 0x3e, 0x50, 0x3e, 0xd4, 0x3f, 0x76, 0x3f, 0x76, 0x41, 0x2e, 0x3d, 0xda, + 0x3e, 0x50, 0x3f, 0x08, 0x3e, 0xd4, 0x41, 0x14, 0x3f, 0x76, 0x3f, 0x76, + 0x3f, 0x12, 0x3f, 0x76, 0x3f, 0x76, 0x41, 0x2e, 0x3f, 0xa2, 0x3f, 0xec, + 0x3d, 0xda, 0x3c, 0x30, 0x3f, 0x76, 0x3d, 0xda, 0x3f, 0x98, 0x3e, 0xe2, + 0x40, 0xdc, 0x3e, 0xe2, 0x3e, 0xd4, 0x3d, 0x18, 0x3f, 0x76, 0x3f, 0x76, + 0x3f, 0x12, 0x3f, 0x12, 0x3c, 0x90, 0x3e, 0x50, 0x3f, 0x08, 0x3d, 0x18, + 0x3e, 0xd4, 0x3f, 0x76, 0x3f, 0x76, 0x41, 0x2e, 0x3f, 0xa2, 0x3c, 0x1e, + 0x3f, 0xec, 0x3c, 0x30, 0x3e, 0xb2, 0x3c, 0xda, 0x3e, 0xe2, 0x3f, 0xc0, + 0x40, 0xdc, 0x3c, 0x8a, 0x3c, 0xda, 0x3c, 0xe4, 0x40, 0xdc, 0x40, 0xf6, + 0x40, 0xf6, 0x40, 0xf6, 0x3d, 0xda, 0x40, 0xdc, 0x3c, 0x18, 0x3c, 0x18, + 0x3c, 0x18, 0x3f, 0x76, 0x3f, 0x98, 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0xd4, + 0x3c, 0xda, 0x40, 0xbe, 0x40, 0xdc, 0x3c, 0x1e, 0x3d, 0xda, 0x40, 0xdc, + 0x3f, 0x76, 0x3c, 0x30, 0x3c, 0x8a, 0x3f, 0x76, 0x3e, 0x50, 0x3e, 0xb2, + 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0xd4, 0x3c, 0xda, 0x3c, 0xda, 0x3c, 0xda, + 0x3c, 0x30, 0x3c, 0x8a, 0x41, 0x2e, 0x3e, 0xe2, 0x3e, 0xe2, 0x3f, 0xc0, + 0x3c, 0x90, 0x40, 0xdc, 0x3c, 0x90, 0x40, 0xdc, 0x3c, 0x90, 0x40, 0xdc, + 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0x50, 0x3e, 0xb2, + 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0x50, 0x3e, 0xb2, + 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0x50, 0x3e, 0xb2, + 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0x50, 0x3e, 0xb2, + 0x3e, 0xd4, 0x3c, 0xda, 0x3e, 0xd4, 0x3c, 0xda, 0x3e, 0xd4, 0x3c, 0xda, + 0x3e, 0xd4, 0x3c, 0xda, 0x3e, 0xd4, 0x3c, 0xda, 0x3e, 0xd4, 0x3c, 0xda, + 0x3e, 0xd4, 0x3c, 0xda, 0x3e, 0xd4, 0x3c, 0xda, 0x3f, 0x76, 0x3f, 0x76, + 0x41, 0x2e, 0x3e, 0xe2, 0x41, 0x2e, 0x3e, 0xe2, 0x41, 0x2e, 0x3e, 0xe2, + 0x41, 0x2e, 0x3e, 0xe2, 0x41, 0x2e, 0x3e, 0xe2, 0x41, 0x2e, 0x3e, 0xe2, + 0x41, 0x2e, 0x3e, 0xe2, 0x3e, 0xe2, 0x3d, 0xda, 0x40, 0xdc, 0x3d, 0xda, + 0x40, 0xdc, 0x3d, 0xda, 0x40, 0xdc, 0x3f, 0xec, 0x3d, 0x18, 0x3c, 0xe4, + 0x3f, 0x98, 0x3c, 0xee, 0x3d, 0x18, 0x3f, 0x12, 0x3d, 0xda, 0x3f, 0x76, + 0x3f, 0x98, 0x3e, 0x50, 0x3e, 0xb2, 0x3e, 0xd4, 0x3f, 0x76, 0x41, 0x2e, + 0x3e, 0xe2, 0x3f, 0xda, 0x3f, 0x08, 0x3f, 0xc0, 0x41, 0x2e, 0x41, 0x2e, + 0x3f, 0x76, 0x3f, 0x98, 0x3f, 0x12, 0x3f, 0x12, 0x3f, 0x60, 0x3f, 0x76, + 0x3f, 0x98, 0x3f, 0x76, 0x3f, 0x98, 0x41, 0x2e, 0x3f, 0xa2, 0x3f, 0xc0, + 0x3f, 0xda, 0x3f, 0xec, 0x40, 0xbe, 0x40, 0xdc, 0x40, 0xbe, 0x40, 0xdc, + 0x40, 0xf6, 0x41, 0x14, 0x41, 0x2e, 0x41, 0x52, 0x41, 0x64, 0x41, 0x52, + 0x41, 0x4c, 0x41, 0x6a, 0x41, 0x4c, 0x41, 0x52, 0x41, 0x64, 0x41, 0x6a, + 0x00, 0x02, 0x00, 0xa5, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x06, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x13, + 0x00, 0x13, 0x00, 0x04, 0x00, 0x25, 0x00, 0x2a, 0x00, 0x05, 0x00, 0x2c, + 0x00, 0x2d, 0x00, 0x0b, 0x00, 0x2f, 0x00, 0x36, 0x00, 0x0d, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x3f, 0x00, 0x16, 0x00, 0x45, + 0x00, 0x46, 0x00, 0x1c, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x1e, 0x00, 0x4c, + 0x00, 0x4c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x21, 0x00, 0x51, + 0x00, 0x54, 0x00, 0x22, 0x00, 0x56, 0x00, 0x56, 0x00, 0x26, 0x00, 0x58, + 0x00, 0x58, 0x00, 0x27, 0x00, 0x5a, 0x00, 0x5d, 0x00, 0x28, 0x00, 0x5f, + 0x00, 0x5f, 0x00, 0x2c, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x2d, 0x00, 0x96, + 0x00, 0x96, 0x00, 0x2e, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x2f, 0x00, 0xb1, + 0x00, 0xb5, 0x00, 0x30, 0x00, 0xb7, 0x00, 0xb9, 0x00, 0x35, 0x00, 0xbb, + 0x00, 0xbb, 0x00, 0x38, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0x39, 0x00, 0xc0, + 0x00, 0xc1, 0x00, 0x3a, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x3c, 0x00, 0xc5, + 0x00, 0xc5, 0x00, 0x3d, 0x00, 0xc7, 0x00, 0xce, 0x00, 0x3e, 0x00, 0xd2, + 0x00, 0xd2, 0x00, 0x46, 0x00, 0xd4, 0x00, 0xde, 0x00, 0x47, 0x00, 0xe0, + 0x00, 0xef, 0x00, 0x52, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x62, 0x00, 0xf6, + 0x00, 0xf8, 0x00, 0x63, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0x66, 0x00, 0xfe, + 0x01, 0x00, 0x00, 0x68, 0x01, 0x03, 0x01, 0x05, 0x00, 0x6b, 0x01, 0x0a, + 0x01, 0x0a, 0x00, 0x6e, 0x01, 0x0d, 0x01, 0x0d, 0x00, 0x6f, 0x01, 0x18, + 0x01, 0x1a, 0x00, 0x70, 0x01, 0x22, 0x01, 0x22, 0x00, 0x73, 0x01, 0x2e, + 0x01, 0x30, 0x00, 0x74, 0x01, 0x33, 0x01, 0x35, 0x00, 0x77, 0x01, 0x37, + 0x01, 0x37, 0x00, 0x7a, 0x01, 0x39, 0x01, 0x39, 0x00, 0x7b, 0x01, 0x3b, + 0x01, 0x3b, 0x00, 0x7c, 0x01, 0x43, 0x01, 0x44, 0x00, 0x7d, 0x01, 0x54, + 0x01, 0x54, 0x00, 0x7f, 0x01, 0x56, 0x01, 0x56, 0x00, 0x80, 0x01, 0x58, + 0x01, 0x58, 0x00, 0x81, 0x01, 0x5c, 0x01, 0x5e, 0x00, 0x82, 0x01, 0x84, + 0x01, 0x85, 0x00, 0x85, 0x01, 0x87, 0x01, 0x89, 0x00, 0x87, 0x01, 0xd8, + 0x01, 0xd8, 0x00, 0x8a, 0x01, 0xda, 0x01, 0xdb, 0x00, 0x8b, 0x01, 0xdd, + 0x01, 0xdd, 0x00, 0x8d, 0x01, 0xe0, 0x01, 0xe1, 0x00, 0x8e, 0x01, 0xeb, + 0x01, 0xed, 0x00, 0x90, 0x01, 0xff, 0x01, 0xff, 0x00, 0x93, 0x02, 0x0e, + 0x02, 0x10, 0x00, 0x94, 0x02, 0x30, 0x02, 0x30, 0x00, 0x97, 0x02, 0x33, + 0x02, 0x33, 0x00, 0x98, 0x02, 0x45, 0x02, 0x45, 0x00, 0x99, 0x02, 0x47, + 0x02, 0x48, 0x00, 0x9a, 0x02, 0x7a, 0x02, 0x7b, 0x00, 0x9c, 0x02, 0x7d, + 0x02, 0x7d, 0x00, 0x9e, 0x02, 0x7f, 0x02, 0x94, 0x00, 0x9f, 0x02, 0x99, + 0x02, 0xa0, 0x00, 0xb5, 0x02, 0xa2, 0x02, 0xa5, 0x00, 0xbd, 0x02, 0xaa, + 0x02, 0xaf, 0x00, 0xc1, 0x02, 0xb4, 0x02, 0xbc, 0x00, 0xc7, 0x02, 0xbe, + 0x02, 0xbe, 0x00, 0xd0, 0x02, 0xc0, 0x02, 0xc0, 0x00, 0xd1, 0x02, 0xc2, + 0x02, 0xc2, 0x00, 0xd2, 0x02, 0xc4, 0x02, 0xc4, 0x00, 0xd3, 0x02, 0xc6, + 0x02, 0xcf, 0x00, 0xd4, 0x02, 0xd8, 0x02, 0xda, 0x00, 0xde, 0x02, 0xdc, + 0x02, 0xdc, 0x00, 0xe1, 0x02, 0xde, 0x02, 0xde, 0x00, 0xe2, 0x02, 0xe0, + 0x02, 0xe0, 0x00, 0xe3, 0x02, 0xe2, 0x02, 0xe2, 0x00, 0xe4, 0x02, 0xe7, + 0x02, 0xe7, 0x00, 0xe5, 0x02, 0xe9, 0x02, 0xe9, 0x00, 0xe6, 0x02, 0xeb, + 0x02, 0xeb, 0x00, 0xe7, 0x02, 0xed, 0x02, 0xed, 0x00, 0xe8, 0x02, 0xef, + 0x02, 0xef, 0x00, 0xe9, 0x02, 0xf1, 0x02, 0xfd, 0x00, 0xea, 0x02, 0xff, + 0x02, 0xff, 0x00, 0xf7, 0x03, 0x01, 0x03, 0x01, 0x00, 0xf8, 0x03, 0x03, + 0x03, 0x03, 0x00, 0xf9, 0x03, 0x0e, 0x03, 0x0e, 0x00, 0xfa, 0x03, 0x10, + 0x03, 0x10, 0x00, 0xfb, 0x03, 0x12, 0x03, 0x12, 0x00, 0xfc, 0x03, 0x20, + 0x03, 0x20, 0x00, 0xfd, 0x03, 0x22, 0x03, 0x25, 0x00, 0xfe, 0x03, 0x27, + 0x03, 0x27, 0x01, 0x02, 0x03, 0x29, 0x03, 0x29, 0x01, 0x03, 0x03, 0x2f, + 0x03, 0x38, 0x01, 0x04, 0x03, 0x43, 0x03, 0x47, 0x01, 0x0e, 0x03, 0x4d, + 0x03, 0x4f, 0x01, 0x13, 0x03, 0x54, 0x03, 0x54, 0x01, 0x16, 0x03, 0x65, + 0x03, 0x69, 0x01, 0x17, 0x03, 0x6d, 0x03, 0x6f, 0x01, 0x1c, 0x03, 0x78, + 0x03, 0x78, 0x01, 0x1f, 0x03, 0x86, 0x03, 0x8b, 0x01, 0x20, 0x03, 0x8e, + 0x03, 0x9d, 0x01, 0x26, 0x03, 0xa0, 0x03, 0xa0, 0x01, 0x36, 0x03, 0xa4, + 0x03, 0xa4, 0x01, 0x37, 0x03, 0xa6, 0x03, 0xa6, 0x01, 0x38, 0x03, 0xaa, + 0x03, 0xaa, 0x01, 0x39, 0x03, 0xad, 0x03, 0xae, 0x01, 0x3a, 0x03, 0xb0, + 0x03, 0xb1, 0x01, 0x3c, 0x03, 0xb3, 0x03, 0xb9, 0x01, 0x3e, 0x03, 0xbb, + 0x03, 0xbd, 0x01, 0x45, 0x03, 0xbf, 0x03, 0xc4, 0x01, 0x48, 0x03, 0xc6, + 0x03, 0xc7, 0x01, 0x4e, 0x03, 0xc9, 0x03, 0xcc, 0x01, 0x50, 0x03, 0xd2, + 0x03, 0xd3, 0x01, 0x54, 0x03, 0xd5, 0x03, 0xd5, 0x01, 0x56, 0x03, 0xd7, + 0x03, 0xd7, 0x01, 0x57, 0x03, 0xd9, 0x03, 0xdc, 0x01, 0x58, 0x03, 0xdf, + 0x03, 0xe4, 0x01, 0x5c, 0x03, 0xe6, 0x03, 0xe6, 0x01, 0x62, 0x03, 0xea, + 0x03, 0xeb, 0x01, 0x63, 0x03, 0xf0, 0x03, 0xf0, 0x01, 0x65, 0x03, 0xf2, + 0x03, 0xfb, 0x01, 0x66, 0x03, 0xfe, 0x03, 0xff, 0x01, 0x70, 0x04, 0x01, + 0x04, 0x04, 0x01, 0x72, 0x04, 0x0b, 0x04, 0x0c, 0x01, 0x76, 0x04, 0x10, + 0x04, 0x10, 0x01, 0x78, 0x04, 0x12, 0x04, 0x18, 0x01, 0x79, 0x04, 0x1e, + 0x04, 0x46, 0x01, 0x80, 0x04, 0x48, 0x04, 0x48, 0x01, 0xa9, 0x04, 0x4a, + 0x04, 0x57, 0x01, 0xaa, 0x04, 0x5f, 0x04, 0x5f, 0x01, 0xb8, 0x04, 0x70, + 0x04, 0x75, 0x01, 0xb9, 0x04, 0x77, 0x04, 0x77, 0x01, 0xbf, 0x04, 0x7b, + 0x04, 0x7c, 0x01, 0xc0, 0x04, 0x7f, 0x04, 0x7f, 0x01, 0xc2, 0x04, 0x81, + 0x04, 0x82, 0x01, 0xc3, 0x04, 0x84, 0x04, 0x84, 0x01, 0xc5, 0x04, 0x86, + 0x04, 0x86, 0x01, 0xc6, 0x04, 0x97, 0x04, 0x9b, 0x01, 0xc7, 0x04, 0x9d, + 0x04, 0x9d, 0x01, 0xcc, 0x04, 0x9f, 0x04, 0xa0, 0x01, 0xcd, 0x04, 0xa2, + 0x04, 0xa2, 0x01, 0xcf, 0x04, 0xa6, 0x04, 0xa8, 0x01, 0xd0, 0x04, 0xaa, + 0x04, 0xaa, 0x01, 0xd3, 0x04, 0xac, 0x04, 0xae, 0x01, 0xd4, 0x04, 0xb0, + 0x04, 0xb0, 0x01, 0xd7, 0x04, 0xb2, 0x04, 0xb2, 0x01, 0xd8, 0x04, 0xb4, + 0x04, 0xba, 0x01, 0xd9, 0x04, 0xbc, 0x04, 0xbc, 0x01, 0xe0, 0x04, 0xbf, + 0x04, 0xbf, 0x01, 0xe1, 0x04, 0xc2, 0x04, 0xc6, 0x01, 0xe2, 0x04, 0xc8, + 0x04, 0xc8, 0x01, 0xe7, 0x04, 0xca, 0x04, 0xcb, 0x01, 0xe8, 0x04, 0xcf, + 0x04, 0xcf, 0x01, 0xea, 0x04, 0xd2, 0x04, 0xd2, 0x01, 0xeb, 0x04, 0xd8, + 0x04, 0xd8, 0x01, 0xec, 0x04, 0xdd, 0x04, 0xdd, 0x01, 0xed, 0x04, 0xe8, + 0x04, 0xe8, 0x01, 0xee, 0x04, 0xea, 0x04, 0xea, 0x01, 0xef, 0x04, 0xf1, + 0x04, 0xf1, 0x01, 0xf0, 0x04, 0xf5, 0x04, 0xf5, 0x01, 0xf1, 0x00, 0x0b, + 0x00, 0x38, 0xff, 0xc4, 0x00, 0xd2, 0xff, 0xc4, 0x00, 0xd6, 0xff, 0xc4, + 0x01, 0x39, 0xff, 0xc4, 0x01, 0x45, 0xff, 0xc4, 0x03, 0x0e, 0xff, 0xc4, + 0x03, 0x10, 0xff, 0xc4, 0x03, 0x12, 0xff, 0xc4, 0x03, 0xc1, 0xff, 0xc4, + 0x04, 0x77, 0xff, 0xc4, 0x04, 0xbf, 0xff, 0xc4, 0x00, 0x18, 0x00, 0x3a, + 0x00, 0x14, 0x00, 0x3b, 0x00, 0x26, 0x00, 0x3d, 0x00, 0x16, 0x01, 0x19, + 0x00, 0x14, 0x02, 0x99, 0x00, 0x16, 0x03, 0x20, 0x00, 0x26, 0x03, 0x22, + 0x00, 0x16, 0x03, 0x24, 0x00, 0x16, 0x03, 0x8b, 0x00, 0x16, 0x03, 0x9a, + 0x00, 0x16, 0x03, 0x9d, 0x00, 0x16, 0x03, 0xd3, 0x00, 0x26, 0x03, 0xd5, + 0x00, 0x26, 0x03, 0xd7, 0x00, 0x26, 0x03, 0xd9, 0x00, 0x16, 0x03, 0xea, + 0x00, 0x14, 0x03, 0xf2, 0x00, 0x16, 0x04, 0x70, 0x00, 0x16, 0x04, 0x72, + 0x00, 0x16, 0x04, 0x74, 0x00, 0x16, 0x04, 0x86, 0x00, 0x16, 0x04, 0xc2, + 0x00, 0x14, 0x04, 0xc4, 0x00, 0x14, 0x04, 0xc6, 0x00, 0x26, 0x00, 0x01, + 0x00, 0x13, 0xff, 0x08, 0x00, 0xe7, 0x00, 0x10, 0xfe, 0xee, 0x00, 0x12, + 0xfe, 0xee, 0x00, 0x25, 0xff, 0x40, 0x00, 0x2e, 0xff, 0x30, 0x00, 0x38, + 0x00, 0x14, 0x00, 0x45, 0xff, 0xde, 0x00, 0x47, 0xff, 0xeb, 0x00, 0x48, + 0xff, 0xeb, 0x00, 0x49, 0xff, 0xeb, 0x00, 0x4b, 0xff, 0xeb, 0x00, 0x53, + 0xff, 0xeb, 0x00, 0x55, 0xff, 0xeb, 0x00, 0x56, 0xff, 0xe6, 0x00, 0x59, + 0xff, 0xea, 0x00, 0x5a, 0xff, 0xe8, 0x00, 0x5d, 0xff, 0xe8, 0x00, 0x94, + 0xff, 0xeb, 0x00, 0x99, 0xff, 0xeb, 0x00, 0x9b, 0xff, 0xea, 0x00, 0xb2, + 0xff, 0x40, 0x00, 0xb4, 0xff, 0x40, 0x00, 0xbb, 0xff, 0xeb, 0x00, 0xbd, + 0xff, 0xe8, 0x00, 0xc8, 0xff, 0xeb, 0x00, 0xc9, 0xff, 0xeb, 0x00, 0xcb, + 0xff, 0xea, 0x00, 0xd2, 0x00, 0x14, 0x00, 0xd6, 0x00, 0x14, 0x00, 0xf7, + 0xff, 0xeb, 0x01, 0x03, 0xff, 0xeb, 0x01, 0x0d, 0xff, 0x40, 0x01, 0x18, + 0xff, 0xeb, 0x01, 0x1a, 0xff, 0xe8, 0x01, 0x1e, 0xff, 0xeb, 0x01, 0x22, + 0xff, 0xeb, 0x01, 0x39, 0x00, 0x14, 0x01, 0x42, 0xff, 0xeb, 0x01, 0x45, + 0x00, 0x14, 0x01, 0x60, 0xff, 0xeb, 0x01, 0x61, 0xff, 0xeb, 0x01, 0x6b, + 0xff, 0xeb, 0x01, 0x86, 0xfe, 0xee, 0x01, 0x8a, 0xfe, 0xee, 0x01, 0x8e, + 0xfe, 0xee, 0x01, 0x8f, 0xfe, 0xee, 0x01, 0xeb, 0xff, 0xc0, 0x01, 0xed, + 0xff, 0xc0, 0x02, 0x33, 0xff, 0xc0, 0x02, 0x7f, 0xff, 0x40, 0x02, 0x80, + 0xff, 0x40, 0x02, 0x81, 0xff, 0x40, 0x02, 0x82, 0xff, 0x40, 0x02, 0x83, + 0xff, 0x40, 0x02, 0x84, 0xff, 0x40, 0x02, 0x85, 0xff, 0x40, 0x02, 0x9a, + 0xff, 0xde, 0x02, 0x9b, 0xff, 0xde, 0x02, 0x9c, 0xff, 0xde, 0x02, 0x9d, + 0xff, 0xde, 0x02, 0x9e, 0xff, 0xde, 0x02, 0x9f, 0xff, 0xde, 0x02, 0xa0, + 0xff, 0xde, 0x02, 0xa1, 0xff, 0xeb, 0x02, 0xa2, 0xff, 0xeb, 0x02, 0xa3, + 0xff, 0xeb, 0x02, 0xa4, 0xff, 0xeb, 0x02, 0xa5, 0xff, 0xeb, 0x02, 0xab, + 0xff, 0xeb, 0x02, 0xac, 0xff, 0xeb, 0x02, 0xad, 0xff, 0xeb, 0x02, 0xae, + 0xff, 0xeb, 0x02, 0xaf, 0xff, 0xeb, 0x02, 0xb0, 0xff, 0xea, 0x02, 0xb1, + 0xff, 0xea, 0x02, 0xb2, 0xff, 0xea, 0x02, 0xb3, 0xff, 0xea, 0x02, 0xb4, + 0xff, 0xe8, 0x02, 0xb5, 0xff, 0xe8, 0x02, 0xb6, 0xff, 0x40, 0x02, 0xb7, + 0xff, 0xde, 0x02, 0xb8, 0xff, 0x40, 0x02, 0xb9, 0xff, 0xde, 0x02, 0xba, + 0xff, 0x40, 0x02, 0xbb, 0xff, 0xde, 0x02, 0xbd, 0xff, 0xeb, 0x02, 0xbf, + 0xff, 0xeb, 0x02, 0xc1, 0xff, 0xeb, 0x02, 0xc3, 0xff, 0xeb, 0x02, 0xc5, + 0xff, 0xeb, 0x02, 0xc7, 0xff, 0xeb, 0x02, 0xc9, 0xff, 0xeb, 0x02, 0xcb, + 0xff, 0xeb, 0x02, 0xcd, 0xff, 0xeb, 0x02, 0xcf, 0xff, 0xeb, 0x02, 0xd1, + 0xff, 0xeb, 0x02, 0xd3, 0xff, 0xeb, 0x02, 0xd5, 0xff, 0xeb, 0x02, 0xd7, + 0xff, 0xeb, 0x02, 0xe5, 0xff, 0x30, 0x02, 0xf9, 0xff, 0xeb, 0x02, 0xfb, + 0xff, 0xeb, 0x02, 0xfd, 0xff, 0xeb, 0x03, 0x0e, 0x00, 0x14, 0x03, 0x10, + 0x00, 0x14, 0x03, 0x12, 0x00, 0x14, 0x03, 0x15, 0xff, 0xea, 0x03, 0x17, + 0xff, 0xea, 0x03, 0x19, 0xff, 0xea, 0x03, 0x1b, 0xff, 0xea, 0x03, 0x1d, + 0xff, 0xea, 0x03, 0x1f, 0xff, 0xea, 0x03, 0x23, 0xff, 0xe8, 0x03, 0x32, + 0xff, 0xc0, 0x03, 0x33, 0xff, 0xc0, 0x03, 0x34, 0xff, 0xc0, 0x03, 0x35, + 0xff, 0xc0, 0x03, 0x36, 0xff, 0xc0, 0x03, 0x37, 0xff, 0xc0, 0x03, 0x38, + 0xff, 0xc0, 0x03, 0x4d, 0xff, 0xc0, 0x03, 0x4e, 0xff, 0xc0, 0x03, 0x4f, + 0xff, 0xc0, 0x03, 0x86, 0xff, 0x40, 0x03, 0x8e, 0xff, 0x40, 0x03, 0x9e, + 0xff, 0xeb, 0x03, 0xa2, 0xff, 0xea, 0x03, 0xa4, 0xff, 0xeb, 0x03, 0xa6, + 0xff, 0xe8, 0x03, 0xa9, 0xff, 0xea, 0x03, 0xaa, 0xff, 0xeb, 0x03, 0xab, + 0xff, 0xea, 0x03, 0xb2, 0xff, 0x30, 0x03, 0xb6, 0xff, 0x40, 0x03, 0xc1, + 0x00, 0x14, 0x03, 0xc3, 0xff, 0xde, 0x03, 0xc4, 0xff, 0xeb, 0x03, 0xc6, + 0xff, 0xeb, 0x03, 0xc8, 0xff, 0xeb, 0x03, 0xc9, 0xff, 0xe8, 0x03, 0xcb, + 0xff, 0xeb, 0x03, 0xd2, 0xff, 0xe8, 0x03, 0xda, 0xff, 0xe8, 0x03, 0xe2, + 0xff, 0x40, 0x03, 0xe3, 0xff, 0xde, 0x03, 0xe6, 0xff, 0xeb, 0x03, 0xeb, + 0xff, 0xe8, 0x03, 0xec, 0xff, 0xeb, 0x03, 0xf1, 0xff, 0xeb, 0x03, 0xf3, + 0xff, 0xe8, 0x03, 0xf8, 0xff, 0x40, 0x03, 0xf9, 0xff, 0xde, 0x03, 0xfa, + 0xff, 0x40, 0x03, 0xfb, 0xff, 0xde, 0x03, 0xff, 0xff, 0xeb, 0x04, 0x01, + 0xff, 0xeb, 0x04, 0x02, 0xff, 0xeb, 0x04, 0x0c, 0xff, 0xeb, 0x04, 0x0e, + 0xff, 0xeb, 0x04, 0x10, 0xff, 0xeb, 0x04, 0x14, 0xff, 0xe8, 0x04, 0x16, + 0xff, 0xe8, 0x04, 0x18, 0xff, 0xe8, 0x04, 0x1d, 0xff, 0xeb, 0x04, 0x1e, + 0xff, 0x40, 0x04, 0x1f, 0xff, 0xde, 0x04, 0x20, 0xff, 0x40, 0x04, 0x21, + 0xff, 0xde, 0x04, 0x22, 0xff, 0x40, 0x04, 0x23, 0xff, 0xde, 0x04, 0x24, + 0xff, 0x40, 0x04, 0x25, 0xff, 0xde, 0x04, 0x26, 0xff, 0x40, 0x04, 0x27, + 0xff, 0xde, 0x04, 0x28, 0xff, 0x40, 0x04, 0x29, 0xff, 0xde, 0x04, 0x2a, + 0xff, 0x40, 0x04, 0x2b, 0xff, 0xde, 0x04, 0x2c, 0xff, 0x40, 0x04, 0x2d, + 0xff, 0xde, 0x04, 0x2e, 0xff, 0x40, 0x04, 0x2f, 0xff, 0xde, 0x04, 0x30, + 0xff, 0x40, 0x04, 0x31, 0xff, 0xde, 0x04, 0x32, 0xff, 0x40, 0x04, 0x33, + 0xff, 0xde, 0x04, 0x34, 0xff, 0x40, 0x04, 0x35, 0xff, 0xde, 0x04, 0x37, + 0xff, 0xeb, 0x04, 0x39, 0xff, 0xeb, 0x04, 0x3b, 0xff, 0xeb, 0x04, 0x3d, + 0xff, 0xeb, 0x04, 0x3f, 0xff, 0xeb, 0x04, 0x41, 0xff, 0xeb, 0x04, 0x43, + 0xff, 0xeb, 0x04, 0x45, 0xff, 0xeb, 0x04, 0x4b, 0xff, 0xeb, 0x04, 0x4d, + 0xff, 0xeb, 0x04, 0x4f, 0xff, 0xeb, 0x04, 0x51, 0xff, 0xeb, 0x04, 0x53, + 0xff, 0xeb, 0x04, 0x55, 0xff, 0xeb, 0x04, 0x57, 0xff, 0xeb, 0x04, 0x59, + 0xff, 0xeb, 0x04, 0x5b, 0xff, 0xeb, 0x04, 0x5d, 0xff, 0xeb, 0x04, 0x5f, + 0xff, 0xeb, 0x04, 0x61, 0xff, 0xeb, 0x04, 0x63, 0xff, 0xea, 0x04, 0x65, + 0xff, 0xea, 0x04, 0x67, 0xff, 0xea, 0x04, 0x69, 0xff, 0xea, 0x04, 0x6b, + 0xff, 0xea, 0x04, 0x6d, 0xff, 0xea, 0x04, 0x6f, 0xff, 0xea, 0x04, 0x71, + 0xff, 0xe8, 0x04, 0x73, 0xff, 0xe8, 0x04, 0x75, 0xff, 0xe8, 0x04, 0x77, + 0x00, 0x14, 0x04, 0x99, 0xff, 0x40, 0x04, 0x9a, 0xff, 0xde, 0x04, 0x9c, + 0xff, 0xeb, 0x04, 0xa0, 0xff, 0xeb, 0x04, 0xa4, 0xff, 0xea, 0x04, 0xa9, + 0xff, 0xeb, 0x04, 0xab, 0xff, 0xeb, 0x04, 0xbf, 0x00, 0x14, 0x04, 0xc3, + 0xff, 0xe8, 0x04, 0xc5, 0xff, 0xe8, 0x04, 0xcb, 0xff, 0xc0, 0x04, 0xd2, + 0xff, 0xc0, 0x04, 0xea, 0xff, 0xc0, 0x00, 0x33, 0x00, 0x38, 0xff, 0xdf, + 0x00, 0x3a, 0xff, 0xe4, 0x00, 0x3b, 0xff, 0xec, 0x00, 0x3d, 0xff, 0xdd, + 0x00, 0xd2, 0xff, 0xdf, 0x00, 0xd6, 0xff, 0xdf, 0x01, 0x19, 0xff, 0xe4, + 0x01, 0x39, 0xff, 0xdf, 0x01, 0x45, 0xff, 0xdf, 0x01, 0xeb, 0x00, 0x0e, + 0x01, 0xed, 0x00, 0x0e, 0x02, 0x33, 0x00, 0x0e, 0x02, 0x99, 0xff, 0xdd, + 0x03, 0x0e, 0xff, 0xdf, 0x03, 0x10, 0xff, 0xdf, 0x03, 0x12, 0xff, 0xdf, + 0x03, 0x20, 0xff, 0xec, 0x03, 0x22, 0xff, 0xdd, 0x03, 0x24, 0xff, 0xdd, + 0x03, 0x32, 0x00, 0x0e, 0x03, 0x33, 0x00, 0x0e, 0x03, 0x34, 0x00, 0x0e, + 0x03, 0x35, 0x00, 0x0e, 0x03, 0x36, 0x00, 0x0e, 0x03, 0x37, 0x00, 0x0e, + 0x03, 0x38, 0x00, 0x0e, 0x03, 0x4d, 0x00, 0x0e, 0x03, 0x4e, 0x00, 0x0e, + 0x03, 0x4f, 0x00, 0x0e, 0x03, 0x8b, 0xff, 0xdd, 0x03, 0x9a, 0xff, 0xdd, + 0x03, 0x9d, 0xff, 0xdd, 0x03, 0xc1, 0xff, 0xdf, 0x03, 0xd3, 0xff, 0xec, + 0x03, 0xd5, 0xff, 0xec, 0x03, 0xd7, 0xff, 0xec, 0x03, 0xd9, 0xff, 0xdd, + 0x03, 0xea, 0xff, 0xe4, 0x03, 0xf2, 0xff, 0xdd, 0x04, 0x70, 0xff, 0xdd, + 0x04, 0x72, 0xff, 0xdd, 0x04, 0x74, 0xff, 0xdd, 0x04, 0x77, 0xff, 0xdf, + 0x04, 0x86, 0xff, 0xdd, 0x04, 0xbf, 0xff, 0xdf, 0x04, 0xc2, 0xff, 0xe4, + 0x04, 0xc4, 0xff, 0xe4, 0x04, 0xc6, 0xff, 0xec, 0x04, 0xcb, 0x00, 0x0e, + 0x04, 0xd2, 0x00, 0x0e, 0x04, 0xea, 0x00, 0x0e, 0x00, 0x1d, 0x00, 0x38, + 0xff, 0xce, 0x00, 0x3a, 0xff, 0xed, 0x00, 0x3d, 0xff, 0xd0, 0x00, 0xd2, + 0xff, 0xce, 0x00, 0xd6, 0xff, 0xce, 0x01, 0x19, 0xff, 0xed, 0x01, 0x39, + 0xff, 0xce, 0x01, 0x45, 0xff, 0xce, 0x02, 0x99, 0xff, 0xd0, 0x03, 0x0e, + 0xff, 0xce, 0x03, 0x10, 0xff, 0xce, 0x03, 0x12, 0xff, 0xce, 0x03, 0x22, + 0xff, 0xd0, 0x03, 0x24, 0xff, 0xd0, 0x03, 0x8b, 0xff, 0xd0, 0x03, 0x9a, + 0xff, 0xd0, 0x03, 0x9d, 0xff, 0xd0, 0x03, 0xc1, 0xff, 0xce, 0x03, 0xd9, + 0xff, 0xd0, 0x03, 0xea, 0xff, 0xed, 0x03, 0xf2, 0xff, 0xd0, 0x04, 0x70, + 0xff, 0xd0, 0x04, 0x72, 0xff, 0xd0, 0x04, 0x74, 0xff, 0xd0, 0x04, 0x77, + 0xff, 0xce, 0x04, 0x86, 0xff, 0xd0, 0x04, 0xbf, 0xff, 0xce, 0x04, 0xc2, + 0xff, 0xed, 0x04, 0xc4, 0xff, 0xed, 0x00, 0x11, 0x00, 0x2e, 0xff, 0xee, + 0x00, 0x39, 0xff, 0xee, 0x02, 0x95, 0xff, 0xee, 0x02, 0x96, 0xff, 0xee, + 0x02, 0x97, 0xff, 0xee, 0x02, 0x98, 0xff, 0xee, 0x02, 0xe5, 0xff, 0xee, + 0x03, 0x14, 0xff, 0xee, 0x03, 0x16, 0xff, 0xee, 0x03, 0x18, 0xff, 0xee, + 0x03, 0x1a, 0xff, 0xee, 0x03, 0x1c, 0xff, 0xee, 0x03, 0x1e, 0xff, 0xee, + 0x03, 0xb2, 0xff, 0xee, 0x04, 0x62, 0xff, 0xee, 0x04, 0x64, 0xff, 0xee, + 0x04, 0xc1, 0xff, 0xee, 0x00, 0x4d, 0x00, 0x06, 0x00, 0x10, 0x00, 0x0b, + 0x00, 0x10, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x41, 0x00, 0x12, 0x00, 0x47, + 0xff, 0xe8, 0x00, 0x48, 0xff, 0xe8, 0x00, 0x49, 0xff, 0xe8, 0x00, 0x4b, + 0xff, 0xe8, 0x00, 0x55, 0xff, 0xe8, 0x00, 0x61, 0x00, 0x13, 0x00, 0x94, + 0xff, 0xe8, 0x00, 0x99, 0xff, 0xe8, 0x00, 0xbb, 0xff, 0xe8, 0x00, 0xc8, + 0xff, 0xe8, 0x00, 0xc9, 0xff, 0xe8, 0x00, 0xf7, 0xff, 0xe8, 0x01, 0x03, + 0xff, 0xe8, 0x01, 0x1e, 0xff, 0xe8, 0x01, 0x22, 0xff, 0xe8, 0x01, 0x42, + 0xff, 0xe8, 0x01, 0x60, 0xff, 0xe8, 0x01, 0x61, 0xff, 0xe8, 0x01, 0x6b, + 0xff, 0xe8, 0x01, 0x84, 0x00, 0x10, 0x01, 0x85, 0x00, 0x10, 0x01, 0x87, + 0x00, 0x10, 0x01, 0x88, 0x00, 0x10, 0x01, 0x89, 0x00, 0x10, 0x02, 0xa1, + 0xff, 0xe8, 0x02, 0xa2, 0xff, 0xe8, 0x02, 0xa3, 0xff, 0xe8, 0x02, 0xa4, + 0xff, 0xe8, 0x02, 0xa5, 0xff, 0xe8, 0x02, 0xbd, 0xff, 0xe8, 0x02, 0xbf, + 0xff, 0xe8, 0x02, 0xc1, 0xff, 0xe8, 0x02, 0xc3, 0xff, 0xe8, 0x02, 0xc5, + 0xff, 0xe8, 0x02, 0xc7, 0xff, 0xe8, 0x02, 0xc9, 0xff, 0xe8, 0x02, 0xcb, + 0xff, 0xe8, 0x02, 0xcd, 0xff, 0xe8, 0x02, 0xcf, 0xff, 0xe8, 0x02, 0xd1, + 0xff, 0xe8, 0x02, 0xd3, 0xff, 0xe8, 0x02, 0xd5, 0xff, 0xe8, 0x02, 0xd7, + 0xff, 0xe8, 0x03, 0x9e, 0xff, 0xe8, 0x03, 0xc4, 0xff, 0xe8, 0x03, 0xc8, + 0xff, 0xe8, 0x03, 0xcb, 0xff, 0xe8, 0x03, 0xdb, 0x00, 0x10, 0x03, 0xdc, + 0x00, 0x10, 0x03, 0xdf, 0x00, 0x10, 0x03, 0xe6, 0xff, 0xe8, 0x03, 0xec, + 0xff, 0xe8, 0x03, 0xf1, 0xff, 0xe8, 0x03, 0xff, 0xff, 0xe8, 0x04, 0x01, + 0xff, 0xe8, 0x04, 0x02, 0xff, 0xe8, 0x04, 0x0e, 0xff, 0xe8, 0x04, 0x1d, + 0xff, 0xe8, 0x04, 0x37, 0xff, 0xe8, 0x04, 0x39, 0xff, 0xe8, 0x04, 0x3b, + 0xff, 0xe8, 0x04, 0x3d, 0xff, 0xe8, 0x04, 0x3f, 0xff, 0xe8, 0x04, 0x41, + 0xff, 0xe8, 0x04, 0x43, 0xff, 0xe8, 0x04, 0x45, 0xff, 0xe8, 0x04, 0x59, + 0xff, 0xe8, 0x04, 0x5b, 0xff, 0xe8, 0x04, 0x5d, 0xff, 0xe8, 0x04, 0x61, + 0xff, 0xe8, 0x04, 0x9c, 0xff, 0xe8, 0x04, 0xa9, 0xff, 0xe8, 0x04, 0xab, + 0xff, 0xe8, 0x00, 0x02, 0x00, 0xf6, 0xff, 0xd6, 0x01, 0x85, 0xff, 0x98, + 0x00, 0x40, 0x00, 0x47, 0xff, 0xec, 0x00, 0x48, 0xff, 0xec, 0x00, 0x49, + 0xff, 0xec, 0x00, 0x4b, 0xff, 0xec, 0x00, 0x55, 0xff, 0xec, 0x00, 0x94, + 0xff, 0xec, 0x00, 0x99, 0xff, 0xec, 0x00, 0xbb, 0xff, 0xec, 0x00, 0xc8, + 0xff, 0xec, 0x00, 0xc9, 0xff, 0xec, 0x00, 0xf7, 0xff, 0xec, 0x01, 0x03, + 0xff, 0xec, 0x01, 0x1e, 0xff, 0xec, 0x01, 0x22, 0xff, 0xec, 0x01, 0x42, + 0xff, 0xec, 0x01, 0x60, 0xff, 0xec, 0x01, 0x61, 0xff, 0xec, 0x01, 0x6b, + 0xff, 0xec, 0x02, 0xa1, 0xff, 0xec, 0x02, 0xa2, 0xff, 0xec, 0x02, 0xa3, + 0xff, 0xec, 0x02, 0xa4, 0xff, 0xec, 0x02, 0xa5, 0xff, 0xec, 0x02, 0xbd, + 0xff, 0xec, 0x02, 0xbf, 0xff, 0xec, 0x02, 0xc1, 0xff, 0xec, 0x02, 0xc3, + 0xff, 0xec, 0x02, 0xc5, 0xff, 0xec, 0x02, 0xc7, 0xff, 0xec, 0x02, 0xc9, + 0xff, 0xec, 0x02, 0xcb, 0xff, 0xec, 0x02, 0xcd, 0xff, 0xec, 0x02, 0xcf, + 0xff, 0xec, 0x02, 0xd1, 0xff, 0xec, 0x02, 0xd3, 0xff, 0xec, 0x02, 0xd5, + 0xff, 0xec, 0x02, 0xd7, 0xff, 0xec, 0x03, 0x9e, 0xff, 0xec, 0x03, 0xc4, + 0xff, 0xec, 0x03, 0xc8, 0xff, 0xec, 0x03, 0xcb, 0xff, 0xec, 0x03, 0xe6, + 0xff, 0xec, 0x03, 0xec, 0xff, 0xec, 0x03, 0xf1, 0xff, 0xec, 0x03, 0xff, + 0xff, 0xec, 0x04, 0x01, 0xff, 0xec, 0x04, 0x02, 0xff, 0xec, 0x04, 0x0e, + 0xff, 0xec, 0x04, 0x1d, 0xff, 0xec, 0x04, 0x37, 0xff, 0xec, 0x04, 0x39, + 0xff, 0xec, 0x04, 0x3b, 0xff, 0xec, 0x04, 0x3d, 0xff, 0xec, 0x04, 0x3f, + 0xff, 0xec, 0x04, 0x41, 0xff, 0xec, 0x04, 0x43, 0xff, 0xec, 0x04, 0x45, + 0xff, 0xec, 0x04, 0x59, 0xff, 0xec, 0x04, 0x5b, 0xff, 0xec, 0x04, 0x5d, + 0xff, 0xec, 0x04, 0x61, 0xff, 0xec, 0x04, 0x9c, 0xff, 0xec, 0x04, 0xa9, + 0xff, 0xec, 0x04, 0xab, 0xff, 0xec, 0x00, 0x19, 0x00, 0x53, 0xff, 0xe2, + 0x01, 0x18, 0xff, 0xe2, 0x01, 0x85, 0x00, 0x18, 0x02, 0xab, 0xff, 0xe2, + 0x02, 0xac, 0xff, 0xe2, 0x02, 0xad, 0xff, 0xe2, 0x02, 0xae, 0xff, 0xe2, + 0x02, 0xaf, 0xff, 0xe2, 0x02, 0xf9, 0xff, 0xe2, 0x02, 0xfb, 0xff, 0xe2, + 0x02, 0xfd, 0xff, 0xe2, 0x03, 0xa4, 0xff, 0xe2, 0x03, 0xaa, 0xff, 0xe2, + 0x03, 0xc6, 0xff, 0xe2, 0x04, 0x0c, 0xff, 0xe2, 0x04, 0x10, 0xff, 0xe2, + 0x04, 0x4b, 0xff, 0xe2, 0x04, 0x4d, 0xff, 0xe2, 0x04, 0x4f, 0xff, 0xe2, + 0x04, 0x51, 0xff, 0xe2, 0x04, 0x53, 0xff, 0xe2, 0x04, 0x55, 0xff, 0xe2, + 0x04, 0x57, 0xff, 0xe2, 0x04, 0x5f, 0xff, 0xe2, 0x04, 0xa0, 0xff, 0xe2, + 0x00, 0x06, 0x00, 0x10, 0xff, 0x84, 0x00, 0x12, 0xff, 0x84, 0x01, 0x86, + 0xff, 0x84, 0x01, 0x8a, 0xff, 0x84, 0x01, 0x8e, 0xff, 0x84, 0x01, 0x8f, + 0xff, 0x84, 0x00, 0x11, 0x00, 0x2e, 0xff, 0xec, 0x00, 0x39, 0xff, 0xec, + 0x02, 0x95, 0xff, 0xec, 0x02, 0x96, 0xff, 0xec, 0x02, 0x97, 0xff, 0xec, + 0x02, 0x98, 0xff, 0xec, 0x02, 0xe5, 0xff, 0xec, 0x03, 0x14, 0xff, 0xec, + 0x03, 0x16, 0xff, 0xec, 0x03, 0x18, 0xff, 0xec, 0x03, 0x1a, 0xff, 0xec, + 0x03, 0x1c, 0xff, 0xec, 0x03, 0x1e, 0xff, 0xec, 0x03, 0xb2, 0xff, 0xec, + 0x04, 0x62, 0xff, 0xec, 0x04, 0x64, 0xff, 0xec, 0x04, 0xc1, 0xff, 0xec, + 0x00, 0x20, 0x00, 0x06, 0xff, 0xf2, 0x00, 0x0b, 0xff, 0xf2, 0x00, 0x5a, + 0xff, 0xf3, 0x00, 0x5d, 0xff, 0xf3, 0x00, 0xbd, 0xff, 0xf3, 0x00, 0xf6, + 0xff, 0xf5, 0x01, 0x1a, 0xff, 0xf3, 0x01, 0x84, 0xff, 0xf2, 0x01, 0x85, + 0xff, 0xf2, 0x01, 0x87, 0xff, 0xf2, 0x01, 0x88, 0xff, 0xf2, 0x01, 0x89, + 0xff, 0xf2, 0x02, 0xb4, 0xff, 0xf3, 0x02, 0xb5, 0xff, 0xf3, 0x03, 0x23, + 0xff, 0xf3, 0x03, 0xa6, 0xff, 0xf3, 0x03, 0xc9, 0xff, 0xf3, 0x03, 0xd2, + 0xff, 0xf3, 0x03, 0xda, 0xff, 0xf3, 0x03, 0xdb, 0xff, 0xf2, 0x03, 0xdc, + 0xff, 0xf2, 0x03, 0xdf, 0xff, 0xf2, 0x03, 0xeb, 0xff, 0xf3, 0x03, 0xf3, + 0xff, 0xf3, 0x04, 0x14, 0xff, 0xf3, 0x04, 0x16, 0xff, 0xf3, 0x04, 0x18, + 0xff, 0xf3, 0x04, 0x71, 0xff, 0xf3, 0x04, 0x73, 0xff, 0xf3, 0x04, 0x75, + 0xff, 0xf3, 0x04, 0xc3, 0xff, 0xf3, 0x04, 0xc5, 0xff, 0xf3, 0x00, 0x3f, + 0x00, 0x27, 0xff, 0xf3, 0x00, 0x2b, 0xff, 0xf3, 0x00, 0x33, 0xff, 0xf3, + 0x00, 0x35, 0xff, 0xf3, 0x00, 0x83, 0xff, 0xf3, 0x00, 0x93, 0xff, 0xf3, + 0x00, 0x98, 0xff, 0xf3, 0x00, 0xb3, 0xff, 0xf3, 0x00, 0xc4, 0x00, 0x0d, + 0x00, 0xd3, 0xff, 0xf3, 0x01, 0x08, 0xff, 0xf3, 0x01, 0x17, 0xff, 0xf3, + 0x01, 0x1b, 0xff, 0xf3, 0x01, 0x1d, 0xff, 0xf3, 0x01, 0x1f, 0xff, 0xf3, + 0x01, 0x21, 0xff, 0xf3, 0x01, 0x41, 0xff, 0xf3, 0x01, 0x6a, 0xff, 0xf3, + 0x02, 0x45, 0xff, 0xf3, 0x02, 0x46, 0xff, 0xf3, 0x02, 0x48, 0xff, 0xf3, + 0x02, 0x49, 0xff, 0xf3, 0x02, 0x86, 0xff, 0xf3, 0x02, 0x90, 0xff, 0xf3, + 0x02, 0x91, 0xff, 0xf3, 0x02, 0x92, 0xff, 0xf3, 0x02, 0x93, 0xff, 0xf3, + 0x02, 0x94, 0xff, 0xf3, 0x02, 0xbc, 0xff, 0xf3, 0x02, 0xbe, 0xff, 0xf3, + 0x02, 0xc0, 0xff, 0xf3, 0x02, 0xc2, 0xff, 0xf3, 0x02, 0xd0, 0xff, 0xf3, + 0x02, 0xd2, 0xff, 0xf3, 0x02, 0xd4, 0xff, 0xf3, 0x02, 0xd6, 0xff, 0xf3, + 0x02, 0xf8, 0xff, 0xf3, 0x02, 0xfa, 0xff, 0xf3, 0x02, 0xfc, 0xff, 0xf3, + 0x03, 0x2d, 0xff, 0xf3, 0x03, 0x8a, 0xff, 0xf3, 0x03, 0x97, 0xff, 0xf3, + 0x03, 0xbd, 0xff, 0xf3, 0x03, 0xc0, 0xff, 0xf3, 0x03, 0xed, 0xff, 0xf3, + 0x03, 0xf0, 0xff, 0xf3, 0x04, 0x0b, 0xff, 0xf3, 0x04, 0x0d, 0xff, 0xf3, + 0x04, 0x0f, 0xff, 0xf3, 0x04, 0x4a, 0xff, 0xf3, 0x04, 0x4c, 0xff, 0xf3, + 0x04, 0x4e, 0xff, 0xf3, 0x04, 0x50, 0xff, 0xf3, 0x04, 0x52, 0xff, 0xf3, + 0x04, 0x54, 0xff, 0xf3, 0x04, 0x56, 0xff, 0xf3, 0x04, 0x58, 0xff, 0xf3, + 0x04, 0x5a, 0xff, 0xf3, 0x04, 0x5c, 0xff, 0xf3, 0x04, 0x5e, 0xff, 0xf3, + 0x04, 0x60, 0xff, 0xf3, 0x04, 0x9f, 0xff, 0xf3, 0x04, 0xb8, 0xff, 0xf3, + 0x00, 0x40, 0x00, 0x27, 0xff, 0xe6, 0x00, 0x2b, 0xff, 0xe6, 0x00, 0x33, + 0xff, 0xe6, 0x00, 0x35, 0xff, 0xe6, 0x00, 0x83, 0xff, 0xe6, 0x00, 0x93, + 0xff, 0xe6, 0x00, 0x98, 0xff, 0xe6, 0x00, 0xb3, 0xff, 0xe6, 0x00, 0xb8, + 0xff, 0xc2, 0x00, 0xc4, 0x00, 0x10, 0x00, 0xd3, 0xff, 0xe6, 0x01, 0x08, + 0xff, 0xe6, 0x01, 0x17, 0xff, 0xe6, 0x01, 0x1b, 0xff, 0xe6, 0x01, 0x1d, + 0xff, 0xe6, 0x01, 0x1f, 0xff, 0xe6, 0x01, 0x21, 0xff, 0xe6, 0x01, 0x41, + 0xff, 0xe6, 0x01, 0x6a, 0xff, 0xe6, 0x02, 0x45, 0xff, 0xe6, 0x02, 0x46, + 0xff, 0xe6, 0x02, 0x48, 0xff, 0xe6, 0x02, 0x49, 0xff, 0xe6, 0x02, 0x86, + 0xff, 0xe6, 0x02, 0x90, 0xff, 0xe6, 0x02, 0x91, 0xff, 0xe6, 0x02, 0x92, + 0xff, 0xe6, 0x02, 0x93, 0xff, 0xe6, 0x02, 0x94, 0xff, 0xe6, 0x02, 0xbc, + 0xff, 0xe6, 0x02, 0xbe, 0xff, 0xe6, 0x02, 0xc0, 0xff, 0xe6, 0x02, 0xc2, + 0xff, 0xe6, 0x02, 0xd0, 0xff, 0xe6, 0x02, 0xd2, 0xff, 0xe6, 0x02, 0xd4, + 0xff, 0xe6, 0x02, 0xd6, 0xff, 0xe6, 0x02, 0xf8, 0xff, 0xe6, 0x02, 0xfa, + 0xff, 0xe6, 0x02, 0xfc, 0xff, 0xe6, 0x03, 0x2d, 0xff, 0xe6, 0x03, 0x8a, + 0xff, 0xe6, 0x03, 0x97, 0xff, 0xe6, 0x03, 0xbd, 0xff, 0xe6, 0x03, 0xc0, + 0xff, 0xe6, 0x03, 0xed, 0xff, 0xe6, 0x03, 0xf0, 0xff, 0xe6, 0x04, 0x0b, + 0xff, 0xe6, 0x04, 0x0d, 0xff, 0xe6, 0x04, 0x0f, 0xff, 0xe6, 0x04, 0x4a, + 0xff, 0xe6, 0x04, 0x4c, 0xff, 0xe6, 0x04, 0x4e, 0xff, 0xe6, 0x04, 0x50, + 0xff, 0xe6, 0x04, 0x52, 0xff, 0xe6, 0x04, 0x54, 0xff, 0xe6, 0x04, 0x56, + 0xff, 0xe6, 0x04, 0x58, 0xff, 0xe6, 0x04, 0x5a, 0xff, 0xe6, 0x04, 0x5c, + 0xff, 0xe6, 0x04, 0x5e, 0xff, 0xe6, 0x04, 0x60, 0xff, 0xe6, 0x04, 0x9f, + 0xff, 0xe6, 0x04, 0xb8, 0xff, 0xe6, 0x00, 0x38, 0x00, 0x25, 0xff, 0xe4, + 0x00, 0x3c, 0xff, 0xd2, 0x00, 0x3d, 0xff, 0xd3, 0x00, 0xb2, 0xff, 0xe4, + 0x00, 0xb4, 0xff, 0xe4, 0x00, 0xc4, 0xff, 0xe2, 0x00, 0xda, 0xff, 0xd2, + 0x01, 0x0d, 0xff, 0xe4, 0x01, 0x33, 0xff, 0xd2, 0x01, 0x43, 0xff, 0xd2, + 0x01, 0x5d, 0xff, 0xd2, 0x02, 0x7f, 0xff, 0xe4, 0x02, 0x80, 0xff, 0xe4, + 0x02, 0x81, 0xff, 0xe4, 0x02, 0x82, 0xff, 0xe4, 0x02, 0x83, 0xff, 0xe4, + 0x02, 0x84, 0xff, 0xe4, 0x02, 0x85, 0xff, 0xe4, 0x02, 0x99, 0xff, 0xd3, + 0x02, 0xb6, 0xff, 0xe4, 0x02, 0xb8, 0xff, 0xe4, 0x02, 0xba, 0xff, 0xe4, + 0x03, 0x22, 0xff, 0xd3, 0x03, 0x24, 0xff, 0xd3, 0x03, 0x86, 0xff, 0xe4, + 0x03, 0x8b, 0xff, 0xd3, 0x03, 0x8e, 0xff, 0xe4, 0x03, 0x9a, 0xff, 0xd3, + 0x03, 0x9b, 0xff, 0xd2, 0x03, 0x9d, 0xff, 0xd3, 0x03, 0xb6, 0xff, 0xe4, + 0x03, 0xc2, 0xff, 0xd2, 0x03, 0xd9, 0xff, 0xd3, 0x03, 0xe2, 0xff, 0xe4, + 0x03, 0xf2, 0xff, 0xd3, 0x03, 0xf5, 0xff, 0xd2, 0x03, 0xf8, 0xff, 0xe4, + 0x03, 0xfa, 0xff, 0xe4, 0x04, 0x03, 0xff, 0xd2, 0x04, 0x1e, 0xff, 0xe4, + 0x04, 0x20, 0xff, 0xe4, 0x04, 0x22, 0xff, 0xe4, 0x04, 0x24, 0xff, 0xe4, + 0x04, 0x26, 0xff, 0xe4, 0x04, 0x28, 0xff, 0xe4, 0x04, 0x2a, 0xff, 0xe4, + 0x04, 0x2c, 0xff, 0xe4, 0x04, 0x2e, 0xff, 0xe4, 0x04, 0x30, 0xff, 0xe4, + 0x04, 0x32, 0xff, 0xe4, 0x04, 0x34, 0xff, 0xe4, 0x04, 0x70, 0xff, 0xd3, + 0x04, 0x72, 0xff, 0xd3, 0x04, 0x74, 0xff, 0xd3, 0x04, 0x86, 0xff, 0xd3, + 0x04, 0x99, 0xff, 0xe4, 0x00, 0x28, 0x00, 0x10, 0xff, 0x46, 0x00, 0x12, + 0xff, 0x46, 0x00, 0x25, 0xff, 0xcd, 0x00, 0xb2, 0xff, 0xcd, 0x00, 0xb4, + 0xff, 0xcd, 0x00, 0xc7, 0xff, 0xf2, 0x01, 0x0d, 0xff, 0xcd, 0x01, 0x86, + 0xff, 0x46, 0x01, 0x8a, 0xff, 0x46, 0x01, 0x8e, 0xff, 0x46, 0x01, 0x8f, + 0xff, 0x46, 0x02, 0x7f, 0xff, 0xcd, 0x02, 0x80, 0xff, 0xcd, 0x02, 0x81, + 0xff, 0xcd, 0x02, 0x82, 0xff, 0xcd, 0x02, 0x83, 0xff, 0xcd, 0x02, 0x84, + 0xff, 0xcd, 0x02, 0x85, 0xff, 0xcd, 0x02, 0xb6, 0xff, 0xcd, 0x02, 0xb8, + 0xff, 0xcd, 0x02, 0xba, 0xff, 0xcd, 0x03, 0x86, 0xff, 0xcd, 0x03, 0x8e, + 0xff, 0xcd, 0x03, 0xb6, 0xff, 0xcd, 0x03, 0xe2, 0xff, 0xcd, 0x03, 0xf8, + 0xff, 0xcd, 0x03, 0xfa, 0xff, 0xcd, 0x04, 0x1e, 0xff, 0xcd, 0x04, 0x20, + 0xff, 0xcd, 0x04, 0x22, 0xff, 0xcd, 0x04, 0x24, 0xff, 0xcd, 0x04, 0x26, + 0xff, 0xcd, 0x04, 0x28, 0xff, 0xcd, 0x04, 0x2a, 0xff, 0xcd, 0x04, 0x2c, + 0xff, 0xcd, 0x04, 0x2e, 0xff, 0xcd, 0x04, 0x30, 0xff, 0xcd, 0x04, 0x32, + 0xff, 0xcd, 0x04, 0x34, 0xff, 0xcd, 0x04, 0x99, 0xff, 0xcd, 0x00, 0x01, + 0x00, 0xc4, 0x00, 0x0e, 0x00, 0xb9, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x48, + 0xff, 0xdc, 0x00, 0x49, 0xff, 0xdc, 0x00, 0x4b, 0xff, 0xdc, 0x00, 0x51, + 0xff, 0xc1, 0x00, 0x52, 0xff, 0xc1, 0x00, 0x53, 0xff, 0xd6, 0x00, 0x54, + 0xff, 0xc1, 0x00, 0x55, 0xff, 0xdc, 0x00, 0x59, 0xff, 0xdd, 0x00, 0x5a, + 0xff, 0xe1, 0x00, 0x5d, 0xff, 0xe1, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x99, + 0xff, 0xdc, 0x00, 0x9b, 0xff, 0xdd, 0x00, 0xbb, 0xff, 0xdc, 0x00, 0xbd, + 0xff, 0xe1, 0x00, 0xbf, 0xff, 0xe6, 0x00, 0xc1, 0xff, 0xc1, 0x00, 0xc2, + 0xff, 0xeb, 0x00, 0xc3, 0xff, 0xe9, 0x00, 0xc5, 0xff, 0xf0, 0x00, 0xc6, + 0xff, 0xe7, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0xca, + 0xff, 0xe3, 0x00, 0xcb, 0xff, 0xdd, 0x00, 0xcc, 0xff, 0xce, 0x00, 0xcd, + 0xff, 0xd4, 0x00, 0xce, 0xff, 0xdb, 0x00, 0xec, 0xff, 0xc1, 0x00, 0xf0, + 0xff, 0xc1, 0x00, 0xf1, 0xff, 0xc1, 0x00, 0xf3, 0xff, 0xc1, 0x00, 0xf4, + 0xff, 0xc1, 0x00, 0xf5, 0xff, 0xc1, 0x00, 0xf7, 0xff, 0xdc, 0x00, 0xf8, + 0xff, 0xc1, 0x00, 0xfa, 0xff, 0xc1, 0x00, 0xfb, 0xff, 0xc1, 0x00, 0xfe, + 0xff, 0xc1, 0x01, 0x00, 0xff, 0xc1, 0x01, 0x03, 0xff, 0xdc, 0x01, 0x05, + 0xff, 0xc1, 0x01, 0x18, 0xff, 0xd6, 0x01, 0x1a, 0xff, 0xe1, 0x01, 0x1e, + 0xff, 0xdc, 0x01, 0x22, 0xff, 0xdc, 0x01, 0x2b, 0xff, 0xc1, 0x01, 0x36, + 0xff, 0xc1, 0x01, 0x3c, 0xff, 0xc1, 0x01, 0x3e, 0xff, 0xc1, 0x01, 0x42, + 0xff, 0xdc, 0x01, 0x53, 0xff, 0xc1, 0x01, 0x55, 0xff, 0xc1, 0x01, 0x57, + 0xff, 0xc1, 0x01, 0x5c, 0xff, 0xc1, 0x01, 0x60, 0xff, 0xdc, 0x01, 0x61, + 0xff, 0xdc, 0x01, 0x6b, 0xff, 0xdc, 0x02, 0xa1, 0xff, 0xdc, 0x02, 0xa2, + 0xff, 0xdc, 0x02, 0xa3, 0xff, 0xdc, 0x02, 0xa4, 0xff, 0xdc, 0x02, 0xa5, + 0xff, 0xdc, 0x02, 0xaa, 0xff, 0xc1, 0x02, 0xab, 0xff, 0xd6, 0x02, 0xac, + 0xff, 0xd6, 0x02, 0xad, 0xff, 0xd6, 0x02, 0xae, 0xff, 0xd6, 0x02, 0xaf, + 0xff, 0xd6, 0x02, 0xb0, 0xff, 0xdd, 0x02, 0xb1, 0xff, 0xdd, 0x02, 0xb2, + 0xff, 0xdd, 0x02, 0xb3, 0xff, 0xdd, 0x02, 0xb4, 0xff, 0xe1, 0x02, 0xb5, + 0xff, 0xe1, 0x02, 0xbd, 0xff, 0xdc, 0x02, 0xbf, 0xff, 0xdc, 0x02, 0xc1, + 0xff, 0xdc, 0x02, 0xc3, 0xff, 0xdc, 0x02, 0xc5, 0xff, 0xdc, 0x02, 0xc7, + 0xff, 0xdc, 0x02, 0xc9, 0xff, 0xdc, 0x02, 0xcb, 0xff, 0xdc, 0x02, 0xcd, + 0xff, 0xdc, 0x02, 0xcf, 0xff, 0xdc, 0x02, 0xd1, 0xff, 0xdc, 0x02, 0xd3, + 0xff, 0xdc, 0x02, 0xd5, 0xff, 0xdc, 0x02, 0xd7, 0xff, 0xdc, 0x02, 0xf2, + 0xff, 0xc1, 0x02, 0xf4, 0xff, 0xc1, 0x02, 0xf6, 0xff, 0xc1, 0x02, 0xf7, + 0xff, 0xc1, 0x02, 0xf9, 0xff, 0xd6, 0x02, 0xfb, 0xff, 0xd6, 0x02, 0xfd, + 0xff, 0xd6, 0x03, 0x15, 0xff, 0xdd, 0x03, 0x17, 0xff, 0xdd, 0x03, 0x19, + 0xff, 0xdd, 0x03, 0x1b, 0xff, 0xdd, 0x03, 0x1d, 0xff, 0xdd, 0x03, 0x1f, + 0xff, 0xdd, 0x03, 0x23, 0xff, 0xe1, 0x03, 0x9e, 0xff, 0xdc, 0x03, 0xa0, + 0xff, 0xc1, 0x03, 0xa2, 0xff, 0xdd, 0x03, 0xa4, 0xff, 0xd6, 0x03, 0xa6, + 0xff, 0xe1, 0x03, 0xa9, 0xff, 0xdd, 0x03, 0xaa, 0xff, 0xd6, 0x03, 0xab, + 0xff, 0xdd, 0x03, 0xc4, 0xff, 0xdc, 0x03, 0xc5, 0xff, 0xc1, 0x03, 0xc6, + 0xff, 0xd6, 0x03, 0xc7, 0xff, 0xc1, 0x03, 0xc8, 0xff, 0xdc, 0x03, 0xc9, + 0xff, 0xe1, 0x03, 0xcb, 0xff, 0xdc, 0x03, 0xcc, 0xff, 0xc1, 0x03, 0xd1, + 0xff, 0xc1, 0x03, 0xd2, 0xff, 0xe1, 0x03, 0xda, 0xff, 0xe1, 0x03, 0xe1, + 0xff, 0xc1, 0x03, 0xe6, 0xff, 0xdc, 0x03, 0xe7, 0xff, 0xc1, 0x03, 0xeb, + 0xff, 0xe1, 0x03, 0xec, 0xff, 0xdc, 0x03, 0xf1, 0xff, 0xdc, 0x03, 0xf3, + 0xff, 0xe1, 0x03, 0xff, 0xff, 0xdc, 0x04, 0x01, 0xff, 0xdc, 0x04, 0x02, + 0xff, 0xdc, 0x04, 0x08, 0xff, 0xc1, 0x04, 0x0a, 0xff, 0xc1, 0x04, 0x0c, + 0xff, 0xd6, 0x04, 0x0e, 0xff, 0xdc, 0x04, 0x10, 0xff, 0xd6, 0x04, 0x14, + 0xff, 0xe1, 0x04, 0x16, 0xff, 0xe1, 0x04, 0x18, 0xff, 0xe1, 0x04, 0x1c, + 0xff, 0xc1, 0x04, 0x1d, 0xff, 0xdc, 0x04, 0x37, 0xff, 0xdc, 0x04, 0x39, + 0xff, 0xdc, 0x04, 0x3b, 0xff, 0xdc, 0x04, 0x3d, 0xff, 0xdc, 0x04, 0x3f, + 0xff, 0xdc, 0x04, 0x41, 0xff, 0xdc, 0x04, 0x43, 0xff, 0xdc, 0x04, 0x45, + 0xff, 0xdc, 0x04, 0x4b, 0xff, 0xd6, 0x04, 0x4d, 0xff, 0xd6, 0x04, 0x4f, + 0xff, 0xd6, 0x04, 0x51, 0xff, 0xd6, 0x04, 0x53, 0xff, 0xd6, 0x04, 0x55, + 0xff, 0xd6, 0x04, 0x57, 0xff, 0xd6, 0x04, 0x59, 0xff, 0xdc, 0x04, 0x5b, + 0xff, 0xdc, 0x04, 0x5d, 0xff, 0xdc, 0x04, 0x5f, 0xff, 0xd6, 0x04, 0x61, + 0xff, 0xdc, 0x04, 0x63, 0xff, 0xdd, 0x04, 0x65, 0xff, 0xdd, 0x04, 0x67, + 0xff, 0xdd, 0x04, 0x69, 0xff, 0xdd, 0x04, 0x6b, 0xff, 0xdd, 0x04, 0x6d, + 0xff, 0xdd, 0x04, 0x6f, 0xff, 0xdd, 0x04, 0x71, 0xff, 0xe1, 0x04, 0x73, + 0xff, 0xe1, 0x04, 0x75, 0xff, 0xe1, 0x04, 0x7c, 0xff, 0xc1, 0x04, 0x98, + 0xff, 0xc1, 0x04, 0x9c, 0xff, 0xdc, 0x04, 0xa0, 0xff, 0xd6, 0x04, 0xa4, + 0xff, 0xdd, 0x04, 0xa9, 0xff, 0xdc, 0x04, 0xab, 0xff, 0xdc, 0x04, 0xb5, + 0xff, 0xc1, 0x04, 0xb7, 0xff, 0xc1, 0x04, 0xc3, 0xff, 0xe1, 0x04, 0xc5, + 0xff, 0xe1, 0x00, 0x7c, 0x00, 0x06, 0xff, 0xda, 0x00, 0x0b, 0xff, 0xda, + 0x00, 0x47, 0xff, 0xf0, 0x00, 0x48, 0xff, 0xf0, 0x00, 0x49, 0xff, 0xf0, + 0x00, 0x4b, 0xff, 0xf0, 0x00, 0x55, 0xff, 0xf0, 0x00, 0x59, 0xff, 0xef, + 0x00, 0x5a, 0xff, 0xdc, 0x00, 0x5d, 0xff, 0xdc, 0x00, 0x94, 0xff, 0xf0, + 0x00, 0x99, 0xff, 0xf0, 0x00, 0x9b, 0xff, 0xef, 0x00, 0xbb, 0xff, 0xf0, + 0x00, 0xbd, 0xff, 0xdc, 0x00, 0xc2, 0xff, 0xec, 0x00, 0xc4, 0x00, 0x0f, + 0x00, 0xc6, 0xff, 0xea, 0x00, 0xc8, 0xff, 0xf0, 0x00, 0xc9, 0xff, 0xf0, + 0x00, 0xca, 0xff, 0xce, 0x00, 0xcb, 0xff, 0xef, 0x00, 0xcc, 0xff, 0xe7, + 0x00, 0xf7, 0xff, 0xf0, 0x01, 0x03, 0xff, 0xf0, 0x01, 0x1a, 0xff, 0xdc, + 0x01, 0x1e, 0xff, 0xf0, 0x01, 0x22, 0xff, 0xf0, 0x01, 0x42, 0xff, 0xf0, + 0x01, 0x60, 0xff, 0xf0, 0x01, 0x61, 0xff, 0xf0, 0x01, 0x6b, 0xff, 0xf0, + 0x01, 0x84, 0xff, 0xda, 0x01, 0x85, 0xff, 0xda, 0x01, 0x87, 0xff, 0xda, + 0x01, 0x88, 0xff, 0xda, 0x01, 0x89, 0xff, 0xda, 0x02, 0xa1, 0xff, 0xf0, + 0x02, 0xa2, 0xff, 0xf0, 0x02, 0xa3, 0xff, 0xf0, 0x02, 0xa4, 0xff, 0xf0, + 0x02, 0xa5, 0xff, 0xf0, 0x02, 0xb0, 0xff, 0xef, 0x02, 0xb1, 0xff, 0xef, + 0x02, 0xb2, 0xff, 0xef, 0x02, 0xb3, 0xff, 0xef, 0x02, 0xb4, 0xff, 0xdc, + 0x02, 0xb5, 0xff, 0xdc, 0x02, 0xbd, 0xff, 0xf0, 0x02, 0xbf, 0xff, 0xf0, + 0x02, 0xc1, 0xff, 0xf0, 0x02, 0xc3, 0xff, 0xf0, 0x02, 0xc5, 0xff, 0xf0, + 0x02, 0xc7, 0xff, 0xf0, 0x02, 0xc9, 0xff, 0xf0, 0x02, 0xcb, 0xff, 0xf0, + 0x02, 0xcd, 0xff, 0xf0, 0x02, 0xcf, 0xff, 0xf0, 0x02, 0xd1, 0xff, 0xf0, + 0x02, 0xd3, 0xff, 0xf0, 0x02, 0xd5, 0xff, 0xf0, 0x02, 0xd7, 0xff, 0xf0, + 0x03, 0x15, 0xff, 0xef, 0x03, 0x17, 0xff, 0xef, 0x03, 0x19, 0xff, 0xef, + 0x03, 0x1b, 0xff, 0xef, 0x03, 0x1d, 0xff, 0xef, 0x03, 0x1f, 0xff, 0xef, + 0x03, 0x23, 0xff, 0xdc, 0x03, 0x9e, 0xff, 0xf0, 0x03, 0xa2, 0xff, 0xef, + 0x03, 0xa6, 0xff, 0xdc, 0x03, 0xa9, 0xff, 0xef, 0x03, 0xab, 0xff, 0xef, + 0x03, 0xc4, 0xff, 0xf0, 0x03, 0xc8, 0xff, 0xf0, 0x03, 0xc9, 0xff, 0xdc, + 0x03, 0xcb, 0xff, 0xf0, 0x03, 0xd2, 0xff, 0xdc, 0x03, 0xda, 0xff, 0xdc, + 0x03, 0xdb, 0xff, 0xda, 0x03, 0xdc, 0xff, 0xda, 0x03, 0xdf, 0xff, 0xda, + 0x03, 0xe6, 0xff, 0xf0, 0x03, 0xeb, 0xff, 0xdc, 0x03, 0xec, 0xff, 0xf0, + 0x03, 0xf1, 0xff, 0xf0, 0x03, 0xf3, 0xff, 0xdc, 0x03, 0xff, 0xff, 0xf0, + 0x04, 0x01, 0xff, 0xf0, 0x04, 0x02, 0xff, 0xf0, 0x04, 0x0e, 0xff, 0xf0, + 0x04, 0x14, 0xff, 0xdc, 0x04, 0x16, 0xff, 0xdc, 0x04, 0x18, 0xff, 0xdc, + 0x04, 0x1d, 0xff, 0xf0, 0x04, 0x37, 0xff, 0xf0, 0x04, 0x39, 0xff, 0xf0, + 0x04, 0x3b, 0xff, 0xf0, 0x04, 0x3d, 0xff, 0xf0, 0x04, 0x3f, 0xff, 0xf0, + 0x04, 0x41, 0xff, 0xf0, 0x04, 0x43, 0xff, 0xf0, 0x04, 0x45, 0xff, 0xf0, + 0x04, 0x59, 0xff, 0xf0, 0x04, 0x5b, 0xff, 0xf0, 0x04, 0x5d, 0xff, 0xf0, + 0x04, 0x61, 0xff, 0xf0, 0x04, 0x63, 0xff, 0xef, 0x04, 0x65, 0xff, 0xef, + 0x04, 0x67, 0xff, 0xef, 0x04, 0x69, 0xff, 0xef, 0x04, 0x6b, 0xff, 0xef, + 0x04, 0x6d, 0xff, 0xef, 0x04, 0x6f, 0xff, 0xef, 0x04, 0x71, 0xff, 0xdc, + 0x04, 0x73, 0xff, 0xdc, 0x04, 0x75, 0xff, 0xdc, 0x04, 0x9c, 0xff, 0xf0, + 0x04, 0xa4, 0xff, 0xef, 0x04, 0xa9, 0xff, 0xf0, 0x04, 0xab, 0xff, 0xf0, + 0x04, 0xc3, 0xff, 0xdc, 0x04, 0xc5, 0xff, 0xdc, 0x00, 0x47, 0x00, 0x10, + 0x00, 0x0c, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x47, 0xff, 0xe7, 0x00, 0x48, + 0xff, 0xe7, 0x00, 0x49, 0xff, 0xe7, 0x00, 0x4b, 0xff, 0xe7, 0x00, 0x55, + 0xff, 0xe7, 0x00, 0x94, 0xff, 0xe7, 0x00, 0x99, 0xff, 0xe7, 0x00, 0xbb, + 0xff, 0xe7, 0x00, 0xc4, 0x00, 0x0f, 0x00, 0xc8, 0xff, 0xe7, 0x00, 0xc9, + 0xff, 0xe7, 0x00, 0xf7, 0xff, 0xe7, 0x01, 0x03, 0xff, 0xe7, 0x01, 0x1e, + 0xff, 0xe7, 0x01, 0x22, 0xff, 0xe7, 0x01, 0x42, 0xff, 0xe7, 0x01, 0x60, + 0xff, 0xe7, 0x01, 0x61, 0xff, 0xe7, 0x01, 0x6b, 0xff, 0xe7, 0x01, 0x86, + 0x00, 0x0c, 0x01, 0x8a, 0x00, 0x0c, 0x01, 0x8e, 0x00, 0x0c, 0x01, 0x8f, + 0x00, 0x0c, 0x02, 0xa1, 0xff, 0xe7, 0x02, 0xa2, 0xff, 0xe7, 0x02, 0xa3, + 0xff, 0xe7, 0x02, 0xa4, 0xff, 0xe7, 0x02, 0xa5, 0xff, 0xe7, 0x02, 0xbd, + 0xff, 0xe7, 0x02, 0xbf, 0xff, 0xe7, 0x02, 0xc1, 0xff, 0xe7, 0x02, 0xc3, + 0xff, 0xe7, 0x02, 0xc5, 0xff, 0xe7, 0x02, 0xc7, 0xff, 0xe7, 0x02, 0xc9, + 0xff, 0xe7, 0x02, 0xcb, 0xff, 0xe7, 0x02, 0xcd, 0xff, 0xe7, 0x02, 0xcf, + 0xff, 0xe7, 0x02, 0xd1, 0xff, 0xe7, 0x02, 0xd3, 0xff, 0xe7, 0x02, 0xd5, + 0xff, 0xe7, 0x02, 0xd7, 0xff, 0xe7, 0x03, 0x9e, 0xff, 0xe7, 0x03, 0xc4, + 0xff, 0xe7, 0x03, 0xc8, 0xff, 0xe7, 0x03, 0xcb, 0xff, 0xe7, 0x03, 0xe6, + 0xff, 0xe7, 0x03, 0xec, 0xff, 0xe7, 0x03, 0xf1, 0xff, 0xe7, 0x03, 0xff, + 0xff, 0xe7, 0x04, 0x01, 0xff, 0xe7, 0x04, 0x02, 0xff, 0xe7, 0x04, 0x0e, + 0xff, 0xe7, 0x04, 0x1d, 0xff, 0xe7, 0x04, 0x37, 0xff, 0xe7, 0x04, 0x39, + 0xff, 0xe7, 0x04, 0x3b, 0xff, 0xe7, 0x04, 0x3d, 0xff, 0xe7, 0x04, 0x3f, + 0xff, 0xe7, 0x04, 0x41, 0xff, 0xe7, 0x04, 0x43, 0xff, 0xe7, 0x04, 0x45, + 0xff, 0xe7, 0x04, 0x59, 0xff, 0xe7, 0x04, 0x5b, 0xff, 0xe7, 0x04, 0x5d, + 0xff, 0xe7, 0x04, 0x61, 0xff, 0xe7, 0x04, 0x9c, 0xff, 0xe7, 0x04, 0xa9, + 0xff, 0xe7, 0x04, 0xab, 0xff, 0xe7, 0x00, 0x06, 0x00, 0xca, 0xff, 0xea, + 0x00, 0xed, 0xff, 0xee, 0x00, 0xf6, 0xff, 0xd5, 0x00, 0xfe, 0xff, 0xed, + 0x01, 0x3a, 0xff, 0xec, 0x01, 0x6d, 0xff, 0xec, 0x00, 0x01, 0x00, 0xf6, + 0xff, 0xc0, 0x00, 0x01, 0x00, 0xca, 0x00, 0x20, 0x00, 0xbe, 0x00, 0x06, + 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x47, 0xff, 0xe8, 0x00, 0x48, + 0xff, 0xe8, 0x00, 0x49, 0xff, 0xe8, 0x00, 0x4a, 0x00, 0x0c, 0x00, 0x4b, + 0xff, 0xe8, 0x00, 0x53, 0xff, 0xea, 0x00, 0x55, 0xff, 0xe8, 0x00, 0x5a, + 0x00, 0x0b, 0x00, 0x5d, 0x00, 0x0b, 0x00, 0x94, 0xff, 0xe8, 0x00, 0x99, + 0xff, 0xe8, 0x00, 0xbb, 0xff, 0xe8, 0x00, 0xbd, 0x00, 0x0b, 0x00, 0xc4, + 0xff, 0x90, 0x00, 0xc6, 0x00, 0x0b, 0x00, 0xc8, 0xff, 0xe8, 0x00, 0xc9, + 0xff, 0xe8, 0x00, 0xca, 0x00, 0x0c, 0x00, 0xf7, 0xff, 0xe8, 0x01, 0x03, + 0xff, 0xe8, 0x01, 0x18, 0xff, 0xea, 0x01, 0x1a, 0x00, 0x0b, 0x01, 0x1e, + 0xff, 0xe8, 0x01, 0x22, 0xff, 0xe8, 0x01, 0x42, 0xff, 0xe8, 0x01, 0x60, + 0xff, 0xe8, 0x01, 0x61, 0xff, 0xe8, 0x01, 0x6b, 0xff, 0xe8, 0x01, 0x84, + 0x00, 0x0c, 0x01, 0x85, 0x00, 0x0c, 0x01, 0x87, 0x00, 0x0c, 0x01, 0x88, + 0x00, 0x0c, 0x01, 0x89, 0x00, 0x0c, 0x01, 0xd3, 0x00, 0x0d, 0x01, 0xd6, + 0x00, 0x0d, 0x01, 0xd8, 0x00, 0x0e, 0x01, 0xd9, 0xff, 0xf5, 0x01, 0xdb, + 0xff, 0xec, 0x01, 0xdd, 0xff, 0xed, 0x01, 0xe5, 0xff, 0xec, 0x01, 0xeb, + 0xff, 0xbf, 0x01, 0xec, 0xff, 0xed, 0x01, 0xed, 0xff, 0xbf, 0x01, 0xf4, + 0x00, 0x0e, 0x01, 0xf5, 0xff, 0xed, 0x01, 0xf8, 0x00, 0x0e, 0x02, 0x10, + 0x00, 0x0e, 0x02, 0x11, 0xff, 0xed, 0x02, 0x12, 0x00, 0x0d, 0x02, 0x14, + 0x00, 0x0e, 0x02, 0x1a, 0xff, 0xed, 0x02, 0x31, 0xff, 0xee, 0x02, 0x33, + 0xff, 0xbf, 0x02, 0xa1, 0xff, 0xe8, 0x02, 0xa2, 0xff, 0xe8, 0x02, 0xa3, + 0xff, 0xe8, 0x02, 0xa4, 0xff, 0xe8, 0x02, 0xa5, 0xff, 0xe8, 0x02, 0xab, + 0xff, 0xea, 0x02, 0xac, 0xff, 0xea, 0x02, 0xad, 0xff, 0xea, 0x02, 0xae, + 0xff, 0xea, 0x02, 0xaf, 0xff, 0xea, 0x02, 0xb4, 0x00, 0x0b, 0x02, 0xb5, + 0x00, 0x0b, 0x02, 0xbd, 0xff, 0xe8, 0x02, 0xbf, 0xff, 0xe8, 0x02, 0xc1, + 0xff, 0xe8, 0x02, 0xc3, 0xff, 0xe8, 0x02, 0xc5, 0xff, 0xe8, 0x02, 0xc7, + 0xff, 0xe8, 0x02, 0xc9, 0xff, 0xe8, 0x02, 0xcb, 0xff, 0xe8, 0x02, 0xcd, + 0xff, 0xe8, 0x02, 0xcf, 0xff, 0xe8, 0x02, 0xd1, 0xff, 0xe8, 0x02, 0xd3, + 0xff, 0xe8, 0x02, 0xd5, 0xff, 0xe8, 0x02, 0xd7, 0xff, 0xe8, 0x02, 0xf9, + 0xff, 0xea, 0x02, 0xfb, 0xff, 0xea, 0x02, 0xfd, 0xff, 0xea, 0x03, 0x23, + 0x00, 0x0b, 0x03, 0x32, 0xff, 0xbf, 0x03, 0x33, 0xff, 0xbf, 0x03, 0x34, + 0xff, 0xbf, 0x03, 0x35, 0xff, 0xbf, 0x03, 0x36, 0xff, 0xbf, 0x03, 0x37, + 0xff, 0xbf, 0x03, 0x38, 0xff, 0xbf, 0x03, 0x39, 0xff, 0xed, 0x03, 0x43, + 0xff, 0xed, 0x03, 0x44, 0xff, 0xed, 0x03, 0x45, 0xff, 0xed, 0x03, 0x46, + 0xff, 0xed, 0x03, 0x47, 0xff, 0xed, 0x03, 0x4c, 0x00, 0x0d, 0x03, 0x4d, + 0xff, 0xbf, 0x03, 0x4e, 0xff, 0xbf, 0x03, 0x4f, 0xff, 0xbf, 0x03, 0x50, + 0xff, 0xed, 0x03, 0x51, 0xff, 0xed, 0x03, 0x52, 0xff, 0xed, 0x03, 0x53, + 0xff, 0xed, 0x03, 0x5a, 0xff, 0xed, 0x03, 0x5b, 0xff, 0xed, 0x03, 0x5c, + 0xff, 0xed, 0x03, 0x5d, 0xff, 0xed, 0x03, 0x6d, 0xff, 0xed, 0x03, 0x6e, + 0xff, 0xed, 0x03, 0x6f, 0xff, 0xed, 0x03, 0x73, 0xff, 0xf5, 0x03, 0x74, + 0xff, 0xf5, 0x03, 0x75, 0xff, 0xf5, 0x03, 0x76, 0xff, 0xf5, 0x03, 0x78, + 0x00, 0x0e, 0x03, 0x81, 0x00, 0x0d, 0x03, 0x82, 0x00, 0x0d, 0x03, 0x9e, + 0xff, 0xe8, 0x03, 0xa4, 0xff, 0xea, 0x03, 0xa6, 0x00, 0x0b, 0x03, 0xaa, + 0xff, 0xea, 0x03, 0xc4, 0xff, 0xe8, 0x03, 0xc6, 0xff, 0xea, 0x03, 0xc8, + 0xff, 0xe8, 0x03, 0xc9, 0x00, 0x0b, 0x03, 0xcb, 0xff, 0xe8, 0x03, 0xd2, + 0x00, 0x0b, 0x03, 0xda, 0x00, 0x0b, 0x03, 0xdb, 0x00, 0x0c, 0x03, 0xdc, + 0x00, 0x0c, 0x03, 0xdf, 0x00, 0x0c, 0x03, 0xe6, 0xff, 0xe8, 0x03, 0xeb, + 0x00, 0x0b, 0x03, 0xec, 0xff, 0xe8, 0x03, 0xf1, 0xff, 0xe8, 0x03, 0xf3, + 0x00, 0x0b, 0x03, 0xff, 0xff, 0xe8, 0x04, 0x01, 0xff, 0xe8, 0x04, 0x02, + 0xff, 0xe8, 0x04, 0x0c, 0xff, 0xea, 0x04, 0x0e, 0xff, 0xe8, 0x04, 0x10, + 0xff, 0xea, 0x04, 0x14, 0x00, 0x0b, 0x04, 0x16, 0x00, 0x0b, 0x04, 0x18, + 0x00, 0x0b, 0x04, 0x1d, 0xff, 0xe8, 0x04, 0x37, 0xff, 0xe8, 0x04, 0x39, + 0xff, 0xe8, 0x04, 0x3b, 0xff, 0xe8, 0x04, 0x3d, 0xff, 0xe8, 0x04, 0x3f, + 0xff, 0xe8, 0x04, 0x41, 0xff, 0xe8, 0x04, 0x43, 0xff, 0xe8, 0x04, 0x45, + 0xff, 0xe8, 0x04, 0x4b, 0xff, 0xea, 0x04, 0x4d, 0xff, 0xea, 0x04, 0x4f, + 0xff, 0xea, 0x04, 0x51, 0xff, 0xea, 0x04, 0x53, 0xff, 0xea, 0x04, 0x55, + 0xff, 0xea, 0x04, 0x57, 0xff, 0xea, 0x04, 0x59, 0xff, 0xe8, 0x04, 0x5b, + 0xff, 0xe8, 0x04, 0x5d, 0xff, 0xe8, 0x04, 0x5f, 0xff, 0xea, 0x04, 0x61, + 0xff, 0xe8, 0x04, 0x71, 0x00, 0x0b, 0x04, 0x73, 0x00, 0x0b, 0x04, 0x75, + 0x00, 0x0b, 0x04, 0x9c, 0xff, 0xe8, 0x04, 0xa0, 0xff, 0xea, 0x04, 0xa9, + 0xff, 0xe8, 0x04, 0xab, 0xff, 0xe8, 0x04, 0xc3, 0x00, 0x0b, 0x04, 0xc5, + 0x00, 0x0b, 0x04, 0xcb, 0xff, 0xbf, 0x04, 0xcf, 0xff, 0xed, 0x04, 0xd0, + 0x00, 0x0d, 0x04, 0xd2, 0xff, 0xbf, 0x04, 0xde, 0x00, 0x0d, 0x04, 0xe1, + 0x00, 0x0d, 0x04, 0xea, 0xff, 0xbf, 0x04, 0xf1, 0xff, 0xed, 0x04, 0xf4, + 0xff, 0xed, 0x04, 0xf5, 0x00, 0x0e, 0x04, 0xf9, 0xff, 0xed, 0x04, 0xfa, + 0x00, 0x0d, 0x00, 0x01, 0x00, 0xf6, 0xff, 0xe2, 0x00, 0x0e, 0x00, 0x5c, + 0xff, 0xed, 0x00, 0x5e, 0xff, 0xed, 0x00, 0xee, 0xff, 0xed, 0x00, 0xf6, + 0xff, 0xc0, 0x01, 0x34, 0xff, 0xed, 0x01, 0x44, 0xff, 0xed, 0x01, 0x5e, + 0xff, 0xed, 0x03, 0x26, 0xff, 0xed, 0x03, 0x28, 0xff, 0xed, 0x03, 0x2a, + 0xff, 0xed, 0x03, 0xca, 0xff, 0xed, 0x03, 0xf6, 0xff, 0xed, 0x04, 0x04, + 0xff, 0xed, 0x04, 0xc9, 0xff, 0xed, 0x00, 0x0d, 0x00, 0x5c, 0xff, 0xf2, + 0x00, 0x5e, 0xff, 0xf2, 0x00, 0xee, 0xff, 0xf2, 0x01, 0x34, 0xff, 0xf2, + 0x01, 0x44, 0xff, 0xf2, 0x01, 0x5e, 0xff, 0xf2, 0x03, 0x26, 0xff, 0xf2, + 0x03, 0x28, 0xff, 0xf2, 0x03, 0x2a, 0xff, 0xf2, 0x03, 0xca, 0xff, 0xf2, + 0x03, 0xf6, 0xff, 0xf2, 0x04, 0x04, 0xff, 0xf2, 0x04, 0xc9, 0xff, 0xf2, + 0x00, 0x22, 0x00, 0x5a, 0xff, 0xf4, 0x00, 0x5c, 0xff, 0xf2, 0x00, 0x5d, + 0xff, 0xf4, 0x00, 0x5e, 0xff, 0xf3, 0x00, 0xbd, 0xff, 0xf4, 0x00, 0xee, + 0xff, 0xf2, 0x01, 0x1a, 0xff, 0xf4, 0x01, 0x34, 0xff, 0xf2, 0x01, 0x44, + 0xff, 0xf2, 0x01, 0x5e, 0xff, 0xf2, 0x02, 0xb4, 0xff, 0xf4, 0x02, 0xb5, + 0xff, 0xf4, 0x03, 0x23, 0xff, 0xf4, 0x03, 0x26, 0xff, 0xf3, 0x03, 0x28, + 0xff, 0xf3, 0x03, 0x2a, 0xff, 0xf3, 0x03, 0xa6, 0xff, 0xf4, 0x03, 0xc9, + 0xff, 0xf4, 0x03, 0xca, 0xff, 0xf2, 0x03, 0xd2, 0xff, 0xf4, 0x03, 0xda, + 0xff, 0xf4, 0x03, 0xeb, 0xff, 0xf4, 0x03, 0xf3, 0xff, 0xf4, 0x03, 0xf6, + 0xff, 0xf2, 0x04, 0x04, 0xff, 0xf2, 0x04, 0x14, 0xff, 0xf4, 0x04, 0x16, + 0xff, 0xf4, 0x04, 0x18, 0xff, 0xf4, 0x04, 0x71, 0xff, 0xf4, 0x04, 0x73, + 0xff, 0xf4, 0x04, 0x75, 0xff, 0xf4, 0x04, 0xc3, 0xff, 0xf4, 0x04, 0xc5, + 0xff, 0xf4, 0x04, 0xc9, 0xff, 0xf3, 0x00, 0x62, 0x00, 0x06, 0xff, 0xca, + 0x00, 0x0b, 0xff, 0xca, 0x00, 0x38, 0xff, 0xd2, 0x00, 0x3a, 0xff, 0xd4, + 0x00, 0x3c, 0xff, 0xf4, 0x00, 0x3d, 0xff, 0xd3, 0x00, 0x5a, 0xff, 0xe6, + 0x00, 0x5c, 0xff, 0xef, 0x00, 0x5d, 0xff, 0xe6, 0x00, 0xbd, 0xff, 0xe6, + 0x00, 0xd2, 0xff, 0xd2, 0x00, 0xd6, 0xff, 0xd2, 0x00, 0xda, 0xff, 0xf4, + 0x00, 0xde, 0xff, 0xed, 0x00, 0xe1, 0xff, 0xe1, 0x00, 0xe6, 0xff, 0xd4, + 0x00, 0xee, 0xff, 0xef, 0x00, 0xf6, 0xff, 0xc9, 0x00, 0xfe, 0xff, 0xd1, + 0x01, 0x09, 0xff, 0xe5, 0x01, 0x19, 0xff, 0xd4, 0x01, 0x1a, 0xff, 0xe6, + 0x01, 0x20, 0xff, 0xe3, 0x01, 0x33, 0xff, 0xf4, 0x01, 0x34, 0xff, 0xef, + 0x01, 0x39, 0xff, 0xd2, 0x01, 0x3a, 0xff, 0xc4, 0x01, 0x43, 0xff, 0xf4, + 0x01, 0x44, 0xff, 0xef, 0x01, 0x45, 0xff, 0xd2, 0x01, 0x47, 0xff, 0xe1, + 0x01, 0x49, 0xff, 0xe1, 0x01, 0x5d, 0xff, 0xf4, 0x01, 0x5e, 0xff, 0xef, + 0x01, 0x62, 0xff, 0xd4, 0x01, 0x63, 0xff, 0xf5, 0x01, 0x64, 0xff, 0xe7, + 0x01, 0x6c, 0xff, 0x64, 0x01, 0x6d, 0xff, 0xc9, 0x01, 0x84, 0xff, 0xca, + 0x01, 0x85, 0xff, 0xca, 0x01, 0x87, 0xff, 0xca, 0x01, 0x88, 0xff, 0xca, + 0x01, 0x89, 0xff, 0xca, 0x02, 0x99, 0xff, 0xd3, 0x02, 0xb4, 0xff, 0xe6, + 0x02, 0xb5, 0xff, 0xe6, 0x03, 0x0e, 0xff, 0xd2, 0x03, 0x10, 0xff, 0xd2, + 0x03, 0x12, 0xff, 0xd2, 0x03, 0x22, 0xff, 0xd3, 0x03, 0x23, 0xff, 0xe6, + 0x03, 0x24, 0xff, 0xd3, 0x03, 0x8b, 0xff, 0xd3, 0x03, 0x9a, 0xff, 0xd3, + 0x03, 0x9b, 0xff, 0xf4, 0x03, 0x9d, 0xff, 0xd3, 0x03, 0xa6, 0xff, 0xe6, + 0x03, 0xb5, 0xff, 0xed, 0x03, 0xc1, 0xff, 0xd2, 0x03, 0xc2, 0xff, 0xf4, + 0x03, 0xc9, 0xff, 0xe6, 0x03, 0xca, 0xff, 0xef, 0x03, 0xd2, 0xff, 0xe6, + 0x03, 0xd9, 0xff, 0xd3, 0x03, 0xda, 0xff, 0xe6, 0x03, 0xdb, 0xff, 0xca, + 0x03, 0xdc, 0xff, 0xca, 0x03, 0xdf, 0xff, 0xca, 0x03, 0xea, 0xff, 0xd4, + 0x03, 0xeb, 0xff, 0xe6, 0x03, 0xf2, 0xff, 0xd3, 0x03, 0xf3, 0xff, 0xe6, + 0x03, 0xf5, 0xff, 0xf4, 0x03, 0xf6, 0xff, 0xef, 0x04, 0x03, 0xff, 0xf4, + 0x04, 0x04, 0xff, 0xef, 0x04, 0x13, 0xff, 0xed, 0x04, 0x14, 0xff, 0xe6, + 0x04, 0x15, 0xff, 0xed, 0x04, 0x16, 0xff, 0xe6, 0x04, 0x17, 0xff, 0xed, + 0x04, 0x18, 0xff, 0xe6, 0x04, 0x19, 0xff, 0xe1, 0x04, 0x70, 0xff, 0xd3, + 0x04, 0x71, 0xff, 0xe6, 0x04, 0x72, 0xff, 0xd3, 0x04, 0x73, 0xff, 0xe6, + 0x04, 0x74, 0xff, 0xd3, 0x04, 0x75, 0xff, 0xe6, 0x04, 0x77, 0xff, 0xd2, + 0x04, 0x79, 0xff, 0xe1, 0x04, 0x86, 0xff, 0xd3, 0x04, 0xbf, 0xff, 0xd2, + 0x04, 0xc2, 0xff, 0xd4, 0x04, 0xc3, 0xff, 0xe6, 0x04, 0xc4, 0xff, 0xd4, + 0x04, 0xc5, 0xff, 0xe6, 0x00, 0x72, 0x00, 0x06, 0xff, 0xc0, 0x00, 0x0b, + 0xff, 0xc0, 0x00, 0x38, 0xff, 0x9d, 0x00, 0x3a, 0xff, 0xc7, 0x00, 0x3c, + 0xff, 0xf0, 0x00, 0x3d, 0xff, 0xab, 0x00, 0x51, 0xff, 0xd2, 0x00, 0x52, + 0xff, 0xd2, 0x00, 0x54, 0xff, 0xd2, 0x00, 0xc1, 0xff, 0xd2, 0x00, 0xd2, + 0xff, 0x9d, 0x00, 0xd4, 0xff, 0xf5, 0x00, 0xd6, 0xff, 0x9d, 0x00, 0xda, + 0xff, 0xf0, 0x00, 0xdd, 0xff, 0xf5, 0x00, 0xde, 0xff, 0xea, 0x00, 0xe1, + 0xff, 0xe5, 0x00, 0xe6, 0xff, 0xc1, 0x00, 0xec, 0xff, 0xd2, 0x00, 0xf0, + 0xff, 0xd2, 0x00, 0xf1, 0xff, 0xd2, 0x00, 0xf3, 0xff, 0xd2, 0x00, 0xf4, + 0xff, 0xd2, 0x00, 0xf5, 0xff, 0xd2, 0x00, 0xf6, 0xff, 0xcd, 0x00, 0xf8, + 0xff, 0xd2, 0x00, 0xfa, 0xff, 0xd2, 0x00, 0xfb, 0xff, 0xd2, 0x00, 0xfe, + 0xff, 0xd2, 0x01, 0x00, 0xff, 0xd2, 0x01, 0x05, 0xff, 0xd2, 0x01, 0x19, + 0xff, 0xc7, 0x01, 0x2b, 0xff, 0xd2, 0x01, 0x33, 0xff, 0xf0, 0x01, 0x36, + 0xff, 0xd2, 0x01, 0x39, 0xff, 0x9d, 0x01, 0x3a, 0xff, 0xcc, 0x01, 0x3c, + 0xff, 0xd2, 0x01, 0x3e, 0xff, 0xd2, 0x01, 0x43, 0xff, 0xf0, 0x01, 0x45, + 0xff, 0x9d, 0x01, 0x47, 0xff, 0xe5, 0x01, 0x49, 0xff, 0xe5, 0x01, 0x4c, + 0xff, 0xdf, 0x01, 0x50, 0xff, 0xf5, 0x01, 0x53, 0xff, 0xd2, 0x01, 0x55, + 0xff, 0xd2, 0x01, 0x57, 0xff, 0xd2, 0x01, 0x5c, 0xff, 0xd2, 0x01, 0x5d, + 0xff, 0xf0, 0x01, 0x62, 0xff, 0xce, 0x01, 0x64, 0xff, 0xea, 0x01, 0x66, + 0xff, 0xf5, 0x01, 0x6c, 0xff, 0x9e, 0x01, 0x6d, 0xff, 0xce, 0x01, 0x6f, + 0xff, 0xf5, 0x01, 0x84, 0xff, 0xc0, 0x01, 0x85, 0xff, 0xc0, 0x01, 0x87, + 0xff, 0xc0, 0x01, 0x88, 0xff, 0xc0, 0x01, 0x89, 0xff, 0xc0, 0x02, 0x99, + 0xff, 0xab, 0x02, 0xaa, 0xff, 0xd2, 0x02, 0xf2, 0xff, 0xd2, 0x02, 0xf4, + 0xff, 0xd2, 0x02, 0xf6, 0xff, 0xd2, 0x02, 0xf7, 0xff, 0xd2, 0x03, 0x0e, + 0xff, 0x9d, 0x03, 0x10, 0xff, 0x9d, 0x03, 0x12, 0xff, 0x9d, 0x03, 0x22, + 0xff, 0xab, 0x03, 0x24, 0xff, 0xab, 0x03, 0x8b, 0xff, 0xab, 0x03, 0x9a, + 0xff, 0xab, 0x03, 0x9b, 0xff, 0xf0, 0x03, 0x9d, 0xff, 0xab, 0x03, 0xa0, + 0xff, 0xd2, 0x03, 0xb5, 0xff, 0xea, 0x03, 0xc1, 0xff, 0x9d, 0x03, 0xc2, + 0xff, 0xf0, 0x03, 0xc5, 0xff, 0xd2, 0x03, 0xc7, 0xff, 0xd2, 0x03, 0xcc, + 0xff, 0xd2, 0x03, 0xd1, 0xff, 0xd2, 0x03, 0xd9, 0xff, 0xab, 0x03, 0xdb, + 0xff, 0xc0, 0x03, 0xdc, 0xff, 0xc0, 0x03, 0xdf, 0xff, 0xc0, 0x03, 0xe1, + 0xff, 0xd2, 0x03, 0xe7, 0xff, 0xd2, 0x03, 0xea, 0xff, 0xc7, 0x03, 0xf2, + 0xff, 0xab, 0x03, 0xf5, 0xff, 0xf0, 0x04, 0x03, 0xff, 0xf0, 0x04, 0x08, + 0xff, 0xd2, 0x04, 0x0a, 0xff, 0xd2, 0x04, 0x13, 0xff, 0xea, 0x04, 0x15, + 0xff, 0xea, 0x04, 0x17, 0xff, 0xea, 0x04, 0x19, 0xff, 0xe5, 0x04, 0x1c, + 0xff, 0xd2, 0x04, 0x70, 0xff, 0xab, 0x04, 0x72, 0xff, 0xab, 0x04, 0x74, + 0xff, 0xab, 0x04, 0x77, 0xff, 0x9d, 0x04, 0x79, 0xff, 0xe5, 0x04, 0x7c, + 0xff, 0xd2, 0x04, 0x86, 0xff, 0xab, 0x04, 0x98, 0xff, 0xd2, 0x04, 0xb5, + 0xff, 0xd2, 0x04, 0xb7, 0xff, 0xd2, 0x04, 0xbf, 0xff, 0x9d, 0x04, 0xc2, + 0xff, 0xc7, 0x04, 0xc4, 0xff, 0xc7, 0x00, 0x75, 0x00, 0x06, 0xff, 0xb1, + 0x00, 0x0b, 0xff, 0xb1, 0x00, 0x38, 0xff, 0x9e, 0x00, 0x3a, 0xff, 0xc5, + 0x00, 0x3c, 0xff, 0xf2, 0x00, 0x3d, 0xff, 0xa8, 0x00, 0x51, 0xff, 0xcf, + 0x00, 0x52, 0xff, 0xcf, 0x00, 0x54, 0xff, 0xcf, 0x00, 0x5c, 0xff, 0xef, + 0x00, 0xc1, 0xff, 0xcf, 0x00, 0xd2, 0xff, 0x9e, 0x00, 0xd6, 0xff, 0x9e, + 0x00, 0xda, 0xff, 0xf2, 0x00, 0xde, 0xff, 0xec, 0x00, 0xe1, 0xff, 0xe1, + 0x00, 0xe6, 0xff, 0xc2, 0x00, 0xec, 0xff, 0xcf, 0x00, 0xee, 0xff, 0xef, + 0x00, 0xf0, 0xff, 0xcf, 0x00, 0xf1, 0xff, 0xcf, 0x00, 0xf3, 0xff, 0xcf, + 0x00, 0xf4, 0xff, 0xcf, 0x00, 0xf5, 0xff, 0xcf, 0x00, 0xf6, 0xff, 0xc6, + 0x00, 0xf8, 0xff, 0xcf, 0x00, 0xfa, 0xff, 0xcf, 0x00, 0xfb, 0xff, 0xcf, + 0x00, 0xfe, 0xff, 0xcf, 0x01, 0x00, 0xff, 0xcf, 0x01, 0x05, 0xff, 0xcf, + 0x01, 0x19, 0xff, 0xc5, 0x01, 0x2b, 0xff, 0xcf, 0x01, 0x33, 0xff, 0xf2, + 0x01, 0x34, 0xff, 0xef, 0x01, 0x36, 0xff, 0xcf, 0x01, 0x39, 0xff, 0x9e, + 0x01, 0x3a, 0xff, 0xc0, 0x01, 0x3c, 0xff, 0xcf, 0x01, 0x3e, 0xff, 0xcf, + 0x01, 0x43, 0xff, 0xf2, 0x01, 0x44, 0xff, 0xef, 0x01, 0x45, 0xff, 0x9e, + 0x01, 0x47, 0xff, 0xe1, 0x01, 0x49, 0xff, 0xe1, 0x01, 0x4c, 0xff, 0xdf, + 0x01, 0x53, 0xff, 0xcf, 0x01, 0x55, 0xff, 0xcf, 0x01, 0x57, 0xff, 0xcf, + 0x01, 0x5c, 0xff, 0xcf, 0x01, 0x5d, 0xff, 0xf2, 0x01, 0x5e, 0xff, 0xef, + 0x01, 0x62, 0xff, 0xcd, 0x01, 0x64, 0xff, 0xe8, 0x01, 0x6c, 0xff, 0x9f, + 0x01, 0x6d, 0xff, 0xc6, 0x01, 0x84, 0xff, 0xb1, 0x01, 0x85, 0xff, 0xb1, + 0x01, 0x87, 0xff, 0xb1, 0x01, 0x88, 0xff, 0xb1, 0x01, 0x89, 0xff, 0xb1, + 0x02, 0x99, 0xff, 0xa8, 0x02, 0xaa, 0xff, 0xcf, 0x02, 0xf2, 0xff, 0xcf, + 0x02, 0xf4, 0xff, 0xcf, 0x02, 0xf6, 0xff, 0xcf, 0x02, 0xf7, 0xff, 0xcf, + 0x03, 0x0e, 0xff, 0x9e, 0x03, 0x10, 0xff, 0x9e, 0x03, 0x12, 0xff, 0x9e, + 0x03, 0x22, 0xff, 0xa8, 0x03, 0x24, 0xff, 0xa8, 0x03, 0x8b, 0xff, 0xa8, + 0x03, 0x9a, 0xff, 0xa8, 0x03, 0x9b, 0xff, 0xf2, 0x03, 0x9d, 0xff, 0xa8, + 0x03, 0xa0, 0xff, 0xcf, 0x03, 0xb5, 0xff, 0xec, 0x03, 0xc1, 0xff, 0x9e, + 0x03, 0xc2, 0xff, 0xf2, 0x03, 0xc5, 0xff, 0xcf, 0x03, 0xc7, 0xff, 0xcf, + 0x03, 0xca, 0xff, 0xef, 0x03, 0xcc, 0xff, 0xcf, 0x03, 0xd1, 0xff, 0xcf, + 0x03, 0xd9, 0xff, 0xa8, 0x03, 0xdb, 0xff, 0xb1, 0x03, 0xdc, 0xff, 0xb1, + 0x03, 0xdf, 0xff, 0xb1, 0x03, 0xe1, 0xff, 0xcf, 0x03, 0xe7, 0xff, 0xcf, + 0x03, 0xea, 0xff, 0xc5, 0x03, 0xf2, 0xff, 0xa8, 0x03, 0xf5, 0xff, 0xf2, + 0x03, 0xf6, 0xff, 0xef, 0x04, 0x03, 0xff, 0xf2, 0x04, 0x04, 0xff, 0xef, + 0x04, 0x08, 0xff, 0xcf, 0x04, 0x0a, 0xff, 0xcf, 0x04, 0x13, 0xff, 0xec, + 0x04, 0x15, 0xff, 0xec, 0x04, 0x17, 0xff, 0xec, 0x04, 0x19, 0xff, 0xe1, + 0x04, 0x1c, 0xff, 0xcf, 0x04, 0x70, 0xff, 0xa8, 0x04, 0x72, 0xff, 0xa8, + 0x04, 0x74, 0xff, 0xa8, 0x04, 0x77, 0xff, 0x9e, 0x04, 0x79, 0xff, 0xe1, + 0x04, 0x7c, 0xff, 0xcf, 0x04, 0x86, 0xff, 0xa8, 0x04, 0x98, 0xff, 0xcf, + 0x04, 0xb5, 0xff, 0xcf, 0x04, 0xb7, 0xff, 0xcf, 0x04, 0xbf, 0xff, 0x9e, + 0x04, 0xc2, 0xff, 0xc5, 0x04, 0xc4, 0xff, 0xc5, 0x00, 0x53, 0x00, 0x38, + 0xff, 0xbe, 0x00, 0x51, 0xff, 0xe1, 0x00, 0x52, 0xff, 0xe1, 0x00, 0x54, + 0xff, 0xe1, 0x00, 0x5a, 0xff, 0xef, 0x00, 0x5d, 0xff, 0xef, 0x00, 0xbd, + 0xff, 0xef, 0x00, 0xc1, 0xff, 0xe1, 0x00, 0xd2, 0xff, 0xbe, 0x00, 0xd6, + 0xff, 0xbe, 0x00, 0xe6, 0xff, 0xc9, 0x00, 0xec, 0xff, 0xe1, 0x00, 0xf0, + 0xff, 0xe1, 0x00, 0xf1, 0xff, 0xe1, 0x00, 0xf3, 0xff, 0xe1, 0x00, 0xf4, + 0xff, 0xe1, 0x00, 0xf5, 0xff, 0xe1, 0x00, 0xf6, 0xff, 0xdf, 0x00, 0xf8, + 0xff, 0xe1, 0x00, 0xfa, 0xff, 0xe1, 0x00, 0xfb, 0xff, 0xe1, 0x00, 0xfe, + 0xff, 0xe1, 0x01, 0x00, 0xff, 0xe1, 0x01, 0x05, 0xff, 0xe1, 0x01, 0x09, + 0xff, 0xed, 0x01, 0x1a, 0xff, 0xef, 0x01, 0x20, 0xff, 0xeb, 0x01, 0x2b, + 0xff, 0xe1, 0x01, 0x36, 0xff, 0xe1, 0x01, 0x39, 0xff, 0xbe, 0x01, 0x3a, + 0xff, 0xdf, 0x01, 0x3c, 0xff, 0xe1, 0x01, 0x3e, 0xff, 0xe1, 0x01, 0x45, + 0xff, 0xbe, 0x01, 0x4c, 0xff, 0xe9, 0x01, 0x53, 0xff, 0xe1, 0x01, 0x55, + 0xff, 0xe1, 0x01, 0x57, 0xff, 0xe1, 0x01, 0x5c, 0xff, 0xe1, 0x01, 0x63, + 0xff, 0xf5, 0x01, 0x6d, 0xff, 0xe0, 0x02, 0xaa, 0xff, 0xe1, 0x02, 0xb4, + 0xff, 0xef, 0x02, 0xb5, 0xff, 0xef, 0x02, 0xf2, 0xff, 0xe1, 0x02, 0xf4, + 0xff, 0xe1, 0x02, 0xf6, 0xff, 0xe1, 0x02, 0xf7, 0xff, 0xe1, 0x03, 0x0e, + 0xff, 0xbe, 0x03, 0x10, 0xff, 0xbe, 0x03, 0x12, 0xff, 0xbe, 0x03, 0x23, + 0xff, 0xef, 0x03, 0xa0, 0xff, 0xe1, 0x03, 0xa6, 0xff, 0xef, 0x03, 0xc1, + 0xff, 0xbe, 0x03, 0xc5, 0xff, 0xe1, 0x03, 0xc7, 0xff, 0xe1, 0x03, 0xc9, + 0xff, 0xef, 0x03, 0xcc, 0xff, 0xe1, 0x03, 0xd1, 0xff, 0xe1, 0x03, 0xd2, + 0xff, 0xef, 0x03, 0xda, 0xff, 0xef, 0x03, 0xe1, 0xff, 0xe1, 0x03, 0xe7, + 0xff, 0xe1, 0x03, 0xeb, 0xff, 0xef, 0x03, 0xf3, 0xff, 0xef, 0x04, 0x08, + 0xff, 0xe1, 0x04, 0x0a, 0xff, 0xe1, 0x04, 0x14, 0xff, 0xef, 0x04, 0x16, + 0xff, 0xef, 0x04, 0x18, 0xff, 0xef, 0x04, 0x1c, 0xff, 0xe1, 0x04, 0x71, + 0xff, 0xef, 0x04, 0x73, 0xff, 0xef, 0x04, 0x75, 0xff, 0xef, 0x04, 0x77, + 0xff, 0xbe, 0x04, 0x7c, 0xff, 0xe1, 0x04, 0x98, 0xff, 0xe1, 0x04, 0xb5, + 0xff, 0xe1, 0x04, 0xb7, 0xff, 0xe1, 0x04, 0xbf, 0xff, 0xbe, 0x04, 0xc3, + 0xff, 0xef, 0x04, 0xc5, 0xff, 0xef, 0x00, 0x6a, 0x00, 0x38, 0xff, 0xe6, + 0x00, 0x3a, 0xff, 0xe7, 0x00, 0x3c, 0xff, 0xf2, 0x00, 0x3d, 0xff, 0xe7, + 0x00, 0x51, 0xff, 0xd6, 0x00, 0x52, 0xff, 0xd6, 0x00, 0x54, 0xff, 0xd6, + 0x00, 0x5c, 0xff, 0xf1, 0x00, 0xc1, 0xff, 0xd6, 0x00, 0xd2, 0xff, 0xe6, + 0x00, 0xd6, 0xff, 0xe6, 0x00, 0xda, 0xff, 0xf2, 0x00, 0xde, 0xff, 0xee, + 0x00, 0xe1, 0xff, 0xe8, 0x00, 0xe6, 0xff, 0xe6, 0x00, 0xec, 0xff, 0xd6, + 0x00, 0xee, 0xff, 0xf1, 0x00, 0xf0, 0xff, 0xd6, 0x00, 0xf1, 0xff, 0xd6, + 0x00, 0xf3, 0xff, 0xd6, 0x00, 0xf4, 0xff, 0xd6, 0x00, 0xf5, 0xff, 0xd6, + 0x00, 0xf6, 0xff, 0xd0, 0x00, 0xf8, 0xff, 0xd6, 0x00, 0xfa, 0xff, 0xd6, + 0x00, 0xfb, 0xff, 0xd6, 0x00, 0xfe, 0xff, 0xd6, 0x01, 0x00, 0xff, 0xd6, + 0x01, 0x05, 0xff, 0xd6, 0x01, 0x19, 0xff, 0xe7, 0x01, 0x2b, 0xff, 0xd6, + 0x01, 0x33, 0xff, 0xf2, 0x01, 0x34, 0xff, 0xf1, 0x01, 0x36, 0xff, 0xd6, + 0x01, 0x39, 0xff, 0xe6, 0x01, 0x3a, 0xff, 0xce, 0x01, 0x3c, 0xff, 0xd6, + 0x01, 0x3e, 0xff, 0xd6, 0x01, 0x43, 0xff, 0xf2, 0x01, 0x44, 0xff, 0xf1, + 0x01, 0x45, 0xff, 0xe6, 0x01, 0x47, 0xff, 0xe8, 0x01, 0x49, 0xff, 0xe8, + 0x01, 0x53, 0xff, 0xd6, 0x01, 0x55, 0xff, 0xd6, 0x01, 0x57, 0xff, 0xd6, + 0x01, 0x5c, 0xff, 0xd6, 0x01, 0x5d, 0xff, 0xf2, 0x01, 0x5e, 0xff, 0xf1, + 0x01, 0x62, 0xff, 0xe7, 0x01, 0x64, 0xff, 0xed, 0x01, 0x6c, 0xff, 0xe6, + 0x01, 0x6d, 0xff, 0xd0, 0x02, 0x99, 0xff, 0xe7, 0x02, 0xaa, 0xff, 0xd6, + 0x02, 0xf2, 0xff, 0xd6, 0x02, 0xf4, 0xff, 0xd6, 0x02, 0xf6, 0xff, 0xd6, + 0x02, 0xf7, 0xff, 0xd6, 0x03, 0x0e, 0xff, 0xe6, 0x03, 0x10, 0xff, 0xe6, + 0x03, 0x12, 0xff, 0xe6, 0x03, 0x22, 0xff, 0xe7, 0x03, 0x24, 0xff, 0xe7, + 0x03, 0x8b, 0xff, 0xe7, 0x03, 0x9a, 0xff, 0xe7, 0x03, 0x9b, 0xff, 0xf2, + 0x03, 0x9d, 0xff, 0xe7, 0x03, 0xa0, 0xff, 0xd6, 0x03, 0xb5, 0xff, 0xee, + 0x03, 0xc1, 0xff, 0xe6, 0x03, 0xc2, 0xff, 0xf2, 0x03, 0xc5, 0xff, 0xd6, + 0x03, 0xc7, 0xff, 0xd6, 0x03, 0xca, 0xff, 0xf1, 0x03, 0xcc, 0xff, 0xd6, + 0x03, 0xd1, 0xff, 0xd6, 0x03, 0xd9, 0xff, 0xe7, 0x03, 0xe1, 0xff, 0xd6, + 0x03, 0xe7, 0xff, 0xd6, 0x03, 0xea, 0xff, 0xe7, 0x03, 0xf2, 0xff, 0xe7, + 0x03, 0xf5, 0xff, 0xf2, 0x03, 0xf6, 0xff, 0xf1, 0x04, 0x03, 0xff, 0xf2, + 0x04, 0x04, 0xff, 0xf1, 0x04, 0x08, 0xff, 0xd6, 0x04, 0x0a, 0xff, 0xd6, + 0x04, 0x13, 0xff, 0xee, 0x04, 0x15, 0xff, 0xee, 0x04, 0x17, 0xff, 0xee, + 0x04, 0x19, 0xff, 0xe8, 0x04, 0x1c, 0xff, 0xd6, 0x04, 0x70, 0xff, 0xe7, + 0x04, 0x72, 0xff, 0xe7, 0x04, 0x74, 0xff, 0xe7, 0x04, 0x77, 0xff, 0xe6, + 0x04, 0x79, 0xff, 0xe8, 0x04, 0x7c, 0xff, 0xd6, 0x04, 0x86, 0xff, 0xe7, + 0x04, 0x98, 0xff, 0xd6, 0x04, 0xb5, 0xff, 0xd6, 0x04, 0xb7, 0xff, 0xd6, + 0x04, 0xbf, 0xff, 0xe6, 0x04, 0xc2, 0xff, 0xe7, 0x04, 0xc4, 0xff, 0xe7, + 0x00, 0x98, 0x00, 0x25, 0x00, 0x10, 0x00, 0x27, 0xff, 0xe8, 0x00, 0x2b, + 0xff, 0xe8, 0x00, 0x33, 0xff, 0xe8, 0x00, 0x35, 0xff, 0xe8, 0x00, 0x38, + 0xff, 0xe0, 0x00, 0x3a, 0xff, 0xe0, 0x00, 0x3d, 0xff, 0xdf, 0x00, 0x83, + 0xff, 0xe8, 0x00, 0x93, 0xff, 0xe8, 0x00, 0x98, 0xff, 0xe8, 0x00, 0xb2, + 0x00, 0x10, 0x00, 0xb3, 0xff, 0xe8, 0x00, 0xb4, 0x00, 0x10, 0x00, 0xd2, + 0xff, 0xe0, 0x00, 0xd3, 0xff, 0xe8, 0x00, 0xd4, 0x00, 0x10, 0x00, 0xd6, + 0xff, 0xe0, 0x00, 0xd9, 0x00, 0x14, 0x00, 0xdd, 0x00, 0x10, 0x00, 0xe1, + 0xff, 0xe1, 0x00, 0xe6, 0xff, 0xe0, 0x00, 0xed, 0x00, 0x13, 0x00, 0xf2, + 0x00, 0x10, 0x00, 0xf9, 0xff, 0xe0, 0x01, 0x04, 0x00, 0x10, 0x01, 0x08, + 0xff, 0xe8, 0x01, 0x0d, 0x00, 0x10, 0x01, 0x17, 0xff, 0xe8, 0x01, 0x19, + 0xff, 0xe0, 0x01, 0x1b, 0xff, 0xe8, 0x01, 0x1d, 0xff, 0xe8, 0x01, 0x1f, + 0xff, 0xe8, 0x01, 0x21, 0xff, 0xe8, 0x01, 0x39, 0xff, 0xe0, 0x01, 0x41, + 0xff, 0xe8, 0x01, 0x45, 0xff, 0xe0, 0x01, 0x47, 0xff, 0xe1, 0x01, 0x48, + 0xff, 0xe0, 0x01, 0x49, 0xff, 0xe1, 0x01, 0x4a, 0xff, 0xe0, 0x01, 0x4d, + 0xff, 0xe1, 0x01, 0x50, 0x00, 0x10, 0x01, 0x51, 0x00, 0x10, 0x01, 0x58, + 0xff, 0xe9, 0x01, 0x62, 0xff, 0xdf, 0x01, 0x64, 0xff, 0xde, 0x01, 0x66, + 0x00, 0x10, 0x01, 0x6a, 0xff, 0xe8, 0x01, 0x6c, 0xff, 0xdf, 0x01, 0x6e, + 0xff, 0xf2, 0x01, 0x6f, 0x00, 0x10, 0x01, 0x70, 0x00, 0x10, 0x02, 0x45, + 0xff, 0xe8, 0x02, 0x46, 0xff, 0xe8, 0x02, 0x48, 0xff, 0xe8, 0x02, 0x49, + 0xff, 0xe8, 0x02, 0x7f, 0x00, 0x10, 0x02, 0x80, 0x00, 0x10, 0x02, 0x81, + 0x00, 0x10, 0x02, 0x82, 0x00, 0x10, 0x02, 0x83, 0x00, 0x10, 0x02, 0x84, + 0x00, 0x10, 0x02, 0x85, 0x00, 0x10, 0x02, 0x86, 0xff, 0xe8, 0x02, 0x90, + 0xff, 0xe8, 0x02, 0x91, 0xff, 0xe8, 0x02, 0x92, 0xff, 0xe8, 0x02, 0x93, + 0xff, 0xe8, 0x02, 0x94, 0xff, 0xe8, 0x02, 0x99, 0xff, 0xdf, 0x02, 0xb6, + 0x00, 0x10, 0x02, 0xb8, 0x00, 0x10, 0x02, 0xba, 0x00, 0x10, 0x02, 0xbc, + 0xff, 0xe8, 0x02, 0xbe, 0xff, 0xe8, 0x02, 0xc0, 0xff, 0xe8, 0x02, 0xc2, + 0xff, 0xe8, 0x02, 0xd0, 0xff, 0xe8, 0x02, 0xd2, 0xff, 0xe8, 0x02, 0xd4, + 0xff, 0xe8, 0x02, 0xd6, 0xff, 0xe8, 0x02, 0xf8, 0xff, 0xe8, 0x02, 0xfa, + 0xff, 0xe8, 0x02, 0xfc, 0xff, 0xe8, 0x03, 0x0e, 0xff, 0xe0, 0x03, 0x10, + 0xff, 0xe0, 0x03, 0x12, 0xff, 0xe0, 0x03, 0x22, 0xff, 0xdf, 0x03, 0x24, + 0xff, 0xdf, 0x03, 0x2d, 0xff, 0xe8, 0x03, 0x86, 0x00, 0x10, 0x03, 0x8a, + 0xff, 0xe8, 0x03, 0x8b, 0xff, 0xdf, 0x03, 0x8e, 0x00, 0x10, 0x03, 0x97, + 0xff, 0xe8, 0x03, 0x9a, 0xff, 0xdf, 0x03, 0x9d, 0xff, 0xdf, 0x03, 0xb6, + 0x00, 0x10, 0x03, 0xbd, 0xff, 0xe8, 0x03, 0xc0, 0xff, 0xe8, 0x03, 0xc1, + 0xff, 0xe0, 0x03, 0xd9, 0xff, 0xdf, 0x03, 0xe2, 0x00, 0x10, 0x03, 0xea, + 0xff, 0xe0, 0x03, 0xed, 0xff, 0xe8, 0x03, 0xf0, 0xff, 0xe8, 0x03, 0xf2, + 0xff, 0xdf, 0x03, 0xf8, 0x00, 0x10, 0x03, 0xfa, 0x00, 0x10, 0x04, 0x0b, + 0xff, 0xe8, 0x04, 0x0d, 0xff, 0xe8, 0x04, 0x0f, 0xff, 0xe8, 0x04, 0x19, + 0xff, 0xe1, 0x04, 0x1a, 0xff, 0xe0, 0x04, 0x1e, 0x00, 0x10, 0x04, 0x20, + 0x00, 0x10, 0x04, 0x22, 0x00, 0x10, 0x04, 0x24, 0x00, 0x10, 0x04, 0x26, + 0x00, 0x10, 0x04, 0x28, 0x00, 0x10, 0x04, 0x2a, 0x00, 0x10, 0x04, 0x2c, + 0x00, 0x10, 0x04, 0x2e, 0x00, 0x10, 0x04, 0x30, 0x00, 0x10, 0x04, 0x32, + 0x00, 0x10, 0x04, 0x34, 0x00, 0x10, 0x04, 0x4a, 0xff, 0xe8, 0x04, 0x4c, + 0xff, 0xe8, 0x04, 0x4e, 0xff, 0xe8, 0x04, 0x50, 0xff, 0xe8, 0x04, 0x52, + 0xff, 0xe8, 0x04, 0x54, 0xff, 0xe8, 0x04, 0x56, 0xff, 0xe8, 0x04, 0x58, + 0xff, 0xe8, 0x04, 0x5a, 0xff, 0xe8, 0x04, 0x5c, 0xff, 0xe8, 0x04, 0x5e, + 0xff, 0xe8, 0x04, 0x60, 0xff, 0xe8, 0x04, 0x70, 0xff, 0xdf, 0x04, 0x72, + 0xff, 0xdf, 0x04, 0x74, 0xff, 0xdf, 0x04, 0x77, 0xff, 0xe0, 0x04, 0x79, + 0xff, 0xe1, 0x04, 0x7a, 0xff, 0xe0, 0x04, 0x86, 0xff, 0xdf, 0x04, 0x99, + 0x00, 0x10, 0x04, 0x9f, 0xff, 0xe8, 0x04, 0xb8, 0xff, 0xe8, 0x04, 0xbf, + 0xff, 0xe0, 0x04, 0xc2, 0xff, 0xe0, 0x04, 0xc4, 0xff, 0xe0, 0x00, 0x35, + 0x00, 0x1b, 0xff, 0xf2, 0x00, 0x38, 0xff, 0xf1, 0x00, 0x3a, 0xff, 0xf4, + 0x00, 0x3c, 0xff, 0xf4, 0x00, 0x3d, 0xff, 0xf0, 0x00, 0xd2, 0xff, 0xf1, + 0x00, 0xd4, 0xff, 0xf5, 0x00, 0xd6, 0xff, 0xf1, 0x00, 0xda, 0xff, 0xf4, + 0x00, 0xdd, 0xff, 0xf5, 0x00, 0xde, 0xff, 0xf3, 0x00, 0xe6, 0xff, 0xf1, + 0x01, 0x19, 0xff, 0xf4, 0x01, 0x33, 0xff, 0xf4, 0x01, 0x39, 0xff, 0xf1, + 0x01, 0x43, 0xff, 0xf4, 0x01, 0x45, 0xff, 0xf1, 0x01, 0x50, 0xff, 0xf5, + 0x01, 0x5d, 0xff, 0xf4, 0x01, 0x62, 0xff, 0xf2, 0x01, 0x64, 0xff, 0xf2, + 0x01, 0x66, 0xff, 0xf5, 0x01, 0x6c, 0xff, 0xf2, 0x01, 0x6f, 0xff, 0xf5, + 0x02, 0x99, 0xff, 0xf0, 0x03, 0x0e, 0xff, 0xf1, 0x03, 0x10, 0xff, 0xf1, + 0x03, 0x12, 0xff, 0xf1, 0x03, 0x22, 0xff, 0xf0, 0x03, 0x24, 0xff, 0xf0, + 0x03, 0x8b, 0xff, 0xf0, 0x03, 0x9a, 0xff, 0xf0, 0x03, 0x9b, 0xff, 0xf4, + 0x03, 0x9d, 0xff, 0xf0, 0x03, 0xb5, 0xff, 0xf3, 0x03, 0xc1, 0xff, 0xf1, + 0x03, 0xc2, 0xff, 0xf4, 0x03, 0xd9, 0xff, 0xf0, 0x03, 0xea, 0xff, 0xf4, + 0x03, 0xf2, 0xff, 0xf0, 0x03, 0xf5, 0xff, 0xf4, 0x04, 0x03, 0xff, 0xf4, + 0x04, 0x13, 0xff, 0xf3, 0x04, 0x15, 0xff, 0xf3, 0x04, 0x17, 0xff, 0xf3, + 0x04, 0x70, 0xff, 0xf0, 0x04, 0x72, 0xff, 0xf0, 0x04, 0x74, 0xff, 0xf0, + 0x04, 0x77, 0xff, 0xf1, 0x04, 0x86, 0xff, 0xf0, 0x04, 0xbf, 0xff, 0xf1, + 0x04, 0xc2, 0xff, 0xf4, 0x04, 0xc4, 0xff, 0xf4, 0x00, 0x6b, 0x00, 0x25, + 0x00, 0x0f, 0x00, 0x38, 0xff, 0xe6, 0x00, 0x3a, 0xff, 0xe6, 0x00, 0x3c, + 0x00, 0x0e, 0x00, 0x3d, 0xff, 0xe6, 0x00, 0xb2, 0x00, 0x0f, 0x00, 0xb4, + 0x00, 0x0f, 0x00, 0xd2, 0xff, 0xe6, 0x00, 0xd4, 0x00, 0x0e, 0x00, 0xd6, + 0xff, 0xe6, 0x00, 0xd9, 0x00, 0x13, 0x00, 0xda, 0x00, 0x0e, 0x00, 0xdd, + 0x00, 0x0e, 0x00, 0xde, 0x00, 0x0b, 0x00, 0xe1, 0xff, 0xe5, 0x00, 0xe6, + 0xff, 0xe6, 0x00, 0xe7, 0xff, 0xf4, 0x00, 0xed, 0x00, 0x12, 0x00, 0xf2, + 0x00, 0x0f, 0x00, 0xf6, 0xff, 0xe7, 0x00, 0xf9, 0xff, 0xe8, 0x00, 0xfe, + 0xff, 0xe7, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x0d, 0x00, 0x0f, 0x01, 0x19, + 0xff, 0xe6, 0x01, 0x33, 0x00, 0x0e, 0x01, 0x39, 0xff, 0xe6, 0x01, 0x3a, + 0xff, 0xe7, 0x01, 0x43, 0x00, 0x0e, 0x01, 0x45, 0xff, 0xe6, 0x01, 0x47, + 0xff, 0xe5, 0x01, 0x48, 0xff, 0xe8, 0x01, 0x49, 0xff, 0xe5, 0x01, 0x4a, + 0xff, 0xe8, 0x01, 0x4c, 0xff, 0xe4, 0x01, 0x50, 0x00, 0x0e, 0x01, 0x51, + 0x00, 0x0f, 0x01, 0x5d, 0x00, 0x0e, 0x01, 0x62, 0xff, 0xe6, 0x01, 0x64, + 0xff, 0xe6, 0x01, 0x66, 0x00, 0x0e, 0x01, 0x6c, 0xff, 0xe6, 0x01, 0x6d, + 0xff, 0xe7, 0x01, 0x6f, 0x00, 0x0e, 0x01, 0x70, 0x00, 0x0f, 0x02, 0x7f, + 0x00, 0x0f, 0x02, 0x80, 0x00, 0x0f, 0x02, 0x81, 0x00, 0x0f, 0x02, 0x82, + 0x00, 0x0f, 0x02, 0x83, 0x00, 0x0f, 0x02, 0x84, 0x00, 0x0f, 0x02, 0x85, + 0x00, 0x0f, 0x02, 0x99, 0xff, 0xe6, 0x02, 0xb6, 0x00, 0x0f, 0x02, 0xb8, + 0x00, 0x0f, 0x02, 0xba, 0x00, 0x0f, 0x03, 0x0e, 0xff, 0xe6, 0x03, 0x10, + 0xff, 0xe6, 0x03, 0x12, 0xff, 0xe6, 0x03, 0x22, 0xff, 0xe6, 0x03, 0x24, + 0xff, 0xe6, 0x03, 0x86, 0x00, 0x0f, 0x03, 0x8b, 0xff, 0xe6, 0x03, 0x8e, + 0x00, 0x0f, 0x03, 0x9a, 0xff, 0xe6, 0x03, 0x9b, 0x00, 0x0e, 0x03, 0x9d, + 0xff, 0xe6, 0x03, 0xb5, 0x00, 0x0b, 0x03, 0xb6, 0x00, 0x0f, 0x03, 0xc1, + 0xff, 0xe6, 0x03, 0xc2, 0x00, 0x0e, 0x03, 0xd9, 0xff, 0xe6, 0x03, 0xe2, + 0x00, 0x0f, 0x03, 0xea, 0xff, 0xe6, 0x03, 0xf2, 0xff, 0xe6, 0x03, 0xf5, + 0x00, 0x0e, 0x03, 0xf8, 0x00, 0x0f, 0x03, 0xfa, 0x00, 0x0f, 0x04, 0x03, + 0x00, 0x0e, 0x04, 0x13, 0x00, 0x0b, 0x04, 0x15, 0x00, 0x0b, 0x04, 0x17, + 0x00, 0x0b, 0x04, 0x19, 0xff, 0xe5, 0x04, 0x1a, 0xff, 0xe8, 0x04, 0x1e, + 0x00, 0x0f, 0x04, 0x20, 0x00, 0x0f, 0x04, 0x22, 0x00, 0x0f, 0x04, 0x24, + 0x00, 0x0f, 0x04, 0x26, 0x00, 0x0f, 0x04, 0x28, 0x00, 0x0f, 0x04, 0x2a, + 0x00, 0x0f, 0x04, 0x2c, 0x00, 0x0f, 0x04, 0x2e, 0x00, 0x0f, 0x04, 0x30, + 0x00, 0x0f, 0x04, 0x32, 0x00, 0x0f, 0x04, 0x34, 0x00, 0x0f, 0x04, 0x70, + 0xff, 0xe6, 0x04, 0x72, 0xff, 0xe6, 0x04, 0x74, 0xff, 0xe6, 0x04, 0x77, + 0xff, 0xe6, 0x04, 0x79, 0xff, 0xe5, 0x04, 0x7a, 0xff, 0xe8, 0x04, 0x86, + 0xff, 0xe6, 0x04, 0x99, 0x00, 0x0f, 0x04, 0xbf, 0xff, 0xe6, 0x04, 0xc2, + 0xff, 0xe6, 0x04, 0xc4, 0xff, 0xe6, 0x00, 0x3a, 0x00, 0x06, 0xff, 0xbf, + 0x00, 0x0b, 0xff, 0xbf, 0x00, 0x38, 0xff, 0x9f, 0x00, 0x3a, 0xff, 0xc9, + 0x00, 0x3d, 0xff, 0xad, 0x00, 0xd2, 0xff, 0x9f, 0x00, 0xd6, 0xff, 0x9f, + 0x00, 0xde, 0xff, 0xec, 0x00, 0xe1, 0xff, 0xe6, 0x00, 0xe6, 0xff, 0xc4, + 0x00, 0xf6, 0xff, 0xcd, 0x00, 0xfe, 0xff, 0xd5, 0x01, 0x19, 0xff, 0xc9, + 0x01, 0x39, 0xff, 0x9f, 0x01, 0x3a, 0xff, 0xcc, 0x01, 0x45, 0xff, 0x9f, + 0x01, 0x47, 0xff, 0xe6, 0x01, 0x49, 0xff, 0xe6, 0x01, 0x4c, 0xff, 0xdf, + 0x01, 0x62, 0xff, 0xd1, 0x01, 0x64, 0xff, 0xec, 0x01, 0x6c, 0xff, 0xa1, + 0x01, 0x6d, 0xff, 0xcf, 0x01, 0x84, 0xff, 0xbf, 0x01, 0x85, 0xff, 0xbf, + 0x01, 0x87, 0xff, 0xbf, 0x01, 0x88, 0xff, 0xbf, 0x01, 0x89, 0xff, 0xbf, + 0x02, 0x99, 0xff, 0xad, 0x03, 0x0e, 0xff, 0x9f, 0x03, 0x10, 0xff, 0x9f, + 0x03, 0x12, 0xff, 0x9f, 0x03, 0x22, 0xff, 0xad, 0x03, 0x24, 0xff, 0xad, + 0x03, 0x8b, 0xff, 0xad, 0x03, 0x9a, 0xff, 0xad, 0x03, 0x9d, 0xff, 0xad, + 0x03, 0xb5, 0xff, 0xec, 0x03, 0xc1, 0xff, 0x9f, 0x03, 0xd9, 0xff, 0xad, + 0x03, 0xdb, 0xff, 0xbf, 0x03, 0xdc, 0xff, 0xbf, 0x03, 0xdf, 0xff, 0xbf, + 0x03, 0xea, 0xff, 0xc9, 0x03, 0xf2, 0xff, 0xad, 0x04, 0x13, 0xff, 0xec, + 0x04, 0x15, 0xff, 0xec, 0x04, 0x17, 0xff, 0xec, 0x04, 0x19, 0xff, 0xe6, + 0x04, 0x70, 0xff, 0xad, 0x04, 0x72, 0xff, 0xad, 0x04, 0x74, 0xff, 0xad, + 0x04, 0x77, 0xff, 0x9f, 0x04, 0x79, 0xff, 0xe6, 0x04, 0x86, 0xff, 0xad, + 0x04, 0xbf, 0xff, 0x9f, 0x04, 0xc2, 0xff, 0xc9, 0x04, 0xc4, 0xff, 0xc9, + 0x00, 0x31, 0x00, 0x38, 0xff, 0xe3, 0x00, 0x3c, 0xff, 0xe5, 0x00, 0x3d, + 0xff, 0xe4, 0x00, 0xd2, 0xff, 0xe3, 0x00, 0xd4, 0xff, 0xe5, 0x00, 0xd6, + 0xff, 0xe3, 0x00, 0xd9, 0xff, 0xe2, 0x00, 0xda, 0xff, 0xe5, 0x00, 0xdd, + 0xff, 0xe5, 0x00, 0xde, 0xff, 0xe9, 0x00, 0xf2, 0xff, 0xea, 0x01, 0x04, + 0xff, 0xea, 0x01, 0x33, 0xff, 0xe5, 0x01, 0x39, 0xff, 0xe3, 0x01, 0x43, + 0xff, 0xe5, 0x01, 0x45, 0xff, 0xe3, 0x01, 0x50, 0xff, 0xe5, 0x01, 0x51, + 0xff, 0xea, 0x01, 0x5d, 0xff, 0xe5, 0x01, 0x66, 0xff, 0xe5, 0x01, 0x6c, + 0xff, 0xe4, 0x01, 0x6f, 0xff, 0xe5, 0x01, 0x70, 0xff, 0xea, 0x02, 0x99, + 0xff, 0xe4, 0x03, 0x0e, 0xff, 0xe3, 0x03, 0x10, 0xff, 0xe3, 0x03, 0x12, + 0xff, 0xe3, 0x03, 0x22, 0xff, 0xe4, 0x03, 0x24, 0xff, 0xe4, 0x03, 0x8b, + 0xff, 0xe4, 0x03, 0x9a, 0xff, 0xe4, 0x03, 0x9b, 0xff, 0xe5, 0x03, 0x9d, + 0xff, 0xe4, 0x03, 0xb5, 0xff, 0xe9, 0x03, 0xc1, 0xff, 0xe3, 0x03, 0xc2, + 0xff, 0xe5, 0x03, 0xd9, 0xff, 0xe4, 0x03, 0xf2, 0xff, 0xe4, 0x03, 0xf5, + 0xff, 0xe5, 0x04, 0x03, 0xff, 0xe5, 0x04, 0x13, 0xff, 0xe9, 0x04, 0x15, + 0xff, 0xe9, 0x04, 0x17, 0xff, 0xe9, 0x04, 0x70, 0xff, 0xe4, 0x04, 0x72, + 0xff, 0xe4, 0x04, 0x74, 0xff, 0xe4, 0x04, 0x77, 0xff, 0xe3, 0x04, 0x86, + 0xff, 0xe4, 0x04, 0xbf, 0xff, 0xe3, 0x00, 0x24, 0x00, 0x38, 0xff, 0xe2, + 0x00, 0x3c, 0xff, 0xe4, 0x00, 0xd2, 0xff, 0xe2, 0x00, 0xd4, 0xff, 0xe4, + 0x00, 0xd6, 0xff, 0xe2, 0x00, 0xd9, 0xff, 0xe1, 0x00, 0xda, 0xff, 0xe4, + 0x00, 0xdd, 0xff, 0xe4, 0x00, 0xde, 0xff, 0xe9, 0x00, 0xed, 0xff, 0xe4, + 0x00, 0xf2, 0xff, 0xeb, 0x01, 0x04, 0xff, 0xeb, 0x01, 0x33, 0xff, 0xe4, + 0x01, 0x39, 0xff, 0xe2, 0x01, 0x43, 0xff, 0xe4, 0x01, 0x45, 0xff, 0xe2, + 0x01, 0x50, 0xff, 0xe4, 0x01, 0x51, 0xff, 0xeb, 0x01, 0x5d, 0xff, 0xe4, + 0x01, 0x66, 0xff, 0xe4, 0x01, 0x6f, 0xff, 0xe4, 0x01, 0x70, 0xff, 0xeb, + 0x03, 0x0e, 0xff, 0xe2, 0x03, 0x10, 0xff, 0xe2, 0x03, 0x12, 0xff, 0xe2, + 0x03, 0x9b, 0xff, 0xe4, 0x03, 0xb5, 0xff, 0xe9, 0x03, 0xc1, 0xff, 0xe2, + 0x03, 0xc2, 0xff, 0xe4, 0x03, 0xf5, 0xff, 0xe4, 0x04, 0x03, 0xff, 0xe4, + 0x04, 0x13, 0xff, 0xe9, 0x04, 0x15, 0xff, 0xe9, 0x04, 0x17, 0xff, 0xe9, + 0x04, 0x77, 0xff, 0xe2, 0x04, 0xbf, 0xff, 0xe2, 0x00, 0x18, 0x00, 0x38, + 0xff, 0xeb, 0x00, 0x3d, 0xff, 0xf3, 0x00, 0xd2, 0xff, 0xeb, 0x00, 0xd6, + 0xff, 0xeb, 0x01, 0x39, 0xff, 0xeb, 0x01, 0x45, 0xff, 0xeb, 0x02, 0x99, + 0xff, 0xf3, 0x03, 0x0e, 0xff, 0xeb, 0x03, 0x10, 0xff, 0xeb, 0x03, 0x12, + 0xff, 0xeb, 0x03, 0x22, 0xff, 0xf3, 0x03, 0x24, 0xff, 0xf3, 0x03, 0x8b, + 0xff, 0xf3, 0x03, 0x9a, 0xff, 0xf3, 0x03, 0x9d, 0xff, 0xf3, 0x03, 0xc1, + 0xff, 0xeb, 0x03, 0xd9, 0xff, 0xf3, 0x03, 0xf2, 0xff, 0xf3, 0x04, 0x70, + 0xff, 0xf3, 0x04, 0x72, 0xff, 0xf3, 0x04, 0x74, 0xff, 0xf3, 0x04, 0x77, + 0xff, 0xeb, 0x04, 0x86, 0xff, 0xf3, 0x04, 0xbf, 0xff, 0xeb, 0x00, 0x39, + 0x00, 0x51, 0xff, 0xef, 0x00, 0x52, 0xff, 0xef, 0x00, 0x54, 0xff, 0xef, + 0x00, 0x5c, 0xff, 0xf0, 0x00, 0xc1, 0xff, 0xef, 0x00, 0xec, 0xff, 0xef, + 0x00, 0xed, 0xff, 0xee, 0x00, 0xee, 0xff, 0xf0, 0x00, 0xf0, 0xff, 0xef, + 0x00, 0xf1, 0xff, 0xef, 0x00, 0xf3, 0xff, 0xef, 0x00, 0xf4, 0xff, 0xef, + 0x00, 0xf5, 0xff, 0xef, 0x00, 0xf6, 0xff, 0xee, 0x00, 0xf8, 0xff, 0xef, + 0x00, 0xfa, 0xff, 0xef, 0x00, 0xfb, 0xff, 0xef, 0x00, 0xfe, 0xff, 0xef, + 0x01, 0x00, 0xff, 0xef, 0x01, 0x05, 0xff, 0xef, 0x01, 0x09, 0xff, 0xf4, + 0x01, 0x20, 0xff, 0xf1, 0x01, 0x2b, 0xff, 0xef, 0x01, 0x34, 0xff, 0xf0, + 0x01, 0x36, 0xff, 0xef, 0x01, 0x3a, 0xff, 0xef, 0x01, 0x3c, 0xff, 0xef, + 0x01, 0x3e, 0xff, 0xef, 0x01, 0x44, 0xff, 0xf0, 0x01, 0x53, 0xff, 0xef, + 0x01, 0x55, 0xff, 0xef, 0x01, 0x57, 0xff, 0xef, 0x01, 0x5c, 0xff, 0xef, + 0x01, 0x5e, 0xff, 0xf0, 0x01, 0x6d, 0xff, 0xef, 0x02, 0xaa, 0xff, 0xef, + 0x02, 0xf2, 0xff, 0xef, 0x02, 0xf4, 0xff, 0xef, 0x02, 0xf6, 0xff, 0xef, + 0x02, 0xf7, 0xff, 0xef, 0x03, 0xa0, 0xff, 0xef, 0x03, 0xc5, 0xff, 0xef, + 0x03, 0xc7, 0xff, 0xef, 0x03, 0xca, 0xff, 0xf0, 0x03, 0xcc, 0xff, 0xef, + 0x03, 0xd1, 0xff, 0xef, 0x03, 0xe1, 0xff, 0xef, 0x03, 0xe7, 0xff, 0xef, + 0x03, 0xf6, 0xff, 0xf0, 0x04, 0x04, 0xff, 0xf0, 0x04, 0x08, 0xff, 0xef, + 0x04, 0x0a, 0xff, 0xef, 0x04, 0x1c, 0xff, 0xef, 0x04, 0x7c, 0xff, 0xef, + 0x04, 0x98, 0xff, 0xef, 0x04, 0xb5, 0xff, 0xef, 0x04, 0xb7, 0xff, 0xef, + 0x00, 0x24, 0x00, 0x06, 0xff, 0xf2, 0x00, 0x0b, 0xff, 0xf2, 0x00, 0x5a, + 0xff, 0xf5, 0x00, 0x5d, 0xff, 0xf5, 0x00, 0xbd, 0xff, 0xf5, 0x00, 0xf6, + 0xff, 0xf4, 0x00, 0xfe, 0xff, 0xf4, 0x01, 0x09, 0xff, 0xf5, 0x01, 0x1a, + 0xff, 0xf5, 0x01, 0x3a, 0xff, 0xf5, 0x01, 0x6d, 0xff, 0xf5, 0x01, 0x84, + 0xff, 0xf2, 0x01, 0x85, 0xff, 0xf2, 0x01, 0x87, 0xff, 0xf2, 0x01, 0x88, + 0xff, 0xf2, 0x01, 0x89, 0xff, 0xf2, 0x02, 0xb4, 0xff, 0xf5, 0x02, 0xb5, + 0xff, 0xf5, 0x03, 0x23, 0xff, 0xf5, 0x03, 0xa6, 0xff, 0xf5, 0x03, 0xc9, + 0xff, 0xf5, 0x03, 0xd2, 0xff, 0xf5, 0x03, 0xda, 0xff, 0xf5, 0x03, 0xdb, + 0xff, 0xf2, 0x03, 0xdc, 0xff, 0xf2, 0x03, 0xdf, 0xff, 0xf2, 0x03, 0xeb, + 0xff, 0xf5, 0x03, 0xf3, 0xff, 0xf5, 0x04, 0x14, 0xff, 0xf5, 0x04, 0x16, + 0xff, 0xf5, 0x04, 0x18, 0xff, 0xf5, 0x04, 0x71, 0xff, 0xf5, 0x04, 0x73, + 0xff, 0xf5, 0x04, 0x75, 0xff, 0xf5, 0x04, 0xc3, 0xff, 0xf5, 0x04, 0xc5, + 0xff, 0xf5, 0x00, 0x35, 0x00, 0x51, 0xff, 0xee, 0x00, 0x52, 0xff, 0xee, + 0x00, 0x54, 0xff, 0xee, 0x00, 0xc1, 0xff, 0xee, 0x00, 0xec, 0xff, 0xee, + 0x00, 0xed, 0x00, 0x14, 0x00, 0xf0, 0xff, 0xee, 0x00, 0xf1, 0xff, 0xee, + 0x00, 0xf3, 0xff, 0xee, 0x00, 0xf4, 0xff, 0xee, 0x00, 0xf5, 0xff, 0xee, + 0x00, 0xf6, 0xff, 0xed, 0x00, 0xf8, 0xff, 0xee, 0x00, 0xf9, 0xff, 0xed, + 0x00, 0xfa, 0xff, 0xee, 0x00, 0xfb, 0xff, 0xee, 0x00, 0xfc, 0xff, 0xd0, + 0x00, 0xfe, 0xff, 0xee, 0x01, 0x00, 0xff, 0xee, 0x01, 0x05, 0xff, 0xee, + 0x01, 0x2b, 0xff, 0xee, 0x01, 0x36, 0xff, 0xee, 0x01, 0x3a, 0xff, 0xed, + 0x01, 0x3c, 0xff, 0xee, 0x01, 0x3e, 0xff, 0xee, 0x01, 0x48, 0xff, 0xed, + 0x01, 0x4a, 0xff, 0xed, 0x01, 0x53, 0xff, 0xee, 0x01, 0x55, 0xff, 0xee, + 0x01, 0x57, 0xff, 0xee, 0x01, 0x5c, 0xff, 0xee, 0x01, 0x6d, 0xff, 0xed, + 0x02, 0xaa, 0xff, 0xee, 0x02, 0xf2, 0xff, 0xee, 0x02, 0xf4, 0xff, 0xee, + 0x02, 0xf6, 0xff, 0xee, 0x02, 0xf7, 0xff, 0xee, 0x03, 0xa0, 0xff, 0xee, + 0x03, 0xc5, 0xff, 0xee, 0x03, 0xc7, 0xff, 0xee, 0x03, 0xcc, 0xff, 0xee, + 0x03, 0xd1, 0xff, 0xee, 0x03, 0xe1, 0xff, 0xee, 0x03, 0xe7, 0xff, 0xee, + 0x04, 0x08, 0xff, 0xee, 0x04, 0x0a, 0xff, 0xee, 0x04, 0x1a, 0xff, 0xed, + 0x04, 0x1c, 0xff, 0xee, 0x04, 0x7a, 0xff, 0xed, 0x04, 0x7c, 0xff, 0xee, + 0x04, 0x98, 0xff, 0xee, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb7, 0xff, 0xee, + 0x00, 0x0a, 0x00, 0x06, 0xff, 0xf5, 0x00, 0x0b, 0xff, 0xf5, 0x01, 0x84, + 0xff, 0xf5, 0x01, 0x85, 0xff, 0xf5, 0x01, 0x87, 0xff, 0xf5, 0x01, 0x88, + 0xff, 0xf5, 0x01, 0x89, 0xff, 0xf5, 0x03, 0xdb, 0xff, 0xf5, 0x03, 0xdc, + 0xff, 0xf5, 0x03, 0xdf, 0xff, 0xf5, 0x00, 0x76, 0x00, 0x47, 0xff, 0xf0, + 0x00, 0x48, 0xff, 0xf0, 0x00, 0x49, 0xff, 0xf0, 0x00, 0x4b, 0xff, 0xf0, + 0x00, 0x53, 0xff, 0xc7, 0x00, 0x55, 0xff, 0xf0, 0x00, 0x94, 0xff, 0xf0, + 0x00, 0x99, 0xff, 0xf0, 0x00, 0xbb, 0xff, 0xf0, 0x00, 0xc8, 0xff, 0xf0, + 0x00, 0xc9, 0xff, 0xf0, 0x00, 0xf7, 0xff, 0xf0, 0x01, 0x03, 0xff, 0xf0, + 0x01, 0x18, 0xff, 0xc7, 0x01, 0x1c, 0xff, 0xeb, 0x01, 0x1e, 0xff, 0xf0, + 0x01, 0x22, 0xff, 0xf0, 0x01, 0x42, 0xff, 0xf0, 0x01, 0x60, 0xff, 0xf0, + 0x01, 0x61, 0xff, 0xf0, 0x01, 0x6b, 0xff, 0xf0, 0x01, 0xdb, 0xff, 0xeb, + 0x01, 0xdd, 0xff, 0xeb, 0x01, 0xe5, 0xff, 0xe9, 0x01, 0xec, 0xff, 0xeb, + 0x01, 0xf5, 0xff, 0xeb, 0x02, 0x11, 0xff, 0xeb, 0x02, 0x1a, 0xff, 0xeb, + 0x02, 0x31, 0xff, 0xeb, 0x02, 0xa1, 0xff, 0xf0, 0x02, 0xa2, 0xff, 0xf0, + 0x02, 0xa3, 0xff, 0xf0, 0x02, 0xa4, 0xff, 0xf0, 0x02, 0xa5, 0xff, 0xf0, + 0x02, 0xab, 0xff, 0xc7, 0x02, 0xac, 0xff, 0xc7, 0x02, 0xad, 0xff, 0xc7, + 0x02, 0xae, 0xff, 0xc7, 0x02, 0xaf, 0xff, 0xc7, 0x02, 0xbd, 0xff, 0xf0, + 0x02, 0xbf, 0xff, 0xf0, 0x02, 0xc1, 0xff, 0xf0, 0x02, 0xc3, 0xff, 0xf0, + 0x02, 0xc5, 0xff, 0xf0, 0x02, 0xc7, 0xff, 0xf0, 0x02, 0xc9, 0xff, 0xf0, + 0x02, 0xcb, 0xff, 0xf0, 0x02, 0xcd, 0xff, 0xf0, 0x02, 0xcf, 0xff, 0xf0, + 0x02, 0xd1, 0xff, 0xf0, 0x02, 0xd3, 0xff, 0xf0, 0x02, 0xd5, 0xff, 0xf0, + 0x02, 0xd7, 0xff, 0xf0, 0x02, 0xf9, 0xff, 0xc7, 0x02, 0xfb, 0xff, 0xc7, + 0x02, 0xfd, 0xff, 0xc7, 0x03, 0x39, 0xff, 0xeb, 0x03, 0x43, 0xff, 0xeb, + 0x03, 0x44, 0xff, 0xeb, 0x03, 0x45, 0xff, 0xeb, 0x03, 0x46, 0xff, 0xeb, + 0x03, 0x47, 0xff, 0xeb, 0x03, 0x50, 0xff, 0xeb, 0x03, 0x51, 0xff, 0xeb, + 0x03, 0x52, 0xff, 0xeb, 0x03, 0x53, 0xff, 0xeb, 0x03, 0x5a, 0xff, 0xeb, + 0x03, 0x5b, 0xff, 0xeb, 0x03, 0x5c, 0xff, 0xeb, 0x03, 0x5d, 0xff, 0xeb, + 0x03, 0x6d, 0xff, 0xeb, 0x03, 0x6e, 0xff, 0xeb, 0x03, 0x6f, 0xff, 0xeb, + 0x03, 0x9e, 0xff, 0xf0, 0x03, 0xa4, 0xff, 0xc7, 0x03, 0xaa, 0xff, 0xc7, + 0x03, 0xc4, 0xff, 0xf0, 0x03, 0xc6, 0xff, 0xc7, 0x03, 0xc8, 0xff, 0xf0, + 0x03, 0xcb, 0xff, 0xf0, 0x03, 0xe6, 0xff, 0xf0, 0x03, 0xec, 0xff, 0xf0, + 0x03, 0xf1, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xf0, 0x04, 0x01, 0xff, 0xf0, + 0x04, 0x02, 0xff, 0xf0, 0x04, 0x0c, 0xff, 0xc7, 0x04, 0x0e, 0xff, 0xf0, + 0x04, 0x10, 0xff, 0xc7, 0x04, 0x1d, 0xff, 0xf0, 0x04, 0x37, 0xff, 0xf0, + 0x04, 0x39, 0xff, 0xf0, 0x04, 0x3b, 0xff, 0xf0, 0x04, 0x3d, 0xff, 0xf0, + 0x04, 0x3f, 0xff, 0xf0, 0x04, 0x41, 0xff, 0xf0, 0x04, 0x43, 0xff, 0xf0, + 0x04, 0x45, 0xff, 0xf0, 0x04, 0x4b, 0xff, 0xc7, 0x04, 0x4d, 0xff, 0xc7, + 0x04, 0x4f, 0xff, 0xc7, 0x04, 0x51, 0xff, 0xc7, 0x04, 0x53, 0xff, 0xc7, + 0x04, 0x55, 0xff, 0xc7, 0x04, 0x57, 0xff, 0xc7, 0x04, 0x59, 0xff, 0xf0, + 0x04, 0x5b, 0xff, 0xf0, 0x04, 0x5d, 0xff, 0xf0, 0x04, 0x5f, 0xff, 0xc7, + 0x04, 0x61, 0xff, 0xf0, 0x04, 0x9c, 0xff, 0xf0, 0x04, 0xa0, 0xff, 0xc7, + 0x04, 0xa9, 0xff, 0xf0, 0x04, 0xab, 0xff, 0xf0, 0x04, 0xcf, 0xff, 0xeb, + 0x04, 0xf1, 0xff, 0xeb, 0x04, 0xf4, 0xff, 0xeb, 0x04, 0xf9, 0xff, 0xeb, + 0x00, 0xe2, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x45, + 0xff, 0xf0, 0x00, 0x47, 0xff, 0xc0, 0x00, 0x48, 0xff, 0xc0, 0x00, 0x49, + 0xff, 0xc0, 0x00, 0x4a, 0x00, 0x0d, 0x00, 0x4b, 0xff, 0xc0, 0x00, 0x53, + 0xff, 0xe2, 0x00, 0x55, 0xff, 0xc0, 0x00, 0x5a, 0x00, 0x0b, 0x00, 0x5d, + 0x00, 0x0b, 0x00, 0x94, 0xff, 0xc0, 0x00, 0x99, 0xff, 0xc0, 0x00, 0xbb, + 0xff, 0xc0, 0x00, 0xbd, 0x00, 0x0b, 0x00, 0xc7, 0xff, 0xd6, 0x00, 0xc8, + 0xff, 0xc0, 0x00, 0xc9, 0xff, 0xc0, 0x00, 0xcc, 0xff, 0xd5, 0x00, 0xed, + 0xff, 0xc8, 0x00, 0xf2, 0xff, 0xd7, 0x00, 0xf7, 0xff, 0xc0, 0x01, 0x03, + 0xff, 0xc0, 0x01, 0x04, 0xff, 0xd7, 0x01, 0x18, 0xff, 0xe2, 0x01, 0x1a, + 0x00, 0x0b, 0x01, 0x1c, 0xff, 0xec, 0x01, 0x1e, 0xff, 0xc0, 0x01, 0x20, + 0x00, 0x0c, 0x01, 0x22, 0xff, 0xc0, 0x01, 0x42, 0xff, 0xc0, 0x01, 0x51, + 0xff, 0xd7, 0x01, 0x60, 0xff, 0xc0, 0x01, 0x61, 0xff, 0xc0, 0x01, 0x63, + 0x00, 0x0b, 0x01, 0x65, 0x00, 0x0b, 0x01, 0x6b, 0xff, 0xc0, 0x01, 0x70, + 0xff, 0xd7, 0x01, 0x84, 0x00, 0x0d, 0x01, 0x85, 0x00, 0x0d, 0x01, 0x87, + 0x00, 0x0d, 0x01, 0x88, 0x00, 0x0d, 0x01, 0x89, 0x00, 0x0d, 0x01, 0xd3, + 0x00, 0x0d, 0x01, 0xd6, 0x00, 0x0d, 0x01, 0xd8, 0x00, 0x0e, 0x01, 0xd9, + 0xff, 0xf5, 0x01, 0xdb, 0xff, 0xec, 0x01, 0xdd, 0xff, 0xed, 0x01, 0xe5, + 0xff, 0xec, 0x01, 0xeb, 0xff, 0xbf, 0x01, 0xec, 0xff, 0xed, 0x01, 0xed, + 0xff, 0xbf, 0x01, 0xf4, 0x00, 0x0e, 0x01, 0xf5, 0xff, 0xed, 0x01, 0xf8, + 0x00, 0x0e, 0x02, 0x10, 0x00, 0x0e, 0x02, 0x11, 0xff, 0xed, 0x02, 0x12, + 0x00, 0x0d, 0x02, 0x14, 0x00, 0x0e, 0x02, 0x1a, 0xff, 0xed, 0x02, 0x31, + 0xff, 0xee, 0x02, 0x33, 0xff, 0xbf, 0x02, 0x9a, 0xff, 0xf0, 0x02, 0x9b, + 0xff, 0xf0, 0x02, 0x9c, 0xff, 0xf0, 0x02, 0x9d, 0xff, 0xf0, 0x02, 0x9e, + 0xff, 0xf0, 0x02, 0x9f, 0xff, 0xf0, 0x02, 0xa0, 0xff, 0xf0, 0x02, 0xa1, + 0xff, 0xc0, 0x02, 0xa2, 0xff, 0xc0, 0x02, 0xa3, 0xff, 0xc0, 0x02, 0xa4, + 0xff, 0xc0, 0x02, 0xa5, 0xff, 0xc0, 0x02, 0xab, 0xff, 0xe2, 0x02, 0xac, + 0xff, 0xe2, 0x02, 0xad, 0xff, 0xe2, 0x02, 0xae, 0xff, 0xe2, 0x02, 0xaf, + 0xff, 0xe2, 0x02, 0xb4, 0x00, 0x0b, 0x02, 0xb5, 0x00, 0x0b, 0x02, 0xb7, + 0xff, 0xf0, 0x02, 0xb9, 0xff, 0xf0, 0x02, 0xbb, 0xff, 0xf0, 0x02, 0xbd, + 0xff, 0xc0, 0x02, 0xbf, 0xff, 0xc0, 0x02, 0xc1, 0xff, 0xc0, 0x02, 0xc3, + 0xff, 0xc0, 0x02, 0xc5, 0xff, 0xc0, 0x02, 0xc7, 0xff, 0xc0, 0x02, 0xc9, + 0xff, 0xc0, 0x02, 0xcb, 0xff, 0xc0, 0x02, 0xcd, 0xff, 0xc0, 0x02, 0xcf, + 0xff, 0xc0, 0x02, 0xd1, 0xff, 0xc0, 0x02, 0xd3, 0xff, 0xc0, 0x02, 0xd5, + 0xff, 0xc0, 0x02, 0xd7, 0xff, 0xc0, 0x02, 0xf9, 0xff, 0xe2, 0x02, 0xfb, + 0xff, 0xe2, 0x02, 0xfd, 0xff, 0xe2, 0x03, 0x23, 0x00, 0x0b, 0x03, 0x32, + 0xff, 0xbf, 0x03, 0x33, 0xff, 0xbf, 0x03, 0x34, 0xff, 0xbf, 0x03, 0x35, + 0xff, 0xbf, 0x03, 0x36, 0xff, 0xbf, 0x03, 0x37, 0xff, 0xbf, 0x03, 0x38, + 0xff, 0xbf, 0x03, 0x39, 0xff, 0xed, 0x03, 0x43, 0xff, 0xed, 0x03, 0x44, + 0xff, 0xed, 0x03, 0x45, 0xff, 0xed, 0x03, 0x46, 0xff, 0xed, 0x03, 0x47, + 0xff, 0xed, 0x03, 0x4c, 0x00, 0x0d, 0x03, 0x4d, 0xff, 0xbf, 0x03, 0x4e, + 0xff, 0xbf, 0x03, 0x4f, 0xff, 0xbf, 0x03, 0x50, 0xff, 0xed, 0x03, 0x51, + 0xff, 0xed, 0x03, 0x52, 0xff, 0xed, 0x03, 0x53, 0xff, 0xed, 0x03, 0x5a, + 0xff, 0xed, 0x03, 0x5b, 0xff, 0xed, 0x03, 0x5c, 0xff, 0xed, 0x03, 0x5d, + 0xff, 0xed, 0x03, 0x6d, 0xff, 0xed, 0x03, 0x6e, 0xff, 0xed, 0x03, 0x6f, + 0xff, 0xed, 0x03, 0x73, 0xff, 0xf5, 0x03, 0x74, 0xff, 0xf5, 0x03, 0x75, + 0xff, 0xf5, 0x03, 0x76, 0xff, 0xf5, 0x03, 0x78, 0x00, 0x0e, 0x03, 0x81, + 0x00, 0x0d, 0x03, 0x82, 0x00, 0x0d, 0x03, 0x9e, 0xff, 0xc0, 0x03, 0xa4, + 0xff, 0xe2, 0x03, 0xa6, 0x00, 0x0b, 0x03, 0xaa, 0xff, 0xe2, 0x03, 0xc3, + 0xff, 0xf0, 0x03, 0xc4, 0xff, 0xc0, 0x03, 0xc6, 0xff, 0xe2, 0x03, 0xc8, + 0xff, 0xc0, 0x03, 0xc9, 0x00, 0x0b, 0x03, 0xcb, 0xff, 0xc0, 0x03, 0xd2, + 0x00, 0x0b, 0x03, 0xda, 0x00, 0x0b, 0x03, 0xdb, 0x00, 0x0d, 0x03, 0xdc, + 0x00, 0x0d, 0x03, 0xdf, 0x00, 0x0d, 0x03, 0xe3, 0xff, 0xf0, 0x03, 0xe6, + 0xff, 0xc0, 0x03, 0xeb, 0x00, 0x0b, 0x03, 0xec, 0xff, 0xc0, 0x03, 0xf1, + 0xff, 0xc0, 0x03, 0xf3, 0x00, 0x0b, 0x03, 0xf9, 0xff, 0xf0, 0x03, 0xfb, + 0xff, 0xf0, 0x03, 0xff, 0xff, 0xc0, 0x04, 0x01, 0xff, 0xc0, 0x04, 0x02, + 0xff, 0xc0, 0x04, 0x0c, 0xff, 0xe2, 0x04, 0x0e, 0xff, 0xc0, 0x04, 0x10, + 0xff, 0xe2, 0x04, 0x14, 0x00, 0x0b, 0x04, 0x16, 0x00, 0x0b, 0x04, 0x18, + 0x00, 0x0b, 0x04, 0x1d, 0xff, 0xc0, 0x04, 0x1f, 0xff, 0xf0, 0x04, 0x21, + 0xff, 0xf0, 0x04, 0x23, 0xff, 0xf0, 0x04, 0x25, 0xff, 0xf0, 0x04, 0x27, + 0xff, 0xf0, 0x04, 0x29, 0xff, 0xf0, 0x04, 0x2b, 0xff, 0xf0, 0x04, 0x2d, + 0xff, 0xf0, 0x04, 0x2f, 0xff, 0xf0, 0x04, 0x31, 0xff, 0xf0, 0x04, 0x33, + 0xff, 0xf0, 0x04, 0x35, 0xff, 0xf0, 0x04, 0x37, 0xff, 0xc0, 0x04, 0x39, + 0xff, 0xc0, 0x04, 0x3b, 0xff, 0xc0, 0x04, 0x3d, 0xff, 0xc0, 0x04, 0x3f, + 0xff, 0xc0, 0x04, 0x41, 0xff, 0xc0, 0x04, 0x43, 0xff, 0xc0, 0x04, 0x45, + 0xff, 0xc0, 0x04, 0x4b, 0xff, 0xe2, 0x04, 0x4d, 0xff, 0xe2, 0x04, 0x4f, + 0xff, 0xe2, 0x04, 0x51, 0xff, 0xe2, 0x04, 0x53, 0xff, 0xe2, 0x04, 0x55, + 0xff, 0xe2, 0x04, 0x57, 0xff, 0xe2, 0x04, 0x59, 0xff, 0xc0, 0x04, 0x5b, + 0xff, 0xc0, 0x04, 0x5d, 0xff, 0xc0, 0x04, 0x5f, 0xff, 0xe2, 0x04, 0x61, + 0xff, 0xc0, 0x04, 0x71, 0x00, 0x0b, 0x04, 0x73, 0x00, 0x0b, 0x04, 0x75, + 0x00, 0x0b, 0x04, 0x9a, 0xff, 0xf0, 0x04, 0x9c, 0xff, 0xc0, 0x04, 0xa0, + 0xff, 0xe2, 0x04, 0xa9, 0xff, 0xc0, 0x04, 0xab, 0xff, 0xc0, 0x04, 0xc3, + 0x00, 0x0b, 0x04, 0xc5, 0x00, 0x0b, 0x04, 0xcb, 0xff, 0xbf, 0x04, 0xcf, + 0xff, 0xed, 0x04, 0xd0, 0x00, 0x0d, 0x04, 0xd2, 0xff, 0xbf, 0x04, 0xde, + 0x00, 0x0d, 0x04, 0xe1, 0x00, 0x0d, 0x04, 0xea, 0xff, 0xbf, 0x04, 0xf1, + 0xff, 0xed, 0x04, 0xf4, 0xff, 0xed, 0x04, 0xf5, 0x00, 0x0e, 0x04, 0xf9, + 0xff, 0xed, 0x04, 0xfa, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0xed, 0x00, 0x14, + 0x00, 0xf2, 0x00, 0x10, 0x00, 0xf6, 0xff, 0xf0, 0x00, 0xf9, 0xff, 0xf0, + 0x00, 0xfe, 0xff, 0xf0, 0x01, 0x01, 0x00, 0x16, 0x01, 0x04, 0x00, 0x10, + 0x01, 0x3a, 0xff, 0xe6, 0x01, 0x48, 0xff, 0xf0, 0x01, 0x4a, 0xff, 0xdc, + 0x01, 0x51, 0x00, 0x10, 0x01, 0x6d, 0xff, 0xf0, 0x01, 0x70, 0x00, 0x10, + 0x04, 0x1a, 0xff, 0xf0, 0x04, 0x7a, 0xff, 0xf0, 0x00, 0x4f, 0x00, 0x47, + 0xff, 0xee, 0x00, 0x48, 0xff, 0xee, 0x00, 0x49, 0xff, 0xee, 0x00, 0x4b, + 0xff, 0xee, 0x00, 0x55, 0xff, 0xee, 0x00, 0x94, 0xff, 0xee, 0x00, 0x99, + 0xff, 0xee, 0x00, 0xbb, 0xff, 0xee, 0x00, 0xc8, 0xff, 0xee, 0x00, 0xc9, + 0xff, 0xee, 0x00, 0xed, 0x00, 0x12, 0x00, 0xf2, 0x00, 0x0e, 0x00, 0xf6, + 0xff, 0xe3, 0x00, 0xf7, 0xff, 0xee, 0x00, 0xf9, 0xff, 0xe3, 0x00, 0xfc, + 0xff, 0xb8, 0x00, 0xfe, 0xff, 0xe3, 0x01, 0x03, 0xff, 0xee, 0x01, 0x04, + 0x00, 0x0e, 0x01, 0x1e, 0xff, 0xee, 0x01, 0x22, 0xff, 0xee, 0x01, 0x3a, + 0xff, 0xba, 0x01, 0x42, 0xff, 0xee, 0x01, 0x48, 0xff, 0xe3, 0x01, 0x4a, + 0xff, 0xd9, 0x01, 0x51, 0x00, 0x0e, 0x01, 0x60, 0xff, 0xee, 0x01, 0x61, + 0xff, 0xee, 0x01, 0x6b, 0xff, 0xee, 0x01, 0x6d, 0xff, 0xe3, 0x01, 0x70, + 0x00, 0x0e, 0x02, 0xa1, 0xff, 0xee, 0x02, 0xa2, 0xff, 0xee, 0x02, 0xa3, + 0xff, 0xee, 0x02, 0xa4, 0xff, 0xee, 0x02, 0xa5, 0xff, 0xee, 0x02, 0xbd, + 0xff, 0xee, 0x02, 0xbf, 0xff, 0xee, 0x02, 0xc1, 0xff, 0xee, 0x02, 0xc3, + 0xff, 0xee, 0x02, 0xc5, 0xff, 0xee, 0x02, 0xc7, 0xff, 0xee, 0x02, 0xc9, + 0xff, 0xee, 0x02, 0xcb, 0xff, 0xee, 0x02, 0xcd, 0xff, 0xee, 0x02, 0xcf, + 0xff, 0xee, 0x02, 0xd1, 0xff, 0xee, 0x02, 0xd3, 0xff, 0xee, 0x02, 0xd5, + 0xff, 0xee, 0x02, 0xd7, 0xff, 0xee, 0x03, 0x9e, 0xff, 0xee, 0x03, 0xc4, + 0xff, 0xee, 0x03, 0xc8, 0xff, 0xee, 0x03, 0xcb, 0xff, 0xee, 0x03, 0xe6, + 0xff, 0xee, 0x03, 0xec, 0xff, 0xee, 0x03, 0xf1, 0xff, 0xee, 0x03, 0xff, + 0xff, 0xee, 0x04, 0x01, 0xff, 0xee, 0x04, 0x02, 0xff, 0xee, 0x04, 0x0e, + 0xff, 0xee, 0x04, 0x1a, 0xff, 0xe3, 0x04, 0x1d, 0xff, 0xee, 0x04, 0x37, + 0xff, 0xee, 0x04, 0x39, 0xff, 0xee, 0x04, 0x3b, 0xff, 0xee, 0x04, 0x3d, + 0xff, 0xee, 0x04, 0x3f, 0xff, 0xee, 0x04, 0x41, 0xff, 0xee, 0x04, 0x43, + 0xff, 0xee, 0x04, 0x45, 0xff, 0xee, 0x04, 0x59, 0xff, 0xee, 0x04, 0x5b, + 0xff, 0xee, 0x04, 0x5d, 0xff, 0xee, 0x04, 0x61, 0xff, 0xee, 0x04, 0x7a, + 0xff, 0xe3, 0x04, 0x9c, 0xff, 0xee, 0x04, 0xa9, 0xff, 0xee, 0x04, 0xab, + 0xff, 0xee, 0x00, 0x22, 0x00, 0x5a, 0xff, 0xc0, 0x00, 0x5d, 0xff, 0xc0, + 0x00, 0xbd, 0xff, 0xc0, 0x00, 0xf6, 0xff, 0x80, 0x00, 0xf9, 0xff, 0xee, + 0x00, 0xfe, 0xff, 0xf0, 0x01, 0x09, 0xff, 0xdb, 0x01, 0x1a, 0xff, 0xc0, + 0x01, 0x20, 0xff, 0xdc, 0x01, 0x3a, 0xff, 0x47, 0x01, 0x48, 0xff, 0xee, + 0x01, 0x4a, 0xff, 0xee, 0x01, 0x63, 0x00, 0x07, 0x01, 0x65, 0xff, 0xf4, + 0x01, 0x6d, 0xff, 0x7f, 0x02, 0xb4, 0xff, 0xc0, 0x02, 0xb5, 0xff, 0xc0, + 0x03, 0x23, 0xff, 0xc0, 0x03, 0xa6, 0xff, 0xc0, 0x03, 0xc9, 0xff, 0xc0, + 0x03, 0xd2, 0xff, 0xc0, 0x03, 0xda, 0xff, 0xc0, 0x03, 0xeb, 0xff, 0xc0, + 0x03, 0xf3, 0xff, 0xc0, 0x04, 0x14, 0xff, 0xc0, 0x04, 0x16, 0xff, 0xc0, + 0x04, 0x18, 0xff, 0xc0, 0x04, 0x1a, 0xff, 0xee, 0x04, 0x71, 0xff, 0xc0, + 0x04, 0x73, 0xff, 0xc0, 0x04, 0x75, 0xff, 0xc0, 0x04, 0x7a, 0xff, 0xee, + 0x04, 0xc3, 0xff, 0xc0, 0x04, 0xc5, 0xff, 0xc0, 0x00, 0x23, 0x00, 0x5a, + 0xff, 0xf4, 0x00, 0x5c, 0xff, 0xf0, 0x00, 0x5d, 0xff, 0xf4, 0x00, 0xbd, + 0xff, 0xf4, 0x00, 0xed, 0xff, 0xef, 0x00, 0xee, 0xff, 0xf0, 0x00, 0xf2, + 0xff, 0xf3, 0x00, 0xfe, 0xff, 0xee, 0x01, 0x04, 0xff, 0xf3, 0x01, 0x1a, + 0xff, 0xf4, 0x01, 0x34, 0xff, 0xf0, 0x01, 0x44, 0xff, 0xf0, 0x01, 0x51, + 0xff, 0xf3, 0x01, 0x5e, 0xff, 0xf0, 0x01, 0x70, 0xff, 0xf3, 0x02, 0xb4, + 0xff, 0xf4, 0x02, 0xb5, 0xff, 0xf4, 0x03, 0x23, 0xff, 0xf4, 0x03, 0xa6, + 0xff, 0xf4, 0x03, 0xc9, 0xff, 0xf4, 0x03, 0xca, 0xff, 0xf0, 0x03, 0xd2, + 0xff, 0xf4, 0x03, 0xda, 0xff, 0xf4, 0x03, 0xeb, 0xff, 0xf4, 0x03, 0xf3, + 0xff, 0xf4, 0x03, 0xf6, 0xff, 0xf0, 0x04, 0x04, 0xff, 0xf0, 0x04, 0x14, + 0xff, 0xf4, 0x04, 0x16, 0xff, 0xf4, 0x04, 0x18, 0xff, 0xf4, 0x04, 0x71, + 0xff, 0xf4, 0x04, 0x73, 0xff, 0xf4, 0x04, 0x75, 0xff, 0xf4, 0x04, 0xc3, + 0xff, 0xf4, 0x04, 0xc5, 0xff, 0xf4, 0x00, 0x0a, 0x00, 0x06, 0xff, 0xd6, + 0x00, 0x0b, 0xff, 0xd6, 0x01, 0x84, 0xff, 0xd6, 0x01, 0x85, 0xff, 0xd6, + 0x01, 0x87, 0xff, 0xd6, 0x01, 0x88, 0xff, 0xd6, 0x01, 0x89, 0xff, 0xd6, + 0x03, 0xdb, 0xff, 0xd6, 0x03, 0xdc, 0xff, 0xd6, 0x03, 0xdf, 0xff, 0xd6, + 0x00, 0x15, 0x00, 0x5c, 0xff, 0xe0, 0x00, 0xee, 0xff, 0xe0, 0x00, 0xf6, + 0xff, 0x76, 0x00, 0xf9, 0xff, 0xc2, 0x00, 0xfe, 0xff, 0xd3, 0x01, 0x09, + 0xff, 0xd9, 0x01, 0x20, 0xff, 0xdb, 0x01, 0x34, 0xff, 0xe0, 0x01, 0x3a, + 0xff, 0x1e, 0x01, 0x44, 0xff, 0xe0, 0x01, 0x48, 0xff, 0xc2, 0x01, 0x4a, + 0xff, 0xed, 0x01, 0x5e, 0xff, 0xe0, 0x01, 0x63, 0xff, 0xf0, 0x01, 0x65, + 0xff, 0xf2, 0x01, 0x6d, 0xff, 0x56, 0x03, 0xca, 0xff, 0xe0, 0x03, 0xf6, + 0xff, 0xe0, 0x04, 0x04, 0xff, 0xe0, 0x04, 0x1a, 0xff, 0xc2, 0x04, 0x7a, + 0xff, 0xc2, 0x00, 0x0d, 0x00, 0xf6, 0xff, 0x64, 0x00, 0xf9, 0xff, 0xd2, + 0x00, 0xfe, 0xff, 0xd9, 0x01, 0x09, 0xff, 0xd9, 0x01, 0x20, 0xff, 0xdb, + 0x01, 0x3a, 0xff, 0x1e, 0x01, 0x48, 0xff, 0xd2, 0x01, 0x4a, 0xff, 0xed, + 0x01, 0x63, 0xff, 0xf0, 0x01, 0x65, 0xff, 0xf2, 0x01, 0x6d, 0xff, 0x56, + 0x04, 0x1a, 0xff, 0xd2, 0x04, 0x7a, 0xff, 0xd2, 0x00, 0x09, 0x00, 0xf6, + 0xff, 0x6a, 0x00, 0xfe, 0xff, 0xc6, 0x01, 0x09, 0xff, 0xd9, 0x01, 0x20, + 0xff, 0xdb, 0x01, 0x3a, 0xff, 0x1e, 0x01, 0x4a, 0xff, 0xed, 0x01, 0x63, + 0xff, 0xf0, 0x01, 0x65, 0xff, 0xf2, 0x01, 0x6d, 0xff, 0x56, 0x00, 0x0a, + 0x00, 0x06, 0xff, 0xd7, 0x00, 0x0b, 0xff, 0xd7, 0x01, 0x84, 0xff, 0xd7, + 0x01, 0x85, 0xff, 0xd7, 0x01, 0x87, 0xff, 0xd7, 0x01, 0x88, 0xff, 0xd7, + 0x01, 0x89, 0xff, 0xd7, 0x03, 0xdb, 0xff, 0xd7, 0x03, 0xdc, 0xff, 0xd7, + 0x03, 0xdf, 0xff, 0xd7, 0x00, 0x62, 0x00, 0x47, 0xff, 0x98, 0x00, 0x48, + 0xff, 0x98, 0x00, 0x49, 0xff, 0x98, 0x00, 0x4b, 0xff, 0x98, 0x00, 0x53, + 0xff, 0x70, 0x00, 0x55, 0xff, 0x98, 0x00, 0x57, 0xff, 0x18, 0x00, 0x5b, + 0x00, 0x0b, 0x00, 0x94, 0xff, 0x98, 0x00, 0x99, 0xff, 0x98, 0x00, 0xbb, + 0xff, 0x98, 0x00, 0xc8, 0xff, 0x98, 0x00, 0xc9, 0xff, 0x98, 0x00, 0xf7, + 0xff, 0x98, 0x01, 0x03, 0xff, 0x98, 0x01, 0x18, 0xff, 0x70, 0x01, 0x1e, + 0xff, 0x98, 0x01, 0x22, 0xff, 0x98, 0x01, 0x42, 0xff, 0x98, 0x01, 0x60, + 0xff, 0x98, 0x01, 0x61, 0xff, 0x98, 0x01, 0x6b, 0xff, 0x98, 0x01, 0xc1, + 0xff, 0x18, 0x02, 0xa1, 0xff, 0x98, 0x02, 0xa2, 0xff, 0x98, 0x02, 0xa3, + 0xff, 0x98, 0x02, 0xa4, 0xff, 0x98, 0x02, 0xa5, 0xff, 0x98, 0x02, 0xab, + 0xff, 0x70, 0x02, 0xac, 0xff, 0x70, 0x02, 0xad, 0xff, 0x70, 0x02, 0xae, + 0xff, 0x70, 0x02, 0xaf, 0xff, 0x70, 0x02, 0xbd, 0xff, 0x98, 0x02, 0xbf, + 0xff, 0x98, 0x02, 0xc1, 0xff, 0x98, 0x02, 0xc3, 0xff, 0x98, 0x02, 0xc5, + 0xff, 0x98, 0x02, 0xc7, 0xff, 0x98, 0x02, 0xc9, 0xff, 0x98, 0x02, 0xcb, + 0xff, 0x98, 0x02, 0xcd, 0xff, 0x98, 0x02, 0xcf, 0xff, 0x98, 0x02, 0xd1, + 0xff, 0x98, 0x02, 0xd3, 0xff, 0x98, 0x02, 0xd5, 0xff, 0x98, 0x02, 0xd7, + 0xff, 0x98, 0x02, 0xf9, 0xff, 0x70, 0x02, 0xfb, 0xff, 0x70, 0x02, 0xfd, + 0xff, 0x70, 0x03, 0x05, 0xff, 0x18, 0x03, 0x07, 0xff, 0x18, 0x03, 0x09, + 0xff, 0x18, 0x03, 0x0b, 0xff, 0x18, 0x03, 0x0d, 0xff, 0x18, 0x03, 0x9e, + 0xff, 0x98, 0x03, 0xa4, 0xff, 0x70, 0x03, 0xaa, 0xff, 0x70, 0x03, 0xc4, + 0xff, 0x98, 0x03, 0xc6, 0xff, 0x70, 0x03, 0xc8, 0xff, 0x98, 0x03, 0xcb, + 0xff, 0x98, 0x03, 0xcd, 0xff, 0x18, 0x03, 0xe6, 0xff, 0x98, 0x03, 0xec, + 0xff, 0x98, 0x03, 0xf1, 0xff, 0x98, 0x03, 0xff, 0xff, 0x98, 0x04, 0x01, + 0xff, 0x98, 0x04, 0x02, 0xff, 0x98, 0x04, 0x0c, 0xff, 0x70, 0x04, 0x0e, + 0xff, 0x98, 0x04, 0x10, 0xff, 0x70, 0x04, 0x1d, 0xff, 0x98, 0x04, 0x37, + 0xff, 0x98, 0x04, 0x39, 0xff, 0x98, 0x04, 0x3b, 0xff, 0x98, 0x04, 0x3d, + 0xff, 0x98, 0x04, 0x3f, 0xff, 0x98, 0x04, 0x41, 0xff, 0x98, 0x04, 0x43, + 0xff, 0x98, 0x04, 0x45, 0xff, 0x98, 0x04, 0x4b, 0xff, 0x70, 0x04, 0x4d, + 0xff, 0x70, 0x04, 0x4f, 0xff, 0x70, 0x04, 0x51, 0xff, 0x70, 0x04, 0x53, + 0xff, 0x70, 0x04, 0x55, 0xff, 0x70, 0x04, 0x57, 0xff, 0x70, 0x04, 0x59, + 0xff, 0x98, 0x04, 0x5b, 0xff, 0x98, 0x04, 0x5d, 0xff, 0x98, 0x04, 0x5f, + 0xff, 0x70, 0x04, 0x61, 0xff, 0x98, 0x04, 0x9c, 0xff, 0x98, 0x04, 0xa0, + 0xff, 0x70, 0x04, 0xa9, 0xff, 0x98, 0x04, 0xab, 0xff, 0x98, 0x04, 0xbe, + 0xff, 0x18, 0x00, 0x13, 0x01, 0xd3, 0xff, 0xee, 0x01, 0xd5, 0xff, 0xf5, + 0x01, 0xd6, 0xff, 0xf1, 0x01, 0xd8, 0xff, 0xf2, 0x01, 0xf4, 0xff, 0xf2, + 0x01, 0xf8, 0xff, 0xf2, 0x02, 0x10, 0xff, 0xf2, 0x02, 0x12, 0xff, 0xee, + 0x02, 0x14, 0xff, 0xf2, 0x03, 0x4c, 0xff, 0xee, 0x03, 0x78, 0xff, 0xf2, + 0x03, 0x80, 0xff, 0xf5, 0x03, 0x81, 0xff, 0xee, 0x03, 0x82, 0xff, 0xee, + 0x04, 0xd0, 0xff, 0xee, 0x04, 0xde, 0xff, 0xee, 0x04, 0xe1, 0xff, 0xee, + 0x04, 0xf5, 0xff, 0xf2, 0x04, 0xfa, 0xff, 0xee, 0x00, 0x13, 0x01, 0xd3, + 0xff, 0xe5, 0x01, 0xd5, 0xff, 0xf1, 0x01, 0xd6, 0xff, 0xeb, 0x01, 0xd8, + 0xff, 0xe9, 0x01, 0xf4, 0xff, 0xe9, 0x01, 0xf8, 0xff, 0xe9, 0x02, 0x10, + 0xff, 0xe9, 0x02, 0x12, 0xff, 0xe5, 0x02, 0x14, 0xff, 0xe9, 0x03, 0x4c, + 0xff, 0xe5, 0x03, 0x78, 0xff, 0xe9, 0x03, 0x80, 0xff, 0xf1, 0x03, 0x81, + 0xff, 0xe5, 0x03, 0x82, 0xff, 0xe5, 0x04, 0xd0, 0xff, 0xe5, 0x04, 0xde, + 0xff, 0xe5, 0x04, 0xe1, 0xff, 0xe5, 0x04, 0xf5, 0xff, 0xe9, 0x04, 0xfa, + 0xff, 0xe5, 0x00, 0x03, 0x01, 0xd5, 0xff, 0xf5, 0x01, 0xd6, 0xff, 0xee, + 0x03, 0x80, 0xff, 0xf5, 0x00, 0x02, 0x01, 0xd6, 0xff, 0xb7, 0x01, 0xdb, + 0xff, 0xf0, 0x00, 0x01, 0x00, 0x5b, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0d, + 0xff, 0xe6, 0x00, 0x41, 0xff, 0xf4, 0x00, 0x61, 0xff, 0xef, 0x01, 0x4d, + 0xff, 0xed, 0x00, 0x16, 0x00, 0xb8, 0xff, 0xd4, 0x00, 0xc2, 0xff, 0xed, + 0x00, 0xc4, 0x00, 0x11, 0x00, 0xca, 0xff, 0xe0, 0x00, 0xcc, 0xff, 0xe7, + 0x00, 0xcd, 0xff, 0xe5, 0x00, 0xce, 0xff, 0xee, 0x00, 0xd9, 0x00, 0x12, + 0x00, 0xea, 0xff, 0xe9, 0x00, 0xf6, 0xff, 0xd7, 0x01, 0x3a, 0xff, 0xd7, + 0x01, 0x4a, 0xff, 0xd3, 0x01, 0x4c, 0xff, 0xd6, 0x01, 0x4d, 0xff, 0xc5, + 0x01, 0x58, 0xff, 0xe7, 0x01, 0x62, 0x00, 0x0d, 0x01, 0x64, 0x00, 0x0c, + 0x01, 0x6d, 0xff, 0xd6, 0x01, 0x6e, 0xff, 0xf2, 0x01, 0xdb, 0xff, 0xe9, + 0x01, 0xe5, 0xff, 0xe7, 0x02, 0x31, 0xff, 0xe9, 0x00, 0x01, 0x01, 0x1c, + 0xff, 0xf1, 0x00, 0x12, 0x00, 0xd9, 0xff, 0xae, 0x00, 0xe6, 0x00, 0x12, + 0x00, 0xeb, 0xff, 0xe0, 0x00, 0xed, 0xff, 0xad, 0x00, 0xef, 0xff, 0xd6, + 0x00, 0xfd, 0xff, 0xdf, 0x01, 0x01, 0xff, 0xd2, 0x01, 0x07, 0xff, 0xe0, + 0x01, 0x1c, 0xff, 0xce, 0x01, 0x2e, 0xff, 0xdd, 0x01, 0x30, 0xff, 0xe2, + 0x01, 0x38, 0xff, 0xe0, 0x01, 0x40, 0xff, 0xe0, 0x01, 0x4a, 0xff, 0xe9, + 0x01, 0x4d, 0xff, 0xda, 0x01, 0x5f, 0xff, 0xbd, 0x01, 0x69, 0xff, 0xdf, + 0x01, 0x6c, 0x00, 0x11, 0x00, 0x02, 0x00, 0xf6, 0xff, 0xf5, 0x01, 0x85, + 0xff, 0xc0, 0x00, 0x02, 0x00, 0xed, 0xff, 0x68, 0x01, 0x1c, 0xff, 0xee, + 0x00, 0x0a, 0x00, 0xe6, 0xff, 0xc3, 0x00, 0xf6, 0xff, 0xcf, 0x00, 0xfe, + 0xff, 0xd4, 0x01, 0x3a, 0xff, 0xce, 0x01, 0x49, 0xff, 0xe7, 0x01, 0x4c, + 0xff, 0xdf, 0x01, 0x62, 0xff, 0xd1, 0x01, 0x64, 0xff, 0xec, 0x01, 0x6c, + 0xff, 0xa0, 0x01, 0x6d, 0xff, 0xd1, 0x00, 0x30, 0x00, 0x56, 0xff, 0x7e, + 0x00, 0x5b, 0xff, 0x9d, 0x00, 0x6d, 0xfe, 0xf1, 0x00, 0x7c, 0xfe, 0xf4, + 0x00, 0x81, 0xfe, 0xab, 0x00, 0x86, 0xff, 0x5e, 0x00, 0x89, 0xff, 0x4b, + 0x00, 0xb8, 0xff, 0x72, 0x00, 0xbf, 0xff, 0x0f, 0x00, 0xc3, 0xff, 0x0a, + 0x00, 0xc6, 0xff, 0x41, 0x00, 0xc7, 0xff, 0x07, 0x00, 0xca, 0xff, 0x68, + 0x00, 0xcc, 0xff, 0x0f, 0x00, 0xcd, 0xff, 0x0e, 0x00, 0xce, 0xff, 0x0c, + 0x00, 0xd9, 0xff, 0x63, 0x00, 0xe6, 0x00, 0x05, 0x00, 0xea, 0xff, 0xbd, + 0x00, 0xeb, 0xff, 0x49, 0x00, 0xed, 0xfe, 0xfe, 0x00, 0xef, 0xff, 0x13, + 0x00, 0xf6, 0xff, 0x68, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfe, 0xff, 0x68, + 0x00, 0xff, 0xff, 0x13, 0x01, 0x01, 0xff, 0x07, 0x01, 0x02, 0x00, 0x30, + 0x01, 0x07, 0xff, 0x0e, 0x01, 0x09, 0xff, 0x11, 0x01, 0x1c, 0xfe, 0xe7, + 0x01, 0x20, 0xff, 0xac, 0x01, 0x2e, 0xff, 0x15, 0x01, 0x30, 0xff, 0x3c, + 0x01, 0x38, 0xff, 0x0e, 0x01, 0x3a, 0xff, 0x6a, 0x01, 0x40, 0xff, 0x49, + 0x01, 0x4a, 0xff, 0x0c, 0x01, 0x4c, 0xff, 0x3f, 0x01, 0x4d, 0xfe, 0xf1, + 0x01, 0x58, 0xff, 0xc0, 0x01, 0x5f, 0xfe, 0xef, 0x01, 0x63, 0xff, 0x31, + 0x01, 0x65, 0xff, 0x5f, 0x01, 0x69, 0xff, 0x0a, 0x01, 0x6c, 0x00, 0x05, + 0x01, 0x6d, 0xff, 0x30, 0x01, 0x6e, 0xff, 0xd5, 0x00, 0x1d, 0x00, 0x0a, + 0xff, 0xe2, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x0e, 0xff, 0xcf, 0x00, 0x41, + 0x00, 0x12, 0x00, 0x4a, 0xff, 0xea, 0x00, 0x56, 0xff, 0xd8, 0x00, 0x58, + 0xff, 0xea, 0x00, 0x61, 0x00, 0x13, 0x00, 0x6d, 0xff, 0xae, 0x00, 0x7c, + 0xff, 0xcd, 0x00, 0x81, 0xff, 0xa0, 0x00, 0x86, 0xff, 0xc1, 0x00, 0x89, + 0xff, 0xc0, 0x00, 0xb8, 0xff, 0xd0, 0x00, 0xbc, 0xff, 0xea, 0x00, 0xbf, + 0xff, 0xc6, 0x00, 0xc0, 0x00, 0x0d, 0x00, 0xc2, 0xff, 0xe9, 0x00, 0xc3, + 0xff, 0xd6, 0x00, 0xc6, 0xff, 0xe8, 0x00, 0xc7, 0xff, 0xba, 0x00, 0xca, + 0xff, 0xe9, 0x00, 0xcc, 0xff, 0xcb, 0x00, 0xcd, 0xff, 0xda, 0x00, 0xce, + 0xff, 0xc7, 0x01, 0x8d, 0xff, 0xd3, 0x01, 0xdb, 0xff, 0xcb, 0x01, 0xe5, + 0xff, 0xcb, 0x02, 0x31, 0xff, 0xcd, 0x00, 0x18, 0x00, 0x23, 0xff, 0xaf, + 0x00, 0x58, 0xff, 0xef, 0x00, 0x5b, 0xff, 0xdf, 0x00, 0x9a, 0xff, 0xee, + 0x00, 0xb8, 0xff, 0xe5, 0x00, 0xb9, 0xff, 0xd1, 0x00, 0xc4, 0x00, 0x11, + 0x00, 0xca, 0xff, 0xc8, 0x00, 0xd9, 0x00, 0x13, 0x00, 0xe6, 0xff, 0xc5, + 0x00, 0xf6, 0xff, 0xca, 0x00, 0xfe, 0xff, 0xd0, 0x01, 0x3a, 0xff, 0x81, + 0x01, 0x49, 0xff, 0x65, 0x01, 0x4a, 0xff, 0x85, 0x01, 0x4c, 0xff, 0x66, + 0x01, 0x4d, 0xff, 0xdd, 0x01, 0x58, 0xff, 0xf2, 0x01, 0x62, 0xff, 0xb1, + 0x01, 0x64, 0xff, 0xca, 0x01, 0x6c, 0xff, 0xa9, 0x01, 0x6d, 0xff, 0xc8, + 0x01, 0xd6, 0xff, 0xcd, 0x01, 0xe5, 0xff, 0xf5, 0x00, 0x08, 0x00, 0xf6, + 0xff, 0xf0, 0x00, 0xfe, 0xff, 0xf0, 0x01, 0x09, 0xff, 0xf1, 0x01, 0x20, + 0xff, 0xf3, 0x01, 0x3a, 0xff, 0xf1, 0x01, 0x63, 0xff, 0xf3, 0x01, 0x65, + 0xff, 0xf3, 0x01, 0x6d, 0xff, 0xf1, 0x00, 0x03, 0x00, 0x4a, 0xff, 0xee, + 0x00, 0x5b, 0xff, 0xea, 0x01, 0xd6, 0xff, 0xf0, 0x00, 0x09, 0x00, 0xca, + 0xff, 0xea, 0x00, 0xed, 0xff, 0xb8, 0x00, 0xf6, 0xff, 0xe2, 0x01, 0x09, + 0xff, 0xf0, 0x01, 0x20, 0xff, 0xf1, 0x01, 0x3a, 0xff, 0xeb, 0x01, 0x63, + 0xff, 0xf5, 0x01, 0x6d, 0xff, 0xec, 0x01, 0x85, 0xff, 0x90, 0x00, 0x02, + 0x01, 0x11, 0x00, 0x0b, 0x01, 0x6c, 0xff, 0xe6, 0x00, 0x13, 0x00, 0x5b, + 0xff, 0xc1, 0x00, 0xb8, 0xff, 0xc5, 0x00, 0xca, 0xff, 0xb4, 0x00, 0xea, + 0xff, 0xd7, 0x00, 0xf6, 0xff, 0xb9, 0x00, 0xfe, 0xff, 0xe9, 0x01, 0x09, + 0xff, 0xb2, 0x01, 0x1c, 0xff, 0xd2, 0x01, 0x20, 0xff, 0xc8, 0x01, 0x3a, + 0xff, 0xa0, 0x01, 0x4a, 0xff, 0xc5, 0x01, 0x58, 0xff, 0xe4, 0x01, 0x63, + 0xff, 0xcc, 0x01, 0x65, 0xff, 0xcc, 0x01, 0x6d, 0xff, 0xcb, 0x01, 0x6e, + 0xff, 0xef, 0x01, 0xdb, 0xff, 0xe7, 0x01, 0xe5, 0xff, 0xe6, 0x02, 0x31, + 0xff, 0xe8, 0x00, 0x05, 0x00, 0x5b, 0xff, 0xcc, 0x01, 0xd6, 0xff, 0xb8, + 0x01, 0xdb, 0xff, 0xf2, 0x01, 0xe5, 0xff, 0xf1, 0x02, 0x31, 0xff, 0xf3, + 0x00, 0x08, 0x00, 0xd9, 0x00, 0x15, 0x00, 0xed, 0x00, 0x15, 0x01, 0x49, + 0xff, 0xe4, 0x01, 0x4a, 0xff, 0xe5, 0x01, 0x4c, 0xff, 0xe4, 0x01, 0x62, + 0xff, 0xe3, 0x01, 0x64, 0xff, 0xe2, 0x01, 0x6c, 0xff, 0xe4, 0x00, 0x02, + 0x00, 0xf6, 0xff, 0xd6, 0x01, 0x85, 0xff, 0x88, 0x00, 0x07, 0x00, 0x58, + 0x00, 0x0e, 0x00, 0x81, 0xfe, 0xd7, 0x00, 0xc4, 0xff, 0x98, 0x00, 0xc7, + 0xff, 0xc7, 0x00, 0xd9, 0xff, 0x12, 0x00, 0xed, 0xff, 0x52, 0x01, 0x5f, + 0xff, 0xcf, 0x00, 0x06, 0x00, 0xca, 0xff, 0xea, 0x00, 0xed, 0xff, 0xee, + 0x00, 0xf6, 0xff, 0xd6, 0x00, 0xfe, 0xff, 0xed, 0x01, 0x3a, 0xff, 0xec, + 0x01, 0x6d, 0xff, 0xec, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x14, 0x00, 0x58, + 0x00, 0x32, 0x00, 0x5b, 0x00, 0x11, 0x01, 0x85, 0x00, 0x10, 0x00, 0x34, + 0x00, 0x04, 0xff, 0xc4, 0x00, 0x56, 0xff, 0xbf, 0x00, 0x5b, 0xff, 0xd1, + 0x00, 0x6d, 0xff, 0x6c, 0x00, 0x7c, 0xff, 0x6e, 0x00, 0x81, 0xff, 0x43, + 0x00, 0x86, 0xff, 0xac, 0x00, 0x89, 0xff, 0xa1, 0x00, 0xb8, 0xff, 0xb8, + 0x00, 0xbf, 0xff, 0x7e, 0x00, 0xc3, 0xff, 0x7b, 0x00, 0xc6, 0xff, 0x9b, + 0x00, 0xc7, 0xff, 0x79, 0x00, 0xca, 0xff, 0xb2, 0x00, 0xcc, 0xff, 0x7e, + 0x00, 0xcd, 0xff, 0x7d, 0x00, 0xce, 0xff, 0x7c, 0x00, 0xd9, 0xff, 0xaf, + 0x00, 0xe6, 0x00, 0x0f, 0x00, 0xea, 0xff, 0xe4, 0x00, 0xeb, 0xff, 0xa0, + 0x00, 0xed, 0xff, 0x74, 0x00, 0xef, 0xff, 0x80, 0x00, 0xf6, 0xff, 0xb2, + 0x00, 0xfd, 0xff, 0x7d, 0x00, 0xfe, 0xff, 0xb2, 0x00, 0xff, 0xff, 0x80, + 0x01, 0x01, 0xff, 0x79, 0x01, 0x02, 0x00, 0x28, 0x01, 0x07, 0xff, 0x7d, + 0x01, 0x09, 0xff, 0x7f, 0x01, 0x1c, 0xff, 0x66, 0x01, 0x20, 0xff, 0xda, + 0x01, 0x2e, 0xff, 0x81, 0x01, 0x30, 0xff, 0x98, 0x01, 0x38, 0xff, 0x7d, + 0x01, 0x3a, 0xff, 0xb3, 0x01, 0x40, 0xff, 0xa0, 0x01, 0x4a, 0xff, 0x7c, + 0x01, 0x4c, 0xff, 0x9a, 0x01, 0x4d, 0xff, 0x6c, 0x01, 0x58, 0xff, 0xe6, + 0x01, 0x5f, 0xff, 0x6b, 0x01, 0x63, 0xff, 0x92, 0x01, 0x65, 0xff, 0xad, + 0x01, 0x69, 0xff, 0x7b, 0x01, 0x6c, 0x00, 0x0f, 0x01, 0x6d, 0xff, 0x91, + 0x01, 0x6e, 0xff, 0xf2, 0x01, 0xdb, 0xff, 0xb9, 0x01, 0xe5, 0xff, 0xb9, + 0x02, 0x31, 0xff, 0xb9, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x41, + 0x00, 0x11, 0x00, 0x56, 0xff, 0xe2, 0x00, 0x61, 0x00, 0x13, 0x01, 0xdb, + 0xff, 0xd9, 0x01, 0xe5, 0xff, 0xd9, 0x02, 0x31, 0xff, 0xd9, 0x00, 0x06, + 0x00, 0x4a, 0x00, 0x0d, 0x00, 0xc6, 0x00, 0x0b, 0x00, 0xc7, 0xff, 0xea, + 0x00, 0xca, 0x00, 0x0c, 0x00, 0xed, 0xff, 0xc8, 0x01, 0x1c, 0xff, 0xf1, + 0x00, 0x07, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0x41, 0x00, 0x0c, 0x00, 0x56, + 0xff, 0xeb, 0x00, 0x61, 0x00, 0x0e, 0x01, 0xdb, 0xff, 0xe7, 0x01, 0xe5, + 0xff, 0xe7, 0x02, 0x31, 0xff, 0xe9, 0x00, 0x06, 0x00, 0x5b, 0xff, 0xe5, + 0x00, 0xb8, 0xff, 0xcb, 0x00, 0xcd, 0xff, 0xe4, 0x01, 0xdb, 0xff, 0xec, + 0x01, 0xe5, 0xff, 0xeb, 0x02, 0x31, 0xff, 0xed, 0x00, 0x07, 0x00, 0x81, + 0xff, 0xdf, 0x00, 0xb5, 0xff, 0xf3, 0x00, 0xb7, 0xff, 0xf0, 0x00, 0xc4, + 0xff, 0xea, 0x00, 0xd9, 0xff, 0xdf, 0x00, 0xe6, 0xff, 0xe0, 0x01, 0x6c, + 0xff, 0xe0, 0x00, 0x01, 0x01, 0xdb, 0xff, 0xeb, 0x00, 0x04, 0x01, 0xd6, + 0xff, 0xc7, 0x01, 0xdb, 0xff, 0xf2, 0x01, 0xe5, 0xff, 0xf2, 0x02, 0x31, + 0xff, 0xf2, 0x00, 0x01, 0x01, 0xd6, 0xff, 0xf1, 0x00, 0x01, 0x01, 0xd6, + 0x00, 0x0d, 0x00, 0x02, 0x0b, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x0e, 0xac, + 0x17, 0x68, 0x00, 0x26, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xe3, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe4, + 0xff, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xeb, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xab, 0xff, 0xd5, 0xff, 0xed, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xea, 0x00, 0x00, 0xff, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe1, + 0xff, 0x86, 0x00, 0x00, 0xff, 0xf5, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xeb, 0xff, 0xd0, 0xff, 0xf4, 0xff, 0xf5, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xf5, 0xff, 0xce, 0xff, 0xef, 0xff, 0x88, 0xff, 0x6a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf1, + 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0xff, 0xd9, 0xff, 0xc4, 0xff, 0xc7, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xc9, 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xff, 0xeb, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xed, 0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe6, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe3, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf1, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x59, 0xff, 0xd7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe6, 0xff, 0xe1, 0x00, 0x00, + 0xff, 0xe5, 0xff, 0xe9, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe7, 0xff, 0xd8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0xa3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xbf, 0xff, 0xe3, + 0xff, 0xd8, 0xff, 0xbf, 0xff, 0xd9, 0xff, 0x6a, 0xff, 0xc1, 0xff, 0xcb, + 0xff, 0xec, 0xff, 0xa0, 0x00, 0x11, 0x00, 0x12, 0xff, 0xab, 0xff, 0xc6, + 0xff, 0xe2, 0xff, 0xf0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe9, 0x00, 0x11, 0x00, 0x00, 0xff, 0xf3, 0x00, 0x00, 0xff, 0x19, + 0x00, 0x00, 0xff, 0xef, 0x00, 0x12, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xa0, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xea, 0xff, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xa7, 0xff, 0xe4, 0xff, 0xa7, 0xff, 0x30, 0xff, 0xbf, 0xff, 0x88, + 0xff, 0x58, 0xff, 0xb9, 0xff, 0xae, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, + 0xff, 0xaf, 0xff, 0xb4, 0xff, 0xc4, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xf1, + 0xff, 0xcb, 0xfe, 0xfe, 0xff, 0x7e, 0xff, 0xed, 0x00, 0x10, 0xff, 0xbc, + 0xfe, 0xf0, 0x00, 0x00, 0xff, 0x7c, 0x00, 0x00, 0xff, 0x28, 0xff, 0xf1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xbf, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xd8, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xeb, 0xff, 0xe6, 0x00, 0x00, + 0xff, 0xeb, 0xff, 0xed, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xec, 0xff, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe6, 0xff, 0xe7, + 0x00, 0x00, 0xff, 0xeb, 0xff, 0xeb, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe7, + 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, + 0xff, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf3, + 0x00, 0x00, 0xff, 0x4e, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xcd, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x6f, 0xfe, 0x6c, 0xff, 0xa7, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf5, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xf2, 0x00, 0x13, 0x00, 0x00, 0xff, 0xf2, + 0xff, 0x85, 0xff, 0xe8, 0xff, 0x33, 0xfe, 0xe9, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xee, 0x00, 0x00, 0xfe, 0xe0, + 0x00, 0x00, 0xff, 0xa3, 0xff, 0xb7, 0xff, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd7, 0x00, 0x00, 0xff, 0xc5, + 0x00, 0x00, 0xff, 0xec, 0xff, 0xa5, 0x00, 0x00, 0xff, 0x88, 0xff, 0xce, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe1, 0xff, 0xed, + 0xff, 0xd5, 0xff, 0xdf, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0xff, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe5, 0xff, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd4, 0xff, 0xf3, 0x00, 0x00, + 0xff, 0xd2, 0xff, 0xe4, 0xff, 0xb5, 0xff, 0xd2, 0xff, 0xd9, 0xff, 0xf5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xeb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x79, 0xff, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9f, 0xff, 0xad, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xc0, 0xff, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc8, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xe7, 0x00, 0x00, 0xff, 0xeb, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x55, 0xff, 0xbd, 0xff, 0x55, 0xff, 0x66, + 0xff, 0x7e, 0xff, 0x33, 0xff, 0x5f, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0xff, 0x6b, 0xff, 0x86, 0xff, 0xd1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6a, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x92, 0xfe, 0x36, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0xfe, 0x1e, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xb4, 0xff, 0xbb, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xbd, + 0xff, 0xe9, 0xff, 0xae, 0xff, 0xbd, 0x00, 0x00, 0xff, 0xa5, 0xff, 0xaf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, + 0xff, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xca, + 0xfe, 0x77, 0xff, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x39, + 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x9a, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0b, + 0x00, 0x01, 0x00, 0x10, 0x00, 0x10, 0x00, 0x02, 0x00, 0x12, 0x00, 0x12, + 0x00, 0x03, 0x00, 0x25, 0x00, 0x29, 0x00, 0x04, 0x00, 0x2c, 0x00, 0x34, + 0x00, 0x09, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x12, 0x00, 0x45, 0x00, 0x47, + 0x00, 0x19, 0x00, 0x49, 0x00, 0x49, 0x00, 0x1c, 0x00, 0x4c, 0x00, 0x4c, + 0x00, 0x1d, 0x00, 0x51, 0x00, 0x54, 0x00, 0x1e, 0x00, 0x56, 0x00, 0x56, + 0x00, 0x22, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x23, 0x00, 0x5c, 0x00, 0x5e, + 0x00, 0x24, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x27, 0x00, 0x96, 0x00, 0x96, + 0x00, 0x28, 0x00, 0xb1, 0x00, 0xb4, 0x00, 0x29, 0x00, 0xbd, 0x00, 0xbd, + 0x00, 0x2d, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0x2e, 0x00, 0xc7, 0x00, 0xc7, + 0x00, 0x2f, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x30, 0x00, 0xd7, 0x00, 0xd7, + 0x00, 0x32, 0x00, 0xda, 0x00, 0xda, 0x00, 0x33, 0x00, 0xdc, 0x00, 0xde, + 0x00, 0x34, 0x00, 0xe0, 0x00, 0xe6, 0x00, 0x37, 0x00, 0xec, 0x00, 0xec, + 0x00, 0x3e, 0x00, 0xee, 0x00, 0xee, 0x00, 0x3f, 0x00, 0xf7, 0x00, 0xf7, + 0x00, 0x40, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x41, 0x00, 0xfe, 0x00, 0xff, + 0x00, 0x42, 0x01, 0x04, 0x01, 0x05, 0x00, 0x44, 0x01, 0x0a, 0x01, 0x0a, + 0x00, 0x46, 0x01, 0x0d, 0x01, 0x0d, 0x00, 0x47, 0x01, 0x18, 0x01, 0x1a, + 0x00, 0x48, 0x01, 0x2e, 0x01, 0x30, 0x00, 0x4b, 0x01, 0x33, 0x01, 0x35, + 0x00, 0x4e, 0x01, 0x37, 0x01, 0x37, 0x00, 0x51, 0x01, 0x39, 0x01, 0x39, + 0x00, 0x52, 0x01, 0x3b, 0x01, 0x3b, 0x00, 0x53, 0x01, 0x43, 0x01, 0x44, + 0x00, 0x54, 0x01, 0x54, 0x01, 0x54, 0x00, 0x56, 0x01, 0x56, 0x01, 0x56, + 0x00, 0x57, 0x01, 0x58, 0x01, 0x58, 0x00, 0x58, 0x01, 0x5c, 0x01, 0x5e, + 0x00, 0x59, 0x01, 0x84, 0x01, 0x8a, 0x00, 0x5c, 0x01, 0x8e, 0x01, 0x8f, + 0x00, 0x63, 0x01, 0xd8, 0x01, 0xd8, 0x00, 0x65, 0x01, 0xdd, 0x01, 0xdd, + 0x00, 0x66, 0x01, 0xe0, 0x01, 0xe1, 0x00, 0x67, 0x01, 0xeb, 0x01, 0xed, + 0x00, 0x69, 0x01, 0xff, 0x01, 0xff, 0x00, 0x6c, 0x02, 0x0e, 0x02, 0x10, + 0x00, 0x6d, 0x02, 0x30, 0x02, 0x30, 0x00, 0x70, 0x02, 0x33, 0x02, 0x33, + 0x00, 0x71, 0x02, 0x45, 0x02, 0x45, 0x00, 0x72, 0x02, 0x47, 0x02, 0x48, + 0x00, 0x73, 0x02, 0x7a, 0x02, 0x7b, 0x00, 0x75, 0x02, 0x7d, 0x02, 0x7d, + 0x00, 0x77, 0x02, 0x7f, 0x02, 0xa5, 0x00, 0x78, 0x02, 0xaa, 0x02, 0xaf, + 0x00, 0x9f, 0x02, 0xb4, 0x02, 0xc4, 0x00, 0xa5, 0x02, 0xc6, 0x02, 0xcf, + 0x00, 0xb6, 0x02, 0xd8, 0x02, 0xda, 0x00, 0xc0, 0x02, 0xdc, 0x02, 0xdc, + 0x00, 0xc3, 0x02, 0xde, 0x02, 0xde, 0x00, 0xc4, 0x02, 0xe0, 0x02, 0xe0, + 0x00, 0xc5, 0x02, 0xe2, 0x02, 0xe2, 0x00, 0xc6, 0x02, 0xe5, 0x02, 0xe5, + 0x00, 0xc7, 0x02, 0xe7, 0x02, 0xe7, 0x00, 0xc8, 0x02, 0xe9, 0x02, 0xe9, + 0x00, 0xc9, 0x02, 0xeb, 0x02, 0xeb, 0x00, 0xca, 0x02, 0xed, 0x02, 0xed, + 0x00, 0xcb, 0x02, 0xef, 0x02, 0xef, 0x00, 0xcc, 0x02, 0xf1, 0x02, 0xfd, + 0x00, 0xcd, 0x02, 0xff, 0x02, 0xff, 0x00, 0xda, 0x03, 0x01, 0x03, 0x01, + 0x00, 0xdb, 0x03, 0x03, 0x03, 0x03, 0x00, 0xdc, 0x03, 0x0e, 0x03, 0x0e, + 0x00, 0xdd, 0x03, 0x10, 0x03, 0x10, 0x00, 0xde, 0x03, 0x12, 0x03, 0x12, + 0x00, 0xdf, 0x03, 0x14, 0x03, 0x14, 0x00, 0xe0, 0x03, 0x16, 0x03, 0x16, + 0x00, 0xe1, 0x03, 0x18, 0x03, 0x18, 0x00, 0xe2, 0x03, 0x1a, 0x03, 0x1a, + 0x00, 0xe3, 0x03, 0x1c, 0x03, 0x1c, 0x00, 0xe4, 0x03, 0x1e, 0x03, 0x1e, + 0x00, 0xe5, 0x03, 0x20, 0x03, 0x20, 0x00, 0xe6, 0x03, 0x22, 0x03, 0x2a, + 0x00, 0xe7, 0x03, 0x2f, 0x03, 0x38, 0x00, 0xf0, 0x03, 0x43, 0x03, 0x47, + 0x00, 0xfa, 0x03, 0x4d, 0x03, 0x4f, 0x00, 0xff, 0x03, 0x54, 0x03, 0x54, + 0x01, 0x02, 0x03, 0x65, 0x03, 0x69, 0x01, 0x03, 0x03, 0x6d, 0x03, 0x6f, + 0x01, 0x08, 0x03, 0x78, 0x03, 0x78, 0x01, 0x0b, 0x03, 0x86, 0x03, 0x8b, + 0x01, 0x0c, 0x03, 0x8e, 0x03, 0x9d, 0x01, 0x12, 0x03, 0xa0, 0x03, 0xa0, + 0x01, 0x22, 0x03, 0xa4, 0x03, 0xa4, 0x01, 0x23, 0x03, 0xa6, 0x03, 0xa6, + 0x01, 0x24, 0x03, 0xaa, 0x03, 0xaa, 0x01, 0x25, 0x03, 0xad, 0x03, 0xae, + 0x01, 0x26, 0x03, 0xb0, 0x03, 0xb9, 0x01, 0x28, 0x03, 0xbb, 0x03, 0xbd, + 0x01, 0x32, 0x03, 0xbf, 0x03, 0xc4, 0x01, 0x35, 0x03, 0xc6, 0x03, 0xcc, + 0x01, 0x3b, 0x03, 0xd2, 0x03, 0xd3, 0x01, 0x42, 0x03, 0xd5, 0x03, 0xd5, + 0x01, 0x44, 0x03, 0xd7, 0x03, 0xd7, 0x01, 0x45, 0x03, 0xd9, 0x03, 0xdc, + 0x01, 0x46, 0x03, 0xdf, 0x03, 0xe4, 0x01, 0x4a, 0x03, 0xe6, 0x03, 0xe6, + 0x01, 0x50, 0x03, 0xea, 0x03, 0xeb, 0x01, 0x51, 0x03, 0xf0, 0x03, 0xfb, + 0x01, 0x53, 0x03, 0xfe, 0x03, 0xff, 0x01, 0x5f, 0x04, 0x01, 0x04, 0x04, + 0x01, 0x61, 0x04, 0x0b, 0x04, 0x0c, 0x01, 0x65, 0x04, 0x10, 0x04, 0x10, + 0x01, 0x67, 0x04, 0x12, 0x04, 0x18, 0x01, 0x68, 0x04, 0x1e, 0x04, 0x46, + 0x01, 0x6f, 0x04, 0x48, 0x04, 0x48, 0x01, 0x98, 0x04, 0x4a, 0x04, 0x57, + 0x01, 0x99, 0x04, 0x5f, 0x04, 0x5f, 0x01, 0xa7, 0x04, 0x62, 0x04, 0x62, + 0x01, 0xa8, 0x04, 0x64, 0x04, 0x64, 0x01, 0xa9, 0x04, 0x70, 0x04, 0x75, + 0x01, 0xaa, 0x04, 0x77, 0x04, 0x77, 0x01, 0xb0, 0x04, 0x7b, 0x04, 0x7c, + 0x01, 0xb1, 0x04, 0x7f, 0x04, 0x7f, 0x01, 0xb3, 0x04, 0x81, 0x04, 0x82, + 0x01, 0xb4, 0x04, 0x84, 0x04, 0x84, 0x01, 0xb6, 0x04, 0x86, 0x04, 0x86, + 0x01, 0xb7, 0x04, 0x97, 0x04, 0x9b, 0x01, 0xb8, 0x04, 0x9d, 0x04, 0x9d, + 0x01, 0xbd, 0x04, 0x9f, 0x04, 0xa0, 0x01, 0xbe, 0x04, 0xa2, 0x04, 0xa2, + 0x01, 0xc0, 0x04, 0xa6, 0x04, 0xa8, 0x01, 0xc1, 0x04, 0xaa, 0x04, 0xaa, + 0x01, 0xc4, 0x04, 0xac, 0x04, 0xae, 0x01, 0xc5, 0x04, 0xb0, 0x04, 0xb0, + 0x01, 0xc8, 0x04, 0xb2, 0x04, 0xb2, 0x01, 0xc9, 0x04, 0xb4, 0x04, 0xba, + 0x01, 0xca, 0x04, 0xbc, 0x04, 0xbc, 0x01, 0xd1, 0x04, 0xbf, 0x04, 0xbf, + 0x01, 0xd2, 0x04, 0xc1, 0x04, 0xc6, 0x01, 0xd3, 0x04, 0xc8, 0x04, 0xcb, + 0x01, 0xd9, 0x04, 0xcf, 0x04, 0xcf, 0x01, 0xdd, 0x04, 0xd2, 0x04, 0xd2, + 0x01, 0xde, 0x04, 0xd8, 0x04, 0xd8, 0x01, 0xdf, 0x04, 0xdd, 0x04, 0xdd, + 0x01, 0xe0, 0x04, 0xe8, 0x04, 0xe8, 0x01, 0xe1, 0x04, 0xea, 0x04, 0xea, + 0x01, 0xe2, 0x04, 0xf1, 0x04, 0xf1, 0x01, 0xe3, 0x04, 0xf5, 0x04, 0xf5, + 0x01, 0xe4, 0x00, 0x02, 0x01, 0x74, 0x00, 0x06, 0x00, 0x06, 0x00, 0x19, + 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x10, 0x00, 0x10, 0x00, 0x21, + 0x00, 0x12, 0x00, 0x12, 0x00, 0x21, 0x00, 0x25, 0x00, 0x25, 0x00, 0x02, + 0x00, 0x26, 0x00, 0x26, 0x00, 0x1c, 0x00, 0x27, 0x00, 0x27, 0x00, 0x13, + 0x00, 0x28, 0x00, 0x28, 0x00, 0x01, 0x00, 0x29, 0x00, 0x29, 0x00, 0x05, + 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x0b, + 0x00, 0x30, 0x00, 0x30, 0x00, 0x18, 0x00, 0x33, 0x00, 0x33, 0x00, 0x01, + 0x00, 0x34, 0x00, 0x34, 0x00, 0x16, 0x00, 0x38, 0x00, 0x38, 0x00, 0x0e, + 0x00, 0x39, 0x00, 0x39, 0x00, 0x0a, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x1d, + 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x1b, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x12, + 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x0c, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x11, + 0x00, 0x45, 0x00, 0x45, 0x00, 0x06, 0x00, 0x46, 0x00, 0x46, 0x00, 0x07, + 0x00, 0x47, 0x00, 0x47, 0x00, 0x17, 0x00, 0x49, 0x00, 0x49, 0x00, 0x08, + 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x04, 0x00, 0x51, 0x00, 0x52, 0x00, 0x04, + 0x00, 0x53, 0x00, 0x53, 0x00, 0x03, 0x00, 0x54, 0x00, 0x54, 0x00, 0x07, + 0x00, 0x56, 0x00, 0x56, 0x00, 0x15, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x09, + 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x14, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x09, + 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x10, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x07, + 0x00, 0x96, 0x00, 0x96, 0x00, 0x01, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0x22, + 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x02, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x01, + 0x00, 0xb4, 0x00, 0xb4, 0x00, 0x02, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0x09, + 0x00, 0xc1, 0x00, 0xc1, 0x00, 0x04, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x07, + 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x20, 0x00, 0xda, 0x00, 0xda, 0x00, 0x12, + 0x00, 0xde, 0x00, 0xde, 0x00, 0x25, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0x20, + 0x00, 0xe6, 0x00, 0xe6, 0x00, 0x20, 0x00, 0xec, 0x00, 0xec, 0x00, 0x1a, + 0x00, 0xee, 0x00, 0xee, 0x00, 0x14, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0x07, + 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x1f, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x1f, + 0x00, 0xff, 0x00, 0xff, 0x00, 0x07, 0x01, 0x04, 0x01, 0x05, 0x00, 0x1f, + 0x01, 0x0a, 0x01, 0x0a, 0x00, 0x1f, 0x01, 0x0d, 0x01, 0x0d, 0x00, 0x02, + 0x01, 0x18, 0x01, 0x18, 0x00, 0x03, 0x01, 0x19, 0x01, 0x19, 0x00, 0x1d, + 0x01, 0x1a, 0x01, 0x1a, 0x00, 0x09, 0x01, 0x2e, 0x01, 0x2e, 0x00, 0x07, + 0x01, 0x2f, 0x01, 0x2f, 0x00, 0x22, 0x01, 0x30, 0x01, 0x30, 0x00, 0x1a, + 0x01, 0x33, 0x01, 0x33, 0x00, 0x12, 0x01, 0x34, 0x01, 0x34, 0x00, 0x14, + 0x01, 0x35, 0x01, 0x35, 0x00, 0x0b, 0x01, 0x37, 0x01, 0x37, 0x00, 0x0b, + 0x01, 0x39, 0x01, 0x39, 0x00, 0x0b, 0x01, 0x43, 0x01, 0x43, 0x00, 0x12, + 0x01, 0x44, 0x01, 0x44, 0x00, 0x14, 0x01, 0x58, 0x01, 0x58, 0x00, 0x01, + 0x01, 0x5c, 0x01, 0x5c, 0x00, 0x1a, 0x01, 0x5d, 0x01, 0x5d, 0x00, 0x12, + 0x01, 0x5e, 0x01, 0x5e, 0x00, 0x14, 0x01, 0x84, 0x01, 0x85, 0x00, 0x19, + 0x01, 0x86, 0x01, 0x86, 0x00, 0x21, 0x01, 0x87, 0x01, 0x89, 0x00, 0x19, + 0x01, 0x8a, 0x01, 0x8a, 0x00, 0x21, 0x01, 0x8e, 0x01, 0x8f, 0x00, 0x21, + 0x01, 0xd8, 0x01, 0xd8, 0x00, 0x23, 0x01, 0xdd, 0x01, 0xdd, 0x00, 0x0d, + 0x01, 0xe0, 0x01, 0xe0, 0x00, 0x24, 0x01, 0xe1, 0x01, 0xe1, 0x00, 0x1e, + 0x01, 0xeb, 0x01, 0xeb, 0x00, 0x0f, 0x01, 0xec, 0x01, 0xec, 0x00, 0x0d, + 0x01, 0xed, 0x01, 0xed, 0x00, 0x0f, 0x01, 0xff, 0x01, 0xff, 0x00, 0x1e, + 0x02, 0x0e, 0x02, 0x10, 0x00, 0x1e, 0x02, 0x30, 0x02, 0x30, 0x00, 0x0d, + 0x02, 0x33, 0x02, 0x33, 0x00, 0x0f, 0x02, 0x45, 0x02, 0x45, 0x00, 0x13, + 0x02, 0x47, 0x02, 0x48, 0x00, 0x01, 0x02, 0x7a, 0x02, 0x7b, 0x00, 0x01, + 0x02, 0x7d, 0x02, 0x7d, 0x00, 0x0e, 0x02, 0x7f, 0x02, 0x85, 0x00, 0x02, + 0x02, 0x86, 0x02, 0x86, 0x00, 0x13, 0x02, 0x87, 0x02, 0x8a, 0x00, 0x05, + 0x02, 0x90, 0x02, 0x94, 0x00, 0x01, 0x02, 0x95, 0x02, 0x98, 0x00, 0x0a, + 0x02, 0x99, 0x02, 0x99, 0x00, 0x0c, 0x02, 0x9a, 0x02, 0xa0, 0x00, 0x06, + 0x02, 0xa1, 0x02, 0xa1, 0x00, 0x17, 0x02, 0xa2, 0x02, 0xa5, 0x00, 0x08, + 0x02, 0xaa, 0x02, 0xaa, 0x00, 0x04, 0x02, 0xab, 0x02, 0xaf, 0x00, 0x03, + 0x02, 0xb4, 0x02, 0xb5, 0x00, 0x09, 0x02, 0xb6, 0x02, 0xb6, 0x00, 0x02, + 0x02, 0xb7, 0x02, 0xb7, 0x00, 0x06, 0x02, 0xb8, 0x02, 0xb8, 0x00, 0x02, + 0x02, 0xb9, 0x02, 0xb9, 0x00, 0x06, 0x02, 0xba, 0x02, 0xba, 0x00, 0x02, + 0x02, 0xbb, 0x02, 0xbb, 0x00, 0x06, 0x02, 0xbc, 0x02, 0xbc, 0x00, 0x13, + 0x02, 0xbd, 0x02, 0xbd, 0x00, 0x17, 0x02, 0xbe, 0x02, 0xbe, 0x00, 0x13, + 0x02, 0xbf, 0x02, 0xbf, 0x00, 0x17, 0x02, 0xc0, 0x02, 0xc0, 0x00, 0x13, + 0x02, 0xc1, 0x02, 0xc1, 0x00, 0x17, 0x02, 0xc2, 0x02, 0xc2, 0x00, 0x13, + 0x02, 0xc3, 0x02, 0xc3, 0x00, 0x17, 0x02, 0xc4, 0x02, 0xc4, 0x00, 0x01, + 0x02, 0xc6, 0x02, 0xc6, 0x00, 0x05, 0x02, 0xc7, 0x02, 0xc7, 0x00, 0x08, + 0x02, 0xc8, 0x02, 0xc8, 0x00, 0x05, 0x02, 0xc9, 0x02, 0xc9, 0x00, 0x08, + 0x02, 0xca, 0x02, 0xca, 0x00, 0x05, 0x02, 0xcb, 0x02, 0xcb, 0x00, 0x08, + 0x02, 0xcc, 0x02, 0xcc, 0x00, 0x05, 0x02, 0xcd, 0x02, 0xcd, 0x00, 0x08, + 0x02, 0xce, 0x02, 0xce, 0x00, 0x05, 0x02, 0xcf, 0x02, 0xcf, 0x00, 0x08, + 0x02, 0xd9, 0x02, 0xd9, 0x00, 0x04, 0x02, 0xe5, 0x02, 0xe5, 0x00, 0x0a, + 0x02, 0xe7, 0x02, 0xe7, 0x00, 0x0b, 0x02, 0xe9, 0x02, 0xe9, 0x00, 0x18, + 0x02, 0xeb, 0x02, 0xeb, 0x00, 0x18, 0x02, 0xed, 0x02, 0xed, 0x00, 0x18, + 0x02, 0xef, 0x02, 0xef, 0x00, 0x18, 0x02, 0xf2, 0x02, 0xf2, 0x00, 0x04, + 0x02, 0xf4, 0x02, 0xf4, 0x00, 0x04, 0x02, 0xf6, 0x02, 0xf7, 0x00, 0x04, + 0x02, 0xf8, 0x02, 0xf8, 0x00, 0x01, 0x02, 0xf9, 0x02, 0xf9, 0x00, 0x03, + 0x02, 0xfa, 0x02, 0xfa, 0x00, 0x01, 0x02, 0xfb, 0x02, 0xfb, 0x00, 0x03, + 0x02, 0xfc, 0x02, 0xfc, 0x00, 0x01, 0x02, 0xfd, 0x02, 0xfd, 0x00, 0x03, + 0x02, 0xff, 0x02, 0xff, 0x00, 0x15, 0x03, 0x01, 0x03, 0x01, 0x00, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x00, 0x15, 0x03, 0x0e, 0x03, 0x0e, 0x00, 0x0e, + 0x03, 0x10, 0x03, 0x10, 0x00, 0x0e, 0x03, 0x12, 0x03, 0x12, 0x00, 0x0e, + 0x03, 0x14, 0x03, 0x14, 0x00, 0x0a, 0x03, 0x16, 0x03, 0x16, 0x00, 0x0a, + 0x03, 0x18, 0x03, 0x18, 0x00, 0x0a, 0x03, 0x1a, 0x03, 0x1a, 0x00, 0x0a, + 0x03, 0x1c, 0x03, 0x1c, 0x00, 0x0a, 0x03, 0x1e, 0x03, 0x1e, 0x00, 0x0a, + 0x03, 0x20, 0x03, 0x20, 0x00, 0x1b, 0x03, 0x22, 0x03, 0x22, 0x00, 0x0c, + 0x03, 0x23, 0x03, 0x23, 0x00, 0x09, 0x03, 0x24, 0x03, 0x24, 0x00, 0x0c, + 0x03, 0x25, 0x03, 0x25, 0x00, 0x11, 0x03, 0x26, 0x03, 0x26, 0x00, 0x10, + 0x03, 0x27, 0x03, 0x27, 0x00, 0x11, 0x03, 0x28, 0x03, 0x28, 0x00, 0x10, + 0x03, 0x29, 0x03, 0x29, 0x00, 0x11, 0x03, 0x2a, 0x03, 0x2a, 0x00, 0x10, + 0x03, 0x2f, 0x03, 0x30, 0x00, 0x0d, 0x03, 0x31, 0x03, 0x31, 0x00, 0x23, + 0x03, 0x32, 0x03, 0x38, 0x00, 0x0f, 0x03, 0x43, 0x03, 0x47, 0x00, 0x0d, + 0x03, 0x4d, 0x03, 0x4f, 0x00, 0x0f, 0x03, 0x54, 0x03, 0x54, 0x00, 0x0d, + 0x03, 0x65, 0x03, 0x65, 0x00, 0x1e, 0x03, 0x66, 0x03, 0x69, 0x00, 0x24, + 0x03, 0x6d, 0x03, 0x6f, 0x00, 0x0d, 0x03, 0x78, 0x03, 0x78, 0x00, 0x23, + 0x03, 0x86, 0x03, 0x86, 0x00, 0x02, 0x03, 0x87, 0x03, 0x87, 0x00, 0x05, + 0x03, 0x8a, 0x03, 0x8a, 0x00, 0x01, 0x03, 0x8b, 0x03, 0x8b, 0x00, 0x0c, + 0x03, 0x8e, 0x03, 0x8e, 0x00, 0x02, 0x03, 0x8f, 0x03, 0x8f, 0x00, 0x1c, + 0x03, 0x90, 0x03, 0x90, 0x00, 0x05, 0x03, 0x91, 0x03, 0x91, 0x00, 0x11, + 0x03, 0x94, 0x03, 0x94, 0x00, 0x0b, 0x03, 0x97, 0x03, 0x97, 0x00, 0x01, + 0x03, 0x98, 0x03, 0x98, 0x00, 0x16, 0x03, 0x99, 0x03, 0x99, 0x00, 0x0e, + 0x03, 0x9a, 0x03, 0x9a, 0x00, 0x0c, 0x03, 0x9b, 0x03, 0x9b, 0x00, 0x12, + 0x03, 0x9d, 0x03, 0x9d, 0x00, 0x0c, 0x03, 0xa0, 0x03, 0xa0, 0x00, 0x04, + 0x03, 0xa4, 0x03, 0xa4, 0x00, 0x03, 0x03, 0xa6, 0x03, 0xa6, 0x00, 0x09, + 0x03, 0xaa, 0x03, 0xaa, 0x00, 0x03, 0x03, 0xad, 0x03, 0xad, 0x00, 0x05, + 0x03, 0xae, 0x03, 0xae, 0x00, 0x22, 0x03, 0xb2, 0x03, 0xb2, 0x00, 0x0a, + 0x03, 0xb3, 0x03, 0xb4, 0x00, 0x0b, 0x03, 0xb5, 0x03, 0xb5, 0x00, 0x25, + 0x03, 0xb6, 0x03, 0xb6, 0x00, 0x02, 0x03, 0xb7, 0x03, 0xb7, 0x00, 0x1c, + 0x03, 0xb8, 0x03, 0xb8, 0x00, 0x22, 0x03, 0xb9, 0x03, 0xb9, 0x00, 0x05, + 0x03, 0xbd, 0x03, 0xbd, 0x00, 0x01, 0x03, 0xbf, 0x03, 0xbf, 0x00, 0x16, + 0x03, 0xc0, 0x03, 0xc0, 0x00, 0x13, 0x03, 0xc1, 0x03, 0xc1, 0x00, 0x0e, + 0x03, 0xc2, 0x03, 0xc2, 0x00, 0x12, 0x03, 0xc3, 0x03, 0xc3, 0x00, 0x06, + 0x03, 0xc4, 0x03, 0xc4, 0x00, 0x08, 0x03, 0xc6, 0x03, 0xc6, 0x00, 0x03, + 0x03, 0xc7, 0x03, 0xc7, 0x00, 0x07, 0x03, 0xc8, 0x03, 0xc8, 0x00, 0x17, + 0x03, 0xc9, 0x03, 0xc9, 0x00, 0x09, 0x03, 0xca, 0x03, 0xca, 0x00, 0x14, + 0x03, 0xcb, 0x03, 0xcb, 0x00, 0x08, 0x03, 0xcc, 0x03, 0xcc, 0x00, 0x1a, + 0x03, 0xd2, 0x03, 0xd2, 0x00, 0x09, 0x03, 0xd3, 0x03, 0xd3, 0x00, 0x1b, + 0x03, 0xd5, 0x03, 0xd5, 0x00, 0x1b, 0x03, 0xd7, 0x03, 0xd7, 0x00, 0x1b, + 0x03, 0xd9, 0x03, 0xd9, 0x00, 0x0c, 0x03, 0xda, 0x03, 0xda, 0x00, 0x09, + 0x03, 0xdb, 0x03, 0xdc, 0x00, 0x19, 0x03, 0xdf, 0x03, 0xdf, 0x00, 0x19, + 0x03, 0xe1, 0x03, 0xe1, 0x00, 0x04, 0x03, 0xe2, 0x03, 0xe2, 0x00, 0x02, + 0x03, 0xe3, 0x03, 0xe3, 0x00, 0x06, 0x03, 0xe4, 0x03, 0xe4, 0x00, 0x05, + 0x03, 0xe6, 0x03, 0xe6, 0x00, 0x08, 0x03, 0xea, 0x03, 0xea, 0x00, 0x1d, + 0x03, 0xeb, 0x03, 0xeb, 0x00, 0x09, 0x03, 0xf0, 0x03, 0xf0, 0x00, 0x13, + 0x03, 0xf1, 0x03, 0xf1, 0x00, 0x17, 0x03, 0xf2, 0x03, 0xf2, 0x00, 0x0c, + 0x03, 0xf3, 0x03, 0xf3, 0x00, 0x09, 0x03, 0xf5, 0x03, 0xf5, 0x00, 0x12, + 0x03, 0xf6, 0x03, 0xf6, 0x00, 0x14, 0x03, 0xf8, 0x03, 0xf8, 0x00, 0x02, + 0x03, 0xf9, 0x03, 0xf9, 0x00, 0x06, 0x03, 0xfa, 0x03, 0xfa, 0x00, 0x02, + 0x03, 0xfb, 0x03, 0xfb, 0x00, 0x06, 0x03, 0xfe, 0x03, 0xfe, 0x00, 0x05, + 0x03, 0xff, 0x03, 0xff, 0x00, 0x08, 0x04, 0x01, 0x04, 0x02, 0x00, 0x08, + 0x04, 0x03, 0x04, 0x03, 0x00, 0x12, 0x04, 0x04, 0x04, 0x04, 0x00, 0x14, + 0x04, 0x0b, 0x04, 0x0b, 0x00, 0x01, 0x04, 0x0c, 0x04, 0x0c, 0x00, 0x03, + 0x04, 0x10, 0x04, 0x10, 0x00, 0x03, 0x04, 0x12, 0x04, 0x12, 0x00, 0x07, + 0x04, 0x13, 0x04, 0x13, 0x00, 0x25, 0x04, 0x14, 0x04, 0x14, 0x00, 0x09, + 0x04, 0x15, 0x04, 0x15, 0x00, 0x25, 0x04, 0x16, 0x04, 0x16, 0x00, 0x09, + 0x04, 0x17, 0x04, 0x17, 0x00, 0x25, 0x04, 0x18, 0x04, 0x18, 0x00, 0x09, + 0x04, 0x1e, 0x04, 0x1e, 0x00, 0x02, 0x04, 0x1f, 0x04, 0x1f, 0x00, 0x06, + 0x04, 0x20, 0x04, 0x20, 0x00, 0x02, 0x04, 0x21, 0x04, 0x21, 0x00, 0x06, + 0x04, 0x22, 0x04, 0x22, 0x00, 0x02, 0x04, 0x23, 0x04, 0x23, 0x00, 0x06, + 0x04, 0x24, 0x04, 0x24, 0x00, 0x02, 0x04, 0x25, 0x04, 0x25, 0x00, 0x06, + 0x04, 0x26, 0x04, 0x26, 0x00, 0x02, 0x04, 0x27, 0x04, 0x27, 0x00, 0x06, + 0x04, 0x28, 0x04, 0x28, 0x00, 0x02, 0x04, 0x29, 0x04, 0x29, 0x00, 0x06, + 0x04, 0x2a, 0x04, 0x2a, 0x00, 0x02, 0x04, 0x2b, 0x04, 0x2b, 0x00, 0x06, + 0x04, 0x2c, 0x04, 0x2c, 0x00, 0x02, 0x04, 0x2d, 0x04, 0x2d, 0x00, 0x06, + 0x04, 0x2e, 0x04, 0x2e, 0x00, 0x02, 0x04, 0x2f, 0x04, 0x2f, 0x00, 0x06, + 0x04, 0x30, 0x04, 0x30, 0x00, 0x02, 0x04, 0x31, 0x04, 0x31, 0x00, 0x06, + 0x04, 0x32, 0x04, 0x32, 0x00, 0x02, 0x04, 0x33, 0x04, 0x33, 0x00, 0x06, + 0x04, 0x34, 0x04, 0x34, 0x00, 0x02, 0x04, 0x35, 0x04, 0x35, 0x00, 0x06, + 0x04, 0x36, 0x04, 0x36, 0x00, 0x05, 0x04, 0x37, 0x04, 0x37, 0x00, 0x08, + 0x04, 0x38, 0x04, 0x38, 0x00, 0x05, 0x04, 0x39, 0x04, 0x39, 0x00, 0x08, + 0x04, 0x3a, 0x04, 0x3a, 0x00, 0x05, 0x04, 0x3b, 0x04, 0x3b, 0x00, 0x08, + 0x04, 0x3c, 0x04, 0x3c, 0x00, 0x05, 0x04, 0x3d, 0x04, 0x3d, 0x00, 0x08, + 0x04, 0x3e, 0x04, 0x3e, 0x00, 0x05, 0x04, 0x3f, 0x04, 0x3f, 0x00, 0x08, + 0x04, 0x40, 0x04, 0x40, 0x00, 0x05, 0x04, 0x41, 0x04, 0x41, 0x00, 0x08, + 0x04, 0x42, 0x04, 0x42, 0x00, 0x05, 0x04, 0x43, 0x04, 0x43, 0x00, 0x08, + 0x04, 0x44, 0x04, 0x44, 0x00, 0x05, 0x04, 0x45, 0x04, 0x45, 0x00, 0x08, + 0x04, 0x4a, 0x04, 0x4a, 0x00, 0x01, 0x04, 0x4b, 0x04, 0x4b, 0x00, 0x03, + 0x04, 0x4c, 0x04, 0x4c, 0x00, 0x01, 0x04, 0x4d, 0x04, 0x4d, 0x00, 0x03, + 0x04, 0x4e, 0x04, 0x4e, 0x00, 0x01, 0x04, 0x4f, 0x04, 0x4f, 0x00, 0x03, + 0x04, 0x50, 0x04, 0x50, 0x00, 0x01, 0x04, 0x51, 0x04, 0x51, 0x00, 0x03, + 0x04, 0x52, 0x04, 0x52, 0x00, 0x01, 0x04, 0x53, 0x04, 0x53, 0x00, 0x03, + 0x04, 0x54, 0x04, 0x54, 0x00, 0x01, 0x04, 0x55, 0x04, 0x55, 0x00, 0x03, + 0x04, 0x56, 0x04, 0x56, 0x00, 0x01, 0x04, 0x57, 0x04, 0x57, 0x00, 0x03, + 0x04, 0x5f, 0x04, 0x5f, 0x00, 0x03, 0x04, 0x62, 0x04, 0x62, 0x00, 0x0a, + 0x04, 0x64, 0x04, 0x64, 0x00, 0x0a, 0x04, 0x70, 0x04, 0x70, 0x00, 0x0c, + 0x04, 0x71, 0x04, 0x71, 0x00, 0x09, 0x04, 0x72, 0x04, 0x72, 0x00, 0x0c, + 0x04, 0x73, 0x04, 0x73, 0x00, 0x09, 0x04, 0x74, 0x04, 0x74, 0x00, 0x0c, + 0x04, 0x75, 0x04, 0x75, 0x00, 0x09, 0x04, 0x77, 0x04, 0x77, 0x00, 0x0e, + 0x04, 0x7b, 0x04, 0x7b, 0x00, 0x22, 0x04, 0x7c, 0x04, 0x7c, 0x00, 0x1a, + 0x04, 0x7f, 0x04, 0x7f, 0x00, 0x04, 0x04, 0x81, 0x04, 0x81, 0x00, 0x20, + 0x04, 0x82, 0x04, 0x82, 0x00, 0x22, 0x04, 0x84, 0x04, 0x84, 0x00, 0x0b, + 0x04, 0x86, 0x04, 0x86, 0x00, 0x0c, 0x04, 0x98, 0x04, 0x98, 0x00, 0x04, + 0x04, 0x99, 0x04, 0x99, 0x00, 0x02, 0x04, 0x9a, 0x04, 0x9a, 0x00, 0x06, + 0x04, 0x9b, 0x04, 0x9b, 0x00, 0x05, 0x04, 0x9f, 0x04, 0x9f, 0x00, 0x01, + 0x04, 0xa0, 0x04, 0xa0, 0x00, 0x03, 0x04, 0xa2, 0x04, 0xa2, 0x00, 0x15, + 0x04, 0xa6, 0x04, 0xa6, 0x00, 0x1c, 0x04, 0xa7, 0x04, 0xa7, 0x00, 0x07, + 0x04, 0xa8, 0x04, 0xa8, 0x00, 0x01, 0x04, 0xaa, 0x04, 0xaa, 0x00, 0x01, + 0x04, 0xad, 0x04, 0xad, 0x00, 0x04, 0x04, 0xae, 0x04, 0xae, 0x00, 0x0b, + 0x04, 0xb0, 0x04, 0xb0, 0x00, 0x0b, 0x04, 0xb2, 0x04, 0xb2, 0x00, 0x18, + 0x04, 0xb5, 0x04, 0xb5, 0x00, 0x04, 0x04, 0xb7, 0x04, 0xb7, 0x00, 0x04, + 0x04, 0xb8, 0x04, 0xb8, 0x00, 0x01, 0x04, 0xb9, 0x04, 0xb9, 0x00, 0x16, + 0x04, 0xba, 0x04, 0xba, 0x00, 0x07, 0x04, 0xbc, 0x04, 0xbc, 0x00, 0x15, + 0x04, 0xbf, 0x04, 0xbf, 0x00, 0x0e, 0x04, 0xc1, 0x04, 0xc1, 0x00, 0x0a, + 0x04, 0xc2, 0x04, 0xc2, 0x00, 0x1d, 0x04, 0xc3, 0x04, 0xc3, 0x00, 0x09, + 0x04, 0xc4, 0x04, 0xc4, 0x00, 0x1d, 0x04, 0xc5, 0x04, 0xc5, 0x00, 0x09, + 0x04, 0xc6, 0x04, 0xc6, 0x00, 0x1b, 0x04, 0xc8, 0x04, 0xc8, 0x00, 0x11, + 0x04, 0xc9, 0x04, 0xc9, 0x00, 0x10, 0x04, 0xca, 0x04, 0xca, 0x00, 0x01, + 0x04, 0xcb, 0x04, 0xcb, 0x00, 0x0f, 0x04, 0xcf, 0x04, 0xcf, 0x00, 0x0d, + 0x04, 0xd2, 0x04, 0xd2, 0x00, 0x0f, 0x04, 0xd8, 0x04, 0xd8, 0x00, 0x1e, + 0x04, 0xdd, 0x04, 0xdd, 0x00, 0x23, 0x04, 0xe8, 0x04, 0xe8, 0x00, 0x1e, + 0x04, 0xea, 0x04, 0xea, 0x00, 0x0f, 0x04, 0xf1, 0x04, 0xf1, 0x00, 0x0d, + 0x04, 0xf5, 0x04, 0xf5, 0x00, 0x23, 0x00, 0x01, 0x00, 0x06, 0x04, 0xf5, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x1f, + 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x16, + 0x00, 0x11, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x15, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0b, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, + 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x1d, + 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x11, + 0x00, 0x15, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, + 0x00, 0x1a, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, + 0x00, 0x1c, 0x00, 0x24, 0x00, 0x00, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x00, 0x08, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x08, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, + 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0c, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, + 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, + 0x00, 0x10, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0e, + 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, + 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, + 0x00, 0x0a, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x09, + 0x00, 0x0c, 0x00, 0x13, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x0f, 0x00, 0x13, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0d, + 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x17, 0x00, 0x0d, + 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, + 0x00, 0x12, 0x00, 0x12, 0x00, 0x24, 0x00, 0x17, 0x00, 0x17, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x11, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x22, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x07, 0x00, 0x01, 0x00, 0x03, + 0x00, 0x04, 0x00, 0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x15, 0x00, 0x01, + 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1d, 0x00, 0x09, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, + 0x00, 0x15, 0x00, 0x00, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, + 0x00, 0x09, 0x00, 0x22, 0x00, 0x09, 0x00, 0x22, 0x00, 0x09, 0x00, 0x20, + 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x09, + 0x00, 0x0c, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, + 0x00, 0x1d, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x09, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x0a, 0x01, 0x62, 0x02, 0x92, 0x00, 0x04, 0x44, 0x46, 0x4c, 0x54, + 0x00, 0x1a, 0x63, 0x79, 0x72, 0x6c, 0x00, 0x1a, 0x67, 0x72, 0x65, 0x6b, + 0x00, 0x1a, 0x6c, 0x61, 0x74, 0x6e, 0x00, 0x48, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x03, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, + 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x2e, 0x00, 0x07, 0x41, 0x5a, + 0x45, 0x20, 0x00, 0xe4, 0x43, 0x52, 0x54, 0x20, 0x00, 0xe4, 0x46, 0x52, + 0x41, 0x20, 0x00, 0x5a, 0x4d, 0x4f, 0x4c, 0x20, 0x00, 0xb6, 0x4e, 0x41, + 0x56, 0x20, 0x00, 0x88, 0x52, 0x4f, 0x4d, 0x20, 0x00, 0xb6, 0x54, 0x52, + 0x4b, 0x20, 0x00, 0xe4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x07, 0x00, 0x08, + 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, + 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x03, 0x00, 0x04, 0x00, 0x06, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, + 0x00, 0x04, 0x00, 0x06, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, + 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, + 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x06, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, + 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x00, 0xff, 0xff, 0x00, 0x13, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, + 0x00, 0x08, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, + 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, + 0x00, 0x17, 0x00, 0x18, 0x63, 0x32, 0x73, 0x63, 0x00, 0x92, 0x63, 0x63, + 0x6d, 0x70, 0x00, 0x98, 0x64, 0x6c, 0x69, 0x67, 0x00, 0xa0, 0x64, 0x6e, + 0x6f, 0x6d, 0x00, 0xa6, 0x66, 0x72, 0x61, 0x63, 0x00, 0xac, 0x6c, 0x69, + 0x67, 0x61, 0x00, 0xb6, 0x6c, 0x69, 0x67, 0x61, 0x00, 0xbc, 0x6c, 0x69, + 0x67, 0x61, 0x00, 0xc8, 0x6c, 0x6e, 0x75, 0x6d, 0x00, 0xd0, 0x6c, 0x6f, + 0x63, 0x6c, 0x00, 0xd6, 0x6c, 0x6f, 0x63, 0x6c, 0x00, 0xdc, 0x6c, 0x6f, + 0x63, 0x6c, 0x00, 0xe2, 0x6e, 0x75, 0x6d, 0x72, 0x00, 0xe8, 0x6f, 0x6e, + 0x75, 0x6d, 0x00, 0xee, 0x70, 0x6e, 0x75, 0x6d, 0x00, 0xf4, 0x73, 0x6d, + 0x63, 0x70, 0x00, 0xfa, 0x73, 0x73, 0x30, 0x31, 0x01, 0x00, 0x73, 0x73, + 0x30, 0x32, 0x01, 0x06, 0x73, 0x73, 0x30, 0x33, 0x01, 0x0c, 0x73, 0x73, + 0x30, 0x34, 0x01, 0x12, 0x73, 0x73, 0x30, 0x35, 0x01, 0x18, 0x73, 0x73, + 0x30, 0x36, 0x01, 0x1e, 0x73, 0x73, 0x30, 0x37, 0x01, 0x24, 0x74, 0x6e, + 0x75, 0x6d, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x00, 0x16, + 0x00, 0x17, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x08, 0x00, 0x09, 0x00, 0x08, 0x00, 0x09, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x19, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0d, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x36, 0x04, 0x30, + 0x07, 0xee, 0x08, 0xa0, 0x08, 0xca, 0x0f, 0x6e, 0x0f, 0x84, 0x0f, 0xae, + 0x0f, 0xc2, 0x0f, 0xe6, 0x10, 0x10, 0x10, 0x4c, 0x10, 0x60, 0x10, 0x74, + 0x10, 0x88, 0x10, 0x9a, 0x10, 0xb4, 0x10, 0xf6, 0x11, 0x14, 0x11, 0x66, + 0x11, 0xac, 0x12, 0x0e, 0x12, 0x6c, 0x12, 0x80, 0x12, 0xb0, 0x12, 0xd2, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x01, 0xfa, + 0x00, 0xfa, 0x01, 0xe7, 0x02, 0x71, 0x01, 0xd1, 0x01, 0xd0, 0x01, 0xcf, + 0x01, 0xce, 0x01, 0xcd, 0x01, 0xcc, 0x01, 0xcb, 0x01, 0xca, 0x01, 0xc9, + 0x01, 0xc8, 0x02, 0x33, 0x02, 0x32, 0x02, 0x31, 0x02, 0x30, 0x02, 0x28, + 0x01, 0xe6, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0xe3, 0x01, 0xe2, 0x01, 0xe1, + 0x01, 0xe0, 0x01, 0xdf, 0x01, 0xde, 0x01, 0xdd, 0x01, 0xdc, 0x01, 0xdb, + 0x01, 0xda, 0x01, 0xd9, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd5, + 0x01, 0xd4, 0x01, 0xd3, 0x01, 0xd2, 0x01, 0xe8, 0x01, 0xe9, 0x02, 0x73, + 0x02, 0x75, 0x02, 0x74, 0x02, 0x76, 0x02, 0x72, 0x02, 0x77, 0x02, 0x52, + 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, + 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, + 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, + 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x02, 0x00, 0x02, 0x01, 0x04, 0xfe, + 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, + 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x3b, 0x02, 0x0d, + 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x04, 0xf8, 0x02, 0x11, 0x02, 0x13, + 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, + 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1e, 0x02, 0x1d, 0x03, 0x2f, 0x03, 0x30, + 0x03, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, + 0x03, 0x37, 0x03, 0x38, 0x03, 0x39, 0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, + 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, + 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, + 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, + 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, + 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, + 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, + 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x04, 0xff, 0x03, 0x64, 0x03, 0x65, + 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, + 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, + 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x05, 0x02, 0x03, 0x76, + 0x03, 0x77, 0x03, 0x79, 0x03, 0x78, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, + 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, + 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x05, 0x00, 0x05, 0x01, 0x04, 0xcb, + 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xce, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd1, + 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, 0x04, 0xd6, 0x04, 0xd7, + 0x04, 0xd8, 0x04, 0xd9, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, + 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe0, 0x04, 0xe1, 0x04, 0xe2, 0x04, 0xe3, + 0x04, 0xe4, 0x04, 0xe5, 0x04, 0xe6, 0x04, 0xe7, 0x01, 0xff, 0x04, 0xe8, + 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, + 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf1, 0x04, 0xf2, 0x04, 0xf3, 0x04, 0xf4, + 0x04, 0xf5, 0x04, 0xf6, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, + 0x04, 0xf7, 0x04, 0xf9, 0x04, 0xfa, 0x04, 0xfc, 0x02, 0x1a, 0x04, 0xfd, + 0x04, 0xfb, 0x02, 0x0c, 0x02, 0x12, 0x05, 0x0b, 0x05, 0x0c, 0x00, 0x01, + 0x00, 0xfa, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, + 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, + 0x00, 0x1d, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, + 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, + 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, + 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, + 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x65, 0x00, 0x67, 0x00, 0x81, + 0x00, 0x83, 0x00, 0x84, 0x00, 0x8c, 0x00, 0x8f, 0x00, 0x91, 0x00, 0x93, + 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, + 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xd2, 0x00, 0xd3, + 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, + 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xde, 0x00, 0xdf, + 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0xe5, + 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, 0x01, 0x2f, 0x01, 0x33, + 0x01, 0x35, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3b, 0x01, 0x41, 0x01, 0x43, + 0x01, 0x45, 0x01, 0x49, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x58, 0x01, 0x59, + 0x01, 0x97, 0x01, 0x9d, 0x01, 0xa2, 0x01, 0xa5, 0x02, 0x7a, 0x02, 0x7b, + 0x02, 0x7d, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, + 0x02, 0x84, 0x02, 0x85, 0x02, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, + 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, + 0x02, 0x90, 0x02, 0x91, 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, + 0x02, 0x96, 0x02, 0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0xb6, 0x02, 0xb8, + 0x02, 0xba, 0x02, 0xbc, 0x02, 0xbe, 0x02, 0xc0, 0x02, 0xc2, 0x02, 0xc4, + 0x02, 0xc6, 0x02, 0xc8, 0x02, 0xca, 0x02, 0xcc, 0x02, 0xce, 0x02, 0xd0, + 0x02, 0xd2, 0x02, 0xd4, 0x02, 0xd6, 0x02, 0xd8, 0x02, 0xda, 0x02, 0xdc, + 0x02, 0xde, 0x02, 0xe0, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe5, 0x02, 0xe7, + 0x02, 0xe9, 0x02, 0xeb, 0x02, 0xed, 0x02, 0xef, 0x02, 0xf1, 0x02, 0xf3, + 0x02, 0xf5, 0x02, 0xf8, 0x02, 0xfa, 0x02, 0xfc, 0x02, 0xfe, 0x03, 0x00, + 0x03, 0x02, 0x03, 0x04, 0x03, 0x06, 0x03, 0x08, 0x03, 0x0a, 0x03, 0x0c, + 0x03, 0x0e, 0x03, 0x10, 0x03, 0x12, 0x03, 0x14, 0x03, 0x16, 0x03, 0x18, + 0x03, 0x1a, 0x03, 0x1c, 0x03, 0x1e, 0x03, 0x20, 0x03, 0x22, 0x03, 0x24, + 0x03, 0x25, 0x03, 0x27, 0x03, 0x29, 0x03, 0x2b, 0x03, 0x2d, 0x03, 0x86, + 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x8c, + 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, + 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, + 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9c, 0x03, 0x9d, 0x03, 0xad, 0x03, 0xae, + 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb3, 0x03, 0xb4, + 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, + 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, + 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xd3, 0x03, 0xd5, 0x03, 0xd7, 0x03, 0xd9, + 0x03, 0xee, 0x03, 0xf0, 0x03, 0xf2, 0x04, 0x07, 0x04, 0x0d, 0x04, 0x13, + 0x04, 0x7d, 0x04, 0x82, 0x04, 0x86, 0x05, 0x07, 0x05, 0x09, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x01, 0xdc, 0x00, 0xeb, + 0x02, 0x71, 0x02, 0x33, 0x02, 0x32, 0x02, 0x31, 0x02, 0x30, 0x02, 0x28, + 0x01, 0xe6, 0x01, 0xe5, 0x01, 0xe4, 0x01, 0xe3, 0x01, 0xe2, 0x01, 0xe1, + 0x01, 0xe0, 0x01, 0xdf, 0x01, 0xde, 0x01, 0xdd, 0x01, 0xdc, 0x01, 0xdb, + 0x01, 0xda, 0x01, 0xd9, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd5, + 0x01, 0xd4, 0x01, 0xd3, 0x01, 0xd2, 0x02, 0x64, 0x02, 0x73, 0x03, 0x30, + 0x02, 0x75, 0x02, 0x74, 0x03, 0x2f, 0x01, 0xe3, 0x02, 0x72, 0x02, 0x77, + 0x02, 0x52, 0x04, 0xd2, 0x04, 0xd3, 0x01, 0xea, 0x01, 0xeb, 0x04, 0xd4, + 0x04, 0xd5, 0x04, 0xd6, 0x01, 0xec, 0x04, 0xd7, 0x01, 0xed, 0x01, 0xee, + 0x01, 0xef, 0x04, 0xdc, 0x01, 0xf0, 0x01, 0xf0, 0x04, 0xdd, 0x04, 0xde, + 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xfa, 0x04, 0xeb, 0x04, 0xec, + 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x02, 0x00, + 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf2, 0x04, 0xf5, 0x04, 0xfe, 0x02, 0x02, + 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, + 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, + 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x02, 0x3b, 0x02, 0x0d, 0x02, 0x0e, + 0x02, 0x0f, 0x02, 0x10, 0x04, 0xf8, 0x02, 0x11, 0x02, 0x13, 0x02, 0x14, + 0x02, 0x15, 0x02, 0x17, 0x02, 0x19, 0x02, 0x76, 0x03, 0x31, 0x03, 0x32, + 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, + 0x03, 0x39, 0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, + 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, + 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, + 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x82, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, + 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, + 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, + 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, + 0x03, 0x62, 0x04, 0xff, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, + 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, + 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, + 0x03, 0x74, 0x03, 0x75, 0x05, 0x02, 0x03, 0x76, 0x03, 0x77, 0x03, 0x79, + 0x03, 0x78, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, + 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, + 0x05, 0x00, 0x05, 0x01, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xce, + 0x04, 0xd8, 0x04, 0xdb, 0x04, 0xd9, 0x04, 0xda, 0x04, 0xdf, 0x04, 0xe0, + 0x04, 0xe1, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd1, 0x04, 0xea, 0x04, 0xed, + 0x04, 0xee, 0x04, 0xf1, 0x04, 0xf3, 0x04, 0xf4, 0x02, 0x01, 0x04, 0xf6, + 0x04, 0xe2, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe5, 0x04, 0xe6, 0x04, 0xe7, + 0x04, 0xe8, 0x04, 0xe9, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, + 0x04, 0xf7, 0x04, 0xf9, 0x04, 0xfa, 0x02, 0x18, 0x04, 0xfc, 0x02, 0x1a, + 0x04, 0xfd, 0x04, 0xfb, 0x02, 0x16, 0x02, 0x0c, 0x02, 0x12, 0x05, 0x0b, + 0x05, 0x0c, 0x00, 0x01, 0x00, 0xeb, 0x00, 0x0a, 0x00, 0x45, 0x00, 0x46, + 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, + 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, + 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, + 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, + 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, + 0x00, 0x8d, 0x00, 0x90, 0x00, 0x92, 0x00, 0x94, 0x00, 0xbb, 0x00, 0xbc, + 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, + 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, + 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, + 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, + 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, + 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, + 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xff, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, + 0x01, 0x30, 0x01, 0x34, 0x01, 0x36, 0x01, 0x38, 0x01, 0x3a, 0x01, 0x3c, + 0x01, 0x42, 0x01, 0x44, 0x01, 0x46, 0x01, 0x4a, 0x01, 0x4d, 0x01, 0x5a, + 0x02, 0x7c, 0x02, 0x7e, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, + 0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, + 0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa9, + 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, + 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, + 0x02, 0xb7, 0x02, 0xb9, 0x02, 0xbb, 0x02, 0xbd, 0x02, 0xbf, 0x02, 0xc1, + 0x02, 0xc3, 0x02, 0xc5, 0x02, 0xc7, 0x02, 0xc9, 0x02, 0xcb, 0x02, 0xcd, + 0x02, 0xcf, 0x02, 0xd1, 0x02, 0xd3, 0x02, 0xd5, 0x02, 0xd7, 0x02, 0xd9, + 0x02, 0xdb, 0x02, 0xdd, 0x02, 0xdf, 0x02, 0xe1, 0x02, 0xe4, 0x02, 0xe6, + 0x02, 0xe8, 0x02, 0xea, 0x02, 0xec, 0x02, 0xee, 0x02, 0xf0, 0x02, 0xf2, + 0x02, 0xf4, 0x02, 0xf6, 0x02, 0xf9, 0x02, 0xfb, 0x02, 0xfd, 0x02, 0xff, + 0x03, 0x01, 0x03, 0x03, 0x03, 0x05, 0x03, 0x07, 0x03, 0x09, 0x03, 0x0b, + 0x03, 0x0d, 0x03, 0x0f, 0x03, 0x11, 0x03, 0x13, 0x03, 0x15, 0x03, 0x17, + 0x03, 0x19, 0x03, 0x1b, 0x03, 0x1d, 0x03, 0x1f, 0x03, 0x21, 0x03, 0x23, + 0x03, 0x26, 0x03, 0x28, 0x03, 0x2a, 0x03, 0x2c, 0x03, 0x2e, 0x03, 0x9e, + 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa5, + 0x03, 0xa6, 0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xab, + 0x03, 0xac, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, + 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, + 0x03, 0xce, 0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd4, + 0x03, 0xd6, 0x03, 0xd8, 0x03, 0xda, 0x03, 0xef, 0x03, 0xf1, 0x03, 0xf3, + 0x04, 0x01, 0x04, 0x08, 0x04, 0x0e, 0x04, 0x14, 0x04, 0x7e, 0x04, 0x7f, + 0x04, 0x83, 0x04, 0x87, 0x05, 0x08, 0x05, 0x0a, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x12, 0x00, 0x2a, 0x00, 0x42, 0x00, 0x5a, 0x00, 0x72, + 0x00, 0x8a, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, + 0x00, 0x90, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x4d, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, + 0x00, 0x78, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x4e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, + 0x00, 0x60, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, + 0x02, 0xe1, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, + 0x00, 0x48, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, + 0x03, 0xce, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, + 0x00, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, + 0x03, 0xd0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, + 0x00, 0x18, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, + 0x04, 0x49, 0x00, 0x02, 0x00, 0x02, 0x00, 0xa8, 0x00, 0xac, 0x00, 0x00, + 0x01, 0x24, 0x01, 0x27, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x02, 0x00, 0x12, 0x00, 0x06, 0x02, 0x61, 0x02, 0x5f, + 0x02, 0x62, 0x02, 0x63, 0x02, 0x60, 0x05, 0x0d, 0x00, 0x01, 0x00, 0x06, + 0x00, 0x4d, 0x00, 0x4e, 0x02, 0xe1, 0x03, 0xce, 0x03, 0xd0, 0x04, 0x49, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x06, 0x32, + 0x00, 0x36, 0x00, 0x72, 0x00, 0xa4, 0x00, 0xae, 0x00, 0xb8, 0x00, 0xca, + 0x00, 0xfc, 0x01, 0x0e, 0x01, 0x18, 0x01, 0x4a, 0x01, 0x64, 0x01, 0x7e, + 0x01, 0x90, 0x01, 0xba, 0x01, 0xf6, 0x02, 0x00, 0x02, 0x22, 0x02, 0x3c, + 0x02, 0x4e, 0x02, 0x8a, 0x02, 0x9c, 0x02, 0xb6, 0x02, 0xe0, 0x02, 0xf2, + 0x03, 0x24, 0x03, 0x2e, 0x03, 0x38, 0x03, 0x4a, 0x03, 0x7c, 0x03, 0x86, + 0x03, 0x90, 0x03, 0x9a, 0x03, 0xb4, 0x03, 0xce, 0x03, 0xe0, 0x04, 0x0a, + 0x04, 0x3c, 0x04, 0x46, 0x04, 0x68, 0x04, 0x82, 0x04, 0x94, 0x04, 0xc6, + 0x04, 0xd8, 0x04, 0xf2, 0x05, 0x1c, 0x05, 0x2e, 0x05, 0x38, 0x05, 0x42, + 0x05, 0x4c, 0x05, 0x56, 0x05, 0x80, 0x05, 0xaa, 0x05, 0xd4, 0x05, 0xfe, + 0x06, 0x28, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x20, + 0x00, 0x26, 0x00, 0x2c, 0x02, 0x80, 0x00, 0x02, 0x00, 0xa9, 0x04, 0x1e, + 0x00, 0x02, 0x00, 0xad, 0x02, 0x7f, 0x00, 0x02, 0x00, 0xa8, 0x04, 0x20, + 0x00, 0x02, 0x00, 0xab, 0x02, 0x82, 0x00, 0x02, 0x00, 0xaa, 0x04, 0x99, + 0x00, 0x02, 0x00, 0xac, 0x00, 0x01, 0x00, 0x04, 0x04, 0xa6, 0x00, 0x02, + 0x00, 0xad, 0x00, 0x01, 0x00, 0x04, 0x02, 0xbc, 0x00, 0x02, 0x00, 0xa9, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x04, 0xaa, 0x00, 0x02, 0x01, 0xba, + 0x04, 0xa8, 0x00, 0x02, 0x00, 0xad, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x14, + 0x00, 0x1a, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2c, 0x02, 0x88, 0x00, 0x02, + 0x00, 0xa9, 0x04, 0x36, 0x00, 0x02, 0x00, 0xad, 0x02, 0x87, 0x00, 0x02, + 0x00, 0xa8, 0x04, 0x38, 0x00, 0x02, 0x00, 0xab, 0x04, 0x3a, 0x00, 0x02, + 0x00, 0xaa, 0x04, 0x9b, 0x00, 0x02, 0x00, 0xac, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0c, 0x04, 0x95, 0x00, 0x02, 0x00, 0xa9, 0x02, 0xd6, 0x00, 0x02, + 0x01, 0xba, 0x00, 0x01, 0x00, 0x04, 0x04, 0xac, 0x00, 0x02, 0x00, 0xad, + 0x00, 0x06, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x26, + 0x00, 0x2c, 0x02, 0x8c, 0x00, 0x02, 0x00, 0xa9, 0x04, 0x48, 0x00, 0x02, + 0x00, 0xad, 0x02, 0x8b, 0x00, 0x02, 0x00, 0xa8, 0x04, 0x46, 0x00, 0x02, + 0x00, 0xab, 0x02, 0xda, 0x00, 0x02, 0x00, 0xaa, 0x04, 0x9d, 0x00, 0x02, + 0x00, 0xac, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x14, 0x04, 0xae, + 0x00, 0x02, 0x00, 0xa9, 0x02, 0xe7, 0x00, 0x02, 0x01, 0xba, 0x04, 0xb0, + 0x00, 0x02, 0x00, 0xad, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x14, + 0x02, 0xe9, 0x00, 0x02, 0x00, 0xa9, 0x02, 0xeb, 0x00, 0x02, 0x01, 0xba, + 0x04, 0xb2, 0x00, 0x02, 0x00, 0xad, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, + 0x03, 0xe0, 0x00, 0x02, 0x00, 0xa9, 0x04, 0xb4, 0x00, 0x02, 0x00, 0xad, + 0x00, 0x05, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, + 0x02, 0xf1, 0x00, 0x02, 0x00, 0xa9, 0x02, 0xf3, 0x00, 0x02, 0x01, 0xba, + 0x04, 0xb6, 0x00, 0x02, 0x00, 0xad, 0x04, 0x97, 0x00, 0x02, 0x00, 0xa8, + 0x02, 0x8f, 0x00, 0x02, 0x00, 0xaa, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, + 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x36, 0x04, 0xb8, + 0x00, 0x03, 0x00, 0xaa, 0x00, 0xa9, 0x02, 0x91, 0x00, 0x02, 0x00, 0xa9, + 0x04, 0x4a, 0x00, 0x02, 0x00, 0xad, 0x02, 0x90, 0x00, 0x02, 0x00, 0xa8, + 0x04, 0x4c, 0x00, 0x02, 0x00, 0xab, 0x02, 0x93, 0x00, 0x02, 0x00, 0xaa, + 0x04, 0x9f, 0x00, 0x02, 0x00, 0xac, 0x00, 0x01, 0x00, 0x04, 0x04, 0xb9, + 0x00, 0x02, 0x00, 0xa9, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1c, 0x02, 0xfe, 0x00, 0x02, 0x00, 0xa9, 0x03, 0x00, 0x00, 0x02, + 0x01, 0xba, 0x04, 0xbb, 0x00, 0x02, 0x00, 0xad, 0x04, 0xa1, 0x00, 0x02, + 0x00, 0xac, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x14, 0x03, 0x04, + 0x00, 0x02, 0x00, 0xa9, 0x03, 0x0a, 0x00, 0x02, 0x01, 0xba, 0x04, 0xbd, + 0x00, 0x02, 0x00, 0xad, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x03, 0x0e, + 0x00, 0x02, 0x01, 0xba, 0x04, 0xbf, 0x00, 0x02, 0x00, 0xad, 0x00, 0x07, + 0x00, 0x10, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x30, + 0x00, 0x36, 0x04, 0xc1, 0x00, 0x03, 0x00, 0xaa, 0x00, 0xa9, 0x02, 0x96, + 0x00, 0x02, 0x00, 0xa9, 0x04, 0x62, 0x00, 0x02, 0x00, 0xad, 0x02, 0x95, + 0x00, 0x02, 0x00, 0xa8, 0x04, 0x64, 0x00, 0x02, 0x00, 0xab, 0x03, 0x14, + 0x00, 0x02, 0x00, 0xaa, 0x04, 0xa3, 0x00, 0x02, 0x00, 0xac, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0c, 0x04, 0xc4, 0x00, 0x02, 0x00, 0xad, 0x04, 0xc2, + 0x00, 0x02, 0x00, 0xaa, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x14, + 0x03, 0xd5, 0x00, 0x02, 0x00, 0xa9, 0x04, 0xc6, 0x00, 0x02, 0x00, 0xad, + 0x03, 0xd3, 0x00, 0x02, 0x00, 0xa8, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, 0x02, 0x99, 0x00, 0x02, 0x00, 0xa9, + 0x04, 0x70, 0x00, 0x02, 0x00, 0xad, 0x03, 0xd9, 0x00, 0x02, 0x00, 0xa8, + 0x04, 0x72, 0x00, 0x02, 0x00, 0xab, 0x04, 0x74, 0x00, 0x02, 0x00, 0xaa, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x03, 0x25, 0x00, 0x02, 0x00, 0xa9, + 0x04, 0xc8, 0x00, 0x02, 0x00, 0xad, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x14, + 0x00, 0x1a, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2c, 0x02, 0x9b, 0x00, 0x02, + 0x00, 0xa9, 0x04, 0x1f, 0x00, 0x02, 0x00, 0xad, 0x02, 0x9a, 0x00, 0x02, + 0x00, 0xa8, 0x04, 0x21, 0x00, 0x02, 0x00, 0xab, 0x02, 0x9d, 0x00, 0x02, + 0x00, 0xaa, 0x04, 0x9a, 0x00, 0x02, 0x00, 0xac, 0x00, 0x01, 0x00, 0x04, + 0x04, 0xa7, 0x00, 0x02, 0x00, 0xad, 0x00, 0x01, 0x00, 0x04, 0x02, 0xbd, + 0x00, 0x02, 0x00, 0xa9, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x04, 0xab, + 0x00, 0x02, 0x01, 0xba, 0x04, 0xa9, 0x00, 0x02, 0x00, 0xad, 0x00, 0x06, + 0x00, 0x0e, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2c, + 0x02, 0xa3, 0x00, 0x02, 0x00, 0xa9, 0x04, 0x37, 0x00, 0x02, 0x00, 0xad, + 0x02, 0xa2, 0x00, 0x02, 0x00, 0xa8, 0x04, 0x39, 0x00, 0x02, 0x00, 0xab, + 0x04, 0x3b, 0x00, 0x02, 0x00, 0xaa, 0x04, 0x9c, 0x00, 0x02, 0x00, 0xac, + 0x00, 0x01, 0x00, 0x04, 0x04, 0x96, 0x00, 0x02, 0x00, 0xa9, 0x00, 0x01, + 0x00, 0x04, 0x04, 0xad, 0x00, 0x02, 0x00, 0xad, 0x00, 0x01, 0x00, 0x04, + 0x04, 0x49, 0x00, 0x02, 0x00, 0xad, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0e, + 0x00, 0x14, 0x04, 0xaf, 0x00, 0x02, 0x00, 0xa9, 0x02, 0xe8, 0x00, 0x02, + 0x01, 0xba, 0x04, 0xb1, 0x00, 0x02, 0x00, 0xad, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x0e, 0x00, 0x14, 0x02, 0xea, 0x00, 0x02, 0x00, 0xa9, 0x02, 0xec, + 0x00, 0x02, 0x01, 0xba, 0x04, 0xb3, 0x00, 0x02, 0x00, 0xad, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0c, 0x03, 0xe1, 0x00, 0x02, 0x00, 0xa9, 0x04, 0xb5, + 0x00, 0x02, 0x00, 0xad, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1e, 0x00, 0x24, 0x02, 0xf2, 0x00, 0x02, 0x00, 0xa9, 0x02, 0xf4, + 0x00, 0x02, 0x01, 0xba, 0x04, 0xb7, 0x00, 0x02, 0x00, 0xad, 0x04, 0x98, + 0x00, 0x02, 0x00, 0xa8, 0x02, 0xaa, 0x00, 0x02, 0x00, 0xaa, 0x00, 0x06, + 0x00, 0x0e, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2c, + 0x02, 0xac, 0x00, 0x02, 0x00, 0xa9, 0x04, 0x4b, 0x00, 0x02, 0x00, 0xad, + 0x02, 0xab, 0x00, 0x02, 0x00, 0xa8, 0x04, 0x4d, 0x00, 0x02, 0x00, 0xab, + 0x02, 0xae, 0x00, 0x02, 0x00, 0xaa, 0x04, 0xa0, 0x00, 0x02, 0x00, 0xac, + 0x00, 0x01, 0x00, 0x04, 0x04, 0xba, 0x00, 0x02, 0x00, 0xa9, 0x00, 0x04, + 0x00, 0x0a, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1c, 0x02, 0xff, 0x00, 0x02, + 0x00, 0xa9, 0x03, 0x01, 0x00, 0x02, 0x01, 0xba, 0x04, 0xbc, 0x00, 0x02, + 0x00, 0xad, 0x04, 0xa2, 0x00, 0x02, 0x00, 0xac, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x0e, 0x00, 0x14, 0x03, 0x05, 0x00, 0x02, 0x00, 0xa9, 0x03, 0x0b, + 0x00, 0x02, 0x01, 0xba, 0x04, 0xbe, 0x00, 0x02, 0x00, 0xad, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0c, 0x03, 0x0f, 0x00, 0x02, 0x01, 0xba, 0x04, 0xc0, + 0x00, 0x02, 0x00, 0xad, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x1a, + 0x00, 0x20, 0x00, 0x26, 0x00, 0x2c, 0x02, 0xb1, 0x00, 0x02, 0x00, 0xa9, + 0x04, 0x63, 0x00, 0x02, 0x00, 0xad, 0x02, 0xb0, 0x00, 0x02, 0x00, 0xa8, + 0x04, 0x65, 0x00, 0x02, 0x00, 0xab, 0x03, 0x15, 0x00, 0x02, 0x00, 0xaa, + 0x04, 0xa4, 0x00, 0x02, 0x00, 0xac, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, + 0x04, 0xc5, 0x00, 0x02, 0x00, 0xad, 0x04, 0xc3, 0x00, 0x02, 0x00, 0xaa, + 0x00, 0x03, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x14, 0x03, 0xd6, 0x00, 0x02, + 0x00, 0xa9, 0x04, 0xc7, 0x00, 0x02, 0x00, 0xad, 0x03, 0xd4, 0x00, 0x02, + 0x00, 0xa8, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1e, + 0x00, 0x24, 0x02, 0xb4, 0x00, 0x02, 0x00, 0xa9, 0x04, 0x71, 0x00, 0x02, + 0x00, 0xad, 0x03, 0xda, 0x00, 0x02, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x02, + 0x00, 0xab, 0x04, 0x75, 0x00, 0x02, 0x00, 0xaa, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0c, 0x03, 0x26, 0x00, 0x02, 0x00, 0xa9, 0x04, 0xc9, 0x00, 0x02, + 0x00, 0xad, 0x00, 0x01, 0x00, 0x04, 0x03, 0x2b, 0x00, 0x02, 0x00, 0xa9, + 0x00, 0x01, 0x00, 0x04, 0x03, 0x2d, 0x00, 0x02, 0x00, 0xa9, 0x00, 0x01, + 0x00, 0x04, 0x03, 0x2c, 0x00, 0x02, 0x00, 0xa9, 0x00, 0x01, 0x00, 0x04, + 0x03, 0x2e, 0x00, 0x02, 0x00, 0xa9, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, 0x02, 0xa7, 0x00, 0x02, 0x00, 0xa9, + 0x02, 0xa6, 0x00, 0x02, 0x00, 0xa8, 0x04, 0x47, 0x00, 0x02, 0x00, 0xab, + 0x02, 0xdb, 0x00, 0x02, 0x00, 0xaa, 0x04, 0x9e, 0x00, 0x02, 0x00, 0xac, + 0x00, 0x05, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, + 0x04, 0x58, 0x00, 0x02, 0x00, 0xa9, 0x04, 0x60, 0x00, 0x02, 0x00, 0xad, + 0x04, 0x5a, 0x00, 0x02, 0x00, 0xa8, 0x04, 0x5c, 0x00, 0x02, 0x00, 0xab, + 0x04, 0x5e, 0x00, 0x02, 0x00, 0xaa, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, 0x04, 0x59, 0x00, 0x02, 0x00, 0xa9, + 0x04, 0x61, 0x00, 0x02, 0x00, 0xad, 0x04, 0x5b, 0x00, 0x02, 0x00, 0xa8, + 0x04, 0x5d, 0x00, 0x02, 0x00, 0xab, 0x04, 0x5f, 0x00, 0x02, 0x00, 0xaa, + 0x00, 0x05, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, + 0x04, 0x66, 0x00, 0x02, 0x00, 0xa9, 0x04, 0x6e, 0x00, 0x02, 0x00, 0xad, + 0x04, 0x68, 0x00, 0x02, 0x00, 0xa8, 0x04, 0x6a, 0x00, 0x02, 0x00, 0xab, + 0x04, 0x6c, 0x00, 0x02, 0x00, 0xaa, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, 0x04, 0x67, 0x00, 0x02, 0x00, 0xa9, + 0x04, 0x6f, 0x00, 0x02, 0x00, 0xad, 0x04, 0x69, 0x00, 0x02, 0x00, 0xa8, + 0x04, 0x6b, 0x00, 0x02, 0x00, 0xab, 0x04, 0x6d, 0x00, 0x02, 0x00, 0xaa, + 0x00, 0x01, 0x00, 0x04, 0x04, 0xa5, 0x00, 0x02, 0x00, 0xa9, 0x00, 0x02, + 0x00, 0x11, 0x00, 0x25, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x2d, + 0x00, 0x05, 0x00, 0x2f, 0x00, 0x34, 0x00, 0x08, 0x00, 0x36, 0x00, 0x3b, + 0x00, 0x0e, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x14, 0x00, 0x45, 0x00, 0x49, + 0x00, 0x16, 0x00, 0x4b, 0x00, 0x4d, 0x00, 0x1b, 0x00, 0x4f, 0x00, 0x54, + 0x00, 0x1e, 0x00, 0x56, 0x00, 0x5b, 0x00, 0x24, 0x00, 0x5d, 0x00, 0x5e, + 0x00, 0x2a, 0x00, 0x81, 0x00, 0x81, 0x00, 0x2c, 0x00, 0x83, 0x00, 0x83, + 0x00, 0x2d, 0x00, 0x86, 0x00, 0x86, 0x00, 0x2e, 0x00, 0x89, 0x00, 0x89, + 0x00, 0x2f, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x30, 0x00, 0x98, 0x00, 0x9b, + 0x00, 0x31, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x35, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x02, 0x03, 0x08, 0x03, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x02, 0x00, 0x12, 0x00, 0x06, 0x05, 0x07, 0x05, 0x08, + 0x05, 0x09, 0x05, 0x0a, 0x05, 0x0b, 0x05, 0x0c, 0x00, 0x01, 0x00, 0x06, + 0x02, 0xba, 0x02, 0xbb, 0x02, 0xcc, 0x02, 0xcd, 0x03, 0x4f, 0x03, 0x58, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x7b, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0e, 0x01, 0xbe, 0x00, 0x03, 0x00, 0x4a, + 0x00, 0x4d, 0x01, 0xbc, 0x00, 0x02, 0x00, 0x4d, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0e, 0x01, 0xbf, 0x00, 0x03, 0x00, 0x4a, + 0x00, 0x50, 0x01, 0xbd, 0x00, 0x02, 0x00, 0x50, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x4a, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x2a, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x20, 0x00, 0x01, + 0x00, 0x04, 0x01, 0xbb, 0x00, 0x02, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x04, + 0x01, 0xc1, 0x00, 0x02, 0x00, 0x58, 0x00, 0x01, 0x00, 0x04, 0x01, 0xc0, + 0x00, 0x02, 0x00, 0x58, 0x00, 0x01, 0x00, 0x03, 0x00, 0x4a, 0x00, 0x57, + 0x00, 0x95, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x06, 0x01, 0xde, 0x00, 0x01, 0x00, 0x01, 0x00, 0x4b, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x01, 0x6f, + 0x00, 0x01, 0x00, 0x01, 0x00, 0xbb, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x01, 0xf5, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x36, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, + 0x00, 0x1c, 0x00, 0x02, 0x02, 0x2c, 0x02, 0x2d, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x02, 0x02, 0x2e, + 0x02, 0x2f, 0x00, 0x01, 0x00, 0x02, 0x00, 0x2f, 0x00, 0x4f, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x0c, + 0x02, 0x45, 0x02, 0x47, 0x02, 0x46, 0x02, 0x48, 0x02, 0x49, 0x02, 0x67, + 0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, + 0x00, 0x01, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x28, 0x00, 0x2b, 0x00, 0x33, + 0x00, 0x35, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x4b, 0x00, 0x53, + 0x00, 0x54, 0x00, 0x55, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x02, 0x00, 0x0c, 0x00, 0x03, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x6f, + 0x00, 0x01, 0x00, 0x03, 0x00, 0x49, 0x00, 0x4b, 0x02, 0x6a, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x2e, 0x00, 0x14, + 0x02, 0x5a, 0x02, 0x5e, 0x02, 0x58, 0x02, 0x55, 0x02, 0x57, 0x02, 0x56, + 0x02, 0x5b, 0x02, 0x59, 0x02, 0x5d, 0x02, 0x5c, 0x02, 0x4f, 0x02, 0x4a, + 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x00, 0x1a, 0x00, 0x1c, + 0x02, 0x53, 0x02, 0x65, 0x00, 0x02, 0x00, 0x04, 0x00, 0x14, 0x00, 0x1d, + 0x00, 0x00, 0x02, 0x66, 0x02, 0x66, 0x00, 0x0a, 0x02, 0x70, 0x02, 0x70, + 0x00, 0x0b, 0x04, 0x8d, 0x04, 0x94, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x2e, 0x00, 0x14, 0x04, 0x94, + 0x02, 0x70, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, 0x04, 0x90, 0x04, 0x91, + 0x02, 0x66, 0x04, 0x92, 0x04, 0x93, 0x02, 0x4c, 0x02, 0x4e, 0x02, 0x4d, + 0x02, 0x4b, 0x02, 0x4f, 0x02, 0x65, 0x00, 0x1a, 0x02, 0x53, 0x00, 0x1c, + 0x02, 0x4a, 0x00, 0x02, 0x00, 0x02, 0x00, 0x14, 0x00, 0x1d, 0x00, 0x00, + 0x02, 0x55, 0x02, 0x5e, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x02, 0x00, 0x2e, 0x00, 0x14, 0x02, 0x5b, 0x02, 0x5d, + 0x02, 0x5e, 0x02, 0x58, 0x02, 0x55, 0x02, 0x57, 0x02, 0x56, 0x02, 0x59, + 0x02, 0x5c, 0x02, 0x5a, 0x00, 0x1b, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, + 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x14, + 0x00, 0x01, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x1c, 0x02, 0x4a, 0x02, 0x4b, + 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0x4f, 0x02, 0x53, 0x02, 0x65, + 0x02, 0x66, 0x02, 0x70, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, 0x04, 0x90, + 0x04, 0x91, 0x04, 0x92, 0x04, 0x93, 0x04, 0x94, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x2e, 0x00, 0x14, 0x04, 0x91, + 0x04, 0x92, 0x02, 0x70, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, 0x04, 0x90, + 0x02, 0x66, 0x04, 0x93, 0x00, 0x17, 0x00, 0x19, 0x00, 0x18, 0x00, 0x16, + 0x00, 0x1b, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x1c, 0x00, 0x15, + 0x04, 0x94, 0x00, 0x02, 0x00, 0x06, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x01, 0x02, 0x4a, 0x02, 0x4f, 0x00, 0x02, + 0x02, 0x53, 0x02, 0x53, 0x00, 0x08, 0x02, 0x55, 0x02, 0x5e, 0x00, 0x09, + 0x02, 0x65, 0x02, 0x65, 0x00, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x01, 0x81, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x13, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x00, 0x03, 0x01, 0x94, 0x01, 0x94, + 0x00, 0x00, 0x01, 0xc5, 0x01, 0xc7, 0x00, 0x01, 0x02, 0x1f, 0x02, 0x25, + 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, + 0x00, 0x3c, 0x00, 0x0a, 0x01, 0xc7, 0x01, 0xc6, 0x01, 0xc5, 0x02, 0x1f, + 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x1a, + 0x00, 0x0a, 0x02, 0x3e, 0x00, 0x7a, 0x00, 0x73, 0x00, 0x74, 0x02, 0x3f, + 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x14, 0x00, 0x1d, 0x00, 0x00 +}; + return s_data; +} + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/font/roboto_license b/source/externals/g4tools/include/tools/font/roboto_license new file mode 100644 index 0000000000..104801ffec --- /dev/null +++ b/source/externals/g4tools/include/tools/font/roboto_license @@ -0,0 +1,205 @@ + +/*LICENSE: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ diff --git a/source/externals/g4tools/include/tools/hdf5/ntuple b/source/externals/g4tools/include/tools/hdf5/ntuple index 6afce08896..add9283ee7 100644 --- a/source/externals/g4tools/include/tools/hdf5/ntuple +++ b/source/externals/g4tools/include/tools/hdf5/ntuple @@ -42,6 +42,7 @@ public: }; public: + template class column_ref : public virtual icol { #ifdef TOOLS_MEM @@ -266,12 +267,8 @@ public: TOOLS_CLASS_STRING_VALUE(vector_uint32,vector) TOOLS_CLASS_STRING_VALUE(vector_uint64,vector) -// -#define TOOLS_HDF5_NTUPLE_VLEN -// -#define TOOLS_HDF5_NTUPLE_STRING + TOOLS_CLASS_STRING_VALUE(vector_string,vector) -#ifdef TOOLS_HDF5_NTUPLE_VLEN template class std_vector_column_ref : public virtual icol { #ifdef TOOLS_MEM @@ -351,96 +348,6 @@ public: std::string m_name; std::vector& m_ref; }; -#else //!TOOLS_HDF5_NTUPLE_VLEN - template - class std_vector_column_ref : public column { - typedef column parent; -#ifdef TOOLS_MEM - static const std::string& s_class() { - static const std::string s_v("tools::hdf5::ntuple::std_vector_column_ref<"+tools::stype(T())+">"); - return s_v; - } -#endif - public: - static tools::cid id_class() {return tools::_cid_std_vector()+10000;} - virtual void* cast(tools::cid a_class) const { - if(void* p = tools::cmp_cast(this,a_class)) {return p;} - else return 0; - } - virtual tools::cid id_cls() const {return id_class();} - public: //icol - virtual void reset() { - m_branch.reset_pos(); - m_data_pages.reset_pos(); - } - virtual bool add() { //write. - if(!m_write) return false; - if(m_ref.size()) { - const T* _data = tools::vec_data(m_ref); - if(!m_data_pages.write_page(m_ref.size(),_data)) return false; - } - if(!parent::fill((unsigned int)m_ref.size())) return false; - if(!parent::add()) return false; - return true; - } - virtual bool fetch_entry() { //read. - if(m_write) return false; - if(!parent::fetch_entry()) return false; - unsigned int sz; - if(!parent::get_entry(sz)) return false; - m_ref.resize(sz,T()); - if(sz) { - T* _data = tools::vec_data(m_ref); - if(!m_data_pages.read_page(sz,_data)) {m_ref.clear();return false;} - } - return true; - } - virtual const std::string& name() const {return m_name;} - virtual bool set_basket_size(size_t /*a_size*/) { - //m_branch->set_basket_size(a_size); - return true; - } - public: - std_vector_column_ref(store& a_store,pages& a_pages,bool a_write, - const std::string& a_name,size_t a_basket_size, - std::vector& a_ref) - :parent(a_store,a_pages,a_write,a_name,a_basket_size) - ,m_ref(a_ref) - ,m_data_pages(a_store.out(),a_store.group(),a_name+"_data",tools::stype(T()),a_write,a_store.compress_level()) - { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - if(!m_data_pages.is_valid()) { - m_store.out() << "tools::hdf5::std_vector_column_ref::std_vector_column_ref :" - << " can't create data pages." << std::endl; - } - } - virtual ~std_vector_column_ref(){ -#ifdef TOOLS_MEM - tools::mem::decrement(s_class().c_str()); -#endif - } - protected: - std_vector_column_ref(const std_vector_column_ref& a_from) - :icol(a_from) - ,parent(a_from) - ,m_ref(a_from.m_ref) - ,m_data_pages(a_from.m_store.out(),a_from.m_store.group(),a_from.m_name+"_data", - tools::stype(T()),a_from.m_write,a_from.m_store.compress_level()) - {} - std_vector_column_ref& operator=(const std_vector_column_ref& a_from){ - if(&a_from==this) return *this; - m_name = a_from.m_name; - return *this; - } - public: - //const std::vector& ref() const {return m_ref;} - protected: - std::vector& m_ref; - pages m_data_pages; - }; -#endif //TOOLS_HDF5_NTUPLE_VLEN template class std_vector_column : public std_vector_column_ref { @@ -473,16 +380,11 @@ public: return *this; } public: - //bool get_entry(std::vector& a_v) const { - // a_v = m_tmp; - // return true; - //} const std::vector& data() const {return m_tmp;} protected: std::vector m_tmp; }; -#ifdef TOOLS_HDF5_NTUPLE_STRING class column_string_ref : public virtual icol { #ifdef TOOLS_MEM TOOLS_SCLASS(tools::hdf5::ntuple::column_string_ref) @@ -553,95 +455,6 @@ public: std::string m_name; std::string& m_ref; }; -#else //!TOOLS_HDF5_NTUPLE_STRING - class column_string_ref : public column { - typedef column parent; -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hdf5::ntuple::column_string_ref) -#endif - public: - static tools::cid id_class() { - static const std::string s_v; - return tools::_cid(s_v)+10000; - } - virtual void* cast(tools::cid a_class) const { - if(void* p = tools::cmp_cast(this,a_class)) {return p;} - else return 0; - } - virtual tools::cid id_cls() const {return id_class();} - public: //icol - virtual void reset() { - m_branch.reset_pos(); - m_data_pages.reset_pos(); - } - virtual bool add() { //write. - if(!m_write) return false; - if(m_ref.size()) { - const char* _data = m_ref.c_str(); - if(!m_data_pages.write_page(m_ref.size(),_data)) return false; - } - if(!parent::fill((unsigned int)m_ref.size())) return false; - if(!parent::add()) return false; - return true; - } - virtual bool fetch_entry() { //read. - if(m_write) return false; - if(!parent::fetch_entry()) return false; - unsigned int sz; - if(!parent::get_entry(sz)) return false; - m_ref.resize(sz); - if(sz) { - char* _data = (char*)m_ref.c_str(); - if(!m_data_pages.read_page(sz,_data)) {m_ref.clear();return false;} - } - return true; - } - virtual const std::string& name() const {return m_name;} - virtual bool set_basket_size(size_t /*a_size*/) { - //m_branch->set_basket_size(a_size); - return true; - } - public: - column_string_ref(store& a_store,pages& a_pages,bool a_write, - const std::string& a_name,size_t a_basket_size, - std::string& a_ref) - :parent(a_store,a_pages,a_write,a_name,a_basket_size) - ,m_ref(a_ref) - ,m_data_pages(a_store.out(),a_store.group(),a_name+"_data",tools::stype(char()),a_write,a_store.compress_level()) - { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - if(!m_data_pages.is_valid()) { - m_store.out() << "tools::hdf5::column_string_ref::column_string_ref :" - << " can't create data pages." << std::endl; - } - } - virtual ~column_string_ref(){ -#ifdef TOOLS_MEM - tools::mem::decrement(s_class().c_str()); -#endif - } - protected: - column_string_ref(const column_string_ref& a_from) - :icol(a_from) - ,parent(a_from) - ,m_ref(a_from.m_ref) - ,m_data_pages(a_from.m_store.out(),a_from.m_store.group(),a_from.m_name+"_data", - tools::stype(char()),a_from.m_write,a_from.m_store.compress_level()) - {} - column_string_ref& operator=(const column_string_ref& a_from){ - if(&a_from==this) return *this; - m_name = a_from.m_name; - return *this; - } - public: - //const std::string& ref() const {return m_ref;} - protected: - std::string& m_ref; - pages m_data_pages; - }; -#endif //TOOLS_HDF5_NTUPLE_STRING class column_string : public column_string_ref { typedef column_string_ref parent; @@ -688,6 +501,143 @@ public: std::string m_tmp; }; + + + class std_vector_column_string_ref : public virtual icol { +#ifdef TOOLS_MEM + static const std::string& s_class() { + static const std::string s_v("tools::hdf5::ntuple::std_vector_column_string_ref"); + return s_v; + } +#endif + public: + static tools::cid id_class() {return tools::_cid_std_vector()+10000;} + virtual void* cast(tools::cid a_class) const { + if(void* p = tools::cmp_cast(this,a_class)) {return p;} + else return 0; + } + virtual tools::cid id_cls() const {return id_class();} + public: //icol + virtual bool add() { //write. + if(!m_write) return false; + size_t _size = 0; + {tools_vforcit(std::string,m_ref,it) { + _size += (*it).size(); + _size++; + }} + char* _data = _size?new char[_size]:0; + {char* pos = _data; + tools_vforcit(std::string,m_ref,it) { + ::memcpy(pos,(*it).c_str(),(*it).size()); + pos += (*it).size(); + *pos = 0; + pos++; + }} + return m_branch.write_vlen(_size,_data); + } + virtual bool fetch_entry() { //read. + if(m_write) return false; + size_t n; + char* _data; + if(!m_branch.read_vlen(n,_data)) { + m_store.out() << "tools::hdf5::ntuple::std_vector_column_string_ref:fetch_entry : read_page() failed." << std::endl; + return false; + } + m_ref.clear(); + {char* pos = _data; + char* begin = _data; + for(size_t ichar=0;ichar& a_ref) + :m_store(a_store) + ,m_branch(a_pages) + ,m_write(a_write) + ,m_name(a_name) + ,m_ref(a_ref) + { +#ifdef TOOLS_MEM + tools::mem::increment(s_class().c_str()); +#endif + } + virtual ~std_vector_column_string_ref(){ +#ifdef TOOLS_MEM + tools::mem::decrement(s_class().c_str()); +#endif + } + protected: + std_vector_column_string_ref(const std_vector_column_string_ref& a_from) + :icol(a_from) + ,m_store(a_from.m_store) + ,m_branch(a_from.m_branch) + ,m_write(a_from.m_write) + ,m_name(a_from.m_name) + ,m_ref(a_from.m_ref) + {} + std_vector_column_string_ref& operator=(const std_vector_column_string_ref& a_from){ + if(&a_from==this) return *this; + m_name = a_from.m_name; + return *this; + } + protected: + store& m_store; + pages& m_branch; + bool m_write; + std::string m_name; + std::vector& m_ref; + }; + + class std_vector_column_string : public std_vector_column_string_ref { + typedef std_vector_column_string_ref parent; +#ifdef TOOLS_MEM + static const std::string& s_class() { + static const std::string s_v("tools::hdf5::ntuple::std_vector_column_string"); + return s_v; + } +#endif + public: + static tools::cid id_class() {return tools::_cid_std_vector();} + virtual void* cast(tools::cid a_class) const { + if(void* p = tools::cmp_cast(this,a_class)) {return p;} + else return 0; + } + virtual tools::cid id_cls() const {return id_class();} + public: + std_vector_column_string(store& a_store,pages& a_pages,bool a_write,const std::string& a_name,size_t a_basket_size) + :parent(a_store,a_pages,a_write,a_name,a_basket_size,m_tmp) + {} + virtual ~std_vector_column_string(){} + protected: + std_vector_column_string(const std_vector_column_string& a_from) + :icol(a_from) + ,parent(a_from) + {} + std_vector_column_string& operator=(const std_vector_column_string& a_from){ + parent::operator=(a_from); + return *this; + } + public: + //bool get_entry(std::vector& a_v) const { + // a_v = m_tmp; + // return true; + //} + const std::vector& data() const {return m_tmp;} + protected: + std::vector m_tmp; + }; + public: ntuple(std::ostream& a_out,hid_t a_group,const std::string& a_name, unsigned int a_compress,size_t /*a_basket_size*//* = 32000*/) @@ -713,6 +663,13 @@ public: m_cols.push_back(col);\ } +#define TOOLS_HDF5_NTUPLE_READ_CREATE_VEC_COL_STRING \ + if((*it)->form()==s_vector_string()) {\ + std_vector_column_string* col = new std_vector_column_string(*this,*(*it),false,(*it)->name(),0);\ + if(!col) {tools::safe_clear(m_cols);return;}\ + m_cols.push_back(col);\ + } + TOOLS_HDF5_NTUPLE_READ_CREATE_COL(char) else TOOLS_HDF5_NTUPLE_READ_CREATE_COL(short) else TOOLS_HDF5_NTUPLE_READ_CREATE_COL(int) @@ -748,7 +705,7 @@ public: else TOOLS_HDF5_NTUPLE_READ_CREATE_VEC_COL(uint32,tools::uint32) else TOOLS_HDF5_NTUPLE_READ_CREATE_VEC_COL(uint64,tools::uint64) -// else TOOLS_HDF5_NTUPLE_READ_CREATE_VEC_COL(std::string) + else TOOLS_HDF5_NTUPLE_READ_CREATE_VEC_COL_STRING // else TOOLS_HDF5_NTUPLE_READ_CREATE_VEC_COL(bool) //use byte=uchar. else { @@ -821,6 +778,26 @@ public: }\ } +#define TOOLS_HDF5_NTUPLE_CREATE_VEC_COL_STRING \ + if((*it).cls_id()==tools::_cid_std_vector()) {\ + std::vector* vec = (std::vector*)(*it).user_obj();\ + if(!vec) {\ + m_out << "tools::hdf5::ntuple :"\ + << " for std::vector column " << tools::sout((*it).name())\ + << ", the user vector pointer is null."\ + << std::endl;\ + tools::safe_clear(m_cols);\ + return;\ + }\ + if(!create_std_column_string_ref((*it).name(),a_basket_size,*vec)) {\ + m_out << "tools::hdf5::ntuple :"\ + << " can't create std::vector column " << tools::sout((*it).name()) << "."\ + << std::endl;\ + tools::safe_clear(m_cols);\ + return;\ + }\ + } + TOOLS_HDF5_NTUPLE_CREATE_COL(char) else TOOLS_HDF5_NTUPLE_CREATE_COL(short) else TOOLS_HDF5_NTUPLE_CREATE_COL(int) @@ -858,6 +835,7 @@ public: else TOOLS_HDF5_NTUPLE_CREATE_VEC_COL(tools::uint32) else TOOLS_HDF5_NTUPLE_CREATE_VEC_COL(tools::uint64) + else TOOLS_HDF5_NTUPLE_CREATE_VEC_COL_STRING // else TOOLS_HDF5_NTUPLE_CREATE_VEC_COL(std::string) // else TOOLS_HDF5_NTUPLE_CREATE_VEC_COL(bool) //use byte=uchar. @@ -917,6 +895,21 @@ public: }\ } +#define TOOLS_HDF5_NTUPLE_READ_BINDING_CREATE_VEC_COL_STRING \ + if((*it)->form()==s_vector_string()) {\ + std::vector* user_var = a_bd.find_variable< std::vector >((*it)->name());\ + if(user_var) {\ + std_vector_column_string_ref* col = \ + new std_vector_column_string_ref(*this,*(*it),false,(*it)->name(),0,*user_var);\ + if(!col) {tools::safe_clear(m_cols);return false;}\ + m_cols.push_back(col);\ + } else {\ + std_vector_column_string* col = new std_vector_column_string(*this,*(*it),false,(*it)->name(),0);\ + if(!col) {tools::safe_clear(m_cols);return false;}\ + m_cols.push_back(col);\ + }\ + } + TOOLS_HDF5_NTUPLE_READ_BINDING_CREATE_COL(char) else TOOLS_HDF5_NTUPLE_READ_BINDING_CREATE_COL(short) else TOOLS_HDF5_NTUPLE_READ_BINDING_CREATE_COL(int) @@ -959,7 +952,8 @@ public: else TOOLS_HDF5_NTUPLE_READ_BINDING_CREATE_VEC_COL(uint32,tools::uint32) else TOOLS_HDF5_NTUPLE_READ_BINDING_CREATE_VEC_COL(uint64,tools::uint64) -// else TOOLS_HDF5_NTUPLE_READ_BINDING_CREATE_VEC_COL(std::string) + else TOOLS_HDF5_NTUPLE_READ_BINDING_CREATE_VEC_COL_STRING + // else TOOLS_HDF5_NTUPLE_READ_BINDING_CREATE_VEC_COL(bool) //use byte=uchar. else { @@ -1025,6 +1019,17 @@ public: return col; } + std_vector_column_string_ref* create_std_column_string_ref(const std::string& a_name,size_t a_basket_size,std::vector& a_ref) { + //NOTE : to optimize, we do not handle a default std::vector value logic. + if(tools::find_named(m_cols,a_name)) return 0; + pages* _pages = create_pages(a_name,"vector"); + if(!_pages) return 0; + std_vector_column_string_ref* col = new std_vector_column_string_ref(*this,*_pages,true,a_name,a_basket_size,a_ref); + if(!col) return 0; + m_cols.push_back(col); + return col; + } + template column_ref* find_column_ref(const std::string& a_name) { icol* col = tools::find_named(m_cols,a_name); @@ -1051,6 +1056,17 @@ public: return tools::id_cast >(*col); } + std_vector_column_string_ref* find_std_vector_column_string_ref(const std::string& a_name) { + icol* col = tools::find_named(m_cols,a_name); + if(!col) return 0; + return tools::id_cast(*col); + } + std_vector_column_string* find_std_vector_column_string(const std::string& a_name) { + icol* col = tools::find_named(m_cols,a_name); + if(!col) return 0; + return tools::id_cast(*col); + } + column_string* find_column_string(const std::string& a_name) { icol* col = tools::find_named(m_cols,a_name); if(!col) return 0; @@ -1091,4 +1107,5 @@ protected: }} + #endif diff --git a/source/externals/g4tools/include/tools/hep/pbp.icc b/source/externals/g4tools/include/tools/hep/pbp.icc deleted file mode 100644 index e4179c986c..0000000000 --- a/source/externals/g4tools/include/tools/hep/pbp.icc +++ /dev/null @@ -1,2802 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -/*********************************************************************** - * * - * Name: BooleanProcessor Date: 10.12.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Internal class for executing boolean operations * - * on Polyhedra * - * * - ***********************************************************************/ - -#include "../lina/plane" - -//#define TOOLS_HEP_BP_OUT_ERR -//#define TOOLS_HEP_BP_CHECK_INDEX - -//#define TOOLS_HEP_BP_VERBOSE -//#define TOOLS_HEP_BP_NOT_OPT - -#if defined(TOOLS_HEP_BP_OUT_ERR) || defined(TOOLS_HEP_BP_VERBOSE) || defined(TOOLS_HEP_BP_CHECK_INDEX) -#include -#endif - -namespace tools { -namespace hep { - -typedef plane HVPlane3D; - -const double GRANULARITY = 10.e+5; - -// Operations -const int OP_UNION = 0; -const int OP_INTERSECTION = 1; -const int OP_SUBTRACTION = 2; - -// Face vs face statuses -const int OUT_OF_PLANE = 0; -const int ON_PLANE = 1; -const int INTERSECTION = 2; -const int EDGE = 3; -const int NON_PLANAR_FACE = 4; - -// Face statuses -const int UNKNOWN_FACE = 0; -const int ORIGINAL_FACE = -1; -const int NEW_FACE = -2; -const int UNSUITABLE_FACE = -3; -const int DEFECTIVE_FACE = -4; - -// -------------------------------------------- Simplified STL vector --- -//G.Barrand : begin -//#include -//G.Barrand : end - -// ---------------------------------------------------- Extended node --- -class ExtNode { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hep::ExtNode) -#endif - public: - HVPoint3D v; - int s; - - public: - ExtNode(HVPoint3D vertex=HVPoint3D(), int status=0) - : v(vertex), s(status) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - ~ExtNode() { -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } - - ExtNode(const ExtNode & node) : v(node.v), s(node.s) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - - ExtNode & operator=(const ExtNode & node) { - v = node.v; - s = node.s; - return *this; - } -}; - -// ---------------------------------------------------- Extended edge --- -class ExtEdge { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hep::ExtEdge) -#endif - public: - int i1, i2; // end points - int iface1; // native face - int iface2; // neighbouring face - int ivis; // visibility: +1 (visible), -1 (invisible) - int inext; // index of next edge - - public: - ExtEdge(int k1=0, int k2=0, int kface1=0, int kface2=0, int kvis=0) : - i1(k1), i2(k2), iface1(kface1), iface2(kface2), ivis(kvis), inext(0) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - - ~ExtEdge() { -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } - - ExtEdge(const ExtEdge & edge) : - i1(edge.i1), i2(edge.i2), iface1(edge.iface1), iface2(edge.iface2), - ivis(edge.ivis), inext(edge.inext) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - - ExtEdge & operator=(const ExtEdge & edge) { - i1 = edge.i1; - i2 = edge.i2; - iface1 = edge.iface1; - iface2 = edge.iface2; - ivis = edge.ivis; - inext = edge.inext; - return *this; - } - - void invert() { - int w; - //#define SWAP(A,B) w = A; A = B; B = w - //SWAP(i1, i2); - w = i1;i1=i2;i2=w; - } -}; - -// ---------------------------------------------------- Extended face --- -class ExtFace { - private: -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hep::ExtFace) -#endif - std::vector& edges; //G.Barrand - public: - int iedges[4]; // indices of original edges - HVPlane3D plane; // face plane - double rmin[3], rmax[3]; // bounding box - int iold; // head of the list of the original edges - int inew; // head of the list of the new edges - int iprev; // index of previous face - int inext; // index of next face - - public: - //G.Barrand : ExtFace(int iedge=0) : iold(iedge), inew(0), iprev(iprev), inext(0) {} - ExtFace(std::vector& a_edges,int iedge) - : edges(a_edges), iold(iedge), inew(0), iprev(0), inext(0) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - //G.Barrand : initialize arrays to quiet valgrind. - {for (int i=0; i<4; i++) { iedges[i] = 0; }} - {for (int i=0; i<3; i++) { rmin[i] = 0; rmax[i] = 0; }} - } - ~ExtFace() { -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } - - ExtFace(const ExtFace & face) : - edges(face.edges), //G.Barrand - plane(face.plane), iold(face.iold), inew(face.inew), - iprev(face.iprev), inext(face.inext) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - int i; - for (i=0; i<4; i++) { iedges[i] = face.iedges[i]; } - for (i=0; i<3; i++) { rmin[i] = face.rmin[i]; rmax[i] = face.rmax[i]; } - } - - ExtFace & operator=(const ExtFace & face) { - //FIXME : edges(face.edges) ???? //G.Barrand - int i; - for (i=0; i<4; i++) { iedges[i] = face.iedges[i]; } - plane = face.plane; - for (i=0; i<3; i++) { rmin[i] = face.rmin[i]; rmax[i] = face.rmax[i]; } - iold = face.iold; - inew = face.inew; - iprev = face.iprev; - inext = face.inext; - return *this; - } - - bool invert(); //G.Barrand : return bool. - - //G.Barrand -#ifdef TOOLS_HEP_BP_CHECK_INDEX - bool check_edge_index(const std::string& a_where,int a_index) { - if(a_index<0) { - std::cerr << "ExtFace::check_edge_index :" - << " " << a_where << " :" - << " i<0." - << std::endl; - return false; - } - if(a_index>=int(edges.size())) { - std::cerr << "ExtFace::check_edge_index :" - << " " << a_where << " :" - << " i>=sz." - << " i=" << a_index - << " sz=" << edges.size() - << " cap=" << edges.capacity() - << std::endl; - return false; - } - return true; - } -#endif -}; - -// ---------------------------------------------------- Global arrays --- -//G.Barrand : MacIntel : crash with g++-4.0.1 with -O on some subtract. -// Anyway static of objects is proved to be not safe. -// We put the below vector as members of BooleanProcessor. -//GB static std::vector nodes; // vector of nodes -//GB static std::vector edges; // vector of edges -//GB static std::vector faces; // vector of faces - -// ---------------------------------------------------- List of faces --- -class FaceList { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hep::FaceList) -#endif - private: - std::vector& faces; //G.Barrad : end - private: - int ihead; - int ilast; - - public: - //G.Barrand : FaceList() : ihead(0), ilast(0) {} - FaceList(std::vector& a_faces) : faces(a_faces),ihead(0),ilast(0) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - ~FaceList() { -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } - protected: - FaceList(const FaceList& a_from) - :faces(a_from.faces),ihead(0),ilast(0){ -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - - FaceList& operator=(const FaceList&) {return *this;} - public: - void clean() { ihead = 0; ilast = 0; } - int front() { return ihead; } - - void push_back(int i) { - if (ilast == 0) { ihead = i; } else { faces[ilast].inext = i; } - ExtFace& face = faces[i]; //G.Barrand : optimize. - face.iprev = ilast; - face.inext = 0; - ilast = i; - } - - void remove(int i) { - ExtFace& face = faces[i]; //G.Barrand : optimize. - if (ihead == i) { - ihead = face.inext; - }else{ - faces[face.iprev].inext = face.inext; - } - if (ilast == i) { - ilast = face.iprev; - }else{ - faces[face.inext].iprev = face.iprev; - } - face.iprev = 0; - face.inext = 0; - } -}; - -// --------------------- Polyhedron with extended access to -// its members from the BooleanProcessor class --- -class ExtPolyhedron : public polyhedron { - friend class BooleanProcessor; - virtual polyhedron& operator = (const polyhedron& from) { - return polyhedron::operator = (from); - } -}; - -// ----------------------------------------- Boolean processor class --- -class BooleanProcessor { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hep::BooleanProcessor) -#endif - private: - //static int ishift; //G.Barrand - std::vector nodes; // vector of nodes //G.Barrand - std::vector edges; // vector of edges //G.Barrand - std::vector faces; // vector of faces //G.Barrand - private: - //int processor_error; // is set in case of error - int operation; // 0 (union), 1 (intersection), 2 (subtraction) - int ifaces1, ifaces2; // lists of faces - int iout1, iout2; // lists of faces with status "out" - int iunk1, iunk2; // lists of faces with status "unknown" - double rmin[3], rmax[3]; // intersection of bounding boxes - double del; // precision (tolerance) - - FaceList result_faces; // list of accepted faces - FaceList suitable_faces; // list of suitable faces - FaceList unsuitable_faces; // list of unsuitable faces - FaceList unknown_faces; // list of unknown faces - - std::vector external_contours; // heads of external contours - std::vector internal_contours; // heads of internal contours - - public: - private: - bool takePolyhedron(const polyhedron & p, double, double, double); - double findMinMax(); - void selectOutsideFaces(int & ifaces, int & iout); - int testFaceVsPlane(ExtEdge & edge); - void renumberNodes(int & i1, int & i2, int & i3, int & i4); - int testEdgeVsEdge(ExtEdge & edge1, ExtEdge & edge2); - void removeJunkNodes() { while(nodes.back().s != 0) nodes.pop_back(); } - void divideEdge(int & i1, int & i2); - void insertEdge(const ExtEdge & edge); - void caseII(ExtEdge & edge1, ExtEdge & edge2); - bool caseIE(ExtEdge & edge1, ExtEdge & edge2); - bool caseEE(ExtEdge & edge1, ExtEdge & edge2); - bool testFaceVsFace(int iface1, int iface2); - void invertNewEdges(int iface); - void checkDoubleEdges(int iface); - bool assembleFace(int what, int iface); - bool assembleNewFaces(int what, int ihead); - bool initiateLists(); - bool assemblePolyhedra(); - void findABC(double x1, double y1, double x2, double y2, - double &a, double &b, double &c) const; - int checkDirection(double *x, double *y) const; - int checkIntersection(int ix, int iy, int i1, int i2) const; - void mergeContours(int ix, int iy, int kext, int kint); - bool checkTriangle(int iedge1, int iedge2, int ix, int iy) const; - bool triangulateContour(int ix, int iy, int ihead); - bool modifyReference(int iface, int i1, int i2, int iref); - bool triangulateFace(int iface); - polyhedron createPolyhedron(); - - public: - //G.Barrand : BooleanProcessor() {} - BooleanProcessor() //G.Barrand - //:processor_error(0) //G.Barrand - :result_faces(faces) - ,suitable_faces(faces) - ,unsuitable_faces(faces) - ,unknown_faces(faces) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - - ~BooleanProcessor() { -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -private: - BooleanProcessor(const BooleanProcessor&) - //:processor_error(0) //G.Barrand - :result_faces(faces) - ,suitable_faces(faces) - ,unsuitable_faces(faces) - ,unknown_faces(faces) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - BooleanProcessor& operator=(const BooleanProcessor&){return *this;} -public: - polyhedron execute(int op, - const polyhedron &a, - const polyhedron &b, - int& err); - - //G.Barrand : begin : drawing disconnected. - //void draw(); - //void draw_edge(int, int); - //void draw_contour(int, int, int); - //void draw_faces(int, int, int); - //void print_face(int); - //void print_edge(int); - //G.Barrand : end - - //int get_processor_error() const {return processor_error;} - - void dump(std::ostream&); //G.Barrand - static int& get_shift(); //G.Barrand - static void set_shift(int); //G.Barrand - static void inc_shift(); //G.Barrand - static int get_num_shift(); //G.Barrand - -private: - bool inc_try_count(int,const polyhedron&,const polyhedron&,int&); //GB - - static HVPoint3D CRAZY_POINT(){return HVPoint3D(-10.e+6, -10.e+6, -10.e+6);} -#ifdef TOOLS_HEP_BP_OUT_ERR - static void PROCESSOR_ERROR(int a_what){ - std::cerr << "BooleanProcessor: boolean operation problem (" << a_what - << "). Try again with other shifts." - << std::endl; - } -#else - static void PROCESSOR_ERROR(int){} -#endif - - //G.Barrand : -#ifdef TOOLS_HEP_BP_CHECK_INDEX - bool check_face_index(const std::string& a_where,int a_index) { - if(a_index<0) { - std::cerr << "BooleanProcessor::check_face_index :" - << " " << a_where << " :" - << " i<0." - << std::endl; - return false; - } - if(a_index>=int(faces.size())) { - std::cerr << "BooleanProcessor::check_face_index :" - << " " << a_where << " :" - << " i>=sz." - << " i=" << a_index - << " sz=" << faces.size() - << " cap=" << faces.capacity() - << std::endl; - return false; - } - return true; - } - bool check_edge_index(const std::string& a_where,int a_index) { - if(a_index<0) { - std::cerr << "BooleanProcessor::check_edge_index :" - << " " << a_where << " :" - << " i<0." - << std::endl; - return false; - } - if(a_index>=int(edges.size())) { - std::cerr << "BooleanProcessor::check_edge_index :" - << " " << a_where << " :" - << " i>=sz." - << " i=" << a_index - << " sz=" << edges.size() - << " cap=" << edges.capacity() - << std::endl; - return false; - } - return true; - } -#endif - -}; - -inline bool ExtFace::invert() //G.Barrand : return bool. -/*********************************************************************** - * * - * Name: ExtFace::invert() Date: 28.02.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Invert face * - * * - ***********************************************************************/ -{ - int iEprev, iEcur, iEnext; - - iEprev = 0; iEcur = iold; - while (iEcur > 0) { -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_edge_index("ExtFace::invert(1)",iEcur)) return false; -#endif - ExtEdge& edge = edges[iEcur]; //G.Barrand : optimize. - edge.invert(); - iEnext = edge.inext; - edge.inext = iEprev; - iEprev = iEcur; - iEcur = iEnext; - } - if (iold > 0) iold = iEprev; - - iEprev = 0; iEcur = inew; - while (iEcur > 0) { -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_edge_index("ExtFace::invert(2)",iEcur)) return false; -#endif - ExtEdge& edge = edges[iEcur]; //G.Barrand : optimize. - edge.invert(); - iEnext = edge.inext; - edge.inext = iEprev; - iEprev = iEcur; - iEcur = iEnext; - } - if (inew > 0) inew = iEprev; - - //plane = HVPlane3D(-plane.a(), -plane.b(), -plane.c(), -plane.d()); - - HVNormal3D n = plane.normal(); - n *= -1; - plane.set(n, -plane.distance_from_origin()); - - return true; -} - -inline -bool BooleanProcessor::takePolyhedron(const polyhedron & p, - double dx, double dy, double dz) -/*********************************************************************** - * * - * Name: BooleanProcessor::takePolyhedron Date: 16.12.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Transfer Polyhedron to internal representation * - * * - ***********************************************************************/ -{ - int i, k, nnode, iNodes[5], iVis[4], iFaces[4]; - int dnode = int(nodes.size()) - 1; - int dface = int(faces.size()) - 1; - - // S E T N O D E S - - // for (i=1; i <= p.GetNoVertices(); i++) { - // nodes.push_back(ExtNode(p.GetVertex(i))); - // } - - HVPoint3D ppp; - for (i=1; i <= p.GetNoVertices(); i++) { -#ifndef TOOLS_HEP_BP_NOT_OPT //G.Barrand - nodes.push_back(ExtNode()); - ExtNode& node = nodes.back(); - node.v = p.GetVertexFast(i); - node.v.add(dx,dy,dz); -#else - ppp = p.GetVertexFast(i); - ppp += HVPoint3D(dx,dy,dz); - nodes.push_back(ExtNode(ppp)); -#endif - } - - // S E T F A C E S - - HVNormal3D plane_n; //G.Barrand - HVPoint3D plane_p; //G.Barrand - - for (int iface=1; iface <= p.GetNoFacets(); iface++) { - faces.push_back(ExtFace(edges,int(edges.size()))); - - // S E T F A C E N O D E S - - p.GetFacet(iface, nnode, iNodes, iVis, iFaces); - for (i=0; i p.GetNoVertices()) processor_error = 1; - //if (iFaces[i] < 1 || iFaces[i] > p.GetNoFacets()) processor_error = 1; - - if (iNodes[i] < 1 || iNodes[i] > p.GetNoVertices()) { //G.Barrand - //G.Barrand : processor_error = 1; -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::takePolyhedron : problem 1." - << " nnode " << nnode - << " p.GetNoVertices() " << p.GetNoVertices() - << " p.GetNoFacets() " << p.GetNoFacets() - << " iface " << iface - << " i " << i - << " iNodes[i] " << iNodes[i] - << std::endl; -#endif - return false; //G.Barrand - } - if (iFaces[i] < 1 || iFaces[i] > p.GetNoFacets()) { //G.Barrand - //G.Barrand : processor_error = 1; -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::takePolyhedron : problem 2." - << " p.GetNoVertices() " << p.GetNoVertices() - << " p.GetNoFacets() " << p.GetNoFacets() - << " iface " << iface - << " i " << i - << " iFaces[i] " << iFaces[i] - << std::endl; -#endif - return false; //G.Barrand - } - iNodes[i] += dnode; - iFaces[i] += dface; - } - - // S E T E D G E S - - iNodes[nnode] = iNodes[0]; - faces.back().iedges[3] = 0; - for (i=0; i node.v[k]) - face.rmin[k] = node.v[k]; - if (face.rmax[k] < node.v[k]) - face.rmax[k] = node.v[k]; - } - } - - // S E T F A C E P L A N E - - (nodes[iNodes[2]].v-nodes[iNodes[0]].v).cross(nodes[iNodes[3]].v-nodes[iNodes[1]].v,plane_n); - - plane_p.set_value(0,0,0); - for (i=0; i 0) { - ExtFace& face = faces[iface]; //G.Barrand - for (i=0; i<3; i++) { - if (rmin1[i] > face.rmin[i]) rmin1[i] = face.rmin[i]; - if (rmax1[i] < face.rmax[i]) rmax1[i] = face.rmax[i]; - } - iface = face.inext; - } - - iface = faces[ifaces2].inext; - while(iface > 0) { - ExtFace& face = faces[iface]; //G.Barrand - for (i=0; i<3; i++) { - if (rmin2[i] > face.rmin[i]) rmin2[i] = face.rmin[i]; - if (rmax2[i] < face.rmax[i]) rmax2[i] = face.rmax[i]; - } - iface = face.inext; - } - - // F I N D I N T E R S E C T I O N O F B O U N D I N G B O X E S - - for (i=0; i<3; i++) { - rmin[i] = (rmin1[i] > rmin2[i]) ? rmin1[i] : rmin2[i]; - rmax[i] = (rmax1[i] < rmax2[i]) ? rmax1[i] : rmax2[i]; - } - - // F I N D T O L E R A N C E - - double del1 = 0; - double del2 = 0; - for (i=0; i<3; i++) { - if ((rmax1[i]-rmin1[i]) > del1) del1 = rmax1[i]-rmin1[i]; - if ((rmax2[i]-rmin2[i]) > del2) del2 = rmax2[i]-rmin2[i]; - } - return ((del1 < del2) ? del1 : del2) / GRANULARITY; -} - -inline -void BooleanProcessor::selectOutsideFaces(int & ifaces, int & iout) -/*********************************************************************** - * * - * Name: BooleanProcessor::selectOutsideFaces Date: 10.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Preselection of outside faces * - * * - ***********************************************************************/ -{ - int i, outflag, iface = ifaces, *prev; - HVPoint3D mmbox[8] = { HVPoint3D(rmin[0],rmin[1],rmin[2]), - HVPoint3D(rmax[0],rmin[1],rmin[2]), - HVPoint3D(rmin[0],rmax[1],rmin[2]), - HVPoint3D(rmax[0],rmax[1],rmin[2]), - HVPoint3D(rmin[0],rmin[1],rmax[2]), - HVPoint3D(rmax[0],rmin[1],rmax[2]), - HVPoint3D(rmin[0],rmax[1],rmax[2]), - HVPoint3D(rmax[0],rmax[1],rmax[2]) }; - prev = &ifaces; - while (iface > 0) { - - // B O U N D I N G B O X vs B O U N D I N G B O X - - outflag = 0; - ExtFace& face = faces[iface]; //G.Barrand : optimize. - for (i=0; i<3; i++) { - if (face.rmin[i] > rmax[i] + del) { outflag = 1; break; } - if (face.rmax[i] < rmin[i] - del) { outflag = 1; break; } - } - - // B O U N D I N G B O X vs P L A N E - - if (outflag == 0) { - int npos = 0, nneg = 0; - double d; - for (i=0; i<8; i++) { - d = face.plane.distance(mmbox[i]); //G.Barrand : optimize - if (d > +del) npos++; - if (d < -del) nneg++; - } - if (npos == 8 || nneg == 8) outflag = 1; - } - - // U P D A T E L I S T S - - if (outflag == 1) { - *prev = face.inext; - face.inext = iout; - iout = iface; - }else{ - prev = &face.inext; - } - - iface = *prev; - } -} - -inline -int BooleanProcessor::testFaceVsPlane(ExtEdge & edge) -/*********************************************************************** - * * - * Name: BooleanProcessor::testFaceVsPlane Date: 19.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Find result of intersection of face by plane * - * * - ***********************************************************************/ -{ - int iface = edge.iface1; - const HVPlane3D& plane = faces[edge.iface2].plane; - int i, nnode, npos = 0, nneg = 0, nzer = 0; - double dd[5]; - - // F I N D D I S T A N C E S - - nnode = (faces[iface].iedges[3] == 0) ? 3 : 4; - for (i=0; i del) { - npos++; - }else if (dd[i] < -del) { - nneg++; - }else{ - nzer++; dd[i] = 0; - } - } - - // S O M E S I M P L E C A S E S ( N O I N T E R S E C T I O N ) - - if (npos == nnode || nneg == nnode) return OUT_OF_PLANE; - if (nzer == 1 && nneg == 0) return OUT_OF_PLANE; - if (nzer == 1 && npos == 0) return OUT_OF_PLANE; - if (nzer == nnode) return ON_PLANE; - if (nzer == 3) return NON_PLANAR_FACE; - - // F I N D I N T E R S E C T I O N - - int ie1 = 0, ie2 = 0, s1 = 0, s2 = 0, status, nint = 0; - enum { PLUS_MINUS, MINUS_PLUS, ZERO_ZERO, ZERO_PLUS, ZERO_MINUS }; - - dd[nnode] = dd[0]; - for (i=0; i 0) { - if (dd[i+1] >= 0) continue; - status = PLUS_MINUS; - }else if (dd[i] < 0) { - if (dd[i+1] <= 0) continue; - status = MINUS_PLUS; - }else{ - status = ZERO_ZERO; - if (dd[i+1] > 0) status = ZERO_PLUS; - if (dd[i+1] < 0) status = ZERO_MINUS; - } - switch (nint) { - case 0: - ie1 = i; s1 = status; nint++; break; - case 1: - ie2 = i; s2 = status; nint++; break; - default: - return NON_PLANAR_FACE; - } - } - if (nint != 2) return NON_PLANAR_FACE; - - // F O R M I N T E R S E C T I O N S E G M E N T - - if (s1 != ZERO_ZERO && s2 != ZERO_ZERO) { - if (s1 == s2) return NON_PLANAR_FACE; - int iedge, i1 = 0, i2 = 0, ii[2]; - double d1 = 0., d2 = 0., ddd ; - ii[0] = ie1; ii[1] = ie2; - for (i=0; i<2; i++) { - iedge = faces[iface].iedges[ii[i]]; - while (iedge > 0) { - i1 = edges[iedge].i1; - i2 = edges[iedge].i2; - - d1 = plane.distance(nodes[i1].v); - d2 = plane.distance(nodes[i2].v); - if (d1 > del) { - if (d2 < -del) { ii[i] = int(nodes.size()); break; } // +- - }else if (d1 < -del) { - if (d2 > del) { ii[i] = int(nodes.size()); break; } // -+ - }else{ - ii[i] = i1; break; // 0+ or 0- - } - iedge = edges[iedge].inext; - } - if (ii[i] == (int)nodes.size()) { - ddd = d2-d1; d1 = d1/ddd; d2 = d2/ddd; - nodes.push_back(ExtNode(d2*nodes[i1].v-d1*nodes[i2].v, iedge)); - } - } - edge.inext = 0; - if (s1 == MINUS_PLUS || s1 == ZERO_PLUS) { - edge.i1 = ii[1]; - edge.i2 = ii[0]; - }else{ - edge.i1 = ii[0]; - edge.i2 = ii[1]; - } - return INTERSECTION; - }else{ - if (npos == nneg) return NON_PLANAR_FACE; - edge.inext = (s1 == ZERO_ZERO) ? ie1+1 : ie2+1; - if (s1 == ZERO_PLUS || s2 == ZERO_MINUS) { - edge.i1 = edges[faces[iface].iedges[ie2]].i1; - edge.i2 = edges[faces[iface].iedges[ie1]].i1; - }else{ - edge.i1 = edges[faces[iface].iedges[ie1]].i1; - edge.i2 = edges[faces[iface].iedges[ie2]].i1; - } - return EDGE; - } -} - -inline -void BooleanProcessor::renumberNodes(int & i1, int & i2, int & i3, int & i4) -/*********************************************************************** - * * - * Name: BooleanProcessor::renumberNodes Date: 19.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Renumber nodes and remove last temporary node. * - * Remark: In principal this routine can be replaced just * - * with i1 = i2; * - * Removal of temporary nodes provides additional control * - * on number of nodes, that is very useful for debugging. * - * * - ***********************************************************************/ -{ - if (i1 == i2) return; - if (nodes[i1].s == 0 || nodes.back().s == 0) { i1 = i2; return; } - - int ilast = int(nodes.size())-1; - if (i1 == ilast) { i1 = i2; nodes.pop_back(); return; } - if (i2 == ilast) { i2 = i1; } - if (i3 == ilast) { i3 = i1; } - if (i4 == ilast) { i4 = i1; } - nodes[i1] = nodes.back(); i1 = i2; nodes.pop_back(); -} - -inline -int BooleanProcessor::testEdgeVsEdge(ExtEdge & edge1, ExtEdge & edge2) -/*********************************************************************** - * * - * Name: BooleanProcessor::testEdgeVsEdge Date: 19.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Find common part of two edges * - * * - ***********************************************************************/ -{ - int i, ii = 0; - double d, dd = 0.; - - for (i=0; i<3; i++) { - d = nodes[edge1.i1].v[i]-nodes[edge1.i2].v[i]; - if (d < 0.) d = -d; - if (d > dd) { dd = d; ii = i; } - } - double t1 = nodes[edge1.i1].v[ii]; - double t2 = nodes[edge1.i2].v[ii]; - double t3 = nodes[edge2.i1].v[ii]; - double t4 = nodes[edge2.i2].v[ii]; - if (t2-t1 < 0.) { t1 = -t1; t2 = -t2; t3 = -t3; t4 = -t4; } - - if (t3 <= t1+del || t4 >= t2-del) return 0; - if (t3 > t2+del) { - renumberNodes(edge2.i1, edge1.i2, edge1.i1, edge2.i2); - }else if (t3 < t2-del) { - renumberNodes(edge1.i2, edge2.i1, edge1.i1, edge2.i2); - } - if (t4 < t1-del) { - renumberNodes(edge2.i2, edge1.i1, edge1.i2, edge2.i1); - }else if (t4 > t1+del) { - renumberNodes(edge1.i1, edge2.i2, edge1.i2, edge2.i1); - } - return 1; -} - -inline -void BooleanProcessor::divideEdge(int & i1, int & i2) -/*********************************************************************** - * * - * Name: BooleanProcessor::divideEdge Date: 24.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Unify the nodes and divide edge on two parts by the node. * - * * - ***********************************************************************/ -{ - int iedges[2]; - iedges[0] = nodes[i1].s; - iedges[1] = nodes[i2].s; - - // U N I F Y N O D E S - - if (i1 < i2) { i2 = i1; } - else if (i1 > i2) { i1 = i2; } - else { iedges[1] = 0; } - if (iedges[0] == iedges[1]) return; - - int ie1, ie2, inode = i1; - nodes[inode].s = 0; - for (int i=0; i<2; i++) { - - // F I N D C O R R E S P O N D I N G E D G E - - if ((ie1 = iedges[i]) == 0) continue; - ie2 = faces[edges[ie1].iface2].iedges[0]; - while (ie2 > 0) { - if (edges[ie2].i1 == edges[ie1].i2 && - edges[ie2].i2 == edges[ie1].i1) break; - ie2 = edges[ie2].inext; - } - - // D I V I D E E D G E S - - edges.push_back(edges[ie1]); - edges[ie1].inext = int(edges.size()) - 1; - edges[ie1].i2 = inode; - edges.back().i1 = inode; - - edges.push_back(edges[ie2]); - edges[ie2].inext = int(edges.size()) - 1; - edges[ie2].i2 = inode; - edges.back().i1 = inode; - } -} - -inline -void BooleanProcessor::insertEdge(const ExtEdge & edge) -/*********************************************************************** - * * - * Name: BooleanProcessor::insertEdge Date: 24.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Insert edge to the list of new edges * - * * - ***********************************************************************/ -{ - int iface = edge.iface1; - edges.push_back(edge); - edges.back().inext = faces[iface].inew; - faces[iface].inew = int(edges.size()) - 1; -} - -inline -void BooleanProcessor::caseII(ExtEdge & edge1, ExtEdge & edge2) -/*********************************************************************** - * * - * Name: BooleanProcessor::caseII Date: 19.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Intersection/Intersection case * - * * - ***********************************************************************/ -{ - divideEdge(edge1.i1, edge2.i2); - divideEdge(edge1.i2, edge2.i1); - edge1.ivis = 1; - edge2.ivis = 1; - insertEdge(edge1); - insertEdge(edge2); -} - -inline -bool BooleanProcessor::caseIE(ExtEdge &, ExtEdge &) -/*********************************************************************** - * * - * Name: BooleanProcessor::caseIE Date: 19.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Intersection/Edge-touch case * - * * - ***********************************************************************/ -{ - //G.Barrand : processor_error = 1; -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::caseIE : unimplemented case" - << std::endl; -#endif - return false; //G.Barrand -} - -inline -bool BooleanProcessor::caseEE(ExtEdge &, ExtEdge &) -/*********************************************************************** - * * - * Name: BooleanProcessor::caseEE Date: 19.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Edge-touch/Edge-touch case * - * * - ***********************************************************************/ -{ - //G.Barrand : processor_error = 1; -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::caseEE : unimplemented case" - << std::endl; -#endif - return false; -} - -inline -bool BooleanProcessor::testFaceVsFace(int iface1, int iface2) -/*********************************************************************** - * * - * Name: BooleanProcessor::testFaceVsFace Date: 11.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Find result (an edge) of intersection of two faces * - * * - ***********************************************************************/ -{ - ExtEdge edge1, edge2; - int irep1, irep2; - - // M I N - M A X - - {const ExtFace& face_1 = faces[iface1]; //G.Barrand : optimize - const ExtFace& face_2 = faces[iface2]; - for (int i=0; i<3; i++) { - if (face_1.rmin[i] > face_2.rmax[i] + del) return true; //GB : true ? - if (face_1.rmax[i] < face_2.rmin[i] - del) return true; //GB : true ? - }} - - // F A C E - 1 vs P L A N E - 2 - - edge1.iface1 = iface1; - edge1.iface2 = iface2; - irep1 = testFaceVsPlane(edge1); - if (irep1 == OUT_OF_PLANE || irep1 == ON_PLANE) { - removeJunkNodes(); - return true; //GB : true ? - } - - // F A C E - 2 vs P L A N E - 1 - - edge2.iface1 = iface2; - edge2.iface2 = iface1; - irep2 = testFaceVsPlane(edge2); - if (irep2 == OUT_OF_PLANE || irep2 == ON_PLANE) { - removeJunkNodes(); - return true; //GB : true ? - } - - // C H E C K F O R N O N P L A N A R F A C E - - if (irep1 == NON_PLANAR_FACE || irep2 == NON_PLANAR_FACE) { - removeJunkNodes(); - return true; //GB : true ? - } - - // F I N D I N T E R S E C T I O N P A R T - - if (testEdgeVsEdge(edge1, edge2) == 0) { - return true; //GB : true ? - } - - // C O N S I D E R D I F F E R E N T C A S E S - - if (irep1 == INTERSECTION && irep2 == INTERSECTION) caseII(edge1, edge2); - if (irep1 == INTERSECTION && irep2 == EDGE) { - if(!caseIE(edge1, edge2)) { - //G.Barrand : processor_error = 1; - removeJunkNodes(); //G.Barrand - return false; //G.Barrand - } - } - if (irep1 == EDGE && irep2 == INTERSECTION) { - if(!caseIE(edge2, edge1)) { - //G.Barrand : processor_error = 1; - removeJunkNodes(); //G.Barrand - return false; //G.Barrand - } - } - if (irep1 == EDGE && irep2 == EDGE) { - if(!caseEE(edge1, edge2)) { - //G.Barrand : processor_error = 1; - removeJunkNodes(); //G.Barrand - return false; //G.Barrand - } - } - removeJunkNodes(); - - return true; //G.Barrand -} - -inline -void BooleanProcessor::invertNewEdges(int iface) -/*********************************************************************** - * * - * Name: BooleanProcessor::invertNewEdges Date: 04.02.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Invert direction of new edges * - * * - ***********************************************************************/ -{ - int iedge = faces[iface].inew; - while (iedge > 0) { - edges[iedge].invert(); - iedge = edges[iedge].inext; - } -} - -inline -void BooleanProcessor::checkDoubleEdges(int) -/*********************************************************************** - * * - * Name: BooleanProcessor::checkDoubleEdges Date: 04.02.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Eliminate duplication of edges * - * * - ***********************************************************************/ -{ - -} - -inline -bool BooleanProcessor::assembleFace(int what, int iface) -/*********************************************************************** - * * - * Name: BooleanProcessor::assembleFace Date: 19.02.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Assemble face * - * * - ***********************************************************************/ -{ - // A S S E M B L E N E W F A C E - - int ihead; // head of the list of edges for new face - int icur; // current edge in the list - last edge inserted to the list - int *ilink; // pointer to the current link - int ifirst; // first node of a contour - int *i; // pointer to the index of the current edge in a loop - int ioldflag=0; // is set if an edge from iold has been taken - - ExtFace& face = faces[iface]; //G.Barrand : optimize. - ilink = &ihead; - for(;;) { - if (face.inew == 0) break; - - // S T A R T N E W C O N T O U R - - icur = face.inew; - face.inew = edges[icur].inext; - - //INSERT_EDGE_TO_THE_LIST(icur); //G.Barrand - *ilink = icur; ilink = &edges[icur].inext; *ilink = 0; //G.Barrand - - ifirst = edges[icur].i1; - - // C O N S T R U C T T H E C O N T O U R - - for (;;) { - i = &face.inew; - ExtEdge& edge_cur = edges[icur]; - while(*i > 0) { - ExtEdge& edge_i = edges[*i]; - if (edge_i.i1 == edge_cur.i2) break; - i = &edge_i.inext; - } - if (*i == 0) { - i = &face.iold; - while(*i > 0) { - ExtEdge& edge_i = edges[*i]; - if (edge_i.i1 == edge_cur.i2) { - ioldflag = 1; - break; - } - i = &edge_i.inext; - } - } - if (*i > 0) { - icur = *i; - *i = edges[icur].inext; - - //INSERT_EDGE_TO_THE_LIST(icur); - *ilink = icur; ilink = &edges[icur].inext; *ilink = 0; //G.Barrand - - if (edges[icur].i2 == ifirst) { break; } else { continue; } - }else{ - //G.Barrand : processor_error = 1; -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::assembleFace(" << iface << ") : " - << "could not find next edge of the contour" - << std::endl; -#endif - face.inew = DEFECTIVE_FACE; - return false; //G.Barrand : false - } - } - } - - // C H E C K O R I G I N A L C O N T O U R - - int iedge; - iedge = face.iold; - if (what == 0 && ioldflag == 0 && iedge > 0) { - for (;;) { - if (edges[iedge].inext > 0) { - if (edges[iedge].i2 == edges[edges[iedge].inext].i1) { - iedge = edges[iedge].inext; - }else{ - break; - } - }else{ - if (edges[iedge].i2 == edges[face.iold].i1) { - edges[iedge].inext = ihead; // set new face - return true; //G.Barrand : true. - }else{ - break; - } - } - } - } - - // M A R K U N S U I T A B L E N E I G H B O U R I N G F A C E S - - int iface2; - iedge = face.iold; - while(iedge > 0) { - iface2 = edges[iedge].iface2; - if (faces[iface2].inew == 0) faces[iface2].inew = UNSUITABLE_FACE; - iedge = edges[iedge].inext; - } - face.iold = ihead; // set new face - - return true; -} - -inline -bool BooleanProcessor::assembleNewFaces(int what, int ihead) -/*********************************************************************** - * * - * Name: BooleanProcessor::assembleNewFaces Date: 30.01.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Assemble internal or external parts of faces * - * * - ***********************************************************************/ -{ - int iface = ihead; - while(iface > 0) { - if (faces[iface].inew > 0) { - if (what != 0) invertNewEdges(iface); - checkDoubleEdges(iface); - if(!assembleFace(what, iface)) return false; //G.Barrand : test. - faces[iface].inew = - (faces[iface].iold == 0) ? UNSUITABLE_FACE : NEW_FACE; - } - iface = faces[iface].inext; - } - return true; //G.Barrand -} - -inline -bool BooleanProcessor::initiateLists() //G.Barrand : return bool. -/*********************************************************************** - * * - * Name: BooleanProcessor::initiateLists Date: 28.02.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Initiate lists of faces. * - * * - ***********************************************************************/ -{ - int i, iface; - - // R E S E T L I S T S O F F A C E S - - result_faces.clean(); - suitable_faces.clean(); - unsuitable_faces.clean(); - unknown_faces.clean(); - - // I N I T I A T E T H E L I S T S - - iface = iout1; - while (iface > 0) { - i = iface; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("initiateLists(1)",i)) return false; -#endif - iface = faces[i].inext; - if (operation == OP_INTERSECTION) { - unsuitable_faces.push_back(i); - faces[i].inew = UNSUITABLE_FACE; - }else{ - suitable_faces.push_back(i); - faces[i].inew = ORIGINAL_FACE; - } - } - - iface = iout2; - while (iface > 0) { - i = iface; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("initiateLists(2)",i)) return false; -#endif - iface = faces[i].inext; - if (operation == OP_UNION) { - suitable_faces.push_back(i); - faces[i].inew = ORIGINAL_FACE; - }else{ - unsuitable_faces.push_back(i); - faces[i].inew = UNSUITABLE_FACE; - } - } - - iface = iunk1; - while (iface > 0) { - i = iface; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("initiateLists(3)",i)) return false; -#endif - iface = faces[i].inext; - unknown_faces.push_back(i); - } - iface = iunk2; - while (iface > 0) { - i = iface; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("initiateLists(4)",i)) return false; -#endif - iface = faces[i].inext; - if (operation == OP_SUBTRACTION) { - if(!faces[i].invert()) return false; //G.Barrand - } - unknown_faces.push_back(i); - } - - iface = ifaces1; - while (iface > 0) { - i = iface; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("initiateLists(5)",i)) return false; -#endif - iface = faces[i].inext; - switch(faces[i].inew) { - case UNKNOWN_FACE: - unknown_faces.push_back(i); - break; - case ORIGINAL_FACE: case NEW_FACE: - suitable_faces.push_back(i); - break; - case UNSUITABLE_FACE: - unsuitable_faces.push_back(i); - break; - default: - faces[i].iprev = 0; - faces[i].inext = 0; - break; - } - } - - iface = ifaces2; - while (iface > 0) { - i = iface; - iface = faces[i].inext; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("initiateLists(6)",i)) return false; -#endif - - if (operation == OP_SUBTRACTION) { - if(!faces[i].invert()) return false; - } - - switch(faces[i].inew) { - case UNKNOWN_FACE: - unknown_faces.push_back(i); - break; - case ORIGINAL_FACE: case NEW_FACE: - suitable_faces.push_back(i); - break; - case UNSUITABLE_FACE: - unsuitable_faces.push_back(i); - break; - default: - faces[i].iprev = 0; - faces[i].inext = 0; - break; - } - } - ifaces1 = ifaces2 = iout1 = iout2 = iunk1 = iunk2 = 0; - return true; //G.Barrand. -} - -inline -bool BooleanProcessor::assemblePolyhedra() //G.Barrand : return bool. -/*********************************************************************** - * * - * Name: BooleanProcessor::assemblePolyhedra() Date: 10.12.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Collect suitable faces and remove unsuitable ones. * - * * - ***********************************************************************/ -{ - int i, iedge, iface; - - // L O O P A L O N G S U I T A B L E F A C E S - - iface = suitable_faces.front(); - while(iface > 0) { - i = iface; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("assemblePolyhedra(1)",i)) return false; -#endif - iedge = faces[i].iold; - while(iedge > 0) { -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_edge_index("assemblePolyhedra(2)",iedge)) return false; -#endif - iface = edges[iedge].iface2; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("assemblePolyhedra(3)",iface)) return false; -#endif - if (faces[iface].inew == UNKNOWN_FACE) { - unknown_faces.remove(iface); - suitable_faces.push_back(iface); - faces[iface].inew = ORIGINAL_FACE; - } - iedge = edges[iedge].inext; - } -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("assemblePolyhedra(4)",i)) return false; -#endif - iface = faces[i].inext; - suitable_faces.remove(i); - result_faces.push_back(i); - } - if (unknown_faces.front() == 0) return true; - - // L O O P A L O N G U N S U I T A B L E F A C E S - - iface = unsuitable_faces.front(); - while(iface > 0) { - i = iface; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("assemblePolyhedra(5)",i)) return false; -#endif - iedge = faces[i].iold; - while(iedge > 0) { -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_edge_index("assemblePolyhedra(6)",iedge)) return false; -#endif - iface = edges[iedge].iface2; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("assemblePolyhedra(7)",iface)) return false; -#endif - if (faces[iface].inew == UNKNOWN_FACE) { - unknown_faces.remove(iface); - unsuitable_faces.push_back(iface); - faces[iface].inew = UNSUITABLE_FACE; - } - iedge = edges[iedge].inext; - } -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("assemblePolyhedra(8)",i)) return false; -#endif - iface = faces[i].inext; - unsuitable_faces.remove(i); - } - - //G.Barrand : begin - /* From S.Ponce - At last, there is a problem in the assemblePolyhedra method. At least, I - think it is there. The problem deals with boolean operations on solids, - when one of the two contains entirely the other one. It has no sense for - intersection and union but still has sense for subtraction. In this - case, faces from the inner solid are stored in the unknown_faces - FaceList. And an error occurs in the execute method. This may be correct - for intersection and union but in the case of subtraction, one should do - that in assemblePolyhedra : - */ - // Unknown faces are actually suitable face !!! - iface = unknown_faces.front(); - while(iface > 0) { - i = iface; -#ifdef TOOLS_HEP_BP_CHECK_INDEX - if(!check_face_index("assemblePolyhedra(9)",i)) return false; -#endif - faces[i].inew = ORIGINAL_FACE; - iface = faces[i].inext; - unknown_faces.remove(i); - result_faces.push_back(i); - } - /* - Otherwise, the inner hole that the second solid was building in the - first one does not exist. I'm not very clear on what to do for unions - and intersections. I think this kind of situation should be detected and - one of the solid should simply be ignored. - */ - //G.Barrand : end - - return true; -} - -inline void -BooleanProcessor::findABC(double x1, double y1, double x2, double y2, - double &a, double &b, double &c) const -/*********************************************************************** - * * - * Name: BooleanProcessor::findABC Date: 07.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Find line equation Ax+By+C=0 * - * * - ***********************************************************************/ -{ - double w; - a = y1 - y2; - b = x2 - x1; - //G.Barrand : w = std::abs(a)+std::abs(b); - w = ::fabs(a)+::fabs(b); //G.Barrand - a /= w; - b /= w; - c = -(a*x2 + b*y2); -} - -inline -int BooleanProcessor::checkDirection(double *x, double *y) const -/*********************************************************************** - * * - * Name: BooleanProcessor::checkDirection Date: 06.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Check direction of line 1-4 * - * * - ***********************************************************************/ -{ - double a1, b1, c1, a2, b2, c2, d1, d2; - - // T E S T L I N E 1 - 4 V S E X T E R N A L C O N T O U R - - findABC(x[0], y[0], x[1], y[1], a1, b1, c1); - findABC(x[1], y[1], x[2], y[2], a2, b2, c2); - d1 = a1*x[4] + b1*y[4] + c1; - d2 = a2*x[4] + b2*y[4] + c2; - if (d1 <= del && d2 <= del) return 1; - if (! (d1 > del && d2 > del)) { - if ( a1*x[2] + b1*y[2] + c1 >= -del) return 1; - } - - // T E S T L I N E 1 - 4 V S I N T E R N A L C O N T O U R - - findABC(x[3], y[3], x[4], y[4], a1, b1, c1); - findABC(x[4], y[4], x[5], y[5], a2, b2, c2); - d1 = a1*x[1] + b1*y[1] + c1; - d2 = a2*x[1] + b2*y[1] + c2; - if (d1 <= del && d2 <= del) return 1; - if (!(d1 > del && d2 > del)) { - if ( a1*x[5] + b1*y[5] + c1 >= -del) return 1; - } - return 0; -} - -inline -int BooleanProcessor::checkIntersection(int ix, int iy, int i1, int i2) const -/*********************************************************************** - * * - * Name: BooleanProcessor::checkDirection Date: 06.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Check line i1-i2 on intersection with contours * - * * - ***********************************************************************/ -{ - // F I N D L I N E E Q U A T I O N - - double x1, y1, x2, y2, a1, b1, c1; - x1 = nodes[i1].v[ix]; - y1 = nodes[i1].v[iy]; - x2 = nodes[i2].v[ix]; - y2 = nodes[i2].v[iy]; - findABC(x1, y1, x2, y2, a1, b1, c1); - - // L O O P A L O N G E X T E R N A L C O N T O U R S - - int icontour, iedge, k1, k2; - double x3, y3, x4, y4, a2, b2, c2, d1, d2; - for(icontour=0; icontour<(int)external_contours.size(); icontour++) { - iedge = external_contours[icontour]; - while(iedge > 0) { - k1 = edges[iedge].i1; - k2 = edges[iedge].i2; - iedge = edges[iedge].inext; - if (k1 == i1 || k2 == i1) continue; - if (k1 == i2 || k2 == i2) continue; - x3 = nodes[k1].v[ix]; - y3 = nodes[k1].v[iy]; - x4 = nodes[k2].v[ix]; - y4 = nodes[k2].v[iy]; - d1 = a1*x3 + b1*y3 + c1; - d2 = a1*x4 + b1*y4 + c1; - if (d1 > del && d2 > del) continue; - if (d1 < -del && d2 < -del) continue; - - findABC(x3, y3, x4, y4, a2, b2, c2); - d1 = a2*x1 + b2*y1 + c2; - d2 = a2*x2 + b2*y2 + c2; - if (d1 > del && d2 > del) continue; - if (d1 < -del && d2 < -del) continue; - return 1; - } - } - - // L O O P A L O N G E X T E R N A L C O N T O U R S - - for(icontour=0; icontour<(int)internal_contours.size(); icontour++) { - iedge = internal_contours[icontour]; - while(iedge > 0) { - k1 = edges[iedge].i1; - k2 = edges[iedge].i2; - iedge = edges[iedge].inext; - if (k1 == i1 || k2 == i1) continue; - if (k1 == i2 || k2 == i2) continue; - x3 = nodes[k1].v[ix]; - y3 = nodes[k1].v[iy]; - x4 = nodes[k2].v[ix]; - y4 = nodes[k2].v[iy]; - d1 = a1*x3 + b1*y3 + c1; - d2 = a1*x4 + b1*y4 + c1; - if (d1 > del && d2 > del) continue; - if (d1 < -del && d2 < -del) continue; - - findABC(x3, y3, x4, y4, a2, b2, c2); - d1 = a2*x1 + b2*y1 + c2; - d2 = a2*x2 + b2*y2 + c2; - if (d1 > del && d2 > del) continue; - if (d1 < -del && d2 < -del) continue; - return 1; - } - } - return 0; -} - -inline -void BooleanProcessor::mergeContours(int ix, int iy, int kext, int kint) -/*********************************************************************** - * * - * Name: BooleanProcessor::mergeContours Date: 06.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Attemp to merge internal contour with external one * - * * - ***********************************************************************/ -{ - int i1ext, i2ext, i1int, i2int, i, k[6]; - double x[6], y[6]; - - // L O O P A L O N G E X T E R N A L C O N T O U R - - i1ext = external_contours[kext]; - while (i1ext > 0) { - i2ext = edges[i1ext].inext; - if (i2ext == 0) i2ext = external_contours[kext]; - k[0] = edges[i1ext].i1; - k[1] = edges[i1ext].i2; - k[2] = edges[i2ext].i2; - for (i=0; i<3; i++) { - x[i] = nodes[k[i]].v[ix]; - y[i] = nodes[k[i]].v[iy]; - } - - // L O O P A L O N G I N T E R N A L C O N T O U R - - i1int = internal_contours[kint]; - while (i1int > 0) { - i2int = edges[i1int].inext; - if (i2int == 0) i2int = internal_contours[kint]; - k[3] = edges[i1int].i1; - k[4] = edges[i1int].i2; - k[5] = edges[i2int].i2; - for (i=3; i<6; i++) { - x[i] = nodes[k[i]].v[ix]; - y[i] = nodes[k[i]].v[iy]; - } - - // T E S T L I N E K1 - K4 - // I F O K T H E N M E R G E C O N T O U R S - - if (checkDirection(x, y) == 0) { - if (checkIntersection(ix, iy, k[1], k[4]) == 0) { - i = i1int; - for(;;) { - if (edges[i].inext == 0) { - edges[i].inext = internal_contours[kint]; - internal_contours[kint] = 0; - break; - }else{ - i = edges[i].inext; - } - } - i = edges[i1int].iface1; - edges.push_back(ExtEdge(k[1], k[4], i, -1*(int(edges.size())+1), -1)); - edges.back().inext = i2int; - edges.push_back(ExtEdge(k[4], k[1], i, -1*(int(edges.size())-1), -1)); - edges.back().inext = edges[i1ext].inext; - edges[i1ext].inext = int(edges.size())-2; - edges[i1int].inext = int(edges.size())-1; - return; - } - } - i1int = edges[i1int].inext; - } - i1ext = edges[i1ext].inext; - } -} - -inline bool -BooleanProcessor::checkTriangle(int iedge1, int iedge2, int ix, int iy) const -/*********************************************************************** - * * - * Name: BooleanProcessor::checkTriangle Date: 08.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Check triangle for correctness * - * * - ***********************************************************************/ -{ - int k[3]; - double x[3], y[3]; - double a1, b1, c1; - - k[0] = edges[iedge1].i1; - k[1] = edges[iedge1].i2; - k[2] = edges[iedge2].i2; - for (int i=0; i<3; i++) { - x[i] = nodes[k[i]].v[ix]; - y[i] = nodes[k[i]].v[iy]; - } - - // C H E C K P R I N C I P A L C O R R E C T N E S S - - findABC(x[2], y[2], x[0], y[0], a1, b1, c1); - if (a1*x[1]+b1*y[1]+c1 <= 0.1*del) return true; - - // C H E C K T H A T T H E R E I S N O P O I N T S I N S I D E - - int inode, iedge; - double a2, b2, c2, a3, b3, c3; - - findABC(x[0], y[0], x[1], y[1], a2, b2, c2); - findABC(x[1], y[1], x[2], y[2], a3, b3, c3); - iedge = iedge2; - for (;;) { - iedge = edges[iedge].inext; - if (edges[iedge].inext == iedge1) return false; - inode = edges[iedge].i2; - if (inode == k[0]) continue; - if (inode == k[1]) continue; - if (inode == k[2]) continue; - x[1] = nodes[inode].v[ix]; - y[1] = nodes[inode].v[iy]; - if (a1*x[1]+b1*y[1]+c1 < -0.1*del) continue; - if (a2*x[1]+b2*y[1]+c2 < -0.1*del) continue; - if (a3*x[1]+b3*y[1]+c3 < -0.1*del) continue; - return true; - } -} - -inline -bool BooleanProcessor::triangulateContour(int ix, int iy, int ihead) -/*********************************************************************** - * * - * Name: BooleanProcessor::triangulateContour Date: 06.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Triangulate external contour * - * * - ***********************************************************************/ -{ - - //int draw_flag = 0; - //if (draw_flag) draw_contour(5, 3, ihead); - - // C L O S E C O N T O U R - - int ipnext = ihead, nnode = 1; - for (;;) { - if (edges[ipnext].inext > 0) { - ipnext = edges[ipnext].inext; - nnode++; - }else{ - edges[ipnext].inext = ihead; - break; - } - } - - // L O O P A L O N G C O N T O U R - - //std::cerr << "debug : contour : begin : =================" << std::endl; - //dump();//debug - - int iedge1, iedge2, iedge3, istart = 0; - for (;;) { - iedge1 = edges[ipnext].inext; - iedge2 = edges[iedge1].inext; - - //std::cerr << "debug :" - // << " ipnext " << ipnext - // << " iedge1 " << iedge1 - // << " iedge2 " << iedge2 - // << " : istart " << istart - // << " , nnode " << nnode - // << std::endl; - - if (istart == 0) { - istart = iedge1; - if (nnode <= 3) { - iedge3 = edges[iedge2].inext; - edges[iedge1].iface1 = int(faces.size()); - edges[iedge2].iface1 = int(faces.size()); - edges[iedge3].iface1 = int(faces.size()); - edges[iedge3].inext = 0; - faces.push_back(ExtFace(edges,0)); //G.Barrand : ok ? - faces.back().iold = iedge1; - faces.back().inew = ORIGINAL_FACE; - - //if (draw_flag) draw_contour(4, 2, iedge1); - - break; - } - }else if (istart == iedge1) { - //G.Barrand processor_error = 1; //use returned status. -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::triangulateContour : " - << "could not generate a triangle (infinite loop)" - << std::endl; -#endif - return false; //G.Barrand - } - - // C H E C K C O R E C T N E S S O F T H E T R I A N G L E - - if(checkTriangle(iedge1,iedge2,ix,iy)) { - ipnext = edges[ipnext].inext; - continue; - } - - // M O D I F Y C O N T O U R - - int i1 = edges[iedge1].i1; - int i3 = edges[iedge2].i2; - int iface1 = edges[iedge1].iface1; - int iface2 = int(faces.size()); - - edges[ipnext].inext = int(edges.size()); - edges.push_back(ExtEdge(i1, i3, iface1, -1*(int(edges.size())+1), -1)); - edges.back().inext = edges[iedge2].inext; - - // A D D N E W T R I A N G L E T O T H E L I S T - - edges[iedge2].inext = int(edges.size()); - edges.push_back(ExtEdge(i3, i1, iface2, -1*(int(edges.size())-1), -1)); - faces.push_back(ExtFace(edges,0)); //G.Barrand : ok ? - faces.back().iold = iedge1; - faces.back().inew = ORIGINAL_FACE; - edges[iedge1].iface1 = iface2; - edges[iedge2].iface1 = iface2; - ipnext = edges[ipnext].inext; - istart = 0; - nnode--; - - //if (draw_flag) draw_contour(4, 2, iedge1); - - } - - return true; -} - -inline -bool BooleanProcessor::modifyReference(int iface, int i1, int i2, int iref) -/*********************************************************************** - * * - * Name: BooleanProcessor::modifyReference Date: 13.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Modify reference to the neighbouring face * - * * - ***********************************************************************/ -{ - int iedge = faces[iface].iold; - while (iedge > 0) { - if (edges[iedge].i1 == i2 && edges[iedge].i2 == i1) { - edges[iedge].iface2 = iref; - return true; - } - iedge = edges[iedge].inext; - } - //G.Barrand : processor_error = 1; -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::modifyReference : could not find the edge, " - << "iface=" << iface << ", i1,i2=" << i1 << "," << i2 << ", iref=" << iref - << std::endl; -#endif - return false; //G.Barrand -} - -inline -bool BooleanProcessor::triangulateFace(int iface) -/*********************************************************************** - * * - * Name: BooleanProcessor::triangulateFace Date: 02.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Triangulation of an extended face * - * * - ***********************************************************************/ -{ - - // F I N D M A X C O M P O N E N T O F T H E N O R M A L - // S E T IX, IY, IZ - - //HVNormal3D normal = faces[iface].plane.normal(); - const HVNormal3D& normal = faces[iface].plane.normal(); - - int ix, iy, iz = 0; - //G.Barrand : if (std::abs(normal[1]) > std::abs(normal[iz])) iz = 1; - //G.Barrand : if (std::abs(normal[2]) > std::abs(normal[iz])) iz = 2; - if (::fabs(normal[1]) > ::fabs(normal[iz])) iz = 1; //G.Barrand - if (::fabs(normal[2]) > ::fabs(normal[iz])) iz = 2; //G.Barrand - if (normal[iz] > 0) { - ix = (iz+1)%3; iy = (ix+1)%3; - }else{ - iy = (iz+1)%3; ix = (iy+1)%3; - } - - // F I L L L I S T S O F C O N T O U R S - - external_contours.clear(); - internal_contours.clear(); - double z; - int i1, i2, ifirst, iedge, icontour = faces[iface].iold; - while (icontour > 0) { - iedge = icontour; - ifirst = edges[iedge].i1; - z = 0.0; - for(;;) { - if (iedge > 0) { - i1 = edges[iedge].i1; - i2 = edges[iedge].i2; - ExtNode& node_1 = nodes[i1]; - ExtNode& node_2 = nodes[i2]; - z += node_1.v[ix]*node_2.v[iy]-node_2.v[ix]*node_1.v[iy]; - if (ifirst != i2) { - iedge = edges[iedge].inext; - continue; - }else{ - if (z > del*del) { - external_contours.push_back(icontour); - }else if (z < -del*del) { - internal_contours.push_back(icontour); - }else{ - //G.Barrand : processor_error = 1; //use returned value. -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::triangulateFace : too small contour" - << " z " << z - << " del*del " << del*del - << std::endl; -#endif - return false; //G.Barrand. - } - icontour = edges[iedge].inext; - edges[iedge].inext = 0; - break; - } - }else{ - //G.Barrand : processor_error = 1; //use returned value. -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::triangulateFace : broken contour" - << std::endl; -#endif - icontour = 0; - //G.Barrand : break; - return false; - } - } - } - - // G E T R I D O F I N T E R N A L C O N T O U R S - - int kint, kext; - for (kint=0; kint < (int)internal_contours.size(); kint++) { - for (kext=0; kext < (int)external_contours.size(); kext++) { - mergeContours(ix, iy, kext, kint); - if (internal_contours[kint] == 0) break; - } - if (kext == (int)external_contours.size()) { - //G.Barrand : processor_error = 1; //use returned value. -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::triangulateFace : " - << "could not merge internal contour " << kint - << std::endl; -#endif - return false; //G.Barrand - } - } - - // T R I A N G U L A T E C O N T O U R S - - int nface = int(faces.size()); - for (kext=0; kext < (int)external_contours.size(); kext++) { - if(!triangulateContour(ix, iy, external_contours[kext])) { - //G.Barrand : processor_error = 1; //use returned value. -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::triangulateFace : " - << "triangulateContour failed." - << std::endl; -#endif - //break; //G.Barrand : ok ? - //return; //G.Barrand : ok ? - return false; //G.Barrand - } - } - faces[iface].inew = UNSUITABLE_FACE; - - // M O D I F Y R E F E R E N C E S - - for (int ifa=nface; ifa<(int)faces.size(); ifa++) { - iedge = faces[ifa].iold; - while (iedge > 0) { - if (edges[iedge].iface1 != ifa) { - //G.Barrand : processor_error = 1; //use returned value. -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::triangulateFace : wrong reference to itself, " - << "iface=" << ifa << ", iface1=" << edges[iedge].iface1 - << std::endl; -#endif - return false; //G.Barrand - }else if (edges[iedge].iface2 > 0) { - if(!modifyReference(edges[iedge].iface2, - edges[iedge].i1, edges[iedge].i2, ifa)) { //G.Barrand - return false; //G.Barrand - } - }else if (edges[iedge].iface2 < 0) { - edges[iedge].iface2 = edges[-edges[iedge].iface2].iface1; - } - iedge = edges[iedge].inext; - } - } - - return true; //G.Barrand. -} - -inline -polyhedron BooleanProcessor::createPolyhedron() -/*********************************************************************** - * * - * Name: BooleanProcessor::createPolyhedron() Date: 14.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Create polyhedron. * - * * - ***********************************************************************/ -{ - int i, iedge, nnode = 0, nface = 0; - - // R E N U M E R A T E N O D E S A N D F A C E S - - for (i=1; i<(int)nodes.size(); i++) nodes[i].s = 0; - - for (i=1; i<(int)faces.size(); i++) { - if (faces[i].inew == ORIGINAL_FACE) { - faces[i].inew = ++nface; - iedge = faces[i].iold; - while (iedge > 0) { - nodes[edges[iedge].i1].s = 1; - iedge = edges[iedge].inext; - } - }else{ - faces[i].inew = 0; - } - } - - for (i=1; i<(int)nodes.size(); i++) { - if (nodes[i].s == 1) nodes[i].s = ++nnode; - } - - // A L L O C A T E M E M O R Y - - ExtPolyhedron polyhedron; - if (nface == 0) return polyhedron; - polyhedron.AllocateMemory(nnode, nface); - - // S E T N O D E S - - for (i=1; i<(int)nodes.size(); i++) { - if (nodes[i].s != 0) polyhedron.pV[nodes[i].s] = nodes[i].v; - } - - // S E T F A C E S - - int k, v[4], f[4]; - for (i=1; i<(int)faces.size(); i++) { - if (faces[i].inew == 0) continue; - v[3] = f[3] = k = 0; - iedge = faces[i].iold; - while (iedge > 0) { - if (k > 3) { -#ifdef TOOLS_HEP_BP_VERBOSE - std::cerr - << "BooleanProcessor::createPolyhedron : too many edges" - << std::endl; -#endif - break; - } - v[k] = nodes[edges[iedge].i1].s; - if (edges[iedge].ivis < 0) v[k] = -v[k]; - f[k] = faces[edges[iedge].iface2].inew; - iedge = edges[iedge].inext; - k++; - } - if (k < 3) { -#ifdef TOOLS_HEP_BP_VERBOSE - std::cerr - << "BooleanProcessor::createPolyhedron : " - << "face has only " << k << " edges" - << std::endl; -#endif - } - //polyhedron.pF[faces[i].inew] = - // SbFacet(v[0],f[0], v[1],f[1], v[2],f[2], v[3],f[3]); - polyhedron.pF[faces[i].inew].set( //G.Barrand - v[0],f[0], v[1],f[1], v[2],f[2], v[3],f[3]); - } - return polyhedron; -} - -//G.Barrand : begin -//int BooleanProcessor::ishift = 0; //does not work with pure header code. -inline int& BooleanProcessor::get_shift() { //& not thread safe. - static int s_ishift; - return s_ishift; -} - -inline void BooleanProcessor::set_shift(int a_shift) { - get_shift() = a_shift; -} -inline void BooleanProcessor::inc_shift() { - int i = get_shift(); - i++; - if(i>=get_num_shift()) i = 0; - get_shift() = i; -} - -inline int BooleanProcessor::get_num_shift() { return 8;} -//G.Barrand : end - -//G.Barrand : -inline -bool BooleanProcessor::inc_try_count( -#ifdef TOOLS_HEP_BP_VERBOSE - int a_op,const polyhedron& a,const polyhedron& b -#else - int,const polyhedron&,const polyhedron& -#endif -,int& a_try_count){ - if(a_try_count>get_num_shift()) { -#ifdef TOOLS_HEP_BP_VERBOSE - std::cerr << "BooleanProcessor: " - << " all shifts tried. Boolean operation (" << a_op << ") failure." - << " a name \"" << a.getName() << "\"" - << " b name \"" << b.getName() << "\"" - << std::endl; -#endif - return false; //stop - } - -#ifdef TOOLS_HEP_BP_VERBOSE - std::cerr - << "BooleanProcessor::execute : try another tilt..." - << std::endl; -#endif - - a_try_count++; - return true; -} - -inline -polyhedron BooleanProcessor::execute(int op, - const polyhedron & a, - const polyhedron & b, - int& a_err) //G.Barrand -/*********************************************************************** - * * - * Name: BooleanProcessor::execute Date: 10.12.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Execute boolean operation. * - * * - ***********************************************************************/ -{ - //static int ishift = 0; //G.Barrand - //static double shift[8][3] = { - static double shift[/*NUM_SHIFT*/ 8][3] = { //G.Barrand - { 31, 23, 17}, - { -31, -23, -17}, - { -23, 17, 31}, - { 23, -17, -31}, - { -17, -31, 23}, - { 17, 31, -23}, - { 31, -23, 17}, - { -31, 23, -17} - }; - - - //std::cerr << "BooleanProcessor::execute : ++++++++++++++++++++++" - // << a.getName() - // << b.getName() - // << std::endl; - - // I N I T I A T E P R O C E S S O R - - operation = op; - nodes.clear(); nodes.push_back(CRAZY_POINT()); - edges.clear(); edges.push_back(ExtEdge()); - faces.clear(); faces.push_back(ExtFace(edges,0)); //G.Barrand : ok ? - - // T A K E P O L Y H E D R A - - ifaces1 = int(faces.size()); - if(!takePolyhedron(a,0,0,0)){ //G.Barrand : use returned value. - // corrapted polyhedron -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor: a corrapted input polyhedron" - << std::endl; -#endif - a_err = 1; //G.Barrand - return polyhedron(); - } - - ifaces2 = int(faces.size()); - if(!takePolyhedron(b,0,0,0)){ - // corrapted polyhedron -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor: b corrapted input polyhedron" - << std::endl; -#endif - a_err = 1; //G.Barrand - return polyhedron(); - } - - if (ifaces1 == ifaces2) { // a is empty - a_err = 0; //G.Barrand - switch (operation) { - case OP_UNION: - return b; - case OP_INTERSECTION: -#ifdef TOOLS_HEP_BP_VERBOSE - std::cerr - << "BooleanProcessor: intersection with empty polyhedron" - << std::endl; -#endif - return polyhedron(); - case OP_SUBTRACTION: -#ifdef TOOLS_HEP_BP_VERBOSE - std::cerr - << "BooleanProcessor: subtraction from empty polyhedron" - << std::endl; -#endif - return polyhedron(); - } - } - if (ifaces2 == (int)faces.size()) { // b is empty - a_err = 0; //G.Barrand - switch (operation) { - case OP_UNION: - return a; - case OP_INTERSECTION: -#ifdef TOOLS_HEP_BP_VERBOSE - std::cerr - << "BooleanProcessor: intersection with empty polyhedron" - << std::endl; -#endif - return polyhedron(); - case OP_SUBTRACTION: - return a; - } - } - - // S E T I N I T I A L M I N - M A X A N D T O L E R A N C E - - del = findMinMax(); - - // W O R K A R O U N D T O A V O I D I E A N D E E - - int try_count = 1; - while(true) { //G.Barrand - - double ddxx = del*shift[get_shift()][0]; - double ddyy = del*shift[get_shift()][1]; - double ddzz = del*shift[get_shift()][2]; - //ishift++; if (ishift == get_num_shift()) ishift = 0; - inc_shift(); - - operation = op; - nodes.clear(); nodes.push_back(CRAZY_POINT()); - edges.clear(); edges.push_back(ExtEdge()); - faces.clear(); faces.push_back(ExtFace(edges,0)); //G.Barrand : ok ? - - ifaces1 = int(faces.size()); - if(!takePolyhedron(a,0,0,0)) { -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor: shifted a corrapted input polyhedron" - << std::endl; -#endif - if(!inc_try_count(op,a,b,try_count)) {a_err = 1;return a;} - continue; //try another shift. - } - - ifaces2 = int(faces.size()); - if(!takePolyhedron(b,ddxx,ddyy,ddzz)){ -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor: shifted b corrapted input polyhedron" - << std::endl; -#endif - if(!inc_try_count(op,a,b,try_count)) {a_err = 1;return a;} - continue; //try another shift. - } - - del = findMinMax(); - - // P R E S E L E C T O U T S I D E F A C E S - - iout1 = iout2 = 0; - selectOutsideFaces(ifaces1, iout1); - selectOutsideFaces(ifaces2, iout2); - - // P R E S E L E C T N O I N T E R S E C T I O N F A C E S - - int ifa1, ifa2; - iunk1 = iunk2 = 0; - if (iout1 != 0 || iout2 != 0) { - for(;;) { - ifa1 = iunk1; - ifa2 = iunk2; - selectOutsideFaces(ifaces1, iunk1); - selectOutsideFaces(ifaces2, iunk2); - if (iunk1 == ifa1 && iunk2 == ifa2) break; - findMinMax(); - } - } - - // F I N D N E W E D G E S - - {int processor_error = 0; //G.Barrand - if (ifaces1 != 0 && ifaces2 != 0 ) { - ifa1 = ifaces1; - while (ifa1 > 0) { - ifa2 = ifaces2; - while (ifa2 > 0) { - if(!testFaceVsFace(ifa1, ifa2)) { - processor_error = 1; //G.Barrand - break; //G.Barrand - } - ifa2 = faces[ifa2].inext; - } - if(processor_error) break; //G.Barrand - ifa1 = faces[ifa1].inext; - } - } - if (processor_error) { - PROCESSOR_ERROR(4); - if(!inc_try_count(op,a,b,try_count)) {a_err = 1;return a;} - continue; //try another shift. - }} //G.Barrand - - // C O N S T R U C T N E W F A C E S - - if(!assembleNewFaces((operation == OP_INTERSECTION) ? 1 : 0, ifaces1)){ - //G.Barrand - PROCESSOR_ERROR(5); - if(!inc_try_count(op,a,b,try_count)) {a_err = 1;return a;} - continue; //try another shift. - } - if(!assembleNewFaces((operation == OP_UNION) ? 0 : 1, ifaces2)){ - //G.Barrand - PROCESSOR_ERROR(6); - if(!inc_try_count(op,a,b,try_count)) {a_err = 1;return a;} - continue; //try another shift. - } - // A S S E M B L E S U I T A B L E F A C E S - - if(!initiateLists()) { //G.Barrand : return status. -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor: initiateLists failed." - << std::endl; -#endif - if(!inc_try_count(op,a,b,try_count)) {a_err = 1;return a;} - continue; //try another shift. - } - - {int processor_error = 0; - for (;;) { - if(!assemblePolyhedra()) { //G.Barrand : handle returned value. - processor_error = 1; -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor: assemblePolyhedra failed." - << std::endl; -#endif - break; - } - if (unknown_faces.front() != 0) { - processor_error = 1; -#ifdef TOOLS_HEP_BP_OUT_ERR - std::cerr - << "BooleanProcessor::execute : unknown faces !!!" - << std::endl; -#endif - break; - } - break; - } - if (processor_error) { - PROCESSOR_ERROR(7); - if(!inc_try_count(op,a,b,try_count)) {a_err = 1;return a;} - continue; //try another shift. - }} - - // T R I A N G U L A T E A C C E P T E D F A C E S - - {int processor_error = 0; - ifa1 = result_faces.front(); - while (ifa1 > 0) { - ifa2 = ifa1; - ifa1 = faces[ifa2].inext; - if(faces[ifa2].inew == NEW_FACE) { - if(!triangulateFace(ifa2)) { //G.Barrand : use returned status. - processor_error = 1; - break; //G.Barrand - } - } - } - if (processor_error) { - PROCESSOR_ERROR(8); - if(!inc_try_count(op,a,b,try_count)) {a_err = 1;return a;} - continue; //try another shift. - }} - -#ifdef TOOLS_HEP_BP_VERBOSE - if(try_count!=1) { - std::cerr - << "BooleanProcessor::execute : had converged." - << std::endl; - } -#endif - break; - - } //G.Barrand : end while shift. - - // C R E A T E P O L Y H E D R O N - - a_err = 0; - return createPolyhedron(); -} - - -//#include -//#include -//#include "zbuf.h" -//void BooleanProcessor::draw() -/*********************************************************************** - * * - * Name: BooleanProcessor::draw Date: 10.12.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Draw * - * * - ***********************************************************************/ -/* -{ - int II; - int icol, i1, i2, iedge, iface, ilist[4]; - float p1[3], p2[3]; - - ilist[0] = ifaces1; - ilist[1] = ifaces2; - ilist[2] = iout1; - ilist[3] = iout2; - - for (int i=0; i<4; i++) { - - if (i == 0) cout << "========= Ifaces_1" << endl; - if (i == 1) cout << "========= Ifaces_2" << endl; - if (i == 2) cout << "========= Iout_1" << endl; - if (i == 3) cout << "========= Iout_2" << endl; - - icol = i+1; - iface = ilist[i]; - while (iface > 0) { - - cout << "iface = " << iface << endl; - cout << "--- iold" << endl; - - iedge = faces[iface].iold; - icol = 2; - - while (iedge > 0) { - - cout << " iegde = " << iedge - << " i1,i2 =" << edges[iedge].i1 << "," << edges[iedge].i2 - << " iface1,iface2 = " - << edges[iedge].iface1 << "," << edges[iedge].iface2 - << endl; - - i1 = edges[iedge].i1; - p1[0] = nodes[i1].v.x(); - p1[1] = nodes[i1].v.y(); - p1[2] = nodes[i1].v.z(); - IHWTON(p1,p1); - i2 = edges[iedge].i2; - p2[0] = nodes[i2].v.x(); - p2[1] = nodes[i2].v.y(); - p2[2] = nodes[i2].v.z(); - IHWTON(p2,p2); -// icol = (edges[iedge].ivis > 0) ? 1 : 2; - IHZLIN(icol,p1[0],p1[1],p1[2], p2[0],p2[1],p2[2]); - iedge = edges[iedge].inext; - } - - cout << "--- inew" << endl; - - iedge = faces[iface].inew; - icol = 3; - - while (iedge > 0) { - - cout << " iegde = " << iedge - << " i1,i2 =" << edges[iedge].i1 << "," << edges[iedge].i2 - << " iface1,iface2 = " - << edges[iedge].iface1 << "," << edges[iedge].iface2 - << endl; - - i1 = edges[iedge].i1; - p1[0] = nodes[i1].v.x(); - p1[1] = nodes[i1].v.y(); - p1[2] = nodes[i1].v.z(); - IHWTON(p1,p1); - i2 = edges[iedge].i2; - p2[0] = nodes[i2].v.x(); - p2[1] = nodes[i2].v.y(); - p2[2] = nodes[i2].v.z(); - IHWTON(p2,p2); -// icol = (edges[iedge].ivis > 0) ? 1 : 2; - IHZLIN(icol,p1[0],p1[1],p1[2], p2[0],p2[1],p2[2]); - iedge = edges[iedge].inext; - } - iface = faces[iface].inext; - - IHZTOX(0,100,100); - ixupdwi(0); - cin >> II; - ixclrwi(); - IHZCLE(0); - } - } -} -*/ - -/* -//-------------------------------------------------------------------- -inline void -BooleanProcessor::draw_edge(int icol, int iedge) { - int i1, i2; - float p1[3], p2[3]; - - i1 = edges[iedge].i1; - p1[0] = nodes[i1].v.x(); - p1[1] = nodes[i1].v.y(); - p1[2] = nodes[i1].v.z(); - IHWTON(p1,p1); - i2 = edges[iedge].i2; - p2[0] = nodes[i2].v.x(); - p2[1] = nodes[i2].v.y(); - p2[2] = nodes[i2].v.z(); - IHWTON(p2,p2); - IHZLIN(icol,p1[0],p1[1],p1[2], p2[0],p2[1],p2[2]); -} - -//-------------------------------------------------------------------- -inline void -BooleanProcessor::draw_contour(int i1col, int i2col, int ihead) { - int iedge, icol; - iedge = ihead; - while (iedge > 0) { - icol = (edges[iedge].ivis > 0) ? i1col : i2col; - draw_edge(icol, iedge); - iedge = edges[iedge].inext; - } - - IHZTOX(0,100,100); - ixupdwi(0); - - int i; - std::cin >> i; -} - -//-------------------------------------------------------------------- -inline void -BooleanProcessor::print_face(int iface) { - cout.precision(3); - cout << "\n====== Face N " << iface << endl; - cout << "iedges[4] = " - << faces[iface].iedges[0] << ", " - << faces[iface].iedges[1] << ", " - << faces[iface].iedges[2] << ", " - << faces[iface].iedges[3] << endl; - cout << "rmin[3] = " - << faces[iface].rmin[0] << ", " - << faces[iface].rmin[1] << ", " - << faces[iface].rmin[2] << endl; - cout << "rmax[3] = " - << faces[iface].rmax[0] << ", " - << faces[iface].rmax[1] << ", " - << faces[iface].rmax[2] << endl; - cout << "iprev,inext = " - << faces[iface].iprev << ", " - << faces[iface].inext << endl; - cout << "iold = " << faces[iface].iold << endl; - for(int i = faces[iface].iold; i != 0;) { - print_edge(i); - i = edges[abs(i)].inext; - } - - cout << "inew = "; - switch (faces[iface].inew) { - case UNKNOWN_FACE: - cout << "UNKNOWN_FACE" << endl; - break; - case ORIGINAL_FACE: - cout << "ORIGINAL_FACE" << endl; - break; - case NEW_FACE: - cout << "NEW_FACE" << endl; - break; - case UNSUITABLE_FACE: - cout << "UNSUITABLE_FACE" << endl; - break; - case DEFECTIVE_FACE: - cout << "DEFECTIVE_FACE" << endl; - break; - default: - cout << faces[iface].inew << endl; - for(int k = faces[iface].inew; k != 0;) { - print_edge(k); - k = edges[abs(k)].inext; - } - } -} - -//-------------------------------------------------------------------- -inline void -BooleanProcessor::print_edge(int iedge) { - cout << "==== Edge N " << iedge << endl; - int i = std::abs(iedge); - int i1 = edges[i].i1; - int i2 = edges[i].i2; - cout << "node[" << i1 << "] = " - << nodes[i1].v.x() << ", " - << nodes[i1].v.y() << ", " - << nodes[i1].v.z() << endl; - - cout << "node[" << i2 << "] = " - << nodes[i2].v.x() << ", " - << nodes[i2].v.y() << ", " - << nodes[i2].v.z() << endl; - - cout << "iface1,iface2,ivis,inext = " - << edges[i].iface1 << ", " - << edges[i].iface2 << ", " - << edges[i].ivis << ", " - << edges[i].inext << endl; -} -*/ - -inline void BooleanProcessor::dump(std::ostream& a_out) {//G.Barrand - size_t number = nodes.size(); - a_out << "nodes : " << number << std::endl; - for(size_t index=0;index -#include - -//#define TOOLS_HEP_PH_OUT_ERR -//#define TOOLS_HEP_PH_OUT_ERR_TRD2 -//#define TOOLS_HEP_PH_NOT_OPT - -#ifdef TOOLS_HEP_PH_OUT_ERR -#include -#endif - -#ifdef TOOLS_HEP_PH_OUT_ERR_TRD2 -#include -#endif - -#include - -namespace tools { -namespace hep { - -typedef vec3d HVPoint3D; -typedef HVPoint3D HVNormal3D; -typedef HVPoint3D HVVector3D; - -//WARNING : with SbFacet, take care of exlib::geant4::polyhedron -// that attempts to copy the private content of G4Facet. -// (see WARNING here). - -class SbFacet { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hep::SbFacet) -#endif - - friend class polyhedron; -#ifndef SWIG - friend std::ostream& operator<<(std::ostream&, const SbFacet &facet); - //G.Barrand - friend int operator == (const SbFacet & v1, const SbFacet & v2); - friend int operator != (const SbFacet & v1, const SbFacet & v2); -#endif - - private: - typedef struct { int v,f; } edge_t; //G.Barrand - edge_t edge[4]; - - public: - SbFacet(int v1=0, int f1=0, int v2=0, int f2=0, - int v3=0, int f3=0, int v4=0, int f4=0) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - edge[0].v=v1; edge[0].f=f1; edge[1].v=v2; edge[1].f=f2; - edge[2].v=v3; edge[2].f=f3; edge[3].v=v4; edge[3].f=f4; } - - virtual ~SbFacet() { -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -//public: -protected: - SbFacet(const SbFacet & aFrom) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - edge[0].v = aFrom.edge[0].v; - edge[0].f = aFrom.edge[0].f; - edge[1].v = aFrom.edge[1].v; - edge[1].f = aFrom.edge[1].f; - edge[2].v = aFrom.edge[2].v; - edge[2].f = aFrom.edge[2].f; - edge[3].v = aFrom.edge[3].v; - edge[3].f = aFrom.edge[3].f; - } - SbFacet& operator=(const SbFacet& aFrom) { - edge[0].v = aFrom.edge[0].v; - edge[0].f = aFrom.edge[0].f; - edge[1].v = aFrom.edge[1].v; - edge[1].f = aFrom.edge[1].f; - edge[2].v = aFrom.edge[2].v; - edge[2].f = aFrom.edge[2].f; - edge[3].v = aFrom.edge[3].v; - edge[3].f = aFrom.edge[3].f; - return *this; - } -public: - bool isEqual(const SbFacet& aFrom) const { //G.Barrand - if(edge[0].v!=aFrom.edge[0].v) return false; - if(edge[0].f!=aFrom.edge[0].f) return false; - - if(edge[1].v!=aFrom.edge[1].v) return false; - if(edge[1].f!=aFrom.edge[1].f) return false; - - if(edge[2].v!=aFrom.edge[2].v) return false; - if(edge[2].f!=aFrom.edge[2].f) return false; - - if(edge[3].v!=aFrom.edge[3].v) return false; - if(edge[3].f!=aFrom.edge[3].f) return false; - - return true; - } - void GetEdge(int i,int& v,int& f) const { //G.Barrand - v = edge[i].v; - f = edge[i].f; - } - - void set(int v1, int f1, int v2, int f2, //G.Barrand - int v3, int f3, int v4, int f4) { - edge[0].v=v1; edge[0].f=f1; edge[1].v=v2; edge[1].f=f2; - edge[2].v=v3; edge[2].f=f3; edge[3].v=v4; edge[3].f=f4; - } - - - void Set(int v[8]) //G.Barrand - { edge[0].v = v[0]; edge[0].f = v[1]; - edge[1].v = v[2]; edge[1].f = v[3]; - edge[2].v = v[4]; edge[2].f = v[5]; - edge[3].v = v[6]; edge[3].f = v[7]; } -}; - -//G.Barrand : -//int operator == (const SbFacet & v1, const SbFacet & v2); -//int operator != (const SbFacet & v1, const SbFacet & v2); - -class polyhedron { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hep::polyhedron) -#endif - -#ifndef SWIG - friend std::ostream& operator<<(std::ostream&, const polyhedron &ph); - //G.Barrand - friend int operator == (const polyhedron & v1, const polyhedron & v2); - friend int operator != (const polyhedron & v1, const polyhedron & v2); -#endif - -private: //G.Barrand - //std::string* m_name; //have a pointer to optimize memory. -protected: - int nvert, nface; - HVPoint3D* pV; - SbFacet* pF; -private: - int fNumberOfRotationSteps; - -protected: - static double _M_PI() {return 3.1415926535897931160E0;} - //static double _M_PI_2() {return 1.5707963267948965580E0;} - - // Allocate memory for polyhedron - void AllocateMemory(int Nvert, int Nface); - - // Find neighbouring facet - int FindNeighbour(int iFace, int iNode, int iOrder) const; - - // Find normal at node - HVNormal3D FindNodeNormal(int iFace, int iNode) const; - - // Create polyhedron for prism with quadrilateral base - void CreatePrism(); - - // Generate facets by revolving an edge around Z-axis - void RotateEdge(int k1, int k2, double r1, double r2, - int v1, int v2, int vEdge, - bool ifWholeCircle, int ns, int &kface); - - // Set side facets for the case of incomplete rotation - void SetSideFacets(int ii[4], int vv[4], - int *kk, double *r, - double dphi, int ns, int &kface); - - // Create polyhedron for body of revolution around Z-axis - void RotateAroundZ(int nstep, double phi, double dphi, - int np1, int np2, - const double *z, double *r, - int nodeVis, int edgeVis); - - // For each edge set reference to neighbouring facet - void SetReferences(); - - // Invert the order on nodes in facets - void InvertFacets(); -public: //public for iv2sg - static int NUMBER_OF_STEPS() {return 24;} -public: //for iv2sg - static void do_not_set_NUMBER_OF_STEPS(int){} -public: - polyhedron(int Nvert=0, int Nface=0) - : /*m_name(0) //G.Barrand - ,*/nvert(Nvert),nface(Nface) - ,pV(Nvert ? new HVPoint3D[Nvert+1] : 0) - ,pF(Nface ? new SbFacet[Nface+1] : 0) - ,fNumberOfRotationSteps(NUMBER_OF_STEPS()) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } -public: - virtual ~polyhedron() { - //delete m_name; //G.Barrand. - delete [] pV; delete [] pF; -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -public: - polyhedron(const polyhedron & from); - polyhedron& operator=(const polyhedron & from); -public: - //G.Barrand : handle a name to help debugging. -/* - void setName(const std::string& aName) { - delete m_name; - m_name = new std::string(aName); - } - const std::string& getName() const { - if(!m_name) return s_empty(); - return *m_name; - } -*/ - //G.Barrand :end - - void Set(int Nvert, HVPoint3D* aV, - int Nface, SbFacet* aF) //G.Barrand - { delete [] pV; delete [] pF; - nvert = Nvert; nface = Nface; pV = aV; pF = aF;} - - void Empty() //G.Barrand - { nvert = 0; nface = 0; pV = 0;pF = 0;} - - // Get number of vertices - int GetNoVertices() const { return nvert; } - - // Get number of facets - int GetNoFacets() const { return nface; } - - // Transform the polyhedron - polyhedron& Translate(double,double,double); - polyhedron& Transform(const rotd& rot,double,double,double); - polyhedron& Transform(const rotd& rot,const vec3d& trans); - - // Get next vertex index of the quadrilateral - //G.Barrand - bool GetNextVertexIndex(int & index, int & edgeFlag) const; - - // Get vertex by index - HVPoint3D GetVertex(int index) const; - const HVPoint3D& GetVertexFast(int index) const; //G.Barrand - - //G.Barrand : to optimize SoPolyhedron. - HVPoint3D* GetPV() const {return pV;} //G.Barrand - SbFacet* GetPF() const {return pF;} //G.Barrand - - // Get next vertex + edge visibility of the quadrilateral - bool GetNextVertex(HVPoint3D & vertex, int & edgeFlag) const; - - // Get next vertex + edge visibility + normal of the quadrilateral - bool GetNextVertex(HVPoint3D & vertex, int & edgeFlag, - HVNormal3D & normal) const; - - // Get indeces of the next edge with indeces of the faces - bool GetNextEdgeIndeces(int & i1, int & i2, int & edgeFlag, - int & iface1, int & iface2) const; - - // Get indeces of the next edge - bool GetNextEdgeIndeces(int & i1, int & i2, int & edgeFlag) const; - - // Get next edge - bool GetNextEdge(HVPoint3D &p1, HVPoint3D &p2, int &edgeFlag) const; - - // Get next edge - bool GetNextEdge(HVPoint3D &p1, HVPoint3D &p2, int &edgeFlag, - int &iface1, int &iface2) const; - - // Get face by index - void GetFacet(int iFace, int &n, int *iNodes, - int *edgeFlags = 0, int *iFaces = 0) const; - - // Get face by index - void GetFacet(int iFace, int &n, HVPoint3D *nodes, - int *edgeFlags = 0, HVNormal3D *normals = 0) const; - - // Get next face with normals at the nodes - bool GetNextFacet(int &n, HVPoint3D *nodes, - int *edgeFlags=0, HVNormal3D *normals=0) const; - - // Get normal of the face given by index - HVNormal3D GetNormal(int iFace) const; - - // Get unit normal of the face given by index - HVNormal3D GetUnitNormal(int iFace) const; - - // Get normal of the next face - bool GetNextNormal(HVNormal3D &normal) const; - - // Get normal of unit length of the next face - bool GetNextUnitNormal(HVNormal3D &normal) const; - - // Boolean operations - polyhedron add(const polyhedron &p) const; - polyhedron subtract(const polyhedron &p) const; - polyhedron intersect(const polyhedron &p) const; - - // Get area of the surface of the polyhedron - double GetSurfaceArea() const; - - // Get volume of the polyhedron - double GetVolume() const; - - bool isEqual(const polyhedron &p) const; //G.Barrand - bool isConsistent(const char* = 0) const; //G.Barrand - void dump(std::ostream&) const; - - // Get number of steps for whole circle - int GetNumberOfRotationSteps(); //G.Barrand : no more static. - - // Set number of steps for whole circle - void SetNumberOfRotationSteps(int n); - - // Reset number of steps for whole circle to default value - void ResetNumberOfRotationSteps(); //G.Barrand : have code in .cxx. - -public: - //G.Barrand : have the below set_ to optimize exlib/sg/polyhedron setup. - bool set_polyhedron_cons(double Rmn1, double Rmx1, - double Rmn2, double Rmx2, double Dz, - double Phi1, double Dphi, - int nstep = 0); //G.Barrand - bool set_polyhedron_tube(double Rmin, double Rmax, double Dz, - int nstep = 0){ - return set_polyhedron_cons(Rmin, Rmax, Rmin, Rmax, Dz, 0, 2*_M_PI(), nstep); - } - - double vxy(const double* xy,int i,int j) {return xy[i*2+j];} - bool set_polyhedron_arb8(double Dz,const double* xy); - - bool set_polyhedron_trd2(double Dx1, double Dx2, - double Dy1, double Dy2, double Dz); - bool set_polyhedron_box(double Dx, double Dy, double Dz){ - return set_polyhedron_trd2(Dx, Dx, Dy, Dy, Dz); - } - bool set_polyhedron_trd1(double Dx1, double Dx2, - double Dy, double Dz){ - return set_polyhedron_trd2(Dx1, Dx2, Dy, Dy, Dz); - } - bool set_polyhedron_trap(double Dz, double Theta, double Phi, - double Dy1, - double Dx1, double Dx2, double Alp1, - double Dy2, - double Dx3, double Dx4, double Alp2); - - bool set_polyhedron_para(double Dx, double Dy, double Dz, - double Alpha, double Theta, - double Phi){ - return set_polyhedron_trap(Dz,Theta,Phi,Dy,Dx,Dx,Alpha,Dy,Dx,Dx,Alpha); - } - - bool set_polyhedron_pgon(double phi, double dphi, int npdv, int nz, - const double *z, - const double *rmin, - const double *rmax); - bool set_polyhedron_pcon(double phi, double dphi, int nz, - const double *z, - const double *rmin, - const double *rmax) { - return set_polyhedron_pgon(phi, dphi, 0, nz, z, rmin, rmax); - } - - bool set_polyhedron_tubs(double Rmin, double Rmax, - double Dz, - double Phi1, double Dphi, - int nstep) {//G.Barrand - return set_polyhedron_cons(Rmin, Rmax, Rmin, Rmax, Dz, Phi1, Dphi, nstep); - } - - bool set_polyhedron_cone(double Rmn1, double Rmx1, - double Rmn2, double Rmx2, - double Dz, - int nstep) { - return set_polyhedron_cons(Rmn1, Rmx1, Rmn2, Rmx2, Dz, 0, 2*_M_PI(), nstep); - } - - bool set_polyhedron_torus(double rmin,double rmax,double rtor, - double phi,double dphi, - int nphi, //G.Barrand - int nthe); //G.Barrand - - bool set_polyhedron_xtru(int a_npts,int a_nz, - double* a_xs,double* a_ys,double* a_zs, - bool a_acw = true, - bool a_zfb = true); - - bool set_polyhedron_sphere(double rmin, double rmax, - double phi, double dphi, - double the, double dthe, - int nphi = 0, - int nthe = 0); //G.Barrand - - bool set_polyhedron_hype(double a_st_in,double a_st_out, - double a_rmin,double a_rmax,double a_dz, - int a_nz = 10,int a_nphi = 24); - bool set_polyhedron_eltu(double a_dx,double a_dy,double a_dz, - int a_nz = 10,int a_nphi = 24); -private: //G.Barrand - int _ixy(int,int,int,int,bool,bool); - void _clear(){ - //used in set_polyhedronXxx() - delete [] pV; - pV = 0; - delete [] pF; - pF = 0; - nvert = 0; - nface = 0; - } - bool CHECK_INDEX(const char* a_method,int a_index) const; -}; - -//G.Barrand : -//int operator == (const polyhedron & v1, const polyhedron & v2); -//int operator != (const polyhedron & v1, const polyhedron & v2); - -// G.Barrand : introduce iabs to avoid a mess with cmath and some compiler. -inline int Sb_iabs(int a) { - return a < 0 ? -a : a; -} - -inline //G.Barrand -bool polyhedron::GetNextVertexIndex(int &index, int &edgeFlag) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextVertexIndex Date: 03.09.96 * - * Author: Yasuhide Sawada Revised: * - * * - * Function: * - * * - ***********************************************************************/ -{ - static int iFace = 1; - static int iQVertex = 0; - //G.Barrand : int vIndex = pF[iFace].edge[iQVertex].v; - SbFacet::edge_t* edge = pF[iFace].edge; //G.Barrand : optimize. - int vIndex = edge[iQVertex].v; - - edgeFlag = (vIndex > 0) ? 1 : 0; - index = Sb_iabs(vIndex); - - if(index>nvert) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr << "polyhedron::GetNextVertexIndex: pV index problem " - << index << " exceed " << nvert << std::endl; -#endif - index = 0; - } - - //G.Barrand : if (iQVertex >= 3 || pF[iFace].edge[iQVertex+1].v == 0) { - if (iQVertex >= 3 || edge[iQVertex+1].v == 0) { - iQVertex = 0; - if (++iFace > nface) iFace = 1; - return false; // Last Edge - }else{ - ++iQVertex; - return true; // not Last Edge - } -} - -class polyhedron_trd2 : public polyhedron { - public: - polyhedron_trd2(double Dx1, double Dx2, - double Dy1, double Dy2, double Dz); - virtual ~polyhedron_trd2(){} - public: - polyhedron_trd2(const polyhedron_trd2& a_from):polyhedron(a_from){} - polyhedron_trd2& operator=(const polyhedron_trd2& a_from){ - polyhedron::operator=(a_from); - return *this; - } - - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_arb8 : public polyhedron { - public: - polyhedron_arb8(double Dz,const double* xy); - virtual ~polyhedron_arb8(){} - public: - polyhedron_arb8(const polyhedron_arb8& a_from):polyhedron(a_from){} - polyhedron_arb8& operator=(const polyhedron_arb8& a_from){ - polyhedron::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_xtru : public polyhedron { - public: - polyhedron_xtru(int a_npts,int a_nz, - double* a_xs,double* a_ys,double* a_zs, - bool a_acw = true, - bool a_zfb = true); - virtual ~polyhedron_xtru(){} - public: - polyhedron_xtru(const polyhedron_xtru& a_from):polyhedron(a_from){} - polyhedron_xtru& operator=(const polyhedron_xtru& a_from){ - polyhedron::operator=(a_from); - return *this; - } -}; - -class polyhedron_hype : public polyhedron { - public: - polyhedron_hype(double a_st_in,double a_st_out, - double a_rmin,double a_rmax,double a_dz, - int a_nz = 10,int a_nphi = 24); - virtual ~polyhedron_hype(){} - public: - polyhedron_hype(const polyhedron_hype& a_from):polyhedron(a_from){} - polyhedron_hype& operator=(const polyhedron_hype& a_from){ - polyhedron::operator=(a_from); - return *this; - } -}; - -class polyhedron_trd1 : public polyhedron_trd2 { - public: - polyhedron_trd1(double Dx1, double Dx2, - double Dy, double Dz); - virtual ~polyhedron_trd1(){} - public: - polyhedron_trd1(const polyhedron_trd1& a_from):polyhedron_trd2(a_from){} - polyhedron_trd1& operator=(const polyhedron_trd1& a_from){ - polyhedron_trd2::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_box : public polyhedron_trd2 { - public: - polyhedron_box(double Dx, double Dy, double Dz); - virtual ~polyhedron_box(){} - public: - polyhedron_box(const polyhedron_box& a_from):polyhedron_trd2(a_from){} - polyhedron_box& operator=(const polyhedron_box& a_from){ - polyhedron_trd2::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_trap : public polyhedron { -public: - polyhedron_trap(double Dz, double Theta, double Phi, - double Dy1, - double Dx1, double Dx2, double Alp1, - double Dy2, - double Dx3, double Dx4, double Alp2); - virtual ~polyhedron_trap(){} - public: - polyhedron_trap(const polyhedron_trap& a_from):polyhedron(a_from){} - polyhedron_trap& operator=(const polyhedron_trap& a_from){ - polyhedron::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_para : public polyhedron_trap { -public: - polyhedron_para(double Dx, double Dy, double Dz, - double Alpha, double Theta, double Phi); - virtual ~polyhedron_para(){} - public: - polyhedron_para(const polyhedron_para& a_from):polyhedron_trap(a_from){} - polyhedron_para& operator=(const polyhedron_para& a_from){ - polyhedron_trap::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_cons : public polyhedron { -public: - polyhedron_cons(double Rmn1, double Rmx1, - double Rmn2, double Rmx2, double Dz, - double Phi1, double Dphi, - int nstep = 0); //G.Barrand - virtual ~polyhedron_cons(){} - public: - polyhedron_cons(const polyhedron_cons& a_from):polyhedron(a_from){} - polyhedron_cons& operator=(const polyhedron_cons& a_from){ - polyhedron::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_cone : public polyhedron_cons { -public: - polyhedron_cone(double Rmn1, double Rmx1, - double Rmn2, double Rmx2, double Dz, - int nstep = 0); //G.Barrand - virtual ~polyhedron_cone(){} - public: - polyhedron_cone(const polyhedron_cone& a_from):polyhedron_cons(a_from){} - polyhedron_cone& operator=(const polyhedron_cone& a_from){ - polyhedron_cons::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_tubs : public polyhedron_cons { -public: - polyhedron_tubs(double Rmin, double Rmax, double Dz, - double Phi1, double Dphi, - int nstep = 0); //G.Barrand - virtual ~polyhedron_tubs(){} - public: - polyhedron_tubs(const polyhedron_tubs& a_from):polyhedron_cons(a_from){} - polyhedron_tubs& operator=(const polyhedron_tubs& a_from){ - polyhedron_cons::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_tube : public polyhedron_cons { -public: - polyhedron_tube(double Rmin, double Rmax, double Dz,int nstep = 0); //G.Barrand - virtual ~polyhedron_tube(){} - public: - polyhedron_tube(const polyhedron_tube& a_from):polyhedron_cons(a_from){} - polyhedron_tube& operator=(const polyhedron_tube& a_from){ - polyhedron_cons::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_pgon : public polyhedron { -public: - polyhedron_pgon(double phi, double dphi, int npdv, int nz, - const double *z, - const double *rmin, - const double *rmax); - virtual ~polyhedron_pgon(){} - public: - polyhedron_pgon(const polyhedron_pgon& a_from):polyhedron(a_from){} - polyhedron_pgon& operator=(const polyhedron_pgon& a_from){ - polyhedron::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_pcon : public polyhedron_pgon { -public: - polyhedron_pcon(double phi, double dphi, int nz, - const double *z, - const double *rmin, - const double *rmax); - virtual ~polyhedron_pcon(){} - public: - polyhedron_pcon(const polyhedron_pcon& a_from):polyhedron_pgon(a_from){} - polyhedron_pcon& operator=(const polyhedron_pcon& a_from){ - polyhedron_pgon::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_sphere : public polyhedron { -public: - polyhedron_sphere(double rmin, double rmax, - double phi, double dphi, - double the, double dthe, - int nphi = 0, - int nthe = 0); //G.Barrand - virtual ~polyhedron_sphere(){} - public: - polyhedron_sphere(const polyhedron_sphere& a_from):polyhedron(a_from){} - polyhedron_sphere& operator=(const polyhedron_sphere& a_from){ - polyhedron::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -class polyhedron_torus : public polyhedron { -public: - polyhedron_torus(double rmin, double rmax, double rtor, - double phi, double dphi, - int nphi = 0, - int nthe = 0); //G.Barrand - virtual ~polyhedron_torus(){} - public: - polyhedron_torus(const polyhedron_torus& a_from):polyhedron(a_from){} - polyhedron_torus& operator=(const polyhedron_torus& a_from){ - polyhedron::operator=(a_from); - return *this; - } - //virtual polyhedron& operator = (const polyhedron& from) { - // return polyhedron::operator = (from); - //} -}; - -//G.Barrand : begin -class polyhedronProcessor { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hep::polyhedronProcessor) -#endif -public: - enum Operation { //Must be the same than BooleanProcessor OP_XXX. - UNION = 0 - ,INTERSECTION = 1 - ,SUBTRACTION = 2 - }; -private: - typedef std::pair op_t; -public: - polyhedronProcessor(){ -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - virtual ~polyhedronProcessor(){ -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -private: - polyhedronProcessor(const polyhedronProcessor&){ -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - polyhedronProcessor& operator=(const polyhedronProcessor&){return *this;} -public: - void push_back(Operation a_op,const polyhedron& a_polyhedron) { - m_ops.push_back(op_t(a_op,a_polyhedron)); - } - bool execute(polyhedron&); - void clear() { m_ops.clear();} - bool is_same_op() const { - if(!m_ops.size()) return true; - Operation op = m_ops[0].first; - std::vector::const_iterator it; - for(it=m_ops.begin();it!=m_ops.end();++it) { - if((*it).first!=op) return false; - } - return true; - } - -//private: - bool execute1(polyhedron&,const std::vector&); -private: - std::vector m_ops; -}; -//G.Barrand : end - -//inline const std::string& stype(const polyhedron&) { -// static const std::string s_v("tools::hep::polyhedron"); -// return s_v; -//} - -}} - -#include "polyhedron.icc" - -namespace tools { -namespace hep { - -template -inline void tsf_polyhedron(polyhedron& a_ph,const MATRIX& a_matrix) { - typedef typename MATRIX::elem_t T; - int nvert = a_ph.GetNoVertices(); - hep::HVPoint3D* pV = a_ph.GetPV(); - if (nvert > 0) { - T x,y,z; - for (int i=1; i<=nvert; i++) { - hep::HVPoint3D& p = pV[i]; - x = T(p.x()); - y = T(p.y()); - z = T(p.z()); - a_matrix.mul_3(x,y,z); - p.set_value(x,y,z); - } - } -} - -}} - -#endif - -//--------------------------------------------------------------------// -// JFB: // -// polyhedron was HepPolyhedron, retrofitted to Open Inventor // -// infrastructure: // -//--------------------------------------------------------------------// - - -// ******************************************************************** -// * DISCLAIMER * -// * * -// * The following disclaimer summarizes all the specific disclaimers * -// * of contributors to this software. The specific disclaimers,which * -// * govern, are listed with their locations in: * -// * http://cern.ch/geant4/license * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. * -// * * -// * This code implementation is the intellectual property of the * -// * GEANT4 collaboration. * -// * By copying, distributing or modifying the Program (or any work * -// * based on the Program) you indicate your acceptance of this * -// * statement, and all its terms. * -// ******************************************************************** -// -// -// -// -// Class Description: -// polyhedron is an intermediate class between description of a shape -// and visualization systems. It is intended to provide some service like: -// - polygonization of shapes with triangulization (quadrilaterization) -// of complex polygons; -// - calculation of normals for faces and vertices; -// - finding result of boolean operation on polyhedra; -// -// Public constructors: -// -// polyhedron_box (dx,dy,dz) -// - create polyhedron for Box; -// polyhedron_trd1 (dx1,dx2,dy,dz) -// - create polyhedron for G3 Trd1; -// polyhedron_trd2 (dx1,dx2,dy1,dy2,dz) -// - create polyhedron for G3 Trd2; -// polyhedron_trap (dz,theta,phi, h1,bl1,tl1,alp1, h2,bl2,tl2,alp2) -// - create polyhedron for G3 Trap; -// polyhedron_para (dx,dy,dz,alpha,theta,phi) -// - create polyhedron for G3 Para; -// polyhedron_tube (rmin,rmax,dz,nstep=0) -// - create polyhedron for G3 Tube; -// polyhedron_tubs (rmin,rmax,dz,phi1,dphi,nstep=0) -// - create polyhedron for G3 Tubs; -// polyhedron_cone (rmin1,rmax1,rmin2,rmax2,dz,nstep=0) -// - create polyhedron for G3 Cone; -// polyhedron_cons (rmin1,rmax1,rmin2,rmax2,dz,phi1,dphi,nstep=0) -// - create polyhedron for G3 Cons; -// polyhedron_pgon (phi,dphi,npdv,nz, z(*),rmin(*),rmax(*)) -// - create polyhedron for G3 Pgon; -// polyhedron_pcon (phi,dphi,nz, z(*),rmin(*),rmax(*)) -// - create polyhedron for G3 Pcon; -// polyhedron_sphere (rmin,rmax,phi,dphi,the,dthe,nstep=0) -// - create polyhedron for Sphere; -// polyhedron_torus (rmin,rmax,rtor,phi,dphi,nstep=0) -// - create polyhedron for Torus; -// Public functions: -// -// GetNoVertices () - returns number of vertices; -// GetNoFacets () - returns number of faces; -// GetNextVertexIndex (index,edgeFlag) - get vertex indeces of the -// quadrilaterals in order; -// returns false when finished each face; -// GetVertex (index) - returns vertex by index; -// GetNextVertex (vertex,edgeFlag) - get vertices with edge visibility -// of the quadrilaterals in order; -// returns false when finished each face; -// GetNextVertex (vertex,edgeFlag,normal) - get vertices with edge -// visibility and normal of the quadrilaterals -// in order; returns false when finished each face; -// GetNextEdgeIndeces (i1,i2,edgeFlag) - get indeces of the next edge; -// returns false for the last edge; -// GetNextEdgeIndeces (i1,i2,edgeFlag,iface1,iface2) - get indeces of -// the next edge with indeces of the faces -// to which the edge belongs; -// returns false for the last edge; -// GetNextEdge (p1,p2,edgeFlag) - get next edge; -// returns false for the last edge; -// GetNextEdge (p1,p2,edgeFlag,iface1,iface2) - get next edge with indeces -// of the faces to which the edge belongs; -// returns false for the last edge; -// GetFacet (index,n,nodes,edgeFlags=0,normals=0) - get face by index; -// GetNextFacet (n,nodes,edgeFlags=0,normals=0) - get next face with normals -// at the nodes; returns false for the last face; -// GetNormal (index) - get normal of face given by index; -// GetUnitNormal (index) - get unit normal of face given by index; -// GetNextNormal (normal) - get normals of each face in order; -// returns false when finished all faces; -// GetNextUnitNormal (normal) - get normals of unit length of each face -// in order; returns false when finished all faces; -// GetSurfaceArea() - get surface area of the polyhedron; -// GetVolume() - get volume of the polyhedron; -// GetNumberOfRotationSteps() - get number of steps for whole circle; -// SetNumberOfRotationSteps (n) - set number of steps for whole circle; -// ResetNumberOfRotationSteps() - reset number of steps for whole circle -// to default value; -// History: -// -// 20.06.96 Evgeni Chernyaev - initial version -// -// 23.07.96 John Allison -// - added GetNoVertices, GetNoFacets, GetNextVertex, GetNextNormal -// -// 30.09.96 E.Chernyaev -// - added GetNextVertexIndex, GetVertex by Yasuhide Sawada -// - added GetNextUnitNormal, GetNextEdgeIndeces, GetNextEdge -// - improvements: angles now expected in radians -// int -> G4int, double -> G4double -// - G4ThreeVector replaced by either G4Point3D or G4Normal3D -// -// 15.12.96 E.Chernyaev -// - private functions G4PolyhedronAlloc, G4PolyhedronPrism renamed -// to AllocateMemory and CreatePrism -// - added private functions GetNumberOfRotationSteps, RotateEdge, -// RotateAroundZ, SetReferences -// - rewritten G4PolyhedronCons; -// - added G4PolyhedronPara, ...Trap, ...Pgon, ...Pcon, ...Sphere, ...Torus, -// so full List of implemented shapes now looks like: -// BOX, TRD1, TRD2, TRAP, TUBE, TUBS, CONE, CONS, PARA, PGON, PCON, -// SPHERE, TORUS -// -// 01.06.97 E.Chernyaev -// - RotateAroundZ modified and SetSideFacets added to allow Rmin=Rmax -// in bodies of revolution -// -// 24.06.97 J.Allison -// - added static private member fNumberOfRotationSteps and static public -// functions void SetNumberOfRotationSteps (G4int n) and -// void ResetNumberOfRotationSteps (). Modified -// GetNumberOfRotationSteps() appropriately. Made all three functions -// inline (at end of this .hh file). -// Usage: -// G4Polyhedron::SetNumberOfRotationSteps -// (fpView -> GetViewParameters ().GetNoOfSides ()); -// pPolyhedron = solid.CreatePolyhedron (); -// G4Polyhedron::ResetNumberOfRotationSteps (); -// -// 19.03.00 E.Chernyaev -// - added boolean operations (add, subtract, intersect) on polyhedra; -// -// 25.05.01 E.Chernyaev -// - added GetSurfaceArea() and GetVolume(); -// - diff --git a/source/externals/g4tools/include/tools/hep/polyhedron.icc b/source/externals/g4tools/include/tools/hep/polyhedron.icc deleted file mode 100644 index dcb6d3d475..0000000000 --- a/source/externals/g4tools/include/tools/hep/polyhedron.icc +++ /dev/null @@ -1,2965 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - - -#include //G.Barrand : to have DBL_EPSILON on Windows. -#include - -#include "../mnmx" - -namespace tools { -namespace hep { - -// G.Barrand : introduce iabs to avoid a mess with cmath and some compiler. -inline int iabs(int a) { - return a < 0 ? -a : a; -} - -//--------------------------------------------------------------------// -// JFB: // -// polyhedron was polyhedron, retrofitted to Open Inventor // -// infrastructure: // -//--------------------------------------------------------------------// - - -// -// ******************************************************************** -// * DISCLAIMER * -// * * -// * The following disclaimer summarizes all the specific disclaimers * -// * of contributors to this software. The specific disclaimers,which * -// * govern, are listed with their locations in: * -// * http://cern.ch/geant4/license * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. * -// * * -// * This code implementation is the intellectual property of the * -// * GEANT4 collaboration. * -// * By copying, distributing or modifying the Program (or any work * -// * based on the Program) you indicate your acceptance of this * -// * statement, and all its terms. * -// ******************************************************************** -// -// -// -// -// -// G4 Polyhedron library -// -// History: -// 23.07.96 E.Chernyaev - initial version -// -// 30.09.96 E.Chernyaev -// - added GetNextVertexIndex, GetVertex by Yasuhide Sawada -// - added GetNextUnitNormal, GetNextEdgeIndeces, GetNextEdge -// -// 15.12.96 E.Chernyaev -// - added GetNumberOfRotationSteps, RotateEdge, RotateAroundZ, SetReferences -// - rewritten G4PolyhedronCons; -// - added G4PolyhedronPara, ...Trap, ...Pgon, ...Pcon, ...Sphere, ...Torus -// -// 01.06.97 E.Chernyaev -// - modified RotateAroundZ, added SetSideFacets -// -// 19.03.00 E.Chernyaev -// - implemented boolean operations (add, subtract, intersect) on polyhedra; -// -// 25.05.01 E.Chernyaev -// - added GetSurfaceArea() and GetVolume(); -// - - -/*********************************************************************** - * * - * Name: polyhedron operator << Date: 09.05.96 * - * Author: E.Chernyaev (IHEP/Protvino) Revised: * - * * - * Function: Print contents of G4 polyhedron * - * * - ***********************************************************************/ -inline int operator==(const SbFacet& v1, const SbFacet& v2) { //G.Barrand - for(int i=0;i<4;i++) { - if(v1.edge[i].v != v2.edge[i].v) return false; - if(v1.edge[i].f != v2.edge[i].f) return false; - } - return true; -} -inline int operator!=(const SbFacet& v1, const SbFacet& v2) { //G.Barrand - return !(v1 == v2); -} -inline std::ostream& operator<<(std::ostream & ostr, const SbFacet & facet) { - for (int k=0; k<4; k++) { - ostr << " " << facet.edge[k].v << "/" << facet.edge[k].f; - } - return ostr; -} -inline std::ostream& operator<<(std::ostream & ostr, const polyhedron & ph) { - ostr << std::endl; - ostr << "Nverteces=" << ph.nvert << ", Nfacets=" << ph.nface << std::endl; - int i; - for (i=1; i<=ph.nvert; i++) { - ostr << "xyz(" << i << ")=" - << ph.pV[i].v0() << ' ' << ph.pV[i].v1() << ' ' << ph.pV[i].v2() - << std::endl; - } - for (i=1; i<=ph.nface; i++) { - ostr << "face(" << i << ")=" << ph.pF[i] << std::endl; - } - return ostr; -} - -inline polyhedron::polyhedron(const polyhedron &from) -/*********************************************************************** - * * - * Name: polyhedron copy constructor Date: 23.07.96 * - * Author: E.Chernyaev (IHEP/Protvino) Revised: * - * * - ***********************************************************************/ -{ -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - //m_name = 0; //G.Barrand - //if(from.m_name) m_name = new std::string(*from.m_name); //G.Barrand - - if (from.nvert > 0 && from.nface > 0) { - nvert = from.nvert; - nface = from.nface; - pV = new HVPoint3D[nvert + 1]; - pF = new SbFacet[nface + 1]; - int i; - for (i=1; i<=nvert; i++) pV[i] = from.pV[i]; - for (i=1; i<=nface; i++) pF[i] = from.pF[i]; - }else{ - nvert = 0; nface = 0; pV = 0; pF = 0; - } - fNumberOfRotationSteps = from.fNumberOfRotationSteps; -} - -inline int operator==(const polyhedron& v1,const polyhedron& v2) { //G.Barrand - return v1.isEqual(v2); -} -inline int operator!=(const polyhedron& v1,const polyhedron& v2) { //G.Barrand - return !(v1 == v2); -} - -inline polyhedron & polyhedron::operator=(const polyhedron &from) -/*********************************************************************** - * * - * Name: polyhedron operator = Date: 23.07.96 * - * Author: E.Chernyaev (IHEP/Protvino) Revised: * - * * - * Function: Copy contents of one GEANT4 polyhedron to another * - * * - ***********************************************************************/ -{ - if (this == &from) { -// ::printf("debug : polyhedron::operaot=() : on same object\n"); -// std::cerr << "polyhedron::operaot=() :" -// << " on same object !" -// << std::endl; - return *this; - } - - //delete m_name;m_name = 0; //G.Barrand - //if(from.m_name) m_name = new std::string(*from.m_name); //G.Barrand - - delete [] pV; - delete [] pF; - if (from.nvert > 0 && from.nface > 0) { - nvert = from.nvert; - nface = from.nface; - pV = new HVPoint3D[nvert + 1]; - pF = new SbFacet[nface + 1]; - int i; - for (i=1; i<=nvert; i++) pV[i] = from.pV[i]; - for (i=1; i<=nface; i++) pF[i] = from.pF[i]; - }else{ - nvert = 0; nface = 0; pV = 0; pF = 0; - } - fNumberOfRotationSteps = from.fNumberOfRotationSteps; - return *this; -} - -//G.Barrand -inline bool polyhedron::isEqual(const polyhedron &from) const { - if (this == &from) return true; - if(nvert!=from.nvert) return false; - if(nface!=from.nface) return false; - int i; - for (i=1; i<=nvert; i++) { - if(pV[i]!=from.pV[i]) return false; - } - for (i=1; i<=nface; i++) { - if(!pF[i].isEqual(from.pF[i])) return false; - } - return true; -} -inline bool polyhedron::isConsistent(const char*) const { - for(int i=1;i<=nface;i++) { - const SbFacet& facet = pF[i]; - for(int j=0;j<4;j++) { - int v,f; - facet.GetEdge(j,v,f); - if(iabs(v)>nvert) return false; - if(iabs(f)>nvert) return false; - } - } - return true; -} -inline void polyhedron::dump(std::ostream& a_out) const { - a_out << " nface = " << nface << std::endl; - for(int i=1;i<=nface;i++) { - const SbFacet& facet = pF[i]; - for(int j=0;j<4;j++) { - int v,f; - facet.GetEdge(j,v,f); - a_out << " " << v << " " << f << std::endl; - } - } -} - -inline int polyhedron::FindNeighbour(int iFace, int iNode, int iOrder) const -/*********************************************************************** - * * - * Name: polyhedron::FindNeighbour Date: 22.11.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Find neighbouring face * - * * - ***********************************************************************/ -{ - int i; - for (i=0; i<4; i++) { - if (iNode == iabs(pF[iFace].edge[i].v)) break; - } - if (i == 4) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "polyhedron::FindNeighbour: face " << iFace - << " has no node " << iNode - << std::endl; -#endif - return 0; - } - if (iOrder < 0) { - if ( --i < 0) i = 3; - if (pF[iFace].edge[i].v == 0) i = 2; - } - return (pF[iFace].edge[i].v > 0) ? 0 : pF[iFace].edge[i].f; -} - -inline HVNormal3D polyhedron::FindNodeNormal(int iFace, int iNode) const -/*********************************************************************** - * * - * Name: polyhedron::FindNodeNormal Date: 22.11.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Find normal at given node * - * * - ***********************************************************************/ -{ - HVNormal3D normal = GetUnitNormal(iFace); - int k = iFace, iOrder = 1, n = 1; - - for(;;) { - k = FindNeighbour(k, iNode, iOrder); - if (k == iFace) break; - if (k > 0) { - n++; - normal += GetUnitNormal(k); - }else{ - if (iOrder < 0) break; - k = iFace; - iOrder = -iOrder; - } - } - normal.normalize(); - return normal; -} - -inline void polyhedron::SetNumberOfRotationSteps(int n) -/*********************************************************************** - * * - * Name: polyhedron::SetNumberOfRotationSteps Date: 24.06.97 * - * Author: J.Allison (Manchester University) Revised: * - * * - * Function: Set number of steps for whole circle * - * * - ***********************************************************************/ -{ - const int nMin = 3; - if (n < nMin) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "polyhedron::SetNumberOfRotationSteps: attempt to set the\n" - << "number of steps per circle < " << nMin << "; forced to " << nMin - << std::endl; -#endif - fNumberOfRotationSteps = nMin; - }else{ - fNumberOfRotationSteps = n; - } -} - -inline void polyhedron::AllocateMemory(int Nvert, int Nface) -/*********************************************************************** - * * - * Name: polyhedron::AllocateMemory Date: 19.06.96 * - * Author: E.Chernyaev (IHEP/Protvino) Revised: * - * * - * Function: Allocate memory for GEANT4 polyhedron * - * * - * Input: Nvert - number of nodes * - * Nface - number of faces * - * * - ***********************************************************************/ -{ - nvert = Nvert; - nface = Nface; - pV = new HVPoint3D[nvert+1]; - pF = new SbFacet[nface+1]; -} - -inline void polyhedron::CreatePrism() -/*********************************************************************** - * * - * Name: polyhedron::CreatePrism Date: 15.07.96 * - * Author: E.Chernyaev (IHEP/Protvino) Revised: * - * * - * Function: Set facets for a prism * - * * - ***********************************************************************/ -{ - enum {DUMMY, BOTTOM, LEFT, BACK, RIGHT, FRONT, TOP}; - - pF[1] = SbFacet(1,LEFT, 4,BACK, 3,RIGHT, 2,FRONT); - pF[2] = SbFacet(5,TOP, 8,BACK, 4,BOTTOM, 1,FRONT); - pF[3] = SbFacet(8,TOP, 7,RIGHT, 3,BOTTOM, 4,LEFT); - pF[4] = SbFacet(7,TOP, 6,FRONT, 2,BOTTOM, 3,BACK); - pF[5] = SbFacet(6,TOP, 5,LEFT, 1,BOTTOM, 2,RIGHT); - pF[6] = SbFacet(5,FRONT, 6,RIGHT, 7,BACK, 8,LEFT); -} - -inline void polyhedron::RotateEdge(int k1, int k2, double r1, double r2, - int v1, int v2, int vEdge, - bool ifWholeCircle, int ns, int &kface) -/*********************************************************************** - * * - * Name: polyhedron::RotateEdge Date: 05.12.96 * - * Author: E.Chernyaev (IHEP/Protvino) Revised: * - * * - * Function: Create set of facets by rotation of an edge around Z-axis * - * * - * Input: k1, k2 - end vertices of the edge * - * r1, r2 - radiuses of the end vertices * - * v1, v2 - visibility of edges produced by rotation of the end * - * vertices * - * vEdge - visibility of the edge * - * ifWholeCircle - is true in case of whole circle rotation * - * ns - number of discrete steps * - * r[] - r-coordinates * - * kface - current free cell in the pF array * - * * - ***********************************************************************/ -{ - if (r1 == 0. && r2 == 0) return; - - int i; - int i1 = k1; - int i2 = k2; - int ii1 = ifWholeCircle ? i1 : i1+ns; - int ii2 = ifWholeCircle ? i2 : i2+ns; - int vv = ifWholeCircle ? vEdge : 1; - - if (ns == 1) { - if (r1 == 0.) { - pF[kface++] = SbFacet(i1,0, v2*i2,0, (i2+1),0); - }else if (r2 == 0.) { - pF[kface++] = SbFacet(i1,0, i2,0, v1*(i1+1),0); - }else{ - pF[kface++] = SbFacet(i1,0, v2*i2,0, (i2+1),0, v1*(i1+1),0); - } - }else{ - if (r1 == 0.) { - pF[kface++] = SbFacet(vv*i1,0, v2*i2,0, vEdge*(i2+1),0); - for (i2++,i=1; i>> -z for both polylines) * - * r[] - r-coordinates * - * nodeVis - how to Draw edges joing consecutive positions of * - * node during rotation * - * edgeVis - how to Draw edges * - * * - ***********************************************************************/ -{ - static const double wholeCircle = 2*_M_PI(); //G.Barrand : const - - // S E T R O T A T I O N P A R A M E T E R S - - const double perMillion = 0.000001; - - bool ifWholeCircle = (std::fabs(dphi-wholeCircle) < perMillion) ? - true : false; - double delPhi = ifWholeCircle ? wholeCircle : dphi; - - int n_step = (nstep > 0) ? nstep : GetNumberOfRotationSteps(); //G.Barrand - int nSphi = int(delPhi*n_step/wholeCircle+.5); - - if (nSphi == 0) nSphi = 1; - int nVphi = ifWholeCircle ? nSphi : nSphi+1; - bool ifClosed = np1 > 0 ? false : true; - - // C O U N T V E R T E C E S - - int absNp1 = iabs(np1); - int absNp2 = iabs(np2); - int i1beg = 0; - int i1end = absNp1-1; - int i2beg = absNp1; - int i2end = absNp1+absNp2-1; - int i, j, k; - - for(i=i1beg; i<=i2end; i++) { - if (std::fabs(r[i]) < perMillion) r[i] = 0.; - } - - j = 0; // external nodes - for (i=i1beg; i<=i1end; i++) { - j += (r[i] == 0.) ? 1 : nVphi; - } - - bool ifSide1 = false; // internal nodes - bool ifSide2 = false; - - if (r[i2beg] != r[i1beg] || z[i2beg] != z[i1beg]) { - j += (r[i2beg] == 0.) ? 1 : nVphi; - ifSide1 = true; - } - - for(i=i2beg+1; i 1) j += (r[i2end] == 0.) ? 1 : nVphi; - ifSide2 = true; - } - - // C O U N T F A C E S - - k = ifClosed ? absNp1*nSphi : (absNp1-1)*nSphi; // external faces - - if (absNp2 > 1) { // internal faces - for(i=i2beg; i 0. || r[i+1] > 0.) k += nSphi; - } - - if (ifClosed) { - if (r[i2end] > 0. || r[i2beg] > 0.) k += nSphi; - } - } - - if (!ifClosed) { // side faces - if (ifSide1 && (r[i1beg] > 0. || r[i2beg] > 0.)) k += nSphi; - if (ifSide2 && (r[i1end] > 0. || r[i2end] > 0.)) k += nSphi; - } - - if (!ifWholeCircle) { // phi_side faces - k += ifClosed ? 2*absNp1 : 2*(absNp1-1); - } - - // A L L O C A T E M E M O R Y - - AllocateMemory(j, k); - - // G E N E R A T E V E R T E C E S - - int *kk; - kk = new int[absNp1+absNp2]; - - k = 1; - for(i=i1beg; i<=i1end; i++) { - kk[i] = k; - if (r[i] == 0.) { pV[k++] = HVPoint3D(0, 0, z[i]); } else { k += nVphi; } - } - - i = i2beg; - if (ifSide1) { - kk[i] = k; - if (r[i] == 0.) { pV[k++] = HVPoint3D(0, 0, z[i]); } else { k += nVphi; } - }else{ - kk[i] = kk[i1beg]; - } - - for(i=i2beg+1; i 1) { - i = i2end; - if (ifSide2) { - kk[i] = k; - if (r[i] == 0.) pV[k] = HVPoint3D(0, 0, z[i]); - }else{ - kk[i] = kk[i1end]; - } - } - - double cosPhi, sinPhi; - - for(j=0; j 1) { - v2 = ifClosed ? nodeVis : 1; - for(i=i2beg; iedge[3].v == 0) ? 3 : 4; -#endif - for (iedge=0; iedge i2) ? i1 : i2; // k2 = ::max(i1,i2); -#else - i1 = iabs(pF_iface->edge[i1].v); - i2 = iabs(pF_iface->edge[i2].v); - if(i1next; - cur = headList[k1]; -#else - *hpos = freeList; - freeList = freeList->next; - cur = *hpos; -#endif - cur->next = 0; - cur->v2 = k2; - cur->iface = iface; - cur->iedge = iedge; - continue; - } - - if (cur->v2 == k2) { -#ifdef TOOLS_HEP_PH_NOT_OPT - headList[k1] = cur->next; -#else - *hpos = cur->next; -#endif - cur->next = freeList; - freeList = cur; -#ifdef TOOLS_HEP_PH_NOT_OPT - pF[iface].edge[iedge].f = cur->iface; - pF[cur->iface].edge[cur->iedge].f = iface; - i1 = (pF[iface].edge[iedge].v < 0) ? -1 : 1; - i2 = (pF[cur->iface].edge[cur->iedge].v < 0) ? -1 : 1; -#else - pF_iface->edge[iedge].f = cur->iface; - pF_cur_iface = pF+cur->iface; - pF_cur_iface->edge[cur->iedge].f = iface; - i1 = (pF_iface->edge[iedge].v < 0) ? -1 : 1; - i2 = (pF_cur_iface->edge[cur->iedge].v < 0) ? -1 : 1; -#endif - if (i1 != i2) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "Polyhedron::SetReferences: different edge visibility " - << iface << "/" << iedge << "/" - << pF[iface].edge[iedge].v << " and " - << cur->iface << "/" << cur->iedge << "/" - << pF[cur->iface].edge[cur->iedge].v - << std::endl; -#endif - } - continue; - } - - // check List itself - for (;;) { - prev = cur; - cur = prev->next; - if (cur == 0) { - prev->next = freeList; - freeList = freeList->next; - cur = prev->next; - cur->next = 0; - cur->v2 = k2; - cur->iface = iface; - cur->iedge = iedge; - break; - } - - if (cur->v2 == k2) { - prev->next = cur->next; - cur->next = freeList; - freeList = cur; -#ifdef TOOLS_HEP_PH_NOT_OPT - pF[iface].edge[iedge].f = cur->iface; - pF[cur->iface].edge[cur->iedge].f = iface; - i1 = (pF[iface].edge[iedge].v < 0) ? -1 : 1; - i2 = (pF[cur->iface].edge[cur->iedge].v < 0) ? -1 : 1; -#else - pF_iface->edge[iedge].f = cur->iface; - pF_cur_iface = pF+cur->iface; - pF_cur_iface->edge[cur->iedge].f = iface; - i1 = (pF_iface->edge[iedge].v < 0) ? -1 : 1; - i2 = (pF_cur_iface->edge[cur->iedge].v < 0) ? -1 : 1; -#endif - if (i1 != i2) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "Polyhedron::SetReferences: different edge visibility " - << iface << "/" << iedge << "/" - << pF[iface].edge[iedge].v << " and " - << cur->iface << "/" << cur->iedge << "/" - << pF[cur->iface].edge[cur->iedge].v - << std::endl; -#endif - } - break; - } - } - } - } - - // C H E C K T H A T A L L L I S T S A R E E M P T Y - -#ifdef TOOLS_HEP_PH_OUT_ERR -#ifdef TOOLS_HEP_PH_NOT_OPT - for (i=0; i 0) { - for (int i=1; i<=nvert; i++) { - const HVPoint3D& pv = pV[i]; - SbVec3f tmp; - rotation.multVec(SbVec3f(pv[0],pv[1],pv[2]),tmp); - pV[i] = HVPoint3D(tmp[0],tmp[1],tmp[2]) - +HVPoint3D(translation[0],translation[1],translation[2]); - } - - // C H E C K D E T E R M I N A N T A N D - // I N V E R T F A C E T S I F I T I S N E G A T I V E - - //FIXME : have the below done in double. - SbVec3f x; rotation.multVec(SbVec3f(1,0,0),x); - SbVec3f y; rotation.multVec(SbVec3f(0,1,0),y); - SbVec3f z; rotation.multVec(SbVec3f(0,0,1),z); - if ((x.cross(y)).dot(z) < 0) InvertFacets(); - } - return *this; -} -*/ - -/*G.Barrand : optimized version.*/ -inline polyhedron & polyhedron::Translate( - double a_x -,double a_y -,double a_z -) -{ - if (nvert > 0) { - for (int i=1; i<=nvert; i++) { - const HVPoint3D& p = pV[i]; - pV[i].set_value(p.x()+a_x,p.y()+a_y,p.z()+a_z); - } - } - return *this; -} - -inline polyhedron & polyhedron::Transform(const rotd& rotation,double a_x,double a_y,double a_z) { - if (nvert > 0) { - {double x,y,z; - for (int i=1; i<=nvert; i++) { - HVPoint3D& p = pV[i]; - x = p.x(); - y = p.y(); - z = p.z(); - rotation.mul_3(x,y,z); //tmp = R*pV[i] - p.set_value(x+a_x,y+a_y,z+a_z); - }} - - double x_x = 1; - double x_y = 0; - double x_z = 0; - rotation.mul_3(x_x,x_y,x_z); - - double y_x = 0; - double y_y = 1; - double y_z = 0; - rotation.mul_3(y_x,y_y,y_z); - - double z_x = 0; - double z_y = 0; - double z_z = 1; - rotation.mul_3(z_x,z_y,z_z); - - // x_x y_x - // x_y y_y - // x_z y_z - double x_cross_y_x = x_y*y_z-x_z*y_y; - double x_cross_y_y = x_z*y_x-x_x*y_z; - double x_cross_y_z = x_x*y_y-x_y*y_x; - - double x_cross_y_dot_z = - x_cross_y_x*z_x + x_cross_y_y*z_y + x_cross_y_z*z_z; - if (x_cross_y_dot_z < 0) InvertFacets(); - } - return *this; -} - -inline polyhedron & polyhedron::Transform(const rotd& rotation,const vec3d& translation) { -/* - if (nvert > 0) { - vec3d tmp; - for (int i=1; i<=nvert; i++) { - rotation.mul_vec(pV[i],tmp); //tmp = R*pV[i] - pV[i] = tmp+translation; - } - vec3d x; rotation.mul_vec(vec3d::s_x(),x); - vec3d y; rotation.mul_vec(vec3d::s_y(),y); - vec3d z; rotation.mul_vec(vec3d::s_z(),z); - if ((x.cross(y)).dot(z) < 0) InvertFacets(); - } -*/ - return Transform(rotation,translation.x(),translation.y(),translation.z()); -} - -/*G.Barrand : inline -bool polyhedron::GetNextVertexIndex(int &index, int &edgeFlag) const -// *********************************************************************** -// * * -// * Name: polyhedron::GetNextVertexIndex Date: 03.09.96 * -// * Author: Yasuhide Sawada Revised: * -// * * -// * Function: * -// * * -// *********************************************************************** -{ - static int iFace = 1; - static int iQVertex = 0; - int vIndex = pF[iFace].edge[iQVertex].v; - - edgeFlag = (vIndex > 0) ? 1 : 0; - index = iabs(vIndex); - - if(index>nvert) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr << "polyhedron::GetNextVertexIndex: pV index problem " - << index << " exceed " << nvert << std::endl; -#endif - index = 0; - } - - if (iQVertex >= 3 || pF[iFace].edge[iQVertex+1].v == 0) { - iQVertex = 0; - if (++iFace > nface) iFace = 1; - return false; // Last Edge - }else{ - ++iQVertex; - return true; // not Last Edge - } -} -*/ - -inline HVPoint3D polyhedron::GetVertex(int index) const -/*********************************************************************** - * * - * Name: polyhedron::GetVertex Date: 03.09.96 * - * Author: Yasuhide Sawada Revised: 17.11.99 * - * * - * Function: Get vertex of the index. * - * * - ***********************************************************************/ -{ - if (index <= 0 || index > nvert) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "polyhedron::GetVertex: irrelevant index " << index - << std::endl; -#endif - return HVPoint3D(); - } - return pV[index]; -} - -inline const HVPoint3D& polyhedron::GetVertexFast(int index) const {//G.Barrand - return pV[index]; -} - -inline bool polyhedron::GetNextVertex(HVPoint3D &vertex, int &edgeFlag) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextVertex Date: 22.07.96 * - * Author: John Allison Revised: * - * * - * Function: Get vertices of the quadrilaterals in order for each * - * face in face order. Returns false when finished each * - * face. * - * * - ***********************************************************************/ -{ - int index; - bool rep = GetNextVertexIndex(index, edgeFlag); - vertex = pV[index]; - return rep; -} - -inline bool polyhedron::GetNextVertex(HVPoint3D &vertex, int &edgeFlag,HVNormal3D &normal) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextVertex Date: 26.11.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get vertices with normals of the quadrilaterals in order * - * for each face in face order. * - * Returns false when finished each face. * - * * - ***********************************************************************/ -{ - static int iFace = 1; - static int iNode = 0; - - if (nface == 0) return false; // empty polyhedron - - int k = pF[iFace].edge[iNode].v; - if (k > 0) { edgeFlag = 1; } else { edgeFlag = -1; k = -k; } - vertex = pV[k]; - normal = FindNodeNormal(iFace,k); - if (iNode >= 3 || pF[iFace].edge[iNode+1].v == 0) { - iNode = 0; - if (++iFace > nface) iFace = 1; - return false; // last node - }else{ - ++iNode; - return true; // not last node - } -} - -inline bool polyhedron::GetNextEdgeIndeces(int &i1, int &i2, int &edgeFlag, - int &iface1, int &iface2) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextEdgeIndeces Date: 30.09.96 * - * Author: E.Chernyaev Revised: 17.11.99 * - * * - * Function: Get indeces of the next edge together with indeces of * - * of the faces which share the edge. * - * Returns false when the last edge. * - * * - ***********************************************************************/ -{ - static int iFace = 1; - static int iQVertex = 0; - static int iOrder = 1; - int k1, k2, kflag, kface1, kface2; - - if (iFace == 1 && iQVertex == 0) { - k2 = pF[nface].edge[0].v; - k1 = pF[nface].edge[3].v; - if (k1 == 0) k1 = pF[nface].edge[2].v; - if (iabs(k1) > iabs(k2)) iOrder = -1; - } - - do { - k1 = pF[iFace].edge[iQVertex].v; - kflag = k1; - k1 = iabs(k1); - kface1 = iFace; - kface2 = pF[iFace].edge[iQVertex].f; - if (iQVertex >= 3 || pF[iFace].edge[iQVertex+1].v == 0) { - iQVertex = 0; - k2 = iabs(pF[iFace].edge[iQVertex].v); - iFace++; - }else{ - iQVertex++; - k2 = iabs(pF[iFace].edge[iQVertex].v); - } - } while (iOrder*k1 > iOrder*k2); - - i1 = k1; i2 = k2; edgeFlag = (kflag > 0) ? 1 : 0; - iface1 = kface1; iface2 = kface2; - - if (iFace > nface) { - iFace = 1; iOrder = 1; - return false; - }else{ - return true; - } -} - -inline bool polyhedron::GetNextEdgeIndeces(int &i1, int &i2, int &edgeFlag) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextEdgeIndeces Date: 17.11.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get indeces of the next edge. * - * Returns false when the last edge. * - * * - ***********************************************************************/ -{ - int kface1, kface2; - return GetNextEdgeIndeces(i1, i2, edgeFlag, kface1, kface2); -} - -inline bool polyhedron::GetNextEdge(HVPoint3D &p1,HVPoint3D &p2,int &edgeFlag) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextEdge Date: 30.09.96 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get next edge. * - * Returns false when the last edge. * - * * - ***********************************************************************/ -{ - int i1,i2; - bool rep = GetNextEdgeIndeces(i1,i2,edgeFlag); - p1 = pV[i1]; - p2 = pV[i2]; - return rep; -} - -inline bool polyhedron::GetNextEdge(HVPoint3D &p1, HVPoint3D &p2,int &edgeFlag, int &iface1, int &iface2) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextEdge Date: 17.11.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get next edge with indeces of the faces which share * - * the edge. * - * Returns false when the last edge. * - * * - ***********************************************************************/ -{ - int i1,i2; - bool rep = GetNextEdgeIndeces(i1,i2,edgeFlag,iface1,iface2); - p1 = pV[i1]; - p2 = pV[i2]; - return rep; -} - -inline void polyhedron::GetFacet(int iFace, int &n, int *iNodes,int *edgeFlags, int *iFaces) const -/*********************************************************************** - * * - * Name: polyhedron::GetFacet Date: 15.12.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get face by index * - * * - ***********************************************************************/ -{ - if (iFace < 1 || iFace > nface) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "polyhedron::GetFacet: irrelevant index " << iFace - << std::endl; -#endif - n = 0; - }else{ - int i, k; - for (i=0; i<4; i++) { - k = pF[iFace].edge[i].v; - if (k == 0) break; - if (iFaces != 0) iFaces[i] = pF[iFace].edge[i].f; - if (k > 0) { - iNodes[i] = k; - if (edgeFlags != 0) edgeFlags[i] = 1; - }else{ - iNodes[i] = -k; - if (edgeFlags != 0) edgeFlags[i] = -1; - } - } - n = i; - } -} - -inline void polyhedron::GetFacet(int index, int &n, HVPoint3D *nodes,int *edgeFlags, HVNormal3D *normals) const -/*********************************************************************** - * * - * Name: polyhedron::GetFacet Date: 17.11.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get face by index * - * * - ***********************************************************************/ -{ - int iNodes[4]; - GetFacet(index, n, iNodes, edgeFlags); - if (n != 0) { - for (int i=0; i<4; i++) { - nodes[i] = pV[iNodes[i]]; - if (normals != 0) normals[i] = FindNodeNormal(index,iNodes[i]); - } - } -} - -inline bool polyhedron::GetNextFacet(int &n, HVPoint3D *nodes,int *edgeFlags, HVNormal3D *normals) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextFacet Date: 19.11.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get next face with normals of unit length at the nodes. * - * Returns false when finished all faces. * - * * - ***********************************************************************/ -{ - static int iFace = 1; - - if (edgeFlags == 0) { - GetFacet(iFace, n, nodes); - }else if (normals == 0) { - GetFacet(iFace, n, nodes, edgeFlags); - }else{ - GetFacet(iFace, n, nodes, edgeFlags, normals); - } - - if (++iFace > nface) { - iFace = 1; - return false; - }else{ - return true; - } -} - -//G.Barrand -#ifdef TOOLS_HEP_PH_OUT_ERR -inline bool polyhedron::CHECK_INDEX(const char* a_method,int a_index) const { - if(a_index>nvert) { - std::cerr << "polyhedron::" << a_method << " :" - << " index problem. " - << a_index << " exceed " << nvert << std::endl; - return false; - } - return true; -} -#else -inline bool polyhedron::CHECK_INDEX(const char*,int a_index) const { - if(a_index>nvert) { - return false; - } - return true; -} -#endif - -inline HVNormal3D polyhedron::GetNormal(int iFace) const -/*********************************************************************** - * * - * Name: polyhedron::GetNormal Date: 19.11.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get normal of the face given by index * - * * - ***********************************************************************/ -{ - if (iFace < 1 || iFace > nface) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "polyhedron::GetNormal: irrelevant index " << iFace - << std::endl; -#endif - return HVNormal3D(); - } - - int i0 = iabs(pF[iFace].edge[0].v); - int i1 = iabs(pF[iFace].edge[1].v); - int i2 = iabs(pF[iFace].edge[2].v); - int i3 = iabs(pF[iFace].edge[3].v); - if (i3 == 0) i3 = i0; - - if(!CHECK_INDEX("GetNormal",i0)) return HVNormal3D(); - if(!CHECK_INDEX("GetNormal",i1)) return HVNormal3D(); - if(!CHECK_INDEX("GetNormal",i2)) return HVNormal3D(); - if(!CHECK_INDEX("GetNormal",i3)) return HVNormal3D(); - - HVNormal3D nm; - (pV[i2] - pV[i0]).cross(pV[i3] - pV[i1],nm); - return nm; -} - -inline HVNormal3D polyhedron::GetUnitNormal(int iFace) const -/*********************************************************************** - * * - * Name: polyhedron::GetNormal Date: 19.11.99 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get unit normal of the face given by index * - * * - ***********************************************************************/ -{ - if (iFace < 1 || iFace > nface) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "polyhedron::GetUnitNormal: irrelevant index " << iFace - << std::endl; -#endif - return HVNormal3D(); - } - - int i0 = iabs(pF[iFace].edge[0].v); - int i1 = iabs(pF[iFace].edge[1].v); - int i2 = iabs(pF[iFace].edge[2].v); - int i3 = iabs(pF[iFace].edge[3].v); - if (i3 == 0) i3 = i0; - - if(!CHECK_INDEX("GetUnitNormal",i0)) return HVNormal3D(); - if(!CHECK_INDEX("GetUnitNormal",i1)) return HVNormal3D(); - if(!CHECK_INDEX("GetUnitNormal",i2)) return HVNormal3D(); - if(!CHECK_INDEX("GetUnitNormal",i3)) return HVNormal3D(); - - HVNormal3D nm; - (pV[i2] - pV[i0]).cross(pV[i3] - pV[i1],nm); - nm.normalize(); - return nm; -} - -inline bool polyhedron::GetNextNormal(HVNormal3D &normal) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextNormal Date: 22.07.96 * - * Author: John Allison Revised: 19.11.99 * - * * - * Function: Get normals of each face in face order. Returns false * - * when finished all faces. * - * * - ***********************************************************************/ -{ - static int iFace = 1; - normal = GetNormal(iFace); - if (++iFace > nface) { - iFace = 1; - return false; - }else{ - return true; - } -} - -inline bool polyhedron::GetNextUnitNormal(HVNormal3D &normal) const -/*********************************************************************** - * * - * Name: polyhedron::GetNextUnitNormal Date: 16.09.96 * - * Author: E.Chernyaev Revised: * - * * - * Function: Get normals of unit length of each face in face order. * - * Returns false when finished all faces. * - * * - ***********************************************************************/ -{ - bool rep = GetNextNormal(normal); - normal.normalize(); - return rep; -} - -inline double polyhedron::GetSurfaceArea() const -/*********************************************************************** - * * - * Name: polyhedron::GetSurfaceArea Date: 25.05.01 * - * Author: E.Chernyaev Revised: * - * * - * Function: Returns area of the surface of the polyhedron. * - * * - ***********************************************************************/ -{ - double s = 0.; - HVPoint3D p; - for (int iFace=1; iFace<=nface; iFace++) { - int i0 = iabs(pF[iFace].edge[0].v); - int i1 = iabs(pF[iFace].edge[1].v); - int i2 = iabs(pF[iFace].edge[2].v); - int i3 = iabs(pF[iFace].edge[3].v); - if (i3 == 0) i3 = i0; - (pV[i2] - pV[i0]).cross(pV[i3] - pV[i1],p); - s += p.length(); - } - return s/2.; -} - -inline double polyhedron::GetVolume() const -/*********************************************************************** - * * - * Name: polyhedron::GetVolume Date: 25.05.01 * - * Author: E.Chernyaev Revised: * - * * - * Function: Returns volume of the polyhedron. * - * * - ***********************************************************************/ -{ - double v = 0.; - HVPoint3D p; - for (int iFace=1; iFace<=nface; iFace++) { - int i0 = iabs(pF[iFace].edge[0].v); - int i1 = iabs(pF[iFace].edge[1].v); - int i2 = iabs(pF[iFace].edge[2].v); - int i3 = iabs(pF[iFace].edge[3].v); - HVPoint3D g; - if (i3 == 0) { - i3 = i0; - g = (pV[i0]+pV[i1]+pV[i2]) * (1.0/3.0); - }else{ - g = (pV[i0]+pV[i1]+pV[i2]+pV[i3]) * 0.25; - } - (pV[i2] - pV[i0]).cross(pV[i3] - pV[i1],p); - v += p.dot(g); - } - return v/6.; -} - -//G.Barrand -inline -bool polyhedron::set_polyhedron_trd2(double Dx1, double Dx2, - double Dy1, double Dy2, - double Dz) -/*********************************************************************** - * * - * Name: polyhedron_trd2 Date: 22.07.96 * - * Author: E.Chernyaev (IHEP/Protvino) Revised: * - * * - * Function: Create GEANT4 TRD2-trapezoid * - * * - * Input: Dx1 - half-length along X at -Dz 8----7 * - * Dx2 - half-length along X ay +Dz 5----6 ! * - * Dy1 - half-length along Y ay -Dz ! 4-!--3 * - * Dy2 - half-length along Y ay +Dz 1----2 * - * Dz - half-length along Z * - * * - ***********************************************************************/ -{ - _clear(); //G.Barrand - - //From TGeoTrd2::Capacity() : - double capacity = 2*(Dx1+Dx2)*(Dy1+Dy2)*Dz + - (2./3.)*(Dx1-Dx2)*(Dy1-Dy2)*Dz; - - //if(//(Dx1<=0.0)||(Dx2<=0.0)|| - // //(Dy1<=0.0)||(Dy2<=0.0)|| - // (Dz<=0.0)){ //G.Barrand - if(capacity<=0) { -#if defined(TOOLS_HEP_PH_OUT_ERR) || defined(TOOLS_HEP_PH_OUT_ERR_TRD2) - std::cerr << "set_polyhedron_trd2: error in input parameters"; - std::cerr << " Dx1=" << Dx1 - << " Dx2=" << Dx2 - << " Dy1=" << Dy1 - << " Dy2=" << Dy2 - << " Dz=" << Dz - << std::endl; -#endif - return false; - } - - AllocateMemory(8,6); - - pV[1] = HVPoint3D(-Dx1,-Dy1,-Dz); - pV[2] = HVPoint3D( Dx1,-Dy1,-Dz); - pV[3] = HVPoint3D( Dx1, Dy1,-Dz); - pV[4] = HVPoint3D(-Dx1, Dy1,-Dz); - pV[5] = HVPoint3D(-Dx2,-Dy2, Dz); - pV[6] = HVPoint3D( Dx2,-Dy2, Dz); - pV[7] = HVPoint3D( Dx2, Dy2, Dz); - pV[8] = HVPoint3D(-Dx2, Dy2, Dz); - - CreatePrism(); - - return true; -} - -inline -polyhedron_trd2::polyhedron_trd2(double Dx1, double Dx2, - double Dy1, double Dy2, - double Dz) -{ - set_polyhedron_trd2(Dx1,Dx2,Dy1,Dy2,Dz); //G.Barrand -} - -//G.Barrand -inline -bool polyhedron::set_polyhedron_arb8(double Dz,const double* xy) { - _clear(); //G.Barrand - - // xy as if xy[8][2] - // then xy[i][j] = xy[i*2+j] - - // from TGeoArb8::Capacity() : - double capacity = 0; - {int j; - for(int i=0; i<4; i++) { - j = (i+1)%4; - capacity += - 0.25*Dz*((vxy(xy,i,0)+vxy(xy,i+4,0))*(vxy(xy,j,1)+vxy(xy,j+4,1)) - - (vxy(xy,j,0)+vxy(xy,j+4,0))*(vxy(xy,i,1)+vxy(xy,i+4,1)) + - (1./3)*((vxy(xy,i+4,0)-vxy(xy,i,0))*(vxy(xy,j+4,1)-vxy(xy,j,1)) - - (vxy(xy,j,0)-vxy(xy,j+4,0))*(vxy(xy,i,1)-vxy(xy,i+4,1)))); - } - capacity = ::fabs(capacity);} - if(capacity<=0) { - return false; - } - - AllocateMemory(8,6); - - pV[1] = HVPoint3D( vxy(xy,0,0), vxy(xy,0,1),-Dz); - pV[2] = HVPoint3D( vxy(xy,1,0), vxy(xy,1,1),-Dz); - pV[3] = HVPoint3D( vxy(xy,2,0), vxy(xy,2,1),-Dz); - pV[4] = HVPoint3D( vxy(xy,3,0), vxy(xy,3,1),-Dz); - pV[5] = HVPoint3D( vxy(xy,4,0), vxy(xy,4,1), Dz); - pV[6] = HVPoint3D( vxy(xy,5,0), vxy(xy,5,1), Dz); - pV[7] = HVPoint3D( vxy(xy,6,0), vxy(xy,6,1), Dz); - pV[8] = HVPoint3D( vxy(xy,7,0), vxy(xy,7,1), Dz); - - CreatePrism(); - - return true; -} - -inline -polyhedron_arb8::polyhedron_arb8(double Dz,const double* xy) -{ - set_polyhedron_arb8(Dz,xy); //G.Barrand -} - -//G.Barrand -inline -int polyhedron::_ixy( - int a_ixy -,int a_npts -,int a_iz -,int a_nz -,bool a_acw -,bool a_zfb -){ - if(a_acw) { - if(a_zfb) { - return a_iz*a_npts+a_ixy; - } else { - return (a_nz-1-a_iz)*a_npts+a_ixy; - } - } else { - if(a_zfb) { - return a_iz*a_npts+(a_npts-1-a_ixy); - } else { - return (a_nz-1-a_iz)*a_npts+(a_npts-1-a_ixy); - } - } -} - -inline -bool polyhedron::set_polyhedron_xtru( - int a_npts // number of vertices of the 2D polygon (at least 3) -,int a_nz // number of z planes (at least two) -,double* a_xs //[a_nz][a_npts] X positions for polygon vertices -,double* a_ys //[a_nz][a_npts] Y positions for polygon vertices -,double* a_zs //[a_nz] Z positions -//default orientations : -,bool a_acw //= true -,bool a_zfb //= true -){ - _clear(); //G.Barrand - - if(a_npts<=2) return false; - if(a_nz<=1) return false; - - //check if convex : - bool convex = true; - {double xv = a_xs[1]-a_xs[0]; - double yv = a_ys[1]-a_ys[0]; - double xw,yw,cross_z; - for(int j=2;j0) {convex = false;break;} - } - xv = xw; - yv = yw; - } - if(convex) { - // have to check seg(n-2,n-1) to seg(n-1,0) - xw = a_xs[0]-a_xs[a_npts-1]; - yw = a_ys[0]-a_ys[a_npts-1]; - cross_z = xv*yw-yv*xw; - if(a_acw) { - if(cross_z<0) convex = false; - } else { - if(cross_z>0) convex = false; - } - xv = xw; - yv = yw; - } - if(convex) { - // have to check seg(n-1,0) to seg(0,1) - xw = a_xs[1]-a_xs[0]; - yw = a_ys[1]-a_ys[0]; - cross_z = xv*yw-yv*xw; - if(a_acw) { - if(cross_z<0) convex = false; - } else { - if(cross_z>0) convex = false; - } - } - if(!convex) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr << "tools::hep::set_polyhedron_xtru :" - << " not convex polygon." - << std::endl; -#endif - return false; - }} - - // C O U N T V E R T E C E S - - int i; - - int j = a_nz*a_npts+2; - - // C O U N T F A C E S - - int k = ((a_nz-1)+1+1)*a_npts; - - // A L L O C A T E M E M O R Y - - AllocateMemory(j, k); - - // G E N E R A T E V E R T E C E S - - int* kk = new int[a_nz+2]; - - k = 1; - for(i=0; i a_rmax) k = 1; - if (a_rmin == a_rmax) k = 1; - - if (a_dz <= 0.) k += 2; - - if (a_nz <= 0) k += 4; - if (a_nphi <= 0) k += 4; - - double tout = ::tan(a_st_in); - double tin = ::tan(a_st_out); - - double d_in = a_rmin*a_rmin + tin*tin*a_dz*a_dz; - double d_out = a_rmax*a_rmax + tout*tout*a_dz*a_dz; - if(d_in>d_out) k += 8; - - double phi1 = 0; - double dphi = wholeCircle; - - if (k != 0) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr << "polyhedron_cone(s)/Tube(s): error in input parameters"; - if ((k & 1) != 0) std::cerr << " (radiuses)"; - if ((k & 2) != 0) std::cerr << " (half-length)"; - if ((k & 4) != 0) std::cerr << " (steps)"; - if ((k & 8) != 0) std::cerr << " (angles)"; - std::cerr << std::endl; - //std::cerr << " Rmn1=" << Rmn1 << " Rmx1=" << Rmx1; - //std::cerr << " Rmn2=" << Rmn2 << " Rmx2=" << Rmx2; - //std::cerr << " Dz=" << Dz << " Phi1=" << Phi1 << " Dphi=" << Dphi - // << std::endl; -#endif - return false; - } - - // P R E P A R E T W O P O L Y L I N E S - - double* zz = new double[2*(a_nz+1)]; - double* rr = new double[2*(a_nz+1)]; - - double dz = 2.0f*a_dz/double(a_nz); - - double z; - - // r^2 - (tout*z)^2 = rout^2 - double rout_sq = a_rmax*a_rmax; - double tout_sq = tout*tout; - for(int iz=0;iz<=a_nz;iz++) { - z = a_dz-iz*dz; - zz[iz] = z; - rr[iz] = ::sqrt(rout_sq+tout_sq*z*z); - } - - // r^2 - (tin*z)^2 = rin^2 - double rin_sq = a_rmin*a_rmin; - double tin_sq = tin*tin; - for(int iz=0;iz= rmax) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "polyhedron_sphere: error in radiuses" - << " rmin=" << rmin << " rmax=" << rmax - << std::endl; -#endif - return false; - } - - // P R E P A R E T W O P O L Y L I N E S - - int n_the = (nthe>0) ? nthe : GetNumberOfRotationSteps(); //G.Barrand. - int ns = (n_the + 1) / 2; - - int np1 = int(dthe*ns/_M_PI()+.5) + 1; - if (np1 <= 1) np1 = 2; - const double perMillion = 0.000001; - int np2 = rmin < perMillion ? 1 : np1; - - double *zz, *rr; - zz = new double[np1+np2]; - rr = new double[np1+np2]; - - double a = dthe/(np1-1); - double cosa, sina; - for (int i=0; i 1) { - zz[i+np1] = rmin*cosa; - rr[i+np1] = rmin*sina; - } - } - if (np2 == 1) { - zz[np1] = 0.; - rr[np1] = 0.; - } - - // R O T A T E P O L Y L I N E S - - //G.Barrand : nphi. - RotateAroundZ(nphi, phi, dphi, np1, np2, zz, rr, -1, -1); - SetReferences(); - - delete [] zz; - delete [] rr; - - return true; -} - -inline -polyhedron_sphere::polyhedron_sphere(double rmin, double rmax, - double phi, double dphi, - double the, double dthe, - int nphi, //G.Barrand - int nthe) //G.Barrand -{ - set_polyhedron_sphere(rmin,rmax, - phi,dphi, - the,dthe, - nphi,nthe); -} - - -inline -bool polyhedron::set_polyhedron_torus(double rmin, - double rmax, - double rtor, - double phi, - double dphi, - int nphi, //G.Barrand - int nthe) //G.Barrand -/*********************************************************************** - * * - * Name: polyhedron_torus Date: 11.12.96 * - * Author: E.Chernyaev (IHEP/Protvino) Revised: * - * * - * Function: Constructor of polyhedron for TORUS * - * * - * Input: rmin - internal radius * - * rmax - external radius * - * rtor - radius of torus * - * phi - initial phi * - * dphi - delta phi * - * * - ***********************************************************************/ -{ - _clear(); - - // C H E C K I N P U T P A R A M E T E R S - - if (dphi <= 0. || dphi > 2*_M_PI()) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "polyhedron_torus: wrong delta phi = " << dphi - << std::endl; -#endif - return false; - } - - if (rmin < 0. || rmin >= rmax || rmax >= rtor) { -#ifdef TOOLS_HEP_PH_OUT_ERR - std::cerr - << "polyhedron_torus: error in radiuses" - << " rmin=" << rmin << " rmax=" << rmax << " rtorus=" << rtor - << std::endl; -#endif - return false; - } - - // P R E P A R E T W O P O L Y L I N E S - - int n_the = (nthe>0) ? nthe : GetNumberOfRotationSteps(); //G.Barrand. - int np1 = n_the; - - const double perMillion = 0.000001; - int np2 = rmin < perMillion ? 1 : np1; - - double *zz, *rr; - zz = new double[np1+np2]; - rr = new double[np1+np2]; - - double a = 2*_M_PI()/np1; - double cosa, sina; - for (int i=0; i 1) { - zz[i+np1] = rmin*cosa; - rr[i+np1] = rtor+rmin*sina; - } - } - if (np2 == 1) { - zz[np1] = 0.; - rr[np1] = rtor; - np2 = -1; - } - - // R O T A T E P O L Y L I N E S - - //G.Barrand : nphi. - RotateAroundZ(nphi, phi, dphi, -np1, -np2, zz, rr, -1,-1); - SetReferences(); - - delete [] zz; - delete [] rr; - - return true; -} - -inline -polyhedron_torus::polyhedron_torus(double rmin, - double rmax, - double rtor, - double phi, - double dphi, - int nphi, //G.Barrand - int nthe) //G.Barrand -{ - set_polyhedron_torus(rmin,rmax,rtor,phi,dphi,nphi,nthe); //G.Barrand -} - -//int polyhedron::fNumberOfRotationSteps = NUMBER_OF_STEPS; - -// G.Barrand : begin. -inline int polyhedron::GetNumberOfRotationSteps() { - return fNumberOfRotationSteps; -} -inline void polyhedron::ResetNumberOfRotationSteps() { - fNumberOfRotationSteps = NUMBER_OF_STEPS(); -} -// G.Barrand : end. -/*********************************************************************** - * * - * Name: polyhedron::fNumberOfRotationSteps Date: 24.06.97 * - * Author: J.Allison (Manchester University) Revised: * - * * - * Function: Number of steps for whole circle * - * * - ***********************************************************************/ - -}} - -#include "pbp.icc" //BooleanProcessor - -namespace tools { -namespace hep { - -//G.Barrand : static BooleanProcessor processor; - -inline polyhedron polyhedron::add(const polyhedron & p) const -/*********************************************************************** - * * - * Name: polyhedron::add Date: 19.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Boolean "union" of two polyhedra * - * * - ***********************************************************************/ -{ - BooleanProcessor processor; //G.Barrand - int err; - return processor.execute(OP_UNION, *this, p, err); -} - -inline polyhedron polyhedron::intersect(const polyhedron & p) const -/*********************************************************************** - * * - * Name: polyhedron::intersect Date: 19.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Boolean "intersection" of two polyhedra * - * * - ***********************************************************************/ -{ - BooleanProcessor processor; //G.Barrand - int err; - return processor.execute(OP_INTERSECTION, *this, p, err); -} - -inline polyhedron polyhedron::subtract(const polyhedron & p) const -/*********************************************************************** - * * - * Name: polyhedron::add Date: 19.03.00 * - * Author: E.Chernyaev Revised: * - * * - * Function: Boolean "subtraction" of "p" from "this" * - * * - ***********************************************************************/ -{ - BooleanProcessor processor; //G.Barrand - int err; - return processor.execute(OP_SUBTRACTION, *this, p, err); -} - - -//G.Barrand : begin - -inline bool is_in(unsigned int a_index, - const std::list& a_is) { - std::list::const_iterator it; - for(it=a_is.begin();it!=a_is.end();++it) { - if(*it==a_index) return true; - } - return false; -} - -class bijection_visitor { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::hep::bijection_visitor) -#endif -public: - typedef std::vector is_t; - virtual bool visit(const is_t&) = 0; -public: - bijection_visitor(unsigned int a_number):m_number(a_number){ -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - virtual ~bijection_visitor(){ -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -protected: - bijection_visitor(const bijection_visitor&){ -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - bijection_visitor& operator=(const bijection_visitor&){return *this;} -public: - bool visitx() { - m_is.clear(); - m_is.resize(m_number,0); - std::list is; - return visit(0,is); - } -private: - bool visit(unsigned int a_level,std::list& a_is) { - for(unsigned int index=0;index& a_is) { -// unsigned int number = a_is.size(); -// for(unsigned int index=0;index& a_is -) { - polyhedron result(a_poly); - size_t number = m_ops.size(); - int num_shift = BooleanProcessor::get_num_shift(); - for(int ishift=0;ishift { - TOOLS_HEADER(sf_polyhedron,tools::hep::sf_polyhedron,sg::bsf) -public: - virtual bool write(io::iwbuf& a_buffer) { - //FIXME : write fNumberOfSteps ? - - int nvert = m_value.GetNoVertices(); - int nface = m_value.GetNoFacets(); - double* ds = new double[1+3*nvert+1+8*nface]; - uint32 di=0; - - {ds[di] = nvert;di++; - HVPoint3D* pV = m_value.GetPV(); - for(int index=1;index<=nvert;index++) { //CERN still in FORTRAN... - HVPoint3D& p = pV[index]; - ds[di] = p[0];di++; - ds[di] = p[1];di++; - ds[di] = p[2];di++; - }} - - {ds[di] = nface;di++; - SbFacet* pF = m_value.GetPF(); - int v,f; - for(int index=1;index<=nface;index++) { - SbFacet& fc = pF[index]; //yes, yes +1 - for(int i=0;i<4;i++) { - fc.GetEdge(i,v,f); - ds[di] = v;di++; - ds[di] = f;di++; - } - }} - - bool status = a_buffer.write_vec(di,ds); - - delete [] ds; - - return status; - } - - virtual bool read(io::irbuf& a_buffer) { - double* ds; - uint32 sz; - if(!a_buffer.read_vec(sz,ds)) return false; - uint32 di=0; - //FIXME : check di vs sz. - - int nvert = (int)ds[di];di++; - HVPoint3D* pV = new HVPoint3D[nvert+1]; - for(int index=1;index<=nvert;index++) { - HVPoint3D& p = pV[index]; - p[0] = ds[di];di++; - p[1] = ds[di];di++; - p[2] = ds[di];di++; - } - - int nface = (int)ds[di];di++; - SbFacet* pF = new SbFacet[nface+1]; - int v[8]; - for(int index=1;index<=nface;index++) { - SbFacet& fc = pF[index]; - for(int i=0;i<8;i++) { - v[i] = (int)ds[di];di++; - } - fc.Set(v); - } - - m_value.Set(nvert,pV,nface,pF); //it takes ownership of pV,pF. - - delete [] ds; -#ifdef TOOLS_MEM - mem::decrement(s_new().c_str()); -#endif - - return true; - } - virtual bool dump(std::ostream&) { - return true; - } - virtual bool s_value(std::string& a_s) const {a_s.clear();return false;} - virtual bool s2value(const std::string&) {return false;} -public: - sf_polyhedron():parent(){} - sf_polyhedron(const polyhedron& a_value):parent(a_value){} - virtual ~sf_polyhedron(){} -public: - sf_polyhedron(const sf_polyhedron& a_from):parent(a_from){} - sf_polyhedron& operator=(const sf_polyhedron& a_from){ - parent::operator=(a_from); - return *this; - } -public: - sf_polyhedron& operator=(const polyhedron& a_value){ - parent::operator=(a_value); - return *this; - } -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/histo/histos b/source/externals/g4tools/include/tools/histo/histos deleted file mode 100644 index ba24dc5879..0000000000 --- a/source/externals/g4tools/include/tools/histo/histos +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_histo_histos -#define tools_histo_histos - -#include "h1d" -#include "h2d" -#include "h3d" -#include "p1d" -#include "p2d" - -#include "../forit" - -namespace tools { -namespace histo { - -inline void delete_histos(std::vector< std::pair >& a_hists) { - typedef std::pair class_pointer; - - tools_vforit(class_pointer,a_hists,it) { - const std::string& scls = (*it).first; - if(scls==h1d::s_class()) { - h1d* h = (h1d*)(*it).second; - delete h; - - } else if(scls==h2d::s_class()) { - h2d* h = (h2d*)(*it).second; - delete h; - - } else if(scls==h3d::s_class()) { - h3d* h = (h3d*)(*it).second; - delete h; - - } else if(scls==p1d::s_class()) { - p1d* h = (p1d*)(*it).second; - delete h; - - } else if(scls==p2d::s_class()) { - p2d* h = (p2d*)(*it).second; - delete h; - } - } - a_hists.clear(); -} - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/histo/htoc b/source/externals/g4tools/include/tools/histo/htoc deleted file mode 100644 index c7dd86fd16..0000000000 --- a/source/externals/g4tools/include/tools/histo/htoc +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_histo_htoc -#define tools_histo_htoc - -struct caxis_dui { //d=double, ui=unsigned int - typedef double TC; - typedef unsigned int TO; - typedef unsigned int bn_t; - - TO m_offset; - bn_t m_number_of_bins; - TC m_minimum_value; - TC m_maximum_value; - unsigned char m_fixed; - TC m_bin_width; - unsigned int m_number_of_edges; - TC* m_edges; //[m_number_of_edges] -}; - -struct chisto_duiuid { - typedef double TC; - typedef unsigned int TO; - typedef unsigned int TN; - typedef double TW; - typedef unsigned int dim_t; - - // General : - char* m_title; - dim_t m_dimension; - // Bins : - TO m_bin_number; - TN* m_bin_entries; //[m_bin_number] - TW* m_bin_Sw; //[m_bin_number] - TW* m_bin_Sw2; //[m_bin_number] - TC** m_bin_Sxw; //[m_bin_number][m_dimension] - TC** m_bin_Sx2w; //[m_bin_number][m_dimension] - // Axes : - caxis_dui** m_axes; //[m_dimension] - // etc : - TC* m_in_range_plane_Sxyw; //(dim,size) (1,0) (2,1) (3,3) - unsigned int m_number_of_annotations; - char** m_annotations; //[m_number_of_annotations] - // fast getters : - TN m_all_entries; //used if reading from a ROOT file. - TN m_in_range_entries; - TW m_in_range_Sw; - TW m_in_range_Sw2; - TC* m_in_range_Sxw; //[m_dimension] - TC* m_in_range_Sx2w; //[m_dimension] -}; - -struct cprofile_duiuidd { - typedef double TV; - - chisto_duiuid m_histo; - - unsigned char m_is_profile; - TV* m_bin_Svw; //[m_bin_number] - TV* m_bin_Sv2w; //[m_bin_number] - unsigned char m_cut_v; - TV m_min_v; - TV m_max_v; -}; - -#include "histo_data" - -#include "../cstr" -#include "../cmemT" -#include "../vdata" -#include "../forit" - -namespace tools { -namespace histo { - -///////////////////////////////////////////////////////////////////////////// -/// hist_data to C struct /////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////// - -inline caxis_dui* caxis_dui_alloc(const axis& a_axis) { - caxis_dui* a_cp = cmem_alloc(1); - if(!a_cp) return NULL; - - caxis_dui& a_c = *a_cp; - - typedef double TC; - - a_c.m_offset = a_axis.m_offset; - a_c.m_number_of_bins = a_axis.m_number_of_bins; - a_c.m_minimum_value = a_axis.m_minimum_value; - a_c.m_maximum_value = a_axis.m_maximum_value; - a_c.m_fixed = a_axis.m_fixed?1:0; - a_c.m_bin_width = a_axis.m_bin_width; - a_c.m_number_of_edges = (unsigned int)a_axis.m_edges.size(); - a_c.m_edges = cmem_alloc_copy(vec_data(a_axis.m_edges),a_axis.m_edges.size()); - - return a_cp; -} - -inline void caxis_dui_free(caxis_dui*& a_cp) { - if(!a_cp) return; - caxis_dui& a_c = *a_cp; - - cmem_free(a_c.m_edges); - - a_c.m_offset = 0; - a_c.m_number_of_bins = 0; - a_c.m_minimum_value = 0; - a_c.m_maximum_value = 0; - a_c.m_fixed = 1; - a_c.m_bin_width = 0; - a_c.m_number_of_edges = 0; - - cmem_free(a_cp); -} - -inline void chisto_duiuid_assign(chisto_duiuid& a_c,const histo_data& a_hd) { - typedef double TC; - typedef unsigned int TN; - typedef double TW; - - a_c.m_title = str_dup(a_hd.m_title.c_str()); - a_c.m_dimension = a_hd.m_dimension; - a_c.m_bin_number = a_hd.m_bin_number; - a_c.m_bin_entries = cmem_alloc_copy(vec_data(a_hd.m_bin_entries),a_hd.m_bin_number); - a_c.m_bin_Sw = cmem_alloc_copy(vec_data(a_hd.m_bin_Sw),a_hd.m_bin_number); - a_c.m_bin_Sw2 = cmem_alloc_copy(vec_data(a_hd.m_bin_Sw2),a_hd.m_bin_number); - - {a_c.m_bin_Sxw = cmem_alloc(a_hd.m_bin_number); - for(unsigned int ibin=0;ibin(vec_data(a_hd.m_bin_Sxw[ibin]),a_hd.m_dimension); - }} - {a_c.m_bin_Sx2w = cmem_alloc(a_hd.m_bin_number); - for(unsigned int ibin=0;ibin(vec_data(a_hd.m_bin_Sx2w[ibin]),a_hd.m_dimension); - }} - - // Axes : - {a_c.m_axes = cmem_alloc(a_hd.m_dimension); - for(unsigned int iaxis=0;iaxis(vec_data(a_hd.m_in_range_plane_Sxyw),dim_planes(a_hd.m_dimension)); - {a_c.m_number_of_annotations = (unsigned int)a_hd.m_annotations.size(); - a_c.m_annotations = cmem_alloc(2*a_hd.m_annotations.size()); - unsigned int index = 0; - tools_mforcit(std::string,std::string,a_hd.m_annotations,it) { - a_c.m_annotations[index] = str_dup((*it).first.c_str());index++; - a_c.m_annotations[index] = str_dup((*it).second.c_str());index++; - }} - // fast getters : - a_c.m_all_entries = a_hd.m_all_entries; - a_c.m_in_range_entries = a_hd.m_in_range_entries; - a_c.m_in_range_Sw = a_hd.m_in_range_Sw; - a_c.m_in_range_Sw2 = a_hd.m_in_range_Sw2; - a_c.m_in_range_Sxw = cmem_alloc_copy(vec_data(a_hd.m_in_range_Sxw),a_hd.m_dimension); - a_c.m_in_range_Sx2w = cmem_alloc_copy(vec_data(a_hd.m_in_range_Sx2w),a_hd.m_dimension); - - //FIXME : should check all sub pointers. - //if(to_del {cmem_free(a_cp);return NULL;} -} - -inline chisto_duiuid* chisto_duiuid_alloc(const histo_data& a_hd) { - chisto_duiuid* a_cp = cmem_alloc(1); - if(!a_cp) return NULL; - chisto_duiuid_assign(*a_cp,a_hd); - return a_cp; -} - -inline void chisto_duiuid_clear(chisto_duiuid& a_c) { - str_del(a_c.m_title); - - cmem_free(a_c.m_bin_entries); - cmem_free(a_c.m_bin_Sw); - cmem_free(a_c.m_bin_Sw2); - - {for(unsigned int ibin=0;ibin -inline void vec_assign(std::vector& a_v,unsigned int a_number,const T* a_c) { - a_v.resize(a_number); - for(unsigned int i=0;i& a_axis,const caxis_dui& a_c) { - a_axis.m_offset = a_c.m_offset; - a_axis.m_number_of_bins = a_c.m_number_of_bins; - a_axis.m_minimum_value = a_c.m_minimum_value; - a_axis.m_maximum_value = a_c.m_maximum_value; - a_axis.m_fixed = a_c.m_fixed==1?true:false; - a_axis.m_bin_width = a_c.m_bin_width; - vec_assign(a_axis.m_edges,a_c.m_number_of_edges,a_c.m_edges); -} - -inline void histo_data_duiuid_assign(histo_data& a_hd,const chisto_duiuid& a_c) { - a_hd.m_title = std::string(a_c.m_title); - a_hd.m_dimension = a_c.m_dimension; - a_hd.m_bin_number = a_c.m_bin_number; - vec_assign(a_hd.m_bin_entries,a_c.m_bin_number,a_c.m_bin_entries); - vec_assign(a_hd.m_bin_Sw,a_c.m_bin_number,a_c.m_bin_Sw); - vec_assign(a_hd.m_bin_Sw2,a_c.m_bin_number,a_c.m_bin_Sw2); - - {a_hd.m_bin_Sxw.resize(a_c.m_bin_number); - for(unsigned int ibin=0;ibin& a_pd) { - cprofile_duiuidd* a_cp = cmem_alloc(1); - if(!a_cp) return NULL; - - cprofile_duiuidd& a_c = *a_cp; - - chisto_duiuid_assign(a_c.m_histo,a_pd); - - typedef double TV; - - // profile part : - a_c.m_is_profile = a_pd.m_is_profile?1:0; - a_c.m_bin_Svw = cmem_alloc_copy(vec_data(a_pd.m_bin_Svw),a_pd.m_bin_number); - a_c.m_bin_Sv2w = cmem_alloc_copy(vec_data(a_pd.m_bin_Sv2w),a_pd.m_bin_number); - a_c.m_cut_v = a_pd.m_cut_v?1:0; - a_c.m_min_v = a_pd.m_min_v; - a_c.m_max_v = a_pd.m_max_v; - - return a_cp; -} - -inline void cprofile_duiuidd_free(cprofile_duiuidd*& a_cp) { - if(!a_cp) return; - - cprofile_duiuidd& a_c = *a_cp; - - chisto_duiuid_clear(a_c.m_histo); - - cmem_free(a_c.m_bin_Svw); - cmem_free(a_c.m_bin_Sv2w); - - a_c.m_is_profile = 1; - a_c.m_cut_v = 0; - a_c.m_min_v = 0; - a_c.m_max_v = 0; - - cmem_free(a_cp); -} - -///////////////////////////////////////////////////////////////////////////// -/// C struct to profile_data //////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////// - -inline void profile_data_duiuidd_assign(profile_data& a_pd,const cprofile_duiuidd& a_c) { - histo_data_duiuid_assign(a_pd,a_c.m_histo); - a_pd.m_is_profile = a_c.m_is_profile==1?true:false; - vec_assign(a_pd.m_bin_Svw,a_c.m_histo.m_bin_number,a_c.m_bin_Svw); - vec_assign(a_pd.m_bin_Sv2w,a_c.m_histo.m_bin_number,a_c.m_bin_Sv2w); - a_pd.m_cut_v = a_c.m_cut_v==1?true:false; - a_pd.m_min_v = a_c.m_min_v; - a_pd.m_max_v = a_c.m_max_v; -} - -}} - -#endif - - - - diff --git a/source/externals/g4tools/include/tools/histo/slice b/source/externals/g4tools/include/tools/histo/slice deleted file mode 100644 index e353d5e086..0000000000 --- a/source/externals/g4tools/include/tools/histo/slice +++ /dev/null @@ -1,509 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_histo_slice -#define tools_histo_slice - -#include "axis" - -namespace tools { -namespace histo { - -///////////////////////////////////////////////////////////////////////////////// -/// h2 -> h1 //////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////// - -template -inline bool fill_slice_x(const H2& a_from,int aJbeg,int aJend,H1& a_to) { - - if(!a_from.dimension()) return false; - - typedef typename H2::bn_t bn_t; - - bn_t jbeg; - if(!a_from.axis_y().in_range_to_absolute_index(aJbeg,jbeg)) return false; - bn_t jend; - if(!a_from.axis_y().in_range_to_absolute_index(aJend,jend)) return false; - if(jbeg>jend) return false; - - if(a_from.axis_x().bins()!=a_to.axis().bins()) return false; - - typedef typename H1::hd_t hd_t; - hd_t hdata = a_to.dac(); - - bn_t aoffset,offset,jbin; - bn_t yoffset = a_from.axis_y().m_offset; - - typedef typename H2::num_entries_t TN; - typedef typename H2::weight_t TW; - typedef typename H2::coordinate_t TC; - - const std::vector& af_bin_entries = a_from.bins_entries(); - const std::vector& af_bin_Sw = a_from.bins_sum_w(); - const std::vector& af_bin_Sw2 = a_from.bins_sum_w2(); - const std::vector< std::vector >& af_bin_Sxw = a_from.bins_sum_xw(); - const std::vector< std::vector >& af_bin_Sx2w = a_from.bins_sum_x2w(); - - // Fill also the outflow. - bn_t abins = hdata.m_axes[0].bins()+2; - for(bn_t aibin=0;aibin -inline H1* slice_x(const H2& a_from,int aJbeg,int aJend,const std::string& a_title) { - H1* slice = new H1(a_title,a_from.axis_x().bins(),a_from.axis_x().lower_edge(),a_from.axis_x().upper_edge()); - if(!fill_slice_x(a_from,aJbeg,aJend,*slice)) {delete slice;return 0;} - return slice; -} - -template -inline H1* projection_x(const H2& a_from,const std::string& a_title) { - return slice_x(a_from,axis_UNDERFLOW_BIN,axis_OVERFLOW_BIN,a_title); -} - -template -inline bool fill_slice_y(const H2& a_from,int aIbeg,int aIend,H1& a_to) { - - if(!a_from.dimension()) return false; - - typedef typename H2::bn_t bn_t; - - bn_t ibeg; - if(!a_from.axis_x().in_range_to_absolute_index(aIbeg,ibeg)) return false; - bn_t iend; - if(!a_from.axis_x().in_range_to_absolute_index(aIend,iend)) return false; - if(ibeg>iend) return false; - - if(a_from.axis_y().bins()!=a_to.axis().bins()) return false; - - typedef typename H1::hd_t hd_t; - hd_t hdata = a_to.dac(); - - bn_t aibin,aoffset,offset,ibin; - bn_t yoffset = a_from.axis_y().m_offset; - - typedef typename H2::num_entries_t TN; - typedef typename H2::weight_t TW; - typedef typename H2::coordinate_t TC; - - const std::vector& af_bin_entries = a_from.bins_entries(); - const std::vector& af_bin_Sw = a_from.bins_sum_w(); - const std::vector& af_bin_Sw2 = a_from.bins_sum_w2(); - const std::vector< std::vector >& af_bin_Sxw = a_from.bins_sum_xw(); - const std::vector< std::vector >& af_bin_Sx2w = a_from.bins_sum_x2w(); - - // Fill also the outflow. - bn_t abins = hdata.m_axes[0].bins()+2; - for(aibin=0;aibin -inline H1* slice_y(const H2& a_from,int aIbeg,int aIend,const std::string& a_title) { - H1* slice = new H1(a_title,a_from.axis_y().bins(),a_from.axis_y().lower_edge(),a_from.axis_y().upper_edge()); - if(!fill_slice_y(a_from,aIbeg,aIend,*slice)) {delete slice;return 0;} - return slice; -} - -template -inline H1* projection_y(const H2& a_from,const std::string& a_title) { - return slice_y(a_from,axis_UNDERFLOW_BIN,axis_OVERFLOW_BIN,a_title); -} - -///////////////////////////////////////////////////////////////////////////////// -/// h2 -> p1 //////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////// - -template -inline bool fill_profile_x(const H2& a_from,int aJbeg,int aJend,P1& a_to) { - if(!a_from.dimension()) return false; - - typedef typename H2::bn_t bn_t; - - bn_t jbeg; - if(!a_from.axis_y().in_range_to_absolute_index(aJbeg,jbeg)) return false; - bn_t jend; - if(!a_from.axis_y().in_range_to_absolute_index(aJend,jend)) return false; - if(jbeg>jend) return false; - - if(a_from.axis_x().bins()!=a_to.axis().bins()) return false; - - typedef typename P1::pd_t pd_t; - pd_t hdata = a_to.get_histo_data(); - - bn_t aoffset,offset,jbin; - bn_t yoffset = a_from.axis_y().m_offset; - - typedef typename H2::num_entries_t TN; - typedef typename H2::weight_t TW; - typedef typename H2::coordinate_t TC; - - const std::vector& af_bin_entries = a_from.bins_entries(); - const std::vector& af_bin_Sw = a_from.bins_sum_w(); - const std::vector& af_bin_Sw2 = a_from.bins_sum_w2(); - const std::vector< std::vector >& af_bin_Sxw = a_from.bins_sum_xw(); - const std::vector< std::vector >& af_bin_Sx2w = a_from.bins_sum_x2w(); - - // Fill also the outflow. - bn_t abins = hdata.m_axes[0].bins()+2; - for(bn_t aibin=0;aibin -inline bool fill_profile_y(const H2& a_from,int aIbeg,int aIend,P1& a_to) { - - if(!a_from.dimension()) return false; - - typedef typename H2::bn_t bn_t; - - bn_t ibeg; - if(!a_from.axis_x().in_range_to_absolute_index(aIbeg,ibeg)) return false; - bn_t iend; - if(!a_from.axis_x().in_range_to_absolute_index(aIend,iend)) return false; - if(ibeg>iend) return false; - - if(a_from.axis_y().bins()!=a_to.axis().bins()) return false; - - typedef typename P1::pd_t pd_t; - pd_t hdata = a_to.get_histo_data(); - - bn_t aibin,aoffset,offset,ibin; - bn_t yoffset = a_from.axis_y().m_offset; - - typedef typename H2::num_entries_t TN; - typedef typename H2::weight_t TW; - typedef typename H2::coordinate_t TC; - - const std::vector& af_bin_entries = a_from.bins_entries(); - const std::vector& af_bin_Sw = a_from.bins_sum_w(); - const std::vector& af_bin_Sw2 = a_from.bins_sum_w2(); - const std::vector< std::vector >& af_bin_Sxw = a_from.bins_sum_xw(); - const std::vector< std::vector >& af_bin_Sx2w = a_from.bins_sum_x2w(); - - // Fill also the outflow. - bn_t abins = hdata.m_axes[0].bins()+2; - for(aibin=0;aibin h2 //////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////// - -template -inline bool fill_slice_yz(const H3& a_from,int aIbeg,int aIend,H2& a_to) { - - if(!a_from.dimension()) return false; - - typedef typename H3::bn_t bn_t; - - bn_t ibeg; - if(!a_from.axis_x().in_range_to_absolute_index(aIbeg,ibeg)) return false; - bn_t iend; - if(!a_from.axis_x().in_range_to_absolute_index(aIend,iend)) return false; - if(ibeg>iend) return false; - - if(a_from.axis_y().bins()!=a_to.axis_x().bins()) return false; - if(a_from.axis_z().bins()!=a_to.axis_y().bins()) return false; - - typedef typename H2::hd_t hd_t; - hd_t hdata = a_to.dac(); - - bn_t aibin,ajbin,aoffset,offset,ibin; - - bn_t ayoffset = hdata.m_axes[1].m_offset; - bn_t yoffset = a_from.axis_y().m_offset; - bn_t zoffset = a_from.axis_z().m_offset; - - bn_t axbins = hdata.m_axes[0].bins()+2; - bn_t aybins = hdata.m_axes[1].bins()+2; - - typedef typename H3::num_entries_t TN; - typedef typename H3::weight_t TW; - typedef typename H3::coordinate_t TC; - - const std::vector& af_bin_entries = a_from.bins_entries(); - const std::vector& af_bin_Sw = a_from.bins_sum_w(); - const std::vector& af_bin_Sw2 = a_from.bins_sum_w2(); - const std::vector< std::vector >& af_bin_Sxw = a_from.bins_sum_xw(); - const std::vector< std::vector >& af_bin_Sx2w = a_from.bins_sum_x2w(); - - // Fill also the outflow. - for(aibin=0;aibin -inline bool fill_slice_xy(const H3& a_from,int aKbeg,int aKend,H2& a_to) { - - if(!a_from.dimension()) return false; - - typedef typename H3::bn_t bn_t; - - bn_t kbeg; - if(!a_from.axis_z().in_range_to_absolute_index(aKbeg,kbeg)) return false; - bn_t kend; - if(!a_from.axis_z().in_range_to_absolute_index(aKend,kend)) return false; - if(kbeg>kend) return false; - - if(a_from.axis_x().bins()!=a_to.axis_x().bins()) return false; - if(a_from.axis_y().bins()!=a_to.axis_y().bins()) return false; - - typedef typename H2::hd_t hd_t; - hd_t hdata = a_to.dac(); - - bn_t kbin; - bn_t aibin,ajbin,aoffset,offset; - - bn_t ayoffset = hdata.m_axes[1].m_offset; - bn_t yoffset = a_from.axis_y().m_offset; - bn_t zoffset = a_from.axis_z().m_offset; - - bn_t axbins = hdata.m_axes[0].bins()+2; - bn_t aybins = hdata.m_axes[1].bins()+2; - - typedef typename H3::num_entries_t TN; - typedef typename H3::weight_t TW; - typedef typename H3::coordinate_t TC; - - const std::vector& af_bin_entries = a_from.bins_entries(); - const std::vector& af_bin_Sw = a_from.bins_sum_w(); - const std::vector& af_bin_Sw2 = a_from.bins_sum_w2(); - const std::vector< std::vector >& af_bin_Sxw = a_from.bins_sum_xw(); - const std::vector< std::vector >& af_bin_Sx2w = a_from.bins_sum_x2w(); - - // Fill also the outflow. - for(aibin=0;aibin -inline bool fill_slice_xz(const H3& a_from,int aJbeg,int aJend,H2& a_to) { - - if(!a_from.dimension()) return false; - - typedef typename H3::bn_t bn_t; - - bn_t jbeg; - if(!a_from.axis_y().in_range_to_absolute_index(aJbeg,jbeg)) return false; - bn_t jend; - if(!a_from.axis_y().in_range_to_absolute_index(aJend,jend)) return false; - if(jbeg>jend) return false; - - if(a_from.axis_x().bins()!=a_to.axis_x().bins()) return false; - if(a_from.axis_z().bins()!=a_to.axis_y().bins()) return false; - - typedef typename H2::hd_t hd_t; - hd_t hdata = a_to.dac(); - - bn_t aibin,ajbin,aoffset,offset,jbin; - - bn_t ayoffset = hdata.m_axes[1].m_offset; - bn_t yoffset = a_from.axis_y().m_offset; - bn_t zoffset = a_from.axis_z().m_offset; - - bn_t axbins = hdata.m_axes[0].bins()+2; - bn_t aybins = hdata.m_axes[1].bins()+2; - - typedef typename H3::num_entries_t TN; - typedef typename H3::weight_t TW; - typedef typename H3::coordinate_t TC; - - const std::vector& af_bin_entries = a_from.bins_entries(); - const std::vector& af_bin_Sw = a_from.bins_sum_w(); - const std::vector& af_bin_Sw2 = a_from.bins_sum_w2(); - const std::vector< std::vector >& af_bin_Sxw = a_from.bins_sum_xw(); - const std::vector< std::vector >& af_bin_Sx2w = a_from.bins_sum_x2w(); - - // Fill also the outflow. - for(aibin=0;aibin -inline H2* slice_xy(const H3& a_from,int aKbeg,int aKend,const std::string& a_title) { - H2* slice = new H2(a_title, - a_from.axis_x().bins(),a_from.axis_x().lower_edge(),a_from.axis_x().upper_edge(), - a_from.axis_y().bins(),a_from.axis_y().lower_edge(),a_from.axis_y().upper_edge()); - if(!fill_slice_xy(a_from,aKbeg,aKend,*slice)) {delete slice;return 0;} - return slice; -} - -template -inline H2* slice_yz(const H3& a_from,int aIbeg,int aIend,const std::string& a_title) { - H2* slice = new H2(a_title, - a_from.axis_y().bins(),a_from.axis_y().lower_edge(),a_from.axis_y().upper_edge(), - a_from.axis_z().bins(),a_from.axis_z().lower_edge(),a_from.axis_z().upper_edge()); - if(!fill_slice_yz(a_from,aIbeg,aIend,*slice)) {delete slice;return 0;} - return slice; -} - -template -inline H2* slice_xz(const H3& a_from,int aJbeg,int aJend,const std::string& a_title) { - H2* slice = new H2(a_title, - a_from.axis_x().bins(),a_from.axis_x().lower_edge(),a_from.axis_x().upper_edge(), - a_from.axis_z().bins(),a_from.axis_z().lower_edge(),a_from.axis_z().upper_edge()); - if(!fill_slice_xz(a_from,aJbeg,aJend,*slice)) {delete slice;return 0;} - return slice; -} - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/histo/sliced b/source/externals/g4tools/include/tools/histo/sliced deleted file mode 100644 index f29ea1ed5a..0000000000 --- a/source/externals/g4tools/include/tools/histo/sliced +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_histo_sliced -#define tools_histo_sliced - -#include "slice" -#include "h1d" -#include "h2d" - -///////////////////////////////////////////////////////////////////////////////// -/// h2 -> h1 //////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////// - -namespace tools { -namespace histo { - -inline h1d* slice_x(const h2d& a_from,int aJbeg,int aJend,const std::string& a_title) { - h1d* slice_x = new h1d(a_title, - a_from.axis_x().bins(),a_from.axis_x().lower_edge(),a_from.axis_x().upper_edge()); - if(!fill_slice_x(a_from,aJbeg,aJend,*slice_x)) {delete slice_x;return 0;} - return slice_x; -} - -inline h1d* projection_x(const h2d& a_from,const std::string& a_title) { - return slice_x(a_from,axis_UNDERFLOW_BIN,axis_OVERFLOW_BIN,a_title); -} - -inline h1d* slice_y(const h2d& a_from,int aIbeg,int aIend,const std::string& a_title) { - h1d* slice_y = new h1d(a_title, - a_from.axis_y().bins(),a_from.axis_y().lower_edge(),a_from.axis_y().upper_edge()); - if(!fill_slice_y(a_from,aIbeg,aIend,*slice_y)) {delete slice_y;return 0;} - return slice_y; -} - -inline h1d* projection_y(const h2d& a_from,const std::string& a_title) { - return slice_y(a_from,axis_UNDERFLOW_BIN,axis_OVERFLOW_BIN,a_title); -} - -}} - -///////////////////////////////////////////////////////////////////////////////// -/// h2 -> p1 //////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////// -#include "p1d" - -namespace tools { -namespace histo { - -inline p1d* profile_x(const h2d& a_from,int aJbeg,int aJend,const std::string& a_title) { - p1d* slice_x = new p1d(a_title, - a_from.axis_x().bins(),a_from.axis_x().lower_edge(),a_from.axis_x().upper_edge()); - if(!fill_profile_x(a_from,aJbeg,aJend,*slice_x)) {delete slice_x;return 0;} - return slice_x; -} - -inline p1d* profile_x(const h2d& a_from,const std::string& a_title) { - return profile_x(a_from,axis_UNDERFLOW_BIN,axis_OVERFLOW_BIN,a_title); -} - -inline p1d* profile_y(const h2d& a_from,int aIbeg,int aIend,const std::string& a_title) { - p1d* slice_y = new p1d(a_title, - a_from.axis_y().bins(),a_from.axis_y().lower_edge(),a_from.axis_y().upper_edge()); - if(!fill_profile_y(a_from,aIbeg,aIend,*slice_y)) {delete slice_y;return 0;} - return slice_y; -} - -inline p1d* profile_y(const h2d& a_from,const std::string& a_title) { - return profile_y(a_from,axis_UNDERFLOW_BIN,axis_OVERFLOW_BIN,a_title); -} - -}} - -///////////////////////////////////////////////////////////////////////////////// -/// h3 -> h2 //////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////// - -#include "h3d" - -namespace tools { -namespace histo { - -inline h2d* slice_xy(const h3d& a_from,int aKbeg,int aKend,const std::string& a_title) { - h2d* slice = new h2d(a_title, - a_from.axis_x().bins(),a_from.axis_x().lower_edge(),a_from.axis_x().upper_edge(), - a_from.axis_y().bins(),a_from.axis_y().lower_edge(),a_from.axis_y().upper_edge()); - if(!fill_slice_xy(a_from,aKbeg,aKend,*slice)) {delete slice;return 0;} - return slice; -} - -inline h2d* projection_xy(const h3d& a_from,const std::string& a_title) { - return slice_xy(a_from,axis_UNDERFLOW_BIN,axis_OVERFLOW_BIN,a_title); -} - -inline h2d* slice_yz(const h3d& a_from,int aIbeg,int aIend,const std::string& a_title) { - h2d* slice = new h2d(a_title, - a_from.axis_y().bins(),a_from.axis_y().lower_edge(),a_from.axis_y().upper_edge(), - a_from.axis_z().bins(),a_from.axis_z().lower_edge(),a_from.axis_z().upper_edge()); - if(!fill_slice_yz(a_from,aIbeg,aIend,*slice)) {delete slice;return 0;} - return slice; -} - -inline h2d* projection_yz(const h3d& a_from,const std::string& a_title) { - return slice_yz(a_from,axis_UNDERFLOW_BIN,axis_OVERFLOW_BIN,a_title); -} - -inline h2d* slice_xz(const h3d& a_from,int aJbeg,int aJend,const std::string& a_title) { - h2d* slice = new h2d(a_title, - a_from.axis_x().bins(),a_from.axis_x().lower_edge(),a_from.axis_x().upper_edge(), - a_from.axis_z().bins(),a_from.axis_z().lower_edge(),a_from.axis_z().upper_edge()); - if(!fill_slice_xz(a_from,aJbeg,aJend,*slice)) {delete slice;return 0;} - return slice; -} - -inline h2d* projection_xz(const h3d& a_from,const std::string& a_title) { - return slice_xz(a_from,axis_UNDERFLOW_BIN,axis_OVERFLOW_BIN,a_title); -} - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/image b/source/externals/g4tools/include/tools/image deleted file mode 100644 index 22a0a58460..0000000000 --- a/source/externals/g4tools/include/tools/image +++ /dev/null @@ -1,427 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_image -#define tools_image - -#include -#include //memcpy -#include //fopen - -#include "forit" - -namespace tools { -namespace image { - -// give a set of cols*rows same size rgb-image and build -// a big image : -inline unsigned char* concatenate(unsigned char** a_buffers, - unsigned int a_w,unsigned int a_h, - unsigned int a_bpp, - unsigned int a_cols,unsigned int a_rows, - unsigned int a_bw,unsigned int a_bh, - unsigned char a_bc, - unsigned int& a_rw,unsigned int& a_rh){ - - // assume a_buffers has a_cols*a_rows entries. - // a_buffers[0] is bottom-left - // a_row=0 is bottom. - - unsigned int wbw = a_w + 2*a_bw; - unsigned int hbh = a_h + 2*a_bh; - - a_rw = wbw * a_cols; - a_rh = hbh * a_rows; - - //printf("debug : %d %d\n",a_rw,a_rh); - - // on big concatenated image the below may fail : - unsigned char* rb = new unsigned char[a_rh*a_rw*a_bpp]; - if(!rb) {a_rw = 0;a_rh = 0;return 0;} - - unsigned int wbw3 = wbw*a_bpp; - unsigned int aw3 = a_w*a_bpp; - - //copy tiles : - unsigned int index = 0; - for(unsigned int j=0;j -#include - -namespace tools { -namespace image { - -typedef unsigned char* (*file_reader)(std::ostream&,const std::string&,unsigned int&,unsigned int&,unsigned int&); - -inline unsigned char* concatenate(std::ostream& a_out, - const std::vector& a_files, - unsigned int a_cols,unsigned int a_rows, - unsigned int a_bw,unsigned int a_bh, - unsigned char a_bc, - file_reader a_file_reader, - unsigned int& a_w,unsigned int& a_h, - unsigned int& a_bpp) { - // a_files[0] is cols=0, rows=0 - // a_files[1] is cols=1, rows=0 - // a_files[2] is cols=2, rows=0 - // ... - // and row=0 is bottom of big image. - - unsigned int number = a_cols*a_rows; - if(number!=a_files.size()) { - a_out << "tools::image::concatenate :" - << " bad number of files. " << number << " expected." - << std::endl; - a_bpp = a_w = a_h = 0; - return 0; - } - if(a_files.empty()) { - a_out << "tools::image::concatenate :" - << " list of files is empty." - << std::endl; - a_bpp = a_w = a_h = 0; - return 0; - } - - unsigned int w1 = 0; - unsigned int h1 = 0; - unsigned int bpp1 = 0; - - typedef unsigned char* buffer_t; - buffer_t* bs = new buffer_t[number]; - {for(unsigned int i=0;iis(file)) { - unsigned char* buffer = _open(*(*it),file,a_w,a_h,a_bpp); - end_file(file); - return buffer; - } - } - end_file(file); - } - a_w = 0;a_h = 0;a_bpp = 0; - return 0; - } -public: - virtual bool begin_file(std::string&) = 0; - virtual bool end_file(const std::string&) = 0; -public: - iterator_reader(std::ostream& a_out,unsigned int a_limit) - :m_out(a_out) - ,m_limit(a_limit) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - virtual ~iterator_reader(){ - _clean(); -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -public: - iterator_reader(const iterator_reader& a_from) - :iterator(a_from) - ,m_out(a_from.m_out) - ,m_limit(a_from.m_limit) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - _copy(a_from.m_readers); - } - iterator_reader& operator=(const iterator_reader& a_from){ - if(&a_from==this) return *this; - m_limit = a_from.m_limit; - _copy(a_from.m_readers); - return *this; - } -public: - void add_reader(ireader* a_reader) { - m_readers.push_back(a_reader); //take ownership. - } -protected: - unsigned char* _open(const image::ireader& a_reader, - const std::string& a_path, - unsigned int& a_w,unsigned int& a_h, - unsigned int& a_bpp){ - // permit to put in common code for jpeg and png. - - unsigned char* buffer = 0; - - if(m_limit) { - if(!a_reader.infos(m_out,a_path,a_w,a_h,a_bpp)) { - m_out << "tools::image::iterator_reader::_open :" - << " for file " << sout(a_path) - << " ireader::infos failed." - << std::endl; - a_w = 0;a_h = 0;a_bpp = 0; - return 0; - } - if((a_w*a_h*a_bpp)>m_limit) { - - //unsigned int sw; - //unsigned int sh; - //float aspect = float(w)/float(h); - //if(aspect>=1) { - // sh = 2; - // sw = aspect*sh; - //} else { - // sw = 2; - // sh = sw/aspect; - //} - - unsigned int sw = 2; - unsigned int sh = 2; - while(true) { - if(((2*sw)*(2*sh)*a_bpp)>m_limit) break; - sw *=2; - sh *=2; - } - - unsigned int sx = (a_w-sw)/2; - unsigned int sy = (a_h-sh)/2; - - buffer = a_reader.read_part - (m_out,a_path,sx,sy,sw,sh,a_w,a_h,a_bpp); - } else { - buffer = a_reader.read(m_out,a_path,a_w,a_h,a_bpp); - } - } else { - buffer = a_reader.read(m_out,a_path,a_w,a_h,a_bpp); - } - - if(!buffer) { - m_out << "tools::image::iterator_reader::_open :" - << " for file " << sout(a_path) - << " read failed." - << std::endl; - a_w = 0;a_h = 0;a_bpp = 0; - return 0; - } - - return buffer; - } - - void _clean() { - std::vector::iterator it; - for(it=m_readers.begin();it!=m_readers.end();) { - ireader* obj = *it; - it = m_readers.erase(it); - delete obj; - } - } - void _copy(const std::vector& a_from) { - _clean(); - tools_vforcit(ireader*,a_from,it) m_readers.push_back((*it)->copy()); - } -protected: - std::ostream& m_out; - unsigned int m_limit; - std::vector m_readers; -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/image_reader b/source/externals/g4tools/include/tools/image_reader deleted file mode 100644 index 6e08422011..0000000000 --- a/source/externals/g4tools/include/tools/image_reader +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_image_reader -#define tools_image_reader - -#include "forit" - -#include -#include - -namespace tools { -namespace image { - -class ireader { -public: - virtual ~ireader() {} -public: - virtual ireader* copy() const = 0; - virtual bool is(const std::string&) const = 0; - virtual bool infos(std::ostream& a_out,const std::string& a_file, - unsigned int& a_width,unsigned int& a_height, - unsigned int& a_bpp) const = 0; - virtual unsigned char* read(std::ostream& a_out,const std::string& a_file, - unsigned int& a_width,unsigned int& a_height, - unsigned int& a_bpp) const = 0; - virtual unsigned char* read_part(std::ostream& a_out, - const std::string& a_file, - unsigned int a_sx,unsigned int a_sy, - unsigned int a_sw,unsigned int a_sh, - unsigned int& a_rw,unsigned int& a_rh, - unsigned int& a_rbpp) const = 0; -}; - -class readers { -public: - typedef std::pair named_reader; -public: - readers(){} - virtual ~readers(){_clear();} -public: - readers(const readers& a_from) { - _copy(a_from.m_readers); - } - readers& operator=(const readers& a_from){ - if(&a_from==this) return *this; - _copy(a_from.m_readers); - return *this; - } -public: - void add_reader(const std::string& a_name,ireader* a_reader) { - m_readers.push_back(named_reader(a_name,a_reader)); //take ownership of a_reader. - } - const std::vector& named_readers() const {return m_readers;} -protected: - void _clear(){ - tools_vforit(named_reader,m_readers,it) delete (*it).second; - m_readers.clear(); - } - void _copy(const std::vector& a_from) { - _clear(); - tools_vforcit(named_reader,a_from,it) { - m_readers.push_back(named_reader((*it).first,(*it).second->copy())); - } - } -protected: - std::vector m_readers; //have a vector (and not a map) since the order is important. -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/jpeg b/source/externals/g4tools/include/tools/jpeg deleted file mode 100644 index 31b9e61377..0000000000 --- a/source/externals/g4tools/include/tools/jpeg +++ /dev/null @@ -1,702 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_jpeg -#define tools_jpeg - -#include //FILE,size_t - -//#define TOOLS_JPEG_OUT_ERR - -extern "C" { //Needed on Windows. -#ifndef TOOLS_USE_OUREX_JPEG -#include -#else -#include //enforce ourex jpeg -#endif -} - -#include -#include //memcpy -#include - -namespace tools { -namespace jpeg { - -inline bool write_file(FILE* a_file,int a_quality,unsigned char* a_buffer,unsigned int a_width,unsigned int a_height,unsigned int a_bpp) { - - struct jpeg_compress_struct cinfo; - - struct jpeg_error_mgr jerr; - cinfo.err = ::jpeg_std_error(&jerr); - - ::jpeg_create_compress(&cinfo); - - ::jpeg_stdio_dest(&cinfo,a_file); - - cinfo.image_width = a_width; - cinfo.image_height = a_height; - cinfo.input_components = a_bpp; // # of color components per pixel. - cinfo.in_color_space = JCS_RGB; // colorspace of input image. - - ::jpeg_set_defaults(&cinfo); - ::jpeg_set_quality(&cinfo,a_quality,TRUE); - - ::jpeg_start_compress(&cinfo,TRUE); - - int row_stride = a_width * cinfo.input_components; - - while (cinfo.next_scanline < cinfo.image_height) { - JSAMPROW row_pointer = - a_buffer+(cinfo.image_height-1-cinfo.next_scanline) * row_stride; - ::jpeg_write_scanlines(&cinfo, &row_pointer, 1); - } - - ::jpeg_finish_compress(&cinfo); - ::jpeg_destroy_compress(&cinfo); - - return true; -} - -inline bool write_file_100(FILE* a_file,unsigned char* a_buffer,unsigned int a_width,unsigned int a_height,unsigned int a_bpp) { - return tools::jpeg::write_file(a_file,100,a_buffer,a_width,a_height,a_bpp); -} - -struct error_mgr { - struct jpeg_error_mgr pub; - jmp_buf setjmp_buffer; -}; - -typedef struct error_mgr* error_ptr; - -extern "C" { -inline void tools_jpeg_error_exit(j_common_ptr cinfo){ - error_ptr myerr = (error_ptr) cinfo->err; - //(*cinfo->err->output_message) (cinfo); - //printf("debug : error_exit\n"); - //NSLog(@"debug : jpeg::error_exit"); - ::longjmp(myerr->setjmp_buffer, 1); -} -} - -inline bool infos_file(FILE* a_file,unsigned int& a_width,unsigned int& a_height,unsigned int& a_bpp) { - //NOTE : G.Barrand : not sure that in case of error, we cleanup properly ! - - struct jpeg_decompress_struct cinfo; - struct error_mgr jerr; - - cinfo.err = ::jpeg_std_error(&jerr.pub); - jerr.pub.error_exit = tools_jpeg_error_exit; - if(::setjmp(jerr.setjmp_buffer)) { - //printf("debug : out of setjmp\n"); - a_width = 0; - a_height = 0; - a_bpp = 0; - return false; - } - - ::jpeg_create_decompress(&cinfo); - ::jpeg_stdio_src(&cinfo,a_file); - ::jpeg_read_header(&cinfo, TRUE); - - ::jpeg_start_decompress(&cinfo); - - a_width = cinfo.output_width; - a_height = cinfo.output_height; - a_bpp = cinfo.output_components; - - ::jpeg_abort_decompress(&cinfo); - ::jpeg_destroy_decompress(&cinfo); - - return true; -} - -inline unsigned char* read_file(FILE* a_file,unsigned int& a_width,unsigned int& a_height,unsigned int& a_bpp) { - // the returned buffer must be delete with "delete []". - - //NOTE : G.Barrand : not sure that in case of error, we cleanup properly ! - - struct jpeg_decompress_struct cinfo; - struct error_mgr jerr; - - cinfo.err = ::jpeg_std_error(&jerr.pub); - jerr.pub.error_exit = tools_jpeg_error_exit; - if(::setjmp(jerr.setjmp_buffer)) { -#ifdef TOOLS_JPEG_OUT_ERR - ::printf("tools::jpeg::read_file : out of setjmp\n"); -#endif - //NOTE : how to be sure to delete the below new if having been done ? - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - ::jpeg_create_decompress(&cinfo); - ::jpeg_stdio_src(&cinfo,a_file); - ::jpeg_read_header(&cinfo, TRUE); - - ::jpeg_start_decompress(&cinfo); - - int row_stride = cinfo.output_width * cinfo.output_components; - - if((!cinfo.output_width)|| - (!cinfo.output_height)|| - (cinfo.output_components<=0)) { -#ifdef TOOLS_JPEG_OUT_ERR - ::printf("tools::jpeg::read_file : bad size, w %u h %u cpnts %d\n", - cinfo.output_width,cinfo.output_height,cinfo.output_components); -#endif - ::jpeg_abort_decompress(&cinfo); - ::jpeg_destroy_decompress(&cinfo); - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - a_width = cinfo.output_width; - a_height = cinfo.output_height; - a_bpp = cinfo.output_components; - - unsigned char* image_buffer = new unsigned char[row_stride * cinfo.output_height]; - if(!image_buffer) { -#ifdef TOOLS_JPEG_OUT_ERR - ::printf("tools::jpeg::read_file : alloc of %d bytes failed\n", - row_stride * cinfo.output_height); -#endif - ::jpeg_abort_decompress(&cinfo); - ::jpeg_destroy_decompress(&cinfo); - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - //FIXME : iPad : the below crashes on LHCb_artist_16384_4096_80.jpg. - - {JSAMPROW buffer[1]; - unsigned char* pos = image_buffer + row_stride * cinfo.output_height; - while (cinfo.output_scanline -#include -#include - -namespace tools { -namespace jpeg { - -inline bool is(const std::string& a_file){ - FILE* file = ::fopen(a_file.c_str(),"rb"); - if(!file) return false; //if file does not exist, then it is not a jpeg ! - unsigned char head[4]; - size_t nitem = ::fread(head,1,4,file); - ::fclose(file); - if(nitem!=4) return false; - if(head[0]!=255) return false; - if(head[1]!=216) return false; - if(head[2]!=255) return false; - //if(head[3]!=224) return false; //LRI.jpg is 225 ! - return true; -} - -inline bool infos(std::ostream& a_out,const std::string& a_file,unsigned int& a_width,unsigned int& a_height,unsigned int& a_bpp) { - if(!is(a_file)) { - a_out << "tools::jpeg::infos :" - << " file " << a_file << " is not jpeg." - << std::endl; - a_width = 0; - a_height = 0; - a_bpp = 0; - return false; - } - - FILE* file = ::fopen(a_file.c_str(),"rb"); - if(!file) { - a_out << "tools::jpeg::infos :" - << " can't open " << a_file - << std::endl; - a_width = 0; - a_height = 0; - a_bpp = 0; - return false; - } - - unsigned int w,h,bpp; - bool status = infos_file(file,w,h,bpp); - - ::fclose(file); - - if(!status) { - a_out << "tools::jpeg::infos :" - << " problem reading " << a_file - << std::endl; - a_width = 0; - a_height = 0; - a_bpp = 0; - return false; - } - - a_width = w; - a_height = h; - a_bpp = bpp; - return true; -} - -inline unsigned char* read(std::ostream& a_out,const std::string& a_file,unsigned int& a_width,unsigned int& a_height,unsigned int& a_bpp) { - if(!is(a_file)) { - a_out << "tools::jpeg::read :" - << " file " << a_file << " is not jpeg." - << std::endl; - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - FILE* file = ::fopen(a_file.c_str(),"rb"); - if(!file) { - a_out << "tools::jpeg::read :" - << " can't open " << a_file - << std::endl; - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - unsigned int w,h,bpp; - unsigned char* buffer = read_file(file,w,h,bpp); - - ::fclose(file); - - if(!buffer) { - a_out << "tools::jpeg::read :" - << " problem reading " << a_file - << std::endl; - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - a_width = w; - a_height = h; - a_bpp = bpp; - return buffer; -} - -inline unsigned char* read_part(std::ostream& a_out, - const std::string& a_file, - unsigned int a_sx,unsigned int a_sy, - unsigned int a_sw,unsigned int a_sh, - unsigned int& a_rw,unsigned int& a_rh, - unsigned int& a_rbpp) { - if(!is(a_file)) { - a_out << "tools::jpeg::read_part :" - << " file " << a_file << " is not jpeg." - << std::endl; - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - FILE* file = ::fopen(a_file.c_str(),"rb"); - if(!file) { - a_out << "tools::jpeg::read_part :" - << " can't open " << a_file - << std::endl; - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - struct jpeg_decompress_struct cinfo; - struct error_mgr jerr; - - cinfo.err = ::jpeg_std_error(&jerr.pub); - jerr.pub.error_exit = tools_jpeg_error_exit; - if(::setjmp(jerr.setjmp_buffer)) { - //printf("debug : out of setjmp\n"); - ::fclose(file); - //NOTE : how to be sure to delete the below news if having been done ? - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - ::jpeg_create_decompress(&cinfo); - ::jpeg_stdio_src(&cinfo,file); - ::jpeg_read_header(&cinfo,TRUE); - - ::jpeg_start_decompress(&cinfo); - - int row_stride = cinfo.output_width * cinfo.output_components; - - unsigned int w = cinfo.output_width; - unsigned int h = cinfo.output_height; - - if((a_sx>=w)||(a_sy>=h)){ - ::jpeg_abort_decompress(&cinfo); - ::jpeg_destroy_decompress(&cinfo); - ::fclose(file); - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - // 012345 - a_rw = tools::mn(w-a_sx,a_sw); - a_rh = tools::mn(h-a_sy,a_sh); - a_rbpp = cinfo.output_components; - - if(!a_rw||!a_rh||!a_rbpp){ - ::jpeg_abort_decompress(&cinfo); - ::jpeg_destroy_decompress(&cinfo); - ::fclose(file); - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - unsigned char* image_buffer = new unsigned char[a_rw*a_rh*a_rbpp]; - if(!image_buffer) { - ::jpeg_abort_decompress(&cinfo); - ::jpeg_destroy_decompress(&cinfo); - ::fclose(file); - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - unsigned char* line = new unsigned char[row_stride]; - if(!line) { - ::jpeg_abort_decompress(&cinfo); - ::jpeg_destroy_decompress(&cinfo); - ::fclose(file); - delete [] image_buffer; - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - //FIXME : iPad : the below crashes on LHCb_artist_16384_4096_80.jpg. - - unsigned int hbeg = a_sy; - unsigned int hend = a_sy+a_rh; - - {JSAMPROW buffer[1]; - buffer[0] = line; - unsigned char* pos = image_buffer+a_rh*a_rw*a_rbpp; - while(cinfo.output_scanline - -namespace tools { -namespace jpeg { - -inline bool to_xpm(std::ostream& a_out,const std::string& a_file,const std::string& a_name,bool a_verbose = false) { - return tools::xpm::to_xpm(a_out,a_file,a_name,read,a_verbose); -} - -}} - -#include -#include - -namespace tools { -namespace jpeg { - -inline bool concatenate(std::ostream& a_out, - const std::vector& a_files, - unsigned int a_cols,unsigned int a_rows, - unsigned int a_bw,unsigned int a_bh, - unsigned char a_bc, - const std::string& a_file,int a_quality) { - unsigned int wa,ha,bppa; - unsigned char* ba = - tools::image::concatenate - (a_out,a_files,a_cols,a_rows,a_bw,a_bh,a_bc,read,wa,ha,bppa); - if(!ba) { - a_out << "tools::jpeg::concatenate :" - << " failed to concatenate all buffers." - << std::endl; - delete [] ba; - return false; - } - - FILE* file = ::fopen(a_file.c_str(),"wb"); - if(!file) { - a_out << "tools::jpeg::concatenate :" - << " can't open " << file << " for writing." - << std::endl; - delete [] ba; - return false; - } - - if(!write_file(file,a_quality,ba,wa,ha,bppa)) { - a_out << "tools::jpeg::concatenate :" - << " can't write " << a_file << "." - << std::endl; - delete [] ba; - ::fclose(file); - return false; - } - - delete [] ba; - ::fclose(file); - return true; -} - -class reader : public virtual tools::image::ireader { -public: - virtual tools::image::ireader* copy() const {return new reader(*this);} - virtual bool is(const std::string& a_file) const { - return tools::jpeg::is(a_file); - } - virtual bool infos(std::ostream& a_out,const std::string& a_file, - unsigned int& a_width,unsigned int& a_height, - unsigned int& a_bpp) const { - return tools::jpeg::infos(a_out,a_file,a_width,a_height,a_bpp); - } - virtual unsigned char* read(std::ostream& a_out,const std::string& a_file, - unsigned int& a_width,unsigned int& a_height, - unsigned int& a_bpp) const { - return tools::jpeg::read(a_out,a_file,a_width,a_height,a_bpp); - } - virtual unsigned char* read_part(std::ostream& a_out, - const std::string& a_file, - unsigned int a_sx,unsigned int a_sy, - unsigned int a_sw,unsigned int a_sh, - unsigned int& a_rw,unsigned int& a_rh, - unsigned int& a_rbpp) const { - return tools::jpeg::read_part(a_out,a_file, - a_sx,a_sy, - a_sw,a_sh, - a_rw,a_rh, - a_rbpp); - } -public: - reader(){} - virtual ~reader(){} -public: - reader(const reader&):ireader(){} - reader& operator=(const reader&){return *this;} -}; - -}} - -//#include -// -//namespace tools { -//namespace jpeg { -// -//class jpeg_data : public tools::img_byte { -//public: -// jpeg_data(std::ostream& a_out) -// :tools::img_byte(3) -// ,m_out(a_out) -// ,m_FILE(0) -// ,m_row_stride(0) -// ,m_pos(0) -// {} -// virtual ~jpeg_data(){ -// if(m_FILE) ::fclose(m_FILE); -// } -//protected: //don't copy -// jpeg_data(const jpeg_data& a_from) -// :tools::img_byte(a_from) -// ,m_out(a_from.m_out) -// {} -// jpeg_data& operator=(const jpeg_data& a_from){ -// tools::img_byte::operator=(a_from); -// return *this; -// } -//public: -// bool open(const std::string& a_file) { -// if(m_FILE) return false; -// -// if(!tools::jpeg::is(a_file)) { -// m_out << "tools::jpeg::jpeg_data::open :" -// << " file " << a_file << " is not jpeg." -// << std::endl; -// return false; -// } -// m_FILE = ::fopen(a_file.c_str(),"rb"); -// if(!m_FILE) { -// m_out << "tools::jpeg::jpeg_data::open :" -// << " can't open " << a_file -// << std::endl; -// return false; -// } -// -// m_cinfo.err = ::jpeg_std_error(&m_jerr.pub); -// m_jerr.pub.error_exit = tools_jpeg_tools_jpeg_tools_jpeg_error_exit; -// if(::setjmp(m_jerr.setjmp_buffer)) { -// m_out << "tools::jpeg::jpeg_data::open :" -// << " setjmp failed." << a_file -// << std::endl; -// ::fclose(m_FILE); -// m_FILE = 0; -// return false; -// } -// -// ::jpeg_create_decompress(&m_cinfo); -// ::jpeg_stdio_src(&m_cinfo,m_FILE); -// ::jpeg_read_header(&m_cinfo,TRUE); -// -// ::jpeg_start_decompress(&m_cinfo); -// -// if(m_cinfo.output_components!=3) { -// m_out << "tools::jpeg::jpeg_data::open :" -// << " file " << a_file << " dont't have three components." -// << std::endl; -// ::fclose(m_FILE); -// m_FILE = 0; -// return false; -// } -// -// m_row_stride = m_cinfo.output_width * m_cinfo.output_components; -// -// unsigned char* buffer = -// new unsigned char[m_row_stride * m_cinfo.output_height]; -// if(!buffer) { -// m_out << "tools::jpeg::jpeg_data::open :" -// << " can't alloc " << m_row_stride * m_cinfo.output_height -// << std::endl; -// ::fclose(m_FILE); -// m_FILE = 0; -// return false; -// } -// -// tools::img_byte::set(m_cinfo.output_width,m_cinfo.output_height, -// buffer,true); -// m_pos = buffer + m_row_stride * m_cinfo.output_height; -// return true; -// } -// bool read_row() { -// if(!m_FILE) return false; -// //::printf("debug : read_row %d\n",m_cinfo.output_scanline); -// if(m_cinfo.output_scanline -inline bool numbers_are_equal(const NUMBER& a_left,const NUMBER& a_right,const PREC& a_prec,PREC(*a_fabs)(const NUMBER&)) { - NUMBER diff = a_left - a_right; - if(a_fabs(diff)>=a_prec) return false; - return true; -} - -template -inline bool is_zero(const NUMBER& a_left,const PREC& a_prec,PREC(*a_fabs)(const NUMBER&)) { - if(a_fabs(a_left)>=a_prec) return false; - return true; -} - -template -inline bool vectors_are_equal(const VEC& a_1,const VEC& a_2,const PREC& a_prec,PREC(*a_fabs)(const PREC&)) { - if(a_1.size()!=a_2.size()) return false; - typedef typename VEC::size_type sz_t; - sz_t sz = a_1.size(); - //bool status = true; - for(sz_t index=0;index -inline bool vecvecs_are_equal(const VECVEC& a_1,const VECVEC& a_2,const PREC& a_prec,PREC(*a_fabs)(const PREC&)) { - if(a_1.size()!=a_2.size()) return false; - typedef typename VECVEC::size_type sz_t; - sz_t sz = a_1.size(); - for(sz_t index=0;index -inline bool numbers_are_equal(const NUMBER& a_left,const NUMBER& a_right,const PREC& a_prec,PREC(*a_fabs)(NUMBER)) { - NUMBER diff = a_left - a_right; - if(a_fabs(diff)>=a_prec) return false; - return true; -} - -template -inline bool vectors_are_equal(const VEC& a_1,const VEC& a_2,const PREC& a_prec,PREC(*a_fabs)(PREC)) { - if(a_1.size()!=a_2.size()) return false; - typedef typename VEC::size_type sz_t; - sz_t sz = a_1.size(); - //bool status = true; - for(sz_t index=0;index -inline bool vecvecs_are_equal(const VECVEC& a_1,const VECVEC& a_2,const PREC& a_prec,PREC(*a_fabs)(PREC)) { - if(a_1.size()!=a_2.size()) return false; - typedef typename VECVEC::size_type sz_t; - sz_t sz = a_1.size(); - for(sz_t index=0;index - -namespace tools { - -template -class mat3 : public mat { - typedef mat parent; - typedef mat pr; -public: -#ifdef TOOLS_MEM - mat3(bool a_inc = true):parent(a_inc) {} -#else - mat3():parent() {} -#endif - mat3(const mat& a_from):parent(a_from){} - virtual ~mat3() {} -public: - mat3(const mat3& a_from):parent(a_from){} - mat3& operator=(const mat3& a_from){ - parent::operator=(a_from); - return *this; - } -public: - mat3(const T& a_00,const T& a_01,const T& a_02, //first row - const T& a_10,const T& a_11,const T& a_12, //second row - const T& a_20,const T& a_21,const T& a_22) //third row - { - set_matrix(a_00,a_01,a_02, - a_10,a_11,a_12, - a_20,a_21,a_22); - } -public: - void set_matrix(const mat3& a_m){parent::set_matrix(a_m);} - void set_matrix(const T& a_00,const T& a_01,const T& a_02, //1 row - const T& a_10,const T& a_11,const T& a_12, //2 row - const T& a_20,const T& a_21,const T& a_22) { //3 row - //a_ - //pr::m_vec[R + C * 3]; - pr::m_vec[0] = a_00;pr::m_vec[3] = a_01;pr::m_vec[6] = a_02; - pr::m_vec[1] = a_10;pr::m_vec[4] = a_11;pr::m_vec[7] = a_12; - pr::m_vec[2] = a_20;pr::m_vec[5] = a_21;pr::m_vec[8] = a_22; - } - - void set_scale(const T& a_s) {_set_scale(a_s,a_s,a_s,pr::m_vec);} - void set_scale(const T& a_1,const T& a_2,const T& a_3) {_set_scale(a_1,a_2,a_3,pr::m_vec);} - void set_rotate(const T& a_x,const T& a_y,const T& a_z,const T& a_angle,T(*a_sin)(T),T(*a_cos)(T)) { - _set_rotate(a_x,a_y,a_z,a_angle,pr::m_vec,a_sin,a_cos); - } - - bool get_rotate(T& a_x,T& a_y,T& a_z,T& a_angle,T(*a_acos)(T),T(*a_sin)(T),T(*a_sqrt)(T)) { //warning : acos and not cos. - // used in tests/check_pauli. Same code as matTs/get_rotate. - // we assume that we have a rotation matrix. - // get (a_angle,a_n(x,y,z)) such that matrix is exp(a_angle*a_n*Rs) (passive(=coord) rotation) and then : - // exp(a_angle*n*Rs) = cos_angle*I3+(1-cos_angle)*n*n+sin_theta*n*Rs - // trace = 3*cos_angle+(1-cos_angle)*n2 - T cos_angle = T(0.5)*(pr::m_vec[0]+pr::m_vec[4]+pr::m_vec[8]-T(1)); - if((cos_angle dummy;} -}; - -//////////////////////////////////////////////// -/// common matrices : ////////////////////////// -//////////////////////////////////////////////// - -template -inline const mat3& mat3_zero() { - static const mat3 s_v(false); //inc mem count = false - return s_v; -} - -//for sf, mf : -//template -//inline const T* get_data(const mat3& a_v) {return a_v.data();} - -} - -#include - -namespace tools { - -template -inline std::ostream& operator<<(std::ostream& a_out,const mat3& a_mtx){ - const T* v = a_mtx.data(); - a_out << v[0] << "," << v[3] << "," << v[6] << std::endl - << v[1] << "," << v[4] << "," << v[7] << std::endl - << v[2] << "," << v[5] << "," << v[8] << std::endl; - return a_out; -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/lina/mat3d b/source/externals/g4tools/include/tools/lina/mat3d deleted file mode 100644 index 41d0c38f6e..0000000000 --- a/source/externals/g4tools/include/tools/lina/mat3d +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_mat3d -#define tools_mat3d - -#include "mat3" -#include - -namespace tools { - -class mat3d : public mat3 { - typedef mat3 parent; -public: - mat3d(){} - virtual ~mat3d() {} -public: - mat3d(const mat3d& a_from):parent(a_from){} - mat3d& operator=(const mat3d& a_from){ - parent::operator=(a_from); - return *this; - } -public: - mat3d(double a_00,double a_01,double a_02, //first row - double a_10,double a_11,double a_12, //second row - double a_20,double a_21,double a_22) //third row - :parent(a_00,a_01,a_02, - a_10,a_11,a_12, - a_20,a_21,a_22) - {} - mat3d(const parent& a_from):parent(a_from){} - mat3d& operator=(const parent& a_from){ - parent::operator=(a_from); - return *this; - } -public: - mat3d(const mat3& a_from):parent(){ - for(unsigned int index=0;index<9;index++) { - m_vec[index] = a_from.data()[index]; - } - } - mat3d& operator=(const mat3& a_from){ - for(unsigned int index=0;index<9;index++) { - m_vec[index] = a_from.data()[index]; - } - return *this; - } -public: - void set_rotate(const double& a_x,const double& a_y,const double& a_z,const double& a_angle) { - parent::set_rotate(a_x,a_y,a_z,a_angle,::sin,::cos); - } - void mul_rotate(const double& a_x,const double& a_y,const double& a_z,const double& a_angle) { - parent::mul_rotate(a_x,a_y,a_z,a_angle,::sin,::cos); - } - void left_mul_rotate(const double& a_x,const double& a_y,const double& a_z,const double& a_angle) { - parent::left_mul_rotate(a_x,a_y,a_z,a_angle,::sin,::cos); - } - bool get_rotate(double& a_x,double& a_y,double& a_z,double& a_angle) { - return parent::get_rotate(a_x,a_y,a_z,a_angle,::acos,::sin,::sqrt); //warning : acos and not cos. - } -public: //operators -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/lina/mat3f b/source/externals/g4tools/include/tools/lina/mat3f deleted file mode 100644 index 64def345dd..0000000000 --- a/source/externals/g4tools/include/tools/lina/mat3f +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_mat3f -#define tools_mat3f - -#include "mat3" -//#include "mathf" - -namespace tools { - -class mat3f : public mat3 { - typedef mat3 parent; -public: - mat3f(){} - mat3f(float a_00,float a_01,float a_02, //first row - float a_10,float a_11,float a_12, //second row - float a_20,float a_21,float a_22) //third row - :parent(a_00,a_01,a_02, - a_10,a_11,a_12, - a_20,a_21,a_22) - {} - virtual ~mat3f() {} -public: - mat3f(const mat3f& a_from):parent(a_from){} - mat3f& operator=(const mat3f& a_from){ - parent::operator=(a_from); - return *this; - } -public: -/* - void set_rotate(const float& a_x,const float& a_y,const float& a_z,const float& a_angle) { - parent::set_rotate(a_x,a_y,a_z,a_angle,fsin,fcos); - } - void mul_rotate(const float& a_x,const float& a_y,const float& a_z,const float& a_angle) { - parent::mul_rotate(a_x,a_y,a_z,a_angle,fsin,fcos); - } - void left_mul_rotate(const float& a_x,const float& a_y,const float& a_z,const float& a_angle) { - parent::left_mul_rotate(a_x,a_y,a_z,a_angle,fsin,fcos); - } - bool get_rotate(float& a_x,float& a_y,float& a_z,float& a_angle) { - return parent::get_rotate(a_x,a_y,a_z,a_angle,facos,fsin,fsqrt); //warning : acos and not cos. - } - */ -public: //operators -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/lina/mat4d b/source/externals/g4tools/include/tools/lina/mat4d deleted file mode 100644 index cf0df9d0a5..0000000000 --- a/source/externals/g4tools/include/tools/lina/mat4d +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_mat4d -#define tools_mat4d - -#include "mat4" -#include - -namespace tools { - -class mat4d : public mat4 { - typedef mat4 parent; -public: - mat4d(){} - virtual ~mat4d() {} -public: - mat4d(const mat4d& a_from):parent(a_from){} - mat4d& operator=(const mat4d& a_from){ - parent::operator=(a_from); - return *this; - } -public: - mat4d(double a_00,double a_01,double a_02,double a_03, //first row - double a_10,double a_11,double a_12,double a_13, //second row - double a_20,double a_21,double a_22,double a_23, //third row - double a_30,double a_31,double a_32,double a_33) //fourth row - :parent(a_00,a_01,a_02,a_03, - a_10,a_11,a_12,a_13, - a_20,a_21,a_22,a_23, - a_30,a_31,a_32,a_33) - {} - mat4d(const parent& a_from):parent(a_from){} - mat4d& operator=(const parent& a_from){ - parent::operator=(a_from); - return *this; - } -public: - mat4d(const mat4& a_from):parent(){ - for(unsigned int index=0;index<16;index++) { - m_vec[index] = a_from.data()[index]; - } - } - mat4d& operator=(const mat4& a_from){ - for(unsigned int index=0;index<16;index++) { - m_vec[index] = a_from.data()[index]; - } - return *this; - } -public: - void set_rotate(const double& a_x,const double& a_y,const double& a_z,const double& a_angle) { - parent::set_rotate(a_x,a_y,a_z,a_angle,::sin,::cos); - } - void mul_rotate(const double& a_x,const double& a_y,const double& a_z,const double& a_angle) { - parent::mul_rotate(a_x,a_y,a_z,a_angle,::sin,::cos); - } - void left_mul_rotate(const double& a_x,const double& a_y,const double& a_z,const double& a_angle) { - parent::left_mul_rotate(a_x,a_y,a_z,a_angle,::sin,::cos); - } - - template - void set_rotate(const VEC& a_dir,double a_angle) { - //WARNING : a_dir must be a normalized vector. - parent::set_rotate(a_dir[0],a_dir[1],a_dir[2],a_angle,::sin,::cos); - } - -public: //backward compatibility - void mul_2d(double& a_x,double& a_y) const { - parent::mul_2(a_x,a_y); - } - void mul_3d(double& a_x,double& a_y,double& a_z) const { - parent::mul_3(a_x,a_y,a_z); - } - void mul_4d(double& a_x,double& a_y,double& a_z,double& a_w) const { - parent::mul_4(a_x,a_y,a_z,a_w); - } -public: //operators -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/lina/rotd b/source/externals/g4tools/include/tools/lina/rotd deleted file mode 100644 index 4f0f98c67f..0000000000 --- a/source/externals/g4tools/include/tools/lina/rotd +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_rotd -#define tools_rotd - -// rotation done with quaternion. - -#include "qrot" -#include "vec3d" -#include "vec4d" -#include "mat3d" -#include "mat4d" - -namespace tools { - -class rotd : public qrot { - typedef qrot parent; -private: - rotd(double a_q0,double a_q1,double a_q2,double a_q3):parent(a_q0,a_q1,a_q2,a_q3){} -public: - rotd():parent() {} //zero rotation around the positive Z axis. - rotd(const vec3d& a_axis,double a_radians):parent(a_axis,a_radians,::sin,::cos) {} - rotd(const vec3d& a_from,const vec3d& a_to):parent(a_from,a_to,::sqrt,::fabs) {} - virtual ~rotd(){} -public: - rotd(const rotd& a_from):parent(a_from) {} - rotd& operator=(const rotd& a_from){ - parent::operator=(a_from); - return *this; - } -public: - rotd& operator*=(const rotd& a_q) { - parent::operator*=(a_q); - return *this; - } - rotd operator*(const rotd& a_r) const { - rotd tmp(*this); - tmp *= a_r; - return tmp; - } -public: - bool set_value(const vec3d& a_from,const vec3d& a_to){ - return parent::set_value(a_from,a_to,::sqrt,::fabs); - } - bool set_value(const vec3d& a_from,double a_a){ - return parent::set_value(a_from,a_a,::sin,::cos); - } - bool value(vec3d& a_from,double& a_a) const { - return parent::value(a_from,a_a,::sin,::acos); //WARNING acos and not cos - } - - //NOTE : don't handle a static object because of mem balance. - //static const rotd& identity() { - // static const rotd s_v(0,0,0,1); - // return s_v; - //} - - void value(mat4d& a_m) const {parent::value(a_m);} - void set_value(const mat4d& a_m) {parent::set_value(a_m,::sqrt);} - - double value(mat3d& a_m) const {return parent::value_3(a_m);} -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/lina/vec4d b/source/externals/g4tools/include/tools/lina/vec4d deleted file mode 100644 index a4b3385c93..0000000000 --- a/source/externals/g4tools/include/tools/lina/vec4d +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_vec4d -#define tools_vec4d - -#include "vec4" -#include - -namespace tools { - -class vec4d : public vec4 { - typedef vec4 parent; -public: - vec4d():parent() {} - vec4d(const double a_vec[4]):parent(a_vec) {} -#ifdef TOOLS_MEM - vec4d(const double& a0,const double& a1,const double& a2,const double& a3,bool a_inc = true):parent(a0,a1,a2,a3,a_inc){} -#else - vec4d(const double& a0,const double& a1,const double& a2,const double& a3):parent(a0,a1,a2,a3){} -#endif - virtual ~vec4d() {} -public: - vec4d(const vec4d& a_from):parent(a_from){} - vec4d& operator=(const vec4d& a_from){parent::operator=(a_from);return *this;} -public: //operators - vec4d operator*(double a_v) const { - return vec4d(m_data[0]*a_v, - m_data[1]*a_v, - m_data[2]*a_v, - m_data[3]*a_v); - } - vec4d operator+(const vec4d& a_v) const { - return vec4d(m_data[0]+a_v.m_data[0], - m_data[1]+a_v.m_data[1], - m_data[2]+a_v.m_data[2], - m_data[3]+a_v.m_data[3]); - } - vec4d operator-(const vec4d& a_v) const { - return vec4d(m_data[0]-a_v.m_data[0], - m_data[1]-a_v.m_data[1], - m_data[2]-a_v.m_data[2], - m_data[3]-a_v.m_data[3]); - } - vec4d& operator+=(const vec4d& a_v) { - m_data[0] += a_v.m_data[0]; - m_data[1] += a_v.m_data[1]; - m_data[2] += a_v.m_data[2]; - m_data[3] += a_v.m_data[3]; - return *this; - } - vec4d& operator*=(double a_v) { - m_data[0] *= a_v; - m_data[1] *= a_v; - m_data[2] *= a_v; - m_data[3] *= a_v; - return *this; - } - vec4d operator-() const { - return vec4d(-m_data[0],-m_data[1],-m_data[2],-m_data[3]); - } -public: - double length() const {return parent::length(::sqrt);} - double normalize() {return parent::normalize(::sqrt);} -}; - -} - -/* -#include - -namespace tools { - -#ifndef SWIG -//for sf, mf : -inline bool set_from_vec(vec4d& a_v,const std::vector& a_sv) { - if(a_sv.size()!=4) return false; - a_v[0] = a_sv[0]; - a_v[1] = a_sv[1]; - a_v[2] = a_sv[2]; - a_v[3] = a_sv[3]; - return true; -} -#endif - -} -*/ - -#endif diff --git a/source/externals/g4tools/include/tools/log_file b/source/externals/g4tools/include/tools/log_file deleted file mode 100644 index e3575b7714..0000000000 --- a/source/externals/g4tools/include/tools/log_file +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_log_file -#define tools_log_file - -#include - -#include "sys/process" -#include "sprintf" - -namespace tools { - -class log_file { -public: - static log_file& get() { - static log_file s_log_file; - return s_log_file; - } -private: - log_file():m_FILE(0) { -#ifdef _WIN32 -#if defined(_MSC_VER) && _MSC_VER < 1900 - std::string file_name("C:\\cygwin\\tmp\\inlib_log_file_"); -#else - std::string file_name("C:\\cygwin64\\tmp\\inlib_log_file_"); -#endif -#else - std::string file_name("/tmp/inlib_log_file_"); -#endif - std::string spid; - sprintf(spid,128,"%d",process_id()); - file_name += spid; - m_FILE = ::fopen(file_name.c_str(),"wb"); - } - ~log_file() {if(m_FILE) ::fclose(m_FILE);} -protected: - log_file(const log_file&):m_FILE(0) {} - log_file& operator=(const log_file&) {return *this;} -public: - void close() {if(m_FILE) ::fclose(m_FILE);m_FILE = 0;} - void write(const std::string& a_string) const { - if(!m_FILE) return; - if(::fprintf(m_FILE,"%s",a_string.c_str())<0) {} - } - void writef(const char* a_format,...) const { - if(!m_FILE) return; - std::string s; - va_list args; - va_start(args,a_format); - if(vsprintf(s,1000,a_format,args)) write(s); - va_end(args); - } -protected: - FILE* m_FILE; -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/metal/render.hm b/source/externals/g4tools/include/tools/metal/render.hm deleted file mode 100644 index 45553e9673..0000000000 --- a/source/externals/g4tools/include/tools/metal/render.hm +++ /dev/null @@ -1,1424 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_metal_render -#define tools_metal_render - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -namespace tools { -namespace metal { - -class manager : public virtual tools::sg::render_manager { - typedef tools::sg::render_manager parent; -public: - TOOLS_SCLASS(tools::metal::manager) - virtual void* cast(const std::string& a_class) const { - if(void* p = tools::cmp_cast(this,a_class)) {return p;} - else return 0; - } -public: - virtual bool begin_render(int a_x,int a_y,unsigned int a_w,unsigned int a_h,float a_r,float a_g,float a_b,float a_a,bool = true) { - if(!m_view) return false; - create_pipeline_state(); - //::printf("debug : manager::begin_render : 000 : %d %d\n",a_w,a_h); - m_render_command_encoder = 0; - m_command_buffer = [m_command_queue commandBuffer]; - create_render_command_encoder(a_x,a_y,a_w,a_h,a_r,a_g,a_b,a_a); - return true; - } - - virtual void end_render() { - //::printf("debug : manager::end_render : 000\n"); - end_encoding(); - [m_render_pipeline_state release]; - } - - virtual unsigned int create_texture(const tools::img_byte& a_img,bool /*a_NEAREST*/) { - //::printf("debug : create_texture : size = %d, w = %d, h = %d, bpp %d\n", - // a_img.size(),a_img.width(),a_img.height(),a_img.bpp()); - - tools::img_byte* _img = 0; - bool _img_delete = false; - - if(a_img.bpp()==1) { //exa eiffel-tower.png - tools::img_byte img3; - if(!a_img.bw2x(3,img3)) { - m_out << "tools::metal::manager::create_texture : a_imgr.bw2x() failed." << std::endl; - return 0; - } - tools::img_byte img4; - if(!img3.rgb2rgba(img4,255)){ - m_out << "tools::metal::manager::create_texture : rgb2rgba failed." << std::endl; - return 0; - } - _img = new tools::img_byte; - _img_delete = true; - _img->transfer(img4); - - } else if(a_img.bpp()==3) { - tools::img_byte img4; - if(!a_img.rgb2rgba(img4,255)){ - m_out << "tools::metal::manager::create_texture : rgb2rgba failed." << std::endl; - return 0; - } - _img = new tools::img_byte; - _img_delete = true; - _img->transfer(img4); - - } else if(a_img.bpp()==4) { //exa windusrf.png, text_freetype/font_pixmap. - _img = const_cast(&a_img); - } else { - //should not happen. - m_out << "tools::metal::manager::create_texture :" - << " image with bpp " << a_img.bpp() << " not (yet) supported." - << std::endl; - if(_img_delete) delete _img; - return 0; - } - if(_img->is_empty()) { - if(_img_delete) delete _img; - return 0; - } - - _img->rgba2bgra(); - - m_gen_id++; - - MTLTextureDescriptor* tex_desc = [[MTLTextureDescriptor alloc] init]; - tex_desc.pixelFormat = MTLPixelFormatBGRA8Unorm; - tex_desc.width = _img->width(); - tex_desc.height = _img->height(); - - id texture = [m_device newTextureWithDescriptor:tex_desc]; - - NSUInteger bytes_per_row = _img->bpp() * _img->width(); - - MTLRegion region = { - {0,0,0}, // MTLOrigin - {_img->width(),_img->height(),1} // MTLSize - }; - - [texture replaceRegion:region mipmapLevel:0 withBytes:_img->buffer() bytesPerRow:bytes_per_row]; - - m_tex_gstos[m_gen_id] = new tex_gsto(texture,_img->size(),m_out,*this); - if(_img_delete) delete _img; - return m_gen_id; - } - - virtual unsigned int create_gsto_from_data(size_t a_floatn,const float* a_data) { - if(!a_floatn) return 0; - m_gen_id++; - m_data_gstos[m_gen_id] = new data_gsto(a_data,a_floatn,m_out,*this); - return m_gen_id; - } - - virtual bool is_gsto_id_valid(unsigned int a_id) const { - {std::map::const_iterator it = m_tex_gstos.find(a_id); - if(it!=m_tex_gstos.end()) return true;} - {std::map::const_iterator it = m_data_gstos.find(a_id); - if(it!=m_data_gstos.end()) return true;} - return false; - } - virtual void delete_gsto(unsigned int a_id) { - tools::delete_key(m_tex_gstos,a_id); - tools::delete_key(m_data_gstos,a_id); - } - - virtual tools::sg::gsto_mode get_gsto_mode() const {return tools::sg::gsto_gl_vbo;} - virtual void set_gsto_mode(tools::sg::gsto_mode) {} - virtual void available_gsto_modes(std::vector& a_v) { - a_v.clear(); - a_v.push_back(tools::sg::s_gsto_gl_vbo()); - } - virtual void available_not_memory_gsto_mode(std::string& a_s) const { - a_s = tools::sg::s_gsto_gl_vbo(); - } - virtual size_t used_texture_memory() const { - size_t sz = 0; - std::map::const_iterator it; - for(it=m_tex_gstos.begin();it!=m_tex_gstos.end();++it) {sz += (*it).second->m_size;} - return sz; - } - virtual size_t gstos_size() const { - size_t sz = 0; - {tools_mforcit(unsigned int,tex_gsto*,m_tex_gstos,it) {sz += (*it).second->m_size;}} - {tools_mforcit(unsigned int,data_gsto*,m_data_gstos,it) {sz += (*it).second->m_size;}} - return sz; - } - -public: - manager(std::ostream& a_out) - :m_out(a_out) - ,m_gen_id(0) - ,m_view(0) - ,m_device(0) - ,m_command_queue(0) - ,m_render_pipeline_state(0) - ,m_depth_stencil_state_on(0) - ,m_depth_stencil_state_off(0) - ,m_command_buffer(0) - ,m_render_command_encoder(0) - { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - m_device = MTLCreateSystemDefaultDevice(); - m_command_queue = [m_device newCommandQueue]; - - //create_pipeline_state(); - - {MTLDepthStencilDescriptor* depth_stencil_desc = [[MTLDepthStencilDescriptor alloc] init]; - depth_stencil_desc.depthWriteEnabled = YES; - depth_stencil_desc.depthCompareFunction = MTLCompareFunctionLess; - m_depth_stencil_state_on = [m_device newDepthStencilStateWithDescriptor:depth_stencil_desc];} - - {MTLDepthStencilDescriptor* depth_stencil_desc = [[MTLDepthStencilDescriptor alloc] init]; - depth_stencil_desc.depthWriteEnabled = NO; - depth_stencil_desc.depthCompareFunction = MTLCompareFunctionLess; - m_depth_stencil_state_off = [m_device newDepthStencilStateWithDescriptor:depth_stencil_desc];} - } - virtual ~manager(){ - //[m_render_pipeline_state release]; - [m_depth_stencil_state_on release]; - [m_depth_stencil_state_off release]; - [m_command_queue release]; - - tools::safe_clear(m_tex_gstos); - tools::safe_clear(m_data_gstos); -#ifdef TOOLS_MEM - tools::mem::decrement(s_class().c_str()); -#endif - } -private: -public: - manager(const manager& a_from) - :parent(a_from) - ,m_out(a_from.m_out) - ,m_gen_id(a_from.m_gen_id) - ,m_view(0) - ,m_device(0) - ,m_command_queue(0) - ,m_render_pipeline_state(0) - ,m_depth_stencil_state_on(0) - ,m_depth_stencil_state_off(0) - ,m_command_buffer(0) - ,m_render_command_encoder(0) - { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - } - manager& operator=(const manager& a_from){ - if(&a_from==this) return *this; - tools::safe_clear(m_tex_gstos); - tools::safe_clear(m_data_gstos); - return *this; - } -public: - void delete_gstos() { - tools::safe_clear(m_tex_gstos); - tools::safe_clear(m_data_gstos); - } - -public: - bool find_texture(unsigned int a_id,id& a_texture) const { - std::map::const_iterator it = m_tex_gstos.find(a_id); - if(it==m_tex_gstos.end()) {a_texture = 0;return false;} - a_texture = (*it).second->m_texture; - return true; - } - bool find_data_gsto(unsigned int a_id,char*& a_data) const { - std::map::const_iterator it = m_data_gstos.find(a_id); - if(it==m_data_gstos.end()) {a_data = 0;return false;} - a_data = (*it).second->m_buffer; - return true; - } - - std::ostream& out() const {return m_out;} - - id& device() {return m_device;} - id& render_command_encoder() {return m_render_command_encoder;} - id& depth_stencil_state_on() {return m_depth_stencil_state_on;} - id& depth_stencil_state_off() {return m_depth_stencil_state_off;} - void set_view(MTKView* a_view) {m_view = a_view;} -protected: - class data_gsto { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::metal::manager::data_gsto) -#endif - public: - data_gsto(const float* a_floats,size_t a_floatn,std::ostream& a_out,manager& a_mgr) - :m_buffer(0) - ,m_size(0) - ,m_out(a_out) - ,m_mgr(a_mgr) - { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - m_size = a_floatn*sizeof(float); - m_buffer = new char[m_size]; - ::memcpy(m_buffer,a_floats,m_size); - } - virtual ~data_gsto(){ - delete [] m_buffer; -#ifdef TOOLS_MEM - tools::mem::decrement(s_class().c_str()); -#endif - } - private: - data_gsto(const data_gsto& a_from) - :m_buffer(0) - ,m_size(a_from.m_size) - ,m_out(a_from.m_out) - ,m_mgr(a_from.m_mgr) - { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - } - data_gsto& operator=(const data_gsto& a_from){ - m_buffer = 0; - m_size = a_from.m_size; - return *this; - } - public: - char* m_buffer; - size_t m_size; - std::ostream& m_out; - manager& m_mgr; - }; - - class tex_gsto { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::metal::manager::tex_gsto) -#endif - public: - tex_gsto(id& a_texture,size_t a_size,std::ostream& a_out,manager& a_mgr) - :m_texture(a_texture) - ,m_size(a_size) - ,m_out(a_out) - ,m_mgr(a_mgr) - { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - } - virtual ~tex_gsto(){ - [m_texture release]; //is it needed ? -#ifdef TOOLS_MEM - tools::mem::decrement(s_class().c_str()); -#endif - } - private: - tex_gsto(const tex_gsto& a_from) - :m_texture(a_from.m_texture) - ,m_size(a_from.m_size) - ,m_out(a_from.m_out) - ,m_mgr(a_from.m_mgr) - { -#ifdef TOOLS_MEM - tools::mem::increment(s_class().c_str()); -#endif - } - tex_gsto& operator=(const tex_gsto& a_from){ - m_texture = a_from.m_texture; - m_size = a_from.m_size; - return *this; - } - public: - id m_texture; - size_t m_size; - std::ostream& m_out; - manager& m_mgr; - }; -private: - void create_pipeline_state() { - const char shaders_src[] = "\ - #include \n\ - #include \n\ - struct uniforms {\n\ - simd::float4x4 proj_model_matrix;\n\ - simd::float4x4 normal_matrix;\n\ - unsigned int light_on;\n\ - simd::float4 light_color;\n\ - simd::float3 light_direction;\n\ - unsigned int texturing;\n\ - };\n\ - struct vertex_in {\n\ - simd::float4 position [[attribute(0)]];\n\ - simd::float4 normal [[attribute(1)]];\n\ - simd::float4 color [[attribute(2)]];\n\ - simd::float2 texture_coordinate [[attribute(3)]];\n\ - };\n\ - struct vertex_out {\n\ - simd::float4 position [[position]];\n\ - simd::float3 normal;\n\ - simd::float4 color;\n\ - simd::float2 texture_coordinate;\n\ - unsigned int light_on;\n\ - simd::float4 light_color;\n\ - simd::float3 light_direction;\n\ - unsigned int texturing;\n\ - /*float pointsize [[point_size]];*/\n\ - };\n\ - vertex vertex_out vert_shader(vertex_in a_in [[stage_in]],constant uniforms& a_uniforms [[buffer(1)]]) {\n\ - vertex_out out;\n\ -\n\ - out.position = a_uniforms.proj_model_matrix * a_in.position;\n\ - out.normal = simd::normalize((a_uniforms.normal_matrix * a_in.normal).xyz);\n\ - out.color = a_in.color;\n\ - out.texture_coordinate = a_in.texture_coordinate;\n\ -\n\ - out.light_on = a_uniforms.light_on;\n\ - out.light_color = a_uniforms.light_color;\n\ - out.light_direction = a_uniforms.light_direction;\n\ - out.texturing = a_uniforms.texturing;\n\ -\n\ - return out;\n\ - }\n\ - fragment simd::float4 frag_shader(vertex_out a_in [[stage_in]],simd::texture2d a_color [[texture(0)]]) {\n\ - if(a_in.texturing) {\n\ - constexpr simd::sampler texture_sampler(simd::mag_filter::linear,simd::min_filter::linear);\n\ - const half4 color_sample = a_color.sample(texture_sampler,a_in.texture_coordinate);\n\ - return simd::float4(color_sample)*a_in.color;\n\ - } else {\n\ - if(a_in.light_on) {\n\ - simd::float4 black(0,0,0,1);\n\ - /*simd::float4 red(1,0,0,1);*/\n\ - float _dot = simd::dot(a_in.normal,a_in.light_direction);\n\ - if(_dot<0.0) {\n\ - _dot *= -1;\n\ - float cooking = 1.4; /*to have same intensity as GL on desktops.*/\n\ - simd::float4 diffuse_color = a_in.light_color*_dot*cooking;\n\ - simd::float4 _color = diffuse_color*a_in.color;\n\ - /*simd::float4 _color = _dot*a_in.color;*/\n\ - _color[3] = a_in.color[3];\n\ - return _color;\n\ - } else {\n\ - return black;\n\ - /*return red;*/\n\ - }\n\ - } else {\n\ - return a_in.color;\n\ - }\n\ - }\n\ - }\n\ -"; - - MTLVertexDescriptor* vert_desc = [MTLVertexDescriptor vertexDescriptor]; - vert_desc.attributes[0].format = MTLVertexFormatFloat4; - vert_desc.attributes[0].bufferIndex = 0; - vert_desc.attributes[0].offset = 0; - - vert_desc.attributes[1].format = MTLVertexFormatFloat4; - vert_desc.attributes[1].bufferIndex = 0; - vert_desc.attributes[1].offset = sizeof(float)*4; - - vert_desc.attributes[2].format = MTLVertexFormatFloat4; - vert_desc.attributes[2].bufferIndex = 0; - vert_desc.attributes[2].offset = sizeof(float)*8; - - vert_desc.attributes[3].format = MTLVertexFormatFloat2; - vert_desc.attributes[3].bufferIndex = 0; - vert_desc.attributes[3].offset = sizeof(float)*12; - - vert_desc.layouts[0].stride = 14*sizeof(float); - vert_desc.layouts[0].stepFunction = MTLVertexStepFunctionPerVertex; - - MTLCompileOptions* opts = [[MTLCompileOptions alloc] init]; - NSString* src = [[NSString alloc] initWithUTF8String:shaders_src]; - id library = [m_device newLibraryWithSource:src options:opts error:nullptr]; - [src release]; - [opts release]; - id vert_func = [library newFunctionWithName:@"vert_shader"]; - id frag_func = [library newFunctionWithName:@"frag_shader"]; - MTLRenderPipelineDescriptor* render_pipeline_desc = [[MTLRenderPipelineDescriptor alloc] init]; - render_pipeline_desc.label = @"pipeline"; - render_pipeline_desc.vertexFunction = vert_func; - render_pipeline_desc.fragmentFunction = frag_func; - render_pipeline_desc.vertexDescriptor = vert_desc; - render_pipeline_desc.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm; - render_pipeline_desc.stencilAttachmentPixelFormat = [m_view depthStencilPixelFormat]; - render_pipeline_desc.depthAttachmentPixelFormat = [m_view depthStencilPixelFormat]; - m_render_pipeline_state = [m_device newRenderPipelineStateWithDescriptor:render_pipeline_desc error:nullptr]; - [library release]; - [vert_func release]; - [frag_func release]; - } - void create_render_command_encoder(int /*a_x*/,int /*a_y*/,unsigned int /*a_w*/,unsigned int /*a_h*/,float a_r,float a_g,float a_b,float a_a) { - MTLRenderPassDescriptor* render_pass_desc = [m_view currentRenderPassDescriptor]; - [render_pass_desc setRenderTargetArrayLength:1]; - - MTLRenderPassColorAttachmentDescriptor* color_attachment_desc = [render_pass_desc colorAttachments][0]; - color_attachment_desc.clearColor = MTLClearColorMake(a_r,a_g,a_b,a_a); - - m_render_command_encoder = [m_command_buffer renderCommandEncoderWithDescriptor:render_pass_desc]; - [m_render_command_encoder setRenderPipelineState:m_render_pipeline_state]; - - //double znear = 0.0; - //double zfar = 1.0; - //[m_render_command_encoder setViewport:(MTLViewport){double(a_x),double(a_y),2.0*double(a_w),2.0*double(a_h),znear,zfar}]; - - [m_render_command_encoder setDepthStencilState:m_depth_stencil_state_on]; - //[m_render_command_encoder setDepthClipMode:MTLDepthClipModeClip]; - [m_render_command_encoder setFrontFacingWinding:MTLWindingCounterClockwise]; - [m_render_command_encoder setCullMode:MTLCullModeBack]; - } - void end_encoding() { - if(m_view) { - if(m_render_command_encoder) [m_render_command_encoder endEncoding]; - id drawable = [m_view currentDrawable]; - if(drawable) [m_command_buffer presentDrawable:drawable]; - } - [m_command_buffer commit]; - [m_command_buffer waitUntilCompleted]; - //[m_command_buffer waitUntilScheduled]; - } - -protected: - std::ostream& m_out; - unsigned int m_gen_id; - std::map m_tex_gstos; - std::map m_data_gstos; - MTKView* m_view; - id m_device; - id m_command_queue; - id m_render_pipeline_state; - id m_depth_stencil_state_on; - id m_depth_stencil_state_off; - id m_command_buffer; - id m_render_command_encoder; -}; - -class render : public tools::sg::render_action { - TOOLS_ACTION(render,tools::metal::render,tools::sg::render_action) -public: - virtual void clear_color(float,float,float,float){} - virtual void draw_vertex_array(tools::gl::mode_t a_mode,size_t a_floatn,const float* a_xyzs){ - if(!tools::gl::is_mode(a_mode)) return; - size_t num = a_floatn/3; - if(!num) return; - - if(!m_mgr.render_command_encoder()) return; - - //::printf("debug : draw_vertex_array : 000 : %lu %d\n",num,a_mode); - - float* buffer = 0; - MTLPrimitiveType primitive_type; - if(a_mode==tools::gl::points()) { - primitive_type = MTLPrimitiveTypePoint; - if(!fill_buffer(num,a_xyzs,buffer)) return; - - } else if(a_mode==tools::gl::lines()) { - primitive_type = MTLPrimitiveTypeLine; - if(!fill_buffer(num,a_xyzs,buffer)) return; - - } else if(a_mode==tools::gl::line_loop()) { - primitive_type = MTLPrimitiveTypeLineStrip; - size_t nxyz = (num+1)*3; - float* xyzs = new float[nxyz]; - {float* pxyzs = xyzs; - tools::gl::line_loop_to_line_strip(num,a_xyzs,pxyzs);} - num = nxyz/3; - bool status = fill_buffer(num,xyzs,buffer); - delete [] xyzs; - if(!status) return; - - } else if(a_mode==tools::gl::line_strip()) { - primitive_type = MTLPrimitiveTypeLineStrip; - if(!fill_buffer(num,a_xyzs,buffer)) return; - - } else if(a_mode==tools::gl::triangles()) { - primitive_type = MTLPrimitiveTypeTriangle; - if(!fill_buffer(num,a_xyzs,buffer)) return; - - } else if(a_mode==tools::gl::triangle_fan()) { - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - {float* pxyzs = xyzs; - tools::gl::triangle_fan_to_triangles(num,a_xyzs,pxyzs);} - num = nxyz/3; - bool status = fill_buffer(num,xyzs,buffer); - delete [] xyzs; - if(!status) return; - - } else if(a_mode==tools::gl::triangle_strip()) { - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - {float* pxyzs = xyzs; - tools::gl::triangle_strip_to_triangles(num,a_xyzs,pxyzs);} - num = nxyz/3; - bool status = fill_buffer(num,xyzs,buffer); - delete [] xyzs; - if(!status) return; - - } else { - ::printf("debug : draw_vertex_array : mode not handled yet : %lu %d\n",num,a_mode); - return; - } - if(!buffer) return; - - MTLResourceOptions opts = 0; - id vertex_buffer = [m_mgr.device() newBufferWithBytes:buffer length:num*14*sizeof(float) options:opts]; - - uniforms _uniforms; - set_uniforms(_uniforms,false); - id uniforms_buffer = [m_mgr.device() newBufferWithBytes:(void*)&_uniforms length:sizeof(uniforms) options:opts]; - - if(m_ccw) { - [m_mgr.render_command_encoder() setFrontFacingWinding:MTLWindingCounterClockwise]; - } else { - [m_mgr.render_command_encoder() setFrontFacingWinding:MTLWindingClockwise]; - } - - if(m_depth_test) { - [m_mgr.render_command_encoder() setDepthStencilState:m_mgr.depth_stencil_state_on()]; - } else { - [m_mgr.render_command_encoder() setDepthStencilState:m_mgr.depth_stencil_state_off()]; - } - - [m_mgr.render_command_encoder() setVertexBuffer:vertex_buffer offset:0 atIndex:0]; - [m_mgr.render_command_encoder() setVertexBuffer:uniforms_buffer offset:0 atIndex:1]; - [m_mgr.render_command_encoder() drawPrimitives:primitive_type vertexStart:0 vertexCount:num]; - - [vertex_buffer release]; - [uniforms_buffer release]; - - delete [] buffer; - } - - virtual void draw_vertex_array_xy(tools::gl::mode_t a_mode,size_t a_floatn,const float* a_xys){ - if(!tools::gl::is_mode(a_mode)) return; - size_t num = a_floatn/2; - if(!num) return; - //::printf("debug : draw_vertex_array_xy %lu\n",num); - float* xyzs = new float[num*3]; - float* pxyzs = xyzs; - tools::gl::cvt_2to3(num,a_xys,pxyzs); - draw_vertex_array(a_mode,num*3,xyzs); - delete [] xyzs; - } - - virtual void draw_vertex_color_array(tools::gl::mode_t a_mode,size_t a_floatn,const float* a_xyzs,const float* a_rgbas){ - if(!tools::gl::is_mode(a_mode)) return; - size_t num = a_floatn/3; - if(!num) return; - - if(!m_mgr.render_command_encoder()) return; - //::printf("debug : draw_vertex_color_array : 000 : num %lu, mode %d\n",num,a_mode); - - float* buffer = 0; - MTLPrimitiveType primitive_type; - if(a_mode==tools::gl::points()) { - primitive_type = MTLPrimitiveTypePoint; - if(!fill_buffer_rgbas(num,a_xyzs,a_rgbas,buffer)) return; - - } else if(a_mode==tools::gl::lines()) { - primitive_type = MTLPrimitiveTypeLine; - if(!fill_buffer_rgbas(num,a_xyzs,a_rgbas,buffer)) return; - - } else if(a_mode==tools::gl::line_loop()) { - ::printf("debug : draw_vertex_color_array : line_loop : have to handle a_rgbas\n"); - primitive_type = MTLPrimitiveTypeLineStrip; - size_t nxyz = (num+1)*3; - float* xyzs = new float[nxyz]; - {float* pxyzs = xyzs; - tools::gl::line_loop_to_line_strip(num,a_xyzs,pxyzs);} - num = nxyz/3; - bool status = fill_buffer(num,xyzs,buffer); - delete [] xyzs; - if(!status) return; - - } else if(a_mode==tools::gl::line_strip()) { - primitive_type = MTLPrimitiveTypeLineStrip; - if(!fill_buffer_rgbas(num,a_xyzs,a_rgbas,buffer)) return; - - } else if(a_mode==tools::gl::triangles()) { - primitive_type = MTLPrimitiveTypeTriangle; - if(!fill_buffer_rgbas(num,a_xyzs,a_rgbas,buffer)) return; - - } else if(a_mode==tools::gl::triangle_fan()) { - ::printf("debug : draw_vertex_color_array : triangle_fan : have to handle a_rgbas\n"); - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - {float* pxyzs = xyzs; - tools::gl::triangle_fan_to_triangles(num,a_xyzs,pxyzs);} - num = nxyz/3; - bool status = fill_buffer(num,xyzs,buffer); - delete [] xyzs; - if(!status) return; - - } else if(a_mode==tools::gl::triangle_strip()) { - ::printf("debug : draw_vertex_color_array : triangle_strip : have to handle a_rgbas\n"); - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - {float* pxyzs = xyzs; - tools::gl::triangle_strip_to_triangles(num,a_xyzs,pxyzs);} - num = nxyz/3; - bool status = fill_buffer(num,xyzs,buffer); - delete [] xyzs; - if(!status) return; - - } else { - ::printf("debug : draw_vertex_color_array : mode not handled yet : %lu %d\n",num,a_mode); - return; - } - if(!buffer) return; - - MTLResourceOptions opts = 0; - id vertex_buffer = [m_mgr.device() newBufferWithBytes:buffer length:num*14*sizeof(float) options:opts]; - - uniforms _uniforms; - set_uniforms(_uniforms,false); - id uniforms_buffer = [m_mgr.device() newBufferWithBytes:(void*)&_uniforms length:sizeof(uniforms) options:opts]; - - if(m_ccw) { - [m_mgr.render_command_encoder() setFrontFacingWinding:MTLWindingCounterClockwise]; - } else { - [m_mgr.render_command_encoder() setFrontFacingWinding:MTLWindingClockwise]; - } - - [m_mgr.render_command_encoder() setVertexBuffer:vertex_buffer offset:0 atIndex:0]; - [m_mgr.render_command_encoder() setVertexBuffer:uniforms_buffer offset:0 atIndex:1]; - [m_mgr.render_command_encoder() drawPrimitives:primitive_type vertexStart:0 vertexCount:num]; - - [vertex_buffer release]; - [uniforms_buffer release]; - - delete [] buffer; - } - - virtual void draw_vertex_normal_array(tools::gl::mode_t a_mode,size_t a_floatn,const float* a_xyzs,const float* a_nms){ - if(!tools::gl::is_mode(a_mode)) return; - size_t num = a_floatn/3; - if(!num) return; - - if(!m_mgr.render_command_encoder()) return; - //::printf("debug : draw_vertex_normal_array : 000 : num %lu, mode %d\n",num,a_mode); - - float* buffer = 0; - MTLPrimitiveType primitive_type; - if(a_mode==tools::gl::points()) { - primitive_type = MTLPrimitiveTypePoint; - if(!fill_buffer_nms(num,a_xyzs,a_nms,buffer)) return; - - } else if(a_mode==tools::gl::lines()) { - primitive_type = MTLPrimitiveTypeLine; - if(!fill_buffer_nms(num,a_xyzs,a_nms,buffer)) return; - - } else if(a_mode==tools::gl::line_loop()) { - ::printf("debug : draw_vertex_normal_array : line_loop to handle nms\n"); - primitive_type = MTLPrimitiveTypeLineStrip; - size_t nxyz = (num+1)*3; - float* xyzs = new float[nxyz]; - {float* pxyzs = xyzs; - tools::gl::line_loop_to_line_strip(num,a_xyzs,pxyzs);} - num = nxyz/3; - bool status = fill_buffer(num,xyzs,buffer); - delete [] xyzs; - if(!status) return; - - } else if(a_mode==tools::gl::line_strip()) { - primitive_type = MTLPrimitiveTypeLineStrip; - if(!fill_buffer_nms(num,a_xyzs,a_nms,buffer)) return; - - } else if(a_mode==tools::gl::triangles()) { - primitive_type = MTLPrimitiveTypeTriangle; - if(!fill_buffer_nms(num,a_xyzs,a_nms,buffer)) return; - - } else if(a_mode==tools::gl::triangle_fan()) { - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - float* nms = new float[nxyz]; - {float* pxyzs = xyzs; - float* pnms = nms; - tools::gl::triangle_fan_to_triangles_nms(num,a_xyzs,a_nms,pxyzs,pnms);} - num = nxyz/3; - bool status = fill_buffer_nms(num,xyzs,nms,buffer); - delete [] xyzs; - delete [] nms; - if(!status) return; - - } else if(a_mode==tools::gl::triangle_strip()) { - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - float* nms = new float[nxyz]; - {float* pxyzs = xyzs; - float* pnms = nms; - tools::gl::triangle_strip_to_triangles_nms(num,a_xyzs,a_nms,pxyzs,pnms);} - num = nxyz/3; - bool status = fill_buffer_nms(num,xyzs,nms,buffer); - delete [] xyzs; - delete [] nms; - if(!status) return; - - } else { - ::printf("debug : draw_vertex_normal_array : mode not handled yet : %lu %d\n",num,a_mode); - return; - } - if(!buffer) return; - - MTLResourceOptions opts = 0; - id vertex_buffer = [m_mgr.device() newBufferWithBytes:buffer length:num*14*sizeof(float) options:opts]; - - uniforms _uniforms; - set_uniforms(_uniforms,false); - id uniforms_buffer = [m_mgr.device() newBufferWithBytes:(void*)&_uniforms length:sizeof(uniforms) options:opts]; - - if(m_ccw) { - [m_mgr.render_command_encoder() setFrontFacingWinding:MTLWindingCounterClockwise]; - } else { - [m_mgr.render_command_encoder() setFrontFacingWinding:MTLWindingClockwise]; - } - - [m_mgr.render_command_encoder() setVertexBuffer:vertex_buffer offset:0 atIndex:0]; - [m_mgr.render_command_encoder() setVertexBuffer:uniforms_buffer offset:0 atIndex:1]; - [m_mgr.render_command_encoder() drawPrimitives:primitive_type vertexStart:0 vertexCount:num]; - - [vertex_buffer release]; - [uniforms_buffer release]; - - delete [] buffer; - } - - virtual void draw_vertex_color_normal_array(tools::gl::mode_t a_mode, - size_t a_floatn,const float* a_xyzs,const float* a_rgbas,const float* a_nms){ - if(!tools::gl::is_mode(a_mode)) return; - size_t num = a_floatn/3; - if(!num) return; - - if(!m_mgr.render_command_encoder()) return; - //::printf("debug : draw_vertex_color_normal_array : 000 : num %lu, mode %d\n",num,a_mode); - - float* buffer = 0; - MTLPrimitiveType primitive_type; - if(a_mode==tools::gl::points()) { - primitive_type = MTLPrimitiveTypePoint; - if(!fill_buffer_rgbas_nms(num,a_xyzs,a_rgbas,a_nms,buffer)) return; - - } else if(a_mode==tools::gl::lines()) { - primitive_type = MTLPrimitiveTypeLine; - if(!fill_buffer_rgbas_nms(num,a_xyzs,a_rgbas,a_nms,buffer)) return; - - } else if(a_mode==tools::gl::line_loop()) { - ::printf("debug : draw_vertex_color_normal_array : line_loop : have to handle rgbas and nms\n"); - primitive_type = MTLPrimitiveTypeLineStrip; - size_t nxyz = (num+1)*3; - float* xyzs = new float[nxyz]; - {float* pxyzs = xyzs; - tools::gl::line_loop_to_line_strip(num,a_xyzs,pxyzs);} - num = nxyz/3; - bool status = fill_buffer(num,xyzs,buffer); - delete [] xyzs; - if(!status) return; - - } else if(a_mode==tools::gl::line_strip()) { - primitive_type = MTLPrimitiveTypeLineStrip; - if(!fill_buffer_rgbas_nms(num,a_xyzs,a_rgbas,a_nms,buffer)) return; - - } else if(a_mode==tools::gl::triangles()) { - primitive_type = MTLPrimitiveTypeTriangle; - if(!fill_buffer_rgbas_nms(num,a_xyzs,a_rgbas,a_nms,buffer)) return; - - } else if(a_mode==tools::gl::triangle_fan()) { - ::printf("debug : draw_vertex_color_normal_array : triangle_fan : have to handle rgbas\n"); - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - float* nms = new float[nxyz]; - {float* pxyzs = xyzs; - float* pnms = nms; - tools::gl::triangle_fan_to_triangles_nms(num,a_xyzs,a_nms,pxyzs,pnms);} - num = nxyz/3; - bool status = fill_buffer_nms(num,xyzs,nms,buffer); - delete [] xyzs; - delete [] nms; - if(!status) return; - - } else if(a_mode==tools::gl::triangle_strip()) { - ::printf("debug : draw_vertex_color_normal_array : triangle_strip : have to handle rgbas\n"); - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - float* nms = new float[nxyz]; - {float* pxyzs = xyzs; - float* pnms = nms; - tools::gl::triangle_strip_to_triangles_nms(num,a_xyzs,a_nms,pxyzs,pnms);} - num = nxyz/3; - bool status = fill_buffer_nms(num,xyzs,nms,buffer); - delete [] xyzs; - delete [] nms; - if(!status) return; - - } else { - ::printf("debug : draw_vertex_color_normal_array : mode not handled yet : %lu %d\n",num,a_mode); - return; - } - if(!buffer) return; - - MTLResourceOptions opts = 0; - id vertex_buffer = [m_mgr.device() newBufferWithBytes:buffer length:num*14*sizeof(float) options:opts]; - - uniforms _uniforms; - set_uniforms(_uniforms,false); - id uniforms_buffer = [m_mgr.device() newBufferWithBytes:(void*)&_uniforms length:sizeof(uniforms) options:opts]; - - if(m_ccw) { - [m_mgr.render_command_encoder() setFrontFacingWinding:MTLWindingCounterClockwise]; - } else { - [m_mgr.render_command_encoder() setFrontFacingWinding:MTLWindingClockwise]; - } - - [m_mgr.render_command_encoder() setVertexBuffer:vertex_buffer offset:0 atIndex:0]; - [m_mgr.render_command_encoder() setVertexBuffer:uniforms_buffer offset:0 atIndex:1]; - [m_mgr.render_command_encoder() drawPrimitives:primitive_type vertexStart:0 vertexCount:num]; - - [vertex_buffer release]; - [uniforms_buffer release]; - - delete [] buffer; - } - - virtual void draw_vertex_array_texture(tools::gl::mode_t a_mode, - size_t a_floatn, - const float* /*a_xyzs*/, - gstoid /*a_id*/, - const float* /*a_tcs*/) { - if(!tools::gl::is_mode(a_mode)) return; - size_t num = a_floatn/3; - if(!num) return; - ::printf("debug : draw_vertex_array_texture : dummy : mode %d, num %lu\n",a_mode,a_floatn); - - //expect 2*num a_tcs. - - /////////////////////// - /// get texture : ///// - /////////////////////// - /* - std::string sid; - if(!m_mgr.find_sid(a_id,sid)) { - m_out << "tools::metal::render::draw_vertex_array_texture : can't find texture " << sid << "." << std::endl; - return; - } - */ - //::printf("debug : draw_vertex_array_texture : use tex %s\n",sid.c_str()); - } - - virtual void draw_vertex_normal_array_texture(tools::gl::mode_t a_mode, - size_t a_floatn, - const float* a_xyzs, - const float* /*a_nms*/, - gstoid a_id, - const float* a_tcs) { - if(!tools::gl::is_mode(a_mode)) return; - size_t num = a_floatn/3; - if(!num) return; - - if(!m_mgr.render_command_encoder()) return; - - //::printf("debug : draw_vertex_normal_array_texture : dummy : %d %lu\n",a_mode,a_floatn); - - //expect 2*num a_tcs. - - /////////////////////// - /// get texture : ///// - /////////////////////// - id _texture; - if(!m_mgr.find_texture(a_id,_texture)) { - m_out << "tools::metal::render::draw_vertex_array_texture : can't find texture " << a_id << "." << std::endl; - return; - } - - float* buffer = 0; - MTLPrimitiveType primitive_type; - if(a_mode==tools::gl::points()) { - primitive_type = MTLPrimitiveTypePoint; - if(!fill_buffer_texture(num,a_xyzs,a_tcs,buffer)) return; - - } else if(a_mode==tools::gl::lines()) { - primitive_type = MTLPrimitiveTypeLine; - if(!fill_buffer_texture(num,a_xyzs,a_tcs,buffer)) return; - - } else if(a_mode==tools::gl::line_loop()) { - primitive_type = MTLPrimitiveTypeLineStrip; - size_t nxyz = (num+1)*3; - float* xyzs = new float[nxyz]; - float* tcs = new float[(num+1)*2]; - {float* pxyzs = xyzs; - //float* ptcs = tcs; - tools::gl::line_loop_to_line_strip(num,a_xyzs,pxyzs);} - num = nxyz/3; - bool status = fill_buffer_texture(num,xyzs,tcs,buffer); - delete [] xyzs; - delete [] tcs; - if(!status) return; - - } else if(a_mode==tools::gl::line_strip()) { - primitive_type = MTLPrimitiveTypeLineStrip; - if(!fill_buffer_texture(num,a_xyzs,a_tcs,buffer)) return; - - } else if(a_mode==tools::gl::triangles()) { - primitive_type = MTLPrimitiveTypeTriangle; - if(!fill_buffer_texture(num,a_xyzs,a_tcs,buffer)) return; - - } else if(a_mode==tools::gl::triangle_fan()) { - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - float* tcs = new float[ntri*3*2]; - {float* pxyzs = xyzs; - float* ptcs = tcs; - tools::gl::triangle_fan_to_triangles_texture(num,a_xyzs,a_tcs,pxyzs,ptcs);} - num = nxyz/3; - bool status = fill_buffer_texture(num,xyzs,tcs,buffer); - delete [] xyzs; - delete [] tcs; - if(!status) return; - - } else if(a_mode==tools::gl::triangle_strip()) { - primitive_type = MTLPrimitiveTypeTriangle; - size_t ntri = num-2; - size_t nxyz = ntri*3*3; - float* xyzs = new float[nxyz]; - float* tcs = new float[ntri*3*2]; - {float* pxyzs = xyzs; - float* ptcs = tcs; - tools::gl::triangle_strip_to_triangles_texture(num,a_xyzs,a_tcs,pxyzs,ptcs);} - num = nxyz/3; - bool status = fill_buffer_texture(num,xyzs,tcs,buffer); - delete [] xyzs; - delete [] tcs; - if(!status) return; - - } else { - ::printf("debug : draw_vertex_array_texture : mode not handled yet : %lu %d\n",num,a_mode); - return; - } - if(!buffer) return; - - id vertex_buffer = [m_mgr.device() newBufferWithBytes:buffer - length:num*14*sizeof(float) - options:MTLResourceStorageModeShared]; - - MTLResourceOptions opts = 0; - uniforms _uniforms; - set_uniforms(_uniforms,true); - id uniforms_buffer = [m_mgr.device() newBufferWithBytes:(void*)&_uniforms length:sizeof(uniforms) options:opts]; - - [m_mgr.render_command_encoder() setVertexBuffer:vertex_buffer offset:0 atIndex:0]; - [m_mgr.render_command_encoder() setVertexBuffer:uniforms_buffer offset:0 atIndex:1]; - [m_mgr.render_command_encoder() setFragmentTexture:_texture atIndex:0]; - - [m_mgr.render_command_encoder() drawPrimitives:primitive_type vertexStart:0 vertexCount:num]; - - [vertex_buffer release]; - [uniforms_buffer release]; - - delete [] buffer; - } - - virtual void color4f(float a_r,float a_g,float a_b,float a_a) {m_color.set_value(a_r,a_g,a_b,a_a);} - - virtual void line_width(float /*a_value*/) { - } - virtual void point_size(float /*a_value*/) { - } - virtual void set_polygon_offset(bool /*a_on*/) { - } - - virtual void normal(float a_x,float a_y,float a_z) {m_normal.set_value(a_x,a_y,a_z);} - - virtual void set_winding(tools::sg::winding_type a_v) {m_ccw = (a_v==tools::sg::winding_ccw?true:false);} - - virtual void set_shade_model(tools::sg::shade_type /*a_v*/) {} - - virtual void set_depth_test(bool a_on) {m_depth_test = a_on;} - - virtual void set_cull_face(bool /*a_on*/) {} - - virtual void load_proj_matrix(const tools::mat4f& a_mtx) {m_proj = a_mtx;} - virtual void load_model_matrix(const tools::mat4f& a_mtx) { - m_model = a_mtx; - set_normal_matrix(); - } - - virtual unsigned int max_lights() {return 1000;} - - virtual void enable_light(unsigned int, - float a_dx,float a_dy,float a_dz, - float a_r,float a_g,float a_b,float a_a){ - float dl = tools::fsqrt(a_dx*a_dx+a_dy*a_dy+a_dz*a_dz); - if(!dl) { - m_out << "tools::metal::render::enable_light : null light direction." << std::endl; - return; - } - m_light_color.set_value(a_r,a_g,a_b,a_a); - m_light_direction.set_value(a_dx/dl,a_dy/dl,a_dz/dl); - m_light_on = true; - } - virtual void set_lighting(bool a_on) {m_light_on = a_on;} - - virtual void set_blend(bool /*a_on*/) {} - - virtual void restore_state(unsigned int /*a_ret_num_light*/) { - tools::sg::state& _state = state(); - render::load_proj_matrix(_state.m_proj); - render::load_model_matrix(_state.m_model); - - set_lighting(_state.m_GL_LIGHTING); - set_blend(_state.m_GL_BLEND); - - set_depth_test(_state.m_GL_DEPTH_TEST); - set_cull_face(_state.m_GL_CULL_FACE); - set_polygon_offset(_state.m_GL_POLYGON_OFFSET_FILL); - -// if(_state.m_GL_TEXTURE_2D) gl_enable(m_mgr.js(),"TEXTURE_2D"); -// else gl_disable(m_mgr.js(),"TEXTURE_2D"); - - set_winding(_state.m_winding); - - color4f(_state.m_color.r(),_state.m_color.g(),_state.m_color.b(),_state.m_color.a()); - - normal(_state.m_normal.x(),_state.m_normal.y(),_state.m_normal.z()); - - // The "return of separator" state had ret_num_light. - // The restored state has m_light. - // We have to glDisable lights with index in [m_light,ret_num_light-1] - //for(unsigned int index=_state.m_light;index { -#endif - tools::metal::session* m_session; -} -- (id)init:(tools::metal::session*)a_session; -- (void)dealloc; -- (void)windowWillClose:(NSNotification*)a_not; -@end -@implementation tools_metal_sg_viewer_win_delegate -- (id)init:(tools::metal::session*)a_session { - if(self = [super init]) {} - m_session = a_session; - return self; -} -- (void)dealloc {[super dealloc];} -- (void)windowWillClose:(NSNotification*)a_not { - m_session->set_to_exit(); - (void)a_not; -} -@end - -#include "view.hm" - -#include "render.hm" - -namespace tools { -namespace metal { - -class sg_viewer : public ui_viewer { - typedef ui_viewer parent; -public: - virtual void win_render() { //ui_viewer::win_render() - if(!m_ww) return; - if(!m_wh) return; - if(!m_win) return; - if(m_mgr_gra.begin_render(0,0,m_ww,m_wh, - m_clear_color.r(), - m_clear_color.g(), - m_clear_color.b(), - m_clear_color.a())) { - render action(m_mgr_gra,m_out,m_ww,m_wh); - action.state().m_use_gsto = m_use_gsto; - m_sg.render(action); - if(!action.end()) { //check that matrices stack are ok. - m_out << "exib::sg::viewer : bad gl_action end." << std::endl; - } - m_mgr_gra.end_render(); - } - } -public: - sg_viewer(session& a_session, - int a_x = 0,int a_y = 0, - unsigned int a_width = 500,unsigned int a_height = 500, - const std::string& a_win_title = "") - :parent(a_session.out(),a_width,a_height) - ,m_session(a_session) - ,m_mgr_gra(a_session.out()) - ,m_win(0) - ,m_view(0) - { - ////////////////////////////////////////////////////////// - /// windowing : ////////////////////////////////////////// - ////////////////////////////////////////////////////////// - m_win = m_session.create_window(a_win_title.c_str(),a_x,a_y,a_width,a_height); - if(!m_win) return; //throw - - tools_metal_sg_viewer_win_delegate* _win_delegate = [[tools_metal_sg_viewer_win_delegate alloc] init:&a_session]; - [m_win setDelegate:_win_delegate]; - - NSRect rect; - rect = [m_win frame]; - rect = [m_win contentRectForFrameRect:rect]; //window content true size. - {int w = rect.size.width; - int h = rect.size.height; - //::printf("debug : sg_viewer::cstor %d %d\n",w,h); - parent::set_size(w,h);} - - m_view = [[tools_metal_view alloc] init:rect device:m_mgr_gra.device() viewer:this]; -#ifdef TOOLS_METAL_DRAW_WHEN_NEEDED - m_view.paused = true; - m_view.enableSetNeedsDisplay = true; -#endif - //m_view.presentsWithTransaction = true; //it does not help. - m_view.depthStencilPixelFormat = MTLPixelFormatDepth32Float_Stencil8; - //m_view.clearDepth = -100000; - //m_view.clearStencil = 0; - -#ifdef TOOLS_METAL_DRAW_WHEN_NEEDED -#else - tools_metal_view_controller* view_controller = [[tools_metal_view_controller alloc] init]; - m_view.delegate = view_controller; -#endif - - m_mgr_gra.set_view(m_view); - [m_win setContentView:m_view]; - [m_view release]; - } - virtual ~sg_viewer() { - if(m_win) { - m_session.delete_window(m_win); - } - } -protected: - sg_viewer(const sg_viewer& a_from) - :parent(a_from) - ,m_session(a_from.m_session) - ,m_mgr_gra(a_from.m_mgr_gra) - ,m_win(a_from.m_win) - {} - sg_viewer& operator=(const sg_viewer& a_from){ - parent::operator=(a_from); - m_mgr_gra = a_from.m_mgr_gra; - m_win = a_from.m_win; - return *this; - } -public: - bool has_window() const {return m_win?true:false;} //for SWIG - - bool show() { - if(!m_win) return false; - m_session.show_window(m_win); - return true; - } -protected: - session& m_session; - metal::manager m_mgr_gra; - NSWindow* m_win; - tools_metal_view* m_view; -}; - -}} - - - -#endif - diff --git a/source/externals/g4tools/include/tools/metal/ui_viewer b/source/externals/g4tools/include/tools/metal/ui_viewer deleted file mode 100644 index 797dab56b2..0000000000 --- a/source/externals/g4tools/include/tools/metal/ui_viewer +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_metal_ui_viewer -#define tools_metal_ui_viewer - -#include - -namespace tools { -namespace metal { - -class ui_viewer : public tools::sg::viewer { - typedef tools::sg::viewer parent; -public: - virtual void win_render() = 0; - //virtual void set_to_render() {} //for Apple/Metal. -public: - ui_viewer(std::ostream& a_out,unsigned int a_width,unsigned int a_height):parent(a_out,a_width,a_height){} - virtual ~ui_viewer(){} -protected: - ui_viewer(const ui_viewer& a_from):parent(a_from){} - ui_viewer& operator=(const ui_viewer& a_from){ - if(&a_from==this) return *this; - parent::operator=(a_from); - return *this; - } -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/metal/view.hm b/source/externals/g4tools/include/tools/metal/view.hm deleted file mode 100644 index 0c13dab600..0000000000 --- a/source/externals/g4tools/include/tools/metal/view.hm +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_metal_view_hm -#define tools_metal_view_hm - -#import - -#include "ui_viewer" - -@interface tools_metal_view : MTKView { - @public tools::metal::ui_viewer* m_viewer; - NSCursor* m_cursor_default; - NSCursor* m_cursor_target; - NSCursor* m_cursor_current; -} -- (BOOL)acceptsFirstResponder; -- (nonnull id)init:(NSRect)a_rect device:(nonnull id)a_device viewer:(nonnull tools::metal::ui_viewer*)a_viewer; -- (void)dealloc; -#ifdef TOOLS_METAL_DRAW_WHEN_NEEDED -- (void)drawRect:(NSRect)a_rect; -#endif -- (void)resetCursorRects; -- (void)set_cursor:(tools::sg::cursor_shape)a_cursor; -- (void)mouseDown:(nonnull NSEvent*)a_event; -- (void)mouseUp:(nonnull NSEvent*)a_event; -- (void)mouseDragged:(nonnull NSEvent*)a_event; -@end - -@implementation tools_metal_view -- (BOOL)acceptsFirstResponder {return YES;} -- (nonnull id)init:(NSRect)a_rect device:(nonnull id)a_device viewer:(nonnull tools::metal::ui_viewer*)a_viewer { - //::printf("debug : tools::metal::tools_metal_view::init\n"); - self = [super initWithFrame:a_rect device:a_device]; - if(!self) return self; - m_viewer = a_viewer; - m_cursor_default = [NSCursor arrowCursor]; - m_cursor_target = [NSCursor crosshairCursor]; - m_cursor_current = m_cursor_default; - - NSTrackingAreaOptions _options = NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingInVisibleRect; - NSTrackingArea* tracking_area = - [[NSTrackingArea alloc] initWithRect:NSZeroRect - options:_options - owner:self userInfo:nil]; - [self addTrackingArea:tracking_area]; - - return self; -} - -- (void)dealloc {[super dealloc];} - -#ifdef TOOLS_METAL_DRAW_WHEN_NEEDED -- (void)drawRect:(NSRect)a_rect { - [super drawRect:a_rect]; - if(!m_viewer) return; - int w = a_rect.size.width; - int h = a_rect.size.height; - ::printf("debug : tools::metal::view::drawRect : %d %d\n",w,h); - m_viewer->set_size(w,h); - m_viewer->win_render(); -} -#endif - -- (void)mouseDown:(nonnull NSEvent*)a_event { - [super mouseDown:a_event]; - ::printf("debug : tools::metal::view::mouse_down : begin :\n"); - //NSPoint p = [a_event locationInWindow]; - //(0,0) = bottom left of window. - //NSLog(@"debug : tools_metal_view::mouseDown %g %g",p.x,p.y); - if(!m_viewer) return; - /* - bool to_render = m_viewer->touch_down(p.x,p.y); - if(m_viewer->do_works()) to_render = true; - if(to_render) { -#ifdef TOOLS_METAL_DRAW_WHEN_NEEDED - ::printf("debug : tools::metal::view::mouse_down : to render...\n"); - m_viewer->win_render(); -#else - [self setNeedsDisplay:YES]; -#endif - } - ::printf("debug : tools::metal::view::mouse_down : end.\n"); - */ -} - -- (void)mouseUp:(nonnull NSEvent*)a_event { - [super mouseUp:a_event]; - ::printf("debug : tools::metal::view::mouse_up : begin :\n"); - //NSPoint p = [a_event locationInWindow]; - //(0,0) = bottom left of window. - //NSLog(@"debug : tools_metal_view::mouseUp %g %g",p.x,p.y); - if(!m_viewer) return; - /* - m_viewer->add_work_check_arm_buttons(); - bool to_render = m_viewer->touch_up(p.x,p.y); - //if(m_viewer->do_works()) to_render = true; - if(to_render) { -#ifdef TOOLS_METAL_DRAW_WHEN_NEEDED - ::printf("debug : tools::metal::view::mouse_up : to render...\n"); - m_viewer->win_render(); -#else - [self setNeedsDisplay:YES]; -#endif - } - */ - NSRect rect; - rect.origin.x = 0; - rect.origin.y = 0; - rect.size.width = 700; - rect.size.height = 500; - // [self setNeedsDisplayInRect:rect]; - [self display]; - /* - if(m_viewer->touch_up(p.x,p.y)) { - //m_viewer->win_render(); - [self setNeedsDisplay:YES]; - } - */ - ::printf("debug : tools::metal::view::mouse_up : end.\n"); -} - -- (void)mouseDragged:(nonnull NSEvent*)a_event { - [super mouseDragged:a_event]; - ::printf("debug : tools::metal::view::mouse_dragged\n"); - //NSPoint p = [a_event locationInWindow]; - //(0,0) = bottom left of window. - //NSLog(@"debug : tools_metal_view::mouseDragged %g %g",p.x,p.y); - if(!m_viewer) return; - //if(m_viewer->touch_move(p.x,p.y)) m_viewer->win_render(); -} - -- (void)resetCursorRects { - [super resetCursorRects]; - //NSLog(@"debug : resetCursorRects"); - [self discardCursorRects]; - [self addCursorRect:self.bounds cursor:m_cursor_default]; - [self addCursorRect:self.bounds cursor:m_cursor_target]; - [m_cursor_current set]; -} - -- (void)mouseEntered:(nonnull NSEvent*)a_event { - [super mouseEntered:a_event]; - [m_cursor_current set]; -} - -- (void)set_cursor:(tools::sg::cursor_shape)a_cursor { - if(a_cursor==tools::sg::cursor_default) { - [m_cursor_default set]; - m_cursor_current = m_cursor_default; - } else if(a_cursor==tools::sg::cursor_target) { - [m_cursor_target set]; - m_cursor_current = m_cursor_target; - } -} -@end - -@interface tools_metal_view_controller : NSViewController -@end - -@implementation tools_metal_view_controller { -} --(void)drawInMTKView:(nonnull MTKView*)a_view { - //static unsigned int s_count = 0; - //::printf("debug : tools::metal::tools_metal_view_controller::drawInMtkView : %d\n",s_count);s_count++; - tools_metal_view* _view = static_cast(a_view); - @autoreleasepool { - _view->m_viewer->win_render(); - } -} -- (void)mtkView:(nonnull MTKView*)a_view drawableSizeWillChange:(CGSize)a_size { - int w = a_size.width*0.5; - int h = a_size.height*0.5; -//static unsigned int s_count = 0; -//::printf("debug : tools::metal::tools_metal_view_controller::drawableSizeWillChange : %d :%d %d : %d %d\n", -// s_count,(int)a_size.width,(int)a_size.height,w,h); - tools_metal_view* _view = static_cast(a_view); - @autoreleasepool { - _view->m_viewer->set_size(w,h); - //_view->m_viewer->win_render(); //no. - } -} -@end - -#endif diff --git a/source/externals/g4tools/include/tools/paper_format b/source/externals/g4tools/include/tools/paper_format deleted file mode 100644 index 38ab0e6b89..0000000000 --- a/source/externals/g4tools/include/tools/paper_format +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_paper_format -#define tools_paper_format - -#include "path" -#include "touplow" - -namespace tools { -namespace file { - -// file::paper_format_extension() is in file_format. -// related files : sg/write_paper. - -inline bool extension_paper_format(const std::string& a_file,std::string& a_fmt) { - std::string path,name,suffix; - if(!path_name_suffix(a_file,path,name,suffix)) {a_fmt.clear();return false;} - tolowercase(suffix); - if((suffix=="ps")||(suffix=="eps")) { - a_fmt = "inzb_ps"; - return true; - } else if(suffix=="png") { - a_fmt = "inzb_png"; - return true; - } else if((suffix=="jpg")||(suffix=="jpeg")) { - a_fmt = "inzb_jpeg"; - return true; - - } else if(suffix=="pdf") { - a_fmt = "gl2ps_pdf"; - return true; - } else if(suffix=="svg") { - a_fmt = "gl2ps_svg"; - return true; - } else if(suffix=="pgf") { - a_fmt = "gl2ps_pgf"; - return true; - } else if(suffix=="tex") { - a_fmt = "gl2ps_tex"; - return true; - } - a_fmt.clear(); - return false; -} - -}} - -#endif - diff --git a/source/externals/g4tools/include/tools/path_env b/source/externals/g4tools/include/tools/path_env deleted file mode 100644 index 3f36b304b0..0000000000 --- a/source/externals/g4tools/include/tools/path_env +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_path_env -#define tools_path_env - -#include "put_env" - -#include "num2s" -#include "words" -#include "sep" -#include "vmanip" - -namespace tools { - -inline bool env_append(const std::string& a_env,const std::string& a_sep,const std::vector& a_vals){ - std::string env_value; - if(is_env(a_env)) { - if(!get_env(a_env,env_value)) return false; - } - - {std::vector::const_iterator it; - for(it=a_vals.begin();it!=a_vals.end();++it) { - const std::string& value = *it; - if(value.empty()) continue; - - if(env_value.size()) { - std::vector ws; - words(env_value,a_sep,false,ws); - // Remove existing one, so that value be put at end. - remove(ws,value); - if(!nums2s(ws,env_value,a_sep)) {} - } - - if(env_value.size()) env_value += a_sep; - env_value += value; - }} - - if(!put_env(a_env,env_value)) return false; - - return true; -} - -inline bool env_path_append(const std::string& a_env,const std::vector& a_paths){ - return env_append(a_env,psep(),a_paths); -} - -inline bool env_append_path(const std::string& a_env,const std::string& a_path){ - std::vector v; - v.push_back(a_path); - return env_append(a_env,psep(),v); -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/png b/source/externals/g4tools/include/tools/png deleted file mode 100644 index ebe55c0708..0000000000 --- a/source/externals/g4tools/include/tools/png +++ /dev/null @@ -1,495 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_png -#define tools_png - -#include //FILE,size_t - -#include - -#include -#include - -#ifndef TOOLS_USE_OUREX_PNG -#include -#else -#include //enforce ourex png -#endif - -namespace tools { -namespace png { - -inline bool is(const std::string& a_file){ - FILE* file = ::fopen(a_file.c_str(),"rb"); - if(!file) return false; //if file does not exist, then it is not a png ! - png_byte header[8]; // 8 is the maximum size that can be checked - size_t nitem = ::fread(header,1,8,file); - ::fclose(file); - if(nitem!=8) return false; - return ::png_sig_cmp(header,0,8)?false:true; -} - -}} - -#include - -namespace tools { -namespace png { - -inline unsigned char* read_FILE(FILE* a_file,unsigned int& a_width,unsigned int& a_height,unsigned int& a_bpp) { - - png_byte header[8]; // 8 is the maximum size that can be checked - if(::fread(header,1,8,a_file)!=8) { - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - if(::png_sig_cmp(header,0,8)) { - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - png_structp png_ptr = - ::png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); - if(!png_ptr) { - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - png_infop info_ptr = ::png_create_info_struct(png_ptr); - if(!info_ptr) { - ::png_destroy_read_struct(&png_ptr,NULL,NULL); - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - if(::setjmp(png_jmpbuf(png_ptr))) { - ::png_destroy_read_struct(&png_ptr,&info_ptr,NULL); - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - ::png_init_io(png_ptr,a_file); - ::png_set_sig_bytes(png_ptr,8); - - ::png_read_info(png_ptr,info_ptr); - - png_uint_32 width = ::png_get_image_width(png_ptr,info_ptr); - png_uint_32 height = ::png_get_image_height(png_ptr,info_ptr); - png_uint_32 rowbytes = ::png_get_rowbytes(png_ptr,info_ptr); - int bpp = width?rowbytes/width:0; - - if((width<=0)||(height<=0)||(bpp<=0)) { - ::png_destroy_read_struct(&png_ptr,&info_ptr,NULL); - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - a_bpp = bpp; //avoid the clobbered -W warning. - - //png_byte color_type = info_ptr->color_type; - //info_ptr->bit_depth; - - //int number_of_passes = ::png_set_interlace_handling(png_ptr); - ::png_read_update_info(png_ptr,info_ptr); - - if(::setjmp(png_jmpbuf(png_ptr))) { - ::png_destroy_read_struct(&png_ptr,&info_ptr,NULL); - a_width = 0; - a_height = 0; - a_bpp = 0; - return 0; - } - - unsigned char* buffer = new unsigned char[rowbytes * height]; - if(!buffer) { - ::png_destroy_read_struct(&png_ptr,&info_ptr,NULL); - a_height = 0; - a_width = 0; - a_bpp = 0; - return 0; - } - - {png_bytep* row_pointers = new png_bytep[height]; - png_byte* pos = buffer+rowbytes*(height-1); - for(png_uint_32 y=0;y=w)||(a_sy>=h)){ - delete [] buffer; - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - // 012345 - a_rw = tools::mn(w-a_sx,a_sw); - a_rh = tools::mn(h-a_sy,a_sh); - a_rbpp = bpp; - - if(!a_rw||!a_rh||!a_rbpp){ - delete [] buffer; - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - unsigned char* rb = new unsigned char[a_rw*a_rh*a_rbpp]; - if(!rb) { - delete [] buffer; - a_rw = 0; - a_rh = 0; - a_rbpp = 0; - return 0; - } - - unsigned int rstride = a_rw * a_rbpp; - unsigned char* rpos = rb; - - unsigned int stride = w * bpp; - unsigned char* pos = buffer+a_sy*stride+a_sx*bpp; - - for(unsigned int j=0;j bottom. - ::memcpy(rpos,pos,rstride); - } - - delete [] buffer; - - return rb; -} - -inline bool write_FILE(FILE* a_file,unsigned char* a_buffer,unsigned int a_width,unsigned int a_height,unsigned int a_bpp) { - //from gl2ps.c. - if((a_bpp!=3)&&(a_bpp!=4)) { - return false; - } - - png_structp png_ptr; - if(!(png_ptr = ::png_create_write_struct - (PNG_LIBPNG_VER_STRING,NULL,NULL,NULL))) return false; - - png_infop info_ptr; - if(!(info_ptr = ::png_create_info_struct(png_ptr))){ - ::png_destroy_write_struct(&png_ptr,NULL); - return false; - } - - if(::setjmp(png_jmpbuf(png_ptr))) { - ::png_destroy_write_struct(&png_ptr,&info_ptr); - return false; - } - -#ifndef Z_DEFAULT_COMPRESSION -#define Z_DEFAULT_COMPRESSION (-1) -#endif - - ::png_init_io(png_ptr,a_file); - ::png_set_compression_level(png_ptr,Z_DEFAULT_COMPRESSION); - ::png_set_IHDR(png_ptr,info_ptr,a_width,a_height,8, - a_bpp==3?PNG_COLOR_TYPE_RGB:PNG_COLOR_TYPE_RGBA, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE,PNG_FILTER_TYPE_BASE); - ::png_write_info(png_ptr,info_ptr); - - for(unsigned int row=0;row - -namespace tools { -namespace png { - -inline bool to_xpm(std::ostream& a_out,const std::string& a_file,const std::string& a_name,bool a_verbose = false) { - return tools::xpm::to_xpm(a_out,a_file,a_name,read,a_verbose); -} - -}} - -#include -#include - -namespace tools { -namespace png { - -inline bool concatenate(std::ostream& a_out, - const std::vector& a_files, - unsigned int a_cols,unsigned int a_rows, - unsigned int a_bw,unsigned int a_bh, - unsigned char a_bc, - const std::string& a_file) { - unsigned int wa,ha,bppa; - unsigned char* ba = - tools::image::concatenate - (a_out,a_files,a_cols,a_rows,a_bw,a_bh,a_bc,read,wa,ha,bppa); - if(!ba) { - a_out << "tools::png::concatenate :" - << " failed to concatenate all buffers." - << std::endl; - delete [] ba; - return false; - } - - FILE* file = ::fopen(a_file.c_str(),"wb"); - if(!file) { - a_out << "tools::png::concatenate :" - << " can't open " << file << " for writing." - << std::endl; - delete [] ba; - return false; - } - - if(!write_FILE(file,ba,wa,ha,bppa)) { - a_out << "tools::png::concatenate :" - << " can't write " << a_file << "." - << std::endl; - delete [] ba; - ::fclose(file); - return false; - } - - delete [] ba; - ::fclose(file); - return true; -} - -class reader : public virtual tools::image::ireader { -public: - virtual tools::image::ireader* copy() const {return new reader(*this);} - virtual bool is(const std::string& a_file) const {return tools::png::is(a_file);} - virtual bool infos(std::ostream& a_out,const std::string& a_file, - unsigned int& a_width,unsigned int& a_height,unsigned int& a_bpp) const { - return tools::png::infos(a_out,a_file,a_width,a_height,a_bpp); - } - virtual unsigned char* read(std::ostream& a_out,const std::string& a_file, - unsigned int& a_width,unsigned int& a_height,unsigned int& a_bpp) const { - return tools::png::read(a_out,a_file,a_width,a_height,a_bpp); - } - virtual unsigned char* read_part(std::ostream& a_out,const std::string& a_file, - unsigned int a_sx,unsigned int a_sy, - unsigned int a_sw,unsigned int a_sh, - unsigned int& a_rw,unsigned int& a_rh,unsigned int& a_rbpp) const { - return tools::png::read_part(a_out,a_file,a_sx,a_sy,a_sw,a_sh,a_rw,a_rh,a_rbpp); - } -public: - reader(){} - virtual ~reader(){} -public: - reader(const reader&):ireader(){} - reader& operator=(const reader&){return *this;} -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/put_env b/source/externals/g4tools/include/tools/put_env deleted file mode 100644 index 30a2ac6150..0000000000 --- a/source/externals/g4tools/include/tools/put_env +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_put_env -#define tools_put_env - -//WARNING : CYGWIN/gnu/std=c++11 : putenv, setenv not found. - -#include "get_env" - -#include "cstr" - -namespace tools { - -inline bool put_env(const std::string& a_env,const std::string& a_value){ - std::string value = a_env+"="+a_value; -#ifdef TOOLS_MEM - if(::putenv(str_dup(value.c_str(),false))) return false; -#else - if(::putenv(str_dup(value.c_str()))) return false; -#endif - //check: - std::string s; - if(!get_env(a_env,s)) return false; - if(s!=a_value) return false; - return true; -} - -inline bool rm_env(const std::string& a_env){ -#ifdef _MSC_VER - std::string value = a_env+"="; -#ifdef TOOLS_MEM - if(::putenv(str_dup(value.c_str(),false))) return false; -#else - if(::putenv(str_dup(value.c_str()))) return false; -#endif -#else - ::unsetenv(a_env.c_str()); -#endif - return true; -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/randT b/source/externals/g4tools/include/tools/randT deleted file mode 100644 index 97ff4efb3f..0000000000 --- a/source/externals/g4tools/include/tools/randT +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_randT -#define tools_randT - -namespace tools { - -template -class rgauss { - typedef REAL(*math_func)(REAL); //for rootcint. -//public: -// typedef REAL value_t; -public: - rgauss(FLAT& a_flat,REAL a_mean = 0,REAL a_std_dev = 1) - :m_flat(a_flat),m_mean(a_mean),m_std_dev(a_std_dev){} - virtual ~rgauss(){} -public: - rgauss(const rgauss& a_from):m_flat(a_from.m_flat),m_mean(a_from.m_mean),m_std_dev(a_from.m_std_dev){} - rgauss& operator=(const rgauss& a_from) { - m_mean = a_from.m_mean; - m_std_dev = a_from.m_std_dev; - return *this; - } -public: - REAL shoot(math_func a_sqrt,math_func a_log) const { - REAL v1,v2,r,fac; - do { - v1 = REAL(2) * m_flat.shoot() - REAL(1); - v2 = REAL(2) * m_flat.shoot() - REAL(1); - r = v1*v1 + v2*v2; - } while (r>REAL(1)); - fac = a_sqrt(-REAL(2)*a_log(r)/r); - return (v2 * fac) * m_std_dev + m_mean; - } - FLAT& flat() {return m_flat;} - void set_seed(unsigned int a_seed) {m_flat.set_seed(a_seed);} - void set(REAL a_mean = 0,REAL a_std_dev = 1) {m_mean = a_mean;m_std_dev = a_std_dev;} -protected: - FLAT& m_flat; - REAL m_mean; - REAL m_std_dev; -}; - -template -class rbw { -public: - rbw(FLAT& a_flat,REAL a_mean = 0,REAL a_gamma = 1):m_flat(a_flat),m_mean(a_mean),m_gamma(a_gamma){} - virtual ~rbw(){} -public: - rbw(const rbw& a_from):m_flat(a_from.m_flat),m_mean(a_from.m_mean),m_gamma(a_from.m_gamma){} - rbw& operator=(const rbw& a_from) { - m_mean = a_from.m_mean; - m_gamma = a_from.m_gamma; - return *this; - } -public: - REAL shoot(const REAL& a_half_pi,REAL(*a_tan)(REAL)) const { - REAL rval = REAL(2) * m_flat.shoot() - REAL(1); - REAL displ = (REAL(1)/REAL(2)) * m_gamma * a_tan(rval * a_half_pi); - return m_mean + displ; - } - FLAT& flat() {return m_flat;} - void set_seed(unsigned int a_seed) {m_flat.set_seed(a_seed);} -protected: - FLAT& m_flat; - REAL m_mean; - REAL m_gamma; -}; - -template -class rexp { - typedef REAL(*math_func)(REAL); //for rootcint. -public: - rexp(FLAT& a_flat,REAL a_rate = 1):m_flat(a_flat),m_rate(a_rate){} - virtual ~rexp(){} -public: - rexp(const rexp& a_from):m_flat(a_from.m_flat),m_rate(a_from.m_rate){} - rexp& operator=(const rexp& a_from) {m_rate = a_from.m_rate;return *this;} -public: - REAL shoot(math_func a_log) const { - REAL v; - do { - v = m_flat.shoot(); - } while(v<=REAL(0)); - return -a_log(v)/m_rate; - } - FLAT& flat() {return m_flat;} - void set_seed(unsigned int a_seed) {m_flat.set_seed(a_seed);} -protected: - FLAT& m_flat; - REAL m_rate; -}; - -template -class rdir2 { -public: - rdir2(FLAT& a_flat):m_flat(a_flat){} - virtual ~rdir2(){} -public: - rdir2(const rdir2& a_from):m_flat(a_from.m_flat){} - rdir2& operator=(const rdir2&) {return *this;} -public: - void shoot(REAL& a_x,REAL& a_y) const { - // from gsl_ran_dir_2d. - REAL u,v,s; - do { - u = REAL(2) * m_flat.shoot()-REAL(1); - v = REAL(2) * m_flat.shoot()-REAL(1); - s = u * u + v * v; - } - while ( (s > REAL(1)) || (s==REAL(0)) ); - a_x = (u * u - v * v) / s; - a_y = REAL(2) * u * v / s; - } - FLAT& flat() {return m_flat;} - void set_seed(unsigned int a_seed) {m_flat.set_seed(a_seed);} -protected: - FLAT& m_flat; -}; - -template -class rdir3 { -public: - rdir3(FLAT& a_flat):m_flat(a_flat){} - virtual ~rdir3(){} -public: - rdir3(const rdir3& a_from):m_flat(a_from.m_flat){} - rdir3& operator=(const rdir3&) {return *this;} -public: - void shoot(REAL& a_x,REAL& a_y,REAL& a_z,REAL(*a_sqrt)(REAL)) const { - // from gsl_ran_dir_3d. - REAL s; - do { - a_x = REAL(2) * m_flat.shoot() - REAL(1); - a_y = REAL(2) * m_flat.shoot() - REAL(1); - s = (a_x) * (a_x) + (a_y) * (a_y); - } - while (s > REAL(1)); - a_z = REAL(2) * s - REAL(1); - REAL a = REAL(2) * a_sqrt(REAL(1) - s); - a_x *= a; - a_y *= a; - } - FLAT& flat() {return m_flat;} - void set_seed(unsigned int a_seed) {m_flat.set_seed(a_seed);} -protected: - FLAT& m_flat; -}; - -// from Geant4/G4Poisson.hh : -// NOTE : not used yet. -template -class rpoiss { -public: - rpoiss(FLAT& a_flat,REAL a_mean = 1):m_flat(a_flat),m_mean(a_mean){} - virtual ~rpoiss(){} -public: - rpoiss(const rpoiss& a_from):m_flat(a_from.m_flat),m_mean(a_from.m_mean){} - rpoiss& operator=(const rpoiss& a_from) { - m_mean = a_from.m_mean; - return *this; - } -public: - UINT shoot(const REAL& a_two_pi,REAL(*a_sqrt)(REAL),REAL(*a_log)(REAL),REAL(*a_exp)(REAL),REAL(*a_cos)(REAL)) const { - UINT number = 0; - if(m_mean <= 16) { - REAL position = m_flat.shoot(); - REAL poissonValue = a_exp(-m_mean); - REAL poissonSum = poissonValue; - while(poissonSum <= position) { - number++; - poissonValue *= m_mean/REAL(number); - poissonSum += poissonValue; - } - return number; - } - // m_mean > 16 : - REAL t = a_sqrt(-REAL(2)*a_log(m_flat.shoot())); - REAL y = a_two_pi*m_flat.shoot(); - t *= a_cos(y); - REAL value = m_mean + t*a_sqrt(m_mean) + REAL(0.5); - if(value <= REAL(0)) return UINT(0); - static const REAL limit = REAL(2e9); - if(value >= limit) return UINT(limit); - return UINT(value); - } - FLAT& flat() {return m_flat;} - void set_seed(unsigned int a_seed) {m_flat.set_seed(a_seed);} -protected: - FLAT& m_flat; - REAL m_mean; -}; - -template -class rbinomial { -public: - rbinomial(FLAT& a_flat,UINT a_n = 1,REAL a_p = REAL(0.5)):m_flat(a_flat),m_n(a_n),m_p(a_p){} - virtual ~rbinomial(){} -public: - rbinomial(const rbinomial& a_from):m_flat(a_from.m_flat),m_n(a_from.m_n),m_p(a_from.m_p){} - rbinomial& operator=(const rbinomial& a_from) { - m_n = a_from.m_n; - m_p = a_from.m_p; - return *this; - } -public: - UINT shoot() const { - // from ROOT/TRandom.cxx. - //////////////////////////////////////////////////////////////////////////////// - /// Generates a random integer N according to the binomial law. - /// Coded from Los Alamos report LA-5061-MS. - /// - /// N is binomially distributed between 0 and ntot inclusive - /// with mean prob*ntot and prob is between 0 and 1. - /// - /// Note: This function should not be used when ntot is large (say >100). - /// The normal approximation is then recommended instead - /// (with mean =*ntot+0.5 and standard deviation sqrt(ntot*prob*(1-prob)). - //////////////////////////////////////////////////////////////////////////////// - if((m_pm_p) continue; - n++; - } - return n; - } - FLAT& flat() {return m_flat;} - void set_seed(unsigned int a_seed) {m_flat.set_seed(a_seed);} -protected: - FLAT& m_flat; - UINT m_n; - REAL m_p; -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/randd b/source/externals/g4tools/include/tools/randd deleted file mode 100644 index 8cd778b3b4..0000000000 --- a/source/externals/g4tools/include/tools/randd +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_randd -#define tools_randd - -#include "randT" -#include "rtausmed" - -#include "S_STRING" -#include "scast" - -namespace tools { - -class irandd { -public: - virtual ~irandd() {} -public: - virtual void* cast(const std::string&) const = 0; -public: - virtual double shootd() const = 0; -}; - -class rbinomiald : public virtual irandd, public rbinomial { - typedef rbinomial parent; -public: - TOOLS_SCLASS(tools::rbinomiald) -public: - virtual void* cast(const std::string& a_class) const { - if(void* p = cmp_cast(this,a_class)) return p; - return 0; - } - virtual double shootd() const {return shoot();} -public: - rbinomiald(unsigned int a_n = 1,double a_p = 0.5):parent(m_flat,a_n,a_p),m_flat(){} - virtual ~rbinomiald(){} -public: - rbinomiald(const rbinomiald& a_from):irandd(a_from),parent(m_flat),m_flat(a_from.m_flat){} - rbinomiald& operator=(const rbinomiald& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -protected: - rtausmed m_flat; -}; - -class rgaussd : public virtual irandd, public rgauss { - typedef rgauss parent; -public: - TOOLS_SCLASS(tools::rgaussd) -public: - virtual void* cast(const std::string& a_class) const { - if(void* p = cmp_cast(this,a_class)) return p; - return 0; - } - virtual double shootd() const {return shoot();} -public: - rgaussd(double a_mean = 0,double a_std_dev = 1):parent(m_flat,a_mean,a_std_dev),m_flat(){} - virtual ~rgaussd(){} -public: - rgaussd(const rgaussd& a_from):irandd(a_from),parent(m_flat),m_flat(a_from.m_flat){} - rgaussd& operator=(const rgaussd& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -public: - double shoot() const {return parent::shoot(::sqrt,::log);} -protected: - rtausmed m_flat; -}; - -class rexpd : public virtual irandd, public rexp { - typedef rexp parent; -public: - TOOLS_SCLASS(tools::rexpd) -public: - virtual void* cast(const std::string& a_class) const { - if(void* p = cmp_cast(this,a_class)) return p; - return 0; - } - virtual double shootd() const {return shoot();} -public: - rexpd(double a_rate = 1):parent(m_flat,a_rate),m_flat(){} - virtual ~rexpd(){} -public: - rexpd(const rexpd& a_from):irandd(a_from),parent(m_flat),m_flat(a_from.m_flat){} - rexpd& operator=(const rexpd& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -public: - double shoot() const {return parent::shoot(::log);} -protected: - rtausmed m_flat; -}; - -class rdir2d : public rdir2 { - typedef rdir2 parent; -public: - TOOLS_SCLASS(tools::rdir2d) -public: - rdir2d():parent(m_flat),m_flat(){} - virtual ~rdir2d(){} -public: - rdir2d(const rdir2d& a_from):parent(m_flat),m_flat(a_from.m_flat){} - rdir2d& operator=(const rdir2d& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -protected: - rtausmed m_flat; -}; - -class rdir3d : public rdir3 { - typedef rdir3 parent; -public: - TOOLS_SCLASS(tools::rdir3d) -public: - rdir3d():parent(m_flat),m_flat(){} - virtual ~rdir3d(){} -public: - rdir3d(const rdir3d& a_from):parent(m_flat),m_flat(a_from.m_flat){} - rdir3d& operator=(const rdir3d& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -public: - void shoot(double& a_x,double& a_y,double& a_z) const { - parent::shoot(a_x,a_y,a_z,::sqrt); - } -protected: - rtausmed m_flat; -}; - -} - -#include "mathd" - -namespace tools { - -class rbwd : public virtual irandd, public rbw { - typedef rbw parent; -public: - TOOLS_SCLASS(tools::rbwd) -public: - virtual void* cast(const std::string& a_class) const { - if(void* p = cmp_cast(this,a_class)) return p; - return 0; - } - virtual double shootd() const {return shoot();} -public: - rbwd(double a_mean = 0,double a_gamma = 1):parent(m_flat,a_mean,a_gamma),m_flat(){} - virtual ~rbwd(){} -public: - rbwd(const rbwd& a_from):irandd(a_from),parent(m_flat),m_flat(a_from.m_flat){} - rbwd& operator=(const rbwd& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -public: - double shoot() const {return parent::shoot(half_pi(),::tan);} -protected: - rtausmed m_flat; -}; - -} - -#include "typedefs" - -namespace tools { - -class rpoissd : public virtual irandd, public rpoiss { - typedef rpoiss parent; -public: - TOOLS_SCLASS(tools::rpoissd) -public: - virtual void* cast(const std::string& a_class) const { - if(void* p = cmp_cast(this,a_class)) return p; - return 0; - } - virtual double shootd() const {return double(shoot());} -public: - rpoissd(double a_mean = 1):parent(m_flat,a_mean),m_flat(){} - virtual ~rpoissd(){} -public: - rpoissd(const rpoissd& a_from):irandd(a_from),parent(m_flat),m_flat(a_from.m_flat){} - rpoissd& operator=(const rpoissd& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -public: - uint64 shoot() const {return parent::shoot(two_pi(),::sqrt,::log,::exp,::cos);} -protected: - rtausmed m_flat; -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/randf b/source/externals/g4tools/include/tools/randf deleted file mode 100644 index 13befd1fdf..0000000000 --- a/source/externals/g4tools/include/tools/randf +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_randf -#define tools_randf - -#include "randT" -#include "rtausmef" - -namespace tools { - -class rgaussf : public rgauss { - typedef rgauss parent; -public: - rgaussf(float a_mean = 0,float a_std_dev = 1):parent(m_flat,a_mean,a_std_dev),m_flat(){} - virtual ~rgaussf(){} -public: - rgaussf(const rgaussf& a_from):parent(m_flat),m_flat(a_from.m_flat){} - rgaussf& operator=(const rgaussf& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -public: - float shoot() const {return parent::shoot(::sqrtf,::logf);} -protected: - rtausmef m_flat; -}; - -class rexpf : public rexp { - typedef rexp parent; -public: - rexpf(float a_rate = 1):parent(m_flat,a_rate),m_flat(){} - virtual ~rexpf(){} -public: - rexpf(const rexpf& a_from):parent(m_flat),m_flat(a_from.m_flat){} - rexpf& operator=(const rexpf& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -public: - float shoot() const {return parent::shoot(::logf);} -protected: - rtausmef m_flat; -}; - -} - -#include "mathf" - -namespace tools { - -class rbwf : public rbw { - typedef rbw parent; -public: - rbwf(float a_mean = 0,float a_gamma = 1):parent(m_flat,a_mean,a_gamma),m_flat(){} - virtual ~rbwf(){} -public: - rbwf(const rbwf& a_from):parent(m_flat),m_flat(a_from.m_flat){} - rbwf& operator=(const rbwf& a_from) { - parent::operator=(a_from); - m_flat = a_from.m_flat; - return *this; - } -public: - float shoot() const {return parent::shoot(fhalf_pi(),::tanf);} -protected: - rtausmef m_flat; -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/random b/source/externals/g4tools/include/tools/random deleted file mode 100644 index 9946710449..0000000000 --- a/source/externals/g4tools/include/tools/random +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_random -#define tools_random - -// for backward compatibility. - -#include "randd" - -namespace tools { -namespace random { - -class gauss : public rgaussd { - typedef rgaussd parent; -public: - gauss(double a_mean = 0,double a_std_dev = 1):parent(a_mean,a_std_dev){} - virtual ~gauss(){} -public: - gauss(const gauss& a_from):parent(a_from){} - gauss& operator=(const gauss& a_from) {parent::operator=(a_from);return *this;} -}; - -class bw : public rbwd { - typedef rbwd parent; -public: - bw(double a_mean = 0,double a_gamma = 1):parent(a_mean,a_gamma){} - virtual ~bw(){} -public: - bw(const bw& a_from):parent(a_from){} - bw& operator=(const bw& a_from) {parent::operator=(a_from);return *this;} -}; - -class exp : public rexpd { - typedef rexpd parent; -public: - exp(double a_rate = 1):parent(a_rate){} - virtual ~exp(){} -public: - exp(const exp& a_from):parent(a_from){} - exp& operator=(const exp& a_from) {parent::operator=(a_from);return *this;} -}; - -class flat : public rtausmed { - typedef rtausmed parent; -public: - flat():parent(){} - virtual ~flat(){} -public: - flat(const flat& a_from):parent(a_from){} - flat& operator=(const flat& a_from) {parent::operator=(a_from);return *this;} -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/rroot/member_reader b/source/externals/g4tools/include/tools/rroot/member_reader deleted file mode 100644 index e669f46ae8..0000000000 --- a/source/externals/g4tools/include/tools/rroot/member_reader +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_rroot_member_reader -#define tools_rroot_member_reader - -#include "../store/iobj_visitor" - -#include "buffer" - -namespace tools { -namespace rroot { - -class member_reader : public virtual iobj_visitor { -public: - virtual std::ostream& out() const {return m_buf.out();} - - virtual bool visit(bool& a_v){return m_buf.read(a_v);} - virtual bool visit(char& a_v){return m_buf.read(a_v);} - virtual bool visit(short& a_v){return m_buf.read(a_v);} - virtual bool visit(int& a_v){return m_buf.read(a_v);} - - virtual bool visit(unsigned int& a_v){return m_buf.read(a_v);} - - virtual bool visit(int64&){ - m_buf.out() << "tools::rroot::member_reader::visit(int64) :" - << " dummy." << std::endl; - return false; //FIXME - } - - virtual bool visit(uint64&){ - m_buf.out() << "tools::rroot::member_reader::visit(uint64) :" - << " dummy." << std::endl; - return false; //FIXME - } - - virtual bool visit(float& a_v){return m_buf.read(a_v);} - virtual bool visit(double& a_v){return m_buf.read(a_v);} - - virtual bool visit(std::string& a_v){return m_buf.read(a_v);} - -//virtual bool visit(const char* a_v){ -// return m_buf.read(std::string(a_v)); -//} - - virtual bool visit(std::vector& a_v){ - std::vector data; - if(!m_buf.read_array(data)) {a_v.clear();return false;} - size_t number = data.size(); - a_v.resize(number); - for(size_t index=0;index& a_v){return m_buf.read_array(a_v);} - - virtual bool visit(std::vector& a_v){return m_buf.read_array(a_v);} - - virtual bool visit(std::vector& a_v){return m_buf.read_array(a_v);} - - virtual bool visit(std::vector& /*a_v*/){ - //FIXME return ::Rio::writeArray(fBuffer,a_v); - m_buf.out() << "tools::rroot::member_reader::visit(vector) :" - << " dummy." << std::endl; - return false; - } - - virtual bool visit(std::vector& a_v){return m_buf.read_array(a_v);} - - virtual bool visit(std::vector& a_v){return m_buf.read_array(a_v);} - - virtual bool visit(std::vector& a_v){ - return m_buf.read_array(a_v); - } - - virtual bool visit(std::vector& a_v){return m_buf.read(a_v);} - - virtual bool visit(std::vector< std::vector >& a_v){ - return m_buf.read_array2(a_v); - } - -public: - member_reader(buffer& a_buf):m_buf(a_buf){} - virtual ~member_reader(){} -private: - member_reader(const member_reader& a_from) - :iobj_visitor(a_from) - ,m_buf(a_from.m_buf) - {} - member_reader& operator=(const member_reader&){return *this;} -protected: - buffer& m_buf; -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/rroot/tree_manip b/source/externals/g4tools/include/tools/rroot/tree_manip deleted file mode 100644 index e9085acc3c..0000000000 --- a/source/externals/g4tools/include/tools/rroot/tree_manip +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_rroot_tree_manip -#define tools_rroot_tree_manip - -#include "file" -#include "tree" -#include "stl_vector" - -namespace tools { -namespace rroot { - -inline tree* find_tree(file& a_file,ifac& a_fac,const std::string& a_name,bool a_map_objs = false) { - std::ostream& out = a_file.out(); - //out << "tools::rroot::find_tree : name : " << file << std::endl; - - key* key = a_file.dir().find_key(a_name); - if(!key) { - out << "tools::rroot::find_tree :" - << " key " << sout(a_name) << " not found." - << std::endl; - return 0; - } - - unsigned int sz; - char* buf = key->get_object_buffer(a_file,sz); //we don't have ownership of buf. - if(!buf) { - out << "tools::rroot::find_tree :" - << " can't get data buffer of " - << sout(key->object_name()) << "." - << std::endl; - return 0; - } - - //out << "tools::rroot::find_tree :" - // << " get data buffer size " << sz << "." - // << std::endl; - - if(key->object_class()!=TTree_cls()) { - out << "tools::rroot::find_tree :" - << " key object class " - << sout(key->object_class()) - << " is not a TTree." - << std::endl; - return 0; - } - - buffer b(out,a_file.byte_swap(),sz,buf,key->key_length(),false); - b.set_map_objs(a_map_objs); - - tree* _tree = new tree(a_file,a_fac); - if(!_tree->stream(b)) { - out << "tools::rroot::find_tree :" - << " TTree streaming failed" - << std::endl; - delete _tree; - return 0; - } - - return _tree; -} - -inline branch_element* find_be(tree& a_tree,const std::string& a_name){ - std::ostream& out = a_tree.file().out(); - - branch* _branch = a_tree.find_branch(a_name,true); - if(!_branch) { - out << "tools::rroot::find_be :" - << " branch not found." - << std::endl; - return 0; - } - - branch_element* be = id_cast(*_branch); - if(!be) { - out << "tools::rroot::find_be :" - << " branch not a branch_element." - << std::endl; - return 0; - } - - return be; -} - -template -inline stl_vector* find_vec(ifile& a_file,branch_element& a_be,uint64 a_event){ - std::ostream& out = a_file.out(); - - unsigned int n; - if(!a_be.find_entry(a_file,a_event,n)) { - out << "tools::rroot::find_vec : branch_element.find_entry() failed." << std::endl; - return 0; - } - - iro* o = a_be.object(); - stl_vector* od = id_cast >(*o); - if(!od) { - out << "tools::rroot::find_vec : object not a tools::rroot::stl_vector." << std::endl; - return 0; - } - - return od; //WARNING : we are not owner. -} - -}} - -#include "leaf" - -namespace tools { -namespace rroot { - -template -inline bool find_leaf(tree& a_tree,const std::string& a_name,branch*& a_branch,LEAF*& a_leaf) { - //used in MEMPHYS sim. - base_leaf* _base_leaf = a_tree.find_leaf(a_name); - if(!_base_leaf) { - a_tree.out() << "tools::rroot::find_leaf : base_leaf " << sout(a_name) << " not found." << std::endl; - a_branch = 0; - a_leaf = 0; - return false; - } - a_branch = a_tree.find_leaf_branch(*_base_leaf); - if(!a_branch) { - a_tree.out() << "tools::rroot::find_leaf : branch of base_leaf " << sout(a_name) << " not found." << std::endl; - a_branch = 0; - a_leaf = 0; - return false; - } - a_leaf = safe_cast(*_base_leaf); - if(!a_leaf) { - a_tree.out() << "tools::rroot::find_leaf : base_leaf " << sout(a_name) << " is not a LEAF." << std::endl; - a_branch = 0; - a_leaf = 0; - return false; - } - return true; -} - -inline branch_element* find_branch_element(tree& a_tree,const std::string& a_name) { - branch* _branch = a_tree.find_branch(a_name); - if(!_branch) { - a_tree.out() << "tools::rroot::find_branch_element : branch " << sout(a_name) << " not found." << std::endl; - return 0; - } - branch_element* be = safe_cast(*_branch); - if(!be) { - a_tree.out() << "tools::rroot::find_branch_element : branch " << sout(a_name) << " not a branch_element." - << " It is a " << sout(_branch->s_cls()) << "." - << std::endl; - return 0; - } - return be; -} - -template -inline bool read_leaf(ifile& a_file,branch& a_branch,leaf& a_leaf,uint64 a_event,TYPE& a_value) { - unsigned int n; - if(!a_branch.find_entry(a_file,a_event,n)) { - a_file.out() << "tools::rroot::read_leaf : a_branch.find_entry() failed." << std::endl; - a_value = TYPE(0); - return false; - } - return a_leaf.value(0,a_value); -} - -inline bool read_leaf_object(ifile& a_file,branch& a_branch,leaf_object& a_leaf,uint64 a_event) { - unsigned int n; - if(!a_branch.find_entry(a_file,a_event,n)) { - a_file.out() << "tools::rroot::read_leaf_object : a_branch.find_entry() failed." << std::endl; - return false; - } - return true; -} - -template -inline stl_vector* read_std_vec(ifile& a_file,branch_element& a_branch,uint64 a_event) { - unsigned int n; - if(!a_branch.find_entry(a_file,a_event,n)) { - a_file.out() << "tools::rroot::read_std_vec : a_branch.find_entry() failed." << std::endl; - return 0; - } - iro* obj = a_branch.object(); //Not owner. - if(!obj) return 0; - return id_cast >(*obj); -} - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/rtausmed b/source/externals/g4tools/include/tools/rtausmed deleted file mode 100644 index 73498db4d9..0000000000 --- a/source/externals/g4tools/include/tools/rtausmed +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_rtausmed -#define tools_rtausmed - -// G.Barrand : not so clear if 0 and 1 are included. -// With a simple program, we saw no hits with "if(r.shoot()==0)" or "if(r.shoot()==1)". -// (See inlib/tests/rand.cpp). - -#include "rtausmeui" -#include "S_STRING" - -#include - -namespace tools { - -class rtausmed : public rtausmeui { - typedef rtausmeui parent; -public: - TOOLS_SCLASS(tools::rtausmed) -public: - rtausmed(unsigned int a_seed = 4357):parent(a_seed){} - virtual ~rtausmed(){} -public: - rtausmed(const rtausmed& a_from):parent(a_from){} - rtausmed& operator=(const rtausmed& a_from) {parent::operator=(a_from);return *this;} -protected: - static double two_to_minus_32() { - static const double s_v = std::ldexp(1.0,-32); - return s_v; - } -public: - double shoot() {return double(parent::shoot()) * two_to_minus_32();} -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/sargs b/source/externals/g4tools/include/tools/sargs deleted file mode 100644 index a17e9ab5a6..0000000000 --- a/source/externals/g4tools/include/tools/sargs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_sargs -#define tools_sargs - -#include "S_STRING" - -namespace tools { - -TOOLS_GLOBAL_STRING_VALUE(arg_verbose,-verbose) -TOOLS_GLOBAL_STRING_VALUE(arg_h,-h) -TOOLS_GLOBAL_STRING_VALUE(arg_help,-help) -TOOLS_GLOBAL_STRING_VALUE(arg_version,-version) - -TOOLS_GLOBAL_STRING_VALUE(arg_host,-host) -TOOLS_GLOBAL_STRING_VALUE(arg_port,-port) -TOOLS_GLOBAL_STRING_VALUE(arg_can_shutdown,-can_shutdown) - -TOOLS_GLOBAL_STRING_VALUE(arg_land,-land) -TOOLS_GLOBAL_STRING_VALUE(arg_document,-document) -TOOLS_GLOBAL_STRING_VALUE(arg_orders,-orders) - -TOOLS_GLOBAL_STRING_VALUE(arg_black,-black) -TOOLS_GLOBAL_STRING_VALUE(arg_full_screen,-full_screen) -TOOLS_GLOBAL_STRING_VALUE(arg_no_decos,-no_decos) -TOOLS_GLOBAL_STRING_VALUE(arg_solid,-solid) -TOOLS_GLOBAL_STRING_VALUE(arg_monitor,-monitor) -TOOLS_GLOBAL_STRING_VALUE(arg_monitors,-monitors) -TOOLS_GLOBAL_STRING_VALUE(arg_terminal,-terminal) -TOOLS_GLOBAL_STRING_VALUE(arg_arg0,-arg0) - -} - -#endif diff --git a/source/externals/g4tools/include/tools/serrno b/source/externals/g4tools/include/tools/serrno deleted file mode 100644 index f48e3ce364..0000000000 --- a/source/externals/g4tools/include/tools/serrno +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_serrno -#define tools_serrno - -#include -#include -#include - -namespace tools { - -inline void serrno(std::string& a_s) { - std::ostringstream strm; - strm << (int)errno; - a_s = " error : "; - a_s += strm.str(); - a_s += " : "; - a_s += strerror(errno); - a_s += "."; -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/sg/GL_plots_viewer b/source/externals/g4tools/include/tools/sg/GL_plots_viewer deleted file mode 100644 index f32d66723c..0000000000 --- a/source/externals/g4tools/include/tools/sg/GL_plots_viewer +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_sg_GL_plots_viewer -#define tools_sg_GL_plots_viewer - -// used in geant4 plotting. - -#include - -#include - -#include "GL_manager" -#include "GL_action" - -namespace tools { -namespace sg { - -class GL_plots_viewer : public tools::sg::plots_viewer { - TOOLS_HEADER(GL_plots_viewer,tools::sg::GL_plots_viewer,tools::sg::plots_viewer) -public: - void render() { - if(!m_ww) return; - if(!m_wh) return; - - m_gl_mgr.begin_render(0,0,m_ww,m_wh, - m_clear_color.r(), - m_clear_color.g(), - m_clear_color.b(), - m_clear_color.a()); - - GL_action action(m_gl_mgr,m_out,m_ww,m_wh); - action.state().m_use_gsto = m_use_gsto; - - m_sg.render(action); - if(!action.end()) { //check that matrices stack are ok. - m_out << "exib::sg::GL_plots_viewer :" - << " bad gl_action end." - << std::endl; - } - - //after_render(); - - m_gl_mgr.end_render(); - } - -public: - GL_plots_viewer(std::ostream& a_out,const tools::sg::base_freetype& a_ttf, - unsigned int a_cols = 1,unsigned int a_rows = 1, - unsigned int a_width = 500,unsigned int a_height = 500) - :parent(a_out,a_ttf,a_cols,a_rows,a_width,a_height) - ,m_gl_mgr(a_out) - {} - virtual ~GL_plots_viewer(){ - //WARNING : nodes may refer m_gl_mgr (to handle gstos/texs), then we have to delete them first. - m_sg.clear(); - m_plots.clear_sg(); - } -public: - GL_plots_viewer(const GL_plots_viewer& a_from) - :parent(a_from) - ,m_gl_mgr(a_from.m_gl_mgr) - {} - GL_plots_viewer& operator=(const GL_plots_viewer& a_from){ - parent::operator=(a_from); - m_gl_mgr = a_from.m_gl_mgr; - return *this; - } -protected: - GL_manager m_gl_mgr; -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/sg/GL_viewer b/source/externals/g4tools/include/tools/sg/GL_viewer index 8825938c08..38edee0441 100644 --- a/source/externals/g4tools/include/tools/sg/GL_viewer +++ b/source/externals/g4tools/include/tools/sg/GL_viewer @@ -28,11 +28,20 @@ public: GL_action action(m_gl_mgr,m_out,m_ww,m_wh); action.state().m_use_gsto = m_use_gsto; + action.set_do_transparency(false); + action.set_have_to_do_transparency(false); + m_sg.render(action); if(!action.end()) { //check that matrices stack are ok. - m_out << "exib::sg::GL_viewer :" - << " bad gl_action end." - << std::endl; + m_out << "tools::sg::GL_viewer : bad gl_action end." << std::endl; + } else { + if(action.have_to_do_transparency()) { + action.set_do_transparency(true); + m_sg.render(action); + if(!action.end()) { //check that matrices stack are ok. + m_out << "tools::sg::GL_viewer : bad gl_action end." << std::endl; + } + } } //after_render(); diff --git a/source/externals/g4tools/include/tools/sg/atb_vertices b/source/externals/g4tools/include/tools/sg/atb_vertices index 81af335b72..7a583bf238 100644 --- a/source/externals/g4tools/include/tools/sg/atb_vertices +++ b/source/externals/g4tools/include/tools/sg/atb_vertices @@ -123,18 +123,18 @@ public: if(touched()) { if(do_back.value()) gen_back(); if(draw_edges.value()) gen_edges(); -#ifdef __APPLE__ m_all_a_one = true; {tools_vforcit_npp(float,rgbas.values(),it) { if(*(it+3)!=1) {m_all_a_one = false;break;} it += 4; }} -#endif //__APPLE__ clean_gstos(); reset_touched(); } if(xyzs.empty()) return; + if(!have_to_render(a_action)) return; + const state& state = a_action.state(); if(state.m_use_gsto) { @@ -326,9 +326,7 @@ public: ,m_xyzs_pos(0) ,m_rgbas_pos(0) ,m_nms_pos(0) -#ifdef __APPLE__ ,m_all_a_one(true) -#endif { #ifdef TOOLS_MEM mem::increment(s_class().c_str()); @@ -351,9 +349,7 @@ public: ,m_xyzs_pos(a_from.m_xyzs_pos) ,m_rgbas_pos(a_from.m_rgbas_pos) ,m_nms_pos(a_from.m_nms_pos) -#ifdef __APPLE__ ,m_all_a_one(true) -#endif { #ifdef TOOLS_MEM mem::increment(s_class().c_str()); @@ -539,6 +535,23 @@ public: parent::clear(); } protected: + bool have_to_render(render_action& a_action) { + bool transparent = false; + if(rgbas.size()) { + if(!m_all_a_one) transparent = true; + } else { + if(a_action.state().m_color.a()!=1) transparent = true; + } + if(transparent) { + if(a_action.do_transparency()) return true; + a_action.set_have_to_do_transparency(true); + return false; + } else { + if(a_action.do_transparency()) return false; + } + return true; + } + void gen_back(){ m_back_xyzs.clear(); m_back_nms.clear(); @@ -688,9 +701,7 @@ protected: size_t m_xyzs_pos; size_t m_rgbas_pos; size_t m_nms_pos; -#ifdef __APPLE__ bool m_all_a_one; -#endif }; }} diff --git a/source/externals/g4tools/include/tools/sg/base_freetype b/source/externals/g4tools/include/tools/sg/base_freetype index 1a0adc4983..60d4a1d1ef 100644 --- a/source/externals/g4tools/include/tools/sg/base_freetype +++ b/source/externals/g4tools/include/tools/sg/base_freetype @@ -7,6 +7,7 @@ #include "base_text" #include "gstos" #include "sf_string" +#include // abstract class to handle freetype text. @@ -73,6 +74,8 @@ public: ,modeling(a_from.modeling) ,unitext(a_from.unitext) //,font_dirs(a_from.font_dirs) + ,m_fonts(a_from.m_fonts) + ,m_finders(a_from.m_finders) { add_fields(); } @@ -85,9 +88,15 @@ public: modeling = a_from.modeling; unitext = a_from.unitext; //font_dirs = a_from.font_dirs; + m_fonts = a_from.m_fonts; + m_finders = a_from.m_finders; return *this; } +public: + static base_freetype* create(const base_freetype& a_ttf) { + return safe_cast(*(a_ttf.copy())); + } public: void dump_unitext(std::ostream& a_out) { //unitext.values().size() @@ -104,11 +113,38 @@ public: a_out << "end line." << std::endl; } } -public: - static base_freetype* create(const base_freetype& a_ttf) { - return safe_cast(*(a_ttf.copy())); +public: + typedef const unsigned char*(*font_getter)(unsigned int&); + void add_embedded_font(const std::string& a_name,font_getter a_getter) { + unsigned int size; + const unsigned char* buffer = a_getter(size); + m_fonts[a_name] = embedded_font(size,buffer); //warning: we do not take ownership of buffer. } - + typedef std::pair embedded_font; + void add_embedded_font(const std::string& a_name,unsigned int a_size,const unsigned char* a_buffer) { + //warning: we do not take ownership of a_buffer. + m_fonts[a_name] = embedded_font(a_size,a_buffer); + } + bool find_embedded_font(const std::string& a_name,unsigned int& a_size,const unsigned char*& a_buffer) { + std::map::const_iterator it = m_fonts.find(a_name); + if(it==m_fonts.end()) {a_size = 0;a_buffer = 0;return false;} + a_size = (*it).second.first; + a_buffer = (*it).second.second; + return true; + } +public: + typedef bool(*font_finder)(const std::string&,std::string&); + void add_font_finder(font_finder a_finder) {m_finders.push_back(a_finder);} + bool find_font_with_finders(const std::string& a_name,std::string& a_font) { + tools_vforcit(font_finder,m_finders,it) { + if((*it)(a_name,a_font)) return true; + } + a_font.clear(); + return false; + } +protected: + std::map m_fonts; + std::vector m_finders; }; }} diff --git a/source/externals/g4tools/include/tools/sg/bcbk b/source/externals/g4tools/include/tools/sg/bcbk new file mode 100644 index 0000000000..2b0c77e130 --- /dev/null +++ b/source/externals/g4tools/include/tools/sg/bcbk @@ -0,0 +1,132 @@ +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +#ifndef tools_sg_bcbk +#define tools_sg_bcbk + +// "cbk" is for callback. Base class to handle a callback. + +#ifdef TOOLS_MEM +#include "../mem" +#endif + +#include "../scast" +#include "../S_STRING" + +#include + +namespace tools { +namespace sg { + +enum return_action { + return_none, + return_to_render +}; + +class bcbk { +public: + TOOLS_SCLASS(tools::sg::bcbk) +public: + virtual void* cast(const std::string& a_class) const { + if(void* p = cmp_cast(this,a_class)) {return p;} + return 0; + } + virtual const std::string& s_cls() const {return s_class();} +public: + virtual return_action action() = 0; + virtual bcbk* copy() const = 0; + //virtual bool equal(const bcbk&) const = 0; //it would need the upper cast. +public: + virtual ~bcbk(){ +#ifdef TOOLS_MEM + mem::decrement(s_class().c_str()); +#endif + } +protected: + bcbk() + :m_single_shoot(false) + ,m_is_valid(true) + { +#ifdef TOOLS_MEM + mem::increment(s_class().c_str()); +#endif + } + bcbk(const bcbk& a_from) + :m_single_shoot(a_from.m_single_shoot) + ,m_is_valid(a_from.m_is_valid) + { +#ifdef TOOLS_MEM + mem::increment(s_class().c_str()); +#endif + } + bcbk& operator=(const bcbk& a_from){ + m_single_shoot = a_from.m_single_shoot; + m_is_valid = a_from.m_is_valid; + return *this; + } +public: + void set_single_shoot(bool a_value) {m_single_shoot = a_value;} + bool is_single_shoot() const {return m_single_shoot;} + + bool is_valid() const {return m_is_valid;} + void invalidate() {m_is_valid = false;} +protected: + bool m_single_shoot; + bool m_is_valid; +}; + +}} + +#define TOOLS_CBK(a__class,a__sclass,a__parent)\ +private:\ + typedef a__parent parent;\ +public:\ + TOOLS_SCLASS(a__sclass)\ +public:\ + virtual void* cast(const std::string& a_class) const {\ + if(void* p = tools::cmp_cast(this,a_class)) return p;\ + return parent::cast(a_class);\ + }\ + virtual const std::string& s_cls() const {return s_class();}\ + virtual tools::sg::bcbk* copy() const {return new a__class(*this);} + +#define TOOLS_T_CBK(a__T,a__class,a__sclass,a__parent)\ +private:\ + typedef a__parent parent;\ +public:\ + TOOLS_T_SCLASS(a__T,a__sclass)\ +public:\ + virtual void* cast(const std::string& a_class) const {\ + if(void* p = tools::cmp_cast(this,a_class)) return p;\ + return parent::cast(a_class);\ + }\ + virtual const std::string& s_cls() const {return s_class();}\ + virtual tools::sg::bcbk* copy() const {return new a__class(*this);} + +#define TOOLS_T2_CBK(a__T1,a__T2,a__class,a__sclass,a__parent)\ +private:\ + typedef a__parent parent;\ +public:\ + TOOLS_T2_SCLASS(a__T1,a__T2,a__sclass)\ +public:\ + virtual void* cast(const std::string& a_class) const {\ + if(void* p = tools::cmp_cast(this,a_class)) return p;\ + return parent::cast(a_class);\ + }\ + virtual const std::string& s_cls() const {return s_class();}\ + virtual tools::sg::bcbk* copy() const {return new a__class(*this);} + +#define TOOLS_T3_CBK(a__T1,a__T2,a__T3,a__class,a__sclass,a__parent)\ +private:\ + typedef a__parent parent;\ +public:\ + TOOLS_T3_SCLASS(a__T1,a__T2,a__T3,a__sclass)\ +public:\ + virtual void* cast(const std::string& a_class) const {\ + if(void* p = tools::cmp_cast(this,a_class)) return p;\ + return parent::cast(a_class);\ + }\ + virtual const std::string& s_cls() const {return s_class();}\ + virtual tools::sg::bcbk* copy() const {return new a__class(*this);} + +#endif diff --git a/source/externals/g4tools/include/tools/sg/cbks b/source/externals/g4tools/include/tools/sg/cbks new file mode 100644 index 0000000000..eae937eedf --- /dev/null +++ b/source/externals/g4tools/include/tools/sg/cbks @@ -0,0 +1,57 @@ +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +#ifndef tools_sg_cbks +#define tools_sg_cbks + +// A dedicated container for callbacks. + +#include "bcbk" +#include "../forit" +#include "../vmanip" + +#include + +namespace tools { +namespace sg { + +class cbks { +public: + cbks() {} + virtual ~cbks(){clear();} +public: + cbks(const cbks& a_from){copy(a_from);} + cbks& operator=(const cbks& a_from){ + if(&a_from==this) return *this; + copy(a_from); + return *this; + } +public: + void add(bcbk* a_cbk) { + //we take ownership of a_cbk + m_cbks.push_back(a_cbk); + } + void copy(const cbks& a_from,bool a_clear = true) { + if(&a_from==this) return; + if(a_clear) clear(); + tools_vforcit(bcbk*,a_from.m_cbks,it) m_cbks.push_back((*it)->copy()); + } + void clear() { + safe_clear(m_cbks); + } + + void do_actions() const { + // WARNING : dangerous. Used by offscreen apps. + tools_vforcit(bcbk*,m_cbks,it) (*it)->action(); + } + + const std::vector& callbacks() const {return m_cbks;} + std::vector& callbacks() {return m_cbks;} + bool is_empty() const {return m_cbks.empty();} +protected: + std::vector m_cbks; +}; + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/sg/color b/source/externals/g4tools/include/tools/sg/color deleted file mode 100644 index bb7d0deaf4..0000000000 --- a/source/externals/g4tools/include/tools/sg/color +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_sg_color -#define tools_sg_color - -#include "node" - -#include "sf_vec" -#include "render_action" -#include "../colorf" - -namespace tools { -namespace sg { - -class color : public node { - TOOLS_NODE(color,tools::sg::color,node) -public: - sf_vec rgb; - sf transparency; //alpha=1-transparency. Opaque is transparency=0. -public: - virtual const desc_fields& node_desc_fields() const { - TOOLS_FIELD_DESC_NODE_CLASS(tools::sg::color) - static const desc_fields s_v(parent::node_desc_fields(),2, //WARNING : take care of count. - TOOLS_ARG_FIELD_DESC(rgb), - TOOLS_ARG_FIELD_DESC(transparency) - ); - return s_v; - } -private: - void add_fields(){ - add_field(&rgb); - add_field(&transparency); - } -public: - virtual void render(render_action& a_action) { - // GL-ES : ::glMaterialfv does not work. We then use : - // ::glEnable(GL_COLOR_MATERIAL) and ::glColor. - - //if(a_action.state().m_GL_LIGHTING) { - // float params[4]; - // params[0] = rgb.value().r(); - // params[1] = rgb.value().g(); - // params[2] = rgb.value().b(); - // params[3] = 1-transparency.value(); - // ::glMaterialfv(GL_FRONT,GL_DIFFUSE,params); - //} else { - //} - - state& state = a_action.state(); - state.m_color[0] = rgb.value().r(); - state.m_color[1] = rgb.value().g(); - state.m_color[2] = rgb.value().b(); - state.m_color[3] = 1-transparency.value(); - a_action.color4f(state.m_color); - } -public: - color() - :parent() - ,rgb(colorf_default()) - ,transparency(0.0f) - { - add_fields(); - } - virtual ~color(){} -public: - color(const color& a_from) - :parent(a_from) - ,rgb(a_from.rgb) - ,transparency(a_from.transparency) - { - add_fields(); - } - color& operator=(const color& a_from){ - parent::operator=(a_from); - - rgb = a_from.rgb; - transparency = a_from.transparency; - - return *this; - } -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/sg/ecbk b/source/externals/g4tools/include/tools/sg/ecbk new file mode 100644 index 0000000000..22a6abaf2b --- /dev/null +++ b/source/externals/g4tools/include/tools/sg/ecbk @@ -0,0 +1,118 @@ +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +#ifndef tools_sg_ecbk +#define tools_sg_ecbk + +// A callback class to handle a response to some event +// (viewer/window size, mouse button press, etc...). +// It is typically used through the event_dispatcher node. + +#include "bcbk" +#include "event" +#include "event_action" +#include "../forit" +#include "../HEADER" + +#include + +namespace tools { +namespace sg { + class node; +}} + +namespace tools { +namespace sg { + +class ecbk : public bcbk { + TOOLS_HEADER(ecbk,tools::sg::ecbk,bcbk) +public: + ecbk(unsigned int a_action = 0) + :parent() + ,m_action(a_action) + ,m_no_set_done(false) + ,m_event(0) + ,m_event_action(0) + ,m_node(0) + ,m_z(0) + ,m_w(0) + {} + virtual ~ecbk(){delete m_event;} +public: + ecbk(const ecbk& a_from) + :parent(a_from) + ,m_action(a_from.m_action) + ,m_no_set_done(a_from.m_no_set_done) + ,m_event(0) + ,m_event_action(a_from.m_event_action) + ,m_node(a_from.m_node) + ,m_z(a_from.m_z) + ,m_w(a_from.m_w) + { + if(a_from.m_event) m_event = a_from.m_event->copy(); + } + ecbk& operator=(const ecbk& a_from){ + parent::operator=(a_from); + + m_action = a_from.m_action; + m_no_set_done = a_from.m_no_set_done; + + delete m_event; + m_event = 0; + if(a_from.m_event) m_event = a_from.m_event->copy(); + + m_event_action = a_from.m_event_action; + m_node = a_from.m_node; + m_z = a_from.m_z; + m_w = a_from.m_w; + return *this; + } +public: + void set_action(unsigned int a_v){m_action = a_v;} + void set_no_set_done(bool a_v) {m_no_set_done = a_v;} + // for ArcheryTune : + event& event_ref() const {return *m_event;} + event_action& event_action_ref() const {return *m_event_action;} +public: + static void exec_event_cbks(const std::vector& a_cbks, + const event& a_evt, + event_action* a_action, + node* a_node, + float a_z = 0,float a_w = 0) { + tools_vforcit(bcbk*,a_cbks,it) { + bcbk* _cbk = (*it)->copy(); + + if(ecbk* _ecbk = safe_cast(*_cbk)){ + delete _ecbk->m_event; + _ecbk->m_event = a_evt.copy(); + + _ecbk->m_event_action = a_action; + _ecbk->m_node = a_node; + _ecbk->m_z = a_z; + _ecbk->m_w = a_w; + + _ecbk->action(); + + if(a_action->done()) { + delete _cbk; + break; + } + } + + delete _cbk; + } + } + +public: + unsigned int m_action; + bool m_no_set_done; //to tell not doing m_event_action->set_done(true). + event* m_event; //owner + event_action* m_event_action; //not owner. + node* m_node; //not owner. + float m_z; + float m_w; +}; + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/sg/event_dispatcher b/source/externals/g4tools/include/tools/sg/event_dispatcher new file mode 100644 index 0000000000..ad438f2f7c --- /dev/null +++ b/source/externals/g4tools/include/tools/sg/event_dispatcher @@ -0,0 +1,48 @@ +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +#ifndef tools_sg_event_dispatcher +#define tools_sg_event_dispatcher + +// Node that holds "callbacks" that can be triggered when an event_action +// traversed it. A typical example is to handle a mouse resize of the viewer/window +// and response to it by changing some geomtry in the scene graphs (for example +// to arrange that a tools::sg::plots maps the full viewer/window area). + +#include "node" +#include "cbks" +#include "event_action" +#include "ecbk" + +namespace tools { +namespace sg { + +class event_dispatcher : public node { + TOOLS_NODE(event_dispatcher,tools::sg::event_dispatcher,node) +public: + virtual void event(event_action& a_action) { + ecbk::exec_event_cbks(m_cbks.callbacks(),a_action.get_event(),&a_action,this); + } +public: + event_dispatcher():parent(),m_cbks(){} + virtual ~event_dispatcher(){} +public: + event_dispatcher(const event_dispatcher& a_from):parent(a_from),m_cbks(a_from.m_cbks){} + event_dispatcher& operator=(const event_dispatcher& a_from){ + parent::operator=(a_from); + m_cbks = a_from.m_cbks; + return *this; + } +public: + const sg::cbks& cbks() const {return m_cbks;} + //sg::cbks& cbks() {return m_cbks;} + void add_callback(bcbk* a_cbk) {m_cbks.add(a_cbk);} //we take ownership of a_cbk + void copy_cbks(const sg::cbks& a_from,bool a_clear = true) {m_cbks.copy(a_from,a_clear);} + void clear_cbks(){m_cbks.clear();} +protected: + sg::cbks m_cbks; +}; + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/sg/gl2ps_action b/source/externals/g4tools/include/tools/sg/gl2ps_action index 23af9bc7f0..01661acf7e 100644 --- a/source/externals/g4tools/include/tools/sg/gl2ps_action +++ b/source/externals/g4tools/include/tools/sg/gl2ps_action @@ -648,6 +648,7 @@ inline bool s2format(const std::string& a_format,int& a_gl2ps_format) { if(a_format=="gl2ps_svg") {a_gl2ps_format = TOOLS_GL2PS_SVG;return true;} if(a_format=="gl2ps_tex") {a_gl2ps_format = TOOLS_GL2PS_TEX;return true;} if(a_format=="gl2ps_pgf") {a_gl2ps_format = TOOLS_GL2PS_PGF;return true;} + a_gl2ps_format = TOOLS_GL2PS_PS; return false; } diff --git a/source/externals/g4tools/include/tools/sg/light_off b/source/externals/g4tools/include/tools/sg/light_off new file mode 100644 index 0000000000..ca4175f41b --- /dev/null +++ b/source/externals/g4tools/include/tools/sg/light_off @@ -0,0 +1,36 @@ +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +#ifndef tools_sg_light_off +#define tools_sg_light_off + +// A node to cancel/switch of the lighting during a render traversal. + +#include "node" +#include "render_action" + +namespace tools { +namespace sg { + +class light_off : public node { + TOOLS_NODE(light_off,tools::sg::light_off,node) +public: + virtual void render(render_action& a_action) { + state& state = a_action.state(); + state.m_GL_LIGHTING = false; + a_action.set_lighting(false); + } +public: + light_off():parent() {} + virtual ~light_off(){} +public: + light_off(const light_off& a_from):parent(a_from){} + light_off& operator=(const light_off& a_from){ + parent::operator=(a_from); + return *this; + } +}; + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/sg/line_set b/source/externals/g4tools/include/tools/sg/line_set deleted file mode 100644 index 6464fbc0a4..0000000000 --- a/source/externals/g4tools/include/tools/sg/line_set +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_sg_line_set -#define tools_sg_line_set - -#include "node" - -#include "mf" -#include "../stype" -#include "render_action" -#include "pick_action" -#include "bbox_action" - -namespace tools { -namespace sg { - -class line_set : public node { - TOOLS_NODE(line_set,tools::sg::line_set,node) -public: - mf_std_vec lines; -public: - virtual const desc_fields& node_desc_fields() const { - TOOLS_FIELD_DESC_NODE_CLASS(tools::sg::line_set) - static const desc_fields s_v(parent::node_desc_fields(),1, //WARNING : take care of count. - TOOLS_ARG_FIELD_DESC(lines) - ); - return s_v; - } -private: - void add_fields(){ - add_field(&lines); - } -public: - typedef std::vector line_t; - - virtual void render(render_action& a_action) { - tools_vforcit(line_t,lines.values(),it) { - a_action.draw_vertex_array(gl::line_strip(),*it); - } - } - - virtual void pick(pick_action& a_action) { - if(a_action.stop_at_first()){ - tools_vforcit(line_t,lines.values(),it) { - a_action.add_line_strip(*it); - if(a_action.done()) { - a_action.set_node(this); - return; - } - } - } else { - tools_vforcit(line_t,lines.values(),it) { - a_action.set_done(false); - a_action.zs().clear(); - a_action.ws().clear(); - a_action.add_line_strip(*it); - if(a_action.done()) { - a_action.add_pick(*this,a_action.zs(),a_action.ws(),a_action.state()); - a_action.set_done(false); - } - } - } - } - - virtual void bbox(bbox_action& a_action) { - tools_vforcit(line_t,lines.values(),it) { - a_action.add_points(*it); - } - } - -public: - line_set() - :parent() - ,lines() - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - add_fields(); - } - virtual ~line_set(){ -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -public: - line_set(const line_set& a_from) - :parent(a_from) - ,lines(a_from.lines) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - add_fields(); - } - line_set& operator=(const line_set& a_from){ - parent::operator=(a_from); - lines = a_from.lines; - return *this; - } -public: - bool add(const line_t& a_line) { - size_t npoint = a_line.size()/3; - if(npoint*3!=a_line.size()) return false; - lines.add(a_line); - return true; - } - void clear() {lines.clear();} -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/sg/path b/source/externals/g4tools/include/tools/sg/path new file mode 100644 index 0000000000..ffa66d7625 --- /dev/null +++ b/source/externals/g4tools/include/tools/sg/path @@ -0,0 +1,169 @@ +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +// +// Helper functions to handle node(s) paths in a scene graph. +// + +#ifndef tools_sg_path +#define tools_sg_path + +#include "node" +#include "noderef" +#include "../pointer" + +namespace tools { +namespace sg { + +typedef std::vector path_t; + +inline bool parent_class(const path_t& a_path,std::string& a_class) { + if(a_path.size()<2) {a_class.clear();return false;} + node* parent = a_path[a_path.size()-2]; + a_class = parent->s_cls(); + return true; +} + +template +inline NODE* rfind(const path_t& a_path) { + path_t::const_reverse_iterator it; + for(it=a_path.rbegin();it!=a_path.rend();++it){ + if(NODE* par = safe_cast(*(*it))) return par; + } + return 0; +} + +template +inline NODE* tail(const path_t& a_path) { + if(a_path.empty()) return 0; + node* _node = a_path[a_path.size()-1]; + return safe_cast(*_node); +} + +inline bool remove_tail(path_t& a_path) { + if(a_path.empty()) return false; + a_path.resize(a_path.size()-1); + return true; +} + +template +inline CONTAINER* container(const path_t& a_path) { + if(a_path.size()<2) return 0; + node* parent = a_path[a_path.size()-2]; + return safe_cast(*parent); +} + +template +inline CONTAINER* container_container(const path_t& a_path) { + if(a_path.size()<3) return 0; + node* parent = a_path[a_path.size()-3]; + return safe_cast(*parent); +} + +inline void dump(std::ostream& a_out,const path_t& a_path) { + a_out << "tools::sg::dump : path size " << a_path.size() << std::endl; + std::string s; + path_t::const_iterator it; + for(it=a_path.begin();it!=a_path.end();++it){ + if(!p2s(*it,s)) {} + a_out << " " << s << " " << (*it)->s_cls(); + if(noderef* _ref = safe_cast(*(*it))) { + if(!p2s(&(_ref->node()),s)) {} + a_out << ", " << s << " " << _ref->node().s_cls(); + } + a_out << std::endl; + } +} + +//#define TOOLS_RFIND_DEBUG + +template +inline bool rfind(const path_t& a_path,const node& a_from, + CONTAINER*& a_container,WHAT*& a_what, + int& a_container_index){ + node* from = (node*)&a_from; + path_t::size_type sz = a_path.size(); +#ifdef TOOLS_RFIND_DEBUG + ::printf("debug : rfind : from %s, a_path.size() %d\n",a_from.s_cls().c_str(),sz); + //::printf("debug : rfind : search node of class %s\n",typename WHAT::s_cls().c_str()); +#endif + for(size_t index=1;indexs_cls().c_str()); +#endif + a_container = safe_cast(*_node); + if(a_container) { +#ifdef TOOLS_RFIND_DEBUG + ::printf("debug : rfind : node is a container of size %d\n",a_container->size()); +#endif + //the below does not compile. + //a_what = a_container->rsearch_from(from); + //if(a_what) return true; + + void* p = a_container->rsearch_from(from,WHAT::s_class(),false); + if(p) { +#ifdef TOOLS_RFIND_DEBUG + ::printf("debug : rfind : found in container %lu\n",p); +#endif + a_what = (WHAT*)p; + a_container_index = int(sz-index-1); + return true; + } + + from = a_container; + } else if(noderef* _ref = safe_cast(*_node)) { +#ifdef TOOLS_RFIND_DEBUG + ::printf("debug : rfind : node is a noderef with a %s\n",_ref->node().s_cls().c_str()); +#endif + from = _ref; + } else { // weird case : +#ifdef TOOLS_RFIND_DEBUG + ::printf("debug : rfind : weird case\n"); +#endif + break; + } + } +#ifdef TOOLS_RFIND_DEBUG + ::printf("debug : rfind : failed\n"); +#endif + a_what = 0; + a_container = 0; + a_container_index = -1; + return false; +} +#ifdef TOOLS_RFIND_DEBUG +#undef TOOLS_RFIND_DEBUG +#endif + +template +inline bool find_top(const path_t& a_path,const node& a_from, + CONTAINER*& a_container,WHAT*& a_what, + int& a_container_index){ + a_what = 0; + a_container = 0; + a_container_index = -1; + path_t _path = a_path; + node* from = (node*)&a_from; + while(true) { + CONTAINER* container; + WHAT* what; + int idx; //index in path of container. + if(!sg::rfind(_path,*from,container,what,idx)) { + break; + } + a_container = container; + a_what = what; + a_container_index = idx; + _path.resize(idx+1); + _path.push_back(what); + from = what; + } + return a_container?true:false; +} + +typedef std::vector paths_t; + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/sg/plotter_some_styles b/source/externals/g4tools/include/tools/sg/plotter_some_styles new file mode 100644 index 0000000000..ae6e9f5982 --- /dev/null +++ b/source/externals/g4tools/include/tools/sg/plotter_some_styles @@ -0,0 +1,360 @@ +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +#ifndef tools_sg_plotter_some_styles +#define tools_sg_plotter_some_styles + +// Functions to set some common styles. +// Typically ROOT_default (the default style of ROOT), hippodraw +// or return/reset to the default inlib style. + +#include "plotter" +#include "style_colormap" + +namespace tools { +namespace sg { + +inline bool set_style_color(std::ostream& a_out,const cmaps_t& a_cmaps,const std::string& a_s,colorf& a_col){ + if(!find_color(a_cmaps,a_s,a_col)) { + a_out << "tools::sg::set_style_color: color " << sout(a_s) << " not found." << std::endl; + return false; + } + return true; +} + +// a_font = font_arialbd_ttf(); //idem ROOT 62. +// a_font = font_roboto_bold_ttf(); //open source replacement for arialbd. + +inline void set_style_font(text_style& a_style,const std::string& a_font){ + a_style.font = a_font; + a_style.front_face = winding_cw; + a_style.smoothing = true; +} + +inline void set_ROOT_default_style(std::ostream& a_out,const cmaps_t& a_cmaps,plotter& a_plotter,const std::string& a_font) { + a_plotter.value_top_margin = 0.05f; + a_plotter.bottom_margin = 0.1f; + a_plotter.top_margin = 0.1f; + a_plotter.left_margin = 0.1f; + a_plotter.right_margin = 0.1f; + + {style& _style = a_plotter.background_style(); + _style.visible = true; +//if(!set_style_color(a_out,a_cmaps,"ROOT/grey19",_style.back_color.value())) {} + //border: + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.line_width = 0.003; // 0 = no border. In % of width. + } + +// + + {style& _style = a_plotter.grid_style(); + _style.visible = false; +//if(!set_style_color(a_out,a_cmaps,"white",_style.color.value())) {} + } + + // plot title done with the title_box (and not plotter title): + {text_style& _style = a_plotter.title_style(); + _style.visible = false; + } + {text_style& _style = a_plotter.title_box_style(); + _style.visible = true; + if(!set_style_color(a_out,a_cmaps,"ROOT/grey19",_style.back_color.value())) {} + _style.back_shadow = 0.015f; //% of width. + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + set_style_font(_style,a_font);} + + a_plotter.infos_width = 0.35f; + a_plotter.infos_x_margin = 0.01f; //from right border. + a_plotter.infos_y_margin = 0.005f; //from top border. + {text_style& _style = a_plotter.infos_style(); + _style.visible = true; + if(!set_style_color(a_out,a_cmaps,"ROOT/grey19",_style.back_color.value())) {} + _style.back_shadow = 0.015f; //% of width. + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.modeling = infos_modeling_ROOT(); //to have histo name as info title. + set_style_font(_style,a_font);} + + {style& _style = a_plotter.inner_frame_style(); + _style.visible = true; + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.line_width = 1.0f; +//_style.line_pattern = line_solid; + } + + ////////////////////////////////////////////////////////// + /// x axis: ////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + {axis& _axis = a_plotter.x_axis(); + _axis.modeling = tick_modeling_hplot(); + _axis.divisions = 510; + _axis.title_hjust = right; + _axis.label_to_axis = 0.005f; + _axis.label_height = 0.04f; + _axis.tick_length = 0.03f; + _axis.title_to_axis = 0.05f; //YLAB = 0.05 + _axis.title_height = 0.04f; + _axis.is_log = false; + + {line_style& _style = _axis.line_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.width = 1.0f;} + + {line_style& _style = _axis.ticks_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.width = 1.0f;} + + {text_style& _style = _axis.labels_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6; //To have a good matching with ROOT text size. + set_style_font(_style,a_font);} + + {text_style& _style = _axis.title_style(); + _style.visible = true; + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6; //To have a good matching with ROOT text size. + set_style_font(_style,a_font);} + + {text_style& _style = _axis.mag_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6; //To have a good matching with ROOT text size. + set_style_font(_style,a_font);} + + } + + ////////////////////////////////////////////////////////// + /// y axis: ////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + {axis& _axis = a_plotter.y_axis(); + _axis.modeling = tick_modeling_hplot(); + _axis.divisions = 510; + _axis.title_hjust = right; + _axis.label_to_axis = 0.005f; + _axis.label_height = 0.04f; + _axis.tick_length = 0.03f; + _axis.title_to_axis = 0.07f; //XLAB = 0.07 + _axis.title_height = 0.04f; + _axis.is_log = false; + + {line_style& _style = _axis.line_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.width = 1.0f;} + + {line_style& _style = _axis.ticks_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.width = 1.0f;} + + {text_style& _style = _axis.labels_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6; + set_style_font(_style,a_font);} + + {text_style& _style = _axis.title_style(); + _style.visible = true; + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6; //To have a good matching with ROOT text size. + set_style_font(_style,a_font);} + + {text_style& _style = _axis.mag_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6; //To have a good matching with ROOT text size. + set_style_font(_style,a_font);} + + } + + ////////////////////////////////////////////////////////// + /// z axis: ////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + {axis& _axis = a_plotter.z_axis(); + _axis.modeling = tick_modeling_hplot(); + _axis.is_log = false; + + {line_style& _style = _axis.line_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.width = 1.0f;} + + {line_style& _style = _axis.ticks_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.width = 1.0f;} + + {text_style& _style = _axis.labels_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6;} + + {text_style& _style = _axis.title_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6;} + + {text_style& _style = _axis.mag_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6;} + + } + + ////////////////////////////////////////////////////////// + /// colormap axis: /////////////////////////////////////// + ////////////////////////////////////////////////////////// + {axis& _axis = a_plotter.colormap_axis(); + _axis.modeling = tick_modeling_hplot(); + _axis.divisions = 510; + _axis.title_hjust = right; + _axis.label_to_axis = 0.005f; + _axis.label_height = 0.04f; + _axis.tick_length = 0.03f; + _axis.title_to_axis = 0.07f; //XLAB = 0.07 + _axis.title_height = 0.04f; + _axis.is_log = false; + + {line_style& _style = _axis.line_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.width = 1.0f;} + + {line_style& _style = _axis.ticks_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.width = 1.0f;} + + {text_style& _style = _axis.labels_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6; //To have a good matching with ROOT text size. + set_style_font(_style,a_font);} + + {text_style& _style = _axis.title_style(); + _style.visible = true; + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6; //To have a good matching with ROOT text size. + set_style_font(_style,a_font);} + + {text_style& _style = _axis.mag_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.scale = 0.6; //To have a good matching with ROOT text size. + set_style_font(_style,a_font);} + + } + + {style& _style = a_plotter.bins_style(0); + _style.modeling = modeling_top_lines(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.line_width = 1.0f; +//_style.line_pattern = line_solid; + } + + {style& _style = a_plotter.func_style(0); + _style.modeling = modeling_top_lines(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.line_width = 3.0f; +//_style.line_pattern = line_solid; + } + +} + +// a_font = font_helvetica_ttf(); +// a_font = font_lato_regular_ttf(); //open source replacement for helvetica + +inline void set_hippodraw_style(std::ostream& a_out,const cmaps_t& a_cmaps,plotter& a_plotter,const std::string& a_font) { + // In memory of P.Kunz. + + a_plotter.value_top_margin = 0.05f; + a_plotter.bottom_margin = 0.12f; + a_plotter.top_margin = 0.16f; + a_plotter.left_margin = 0.16f; + a_plotter.right_margin = 0.16f; + a_plotter.title_to_axis = 0.1f; + a_plotter.title_height = 0.03f; + +// + + {style& _style = a_plotter.grid_style(); + _style.visible = false;} + {style& _style = a_plotter.inner_frame_style(); + _style.visible = true;} + {text_style& _style = a_plotter.infos_style(); + _style.visible = false;} + + {text_style& _style = a_plotter.title_style(); + set_style_font(_style,a_font); + _style.visible = true;} + + ////////////////////////////////////////////////////////// + /// x axis: ////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + {axis& _axis = a_plotter.x_axis(); + _axis.modeling = tick_modeling_hippo(); + _axis.title_hjust = center; + _axis.label_to_axis = 0.015f; + _axis.title_to_axis = 0.07f; + _axis.title_height = 0.035f; + _axis.label_height = 0.02625f; //0.0175F * 1.5F + + {text_style& _style = _axis.title_style(); + _style.visible = true; + set_style_font(_style,a_font);} + + {text_style& _style = _axis.labels_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + set_style_font(_style,a_font);} + + } + + ////////////////////////////////////////////////////////// + /// y axis: ////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + {axis& _axis = a_plotter.y_axis(); + _axis.modeling = tick_modeling_hippo(); + _axis.title_hjust = center; + _axis.title_to_axis = 0.2f; + _axis.title_height = 0.035f; + _axis.label_height = 0.02625f; //0.0175F * 1.5F + + {text_style& _style = _axis.title_style(); + _style.visible = true; + set_style_font(_style,a_font);} + + {text_style& _style = _axis.labels_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + set_style_font(_style,a_font);} + + } + + ////////////////////////////////////////////////////////// + /// z axis: ////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + {axis& _axis = a_plotter.z_axis(); + + {text_style& _style = _axis.title_style(); + _style.visible = true; + set_style_font(_style,a_font);} + + {text_style& _style = _axis.labels_style(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + set_style_font(_style,a_font);} + + } + + {style& _style = a_plotter.bins_style(0); + _style.modeling = modeling_top_lines(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.line_width = 1.0f; +//_style.line_pattern = line_solid; + } + + {style& _style = a_plotter.func_style(0); + _style.modeling = modeling_top_lines(); + if(!set_style_color(a_out,a_cmaps,"black",_style.color.value())) {} + _style.line_width = 1.0f; +//_style.line_pattern = line_solid; + } + + {style& _style = a_plotter.errors_style(0); + _style.visible = false; + } + +} + +inline void set_inlib_default_style(std::ostream&,const cmaps_t&,plotter& a_plotter,const std::string&) { + {axis& _axis = a_plotter.colormap_axis(); + _axis.label_to_axis = 0.01f;} +} + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/sg/polyhedron b/source/externals/g4tools/include/tools/sg/polyhedron deleted file mode 100644 index cce33ca0f8..0000000000 --- a/source/externals/g4tools/include/tools/sg/polyhedron +++ /dev/null @@ -1,499 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_sg_polyhedron -#define tools_sg_polyhedron - -#include "node" -#include "sf" -#include "render_action" -#include "pick_action" -#include "bbox_action" -#include "state" -#include "render_manager" -#include "gstos" -#include "../hep/sf_polyhedron" -#include "../vmanip" - -#include "tessellate" - -namespace tools { -namespace sg { - -class polyhedron : public node, public gstos { - TOOLS_NODE(polyhedron,tools::sg::polyhedron,node) -public: - hep::sf_polyhedron ph; - sf solid; - sf reduced_wire_frame; - sf enforce_edges; -public: - virtual const desc_fields& node_desc_fields() const { - TOOLS_FIELD_DESC_NODE_CLASS(tools::sg::polyhedron) - static const desc_fields s_v(parent::node_desc_fields(),4, //WARNING : take care of count. - TOOLS_ARG_FIELD_DESC(ph), - TOOLS_ARG_FIELD_DESC(solid), - TOOLS_ARG_FIELD_DESC(reduced_wire_frame), - TOOLS_ARG_FIELD_DESC(enforce_edges) - ); - return s_v; - } -private: - void add_fields(){ - add_field(&ph); - add_field(&solid); - add_field(&reduced_wire_frame); - add_field(&enforce_edges); - } -public: //node - - typedef tessellate::prims_t prims_t; - -protected: //gstos - virtual unsigned int create_gsto(std::ostream& a_out,render_manager& a_mgr) { - m_size = 0; - if(solid.value()) { - - size_t sz = 0; - - if(m_draw_edges) sz += m_xyzs.size(); - - {tools_vforcit(prims_t,m_primss,itt) { - const prims_t& prims = *itt; - tools_vforcit(tess_prim*,prims,it) { - const tess_prim& item = *(*it); - const std::vector& coords = item.m_coords; - const std::vector& norms = item.m_norms; - if(coords.empty()) continue; - if(norms.size()!=coords.size()) { - a_out << "tools::sg::polyhedron::create_gsto :" - << " bad number of normals." - << std::endl; - continue; - } - sz += coords.size()+norms.size(); - } - }} - - if(sz) { - - float* buffer = new float[sz]; - char* pos = (char*)buffer; - size_t psz = 0; - - if(m_draw_edges) { - if(m_xyzs.size()) { - size_t _sz = m_xyzs.size()*sizeof(float); - ::memcpy(pos,vec_data(m_xyzs),_sz); - pos += _sz; - psz += _sz; - m_size = m_xyzs.size(); - //m_xyzs.clear(); //we need them for pick,write,... - } - } - - {tools_vforcit(prims_t,m_primss,itt) { - const prims_t& prims = *itt; - tools_vforcit(tess_prim*,prims,it) { - tess_prim& item = *(*it); - const std::vector& coords = item.m_coords; - const std::vector& norms = item.m_norms; - if(coords.empty()) continue; - if(norms.size()!=coords.size()) continue; - - item.m_size = coords.size(); - - {item.m_pos_coords = psz; - size_t _sz = coords.size()*sizeof(float); - ::memcpy(pos,vec_data(coords),_sz); - pos += _sz; - psz += _sz;} - - {item.m_pos_norms = psz; - size_t _sz = norms.size()*sizeof(float); - ::memcpy(pos,vec_data(norms),_sz); - pos += _sz; - psz += _sz;} - - // we don't need coords, norms for rendering - // but needed for pick,write... - //coords.clear(); - //norms.clear(); - - //we still need m_prims. - - } - }} - - unsigned int id = a_mgr.create_gsto_from_data(sz,buffer); - delete [] buffer; - return id; - } - - } else { - m_size = m_xyzs.size(); - return a_mgr.create_gsto_from_data(m_xyzs); - } - return 0; - } - -public: - virtual void render(render_action& a_action) { - const state& state = a_action.state(); - - bool draw_edges = false; - if(solid.value()) { - draw_edges = state.m_GL_LIGHTING?false:true; - if(enforce_edges.value()) draw_edges = true; - } - - if( touched() || - (draw_edges && m_xyzs.empty()) || - (solid.value() && m_primss.empty()) ){ - update_what what = lines; - if(solid.value()) what = draw_edges?faces_and_lines:faces; - update_sg(a_action.out(),what); - reset_touched(); - } - - unsigned int _id = 0; - if(state.m_use_gsto) { - m_draw_edges = draw_edges; - _id = get_gsto_id(a_action.out(),a_action.render_manager()); - } else { - clean_gstos(&a_action.render_manager()); - } - - //a_action.out() << "debug : tools::sg::polyhedron::render_action :" - // << " m_xyzs.size() " << m_xyzs.size() - // << " m_primss.size() " << m_primss.size() - // << std::endl; - - if(solid.value()) { - - if(_id) { - - a_action.begin_gsto(_id); - if(draw_edges && m_size) { - //Same logic as Inventor SoLightModel.model = BASE_COLOR. - a_action.set_lighting(false); - a_action.color4f(0,0,0,1); - - a_action.draw_gsto_v(gl::lines(),m_size/3,0); - - //pushes back the filled polygons to avoid z-fighting with lines - a_action.set_polygon_offset(true); - - a_action.color4f(state.m_color); - a_action.set_lighting(state.m_GL_LIGHTING); - } - - {tools_vforcit(prims_t,m_primss,itt) { - const prims_t& prims = *itt; - tools_vforcit(tess_prim*,prims,it) { - const tess_prim& item = *(*it); - a_action.draw_gsto_vn(item.m_mode,item.m_size/3,item.m_pos_coords,item.m_pos_norms); - } - }} - - a_action.set_polygon_offset(state.m_GL_POLYGON_OFFSET_FILL); - a_action.end_gsto(); - } else { - - if(draw_edges){ - if(m_xyzs.size()) { - //Same logic as Inventor SoLightModel.model = BASE_COLOR. - a_action.set_lighting(false); - a_action.color4f(0,0,0,1); - - a_action.draw_vertex_array(gl::lines(),m_xyzs); - - //pushes back the filled polygons to avoid z-fighting with lines - a_action.set_polygon_offset(true); - - a_action.color4f(state.m_color); - a_action.set_lighting(state.m_GL_LIGHTING); - } - } - - {tools_vforcit(prims_t,m_primss,itt) { - const prims_t& prims = *itt; - tools_vforcit(tess_prim*,prims,it) { - const tess_prim& item = *(*it); - const std::vector& coords = item.m_coords; - if(coords.empty()) continue; - const std::vector& norms = item.m_norms; - if(norms.size()!=coords.size()) { - a_action.out() << "tools::sg::polyhedron::render :" - << " bad number of normals." - << std::endl; - continue; - } - a_action.draw_vertex_normal_array(item.m_mode,coords,norms); - } - }} - a_action.set_polygon_offset(state.m_GL_POLYGON_OFFSET_FILL); - } - - } else { //not solid - //Same logic as Inventor SoLightModel.model = BASE_COLOR. - a_action.set_lighting(false); // do we want that ? - - if(_id) { - a_action.begin_gsto(_id); - a_action.draw_gsto_v(gl::lines(),m_size/3,0); - a_action.end_gsto(); - } else { - a_action.draw_vertex_array(gl::lines(),m_xyzs); - } - - a_action.set_lighting(state.m_GL_LIGHTING); - } - } - - virtual void bbox(bbox_action& a_action) { - if(touched()) { - update_sg(a_action.out(),lines); - reset_touched(); - } - if(solid.value()) { - tools_vforcit(prims_t,m_primss,itt) { - const prims_t& prims = *itt; - tools_vforcit(tess_prim*,prims,it) { - const tess_prim& item = *(*it); - const std::vector& coords = item.m_coords; - a_action.add_points(coords); - } - } - } else { - a_action.add_points(m_xyzs); - } - } - - virtual void pick(pick_action& a_action) { - if(touched()) { - update_what what = solid.value()?faces:lines; - update_sg(a_action.out(),what); - reset_touched(); - } - if(solid.value()) { - tools_vforcit(prims_t,m_primss,itt) { - const prims_t& prims = *itt; - tools_vforcit(tess_prim*,prims,it) { - const tess_prim& item = *(*it); - const std::vector& coords = item.m_coords; - if(a_action.add__primitive(*this,item.m_mode,coords,true)) return; - } - } - } else { - a_action.add__lines(*this,m_xyzs,true); - } - } -public: - polyhedron() - :parent() - ,ph(hep::polyhedron()) - ,solid(true) - ,reduced_wire_frame(true) - ,enforce_edges(false) - - ,m_tess(0) - { - add_fields(); - } - virtual ~polyhedron(){ - _clear(); - delete m_tess; - } -public: - polyhedron(const polyhedron& a_from) - :parent(a_from) - ,gstos(a_from) - ,ph(a_from.ph) - ,solid(a_from.solid) - ,reduced_wire_frame(a_from.reduced_wire_frame) - ,enforce_edges(a_from.enforce_edges) - - ,m_xyzs(a_from.m_xyzs) - ,m_tess(0) - { - add_fields(); - } - polyhedron& operator=(const polyhedron& a_from){ - parent::operator=(a_from); - gstos::operator=(a_from); - ph = a_from.ph; - solid = a_from.solid; - reduced_wire_frame = a_from.reduced_wire_frame; - enforce_edges = a_from.enforce_edges; - - m_xyzs = a_from.m_xyzs; - - return *this; - } - -public: - enum update_what { - faces = 0, - lines = 1, - faces_and_lines - }; - - void update_sg(std::ostream& a_out,const update_what& a_what) { - //a_out << "debug : tools::sg::polyhedron::update_sg" << std::endl; - - clean_gstos(); //must reset for all render_manager. - - _clear(); - - const hep::polyhedron& sbPolyhedron = ph.value(); - if(sbPolyhedron.GetNoFacets()<=0) { - //a_out << "tools::sg::polyhedron::update_sg : abnormal polyhedron." << std::endl; - return; // Abnormal polyhedron. - } - - if((a_what==faces)||(a_what==faces_and_lines)) { - - std::vector doubles; - - vec3d unitNormal; - vec3d* pV = sbPolyhedron.GetPV(); - - // Assume all facets are convex quadrilaterals : - bool notLastFace; - do { - notLastFace = sbPolyhedron.GetNextUnitNormal(unitNormal); - - doubles.clear(); //begin POLYGON - - bool notLastEdge; - int edgeFlag = 1; - do { - // optimize to avoid copying vec3f. - //notLastEdge = sbPolyhedron.GetNextVertex(vertex,edgeFlag); - int index; - notLastEdge = sbPolyhedron.GetNextVertexIndex(index,edgeFlag); - vec3d* vertex = pV+index; //WARNING : must not be modified ! - - doubles.push_back((*vertex)[0]); - doubles.push_back((*vertex)[1]); - doubles.push_back((*vertex)[2]); - - } while (notLastEdge); - - if(!m_tess) m_tess = new tessellate(a_out); - - m_primss.push_back(prims_t()); - prims_t& prims = m_primss.back(); - - m_tess->do_it(doubles.size()/3,vec_data(doubles),prims); - - m_tess->clear(); - - } while (notLastFace); - } - - if((a_what==lines)||(a_what==faces_and_lines)) { - float pvbx = 0; - float pvby = 0; - float pvbz = 0; - - float pvex,pvey,pvez; - - vec3d unitNormal; - vec3d* pV = sbPolyhedron.GetPV(); - - bool notLastFace; - do { - notLastFace = sbPolyhedron.GetNextUnitNormal(unitNormal); - - // Treat edges : - int edgeFlag = 1; - int prevEdgeFlag = edgeFlag; - bool notLastEdge; - bool firstEdge = true; - do { - int index; - notLastEdge = sbPolyhedron.GetNextVertexIndex(index,edgeFlag); - vec3d* vertex = pV+index; //WARNING : must not be modified ! - - if(!reduced_wire_frame) edgeFlag = 1; - if(firstEdge) { - if(edgeFlag) { - pvbx = (float)(*vertex)[0]; - pvby = (float)(*vertex)[1]; - pvbz = (float)(*vertex)[2]; - } else { - } - firstEdge = false; - prevEdgeFlag = edgeFlag; - } else { - if(edgeFlag!=prevEdgeFlag) { - if(edgeFlag) { // Pass to a visible edge : - pvbx = (float)(*vertex)[0]; - pvby = (float)(*vertex)[1]; - pvbz = (float)(*vertex)[2]; - } else { // Pass to an invisible edge : - pvex = (float)(*vertex)[0]; - pvey = (float)(*vertex)[1]; - pvez = (float)(*vertex)[2]; - - m_xyzs.push_back(pvbx); - m_xyzs.push_back(pvby); - m_xyzs.push_back(pvbz); - - m_xyzs.push_back(pvex); - m_xyzs.push_back(pvey); - m_xyzs.push_back(pvez); - } - prevEdgeFlag = edgeFlag; - } else { - if(edgeFlag) { - pvex = (float)(*vertex)[0]; - pvey = (float)(*vertex)[1]; - pvez = (float)(*vertex)[2]; - - m_xyzs.push_back(pvbx); - m_xyzs.push_back(pvby); - m_xyzs.push_back(pvbz); - - m_xyzs.push_back(pvex); - m_xyzs.push_back(pvey); - m_xyzs.push_back(pvez); - - pvbx = pvex; - pvby = pvey; - pvbz = pvez; - } else { - } - } - } - } while (notLastEdge); - } while (notLastFace); - - } - } - - const std::vector& xyzs() const {return m_xyzs;} - -protected: - void _clear(){ - tools_vforit(prims_t,m_primss,it) raw_clear(*it); - m_primss.clear(); - m_xyzs.clear(); - } - -protected: - std::vector m_xyzs; - - //gluTess - tessellate* m_tess; - std::vector m_primss; - - size_t m_size; - bool m_draw_edges; -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/sg/render_action b/source/externals/g4tools/include/tools/sg/render_action index 282bb670df..4ca4c72a67 100644 --- a/source/externals/g4tools/include/tools/sg/render_action +++ b/source/externals/g4tools/include/tools/sg/render_action @@ -77,17 +77,40 @@ public: virtual sg::render_manager& render_manager() = 0; //sg:: is needed. public: render_action(std::ostream& a_out,unsigned int a_ww,unsigned int a_wh) - :parent(a_out,a_ww,a_wh){} + :parent(a_out,a_ww,a_wh) + ,m_do_transparency(false) + ,m_have_to_do_transparency(false) + {} virtual ~render_action(){} public: render_action(const render_action& a_from) :parent(a_from) + ,m_do_transparency(a_from.m_do_transparency) + ,m_have_to_do_transparency(a_from.m_have_to_do_transparency) {} render_action& operator=(const render_action& a_from){ parent::operator=(a_from); + m_do_transparency = a_from.m_do_transparency; + m_have_to_do_transparency = a_from.m_have_to_do_transparency; return *this; } public: + void set_do_transparency(bool a_value) {m_do_transparency = a_value;} + bool do_transparency() const {return m_do_transparency;} + void set_have_to_do_transparency(bool a_value) {m_have_to_do_transparency = a_value;} + bool have_to_do_transparency() const {return m_have_to_do_transparency;} + + bool have_to_render() { + bool transparent = state().m_color.a()!=1?true:false; + if(transparent) { + if(m_do_transparency) return true; + m_have_to_do_transparency = true; + return false; + } + if(m_do_transparency) return false; + return true; + } + void load_matrices_to_identity() { load_proj_matrix(m_identity); load_model_matrix(m_identity); @@ -288,6 +311,9 @@ public: } a_out << "dump_vertex_array_xy : end." << std::endl; } +protected: + bool m_do_transparency; + bool m_have_to_do_transparency; }; }} diff --git a/source/externals/g4tools/include/tools/sg/search b/source/externals/g4tools/include/tools/sg/search new file mode 100644 index 0000000000..43149088a8 --- /dev/null +++ b/source/externals/g4tools/include/tools/sg/search @@ -0,0 +1,150 @@ +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +// +// Helper functions to search node(s) in a scene graph. +// + +#ifndef tools_sg_search +#define tools_sg_search + +#include "search_action" +#include "node" + +namespace tools { +namespace sg { + +template +inline NODE* find_first_node_of_class(std::ostream& a_out,node& a_from) { + search_action action(a_out); + action.reset(); + action.set_what(search_action::search_node_of_class); + action.set_stop_at_first(true); + action.set_class(NODE::s_class()); + a_from.search(action); + const std::vector& _objs = action.objs(); + if(_objs.empty()) return 0; + return (NODE*)_objs[0]; +} + +inline node* find_first_node_with_class(std::ostream& a_out,node& a_from,const std::string& a_class) { + search_action action(a_out); + action.reset(); + action.set_what(search_action::search_node_of_class); + action.set_stop_at_first(true); + action.set_class(a_class); + a_from.search(action); + const std::vector& _objs = action.objs(); + if(_objs.empty()) return 0; + return (node*)_objs[0]; +} + +}} + +#include "path" + +namespace tools { +namespace sg { + +inline const path_t& find_path(search_action& a_action,node& a_from,node& a_node,bool a_verbose) { + a_action.reset(); + a_action.set_what(search_action::search_path_to_node); + a_action.set_node(&a_node); + a_from.search(a_action); + if(!a_action.done()) { + if(a_verbose) { + a_action.out() << "tools::sg::find_path :" + << " not found node of class " << a_node.s_cls() + << " from head node of class " << a_from.s_cls() + << std::endl; + } + a_action.clear_path(); + return a_action.path(); + } + if(a_verbose) { + a_action.out() << "tools::sg::find_path :" + << " found node of class " << a_node.s_cls() + << " from head node of class " << a_from.s_cls() + << std::endl; + } + const path_t& path = a_action.path(); + if(path.empty()) { + if(a_verbose) { + a_action.out() << "tools::sg::find_path :" + << " node has no path !" + << std::endl; + } + return path; + } + if(&a_node!=path[path.size()-1]) { + a_action.out() << "tools::sg::find_path :" + << " node / path tail mismatch !" + << " node " << a_node.s_cls() + << " tail " << path[path.size()-1]->s_cls() + << std::endl; + a_action.clear_path(); + return a_action.path(); + } + return path; +} + +inline const search_action::paths_t& find_paths(search_action& a_action,node& a_from,const std::string& a_class){ + a_action.reset(); + a_action.set_what(search_action::search_path_to_node_of_class); + a_action.set_class(a_class); + a_from.search(a_action); + return a_action.paths(); +} + +template +inline const search_action::paths_t& find_paths(search_action& a_action,node& a_from){ + a_action.reset(); + a_action.set_what(search_action::search_path_to_node_of_class); + a_action.set_class(NODE::s_class()); + a_from.search(a_action); + return a_action.paths(); +} + +template +inline NODE* find_ancestor(std::ostream& a_out,node& a_from,node& a_node,bool a_verbose) { + search_action action(a_out); + return rfind(find_path(action,a_from,a_node,a_verbose)); +} + +template +inline CONTAINER* find_container(std::ostream& a_out,node& a_from,node& a_node,bool a_verbose) { + search_action action(a_out); + return container(find_path(action,a_from,a_node,a_verbose)); +} + +template +inline NODE* search_node(std::ostream& a_out,node& a_from) { + search_action sa(a_out); + const paths_t& paths = find_paths(sa,a_from); + tools_vforcit(path_t,paths,it) { + NODE* _node = tail(*it); + if(_node) return _node; + } + return 0; +} + +template +inline SELECTABLE* search_selectable(std::ostream& a_out,node& a_from) { + search_action sa(a_out); + const paths_t& paths = find_paths(sa,a_from); + tools_vforcit(path_t,paths,it) { + SELECTABLE* _node = tail(*it); + if(_node && _node->border_visible.value()) return _node; + } +/* + tools_vforcit(sg::path_t,paths,it) { + SELECTABLE* _node = sg::tail(*it); + if(_node) return _node; + } +*/ + return 0; +} + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/sg/set_plotter_camera b/source/externals/g4tools/include/tools/sg/set_plotter_camera deleted file mode 100644 index e29e790d57..0000000000 --- a/source/externals/g4tools/include/tools/sg/set_plotter_camera +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_sg_set_plotter_camera -#define tools_sg_set_plotter_camera - -#include "plotter" -#include "ortho" - -namespace tools { -namespace sg { - -inline void set_plotter_camera(float a_XSIZ,float a_YSIZ,float a_ZSIZ, - plotter& a_plotter,ortho& a_camera,unsigned int a_ww,unsigned int a_wh) { - if(!a_ww || !a_wh) return; - - a_plotter.width.value(a_XSIZ); - a_plotter.height.value(a_YSIZ); - a_plotter.depth.value(a_ZSIZ); - - enum plotter_viewport_mapping { - pvp_adjust_viewport, - pvp_leave_alone - }; - - plotter_viewport_mapping pvp = pvp_adjust_viewport; - //plotter_viewport_mapping pvp = pvp_leave_alone; - - typedef plotter::shape_type st_t; - st_t plotter_shape = plotter::xy; - - float aspect = float(a_ww)/float(a_wh); - - {float XSIZ = a_plotter.width.value(); - float YSIZ = a_plotter.height.value(); - if((plotter_shape==plotter::xy) && - (pvp==pvp_adjust_viewport)) { - // Adjust the plotter XSIZ and YSIZ so that YSIZ matches viewport height - // and plotter XSIZ matches viewport width. - // It it the CERN-ROOT and osc-plot logic. - if(aspect>=1) { //w>h - // camera must match in height YSIZ. Adjust XSIZ. - a_plotter.width.value(YSIZ * aspect); - } else { - // camera must match in width XSIZ. Adjust YSIZ. - a_plotter.height.value(XSIZ / aspect); - } - }} - - {float camera_znear = 0; - float camera_zfar = 0; - float camera_z_pos = 0; - // if camera ortho : - float camera_height = 0; - - float XSIZ = a_plotter.width.value(); - float YSIZ = a_plotter.height.value(); - float z = 4 * a_plotter.depth.value(); - camera_z_pos = z; - camera_znear = 0.01F*z; - camera_zfar = 100*z; - //cam ortho : - if(plotter_shape==plotter::xyz) { - camera_height = YSIZ; - } else { - if(pvp==pvp_leave_alone) { - // Adjust camera so that plotter XSIZ/YSIZ be not distorded. - // If viewport aspect ratio > plotter aspect ratio - // the plotter YSIZ matches the viewport height. If not - // it is the plotter XSIZ that will match the viewport width. - // It is the PAW logic for one region. - float plotterAspect = XSIZ/YSIZ; - if(aspect { - typedef sf_vec _parent; - TOOLS_HEADER(sf_vec2f,tools::sg::sf_vec2f,_parent) -public: - sf_vec2f():parent(){} - sf_vec2f(const vec2f& a_v):parent(a_v){} - virtual ~sf_vec2f(){} -public: - sf_vec2f(const sf_vec2f& a_from):parent(a_from){} - sf_vec2f& operator=(const sf_vec2f& a_from){ - parent::operator=(a_from); - return *this; - } -public: - sf_vec2f& operator+=(const vec2f& a_value) {parent::operator+=(a_value);return *this;} -public: //for iv2sg - void setValue(const vec2f& a_v) {value(a_v);} - void setValue(float a_0,float a_1) {value(vec2f(a_0,a_1));} -}; - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/sg/tessellate b/source/externals/g4tools/include/tools/sg/tessellate deleted file mode 100644 index 0a101bf16d..0000000000 --- a/source/externals/g4tools/include/tools/sg/tessellate +++ /dev/null @@ -1,532 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_sg_tessellate -#define tools_sg_tessellate - -//#include "../tessellate" - -#include - -#include "../glprims" - -#ifdef TOOLS_MEM -#include "../mem" -#include "../S_STRING" -#endif - -namespace tools { -namespace sg { -class tess_prim { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::sg::tess_prim) -#endif -public: - tess_prim() - :m_mode(gl::triangles()) - ,m_size(0) - ,m_pos_coords(0) - ,m_pos_norms(0) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - virtual ~tess_prim(){ -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -public: - tess_prim(const tess_prim& a_from) - :m_mode(a_from.m_mode) - ,m_coords(a_from.m_coords) - ,m_norms(a_from.m_norms) - ,m_size(a_from.m_size) - ,m_pos_coords(a_from.m_pos_coords) - ,m_pos_norms(a_from.m_pos_norms) - { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - tess_prim& operator=(const tess_prim& a_from){ - if(&a_from==this) return *this; - m_mode = a_from.m_mode; - m_coords = a_from.m_coords; - m_norms = a_from.m_norms; - m_size = a_from.m_size; - m_pos_coords = a_from.m_pos_coords; - m_pos_norms = a_from.m_pos_norms; - return *this; - } -public: - gl::mode_t m_mode; - std::vector m_coords; - std::vector m_norms; - //for gsto : - size_t m_size; - typedef size_t bufpos; - bufpos m_pos_coords; - bufpos m_pos_norms; -}; -}} - -#include "../vdata" -#include "../forit" -#include "primitive_visitor" - -#include -#include //sqrt - -#ifdef TOOLS_MEM -#include "../S_STRING" -#include "../mem" -#endif - -#include "../glutess/glutess" - -namespace tools { -namespace sg { - -class tessellate { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::sg::tessellate); -#endif -public: - tessellate(std::ostream& a_out):m_out(a_out),m_tobj(0) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - m_tobj = gluNewTess(); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_BEGIN_DATA, (Func)begin_cbk); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_END_DATA, (Func)end_cbk); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_VERTEX_DATA, (Func)vertex_cbk); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_COMBINE_DATA,(Func)combine_cbk); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_ERROR_DATA, (Func)error_cbk); - //set winding rule to positive => no holes - ::gluTessProperty(m_tobj,(GLUenum)GLU_TESS_WINDING_RULE,GLU_TESS_WINDING_POSITIVE); - //m_out << "tools::sg::tessellate::tessellate :" - // << " GL_TRIANGLE_STRIP " << GL_TRIANGLE_STRIP - // << " GL_TRIANGLE_FAN " << GL_TRIANGLE_FAN - // << " GL_TRIANGLES " << GL_TRIANGLES - // << std::endl; - } - virtual ~tessellate(){ - ::gluDeleteTess(m_tobj); - _clear(); -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -public: - tessellate(const tessellate& a_from):m_out(a_from.m_out),m_tobj(0) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - m_tobj = gluNewTess(); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_BEGIN_DATA, (Func)begin_cbk); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_END_DATA, (Func)end_cbk); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_VERTEX_DATA, (Func)vertex_cbk); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_COMBINE_DATA,(Func)combine_cbk); - ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_ERROR_DATA, (Func)error_cbk); - //set winding rule to positive => no holes - ::gluTessProperty(m_tobj,(GLUenum)GLU_TESS_WINDING_RULE,GLU_TESS_WINDING_POSITIVE); - } - tessellate& operator=(const tessellate& a_from){ - if(&a_from==this) return *this; - _clear(); - return *this; - } -public: - typedef std::vector prims_t; - void do_it(size_t a_npt,const double* a_contour,prims_t& a_prims){ - ::gluTessBeginPolygon(m_tobj,this); - ::gluTessBeginContour(m_tobj); - double* pos = (double*)a_contour; - for(size_t i=0;ipush_back(new tess_prim()); - tess_prim& prim = *(self.m_prims->back()); - prim.m_mode = a_which; - prim.m_coords.reserve(12); //4 points. - prim.m_norms.reserve(12); - - self.m_coords = &prim.m_coords; - - //::printf("tools::sg::tessellate::begin_cbk : %d : STRIP %d FAN %d TRIS %d\n", - // a_which,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN,GL_TRIANGLES); - } - - static void GLUAPIENTRY vertex_cbk(void* a_vertex,void* a_this) { - tessellate& self = *((tessellate*)a_this); - double* vertex = (double*)a_vertex; - self.m_coords->push_back(float(vertex[0])); - self.m_coords->push_back(float(vertex[1])); - self.m_coords->push_back(float(vertex[2])); - } - - typedef float _vec3f[3]; - - static void GLUAPIENTRY end_cbk(void* a_this){ - tessellate& self = *((tessellate*)a_this); - - tess_prim& prim = *(self.m_prims->back()); - - //self.m_out << "tools::sg::tessellate::end_cbk : " - // << prim.m_coords.size()/3 << std::endl; - - add_prm aprm(self.m_out,prim.m_norms); - - float* data = vec_data(prim.m_coords); - - bool ok = true; - if(prim.m_mode==gl::triangles()) { - if(!aprm.add_triangles(prim.m_coords.size(),data,false)) { - self.m_out << "tools::sg::tessellate::end_cbk : " - << " add_triangles failed." - << std::endl; - ok = false; - } - } else if(prim.m_mode==gl::triangle_strip()) { - if(!aprm.add_triangle_strip(prim.m_coords.size(),data,false)){ - self.m_out << "tools::sg::tessellate::end_cbk : " - << " add_triangle_strip failed." - << std::endl; - ok = false; - } - - } else if(prim.m_mode==gl::triangle_fan()) { - if(!aprm.add_triangle_fan(prim.m_coords.size(),data,false)) { - self.m_out << "tools::sg::tessellate::end_cbk : " - << " add_triangle_fan failed." - << std::endl; - ok = false; - } - } else { - self.m_out << "tools::sg::tessellate::end_cbk : " - << " mode " << prim.m_mode << " not yet treated." - << std::endl; - ok = false; - } - if(!ok) { - size_t num = prim.m_coords.size(); - self.m_out << "tools::sg::tessellate::end_cbk :" - << " primitive anomaly." - << " num points " << num - << " mode " << prim.m_mode - << " (TRIANGLES=4, STRIP=5, FAN=6)." - << std::endl; - float* pos = vec_data(prim.m_coords); - for(size_t ipt=0;iptsetError(true); - } - - double* add_combine_vec3d(double a_x,double a_y,double a_z) { - double* v = 0; - if(m_combine_trids_num>=m_combine_trids.size()) { - v = new double[3]; - m_combine_trids.push_back(v); - } else { - v = m_combine_trids[m_combine_trids_num]; - } - m_combine_trids_num++; - - v[0] = a_x; - v[1] = a_y; - v[2] = a_z; - - return v; - } - - void _clear() { - tools_vforit(double*,m_combine_trids,it) delete [] *it; - m_combine_trids.clear(); - m_combine_trids_num = 0; - } - -protected: - class add_prm : public primitive_visitor { - protected: - virtual bool project(float&,float&,float&,float&) {return true;} - virtual bool add_point(float,float,float,float) {return false;} - virtual bool add_point(float,float,float,float, - float,float,float,float) {return false;} - virtual bool add_line(float,float,float,float, - float,float,float,float) {return false;} - virtual bool add_line(float,float,float,float,float,float,float,float, - float,float,float,float,float,float,float,float) { - return false; - } - - virtual bool add_triangle(float a_p1x,float a_p1y,float a_p1z,float, - float a_p2x,float a_p2y,float a_p2z,float, - float a_p3x,float a_p3y,float a_p3z,float){ - - float vx = a_p2x-a_p1x; - float vy = a_p2y-a_p1y; - float vz = a_p2z-a_p1z; - - float wx = a_p3x-a_p2x; - float wy = a_p3y-a_p2y; - float wz = a_p3z-a_p2z; - - // vx wx - // vy ^ wy - // vz wz - float cx = vy*wz-vz*wy; - float cy = vz*wx-vx*wz; - float cz = vx*wy-vy*wx; - - float len = (float)::sqrt(cx*cx + cy*cy + cz*cz); - if(!len) { - //m_out << "tools::sg::tessellate::add_prm : null normal." - // << std::endl; - } else { - cx /= len; - cy /= len; - cz /= len; - } - - if(m_mode==gl::triangles()) { - - m_norms.push_back(cx); - m_norms.push_back(cy); - m_norms.push_back(cz); - - m_norms.push_back(cx); - m_norms.push_back(cy); - m_norms.push_back(cz); - - m_norms.push_back(cx); - m_norms.push_back(cy); - m_norms.push_back(cz); - - } else if( (m_mode==gl::triangle_strip()) || - (m_mode==gl::triangle_fan()) ){ - - if(m_norms.empty()) { //startup : three vertices. - m_norms.push_back(cx); - m_norms.push_back(cy); - m_norms.push_back(cz); - - m_norms.push_back(cx); - m_norms.push_back(cy); - m_norms.push_back(cz); - - m_norms.push_back(cx); - m_norms.push_back(cy); - m_norms.push_back(cz); - - } else { //one vertex : - m_norms.push_back(cx); - m_norms.push_back(cy); - m_norms.push_back(cz); - } - } - - return true; - } - - virtual bool add_triangle(float a_p1x,float a_p1y,float a_p1z,float a_p1w, - float,float,float,float, - float a_p2x,float a_p2y,float a_p2z,float a_p2w, - float,float,float,float, - float a_p3x,float a_p3y,float a_p3z,float a_p3w, - float,float,float,float){ - return add_prm::add_triangle(a_p1x,a_p1y,a_p1z,a_p1w, - a_p2x,a_p2y,a_p2z,a_p2w, - a_p3x,a_p3y,a_p3z,a_p3w); - } - - virtual bool project_normal(float& a_x,float& a_y,float& a_z) { - (void)a_x;(void)a_y;(void)a_z; - return true; - } - virtual bool add_point_normal(float a_x,float a_y,float a_z,float a_w, - float a_nx,float a_ny,float a_nz) { - (void)a_x;(void)a_y;(void)a_z;(void)a_w; - (void)a_nx;(void)a_ny;(void)a_nz; - return false; - } - virtual bool add_point_normal(float a_x,float a_y,float a_z,float a_w, - float a_nx,float a_ny,float a_nz, - float a_r,float a_g,float a_b,float a_a) { - (void)a_x;(void)a_y;(void)a_z;(void)a_w; - (void)a_nx;(void)a_ny;(void)a_nz; - (void)a_r;(void)a_g;(void)a_b;(void)a_a; - return false; - } - virtual bool add_line_normal(float a_bx,float a_by,float a_bz,float a_bw, - float a_bnx,float a_bny,float a_bnz, - float a_ex,float a_ey,float a_ez,float a_ew, - float a_enx,float a_eny,float a_enz) { - (void)a_bx;(void)a_by;(void)a_bz;(void)a_bw; - (void)a_bnx;(void)a_bny;(void)a_bnz; - (void)a_ex;(void)a_ey;(void)a_ez;(void)a_ew; - (void)a_enx;(void)a_eny;(void)a_enz; - return false; - } - virtual bool add_line_normal(float a_bx,float a_by,float a_bz,float a_bw, - float a_bnx,float a_bny,float a_bnz, - float a_br,float a_bg,float a_bb,float a_ba, - float a_ex,float a_ey,float a_ez,float a_ew, - float a_enx,float a_eny,float a_enz, - float a_er,float a_eg,float a_eb,float a_ea){ - (void)a_bx;(void)a_by;(void)a_bz;(void)a_bw; - (void)a_bnx;(void)a_bny;(void)a_bnz; - (void)a_br;(void)a_bg;(void)a_bb;(void)a_ba; - (void)a_ex;(void)a_ey;(void)a_ez;(void)a_ew; - (void)a_enx;(void)a_eny;(void)a_enz; - (void)a_er;(void)a_eg;(void)a_eb;(void)a_ea; - return false; - } - virtual bool add_triangle_normal( - float a_p1x,float a_p1y,float a_p1z,float a_p1w, - float a_n1x,float a_n1y,float a_n1z, - float a_p2x,float a_p2y,float a_p2z,float a_p2w, - float a_n2x,float a_n2y,float a_n2z, - float a_p3x,float a_p3y,float a_p3z,float a_p3w, - float a_n3x,float a_n3y,float a_n3z) { - add_triangle(a_p1x,a_p1y,a_p1z,a_p1w, - a_p2x,a_p2y,a_p2z,a_p2w, - a_p3x,a_p3y,a_p3z,a_p3w); - //m_this.m_triangles.add_normal(a_n1x,a_n1y,a_n1z); - //m_this.m_triangles.add_normal(a_n2x,a_n2y,a_n2z); - //m_this.m_triangles.add_normal(a_n3x,a_n3y,a_n3z); - (void)a_n1x;(void)a_n1y;(void)a_n1z; - (void)a_n2x;(void)a_n2y;(void)a_n2z; - (void)a_n3x;(void)a_n3y;(void)a_n3z; - return true; - } - virtual bool add_triangle_normal( - float a_p1x,float a_p1y,float a_p1z,float a_p1w, - float a_n1x,float a_n1y,float a_n1z, - float a_r1,float a_g1,float a_b1,float a_a1, - float a_p2x,float a_p2y,float a_p2z,float a_p2w, - float a_n2x,float a_n2y,float a_n2z, - float a_r2,float a_g2,float a_b2,float a_a2, - float a_p3x,float a_p3y,float a_p3z,float a_p3w, - float a_n3x,float a_n3y,float a_n3z, - float a_r3,float a_g3,float a_b3,float a_a3){ - add_triangle(a_p1x,a_p1y,a_p1z,a_p1w, - a_r1,a_g1,a_b1,a_a1, - a_p2x,a_p2y,a_p2z,a_p2w, - a_r2,a_g2,a_b2,a_a2, - a_p3x,a_p3y,a_p3z,a_p3w, - a_r3,a_g3,a_b3,a_a3); - //m_this.m_triangles.add_normal(a_n1x,a_n1y,a_n1z); - //m_this.m_triangles.add_normal(a_n2x,a_n2y,a_n2z); - //m_this.m_triangles.add_normal(a_n3x,a_n3y,a_n3z); - (void)a_n1x;(void)a_n1y;(void)a_n1z; - (void)a_n2x;(void)a_n2y;(void)a_n2z; - (void)a_n3x;(void)a_n3y;(void)a_n3z; - return true; - } - public: - add_prm(std::ostream& a_out,std::vector& a_norms) - :m_out(a_out) - ,m_norms(a_norms) - {} - virtual ~add_prm(){} - public: - add_prm(const add_prm& a_from):primitive_visitor(a_from),m_out(a_from.m_out),m_norms(a_from.m_norms) {} - add_prm& operator=(const add_prm& a_from){ - primitive_visitor::operator=(a_from); - return *this; - } - protected: - std::ostream& m_out; - public: - std::vector& m_norms; - }; - - -protected: - std::ostream& m_out; - GLUtesselator* m_tobj; - std::vector* m_coords; - std::vector m_combine_trids; - size_t m_combine_trids_num; - prims_t* m_prims; -}; - -/* -class tessellate_factory { -#ifdef TOOLS_MEM - TOOLS_SCLASS(tools::sg::tessellate_factory); -#endif -public: - tessellate_factory(){ -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - virtual ~tessellate_factory(){ -#ifdef TOOLS_MEM - mem::decrement(s_class().c_str()); -#endif - } -public: - tessellate_factory(const tessellate_factory& a_from) { -#ifdef TOOLS_MEM - mem::increment(s_class().c_str()); -#endif - } - tessellate_factory& operator=(const tessellate_factory&){ - return *this; - } -public: - virtual tessellate* create(std::ostream& a_out) { - return new tessellate(a_out); - } -}; -*/ - -}} - -#endif - diff --git a/source/externals/g4tools/include/tools/sg/text_freetype b/source/externals/g4tools/include/tools/sg/text_freetype index b7586be639..01da7089e7 100644 --- a/source/externals/g4tools/include/tools/sg/text_freetype +++ b/source/externals/g4tools/include/tools/sg/text_freetype @@ -875,7 +875,7 @@ protected: ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_COMBINE_DATA,(Func)combine_cbk); ::gluTessCallback(m_tobj,(GLUenum)GLU_TESS_ERROR_DATA, (Func)error_cbk); #else - // NOTE : the gluTessCallback_() functions are inlib/glutess specific. + // NOTE : the gluTessCallback_() functions are tools/glutess specific. // They had been introduced to avoid g++-8.1.0 warnings : // warnings : cast between incompatible function types. ::gluTessCallback_GLU_TESS_BEGIN_DATA (m_tobj,begin_cbk); @@ -1775,26 +1775,45 @@ protected: ::FT_Done_Face(m_face); m_face = 0; } + if(font.value().empty()) { a_out << "tools::sg::text_freetype::load_face :" - << " no font file given." + << " no font given." << std::endl; return; } - std::string file; - - //if(tools::file::exists(font.value())) { //look in current directory. - // file = font.value(); //ok - //} else if(!inlib::find_with_dirs(a_out,font_dirs.values(),font.value(),file,false)) { - if(!tools::find_with_env(a_out,s_TOOLS_FONT_PATH(),font.value(),file,false)) { + // look for embedded fonts: + {unsigned int size; + const unsigned char* buffer; + if(parent::find_embedded_font(font.value(),size,buffer)) { + FT_Error error = + ::FT_New_Memory_Face(m_library,(const FT_Byte*)buffer,(FT_Long)size,0,&m_face); + if(error) { a_out << "tools::sg::text_freetype::load_face :" - << " font file not found for font " - << tools::sout(font.value()) << "." + << " FT_New_Memory_Face : error : " << serror(error) << "." << std::endl; + m_face = 0; return; } - //} + if(m_verbose) a_out << "tools::sg::text_freetype::load_face : load embedded font ok." << std::endl; + return; + }} + + std::string file; + + if(parent::find_font_with_finders(font.value(),file)) { + } else { + tools::find_with_env(a_out,s_TOOLS_FONT_PATH(),font.value(),file,false); + } + + if(file.empty()) { + a_out << "tools::sg::text_freetype::load_face :" + << " font file not found for font " + << tools::sout(font.value()) << "." + << std::endl; + return; + } if(m_verbose) { a_out << "tools::sg::text_freetype::load_face :" @@ -2128,7 +2147,7 @@ protected: FT_Library m_library; FT_Face m_face; unsigned short m_encoding_offset; - bool m_verbose; //append _ to avoid clash with inlib/sg/guib::m_verbose + bool m_verbose; //append _ to avoid clash with tools/sg/guib::m_verbose //////////////////////////////////////////////////////// /// outline //////////////////////////////////////////// //////////////////////////////////////////////////////// @@ -2174,4 +2193,5 @@ protected: }} + #endif diff --git a/source/externals/g4tools/include/tools/sg/text_freetype_marker b/source/externals/g4tools/include/tools/sg/text_freetype_marker index 118d03af02..3af7c7b624 100644 --- a/source/externals/g4tools/include/tools/sg/text_freetype_marker +++ b/source/externals/g4tools/include/tools/sg/text_freetype_marker @@ -35,7 +35,14 @@ public: float zz = 0; a_action.load_matrices_to_identity(); - + + {tools::mat4f _mtx; + _mtx.set_translate(x,y,zz); + if(!m_bitmaps.size()) { + if(state.m_ww) _mtx.mul_scale(float(state.m_wh)/float(state.m_ww),1,1); + } + a_action.load_model_matrix(_mtx);} + /////////////////////////////////////////////////////////// /// lines ///////////////////////////////////////////////// /////////////////////////////////////////////////////////// @@ -45,11 +52,7 @@ public: size_t num = item.second; if(!num) continue; const float* data = tools::vec_data(m_xys)+pos; - float* vp = _trans3(num,data,x,y,zz); //have an extra z for Windows GL. - if(vp) { - a_action.draw_vertex_array(tools::gl::line_strip(),num*3,vp); - delete [] vp; - } + a_action.draw_vertex_array_xy(tools::gl::line_strip(),num*2,data); }} /////////////////////////////////////////////////////////// @@ -65,21 +68,13 @@ public: // << std::endl; const float* data = tools::vec_data(m_xys)+pos; - float* vp = _trans3(num,data,x,y,zz); //have an extra z for Windows GL. - if(vp) { - a_action.draw_vertex_array((*it).first,num*3,vp); - delete [] vp; - } + a_action.draw_vertex_array_xy((*it).first,num*2,data); }} /////////////////////////////////////////////////////////// /// bitmap //////////////////////////////////////////////// /////////////////////////////////////////////////////////// if(m_bitmaps.size()) { - tools::mat4f _m; - _m.set_translate(x,y,zz); - a_action.load_model_matrix(_m); - #if defined(ANDROID) /*|| TARGET_OS_IPHONE*/ // we do not have transparent texture here (see also gl/tex_img() that does img/4-bytes => img/3-bytes) : {tools::sg::state& _state = a_action.state(); @@ -106,6 +101,8 @@ public: } virtual void pick(tools::sg::pick_action& a_action) { + const tools::sg::state& state = a_action.state(); + {bool _char_height_touched = char_height_touched(a_action.state()); if(touched()||_char_height_touched) { update_sg(a_action.out(),font.touched(),a_action.state()); @@ -118,10 +115,14 @@ public: a_action.set_matrices_to_identity(); + a_action.model_matrix().set_translate(x,y,zz); + if(!m_bitmaps.size()) { + if(state.m_ww) a_action.model_matrix().mul_scale(float(state.m_wh)/float(state.m_ww),1,1); + } + /////////////////////////////////////////////////////////// /// lines ///////////////////////////////////////////////// /////////////////////////////////////////////////////////// - {tools_vforcit(line_t,m_lines,it) { const line_t& item = *it; size_t pos = item.first; @@ -166,10 +167,9 @@ public: /// bitmap //////////////////////////////////////////////// /////////////////////////////////////////////////////////// if(m_bitmaps.size()) { - a_action.model_matrix().set_translate(x,y,zz); m_bitmaps.pick(a_action); } - + /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// @@ -245,18 +245,6 @@ protected: height.value_no_cmp(old_height); } - float* _trans3(size_t a_num,const float* a_data,float a_x,float a_y,float a_z) { - float* vp = new float[a_num*3]; - if(!vp) return 0; - float* pos = vp; - float* pda = (float*)a_data; - for(size_t index=0;index::iterator it; - for(it=segs.begin();it!=segs.end();) { - *it += x;it++; //Android don't like *it++. - *it += y;it++; - }} + + {tools::mat4f _mtx; + _mtx.set_translate(x,y,0); + if(state.m_ww) _mtx.mul_scale(float(state.m_wh)/float(state.m_ww),1,1); + a_action.load_proj_matrix(_mtx);} + a_action.draw_vertex_array_xy(gl::lines(),segs); a_action.load_matrices_from_state(); @@ -65,12 +65,10 @@ public: get_segments(segs); a_action.set_matrices_to_identity(); - - {std::vector::iterator it; - for(it=segs.begin();it!=segs.end();) { - *it += x;it++; - *it += y;it++; - }} + + {tools::mat4f& _mtx = a_action.model_matrix(); + _mtx.set_translate(x,y,0); + if(state.m_ww) _mtx.mul_scale(float(state.m_wh)/float(state.m_ww),1,1);} a_action.add__lines_xy(*this,segs); diff --git a/source/externals/g4tools/include/tools/sg/write_paper b/source/externals/g4tools/include/tools/sg/write_paper new file mode 100644 index 0000000000..159fa77b53 --- /dev/null +++ b/source/externals/g4tools/include/tools/sg/write_paper @@ -0,0 +1,128 @@ +// Copyright (C) 2018, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +#ifndef tools_sg_write_paper +#define tools_sg_write_paper + +// To traverse a scene graph and "export" it at various file formats +// by using various rendering actions. +// For example by using gl2ps_action, handle the formats: +// gl2ps_eps: gl2ps producing eps +// gl2ps_ps: gl2ps producing ps +// gl2ps_pdf: gl2ps producing pdf +// gl2ps_svg: gl2ps producing svg +// gl2ps_tex: gl2ps producing tex +// gl2ps_pgf: gl2ps producing pgf +// By using the zb_action (zb for zbuffer): +// zb_ps: tools::sg offscreen zbuffer put in a PostScript file. +// zb_png: zbuffer put in a png file. It needs to provide a "png_writer" function. +// zb_jpeg: zbuffer put in a jpeg file. It needs to provide a "jpeg_writer" function. + +#include "zb_action" +#include "node" +#include "gl2ps_action" +#include "../wps" +#include "../typedefs" +#include "../touplow" + +namespace tools { +namespace sg { + +typedef bool (*png_writer)(std::ostream&,const std::string&, + unsigned char*,unsigned int,unsigned int,unsigned int); + +typedef bool (*jpeg_writer)(std::ostream&,const std::string&, + unsigned char*,unsigned int,unsigned int,unsigned int,int); + +inline bool write_paper(std::ostream& a_out, + gl2ps_manager& a_gl2ps_mgr,zb_manager& a_zb_mgr, + png_writer a_png_writer,jpeg_writer a_jpeg_writer, + float a_back_r,float a_back_g,float a_back_b,float a_back_a, + node& a_scene_graph, + unsigned int a_width,unsigned int a_height, + const std::string& a_file,const std::string& a__format) { + if(!a_width || !a_height) return false; + std::string a_format = a__format; + tolowercase(a_format); //handle legacy. + int gl2ps_format; + if(s2format(a_format,gl2ps_format)) { + gl2ps_action action(a_gl2ps_mgr,a_out,a_width,a_height); + action.clear_color(a_back_r,a_back_g,a_back_b,a_back_a); + if(!action.open(a_file,gl2ps_format)) return false; + a_scene_graph.render(action); + action.close(); + return true; + } + + zb_action action(a_zb_mgr,a_out,a_width,a_height); + action.zbuffer().clear_color_buffer(0); + action.add_color(a_back_r,a_back_g,a_back_b,a_back_a); + action.zbuffer().clear_depth_buffer(); + a_scene_graph.render(action); + + if((a_format=="zb_ps")||(a_format=="inzb_ps")) { + wps wps(a_out); + if(!wps.open_file(a_file)) { + a_out << "tools::sg::write_paper : can't open " << a_file << "." << std::endl; + return false; + } + wps.PS_BEGIN_PAGE(); + wps.PS_PAGE_SCALE(float(a_width),float(a_height)); + wps.PS_IMAGE(a_width,a_height,wps::rgb_4,zb_action::get_rgb,&action); + wps.PS_END_PAGE(); + wps.close_file(); + return true; + } + + if((a_format=="zb_png")||(a_format=="inzb_png")) { + if(!a_png_writer) { + a_out << "tools::sg::write_paper : no png_writer given." << std::endl; + return false; + } + + size_t sz; + unsigned char* buffer = action.get_rgbas(sz); + if(!buffer) { + a_out << "tools::sg::write_paper : can't get rgba image." << std::endl; + return false; + } + + if(!a_png_writer(a_out,a_file,buffer,a_width,a_height,4)) { + a_out << "tools::sg::write_paper : tools::png::write() failed." << std::endl; + delete [] buffer; + return false; + } + delete [] buffer; + return true; + } + + if((a_format=="zb_jpeg")||(a_format=="zb_jpg")||(a_format=="inzb_jpeg")) { + + if(!a_jpeg_writer) { + a_out << "tools::sg::write_paper : no jpeg_writer given." << std::endl; + return false; + } + + size_t sz; + unsigned char* buffer = action.get_rgbs(sz); + if(!buffer) { + a_out << "tools::sg::write_paper : can't get rgb image." << std::endl; + return false; + } + + if(!a_jpeg_writer(a_out,a_file,buffer,a_width,a_height,3,100)) { + a_out << "tools::sg::write_paper : tools::jpeg::write() failed." << std::endl; + delete [] buffer; + return false; + } + delete [] buffer; + return true; + } + + a_out << "tools::sg::write_paper : unknown format " << a_format << std::endl; + return false; +} + +}} + +#endif diff --git a/source/externals/g4tools/include/tools/std_system b/source/externals/g4tools/include/tools/std_system deleted file mode 100644 index ce797a9dc0..0000000000 --- a/source/externals/g4tools/include/tools/std_system +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_std_system -#define tools_std_system - -#include -#include - -#if defined(__APPLE__) -#include -#endif - -namespace tools { - -inline int std_system(std::ostream& a_out,const std::string& a_string) { -#if TARGET_OS_IPHONE - a_out << "tools::std_system : system() not available on iOS. Can't execute " << sout(a_string) << "." << std::endl; - return EXIT_FAILURE; -#else - return ::system(a_string.c_str()); - (void)a_out; -#endif -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/svalues b/source/externals/g4tools/include/tools/svalues deleted file mode 100644 index bfff7e6e6b..0000000000 --- a/source/externals/g4tools/include/tools/svalues +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_svalues -#define tools_svalues - -// See also snums. - -#include "sto" -#include - -namespace tools { - -template -inline bool values(const std::string& a_string,const std::string& a_sep,bool a_take_empty,std::vector& a_values){ - // same logic as words() function. - - a_values.clear(); - if(a_string.empty()) return true; - std::string::size_type lim = (a_take_empty?0:1); - if(a_sep.empty()) { - T value; - if(!to(a_string,value)) { - a_values.clear(); - return false; - } - a_values.push_back(value); - } else { - std::string::size_type l = a_string.length(); - std::string::size_type llimiter = a_sep.length(); - std::string::size_type pos = 0; - while(true) { - std::string::size_type index = a_string.find(a_sep,pos); - if(index==std::string::npos){ // Last word. - if((l-pos)>=lim) { - T value; - if(!to(a_string.substr(pos,l-pos),value)) { - a_values.clear(); - return false; - } - a_values.push_back(value); - } - break; - } else { - // abcxxxef - // 0 3 67 - if((index-pos)>=lim) { - T value; - if(!to(a_string.substr(pos,index-pos),value)) { - a_values.clear(); - return false; - } - a_values.push_back(value); - } - pos = index + llimiter; - } - } - } - return true; -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/sys/dir b/source/externals/g4tools/include/tools/sys/dir deleted file mode 100644 index e479034f6a..0000000000 --- a/source/externals/g4tools/include/tools/sys/dir +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_sys_dir -#define tools_sys_dir - -// on Windows, avoid windows.h. -// See files to get directory entries (that needs windows.h on Windows). - -#include - -#ifdef _MSC_VER -#include -//extern "C" {char* _getdcwd(int,char*,int);} -#else -#include -#include //getenv. -#endif - -#include - -namespace tools { -namespace dir { - -inline bool pwd(std::string& a_pwd) { - // Return current directory. - unsigned int mx_path_len = 2048; - char* cwd = new char[mx_path_len]; -#ifdef _MSC_VER - // driveletter = 0 means return the working directory for the default drive. - if(::_getdcwd(0,cwd,mx_path_len)==NULL) { - delete [] cwd; - a_pwd.clear(); - return false; - } -#else - if(::getcwd(cwd,mx_path_len)==NULL) { - delete [] cwd; - a_pwd.clear(); - return false; - } -#endif - a_pwd = cwd; - delete [] cwd; - return true; -} - -inline bool cd(const std::string& a_path){ - if(::chdir(a_path.c_str())!=0) return false; - return true; -} - -inline bool create(const std::string& a_name){ - // a_name should be a single directory name, and not a file system path. - // Then it must not contain : ., .., /, \ etc... -#ifdef _MSC_VER - return (::mkdir(a_name.c_str())==0 ? true : false); -#else - return (::mkdir(a_name.c_str(), 0755)==0 ? true : false); -#endif -} - -inline bool home(std::string& a_s) { -#ifdef _WIN32 - const char* env = ::getenv("USERPROFILE"); -#else - const char* env = ::getenv("HOME"); -#endif - if(!env) {a_s.clear();return false;} - a_s = env; - return true; -} - -inline bool cd_home() { - std::string s; - home(s); - if(s.empty()) return false; - return cd(s); -} - -//NOTE : SWIG : exists is also a method in file -// (can be fix with a %rename(directory_exists)) -inline bool in_fs(const std::string& a_path){ - struct stat finfo; - if (::stat(a_path.c_str(),&finfo) < 0) return false; - return true; -} - -//NOTE : SWIG : "is" is a Python keyword. -inline bool is_a(const std::string& a_path,bool& a_value) { - a_value = false; - struct stat finfo; - if (::stat(a_path.c_str(),&finfo) < 0) return false; - a_value = ( ((finfo.st_mode & S_IFMT) == S_IFDIR) ? true : false); - return true; -} - -inline bool is_a(const std::string& a_path) { - bool _is; - if(!is_a(a_path,_is)) return false; - return _is; -} - -inline bool is_dot(const std::string& a_path) { -#ifdef _WIN32 - char sep = '\\'; -#else - char sep = '/'; -#endif - size_t l = a_path.size(); - if((l==1) && (a_path[0]=='.') ) return true; - if((l==2) && (a_path[0]=='.') && (a_path[l]=='.') ) return true; - if((l>=2) && (a_path[l-1]=='.') && (a_path[l-2]==sep) ) return true; - if((l>=3) && (a_path[l-1]=='.') && (a_path[l-2]=='.') && (a_path[l-3]==sep) ) - return true; - return false; -} - -inline bool mkdir(const std::string& a_name) { - // a_name should be a single directory name, and not a file system path. - // Then it must not contain : ., .., /, \ etc... - bool is; - if(!is_a(a_name,is)) { //a_name does not exist as a file or dir. - if(!create(a_name)) return false; - } else { - if(!is) return false; //a_name exists but is not a directory. - } - return true; -} - -inline bool mkcd(const std::string& a_name) { - // a_name should be a single directory name, and not a file system path. - // Then it must not contain : ., .., /, \ etc... - if(!mkdir(a_name)) return false; - return cd(a_name); -} - -}} - -#endif diff --git a/source/externals/g4tools/include/tools/sys/process b/source/externals/g4tools/include/tools/sys/process deleted file mode 100644 index f56689a4f8..0000000000 --- a/source/externals/g4tools/include/tools/sys/process +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_sys_process -#define tools_sys_process - -#ifdef _MSC_VER -#include -#else -#include -#endif - -namespace tools { - -inline int process_id() { - return static_cast(::getpid()); -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/system b/source/externals/g4tools/include/tools/system deleted file mode 100644 index cdf582590b..0000000000 --- a/source/externals/g4tools/include/tools/system +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_system -#define tools_system - -#include - -#include "cstr" -#include "sout" -#include "num2s" -#include "sto" -#include "words" -#include "sep" -#include "vmanip" -#include "srep" - -#if defined(__APPLE__) -#include -#endif - -namespace tools { - -inline bool is_env(const std::string& a_string){ - const char* env = ::getenv(a_string.c_str()); - return (env?true:false); -} - -inline bool isenv(const std::string& a_string){return is_env(a_string);} //deprecated. - -inline bool get_env(const std::string& a_string,std::string& a_value){ - const char* env = ::getenv(a_string.c_str()); - if(env) { - a_value = std::string(env?env:""); - return true; - } else { - a_value.clear(); - return false; - } -} -inline bool getenv(const std::string& a_string,std::string& a_value){return get_env(a_string,a_value);} //deprecated. - -template -inline bool get_env(const std::string& a_string,T& a_v,const T& a_def = T()){ - std::string s; - if(!getenv(a_string,s)) {a_v = a_def;return false;} - return to(s,a_v,a_def); -} - -inline bool get_env_bool(const std::string& a_string,bool& a_v){ - std::string s; - if(!getenv(a_string,s)) return false; - return to(s,a_v); -} - -inline bool put_env(const std::string& a_env,const std::string& a_value){ - std::string value = a_env+"="+a_value; -#ifdef TOOLS_MEM - if(::putenv(str_dup(value.c_str(),false))) return false; -#else - if(::putenv(str_dup(value.c_str()))) return false; -#endif - //check: - std::string s; - if(!getenv(a_env,s)) return false; - if(s!=a_value) return false; - return true; -} -inline bool putenv(const std::string& a_env,const std::string& a_value){return put_env(a_env,a_value);} //deprecated. - -inline bool rm_env(const std::string& a_env){ -#ifdef _MSC_VER - std::string value = a_env+"="; -#ifdef TOOLS_MEM - if(::putenv(str_dup(value.c_str(),false))) return false; -#else - if(::putenv(str_dup(value.c_str()))) return false; -#endif -#else - ::unsetenv(a_env.c_str()); -#endif - return true; -} - -inline bool rmenv(const std::string& a_env) {return rm_env(a_env);} //deprecated. Still used in OnX. - -inline bool check_getenv(std::ostream& a_out, - const std::string& a_new,const std::string& a_old, - std::string& a_env){ - if(get_env(a_new,a_env)) return true; - if(get_env(a_old,a_env)) { - a_out << "Environment variable " << sout(a_old) << " is deprecated. Use " << sout(a_new) << " instead." << std::endl; - return true; - } - return false; -} - -inline int std_system(std::ostream& a_out,const std::string& a_string) { -#if TARGET_OS_IPHONE - a_out << "tools::std_system : system() not available on iOS. Can't execute " << sout(a_string) << "." << std::endl; - return EXIT_FAILURE; -#else - return ::system(a_string.c_str()); - (void)a_out; -#endif -} - -inline bool env_append(const std::string& a_env,const std::string& a_sep,const std::vector& a_vals){ - std::string env_value; - if(is_env(a_env)) { - if(!get_env(a_env,env_value)) return false; - } - - {std::vector::const_iterator it; - for(it=a_vals.begin();it!=a_vals.end();++it) { - const std::string& value = *it; - if(value.empty()) continue; - - if(env_value.size()) { - std::vector ws; - words(env_value,a_sep,false,ws); - // Remove existing one, so that value be put at end. - remove(ws,value); - if(!nums2s(ws,env_value,a_sep)) {} - } - - if(env_value.size()) env_value += a_sep; - env_value += value; - }} - - if(!putenv(a_env,env_value)) return false; - - return true; -} - -inline bool env_path_append(const std::string& a_env,const std::vector& a_paths){ - return env_append(a_env,psep(),a_paths); -} - -inline bool env_append_path(const std::string& a_env,const std::string& a_path){ - std::vector v; - v.push_back(a_path); - return env_append(a_env,psep(),v); -} - -// OpenPAW, Panoramix : -inline bool rep_env(std::string& a_string) { - char spec_char = '\n'; - std::string::size_type dollar; - while((dollar=a_string.find('$'))!=std::string::npos){ - std::string::size_type slash = a_string.find('/',dollar+1); - std::string::size_type back_slash = a_string.find('\\',dollar+1); - std::string::size_type pos = std::string::npos; - if(slash!=std::string::npos) { - if(back_slash!=std::string::npos) { - pos = slash -#include - -namespace tools { - -inline bool equal(std::ostream& a_out,const char* a_file,int a_line,const std::string& a_v,const std::string& a_expected) { - if(a_v!=a_expected) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "strg value \"" << a_v << "\"" << std::endl - << ", expected \"" << a_expected << "\"." << std::endl; - return false; - } - return true; -} - -inline bool equal(std::ostream& a_out,const char* a_file,int a_line,bool a_v,bool a_expected) { - if(a_v!=a_expected) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "value " << (a_v?"true":"false") << ", expected " << (a_expected?"true":"false") << std::endl; - return false; - } - return true; -} - -#define TOOLS_TEST_FUNC(a__func) \ - if(!tools::equal(a_out,__FILE__,__LINE__,(a__func),true)) return false; - -template -inline bool valid_pointer(std::ostream& a_out,const char* a_file,int a_line,CLASS* a_p) { - if(!a_p) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "null pointer." << std::endl; - return false; - } - return true; -} - -template -inline bool equal(std::ostream& a_out,const char* a_file,int a_line,const INTEGER& a_v,const INTEGER& a_expected) { - if(a_v!=a_expected) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "value " << a_v << ", expected " << a_expected << std::endl; - return false; - } - return true; -} - -template -inline bool not_equal(std::ostream& a_out,const char* a_file,int a_line,const INTEGER& a_v,const INTEGER& a_expected) { - if(a_v==a_expected) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "value " << a_v << ", expected " << a_expected << std::endl; - return false; - } - return true; -} - -template -inline bool ge(std::ostream& a_out,const char* a_file,int a_line,const INTEGER& a_v,const INTEGER& a_expected) { - if(a_v -inline bool equal(std::ostream& a_out,const char* a_file,int a_line,const REAL& a_v,const REAL& a_expected,const REAL& a_tolerance,REAL(*a_fabs)(const REAL&)) { - REAL diff = a_fabs(a_v-a_expected); - if(diff>=a_tolerance) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "value " << a_v << ", expected " << a_expected << ",diff " << diff << std::endl; - return false; - } - return true; -} - -template -inline bool not_equal(std::ostream& a_out,const char* a_file,int a_line,const REAL& a_v,const REAL& a_expected,const REAL& a_tolerance,REAL(*a_fabs)(const REAL&)) { - REAL diff = a_fabs(a_v-a_expected); - if(diff -inline bool _equal(std::ostream& a_out,const char* a_file,int a_line,const NUMBER& a_v,const NUMBER& a_expected,const PREC& a_tolerance,PREC(*a_fabs)(const NUMBER&)) { - PREC diff = a_fabs(a_v-a_expected); - if(diff>=a_tolerance) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "value " << a_v << ", expected " << a_expected << ",diff " << diff << std::endl; - return false; - } - return true; -} - -template -inline bool equal(std::ostream& a_out,const char* a_file,int a_line,size_t a_size,const REAL* a_v,const REAL* a_expected,const REAL& a_tolerance,REAL(*a_fabs)(const REAL&)){ - for(size_t index=0;index(a_out,a_file,a_line,a_v[index],a_expected[index],a_tolerance,a_fabs)) return false; - } - return true; -} - -template -inline bool equal(std::ostream& a_out,const char* a_file,int a_line,const VEC& a_1,const VEC& a_2,const REAL& a_tolerance,REAL(*a_fabs)(const REAL&)){ - if(a_1.dimension()!=a_2.dimension()) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "vector dimension " << a_1.dimension() << " != " << a_2.dimension() << std::endl; - return false; - } - for(size_t index=0;index(a_out,a_file,a_line,a_1[index],a_2[index],a_tolerance,a_fabs)) return false; - } - return true; -} - -template -inline bool mat_equal(std::ostream& a_out,const char* a_file,int a_line,const MAT& a_1,const MAT& a_2,const REAL& a_tolerance,REAL(*a_fabs)(const REAL&)){ - if(a_1.dimension()!=a_2.dimension()) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "matrix dimension " << a_1.dimension() << " != " << a_2.dimension() << std::endl; - return false; - } - if(a_1.data_size()!=a_2.data_size()) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "matrix data_size " << a_1.data_size() << " != " << a_2.data_size() << std::endl; - return false; - } - for(size_t index=0;index(a_out,a_file,a_line,a_1.data()[index],a_2.data()[index],a_tolerance,a_fabs)) return false; - } - return true; -} - -} - -#include - -namespace tools { - -inline bool equal(std::ostream& a_out,const char* a_file,int a_line,const std::vector& a_v,const std::vector& a_expected) { - if(a_v.size()!=a_expected.size()) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "vector value.size() " << a_v.size() << ", expected " << a_expected.size() << std::endl; - return false; - } - std::vector::const_iterator it1 = a_v.begin(); - std::vector::const_iterator it2 = a_expected.begin(); - for(;it1!=a_v.end();++it1,++it2) { - if((*it1)!=(*it2)) { - a_out << "failed in file :" << std::endl - << a_file << std::endl - << "at line :" << std::endl - << a_line << std::endl - << "line value \"" << (*it1) << "\"" << std::endl - << ", expected \"" << (*it2) << "\"" << std::endl; - return false; - } - } - return true; -} - -} - -#endif diff --git a/source/externals/g4tools/include/tools/tokenize b/source/externals/g4tools/include/tools/tokenize new file mode 100644 index 0000000000..14f29296aa --- /dev/null +++ b/source/externals/g4tools/include/tools/tokenize @@ -0,0 +1,53 @@ +// Copyright (C) 2010, Guy Barrand. All rights reserved. +// See the file tools.license for terms. + +#ifndef tools_tokenize +#define tools_tokenize + +#include +#include + +namespace tools { + +inline bool double_quotes_get_token(const std::string& a_cmd,std::string::size_type a_begIdx, + std::string::size_type& a_endIdx,std::string& a_token) { + while ( a_cmd[a_begIdx] == ' ') ++a_begIdx; // Loop checking, 23.06.2015, I. Hrivnacova + if ( a_cmd[a_begIdx] == '"' ) { + a_endIdx = a_cmd.find('"', a_begIdx+1); + if ( a_endIdx == std::string::npos ) a_endIdx = a_cmd.length(); + a_token = a_cmd.substr(a_begIdx+1, (a_endIdx-1)-a_begIdx); + ++a_endIdx; + } + else { + a_endIdx = a_cmd.find(' ', a_begIdx); + if ( a_endIdx == std::string::npos ) a_endIdx = a_cmd.length(); + a_token = a_cmd.substr(a_begIdx, a_endIdx-a_begIdx); + } + return ( a_token.length() > 0 ); +} + +// From a string, double_quotes_tokenize permits to get arguments +// by taking into account strings enclosed by double quotes and potentially +// containing spaces (for example to specify a file path containing spaces). +// Example: +// if a_cmd is the string: aa bbb "ccc ddd" ee "fff gg" +// Returned a_args string list will be: +// "aa", "bb", "ccc ddd", "ee", "fff gg" +// Algorithm from Geant4/G4AnalysisUtilities.cc/Tokenize() done by Ivana Hrivnacova. + +inline void double_quotes_tokenize(const std::string& a_cmd, std::vector& a_args) { + std::string::size_type begIdx = 0; + std::string::size_type endIdx = 0; + std::string token; + do { + if ( double_quotes_get_token(a_cmd, begIdx, endIdx, token) ) { + a_args.push_back(token); + } + begIdx = endIdx + 1; + } + while ( endIdx < a_cmd.length() ); // Loop checking, 23.06.2015, I. Hrivnacova +} + +} + +#endif diff --git a/source/externals/g4tools/include/tools/utest b/source/externals/g4tools/include/tools/utest deleted file mode 100644 index 75fd2a5ea9..0000000000 --- a/source/externals/g4tools/include/tools/utest +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_utest -#define tools_utest - -#include "args" -#include //for FILE* - -namespace tools { - -class test { -public: - typedef bool(*func)(std::ostream&,bool); - typedef bool(*func2)(std::ostream&,const args&); - typedef bool(*func3)(std::ostream&,int,char**); - - typedef bool(*cfunc)(FILE*,bool); -public: - test():m_do_it(false),m_func(0),m_func2(0),m_func3(0),m_cfunc(0){} - test(bool a_do_it,func a_func):m_do_it(a_do_it),m_func(a_func),m_func2(0),m_func3(0),m_cfunc(0){} - test(bool a_do_it,func2 a_func):m_do_it(a_do_it),m_func(0),m_func2(a_func),m_func3(0),m_cfunc(0){} - test(bool a_do_it,func3 a_func):m_do_it(a_do_it),m_func(0),m_func2(0),m_func3(a_func),m_cfunc(0){} - test(bool a_do_it,cfunc a_func):m_do_it(a_do_it),m_func(0),m_func2(0),m_func3(0),m_cfunc(a_func){} - virtual ~test(){} -public: - test(const test& a_from) - :m_do_it(a_from.m_do_it) - ,m_func(a_from.m_func),m_func2(a_from.m_func2),m_func3(a_from.m_func3),m_cfunc(a_from.m_cfunc){} - test& operator=(const test& a_from) { - m_do_it = a_from.m_do_it; - m_func = a_from.m_func; - m_func2 = a_from.m_func2; - m_func3 = a_from.m_func3; - m_cfunc = a_from.m_cfunc; - return *this; - } -public: - bool m_do_it; - func m_func; - func2 m_func2; - func3 m_func3; - cfunc m_cfunc; -}; - -class utest : public std::vector< std::pair > { - typedef std::pair named_test; - typedef std::vector parent; -public: - utest(std::ostream& a_out):m_out(a_out){} - virtual~ utest(){} -public: - utest(const utest& a_from):parent(a_from),m_out(a_from.m_out){} - utest& operator=(const utest& a_from){ parent::operator=(a_from);return *this;} -public: - void add(const std::string& a_name,test::func a_func) { - (*this).push_back(named_test(a_name,test(false,a_func))); - } - void add(const std::string& a_name,test::func2 a_func) { - (*this).push_back(named_test(a_name,test(false,a_func))); - } - void add(const std::string& a_name,test::func3 a_func) { - (*this).push_back(named_test(a_name,test(false,a_func))); - } - void add(const std::string& a_name,test::cfunc a_func) { - (*this).push_back(named_test(a_name,test(false,a_func))); - } - - bool exec(const args& a_args,bool a_verbose,int a_argc=0,char** a_argv=0) { - {tools_vforit(named_test,*this,it) (*it).second.m_do_it = false;} - - {tools_vforcit(args::arg,a_args.get_args(),it) { - const std::string& key = (*it).first; - bool found = false; - tools_vforit(named_test,*this,itn) { - const std::string& name = (*itn).first; - if(key==std::string("-"+name)) {found=true;break;} - if(key==std::string("-no_"+name)) {found=true;break;} //valid arg, but not a test. - } - if(!found) { - m_out << "WARNING : arg " << sout(key) << " is not a test." << std::endl; - } - }} - - bool some = false; - {tools_vforit(named_test,*this,it) { - const std::string& name = (*it).first; - if(a_args.is_arg("-"+name)) { - (*it).second.m_do_it = true; - some = true; - } - }} - - if(!some) { //do all. - tools_vforit(named_test,*this,it) (*it).second.m_do_it = true; - } - - {tools_vforit(named_test,*this,it) { - const std::string& name = (*it).first; - if(a_args.is_arg("-no_"+name)) { - (*it).second.m_do_it = false; - } - }} - - bool status = true; - - {tools_vforcit(named_test,*this,it) { - const std::string& name = (*it).first; - if((*it).second.m_do_it && (*it).second.m_func) { - if(a_verbose) m_out << "test_" << name << " ..." << std::endl; - if(!(*it).second.m_func(m_out,a_verbose)) { - m_out << "test_" << name << " failed." << std::endl; - status = false; - } - if(a_verbose) m_out << "test_" << name << " end." << std::endl; - } - }} - - {tools_vforcit(named_test,*this,it) { - const std::string& name = (*it).first; - if((*it).second.m_do_it && (*it).second.m_func2) { - if(a_verbose) m_out << "test_" << name << " ..." << std::endl; - if(!(*it).second.m_func2(m_out,a_args)) { - m_out << "test_" << name << " failed." << std::endl; - status = false; - } - if(a_verbose) m_out << "test_" << name << " end." << std::endl; - } - }} - - {tools_vforcit(named_test,*this,it) { - const std::string& name = (*it).first; - if((*it).second.m_do_it && (*it).second.m_func3) { - if(a_verbose) m_out << "test_" << name << " ..." << std::endl; - if(!(*it).second.m_func3(m_out,a_argc,a_argv)) { - m_out << "test_" << name << " failed." << std::endl; - status = false; - } - if(a_verbose) m_out << "test_" << name << " end." << std::endl; - } - }} - - {tools_vforcit(named_test,*this,it) { - const std::string& name = (*it).first; - if((*it).second.m_do_it && (*it).second.m_cfunc) { - if(a_verbose) m_out << "test_" << name << " ..." << std::endl; - if(!(*it).second.m_cfunc(stdout,a_verbose)) { - m_out << "test_" << name << " failed." << std::endl; - status = false; - } - if(a_verbose) m_out << "test_" << name << " end." << std::endl; - } - }} - - tools_vforit(named_test,*this,it) (*it).second.m_do_it = false; - - return status; - } - - void list() {tools_vforit(named_test,*this,it) m_out << (*it).first << std::endl;} -protected: - std::ostream& m_out; -}; - -} - -#endif diff --git a/source/externals/g4tools/include/tools/version b/source/externals/g4tools/include/tools/version index 74d27af1e7..295487a15d 100644 --- a/source/externals/g4tools/include/tools/version +++ b/source/externals/g4tools/include/tools/version @@ -5,13 +5,13 @@ #define tools_version #define TOOLS_MAJOR_VERSION 5 -#define TOOLS_MINOR_VERSION 4 +#define TOOLS_MINOR_VERSION 6 #define TOOLS_PATCH_VERSION 0 -#define TOOLS_VERSION "5.4.0" -#define TOOLS_VERSION_VRP "v5r4p0" +#define TOOLS_VERSION "5.6.0" +#define TOOLS_VERSION_VRP "v5r6p0" namespace tools { -inline unsigned int version() {return 50400;} +inline unsigned int version() {return 50600;} } #endif diff --git a/source/externals/g4tools/include/tools/waxml/ntuple b/source/externals/g4tools/include/tools/waxml/ntuple index 7d19ffb697..5a4a1a866a 100644 --- a/source/externals/g4tools/include/tools/waxml/ntuple +++ b/source/externals/g4tools/include/tools/waxml/ntuple @@ -325,6 +325,19 @@ public: return; } + } else if((*it).cls_id()==_cid_std_vector()) { + std::vector* vec = (std::vector*)(*it).user_obj(); + if(vec) { + create_column((*it).name(),*vec); + } else { + a_out << "tools::waxml::ntuple :" + << " for std::vector column " << sout((*it).name()) + << ", the user vector pointer is null." + << std::endl; + safe_clear(m_cols); + return; + } + } else { a_out << "tools::waxml::ntuple :" << " for column " << sout((*it).name()) diff --git a/source/externals/g4tools/include/tools/xpm b/source/externals/g4tools/include/tools/xpm deleted file mode 100644 index 9737e1d9e9..0000000000 --- a/source/externals/g4tools/include/tools/xpm +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (C) 2010, Guy Barrand. All rights reserved. -// See the file tools.license for terms. - -#ifndef tools_xpm -#define tools_xpm - -#include //FILE,size_t -#include -#include -#include - -#include "charmanip" - -namespace tools { -namespace xpm { - -typedef unsigned char* (*file_reader)(std::ostream&,const std::string&,unsigned int&,unsigned int&,unsigned int&); - -inline bool to_xpm(std::ostream& a_out,const std::string& a_file,const std::string& a_name,file_reader a_file_reader,bool a_verbose) { - // a_name is the xpm name. Then a string without a path and without - // the .xpm suffix. - - unsigned int w,h,bpp; - unsigned char* buffer = a_file_reader(a_out,a_file,w,h,bpp); - if(!buffer) { - a_out << "tools::xpm::to_xpm :" - << " read_file failed." - << std::endl; - return false; - } - - // get colormap : - - typedef unsigned int color; - std::vector colors; - - {unsigned char r,g,b; - for(unsigned int j=0;j::iterator it; - for(it=colors.begin();it!=colors.end();++it) { - if(*it==c) { - found = true; - break; - } - } - if(!found) colors.push_back(c); - - } - }} - - unsigned int colorn = (unsigned int)colors.size(); - - //get a set of non problematic characters (for exa avoid \). - std::vector chars; - {for(unsigned char c=0;c<255;c++) { - if(is_letter(c)||is_digit(c)) { - chars.push_back(c); - } - }} - - unsigned int base = (unsigned int)chars.size(); - - unsigned int nchar = 1; - {unsigned int i = colorn; - while(i>=base) { - //unsigned int r = i%base; - i /= base; - nchar++; - }} - - if(a_verbose) { - a_out << "colors " << colorn - << " base " << base - << " nchar " << nchar - << std::endl; - } - - std::string xpm = a_name+".xpm"; - - FILE* out = ::fopen(xpm.c_str(),"wb"); - if(!out) { - a_out << "tools::xpm::to_xpm :" - << " can't open " << xpm - << std::endl; - delete [] buffer; - return false; - } - - ::fprintf(out,"%s","/* XPM */\n"); - ::fprintf(out,"static const char *%s[] = {\n",a_name.c_str()); - ::fprintf(out,"\"%u %u %u %u\",\n",w,h,colorn,nchar); - - // write colormap : - {for(unsigned int index=0;index -#include -#include - -/*G.Barrand : static int qflag = 0; */ - -/* inflate.c -- put in the public domain by Mark Adler - version c14o, 23 August 1994 */ - - -/* You can do whatever you like with this source file, though I would - prefer that if you modify it and redistribute it that you include - comments to that effect with your name and the date. Thank you. - - History: - vers date who what - ---- --------- -------------- ------------------------------------ - a ~~ Feb 92 M. Adler used full (large, one-step) lookup table - b1 21 Mar 92 M. Adler first version with partial lookup tables - b2 21 Mar 92 M. Adler fixed bug in fixed-code blocks - b3 22 Mar 92 M. Adler sped up match copies, cleaned up some - b4 25 Mar 92 M. Adler added prototypes; removed window[] (now - is the responsibility of unzip.h--also - changed name to slide[]), so needs diffs - for unzip.c and unzip.h (this allows - compiling in the small model on MSDOS); - fixed cast of q in huft_build(); - b5 26 Mar 92 M. Adler got rid of unintended macro recursion. - b6 27 Mar 92 M. Adler got rid of nextbyte() routine. fixed - bug in inflate_fixed(). - c1 30 Mar 92 M. Adler removed lbits, dbits environment variables. - changed BMAX to 16 for explode. Removed - OUTB usage, and replaced it with flush()-- - this was a 20% speed improvement! Added - an explode.c (to replace unimplod.c) that - uses the huft routines here. Removed - register union. - c2 4 Apr 92 M. Adler fixed bug for file sizes a multiple of 32k. - c3 10 Apr 92 M. Adler reduced memory of code tables made by - huft_build significantly (factor of two to - three). - c4 15 Apr 92 M. Adler added NOMEMCPY do kill use of memcpy(). - worked around a Turbo C optimization bug. - c5 21 Apr 92 M. Adler added the WSIZE #define to allow reducing - the 32K window size for specialized - applications. - c6 31 May 92 M. Adler added some typecasts to eliminate warnings - c7 27 Jun 92 G. Roelofs added some more typecasts (444: MSC bug). - c8 5 Oct 92 J-l. Gailly added ifdef'd code to deal with PKZIP bug. - c9 9 Oct 92 M. Adler removed a memory error message (~line 416). - c10 17 Oct 92 G. Roelofs changed ULONG/UWORD/byte to ulg/ush/uch, - removed old inflate, renamed inflate_entry - to inflate, added Mark's fix to a comment. - c10.5 14 Dec 92 M. Adler fix up error messages for incomplete trees. - c11 2 Jan 93 M. Adler fixed bug in detection of incomplete - tables, and removed assumption that EOB is - the longest code (bad assumption). - c12 3 Jan 93 M. Adler make tables for fixed blocks only once. - c13 5 Jan 93 M. Adler allow all zero length codes (pkzip 2.04c - outputs one zero length code for an empty - distance tree). - c14 12 Mar 93 M. Adler made inflate.c standalone with the - introduction of inflate.h. - c14b 16 Jul 93 G. Roelofs added (unsigned) typecast to w at 470. - c14c 19 Jul 93 J. Bush changed v[N_MAX], l[288], ll[28x+3x] arrays - to static for Amiga. - c14d 13 Aug 93 J-l. Gailly de-complicatified Mark's c[*p++]++ thing. - c14e 8 Oct 93 G. Roelofs changed memset() to memzero(). - c14f 22 Oct 93 G. Roelofs renamed quietflg to qflag; made Trace() - conditional; added inflate_free(). - c14g 28 Oct 93 G. Roelofs changed l/(lx+1) macro to pointer (Cray bug) - c14h 7 Dec 93 C. Ghisler huft_build() optimizations. - c14i 9 Jan 94 A. Verheijen set fixed_t{d,l} to NULL after freeing; - G. Roelofs check NEXTBYTE macro for EOF. - c14j 23 Jan 94 G. Roelofs removed Ghisler "optimizations"; ifdef'd - EOF check. - c14k 27 Feb 94 G. Roelofs added some typecasts to avoid warnings. - c14l 9 Apr 94 G. Roelofs fixed split comments on preprocessor lines - to avoid bug in Encore compiler. - c14m 7 Jul 94 P. Kienitz modified to allow assembler version of - inflate_codes() (define ASM_INFLATECODES) - c14n 22 Jul 94 G. Roelofs changed fprintf to FPRINTF for DLL versions - c14o 23 Aug 94 C. Spieler added a newline to a debug statement; - G. Roelofs added another typecast to avoid MSC warning - */ - - -/* - Inflate deflated (PKZIP's method 8 compressed) data. The compression - method searches for as much of the current string of bytes (up to a - length of 258) in the previous 32K bytes. If it doesn't find any - matches (of at least length 3), it codes the next byte. Otherwise, it - codes the length of the matched string and its distance backwards from - the current position. There is a single Huffman code that codes both - single bytes (called "literals") and match lengths. A second Huffman - code codes the distance information, which follows a length code. Each - length or distance code actually represents a base value and a number - of "extra" (sometimes zero) bits to get to add to the base value. At - the end of each deflated block is a special end-of-block (EOB) literal/ - length code. The decoding process is basically: get a literal/length - code; if EOB then done; if a literal, emit the decoded byte; if a - length then get the distance and emit the referred-to bytes from the - sliding window of previously emitted data. - - There are (currently) three kinds of inflate blocks: stored, fixed, and - dynamic. The compressor outputs a chunk of data at a time and decides - which method to use on a chunk-by-chunk basis. A chunk might typically - be 32K to 64K, uncompressed. If the chunk is uncompressible, then the - "stored" method is used. In this case, the bytes are simply stored as - is, eight bits per byte, with none of the above coding. The bytes are - preceded by a count, since there is no longer an EOB code. - - If the data is compressible, then either the fixed or dynamic methods - are used. In the dynamic method, the compressed data is preceded by - an encoding of the literal/length and distance Huffman codes that are - to be used to decode this block. The representation is itself Huffman - coded, and so is preceded by a description of that code. These code - descriptions take up a little space, and so for small blocks, there is - a predefined set of codes, called the fixed codes. The fixed method is - used if the block ends up smaller that way (usually for quite small - chunks); otherwise the dynamic method is used. In the latter case, the - codes are customized to the probabilities in the current block and so - can code it much better than the pre-determined fixed codes can. - - The Huffman codes themselves are decoded using a mutli-level table - lookup, in order to maximize the speed of decoding plus the speed of - building the decoding tables. See the comments below that precede the - lbits and dbits tuning parameters. - */ - - -/* - Notes beyond the 1.93a appnote.txt: - - 1. Distance pointers never point before the beginning of the output - stream. - 2. Distance pointers can point back across blocks, up to 32k away. - 3. There is an implied maximum of 7 bits for the bit length table and - 15 bits for the actual data. - 4. If only one code exists, then it is encoded using one bit. (Zero - would be more efficient, but perhaps a little confusing.) If two - codes exist, they are coded using one bit each (0 and 1). - 5. There is no way of sending zero distance codes--a dummy must be - sent if there are none. (History: a pre 2.0 version of PKZIP would - store blocks with no distance codes, but this was discovered to be - too harsh a criterion.) Valid only for 1.93a. 2.04c does allow - zero distance codes, which is sent as one code of zero bits in - length. - 6. There are up to 286 literal/length codes. Code 256 represents the - end-of-block. Note however that the static length tree defines - 288 codes just to fill out the Huffman codes. Codes 286 and 287 - cannot be used though, since there is no length base or extra bits - defined for them. Similarily, there are up to 30 distance codes. - However, static trees define 32 codes (all 5 bits) to fill out the - Huffman codes, but the last two had better not show up in the data. - 7. Unzip can check dynamic Huffman blocks for complete code sets. - The exception is that a single code would not be complete (see #4). - 8. The five bits following the block type is really the number of - literal codes sent minus 257. - 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits - (1+6+6). Therefore, to output three times the length, you output - three codes (1+1+1), whereas to output four times the same length, - you only need two codes (1+3). Hmm. - 10. In the tree reconstruction algorithm, Code = Code + Increment - only if BitLength(i) is not zero. (Pretty obvious.) - 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) - 12. Note: length code 284 can represent 227-258, but length code 285 - really is 258. The last length deserves its own, short code - since it gets used a lot in very redundant files. The length - 258 is special since 258 - 3 (the min match length) is 255. - 13. The literal/length and distance code bit lengths are read as a - single stream of lengths. It is possible (and advantageous) for - a repeat code (16, 17, or 18) to go across the boundary between - the two sets of lengths. - */ - - -#if 0 -/*G.Barrand #define PKZIP_BUG_WORKAROUND */ /* PKZIP 1.93a problem--live with it */ -#endif - -/* - inflate.h must supply the uch slide[WSIZE] array and the NEXTBYTE, - FLUSH() and memzero macros. If the window size is not 32K, it - should also define WSIZE. If INFMOD is defined, it can include - compiled functions to support the NEXTBYTE and/or FLUSH() macros. - There are defaults for NEXTBYTE and FLUSH() below for use as - examples of what those functions need to do. Normally, you would - also want FLUSH() to compute a crc on the data. inflate.h also - needs to provide these typedefs: - - typedef unsigned char uch; - typedef unsigned short ush; - typedef unsigned long ulg; - - This module uses the external functions malloc() and free() (and - probably memset() or bzero() in the memzero() macro). Their - prototypes are normally found in and . - */ -/*G.Barrand -#define INFMOD -#if 0 -#include "Inflate.h" -#endif -*/ - -typedef char boolean; -typedef unsigned char uch; /* code assumes unsigned bytes; these type- */ -typedef unsigned short ush; /* defs replace byte/UWORD/ULONG (which are */ -typedef unsigned long ulg; /* predefined on some systems) & match zip */ - -#ifndef WSIZE /* default is 32K */ -# define WSIZE 0x8000 /* window size--must be a power of two, and at least */ -#endif /* 32K for zip's deflate method */ - -#ifndef NEXTBYTE /* default is to simply get a byte from stdin */ -# define NEXTBYTE csz__ReadByte() -#endif - -#ifndef FPRINTF -# define FPRINTF fprintf -#endif - -#ifndef FLUSH /* default is to simply write the buffer to stdout */ -# define FLUSH(n) csz__WriteData(n) /* return value not used */ -#endif -/* Warning: the fwrite above might not work on 16-bit compilers, since - 0x8000 might be interpreted as -32,768 by the library function. */ - -#ifndef Trace -# ifdef DEBUG -# define Trace(x) fprintf x -# else -# define Trace(x) -# endif -#endif - - -/* Huffman code lookup table entry--this entry is four bytes for machines - that have 16-bit pointers (e.g. PC's in the small or medium model). - Valid extra bits are 0..13. e == 15 is EOB (end of block), e == 16 - means that v is a literal, 16 < e < 32 means that v is a pointer to - the next table, which codes e - 16 bits, and lastly e == 99 indicates - an unused code. If a code with e == 99 is looked up, this implies an - error in the data. */ -struct huft { - uch e; /* number of extra bits or operation */ - uch b; /* number of bits in this code or subcode */ - union { - ush n; /* literal, length base, or distance base */ - struct huft *t; /* pointer to next level of table */ - } v; -}; - - -/* Function prototypes */ -/*G.Barrand -#ifndef OF -# ifdef __STDC__ -# define OF(a) a -# else -# define OF(a) () -# endif -#endif -*/ -int csz__huft_build(unsigned *, unsigned, unsigned, ush *, ush *, - struct huft **, int *); -int csz__huft_free(struct huft *); -int csz__Inflate_codes(struct huft *, struct huft *, int, int); -int csz__Inflate_stored(void); -int csz__Inflate_fixed(void); -int csz__Inflate_dynamic(void); -int csz__Inflate_block(int *); -#ifdef __cplusplus /*G.Barrand*/ -extern "C" { -#endif -int csz__Inflate(void); -int csz__Inflate_free(void); -#ifdef __cplusplus /*G.Barrand*/ -} -#endif - -/* The inflate algorithm uses a sliding 32K byte window on the uncompressed - stream to find repeated byte strings. This is implemented here as a - circular buffer. The index is updated simply by incrementing and then - and'ing with 0x7fff (32K-1). */ -/* It is left to other modules to supply the 32K area. It is assumed - to be usable as if it were declared "uch slide[32768];" or as just - "uch *slide;" and then malloc'ed in the latter case. The definition - must be in unzip.h, included above. */ - -static uch csz__slide [32768]; -static unsigned wp; /* current position in slide */ - - -/* Tables for deflate from PKZIP's appnote.txt. */ -static unsigned border[] = { /* Order of the bit length code lengths */ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; -static ush cplens[] = { /* Copy lengths for literal codes 257..285 */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - /* note: see note #13 above about the 258 in this list. */ -static ush cplext[] = { /* Extra bits for literal codes 257..285 */ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */ -static ush cpdist[] = { /* Copy offsets for distance codes 0..29 */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577}; -static ush cpdext[] = { /* Extra bits for distance codes */ - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 13, 13}; - -/* And'ing with mask[n] masks the lower n bits */ -static ush mask[] = { - 0x0000, - 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, - 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff -}; - - -/* Macros for inflate() bit peeking and grabbing. - The usage is: - - NEEDBITS(j) - x = b & mask[j]; - DUMPBITS(j) - - where NEEDBITS makes sure that b has at least j bits in it, and - DUMPBITS removes the bits from b. The macros use the variable k - for the number of bits in b. Normally, b and k are register - variables for speed, and are initialized at the begining of a - routine that uses these macros from a global bit buffer and count. - - In order to not ask for more bits than there are in the compressed - stream, the Huffman tables are constructed to only ask for just - enough bits to make up the end-of-block code (value 256). Then no - bytes need to be "returned" to the buffer at the end of the last - block. See the huft_build() routine. - */ - -static ulg bb; /* bit buffer */ -static unsigned bk; /* bits in bit buffer */ -static uch *ibufptr,*obufptr; -static long ibufcnt, obufcnt; - -#define CHECK_EOF - -#ifndef CHECK_EOF -static int csz__ReadByte(); -#endif -static void csz__WriteData(int); - -#ifndef CHECK_EOF -# define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE)<>=(n);k-=(n);} - - -/* - Huffman code decoding is performed using a multi-level table lookup. - The fastest way to decode is to simply build a lookup table whose - size is determined by the longest code. However, the time it takes - to build this table can also be a factor if the data being decoded - is not very long. The most common codes are necessarily the - shortest codes, so those codes dominate the decoding time, and hence - the speed. The idea is you can have a shorter table that decodes the - shorter, more probable codes, and then point to subsidiary tables for - the longer codes. The time it costs to decode the longer codes is - then traded against the time it takes to make longer tables. - - This results of this trade are in the variables lbits and dbits - below. lbits is the number of bits the first level table for literal/ - length codes can decode in one step, and dbits is the same thing for - the distance codes. Subsequent tables are also less than or equal to - those sizes. These values may be adjusted either when all of the - codes are shorter than that, in which case the longest code length in - bits is used, or when the shortest code is *longer* than the requested - table size, in which case the length of the shortest code in bits is - used. - - There are two different values for the two tables, since they code a - different number of possibilities each. The literal/length table - codes 286 possible values, or in a flat code, a little over eight - bits. The distance table codes 30 possible values, or a little less - than five bits, flat. The optimum values for speed end up being - about one bit more than those, so lbits is 8+1 and dbits is 5+1. - The optimum values may differ though from machine to machine, and - possibly even between compilers. Your mileage may vary. - */ - - -static int lbits = 9; /* bits in base literal/length lookup table */ -static int dbits = 6; /* bits in base distance lookup table */ - - -/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */ -#define BMAX 16 /* maximum bit length of any code (16 for explode) */ -#define N_MAX 288 /* maximum number of codes in any set */ - - -static unsigned hufts; /* track memory usage */ - - -int csz__huft_build(unsigned *b, unsigned n, unsigned s, ush *d, ush *e, struct huft **t, int *m) -/* unsigned *b; code lengths in bits (all assumed <= BMAX) */ -/* unsigned n; number of codes (assumed <= N_MAX) */ -/* unsigned s; number of simple-valued codes (0..s-1) */ -/* ush *d; list of base values for non-simple codes */ -/* ush *e; list of extra bits for non-simple codes */ -/* struct huft **t; result: starting table */ -/* int *m; maximum lookup bits, returns actual */ -/* Given a list of code lengths and a maximum table size, make a set of - tables to decode that set of codes. Return zero on success, one if - the given code set is incomplete (the tables are still built in this - case), two if the input is invalid (all zero length codes or an - oversubscribed set of lengths), and three if not enough memory. - The code with value 256 is special, and the tables are constructed - so that no bits beyond that code are fetched when that code is - decoded. */ -{ - unsigned a; /* counter for codes of length k */ - unsigned c[BMAX+1]; /* bit length count table */ - unsigned el; /* length of EOB code (value 256) */ - unsigned f; /* i repeats in table every f entries */ - int g; /* maximum code length */ - int h; /* table level */ - /*G.Barrand : comment out register keyword.*/ - /*register*/ unsigned i; /* counter, current code */ - /*register*/ unsigned j; /* counter */ - /*register*/ int k; /* number of bits in current code */ - int lx[BMAX+1]; /* memory for l[-1..BMAX-1] */ - int *l = lx+1; /* stack of bits per table */ - /*register*/ unsigned *p; /* pointer into c[], b[], or v[] */ - /*register*/ struct huft *q; /* points to current table */ - struct huft r; /* table entry for structure assignment */ - struct huft *u[BMAX]; /* table stack */ - static unsigned v[N_MAX]; /* values in order of bit length */ - /*register*/ int w; /* bits before this table == (l * h) */ - unsigned x[BMAX+1]; /* bit offsets, then code stack */ - unsigned *xp; /* pointer into x */ - int y; /* number of dummy codes added */ - unsigned z; /* number of entries in current table */ - - - /* Generate counts for each bit length */ - el = n > 256 ? b[256] : BMAX; /* set length of EOB code, if any */ - memset((char *)c,0,sizeof(c)); - p = b; i = n; - do { - c[*p]++; p++; /* assume all entries <= BMAX */ - } while (--i); - if (c[0] == n) /* null input--all zero length codes */ - { - *t = (struct huft *)NULL; - *m = 0; - return 0; - } - - - /* Find minimum and maximum length, bound *m by those */ - for (j = 1; j <= BMAX; j++) - if (c[j]) - break; - k = j; /* minimum code length */ - if ((unsigned)*m < j) - *m = j; - for (i = BMAX; i; i--) - if (c[i]) - break; - g = i; /* maximum code length */ - if ((unsigned)*m > i) - *m = i; - - - /* Adjust last length count to fill out codes, if needed */ - for (y = 1 << j; j < i; j++, y <<= 1) - if ((y -= c[j]) < 0) - return 2; /* bad input: more codes than bits */ - if ((y -= c[i]) < 0) - return 2; - c[i] += y; - - - /* Generate starting offsets into the value table for each length */ - x[1] = j = 0; - p = c + 1; xp = x + 2; - while (--i) { /* note that i == g from above */ - *xp++ = (j += *p++); - } - - - /* Make a table of values in order of bit lengths */ - p = b; i = 0; - do { - if ((j = *p++) != 0) - v[x[j]++] = i; - } while (++i < n); - - - /* Generate the Huffman codes and for each, make the table entries */ - x[0] = i = 0; /* first Huffman code is zero */ - p = v; /* grab values in bit order */ - h = -1; /* no tables yet--level -1 */ - w = l[-1] = 0; /* no bits decoded yet */ - u[0] = (struct huft *)NULL; /* just to keep compilers happy */ - q = (struct huft *)NULL; /* ditto */ - z = 0; /* ditto */ - - /* go through the bit lengths (k already is bits in shortest code) */ - for (; k <= g; k++) - { - a = c[k]; - while (a--) - { - /* here i is the Huffman code of length k bits for value *p */ - /* make tables up to required level */ - while (k > w + l[h]) - { - w += l[h++]; /* add bits already decoded */ - - /* compute minimum size table less than or equal to *m bits */ - z = (z = g - w) > (unsigned)*m ? (unsigned) *m : z; /* upper limit */ - if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ - { /* too few codes for k-w bit table */ - f -= a + 1; /* deduct codes from patterns left */ - xp = c + k; - while (++j < z) /* try smaller tables up to z bits */ - { - if ((f <<= 1) <= *++xp) - break; /* enough codes to use up j bits */ - f -= *xp; /* else deduct codes from patterns */ - } - } - if ((unsigned)w + j > el && (unsigned)w < el) - j = el - w; /* make EOB code end at table */ - z = 1 << j; /* table entries for j-bit table */ - l[h] = j; /* set table size in stack */ - - /* allocate and link in new table */ - if ((q = (struct huft *)malloc((z + 1)*sizeof(struct huft))) == - (struct huft *)NULL) - { - if (h) - csz__huft_free(u[0]); - return 3; /* not enough memory */ - } - hufts += z + 1; /* track memory usage */ - *t = q + 1; /* link to list for huft_free() */ - *(t = &(q->v.t)) = (struct huft *)NULL; - u[h] = ++q; /* table starts after link */ - - /* connect to last table, if there is one */ - if (h) - { - x[h] = i; /* save pattern for backing up */ - r.b = (uch)l[h-1]; /* bits to dump before this table */ - r.e = (uch)(16 + j); /* bits in this table */ - r.v.t = q; /* pointer to this table */ - j = (i & ((1 << w) - 1)) >> (w - l[h-1]); - u[h-1][j] = r; /* connect to last table */ - } - } - - /* set up table entry in r */ - r.b = (uch)(k - w); - if (p >= v + n) - r.e = 99; /* out of values--invalid code */ - else if (*p < s) { - r.e = (uch)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */ - r.v.n = *p++; /* simple code is just the value */ - } else if(e && d) { - r.e = (uch)e[*p - s]; /* non-simple--look up in lists */ - r.v.n = d[*p++ - s]; - } else return 1; - - /* fill code-like entries with r */ - f = 1 << (k - w); - for (j = i >> w; j < z; j += f) - q[j] = r; - - /* backwards increment the k-bit code i */ - for (j = 1 << (k - 1); i & j; j >>= 1) - i ^= j; - i ^= j; - - /* backup over finished tables */ - while ((i & ((1 << w) - 1)) != x[h]) - w -= l[--h]; /* don't need to update q */ - } - } - - - /* return actual size of base table */ - *m = l[0]; - - - /* Return true (1) if we were given an incomplete table */ - return y != 0 && g != 1; -} - - - -int csz__huft_free(struct huft *t) -/* struct huft *t; table to free */ -/* Free the malloc'ed tables built by huft_build(), which makes a linked - list of the tables it made, with the links in a dummy first entry of - each table. */ -{ - /*register*/ struct huft *p, *q; - - - /* Go through linked list, freeing from the malloced (t[-1]) address. */ - p = t; - while (p != (struct huft *)NULL) - { - q = (--p)->v.t; - free(p); - p = q; - } - return 0; -} - - - -/*G.Barrand -#ifdef ASM_INFLATECODES -# define csz__Inflate_codes(tl,td,bl,bd) csz__Flate_codes(tl,td,bl,bd,(uch *)csz__slide) - int csz__Flate_codes(struct huft *, struct huft *, int, int, uch *); -#else -*/ - -int csz__Inflate_codes(struct huft *tl, struct huft *td, int bl, int bd) -/* struct huft *tl, *td; literal/length and distance decoder tables */ -/* int bl, bd; number of bits decoded by tl[] and td[] */ -/* inflate (decompress) the codes in a deflated (compressed) block. - Return an error code or zero if it all goes ok. */ -{ - /*register*/ unsigned e; /* table entry flag/number of extra bits */ - unsigned n, d; /* length and index for copy */ - unsigned w; /* current window position */ - struct huft *t; /* pointer to table entry */ - unsigned ml, md; /* masks for bl and bd bits */ - /*register*/ ulg b; /* bit buffer */ - /*register*/ unsigned k; /* number of bits in bit buffer */ - - - /* make local copies of globals */ - b = bb; /* initialize bit buffer */ - k = bk; - w = wp; /* initialize window position */ - - - /* inflate the coded data */ - ml = mask[bl]; /* precompute masks for speed */ - md = mask[bd]; - while (1) /* do until end of block */ - { - NEEDBITS((unsigned)bl) - if ((e = (t = tl + ((unsigned)b & ml))->e) > 16) - do { - if (e == 99) - return 1; - DUMPBITS(t->b) - e -= 16; - NEEDBITS(e) - } while ((e = (t = t->v.t + ((unsigned)b & mask[e]))->e) > 16); - DUMPBITS(t->b) - if (e == 16) /* then it's a literal */ - { - csz__slide[w++] = (uch)t->v.n; - if (w == WSIZE) - { - FLUSH(w); - w = 0; - } - } - else /* it's an EOB or a length */ - { - /* exit if end of block */ - if (e == 15) - break; - - /* get length of block to copy */ - NEEDBITS(e) - n = t->v.n + ((unsigned)b & mask[e]); - DUMPBITS(e); - - /* decode distance of block to copy */ - NEEDBITS((unsigned)bd) - if ((e = (t = td + ((unsigned)b & md))->e) > 16) - do { - if (e == 99) - return 1; - DUMPBITS(t->b) - e -= 16; - NEEDBITS(e) - } while ((e = (t = t->v.t + ((unsigned)b & mask[e]))->e) > 16); - DUMPBITS(t->b) - NEEDBITS(e) - d = w - t->v.n - ((unsigned)b & mask[e]); - DUMPBITS(e) - - /* do the copy */ - do { - n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); -#ifndef NOMEMCPY - if (w - d >= e) /* (this test assumes unsigned comparison) */ - { - memcpy(csz__slide + w, csz__slide + d, e); - w += e; - d += e; - } - else /* do it slow to avoid memcpy() overlap */ -#endif /* !NOMEMCPY */ - do { - csz__slide[w++] = csz__slide[d++]; - } while (--e); - if (w == WSIZE) - { - FLUSH(w); - w = 0; - } - } while (n); - } - } - - - /* restore the globals from the locals */ - wp = w; /* restore global window pointer */ - bb = b; /* restore global bit buffer */ - bk = k; - - - /* done */ - return 0; -} - -/*#endif G.Barrand*/ /* ASM_INFLATECODES */ - - - -int csz__Inflate_stored() -/* "decompress" an inflated type 0 (stored) block. */ -{ - unsigned n; /* number of bytes in block */ - unsigned w; /* current window position */ - /*register*/ ulg b; /* bit buffer */ - /*register*/ unsigned k; /* number of bits in bit buffer */ - - - /* make local copies of globals */ - Trace((stderr, "\nstored block")); - b = bb; /* initialize bit buffer */ - k = bk; - w = wp; /* initialize window position */ - - - /* go to byte boundary */ - n = k & 7; - DUMPBITS(n); - - - /* get the length and its complement */ - NEEDBITS(16) - n = ((unsigned)b & 0xffff); - DUMPBITS(16) - NEEDBITS(16) - if (n != (unsigned)((~b) & 0xffff)) - return 1; /* error in compressed data */ - DUMPBITS(16) - - - /* read and output the compressed data */ - while (n--) - { - NEEDBITS(8) - csz__slide[w++] = (uch)b; - if (w == WSIZE) - { - FLUSH(w); - w = 0; - } - DUMPBITS(8) - } - - - /* restore the globals from the locals */ - wp = w; /* restore global window pointer */ - bb = b; /* restore global bit buffer */ - bk = k; - return 0; -} - - -/* Globals for literal tables (built once) */ -struct huft *csz__fixed_tl = (struct huft *)NULL; -struct huft *csz__fixed_td; -int csz__fixed_bl, csz__fixed_bd; - -int csz__Inflate_fixed() -/* decompress an inflated type 1 (fixed Huffman codes) block. We should - either replace this with a custom decoder, or at least precompute the - Huffman tables. */ -{ - /* if first time, set up tables for fixed blocks */ - Trace((stderr, "\nliteral block")); - if (csz__fixed_tl == (struct huft *)NULL) - { - int i; /* temporary variable */ - static unsigned l[288]; /* length list for huft_build */ - - /* literal table */ - for (i = 0; i < 144; i++) - l[i] = 8; - for (; i < 256; i++) - l[i] = 9; - for (; i < 280; i++) - l[i] = 7; - for (; i < 288; i++) /* make a complete, but wrong code set */ - l[i] = 8; - csz__fixed_bl = 7; - if ((i = csz__huft_build(l, 288, 257, cplens, cplext, - &csz__fixed_tl, &csz__fixed_bl)) != 0) - { - csz__fixed_tl = (struct huft *)NULL; - return i; - } - - /* distance table */ - for (i = 0; i < 30; i++) /* make an incomplete code set */ - l[i] = 5; - csz__fixed_bd = 5; - if ((i = csz__huft_build(l, 30, 0, cpdist, cpdext, &csz__fixed_td, &csz__fixed_bd)) > 1) - { - csz__huft_free(csz__fixed_tl); - csz__fixed_tl = (struct huft *)NULL; - return i; - } - } - - - /* decompress until an end-of-block code */ - return csz__Inflate_codes(csz__fixed_tl, csz__fixed_td, csz__fixed_bl, csz__fixed_bd) != 0; -} - - - -int csz__Inflate_dynamic() -/* decompress an inflated type 2 (dynamic Huffman codes) block. */ -{ - int i; /* temporary variables */ - unsigned j; - unsigned l; /* last length */ - unsigned m; /* mask for bit lengths table */ - unsigned n; /* number of lengths to get */ - struct huft *tl; /* literal/length code table */ - struct huft *td; /* distance code table */ - int bl; /* lookup bits for tl */ - int bd; /* lookup bits for td */ - unsigned nb; /* number of bit length codes */ - unsigned nl; /* number of literal/length codes */ - unsigned nd; /* number of distance codes */ -#ifdef PKZIP_BUG_WORKAROUND - static unsigned ll[288+32]; /* literal/length and distance code lengths */ -#else - static unsigned ll[286+30]; /* literal/length and distance code lengths */ -#endif - /*register*/ ulg b; /* bit buffer */ - /*register*/ unsigned k; /* number of bits in bit buffer */ - - static int qflag = 0; /*G.Barrand*/ - - /* make local bit buffer */ - Trace((stderr, "\ndynamic block")); - b = bb; - k = bk; - - - /* read in table lengths */ - NEEDBITS(5) - nl = 257 + ((unsigned)b & 0x1f); /* number of literal/length codes */ - DUMPBITS(5) - NEEDBITS(5) - nd = 1 + ((unsigned)b & 0x1f); /* number of distance codes */ - DUMPBITS(5) - NEEDBITS(4) - nb = 4 + ((unsigned)b & 0xf); /* number of bit length codes */ - DUMPBITS(4) -#ifdef PKZIP_BUG_WORKAROUND - if (nl > 288 || nd > 32) -#else - if (nl > 286 || nd > 30) -#endif - return 1; /* bad lengths */ - - - /* read in bit-length-code lengths */ - for (j = 0; j < nb; j++) - { - NEEDBITS(3) - ll[border[j]] = (unsigned)b & 7; - DUMPBITS(3) - } - for (; j < 19; j++) - ll[border[j]] = 0; - - - /* build decoding table for trees--single level, 7 bit lookup */ - bl = 7; - if ((i = csz__huft_build(ll, 19, 19, NULL, NULL, &tl, &bl)) != 0) - { - if (i == 1) - csz__huft_free(tl); - return i; /* incomplete code set */ - } - -/*G.Barrand : to quiet Coverity : */ -#define NEEDBITS_free_tl(n) {while(k<(n)){if(ibufcnt-- <= 0){csz__huft_free(tl);return 1;} b|=((ulg) *ibufptr++)<b; - DUMPBITS(j) - j = td->v.n; - if (j < 16) /* length of code in bits (0..15) */ - ll[i++] = l = j; /* save last length in l */ - else if (j == 16) /* repeat last length 3 to 6 times */ - { - NEEDBITS_free_tl(2) - j = 3 + ((unsigned)b & 3); - DUMPBITS(2) - if ((unsigned)i + j > n) { - csz__huft_free(tl); /*G.Barrand : quiet Coverity*/ - return 1; - } - while (j--) - ll[i++] = l; - } - else if (j == 17) /* 3 to 10 zero length codes */ - { - NEEDBITS_free_tl(3) - j = 3 + ((unsigned)b & 7); - DUMPBITS(3) - if ((unsigned)i + j > n){ - csz__huft_free(tl); /*G.Barrand : quiet Coverity*/ - return 1; - } - while (j--) - ll[i++] = 0; - l = 0; - } - else /* j == 18: 11 to 138 zero length codes */ - { - NEEDBITS_free_tl(7) - j = 11 + ((unsigned)b & 0x7f); - DUMPBITS(7) - if ((unsigned)i + j > n) { - csz__huft_free(tl); /*G.Barrand : quiet Coverity*/ - return 1; - } - while (j--) - ll[i++] = 0; - l = 0; - } - } - - - /* free decoding table for trees */ - csz__huft_free(tl); - - - /* restore the global bit buffer */ - bb = b; - bk = k; - - - /* build the decoding tables for literal/length and distance codes */ - bl = lbits; - if ((i = csz__huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) - { - if (i == 1 && !qflag) { - FPRINTF(stderr, "(incomplete l-tree) "); - csz__huft_free(tl); - } - return i; /* incomplete code set */ - } - bd = dbits; - if ((i = csz__huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) - { - if (i == 1 && !qflag) { - FPRINTF(stderr, "(incomplete d-tree) "); -#ifdef PKZIP_BUG_WORKAROUND - i = 0; - } -#else - csz__huft_free(td); - } - csz__huft_free(tl); - return i; /* incomplete code set */ -#endif - } - - - /* decompress until an end-of-block code */ - if (csz__Inflate_codes(tl, td, bl, bd)) - return 1; - - - /* free the decoding tables, return */ - csz__huft_free(tl); - csz__huft_free(td); - return 0; -} - - - -int csz__Inflate_block(int *e) -/* int *e; last block flag */ -/* decompress an inflated block */ -{ - unsigned t; /* block type */ - /*register*/ ulg b; /* bit buffer */ - /*register*/ unsigned k; /* number of bits in bit buffer */ - - - /* make local bit buffer */ - b = bb; - k = bk; - - - /* read in last block bit */ - NEEDBITS(1) - *e = (int)b & 1; - DUMPBITS(1) - - - /* read in block type */ - NEEDBITS(2) - t = (unsigned)b & 3; - DUMPBITS(2) - - - /* restore the global bit buffer */ - bb = b; - bk = k; - - - /* inflate that block type */ - if (t == 2) - return csz__Inflate_dynamic(); - if (t == 0) - return csz__Inflate_stored(); - if (t == 1) - return csz__Inflate_fixed(); - - - /* bad block type */ - return 2; -} - -#ifdef __cplusplus /*G.Barrand*/ -extern "C" { -#endif - -int csz__Inflate() -/* decompress an inflated entry */ -{ - int e; /* last block flag */ - int r; /* result code */ - unsigned h; /* maximum struct huft's malloc'ed */ - - - /* initialize window, bit buffer */ - wp = 0; - bk = 0; - bb = 0; - - - /* decompress until the last block */ - h = 0; - do { - hufts = 0; - if ((r = csz__Inflate_block(&e)) != 0) - return r; - if (hufts > h) - h = hufts; - } while (!e); - - - /* flush out slide */ - FLUSH(wp); - - - /* return success */ - Trace((stderr, "\n%lu bytes in Huffman tables (%lu/entry)\n", - h * sizeof(struct huft), sizeof(struct huft))); - return 0; -} - -int csz__Inflate_free() -{ - if (csz__fixed_tl != (struct huft *)NULL) - { - csz__huft_free(csz__fixed_td); - csz__huft_free(csz__fixed_tl); - csz__fixed_td = csz__fixed_tl = (struct huft *)NULL; - } - return 0; -} - -/* G.Barrand */ -void csz__Init_Inflate(long a_ibufcnt,unsigned char* a_ibufptr, - long a_obufcnt,unsigned char* a_obufptr) { - ibufcnt = a_ibufcnt; - ibufptr = a_ibufptr; - - obufcnt = a_obufcnt; - obufptr = a_obufptr; -} -unsigned char* csz__obufptr() {return obufptr;} - -#ifdef __cplusplus /*G.Barrand*/ -} -#endif - -#ifndef CHECK_EOF -static int csz__ReadByte () -{ - int k; - if(ibufcnt-- <= 0) - k = -1; - else - k = *ibufptr++; - return k; -} -#endif - -static void csz__WriteData(int n) -{ - if( obufcnt >= n ) memcpy(obufptr, csz__slide, n); - obufptr += n; - obufcnt -= n; -} - diff --git a/source/externals/g4tools/src/dummy.cc b/source/externals/g4tools/src/dummy.cc new file mode 100644 index 0000000000..f67b6698d0 --- /dev/null +++ b/source/externals/g4tools/src/dummy.cc @@ -0,0 +1,7 @@ +// +// Guy Barrand 8 October 2021. +// +// Dummy file so that Geant4/cmake can build a module for g4tools. +// + +bool g4tools_dummy_function() {return true;} diff --git a/source/externals/ptl/.clang-tidy b/source/externals/ptl/.clang-tidy deleted file mode 100644 index 175a5e32f2..0000000000 --- a/source/externals/ptl/.clang-tidy +++ /dev/null @@ -1,40 +0,0 @@ ---- -Checks: "-*,\ -google-readability-casting,\ -misc-*,\ --misc-incorrect-roundings,\ --misc-macro-parentheses,\ --misc-misplaced-widening-cast,\ --misc-static-assert,\ -modernize-*,\ --modernize-deprecated-headers,\ --modernize-pass-by-value,\ --modernize-raw-string-literal,\ --modernize-return-braced-init-list,\ --modernize-use-auto,\ --modernize-use-default-member-init,\ --modernize-use-emplace,\ --modernize-use-equals-default,\ --modernize-use-equals-delete,\ --modernize-use-noexcept,\ --modernize-use-transparent-functors,\ --modernize-use-using,\ -performance-*,\ --performance-inefficient-string-concatenation,\ -readability-*,\ --readability-function-size,\ --readability-identifier-naming,\ --readability-implicit-bool-cast,\ --readability-inconsistent-declaration-parameter-name,\ --readability-named-parameter,\ --readability-redundant-declaration,\ --readability-redundant-member-init,\ --readability-simplify-boolean-expr,\ -" -HeaderFilterRegex: 'source/[^/]*\.(hh|cc)$' -CheckOptions: - - key: readability-braces-around-statements.ShortStatementLines - value: '2' - - key: readability-implicit-bool-conversion.AllowPointerConditions - value: '1' -... diff --git a/source/externals/ptl/History b/source/externals/ptl/History index 9a1fba40e8..e150fd66a7 100644 --- a/source/externals/ptl/History +++ b/source/externals/ptl/History @@ -16,6 +16,9 @@ committal in the code repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +21 September 2021 - G. Amadio (ptl-V10-07-08) +- Fix C++20 warnings from GCC 11.2.0. + 6 June 2021 - J. Madsen (ptl-V10-07-07) - Fix to TaskRunManager::Terminate() + nullptr to m_thread_pool (causes seg-fault when ui/viz inited but run not inited) diff --git a/source/externals/ptl/README.md b/source/externals/ptl/README.md deleted file mode 100644 index 8a23b02af9..0000000000 --- a/source/externals/ptl/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Parallel Tasking Library (PTL) -Lightweight C++11 multithreading tasking system featuring thread-pool, task-groups, and lock-free task queue diff --git a/source/externals/ptl/include/PTL/TaskGroup.icc b/source/externals/ptl/include/PTL/TaskGroup.icc index 0826b565fc..30eb9cecdd 100644 --- a/source/externals/ptl/include/PTL/TaskGroup.icc +++ b/source/externals/ptl/include/PTL/TaskGroup.icc @@ -68,7 +68,7 @@ TaskGroup::~TaskGroup() if(m_tbb_task_group) { auto* _arena = m_pool->get_task_arena(); - _arena->execute([=]() { m_tbb_task_group->wait(); }); + _arena->execute([this]() { this->m_tbb_task_group->wait(); }); } delete m_tbb_task_group; this->clear(); @@ -95,7 +95,7 @@ TaskGroup::wait() if(m_tbb_task_group) { auto* _arena = m_pool->get_task_arena(); - _arena->execute([=]() { m_tbb_task_group->wait(); }); + _arena->execute([this]() { this->m_tbb_task_group->wait(); }); } } }; diff --git a/source/externals/ptl/include/PTL/ThreadPool.hh b/source/externals/ptl/include/PTL/ThreadPool.hh index 8b48b50620..6fb6c15127 100644 --- a/source/externals/ptl/include/PTL/ThreadPool.hh +++ b/source/externals/ptl/include/PTL/ThreadPool.hh @@ -355,7 +355,7 @@ ThreadPool::run_on_this(task_pointer&& _task) if(m_tbb_tp && m_tbb_task_group) { auto _arena = get_task_arena(); - _arena->execute([=]() { m_tbb_task_group->run(_func); }); + _arena->execute([this, _func]() { this->m_tbb_task_group->run(_func); }); } else { diff --git a/source/externals/zlib/History b/source/externals/zlib/History index 275aa06ba6..259ca1d1ff 100644 --- a/source/externals/zlib/History +++ b/source/externals/zlib/History @@ -19,6 +19,9 @@ committal in the CVS repository ! History file for G4 zlib package -------------------------------- +29 June 2021 Ben Morgan (zlib-V10-07-01) +- Remove formatting options from build + 23 February 2021 Ben Morgan (zlib-V10-07-00) - Use separate genexes in G4zlib include directories to prevent parsing issues diff --git a/source/externals/zlib/README b/source/externals/zlib/README deleted file mode 100644 index d756ff44eb..0000000000 --- a/source/externals/zlib/README +++ /dev/null @@ -1,157 +0,0 @@ -Gunter Folger - 12 June 2018 -============================ -- Switch to original zlib sources, using zlib 1.2.11. Use C as compiler. - Keep sources.cmake, this has most of zlib CMakeLists.txt code. - -Gunter Folger - 17 June 2015 -============================ -- Update to zlib-1.2.8, keeping Geant4 specific structure of files. - Compare files to new zlib, and transfer changes, keeping local - modifications, like function declarationss, and removed register keyword. - - -Gunter Folger - 27-March 2013 -============================= -Update to zlib 1.2.7 -Again, rename source files to .cc. -Add files for reading zlib format, i.e. zlib is now complete. -Re-modify functions to compile with C++ compiler, "type-name" rather than -"name { type" in all .cc code. -In {gzlib,gzread,gzwrite}.cc, introduced several casts to avoid compile error for invalid -converion -- May 2013: -Adapt to Geant4 cmake; copied portions of zlib CMakeLists.tzt to sources.cmake, -using standard G4 CMakeLists.txt. Private header are in src, include only has -zlib.h; zconf.h is configured and put into build tree; these two header files -are installed. - -Mark Donszelmann - 4 May 2005 -============================= -Files renamed to .cc -Removed all files for reading zlib format. -Functions were modified to compile with C++ compiler, "type-name" rather than -"name { type", in: - -adler32.cc, compress.cc, crc32.cc, deflate.cc, trees.cc - -In: deflate.cc and trees.cc all strings are casted to (char*) to avoid warnings. -============================================================= - - -Original zlib README: -===================== -ZLIB DATA COMPRESSION LIBRARY - -zlib 1.2.7 is a general purpose data compression library. All the code is -thread safe. The data format used by the zlib library is described by RFCs -(Request for Comments) 1950 to 1952 in the files -http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and -rfc1952 (gzip format). - -All functions of the compression library are documented in the file zlib.h -(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example -of the library is given in the file test/example.c which also tests that -the library is working correctly. Another example is given in the file -test/minigzip.c. The compression library itself is composed of all source -files in the root directory. - -To compile all files and run the test program, follow the instructions given at -the top of Makefile.in. In short "./configure; make test", and if that goes -well, "make install" should work for most flavors of Unix. For Windows, use -one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use -make_vms.com. - -Questions about zlib should be sent to , or to Gilles Vollant - for the Windows DLL version. The zlib home page is -http://zlib.net/ . Before reporting a problem, please check this site to -verify that you have the latest version of zlib; otherwise get the latest -version and check whether the problem still exists or not. - -PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. - -Mark Nelson wrote an article about zlib for the Jan. 1997 -issue of Dr. Dobb's Journal; a copy of the article is available at -http://marknelson.us/1997/01/01/zlib-engine/ . - -The changes made in version 1.2.7 are documented in the file ChangeLog. - -Unsupported third party contributions are provided in directory contrib/ . - -zlib is available in Java using the java.util.zip package, documented at -http://java.sun.com/developer/technicalArticles/Programming/compression/ . - -A Perl interface to zlib written by Paul Marquess is available -at CPAN (Comprehensive Perl Archive Network) sites, including -http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . - -A Python interface to zlib written by A.M. Kuchling is -available in Python 1.5 and later versions, see -http://docs.python.org/library/zlib.html . - -zlib is built into tcl: http://wiki.tcl.tk/4610 . - -An experimental package to read and write files in .zip format, written on top -of zlib by Gilles Vollant , is available in the -contrib/minizip directory of zlib. - - -Notes for some targets: - -- For Windows DLL versions, please see win32/DLL_FAQ.txt - -- For 64-bit Irix, deflate.c must be compiled without any optimization. With - -O, one libpng test fails. The test works in 32 bit mode (with the -n32 - compiler flag). The compiler bug has been reported to SGI. - -- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works - when compiled with cc. - -- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is - necessary to get gzprintf working correctly. This is done by configure. - -- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with - other compilers. Use "make test" to check your compiler. - -- gzdopen is not supported on RISCOS or BEOS. - -- For PalmOs, see http://palmzlib.sourceforge.net/ - - -Acknowledgments: - - The deflate format used by zlib was defined by Phil Katz. The deflate and - zlib specifications were written by L. Peter Deutsch. Thanks to all the - people who reported problems and suggested various improvements in zlib; they - are too numerous to cite here. - -Copyright notice: - - (C) 1995-2012 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - -If you use the zlib library in a product, we would appreciate *not* receiving -lengthy legal documents to sign. The sources are provided for free but without -warranty of any kind. The library has been entirely written by Jean-loup -Gailly and Mark Adler; it does not include third-party code. - -If you redistribute modified sources, we would appreciate that you include in -the file ChangeLog history information documenting your changes. Please read -the FAQ for more information on the distribution of modified source versions. diff --git a/source/externals/zlib/sources.cmake b/source/externals/zlib/sources.cmake index 71410b8e94..a957bfdc23 100644 --- a/source/externals/zlib/sources.cmake +++ b/source/externals/zlib/sources.cmake @@ -126,10 +126,6 @@ GEANT4_DEFINE_MODULE(NAME G4zlib ${ZLIB_PUBLIC_HDRS} SOURCES ${ZLIB_SRCS} - HEADERS_EXCLUDE_FORMAT - ${ZLIB_PUBLIC_HDRS} - SOURCES_EXCLUDE_FORMAT - ${ZLIB_SRCS} GRANULAR_DEPENDENCIES GLOBAL_DEPENDENCIES LINK_LIBRARIES diff --git a/source/g3tog4/History b/source/g3tog4/History index 0687eb30b2..b1da385505 100644 --- a/source/g3tog4/History +++ b/source/g3tog4/History @@ -2,6 +2,18 @@ G3toG4 Modification History (reverse chronological order, please !) -------------------------------------------------------------------- +g3tog4-V10-07-04 15-November-2021 I.Hrivnacova +- Fixed Coverity: uninitialized variable in G3EleTable.cc + +g3tog4-V10-07-03 25-October-2021 B.Morgan +- Use G4StrUtil functions replacing deprecated G4String member functions + +g3tog4-V10-07-02 18-October-2021 B.Morgan +- Use std::string member functions from G4String in place of synonyms + +g3tog4-V10-07-01 29-June-2021 G.Cosmo +- Fixed compilation error in G3EleTable when c++20 is enabled. + g3tog4-V10-07-00 1-April-2021 B.Morgan - Migrate build to modular CMake API diff --git a/source/g3tog4/README b/source/g3tog4/README deleted file mode 100644 index b85d1b2c25..0000000000 --- a/source/g3tog4/README +++ /dev/null @@ -1,105 +0,0 @@ -G3toG4 ------- - -G3toG4 is the Geant4 facility to convert Geant3 geometries into Geant4. -This is done in two stages. - -First, the user supplies a Geant3 .rz file containing the initialization -data structures. An executable, rztog4, reads this file and produces an -ascii ("call list") file containing instructions on how to build the -geometry. The source code for this is fortran. - -Second, a call list interpreter (G4BuildGeom.cc) reads these instructions -and builds the geometry in the user's G4 client code. - -Two examples of how to use the call list interpreter are supplied in -examples/extended/g3tog4: - - the first example, cltog4, is a simple example which simply invokes the - call list interpreter method G4BuildGeom from G3toG4DetectorConstruction - class, builds the geometry and exits. - - the second example, clGeometry, is more complete and is patterned after - the novice G4 examples. It also invokes the call list interpreter, but - in addition, allows the geometry to be visualized and particles to be - tracked. Currently, G3toG4 does not provide a method for scoring hits - in G4. - -To build these examples, especially the one involving visualization, the -user must have one or more of the following environment variables set: - -setenv G4VIS_BUILD__DRIVER -setenv G4VIS_USE_ - -where the G4-supported drivers are listed in source/visualization/README. - -To use the freeware Mesa API, you must have the environment variable -OGLHOME defined to point to the directory containing the Mesa lib/ directory -specific to your platform. - -To compile and build the G3toG4 libraries, simply type - -gmake - -from the top-level G3toG4 directory. - -To build the converter executable "rztog4", simply type - -gmake bin - -To make everything, simply type: - -gmake global - -To remove all G3toG4 libraries, executables and .d files, simply type - -gmake clean - - the implementation (April 1999) ----------------------------------------- -- PGON, PCON are built using the CSG classes G4Polycone and G4Polyhedra. -- G3 MANY feature has not been tested. -- GsROTM is fully implemented and supports rotations and mirror reflections -- GSPOSP implemented via individual logical volumes for each instantiation - (G4PVIndexed doesn't exist yet) -- GSDV* routines for dividing volumes implemented, using - G4PVReplicas, G4PVParametrised -- GSROTM is implemented -- hits are not implemented. Hit code is do-nothing. (It is - coded up, but hit class references are commented out.) - The digits+hits code has to be updated before G3toG4's - hit code can be activated. -- GSPART has to be updated. -- Usage of magnetic field class has to be turned on. - - the implementation (February 2001) ----------------------------------------- -- Supported shapes: all G3 shapes except for - "HYPE", "GTRA", "CTUB" -- G3 MANY feature is not supported. -- GSDV* routines for dividing volumes 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 - Unsupported shapes: - "SPHE", "ELTU", "HYPE", "GTRA", "CTUB" - - the implementation (November 2001) ----------------------------------------- -- Support for G3 MANY feature: - - MANY positions are resolved in G3toG4MANY function, - which has to be processed before G3toG4BuildTree - (it is not called by default). - In order to resolve MANY user code has to provide - additional info using G4gsbool(G4String volName, G4String manyVolName) - function) for all overlapping volumes. Daughters of - overlapping volumes are then resolved automatically - and should not be specified via Gsbool. - - Limitation: a volume with a MANY position can have only this - one position; if more than one position is needed a new volume - has to be defined (gsvolu) for each position. - -See History file for modification history. diff --git a/source/g3tog4/src/G3EleTable.cc b/source/g3tog4/src/G3EleTable.cc index cecc494b20..580c53c09f 100644 --- a/source/g3tog4/src/G3EleTable.cc +++ b/source/g3tog4/src/G3EleTable.cc @@ -49,13 +49,18 @@ G3EleTable::~G3EleTable(){ G4Element* G3EleTable::GetEle(G4double Z){ - G4double A; + G4double A = 0.; char name[20], sym[3]; G4int index = (G4int) Z-1; if (!parse(Z, name, sym, A)) { G4String na(name); G4String sy(sym); if (_Ele[index] == 0) { + if ( A == 0. ) { + // Cannot create element with A = 0. + G4String text = "Failed to get element Z = " + std::to_string(Z); + G4Exception("G3EleTable::GetEle", "G3toG40016", FatalException, text); + } // add an element to the element table here _Ele[index] = new G4Element(na, sy, Z, A*g/mole); } @@ -68,8 +73,17 @@ G3EleTable::parse(G4double& Z, char* name, char* sym, G4double& A){ G4int rc = 0; if (Z>0 && Z <=_MaxEle){ G4int z = (G4int) Z-1; - std::istringstream in(_EleNames[z]); - in >> name >> sym >> A; + G4String str(_EleNames[z]); + char* cstr = new char [str.length()+1]; + std::strcpy(cstr, str.c_str()); + char* p = std::strtok(cstr," "); + std::strcpy(name, p); + p = std::strtok(NULL," "); + std::strcpy(sym, p); + p = std::strtok(NULL," "); + std::istringstream in(p); + in >> A; + delete [] cstr; } else { rc = -1; } diff --git a/source/g3tog4/src/G3VolTableEntry.cc b/source/g3tog4/src/G3VolTableEntry.cc index 74f5503559..b579062969 100644 --- a/source/g3tog4/src/G3VolTableEntry.cc +++ b/source/g3tog4/src/G3VolTableEntry.cc @@ -339,8 +339,8 @@ G3VolTableEntry* G3VolTableEntry::GetMasterClone(){ G3VolTableEntry* master; G4String name = fVname; - if (name.contains(gSeparator)) { - name = name(0, name.first(gSeparator)); + if (G4StrUtil::contains(name, gSeparator)) { + name = name.substr(0, name.find(gSeparator)); master = G3Vol.GetVTE(name); } else diff --git a/source/g3tog4/src/G4gsdvn.cc b/source/g3tog4/src/G4gsdvn.cc index 96bb0c09c1..0050f91e4d 100644 --- a/source/g3tog4/src/G4gsdvn.cc +++ b/source/g3tog4/src/G4gsdvn.cc @@ -64,7 +64,8 @@ void G4CreateCloneVTEWithDivision(G4String vname, G3VolTableEntry* mvte, G4String newName = vname; if (i>0) { char index[12]; sprintf(index, "%d", i); - newName.append(gSeparator); newName = newName + index; + newName += gSeparator; + newName = newName + index; } // create new VTE with 0 solid diff --git a/source/g3tog4/src/G4gsmate.cc b/source/g3tog4/src/G4gsmate.cc index 3699b32ff6..fb0535879c 100644 --- a/source/g3tog4/src/G4gsmate.cc +++ b/source/g3tog4/src/G4gsmate.cc @@ -113,7 +113,7 @@ void G4gsmate(G4int imate, G4String name, G4double ain, G4double zin, G4Material* material=0; - G4String sname = name.strip(G4String::both); + G4String sname = G4StrUtil::strip_copy(name); if (sname == "AIR") { // handle the built in AIR mixture G4double aa[2], zz[2], wmat[2]; diff --git a/source/g3tog4/src/G4gsposp.cc b/source/g3tog4/src/G4gsposp.cc index a2ac808159..a998f54e23 100644 --- a/source/g3tog4/src/G4gsposp.cc +++ b/source/g3tog4/src/G4gsposp.cc @@ -144,7 +144,8 @@ void G4CloneDaughters(G3VolTableEntry* vte, G3VolTableEntry* vteClone) G4int cloneNo = dvteMaster->GetNoClones(); char index[5]; sprintf(index,"%d",cloneNo); G4String newName = dvteMaster->GetName(); - newName.append(gSeparator); newName = newName + index; + newName += gSeparator; + newName = newName + index; // create dvteClone G4String dvteShape = dvte->GetShape(); @@ -268,7 +269,8 @@ void G4CreateCloneVTE(G3VolTableEntry* vte, G3VolTableEntry* mvte, G4int cloneNo = vte->GetNoClones(); char index[5]; sprintf(index,"%d",cloneNo); G4String newName = vte->GetName(); - newName.append(gSeparator); newName = newName + index; + newName += gSeparator; + newName = newName + index; // update vteClone vteClone->SetName(newName); diff --git a/source/g3tog4/src/clparse.cc b/source/g3tog4/src/clparse.cc index e0f3f28d39..78e3fe774a 100644 --- a/source/g3tog4/src/clparse.cc +++ b/source/g3tog4/src/clparse.cc @@ -115,7 +115,7 @@ void G3CLRead(G4String & fname, char *select = 0) G4int ntokens = 0; std::ifstream istr(fname); - while (line.readLine(istr) && ! istr.eof()) + while (G4StrUtil::readline(istr, line) && ! istr.eof()) { count++; ntokens = G3CLTokens(&line,tokens); // tokenize the line @@ -146,7 +146,7 @@ G4int G3CLTokens(G4String *line, G4String tokens[]) G4int itok = 0; G4int ntokens = 0; G4String token1, token2; - while (!(token1=next("\"")).isNull()) + while (!(token1=next("\"")).empty()) { itok++; if (itok%2 == 0 ) // even: inside a string @@ -156,7 +156,7 @@ G4int G3CLTokens(G4String *line, G4String tokens[]) else // not in a quoted string: finish tokenization { G4Tokenizer lev2(token1); - while (!(token2=lev2()).isNull()) + while (!(token2=lev2()).empty()) { tokens[ntokens] = token2; ntokens++; diff --git a/source/geometry/biasing/History b/source/geometry/biasing/History index 3074678337..ce42dc19e4 100644 --- a/source/geometry/biasing/History +++ b/source/geometry/biasing/History @@ -16,6 +16,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +December 1st, 2021 B.Morgan (geombias-V10-07-01) +- Add missing include of G4Threading header for G4Mutex + March 30th, 2021 B.Morgan (geombias-V10-07-00) - Migrate sources.cmake to modular build API diff --git a/source/geometry/biasing/include/G4ImportanceAlgorithm.hh b/source/geometry/biasing/include/G4ImportanceAlgorithm.hh index f1b5b9e857..7b970c3ea6 100644 --- a/source/geometry/biasing/include/G4ImportanceAlgorithm.hh +++ b/source/geometry/biasing/include/G4ImportanceAlgorithm.hh @@ -35,6 +35,7 @@ #ifndef G4IMPORTANCEALGORITHM_HH #define G4IMPORTANCEALGORITHM_HH 1 +#include "G4Threading.hh" #include "G4VImportanceAlgorithm.hh" class G4ImportanceAlgorithm : public G4VImportanceAlgorithm diff --git a/source/geometry/divisions/GNUmakefile b/source/geometry/divisions/GNUmakefile index 187e33098d..7f0a35bb74 100644 --- a/source/geometry/divisions/GNUmakefile +++ b/source/geometry/divisions/GNUmakefile @@ -17,7 +17,8 @@ CPPFLAGS += \ -I$(G4BASE)/graphics_reps/include \ -I$(G4BASE)/geometry/solids/CSG/include \ -I$(G4BASE)/geometry/solids/specific/include \ - -I$(G4BASE)/geometry/management/include + -I$(G4BASE)/geometry/management/include \ + -I$(G4BASE)/geometry/volumes/include ifdef G4DIVDEBUG CPPFLAGS += -DG4DIVDEBUG diff --git a/source/geometry/divisions/History b/source/geometry/divisions/History index 7b80f6382f..b23ad84716 100644 --- a/source/geometry/divisions/History +++ b/source/geometry/divisions/History @@ -16,6 +16,23 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +October 29th, 2021 G.Cosmo (geomdiv-V10-07-04) +- G4ReplicatedSlice: added protection against null pointer for mother + physical-volume in constructor. + +October 14th, 2021 G.Cosmo (geomdiv-V10-07-03) +- Make G4PVDivision and G4ReplicatedSlice inherit from G4PVReplica + rather than G4VPhysicalVolume, in order to have instances properly + cloned in MT mode. Coworks with "geomvol-V10-07-05". + +September 24th, 2021 P.Arce (geomdiv-V10-07-02) +- Fix bug in G4ParameterisationTrd for division along X. + Debug messages cleaning. + +August 18th, 2021 G.Cosmo (geomdiv-V10-07-01) +- Bring internal interactive test for divisions up-to-date. + No functional changes. + March 30th, 2021 B.Morgan (geomdiv-V10-07-00) - Migrate sources.cmake to modular build API diff --git a/source/geometry/divisions/include/G4PVDivision.hh b/source/geometry/divisions/include/G4PVDivision.hh index 89b467e86c..d383968393 100644 --- a/source/geometry/divisions/include/G4PVDivision.hh +++ b/source/geometry/divisions/include/G4PVDivision.hh @@ -65,13 +65,13 @@ #define G4PVDIVISION_HH #include "geomdefs.hh" -#include "G4VPhysicalVolume.hh" +#include "G4PVReplica.hh" #include "G4VDivisionParameterisation.hh" class G4LogicalVolume; class G4VSolid; -class G4PVDivision : public G4VPhysicalVolume +class G4PVDivision : public G4PVReplica { public: // with description @@ -115,8 +115,6 @@ class G4PVDivision : public G4VPhysicalVolume G4PVDivision& operator=(const G4PVDivision&) = delete; virtual G4bool IsMany() const; - virtual G4int GetCopyNo() const; - virtual void SetCopyNo(G4int CopyNo); virtual G4bool IsReplicated() const; virtual G4int GetMultiplicity() const; virtual G4VPVParameterisation* GetParameterisation() const; @@ -159,7 +157,6 @@ class G4PVDivision : public G4VPhysicalVolume EAxis fdivAxis; // axis of division G4int fnReplicas = 0; G4double fwidth = 0.0, foffset = 0.0; - G4int fcopyNo = -1; G4VDivisionParameterisation* fparam = nullptr; }; diff --git a/source/geometry/divisions/include/G4ParameterisationTrd.hh b/source/geometry/divisions/include/G4ParameterisationTrd.hh index 557db12412..cde01cb37d 100644 --- a/source/geometry/divisions/include/G4ParameterisationTrd.hh +++ b/source/geometry/divisions/include/G4ParameterisationTrd.hh @@ -81,8 +81,6 @@ class G4ParameterisationTrdX : public G4VParameterisationTrd G4VSolid* motherSolid, DivisionType divType ); ~G4ParameterisationTrdX(); - void CheckParametersValidity(); - G4double GetMaxParameter() const; void ComputeTransformation(const G4int copyNo, @@ -92,11 +90,8 @@ class G4ParameterisationTrdX : public G4VParameterisationTrd const G4VPhysicalVolume* pv) const; void ComputeDimensions(G4Trap& trd, const G4int copyNo, - const G4VPhysicalVolume* pv) const; + const G4VPhysicalVolume* pv) const; - G4VSolid* ComputeSolid(const G4int, G4VPhysicalVolume *); - - private: // Dummy declarations to get rid of warnings ... void ComputeDimensions (G4Cons&,const G4int, @@ -121,8 +116,6 @@ class G4ParameterisationTrdX : public G4VParameterisationTrd const G4VPhysicalVolume*) const {} void ComputeDimensions (G4Polyhedra&,const G4int, const G4VPhysicalVolume*) const {} - - void ComputeTrapParams(); }; @@ -135,8 +128,6 @@ class G4ParameterisationTrdY : public G4VParameterisationTrd G4VSolid* motherSolid, DivisionType divType ); ~G4ParameterisationTrdY(); - void CheckParametersValidity(); - G4double GetMaxParameter() const; void ComputeTransformation(const G4int copyNo, @@ -145,6 +136,9 @@ class G4ParameterisationTrdY : public G4VParameterisationTrd void ComputeDimensions(G4Trd& trd, const G4int copyNo, const G4VPhysicalVolume* pv) const; + void ComputeDimensions (G4Trap&,const G4int, + const G4VPhysicalVolume*) const; + private: // Dummy declarations to get rid of warnings ... void ComputeDimensions (G4Cons&,const G4int, @@ -161,8 +155,6 @@ class G4ParameterisationTrdY : public G4VParameterisationTrd const G4VPhysicalVolume*) const {} void ComputeDimensions (G4Para&,const G4int, const G4VPhysicalVolume*) const {} - void ComputeDimensions (G4Trap&,const G4int, - const G4VPhysicalVolume*) const {} void ComputeDimensions (G4Hype&,const G4int, const G4VPhysicalVolume*) const {} void ComputeDimensions (G4Tubs&,const G4int, diff --git a/source/geometry/divisions/include/G4ReplicatedSlice.hh b/source/geometry/divisions/include/G4ReplicatedSlice.hh index e134ea945f..a871e7d865 100644 --- a/source/geometry/divisions/include/G4ReplicatedSlice.hh +++ b/source/geometry/divisions/include/G4ReplicatedSlice.hh @@ -57,15 +57,15 @@ #define G4REPLICATEDSLICE_HH 1 #include "geomdefs.hh" -#include "G4VPhysicalVolume.hh" +#include "G4PVReplica.hh" #include "G4VDivisionParameterisation.hh" class G4LogicalVolume; class G4VSolid; -class G4ReplicatedSlice : public G4VPhysicalVolume +class G4ReplicatedSlice : public G4PVReplica { - public: // with description + public: G4ReplicatedSlice(const G4String& pName, G4LogicalVolume* pLogical, @@ -129,8 +129,6 @@ class G4ReplicatedSlice : public G4VPhysicalVolume G4ReplicatedSlice& operator=(const G4ReplicatedSlice&) = delete; virtual G4bool IsMany() const; - virtual G4int GetCopyNo() const; - virtual void SetCopyNo(G4int CopyNo); virtual G4bool IsReplicated() const; virtual G4int GetMultiplicity() const; virtual G4VPVParameterisation* GetParameterisation() const; @@ -177,7 +175,6 @@ class G4ReplicatedSlice : public G4VPhysicalVolume EAxis fdivAxis; // axis of division G4int fnReplicas = 0; G4double fwidth = 0.0, foffset = 0.0; - G4int fcopyNo = -1; G4VDivisionParameterisation* fparam = nullptr; }; diff --git a/source/geometry/divisions/sources.cmake b/source/geometry/divisions/sources.cmake index 8a47226721..04d9c2aa71 100644 --- a/source/geometry/divisions/sources.cmake +++ b/source/geometry/divisions/sources.cmake @@ -29,5 +29,5 @@ geant4_add_module(G4geomdivision G4VDivisionParameterisation.cc) geant4_module_link_libraries(G4geomdivision - PUBLIC G4specsolids G4globman G4geometrymng G4hepgeometry + PUBLIC G4specsolids G4volumes G4globman G4geometrymng G4hepgeometry PRIVATE G4csg) diff --git a/source/geometry/divisions/src/G4PVDivision.cc b/source/geometry/divisions/src/G4PVDivision.cc index 5fd88532f1..b430672919 100644 --- a/source/geometry/divisions/src/G4PVDivision.cc +++ b/source/geometry/divisions/src/G4PVDivision.cc @@ -48,7 +48,7 @@ G4PVDivision::G4PVDivision(const G4String& pName, const G4int nDivs, const G4double width, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, nDivs, pAxis, pLogical, pMotherLogical) { if (pMotherLogical == nullptr) { @@ -82,7 +82,7 @@ G4PVDivision::G4PVDivision(const G4String& pName, const EAxis pAxis, const G4int nDivs, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, nDivs, pAxis, pLogical, pMotherLogical) { if (pMotherLogical == nullptr) { @@ -114,7 +114,7 @@ G4PVDivision::G4PVDivision(const G4String& pName, const EAxis pAxis, const G4double width, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, 0, pAxis, pLogical, pMotherLogical) { if (pMotherLogical == nullptr) { @@ -147,7 +147,8 @@ G4PVDivision::G4PVDivision(const G4String& pName, const G4int nDivs, const G4double width, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, nDivs, pAxis, pLogical, + pMotherPhysical ? pMotherPhysical->GetLogicalVolume() : nullptr) { if (pMotherPhysical == nullptr) { @@ -290,18 +291,6 @@ G4bool G4PVDivision::IsMany() const return false; } -//-------------------------------------------------------------------------- -G4int G4PVDivision::GetCopyNo() const -{ - return fcopyNo; -} - -//-------------------------------------------------------------------------- -void G4PVDivision::SetCopyNo(G4int newCopyNo) -{ - fcopyNo = newCopyNo; -} - //-------------------------------------------------------------------------- G4bool G4PVDivision::IsReplicated() const { diff --git a/source/geometry/divisions/src/G4ParameterisationCons.cc b/source/geometry/divisions/src/G4ParameterisationCons.cc index 732de02bce..fb28e325e1 100644 --- a/source/geometry/divisions/src/G4ParameterisationCons.cc +++ b/source/geometry/divisions/src/G4ParameterisationCons.cc @@ -267,10 +267,10 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume *physVol ) const #ifdef G4DIVDEBUG if( verbose >= 2 ) { - G4cout << " G4ParameterisationConsPhi - position: " << posi/deg << G4endl + G4cout << " G4ParameterisationConsPhi - position: " << posi/CLHEP::deg << G4endl << " Origin: " << origin << " copyNo: " << copyNo - << " - foffset: " << foffset/deg - << " - fwidth: " << fwidth/deg << G4endl + << " - foffset: " << foffset/CLHEP::deg + << " - fwidth: " << fwidth/CLHEP::deg << G4endl << " - Axis: " << faxis << G4endl; } #endif diff --git a/source/geometry/divisions/src/G4ParameterisationPolycone.cc b/source/geometry/divisions/src/G4ParameterisationPolycone.cc index 37ca031216..543b52005c 100644 --- a/source/geometry/divisions/src/G4ParameterisationPolycone.cc +++ b/source/geometry/divisions/src/G4ParameterisationPolycone.cc @@ -45,14 +45,14 @@ G4VParameterisationPolycone( EAxis axis, G4int nDiv, G4double width, DivisionType divType ) : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) { -#ifdef G4MULTITHREADED + /*#ifdef G4MULTITHREADED std::ostringstream message; message << "Divisions for G4Polycone currently NOT supported in MT-mode." << G4endl << "Sorry! Solid: " << msolid->GetName(); G4Exception("G4VParameterisationPolycone::G4VParameterisationPolycone()", "GeomDiv0001", FatalException, message); -#endif + #endif */ G4Polycone* msol = (G4Polycone*)(msolid); if (msolid->GetEntityType() == "G4ReflectedSolid") { @@ -200,8 +200,8 @@ ComputeTransformation( const G4int, G4VPhysicalVolume* physVol ) const { G4cout << std::setprecision(8) << " G4ParameterisationPolyconeRho " << G4endl - << " Position: " << origin/mm - << " - Width: " << fwidth/deg + << " Position: (0,0,0)" + << " - Width: " << fwidth/CLHEP::deg << " - Axis: " << faxis << G4endl; } #endif @@ -268,8 +268,8 @@ G4ParameterisationPolyconePhi( EAxis axis, G4int nDiv, { G4cout << " G4ParameterisationPolyconePhi - # divisions " << fnDiv << " = " << nDiv << G4endl - << " Offset " << foffset/deg << " = " << offset/deg << G4endl - << " Width " << fwidth/deg << " = " << width/deg << G4endl; + << " Offset " << foffset/CLHEP::deg << " = " << offset/CLHEP::deg << G4endl + << " Width " << fwidth/CLHEP::deg << " = " << width/CLHEP::deg << G4endl; } #endif } @@ -302,10 +302,10 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol ) const #ifdef G4DIVDEBUG if( verbose >= 2 ) { - G4cout << " G4ParameterisationPolyconePhi - position: " << posi/deg + G4cout << " G4ParameterisationPolyconePhi - position: " << posi/CLHEP::deg << G4endl - << " copyNo: " << copyNo << " - foffset: " << foffset/deg - << " - fwidth: " << fwidth/deg << G4endl; + << " copyNo: " << copyNo << " - foffset: " << foffset/CLHEP::deg + << " - fwidth: " << fwidth/CLHEP::deg << G4endl; } #endif @@ -316,7 +316,7 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol ) const { G4cout << std::setprecision(8) << " G4ParameterisationPolyconePhi " << copyNo << G4endl - << " Position: " << origin << " - Width: " << fwidth + << " Position: (0,0,0) - Width: " << fwidth << " - Axis: " << faxis << G4endl; } #endif @@ -542,11 +542,12 @@ void G4ParameterisationPolyconeZ:: ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol) const { + G4double posi = 0.; if ( fDivisionType == DivNDIV ) { // The position of the centre of copyNo-th mother polycone segment // - G4double posi = ( fOrigParamMother->Z_values[copyNo] + posi = ( fOrigParamMother->Z_values[copyNo] + fOrigParamMother->Z_values[copyNo+1])/2; physVol->SetTranslation( G4ThreeVector(0, 0, posi) ); } @@ -555,7 +556,7 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol) const { // The position of the centre of copyNo-th division // - G4double posi = fOrigParamMother->Z_values[0]; + posi = fOrigParamMother->Z_values[0]; if ( !fReflectedSolid ) posi += foffset + (2*copyNo + 1) * fwidth/2.; @@ -571,8 +572,8 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol) const if( verbose >= 2 ) { G4cout << " G4ParameterisationPolyconeZ - position: " << posi << G4endl - << " copyNo: " << copyNo << " - foffset: " << foffset/deg - << " - fwidth: " << fwidth/deg << G4endl; + << " copyNo: " << copyNo << " - foffset: " << foffset/CLHEP::deg + << " - fwidth: " << fwidth/CLHEP::deg << G4endl; } #endif @@ -583,7 +584,7 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol) const { G4cout << std::setprecision(8) << " G4ParameterisationPolyconeZ " << copyNo << G4endl - << " Position: " << origin << " - Width: " << fwidth + << " Position: (0,0,0) - Width: " << fwidth << " - Axis: " << faxis << G4endl; } #endif diff --git a/source/geometry/divisions/src/G4ParameterisationPolyhedra.cc b/source/geometry/divisions/src/G4ParameterisationPolyhedra.cc index 378119e728..b09d0061b1 100644 --- a/source/geometry/divisions/src/G4ParameterisationPolyhedra.cc +++ b/source/geometry/divisions/src/G4ParameterisationPolyhedra.cc @@ -49,13 +49,13 @@ G4VParameterisationPolyhedra( EAxis axis, G4int nDiv, G4double width, : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) { std::ostringstream message; -#ifdef G4MULTITHREADED + /* #ifdef G4MULTITHREADED message << "Divisions for G4Polyhedra currently NOT supported in MT-mode." << G4endl << "Sorry! Solid: " << msolid->GetName(); G4Exception("G4VParameterisationPolyhedra::G4VParameterisationPolyhedra()", "GeomDiv0001", FatalException, message); -#endif + #endif */ G4Polyhedra* msol = (G4Polyhedra*)(msolid); if ((msolid->GetEntityType() != "G4ReflectedSolid") && (msol->IsGeneric())) @@ -226,8 +226,8 @@ ComputeTransformation( const G4int, G4VPhysicalVolume* physVol ) const if( verbose >= 2 ) { G4cout << " G4ParameterisationPolyhedraRho " << G4endl - << " foffset: " << foffset/deg - << " - fwidth: " << fwidth/deg << G4endl; + << " foffset: " << foffset/CLHEP::deg + << " - fwidth: " << fwidth/CLHEP::deg << G4endl; } #endif @@ -381,10 +381,10 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol ) const #ifdef G4DIVDEBUG if( verbose >= 2 ) { - G4cout << " G4ParameterisationPolyhedraPhi - position: " << posi/deg + G4cout << " G4ParameterisationPolyhedraPhi - position: " << posi/CLHEP::deg << G4endl << " copyNo: " << copyNo - << " - fwidth: " << fwidth/deg << G4endl; + << " - fwidth: " << fwidth/CLHEP::deg << G4endl; } #endif @@ -619,11 +619,12 @@ void G4ParameterisationPolyhedraZ:: ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol) const { + G4double posi; if ( fDivisionType == DivNDIV ) { // The position of the centre of copyNo-th mother polycone segment - - G4double posi = ( fOrigParamMother->Z_values[copyNo] + + posi = ( fOrigParamMother->Z_values[copyNo] + fOrigParamMother->Z_values[copyNo+1])/2; physVol->SetTranslation( G4ThreeVector(0, 0, posi) ); } @@ -632,7 +633,7 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol) const { // The position of the centre of copyNo-th division - G4double posi = fOrigParamMother->Z_values[0]; + posi = fOrigParamMother->Z_values[0]; if ( !fReflectedSolid ) posi += foffset + (2*copyNo + 1) * fwidth/2.; @@ -648,8 +649,8 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol) const if( verbose >= 2 ) { G4cout << " G4ParameterisationPolyhedraZ - position: " << posi << G4endl - << " copyNo: " << copyNo << " - foffset: " << foffset/deg - << " - fwidth: " << fwidth/deg << G4endl; + << " copyNo: " << copyNo << " - foffset: " << foffset/CLHEP::deg + << " - fwidth: " << fwidth/CLHEP::deg << G4endl; } #endif @@ -660,7 +661,7 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol) const { G4cout << std::setprecision(8) << " G4ParameterisationPolyhedraZ " << copyNo << G4endl - << " Position: " << origin << " - Width: " << fwidth + << " Position: (0,0,0) - Width: " << fwidth << " - Axis: " << faxis << G4endl; } #endif diff --git a/source/geometry/divisions/src/G4ParameterisationTrd.cc b/source/geometry/divisions/src/G4ParameterisationTrd.cc index 69507b54ac..58e5158c61 100644 --- a/source/geometry/divisions/src/G4ParameterisationTrd.cc +++ b/source/geometry/divisions/src/G4ParameterisationTrd.cc @@ -134,19 +134,10 @@ ComputeTransformation( const G4int copyNo, { G4Trd* msol = (G4Trd*)(fmotherSolid ); G4double mdx = ( msol->GetXHalfLength1() + msol->GetXHalfLength2() ) / 2.; - //----- translation G4ThreeVector origin(0.,0.,0.); G4double posi; - if( !bDivInTrap ) - { - posi = -mdx + foffset + (copyNo+0.5)*fwidth; - } - else - { - G4double aveHL = (msol->GetXHalfLength1()+msol->GetXHalfLength2())/2.; - posi = - aveHL + foffset + (copyNo+0.5)*aveHL/fnDiv*2; - } + posi = -mdx + foffset + (copyNo+0.5)*fwidth; if( faxis == kXAxis ) { origin.setX( posi ); @@ -176,15 +167,14 @@ ComputeTransformation( const G4int copyNo, //-------------------------------------------------------------------------- void G4ParameterisationTrdX:: -ComputeDimensions( G4Trd& trd, const G4int, const G4VPhysicalVolume* ) const -{ +ComputeDimensions( G4Trd& trd, [[maybe_unused]] const G4int copyNo, const G4VPhysicalVolume* ) const +{ G4Trd* msol = (G4Trd*)(fmotherSolid); - G4double pDy1 = msol->GetYHalfLength1(); G4double pDy2 = msol->GetYHalfLength2(); G4double pDz = msol->GetZHalfLength(); G4double pDx = fwidth/2. - fhgap; - + trd.SetAllParameters ( pDx, pDx, pDy1, pDy2, pDz ); #ifdef G4DIVDEBUG @@ -197,49 +187,45 @@ ComputeDimensions( G4Trd& trd, const G4int, const G4VPhysicalVolume* ) const #endif } -G4VSolid* G4ParameterisationTrdX:: -ComputeSolid(const G4int i, G4VPhysicalVolume* pv) -{ - if( bDivInTrap ) - { - return G4VDivisionParameterisation::ComputeSolid(i, pv); - } - else - { - return fmotherSolid; - } -} - - //-------------------------------------------------------------------------- void G4ParameterisationTrdX::ComputeDimensions( G4Trap& trap, const G4int copyNo, const G4VPhysicalVolume* ) const { - G4Trd* msol = (G4Trd*)(fmotherSolid); + G4Trd* msol = (G4Trd*)(fmotherSolid); G4double pDy1 = msol->GetYHalfLength1(); G4double pDy2 = msol->GetYHalfLength2(); G4double pDz = msol->GetZHalfLength(); - G4double pDx1 = msol->GetXHalfLength1()/fnDiv; - G4double pDx2 = msol->GetXHalfLength2()/fnDiv; + //fwidth is at Z=0 + G4double pDx1 = msol->GetXHalfLength1(); + G4double pDx2 = msol->GetXHalfLength2(); + // G4double pDxAVE = (pDx1+pDx2)/2.; + G4double xChangeRatio = (pDx2-pDx1) / (pDx2+pDx1); + G4double fWidChange = xChangeRatio*fwidth; + G4double fWid1 = fwidth - fWidChange; + G4double fWid2 = fwidth + fWidChange; + G4double fOffsetChange = xChangeRatio*foffset/2.; + G4double fOffset1 = foffset - fOffsetChange; + G4double fOffset2 = foffset + fOffsetChange; + G4double cxy1 = -pDx1+fOffset1 + (copyNo+0.5)*fWid1;// centre of the side at y=-pDy1 + G4double cxy2 = -pDx2+fOffset2 + (copyNo+0.5)*fWid2;// centre of the side at y=+pDy1 + G4double alp = std::atan( (cxy2-cxy1)/(pDz*2.) ); + + pDx1 = fwidth/2. - fWidChange/2.; + pDx2 = fwidth/2. + fWidChange/2.; + - G4double cxy1 = -msol->GetXHalfLength1() + foffset - + (copyNo+0.5)*pDx1*2;// centre of the side at y=-pDy1 - G4double cxy2 = -msol->GetXHalfLength2() + foffset - + (copyNo+0.5)*pDx2*2;// centre of the side at y=+pDy1 - G4double alp = std::atan( (cxy2-cxy1)/pDz ); - trap.SetAllParameters ( pDz, - 0., + alp, 0., pDy1, pDx1, - pDx2, - alp, + pDx1, + 0., pDy2, - pDx1 - fhgap, + pDx2 - fhgap, pDx2 - fhgap * pDx2/pDx1, - alp); + 0.); #ifdef G4DIVDEBUG if( verbose >= 2 ) @@ -251,36 +237,6 @@ G4ParameterisationTrdX::ComputeDimensions( G4Trap& trap, const G4int copyNo, #endif } -//-------------------------------------------------------------------------- -void G4ParameterisationTrdX::CheckParametersValidity() -{ - G4VDivisionParameterisation::CheckParametersValidity(); -/* - G4Trd* msol = (G4Trd*)(fmotherSolid); - - G4double mpDx1 = msol->GetXHalfLength1(); - G4double mpDx2 = msol->GetXHalfLength2(); - bDivInTrap = false; - - if( std::fabs(mpDx1 - mpDx2) > kCarTolerance ) - { - std::ostringstream message; - message << "Invalid solid specification. NOT supported." << G4endl - << "Making a division of a TRD along axis X," << G4endl - << "while the X half lengths are not equal," << G4endl - << "is not (yet) supported. It will result" << G4endl - << "in non-equal division solids."; - G4Exception("G4ParameterisationTrdX::CheckParametersValidity()", - "GeomDiv0001", FatalException, message); - } -*/ -} - -//-------------------------------------------------------------------------- -void G4ParameterisationTrdX:: -ComputeTrapParams() -{ -} //-------------------------------------------------------------------------- G4ParameterisationTrdY:: @@ -324,7 +280,7 @@ G4ParameterisationTrdY::~G4ParameterisationTrdY() G4double G4ParameterisationTrdY::GetMaxParameter() const { G4Trd* msol = (G4Trd*)(fmotherSolid); - return 2*msol->GetYHalfLength1(); + return (msol->GetYHalfLength1()+msol->GetYHalfLength2()); } //-------------------------------------------------------------------------- @@ -333,7 +289,7 @@ G4ParameterisationTrdY:: ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol ) const { G4Trd* msol = (G4Trd*)(fmotherSolid ); - G4double mdy = msol->GetYHalfLength1(); + G4double mdy = ( msol->GetYHalfLength1() + msol->GetYHalfLength2() ) / 2.; //----- translation G4ThreeVector origin(0.,0.,0.); @@ -390,26 +346,53 @@ ComputeDimensions(G4Trd& trd, const G4int, const G4VPhysicalVolume*) const } //-------------------------------------------------------------------------- -void G4ParameterisationTrdY::CheckParametersValidity() +void +G4ParameterisationTrdY::ComputeDimensions( G4Trap& trap, const G4int copyNo, + const G4VPhysicalVolume* ) const { - G4VDivisionParameterisation::CheckParametersValidity(); + G4Trd* msol = (G4Trd*)(fmotherSolid); + G4double pDx1 = msol->GetXHalfLength1(); + G4double pDx2 = msol->GetXHalfLength2(); + G4double pDz = msol->GetZHalfLength(); + //fwidth is at Z=0 + G4double pDy1 = msol->GetYHalfLength1(); + G4double pDy2 = msol->GetYHalfLength2(); + // G4double pDxAVE = (pDy1+pDy2)/2.; + G4double yChangeRatio = (pDy2-pDy1) / (pDy2+pDy1); + G4double fWidChange = yChangeRatio*fwidth; + G4double fWid1 = fwidth - fWidChange; + G4double fWid2 = fwidth + fWidChange; + G4double fOffsetChange = yChangeRatio*foffset/2.; + G4double fOffset1 = foffset - fOffsetChange; + G4double fOffset2 = foffset + fOffsetChange; + G4double cyx1 = -pDy1+fOffset1 + (copyNo+0.5)*fWid1;// centre of the side at y=-pDy1 + G4double cyx2 = -pDy2+fOffset2 + (copyNo+0.5)*fWid2;// centre of the side at y=+pDy1 + G4double alp = std::atan( (cyx2-cyx1)/(pDz*2.) ); - G4Trd* msol = (G4Trd*)(fmotherSolid); + pDy1 = fwidth/2. - fWidChange/2.; + pDy2 = fwidth/2. + fWidChange/2.; - G4double mpDy1 = msol->GetYHalfLength1(); - G4double mpDy2 = msol->GetYHalfLength2(); - if( std::fabs(mpDy1 - mpDy2) > kCarTolerance ) + trap.SetAllParameters ( pDz, + alp, + 90*CLHEP::deg, + pDy1, + pDx1, + pDx1, + 0., + pDy2, + pDx2 - fhgap, + pDx2 - fhgap * pDx2/pDx1, + 0.); + +#ifdef G4DIVDEBUG + if( verbose >= 2 ) { - std::ostringstream message; - message << "Invalid solid specification. NOT supported." << G4endl - << "Making a division of a TRD along axis Y while" << G4endl - << "the Y half lengths are not equal is not (yet)" << G4endl - << "supported. It will result in non-equal" << G4endl - << "division solids."; - G4Exception("G4ParameterisationTrdY::CheckParametersValidity()", - "GeomDiv0001", FatalException, message); + G4cout << " G4ParameterisationTrdY::ComputeDimensions():" + << copyNo << G4endl; + trap.DumpInfo(); } +#endif } //-------------------------------------------------------------------------- diff --git a/source/geometry/divisions/src/G4ParameterisationTubs.cc b/source/geometry/divisions/src/G4ParameterisationTubs.cc index ba7a73dce4..aff526287f 100644 --- a/source/geometry/divisions/src/G4ParameterisationTubs.cc +++ b/source/geometry/divisions/src/G4ParameterisationTubs.cc @@ -127,8 +127,8 @@ ComputeTransformation(const G4int, G4VPhysicalVolume* physVol) const if( verbose >= 2 ) { G4cout << " G4ParameterisationTubsRho " << G4endl - << " Offset: " << foffset/deg - << " - Width: " << fwidth/deg << G4endl; + << " Offset: " << foffset/CLHEP::deg + << " - Width: " << fwidth/CLHEP::deg << G4endl; } #endif @@ -234,9 +234,9 @@ ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const #ifdef G4DIVDEBUG if( verbose >= 2 ) { - G4cout << " G4ParameterisationTubsPhi - position: " << posi/deg << G4endl - << " copyNo: " << copyNo << " - foffset: " << foffset/deg - << " - fwidth: " << fwidth/deg << G4endl; + G4cout << " G4ParameterisationTubsPhi - position: " << posi/CLHEP::deg << G4endl + << " copyNo: " << copyNo << " - foffset: " << foffset/CLHEP::deg + << " - fwidth: " << fwidth/CLHEP::deg << G4endl; } #endif @@ -346,7 +346,7 @@ ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const { G4cout << " G4ParameterisationTubsZ::ComputeTransformation()" << G4endl << " Position: " << posi << " - copyNo: " << copyNo << G4endl - << " foffset " << foffset/deg << " - fwidth " << fwidth/deg + << " foffset " << foffset/CLHEP::deg << " - fwidth " << fwidth/CLHEP::deg << G4endl; } #endif diff --git a/source/geometry/divisions/src/G4ReplicatedSlice.cc b/source/geometry/divisions/src/G4ReplicatedSlice.cc index 2e6569f967..77d9879145 100644 --- a/source/geometry/divisions/src/G4ReplicatedSlice.cc +++ b/source/geometry/divisions/src/G4ReplicatedSlice.cc @@ -49,7 +49,7 @@ G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName, const G4double width, const G4double half_gap, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, nDivs, pAxis, pLogical, pMotherLogical) { CheckAndSetParameters(pAxis, nDivs, width, half_gap, offset, DivNDIVandWIDTH, pMotherLogical, pLogical); @@ -63,7 +63,7 @@ G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName, const G4int nDivs, const G4double half_gap, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, nDivs, pAxis, pLogical, pMotherLogical) { CheckAndSetParameters(pAxis, nDivs, 0., half_gap, offset, DivNDIV, pMotherLogical, pLogical); @@ -77,7 +77,7 @@ G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName, const G4double width, const G4double half_gap, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, 0, pAxis, pLogical, pMotherLogical) { CheckAndSetParameters(pAxis, 0, width, half_gap, offset, DivWIDTH, pMotherLogical, pLogical); @@ -92,8 +92,18 @@ G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName, const G4double width, const G4double half_gap, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, nDivs, pAxis, pLogical, + pMotherPhysical ? pMotherPhysical->GetLogicalVolume() : nullptr) { + if (pMotherPhysical == nullptr) + { + std::ostringstream message; + message << "Invalid setup." << G4endl + << "NULL pointer specified as mother for volume: " << pName; + G4Exception("G4ReplicatedSlice::G4ReplicatedSlice()", "GeomDiv0002", + FatalException, message); + return; + } CheckAndSetParameters(pAxis, nDivs, width, half_gap, offset, DivNDIVandWIDTH, pMotherPhysical->GetLogicalVolume(), pLogical); } @@ -106,8 +116,18 @@ G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName, const G4int nDivs, const G4double half_gap, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, nDivs, pAxis, pLogical, + pMotherPhysical ? pMotherPhysical->GetLogicalVolume() : nullptr) { + if (pMotherPhysical == nullptr) + { + std::ostringstream message; + message << "Invalid setup." << G4endl + << "NULL pointer specified as mother for volume: " << pName; + G4Exception("G4ReplicatedSlice::G4ReplicatedSlice()", "GeomDiv0002", + FatalException, message); + return; + } CheckAndSetParameters(pAxis, nDivs, 0., half_gap, offset, DivNDIV, pMotherPhysical->GetLogicalVolume(), pLogical); } @@ -120,8 +140,18 @@ G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName, const G4double width, const G4double half_gap, const G4double offset ) - : G4VPhysicalVolume(nullptr,G4ThreeVector(),pName,pLogical,nullptr) + : G4PVReplica(pName, 0, pAxis, pLogical, + pMotherPhysical ? pMotherPhysical->GetLogicalVolume() : nullptr) { + if (pMotherPhysical == nullptr) + { + std::ostringstream message; + message << "Invalid setup." << G4endl + << "NULL pointer specified as mother for volume: " << pName; + G4Exception("G4ReplicatedSlice::G4ReplicatedSlice()", "GeomDiv0002", + FatalException, message); + return; + } CheckAndSetParameters(pAxis, 0, width, half_gap, offset, DivWIDTH, pMotherPhysical->GetLogicalVolume(), pLogical); } @@ -269,18 +299,6 @@ G4bool G4ReplicatedSlice::IsMany() const return false; } -//-------------------------------------------------------------------------- -G4int G4ReplicatedSlice::GetCopyNo() const -{ - return fcopyNo; -} - -//-------------------------------------------------------------------------- -void G4ReplicatedSlice::SetCopyNo(G4int newCopyNo) -{ - fcopyNo= newCopyNo; -} - //-------------------------------------------------------------------------- G4bool G4ReplicatedSlice::IsReplicated() const { diff --git a/source/geometry/management/History b/source/geometry/management/History index c69eeaf787..dcdea2d45a 100644 --- a/source/geometry/management/History +++ b/source/geometry/management/History @@ -15,6 +15,18 @@ commit in the repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +September 28, 2021 G.Cosmo (geommng-V10-07-07) +- Use G4Allocator to dynamically allocate nodes and proxies for the + voxels optimisation structure. Should help reducing memory fragmentation. + +September 24, 2021 G.Cosmo (geommng-V10-07-06) +- Basic clang-tidy review of code. + +August 31, 2021 B.Morgan (geommng-V10-07-05) +- Provide operator<< as a free function for G4UAdapter to support Geant4Py +- Make operator<< for G4VSolid a free function + June 15, 2021 J.Apostolakis (geommng-V10-07-04) - G4UAdapter: added std::ostream& operator << to avoid compilation clash between similar methods for G4VSolid and VecGeom UnplacedVolume. diff --git a/source/geometry/management/include/G4AffineTransform.hh b/source/geometry/management/include/G4AffineTransform.hh index c79406b667..2a06ffd74f 100644 --- a/source/geometry/management/include/G4AffineTransform.hh +++ b/source/geometry/management/include/G4AffineTransform.hh @@ -88,7 +88,7 @@ class G4AffineTransform const G4ThreeVector& tlate); // Optionally rotate by *rot then translate by tlate - rot may be null - inline G4AffineTransform(const G4AffineTransform& rhs); + inline G4AffineTransform(const G4AffineTransform& rhs) = default; inline G4AffineTransform(G4AffineTransform&& rhs) = default; // Copy and move constructors @@ -96,7 +96,7 @@ class G4AffineTransform inline G4AffineTransform& operator=(G4AffineTransform&& rhs) = default; // Assignment & Move operators - inline ~G4AffineTransform(); + inline ~G4AffineTransform() = default; // Destructor inline G4AffineTransform operator * (const G4AffineTransform& tf) const; diff --git a/source/geometry/management/include/G4AffineTransform.icc b/source/geometry/management/include/G4AffineTransform.icc index eaa52e4909..5f4e0dd7bc 100644 --- a/source/geometry/management/include/G4AffineTransform.icc +++ b/source/geometry/management/include/G4AffineTransform.icc @@ -86,13 +86,6 @@ G4AffineTransform( const G4double prxx,const G4double prxy,const G4double prxz, tx(ptx),ty(pty),tz(ptz) {} -inline G4AffineTransform::G4AffineTransform(const G4AffineTransform& rhs) - : rxx(rhs.rxx),rxy(rhs.rxy),rxz(rhs.rxz), - ryx(rhs.ryx),ryy(rhs.ryy),ryz(rhs.ryz), - rzx(rhs.rzx),rzy(rhs.rzy),rzz(rhs.rzz), - tx(rhs.tx),ty(rhs.ty),tz(rhs.tz) -{} - inline G4AffineTransform& G4AffineTransform::operator = (const G4AffineTransform& rhs) { @@ -104,9 +97,6 @@ G4AffineTransform::operator = (const G4AffineTransform& rhs) return *this; } -inline G4AffineTransform::~G4AffineTransform() -{} - inline G4AffineTransform G4AffineTransform::operator * (const G4AffineTransform& tf) const { diff --git a/source/geometry/management/include/G4BlockingList.hh b/source/geometry/management/include/G4BlockingList.hh index 8d4fd6af33..a0eed4a954 100644 --- a/source/geometry/management/include/G4BlockingList.hh +++ b/source/geometry/management/include/G4BlockingList.hh @@ -40,7 +40,7 @@ // 24.7.96, P.Kent - Separated from G4Navigator // -------------------------------------------------------------------- #ifndef G4BLOCKINGLIST_HH -#define G4BLOCKINGLIST_HH +#define G4BLOCKINGLIST_HH 1 #include "G4Types.hh" #include @@ -52,13 +52,13 @@ const G4int kBlockTagNoMax = 2147483647; // 2^31-1 maximum tag no may reach class G4BlockingList { - public: // with description + public: G4BlockingList(G4int maxDefault = kBlockingListMaxDefault, G4int stride = kBlockingListStride); // Create empty blocking List of default size and `stride' resize count. - ~G4BlockingList(); + ~G4BlockingList() = default; // Destructor. No operations. void Reset(); diff --git a/source/geometry/management/include/G4BoundingEnvelope.hh b/source/geometry/management/include/G4BoundingEnvelope.hh index 532a947598..95b949d5a0 100644 --- a/source/geometry/management/include/G4BoundingEnvelope.hh +++ b/source/geometry/management/include/G4BoundingEnvelope.hh @@ -68,12 +68,12 @@ class G4BoundingEnvelope // should have equal numbers of vertices except first and last // polygons which may consist of a single vertex - G4BoundingEnvelope(const G4ThreeVector& pMin, + G4BoundingEnvelope(const G4ThreeVector& pMin, const G4ThreeVector& pMax, const std::vector& polygons); // Constructor from AABB and a sequence of polygons - ~G4BoundingEnvelope(); + ~G4BoundingEnvelope() = default; // Destructor G4bool BoundingBoxVsVoxelLimits(const EAxis pAxis, diff --git a/source/geometry/management/include/G4ErrorCylSurfaceTarget.hh b/source/geometry/management/include/G4ErrorCylSurfaceTarget.hh index ea2b9a5c83..a164622536 100644 --- a/source/geometry/management/include/G4ErrorCylSurfaceTarget.hh +++ b/source/geometry/management/include/G4ErrorCylSurfaceTarget.hh @@ -31,8 +31,8 @@ // Created: P.Arce, September 2004 // -------------------------------------------------------------------- -#ifndef G4ErrorCylSurfaceTarget_hh -#define G4ErrorCylSurfaceTarget_hh +#ifndef G4ERRORCYLSURFACETARGET_HH +#define G4ERRORCYLSURFACETARGET_HH 1 #include "globals.hh" #include "G4ErrorSurfaceTarget.hh" @@ -43,7 +43,7 @@ class G4ErrorCylSurfaceTarget : public G4ErrorSurfaceTarget { - public: // with description + public: G4ErrorCylSurfaceTarget( const G4double& radius, const G4ThreeVector& trans=G4ThreeVector(), @@ -54,7 +54,7 @@ class G4ErrorCylSurfaceTarget : public G4ErrorSurfaceTarget const G4AffineTransform& trans ); // Constructs cylindrical surface by radius and affine transformation - ~G4ErrorCylSurfaceTarget(); + ~G4ErrorCylSurfaceTarget() = default; virtual G4ThreeVector IntersectLocal( const G4ThreeVector& point, const G4ThreeVector& direc ) const; diff --git a/source/geometry/management/include/G4ErrorPlaneSurfaceTarget.hh b/source/geometry/management/include/G4ErrorPlaneSurfaceTarget.hh index ea8da4399e..62f374a446 100644 --- a/source/geometry/management/include/G4ErrorPlaneSurfaceTarget.hh +++ b/source/geometry/management/include/G4ErrorPlaneSurfaceTarget.hh @@ -31,8 +31,8 @@ // Created: P.Arce, September 2004 // -------------------------------------------------------------------- -#ifndef G4ErrorPlaneSurfaceTarget_hh -#define G4ErrorPlaneSurfaceTarget_hh +#ifndef G4ERRORPLANESURFACETARGET_HH +#define G4ERRORPLANESURFACETARGET_HH 1 #include "globals.hh" #include "G4ErrorSurfaceTarget.hh" @@ -41,7 +41,7 @@ class G4ErrorPlaneSurfaceTarget : public G4ErrorSurfaceTarget, G4Plane3D { - public: // with description + public: G4ErrorPlaneSurfaceTarget(G4double a=0., G4double b=0., G4double c=0., G4double d=0.); @@ -56,7 +56,7 @@ class G4ErrorPlaneSurfaceTarget : public G4ErrorSurfaceTarget, G4Plane3D const G4Point3D& p3); // Constructs plane by three points - ~G4ErrorPlaneSurfaceTarget(); + ~G4ErrorPlaneSurfaceTarget() = default; virtual G4ThreeVector Intersect( const G4ThreeVector& point, const G4ThreeVector& direc ) const; @@ -74,7 +74,6 @@ class G4ErrorPlaneSurfaceTarget : public G4ErrorSurfaceTarget, G4Plane3D virtual void Dump( const G4String& msg ) const; // Dump plane surface parameter - }; #endif diff --git a/source/geometry/management/include/G4ErrorSurfaceTarget.hh b/source/geometry/management/include/G4ErrorSurfaceTarget.hh index ee4129318e..dedee58150 100644 --- a/source/geometry/management/include/G4ErrorSurfaceTarget.hh +++ b/source/geometry/management/include/G4ErrorSurfaceTarget.hh @@ -31,9 +31,8 @@ // Created: P.Arce, September 2004 // -------------------------------------------------------------------- - -#ifndef G4ErrorSurfaceTarget_hh -#define G4ErrorSurfaceTarget_hh +#ifndef G4ERRORSURFACETARGET_HH +#define G4ERRORSURFACETARGET_HH 1 #include "globals.hh" #include "G4ThreeVector.hh" @@ -42,10 +41,10 @@ class G4ErrorSurfaceTarget : public G4ErrorTanPlaneTarget { - public: // with description + public: G4ErrorSurfaceTarget(); - virtual ~G4ErrorSurfaceTarget(); + virtual ~G4ErrorSurfaceTarget() = default; virtual double GetDistanceFromPoint( const G4ThreeVector& point, const G4ThreeVector& direc ) const = 0; diff --git a/source/geometry/management/include/G4ErrorTanPlaneTarget.hh b/source/geometry/management/include/G4ErrorTanPlaneTarget.hh index b3a2aadef4..43570a00dd 100644 --- a/source/geometry/management/include/G4ErrorTanPlaneTarget.hh +++ b/source/geometry/management/include/G4ErrorTanPlaneTarget.hh @@ -31,8 +31,8 @@ // Created: P.Arce, September 2004 // -------------------------------------------------------------------- -#ifndef G4ErrorTanPlaneTarget_hh -#define G4ErrorTanPlaneTarget_hh +#ifndef G4ERRORTANPLANETARGET_HH +#define G4ERRORTANPLANETARGET_HH 1 #include "globals.hh" #include "G4ThreeVector.hh" @@ -42,17 +42,16 @@ class G4ErrorTanPlaneTarget : public G4ErrorTarget { - public: // with description + public: G4ErrorTanPlaneTarget(); - virtual ~G4ErrorTanPlaneTarget(); + virtual ~G4ErrorTanPlaneTarget() = default; virtual G4Plane3D GetTangentPlane( const G4ThreeVector& point ) const = 0; // Get tangent plane at point virtual void Dump( const G4String& msg ) const = 0; // Dump surface - }; #endif diff --git a/source/geometry/management/include/G4ErrorTarget.hh b/source/geometry/management/include/G4ErrorTarget.hh index 78cd80aff3..4d8cbc3a06 100644 --- a/source/geometry/management/include/G4ErrorTarget.hh +++ b/source/geometry/management/include/G4ErrorTarget.hh @@ -31,8 +31,8 @@ // Created: P.Arce, September 2004 // -------------------------------------------------------------------- -#ifndef G4ErrorTarget_hh -#define G4ErrorTarget_hh +#ifndef G4ERRORTARGET_HH +#define G4ERRORTARGET_HH 1 #include "globals.hh" #include "G4ThreeVector.hh" @@ -45,10 +45,10 @@ enum G4ErrorTargetType{ G4ErrorTarget_PlaneSurface, G4ErrorTarget_TrkL }; class G4ErrorTarget { - public: // with description + public: G4ErrorTarget(); - virtual ~G4ErrorTarget(); + virtual ~G4ErrorTarget() = default; virtual G4double GetDistanceFromPoint( const G4ThreeVector&, const G4ThreeVector& ) const; diff --git a/source/geometry/management/include/G4GeometryManager.hh b/source/geometry/management/include/G4GeometryManager.hh index 1ccd309c9c..43df98a859 100644 --- a/source/geometry/management/include/G4GeometryManager.hh +++ b/source/geometry/management/include/G4GeometryManager.hh @@ -40,9 +40,10 @@ // 26.07.95, P.Kent - Initial version, including optimisation build // -------------------------------------------------------------------- #ifndef G4GEOMETRYMANAGER_HH -#define G4GEOMETRYMANAGER_HH +#define G4GEOMETRYMANAGER_HH 1 #include + #include "G4Types.hh" #include "G4SmartVoxelStat.hh" @@ -50,7 +51,7 @@ class G4VPhysicalVolume; class G4GeometryManager { - public: // with description + public: G4bool CloseGeometry(G4bool pOptimise = true, G4bool verbose = false, G4VPhysicalVolume* vol = nullptr); @@ -77,15 +78,15 @@ class G4GeometryManager static G4GeometryManager* GetInstanceIfExist(); // Return ptr to singleton instance. - public: // without description + public: ~G4GeometryManager(); // Destructor. protected: - G4GeometryManager(); - // Protected constructor + G4GeometryManager() = default; + // Protected constructor. Set the geometry to be open private: diff --git a/source/geometry/management/include/G4IdentityTrajectoryFilter.hh b/source/geometry/management/include/G4IdentityTrajectoryFilter.hh index ea758b144e..e0ab41d9e4 100644 --- a/source/geometry/management/include/G4IdentityTrajectoryFilter.hh +++ b/source/geometry/management/include/G4IdentityTrajectoryFilter.hh @@ -37,8 +37,8 @@ // First version: Nov 19, 2002 - Jacek Generowicz // ------------------------------------------------------------------------ -#ifndef G4IdentityTrajectoryFilter_hh -#define G4IdentityTrajectoryFilter_hh +#ifndef G4IDENTITYTRAJECTORYFILTER_HH +#define G4IDENTITYTRAJECTORYFILTER_HH 1 #include "G4VCurvedTrajectoryFilter.hh" #include "G4ThreeVector.hh" @@ -46,10 +46,10 @@ class G4IdentityTrajectoryFilter : public G4VCurvedTrajectoryFilter { - public: // with description + public: - G4IdentityTrajectoryFilter(); - virtual ~G4IdentityTrajectoryFilter(); + G4IdentityTrajectoryFilter() = default; + virtual ~G4IdentityTrajectoryFilter() = default; G4IdentityTrajectoryFilter(const G4IdentityTrajectoryFilter&) = delete; G4IdentityTrajectoryFilter& operator=(const G4IdentityTrajectoryFilter&) = delete; @@ -60,4 +60,4 @@ class G4IdentityTrajectoryFilter : public G4VCurvedTrajectoryFilter // to consider keeping or rejecting }; -#endif /* G4IdentityTrajectoryFilter_hh */ +#endif diff --git a/source/geometry/management/include/G4LogicalSurface.hh b/source/geometry/management/include/G4LogicalSurface.hh index 90672a8453..bdad7093c4 100644 --- a/source/geometry/management/include/G4LogicalSurface.hh +++ b/source/geometry/management/include/G4LogicalSurface.hh @@ -49,11 +49,11 @@ // G4SurfaceProperty* theSurfaceProperty // G4TransitionRadiationSurface* theTransRadSurface -// Created: 1997, June, 4th to 17th -// Author: John Apostolakis, (with help of Peter Gumplinger) +// Created: 1997, June, 4th to 17th +// Author: John Apostolakis, (with help of Peter Gumplinger) // ------------------------------------------------------------------------ -#ifndef G4LogicalSurface_h -#define G4LogicalSurface_h 1 +#ifndef G4LOGICALSURFACE_HH +#define G4LOGICALSURFACE_HH 1 #include "G4Types.hh" #include "G4String.hh" @@ -64,7 +64,7 @@ class G4TransitionRadiationSurface; class G4LogicalSurface { - public: // with description + public: inline G4SurfaceProperty* GetSurfaceProperty() const; inline void SetSurfaceProperty(G4SurfaceProperty* ptrSurfaceProperty); @@ -75,9 +75,7 @@ class G4LogicalSurface inline G4TransitionRadiationSurface* GetTransitionRadiationSurface() const; inline void SetTransitionRadiationSurface(G4TransitionRadiationSurface* trs); - public: // without description - - virtual ~G4LogicalSurface(); + virtual ~G4LogicalSurface() = default; G4LogicalSurface(const G4LogicalSurface&) = delete; G4LogicalSurface& operator=(const G4LogicalSurface&) = delete; @@ -102,4 +100,4 @@ class G4LogicalSurface #include "G4LogicalSurface.icc" -#endif /* G4LogicalSurface_h */ +#endif diff --git a/source/geometry/management/include/G4LogicalVolume.hh b/source/geometry/management/include/G4LogicalVolume.hh index f97d50e633..4673db9be1 100644 --- a/source/geometry/management/include/G4LogicalVolume.hh +++ b/source/geometry/management/include/G4LogicalVolume.hh @@ -98,12 +98,11 @@ // 18.04.01 G.Cosmo: Migrated to STL vector // 12.02.99 S.Giani: Added user defined optimisation quality // 09.11.98 M.Verderi, J.Apostolakis: Added BiasWeight member and accessors -// 10.20.97 P.M.DeFreitas: Added pointer to a FastSimulation -// J.Apostolakis: & flag to indicate if it is an Envelope for it +// 10.20.97 P.M.DeFreitas, J.Apostolakis: Added pointer to a FastSimulation // 11.07.95 P.Kent: Initial version // ------------------------------------------------------------------------ #ifndef G4LOGICALVOLUME_HH -#define G4LOGICALVOLUME_HH +#define G4LOGICALVOLUME_HH 1 #include @@ -177,13 +176,11 @@ class G4LVData // In addition, it invokes a method similiar to the constructor explicitly // to achieve the partial effect for each instance in the array. // -typedef G4GeomSplitter G4LVManager; +using G4LVManager = G4GeomSplitter; class G4LogicalVolume { - typedef std::vector G4PhysicalVolumeList; - - public: // with description + public: G4LogicalVolume(G4VSolid* pSolid, G4Material* pMaterial, @@ -339,7 +336,7 @@ class G4LogicalVolume inline G4double GetBiasWeight() const; // Sets and gets bias weight. - public: // without description + public: G4LogicalVolume(__void__&); // Fake default constructor for usage restricted to direct object @@ -391,7 +388,8 @@ class G4LogicalVolume // Returns: success (true) or failure (false). private: - // Data members: + + using G4PhysicalVolumeList = std::vector; G4GEOM_DLL static G4LVManager subInstanceManager; // This new field helps to use the class G4LVManager introduced above. diff --git a/source/geometry/management/include/G4Region.hh b/source/geometry/management/include/G4Region.hh index 77c322ee9d..af775c49d3 100644 --- a/source/geometry/management/include/G4Region.hh +++ b/source/geometry/management/include/G4Region.hh @@ -34,7 +34,7 @@ // 18.09.02, G.Cosmo - Initial version // -------------------------------------------------------------------- #ifndef G4REGION_HH -#define G4REGION_HH +#define G4REGION_HH 1 #include #include @@ -90,16 +90,11 @@ class G4RegionData // In addition, it invokes a method similiar to the constructor explicitly // to achieve the partial effect for each instance in the array. // -typedef G4GeomSplitter G4RegionManager; +using G4RegionManager = G4GeomSplitter; class G4Region { - typedef std::vector G4RootLVList; - typedef std::vector G4MaterialList; - typedef std::pair G4MaterialCouplePair; - typedef std::map G4MaterialCoupleMap; - - public: // with description + public: G4Region(const G4String& name); virtual ~G4Region(); @@ -217,7 +212,7 @@ class G4Region G4UserSteppingAction* GetRegionalSteppingAction() const; // Set/Get method of the regional user stepping action - public: // without description + public: G4Region(__void__&); // Fake default constructor for usage restricted to direct object @@ -248,6 +243,11 @@ class G4Region private: + using G4RootLVList = std::vector; + using G4MaterialList = std::vector; + using G4MaterialCouplePair = std::pair; + using G4MaterialCoupleMap = std::map; + G4String fName; G4RootLVList fRootVolumes; diff --git a/source/geometry/management/include/G4Region.icc b/source/geometry/management/include/G4Region.icc index 31a6213fad..5ead16b861 100644 --- a/source/geometry/management/include/G4Region.icc +++ b/source/geometry/management/include/G4Region.icc @@ -107,9 +107,7 @@ inline std::vector::iterator G4Region::GetRootLogicalVolumeIterator() { - G4RootLVList::iterator iterator = - G4RootLVList::iterator(fRootVolumes.begin()); - return iterator; + return G4RootLVList::iterator(fRootVolumes.begin()); } // ******************************************************************** @@ -120,8 +118,7 @@ inline std::vector::const_iterator G4Region::GetMaterialIterator() const { - G4MaterialList::const_iterator iterator = fMaterials.cbegin(); - return iterator; + return fMaterials.cbegin(); } // ******************************************************************** diff --git a/source/geometry/management/include/G4RegionStore.hh b/source/geometry/management/include/G4RegionStore.hh index 42a2c80c0e..ccc1923603 100644 --- a/source/geometry/management/include/G4RegionStore.hh +++ b/source/geometry/management/include/G4RegionStore.hh @@ -78,7 +78,7 @@ class G4RegionStore : public std::vector // to FALSE. Used by the run manager to notify that the // physics table has been updated. - void UpdateMaterialList(G4VPhysicalVolume* currentWorld=0); + void UpdateMaterialList(G4VPhysicalVolume* currentWorld=nullptr); // Forces recomputation of material lists in all regions // in the store. diff --git a/source/geometry/management/include/G4SmartVoxelHeader.hh b/source/geometry/management/include/G4SmartVoxelHeader.hh index 53658d1802..5b116ae4a2 100644 --- a/source/geometry/management/include/G4SmartVoxelHeader.hh +++ b/source/geometry/management/include/G4SmartVoxelHeader.hh @@ -50,7 +50,9 @@ // 13.07.95, P.Kent - Initial version // -------------------------------------------------------------------- #ifndef G4SMARTVOXELHEADER_HH -#define G4SMARTVOXELHEADER_HH +#define G4SMARTVOXELHEADER_HH 1 + +#include #include "G4Types.hh" #include "geomdefs.hh" @@ -58,8 +60,6 @@ #include "G4SmartVoxelProxy.hh" #include "G4SmartVoxelNode.hh" -#include - // Forward declarations class G4LogicalVolume; class G4VoxelLimits; @@ -73,7 +73,7 @@ using G4VolumeExtentVector = std::vector; class G4SmartVoxelHeader { - public: // with description + public: G4SmartVoxelHeader(G4LogicalVolume* pVolume, G4int pSlice = 0); // Constructor for topmost header, to begin voxel construction at a @@ -110,7 +110,7 @@ class G4SmartVoxelHeader G4bool AllSlicesEqual() const; // True if all slices equal (after collection). - public: // without description + public: G4bool operator == (const G4SmartVoxelHeader& pHead) const; diff --git a/source/geometry/management/include/G4SmartVoxelNode.hh b/source/geometry/management/include/G4SmartVoxelNode.hh index 4a4bf346fc..211068e3c3 100644 --- a/source/geometry/management/include/G4SmartVoxelNode.hh +++ b/source/geometry/management/include/G4SmartVoxelNode.hh @@ -45,16 +45,19 @@ // 12.07.95, P.Kent - Initial version // -------------------------------------------------------------------- #ifndef G4SMARTVOXELNODE_HH -#define G4SMARTVOXELNODE_HH +#define G4SMARTVOXELNODE_HH 1 -#include "G4Types.hh" #include +#include "geomwdefs.hh" +#include "G4Types.hh" +#include "G4Allocator.hh" + using G4SliceVector = std::vector; class G4SmartVoxelNode { - public: // with description + public: G4SmartVoxelNode(G4int pSlice = 0) : fminEquivalent(pSlice), fmaxEquivalent(pSlice) {} @@ -62,7 +65,7 @@ class G4SmartVoxelNode // This number is not stored, but used to provide defaults for the // minimum and maximum equivalent node numbers. - ~G4SmartVoxelNode(); + ~G4SmartVoxelNode() = default; // Destructor. No actions. inline G4int GetVolume(G4int pVolumeNo) const; @@ -72,10 +75,10 @@ class G4SmartVoxelNode inline void Insert(G4int pVolumeNo); // Add the specified volume number to the contents. - inline size_t GetNoContained() const; + inline std::size_t GetNoContained() const; // Return the number of volumes inside the node. - inline size_t GetCapacity() const; + inline std::size_t GetCapacity() const; // Return the maximum capacity of the buffer. inline void Reserve(G4int noSlices); @@ -99,6 +102,11 @@ class G4SmartVoxelNode G4bool operator == (const G4SmartVoxelNode& v) const; // Equality operator. + inline void* operator new(std::size_t); + // Override "new" for "G4Allocator". + inline void operator delete(void* aNode); + // Override "delete" for "G4Allocator". + private: G4int fminEquivalent; diff --git a/source/geometry/management/include/G4SmartVoxelNode.icc b/source/geometry/management/include/G4SmartVoxelNode.icc index 5158a249c9..665b39bb18 100644 --- a/source/geometry/management/include/G4SmartVoxelNode.icc +++ b/source/geometry/management/include/G4SmartVoxelNode.icc @@ -27,60 +27,90 @@ // // -------------------------------------------------------------------- +extern G4GEOM_DLL G4Allocator*& aNodeAllocator(); + +// -------------------------------------------------------------------- +inline +void* G4SmartVoxelNode::operator new(std::size_t) +{ + if(aNodeAllocator() == nullptr) + { + aNodeAllocator() = new G4Allocator; + } + return (void*) aNodeAllocator()->MallocSingle(); +} + +// -------------------------------------------------------------------- +inline +void G4SmartVoxelNode::operator delete(void* aNode) +{ + aNodeAllocator()->FreeSingle((G4SmartVoxelNode*) aNode); +} + +// -------------------------------------------------------------------- inline G4int G4SmartVoxelNode::GetVolume(G4int pVolumeNo) const { return fcontents[pVolumeNo]; } +// -------------------------------------------------------------------- inline void G4SmartVoxelNode::Insert(G4int pVolumeNo) { fcontents.push_back(pVolumeNo); } +// -------------------------------------------------------------------- inline -size_t G4SmartVoxelNode::GetNoContained() const +std::size_t G4SmartVoxelNode::GetNoContained() const { return fcontents.size(); } +// -------------------------------------------------------------------- inline -size_t G4SmartVoxelNode::GetCapacity() const +std::size_t G4SmartVoxelNode::GetCapacity() const { return fcontents.capacity(); } +// -------------------------------------------------------------------- inline void G4SmartVoxelNode::Reserve(G4int noSlices) { fcontents.reserve(noSlices); } +// -------------------------------------------------------------------- inline void G4SmartVoxelNode::Shrink() { G4SliceVector(fcontents).swap(fcontents); } +// -------------------------------------------------------------------- inline G4int G4SmartVoxelNode::GetMaxEquivalentSliceNo() const { return fmaxEquivalent; } +// -------------------------------------------------------------------- inline void G4SmartVoxelNode::SetMaxEquivalentSliceNo(G4int pMax) { fmaxEquivalent = pMax; } +// -------------------------------------------------------------------- inline G4int G4SmartVoxelNode::GetMinEquivalentSliceNo() const { return fminEquivalent; } +// -------------------------------------------------------------------- inline void G4SmartVoxelNode::SetMinEquivalentSliceNo(G4int pMin) { diff --git a/source/geometry/management/include/G4SmartVoxelProxy.hh b/source/geometry/management/include/G4SmartVoxelProxy.hh index f1e8780d16..0c69a61d6c 100644 --- a/source/geometry/management/include/G4SmartVoxelProxy.hh +++ b/source/geometry/management/include/G4SmartVoxelProxy.hh @@ -37,18 +37,21 @@ // 12.07.95, P.Kent - Initial version // -------------------------------------------------------------------- #ifndef G4SMARTVOXELPROXY_HH -#define G4SMARTVOXELPROXY_HH +#define G4SMARTVOXELPROXY_HH 1 -#include "G4Types.hh" #include +#include "geomwdefs.hh" +#include "G4Types.hh" +#include "G4Allocator.hh" + class G4SmartVoxelNode; class G4SmartVoxelHeader; class G4SmartVoxelProxy { - public: // with description + public: G4SmartVoxelProxy(G4SmartVoxelHeader *pHeader) : fHeader(pHeader) {} @@ -58,7 +61,7 @@ class G4SmartVoxelProxy : fNode(pNode) {} // Proxy for the specified node. - ~G4SmartVoxelProxy(); + ~G4SmartVoxelProxy() = default; // Destructor - do nothing. Not responsible for proxied objects. G4bool IsHeader() const; @@ -77,6 +80,11 @@ class G4SmartVoxelProxy // Equality operator. // True when objects share same address. + inline void* operator new(std::size_t); + // Override "new" for "G4Allocator". + inline void operator delete(void* aProxy); + // Override "delete" for "G4Allocator". + private: G4SmartVoxelHeader* fHeader = nullptr; diff --git a/source/geometry/management/include/G4SmartVoxelProxy.icc b/source/geometry/management/include/G4SmartVoxelProxy.icc index 11e544c601..f2b868996d 100644 --- a/source/geometry/management/include/G4SmartVoxelProxy.icc +++ b/source/geometry/management/include/G4SmartVoxelProxy.icc @@ -27,18 +27,41 @@ // // -------------------------------------------------------------------- +extern G4GEOM_DLL G4Allocator*& aProxyAllocator(); + +// -------------------------------------------------------------------- +inline +void* G4SmartVoxelProxy::operator new(std::size_t) +{ + if(aProxyAllocator() == nullptr) + { + aProxyAllocator() = new G4Allocator; + } + return (void*) aProxyAllocator()->MallocSingle(); +} + +// -------------------------------------------------------------------- +inline +void G4SmartVoxelProxy::operator delete(void* aProxy) +{ + aProxyAllocator()->FreeSingle((G4SmartVoxelProxy*) aProxy); +} + +// -------------------------------------------------------------------- inline G4bool G4SmartVoxelProxy::IsHeader() const { return (fHeader) ? true : false; } +// -------------------------------------------------------------------- inline G4bool G4SmartVoxelProxy::IsNode() const { return (fNode) ? true : false; } +// -------------------------------------------------------------------- inline G4SmartVoxelNode* G4SmartVoxelProxy::GetNode() const { @@ -46,6 +69,7 @@ G4SmartVoxelNode* G4SmartVoxelProxy::GetNode() const return fNode; } +// -------------------------------------------------------------------- inline G4SmartVoxelHeader* G4SmartVoxelProxy::GetHeader() const { @@ -53,6 +77,7 @@ G4SmartVoxelHeader* G4SmartVoxelProxy::GetHeader() const return fHeader; } +// -------------------------------------------------------------------- inline G4bool G4SmartVoxelProxy::operator == (const G4SmartVoxelProxy& right) const { diff --git a/source/geometry/management/include/G4UAdapter.hh b/source/geometry/management/include/G4UAdapter.hh index 6c7f81be6d..82a6199122 100644 --- a/source/geometry/management/include/G4UAdapter.hh +++ b/source/geometry/management/include/G4UAdapter.hh @@ -189,10 +189,6 @@ class G4UAdapter : public G4VSolid, protected UnplacedVolume_t // Smart access function - creates on request and stores for future // access. A null pointer means "not available". - inline friend std::ostream& operator<< ( std::ostream& os, const G4UAdapter& uad ) - { const UnplacedVolume_t& origUnplaced = uad; return operator<< ( os, origUnplaced ); } - // Streaming operator, forward to VecGeom method - public: // without description G4UAdapter(__void__&); @@ -423,6 +419,14 @@ namespace G4Mutex pMutex = G4MUTEX_INITIALIZER; } +// Free function to enable ostream output +template +std::ostream& +operator<<(std::ostream& os, const G4UAdapter& uAdapted) +{ + return uAdapted.StreamInfo(os); +} + template void G4UAdapter:: ComputeDimensions(G4VPVParameterisation*, const G4int, diff --git a/source/geometry/management/include/G4VCurvedTrajectoryFilter.hh b/source/geometry/management/include/G4VCurvedTrajectoryFilter.hh index 6ccfcc44dc..cae7be16f6 100644 --- a/source/geometry/management/include/G4VCurvedTrajectoryFilter.hh +++ b/source/geometry/management/include/G4VCurvedTrajectoryFilter.hh @@ -41,8 +41,8 @@ // First version: Oct 30, 2002 - Jacek Generowicz // ------------------------------------------------------------------------ -#ifndef G4VCurvedTrajectoryFilter_hh -#define G4VCurvedTrajectoryFilter_hh +#ifndef G4VCURVEDTRAJECTORYFILTER_HH +#define G4VCURVEDTRAJECTORYFILTER_HH 1 #include "G4ThreeVector.hh" #include @@ -50,27 +50,27 @@ class G4VCurvedTrajectoryFilter { -public: // with description + public: - G4VCurvedTrajectoryFilter(); - virtual ~G4VCurvedTrajectoryFilter(); + G4VCurvedTrajectoryFilter() = default; + virtual ~G4VCurvedTrajectoryFilter() = default; - // Probably do not want these objects to be copied, - // so make the copy constructor private + // Probably do not want these objects to be copied, + // so make the copy constructor private - void CreateNewTrajectorySegment(); - // Each segment stores the auxiliary points of a single step. + void CreateNewTrajectorySegment(); + // Each segment stores the auxiliary points of a single step. - virtual void TakeIntermediatePoint( G4ThreeVector newPoint ) = 0; - // Submit intermediate points for the filter to consider keeping or - // rejecting. Derived classes should implement the filtering algorithm - // in this method. + virtual void TakeIntermediatePoint( G4ThreeVector newPoint ) = 0; + // Submit intermediate points for the filter to consider keeping or + // rejecting. Derived classes should implement the filtering algorithm + // in this method. - std::vector* GimmeThePointsAndForgetThem(); + std::vector* GimmeThePointsAndForgetThem(); -protected: + protected: - std::vector* fpFilteredPoints = nullptr; + std::vector* fpFilteredPoints = nullptr; }; -#endif /* G4VCurvedTrajectoryFilter_hh */ +#endif diff --git a/source/geometry/management/include/G4VNestedParameterisation.hh b/source/geometry/management/include/G4VNestedParameterisation.hh index 17e3ac2c11..c0b0ce1c3c 100644 --- a/source/geometry/management/include/G4VNestedParameterisation.hh +++ b/source/geometry/management/include/G4VNestedParameterisation.hh @@ -45,7 +45,7 @@ // 24.02.05, J.Apostolakis - First created version. // -------------------------------------------------------------------- #ifndef G4VNESTEDPARAMETERISATION_HH -#define G4VNESTEDPARAMETERISATION_HH +#define G4VNESTEDPARAMETERISATION_HH 1 #include "G4Types.hh" #include "G4VPVParameterisation.hh" @@ -72,13 +72,13 @@ class G4Polycone; class G4Polyhedra; class G4Hype; -class G4VNestedParameterisation: public G4VPVParameterisation, - public G4VVolumeMaterialScanner +class G4VNestedParameterisation : public G4VPVParameterisation, + public G4VVolumeMaterialScanner { - public: // with description + public: - G4VNestedParameterisation(); - virtual ~G4VNestedParameterisation(); + G4VNestedParameterisation() = default; + virtual ~G4VNestedParameterisation() = default; // Methods required in derived classes // ----------------------------------- diff --git a/source/geometry/management/include/G4VPVDivisionFactory.hh b/source/geometry/management/include/G4VPVDivisionFactory.hh index 01482f6cbd..24aa3f5b81 100644 --- a/source/geometry/management/include/G4VPVDivisionFactory.hh +++ b/source/geometry/management/include/G4VPVDivisionFactory.hh @@ -32,8 +32,8 @@ // Author: Ivana Hrivnacova, 4.5.2004 // ------------------------------------------------------------------------ -#ifndef G4VPVDIVISION_FACTORY_HH -#define G4VPVDIVISION_FACTORY_HH +#ifndef G4VPVDIVISIONFACTORY_HH +#define G4VPVDIVISIONFACTORY_HH 1 #include "geomdefs.hh" @@ -43,9 +43,9 @@ class G4VPVParameterisation; class G4VPVDivisionFactory { - public: // with description + public: - virtual ~G4VPVDivisionFactory(); + virtual ~G4VPVDivisionFactory() = default; static G4VPVDivisionFactory* Instance(); @@ -89,12 +89,11 @@ class G4VPVDivisionFactory protected: - G4VPVDivisionFactory(); + G4VPVDivisionFactory() = default; protected: - static G4ThreadLocal G4VPVDivisionFactory* fgInstance; - + static G4ThreadLocal G4VPVDivisionFactory* fgInstance; }; #endif diff --git a/source/geometry/management/include/G4VPVParameterisation.hh b/source/geometry/management/include/G4VPVParameterisation.hh index f929528612..35a36363f8 100644 --- a/source/geometry/management/include/G4VPVParameterisation.hh +++ b/source/geometry/management/include/G4VPVParameterisation.hh @@ -37,7 +37,7 @@ // 17.02.98, J.Apostolakis - Allowing the parameterisation of solid type // -------------------------------------------------------------------- #ifndef G4VPVPARAMETERISATION_HH -#define G4VPVPARAMETERISATION_HH +#define G4VPVPARAMETERISATION_HH 1 #include "G4Types.hh" #include "G4VVolumeMaterialScanner.hh" @@ -69,10 +69,8 @@ class G4VPVParameterisation { public: - G4VPVParameterisation(); - virtual ~G4VPVParameterisation(); - - public: // with description + G4VPVParameterisation() = default; + virtual ~G4VPVParameterisation() = default; virtual void ComputeTransformation(const G4int, G4VPhysicalVolume * ) const = 0; diff --git a/source/geometry/management/include/G4VPhysicalVolume.hh b/source/geometry/management/include/G4VPhysicalVolume.hh index 61c39db37b..de13459f28 100644 --- a/source/geometry/management/include/G4VPhysicalVolume.hh +++ b/source/geometry/management/include/G4VPhysicalVolume.hh @@ -38,7 +38,7 @@ // 24.07.95, P.Kent: First non-stub version // -------------------------------------------------------------------- #ifndef G4VPHYSICALVOLUME_HH -#define G4VPHYSICALVOLUME_HH +#define G4VPHYSICALVOLUME_HH 1 #include "G4Types.hh" #include "G4String.hh" @@ -60,7 +60,7 @@ class G4PVData public: - G4PVData() {} + G4PVData() = default; void initialize() { @@ -72,12 +72,12 @@ class G4PVData G4double tx = 0., ty = 0., tz = 0.; }; -typedef G4GeomSplitter G4PVManager; +using G4PVManager = G4GeomSplitter; // Implementation detail for use of G4PVData objects class G4VPhysicalVolume { - public: // with description + public: G4VPhysicalVolume(G4RotationMatrix* pRot, const G4ThreeVector& tlate, @@ -198,7 +198,7 @@ class G4VPhysicalVolume // Concrete implementation is done and required only for placed and // parameterised volumes. Returns true if the volume is overlapping. - public: // without description + public: G4VPhysicalVolume(__void__&); // Fake default constructor for usage restricted to direct object @@ -266,7 +266,6 @@ class G4VPhysicalVolume // it copies the array of G4PVData instances from the master thread. // In addition, it invokes a method similiar to the constructor explicitly // to achieve the partial effect for each instance in the array. -// #include "G4VPhysicalVolume.icc" diff --git a/source/geometry/management/include/G4VSolid.hh b/source/geometry/management/include/G4VSolid.hh index b663a747ac..fe6ca90d9a 100644 --- a/source/geometry/management/include/G4VSolid.hh +++ b/source/geometry/management/include/G4VSolid.hh @@ -38,10 +38,10 @@ // surface normal of the shape at a given point, and to compute // the extent of the shape. [see descriptions below] // -// Some protected/private utility functions are implemented for the +// Some protected/private utility functions are implemented for the // clipping of regions for the computation of a solid's extent. Note that // the clipping mechanism is presently inefficient. -// +// // Some visualization/graphics functions are also defined. // // Member Data: @@ -52,11 +52,11 @@ // 12.04.00 J.Allison Implemented GetExtent() in terms of CalculateExtent() // 17.06.98 J.Apostolakis Added pure virtual function GetEntityType() // 26.07.96 P.Kent Added ComputeDimensions() for replication mechanism -// 27.03.96 J.Allison Methods for visualisation +// 27.03.96 J.Allison Methods for visualisation // 30.06.95 P.Kent Initial version, no scoping or visualisation functions // -------------------------------------------------------------------- #ifndef G4VSOLID_HH -#define G4VSOLID_HH +#define G4VSOLID_HH 1 #include "G4Types.hh" #include "G4String.hh" @@ -81,7 +81,7 @@ using G4GeometryType = G4String; class G4VSolid { - public: // with description + public: // with description G4VSolid(const G4String& name); // Creates a new shape, with the supplied name. No provision is made @@ -89,12 +89,9 @@ class G4VSolid virtual ~G4VSolid(); // Default destructor. - inline G4bool operator==( const G4VSolid& s ) const; + inline G4bool operator==(const G4VSolid& s) const; // Return true only if addresses are the same. - friend std::ostream& operator<< ( std::ostream& os, const G4VSolid& e ); - // Streaming operator, using DumpInfo(). - inline G4String GetName() const; // Returns the current shape's name. void SetName(const G4String& name); @@ -218,8 +215,8 @@ class G4VSolid // If the solid is made up from a Boolean operation of two solids, // return the "no" solid. If the solid is not a "Boolean", return 0. - virtual const G4DisplacedSolid* GetDisplacedSolidPtr() const; - virtual G4DisplacedSolid* GetDisplacedSolidPtr(); + virtual const G4DisplacedSolid* GetDisplacedSolidPtr() const; + virtual G4DisplacedSolid* GetDisplacedSolidPtr(); // If the solid is a "G4DisplacedSolid", return a self pointer // else return 0. @@ -231,7 +228,7 @@ class G4VSolid // persistifiable objects. G4VSolid(const G4VSolid& rhs); - G4VSolid& operator=(const G4VSolid& rhs); + G4VSolid& operator=(const G4VSolid& rhs); // Copy constructor and assignment operator. G4double EstimateCubicVolume(G4int nStat, G4double epsilon) const; @@ -248,7 +245,7 @@ class G4VSolid void CalculateClippedPolygonExtent(G4ThreeVectorList& pPolygon, const G4VoxelLimits& pVoxelLimit, - const EAxis pAxis, + const EAxis pAxis, G4double& pMin, G4double& pMax) const; // Calculate the maximum and minimum extents of the convex polygon // pPolygon along the axis pAxis, within the limits pVoxelLimit. @@ -261,7 +258,7 @@ class G4VSolid void ClipCrossSection(G4ThreeVectorList* pVertices, const G4int pSectionIndex, const G4VoxelLimits& pVoxelLimit, - const EAxis pAxis, + const EAxis pAxis, G4double& pMin, G4double& pMax) const; // Calculate the maximum and minimum extents of the polygon described // by the vertices: pSectionIndex->pSectionIndex+1-> @@ -276,7 +273,7 @@ class G4VSolid void ClipBetweenSections(G4ThreeVectorList* pVertices, const G4int pSectionIndex, const G4VoxelLimits& pVoxelLimit, - const EAxis pAxis, + const EAxis pAxis, G4double& pMin, G4double& pMax) const; // Calculate the maximum and minimum extents of the polygons // joining the CrossSections at pSectionIndex->pSectionIndex+3 and @@ -294,7 +291,7 @@ class G4VSolid const EAxis pAxis ) const; // Clip the specified convex polygon to the given limits, where // the polygon is described by the vertices at (0),(1),...,(n),(0) in - // pPolygon. + // pPolygon. // If the polygon is completely clipped away, the polygon is cleared. protected: @@ -315,6 +312,9 @@ class G4VSolid G4String fshapeName; // Name }; +/// Output solid information to given ostream +std::ostream& operator<<(std::ostream& os, const G4VSolid& e); + #include "G4VSolid.icc" #endif diff --git a/source/geometry/management/include/G4VTouchable.hh b/source/geometry/management/include/G4VTouchable.hh index 23344b1989..0224932e85 100644 --- a/source/geometry/management/include/G4VTouchable.hh +++ b/source/geometry/management/include/G4VTouchable.hh @@ -88,7 +88,7 @@ // Created: Paul Kent, August 1996 // -------------------------------------------------------------------- #ifndef G4VTOUCHABLE_HH -#define G4VTOUCHABLE_HH +#define G4VTOUCHABLE_HH 1 #include "G4Types.hh" @@ -102,10 +102,10 @@ class G4NavigationHistory; class G4VTouchable { - public: // with description + public: - G4VTouchable(); - virtual ~G4VTouchable(); + G4VTouchable() = default; + virtual ~G4VTouchable() = default; // Constructor and destructor. virtual const G4ThreeVector& GetTranslation(G4int depth=0) const = 0; @@ -125,12 +125,8 @@ class G4VTouchable const G4NavigationHistory* history = nullptr); // Update method. - public: // without description - - // virtual void ResetLevel(); - virtual const G4NavigationHistory* GetHistory() const; - // Should this method be deprecated ? It is used in G4Navigator! + // Method used in G4Navigator. }; #include "G4VTouchable.icc" diff --git a/source/geometry/management/include/G4VUserRegionInformation.hh b/source/geometry/management/include/G4VUserRegionInformation.hh index c00a2b1b98..646f5e6726 100644 --- a/source/geometry/management/include/G4VUserRegionInformation.hh +++ b/source/geometry/management/include/G4VUserRegionInformation.hh @@ -37,15 +37,15 @@ // 21/10/2003 - M.Asai, Created. // -------------------------------------------------------------------- -#ifndef G4VUserRegionInformation_HH -#define G4VUserRegionInformation_HH 1 +#ifndef G4VUSERREGIONINFORMATION_HH +#define G4VUSERREGIONINFORMATION_HH 1 class G4VUserRegionInformation { - public: // with description + public: - G4VUserRegionInformation() {} - virtual ~G4VUserRegionInformation() {} + G4VUserRegionInformation() = default; + virtual ~G4VUserRegionInformation() = default; virtual void Print() const = 0; }; diff --git a/source/geometry/management/include/G4VoxelLimits.hh b/source/geometry/management/include/G4VoxelLimits.hh index 0f514c6e3a..8d32806f63 100644 --- a/source/geometry/management/include/G4VoxelLimits.hh +++ b/source/geometry/management/include/G4VoxelLimits.hh @@ -40,7 +40,7 @@ // 13.07.95, P.Kent - Initial version. // -------------------------------------------------------------------- #ifndef G4VOXELLIMITS_HH -#define G4VOXELLIMITS_HH +#define G4VOXELLIMITS_HH 1 #include "G4Types.hh" #include "geomdefs.hh" @@ -51,12 +51,12 @@ class G4VoxelLimits { - public: // with description + public: - G4VoxelLimits(); + G4VoxelLimits() = default; // Constructor - initialise to be unlimited. Volume unrestricted. - ~G4VoxelLimits(); + ~G4VoxelLimits() = default; // Destructor. No actions. void AddLimit(const EAxis pAxis, const G4double pMin, const G4double pMax); diff --git a/source/geometry/management/src/G4BlockingList.cc b/source/geometry/management/src/G4BlockingList.cc index 96509d6493..91308c36a8 100644 --- a/source/geometry/management/src/G4BlockingList.cc +++ b/source/geometry/management/src/G4BlockingList.cc @@ -34,12 +34,6 @@ G4BlockingList::G4BlockingList(G4int maxDefault, G4int stride) { } -// Do nothing destructor -// -G4BlockingList::~G4BlockingList() -{ -} - // Clear List and reset tag // void G4BlockingList::FullyReset() diff --git a/source/geometry/management/src/G4BoundingEnvelope.cc b/source/geometry/management/src/G4BoundingEnvelope.cc index 19fc7ccc6a..6561a872d4 100644 --- a/source/geometry/management/src/G4BoundingEnvelope.cc +++ b/source/geometry/management/src/G4BoundingEnvelope.cc @@ -29,8 +29,8 @@ // -------------------------------------------------------------------- #include -#include "globals.hh" +#include "globals.hh" #include "G4BoundingEnvelope.hh" #include "G4GeometryTolerance.hh" @@ -105,14 +105,6 @@ G4BoundingEnvelope( const G4ThreeVector& pMin, CheckBoundingPolygons(); } -/////////////////////////////////////////////////////////////////////// -// -// Destructor -// -G4BoundingEnvelope::~G4BoundingEnvelope() -{ -} - /////////////////////////////////////////////////////////////////////// // // Check correctness of the axis aligned bounding box @@ -428,7 +420,7 @@ G4BoundingEnvelope::CalculateExtent(const EAxis pAxis, // Allocate memory for transformed polygons // - G4int nbases = (fPolygons == 0) ? 2 : fPolygons->size(); + G4int nbases = (fPolygons == nullptr) ? 2 : fPolygons->size(); std::vector bases(nbases); if (fPolygons == nullptr) { @@ -539,7 +531,7 @@ G4BoundingEnvelope::CalculateExtent(const EAxis pAxis, // Free memory // - for (G4int i=0; i::const_iterator ia, iaend; - std::vector::iterator ib = pBases.begin(); - ia = (fPolygons == 0) ? aabb.begin() : fPolygons->begin(); - iaend = (fPolygons == 0) ? aabb.end() : fPolygons->end(); + auto ib = pBases.begin(); + ia = (fPolygons == nullptr) ? aabb.cbegin() : fPolygons->cbegin(); + iaend = (fPolygons == nullptr) ? aabb.cend() : fPolygons->cend(); if (pTransform3D.xx()==1 && pTransform3D.yy()==1 && pTransform3D.zz()==1) { G4ThreeVector offset = pTransform3D.getTranslation(); for ( ; ia != iaend; ++ia, ++ib) { - G4ThreeVectorList::const_iterator ka = (*ia)->begin(); - G4Polygon3D::iterator kb = (*ib)->begin(); - for ( ; ka != (*ia)->end(); ++ka, ++kb) { (*kb) = (*ka) + offset; } + auto ka = (*ia)->cbegin(); + auto kb = (*ib)->begin(); + for ( ; ka != (*ia)->cend(); ++ka, ++kb) { (*kb) = (*ka) + offset; } } } else { for ( ; ia != iaend; ++ia, ++ib) { - G4ThreeVectorList::const_iterator ka = (*ia)->begin(); - G4Polygon3D::iterator kb = (*ib)->begin(); - for ( ; ka != (*ia)->end(); ++ka, ++kb) + auto ka = (*ia)->cbegin(); + auto kb = (*ib)->begin(); + for ( ; ka != (*ia)->cend(); ++ka, ++kb) { (*kb) = pTransform3D*G4Point3D(*ka); } diff --git a/source/geometry/management/src/G4ErrorCylSurfaceTarget.cc b/source/geometry/management/src/G4ErrorCylSurfaceTarget.cc index 3ac63e3ca5..63278daf2a 100644 --- a/source/geometry/management/src/G4ErrorCylSurfaceTarget.cc +++ b/source/geometry/management/src/G4ErrorCylSurfaceTarget.cc @@ -76,12 +76,6 @@ G4ErrorCylSurfaceTarget( const G4double& radius, //--------------------------------------------------------------------- -G4ErrorCylSurfaceTarget::~G4ErrorCylSurfaceTarget() -{ -} - -//--------------------------------------------------------------------- - G4double G4ErrorCylSurfaceTarget:: GetDistanceFromPoint( const G4ThreeVector& point, const G4ThreeVector& dir ) const diff --git a/source/geometry/management/src/G4ErrorPlaneSurfaceTarget.cc b/source/geometry/management/src/G4ErrorPlaneSurfaceTarget.cc index dbded0bb3a..d1bae4ea20 100644 --- a/source/geometry/management/src/G4ErrorPlaneSurfaceTarget.cc +++ b/source/geometry/management/src/G4ErrorPlaneSurfaceTarget.cc @@ -89,12 +89,6 @@ G4ErrorPlaneSurfaceTarget(const G4Point3D &p1, //--------------------------------------------------------------------- -G4ErrorPlaneSurfaceTarget::~G4ErrorPlaneSurfaceTarget() -{ -} - -//--------------------------------------------------------------------- - G4ThreeVector G4ErrorPlaneSurfaceTarget:: Intersect( const G4ThreeVector& pt, const G4ThreeVector& dir ) const { diff --git a/source/geometry/management/src/G4ErrorSurfaceTarget.cc b/source/geometry/management/src/G4ErrorSurfaceTarget.cc index 89a96bc0f3..516d20c41a 100644 --- a/source/geometry/management/src/G4ErrorSurfaceTarget.cc +++ b/source/geometry/management/src/G4ErrorSurfaceTarget.cc @@ -30,5 +30,4 @@ #include "G4ErrorSurfaceTarget.hh" -G4ErrorSurfaceTarget::G4ErrorSurfaceTarget(){} -G4ErrorSurfaceTarget::~G4ErrorSurfaceTarget(){} +G4ErrorSurfaceTarget::G4ErrorSurfaceTarget() = default; diff --git a/source/geometry/management/src/G4ErrorTanPlaneTarget.cc b/source/geometry/management/src/G4ErrorTanPlaneTarget.cc index 3f93423f83..42a28773a5 100644 --- a/source/geometry/management/src/G4ErrorTanPlaneTarget.cc +++ b/source/geometry/management/src/G4ErrorTanPlaneTarget.cc @@ -30,5 +30,4 @@ #include "G4ErrorTanPlaneTarget.hh" -G4ErrorTanPlaneTarget::G4ErrorTanPlaneTarget(){} -G4ErrorTanPlaneTarget::~G4ErrorTanPlaneTarget(){} +G4ErrorTanPlaneTarget::G4ErrorTanPlaneTarget() = default; diff --git a/source/geometry/management/src/G4ErrorTarget.cc b/source/geometry/management/src/G4ErrorTarget.cc index 67dc4996e2..073716bdef 100644 --- a/source/geometry/management/src/G4ErrorTarget.cc +++ b/source/geometry/management/src/G4ErrorTarget.cc @@ -32,8 +32,6 @@ G4ErrorTarget::G4ErrorTarget() : theType(G4ErrorTarget_GeomVolume) {} -G4ErrorTarget::~G4ErrorTarget() {} - G4double G4ErrorTarget::GetDistanceFromPoint( const G4ThreeVector&, const G4ThreeVector& ) const { diff --git a/source/geometry/management/src/G4GeometryManager.cc b/source/geometry/management/src/G4GeometryManager.cc index 3b64c4f2ef..3b7d544ccc 100644 --- a/source/geometry/management/src/G4GeometryManager.cc +++ b/source/geometry/management/src/G4GeometryManager.cc @@ -29,6 +29,7 @@ // -------------------------------------------------------------------- #include + #include "G4Timer.hh" #include "G4GeometryManager.hh" #include "G4SystemOfUnits.hh" @@ -57,14 +58,6 @@ G4ThreadLocal G4GeometryManager* G4GeometryManager::fgInstance = nullptr; G4ThreadLocal G4bool G4GeometryManager::fIsClosed = false; -// *************************************************************************** -// Constructor. Set the geometry to be open -// *************************************************************************** -// -G4GeometryManager::G4GeometryManager() -{ -} - // *************************************************************************** // Destructor // *************************************************************************** @@ -179,7 +172,7 @@ void G4GeometryManager::BuildOptimisations(G4bool allOpts, G4bool verbose) // head = volume->GetVoxelHeader(); delete head; - volume->SetVoxelHeader(0); + volume->SetVoxelHeader(nullptr); if ( ( (volume->IsToOptimise()) && (volume->GetNoDaughters()>=kMinVoxelVolumesLevel1&&allOpts) ) || ( (volume->GetNoDaughters()==1) diff --git a/source/geometry/management/src/G4IdentityTrajectoryFilter.cc b/source/geometry/management/src/G4IdentityTrajectoryFilter.cc index 1bf7cb12cb..da52dce17d 100644 --- a/source/geometry/management/src/G4IdentityTrajectoryFilter.cc +++ b/source/geometry/management/src/G4IdentityTrajectoryFilter.cc @@ -30,14 +30,6 @@ #include "G4IdentityTrajectoryFilter.hh" -G4IdentityTrajectoryFilter::G4IdentityTrajectoryFilter() -{ -} - -G4IdentityTrajectoryFilter::~G4IdentityTrajectoryFilter() -{ -} - void G4IdentityTrajectoryFilter::TakeIntermediatePoint( G4ThreeVector newPoint ) { diff --git a/source/geometry/management/src/G4LogicalSurface.cc b/source/geometry/management/src/G4LogicalSurface.cc index 009873d7b0..8929bcfaae 100644 --- a/source/geometry/management/src/G4LogicalSurface.cc +++ b/source/geometry/management/src/G4LogicalSurface.cc @@ -35,7 +35,3 @@ G4LogicalSurface::G4LogicalSurface(const G4String& name, : theName(name), theSurfaceProperty(surfaceProperty) { } - -G4LogicalSurface::~G4LogicalSurface() -{ -} diff --git a/source/geometry/management/src/G4Region.cc b/source/geometry/management/src/G4Region.cc index 32795709ed..85be9a359f 100644 --- a/source/geometry/management/src/G4Region.cc +++ b/source/geometry/management/src/G4Region.cc @@ -398,7 +398,7 @@ void G4Region::UpdateMaterialList() void G4Region::SetWorld(G4VPhysicalVolume* wp) { if(!wp) - { fWorldPhys = 0; } + { fWorldPhys = nullptr; } else { if(BelongsTo(wp)) fWorldPhys = wp; } diff --git a/source/geometry/management/src/G4SmartVoxelHeader.cc b/source/geometry/management/src/G4SmartVoxelHeader.cc index 8d7088f538..7b166c56b1 100644 --- a/source/geometry/management/src/G4SmartVoxelHeader.cc +++ b/source/geometry/management/src/G4SmartVoxelHeader.cc @@ -63,7 +63,6 @@ G4SmartVoxelHeader::G4SmartVoxelHeader(G4LogicalVolume* pVolume, fparamAxis(kUndefined) { size_t nDaughters = pVolume->GetNoDaughters(); - G4VoxelLimits limits; // Create `unlimited' limits object // Determine whether daughter is replicated // @@ -955,7 +954,7 @@ G4ProxyVector* G4SmartVoxelHeader::BuildNodes(G4LogicalVolume* pVolume, // Create G4VoxelNodes. Will Add proxies before setting fslices // - G4NodeVector* nodeList = new G4NodeVector(); + auto* nodeList = new G4NodeVector(); if (nodeList == nullptr) { G4Exception("G4SmartVoxelHeader::BuildNodes()", "GeomMgt0003", @@ -1017,7 +1016,7 @@ G4ProxyVector* G4SmartVoxelHeader::BuildNodes(G4LogicalVolume* pVolume, // Create proxy List : caller has deletion responsibility // (but we must delete nodeList *itself* - not the contents) // - G4ProxyVector* proxyList = new G4ProxyVector(); + auto* proxyList = new G4ProxyVector(); if (proxyList == nullptr) { G4Exception("G4SmartVoxelHeader::BuildNodes()", "GeomMgt0003", @@ -1034,7 +1033,7 @@ G4ProxyVector* G4SmartVoxelHeader::BuildNodes(G4LogicalVolume* pVolume, // Get rid of possible excess capacity in the internal node vector // ((*nodeList)[nNode])->Shrink(); - G4SmartVoxelProxy* pProxyNode = new G4SmartVoxelProxy((*nodeList)[nNode]); + auto* pProxyNode = new G4SmartVoxelProxy((*nodeList)[nNode]); if (pProxyNode == nullptr) { G4Exception("G4SmartVoxelHeader::BuildNodes()", "GeomMgt0003", @@ -1214,7 +1213,7 @@ void G4SmartVoxelHeader::RefineNodes(G4LogicalVolume* pVolume, // Delete node proxies at start of collected sets of nodes/headers // - lastProxy=0; + lastProxy=nullptr; for (replaceNo=minNo; replaceNo<=maxNo; ++replaceNo) { if (lastProxy != fslices[replaceNo]) @@ -1341,7 +1340,7 @@ std::ostream& operator << (std::ostream& os, const G4SmartVoxelHeader& h) if (haveHeaders) { - collectHead=0; + collectHead=nullptr; for (j=0; jIsHeader()) diff --git a/source/geometry/management/src/G4SmartVoxelNode.cc b/source/geometry/management/src/G4SmartVoxelNode.cc index f343ce6b41..2b7a8837ed 100644 --- a/source/geometry/management/src/G4SmartVoxelNode.cc +++ b/source/geometry/management/src/G4SmartVoxelNode.cc @@ -31,23 +31,26 @@ #include "G4SmartVoxelNode.hh" -// Empty destructor -// -G4SmartVoxelNode::~G4SmartVoxelNode() +// -------------------------------------------------------------------- +G4Allocator*& aNodeAllocator() { + G4ThreadLocalStatic G4Allocator* _instance = nullptr; + return _instance; } +// -------------------------------------------------------------------- // Return true if contents equal // // Preconditions: // // Node contents were entered in the same order +// G4bool G4SmartVoxelNode::operator == (const G4SmartVoxelNode& v) const { - size_t maxNode = GetNoContained(); + std::size_t maxNode = GetNoContained(); if (maxNode == v.GetNoContained()) { - for (size_t node=0; node*& aProxyAllocator() { + G4ThreadLocalStatic G4Allocator* _instance = nullptr; + return _instance; } diff --git a/source/geometry/management/src/G4VCurvedTrajectoryFilter.cc b/source/geometry/management/src/G4VCurvedTrajectoryFilter.cc index ff20f35e82..2a7d5b7298 100644 --- a/source/geometry/management/src/G4VCurvedTrajectoryFilter.cc +++ b/source/geometry/management/src/G4VCurvedTrajectoryFilter.cc @@ -30,14 +30,6 @@ #include "G4VCurvedTrajectoryFilter.hh" -G4VCurvedTrajectoryFilter::G4VCurvedTrajectoryFilter() -{ -} - -G4VCurvedTrajectoryFilter::~G4VCurvedTrajectoryFilter() -{ -} - std::vector* G4VCurvedTrajectoryFilter::GimmeThePointsAndForgetThem() { @@ -55,7 +47,7 @@ G4VCurvedTrajectoryFilter::GimmeThePointsAndForgetThem() } void -G4VCurvedTrajectoryFilter::CreateNewTrajectorySegment( ) +G4VCurvedTrajectoryFilter::CreateNewTrajectorySegment() { if (fpFilteredPoints != nullptr) { diff --git a/source/geometry/management/src/G4VNestedParameterisation.cc b/source/geometry/management/src/G4VNestedParameterisation.cc index c1f853d97b..8b0814578e 100644 --- a/source/geometry/management/src/G4VNestedParameterisation.cc +++ b/source/geometry/management/src/G4VNestedParameterisation.cc @@ -34,32 +34,26 @@ #include "G4LogicalVolume.hh" #include "G4VTouchable.hh" -G4VNestedParameterisation::G4VNestedParameterisation() - : G4VPVParameterisation(), - G4VVolumeMaterialScanner() -{ -} - -G4VNestedParameterisation::~G4VNestedParameterisation() -{ -} - +// -------------------------------------------------------------------- G4VSolid* G4VNestedParameterisation::ComputeSolid(const G4int, G4VPhysicalVolume* pvol) { return pvol->GetLogicalVolume()->GetSolid(); } +// -------------------------------------------------------------------- G4bool G4VNestedParameterisation::IsNested() const { return true; } +// -------------------------------------------------------------------- G4VVolumeMaterialScanner* G4VNestedParameterisation::GetMaterialScanner() { return this; } +// -------------------------------------------------------------------- G4Material* G4VNestedParameterisation::ComputeMaterial(const G4int repNo, G4VPhysicalVolume* currentVol, diff --git a/source/geometry/management/src/G4VPVDivisionFactory.cc b/source/geometry/management/src/G4VPVDivisionFactory.cc index c64e341fc4..67565a7575 100644 --- a/source/geometry/management/src/G4VPVDivisionFactory.cc +++ b/source/geometry/management/src/G4VPVDivisionFactory.cc @@ -40,19 +40,3 @@ G4VPVDivisionFactory* G4VPVDivisionFactory::Instance() // --- return fgInstance; } - - -//_____________________________________________________________________________ - -G4VPVDivisionFactory::G4VPVDivisionFactory() -{ - // Protected singleton constructor. - // --- - // fgInstance = this; -} - -//_____________________________________________________________________________ - -G4VPVDivisionFactory::~G4VPVDivisionFactory() -{ -} diff --git a/source/geometry/management/src/G4VPVParameterisation.cc b/source/geometry/management/src/G4VPVParameterisation.cc index fcfde2a6f1..620bae4fa1 100644 --- a/source/geometry/management/src/G4VPVParameterisation.cc +++ b/source/geometry/management/src/G4VPVParameterisation.cc @@ -34,14 +34,7 @@ #include "G4LogicalVolume.hh" #include "G4VVolumeMaterialScanner.hh" -G4VPVParameterisation::G4VPVParameterisation() -{ -} - -G4VPVParameterisation::~G4VPVParameterisation() -{ -} - +// -------------------------------------------------------------------- G4VSolid* G4VPVParameterisation::ComputeSolid(const G4int, G4VPhysicalVolume* pPhysicalVol) @@ -49,6 +42,7 @@ G4VPVParameterisation::ComputeSolid(const G4int, return pPhysicalVol->GetLogicalVolume()->GetSolid(); } +// -------------------------------------------------------------------- G4Material* G4VPVParameterisation::ComputeMaterial(const G4int, G4VPhysicalVolume* pPhysicalVol, @@ -57,15 +51,15 @@ G4VPVParameterisation::ComputeMaterial(const G4int, return pPhysicalVol->GetLogicalVolume()->GetMaterial(); } - +// -------------------------------------------------------------------- G4bool G4VPVParameterisation::IsNested() const { return false; } +// -------------------------------------------------------------------- G4VVolumeMaterialScanner* G4VPVParameterisation::GetMaterialScanner() { return nullptr; } -// These enable material scan for nested parameterisations diff --git a/source/geometry/management/src/G4VSolid.cc b/source/geometry/management/src/G4VSolid.cc index e8b57c1678..8aef9d3388 100644 --- a/source/geometry/management/src/G4VSolid.cc +++ b/source/geometry/management/src/G4VSolid.cc @@ -39,6 +39,15 @@ #include "G4AffineTransform.hh" #include "G4VisExtent.hh" +////////////////////////////////////////////////////////////////////////// +// +// Streaming operator dumping solid contents + +std::ostream& operator<< ( std::ostream& os, const G4VSolid& e ) +{ + return e.StreamInfo(os); +} + ////////////////////////////////////////////////////////////////////////// // // Constructor @@ -95,7 +104,7 @@ G4VSolid::~G4VSolid() // // Assignment operator -G4VSolid& G4VSolid::operator = (const G4VSolid& rhs) +G4VSolid& G4VSolid::operator = (const G4VSolid& rhs) { // Check assignment to self // @@ -107,17 +116,10 @@ G4VSolid& G4VSolid::operator = (const G4VSolid& rhs) fshapeName = rhs.fshapeName; return *this; -} - -////////////////////////////////////////////////////////////////////////// -// -// Streaming operator dumping solid contents - -std::ostream& operator<< ( std::ostream& os, const G4VSolid& e ) -{ - return e.StreamInfo(os); } + + ////////////////////////////////////////////////////////////////////////// // // Set solid name and notify store of the change @@ -126,7 +128,7 @@ void G4VSolid::SetName(const G4String& name) { fshapeName = name; G4SolidStore::GetInstance()->SetMapValid(false); -} +} ////////////////////////////////////////////////////////////////////////// // @@ -163,16 +165,16 @@ G4ThreeVector G4VSolid::GetPointOnSurface() const // Dummy implementations ... const G4VSolid* G4VSolid::GetConstituentSolid(G4int) const -{ return nullptr; } +{ return nullptr; } G4VSolid* G4VSolid::GetConstituentSolid(G4int) -{ return nullptr; } +{ return nullptr; } const G4DisplacedSolid* G4VSolid::GetDisplacedSolidPtr() const -{ return nullptr; } +{ return nullptr; } -G4DisplacedSolid* G4VSolid::GetDisplacedSolidPtr() -{ return nullptr; } +G4DisplacedSolid* G4VSolid::GetDisplacedSolidPtr() +{ return nullptr; } //////////////////////////////////////////////////////////////// // @@ -229,7 +231,7 @@ G4double G4VSolid::EstimateCubicVolume(G4int nStat, G4double epsilon) const pz = minZ-halfepsilon+(maxZ-minZ+epsilon)*G4QuickRand(); p = G4ThreeVector(px,py,pz); in = Inside(p); - if(in != kOutside) ++iInside; + if(in != kOutside) ++iInside; } volume = (maxX-minX+epsilon)*(maxY-minY+epsilon) * (maxZ-minZ+epsilon)*iInside/nStat; @@ -313,7 +315,7 @@ G4double G4VSolid::EstimateSurfaceArea(G4int nstat, G4double ell) const G4double dX = bmax.x() - bmin.x(); G4double dY = bmax.y() - bmin.y(); G4double dZ = bmax.z() - bmin.z(); - + // Define statistics and shell thickness // G4int npoints = (nstat < 1000) ? 1000 : nstat; @@ -380,7 +382,7 @@ G4double G4VSolid::EstimateSurfaceArea(G4int nstat, G4double ell) const } /////////////////////////////////////////////////////////////////////////// -// +// // Returns a pointer of a dynamically allocated copy of the solid. // Returns NULL pointer with warning in case the concrete solid does not // implement this method. The caller has responsibility for ownership. @@ -397,7 +399,7 @@ G4VSolid* G4VSolid::Clone() const } /////////////////////////////////////////////////////////////////////////// -// +// // Calculate the maximum and minimum extents of the polygon described // by the vertices: pSectionIndex->pSectionIndex+1-> // pSectionIndex+2->pSectionIndex+3->pSectionIndex @@ -412,7 +414,7 @@ G4VSolid* G4VSolid::Clone() const void G4VSolid::ClipCrossSection( G4ThreeVectorList* pVertices, const G4int pSectionIndex, const G4VoxelLimits& pVoxelLimit, - const EAxis pAxis, + const EAxis pAxis, G4double& pMin, G4double& pMax) const { @@ -442,7 +444,7 @@ void G4VSolid::ClipCrossSection( G4ThreeVectorList* pVertices, void G4VSolid::ClipBetweenSections( G4ThreeVectorList* pVertices, const G4int pSectionIndex, const G4VoxelLimits& pVoxelLimit, - const EAxis pAxis, + const EAxis pAxis, G4double& pMin, G4double& pMax) const { G4ThreeVectorList polygon; @@ -486,7 +488,7 @@ void G4VSolid::ClipBetweenSections( G4ThreeVectorList* pVertices, void G4VSolid::CalculateClippedPolygonExtent(G4ThreeVectorList& pPolygon, const G4VoxelLimits& pVoxelLimit, - const EAxis pAxis, + const EAxis pAxis, G4double& pMin, G4double& pMax) const { @@ -501,15 +503,15 @@ G4VSolid::CalculateClippedPolygonExtent(G4ThreeVectorList& pPolygon, for (i=0; i pMax) - { - pMax = component; - } + { + pMax = component; + } } } } @@ -547,7 +549,7 @@ void G4VSolid::ClipPolygon( G4ThreeVectorList& pPolygon, G4VoxelLimits simpleLimit1; simpleLimit1.AddLimit(kXAxis,pVoxelLimit.GetMinXExtent(),kInfinity); ClipPolygonToSimpleLimits(pPolygon,outputPolygon,simpleLimit1); - + pPolygon.clear(); if ( !outputPolygon.size() ) return; @@ -635,7 +637,7 @@ G4VSolid::ClipPolygonToSimpleLimits( G4ThreeVectorList& pPolygon, // pVoxelLimit.ClipToLimits(vStart,vEnd); outputPolygon.push_back(vEnd); - } + } } else { @@ -645,12 +647,12 @@ G4VSolid::ClipPolygonToSimpleLimits( G4ThreeVectorList& pPolygon, // pVoxelLimit.ClipToLimits(vStart,vEnd); outputPolygon.push_back(vStart); - outputPolygon.push_back(vEnd); + outputPolygon.push_back(vEnd); } else // Both point outside -> no output { // outputPolygon.push_back(vStart); - // outputPolygon.push_back(vEnd); + // outputPolygon.push_back(vEnd); } } } @@ -677,7 +679,7 @@ void G4VSolid::BoundingLimits(G4ThreeVector& pMin, G4ThreeVector& pMax) const // // Get G4VisExtent - bounding box for graphics -G4VisExtent G4VSolid::GetExtent () const +G4VisExtent G4VSolid::GetExtent () const { G4VisExtent extent; G4VoxelLimits voxelLimits; // Defaults to "infinite" limits. diff --git a/source/geometry/management/src/G4VTouchable.cc b/source/geometry/management/src/G4VTouchable.cc index d8dcef09b4..c21ab397d6 100644 --- a/source/geometry/management/src/G4VTouchable.cc +++ b/source/geometry/management/src/G4VTouchable.cc @@ -30,14 +30,7 @@ #include "G4VTouchable.hh" -G4VTouchable::G4VTouchable() -{ -} - -G4VTouchable::~G4VTouchable() -{ -} - +// -------------------------------------------------------------------- G4VPhysicalVolume* G4VTouchable::GetVolume(G4int) const { G4Exception("G4VTouchable::GetVolume()", "GeomMgt0001", @@ -45,6 +38,7 @@ G4VPhysicalVolume* G4VTouchable::GetVolume(G4int) const return nullptr; } +// -------------------------------------------------------------------- G4VSolid* G4VTouchable::GetSolid(G4int) const { G4Exception("G4VTouchable::GetSolid()", "GeomMgt0001", @@ -52,6 +46,7 @@ G4VSolid* G4VTouchable::GetSolid(G4int) const return nullptr; } +// -------------------------------------------------------------------- G4int G4VTouchable::GetReplicaNumber(G4int) const { G4Exception("G4VTouchable::GetReplicaNumber()", "GeomMgt0001", @@ -59,6 +54,7 @@ G4int G4VTouchable::GetReplicaNumber(G4int) const return 0; } +// -------------------------------------------------------------------- G4int G4VTouchable::MoveUpHistory(G4int) { G4Exception("G4VTouchable::MoveUpHistory()", "GeomMgt0001", @@ -66,6 +62,7 @@ G4int G4VTouchable::MoveUpHistory(G4int) return 0; } +// -------------------------------------------------------------------- void G4VTouchable::UpdateYourself(G4VPhysicalVolume*, const G4NavigationHistory* ) { @@ -73,6 +70,7 @@ void G4VTouchable::UpdateYourself(G4VPhysicalVolume*, FatalException, "Undefined call to base class."); } +// -------------------------------------------------------------------- G4int G4VTouchable::GetHistoryDepth() const { G4Exception("G4VTouchable::GetHistoryDepth()", "GeomMgt0001", @@ -80,9 +78,10 @@ G4int G4VTouchable::GetHistoryDepth() const return 0; } +// -------------------------------------------------------------------- const G4NavigationHistory* G4VTouchable::GetHistory() const { G4Exception("G4VTouchable::GetHistory()", "GeomMgt0001", FatalException, "Undefined call to base class."); - return 0; + return nullptr; } diff --git a/source/geometry/management/src/G4VoxelLimits.cc b/source/geometry/management/src/G4VoxelLimits.cc index 69612c8e5c..ac33877482 100644 --- a/source/geometry/management/src/G4VoxelLimits.cc +++ b/source/geometry/management/src/G4VoxelLimits.cc @@ -32,18 +32,6 @@ #include "G4ios.hh" -/////////////////////////////////////////////////////////////////////////// -// -// Empty constructor and destructor -// -G4VoxelLimits::G4VoxelLimits() -{ -} - -G4VoxelLimits::~G4VoxelLimits() -{ -} - /////////////////////////////////////////////////////////////////////////// // // Further restrict limits diff --git a/source/geometry/navigation/History b/source/geometry/navigation/History index c94fbed2d0..f0338e9ccd 100644 --- a/source/geometry/navigation/History +++ b/source/geometry/navigation/History @@ -16,6 +16,11 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +September 25, 2021 - P.Arce (geomnav-V10-07-05) +---------------------------- +- Reduce warning messages in GetReplicaNo: only when difference is > kCarTolerance +- NoVoxel -> NoVoxels for coherence with rest of code + May 4, 2021 - J.Apostolakis (geomnav-V10-07-04) ---------------------------- - G4Navigator: diff --git a/source/geometry/navigation/include/G4PhantomParameterisation.hh b/source/geometry/navigation/include/G4PhantomParameterisation.hh index e726444a92..bf7f8dfc9f 100644 --- a/source/geometry/navigation/include/G4PhantomParameterisation.hh +++ b/source/geometry/navigation/include/G4PhantomParameterisation.hh @@ -125,15 +125,15 @@ class G4PhantomParameterisation : public G4VPVParameterisation inline void SetMaterialIndices( size_t* matInd ); void SetVoxelDimensions( G4double halfx, G4double halfy, G4double halfz ); - void SetNoVoxel( size_t nx, size_t ny, size_t nz ); + void SetNoVoxels( size_t nx, size_t ny, size_t nz ); inline G4double GetVoxelHalfX() const; inline G4double GetVoxelHalfY() const; inline G4double GetVoxelHalfZ() const; - inline size_t GetNoVoxelX() const; - inline size_t GetNoVoxelY() const; - inline size_t GetNoVoxelZ() const; - inline size_t GetNoVoxel() const; + inline size_t GetNoVoxelsX() const; + inline size_t GetNoVoxelsY() const; + inline size_t GetNoVoxelsZ() const; + inline size_t GetNoVoxels() const; inline std::vector GetMaterials() const; inline size_t* GetMaterialIndices() const; @@ -167,11 +167,11 @@ class G4PhantomParameterisation : public G4VPVParameterisation G4double fVoxelHalfX = 0.0, fVoxelHalfY = 0.0, fVoxelHalfZ = 0.0; // Half dimension of voxels (assume they are boxes). - size_t fNoVoxelX = 0, fNoVoxelY = 0, fNoVoxelZ = 0; + size_t fNoVoxelsX = 0, fNoVoxelsY = 0, fNoVoxelsZ = 0; // Number of voxel in x, y and z dimensions. - size_t fNoVoxelXY = 0; + size_t fNoVoxelsXY = 0; // Number of voxels in x times number of voxels in y (for speed-up). - size_t fNoVoxel = 0; + size_t fNoVoxels = 0; // Total number of voxels (for speed-up). std::vector fMaterials; diff --git a/source/geometry/navigation/include/G4PhantomParameterisation.icc b/source/geometry/navigation/include/G4PhantomParameterisation.icc index 1cf4ca5d59..f1dc32ab02 100644 --- a/source/geometry/navigation/include/G4PhantomParameterisation.icc +++ b/source/geometry/navigation/include/G4PhantomParameterisation.icc @@ -38,15 +38,15 @@ SetVoxelDimensions( G4double halfx, G4double halfy, G4double halfz ) //-------------------------------------------------------------------- inline -void G4PhantomParameterisation::SetNoVoxel( size_t nx, size_t ny, size_t nz ) +void G4PhantomParameterisation::SetNoVoxels( size_t nx, size_t ny, size_t nz ) { - fNoVoxelX = nx; - fNoVoxelY = ny; - fNoVoxelZ = nz; - fNoVoxelXY = nx*ny; - fNoVoxel = nx*ny*nz; + fNoVoxelsX = nx; + fNoVoxelsY = ny; + fNoVoxelsZ = nz; + fNoVoxelsXY = nx*ny; + fNoVoxels = nx*ny*nz; } - + //-------------------------------------------------------------------- inline void G4PhantomParameterisation::SetMaterials( std::vector& mates ) @@ -84,30 +84,30 @@ G4double G4PhantomParameterisation::GetVoxelHalfZ() const //-------------------------------------------------------------------- inline -size_t G4PhantomParameterisation::GetNoVoxelX() const +size_t G4PhantomParameterisation::GetNoVoxelsX() const { - return fNoVoxelX; + return fNoVoxelsX; } //-------------------------------------------------------------------- inline -size_t G4PhantomParameterisation::GetNoVoxelY() const +size_t G4PhantomParameterisation::GetNoVoxelsY() const { - return fNoVoxelY; + return fNoVoxelsY; } //-------------------------------------------------------------------- inline -size_t G4PhantomParameterisation::GetNoVoxelZ() const +size_t G4PhantomParameterisation::GetNoVoxelsZ() const { - return fNoVoxelZ; + return fNoVoxelsZ; } //-------------------------------------------------------------------- inline -size_t G4PhantomParameterisation::GetNoVoxel() const +size_t G4PhantomParameterisation::GetNoVoxels() const { - return fNoVoxel; + return fNoVoxels; } //-------------------------------------------------------------------- diff --git a/source/geometry/navigation/src/G4PartialPhantomParameterisation.cc b/source/geometry/navigation/src/G4PartialPhantomParameterisation.cc index 0c720b5bb2..bfe143ec11 100644 --- a/source/geometry/navigation/src/G4PartialPhantomParameterisation.cc +++ b/source/geometry/navigation/src/G4PartialPhantomParameterisation.cc @@ -106,7 +106,7 @@ GetMaterialIndex( size_t copyNo ) const size_t G4PartialPhantomParameterisation:: GetMaterialIndex( size_t nx, size_t ny, size_t nz ) const { - size_t copyNo = nx + fNoVoxelX*ny + fNoVoxelXY*nz; + size_t copyNo = nx + fNoVoxelsX*ny + fNoVoxelsXY*nz; return GetMaterialIndex( copyNo ); } @@ -136,8 +136,8 @@ ComputeVoxelIndices(const G4int copyNo, size_t& nx, auto ite = fFilledIDs.lower_bound(size_t(copyNo)); G4int dist = std::distance( fFilledIDs.cbegin(), ite ); - nz = size_t( dist/fNoVoxelY ); - ny = size_t( dist%fNoVoxelY ); + nz = size_t( dist/fNoVoxelsY ); + ny = size_t( dist%fNoVoxelsY ); G4int ifmin = (*ite).second; G4int nvoxXprev; @@ -183,7 +183,7 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) // If it is on the surface side, check the direction: if direction is // negative place it on the previous voxel (if direction is positive it is // already in the next voxel...). - // Correct also cases where n = -1 or n = fNoVoxel. It is always traced to be + // Correct also cases where n = -1 or n = fNoVoxels. It is always traced to be // due to multiple scattering: track is entering a voxel but multiple // scattering changes the angle towards outside // @@ -198,7 +198,7 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) } else { - if( nx == G4int(fNoVoxelX) ) + if( nx == G4int(fNoVoxelsX) ) { nx -= 1; } @@ -215,7 +215,7 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) } else { - if( ny == G4int(fNoVoxelY) ) + if( ny == G4int(fNoVoxelsY) ) { ny -= 1; } @@ -232,7 +232,7 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) } else { - if( nz == G4int(fNoVoxelZ) ) + if( nz == G4int(fNoVoxelsZ) ) { nz -= 1; } @@ -247,9 +247,9 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) nx = 0; isOK = false; } - else if( nx >= G4int(fNoVoxelX) ) + else if( nx >= G4int(fNoVoxelsX) ) { - nx = fNoVoxelX-1; + nx = fNoVoxelsX-1; isOK = false; } if( ny < 0 ) @@ -257,9 +257,9 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) ny = 0; isOK = false; } - else if( ny >= G4int(fNoVoxelY) ) + else if( ny >= G4int(fNoVoxelsY) ) { - ny = fNoVoxelY-1; + ny = fNoVoxelsY-1; isOK = false; } if( nz < 0 ) @@ -267,9 +267,9 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) nz = 0; isOK = false; } - else if( nz >= G4int(fNoVoxelZ) ) + else if( nz >= G4int(fNoVoxelsZ) ) { - nz = fNoVoxelZ-1; + nz = fNoVoxelsZ-1; isOK = false; } if( !isOK ) @@ -289,7 +289,7 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) "GeomNav1002", JustWarning, message); } - G4int nyz = nz*fNoVoxelY+ny; + G4int nyz = nz*fNoVoxelsY+ny; auto ite = fFilledIDs.cbegin(); /* for( ite = fFilledIDs.cbegin(); ite != fFilledIDs.cend(); ++ite ) @@ -318,12 +318,12 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) //------------------------------------------------------------------ void G4PartialPhantomParameterisation::CheckCopyNo( const G4int copyNo ) const { - if( copyNo < 0 || copyNo >= G4int(fNoVoxel) ) + if( copyNo < 0 || copyNo >= G4int(fNoVoxels) ) { std::ostringstream message; message << "Copy number is negative or too big!" << G4endl << " Copy number: " << copyNo << G4endl - << " Total number of voxels: " << fNoVoxel; + << " Total number of voxels: " << fNoVoxels; G4Exception("G4PartialPhantomParameterisation::CheckCopyNo()", "GeomNav0002", FatalErrorInArgument, message); } @@ -333,7 +333,7 @@ void G4PartialPhantomParameterisation::CheckCopyNo( const G4int copyNo ) const //------------------------------------------------------------------ void G4PartialPhantomParameterisation::BuildContainerWalls() { - fContainerWallX = fNoVoxelX * fVoxelHalfX; - fContainerWallY = fNoVoxelY * fVoxelHalfY; - fContainerWallZ = fNoVoxelZ * fVoxelHalfZ; + fContainerWallX = fNoVoxelsX * fVoxelHalfX; + fContainerWallY = fNoVoxelsY * fVoxelHalfY; + fContainerWallZ = fNoVoxelsZ * fVoxelHalfZ; } diff --git a/source/geometry/navigation/src/G4PhantomParameterisation.cc b/source/geometry/navigation/src/G4PhantomParameterisation.cc index b4fe19863a..8648699754 100644 --- a/source/geometry/navigation/src/G4PhantomParameterisation.cc +++ b/source/geometry/navigation/src/G4PhantomParameterisation.cc @@ -56,9 +56,9 @@ void G4PhantomParameterisation:: BuildContainerSolid( G4VPhysicalVolume* pMotherPhysical ) { fContainerSolid = pMotherPhysical->GetLogicalVolume()->GetSolid(); - fContainerWallX = fNoVoxelX * fVoxelHalfX; - fContainerWallY = fNoVoxelY * fVoxelHalfY; - fContainerWallZ = fNoVoxelZ * fVoxelHalfZ; + fContainerWallX = fNoVoxelsX * fVoxelHalfX; + fContainerWallY = fNoVoxelsY * fVoxelHalfY; + fContainerWallZ = fNoVoxelsZ * fVoxelHalfZ; // CheckVoxelsFillContainer(); } @@ -68,9 +68,9 @@ void G4PhantomParameterisation:: BuildContainerSolid( G4VSolid* pMotherSolid ) { fContainerSolid = pMotherSolid; - fContainerWallX = fNoVoxelX * fVoxelHalfX; - fContainerWallY = fNoVoxelY * fVoxelHalfY; - fContainerWallZ = fNoVoxelZ * fVoxelHalfZ; + fContainerWallX = fNoVoxelsX * fVoxelHalfX; + fContainerWallY = fNoVoxelsY * fVoxelHalfY; + fContainerWallZ = fNoVoxelsZ * fVoxelHalfZ; // CheckVoxelsFillContainer(); } @@ -141,7 +141,7 @@ GetMaterialIndex( size_t copyNo ) const size_t G4PhantomParameterisation:: GetMaterialIndex( size_t nx, size_t ny, size_t nz ) const { - size_t copyNo = nx + fNoVoxelX*ny + fNoVoxelXY*nz; + size_t copyNo = nx + fNoVoxelsX*ny + fNoVoxelsXY*nz; return GetMaterialIndex( copyNo ); } @@ -165,9 +165,9 @@ ComputeVoxelIndices(const G4int copyNo, size_t& nx, size_t& ny, size_t& nz ) const { CheckCopyNo( copyNo ); - nx = size_t(copyNo%fNoVoxelX); - ny = size_t( (copyNo/fNoVoxelX)%fNoVoxelY ); - nz = size_t(copyNo/fNoVoxelXY); + nx = size_t(copyNo%fNoVoxelsX); + ny = size_t( (copyNo/fNoVoxelsX)%fNoVoxelsY ); + nz = size_t(copyNo/fNoVoxelsXY); } @@ -186,31 +186,31 @@ CheckVoxelsFillContainer( G4double contX, G4double contY, G4double contZ ) const // Any bigger value than kCarTolerance will give an error in GetReplicaNo() // - if( std::fabs(contX-fNoVoxelX*fVoxelHalfX) >= toleranceForError - || std::fabs(contY-fNoVoxelY*fVoxelHalfY) >= toleranceForError - || std::fabs(contZ-fNoVoxelZ*fVoxelHalfZ) >= toleranceForError ) + if( std::fabs(contX-fNoVoxelsX*fVoxelHalfX) >= toleranceForError + || std::fabs(contY-fNoVoxelsY*fVoxelHalfY) >= toleranceForError + || std::fabs(contZ-fNoVoxelsZ*fVoxelHalfZ) >= toleranceForError ) { std::ostringstream message; message << "Voxels do not fully fill the container: " << fContainerSolid->GetName() << G4endl - << " DiffX= " << contX-fNoVoxelX*fVoxelHalfX << G4endl - << " DiffY= " << contY-fNoVoxelY*fVoxelHalfY << G4endl - << " DiffZ= " << contZ-fNoVoxelZ*fVoxelHalfZ << G4endl + << " DiffX= " << contX-fNoVoxelsX*fVoxelHalfX << G4endl + << " DiffY= " << contY-fNoVoxelsY*fVoxelHalfY << G4endl + << " DiffZ= " << contZ-fNoVoxelsZ*fVoxelHalfZ << G4endl << " Maximum difference is: " << toleranceForError; G4Exception("G4PhantomParameterisation::CheckVoxelsFillContainer()", "GeomNav0002", FatalException, message); } - else if( std::fabs(contX-fNoVoxelX*fVoxelHalfX) >= toleranceForWarning - || std::fabs(contY-fNoVoxelY*fVoxelHalfY) >= toleranceForWarning - || std::fabs(contZ-fNoVoxelZ*fVoxelHalfZ) >= toleranceForWarning ) + else if( std::fabs(contX-fNoVoxelsX*fVoxelHalfX) >= toleranceForWarning + || std::fabs(contY-fNoVoxelsY*fVoxelHalfY) >= toleranceForWarning + || std::fabs(contZ-fNoVoxelsZ*fVoxelHalfZ) >= toleranceForWarning ) { std::ostringstream message; message << "Voxels do not fully fill the container: " << fContainerSolid->GetName() << G4endl - << " DiffX= " << contX-fNoVoxelX*fVoxelHalfX << G4endl - << " DiffY= " << contY-fNoVoxelY*fVoxelHalfY << G4endl - << " DiffZ= " << contZ-fNoVoxelZ*fVoxelHalfZ << G4endl + << " DiffX= " << contX-fNoVoxelsX*fVoxelHalfX << G4endl + << " DiffY= " << contY-fNoVoxelsY*fVoxelHalfY << G4endl + << " DiffZ= " << contZ-fNoVoxelsZ*fVoxelHalfZ << G4endl << " Maximum difference is: " << toleranceForWarning; G4Exception("G4PhantomParameterisation::CheckVoxelsFillContainer()", "GeomNav1002", JustWarning, message); @@ -227,17 +227,22 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) // if( fContainerSolid->Inside( localPoint ) == kOutside ) { - std::ostringstream message; - message << "Point outside voxels!" << G4endl - << " localPoint - " << localPoint - << " - is outside container solid: " - << fContainerSolid->GetName() << G4endl - << "DIFFERENCE WITH PHANTOM WALLS X: " - << std::fabs(localPoint.x()) - fContainerWallX - << " Y: " << std::fabs(localPoint.y()) - fContainerWallY - << " Z: " << std::fabs(localPoint.z()) - fContainerWallZ; - G4Exception("G4PhantomParameterisation::GetReplicaNo()", "GeomNav0003", - FatalErrorInArgument, message); + if( std::fabs(localPoint.x()) - fContainerWallX > kCarTolerance + && std::fabs(localPoint.y()) - fContainerWallY > kCarTolerance + && std::fabs(localPoint.z()) - fContainerWallZ > kCarTolerance ) + { + std::ostringstream message; + message << "Point outside voxels!" << G4endl + << " localPoint - " << localPoint + << " - is outside container solid: " + << fContainerSolid->GetName() << G4endl + << "DIFFERENCE WITH PHANTOM WALLS X: " + << std::fabs(localPoint.x()) - fContainerWallX + << " Y: " << std::fabs(localPoint.y()) - fContainerWallY + << " Z: " << std::fabs(localPoint.z()) - fContainerWallZ; + G4Exception("G4PhantomParameterisation::GetReplicaNo()", "GeomNav0003", + FatalErrorInArgument, message); + } } // Check the voxel numbers corresponding to localPoint @@ -264,7 +269,7 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) // If it is on the surface side, check the direction: if direction is // negative place it in the previous voxel (if direction is positive it is // already in the next voxel). - // Correct also cases where n = -1 or n = fNoVoxel. It is always traced to be + // Correct also cases where n = -1 or n = fNoVoxels. It is always traced to be // due to multiple scattering: track is entering a voxel but multiple // scattering changes the angle towards outside // @@ -279,7 +284,7 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) } else { - if( nx == G4int(fNoVoxelX) ) + if( nx == G4int(fNoVoxelsX) ) { nx -= 1; } @@ -296,7 +301,7 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) } else { - if( ny == G4int(fNoVoxelY) ) + if( ny == G4int(fNoVoxelsY) ) { ny -= 1; } @@ -313,14 +318,14 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) } else { - if( nz == G4int(fNoVoxelZ) ) + if( nz == G4int(fNoVoxelsZ) ) { nz -= 1; } } } - G4int copyNo = nx + fNoVoxelX*ny + fNoVoxelXY*nz; + G4int copyNo = nx + fNoVoxelsX*ny + fNoVoxelsXY*nz; // Check if there are still errors // @@ -330,9 +335,9 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) nx = 0; isOK = false; } - else if( nx >= G4int(fNoVoxelX) ) + else if( nx >= G4int(fNoVoxelsX) ) { - nx = fNoVoxelX-1; + nx = fNoVoxelsX-1; isOK = false; } if( ny < 0 ) @@ -340,9 +345,9 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) ny = 0; isOK = false; } - else if( ny >= G4int(fNoVoxelY) ) + else if( ny >= G4int(fNoVoxelsY) ) { - ny = fNoVoxelY-1; + ny = fNoVoxelsY-1; isOK = false; } if( nz < 0 ) @@ -350,26 +355,31 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) nz = 0; isOK = false; } - else if( nz >= G4int(fNoVoxelZ) ) + else if( nz >= G4int(fNoVoxelsZ) ) { - nz = fNoVoxelZ-1; + nz = fNoVoxelsZ-1; isOK = false; } if( !isOK ) { - std::ostringstream message; - message << "Corrected the copy number! It was negative or too big" << G4endl - << " LocalPoint: " << localPoint << G4endl - << " LocalDir: " << localDir << G4endl - << " Voxel container size: " << fContainerWallX - << " " << fContainerWallY << " " << fContainerWallZ << G4endl - << " LocalPoint - wall: " - << localPoint.x()-fContainerWallX << " " - << localPoint.y()-fContainerWallY << " " - << localPoint.z()-fContainerWallZ; - G4Exception("G4PhantomParameterisation::GetReplicaNo()", - "GeomNav1002", JustWarning, message); - copyNo = nx + fNoVoxelX*ny + fNoVoxelXY*nz; + if( std::fabs(localPoint.x()-fContainerWallX) > kCarTolerance && + std::fabs(localPoint.y()-fContainerWallY) > kCarTolerance && + std::fabs(localPoint.z()-fContainerWallZ) > kCarTolerance ){ // only if difference is big + std::ostringstream message; + message << "Corrected the copy number! It was negative or too big" << G4endl + << " LocalPoint: " << localPoint << G4endl + << " LocalDir: " << localDir << G4endl + << " Voxel container size: " << fContainerWallX + << " " << fContainerWallY << " " << fContainerWallZ << G4endl + << " LocalPoint - wall: " + << localPoint.x()-fContainerWallX << " " + << localPoint.y()-fContainerWallY << " " + << localPoint.z()-fContainerWallZ; + G4Exception("G4PhantomParameterisation::GetReplicaNo()", + "GeomNav1002", JustWarning, message); + } + + copyNo = nx + fNoVoxelsX*ny + fNoVoxelsXY*nz; } return copyNo; @@ -379,12 +389,12 @@ GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir ) //------------------------------------------------------------------ void G4PhantomParameterisation::CheckCopyNo( const G4int copyNo ) const { - if( copyNo < 0 || copyNo >= G4int(fNoVoxel) ) + if( copyNo < 0 || copyNo >= G4int(fNoVoxels) ) { std::ostringstream message; message << "Copy number is negative or too big!" << G4endl << " Copy number: " << copyNo << G4endl - << " Total number of voxels: " << fNoVoxel; + << " Total number of voxels: " << fNoVoxels; G4Exception("G4PhantomParameterisation::CheckCopyNo()", "GeomNav0002", FatalErrorInArgument, message); } diff --git a/source/geometry/navigation/src/G4RegularNavigation.cc b/source/geometry/navigation/src/G4RegularNavigation.cc index e629cb39f9..d9e7ff9d66 100644 --- a/source/geometry/navigation/src/G4RegularNavigation.cc +++ b/source/geometry/navigation/src/G4RegularNavigation.cc @@ -404,7 +404,7 @@ G4RegularNavigation::LevelLocate( G4NavigationHistory& history, // replicaNo = pParam->GetReplicaNo( localPoint, localDir ); - if( replicaNo < 0 || replicaNo >= G4int(pParam->GetNoVoxel()) ) + if( replicaNo < 0 || replicaNo >= G4int(pParam->GetNoVoxels()) ) { return false; } diff --git a/source/geometry/solids/Boolean/History b/source/geometry/solids/Boolean/History index 8a27ccdf6a..7f34530257 100644 --- a/source/geometry/solids/Boolean/History +++ b/source/geometry/solids/Boolean/History @@ -19,12 +19,16 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- - May 6, 2021 J.Apostolakis geom-bool-V10-07-02 +October 12, 2021 G.Cosmo geom-bool-V10-07-03 +- In G4BooleanSolid, use G4RecursiveMutex in place of G4Mutex in GetPolyhedron() + to avoid potential deadlocks in recursive Boolean operations. + Courtesy of S.Boogert (London Univ.). + +May 6, 2021 J.Apostolakis geom-bool-V10-07-02 - Revised GetCubicVolume of UnionSolid and SubtractionSolid to use cubic volume of constituent volume(s) and the intersection solid. Test cases show the potential for improvement: factors of 40-3000. - Cases with small overlap will improve most. Not all cases will improve. - + Cases with small overlap will improve most. Not all cases will improve. Need to monitor cpu cost in most difficult cases: - Union now involves 3 calculations (a, b, a n b) - likely 2x cost. - Subtraction involves 2 calculations (a, a n b) - 1.5x cost. diff --git a/source/geometry/solids/Boolean/src/G4BooleanSolid.cc b/source/geometry/solids/Boolean/src/G4BooleanSolid.cc index a9d8246178..313f7985a8 100644 --- a/source/geometry/solids/Boolean/src/G4BooleanSolid.cc +++ b/source/geometry/solids/Boolean/src/G4BooleanSolid.cc @@ -42,7 +42,7 @@ namespace { - G4Mutex polyhedronMutex = G4MUTEX_INITIALIZER; + G4RecursiveMutex polyhedronMutex = G4MUTEX_INITIALIZER; } ////////////////////////////////////////////////////////////////// @@ -346,7 +346,7 @@ G4Polyhedron* G4BooleanSolid::GetPolyhedron () const fpPolyhedron->GetNumberOfRotationStepsAtTimeOfCreation() != fpPolyhedron->GetNumberOfRotationSteps()) { - G4AutoLock l(&polyhedronMutex); + G4RecursiveAutoLock l(&polyhedronMutex); delete fpPolyhedron; fpPolyhedron = CreatePolyhedron(); fRebuildPolyhedron = false; diff --git a/source/geometry/solids/CSG/History b/source/geometry/solids/CSG/History index 6045249f1a..6b0cf96406 100644 --- a/source/geometry/solids/CSG/History +++ b/source/geometry/solids/CSG/History @@ -16,12 +16,23 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +November 24, 2021 G.Cosmo geom-csg-V10-07-06 +- Corrected typo in G4UPara::GetXHalfLength(). + Addressing problem report #2446. + +November 01, 2021 E.Tcherniaev geom-csg-V10-07-05 +- Revision of G4UTrap: + o List of accessors and modifiers made consistent with G4Trap + o Implemented check of parameters similar to G4Trap + +August 31, 2021 B.Morgan geom-csg-V10-07-04 +- Remove old Get-er methods that simply forward to the new main Get-er + methods May 18, 2021 J.Apostolakis geom-csg-V10-07-03 - - Added method to enable simpler conversion of G4 solids to VecGeom: o G4Trap: added methods to calculate Phi & Theta - o G4Para: added methods to calculate original alpha, theta, phi + o G4Para: added methods to calculate original alpha, theta, phi May 17, 2021 E.Tcherniaev geom-csg-V10-07-02 - Bux fix in G4Sphere::GetSurfaceArea() diff --git a/source/geometry/solids/CSG/include/G4Cons.hh b/source/geometry/solids/CSG/include/G4Cons.hh index 2fcff34b90..27cd1d0a6d 100644 --- a/source/geometry/solids/CSG/include/G4Cons.hh +++ b/source/geometry/solids/CSG/include/G4Cons.hh @@ -169,16 +169,6 @@ class G4Cons : public G4CSGSolid G4Cons& operator=(const G4Cons& rhs); // Copy constructor and assignment operator. - // Old access functions - - inline G4double GetRmin1() const; - inline G4double GetRmax1() const; - inline G4double GetRmin2() const; - inline G4double GetRmax2() const; - inline G4double GetDz() const; - inline G4double GetSPhi() const; - inline G4double GetDPhi() const; - private: inline void Initialize(); diff --git a/source/geometry/solids/CSG/include/G4Cons.icc b/source/geometry/solids/CSG/include/G4Cons.icc index 9a6ff7688c..0026c17afc 100644 --- a/source/geometry/solids/CSG/include/G4Cons.icc +++ b/source/geometry/solids/CSG/include/G4Cons.icc @@ -56,7 +56,7 @@ G4double G4Cons::GetZHalfLength() const return fDz ; } -inline +inline G4double G4Cons::GetStartPhiAngle() const { return fSPhi ; @@ -100,11 +100,11 @@ void G4Cons::Initialize() fRebuildPolyhedron = true; } -inline +inline void G4Cons::InitializeTrigonometry() { G4double hDPhi = 0.5*fDPhi; // half delta phi - G4double cPhi = fSPhi + hDPhi; + G4double cPhi = fSPhi + hDPhi; G4double ePhi = fSPhi + fDPhi; sinCPhi = std::sin(cPhi); @@ -223,55 +223,11 @@ void G4Cons::SetDeltaPhiAngle ( G4double newDPhi ) Initialize(); } -// Old access methods ... - -inline -G4double G4Cons::GetRmin1() const -{ - return GetInnerRadiusMinusZ(); -} - -inline -G4double G4Cons::GetRmax1() const -{ - return GetOuterRadiusMinusZ(); -} - -inline -G4double G4Cons::GetRmin2() const -{ - return GetInnerRadiusPlusZ(); -} - -inline -G4double G4Cons::GetRmax2() const -{ - return GetOuterRadiusPlusZ(); -} - -inline -G4double G4Cons::GetDz() const -{ - return GetZHalfLength(); -} - -inline -G4double G4Cons::GetSPhi() const -{ - return GetStartPhiAngle(); -} - -inline -G4double G4Cons::GetDPhi() const -{ - return GetDeltaPhiAngle(); -} - inline G4double G4Cons::GetCubicVolume() { if(fCubicVolume != 0.) {;} - else + else { G4double Rmean, rMean, deltaR, deltar; @@ -281,7 +237,7 @@ G4double G4Cons::GetCubicVolume() rMean = 0.5*(fRmin1+fRmin2); deltar = fRmin1-fRmin2; fCubicVolume = fDPhi*fDz*(Rmean*Rmean-rMean*rMean - +(deltaR*deltaR-deltar*deltar)/12); + +(deltaR*deltaR-deltar*deltar)/12); } return fCubicVolume; } @@ -290,7 +246,7 @@ inline G4double G4Cons::GetSurfaceArea() { if(fSurfaceArea != 0.) {;} - else + else { G4double mmin, mmax, dmin, dmax; @@ -298,7 +254,7 @@ G4double G4Cons::GetSurfaceArea() mmax= (fRmax1+fRmax2)*0.5; dmin= (fRmin2-fRmin1); dmax= (fRmax2-fRmax1); - + fSurfaceArea = fDPhi*( mmin * std::sqrt(dmin*dmin+4*fDz*fDz) + mmax * std::sqrt(dmax*dmax+4*fDz*fDz) + 0.5*(fRmax1*fRmax1-fRmin1*fRmin1 diff --git a/source/geometry/solids/CSG/include/G4CutTubs.hh b/source/geometry/solids/CSG/include/G4CutTubs.hh index d350fbdea1..f9841d5990 100644 --- a/source/geometry/solids/CSG/include/G4CutTubs.hh +++ b/source/geometry/solids/CSG/include/G4CutTubs.hh @@ -146,14 +146,6 @@ class G4CutTubs : public G4CSGSolid G4CutTubs& operator=(const G4CutTubs& rhs); // Copy constructor and assignment operator. - // Older names for access functions - - inline G4double GetRMin() const; - inline G4double GetRMax() const; - inline G4double GetDz () const; - inline G4double GetSPhi() const; - inline G4double GetDPhi() const; - protected: inline void Initialize(); diff --git a/source/geometry/solids/CSG/include/G4CutTubs.icc b/source/geometry/solids/CSG/include/G4CutTubs.icc index 2b98d63558..8da108a325 100644 --- a/source/geometry/solids/CSG/include/G4CutTubs.icc +++ b/source/geometry/solids/CSG/include/G4CutTubs.icc @@ -242,35 +242,3 @@ void G4CutTubs::SetDeltaPhiAngle (G4double newDPhi) CheckPhiAngles(fSPhi, newDPhi); Initialize(); } - -// Older names for access functions - -inline -G4double G4CutTubs::GetRMin () const -{ - return GetInnerRadius(); -} - -inline -G4double G4CutTubs::GetRMax () const -{ - return GetOuterRadius(); -} - -inline -G4double G4CutTubs::GetDz () const -{ - return GetZHalfLength(); -} - -inline -G4double G4CutTubs::GetSPhi () const -{ - return GetStartPhiAngle(); -} - -inline -G4double G4CutTubs::GetDPhi () const -{ - return GetDeltaPhiAngle(); -} diff --git a/source/geometry/solids/CSG/include/G4Sphere.hh b/source/geometry/solids/CSG/include/G4Sphere.hh index 9da1faa21f..6dce7a8c7c 100644 --- a/source/geometry/solids/CSG/include/G4Sphere.hh +++ b/source/geometry/solids/CSG/include/G4Sphere.hh @@ -178,16 +178,6 @@ class G4Sphere : public G4CSGSolid G4Sphere& operator=(const G4Sphere& rhs); // Copy constructor and assignment operator. - // Old access functions - - inline G4double GetRmin() const; - inline G4double GetRmax() const; - inline G4double GetSPhi() const; - inline G4double GetDPhi() const; - inline G4double GetSTheta() const; - inline G4double GetDTheta() const; - inline G4double GetInsideRadius() const; - inline void SetInsideRadius(G4double newRmin); private: diff --git a/source/geometry/solids/CSG/include/G4Sphere.icc b/source/geometry/solids/CSG/include/G4Sphere.icc index 5acdf9aaa0..3099f4685f 100644 --- a/source/geometry/solids/CSG/include/G4Sphere.icc +++ b/source/geometry/solids/CSG/include/G4Sphere.icc @@ -26,12 +26,6 @@ // Implementation of inline methods of G4Sphere // -------------------------------------------------------------------- -inline -G4double G4Sphere::GetInsideRadius() const -{ - return fRmin; -} - inline G4double G4Sphere::GetInnerRadius() const { @@ -253,19 +247,13 @@ void G4Sphere::CheckPhiAngles(G4double sPhi, G4double dPhi) } inline -void G4Sphere::SetInsideRadius(G4double newRmin) +void G4Sphere::SetInnerRadius(G4double newRmin) { fRmin= newRmin; fRminTolerance = (fRmin) ? std::max( kRadTolerance, fEpsilon*fRmin ) : 0; Initialize(); } -inline -void G4Sphere::SetInnerRadius(G4double newRmin) -{ - SetInsideRadius(newRmin); -} - inline void G4Sphere::SetOuterRadius(G4double newRmax) { @@ -306,41 +294,3 @@ void G4Sphere::SetDeltaThetaAngle(G4double newDTheta) CheckThetaAngles(fSTheta, newDTheta); Initialize(); } - -// Old access functions - -inline -G4double G4Sphere::GetRmin() const -{ - return GetInsideRadius(); -} - -inline -G4double G4Sphere::GetRmax() const -{ - return GetOuterRadius(); -} - -inline -G4double G4Sphere::GetSPhi() const -{ - return GetStartPhiAngle(); -} - -inline -G4double G4Sphere::GetDPhi() const -{ - return GetDeltaPhiAngle(); -} - -inline -G4double G4Sphere::GetSTheta() const -{ - return GetStartThetaAngle(); -} - -inline -G4double G4Sphere::GetDTheta() const -{ - return GetDeltaThetaAngle(); -} diff --git a/source/geometry/solids/CSG/include/G4Tubs.hh b/source/geometry/solids/CSG/include/G4Tubs.hh index f9412e2733..62a264ec08 100644 --- a/source/geometry/solids/CSG/include/G4Tubs.hh +++ b/source/geometry/solids/CSG/include/G4Tubs.hh @@ -161,14 +161,6 @@ class G4Tubs : public G4CSGSolid G4Tubs& operator=(const G4Tubs& rhs); // Copy constructor and assignment operator. - // Older names for access functions - - inline G4double GetRMin() const; - inline G4double GetRMax() const; - inline G4double GetDz () const; - inline G4double GetSPhi() const; - inline G4double GetDPhi() const; - protected: inline void Initialize(); @@ -212,10 +204,10 @@ class G4Tubs : public G4CSGSolid // Radial and angular tolerances static constexpr G4double kNormTolerance = 1.0e-6; - // + // // Tolerance of unity for surface normal // (for speedup - use fInvRmax if possible ) - + G4double fRMin, fRMax, fDz, fSPhi, fDPhi; // // Radial and angular dimensions @@ -230,9 +222,9 @@ class G4Tubs : public G4CSGSolid // Flag for identification of section or full tube G4double fInvRmax, fInvRmin; - // + // // More cached values - inverse of Rmax, Rmin. - + G4double halfCarTolerance, halfRadTolerance, halfAngTolerance; // // Cached half tolerance values diff --git a/source/geometry/solids/CSG/include/G4Tubs.icc b/source/geometry/solids/CSG/include/G4Tubs.icc index 16a8e85308..ce83e96b4b 100644 --- a/source/geometry/solids/CSG/include/G4Tubs.icc +++ b/source/geometry/solids/CSG/include/G4Tubs.icc @@ -80,7 +80,7 @@ G4double G4Tubs::GetCosEndPhi () const return cosEPhi; } -inline +inline void G4Tubs::Initialize() { fCubicVolume = 0.; @@ -90,11 +90,11 @@ void G4Tubs::Initialize() fRebuildPolyhedron = true; } -inline +inline void G4Tubs::InitializeTrigonometry() { G4double hDPhi = 0.5*fDPhi; // half delta phi - G4double cPhi = fSPhi + hDPhi; + G4double cPhi = fSPhi + hDPhi; G4double ePhi = fSPhi + fDPhi; sinCPhi = std::sin(cPhi); @@ -231,38 +231,6 @@ void G4Tubs::SetDeltaPhiAngle (G4double newDPhi) Initialize(); } -// Older names for access functions - -inline -G4double G4Tubs::GetRMin () const -{ - return GetInnerRadius(); -} - -inline -G4double G4Tubs::GetRMax () const -{ - return GetOuterRadius(); -} - -inline -G4double G4Tubs::GetDz () const -{ - return GetZHalfLength() ; -} - -inline -G4double G4Tubs::GetSPhi () const -{ - return GetStartPhiAngle(); -} - -inline -G4double G4Tubs::GetDPhi () const -{ - return GetDeltaPhiAngle(); -} - inline G4double G4Tubs::GetCubicVolume() { diff --git a/source/geometry/solids/CSG/include/G4UTrap.hh b/source/geometry/solids/CSG/include/G4UTrap.hh index 1c7e93d2df..6416b60016 100644 --- a/source/geometry/solids/CSG/include/G4UTrap.hh +++ b/source/geometry/solids/CSG/include/G4UTrap.hh @@ -42,7 +42,7 @@ #include "G4Polyhedron.hh" -class G4UTrap : public G4UAdapter +class G4UTrap : public G4UAdapter { using Shape_t = vecgeom::UnplacedTrapezoid; using Base_t = G4UAdapter; @@ -77,7 +77,7 @@ class G4UTrap : public G4UAdapter G4double pDy1, G4double pDy2, G4double pDz ); // - // Constructor for G4Trd + // Constructor for G4Trd G4UTrap(const G4String& pName, G4double pDx, G4double pDy, G4double pDz, @@ -100,18 +100,19 @@ class G4UTrap : public G4UAdapter using Base_t::GetTanAlpha1; using Base_t::GetTanAlpha2; - + // Accessors G4double GetZHalfLength() const; G4double GetYHalfLength1() const; G4double GetXHalfLength1() const; G4double GetXHalfLength2() const; + G4double GetTanAlpha1() const; G4double GetYHalfLength2() const; G4double GetXHalfLength3() const; G4double GetXHalfLength4() const; - G4double GetThetaCphi() const; - G4double GetThetaSphi() const; + G4double GetTanAlpha2() const; + TrapSidePlane GetSidePlane(G4int n) const; G4ThreeVector GetSymAxis() const; @@ -128,7 +129,6 @@ class G4UTrap : public G4UAdapter G4double pAlp1, G4double pDy2, G4double pDx3, G4double pDx4, G4double pAlp2); - void SetPlanes(const G4ThreeVector pt[8]); inline G4GeometryType GetEntityType() const; @@ -151,6 +151,20 @@ class G4UTrap : public G4UAdapter G4UTrap(const G4UTrap& rhs); G4UTrap& operator=(const G4UTrap& rhs); // Copy constructor and assignment operator. + + private: + + void SetPlanes(const G4ThreeVector pt[8]); + // Set parameters using eight vertices + + void CheckParameters() const; + // Check dimensions + + void GetVertices(G4ThreeVector pt[8]) const; + // Compute coordinates of vertices + + void CheckPlanarity(const G4ThreeVector pt[8]) const; + // Check planarity of lateral planes }; // -------------------------------------------------------------------- diff --git a/source/geometry/solids/CSG/include/G4UTubs.hh b/source/geometry/solids/CSG/include/G4UTubs.hh index f1ca237390..b7ce533f9f 100644 --- a/source/geometry/solids/CSG/include/G4UTubs.hh +++ b/source/geometry/solids/CSG/include/G4UTubs.hh @@ -80,7 +80,7 @@ class G4UTubs : public G4UAdapter void SetZHalfLength (G4double newDz); void SetStartPhiAngle (G4double newSPhi, G4bool trig=true); void SetDeltaPhiAngle (G4double newDPhi); - + inline G4GeometryType GetEntityType() const; void BoundingLimits(G4ThreeVector& pMin, G4ThreeVector& pMax) const; @@ -100,9 +100,9 @@ class G4UTubs : public G4UAdapter // persistifiable objects. G4UTubs(const G4UTubs& rhs); - G4UTubs& operator=(const G4UTubs& rhs); + G4UTubs& operator=(const G4UTubs& rhs); // Copy constructor and assignment operator. - + }; // -------------------------------------------------------------------- diff --git a/source/geometry/solids/CSG/src/G4UPara.cc b/source/geometry/solids/CSG/src/G4UPara.cc index 83014c5050..ce986d3290 100644 --- a/source/geometry/solids/CSG/src/G4UPara.cc +++ b/source/geometry/solids/CSG/src/G4UPara.cc @@ -188,7 +188,7 @@ G4double G4UPara::GetYHalfLength() const } G4double G4UPara::GetXHalfLength() const { - return GetZ(); + return GetX(); } G4ThreeVector G4UPara::GetSymAxis() const { diff --git a/source/geometry/solids/CSG/src/G4UTrap.cc b/source/geometry/solids/CSG/src/G4UTrap.cc index 1ae095cfe0..673608a728 100644 --- a/source/geometry/solids/CSG/src/G4UTrap.cc +++ b/source/geometry/solids/CSG/src/G4UTrap.cc @@ -53,13 +53,48 @@ G4UTrap::G4UTrap( const G4String& pName, : Base_t(pName, pdz, pTheta, pPhi, pdy1, pdx1, pdx2, pAlp1, pdy2, pdx3, pdx4, pAlp2) { + G4ThreeVector pt[8]; + CheckParameters(); + GetVertices(pt); + CheckPlanarity(pt); } G4UTrap::G4UTrap( const G4String& pName, const G4ThreeVector pt[8] ) : Base_t(pName) { + // Start with check of centering - the center of gravity trap line + // should cross the origin of frame + if (!( pt[0].z() < 0 + && pt[0].z() == pt[1].z() + && pt[0].z() == pt[2].z() + && pt[0].z() == pt[3].z() + + && pt[4].z() > 0 + && pt[4].z() == pt[5].z() + && pt[4].z() == pt[6].z() + && pt[4].z() == pt[7].z() + + && std::abs( pt[0].z() + pt[4].z() ) < kCarTolerance + + && pt[0].y() == pt[1].y() + && pt[2].y() == pt[3].y() + && pt[4].y() == pt[5].y() + && pt[6].y() == pt[7].y() + + && std::abs(pt[0].y()+pt[2].y()+pt[4].y()+pt[6].y()) < kCarTolerance + && std::abs(pt[0].x()+pt[1].x()+pt[4].x()+pt[5].x() + + pt[2].x()+pt[3].x()+pt[6].x()+pt[7].x()) < kCarTolerance )) + { + std::ostringstream message; + message << "Invalid vertice coordinates for Solid: " << GetName(); + G4Exception("G4UTrap::G4UTrap()", "GeomSolids0002", + FatalException, message); + } + SetPlanes(pt); + CheckParameters(); + CheckPlanarity(pt); } G4UTrap::G4UTrap( const G4String& pName, @@ -68,6 +103,7 @@ G4UTrap::G4UTrap( const G4String& pName, G4double pX, G4double pLTX ) : Base_t(pName, pZ, pY, pX, pLTX) { + CheckParameters(); } G4UTrap::G4UTrap( const G4String& pName, @@ -76,6 +112,7 @@ G4UTrap::G4UTrap( const G4String& pName, G4double pdz ) : Base_t(pName, pdx1, pdx2, pdy1, pdy2, pdz) { + CheckParameters(); } G4UTrap::G4UTrap(const G4String& pName, @@ -83,6 +120,7 @@ G4UTrap::G4UTrap(const G4String& pName, G4double pAlpha, G4double pTheta, G4double pPhi ) : Base_t(pName, pdx, pdy, pdz, pAlpha, pTheta, pPhi) { + CheckParameters(); } G4UTrap::G4UTrap( const G4String& pName ) @@ -136,8 +174,8 @@ G4UTrap& G4UTrap::operator = (const G4UTrap& rhs) ////////////////////////////////////////////////////////////////////////// // -// Accessors & modifiers - +// Accessors +// G4double G4UTrap::GetZHalfLength() const { return GetDz(); @@ -154,6 +192,10 @@ G4double G4UTrap::GetXHalfLength2() const { return GetDx2(); } +G4double G4UTrap::GetTanAlpha1() const +{ + return Base_t::GetTanAlpha1(); +} G4double G4UTrap::GetYHalfLength2() const { return GetDy2(); @@ -166,32 +208,25 @@ G4double G4UTrap::GetXHalfLength4() const { return GetDx4(); } -G4double G4UTrap::GetThetaCphi() const +G4double G4UTrap::GetTanAlpha2() const { - return GetTanThetaCosPhi(); -} -G4double G4UTrap::GetThetaSphi() const -{ - return GetTanThetaSinPhi(); + return Base_t::GetTanAlpha2(); } G4double G4UTrap::GetPhi() const { - return std::atan2(GetTanThetaSinPhi(),GetTanThetaCosPhi()); + return Base_t::GetPhi(); } G4double G4UTrap::GetTheta() const { - const G4double tanThetaCphi=GetTanThetaSinPhi(); - const G4double tanThetaSphi=GetTanThetaCosPhi(); - return std::atan( std::sqrt(tanThetaCphi*tanThetaCphi - +tanThetaSphi*tanThetaSphi)); + return Base_t::GetTheta(); } G4double G4UTrap::GetAlpha1() const { - return std::atan(GetTanAlpha1()); + return Base_t::GetAlpha1(); } G4double G4UTrap::GetAlpha2() const { - return std::atan(GetTanAlpha2()); + return Base_t::GetAlpha2(); } TrapSidePlane G4UTrap::GetSidePlane(G4int n) const { @@ -211,6 +246,10 @@ G4ThreeVector G4UTrap::GetSymAxis() const return G4ThreeVector(tanThetaCphi*cosTheta, tanThetaSphi*cosTheta, cosTheta); } +////////////////////////////////////////////////////////////////////////// +// +// Modifier +// void G4UTrap::SetAllParameters(G4double pDz, G4double pTheta, G4double pPhi, G4double pDy1, G4double pDx1, G4double pDx2, G4double pAlp1, @@ -230,8 +269,17 @@ void G4UTrap::SetAllParameters(G4double pDz, G4double pTheta, G4double pPhi, SetTheta(pTheta); SetPhi(pPhi); fRebuildPolyhedron = true; + + G4ThreeVector pt[8]; + CheckParameters(); + GetVertices(pt); + CheckPlanarity(pt); } +///////////////////////////////////////////////////////////////////////// +// +// Set parameters using eight vertices +// void G4UTrap::SetPlanes(const G4ThreeVector pt[8]) { U3Vector upt[8]; @@ -243,6 +291,98 @@ void G4UTrap::SetPlanes(const G4ThreeVector pt[8]) fRebuildPolyhedron = true; } +///////////////////////////////////////////////////////////////////////// +// +// Check dimensions +// +void G4UTrap::CheckParameters() const +{ + G4double fDz = GetZHalfLength(); + G4double fDy1 = GetYHalfLength1(); + G4double fDx1 = GetXHalfLength1(); + G4double fDx2 = GetXHalfLength2(); + G4double fDy2 = GetYHalfLength2(); + G4double fDx3 = GetXHalfLength3(); + G4double fDx4 = GetXHalfLength4(); + + if (fDz<=0 || + fDy1<=0 || fDx1<=0 || fDx2<=0 || + fDy2<=0 || fDx3<=0 || fDx4<=0) + { + std::ostringstream message; + message << "Invalid Length Parameters for Solid: " << GetName() + << "\n X - " < std::abs(dmax)) dmax = dist; + } + if (std::abs(dmax) > 1000 * kCarTolerance) + { + std::ostringstream message; + message << "Side face " << side[i] << " is not planar for solid: " + << GetName() << "\nDiscrepancy: " << dmax/mm << " mm\n"; + StreamInfo(message); + G4Exception("G4UTrap::CheckPlanarity()", "GeomSolids0002", + FatalException, message); + } + } +} + ///////////////////////////////////////////////////////////////////////// // // Dispatch to parameterisation for replication mechanism dimension @@ -402,18 +542,11 @@ G4UTrap::CalculateExtent(const EAxis pAxis, // G4Polyhedron* G4UTrap::CreatePolyhedron() const { - G4double fTthetaSphi = GetThetaSphi(); - G4double fTthetaCphi = GetThetaCphi(); - G4double phi = std::atan2(fTthetaSphi, fTthetaCphi); - G4double alpha1 = std::atan(GetTanAlpha1()); - G4double alpha2 = std::atan(GetTanAlpha2()); - G4double theta = std::atan(std::sqrt(fTthetaCphi*fTthetaCphi+fTthetaSphi*fTthetaSphi)); - - return new G4PolyhedronTrap(GetZHalfLength(), theta, phi, + return new G4PolyhedronTrap(GetZHalfLength(), GetTheta(), GetPhi(), GetYHalfLength1(), - GetXHalfLength1(), GetXHalfLength2(), alpha1, + GetXHalfLength1(), GetXHalfLength2(), GetAlpha1(), GetYHalfLength2(), - GetXHalfLength3(), GetXHalfLength4(), alpha2); + GetXHalfLength3(), GetXHalfLength4(), GetAlpha2()); } #endif // G4GEOM_USE_USOLIDS diff --git a/source/geometry/solids/specific/History b/source/geometry/solids/specific/History index 4487b2464e..264ec6eef9 100644 --- a/source/geometry/solids/specific/History +++ b/source/geometry/solids/specific/History @@ -16,6 +16,35 @@ committal in the source repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +03-December-2021 E.Tcherniaev (geom-specific-V10-07-13) +- G4TwistedTubs: Accurate calculation of the bounding box in + BoundingLimits() and GetExtent(), fixing measured performance + penalty. Addressing problem report #2450. +- G4TwistedTubs, G4VTwistedFaceted: Fixed GetCubicVolume() + +15-October-2021 E.Tcherniaev (geom-specific-V10-07-12) +- G4Tet, G4UTet: Added SetBoundingLimits() + +06-October-2021 E.Tcherniaev (geom-specific-V10-07-11) +- G4Tet: some changes in calculation of bounding box +- G4UTet: added CheckDegeneracy() and SetVertices() + +27-September-2021 E.Tcherniaev (geom-specific-V10-07-10) +- Added degeneracyFlag to the list of parameters of G4Tet::SetVertices(), + it addresses first part of the problem report #2427 + +24-September-2021 E.Tcherniaev (geom-specific-V10-07-09) +- Implemented G4TesselatedSolid::GetFacetIndex(p) + +10-September-2021 E.Tcherniaev (geom-specific-V10-07-08) +- Implemented G4TesselatedSolid::CheckStructure() +- Optimisation in G4TessellatedSolid::SetExtremeFacets(): + shuffle of vertices and checking of six extreme vertices + +21-July-2021 E.Tcherniaev (geom-specific-V10-07-07) +- More accurate calculation of distance from point to triangle + in G4TriangularFacet, it addresses problem report #2401 + 25-June-2021 G.Cosmo (geom-specific-V10-07-06) - Added missing accessor in G4UTet. diff --git a/source/geometry/solids/specific/include/G4TessellatedSolid.hh b/source/geometry/solids/specific/include/G4TessellatedSolid.hh index 10b7c6937f..209c6678aa 100644 --- a/source/geometry/solids/specific/include/G4TessellatedSolid.hh +++ b/source/geometry/solids/specific/include/G4TessellatedSolid.hh @@ -146,6 +146,7 @@ class G4TessellatedSolid : public G4VSolid inline G4VFacet* GetFacet (G4int i) const; G4int GetNumberOfFacets () const; + G4int GetFacetIndex (const G4ThreeVector& p) const; virtual EInside Inside (const G4ThreeVector& p) const; virtual G4ThreeVector SurfaceNormal(const G4ThreeVector& p) const; @@ -176,6 +177,7 @@ class G4TessellatedSolid : public G4VSolid void SetSolidClosed (const G4bool t); G4bool GetSolidClosed () const; + G4int CheckStructure() const; inline void SetMaxVoxels(G4int max); diff --git a/source/geometry/solids/specific/include/G4Tet.hh b/source/geometry/solids/specific/include/G4Tet.hh index c85a180419..79fd210ad6 100644 --- a/source/geometry/solids/specific/include/G4Tet.hh +++ b/source/geometry/solids/specific/include/G4Tet.hh @@ -72,7 +72,8 @@ class G4Tet : public G4VSolid void SetVertices(const G4ThreeVector& anchor, const G4ThreeVector& p1, const G4ThreeVector& p2, - const G4ThreeVector& p3); + const G4ThreeVector& p3, + G4bool* degeneracyFlag = nullptr); // Accessors, return the four vertices of the shape void GetVertices(G4ThreeVector& anchor, @@ -95,6 +96,7 @@ class G4Tet : public G4VSolid const G4int n, const G4VPhysicalVolume* pRep); + void SetBoundingLimits(const G4ThreeVector& pMin, const G4ThreeVector& pMax); void BoundingLimits(G4ThreeVector& pMin, G4ThreeVector& pMax) const; G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits& pVoxelLimit, diff --git a/source/geometry/solids/specific/include/G4TwistedTubs.hh b/source/geometry/solids/specific/include/G4TwistedTubs.hh index 7787321cb0..2f2679a8d3 100644 --- a/source/geometry/solids/specific/include/G4TwistedTubs.hh +++ b/source/geometry/solids/specific/include/G4TwistedTubs.hh @@ -27,14 +27,15 @@ // // Class description: // -// G4TwistedTubs is a sort of twisted cylinder. +// G4TwistedTubs is a sector of a twisted hollow cylinder. // A twisted cylinder which is placed along with z-axis and is // separated into phi-segments should become a hyperboloid, and -// its each segmented piece should be tilted with a stereo angle. +// its each segmented piece should be tilted with a stereo angle. // G4TwistedTubs is a G4VSolid. -// It can have inner & outer surfaces as well as G4TwistedTubs, -// but cannot has different stereo angles between the inner surface -// and outer surface. +// +// Details of the implementation: "Development of a Geant4 solid +// for stereo mini-jet cells in a cylindrical drift chamber", +// Computer Physics Communications 153 (2003) pp.373–391 // 01-Aug-2002 - Kotoyo Hoshina (hoshina@hepburn.s.chiba-u.ac.jp), created. // 13-Nov-2003 - O.Link (Oliver.Link@cern.ch), Integration in Geant4 diff --git a/source/geometry/solids/specific/include/G4UTet.hh b/source/geometry/solids/specific/include/G4UTet.hh index 34bc02d74f..43bd135c07 100644 --- a/source/geometry/solids/specific/include/G4UTet.hh +++ b/source/geometry/solids/specific/include/G4UTet.hh @@ -50,11 +50,11 @@ class G4UTet : public G4UAdapter public: // with description - G4UTet(const G4String& pName, - G4ThreeVector anchor, - G4ThreeVector p2, - G4ThreeVector p3, - G4ThreeVector p4, + G4UTet(const G4String& pName, + const G4ThreeVector& anchor, + const G4ThreeVector& p1, + const G4ThreeVector& p2, + const G4ThreeVector& p3, G4bool* degeneracyFlag = nullptr); ~G4UTet(); @@ -75,9 +75,10 @@ class G4UTet : public G4UAdapter // persistifiable objects. G4UTet(const G4UTet& rhs); - G4UTet& operator=(const G4UTet& rhs); + G4UTet& operator=(const G4UTet& rhs); // Copy constructor and assignment operator. + void SetBoundingLimits(const G4ThreeVector& pMin, const G4ThreeVector& pMax); void BoundingLimits(G4ThreeVector& pMin, G4ThreeVector& pMax) const; G4bool CalculateExtent(const EAxis pAxis, @@ -87,12 +88,29 @@ class G4UTet : public G4UAdapter G4Polyhedron* CreatePolyhedron() const; + void SetVertices(const G4ThreeVector& anchor, + const G4ThreeVector& p1, + const G4ThreeVector& p2, + const G4ThreeVector& p3, + G4bool* degeneracyFlag = nullptr); + // Set new position of the vertices. + void GetVertices(G4ThreeVector& anchor, G4ThreeVector& p1, G4ThreeVector& p2, G4ThreeVector& p3) const; std::vector GetVertices() const; // Return the four vertices of the shape. + + G4bool CheckDegeneracy(const G4ThreeVector& p0, + const G4ThreeVector& p1, + const G4ThreeVector& p2, + const G4ThreeVector& p3) const; + // Return true if the tetrahedron is degenerate. + + private: + + G4ThreeVector fBmin, fBmax; // bounding box }; // -------------------------------------------------------------------- diff --git a/source/geometry/solids/specific/include/G4VTwistedFaceted.hh b/source/geometry/solids/specific/include/G4VTwistedFaceted.hh index a7a0b6ae1b..5463782bdc 100644 --- a/source/geometry/solids/specific/include/G4VTwistedFaceted.hh +++ b/source/geometry/solids/specific/include/G4VTwistedFaceted.hh @@ -297,9 +297,11 @@ class G4VTwistedFaceted: public G4VSolid inline G4double G4VTwistedFaceted::GetCubicVolume() { - if(fCubicVolume != 0.) ; - else fCubicVolume = 2 * fDz - * ( ( fDx1 + fDx2 ) * fDy1 + ( fDx3 + fDx4 ) * fDy2 ); + if(fCubicVolume == 0.) + { + fCubicVolume = ((fDx1 + fDx2 + fDx3 + fDx4)*(fDy1 + fDy2) + + (fDx4 + fDx3 - fDx2 - fDx1)*(fDy2 - fDy1)/3)*fDz; + } return fCubicVolume; } diff --git a/source/geometry/solids/specific/src/G4TessellatedSolid.cc b/source/geometry/solids/specific/src/G4TessellatedSolid.cc index d19647b6a5..45d3ba5337 100644 --- a/source/geometry/solids/specific/src/G4TessellatedSolid.cc +++ b/source/geometry/solids/specific/src/G4TessellatedSolid.cc @@ -38,7 +38,7 @@ // 12.10.2012, M Gayer, CERN, complete rewrite reducing memory // requirements more than 50% and speedup by a factor of // tens or more depending on the number of facets, thanks -// to voxelization of surface and improvements. +// to voxelization of surface and improvements. // Speedup factor of thousands for solids with number of // facets in hundreds of thousands. // 23.10.2016, E Tcherniaev, reimplemented CalculateExtent() to make @@ -56,6 +56,7 @@ #include #include #include +#include #include "geomdefs.hh" #include "Randomize.hh" @@ -248,7 +249,7 @@ G4bool G4TessellatedSolid::AddFacet (G4VFacet* aFacet) { --it; G4int id = (*it).id; - G4VFacet *facet = fFacets[id]; + G4VFacet *facet = fFacets[id]; G4ThreeVector q = facet->GetCircumcentre(); found = (facet == aFacet); if (found) break; @@ -268,7 +269,7 @@ G4bool G4TessellatedSolid::AddFacet (G4VFacet* aFacet) else { G4Exception("G4TessellatedSolid::AddFacet()", "GeomSolids1002", - JustWarning, "Attempt to add facet not properly defined."); + JustWarning, "Attempt to add facet not properly defined."); aFacet->StreamInfo(G4cout); return false; } @@ -392,21 +393,52 @@ void G4TessellatedSolid::Voxelize () // returns true. So will this work?? Need non-equality // "G4bool inside = displacement < 0.0;" // or -// "G4bool inside = displacement <= -0.5*kCarTolerance" +// "G4bool inside = displacement <= -0.5*kCarTolerance" // (Notes from PT 13/08/2007). // void G4TessellatedSolid::SetExtremeFacets() { + // Copy vertices to local array + G4int vsize = fVertexList.size(); + std::vector vertices(vsize); + for (G4int i = 0; i < vsize; ++i) { vertices[i] = fVertexList[i]; } + + // Shuffle vertices + std::mt19937 gen(12345678); + std::shuffle(vertices.begin(), vertices.end(), gen); + + // Select six extreme vertices in different directions + G4ThreeVector points[6]; + for (G4int i=0; i < 6; ++i) { points[i] = vertices[0]; } + for (G4int i=1; i < vsize; ++i) + { + if (vertices[i].x() < points[0].x()) points[0] = vertices[i]; + if (vertices[i].x() > points[1].x()) points[1] = vertices[i]; + if (vertices[i].y() < points[2].y()) points[2] = vertices[i]; + if (vertices[i].y() > points[3].y()) points[3] = vertices[i]; + if (vertices[i].z() < points[4].z()) points[4] = vertices[i]; + if (vertices[i].z() > points[5].z()) points[5] = vertices[i]; + } + + // Find extreme facets G4int size = fFacets.size(); for (G4int j = 0; j < size; ++j) { G4VFacet &facet = *fFacets[j]; + // Check extreme vertices + if (!facet.IsInside(points[0])) continue; + if (!facet.IsInside(points[1])) continue; + if (!facet.IsInside(points[2])) continue; + if (!facet.IsInside(points[3])) continue; + if (!facet.IsInside(points[4])) continue; + if (!facet.IsInside(points[5])) continue; + + // Check vertices G4bool isExtreme = true; - G4int vsize = fVertexList.size(); for (G4int i=0; i < vsize; ++i) { - if (!facet.IsInside(fVertexList[i])) + if (!facet.IsInside(vertices[i])) { isExtreme = false; break; @@ -442,7 +474,7 @@ void G4TessellatedSolid::CreateVertexList() G4double kCarTolerance24 = kCarTolerance * kCarTolerance / 4.0; G4double kCarTolerance3 = 3 * kCarTolerance; vector newIndex(100); - + for (G4int k = 0; k < size; ++k) { G4VFacet &facet = *fFacets[k]; @@ -505,7 +537,7 @@ void G4TessellatedSolid::CreateVertexList() // // Now update the maximum x, y and z limits of the volume. // - if (value.id == 0) fMinExtent = fMaxExtent = p; + if (value.id == 0) fMinExtent = fMaxExtent = p; else { if (p.x() > fMaxExtent.x()) fMaxExtent.setX(p.x()); @@ -534,7 +566,7 @@ void G4TessellatedSolid::CreateVertexList() facet.SetVertexIndex(i,newIndex[i]); } vector(fVertexList).swap(fVertexList); - + #ifdef G4SPECSDEBUG G4double previousValue = 0.; for (auto res=vertexListSorted.cbegin(); res!=vertexListSorted.cend(); ++res) @@ -543,7 +575,7 @@ void G4TessellatedSolid::CreateVertexList() G4ThreeVector vec = fVertexList[id]; G4double mvalue = vec.x() + vec.y() + vec.z(); if (previousValue && (previousValue - 1e-9 > mvalue)) - G4cout << "Error in CreateVertexList: previousValue " << previousValue + G4cout << "Error in CreateVertexList: previousValue " << previousValue << " is smaller than mvalue " << mvalue << G4endl; previousValue = mvalue; } @@ -558,7 +590,7 @@ void G4TessellatedSolid::DisplayAllocatedMemory() G4int with = AllocatedMemory(); G4double ratio = (G4double) with / without; G4cout << "G4TessellatedSolid - Allocated memory without voxel overhead " - << without << "; with " << with << "; ratio: " << ratio << G4endl; + << without << "; with " << with << "; ratio: " << ratio << G4endl; } /////////////////////////////////////////////////////////////////////////////// @@ -567,17 +599,17 @@ void G4TessellatedSolid::SetSolidClosed (const G4bool t) { if (t) { -#ifdef G4SPECSDEBUG +#ifdef G4SPECSDEBUG G4cout << "Creating vertex list..." << G4endl; #endif CreateVertexList(); -#ifdef G4SPECSDEBUG +#ifdef G4SPECSDEBUG G4cout << "Setting extreme facets..." << G4endl; #endif SetExtremeFacets(); - -#ifdef G4SPECSDEBUG + +#ifdef G4SPECSDEBUG G4cout << "Voxelizing..." << G4endl; #endif Voxelize(); @@ -586,7 +618,38 @@ void G4TessellatedSolid::SetSolidClosed (const G4bool t) DisplayAllocatedMemory(); #endif - } +#ifdef G4SPECSDEBUG + G4cout << "Checking Structure..." << G4endl; +#endif + G4int irep = CheckStructure(); + if (irep != 0) + { + if (irep & 1) + { + std::ostringstream message; + message << "Defects in solid: " << GetName() + << " - negative cubic volume, please check orientation of facets!"; + G4Exception("G4TessellatedSolid::SetSolidClosed()", + "GeomSolids1001", JustWarning, message); + } + if (irep & 2) + { + std::ostringstream message; + message << "Defects in solid: " << GetName() + << " - some facets have wrong orientation!"; + G4Exception("G4TessellatedSolid::SetSolidClosed()", + "GeomSolids1001", JustWarning, message); + } + if (irep & 4) + { + std::ostringstream message; + message << "Defects in solid: " << GetName() + << " - there are holes in the surface!"; + G4Exception("G4TessellatedSolid::SetSolidClosed()", + "GeomSolids1001", JustWarning, message); + } + } + } fSolidClosed = t; } @@ -601,6 +664,77 @@ G4bool G4TessellatedSolid::GetSolidClosed () const return fSolidClosed; } +/////////////////////////////////////////////////////////////////////////////// +// +// CheckStructure +// +// Checks structure of the solid. Return value is a sum of the following +// defect indicators, if any (0 means no defects): +// 1 - cubic volume is negative, wrong orientation of facets +// 2 - some facets have wrong orientation +// 4 - holes in the surface +// +G4int G4TessellatedSolid::CheckStructure() const +{ + G4int nedge = 0; + G4int nface = fFacets.size(); + + // Calculate volume + // + G4double volume = 0.; + for (G4int i = 0; i < nface; ++i) + { + G4VFacet& facet = *fFacets[i]; + nedge += facet.GetNumberOfVertices(); + volume += facet.GetArea()*(facet.GetVertex(0).dot(facet.GetSurfaceNormal())); + } + G4int ivolume = (volume <= 0.); + + // Create sorted vector of edges + // + std::vector iedge(nedge); + G4int kk = 0; + for (G4int i = 0; i < nface; ++i) + { + G4VFacet& facet = *fFacets[i]; + G4int nnode = facet.GetNumberOfVertices(); + for (G4int k = 0; k < nnode; ++k) + { + int64_t i1 = facet.GetVertexIndex((k == 0) ? nnode - 1 : k - 1); + int64_t i2 = facet.GetVertexIndex(k); + int64_t inverse = (i2 > i1); + if (inverse) std::swap(i1, i2); + iedge[kk++] = i1*1000000000 + i2*2 + inverse; + } + } + std::sort(iedge.begin(), iedge.end()); + + // Check edges, correct structure should consist of paired edges + // with different orientation + // + G4int iorder = 0; + G4int ihole = 0; + G4int i = 0; + while (i < nedge - 1) + { + if (iedge[i + 1] - iedge[i] == 1) // paired edges with different orientation + { + i += 2; + } + else if (iedge[i + 1] == iedge[i]) // paired edges with the same orientation + { + iorder = 2; + i += 2; + } + else // unpaired edge + { + ihole = 4; + i++; + } + } + return ivolume + iorder + ihole; +} + /////////////////////////////////////////////////////////////////////////////// // // operator+= @@ -722,7 +856,7 @@ EInside G4TessellatedSolid::InsideVoxels(const G4ThreeVector& p) const started ? startingCandidates : fVoxels.GetCandidates(curVoxel); started = false; if (G4int candidatesCount = candidates.size()) - { + { for (G4int i = 0 ; i < candidatesCount; ++i) { G4int candidate = candidates[i]; @@ -741,9 +875,9 @@ EInside G4TessellatedSolid::InsideVoxels(const G4ThreeVector& p) const || (crossingI && std::fabs(normalI.dot(v)) 0.0 && distO < distOut) + if (crossingO && distO > 0.0 && distO < distOut) distOut = distO; - if (crossingI && distI > 0.0 && distI < distIn) + if (crossingI && distI > 0.0 && distI < distIn) distIn = distI; } else break; @@ -819,7 +953,7 @@ EInside G4TessellatedSolid::InsideVoxels(const G4ThreeVector& p) const return location; } - + /////////////////////////////////////////////////////////////////////////////// // EInside G4TessellatedSolid::InsideNoVoxels (const G4ThreeVector &p) const @@ -963,6 +1097,55 @@ EInside G4TessellatedSolid::InsideNoVoxels (const G4ThreeVector &p) const return location; } +/////////////////////////////////////////////////////////////////////////////// +// +// Return index of the facet closest to the point p, normally the point should +// be located on the surface. Return -1 if no facet selected. +// +G4int G4TessellatedSolid::GetFacetIndex (const G4ThreeVector& p) const +{ + G4int index = -1; + + if (fVoxels.GetCountOfVoxels() > 1) + { + vector curVoxel(3); + fVoxels.GetVoxel(curVoxel, p); + const vector &candidates = fVoxels.GetCandidates(curVoxel); + if (G4int limit = candidates.size()) + { + G4double minDist = kInfinity; + for(G4int i = 0 ; i < limit ; ++i) + { + G4int candidate = candidates[i]; + G4VFacet& facet = *fFacets[candidate]; + G4double dist = facet.Distance(p, minDist); + if (dist <= kCarToleranceHalf) return index = candidate; + if (dist < minDist) + { + minDist = dist; + index = candidate; + } + } + } + } + else + { + G4double minDist = kInfinity; + G4int size = fFacets.size(); + for (G4int i = 0; i < size; ++i) + { + G4VFacet& facet = *fFacets[i]; + G4double dist = facet.Distance(p, minDist); + if (dist < minDist) + { + minDist = dist; + index = i; + } + } + } + return index; +} + /////////////////////////////////////////////////////////////////////////////// // // Return the outwards pointing unit normal of the shape for the @@ -985,7 +1168,7 @@ G4bool G4TessellatedSolid::Normal (const G4ThreeVector& p, { minDist = kInfinity; for(G4int i = 0 ; i < limit ; ++i) - { + { G4int candidate = candidates[i]; G4VFacet &fct = *fFacets[candidate]; G4double dist = fct.Distance(p,minDist); @@ -1257,8 +1440,8 @@ G4TessellatedSolid::DistanceToOutCore(const G4ThreeVector& aPoint, if (old != &candidates && candidates.size()) { DistanceToOutCandidates(candidates, aPoint, direction, minDistance, - aNormalVector, minCandidate); - if (minDistance <= totalShift) break; + aNormalVector, minCandidate); + if (minDistance <= totalShift) break; } G4double shift=fVoxels.DistanceToNext(currentPoint, direction, curVoxel); @@ -1306,7 +1489,7 @@ DistanceToInCandidates(const std::vector& candidates, G4double distFromSurface = 0.0; G4ThreeVector normal; - G4double minDistance = kInfinity; + G4double minDistance = kInfinity; for (G4int i = 0 ; i < candidatesCount; ++i) { G4int candidate = candidates[i]; @@ -1334,7 +1517,7 @@ DistanceToInCandidates(const std::vector& candidates, else if (distFromSurface > -kCarToleranceHalf && distFromSurface < kCarToleranceHalf) { - minDistance = dist; + minDistance = dist; } } } @@ -1359,7 +1542,7 @@ G4TessellatedSolid::DistanceToInCore(const G4ThreeVector& aPoint, G4double shift = fVoxels.DistanceToFirst(currentPoint, direction); if (shift == kInfinity) return shift; G4double shiftBonus = kCarTolerance; - if (shift) + if (shift) currentPoint += direction * (shift + shiftBonus); // if (!fVoxels.Contains(currentPoint)) return minDistance; G4double totalShift = shift; @@ -1416,7 +1599,7 @@ G4TessellatedSolid::MinDistanceFacet(const G4ThreeVector& p, G4int size = fVoxels.GetVoxelBoxesSize(); vector > voxelsSorted(size); - + pair info; for (G4int i = 0; i < size; ++i) @@ -1519,7 +1702,7 @@ G4double G4TessellatedSolid::SafetyFromOutside (const G4ThreeVector& p, // G4double G4TessellatedSolid::SafetyFromInside (const G4ThreeVector& p, G4bool) const -{ +{ #if G4SPECSDEBUG if ( Inside(p) == kOutside ) { @@ -1767,7 +1950,7 @@ G4Polyhedron *G4TessellatedSolid::CreatePolyhedron () const } polyhedron->AddFacet(v[0],v[1],v[2],v[3]); } - polyhedron->SetReferences(); + polyhedron->SetReferences(); return (G4Polyhedron*) polyhedron; } diff --git a/source/geometry/solids/specific/src/G4Tet.cc b/source/geometry/solids/specific/src/G4Tet.cc index 46c1404f51..54cedcbf95 100644 --- a/source/geometry/solids/specific/src/G4Tet.cc +++ b/source/geometry/solids/specific/src/G4Tet.cc @@ -250,11 +250,15 @@ void G4Tet::Initialize(const G4ThreeVector& p0, void G4Tet::SetVertices(const G4ThreeVector& p0, const G4ThreeVector& p1, const G4ThreeVector& p2, - const G4ThreeVector& p3) + const G4ThreeVector& p3, G4bool* degeneracyFlag) { // Check for degeneracy G4bool degenerate = CheckDegeneracy(p0, p1, p2, p3); - if (degenerate) + if (degeneracyFlag) + { + *degeneracyFlag = degenerate; + } + else if (degenerate) { std::ostringstream message; message << "Degenerate tetrahedron is not permitted: " << GetName() << " !\n" @@ -264,7 +268,7 @@ void G4Tet::SetVertices(const G4ThreeVector& p0, << " p3 : " << p3 << "\n" << " volume: " << std::abs((p1 - p0).cross(p2 - p0).dot(p3 - p0))/6.; - G4Exception("G4Tet::G4SetVertices()", "GeomSolids0002", + G4Exception("G4Tet::SetVertices()", "GeomSolids0002", FatalException, message); } @@ -312,6 +316,43 @@ void G4Tet::ComputeDimensions(G4VPVParameterisation* , { } +//////////////////////////////////////////////////////////////////////// +// +// Set bounding box +// +void G4Tet::SetBoundingLimits(const G4ThreeVector& pMin, + const G4ThreeVector& pMax) +{ + G4int iout[4] = { 0, 0, 0, 0 }; + for (G4int i = 0; i < 4; ++i) + { + iout[i] = (fVertex[i].x() < pMin.x() || + fVertex[i].y() < pMin.y() || + fVertex[i].z() < pMin.z() || + fVertex[i].x() > pMax.x() || + fVertex[i].y() > pMax.y() || + fVertex[i].z() > pMax.z()); + } + if (iout[0] + iout[1] + iout[2] + iout[3] != 0) + { + std::ostringstream message; + message << "Attempt to set bounding box that does not encapsulate solid: " + << GetName() << " !\n" + << " Specified bounding box limits:\n" + << " pmin: " << pMin << "\n" + << " pmax: " << pMax << "\n" + << " Tetrahedron vertices:\n" + << " anchor " << fVertex[0] << ((iout[0]) ? " is outside\n" : "\n") + << " p1 " << fVertex[1] << ((iout[1]) ? " is outside\n" : "\n") + << " p2 " << fVertex[2] << ((iout[2]) ? " is outside\n" : "\n") + << " p3 " << fVertex[3] << ((iout[3]) ? " is outside" : ""); + G4Exception("G4Tet::SetBoundingLimits()", "GeomSolids0002", + FatalException, message); + } + fBmin = pMin; + fBmax = pMax; +} + //////////////////////////////////////////////////////////////////////// // // Return bounding box diff --git a/source/geometry/solids/specific/src/G4TriangularFacet.cc b/source/geometry/solids/specific/src/G4TriangularFacet.cc index 9b71b2d841..5151a3ed1b 100644 --- a/source/geometry/solids/specific/src/G4TriangularFacet.cc +++ b/source/geometry/solids/specific/src/G4TriangularFacet.cc @@ -346,9 +346,9 @@ G4ThreeVector G4TriangularFacet::Distance (const G4ThreeVector& p) // // We are in region 0. // - q = q / fDet; - t = t / fDet; - fSqrDist = q*(fA*q + fB*t + 2.0*d) + t*(fB*q + fC*t + 2.0*e) + f; + G4double dist = fSurfaceNormal.dot(D); + fSqrDist = dist*dist; + return fSurfaceNormal*dist; } } else diff --git a/source/geometry/solids/specific/src/G4TwistedTubs.cc b/source/geometry/solids/specific/src/G4TwistedTubs.cc index e2aa388b0b..693fc2389d 100644 --- a/source/geometry/solids/specific/src/G4TwistedTubs.cc +++ b/source/geometry/solids/specific/src/G4TwistedTubs.cc @@ -32,6 +32,7 @@ #include "G4TwistedTubs.hh" +#include "G4GeomTools.hh" #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" #include "G4GeometryTolerance.hh" @@ -308,10 +309,31 @@ void G4TwistedTubs::ComputeDimensions(G4VPVParameterisation* /* p */ , void G4TwistedTubs::BoundingLimits(G4ThreeVector& pMin, G4ThreeVector& pMax) const { - G4double maxEndOuterRad = (fEndOuterRadius[0] > fEndOuterRadius[1] ? - fEndOuterRadius[0] : fEndOuterRadius[1]); - pMin.set(-maxEndOuterRad,-maxEndOuterRad,-fZHalfLength); - pMax.set( maxEndOuterRad, maxEndOuterRad, fZHalfLength); + // Find bounding tube + G4double rmin = GetInnerRadius(); + G4double rmax = GetEndOuterRadius(); + + G4double zmin = std::min(GetEndZ(0), GetEndZ(1)); + G4double zmax = std::max(GetEndZ(0), GetEndZ(1)); + + G4double dphi = 0.5*GetDPhi(); + G4double sphi = std::min(GetEndPhi(0), GetEndPhi(1)) - dphi; + G4double ephi = std::max(GetEndPhi(0), GetEndPhi(1)) + dphi; + G4double totalphi = ephi - sphi; + + // Find bounding box + if (dphi <= 0 || totalphi >= CLHEP::twopi) + { + pMin.set(-rmax,-rmax, zmin); + pMax.set( rmax, rmax, zmax); + } + else + { + G4TwoVector vmin,vmax; + G4GeomTools::DiskExtent(rmin, rmax, sphi, totalphi, vmin, vmax); + pMin.set(vmin.x(), vmin.y(), zmin); + pMax.set(vmax.x(), vmax.y(), zmax); + } // Check correctness of the bounding box // @@ -859,15 +881,15 @@ void G4TwistedTubs::DescribeYourselfTo (G4VGraphicsScene& scene) const //===================================================================== //* GetExtent --------------------------------------------------------- -G4VisExtent G4TwistedTubs::GetExtent() const +G4VisExtent G4TwistedTubs::GetExtent() const { // Define the sides of the box into which the G4Tubs instance would fit. - - G4double maxEndOuterRad = (fEndOuterRadius[0] > fEndOuterRadius[1] ? - fEndOuterRadius[0] : fEndOuterRadius[1]); - return G4VisExtent( -maxEndOuterRad, maxEndOuterRad, - -maxEndOuterRad, maxEndOuterRad, - -fZHalfLength, fZHalfLength ); + // + G4ThreeVector pmin,pmax; + BoundingLimits(pmin,pmax); + return G4VisExtent(pmin.x(),pmax.x(), + pmin.y(),pmax.y(), + pmin.z(),pmax.z()); } //===================================================================== @@ -1008,9 +1030,23 @@ G4VSolid* G4TwistedTubs::Clone() const G4double G4TwistedTubs::GetCubicVolume() { - if(fCubicVolume != 0.) {;} - else { fCubicVolume = fDPhi*fZHalfLength*(fOuterRadius*fOuterRadius - -fInnerRadius*fInnerRadius); } + if (fCubicVolume == 0.) + { + G4double DPhi = GetDPhi(); + G4double Z0 = GetEndZ(0); + G4double Z1 = GetEndZ(1); + G4double Ain = GetInnerRadius(); + G4double Aout = GetOuterRadius(); + G4double R0in = GetEndInnerRadius(0); + G4double R1in = GetEndInnerRadius(1); + G4double R0out = GetEndOuterRadius(0); + G4double R1out = GetEndOuterRadius(1); + + // V_hyperboloid = pi*h*(2*a*a + R*R)/3 + fCubicVolume = (2.*(Z1 - Z0)*(Aout + Ain)*(Aout - Ain) + + Z1*(R1out + R1in)*(R1out - R1in) + - Z0*(R0out + R0in)*(R0out - R0in))*DPhi/6.; + } return fCubicVolume; } @@ -1019,8 +1055,7 @@ G4double G4TwistedTubs::GetCubicVolume() G4double G4TwistedTubs::GetSurfaceArea() { - if(fSurfaceArea != 0.) {;} - else { fSurfaceArea = G4VSolid::GetSurfaceArea(); } + if (fSurfaceArea == 0.) fSurfaceArea = G4VSolid::GetSurfaceArea(); return fSurfaceArea; } diff --git a/source/geometry/solids/specific/src/G4UTet.cc b/source/geometry/solids/specific/src/G4UTet.cc index da14454ddd..e23d14b7a4 100644 --- a/source/geometry/solids/specific/src/G4UTet.cc +++ b/source/geometry/solids/specific/src/G4UTet.cc @@ -22,7 +22,7 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// +// // Implementation for G4UTet wrapper class // // 1.11.13 G.Cosmo, CERN @@ -49,44 +49,30 @@ using namespace CLHEP; // A Tet has all of its geometrical information precomputed // G4UTet::G4UTet(const G4String& pName, - G4ThreeVector anchor, - G4ThreeVector p2, - G4ThreeVector p3, - G4ThreeVector p4, G4bool* degeneracyFlag) + const G4ThreeVector& anchor, + const G4ThreeVector& p1, + const G4ThreeVector& p2, + const G4ThreeVector& p3, G4bool* degeneracyFlag) : Base_t(pName, U3Vector(anchor.x(),anchor.y(),anchor.z()), + U3Vector(p1.x(), p1.y(), p1.z()), U3Vector(p2.x(), p2.y(), p2.z()), - U3Vector(p3.x(), p3.y(), p3.z()), - U3Vector(p4.x(), p4.y(), p4.z())) + U3Vector(p3.x(), p3.y(), p3.z())) { - G4double fXMin=std::min(std::min(std::min(anchor.x(), p2.x()),p3.x()),p4.x()); - G4double fXMax=std::max(std::max(std::max(anchor.x(), p2.x()),p3.x()),p4.x()); - G4double fYMin=std::min(std::min(std::min(anchor.y(), p2.y()),p3.y()),p4.y()); - G4double fYMax=std::max(std::max(std::max(anchor.y(), p2.y()),p3.y()),p4.y()); - G4double fZMin=std::min(std::min(std::min(anchor.z(), p2.z()),p3.z()),p4.z()); - G4double fZMax=std::max(std::max(std::max(anchor.z(), p2.z()),p3.z()),p4.z()); - - G4ThreeVector fMiddle=G4ThreeVector(fXMax+fXMin,fYMax+fYMin,fZMax+fZMin)*0.5; - G4double fMaxSize=std::max(std::max(std::max((anchor-fMiddle).mag(), - (p2-fMiddle).mag()), - (p3-fMiddle).mag()), - (p4-fMiddle).mag()); - // fV is vector from vertex to vertex - // - G4ThreeVector fV21=p2-anchor; - G4ThreeVector fV31=p3-anchor; - G4ThreeVector fV41=p4-anchor; - - // make sure this is a correctly oriented set of points for the tetrahedron - // - G4double signed_vol=fV21.cross(fV31).dot(fV41); - G4bool degenerate=std::fabs(signed_vol) < 1e-9*fMaxSize*fMaxSize*fMaxSize; - + // Check for degeneracy + G4bool degenerate = CheckDegeneracy(anchor, p1, p2, p3); if(degeneracyFlag) *degeneracyFlag = degenerate; else if (degenerate) { G4Exception("G4UTet::G4UTet()", "GeomSolids0002", FatalException, "Degenerate tetrahedron not allowed."); } + + // Set bounding box + for (G4int i = 0; i < 3; ++i) + { + fBmin[i] = std::min(std::min(std::min(anchor[i], p1[i]), p2[i]), p3[i]); + fBmax[i] = std::max(std::max(std::max(anchor[i], p1[i]), p2[i]), p3[i]); + } } ////////////////////////////////////////////////////////////////////////// @@ -114,6 +100,8 @@ G4UTet::~G4UTet() G4UTet::G4UTet(const G4UTet& rhs) : Base_t(rhs) { + fBmin = rhs.fBmin; + fBmax = rhs.fBmax; } @@ -121,17 +109,50 @@ G4UTet::G4UTet(const G4UTet& rhs) // // Assignment operator // -G4UTet& G4UTet::operator = (const G4UTet& rhs) +G4UTet& G4UTet::operator = (const G4UTet& rhs) { - // Check assignment to self - // - if (this == &rhs) { return *this; } + // Check assignment to self + if (this == &rhs) { return *this; } - // Copy base class data - // - Base_t::operator=(rhs); + // Copy base class data + Base_t::operator=(rhs); - return *this; + // Copy bounding box + fBmin = rhs.fBmin; + fBmax = rhs.fBmax; + + return *this; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Return true if tetrahedron is degenerate +// Tetrahedron is concidered as degenerate in case if its minimal +// height is less than the degeneracy tolerance +// +G4bool G4UTet::CheckDegeneracy(const G4ThreeVector& p0, + const G4ThreeVector& p1, + const G4ThreeVector& p2, + const G4ThreeVector& p3) const +{ + G4double hmin = 4. * kCarTolerance; // degeneracy tolerance + + // Calculate volume + G4double vol = std::abs((p1 - p0).cross(p2 - p0).dot(p3 - p0)); + + // Calculate face areas squared + G4double ss[4]; + ss[0] = ((p1 - p0).cross(p2 - p0)).mag2(); + ss[1] = ((p2 - p0).cross(p3 - p0)).mag2(); + ss[2] = ((p3 - p0).cross(p1 - p0)).mag2(); + ss[3] = ((p2 - p1).cross(p3 - p1)).mag2(); + + // Find face with max area + G4int k = 0; + for (G4int i = 1; i < 4; ++i) { if (ss[i] > ss[k]) k = i; } + + // Check: vol^2 / s^2 <= hmin^2 + return (vol*vol <= ss[k]*hmin*hmin); } //////////////////////////////////////////////////////////////////////// @@ -154,6 +175,29 @@ G4VSolid* G4UTet::Clone() const return new G4UTet(*this); } +/////////////////////////////////////////////////////////////////////////////// +// +// Modifier +// +void G4UTet::SetVertices(const G4ThreeVector& anchor, + const G4ThreeVector& p1, + const G4ThreeVector& p2, + const G4ThreeVector& p3, + G4bool* degeneracyFlag) +{ + // Check for degeneracy + G4bool degenerate = CheckDegeneracy(anchor, p1, p2, p3); + if(degeneracyFlag) *degeneracyFlag = degenerate; + else if (degenerate) + { + G4Exception("G4UTet::SetVertices()", "GeomSolids0002", FatalException, + "Degenerate tetrahedron not allowed."); + } + + // Change tetrahedron + *this = G4UTet(GetName(), anchor, p1, p2, p3, °enerate); +} + /////////////////////////////////////////////////////////////////////////////// // // Accessors @@ -184,30 +228,54 @@ std::vector G4UTet::GetVertices() const return vertices; } +//////////////////////////////////////////////////////////////////////// +// +// Set bounding box +// +void G4UTet::SetBoundingLimits(const G4ThreeVector& pMin, + const G4ThreeVector& pMax) +{ + G4ThreeVector fVertex[4]; + GetVertices(fVertex[0], fVertex[1], fVertex[2], fVertex[3]); + + G4int iout[4] = { 0, 0, 0, 0 }; + for (G4int i = 0; i < 4; ++i) + { + iout[i] = (fVertex[i].x() < pMin.x() || + fVertex[i].y() < pMin.y() || + fVertex[i].z() < pMin.z() || + fVertex[i].x() > pMax.x() || + fVertex[i].y() > pMax.y() || + fVertex[i].z() > pMax.z()); + } + if (iout[0] + iout[1] + iout[2] + iout[3] != 0) + { + std::ostringstream message; + message << "Attempt to set bounding box that does not encapsulate solid: " + << GetName() << " !\n" + << " Specified bounding box limits:\n" + << " pmin: " << pMin << "\n" + << " pmax: " << pMax << "\n" + << " Tetrahedron vertices:\n" + << " anchor " << fVertex[0] << ((iout[0]) ? " is outside\n" : "\n") + << " p1 " << fVertex[1] << ((iout[1]) ? " is outside\n" : "\n") + << " p2 " << fVertex[2] << ((iout[2]) ? " is outside\n" : "\n") + << " p3 " << fVertex[3] << ((iout[3]) ? " is outside" : ""); + G4Exception("G4UTet::SetBoundingLimits()", "GeomSolids0002", + FatalException, message); + } + fBmin = pMin; + fBmax = pMax; +} + ////////////////////////////////////////////////////////////////////////// // // Get bounding box void G4UTet::BoundingLimits(G4ThreeVector& pMin, G4ThreeVector& pMax) const { - U3Vector vmin, vmax; - Base_t::Extent(vmin,vmax); - pMin.set(vmin.x(),vmin.y(),vmin.z()); - pMax.set(vmax.x(),vmax.y(),vmax.z()); - - // Check correctness of the bounding box - // - if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z()) - { - std::ostringstream message; - message << "Bad bounding box (min >= max) for solid: " - << GetName() << " !" - << "\npMin = " << pMin - << "\npMax = " << pMax; - G4Exception("G4UTet::BoundingLimits()", "GeomMgt0001", - JustWarning, message); - StreamInfo(G4cout); - } + pMin = fBmin; + pMax = fBmax; } ////////////////////////////////////////////////////////////////////////// diff --git a/source/geometry/solids/specific/src/G4VTwistedFaceted.cc b/source/geometry/solids/specific/src/G4VTwistedFaceted.cc index 2c25261b6e..4d4f02f93b 100644 --- a/source/geometry/solids/specific/src/G4VTwistedFaceted.cc +++ b/source/geometry/solids/specific/src/G4VTwistedFaceted.cc @@ -181,7 +181,6 @@ G4VTwistedFaceted( const G4String& pname, // Name of instance "GeomSolids0002", FatalErrorInArgument, message); } CreateSurfaces(); - fCubicVolume = 2 * fDz * ( ( fDx1 + fDx2 ) * fDy1 + ( fDx3 + fDx4 ) * fDy2 ); } diff --git a/source/geometry/volumes/History b/source/geometry/volumes/History index 6e3c76caf5..d129702eaf 100644 --- a/source/geometry/volumes/History +++ b/source/geometry/volumes/History @@ -16,6 +16,18 @@ commit in the repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +October 14th, 2021 G.Cosmo - geomvol-V10-07-05 +- Use same strategy for cloning solids for replicated volumes types in + G4GeometryWorkspace (required for having proper treatment of divided + volumes). Cleanup of unused verbose printouts. +- G4PVReplica: moved internal defines for MT split data to source. + Avoid deletion of rotation matrix for replication in Phi in destructor + as not necessary. Some code cleanup. + +October 12th, 2021 E.Tcherniaev - geomvol-V10-07-04 +- G4PVPlacement::CheckOverlaps(): more precise estimation of overlap size, + improved check for encapsulation of volume by another volume. + June 4th, 2021 I.Hrivnacova - geomvol-V10-07-03 - Added G4ReflectionFactory::Clean() for clearing the internal maps on users request and removed problematic G4ReflectionFactory::Reset() diff --git a/source/geometry/volumes/include/G4GeometryWorkspace.hh b/source/geometry/volumes/include/G4GeometryWorkspace.hh index 539bb82a3d..4622896e74 100644 --- a/source/geometry/volumes/include/G4GeometryWorkspace.hh +++ b/source/geometry/volumes/include/G4GeometryWorkspace.hh @@ -42,15 +42,14 @@ // Authors: John Apostolakis (CERN), Andrea Dotti (SLAC), July 2013 // -------------------------------------------------------------------- #ifndef G4GEOMETRYWORKSPACE_HH -#define G4GEOMETRYWORKSPACE_HH +#define G4GEOMETRYWORKSPACE_HH 1 #include "G4TWorkspacePool.hh" -#include "G4PVReplica.hh" -#include "G4PVParameterised.hh" -#include "G4VPVParameterisation.hh" -#include "G4PhysicalVolumeStore.hh" -#include "G4VSolid.hh" +// Headers defining MT "manager" types +// +#include "G4PVReplica.hh" +#include "G4VSolid.hh" #include "G4LogicalVolume.hh" #include "G4Region.hh" @@ -70,15 +69,11 @@ class G4GeometryWorkspace void InitialiseWorkspace(); // To be called at start of each run (especially 2nd and further runs) - inline void SetVerbose(G4bool v) { fVerbose = v; } - inline G4bool GetVerbose() { return fVerbose; } - static pool_type* GetPool(); protected: // Implementation methods void InitialisePhysicalVolumes(); - G4bool CloneParameterisedSolids( G4PVParameterised* paramVol ); G4bool CloneReplicaSolid( G4PVReplica* ); private: // Helper pointers - can be per instance or shared @@ -96,8 +91,6 @@ class G4GeometryWorkspace G4PVData* fPhysicalVolumeOffset; G4ReplicaData* fReplicaOffset; G4RegionData* fRegionOffset; - - G4bool fVerbose = false; }; #endif diff --git a/source/geometry/volumes/include/G4PVReplica.hh b/source/geometry/volumes/include/G4PVReplica.hh index b41a3591df..e5e306fbff 100644 --- a/source/geometry/volumes/include/G4PVReplica.hh +++ b/source/geometry/volumes/include/G4PVReplica.hh @@ -65,7 +65,7 @@ // 13.01.13 G.Cosmo, A.Dotti - Modified for thread-safety for MT // ---------------------------------------------------------------------- #ifndef G4PVREPLICA_HH -#define G4PVREPLICA_HH +#define G4PVREPLICA_HH 1 #include "G4VPhysicalVolume.hh" #include "G4GeomSplitter.hh" @@ -81,38 +81,15 @@ public: void initialize() {} - G4int fcopyNo; + G4int fcopyNo = -1; }; -// The type G4PVRManager is introduced to encapsulate the methods used by -// both the master thread and worker threads to allocate memory space for -// the fields encapsulated by the class G4ReplicaData. When each thread -// initializes the value for these fields, it refers to them using a macro -// definition defined below. For every G4PVReplica instance, there is -// a corresponding G4ReplicaData instance. All G4ReplicaData instances are -// organized by the class G4PVRManager as an array. -// The field "int instanceID" is added to the class G4PVReplica. -// The value of this field in each G4LogicalVolume instance is the subscript -// of the corresponding G4ReplicaData instance. -// In order to use the class G4PVRManager, we add a static member in the -// class G4LogicalVolume as follows: "static G4PVRManager subInstanceManager". -// For the master thread, the array for G4ReplicaData instances grows -// dynamically along with G4PVReplica instances arecreated. -// For each worker thread, it copies the array of G4ReplicaData instances -// from the master thread. -// In addition, it invokes a method similiar to the constructor explicitly -// to achieve the partial effect for each instance in the array. -// -typedef G4GeomSplitter G4PVRManager; - -// This macro changes the references to fields that are now encapsulated -// in the class G4ReplicaData. -// -#define G4MT_copyNo ((subInstanceManager.offset[instanceID]).fcopyNo) +using G4PVRManager = G4GeomSplitter; +// Implementation detail for use of G4ReplicaData objects class G4PVReplica : public G4VPhysicalVolume { - public: // with description + public: G4PVReplica(const G4String& pName, G4LogicalVolume* pLogical, @@ -167,7 +144,7 @@ class G4PVReplica : public G4VPhysicalVolume G4int GetRegularStructureId() const; // Accessors for specialised geometries - public: // without description + // Methods for handling of MT instances inline G4int GetInstanceID() const { return instanceID; } // Returns the instance ID. @@ -183,24 +160,26 @@ class G4PVReplica : public G4VPhysicalVolume // This method is similar to the destructor. It is used by each worker // thread to achieve the partial effect as that of the master thread. + protected: + + G4PVReplica(const G4String& pName, + G4int nReplicas, + EAxis pAxis, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical); + // Constructor for derived type(s): PVParameterised, PVDivision, ... + // Does not set mother or register in mother volume -- leaves it to + // derived type + private: void CheckAndSetParameters(const EAxis pAxis, const G4int nReplicas, const G4double width, const G4double offset); void CheckOnlyDaughter(G4LogicalVolume* pMotherLogical); - // Check that this volume is the only daughter of its proposed mother volume + // Check that this volume is the only daughter of its proposed mother + // volume - protected: - G4PVReplica(const G4String& pName, - G4int nReplicas, - EAxis pAxis, - G4LogicalVolume* pLogical, - G4LogicalVolume* pMotherLogical - ); - // Constructor for derived type(s): PVParameterised - // - does not set mother or register in mother volume -- leaves it to derived type - protected: EAxis faxis; @@ -217,4 +196,24 @@ class G4PVReplica : public G4VPhysicalVolume // This new field helps to use the class G4PVRManager introduced above. }; +// NOTE: +// The type G4PVRManager is introduced to encapsulate the methods used by +// both the master thread and worker threads to allocate memory space for +// the fields encapsulated by the class G4ReplicaData. When each thread +// initializes the value for these fields, it refers to them using a macro +// definition defined below. For every G4PVReplica instance, there is +// a corresponding G4ReplicaData instance. All G4ReplicaData instances are +// organized by the class G4PVRManager as an array. +// The field "int instanceID" is added to the class G4PVReplica. +// The value of this field in each G4LogicalVolume instance is the subscript +// of the corresponding G4ReplicaData instance. +// In order to use the class G4PVRManager, we add a static member in the +// class G4LogicalVolume as follows: "static G4PVRManager subInstanceManager". +// For the master thread, the array for G4ReplicaData instances grows +// dynamically along with G4PVReplica instances arecreated. +// For each worker thread, it copies the array of G4ReplicaData instances +// from the master thread. +// In addition, it invokes a method similiar to the constructor explicitly +// to achieve the partial effect for each instance in the array. + #endif diff --git a/source/geometry/volumes/src/G4GeometryWorkspace.cc b/source/geometry/volumes/src/G4GeometryWorkspace.cc index 53b65049ee..a306e2cd70 100644 --- a/source/geometry/volumes/src/G4GeometryWorkspace.cc +++ b/source/geometry/volumes/src/G4GeometryWorkspace.cc @@ -29,18 +29,7 @@ // -------------------------------------------------------------------- #include "G4GeometryWorkspace.hh" - -#include "G4PVReplica.hh" -#include "G4PVParameterised.hh" -#include "G4VPVParameterisation.hh" #include "G4PhysicalVolumeStore.hh" -#include "G4VSolid.hh" - -#include "G4LogicalVolume.hh" -#include "G4VPhysicalVolume.hh" -#include "G4PVReplica.hh" -#include "G4Region.hh" - #include "G4AutoLock.hh" namespace @@ -94,11 +83,6 @@ G4GeometryWorkspace::~G4GeometryWorkspace() void G4GeometryWorkspace::UseWorkspace() { - if( fVerbose ) - { - G4cout << "G4GeometryWorkspace::UseWorkspace: Start " << G4endl; - } - // Geometry related, split classes mechanism: instantiate sub-instance // for this thread // @@ -112,11 +96,6 @@ G4GeometryWorkspace::UseWorkspace() // - it must be a lightweight operation, to reuse a valid work area // - so it must NOT Initialise anything! // Do not call InitialisePhysicalVolumes(); - - if( fVerbose ) - { - G4cout << "G4GeometryWorkspace::UseWorkspace: End " << G4endl; - } } // ---------------------------------------------------------------------- @@ -148,44 +127,25 @@ void G4GeometryWorkspace::InitialisePhysicalVolumes() { // Placement volume // - logicalVol->InitialiseWorker(logicalVol,solid,0); + logicalVol->InitialiseWorker(logicalVol,solid,nullptr); } else { g4PVReplica->InitialiseWorker(g4PVReplica); - if( !g4PVReplica->IsParameterised() ) - { - logicalVol->InitialiseWorker(logicalVol,solid,0); + logicalVol->InitialiseWorker(logicalVol,solid,nullptr); - // If the replica's solid (in LV) is changed during navigation, - // it must be thread-private - // - CloneReplicaSolid( g4PVReplica ); - } - else - { - G4PVParameterised* paramVol = dynamic_cast(physVol); - if (paramVol == nullptr) - { - G4Exception("G4GeometryWorkspace::CreateAndUseWorkspace()", - "GeomVol0003", FatalException, - "Cannot find Parameterisation for parameterised volume."); - } - CloneParameterisedSolids( paramVol ); - } + // If the replica's solid (in LV) is changed during navigation, + // it must be thread-private + // + CloneReplicaSolid( g4PVReplica ); } } - if( fVerbose ) - { - G4cout << "G4GeometryWorkspace::InitialisePhysicalVolumes: " - << "Copying geometry - Done!" << G4endl; - } } // ---------------------------------------------------------------------- // Create a clone of the solid for this replica in this thread // -G4bool G4GeometryWorkspace::CloneReplicaSolid( G4PVReplica *replicaPV ) +G4bool G4GeometryWorkspace::CloneReplicaSolid( G4PVReplica* replicaPV ) { G4LogicalVolume* logicalV = replicaPV->GetLogicalVolume(); G4VSolid* solid = logicalV->GetSolid(); @@ -196,7 +156,7 @@ G4bool G4GeometryWorkspace::CloneReplicaSolid( G4PVReplica *replicaPV ) if( workerSolid != nullptr ) { - logicalV->InitialiseWorker(logicalV,workerSolid,0); + logicalV->InitialiseWorker(logicalV,workerSolid,nullptr); } else { @@ -209,91 +169,17 @@ G4bool G4GeometryWorkspace::CloneReplicaSolid( G4PVReplica *replicaPV ) << "A solid lacks the Clone() method - or Clone() failed." << "\n" << " Type of solid: " << solid->GetEntityType() << "\n" << " Parameters: " << *solid; - G4Exception("G4GeometryWorkspace::CloneParameterisedVolume()", + G4Exception("G4GeometryWorkspace::CloneReplicaSolid()", "GeomVol0003", FatalException, ed); return false; } return true; // It Worked } -// ---------------------------------------------------------------------- -// Each G4PVParameterised instance has associated with it at least one -// solid for each worker thread. -// *Simple* Parameterisations have a single type of solid, and the -// pointer points to the same instance of a solid during the simulation. -// For this case, it is possible to adapt automatically to -// multi-threading, simply by cloning the solid - so long -// as all solids support the Clone() method. -// -G4bool G4GeometryWorkspace:: -CloneParameterisedSolids( G4PVParameterised* paramVol ) -{ - // Check whether it is a simple parameterisation or not - // - // G4VPVParameterisation *param= paramVol->GetParameterisation(); - // unsigned int numCopies= paramVol->GetMultiplicity(); - // unsigned int numDifferent= 0; - - G4LogicalVolume* logicalV= paramVol->GetLogicalVolume(); - G4VSolid* solid= logicalV->GetSolid(); - - // for( unsigned int i=0; i< numCopies; ++i) - // { - // G4VSolid *solidChk= param->ComputeSolid(i, paramVol); - // if( solidChk != solid) - // { - // ++numDifferent; - // } - // } - // if( numDifferent>0 ) - // { - // G4ExceptionDescription ed; - // ed << "ERROR - Parameterisation using several instances of Solids \n" - // << "potentially to support different types of solids. \n" - // << "Geant4-MT currently does not support this type of \n" - // << "parameterisation, sorry !"; - // G4Exception("G4GeometryWorkspace::CloneParameterisedVolume()", - // "GeomVol0001", FatalException, ed); - // } - - // Threads may attempt to clone a solid simultaneously. - // Those cloned solids will be registered into a shared solid - // store (C++ container). Need a lock to guarantee thread safety - // - G4AutoLock aLock(&mutex_init); - G4VSolid *workerSolid = solid->Clone(); - aLock.unlock(); - if( workerSolid != nullptr ) - { - logicalV->InitialiseWorker(logicalV, workerSolid, nullptr); - } - else - { - // In the case that not all solids support(ed) the Clone() - // method, we do similar thing here to dynamically cast - // and then get the clone method - // - G4ExceptionDescription ed; - ed << "ERROR - Unable to initialise geometry for worker node. \n" - << "A solid lacks the Clone() method - or Clone() failed. \n" - << " Type of solid: " << solid->GetEntityType() << "\n" - << " Parameters: " << *solid; - G4Exception("G4GeometryWorkspace::CloneParameterisedVolume()", - "GeomVol0003", FatalException, ed); - } - return true; // It Worked -} - // ---------------------------------------------------------------------- // void G4GeometryWorkspace::InitialiseWorkspace() { - if( fVerbose ) - { - G4cout << "G4GeometryWorkspace::InitialiseWorkspace():" - << " Copying geometry - Start " << G4endl; - } - // Geometry related, split classes mechanism: // Do *NOT* instantiate sub-instance for this thread, just copy the contents! // @@ -303,12 +189,6 @@ void G4GeometryWorkspace::InitialiseWorkspace() fpRegionSIM->SlaveInitializeSubInstance(); InitialisePhysicalVolumes(); - - if( fVerbose ) - { - G4cout << "G4GeometryWorkspace::InitialiseWorkspace: " - << "Copying geometry - Done!" << G4endl; - } } // ---------------------------------------------------------------------- diff --git a/source/geometry/volumes/src/G4PVPlacement.cc b/source/geometry/volumes/src/G4PVPlacement.cc index 31ed9e41d7..79b34b5b82 100644 --- a/source/geometry/volumes/src/G4PVPlacement.cc +++ b/source/geometry/volumes/src/G4PVPlacement.cc @@ -254,7 +254,8 @@ G4bool G4PVPlacement::CheckOverlaps(G4int res, G4double tol, if (verbose) { - G4cout << "Checking overlaps for volume " << GetName() + G4cout << "Checking overlaps for volume " + << GetName() << ':' << GetCopyNo() << " (" << solid->GetEntityType() << ") ... "; } @@ -299,40 +300,50 @@ G4bool G4PVPlacement::CheckOverlaps(G4int res, G4double tol, // Check overlap with the mother volume // + G4int overlapCount = 0; + G4double overlapSize = -kInfinity; + G4ThreeVector overlapPoint; G4VSolid* motherSolid = motherLog->GetSolid(); for (G4int i = 0; i < res; ++i) { G4ThreeVector mp = points[i]; if (motherSolid->Inside(mp) != kOutside) continue; G4double distin = motherSolid->DistanceToIn(mp); - if (distin > tol) - { - ++trials; - retval = true; - std::ostringstream message; - message << "Overlap with mother volume !" << G4endl - << " Overlap is detected for volume " - << GetName() << ':' << GetCopyNo() - << " (" << solid->GetEntityType() << ")" << G4endl - << " with its mother volume " << motherLog->GetName() - << " (" << motherSolid->GetEntityType() << ")" << G4endl - << " at mother local point " << mp << ", " - << "overlapping by at least: " - << G4BestUnit(distin, "Length"); - if (trials >= maxErr) - { - message << G4endl - << "NOTE: Reached maximum fixed number -" << maxErr - << "- of overlaps reports for this volume !"; - } - G4Exception("G4PVPlacement::CheckOverlaps()", - "GeomVol1002", JustWarning, message); - if (trials >= maxErr) { return true; } - break; - } + if (distin < tol) continue; // too small overlap + ++overlapCount; + if (distin <= overlapSize) continue; + overlapSize = distin; + overlapPoint = mp; } - // Checking overlaps with each 'sister' volume + // Print information on overlap + // + if (overlapCount > 0) + { + ++trials; + retval = true; + std::ostringstream message; + message << "Overlap with mother volume !" << G4endl + << " Overlap is detected for volume " + << GetName() << ':' << GetCopyNo() + << " (" << solid->GetEntityType() << ")" + << " with its mother volume " << motherLog->GetName() + << " (" << motherSolid->GetEntityType() << ")" << G4endl + << " protrusion at mother local point " << overlapPoint + << " by " << G4BestUnit(overlapSize, "Length") + << " (max of " << overlapCount << " cases)"; + if (trials >= maxErr) + { + message << G4endl + << "NOTE: Reached maximum fixed number -" << maxErr + << "- of overlaps reports for this volume !"; + } + G4Exception("G4PVPlacement::CheckOverlaps()", + "GeomVol1002", JustWarning, message); + if (trials >= maxErr) { return true; } + } + + // Checking overlaps with each 'sister' volumes // G4VSolid* previous = nullptr; G4ThreeVector pmin_local(0.,0.,0.), pmax_local(0.,0.,0.); @@ -341,6 +352,7 @@ G4bool G4PVPlacement::CheckOverlaps(G4int res, G4double tol, { G4VPhysicalVolume* daughter = motherLog->GetDaughter(k); if (daughter == this) continue; + G4bool check_encapsulation = true; G4AffineTransform Td(daughter->GetRotation(), daughter->GetTranslation()); G4VSolid* daughterSolid = daughter->GetLogicalVolume()->GetSolid(); @@ -349,9 +361,9 @@ G4bool G4PVPlacement::CheckOverlaps(G4int res, G4double tol, daughterSolid->BoundingLimits(pmin_local, pmax_local); previous = daughterSolid; } - G4double distout = -kInfinity; - G4ThreeVector plocal; - if (!Td.IsRotated()) { + overlapCount = 0; + overlapSize = -kInfinity; + if (!Td.IsRotated()) { // no rotation, only translation G4ThreeVector offset = Td.NetTranslation(); G4ThreeVector pmin(pmin_local + offset); G4ThreeVector pmax(pmax_local + offset); @@ -373,15 +385,17 @@ G4bool G4PVPlacement::CheckOverlaps(G4int res, G4double tol, G4ThreeVector md = p - offset; if (daughterSolid->Inside(md) == kInside) { - G4double dtmp = daughterSolid->DistanceToOut(md); - if (dtmp <= tol) continue; - distout = dtmp; - plocal = md; - break; + check_encapsulation = false; + G4double distout = daughterSolid->DistanceToOut(md); + if (distout < tol) continue; // too small overlap + ++overlapCount; + if (distout <= overlapSize) continue; + overlapSize = distout; + overlapPoint = md; } } } - else + else // transformation with rotation { G4ThreeVector pmin(pmin_local), pmax(pmax_local); G4ThreeVector dcenter = Td.TransformPoint(0.5*(pmin + pmax)); @@ -434,16 +448,20 @@ G4bool G4PVPlacement::CheckOverlaps(G4int res, G4double tol, G4ThreeVector md = Td.InverseTransformPoint(p); if (daughterSolid->Inside(md) == kInside) { - G4double dtmp = daughterSolid->DistanceToOut(md); - if (dtmp <= tol) continue; - distout = dtmp; - plocal = md; - break; + check_encapsulation = false; + G4double distout = daughterSolid->DistanceToOut(md); + if (distout < tol) continue; // too small overlap + ++overlapCount; + if (distout <= overlapSize) continue; + overlapSize = distout; + overlapPoint = md; } } } - if (distout > tol) + // Print information on overlap + // + if (overlapCount > 0) { ++trials; retval = true; @@ -451,14 +469,12 @@ G4bool G4PVPlacement::CheckOverlaps(G4int res, G4double tol, message << "Overlap with volume already placed !" << G4endl << " Overlap is detected for volume " << GetName() << ':' << GetCopyNo() - << " (" << solid->GetEntityType() << ")" << G4endl - << " with " << daughter->GetName() - << ':' << daughter->GetCopyNo() - << " (" << daughterSolid->GetEntityType() << ")" - << " volume's" << G4endl - << " local point " << plocal << ", " - << "overlapping by at least: " - << G4BestUnit(distout, "Length"); + << " (" << solid->GetEntityType() << ") with " + << daughter->GetName() << ':' << daughter->GetCopyNo() + << " (" << daughterSolid->GetEntityType() << ")" << G4endl + << " overlap at local point " << overlapPoint + << " by " << G4BestUnit(overlapSize, "Length") + << " (max of " << overlapCount << " cases)"; if (trials >= maxErr) { message << G4endl @@ -469,14 +485,18 @@ G4bool G4PVPlacement::CheckOverlaps(G4int res, G4double tol, "GeomVol1002", JustWarning, message); if (trials >= maxErr) { return true; } } - else if (distout == kInfinity) + else if (check_encapsulation) { // Now checking that 'sister' volume is not totally included - // and overlapping. Generate a single point on the surface of + // and overlapping. Generate a single point inside of // the 'sister' volume and verify that the point in NOT inside // the current volume // - G4ThreeVector dPoint = daughterSolid->GetPointOnSurface(); + G4ThreeVector pSurface = daughterSolid->GetPointOnSurface(); + G4ThreeVector normal = daughterSolid->SurfaceNormal(pSurface); + G4ThreeVector pInside = pSurface - normal*1.e-4; // move point to inside + G4ThreeVector dPoint = (daughterSolid->Inside(pInside) == kInside) ? + pInside : pSurface; // Transform the generated point to the mother's coordinate system // and then to current volume's coordinate system @@ -496,7 +516,7 @@ G4bool G4PVPlacement::CheckOverlaps(G4int res, G4double tol, << " apparently fully encapsulating volume " << daughter->GetName() << ':' << daughter->GetCopyNo() << " (" << daughterSolid->GetEntityType() << ")" - << " at the same level !"; + << " at the same level!"; if (trials >= maxErr) { message << G4endl diff --git a/source/geometry/volumes/src/G4PVReplica.cc b/source/geometry/volumes/src/G4PVReplica.cc index 7646e576ee..30da6d9597 100644 --- a/source/geometry/volumes/src/G4PVReplica.cc +++ b/source/geometry/volumes/src/G4PVReplica.cc @@ -31,9 +31,15 @@ #include "G4PVReplica.hh" #include "G4LogicalVolume.hh" +// ---------------------------------------------------------------------- G4PVRManager G4PVReplica::subInstanceManager; // Helping in the use of the class G4PVRManager. +#define G4MT_copyNo ((subInstanceManager.offset[instanceID]).fcopyNo) + // This macro changes the references to fields that are now encapsulated + // in the class G4ReplicaData. + +// ---------------------------------------------------------------------- G4PVReplica::G4PVReplica( const G4String& pName, G4LogicalVolume* pLogical, G4VPhysicalVolume* pMother, @@ -46,8 +52,6 @@ G4PVReplica::G4PVReplica( const G4String& pName, instanceID = subInstanceManager.CreateSubInstance(); - G4MT_copyNo = -1; - if ((pMother == nullptr) || (pMother->GetLogicalVolume() == nullptr)) { std::ostringstream message; @@ -80,6 +84,7 @@ G4PVReplica::G4PVReplica( const G4String& pName, CheckAndSetParameters (pAxis, nReplicas, width, offset); } +// ---------------------------------------------------------------------- G4PVReplica::G4PVReplica( const G4String& pName, G4LogicalVolume* pLogical, G4LogicalVolume* pMotherLogical, @@ -91,7 +96,6 @@ G4PVReplica::G4PVReplica( const G4String& pName, { instanceID = subInstanceManager.CreateSubInstance(); - G4MT_copyNo = -1; if (pMotherLogical == nullptr) { @@ -126,6 +130,7 @@ G4PVReplica::G4PVReplica( const G4String& pName, CheckAndSetParameters (pAxis, nReplicas, width, offset); } +// ---------------------------------------------------------------------- G4PVReplica::G4PVReplica( const G4String& pName, G4int nReplicas, EAxis pAxis, @@ -139,7 +144,6 @@ G4PVReplica::G4PVReplica( const G4String& pName, // ( To allow the correct type to be found in mother->AddDaughter ) instanceID = subInstanceManager.CreateSubInstance(); - G4MT_copyNo = -1; if (pMotherLogical == nullptr) { @@ -174,6 +178,7 @@ G4PVReplica::G4PVReplica( const G4String& pName, CheckAndSetParameters (pAxis, nReplicas, 0.0, 0.0); } +// ---------------------------------------------------------------------- void G4PVReplica::CheckOnlyDaughter(G4LogicalVolume* pMotherLogical) { if (pMotherLogical->GetNoDaughters() != 0) @@ -192,6 +197,7 @@ void G4PVReplica::CheckOnlyDaughter(G4LogicalVolume* pMotherLogical) } } +// ---------------------------------------------------------------------- void G4PVReplica::CheckAndSetParameters( const EAxis pAxis, const G4int nReplicas, const G4double width, @@ -239,61 +245,67 @@ void G4PVReplica::CheckAndSetParameters( const EAxis pAxis, } } +// ---------------------------------------------------------------------- G4PVReplica::G4PVReplica( __void__& a ) : G4VPhysicalVolume(a), faxis(kZAxis), fnReplicas(0), fwidth(0.), foffset(0.) { instanceID = subInstanceManager.CreateSubInstance(); - G4MT_copyNo = -1; } +// ---------------------------------------------------------------------- G4PVReplica::~G4PVReplica() { - if ( faxis==kPhi ) - { - delete GetRotation(); - } } +// ---------------------------------------------------------------------- G4bool G4PVReplica::IsMany() const { return false; } +// ---------------------------------------------------------------------- G4int G4PVReplica::GetCopyNo() const { return G4MT_copyNo; } +// ---------------------------------------------------------------------- void G4PVReplica::SetCopyNo(G4int newCopyNo) { G4MT_copyNo = newCopyNo; } +// ---------------------------------------------------------------------- G4bool G4PVReplica::IsReplicated() const { return true; } +// ---------------------------------------------------------------------- G4bool G4PVReplica::IsParameterised() const { return false; } +// ---------------------------------------------------------------------- G4VPVParameterisation* G4PVReplica::GetParameterisation() const { return nullptr; } +// ---------------------------------------------------------------------- G4int G4PVReplica::GetMultiplicity() const { return fnReplicas; } +// ---------------------------------------------------------------------- EVolume G4PVReplica::VolumeType() const { return kReplica; } +// ---------------------------------------------------------------------- void G4PVReplica::GetReplicationData( EAxis& axis, G4int& nReplicas, G4double& width, @@ -307,21 +319,25 @@ void G4PVReplica::GetReplicationData( EAxis& axis, consuming = true; } +// ---------------------------------------------------------------------- G4bool G4PVReplica::IsRegularStructure() const { return (fRegularVolsId != 0); } +// ---------------------------------------------------------------------- G4int G4PVReplica::GetRegularStructureId() const { return fRegularVolsId; } +// ---------------------------------------------------------------------- void G4PVReplica::SetRegularStructureId( G4int code ) { fRegularVolsId = code; } +// ---------------------------------------------------------------------- // Returns the private data instance manager. // const G4PVRManager& G4PVReplica::GetSubInstanceManager() @@ -329,6 +345,7 @@ const G4PVRManager& G4PVReplica::GetSubInstanceManager() return subInstanceManager; } +// ---------------------------------------------------------------------- // This method is similar to the constructor. It is used by each worker // thread to achieve the same effect as that of the master thread exept // to register the new created instance. This method is invoked explicitly. @@ -342,12 +359,11 @@ void G4PVReplica::InitialiseWorker(G4PVReplica* pMasterObject) subInstanceManager.SlaveCopySubInstanceArray(); G4MT_copyNo = -1; - // This call causes "self-assignment" of the input paramters - // Issue reported by DRD since TerminateWorker below can be called - // at the same time by another thread - // What we need here is the splic-class component of this funciton - // that is copied here - // CheckAndSetParameters (faxis, fnReplicas, fwidth, foffset); + // This call causes "self-assignment" of the input parameters + // Issue reported by DRD since TerminateWorker() below can be called + // at the same time by another thread. + // What we need here is the split-class component of CheckAndSetParameters() + // funciton copied here. // Create rotation matrix for phi axis case & check axis is valid // @@ -376,9 +392,10 @@ void G4PVReplica::InitialiseWorker(G4PVReplica* pMasterObject) } } +// ---------------------------------------------------------------------- // This method is similar to the destructor. It is used by each worker // thread to achieve the partial effect as that of the master thread. -// For G4PVReplica instances, it destories the rotation matrix. +// For G4PVReplica instances, it destroys the rotation matrix. // void G4PVReplica::TerminateWorker(G4PVReplica* /*pMasterObject*/) { diff --git a/source/global/History b/source/global/History index 352ffe6e49..81aa618a3f 100644 --- a/source/global/History +++ b/source/global/History @@ -16,6 +16,95 @@ commit in the repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +December 3, 2021 Gabriele Cosmo (global-V10-07-36) +- Updated tag IDs for geant4-11-00-ref-00. + +October 30, 2021 Vladimir Ivanchenko (global-V10-07-35) +- G4PhysicsModelCatalog : extended number of EM types + +October 28, 2021 Gabriele Cosmo (global-V10-07-34) +- Updated tag IDs for geant4-10-07-ref-09. + +October 25, 2021 Ben Morgan (global-V10-07-33) +- Deprecate non-std::string member functions, replacing with new free + functions in G4StrUtil namespace + +October 18, 2021 Ben Morgan (global-V10-07-32) +- Remove obsolete/std::string synonym member functions from G4String: + - hash/stlhash + - data + - replace + - index + - isNull + - first/last + - append/prepend + - call operators + +October 13, 2021 Alberto Ribon (global-V10-07-31) +- G4PhysicsModelCatalog : made the last changes as agreed during + the Collaboration meeting. This version should be ready for the + release G4 11.0 + +October 8, 2021 Vladimir Ivanchenko (global-V10-07-30) +- G4PhysicsOrderedFreeVector is back redirected to G4PhysicsFreeVector; + CMS request + +October 7, 2021 Vladimir Ivanchenko (global-V10-07-29) +- G4PhysicsModelCatalog : extended number of EM types + +October 1, 2021 Ben Morgan (global-V10-07-28) +- Simplify G4String interfaces and implementation with C++11/17 + +September 30, 2021 Gabriele Cosmo (global-V10-07-27) +- Updated tag IDs for geant4-10-07-ref-08. + +September 27, 2021 Vladimir Ivanchenko (global-V10-07-26) +- G4PhysicsModelCatalog : EM part is filled according to proposal + agreed at the annual workshop + +September 16, 2021 Vladimir Ivanchenko (global-V10-07-25) +- Fixed G4PhysicsVector::GetMinEnergy() and format icc file + +September 10, 2021 Guilherme Amadio (global-V10-07-24) +- Optimize G4PhysicsVector::Interpolation. + +September 8, 2021 Michel Maire (global-V10-07-23) +- G4BestUnit : modify previous feature: + for energy = 0, print "eV" instead of "meV" + +August 31, 2021 Gabriele Cosmo (global-V10-07-22) +- Updated tag IDs for geant4-10-07-ref-07. + +August 27, 2021 Vladimir Ivanchenko (global-V10-07-21) +- G4PhysicsVectorType: added enumeration of Spline type, use namespace +- G4PhysicsVector, G4PhysicsFreeVector, G4PhysicsLogVector, + G4PhysicsLinearVector: major update - introduced new public access methods; + removed obsolete unused methods; introduced possibility to use different + Spline methods; do not fill second derivative vector if Spline not enabled; + improved control on input data; reduce number of calls to min/max; attempt + to optimise run time code G4PhysicsTable, improved use of the vector type. + +August 23, 2021 Guilherme Amadio (global-V10-07-20) +- G4BackTrace: move from deprecated sigignore() to signal(). + +August 22, 2021 Michel Maire (global-V10-07-19) +- G4BestUnit : if value=0, do print unit symbol. + +August 4, 2021 Alberto Ribon (global-V10-07-18) +- G4PhysicsModelCatalog : new version of the catalog of physics models. + Introduced a modelID (a unique integer for each physics model, with + close values for similar/related physics models), besides an index + (the position in a vector) and the name (string) of the physics model. + The main difference with respect to the previous version is that + the three identifiers of each physics model - modelID, index and + name - must stay constant and the same for all applications, + physics lists and future versions of Geant4, starting with 11.0. + +July 18, 2021 Vladimir Ivanchenko (global-V10-07-17) +- G4PhysicsVector, G4PhysicsTable, G4PhysicsFreeVector - removed + obsolete methods SetSpline(); T_G4PhysicsFreeVector type set + to be default; improved comments and printouts + June 21, 2021 Gabriele Cosmo (global-V10-07-16) - Updated G4SIUnits and G4PhysicalConstants to include new symbols (minute, hour, day, year and millielectronvolt) and new constants diff --git a/source/global/management/include/G4Backtrace.hh b/source/global/management/include/G4Backtrace.hh index 82e414d9b1..f57b05f0b2 100644 --- a/source/global/management/include/G4Backtrace.hh +++ b/source/global/management/include/G4Backtrace.hh @@ -455,7 +455,7 @@ inline void G4Backtrace::Message(int sig, siginfo_t* sinfo, std::ostream& os) // overflowing the signal stack // ignore future signals of this type - sigignore(sig); + signal(sig, SIG_IGN); os << "\n### CAUGHT SIGNAL: " << sig << " ### "; if(sinfo) @@ -580,9 +580,9 @@ inline void G4Backtrace::Handler(int sig, siginfo_t* sinfo, void*) } // ignore any termination signals - sigignore(SIGKILL); - sigignore(SIGTERM); - sigignore(SIGABRT); + signal(SIGKILL, SIG_IGN); + signal(SIGTERM, SIG_IGN); + signal(SIGABRT, SIG_IGN); abort(); } diff --git a/source/global/management/include/G4PhysicsFreeVector.hh b/source/global/management/include/G4PhysicsFreeVector.hh index 92316bb20b..57e320287d 100644 --- a/source/global/management/include/G4PhysicsFreeVector.hh +++ b/source/global/management/include/G4PhysicsFreeVector.hh @@ -53,79 +53,48 @@ class G4PhysicsFreeVector : public G4PhysicsVector { public: - explicit G4PhysicsFreeVector(std::size_t length = 0, G4bool spline = false); + + // Constructors of a free vector without filling of data. + // The vector will be filled using PutValues(..), Retrieve(..), or + // InsertValues(..) methods. + // If length > 0 energy and data vectors are initialized with zeros + explicit G4PhysicsFreeVector(G4bool spline = false); + explicit G4PhysicsFreeVector(G4int length); + explicit G4PhysicsFreeVector(std::size_t length, G4bool spline = false); + + // Obsolete constructor - emin and emax are not used explicit G4PhysicsFreeVector(std::size_t length, G4double emin, G4double emax, G4bool spline = false); - // The vector with 'length' elements will be filled using the PutValues(..) - // method; energy and data vectors are initialized with zeros. + // The vector is filled in these constructor; + // 'energies' and 'values' need to have the same vector length; + // 'energies' assumed to increase, it is allowed to have consequtive + // equal energies explicit G4PhysicsFreeVector(const std::vector& energies, const std::vector& values, G4bool spline = false); - // The vector is filled in this constructor; - // 'energies' and 'values' need to have the same vector length; - // 'energies' assumed to be ordered and controlled in the user code. - explicit G4PhysicsFreeVector(const G4double* energies, const G4double* values, std::size_t length, G4bool spline = false); - // The vector is filled in this constructor; - // 'energies' and 'values' need to have the same vector length; - // 'energies' assumed to be ordered in the user code. - virtual ~G4PhysicsFreeVector(); + virtual ~G4PhysicsFreeVector() = default; - void PutValues(std::size_t index, G4double e, G4double value); - // User code is responsible for correct filling of all elements + // Filling of the vector with the check on index and energy + void PutValues(const std::size_t index, + const G4double energy, const G4double value); - void InsertValues(G4double energy, G4double value); - - G4double GetEnergy(G4double value); - // This method can be applied if both energy and data values - // grow monotonically, for example, if in this vector a - // cumulative probability density function is stored. - - inline G4double GetMaxValue(); - inline G4double GetMinValue(); - inline G4double GetMaxLowEdgeEnergy(); - inline G4double GetMinLowEdgeEnergy(); - // Obsolete methods + // Insert extra pair of energy and value + // If energy coincide with previously added energy then + // this new pair is added after + void InsertValues(const G4double energy, const G4double value); - inline void PutValue(std::size_t index, G4double e, G4double value); - // User code is responsible for correct filling of all elements // Obsolete method - -private: - - std::size_t FindValueBinLocation(G4double aValue); - - G4double LinearInterpolationOfEnergy(G4double aValue, std::size_t locBin); + inline void PutValue(const std::size_t index, + const G4double e, const G4double value); }; -// ----------------------------- -// Inline methods implementation -// ----------------------------- -inline G4double G4PhysicsFreeVector::GetMaxValue() -{ - return dataVector.back(); -} - -inline G4double G4PhysicsFreeVector::GetMinValue() -{ - return dataVector.front(); -} - -inline G4double G4PhysicsFreeVector::GetMaxLowEdgeEnergy() -{ - return edgeMax; -} - -inline G4double G4PhysicsFreeVector::GetMinLowEdgeEnergy() -{ - return edgeMin; -} - -inline void G4PhysicsFreeVector::PutValue(std::size_t index, G4double e, - G4double value) +inline void G4PhysicsFreeVector::PutValue(const std::size_t index, + const G4double e, + const G4double value) { PutValues(index, e, value); } diff --git a/source/global/management/include/G4PhysicsLinearVector.hh b/source/global/management/include/G4PhysicsLinearVector.hh index d697005656..51bcbb884c 100644 --- a/source/global/management/include/G4PhysicsLinearVector.hh +++ b/source/global/management/include/G4PhysicsLinearVector.hh @@ -47,22 +47,20 @@ class G4PhysicsLinearVector : public G4PhysicsVector { public: - explicit G4PhysicsLinearVector(G4bool spline = false); // The vector will be filled from external file using Retrieve() method + explicit G4PhysicsLinearVector(G4bool spline = false); + // Energies will be computed and filled at construction, values will be + // filled with zeros. Required Nbin > 0 and Emax > Emin. + // Use PutValue(..) to fill the data vector explicit G4PhysicsLinearVector(G4double Emin, G4double Emax, std::size_t Nbin, G4bool spline = false); - // Energy vector will be computed and filled at construction, - // number of elements 'Nbin+1'. Use PutValue() to fill the data vector - virtual ~G4PhysicsLinearVector(); + virtual ~G4PhysicsLinearVector() = default; - virtual G4bool Retrieve(std::ifstream& fIn, G4bool ascii) final; - // To retrieve persistent data from a file stream +protected: - virtual void ScaleVector(G4double factorE, G4double factorV) final; - // Scale all values of the vector and second derivatives - // by factorV, energies - by vectorE + void Initialise() final; }; #endif diff --git a/source/global/management/include/G4PhysicsLogVector.hh b/source/global/management/include/G4PhysicsLogVector.hh index 40a892517a..0f08c033c7 100644 --- a/source/global/management/include/G4PhysicsLogVector.hh +++ b/source/global/management/include/G4PhysicsLogVector.hh @@ -47,24 +47,20 @@ class G4PhysicsLogVector : public G4PhysicsVector { public: - explicit G4PhysicsLogVector(G4bool spline = false); // The vector will be filled from external file using Retrieve() method + explicit G4PhysicsLogVector(G4bool spline = false); + // Energies will be computed and filled at construction, values will be + // filled with zeros. Required Nbin > 1 and Emax > Emin > 0. + // Use PutValue(..) to fill the data vector explicit G4PhysicsLogVector(G4double Emin, G4double Emax, std::size_t Nbin, G4bool spline = false); - // Energy vector will be computed and filled at construction, - // number of nodes 'Nbin+1'. Use PutValue() to fill the data vector - // Because of logarithmic scale, 'Emin' has to be - // greater than zero. No protection exists against this error - virtual ~G4PhysicsLogVector(); + virtual ~G4PhysicsLogVector() = default; - virtual G4bool Retrieve(std::ifstream& fIn, G4bool ascii) final; - // To retrieve persistent data from a file stream +protected: - virtual void ScaleVector(G4double factorE, G4double factorV) final; - // Scale all values of the vector and second derivatives - // by factorV, energies - by vectorE + void Initialise() final; }; #endif diff --git a/source/global/management/include/G4PhysicsModelCatalog.hh b/source/global/management/include/G4PhysicsModelCatalog.hh index cda0251b88..a023e6072e 100644 --- a/source/global/management/include/G4PhysicsModelCatalog.hh +++ b/source/global/management/include/G4PhysicsModelCatalog.hh @@ -30,6 +30,8 @@ // Singleton, collection of physics models, to be used by models and G4Track. // Author: M.Asai (SLAC), 26 September 2013 + +// Revised in August 2021 by A.Ribon (CERN). // -------------------------------------------------------------------- #ifndef G4PhysicsModelCatalog_hh #define G4PhysicsModelCatalog_hh @@ -39,24 +41,78 @@ #include "G4String.hh" #include "globals.hh" -class G4PhysicsModelCatalog -{ - public: - ~G4PhysicsModelCatalog(); - G4PhysicsModelCatalog(const G4PhysicsModelCatalog&) = delete; - G4PhysicsModelCatalog& operator=(const G4PhysicsModelCatalog&) = delete; - static G4int Register(const G4String&); - static const G4String& GetModelName(G4int); +class G4PhysicsModelCatalog { + public: + static void Initialize(); + ~G4PhysicsModelCatalog(); + G4PhysicsModelCatalog( const G4PhysicsModelCatalog& ) = delete; + G4PhysicsModelCatalog& operator=( const G4PhysicsModelCatalog& ) = delete; - static G4int GetIndex(const G4String&); - static G4int Entries(); - static void Destroy(); + static const G4String GetModelNameFromID( const G4int modelID ); + static const G4String GetModelNameFromIndex( const G4int modelIndex ); + static G4int GetModelID( const G4int modelIndex ); + static G4int GetModelID( const G4String& modelName ); + static G4int GetModelIndex( const G4int modelID ); + static G4int GetModelIndex( const G4String& modelName ); + // There are two integer values: the model ID and the model Index. + // The model ID is a unique integer which identifies not only the model + // but also the category to which it belongs to; future models should + // be given an model ID consistent with their category. + // In the Geant4 code, it should always be the model ID, not the model Index, + // which is used. + // The model Index is the index of the vector of either model IDs, or + // model names (these two vectors have the same size). + // The model Index for a model does not have meaning in itself: + // it depends only on the order in which the vectors are filled. + // The model Index is useful for plotting because the index of the vector + // has contiguous, small non-negative integer values, whereas the modelID + // has non-contiguous, large, positive integer values (unconvenient for plotting). + // The idea is that, starting from Geant4 version 11.0, all the three + // identifiers (modelID, index, name) remain the same regardless of the + // physics list, application, and version of Geant4. - private: - G4PhysicsModelCatalog(); + static G4int Entries(); + // The size of the two vectors (of model IDs and model names) are required to be the same. - static std::vector* theCatalog; + static void PrintAllInformation(); + // Print all information of this class about the models, i.e. each entry + // of the two vectors - the one of model-IDs and the one of model-names. + + static G4int GetMinAllowedModelIDValue(); + static G4int GetMaxAllowedModelIDValue(); + // Returns the two limits, min and max respectively, that the modelID value can have. + + private: + G4PhysicsModelCatalog(); + + static void SanityCheck(); + // Check that the two vectors (of model IDs and model names) have the same size, + // the model IDs have the expected values (i.e. within the allowed interval), and + // there are no duplication of either model IDs or model names. + + inline static void InsertModel( G4int modelID, G4String modelName ); + + static G4bool isInitialized; + static const G4int theMinAllowedModelIDValue = 10000; + static const G4int theMaxAllowedModelIDValue = 39999; + + static std::vector< G4int >* theVectorOfModelIDs; // Non-contiguous large, positive integers + static std::vector< G4String >* theVectorOfModelNames; }; + +inline G4int G4PhysicsModelCatalog::GetMinAllowedModelIDValue() { + return theMinAllowedModelIDValue; +} + +inline G4int G4PhysicsModelCatalog::GetMaxAllowedModelIDValue() { + return theMaxAllowedModelIDValue; +} + +inline void G4PhysicsModelCatalog::InsertModel( G4int modelID, G4String modelName ) { + theVectorOfModelIDs->push_back( modelID ); + theVectorOfModelNames->push_back( modelName ); +} + #endif diff --git a/examples/extended/exoticphysics/channeling/include/Analysis.hh b/source/global/management/include/G4PhysicsOrderedFreeVector.hh similarity index 90% rename from examples/extended/exoticphysics/channeling/include/Analysis.hh rename to source/global/management/include/G4PhysicsOrderedFreeVector.hh index 4aa7784ac1..185e3edd97 100644 --- a/examples/extended/exoticphysics/channeling/include/Analysis.hh +++ b/source/global/management/include/G4PhysicsOrderedFreeVector.hh @@ -23,12 +23,11 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // +#ifndef G4PhysicsOrderedFreeVector_hh +#define G4PhysicsOrderedFreeVector_hh 1 -#ifndef Analysis_h -#define Analysis_h 1 +#include "G4PhysicsFreeVector.hh" -#include "g4root.hh" -//#include "g4xml.hh" -//#include "g4csv.hh" +using G4PhysicsOrderedFreeVector = G4PhysicsFreeVector; #endif diff --git a/source/global/management/include/G4PhysicsVector.hh b/source/global/management/include/G4PhysicsVector.hh index b25a2200c6..6826736cdb 100644 --- a/source/global/management/include/G4PhysicsVector.hh +++ b/source/global/management/include/G4PhysicsVector.hh @@ -38,10 +38,6 @@ // - 03 Mar. 1996, K.Amako: Implemented the 1st version // Revisions: // - 11 Nov. 2000, H.Kurashige: Use STL vector for dataVector and binVector -// - 02 Apr. 2008, A.Bagulya: Added SplineInterpolation() and SetSpline() -// - 19 Jun. 2009, V.Ivanchenko: Removed hidden bin -// - 15 Mar. 2019 M.Novak: added Value method with the known log-energy value -// that can avoid the log call in case of log-vectors // -------------------------------------------------------------------- #ifndef G4PhysicsVector_hh #define G4PhysicsVector_hh 1 @@ -55,175 +51,171 @@ #include "G4ios.hh" #include "globals.hh" -using G4PVDataVector = std::vector; - class G4PhysicsVector { - public: - explicit G4PhysicsVector(G4bool spline = false); +public: // Default constructor - vector will be filled via Retrieve() method + // Free vector may be filled via InsertValue(..) method + explicit G4PhysicsVector(G4bool spline = false); - G4PhysicsVector(const G4PhysicsVector&); - G4PhysicsVector& operator=(const G4PhysicsVector&); // Copy constructor and assignment operator + G4PhysicsVector(const G4PhysicsVector&) = default; + G4PhysicsVector& operator=(const G4PhysicsVector&) = default; - G4bool operator==(const G4PhysicsVector& right) const; - G4bool operator!=(const G4PhysicsVector& right) const; - // Equality operators + // not used operators + G4PhysicsVector(const G4PhysicsVector&&) = delete; + G4PhysicsVector& operator=(const G4PhysicsVector&&) = delete; + G4bool operator==(const G4PhysicsVector& right) const = delete; + G4bool operator!=(const G4PhysicsVector& right) const = delete; - virtual ~G4PhysicsVector(); + virtual ~G4PhysicsVector() = default; - G4double Value(G4double theEnergy, std::size_t& lastidx) const; // Get the cross-section/energy-loss value corresponding to the // given energy. An appropriate interpolation is used to calculate // the value. Consumer code gets changed index and may reuse it // for the next call to save CPU for bin location. + inline G4double Value(const G4double energy, std::size_t& lastidx) const; - inline G4double LogVectorValue(const G4double theEnergy, - const G4double theLogEnergy) const; - // Same as the Value() method above but specialised for log-vector type. - // Note, unlike the general Value() method above, this method will work - // properly only in case of G4PhysicsLogVector-s. - - inline G4double Value(G4double theEnergy) const; // Get the cross-section/energy-loss value corresponding to the // given energy. An appropriate interpolation is used to calculate - // the value. This method is kept for backward compatibility reason, - // it should be used instead of the previous method if bin location - // cannot be kept thread safe + // the value. This method should be used if bin location cannot be + // kept in the user code. + inline G4double Value(const G4double energy) const; - inline G4double GetValue(G4double theEnergy, G4bool& isOutRange) const; // Obsolete method to get value, 'isOutRange' is not used anymore. // This method is kept for the compatibility reason + inline G4double GetValue(const G4double energy, G4bool& isOutRange) const; + // Same as the Value() method above but specialised for log-vector type. + // Note, unlike the general Value() method above, this method will work + // properly only for G4PhysicsLogVector. + inline G4double LogVectorValue(const G4double energy, + const G4double theLogEnergy) const; + + // Returns the value for the specified index of the dataVector + // The boundary check will not be done inline G4double operator[](const std::size_t index) const; - // Returns the value for the specified index of the dataVector - // The boundary check will not be done - inline G4double operator()(const std::size_t index) const; - // Returns the value for the specified index of the dataVector - // The boundary check will not be done - inline void PutValue(std::size_t index, G4double theValue); - // Put 'theValue' into the dataVector specified by 'index'. + // Put data into the vector at 'index' position. // Take note that the 'index' starts from '0'. - // To fill the vector, need to beforehand construct a vector - // by the constructor with Emin, Emax, Nbin. 'theValue' should - // be the cross-section/energy-loss value corresponding to the - // energy of the index + // It is assumed that energies are already filled. + inline void PutValue(const std::size_t index, const G4double value); - virtual void ScaleVector(G4double factorE, G4double factorV); - // Scale all values of the vector and second derivatives - // by factorV, energies by vectorE. This method may be applied - // for example after retrieving a vector from an external file to - // convert values into Geant4 units - - inline G4double Energy(std::size_t index) const; // Returns the value in the energy specified by 'index' // of the energy vector. The boundary check will not be done. - // Use this function when compute cross-section or dEdx - // before filling the vector by PutValue() + // Use this when compute cross-section, dEdx, or other value + // before filling the vector by PutValue(). + inline G4double Energy(const std::size_t index) const; + inline G4double GetLowEdgeEnergy(const std::size_t index) const; + // Returns the energy of the first and the last point of the vector. + inline G4double GetMinEnergy() const; inline G4double GetMaxEnergy() const; - // Returns the energy of the last point of the vector - G4double GetLowEdgeEnergy(std::size_t binNumber) const; - // Obsolete method - // Get the energy value at the low edge of the specified bin. - // Take note that the 'binNumber' starts from '0'. - // The boundary check will not be done + // Returns the data of the first and the last point of the vector. + // If the vector is empty returns zeros. + inline G4double GetMinValue() const; + inline G4double GetMaxValue() const; - inline std::size_t GetVectorLength() const; // Get the total length of the vector + inline std::size_t GetVectorLength() const; - inline std::size_t FindBin(const G4double energy, - const std::size_t idx) const; - // Find low edge index of a bin for given energy. - // Min value 0, max value VectorLength-1. - // idx is suggested bin number from user code - - inline std::size_t ComputeLogVectorBin(const G4double logenergy) const; // Computes the lower index the energy bin in case of log-vector i.e. // in case of vectors with equal bin widths on log-scale + // Note, that no check on the boundary is performed + inline std::size_t ComputeLogVectorBin(const G4double logenergy) const; - void FillSecondDerivatives(); - // Initialise second derivatives for Spline keeping - // 3rd derivative continues - default algorithm. - // Warning: this method should be called when the vector - // is already filled - - void ComputeSecDerivatives(); - // Initialise second derivatives for Spline using algorithm - // which garantee only 1st derivative continues. - // Warning: this method should be called when the vector - // is already filled - - void ComputeSecondDerivatives(G4double firstPointDerivative, - G4double endPointDerivative); - // Initialise second derivatives for Spline using - // user defined 1st derivatives at edge points. - // Warning: this method should be called when the vector - // is already filled - - G4double FindLinearEnergy(G4double rand) const; - // Find energy using linear interpolation for vector - // filled by cumulative probability function - // value of rand should be between 0 and 1 - - inline G4bool IsFilledVectorExist() const; - // Is non-empty physics vector already exist? - + // Get physics vector type. inline G4PhysicsVectorType GetType() const; - // Get physics vector type - - inline void SetSpline(G4bool); - // Activate/deactivate Spline interpolation + // True if using spline interpolation. inline G4bool GetSpline() const; - // True if using spline interpolation - - G4bool Store(std::ofstream& fOut, G4bool ascii = false) const; - virtual G4bool Retrieve(std::ifstream& fIn, G4bool ascii = false); - // To store/retrieve persistent data to/from file streams. - - friend std::ostream& operator<<(std::ostream&, const G4PhysicsVector&); - void DumpValues(G4double unitE = 1.0, G4double unitV = 1.0) const; - // Print vector + // Define verbosity level. inline void SetVerboseLevel(G4int value); - protected: - void DeleteData(); - void CopyData(const G4PhysicsVector& vec); - // Internal methods for allowing copy of objects + // Find energy using linear interpolation for vector + // filled by cumulative probability function. + // Assuming that vector is already filled. + inline G4double FindLinearEnergy(const G4double rand) const; - void PrintPutValueError(std::size_t index, G4double e1, G4double e2); + // Find low edge index of a bin for given energy. + // Min value 0, max value idxmax. + std::size_t FindBin(const G4double energy, std::size_t idx) const; - G4PhysicsVectorType type = T_G4PhysicsVector; - // The type of PhysicsVector (enumerator) + // Scale all values of the vector by factorV, energies by vectorE. + // AFter this method FillSecondDerivatives(...) should be called. + // This method may be applied for example after retrieving a vector + // from an external file to convert values into Geant4 units. + void ScaleVector(const G4double factorE, const G4double factorV); + + // This method should be called when the vector is fully filled + // There are 3 types of second derivative computations: + // fSplineSimple - 2d derivative continues + // fSplineBase - 3d derivative continues (the default) + // fSplineFixedEdges - 3d derivatives continues, 1st and last + // derivatives are fixed + void FillSecondDerivatives(const G4SplineType = G4SplineType::Base, + const G4double dir1 = 0.0, + const G4double dir2 = 0.0); + + // This method can be applied if both energy and data values + // grow monotonically, for example, if in this vector a + // cumulative probability density function is stored. + G4double GetEnergy(const G4double value) const; + + // To store/retrieve persistent data to/from file streams. + G4bool Store(std::ofstream& fOut, G4bool ascii = false) const; + G4bool Retrieve(std::ifstream& fIn, G4bool ascii = false); + + // Print vector + friend std::ostream& operator<<(std::ostream&, const G4PhysicsVector&); + void DumpValues(G4double unitE = 1.0, G4double unitV = 1.0) const; + +protected: + + // The default implements a free vector initialisation. + virtual void Initialise(); + + void PrintPutValueError(std::size_t index, G4double value, + const G4String& text); + +private: + + void ComputeSecDerivative0(); + void ComputeSecDerivative1(); + void ComputeSecDerivative2(const G4double firstPointDerivative, + const G4double endPointDerivative); + // Internal methods for computing of spline coeffitients + + // Linear or spline interpolation. + inline G4double Interpolation(const std::size_t idx, + const G4double energy) const; + + // Assuming (edgeMin <= energy <= edgeMax). + inline std::size_t GetBin(const G4double energy) const; + +protected: G4double edgeMin = 0.0; // Energy of first point G4double edgeMax = 0.0; // Energy of the last point - G4double invdBin = 0.0; // 1/Bin width - useful only for fixed binning - G4double baseBin = 0.0; // Set this in constructor for performance + G4double invdBin = 0.0; // 1/Bin width for linear and log vectors + G4double logemin = 0.0; // used only for log vector - G4int verboseLevel = 0; + G4int verboseLevel = 0; + G4int idxmax = 0; std::size_t numberOfNodes = 0; - G4PVDataVector dataVector; // Vector to keep the crossection/energyloss - G4PVDataVector binVector; // Vector to keep energy - G4PVDataVector secDerivative; // Vector to keep second derivatives + G4PhysicsVectorType type = T_G4PhysicsFreeVector; + // The type of PhysicsVector (enumerator) - private: - G4bool SplinePossible(); + std::vector binVector; // energy + std::vector dataVector; // crossection/energyloss + std::vector secDerivative; // second derivatives - inline std::size_t FindBinLocation(const G4double theEnergy) const; - // Find low edge index of a bin for given energy. - // Min value 0, max value VectorLength-1 - - inline G4double Interpolation(const std::size_t idx, - const G4double energy) const; +private: G4bool useSpline = false; }; diff --git a/source/global/management/include/G4PhysicsVector.icc b/source/global/management/include/G4PhysicsVector.icc index 84f85f8470..1be9e821fe 100644 --- a/source/global/management/include/G4PhysicsVector.icc +++ b/source/global/management/include/G4PhysicsVector.icc @@ -29,204 +29,228 @@ // - 02 Dec. 1995, G.Cosmo: Structure created based on object model // - 03 Mar. 1996, K.Amako: Implemented the 1st version // -------------------------------------------------------------------- - inline G4double G4PhysicsVector::operator[](const std::size_t index) const { return dataVector[index]; } // --------------------------------------------------------------- - inline G4double G4PhysicsVector::operator()(const std::size_t index) const { return dataVector[index]; } // --------------------------------------------------------------- - inline G4double G4PhysicsVector::Energy(const std::size_t index) const { return binVector[index]; } // --------------------------------------------------------------- - -inline G4double G4PhysicsVector::GetMaxEnergy() const { return edgeMax; } +inline G4double +G4PhysicsVector::GetLowEdgeEnergy(const std::size_t index) const +{ + return binVector[index]; +} // --------------------------------------------------------------- +inline G4double G4PhysicsVector::GetMinEnergy() const +{ + return edgeMin; +} +// --------------------------------------------------------------- +inline G4double G4PhysicsVector::GetMaxEnergy() const +{ + return edgeMax; +} + +// --------------------------------------------------------------- +inline G4double G4PhysicsVector::GetMinValue() const +{ + return (numberOfNodes > 0) ? dataVector[0] : 0.0; +} + +// --------------------------------------------------------------- +inline G4double G4PhysicsVector::GetMaxValue() const +{ + return (numberOfNodes > 0) ? dataVector[numberOfNodes - 1] : 0.0; +} + +// --------------------------------------------------------------- inline std::size_t G4PhysicsVector::GetVectorLength() const { return numberOfNodes; } // --------------------------------------------------------------- - inline void G4PhysicsVector::PutValue(std::size_t index, G4double theValue) { if(index >= numberOfNodes) { - PrintPutValueError(index, theValue, theValue); - } - dataVector[index] = theValue; -} - -// --------------------------------------------------------------- - -inline G4bool G4PhysicsVector::IsFilledVectorExist() const -{ - return (numberOfNodes > 0); -} - -// --------------------------------------------------------------- - -inline G4PhysicsVectorType G4PhysicsVector::GetType() const { return type; } - -// --------------------------------------------------------------- - -inline void G4PhysicsVector::SetSpline(G4bool val) -{ - // Flag useSpline is "true" only if second derivatives are filled - - if(val) - { - if(0 == secDerivative.size() && 0 < dataVector.size()) - { - FillSecondDerivatives(); - } + PrintPutValueError(index, theValue, "PutValue(..) "); } else { - useSpline = false; - secDerivative.clear(); + dataVector[index] = theValue; } } // --------------------------------------------------------------- - -inline G4bool G4PhysicsVector::GetSpline() const { return useSpline; } +inline G4PhysicsVectorType G4PhysicsVector::GetType() const +{ + return type; +} // --------------------------------------------------------------- +inline G4bool G4PhysicsVector::GetSpline() const +{ + return useSpline; +} +// --------------------------------------------------------------- inline void G4PhysicsVector::SetVerboseLevel(G4int value) { verboseLevel = value; } // --------------------------------------------------------------- - -inline std::size_t G4PhysicsVector::FindBinLocation( - const G4double theEnergy) const +inline G4double +G4PhysicsVector::FindLinearEnergy(const G4double rand) const { - std::size_t bin; - if(type == T_G4PhysicsLogVector) - { - bin = size_t(std::max(G4Log(theEnergy) * invdBin - baseBin, 0.0)); - } - else if(type == T_G4PhysicsLinearVector) - { - bin = size_t(std::max(theEnergy * invdBin - baseBin, 0.0)); - } - else - { - // Bin location proposed by K.Genser (FNAL) - bin = std::lower_bound(binVector.begin(), binVector.end(), theEnergy) - - binVector.begin() - 1; - } - return std::min(bin, numberOfNodes - 2); + return GetEnergy(rand*dataVector[numberOfNodes - 1]); } // --------------------------------------------------------------- - -inline std::size_t G4PhysicsVector::FindBin(const G4double e, - const std::size_t idx) const -{ - std::size_t id = idx; - // it is not possible to drop this long if below before - // PAI and diffuse elastic data models will not be improved - if(e < binVector[1]) - { - id = 0; - } - else if(e >= binVector[numberOfNodes - 2]) - { - id = numberOfNodes - 2; - } - else if(idx > numberOfNodes - 2 || e < binVector[idx] || - e > binVector[idx + 1]) - { - id = FindBinLocation(e); - } - return id; -} - -// --------------------------------------------------------------- - -inline std::size_t G4PhysicsVector::ComputeLogVectorBin( - const G4double loge) const -{ - return std::size_t( - std::max(0., std::min(loge * invdBin - baseBin, numberOfNodes - 2.))); -} - -// --------------------------------------------------------------- - -inline G4double G4PhysicsVector::Value(G4double theEnergy) const -{ - std::size_t idx = 0; - return Value(theEnergy, idx); -} - -// --------------------------------------------------------------- - -inline G4double G4PhysicsVector::GetValue(G4double theEnergy, G4bool&) const -{ - std::size_t idx = 0; - return Value(theEnergy, idx); -} - -// --------------------------------------------------------------- - inline G4double G4PhysicsVector::Interpolation(const std::size_t idx, const G4double e) const { // perform the interpolation const G4double x1 = binVector[idx]; const G4double dl = binVector[idx + 1] - x1; + + const G4double y1 = dataVector[idx]; + const G4double dy = dataVector[idx + 1] - y1; + // note: all corner cases of the previous methods are covered and eventually // gives b=0/1 that results in y=y0\y_{N-1} if e<=x[0]/e>=x[N-1] or // y=y_i/y_{i+1} if e=x[i+1] due to small numerical errors - const G4double b = std::max(0., std::min(1., (e - x1) / dl)); - G4double res; + const G4double b = (e - x1) / dl; + + G4double res = y1 + b * dy; + if(useSpline) // spline interpolation { - const G4double os = 0.166666666667; // 1./6. - const G4double a = 1.0 - b; - const G4double c0 = (a * a * a - a) * secDerivative[idx]; - const G4double c1 = (b * b * b - b) * secDerivative[idx + 1]; - res = - a * dataVector[idx] + b * dataVector[idx + 1] + (c0 + c1) * dl * dl * os; + const G4double c0 = (2.0 - b) * secDerivative[idx]; + const G4double c1 = (1.0 + b) * secDerivative[idx + 1]; + res += (b * (b - 1.0)) * (c0 + c1) * (dl * dl * (1.0/6.0)); } - else // linear interpolation + + return res; +} + +// --------------------------------------------------------------- +inline std::size_t G4PhysicsVector::ComputeLogVectorBin( + const G4double loge) const +{ + return std::min(static_cast((loge - logemin) * invdBin), idxmax); +} + +// --------------------------------------------------------------- +inline std::size_t G4PhysicsVector::GetBin(const G4double e) const +{ + std::size_t bin; + switch(type) { - const G4double y1 = dataVector[idx]; - const G4double y2 = dataVector[idx + 1]; - res = y1 + b * (y2 - y1); + case T_G4PhysicsLogVector: + bin = ComputeLogVectorBin(G4Log(e)); + break; + + case T_G4PhysicsLinearVector: + bin = std::min(static_cast((e - edgeMin) * invdBin), idxmax); + break; + + default: + // Bin location proposed by K.Genser (FNAL) + bin = std::lower_bound(binVector.begin(), binVector.end(), e) - + binVector.begin() - 1; + } + return bin; +} + +// --------------------------------------------------------------- +inline G4double +G4PhysicsVector::Value(const G4double e, std::size_t& idx) const +{ + G4double res; + if(idx + 1 < numberOfNodes && + e >= binVector[idx] && e <= binVector[idx+1]) + { + res = Interpolation(idx, e); + } + else if(e > edgeMin && e < edgeMax) + { + idx = GetBin(e); + res = Interpolation(idx, e); + } + else if(e <= edgeMin) + { + res = dataVector[0]; + idx = 0; + } + else + { + res = dataVector[numberOfNodes - 1]; + idx = idxmax; } return res; } // --------------------------------------------------------------- - -inline G4double G4PhysicsVector::LogVectorValue( - const G4double theEnergy, const G4double theLogEnergy) const +inline G4double G4PhysicsVector::Value(G4double e) const { - // handle cases below/above the energy grid (by ek, idx that gives b=0/1) - // ek = x[0] if e<=x[0] and idx will be 0 ^ b=0 => so y=y0 - // ek = x[N-1] if e>=x[N-1] and idx will be N-2 ^ b=1 => so y=y_{N-1} - const G4double ek = - std::max(binVector[0], std::min(binVector[numberOfNodes - 1], theEnergy)); - // compute the lowerindex of the bin (idx \in [0,N-2] will be guaranted) - const std::size_t idx = ComputeLogVectorBin(theLogEnergy); - return Interpolation(idx, ek); + G4double res; + if(e > edgeMin && e < edgeMax) + { + const std::size_t idx = GetBin(e); + res = Interpolation(idx, e); + } + else if(e <= edgeMin) + { + res = dataVector[0]; + } + else + { + res = dataVector[numberOfNodes - 1]; + } + return res; } + +// --------------------------------------------------------------- +inline G4double G4PhysicsVector::GetValue(G4double e, G4bool&) const +{ + return Value(e); +} + +// --------------------------------------------------------------- +inline G4double +G4PhysicsVector::LogVectorValue(const G4double e, const G4double loge) const +{ + G4double res; + if(e > edgeMin && e < edgeMax) + { + const std::size_t idx = ComputeLogVectorBin(loge); + res = Interpolation(idx, e); + } + else if(e <= edgeMin) + { + res = dataVector[0]; + } + else + { + res = dataVector[numberOfNodes - 1]; + } + return res; +} + +// --------------------------------------------------------------- diff --git a/source/global/management/include/G4PhysicsVectorType.hh b/source/global/management/include/G4PhysicsVectorType.hh index 0d819732c3..773e216734 100644 --- a/source/global/management/include/G4PhysicsVectorType.hh +++ b/source/global/management/include/G4PhysicsVectorType.hh @@ -28,25 +28,34 @@ // Description: // // Enumerator to define the physics vector type: -// G4PhysicsVector - base +// G4PhysicsFreeVector // G4PhysicsLinearVector // G4PhysicsLogVector -// G4PhysicsLnVector -// G4PhysicsFreeVector -// G4PhysicsOrderedFreeVector -// G4LPhysicsFreeVector - +// +// Spline type: +// G4SplineType::Simple - 2d derivative continues +// G4SplineType::Base - 3d derivative continues +// G4SplineType::FixedEdges - 3d derivatives continues, 1st and last +// derivatives are fixed +// // Author: H.Kurashige, 9 March 2001 -// -------------------------------------------------------------- +// +// -------------------------------------------------------------------- #ifndef G4PhysicsVectorType_hh #define G4PhysicsVectorType_hh 1 enum G4PhysicsVectorType { - T_G4PhysicsVector = 0, + T_G4PhysicsFreeVector = 0, T_G4PhysicsLinearVector, - T_G4PhysicsLogVector, - T_G4PhysicsFreeVector + T_G4PhysicsLogVector +}; + +enum class G4SplineType +{ + Simple = 0, + Base, + FixedEdges }; #endif diff --git a/source/global/management/include/G4String.hh b/source/global/management/include/G4String.hh index 62da11bb08..bc06955e69 100644 --- a/source/global/management/include/G4String.hh +++ b/source/global/management/include/G4String.hh @@ -27,38 +27,50 @@ // // Class description: // -// Definition of a Geant4 string. -// Derived from the Rogue Wave implementation of RWCString; -// it uses intrinsically STL std::string. - +// Common string type for Geant4 +// +// Provides a `std::string` compliant implementation of basic +// strings. It currently inherits from `std::string`, but this should +// not be assumed other than that it will implement the same interface +// as `std::string` as of the minimum C++ standard required by Geant4 +// (currently C++17). +// +// It can be passed to any function accepting `std::string` or `std::string_view` +// arguments. Whilst it currently implements a conversion operator to `const char*`, +// this should be considered deprecated for use outside of Geant4. Passing to +// non-Geant4 functions taking `const char*` arguments should use the +// `std::string::c_str` member function to explicitly convert. +// +// See `std::string` for primary interfaces, `G4StrUtil` for additional query/manipulation functions +// // Author: G.Cosmo, 11 November 1999 //--------------------------------------------------------------------- + #ifndef G4String_hh #define G4String_hh 1 +#include #include #include #include #include +#include #include "G4Types.hh" -#ifdef WIN32 -# define strcasecmp _stricmp -#endif - -using str_size = std::string::size_type; - class G4String : public std::string { - using std_string = std::string; - public: + /// @brief + /// @deprecated Will be removed in future release enum caseCompare { exact, ignoreCase }; + + /// @brief + /// @deprecated Will be removed in future release enum stripType { leading, @@ -66,78 +78,226 @@ class G4String : public std::string both }; - inline G4String(); - inline G4String(char); - inline G4String(const char*); - inline G4String(const char*, str_size); - inline G4String(const G4String&); + using std::string::string; + using std::string::operator=; + + inline G4String() = default; inline G4String(const std::string&); - inline G4String(G4String&&) = default; - ~G4String() {} - + inline G4String(const G4String&); + inline G4String(std::string&&); + inline G4String(G4String&&); inline G4String& operator=(const G4String&); - inline G4String& operator=(const std::string&); - inline G4String& operator=(const char*); - inline G4String& operator=(G4String&&) = default; - - inline char operator()(str_size) const; - inline char& operator()(str_size); - - inline G4String& operator+=(const char*); - inline G4String& operator+=(const std::string&); - inline G4String& operator+=(const char&); - inline G4bool operator==(const G4String&) const; - inline G4bool operator==(const char*) const; - inline G4bool operator!=(const G4String&) const; - inline G4bool operator!=(const char*) const; + inline G4String& operator=(G4String&&); + /// @brief Implicitly convert to `const char*` + /// @deprecated Will be removed in future releases for `std::string` compliance + /// If passing `G4String` to functions requiring `const char*`, use `std::string::c_str` + /// to explicitly convert. `G4String` also implicitly converts to `std::string_view` + /// to match the `std::string` interface. inline operator const char*() const; - inline G4String operator()(str_size, str_size); - inline G4int compareTo(const char*, caseCompare mode = exact) const; - inline G4int compareTo(const G4String&, caseCompare mode = exact) const; - - inline G4String& prepend(const char*); - inline G4String& append(const G4String&); + /// @brief Deprecated function + /// @deprecated Use `std::string::compare` or `G4StrUtil::icompare` instead + [[deprecated("Use std::string::compare, or G4StrUtil::icompare for case-insensitive comparison")]] + inline G4int compareTo(std::string_view, caseCompare mode = exact) const; + /// @brief Deprecated function + /// @deprecated Use `std::getline` plus `G4StrUtil::lstrip` instead + [[deprecated("Use std::getline instead, plus G4StrUtil::lstrip if required")]] inline std::istream& readLine(std::istream&, G4bool skipWhite = true); + + /// @brief Deprecated function + /// @deprecated Use `std::string::erase` instead + [[deprecated("Use std::string::erase instead")]] + inline G4String& remove(size_type); - inline G4String& replace(unsigned int, unsigned int, const char*, - unsigned int); - inline G4String& replace(str_size, str_size, const char*); - - inline G4String& remove(str_size); - inline G4String& remove(str_size, str_size); - - inline std::size_t first(char) const; - inline std::size_t last(char) const; - + /// @brief Deprecated function + /// @deprecated Use `G4StrUtil::contains` instead + [[deprecated("Use G4StrUtil::contains instead")]] inline G4bool contains(const std::string&) const; + + /// @brief Deprecated function + /// @deprecated Use `G4StrUtil::contains` instead + [[deprecated("Use G4StrUtil::contains instead")]] inline G4bool contains(char) const; - // stripType = 0 beginning - // stripType = 1 end - // stripType = 2 both - // - inline G4String strip(G4int strip_Type = trailing, char c = ' '); + /// @brief Deprecated function + /// @deprecated Use `G4StrUtil` functions instead + [[deprecated("Use G4StrUtil::{lstrip,rstrip,strip}_copy instead")]] + [[nodiscard]] inline G4String strip(stripType strip_Type = trailing, char c = ' '); + /// @brief Deprecated function + /// @deprecated Use `G4StrUtil` functions instead + [[deprecated("Use G4StrUtil::to_lower/to_lower_copy instead")]] inline void toLower(); + + /// @brief Deprecated function + /// @deprecated Use `G4StrUtil` functions instead + [[deprecated("Use G4StrUtil::to_upper/to_upper_copy instead")]] inline void toUpper(); - - inline G4bool isNull() const; - - inline str_size index(const char*, G4int pos = 0) const; - inline str_size index(char, G4int pos = 0) const; - inline str_size index(const G4String&, str_size, str_size, caseCompare) const; - - inline const char* data() const; - - inline G4int strcasecompare(const char*, const char*) const; - - inline unsigned int hash(caseCompare cmp = exact) const; - inline unsigned int stlhash() const; }; +/// @brief Query and manipulation functions for G4String +// +/// Additional free functions that are not part of the `std::string` interface as +/// of the minimum C++ standard supported by Geant4 (currently C++17). +/// +/// @see `G4String` +namespace G4StrUtil +{ + /// @brief Convert string to lowercase + /// @param[in, out] str the string to lowercase + inline void to_lower(G4String& str); + + /// @brief Return lowercased copy of string + /// @param[in] str the string to lowercase + /// @return lowercased copy of `str` + inline G4String to_lower_copy(G4String str); + + /// @brief Convert string to uppercase + /// @param[in, out] str the string to uppercase + inline void to_upper(G4String& str); + + /// @brief Return uppercase copy of string + /// @param[in] str the string to upper case + /// @return uppercased copy of `str` + inline G4String to_upper_copy(G4String str); + + /// @brief Remove leading characters from string + /// @param[in,out] str string to strip + /// @param[in] c character to remove + /// @post `str` has any leading sequence of `c` removed + void lstrip(G4String& str, char c = ' '); + + /// @brief Remove trailing characters from string + /// @param[in,out] str string to strip + /// @param[in] c character to remove + /// @post `str` has any trailing sequence of `c` removed + void rstrip(G4String& str, char c = ' '); + + /// @brief Remove leading and trailing characters from string + /// @param[in,out] str string to strip + /// @param[in] c character to remove + /// @post `str` has any leading and trailing sequence of `c` removed + void strip(G4String& str, char c = ' '); + + /// @brief Return copy of string with leading characters removed + /// @param[in] str string to copy and strip + /// @param[in] c character to remove + /// @return copy of `str` with any leading sequence of `c` removed + G4String lstrip_copy(G4String str, char c = ' '); + + /// @brief Return copy of string with trailing characters removed + /// @param[in] str string to copy and strip + /// @param[in] c character to remove + /// @return copy of `str` with any trailing sequence of `c` removed + G4String rstrip_copy(G4String str, char c = ' '); + + /// @brief Return copy of string with leading and trailing characters removed + /// @param[in] str string to copy and strip + /// @param[in] c character to remove + /// @return copy of `str` with any leading and trailing sequence of `c` removed + G4String strip_copy(G4String str, char c = ' '); + + /// @brief Check if a string contains a given substring + /// @param[in] str string to be checked + /// @param[in] ss substring to check for + /// @retval true if `str` contains `ss` + /// @retval false otherwise + inline G4bool contains(const G4String& str, std::string_view ss); + + /// @overload + inline G4bool contains(const G4String& str, char ss); + + /// @overload + inline G4bool contains(const G4String& str, const char* ss); + + /// @overload + /// @note this overload is required to resolve ambiguity between the + /// signatures taking `std::string_view` and `const char*` substring + /// arguments. G4String currently provides implicit conversion to + /// `const char*`, which makes the calls ambiguous due to `std::string`'s + /// implicit conversion to `std::string_view` + inline G4bool contains(const G4String& str, const G4String& ss); + + /// @brief Case insensitive comparison of two strings + /// + /// Converts both input arguments to lower case and returns the + /// result of `std::string::compare` with these values. + /// + /// @param[in] lhs the first string in the comparison + /// @param[in] rhs the second string in the comparison + /// @return negative(positive) `G4int` if lowercased `lhs` appears + /// before(after) lowercased `rhs` in lexicographical order, zero if both + /// compare equivalent after lowercasing. + inline G4int icompare(std::string_view lhs, std::string_view rhs); + + /// @brief Return true if a string starts with a given prefix + /// @param[in] str string to be checked + /// @param[in] ss prefix to check for + /// @retval true if `str` starts with `ss` + /// @retval false otherwise + inline bool starts_with(const G4String& str, std::string_view ss); + + /// @overload + inline bool starts_with(const G4String& str, G4String::value_type ss); + + /// @overload + inline bool starts_with(const G4String& str, const char* ss); + + /// @overload + /// @note this overload is required to resolve ambiguity between the + /// signatures taking `std::string_view` and `const char*` substring + /// arguments. G4String currently provides implicit conversion to + /// `const char*`, which makes the calls ambiguous due to `std::string`'s + /// implicit conversion to `std::string_view` + inline bool starts_with(const G4String& str, const G4String& ss); + + /// @brief Return true if a string ends with a given suffix + /// @param[in] str string to be checked + /// @param[in] ss suffix to check for + /// @retval true if `str` ends with `ss` + /// @retval false otherwise + inline bool ends_with(const G4String& str, std::string_view ss); + + /// @overload + inline bool ends_with(const G4String& str, G4String::value_type ss); + + /// @overload + inline bool ends_with(const G4String& str, const char* ss); + + /// @overload + inline bool ends_with(const G4String& str, const G4String& ss); + + /// @brief Remove specified in-range characters from string + /// + /// Equivalent to `std::string::erase(index, count)` with erasure only occuring + /// if `index <= size()`. When `index > size()` the string is left unmodified. + /// + /// @deprecated It is strongly recommended to use `std::string::erase` if the + /// start index is already checked, or otherwise known, to be in range. Otherwise, + /// implement the index-size comparison instead of using this function. + /// + /// @param[in,out] str string to erase characters from + /// @param[in] index position to start removal from + /// @param[in] count number of characters to remove + /// @post `str` is unchanged if `index > str.size()`, otherwise `str` has + /// `min(count, str.size() - index)` characters removed starting at `index` + inline void safe_erase(G4String& str, G4String::size_type index = 0, + G4String::size_type count = G4String::npos); + + /// @brief Read characters into a G4String from an input stream until end-of-line + /// + /// @deprecated It is strongly recommended to use `std::getline` instead of this + /// function, plus `G4StrUtil::lstrip` if leading whitespace removal is required. + /// + /// @param[in] is input stream to read from + /// @param[in,out] str string to read into + /// @param[in] skipWhite if true, discard leading whitespace from `is` + /// @return `is` + inline std::istream& readline(std::istream& is, G4String& str, G4bool skipWhite = true); +} // namespace G4StrUtil + #include "G4String.icc" #endif diff --git a/source/global/management/include/G4String.icc b/source/global/management/include/G4String.icc index a82fa9d116..81d93ca2a4 100644 --- a/source/global/management/include/G4String.icc +++ b/source/global/management/include/G4String.icc @@ -28,30 +28,20 @@ // Author: G.Cosmo, 11 November 1999 //--------------------------------------------------------------------- -inline G4String::G4String() {} - -inline G4String::G4String(const char* astring) - : std_string(astring) +inline G4String::G4String(const std::string& str) + : std::string(str) {} -inline G4String::G4String(const char* astring, str_size len) - : std_string(astring, len) -{} - -inline G4String::G4String(char ch) -{ - char str[2]; - str[0] = ch; - str[1] = '\0'; - std_string::operator=(str); -} - inline G4String::G4String(const G4String& str) - : std_string(str) + : std::string(str) {} -inline G4String::G4String(const std::string& str) - : std_string(str) +inline G4String::G4String(std::string&& str) + : std::string(std::move(str)) +{} + +inline G4String::G4String(G4String&& str) + : std::string(std::move(str)) {} inline G4String& G4String::operator=(const G4String& str) @@ -60,306 +50,248 @@ inline G4String& G4String::operator=(const G4String& str) { return *this; } - std_string::operator=(str); + std::string::operator=(str); return *this; } -inline G4String& G4String::operator=(const std::string& str) +inline G4String& G4String::operator=(G4String&& str) { - std_string::operator=(str); + std::string::operator=(std::move(str)); return *this; } -inline G4String& G4String::operator=(const char* str) -{ - std_string::operator=(str); - return *this; -} - -// "cmp" optional parameter is NOT implemented ! -// N.B.: The hash value returned is generally DIFFERENT from the -// one returned by the original RW function. -// Users should not rely on the specific return value. -// -inline char G4String::operator()(str_size i) const { return operator[](i); } - -inline char& G4String::operator()(str_size i) -{ - return std_string::operator[](i); -} - -inline G4String G4String::operator()(str_size start, str_size extent) -{ - return G4String(substr(start, extent)); -} - -inline G4String& G4String::operator+=(const char* str) -{ - std_string::operator+=(str); - return *this; -} - -inline G4String& G4String::operator+=(const std::string& str) -{ - std_string::operator+=(str); - return *this; -} - -inline G4String& G4String::operator+=(const char& ch) -{ - std_string::operator+=(ch); - return *this; -} - -inline G4bool G4String::operator==(const G4String& str) const -{ - if(length() != str.length()) - return false; - return (std_string::compare(str) == 0); -} - -inline G4bool G4String::operator==(const char* str) const -{ - return (std_string::compare(str) == 0); -} - -inline G4bool G4String::operator!=(const G4String& str) const -{ - return !(*this == str); -} - -inline G4bool G4String::operator!=(const char* str) const -{ - return !(*this == str); -} - inline G4String::operator const char*() const { return c_str(); } -inline G4int G4String::strcasecompare(const char* s1, const char* s2) const +inline G4int G4String::compareTo(std::string_view str, caseCompare mode) const { - char* buf1 = new char[strlen(s1) + 1]; - char* buf2 = new char[strlen(s2) + 1]; - - for(str_size i = 0; i <= strlen(s1); ++i) + if(mode == exact) { - buf1[i] = tolower(char(s1[i])); - } - for(str_size j = 0; j <= strlen(s2); ++j) - { - buf2[j] = tolower(char(s2[j])); + return compare(str); } - G4int res = strcmp(buf1, buf2); - delete[] buf1; - delete[] buf2; - return res; -} - -inline G4int G4String::compareTo(const char* str, caseCompare mode) const -{ - return (mode == exact) ? strcmp(c_str(), str) : strcasecompare(c_str(), str); -} - -inline G4int G4String::compareTo(const G4String& str, caseCompare mode) const -{ - return compareTo(str.c_str(), mode); -} - -inline G4String& G4String::prepend(const char* str) -{ - insert(0, str); - return *this; -} - -inline G4String& G4String::append(const G4String& str) -{ - std_string::operator+=(str); - return *this; + return G4StrUtil::icompare(*this, str); } inline std::istream& G4String::readLine(std::istream& strm, G4bool skipWhite) { - char tmp[1024]; - if(skipWhite) - { - strm >> std::ws; - strm.getline(tmp, 1024); - *this = tmp; - } - else - { - strm.getline(tmp, 1024); - *this = tmp; - } - return strm; + return G4StrUtil::readline(strm, *this, skipWhite); } -inline G4String& G4String::replace(unsigned int start, unsigned int nbytes, - const char* buff, unsigned int n2) +inline G4String& G4String::remove(size_type n) { - std_string::replace(start, nbytes, buff, n2); + G4StrUtil::safe_erase(*this, n); return *this; } -inline G4String& G4String::replace(str_size pos, str_size n, const char* str) -{ - std_string::replace(pos, n, str); - return *this; -} - -inline G4String& G4String::remove(str_size n) -{ - if(n < size()) - { - erase(n, size() - n); - } - return *this; -} - -inline G4String& G4String::remove(str_size pos, str_size N) -{ - erase(pos, N + pos); - return *this; -} - -inline std::size_t G4String::first(char ch) const { return find(ch); } - -inline std::size_t G4String::last(char ch) const { return rfind(ch); } - inline G4bool G4String::contains(const std::string& str) const { - return (std_string::find(str) != std_string::npos); + // Use of const char* required to resolve ambiguity with std::string_view + return G4StrUtil::contains(*this, str.c_str()); } inline G4bool G4String::contains(char ch) const { - return (std_string::find(ch) != std_string::npos); + return G4StrUtil::contains(*this, ch); } -inline G4String G4String::strip(G4int strip_Type, char ch) +inline G4String G4String::strip(G4String::stripType strip_Type, char ch) { - G4String retVal = *this; - if(length() == 0) + if(empty()) { - return retVal; + return ""; } - str_size i = 0; + + G4String retVal = *this; + switch(strip_Type) { - case leading: - { - for(i = 0; i < length(); ++i) - { - if(std_string::operator[](i) != ch) - { - break; - } - } - retVal = substr(i, length() - i); - } - break; - case trailing: - { - G4int j = 0; - for(j = G4int(length() - 1); j >= 0; --j) - { - if(std_string::operator[](j) != ch) - { - break; - } - } - retVal = substr(0, j + 1); - } - break; - case both: - { - for(i = 0; i < length(); ++i) - { - if(std_string::operator[](i) != ch) - { - break; - } - } - G4String tmp(substr(i, length() - i)); - G4int k = 0; - for(k = G4int(tmp.length() - 1); k >= 0; --k) - { - if(tmp.std_string::operator[](k) != ch) - { - break; - } - } - retVal = tmp.substr(0, k + 1); - } - break; + case G4String::leading: + G4StrUtil::lstrip(retVal, ch); + break; + case G4String::trailing: + G4StrUtil::rstrip(retVal, ch); + break; + case G4String::both: + G4StrUtil::strip(retVal, ch); + break; default: break; } + return retVal; } -inline void G4String::toLower() +inline void G4String::toLower() { G4StrUtil::to_lower(*this); } + +inline void G4String::toUpper() { G4StrUtil::to_upper(*this); } + +namespace G4StrUtil { - for(str_size i = 0; i < size(); ++i) + inline void to_lower(G4String& str) { - // GB:HP-UX-aCC,Linux-KCC - std_string::operator[](i) = tolower(char(std_string::operator[](i))); - // at(i) = tolower(at(i)); - } -} - -inline void G4String::toUpper() -{ - for(str_size i = 0; i < size(); ++i) - { - // GB:HP-UX-aCC,Linux-KCC - std_string::operator[](i) = toupper(char(std_string::operator[](i))); - // at(i) = toupper(at(i)); - } -} - -inline G4bool G4String::isNull() const { return empty(); } - -// "caseCompare" optional parameter is NOT implemented ! -// -inline str_size G4String::index(const G4String& str, str_size ln, str_size st, - G4String::caseCompare) const -{ - return std_string::find(str.c_str(), st, ln); -} - -inline str_size G4String::index(const char* str, G4int pos) const -{ - return std_string::find(str, pos); -} - -inline str_size G4String::index(char ch, G4int pos) const -{ - return std_string::find(ch, pos); -} - -inline const char* G4String::data() const { return c_str(); } - -inline unsigned int G4String::hash(caseCompare) const -{ - const char* str = c_str(); - unsigned long h = 0; - for(; *str; ++str) - { - h = 5 * h + *str; + std::transform(str.begin(), str.end(), str.begin(), + [](unsigned char c) { return std::tolower(c); }); } - return str_size(h); -} - -inline unsigned int G4String::stlhash() const -{ - const char* str = c_str(); - unsigned long h = 0; - for(; *str; ++str) + inline G4String to_lower_copy(G4String str) { - h = 5 * h + *str; + to_lower(str); + return str; } - return str_size(h); -} + inline void to_upper(G4String& str) + { + std::transform(str.begin(), str.end(), str.begin(), + [](unsigned char c) { return std::toupper(c); }); + } + + inline G4String to_upper_copy(G4String str) + { + to_upper(str); + return str; + } + + inline void lstrip(G4String& s, char c) + { + auto startIndex = s.find_first_not_of(c); + s.erase(0, startIndex); + } + + inline void rstrip(G4String& s, char c) + { + auto endIndex = s.find_last_not_of(c); + if(endIndex == G4String::npos) + { + s = ""; + } + else + { + s.erase(endIndex + 1); + } + } + + inline void strip(G4String& s, char c) + { + if(s.empty()) + { + return; + } + + lstrip(s, c); + rstrip(s, c); + } + + inline G4String lstrip_copy(G4String s, char c) + { + lstrip(s, c); + return s; + } + + inline G4String rstrip_copy(G4String s, char c) + { + rstrip(s, c); + return s; + } + + inline G4String strip_copy(G4String s, char c) + { + strip(s, c); + return s; + } + + inline G4bool contains(const G4String& str, std::string_view ss) + { + return str.find(ss) != G4String::npos; + } + + inline G4bool contains(const G4String& str, char ss) + { + return str.find(ss) != G4String::npos; + } + + inline G4bool contains(const G4String& str, const char* ss) + { + return str.find(ss) != G4String::npos; + } + + inline G4bool contains(const G4String& str, const G4String& ss) + { + return str.find(ss) != G4String::npos; + } + + inline G4int icompare(std::string_view lhs, std::string_view rhs) + { + G4String buf1 = G4StrUtil::to_lower_copy(G4String(lhs.data(), lhs.size())); + G4String buf2 = G4StrUtil::to_lower_copy(G4String(rhs.data(), rhs.size())); + return buf1.compare(buf2); + } + + inline bool starts_with(const G4String& str, std::string_view ss) + { + return str.rfind(ss, 0) == 0; + } + + inline bool starts_with(const G4String& str, G4String::value_type ss) + { + return !str.empty() && (str[0] == ss); + } + + inline bool starts_with(const G4String& str, const char* ss) + { + return str.rfind(ss, 0) == 0; + } + + inline bool starts_with(const G4String& str, const G4String& ss) + { + return str.rfind(ss, 0) == 0; + } + + inline bool ends_with(const G4String& str, std::string_view ss) + { + if(str.length() < ss.length()) + { + return false; + } + return str.compare(str.length() - ss.length(), ss.length(), ss) == 0; + } + + inline bool ends_with(const G4String& str, G4String::value_type ss) + { + return !str.empty() && (str.back() == ss); + } + + inline bool ends_with(const G4String& str, const char* ss) + { + std::string_view sv(ss); + return ends_with(str, sv); + } + + inline bool ends_with(const G4String& str, const G4String& ss) + { + return ends_with(str, ss.c_str()); + } + + inline void safe_erase(G4String& str, G4String::size_type index, + G4String::size_type count) + { + if(index < str.size()) + { + str.erase(index, count); + } + } + + inline std::istream& readline(std::istream& is, G4String& str, + G4bool skipWhite) + { + char tmp[1024]; + if(skipWhite) + { + is >> std::ws; + } + + is.getline(tmp, 1024); + str = tmp; + + return is; + } +} // namespace G4StrUtil \ No newline at end of file diff --git a/source/global/management/include/G4Tokenizer.hh b/source/global/management/include/G4Tokenizer.hh index 4529cc4432..2eebf65a70 100644 --- a/source/global/management/include/G4Tokenizer.hh +++ b/source/global/management/include/G4Tokenizer.hh @@ -82,13 +82,13 @@ class G4Tokenizer { tmp = actual; actual = j + 1; - return string2tokenize(tmp, j - tmp); + return string2tokenize.substr(tmp, j - tmp); } else { tmp = actual; actual = j; - return string2tokenize(tmp, j - tmp); + return string2tokenize.substr(tmp, j - tmp); } } diff --git a/source/global/management/include/G4Version.hh b/source/global/management/include/G4Version.hh index c865cd53d2..570a967d61 100644 --- a/source/global/management/include/G4Version.hh +++ b/source/global/management/include/G4Version.hh @@ -44,7 +44,7 @@ #endif #ifndef G4VERSION_TAG - #define G4VERSION_TAG "$Name: geant4-11-00-beta-01 $" + #define G4VERSION_TAG "$Name: geant4-11-00 $" #endif // as variables @@ -53,10 +53,10 @@ #include "G4Types.hh" #ifdef G4MULTITHREADED -static const G4String G4Version = "$Name: geant4-11-00-beta-01 [MT]$"; +static const G4String G4Version = "$Name: geant4-11-00 [MT]$"; #else -static const G4String G4Version = "$Name: geant4-11-00-beta-01 $"; +static const G4String G4Version = "$Name: geant4-11-00 $"; #endif -static const G4String G4Date = "(25-June-2021)"; +static const G4String G4Date = "(10-December-2021)"; #endif diff --git a/source/global/management/sources.cmake b/source/global/management/sources.cmake index 460a139901..f688ed5b23 100644 --- a/source/global/management/sources.cmake +++ b/source/global/management/sources.cmake @@ -60,6 +60,7 @@ geant4_add_module(G4globman G4PhysicsLinearVector.hh G4PhysicsLogVector.hh G4PhysicsModelCatalog.hh + G4PhysicsOrderedFreeVector.hh G4PhysicsTable.hh G4PhysicsTable.icc G4PhysicsVector.hh diff --git a/source/global/management/src/G4FilecoutDestination.cc b/source/global/management/src/G4FilecoutDestination.cc index 40ae791424..99e53f6e83 100644 --- a/source/global/management/src/G4FilecoutDestination.cc +++ b/source/global/management/src/G4FilecoutDestination.cc @@ -43,7 +43,7 @@ G4FilecoutDestination::~G4FilecoutDestination() // -------------------------------------------------------------------- void G4FilecoutDestination::Open(std::ios_base::openmode mode) { - if(m_name.isNull()) + if(m_name.empty()) { #ifndef __MIC // Cannot use G4Exception, because G4cout/G4cerr is not setup diff --git a/source/global/management/src/G4PhysicsFreeVector.cc b/source/global/management/src/G4PhysicsFreeVector.cc index 5e97c99fd9..e928bd2f80 100644 --- a/source/global/management/src/G4PhysicsFreeVector.cc +++ b/source/global/management/src/G4PhysicsFreeVector.cc @@ -30,37 +30,39 @@ // - 06 Jun. 1996, K.Amako: Implemented the 1st version // Revisions: // - 11 Nov. 2000, H.Kurashige: Use STL vector for dataVector and binVector +// - 25 Aug. 2021, V.Ivanchenko updated for Geant4 11.0 // -------------------------------------------------------------------- #include "G4PhysicsFreeVector.hh" +// -------------------------------------------------------------------- +G4PhysicsFreeVector::G4PhysicsFreeVector(G4bool spline) + : G4PhysicsVector(spline) +{} + +// -------------------------------------------------------------------- +G4PhysicsFreeVector::G4PhysicsFreeVector(G4int length) + : G4PhysicsFreeVector((std::size_t)length, false) +{} + // -------------------------------------------------------------------- G4PhysicsFreeVector::G4PhysicsFreeVector(std::size_t length, G4bool spline) : G4PhysicsVector(spline) { - type = T_G4PhysicsFreeVector; numberOfNodes = length; if(0 < length) { - dataVector.reserve(numberOfNodes); - binVector.reserve(numberOfNodes); - - for(std::size_t i = 0; i < numberOfNodes; ++i) - { - binVector.push_back(0.0); - dataVector.push_back(0.0); - } + binVector.resize(numberOfNodes, 0.0); + dataVector.resize(numberOfNodes, 0.0); } + Initialise(); } // -------------------------------------------------------------------- -G4PhysicsFreeVector::G4PhysicsFreeVector(std::size_t length, G4double emin, - G4double emax, G4bool spline) +G4PhysicsFreeVector::G4PhysicsFreeVector(std::size_t length, G4double, + G4double, G4bool spline) : G4PhysicsFreeVector(length, spline) -{ - edgeMin = emin; - edgeMax = emax; -} +{} // -------------------------------------------------------------------- G4PhysicsFreeVector::G4PhysicsFreeVector(const std::vector& energies, @@ -68,7 +70,6 @@ G4PhysicsFreeVector::G4PhysicsFreeVector(const std::vector& energies, G4bool spline) : G4PhysicsVector(spline) { - type = T_G4PhysicsFreeVector; numberOfNodes = energies.size(); if(numberOfNodes != values.size()) @@ -78,19 +79,9 @@ G4PhysicsFreeVector::G4PhysicsFreeVector(const std::vector& energies, G4Exception("G4PhysicsFreeVector constructor: ","glob04", FatalException, ed); } - if(0 < numberOfNodes) - { - binVector.reserve(numberOfNodes); - dataVector.reserve(numberOfNodes); - - for(std::size_t i = 0; i < numberOfNodes; ++i) - { - binVector.push_back(energies[i]); - dataVector.push_back(values[i]); - } - edgeMin = binVector[0]; - edgeMax = binVector[numberOfNodes - 1]; - } + binVector = energies; + dataVector = values; + Initialise(); } // -------------------------------------------------------------------- @@ -100,41 +91,37 @@ G4PhysicsFreeVector::G4PhysicsFreeVector(const G4double* energies, G4bool spline) : G4PhysicsVector(spline) { - type = T_G4PhysicsFreeVector; numberOfNodes = length; if(0 < numberOfNodes) { - binVector.reserve(numberOfNodes); - dataVector.reserve(numberOfNodes); + binVector.resize(numberOfNodes); + dataVector.resize(numberOfNodes); for(std::size_t i = 0; i < numberOfNodes; ++i) { - binVector.push_back(energies[i]); - dataVector.push_back(values[i]); + binVector[i] = energies[i]; + dataVector[i] = values[i]; } - edgeMin = binVector[0]; - edgeMax = binVector[numberOfNodes - 1]; } + Initialise(); } // -------------------------------------------------------------------- -G4PhysicsFreeVector::~G4PhysicsFreeVector() -{} - -// -------------------------------------------------------------------- -void G4PhysicsFreeVector::PutValues(std::size_t index, G4double e, - G4double value) +void G4PhysicsFreeVector::PutValues(const std::size_t index, + const G4double e, + const G4double value) { if(index >= numberOfNodes) { - PrintPutValueError(index, binVector[numberOfNodes - 1], e); + PrintPutValueError(index, value, "G4PhysicsFreeVector::PutValues "); + return; } binVector[index] = e; dataVector[index] = value; if(index == 0) { - edgeMin = edgeMax = e; + edgeMin = e; } else if(numberOfNodes == index + 1) { @@ -143,61 +130,18 @@ void G4PhysicsFreeVector::PutValues(std::size_t index, G4double e, } // -------------------------------------------------------------------- -void G4PhysicsFreeVector::InsertValues(G4double energy, G4double value) +void G4PhysicsFreeVector::InsertValues(const G4double energy, + const G4double value) { auto binLoc = std::lower_bound(binVector.cbegin(), binVector.cend(), energy); - - std::size_t binIdx = binLoc - binVector.cbegin(); // Iterator difference! - - auto dataLoc = dataVector.cbegin() + binIdx; + auto dataLoc = dataVector.cbegin(); + dataLoc += binLoc - binVector.cbegin(); binVector.insert(binLoc, energy); dataVector.insert(dataLoc, value); ++numberOfNodes; - edgeMin = binVector.front(); - edgeMax = binVector.back(); + Initialise(); } // -------------------------------------------------------------------- -G4double G4PhysicsFreeVector::GetEnergy(G4double aValue) -{ - G4double e; - if(aValue <= GetMinValue()) - { - e = edgeMin; - } - else if(aValue >= GetMaxValue()) - { - e = edgeMax; - } - else - { - std::size_t closestBin = FindValueBinLocation(aValue); - e = LinearInterpolationOfEnergy(aValue, closestBin); - } - return e; -} - -// -------------------------------------------------------------------- -std::size_t G4PhysicsFreeVector::FindValueBinLocation(G4double aValue) -{ - std::size_t bin = - std::lower_bound(dataVector.cbegin(), dataVector.cend(), aValue) - - dataVector.cbegin() - 1; - bin = std::min(bin, numberOfNodes - 2); - return bin; -} - -// -------------------------------------------------------------------- -G4double G4PhysicsFreeVector::LinearInterpolationOfEnergy(G4double aValue, - std::size_t bin) -{ - G4double res = binVector[bin]; - G4double del = dataVector[bin + 1] - dataVector[bin]; - if(del > 0.0) - { - res += (aValue - dataVector[bin]) * (binVector[bin + 1] - res) / del; - } - return res; -} diff --git a/source/global/management/src/G4PhysicsLinearVector.cc b/source/global/management/src/G4PhysicsLinearVector.cc index 4e468d175f..9c8523e3e6 100644 --- a/source/global/management/src/G4PhysicsLinearVector.cc +++ b/source/global/management/src/G4PhysicsLinearVector.cc @@ -42,18 +42,18 @@ G4PhysicsLinearVector::G4PhysicsLinearVector(G4bool spline) } // -------------------------------------------------------------------- -G4PhysicsLinearVector::G4PhysicsLinearVector(G4double theEmin, G4double theEmax, - std::size_t theNbin, G4bool spline) +G4PhysicsLinearVector::G4PhysicsLinearVector(G4double Emin, G4double Emax, + std::size_t Nbin, G4bool spline) : G4PhysicsVector(spline) { - numberOfNodes = theNbin + 1; - if(theNbin < 1 || theEmin == theEmax) + numberOfNodes = Nbin + 1; + if(Nbin < 1 || Emin >= Emax) { G4ExceptionDescription ed; - ed << "G4PhysicsLinearVector with wrong parameters: theNbin= " << theNbin - << " theEmin= " << theEmin << " theEmax= " << theEmax; + ed << "G4PhysicsLinearVector with wrong parameters: theNbin= " << Nbin + << " Emin= " << Emin << " Emax= " << Emax; G4Exception("G4PhysicsLinearVector::G4PhysicsLinearVector()", "glob03", - FatalException, ed, "theNbins should be > 1"); + FatalException, ed, "theNbins should be > 0 and Emax > Emin"); } if(numberOfNodes < 2) { @@ -61,46 +61,25 @@ G4PhysicsLinearVector::G4PhysicsLinearVector(G4double theEmin, G4double theEmax, } type = T_G4PhysicsLinearVector; - invdBin = 1. / ((theEmax - theEmin) / (G4double) (numberOfNodes - 1)); - baseBin = theEmin * invdBin; + binVector.resize(numberOfNodes); + dataVector.resize(numberOfNodes, 0.0); + binVector[0] = Emin; + binVector[numberOfNodes - 1] = Emax; + Initialise(); - dataVector.reserve(numberOfNodes); - binVector.reserve(numberOfNodes); - - binVector.push_back(theEmin); - dataVector.push_back(0.0); - - for(std::size_t i = 1; i < numberOfNodes - 1; ++i) + for(G4int i = 1; i <= idxmax; ++i) { - binVector.push_back(theEmin + i / invdBin); - dataVector.push_back(0.0); + binVector[i] = edgeMin + i / invdBin; } - binVector.push_back(theEmax); - dataVector.push_back(0.0); +} +// -------------------------------------------------------------------- +void G4PhysicsLinearVector::Initialise() +{ + idxmax = numberOfNodes - 2; edgeMin = binVector[0]; edgeMax = binVector[numberOfNodes - 1]; + invdBin = (idxmax + 1) / (edgeMax - edgeMin); } // -------------------------------------------------------------------- -G4PhysicsLinearVector::~G4PhysicsLinearVector() {} - -// -------------------------------------------------------------------- -G4bool G4PhysicsLinearVector::Retrieve(std::ifstream& fIn, G4bool ascii) -{ - G4bool success = G4PhysicsVector::Retrieve(fIn, ascii); - if(success) - { - invdBin = 1. / (binVector[1] - edgeMin); - baseBin = edgeMin * invdBin; - } - return success; -} - -// -------------------------------------------------------------------- -void G4PhysicsLinearVector::ScaleVector(G4double factorE, G4double factorV) -{ - G4PhysicsVector::ScaleVector(factorE, factorV); - invdBin = 1. / (binVector[1] - edgeMin); - baseBin = edgeMin * invdBin; -} diff --git a/source/global/management/src/G4PhysicsLogVector.cc b/source/global/management/src/G4PhysicsLogVector.cc index 80b5bfa339..e9f65d2732 100644 --- a/source/global/management/src/G4PhysicsLogVector.cc +++ b/source/global/management/src/G4PhysicsLogVector.cc @@ -30,11 +30,11 @@ // - 03 Mar. 1996, K.Amako: Implemented the 1st version // Revisions: // - 11 Nov. 2000, H.Kurashige : Use STL vector for dataVector and binVector -// - 19 Jun. 2009, V.Ivanchenko : removed hidden bin // -------------------------------------------------------------------- #include "G4PhysicsLogVector.hh" #include "G4Exp.hh" +#include "G4Log.hh" // -------------------------------------------------------------------- G4PhysicsLogVector::G4PhysicsLogVector(G4bool spline) @@ -44,18 +44,18 @@ G4PhysicsLogVector::G4PhysicsLogVector(G4bool spline) } // -------------------------------------------------------------------- -G4PhysicsLogVector::G4PhysicsLogVector(G4double theEmin, G4double theEmax, - std::size_t theNbin, G4bool spline) +G4PhysicsLogVector::G4PhysicsLogVector(G4double Emin, G4double Emax, + std::size_t Nbin, G4bool spline) : G4PhysicsVector(spline) { - numberOfNodes = theNbin + 1; - if(theNbin < 2 || theEmin == theEmax) + numberOfNodes = Nbin + 1; + if(Nbin < 2 || Emin >= Emax || Emin <= 0.0) { G4ExceptionDescription ed; - ed << "G4PhysicsLogVector with wrong parameters: theNbin= " << theNbin - << " theEmin= " << theEmin << " theEmax= " << theEmax; + ed << "G4PhysicsLogVector with wrong parameters: theNbin= " << Nbin + << " Emin= " << Emin << " Emax= " << Emax; G4Exception("G4PhysicsLogVector::G4PhysicsLogVector()", "glob03", - FatalException, ed, "theNbins should be > 2"); + FatalException, ed, "Nbins should be > 1 and Emax > Emin > 0"); } if(numberOfNodes < 3) { @@ -63,46 +63,26 @@ G4PhysicsLogVector::G4PhysicsLogVector(G4double theEmin, G4double theEmax, } type = T_G4PhysicsLogVector; - invdBin = 1. / (G4Log(theEmax / theEmin) / (G4double) (numberOfNodes - 1)); - baseBin = G4Log(theEmin) * invdBin; + binVector.resize(numberOfNodes); + dataVector.resize(numberOfNodes, 0.0); + binVector[0] = Emin; + binVector[numberOfNodes - 1] = Emax; + Initialise(); - dataVector.reserve(numberOfNodes); - binVector.reserve(numberOfNodes); - - binVector.push_back(theEmin); - dataVector.push_back(0.0); - - for(std::size_t i = 1; i < numberOfNodes - 1; ++i) + for(G4int i = 1; i <= idxmax; ++i) { - binVector.push_back(G4Exp((baseBin + i) / invdBin)); - dataVector.push_back(0.0); + binVector[i] = edgeMin*G4Exp(i / invdBin); } - binVector.push_back(theEmax); - dataVector.push_back(0.0); +} +// -------------------------------------------------------------------- +void G4PhysicsLogVector::Initialise() +{ + idxmax = numberOfNodes - 2; edgeMin = binVector[0]; edgeMax = binVector[numberOfNodes - 1]; + invdBin = (idxmax + 1) / G4Log(edgeMax/edgeMin); + logemin = G4Log(edgeMin); } // -------------------------------------------------------------------- -G4PhysicsLogVector::~G4PhysicsLogVector() {} - -// -------------------------------------------------------------------- -G4bool G4PhysicsLogVector::Retrieve(std::ifstream& fIn, G4bool ascii) -{ - G4bool success = G4PhysicsVector::Retrieve(fIn, ascii); - if(success) - { - invdBin = 1. / G4Log(binVector[1] / edgeMin); - baseBin = G4Log(edgeMin) * invdBin; - } - return success; -} - -// -------------------------------------------------------------------- -void G4PhysicsLogVector::ScaleVector(G4double factorE, G4double factorV) -{ - G4PhysicsVector::ScaleVector(factorE, factorV); - invdBin = 1. / G4Log(binVector[1] / edgeMin); - baseBin = G4Log(edgeMin) * invdBin; -} diff --git a/source/global/management/src/G4PhysicsModelCatalog.cc b/source/global/management/src/G4PhysicsModelCatalog.cc index 8ca9b769c3..53d595bce3 100644 --- a/source/global/management/src/G4PhysicsModelCatalog.cc +++ b/source/global/management/src/G4PhysicsModelCatalog.cc @@ -26,67 +26,710 @@ // G4PhysicsModelCatalog class implementation // // Author: M.Asai (SLAC), 26 September 2013 -// -------------------------------------------------------------------- +// +// Revised in August 2021 by A.Ribon (CERN). +// -------------------------------------------------------------------------- #include "G4PhysicsModelCatalog.hh" - #include "G4Threading.hh" -std::vector* G4PhysicsModelCatalog::theCatalog = nullptr; +G4bool G4PhysicsModelCatalog::isInitialized = false; +std::vector< G4int >* G4PhysicsModelCatalog::theVectorOfModelIDs = nullptr; +std::vector< G4String >* G4PhysicsModelCatalog::theVectorOfModelNames = nullptr; -// -------------------------------------------------------------------- -G4PhysicsModelCatalog::G4PhysicsModelCatalog() -{ - if(theCatalog == nullptr) - { - static std::vector catal; - theCatalog = &catal; +// -------------------------------------------------------------------------- +G4PhysicsModelCatalog::G4PhysicsModelCatalog() {} + +// -------------------------------------------------------------------------- +void G4PhysicsModelCatalog::Initialize() { + if ( isInitialized ) return; + if ( theVectorOfModelIDs == nullptr && theVectorOfModelNames == nullptr ) { + static std::vector< G4int > aVectorOfInts; + theVectorOfModelIDs = &aVectorOfInts; + static std::vector< G4String > aVectorOfStrings; + theVectorOfModelNames = &aVectorOfStrings; + + // NOTE: + // The goal is that, starting from Geant4 version 11.0, all the three + // identifiers (modelID, index, name) remain the same regardless of the + // physics list, application, and version of Geant4. + // Therefore, after Geant4 11.0, you can only add an entry - e.g. when + // a new model is added, or when a pre-existing model not yet present + // in this catalogue is included - at the bottom of this method + // (rather than inserting it in the middle), and do NOT delete anything. + // + // For the modelID values, these are the considerations and choices made: + // - Values below 1000 are excluded because reserved to process and + // sub-process ID values. + // - Whenever resonable, modelID values should have free spaces between + // them, to allow for eventual, future variants - e.g. different + // tunings of the same model - to keep modelID values close to the + // original model. + // - modelID values are between 10'000 and 39'999, with the following + // subdivision in 3 categories (identified by the most significant + // digit): + // * Values between 10'000 and 19'999 are for EM models + // * Values between 20'000 and 29'999 are for HAD models + // * Values between 30'000 and 39'999 are for all the other models + // (i.e. included neither in EM models nor in HAD models). + // Note that larger values of modelID are neither more difficult to + // handle nor less computing performant with respect to smaller values + // (we remind that, for plotting, the index of the model, rather than + // its modelID, should be conveniently used, whereas for all the rest + // the modelID is recommended). + + // ======================================================================= + // ================= 1st EM MODELS : from 10'000 to 19'999 =============== + // ======================================================================= + + InsertModel( 10000, "model_EM" ); + + // e- production + InsertModel( 10010, "model_DeltaElectron" ); + InsertModel( 10011, "model_DeltaEBelowCut" ); + InsertModel( 10012, "model_PhotoElectron" ); + InsertModel( 10013, "model_ComptonElectron" ); + InsertModel( 10014, "model_TripletElectron" ); + + // gamma production + InsertModel( 10020, "model_Bremsstruhlung" ); + InsertModel( 10021, "model_SplitBremssrahlung" ); + InsertModel( 10022, "model_ComptonGamma" ); + InsertModel( 10023, "model_Annihilation" ); + InsertModel( 10024, "model_TripletGamma" ); + InsertModel( 10025, "model_GammaGammaEntanglement" ); + + // e+e- pair production + InsertModel( 10030, "model_EplusEminisPair" ); + + // atomic de-excitation + InsertModel( 10040, "model_Fluorescence" ); + InsertModel( 10041, "model_gammaPIXE" ); + InsertModel( 10050, "model_AugerElectron" ); + InsertModel( 10051, "model_ePIXE" ); + + // recoil ions + InsertModel( 10060, "model_IonRecoil" ); + + // DNA models + InsertModel( 11000, "model_DNA" ); + InsertModel( 11001, "model_Ritchie1994eSolvation" ); + InsertModel( 11002, "model_Terrisol1990eSolvation" ); + InsertModel( 11003, "model_Meesungnoen2002eSolvation" ); + InsertModel( 11004, "model_Kreipl2009eSolvation" ); + InsertModel( 11005, "model_MeesungnoenSolid2002eSolvation" ); + + // ======================================================================= + // ============= 2nd HADRONIC MODELS : from 20'000 to 29'999 ============= + // ======================================================================= + + // ---------------------------------------------------------- + // --- Gamma- , Lepto- , Neutrino-nuclear : 20'000-20'999 --- + // ---------------------------------------------------------- + // - 20'000 - 20'099 : Electromagnetic dissociation models + // - 20'100 - 20'199 : Gamma-nuclear models + // - 20'200 - 20-299 : Electron/positron-nuclear models + // - 20'300 - 20'399 : Muon-nuclear models + // - 20'400 - 20'499 : Tau-nuclear models + // - 20'500 - 20'999 : Neutrino models... + // ... + + // --- EM dissociation models: 20'000 - 20'099 --- + + // Class G4EMDissociation + InsertModel( 20000, "model_projectileEMDissociation" ); + InsertModel( 20001, "model_targetEMDissociation" ); + + // --- Gamma-nuclear models: 20'100 - 20'199 --- + + // Class G4LENDorBERTModel + InsertModel( 20100, "model_LENDorBERTModel" ); + + // Class G4LowEGammaNuclearModel + InsertModel( 20150, "model_GammaNPreco" ); + + // --- Charged-lepton - nuclear models: 20'200 - 20'499 --- + + // Class G4ElectroVDNuclearModel + InsertModel( 20200, "model_G4ElectroVDNuclearModel" ); + + // Class G4MuonVDNuclearModel + InsertModel( 20300, "model_G4MuonVDNuclearModel" ); + + // --- Neutrino models: 20'500 - 20'999 --- + + // Class G4NeutrinoElectronCcModel + InsertModel( 20510, "model_nu-e-inelastic" ); + + // Class G4NeutrinoNucleusModel + InsertModel( 20520, "model_neutrino-nucleus" ); + + // The following classes derives from G4NeutrinoNucleusModel + // Class G4ANuElNucleusCcModel + InsertModel( 20530, "model_ANuElNuclCcModel" ); + // Class G4ANuElNucleusNcModel + InsertModel( 20540, "model_ANuElNuclNcModel" ); + // Class G4ANuMuNucleusCcModel + InsertModel( 20550, "model_ANuMuNuclCcModel" ); + // Class G4ANuMuNucleusNcModel + InsertModel( 20560, "model_ANuMuNuclNcModel" ); + // Class G4NuElNucleusCcModel + InsertModel( 20570, "model_NuElNuclCcModel" ); + // Class G4NuElNucleusNcModel + InsertModel( 20580, "model_NuElNuclNcModel" ); + // Class G4NuMuNucleusCcModel + InsertModel( 20590, "model_NuMuNuclCcModel" ); + // Class G4NuMuNucleusNcModel + InsertModel( 20600, "model_NuMuNuclNcModel" ); + + // ------------------------------------------------------------------------------------------ + // --- Elastic, Charge-Exchange, Quasi-Elastic, specialized Diffraction : 21'000 - 21'999 --- + // ------------------------------------------------------------------------------------------ + // - 21'000 - 21'199 : Elastic + // - 21'200 - 21'299 : Charge-Exchange + // - 21'300 - 21'499 : Quasi-Elastic + // - 21'500 - 21'999 : specialized Diffraction generators + // ----------------------------------------------------------- + + // --- Elastic models: 21'000 - 21'199 --- + + // Class G4HadronElastic + InsertModel( 21000, "model_hElasticLHEP" ); + // Class G4AntiNuclElastic + InsertModel( 21010, "model_AntiAElastic" ); + // Class G4ChipsElasticModel + InsertModel( 21020, "model_hElasticCHIPS" ); + // Class G4DiffuseElastic + InsertModel( 21030, "model_DiffuseElastic" ); + // Class G4DiffuseElasticV2 + InsertModel( 21040, "model_DiffuseElasticV2" ); + // Class G4NuclNuclDiffuseElastic + InsertModel( 21050, "model_NNDiffuseElastic" ); + // Class G4ElasticHadrNucleusHE + InsertModel( 21060, "model_hElasticGlauber" ); + // Class G4hhElastic + InsertModel( 21070, "model_HadrHadrElastic" ); + // Class G4LowEHadronElastic + InsertModel( 21080, "model_hLowEElastic" ); + // Class G4LEHadronProtonElastic + InsertModel( 21090, "model_G4LEHadronProtonElastic" ); + // Class G4LEnp + InsertModel( 21100, "model_G4LEnp" ); + // Class G4LEpp + InsertModel( 21110, "model_G4LEpp" ); + // Class G4NeutronElectronElModel + InsertModel( 21120, "model_n-e-elastic" ); + // Class G4NeutrinoElectronNcModel + InsertModel( 21130, "model_nu-e-elastic" ); + + // --- Charge exchange : 21'200 - 21'299 --- + + // Class: G4ChargeExchange + InsertModel( 21200, "model_ChargeExchange" ); + + // --- Quasi-Elastic : 21'300 - 21'499 --- + + // Class: G4QuasiElasticChannel (which uses Chips's model G4QuasiElRatios) + InsertModel( 21300, "model_QuasiElastic" ); + + // --- Special diffraction generators : 21'500 - 21'999 --- + + // Class: G4LMsdGenerator + InsertModel( 21500, "model_LMsdGenerator" ); + + // ----------------------------------------------------------------- + // --- High energy-models (e.g. string models) : 22'000 - 22'999 --- + // ----------------------------------------------------------------- + // - 22'000 - 22'099 : G4TheoFSGenerator + // - 22'100 - 22'199 : FTF + // - 22'200 - 22'299 : QGS + // - ... + // For gamma - nuclear : QGS string formation + QGS string fragmentation + Precompound + // For e-/e+/mu-/mu+ - nuclear : FTF string formation + Lund string fragmentation + Precompound + InsertModel( 22000, "model_TheoFSGenerator" ); + // FTF string formation + Lund string fragmentation + Precompound + InsertModel( 22100, "model_FTFP" ); + // FTF string formation + Lund string fragmentation + Binary Cascade + InsertModel( 22150, "model_FTFB" ); + // FTF string formation + QGS string fragmentation + Precompound + InsertModel( 22175, "model_FTFQGSP" ); + // QGS string formation + QGS string fragmentation + Precompound + InsertModel( 22200, "model_QGSP" ); + // QGS string formation + QGS string fragmentation + Binary Cascade + InsertModel( 22250, "model_QGSB" ); + + // ---------------------------------------------------- + // --- Intermediate energy models : 23'000 - 23'999 --- + // ---------------------------------------------------- + // - 23'000 - 23'099 : BERT + // - 23'100 - 23'199 : BIC + // - 23'200 - 23'299 : INCL + // - 23'300 - 23'399 : QMD + // ... + // Class: G4CascadeInterface + InsertModel( 23000, "model_BertiniCascade" ); + + // The names are similar, but not identical, to those before Geant4 11. + // Class: G4BinaryCascade + InsertModel( 23100, "model_G4BinaryCascade" ); + // Class: G4BinaryLightIonReaction + InsertModel( 23110, "model_G4BinaryLightIonReaction" ); + + // Class: G4INCLXXInterface + InsertModel( 23200, "model_INCLXXCascade" ); + + // Class: G4QMDReaction + InsertModel( 23300, "model_QMDModel" ); + + // -------------------------------------------------------------- + // --- Pre-equilibrium/De-excitation models : 24'000 - 24'999 --- + // -------------------------------------------------------------- + // - Pre-equilibrium : 24'000 - 24'099 + // * 24'000 - 24'049 : precompound + // * 24'050 - 24'099 : internal BERT pre-equilibrium + // - de-excitation : 24'100 - 24'999 + // * 24'100 - 24'149 : Evaporation + // * 24'150 - 24'199 : Photon evaporation + // * 24'200 - 24'299 : GEM evaporation + // * 24'300 - 24'349 : Fermi BreakUp + // * 24'350 - 24'399 : Multifragmentation + // * 24'400 - 24'449 : Ablation + // * 24'450 - 24'499 : Fission + // * 24'500 - 24'599 : ABLA + // * 24'600 - 24'699 : internal BERT de-excitation + // ... + + // --- Pre-equilibrium: 24'000 - 24'099 --- + + // Class: G4PreCompoundModel + InsertModel( 24000, "model_PRECO" ); + + // Class: G4LowEIonFragmentation + InsertModel( 24010, "model_LowEIonPreco" ); + + // Class: G4NonEquilibriumEvaporator (i.e. BERT pre-equilibrium) + InsertModel( 24050, "model_G4NonEquilibriumEvaporator" ); + + // --- De-excitation: 24'100 - 24'999 --- + + // --- Evaporation: 24'100- 24'149 --- + + // Class: G4EvaporationChannel + InsertModel( 24100, "model_G4EvaporationChannel" ); + + // Classes that use it: G4NeutronRadCapture and G4ExcitationHandler + InsertModel( 24110, "model_e-InternalConversion" ); + + // Class: G4UnstableFragmentBreakUp + InsertModel( 24120, "model_G4UnstableFragmentBreakUp" ); + + // --- Photon-Evaporation: 24'150 - 24'199 --- + + // Class: G4PhotonEvaporation + InsertModel( 24150, "model_G4PhotonEvaporation" ); + + // Class: G4NeutronRadCapture + InsertModel( 24160, "model_nRadCapture" ); + + // --- GEM evaporation : 24'200 - 24'299 --- + + // Class: G4GEMChannel + InsertModel( 24200, "model_G4GEMChannel" ); + + // Class: G4GEMChannelVI + InsertModel( 24210, "model_G4GEMChannelVI" ); + + // --- Fermi BreakUp : 24'300 - 24'349 --- + + // Class: G4FermiBreakUpVI + InsertModel( 24300, "model_G4FermiBreakUpVI" ); + + // --- Multifragmentation : 24'350 - 24'399 --- + + // Class: G4StatMF + InsertModel( 24350, "model_G4StatMF" ); + + // --- Ablation : 24'400 - 24'449 --- + + // Class: G4WilsonAblationModel + InsertModel( 24400, "model_G4WilsonAblationModel" ); + + // --- Fission : 24'450 - 24'499 --- + + // Class: G4CompetitiveFission + InsertModel( 24450, "model_G4CompetitiveFission" ); + + // --- ABLA : 24'500 - 24'599 --- + + // Class: G4AblaInterface + InsertModel( 24500, "model_ABLA" ); + + // --- internal BERT de-excitation : 24'600 - 24'699 --- + + // Class: G4EquilibriumEvaporator + InsertModel( 24600, "model_G4EquilibriumEvaporator" ); + + // --- Other types of de-excitation : 24'700 - 24'999 --- + + // ... + + // ------------------------------------------------ + // --- Low-energy data-driven : 25'000 - 25'999 --- + // ------------------------------------------------ + // - 25'000 - 25'199 : ParticleHP + // - 25'200 - 25'200 : LEND + // ... + // - 25'500 - 25'999 : RadioactiveDecay + + // --- ParticleHP : 25'000 - 25'199 --- + + // Classes: G4ParticleHPCapture , G4ParticleHPCaptureFS + InsertModel( 25000, "model_NeutronHPCapture" ); + + // Classes: G4ParticleHPElastic , G4ParticleHPElasticFS + InsertModel( 25010, "model_NeutronHPElastic" ); + + // Classes: G4ParticleHPFission , G4ParticleHPFissionFS , G4WendtFissionFragmentGenerator + InsertModel( 25020, "model_NeutronHPFission" ); + + // Inelastic: the following classes inherit from either G4ParticleHPInelasticBaseFS or + // G4ParticleHPInelasticCompFS, which in turn inherit from G4ParticleHPFinalState + + // Class G4ParticleHPNInelasticFS + InsertModel( 25030, "model_G4ParticleHPNInelasticFS_F01" ); + // Class model_G4ParticleHPNXInelasticFS + InsertModel( 25031, "model_G4ParticleHPNXInelasticFS_F02" ); + // Class G4ParticleHP2NDInelasticFS + InsertModel( 25032, "model_G4ParticleHP2NDInelasticFS_F03" ); + // Class G4ParticleHP2NInelasticFS + InsertModel( 25033, "model_G4ParticleHP2NInelasticFS_F04" ); + // Class G4ParticleHP3NInelasticFS + InsertModel( 25034, "model_G4ParticleHP3NInelasticFS_F05" ); + // Class G4ParticleHPNAInelasticFS + InsertModel( 25035, "model_G4ParticleHPNAInelasticFS_F06" ); + // Class G4ParticleHPN3AInelasticFS + InsertModel( 25036, "model_G4ParticleHPN3AInelasticFS_F07" ); + // Class G4ParticleHP2NAInelasticFS + InsertModel( 25037, "model_G4ParticleHP2NAInelasticFS_F08" ); + // Class G4ParticleHP3NAInelasticFS + InsertModel( 25038, "model_G4ParticleHP3NAInelasticFS_F09" ); + // Class G4ParticleHPNPInelasticFS + InsertModel( 25039, "model_G4ParticleHPNPInelasticFS_F10" ); + // Class G4ParticleHPN2AInelasticFS + InsertModel( 25040, "model_G4ParticleHPN2AInelasticFS_F11" ); + // Clas G4ParticleHP2N2AInelasticFS + InsertModel( 25041, "model_G4ParticleHP2N2AInelasticFS_F12" ); + // Class G4ParticleHPNDInelasticFS + InsertModel( 25042, "model_G4ParticleHPNDInelasticFS_F13" ); + // Class G4ParticleHPNTInelasticFS + InsertModel( 25043, "model_G4ParticleHPNTInelasticFS_F14" ); + // Class G4ParticleHPNHe3InelasticFS + InsertModel( 25044, "model_G4ParticleHPNHe3InelasticFS_F15" ); + // Class G4ParticleHPND2AInelasticFS + InsertModel( 25045, "model_G4ParticleHPND2AInelasticFS_F16" ); + // Class G4ParticleHPNT2AInelasticFS + InsertModel( 25046, "model_G4ParticleHPNT2AInelasticFS_F17" ); + // Class G4ParticleHP4NInelasticFS + InsertModel( 25047, "model_G4ParticleHP4NInelasticFS_F18" ); + // Class G4ParticleHP2NPInelasticFS + InsertModel( 25048, "model_G4ParticleHP2NPInelasticFS_F19" ); + // Class G4ParticleHP3NPInelasticFS + InsertModel( 25049, "model_G4ParticleHP3NPInelasticFS_F20" ); + // Class G4ParticleHPN2PInelasticFS + InsertModel( 25050, "model_G4ParticleHPN2PInelasticFS_F21" ); + // Class G4ParticleHPNPAInelasticFS + InsertModel( 25051, "model_G4ParticleHPNPAInelasticFS_F22" ); + // Class G4ParticleHPPInelasticFS + InsertModel( 25052, "model_G4ParticleHPPInelasticFS_F23" ); + // Class G4ParticleHPDInelasticFS + InsertModel( 25053, "model_G4ParticleHPDInelasticFS_F24" ); + // Class G4ParticleHPTInelasticFS + InsertModel( 25054, "model_G4ParticleHPTInelasticFS_F25" ); + // Class G4ParticleHPHe3InelasticFS + InsertModel( 25055, "model_G4ParticleHPHe3InelasticFS_F26" ); + // Class G4ParticleHPAInelasticFS + InsertModel( 25056, "model_G4ParticleHPAInelasticFS_F27" ); + // Class G4ParticleHP2AInelasticFS + InsertModel( 25057, "model_G4ParticleHP2AInelasticFS_F28" ); + // Class G4ParticleHP3AInelasticFS + InsertModel( 25058, "model_G4ParticleHP3AInelasticFS_F29" ); + // Class G4ParticleHP2PInelasticFS + InsertModel( 25059, "model_G4ParticleHP2PInelasticFS_F30" ); + // Class G4ParticleHPPAInelasticFS + InsertModel( 25060, "model_G4ParticleHPPAInelasticFS_F31" ); + // Class G4ParticleHPD2AInelasticFS + InsertModel( 25061, "model_G4ParticleHPD2AInelasticFS_F32" ); + // Class G4ParticleHPT2AInelasticFS + InsertModel( 25062, "model_G4ParticleHPT2AInelasticFS_F33" ); + // Class G4ParticleHPPDInelasticFS + InsertModel( 25063, "model_G4ParticleHPPDInelasticFS_F34" ); + // Class G4ParticleHPPTInelasticFS + InsertModel( 25064, "model_G4ParticleHPPTInelasticFS_F35" ); + // Class G4ParticleHPDAInelasticFS + InsertModel( 25065, "model_G4ParticleHPDAInelasticFS_F36" ); + + // --- LEND : 25'200 - 25'299 --- + + // Class: G4LENDModel + InsertModel( 25200, "model_LENDModel" ); + + // The following classes inherit from G4LENDModel + + // Class: G4LENDCapture + InsertModel( 25210, "model_LENDCapture" ); + // Class: G4LENDElastic + InsertModel( 25220, "model_LENDElastic" ); + // Class: G4LENDFission + InsertModel( 25230, "model_LENDFission" ); + // Class: G4LENDInelastic + InsertModel( 25240, "model_LENDInelastic" ); + // Class: G4LENDCombinedModel + InsertModel( 25250, "model_LENDCombinedModel" ); + // Class: G4LENDGammaModel + InsertModel( 25260, "model_LENDGammaModel" ); + + // --- Radioactive Decay : 25'500 - 25'999 --- + + // 25'510 + 10*G4RadioactiveDecayMode + InsertModel( 25510, "model_RDM_IT" ); + InsertModel( 25520, "model_RDM_BetaMinus" ); + InsertModel( 25530, "model_RDM_BetaPlus" ); + InsertModel( 25540, "model_RDM_KshellEC" ); + InsertModel( 25550, "model_RDM_LshellEC" ); + InsertModel( 25560, "model_RDM_MshellEC" ); + InsertModel( 25570, "model_RDM_NshellEC" ); + InsertModel( 25580, "model_RDM_Alpha" ); + InsertModel( 25590, "model_RDM_Proton" ); + InsertModel( 25600, "model_RDM_Neutron" ); + InsertModel( 25610, "model_RDM_SpFission" ); + InsertModel( 25620, "model_RDM_BDProton" ); + InsertModel( 25630, "model_RDM_BDNeutron" ); + InsertModel( 25640, "model_RDM_Beta2Minus" ); + InsertModel( 25650, "model_RDM_Beta2Plus" ); + InsertModel( 25660, "model_RDM_Proton2" ); + InsertModel( 25670, "model_RDM_Neutron2" ); + InsertModel( 25680, "model_RDM_Triton" ); + + InsertModel( 25810, "model_RDM_AtomicRelaxation" ); + + // ------------------------------------------------------------------- + // --- Others HAD (everything not include above) : 26'000 - 26'999 --- + // ------------------------------------------------------------------- + // - 26'000 - 26'099 : Stopping + // - 26'100 - 26'199 : Fission + // - 26'200 - 26'299 : Abration + // - 26'300 - 26'399 : Coalescence + // ... + + // --- Stopping : 26'000 - 26'099 --- + + // Below are classes that derives from G4HadronStoppingProcess . + // The names are the same as before Geant4 11, except for the "model_" prefix. + // Classes that use it: G4HadronStoppingProcess . + + // Class: G4HadronicAbsorptionBertini + InsertModel( 26000, "model_hBertiniCaptureAtRest_EMCascade" ); + InsertModel( 26001, "model_hBertiniCaptureAtRest_NuclearCapture" ); + InsertModel( 26002, "model_hBertiniCaptureAtRest_DIO" ); + // Class: G4HadronicAbsorptionFritiof + InsertModel( 26010, "model_hFritiofCaptureAtRest_EMCascade" ); + InsertModel( 26011, "model_hFritiofCaptureAtRest_NuclearCapture" ); + InsertModel( 26012, "model_hFritiofCaptureAtRest_DIO" ); + // Class: G4HadronicAbsorptionFritiofWithBinaryCascade + InsertModel( 26020, "model_hFritiofWithBinaryCascadeCaptureAtRest_EMCascade" ); + InsertModel( 26021, "model_hFritiofWithBinaryCascadeCaptureAtRest_NuclearCapture" ); + InsertModel( 26022, "model_hFritiofWithBinaryCascadeCaptureAtRest_DIO" ); + // Class: G4MuonMinusCapture + InsertModel( 26030, "model_muMinusCaptureAtRest_EMCascade" ); + InsertModel( 26031, "model_muMinusCaptureAtRest_NuclearCapture" ); + InsertModel( 26032, "model_muMinusCaptureAtRest_DIO" ); + + // --- Fission : 26'100 - 26'199 --- + + // Class G4LFission + InsertModel( 26100, "model_G4LFission" ); + + // LLNL fission (related classes: G4FissionLibrary, G4LLNLFission, G4FissLib, G4fissionEvent) + InsertModel( 26110, "model_G4LLNLFission" ); + + // --- Abration : 26'200 - 26'299 --- + + // Class G4WilsonAbrasionModel + InsertModel( 26200, "model_G4WilsonAbrasion" ); + + // --- Coalescence : 26'300 - 26'399 --- + + // Class G4CRCoalescence + InsertModel( 26300, "model_G4CRCoalescence" ); + + // ========================================================================== + // === 3rd OTHER (i.e. non-EM and non-HAD) MODELS : from 30'000 to 39'999 === + // ========================================================================== + + // ------------------------------- + // --- Biasing : 30'000-30'999 --- + // ------------------------------- + + // The name is the same as before Geant4 11, except for the "model_" prefix. + // Classes that use it: G4BOptrForceCollision + InsertModel( 30010, "model_GenBiasForceCollision" ); + + // ---------------------------------- + // --- Channeling : 31'000-31'999 --- + // ---------------------------------- + + // The name is the same as before Geant4 11, except for the "model_" prefix. + // Classes that use it: G4Channeling , G4ChannelingOptrChangeCrossSection + InsertModel( 31010, "model_channeling" ); + + // --- Others ... --- + + // ====================================================================== + // ================== 4th MODELS ADDED AFTER Geant4 11 ================== + // ====================================================================== + // PLEASE ADD MODELS ONLY BELOW HERE, WITH PROPER modelID . + // IF YOU ARE NOT SURE, PLEASE CONTACT ONE OF THE COORDINATORS OF THE + // GEANT4 PHYSICS WORKING GROUPS. + + // ... + + SanityCheck(); + isInitialized = true; + + // The following call is commented out because it should be protected by + // the verbosity level, but this would imply a dependency of the global + // category to other categories which is not allowed. + // Anyhow, the call G4PhysicsModelCatalog::PrintAllInformation() + // can be easily placed elsewhere (in either user code, or even in other + // Geant4 classes). + //PrintAllInformation(); } } -// -------------------------------------------------------------------- +// -------------------------------------------------------------------------- +void G4PhysicsModelCatalog::SanityCheck() { + if ( theVectorOfModelIDs->size() != theVectorOfModelNames->size() ) { + G4ExceptionDescription ed; + ed << "theVectorOfModelIDs' size=" << theVectorOfModelIDs->size() + << " is NOT the same as theVectorOfModelNames's size=" << theVectorOfModelNames->size(); + G4Exception( "G4PhysicsModelCatalog::SanityCheck()", "PhysModelCatalog001", + FatalException, ed, "should be the same!" ); + } else { + G4bool isModelIDOutsideRange = false; + G4bool isModelIDRepeated = false; + G4bool isModelNameRepeated = false; + for ( int idx = 0; idx < Entries(); ++idx ) { + G4int modelID = (*theVectorOfModelIDs)[ idx ]; + G4String modelName = (*theVectorOfModelNames)[ idx ]; + if ( modelID < GetMinAllowedModelIDValue() || modelID > GetMaxAllowedModelIDValue() ) { + isModelIDOutsideRange = true; + } + for ( int jdx = idx + 1; jdx < Entries(); ++jdx ) { + if ( modelID == (*theVectorOfModelIDs)[ jdx ] ) isModelIDRepeated = true; + if ( modelName == (*theVectorOfModelNames)[ jdx ] ) isModelNameRepeated = true; + } + } + if ( isModelIDOutsideRange || isModelIDRepeated || isModelNameRepeated ) { + G4ExceptionDescription ed; + if ( isModelIDOutsideRange ) ed << "theVectorOfModelIDs has NOT all entries between " + << GetMinAllowedModelIDValue() << " and " + << GetMaxAllowedModelIDValue(); + if ( isModelIDRepeated ) ed << "theVectorOfModelIDs has NOT all unique IDs !"; + if ( isModelNameRepeated ) ed << "theVectorOfModelNames has NOT all unique names !"; + G4Exception( "G4PhysicsModelCatalog::SanityCheck()", "PhysModelCatalog002", + FatalException, ed, "cannot continue!" ); + } + } + return; +} + +// -------------------------------------------------------------------------- G4PhysicsModelCatalog::~G4PhysicsModelCatalog() {} -// -------------------------------------------------------------------- -G4int G4PhysicsModelCatalog::Register(const G4String& name) -{ - G4PhysicsModelCatalog(); - G4int idx = GetIndex(name); - if(idx >= 0) - return idx; -#ifdef G4MULTITHREADED - if(G4Threading::IsWorkerThread()) - return -1; -#endif - theCatalog->push_back(name); - return theCatalog->size() - 1; -} - -// -------------------------------------------------------------------- -const G4String& G4PhysicsModelCatalog::GetModelName(G4int idx) -{ - static const G4String undef = "Undefined"; - if(idx >= 0 && idx < Entries()) - return (*theCatalog)[idx]; - return undef; -} - -// -------------------------------------------------------------------- -G4int G4PhysicsModelCatalog::GetIndex(const G4String& name) -{ - for(G4int idx = 0; idx < Entries(); ++idx) - { - if((*theCatalog)[idx] == name) - return idx; +// -------------------------------------------------------------------------- +const G4String G4PhysicsModelCatalog::GetModelNameFromID( const G4int modelID ) { + G4String modelName = "Undefined"; + if ( modelID >= GetMinAllowedModelIDValue() && modelID <= GetMaxAllowedModelIDValue() ) { + for ( int idx = 0; idx < Entries(); ++idx ) { + if ( (*theVectorOfModelIDs)[ idx ] == modelID ) { + modelName = (*theVectorOfModelNames)[ idx ]; + break; + } + } } - return -1; + return modelName; } -// -------------------------------------------------------------------- -G4int G4PhysicsModelCatalog::Entries() -{ - return (theCatalog != nullptr) ? G4int(theCatalog->size()) : -1; +// -------------------------------------------------------------------------- +const G4String G4PhysicsModelCatalog::GetModelNameFromIndex( const G4int modelIndex ) { + return ( modelIndex >= 0 && modelIndex < Entries() ) ? (*theVectorOfModelNames)[ modelIndex ] : "Undefined"; } -// -------------------------------------------------------------------- -void G4PhysicsModelCatalog::Destroy() {} +// -------------------------------------------------------------------------- +G4int G4PhysicsModelCatalog::GetModelID( const G4int modelIndex ) { + return ( modelIndex >= 0 && modelIndex < Entries() ) ? (*theVectorOfModelIDs)[ modelIndex ] : -1; +} + +// -------------------------------------------------------------------------- +G4int G4PhysicsModelCatalog::GetModelID( const G4String& modelName ) { + if ( ! isInitialized ) Initialize(); + G4int modelID = -1; + for ( G4int idx = 0; idx < Entries(); ++idx ) { + if ( (*theVectorOfModelNames)[ idx ] == modelName ) { + modelID = (*theVectorOfModelIDs)[ idx ]; + break; + } + } + return modelID; +} + +// -------------------------------------------------------------------------- +G4int G4PhysicsModelCatalog::GetModelIndex( const G4int modelID ) { + G4int modelIndex = -1; + if ( modelID >= GetMinAllowedModelIDValue() && modelID <= GetMaxAllowedModelIDValue() ) { + for ( G4int idx = 0; idx < Entries(); ++idx ) { + if ( (*theVectorOfModelIDs)[ idx ] == modelID ) { + modelIndex = idx; + break; + } + } + } + return modelIndex; +} + +// -------------------------------------------------------------------------- +G4int G4PhysicsModelCatalog::GetModelIndex( const G4String& modelName ) { + G4int modelIndex = -1; + for ( G4int idx = 0; idx < Entries(); ++idx ) { + if ( (*theVectorOfModelNames)[ idx ] == modelName ) { + modelIndex = idx; + break; + } + } + return modelIndex; +} + +// -------------------------------------------------------------------------- +G4int G4PhysicsModelCatalog::Entries() { + // It is enough to check the size of one of the two vectors, because they have the same size. + return ( theVectorOfModelIDs != nullptr ) ? G4int( theVectorOfModelIDs->size() ) : -1; +} + +// -------------------------------------------------------------------------- +void G4PhysicsModelCatalog::PrintAllInformation() { + G4cout << G4endl + << " ==================================================== " << G4endl + << " === G4PhysicsModelCatalog::PrintAllInformation() === " << G4endl + << " ==================================================== " << G4endl + << " SIZE (i.e. number of models in the catalog)=" << Entries() << G4endl; + for ( int idx = 0; idx < Entries(); ++idx ) { + G4int modelID = (*theVectorOfModelIDs)[ idx ]; + G4String modelName = (*theVectorOfModelNames)[ idx ]; + G4cout << "\t index=" << idx << "\t modelName=" << modelName + << "\t modelID=" << modelID << G4endl; + } + G4cout << " ==================================================== " << G4endl + << " ==================================================== " << G4endl + << " ==================================================== " << G4endl + << G4endl; +} diff --git a/source/global/management/src/G4PhysicsTable.cc b/source/global/management/src/G4PhysicsTable.cc index 1fbb12270b..dee7e89672 100644 --- a/source/global/management/src/G4PhysicsTable.cc +++ b/source/global/management/src/G4PhysicsTable.cc @@ -86,7 +86,7 @@ G4bool G4PhysicsTable::StorePhysicsTable(const G4String& fileName, G4bool ascii) } // check if the file has been opened successfully - if(!fOut) + if(!fOut.is_open()) { #ifdef G4VERBOSE G4cerr << "G4PhysicsTable::StorePhysicsTable():"; @@ -158,7 +158,7 @@ G4bool G4PhysicsTable::RetrievePhysicsTable(const G4String& fileName, } // check if the file has been opened successfully - if(!fIn) + if(!fIn.is_open()) { #ifdef G4VERBOSE G4cerr << "G4PhysicsTable::RetrievePhysicsTable():"; @@ -279,11 +279,8 @@ G4PhysicsVector* G4PhysicsTable::CreatePhysicsVector(G4int type, G4bool spline) pVector = new G4PhysicsLogVector(spline); break; - case T_G4PhysicsFreeVector: - pVector = new G4PhysicsFreeVector(spline); - break; - default: + pVector = new G4PhysicsVector(spline); break; } return pVector; diff --git a/source/global/management/src/G4PhysicsVector.cc b/source/global/management/src/G4PhysicsVector.cc index 8da58bef35..6178a0bfb0 100644 --- a/source/global/management/src/G4PhysicsVector.cc +++ b/source/global/management/src/G4PhysicsVector.cc @@ -30,116 +30,28 @@ // - 03 Mar. 1996, K.Amako: Implemented the 1st version // Revisions: // - 11 Nov. 2000, H.Kurashige: Use STL vector for dataVector and binVector -// - 02 Apr. 2008, A.Bagulya: Added SplineInterpolation() and SetSpline() -// - 19 Jun. 2009, V.Ivanchenko: Removed hidden bin -// - 15 Mar. 2019 M.Novak: added Value method with the known log-energy value -// that can avoid the log call in case of log-vectors // -------------------------------------------------------------------- #include "G4PhysicsVector.hh" #include // -------------------------------------------------------------- - G4PhysicsVector::G4PhysicsVector(G4bool val) : useSpline(val) {} -// -------------------------------------------------------------- - -G4PhysicsVector::~G4PhysicsVector() {} - -// -------------------------------------------------------------- - -G4PhysicsVector::G4PhysicsVector(const G4PhysicsVector& right) +// -------------------------------------------------------------------- +void G4PhysicsVector::Initialise() { - invdBin = right.invdBin; - baseBin = right.baseBin; - verboseLevel = right.verboseLevel; - - DeleteData(); - CopyData(right); -} - -// -------------------------------------------------------------- - -G4PhysicsVector& G4PhysicsVector::operator=(const G4PhysicsVector& right) -{ - if(&right == this) + idxmax = numberOfNodes - 2; + if(0 < numberOfNodes) { - return *this; - } - invdBin = right.invdBin; - baseBin = right.baseBin; - verboseLevel = right.verboseLevel; - - DeleteData(); - CopyData(right); - return *this; -} - -// -------------------------------------------------------------- - -G4bool G4PhysicsVector::operator==(const G4PhysicsVector& right) const -{ - return (this == &right); -} - -// -------------------------------------------------------------- - -G4bool G4PhysicsVector::operator!=(const G4PhysicsVector& right) const -{ - return (this != &right); -} - -// -------------------------------------------------------------- - -void G4PhysicsVector::DeleteData() -{ - useSpline = false; - secDerivative.clear(); -} - -// -------------------------------------------------------------- - -void G4PhysicsVector::CopyData(const G4PhysicsVector& vec) -{ - type = vec.type; - edgeMin = vec.edgeMin; - edgeMax = vec.edgeMax; - numberOfNodes = vec.numberOfNodes; - useSpline = vec.useSpline; - - std::size_t i; - dataVector.resize(numberOfNodes); - for(i = 0; i < numberOfNodes; ++i) - { - dataVector[i] = (vec.dataVector)[i]; - } - binVector.resize(numberOfNodes); - for(i = 0; i < numberOfNodes; ++i) - { - binVector[i] = (vec.binVector)[i]; - } - if(0 < (vec.secDerivative).size()) - { - secDerivative.resize(numberOfNodes); - for(i = 0; i < numberOfNodes; ++i) - { - secDerivative[i] = (vec.secDerivative)[i]; - } + edgeMin = binVector[0]; + edgeMax = binVector[numberOfNodes - 1]; } } // -------------------------------------------------------------- - -G4double G4PhysicsVector::GetLowEdgeEnergy(std::size_t binNumber) const -{ - return binVector[binNumber]; -} - -// -------------------------------------------------------------- - G4bool G4PhysicsVector::Store(std::ofstream& fOut, G4bool ascii) const { // Ascii mode @@ -172,7 +84,6 @@ G4bool G4PhysicsVector::Store(std::ofstream& fOut, G4bool ascii) const } // -------------------------------------------------------------- - G4bool G4PhysicsVector::Retrieve(std::ifstream& fIn, G4bool ascii) { // clear properties; @@ -213,11 +124,7 @@ G4bool G4PhysicsVector::Retrieve(std::ifstream& fIn, G4bool ascii) binVector.push_back(vBin); dataVector.push_back(vData); } - - // to remove any inconsistency - numberOfNodes = siz; - edgeMin = binVector[0]; - edgeMax = binVector[numberOfNodes - 1]; + Initialise(); return true; } @@ -248,67 +155,212 @@ G4bool G4PhysicsVector::Retrieve(std::ifstream& fIn, G4bool ascii) } delete[] value; - // to remove any inconsistency - numberOfNodes = size; - edgeMin = binVector[0]; - edgeMax = binVector[numberOfNodes - 1]; - + Initialise(); return true; } // -------------------------------------------------------------- - void G4PhysicsVector::DumpValues(G4double unitE, G4double unitV) const { for(std::size_t i = 0; i < numberOfNodes; ++i) { - G4cout << binVector[i] / unitE << " " << dataVector[i] / unitV << G4endl; + G4cout << binVector[i] / unitE << " " << dataVector[i] / unitV + << G4endl; } } // -------------------------------------------------------------------- - -void G4PhysicsVector::ScaleVector(G4double factorE, G4double factorV) +std::size_t G4PhysicsVector::FindBin(const G4double energy, + std::size_t idx) const { - std::size_t n = dataVector.size(); - std::size_t i; - for(i = 0; i < n; ++i) + if(idx + 1 < numberOfNodes && + energy >= binVector[idx] && energy <= binVector[idx]) + { + return idx; + } + else if(energy <= binVector[1]) + { + return 0; + } + else if(energy >= binVector[idxmax]) + { + return idxmax; + } + return GetBin(energy); +} + +// -------------------------------------------------------------------- +void G4PhysicsVector::ScaleVector(const G4double factorE, + const G4double factorV) +{ + for(std::size_t i = 0; i < numberOfNodes; ++i) { binVector[i] *= factorE; dataVector[i] *= factorV; } - secDerivative.clear(); + Initialise(); +} - edgeMin = binVector[0]; - edgeMax = binVector[n - 1]; +// -------------------------------------------------------------------- +void G4PhysicsVector::FillSecondDerivatives(const G4SplineType stype, + const G4double dir1, + const G4double dir2) +{ + if(!useSpline) { return; } + // cannot compute derivatives for less than 5 points + const std::size_t nmin = (stype == G4SplineType::Base) ? 5 : 4; + if(nmin > numberOfNodes) + { + if(0 < verboseLevel) + { + G4cout << "### G4PhysicsVector: spline cannot be used for " + << numberOfNodes << " points - spline disabled" + << G4endl; + DumpValues(); + } + useSpline = false; + return; + } + // check energies of free vector + if(type == T_G4PhysicsFreeVector) + { + for(G4int i=0; i<=idxmax; ++i) + { + if(binVector[i + 1] <= binVector[i]) + { + if(0 < verboseLevel) + { + G4cout << "### G4PhysicsVector: spline cannot be used, because " + << " E[" << i << "]=" << binVector[i] + << " >= E[" << i+1 << "]=" << binVector[i + 1] + << G4endl; + DumpValues(); + } + useSpline = false; + return; + } + } + } + + // spline is possible + Initialise(); + secDerivative.resize(numberOfNodes); + + if(1 < verboseLevel) + { + G4cout << "### G4PhysicsVector:: FillSecondDerivatives N=" + << numberOfNodes << G4endl; + DumpValues(); + } + + switch(stype) + { + case G4SplineType::Base: + ComputeSecDerivative1(); + break; + + case G4SplineType::FixedEdges: + ComputeSecDerivative2(dir1, dir2); + break; + + default: + ComputeSecDerivative0(); + } } // -------------------------------------------------------------- +void G4PhysicsVector::ComputeSecDerivative0() +// A simplified method of computation of second derivatives +{ + std::size_t n = numberOfNodes - 1; -void G4PhysicsVector::ComputeSecondDerivatives(G4double firstPointDerivative, - G4double endPointDerivative) + for(std::size_t i = 1; i < n; ++i) + { + secDerivative[i] = 3.0 * + ((dataVector[i + 1] - dataVector[i]) / (binVector[i + 1] - binVector[i]) - + (dataVector[i] - dataVector[i - 1]) / + (binVector[i] - binVector[i - 1])) / + (binVector[i + 1] - binVector[i - 1]); + } + secDerivative[n] = secDerivative[n - 1]; + secDerivative[0] = secDerivative[1]; +} + +// -------------------------------------------------------------- +void G4PhysicsVector::ComputeSecDerivative1() +// Computation of second derivatives using "Not-a-knot" endpoint conditions +// B.I. Kvasov "Methods of shape-preserving spline approximation" +// World Scientific, 2000 +{ + G4int n = numberOfNodes - 1; + G4double* u = new G4double[n]; + G4double p, sig; + + u[1] = ((dataVector[2] - dataVector[1]) / (binVector[2] - binVector[1]) - + (dataVector[1] - dataVector[0]) / (binVector[1] - binVector[0])); + u[1] = 6.0 * u[1] * (binVector[2] - binVector[1]) / + ((binVector[2] - binVector[0]) * (binVector[2] - binVector[0])); + + // Decomposition loop for tridiagonal algorithm. secDerivative[i] + // and u[i] are used for temporary storage of the decomposed factors. + + secDerivative[1] = (2.0 * binVector[1] - binVector[0] - binVector[2]) / + (2.0 * binVector[2] - binVector[0] - binVector[1]); + + for(G4int i = 2; i < n - 1; ++i) + { + sig = + (binVector[i] - binVector[i - 1]) / (binVector[i + 1] - binVector[i - 1]); + p = sig * secDerivative[i - 1] + 2.0; + secDerivative[i] = (sig - 1.0) / p; + u[i] = + (dataVector[i + 1] - dataVector[i]) / (binVector[i + 1] - binVector[i]) - + (dataVector[i] - dataVector[i - 1]) / (binVector[i] - binVector[i - 1]); + u[i] = + (6.0 * u[i] / (binVector[i + 1] - binVector[i - 1])) - sig * u[i - 1] / p; + } + + sig = + (binVector[n - 1] - binVector[n - 2]) / (binVector[n] - binVector[n - 2]); + p = sig * secDerivative[n - 3] + 2.0; + u[n - 1] = + (dataVector[n] - dataVector[n - 1]) / (binVector[n] - binVector[n - 1]) - + (dataVector[n - 1] - dataVector[n - 2]) / + (binVector[n - 1] - binVector[n - 2]); + u[n - 1] = 6.0 * sig * u[n - 1] / (binVector[n] - binVector[n - 2]) - + (2.0 * sig - 1.0) * u[n - 2] / p; + + p = (1.0 + sig) + (2.0 * sig - 1.0) * secDerivative[n - 2]; + secDerivative[n - 1] = u[n - 1] / p; + + // The back-substitution loop for the triagonal algorithm of solving + // a linear system of equations. + + for(G4int k = n - 2; k > 1; --k) + { + secDerivative[k] *= + (secDerivative[k + 1] - u[k] * (binVector[k + 1] - binVector[k - 1]) / + (binVector[k + 1] - binVector[k])); + } + secDerivative[n] = + (secDerivative[n - 1] - (1.0 - sig) * secDerivative[n - 2]) / sig; + sig = 1.0 - ((binVector[2] - binVector[1]) / (binVector[2] - binVector[0])); + secDerivative[1] *= (secDerivative[2] - u[1] / (1.0 - sig)); + secDerivative[0] = (secDerivative[1] - sig * secDerivative[2]) / (1.0 - sig); + + delete[] u; +} + +// -------------------------------------------------------------- +void G4PhysicsVector::ComputeSecDerivative2(G4double firstPointDerivative, + G4double endPointDerivative) // A standard method of computation of second derivatives // First derivatives at the first and the last point should be provided // See for example W.H. Press et al. "Numerical recipes in C" // Cambridge University Press, 1997. { - if(4 > numberOfNodes) // cannot compute derivatives for less than 4 bins - { - ComputeSecDerivatives(); - return; - } - - if(!SplinePossible()) - { - return; - } - - useSpline = true; - G4int n = numberOfNodes - 1; - G4double* u = new G4double[n]; - G4double p, sig, un; u[0] = (6.0 / (binVector[1] - binVector[0])) * @@ -357,145 +409,6 @@ void G4PhysicsVector::ComputeSecondDerivatives(G4double firstPointDerivative, } // -------------------------------------------------------------- - -void G4PhysicsVector::FillSecondDerivatives() -{ - // Computation of second derivatives using "Not-a-knot" endpoint conditions - // B.I. Kvasov "Methods of shape-preserving spline approximation" - // World Scientific, 2000 - - if(5 > numberOfNodes) // cannot compute derivatives for less than 4 points - { - ComputeSecDerivatives(); - return; - } - - if(!SplinePossible()) - { - return; - } - - useSpline = true; - - G4int n = numberOfNodes - 1; - - G4double* u = new G4double[n]; - - G4double p, sig; - - u[1] = ((dataVector[2] - dataVector[1]) / (binVector[2] - binVector[1]) - - (dataVector[1] - dataVector[0]) / (binVector[1] - binVector[0])); - u[1] = 6.0 * u[1] * (binVector[2] - binVector[1]) / - ((binVector[2] - binVector[0]) * (binVector[2] - binVector[0])); - - // Decomposition loop for tridiagonal algorithm. secDerivative[i] - // and u[i] are used for temporary storage of the decomposed factors. - - secDerivative[1] = (2.0 * binVector[1] - binVector[0] - binVector[2]) / - (2.0 * binVector[2] - binVector[0] - binVector[1]); - - for(G4int i = 2; i < n - 1; ++i) - { - sig = - (binVector[i] - binVector[i - 1]) / (binVector[i + 1] - binVector[i - 1]); - p = sig * secDerivative[i - 1] + 2.0; - secDerivative[i] = (sig - 1.0) / p; - u[i] = - (dataVector[i + 1] - dataVector[i]) / (binVector[i + 1] - binVector[i]) - - (dataVector[i] - dataVector[i - 1]) / (binVector[i] - binVector[i - 1]); - u[i] = - (6.0 * u[i] / (binVector[i + 1] - binVector[i - 1])) - sig * u[i - 1] / p; - } - - sig = - (binVector[n - 1] - binVector[n - 2]) / (binVector[n] - binVector[n - 2]); - p = sig * secDerivative[n - 3] + 2.0; - u[n - 1] = - (dataVector[n] - dataVector[n - 1]) / (binVector[n] - binVector[n - 1]) - - (dataVector[n - 1] - dataVector[n - 2]) / - (binVector[n - 1] - binVector[n - 2]); - u[n - 1] = 6.0 * sig * u[n - 1] / (binVector[n] - binVector[n - 2]) - - (2.0 * sig - 1.0) * u[n - 2] / p; - - p = (1.0 + sig) + (2.0 * sig - 1.0) * secDerivative[n - 2]; - secDerivative[n - 1] = u[n - 1] / p; - - // The back-substitution loop for the triagonal algorithm of solving - // a linear system of equations. - - for(G4int k = n - 2; k > 1; --k) - { - secDerivative[k] *= - (secDerivative[k + 1] - u[k] * (binVector[k + 1] - binVector[k - 1]) / - (binVector[k + 1] - binVector[k])); - } - secDerivative[n] = - (secDerivative[n - 1] - (1.0 - sig) * secDerivative[n - 2]) / sig; - sig = 1.0 - ((binVector[2] - binVector[1]) / (binVector[2] - binVector[0])); - secDerivative[1] *= (secDerivative[2] - u[1] / (1.0 - sig)); - secDerivative[0] = (secDerivative[1] - sig * secDerivative[2]) / (1.0 - sig); - - delete[] u; -} - -// -------------------------------------------------------------- - -void G4PhysicsVector::ComputeSecDerivatives() -{ - // A simplified method of computation of second derivatives - - if(3 > numberOfNodes) // cannot compute derivatives for less than 4 bins - { - useSpline = false; - return; - } - - if(!SplinePossible()) - { - return; - } - - useSpline = true; - - std::size_t n = numberOfNodes - 1; - - for(std::size_t i = 1; i < n; ++i) - { - secDerivative[i] = - 3.0 * - ((dataVector[i + 1] - dataVector[i]) / (binVector[i + 1] - binVector[i]) - - (dataVector[i] - dataVector[i - 1]) / - (binVector[i] - binVector[i - 1])) / - (binVector[i + 1] - binVector[i - 1]); - } - secDerivative[n] = secDerivative[n - 1]; - secDerivative[0] = secDerivative[1]; -} - -// -------------------------------------------------------------- - -G4bool G4PhysicsVector::SplinePossible() -{ - // Initialise second derivative array. If neighbor energy coincide - // or not ordered than spline cannot be applied - - G4bool result = true; - for(std::size_t j = 1; j < numberOfNodes; ++j) - { - if(binVector[j] <= binVector[j - 1]) - { - result = false; - useSpline = false; - secDerivative.clear(); - break; - } - } - secDerivative.resize(numberOfNodes, 0.0); - return result; -} - -// -------------------------------------------------------------- - std::ostream& operator<<(std::ostream& out, const G4PhysicsVector& pv) { // binning @@ -515,57 +428,44 @@ std::ostream& operator<<(std::ostream& out, const G4PhysicsVector& pv) } //--------------------------------------------------------------- - -G4double G4PhysicsVector::Value(G4double theEnergy, std::size_t& lastIdx) const +G4double G4PhysicsVector::GetEnergy(const G4double val) const { - G4double y; - if(theEnergy <= edgeMin) - { - lastIdx = 0; - y = dataVector[0]; - } - else if(theEnergy >= edgeMax) - { - lastIdx = numberOfNodes - 1; - y = dataVector[lastIdx]; - } - else - { - lastIdx = FindBin(theEnergy, lastIdx); - y = Interpolation(lastIdx, theEnergy); - } - return y; -} - -//--------------------------------------------------------------- - -G4double G4PhysicsVector::FindLinearEnergy(G4double rand) const -{ - if(1 >= numberOfNodes) + if(0 == numberOfNodes) { return 0.0; } - G4double y = rand * dataVector[numberOfNodes - 1]; - std::size_t bin = std::lower_bound(dataVector.begin(), dataVector.end(), y) - - dataVector.begin() - 1; - bin = std::min(bin, numberOfNodes - 2); + if(1 == numberOfNodes || val <= dataVector[0]) + { + return edgeMin; + } + if(val >= dataVector[numberOfNodes - 1]) + { + return edgeMax; + } + std::size_t bin = + std::lower_bound(dataVector.begin(), dataVector.end(), val) - + dataVector.begin() - 1; + if(static_cast(bin) > idxmax) { bin = idxmax; } G4double res = binVector[bin]; G4double del = dataVector[bin + 1] - dataVector[bin]; if(del > 0.0) { - res += (y - dataVector[bin]) * (binVector[bin + 1] - res) / del; + res += (val - dataVector[bin]) * (binVector[bin + 1] - res) / del; } return res; } //--------------------------------------------------------------- - -void G4PhysicsVector::PrintPutValueError(std::size_t index, G4double e1, G4double e2) +void G4PhysicsVector::PrintPutValueError(std::size_t index, + G4double val, + const G4String& text) { G4ExceptionDescription ed; - ed << "Vector type " << type << " length= " << numberOfNodes - << " an attempt to put data at index= " << index - << " E[index - 1]= " << e1 << "; E[index]= " << e2; - G4Exception("G4PhysicsVector::PutValue()", "gl0005", FatalException, ed, - "Memory overwritten"); + ed << "Vector type: " << type << " length= " << numberOfNodes + << "; an attempt to put data at index= " << index + << " value= " << val << " in " << text; + G4Exception("G4PhysicsVector:", "gl0005", + FatalException, ed, "Wrong operation"); } + +//--------------------------------------------------------------- diff --git a/source/global/management/src/G4UnitsTable.cc b/source/global/management/src/G4UnitsTable.cc index eafd1d0b5b..b7d764a170 100644 --- a/source/global/management/src/G4UnitsTable.cc +++ b/source/global/management/src/G4UnitsTable.cc @@ -551,6 +551,7 @@ G4BestUnit::G4BestUnit(G4double value, const G4String& category) Value[0] = value; Value[1] = 0.; Value[2] = 0.; + Category = category; IndexOfCategory = i; } @@ -578,6 +579,7 @@ G4BestUnit::G4BestUnit(const G4ThreeVector& value, const G4String& category) Value[0] = value.x(); Value[1] = value.y(); Value[2] = value.z(); + Category = category; IndexOfCategory = i; } @@ -611,6 +613,19 @@ std::ostream& operator<<(std::ostream& flux, G4BestUnit a) std::max(std::max(std::fabs(a.Value[0]), std::fabs(a.Value[1])), std::fabs(a.Value[2])); + //special treatement for Energy. + if ((a.Category == "Energy") && (value == 0.)) { + for (G4int j = 0; j < a.nbOfVals; ++j) { + flux << a.Value[j] << " "; + } + std::ios::fmtflags oldform = flux.flags(); + flux.setf(std::ios::left, std::ios::adjustfield); + flux << std::setw(len) << "eV"; + flux.flags(oldform); + return flux; + } + + //here, value != 0. for(std::size_t k = 0; k < List.size(); ++k) { G4double unit = List[k]->GetValue(); diff --git a/source/graphics_reps/History b/source/graphics_reps/History index 4491c5eb49..aa9375e2bb 100644 --- a/source/graphics_reps/History +++ b/source/graphics_reps/History @@ -19,6 +19,39 @@ committal in the CVS repository ! History file for graphics_reps category --------------------------------------- +28 October 2021 Guy Barrand (greps-V10-07-13) +- sources.cmake: declare G4Plotter.hh,.cc. +- G4VGraphicsScene: have: + virtual void AddPrimitive (const G4Plotter&) = 0; +- G4Plotter.hh,.cc: some kind of "high level" primitive + to capture "what is plotted" (tools::histo:h1d, h2d for the moment) and the style of a plotter. + Style description is done by handing named lists of (parameter,value). It is sufficently + generic to be usable by various implementations of a plotter. It is assumed that + a plotter manages a grid of "regions" to visualize various histograms in a same + representation/view/viewport (concept similar to the "zones" in the CERN-PAW plotter). + +25 October 2021 Ben Morgan (greps-V10-07-12) +- Use G4StrUtil functions replacing deprecated G4String member functions + +05 September 2021 Evgueni Tcherniaev (greps-V10-07-11) +- HepPolyhedron.cc: fixed defect ("resource leak") reported by Coverity +- G4Visible, G4VMarker, G4Text: implemented move constructor and + move assignment, as suggested by Coverity + +31 August 2021 John Allison (greps-V10-07-10) +- Add G4VMarker::operator==. + +30 June 2021 John Allison (greps-V10-07-09) +- Revise vis models. See visualization/modeling/History for more details. +- Remove G4Scale. G4Scale is an anomaly. It is not a "primitive" (obviously), + but somehow, from the long distant past, it was implemented as though it was. + (/vis/scene/add/scale reimplemented with G4CallBackModel.) + +29 June 2021 Evgueni Tcherniaev (greps-V10-07-08) +- HepPolyhedron.cc: minor fix for Coverity +- BooleanProcessor.src: redundant std::move(polyhedron) replaced with + HepPolyhedron(polyhedron), it fixes complation warnings with c++20 + 07 June 2021 John Allison (greps-V10-07-07) - G4VGraphicsScene.hh: o Introduce a new pure virtual function: diff --git a/source/graphics_reps/include/G4ConversionUtils.hh b/source/graphics_reps/include/G4ConversionUtils.hh index d75cb958af..07ebbcbf13 100644 --- a/source/graphics_reps/include/G4ConversionUtils.hh +++ b/source/graphics_reps/include/G4ConversionUtils.hh @@ -44,8 +44,7 @@ namespace G4ConversionUtils template G4bool Convert(const G4String& myInput, Value& output) { - G4String input(myInput); - input = input.strip(); + G4String input = G4StrUtil::strip_copy(myInput); std::istringstream is(input); char tester; @@ -57,8 +56,7 @@ namespace G4ConversionUtils template<> inline G4bool Convert(const G4String& myInput, G4DimensionedDouble& output) { - G4String input(myInput); - input = input.strip(); + G4String input = G4StrUtil::strip_copy(myInput); G4double value; G4String unit; @@ -76,8 +74,7 @@ namespace G4ConversionUtils template<> inline G4bool Convert(const G4String& myInput, G4DimensionedThreeVector& output) { - G4String input(myInput); - input = input.strip(); + G4String input = G4StrUtil::strip_copy(myInput); G4double value1, value2, value3; G4String unit; @@ -94,8 +91,7 @@ namespace G4ConversionUtils template<> inline G4bool Convert(const G4String& myInput, G4ThreeVector& output) { - G4String input(myInput); - input = input.strip(); + G4String input = G4StrUtil::strip_copy(myInput); G4double value1, value2, value3; @@ -114,8 +110,7 @@ namespace G4ConversionUtils template G4bool Convert(const G4String& myInput, Value& value1, Value& value2) { - G4String input(myInput); - input = input.strip(); + G4String input = G4StrUtil::strip_copy(myInput); std::istringstream is(input); char tester; @@ -127,8 +122,7 @@ namespace G4ConversionUtils template<> inline G4bool Convert(const G4String& myInput, G4DimensionedDouble& min, G4DimensionedDouble& max) { - G4String input(myInput); - input = input.strip(); + G4String input = G4StrUtil::strip_copy(myInput); G4double valueMin, valueMax; G4String unitsMin, unitsMax; @@ -147,8 +141,7 @@ namespace G4ConversionUtils template<> inline G4bool Convert(const G4String& myInput, G4DimensionedThreeVector& min, G4DimensionedThreeVector& max) { - G4String input(myInput); - input = input.strip(); + G4String input = G4StrUtil::strip_copy(myInput); G4double valueMinX, valueMinY, valueMinZ; G4double valueMaxX, valueMaxY, valueMaxZ; @@ -168,9 +161,8 @@ namespace G4ConversionUtils template<> inline G4bool Convert(const G4String& myInput, G4ThreeVector& min, G4ThreeVector& max) - { - G4String input(myInput); - input = input.strip(); + { + G4String input = G4StrUtil::strip_copy(myInput); G4double valueMinX, valueMinY, valueMinZ; G4double valueMaxX, valueMaxY, valueMaxZ; diff --git a/source/graphics_reps/include/G4Plotter.hh b/source/graphics_reps/include/G4Plotter.hh new file mode 100644 index 0000000000..f6de461b76 --- /dev/null +++ b/source/graphics_reps/include/G4Plotter.hh @@ -0,0 +1,90 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Guy Barrand 25th September 2021 +// + +#ifndef G4PLOTTER_HH +#define G4PLOTTER_HH + +#include "G4String.hh" + +#include +#include + +namespace tools {namespace histo {class h1d;}} +namespace tools {namespace histo {class h2d;}} + +class G4Plotter { +public: + using RegionStyle = std::pair; + using Parameter = std::pair; + using RegionParameter = std::pair; + using Region_h1d = std::pair; + using Region_h2d = std::pair; + using Region_h1 = std::pair; + using Region_h2 = std::pair; + + G4Plotter(); + virtual ~G4Plotter() = default; + G4Plotter(const G4Plotter&); + G4Plotter& operator = (const G4Plotter&); + + void SetLayout(unsigned int colums,unsigned int rows); + void AddStyle(const G4String& style); + void AddRegionStyle(unsigned int region,const G4String& style); + void AddRegionParameter(unsigned int region,const G4String& parameter,const G4String& value); + void AddRegionHistogram(unsigned int region,tools::histo::h1d* histo); + void AddRegionHistogram(unsigned int region,tools::histo::h2d* histo); + void AddRegionH1(unsigned int region,int id); + void AddRegionH2(unsigned int region,int id); + void Reset(); + void Clear(); + void ClearRegion(unsigned int region); + + unsigned int GetColumns() const {return fColumns;} + unsigned int GetRows() const {return fRows;} + const std::vector& GetStyles() const {return fStyles;} + const std::vector& GetRegionStyles() const {return fRegionStyles;} + const std::vector& GetRegionParameters() const {return fRegionParameters;} + const std::vector& GetRegionH1Ds() const {return fRegion_h1ds;} + const std::vector& GetRegionH2Ds() const {return fRegion_h2ds;} + + const std::vector& GetRegionH1s() const {return fRegion_h1s;} + const std::vector& GetRegionH2s() const {return fRegion_h2s;} + +private: + unsigned int fColumns; + unsigned int fRows; + std::vector fStyles; + std::vector fRegionStyles; + std::vector fRegionParameters; + std::vector fRegion_h1ds; + std::vector fRegion_h2ds; + std::vector fRegion_h1s; + std::vector fRegion_h2s; +}; + +#endif diff --git a/source/graphics_reps/include/G4Scale.hh b/source/graphics_reps/include/G4Scale.hh deleted file mode 100644 index 4413731f06..0000000000 --- a/source/graphics_reps/include/G4Scale.hh +++ /dev/null @@ -1,92 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// -// John Allison 21st July 2001. - -#ifndef G4SCALE_HH -#define G4SCALE_HH - -#include "G4VMarker.hh" -#include "globals.hh" - -class G4Scale: public G4VMarker { - -public: // With description - - enum Direction {x, y, z}; - - G4Scale (G4double length, const G4String& annotation = "", - Direction direction = x, - G4bool autoPlacing = true, - G4double xmid = 0., G4double ymid = 0., G4double zmid = 0., - G4double annotationSize = 12.); - // This creates a representation of annotated line in the specified - // direction with tick marks at the end. If autoPlacing is true it - // is required to be centred at the front, right, bottom corner of - // the world space, comfortably outside the existing bounding - // box/sphere so that existing objects do not obscure it. Otherwise - // it is required to be drawn with mid-point at (xmid, ymid, zmid). - // Annotation size is size of text labels in pixels. - // - // The auto placing algorithm might be: - // x = xmin + (1 + comfort) * (xmax - xmin) - // y = ymin - comfort * (ymax - ymin) - // z = zmin + (1 + comfort) * (zmax - zmin) - // if direction == x then (x - length,y,z) to (x,y,z) - // if direction == y then (x,y,z) to (x,y + length,z) - // if direction == z then (x,y,z - length) to (x,y,z) - - // Uses compiler-generated copy constructor. - - ~G4Scale (); - - G4double GetLength() const; - const G4String& GetAnnotation() const; - G4double GetAnnotationSize() const; - Direction GetDirection() const; - G4bool GetAutoPlacing() const; - G4double GetXmid() const; - G4double GetYmid() const; - G4double GetZmid() const; - - static const G4String& GetGuidanceString(); - -private: - - G4double fLength; - G4String fAnnotation; - G4double fAnnotationSize; - Direction fDirection; - G4bool fAutoPlacing; - G4double fXmid, fYmid, fZmid; - static const G4String GuidanceString; -}; - -#include "G4Scale.icc" - -#endif diff --git a/source/graphics_reps/include/G4Scale.icc b/source/graphics_reps/include/G4Scale.icc deleted file mode 100644 index 3a8dae2832..0000000000 --- a/source/graphics_reps/include/G4Scale.icc +++ /dev/null @@ -1,61 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// -// John Allison 21st July 2001. - -inline G4double G4Scale::GetLength() const { - return fLength; -} - -inline const G4String& G4Scale::GetAnnotation() const { - return fAnnotation; -} - -inline G4double G4Scale::GetAnnotationSize() const { - return fAnnotationSize; -} - -inline G4Scale::Direction G4Scale::GetDirection() const { - return fDirection; -} - -inline G4bool G4Scale::GetAutoPlacing() const { - return fAutoPlacing; -} - -inline G4double G4Scale::GetXmid() const { - return fXmid; -} - -inline G4double G4Scale::GetYmid() const { - return fYmid; -} - -inline G4double G4Scale::GetZmid() const { - return fZmid; -} diff --git a/source/graphics_reps/include/G4Text.hh b/source/graphics_reps/include/G4Text.hh index 30947386c6..a8d4646556 100644 --- a/source/graphics_reps/include/G4Text.hh +++ b/source/graphics_reps/include/G4Text.hh @@ -74,12 +74,14 @@ class G4Text: public G4VMarker { public: // With description enum Layout {left, centre, right}; - G4Text (const G4String& text); + G4Text (const G4String& text = "none"); G4Text (const G4String& text, const G4Point3D& position); G4Text (const G4VMarker&); - G4Text (const G4Text&); + G4Text (const G4Text&) = default; + G4Text (G4Text&&) = default; virtual ~G4Text (); - G4Text& operator= (const G4Text&); + G4Text& operator= (const G4Text&) = default; + G4Text& operator= (G4Text&&) = default; G4String GetText () const; Layout GetLayout () const; diff --git a/source/graphics_reps/include/G4VGraphicsScene.hh b/source/graphics_reps/include/G4VGraphicsScene.hh index c49a70d53a..002d24bc2e 100644 --- a/source/graphics_reps/include/G4VGraphicsScene.hh +++ b/source/graphics_reps/include/G4VGraphicsScene.hh @@ -61,7 +61,6 @@ class G4VHit; class G4VDigi; template class G4THitsMap; class G4Polyline; -class G4Scale; class G4Text; class G4Circle; class G4Square; @@ -70,6 +69,7 @@ class G4Polyhedron; class G4VisExtent; class G4StatDouble; class G4Mesh; +class G4Plotter; class G4VGraphicsScene { @@ -155,13 +155,13 @@ public: // With description // z-coordinate is ignored. virtual void AddPrimitive (const G4Polyline&) = 0; - virtual void AddPrimitive (const G4Scale&) = 0; virtual void AddPrimitive (const G4Text&) = 0; virtual void AddPrimitive (const G4Circle&) = 0; virtual void AddPrimitive (const G4Square&) = 0; virtual void AddPrimitive (const G4Polymarker&) = 0; virtual void AddPrimitive (const G4Polyhedron&) = 0; - + virtual void AddPrimitive (const G4Plotter&) = 0; + virtual const G4VisExtent& GetExtent() const; // The concrete class should overload this or a null extent will be returned. // See G4VScenHandler for example. diff --git a/source/graphics_reps/include/G4VMarker.hh b/source/graphics_reps/include/G4VMarker.hh index 0fd496f526..fcee374956 100644 --- a/source/graphics_reps/include/G4VMarker.hh +++ b/source/graphics_reps/include/G4VMarker.hh @@ -99,7 +99,8 @@ public: // With description ////////////////////////////////////////////////////// // Constructors... G4VMarker (); - G4VMarker (const G4VMarker&); + G4VMarker (const G4VMarker&) = default; + G4VMarker (G4VMarker&& ) = default; G4VMarker (const G4Point3D& position); ////////////////////////////////////////////////////// @@ -108,11 +109,13 @@ public: // With description ////////////////////////////////////////////////////// // Assignment... - G4VMarker& operator = (const G4VMarker&); + G4VMarker& operator = (const G4VMarker&) = default; + G4VMarker& operator = (G4VMarker&&) = default; ////////////////////////////////////////////////////// // Logical... G4bool operator != (const G4VMarker&) const; + G4bool operator == (const G4VMarker&) const; ///////////////////////////////////////////////////// // Get functions... diff --git a/source/graphics_reps/include/G4VMarker.icc b/source/graphics_reps/include/G4VMarker.icc index c6416af08f..ee1d092eda 100644 --- a/source/graphics_reps/include/G4VMarker.icc +++ b/source/graphics_reps/include/G4VMarker.icc @@ -27,6 +27,9 @@ // // +inline G4bool G4VMarker::operator==(const G4VMarker& mk) const +{ return !(*this != mk); } + inline G4Point3D G4VMarker::GetPosition () const { return fPosition; } diff --git a/source/graphics_reps/include/G4VVisManager.hh b/source/graphics_reps/include/G4VVisManager.hh index 445ffc2b49..8b5e8ee6cf 100644 --- a/source/graphics_reps/include/G4VVisManager.hh +++ b/source/graphics_reps/include/G4VVisManager.hh @@ -77,7 +77,6 @@ class G4Polyline; class G4Text; class G4Circle; -class G4Scale; class G4Square; class G4Polymarker; class G4Polyhedron; @@ -120,9 +119,6 @@ public: // With description virtual void Draw (const G4Polymarker&, const G4Transform3D& objectTransformation = G4Transform3D()) = 0; - virtual void Draw (const G4Scale&, - const G4Transform3D& objectTransformation = G4Transform3D()) = 0; - virtual void Draw (const G4Square&, const G4Transform3D& objectTransformation = G4Transform3D()) = 0; diff --git a/source/graphics_reps/include/G4Visible.hh b/source/graphics_reps/include/G4Visible.hh index 9f8de05e58..6699f8fadd 100644 --- a/source/graphics_reps/include/G4Visible.hh +++ b/source/graphics_reps/include/G4Visible.hh @@ -52,11 +52,13 @@ public: // With description G4Visible (); G4Visible (const G4Visible&); + G4Visible (G4Visible&&); G4Visible (const G4VisAttributes*); virtual ~G4Visible (); G4Visible& operator= (const G4Visible&); + G4Visible& operator= (G4Visible&&); G4bool operator != (const G4Visible& right) const; diff --git a/source/graphics_reps/sources.cmake b/source/graphics_reps/sources.cmake index 9764447acf..8b005b3b0e 100644 --- a/source/graphics_reps/sources.cmake +++ b/source/graphics_reps/sources.cmake @@ -25,13 +25,12 @@ geant4_add_module(G4graphics_reps G4Polyline.hh G4Polymarker.hh G4Polymarker.icc - G4Scale.hh - G4Scale.icc G4SmartFilter.hh G4Square.hh G4Square.icc G4Text.hh G4Text.icc + G4Plotter.hh G4TypeKey.hh G4TypeKeyT.hh G4VFilter.hh @@ -63,9 +62,9 @@ geant4_add_module(G4graphics_reps G4PolyhedronArbitrary.cc G4Polyline.cc G4Polymarker.cc - G4Scale.cc G4Square.cc G4Text.cc + G4Plotter.cc G4VGraphicsScene.cc G4VMarker.cc G4VVisManager.cc diff --git a/source/graphics_reps/src/BooleanProcessor.src b/source/graphics_reps/src/BooleanProcessor.src index e438caea5f..108df38c09 100644 --- a/source/graphics_reps/src/BooleanProcessor.src +++ b/source/graphics_reps/src/BooleanProcessor.src @@ -1929,7 +1929,7 @@ HepPolyhedron BooleanProcessor::createPolyhedron() // A L L O C A T E M E M O R Y ExtPolyhedron polyhedron; - if (nface == 0) return std::move(polyhedron); + if (nface == 0) return HepPolyhedron(polyhedron); polyhedron.AllocateMemory(nnode, nface); // S E T N O D E S @@ -1967,7 +1967,7 @@ HepPolyhedron BooleanProcessor::createPolyhedron() polyhedron.pF[faces[i].inew] = G4Facet(v[0],f[0], v[1],f[1], v[2],f[2], v[3],f[3]); } - return std::move(polyhedron); + return HepPolyhedron(polyhedron); } G4ThreadLocal int BooleanProcessor::ishift = 0; //G.Barrand diff --git a/source/graphics_reps/src/G4AttCheck.cc b/source/graphics_reps/src/G4AttCheck.cc index f47007179d..1a723f37cb 100644 --- a/source/graphics_reps/src/G4AttCheck.cc +++ b/source/graphics_reps/src/G4AttCheck.cc @@ -404,12 +404,10 @@ G4bool G4AttCheck::Standard G4String valueAndUnit; G4String unit; if (extra == "G4BestUnit") { - valueAndUnit = value; - valueAndUnit = valueAndUnit.strip(); + valueAndUnit = G4StrUtil::strip_copy(value); unit = valueAndUnit.substr(valueAndUnit.rfind(' ')+1); } else { - valueAndUnit = value + ' ' + extra; - valueAndUnit = valueAndUnit.strip(); + valueAndUnit = G4StrUtil::strip_copy(value + ' ' + extra); unit = extra; } G4String unitCategory = G4UnitDefinition::GetCategory(unit); diff --git a/source/graphics_reps/src/G4Colour.cc b/source/graphics_reps/src/G4Colour.cc index 0a9a31fdb3..6064924d40 100644 --- a/source/graphics_reps/src/G4Colour.cc +++ b/source/graphics_reps/src/G4Colour.cc @@ -123,8 +123,7 @@ void G4Colour::AddToMap(const G4String& key, const G4Colour& colour) } // Convert to lower case since colour map is case insensitive - G4String myKey(key); - myKey.toLower(); + G4String myKey = G4StrUtil::to_lower_copy(key); std::map::iterator iter = fColourMap.find(myKey); @@ -164,8 +163,7 @@ G4bool G4Colour::GetColour(const G4String& key, G4Colour& result) // Add standard colours to map InitialiseColourMap(); // Initialises if not already initialised - G4String myKey(key); - myKey.toLower(); + G4String myKey = G4StrUtil::to_lower_copy(key); std::map::iterator iter = fColourMap.find(myKey); diff --git a/source/graphics_reps/src/G4Plotter.cc b/source/graphics_reps/src/G4Plotter.cc new file mode 100644 index 0000000000..9a68f8489f --- /dev/null +++ b/source/graphics_reps/src/G4Plotter.cc @@ -0,0 +1,135 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Guy Barrand 25th September 2021 + +#include "G4Plotter.hh" + +G4Plotter::G4Plotter():fColumns(1),fRows(1) {} + +G4Plotter::G4Plotter (const G4Plotter& a_from) +:fColumns(a_from.fColumns) +,fRows(a_from.fRows) +,fStyles(a_from.fStyles) +,fRegionStyles(a_from.fRegionStyles) +,fRegionParameters(a_from.fRegionParameters) +,fRegion_h1ds(a_from.fRegion_h1ds) +,fRegion_h2ds(a_from.fRegion_h2ds) +,fRegion_h1s(a_from.fRegion_h1s) +,fRegion_h2s(a_from.fRegion_h2s) +{} + +G4Plotter& G4Plotter::operator=(const G4Plotter& a_from) { + fColumns = a_from.fColumns; + fRows = a_from.fRows; + fStyles = a_from.fStyles; + fRegionStyles = a_from.fRegionStyles; + fRegionParameters = a_from.fRegionParameters; + fRegion_h1ds = a_from.fRegion_h1ds; + fRegion_h2ds = a_from.fRegion_h2ds; + fRegion_h1s = a_from.fRegion_h1s; + fRegion_h2s = a_from.fRegion_h2s; + return *this; +} + +void G4Plotter::SetLayout(unsigned int a_cols,unsigned int a_rows) { + fColumns = a_cols; + fRows = a_rows; +} +void G4Plotter::AddStyle(const G4String& a_style) { + fStyles.push_back(a_style); +} +void G4Plotter::AddRegionStyle(unsigned int a_region,const G4String& a_style) { + fRegionStyles.push_back(RegionStyle(a_region,a_style)); +} +void G4Plotter::AddRegionParameter(unsigned int a_region,const G4String& a_parameter,const G4String& a_value) { + fRegionParameters.push_back(RegionParameter(a_region,Parameter(a_parameter,a_value))); +} + +void G4Plotter::AddRegionHistogram(unsigned int a_region,tools::histo::h1d* a_h) { + fRegion_h1ds.push_back(Region_h1d(a_region,a_h)); +} +void G4Plotter::AddRegionHistogram(unsigned int a_region,tools::histo::h2d* a_h) { + fRegion_h2ds.push_back(Region_h2d(a_region,a_h)); +} +void G4Plotter::AddRegionH1(unsigned int a_region,int a_id) { + fRegion_h1s.push_back(Region_h1(a_region,a_id)); +} +void G4Plotter::AddRegionH2(unsigned int a_region,int a_id) { + fRegion_h2s.push_back(Region_h2(a_region,a_id)); +} + +void G4Plotter::Reset() { + fColumns = 1; + fRows = 1; + fStyles.clear(); + fRegionStyles.clear(); + fRegionParameters.clear(); + fRegion_h1ds.clear(); + fRegion_h2ds.clear(); + fRegion_h1s.clear(); + fRegion_h2s.clear(); +} +void G4Plotter::Clear() { + fRegion_h1ds.clear(); + fRegion_h2ds.clear(); + fRegion_h1s.clear(); + fRegion_h2s.clear(); +} +void G4Plotter::ClearRegion(unsigned int a_region) { + {std::vector::iterator it; + for(it=fRegion_h1ds.begin();it!=fRegion_h1ds.end();) { + if((*it).first==a_region) { + it = fRegion_h1ds.erase(it); + } else { + ++it; + } + }} + {std::vector::iterator it; + for(it=fRegion_h2ds.begin();it!=fRegion_h2ds.end();) { + if((*it).first==a_region) { + it = fRegion_h2ds.erase(it); + } else { + ++it; + } + }} + + {std::vector::iterator it; + for(it=fRegion_h1s.begin();it!=fRegion_h1s.end();) { + if((*it).first==a_region) { + it = fRegion_h1s.erase(it); + } else { + ++it; + } + }} + {std::vector::iterator it; + for(it=fRegion_h2s.begin();it!=fRegion_h2s.end();) { + if((*it).first==a_region) { + it = fRegion_h2s.erase(it); + } else { + ++it; + } + }} +} diff --git a/source/graphics_reps/src/G4Scale.cc b/source/graphics_reps/src/G4Scale.cc deleted file mode 100644 index 2b92ed292c..0000000000 --- a/source/graphics_reps/src/G4Scale.cc +++ /dev/null @@ -1,68 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// -// John Allison 21st July 2001 - -#include "G4Scale.hh" - -G4Scale::G4Scale (G4double length, const G4String& annotation, - G4Scale::Direction direction, - G4bool autoPlacing, - G4double xmid, G4double ymid, G4double zmid, - G4double annotationSize): - fLength(length), - fAnnotation(annotation), - fAnnotationSize(annotationSize), - fDirection(direction), - fAutoPlacing(autoPlacing), - fXmid(xmid), fYmid(ymid), fZmid(zmid) {} - -G4Scale::~G4Scale () {} - -const G4String G4Scale::GuidanceString -( - "An annotated line in the specified direction with tick marks at the" - "\nend. If autoPlacing is true it is required to be centred at the" - "\nfront, right, bottom corner of the world space, comfortably outside" - "\nthe existing bounding box/sphere so that existing objects do not" - "\nobscure it. Otherwise it is required to be drawn with mid-point at" - "\n(xmid, ymid, zmid)." - "\n" - "\nThe auto placing algorithm might be:" - "\n x = xmin + (1 + comfort) * (xmax - xmin);" - "\n y = ymin - comfort * (ymax - ymin);" - "\n z = zmin + (1 + comfort) * (zmax - zmin);" - "\n if direction == x then (x - length,y,z) to (x,y,z);" - "\n if direction == y then (x,y,z) to (x,y + length,z);" - "\n if direction == z then (x,y,z - length) to (x,y,z);" -); - -const G4String& G4Scale::GetGuidanceString() -{ - return GuidanceString; -} diff --git a/source/graphics_reps/src/G4Text.cc b/source/graphics_reps/src/G4Text.cc index 44945cb555..9440bd7851 100644 --- a/source/graphics_reps/src/G4Text.cc +++ b/source/graphics_reps/src/G4Text.cc @@ -50,27 +50,8 @@ fLayout (left) , fXOffset(0.) , fYOffset(0.) {} -G4Text::G4Text (const G4Text& text): -G4VMarker (text), -fText (text.fText), -fLayout (text.fLayout), -fXOffset (text.fXOffset), -fYOffset (text.fYOffset) -{} - G4Text::~G4Text () {} -G4Text& G4Text::operator= (const G4Text& rhs) -{ - if (&rhs == this) return *this; - G4VMarker::operator=(rhs); - fText = rhs.fText; - fLayout = rhs.fLayout; - fXOffset = rhs.fXOffset; - fYOffset = rhs.fYOffset; - return *this; -} - std::ostream& operator<< (std::ostream& os, const G4Text& text) { os << "G4Text: \"" << text.GetText() diff --git a/source/graphics_reps/src/G4VMarker.cc b/source/graphics_reps/src/G4VMarker.cc index 1c2a994aa1..11cd372346 100644 --- a/source/graphics_reps/src/G4VMarker.cc +++ b/source/graphics_reps/src/G4VMarker.cc @@ -40,15 +40,6 @@ G4VMarker::G4VMarker (): // fInfo: default initialisation. } -G4VMarker::G4VMarker (const G4VMarker& mk): - G4Visible (mk), - fPosition (mk.fPosition), - fWorldSize (mk.fWorldSize), - fScreenSize (mk.fScreenSize), - fFillStyle (mk.fFillStyle), - fInfo (mk.fInfo) -{} - G4VMarker::G4VMarker (const G4Point3D& pos): fPosition (pos), fWorldSize (0.), @@ -61,28 +52,13 @@ G4VMarker::G4VMarker (const G4Point3D& pos): G4VMarker::~G4VMarker () {} -G4VMarker& G4VMarker::operator = (const G4VMarker& mk) { - if (&mk == this) return *this; - G4Visible::operator = (mk); - fPosition = mk.fPosition; - fWorldSize = mk.fWorldSize; - fScreenSize = mk.fScreenSize; - fFillStyle = mk.fFillStyle; - fInfo = mk.fInfo; - return *this; -} - G4bool G4VMarker::operator != (const G4VMarker& mk) const { - if ( - (G4Visible::operator != (mk)) || - (fWorldSize != mk.fWorldSize) || - (fScreenSize != mk.fScreenSize) || - (fFillStyle != mk.fFillStyle) || - !(fPosition == mk.fPosition) || - (fInfo != mk.fInfo) - ) - return true; - return false; + return ( (G4Visible::operator != (mk)) || + (fWorldSize != mk.fWorldSize) || + (fScreenSize != mk.fScreenSize) || + (fFillStyle != mk.fFillStyle) || + !(fPosition == mk.fPosition) || + (fInfo != mk.fInfo) ); } std::ostream& operator << (std::ostream& os, const G4VMarker& marker) { diff --git a/source/graphics_reps/src/G4Visible.cc b/source/graphics_reps/src/G4Visible.cc index c26456eea3..d16a5d2f76 100644 --- a/source/graphics_reps/src/G4Visible.cc +++ b/source/graphics_reps/src/G4Visible.cc @@ -45,6 +45,13 @@ G4Visible::G4Visible (const G4Visible& visible){ else fpVisAttributes = visible.fpVisAttributes; } +G4Visible::G4Visible (G4Visible&& visible){ + fAllocatedVisAttributes = visible.fAllocatedVisAttributes; + fpVisAttributes = visible.fpVisAttributes; + visible.fpVisAttributes = nullptr; + visible.fAllocatedVisAttributes = false; +} + G4Visible::G4Visible (const G4VisAttributes* pVA): fpVisAttributes (pVA), fAllocatedVisAttributes (false) @@ -65,6 +72,16 @@ G4Visible& G4Visible::operator= (const G4Visible& rhs) { return *this; } +G4Visible& G4Visible::operator= (G4Visible&& rhs) { + if (&rhs == this) return *this; + if (fAllocatedVisAttributes) delete fpVisAttributes; + fpVisAttributes = rhs.fpVisAttributes; + fAllocatedVisAttributes = rhs.fAllocatedVisAttributes; + rhs.fpVisAttributes = nullptr; + rhs.fAllocatedVisAttributes = false; + return *this; +} + void G4Visible::SetVisAttributes (const G4VisAttributes& VA) { // Allocate G4VisAttributes on the heap in case the user specifies a // short-lived VA for a long-lived G4Visible. Flag so that it can diff --git a/source/graphics_reps/src/HepPolyhedron.cc b/source/graphics_reps/src/HepPolyhedron.cc index fe6f0ca78d..9964c6dc9e 100644 --- a/source/graphics_reps/src/HepPolyhedron.cc +++ b/source/graphics_reps/src/HepPolyhedron.cc @@ -584,6 +584,7 @@ void HepPolyhedron::RotateAroundZ(G4int nstep, G4double phi, G4double dphi, // A L L O C A T E M E M O R Y AllocateMemory(Nverts, Nfaces); + if (pV == nullptr || pF == nullptr) return; // G E N E R A T E V E R T I C E S @@ -818,6 +819,12 @@ HepPolyhedron::RotateContourAroundZ(G4int nstep, // A L L O C A T E M E M O R Y AllocateMemory(Nverts, Nfaces); + if (pV == nullptr || pF == nullptr) + { + delete [] r; + delete [] z; + return; + } // S E T V E R T I C E S diff --git a/source/intercoms/History b/source/intercoms/History index 7903c90cb9..629920c53f 100644 --- a/source/intercoms/History +++ b/source/intercoms/History @@ -16,6 +16,37 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +26 October, 2021 M. Asai (intercoms-V10-07-14) +- G4UIcommandTree, G4UIdirectory, G4GenericMessenger + - Improve output HTML file layout (L.Garnier) + - Add option to sort command/directory names in alphabetic order (J.Allison) + +25 October, 2021 B.Morgan (intercoms-V10-07-13) +- Use G4StrUtil functions replacing deprecated G4String member functions + +18 October, 2021 B.Morgan (intercoms-V10-07-12) +- Use std::string member functions from G4String in place of synonyms + +1 October, 2021 B. Morgan (intercoms-V10-07-11) +- Use new std::string compliant G4String interfaces + +30 August, 2021 J. Allison (intercoms-V10-07-10) +- G4UIparameter::CandidateCheck : + When candidate not found, print list of candidates. + +11 July, 2021 M. Asai (intercoms-V10-07-08, -09) +- G4GenericMessenger : + Adding G4ThreeVector type without unit to DeclareProperty(). + Removing unnecessary duplications of G4UIdirectory objects. +. +06 July, 2021 M. Asai (intercoms-V10-07-07) +- G4UImanager : adding access methods to individual UI command. + G4UIcommand : adding command-type identiifier. + +30 June, 2021 M. Asai (intercoms-V10-07-06) +- G4UIcontrolMessenger : protect some control commands not to be + broadcasted to worker threads. + 06 May, 2021 G. Cosmo (intercoms-V10-07-05) - Fixed shadowing compilation warning in G4UImanager reported with gcc-11. diff --git a/source/intercoms/include/G4GenericMessenger.hh b/source/intercoms/include/G4GenericMessenger.hh index acd28abe56..5e5015f55e 100644 --- a/source/intercoms/include/G4GenericMessenger.hh +++ b/source/intercoms/include/G4GenericMessenger.hh @@ -128,6 +128,8 @@ class G4GenericMessenger : public G4UImessenger return SetUnit(u, UnitDefault); } Command& SetParameterName(const G4String&, G4bool, G4bool = false); + Command& SetParameterName(const G4String&, const G4String&, const G4String&, + G4bool, G4bool = false); Command& SetDefaultValue(const G4String&); Command& SetCandidates(const G4String&); Command& SetToBeBroadcasted(G4bool s0) @@ -189,6 +191,8 @@ class G4GenericMessenger : public G4UImessenger const G4String& doc = ""); void SetDirectory(const G4String& dir) { directory = dir; } void SetGuidance(const G4String& s); + void Sort(G4bool val = true) + { if(dircmd) dircmd->Sort(val); } private: diff --git a/source/intercoms/include/G4UIcommand.hh b/source/intercoms/include/G4UIcommand.hh index 61bbcf5467..d5fcca9ab5 100644 --- a/source/intercoms/include/G4UIcommand.hh +++ b/source/intercoms/include/G4UIcommand.hh @@ -194,6 +194,20 @@ class G4UIcommand failureDescription = ""; } + public: + enum CommandType + { BaseClassCmd, WithoutParameterCmd, + WithABoolCmd, WithAnIntegerCmd, WithALongIntCmd, + WithADoubleCmd, WithADoubleAndUnitCmd, With3VectorCmd, With3VectorAndUnitCmd, + WithAStringCmd, CmdDirectory = -1 }; + + inline CommandType GetCommandType() const + { return commandType; } + void SetCommandType(CommandType); + + inline void SetDefaultSortFlag(G4bool val) + { ifSort = val; } + protected: // --- the following is used by CheckNewValue() -------- @@ -209,6 +223,8 @@ class G4UIcommand G4int commandFailureCode = 0; G4String failureDescription = ""; + G4bool ifSort = false; + private: void G4UIcommandCommonConstructorCode(const char* theCommandPath); @@ -246,6 +262,8 @@ class G4UIcommand // Data ----------------------------------------------------------- + private: + CommandType commandType = BaseClassCmd; G4UImessenger* messenger = nullptr; G4String commandPath; G4String commandName; diff --git a/source/intercoms/include/G4UIcommandTree.hh b/source/intercoms/include/G4UIcommandTree.hh index 86255ee6ab..d48622f183 100644 --- a/source/intercoms/include/G4UIcommandTree.hh +++ b/source/intercoms/include/G4UIcommandTree.hh @@ -66,7 +66,7 @@ class G4UIcommandTree void List() const; void ListCurrent() const; void ListCurrentWithNum() const; - void CreateHTML(); + void CreateHTML(G4String = ""); inline const G4UIcommand* GetGuidance() const { return guidance; } inline const G4String& GetPathName() const { return pathName; } @@ -91,6 +91,8 @@ class G4UIcommandTree G4UIcommand* guidance = nullptr; G4String pathName; G4bool broadcastCommands = true; + G4bool ifSort = false; + G4int createHTMLTreeLevel = 0; }; #endif diff --git a/source/intercoms/include/G4UIdirectory.hh b/source/intercoms/include/G4UIdirectory.hh index 0d5cbb987b..53e72009fe 100644 --- a/source/intercoms/include/G4UIdirectory.hh +++ b/source/intercoms/include/G4UIdirectory.hh @@ -47,6 +47,12 @@ class G4UIdirectory : public G4UIcommand G4bool commandsToBeBroadcasted = true); // Constructors. The argument is a full path directory which // starts and ends with "/". + + void Sort(G4bool val = true) + { ifSort = val; } + G4bool IfSort() const + { return ifSort; } + // N.B. ifSort is defined in the base class G4UIcommand }; #endif diff --git a/source/intercoms/include/G4UImanager.hh b/source/intercoms/include/G4UImanager.hh index a700d93189..7ff0a37f96 100644 --- a/source/intercoms/include/G4UImanager.hh +++ b/source/intercoms/include/G4UImanager.hh @@ -107,6 +107,13 @@ class G4UImanager : public G4VStateDependent // x00 : G4CommandStatus.hh enumeration // yy : the problematic parameter (first found) + G4UIcommand* FindCommand(const char* aCommand); + G4UIcommand* FindCommand(const G4String& aCommand); + // Find the G4UIcommand object. Null pointer is returned if command + // is not found. + // Please note that each thread returns different objects if this + // method is used in multi-threaded mode. + void StoreHistory(const char* fileName = "G4history.macro"); void StoreHistory(G4bool historySwitch, const char* fileName = "G4history.macro"); diff --git a/source/intercoms/include/G4UImessenger.hh b/source/intercoms/include/G4UImessenger.hh index 037476e580..2f39d8c897 100644 --- a/source/intercoms/include/G4UImessenger.hh +++ b/source/intercoms/include/G4UImessenger.hh @@ -110,10 +110,10 @@ template T* G4UImessenger::CreateCommand(const G4String& cname, const G4String& dsc) { G4String path; - if(cname(0) != '/') + if(cname[0] != '/') { path = baseDirName + cname; - if(path(0) != '/') + if(path[0] != '/') path = "/" + path; } diff --git a/source/intercoms/src/G4GenericMessenger.cc b/source/intercoms/src/G4GenericMessenger.cc index f204f58456..96625961a6 100644 --- a/source/intercoms/src/G4GenericMessenger.cc +++ b/source/intercoms/src/G4GenericMessenger.cc @@ -24,7 +24,17 @@ // // G4GenericMessenger // -// Author: P.Mato, CERN - 27 September 2012 +// Author: +// P.Mato, CERN - 27 September 2012 +// Updates: +// M.Asai, SLAC - 26 November 2013 +// Adding methods with unit declaration and making thread-safe for +// version 10. +// M.Asai, SLAC - 04 May 2014 +// Fix core dump when GetCurrentValue() method is invoked for +// a command defined by DeclareMethod(). +// M.Asai, SLAC - 11 July 2021 +// Adding G4ThreeVector type without unit // -------------------------------------------------------------------- #include "G4GenericMessenger.hh" @@ -32,6 +42,7 @@ #include "G4UImessenger.hh" #include "G4UIcommand.hh" #include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWith3Vector.hh" #include "G4UIcmdWith3VectorAndUnit.hh" #include "G4UIdirectory.hh" #include "G4Threading.hh" @@ -54,18 +65,6 @@ G4GenericMessenger::G4GenericMessenger(void* obj, const G4String& dir, : directory(dir) , object(obj) { - // Check if parent commnand is already existing. - // In fact there is no way to check this. UImanager->GetTree()->FindPath() - // will always rerurn NULL is a dicrectory is given - std::size_t pos = dir.find_last_of('/', dir.size() - 2); - while(pos != 0 && pos != std::string::npos) - { - G4UIdirectory* d = new G4UIdirectory(dir.substr(0, pos + 1).c_str()); - G4String guidance = "Commands for "; - guidance += dir.substr(1, pos - 1); - d->SetGuidance(guidance); - pos = dir.find_last_of('/', pos - 1); - } dircmd = new G4UIdirectory(dir); dircmd->SetGuidance(doc); } @@ -83,23 +82,33 @@ G4GenericMessenger::Command& G4GenericMessenger::DeclareProperty( const G4String& name, const G4AnyType& var, const G4String& doc) { G4String fullpath = directory + name; - G4UIcommand* cmd = new G4UIcommand(fullpath.c_str(), this); - if(doc != "") - cmd->SetGuidance(doc); - char ptype; - if(var.TypeInfo() == typeid(int) || var.TypeInfo() == typeid(long) || - var.TypeInfo() == typeid(unsigned int) || - var.TypeInfo() == typeid(unsigned long)) - ptype = 'i'; - else if(var.TypeInfo() == typeid(float) || var.TypeInfo() == typeid(double)) - ptype = 'd'; - else if(var.TypeInfo() == typeid(bool)) - ptype = 'b'; - else if(var.TypeInfo() == typeid(G4String)) - ptype = 's'; + G4UIcommand* cmd = nullptr; + if(var.TypeInfo() == typeid(G4ThreeVector)) + { + cmd = new G4UIcmdWith3Vector(fullpath.c_str(), this); + (static_cast(cmd)) + ->SetParameterName("valueX", "valueY", "valueZ", false, false); + } else - ptype = 's'; - cmd->SetParameter(new G4UIparameter("value", ptype, false)); + { + cmd = new G4UIcommand(fullpath.c_str(), this); + char ptype; + if(var.TypeInfo() == typeid(int) || var.TypeInfo() == typeid(long) || + var.TypeInfo() == typeid(unsigned int) || + var.TypeInfo() == typeid(unsigned long)) + { ptype = 'i'; } + else if(var.TypeInfo() == typeid(float) || var.TypeInfo() == typeid(double)) + { ptype = 'd'; } + else if(var.TypeInfo() == typeid(bool)) + { ptype = 'b'; } + else if(var.TypeInfo() == typeid(G4String)) + { ptype = 's'; } + else + { ptype = 's'; } + cmd->SetParameter(new G4UIparameter("value", ptype, false)); + } + if(doc != "") + { cmd->SetGuidance(doc); } return properties[name] = Property(var, cmd); } @@ -322,6 +331,31 @@ G4GenericMessenger::Command& G4GenericMessenger::Command::SetParameterName( return *this; } +G4GenericMessenger::Command& G4GenericMessenger::Command::SetParameterName( + const G4String& namex, const G4String& namey, const G4String& namez, + G4bool omittable, G4bool currentAsDefault) +{ + if(*type != typeid(G4ThreeVector)) + { + G4cerr << "This SetParameterName method is for G4ThreeVector!! " + << "Method ignored." << G4endl; + return *this; + } + G4UIparameter* theParam = command->GetParameter(0); + theParam->SetParameterName(namex); + theParam->SetOmittable(omittable); + theParam->SetCurrentAsDefault(currentAsDefault); + theParam = command->GetParameter(1); + theParam->SetParameterName(namey); + theParam->SetOmittable(omittable); + theParam->SetCurrentAsDefault(currentAsDefault); + theParam = command->GetParameter(2); + theParam->SetParameterName(namez); + theParam->SetOmittable(omittable); + theParam->SetCurrentAsDefault(currentAsDefault); + return *this; +} + G4GenericMessenger::Command& G4GenericMessenger::Command::SetCandidates( const G4String& candList) { diff --git a/source/intercoms/src/G4UIbatch.cc b/source/intercoms/src/G4UIbatch.cc index f842236f18..bfa349cdd5 100644 --- a/source/intercoms/src/G4UIbatch.cc +++ b/source/intercoms/src/G4UIbatch.cc @@ -111,15 +111,15 @@ G4String G4UIbatch::ReadCommand() G4String cmdline(linebuf); // TAB-> ' ' conversion - str_size nb = 0; + G4String::size_type nb = 0; while((nb = cmdline.find('\t', nb)) != G4String::npos) { cmdline.replace(nb, 1, " "); } // strip - cmdline = cmdline.strip(G4String::both); - cmdline = cmdline.strip(G4String::trailing, ctrM); + G4StrUtil::strip(cmdline); + G4StrUtil::rstrip(cmdline, ctrM); // skip null line if single line if(!qcontinued && cmdline.size() == 0) @@ -139,7 +139,7 @@ G4String G4UIbatch::ReadCommand() if(tokens[i][(std::size_t) 0] == '#') break; // '\' or '_' is treated as continued line. - if(tokens[i] == '\\' || tokens[i] == '_') + if(tokens[i] == "\\" || tokens[i] == "_") { qcontinued = true; // check nothing after line continuation character @@ -164,7 +164,7 @@ G4String G4UIbatch::ReadCommand() } // strip again - cmdtotal = cmdtotal.strip(G4String::both); + G4StrUtil::strip(cmdtotal); // finally, if(macroStream.eof() && cmdtotal.size() == 0) diff --git a/source/intercoms/src/G4UIbridge.cc b/source/intercoms/src/G4UIbridge.cc index c87eb8e587..575f291c7b 100644 --- a/source/intercoms/src/G4UIbridge.cc +++ b/source/intercoms/src/G4UIbridge.cc @@ -35,7 +35,7 @@ G4UIbridge::G4UIbridge(G4UImanager* localUI, G4String dir) : localUImanager(localUI) { // make sure dirName starts and ends with '/' - if(dir(0, 1) == "/") + if(dir[0] == '/') { dirName = dir; } @@ -43,7 +43,7 @@ G4UIbridge::G4UIbridge(G4UImanager* localUI, G4String dir) { dirName = "/" + dir; } - if(dirName(dirName.length() - 1, 1) != "/") + if(dirName.back() != '/') { dirName += "/"; } diff --git a/source/intercoms/src/G4UIcmdWith3Vector.cc b/source/intercoms/src/G4UIcmdWith3Vector.cc index f9adb3a117..d13c0529c0 100644 --- a/source/intercoms/src/G4UIcmdWith3Vector.cc +++ b/source/intercoms/src/G4UIcmdWith3Vector.cc @@ -41,6 +41,7 @@ G4UIcmdWith3Vector::G4UIcmdWith3Vector(const char* theCommandPath, SetParameter(dblParamY); G4UIparameter* dblParamZ = new G4UIparameter('d'); SetParameter(dblParamZ); + SetCommandType(With3VectorCmd); } // -------------------------------------------------------------------- diff --git a/source/intercoms/src/G4UIcmdWith3VectorAndUnit.cc b/source/intercoms/src/G4UIcmdWith3VectorAndUnit.cc index 5003eebe4f..eac883b91e 100644 --- a/source/intercoms/src/G4UIcmdWith3VectorAndUnit.cc +++ b/source/intercoms/src/G4UIcmdWith3VectorAndUnit.cc @@ -46,8 +46,9 @@ G4UIcmdWith3VectorAndUnit::G4UIcmdWith3VectorAndUnit( G4UIparameter* dblParamZ = new G4UIparameter('d'); SetParameter(dblParamZ); G4UIparameter* untParam = new G4UIparameter('s'); - SetParameter(untParam); untParam->SetParameterName("Unit"); + SetParameter(untParam); + SetCommandType(With3VectorAndUnitCmd); } // -------------------------------------------------------------------- diff --git a/source/intercoms/src/G4UIcmdWithABool.cc b/source/intercoms/src/G4UIcmdWithABool.cc index 0a784b8be2..b5867b8274 100644 --- a/source/intercoms/src/G4UIcmdWithABool.cc +++ b/source/intercoms/src/G4UIcmdWithABool.cc @@ -37,6 +37,7 @@ G4UIcmdWithABool::G4UIcmdWithABool(const char* theCommandPath, { G4UIparameter* blParam = new G4UIparameter('b'); SetParameter(blParam); + SetCommandType(WithABoolCmd); } // -------------------------------------------------------------------- diff --git a/source/intercoms/src/G4UIcmdWithADouble.cc b/source/intercoms/src/G4UIcmdWithADouble.cc index 3d45a5b5ef..e2e336dcd9 100644 --- a/source/intercoms/src/G4UIcmdWithADouble.cc +++ b/source/intercoms/src/G4UIcmdWithADouble.cc @@ -37,6 +37,7 @@ G4UIcmdWithADouble::G4UIcmdWithADouble(const char* theCommandPath, { G4UIparameter* dblParam = new G4UIparameter('d'); SetParameter(dblParam); + SetCommandType(WithADoubleCmd); } // -------------------------------------------------------------------- diff --git a/source/intercoms/src/G4UIcmdWithADoubleAndUnit.cc b/source/intercoms/src/G4UIcmdWithADoubleAndUnit.cc index 053a02dc33..a620260c69 100644 --- a/source/intercoms/src/G4UIcmdWithADoubleAndUnit.cc +++ b/source/intercoms/src/G4UIcmdWithADoubleAndUnit.cc @@ -43,8 +43,9 @@ G4UIcmdWithADoubleAndUnit::G4UIcmdWithADoubleAndUnit( G4UIparameter* dblParam = new G4UIparameter('d'); SetParameter(dblParam); G4UIparameter* untParam = new G4UIparameter('s'); - SetParameter(untParam); untParam->SetParameterName("Unit"); + SetParameter(untParam); + SetCommandType(WithADoubleAndUnitCmd); } // -------------------------------------------------------------------- diff --git a/source/intercoms/src/G4UIcmdWithALongInt.cc b/source/intercoms/src/G4UIcmdWithALongInt.cc index 75a7990e61..8f0820f34f 100644 --- a/source/intercoms/src/G4UIcmdWithALongInt.cc +++ b/source/intercoms/src/G4UIcmdWithALongInt.cc @@ -37,6 +37,7 @@ G4UIcmdWithALongInt::G4UIcmdWithALongInt(const char* theCommandPath, { G4UIparameter* longParam = new G4UIparameter('l'); SetParameter(longParam); + SetCommandType(WithALongIntCmd); } // -------------------------------------------------------------------- diff --git a/source/intercoms/src/G4UIcmdWithAString.cc b/source/intercoms/src/G4UIcmdWithAString.cc index 5c51e0bbd2..7073b740b3 100644 --- a/source/intercoms/src/G4UIcmdWithAString.cc +++ b/source/intercoms/src/G4UIcmdWithAString.cc @@ -37,6 +37,7 @@ G4UIcmdWithAString::G4UIcmdWithAString(const char* theCommandPath, { G4UIparameter* strParam = new G4UIparameter('s'); SetParameter(strParam); + SetCommandType(WithAStringCmd); } // -------------------------------------------------------------------- diff --git a/source/intercoms/src/G4UIcmdWithAnInteger.cc b/source/intercoms/src/G4UIcmdWithAnInteger.cc index 7723f70d7e..ffe3b708a4 100644 --- a/source/intercoms/src/G4UIcmdWithAnInteger.cc +++ b/source/intercoms/src/G4UIcmdWithAnInteger.cc @@ -37,6 +37,7 @@ G4UIcmdWithAnInteger::G4UIcmdWithAnInteger(const char* theCommandPath, { G4UIparameter* intParam = new G4UIparameter('i'); SetParameter(intParam); + SetCommandType(WithAnIntegerCmd); } // -------------------------------------------------------------------- diff --git a/source/intercoms/src/G4UIcmdWithoutParameter.cc b/source/intercoms/src/G4UIcmdWithoutParameter.cc index 0a6b0a031c..f767715e30 100644 --- a/source/intercoms/src/G4UIcmdWithoutParameter.cc +++ b/source/intercoms/src/G4UIcmdWithoutParameter.cc @@ -35,4 +35,5 @@ G4UIcmdWithoutParameter::G4UIcmdWithoutParameter(const char* theCommandPath, G4UImessenger* theMessenger) : G4UIcommand(theCommandPath, theMessenger) { + SetCommandType(WithoutParameterCmd); } diff --git a/source/intercoms/src/G4UIcommand.cc b/source/intercoms/src/G4UIcommand.cc index f154311185..7aeee19b78 100644 --- a/source/intercoms/src/G4UIcommand.cc +++ b/source/intercoms/src/G4UIcommand.cc @@ -57,18 +57,7 @@ G4UIcommand::G4UIcommand(const char* theCommandPath, , messenger(theMessenger) { G4String comStr = theCommandPath; - if(!theMessenger) - { // this must be a directory - if(comStr(comStr.length() - 1) != '/') - { - G4cerr << "G4UIcommand Warning : " << G4endl; - G4cerr << " <" << theCommandPath << "> must be a directory." << G4endl; - G4cerr << " '/' is appended." << G4endl; - comStr += "/"; - } - } G4UIcommandCommonConstructorCode(comStr); - G4String nullString; availabelStateList.clear(); availabelStateList.push_back(G4State_PreInit); availabelStateList.push_back(G4State_Init); @@ -83,8 +72,8 @@ void G4UIcommand::G4UIcommandCommonConstructorCode(const char* theCommandPath) { commandPath = theCommandPath; commandName = theCommandPath; - G4int commandNameIndex = commandName.last('/'); - commandName.remove(0, commandNameIndex + 1); + G4int commandNameIndex = commandName.rfind('/'); + commandName.erase(0, commandNameIndex + 1); #ifdef G4MULTITHREADED if(messenger && messenger->CommandsShouldBeInMaster() && G4Threading::IsWorkerThread()) @@ -101,6 +90,33 @@ void G4UIcommand::G4UIcommandCommonConstructorCode(const char* theCommandPath) #endif } +// -------------------------------------------------------------------- +void G4UIcommand::SetCommandType(CommandType typ) +{ + if(messenger==nullptr) + { // this must be a directory + if(typ != CmdDirectory) + { + G4ExceptionDescription ed; + ed << "A UI command <" << commandPath + << "> is defined without vaild messenger."; + G4Exception("G4UIcommand::SetCommandType","UI2031", + FatalException,ed); + } + else if(commandPath.back() != '/') + { + G4ExceptionDescription ed; + ed << "G4UIcommand Warning : \n" + << " <" << commandPath << "> must be a directory." + << " '/' is appended."; + G4Exception("G4UIcommand::SetCommandType","UI2032", + JustWarning,ed); + commandPath += "/"; + } + } + commandType = typ; +} + // -------------------------------------------------------------------- G4UIcommand::~G4UIcommand() { @@ -149,13 +165,13 @@ G4int G4UIcommand::DoIt(G4String parameterList) correctParameters.append(" "); } aToken = parameterToken(); - if(aToken.length() > 0 && aToken(0) == '"') + if(aToken.length() > 0 && aToken[0] == '"') { - while(aToken(aToken.length() - 1) != '"' || - (aToken.length() == 1 && aToken(0) == '"')) + while(aToken.back() != '"' || + (aToken.length() == 1 && aToken[0] == '"')) { G4String additionalToken = parameterToken(); - if(additionalToken.isNull()) + if(additionalToken.empty()) { return fParameterUnreadable + i_thParameter; } @@ -167,9 +183,9 @@ G4int G4UIcommand::DoIt(G4String parameterList) parameter[i_thParameter]->GetParameterType() == 's') { G4String anotherToken; - while(!((anotherToken = parameterToken()).isNull())) + while(!((anotherToken = parameterToken()).empty())) { - G4int idxs = anotherToken.index("#"); + G4int idxs = anotherToken.find("#"); if(idxs == G4int(std::string::npos)) { aToken += " "; @@ -178,7 +194,7 @@ G4int G4UIcommand::DoIt(G4String parameterList) else if(idxs > 0) { aToken += " "; - aToken += anotherToken(0, idxs); + aToken += anotherToken.substr(0, idxs); break; } else @@ -188,7 +204,7 @@ G4int G4UIcommand::DoIt(G4String parameterList) } } - if(aToken.isNull() || aToken == "!") + if(aToken.empty() || aToken == "!") { if(parameter[i_thParameter]->IsOmittable()) { @@ -199,12 +215,12 @@ G4int G4UIcommand::DoIt(G4String parameterList) for(G4int ii = 0; ii < i_thParameter; ++ii) { parVal = cvSt(); - if(parVal(0) == '"') + if(parVal[0] == '"') { - while(parVal(parVal.length() - 1) != '"') + while(parVal.back() != '"') { G4String additionalToken = cvSt(); - if(additionalToken.isNull()) + if(additionalToken.empty()) { return fParameterUnreadable + i_thParameter; } @@ -214,19 +230,18 @@ G4int G4UIcommand::DoIt(G4String parameterList) } } G4String aCVToken = cvSt(); - if(aCVToken(0) == '"') + if(aCVToken[0] == '"') { - while(aCVToken(aCVToken.length() - 1) != '"') + while(aCVToken.back() != '"') { G4String additionalToken = cvSt(); - if(additionalToken.isNull()) + if(additionalToken.empty()) { return fParameterUnreadable + i_thParameter; } aCVToken += " "; aCVToken += additionalToken; } - // aCVToken.strip(G4String::both,'"'); } correctParameters.append(aCVToken); } @@ -396,7 +411,7 @@ void G4UIcommand::List() { G4cout << G4endl; G4cout << G4endl; - if(commandPath(commandPath.length() - 1) != '/') + if(commandPath.back() != '/') { G4cout << "Command " << commandPath << G4endl; } @@ -410,7 +425,7 @@ void G4UIcommand::List() { G4cout << commandGuidance[i_thGuidance] << G4endl; } - if(!rangeString.isNull()) + if(!rangeString.empty()) { G4cout << " Range of parameters : " << rangeString << G4endl; } @@ -529,8 +544,7 @@ G4String G4UIcommand::ConvertToString(G4ThreeVector vec, const char* unitName) // -------------------------------------------------------------------- G4bool G4UIcommand::ConvertToBool(const char* st) { - G4String v = st; - v.toUpper(); + G4String v = G4StrUtil::to_upper_copy(st); G4bool vl = false; if(v == "Y" || v == "YES" || v == "1" || v == "T" || v == "TRUE") { @@ -612,7 +626,7 @@ G4int G4UIcommand::CheckNewValue(const char* newValue) { yystype result; // if( TypeCheck(newValue) == 0 ) return 1; - if(!rangeString.isNull()) + if(!rangeString.empty()) { if(RangeCheck(newValue) == 0) return fParameterOutOfRange; @@ -656,7 +670,7 @@ G4int G4UIcommand::TypeCheck(const char* t) case 'S': break; case 'B': - aNewValue.toUpper(); + G4StrUtil::to_upper(aNewValue); if(aNewValue == "Y" || aNewValue == "N" || aNewValue == "YES" || aNewValue == "NO" || aNewValue == "1" || aNewValue == "0" || aNewValue == "T" || aNewValue == "F" || aNewValue == "TRUE" || @@ -1503,7 +1517,7 @@ tokenNum G4UIcommand::Yylex() // reads input and returns token number, KR486 { // I or D do { - buf += G4String((unsigned char) c); + buf += (unsigned char)c; c = G4UIpGetc(); } while(c == '.' || isdigit(c) || c == 'e' || c == 'E' || c == '+' || c == '-'); @@ -1530,7 +1544,7 @@ tokenNum G4UIcommand::Yylex() // reads input and returns token number, KR486 { // IDENTIFIER do { - buf += G4String((unsigned char) c); + buf += (unsigned char) c; } while((c = G4UIpGetc()) != EOF && (isalnum(c) || c == '_')); G4UIpUngetc(c); if(IsParameter(buf)) @@ -1579,7 +1593,7 @@ G4int G4UIcommand::G4UIpGetc() { // emulation of getc() G4int length = rangeString.length(); if(bp < length) - return rangeString(bp++); + return rangeString[bp++]; else return EOF; } @@ -1589,14 +1603,14 @@ G4int G4UIcommand::G4UIpUngetc(G4int c) { // emulation of ungetc() if(c < 0) return -1; - if(bp > 0 && c == rangeString(bp - 1)) + if(bp > 0 && c == rangeString[bp - 1]) { --bp; } else { G4cerr << "G4UIpUngetc() failed." << G4endl; - G4cerr << "bp=" << bp << " c=" << c << " pR(bp-1)=" << rangeString(bp - 1) + G4cerr << "bp=" << bp << " c=" << c << " pR(bp-1)=" << rangeString[bp - 1] << G4endl; paramERR = 1; return -1; diff --git a/source/intercoms/src/G4UIcommandTree.cc b/source/intercoms/src/G4UIcommandTree.cc index 2b1fe4c9af..c7902fee5d 100644 --- a/source/intercoms/src/G4UIcommandTree.cc +++ b/source/intercoms/src/G4UIcommandTree.cc @@ -1,4 +1,3 @@ -// // ******************************************************************** // * License and Disclaimer * // * * @@ -26,10 +25,15 @@ // G4UIcommandTree // // Author: Makoto Asai (SLAC), 1998 +// Midified: Makoto Asai (SLAC), 2021 +// Improve output HTML file layout and add option to sort +// command/directory names in alphabetic order // -------------------------------------------------------------------- #include "G4UIcommandTree.hh" +#include "G4UIdirectory.hh" #include "G4StateManager.hh" +#include "G4UImanager.hh" #include #include "G4ios.hh" @@ -73,43 +77,68 @@ void G4UIcommandTree::AddNewCommand(G4UIcommand* newCommand, { G4String commandPath = newCommand->GetCommandPath(); G4String remainingPath = commandPath; - remainingPath.remove(0, pathName.length()); - if(remainingPath.isNull()) + remainingPath.erase(0, pathName.length()); + if(remainingPath.empty()) { if(!guidance) { guidance = newCommand; if(!(newCommand->ToBeBroadcasted())) - broadcastCommands = false; + { broadcastCommands = false; } if(workerThreadOnly) - newCommand->SetWorkerThreadOnly(); + { newCommand->SetWorkerThreadOnly(); } } return; } - G4int i = remainingPath.first('/'); + + if(guidance) + { + G4UIdirectory* dir = static_cast(guidance); + ifSort = dir->IfSort(); + } + G4int i = remainingPath.find('/'); if(i == G4int(std::string::npos)) { - // Find command + // Adding a new command to this directory G4int n_commandEntry = command.size(); for(G4int i_thCommand = 0; i_thCommand < n_commandEntry; ++i_thCommand) { if(remainingPath == command[i_thCommand]->GetCommandName()) { + // a command of same name has already defined. do nothing and return. + if(G4UImanager::GetUIpointer()->GetVerboseLevel() > 8) + { + G4ExceptionDescription ed; + ed << "Command <" << commandPath << "> already exist. New command is not added."; + G4Exception("G4UIcommandTree::AddNewCommand","UI_ComTree_001", + //FatalException, + JustWarning, + ed); + } return; } } if(!broadcastCommands) - newCommand->SetToBeBroadcasted(false); + { newCommand->SetToBeBroadcasted(false); } if(workerThreadOnly) - newCommand->SetWorkerThreadOnly(); - command.push_back(newCommand); + { newCommand->SetWorkerThreadOnly(); } + if(ifSort) + { + auto j = command.begin(); + for(; j != command.end(); ++j) { + if (newCommand->GetCommandPath() < (*j)->GetCommandPath()) { break; } + } + command.insert(j,newCommand); + } + else + { command.push_back(newCommand); } return; } else { - // Find path + // Adding a new command to a sub-directory G4String nextPath = pathName; - nextPath.append(remainingPath(0, i + 1)); + nextPath.append(remainingPath.substr(0, i + 1)); G4int n_treeEntry = tree.size(); for(G4int i_thTree = 0; i_thTree < n_treeEntry; ++i_thTree) { @@ -121,10 +150,23 @@ void G4UIcommandTree::AddNewCommand(G4UIcommand* newCommand, return; } } + // Creating a new sub-directory G4UIcommandTree* newTree = new G4UIcommandTree(nextPath); - tree.push_back(newTree); + if(ifSort) + { + auto j = tree.begin(); + for(; j != tree.end(); ++j) { + if (newTree->GetPathName() < (*j)->GetPathName()) { break; } + } + tree.insert(j,newTree); + } + else + { tree.push_back(newTree); } if(!broadcastCommands) - newCommand->SetToBeBroadcasted(false); + { newCommand->SetToBeBroadcasted(false); } + // In case a new sub-directry is created with a new G4UIdirectory + // (most-likely this is the case), inherit the sort flag + newCommand->SetDefaultSortFlag(ifSort); newTree->AddNewCommand(newCommand, workerThreadOnly); return; } @@ -138,14 +180,14 @@ void G4UIcommandTree::RemoveCommand(G4UIcommand* aCommand, return; G4String commandPath = aCommand->GetCommandPath(); G4String remainingPath = commandPath; - remainingPath.remove(0, pathName.length()); - if(remainingPath.isNull()) + remainingPath.erase(0, pathName.length()); + if(remainingPath.empty()) { guidance = nullptr; } else { - G4int i = remainingPath.first('/'); + G4int i = remainingPath.find('/'); if(i == G4int(std::string::npos)) { // Find command @@ -163,7 +205,7 @@ void G4UIcommandTree::RemoveCommand(G4UIcommand* aCommand, { // Find path G4String nextPath = pathName; - nextPath.append(remainingPath(0, i + 1)); + nextPath.append(remainingPath.substr(0, i + 1)); G4int n_treeEntry = tree.size(); for(G4int i_thTree = 0; i_thTree < n_treeEntry; ++i_thTree) { @@ -191,12 +233,12 @@ G4UIcommand* G4UIcommandTree::FindPath(const char* commandPath) const // This function tries to match a command name G4String remainingPath = commandPath; - if(remainingPath.index(pathName) == std::string::npos) + if(remainingPath.find(pathName) == std::string::npos) { return nullptr; } - remainingPath.remove(0, pathName.length()); - G4int i = remainingPath.first('/'); + remainingPath.erase(0, pathName.length()); + G4int i = remainingPath.find('/'); if(i == G4int(std::string::npos)) { // Find command @@ -213,7 +255,7 @@ G4UIcommand* G4UIcommandTree::FindPath(const char* commandPath) const { // Find path G4String nextPath = pathName; - nextPath.append(remainingPath(0, i + 1)); + nextPath.append(remainingPath.substr(0, i + 1)); G4int n_treeEntry = tree.size(); for(G4int i_thTree = 0; i_thTree < n_treeEntry; ++i_thTree) { @@ -234,17 +276,17 @@ G4UIcommandTree* G4UIcommandTree::FindCommandTree(const char* commandPath) // @return the commandTree found or nullptr if not G4String remainingPath = commandPath; - if(remainingPath.index(pathName) == std::string::npos) + if(remainingPath.find(pathName) == std::string::npos) { return nullptr; } - remainingPath.remove(0, pathName.length()); - G4int i = remainingPath.first('/'); + remainingPath.erase(0, pathName.length()); + G4int i = remainingPath.find('/'); if(i != G4int(std::string::npos)) { // Find path G4String nextPath = pathName; - nextPath.append(remainingPath(0, i + 1)); + nextPath.append(remainingPath.substr(0, i + 1)); G4int n_treeEntry = tree.size(); for(G4int i_thTree = 0; i_thTree < n_treeEntry; ++i_thTree) { @@ -274,9 +316,9 @@ G4String G4UIcommandTree::CompleteCommandPath(const G4String& aCommandPath) G4String matchingPath = empty; // find the tree - G4int jpre = pName.last('/'); - if(jpre != G4int(G4String::npos)) - pName.remove(jpre + 1); + auto jpre = pName.rfind('/'); + if(jpre != G4String::npos) + pName.erase(jpre + 1); G4UIcommandTree* aTree = FindCommandTree(pName); if(!aTree) @@ -284,7 +326,7 @@ G4String G4UIcommandTree::CompleteCommandPath(const G4String& aCommandPath) return empty; } - if(pName.index(pName) == std::string::npos) + if(pName.find(pName) == std::string::npos) return empty; std::vector paths; @@ -301,7 +343,7 @@ G4String G4UIcommandTree::CompleteCommandPath(const G4String& aCommandPath) { G4String fpdir = aTree->GetTree(idir)->GetPathName(); // matching test - if(fpdir.index(remainingPath, 0) == 0) + if(fpdir.find(remainingPath, 0) == 0) { if(nMatch == 0) { @@ -333,7 +375,7 @@ G4String G4UIcommandTree::CompleteCommandPath(const G4String& aCommandPath) G4String fpcmd = aTree->GetPathName() + aTree->GetCommand(icmd)->GetCommandName(); // matching test - if(fpcmd.index(remainingPath, 0) == 0) + if(fpcmd.find(remainingPath, 0) == 0) { if(nMatch == 0) { @@ -472,9 +514,9 @@ G4String G4UIcommandTree::CreateFileName(const char* pName) { G4String fn = pName; G4int idxs; - while((idxs = fn.index("/")) != G4int(std::string::npos)) + while((idxs = fn.find("/")) != G4int(std::string::npos)) { - fn(idxs) = '_'; + fn[idxs] = '_'; } fn += ".html"; return fn; @@ -487,7 +529,7 @@ G4String G4UIcommandTree::ModStr(const char* strS) G4String str = strS; for(G4int i = 0; i < G4int(str.length()); ++i) { - char c = str(i); + char c = str[i]; switch(c) { case '<': @@ -507,15 +549,91 @@ G4String G4UIcommandTree::ModStr(const char* strS) } // -------------------------------------------------------------------- -void G4UIcommandTree::CreateHTML() +void G4UIcommandTree::CreateHTML(G4String sideBar) { G4String ofileName = CreateFileName(pathName); std::ofstream oF(ofileName, std::ios::out); oF << "Commands in " << ModStr(pathName) << "" << G4endl; - oF << "

      " << ModStr(pathName) << "

      " - << G4endl; + oF << ""<< G4endl; + oF << "" << G4endl; + + // Left Panel + if (createHTMLTreeLevel == 0 ) { + oF << "

      " << sideBar << "
      " << G4endl; + } + // Right Panel + oF << "
      "; + oF << "

      " << ModStr(pathName) << "

      " << G4endl; if(guidance != nullptr) { @@ -524,100 +642,127 @@ void G4UIcommandTree::CreateHTML() oF << ModStr(guidance->GetGuidanceLine(i)) << "
      " << G4endl; } } - - oF << "


      " << G4endl; - - oF << "

      Sub-directories :

      " << G4endl; - for(std::size_t i_thTree = 0; i_thTree < tree.size(); ++i_thTree) - { - oF << "


      GetPathName()) << "\">" - << ModStr(tree[i_thTree]->GetPathName()) << "" << G4endl; - oF << "

      " << ModStr(tree[i_thTree]->GetTitle()) << G4endl; - tree[i_thTree]->CreateHTML(); + if (tree.size() >0 ){ + G4String menu = ""; + G4String newSideBar = ""; + menu += "

      Sub-directories

      "; + newSideBar += "

      Top level

      "; + // Build menu short version + for(std::size_t i_thTree = 0; i_thTree < tree.size(); ++i_thTree) + { + newSideBar += ""; + } + menu += "
      GetPathName()) + "\">" + + ModStr(tree[i_thTree]->GetPathName()) + ""; + } + // Build menu + for(std::size_t i_thTree = 0; i_thTree < tree.size(); ++i_thTree) + { + menu += "
      GetPathName()) + "\">" + + ModStr(tree[i_thTree]->GetPathName()) + ""; + menu += "" + ModStr(tree[i_thTree]->GetTitle()) + "
      "; + newSideBar += ""; + for(std::size_t i_thTree = 0; i_thTree < tree.size(); ++i_thTree) + { + createHTMLTreeLevel ++; + tree[i_thTree]->CreateHTML(newSideBar); + createHTMLTreeLevel --; + } + oF << menu << G4endl; } - oF << "


      " << G4endl; - - oF << "

      Commands :

      " << G4endl; - for(std::size_t i_thCommand = 0; i_thCommand < command.size(); ++i_thCommand) - { - G4UIcommand* cmd = command[i_thCommand]; - oF << "


      " << ModStr(cmd->GetCommandName()); - if(cmd->GetParameterEntries() > 0) + if (command.size() >0 ){ + oF << "

      Commands

      " << G4endl; + + // resume + oF << "" << G4endl; + for(std::size_t i_thCommand = 0; i_thCommand < command.size(); ++i_thCommand) { - for(std::size_t i_thParam = 0; i_thParam < cmd->GetParameterEntries(); - ++i_thParam) + G4UIcommand* cmd = command[i_thCommand]; + oF << "" << G4endl; + } + oF << "
      "<< ModStr(cmd->GetCommandName()); + oF << "
      " << G4endl; + for(std::size_t i_thCommand = 0; i_thCommand < command.size(); ++i_thCommand) + { + G4UIcommand* cmd = command[i_thCommand]; + oF << "

      " << ModStr(cmd->GetCommandName()); + if(cmd->GetParameterEntries() > 0) { - oF << " [" - << ModStr(cmd->GetParameter(i_thParam)->GetParameterName()) - << "]"; - } - } - oF << "" << G4endl; - oF << "

      " << G4endl; - for(std::size_t i = 0; i < cmd->GetGuidanceEntries(); ++i) - { - oF << ModStr(cmd->GetGuidanceLine(i)) << "
      " << G4endl; - } - if(!(cmd->GetRange()).isNull()) - { - oF << "

      Range : " << ModStr(cmd->GetRange()) << G4endl; - } - std::vector* availabelStateList = cmd->GetStateList(); - if(availabelStateList->size() == 6) - { - oF << "

      Available at all Geant4 states." << G4endl; - } - else - { - oF << "

      Available Geant4 state(s) : "; - for(std::size_t ias = 0; ias < availabelStateList->size(); ++ias) - { - oF << G4StateManager::GetStateManager()->GetStateString( - (*availabelStateList)[ias]) - << " " << G4endl; - } - } - if(cmd->GetParameterEntries() > 0) - { - oF << "

      Parameters" << G4endl; - for(std::size_t i_thParam = 0; i_thParam < cmd->GetParameterEntries(); - ++i_thParam) - { - G4UIparameter* prm = cmd->GetParameter(i_thParam); - oF << "
      " << ModStr(prm->GetParameterName()) << G4endl; - oF << "type " << prm->GetParameterType() << G4endl; - oF << ""; - if(prm->IsOmittable()) + for(std::size_t i_thParam = 0; i_thParam < cmd->GetParameterEntries(); + ++i_thParam) { - oF << "Omittable : "; - if(prm->GetCurrentAsDefault()) + oF << " [" + << ModStr(cmd->GetParameter(i_thParam)->GetParameterName()) + << "]"; + } + } + oF << "" << G4endl; + oF << "

      " << G4endl; + for(std::size_t i = 0; i < cmd->GetGuidanceEntries(); ++i) + { + oF << ModStr(cmd->GetGuidanceLine(i)) << "
      " << G4endl; + } + if(!(cmd->GetRange()).empty()) + { + oF << "

      Range : " << ModStr(cmd->GetRange()) << G4endl; + } + std::vector* availabelStateList = cmd->GetStateList(); + if(availabelStateList->size() == 6) + { + oF << "

      Available at all Geant4 states." << G4endl; + } + else + { + oF << "

      Available Geant4 state(s) : "; + for(std::size_t ias = 0; ias < availabelStateList->size(); ++ias) + { + oF << G4StateManager::GetStateManager()->GetStateString( + (*availabelStateList)[ias]) + << " " << G4endl; + } + } + if(cmd->GetParameterEntries() > 0) + { + oF << "

      Parameters" << G4endl; + for(std::size_t i_thParam = 0; i_thParam < cmd->GetParameterEntries(); + ++i_thParam) + { + G4UIparameter* prm = cmd->GetParameter(i_thParam); + oF << "
      " << ModStr(prm->GetParameterName()) << G4endl; + oF << "type " << prm->GetParameterType() << G4endl; + oF << ""; + if(prm->IsOmittable()) { - oF << "current value is used as the default value." << G4endl; + oF << "Omittable : "; + if(prm->GetCurrentAsDefault()) + { + oF << "current value is used as the default value." << G4endl; + } + else + { + oF << "default value = " << prm->GetDefaultValue() << G4endl; + } } - else + oF << ""; + if(!(prm->GetParameterRange()).empty()) { - oF << "default value = " << prm->GetDefaultValue() << G4endl; + oF << "Parameter range : " << ModStr(prm->GetParameterRange()) + << G4endl; + } + else if(!(prm->GetParameterCandidates()).empty()) + { + oF << "Parameter candidates : " + << ModStr(prm->GetParameterCandidates()) << G4endl; } } - oF << ""; - if(!(prm->GetParameterRange()).isNull()) - { - oF << "Parameter range : " << ModStr(prm->GetParameterRange()) - << G4endl; - } - else if(!(prm->GetParameterCandidates()).isNull()) - { - oF << "Parameter candidates : " - << ModStr(prm->GetParameterCandidates()) << G4endl; - } + oF << "
      " << G4endl; } - oF << "

      " << G4endl; } } - - oF << "

      " << G4endl; + oF << "
      " << G4endl; oF.close(); } diff --git a/source/intercoms/src/G4UIcontrolMessenger.cc b/source/intercoms/src/G4UIcontrolMessenger.cc index a728a4eeab..369d8db4da 100644 --- a/source/intercoms/src/G4UIcontrolMessenger.cc +++ b/source/intercoms/src/G4UIcontrolMessenger.cc @@ -132,10 +132,12 @@ G4UIcontrolMessenger::G4UIcontrolMessenger() historyCommand->SetGuidance("Defaul file name is G4history.macro."); historyCommand->SetParameterName("fileName", true); historyCommand->SetDefaultValue("G4History.macro"); + historyCommand->SetToBeBroadcasted(false); stopStoreHistoryCommand = new G4UIcmdWithoutParameter("/control/stopSavingHistory", this); stopStoreHistoryCommand->SetGuidance("Stop saving history file."); + stopStoreHistoryCommand->SetToBeBroadcasted(false); aliasCommand = new G4UIcommand("/control/alias", this); aliasCommand->SetGuidance("Set an alias."); @@ -160,6 +162,7 @@ G4UIcontrolMessenger::G4UIcontrolMessenger() getEnvCmd = new G4UIcmdWithAString("/control/getEnv", this); getEnvCmd->SetGuidance( "Get a shell environment variable and define it as an alias."); + getEnvCmd->SetToBeBroadcasted(false); getValCmd = new G4UIcommand("/control/getVal", this); getValCmd->SetGuidance( @@ -174,12 +177,15 @@ G4UIcontrolMessenger::G4UIcontrolMessenger() G4UIparameter* iIdxParam = new G4UIparameter("iIdx", 'i', true); iIdxParam->SetDefaultValue(0); getValCmd->SetParameter(iIdxParam); + getValCmd->SetToBeBroadcasted(false); echoCmd = new G4UIcmdWithAString("/control/echo", this); - echoCmd->SetGuidance("Display the aliased value."); + echoCmd->SetGuidance("Display the valuerameter string."); + echoCmd->SetGuidance("If alias is contained, it is converted to the aliased value."); shellCommand = new G4UIcmdWithAString("/control/shell", this); shellCommand->SetGuidance("Execute a (Unix) SHELL command."); + shellCommand->SetToBeBroadcasted(false); ManualCommand = new G4UIcmdWithAString("/control/manual", this); ManualCommand->SetGuidance("Display all of sub-directories and commands."); @@ -485,11 +491,11 @@ void G4UIcontrolMessenger::SetNewValue(G4UIcommand* command, G4String newValue) G4String aliName = next(); G4String com = next(); G4String curVal = UI->GetCurrentValues(com); - if(!(curVal.isNull())) + if(!(curVal.empty())) { G4String theValue = curVal; G4String iIdx = next(); - if(!(iIdx.isNull())) + if(!(iIdx.empty())) { G4int idx = StoI(iIdx); G4Tokenizer nextVal(curVal); @@ -581,21 +587,21 @@ void G4UIcontrolMessenger::SetNewValue(G4UIcommand* command, G4String newValue) G4String c1 = next(); G4String ca; - while(!((ca = next()).isNull())) + while(!((ca = next()).empty())) { c1 += " "; c1 += ca; } - if(c1(0) == '"') + if(c1[0] == '"') { G4String strippedValue; - if(c1(c1.length() - 1) == '"') + if(c1.back() == '"') { - strippedValue = c1(1, c1.length() - 2); + strippedValue = c1.substr(1, c1.length() - 2); } else { - strippedValue = c1(1, c1.length() - 1); + strippedValue = c1.substr(1, c1.length() - 1); } c1 = strippedValue; } @@ -704,21 +710,21 @@ void G4UIcontrolMessenger::SetNewValue(G4UIcommand* command, G4String newValue) G4String c1 = next(); G4String ca; - while(!((ca = next()).isNull())) + while(!((ca = next()).empty())) { c1 += " "; c1 += ca; } - if(c1(0) == '"') + if(c1[0] == '"') { G4String strippedValue; - if(c1(c1.length() - 1) == '"') + if(c1.back() == '"') { - strippedValue = c1(1, c1.length() - 2); + strippedValue = c1.substr(1, c1.length() - 2); } else { - strippedValue = c1(1, c1.length() - 1); + strippedValue = c1.substr(1, c1.length() - 1); } c1 = strippedValue; } diff --git a/source/intercoms/src/G4UIdirectory.cc b/source/intercoms/src/G4UIdirectory.cc index 56077bdef9..2748f3e65c 100644 --- a/source/intercoms/src/G4UIdirectory.cc +++ b/source/intercoms/src/G4UIdirectory.cc @@ -35,6 +35,7 @@ G4UIdirectory::G4UIdirectory(char* theCommandPath, G4bool commandsToBeBroadcasted) : G4UIcommand(theCommandPath, nullptr, commandsToBeBroadcasted) { + SetCommandType(CmdDirectory); } // -------------------------------------------------------------------- @@ -42,4 +43,5 @@ G4UIdirectory::G4UIdirectory(const char* theCommandPath, G4bool commandsToBeBroadcasted) : G4UIcommand(theCommandPath, nullptr, commandsToBeBroadcasted) { + SetCommandType(CmdDirectory); } diff --git a/source/intercoms/src/G4UImanager.cc b/source/intercoms/src/G4UImanager.cc index 1028573d77..494c3d715f 100644 --- a/source/intercoms/src/G4UImanager.cc +++ b/source/intercoms/src/G4UImanager.cc @@ -186,7 +186,7 @@ G4String G4UImanager::GetCurrentStringValue(const char* aCommand, for(G4int i_thParameter = 0; i_thParameter < parameterNumber; ++i_thParameter) { token = savedToken(); - if(token.isNull()) + if(token.empty()) return G4String(); if(token[(size_t) 0] == '"') { @@ -370,23 +370,23 @@ void G4UImanager::ForeachS(const char* valueList) G4String vn = parameterToken(); G4String c1 = parameterToken(); G4String ca; - while(!((ca = parameterToken()).isNull())) + while(!((ca = parameterToken()).empty())) { c1 += " "; c1 += ca; } G4String aliasValue = c1; - if(aliasValue(0) == '"') + if(aliasValue[0] == '"') { G4String strippedValue; - if(aliasValue(aliasValue.length() - 1) == '"') + if(aliasValue.back() == '"') { - strippedValue = aliasValue(1, aliasValue.length() - 2); + strippedValue = aliasValue.substr(1, aliasValue.length() - 2); } else { - strippedValue = aliasValue(1, aliasValue.length() - 1); + strippedValue = aliasValue.substr(1, aliasValue.length() - 1); } aliasValue = strippedValue; } @@ -402,7 +402,7 @@ void G4UImanager::Foreach(const char* macroFile, const char* variableName, G4String candidatesString = candidates; G4Tokenizer parameterToken(candidatesString); G4String cd; - while(!((cd = parameterToken()).isNull())) + while(!((cd = parameterToken()).empty())) { G4String vl = variableName; vl += " "; @@ -424,15 +424,15 @@ void G4UImanager::Foreach(const char* macroFile, const char* variableName, G4String G4UImanager::SolveAlias(const char* aCmd) { G4String aCommand = aCmd; - G4int ia = aCommand.index("{"); - G4int iz = aCommand.index("#"); + G4int ia = aCommand.find("{"); + G4int iz = aCommand.find("#"); while((ia != G4int(std::string::npos)) && ((iz == G4int(std::string::npos)) || (ia < iz))) { G4int ibx = -1; while(ibx < 0) { - G4int ib = aCommand.index("}"); + G4int ib = aCommand.find("}"); if(ib == G4int(std::string::npos)) { G4cerr << aCommand << G4endl; @@ -443,9 +443,9 @@ G4String G4UImanager::SolveAlias(const char* aCmd) G4String nullStr; return nullStr; } - G4String ps = aCommand(ia + 1, aCommand.length() - (ia + 1)); - G4int ic = ps.index("{"); - G4int id = ps.index("}"); + G4String ps = aCommand.substr(ia + 1, aCommand.length() - (ia + 1)); + G4int ic = ps.find("{"); + G4int id = ps.find("}"); if(ic != G4int(std::string::npos) && ic < id) { ia += ic + 1; @@ -459,9 +459,9 @@ G4String G4UImanager::SolveAlias(const char* aCmd) //--- and ibx represents corresponding "}" G4String subs; if(ia > 0) - subs = aCommand(0, ia); - G4String alis = aCommand(ia + 1, ibx - ia - 1); - G4String rems = aCommand(ibx + 1, aCommand.length() - ibx); + subs = aCommand.substr(0, ia); + G4String alis = aCommand.substr(ia + 1, ibx - ia - 1); + G4String rems = aCommand.substr(ibx + 1, aCommand.length() - ibx); G4String* alVal = aliasList->FindAlias(alis); if(!alVal) { @@ -470,7 +470,7 @@ G4String G4UImanager::SolveAlias(const char* aCmd) return nullStr; } aCommand = subs + (*alVal) + rems; - ia = aCommand.index("{"); + ia = aCommand.find("{"); } return aCommand; } @@ -485,7 +485,7 @@ G4int G4UImanager::ApplyCommand(const G4String& aCmd) G4int G4UImanager::ApplyCommand(const char* aCmd) { G4String aCommand = SolveAlias(aCmd); - if(aCommand.isNull()) + if(aCommand.empty()) return fAliasNotFound; if(verboseLevel) { if (isMaster) fLastCommandOutputTreated = false; @@ -494,11 +494,11 @@ G4int G4UImanager::ApplyCommand(const char* aCmd) G4String commandString; G4String commandParameter; - std::size_t i = aCommand.index(" "); + std::size_t i = aCommand.find(" "); if(i != std::string::npos) { - commandString = aCommand(0, i); - commandParameter = aCommand(i + 1, aCommand.length() - (i + 1)); + commandString = aCommand.substr(0, i); + commandParameter = aCommand.substr(i + 1, aCommand.length() - (i + 1)); } else { @@ -512,16 +512,17 @@ G4int G4UImanager::ApplyCommand(const char* aCmd) G4String a2; while(ll < len - 1) { - if(commandString(ll, 2) == "//") + if(commandString.substr(ll, 2) == "//") { if(ll == 0) { - commandString.remove(ll, 1); + // Safe because index argument always 0 + commandString.erase(ll, 1); } else { - a1 = commandString(0, ll); - a2 = commandString(ll + 1, len - ll - 1); + a1 = commandString.substr(0, ll); + a2 = commandString.substr(ll + 1, len - ll - 1); commandString = a1 + a2; } --len; @@ -537,7 +538,7 @@ G4int G4UImanager::ApplyCommand(const char* aCmd) for(auto itr = bridges->cbegin(); itr != bridges->cend(); ++itr) { G4int leng = (*itr)->DirLength(); - if(commandString(0, leng) == (*itr)->DirName()) + if(commandString.substr(0, leng) == (*itr)->DirName()) { return (*itr)->LocalUI()->ApplyCommand(commandString + " " + commandParameter); @@ -597,6 +598,31 @@ G4int G4UImanager::ApplyCommand(const char* aCmd) return commandFailureCode; } + +// -------------------------------------------------------------------- +G4UIcommand* G4UImanager::FindCommand(const G4String& aCmd) +{ + return FindCommand(aCmd.data()); +} + +// -------------------------------------------------------------------- +G4UIcommand* G4UImanager::FindCommand(const char* aCmd) +{ + G4String aCommand = SolveAlias(aCmd); + if(aCommand.empty()) + { return nullptr; } + + G4String commandString; + + std::size_t i = aCommand.find(" "); + if(i != std::string::npos) + { commandString = aCommand.substr(0, i); } + else + { commandString = aCommand; } + + return treeTop->FindPath(commandString); +} + // -------------------------------------------------------------------- void G4UImanager::StoreHistory(const char* fileName) { @@ -648,8 +674,8 @@ void G4UImanager::ListCommands(const char* direct) G4UIcommandTree* G4UImanager::FindDirectory(const char* dirName) { G4String aDirName = dirName; - G4String targetDir = aDirName.strip(G4String::both); - if(targetDir(targetDir.length() - 1) != '/') + G4String targetDir = G4StrUtil::strip_copy(aDirName); + if(targetDir.back() != '/') { targetDir += "/"; } @@ -661,8 +687,8 @@ G4UIcommandTree* G4UImanager::FindDirectory(const char* dirName) G4int idx = 1; while(idx < G4int(targetDir.length()) - 1) { - G4int i = targetDir.index("/", idx); - G4String targetDirString = targetDir(0, i + 1); + G4int i = targetDir.find("/", idx); + G4String targetDirString = targetDir.substr(0, i + 1); comTree = comTree->GetTree(targetDirString); if(comTree == nullptr) { @@ -708,19 +734,19 @@ void G4UImanager::SetCoutDestination(G4UIsession* const value) void G4UImanager::SetAlias(const char* aliasLine) { G4String aLine = aliasLine; - G4int i = aLine.index(" "); - G4String aliasName = aLine(0, i); - G4String aliasValue = aLine(i + 1, aLine.length() - (i + 1)); - if(aliasValue(0) == '"') + G4int i = aLine.find(" "); + G4String aliasName = aLine.substr(0, i); + G4String aliasValue = aLine.substr(i + 1, aLine.length() - (i + 1)); + if(aliasValue[0] == '"') { G4String strippedValue; - if(aliasValue(aliasValue.length() - 1) == '"') + if(aliasValue.back() == '"') { - strippedValue = aliasValue(1, aliasValue.length() - 2); + strippedValue = aliasValue.substr(1, aliasValue.length() - 2); } else { - strippedValue = aliasValue(1, aliasValue.length() - 1); + strippedValue = aliasValue.substr(1, aliasValue.length() - 1); } aliasValue = strippedValue; } @@ -732,7 +758,7 @@ void G4UImanager::SetAlias(const char* aliasLine) void G4UImanager::RemoveAlias(const char* aliasName) { G4String aL = aliasName; - G4String targetAlias = aL.strip(G4String::both); + G4String targetAlias = G4StrUtil::strip_copy(aL); aliasList->RemoveAlias(targetAlias); } @@ -764,7 +790,7 @@ void G4UImanager::ParseMacroSearchPath() std::size_t idxfirst = 0; std::size_t idxend = 0; G4String pathstring = ""; - while((idxend = searchPath.index(':', idxfirst)) != G4String::npos) + while((idxend = searchPath.find(':', idxfirst)) != G4String::npos) { pathstring = searchPath.substr(idxfirst, idxend - idxfirst); if(pathstring.size() != 0) diff --git a/source/intercoms/src/G4UImessenger.cc b/source/intercoms/src/G4UImessenger.cc index 49504a5463..38b50ba7cd 100644 --- a/source/intercoms/src/G4UImessenger.cc +++ b/source/intercoms/src/G4UImessenger.cc @@ -136,8 +136,7 @@ G4double G4UImessenger::StoD(G4String str) // -------------------------------------------------------------------- G4bool G4UImessenger::StoB(G4String str) { - G4String v = str; - v.toUpper(); + G4String v = G4StrUtil::to_upper_copy(str); G4bool vl = false; if(v == "Y" || v == "YES" || v == "1" || v == "T" || v == "TRUE") { @@ -160,7 +159,7 @@ void G4UImessenger::CreateDirectory(const G4String& path, const G4String& dsc, G4UImanager* ui = G4UImanager::GetUIpointer(); G4String fullpath = path; - if(fullpath(fullpath.length() - 1) != '/') + if(fullpath.back() != '/') fullpath.append("/"); G4UIcommandTree* tree = ui->GetTree()->FindCommandTree(fullpath.c_str()); diff --git a/source/intercoms/src/G4UIparameter.cc b/source/intercoms/src/G4UIparameter.cc index e53c0fd5de..738eaca129 100644 --- a/source/intercoms/src/G4UIparameter.cc +++ b/source/intercoms/src/G4UIparameter.cc @@ -80,7 +80,7 @@ G4bool G4UIparameter::operator!=(const G4UIparameter& right) const void G4UIparameter::List() { G4cout << G4endl << "Parameter : " << parameterName << G4endl; - if(!parameterGuidance.isNull()) + if(!parameterGuidance.empty()) G4cout << parameterGuidance << G4endl; G4cout << " Parameter type : " << parameterType << G4endl; if(omittable) @@ -95,13 +95,13 @@ void G4UIparameter::List() { G4cout << " Default value : taken from the current value" << G4endl; } - else if(!defaultValue.isNull()) + else if(!defaultValue.empty()) { G4cout << " Default value : " << defaultValue << G4endl; } - if(!parameterRange.isNull()) + if(!parameterRange.empty()) G4cout << " Parameter range : " << parameterRange << G4endl; - if(!parameterCandidate.isNull()) + if(!parameterCandidate.empty()) G4cout << " Candidates : " << parameterCandidate << G4endl; } @@ -174,12 +174,12 @@ G4int G4UIparameter::CheckNewValue(const char* newValue) { if(TypeCheck(newValue) == 0) return fParameterUnreadable; - if(!parameterRange.isNull()) + if(!parameterRange.empty()) { if(RangeCheck(newValue) == 0) return fParameterOutOfRange; } - if(!parameterCandidate.isNull()) + if(!parameterCandidate.empty()) { if(CandidateCheck(newValue) == 0) return fParameterOutOfCandidates; @@ -193,7 +193,7 @@ G4int G4UIparameter::CandidateCheck(const char* newValue) G4Tokenizer candidateTokenizer(parameterCandidate); G4String aToken; G4int iToken = 0; - while(!(aToken = candidateTokenizer()).isNull()) + while(!(aToken = candidateTokenizer()).empty()) { ++iToken; if(aToken == newValue) @@ -201,6 +201,14 @@ G4int G4UIparameter::CandidateCheck(const char* newValue) } G4cerr << "parameter value (" << newValue << ") is not listed in the candidate List." << G4endl; + G4cerr << " Candidates are:"; + G4Tokenizer candidateListTokenizer(parameterCandidate); + while(!(aToken = candidateListTokenizer()).empty()) + { + G4cerr << ' ' << aToken; + } + G4cerr << G4endl; + return 0; } @@ -269,7 +277,7 @@ G4int G4UIparameter::TypeCheck(const char* newValue) case 'S': break; case 'B': - newValueString.toUpper(); + G4StrUtil::to_upper(newValueString); if(newValueString == "Y" || newValueString == "N" || newValueString == "YES" || newValueString == "NO" || newValueString == "1" || newValueString == "0" || @@ -973,7 +981,7 @@ tokenNum G4UIparameter::Yylex() // reads input and returns token number KR486 { // I or D do { - buf += G4String((unsigned char) c); + buf += (unsigned char) c; c = G4UIpGetc(); } while(c == '.' || isdigit(c) || c == 'e' || c == 'E' || c == '+' || c == '-'); @@ -1000,7 +1008,7 @@ tokenNum G4UIparameter::Yylex() // reads input and returns token number KR486 { // IDENTIFIER do { - buf += G4String((unsigned char) c); + buf += (unsigned char) c; } while((c = G4UIpGetc()) != EOF && (isalnum(c) || c == '_')); G4UIpUngetc(c); if(buf == parameterName) @@ -1049,7 +1057,7 @@ G4int G4UIparameter::G4UIpGetc() { // emulation of getc() G4int length = parameterRange.length(); if(bp < length) - return parameterRange(bp++); + return parameterRange[bp++]; else return EOF; } @@ -1059,7 +1067,7 @@ G4int G4UIparameter::G4UIpUngetc(G4int c) { // emulation of ungetc() if(c < 0) return -1; - if(bp > 0 && c == parameterRange(bp - 1)) + if(bp > 0 && c == parameterRange[bp - 1]) { --bp; } @@ -1067,7 +1075,7 @@ G4int G4UIparameter::G4UIpUngetc(G4int c) { G4cerr << "G4UIpUngetc() failed." << G4endl; G4cerr << "bp=" << bp << " c=" << c - << " pR(bp-1)=" << parameterRange(bp - 1) << G4endl; + << " pR(bp-1)=" << parameterRange[bp - 1] << G4endl; paramERR = 1; return -1; } diff --git a/source/interfaces/CMakeLists.txt b/source/interfaces/CMakeLists.txt index 9a850a2d7a..88ffeb1c64 100644 --- a/source/interfaces/CMakeLists.txt +++ b/source/interfaces/CMakeLists.txt @@ -2,6 +2,5 @@ geant4_global_library_target(NAME G4interfaces COMPONENTS - GAG/sources.cmake basic/sources.cmake common/sources.cmake) diff --git a/source/interfaces/GAG/GNUmakefile b/source/interfaces/GAG/GNUmakefile deleted file mode 100644 index b75f1db66a..0000000000 --- a/source/interfaces/GAG/GNUmakefile +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------- -# GNUmakefile for interfaces/GAG library. John Allison, 6/7/98. - -name := G4UIGAG - -ifndef G4INSTALL - G4INSTALL = ../../.. -endif - -include $(G4INSTALL)/config/architecture.gmk -include $(G4INSTALL)/config/interactivity.gmk - -CPPFLAGS += -I$(G4BASE)/global/management/include -CPPFLAGS += -I$(G4BASE)/interfaces/common/include -CPPFLAGS += -I$(G4BASE)/intercoms/include - -include $(G4INSTALL)/config/common.gmk diff --git a/source/interfaces/GAG/include/G4UIGAG.hh b/source/interfaces/GAG/include/G4UIGAG.hh deleted file mode 100644 index 9c82b2276f..0000000000 --- a/source/interfaces/GAG/include/G4UIGAG.hh +++ /dev/null @@ -1,130 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4UIGAG.hh -// GAG(Geant4 adaptive GUI) interface class -// 18.Feb.98 Y.Nagamatu and T.Kodama created G4UIGAG from G4UIterminal - -// If you want to use GAG (Tcl and JAVA version), -// read a document file README_Momo.html. - -#ifndef G4UIGAG_h -#define G4UIGAG_h 1 - -#include "G4UIsession.hh" -#include "G4UImanager.hh" -#include -#include - -enum UImode { terminal_mode , java_mode, tcl_mode }; -enum ChangeOfTree { notChanged=0, added, deleted, addedAndDeleted }; - -// class description: -// -// This class inherits the class G4UIsession. -// This is the class which is the front-end to GAG (Geant4 Adaptive GUI). -// Its usage is quite similar to G4UIterminal. - -class G4UIGAG : public G4UIsession -{ - public: // with description - G4UIGAG(); - ~G4UIGAG(); - - G4UIsession * SessionStart(); - - // A GAG session "gagSession" is instantiated. - // G4cout stream is redirected by default to the constructed instance. - // Usage: G4UIsession * gagSession = new G4UIGAG; - // "gagSession" is started. - // Usage: gagSession->SessionStart(); - // "gagSession" is deleted. - // Usage: delete gagSession; - // - void PauseSessionStart(const G4String&); - G4int ReceiveG4cout(const G4String&); - G4int ReceiveG4cerr(const G4String&); - // These methods are implementation of the virtual methods of - // G4UIsession class. - // - void SessionTerminate(); - void Prompt(const G4String&); - G4String GetCommand(); - // These methods are not for users. - private: - G4String prefix; - G4UImanager * UI; - G4String promptCharacter; - G4bool iExit; - G4bool iCont; - UImode uiMode; - - private: - G4String JVersion; - G4String TVersion; - void ExecuteCommand(const G4String&); - void ChangeDirectory(const G4String&); - void ListDirectory(const G4String&); - void TerminalHelp(const G4String&); - G4String ModifyPrefix(G4String); - G4UIcommandTree* FindDirPath(const G4String&); - void ShowCurrent(const G4String&); - G4String GetFullPath(const G4String&); - - void SendCommandProperties(G4UIcommandTree *); - void SendParameterProperties(G4UIcommandTree *); - void SendAParamProperty(G4UIcommand *); - void SendATclParamProperty(G4UIcommand *); - void CodeGenJavaTree(G4UIcommandTree *,int recursiveLevel); - void CodeGenJavaParams(G4UIcommandTree *,int recursiveLevel); - void CodeGenTclTree(G4UIcommandTree *, int recursiveLevel); - void CodeGenTclParams(G4UIcommandTree *, int recursiveLevel); - void SendDisableList(G4UIcommandTree *, int recursiveLevel); - - void NotifyStateChange(void); - void NotifyCommandUpdate(void); - void NotifyParameterUpdate(G4UIcommand *); - - int CommandUpdated(void); - void UpdateState(void); - void UpdateParamVal(void); // if param is updated, - // call NotifyParameterUpdate() - - // --- the following are used by Notify*Update() and *Updated() - void GetNewTreeStructure( G4UIcommandTree*,int recursiveLevel); - void GetNewTreeValues( G4UIcommandTree*,int recursiveLevel); - - std::vector previousTreeCommands; - std::vector newTreeCommands; - std::vector previousTreeParams; - std::vector newTreeParams; - std::vector previousTreePCP; - std::vector newTreePCP; - -}; - -#endif diff --git a/source/interfaces/GAG/include/G4UIGainServer.hh b/source/interfaces/GAG/include/G4UIGainServer.hh deleted file mode 100644 index eced6f2d2b..0000000000 --- a/source/interfaces/GAG/include/G4UIGainServer.hh +++ /dev/null @@ -1,171 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// - - -#ifndef G4UIGainServer_h -#define G4UIGainServer_h 1 - -#ifndef WIN32 - -#include -#include -#include -//#include -#include -#include - -#include -#include -#include "globals.hh" -#include "G4UImanager.hh" -#include "G4VBasicShell.hh" - -#define SOCK_NAME "/tmp/socket" -#define DEFAULT_PORT 40000; - -enum UImode { terminal_mode , java_mode, tcl_mode }; -enum ChangeOfTree { notChanged=0, added, deleted, addedAndDeleted }; - -// class description: -// -// This class is similar to G4UIGAG. -// While G4UIGAG provides direct connection to GAG via pipe, -// G4UIGainServer provides socket connection to remote Gain client. -// Gain = Geant4 adaptive interface for network -// Its usage is same as G4UIGAG, except that Geant4 application waits -// a connection from a Gain client. - -class G4UIGainServer : public G4VBasicShell { -private: - G4String prefix; - G4String promptCharacter; - G4UImanager* UI; - UImode uiMode; - G4String JVersion; - G4String TVersion; - - // shell - // G4VUIshell* shell; - - // program states - G4bool iExit; - G4bool iCont; - - // need for socket - int socketD[3]; - int port; - struct sockaddr_in saddr; - struct sockaddr_in caddr; - int len; - int ret; - char buf[1024]; - - // --- the following are used by Notify*Update() and *Updated() - void GetNewTreeStructure( G4UIcommandTree*,int recursiveLevel); - void GetNewTreeValues( G4UIcommandTree*,int recursiveLevel); - - std::vector previousTreeCommands; - std::vector newTreeCommands; - std::vector previousTreeParams; - std::vector newTreeParams; - std::vector previousTreePCP; - std::vector newTreePCP; - -public: - // These methods are implementation of corresponding virtual methods - // of G4UIsession class. - - // A GainServer session "gainSession" is instantiated. - // G4cout stream is redirected by default to the constructed instance. - // Usage: G4UIsession * gainSession = new G4UIGainServer(); - // "gainSession" is started. - // Usage: gainSession->SessionStart(); - // "gainSession" is deleted. - // Usage: delete gainSession; - // - - G4UIsession* SessionStart(); - virtual void PauseSessionStart(const G4String& msg); - virtual G4int ReceiveG4cout(const G4String& coutString); - virtual G4int ReceiveG4cerr(const G4String& cerrString); - -public: - // G4UIGainServer(G4VUIshell* aShell=0); - G4UIGainServer(); - //G4UIGainServer(void){} - ~G4UIGainServer(); - //~G4UIGainServer(void){} - - // void SetPrompt(const G4String& prompt); - void SessionTerminate(); - void Prompt(G4String); - G4String GetCommand(); - -private: - virtual void ExecuteCommand(const G4String& aCommand); - virtual G4bool GetHelpChoice(G4int& aInt); - virtual void ExitHelp() const; - bool SetUPServer(); - void WaitingConnection(); - void CloseConnection(); - - void ChangeDirectory(G4String); - void ListDirectory(G4String); - void TerminalHelp(G4String); - G4String ModifyPrefix(G4String); - G4UIcommandTree * FindDirPath(G4String); - void ShowCurrent(G4String); - G4String GetFullPath(G4String); - - void SendCommandProperties(G4UIcommandTree *); - void SendParameterProperties(G4UIcommandTree *); - void SendAParamProperty(G4UIcommand *); - void SendATclParamProperty(G4UIcommand *); - void CodeGenJavaTree(G4UIcommandTree *,int recursiveLevel); - void CodeGenJavaParams(G4UIcommandTree *,int recursiveLevel); - void CodeGenTclTree(G4UIcommandTree *, int recursiveLevel); - void CodeGenTclParams(G4UIcommandTree *, int recursiveLevel); - void SendDisableList(G4UIcommandTree *, int recursiveLevel); - - void NotifyStateChange(void); - void NotifyCommandUpdate(void); - void NotifyParameterUpdate(G4UIcommand *); - - int CommandUpdated(void); - void UpdateState(void); - void UpdateParamVal(void); // if param is updated, - // call NotifyParameterUpdate() - - -}; - -#endif - -#endif - - diff --git a/source/interfaces/GAG/sources.cmake b/source/interfaces/GAG/sources.cmake deleted file mode 100644 index adbd01a5cb..0000000000 --- a/source/interfaces/GAG/sources.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# - G4UIGAG module build definition - -# Define the Geant4 Module -geant4_add_module(G4UIGAG - PUBLIC_HEADERS - G4UIGAG.hh - G4UIGainServer.hh - SOURCES - G4UIGAG.cc - G4UIGainServer.cc) - -geant4_module_link_libraries(G4UIGAG PUBLIC G4UIcommon G4intercoms G4globman) \ No newline at end of file diff --git a/source/interfaces/GAG/src/G4UIGAG.cc b/source/interfaces/GAG/src/G4UIGAG.cc deleted file mode 100644 index f3249a2db5..0000000000 --- a/source/interfaces/GAG/src/G4UIGAG.cc +++ /dev/null @@ -1,970 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4UIGAG.cc -// 18.Feb.98 M.Nagamatu and T.Kodama created G4UIGAG from G4UIterminal - -#include "G4UIGAG.hh" -#include "G4StateManager.hh" -#include "G4UIcommandTree.hh" -#include "G4UIcommand.hh" -#include "G4UIcommandStatus.hh" -#include - -G4UIGAG::G4UIGAG()//: TVersion("T1.0a"), JVersion("J1.0a") -{ - TVersion="T1.0a"; JVersion="J1.0a"; - //G4cout << "G4UIGAG: Apr15,98." << G4endl; - prefix = "/"; - UI = G4UImanager::GetUIpointer(); - UI->SetSession(this); - UI->SetCoutDestination(this); - G4StateManager * statM = G4StateManager::GetStateManager(); - promptCharacter = statM->GetStateString(statM->GetCurrentState()); - uiMode = terminal_mode; // GAG - iExit = false; - iCont = false; - // -- Initialize Notify routines begin - G4UIcommandTree * tree = UI->GetTree(); - GetNewTreeStructure(tree,0); - GetNewTreeValues(tree,0); - previousTreeCommands = newTreeCommands; - previousTreeParams = newTreeParams; - previousTreePCP = newTreePCP; - // -- end -} - -G4UIGAG::~G4UIGAG() -{ - if( G4UImanager::GetUIpointer() != 0) - { - UI->SetSession(NULL); - UI->SetCoutDestination(NULL); - // G4cout << "GAG session deleted" << G4endl; - } -} - -G4UIsession * G4UIGAG::SessionStart() -{ - iExit = true; - G4StateManager * statM = G4StateManager::GetStateManager(); - promptCharacter = statM->GetStateString(statM->GetCurrentState()); - G4String newCommand = GetCommand(); - while( iExit ) - { - ExecuteCommand(newCommand); - promptCharacter = statM->GetStateString(statM->GetCurrentState()); - newCommand = GetCommand(); - } - return NULL; -} - -void G4UIGAG::PauseSessionStart(const G4String& msg) -{ - promptCharacter = msg; - G4cout << "@@PROMPT \"" << promptCharacter << "\"" << G4endl; - iCont = true; - G4String newCommand = GetCommand(); - while( iCont ) - { - ExecuteCommand(newCommand); - newCommand = GetCommand(); - } -} - -void G4UIGAG::ExecuteCommand(const G4String& aCommand) -{ - G4UIcommandTree * tree = UI->GetTree(); - if(aCommand.length()<2) return; - G4int returnVal = UI->ApplyCommand(aCommand); - G4int paramIndex = returnVal % 100; - G4int commandStatus = returnVal - paramIndex; - - UpdateState(); - if ( uiMode == terminal_mode){ - switch(commandStatus) { - case fCommandSucceeded: - break; - case fCommandNotFound: - // G4cerr << "command not found" << G4endl; - G4cerr << "command <" << UI->SolveAlias(aCommand) << "> not found" << G4endl; - break; - case fIllegalApplicationState: - G4cerr << "illegal application state -- command refused" << G4endl; - break; - case fParameterOutOfRange: - case fParameterUnreadable: - G4cerr << "Parameter is wrong type and/or is not omittable (index " << paramIndex << ")" << G4endl; - break; - case fParameterOutOfCandidates: - G4cerr << "Parameter is out of candidate list (index " << paramIndex << ")" << G4endl; - // G4cerr << "Candidates : " << cmd->GetParameter(paramIndex)->GetParameterCandidates() << G4endl; - break; - case fAliasNotFound: - default: - G4cerr << "command refused (" << commandStatus << ")" << G4endl; - } - }else{ - switch(commandStatus) { - case fCommandSucceeded: - { - GetNewTreeStructure(tree,0); - GetNewTreeValues(tree,0); - if (CommandUpdated()) { - NotifyCommandUpdate(); - } else { - UpdateParamVal(); // if param is updated, call notifyPara... - } - previousTreeCommands = newTreeCommands; - previousTreeParams = newTreeParams; - previousTreePCP = newTreePCP; - } - break; - case fCommandNotFound: - G4cout << "@@ErrResult \" <" << UI->SolveAlias(aCommand) << "> command not found.\"" << G4endl; - break; - case fIllegalApplicationState: - G4cout << "@@ErrResult \"Illegal application state -- command refused\"" << G4endl; - break; - case fParameterOutOfRange: - G4cout << "@@ErrResult \"Parameter Out of Range.\"" << G4endl; - break; - case fParameterUnreadable: - G4cout << "@@ErrResult \"Parameter is wrong type and/or is not omittable.\"" << G4endl; - break; - case fParameterOutOfCandidates: -// G4cout << "@@ErrResult \"Parameter Out of Candidates. Candidates : " << cmd->GetParameter(paramIndex)->GetParameterCandidates()<< "\"" << G4endl; - G4cout << "@@ErrResult \"Parameter Out of Candidates.\"" << G4endl; - break; - case fAliasNotFound: - default: - G4cout << "@@ErrResult \"command refused (" << commandStatus << ")\"" << G4endl; - } - } -} - - -G4int G4UIGAG::ReceiveG4cout(const G4String& coutString) -{ - std::cout << coutString << std::flush; - return 0; -} - -G4int G4UIGAG::ReceiveG4cerr(const G4String& cerrString) -{ - std::cerr << cerrString << std::flush; - return 0; -} - -void G4UIGAG::Prompt(const G4String& aPrompt) -{ - promptCharacter = aPrompt; -} - -G4String G4UIGAG::GetCommand() -{ - G4String newCommand; - G4String nullString; - while( 1 ) - { - G4UIcommandTree* tree = UI->GetTree(); - if ( uiMode != terminal_mode ){ - G4cout << "@@PROMPT \"" << promptCharacter << "\"" << G4endl; - } - if ( uiMode != java_mode ){ - G4cout << promptCharacter << "> " << std::flush; - }else{ - G4cout << "@@Ready" << G4endl; - } - newCommand.readLine( G4cin, FALSE ); - if (!G4cin.good()) { G4cin.clear(); newCommand = nullString; iExit=false;break;} - - newCommand = newCommand.strip(G4String::leading); - if( newCommand.length() < 1) { break; } - - while( newCommand(newCommand.length()-1) == '_' ) - { - G4String newLine; - newCommand.remove(newCommand.length()-1); - newLine.readLine( G4cin ); - if (!G4cin.good()) { G4cin.clear(); newCommand = nullString; iExit=false;break;} - newCommand.append(newLine); - } - - G4String nC = newCommand.strip(G4String::leading); - if( nC.length() < 1) { break; } - - // -------------------- nC.toUpper(); - if( nC == "@@GAGmodeJAVA" ) { - uiMode = java_mode; - G4cout << G4endl << "@@Version " << JVersion << G4endl; - SendCommandProperties(tree); - NotifyStateChange(); - } - else if( nC == "@@GAGmodeTcl" ) { - uiMode = tcl_mode; - G4cout << G4endl << "@@Version " << TVersion << G4endl; - SendCommandProperties(tree); - NotifyStateChange(); - } - else if( nC(0) == '#' ) - { G4cout << nC << G4endl; } - - else if( nC == "ls" || nC(0,3) == "ls " ) - { ListDirectory( nC ); } - else if( nC == "pwd" ) - { G4cout << "Current Working Directory : " << prefix << G4endl; } - else if( nC(0,2) == "cd" || nC(0,3) == "cd " ) - { ChangeDirectory( nC ); } - else if( nC == "help" || nC(0,5) == "help ") - { TerminalHelp( nC ); } - else if( nC(0) == '?' ) - { ShowCurrent( nC ); } - else if( nC(0,4) == "hist" || nC == "history") - { - G4int nh = UI->GetNumberOfHistory(); - for(int i=0;iGetPreviousCommand(i) << G4endl; } - } - else if( nC(0) == '!' ) - { - G4String ss = nC(1,nC.length()-1); - G4int vl; - const char* tt = ss; - std::istringstream is((char*)tt); - is >> vl; - G4int nh = UI->GetNumberOfHistory(); - if(vl>=0 && vlGetPreviousCommand(vl); - G4cout << newCommand << G4endl; - break; - } - else - { G4cerr << "history " << vl << " is not found." << G4endl; } - } - else if( nC(0,4) == "exit" ) - { - if( iCont ) - { - if ( uiMode == terminal_mode){ - G4cerr << "You are now processing RUN." << G4endl; - G4cerr << "Please abort it using \"/run/abort\" command first" << G4endl; - G4cerr << " and use \"continue\" command until the application" << G4endl; - G4cerr << " gets to Idle." << G4endl; - }else{ - G4cout << "@@ErrResult \"You are now processing RUN.\"" << G4endl; - } - } - else - { - iExit = false; - newCommand = nullString; - break; - } - } - else if( nC == "cont" || nC == "continue" ) - { - iCont = false; - newCommand = nullString; - break; - } - else - { break; } - } - return GetFullPath(newCommand); -} - -G4String G4UIGAG::GetFullPath(const G4String& aNewCommand ) -{ - G4String newCommand = aNewCommand; - newCommand.strip(G4String::both); - - G4String tmpString; - if( newCommand(0) == '/' ) - { tmpString = newCommand; } - else if( newCommand(0,3) == "../" ) - { - G4String tmpPrefix = prefix; - /*G4int*/ unsigned i_direc = 0; - while( i_direc < newCommand.length() ) - { - if( newCommand(i_direc,3) == "../" ) - { - i_direc += 3; - prefix = ModifyPrefix( G4String("../") ); - } - else - { break; } - } - tmpString = prefix; - tmpString.append( newCommand( i_direc, newCommand.length()-i_direc ) ); - prefix = tmpPrefix; - } - else - { - tmpString = prefix; - tmpString.append( newCommand ); - } - return tmpString; -} - -void G4UIGAG::SessionTerminate() -{ - G4cout << "***** Terminal session end *****" << G4endl; -} - -void G4UIGAG::ShowCurrent(const G4String& newCommand ) -{ - G4String theCommand = GetFullPath(newCommand.substr(1,newCommand.length()-1)); - G4String curV = UI->GetCurrentValues(theCommand); - if( ! (curV.isNull()||curV(0)=='\0' ) ) { - if (uiMode == terminal_mode){ - G4cout << "Current value(s) of the parameter(s) : " << curV << G4endl; - }else{ - G4cout << "@@CurrentValue " << curV << G4endl; - } - } else if (uiMode == terminal_mode){ - G4cout << "Current value is not available." << G4endl; - } else { - G4cout << "@@ErrResult \"Current value is not available.\"" << G4endl; - } -} - -void G4UIGAG::ChangeDirectory(const G4String& newCommand ) -{ - G4String savedPrefix = prefix; - if( newCommand.length() <= 3 ) - { prefix = "/"; } - else - { - G4String aNewPrefix = newCommand.substr(3,newCommand.length()-3); - G4String newPrefix = aNewPrefix.strip(G4String::both); - if( newPrefix(0) == '/' ) - { prefix = newPrefix; } - else if( newPrefix(0) != '.' ) - { - prefix += newPrefix; - } - else - { prefix = ModifyPrefix( newPrefix ); } - } - if( prefix( prefix.length() - 1 ) != '/' ) - { prefix += "/"; } - if( FindDirPath( prefix ) == NULL ) - { - G4cout << "Directory <" << prefix << "> is not found." << G4endl; - prefix = savedPrefix; - } -} - -void G4UIGAG::ListDirectory(const G4String& newCommand ) -{ - G4String targetDir('\0'); - if( newCommand.length() <= 3 ) - { targetDir = prefix; } - else - { - G4String newPrefix = newCommand.substr(3,newCommand.length()-3); - newPrefix.strip(G4String::both); - if( newPrefix(0) == '/' ) - { targetDir = newPrefix; } - else if( newPrefix(0) != '.' ) - { - targetDir = prefix; - targetDir += newPrefix; - } - else - { targetDir = ModifyPrefix(newPrefix); } - } - if( targetDir( targetDir.length() - 1 ) != '/' ) - { targetDir += "/"; } - G4UIcommandTree * commandTree = FindDirPath( targetDir ); - if( commandTree == NULL ) - { G4cout << "Directory <" << targetDir << "> is not found." << G4endl; } - else - { commandTree->ListCurrent(); } -} - -void G4UIGAG::TerminalHelp(const G4String& newCommand) -{ - G4UIcommandTree * treeTop = UI->GetTree(); - /*int*/str_size i = newCommand.index(" "); - if( i != std::string::npos ) - { - G4String newValue = newCommand.substr(i+1,newCommand.length()-(i+1)); - newValue.strip(G4String::both); - if( newValue(0) != '/' ) - { newValue.prepend( prefix ); } - G4UIcommand * theCommand = treeTop->FindPath( newValue ); - if( theCommand != NULL ) - { - theCommand->List(); - return; - } - else - { - G4cout << "Command <" << newValue << " is not found." << G4endl; - return; - } - } - - G4UIcommandTree * floor[10]; - floor[0] = treeTop; - int iFloor = 0; - /*int*/ unsigned prefixIndex = 1; - while( prefixIndex < prefix.length()-1 ) - { - int ii = prefix.index("/",prefixIndex); - floor[iFloor+1] = - floor[iFloor]->GetTree(G4String(prefix(0,ii+1))); - prefixIndex = ii+1; - iFloor++; - } - floor[iFloor]->ListCurrentWithNum(); - // 1998 Oct 2 non-number input - while(1){ - int j; - G4cout << G4endl << "Type the number ( 0:end, -n:n level back ) : "<> j; - if(!G4cin.good()){ - G4cin.clear(); - G4cin.ignore(30,'\n'); - G4cout << G4endl << "Not a number, once more" << G4endl; continue;} - else if( j < 0 ){ - iFloor += j; - if( iFloor < 0 ) iFloor = 0; - floor[iFloor]->ListCurrentWithNum(); continue;} - else if(j == 0) { break;} - else if( j > 0 ) { - int n_tree = floor[iFloor]->GetTreeEntry(); - if( j > n_tree ) - { - if( j <= n_tree + floor[iFloor]->GetCommandEntry() ) - { - floor[iFloor]->GetCommand(i-n_tree)->List(); - //iFloor++; - } - } - else - { - floor[iFloor+1] = floor[iFloor]->GetTree(i); - iFloor++; - floor[iFloor]->ListCurrentWithNum(); - } - } - - } - G4cout << "Exit from HELP." << G4endl << G4endl; - G4cout << G4endl; - // G4cin.flush(); - char temp[100]; - G4cin.getline( temp, 100 ); -} - -G4String G4UIGAG::ModifyPrefix(G4String newCommand) -{ - G4String newPrefix = prefix; - while( 1 ) - { - if( newCommand.substr(0,2) == ".." ) - { - if( newPrefix != "/" ) - { - G4String tmpString = newPrefix(0,newPrefix.length()-1); - newPrefix = newPrefix(0,tmpString.last('/')+1); - } - } - else - { - newPrefix += newCommand; - break; - } - if( newCommand == ".." || newCommand == "../" ) - { break; } - newCommand = newCommand.substr(3,newCommand.length()-3); - } - return newPrefix; -} - -G4UIcommandTree * G4UIGAG::FindDirPath(const G4String& newCommand) -{ - G4UIcommandTree * comTree = UI->GetTree(); - /*int*/ unsigned idx = 1; - while( idx < newCommand.length()-1 ) - { - int i = newCommand.index("/",idx); - comTree = comTree->GetTree(G4String(newCommand.substr(0,i+1))); - if( comTree == NULL ) - { return NULL; } - idx = i+1; - } - return comTree; -} - -// ----- for JAVA GAG (by T.Kodama) - -void G4UIGAG::SendCommandProperties(G4UIcommandTree * tree) -{ - if( tree == NULL ) { - G4cerr << "GetTree() returns null." << G4endl; - return; - } - if (uiMode == java_mode){ - G4cout << "@@JTreeBegin" << G4endl; - CodeGenJavaTree(tree, 0); - G4cout << "@@JTreeEnd" << G4endl; - CodeGenJavaParams(tree, 0); - }else{ - G4cout << G4endl << "@@maketree_start" << G4endl; - CodeGenTclTree(tree,0); - G4cout << "@@maketree_end" << G4endl; - CodeGenTclParams(tree, 0); - } -} -void G4UIGAG::SendParameterProperties(G4UIcommandTree * tree) -{ - if( tree == NULL ) { - G4cerr << "GetTree() returns null." << G4endl; - return; - } - if (uiMode == java_mode){ - CodeGenJavaParams(tree, 0); - }else{ - CodeGenTclParams(tree, 0); - } -} - -void G4UIGAG::CodeGenJavaTree(G4UIcommandTree * tree, int level) -{ - int treeEntry, commandEntry; - treeEntry = tree->GetTreeEntry(); - commandEntry = tree->GetCommandEntry(); - - if(level!=0) { - for(int i=0; iGetCommand(i+1)->GetCommandPath() << G4endl; - } - } - if(treeEntry == 0) return; //end recursion - - for(int j=0; jGetTree(j+1), level+1); - } -} - -void G4UIGAG::CodeGenJavaParams(G4UIcommandTree * tree, int level) //recursive -{ - int treeEntry, commandEntry, i; - //G4UIcommand * Comp; - G4UIcommandTree * treeLink; - - treeEntry = tree->GetTreeEntry(); - commandEntry = tree->GetCommandEntry(); - - for(i=0; iGetCommand(i+1)); - } - if( treeEntry == 0 ) return; // end recursion - - for(i=0; i< treeEntry; i++) { - treeLink = tree->GetTree(i+1); - G4cout << "@@JDirGuideBegin" << G4endl; - G4cout << treeLink->GetPathName() << G4endl << treeLink->GetTitle() << G4endl; - G4cout << "@@JDirGuideEnd" << G4endl; - CodeGenJavaParams(treeLink, level+1); - } -} - -void G4UIGAG::SendAParamProperty(G4UIcommand * Comp) -{ - int guidanceEntry, parameterEntry; - G4String title, title2; - G4UIparameter * prp; - char c[2]; - guidanceEntry = Comp->GetGuidanceEntries(); - parameterEntry = Comp->GetParameterEntries(); - G4cout << "@@JParamBegin" << G4endl; - G4cout << Comp->GetCommandPath() << G4endl; - G4cout << guidanceEntry << G4endl; - for (int j=0; jGetGuidanceLine(j); - title2 = ""; - if (title != ""){ - for(int i=0; i< (int)title.length(); i++){ - c[0]=title(i); - c[1]= '\0'; - if ( c[0] == '\n' || c[0] == '\r') { - c[0]= ' '; - } - title2.append(c); - } - } - G4cout << title2 << G4endl; - } - G4cout << Comp->GetRange() << G4endl; - G4cout << parameterEntry << G4endl; - for( int par=0; parGetParameter(par); - G4cout << prp->GetParameterName() << G4endl; - G4cout << prp->GetParameterGuidance() << G4endl; - G4cout << prp->GetParameterType() << G4endl; - G4cout << prp->IsOmittable() << G4endl; - G4cout << prp->GetDefaultValue() << G4endl; - G4cout << prp->GetParameterRange() << G4endl; - G4cout << prp->GetParameterCandidates() << G4endl; - } - G4cout << "@@JParamEnd" << G4endl; -} - -void G4UIGAG::SendDisableList(G4UIcommandTree * tree, int level) -{ - int treeEntry, commandEntry; - G4UIcommand * Comp; - treeEntry = tree->GetTreeEntry(); - commandEntry = tree->GetCommandEntry(); - - for(int com=0; comGetCommand(com+1); - if( Comp->IsAvailable()==false ) { - G4cout << Comp->GetCommandPath()<GetTree(i+1), level+1); - // be sure the function name is the same - } -} - -// ----- for Tcl GAG - -void G4UIGAG::CodeGenTclTree(G4UIcommandTree * tree, int level) -{ - int i, j; - int treeEntry, commandEntry, guidanceEntry; - treeEntry = tree->GetTreeEntry(); - commandEntry = tree->GetCommandEntry(); - G4String commandPath, pathName, title1, title2; - G4UIcommandTree * t; - G4UIcommand * Comp; - - for(int com=0; comGetCommand(com+1); - commandPath = Comp->GetCommandPath(); - G4cout << commandPath << " @@command" << G4endl; - guidanceEntry = Comp->GetGuidanceEntries(); - if (guidanceEntry == 0){ - title2 = "...Title not available..."; - } else { - title2 = ""; - j = 0; - while(1){ - title1 = Comp->GetGuidanceLine(j); - for(i=0; i< (int)title1.length(); i++){ - char c[2]; - c[0]=title1(i); - c[1]= '\0'; - if( c[0] == '\"') { - title2.append("\\\""); // a Backslash and a double quote - } else if ( c[0] == '\n' || c[0] == '\r') { - title2.append("\\n"); - } else title2.append(c); - } - j++; - if (j >= guidanceEntry) break; - title2.append("\\n"); - } - } - G4cout << commandPath << " @@title \""<< title2 <<"\""<< G4endl; - } - - if(treeEntry == 0) return; //end recursion - - for(i=0; i< treeEntry; i++){ - t = tree->GetTree(i+1); - pathName = t->GetPathName(); - title1 = t->GetTitle(); - title2 = ""; - for(int k=0; k<(int)title1.length(); k++){ - char c[2]; - c[0]=title1(k); - c[1]= '\0'; - if( c[0] == '\"') - title2.append("\\\""); // a Backslash and a double quote - else title2.append(c); - } - if(level==0) G4cout << pathName<< G4endl; - else G4cout << pathName<< " @@cascade"<GetTreeEntry(); - commandEntry = tree->GetCommandEntry(); - - for(int com=0; comGetCommand(com+1); - SendATclParamProperty(Comp); - } - if( treeEntry == 0 ) return; // end recursion - - for( int i=0; iGetTree(i+1), level+1); - // be sure the function name is the same - } -} - -void G4UIGAG::SendATclParamProperty(G4UIcommand * Comp) -{ - G4UIparameter * prp; - int parameterEntry = Comp->GetParameterEntries(); - G4String commandPath = Comp->GetCommandPath(); - G4String commandRange = Comp->GetRange(); - G4cout << "@@parameter_start" << G4endl; - G4cout << commandPath << " @@param " << parameterEntry << G4endl; - G4cout << "@@command_range \"" << commandRange << "\"" << G4endl; - for( int par=0; parGetParameter(par); - G4cout << "{" ; - G4cout << "@@param_name : \"" << prp->GetParameterName() <<"\""<GetParameterGuidance(); - guide2 = ""; - for(int i=0; i<(int)guide1.length(); i++){ - char c[2]; - c[0]=guide1(i); - c[1]= '\0'; - if( c[0] == '\"') - guide2.append("\\\""); // a Backslash and a double quote - else guide2.append(c); - } - G4cout << " @@param_guide : \"" << guide2 << "\""<GetParameterType()<<"\""<IsOmittable()<<"\""<GetDefaultValue()<<"\""<GetParameterRange()<<"\""<GetParameterCandidates()<< "\""<GetTree(); - stateString = statM->GetStateString(statM->GetCurrentState()); - if ( uiMode != terminal_mode ){ - G4cout << "@@State \"" << stateString << "\"" << G4endl; - G4cout << "@@DisableListBegin"<GetTree(); - SendCommandProperties(tree); -} - -void G4UIGAG::NotifyParameterUpdate(G4UIcommand* com) -{ - if (uiMode == java_mode) - SendAParamProperty(com); - else - SendATclParamProperty(com); -} - -//####### update check routines #################################### -void G4UIGAG::UpdateState(void) -{ - static G4ThreadLocal G4ApplicationState *previousState_G4MT_TLS_ = 0 ; if (!previousState_G4MT_TLS_) {previousState_G4MT_TLS_ = new G4ApplicationState ; *previousState_G4MT_TLS_= G4State_PreInit ; } G4ApplicationState &previousState = *previousState_G4MT_TLS_; - G4ApplicationState newState; - G4StateManager *statM = G4StateManager::GetStateManager(); - newState = statM->GetCurrentState(); - if( newState != previousState ) - { - NotifyStateChange(); - previousState = newState; - } -} - -int G4UIGAG::CommandUpdated(void) -{ - int added=0, deleted=0; - int pEntry= previousTreeCommands.size(); - int nEntry= newTreeCommands.size(); - int i,j; - for( i=0; iGetTreeEntry(); - int commandEntry = tree->GetCommandEntry(); - - if( level==0 ) { newTreeCommands.clear();} - for(int com=0; comGetCommand(com+1)->GetCommandPath(); - title = tree->GetCommand(com+1)->GetTitle(); - newTreeCommands.push_back( commandPath + " " + title ); - } - - if(treeEntry == 0) return; //end recursion - - for(int i=0; i< treeEntry; i++){ - t = tree->GetTree(i+1); - pathName = t->GetPathName(); - title = t->GetTitle(); - newTreeCommands.push_back( pathName + " " + title ); - GetNewTreeStructure(t, level+1); - } -} - -void G4UIGAG::UpdateParamVal(void) -{ - // call NotifyParameterUpdate() if the value of each - // command/parameter is updated. - // assuming the command structure is not changed. - int pEntry= previousTreeParams.size(); - int nEntry= newTreeParams.size(); - int i; - G4UIcommand* Comp; - if (pEntry != nEntry) return; - for( i=0; iGetCommandPath() - << " command is updated." <GetTreeEntry(); - int commandEntry = tree->GetCommandEntry(); - G4UIcommand * Comp; - G4UIparameter * prp; - G4String param, str(" "); - - if( level==0 ) { newTreeParams.clear(); } - for(int com=0; comGetCommand(com+1); - commandPath = Comp->GetCommandPath(); - parameterEntry = Comp->GetParameterEntries(); - param = commandPath +" "; - for( int par=0; par< parameterEntry; par++) { - prp = (G4UIparameter *)Comp->GetParameter(par); - param += prp->GetParameterName() +" "; - str(0) = prp->GetParameterType(); - param += str + " "; - param += prp->GetDefaultValue() +" "; - param += prp->GetParameterRange() +" "; - param += prp->GetParameterCandidates(); - } - newTreeParams.push_back( param + "\n"); - newTreePCP.push_back( Comp ); - } - if( treeEntry == 0 ) return; // end recursion - for( int i=0; i< treeEntry; i++) { - t = tree->GetTree(i+1); - GetNewTreeValues(t, level+1); - } -} -//###################################################### diff --git a/source/interfaces/GAG/src/G4UIGainServer.cc b/source/interfaces/GAG/src/G4UIGainServer.cc deleted file mode 100644 index 34ad902510..0000000000 --- a/source/interfaces/GAG/src/G4UIGainServer.cc +++ /dev/null @@ -1,960 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// 12/06/2002 G4UIGainServer H. MInamimoto and H. Yoshida created -// -#ifndef WIN32 - -#include "G4UIGainServer.hh" -#include - -#include -#include "G4StateManager.hh" -#include "G4UIcommandTree.hh" -#include "G4UIcommand.hh" -#include "G4UIcommandStatus.hh" - - -////////////////////////////////////////////// -G4UIGainServer::G4UIGainServer() -////////////////////////////////////////////// -{ - TVersion ="T1.0a"; JVersion="J1.0a"; - prefix = "/"; - - port = DEFAULT_PORT; - while(SetUPServer() == false){ - G4cout<<"can't get the port no. "< SetSession(this); - UI-> SetCoutDestination(this); - - G4StateManager* statM = G4StateManager::GetStateManager(); - promptCharacter = statM->GetStateString(statM->GetCurrentState()); - uiMode = terminal_mode; - - iExit= FALSE; - iCont= FALSE; - - G4UIcommandTree* tree = UI->GetTree(); - GetNewTreeStructure(tree,0); - GetNewTreeValues(tree,0); - previousTreeCommands = newTreeCommands; - previousTreeParams = newTreeParams; - previousTreePCP = newTreePCP; - -} - -///////////////////////////// -G4UIGainServer::~G4UIGainServer() -///////////////////////////// -{ - - if(G4UImanager::GetUIpointer()) { - UI-> SetSession(NULL); - UI-> SetCoutDestination(NULL); - } - - if(G4UImanager::GetUIpointer()!=0){ - UI->SetSession(NULL); - UI->SetCoutDestination(NULL); - } -} - - -///////////////////////////////////////// -G4UIsession* G4UIGainServer::SessionStart() -///////////////////////////////////////// -{ - G4String newCommand; - - G4StateManager* statM = G4StateManager::GetStateManager(); - promptCharacter = statM->GetStateString(statM->GetCurrentState()); - - iExit= TRUE; - - WaitingConnection(); - while(iExit){ - newCommand= GetCommand(); - ExecuteCommand(newCommand); - } - return NULL; -} - -////////////////////////////////////////////////// -void G4UIGainServer::PauseSessionStart(const G4String& msg) -////////////////////////////////////////////////// -{ - promptCharacter = msg; - G4cout<<"@@PROMPT \""<GetTree(); - if(aCommand.length()<2) return; - G4int returnVal = UI->ApplyCommand(aCommand); - G4int paramIndex = returnVal % 100; - // 0 - 98 : paramIndex-th parameter is invalid - // 99 : convination of parameters is invalid - G4int commandStatus = returnVal - paramIndex; - - UpdateState(); - - if(uiMode != terminal_mode){ - switch(commandStatus) { - case fCommandSucceeded: - GetNewTreeStructure(tree,0); - GetNewTreeValues(tree,0); - if(CommandUpdated()){ - NotifyCommandUpdate(); - } else{ - UpdateParamVal(); - } - previousTreeCommands = newTreeCommands; - previousTreeParams = newTreeParams; - previousTreePCP = newTreePCP; - break; - case fCommandNotFound: - G4cerr << "@@ErrResult \" <" << UI->SolveAlias(aCommand) << "> not found.\"" << G4endl; - break; - case fIllegalApplicationState: - G4cerr << "@@ErrResult \"illegal application state -- command refused.\"" << G4endl; - break; - case fParameterOutOfRange: - G4cout << "@@ErrResult \"Parameter Out of Range.\"" << G4endl; - break; - case fParameterUnreadable: - G4cout << "@@ErrResult \"Parameter is wrong type and/or is not omittable.\""<GetTree(); - if ( uiMode != terminal_mode ){ - G4cout << "@@PROMPT \"" << promptCharacter << "\"" << G4endl; - } - if ( uiMode != java_mode ){ - G4cout << promptCharacter << "> " << G4endl; - }else{ - G4cout << "@@Ready" << G4endl; - } - - - ///////////////////////////// - ///////////////////////////// - ssize_t rc = read(socketD[1],buf,1024); - if ( rc < 0 ) {} - newCommand=buf; - //DEBUG cout<<"->"<GetNumberOfHistory(); - for(int i=0;iGetPreviousCommand(i) << G4endl; } - } - else if( nC(0) == '!' ) - { - G4String ss = nC(1,nC.length()-1); - G4int vl; - const char* tt = ss; - std::istringstream is((char*)tt); - is >> vl; - G4int nh = UI->GetNumberOfHistory(); - if(vl>=0 && vlGetPreviousCommand(vl); - G4cout << newCommand << G4endl; - break; - } - else - { G4cerr << "history " << vl << " is not found." << G4endl; } - } - else if( nC(0,4) == "exit" ) - { - if( iCont ) - { - if ( uiMode == terminal_mode){ - G4cerr << "You are now processing RUN." << G4endl; - G4cerr << "Please abort it using \"/run/abort\" command first" << G4endl; - G4cerr << " and use \"continue\" command until the application" << G4endl; - G4cerr << " gets to Idle." << G4endl; - }else{ - G4cout << "@@ErrResult \"You are now processing RUN.\"" << G4endl; - } - } - else - { - close(socketD[1]); - close(socketD[2]); - iExit = false; - newCommand = nullString; - break; - } - } - else if( nC == "cont" || nC == "continue" ) - { - iCont = false; - newCommand = nullString; - break; - } - else - { break; } - } - return GetFullPath(newCommand); -} - -////////////////////////////////////////////////////// -G4int G4UIGainServer::ReceiveG4cout(const G4String& coutString) -////////////////////////////////////////////////////// -{ - if(socketD[1]>0){ - ssize_t rc = write(socketD[1],coutString,coutString.length()); - if ( rc < 0 ){} - } - return 0; - - //std::cout << coutString << std::flush; - //return 0; -} - -////////////////////////////////////////////////////// -G4int G4UIGainServer::ReceiveG4cerr(const G4String& cerrString) -////////////////////////////////////////////////////// -{ - if(socketD[2]>0){ - ssize_t rc = write(socketD[2],cerrString,cerrString.length()); - if ( rc < 0 ) {} - } - return 0; - - //std::cerr << cerrString << std::flush; - //return 0; -} - -///////////////////////////////////////////////// -G4bool G4UIGainServer::GetHelpChoice(G4int& aInt) -///////////////////////////////////////////////// -{ - G4cin >> aInt; - if(!G4cin.good()){ - G4cin.clear(); - G4cin.ignore(30,'\n'); - return FALSE; - } - return TRUE; -} - -///////////////////////////// -void G4UIGainServer::ExitHelp() const -///////////////////////////// -{ - char temp[100]; - G4cin.getline(temp, 100); -} - -///////////////////////////// -bool G4UIGainServer::SetUPServer(){ -///////////////////////////// - - socketD[0] = socket(AF_INET,SOCK_STREAM,0); - - if(socketD[0]<0){ - perror("server:socket"); - return (false); - //exit(1); - } - - memset( (char *)&saddr,'\0',sizeof(saddr)) ; - - saddr.sin_family = AF_INET; - saddr.sin_addr.s_addr = INADDR_ANY; - saddr.sin_port = htons(port); - unlink(SOCK_NAME); - - if(bind(socketD[0] , (struct sockaddr *)&saddr , sizeof(saddr))<0){ - perror("bind"); - return (false); - //exit(1); - } - else{ G4cout<<"G4GainServer waiting at "<GetCurrentValues(theCommand); - if( ! (curV.isNull()||curV(0)=='\0' ) ) { - if (uiMode == terminal_mode){ - G4cout << "Current value(s) of the parameter(s) : " << curV << G4endl; - }else{ - G4cout << "@@CurrentValue " << curV << G4endl; - } - } else if (uiMode == terminal_mode){ - G4cout << "Current value is not available." << G4endl; - } else { - G4cout << "@@ErrResult \"Current value is not available.\"" << G4endl; - } -} - -////////////////////////////////////////////////// -void G4UIGainServer::ChangeDirectory(G4String newCommand){ -////////////////////////////////////////////////// - G4String savedPrefix = prefix; - if( newCommand.length() <= 3 ) - { prefix = "/"; } - else - { - G4String aNewPrefix = newCommand(3,newCommand.length()-3); - G4String newPrefix = aNewPrefix.strip(G4String::both); - if( newPrefix(0) == '/' ) - { prefix = newPrefix; } - else if( newPrefix(0) != '.' ) - { - prefix += newPrefix; - } - else - { prefix = ModifyPrefix( newPrefix ); } - } - if( prefix( prefix.length() - 1 ) != '/' ) - { prefix += "/"; } - if( FindDirPath( prefix ) == NULL ) - { - G4cout << "Directory <" << prefix << "> is not found." << G4endl; - prefix = savedPrefix; - } -} -//////////////////////////////////////////////// -void G4UIGainServer::ListDirectory(G4String newCommand){ -//////////////////////////////////////////////// - G4String targetDir('\0'); - if( newCommand.length() <= 3 ) - { targetDir = prefix; } - else - { - G4String newPrefix = newCommand(3,newCommand.length()-3); - newPrefix.strip(G4String::both); - if( newPrefix(0) == '/' ) - { targetDir = newPrefix; } - else if( newPrefix(0) != '.' ) - { - targetDir = prefix; - targetDir += newPrefix; - } - else - { targetDir = ModifyPrefix( newPrefix ); } - } - if( targetDir( targetDir.length() - 1 ) != '/' ) - { targetDir += "/"; } - G4UIcommandTree * commandTree = FindDirPath( targetDir ); - if( commandTree == NULL ) - { G4cout << "Directory <" << targetDir << "> is not found." << G4endl; } - else - { commandTree->ListCurrent(); } -} - -/////////////////////////////////////////////// -void G4UIGainServer::TerminalHelp(G4String newCommand){ -/////////////////////////////////////////////// - G4UIcommandTree* treeTop = UI->GetTree(); - str_size i = newCommand.index(" "); - - if(i!=std::string::npos){ - G4String newValue = newCommand(i+1,newCommand.length()-(i+1)); - newValue.strip(G4String::both); - if(newValue(0)!='/'){ - newValue.prepend(prefix); - } - G4UIcommand* theCommand = treeTop->FindPath(newValue); - if(theCommand !=NULL){ - theCommand->List(); - return; - } - else{ - G4cout<<"Command<" << newValue << "is not found."<GetTree(G4String(prefix(0,ii+1))); - prefixIndex = ii+1; - iFloor++; - } - floor[iFloor]->ListCurrentWithNum(); - while(1){ - int j; - G4cout<> j; - if(!G4cin.good()){ - G4cin.clear(); - G4cin.ignore(30,'\n'); - G4cout<ListCurrentWithNum(); continue; - } - else if(j==0){break;} - else if(j>0){ - int n_tree = floor[iFloor]->GetTreeEntry(); - if(j>n_tree){ - if(j<=n_tree+floor[iFloor]->GetCommandEntry()){ - floor[iFloor]->GetCommand(j-n_tree)->List(); - } - } - else{ - floor[iFloor+1] = floor[iFloor]->GetTree(j); - iFloor++; - floor[iFloor]->ListCurrentWithNum(); - } - } - } - G4cout<<"Exit from Help."<GetTree(); - /*int*/ unsigned idx = 1; - while( idx < newCommand.length()-1 ) - { - int i = newCommand.index("/",idx); - comTree = comTree->GetTree(G4String(newCommand(0,i+1))); - if( comTree == NULL ) - { return NULL; } - idx = i+1; - } - return comTree; -} - -//// ----- for JAVA Gain - -////////////////////////////////////////////////////////// -void G4UIGainServer::SendCommandProperties(G4UIcommandTree* tree){ -////////////////////////////////////////////////////////// - if( tree == NULL ) { - G4cerr << "GetTree() returns null." << G4endl; - return; - } - if (uiMode == java_mode){ - G4cout << "@@JTreeBegin" << G4endl; - CodeGenJavaTree(tree, 0); - G4cout << "@@JTreeEnd" << G4endl; - CodeGenJavaParams(tree, 0); - }else{} -} - -//////////////////////////////////////////////////////////// -void G4UIGainServer::SendParameterProperties(G4UIcommandTree* tree){ -//////////////////////////////////////////////////////////// - if( tree == NULL ) { - G4cerr << "GetTree() returns null." << G4endl; - return; - } - if (uiMode == java_mode){ - CodeGenJavaParams(tree, 0); - }else{ } -} - -////////////////////////////////////////////////////////////// -void G4UIGainServer::CodeGenJavaTree(G4UIcommandTree* tree,int level){ -////////////////////////////////////////////////////////////// - int treeEntry, commandEntry; - treeEntry = tree->GetTreeEntry(); - commandEntry = tree->GetCommandEntry(); - - if(level!=0) { - for(int i=0; iGetCommand(i+1)->GetCommandPath() << G4endl; - } - } - if(treeEntry == 0) return; //end recursion - - for(int j=0; jGetTree(j+1), level+1); - } -} - -//////////////////////////////////////////////////////////////// -void G4UIGainServer::CodeGenJavaParams(G4UIcommandTree* tree,int level){ -//////////////////////////////////////////////////////////////// - int treeEntry,commandEntry,i; - G4UIcommandTree* treeLink; - - treeEntry = tree->GetTreeEntry(); - commandEntry = tree->GetCommandEntry(); - - for(i=0;iGetCommand(i+1)); - } - if(treeEntry ==0) return; - - for(i=0;iGetTree(i+1); - G4cout<<"@@JDirGuieBegin"<GetPathName()<GetTitle()<GetGuidanceEntries(); - parameterEntry = Comp->GetParameterEntries(); - G4cout << "@@JParamBegin" << G4endl; - G4cout << Comp->GetCommandPath() << G4endl; - G4cout << guidanceEntry << G4endl; - for (int j=0; jGetGuidanceLine(j); - title2 = ""; - if (title != ""){ - for(int i=0; i< (int)title.length(); i++){ - c[0]=title(i); - c[1]= '\0'; - if ( c[0] == '\n' || c[0] == '\r') { - c[0]= ' '; - } - title2.append(c); - } - } - G4cout << title2 << G4endl; - } - G4cout << Comp->GetRange() << G4endl; - G4cout << parameterEntry << G4endl; - for( int par=0; parGetParameter(par); - G4cout << prp->GetParameterName() << G4endl; - G4cout << prp->GetParameterGuidance() << G4endl; - G4cout << prp->GetParameterType() << G4endl; - G4cout << prp->IsOmittable() << G4endl; - G4cout << prp->GetDefaultValue() << G4endl; - G4cout << prp->GetParameterRange() << G4endl; - G4cout << prp->GetParameterCandidates() << G4endl; - } - G4cout << "@@JParamEnd" << G4endl; -} - -////////////////////////////////////////////////////////////// -void G4UIGainServer::SendDisableList(G4UIcommandTree* tree,int level){ -////////////////////////////////////////////////////////////// - int treeEntry, commandEntry; - G4UIcommand * Comp; - treeEntry = tree->GetTreeEntry(); - commandEntry = tree->GetCommandEntry(); - - for(int com=0; comGetCommand(com+1); - if( Comp->IsAvailable()==false ) { - G4cout << Comp->GetCommandPath()<GetTree(i+1), level+1); - // be sure the function name is the same - } -} - - - -//####### update check routines #################################### - -/////////////////////////////// -void G4UIGainServer::UpdateState(void) -/////////////////////////////// -{ - static G4ThreadLocal G4ApplicationState *previousState_G4MT_TLS_ = 0 ; if (!previousState_G4MT_TLS_) {previousState_G4MT_TLS_ = new G4ApplicationState ; *previousState_G4MT_TLS_= G4State_PreInit ; } G4ApplicationState &previousState = *previousState_G4MT_TLS_; - G4ApplicationState newState; - G4StateManager *statM = G4StateManager::GetStateManager(); - newState = statM->GetCurrentState(); - if( newState != previousState ) - { - NotifyStateChange(); - previousState = newState; - } -} - -///////////////////////////////////// -void G4UIGainServer::NotifyStateChange(void) -///////////////////////////////////// -{ - G4String stateString; - G4StateManager * statM = G4StateManager::GetStateManager(); - G4UIcommandTree * tree = UI->GetTree(); - stateString = statM->GetStateString(statM->GetCurrentState()); - if ( uiMode != terminal_mode ){ - G4cout << "@@State \"" << stateString << "\"" << G4endl; - G4cout << "@@DisableListBegin"<GetTree(); - SendCommandProperties(tree); -} - -///////////////////////////////////////////////////// -void G4UIGainServer::NotifyParameterUpdate(G4UIcommand* com) -///////////////////////////////////////////////////// -{ - SendAParamProperty(com); -} - -////////////////////////////////// -int G4UIGainServer::CommandUpdated(void){ -////////////////////////////////// - int added=0, deleted=0; - int pEntry= previousTreeCommands.size(); - int nEntry= newTreeCommands.size(); - int i,j; - for( i=0; iGetTreeEntry(); - int commandEntry = tree->GetCommandEntry(); - - if( level==0 ) { newTreeCommands.clear();} - for(int com=0; comGetCommand(com+1)->GetCommandPath(); - title = tree->GetCommand(com+1)->GetTitle(); - newTreeCommands.push_back( commandPath + " " + title ); - } - - if(treeEntry == 0) return; //end recursion - - for(int i=0; i< treeEntry; i++){ - t = tree->GetTree(i+1); - pathName = t->GetPathName(); - title = t->GetTitle(); - newTreeCommands.push_back( pathName + " " + title ); - GetNewTreeStructure(t, level+1); - } -} - -//////////////////////////////////// -void G4UIGainServer::UpdateParamVal(void) { -//////////////////////////////////// - // call NotifyParameterUpdate() if the value of each - // command/parameter is updated. - // assuming the command structure is not changed. - int pEntry= previousTreeParams.size(); - int nEntry= newTreeParams.size(); - int i; - G4UIcommand* Comp; - if (pEntry != nEntry) return; - for( i=0; iGetCommandPath() - << " command is updated." <GetTreeEntry(); - int commandEntry = tree->GetCommandEntry(); - G4UIcommand * Comp; - G4UIparameter * prp; - G4String param, str(" "); - - if( level==0 ) { newTreeParams.clear(); } - for(int com=0; comGetCommand(com+1); - commandPath = Comp->GetCommandPath(); - parameterEntry = Comp->GetParameterEntries(); - param = commandPath +" "; - for( int par=0; par< parameterEntry; par++) { - prp = (G4UIparameter *)Comp->GetParameter(par); - param += prp->GetParameterName() +" "; - str(0) = prp->GetParameterType(); - param += str + " "; - param += prp->GetDefaultValue() +" "; - param += prp->GetParameterRange() +" "; - param += prp->GetParameterCandidates(); - } - newTreeParams.push_back( param + "\n"); - newTreePCP.push_back( Comp ); - } - if( treeEntry == 0 ) return; // end recursion - for( int i=0; i< treeEntry; i++) { - t = tree->GetTree(i+1); - GetNewTreeValues(t, level+1); - } -} - - -#endif - - - - - - - - - - - - diff --git a/source/interfaces/GNUmakefile b/source/interfaces/GNUmakefile index 8c7bf8a617..022c0c8019 100644 --- a/source/interfaces/GNUmakefile +++ b/source/interfaces/GNUmakefile @@ -25,8 +25,6 @@ ifdef G4UI_BUILD SUBLIBS := G4UIcommon SUBDIRS += basic SUBLIBS += G4UIbasic - SUBDIRS += GAG - SUBLIBS += G4UIGAG endif include $(G4INSTALL)/config/globlib.gmk diff --git a/source/interfaces/History b/source/interfaces/History index 643e8ae9f0..3dc4acf517 100644 --- a/source/interfaces/History +++ b/source/interfaces/History @@ -16,6 +16,49 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +11 November 2021 - Koichi Murakami (interfaces-V10-07-23) +- Add verbose setting in G4UIExecutive [BZ-2402] + +8 November 2021 - Ben Morgan (interfaces-V10-07-22) +- Retire G4UI/G4INTY_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +02 November 2021 - Laurent Garnier (interfaces-V10-07-21) +- Fix HTML links in Qt UI Start page + +28 October 2021 - John Allison (interfaces-V10-07-20) +- G4UIQt.cc: Replace '<' by "<" in session output. + +25 October 2021 - Ben Morgan (interfaces-V10-07-19) +- Use G4StrUtil functions replacing deprecated G4String member functions + +19 October 2021 - Ben Morgan (interfaces-V10-07-18) +- Don't discard return value of G4String::strip. + +18 October 2021 - B. Morgan (interfaces-V10-07-17) +- Use std::string member functions from G4String in place of synonyms + +04 October 2021 - Stewart Boogert / Laurie Nevay (interfaces-V10-07-16) +- Add context for VtkQt visualisation driver + +1 October 2021 Ben Morgan (interfaces-V10-07-15) +- Use proper enum interface for G4String::strip + +25 September 2021 Ben Morgan (interfaces-V10-07-14) +- Remove no longer support GAG/Gain UI + +21 September 2021 Guilherme Amadio (interfaces-V10-07-13) +- Fix C++20 warnings from GCC 11.2.0. + +12 Jujy 2021 Igor Semeniouk (interfaces-V10-07-12) +- G4UIQt.hh: add fExitIcon pointer +- G4UIQt.cc: "exit" icon and extension selection +- G4InteractorMessenger.cc - allow use exit icon by user + +23 June 2021 Igor Semeniouk (interfaces-V10-07-11) +- G4UIQt.cc: Fix "Viewer Properties" window opened on Startup + o "viewer" window must be constructed with setVisiable(false) + 22 April 2021 Ben Morgan (interfaces-V10-07-10) - G4UIQt.cc: Deal properly with creation and deletion of Viewer Properties diff --git a/source/interfaces/basic/GNUmakefile b/source/interfaces/basic/GNUmakefile index 089904b86b..da92c3a468 100644 --- a/source/interfaces/basic/GNUmakefile +++ b/source/interfaces/basic/GNUmakefile @@ -23,9 +23,27 @@ OGLLIBS = CPPFLAGS += -I$(G4BASE)/global/management/include CPPFLAGS += -I$(G4BASE)/interfaces/common/include -CPPFLAGS += -I$(G4BASE)/interfaces/GAG/include CPPFLAGS += -I$(G4BASE)/intercoms/include +# Locally adjust source list before including common.gmk +sources := $(addprefix src/,G4UIArrayString.cc G4UIExecutive.cc G4UIcsh.cc G4UIterminal.cc G4VUIshell.cc) + +ifeq (,$(findstring WIN32,$(G4SYSTEM))) + sources += src/G4UItcsh.cc +endif + +ifdef G4UI_BUILD_XM_SESSION + sources += src/G4UIXm.cc +endif + +ifdef G4UI_BUILD_QT_SESSION + sources += src/G4UIQt.cc +endif + +ifdef G4UI_BUILD_WIN32_SESSION + sources += src/G4UIWin32.cc +endif + include $(G4INSTALL)/config/moc.gmk include $(G4INSTALL)/config/common.gmk diff --git a/source/interfaces/basic/include/G4UIExecutive.hh b/source/interfaces/basic/include/G4UIExecutive.hh index e5e20030d8..466578cd24 100644 --- a/source/interfaces/basic/include/G4UIExecutive.hh +++ b/source/interfaces/basic/include/G4UIExecutive.hh @@ -65,13 +65,15 @@ public: G4bool IsGUI() const; + void SetVerbose(G4bool val); + void SetPrompt(const G4String& prompt); void SetLsColor(TermColorIndex dirColor, TermColorIndex cmdColor); void SessionStart(); private: - enum SessionType { kNone, kQt, kXm, kWin32, kGag, kTcsh, kCsh }; + enum SessionType { kNone, kQt, kXm, kWin32, kTcsh, kCsh }; SessionType selected; G4UIsession* session; @@ -79,6 +81,8 @@ private: G4bool isGUI; + G4bool verbose; + std::map sessionMap; void SelectSessionByArg(const G4String& stype); @@ -98,4 +102,9 @@ inline G4bool G4UIExecutive::IsGUI() const return isGUI; } +inline void G4UIExecutive::SetVerbose(G4bool val) +{ + verbose = val; +} + #endif diff --git a/source/interfaces/basic/include/G4UIQt.hh b/source/interfaces/basic/include/G4UIQt.hh index 3f8cd9df78..bc0aaddb1a 100644 --- a/source/interfaces/basic/include/G4UIQt.hh +++ b/source/interfaces/basic/include/G4UIQt.hh @@ -28,8 +28,6 @@ #ifndef G4UIQt_h #define G4UIQt_h -#if defined(G4UI_BUILD_QT_SESSION) || defined(G4UI_USE_QT) - #include #include "G4VBasicShell.hh" @@ -49,6 +47,7 @@ class QListWidget; class QTreeWidget; class QTreeWidgetItem; class QTextEdit; +class QTextBrowser; class QLabel; class QResizeEvent; class QTabWidget; @@ -340,7 +339,7 @@ private: QLineEdit* fHelpLine; G4QTabWidget* fViewerTabWidget; QString fCoutText; - QTextEdit *fStartPage; + QTextBrowser *fStartPage; QSplitter * fHelpVSplitter; QTextEdit* fParameterHelpLabel; QTableWidget* fParameterHelpTable; @@ -373,6 +372,7 @@ private: QPixmap* fRunIcon; QPixmap* fParamIcon; QPixmap* fPickTargetIcon; + QPixmap* fExitIcon; #ifdef G4MULTITHREADED QComboBox* fThreadsFilterComboBox; @@ -422,5 +422,3 @@ private Q_SLOTS : #endif -#endif - diff --git a/source/interfaces/basic/include/G4UIWin32.hh b/source/interfaces/basic/include/G4UIWin32.hh index 0c09b120c3..2d70e5d206 100644 --- a/source/interfaces/basic/include/G4UIWin32.hh +++ b/source/interfaces/basic/include/G4UIWin32.hh @@ -49,8 +49,6 @@ #ifndef G4UIWin32_h #define G4UIWin32_h -#if defined(G4UI_BUILD_WIN32_SESSION) || defined(G4UI_USE_WIN32) - #define ID_EXIT_APP 40001 #define ID_OPEN_MACRO 40002 #define ID_SAVE_VIEWER_STATE 40003 @@ -184,5 +182,3 @@ class G4UIWin32 : public G4VBasicShell, public G4VInteractiveSession }; #endif - -#endif diff --git a/source/interfaces/basic/include/G4UIXm.hh b/source/interfaces/basic/include/G4UIXm.hh index 81a865b34e..57661580a5 100644 --- a/source/interfaces/basic/include/G4UIXm.hh +++ b/source/interfaces/basic/include/G4UIXm.hh @@ -28,8 +28,6 @@ #ifndef G4UIXm_h #define G4UIXm_h -#if defined(G4UI_BUILD_XM_SESSION) || defined(G4UI_USE_XM) - #include #include @@ -100,5 +98,3 @@ private: #endif -#endif - diff --git a/source/interfaces/basic/sources.cmake b/source/interfaces/basic/sources.cmake index 99b2f9c33c..e363a1df7f 100644 --- a/source/interfaces/basic/sources.cmake +++ b/source/interfaces/basic/sources.cmake @@ -32,7 +32,8 @@ if(MSVC) list(APPEND G4INTERFACES_BASIC_MODULE_HEADERS G4UIWin32.hh) list(APPEND G4INTERFACES_BASIC_MODULE_SOURCES G4UIWin32.cc) - list(APPEND G4INTERFACES_BASIC_MODULE_COMPILE_DEFINITIONS G4UI_BUILD_WIN32_SESSION G4INTY_BUILD_WIN32) + # Definition required by G4UIexecutive + list(APPEND G4INTERFACES_BASIC_MODULE_COMPILE_DEFINITIONS G4UI_BUILD_WIN32_SESSION) endif() # Qt only if selected. @@ -40,9 +41,8 @@ if(GEANT4_USE_QT) list(APPEND G4INTERFACES_BASIC_MODULE_HEADERS G4UIQt.hh) list(APPEND G4INTERFACES_BASIC_MODULE_SOURCES G4UIQt.cc) - # Add the definitions - # We have to also add in G4INTY_BUILD_QT 'cause G4QT header needs that... - list(APPEND G4INTERFACES_BASIC_MODULE_COMPILE_DEFINITIONS G4UI_BUILD_QT_SESSION G4INTY_BUILD_QT) + # Add the definition required by G4UIexecutive + list(APPEND G4INTERFACES_BASIC_MODULE_COMPILE_DEFINITIONS G4UI_BUILD_QT_SESSION) # Add the extra libraries list(APPEND G4INTERFACES_BASIC_MODULE_LINK_LIBRARIES Qt5::Gui Qt5::Widgets Qt5::Core) @@ -53,8 +53,8 @@ if(UNIX AND GEANT4_USE_XM) list(APPEND G4INTERFACES_BASIC_MODULE_HEADERS G4UIXm.hh) list(APPEND G4INTERFACES_BASIC_MODULE_SOURCES G4UIXm.cc) - # Add the compile definitions - also need INTY versions - list(APPEND G4INTERFACES_BASIC_MODULE_COMPILE_DEFINITIONS G4UI_BUILD_XM_SESSION G4INTY_BUILD_XT) + # Add the compile definition needed by G4UIexecutive + list(APPEND G4INTERFACES_BASIC_MODULE_COMPILE_DEFINITIONS G4UI_BUILD_XM_SESSION) # Need the X11 and Motif libraries list(APPEND G4INTERFACES_BASIC_MODULE_LINK_LIBRARIES @@ -78,9 +78,7 @@ geant4_module_link_libraries(G4UIbasic G4intercoms G4globman ${G4INTERFACES_BASIC_MODULE_LINK_LIBRARIES} - ${timemory_LIBRARIES} - PRIVATE - G4UIGAG) + ${timemory_LIBRARIES}) # List any source specific properties here if(MSVC) diff --git a/source/interfaces/basic/src/G4UIArrayString.cc b/source/interfaces/basic/src/G4UIArrayString.cc index 3c894ded7d..509444c2f9 100644 --- a/source/interfaces/basic/src/G4UIArrayString.cc +++ b/source/interfaces/basic/src/G4UIArrayString.cc @@ -38,13 +38,12 @@ G4UIArrayString::G4UIArrayString(const G4String& stream) nElement=0; nColumn=5; // temporal assignment - G4String tmpstr= stream; // G4String::strip() CONST !! - G4String astream= tmpstr.strip(G4String::both); + G4String astream = G4StrUtil::strip_copy(stream); // tokenize... G4int indx=0; while(1) { - G4int jc= astream.index(" ", indx); + G4int jc= astream.find(" ", indx); nElement++; if(jc == G4int(G4String::npos)) break; jc++; // fix a tiny mistake... @@ -61,15 +60,15 @@ G4UIArrayString::G4UIArrayString(const G4String& stream) // push... indx=0; for(G4int i=0; i::iterator it = sessionMap.find(appname); if ( it != sessionMap.end() ) stype = sessionMap[appname]; else stype = default_session; - stype.toLower(); + G4StrUtil::to_lower(stype); // select session... if ( qt_build && stype == "qt" ) selected = kQt; else if ( xm_build && stype == "xm" ) selected = kXm; else if ( win32_build && stype == "win32" ) selected = kWin32; - else if ( stype == "gag" ) selected = kGag; else if ( tcsh_build && stype == "tcsh" ) selected = kTcsh; else if ( stype == "csh" ) selected = kCsh; } diff --git a/source/interfaces/basic/src/G4UIQt.cc b/source/interfaces/basic/src/G4UIQt.cc index b1009a1b86..9f2dcdf091 100644 --- a/source/interfaces/basic/src/G4UIQt.cc +++ b/source/interfaces/basic/src/G4UIQt.cc @@ -27,8 +27,6 @@ // // L. Garnier -#ifdef G4UI_BUILD_QT_SESSION - #include "G4Types.hh" #include @@ -55,6 +53,7 @@ #include #include #include +#include #if QT_VERSION < 0x050600 #include #endif @@ -340,7 +339,7 @@ void G4UIQt::SetDefaultIconsToolbar( int intVP = 0; signalMapperViewerProperties->setMapping(actionViewerProperties, intVP); #else - fToolbarApp->addAction(QIcon(*fParamIcon),"Viewer properties", this, [=](){ this->ViewerPropertiesIconCallback(0); }); + fToolbarApp->addAction(QIcon(*fParamIcon),"Viewer properties", this, [this](){ this->ViewerPropertiesIconCallback(0); }); #endif // Cursors style icons @@ -360,6 +359,7 @@ void G4UIQt::SetDefaultIconsToolbar( AddIcon("Perspective", "perspective",""); AddIcon("Orthographic", "ortho",""); AddIcon("Run beam on", "runBeamOn","/run/beamOn 1"); + AddIcon("Exit Application", "exit","exit"); } } @@ -1387,6 +1387,95 @@ void G4UIQt::CreateIcons( }; fParamIcon = new QPixmap(paramIcon); + const char * const exitIcon[]={ + /* columns rows colors chars-per-pixel */ + "23 28 55 1 ", + " c None", + ". c #350505", + "X c #3A0505", + "o c #3C0605", + "O c #3D0605", + "+ c #430606", + "@ c #440606", + "# c #470706", + "$ c #500707", + "% c #510807", + "& c #520807", + "* c #530807", + "= c #550808", + "- c #570808", + "; c #5C0908", + ": c #5D0908", + "> c #5F0908", + ", c #630A08", + "< c #640A09", + "1 c #6B0A09", + "2 c #6C0A09", + "3 c #720B0A", + "4 c #760B0A", + "5 c #770B0A", + "6 c #7A0B0B", + "7 c #7D0C0B", + "8 c #7F0C0B", + "9 c #840D0B", + "0 c #850D0C", + "q c #880D0C", + "w c #8D0E0C", + "e c #900E0C", + "r c #940E0D", + "t c #950E0D", + "y c #9C0F0E", + "u c #9E100E", + "i c #AA100E", + "p c #AC100F", + "a c #AD100F", + "s c #AE110F", + "d c #B31110", + "f c #B51210", + "g c #B61210", + "h c #B71210", + "j c #B91210", + "k c #C01311", + "l c #C21311", + "z c #C81311", + "x c #C91312", + "c c #CC1412", + "v c #CE1412", + "b c #D01412", + "n c #D11412", + "m c #D31412", + "M c #D51513", + /* pixels */ + " ", + " O= ", + " :MMh ", + " hMMM ", + " jMMM ", + " setAcceptRichText (true); + fStartPage = new QTextBrowser(); fStartPage->setContentsMargins(5,5,5,5); fStartPage->setReadOnly(true); } - fStartPage->setText(fDefaultViewerFirstPageHTMLText.c_str()); + fStartPage->setOpenExternalLinks(true); + fStartPage->setHtml(fDefaultViewerFirstPageHTMLText.c_str()); } @@ -2022,7 +2111,7 @@ G4int G4UIQt::ReceiveG4cout ( // Try to be smart : // "*** This is just a warning message. ***" - if (aString.contains("*** This is just a warning message. ***")) { + if (G4StrUtil::contains(aString, "*** This is just a warning message. ***")) { return ReceiveG4cerr(aString); } @@ -2049,6 +2138,8 @@ G4int G4UIQt::ReceiveG4cout ( aStringWithStyle += " "; } else if (aString[i] == '\t') { aStringWithStyle += "    "; + } else if (aString[i] == '<') { + aStringWithStyle += "<"; } else { aStringWithStyle += aString[i]; } @@ -2134,6 +2225,8 @@ G4int G4UIQt::ReceiveG4cerr ( aStringWithStyle += " "; } else if (aString[i] == '\t') { aStringWithStyle += "    "; + } else if (aString[i] == '<') { + aStringWithStyle += "<"; } else { aStringWithStyle += aString[i]; } @@ -2293,16 +2386,16 @@ void G4UIQt::AddButton ( if(treeTop->FindPath(cmd) == NULL) { if(cmd != "ls" && - cmd(0,3) != "ls " && + cmd.substr(0,3) != "ls " && cmd != "pwd" && cmd != "cd" && - cmd(0,3) != "cd " && + cmd.substr(0,3) != "cd " && cmd != "help" && - cmd(0,5) != "help " && - cmd(0) != '?' && + cmd.substr(0,5) != "help " && + cmd[0] != '?' && cmd != "hist" && cmd != "history" && - cmd(0) != '!' && + cmd[0] != '!' && cmd != "exit" && cmd != "cont" && cmd != "continue"){ @@ -2323,7 +2416,7 @@ void G4UIQt::AddButton ( signalMapper->setMapping(action, QString(aCommand)); #else QString cmd_tmp = QString(aCommand); - parentTmp->addAction(aLabel, this, [=](){ this->ButtonCallback(cmd_tmp); }); + parentTmp->addAction(aLabel, this, [this, cmd_tmp](){ this->ButtonCallback(cmd_tmp); }); #endif } @@ -2387,6 +2480,8 @@ void G4UIQt::AddIcon(const char* aLabel, const char* aIconFile, const char* aCom pix = fOrthoIcon; } else if (std::string(aIconFile) == "runBeamOn") { pix = fRunIcon; + } else if (std::string(aIconFile) == "exit") { + pix = fExitIcon; } else { G4UImanager* UImanager = G4UImanager::GetUIpointer(); G4int verbose = UImanager->GetVerboseLevel(); @@ -2439,7 +2534,7 @@ void G4UIQt::AddIcon(const char* aLabel, const char* aIconFile, const char* aCom connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(OpenIconCallback(const QString &))); signalMapper->setMapping(action, QString(txt)); #else - currentToolbar->addAction(QIcon(*pix), aIconFile, this, [=](){ this->OpenIconCallback(txt); }); + currentToolbar->addAction(QIcon(*pix), aIconFile, this, [this, txt](){ this->OpenIconCallback(txt); }); #endif // special cases :"save" @@ -2449,7 +2544,7 @@ void G4UIQt::AddIcon(const char* aLabel, const char* aIconFile, const char* aCom connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(SaveIconCallback(const QString&))); signalMapper->setMapping(action, QString(txt)); #else - currentToolbar->addAction(QIcon(*pix), aIconFile, this, [=](){ this->SaveIconCallback(txt); }); + currentToolbar->addAction(QIcon(*pix), aIconFile, this, [this, txt](){ this->SaveIconCallback(txt); }); #endif // special cases : cursor style @@ -2463,7 +2558,7 @@ void G4UIQt::AddIcon(const char* aLabel, const char* aIconFile, const char* aCom signalMapper->setMapping(action, QString(aIconFile)); #else QString txt = QString(aIconFile); - QAction* action = currentToolbar->addAction(QIcon(*pix), aIconFile, this, [=](){ this->ChangeCursorAction(txt); }); + QAction* action = currentToolbar->addAction(QIcon(*pix), aIconFile, this, [this, txt](){ this->ChangeCursorAction(txt); }); #endif action->setCheckable(TRUE); action->setChecked(TRUE); @@ -2495,7 +2590,7 @@ void G4UIQt::AddIcon(const char* aLabel, const char* aIconFile, const char* aCom signalMapper->setMapping(action, QString(aIconFile)); #else QString txt = QString(aIconFile); - QAction* action = currentToolbar->addAction(QIcon(*pix), aIconFile, this, [=](){ this->ChangeSurfaceStyle(txt); }); + QAction* action = currentToolbar->addAction(QIcon(*pix), aIconFile, this, [this, txt](){ this->ChangeSurfaceStyle(txt); }); #endif action->setCheckable(TRUE); action->setChecked(TRUE); @@ -2522,7 +2617,7 @@ void G4UIQt::AddIcon(const char* aLabel, const char* aIconFile, const char* aCom signalMapper->setMapping(action, QString(aIconFile)); #else QString txt = QString(aIconFile); - QAction* action = currentToolbar->addAction(QIcon(*pix), aIconFile, this, [=](){ this->ChangePerspectiveOrtho(txt); }); + QAction* action = currentToolbar->addAction(QIcon(*pix), aIconFile, this, [this, txt](){ this->ChangePerspectiveOrtho(txt); }); #endif action->setCheckable(TRUE); action->setChecked(TRUE); @@ -2563,7 +2658,7 @@ void G4UIQt::AddIcon(const char* aLabel, const char* aIconFile, const char* aCom signalMapper->setMapping(action, QString(aCommand)); #else QString txt = QString(aCommand); - currentToolbar->addAction(QIcon(*pix), aCommand, this, [=](){ this->ButtonCallback(txt); }); + currentToolbar->addAction(QIcon(*pix), aCommand, this, [this, txt](){ this->ButtonCallback(txt); }); #endif } } @@ -2610,12 +2705,12 @@ void G4UIQt::ActivateCommand( return; } // Look for the choosen command "newCommand" - size_t i = newCommand.index(" "); + size_t i = newCommand.find(" "); G4String targetCom =""; if( i != std::string::npos ) { - G4String newValue = newCommand(i+1,newCommand.length()-(i+1)); - newValue.strip(G4String::both); + G4String newValue = newCommand.substr(i+1,newCommand.length()-(i+1)); + G4StrUtil::strip(newValue); targetCom = ModifyToFullPathCommand( newValue ); } if (targetCom != "") { @@ -2997,7 +3092,7 @@ bool G4UIQt::CreateCommandWidget(G4UIcommand* aCommand, QWidget* aParent, bool i } else if (defaultValue == "1") { radioOn->setChecked(true); } - } else if ((QString(QChar(param->GetParameterType())) == "s") && (!param->GetParameterCandidates().isNull())) { + } else if ((QString(QChar(param->GetParameterType())) == "s") && (!param->GetParameterCandidates().empty())) { input = new QComboBox(); QString candidates = QString((char*)(param->GetParameterCandidates()).data()); QStringList list = candidates.split (" "); @@ -3043,7 +3138,7 @@ bool G4UIQt::CreateCommandWidget(G4UIcommand* aCommand, QWidget* aParent, bool i } txt += "\nParameter : " + QString((char*)(param->GetParameterName()).data()) + "\n"; - if( ! param->GetParameterGuidance().isNull() ) + if( ! param->GetParameterGuidance().empty() ) txt += QString((char*)(param->GetParameterGuidance()).data())+ "\n" ; txt += " Parameter type : " + QString(QChar(param->GetParameterType())) + "\n"; @@ -3054,13 +3149,13 @@ bool G4UIQt::CreateCommandWidget(G4UIcommand* aCommand, QWidget* aParent, bool i } if( param->GetCurrentAsDefault() ) { txt += " Default value : taken from the current value\n"; - } else if( ! param->GetDefaultValue().isNull() ) { + } else if( ! param->GetDefaultValue().empty() ) { txt += " Default value : " + QString((char*)(param->GetDefaultValue()).data())+ "\n"; } - if( ! param->GetParameterRange().isNull() ) { + if( ! param->GetParameterRange().empty() ) { txt += " Parameter range : " + QString((char*)(param->GetParameterRange()).data())+ "\n"; } - if( ! param->GetParameterCandidates().isNull() ) { + if( ! param->GetParameterCandidates().empty() ) { txt += " Candidates : " + QString((char*)(param->GetParameterCandidates()).data())+ "\n"; } @@ -3106,7 +3201,7 @@ bool G4UIQt::CreateCommandWidget(G4UIcommand* aCommand, QWidget* aParent, bool i connect(input, SIGNAL(clicked()), signalMapper, SLOT(map())); connect(signalMapper, SIGNAL(mapped(QWidget*)),this, SLOT(ChangeColorCallback(QWidget*))); #else - connect(dynamic_cast(input), &QPushButton::clicked , [=](){ this->ChangeColorCallback(input);}); + connect(dynamic_cast(input), &QPushButton::clicked , [this, input](){ this->ChangeColorCallback(input);}); #endif isColorDialogAdded = true; isStillColorParameter = false; @@ -3133,7 +3228,7 @@ bool G4UIQt::CreateCommandWidget(G4UIcommand* aCommand, QWidget* aParent, bool i connect(applyButton, SIGNAL(clicked()), signalMapper, SLOT(map())); connect(signalMapper, SIGNAL(mapped(QWidget*)),this, SLOT(VisParameterCallback(QWidget*))); #else - connect(applyButton, &QPushButton::clicked , [=](){ this->VisParameterCallback(paramWidget);}); + connect(applyButton, &QPushButton::clicked , [this, paramWidget](){ this->VisParameterCallback(paramWidget);}); #endif } else { // Apply/Cancel buttons @@ -3152,7 +3247,7 @@ bool G4UIQt::CreateCommandWidget(G4UIcommand* aCommand, QWidget* aParent, bool i connect(applyButton, SIGNAL(clicked()), signalMapper, SLOT(map())); connect(signalMapper, SIGNAL(mapped(QWidget*)),this, SLOT(VisParameterCallback(QWidget*))); #else - connect(applyButton, &QPushButton::clicked , [=](){ this->VisParameterCallback(paramWidget);}); + connect(applyButton, &QPushButton::clicked , [this, paramWidget](){ this->VisParameterCallback(paramWidget);}); #endif QWidget * parentCheck = aParent; @@ -3249,7 +3344,7 @@ QString G4UIQt::GetCommandList ( for( G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ ) { txt += QString((char*)(aCommand->GetGuidanceLine(i_thGuidance)).data()) + "\n"; } - if( ! rangeString.isNull() ) { + if( ! rangeString.empty() ) { txt += " Range of parameters : " + QString((char*)(rangeString).data()) + "\n"; } if( n_parameterEntry > 0 ) { @@ -3260,7 +3355,7 @@ QString G4UIQt::GetCommandList ( for( G4int i_thParameter=0; i_thParameterGetParameter(i_thParameter); txt += "\nParameter : " + QString((char*)(param->GetParameterName()).data()) + "\n"; - if( ! param->GetParameterGuidance().isNull() ) + if( ! param->GetParameterGuidance().empty() ) txt += QString((char*)(param->GetParameterGuidance()).data())+ "\n" ; txt += " Parameter type : " + QString(QChar(param->GetParameterType())) + "\n"; if(param->IsOmittable()){ @@ -3270,13 +3365,13 @@ QString G4UIQt::GetCommandList ( } if( param->GetCurrentAsDefault() ) { txt += " Default value : taken from the current value\n"; - } else if( ! param->GetDefaultValue().isNull() ) { + } else if( ! param->GetDefaultValue().empty() ) { txt += " Default value : " + QString((char*)(param->GetDefaultValue()).data())+ "\n"; } - if( ! param->GetParameterRange().isNull() ) { + if( ! param->GetParameterRange().empty() ) { txt += " Parameter range : " + QString((char*)(param->GetParameterRange()).data())+ "\n"; } - if( ! param->GetParameterCandidates().isNull() ) { + if( ! param->GetParameterCandidates().empty() ) { txt += " Candidates : " + QString((char*)(param->GetParameterCandidates()).data())+ "\n"; } } @@ -3333,7 +3428,7 @@ void G4UIQt::updateHelpArea ( tmpGuidance.replace("\n","
      "); txt += tmpGuidance + "
      "; } - if( ! rangeString.isNull() ) { + if( ! rangeString.empty() ) { QString range = QString((char*)(rangeString).data()); #if QT_VERSION < 0x050000 range = Qt::escape(range); @@ -3387,7 +3482,7 @@ void G4UIQt::updateHelpArea ( fParameterHelpTable->setItem(a, 0, new QTableWidgetItem(QString::number(a+1))); fParameterHelpTable->setItem(a, 1, new QTableWidgetItem(QString((char*)(param->GetParameterName()).data()))); - if( ! param->GetParameterGuidance().isNull() ) { + if( ! param->GetParameterGuidance().empty() ) { fParameterHelpTable->setItem(a, 2, new QTableWidgetItem(QString((char*)(param->GetParameterGuidance()).data()))); } fParameterHelpTable->setItem(a, 3, new QTableWidgetItem(QString(QChar(param->GetParameterType())))); @@ -3399,13 +3494,13 @@ void G4UIQt::updateHelpArea ( } if( param->GetCurrentAsDefault() ) { fParameterHelpTable->setItem(a, 5, new QTableWidgetItem(QString("taken from the current value"))); - } else if( ! param->GetDefaultValue().isNull() ) { + } else if( ! param->GetDefaultValue().empty() ) { fParameterHelpTable->setItem(a, 5, new QTableWidgetItem(QString((char*)(param->GetDefaultValue()).data()))); } - if( ! param->GetParameterRange().isNull() ) { + if( ! param->GetParameterRange().empty() ) { fParameterHelpTable->setItem(a, 6, new QTableWidgetItem(QString((char*)(param->GetParameterRange()).data()))); } - if( ! param->GetParameterCandidates().isNull() ) { + if( ! param->GetParameterCandidates().empty() ) { fParameterHelpTable->setItem(a, 7, new QTableWidgetItem(QString((char*)(param->GetParameterCandidates()).data()))); } // tooltips @@ -3630,8 +3725,8 @@ QStandardItemModel* G4UIQt::CreateCompleterModel(G4String aCmd) { G4String matchingPath = empty; // find the tree - G4int jpre= pName.last('/'); - if(jpre != G4int(G4String::npos)) pName.remove(jpre+1); + auto jpre= pName.rfind('/'); + if(jpre != G4String::npos) pName.erase(jpre+1); G4UImanager* UI = G4UImanager::GetUIpointer(); G4UIcommandTree * commandTreeTop = UI->GetTree(); G4UIcommandTree* aTree = commandTreeTop->FindCommandTree(pName); @@ -3643,7 +3738,7 @@ QStandardItemModel* G4UIQt::CreateCompleterModel(G4String aCmd) { for(G4int idir=1; idir<=Ndir; idir++) { G4String fpdir= aTree-> GetTree(idir)-> GetPathName(); // matching test - if( fpdir.index(remainingPath, 0) == 0) { + if( fpdir.find(remainingPath, 0) == 0) { if(nMatch==0) { matchingPath = fpdir; } else { @@ -3702,7 +3797,7 @@ QStandardItemModel* G4UIQt::CreateCompleterModel(G4String aCmd) { // matching test - if( longCommandName.index(remainingPath, 0) ==0) { + if( longCommandName.find(remainingPath, 0) ==0) { if(nMatch==0) { matchingPath= longCommandName + " "; } else { @@ -3829,7 +3924,7 @@ void G4UIQt::CommandEnteredCallback ( } G4String command = txt.toStdString().c_str(); - if (command(0,4) != "help") { + if (command.substr(0,4) != "help") { ApplyShellCommand (command,exitSession,exitPause); } else { ActivateCommand(command); @@ -3952,8 +4047,7 @@ void G4UIQt::ButtonCallback ( const QString& aCommand ) { - G4String ss = G4String(aCommand.toStdString().c_str()); - ss = ss.strip(G4String::leading); + G4String ss = G4StrUtil::lstrip_copy(G4String(aCommand.toStdString().c_str())); G4UImanager* UI = G4UImanager::GetUIpointer(); if(UI==NULL) return; @@ -4572,7 +4666,7 @@ void G4UIQt::OpenIconCallback(const QString& aParam) { QString aCommand = aParam.left(aParam.indexOf(fStringSeparator)); QString aLabel = aParam.mid(aParam.indexOf(fStringSeparator)+fStringSeparator.length()); - QString nomFich = QFileDialog::getOpenFileName(fMainWindow, aLabel, fLastOpenPath, "Macro files (*.mac)"); + QString nomFich = QFileDialog::getOpenFileName(fMainWindow, aLabel, fLastOpenPath, "Macro files (*.mac);;Geant4 files( *.mac *.g4* *.in);;All (*.*)"); if (nomFich != "") { G4UImanager::GetUIpointer()->ApplyCommand((QString(aCommand)+ QString(" ")+ nomFich).toStdString().c_str()); QDir dir; @@ -4663,9 +4757,7 @@ void G4UIQt::CreateEmptyViewerPropertiesWidget() { QLabel* label = new QLabel("No viewer - Please open a viewer first"); fViewerPropertiesWidget->layout()->addWidget(label); fViewerPropertiesDialog->setWindowTitle("No viewer"); - fViewerPropertiesDialog->show(); - fViewerPropertiesDialog->raise(); - fViewerPropertiesDialog->activateWindow(); + fViewerPropertiesDialog->setVisible(false); } @@ -5072,7 +5164,6 @@ void G4UIQt::TabCloseCallback(int a){ } if (lastTab) { - CreateViewerPropertiesDialog(); CreateEmptyViewerPropertiesWidget(); } // delete the widget @@ -5140,5 +5231,3 @@ void G4UIDockWidget::closeEvent(QCloseEvent *aEvent) { // hide them instead hide(); } - - #endif diff --git a/source/interfaces/basic/src/G4UIWin32.cc b/source/interfaces/basic/src/G4UIWin32.cc index 31993ae534..b1705aa862 100644 --- a/source/interfaces/basic/src/G4UIWin32.cc +++ b/source/interfaces/basic/src/G4UIWin32.cc @@ -27,8 +27,6 @@ // Rewrite: O.Pena-Rodriguez, March 2021 // -------------------------------------------------------------------- -#ifdef G4UI_BUILD_WIN32_SESSION - #include "G4UIWin32.hh" #include @@ -1309,6 +1307,3 @@ G4bool ConvertStringToInt(const char* aString, G4int& aInt) { } /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ /****************************************************************************************************/ - - -#endif diff --git a/source/interfaces/basic/src/G4UIXm.cc b/source/interfaces/basic/src/G4UIXm.cc index 386026107e..5c681f758b 100644 --- a/source/interfaces/basic/src/G4UIXm.cc +++ b/source/interfaces/basic/src/G4UIXm.cc @@ -29,8 +29,6 @@ //#define DEBUG -#ifdef G4UI_BUILD_XM_SESSION - #include "G4Types.hh" #include @@ -504,6 +502,3 @@ void ExecuteChangeSizeFunction ( if(aWidget->core.widget_class->core_class.resize==NULL) return; (aWidget->core.widget_class->core_class.resize)(aWidget); } - - -#endif diff --git a/source/interfaces/basic/src/G4UIcsh.cc b/source/interfaces/basic/src/G4UIcsh.cc index 1875c80d8d..74a8c757c6 100644 --- a/source/interfaces/basic/src/G4UIcsh.cc +++ b/source/interfaces/basic/src/G4UIcsh.cc @@ -50,20 +50,20 @@ G4String G4UIcsh::GetCommandLineString(const char* msg) G4cout << promptString << std::flush; G4String newCommand; - newCommand.readLine(G4cin, FALSE); + G4StrUtil::readline(G4cin, newCommand, false); if (!G4cin.good()) { G4cin.clear(); newCommand= "exit"; return newCommand; } - newCommand = newCommand.strip(1,'\r'); // fix for odd behavior on Windows + G4StrUtil::rstrip(newCommand, '\r'); // fix for odd behavior on Windows // multi-line while( (newCommand.length() > 0) && (newCommand[newCommand.length()-1] == '_') ) { G4String newLine; - newCommand.remove(newCommand.length()-1); - newLine.readLine(G4cin, FALSE); + newCommand.erase(newCommand.length()-1); + G4StrUtil::readline(G4cin, newLine, false); if (!G4cin.good()) { G4cin.clear(); newCommand= "exit"; diff --git a/source/interfaces/basic/src/G4UItcsh.cc b/source/interfaces/basic/src/G4UItcsh.cc index 162e5555c3..e6bc8c2ae6 100644 --- a/source/interfaces/basic/src/G4UItcsh.cc +++ b/source/interfaces/basic/src/G4UItcsh.cc @@ -87,8 +87,7 @@ G4UItcsh::G4UItcsh(const G4String& prompt, G4int maxhist) if(histfile.eof()) break; histfile.getline(linebuf, BUFSIZE); - G4String aline= linebuf; - aline.strip(G4String::both); + G4String aline= G4StrUtil::strip_copy(linebuf); if(aline.size() != 0) StoreHistory(linebuf); } histfile.close(); @@ -162,13 +161,13 @@ void G4UItcsh::MakePrompt(const char* msg) break; } } else { - promptString.append(G4String(promptSetting[i])); + promptString += promptSetting[i]; } } // append last chaacter if(i == promptSetting.length()-1) - promptString.append(G4String(promptSetting[i])); + promptString += promptSetting[i]; } @@ -210,7 +209,7 @@ void G4UItcsh::InsertCharacter(char cc) if(IsCursorLast()) { // add commandLine+= cc; } else { // insert - commandLine.insert(cursorPosition-1, G4String(cc)); + commandLine.insert(cursorPosition-1, G4String(1,cc)); } cursorPosition++; } @@ -400,14 +399,13 @@ void G4UItcsh::ListMatchedCommand() G4cout << G4endl; // input string - G4String input= G4String(commandLine).strip(G4String::leading); + G4String input = G4StrUtil::lstrip_copy(commandLine); // target token is last token - G4int jhead= input.last(' '); - if(jhead != G4int(G4String::npos)) { - input.remove(0, jhead); - input= input.strip(G4String::leading); + auto jhead= input.rfind(' '); + if(jhead != G4String::npos) { + input.erase(0, jhead); + G4StrUtil::lstrip(input); } - //G4cout << "@@@@ input=" << input << G4endl; // command tree of "user specified directory" G4String vpath = currentCommandDir; @@ -423,8 +421,8 @@ void G4UItcsh::ListMatchedCommand() } } // get abs. path - if(indx != -1) vpath= GetAbsCommandDirPath(input(0,indx+1)); - if(!(indx==0 && len==1)) vcmd= input(indx+1,len-indx-1); // care for "/" + if(indx != -1) vpath= GetAbsCommandDirPath(input.substr(0,indx+1)); + if(!(indx==0 && len==1)) vcmd= input.substr(indx+1,len-indx-1); // care for "/" } // list matched dirs/commands @@ -439,18 +437,19 @@ void G4UItcsh::CompleteCommand() //////////////////////////////// { // inputting string - G4String input= G4String(commandLine).strip(G4String::leading); + G4String input = G4StrUtil::lstrip_copy(commandLine); + // target token is last token - G4int jhead= input.last(' '); - if(jhead != G4int(G4String::npos)) { - input.remove(0, jhead); - input= input.strip(G4String::leading); + auto jhead= input.rfind(' '); + if(jhead != G4String::npos) { + input.erase(0, jhead); + G4StrUtil::lstrip(input); } // tail string size_t thead = input.find_last_of('/'); G4String strtail = input; - if (thead != G4String::npos) strtail = input(thead+1, input.size()-thead-1); + if (thead != G4String::npos) strtail = input.substr(thead+1, input.size()-thead-1); // command tree of "user specified directory" G4String vpath= currentCommandDir; @@ -460,14 +459,14 @@ void G4UItcsh::CompleteCommand() if(!input.empty()) { G4int indx= -1; for(G4int i=len-1; i>=0; i--) { - if(input(i)=='/') { + if(input[i]=='/') { indx= i; break; } } // get abs. path - if(indx != -1) vpath= GetAbsCommandDirPath(input(0,indx+1)); - if(!(indx==0 && len==1)) vcmd= input(indx+1,len-indx-1); // care for "/" + if(indx != -1) vpath= GetAbsCommandDirPath(input.substr(0,indx+1)); + if(!(indx==0 && len==1)) vcmd= input.substr(indx+1,len-indx-1); // care for "/" } G4UIcommandTree* atree= GetCommandTree(vpath); // get command tree @@ -485,7 +484,7 @@ void G4UItcsh::CompleteCommand() for(G4int idir=1; idir<=Ndir; idir++) { G4String fpdir= atree-> GetTree(idir)-> GetPathName(); // matching test - if( fpdir.index(inputpath, 0) == 0) { + if( fpdir.find(inputpath, 0) == 0) { if(nMatch==0) { stream= GetCommandPathTail(fpdir); } else { @@ -501,7 +500,7 @@ void G4UItcsh::CompleteCommand() G4String fpcmd= atree-> GetPathName() + atree-> GetCommand(icmd) -> GetCommandName(); // matching test - if( fpcmd.index(inputpath, 0) ==0) { + if( fpcmd.find(inputpath, 0) ==0) { if(nMatch==0) { stream= GetCommandPathTail(fpcmd) + " "; } else { @@ -515,24 +514,24 @@ void G4UItcsh::CompleteCommand() // display... input= commandLine; // target token is last token - jhead= input.last(' '); - if(jhead == G4int(G4String::npos)) jhead=0; + jhead= input.rfind(' '); + if(jhead == G4String::npos) jhead=0; else jhead++; G4int jt = jhead; G4String dspstr; G4int i; - for(i=jt; i<=G4int(input.length())-1; i++) dspstr+= G4String(AsciiBS); - for(i=jt; i<=G4int(input.length())-1; i++) dspstr+= G4String(' '); - for(i=jt; i<=G4int(input.length())-1; i++) dspstr+= G4String(AsciiBS); + for(i=jt; i<=G4int(input.length())-1; i++) dspstr+= AsciiBS; + for(i=jt; i<=G4int(input.length())-1; i++) dspstr+= ' '; + for(i=jt; i<=G4int(input.length())-1; i++) dspstr+= AsciiBS; dspstr+= (vpath + stream); if (nMatch == 0) dspstr+= strtail; G4cout << dspstr << std::flush; // command line string - input.remove(jt); + input.erase(jt); input+= (vpath + stream); if (nMatch==0) input+= strtail; @@ -658,7 +657,7 @@ G4String G4UItcsh::GetCommandLineString(const char* msg) // multi-line while( (newCommand.length() > 0) && ( newCommand[newCommand.length()-1] == '_') ) { - newCommand.remove(newCommand.length()-1); + newCommand.erase(newCommand.length()-1); G4cout << G4endl; promptString= "? "; G4cout << promptString << std::flush; diff --git a/source/interfaces/basic/src/G4UIterminal.cc b/source/interfaces/basic/src/G4UIterminal.cc index c256fb21a1..98805b63ee 100644 --- a/source/interfaces/basic/src/G4UIterminal.cc +++ b/source/interfaces/basic/src/G4UIterminal.cc @@ -178,7 +178,7 @@ void G4UIterminal::ExecuteCommand(const G4String& aCommand) break; case fCommandNotFound: G4cerr << "command <" << UI->SolveAlias(aCommand) << "> not found" << G4endl; - if( aCommand.index("@@") != G4String::npos) { + if( aCommand.find("@@") != G4String::npos) { G4cout << "@@G4UIterminal" << G4endl; } break; @@ -211,16 +211,15 @@ void G4UIterminal::ExecuteCommand(const G4String& aCommand) G4String G4UIterminal::GetCommand(const char* msg) ////////////////////////////////////////////////// { - G4String newCommand; - G4String nullString; + G4String newCommand = shell->GetCommandLineString(msg); + G4String nullString = ""; - newCommand= shell-> GetCommandLineString(msg); - - G4String nC = newCommand.strip(G4String::leading); + G4String nC = G4StrUtil::lstrip_copy(newCommand); + if( nC.length() == 0 ) { newCommand= nullString; - } else if( nC(0) == '#' ) { + } else if( nC[0] == '#' ) { G4cout << nC << G4endl; newCommand= nullString; @@ -229,7 +228,7 @@ G4String G4UIterminal::GetCommand(const char* msg) newCommand= nullString; } else if(nC=="lc" || nC.substr(0,3)=="lc " ) { // ... by shell - shell-> ListCommand(nC.remove(0,2)); + shell-> ListCommand(nC.erase(0,2)); newCommand= nullString; } else if(nC == "pwd") { // show current directory @@ -250,7 +249,7 @@ G4String G4UIterminal::GetCommand(const char* msg) TerminalHelp(nC); newCommand= nullString; - } else if(nC(0) == '?') { // "show current value of a parameter" + } else if(nC[0] == '?') { // "show current value of a parameter" ShowCurrent(nC); newCommand= nullString; @@ -261,8 +260,8 @@ G4String G4UIterminal::GetCommand(const char* msg) } newCommand= nullString; - } else if(nC(0) == '!') { // "!" - G4String ss= nC(1, nC.length()-1); + } else if(nC[0] == '!') { // "!" + G4String ss= nC.substr(1, nC.length()-1); G4int vl; const char* tt= ss; std::istringstream is(tt); diff --git a/source/interfaces/basic/src/G4VUIshell.cc b/source/interfaces/basic/src/G4VUIshell.cc index b7503427db..9003b7c1a9 100644 --- a/source/interfaces/basic/src/G4VUIshell.cc +++ b/source/interfaces/basic/src/G4VUIshell.cc @@ -35,7 +35,7 @@ #include "G4UIArrayString.hh" // terminal color string -static const G4String strESC= '\033'; +static const G4String strESC(1,'\033'); static const G4String TermColorString[8] ={ strESC+"[30m", strESC+"[31m", strESC+"[32m", strESC+"[33m", strESC+"[34m", strESC+"[35m", strESC+"[36m", strESC+"[37m" @@ -89,17 +89,17 @@ void G4VUIshell::MakePrompt(const char* msg) i++; break; default: - promptString.append(G4String(promptSetting[(size_t)i])); + promptString += promptSetting[i]; break; } } else { - promptString.append(G4String(promptSetting[(size_t)i])); + promptString += promptSetting[i]; } } // append last chaacter if(i == G4int(promptSetting.length())-1) - promptString.append(G4String(promptSetting[(size_t)i])); + promptString += promptSetting[i]; } @@ -121,8 +121,7 @@ G4UIcommandTree* G4VUIshell::GetCommandTree(const G4String& input) const G4UIcommandTree* cmdTree= UI-> GetTree(); // root tree - G4String absPath= input; // G4String::strip() CONST !! - absPath= GetAbsCommandDirPath(absPath.strip(G4String::both)); + G4String absPath = GetAbsCommandDirPath(G4StrUtil::strip_copy(input)); // parsing absolute path ... if(absPath.length()==0) return NULL; @@ -130,10 +129,10 @@ G4UIcommandTree* G4VUIshell::GetCommandTree(const G4String& input) const if(absPath=="/") return cmdTree; for(G4int indx=1; indx GetTree(G4String(absPath(0,jslash+1))); + cmdTree= cmdTree-> GetTree(G4String(absPath.substr(0,jslash+1))); } indx= jslash+1; } @@ -156,7 +155,7 @@ G4String G4VUIshell::GetAbsCommandDirPath(const G4String& apath) const // parsing... G4String absPath= "/"; for(G4int indx=1; indx<=G4int(bpath.length())-1; ) { - G4int jslash= bpath.index("/", indx); // search index begin with "/" + G4int jslash= bpath.find("/", indx); // search index begin with "/" if(indx == jslash) { // skip first '///' indx++; continue; @@ -168,14 +167,14 @@ G4String G4VUIshell::GetAbsCommandDirPath(const G4String& apath) const continue; } if(absPath.length() >= 2) { - absPath.remove(absPath.length()-1); // remove last "/" - G4int jpre= absPath.last('/'); - if(jpre != G4int(G4String::npos)) absPath.remove(jpre+1); + absPath.erase(absPath.length()-1); // remove last "/" + auto jpre= absPath.rfind('/'); + if(jpre != G4String::npos) absPath.erase(jpre+1); } } else if(bpath.substr(indx,jslash-indx) == "."){ // nothing to do } else { // add - if( !(jslash==indx && bpath(indx)=='/') ) // truncate "////" - absPath+= bpath(indx, jslash-indx+1); + if( !(jslash==indx && bpath[indx]=='/') ) // truncate "////" + absPath+= bpath.substr(indx, jslash-indx+1); // better to be check directory existence. (it costs!) } indx= jslash+1; @@ -218,7 +217,7 @@ G4String G4VUIshell::GetCommandPathTail(const G4String& apath) const } else { //G4String newPath= apath(indx+1,lstr-indx-1); G4String newPath= apath; - newPath= newPath(indx+1,lstr-indx-1); + newPath= newPath.substr(indx+1,lstr-indx-1); return newPath; } } @@ -232,8 +231,7 @@ void G4VUIshell::ListCommand(const G4String& dir, ///////////////////////////////////////////////////////////// { // specified directpry - G4String input= dir; // ... - input= input.strip(G4String::both); + G4String input = G4StrUtil::strip_copy(dir); // command tree of "user specified directory" G4String vpath= currentCommandDir; @@ -249,8 +247,8 @@ void G4VUIshell::ListCommand(const G4String& dir, } } // get abs. path - if(indx != -1) vpath= GetAbsCommandDirPath(input(0,indx+1)); - if(!(indx==0 && len==1)) vcmd= input(indx+1,len-indx-1); // care for "/" + if(indx != -1) vpath= GetAbsCommandDirPath(input.substr(0,indx+1)); + if(!(indx==0 && len==1)) vcmd= input.substr(indx+1,len-indx-1); // care for "/" } // check "vcmd" is directory? @@ -289,7 +287,7 @@ void G4VUIshell::ListCommand(const G4String& dir, isMatch= TRUE; } } else { // list only matched with candidate - if( fpdir.index(candidate, 0) == 0) { + if( fpdir.find(candidate, 0) == 0) { stream+= GetCommandPathTail(fpdir); stream+= " "; } } @@ -307,7 +305,7 @@ void G4VUIshell::ListCommand(const G4String& dir, isMatch= TRUE; } } else { // list only matched with candidate - if( fpcmd.index(candidate, 0) == 0) { + if( fpcmd.find(candidate, 0) == 0) { stream+= GetCommandPathTail(fpcmd); stream+= "* "; } } diff --git a/source/interfaces/common/GNUmakefile b/source/interfaces/common/GNUmakefile index 3d2544240d..22f0a912cb 100644 --- a/source/interfaces/common/GNUmakefile +++ b/source/interfaces/common/GNUmakefile @@ -22,4 +22,19 @@ CPPFLAGS += -I$(G4BASE)/global/management/include CPPFLAGS += -I$(G4BASE)/intercoms/include CPPFLAGS += -I$(G4BASE)/interfaces/basic/include +# Locally adjust source list before including common.gmk +sources := $(addprefix src/,G4InteractorMessenger.cc G4VBasicShell.cc G4VInteractiveSession.cc G4VInteractorManager.cc) + +ifdef G4INTY_BUILD_XT + sources += src/G4Xt.cc +endif + +ifdef G4INTY_BUILD_QT + sources += src/G4Qt.cc +endif + +ifdef G4INTY_BUILD_WIN32 + sources += src/G4Win32.cc +endif + include $(G4INSTALL)/config/common.gmk diff --git a/source/interfaces/common/include/G4Qt.hh b/source/interfaces/common/include/G4Qt.hh index 4731a93aed..b9e224db8c 100644 --- a/source/interfaces/common/include/G4Qt.hh +++ b/source/interfaces/common/include/G4Qt.hh @@ -32,8 +32,6 @@ #ifndef G4QT_HH #define G4QT_HH -#if defined(G4INTY_BUILD_QT) || defined(G4INTY_USE_QT) - #include "G4VInteractorManager.hh" class QWidget; @@ -68,6 +66,4 @@ private: bool externalApp; }; -#endif //HAS_QT - #endif diff --git a/source/interfaces/common/include/G4Win32.hh b/source/interfaces/common/include/G4Win32.hh index 83c1c25382..6eafca4cdc 100644 --- a/source/interfaces/common/include/G4Win32.hh +++ b/source/interfaces/common/include/G4Win32.hh @@ -38,8 +38,6 @@ #ifndef G4WIN32_HH #define G4WIN32_HH -#if defined(G4INTY_BUILD_WIN32) || defined(G4INTY_USE_WIN32) - #include #include @@ -63,5 +61,3 @@ class G4Win32 : public G4VInteractorManager }; #endif - -#endif diff --git a/source/interfaces/common/include/G4Xt.hh b/source/interfaces/common/include/G4Xt.hh index 60bde9f4bc..ac168ab047 100644 --- a/source/interfaces/common/include/G4Xt.hh +++ b/source/interfaces/common/include/G4Xt.hh @@ -32,8 +32,6 @@ #ifndef G4XT_HH #define G4XT_HH -#if defined(G4INTY_BUILD_XT) || defined(G4INTY_USE_XT) - #include #include "G4VInteractorManager.hh" @@ -67,6 +65,4 @@ private: static G4Xt* instance; // Pointer to single instance. }; -#endif //HAS_XT - #endif diff --git a/source/interfaces/common/sources.cmake b/source/interfaces/common/sources.cmake index f332d90a34..59d9c70f65 100644 --- a/source/interfaces/common/sources.cmake +++ b/source/interfaces/common/sources.cmake @@ -23,9 +23,6 @@ if(GEANT4_USE_QT) list(APPEND G4INTERFACES_COMMON_MODULE_HEADERS G4Qt.hh) list(APPEND G4INTERFACES_COMMON_MODULE_SOURCES G4Qt.cc) - # Must enable Qt source with a def... - list(APPEND G4INTERFACES_COMMON_MODULE_COMPILE_DEFINITIONS G4INTY_BUILD_QT) - # It uses Qt core and gui(?) libs list(APPEND G4INTERFACES_COMMON_MODULE_LINK_LIBRARIES Qt5::Gui Qt5::Core) @@ -36,9 +33,6 @@ if(MSVC) # Add the sources list(APPEND G4INTERFACES_COMMON_MODULE_HEADERS G4Win32.hh) list(APPEND G4INTERFACES_COMMON_MODULE_SOURCES G4Win32.cc) - - # Add the needed compile definitions to these sources - list(APPEND G4INTERFACES_COMMON_MODULE_COMPILE_DEFINITIONS G4INTY_BUILD_WIN32) endif() # X11 options - we only need this for Xm (and Inventor, which activates XM) @@ -47,15 +41,17 @@ if(UNIX AND GEANT4_USE_XM) list(APPEND G4INTERFACES_COMMON_MODULE_HEADERS G4Xt.hh) list(APPEND G4INTERFACES_COMMON_MODULE_SOURCES G4Xt.cc) - # Source needs to have a compile definition - list(APPEND G4INTERFACES_COMMON_MODULE_COMPILE_DEFINITIONS G4INTY_BUILD_XT) - # It uses the X11 libs? list(APPEND G4INTERFACES_COMMON_MODULE_LINK_LIBRARIES X11::SM X11::ICE X11::X11 X11::Xext X11::Xmu X11::Xt ) endif() +if(GEANT4_USE_VTK) + list(APPEND G4INTERFACES_COMMON_MODULE_LINK_LIBRARIES + ${VTK_LIBRARIES}) +endif() + # Define the Geant4 Module. geant4_add_module(G4UIcommon PUBLIC_HEADERS @@ -63,9 +59,6 @@ geant4_add_module(G4UIcommon SOURCES ${G4INTERFACES_COMMON_MODULE_SOURCES}) -geant4_module_compile_definitions(G4UIcommon - PRIVATE ${G4INTERFACES_COMMON_MODULE_COMPILE_DEFINITIONS}) - geant4_module_link_libraries(G4UIcommon PUBLIC G4intercoms diff --git a/source/interfaces/common/src/G4InteractorMessenger.cc b/source/interfaces/common/src/G4InteractorMessenger.cc index 19959471f9..ae7961127e 100644 --- a/source/interfaces/common/src/G4InteractorMessenger.cc +++ b/source/interfaces/common/src/G4InteractorMessenger.cc @@ -112,7 +112,7 @@ G4InteractorMessenger::G4InteractorMessenger ( parameter = new G4UIparameter("Icon",'s',false); parameter->SetDefaultValue(""); parameter->SetParameterCandidates - ("open save move rotate pick zoom_in zoom_out wireframe solid hidden_line_removal hidden_line_and_surface_removal perspective ortho user_icon"); + ("open save move rotate pick zoom_in zoom_out wireframe solid hidden_line_removal hidden_line_and_surface_removal perspective ortho exit user_icon"); addIcon->SetParameter (parameter); parameter = new G4UIparameter("Command",'s',true); @@ -217,8 +217,8 @@ G4bool GetValues ( return false; } G4String token = tok; - if( token(0)=='"' ) { - while( token(token.length()-1) != '"' ) { + if( token[0]=='"' ) { + while( token.back() != '"' ) { tok = strtok(NULL," "); if( (tok==NULL) || (*tok=='\0')) { STRDEL(value); @@ -227,9 +227,9 @@ G4bool GetValues ( token += " "; token += tok; } - token = (G4String)token.strip(G4String::both,'"'); + G4StrUtil::strip(token, '"'); } - if( token.isNull() ) { + if( token.empty() ) { STRDEL(value); return false; } else { diff --git a/source/interfaces/common/src/G4Qt.cc b/source/interfaces/common/src/G4Qt.cc index ec9c07ffc9..82eaeaf18c 100644 --- a/source/interfaces/common/src/G4Qt.cc +++ b/source/interfaces/common/src/G4Qt.cc @@ -27,8 +27,6 @@ // // L. Garnier -#if defined(G4INTY_BUILD_QT) || defined(G4INTY_USE_QT) - #include #include @@ -40,6 +38,10 @@ #include +#ifdef G4VIS_USE_VTK_QT +#include +#include "QVTKOpenGLNativeWidget.h" +#endif G4Qt* G4Qt::instance = NULL; @@ -115,6 +117,10 @@ G4Qt::G4Qt ( #ifdef WIN32 qApp->setAttribute( Qt::AA_UseDesktopOpenGL ); #endif + +#ifdef G4VIS_USE_VTK_QT + QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat()); +#endif new QApplication (*p_argn, args); if(!qApp) { @@ -194,7 +200,3 @@ bool G4Qt::IsExternalApp ( { return externalApp; } - -#endif - - diff --git a/source/interfaces/common/src/G4VBasicShell.cc b/source/interfaces/common/src/G4VBasicShell.cc index 95bb70675c..2112bfac49 100644 --- a/source/interfaces/common/src/G4VBasicShell.cc +++ b/source/interfaces/common/src/G4VBasicShell.cc @@ -47,16 +47,16 @@ G4VBasicShell::~G4VBasicShell() G4String G4VBasicShell::ModifyToFullPathCommand(const char* aCommandLine) const { G4String rawCommandLine = aCommandLine; - if(rawCommandLine.isNull()||rawCommandLine(0)=='\0') return rawCommandLine; - G4String commandLine = rawCommandLine.strip(G4String::both); + if(rawCommandLine.empty()||rawCommandLine[0]=='\0') return rawCommandLine; + G4String commandLine = G4StrUtil::strip_copy(rawCommandLine); G4String commandString; G4String parameterString; - size_t i = commandLine.index(" "); + size_t i = commandLine.find(" "); if( i != std::string::npos ) { - commandString = commandLine(0,i); + commandString = commandLine.substr(0,i); parameterString = " "; - parameterString += commandLine(i+1,commandLine.length()-(i+1)); + parameterString += commandLine.substr(i+1,commandLine.length()-(i+1)); } else { commandString = commandLine; } @@ -73,10 +73,10 @@ G4String G4VBasicShell::GetCurrentWorkingDirectory() const G4bool G4VBasicShell::ChangeDirectory(const char* newDir) { - G4String aNewPrefix = newDir; - G4String newPrefix = aNewPrefix.strip(G4String::both); + G4String newPrefix = G4StrUtil::strip_copy(newDir); + G4String newDirectory = ModifyPath( newPrefix ); - if( newDirectory( newDirectory.length() - 1 ) != '/' ) + if( newDirectory.back() != '/' ) { newDirectory += "/"; } if( FindDirectory( newDirectory.c_str() ) == NULL ) { return false; } @@ -86,10 +86,10 @@ G4bool G4VBasicShell::ChangeDirectory(const char* newDir) G4UIcommandTree* G4VBasicShell::FindDirectory(const char* dirName) const { - G4String aDirName = dirName; - G4String theDir = aDirName.strip(G4String::both); + G4String theDir = G4StrUtil::strip_copy(dirName); + G4String targetDir = ModifyPath( theDir ); - if( targetDir( targetDir.length()-1 ) != '/' ) + if( targetDir.back() != '/' ) { targetDir += "/"; } G4UIcommandTree* comTree = G4UImanager::GetUIpointer()->GetTree(); if( targetDir == "/" ) @@ -97,7 +97,7 @@ G4UIcommandTree* G4VBasicShell::FindDirectory(const char* dirName) const size_t idx = 1; while( idx < targetDir.length()-1 ) { - size_t i = targetDir.index("/",idx); + size_t i = targetDir.find("/",idx); comTree = comTree->GetTree(targetDir.substr(0,i+1).c_str()); if( comTree == NULL ) { return NULL; } @@ -108,12 +108,12 @@ G4UIcommandTree* G4VBasicShell::FindDirectory(const char* dirName) const G4UIcommand* G4VBasicShell::FindCommand(const char* commandName) const { - G4String rawCommandLine = commandName; - G4String commandLine = rawCommandLine.strip(G4String::both); + G4String commandLine = G4StrUtil::strip_copy(commandName); + G4String commandString; - size_t i = commandLine.index(" "); + size_t i = commandLine.find(" "); if( i != std::string::npos ) - { commandString = commandLine(0,i); } + { commandString = commandLine.substr(0,i); } else { commandString = commandLine; } @@ -128,7 +128,7 @@ G4String G4VBasicShell::ModifyPath(const G4String& tempPath) const G4String newPath = ""; // temporal full path - if( tempPath(0) == '/') newPath = tempPath; + if( tempPath[0] == '/') newPath = tempPath; else newPath = currentDirectory + tempPath; // body of path... @@ -151,7 +151,7 @@ G4String G4VBasicShell::ModifyPath(const G4String& tempPath) const // end of path... if ( newPath.size() >= 3 ) { - if(newPath(newPath.size()-3,3) == "/..") { + if(newPath.substr(newPath.size()-3,3) == "/..") { if( newPath.size() == 3) { newPath = "/"; } else { @@ -162,7 +162,7 @@ G4String G4VBasicShell::ModifyPath(const G4String& tempPath) const } if ( newPath.size() >= 2 ) { - if(newPath(newPath.size()-2,2) == "/.") newPath.erase(newPath.size()-1,1); + if(newPath.substr(newPath.size()-2,2) == "/.") newPath.erase(newPath.size()-1,1); } // truncate "/////" to "/" @@ -180,8 +180,9 @@ G4String G4VBasicShell::ModifyPath(const G4String& tempPath) const G4String G4VBasicShell::Complete(const G4String& commandName) { G4String rawCommandLine = commandName; - G4String commandLine = rawCommandLine.strip(G4String::both); - size_t i = commandLine.index(" "); + G4String commandLine = G4StrUtil::strip_copy(rawCommandLine); + + size_t i = commandLine.find(" "); if( i != std::string::npos ) return rawCommandLine; // Already entering parameters, // assume command path is correct. G4String commandString = commandLine; @@ -237,14 +238,13 @@ void G4VBasicShell::ApplyShellCommand (const G4String& a_string, G4UImanager* UI = G4UImanager::GetUIpointer(); if(UI==NULL) return; - G4String command = a_string; - command.strip(G4String::leading); + G4String command = G4StrUtil::lstrip_copy(a_string); - if( command(0) == '#' ) { + if( command[0] == '#' ) { G4cout << command << G4endl; - } else if( command == "ls" || command(0,3) == "ls " ) { + } else if( command == "ls" || command.substr(0,3) == "ls " ) { ListDirectory( command ); @@ -253,15 +253,15 @@ void G4VBasicShell::ApplyShellCommand (const G4String& a_string, G4cout << "Current Working Directory : " << GetCurrentWorkingDirectory() << G4endl; - } else if( command == "cd" || command(0,3) == "cd ") { + } else if( command == "cd" || command.substr(0,3) == "cd ") { ChangeDirectoryCommand ( command ); - } else if( command == "help" || command(0,5) == "help ") { + } else if( command == "help" || command.substr(0,5) == "help ") { TerminalHelp( command ); - } else if( command(0) == '?' ) { + } else if( command[0] == '?' ) { ShowCurrent( command ); @@ -272,9 +272,9 @@ void G4VBasicShell::ApplyShellCommand (const G4String& a_string, G4cout << i << ": " << UI->GetPreviousCommand(i) << G4endl; } - } else if( command(0) == '!' ) { + } else if( command[0] == '!' ) { - G4String ss = command(1,command.length()-1); + G4String ss = command.substr(1,command.length()-1); G4int vl; const char* tt = ss; std::istringstream is(tt); @@ -317,7 +317,7 @@ void G4VBasicShell::ShowCurrent(const G4String& newCommand) const G4String comString = newCommand.substr(1,newCommand.length()-1); G4String theCommand = ModifyToFullPathCommand(comString); G4String curV = UI->GetCurrentValues(theCommand); - if( ! curV.isNull() ) { + if( ! curV.empty() ) { G4cout << "Current value(s) of the parameter(s) : " << curV << G4endl; } } @@ -329,7 +329,7 @@ void G4VBasicShell::ChangeDirectoryCommand(const G4String& newCommand) prefix = "/"; } else { G4String aNewPrefix = newCommand.substr(3, newCommand.length()-3); - prefix = aNewPrefix.strip(G4String::both); + prefix = G4StrUtil::strip_copy(aNewPrefix); } if(!ChangeDirectory(prefix)) { G4cout << "directory <" << prefix << "> not found." << G4endl; @@ -343,7 +343,7 @@ void G4VBasicShell::ListDirectory(const G4String& newCommand) const targetDir = GetCurrentWorkingDirectory(); } else { G4String newPrefix = newCommand.substr(3, newCommand.length()-3); - targetDir = newPrefix.strip(G4String::both); + targetDir = G4StrUtil::strip_copy(newPrefix); } G4UIcommandTree* commandTree = FindDirectory( targetDir ); if( commandTree == NULL ) { @@ -357,11 +357,11 @@ void G4VBasicShell::TerminalHelp(const G4String& newCommand) G4UImanager* UI = G4UImanager::GetUIpointer(); if(UI==NULL) return; G4UIcommandTree * treeTop = UI->GetTree(); - size_t i = newCommand.index(" "); + size_t i = newCommand.find(" "); if( i != std::string::npos ) { G4String newValue = newCommand.substr(i+1, newCommand.length()-(i+1)); - newValue.strip(G4String::both); + G4StrUtil::strip(newValue); G4String targetCom = ModifyToFullPathCommand(newValue); G4UIcommand* theCommand = treeTop->FindPath(targetCom); if( theCommand != NULL ) @@ -383,9 +383,9 @@ void G4VBasicShell::TerminalHelp(const G4String& newCommand) G4String prefix = GetCurrentWorkingDirectory(); while( prefixIndex < prefix.length()-1 ) { - size_t ii = prefix.index("/",prefixIndex); + size_t ii = prefix.find("/",prefixIndex); floor[iFloor+1] = - floor[iFloor]->GetTree(G4String(prefix(0,ii+1))); + floor[iFloor]->GetTree(G4String(prefix.substr(0,ii+1))); prefixIndex = ii+1; iFloor++; } diff --git a/source/interfaces/common/src/G4Win32.cc b/source/interfaces/common/src/G4Win32.cc index e219a44acd..08c55a0f88 100644 --- a/source/interfaces/common/src/G4Win32.cc +++ b/source/interfaces/common/src/G4Win32.cc @@ -28,8 +28,6 @@ // Original author: G.Barrand, 1998 // -------------------------------------------------------------------- -#if defined(G4INTY_BUILD_WIN32) || defined(G4INTY_USE_WIN32) - // this : #include "G4Win32.hh" @@ -148,6 +146,3 @@ G4bool G4Win32::DispatchWin32Event ( ::DispatchMessage ((MSG*)a_event); return TRUE; } - -#endif //HAS_WIN32 - diff --git a/source/interfaces/common/src/G4Xt.cc b/source/interfaces/common/src/G4Xt.cc index 6c7b135b20..61bb3ed369 100644 --- a/source/interfaces/common/src/G4Xt.cc +++ b/source/interfaces/common/src/G4Xt.cc @@ -27,8 +27,6 @@ // // G.Barrand -#if defined(G4INTY_BUILD_XT) || defined(G4INTY_USE_XT) - #include #include @@ -188,8 +186,3 @@ void G4Xt::FlushAndWaitExecution ( if(topWidget==NULL) return; XSync(XtDisplay(topWidget),False); } - -#endif - - - diff --git a/source/materials/History b/source/materials/History index b894da3c2c..4e2c9ccbce 100644 --- a/source/materials/History +++ b/source/materials/History @@ -16,6 +16,80 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +10-11-21 V.Ivanchenko (materials-V10-07-26) +- G4Material - revised and updated all G4Exceptions, provided complete + information for all exceptions, text become more precise, + functionality does not changed, this is the CMS request. + +18-10-21 B.Morgan (materials-V10-07-25) +- Use std::string member functions from G4String in place of synonyms + +16-10-21 D.Sawkey (materials-V10-07-24) +- G4MaterialPropertiesTable - fix error with ConstPropertyExists(string) + +13-10-21 D.Sawkey (materials-V10-07-23) +- G4MaterialPropertiesTable - return const refs to vectors for + material[const]props and names. Rename Get[Const]PropertyMap to + Get[Const]Properties. + +07-10-21 D.Sawkey (materials-V10-07-22) +- G4MaterialPropertiesTable - return nullptr when GetProperty(string) + called for non-existent property; fix error in GetMatConstPropNames + +19-09-21 V.Ivanchenko (materials-V10-07-21) +- G4IonisParamMat - return exact computations according to the + original publication (fix #2334) +- G4DensityEffectData - minor clean-up + +01-10-21 D.Sawkey (materials-V10-07-20) +- G4MaterialPropertiesTable - FatalException if asked for index of + non-existent property (fix Coverity defect) + +19-09-21 V.Ivanchenko (materials-V10-07-19) +- G4DensityEffectCalculator - Matthew Strait critically updated + calculations (fix #2330) + +09-09-21 D.Sawkey (materials-V10-07-18) +- G4MaterialPropertiesTable: - use std::vectors for material properties and + material const properties, rather than std::map (speed increase). + - use bool flag with mat const property to indicate whether it is defined + - renaming of variables: fist letter lower case, class variables start with f + - remove iterators to mat prop vectors (use C++11 iteration) + +02-09-21 D.Sawkey (materials-V10-07-17) +- G4MaterialPropertiesTable: fix AddConstProperty with new key; + fix RemoveConstProperty; make exception codes unique + +17-08-21 J.Hahnfeld (materials-V10-07-16) +- Define operator<< for G4ElementVector, take const references to avoid + needless copy construction + +04-08-21 A.Ribon (materials-V10-07-15) +- G4ExtendedMaterial : removed useless dependence on G4PhysicsModelCatalog, + and improved comment. + +19-07-21 V.Ivanchenko (materials-V10-07-14) +- G4MaterialPropertyTable - add "spline" argument to method, which + creates G4MaterialPropertyVector + +14-07-21 V.Ivanchenko (materials-V10-07-13) +- G4ElementData - reduce length of internal arrays from 108 to 99, + max number 99 is used by G4LivermorePhotoElectricModel, hadronic + models use 93 +- G4ElementVector - use const pointer to G4Element + +12-07-21 V.Ivanchenko (materials-V10-07-12) +- G4ElementData - use G4int in method signature instead of size_t; + improve initialisation + +09-07-21 V.Ivanchenko (materials-V10-07-11) +- G4Material - fixed Coverity report on non-initialized arrays; + use const pointers to G4Elements where; added warnings if + there is a mixture of definition of elements by number of atoms and + mass fraction; reduced code duplication and reduce number of + new/delete for the case when materials are added to the material +- G4ElementData - update class to provide more safe destruction end of run + 23-05-21 V.Ivanchenko (materials-V10-07-10) - G4ExtDEDXTable, G4IonStoppingData - corrected initialisation of spline - G4NistMaterialBuilder - removed unused argument "isotopes" from all diff --git a/source/materials/include/G4Element.hh b/source/materials/include/G4Element.hh index 4b905aa830..9cdecc0ab0 100644 --- a/source/materials/include/G4Element.hh +++ b/source/materials/include/G4Element.hh @@ -90,6 +90,7 @@ #include "G4IonisParamElm.hh" #include "G4IsotopeVector.hh" #include "G4ElementTable.hh" +#include "G4ElementVector.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -201,7 +202,8 @@ public: // with description // friend std::ostream& operator<<(std::ostream&, const G4Element*); friend std::ostream& operator<<(std::ostream&, const G4Element&); - friend std::ostream& operator<<(std::ostream&, G4ElementTable); + friend std::ostream& operator<<(std::ostream&, const G4ElementTable&); + friend std::ostream& operator<<(std::ostream&, const G4ElementVector&); public: // without description diff --git a/source/materials/include/G4ElementData.hh b/source/materials/include/G4ElementData.hh index 208bdbd30e..e01c366dd5 100644 --- a/source/materials/include/G4ElementData.hh +++ b/source/materials/include/G4ElementData.hh @@ -45,7 +45,6 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "globals.hh" -#include "G4NistElementBuilder.hh" #include "G4PhysicsVector.hh" #include "G4Physics2DVector.hh" #include @@ -75,6 +74,13 @@ public: // set name of the dataset void SetName(const G4String& nam); + //-------------------------------------------------------------- + // + // run time methods - no check on validity of input index + // it is a responsibility of the consume code to check the input + // + //-------------------------------------------------------------- + // get vector for the element inline G4PhysicsVector* GetElementData(G4int Z); @@ -86,10 +92,10 @@ public: // get component ID which may be number of nucleons, // or shell number, or any other integer - inline G4int GetComponentID(G4int Z, size_t idx); + inline G4int GetComponentID(G4int Z, G4int idx); // get vector per shell or per isotope - inline G4PhysicsVector* GetComponentDataByIndex(G4int Z, size_t idx); + inline G4PhysicsVector* GetComponentDataByIndex(G4int Z, G4int idx); // get vector per shell or per isotope inline G4PhysicsVector* GetComponentDataByID(G4int Z, G4int id); @@ -100,20 +106,23 @@ public: // return cross section per element // if not available return zero - inline G4double GetValueForComponent(G4int Z, size_t idx, G4double kinEnergy); - -private: + inline G4double GetValueForComponent(G4int Z, G4int idx, + G4double kinEnergy); // Assignment operator and copy constructor G4ElementData & operator=(const G4ElementData &right) = delete; G4ElementData(const G4ElementData&) = delete; - G4PhysicsVector* elmData[maxNumElements]; - G4Physics2DVector* elm2Data[maxNumElements]; - std::vector compData[maxNumElements]; - std::vector compID[maxNumElements]; - size_t compLength[maxNumElements]; - G4String name; +private: + + static const G4int maxNumElm = 99; + G4PhysicsVector* elmData[maxNumElm]; + G4Physics2DVector* elm2Data[maxNumElm]; + std::vector* compData[maxNumElm]; + std::vector* compID[maxNumElm]; + G4int compLength[maxNumElm]; + + G4String name = ""; }; inline void G4ElementData::SetName(const G4String& nam) @@ -136,27 +145,27 @@ G4Physics2DVector* G4ElementData::GetElement2DData(G4int Z) inline size_t G4ElementData::GetNumberOfComponents(G4int Z) { - return compLength[Z]; + return compID[Z]->size(); } -inline G4int G4ElementData::GetComponentID(G4int Z, size_t idx) +inline G4int G4ElementData::GetComponentID(G4int Z, G4int idx) { - return (compID[Z])[idx]; + return (*(compID[Z]))[idx]; } -inline -G4PhysicsVector* G4ElementData::GetComponentDataByIndex(G4int Z, size_t idx) +inline G4PhysicsVector* +G4ElementData::GetComponentDataByIndex(G4int Z, G4int idx) { - return (compData[Z])[idx]; + return (*(compData[Z]))[idx]; } inline G4PhysicsVector* G4ElementData::GetComponentDataByID(G4int Z, G4int id) { - G4PhysicsVector* v = 0; - for(size_t i=0; iValue(kinEnergy); + return (*(compData[Z]))[idx]->Value(kinEnergy); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/materials/include/G4ElementVector.hh b/source/materials/include/G4ElementVector.hh index 7e980ee1d2..f08f2f2206 100644 --- a/source/materials/include/G4ElementVector.hh +++ b/source/materials/include/G4ElementVector.hh @@ -38,8 +38,9 @@ #define G4ELEMENTVECTOR_HH #include -#include "G4Element.hh" -typedef std::vector G4ElementVector; +class G4Element; + +typedef std::vector G4ElementVector; #endif diff --git a/source/materials/include/G4ExtendedMaterial.hh b/source/materials/include/G4ExtendedMaterial.hh index e27b5e1cf2..0ef90efbe7 100644 --- a/source/materials/include/G4ExtendedMaterial.hh +++ b/source/materials/include/G4ExtendedMaterial.hh @@ -35,8 +35,7 @@ // Class description: // // Is used to define the additional material information. This class -// contains a map of G4VMaterialExtension associated with an integer -// key of G4PhysicsModelCatalog index. +// contains a map of G4VMaterialExtension associated with an integer key. // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/materials/include/G4Material.hh b/source/materials/include/G4Material.hh index 49855100f8..a9a1b45ca5 100644 --- a/source/materials/include/G4Material.hh +++ b/source/materials/include/G4Material.hh @@ -152,21 +152,19 @@ public: // with description // // Add an element, giving number of atoms // - void AddElement(G4Element* element, //the element - G4int nAtoms); //nb of atoms in a molecule + void AddElementByNumberOfAtoms(const G4Element* elm, G4int nAtoms); inline - void AddElementByNumberOfAtoms(G4Element* elm, G4int nAtoms) {AddElement(elm, nAtoms);} + void AddElement(G4Element* elm, G4int nAtoms) + { AddElementByNumberOfAtoms(elm, nAtoms); } // // Add an element or material, giving fraction of mass // - void AddElement (G4Element* element , //the element - G4double fraction); //fractionOfMass - inline - void AddElementByMassFraction(G4Element* elm, G4double frac) {AddElement(elm, frac);} + void AddElementByMassFraction(const G4Element* elm, G4double fraction); + inline void AddElement (G4Element* elm, G4double frac) + { AddElementByMassFraction(elm, frac); } - void AddMaterial(G4Material* material, //the material - G4double fraction); //fractionOfMass + void AddMaterial(G4Material* material, G4double fraction); virtual ~G4Material(); // @@ -277,7 +275,7 @@ public: // with description // friend std::ostream& operator<<(std::ostream&, const G4Material*); friend std::ostream& operator<<(std::ostream&, const G4Material&); - friend std::ostream& operator<<(std::ostream&, G4MaterialTable); + friend std::ostream& operator<<(std::ostream&, const G4MaterialTable&); G4Material(__void__&); // Fake default constructor for usage restricted to direct object @@ -312,52 +310,52 @@ private: private: - const G4Material* fBaseMaterial; // Pointer to the base material - G4MaterialPropertiesTable* fMaterialPropertiesTable; - - G4ElementVector* theElementVector; // vector of constituent Elements - G4double* fMassFractionVector; // composition by fractional mass - G4int* fAtomsVector; // composition by atom count + void FillVectors(); static - G4MaterialTable theMaterialTable; // the material table + G4MaterialTable theMaterialTable; // the material table + + const G4Material* fBaseMaterial; // Pointer to the base material + G4MaterialPropertiesTable* fMaterialPropertiesTable; // - // Derived data members (computed from the basic data members) + // General atomic properties defined in constructor or + // computed from the basic data members // - // some general atomic properties - - G4double* fVecNbOfAtomsPerVolume; // vector of nb of atoms per volume - G4IonisParamMat* fIonisation; // ionisation parameters - G4SandiaTable* fSandiaTable; // Sandia table + G4ElementVector* theElementVector; // vector of constituent G4Elements + G4int* fAtomsVector; // composition by atom count + G4double* fMassFractionVector; // composition by fractional mass + G4double* fVecNbOfAtomsPerVolume; // number of atoms per volume + + G4IonisParamMat* fIonisation; // ionisation parameters + G4SandiaTable* fSandiaTable; // Sandia table - G4double fDensity; // Material density - G4double fFreeElecDensity; // Free electron density - G4double fTemp; // Temperature (defaults: STP) - G4double fPressure; // Pressure (defaults: STP) + G4double fDensity; // Material density + G4double fFreeElecDensity; // Free electron density + G4double fTemp; // Temperature (defaults: STP) + G4double fPressure; // Pressure (defaults: STP) - G4double fTotNbOfAtomsPerVolume; // total nb of atoms per volume - G4double fTotNbOfElectPerVolume; // total nb of electrons per volume - G4double fRadlen; // Radiation length - G4double fNuclInterLen; // Nuclear interaction length - G4double fMassOfMolecule; // for materials built by atoms count + G4double fTotNbOfAtomsPerVolume; // Total nb of atoms per volume + G4double fTotNbOfElectPerVolume; // Total nb of electrons per volume + G4double fRadlen; // Radiation length + G4double fNuclInterLen; // Nuclear interaction length + G4double fMassOfMolecule; // Correct for materials built by atoms count - G4State fState; // Material state (determined - // internally based on density) - size_t fIndexInTable; // the position in the material table + G4State fState; // Material state + size_t fIndexInTable; // Index in the material table + G4int fNumberOfElements; // Number of G4Elements in the material - G4int maxNbComponents; // totalNbOfComponentsInTheMaterial - G4int fArrayLength; // the length of fAtomsVector - G4int fNumberOfComponents; // Nb of components declared so far + // Class members used only at initialisation + G4int fNbComponents; // Number of material components + G4int fIdxComponent; // Index of a new component + G4bool fMassFraction; // Flag of the method to add components - G4int fNumberOfElements; // Nb of Elements in the material + // For composites built via AddMaterial() + std::map fMatComponents; - std::map fMatComponents; // for composites built via - // AddMaterial() - - G4String fName; // Material name - G4String fChemicalFormula; // Material chemical formula + G4String fName; // Material name + G4String fChemicalFormula; // Material chemical formula #ifdef G4MULTITHREADED static G4Mutex materialMutex; diff --git a/source/materials/include/G4MaterialPropertiesTable.hh b/source/materials/include/G4MaterialPropertiesTable.hh index 0160b56fe8..2ea26aad79 100644 --- a/source/materials/include/G4MaterialPropertiesTable.hh +++ b/source/materials/include/G4MaterialPropertiesTable.hh @@ -56,7 +56,7 @@ #include "G4MaterialPropertiesIndex.hh" #include "G4MaterialPropertyVector.hh" -#include +#include class G4MaterialPropertiesTable { @@ -64,23 +64,22 @@ class G4MaterialPropertiesTable G4MaterialPropertiesTable(); virtual ~G4MaterialPropertiesTable(); - void AddConstProperty(const G4String& key, G4double PropertyValue, + void AddConstProperty(const G4String& key, G4double propertyValue, G4bool createNewKey = false); - void AddConstProperty(const char* key, G4double PropertyValue, + void AddConstProperty(const char* key, G4double propertyValue, G4bool createNewKey = false); // Add a new property to the table by giving a key-name and value G4MaterialPropertyVector* AddProperty( const G4String& key, const std::vector& photonEnergies, - const std::vector& propertyValues, G4bool createNewKey = false); + const std::vector& propertyValues, G4bool createNewKey = false, + G4bool spline = false); // Add a new property to the table by giving a key-name and // vectors of values - G4MaterialPropertyVector* AddProperty(const char* key, - G4double* PhotonEnergies, - G4double* PropertyValues, - G4int NumEntries, - G4bool createNewKey = false); + G4MaterialPropertyVector* AddProperty( + const char* key, G4double* photonEnergies, G4double* propertyValues, + G4int numEntries, G4bool createNewKey = false, G4bool spline = false); // Add a new property to the table by giving a key-name and the // arrays x and y of size NumEntries. @@ -106,27 +105,24 @@ class G4MaterialPropertiesTable G4double GetConstProperty(const G4String& key) const; G4double GetConstProperty(const char* key) const; - // Get the constant property from the table corresponding to the key-name - G4double GetConstProperty(const G4int index) const; - // Get the constant property from the table corresponding to the key-index + // Get a constant property from the table + // It is an error to ask for a const property that the user has not defined. + // Check if it has been defined with ConstPropertyExists() first. G4bool ConstPropertyExists(const G4String& key) const; G4bool ConstPropertyExists(const char* key) const; - // Return true if a const property 'key' exists. - G4bool ConstPropertyExists(const G4int index) const; - // Return true if a const property with key-index 'index' exists. + // Return true if a const property has been defined by the user. + // Despite the name, this returns false for a const property in + // GetMaterialConstPropertyNames() but not defined by user. + // Use this method before calling GetConstProperty(). - G4MaterialPropertyVector* GetProperty(const char* key, - G4bool warning = false); - G4MaterialPropertyVector* GetProperty(const G4String& key, - G4bool warning = false); - // Get the property from the table corresponding to the key-name. - - G4MaterialPropertyVector* GetProperty(const G4int index, - G4bool warning = false); - // Get the property from the table corresponding to the key-index. + G4MaterialPropertyVector* GetProperty(const char* key) const; + G4MaterialPropertyVector* GetProperty(const G4String& key) const; + G4MaterialPropertyVector* GetProperty(const G4int index) const; + // Get the property from the table corresponding to the key-index or index. + // nullptr is returned if the property has not been defined by the user. void AddEntry(const G4String& key, G4double aPhotonEnergy, G4double aPropertyValue); @@ -134,44 +130,56 @@ class G4MaterialPropertiesTable G4double aPropertyValue); // Add a new entry (pair of numbers) to the table for a given key. - G4int GetConstPropertyIndex(const G4String& key, - G4bool warning = false) const; + G4int GetConstPropertyIndex(const G4String& key) const; // Get the constant property index from the key-name + // It is an error to request the index of a non-existent key (key not + // present in fMaterialConstPropertyNames()). - G4int GetPropertyIndex(const G4String& key, G4bool warning = false) const; + G4int GetPropertyIndex(const G4String& key) const; // Get the property index by the key-name. + // It is an error to request the index of a non-existent key (key not + // present in GetMaterialPropertyNames()). - std::vector GetMaterialPropertyNames() const; - std::vector GetMaterialConstPropertyNames() const; + void DumpTable() const; + // print the material properties and material constant properties - void DumpTable(); - - const std::map>* - GetPropertyMap() const + // the next four methods are used in persistency/GDML: + const std::vector& GetMaterialPropertyNames() const { - return &MP; + return fMatPropNames; } - const std::map>* GetConstPropertyMap() const + const std::vector& GetMaterialConstPropertyNames() const { - return &MCP; + return fMatConstPropNames; } - // Accessors required for persistency purposes + const std::vector& GetProperties() const + { + return fMP; + } + const std::vector>& GetConstProperties() + const + { + return fMCP; + } + // return references to the vectors of material (constant) properties. private: G4MaterialPropertyVector* CalculateGROUPVEL(); // Calculate the group velocity based on RINDEX - std::map> MP; - typedef std::map>::const_iterator MPiterator; + std::vector fMP; + // Vector of pointer to material property vectors. All entries are + // initialized to nullptr. Pointer is not null when mat.prop. vector defined. + // Order of entries in MP defined by enum in G4MaterialPropertiesIndex. - std::map> MCP; - typedef std::map>::const_iterator - MCPiterator; - // material property map and constant property map by index types + std::vector> fMCP; + // Vector of energy-independent (i.e., "constant") material properties. We + // need to keep track if a property is defined or not: the bool in the pair + // is 'true' if the property is defined. + // Order of entries in MCP defined by enum in G4MaterialPropertiesIndex. - std::vector G4MaterialPropertyName; - std::vector G4MaterialConstPropertyName; + std::vector fMatPropNames; + std::vector fMatConstPropNames; // vectors of strings of property names }; diff --git a/source/materials/src/G4DensityEffectCalculator.cc b/source/materials/src/G4DensityEffectCalculator.cc index f497395997..861d283fdf 100644 --- a/source/materials/src/G4DensityEffectCalculator.cc +++ b/source/materials/src/G4DensityEffectCalculator.cc @@ -102,10 +102,13 @@ G4DensityEffectCalculator::G4DensityEffectCalculator(const G4Material* mat, G4in for(G4int i=0; i 0.0) ? 1./sum : 0.0; + sum += fConductivity; + + const G4double invsum = (sum > 0.0) ? 1./sum : 0.0; for(G4int i=0; iGetIonisation()->GetPlasmaEnergy()/CLHEP::eV; meanexcite = fMaterial->GetIonisation()->GetMeanExcitationEnergy()/CLHEP::eV; } @@ -131,7 +134,7 @@ G4double G4DensityEffectCalculator::ComputeDensityCorrection(G4double x) G4cout << " Delta: computed= " << exact << ", parametrized= " << approx << G4endl; } - if(approx > 0. && exact < 0.) { + if(approx >= 0. && exact < 0.) { if(fVerbose > 0) { ++fWarnings; if(fWarnings < maxWarnings) { @@ -209,18 +212,32 @@ G4double G4DensityEffectCalculator::FermiDeltaCalculation(G4double x) // Calculate the Sternheimer adjusted energy levels and parameters l_i given // the Sternheimer parameter rho. - sternrho /= plasmaE; for(G4int i=0; ipowN(sternEbar[i], 2) + 2./3.*sternf[i]); + sternEbar[i] = levE[i] * (sternrho/plasmaE); + sternl[i] = std::sqrt(gpow->powN(sternEbar[i], 2) + (2./3.)*sternf[i]); } + // The derivative of the function we are solving for is strictly + // negative for positive (physical) values, so if the value at + // zero is less than zero, it has no solution, and there is no + // density effect in the Sternheimer "exact" treatment (which is + // still an approximation). + // + // For conductors, this test is not needed, because Ell(L) contains + // the term fConductivity/(L*L), so the value at L=0 is always + // positive infinity. In the code we don't return inf, though, but + // rather set that term to zero, which means that if this test were + // used, it would give the wrong result for some materials. + if(fConductivity == 0 && Ell(0) <= 0) return 0; - // Make imphirical initial guess - const G4double sternL = Newton(sternrho, false); - if(sternL > -1.) { - return DeltaOnceSolved(sternL); + // Attempt to find the root from 40 starting points evenly distributed + // in log space. Trying a single starting point is not sufficient for + // convergence in most cases. + for(G4int startLi = -10; startLi < 30; ++startLi){ + const G4double sternL = Newton(gpow->powN(2, startLi), false); + if(sternL != -1.) { + return DeltaOnceSolved(sternL); + } } - return -1.; // Signal the caller to use the Sternheimer approximation, // because we have been unable to solve the exact form. } @@ -251,7 +268,7 @@ G4double G4DensityEffectCalculator::Newton(G4double start, G4bool first) const G4double del = value/dvalue; lambda -= del; - const G4double eps = std::abs(del); + const G4double eps = std::abs(del/lambda); if(eps <= 1.e-12) { ++ngood; if(ngood == 2) { @@ -263,7 +280,7 @@ G4double G4DensityEffectCalculator::Newton(G4double start, G4bool first) } else { ++nbad; } - if(nbad > maxIter || eps > 1.) { break; } + if(nbad > maxIter || std::isnan(value) || std::isinf(value)) { break; } } if(fVerbose > 2) { G4cout << " Failed to converge last value= " << value @@ -318,6 +335,7 @@ G4double G4DensityEffectCalculator::DEll(G4double L) ans += sternf[i]/gpow->powN(y + L*L, 2); } } + ans += fConductivity/gpow->powN(L*L, 2); ans *= (-2*L); // pulled out of the loop for efficiency return ans; } @@ -332,12 +350,15 @@ G4double G4DensityEffectCalculator::Ell(G4double L) ans += sternf[i]/(gpow->powN(sternEbar[i], 2) + L*L); } } + if(fConductivity > 0. && L != 0.) { + ans += fConductivity/(L*L); + } ans -= gpow->powZ(10, -2 * sternx); return ans; } /** - * Given the Sternheimer parameter l^2 (called 'sternL' here), and that + * Given the Sternheimer parameter l (called 'sternL' here), and that * the l_i and adjusted energies have been found with SetupFermiDeltaCalc(), * return the value of delta. Helper function for DoFermiDeltaCalc(). */ @@ -350,6 +371,12 @@ G4double G4DensityEffectCalculator::DeltaOnceSolved(G4double sternL) + gpow->powN(sternL, 2))/gpow->powN(sternl[i], 2)); } } + // sternl for the conduction electrons is sqrt(fConductivity), with + // no factor of 2./3 as with the other levels. + if(fConductivity > 0) { + ans += fConductivity * G4Log((fConductivity + + gpow->powN(sternL, 2))/fConductivity); + } ans -= gpow->powN(sternL, 2)/(1 + gpow->powZ(10, 2 * sternx)); return ans; } diff --git a/source/materials/src/G4DensityEffectData.cc b/source/materials/src/G4DensityEffectData.cc index 3396e82054..9bf9df6245 100644 --- a/source/materials/src/G4DensityEffectData.cc +++ b/source/materials/src/G4DensityEffectData.cc @@ -1295,15 +1295,13 @@ void G4DensityEffectData::Initialize() //G4_GRAPHITE_POROUS index=277 G4double M277[NDENSARRAY]={26.555,2.49,3.155,0.048,2.5387,0.20762,2.9532,0.14,0.038,78.0 }; AddMaterial(M277,"G4_GRAPHITE_POROUS"); - } G4int G4DensityEffectData::GetElementIndex(G4int Z, G4State st) const { G4int idx = -1; if(Z > 0 && Z < NDENSELEM) { - if(st == state[Z]) { idx = indexZ[Z]; } - else if(st == kStateUndefined) { idx = indexZ[Z]; } + if(st == state[Z] || st == kStateUndefined) { idx = indexZ[Z]; } } return idx; } diff --git a/source/materials/src/G4Element.cc b/source/materials/src/G4Element.cc index b2880a9efe..2ecf3a94b7 100644 --- a/source/materials/src/G4Element.cc +++ b/source/materials/src/G4Element.cc @@ -111,7 +111,7 @@ G4Element::G4Element(const G4String& name, const G4String& symbol, AddNaturalIsotopes(); - for (G4int i=0;isize() ) { G4double wtSum=0.0; fAeff = 0.0; - for (G4int i=0; iGetA(); wtSum += fRelativeAbundanceVector[i]; } @@ -195,7 +195,7 @@ void G4Element::AddIsotope(G4Isotope* isotope, G4double abundance) fNeff = fAeff/(g/mole); if(wtSum != 1.0) { - for(G4int i=0; isize(); ++j) { + delete (*(compData[i]))[j]; + } + delete compID[i]; + delete compData[i]; } } } void G4ElementData::InitialiseForElement(G4int Z, G4PhysicsVector* v) { - if(Z < 1 || Z >= maxNumElements) { + if(Z < 1 || Z >= maxNumElm) { G4cout << "G4ElementData::InitialiseForElement ERROR for " << name << " Z = " << Z << " is out of range!" << G4endl; G4Exception("G4ElementData::InitialiseForElement()", "mat601", FatalException, "Wrong data handling"); return; } - if(elmData[Z]) { delete elmData[Z]; } + if(nullptr != elmData[Z]) { delete elmData[Z]; } elmData[Z] = v; } void G4ElementData::InitialiseForElement(G4int Z, G4Physics2DVector* v) { - if(Z < 1 || Z >= maxNumElements) { + if(Z < 1 || Z >= maxNumElm) { G4cout << "G4ElementData::InitialiseForElement ERROR for " << name << " Z = " << Z << " is out of range!" << G4endl; G4Exception("G4ElementData::InitialiseForElement()", "mat601", FatalException, "Wrong data handling"); return; } - if(elm2Data[Z]) { delete elm2Data[Z]; } + if(nullptr != elm2Data[Z]) { delete elm2Data[Z]; } elm2Data[Z] = v; } void G4ElementData::InitialiseForComponent(G4int Z, G4int nComponents) { - if(Z < 1 || Z >= maxNumElements) { + if(Z < 1 || Z >= maxNumElm || nComponents < 0) { G4cout << "G4ElementData::InitialiseForComponent ERROR for " << name - << " Z = " << Z << " is out of range!" << G4endl; + << " Z= " << Z << " Ncomp= " << nComponents + << " is out of range!" << G4endl; G4Exception("G4ElementData::InitialiseForComponent()", "mat602", FatalException, "Wrong data handling"); return; } // reserve a new structure - size_t n = compLength[Z]; - if(0 < n) { - for(size_t i=0; i(); + compData[Z] = new std::vector(); } - (compData[Z]).reserve(nComponents); - (compID[Z]).reserve(nComponents); + compID[Z]->resize(nComponents, -1); + compData[Z]->resize(nComponents, nullptr); + compLength[Z] = 0; } -void -G4ElementData::AddComponent(G4int Z, G4int id, G4PhysicsVector* v) +void G4ElementData::AddComponent(G4int Z, G4int id, G4PhysicsVector* v) { - if(Z < 1 || Z >= maxNumElements) { + if(Z < 1 || Z >= maxNumElm || + (G4int)compID[Z]->size() == compLength[Z]) { G4cout << "G4ElementData::AddComponent ERROR for " << name << " Z = " << Z << " is out of range!" << G4endl; G4Exception("G4ElementData::AddComponent()", "mat603", FatalException, "Wrong data handling"); return; } - (compData[Z]).push_back(v); - (compID[Z]).push_back(id); - ++compLength[Z]; + (*(compData[Z]))[compLength[Z]] = v; + (*(compID[Z]))[compLength[Z]] = id; + compLength[Z] = compLength[Z] + 1; } diff --git a/source/materials/src/G4ExtendedMaterial.cc b/source/materials/src/G4ExtendedMaterial.cc index 8c4f457082..30932fc672 100644 --- a/source/materials/src/G4ExtendedMaterial.cc +++ b/source/materials/src/G4ExtendedMaterial.cc @@ -37,7 +37,6 @@ #include "G4ExtendedMaterial.hh" #include "G4VMaterialExtension.hh" -#include "G4PhysicsModelCatalog.hh" // Constructor to create an extended material from the base-class G4Material diff --git a/source/materials/src/G4IonisParamMat.cc b/source/materials/src/G4IonisParamMat.cc index 2b64891c0d..90fdce13f7 100644 --- a/source/materials/src/G4IonisParamMat.cc +++ b/source/materials/src/G4IonisParamMat.cc @@ -184,7 +184,7 @@ G4DensityEffectData* G4IonisParamMat::GetDensityEffectData() G4double G4IonisParamMat::DensityCorrection(G4double x) { - return (!fDensityEffectCalc) ? GetDensityCorrection(x) + return (nullptr == fDensityEffectCalc) ? GetDensityCorrection(x) : fDensityEffectCalc->ComputeDensityCorrection(x); } @@ -226,7 +226,7 @@ void G4IonisParamMat::ComputeDensityEffectParameters() } } // for base material case - if(idx < 0 && bmat) { + if(idx < 0 && nullptr != bmat) { idx = fDensityData->GetIndex(bmat->GetName()); if(idx >= 0) { corr = G4Log(bmat->GetDensity()/fMaterial->GetDensity()); @@ -281,7 +281,7 @@ void G4IonisParamMat::ComputeDensityEffectParameters() } else { - static const G4double Cd2 = 4*pi*hbarc_squared*classic_electr_radius; + static const G4double Cd2 = 4*CLHEP::pi*CLHEP::hbarc_squared*CLHEP::classic_electr_radius; fPlasmaEnergy = std::sqrt(Cd2*fMaterial->GetTotNbOfElectPerVolume()); // Compute parameters for the density effect correction in DE/Dx formula. @@ -292,9 +292,9 @@ void G4IonisParamMat::ComputeDensityEffectParameters() // // condensed materials // - if ((State == kStateSolid)||(State == kStateLiquid)) { + if ((State == kStateSolid) || (State == kStateLiquid)) { - static const G4double E100eV = 100.*eV; + static const G4double E100eV = 100.*CLHEP::eV; static const G4double ClimiS[] = {3.681 , 5.215 }; static const G4double X0valS[] = {1.0 , 1.5 }; static const G4double X1valS[] = {2.0 , 3.0 }; @@ -317,17 +317,23 @@ void G4IonisParamMat::ComputeDensityEffectParameters() // fMdensity = 3.; fX1density = 4.0; - if(fCdensity < 10.) { - fX0density = 1.6; - } else if(fCdensity < 11.5) { - fX0density = 1.6 + 0.2*(fCdensity - 10.); - } else if(fCdensity < 12.25) { - fX0density = 1.9 + (fCdensity - 11.5)/7.5; - } else if(fCdensity < 13.804) { - fX0density = 2.0; - fX1density = 4.0 + (fCdensity - 12.25)/1.554; + + if(fCdensity <= 10.) { + fX0density = 1.6; + } else if(fCdensity <= 10.5) { + fX0density = 1.7; + } else if(fCdensity <= 11.0) { + fX0density = 1.8; + } else if(fCdensity <= 11.5) { + fX0density = 1.9; + } else if(fCdensity <= 12.25) { + fX0density = 2.0; + } else if(fCdensity <= 13.804) { + fX0density = 2.0; + fX1density = 5.0; } else { - fX0density = 0.326*fCdensity-2.5; fX1density = 5.0; + fX0density = 0.326*fCdensity-2.5; + fX1density = 5.0; } //special: Hydrogen @@ -395,12 +401,12 @@ void G4IonisParamMat::ComputeFluctModel() fF2fluct = (Zeff > 2.) ? 2./Zeff : 0.0; fF1fluct = 1. - fF2fluct; - fEnergy2fluct = 10.*Zeff*Zeff*eV; + fEnergy2fluct = 10.*Zeff*Zeff*CLHEP::eV; fLogEnergy2fluct = G4Log(fEnergy2fluct); fLogEnergy1fluct = (fLogMeanExcEnergy - fF2fluct*fLogEnergy2fluct) /fF1fluct; fEnergy1fluct = G4Exp(fLogEnergy1fluct); - fEnergy0fluct = 10.*eV; + fEnergy0fluct = 10.*CLHEP::eV; fRateionexcfluct = 0.4; } @@ -444,7 +450,7 @@ void G4IonisParamMat::ComputeIonParameters() } fZeff = z; fLfactor = lF; - fFermiEnergy = 25.*keV*vF*vF; + fFermiEnergy = 25.*CLHEP::keV*vF*vF; fInvA23 = a23; } @@ -456,7 +462,7 @@ void G4IonisParamMat::SetMeanExcitationEnergy(G4double value) if (G4NistManager::Instance()->GetVerbose() > 1) { G4cout << "G4Material: Mean excitation energy is changed for " << fMaterial->GetName() - << " Iold= " << fMeanExcitationEnergy/eV + << " Iold= " << fMeanExcitationEnergy/CLHEP::eV << "eV; Inew= " << value/eV << " eV;" << G4endl; } @@ -525,7 +531,7 @@ void G4IonisParamMat::SetDensityEffectParameters(const G4Material* bmat) void G4IonisParamMat::ComputeDensityEffectOnFly(G4bool val) { if(val) { - if(!fDensityEffectCalc) { + if(nullptr == fDensityEffectCalc) { G4int n = 0; for(size_t i=0; iGetNumberOfElements(); ++i) { const G4int Z = fMaterial->GetElement(i)->GetZasInt(); diff --git a/source/materials/src/G4Material.cc b/source/materials/src/G4Material.cc index 5e2db45009..d834476d96 100644 --- a/source/materials/src/G4Material.cc +++ b/source/materials/src/G4Material.cc @@ -116,8 +116,7 @@ G4Material::G4Material(const G4String& name, G4double z, // Initialize theElementVector allocating one // element corresponding to this material - maxNbComponents = fNumberOfComponents = fNumberOfElements = 1; - fArrayLength = maxNbComponents; + fNbComponents = fNumberOfElements = 1; theElementVector = new G4ElementVector(); // take element from DB @@ -167,11 +166,17 @@ G4Material::G4Material(const G4String& name, G4double density, fTemp = temp; fPressure = pressure; - maxNbComponents = nComponents; - fArrayLength = maxNbComponents; - fNumberOfComponents = fNumberOfElements = 0; - theElementVector = new G4ElementVector(); - theElementVector->reserve(maxNbComponents); + fNbComponents = nComponents; + theElementVector = new G4ElementVector(); + theElementVector->reserve(fNbComponents); + + fAtomsVector = new G4int[fNbComponents]; + fMassFractionVector = new G4double[fNbComponents]; + for(G4int i=0; iGetMassOfMolecule(); fNumberOfElements = fBaseMaterial->GetNumberOfElements(); - maxNbComponents = fNumberOfElements; - fNumberOfComponents = fNumberOfElements; + fNbComponents = fNumberOfElements; CopyPointersOfBaseMaterial(); } @@ -236,7 +240,6 @@ G4Material::~G4Material() if(fBaseMaterial == nullptr) { delete theElementVector; delete fSandiaTable; - //delete fMaterialPropertiesTable; delete [] fMassFractionVector; delete [] fAtomsVector; } @@ -252,34 +255,30 @@ G4Material::~G4Material() void G4Material::InitializePointers() { - theElementVector = nullptr; - fMassFractionVector = nullptr; - fAtomsVector = nullptr; - fMaterialPropertiesTable = nullptr; - - fVecNbOfAtomsPerVolume = nullptr; fBaseMaterial = nullptr; + fMaterialPropertiesTable = nullptr; + theElementVector = nullptr; + fAtomsVector = nullptr; + fMassFractionVector = nullptr; + fVecNbOfAtomsPerVolume = nullptr; - fChemicalFormula = ""; + fIonisation = nullptr; + fSandiaTable = nullptr; - // initilized data members - fDensity = 0.0; - fFreeElecDensity = 0.0; - fState = kStateUndefined; - fTemp = 0.0; - fPressure = 0.0; - maxNbComponents = 0; - fArrayLength = 0; - fNumberOfComponents = 0; - fNumberOfElements = 0; + fDensity = fFreeElecDensity = fTemp = fPressure = 0.0; fTotNbOfAtomsPerVolume = 0.0; fTotNbOfElectPerVolume = 0.0; - fRadlen = 0.0; - fNuclInterLen = 0.0; - fMassOfMolecule = 0.0; + fRadlen = fNuclInterLen = fMassOfMolecule = 0.0; + + fState = kStateUndefined; - fIonisation = nullptr; - fSandiaTable = nullptr; + fNumberOfElements = fNbComponents = fIdxComponent = 0; + + fMassFraction = true; + + fChemicalFormula = ""; + + // initilized data members // Store in the static Table of Materials fIndexInTable = theMaterialTable.size(); @@ -366,36 +365,64 @@ void G4Material::CopyPointersOfBaseMaterial() // AddElement -- composition by atom count -void G4Material::AddElement(G4Element* element, G4int nAtoms) +void +G4Material::AddElementByNumberOfAtoms(const G4Element* elm, G4int nAtoms) { - // initialization - if ( fNumberOfElements == 0 ) { - fAtomsVector = new G4int [fArrayLength]; - fMassFractionVector = new G4double[fArrayLength]; + // perform checks consistency + if(0 == fIdxComponent) { fMassFraction = false; } + if(fIdxComponent >= fNbComponents) { + G4ExceptionDescription ed; + ed << "For material " << fName << " and added element " + << elm->GetName() << " with Natoms=" << nAtoms + << " wrong attempt to add more than the declared number of elements " + << fIdxComponent << " >= " << fNbComponents; + G4Exception ("G4Material::AddElementByNumberOfAtoms()", "mat031", + FatalException, ed, ""); } - - // filling ... - if ( fNumberOfElements < maxNbComponents ) { - theElementVector->push_back(element); - fAtomsVector[fNumberOfElements] = nAtoms; - fNumberOfComponents = ++fNumberOfElements; - } else { - G4cout << "G4Material::AddElement ERROR for " << fName << " nElement= " - << fNumberOfElements << G4endl; - G4Exception ("G4Material::AddElement()", "mat031", FatalException, - "Attempt to add more than the declared number of elements."); + if(fMassFraction) { + G4ExceptionDescription ed; + G4cout << "For material " << fName << " and added element " + << elm->GetName() << " with Natoms=" << nAtoms + << " problem: cannot add by number of atoms after " + << "addition of elements by mass fraction"; + G4Exception ("G4Material::AddElementByNumberOfAtoms()", "mat031", + FatalException, ed, ""); + } + G4Element* element = const_cast(elm); + // filling + if (fIdxComponent < fNbComponents) { + G4bool isAdded = false; + for (G4int i=0; iGetName() << ", Natoms=" << nAtoms + << ", fIdxComponent=" << fIdxComponent + << " problem: attempt to add the same element, which already is at idx=" + << i << " with the Natoms=" << fAtomsVector[i]; + G4Exception ("G4Material::AddElementByNumberOfAtoms()", "mat031", + JustWarning, ed, ""); + fAtomsVector[i] += nAtoms; + break; + } + } + if(!isAdded) { + theElementVector->push_back(element); + fAtomsVector[fNumberOfElements] = nAtoms; + ++fNumberOfElements; + } } - // filled. - if ( fNumberOfElements == maxNbComponents ) { + ++fIdxComponent; + // is filled + if (fIdxComponent == fNbComponents) { // compute proportion by mass - G4int i=0; G4double Amol = 0.; - for (i=0; iGetA(); Amol += w; fMassFractionVector[i] = w; } - for (i=0; i 1.0) { - G4cout << "G4Material::AddElement ERROR for " << fName << " and " - << element->GetName() << " mass fraction= " << fraction - << " is wrong " << G4endl; - G4Exception ("G4Material::AddElement()", "mat032", FatalException, - "Attempt to add element with wrong mass fraction"); + G4ExceptionDescription ed; + ed << "For material " << fName << " and added element " + << elm->GetName() << " massFraction= " << fraction + << " is wrong "; + G4Exception ("G4Material::AddElementByMassFraction()", "mat031", + FatalException, ed, ""); } - // initialization - if (fNumberOfComponents == 0) { - fMassFractionVector = new G4double[fArrayLength]; - fAtomsVector = new G4int [fArrayLength]; + if(!fMassFraction) { + G4ExceptionDescription ed; + ed << "For material " << fName << " and added element " + << elm->GetName() << ", massFraction= " << fraction + << ", fIdxComponent=" << fIdxComponent + << " problem: cannot add by mass fraction after " + << "addition of elements by number of atoms"; + G4Exception ("G4Material::AddElementByMassFraction()", "mat031", + FatalException, ed, ""); } - // filling ... - if (fNumberOfComponents < maxNbComponents) { - G4int el = 0; - // Loop checking, 07-Aug-2015, Vladimir Ivanchenko - while ((el= fNbComponents) { + G4ExceptionDescription ed; + ed << "For material " << fName << " and added element " + << elm->GetName() << ", massFraction= " << fraction + << ", fIdxComponent=" << fIdxComponent + << " problem: attempt to add more than the declared number of elements " + << fIdxComponent << " >= " << fNbComponents; + G4Exception ("G4Material::AddElementByMassFraction()", "mat031", + FatalException, ed, ""); + } + G4Element* element = const_cast(elm); + + // filling + if (fIdxComponent < fNbComponents) { + G4bool isAdded = false; + for (G4int i=0; iGetName() << ", massFraction= " << fraction + << ", fIdxComponent=" << fIdxComponent + << " problem: attempt to add the same element, which is already at idx=" + << i << " with the fraction " << fMassFractionVector[i]; + G4Exception ("G4Material::AddElementByMassFraction()", "mat031", + JustWarning, ed, ""); + fMassFractionVector[i] += fraction; + isAdded = true; + break; + } + } + if(!isAdded) { theElementVector->push_back(element); - fMassFractionVector[el] = fraction; + fMassFractionVector[fNumberOfElements] = fraction; ++fNumberOfElements; } - ++fNumberOfComponents; - } else { - G4cout << "G4Material::AddElement ERROR for " << fName << " nElement= " - << fNumberOfElements << G4endl; - G4Exception ("G4Material::AddElement()", "mat033", FatalException, - "Attempt to add more than the declared number of elements."); - } - - // filled. - if (fNumberOfComponents == maxNbComponents) { - - G4int i=0; - G4double Zmol(0.), Amol(0.); - // check sum of weights -- OK? - G4double wtSum(0.0); - for (i=0; iGetZ(); - Amol += fMassFractionVector[i]*(*theElementVector)[i]->GetA(); - } - if (std::abs(1.-wtSum) > perThousand) { - G4cout << "WARNING !! for " << fName << " sum of fractional masses " - << wtSum << " is not 1 - results may be wrong" << G4endl; - G4Exception ("G4Material::AddElement()", "mat033", JustWarning, - "Fractional masses are incorrect."); - } - for (i=0; iGetA()); - } - - ComputeDerivedQuantities(); } + ++fIdxComponent; + + // is filled + if(fIdxComponent == fNbComponents) { FillVectors(); } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -475,90 +506,129 @@ void G4Material::AddElement(G4Element* element, G4double fraction) void G4Material::AddMaterial(G4Material* material, G4double fraction) { if(fraction < 0.0 || fraction > 1.0) { - G4cout << "G4Material::AddMaterial ERROR for " << fName << " and " - << material->GetName() << " mass fraction= " << fraction - << " is wrong "; - G4Exception ("G4Material::AddMaterial()", "mat034", FatalException, - "Attempt to add material with wrong mass fraction"); + G4ExceptionDescription ed; + ed << "For material " << fName << " and added material " + << material->GetName() << ", massFraction= " << fraction + << " is wrong "; + G4Exception ("G4Material::AddMaterial()", "mat031", FatalException, + ed, ""); } - // initialization - if (fNumberOfComponents == 0) { - fMassFractionVector = new G4double[fArrayLength]; - fAtomsVector = new G4int [fArrayLength]; + if(!fMassFraction) { + G4ExceptionDescription ed; + ed << "For material " << fName << " and added material " + << material->GetName() << ", massFraction= " << fraction + << ", fIdxComponent=" << fIdxComponent + << " problem: cannot add by mass fraction after " + << "addition of elements by number of atoms"; + G4Exception ("G4Material::AddMaterial()", "mat031", FatalException, + ed, ""); } - - G4int nelm = material->GetNumberOfElements(); - - // arrays should be extended - if(nelm > 1) { - G4int nold = fArrayLength; - fArrayLength += nelm - 1; - G4double* v1 = new G4double[fArrayLength]; - G4int* i1 = new G4int[fArrayLength]; - for(G4int i=0; i= fNbComponents) { + G4ExceptionDescription ed; + ed << "For material " << fName << " and added material " + << material->GetName() << ", massFraction= " << fraction + << " attempt to add more than the declared number of elements " + << fIdxComponent << " >= " << fNbComponents; + G4Exception ("G4Material::AddMaterial()", "mat031", FatalException, + ed, ""); } - - // filling ... - if (fNumberOfComponents < maxNbComponents) { - for (G4int elm=0; elmGetElementVector()))[elm]; - G4int el = 0; - // Loop checking, 07-Aug-2015, Vladimir Ivanchenko - while ((elGetFractionVector())[elm]; - else { - theElementVector->push_back(element); - fMassFractionVector[el] = fraction - *(material->GetFractionVector())[elm]; - ++fNumberOfElements; - } - } - ++fNumberOfComponents; - ///store massFraction of material component + // filling + if (fIdxComponent < fNbComponents) { fMatComponents[material] = fraction; - - } else { - G4cout << "G4Material::AddMaterial ERROR for " << fName << " nElement= " - << fNumberOfElements << G4endl; - G4Exception ("G4Material::AddMaterial()", "mat035", FatalException, - "Attempt to add more than the declared number of components."); - } - - // filled. - if (fNumberOfComponents == maxNbComponents) { - G4int i=0; - G4double Zmol(0.), Amol(0.); - // check sum of weights -- OK? - G4double wtSum(0.0); - for (i=0; iGetZ(); - Amol += fMassFractionVector[i]*(*theElementVector)[i]->GetA(); - } - if (std::abs(1.-wtSum) > perThousand) { - G4cout << "G4Material::AddMaterial WARNING !! for " << fName - << " sum of fractional masses " - << wtSum << " is not 1 - results may be wrong" - << G4endl; - G4Exception ("G4Material::AddMaterial()", "mat033", JustWarning, - "Fractional masses are incorrect."); - } - for (i=0; iGetA()); - } - - ComputeDerivedQuantities(); } + ++fIdxComponent; + + // is filled + if(fIdxComponent == fNbComponents) { FillVectors(); } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4Material::FillVectors() +{ + // there are material components + if(!fMatComponents.empty()) { + G4int nel = fNumberOfElements; + // check list of materials + for(auto & x : fMatComponents) { + const G4Material* mat = x.first; + G4int nn = mat->GetNumberOfElements(); + for(G4int j=0; jGetElement(j); + for(G4int k=0; k fNbComponents) { + delete [] fAtomsVector; + fAtomsVector = new G4int[nel]; + G4double* v = new G4double[nel]; + for(G4int i=0; iGetNumberOfElements(); + const G4double* elmFrac = mat->GetFractionVector(); + for(G4int j=0; jGetElement(j); + for(G4int k=0; kpush_back(const_cast(elm)); + fMassFractionVector[fNumberOfElements] = frac*elmFrac[j]; + ++fNumberOfElements; + } + } + } + } + + // check sum of weights -- OK? + G4double wtSum(0.0); + for (G4int i=0; i perThousand) { + G4ExceptionDescription ed; + ed << "For material " << fName << " sum of fractional masses " + << wtSum << " is not 1 - results may be wrong"; + G4Exception ("G4Material::FillVectors()", "mat031", JustWarning, + ed, ""); + } + G4double coeff = (wtSum > 0.0) ? 1./wtSum : 1.0; + G4double Amol(0.); + for (G4int i=0; iGetA(); + } + for (G4int i=0; iGetA()); + } + ComputeDerivedQuantities(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -566,7 +636,7 @@ void G4Material::AddMaterial(G4Material* material, G4double fraction) void G4Material::ComputeRadiationLength() { G4double radinv = 0.0 ; - for (G4int i=0;iGetfRadTsai()); } fRadlen = (radinv <= 0.0 ? DBL_MAX : 1./radinv); @@ -625,7 +695,7 @@ void G4Material::ComputeDensityEffectOnFly(G4bool val) #ifdef G4MULTITHREADED G4MUTEXLOCK(&materialMutex); #endif - if (!fIonisation) { fIonisation = new G4IonisParamMat(this); } + if (nullptr == fIonisation) { fIonisation = new G4IonisParamMat(this); } fIonisation->ComputeDensityEffectOnFly(val); #ifdef G4MULTITHREADED G4MUTEXUNLOCK(&materialMutex); @@ -701,10 +771,11 @@ G4Material* G4Material::GetMaterial(size_t nComp, G4double dens) G4double G4Material::GetZ() const { if (fNumberOfElements > 1) { - G4cout << "G4Material ERROR in GetZ. The material: " << fName - << " is a mixture."; - G4Exception ("G4Material::GetZ()", "mat036", FatalException, - "the Atomic number is not well defined." ); + G4ExceptionDescription ed; + ed << "For material " << fName << " ERROR in GetZ() - Nelm=" + << fNumberOfElements << " > 1, which is not allowed"; + G4Exception ("G4Material::GetZ()", "mat036", FatalException, + ed, ""); } return (*theElementVector)[0]->GetZ(); } @@ -714,10 +785,11 @@ G4double G4Material::GetZ() const G4double G4Material::GetA() const { if (fNumberOfElements > 1) { - G4cout << "G4Material ERROR in GetA. The material: " << fName - << " is a mixture."; - G4Exception ("G4Material::GetA()", "mat037", FatalException, - "the Atomic mass is not well defined." ); + G4ExceptionDescription ed; + ed << "For material " << fName << " ERROR in GetA() - Nelm=" + << fNumberOfElements << " > 1, which is not allowed"; + G4Exception ("G4Material::GetA()", "mat036", FatalException, + ed, ""); } return (*theElementVector)[0]->GetA(); } @@ -777,7 +849,7 @@ std::ostream& operator<<(std::ostream& flux, const G4Material& material) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -std::ostream& operator<<(std::ostream& flux, G4MaterialTable MaterialTable) +std::ostream& operator<<(std::ostream& flux, const G4MaterialTable& MaterialTable) { //Dump info for all known materials flux << "\n***** Table : Nb of materials = " << MaterialTable.size() @@ -801,7 +873,7 @@ G4bool G4Material::IsExtended() const void G4Material::SetMaterialPropertiesTable(G4MaterialPropertiesTable* anMPT) { - if(anMPT && fMaterialPropertiesTable != anMPT) { + if(nullptr != anMPT && fMaterialPropertiesTable != anMPT) { #ifdef G4MULTITHREADED G4MUTEXLOCK(&materialMutex); if(fMaterialPropertiesTable != anMPT) { diff --git a/source/materials/src/G4MaterialPropertiesTable.cc b/source/materials/src/G4MaterialPropertiesTable.cc index 37a8a56670..bb4b73a9db 100644 --- a/source/materials/src/G4MaterialPropertiesTable.cc +++ b/source/materials/src/G4MaterialPropertiesTable.cc @@ -54,158 +54,151 @@ #include #include +#ifdef G4MULTITHREADED +# include "G4AutoLock.hh" +namespace +{ + G4Mutex materialPropertyTableMutex = G4MUTEX_INITIALIZER; +} +#endif + G4MaterialPropertiesTable::G4MaterialPropertiesTable() { // elements of these 2 vectors must be in same order as // the corresponding enums in G4MaterialPropertiesIndex.hh - G4MaterialPropertyName.push_back(G4String("RINDEX")); - G4MaterialPropertyName.push_back(G4String("REFLECTIVITY")); - G4MaterialPropertyName.push_back(G4String("REALRINDEX")); - G4MaterialPropertyName.push_back(G4String("IMAGINARYRINDEX")); - G4MaterialPropertyName.push_back(G4String("EFFICIENCY")); - G4MaterialPropertyName.push_back(G4String("TRANSMITTANCE")); - G4MaterialPropertyName.push_back(G4String("SPECULARLOBECONSTANT")); - G4MaterialPropertyName.push_back(G4String("SPECULARSPIKECONSTANT")); - G4MaterialPropertyName.push_back(G4String("BACKSCATTERCONSTANT")); - G4MaterialPropertyName.push_back(G4String("GROUPVEL")); - G4MaterialPropertyName.push_back(G4String("MIEHG")); - G4MaterialPropertyName.push_back(G4String("RAYLEIGH")); - G4MaterialPropertyName.push_back(G4String("WLSCOMPONENT")); - G4MaterialPropertyName.push_back(G4String("WLSABSLENGTH")); - G4MaterialPropertyName.push_back(G4String("WLSCOMPONENT2")); - G4MaterialPropertyName.push_back(G4String("WLSABSLENGTH2")); - G4MaterialPropertyName.push_back(G4String("ABSLENGTH")); - G4MaterialPropertyName.push_back(G4String("PROTONSCINTILLATIONYIELD")); - G4MaterialPropertyName.push_back(G4String("DEUTERONSCINTILLATIONYIELD")); - G4MaterialPropertyName.push_back(G4String("TRITONSCINTILLATIONYIELD")); - G4MaterialPropertyName.push_back(G4String("ALPHASCINTILLATIONYIELD")); - G4MaterialPropertyName.push_back(G4String("IONSCINTILLATIONYIELD")); - G4MaterialPropertyName.push_back(G4String("ELECTRONSCINTILLATIONYIELD")); - G4MaterialPropertyName.push_back(G4String("SCINTILLATIONCOMPONENT1")); - G4MaterialPropertyName.push_back(G4String("SCINTILLATIONCOMPONENT2")); - G4MaterialPropertyName.push_back(G4String("SCINTILLATIONCOMPONENT3")); + fMatPropNames.push_back(G4String("RINDEX")); + fMatPropNames.push_back(G4String("REFLECTIVITY")); + fMatPropNames.push_back(G4String("REALRINDEX")); + fMatPropNames.push_back(G4String("IMAGINARYRINDEX")); + fMatPropNames.push_back(G4String("EFFICIENCY")); + fMatPropNames.push_back(G4String("TRANSMITTANCE")); + fMatPropNames.push_back(G4String("SPECULARLOBECONSTANT")); + fMatPropNames.push_back(G4String("SPECULARSPIKECONSTANT")); + fMatPropNames.push_back(G4String("BACKSCATTERCONSTANT")); + fMatPropNames.push_back(G4String("GROUPVEL")); + fMatPropNames.push_back(G4String("MIEHG")); + fMatPropNames.push_back(G4String("RAYLEIGH")); + fMatPropNames.push_back(G4String("WLSCOMPONENT")); + fMatPropNames.push_back(G4String("WLSABSLENGTH")); + fMatPropNames.push_back(G4String("WLSCOMPONENT2")); + fMatPropNames.push_back(G4String("WLSABSLENGTH2")); + fMatPropNames.push_back(G4String("ABSLENGTH")); + fMatPropNames.push_back(G4String("PROTONSCINTILLATIONYIELD")); + fMatPropNames.push_back(G4String("DEUTERONSCINTILLATIONYIELD")); + fMatPropNames.push_back(G4String("TRITONSCINTILLATIONYIELD")); + fMatPropNames.push_back(G4String("ALPHASCINTILLATIONYIELD")); + fMatPropNames.push_back(G4String("IONSCINTILLATIONYIELD")); + fMatPropNames.push_back(G4String("ELECTRONSCINTILLATIONYIELD")); + fMatPropNames.push_back(G4String("SCINTILLATIONCOMPONENT1")); + fMatPropNames.push_back(G4String("SCINTILLATIONCOMPONENT2")); + fMatPropNames.push_back(G4String("SCINTILLATIONCOMPONENT3")); - assert(G4MaterialPropertyName.size() == kNumberOfPropertyIndex); + assert(fMatPropNames.size() == kNumberOfPropertyIndex); - G4MaterialConstPropertyName.push_back(G4String("SURFACEROUGHNESS")); - G4MaterialConstPropertyName.push_back(G4String("ISOTHERMAL_COMPRESSIBILITY")); - G4MaterialConstPropertyName.push_back(G4String("RS_SCALE_FACTOR")); - G4MaterialConstPropertyName.push_back(G4String("WLSMEANNUMBERPHOTONS")); - G4MaterialConstPropertyName.push_back(G4String("WLSTIMECONSTANT")); - G4MaterialConstPropertyName.push_back(G4String("WLSMEANNUMBERPHOTONS2")); - G4MaterialConstPropertyName.push_back(G4String("WLSTIMECONSTANT2")); - G4MaterialConstPropertyName.push_back(G4String("MIEHG_FORWARD")); - G4MaterialConstPropertyName.push_back(G4String("MIEHG_BACKWARD")); - G4MaterialConstPropertyName.push_back(G4String("MIEHG_FORWARD_RATIO")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONYIELD")); - G4MaterialConstPropertyName.push_back(G4String("RESOLUTIONSCALE")); - G4MaterialConstPropertyName.push_back(G4String("FERMIPOT")); - G4MaterialConstPropertyName.push_back(G4String("DIFFUSION")); - G4MaterialConstPropertyName.push_back(G4String("SPINFLIP")); - G4MaterialConstPropertyName.push_back(G4String("LOSS")); - G4MaterialConstPropertyName.push_back(G4String("LOSSCS")); - G4MaterialConstPropertyName.push_back(G4String("ABSCS")); - G4MaterialConstPropertyName.push_back(G4String("SCATCS")); - G4MaterialConstPropertyName.push_back(G4String("MR_NBTHETA")); - G4MaterialConstPropertyName.push_back(G4String("MR_NBE")); - G4MaterialConstPropertyName.push_back(G4String("MR_RRMS")); - G4MaterialConstPropertyName.push_back(G4String("MR_CORRLEN")); - G4MaterialConstPropertyName.push_back(G4String("MR_THETAMIN")); - G4MaterialConstPropertyName.push_back(G4String("MR_THETAMAX")); - G4MaterialConstPropertyName.push_back(G4String("MR_EMIN")); - G4MaterialConstPropertyName.push_back(G4String("MR_EMAX")); - G4MaterialConstPropertyName.push_back(G4String("MR_ANGNOTHETA")); - G4MaterialConstPropertyName.push_back(G4String("MR_ANGNOPHI")); - G4MaterialConstPropertyName.push_back(G4String("MR_ANGCUT")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONTIMECONSTANT1")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONTIMECONSTANT2")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONTIMECONSTANT3")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONRISETIME1")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONRISETIME2")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONRISETIME3")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONYIELD1")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONYIELD2")); - G4MaterialConstPropertyName.push_back(G4String("SCINTILLATIONYIELD3")); - G4MaterialConstPropertyName.push_back(G4String("PROTONSCINTILLATIONYIELD1")); - G4MaterialConstPropertyName.push_back(G4String("PROTONSCINTILLATIONYIELD2")); - G4MaterialConstPropertyName.push_back(G4String("PROTONSCINTILLATIONYIELD3")); - G4MaterialConstPropertyName.push_back( - G4String("DEUTERONSCINTILLATIONYIELD1")); - G4MaterialConstPropertyName.push_back( - G4String("DEUTERONSCINTILLATIONYIELD2")); - G4MaterialConstPropertyName.push_back( - G4String("DEUTERONSCINTILLATIONYIELD3")); - G4MaterialConstPropertyName.push_back(G4String("TRITONSCINTILLATIONYIELD1")); - G4MaterialConstPropertyName.push_back(G4String("TRITONSCINTILLATIONYIELD2")); - G4MaterialConstPropertyName.push_back(G4String("TRITONSCINTILLATIONYIELD3")); - G4MaterialConstPropertyName.push_back(G4String("ALPHASCINTILLATIONYIELD1")); - G4MaterialConstPropertyName.push_back(G4String("ALPHASCINTILLATIONYIELD2")); - G4MaterialConstPropertyName.push_back(G4String("ALPHASCINTILLATIONYIELD3")); - G4MaterialConstPropertyName.push_back(G4String("IONSCINTILLATIONYIELD1")); - G4MaterialConstPropertyName.push_back(G4String("IONSCINTILLATIONYIELD2")); - G4MaterialConstPropertyName.push_back(G4String("IONSCINTILLATIONYIELD3")); - G4MaterialConstPropertyName.push_back( - G4String("ELECTRONSCINTILLATIONYIELD1")); - G4MaterialConstPropertyName.push_back( - G4String("ELECTRONSCINTILLATIONYIELD2")); - G4MaterialConstPropertyName.push_back( - G4String("ELECTRONSCINTILLATIONYIELD3")); + fMP.assign(kNumberOfPropertyIndex, nullptr); - assert(G4MaterialConstPropertyName.size() == kNumberOfConstPropertyIndex); + fMatConstPropNames.push_back(G4String("SURFACEROUGHNESS")); + fMatConstPropNames.push_back(G4String("ISOTHERMAL_COMPRESSIBILITY")); + fMatConstPropNames.push_back(G4String("RS_SCALE_FACTOR")); + fMatConstPropNames.push_back(G4String("WLSMEANNUMBERPHOTONS")); + fMatConstPropNames.push_back(G4String("WLSTIMECONSTANT")); + fMatConstPropNames.push_back(G4String("WLSMEANNUMBERPHOTONS2")); + fMatConstPropNames.push_back(G4String("WLSTIMECONSTANT2")); + fMatConstPropNames.push_back(G4String("MIEHG_FORWARD")); + fMatConstPropNames.push_back(G4String("MIEHG_BACKWARD")); + fMatConstPropNames.push_back(G4String("MIEHG_FORWARD_RATIO")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONYIELD")); + fMatConstPropNames.push_back(G4String("RESOLUTIONSCALE")); + fMatConstPropNames.push_back(G4String("FERMIPOT")); + fMatConstPropNames.push_back(G4String("DIFFUSION")); + fMatConstPropNames.push_back(G4String("SPINFLIP")); + fMatConstPropNames.push_back(G4String("LOSS")); + fMatConstPropNames.push_back(G4String("LOSSCS")); + fMatConstPropNames.push_back(G4String("ABSCS")); + fMatConstPropNames.push_back(G4String("SCATCS")); + fMatConstPropNames.push_back(G4String("MR_NBTHETA")); + fMatConstPropNames.push_back(G4String("MR_NBE")); + fMatConstPropNames.push_back(G4String("MR_RRMS")); + fMatConstPropNames.push_back(G4String("MR_CORRLEN")); + fMatConstPropNames.push_back(G4String("MR_THETAMIN")); + fMatConstPropNames.push_back(G4String("MR_THETAMAX")); + fMatConstPropNames.push_back(G4String("MR_EMIN")); + fMatConstPropNames.push_back(G4String("MR_EMAX")); + fMatConstPropNames.push_back(G4String("MR_ANGNOTHETA")); + fMatConstPropNames.push_back(G4String("MR_ANGNOPHI")); + fMatConstPropNames.push_back(G4String("MR_ANGCUT")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONTIMECONSTANT1")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONTIMECONSTANT2")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONTIMECONSTANT3")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONRISETIME1")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONRISETIME2")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONRISETIME3")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONYIELD1")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONYIELD2")); + fMatConstPropNames.push_back(G4String("SCINTILLATIONYIELD3")); + fMatConstPropNames.push_back(G4String("PROTONSCINTILLATIONYIELD1")); + fMatConstPropNames.push_back(G4String("PROTONSCINTILLATIONYIELD2")); + fMatConstPropNames.push_back(G4String("PROTONSCINTILLATIONYIELD3")); + fMatConstPropNames.push_back(G4String("DEUTERONSCINTILLATIONYIELD1")); + fMatConstPropNames.push_back(G4String("DEUTERONSCINTILLATIONYIELD2")); + fMatConstPropNames.push_back(G4String("DEUTERONSCINTILLATIONYIELD3")); + fMatConstPropNames.push_back(G4String("TRITONSCINTILLATIONYIELD1")); + fMatConstPropNames.push_back(G4String("TRITONSCINTILLATIONYIELD2")); + fMatConstPropNames.push_back(G4String("TRITONSCINTILLATIONYIELD3")); + fMatConstPropNames.push_back(G4String("ALPHASCINTILLATIONYIELD1")); + fMatConstPropNames.push_back(G4String("ALPHASCINTILLATIONYIELD2")); + fMatConstPropNames.push_back(G4String("ALPHASCINTILLATIONYIELD3")); + fMatConstPropNames.push_back(G4String("IONSCINTILLATIONYIELD1")); + fMatConstPropNames.push_back(G4String("IONSCINTILLATIONYIELD2")); + fMatConstPropNames.push_back(G4String("IONSCINTILLATIONYIELD3")); + fMatConstPropNames.push_back(G4String("ELECTRONSCINTILLATIONYIELD1")); + fMatConstPropNames.push_back(G4String("ELECTRONSCINTILLATIONYIELD2")); + fMatConstPropNames.push_back(G4String("ELECTRONSCINTILLATIONYIELD3")); + + assert(fMatConstPropNames.size() == kNumberOfConstPropertyIndex); + + fMCP.assign(kNumberOfConstPropertyIndex, { 0., false }); } G4MaterialPropertiesTable::~G4MaterialPropertiesTable() { - MPiterator it; - for(it = MP.begin(); it != MP.end(); ++it) + for(auto prop : fMP) { - delete(*it).second; + delete(prop); } - MP.clear(); - MCP.clear(); - - G4MaterialPropertyName.clear(); - G4MaterialConstPropertyName.clear(); } -G4int G4MaterialPropertiesTable::GetConstPropertyIndex(const G4String& key, - G4bool warning) const +G4int G4MaterialPropertiesTable::GetConstPropertyIndex( + const G4String& key) const { // Returns the constant material property index corresponding to a key - size_t index = - std::distance(G4MaterialConstPropertyName.begin(), - std::find(G4MaterialConstPropertyName.begin(), - G4MaterialConstPropertyName.end(), key)); - if(index < G4MaterialConstPropertyName.size()) + size_t index = std::distance( + fMatConstPropNames.begin(), + std::find(fMatConstPropNames.begin(), fMatConstPropNames.end(), key)); + if(index < fMatConstPropNames.size()) return index; - if(warning) - { - G4ExceptionDescription ed; - ed << "Constant Material Property Index for key " << key << " not found."; - G4Exception("G4MaterialPropertiesTable::GetConstPropertyIndex()", "mat206", - JustWarning, ed); - } - return -1; + + G4ExceptionDescription ed; + ed << "Constant Material Property Index for key " << key << " not found."; + G4Exception("G4MaterialPropertiesTable::GetConstPropertyIndex()", "mat200", + FatalException, ed); + return 0; } -G4int G4MaterialPropertiesTable::GetPropertyIndex(const G4String& key, - G4bool warning) const +G4int G4MaterialPropertiesTable::GetPropertyIndex(const G4String& key) const { // Returns the material property index corresponding to a key - size_t index = std::distance(G4MaterialPropertyName.begin(), - std::find(G4MaterialPropertyName.begin(), - G4MaterialPropertyName.end(), key)); - if(index < G4MaterialPropertyName.size()) + size_t index = + std::distance(fMatPropNames.begin(), + std::find(fMatPropNames.begin(), fMatPropNames.end(), key)); + if(index < fMatPropNames.size()) return index; - if(warning) - { - G4ExceptionDescription ed; - ed << "Material Property Index for key " << key << " not found."; - G4Exception("G4MaterialPropertiesTable::GetPropertyIndex()", "mat207", - JustWarning, ed); - } - return -1; + G4ExceptionDescription ed; + ed << "Material Property Index for key " << key << " not found."; + G4Exception("G4MaterialPropertiesTable::GetPropertyIndex()", "mat201", + FatalException, ed); + return 0; } G4double G4MaterialPropertiesTable::GetConstProperty(const G4int index) const @@ -213,10 +206,8 @@ G4double G4MaterialPropertiesTable::GetConstProperty(const G4int index) const // Returns the constant material property corresponding to an index // fatal exception if property not found - MCPiterator j; - j = MCP.find(index); - if(j != MCP.end()) - return j->second; + if(index < (G4int) fMCP.size() && fMCP[index].second == true) + return fMCP[index].first; G4ExceptionDescription ed; ed << "Constant Material Property Index " << index << " not found."; G4Exception("G4MaterialPropertiesTable::GetConstProperty()", "mat202", @@ -234,82 +225,97 @@ G4double G4MaterialPropertiesTable::GetConstProperty(const G4String& key) const G4double G4MaterialPropertiesTable::GetConstProperty(const char* key) const { - return GetConstProperty(G4String(key)); + return GetConstProperty(GetConstPropertyIndex(G4String(key))); } G4bool G4MaterialPropertiesTable::ConstPropertyExists(const G4int index) const { // Returns true if a const property corresponding to 'index' exists - MCPiterator j; - j = MCP.find(index); - if(j != MCP.end()) + if(index >= 0 && index < (G4int) fMCP.size() && fMCP[index].second == true) + { return true; + } return false; } G4bool G4MaterialPropertiesTable::ConstPropertyExists(const G4String& key) const { // Returns true if a const property 'key' exists - return ConstPropertyExists(GetConstPropertyIndex(key)); + size_t index = std::distance( + fMatConstPropNames.begin(), + std::find(fMatConstPropNames.begin(), fMatConstPropNames.end(), key)); + if(index < fMatConstPropNames.size()) // index is type size_t so >= 0 + return ConstPropertyExists(index); + return false; } G4bool G4MaterialPropertiesTable::ConstPropertyExists(const char* key) const { - return ConstPropertyExists(G4String(key)); + size_t index = std::distance( + fMatConstPropNames.begin(), + std::find(fMatConstPropNames.begin(), fMatConstPropNames.end(), key)); + if(index < fMatConstPropNames.size()) // index is type size_t so >= 0 + return ConstPropertyExists(index); + return false; } G4MaterialPropertyVector* G4MaterialPropertiesTable::GetProperty( - const G4String& key, G4bool warning) + const G4String& key) const { // Returns a Material Property Vector corresponding to a key - const G4int index = GetPropertyIndex(key, warning); - return GetProperty(index); + if(std::find(fMatPropNames.begin(), fMatPropNames.end(), key) != + fMatPropNames.end()) + { + const G4int index = GetPropertyIndex(G4String(key)); + return GetProperty(index); + } + return nullptr; } G4MaterialPropertyVector* G4MaterialPropertiesTable::GetProperty( - const char* key, G4bool warning) + const char* key) const { - return GetProperty(G4String(key), warning); + if(std::find(fMatPropNames.begin(), fMatPropNames.end(), key) != + fMatPropNames.end()) + { + const G4int index = GetPropertyIndex(G4String(key)); + return GetProperty(index); + } + return nullptr; } G4MaterialPropertyVector* G4MaterialPropertiesTable::GetProperty( - const G4int index, G4bool warning) + const G4int index) const { // Returns a Material Property Vector corresponding to an index - MPiterator i; - i = MP.find(index); - if(i != MP.end()) - return i->second; - if(warning) - { - G4ExceptionDescription ed; - ed << "Material Property for index " << index << " not found."; - G4Exception("G4MaterialPropertiesTable::GetPropertyIndex()", "mat208", - JustWarning, ed); - } + // returns nullptr if the property has not been defined by user + if(index >= 0 && index < (G4int) fMP.size()) + return fMP[index]; return nullptr; } G4MaterialPropertyVector* G4MaterialPropertiesTable::AddProperty( const G4String& key, const std::vector& photonEnergies, - const std::vector& propertyValues, G4bool createNewKey) + const std::vector& propertyValues, G4bool createNewKey, + G4bool spline) { if(photonEnergies.size() != propertyValues.size()) { G4ExceptionDescription ed; ed << "AddProperty error!"; - G4Exception("G4MaterialPropertiesTable::AddProperty()", "mat210", + G4Exception("G4MaterialPropertiesTable::AddProperty()", "mat204", FatalException, ed); } // if the key doesn't exist, add it if requested - if(std::find(G4MaterialPropertyName.begin(), G4MaterialPropertyName.end(), - key) == G4MaterialPropertyName.end()) + if(std::find(fMatPropNames.begin(), fMatPropNames.end(), key) == + fMatPropNames.end()) { if(createNewKey) { - G4MaterialPropertyName.push_back(key); + fMatPropNames.push_back(key); + fMP.push_back(nullptr); } else { @@ -317,15 +323,19 @@ G4MaterialPropertyVector* G4MaterialPropertiesTable::AddProperty( ed << "Attempting to create a new material property key " << key << " without setting\n" << "createNewKey parameter of AddProperty to true."; - G4Exception("G4MaterialPropertiesTable::AddProperty()", "mat220", + G4Exception("G4MaterialPropertiesTable::AddProperty()", "mat205", FatalException, ed); } } G4MaterialPropertyVector* mpv = - new G4MaterialPropertyVector(photonEnergies, propertyValues); + new G4MaterialPropertyVector(photonEnergies, propertyValues, spline); + if(spline) + { + mpv->FillSecondDerivatives(); + } G4int index = GetPropertyIndex(key); - MP[index] = mpv; + fMP[index] = mpv; // if key is RINDEX, we calculate GROUPVEL - // contribution from Tao Lin (IHEP, the JUNO experiment) @@ -338,20 +348,16 @@ G4MaterialPropertyVector* G4MaterialPropertiesTable::AddProperty( } G4MaterialPropertyVector* G4MaterialPropertiesTable::AddProperty( - const char* key, G4double* PhotonEnergies, G4double* PropertyValues, - G4int NumEntries, G4bool createNewKey) + const char* key, G4double* photonEnergies, G4double* propertyValues, + G4int numEntries, G4bool createNewKey, G4bool spline) { // Provides a way of adding a property to the Material Properties - // Table given a pair of numbers and a key + // Table given a pair of arrays and a key G4String k(key); - std::vector energies; - std::vector values; - for(G4int i = 0; i < NumEntries; ++i) - { - energies.push_back(PhotonEnergies[i]); - values.push_back(PropertyValues[i]); - } - return AddProperty(k, energies, values, createNewKey); + + std::vector energies(photonEnergies, photonEnergies + numEntries); + std::vector values(propertyValues, propertyValues + numEntries); + return AddProperty(k, energies, values, createNewKey, spline); } void G4MaterialPropertiesTable::AddProperty(const G4String& key, @@ -361,12 +367,13 @@ void G4MaterialPropertiesTable::AddProperty(const G4String& key, // Provides a way of adding a property to the Material Properties // Table given an G4MaterialPropertyVector Reference and a key // if the key doesn't exist, add it - if(std::find(G4MaterialPropertyName.begin(), G4MaterialPropertyName.end(), - key) == G4MaterialPropertyName.end()) + if(std::find(fMatPropNames.begin(), fMatPropNames.end(), key) == + fMatPropNames.end()) { if(createNewKey) { - G4MaterialPropertyName.push_back(key); + fMatPropNames.push_back(key); + fMP.push_back(nullptr); } else { @@ -374,12 +381,12 @@ void G4MaterialPropertiesTable::AddProperty(const G4String& key, ed << "Attempting to create a new material property key " << key << " without setting\n" << "createNewKey parameter of AddProperty to true."; - G4Exception("G4MaterialPropertiesTable::AddProperty()", "mat221", + G4Exception("G4MaterialPropertiesTable::AddProperty()", "mat206", FatalException, ed); } } G4int index = GetPropertyIndex(key); - MP[index] = mpv; + fMP[index] = mpv; // if key is RINDEX, we calculate GROUPVEL - // contribution from Tao Lin (IHEP, the JUNO experiment) @@ -399,24 +406,25 @@ void G4MaterialPropertiesTable::AddProperty(const char* key, void G4MaterialPropertiesTable::AddProperty(const G4String& key, const G4String& mat) { + // load a material property vector defined in Geant4 source G4MaterialPropertyVector* v = G4OpticalMaterialProperties::GetProperty(key, mat); AddProperty(key, v); } void G4MaterialPropertiesTable::AddConstProperty(const G4String& key, - G4double PropertyValue, + G4double propertyValue, G4bool createNewKey) { // Provides a way of adding a constant property to the Material Properties // Table given a key - if(std::find(G4MaterialConstPropertyName.begin(), - G4MaterialConstPropertyName.end(), - key) == G4MaterialConstPropertyName.end()) + if(std::find(fMatConstPropNames.begin(), fMatConstPropNames.end(), key) == + fMatConstPropNames.end()) { if(createNewKey) { - G4MaterialPropertyName.push_back(key); + fMatConstPropNames.push_back(key); + fMCP.push_back(std::pair{ 0., true }); } else { @@ -424,40 +432,41 @@ void G4MaterialPropertiesTable::AddConstProperty(const G4String& key, ed << "Attempting to create a new material constant property key " << key << " without setting" << " createNewKey parameter of AddProperty to true."; - G4Exception("G4MaterialPropertiesTable::AddProperty()", "mat222", + G4Exception("G4MaterialPropertiesTable::AddProperty()", "mat207", FatalException, ed); } } G4int index = GetConstPropertyIndex(key); - MCP[index] = PropertyValue; + fMCP[index] = std::pair{ propertyValue, true }; } void G4MaterialPropertiesTable::AddConstProperty(const char* key, - G4double PropertyValue, + G4double propertyValue, G4bool createNewKey) { // Provides a way of adding a constant property to the Material Properties // Table given a key - AddConstProperty(G4String(key), PropertyValue, createNewKey); + AddConstProperty(G4String(key), propertyValue, createNewKey); } void G4MaterialPropertiesTable::RemoveConstProperty(const G4String& key) { G4int index = GetConstPropertyIndex(key); - - MCP.erase(index); + if(index < (G4int) fMCP.size()) + fMCP[index] = std::pair{ 0., false }; } void G4MaterialPropertiesTable::RemoveConstProperty(const char* key) { - GetConstPropertyIndex(G4String(key)); + RemoveConstProperty(G4String(key)); } void G4MaterialPropertiesTable::RemoveProperty(const G4String& key) { G4int index = GetPropertyIndex(key); - MP.erase(index); + delete fMP[index]; + fMP[index] = nullptr; } void G4MaterialPropertiesTable::RemoveProperty(const char* key) @@ -471,21 +480,22 @@ void G4MaterialPropertiesTable::AddEntry(const G4String& key, { // Allows to add an entry pair directly to the Material Property Vector // given a key - if(std::find(G4MaterialPropertyName.begin(), G4MaterialPropertyName.end(), - key) == G4MaterialPropertyName.end()) + if(std::find(fMatPropNames.begin(), fMatPropNames.end(), key) == + fMatPropNames.end()) { - G4MaterialPropertyName.push_back(key); + G4Exception("G4MaterialPropertiesTable::AddEntry()", "mat214", + FatalException, "Material Property Vector not found."); } G4int index = GetPropertyIndex(key); - G4MaterialPropertyVector* targetVector = MP[index]; + G4MaterialPropertyVector* targetVector = fMP[index]; if(targetVector != nullptr) { targetVector->InsertValues(aPhotonEnergy, aPropertyValue); } else { - G4Exception("G4MaterialPropertiesTable::AddEntry()", "mat203", + G4Exception("G4MaterialPropertiesTable::AddEntry()", "mat208", FatalException, "Material Property Vector not found."); } if(key == "RINDEX") @@ -501,50 +511,32 @@ void G4MaterialPropertiesTable::AddEntry(const char* key, AddEntry(G4String(key), aPhotonEnergy, aPropertyValue); } -void G4MaterialPropertiesTable::DumpTable() +void G4MaterialPropertiesTable::DumpTable() const { // material properties - MPiterator i; - for(i = MP.begin(); i != MP.end(); ++i) + G4int j = 0; + for(const auto& prop : fMP) { - G4cout << (*i).first << ": " << G4MaterialPropertyName[(*i).first] - << G4endl; - if((*i).second != nullptr) + if(prop != nullptr) { - (*i).second->DumpValues(); - } - else - { - G4Exception("G4MaterialPropertiesTable::DumpTable()", "mat204", - JustWarning, "NULL Material Property Vector Pointer."); + G4cout << j << ": " << fMatPropNames[j] << G4endl; + prop->DumpValues(); } + ++j; } // material constant properties - MCPiterator j; - for(j = MCP.begin(); j != MCP.end(); ++j) + j = 0; + for(const auto& cprop : fMCP) { - G4cout << j->first << ": " << G4MaterialConstPropertyName[j->first] - << G4endl; - if(j->second != 0.) + if(cprop.second == true) { - G4cout << j->second << G4endl; - } - else - { - G4Exception("G4MaterialPropertiesTable::DumpTable()", "mat202", - JustWarning, "No Material Constant Property."); + G4cout << j << ": " << fMatConstPropNames[j] << " " << cprop.first + << G4endl; } + ++j; } } -#ifdef G4MULTITHREADED -# include "G4AutoLock.hh" -namespace -{ - G4Mutex materialPropertyTableMutex = G4MUTEX_INITIALIZER; -} -#endif - G4MaterialPropertyVector* G4MaterialPropertiesTable::CalculateGROUPVEL() { #ifdef G4MULTITHREADED @@ -552,10 +544,10 @@ G4MaterialPropertyVector* G4MaterialPropertiesTable::CalculateGROUPVEL() #endif // check if "GROUPVEL" already exists. If so, remove it. - MPiterator itr; - itr = MP.find(kGROUPVEL); - if(itr != MP.end()) + if(fMP[kGROUPVEL] != nullptr) + { this->RemoveProperty("GROUPVEL"); + } // fetch RINDEX data, give up if unavailable G4MaterialPropertyVector* rindex = this->GetProperty(kRINDEX); @@ -580,7 +572,7 @@ G4MaterialPropertyVector* G4MaterialPropertiesTable::CalculateGROUPVEL() if(E0 <= 0.) { - G4Exception("G4MaterialPropertiesTable::CalculateGROUPVEL()", "mat205", + G4Exception("G4MaterialPropertiesTable::CalculateGROUPVEL()", "mat211", FatalException, "Optical Photon Energy <= 0"); } @@ -594,7 +586,7 @@ G4MaterialPropertyVector* G4MaterialPropertiesTable::CalculateGROUPVEL() if(E1 <= 0.) { - G4Exception("G4MaterialPropertiesTable::CalculateGROUPVEL()", "mat205", + G4Exception("G4MaterialPropertiesTable::CalculateGROUPVEL()", "mat212", FatalException, "Optical Photon Energy <= 0"); } @@ -631,7 +623,7 @@ G4MaterialPropertyVector* G4MaterialPropertiesTable::CalculateGROUPVEL() if(E1 <= 0.) { - G4Exception("G4MaterialPropertiesTable::CalculateGROUPVEL()", "mat205", + G4Exception("G4MaterialPropertiesTable::CalculateGROUPVEL()", "mat213", FatalException, "Optical Photon Energy <= 0"); } } @@ -655,15 +647,3 @@ G4MaterialPropertyVector* G4MaterialPropertiesTable::CalculateGROUPVEL() return groupvel; } - -std::vector G4MaterialPropertiesTable::GetMaterialPropertyNames() - const -{ - return G4MaterialPropertyName; -} - -std::vector G4MaterialPropertiesTable::GetMaterialConstPropertyNames() - const -{ - return G4MaterialConstPropertyName; -} diff --git a/source/materials/src/G4MicroElecMaterialStructure.cc b/source/materials/src/G4MicroElecMaterialStructure.cc index 869b7807db..ff032db5fb 100644 --- a/source/materials/src/G4MicroElecMaterialStructure.cc +++ b/source/materials/src/G4MicroElecMaterialStructure.cc @@ -102,7 +102,7 @@ void G4MicroElecMaterialStructure::ReadMaterialFile() { char *path = std::getenv("G4LEDATA"); - if (materialName(0) == 'G' && materialName(1) == '4') { + if (materialName[0] == 'G' && materialName[1] == '4') { //in the case the NIST database is used materialName.erase(0, 1); materialName.erase(0, 1); @@ -133,7 +133,7 @@ void G4MicroElecMaterialStructure::ReadMaterialFile() getline(fichier, filler); std::stringstream line(filler); - if (filler(0) == '#' || filler.empty()) {continue;} + if (filler[0] == '#' || filler.empty()) {continue;} line >> varLength; line >> nameParameter; diff --git a/source/parameterisations/gflash/History b/source/parameterisations/gflash/History index d462b87c35..61eac0cb5c 100644 --- a/source/parameterisations/gflash/History +++ b/source/parameterisations/gflash/History @@ -15,7 +15,14 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- -April 1st, 2021, B. Morgan (gflash-V10-07-00) + +October 25th, 2021, B.Morgan (gflash-V10-07-02) +- Use G4StrUtil functions replacing deprecated G4String member functions + +Aug 31st, 2021, M. Verderi (gflash-V10-07-01) +- many fixes in src/GFlashSamplingShowerParameterisation.cc in the parameters definition and just cosmetics in src/GFlashSamplingShowerParameterisation.cc + +Apr 1st, 2021, B. Morgan (gflash-V10-07-00) - Migrate build to modular CMake API Sep 23rd, 2020, B. Morgan (gflash-V10-06-02) diff --git a/source/parameterisations/gflash/include/GFlashSamplingShowerParameterisation.hh b/source/parameterisations/gflash/include/GFlashSamplingShowerParameterisation.hh index a7ba57a6bf..af9d6803fc 100644 --- a/source/parameterisations/gflash/include/GFlashSamplingShowerParameterisation.hh +++ b/source/parameterisations/gflash/include/GFlashSamplingShowerParameterisation.hh @@ -53,6 +53,9 @@ class GFlashSamplingShowerParameterisation GFlashSamplingShowerParameterisation(G4Material* aMat1, G4Material* aMat2, G4double d1, G4double d2, + /// \param aMat1 passive material, \param dd1 - passive layer thickness + /// \param aMat2 active material, \param dd2 - acive layer thickness + GFlashSamplingShowerTuning * aPar = 0); ~GFlashSamplingShowerParameterisation(); diff --git a/source/parameterisations/gflash/include/GVFlashHomoShowerTuning.hh b/source/parameterisations/gflash/include/GVFlashHomoShowerTuning.hh index e2409bc303..5047721e05 100644 --- a/source/parameterisations/gflash/include/GVFlashHomoShowerTuning.hh +++ b/source/parameterisations/gflash/include/GVFlashHomoShowerTuning.hh @@ -73,21 +73,21 @@ class GVFlashHomoShowerTuning public: // with description - virtual G4double ParAveT1(){ return -0.812;} // t1 - virtual G4double ParAveA1(){ return 0.81; } // a1 - virtual G4double ParAveA2(){ return 0.458; } // a2 - virtual G4double ParAveA3(){ return 2.26; } // a3 + virtual G4double ParAveT1(){ return -0.812; } // t1 + virtual G4double ParAveA1(){ return 0.81; } // a1 + virtual G4double ParAveA2(){ return 0.458; } // a2 + virtual G4double ParAveA3(){ return 2.26; } // a3 - virtual G4double ParSigLogT1(){ return -1.4;} // t1 - virtual G4double ParSigLogT2(){ return 1.26;} // t2 + virtual G4double ParSigLogT1(){ return -1.4; } // t1 + virtual G4double ParSigLogT2(){ return 1.26;} // t2 // std::sqrt(var(ln(T))) = 1/(t+t2*ln(y)) - virtual G4double ParSigLogA1(){ return -0.58;} // a1 - virtual G4double ParSigLogA2(){ return 0.86; } // a2 + virtual G4double ParSigLogA1(){ return -0.58; } // a1 + virtual G4double ParSigLogA2(){ return 0.86; } // a2 // std::sqrt(var(ln(alpha))) = 1/(a1+a2*ln(y)) - virtual G4double ParRho1(){ return 0.705; } // r1 - virtual G4double ParRho2(){ return -0.023;} // r2 + virtual G4double ParRho1(){ return 0.705; } // r1 + virtual G4double ParRho2(){ return -0.023; } // r2 // Correlation(ln(T),ln(alpha))=r1+r2*ln(y) // Radial profiles diff --git a/source/parameterisations/gflash/src/GFlashSamplingShowerParameterisation.cc b/source/parameterisations/gflash/src/GFlashSamplingShowerParameterisation.cc index a6eb90ce1c..9e678be8f5 100644 --- a/source/parameterisations/gflash/src/GFlashSamplingShowerParameterisation.cc +++ b/source/parameterisations/gflash/src/GFlashSamplingShowerParameterisation.cc @@ -67,23 +67,32 @@ GFlashSamplingShowerParameterisation(G4Material* aMat1, G4Material* aMat2, // Longitudinal Coefficients for a homogenious calo // shower max - ParAveT1 = thePar->ParAveT1(); // ln (ln y -0.812) + ParAveT1 = thePar->ParAveT1(); // ln (ln y -0.812) ParAveA1 = thePar->ParAveA1(); // ln a (0.81 + (0.458 + 2.26/Z)ln y) ParAveA2 = thePar->ParAveA2(); ParAveA3 = thePar->ParAveA3(); + // Variance of shower max sampling + ParSigLogT1 = thePar->ParsSigLogT1(); // Sigma T1 (-1.4 + 1.26 ln y)**-1 --> bug : these two lines were missing, + ParSigLogT2 = thePar->ParsSigLogT2(); // leaving ParSigLogT1, ParSigLogT2 as 0.0 + // variance of 'alpha' + ParSigLogA1 = thePar->ParSigLogA1(); // Sigma a (-0.58 + 0.86 ln y)**-1 --> bug : these two lines were missing + ParSigLogA2 = thePar->ParSigLogA2(); // leaving ParSigLogA1 ParSigLogAé as 0.0 + // correlation alpha%T + ParRho1 = thePar->ParRho1(); // Rho = 0.705 -0.023 ln y --> bug : these two lines were missing, + ParRho2 = thePar->ParRho2(); // leaving ParRho1 and ParRho2 being 0.0 // Sampling ParsAveT1 = thePar->ParsAveT1(); // T_sam = log(exp( log T_hom) + t1*Fs-1 + t2*(1-ehat)); ParsAveT2 = thePar->ParsAveT2(); ParsAveA1 = thePar->ParsAveA1(); - // Variance of shower max sampling - ParsSigLogT1 = thePar->ParSigLogT1(); // Sigma T1 (-2.5 + 1.25 ln y)**-1 - ParsSigLogT2 = thePar->ParSigLogT2(); + // Variance of shower max sampling + ParsSigLogT1 = thePar->ParsSigLogT1(); // Sigma T1 (-2.5 + 1.25 ln y)**-1 --> bug ParSigLogT1() was called instead of ParsSigLogT1(); Same for T2. + ParsSigLogT2 = thePar->ParsSigLogT2(); // variance of 'alpha' - ParsSigLogA1 = thePar->ParSigLogA1(); // Sigma a (-0.82 + 0.79 ln y)**-1 - ParsSigLogA2 = thePar->ParSigLogA2(); + ParsSigLogA1 = thePar->ParsSigLogA1(); // Sigma a (-0.82 + 0.79 ln y)**-1 --> bug ParSigLogA1() was called instead of ParsSigLogA1(); Same for A2 + ParsSigLogA2 = thePar->ParsSigLogA2(); // correlation alpha%T - ParsRho1 = thePar->ParRho1(); // Rho = 0.784 -0.023 ln y - ParsRho2 = thePar->ParRho2(); + ParsRho1 = thePar->ParsRho1(); // Rho = 0.784 -0.023 ln y --> bug was using ParRho1() and ParRho2() + ParsRho2 = thePar->ParsRho2(); // Radial Coefficients // r_C (tau)= z_1 +z_2 tau @@ -186,15 +195,15 @@ void GFlashSamplingShowerParameterisation::ComputeZAX0EFFetc() G4double W2 = (d2*density2) / denominator; Zeff = ( W1*Z1 ) + ( W2*Z2 ); //X0*Es/Ec; Aeff = ( W1*A1 ) + ( W2*A2 ); - Rhoeff = ( (d1 *density1 ) + (d2 * density2 ))/G4double (d2 + d1 ); + Rhoeff = ( ( d1*density1 ) + ( d2*density2 ) ) / ( d1 + d2 ); // --> was G4double ( d2 + d1 ); X0eff = (W1 * Rhoeff) / (X01 * density1) + (W2 * Rhoeff) / (X02 * density2 ); X0eff = 1./ X0eff; - Rmeff = 1/ ((((W1*Ec1)/ X01) + ((W2* Ec2)/ X02) ) / Es ) ; - Eceff = X0eff *((W1*Ec1)/ X01 + (W2* Ec2)/ X02 ); - Fs = X0eff/G4double ((d1/mm )+(d2/mm) ); - ehat = (1. / (1+ 0.007*(Z1- Z2))); + Rmeff = 1./ ( ( ((W1*Ec1)/X01) + ((W2*Ec2)/X02) ) / Es ) ; + Eceff = X0eff * ( (W1*Ec1)/X01 + (W2*Ec2)/X02 ); + Fs = X0eff/(d1+d2);// --> was G4double ((d1/mm )+(d2/mm) ); Can't understand if dividing by mm makes sense... looks weird. + ehat = ( 1. / ( 1 + 0.007*(Z1- Z2) ) ); - G4cout << "W1= " << W1 << G4endl; + G4cout << "W1= " << W1 << G4endl; G4cout << "W2= " << W2 << G4endl; G4cout << "effective quantities Zeff = "<( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 4110.24*MeV, 2.501e-12*MeV, 0.0*eplus, + 0, +1, 0, + 0, 0, 0, + "anti_nucleus", 0, -4, -1020000040, + false, 0.2631*ns, nullptr, + false, "static", 1020000040, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double br_lambda_to_n_piz = 0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[3]; + // anti_lambda -> anti_proton + pi+ , with 50% probability of capturing the anti_proton + mode[0] = new G4PhaseSpaceDecayChannel( "anti_doublehyperdoubleneutron", half_br_lambda_to_p_pim, 5, + "anti_neutron", "anti_neutron", "anti_lambda", "anti_proton", "pi+" ); + mode[1] = new G4PhaseSpaceDecayChannel( "anti_doublehyperdoubleneutron", half_br_lambda_to_p_pim, 2, + "anti_hyperH4", "pi+" ); + // anti_lambda -> anti_neutron + pi0 , without any possibility of capturing the anti_neutron + mode[2] = new G4PhaseSpaceDecayChannel( "anti_doublehyperdoubleneutron", br_lambda_to_n_piz, 5, + "anti_neutron", "anti_neutron", "anti_lambda", "anti_neutron", "pi0" ); + for ( G4int index = 0; index < 3; ++index ) table->Insert( mode[index] ); + } + theInstance = reinterpret_cast< G4AntiDoubleHyperDoubleNeutron* >( anInstance ); + return theInstance; +} + + +G4AntiDoubleHyperDoubleNeutron* G4AntiDoubleHyperDoubleNeutron::AntiDoubleHyperDoubleNeutronDefinition() { + return Definition(); +} + + +G4AntiDoubleHyperDoubleNeutron* G4AntiDoubleHyperDoubleNeutron::AntiDoubleHyperDoubleNeutron() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4AntiDoubleHyperH4.cc b/source/particles/hadrons/ions/src/G4AntiDoubleHyperH4.cc new file mode 100644 index 0000000000..d8cc087e70 --- /dev/null +++ b/source/particles/hadrons/ions/src/G4AntiDoubleHyperH4.cc @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4AntiDoubleHyperH4.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ############################################################### +// ### ANTI DOUBLEHYPERH4 ### +// ############################################################### + +G4AntiDoubleHyperH4* G4AntiDoubleHyperH4::theInstance = nullptr; + + +G4AntiDoubleHyperH4* G4AntiDoubleHyperH4::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "anti_doublehyperH4"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 4106.72*MeV, 2.501e-12*MeV, -1.0*eplus, + 4, +1, 0, + 0, 0, 0, + "anti_nucleus", 0, -4, -1020010040, + false, 0.2631*ns, nullptr, + false, "static", 1020010040, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // anti_lambda -> anti_proton + pi+ , with 50% probability of capturing the anti_proton + mode[0] = new G4PhaseSpaceDecayChannel( "anti_doublehyperH4", half_br_lambda_to_p_pim, 3, + "anti_hypertriton", "anti_proton", "pi+" ); + mode[1] = new G4PhaseSpaceDecayChannel( "anti_doublehyperH4", half_br_lambda_to_p_pim, 2, + "anti_hyperalpha", "pi+" ); + // anti_lambda -> anti_neutron + pi0 , with 50% probability of capturing the anti_neutron + mode[2] = new G4PhaseSpaceDecayChannel( "anti_doublehyperH4", half_br_lambda_to_n_piz, 3, + "anti_hypertriton", "anti_neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "anti_doublehyperH4", half_br_lambda_to_n_piz, 2, + "anti_hyperH4", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4AntiDoubleHyperH4* >( anInstance ); + return theInstance; +} + + +G4AntiDoubleHyperH4* G4AntiDoubleHyperH4::AntiDoubleHyperH4Definition() { + return Definition(); +} + + +G4AntiDoubleHyperH4* G4AntiDoubleHyperH4::AntiDoubleHyperH4() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4AntiHyperAlpha.cc b/source/particles/hadrons/ions/src/G4AntiHyperAlpha.cc new file mode 100644 index 0000000000..a783a1c5d9 --- /dev/null +++ b/source/particles/hadrons/ions/src/G4AntiHyperAlpha.cc @@ -0,0 +1,124 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4AntiHyperAlpha.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ###################################################################### +// ### ANTI HYPERALPHA ### +// ###################################################################### + +G4AntiHyperAlpha* G4AntiHyperAlpha::theInstance = nullptr; + + +G4AntiHyperAlpha* G4AntiHyperAlpha::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "anti_hyperalpha"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 3921.87*MeV, 2.501e-12*MeV, -2.0*eplus, + 0, +1, 0, + 0, 0, 0, + "anti_nucleus", 0, -4, -1010020040, + false, 0.2631*ns, nullptr, + false, "static", 1010020040, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + /* + // The decay "mode[1]" produces the secondary "anti_Li4" which is not existing + // in Geant4: we therefore skip it for the time being (similarly for hyperalpha, + // to keep the symmetry between particle and anti-particle). + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // anti_lambda -> anti_proton + pi+ , with 50% probability of capturing the anti_proton + mode[0] = new G4PhaseSpaceDecayChannel( "anti_hyperalpha", half_br_lambda_to_p_pim, 3, + "anti_He3", "anti_proton", "pi+" ); + mode[1] = new G4PhaseSpaceDecayChannel( "anti_hyperalpha", half_br_lambda_to_p_pim, 2, + "anti_Li4", "pi+" ); + // anti_lambda -> anti_neutron + pi0 , with 50% probability of capturing the anti_neutron + mode[2] = new G4PhaseSpaceDecayChannel( "anti_hyperalpha", half_br_lambda_to_n_piz, 3, + "anti_He3", "anti_neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "anti_hyperalpha", half_br_lambda_to_n_piz, 2, + "anti_alpha", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + */ + // Replacement decay for the time being + const G4double br_lambda_to_p_pim = 0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[3]; + // anti_lambda -> anti_proton + pi+ , with 0% probability of capturing the anti_proton + mode[0] = new G4PhaseSpaceDecayChannel( "anti_hyperalpha", br_lambda_to_p_pim, 3, + "anti_He3", "anti_proton", "pi+" ); + // anti_lambda -> anti_neutron + pi0 , with 50% probability of capturing the anti_neutron + mode[1] = new G4PhaseSpaceDecayChannel( "anti_hyperalpha", half_br_lambda_to_n_piz, 3, + "anti_He3", "anti_neutron", "pi0" ); + mode[2] = new G4PhaseSpaceDecayChannel( "anti_hyperalpha", half_br_lambda_to_n_piz, 2, + "anti_alpha", "pi0" ); + for ( G4int index = 0; index < 3; ++index ) table->Insert( mode[index] ); + //--- + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4AntiHyperAlpha* >( anInstance ); + return theInstance; +} + + +G4AntiHyperAlpha* G4AntiHyperAlpha::AntiHyperAlphaDefinition() { + return Definition(); +} + + +G4AntiHyperAlpha* G4AntiHyperAlpha::AntiHyperAlpha() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4AntiHyperH4.cc b/source/particles/hadrons/ions/src/G4AntiHyperH4.cc new file mode 100644 index 0000000000..e87f57cce0 --- /dev/null +++ b/source/particles/hadrons/ions/src/G4AntiHyperH4.cc @@ -0,0 +1,124 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4AntiHyperH4.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ############################################################### +// ### ANTI HYPERH4 ### +// ############################################################### + +G4AntiHyperH4* G4AntiHyperH4::theInstance = nullptr; + + +G4AntiHyperH4* G4AntiHyperH4::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "anti_hyperH4"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 3922.40*MeV, 2.501e-12*MeV, -1.0*eplus, + 4, +1, 0, + 0, 0, 0, + "anti_nucleus", 0, -4, -1010010040, + false, 0.2631*ns, nullptr, + false, "static", 1010010040, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + /* + // The decay "mode[3]" produces the secondary "anti_H4" which is not existing + // in Geant4: we therefore skip it for the time being (similarly for hyperH4, + // to keep the symmetry between particle and anti-particle). + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // anti_lambda -> anti_proton + pi+ , with 50% probability of capturing the anti_proton + mode[0] = new G4PhaseSpaceDecayChannel( "anti_hyperH4", half_br_lambda_to_p_pim, 3, + "anti_triton", "anti_proton", "pi+" ); + mode[1] = new G4PhaseSpaceDecayChannel( "anti_hyperH4", half_br_lambda_to_p_pim, 2, + "anti_alpha", "pi+" ); + // anti_lambda -> anti_neutron + pi0 , with 50% probability of capturing the anti_neutron + mode[2] = new G4PhaseSpaceDecayChannel( "anti_hyperH4", half_br_lambda_to_n_piz, 3, + "anti_triton", "anti_neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "anti_hyperH4", half_br_lambda_to_n_piz, 2, + "anti_H4", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + */ + // Replacement decay for the time being + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double br_lambda_to_n_piz = 0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[3]; + // anti_lambda -> anti_proton + pi+ , with 50% probability of capturing the anti_proton + mode[0] = new G4PhaseSpaceDecayChannel( "anti_hyperH4", half_br_lambda_to_p_pim, 3, + "anti_triton", "anti_proton", "pi+" ); + mode[1] = new G4PhaseSpaceDecayChannel( "anti_hyperH4", half_br_lambda_to_p_pim, 2, + "anti_alpha", "pi+" ); + // anti_lambda -> anti_neutron + pi0 , with 0% probability of capturing the anti_neutron + mode[2] = new G4PhaseSpaceDecayChannel( "anti_hyperH4", br_lambda_to_n_piz, 3, + "anti_triton", "anti_neutron", "pi0" ); + for ( G4int index = 0; index < 3; ++index ) table->Insert( mode[index] ); + //--- + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4AntiHyperH4* >( anInstance ); + return theInstance; +} + + +G4AntiHyperH4* G4AntiHyperH4::AntiHyperH4Definition() { + return Definition(); +} + + +G4AntiHyperH4* G4AntiHyperH4::AntiHyperH4() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4AntiHyperHe5.cc b/source/particles/hadrons/ions/src/G4AntiHyperHe5.cc new file mode 100644 index 0000000000..dfef02da95 --- /dev/null +++ b/source/particles/hadrons/ions/src/G4AntiHyperHe5.cc @@ -0,0 +1,122 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4AntiHyperHe5.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ################################################################## +// ### ANTI HYPERHE5 ### +// ################################################################## + +G4AntiHyperHe5* G4AntiHyperHe5::theInstance = nullptr; + + +G4AntiHyperHe5* G4AntiHyperHe5::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "anti_hyperHe5"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 4840.00*MeV, 2.501e-12*MeV, -2.0*eplus, + 3, +1, 0, + 0, 0, 0, + "anti_nucleus", 0, -5, -1010020050, + false, 0.2631*ns, nullptr, + false, "static", 1010020050, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + /* + // The decays "mode[1]" and "mode[3]" produce the secondaries "anti_Li5" and "anti_He5", + // respectively, which are not existing in Geant4: we therefore skip them for the time being + // (similarly for hyperHe5, to keep the symmetry between particle and anti-particle). + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // anti_lambda -> anti_proton + pi+ , with 50% probability of capturing the anti_proton + mode[0] = new G4PhaseSpaceDecayChannel( "anti_hyperHe5", half_br_lambda_to_p_pim, 3, + "anti_alpha", "anti_proton", "pi+" ); + mode[1] = new G4PhaseSpaceDecayChannel( "anti_hyperHe5", half_br_lambda_to_p_pim, 2, + "anti_Li5", "pi+" ); + // anti_lambda -> anti_neutron + pi0 , with 50% probability of capturing the anti_neutron + mode[2] = new G4PhaseSpaceDecayChannel( "anti_hyperHe5", half_br_lambda_to_n_piz, 3, + "anti_alpha", "anti_neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "anti_hyperHe5", half_br_lambda_to_n_piz, 2, + "anti_He5", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + */ + // Replacement decay for the time being + const G4double br_lambda_to_p_pim = 0.639; + const G4double br_lambda_to_n_piz = 0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[2]; + // anti_lambda -> anti_proton + pi+ , with 0% probability of capturing the anti_proton + mode[0] = new G4PhaseSpaceDecayChannel( "anti_hyperHe5", br_lambda_to_p_pim, 3, + "anti_alpha", "anti_proton", "pi+" ); + // anti_lambda -> anti_neutron + pi0 , with 0% probability of capturing the anti_neutron + mode[1] = new G4PhaseSpaceDecayChannel( "anti_hyperHe5", br_lambda_to_n_piz, 3, + "anti_alpha", "anti_neutron", "pi0" ); + for ( G4int index = 0; index < 2; ++index ) table->Insert( mode[index] ); + //--- + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4AntiHyperHe5* >( anInstance ); + return theInstance; +} + + +G4AntiHyperHe5* G4AntiHyperHe5::AntiHyperHe5Definition() { + return Definition(); +} + + +G4AntiHyperHe5* G4AntiHyperHe5::AntiHyperHe5() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4AntiHyperTriton.cc b/source/particles/hadrons/ions/src/G4AntiHyperTriton.cc new file mode 100644 index 0000000000..f6bf033fd1 --- /dev/null +++ b/source/particles/hadrons/ions/src/G4AntiHyperTriton.cc @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4AntiHyperTriton.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ###################################################################### +// ### ANTI HYPERTRITON ### +// ###################################################################### + +G4AntiHyperTriton* G4AntiHyperTriton::theInstance = nullptr; + + +G4AntiHyperTriton* G4AntiHyperTriton::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "anti_hypertriton"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 2991.17*MeV, 2.501e-12*MeV, -1.0*eplus, + 1, +1, 0, + 0, 0, 0, + "anti_nucleus", 0, -3, -1010010030, + false, 0.2631*ns, nullptr, + false, "static", 1010010030, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // anti_lambda -> anti_proton + pi+ , with 50% probability of capturing the anti_proton + mode[0] = new G4PhaseSpaceDecayChannel( "anti_hypertriton", half_br_lambda_to_p_pim, 3, + "anti_deuteron", "anti_proton", "pi+" ); + mode[1] = new G4PhaseSpaceDecayChannel( "anti_hypertriton", half_br_lambda_to_p_pim, 2, + "anti_He3", "pi+" ); + // anti_lambda -> anti_neutron + pi0 , with 50% probability of capturing the anti_neutron + mode[2] = new G4PhaseSpaceDecayChannel( "anti_hypertriton", half_br_lambda_to_n_piz, 3, + "anti_deuteron", "anti_neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "anti_hypertriton", half_br_lambda_to_n_piz, 2, + "anti_triton", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4AntiHyperTriton* >( anInstance ); + return theInstance; +} + + +G4AntiHyperTriton* G4AntiHyperTriton::AntiHyperTritonDefinition() { + return Definition(); +} + + +G4AntiHyperTriton* G4AntiHyperTriton::AntiHyperTriton() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4DoubleHyperDoubleNeutron.cc b/source/particles/hadrons/ions/src/G4DoubleHyperDoubleNeutron.cc new file mode 100644 index 0000000000..5fd2fe7d06 --- /dev/null +++ b/source/particles/hadrons/ions/src/G4DoubleHyperDoubleNeutron.cc @@ -0,0 +1,101 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4DoubleHyperDoubleNeutron.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ###################################################################### +// ### DOUBLEHYPERDOUBLENEUTRON ### +// ###################################################################### + +G4DoubleHyperDoubleNeutron* G4DoubleHyperDoubleNeutron::theInstance = nullptr; + + +G4DoubleHyperDoubleNeutron* G4DoubleHyperDoubleNeutron::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "doublehyperdoubleneutron"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 4110.24*MeV, 2.501e-12*MeV, 0.0*eplus, + 0, +1, 0, + 0, 0, 0, + "nucleus", 0, +4, 1020000040, + false, 0.2631*ns, nullptr, + false, "static", -1020000040, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double br_lambda_to_n_piz = 0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[3]; + // lambda -> proton + pi- , with 50% probability of capturing the proton + mode[0] = new G4PhaseSpaceDecayChannel( "doublehyperdoubleneutron", half_br_lambda_to_p_pim, 5, + "neutron", "neutron", "lambda", "proton", "pi-" ); + mode[1] = new G4PhaseSpaceDecayChannel( "doublehyperdoubleneutron", half_br_lambda_to_p_pim, 2, + "hyperH4", "pi-" ); + // lambda -> neutron + pi0 , without any possibility of capturing the neutron + mode[2] = new G4PhaseSpaceDecayChannel( "doublehyperdoubleneutron", br_lambda_to_n_piz, 5, + "neutron", "neutron", "lambda", "neutron", "pi0" ); + for ( G4int index = 0; index < 3; ++index ) table->Insert( mode[index] ); + } + theInstance = reinterpret_cast< G4DoubleHyperDoubleNeutron* >( anInstance ); + return theInstance; +} + + +G4DoubleHyperDoubleNeutron* G4DoubleHyperDoubleNeutron::DoubleHyperDoubleNeutronDefinition() { + return Definition(); +} + + +G4DoubleHyperDoubleNeutron* G4DoubleHyperDoubleNeutron::DoubleHyperDoubleNeutron() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4DoubleHyperH4.cc b/source/particles/hadrons/ions/src/G4DoubleHyperH4.cc new file mode 100644 index 0000000000..29d5329ada --- /dev/null +++ b/source/particles/hadrons/ions/src/G4DoubleHyperH4.cc @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4DoubleHyperH4.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ############################################################### +// ### DOUBLEHYPERH4 ### +// ############################################################### + +G4DoubleHyperH4* G4DoubleHyperH4::theInstance = nullptr; + + +G4DoubleHyperH4* G4DoubleHyperH4::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "doublehyperH4"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 4106.72*MeV, 2.501e-12*MeV, +1.0*eplus, + 4, +1, 0, + 0, 0, 0, + "nucleus", 0, +4, 1020010040, + false, 0.2631*ns, nullptr, + false, "static", -1020010040, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // lambda -> proton + pi- , with 50% probability of capturing the proton + mode[0] = new G4PhaseSpaceDecayChannel( "doublehyperH4", half_br_lambda_to_p_pim, 3, + "hypertriton", "proton", "pi-" ); + mode[1] = new G4PhaseSpaceDecayChannel( "doublehyperH4", half_br_lambda_to_p_pim, 2, + "hyperalpha", "pi-" ); + // lambda -> neutron + pi0 , with 50% probability of capturing the neutron + mode[2] = new G4PhaseSpaceDecayChannel( "doublehyperH4", half_br_lambda_to_n_piz, 3, + "hypertriton", "neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "doublehyperH4", half_br_lambda_to_n_piz, 2, + "hyperH4", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4DoubleHyperH4* >( anInstance ); + return theInstance; +} + + +G4DoubleHyperH4* G4DoubleHyperH4::DoubleHyperH4Definition() { + return Definition(); +} + + +G4DoubleHyperH4* G4DoubleHyperH4::DoubleHyperH4() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4HyperAlpha.cc b/source/particles/hadrons/ions/src/G4HyperAlpha.cc new file mode 100644 index 0000000000..ccca1b6916 --- /dev/null +++ b/source/particles/hadrons/ions/src/G4HyperAlpha.cc @@ -0,0 +1,124 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4HyperAlpha.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ###################################################################### +// ### HYPERALPHA ### +// ###################################################################### + +G4HyperAlpha* G4HyperAlpha::theInstance = nullptr; + + +G4HyperAlpha* G4HyperAlpha::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "hyperalpha"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 3921.87*MeV, 2.501e-12*MeV, +2.0*eplus, + 0, +1, 0, + 0, 0, 0, + "nucleus", 0, +4, 1010020040, + false, 0.2631*ns, nullptr, + false, "static", -1010020040, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + /* + // The decay "mode[1]" produces the secondary "Li4" whose corresponding anti-particle + // is not existing in Geant4: we therefore skip it for the time being, to keep the + // symmetry with the decays of anti_hyperalpha. + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // lambda -> proton + pi- , with 50% probability of capturing the proton + mode[0] = new G4PhaseSpaceDecayChannel( "hyperalpha", half_br_lambda_to_p_pim, 3, + "He3", "proton", "pi-" ); + mode[1] = new G4PhaseSpaceDecayChannel( "hyperalpha", half_br_lambda_to_p_pim, 2, + "Li4", "pi-" ); + // lambda -> neutron + pi0 , with 50% probability of capturing the neutron + mode[2] = new G4PhaseSpaceDecayChannel( "hyperalpha", half_br_lambda_to_n_piz, 3, + "He3", "neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "hyperalpha", half_br_lambda_to_n_piz, 2, + "alpha", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + */ + // Replacement decay for the time being + const G4double br_lambda_to_p_pim = 0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[3]; + // lambda -> proton + pi- , with 0% probability of capturing the proton + mode[0] = new G4PhaseSpaceDecayChannel( "hyperalpha", br_lambda_to_p_pim, 3, + "He3", "proton", "pi-" ); + // lambda -> neutron + pi0 , with 50% probability of capturing the neutron + mode[1] = new G4PhaseSpaceDecayChannel( "hyperalpha", half_br_lambda_to_n_piz, 3, + "He3", "neutron", "pi0" ); + mode[2] = new G4PhaseSpaceDecayChannel( "hyperalpha", half_br_lambda_to_n_piz, 2, + "alpha", "pi0" ); + for ( G4int index = 0; index < 3; ++index ) table->Insert( mode[index] ); + //--- + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4HyperAlpha* >( anInstance ); + return theInstance; +} + + +G4HyperAlpha* G4HyperAlpha::HyperAlphaDefinition() { + return Definition(); +} + + +G4HyperAlpha* G4HyperAlpha::HyperAlpha() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4HyperH4.cc b/source/particles/hadrons/ions/src/G4HyperH4.cc new file mode 100644 index 0000000000..29b2ceb92a --- /dev/null +++ b/source/particles/hadrons/ions/src/G4HyperH4.cc @@ -0,0 +1,124 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4HyperH4.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ############################################################### +// ### HYPERH4 ### +// ############################################################### + +G4HyperH4* G4HyperH4::theInstance = nullptr; + + +G4HyperH4* G4HyperH4::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "hyperH4"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 3922.40*MeV, 2.501e-12*MeV, +1.0*eplus, + 4, +1, 0, + 0, 0, 0, + "nucleus", 0, +4, 1010010040, + false, 0.2631*ns, nullptr, + false, "static", -1010010040, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + /* + // The decay "mode[3]" produces the secondary "H4" whose corresponding + // anti-particle is not existing in Geant4: we therefore skip it for the time + // being, to keep the symmetry with the decays of anti_hyperH4. + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // lambda -> proton + pi- , with 50% probability of capturing the proton + mode[0] = new G4PhaseSpaceDecayChannel( "hyperH4", half_br_lambda_to_p_pim, 3, + "triton", "proton", "pi-" ); + mode[1] = new G4PhaseSpaceDecayChannel( "hyperH4", half_br_lambda_to_p_pim, 2, + "alpha", "pi-" ); + // lambda -> neutron + pi0 , with 50% probability of capturing the neutron + mode[2] = new G4PhaseSpaceDecayChannel( "hyperH4", half_br_lambda_to_n_piz, 3, + "triton", "neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "hyperH4", half_br_lambda_to_n_piz, 2, + "H4", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + */ + // Replacement decay for the time being + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double br_lambda_to_n_piz = 0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[3]; + // lambda -> proton + pi- , with 50% probability of capturing the proton + mode[0] = new G4PhaseSpaceDecayChannel( "hyperH4", half_br_lambda_to_p_pim, 3, + "triton", "proton", "pi-" ); + mode[1] = new G4PhaseSpaceDecayChannel( "hyperH4", half_br_lambda_to_p_pim, 2, + "alpha", "pi-" ); + // lambda -> neutron + pi0 , with 0% probability of capturing the neutron + mode[2] = new G4PhaseSpaceDecayChannel( "hyperH4", br_lambda_to_n_piz, 3, + "triton", "neutron", "pi0" ); + for ( G4int index = 0; index < 3; ++index ) table->Insert( mode[index] ); + //--- + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4HyperH4* >( anInstance ); + return theInstance; +} + + +G4HyperH4* G4HyperH4::HyperH4Definition() { + return Definition(); +} + + +G4HyperH4* G4HyperH4::HyperH4() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4HyperHe5.cc b/source/particles/hadrons/ions/src/G4HyperHe5.cc new file mode 100644 index 0000000000..45c50f603b --- /dev/null +++ b/source/particles/hadrons/ions/src/G4HyperHe5.cc @@ -0,0 +1,123 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4HyperHe5.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ################################################################### +// ### HYPERHE5 ### +// ################################################################### + +G4HyperHe5* G4HyperHe5::theInstance = nullptr; + + +G4HyperHe5* G4HyperHe5::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "hyperHe5"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 4840.00*MeV, 2.501e-12*MeV, +2.0*eplus, + 3, +1, 0, + 0, 0, 0, + "nucleus", 0, +5, 1010020050, + false, 0.2631*ns, nullptr, + false, "static", -1010020050, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + /* + // The decays "mode[1]" and "mode[3]" produce the secondaries "Li5" and "He5", + // respectively, whose corresponding anti-particles are not existing in Geant4: + // we therefore skip them for the time being, to keep the symmetry with the decays + // of anti_hyperHe5. + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // lambda -> proton + pi- , with 50% probability of capturing the proton + mode[0] = new G4PhaseSpaceDecayChannel( "hyperHe5", half_br_lambda_to_p_pim, 3, + "alpha", "proton", "pi-" ); + mode[1] = new G4PhaseSpaceDecayChannel( "hyperHe5", half_br_lambda_to_p_pim, 2, + "Li5", "pi-" ); + // lambda -> neutron + pi0 , with 50% probability of capturing the neutron + mode[2] = new G4PhaseSpaceDecayChannel( "hyperHe5", half_br_lambda_to_n_piz, 3, + "alpha", "neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "hyperHe5", half_br_lambda_to_n_piz, 2, + "He5", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + */ + // Replacement decay for the time being + const G4double br_lambda_to_p_pim = 0.639; + const G4double br_lambda_to_n_piz = 0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[2]; + // lambda -> proton + pi- , with 0% probability of capturing the proton + mode[0] = new G4PhaseSpaceDecayChannel( "hyperHe5", br_lambda_to_p_pim, 3, + "alpha", "proton", "pi-" ); + // lambda -> neutron + pi0 , with 0% probability of capturing the neutron + mode[1] = new G4PhaseSpaceDecayChannel( "hyperHe5", br_lambda_to_n_piz, 3, + "alpha", "neutron", "pi0" ); + for ( G4int index = 0; index < 2; ++index ) table->Insert( mode[index] ); + //--- + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4HyperHe5* >( anInstance ); + return theInstance; +} + + +G4HyperHe5* G4HyperHe5::HyperHe5Definition() { + return Definition(); +} + + +G4HyperHe5* G4HyperHe5::HyperHe5() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4HyperTriton.cc b/source/particles/hadrons/ions/src/G4HyperTriton.cc new file mode 100644 index 0000000000..a0eadd68bc --- /dev/null +++ b/source/particles/hadrons/ions/src/G4HyperTriton.cc @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Author: 2021 Alberto Ribon +// +//---------------------------------------------------------------------------- + +#include "G4HyperTriton.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4ParticleTable.hh" + +#include "G4PhaseSpaceDecayChannel.hh" +#include "G4DecayTable.hh" + +// ###################################################################### +// ### HYPERTRITON ### +// ###################################################################### + +G4HyperTriton* G4HyperTriton::theInstance = nullptr; + + +G4HyperTriton* G4HyperTriton::Definition() { + if ( theInstance != nullptr ) return theInstance; + const G4String name = "hypertriton"; + // search in particle table + G4ParticleTable* pTable = G4ParticleTable::GetParticleTable(); + G4Ions* anInstance = reinterpret_cast< G4Ions* >( pTable->FindParticle( name ) ); + if ( anInstance == nullptr ) { + // create particle + // + // Arguments for constructor are as follows + // name mass width charge + // 2*spin parity C-conjugation + // 2*Isospin 2*Isospin3 G-parity + // type lepton number baryon number PDG encoding + // stable lifetime decay table + // shortlived subType anti_encoding + // excitation + anInstance = new G4Ions( name, 2991.17*MeV, 2.501e-12*MeV, +1.0*eplus, + 1, +1, 0, + 0, 0, 0, + "nucleus", 0, +3, 1010010030, + false, 0.2631*ns, nullptr, + false, "static", -1010010030, + 0.0, 0 ); + // Magnetic Moment + G4double mN = eplus*hbar_Planck/2.0/(proton_mass_c2 /c_squared); + anInstance->SetPDGMagneticMoment( 2.97896248 * mN ); + + // create Decay Table + G4DecayTable* table = new G4DecayTable; + // create decay channels + const G4double half_br_lambda_to_p_pim = 0.5*0.639; + const G4double half_br_lambda_to_n_piz = 0.5*0.358; + G4VDecayChannel** mode = new G4VDecayChannel*[4]; + // lambda -> proton + pi- , with 50% probability of capturing the proton + mode[0] = new G4PhaseSpaceDecayChannel( "hypertriton", half_br_lambda_to_p_pim, 3, + "deuteron", "proton", "pi-" ); + mode[1] = new G4PhaseSpaceDecayChannel( "hypertriton", half_br_lambda_to_p_pim, 2, + "He3", "pi-" ); + // lambda -> neutron + pi0 , with 50% probability of capturing the neutron + mode[2] = new G4PhaseSpaceDecayChannel( "hypertriton", half_br_lambda_to_n_piz, 3, + "deuteron", "neutron", "pi0" ); + mode[3] = new G4PhaseSpaceDecayChannel( "hypertriton", half_br_lambda_to_n_piz, 2, + "triton", "pi0" ); + for ( G4int index = 0; index < 4; ++index ) table->Insert( mode[index] ); + delete [] mode; + anInstance->SetDecayTable( table ); + } + theInstance = reinterpret_cast< G4HyperTriton* >( anInstance ); + return theInstance; +} + + +G4HyperTriton* G4HyperTriton::HyperTritonDefinition() { + return Definition(); +} + + +G4HyperTriton* G4HyperTriton::HyperTriton() { + return Definition(); +} diff --git a/source/particles/hadrons/ions/src/G4IonConstructor.cc b/source/particles/hadrons/ions/src/G4IonConstructor.cc index fd9179afe1..4d40babffe 100644 --- a/source/particles/hadrons/ions/src/G4IonConstructor.cc +++ b/source/particles/hadrons/ions/src/G4IonConstructor.cc @@ -45,6 +45,20 @@ #include "G4AntiDeuteron.hh" #include "G4AntiTriton.hh" #include "G4AntiHe3.hh" +// Hyper-nuclei +#include "G4DoubleHyperDoubleNeutron.hh" +#include "G4DoubleHyperH4.hh" +#include "G4HyperAlpha.hh" +#include "G4HyperH4.hh" +#include "G4HyperHe5.hh" +#include "G4HyperTriton.hh" +// Anti-hyper-nuclei +#include "G4AntiDoubleHyperDoubleNeutron.hh" +#include "G4AntiDoubleHyperH4.hh" +#include "G4AntiHyperAlpha.hh" +#include "G4AntiHyperH4.hh" +#include "G4AntiHyperHe5.hh" +#include "G4AntiHyperTriton.hh" G4IonConstructor::G4IonConstructor() { @@ -54,10 +68,10 @@ G4IonConstructor::~G4IonConstructor() { } - void G4IonConstructor::ConstructParticle() { ConstructLightIons(); + ConstructHyperNuclei(); } void G4IonConstructor::ConstructLightIons() @@ -76,3 +90,19 @@ void G4IonConstructor::ConstructLightIons() G4GenericIon::GenericIonDefinition(); } +void G4IonConstructor::ConstructHyperNuclei() +{ + G4DoubleHyperDoubleNeutron::DoubleHyperDoubleNeutron(); + G4DoubleHyperH4::DoubleHyperH4(); + G4HyperAlpha::HyperAlpha(); + G4HyperH4::HyperH4(); + G4HyperHe5::HyperHe5(); + G4HyperTriton::HyperTriton(); + + G4AntiDoubleHyperDoubleNeutron::AntiDoubleHyperDoubleNeutron(); + G4AntiDoubleHyperH4::AntiDoubleHyperH4(); + G4AntiHyperAlpha::AntiHyperAlpha(); + G4AntiHyperH4::AntiHyperH4(); + G4AntiHyperHe5::AntiHyperHe5(); + G4AntiHyperTriton::AntiHyperTriton(); +} diff --git a/source/particles/management/include/G4PDefManager.hh b/source/particles/management/include/G4PDefManager.hh index 5b1283b5fc..f7c6914a11 100644 --- a/source/particles/management/include/G4PDefManager.hh +++ b/source/particles/management/include/G4PDefManager.hh @@ -64,6 +64,7 @@ #include "G4AutoLock.hh" class G4ProcessManager; +class G4VTrackingManager; class G4PDefData { @@ -76,6 +77,7 @@ class G4PDefData void initialize(); G4ProcessManager* theProcessManager = nullptr; + G4VTrackingManager* theTrackingManager = nullptr; }; class G4PDefManager diff --git a/source/particles/management/include/G4ParticleDefinition.hh b/source/particles/management/include/G4ParticleDefinition.hh index cd61865833..99daefff6f 100644 --- a/source/particles/management/include/G4ParticleDefinition.hh +++ b/source/particles/management/include/G4ParticleDefinition.hh @@ -53,6 +53,7 @@ class G4ProcessManager; class G4DecayTable; class G4ParticleTable; class G4ParticlePropertyTable; +class G4VTrackingManager; using G4ParticleDefinitionSubInstanceManager = G4PDefManager; @@ -162,6 +163,11 @@ class G4ParticleDefinition // Set/Get Process Manager // !! Process Manager can be modified !! + G4VTrackingManager* GetTrackingManager() const; + void SetTrackingManager(G4VTrackingManager* aTrackingManager); + // Set/Get Tracking Manager; nullptr means the default + // !! Tracking Manager can be modified !! + inline G4ParticleTable* GetParticleTable() const; // Get pointer to the particle table @@ -208,6 +214,21 @@ class G4ParticleDefinition void SetParticleDefinitionID(G4int id=-1); inline G4int GetParticleDefinitionID() const; + inline G4bool IsHypernucleus() const; + inline G4int GetNumberOfLambdasInHypernucleus() const; + inline G4bool IsAntiHypernucleus() const; + inline G4int GetNumberOfAntiLambdasInAntiHypernucleus() const; + // The first two methods return "false" and 0, respectively, + // if the particle is not an hypernucleus; else, they return + // "true" and the number of Lambdas bound in the nucleus. + // Similarly, the last two methods return "false" and 0, + // respectively, if the particle is not an anti-hypernucleus; + // else, they return "true" and the number of anti-Lambdas + // bound in the anti-nucleus. + // Notice that, for the time being, we are assuming that + // (anti-)Lambda is the only type of (anti-)hyperon present + // in all (anti-)hypernuclei. + protected: G4ParticleDefinition(); diff --git a/source/particles/management/include/G4ParticleDefinition.icc b/source/particles/management/include/G4ParticleDefinition.icc index d5aa77d41f..46b2fbb056 100644 --- a/source/particles/management/include/G4ParticleDefinition.icc +++ b/source/particles/management/include/G4ParticleDefinition.icc @@ -212,3 +212,35 @@ G4int G4ParticleDefinition::GetParticleDefinitionID() const { return g4particleDefinitionInstanceID; } + +inline +G4bool G4ParticleDefinition::IsHypernucleus() const +{ + if ( GetNumberOfLambdasInHypernucleus() > 0 ) return true; + return false; +} + +inline +G4int G4ParticleDefinition::GetNumberOfLambdasInHypernucleus() const +{ + // PDG code of hypernuclei: 10LZZZAAAI + G4int numberOfLambdas = 0; + if ( thePDGEncoding > 0 ) numberOfLambdas = (thePDGEncoding/10000000)%100; + return numberOfLambdas; +} + +inline +G4bool G4ParticleDefinition::IsAntiHypernucleus() const +{ + if ( GetNumberOfAntiLambdasInAntiHypernucleus() > 0 ) return true; + return false; +} + +inline +G4int G4ParticleDefinition::GetNumberOfAntiLambdasInAntiHypernucleus() const +{ + // PDG code of anti-hypernuclei: -10LZZZAAAI + G4int numberOfAntiLambdas = 0; + if ( thePDGEncoding < 0 ) numberOfAntiLambdas = (std::abs(thePDGEncoding)/10000000)%100; + return numberOfAntiLambdas; +} diff --git a/source/particles/management/include/G4ParticlePropertyMessenger.hh b/source/particles/management/include/G4ParticlePropertyMessenger.hh index e4b8023461..257d4153e0 100644 --- a/source/particles/management/include/G4ParticlePropertyMessenger.hh +++ b/source/particles/management/include/G4ParticlePropertyMessenger.hh @@ -70,10 +70,7 @@ class G4ParticlePropertyMessenger : public G4UImessenger private: - G4ParticleDefinition* SetCurrentParticle(); - G4ParticleTable* theParticleTable = nullptr; - G4ParticleDefinition* currentParticle = nullptr; G4UIdirectory* thisDirectory = nullptr; G4UIcmdWithoutParameter* dumpCmd = nullptr; diff --git a/source/particles/management/include/G4PhaseSpaceDecayChannel.hh b/source/particles/management/include/G4PhaseSpaceDecayChannel.hh index c4f530ca7e..fa8894ce3e 100644 --- a/source/particles/management/include/G4PhaseSpaceDecayChannel.hh +++ b/source/particles/management/include/G4PhaseSpaceDecayChannel.hh @@ -43,7 +43,7 @@ class G4PhaseSpaceDecayChannel : public G4VDecayChannel { public: - enum { MAX_N_DAUGHTERS=4 }; + enum { MAX_N_DAUGHTERS=5 }; G4PhaseSpaceDecayChannel(G4int Verbose = 1); G4PhaseSpaceDecayChannel(const G4String& theParentName, @@ -52,7 +52,8 @@ class G4PhaseSpaceDecayChannel : public G4VDecayChannel const G4String& theDaughterName1, const G4String& theDaughterName2 = "", const G4String& theDaughterName3 = "", - const G4String& theDaughterName4 = "" ); + const G4String& theDaughterName4 = "", + const G4String& theDaughterName5 = "" ); // Constructors virtual ~G4PhaseSpaceDecayChannel(); diff --git a/source/particles/management/include/G4VDecayChannel.hh b/source/particles/management/include/G4VDecayChannel.hh index 76df21d55b..bd2cf30547 100644 --- a/source/particles/management/include/G4VDecayChannel.hh +++ b/source/particles/management/include/G4VDecayChannel.hh @@ -58,7 +58,8 @@ class G4VDecayChannel const G4String& theDaughterName1, const G4String& theDaughterName2 = "", const G4String& theDaughterName3 = "", - const G4String& theDaughterName4 = "" ); + const G4String& theDaughterName4 = "", + const G4String& theDaughterName5 = "" ); // Constructors virtual ~G4VDecayChannel(); diff --git a/source/particles/management/src/G4DecayTableMessenger.cc b/source/particles/management/src/G4DecayTableMessenger.cc index 4081cf1a03..4920499390 100644 --- a/source/particles/management/src/G4DecayTableMessenger.cc +++ b/source/particles/management/src/G4DecayTableMessenger.cc @@ -189,7 +189,7 @@ G4ParticleDefinition* G4DecayTableMessenger::SetCurrentParticle() G4String G4DecayTableMessenger::GetCurrentValue(G4UIcommand* command) { - G4String returnValue('\0'); + G4String returnValue(1,'\0'); if (SetCurrentParticle() == nullptr) { diff --git a/source/particles/management/src/G4IonTable.cc b/source/particles/management/src/G4IonTable.cc index 83edb1eb09..e696567177 100644 --- a/source/particles/management/src/G4IonTable.cc +++ b/source/particles/management/src/G4IonTable.cc @@ -1357,7 +1357,7 @@ G4bool G4IonTable::IsLightIon(const G4ParticleDefinition* particle) const = { "proton", "alpha", "deuteron", "triton", "He3"}; // Return true if the particle is pre-defined ion - return std::find(names, names+5, particle->GetParticleName())!=names+5; + return std::find(names, names+5, (particle->GetParticleName()).c_str())!=names+5; } // -------------------------------------------------------------------- @@ -1369,7 +1369,7 @@ G4bool G4IonTable::IsLightAntiIon(const G4ParticleDefinition* particle) const = { "anti_proton", "anti_alpha", "anti_deuteron", "anti_triton", "anti_He3"}; // Return true if the particle is pre-defined ion - return std::find(names, names+5, particle->GetParticleName())!=names+5; + return std::find(names, names+5, (particle->GetParticleName()).c_str())!=names+5; } // -------------------------------------------------------------------- diff --git a/source/particles/management/src/G4NuclideTable.cc b/source/particles/management/src/G4NuclideTable.cc index cb806d081f..22f6064d24 100644 --- a/source/particles/management/src/G4NuclideTable.cc +++ b/source/particles/management/src/G4NuclideTable.cc @@ -409,7 +409,7 @@ G4NuclideTable::StripFloatLevelBase( const G4String& sFLB ) G4Exception( "G4NuclideTable", "PART70002", FatalException, text ); } G4Ions::G4FloatLevelBase flb = noFloat; - if ( !(sFLB == '-') ) + if ( !(sFLB == "-") ) { flb = G4Ions::FloatLevelBase( sFLB.back() ); } diff --git a/source/particles/management/src/G4PDefManager.cc b/source/particles/management/src/G4PDefManager.cc index 9d0ac40736..584d43e09e 100644 --- a/source/particles/management/src/G4PDefManager.cc +++ b/source/particles/management/src/G4PDefManager.cc @@ -39,6 +39,7 @@ void G4PDefData::initialize() { theProcessManager = nullptr; + theTrackingManager = nullptr; } G4int& G4PDefManager::slavetotalspace() diff --git a/source/particles/management/src/G4ParticleDefinition.cc b/source/particles/management/src/G4ParticleDefinition.cc index d34510ad98..ffd5cfd609 100644 --- a/source/particles/management/src/G4ParticleDefinition.cc +++ b/source/particles/management/src/G4ParticleDefinition.cc @@ -53,6 +53,7 @@ G4PDefManager G4ParticleDefinition::subInstanceManager; // in the class G4PDefData. // #define G4MT_pmanager ((subInstanceManager.offset()[g4particleDefinitionInstanceID]).theProcessManager) +#define G4MT_tmanager ((subInstanceManager.offset()[g4particleDefinitionInstanceID]).theTrackingManager) // -------------------------------------------------------------------- G4ParticleDefinition::G4ParticleDefinition( @@ -240,6 +241,13 @@ G4ProcessManager* G4ParticleDefinition::GetProcessManager() const return G4MT_pmanager; } +// -------------------------------------------------------------------- +G4VTrackingManager* G4ParticleDefinition::GetTrackingManager() const +{ + if(g4particleDefinitionInstanceID<0) return nullptr; + return G4MT_tmanager; +} + // -------------------------------------------------------------------- G4int G4ParticleDefinition::FillQuarkContents() { @@ -474,3 +482,22 @@ void G4ParticleDefinition::SetProcessManager(G4ProcessManager* aProcessManager) } G4MT_pmanager = aProcessManager; } + +// -------------------------------------------------------------------- +void G4ParticleDefinition::SetTrackingManager(G4VTrackingManager* aTrackingManager) +{ + if(g4particleDefinitionInstanceID<0 && !isGeneralIon) + { + if(G4Threading::G4GetThreadId() >= 0) + { + G4ExceptionDescription ed; + ed << "TrackingManager is being set to " << theParticleName + << " without proper initialization of TLS pointer vector.\n" + << "This operation is thread-unsafe."; + G4Exception("G4ParticleDefintion::SetTrackingManager", + "PART10118", JustWarning, ed); + } + SetParticleDefinitionID(); + } + G4MT_tmanager = aTrackingManager; +} diff --git a/source/particles/management/src/G4ParticlePropertyMessenger.cc b/source/particles/management/src/G4ParticlePropertyMessenger.cc index e6d1f65085..ad938a62b7 100644 --- a/source/particles/management/src/G4ParticlePropertyMessenger.cc +++ b/source/particles/management/src/G4ParticlePropertyMessenger.cc @@ -107,7 +107,10 @@ G4ParticlePropertyMessenger::~G4ParticlePropertyMessenger() void G4ParticlePropertyMessenger:: SetNewValue(G4UIcommand* command, G4String newValue) { - if (SetCurrentParticle() == nullptr) + G4ParticleDefinition* currentParticle + = const_cast(theParticleTable->GetSelectedParticle()); + + if (currentParticle == nullptr) { G4cout << "Particle is not selected yet !! Command ignored." << G4endl; return; @@ -122,7 +125,7 @@ SetNewValue(G4UIcommand* command, G4String newValue) else if (command == lifetimeCmd ) { // Command /particle/property/lifetime - currentParticle->SetPDGLifeTime(lifetimeCmd->GetNewDoubleValue(newValue)); + currentParticle->SetPDGLifeTime(lifetimeCmd->GetNewDoubleValue(newValue)); } else if (command == stableCmd ) @@ -145,39 +148,16 @@ SetNewValue(G4UIcommand* command, G4String newValue) else if( command==verboseCmd ) { // Command /particle/property/Verbose - currentParticle->SetVerboseLevel(verboseCmd->GetNewIntValue(newValue)); + currentParticle->SetVerboseLevel(verboseCmd->GetNewIntValue(newValue)); } } -G4ParticleDefinition* G4ParticlePropertyMessenger::SetCurrentParticle() -{ - // Set currentParticle pointer - - // Get particle name by asking G4ParticleMessenger via UImanager - // - G4String particleName - = G4UImanager::GetUIpointer()->GetCurrentStringValue("/particle/select"); - - if ( currentParticle != nullptr ) - { - // check whether selection is changed - if (currentParticle->GetParticleName() != particleName) - { - currentParticle = theParticleTable->FindParticle(particleName); - } - } - else - { - currentParticle = theParticleTable->FindParticle(particleName); - } - return currentParticle; -} - G4String G4ParticlePropertyMessenger::GetCurrentValue(G4UIcommand* command) { - G4String returnValue('\0'); + G4String returnValue(1,'\0'); - if ( SetCurrentParticle() == nullptr ) + const G4ParticleDefinition* currentParticle = theParticleTable->GetSelectedParticle(); + if ( currentParticle == nullptr ) { return returnValue; // no particle is selected. return null } diff --git a/source/particles/management/src/G4ParticleTable.cc b/source/particles/management/src/G4ParticleTable.cc index 51c7514159..839464f6a2 100644 --- a/source/particles/management/src/G4ParticleTable.cc +++ b/source/particles/management/src/G4ParticleTable.cc @@ -326,7 +326,7 @@ void G4ParticleTable::RemoveAllParticles() G4ParticleDefinition* G4ParticleTable::Insert(G4ParticleDefinition* particle) { // check particle name - if ((particle == nullptr) || (GetKey(particle).isNull())) + if ((particle == nullptr) || (GetKey(particle).empty())) { G4Exception("G4ParticleTable::Insert()", "PART121", FatalException, @@ -602,10 +602,13 @@ G4ParticleDefinition* G4ParticleTable::FindParticle(G4int aPDGEncoding ) G4PTblEncodingDictionary* pedic = fEncodingDictionary; G4ParticleDefinition* particle = nullptr; - G4PTblEncodingDictionary::iterator it = pedic->find(aPDGEncoding ); - if (it != pedic->end()) + if (pedic) { - particle = (*it).second; + G4PTblEncodingDictionary::iterator it = pedic->find(aPDGEncoding ); + if (it != pedic->end()) + { + particle = (*it).second; + } } #ifdef G4MULTITHREADED diff --git a/source/particles/management/src/G4PhaseSpaceDecayChannel.cc b/source/particles/management/src/G4PhaseSpaceDecayChannel.cc index eb50bbec43..25677c6771 100644 --- a/source/particles/management/src/G4PhaseSpaceDecayChannel.cc +++ b/source/particles/management/src/G4PhaseSpaceDecayChannel.cc @@ -51,10 +51,11 @@ G4PhaseSpaceDecayChannel(const G4String& theParentName, const G4String& theDaughterName1, const G4String& theDaughterName2, const G4String& theDaughterName3, - const G4String& theDaughterName4 ) + const G4String& theDaughterName4, + const G4String& theDaughterName5 ) : G4VDecayChannel("Phase Space", theParentName,theBR, theNumberOfDaughters, theDaughterName1, theDaughterName2, - theDaughterName3, theDaughterName4) + theDaughterName3, theDaughterName4, theDaughterName5) { } @@ -586,6 +587,8 @@ G4DecayProducts* G4PhaseSpaceDecayChannel::ManyBodyDecayIt() << " " << daughtermass[2]/GeV << G4endl; G4cout << "Daughter 4:" << G4MT_daughters[3]->GetParticleName() << " " << daughtermass[3]/GeV << G4endl; + G4cout << "Daughter 5:" << G4MT_daughters[4]->GetParticleName() + << " " << daughtermass[4]/GeV << G4endl; } #endif G4Exception("G4PhaseSpaceDecayChannel::ManyBodyDecayIt()", diff --git a/source/particles/management/src/G4VDecayChannel.cc b/source/particles/management/src/G4VDecayChannel.cc index 954618f2fe..9f8ecad29b 100644 --- a/source/particles/management/src/G4VDecayChannel.cc +++ b/source/particles/management/src/G4VDecayChannel.cc @@ -63,7 +63,8 @@ G4VDecayChannel::G4VDecayChannel(const G4String& aName, const G4String& theDaughterName1, const G4String& theDaughterName2, const G4String& theDaughterName3, - const G4String& theDaughterName4 ) + const G4String& theDaughterName4, + const G4String& theDaughterName5 ) : kinematics_name(aName), rbranch(theBR), parent_polarization(), numberOfDaughters(theNumberOfDaughters) { @@ -85,6 +86,7 @@ G4VDecayChannel::G4VDecayChannel(const G4String& aName, if (numberOfDaughters>1) daughters_name[1] = new G4String(theDaughterName2); if (numberOfDaughters>2) daughters_name[2] = new G4String(theDaughterName3); if (numberOfDaughters>3) daughters_name[3] = new G4String(theDaughterName4); + if (numberOfDaughters>4) daughters_name[4] = new G4String(theDaughterName5); if (rbranch <0. ) rbranch = 0.0; else if (rbranch >1.0 ) rbranch = 1.0; diff --git a/source/particles/utils/src/G4HtmlPPReporter.cc b/source/particles/utils/src/G4HtmlPPReporter.cc index 706d9835d1..41b1b5d216 100644 --- a/source/particles/utils/src/G4HtmlPPReporter.cc +++ b/source/particles/utils/src/G4HtmlPPReporter.cc @@ -71,8 +71,8 @@ void G4HtmlPPReporter::SparseOption(const G4String& option) // 1st option : base directory baseDir = savedToken(); - if (!baseDir.isNull()) { - if(baseDir(baseDir.length()-1)!='/') { + if (!baseDir.empty()) { + if(baseDir.back()!='/') { baseDir += "/"; } } diff --git a/source/particles/utils/src/G4TextPPReporter.cc b/source/particles/utils/src/G4TextPPReporter.cc index c0004c3323..3bec4963aa 100644 --- a/source/particles/utils/src/G4TextPPReporter.cc +++ b/source/particles/utils/src/G4TextPPReporter.cc @@ -73,8 +73,8 @@ void G4TextPPReporter::SparseOption(const G4String& option) // 1st option : base directory baseDir = savedToken(); - if (!baseDir.isNull()) { - if(baseDir(baseDir.length()-1)!='/') { + if (!baseDir.empty()) { + if(baseDir.back()!='/') { baseDir += "/"; } } diff --git a/source/particles/utils/src/G4TextPPRetriever.cc b/source/particles/utils/src/G4TextPPRetriever.cc index ca1a03d762..b705930a31 100644 --- a/source/particles/utils/src/G4TextPPRetriever.cc +++ b/source/particles/utils/src/G4TextPPRetriever.cc @@ -79,8 +79,8 @@ void G4TextPPRetriever::SparseOption(const G4String& option) // 1st option : base directory baseDir = savedToken(); - if (!baseDir.isNull()) { - if(baseDir(baseDir.length()-1)!='/') { + if (!baseDir.empty()) { + if(baseDir.back()!='/') { baseDir += "/"; } } diff --git a/source/persistency/History b/source/persistency/History index 7c65eef20e..cf1e3e6c16 100644 --- a/source/persistency/History +++ b/source/persistency/History @@ -15,6 +15,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +25 October, 21 B.Morgan (persistency-V10-07-01) +- Use G4StrUtil functions replacing deprecated G4String member functions + 1 April, 21 B. Morgan (persistency-V10-07-00) - Migrate build to modular CMake API diff --git a/source/persistency/ascii/History b/source/persistency/ascii/History index cac49259ec..276d872713 100644 --- a/source/persistency/ascii/History +++ b/source/persistency/ascii/History @@ -15,6 +15,19 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +22 November 2021 - P. Arce (ascii-V10-07-04) +- Add G4MultiUnion and G4ScaledSolid from user contribution (Pooria Heidary): GitHub PR #28 +- G4tgbVolume.cc: correct lacking conversion degree-radian in polycone +- G4tgbMaterialSimple.cc,G4tgrMaterial.cc: Change STP_Temperature to NTP_Temperature to be consistent with NIST materials + +16 November 2021 - G. Cosmo (ascii-V10-07-03) +- Change prefix to free math functions in G4tgrEvaluator source, to avoid + potential clashes with system functions carrying same name and signature. + Addressing problem report #2444. + +9 July 2021 - V. Ivanchenko (ascii-V10-07-02) +- G4tgbGeometryDumper - fixed access to G4Elements + 1 April 2021 - B. Morgan (ascii-V10-07-01) - Migrate build to modular CMake API diff --git a/source/persistency/ascii/include/G4tgbGeometryDumper.hh b/source/persistency/ascii/include/G4tgbGeometryDumper.hh index 469b0c1826..0d3c6b8918 100644 --- a/source/persistency/ascii/include/G4tgbGeometryDumper.hh +++ b/source/persistency/ascii/include/G4tgbGeometryDumper.hh @@ -71,6 +71,8 @@ class G4tgbGeometryDumper void DumpIsotope(G4Isotope* ele); G4String DumpSolid(G4VSolid* solid, const G4String& extraName = ""); void DumpBooleanVolume(const G4String& solidType, G4VSolid* so); + void DumpMultiUnionVolume( G4VSolid* so); + void DumpScaledVolume( G4VSolid* so); void DumpSolidParams(G4VSolid* so); std::vector GetSolidParams(const G4VSolid* so); void DumpPolySections(G4int zPlanes, G4double* z, G4double* rmin, diff --git a/source/persistency/ascii/include/G4tgrSolidMultiUnion.hh b/source/persistency/ascii/include/G4tgrSolidMultiUnion.hh new file mode 100644 index 0000000000..6b047806ba --- /dev/null +++ b/source/persistency/ascii/include/G4tgrSolidMultiUnion.hh @@ -0,0 +1,103 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// G4tgrSolidMultiUnion +// +// Class description: +// +// A G4tgrSolidMultiUnion is a G4tgrSolid object with a solid made by +// union of more than two(nSolid) solids with respective rotations +// (theRotMat) and positions(thePosition). +// +// Author: P.Heidary, AEOI - November 2021 +// -------------------------------------------------------------------- +#ifndef G4tgrSolidMultiUnion_hh +#define G4tgrSolidMultiUnion_hh 1 + +#include + +#include "globals.hh" +#include "G4tgrSolid.hh" +#include "G4RotationMatrix.hh" +#include "G4Transform3D.hh" + +class G4tgrSolidMultiUnion : public G4tgrSolid +{ + public: + + G4tgrSolidMultiUnion(const std::vector& wl); + ~G4tgrSolidMultiUnion(); + + friend std::ostream& operator<<(std::ostream&, const G4tgrSolidMultiUnion&); + + // Accessors + inline const G4tgrSolid* GetSolid(G4int ii) const; + inline const G4Transform3D GetTransformation(G4int ii) const; + inline G4int GetNSolid() const { return nSolid; }; + + private: + + // Placement and rotation of current solid + G4String theRotMatName; + G4ThreeVector thePosition; + G4RotationMatrix* theRotMat; + G4Transform3D tr1; + G4int nSolid; + + // Vectors of parameters. + std::vector*> theSolidParams; + + // Array to store Solids and Transformations. + std::vector theTransformations; + std::vector theSolids; +}; + +inline const G4tgrSolid* G4tgrSolidMultiUnion::GetSolid(G4int ii) const +{ + if(ii > nSolid) + { + std::ostringstream message; + message << "Only " << nSolid + 1 << " G4tgrSolids are available! " << + " Asking for... " << ii + 1; + G4Exception("G4tgrSolidMultiUnion::GetSolid()", "InvalidInput", FatalException, + message); + } + return theSolids[ii]; +} + +inline const G4Transform3D G4tgrSolidMultiUnion::GetTransformation(G4int ii) const +{ + if(ii > nSolid) + { + std::ostringstream message; + message << "Only " << nSolid + 1 << " G4tgrSolids are available! " << + " Asking for... " << ii + 1; + G4Exception("G4tgrSolidMultiUnion::GetSolid()", "InvalidInput", FatalException, + message); + } + return theTransformations[ii]; +} + +#endif diff --git a/examples/advanced/gammaray_telescope/include/GammaRayTelParticles.hh b/source/persistency/ascii/include/G4tgrSolidScaled.hh similarity index 68% rename from examples/advanced/gammaray_telescope/include/GammaRayTelParticles.hh rename to source/persistency/ascii/include/G4tgrSolidScaled.hh index aca14e4a47..0f9ab421dc 100644 --- a/examples/advanced/gammaray_telescope/include/GammaRayTelParticles.hh +++ b/source/persistency/ascii/include/G4tgrSolidScaled.hh @@ -23,39 +23,45 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ---------------------------------------------------------------------------- -// GEANT 4 - Remsim example -// ---------------------------------------------------------------------------- -// Code developed by: +// G4tgrSolidScaled // -// S. Guatelli(b) -// -// ---------------------------------------------------------------------------- +// Class description: +// +// A G4tgrSolidScaled is a G4tgrSolid object with a solid made by +// scaling another solid(oSolid) by a G4Scale3D vector. +// +// Author: P.Heidary, AEOI - November 2021 +// -------------------------------------------------------------------- -#ifndef GAMMARAYTELPARTICLES_HH -#define GAMMARAYTELPARTICLES_HH 1 +#ifndef G4tgrSolidScaled_hh +#define G4tgrSolidScaled_hh 1 + +#include #include "globals.hh" -#include "G4VPhysicsConstructor.hh" +#include "G4tgrSolid.hh" +#include "G4Transform3D.hh" -class GammaRayTelParticles : public G4VPhysicsConstructor { -public: +class G4tgrSolidScaled : public G4tgrSolid +{ + public: - GammaRayTelParticles(const G4String& name = "particles"); - - virtual ~GammaRayTelParticles(); - - virtual void ConstructParticle(); - - // This method is dummy - virtual void ConstructProcess() {}; + G4tgrSolidScaled(const std::vector& wl); + ~G4tgrSolidScaled(); + + friend std::ostream& operator<<(std::ostream&, const G4tgrSolidScaled&); + + // Accessors + const G4Scale3D GetScale3d() const { return scale3d; } + const G4tgrSolid* GetOrigSolid() const { return origSolid; } + + private: + + // Scale vector + G4Scale3D scale3d; + + // Original solid + G4tgrSolid* origSolid; }; + #endif - - - - - - - - diff --git a/source/persistency/ascii/sources.cmake b/source/persistency/ascii/sources.cmake index 83c4edaa48..fefb3eceb2 100644 --- a/source/persistency/ascii/sources.cmake +++ b/source/persistency/ascii/sources.cmake @@ -50,6 +50,8 @@ geant4_add_module(G4geomtext G4tgrVolumeAssembly.hh G4tgrVolumeDivision.hh G4tgrVolumeMgr.hh + G4tgrSolidMultiUnion.hh + G4tgrSolidScaled.hh SOURCES G4tgbDetectorBuilder.cc G4tgbDetectorConstruction.cc @@ -97,7 +99,9 @@ geant4_add_module(G4geomtext G4tgrVolume.cc G4tgrVolumeAssembly.cc G4tgrVolumeDivision.cc - G4tgrVolumeMgr.cc) + G4tgrVolumeMgr.cc + G4tgrSolidMultiUnion.cc + G4tgrSolidScaled.cc) geant4_module_link_libraries(G4geomtext PUBLIC diff --git a/source/persistency/ascii/src/G4tgbGeometryDumper.cc b/source/persistency/ascii/src/G4tgbGeometryDumper.cc index 318946d787..a64aa81e4b 100644 --- a/source/persistency/ascii/src/G4tgbGeometryDumper.cc +++ b/source/persistency/ascii/src/G4tgbGeometryDumper.cc @@ -58,6 +58,8 @@ #include "G4TwistedTrap.hh" #include "G4TwistedTrd.hh" #include "G4TwistedTubs.hh" +#include "G4MultiUnion.hh" +#include "G4ScaledSolid.hh" #include "G4PVPlacement.hh" #include "G4PVParameterised.hh" #include "G4PVReplica.hh" @@ -505,7 +507,7 @@ G4String G4tgbGeometryDumper::DumpMaterial(G4Material* mat) const G4double* fractions = mat->GetFractionVector(); for(std::size_t ii = 0; ii < numElements; ++ii) { - DumpElement((*elems)[ii]); + DumpElement(const_cast((*elems)[ii])); } (*theFile) << ":MIXT " << AddQuotes(mateName) << " " << density << " " @@ -513,7 +515,7 @@ G4String G4tgbGeometryDumper::DumpMaterial(G4Material* mat) // close start element tag and get ready to do composit "parts" for(std::size_t ii = 0; ii < numElements; ++ii) { - (*theFile) << " " << AddQuotes(GetObjectName((*elems)[ii], theElements)) + (*theFile) << " " << AddQuotes(GetObjectName(const_cast((*elems)[ii]), theElements)) << " " << fractions[ii] << G4endl; } } @@ -637,7 +639,7 @@ G4String G4tgbGeometryDumper::DumpSolid(G4VSolid* solid, G4String solidType = solid->GetEntityType(); solidType = GetTGSolidType(solidType); - + if(solidType == "UNIONSOLID") { DumpBooleanVolume("UNION", solid); @@ -662,11 +664,19 @@ G4String G4tgbGeometryDumper::DumpSolid(G4VSolid* solid, G4VSolid* solidori = solidrefl->GetConstituentMovedSolid(); DumpSolid(solidori); } + else if(solidType == "MULTIUNION") + { + DumpMultiUnionVolume(solid); + } + else if(solidType == "SCALEDSOLID") + { + DumpScaledVolume(solid); + } else { (*theFile) << ":SOLID " << AddQuotes(solidName) << " "; (*theFile) << AddQuotes(solidType) << " "; - DumpSolidParams(solid); + DumpSolidParams( solid ); theSolids[solidName] = solid; } @@ -730,6 +740,57 @@ void G4tgbGeometryDumper::DumpBooleanVolume(const G4String& solidType, theSolids[bsoName] = bso; } +// -------------------------------------------------------------------- +void G4tgbGeometryDumper::DumpMultiUnionVolume( G4VSolid* so) +{ + const G4MultiUnion* muun = dynamic_cast(so); + if(muun != nullptr) + { + G4int nSolids = muun->GetNumberOfSolids(); + std::vector rotList; + for( G4int iso = 0; iso < nSolids; iso++ ) { + G4Transform3D trans = muun->GetTransformation(iso); + G4String rotName = DumpRotationMatrix( new G4RotationMatrix(trans.getRotation())); + rotList.push_back(rotName); + G4VSolid* solN = muun->GetSolid(iso); + DumpSolid(solN); + } + G4String bsoName = GetObjectName(const_cast(so), theSolids); + (*theFile) << ":SOLID " << AddQuotes(bsoName) << " MULTIUNION " + << nSolids; + + for( G4int iso = 0; iso < nSolids; iso++ ) { + G4VSolid* solN = muun->GetSolid(iso); + G4Transform3D trans = muun->GetTransformation(iso); + G4ThreeVector pos = trans.getTranslation(); // translation is of mother frame + (*theFile) << " " << solN->GetName() + << " " << " " << rotList[iso] + << " " << approxTo0(pos.x()) + << " " << approxTo0(pos.y()) + << " " << approxTo0(pos.z()); + } + (*theFile) << G4endl; + + } +} + +// -------------------------------------------------------------------- +void G4tgbGeometryDumper::DumpScaledVolume( G4VSolid* so) +{ + const G4ScaledSolid* ssol = dynamic_cast(so); + if(ssol != nullptr) + { + G4VSolid* unscaledSolid = ssol->GetUnscaledSolid(); + G4Scale3D scaleTransf = ssol->GetScaleTransform(); + G4String bsoName = GetObjectName(const_cast(so), theSolids); + (*theFile) << ":SOLID " << AddQuotes(bsoName) << " SCALED " + << unscaledSolid->GetName() << " " + << scaleTransf.xx() << " " + << scaleTransf.yy() << " " + << scaleTransf.zz() << G4endl; + } +} + // -------------------------------------------------------------------- void G4tgbGeometryDumper::DumpSolidParams(G4VSolid* so) { @@ -875,9 +936,15 @@ std::vector G4tgbGeometryDumper::GetSolidParams(const G4VSolid* so) { angphi -= 360 * deg; } - G4int ncor = plc->GetNumRZCorner(); + G4double endphi = plc->GetEndPhi() / deg; + if(endphi > 180 * deg) + { + endphi -= 360 * deg; + } params.push_back(angphi); - params.push_back(plc->GetOriginalParameters()->Opening_angle / deg); + params.push_back(endphi - angphi); + // params.push_back(plc->GetOriginalParameters()->Opening_angle / deg); + G4int ncor = plc->GetNumRZCorner(); params.push_back(ncor); for(G4int ii = 0; ii < ncor; ++ii) @@ -903,9 +970,9 @@ std::vector G4tgbGeometryDumper::GetSolidParams(const G4VSolid* so) { endphi -= 360 * deg; } - G4int ncor = plc->GetNumRZCorner(); params.push_back(angphi); params.push_back(endphi - angphi); + G4int ncor = plc->GetNumRZCorner(); params.push_back(ncor); for(G4int ii = 0; ii < ncor; ++ii) @@ -1043,7 +1110,7 @@ std::vector G4tgbGeometryDumper::GetSolidParams(const G4VSolid* so) else { G4String ErrMessage = "Solid type not supported, sorry... " + solidType; - G4Exception("G4tgbGeometryDumpe::DumpSolidParams()", "NotImplemented", + G4Exception("G4tgbGeometryDumper::DumpSolidParams()", "NotImplemented", FatalException, ErrMessage); } diff --git a/source/persistency/ascii/src/G4tgbMaterialSimple.cc b/source/persistency/ascii/src/G4tgbMaterialSimple.cc index 2ffab205e3..67a0d6a5a4 100644 --- a/source/persistency/ascii/src/G4tgbMaterialSimple.cc +++ b/source/persistency/ascii/src/G4tgbMaterialSimple.cc @@ -60,7 +60,7 @@ G4Material* G4tgbMaterialSimple::BuildG4Material() G4Material* mate = new G4Material(GetName(), GetZ(), GetA(), theTgrMate->GetDensity(), - kStateUndefined, STP_Temperature); + kStateUndefined, NTP_Temperature); #ifdef G4VERBOSE if(G4tgrMessenger::GetVerboseLevel() >= 2) diff --git a/source/persistency/ascii/src/G4tgbVolume.cc b/source/persistency/ascii/src/G4tgbVolume.cc index a43e5a3337..730984ce39 100644 --- a/source/persistency/ascii/src/G4tgbVolume.cc +++ b/source/persistency/ascii/src/G4tgbVolume.cc @@ -39,6 +39,8 @@ #include "G4tgrSolid.hh" #include "G4tgrSolidBoolean.hh" +#include "G4tgrSolidMultiUnion.hh" +#include "G4tgrSolidScaled.hh" #include "G4tgrVolume.hh" #include "G4tgrVolumeDivision.hh" #include "G4tgrVolumeAssembly.hh" @@ -53,6 +55,8 @@ #include "G4UnionSolid.hh" #include "G4SubtractionSolid.hh" #include "G4IntersectionSolid.hh" +#include "G4MultiUnion.hh" +#include "G4ScaledSolid.hh" #include "G4LogicalVolume.hh" #include "G4VPhysicalVolume.hh" #include "G4PVPlacement.hh" @@ -355,7 +359,8 @@ G4VSolid* G4tgbVolume::FindOrConstructG4Solid(const G4tgrSolid* sol) solid = new G4Torus(sname, solParam[0], solParam[1], solParam[2], solParam[3], phiDelta); } - else if(stype == "POLYCONE") + else if(stype == "POLYCONE" + || stype == "GENERICPOLYCONE") { std::size_t nplanes = std::size_t(solParam[2]); G4bool genericPoly = false; @@ -399,7 +404,7 @@ G4VSolid* G4tgbVolume::FindOrConstructG4Solid(const G4tgrSolid* sol) { phiTotal = twopi; } - solid = new G4Polycone(sname, solParam[0], phiTotal, // start,delta-phi + solid = new G4Polycone(sname, solParam[0], phiTotal*deg, // start,delta-phi nplanes, // sections &((*z_p)[0]), &((*rmin_p)[0]), &((*rmax_p)[0])); } @@ -418,7 +423,7 @@ G4VSolid* G4tgbVolume::FindOrConstructG4Solid(const G4tgrSolid* sol) phiTotal = twopi; } solid = - new G4GenericPolycone(sname, solParam[0], phiTotal, // start,delta-phi + new G4GenericPolycone(sname, solParam[0], phiTotal*deg, // start,delta-phi nplanes, // sections &((*R_c)[0]), &((*Z_c)[0])); } @@ -540,6 +545,19 @@ G4VSolid* G4tgbVolume::FindOrConstructG4Solid(const G4tgrSolid* sol) CheckNoSolidParams(stype, 6, solParam.size()); solid = new G4TwistedTrd(sname, solParam[0], solParam[1], solParam[2], solParam[3], solParam[4], solParam[5]); + } + else if(stype == "SCALED") + { + const G4tgrSolidScaled* tgrSol = dynamic_cast(sol); + if(tgrSol == nullptr) + { + G4Exception("G4tgbVolume::FindOrConstructG4Solid()", "InvalidSetup", + FatalException, "Invalid Solid pointer"); + return nullptr; + } + G4VSolid* sol0 = FindOrConstructG4Solid(tgrSol->GetOrigSolid()); + G4Scale3D scale = tgrSol->GetScale3d(); + solid = new G4ScaledSolid(sname, sol0, scale); } else if(stype == "TWISTEDTUBS") { @@ -715,6 +733,30 @@ G4VSolid* G4tgbVolume::FindOrConstructG4Solid(const G4tgrSolid* sol) return nullptr; } } + else if(stype == "MULTIUNION") + { + const G4tgrSolidMultiUnion* tgrSol = dynamic_cast(sol); + if(tgrSol == nullptr) + { + G4Exception("G4tgbVolume::FindOrConstructG4Solid()", "InvalidSetup", + FatalException, "Invalid Solid pointer"); + return nullptr; + } + + G4int nsol = tgrSol->GetNSolid(); + G4VSolid* soli; + G4Transform3D tri; + G4MultiUnion* solidu = new G4MultiUnion(sname); + + for (G4int i=0; iGetSolid(i)); + tri = tgrSol->GetTransformation(i); + solidu->AddNode(*soli, tri); + } + solidu->Voxelize(); + solid = dynamic_cast(solidu); + } else { G4String ErrMessage = diff --git a/source/persistency/ascii/src/G4tgrEvaluator.cc b/source/persistency/ascii/src/G4tgrEvaluator.cc index 3e0e7de7a8..54897038a7 100644 --- a/source/persistency/ascii/src/G4tgrEvaluator.cc +++ b/source/persistency/ascii/src/G4tgrEvaluator.cc @@ -57,44 +57,44 @@ void G4tgrEvaluator::print_error(G4int estatus) const } } -G4double fsin(G4double arg) { return std::sin(arg); } -G4double fcos(G4double arg) { return std::cos(arg); } -G4double ftan(G4double arg) { return std::tan(arg); } -G4double fasin(G4double arg) { return std::asin(arg); } -G4double facos(G4double arg) { return std::acos(arg); } -G4double fatan(G4double arg) { return std::atan(arg); } -G4double fatan2(G4double arg1, G4double arg2) { return std::atan2(arg1, arg2); } -G4double fsinh(G4double arg) { return std::sinh(arg); } -G4double fcosh(G4double arg) { return std::cosh(arg); } -G4double ftanh(G4double arg) { return std::tanh(arg); } -// G4double fasinh( G4double arg ){ return std::asinh(arg); } -// G4double facosh( G4double arg ){ return std::acosh(arg); } -// G4double fatanh( G4double arg ){ return std::atanh(arg); } -G4double fsqrt(G4double arg) { return std::sqrt(arg); } -G4double fexp(G4double arg) { return std::exp(arg); } -G4double flog(G4double arg) { return std::log(arg); } -G4double flog10(G4double arg) { return std::log10(arg); } -G4double fpow(G4double arg1, G4double arg2) { return std::pow(arg1, arg2); } +G4double fltsin(G4double arg) { return std::sin(arg); } +G4double fltcos(G4double arg) { return std::cos(arg); } +G4double flttan(G4double arg) { return std::tan(arg); } +G4double fltasin(G4double arg) { return std::asin(arg); } +G4double fltacos(G4double arg) { return std::acos(arg); } +G4double fltatan(G4double arg) { return std::atan(arg); } +G4double fltatan2(G4double arg1, G4double arg2) { return std::atan2(arg1, arg2); } +G4double fltsinh(G4double arg) { return std::sinh(arg); } +G4double fltcosh(G4double arg) { return std::cosh(arg); } +G4double flttanh(G4double arg) { return std::tanh(arg); } +// G4double fltasinh( G4double arg ){ return std::asinh(arg); } +// G4double fltacosh( G4double arg ){ return std::acosh(arg); } +// G4double fltatanh( G4double arg ){ return std::atanh(arg); } +G4double fltsqrt(G4double arg) { return std::sqrt(arg); } +G4double fltexp(G4double arg) { return std::exp(arg); } +G4double fltlog(G4double arg) { return std::log(arg); } +G4double fltlog10(G4double arg) { return std::log10(arg); } +G4double fltpow(G4double arg1, G4double arg2) { return std::pow(arg1, arg2); } // -------------------------------------------------------------------- void G4tgrEvaluator::AddCommonFunctions() { - setFunction("sin", (*fsin)); - setFunction("cos", (*fcos)); - setFunction("tan", (*ftan)); - setFunction("asin", (*fasin)); - setFunction("acos", (*facos)); - setFunction("atan", (*fatan)); - setFunction("atan2", (*fatan2)); - setFunction("sinh", (*fsinh)); - setFunction("cosh", (*fcosh)); - setFunction("tanh", (*ftanh)); - // setFunction("asinh", (*fasinh)); - // setFunction("acosh", (*facosh)); - // setFunction("atanh", (*fatanh)); - setFunction("sqrt", (*fsqrt)); - setFunction("exp", (*fexp)); - setFunction("log", (*flog)); - setFunction("log10", (*flog10)); - setFunction("pow", (*fpow)); + setFunction("sin", (*fltsin)); + setFunction("cos", (*fltcos)); + setFunction("tan", (*flttan)); + setFunction("asin", (*fltasin)); + setFunction("acos", (*fltacos)); + setFunction("atan", (*fltatan)); + setFunction("atan2", (*fltatan2)); + setFunction("sinh", (*fltsinh)); + setFunction("cosh", (*fltcosh)); + setFunction("tanh", (*flttanh)); + // setFunction("asinh", (*fltasinh)); + // setFunction("acosh", (*fltacosh)); + // setFunction("atanh", (*fltatanh)); + setFunction("sqrt", (*fltsqrt)); + setFunction("exp", (*fltexp)); + setFunction("log", (*fltlog)); + setFunction("log10", (*fltlog10)); + setFunction("pow", (*fltpow)); } diff --git a/source/persistency/ascii/src/G4tgrMaterial.cc b/source/persistency/ascii/src/G4tgrMaterial.cc index 6eb1907b41..9cd34cb5fc 100644 --- a/source/persistency/ascii/src/G4tgrMaterial.cc +++ b/source/persistency/ascii/src/G4tgrMaterial.cc @@ -33,7 +33,7 @@ // -------------------------------------------------------------------- G4tgrMaterial::G4tgrMaterial() - : theTemperature(STP_Temperature) + : theTemperature(NTP_Temperature) , thePressure(STP_Pressure) { } diff --git a/source/persistency/ascii/src/G4tgrSolidMultiUnion.cc b/source/persistency/ascii/src/G4tgrSolidMultiUnion.cc new file mode 100644 index 0000000000..f83a94c3b4 --- /dev/null +++ b/source/persistency/ascii/src/G4tgrSolidMultiUnion.cc @@ -0,0 +1,126 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// G4tgrSolidMultiUnion implementation +// +// Author: P.Heidary, AEOI - November 2021 +// -------------------------------------------------------------------- + +#include "G4tgrSolidMultiUnion.hh" +#include "G4tgrUtils.hh" +#include "G4tgrVolume.hh" +#include "G4tgrVolumeMgr.hh" +#include "G4tgrMessenger.hh" +#include "G4tgbRotationMatrixMgr.hh" + +// -------------------------------------------------------------------- +G4tgrSolidMultiUnion::G4tgrSolidMultiUnion(const std::vector& wl) +{ + // :SOLID/:VOLU SOL MULTIUNION NSOL SOL1 ROTM1 POSX1 POSY1 POSZ1 + // SOL2 ROTM2 POSX2 POSY2 POSZ2 ... + + //---------- Set name + theName = G4tgrUtils::GetString(wl[1]); + nSolid = G4tgrUtils::GetInt(wl[3]); + G4tgrVolumeMgr* volmgr = G4tgrVolumeMgr::GetInstance(); + const G4tgrSolid* sol1; + + if(G4int(wl.size()) != 4 + 5*nSolid) + { + G4String Err1 = "Solid type MULTIUNION with "; + G4String Err2 = std::to_string(nSolid); + G4String Err3 = " Solids, should have "; + G4String Err4 = std::to_string(4 + 5*nSolid); + G4String Err5 = " parameters."; + G4String Err6 = " It has "+G4UIcommand::ConvertToString(int(wl.size())); + + G4String ErrMessage = Err1 + Err2 + Err3 + Err4 + Err5 + Err6; + + G4tgrUtils::DumpVS(wl, "G4tgrSolidMultiUnion::G4tgrSolidMultiUnion()"); + G4Exception("G4tgrSolidMultiUnion::G4tgrSolidMultiUnion()", "InvalidInput", + FatalException, ErrMessage); + } + + for (G4int i = 4; i< nSolid*5; i+=5) + { + sol1 = volmgr->FindSolid(G4tgrUtils::GetString(wl[i])); + if(sol1 == nullptr) + { + sol1 = volmgr->FindVolume(G4tgrUtils::GetString(wl[i]), 1)->GetSolid(); + } + theSolids.push_back(sol1); + + //---------- Populate transformation matrix + theRotMatName = G4tgrUtils::GetString(wl[i + 1]); + theRotMat = + G4tgbRotationMatrixMgr::GetInstance()->FindOrBuildG4RotMatrix(theRotMatName); + thePosition = + G4ThreeVector(G4tgrUtils::GetDouble(wl[i+2]), + G4tgrUtils::GetDouble(wl[i+3]), + G4tgrUtils::GetDouble(wl[i+4])); + tr1 = G4Transform3D(*theRotMat, thePosition); + theTransformations.push_back(tr1); + } + + // ---------- Set solid type + G4String wl2 = wl[2]; + for(std::size_t ii = 0; ii < wl2.length(); ++ii) + { + wl2[ii] = toupper(wl2[ii]); + } + theType = wl2; + +#ifdef G4VERBOSE + if(G4tgrMessenger::GetVerboseLevel() >= 1) + { + G4cout << " Created " << *this << G4endl; + } +#endif + + G4tgrVolumeMgr::GetInstance()->RegisterMe(this); +} + +// -------------------------------------------------------------------- +G4tgrSolidMultiUnion::~G4tgrSolidMultiUnion() +{ +} + +// -------------------------------------------------------------------- +std::ostream& operator<<(std::ostream& os, const G4tgrSolidMultiUnion& sol) +{ + os << "G4tgrSolidMultiUnion= " << sol.theName << " of type " << sol.theType + << " PARAMS: "; + if(sol.theSolidParams.size() != 0) + { + std::vector solpar = *(sol.theSolidParams[0]); + for(std::size_t ii = 0; ii < solpar.size(); ++ii) + { + os << solpar[ii] << " "; + } + } + os << G4endl; + + return os; +} diff --git a/source/persistency/ascii/src/G4tgrSolidScaled.cc b/source/persistency/ascii/src/G4tgrSolidScaled.cc new file mode 100644 index 0000000000..0ae6460b14 --- /dev/null +++ b/source/persistency/ascii/src/G4tgrSolidScaled.cc @@ -0,0 +1,94 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// G4tgrSolidScaled implementation +// +// Author: P.Heidary, AEOI - November 2021 +// -------------------------------------------------------------------- + +#include "G4tgrSolidScaled.hh" +#include "G4tgrUtils.hh" +#include "G4tgrVolume.hh" +#include "G4tgrVolumeMgr.hh" +#include "G4tgrMessenger.hh" + +// -------------------------------------------------------------------- +G4tgrSolidScaled::G4tgrSolidScaled(const std::vector& wl) +{ + // :SOLID/:VOLU SOL1 SCALED SOL0 SCLAEX SCALEY SCALEZ + if(wl.size() != 7) + { + G4tgrUtils::DumpVS(wl, "G4tgrSolidScaled::G4tgrSolidScaled()"); + G4Exception("G4tgrSolidScaled::G4tgrSolidScaled()", "InvalidInput", + FatalException, "Line read with less or more than 7 words."); + } + + //---------- Set name + theName = G4tgrUtils::GetString(wl[1]); + + G4tgrVolumeMgr* volmgr = G4tgrVolumeMgr::GetInstance(); + origSolid = volmgr->FindSolid(G4tgrUtils::GetString(wl[3])); + if(origSolid == nullptr) + { + origSolid = volmgr->FindVolume(G4tgrUtils::GetString(wl[3]), 1)->GetSolid(); + } + + //---------- Set scale vector + scale3d = G4Scale3D(G4tgrUtils::GetDouble(wl[4]), G4tgrUtils::GetDouble(wl[5]), + G4tgrUtils::GetDouble(wl[6])); + + //---------- Set solid type + G4String wl2 = wl[2]; + for(std::size_t ii = 0; ii < wl2.length(); ++ii) + { + wl2[ii] = toupper(wl2[ii]); + } + theType = wl2; + +#ifdef G4VERBOSE + if(G4tgrMessenger::GetVerboseLevel() >= 1) + { + G4cout << " Created " << *this << G4endl; + } +#endif + + G4tgrVolumeMgr::GetInstance()->RegisterMe(this); +} + +// -------------------------------------------------------------------- +G4tgrSolidScaled::~G4tgrSolidScaled() +{ +} + +// -------------------------------------------------------------------- +std::ostream& operator<<(std::ostream& os, const G4tgrSolidScaled& sol) +{ + os << "G4tgrSolidScaled= " << sol.theName << " of type " << sol.theType + << " original solid: " << sol.origSolid->GetName() << " Scale x: " << + sol.scale3d.xx() << " Scale y: " << sol.scale3d.yy() << + " Scale z: " << sol.scale3d.zz() << G4endl; + + return os; +} diff --git a/source/persistency/ascii/src/G4tgrUtils.cc b/source/persistency/ascii/src/G4tgrUtils.cc index 1196fda7e8..d89732a42c 100644 --- a/source/persistency/ascii/src/G4tgrUtils.cc +++ b/source/persistency/ascii/src/G4tgrUtils.cc @@ -249,7 +249,7 @@ G4double G4tgrUtils::GetDouble(const G4String& str, G4double unitval) // Check if it is not an exponential // if((ii < 2) || ((cstr[ii - 1] != 'E') && (cstr[ii - 1] != 'e')) || - !IsNumber(cstr[ii - 2])) + !IsNumber(G4String(1,cstr[ii - 2]))) { separators.insert(ii); } diff --git a/source/persistency/ascii/src/G4tgrVolumeMgr.cc b/source/persistency/ascii/src/G4tgrVolumeMgr.cc index 5a03f779c2..7da2b01474 100644 --- a/source/persistency/ascii/src/G4tgrVolumeMgr.cc +++ b/source/persistency/ascii/src/G4tgrVolumeMgr.cc @@ -36,6 +36,8 @@ #include "G4tgrMessenger.hh" #include "G4tgrSolid.hh" #include "G4tgrSolidBoolean.hh" +#include "G4tgrSolidMultiUnion.hh" +#include "G4tgrSolidScaled.hh" G4ThreadLocal G4tgrVolumeMgr* G4tgrVolumeMgr::theInstance = nullptr; @@ -89,6 +91,16 @@ G4tgrSolid* G4tgrVolumeMgr::CreateSolid(const std::vector& wl, //---------- Create G4tgrSolidBoolean and fill the solid params sol = new G4tgrSolidBoolean(wlc); } + else if(wl2 == "SCALED") + { + //---------- Create G4tgrSolidScaled and fill the solid params + sol = new G4tgrSolidScaled(wlc); + } + else if(wl2 == "MULTIUNION") + { + //---------- Create G4tgrSolidMultiUnion and fill the solid params + sol = new G4tgrSolidMultiUnion(wlc); + } else { //---------- Create G4tgrSolidSimple and fill the solid params diff --git a/source/persistency/gdml/History b/source/persistency/gdml/History index 074d5c25a8..94bd247182 100644 --- a/source/persistency/gdml/History +++ b/source/persistency/gdml/History @@ -16,6 +16,41 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +05 November 2021 G. Cosmo (gdml-V10-07-15) +- G4GDMLParser: issue notification warning in ImportRegions() in case + more than one logical volume with same name is found, to be set a + root logical volume for a region. + +02 November 2021 G. Cosmo (gdml-V10-07-14) +- G4GDMLParser: scan for all possible logical volumes with same name in + ImportRegions() and set them as root logical volumes. + +13 October 2021 D. Sawkey (gdml-V10-07-13) +- G4GDMLWriteMaterials, G4GDMLWriteSolids: G4MaterialProperties table now + returns references to vectors, rather than maps that had to be allocated + on the heap. Adjust code to iterate over the vectors. + +30 September 2021 G. Cosmo (gdml-V10-07-12) +- G4GDMLWriteMaterials, G4GDMLWriteSolids: fixed leaks introduced with recent + changes to G4MaterialPropertiesTable, where now maps are returned allocated + on the heap, leaving ownership to clients... + +15 September 2021 G. Cosmo (gdml-V10-07-11) +- G4GDMLWriteStructure: added fatal exception in AssemblyWrite() for the case + of nested assemblies, not yet supported for exporting. + +13 September 2021 D. Sawkey (gdml-V10-07-10) +- G4GDMLReadMaterials, G4GDMLReadSolids: add parameter createNewKey=true to + G4Material[Const]PropertiesTable::AddProperty() + +17 August 2021 G. Cosmo (gdml-V10-07-09) +- G4GDMLRead: added missing update to internal maps for solids and volumes + stores, after stripping of names execution. Addressing problem report #2403. + +13 July 2021 G. Cosmo (gdml-V10-07-08) +- G4GDMLParser: added utility method to retrieve a generic physical volume + by its name. + 21 May 2021 G. Cosmo (gdml-V10-07-07) - G4GDMLReadSolids: updated optical surface properties based on relatively recent introduction of DAVIS interface. @@ -34,7 +69,7 @@ committal in the CVS repository ! 16 March 2021 Witek Pokorski (gdml-V10-07-03) - Solves the problem #2342 of multiUnion and assembly write creating degenerated names - (position, rotation and nodes). Fix provided by Laurie Nevay. + (position, rotation and nodes). Fix provided by Laurie Nevay. 4 March 2021 Witek Pokorski (gdml-V10-07-02) - Removed the hardcoded size 10000 in G4GDMLWrite causing the values in GDML truncated. @@ -69,7 +104,7 @@ committal in the CVS repository ! - Some code cleanup and formatting in G4GDMLWriteStructure source. 21 February 2020 Witek Pokorski (gdml-V10-06-01) -- Fixed writting out and reading in of const properties of material. +- Fixed writing out and reading in of const properties of material. 11 December 2019 Ben Morgan (gdml-V10-06-00) - Cleanup CMake build, removing obsolete granular library options and @@ -91,7 +126,7 @@ committal in the CVS repository ! 2 May 2019 Witek Pokorski (gdml-V10-05-04) - Improvement in the optical properties reader allowing to reuse the same -G4MaterialPropertyVector object for identical properties. + G4MaterialPropertyVector object for identical properties. 12 April 2019 Witek Pokorski (gdml-V10-05-03) - Fixes to BorderSurface and OpticalSurface writer provided by Binbin Qi. diff --git a/source/persistency/gdml/include/G4GDMLParser.hh b/source/persistency/gdml/include/G4GDMLParser.hh index 622a272128..a258bfbe45 100644 --- a/source/persistency/gdml/include/G4GDMLParser.hh +++ b/source/persistency/gdml/include/G4GDMLParser.hh @@ -110,6 +110,7 @@ class G4GDMLParser inline G4ThreeVector GetScale(const G4String& name) const; inline G4GDMLMatrix GetMatrix(const G4String& name) const; inline G4LogicalVolume* GetVolume(const G4String& name) const; + inline G4VPhysicalVolume* GetPhysVolume(const G4String& name) const; inline G4VPhysicalVolume* GetWorldVolume(const G4String& setupName = "Default") const; inline G4GDMLAuxListType diff --git a/source/persistency/gdml/include/G4GDMLParser.icc b/source/persistency/gdml/include/G4GDMLParser.icc index b0552adf0b..129aeb69a3 100644 --- a/source/persistency/gdml/include/G4GDMLParser.icc +++ b/source/persistency/gdml/include/G4GDMLParser.icc @@ -166,6 +166,12 @@ inline G4LogicalVolume* G4GDMLParser::GetVolume(const G4String& name) const return reader->GetVolume(name); } +inline G4VPhysicalVolume* +G4GDMLParser::GetPhysVolume(const G4String& name) const +{ + return reader->GetPhysvol(name); +} + inline G4VPhysicalVolume* G4GDMLParser::GetWorldVolume(const G4String& setupName) const { diff --git a/source/persistency/gdml/src/G4GDMLParser.cc b/source/persistency/gdml/src/G4GDMLParser.cc index a52284c848..239f34b07d 100644 --- a/source/persistency/gdml/src/G4GDMLParser.cc +++ b/source/persistency/gdml/src/G4GDMLParser.cc @@ -105,7 +105,7 @@ void G4GDMLParser::ImportRegions() { reader->StripName(name); } - if(name.contains("DefaultRegionForTheWorld")) + if(G4StrUtil::contains(name, "DefaultRegionForTheWorld")) continue; if(!iaux->auxList) @@ -129,11 +129,43 @@ void G4GDMLParser::ImportRegions() { reader->StripName(volname); } - G4LogicalVolume* lvol = - G4LogicalVolumeStore::GetInstance()->GetVolume(volname); - aRegion->AddRootLogicalVolume(lvol); - if(reflFactory->IsConstituent(lvol)) - aRegion->AddRootLogicalVolume(reflFactory->GetReflectedLV(lvol)); + G4LogicalVolumeStore* store = G4LogicalVolumeStore::GetInstance(); + auto pos = store->GetMap().find(volname); + if(pos != store->GetMap().cend()) + { + // Scan for all possible volumes with same name + // and set them as root logical volumes for the region... + // Issue a notification in case more than one logical volume + // with same name exist and get set. + // + if (pos->second.size()>1) + { + std::ostringstream message; + message << "There exists more than ONE logical volume " + << "in store named: " << volname << "." << G4endl + << "NOTE: assigning all such volumes as root logical " + << "volumes for region: " << name << "!"; + G4Exception("G4GDMLParser::ImportRegions()", + "Notification", JustWarning, message); + } + for (auto vpos = pos->second.cbegin(); + vpos != pos->second.cend(); ++vpos) + { + aRegion->AddRootLogicalVolume(*vpos); + if(reflFactory->IsConstituent(*vpos)) + aRegion->AddRootLogicalVolume(reflFactory->GetReflectedLV(*vpos)); + } + } + else + { + std::ostringstream message; + message << "Volume NOT found in store !" << G4endl + << " Volume " << volname << " NOT found in store !" + << G4endl + << " No region is being set."; + G4Exception("G4GDMLParser::ImportRegions()", + "InvalidSetup", JustWarning, message); + } } else if(tag == "pcut") { @@ -245,7 +277,7 @@ void G4GDMLParser::ExportRegions(G4bool storeReferences) // Skip default regions associated to worlds { const G4String& tname = (*rstore)[i]->GetName(); - if(tname.contains("DefaultRegionForParallelWorld")) + if(G4StrUtil::contains(tname, "DefaultRegionForParallelWorld")) continue; const G4String& rname = writer->GenerateName(tname, (*rstore)[i]); rlist = new G4GDMLAuxListType(); diff --git a/source/persistency/gdml/src/G4GDMLRead.cc b/source/persistency/gdml/src/G4GDMLRead.cc index 150a75f564..35eb73e40b 100644 --- a/source/persistency/gdml/src/G4GDMLRead.cc +++ b/source/persistency/gdml/src/G4GDMLRead.cc @@ -104,13 +104,18 @@ void G4GDMLRead::GeneratePhysvolName(const G4String& nameIn, G4String G4GDMLRead::Strip(const G4String& name) const { G4String sname(name); - return sname.remove(sname.find("0x")); + StripName(sname); + return sname; } // -------------------------------------------------------------------- void G4GDMLRead::StripName(G4String& name) const { - name.remove(name.find("0x")); + auto idx = name.find("0x"); + if(idx != G4String::npos) + { + name.erase(idx); + } } // -------------------------------------------------------------------- @@ -140,6 +145,7 @@ void G4GDMLRead::StripNames() const StripName(sname); psol->SetName(sname); } + solids->UpdateMap(); // Logical volumes... // @@ -150,6 +156,7 @@ void G4GDMLRead::StripNames() const StripName(sname); lvol->SetName(sname); } + lvols->UpdateMap(); // Physical volumes... // @@ -160,6 +167,7 @@ void G4GDMLRead::StripNames() const StripName(sname); pvol->SetName(sname); } + pvols->UpdateMap(); // Materials... // diff --git a/source/persistency/gdml/src/G4GDMLReadMaterials.cc b/source/persistency/gdml/src/G4GDMLReadMaterials.cc index ec3840f7cc..492ecff4fd 100644 --- a/source/persistency/gdml/src/G4GDMLReadMaterials.cc +++ b/source/persistency/gdml/src/G4GDMLReadMaterials.cc @@ -865,7 +865,7 @@ void G4GDMLReadMaterials::PropertyRead( } if(matrix.GetCols() == 1) // constant property assumed { - matprop->AddConstProperty(Strip(name), matrix.Get(0, 0)); + matprop->AddConstProperty(Strip(name), matrix.Get(0, 0), true); } else // build the material properties vector { @@ -874,7 +874,7 @@ void G4GDMLReadMaterials::PropertyRead( { propvect->InsertValues(matrix.Get(i, 0), matrix.Get(i, 1)); } - matprop->AddProperty(Strip(name), propvect); + matprop->AddProperty(Strip(name), propvect, true); } } diff --git a/source/persistency/gdml/src/G4GDMLReadSolids.cc b/source/persistency/gdml/src/G4GDMLReadSolids.cc index 5ce98fa25a..5e70a3e467 100644 --- a/source/persistency/gdml/src/G4GDMLReadSolids.cc +++ b/source/persistency/gdml/src/G4GDMLReadSolids.cc @@ -3553,7 +3553,7 @@ void G4GDMLReadSolids::PropertyRead( } if(matrix.GetCols() == 1) // constant property assumed { - matprop->AddConstProperty(Strip(name), matrix.Get(0, 0)); + matprop->AddConstProperty(Strip(name), matrix.Get(0, 0), true); } else // build the material properties vector { @@ -3577,7 +3577,7 @@ void G4GDMLReadSolids::PropertyRead( propvect = mapOfMatPropVects[temp]; } - matprop->AddProperty(Strip(name), propvect); + matprop->AddProperty(Strip(name), propvect, true); } } diff --git a/source/persistency/gdml/src/G4GDMLWrite.cc b/source/persistency/gdml/src/G4GDMLWrite.cc index 4ffd0b1c6e..51cb5c42cc 100644 --- a/source/persistency/gdml/src/G4GDMLWrite.cc +++ b/source/persistency/gdml/src/G4GDMLWrite.cc @@ -143,7 +143,7 @@ G4String G4GDMLWrite::GenerateName(const G4String& name, const void* const ptr) std::vector toremove = { ' ', '/', ':', '#', '+' }; for(auto c : toremove) { - if(nameOut.contains(c)) + if(G4StrUtil::contains(nameOut, c)) { std::replace(nameOut.begin(), nameOut.end(), c, '_'); } diff --git a/source/persistency/gdml/src/G4GDMLWriteMaterials.cc b/source/persistency/gdml/src/G4GDMLWriteMaterials.cc index abb03311b6..4e44c040bb 100644 --- a/source/persistency/gdml/src/G4GDMLWriteMaterials.cc +++ b/source/persistency/gdml/src/G4GDMLWriteMaterials.cc @@ -281,47 +281,39 @@ void G4GDMLWriteMaterials::PropertyWrite(xercesc::DOMElement* matElement, xercesc::DOMElement* propElement; G4MaterialPropertiesTable* ptable = mat->GetMaterialPropertiesTable(); - auto pmap = ptable->GetPropertyMap(); - auto cmap = ptable->GetConstPropertyMap(); + auto pvec = ptable->GetProperties(); + auto cvec = ptable->GetConstProperties(); - for(auto mpos = pmap->cbegin(); mpos != pmap->cend(); ++mpos) + for(size_t i = 0; i < pvec.size(); ++i) { - propElement = NewElement("property"); - propElement->setAttributeNode( - NewAttribute("name", ptable->GetMaterialPropertyNames()[mpos->first])); - propElement->setAttributeNode(NewAttribute( - "ref", GenerateName(ptable->GetMaterialPropertyNames()[mpos->first], - mpos->second))); - if(mpos->second) + if (pvec[i] != nullptr) { - PropertyVectorWrite(ptable->GetMaterialPropertyNames()[mpos->first], - mpos->second); + propElement = NewElement("property"); + propElement->setAttributeNode( + NewAttribute("name", ptable->GetMaterialPropertyNames()[i])); + propElement->setAttributeNode(NewAttribute( + "ref", GenerateName(ptable->GetMaterialPropertyNames()[i], + pvec[i]))); + PropertyVectorWrite(ptable->GetMaterialPropertyNames()[i], + pvec[i]); matElement->appendChild(propElement); } - else - { - G4String warn_message = "Null pointer for material property -" + - ptable->GetMaterialPropertyNames()[mpos->first] + - "- of material -" + mat->GetName() + "- !"; - G4Exception("G4GDMLWriteMaterials::PropertyWrite()", "NullPointer", - JustWarning, warn_message); - continue; - } } - for(auto cpos = cmap->cbegin(); cpos != cmap->cend(); ++cpos) + for(size_t i = 0; i < cvec.size(); ++i) { - propElement = NewElement("property"); - propElement->setAttributeNode(NewAttribute( - "name", ptable->GetMaterialConstPropertyNames()[cpos->first])); - propElement->setAttributeNode(NewAttribute( - "ref", GenerateName(ptable->GetMaterialConstPropertyNames()[cpos->first], - ptable))); - - PropertyConstWrite(ptable->GetMaterialConstPropertyNames()[cpos->first], - cpos->second, ptable); - - matElement->appendChild(propElement); + if (cvec[i].second == true) + { + propElement = NewElement("property"); + propElement->setAttributeNode(NewAttribute( + "name", ptable->GetMaterialConstPropertyNames()[i])); + propElement->setAttributeNode(NewAttribute( + "ref", GenerateName(ptable->GetMaterialConstPropertyNames()[i], + ptable))); + PropertyConstWrite(ptable->GetMaterialConstPropertyNames()[i], + cvec[i].first, ptable); + matElement->appendChild(propElement); + } } } diff --git a/source/persistency/gdml/src/G4GDMLWriteSolids.cc b/source/persistency/gdml/src/G4GDMLWriteSolids.cc index 2ac9f2f9df..dbe45e6629 100644 --- a/source/persistency/gdml/src/G4GDMLWriteSolids.cc +++ b/source/persistency/gdml/src/G4GDMLWriteSolids.cc @@ -1086,47 +1086,38 @@ void G4GDMLWriteSolids::PropertyWrite(xercesc::DOMElement* optElement, { xercesc::DOMElement* propElement; G4MaterialPropertiesTable* ptable = surf->GetMaterialPropertiesTable(); - auto pmap = ptable->GetPropertyMap(); - auto cmap = ptable->GetConstPropertyMap(); + auto pvec = ptable->GetProperties(); + auto cvec = ptable->GetConstProperties(); - for(auto mpos = pmap->cbegin(); mpos != pmap->cend(); ++mpos) + for(size_t i = 0; i < pvec.size(); ++i) { - propElement = NewElement("property"); - propElement->setAttributeNode( - NewAttribute("name", ptable->GetMaterialPropertyNames()[mpos->first])); - propElement->setAttributeNode(NewAttribute( - "ref", GenerateName(ptable->GetMaterialPropertyNames()[mpos->first], - mpos->second))); - if(mpos->second) - { - PropertyVectorWrite(ptable->GetMaterialPropertyNames()[mpos->first], - mpos->second); + if(pvec[i] != nullptr) { + propElement = NewElement("property"); + propElement->setAttributeNode( + NewAttribute("name", ptable->GetMaterialPropertyNames()[i])); + propElement->setAttributeNode(NewAttribute( + "ref", GenerateName(ptable->GetMaterialPropertyNames()[i], + pvec[i]))); + PropertyVectorWrite(ptable->GetMaterialPropertyNames()[i], + pvec[i]); optElement->appendChild(propElement); } - else - { - G4String warn_message = "Null pointer for material property -" + - ptable->GetMaterialPropertyNames()[mpos->first] + - "- of optical surface -" + surf->GetName() + - "- !"; - G4Exception("G4GDMLWriteSolids::PropertyWrite()", "NullPointer", - JustWarning, warn_message); - continue; - } } - for(auto cpos = cmap->cbegin(); cpos != cmap->cend(); ++cpos) + for(size_t i = 0; i < cvec.size(); ++i) { - propElement = NewElement("property"); - propElement->setAttributeNode(NewAttribute( - "name", ptable->GetMaterialConstPropertyNames()[cpos->first])); - propElement->setAttributeNode(NewAttribute( - "ref", ptable->GetMaterialConstPropertyNames()[cpos->first])); - xercesc::DOMElement* constElement = NewElement("constant"); - constElement->setAttributeNode(NewAttribute( - "name", ptable->GetMaterialConstPropertyNames()[cpos->first])); - constElement->setAttributeNode(NewAttribute("value", cpos->second)); - defineElement->appendChild(constElement); - optElement->appendChild(propElement); + if (cvec[i].second == true) { + propElement = NewElement("property"); + propElement->setAttributeNode(NewAttribute( + "name", ptable->GetMaterialConstPropertyNames()[i])); + propElement->setAttributeNode(NewAttribute( + "ref", ptable->GetMaterialConstPropertyNames()[i])); + xercesc::DOMElement* constElement = NewElement("constant"); + constElement->setAttributeNode(NewAttribute( + "name", ptable->GetMaterialConstPropertyNames()[i])); + constElement->setAttributeNode(NewAttribute("value", cvec[i].first)); + defineElement->appendChild(constElement); + optElement->appendChild(propElement); + } } } diff --git a/source/persistency/gdml/src/G4GDMLWriteStructure.cc b/source/persistency/gdml/src/G4GDMLWriteStructure.cc index e33c0b8097..1260d26bc1 100644 --- a/source/persistency/gdml/src/G4GDMLWriteStructure.cc +++ b/source/persistency/gdml/src/G4GDMLWriteStructure.cc @@ -279,7 +279,15 @@ void G4GDMLWriteStructure::AssemblyWrite(xercesc::DOMElement* volumeElement, for(std::size_t i5 = 0; i5 < myassembly->TotalTriplets(); ++i5) { - TraverseVolumeTree((*vit).GetVolume(), depth + 1); + G4LogicalVolume* lvol = (*vit).GetVolume(); + if (lvol == nullptr) + { + G4String message = "Nested assemblies not yet supported for exporting. Sorry!"; + G4Exception("G4GDMLWriteStructure::AssemblyWrite()", "InvalidSetup", + FatalException, message); + return; + } + TraverseVolumeTree(lvol, depth + 1); const G4ThreeVector rot = GetAngles((*vit).GetRotation()->inverse()); const G4ThreeVector pos = (*vit).GetTranslation(); @@ -693,7 +701,7 @@ G4Transform3D G4GDMLWriteStructure::TraverseVolumeTree( { AssemblyWrite(structureElement, assemblyID); addedAssemblies.push_back(assemblyID); - assemblyIDToAddedImprints[assemblyID] = std::vector(); + assemblyIDToAddedImprints[assemblyID] = std::vector(); } // 2) add the assembly (as physical volume) to the mother volume @@ -702,9 +710,9 @@ G4Transform3D G4GDMLWriteStructure::TraverseVolumeTree( // here I need a check if assembly has been already added to the // mother volume - std::vector& addedImprints2 = assemblyIDToAddedImprints[assemblyID]; - if(std::find(addedImprints2.cbegin(), addedImprints2.cend(), - imprintID) == addedImprints2.cend()) + std::vector& addedImprints = assemblyIDToAddedImprints[assemblyID]; + if(std::find(addedImprints.cbegin(), addedImprints.cend(), + imprintID) == addedImprints.cend()) { G4String imprintname = "Imprint_" + std::to_string(imprintID) + "_"; imprintname = GenerateName(imprintname, physvol); @@ -723,19 +731,16 @@ G4Transform3D G4GDMLWriteStructure::TraverseVolumeTree( transf.getDecomposition(scale, rotate, translate); const G4ThreeVector scl(scale(0, 0), scale(1, 1), scale(2, 2)); - const G4ThreeVector rot = - GetAngles(rotate.getRotation().inverse()); + const G4ThreeVector rot = GetAngles(rotate.getRotation().inverse()); const G4ThreeVector pos = transf.getTranslation(); // here I need a normal physvol referencing to my assemblyref xercesc::DOMElement* physvolElement = NewElement("physvol"); - physvolElement->setAttributeNode( - NewAttribute("name", imprintname)); + physvolElement->setAttributeNode(NewAttribute("name", imprintname)); xercesc::DOMElement* volumerefElement = NewElement("volumeref"); - volumerefElement->setAttributeNode( - NewAttribute("ref", assemblyref)); + volumerefElement->setAttributeNode(NewAttribute("ref", assemblyref)); physvolElement->appendChild(volumerefElement); if(std::fabs(pos.x()) > kLinearPrecision || @@ -759,7 +764,7 @@ G4Transform3D G4GDMLWriteStructure::TraverseVolumeTree( volumeElement->appendChild(physvolElement); // - addedImprints2.push_back(imprintID); + addedImprints.push_back(imprintID); } } else // not part of assembly, so a normal physical volume diff --git a/source/persistency/mctruth/src/G4PersistencyCenterMessenger.cc b/source/persistency/mctruth/src/G4PersistencyCenterMessenger.cc index 594d053447..f09c9ffac6 100644 --- a/source/persistency/mctruth/src/G4PersistencyCenterMessenger.cc +++ b/source/persistency/mctruth/src/G4PersistencyCenterMessenger.cc @@ -217,7 +217,7 @@ G4String G4PersistencyCenterMessenger::GetCurrentValue(G4UIcommand* command) if(command == verboseCmd) { - return pc->VerboseLevel(); + return G4UIcommand::ConvertToString(pc->VerboseLevel()); } else if(command == select) { diff --git a/source/physics_lists/History b/source/physics_lists/History index 7dd6bb778c..10f36588bb 100644 --- a/source/physics_lists/History +++ b/source/physics_lists/History @@ -14,6 +14,10 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +25-08-2021 Dennis Wright (physics-lists-V10-07-02) +- completed name migration by replacing G4RadioactiveDecayBase with + G4RadioactiveDecay everywhere in physics_lists (/lists, /constructors) + 16-04-2021 Ben Morgan (physics-lists-V10-07-01) - Migrate build to modular CMake API diff --git a/source/physics_lists/builders/History b/source/physics_lists/builders/History index 9f9c99a492..cb4ce66703 100644 --- a/source/physics_lists/builders/History +++ b/source/physics_lists/builders/History @@ -13,6 +13,12 @@ introduced in the code and keeptrack of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +14-Aug-2021 Vladimir Ivanchenko (phys-builder-V10-07-08) +- G4QGSPNeutronBuilder - use G4NeutronInelasticXS cross section + +13-Jul-2021 Alberto Ribon (phys-builder-V10-07-07) +- G4HadronicBuilder : initialized the vector mode, as suggested by Coverity. + 16-April-2021 Ben Morgan (phys-builder-V10-07-06) - Migrate build to modular CMake API diff --git a/source/physics_lists/builders/src/G4HadronicBuilder.cc b/source/physics_lists/builders/src/G4HadronicBuilder.cc index 8f4b6ec8c5..eab6da3f2c 100644 --- a/source/physics_lists/builders/src/G4HadronicBuilder.cc +++ b/source/physics_lists/builders/src/G4HadronicBuilder.cc @@ -351,6 +351,7 @@ void G4HadronicBuilder::BuildDecayTableForBCHadrons() { G4DecayTable* decayTable = new G4DecayTable; const G4int numberDecayChannels = 1; G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ]; + for ( G4int i = 0; i < numberDecayChannels; ++i ) mode[i] = nullptr; switch ( pdg ) { // Charmed mesons case 411 : // D+ @@ -462,6 +463,7 @@ void G4HadronicBuilder::BuildDecayTableForBCHadrons() { G4DecayTable* decayTable = new G4DecayTable; const G4int numberDecayChannels = 1; G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ]; + for ( G4int i = 0; i < numberDecayChannels; ++i ) mode[i] = nullptr; mode[0] = new G4PhaseSpaceDecayChannel( "etac", 1.0, 3, "eta", "pi+", "pi-" ); for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] ); delete [] mode; @@ -471,6 +473,7 @@ void G4HadronicBuilder::BuildDecayTableForBCHadrons() { G4DecayTable* decayTable = new G4DecayTable; const G4int numberDecayChannels = 1; G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ]; + for ( G4int i = 0; i < numberDecayChannels; ++i ) mode[i] = nullptr; mode[0] = new G4PhaseSpaceDecayChannel( "J/psi", 1.0, 3, "pi0", "pi+", "pi-" ); for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] ); delete [] mode; @@ -480,6 +483,7 @@ void G4HadronicBuilder::BuildDecayTableForBCHadrons() { G4DecayTable* decayTable = new G4DecayTable; const G4int numberDecayChannels = 1; G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ]; + for ( G4int i = 0; i < numberDecayChannels; ++i ) mode[i] = nullptr; mode[0] = new G4PhaseSpaceDecayChannel( "Upsilon", 1.0, 3, "eta_prime", "pi+", "pi-" ); for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] ); delete [] mode; diff --git a/source/physics_lists/builders/src/G4QGSPNeutronBuilder.cc b/source/physics_lists/builders/src/G4QGSPNeutronBuilder.cc index 2c193fc400..80aa2a65e7 100644 --- a/source/physics_lists/builders/src/G4QGSPNeutronBuilder.cc +++ b/source/physics_lists/builders/src/G4QGSPNeutronBuilder.cc @@ -43,7 +43,7 @@ #include "G4ParticleDefinition.hh" #include "G4ParticleTable.hh" #include "G4ProcessManager.hh" -#include "G4BGGNucleonInelasticXS.hh" +#include "G4NeutronInelasticXS.hh" #include "G4HadronicParameters.hh" @@ -80,5 +80,5 @@ Build(G4HadronInelasticProcess * aP) theModel->SetMinEnergy(theMin); theModel->SetMaxEnergy( G4HadronicParameters::Instance()->GetMaxEnergy() ); aP->RegisterMe(theModel); - aP->AddDataSet(new G4BGGNucleonInelasticXS(G4Neutron::Neutron())); + aP->AddDataSet(new G4NeutronInelasticXS()); } diff --git a/source/physics_lists/constructors/decay/History b/source/physics_lists/constructors/decay/History index d8f017c114..9d087c4f45 100644 --- a/source/physics_lists/constructors/decay/History +++ b/source/physics_lists/constructors/decay/History @@ -13,6 +13,14 @@ introduced in the code and keeptrack of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +06-October-2020 Vladimir Ivanchenko (phys-ctor-decay-V10-07-03) +- G4RadioactiveDecayPhysics - Use SetAuger(..) method instead of + the obsolete SetAugerCascade(..) + +25-August-2021 Dennis Wright (part of physics-lists-V10-07-02) +- G4RadioactiveDecayPhysics.cc: replace G4RadioactiveDecayBase with G4RadioactiveDecay + see top level History file + 16-April-2021 Ben Morgan (phys-ctor-decay-V10-07-01) - Migrate build to modular CMake API diff --git a/source/physics_lists/constructors/decay/README b/source/physics_lists/constructors/decay/README deleted file mode 100644 index 7b33ccd4f2..0000000000 --- a/source/physics_lists/constructors/decay/README +++ /dev/null @@ -1,14 +0,0 @@ -------------------------------------------------------------------- - - - G4DecayPhysics - -------------- - - G4RadioactiveDecayPhysics - ------------------------- - - G4SpinDecayPhysics - ------------------ - - G4UnknownDecayPhysics - --------------------- diff --git a/source/physics_lists/constructors/decay/src/G4RadioactiveDecayPhysics.cc b/source/physics_lists/constructors/decay/src/G4RadioactiveDecayPhysics.cc index bf9dd861fa..30caaea9f4 100644 --- a/source/physics_lists/constructors/decay/src/G4RadioactiveDecayPhysics.cc +++ b/source/physics_lists/constructors/decay/src/G4RadioactiveDecayPhysics.cc @@ -28,7 +28,7 @@ #include "G4RadioactiveDecayPhysics.hh" -#include "G4RadioactiveDecayBase.hh" +#include "G4RadioactiveDecay.hh" #include "G4GenericIon.hh" #include "globals.hh" #include "G4PhysicsListHelper.hh" @@ -80,7 +80,7 @@ void G4RadioactiveDecayPhysics::ConstructProcess() { // EM physics extra configuration // this physics constructor should be defined after EM constructor - G4EmParameters::Instance()->SetAugerCascade(true); + G4EmParameters::Instance()->SetAuger(true); G4EmParameters::Instance()->SetDeexcitationIgnoreCut(true); G4LossTableManager* man = G4LossTableManager::Instance(); @@ -94,7 +94,7 @@ void G4RadioactiveDecayPhysics::ConstructProcess() } G4PhysicsListHelper::GetPhysicsListHelper()-> - RegisterProcess(new G4RadioactiveDecayBase(), G4GenericIon::GenericIon()); + RegisterProcess(new G4RadioactiveDecay(), G4GenericIon::GenericIon()); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/physics_lists/constructors/electromagnetic/History b/source/physics_lists/constructors/electromagnetic/History index c86df09346..3f2b458ec1 100644 --- a/source/physics_lists/constructors/electromagnetic/History +++ b/source/physics_lists/constructors/electromagnetic/History @@ -13,6 +13,40 @@ introduced in the code and keeptrack of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +12 November 2021, V.Ivanchenko (phys-ctor-em-V10-07-23) +- G4EmStandardPhysicsWVI - making this experimantal configuration + compatible for CPU performance with Opt3 (it was similar to SS) + +10 November 2021, V.Ivanchenko (phys-ctor-em-V10-07-22) +- G4EmStandardPhysicsWVI - use similar options as in Opt3, for ions + use G4LinhardSorensenIonModel +- G4EmModelActivator - updated according to the current Opt3 and Opt4 + configurations + +29 October 2021, M. Novak (phys-ctor-em-V10-07-21) +- G4GammaGeneralProcess - make some methods/fields visible for + derived classes + +25 October 2021, V.Ivanchenko (phys-ctor-em-V10-07-20) +- G4EmBuilder - complete addition of hyper-nuclei EM physics +- in all DNA Physics List use SetAuger() instead of SetAugerCascade() + +22 October 2021, V.Ivanchenko (phys-ctor-em-V10-07-19) +- G4EmBuilder - added hyper-nuclei EM physics + +12 October 2021, V.Ivanchenko (phys-ctor-em-V10-07-18) +- G4EmBuilder - removed obsolete header + +27 September 2021, V.Ivanchenko (phys-ctor-em-V10-07-17) +- G4EmBuilder - use more optimal order of instantiation of processes, + should not affect any result but useful for debugging + +30 August 2021, D.Sawkey (phys-ctor-em-V10-07-16) +- G4OpticalPhysics - apply clang-format style guidelines + +11 July 2021, V.Ivanchenko (phys-ctor-em-V10-07-15) +- G4GammaGeneralProcess - use base material approach + 14 June 2021, V.Ivanchenko (phys-ctor-em-V10-07-14) - G4EmLivermorePhysics, G4EmPenelopePhysics_option1, G4EmStandardPhysics_option3, G4EmStandardPhysics_option4, @@ -31,15 +65,15 @@ introduced in the code and keeptrack of all tags. - G4EmDNAPhysics - updated configuration of standard physics for gamma and positrons according to Opt3; updated particle list by addition of G4Alpha; simplified ConstructProcess() method using - G4PhysicsListHelper + G4PhysicsListHelper 22 May 2021, V.Ivanchenko (phys-ctor-em-V10-07-11) - Updated all standard Physics Lists: removed local member "verbose" and use uniform approach for verbosity via G4EmParameters; instantiate NIEL process only if parameter MaxNIELEnergy is above zero; include gamma linear polarization model to Opt0, Opt3, Opt4, - SS, and Livermore physics constructors if the parameter - EnablePolarisation="true"; G4EmLivermorePolarizedPhysics fully + SS, and Livermore physics constructors if the parameter + EnablePolarisation="true"; G4EmLivermorePolarizedPhysics fully inherit from G4EmLivermorePhysics 24 April 2021, V.Ivanchenko (phys-ctor-em-V10-07-10) diff --git a/source/physics_lists/constructors/electromagnetic/README b/source/physics_lists/constructors/electromagnetic/README deleted file mode 100644 index 85f2d13323..0000000000 --- a/source/physics_lists/constructors/electromagnetic/README +++ /dev/null @@ -1,91 +0,0 @@ -------------------------------------------------------------------- - - - G4EmDNAChemistry - ---------------- - - G4EmDNAPhysics - -------------- - - G4EmDNAPhysicsActivator - ----------------------- - - G4EmDNAPhysics_option1 - ---------------------- - - G4EmDNAPhysics_option2 - ---------------------- - - G4EmDNAPhysics_option3 - ---------------------- - - G4EmDNAPhysics_option4 - ---------------------- - - G4EmDNAPhysics_option5 - ---------------------- - - G4EmDNAPhysics_option7 - ---------------------- - - G4EmLEPTSPhysics - ---------------- - - G4EmLivermorePhysics - -------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmLivermorePolarizedPhysics - ----------------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmLowEPPhysics - ---------------- - - G4EmModelActivator - ------------------ - - G4EmPenelopePhysics - ------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmStandardPhysics - ------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmStandardPhysicsGS - --------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmStandardPhysicsSS - --------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmStandardPhysicsWVI - ---------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmStandardPhysics_option1 - --------------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmStandardPhysics_option2 - --------------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmStandardPhysics_option3 - --------------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4EmStandardPhysics_option4 - --------------------------- - see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml - - G4OpticalPhysics - ---------------- - - G4OpticalPhysicsMessenger - ------------------------- - - G4OpticalProcessIndex - --------------------- \ No newline at end of file diff --git a/source/physics_lists/constructors/electromagnetic/include/G4GammaGeneralProcess.hh b/source/physics_lists/constructors/electromagnetic/include/G4GammaGeneralProcess.hh index a114a0ca91..6754176237 100644 --- a/source/physics_lists/constructors/electromagnetic/include/G4GammaGeneralProcess.hh +++ b/source/physics_lists/constructors/electromagnetic/include/G4GammaGeneralProcess.hh @@ -65,7 +65,7 @@ class G4GammaGeneralProcess : public G4VEmProcess { public: - explicit G4GammaGeneralProcess(); + explicit G4GammaGeneralProcess(const G4String& pname="GammaGeneralProc"); ~G4GammaGeneralProcess() override; @@ -93,7 +93,7 @@ public: // Called before tracking of each new G4Track void StartTracking(G4Track*) override; - + // implementation of virtual method, specific for G4GammaGeneralProcess G4double PostStepGetPhysicalInteractionLength( const G4Track& track, @@ -102,7 +102,7 @@ public: // implementation of virtual method, specific for G4GammaGeneralProcess G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&) override; - + // Store PhysicsTable in a file. // Return false in case of failure at I/O G4bool StorePhysicsTable(const G4ParticleDefinition*, @@ -148,12 +148,12 @@ protected: void SelectHadProcess(const G4Track&, const G4Step&, G4HadronicProcess*); -private: - // It returns the cross section per volume for energy/ material G4double TotalCrossSectionPerVolume(); - G4bool RetrieveTable(G4VEmProcess*, const G4String& directory, +private: + + G4bool RetrieveTable(G4VEmProcess*, const G4String& directory, G4bool ascii); protected: @@ -161,6 +161,10 @@ protected: G4HadronicProcess* theGammaNuclear = nullptr; G4VProcess* selectedProc = nullptr; + G4double preStepLogE = 1.0; + G4double factor = 1.0; + + private: static G4EmDataHandler* theHandler; static const size_t nTables = 15; @@ -177,8 +181,6 @@ private: G4double minEEEnergy; G4double minMMEnergy; G4double peLambda = 0.0; - G4double preStepLogE = 1.0; - G4double factor = 1.0; size_t nLowE = 40; size_t nHighE = 50; @@ -187,7 +189,7 @@ private: }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - + inline G4double G4GammaGeneralProcess::ComputeGeneralLambda(size_t idxe, size_t idxt) { @@ -206,7 +208,7 @@ inline G4double G4GammaGeneralProcess::GetProbability(size_t idxt) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -inline void +inline void G4GammaGeneralProcess::SelectedProcess(const G4Step& step, G4VProcess* ptr) { selectedProc = ptr; diff --git a/source/physics_lists/constructors/electromagnetic/include/G4OpticalPhysics.hh b/source/physics_lists/constructors/electromagnetic/include/G4OpticalPhysics.hh index 68c6cc3ab5..d255c2096e 100644 --- a/source/physics_lists/constructors/electromagnetic/include/G4OpticalPhysics.hh +++ b/source/physics_lists/constructors/electromagnetic/include/G4OpticalPhysics.hh @@ -49,27 +49,23 @@ class G4OpticalPhysics : public G4VPhysicsConstructor { - public: + public: + G4OpticalPhysics(G4int verbose = 0, const G4String& name = "Optical"); + ~G4OpticalPhysics() override; + void PrintStatistics() const; - G4OpticalPhysics(G4int verbose = 0, const G4String& name = "Optical"); - ~G4OpticalPhysics() override; - void PrintStatistics() const; + G4OpticalPhysics(const G4OpticalPhysics& right) = delete; + G4OpticalPhysics& operator=(const G4OpticalPhysics& right) = delete; - G4OpticalPhysics(const G4OpticalPhysics& right) = delete; - G4OpticalPhysics& operator=(const G4OpticalPhysics& right) = delete; - - protected: - - // construct particle and physics - void ConstructParticle() override; - void ConstructProcess() override; - - private: - - void PrintWarning(G4ExceptionDescription&) const; + protected: + // construct particle and physics + void ConstructParticle() override; + void ConstructProcess() override; + private: + void PrintWarning(G4ExceptionDescription&) const; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#endif // G4OpticalPhysics_h +#endif // G4OpticalPhysics_h diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmBuilder.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmBuilder.cc index 8a5a22c168..51627e9566 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmBuilder.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmBuilder.cc @@ -54,7 +54,6 @@ #include "G4hIonisation.hh" #include "G4ionIonisation.hh" -#include "G4alphaIonisation.hh" #include "G4NuclearStopping.hh" #include "G4MuMultipleScattering.hh" @@ -117,14 +116,14 @@ void G4EmBuilder::ConstructIonEmPhysics(G4hMultipleScattering* hmsc, ph->RegisterProcess(hmsc, part); ph->RegisterProcess(new G4hIonisation(), part); - part = G4He3::He3(); + part = G4Alpha::Alpha(); ph->RegisterProcess(new G4hMultipleScattering(), part); ph->RegisterProcess(new G4ionIonisation(), part); if( nucStopping != nullptr ) { ph->RegisterProcess(nucStopping, part); } - part = G4Alpha::Alpha(); + part = G4He3::He3(); ph->RegisterProcess(new G4hMultipleScattering(), part); ph->RegisterProcess(new G4ionIonisation(), part); if( nucStopping != nullptr ) { @@ -144,11 +143,11 @@ void G4EmBuilder::ConstructIonEmPhysicsSS() ph->RegisterProcess(new G4hIonisation(), part); ph->RegisterProcess(new G4CoulombScattering(), part); - part = G4He3::He3(); + part = G4Alpha::Alpha(); ph->RegisterProcess(new G4ionIonisation(), part); ph->RegisterProcess(new G4CoulombScattering(), part); - part = G4Alpha::Alpha(); + part = G4He3::He3(); ph->RegisterProcess(new G4ionIonisation(), part); ph->RegisterProcess(new G4CoulombScattering(), part); } @@ -160,15 +159,16 @@ void G4EmBuilder::ConstructLightHadrons(G4ParticleDefinition* part1, { G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper(); - G4hBremsstrahlung* brem = ( isHEP ) ? new G4hBremsstrahlung() : nullptr; - G4hPairProduction* pair = ( isHEP ) ? new G4hPairProduction() : nullptr; - G4hMultipleScattering* msc = new G4hMultipleScattering(); if(isWVI) { msc->SetEmModel(new G4WentzelVIModel()); } G4CoulombScattering* ss = ( isWVI ) ? new G4CoulombScattering() : nullptr; ph->RegisterProcess(msc, part1); ph->RegisterProcess(new G4hIonisation(), part1); + + G4hBremsstrahlung* brem = ( isHEP ) ? new G4hBremsstrahlung() : nullptr; + G4hPairProduction* pair = ( isHEP ) ? new G4hPairProduction() : nullptr; + if( isHEP ) { ph->RegisterProcess(brem, part1); ph->RegisterProcess(pair, part1); @@ -197,10 +197,11 @@ void G4EmBuilder::ConstructLightHadronsSS(G4ParticleDefinition* part1, { G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper(); + ph->RegisterProcess(new G4hIonisation(), part1); + G4hBremsstrahlung* brem = ( isHEP ) ? new G4hBremsstrahlung() : nullptr; G4hPairProduction* pair = ( isHEP ) ? new G4hPairProduction() : nullptr; - ph->RegisterProcess(new G4hIonisation(), part1); if( isHEP ) { ph->RegisterProcess(brem, part1); ph->RegisterProcess(pair, part1); @@ -224,10 +225,6 @@ void G4EmBuilder::ConstructCharged(G4hMultipleScattering* hmsc, G4HadronicParameters* hpar = G4HadronicParameters::Instance(); G4bool isHEP = ( param->MaxKinEnergy() > hpar->EnergyThresholdForHeavyHadrons() ); - // muon bremsstrahlung and pair production - G4MuBremsstrahlung* mub = ( isHEP ) ? new G4MuBremsstrahlung() : nullptr; - G4MuPairProduction* mup = ( isHEP ) ? new G4MuPairProduction() : nullptr; - // muon multiple and single scattering G4MuMultipleScattering* mumsc = new G4MuMultipleScattering(); if(isWVI) { mumsc->SetEmModel(new G4WentzelVIModel()); } @@ -238,6 +235,11 @@ void G4EmBuilder::ConstructCharged(G4hMultipleScattering* hmsc, G4ParticleDefinition* part = G4MuonPlus::MuonPlus(); ph->RegisterProcess(mumsc, part); ph->RegisterProcess(new G4MuIonisation(), part); + + // muon bremsstrahlung and pair production + G4MuBremsstrahlung* mub = ( isHEP ) ? new G4MuBremsstrahlung() : nullptr; + G4MuPairProduction* mup = ( isHEP ) ? new G4MuPairProduction() : nullptr; + if( isHEP ) { ph->RegisterProcess(mub, part); ph->RegisterProcess(mup, part); @@ -276,6 +278,10 @@ void G4EmBuilder::ConstructCharged(G4hMultipleScattering* hmsc, if( hpar->EnableBCParticles() ) { ConstructBasicEmPhysics(hmsc, G4HadParticles::GetBCChargedHadrons()); } + // light hyper-nuclei + if( hpar->EnableHyperNuclei() ) { + ConstructBasicEmPhysics(hmsc, G4HadParticles::GetChargedHyperNuclei()); + } } } @@ -286,10 +292,6 @@ void G4EmBuilder::ConstructChargedSS(G4hMultipleScattering* hmsc) G4HadronicParameters* hpar = G4HadronicParameters::Instance(); G4bool isHEP = ( param->MaxKinEnergy() > hpar->EnergyThresholdForHeavyHadrons() ); - // muon bremsstrahlung and pair production - G4MuBremsstrahlung* mub = ( isHEP ) ? new G4MuBremsstrahlung() : nullptr; - G4MuPairProduction* mup = ( isHEP ) ? new G4MuPairProduction() : nullptr; - // muon multiple and single scattering G4CoulombScattering* muss = new G4CoulombScattering(); @@ -297,6 +299,11 @@ void G4EmBuilder::ConstructChargedSS(G4hMultipleScattering* hmsc) // mu+- G4ParticleDefinition* part = G4MuonPlus::MuonPlus(); ph->RegisterProcess(new G4MuIonisation(), part); + + // muon bremsstrahlung and pair production + G4MuBremsstrahlung* mub = ( isHEP ) ? new G4MuBremsstrahlung() : nullptr; + G4MuPairProduction* mup = ( isHEP ) ? new G4MuPairProduction() : nullptr; + if( isHEP ) { ph->RegisterProcess(mub, part); ph->RegisterProcess(mup, part); @@ -330,6 +337,10 @@ void G4EmBuilder::ConstructChargedSS(G4hMultipleScattering* hmsc) if( hpar->EnableBCParticles() ) { ConstructBasicEmPhysics(hmsc, G4HadParticles::GetBCChargedHadrons()); } + // light hyper-nuclei + if( hpar->EnableHyperNuclei() ) { + ConstructBasicEmPhysics(hmsc, G4HadParticles::GetChargedHyperNuclei()); + } } } diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option1.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option1.cc index 5440056768..35c08cba6e 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option1.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option1.cc @@ -93,7 +93,6 @@ G4EmDNAPhysics_option1::G4EmDNAPhysics_option1(G4int ver, const G4String&) param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option2.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option2.cc index 5cd8f8b37f..f880e4a32a 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option2.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option2.cc @@ -94,7 +94,6 @@ G4EmDNAPhysics_option2::G4EmDNAPhysics_option2(G4int ver, const G4String&) param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option3.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option3.cc index 80171fd064..489d413936 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option3.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option3.cc @@ -92,7 +92,6 @@ G4EmDNAPhysics_option3::G4EmDNAPhysics_option3(G4int ver, const G4String&) param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option4.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option4.cc index d8b4deaa82..e03e89684f 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option4.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option4.cc @@ -98,7 +98,6 @@ G4EmDNAPhysics_option4::G4EmDNAPhysics_option4(G4int ver, const G4String&) param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option5.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option5.cc index 821188d75c..bedf611317 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option5.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option5.cc @@ -98,7 +98,6 @@ G4EmDNAPhysics_option5::G4EmDNAPhysics_option5(G4int ver, const G4String&) : param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option6.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option6.cc index c9401ace77..7bab3a56ba 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option6.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option6.cc @@ -110,7 +110,6 @@ G4EmDNAPhysics_option6::G4EmDNAPhysics_option6(G4int ver, const G4String&) param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option7.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option7.cc index d728d1a48e..545c115160 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option7.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option7.cc @@ -98,7 +98,6 @@ G4EmDNAPhysics_option7::G4EmDNAPhysics_option7(G4int ver, const G4String&) : param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option8.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option8.cc index 4ab76c4304..f76604107f 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option8.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_option8.cc @@ -94,7 +94,6 @@ G4EmDNAPhysics_option8::G4EmDNAPhysics_option8(G4int ver, const G4String&) param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option2.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option2.cc index 11dfcd2e97..f348c90195 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option2.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option2.cc @@ -90,7 +90,6 @@ G4EmDNAPhysics_stationary_option2::G4EmDNAPhysics_stationary_option2(G4int ver) param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); @@ -101,17 +100,8 @@ G4EmDNAPhysics_stationary_option2::G4EmDNAPhysics_stationary_option2(G4int ver) G4EmDNAPhysics_stationary_option2::G4EmDNAPhysics_stationary_option2(G4int ver, const G4String&) -: G4VPhysicsConstructor("G4EmDNAPhysics_stationary_option2"), verbose(ver) -{ - G4EmParameters* param = G4EmParameters::Instance(); - param->SetDefaults(); - param->SetFluo(true); - param->SetAuger(true); - param->SetAugerCascade(true); - param->SetDeexcitationIgnoreCut(true); - - SetPhysicsType(bElectromagnetic); -} + : G4EmDNAPhysics_stationary_option2(ver) +{} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option4.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option4.cc index a1956432d5..b652ffbd02 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option4.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option4.cc @@ -92,7 +92,6 @@ G4EmDNAPhysics_stationary_option4::G4EmDNAPhysics_stationary_option4(G4int ver) param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); @@ -103,17 +102,8 @@ G4EmDNAPhysics_stationary_option4::G4EmDNAPhysics_stationary_option4(G4int ver) G4EmDNAPhysics_stationary_option4::G4EmDNAPhysics_stationary_option4(G4int ver, const G4String&) - : G4VPhysicsConstructor("G4EmDNAPhysics_stationary_option4"), verbose(ver) -{ - G4EmParameters* param = G4EmParameters::Instance(); - param->SetDefaults(); - param->SetFluo(true); - param->SetAuger(true); - param->SetAugerCascade(true); - param->SetDeexcitationIgnoreCut(true); - - SetPhysicsType(bElectromagnetic); -} + : G4EmDNAPhysics_stationary_option4(ver) +{} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option6.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option6.cc index dcdfd9c4b7..00e5a62812 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option6.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmDNAPhysics_stationary_option6.cc @@ -93,7 +93,6 @@ G4EmDNAPhysics_stationary_option6::G4EmDNAPhysics_stationary_option6(G4int ver) param->SetDefaults(); param->SetFluo(true); param->SetAuger(true); - param->SetAugerCascade(true); param->SetDeexcitationIgnoreCut(true); param->ActivateDNA(); @@ -104,17 +103,8 @@ G4EmDNAPhysics_stationary_option6::G4EmDNAPhysics_stationary_option6(G4int ver) G4EmDNAPhysics_stationary_option6::G4EmDNAPhysics_stationary_option6(G4int ver, const G4String&) - : G4VPhysicsConstructor("G4EmDNAPhysics_stationary_option6"), verbose(ver) -{ - G4EmParameters* param = G4EmParameters::Instance(); - param->SetDefaults(); - param->SetFluo(true); - param->SetAuger(true); - param->SetAugerCascade(true); - param->SetDeexcitationIgnoreCut(true); - - SetPhysicsType(bElectromagnetic); -} + : G4EmDNAPhysics_stationary_option6(ver) +{} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmModelActivator.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmModelActivator.cc index 8803377307..9cc8d69c13 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmModelActivator.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmModelActivator.cc @@ -96,6 +96,7 @@ #include "G4UrbanMscModel.hh" #include "G4GoudsmitSaundersonMscModel.hh" #include "G4LowEPComptonModel.hh" +#include "G4BetheHeitler5DModel.hh" #include "G4LivermorePhotoElectricModel.hh" #include "G4LivermoreComptonModel.hh" @@ -250,12 +251,17 @@ void G4EmModelActivator::ActivateEmOptions() FindOrAddProcess(phot, "Rayl"); mod = new G4LivermoreRayleighModel(); em_config->SetExtraEmModel("gamma", "Rayl", mod, reg); + FindOrAddProcess(phot, "phot"); + mod = new G4LivermorePhotoElectricModel(); FindOrAddProcess(phot, "compt"); mod = new G4KleinNishinaModel(); em_config->SetExtraEmModel("gamma", "compt", mod, reg); mod = new G4LowEPComptonModel(); mod->SetHighEnergyLimit(20*MeV); em_config->SetExtraEmModel("gamma", "compt", mod, reg); + FindOrAddProcess(phot, "conv"); + mod = new G4BetheHeitler5DModel(); + em_config->SetExtraEmModel("gamma", "conv", mod, reg); } else if("G4EmStandardGS" == typesPhys[i]) { G4GoudsmitSaundersonMscModel* msc = new G4GoudsmitSaundersonMscModel(); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4EmStandardPhysicsWVI.cc b/source/physics_lists/constructors/electromagnetic/src/G4EmStandardPhysicsWVI.cc index 796b059b46..73272a331e 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4EmStandardPhysicsWVI.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4EmStandardPhysicsWVI.cc @@ -31,11 +31,7 @@ // Author: V.Ivanchenko 09.11.2005 // // Modified: -// 05.12.2005 V.Ivanchenko add controlled verbosity -// 13.11.2006 V.Ivanchenko use G4hMultipleScattering -// 23.11.2006 V.Ivanchenko remove mscStepLimit option and improve cout -// 13.02.2007 V.Ivanchenko use G4hMultipleScattering for muons -// 13.02.2007 V.Ivanchenko set skin=0.0 +// // 21.04.2008 V.Ivanchenko add long-lived D and B mesons // //---------------------------------------------------------------------------- @@ -60,7 +56,9 @@ #include "G4CoulombScattering.hh" #include "G4WentzelVIModel.hh" #include "G4WentzelVIRelModel.hh" +#include "G4UrbanMscModel.hh" #include "G4hCoulombScatteringModel.hh" +#include "G4eCoulombScatteringModel.hh" #include "G4eIonisation.hh" #include "G4eBremsstrahlung.hh" @@ -69,9 +67,11 @@ #include "G4hIonisation.hh" #include "G4ionIonisation.hh" +#include "G4BetheHeitler5DModel.hh" #include "G4AtimaEnergyLossModel.hh" #include "G4AtimaFluctuations.hh" #include "G4IonParametrisedLossModel.hh" +#include "G4LindhardSorensenIonModel.hh" #include "G4BraggIonModel.hh" #include "G4NuclearStopping.hh" #include "G4eplusTo2GammaOKVIModel.hh" @@ -99,7 +99,7 @@ G4EmStandardPhysicsWVI::G4EmStandardPhysicsWVI(G4int ver) param->SetDefaults(); param->SetVerbose(ver); param->SetMinEnergy(10*CLHEP::eV); - param->SetLowestElectronEnergy(10*CLHEP::eV); + param->SetLowestElectronEnergy(100*CLHEP::eV); param->SetNumberOfBinsPerDecade(20); param->ActivateAngularGeneratorForIonisation(true); param->SetStepFunction(0.2, 100*CLHEP::um); @@ -108,8 +108,10 @@ G4EmStandardPhysicsWVI::G4EmStandardPhysicsWVI(G4int ver) param->SetStepFunctionIons(0.1, 1*CLHEP::um); param->SetUseMottCorrection(true); param->SetMuHadLateralDisplacement(true); + param->SetUseICRU90Data(true); param->SetMscThetaLimit(0.15); param->SetFluo(true); + param->SetMaxNIELEnergy(1*CLHEP::MeV); SetPhysicsType(bElectromagnetic); } @@ -135,10 +137,21 @@ void G4EmStandardPhysicsWVI::ConstructProcess() } G4EmBuilder::PrepareEMPhysics(); G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper(); + G4EmParameters* param = G4EmParameters::Instance(); // common processes G4hMultipleScattering* hmsc = new G4hMultipleScattering("ionmsc"); - G4NuclearStopping* pnuc(nullptr); + + // nuclear stopping is enabled if th eenergy limit above zero + G4double nielEnergyLimit = param->MaxNIELEnergy(); + G4NuclearStopping* pnuc = nullptr; + if(nielEnergyLimit > 0.0) { + pnuc = new G4NuclearStopping(); + pnuc->SetMaxKinEnergy(nielEnergyLimit); + } + + // high energy limit for e+- scattering models + G4double highEnergyLimit = 1*CLHEP::MeV; // Add gamma EM processes G4ParticleDefinition* particle = G4Gamma::Gamma(); @@ -149,17 +162,33 @@ void G4EmStandardPhysicsWVI::ConstructProcess() G4ComptonScattering* cs = new G4ComptonScattering; cs->SetEmModel(new G4KleinNishinaModel()); + G4GammaConversion* gc = new G4GammaConversion(); + if(param->EnablePolarisation()) { + gc->SetEmModel(new G4BetheHeitler5DModel()); + } + ph->RegisterProcess(pee, particle); ph->RegisterProcess(cs, particle); - ph->RegisterProcess(new G4GammaConversion(), particle); + ph->RegisterProcess(gc, particle); ph->RegisterProcess(new G4RayleighScattering(), particle); // e- particle = G4Electron::Electron(); G4eMultipleScattering* msc = new G4eMultipleScattering; - msc->SetEmModel(new G4WentzelVIModel()); + G4UrbanMscModel* msc1 = new G4UrbanMscModel(); + G4WentzelVIModel* msc2 = new G4WentzelVIModel(); + msc1->SetHighEnergyLimit(highEnergyLimit); + msc2->SetLowEnergyLimit(highEnergyLimit); + msc->SetEmModel(msc1); + msc->SetEmModel(msc2); + + G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel(); G4CoulombScattering* ss = new G4CoulombScattering(); + ss->SetEmModel(ssm); + ss->SetMinKinEnergy(highEnergyLimit); + ssm->SetLowEnergyLimit(highEnergyLimit); + ssm->SetActivationLowEnergyLimit(highEnergyLimit); ph->RegisterProcess(msc, particle); ph->RegisterProcess(new G4eIonisation(), particle); @@ -170,8 +199,19 @@ void G4EmStandardPhysicsWVI::ConstructProcess() particle = G4Positron::Positron(); msc = new G4eMultipleScattering; - msc->SetEmModel(new G4WentzelVIModel()); + msc1 = new G4UrbanMscModel(); + msc2 = new G4WentzelVIModel(); + msc1->SetHighEnergyLimit(highEnergyLimit); + msc2->SetLowEnergyLimit(highEnergyLimit); + msc->SetEmModel(msc1); + msc->SetEmModel(msc2); + + ssm = new G4eCoulombScatteringModel(); ss = new G4CoulombScattering(); + ss->SetEmModel(ssm); + ss->SetMinKinEnergy(highEnergyLimit); + ssm->SetLowEnergyLimit(highEnergyLimit); + ssm->SetActivationLowEnergyLimit(highEnergyLimit); G4eplusAnnihilation* ann = new G4eplusAnnihilation(); ann->SetEmModel(new G4eplusTo2GammaOKVIModel()); @@ -185,11 +225,10 @@ void G4EmStandardPhysicsWVI::ConstructProcess() // generic ion particle = G4GenericIon::GenericIon(); G4ionIonisation* ionIoni = new G4ionIonisation(); - ionIoni->SetEmModel(new G4BraggIonModel(),0); - ionIoni->SetEmModel(new G4AtimaEnergyLossModel(),1); - ionIoni->SetFluctModel(new G4AtimaFluctuations()); + ionIoni->SetEmModel(new G4LindhardSorensenIonModel()); ph->RegisterProcess(hmsc, particle); ph->RegisterProcess(ionIoni, particle); + if(nullptr != pnuc) { ph->RegisterProcess(pnuc, particle); } // muons, hadrons, ions G4EmBuilder::ConstructCharged(hmsc, pnuc); diff --git a/source/physics_lists/constructors/electromagnetic/src/G4GammaGeneralProcess.cc b/source/physics_lists/constructors/electromagnetic/src/G4GammaGeneralProcess.cc index 6e16f271cf..032eeac894 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4GammaGeneralProcess.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4GammaGeneralProcess.cc @@ -76,15 +76,15 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4EmDataHandler* G4GammaGeneralProcess::theHandler = nullptr; -G4bool G4GammaGeneralProcess::theT[nTables] = +G4bool G4GammaGeneralProcess::theT[nTables] = {true,false,true,true,true,false,true,true,true, true,true,true,true,true,true}; -G4String G4GammaGeneralProcess::nameT[nTables] = +G4String G4GammaGeneralProcess::nameT[nTables] = {"0","1","2","3","4","5","6","7","8", "9","10","11","12","13","14"}; -G4GammaGeneralProcess::G4GammaGeneralProcess(): - G4VEmProcess("GammaGeneralProc", fElectromagnetic), +G4GammaGeneralProcess::G4GammaGeneralProcess(const G4String& pname): + G4VEmProcess(pname, fElectromagnetic), minPEEnergy(150*CLHEP::keV), minEEEnergy(2*CLHEP::electron_mass_c2), minMMEnergy(100*CLHEP::MeV) @@ -148,11 +148,14 @@ void G4GammaGeneralProcess::PreparePhysicsTable(const G4ParticleDefinition& part G4EmParameters* param = G4EmParameters::Instance(); G4LossTableManager* man = G4LossTableManager::Instance(); - - isTheMaster = man->IsMaster(); + + isTheMaster = man->IsMaster(); if(isTheMaster) { SetVerboseLevel(param->Verbose()); } else { SetVerboseLevel(param->WorkerVerbose()); } + G4LossTableBuilder* bld = man->GetTableBuilder(); + baseMat = bld->GetBaseMaterialFlag(); + if(1 < verboseLevel) { G4cout << "G4GammaGeneralProcess::PreparePhysicsTable() for " << GetProcessName() @@ -165,8 +168,8 @@ void G4GammaGeneralProcess::PreparePhysicsTable(const G4ParticleDefinition& part theConversionEE == nullptr) { G4ExceptionDescription ed; ed << "### G4GeneralGammaProcess is initialized incorrectly" - << "\n Photoelectric: " << thePhotoElectric - << "\n Compton: " << theCompton + << "\n Photoelectric: " << thePhotoElectric + << "\n Compton: " << theCompton << "\n Conversion: " << theConversionEE; G4Exception("G4GeneralGammaProcess","em0004", FatalException, ed,""); @@ -186,15 +189,15 @@ void G4GammaGeneralProcess::PreparePhysicsTable(const G4ParticleDefinition& part void G4GammaGeneralProcess::InitialiseProcess(const G4ParticleDefinition*) { - if(isTheMaster) { + if(isTheMaster) { G4EmParameters* param = G4EmParameters::Instance(); G4LossTableManager* man = G4LossTableManager::Instance(); // tables are created and its size is defined only once - if(nullptr == theHandler) { - theHandler = new G4EmDataHandler(nTables); - if(theRayleigh) { theT[1] = true; } + if(nullptr == theHandler) { + theHandler = new G4EmDataHandler(nTables); + if(theRayleigh) { theT[1] = true; } theHandler->SetMasterProcess(thePhotoElectric); theHandler->SetMasterProcess(theCompton); @@ -202,7 +205,7 @@ void G4GammaGeneralProcess::InitialiseProcess(const G4ParticleDefinition*) theHandler->SetMasterProcess(theRayleigh); } auto bld = man->GetTableBuilder(); - + const G4ProductionCutsTable* theCoupleTable= G4ProductionCutsTable::GetProductionCutsTable(); size_t numOfCouples = theCoupleTable->GetTableSize(); @@ -219,22 +222,22 @@ void G4GammaGeneralProcess::InitialiseProcess(const G4ParticleDefinition*) G4PhysicsLogVector cVector(minEEEnergy,minMMEnergy,nHighE,splineFlag); G4PhysicsLogVector dVector(minMMEnergy,maxe,nbin2,splineFlag); - for(size_t i=0; iMakeTable(i); + G4PhysicsTable* table = theHandler->MakeTable(i); //G4cout << " make table " << table << G4endl; for(size_t j=0; jGetFlag(j) && nullptr == vec) { //G4cout <<" i= "<SetEmMasterProcess(theHandler->GetMasterProcess(0)); + if(!isTheMaster) { + thePhotoElectric->SetEmMasterProcess(theHandler->GetMasterProcess(0)); + baseMat = theHandler->GetMasterProcess(0)->UseBaseMaterial(); } - thePhotoElectric->BuildPhysicsTable(part); + thePhotoElectric->BuildPhysicsTable(part); - if(!isTheMaster) { - theCompton->SetEmMasterProcess(theHandler->GetMasterProcess(1)); + if(!isTheMaster) { + theCompton->SetEmMasterProcess(theHandler->GetMasterProcess(1)); } - theCompton->BuildPhysicsTable(part); - - if(!isTheMaster) { - theConversionEE->SetEmMasterProcess(theHandler->GetMasterProcess(2)); + theCompton->BuildPhysicsTable(part); + + if(!isTheMaster) { + theConversionEE->SetEmMasterProcess(theHandler->GetMasterProcess(2)); } - theConversionEE->BuildPhysicsTable(part); - - if(theRayleigh != nullptr) { - if(!isTheMaster) { - theRayleigh->SetEmMasterProcess(theHandler->GetMasterProcess(3)); + theConversionEE->BuildPhysicsTable(part); + + if(theRayleigh != nullptr) { + if(!isTheMaster) { + theRayleigh->SetEmMasterProcess(theHandler->GetMasterProcess(3)); } - theRayleigh->BuildPhysicsTable(part); + theRayleigh->BuildPhysicsTable(part); } if(theGammaNuclear != nullptr) { theGammaNuclear->BuildPhysicsTable(part); } if(theConversionMM != nullptr) { theConversionMM->BuildPhysicsTable(part); } @@ -286,9 +290,9 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part) G4LossTableBuilder* bld = G4LossTableManager::Instance()->GetTableBuilder(); const std::vector& tables = theHandler->GetTables(); - G4CrossSectionDataStore* gn = (nullptr != theGammaNuclear) + G4CrossSectionDataStore* gn = (nullptr != theGammaNuclear) ? theGammaNuclear->GetCrossSectionDataStore() : nullptr; - G4DynamicParticle* dynParticle = + G4DynamicParticle* dynParticle = new G4DynamicParticle(G4Gamma::Gamma(),G4ThreeVector(1,0,0),1.0); G4double sigComp(0.), sigPE(0.), sigConv(0.), sigR(0.), @@ -298,53 +302,53 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part) if (bld->GetFlag(i)) { - G4int idx = (*theDensityIdx)[i]; - const G4MaterialCutsCouple* couple = + G4int idx = (!baseMat) ? i : DensityIndex(i); + const G4MaterialCutsCouple* couple = theCoupleTable->GetMaterialCutsCouple(i); const G4Material* material = couple->GetMaterial(); // energy interval 0 size_t nn = (*(tables[0]))[idx]->GetVectorLength(); - if(1 < verboseLevel) { - G4cout << "======= Zone 0 ======= N= " << nn - << " for " << material->GetName() << G4endl; + if(1 < verboseLevel) { + G4cout << "======= Zone 0 ======= N= " << nn + << " for " << material->GetName() << G4endl; } for(size_t j=0; jEnergy(j); G4double loge = G4Log(e); sigComp = theCompton->GetLambda(e, couple, loge); - sigR = (nullptr != theRayleigh) ? + sigR = (nullptr != theRayleigh) ? theRayleigh->GetLambda(e, couple, loge) : 0.0; G4double sum = sigComp + sigR; if(1 < verboseLevel) { - G4cout << j << ". E= " << e << " xs= " << sum - << " compt= " << sigComp << " Rayl= " << sigR << G4endl; + G4cout << j << ". E= " << e << " xs= " << sum + << " compt= " << sigComp << " Rayl= " << sigR << G4endl; } (*(tables[0]))[idx]->PutValue(j, sum); if(theT[1]) { val = sigR/sum; (*(tables[1]))[idx]->PutValue(j, val); - } + } } // energy interval 1 nn = (*(tables[2]))[idx]->GetVectorLength(); if(1 < verboseLevel) { - G4cout << "======= Zone 1 ======= N= " << nn << G4endl; + G4cout << "======= Zone 1 ======= N= " << nn << G4endl; } for(size_t j=0; jEnergy(j); G4double loge = G4Log(e); sigComp = theCompton->GetLambda(e, couple, loge); - sigR = (nullptr != theRayleigh) ? + sigR = (nullptr != theRayleigh) ? theRayleigh->GetLambda(e, couple, loge) : 0.0; sigPE = thePhotoElectric->GetLambda(e, couple, loge); G4double sum = sigComp + sigR + sigPE; if(1 < verboseLevel) { - G4cout << j << ". E= " << e << " xs= " << sum - << " compt= " << sigComp << " conv= " << sigConv + G4cout << j << ". E= " << e << " xs= " << sum + << " compt= " << sigComp << " conv= " << sigConv << " PE= " << sigPE << " Rayl= " << sigR - << " GN= " << sigN << G4endl; + << " GN= " << sigN << G4endl; } (*(tables[2]))[idx]->PutValue(j, sum); @@ -358,7 +362,7 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part) // energy interval 2 nn = (*(tables[6]))[idx]->GetVectorLength(); if(1 < verboseLevel) { - G4cout << "======= Zone 2 ======= N= " << nn << G4endl; + G4cout << "======= Zone 2 ======= N= " << nn << G4endl; } for(size_t j=0; jEnergy(j); @@ -373,11 +377,11 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part) } G4double sum = sigComp + sigConv + sigPE + sigN; if(1 < verboseLevel) { - G4cout << j << ". E= " << e << " xs= " << sum - << " compt= " << sigComp << " conv= " << sigConv + G4cout << j << ". E= " << e << " xs= " << sum + << " compt= " << sigComp << " conv= " << sigConv << " PE= " << sigPE << " GN= " << sigN << G4endl; - } + } (*(tables[6]))[idx]->PutValue(j, sum); val = sigConv/sum; @@ -387,14 +391,14 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part) (*(tables[8]))[idx]->PutValue(j, val); val = (sigN > 0.0) ? (sigConv + sigComp + sigPE)/sum : 1.0; - (*(tables[9]))[idx]->PutValue(j, val); + (*(tables[9]))[idx]->PutValue(j, val); } // energy interval 3 nn = (*(tables[10]))[idx]->GetVectorLength(); if(1 < verboseLevel) { - G4cout << "======= Zone 3 ======= N= " << nn - << " for " << material->GetName() << G4endl; + G4cout << "======= Zone 3 ======= N= " << nn + << " for " << material->GetName() << G4endl; } for(size_t j=0; jEnergy(j); @@ -414,11 +418,11 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part) } G4double sum = sigComp + sigConv + sigPE + sigN + sigM; if(1 < verboseLevel) { - G4cout << j << ". E= " << e << " xs= " << sum - << " compt= " << sigComp << " conv= " << sigConv + G4cout << j << ". E= " << e << " xs= " << sum + << " compt= " << sigComp << " conv= " << sigConv << " PE= " << sigPE << " GN= " << sigN << G4endl; - } + } (*(tables[10]))[idx]->PutValue(j, sum); val = (sigComp + sigPE + sigN + sigM)/sum; @@ -429,14 +433,14 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part) val = (sigN + sigM)/sum; (*(tables[13]))[idx]->PutValue(j, val); - + val = sigN/sum; (*(tables[14]))[idx]->PutValue(j, val); } for(size_t k=0; kFillSecondDerivatives(); - } + if(splineFlag) { + (*(tables[k]))[idx]->FillSecondDerivatives(); + } } } } @@ -475,10 +479,13 @@ G4double G4GammaGeneralProcess::PostStepGetPhysicalInteractionLength( G4bool recompute = false; if(couple != currentCouple) { currentCouple = couple; - currentCoupleIndex = couple->GetIndex(); - basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex]; - factor = (*theDensityFactor)[currentCoupleIndex]; + basedCoupleIndex = currentCoupleIndex = couple->GetIndex(); currentMaterial = couple->GetMaterial(); + factor = 1.0; + if(baseMat) { + basedCoupleIndex = DensityIndex(currentCoupleIndex); + factor = DensityFactor(currentCoupleIndex); + } recompute = true; } if(energy != preStepKinEnergy) { @@ -490,26 +497,26 @@ G4double G4GammaGeneralProcess::PostStepGetPhysicalInteractionLength( preStepLambda = TotalCrossSectionPerVolume(); // zero cross section - if(preStepLambda <= 0.0) { + if(preStepLambda <= 0.0) { theNumberOfInteractionLengthLeft = -1.0; currentInteractionLength = DBL_MAX; } } // non-zero cross section - if(preStepLambda > 0.0) { + if(preStepLambda > 0.0) { if (theNumberOfInteractionLengthLeft < 0.0) { // beggining of tracking (or just after DoIt of this process) theNumberOfInteractionLengthLeft = -G4Log( G4UniformRand() ); - theInitialNumberOfInteractionLength = theNumberOfInteractionLengthLeft; + theInitialNumberOfInteractionLength = theNumberOfInteractionLengthLeft; } else if(currentInteractionLength < DBL_MAX) { - theNumberOfInteractionLengthLeft -= + theNumberOfInteractionLengthLeft -= previousStepSize/currentInteractionLength; - theNumberOfInteractionLengthLeft = + theNumberOfInteractionLengthLeft = std::max(theNumberOfInteractionLengthLeft, 0.0); } @@ -518,8 +525,8 @@ G4double G4GammaGeneralProcess::PostStepGetPhysicalInteractionLength( x = theNumberOfInteractionLengthLeft * currentInteractionLength; } /* - G4cout << "PostStepGetPhysicalInteractionLength: e= " << energy - << " idxe= " << idxEnergy << " xs= " << preStepLambda + G4cout << "PostStepGetPhysicalInteractionLength: e= " << energy + << " idxe= " << idxEnergy << " xs= " << preStepLambda << " x= " << x << G4endl; */ return x; @@ -531,18 +538,18 @@ G4double G4GammaGeneralProcess::TotalCrossSectionPerVolume() { G4double cross = 0.0; /* - G4cout << "#Total: " << preStepKinEnergy << " " << minPEEnergy << " " + G4cout << "#Total: " << preStepKinEnergy << " " << minPEEnergy << " " << minEEEnergy << " " << minMMEnergy<< G4endl; - G4cout << " idxE= " << idxEnergy + G4cout << " idxE= " << idxEnergy << " idxC= " << currentCoupleIndex << G4endl; */ if(preStepKinEnergy < minPEEnergy) { cross = ComputeGeneralLambda(0, 0); //G4cout << "XS1: " << cross << G4endl; peLambda = thePhotoElectric->GetLambda(preStepKinEnergy, currentCouple, preStepLogE); - cross += peLambda; + cross += peLambda; //G4cout << "XS2: " << cross << G4endl; - + } else if(preStepKinEnergy < minEEEnergy) { cross = ComputeGeneralLambda(1, 2); //G4cout << "XS3: " << cross << G4endl; @@ -555,9 +562,9 @@ G4double G4GammaGeneralProcess::TotalCrossSectionPerVolume() cross = ComputeGeneralLambda(3, 10); //G4cout << "XS5: " << cross << G4endl; } - /* - G4cout << "xs= " << cross << " idxE= " << idxEnergy - << " idxC= " << currentCoupleIndex + /* + G4cout << "xs= " << cross << " idxE= " << idxEnergy + << " idxC= " << currentCoupleIndex << " E= " << energy << G4endl; */ return cross; @@ -573,13 +580,13 @@ G4VParticleChange* G4GammaGeneralProcess::PostStepDoIt(const G4Track& track, selectedProc = nullptr; G4double q = G4UniformRand(); /* - G4cout << "PostStep: preStepLambda= " << preStepLambda - << " PE= " << peLambda << " q= " << q << " idxE= " << idxEnergy + G4cout << "PostStep: preStepLambda= " << preStepLambda + << " PE= " << peLambda << " q= " << q << " idxE= " << idxEnergy << G4endl; */ switch (idxEnergy) { case 0: - if(preStepLambda*q <= peLambda) { + if(preStepLambda*q <= peLambda) { SelectEmProcess(step, thePhotoElectric); } else { if(theT[1] && preStepLambda*q < preStepLambda*GetProbability(1) + peLambda) { @@ -600,7 +607,7 @@ G4VParticleChange* G4GammaGeneralProcess::PostStepDoIt(const G4Track& track, } break; - case 2: + case 2: if(q <= GetProbability(7)) { SelectEmProcess(step, theConversionEE); } else if(q <= GetProbability(8)) { @@ -612,7 +619,7 @@ G4VParticleChange* G4GammaGeneralProcess::PostStepDoIt(const G4Track& track, } break; - case 3: + case 3: if(q + GetProbability(11) <= 1.0) { SelectEmProcess(step, theConversionEE); } else if(q + GetProbability(12) <= 1.0) { @@ -627,8 +634,8 @@ G4VParticleChange* G4GammaGeneralProcess::PostStepDoIt(const G4Track& track, break; } // sample secondaries - if(selectedProc != nullptr) { - return selectedProc->PostStepDoIt(track, step); + if(selectedProc != nullptr) { + return selectedProc->PostStepDoIt(track, step); } // no interaction - exception case fParticleChange.InitializeForPostStep(track); @@ -653,7 +660,7 @@ G4bool G4GammaGeneralProcess::StorePhysicsTable(const G4ParticleDefinition* part { G4bool yes = true; if(!isTheMaster) { return yes; } - if(!thePhotoElectric->StorePhysicsTable(part, directory, ascii)) + if(!thePhotoElectric->StorePhysicsTable(part, directory, ascii)) { yes = false; } if(!theCompton->StorePhysicsTable(part, directory, ascii)) { yes = false; } @@ -665,7 +672,7 @@ G4bool G4GammaGeneralProcess::StorePhysicsTable(const G4ParticleDefinition* part for(size_t i=0; iStorePhysicsTable(i, part, fnam, ascii)) { yes = false; } @@ -676,7 +683,7 @@ G4bool G4GammaGeneralProcess::StorePhysicsTable(const G4ParticleDefinition* part //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... -G4bool +G4bool G4GammaGeneralProcess::RetrievePhysicsTable(const G4ParticleDefinition* part, const G4String& directory, G4bool ascii) @@ -687,7 +694,7 @@ G4GammaGeneralProcess::RetrievePhysicsTable(const G4ParticleDefinition* part, << GetProcessName() << G4endl; } G4bool yes = true; - if(!thePhotoElectric->RetrievePhysicsTable(part, directory, ascii)) + if(!thePhotoElectric->RetrievePhysicsTable(part, directory, ascii)) { yes = false; } if(!theCompton->RetrievePhysicsTable(part, directory, ascii)) { yes = false; } @@ -699,10 +706,10 @@ G4GammaGeneralProcess::RetrievePhysicsTable(const G4ParticleDefinition* part, for(size_t i=0; iRetrievePhysicsTable(i, part, fnam, ascii, splineFlag)) + if(!theHandler->RetrievePhysicsTable(i, part, fnam, ascii, splineFlag)) { yes = false; } } } @@ -726,7 +733,7 @@ G4double G4GammaGeneralProcess::GetMeanFreePath(const G4Track& track, void G4GammaGeneralProcess::ProcessDescription(std::ostream& out) const { thePhotoElectric->ProcessDescription(out); - theCompton->ProcessDescription(out); + theCompton->ProcessDescription(out); theConversionEE->ProcessDescription(out); if(theRayleigh) { theRayleigh->ProcessDescription(out); } if(theGammaNuclear) { theGammaNuclear->ProcessDescription(out); } @@ -737,7 +744,7 @@ void G4GammaGeneralProcess::ProcessDescription(std::ostream& out) const const G4String& G4GammaGeneralProcess::GetSubProcessName() const { - return (selectedProc) ? selectedProc->GetProcessName() + return (selectedProc) ? selectedProc->GetProcessName() : G4VProcess::GetProcessName(); } @@ -745,8 +752,8 @@ const G4String& G4GammaGeneralProcess::GetSubProcessName() const G4int G4GammaGeneralProcess::GetSubProcessSubType() const { - return (selectedProc) ? selectedProc->GetProcessSubType() - : fGammaGeneralProcess; + return (selectedProc) ? selectedProc->GetProcessSubType() + : fGammaGeneralProcess; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/physics_lists/constructors/electromagnetic/src/G4OpticalPhysics.cc b/source/physics_lists/constructors/electromagnetic/src/G4OpticalPhysics.cc index 4fd35063a4..dcbca935eb 100644 --- a/source/physics_lists/constructors/electromagnetic/src/G4OpticalPhysics.cc +++ b/source/physics_lists/constructors/electromagnetic/src/G4OpticalPhysics.cc @@ -37,22 +37,20 @@ // #include "G4OpticalPhysics.hh" -#include "G4OpticalParameters.hh" +#include "G4Cerenkov.hh" +#include "G4EmSaturation.hh" +#include "G4LossTableManager.hh" #include "G4OpAbsorption.hh" +#include "G4OpBoundaryProcess.hh" #include "G4OpRayleigh.hh" #include "G4OpMieHG.hh" -#include "G4OpBoundaryProcess.hh" +#include "G4OpticalParameters.hh" #include "G4OpWLS.hh" #include "G4OpWLS2.hh" -#include "G4Scintillation.hh" -#include "G4Cerenkov.hh" - -#include "G4LossTableManager.hh" -#include "G4EmSaturation.hh" - #include "G4ParticleDefinition.hh" #include "G4ProcessManager.hh" +#include "G4Scintillation.hh" // factory #include "G4PhysicsConstructorFactory.hh" @@ -67,8 +65,7 @@ G4OpticalPhysics::G4OpticalPhysics(G4int verbose, const G4String& name) } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4OpticalPhysics::~G4OpticalPhysics() -{} +G4OpticalPhysics::~G4OpticalPhysics() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4OpticalPhysics::PrintStatistics() const @@ -85,79 +82,93 @@ void G4OpticalPhysics::ConstructParticle() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4OpticalPhysics::ConstructProcess() { - if(verboseLevel>0) - G4cout <<"G4OpticalPhysics:: Add Optical Physics Processes"<< G4endl; + if(verboseLevel > 0) + G4cout << "G4OpticalPhysics:: Add Optical Physics Processes" << G4endl; auto params = G4OpticalParameters::Instance(); // Add Optical Processes - G4ProcessManager* pManager = G4OpticalPhoton::OpticalPhoton()->GetProcessManager(); - if (!pManager) { - G4ExceptionDescription ed; - ed << "Optical Photon without a Process Manager"; - G4Exception("G4OpticalPhysics::ConstructProcess()","", - FatalException,ed); - return; + G4ProcessManager* pManager = + G4OpticalPhoton::OpticalPhoton()->GetProcessManager(); + if(!pManager) + { + G4ExceptionDescription ed; + ed << "Optical Photon without a Process Manager"; + G4Exception("G4OpticalPhysics::ConstructProcess()", "", FatalException, ed); + return; } - G4OpAbsorption* absorption = new G4OpAbsorption(); - if (params->GetProcessActivation("OpAbsorption")) pManager->AddDiscreteProcess(absorption); + G4OpAbsorption* absorption = new G4OpAbsorption(); + if(params->GetProcessActivation("OpAbsorption")) + pManager->AddDiscreteProcess(absorption); G4OpRayleigh* rayleigh = new G4OpRayleigh(); - if (params->GetProcessActivation("OpRayleigh")) pManager->AddDiscreteProcess(rayleigh); + if(params->GetProcessActivation("OpRayleigh")) + pManager->AddDiscreteProcess(rayleigh); G4OpMieHG* mie = new G4OpMieHG(); - if (params->GetProcessActivation("OpMieHG")) pManager->AddDiscreteProcess(mie); + if(params->GetProcessActivation("OpMieHG")) + pManager->AddDiscreteProcess(mie); G4OpBoundaryProcess* boundary = new G4OpBoundaryProcess(); - if (params->GetProcessActivation("OpBoundary")) pManager->AddDiscreteProcess(boundary); + if(params->GetProcessActivation("OpBoundary")) + pManager->AddDiscreteProcess(boundary); G4OpWLS* wls = new G4OpWLS(); - if (params->GetProcessActivation("OpWLS")) pManager->AddDiscreteProcess(wls); + if(params->GetProcessActivation("OpWLS")) + pManager->AddDiscreteProcess(wls); G4OpWLS2* wls2 = new G4OpWLS2(); - if (params->GetProcessActivation("OpWLS2")) pManager->AddDiscreteProcess(wls2); + if(params->GetProcessActivation("OpWLS2")) + pManager->AddDiscreteProcess(wls2); - G4Scintillation* scint = new G4Scintillation(); + G4Scintillation* scint = new G4Scintillation(); G4EmSaturation* emSaturation = G4LossTableManager::Instance()->EmSaturation(); scint->AddSaturation(emSaturation); G4Cerenkov* cerenkov = new G4Cerenkov(); - auto myParticleIterator=GetParticleIterator(); + auto myParticleIterator = GetParticleIterator(); myParticleIterator->reset(); - while( (*myParticleIterator)() ){ - + while((*myParticleIterator)()) + { G4ParticleDefinition* particle = myParticleIterator->value(); - G4String particleName = particle->GetParticleName(); + G4String particleName = particle->GetParticleName(); pManager = particle->GetProcessManager(); - if (!pManager) { - G4ExceptionDescription ed; - ed << "Particle " << particleName << "without a Process Manager"; - G4Exception("G4OpticalPhysics::ConstructProcess()","", - FatalException, ed); - return; // else coverity complains for pManager use below + if(!pManager) + { + G4ExceptionDescription ed; + ed << "Particle " << particleName << "without a Process Manager"; + G4Exception("G4OpticalPhysics::ConstructProcess()", "", FatalException, + ed); + return; // else coverity complains for pManager use below } - if (cerenkov->IsApplicable(*particle) && params->GetProcessActivation("Cerenkov")) { - pManager->AddProcess(cerenkov); - pManager->SetProcessOrdering(cerenkov,idxPostStep); + if(cerenkov->IsApplicable(*particle) && + params->GetProcessActivation("Cerenkov")) + { + pManager->AddProcess(cerenkov); + pManager->SetProcessOrdering(cerenkov, idxPostStep); } - if (scint->IsApplicable(*particle) && params->GetProcessActivation("Scintillation")) { - pManager->AddProcess(scint); - pManager->SetProcessOrderingToLast(scint,idxAtRest); - pManager->SetProcessOrderingToLast(scint,idxPostStep); + if(scint->IsApplicable(*particle) && + params->GetProcessActivation("Scintillation")) + { + pManager->AddProcess(scint); + pManager->SetProcessOrderingToLast(scint, idxAtRest); + pManager->SetProcessOrderingToLast(scint, idxPostStep); } - if (boundary->IsApplicable(*particle) && params->GetProcessActivation("OpBoundary")) { - pManager->SetProcessOrderingToLast(boundary,idxPostStep); + if(boundary->IsApplicable(*particle) && + params->GetProcessActivation("OpBoundary")) + { + pManager->SetProcessOrderingToLast(boundary, idxPostStep); } } - - if (verboseLevel > 1) PrintStatistics(); - if (verboseLevel > 0) + if(verboseLevel > 1) + PrintStatistics(); + if(verboseLevel > 0) G4cout << "### " << namePhysics << " physics constructed." << G4endl; } diff --git a/source/physics_lists/constructors/factory/README b/source/physics_lists/constructors/factory/README deleted file mode 100644 index 75d32ac20b..0000000000 --- a/source/physics_lists/constructors/factory/README +++ /dev/null @@ -1,9 +0,0 @@ -------------------------------------------------------------------- - - - G4PhysicsConstructorFactory - --------------------------- - - G4PhysicsConstructorRegistry - ---------------------------- - \ No newline at end of file diff --git a/source/physics_lists/constructors/gamma_lepto_nuclear/History b/source/physics_lists/constructors/gamma_lepto_nuclear/History index 2f7b662321..261aa07c68 100644 --- a/source/physics_lists/constructors/gamma_lepto_nuclear/History +++ b/source/physics_lists/constructors/gamma_lepto_nuclear/History @@ -13,6 +13,22 @@ introduced in the code and keeptrack of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +10 November 2021 Vladimir Ivanchenko (phys-ctor-glnuclear-V10-07-06) +- G4EmExtraPhysics - added an option for positron annihilation to tau pair + +20 August 2021 Vladimir Ivanchenko (phys-ctor-glnuclear-V10-07-05) +- G4EmExtraPhysics - enable synkrotron radiation only for really stable + particles + +16 August 2021 Jonas Hahnfeld (phys-ctor-glnuclear-V10-07-04) +- G4EmExtraPhysics - fix typo to register positron-nuclear process, + register model for e-/e+-nuclear in case of general processes, + avoid registering synchroton radiation twice for e-/e+ + +13 August 2021 Vladimir Ivanchenko (phys-ctor-glnuclear-V10-07-03) +- G4EmExtraPhysics - enable updated G4GammaNuclearXS by default + for more detailed tests + 16 April 2021 Ben Morgan (phys-ctor-glnuclear-V10-07-02) - Migrate build to modular CMake API diff --git a/source/physics_lists/constructors/gamma_lepto_nuclear/README b/source/physics_lists/constructors/gamma_lepto_nuclear/README deleted file mode 100644 index 77b489994c..0000000000 --- a/source/physics_lists/constructors/gamma_lepto_nuclear/README +++ /dev/null @@ -1,48 +0,0 @@ -------------------------------------------------------------------- - - - G4BertiniElectroNuclearBuilder - ------------------------------ - It includes gamma-nuclear, electron-nuclear and positron-nuclear - processes. - For gamma-nuclear, it uses Bertini (BERT) model for gamma below 6 GeV, - and Quark-Gluon-String (QGS) model above 3 GeV. - For electron-nuclear and positron-nuclear, it uses the equivalent photon - approximation in which the incoming lepton generates a virtual photon, - and then the virtual photon is converted to a real photon. This real - photon is handled by BERT if its energy is below 10 GeV; if it is above - 10 GeV, then the real photon is transformed into a (on-shell) pi0 and - then handled by Fritiof (FTF) string model. - - - G4EmExtraPhysics - ---------------- - It uses G4BertiniElectroNuclearBuilder for gamma-nuclear, electron-nuclear - and positron-nuclear. - Moreover, it includes muon-nuclear process (for mu- and mu+), and - synchrotron process (either for electron & positron, or for all - charged particles). - The muon-nuclear process is treated similarly as for electrons and - positrons (i.e. the equivalent photon approximation in which the incoming - lepton generates a virtual photon, and then the virtual photon is converted - to a real photon, which is handled by BERT below 10 GeV or by FTF as a pi0 - above 10 GeV). - By default, gamma-nuclear, electron-nuclear, positron-nuclear, and - muon-nuclear are switched on, whereas synchrotron process is switched off - for all particles. It is however possible, at run time via macro commands, - to change this default (see G4EmMessenger below). - - - G4EmMessenger - ------------- - Used by G4EmExtraPhysics to be able to switch on/off: - - synchrotron radiation for electron and positron - (note: electron and positron together, not individually) - - synchrotron radiation for all charged particles - (note: all charged particles together, not individually) - - gamma-nuclear, electron-nuclear and positron-nuclear - (note: all these three particles together, not individually) - - muon-nuclear - (note: mu- and mu+ together, not individually) - at run time, via macro commands. - diff --git a/source/physics_lists/constructors/gamma_lepto_nuclear/src/G4EmExtraPhysics.cc b/source/physics_lists/constructors/gamma_lepto_nuclear/src/G4EmExtraPhysics.cc index 271f202cdf..390582ff13 100644 --- a/source/physics_lists/constructors/gamma_lepto_nuclear/src/G4EmExtraPhysics.cc +++ b/source/physics_lists/constructors/gamma_lepto_nuclear/src/G4EmExtraPhysics.cc @@ -61,6 +61,12 @@ #include "G4AntiNeutrinoTau.hh" #include "G4NeutrinoTau.hh" +#include "G4Proton.hh" +#include "G4AntiProton.hh" +#include "G4PionPlus.hh" +#include "G4PionMinus.hh" +#include "G4GenericIon.hh" + #include "G4SynchrotronRadiation.hh" #include "G4MuonNuclearProcess.hh" #include "G4MuonVDNuclearModel.hh" @@ -113,6 +119,7 @@ #include "G4HadronicParameters.hh" #include "G4PhysicsListHelper.hh" #include "G4BuilderType.hh" +#include "G4CrossSectionDataSetRegistry.hh" // factory #include "G4PhysicsConstructorFactory.hh" @@ -134,7 +141,7 @@ G4EmExtraPhysics::G4EmExtraPhysics(G4int ver): phadActivated (false), fNuActivated (false), fNuETotXscActivated (false), - fUseGammaNuclearXS(false), + fUseGammaNuclearXS(true), gmumuFactor (1.0), pmumuFactor (1.0), phadFactor (1.0), @@ -314,8 +321,8 @@ void G4EmExtraPhysics::ConstructProcess() G4GammaConversionToMuons* theGammaToMuMu = new G4GammaConversionToMuons(); theGammaToMuMu->SetCrossSecFactor(gmumuFactor); G4GammaGeneralProcess* sp = - (G4GammaGeneralProcess*)emManager->GetGammaGeneralProcess(); - if(sp) { + static_cast(emManager->GetGammaGeneralProcess()); + if(nullptr != sp) { sp->AddMMProcess(theGammaToMuMu); } else { ph->RegisterProcess(theGammaToMuMu, gamma); @@ -325,6 +332,9 @@ void G4EmExtraPhysics::ConstructProcess() G4AnnihiToMuPair* thePosiToMuMu = new G4AnnihiToMuPair(); thePosiToMuMu->SetCrossSecFactor(pmumuFactor); ph->RegisterProcess(thePosiToMuMu, positron); + G4AnnihiToMuPair* thePosiToTauTau = new G4AnnihiToMuPair("AnnihiToTauPair"); + thePosiToTauTau->SetCrossSecFactor(pmumuFactor); + ph->RegisterProcess(thePosiToTauTau, positron); } if(phadActivated) { G4eeToHadrons* thePosiToHadrons = new G4eeToHadrons(); @@ -336,20 +346,14 @@ void G4EmExtraPhysics::ConstructProcess() ph->RegisterProcess( theSynchRad, electron); ph->RegisterProcess( theSynchRad, positron); if(synActivatedForAll) { - auto myParticleIterator=GetParticleIterator(); - myParticleIterator->reset(); - G4ParticleDefinition* particle = nullptr; + ph->RegisterProcess( theSynchRad, muonplus); + ph->RegisterProcess( theSynchRad, muonminus); - while( (*myParticleIterator)() ) { - particle = myParticleIterator->value(); - if( particle->GetPDGStable() && particle->GetPDGCharge() != 0.0) { - if(verbose > 1) { - G4cout << "### G4SynchrotronRadiation for " - << particle->GetParticleName() << G4endl; - } - ph->RegisterProcess( theSynchRad, particle); - } - } + ph->RegisterProcess( theSynchRad, G4Proton::Proton()); + ph->RegisterProcess( theSynchRad, G4AntiProton::AntiProton()); + ph->RegisterProcess( theSynchRad, G4PionPlus::PionPlus()); + ph->RegisterProcess( theSynchRad, G4PionMinus::PionMinus()); + ph->RegisterProcess( theSynchRad, G4GenericIon::GenericIon()); } } if( fNuActivated ) @@ -444,11 +448,17 @@ void G4EmExtraPhysics::ConstructGammaElectroNuclear() G4LossTableManager* emManager = G4LossTableManager::Instance(); G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper(); - G4HadronInelasticProcess* gnuc = new G4HadronInelasticProcess( "photonNuclear", G4Gamma::Definition() ); - gnuc->AddDataSet( new G4PhotoNuclearCrossSection ); + G4HadronInelasticProcess* gnuc = new G4HadronInelasticProcess( "photonNuclear", G4Gamma::Gamma() ); + auto xsreg = G4CrossSectionDataSetRegistry::Instance(); + G4VCrossSectionDataSet* xs = nullptr; if(fUseGammaNuclearXS) { - gnuc->AddDataSet(new G4GammaNuclearXS()); + xs = xsreg->GetCrossSectionDataSet("GammaNuclearXS"); + if(nullptr == xs) xs = new G4GammaNuclearXS(); + } else { + xs = xsreg->GetCrossSectionDataSet("PhotoNuclearXS"); + if(nullptr == xs) xs = new G4PhotoNuclearCrossSection(); } + gnuc->AddDataSet(xs); G4QGSModel< G4GammaParticipants >* theStringModel = new G4QGSModel< G4GammaParticipants >; @@ -495,12 +505,14 @@ void G4EmExtraPhysics::ConstructGammaElectroNuclear() G4PositronNuclearProcess* pnuc = new G4PositronNuclearProcess; G4ElectroVDNuclearModel* eModel = new G4ElectroVDNuclearModel; + enuc->RegisterMe(eModel); + pnuc->RegisterMe(eModel); + G4GammaGeneralProcess* eproc = (G4GammaGeneralProcess*)emManager->GetElectronGeneralProcess(); if(eproc != nullptr) { eproc->AddHadProcess(enuc); } else { - enuc->RegisterMe(eModel); ph->RegisterProcess(enuc, G4Electron::Electron()); } @@ -509,8 +521,7 @@ void G4EmExtraPhysics::ConstructGammaElectroNuclear() if(pproc != nullptr) { pproc->AddHadProcess(pnuc); } else { - pnuc->RegisterMe(eModel); - ph->RegisterProcess(enuc, G4Positron::Positron()); + ph->RegisterProcess(pnuc, G4Positron::Positron()); } } } diff --git a/source/physics_lists/constructors/hadron_elastic/README b/source/physics_lists/constructors/hadron_elastic/README deleted file mode 100644 index 5ef90ee463..0000000000 --- a/source/physics_lists/constructors/hadron_elastic/README +++ /dev/null @@ -1,104 +0,0 @@ -------------------------------------------------------------------- - - - G4HadronElasticPhysics - ---------------------- - Hadron nuclear elastic process for all hadrons: - - proton - - cross section: Barashenkov-Glauber-Gribov - - final-state: Chips - - neutron: - - cross section: G4NeutronElasticXS - - final-state: Chips - - charged pions: - - cross section: Barashenkov-Glauber-Gribov - - final-state: Starkov's model (G4ElasticHadrNucleusHE) for all energies - - kaons, hyperons, anti-hyperons, charm and bottom hadrons - - cross section: Glauber-Gribov - - final-state: Gheisha - - deuteron, triton, He3, alpha - - cross section: Glauber-Gribov - - final-state: Gheisha - - anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3, - anti_alpha - - cross-section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: Galoyan-Uzhinsky model above 100 MeV/nucleon, - Gheisha below. - - G4HadronElasticPhysicsHP - ------------------------ - As G4HadronElasticPhysics, with the only difference that for neutrons - below 20 MeV, NeutronHP elastic is used (for both cross section and - final-state model). - - G4HadronElasticPhysicsLEND - -------------------------- - As G4HadronElasticPhysics, with the only difference that for neutrons - below 20 MeV, LEND elastic is used (for both cross section and - final-state model). - - G4HadronElasticPhysicsXS - ------------------------ - Now exactly as G4HadronElasticPhysics. - - G4HadronHElasticPhysics - ----------------------- - - proton - - cross section: Barashenkov-Glauber-Gribov - - final-state: Diffuse model, except for Hydrogen where Chips is used, - above 10 MeV, and Gheisha below - - neutron: - - cross section: G4NeutronElasticXS - - final-state: Diffuse model, except for Hydrogen where Chips is used, - above 10 MeV, and Gheisha below - - charged pions: - - cross section: Barashenkov-Glauber-Gribov - - final-state: Diffuse model, except for Hydrogen where Chips is used, - above 10 MeV, and Gheisha below - - kaons, hyperons, anti-hyperons, charm and bottom hadrons - - cross section: Glauber-Gribov - - final-state: Gheisha - - deuteron, triton, He3, alpha - - cross section: Glauber-Gribov - - final-state: Gheisha - - anti_proton, anti_neutron - - cross section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: Galoyan-Uzhinsky model above 100 MeV/nucleon, - Chips below. - - anti_deuteron, anti_triton, anti_He3, anti_alpha - - cross-section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: Galoyan-Uzhinsky model above 100 MeV/nucleon, - Gheisha below. - - G4IonElasticPhysics - ------------------- - As G4HadronElasticPhysics, with the addition of elastic process for - generic ion: - - cross section: Glauber-Gribov - - final-state: Diffuse model - - - G4HadronDElasticPhysics - ----------------------- - Hadron nuclear elastic process for all hadrons: - - proton and charged pions: - - cross section: Barashenkov-Glauber-Gribov - - final-state: Diffuse model where applicable, else Gheisha - - neutron: - - cross section: G4NeutronElasticXS - - final-state: Diffuse model where applicable, else Gheisha - - kaons, hyperons, anti-hyperons, charm and bottom hadrons, - deuteron, triton, He3, alpha - - cross section: Glauber-Gribov - - final-state: Gheisha - - anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3, - anti_alpha - - cross-section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: Galoyan-Uzhinsky model above 100 MeV/nucleon, - Gheisha below. - - G4ChargeExchangePhysics - ----------------------- - Hadron nuclear coherent charge exchange, used in this constructor - only for nucleons and charged pions. - diff --git a/source/physics_lists/constructors/hadron_inelastic/README b/source/physics_lists/constructors/hadron_inelastic/README deleted file mode 100644 index f9a4cd495c..0000000000 --- a/source/physics_lists/constructors/hadron_inelastic/README +++ /dev/null @@ -1,282 +0,0 @@ -------------------------------------------------------------------- - - - G4HadronInelasticQBBC - --------------------- - Hadron nuclear inelastic processes for all hadrons: - - proton inelastic: - - cross section: G4ParticleInelasticXS - - final-state: Fritiof coupled with Precompound/de-excitation (FTFP) above 3 GeV; - Bertini (BERT) between 1 and 6 GeV; - Binary coupled with Precompound/de-excitation (BIC) below 1.5 GeV - - neutron inelastic: - - cross section: G4NeutronInelasticXS - - final-state: FTFP > 3 GeV; 1 GeV < BERT < 6 GeV; BIC < 1.5 GeV - neutron capture: - - cross section: G4NeutronCaptureXS - - final-state: G4NeutronRadCapture - - charged pions inelastic: - - cross section: Barashenkov-Glauber-Gribov - - final-state: FTFP > 3 GeV; 1 GeV < BERT < 12 GeV; BIC < 1.5 GeV - - kaons inelastic: - - cross section: Glauber-Gribov - - final-state: FTFP > 3 GeV; BERT < 6 GeV - - hyperons inelastic: - - cross section: Glauber-Gribov - - final-state: FTFP > 3 GeV; BERT < 6 GeV - - anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3, anti_alpha inelastic: - - cross-section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: FTFP for all energies - - anti_hyperons inelastic: - - cross section: Glauber-Gribov - - final-state: FTFP for all energies - - charm and bottom hadrons inelastic: - - cross section: Glauber-Gribov - - final-state: FTFP for all energies - - - G4HadronPhysicsFTFP_BERT - ------------------------ - Hadron nuclear inelastic processes for all hadrons: - - proton inelastic: - - cross section: Barashenkov-Glauber-Gribov (G4BGGNucleonInelasticXS) - - final-state: FTFP > 3 GeV; BERT < 6 GeV - - neutron inelastic: - - cross section: G4NeutronInelasticXS - - final-state: FTFP > 3 GeV; BERT < 6 GeV - neutron capture: - - cross section: G4NeutronCaptureXS - - final-state: G4NeutronRadCapture - - charged pions inelastic: - - cross section: Barashenkov-Glauber-Gribov - - final-state: FTFP > 3 GeV; BERT < 6 GeV - - kaons inelastic: - - cross section: Glauber-Gribov - - final-state: FTFP > 3 GeV; BERT < 6 GeV - - hyperons inelastic: - - cross section: Glauber-Gribov - - final-state: FTFP > 3 GeV; BERT < 6 GeV - - anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3, anti_alpha inelastic: - - cross-section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: FTFP for all energies - - anti_hyperons inelastic: - - cross section: Glauber-Gribov - - final-state: FTFP for all energies - - charm and bottom hadrons inelastic: - - cross section: Glauber-Gribov - - final-state: FTFP for all energies - - - G4HadronPhysicsFTFP_BERT_ATL - ---------------------------- - Similar to G4HadronPhysicsFTFP_BERT, with the difference that for proton, - neutron, pions and kaons, the FTFP is used above 9 GeV and BERT below 12 GeV - (i.e. transition between these two models is in the interval [9, 12] GeV - for the most frequent hadrons). - - - G4HadronPhysicsFTFP_BERT_HP - -------------------------- - Similar to G4HadronPhysicsFTFP_BERT, but with a different treatment of - low-energy neutrons: - - neutron inelastic: use NeutronHP (for both cross section and final state) - below 20 MeV; above G4NeutronCaptureXS cross section; - final-state: BERT between 19.9 MeV and 6 GeV, - FTFP above 3 GeV. - - neutron capture: use NeutronHP (for both cross section and final state) - below 20 MeV; above G4NeutronCaptureXS cross section - and G4NeutronRadCapture final-state. - - neutron fission: use NeutronHP (for both cross section and final state) - below 20 MeV; above Gheisha (cross section and final state). - Moreover, RadioactiveDecay is activated (as in all the physics lists that use HP). - - - G4HadronPhysicsFTFP_BERT_TRV - ---------------------------- - The same as G4HadronPhysicsFTFP_BERT. - - - G4HadronPhysicsFTF_BIC - ---------------------- - Similar to G4HadronPhysicsFTFP_BERT, with the following differences: - - For proton and neutron, BIC is used (instead of BERT) below 6 GeV - - For pions, BIC is used below 1.5 GeV, whereas BERT is used in the - interval 1 GeV < BERT < 6 GeV - - FTF is coupled with BIC (instead of directly to Precompound/de-excitation). - - - G4HadronPhysicsQGS_BIC - ---------------------- - Similar to G4HadronPhysicsFTP_BIC, except that QGSP is used above 12 GeV - and FTFP below 25 GeV. - - - G4HadronPhysicsFTFQGSP_BERT - --------------------------- - Similar to G4HadronPhysicsFTFP_BERT, but with QGS fragmentation of strings - (instead of the Lund string fragmentation). - - - G4HadronPhysicsINCLXX - --------------------- - Similar to QGSP_BERT except for: - - proton inelastic: - - cross section: Barashenkov-Glauber-Gribov (G4BGGNucleonInelasticXS) - - final-state: QGSP > 15 GeV; 1 MeV < INCLXX < 20 GeV; Preco < 2 MeV - - neutron inelastic: - - cross section: G4NeutronInelasticXS - - final-state: QGSP > 15 GeV; 1 MeV < INCLXX < 20 GeV; Preco < 2 MeV - - charged pions inelastic: - - cross section: Barashenkov-Glauber-Gribov - - final-state: QGSP > 15 GeV; 1 MeV < INCLXX < 20 GeV; Preco < 2 MeV - - kaons inelastic: - - cross section: Glauber-Gribov - - final-state: QGSP > 14 GeV; BERT < 15 GeV - Note: it is possible to specify in the constructor the use of FTFP - instead of QGSP; - moreover, NeutronHP can also be activated in the constructor, - in which case inelastic, capture and fission below 20 MeV are - taken from NeutronHP (both cross section and final-state). - - - G4HadronPhysicsNuBeam - --------------------- - Similar to FTFP_BERT, except for the final-state models of proton: - - proton : QGSP with Lund string fragmentation > 100 GeV; - 3 GeV < FTFP < 101 GeV; BERT < 6 GeV - - - G4HadronPhysicsQGSP_BERT - ------------------------ - Hadron nuclear inelastic processes for all hadrons: - - proton inelastic: - - cross section: Barashenkov-Glauber-Gribov (G4BGGNucleonInelasticXS) - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV - - neutron inelastic: - - cross section: G4NeutronInelasticXS - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV - neutron capture: - - cross section: G4NeutronCaptureXS - - final-state: G4NeutronRadCapture - - charged pions inelastic: - - cross section: Barashenkov-Glauber-Gribov - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV - - kaons inelastic: - - cross section: Glauber-Gribov - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV - - hyperons inelastic: - - cross section: Glauber-Gribov - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV - - anti_proton and anti_neutron inelastic: - - cross-section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: QGSP > 12 GeV; FTFP < 25 GeV - - anti_deuteron, anti_triton, anti_He3, and anti_alpha inelastic: - - cross-section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: FTFP for all energies - - anti_hyperons inelastic: - - cross section: Glauber-Gribov - - final-state: QGSP > 12 GeV; FTFP < 25 GeV - - charm and bottom hadrons inelastic: - - cross section: Glauber-Gribov - - final-state: QGSP > 12 GeV; FTFP < 25 GeV - - -G4HadronPhysicsQGSP_FTFP_BERT - ----------------------------- - Currently it is the same as QGSP_BERT (this was not the case before G4 10.6). - It might be removed in future versions of Geant4. - - - G4HadronPhysicsQGSP_BERT_HP - --------------------------- - Similar to G4HadronPhysicsQGSP_BERT, but with a different treatment of - low-energy neutrons: - - neutron inelastic: use NeutronHP (for both cross section and final state) - below 20 MeV; above G4NeutronCaptureXS cross section; - final-state: BERT between 19.9 MeV and 6 GeV, - FTFP between 3 and 25 GeV, QGSP above 12 GeV. - - neutron capture: use NeutronHP (for both cross section and final state) - below 20 MeV; above G4NeutronCaptureXS cross section - and G4NeutronRadCapture final-state. - - neutron fission: use NeutronHP (for both cross section and final state) - below 20 MeV; above Gheisha (cross section and final state). - Moreover, RadioactiveDecay is activated (as in all the physics lists that use HP). - - - G4HadronPhysicsQGSP_BIC - ----------------------- - Hadron nuclear inelastic processes for all hadrons: - - proton inelastic: - - cross section: Barashenkov-Glauber-Gribov (G4BGGNucleonInelasticXS) - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BIC < 6 GeV - - neutron inelastic: - - cross section: G4NeutronInelasticXS - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BIC < 6 GeV - neutron capture: - - cross section: G4NeutronCaptureXS - - final-state: G4NeutronRadCapture - - charged pions inelastic: - - cross section: Barashenkov-Glauber-Gribov - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV - - kaons inelastic: - - cross section: Glauber-Gribov - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV - - hyperons inelastic: - - cross section: Glauber-Gribov - - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV - - anti_proton and anti_neutron inelastic: - - cross-section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: QGSP > 12 GeV; FTFP < 25 GeV - - anti_deuteron, anti_triton, anti_He3, and anti_alpha inelastic: - - cross-section: Galoyan-Uzhinsky-Glauber-Gribov - - final-state: FTFP for all energies - - anti_hyperons inelastic: - - cross section: Glauber-Gribov - - final-state: QGSP > 12 GeV; FTFP < 25 GeV - - - G4HadronPhysicsQGSP_BIC_HP - -------------------------- - Similar to G4HadronPhysicsQGSP_BIC, but with a different treatment of - low-energy neutrons: - - neutron inelastic: use NeutronHP (for both cross section and final state) - below 20 MeV; above G4NeutronCaptureXS cross section; - final-state: BIC between 19.9 MeV and 6 GeV, - FTFP between 3 and 25 GeV, QGSP above 12 GeV. - - neutron capture: use NeutronHP (for both cross section and final state) - below 20 MeV; above G4NeutronCaptureXS cross section - and G4NeutronRadCapture final-state. - - neutron fission: use NeutronHP (for both cross section and final state) - below 20 MeV; above Gheisha (cross section and final state). - Moreover, RadioactiveDecay is activated (as in all the physics lists that use HP). - - - G4HadronPhysicsQGSP_BIC_AllHP - ----------------------------- - Similar to G4HadronPhysicsQGSP_BIC_HP, but with a different treatment of - low-energy protons: - ParticleHP is used (for both cross section and final state) below 200 MeV; - above it: Barashenkov-Glauber-Gribov inelastic cross section; - final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; 190 MeV < BIC < 6 GeV. - - - G4HadronPhysicsShielding - ------------------------ - Similar to G4HadronPhysicsFTFP_BERT_HP except for using - JENDLHEInelasticCrossSection for the neutron inelastic cross section - above 20 MeV. - Note: the variant "M" of the Shielding physics list has a transition region - between FTFP and BERT for pions between 9.5 and 9.9 GeV - (instead of 3-6 GeV). - - - G4HadronPhysicsShieldingLEND - ---------------------------- - Similar to G4HadronPhysicsShielding, except that LEND is used for neutrons - below 20 MeV instead of NeutronHP. - - - G4VHadronPhysics - ---------------- - Utility class which provides useful methods. - diff --git a/source/physics_lists/constructors/ions/README b/source/physics_lists/constructors/ions/README deleted file mode 100644 index a2607937c2..0000000000 --- a/source/physics_lists/constructors/ions/README +++ /dev/null @@ -1,44 +0,0 @@ -------------------------------------------------------------------- - - - G4IonBinaryCascadePhysics - ------------------------- - Inelastic ion-ion processes (for deuteron, triton, He3, alpha and - generic ion projectiles), with Glauber-Gribov cross section and - Binary Light Ion (BIC, with Precompound/de-excitation) and Fritiof (FTF) - string model (with Precompound/de-excitation) for the final state. - BIC is used for projectiles of kinetic energies below 6 GeV/nucleon, and - FTF above 3 GeV/nucleon. - - G4IonINCLXXPhysics - ------------------ - Inelastic ion-ion processes (for deuteron, triton, He3, alpha and - generic ion projectiles), with Glauber-Gribov cross section and - INCLXX and FTFP for the final state. INCLXX is used below 3 GeV/nucleon, - and FTF above 2.9 GeV/nucleon. - - G4IonPhysics - ------------ - Currently equivalent to G4IonBinaryCascadePhysics. - - G4IonPhysicsXS - -------------- - As G4IonPhysics, except that for deuteron, triton, He3 and alpha - the corresponding G4ParticleInelasticXS cross section is used - (instead of G4ComponentGGNuclNuclXsc). - - G4IonPhysicsPHP - --------------- - Similar to G4IonBinaryCascadePhysics, except that ParticleHP (for both - cross sections and final states) is used below 200 MeV/n for deuteron, - triton, He3 and alpha (and BIC used above 190 MeV/n for these light ions). - - G4IonQMDPhysic - -------------- - Inelastic ion-ion processes (for deuteron, triton, He3, alpha and - generic ion projectiles), with Glauber-Gribov cross section and - BIC, QMD and FTFP for the final state. These three final-state models - are used in the following intervals of projectile kinetic energy: - - BIC below 110 MeV/nucleon; - - QMD between 100 and 6'000 MeV/nucleon; - - FTF above 5990 MeV/nucleon. diff --git a/source/physics_lists/constructors/limiters/README b/source/physics_lists/constructors/limiters/README deleted file mode 100644 index e3bd2c6c9a..0000000000 --- a/source/physics_lists/constructors/limiters/README +++ /dev/null @@ -1,72 +0,0 @@ - contructors/limiters - -------------------- - - This directory contains "technical" constructors in the sense they do not -add processes with physics content but add processes or modify physics lists to -allow for step limitation in parallel geometries, biasing, etc. - - -G4FastSimulationPhysics: ------------------------- - - Constructor that modifies a given physics list to allow for fast simulation. - - One, or several, G4FastSimulationManagerProcess objects are added to the - process manager of particles for which a fast simulation is requested. - - The fast simulation may be associated to regions in the mass geometry, in - what case a call like fastSimPhys->ActivateFastSimulation("e-") must be - done to allow for fast simulation of electrons. - Parallel geometries can be used also in what case the geometry is specified - by its name like fastSimPhys->ActivateFastSimulation("e-","parallelGeom") to - allow for fast simulation of electrons, with fast simulation models attached - to regions in "parallelGeom". - - -G4GenericBiasingPhysics: ------------------------- - - Constructor that modifies a given physics list to allow for generic biasing. - - It provides three type of functionnalities: - - wrap physics processes with G4BiasingProcessInterface processes to - make the generic biasing to control them (allowing change of - interaction law, change of final state generation). - - add G4BiasingProcessInterface processes, but without wrapping a - physics process, in what case these processes will be used for - "non-physics based biasing" : ie, spliting and killing - - add G4ParallelGeometriesLimiterProcess process (at most one per - process manager) that provides step limitation on the parallel - geometries used in generic biasing. A process can handle several - parallel geometries associated to one particle type. - - Various methods are provided to activate these functionnalities per - particle, set of particles, to activate physics-based only or - non-physics-based only or both functionnalities, and to activate the - parallel geometry functionnality. - This is documented in include/G4GenericBiasingPhysics.hh . - - -G4ImportanceBiasing: -------------------- - -G4MaxTimeCuts: --------------- - -G4MinEkineCuts: ---------------- - -G4NeutronTrackingCut: ---------------------- - -G4ParallelWorldPhysics: ------------------------ - -G4SpecialCuts: --------------- - -G4StepLimiterPhysics: ---------------------- - -G4WeightWindowBiasing: ----------------------- diff --git a/source/physics_lists/constructors/stopping/README b/source/physics_lists/constructors/stopping/README deleted file mode 100644 index ddc6be077f..0000000000 --- a/source/physics_lists/constructors/stopping/README +++ /dev/null @@ -1,19 +0,0 @@ -------------------------------------------------------------------- - - - G4StoppingPhysics - ----------------- - It uses Bertini/Precompound (i.e. Bertini followed by the official - Precompound/deexcitation of Geant4, not the internal one of Bertini) - for nuclear capture of: pi-, K-, Sigma-, Xi- and Omega-. - It uses Fritiof/Precompound model for nuclear capture of: anti_proton, - anti_neutron, anti_Lambda, anti_Sigma0, anti_Sigma+, anti_Xi0, - anti_deuteron, anti_triton, anti_He3, and anti_alpha. - For mu-, Bertini model is used for nuclear capture, together with - default element selector, EM cascade sampling and bound decay sampling. - - G4StoppingPhysicsFritiofWithBinaryCascade - ----------------------------------------- - The same as G4StoppingPhysics, except that for anti-proton and anti-neutron - annihilation at rest it uses Fritiof coupled with Binary Cascade. - diff --git a/source/physics_lists/lists/History b/source/physics_lists/lists/History index 352345e1ce..a6bd48b15b 100644 --- a/source/physics_lists/lists/History +++ b/source/physics_lists/lists/History @@ -13,6 +13,13 @@ introduced in the code and keeptrack of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +25-October-2021 B.Morgan (phys-lists-V10-07-10) +- Use G4StrUtil functions replacing deprecated G4String member functions + +25-August-2021 Dennis Wright (phys-lists-V10-07-09) +- LBE.cc: replace G4RadioactiveDecayBase with G4RadioactiveDecay + see top level History file + 28-April-2021 R. Hatcher (phys-lists-V10-07-08) - corresponding changes to G4PhysListFactoryAlt ctor to maintain drop-in compatibility with older factory. diff --git a/source/physics_lists/lists/include/INCLXXPhysicsListHelper.icc b/source/physics_lists/lists/include/INCLXXPhysicsListHelper.icc index caad685310..177165d29a 100644 --- a/source/physics_lists/lists/include/INCLXXPhysicsListHelper.icc +++ b/source/physics_lists/lists/include/INCLXXPhysicsListHelper.icc @@ -96,7 +96,7 @@ template TINCLXXPhysicsListHelperRegisterPhysics( new G4HadronElasticPhysics(ver) ); // Hadron Physics - this->RegisterPhysics( new G4HadronPhysicsINCLXX(ver,true,withNeutronHP,withFTFP)); + this->RegisterPhysics( new G4HadronPhysicsINCLXX(G4String(1,static_cast(ver)),true,withNeutronHP,withFTFP)); // Stopping Physics this->RegisterPhysics( new G4StoppingPhysics(ver) ); diff --git a/source/physics_lists/lists/src/LBE.cc b/source/physics_lists/lists/src/LBE.cc index 636b6abd54..86e8c83b02 100644 --- a/source/physics_lists/lists/src/LBE.cc +++ b/source/physics_lists/lists/src/LBE.cc @@ -874,7 +874,7 @@ LBE::~LBE() // Decays /////////////////////////////////////////////////////////////////// #include "G4Decay.hh" -#include "G4RadioactiveDecayBase.hh" +#include "G4RadioactiveDecay.hh" #include "G4IonTable.hh" #include "G4Ions.hh" @@ -908,7 +908,7 @@ LBE::~LBE() // Declare radioactive decay to the GenericIon in the IonTable. const G4IonTable *theIonTable = G4ParticleTable::GetParticleTable()->GetIonTable(); - G4RadioactiveDecayBase* theRadioactiveDecay = new G4RadioactiveDecayBase(); + G4RadioactiveDecay* theRadioactiveDecay = new G4RadioactiveDecay(); //Fix for activation of RadioactiveDecay, based on G4RadioactiveDecayPhysics G4EmParameters* param = G4EmParameters::Instance(); diff --git a/source/physics_lists/util/History b/source/physics_lists/util/History index 6064695d82..7a4bd39c25 100644 --- a/source/physics_lists/util/History +++ b/source/physics_lists/util/History @@ -13,6 +13,9 @@ introduced in the code and keeptrack of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +22-October-2021, Vladimir Ivanchenko (phys-util-V10-07-02) +- G4HadParticles - added hyper-nuclei + 16-April-2021 Ben Morgan (phys-util-V10-07-01) - Migrate build to modular CMake API diff --git a/source/physics_lists/util/include/G4HadParticles.hh b/source/physics_lists/util/include/G4HadParticles.hh index 340b4c478d..646581cb59 100644 --- a/source/physics_lists/util/include/G4HadParticles.hh +++ b/source/physics_lists/util/include/G4HadParticles.hh @@ -49,10 +49,13 @@ public: static const std::vector& GetBCHadrons(); static const std::vector& GetLightIons(); static const std::vector& GetLightAntiIons(); + static const std::vector& GetHyperNuclei(); + static const std::vector& GetHyperAntiNuclei(); // several vectors of PDG codes for EM physics static const std::vector& GetHeavyChargedParticles(); static const std::vector& GetBCChargedHadrons(); + static const std::vector& GetChargedHyperNuclei(); private: @@ -63,8 +66,11 @@ private: static const std::vector sBCHadrons; static const std::vector sLightIons; static const std::vector sLightAntiIons; + static const std::vector sHyperNuclei; + static const std::vector sHyperAntiNuclei; static const std::vector sHeavyChargedPart; static const std::vector sBCChargedHadrons; + static const std::vector sChargedHyperNuclei; }; #endif diff --git a/source/physics_lists/util/src/G4HadParticles.cc b/source/physics_lists/util/src/G4HadParticles.cc index f6fc76e6fd..76172a2519 100644 --- a/source/physics_lists/util/src/G4HadParticles.cc +++ b/source/physics_lists/util/src/G4HadParticles.cc @@ -81,7 +81,19 @@ const std::vector G4HadParticles::sLightAntiIons = { -2212, -2112, -1000010020, -1000010030, -1000020030, -1000020040 }; +// hyper_t, hyper_H4, hyper_He4, hyder_He5, 2-hyper-2n, 2-hyper_H4 +const std::vector G4HadParticles::sHyperNuclei = { + 1010010030, 1010010040, 1010020040, 1010020050, 1020000040, 1020010040 +}; + +// anti-hyper-nuclei +const std::vector G4HadParticles::sHyperAntiNuclei = { + -1010010030, -1010010040, -1010020040, -1010020050, -1020000040, -1020010040 +}; + +// // charged particles for EM physics +// const std::vector G4HadParticles::sHeavyChargedPart = { // Sigma+, Sigma-, Xi-, Omega-, anti_hyperons 3222, 3112, 3312, 3334, -3222, -3112, -3312, -3334, @@ -104,6 +116,12 @@ const std::vector G4HadParticles::sBCChargedHadrons = { -4122, -4222, -4212, -4232, -5222, -5112, -5132, -5332 }; +// hyper_t +const std::vector G4HadParticles::sChargedHyperNuclei = { + 1010010030, 1010010040, 1010020040, 1010020050, 1020010040, + -1010010030, -1010010040, -1010020040, -1010020050, -1020010040 +}; + const std::vector& G4HadParticles::GetLightHadrons() { return sLightHadrons; @@ -139,6 +157,16 @@ const std::vector& G4HadParticles::GetLightAntiIons() return sLightAntiIons; } +const std::vector& G4HadParticles::GetHyperNuclei() +{ + return sHyperNuclei; +} + +const std::vector& G4HadParticles::GetHyperAntiNuclei() +{ + return sHyperAntiNuclei; +} + const std::vector& G4HadParticles::GetHeavyChargedParticles() { return sHeavyChargedPart; @@ -148,3 +176,8 @@ const std::vector& G4HadParticles::GetBCChargedHadrons() { return sBCChargedHadrons; } + +const std::vector& G4HadParticles::GetChargedHyperNuclei() +{ + return sChargedHyperNuclei; +} diff --git a/source/processes/History b/source/processes/History index cad7a71892..7e572a8ef2 100644 --- a/source/processes/History +++ b/source/processes/History @@ -16,6 +16,15 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +October 25, 2021 (processes-V10-07-05) +- Use G4StrUtil functions replacing deprecated G4String member functions + +October 18, 2021 (processes-V10-07-04) +- Use std::string member functions from G4String in place of synonyms + +August 5, 2021 (processes-V10-07-03) +- Migration to the new version of G4PhysicsModelCatalog + April 18, 2021 (processes-V10-07-02) - Migrate main/orphaned processes categories to modular CMake API - EM/Hadronic/Biasing are to be handled in separate MRs diff --git a/source/processes/biasing/generic/History b/source/processes/biasing/generic/History index 9d527c1ec8..2cf50a0758 100644 --- a/source/processes/biasing/generic/History +++ b/source/processes/biasing/generic/History @@ -16,6 +16,10 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +August 4, 2021 A. Ribon +- G4BOptrForceCollision : migrated to the new version of G4PhysicsModelCatalog +- proc-biasgen-V10-07-01 + April 16th, 2021 B. Morgan - Migrate build to modular CMake API - proc-biasgen-V10-07-00 diff --git a/source/processes/biasing/generic/src/G4BOptrForceCollision.cc b/source/processes/biasing/generic/src/G4BOptrForceCollision.cc index 39576ce53d..f206871491 100644 --- a/source/processes/biasing/generic/src/G4BOptrForceCollision.cc +++ b/source/processes/biasing/generic/src/G4BOptrForceCollision.cc @@ -45,7 +45,7 @@ // -- §§ consider calling other constructor, thanks to C++11 G4BOptrForceCollision::G4BOptrForceCollision(G4String particleName, G4String name) : G4VBiasingOperator(name), - fForceCollisionModelID(-1), + fForceCollisionModelID(G4PhysicsModelCatalog::GetModelID("model_GenBiasForceCollision")), fCurrentTrack(nullptr), fCurrentTrackData(nullptr), fInitialTrackWeight(-1.0), @@ -69,7 +69,7 @@ G4BOptrForceCollision::G4BOptrForceCollision(G4String particleName, G4String nam G4BOptrForceCollision::G4BOptrForceCollision(const G4ParticleDefinition* particle, G4String name) : G4VBiasingOperator(name), - fForceCollisionModelID(-1), + fForceCollisionModelID(G4PhysicsModelCatalog::GetModelID("model_GenBiasForceCollision")), fCurrentTrack(nullptr), fCurrentTrackData(nullptr), fInitialTrackWeight(-1.0), @@ -93,9 +93,6 @@ G4BOptrForceCollision::~G4BOptrForceCollision() void G4BOptrForceCollision::Configure() { - // -- Create ID for force collision: - fForceCollisionModelID = G4PhysicsModelCatalog::Register("GenBiasForceCollision"); - // -- build free flight operations: ConfigureForWorker(); } @@ -106,9 +103,6 @@ void G4BOptrForceCollision::ConfigureForWorker() // -- start by remembering processes under biasing, and create needed biasing operations: if ( fSetup ) { - // -- get back ID created in master thread in case of MT (or reget just created ID in sequential mode): - fForceCollisionModelID = G4PhysicsModelCatalog::Register("GenBiasForceCollision"); - const G4ProcessManager* processManager = fParticleToBias->GetProcessManager(); const G4BiasingProcessSharedData* interfaceProcessSharedData = G4BiasingProcessInterface::GetSharedData( processManager ); if ( interfaceProcessSharedData ) // -- sharedData tested, as is can happen a user attaches an operator diff --git a/source/processes/cuts/History b/source/processes/cuts/History index 789588bc2f..eb1a0299f7 100644 --- a/source/processes/cuts/History +++ b/source/processes/cuts/History @@ -16,6 +16,27 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +October. 12th, 2021 - V.Ivanchenko (proccuts-V10-07-05) +- G4PhysicsTableHelper - fixed Coverity warning due to index type, + removed G4ThreadLocal variable, substitute old cerr by + G4Exception (old printouts are kept), removed unused headers +- G4MCCIndexConversionTable - changed inline functions -only one + return is left instead of two + +September. 1th, 2021 - V.Ivanchenko (proccuts-V10-07-04) +- G4VRangeToEnergyConverter, G4RToEConvForPositron, + G4RToEConvForElectron, G4RToEConvForGamma, G4RToEConvForProton + Simplified the design - do not use G4PhysicsTable and + G4PhysicsVector but convert range cut to production threshold + directly; expected memory reduction for big detectors and + some speed-up of initialisation + +July. 18th, 2021 - V.Ivanchenko (proccuts-V10-07-03) +- G4VRangeToEnergyConverter - updated interfaces to G4PhysicsVector + +July. 11th, 2021 - V.Ivanchenko (proccuts-V10-07-02) +- G4PhysicsTableHelper - fixed minor Coverity report + May. 26th, 2021 - V.Ivanchenko (proccuts-V10-07-01) - G4PhysicsTableHelper - updated interface to Retrieve(..) method diff --git a/source/processes/cuts/include/G4MCCIndexConversionTable.hh b/source/processes/cuts/include/G4MCCIndexConversionTable.hh index d4f0909944..f9b6411a60 100644 --- a/source/processes/cuts/include/G4MCCIndexConversionTable.hh +++ b/source/processes/cuts/include/G4MCCIndexConversionTable.hh @@ -81,32 +81,26 @@ class G4MCCIndexConversionTable inline G4bool G4MCCIndexConversionTable::IsUsed(std::size_t index) const { - if (index >= vecNewIndex.size()) return false; - // returns 'true' if the indicated MCC in the file // is used in the current production cut table - return (vecNewIndex[index] >= 0); + return ((index < vecNewIndex.size()) && (vecNewIndex[index] >= 0)); } inline void G4MCCIndexConversionTable::SetNewIndex(std::size_t index, std::size_t new_value) { - if (index >= vecNewIndex.size()) return; - // set the index in the current production cut table // for the indicated MCC in the file - vecNewIndex[index]=G4int(new_value); + if (index < vecNewIndex.size()) vecNewIndex[index] = new_value; } inline G4int G4MCCIndexConversionTable::GetIndex(std::size_t index) const { - if (index >= vecNewIndex.size()) return -1; - // get the index in the current production cut table // for the indicated MCC in the file - return (vecNewIndex[index]); + return (index < vecNewIndex.size()) ? vecNewIndex[index] : -1; } inline diff --git a/source/processes/cuts/include/G4PhysicsTableHelper.hh b/source/processes/cuts/include/G4PhysicsTableHelper.hh index 8e2a97f3ac..5a2dc7c694 100644 --- a/source/processes/cuts/include/G4PhysicsTableHelper.hh +++ b/source/processes/cuts/include/G4PhysicsTableHelper.hh @@ -35,13 +35,9 @@ #ifndef G4PhysicsTableHelper_hh #define G4PhysicsTableHelper_hh 1 -#include - #include "globals.hh" -#include "G4ios.hh" +#include "G4PhysicsVector.hh" #include "G4PhysicsTable.hh" -#include "G4MaterialCutsCouple.hh" -#include "G4Region.hh" class G4PhysicsTableHelper { @@ -78,7 +74,7 @@ class G4PhysicsTableHelper G4PhysicsTableHelper(); ~G4PhysicsTableHelper(); - static G4ThreadLocal G4int verboseLevel; + static G4int verboseLevel; // Control flag for output message }; diff --git a/source/processes/cuts/include/G4RToEConvForElectron.hh b/source/processes/cuts/include/G4RToEConvForElectron.hh index 5a482bc519..2137f44aa8 100644 --- a/source/processes/cuts/include/G4RToEConvForElectron.hh +++ b/source/processes/cuts/include/G4RToEConvForElectron.hh @@ -42,25 +42,16 @@ class G4RToEConvForElectron : public G4VRangeToEnergyConverter { - public: +public: - G4RToEConvForElectron(); - // Constructor + explicit G4RToEConvForElectron(); - virtual ~G4RToEConvForElectron(); - // Destructor + virtual ~G4RToEConvForElectron(); - protected: +protected: - virtual G4double ComputeLoss(G4double AtomicNumber, - G4double KineticEnergy); + G4double ComputeValue(const G4int Z, const G4double kinEnergy) final; - G4double Mass = 0.0; - G4double Z = -1.0; - G4double taul = 0.0; - G4double ionpot = 0.0; - G4double ionpotlog = -1.0e-10; - G4double bremfactor = 0.1; }; #endif diff --git a/source/processes/cuts/include/G4RToEConvForGamma.hh b/source/processes/cuts/include/G4RToEConvForGamma.hh index dadea5069b..2c495816de 100644 --- a/source/processes/cuts/include/G4RToEConvForGamma.hh +++ b/source/processes/cuts/include/G4RToEConvForGamma.hh @@ -34,62 +34,21 @@ #ifndef G4RToEConvForGamma_hh #define G4RToEConvForGamma_hh 1 -#include - #include "globals.hh" -#include "G4ios.hh" #include "G4VRangeToEnergyConverter.hh" class G4RToEConvForGamma : public G4VRangeToEnergyConverter { - public: +public: - G4RToEConvForGamma(); - // Constructor + explicit G4RToEConvForGamma(); - virtual ~G4RToEConvForGamma(); - // Destructor + virtual ~G4RToEConvForGamma(); - protected: +protected: - using G4CrossSectionTable = G4LossTable; + G4double ComputeValue(const G4int Z, const G4double kinEnergy) final; - virtual G4double ComputeLoss( G4double AtomicNumber, - G4double KineticEnergy ); - - virtual void BuildRangeVector( const G4Material* aMaterial, - G4RangeVector* rangeVector ); - // The Range Table - - void BuildAbsorptionLengthVector( const G4Material* aMaterial, - G4RangeVector* rangeVector ); - - G4double ComputeCrossSection( G4double AtomicNumber, - G4double KineticEnergy ); - - G4double Z = -1.0; - G4double s200keV = 0.0, s1keV = 0.0; - G4double tmin = 0.0, tlow = 0.0; - G4double smin = 0.0, slow = 0.0; - G4double cmin = 0.0, clow = 0.0, chigh = 0.0; }; -// ------------------ -// Inline methods -// ------------------ - -inline -G4double G4RToEConvForGamma::ComputeLoss(G4double AtomicNumber, - G4double KineticEnergy) -{ - return ComputeCrossSection(AtomicNumber,KineticEnergy); -} - -inline -void G4RToEConvForGamma::BuildRangeVector(const G4Material* aMaterial, - G4RangeVector* rangeVector) -{ - BuildAbsorptionLengthVector(aMaterial, rangeVector); -} - #endif diff --git a/source/processes/cuts/include/G4RToEConvForPositron.hh b/source/processes/cuts/include/G4RToEConvForPositron.hh index 1a8aefee71..0194f80927 100644 --- a/source/processes/cuts/include/G4RToEConvForPositron.hh +++ b/source/processes/cuts/include/G4RToEConvForPositron.hh @@ -34,33 +34,21 @@ #ifndef G4RToEConvForPositron_hh #define G4RToEConvForPositron_hh 1 -#include - #include "globals.hh" -#include "G4ios.hh" #include "G4VRangeToEnergyConverter.hh" class G4RToEConvForPositron : public G4VRangeToEnergyConverter { - public: +public: - G4RToEConvForPositron(); - // Constructor + explicit G4RToEConvForPositron(); virtual ~G4RToEConvForPositron(); - // Destructor - protected: +protected: - virtual G4double ComputeLoss(G4double AtomicNumber, - G4double KineticEnergy); + G4double ComputeValue(const G4int Z, const G4double kinEnergy) final; - G4double Mass = 0.0; - G4double Z = -1.0; - G4double taul = 0.0; - G4double ionpot = 0.0; - G4double ionpotlog = -1.0e-10; - G4double bremfactor = 0.1; }; diff --git a/source/processes/cuts/include/G4RToEConvForProton.hh b/source/processes/cuts/include/G4RToEConvForProton.hh index dafc7e27fd..6878f63f78 100644 --- a/source/processes/cuts/include/G4RToEConvForProton.hh +++ b/source/processes/cuts/include/G4RToEConvForProton.hh @@ -34,41 +34,24 @@ #ifndef G4RToEConvForProton_hh #define G4RToEConvForProton_hh 1 -#include - #include "globals.hh" -#include "G4ios.hh" #include "G4VRangeToEnergyConverter.hh" class G4RToEConvForProton : public G4VRangeToEnergyConverter { - public: +public: - G4RToEConvForProton(); - // Constructor + explicit G4RToEConvForProton(); - virtual ~G4RToEConvForProton(); - // Destructor + virtual ~G4RToEConvForProton(); - virtual G4double Convert(G4double rangeCut, const G4Material* material); + // Calculate energy cut from given range cut for the material + G4double Convert(const G4double rangeCut, const G4Material* material) final; - virtual void Reset(); - // Reset Loss Table and Range Vectors +protected: - protected: + G4double ComputeValue(const G4int Z, const G4double kinEnergy) final; - virtual G4double ComputeLoss(G4double AtomicNumber, - G4double KineticEnergy); - - G4double Mass = 0.0; - G4double Z = -1.0; - G4double tau0 = 0.0; - G4double taul = 0.0; - G4double taum = 0.0; - G4double ionpot = 0.0; - G4double ca = 0.0; - G4double cba = 0.0; - G4double cc = 0.0; }; #endif diff --git a/source/processes/cuts/include/G4VRangeToEnergyConverter.hh b/source/processes/cuts/include/G4VRangeToEnergyConverter.hh index 4db0f9a471..160adb3fb9 100644 --- a/source/processes/cuts/include/G4VRangeToEnergyConverter.hh +++ b/source/processes/cuts/include/G4VRangeToEnergyConverter.hh @@ -36,109 +36,87 @@ #ifndef G4VRangeToEnergyConverter_hh #define G4VRangeToEnergyConverter_hh 1 -#include #include #include "globals.hh" -#include "G4ios.hh" #include "G4ParticleDefinition.hh" -#include "G4PhysicsTable.hh" -#include "G4Element.hh" #include "G4Material.hh" - -class G4PhysicsLogVector; +#include "G4Threading.hh" class G4VRangeToEnergyConverter { - public: +public: - G4VRangeToEnergyConverter(); - // Constructor + explicit G4VRangeToEnergyConverter(); - G4VRangeToEnergyConverter(const G4VRangeToEnergyConverter& r); - // Copy constructor + virtual ~G4VRangeToEnergyConverter(); - G4VRangeToEnergyConverter& operator=(const G4VRangeToEnergyConverter &r); - // Assignment operator + // operators are not used + G4VRangeToEnergyConverter(const G4VRangeToEnergyConverter& r) = delete; + G4VRangeToEnergyConverter& operator= + (const G4VRangeToEnergyConverter &r) = delete; + G4bool operator==(const G4VRangeToEnergyConverter& r) const = delete; + G4bool operator!=(const G4VRangeToEnergyConverter& r) const = delete; - virtual ~G4VRangeToEnergyConverter(); - // Destructor + // Calculate energy cut from given range cut for the material + virtual G4double Convert(const G4double rangeCut, const G4Material* material); - G4bool operator==(const G4VRangeToEnergyConverter& r) const; - G4bool operator!=(const G4VRangeToEnergyConverter& r) const; - // Equality operators + // Set energy range for all particle type + // if highedge > 10 GeV, highedge value is not changed + static void SetEnergyRange(const G4double lowedge, const G4double highedge); - virtual G4double Convert(G4double rangeCut, const G4Material* material); - // Calculate energy cut from given range cut for the material + // Get energy range for all particle type + static G4double GetLowEdgeEnergy(); + static G4double GetHighEdgeEnergy(); - static void SetEnergyRange(G4double lowedge, G4double highedge); - // Set energy range for all particle type - - static G4double GetLowEdgeEnergy(); - static G4double GetHighEdgeEnergy(); - // Get energy range for all particle type - - static G4double GetMaxEnergyCut(); - static void SetMaxEnergyCut(G4double value); - // Get/set max cut energy for all particle type + // Get/set max cut energy for all particle type + // No check on the value + static G4double GetMaxEnergyCut(); + static void SetMaxEnergyCut(const G4double value); - inline const G4ParticleDefinition* GetParticleType() const; - // Return pointer to the particle type which this converter takes care of + // Return pointer to the particle type which this converter takes care of + inline const G4ParticleDefinition* GetParticleType() const; - const G4PhysicsTable* GetLossTable() const; - // theLossTable is a collection of loss vectors for all elements. - // Each loss vector has energy loss values (cross-section values - // for neutral particles) which are calculated by - // ComputeLoss(G4double AtomicNumber, G4double KineticEnergy). - // ComputeLoss method is pure virtual and should be provided - // for each particle type - - virtual void Reset(); - // Reset Loss Table and Range Vectors - - inline void SetVerboseLevel(G4int value); - inline G4int GetVerboseLevel() const; + inline void SetVerboseLevel(G4int value); + inline G4int GetVerboseLevel() const; // control flag for output message // 0: Silent // 1: Warning message // 2: More - protected: +protected: - virtual void BuildLossTable(); + virtual G4double ComputeValue(const G4int Z, const G4double kinEnergy) = 0; - virtual G4double ComputeLoss(G4double AtomicNumber, - G4double KineticEnergy) = 0; +private: - // ------------- Range Table -------------------------------------- + static void FillEnergyVector(const G4double emin, const G4double emax); - using G4LossVector = G4PhysicsLogVector; - using G4RangeVector = G4PhysicsLogVector; - using G4LossTable = G4PhysicsTable; + G4double ConvertForGamma(const G4double rangeCut, const G4Material* material); - virtual void BuildRangeVector(const G4Material* aMaterial, - G4RangeVector* rangeVector); + G4double ConvertForElectron(const G4double rangeCut, + const G4Material* material); - G4double ConvertCutToKineticEnergy(G4RangeVector* theRangeVector, - G4double theCutInLength, - std::size_t materialIndex ) const; - protected: + inline G4double LiniearInterpolation(const G4double e1, const G4double e2, + const G4double r1, const G4double r2, + const G4double r); - static G4double LowestEnergy, HighestEnergy; - static G4double MaxEnergyCut; - G4double fMaxEnergyCut = 0.0; - - const G4ParticleDefinition* theParticle = nullptr; - G4LossTable* theLossTable = nullptr; - G4int NumberOfElements = 0; - - const G4int TotBin = 300; +protected: - std::vector< G4RangeVector* > fRangeVectorStore; +#ifdef G4MULTITHREADED + static G4Mutex theMutex; +#endif - private: + static G4double Emin; + static G4double Emax; + static std::vector* Energy; + static G4int NbinPerDecade; + static G4int Nbin; - G4int verboseLevel = 1; + const G4ParticleDefinition* theParticle = nullptr; + + G4int fPDG = 0; + G4int verboseLevel = 1; }; // ------------------ @@ -163,4 +141,11 @@ const G4ParticleDefinition* G4VRangeToEnergyConverter::GetParticleType() const return theParticle; } +inline G4double G4VRangeToEnergyConverter::LiniearInterpolation( + const G4double e1, const G4double e2, + const G4double r1, const G4double r2, const G4double r) +{ + return (r1 == r2) ? e1 : e1 + (e2 - e1)*(r - r1)/(r2 - r1); +} + #endif diff --git a/source/processes/cuts/src/G4PhysicsTableHelper.cc b/source/processes/cuts/src/G4PhysicsTableHelper.cc index 7403d96d96..38a7a766a9 100644 --- a/source/processes/cuts/src/G4PhysicsTableHelper.cc +++ b/source/processes/cuts/src/G4PhysicsTableHelper.cc @@ -29,9 +29,12 @@ // -------------------------------------------------------------------- #include "G4PhysicsTableHelper.hh" -#include "G4ProductionCutsTable.hh" +#include "G4ProductionCutsTable.hh" +#include "G4MCCIndexConversionTable.hh" +#include "G4Threading.hh" +#include "G4ios.hh" -G4ThreadLocal G4int G4PhysicsTableHelper::verboseLevel = 1; +G4int G4PhysicsTableHelper::verboseLevel = 1; // -------------------------------------------------------------------- G4PhysicsTableHelper::G4PhysicsTableHelper() @@ -51,68 +54,47 @@ G4PhysicsTableHelper::PreparePhysicsTable(G4PhysicsTable* physTable) = G4ProductionCutsTable::GetProductionCutsTable(); std::size_t numberOfMCC = cutTable->GetTableSize(); - if ( physTable != nullptr) + if ( physTable != nullptr ) { // compare size of physics table and number of material-cuts-couple - if ( physTable->size() < numberOfMCC) + if ( physTable->size() < numberOfMCC ) { - // enlarge physics table - physTable->resize(numberOfMCC, nullptr); #ifdef G4VERBOSE if (verboseLevel>2) { - G4cerr << "G4PhysicsTableHelper::PreparePhysicsTable "; - G4cerr << "Physics Table "<< physTable ; - G4cerr << " is resized to " << numberOfMCC << G4endl; + G4cout << "G4PhysicsTableHelper::PreparePhysicsTable: " + << " the table " << physTable << " size=" + << physTable->size() + << " will be is resized to " << numberOfMCC << G4endl; } #endif + // enlarge physics table + physTable->resize(numberOfMCC, nullptr); } - else if ( physTable->size() > numberOfMCC) + else if ( physTable->size() > numberOfMCC ) { // ERROR: this situation should not occur - // size of physics table is shorter than number of material-cuts-couple - physTable->resize(numberOfMCC); -#ifdef G4VERBOSE - if (verboseLevel>0) - { - G4cerr << "G4PhysicsTableHelper::PreparePhysicsTable "; - G4cerr << "Physics Table "<< physTable ; - G4cerr << " is longer than number of material-cuts-couple " << G4endl; - } -#endif + // size of physics table is larger than number of material-cuts-couple + G4ExceptionDescription ed; + ed << "table " << physTable << " size=" << physTable->size() + << " is longer than number of material-cuts-couple " << numberOfMCC; G4Exception( "G4PhysicsTableHelper::PreparePhysicsTable()", - "ProcCuts001", FatalException, - "Physics Table is inconsistent with material-cuts-couple"); + "ProcCuts001", FatalException, ed); } } else { // create PhysicsTable is given poitner is null - physTable = new G4PhysicsTable(numberOfMCC); - if (physTable != nullptr) - { - physTable->resize(numberOfMCC, nullptr); - } - else - { - G4Exception( "G4PhysicsTableHelper::PreparePhysicsTable()", - "ProcCuts002", FatalException, - "Can't create Physics Table"); - } + physTable = new G4PhysicsTable(); + physTable->resize(numberOfMCC, nullptr); } #ifdef G4VERBOSE if (verboseLevel>2) { - if ( physTable != nullptr) - { - G4cerr << "Physics Table size "<< physTable->size(); - } - else - { - G4cerr << "Physics Table does not exist "; - } - G4cerr << ": number of material-cuts-couple " << numberOfMCC << G4endl; + G4cout << "G4PhysicsTableHelper::PreparePhysicsTable: " + << " the table "<< physTable + << " size=" << numberOfMCC << G4endl; } #endif @@ -145,16 +127,10 @@ G4bool G4PhysicsTableHelper::RetrievePhysicsTable(G4PhysicsTable* physTable, G4PhysicsTable* tempTable = new G4PhysicsTable(); if (! tempTable->RetrievePhysicsTable(fileName,ascii,spline) ) { -#ifdef G4VERBOSE - if (verboseLevel>1) - { - G4cerr << "G4PhysicsTableHelper::RetrievePhysicsTable "; - G4cerr << "Fail to retrieve from "<< fileName << G4endl; - } -#endif + G4ExceptionDescription ed; + ed << "Cannot retrieve physics table from the file <" << fileName << ">"; G4Exception( "G4ProductionCutsTable::RetrievePhysicsTable()", - "ProcCuts105", - JustWarning, "Can not retrieve physics tables from file"); + "ProcCuts105", JustWarning, ed); delete tempTable; return false; } @@ -167,20 +143,13 @@ G4bool G4PhysicsTableHelper::RetrievePhysicsTable(G4PhysicsTable* physTable, // check physics table size if ( tempTable->size() != converter->size()) { -#ifdef G4VERBOSE - if (verboseLevel>0) - { - G4cerr << "G4PhysicsTableHelper::RetrievePhysicsTable "; - G4cerr << "Size of the physics table in "<< fileName; - G4cerr << "( size =" << tempTable->size() << ")"; - G4cerr << " is inconsistent with material-cut info"; - G4cerr << "( size =" << converter->size() << ")"; - G4cerr << G4endl; - } -#endif + G4ExceptionDescription ed; + ed << "Physics table in " << fileName + << "\n size=" << tempTable->size() << " " + << " is inconsistent with material-cut-couple " + << "size=" << converter->size() << " the table is not retrieved!"; G4Exception("G4ProductionCutsTable::RetrievePhysicsTable()", - "ProcCuts106", JustWarning, - "Retrieved file is inconsistent with current physics tables!"); + "ProcCuts106", JustWarning, ed); delete tempTable; return false; } @@ -190,8 +159,13 @@ G4bool G4PhysicsTableHelper::RetrievePhysicsTable(G4PhysicsTable* physTable, { if (converter->IsUsed(idx)) { - if (converter->GetIndex(idx)<0) continue; - std::size_t i = converter->GetIndex(idx); + G4int i = converter->GetIndex(idx); + if(i < 0) + { + tempTable->clearAndDestroy(); + delete tempTable; + return false; + } G4PhysicsVector* vec = (*physTable)[i]; if (vec != nullptr ) delete vec; (*physTable)[i] = (*tempTable)[idx]; @@ -213,19 +187,13 @@ void G4PhysicsTableHelper::SetPhysicsVector(G4PhysicsTable* physTable, if ( physTable->size() <= idx) { -#ifdef G4VERBOSE - if (verboseLevel>0) - { - G4cerr << "G4PhysicsTableHelper::SetPhysicsVector "; - G4cerr << "Given index (" << idx << ") exceeds "; - G4cerr << "size of the physics table "; - G4cerr << "( size =" << physTable->size()<< ")"; - G4cerr << G4endl; - } -#endif + G4ExceptionDescription ed; + ed << "Given index (" << idx << ") exceeds " + << "the size of the physics table " + << "( size =" << physTable->size() << ") the vector is not added!"; G4Exception("G4ProductionCutsTable::SetPhysicsVector()", "ProcCuts107", - JustWarning, "Illegal index!"); + JustWarning, ed); return; } @@ -236,9 +204,9 @@ void G4PhysicsTableHelper::SetPhysicsVector(G4PhysicsTable* physTable, } // -------------------------------------------------------------------- -void G4PhysicsTableHelper::SetVerboseLevel(G4int value) +void G4PhysicsTableHelper::SetVerboseLevel(G4int value) { - verboseLevel = value; + if( !G4Threading::IsWorkerThread() ) verboseLevel = value; } // -------------------------------------------------------------------- diff --git a/source/processes/cuts/src/G4ProductionCutsTable.cc b/source/processes/cuts/src/G4ProductionCutsTable.cc index bfc75a2ca7..b23868d2e3 100644 --- a/source/processes/cuts/src/G4ProductionCutsTable.cc +++ b/source/processes/cuts/src/G4ProductionCutsTable.cc @@ -351,12 +351,7 @@ G4double G4ProductionCutsTable::ConvertRangeToEnergy( // -------------------------------------------------------------------- void G4ProductionCutsTable::ResetConverters() -{ - for(std::size_t i=0; i< NumberOfG4CutIndex; ++i) - { - if (converters[i]!=0) converters[i]->Reset(); - } -} +{} // -------------------------------------------------------------------- void G4ProductionCutsTable::SetEnergyRange(G4double lowedge, G4double highedge) diff --git a/source/processes/cuts/src/G4RToEConvForElectron.cc b/source/processes/cuts/src/G4RToEConvForElectron.cc index e904122ee0..d0c67bea67 100644 --- a/source/processes/cuts/src/G4RToEConvForElectron.cc +++ b/source/processes/cuts/src/G4RToEConvForElectron.cc @@ -31,12 +31,12 @@ #include "G4RToEConvForElectron.hh" #include "G4ParticleDefinition.hh" #include "G4ParticleTable.hh" -#include "G4Material.hh" -#include "G4PhysicsLogVector.hh" -#include "G4ios.hh" #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" +#include "G4Pow.hh" +#include "G4Log.hh" +#include "G4Exp.hh" // -------------------------------------------------------------------- G4RToEConvForElectron::G4RToEConvForElectron() @@ -55,35 +55,32 @@ G4RToEConvForElectron::G4RToEConvForElectron() } else { - Mass = theParticle->GetPDGMass(); + fPDG = theParticle->GetPDGEncoding(); } } // -------------------------------------------------------------------- -G4RToEConvForElectron::~G4RToEConvForElectron() -{ -} +G4RToEConvForElectron::~G4RToEConvForElectron() +{} -// *********************************************************************** -// ************************** ComputeLoss ******************************** -// *********************************************************************** -G4double G4RToEConvForElectron::ComputeLoss(G4double AtomicNumber, - G4double KineticEnergy) +// -------------------------------------------------------------------- +G4double G4RToEConvForElectron::ComputeValue(const G4int Z, + const G4double kinEnergy) { const G4double cbr1=0.02, cbr2=-5.7e-5, cbr3=1., cbr4=0.072; - const G4double Tlow=10.*keV, Thigh=1.*GeV; + const G4double Tlow=10.*CLHEP::keV, Thigh=1.*CLHEP::GeV; + const G4double taul = Tlow/CLHEP::electron_mass_c2; + const G4double log05 = G4Log(0.5); + const G4double taul12 = std::sqrt(taul); + const G4double bremfactor = 0.1; - // calculate dE/dx for electrons - if( std::fabs(AtomicNumber-Z)>0.1 ) - { - Z = AtomicNumber; - taul = Tlow/Mass; - ionpot = 1.6e-5*MeV*std::exp(0.9*std::log(Z))/Mass; - ionpotlog = std::log(ionpot); - } + const G4double Zlog = G4Pow::GetInstance()->logZ(Z); + const G4double ionpot = + 1.6e-5*CLHEP::MeV*G4Exp(0.9*Zlog)/CLHEP::electron_mass_c2; + const G4double ionpotlog = G4Log(ionpot); - G4double tau = KineticEnergy/Mass; - G4double dEdx; + const G4double tau = kinEnergy/CLHEP::electron_mass_c2; + G4double dEdx = 0.0; if(tauGetElementVector(); - const G4double* atomicNumDensityVector - = aMaterial->GetAtomicNumDensityVector(); - - // fill absorption length vector - G4int NumEl = aMaterial->GetNumberOfElements(); - G4double absorptionLengthMax = 0.0; - for (std::size_t ibin=0; ibinGetIndex(); - SIGMA += atomicNumDensityVector[iel] - * (*((*aCrossSectionTable)[IndEl]))[ibin]; - } - // absorption length=5./SIGMA - absorptionLengthVector->PutValue(ibin, 5./SIGMA); - if (absorptionLengthMax < 5./SIGMA ) - absorptionLengthMax = 5./SIGMA; + fPDG = theParticle->GetPDGEncoding(); } } -// *********************************************************************** -// ********************** ComputeCrossSection **************************** -// *********************************************************************** -G4double G4RToEConvForGamma::ComputeCrossSection(G4double AtomicNumber, - G4double KineticEnergy) +// -------------------------------------------------------------------- +G4RToEConvForGamma::~G4RToEConvForGamma() +{} + +// -------------------------------------------------------------------- +G4double G4RToEConvForGamma::ComputeValue(const G4int Z, + const G4double energy) { // Compute the "absorption" cross-section of the photon "absorption". // Cross-section means here the sum of the cross-sections of the // pair production, Compton scattering and photoelectric processes - const G4double t1keV = 1.*keV; - const G4double t200keV = 200.*keV; - const G4double t100MeV = 100.*MeV; + const G4double t1keV = 1.*CLHEP::keV; + const G4double t200keV = 200.*CLHEP::keV; + const G4double t100MeV = 100.*CLHEP::MeV; - // Compute Z dependent quantities in the case of a new AtomicNumber - if(std::abs(AtomicNumber-Z)>0.1) - { - Z = AtomicNumber; - G4double Zsquare = Z*Z; - G4double Zlog = std::log(Z); - G4double Zlogsquare = Zlog*Zlog; + G4double Zsquare = Z*Z; + G4double Zlog = G4Pow::GetInstance()->logZ(Z); + G4double Zlogsquare = Zlog*Zlog; - s200keV = (0.2651-0.1501*Zlog+0.02283*Zlogsquare)*Zsquare; - tmin = (0.552+218.5/Z+557.17/Zsquare)*MeV; - smin = (0.01239+0.005585*Zlog-0.000923*Zlogsquare)*std::exp(1.5*Zlog); - cmin = std::log(s200keV/smin) - /(std::log(tmin/t200keV)*std::log(tmin/t200keV)); - tlow = 0.2*std::exp(-7.355/std::sqrt(Z))*MeV; - slow = s200keV - * std::exp(0.042*Z*std::log(t200keV/tlow)*std::log(t200keV/tlow)); - s1keV = 300.*Zsquare; - clow = std::log(s1keV/slow)/std::log(tlow/t1keV); - chigh = (7.55e-5-0.0542e-5*Z)*Zsquare*Z/std::log(t100MeV/tmin); - } + G4double tmin = (0.552+218.5/Z+557.17/Zsquare)*CLHEP::MeV; + G4double tlow = 0.2*G4Exp(-7.355/std::sqrt(Z))*CLHEP::MeV; + + G4double smin = (0.01239+0.005585*Zlog-0.000923*Zlogsquare)*G4Exp(1.5*Zlog); + G4double s200keV = (0.2651-0.1501*Zlog+0.02283*Zlogsquare)*Zsquare; + + G4double cminlog = G4Log(tmin/t200keV); + G4double cmin = G4Log(s200keV/smin)/(cminlog*cminlog); + + G4double slowlog = G4Log(t200keV/tlow); + G4double slow = s200keV * G4Exp(0.042*Z*slowlog*slowlog); + G4double logtlow = G4Log(tlow/t1keV); + G4double clow = G4Log(300.*Zsquare/slow)/logtlow; + G4double chigh = (7.55e-5 - 0.0542e-5*Z)*Zsquare*Z/G4Log(t100MeV/tmin); // Calculate the cross-section (using an approximate empirical formula) G4double xs; - if ( KineticEnergyGetPDGMass(); + fPDG = theParticle->GetPDGEncoding(); } } // -------------------------------------------------------------------- -G4RToEConvForPositron::~G4RToEConvForPositron() -{ -} +G4RToEConvForPositron::~G4RToEConvForPositron() +{} -// ********************************************************************** -// ************************* ComputeLoss ******************************** -// ********************************************************************** -G4double G4RToEConvForPositron::ComputeLoss(G4double AtomicNumber, - G4double KineticEnergy) +// -------------------------------------------------------------------- +G4double G4RToEConvForPositron::ComputeValue(const G4int Z, + const G4double kinEnergy) { const G4double cbr1=0.02, cbr2=-5.7e-5, cbr3=1., cbr4=0.072; - const G4double Tlow=10.*keV, Thigh=1.*GeV; + const G4double Tlow=10.*CLHEP::keV, Thigh=1.*CLHEP::GeV; + const G4double taul = Tlow/CLHEP::electron_mass_c2; + const G4double logtaul = G4Log(taul); + const G4double taul12 = std::sqrt(taul); + const G4double bremfactor = 0.1; - // calculate dE/dx for electrons - if( std::fabs(AtomicNumber-Z)>0.1 ) - { - Z = AtomicNumber; - taul = Tlow/Mass; - ionpot = 1.6e-5*MeV*std::exp(0.9*std::log(Z))/Mass; - ionpotlog = std::log(ionpot); - } + G4double Zlog = G4Pow::GetInstance()->logZ(Z); + G4double ionpot = + 1.6e-5*CLHEP::MeV*G4Exp(0.9*Zlog)/CLHEP::electron_mass_c2; + G4double ionpotlog = G4Log(ionpot); + + G4double tau = kinEnergy/CLHEP::electron_mass_c2; + G4double dEdx = 0.0; - G4double tau = KineticEnergy/Mass; - G4double dEdx; if(tauGetPDGMass(); - } + fPDG = theParticle->GetPDGEncoding(); + } } // -------------------------------------------------------------------- G4RToEConvForProton::~G4RToEConvForProton() -{ +{} + +// -------------------------------------------------------------------- +G4double G4RToEConvForProton::Convert(const G4double rangeCut, + const G4Material* ) +{ +#ifdef G4VERBOSE + if (GetVerboseLevel()>3) + { + G4cout << "G4RToEConvForProton::Convert() - "; + G4cout << " with Range Cut " << rangeCut/mm << "[mm]" << G4endl; + } +#endif + // Simple formula - range = Ekin/(100*keV)*(1*mm); + return (rangeCut/(1.0*CLHEP::mm)) * (100.0*CLHEP::keV); } // -------------------------------------------------------------------- -G4double G4RToEConvForProton::Convert(G4double rangeCut, const G4Material* ) +G4double G4RToEConvForProton::ComputeValue(const G4int, const G4double) { - // Simple formula - range = Ekin/(100*keV)*(1*mm); - - return (rangeCut/(1.0*mm)) * (100.0*keV); + return 0.0; } -// ********************************************************************** -// ************************* ComputeLoss ******************************** -// ********************************************************************** -G4double G4RToEConvForProton::ComputeLoss(G4double AtomicNumber, - G4double KineticEnergy) -{ - // calculate dE/dx - const G4double z2Particle = 1.0; - - if( std::fabs(AtomicNumber-Z)>0.1 ) - { - // recalculate constants - Z = AtomicNumber; - G4double Z13 = std::exp(std::log(Z)/3.); - tau0 = 0.1*Z13*MeV/proton_mass_c2; - taum = 0.035*Z13*MeV/proton_mass_c2; - taul = 2.*MeV/proton_mass_c2; - ionpot = 1.6e-5*MeV*std::exp(0.9*std::log(Z)); - cc = (taul+1.)*(taul+1.)*std::log(2.*electron_mass_c2*taul*(taul+2.)/ionpot) - / (taul*(taul+2.))-1.; - cc = 2.*twopi_mc2_rcl2*Z*cc*std::sqrt(taul); - ca = cc/((1.-0.5*std::sqrt(tau0/taum))*tau0); - cba = -0.5/std::sqrt(taum); - } - - G4double tau = KineticEnergy/Mass; - G4double dEdx; - if ( tau <= tau0 ) - { - dEdx = ca*(std::sqrt(tau)+cba*tau); - } - else - { - if( tau <= taul ) - { - dEdx = cc/std::sqrt(tau); - } - else - { - dEdx = (tau+1.)*(tau+1.) - * std::log(2.*electron_mass_c2*tau*(tau+2.)/ionpot) - / (tau*(tau+2.))-1.; - dEdx = 2.*twopi_mc2_rcl2*Z*dEdx; - } - } - return dEdx*z2Particle ; -} - -// ********************************************************************** -// ************************* Reset ******************************** -// ********************************************************************** -void G4RToEConvForProton::Reset() -{ - // do nothing because loss tables and range vectors are not used - - return; -} +// -------------------------------------------------------------------- diff --git a/source/processes/cuts/src/G4VRangeToEnergyConverter.cc b/source/processes/cuts/src/G4VRangeToEnergyConverter.cc index e2af01caac..746b767b9d 100644 --- a/source/processes/cuts/src/G4VRangeToEnergyConverter.cc +++ b/source/processes/cuts/src/G4VRangeToEnergyConverter.cc @@ -30,443 +30,218 @@ #include "G4VRangeToEnergyConverter.hh" #include "G4ParticleTable.hh" -#include "G4Material.hh" -#include "G4MaterialTable.hh" -#include "G4PhysicsLogVector.hh" - -#include "G4ios.hh" +#include "G4Element.hh" #include "G4SystemOfUnits.hh" +#include "G4Log.hh" +#include "G4Exp.hh" -G4double G4VRangeToEnergyConverter::LowestEnergy = 0.99e-3*MeV; -G4double G4VRangeToEnergyConverter::HighestEnergy = 100.0e6*MeV; -G4double G4VRangeToEnergyConverter::MaxEnergyCut = 10.0*GeV; +#ifdef G4MULTITHREADED +G4Mutex G4VRangeToEnergyConverter::theMutex = G4MUTEX_INITIALIZER; +#endif + +G4double G4VRangeToEnergyConverter::Emin = 0.0; +G4double G4VRangeToEnergyConverter::Emax = 0.0; + +std::vector* G4VRangeToEnergyConverter::Energy = nullptr; + +G4int G4VRangeToEnergyConverter::NbinPerDecade = 50; +G4int G4VRangeToEnergyConverter::Nbin = 350; // -------------------------------------------------------------------- G4VRangeToEnergyConverter::G4VRangeToEnergyConverter() { -} - -// -------------------------------------------------------------------- -G4VRangeToEnergyConverter:: -G4VRangeToEnergyConverter(const G4VRangeToEnergyConverter& right) -{ - *this = right; -} - -// -------------------------------------------------------------------- -G4VRangeToEnergyConverter& -G4VRangeToEnergyConverter::operator=(const G4VRangeToEnergyConverter& right) -{ - if (this == &right) return *this; - - if (theLossTable != nullptr) + if(nullptr == Energy) { - theLossTable->clearAndDestroy(); - delete theLossTable; + Energy = new std::vector(Nbin + 1); + FillEnergyVector(1*CLHEP::keV, 10.0*CLHEP::GeV); } - - fMaxEnergyCut = right.fMaxEnergyCut; - NumberOfElements = right.NumberOfElements; - theParticle = right.theParticle; - verboseLevel = right.verboseLevel; - - // create the loss table - theLossTable = new G4LossTable(); - theLossTable->reserve(G4Element::GetNumberOfElements()); - // fill the loss table - for (std::size_t j=0; jPutValue(i,Value); - } - theLossTable->insert(aVector); - } - - // clean up range vector store - for (std::size_t idx=0; idxPutValue(i,Value); - } - } - fRangeVectorStore.push_back(rangeVector); - } - return *this; } // -------------------------------------------------------------------- G4VRangeToEnergyConverter::~G4VRangeToEnergyConverter() -{ - Reset(); +{ + if(nullptr != Energy) + { + delete Energy; + Energy = nullptr; + } } // -------------------------------------------------------------------- -G4bool -G4VRangeToEnergyConverter::operator==(const G4VRangeToEnergyConverter& r) const -{ - return this == &r; -} - -// -------------------------------------------------------------------- -G4bool -G4VRangeToEnergyConverter::operator!=(const G4VRangeToEnergyConverter &r) const -{ - return this != &r; -} - -// ********************************************************************** -// ************************* Convert *********************************** -// ********************************************************************** -G4double G4VRangeToEnergyConverter::Convert(G4double rangeCut, +G4double G4VRangeToEnergyConverter::Convert(const G4double rangeCut, const G4Material* material) { #ifdef G4VERBOSE - if (GetVerboseLevel()>3) - { - G4cout << "G4VRangeToEnergyConverter::Convert() - "; - G4cout << "Convert for " << material->GetName() - << " with Range Cut " << rangeCut/mm << "[mm]" << G4endl; - } + if (GetVerboseLevel()>3) + { + G4cout << "G4VRangeToEnergyConverter::Convert() - "; + G4cout << "Convert for " << material->GetName() + << " with Range Cut " << rangeCut/mm << "[mm]" << G4endl; + } #endif - G4double theKineticEnergyCuts = 0.; - - if (fMaxEnergyCut != MaxEnergyCut) - { - fMaxEnergyCut = MaxEnergyCut; - // clear loss table and range vectors - Reset(); + G4double cut = 0.0; + if(fPDG == 22) + { + cut = ConvertForGamma(rangeCut, material); } - - // Build the energy loss table - BuildLossTable(); - - // Build range vector for every material, convert cut into energy-cut, - // fill theKineticEnergyCuts and delete the range vector - static const G4double tune = 0.025*mm*g/cm3, lowen = 30.*keV ; - - // check density - G4double density = material->GetDensity() ; - if(density <= 0.) + else { -#ifdef G4VERBOSE - if (GetVerboseLevel()>0) + cut = ConvertForElectron(rangeCut, material); + + const G4double tune = 0.025*CLHEP::mm*CLHEP::g/CLHEP::cm3; + const G4double lowen = 30.*CLHEP::keV; + if(cut < lowen) { - G4cout << "G4VRangeToEnergyConverter::Convert() - "; - G4cout << material->GetName() << "has zero density " - << "( " << density << ")" << G4endl; + // corr. should be switched on smoothly + cut /= (1.+(1.-cut/lowen)*tune/(rangeCut*material->GetDensity())); } -#endif - return 0.; - } - - // initialise RangeVectorStore - const G4MaterialTable* table = G4Material::GetMaterialTable(); - G4int ext_size = table->size() - fRangeVectorStore.size(); - for (G4int i=0; iGetIndex(); - G4RangeVector* rangeVector = fRangeVectorStore.at(idx); - if (rangeVector == nullptr) - { - rangeVector = new G4RangeVector(LowestEnergy, MaxEnergyCut, TotBin); - BuildRangeVector(material, rangeVector); - fRangeVectorStore.at(idx) = rangeVector; } - // Convert Range Cut ro Kinetic Energy Cut - theKineticEnergyCuts = ConvertCutToKineticEnergy(rangeVector, rangeCut, idx); - - if( ((theParticle->GetParticleName()=="e-") - ||(theParticle->GetParticleName()=="e+")) - &&(theKineticEnergyCuts < lowen) ) - { - // corr. should be switched on smoothly - theKineticEnergyCuts /= (1.+(1.-theKineticEnergyCuts/lowen) - * tune/(rangeCut*density)); - } - - if(theKineticEnergyCuts < LowestEnergy) - { - theKineticEnergyCuts = LowestEnergy; - } - else if(theKineticEnergyCuts > MaxEnergyCut) - { - theKineticEnergyCuts = MaxEnergyCut; - } - - return theKineticEnergyCuts; + cut = std::max(Emin, std::min(cut, Emax)); + return cut; } -// ********************************************************************** -// ************************ SetEnergyRange ***************************** -// ********************************************************************** -void G4VRangeToEnergyConverter::SetEnergyRange(G4double lowedge, - G4double highedge) +// -------------------------------------------------------------------- +void G4VRangeToEnergyConverter::SetEnergyRange(const G4double lowedge, + const G4double highedge) { - // check LowestEnergy/ HighestEnergy - if ( (lowedge<0.0)||(highedge<=lowedge) ) + G4double ehigh = std::min(Emax, highedge); + if(ehigh > lowedge) { -#ifdef G4VERBOSE - G4cerr << "Error in G4VRangeToEnergyConverter::SetEnergyRange()"; - G4cerr << ": illegal energy range" << "(" << lowedge/GeV; - G4cerr << "," << highedge/GeV << ") [GeV]" << G4endl; -#endif - G4Exception( "G4VRangeToEnergyConverter::SetEnergyRange()", - "ProcCuts101", JustWarning, "Illegal energy range"); - } - else - { - LowestEnergy = lowedge; - HighestEnergy = highedge; - } + FillEnergyVector(lowedge, ehigh); + } } // -------------------------------------------------------------------- G4double G4VRangeToEnergyConverter::GetLowEdgeEnergy() { - return LowestEnergy; + return Emin; } // -------------------------------------------------------------------- G4double G4VRangeToEnergyConverter::GetHighEdgeEnergy() { - return HighestEnergy; -} - -// ********************************************************************** -// ******************* Get/SetMaxEnergyCut ***************************** -// ********************************************************************** -G4double G4VRangeToEnergyConverter::GetMaxEnergyCut() -{ - return MaxEnergyCut; + return Emax; } // -------------------------------------------------------------------- -void G4VRangeToEnergyConverter::SetMaxEnergyCut(G4double value) + +G4double G4VRangeToEnergyConverter::GetMaxEnergyCut() { - MaxEnergyCut = value; + return Emax; } -// ********************************************************************** -// ************************ Reset ************************************** -// ********************************************************************** -void G4VRangeToEnergyConverter::Reset() +// -------------------------------------------------------------------- +void G4VRangeToEnergyConverter::SetMaxEnergyCut(const G4double value) { - // delete loss table - if (theLossTable != nullptr) - { - theLossTable->clearAndDestroy(); - delete theLossTable; - } - theLossTable = nullptr; - NumberOfElements = 0; - - // clear RangeVectorStore - for (std::size_t idx=0; idx Emin) { - delete fRangeVectorStore.at(idx); + FillEnergyVector(Emin, value); } - fRangeVectorStore.clear(); -} +} -// ********************************************************************** -// ************************ BuildLossTable ****************************** -// ********************************************************************** -void G4VRangeToEnergyConverter::BuildLossTable() +// -------------------------------------------------------------------- +void G4VRangeToEnergyConverter::FillEnergyVector(const G4double emin, + const G4double emax) { - // Create Energy Loss Table for charged particles - // (cross-section table for neutral) - - if (std::size_t(NumberOfElements) == G4Element::GetNumberOfElements()) return; - - // clear Loss table and Range vectors - Reset(); - - // Build dE/dx tables for elements - NumberOfElements = G4Element::GetNumberOfElements(); - theLossTable = new G4LossTable(); - theLossTable->reserve(G4Element::GetNumberOfElements()); -#ifdef G4VERBOSE - if (GetVerboseLevel()>3) - { - G4cout << "G4VRangeToEnergyConverter::BuildLossTable() - "; - G4cout << "Create theLossTable[" << theLossTable << "]"; - G4cout << " NumberOfElements=" << NumberOfElements << G4endl; - } + if(emin == Emin && emax == Emax) { return; } +#ifdef G4MULTITHREADED + G4MUTEXLOCK(&theMutex); + if(emin == Emin && emax == Emax) { return; } #endif - - // fill the loss table - for (std::size_t j=0; j(std::log10(emax/emin)); + Energy->resize(Nbin + 1); + (*Energy)[0] = emin; + (*Energy)[Nbin] = emax; + G4double fact = G4Log(emax/emin)/Nbin; + for(G4int i=1; iGetZ(), - aVector->Energy(i) ); - aVector->PutValue(i,Value); - } - theLossTable->insert(aVector); + (*Energy)[i] = emin*G4Exp(i * fact); } +#ifdef G4MULTITHREADED + G4MUTEXUNLOCK(&theMutex); +#endif } -// ********************************************************************** -// ************************ BuildRangeVector **************************** -// ********************************************************************** -void G4VRangeToEnergyConverter::BuildRangeVector(const G4Material* aMaterial, - G4PhysicsLogVector* rangeVector) +// -------------------------------------------------------------------- +G4double +G4VRangeToEnergyConverter::ConvertForGamma(const G4double rangeCut, + const G4Material* material) { - // create range vector for a material + const G4ElementVector* elm = material->GetElementVector(); + const G4double* dens = material->GetAtomicNumDensityVector(); - const G4ElementVector* elementVector - = aMaterial->GetElementVector(); - const G4double* atomicNumDensityVector - = aMaterial->GetAtomicNumDensityVector(); - G4int NumEl = aMaterial->GetNumberOfElements(); - - // calculate parameters of the low energy part first - std::size_t i; - std::vector lossV; - for ( std::size_t ib=0; ib<=std::size_t(TotBin); ++ib) + // fill absorption length vector + G4int nelm = material->GetNumberOfElements(); + G4double range1 = 0.0; + G4double range2 = 0.0; + G4double e1 = 0.0; + G4double e2 = 0.0; + for (G4int i=0; iGetIndex(); - loss += atomicNumDensityVector[i]* - (*((*theLossTable)[IndEl]))[ib]; - } - lossV.push_back(loss); - } - - // Integrate with Simpson formula with logarithmic binning - G4double dltau = 1.0; - if (LowestEnergy>0.) - { - G4double ltt =std::log(MaxEnergyCut/LowestEnergy); - dltau = ltt/TotBin; - } - - G4double s0 = 0.; - G4double Value; - for ( i=0; i<=std::size_t(TotBin); ++i ) - { - G4double t = rangeVector->GetLowEdgeEnergy(i); - G4double q = t/lossV[i]; - if (i==0) s0 += 0.5*q; - else s0 += q; + e2 = (*Energy)[i]; + G4double sig = 0.; - if (i==0) + for (G4int j=0; jGetZasInt(), e2); + } + range2 = (sig > 0.0) ? 5./sig : DBL_MAX; + if(i == 0 || range2 < rangeCut) + { + e1 = e2; + range1 = range2; } else { - Value = (s0 - 0.5*q)*dltau ; - } - rangeVector->PutValue(i,Value); - } -} - -// ********************************************************************** -// ****************** ConvertCutToKineticEnergy ************************* -// ********************************************************************** -G4double G4VRangeToEnergyConverter::ConvertCutToKineticEnergy( - G4RangeVector* rangeVector, - G4double theCutInLength, -#ifdef G4VERBOSE - std::size_t materialIndex -#else - std::size_t -#endif - ) const -{ - const G4double epsilon = 0.01; - - // find max. range and the corresponding energy (rmax,Tmax) - G4double rmax= -1.e10*mm; - - G4double T1 = LowestEnergy; - G4double r1 =(*rangeVector)[0] ; - - G4double T2 = MaxEnergyCut; - - // check theCutInLength < r1 - if ( theCutInLength <= r1 ) { return T1; } - - // scan range vector to find nearest bin - // ( suppose that r(Ti) > r(Tj) if Ti >Tj ) - for (std::size_t ibin=0; ibin<=std::size_t(TotBin); ++ibin) - { - G4double T=rangeVector->GetLowEdgeEnergy(ibin); - G4double r=(*rangeVector)[ibin]; - if ( r>rmax ) rmax=r; - if (r theCutInLength ) - { - T2 = T; break; } } + return LiniearInterpolation(e1, e2, range1, range2, rangeCut); +} - // check cut in length is smaller than range max - if ( theCutInLength >= rmax ) +// -------------------------------------------------------------------- +G4double +G4VRangeToEnergyConverter::ConvertForElectron(const G4double rangeCut, + const G4Material* material) +{ + const G4ElementVector* elm = material->GetElementVector(); + const G4double* dens = material->GetAtomicNumDensityVector(); + + // fill absorption length vector + G4int nelm = material->GetNumberOfElements(); + G4double dedx1 = 0.0; + G4double dedx2 = 0.0; + G4double range1 = 0.0; + G4double range2 = 0.0; + G4double e1 = 0.0; + G4double e2 = 0.0; + G4double range = 0.; + for (G4int i=0; i2) + e2 = (*Energy)[i]; + dedx2 = 0.0; + for (G4int j=0; jGetParticleName() << G4endl; - G4cout << "The cut in range [" << theCutInLength/mm << " (mm)] "; - G4cout << " is too big " ; - G4cout << " for material idx=" << materialIndex <GetZasInt(), e2); } -#endif - return MaxEnergyCut; - } - - // convert range to energy - G4double T3 = std::sqrt(T1*T2); - G4double r3 = rangeVector->Value(T3); - const std::size_t MAX_LOOP = 1000; - for (std::size_t loop_count=0; loop_count 0.0) ? 2*(e2 - e1)/(dedx1 + dedx2) : 0.0; + range2 = range; + if(range2 < rangeCut) { - T2 = T3; + e1 = e2; + dedx1 = dedx2; + range1 = range2; } else { - T1 = T3; + break; } - T3 = std::sqrt(T1*T2); - r3 = rangeVector->Value(T3); } - return T3; + return LiniearInterpolation(e1, e2, range1, range2, rangeCut); } + +// -------------------------------------------------------------------- diff --git a/source/processes/electromagnetic/adjoint/History b/source/processes/electromagnetic/adjoint/History index 5701e7c8f4..c9fe0ce76a 100644 --- a/source/processes/electromagnetic/adjoint/History +++ b/source/processes/electromagnetic/adjoint/History @@ -16,6 +16,19 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * --------------------------------------------------------- +29 October 2021: L. Desorgher (emadjoint-V10-07-07) +- G4AdjointForcedInteractionForGamma : Improve the forced interaction for + gamma reverse tracking for thick shielding +- G4AdjointhIonisationModel : Correct weight correction to limit dependence + of proton dose results on cut in range +- G4AdjointCSManager : Fixing of coverity issues + +- G4VEMAdjointModel : Fixing of coverity issues + + +18 July 2021: V. Ivanchenko (emadjoint-V10-07-06) +G4AdjointCSManager - updated interfaces to G4PhysicsVector + 16 Apr 2021: B. Morgan (emadjoint-V10-07-05) - Migrate build to modular CMake API diff --git a/source/processes/electromagnetic/adjoint/include/G4AdjointForcedInteractionForGamma.hh b/source/processes/electromagnetic/adjoint/include/G4AdjointForcedInteractionForGamma.hh index 716f177598..7d828b45d3 100644 --- a/source/processes/electromagnetic/adjoint/include/G4AdjointForcedInteractionForGamma.hh +++ b/source/processes/electromagnetic/adjoint/include/G4AdjointForcedInteractionForGamma.hh @@ -97,7 +97,7 @@ class G4AdjointForcedInteractionForGamma : public G4VContinuousDiscreteProcess G4AdjointCSManager* fCSManager; G4double fLastAdjCS = 0.; - + G4double fCSBias = 1.; G4double fAccTrackLength = 0.; G4double fTotNbAdjIntLength = 0.; diff --git a/source/processes/electromagnetic/adjoint/src/G4AdjointCSManager.cc b/source/processes/electromagnetic/adjoint/src/G4AdjointCSManager.cc index fd0cdd10df..757272cf99 100644 --- a/source/processes/electromagnetic/adjoint/src/G4AdjointCSManager.cc +++ b/source/processes/electromagnetic/adjoint/src/G4AdjointCSManager.cc @@ -164,15 +164,13 @@ void G4AdjointCSManager::RegisterEmProcess(G4VEmProcess* aProcess, if(anAdjPartDef && aProcess) { RegisterAdjointParticle(anAdjPartDef); - G4int index = -1; for(size_t i = 0; i < fAdjointParticlesInAction.size(); ++i) { if(anAdjPartDef->GetParticleName() == fAdjointParticlesInAction[i]->GetParticleName()) - index = i; + fForwardProcesses[i]->push_back(aProcess); } - fForwardProcesses[index]->push_back(aProcess); } } @@ -185,14 +183,13 @@ void G4AdjointCSManager::RegisterEnergyLossProcess( if(anAdjPartDef && aProcess) { RegisterAdjointParticle(anAdjPartDef); - G4int index = -1; for(size_t i = 0; i < fAdjointParticlesInAction.size(); ++i) { if(anAdjPartDef->GetParticleName() == fAdjointParticlesInAction[i]->GetParticleName()) - index = i; + fForwardLossProcesses[i]->push_back(aProcess); + } - fForwardLossProcesses[index]->push_back(aProcess); } } @@ -443,9 +440,8 @@ G4double G4AdjointCSManager::GetTotalAdjointCS( { DefineCurrentMaterial(aCouple); DefineCurrentParticle(aPartDef); - G4bool b; return (((*fTotalAdjSigmaTable[fCurrentParticleIndex])[fCurrentMatIndex]) - ->GetValue(Ekin * fMassRatio, b)); + ->Value(Ekin * fMassRatio)); } /////////////////////////////////////////////////////// @@ -455,9 +451,8 @@ G4double G4AdjointCSManager::GetTotalForwardCS( { DefineCurrentMaterial(aCouple); DefineCurrentParticle(aPartDef); - G4bool b; return (((*fTotalFwdSigmaTable[fCurrentParticleIndex])[fCurrentMatIndex]) - ->GetValue(Ekin * fMassRatio, b)); + ->Value(Ekin * fMassRatio)); } /////////////////////////////////////////////////////// @@ -466,15 +461,13 @@ G4double G4AdjointCSManager::GetAdjointSigma( const G4MaterialCutsCouple* aCouple) { DefineCurrentMaterial(aCouple); - G4bool b; if(is_scat_proj_to_proj) return (((*fSigmaTableForAdjointModelScatProjToProj[index_model]) - [fCurrentMatIndex]) - ->GetValue(Ekin_nuc, b)); + [fCurrentMatIndex])->Value(Ekin_nuc)); else return ( ((*fSigmaTableForAdjointModelProdToProj[index_model])[fCurrentMatIndex]) - ->GetValue(Ekin_nuc, b)); + ->Value(Ekin_nuc)); } /////////////////////////////////////////////////////// @@ -500,9 +493,8 @@ void G4AdjointCSManager::GetMaxFwdTotalCS(G4ParticleDefinition* aPartDef, DefineCurrentMaterial(aCouple); DefineCurrentParticle(aPartDef); e_sigma_max = fEkinofFwdSigmaMax[fCurrentParticleIndex][fCurrentMatIndex]; - G4bool b; sigma_max = ((*fTotalFwdSigmaTable[fCurrentParticleIndex])[fCurrentMatIndex]) - ->GetValue(e_sigma_max, b); + ->Value(e_sigma_max); e_sigma_max /= fMassRatio; } @@ -515,9 +507,8 @@ void G4AdjointCSManager::GetMaxAdjTotalCS(G4ParticleDefinition* aPartDef, DefineCurrentMaterial(aCouple); DefineCurrentParticle(aPartDef); e_sigma_max = fEkinofAdjSigmaMax[fCurrentParticleIndex][fCurrentMatIndex]; - G4bool b; sigma_max = ((*fTotalAdjSigmaTable[fCurrentParticleIndex])[fCurrentMatIndex]) - ->GetValue(e_sigma_max, b); + ->Value(e_sigma_max); e_sigma_max /= fMassRatio; } @@ -1129,6 +1120,11 @@ G4double G4AdjointCSManager::ComputeAdjointCS( anAdjointCSMatrix->GetData(ind + 1, aLogPrimEnergy2, aLogCS2, log02, aLogSecondEnergyVector2, aLogProbVector2, aLogProbVectorIndex2); + if (! (aLogProbVector1 && aLogProbVector2 && + aLogSecondEnergyVector1 && aLogSecondEnergyVector2)){ + return 0.; + } + if(anAdjointCSMatrix->IsScatProjToProj()) { // case where the Tcut plays a role G4double log_minimum_prob1, log_minimum_prob2; diff --git a/source/processes/electromagnetic/adjoint/src/G4AdjointForcedInteractionForGamma.cc b/source/processes/electromagnetic/adjoint/src/G4AdjointForcedInteractionForGamma.cc index 5b0a1047d9..bf4e5ca63b 100644 --- a/source/processes/electromagnetic/adjoint/src/G4AdjointForcedInteractionForGamma.cc +++ b/source/processes/electromagnetic/adjoint/src/G4AdjointForcedInteractionForGamma.cc @@ -103,6 +103,7 @@ G4VParticleChange* G4AdjointForcedInteractionForGamma::PostStepDoIt( // Selection of the model to be called G4VEmAdjointModel* theSelectedModel = nullptr; G4bool is_scat_proj_to_proj_case = false; + G4double factor=1.; if(!fAdjointComptonModel && !fAdjointBremModel) return fParticleChange; if(!fAdjointComptonModel) @@ -120,30 +121,32 @@ G4VParticleChange* G4AdjointForcedInteractionForGamma::PostStepDoIt( is_scat_proj_to_proj_case = true; } else - { // Choose the model according to cross sections + { // Choose the model according to a 50-50 % probability G4double bremAdjCS = fAdjointBremModel->AdjointCrossSection( track.GetMaterialCutsCouple(), track.GetKineticEnergy(), false); - if(G4UniformRand() * fLastAdjCS < bremAdjCS) + if(G4UniformRand() < 0.5) { theSelectedModel = fAdjointBremModel; is_scat_proj_to_proj_case = false; + factor=bremAdjCS/fLastAdjCS/0.5; } else { theSelectedModel = fAdjointComptonModel; is_scat_proj_to_proj_case = true; + factor=(fLastAdjCS-bremAdjCS)/fLastAdjCS/0.5; } } // Compute the weight correction factor G4double invEffectiveAdjointCS = - (1. - std::exp(fNbAdjIntLength - fTotNbAdjIntLength)) / fLastAdjCS; + (1. - std::exp(fNbAdjIntLength - fTotNbAdjIntLength)) / fLastAdjCS/fCSBias; // Call the selected model without correction of the weight in the model theSelectedModel->SetCorrectWeightForPostStepInModel(false); theSelectedModel ->SetAdditionalWeightCorrectionFactorForPostStepOutsideModel( - fLastAdjCS * invEffectiveAdjointCS); + factor*fLastAdjCS * invEffectiveAdjointCS); theSelectedModel->SampleSecondaries(track, is_scat_proj_to_proj_case, fParticleChange); theSelectedModel->SetCorrectWeightForPostStepInModel(true); @@ -183,8 +186,8 @@ G4VParticleChange* G4AdjointForcedInteractionForGamma::AlongStepDoIt( else { G4double previous_acc_nb_adj_interaction_length = fNbAdjIntLength; - fNbAdjIntLength += nb_adj_interaction_length_over_step; - theNumberOfInteractionLengthLeft -= nb_adj_interaction_length_over_step; + fNbAdjIntLength += fCSBias*nb_adj_interaction_length_over_step; + theNumberOfInteractionLengthLeft -= fCSBias*nb_adj_interaction_length_over_step; // protection against rare race condition if(std::abs(fTotNbAdjIntLength - previous_acc_nb_adj_interaction_length) <= @@ -253,6 +256,8 @@ G4AdjointForcedInteractionForGamma::PostStepGetPhysicalInteractionLength( { // compute the interaction length for forced interaction if(step_id == 1) { + fCSBias=0.000001/fTotNbAdjIntLength; + fTotNbAdjIntLength*=fCSBias; G4double min_val = std::exp(-fTotNbAdjIntLength); theNumberOfInteractionLengthLeft = -std::log(min_val + G4UniformRand() * (1. - min_val)); @@ -270,7 +275,7 @@ G4AdjointForcedInteractionForGamma::PostStepGetPhysicalInteractionLength( thePostPhysVolume->GetLogicalVolume()->GetMaterialCutsCouple()); } if(postCS > 0.) - return theNumberOfInteractionLengthLeft / postCS; + return theNumberOfInteractionLengthLeft / postCS /fCSBias; else return DBL_MAX; } diff --git a/source/processes/electromagnetic/adjoint/src/G4AdjointhIonisationModel.cc b/source/processes/electromagnetic/adjoint/src/G4AdjointhIonisationModel.cc index 7f74e9ab5a..cf5a1241ef 100644 --- a/source/processes/electromagnetic/adjoint/src/G4AdjointhIonisationModel.cc +++ b/source/processes/electromagnetic/adjoint/src/G4AdjointhIonisationModel.cc @@ -226,6 +226,8 @@ void G4AdjointhIonisationModel::RapidSampleSecondaries( DiffCrossSectionPerAtomPrimToSecond(projectileKinEnergy, eEnergy, 1, 1); w_corr *= diffCS / diffCS_perAtom_Used; + if (isScatProjToProj && fTcutSecond>0.005) w_corr=1.; + G4double new_weight = aTrack.GetWeight() * w_corr; fParticleChange->SetParentWeightByProcess(false); fParticleChange->SetSecondaryWeightByProcess(false); @@ -290,7 +292,8 @@ G4double G4AdjointhIonisationModel::DiffCrossSectionPerAtomPrimToSecond( { G4double Tmax = kinEnergyProj; G4double E1 = kinEnergyProd; - G4double E2 = kinEnergyProd * 1.000001; + //1.0006 factor seems to give the best diff CS, important impact on proton correction factor + G4double E2 = kinEnergyProd *1.0006; G4double sigma1, sigma2; if(kinEnergyProj > 2. * MeV) { diff --git a/source/processes/electromagnetic/adjoint/src/G4ContinuousGainOfEnergy.cc b/source/processes/electromagnetic/adjoint/src/G4ContinuousGainOfEnergy.cc index 017138368f..f51dabd989 100644 --- a/source/processes/electromagnetic/adjoint/src/G4ContinuousGainOfEnergy.cc +++ b/source/processes/electromagnetic/adjoint/src/G4ContinuousGainOfEnergy.cc @@ -142,7 +142,7 @@ G4VParticleChange* G4ContinuousGainOfEnergy::AlongStepDoIt(const G4Track& track, degain = E - Tkin; } G4double tmax = fCurrentModel->MaxSecondaryKinEnergy(dynParticle); - tmax = std::min(tmax, fCurrentTcut); + fCurrentTcut = std::min(fCurrentTcut, tmax); dynParticle->SetKineticEnergy(Tkin + degain); @@ -154,8 +154,8 @@ G4VParticleChange* G4ContinuousGainOfEnergy::AlongStepDoIt(const G4Track& track, if(fLossFluctuationFlag) { deltaE = fCurrentModel->GetModelOfFluctuations()->SampleFluctuations( - fCurrentCouple, dynParticle, tmax, dlength, degain) - - degain; + fCurrentCouple, dynParticle, fCurrentTcut, tmax, dlength, degain) + - degain; } G4double egain = degain + deltaE; diff --git a/source/processes/electromagnetic/adjoint/src/G4VEmAdjointModel.cc b/source/processes/electromagnetic/adjoint/src/G4VEmAdjointModel.cc index bbadc91a48..63ae3878e8 100644 --- a/source/processes/electromagnetic/adjoint/src/G4VEmAdjointModel.cc +++ b/source/processes/electromagnetic/adjoint/src/G4VEmAdjointModel.cc @@ -240,6 +240,10 @@ G4VEmAdjointModel::ComputeAdjointCrossSectionVectorPerAtomForSecond( res_mat.push_back(log_ESec_vector); res_mat.push_back(log_Prob_vector); } + else { + delete log_ESec_vector; + delete log_Prob_vector; + } return res_mat; } @@ -289,6 +293,10 @@ G4VEmAdjointModel::ComputeAdjointCrossSectionVectorPerAtomForScatProj( res_mat.push_back(log_ESec_vector); res_mat.push_back(log_Prob_vector); } + else { + delete log_ESec_vector; + delete log_Prob_vector; + } return res_mat; } @@ -340,6 +348,10 @@ G4VEmAdjointModel::ComputeAdjointCrossSectionVectorPerVolumeForSecond( res_mat.push_back(log_ESec_vector); res_mat.push_back(log_Prob_vector); } + else { + delete log_ESec_vector; + delete log_Prob_vector; + } return res_mat; } @@ -389,6 +401,10 @@ G4VEmAdjointModel::ComputeAdjointCrossSectionVectorPerVolumeForScatProj( res_mat.push_back(log_ESec_vector); res_mat.push_back(log_Prob_vector); } + else { + delete log_ESec_vector; + delete log_Prob_vector; + } return res_mat; } @@ -427,11 +443,16 @@ G4double G4VEmAdjointModel::SampleAdjSecEnergyFromCSMatrix( theMatrix->GetData(ind, aLogPrimEnergy1, aLogCS1, log01, aLogSecondEnergyVector1, aLogProbVector1, - aLogProbVectorIndex1); + aLogProbVectorIndex1 ); theMatrix->GetData(ind + 1, aLogPrimEnergy2, aLogCS2, log02, aLogSecondEnergyVector2, aLogProbVector2, aLogProbVectorIndex2); + if (! (aLogProbVector1 && aLogProbVector2 && + aLogSecondEnergyVector1 && aLogSecondEnergyVector2)){ + return 0.; + } + G4double rand_var = G4UniformRand(); G4double log_rand_var = std::log(rand_var); G4double log_Tcut = std::log(fTcutSecond); diff --git a/source/processes/electromagnetic/dna/History b/source/processes/electromagnetic/dna/History index 1f296c365b..40e83ccc86 100644 --- a/source/processes/electromagnetic/dna/History +++ b/source/processes/electromagnetic/dna/History @@ -14,6 +14,41 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ----------------------------------------------------------* +8-11-2021, H. Tran, emdna-V10-07-15 +- corrected Circular dependencies for mesoscopic model +- corrected the problem in IRT + +4-11-2021, H. Tran, emdna-V10-07-14 +- define a G4FakeParticleID::fLastValue in the header file, + delete G4FakeParticleID.cc, + solve arithmetic problems, + Added new mesoscopic model for dna chemistry + +21-10-2021, W.G.Shin, emdna-V10-07-13 +- Added a virtual classes for DNA geometry - G4VDNAMolecularGeometry + Modified classes - G4DNAIRT, G4DNAIRTMoleculeEncounterStepper, + G4ITModelProcessor, G4Scheduler, + G4DNAMolecularReactionTable + +23-09-2021, A. Ribon, emdna-V10-07-12 +- G4ITTransportation, G4DNAElastic, G4DNAExcitation, G4DNAIonisation, + G4DNAVibExcitation, G4DNAAttachment, G4DNAChargeDecrease, + G4DNAChargeIncrease, G4DNAElectronSolvation, G4DNAMolecularDissociation, + G4DNASecondOrderReaction, G4DNAElectronHoleRecombination, + G4DNABrownianTransportation : replaced hardwired process-sub-types + with enum values introduced in the new class G4LowEnergyEmProcessSubType + +18-07-2021, V. Ivanchenko, emdna-V10-07-11 +- G4DNABohrExcitationModel2, G4DNABohrIonisationModel2, + G4VLEPSModel - updated interfaces to G4PhysicsVector + +16-07-2021, D. Sakata, emdna-V10-07-10 +- Fixed initialization error in G4DNAELSEPAElasticModel + +28-06-2021, G. Cosmo, emdna-V10-07-09 +- Fixed compilation error in G4ITMultiNavigator when compiling with c++20 + enabled. + 31-05-2021, D.Sakata S. Guatelli, emdna-V10-07-08 - Added new classes G4DNADiracRMatrixExcitationModel G4DNAQuinnPlasmonExcitationModel diff --git a/source/processes/electromagnetic/dna/management/include/G4DNABoundingBox.hh b/source/processes/electromagnetic/dna/management/include/G4DNABoundingBox.hh index 74659e67d6..4b9dd6ba4e 100644 --- a/source/processes/electromagnetic/dna/management/include/G4DNABoundingBox.hh +++ b/source/processes/electromagnetic/dna/management/include/G4DNABoundingBox.hh @@ -33,166 +33,121 @@ #include "G4ThreeVector.hh" class G4DNABoundingBox { -public: - G4DNABoundingBox() = default; - ~G4DNABoundingBox() = default; - template - G4DNABoundingBox(Iterator begin, Iterator end); - G4DNABoundingBox(std::initializer_list l); - G4DNABoundingBox(G4DNABoundingBox&& rhs) noexcept; - G4DNABoundingBox(const G4DNABoundingBox&) = default; - G4DNABoundingBox& operator = (const G4DNABoundingBox&) = default; - G4DNABoundingBox& operator = (G4DNABoundingBox&& hrs)noexcept; - G4bool contains(const G4DNABoundingBox& other) const; - G4bool contains(const G4ThreeVector& point) const; - G4bool overlap(const G4DNABoundingBox& other, G4DNABoundingBox* out) const; - G4bool overlap(const G4ThreeVector& query, const G4double& radius) const; - G4bool contains(const G4ThreeVector& query, const G4ThreeVector& Point, const G4double& Radius) const; - G4bool contains(const G4ThreeVector& query, const G4double& radius) const; - G4double Volume() const; - std::array partition() const; - friend std::ostream& operator<<(std::ostream& s, const G4DNABoundingBox& rhs); - G4bool operator == (const G4DNABoundingBox& rhs) const; - G4bool operator != (const G4DNABoundingBox& rhs) const; - void resize(G4ThreeVector pics[8]); - G4DNABoundingBox translate(const G4ThreeVector& trans) const; - inline G4double halfSideLengthInX() const; - inline G4double halfSideLengthInY() const; - inline G4double halfSideLengthInZ() const; - inline G4double Getxhi() const; - inline G4double Getyhi() const; - inline G4double Getzhi() const; - inline G4double Getxlo() const; - inline G4double Getylo() const; - inline G4double Getzlo() const; - inline void Setxhi(G4double); - inline void Setyhi(G4double); - inline void Setzhi(G4double); - inline void Setxlo(G4double); - inline void Setylo(G4double); - inline void Setzlo(G4double); - inline G4ThreeVector middlePoint() const; -private: - G4double fxhi, fxlo, fyhi, fylo, fzhi, fzlo; + public: + G4DNABoundingBox() = default; + ~G4DNABoundingBox() = default; + template + G4DNABoundingBox(Iterator begin, Iterator end); + G4DNABoundingBox(const std::initializer_list& l); + G4DNABoundingBox(G4DNABoundingBox&& rhs) noexcept; + G4DNABoundingBox(const G4DNABoundingBox&) = default; + G4DNABoundingBox& operator=(const G4DNABoundingBox&) = default; + G4DNABoundingBox& operator=(G4DNABoundingBox&& hrs) noexcept; + G4bool contains(const G4DNABoundingBox& other) const; + G4bool contains(const G4ThreeVector& point) const; + G4bool overlap(const G4DNABoundingBox& other, G4DNABoundingBox* out) const; + G4bool overlap(const G4ThreeVector& query, const G4double& radius) const; + G4bool contains(const G4ThreeVector& query, const G4ThreeVector& Point, + const G4double& Radius) const; + G4bool contains(const G4ThreeVector& query, const G4double& radius) const; + G4double Volume() const; + std::array partition() const; + friend std::ostream& operator<<(std::ostream& s, const G4DNABoundingBox& rhs); + G4bool operator==(const G4DNABoundingBox& rhs) const; + G4bool operator!=(const G4DNABoundingBox& rhs) const; + void resize(G4ThreeVector pics[8]); + G4DNABoundingBox translate(const G4ThreeVector& trans) const; + inline G4double halfSideLengthInX() const; + inline G4double halfSideLengthInY() const; + inline G4double halfSideLengthInZ() const; + inline G4double Getxhi() const; + inline G4double Getyhi() const; + inline G4double Getzhi() const; + inline G4double Getxlo() const; + inline G4double Getylo() const; + inline G4double Getzlo() const; + inline G4ThreeVector middlePoint() const; + + private: + G4double fxhi, fxlo, fyhi, fylo, fzhi, fzlo; }; const G4DNABoundingBox initial = G4DNABoundingBox{ - -std::numeric_limits::max(), std::numeric_limits::max(), - -std::numeric_limits::max(), std::numeric_limits::max(), - -std::numeric_limits::max(), std::numeric_limits::max() + -std::numeric_limits::max(), std::numeric_limits::max(), + -std::numeric_limits::max(), std::numeric_limits::max(), + -std::numeric_limits::max(), std::numeric_limits::max() }; const G4DNABoundingBox invalid = - G4DNABoundingBox{ - std::numeric_limits::quiet_NaN(), std::numeric_limits::quiet_NaN(), - std::numeric_limits::quiet_NaN(), std::numeric_limits::quiet_NaN(), - std::numeric_limits::quiet_NaN(), std::numeric_limits::quiet_NaN() -}; + G4DNABoundingBox{ std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN() }; inline G4ThreeVector G4DNABoundingBox::middlePoint() const { - G4ThreeVector mid((fxhi + fxlo)/2.0,(fyhi + fylo)/2.0,(fzhi + fzlo)/2.0); - return mid; + G4ThreeVector mid((fxhi + fxlo) / 2.0, (fyhi + fylo) / 2.0, + (fzhi + fzlo) / 2.0); + return mid; } inline G4double G4DNABoundingBox::halfSideLengthInX() const { - return std::abs(fxhi - fxlo)*0.5; + return std::abs(fxhi - fxlo) * 0.5; } inline G4double G4DNABoundingBox::halfSideLengthInY() const { - return std::abs(fyhi - fylo)*0.5; + return std::abs(fyhi - fylo) * 0.5; } inline G4double G4DNABoundingBox::halfSideLengthInZ() const { - return std::abs(fzhi - fzlo)*0.5; + return std::abs(fzhi - fzlo) * 0.5; } template G4DNABoundingBox::G4DNABoundingBox(Iterator begin, Iterator end) - : G4DNABoundingBox(initial) + : G4DNABoundingBox(initial) { - for (; begin != end; ++begin) + for(; begin != end; ++begin) + { + const G4ThreeVector& point = (*begin); + + if(point.x() < fxlo) { - const G4ThreeVector& point = (*begin); - - if (point.x() < fxlo) - { - fxlo = point.x(); - } - if (point.x() > fxhi) - { - fxhi = point.x(); - } - - if (point.y() < fylo) - { - fylo = point.y(); - } - if (point.y() > fyhi) - { - fyhi = point.y(); - } - - if (point.z() < fzlo) - { - fzlo = point.z(); - } - if (point.z() > fzhi) - { - fzhi = point.z(); - } + fxlo = point.x(); } + if(point.x() > fxhi) + { + fxhi = point.x(); + } + + if(point.y() < fylo) + { + fylo = point.y(); + } + if(point.y() > fyhi) + { + fyhi = point.y(); + } + + if(point.z() < fzlo) + { + fzlo = point.z(); + } + if(point.z() > fzhi) + { + fzhi = point.z(); + } + } } -inline G4double G4DNABoundingBox::Getxhi() const -{ - return fxhi; -} -inline G4double G4DNABoundingBox::Getyhi() const -{ - return fyhi; -} -inline G4double G4DNABoundingBox::Getzhi() const -{ - return fzhi; -} -inline G4double G4DNABoundingBox::Getxlo() const -{ - return fxlo; -} -inline G4double G4DNABoundingBox::Getylo() const -{ - return fylo; -} -inline G4double G4DNABoundingBox::Getzlo() const -{ - return fzlo; -} -inline void G4DNABoundingBox::Setxhi(G4double limit) -{ - fxhi = limit; -} -inline void G4DNABoundingBox::Setyhi(G4double limit) -{ - fyhi = limit; -} -inline void G4DNABoundingBox::Setzhi(G4double limit) -{ - fzhi = limit; -} -inline void G4DNABoundingBox::Setxlo(G4double limit) -{ - fxlo = limit; -} -inline void G4DNABoundingBox::Setylo(G4double limit) -{ - fylo = limit; -} -inline void G4DNABoundingBox::Setzlo(G4double limit) -{ - fzlo = limit; -} +inline G4double G4DNABoundingBox::Getxhi() const { return fxhi; } +inline G4double G4DNABoundingBox::Getyhi() const { return fyhi; } +inline G4double G4DNABoundingBox::Getzhi() const { return fzhi; } +inline G4double G4DNABoundingBox::Getxlo() const { return fxlo; } +inline G4double G4DNABoundingBox::Getylo() const { return fylo; } +inline G4double G4DNABoundingBox::Getzlo() const { return fzlo; } #endif - diff --git a/source/processes/electromagnetic/dna/management/include/G4ITMultiNavigator.hh b/source/processes/electromagnetic/dna/management/include/G4ITMultiNavigator.hh index ad49da9be6..b3c3985e66 100644 --- a/source/processes/electromagnetic/dna/management/include/G4ITMultiNavigator.hh +++ b/source/processes/electromagnetic/dna/management/include/G4ITMultiNavigator.hh @@ -82,11 +82,11 @@ template<> class G4TrackState : public G4TrackState { public: - ~G4TrackState() + ~G4TrackState() { } - G4TrackState() + G4TrackState() { G4ThreeVector Big3Vector(kInfinity, kInfinity, kInfinity); fLastLocatedPosition = Big3Vector; diff --git a/source/processes/electromagnetic/dna/management/include/G4ITPathFinder.hh b/source/processes/electromagnetic/dna/management/include/G4ITPathFinder.hh index 9e7a07547a..6f48913be4 100644 --- a/source/processes/electromagnetic/dna/management/include/G4ITPathFinder.hh +++ b/source/processes/electromagnetic/dna/management/include/G4ITPathFinder.hh @@ -116,10 +116,10 @@ protected: G4int fLastStepNo, fCurrentStepNo; public: - virtual ~G4TrackState(){} + virtual ~G4TrackState(){} - G4TrackState() : - G4TrackStateBase(), + G4TrackState() : + G4TrackStateBase(), fEndState( G4ThreeVector(), G4ThreeVector(), 0., 0., 0., 0., 0.), fFieldExertedForce(false), fRelocatedPoint(true), diff --git a/source/processes/electromagnetic/dna/management/include/G4Scheduler.hh b/source/processes/electromagnetic/dna/management/include/G4Scheduler.hh index ca53649e57..5a57119ad8 100644 --- a/source/processes/electromagnetic/dna/management/include/G4Scheduler.hh +++ b/source/processes/electromagnetic/dna/management/include/G4Scheduler.hh @@ -60,6 +60,7 @@ #include "G4ITTrackHolder.hh" #include "G4VStateDependent.hh" #include "G4ITReaction.hh" +#include "G4VScavengerMaterial.hh" class G4ITTrackingManager; class G4ITModelProcessor; @@ -74,7 +75,7 @@ class G4ITGun; #define compTrackPerID__ struct compTrackPerID { - bool operator()(G4Track* rhs, G4Track* lhs) const + G4bool operator()(G4Track* rhs, G4Track* lhs) const { return rhs->GetTrackID() < lhs->GetTrackID(); } @@ -99,12 +100,12 @@ public: static void DeleteInstance(); virtual G4bool Notify(G4ApplicationState requestedState); - virtual void RegisterModel(G4VITStepModel*, double); + virtual void RegisterModel(G4VITStepModel*, G4double); void Initialize(); void ForceReinitialization(); - inline bool IsInitialized(); - inline bool IsRunning(){return fRunning;} + inline G4bool IsInitialized(); + inline G4bool IsRunning(){return fRunning;} void Reset(); void Process(); void ClearList(); @@ -121,23 +122,23 @@ public: // is called in case one would like to access some track information void EndTracking(); - void SetEndTime(const double); + void SetEndTime(const G4double); /* Two tracks below the time tolerance are supposed to be * in the same time slice */ - inline void SetTimeTolerance(double); - inline double GetTimeTolerance() const; + inline void SetTimeTolerance(G4double); + inline G4double GetTimeTolerance() const; - inline void SetMaxZeroTimeAllowed(int); - inline int GetMaxZeroTimeAllowed() const; + inline void SetMaxZeroTimeAllowed(G4int); + inline G4int GetMaxZeroTimeAllowed() const; inline G4ITModelHandler* GetModelHandler(); - inline void SetTimeSteps(std::map*); - inline void AddTimeStep(double, double); - inline void SetDefaultTimeStep(double); - double GetLimitingTimeStep() const; + inline void SetTimeSteps(std::map*); + inline void AddTimeStep(G4double, G4double); + inline void SetDefaultTimeStep(G4double); + G4double GetLimitingTimeStep() const; inline G4int GetNbSteps() const; inline void SetMaxNbSteps(G4int); inline G4int GetMaxNbSteps() const; @@ -160,9 +161,9 @@ public: * 3 : (2) + step info for individual tracks * 4 : (2) + trackList processing info + pushed and killed track info */ - inline void SetVerbose(int); + inline void SetVerbose(G4int); - inline int GetVerbose() const; + inline G4int GetVerbose() const; inline void WhyDoYouStop(); @@ -173,23 +174,32 @@ public: void GetCollisionType(G4String& interactionType); - void AddWatchedTime(double time) + void AddWatchedTime(G4double time) { fWatchedTimes.insert(time); } - double GetNextWatchedTime() const; + G4double GetNextWatchedTime() const; - inline void SetMaxTimeStep(double maxTimeStep) + inline void SetMaxTimeStep(G4double maxTimeStep) { fMaxTimeStep = maxTimeStep; } - inline double GetMaxTimeStep() const + inline G4double GetMaxTimeStep() const { return fMaxTimeStep; } + inline G4VScavengerMaterial* GetScavengerMaterial() const + { + return fpUserScavenger.get(); + } + inline void SetScavengerMaterial(std::unique_ptr scavengerMaterial) + { + fpUserScavenger = std::move(scavengerMaterial); + } + protected: void DoProcess(); @@ -198,7 +208,7 @@ protected: void FindUserPreDefinedTimeStep(); - bool CanICarryOn(); + G4bool CanICarryOn(); void PrintWhyDoYouStop(); @@ -211,46 +221,48 @@ private: G4SchedulerMessenger* fpMessenger; static G4ThreadLocal G4Scheduler* fgScheduler; - int fVerbose; - bool fWhyDoYouStop; - bool fInitialized; - bool fRunning; + G4int fVerbose; + G4bool fWhyDoYouStop; + G4bool fInitialized; + G4bool fRunning; G4bool fContinue; - int fNbSteps; - int fMaxSteps; + G4int fNbSteps; + G4int fMaxSteps; G4ITStepStatus fITStepStatus; // Time members G4bool fUseDefaultTimeSteps; - double fTimeTolerance; - double fGlobalTime; - double fTmpGlobalTime; - double fStartTime; - double fStopTime; - double fEndTime; - double fPreviousTimeStep; - int fZeroTimeCount; - int fMaxNZeroTimeStepsAllowed; + G4double fTimeTolerance; + G4double fGlobalTime; + G4double fTmpGlobalTime; + G4double fStartTime; + G4double fStopTime; + G4double fEndTime; + G4double fPreviousTimeStep; + G4int fZeroTimeCount; + G4int fMaxNZeroTimeStepsAllowed; - double fTimeStep; // The selected minimum time step - double fMaxTimeStep; + G4double fTimeStep; // The selected minimum time step + G4double fMaxTimeStep; // User steps - bool fUsePreDefinedTimeSteps; - double fDefaultMinTimeStep; - std::map* fpUserTimeSteps; + G4bool fUsePreDefinedTimeSteps; + G4double fDefaultMinTimeStep; + std::map* fpUserTimeSteps; // One can give time steps in respect to the global time - mutable double fUserUpperTimeLimit; - double fDefinedMinTimeStep; + mutable G4double fUserUpperTimeLimit; + G4double fDefinedMinTimeStep; // selected user time step in respect to the global time - bool fReachedUserTimeLimit; // if fMinTimeStep == the user time step + G4bool fReachedUserTimeLimit; // if fMinTimeStep == the user time step - std::set fWatchedTimes; + std::set fWatchedTimes; G4UserTimeStepAction* fpUserTimeStepAction; + std::unique_ptr fpUserScavenger; + // ========================================== // TO BE REMOVED G4ITStepProcessor* fpStepProcessor; @@ -262,24 +274,26 @@ private: G4ITModelHandler* fpModelHandler; // ========================================== - double fTSTimeStep; + G4double fTSTimeStep; // Time calculated by the time stepper in CalculateMinTimeStep() - double fILTimeStep; + G4double fILTimeStep; // Time calculated by the interaction length methods // in ComputeInteractionLength() - bool fInteractionStep; + G4bool fInteractionStep; // Flag : if the step is driven by the interaction with the matter and // NOT by the reaction between tracks G4ITGun* fpGun; // ========================================== - // - + //Hoang + bool fResetScavenger; +public: + void ResetScavenger(bool); }; -inline bool G4Scheduler::IsInitialized() +inline G4bool G4Scheduler::IsInitialized() { return fInitialized; } @@ -289,23 +303,23 @@ inline G4ITModelHandler* G4Scheduler::GetModelHandler() return fpModelHandler; } -inline void G4Scheduler::SetEndTime(const double __endtime) +inline void G4Scheduler::SetEndTime(const G4double __endtime) { fEndTime = __endtime; } inline -void G4Scheduler::SetTimeSteps(std::map* steps) +void G4Scheduler::SetTimeSteps(std::map* steps) { fUsePreDefinedTimeSteps = true; fpUserTimeSteps = steps; } -inline void G4Scheduler::AddTimeStep(double startingTime, double timeStep) +inline void G4Scheduler::AddTimeStep(G4double startingTime, G4double timeStep) { if (fpUserTimeSteps == 0) { - fpUserTimeSteps = new std::map(); + fpUserTimeSteps = new std::map(); fUsePreDefinedTimeSteps = true; } @@ -342,7 +356,7 @@ inline G4double G4Scheduler::GetTimeStep() const return fTimeStep; } -inline void G4Scheduler::SetDefaultTimeStep(double timeStep) +inline void G4Scheduler::SetDefaultTimeStep(G4double timeStep) { fDefaultMinTimeStep = timeStep; } @@ -363,33 +377,33 @@ inline G4UserTimeStepAction* G4Scheduler::GetUserTimeStepAction() const return fpUserTimeStepAction; } -inline void G4Scheduler::SetVerbose(int verbose) +inline void G4Scheduler::SetVerbose(G4int verbose) { fVerbose = verbose; } -inline int G4Scheduler::GetVerbose() const +inline G4int G4Scheduler::GetVerbose() const { return fVerbose; } inline -void G4Scheduler::SetMaxZeroTimeAllowed(int maxTimeStepAllowed) +void G4Scheduler::SetMaxZeroTimeAllowed(G4int maxTimeStepAllowed) { fMaxNZeroTimeStepsAllowed = maxTimeStepAllowed; } -inline int G4Scheduler::GetMaxZeroTimeAllowed() const +inline G4int G4Scheduler::GetMaxZeroTimeAllowed() const { return fMaxNZeroTimeStepsAllowed; } -inline void G4Scheduler::SetTimeTolerance(double time) +inline void G4Scheduler::SetTimeTolerance(G4double time) { fTimeTolerance = time; } -inline double G4Scheduler::GetTimeTolerance() const +inline G4double G4Scheduler::GetTimeTolerance() const { return fTimeTolerance; } @@ -439,4 +453,9 @@ inline G4bool G4Scheduler::AreDefaultTimeStepsUsed() return (fUseDefaultTimeSteps == false && fUsePreDefinedTimeSteps == false); } +inline void G4Scheduler::ResetScavenger(bool value) +{ + fResetScavenger = value; +} + #endif diff --git a/examples/basic/B3/B3b/include/B3Analysis.hh b/source/processes/electromagnetic/dna/management/include/G4UserMeshAction.hh similarity index 78% rename from examples/basic/B3/B3b/include/B3Analysis.hh rename to source/processes/electromagnetic/dna/management/include/G4UserMeshAction.hh index 16095dae27..c8c5a1dd6d 100644 --- a/examples/basic/B3/B3b/include/B3Analysis.hh +++ b/source/processes/electromagnetic/dna/management/include/G4UserMeshAction.hh @@ -24,14 +24,20 @@ // ******************************************************************** // // -/// \file B3Analysis.hh -/// \brief Selection of the analysis technology +#ifndef G4USERMESHACTION_HH +#define G4USERMESHACTION_HH -#ifndef B3Analysis_h -#define B3Analysis_h 1 +#include "G4DNAMesh.hh" -#include "g4root.hh" -//#include "g4csv.hh" -//#include "g4xml.hh" +class G4UserMeshAction +{ + public: + G4UserMeshAction() = default; + virtual ~G4UserMeshAction() = default; -#endif + public: + virtual void BeginOfMesh(const G4DNAMesh* /*aMesh*/, G4double /*time*/){}; + virtual void InMesh(const G4DNAMesh* /*pMesh*/, G4double /*time*/){}; + virtual void EndOfMesh(const G4DNAMesh* /*aMesh*/, G4double /*time*/){}; +}; +#endif // G4USERMESHACTION_HH diff --git a/source/processes/electromagnetic/dna/management/include/G4VDNAMolecularGeometry.hh b/source/processes/electromagnetic/dna/management/include/G4VDNAMolecularGeometry.hh new file mode 100644 index 0000000000..3530c86bce --- /dev/null +++ b/source/processes/electromagnetic/dna/management/include/G4VDNAMolecularGeometry.hh @@ -0,0 +1,55 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/* + * G4VDNAMolecularGeometry.hh + * + * Created on: 10 Oct. 2021 + * Author: WG Shin + */ + +#ifndef G4VDNAMolecularGeometry_HH +#define G4VDNAMolecularGeometry_HH + +#include "globals.hh" +#include "G4ThreeVector.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" + +class G4VDNAMolecularGeometry +{ +public: + G4VDNAMolecularGeometry(){}; + virtual ~G4VDNAMolecularGeometry(){}; + + virtual void FindNearbyMolecules(const G4LogicalVolume*, + const G4ThreeVector&, + std::vector&, + G4double){}; + + +}; + +#endif diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyAnalysis.hh b/source/processes/electromagnetic/dna/management/include/G4VScavengerMaterial.hh similarity index 86% rename from examples/advanced/hadrontherapy/include/HadrontherapyAnalysis.hh rename to source/processes/electromagnetic/dna/management/include/G4VScavengerMaterial.hh index 732e044fee..bb85cf8b5d 100644 --- a/examples/advanced/hadrontherapy/include/HadrontherapyAnalysis.hh +++ b/source/processes/electromagnetic/dna/management/include/G4VScavengerMaterial.hh @@ -24,12 +24,14 @@ // ******************************************************************** // +#ifndef G4VSCAVENGERMATERIAL_HH +#define G4VSCAVENGERMATERIAL_HH -#ifndef Analysis_h -#define Analysis_h 1 - -//#include "g4root.hh" -#include "g4csv.hh" -//#include "g4xml.hh" - -#endif +class G4VScavengerMaterial +{ + public: + G4VScavengerMaterial() = default; + virtual ~G4VScavengerMaterial() = default; + virtual void Reset() = 0; +}; +#endif // G4VSCAVENGERMATERIAL_HH diff --git a/source/processes/electromagnetic/dna/management/sources.cmake b/source/processes/electromagnetic/dna/management/sources.cmake index e4ab499433..21f10f8fb2 100644 --- a/source/processes/electromagnetic/dna/management/sources.cmake +++ b/source/processes/electromagnetic/dna/management/sources.cmake @@ -57,6 +57,7 @@ geant4_add_module(G4emdna-man G4TrackList.hh G4TrackState.hh G4UserTimeStepAction.hh + G4VDNAMolecularGeometry.hh G4VITDiscreteProcess.hh G4VITProcess.hh G4VITReactionProcess.hh @@ -75,6 +76,8 @@ geant4_add_module(G4emdna-man G4ChemicalMoleculeFinder.hh G4DNAReactionTypeManager.hh G4VReactionType.hh + G4UserMeshAction.hh + G4VScavengerMaterial.hh SOURCES G4AllITFinder.cc G4ITBox.cc diff --git a/source/processes/electromagnetic/dna/management/src/G4DNABoundingBox.cc b/source/processes/electromagnetic/dna/management/src/G4DNABoundingBox.cc index a6d4f36c94..a968949f3a 100644 --- a/source/processes/electromagnetic/dna/management/src/G4DNABoundingBox.cc +++ b/source/processes/electromagnetic/dna/management/src/G4DNABoundingBox.cc @@ -31,258 +31,255 @@ using std::array; using std::initializer_list; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4DNABoundingBox::G4DNABoundingBox(G4DNABoundingBox&& rhs)noexcept +G4DNABoundingBox::G4DNABoundingBox(G4DNABoundingBox&& rhs) noexcept { - fxhi = rhs.fxhi; - fxlo = rhs.fxlo; - fyhi = rhs.fyhi; - fylo = rhs.fylo; - fzhi = rhs.fzhi; - fzlo = rhs.fzlo; + fxhi = rhs.fxhi; + fxlo = rhs.fxlo; + fyhi = rhs.fyhi; + fylo = rhs.fylo; + fzhi = rhs.fzhi; + fzlo = rhs.fzlo; } ////....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4DNABoundingBox::G4DNABoundingBox(initializer_list l) +G4DNABoundingBox::G4DNABoundingBox(const initializer_list& l) { - std::copy(l.begin(), l.end(), &fxhi); + std::copy(l.begin(), l.end(), &fxhi); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4DNABoundingBox& G4DNABoundingBox::operator=(G4DNABoundingBox&& rhs)noexcept +G4DNABoundingBox& G4DNABoundingBox::operator=(G4DNABoundingBox&& rhs) noexcept { - fxhi = rhs.fxhi; - fxlo = rhs.fxlo; - fyhi = rhs.fyhi; - fylo = rhs.fylo; - fzhi = rhs.fzhi; - fzlo = rhs.fzlo; - return *this; + fxhi = rhs.fxhi; + fxlo = rhs.fxlo; + fyhi = rhs.fyhi; + fylo = rhs.fylo; + fzhi = rhs.fzhi; + fzlo = rhs.fzlo; + return *this; } G4double G4DNABoundingBox::Volume() const { - auto LengthY = this->Getyhi() - this->Getylo(); - auto LengthX = this->Getxhi() - this->Getxlo(); - auto LengthZ = this->Getzhi() - this->Getzlo(); - G4double V = LengthY * LengthX * LengthZ; - return V; + auto LengthY = this->Getyhi() - this->Getylo(); + auto LengthX = this->Getxhi() - this->Getxlo(); + auto LengthZ = this->Getzhi() - this->Getzlo(); + G4double V = LengthY * LengthX * LengthZ; + return V; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4DNABoundingBox::resize(G4ThreeVector pics[8]) { - for(size_t i = 0; i < 8; i++) + for(size_t i = 0; i < 8; i++) + { + const G4ThreeVector& point = pics[i]; + if(point.x() < fxlo) { - const G4ThreeVector& point = pics[i]; - if (point.x() < fxlo) - { - fxlo = point.x(); - } - if (point.x() > fxhi) - { - fxhi = point.x(); - } - - if (point.y() < fylo) - { - fylo = point.y(); - } - if (point.y() > fyhi) - { - fyhi = point.y(); - } - - if (point.z() < fzlo) - { - fzlo = point.z(); - } - if (point.z() > fzhi) - { - fzhi = point.z(); - } + fxlo = point.x(); } + if(point.x() > fxhi) + { + fxhi = point.x(); + } + + if(point.y() < fylo) + { + fylo = point.y(); + } + if(point.y() > fyhi) + { + fyhi = point.y(); + } + + if(point.z() < fzlo) + { + fzlo = point.z(); + } + if(point.z() > fzhi) + { + fzhi = point.z(); + } + } } //------------------------------------------------------------------------------ G4DNABoundingBox G4DNABoundingBox::translate(const G4ThreeVector& trans) const { - G4DNABoundingBox output; - - output.fxhi = fxhi + trans.x(); - output.fxlo = fxlo + trans.x(); + G4DNABoundingBox output; - output.fyhi = fyhi + trans.y(); - output.fylo = fylo + trans.x(); + output.fxhi = fxhi + trans.x(); + output.fxlo = fxlo + trans.x(); - output.fzhi = fzhi + trans.z(); - output.fzlo = fzlo + trans.z(); + output.fyhi = fyhi + trans.y(); + output.fylo = fylo + trans.x(); - return output; + output.fzhi = fzhi + trans.z(); + output.fzlo = fzlo + trans.z(); + + return output; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4bool G4DNABoundingBox::contains(const G4DNABoundingBox& other) const { - return fxlo <= other.fxlo && fxhi >= other.fxhi && - fylo <= other.fylo && fyhi >= other.fyhi && - fzlo <= other.fzlo && fzhi >= other.fzhi; + return fxlo <= other.fxlo && fxhi >= other.fxhi && fylo <= other.fylo && + fyhi >= other.fyhi && fzlo <= other.fzlo && fzhi >= other.fzhi; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4bool G4DNABoundingBox::contains(const G4ThreeVector& point) const { - return fxlo <= point.x() && fxhi >= point.x() && - fylo <= point.y() && fyhi >= point.y() && - fzlo <= point.z() && fzhi >= point.z(); + return fxlo <= point.x() && fxhi >= point.x() && fylo <= point.y() && + fyhi >= point.y() && fzlo <= point.z() && fzhi >= point.z(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - G4bool G4DNABoundingBox::overlap(const G4DNABoundingBox& other, G4DNABoundingBox* out) const { - if (contains(other)) - { - *out = other; - return true; - } else if (other.contains(*this)) - { - *out = *this; - return true; - } - - // Check if there is no intersection - if (fxhi < other.fxlo || fxlo > other.fxhi || - fyhi < other.fylo || fylo > other.fyhi || - fzhi < other.fzlo || fzlo > other.fzhi) - { - *out = invalid; - return false; - } - - G4double upperX = std::min(fxhi, other.fxhi); - G4double upperY = std::min(fyhi, other.fyhi); - G4double upperZ = std::min(fzhi, other.fzhi); - - G4double lowerX = std::max(fxlo, other.fxlo); - G4double lowerY = std::max(fylo, other.fylo); - G4double lowerZ = std::max(fzlo, other.fzlo); - - *out = G4DNABoundingBox{upperX, lowerX, upperY, lowerY, upperZ, lowerZ}; + if(contains(other)) + { + *out = other; return true; + } + else if(other.contains(*this)) + { + *out = *this; + return true; + } + + // Check if there is no intersection + if(fxhi < other.fxlo || fxlo > other.fxhi || fyhi < other.fylo || + fylo > other.fyhi || fzhi < other.fzlo || fzlo > other.fzhi) + { + *out = invalid; + return false; + } + + G4double upperX = std::min(fxhi, other.fxhi); + G4double upperY = std::min(fyhi, other.fyhi); + G4double upperZ = std::min(fzhi, other.fzhi); + + G4double lowerX = std::max(fxlo, other.fxlo); + G4double lowerY = std::max(fylo, other.fylo); + G4double lowerZ = std::max(fzlo, other.fzlo); + + *out = G4DNABoundingBox{ upperX, lowerX, upperY, lowerY, upperZ, lowerZ }; + return true; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4bool G4DNABoundingBox::overlap(const G4ThreeVector& query, const G4double& Radius) const +G4bool G4DNABoundingBox::overlap(const G4ThreeVector& query, + const G4double& Radius) const { - G4double x = query.x() - this->middlePoint().x(); - G4double y = query.y() - this->middlePoint().y(); - G4double z = query.z() - this->middlePoint().z(); + G4double x = query.x() - this->middlePoint().x(); + G4double y = query.y() - this->middlePoint().y(); + G4double z = query.z() - this->middlePoint().z(); - x = std::abs(x); - y = std::abs(y); - z = std::abs(z); + x = std::abs(x); + y = std::abs(y); + z = std::abs(z); - if ((x> (Radius + this->halfSideLengthInX()))|| - (y> (Radius + this->halfSideLengthInY()))|| - (z> (Radius + this->halfSideLengthInZ()))) - { - return false;// - } - G4int num_less_extent = - (x < this->halfSideLengthInX()) + - (y < this->halfSideLengthInY()) + - (z < this->halfSideLengthInZ()); + if((x > (Radius + this->halfSideLengthInX())) || + (y > (Radius + this->halfSideLengthInY())) || + (z > (Radius + this->halfSideLengthInZ()))) + { + return false; // + } + G4int num_less_extent = (x < this->halfSideLengthInX()) + + (y < this->halfSideLengthInY()) + + (z < this->halfSideLengthInZ()); - if (num_less_extent > 1) - { - return true; - } + if(num_less_extent > 1) + { + return true; + } - x = std::max(x - this->halfSideLengthInX(), 0.0); - y = std::max(y - this->halfSideLengthInY(), 0.0); - z = std::max(z - this->halfSideLengthInZ(), 0.0); + x = std::max(x - this->halfSideLengthInX(), 0.0); + y = std::max(y - this->halfSideLengthInY(), 0.0); + z = std::max(z - this->halfSideLengthInZ(), 0.0); - double norm = std::sqrt(x*x + y*y + z*z); + G4double norm = std::sqrt(x * x + y * y + z * z); - return ( norm < Radius); + return (norm < Radius); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4bool G4DNABoundingBox::contains(const G4ThreeVector& query, const double& Radius) const +G4bool G4DNABoundingBox::contains(const G4ThreeVector& query, + const G4double& Radius) const { - G4ThreeVector temp = query - this->middlePoint(); - G4double x = std::abs(temp.x()) + this->halfSideLengthInX(); - G4double y = std::abs(temp.y()) + this->halfSideLengthInY(); - G4double z = std::abs(temp.z()) + this->halfSideLengthInZ(); - double norm = std::sqrt(x*x + y*y + z*z); - return ( norm < Radius); + G4ThreeVector temp = query - this->middlePoint(); + G4double x = std::abs(temp.x()) + this->halfSideLengthInX(); + G4double y = std::abs(temp.y()) + this->halfSideLengthInY(); + G4double z = std::abs(temp.z()) + this->halfSideLengthInZ(); + G4double norm = std::sqrt(x * x + y * y + z * z); + return (norm < Radius); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -G4bool G4DNABoundingBox::contains(const G4ThreeVector& query, const G4ThreeVector& Point, const double& Radius) const +G4bool G4DNABoundingBox::contains(const G4ThreeVector& query, + const G4ThreeVector& Point, + const G4double& Radius) const { - return ( ( (query - Point).mag() ) < Radius); + return (((query - Point).mag()) < Radius); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - array G4DNABoundingBox::partition() const { - double xmid = (fxhi + fxlo) / 2.; - double ymid = (fyhi + fylo) / 2.; - double zmid = (fzhi + fzlo) / 2.; + G4double xmid = (fxhi + fxlo) / 2.; + G4double ymid = (fyhi + fylo) / 2.; + G4double zmid = (fzhi + fzlo) / 2.; - std::array ret - { - { - G4DNABoundingBox{xmid, fxlo, ymid, fylo, zmid, fzlo}, // bottom left front - G4DNABoundingBox{fxhi, xmid, ymid, fylo, zmid, fzlo}, // bottom right front - G4DNABoundingBox{xmid, fxlo, fyhi, ymid, zmid, fzlo}, // bottom left back - G4DNABoundingBox{fxhi, xmid, fyhi, ymid, zmid, fzlo}, // bottom right back - G4DNABoundingBox{xmid, fxlo, ymid, fylo, fzhi, zmid}, // top left front - G4DNABoundingBox{fxhi, xmid, ymid, fylo, fzhi, zmid}, // top right front - G4DNABoundingBox{xmid, fxlo, fyhi, ymid, fzhi, zmid}, // top left back - G4DNABoundingBox{fxhi, xmid, fyhi, ymid, fzhi, zmid} // top right back - } - }; - return ret; + std::array ret{ { + G4DNABoundingBox{ xmid, fxlo, ymid, fylo, zmid, + fzlo }, // bottom left front + G4DNABoundingBox{ fxhi, xmid, ymid, fylo, zmid, + fzlo }, // bottom right front + G4DNABoundingBox{ xmid, fxlo, fyhi, ymid, zmid, fzlo }, // bottom left back + G4DNABoundingBox{ fxhi, xmid, fyhi, ymid, zmid, + fzlo }, // bottom right back + G4DNABoundingBox{ xmid, fxlo, ymid, fylo, fzhi, zmid }, // top left front + G4DNABoundingBox{ fxhi, xmid, ymid, fylo, fzhi, zmid }, // top right front + G4DNABoundingBox{ xmid, fxlo, fyhi, ymid, fzhi, zmid }, // top left back + G4DNABoundingBox{ fxhi, xmid, fyhi, ymid, fzhi, zmid } // top right back + } }; + return ret; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4bool G4DNABoundingBox::operator==(const G4DNABoundingBox& rhs) const { - return (fxhi == rhs.fxhi && fxlo == rhs.fxlo && - fyhi == rhs.fyhi && fylo == rhs.fylo && - fzhi == rhs.fzhi && fzlo == rhs.fzlo) || - (std::isnan(fxhi) && std::isnan(rhs.fxhi) && - std::isnan(fxlo) && std::isnan(rhs.fxlo) && - std::isnan(fyhi) && std::isnan(rhs.fyhi) && - std::isnan(fylo) && std::isnan(rhs.fylo) && - std::isnan(fzhi) && std::isnan(rhs.fzhi) && - std::isnan(fzlo) && std::isnan(rhs.fzlo)); + return (fxhi == rhs.fxhi && fxlo == rhs.fxlo && fyhi == rhs.fyhi && + fylo == rhs.fylo && fzhi == rhs.fzhi && fzlo == rhs.fzlo) || + (std::isnan(fxhi) && std::isnan(rhs.fxhi) && std::isnan(fxlo) && + std::isnan(rhs.fxlo) && std::isnan(fyhi) && std::isnan(rhs.fyhi) && + std::isnan(fylo) && std::isnan(rhs.fylo) && std::isnan(fzhi) && + std::isnan(rhs.fzhi) && std::isnan(fzlo) && std::isnan(rhs.fzlo)); } -G4bool G4DNABoundingBox::operator!=(const G4DNABoundingBox& rhs) const { +G4bool G4DNABoundingBox::operator!=(const G4DNABoundingBox& rhs) const +{ return !operator==(rhs); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... std::ostream& operator<<(std::ostream& stream, const G4DNABoundingBox& rhs) { - stream << "{" << G4BestUnit(rhs.fxhi,"Length") << ", " << G4BestUnit(rhs.fxlo,"Length") << ", " - < //#define DEBUG_MEM diff --git a/source/processes/electromagnetic/dna/management/src/G4ITTransportation.cc b/source/processes/electromagnetic/dna/management/src/G4ITTransportation.cc index 0689a1ca33..c24ed902d0 100644 --- a/source/processes/electromagnetic/dna/management/src/G4ITTransportation.cc +++ b/source/processes/electromagnetic/dna/management/src/G4ITTransportation.cc @@ -68,6 +68,7 @@ #include "G4ChordFinder.hh" #include "G4ITSafetyHelper.hh" #include "G4FieldManagerStore.hh" +#include "G4LowEnergyEmProcessSubType.hh" #include "G4UnitsTable.hh" #include "G4ReferenceCast.hh" @@ -120,7 +121,7 @@ G4ITTransportation::G4ITTransportation(const G4String& aName, int verbose) : enableAtRestDoIt = false; enableAlongStepDoIt = true; enablePostStepDoIt = true; - SetProcessSubType(60); + SetProcessSubType(fLowEnergyTransportation); SetInstantiateProcessState(true); G4VITProcess::SetInstantiateProcessState(false); fInstantiateProcessState = true; diff --git a/source/processes/electromagnetic/dna/management/src/G4Scheduler.cc b/source/processes/electromagnetic/dna/management/src/G4Scheduler.cc index 0dcff4a9fc..9570aa55e8 100644 --- a/source/processes/electromagnetic/dna/management/src/G4Scheduler.cc +++ b/source/processes/electromagnetic/dna/management/src/G4Scheduler.cc @@ -91,7 +91,7 @@ using namespace std; G4ThreadLocal G4Scheduler* G4Scheduler::fgScheduler(0); template - inline bool IsInf(T value) + inline G4bool IsInf(T value) { return std::numeric_limits::has_infinity && value == std::numeric_limits::infinity(); @@ -156,7 +156,7 @@ void G4Scheduler::Create() fPreviousTimeStep = DBL_MAX; fZeroTimeCount = 0; - fMaxNZeroTimeStepsAllowed = 10; + fMaxNZeroTimeStepsAllowed = 10000; fStartTime = 0; fTimeTolerance = 1 * picosecond; @@ -192,6 +192,9 @@ void G4Scheduler::Create() fReactionSet = G4ITReactionSet::Instance(); fMaxTimeStep = DBL_MAX; + //hoang add + fResetScavenger = true;//true by default + G4ITTypeManager::Instance()->ReserveRessource(); } @@ -271,7 +274,7 @@ void G4Scheduler::ClearList() } //_________________________________________________________________________ -void G4Scheduler::RegisterModel(G4VITStepModel* model, double time) +void G4Scheduler::RegisterModel(G4VITStepModel* model, G4double time) { fpModelHandler->RegisterModel(model, time); } @@ -404,7 +407,18 @@ void G4Scheduler::Process() fRunning = true; Reset(); - if (fpUserTimeStepAction) fpUserTimeStepAction->StartProcessing(); + //hoang 7/12/2020 + + if(fResetScavenger) { + if (fpUserScavenger != nullptr) { + fpUserScavenger->Reset(); + } + } + + if (fpUserTimeStepAction) + { + fpUserTimeStepAction->StartProcessing(); + } #ifdef G4VERBOSE G4bool trackFound = false; @@ -485,9 +499,9 @@ void G4Scheduler::Process() //_________________________________________________________________________ -double G4Scheduler::GetNextWatchedTime() const +G4double G4Scheduler::GetNextWatchedTime() const { - std::set::const_iterator up = fWatchedTimes.upper_bound(fGlobalTime); + std::set::const_iterator up = fWatchedTimes.upper_bound(fGlobalTime); if(up == fWatchedTimes.end()) return DBL_MAX; return *up; } @@ -521,8 +535,8 @@ void G4Scheduler::SynchronizeTracks() fGlobalTime = fTrackContainer.GetNextTime(); G4double tmpGlobalTime = fGlobalTime; - double nextWatchedTime = -1; - bool carryOn = true; + G4double nextWatchedTime = -1; + G4bool carryOn = true; while(fTrackContainer.MergeNextTimeToMainList(tmpGlobalTime) && carryOn) { @@ -547,7 +561,7 @@ void G4Scheduler::SynchronizeTracks() //_________________________________________________________________________ -bool G4Scheduler::CanICarryOn() +G4bool G4Scheduler::CanICarryOn() { return fGlobalTime < fEndTime && (fMaxSteps == -1 ? true : fNbSteps < fMaxSteps) && fContinue == true; @@ -740,8 +754,7 @@ void G4Scheduler::Stepping() // Call IL even if fTSTimeStep == 0 // if fILTimeStep == 0 give the priority to DoIt processes - fILTimeStep = - fpStepProcessor->ComputeInteractionLength(fPreviousTimeStep); + fILTimeStep = fpStepProcessor->ComputeInteractionLength(fPreviousTimeStep); // => at least N loops // All process returns the physical step of interaction // The transportation process calculates the corresponding @@ -937,15 +950,15 @@ void G4Scheduler::Stepping() } //_________________________________________________________________________ -double G4Scheduler::GetLimitingTimeStep() const +G4double G4Scheduler::GetLimitingTimeStep() const { if (fpUserTimeSteps == 0) return fDefaultMinTimeStep; if (fabs(fGlobalTime - fUserUpperTimeLimit) < fTimeTolerance) return fDefinedMinTimeStep; - map::const_iterator it_fpUserTimeSteps_i = fpUserTimeSteps + map::const_iterator it_fpUserTimeSteps_i = fpUserTimeSteps ->upper_bound(fGlobalTime); - map::const_iterator it_fpUserTimeSteps_low = fpUserTimeSteps + map::const_iterator it_fpUserTimeSteps_low = fpUserTimeSteps ->lower_bound(fGlobalTime); // DEBUG @@ -970,7 +983,7 @@ double G4Scheduler::GetLimitingTimeStep() const // and fpUserTimeSteps_low->first = X picosecond // but the precision is not good enough it_fpUserTimeSteps_i = it_fpUserTimeSteps_low; - map::const_iterator tmp_it = it_fpUserTimeSteps_low; + map::const_iterator tmp_it = it_fpUserTimeSteps_low; ++tmp_it; if (tmp_it == fpUserTimeSteps->end()) { @@ -1017,9 +1030,9 @@ void G4Scheduler::FindUserPreDefinedTimeStep() exceptionDescription); return; // makes coverity happy } - map::iterator fpUserTimeSteps_i = + map::iterator fpUserTimeSteps_i = fpUserTimeSteps->upper_bound(fGlobalTime); - map::iterator fpUserTimeSteps_low = fpUserTimeSteps + map::iterator fpUserTimeSteps_low = fpUserTimeSteps ->lower_bound(fGlobalTime); // DEBUG diff --git a/source/processes/electromagnetic/dna/management/src/G4SchedulerMessenger.cc b/source/processes/electromagnetic/dna/management/src/G4SchedulerMessenger.cc index 0aea49cef3..bbc28cd931 100644 --- a/source/processes/electromagnetic/dna/management/src/G4SchedulerMessenger.cc +++ b/source/processes/electromagnetic/dna/management/src/G4SchedulerMessenger.cc @@ -81,7 +81,7 @@ G4SchedulerMessenger::G4SchedulerMessenger(G4Scheduler * stepMgr) : fMaxNULLTimeSteps->SetGuidance("Set maximum allowed zero time steps. After this " "threshold, the simulation is stopped."); fMaxNULLTimeSteps->SetParameterName("numberOfNullTimeSteps", true); - fMaxNULLTimeSteps->SetDefaultValue(10); + fMaxNULLTimeSteps->SetDefaultValue(10000); fMaxNULLTimeSteps->SetRange("numberOfNullTimeSteps >=0 "); fMaxStepNumber = new G4UIcmdWithAnInteger("/scheduler/maxStepNumber", this); diff --git a/source/processes/electromagnetic/dna/models/include/G4DNADiracRMatrixExcitationModel.hh b/source/processes/electromagnetic/dna/models/include/G4DNADiracRMatrixExcitationModel.hh index 9478815b35..334805260c 100755 --- a/source/processes/electromagnetic/dna/models/include/G4DNADiracRMatrixExcitationModel.hh +++ b/source/processes/electromagnetic/dna/models/include/G4DNADiracRMatrixExcitationModel.hh @@ -100,19 +100,19 @@ private: const G4double ExcitationEnergyAu[4]={ 2.66 , 1.14 , 4.63 , 5.11}; // [eV] 5dto6s1,6sto6p1,6sto6p2 - G4double fLowEnergyLimit; - G4double fExperimentalEnergyLimit; - G4double fHighEnergyLimit; + G4double fLowEnergyLimit=0.; + G4double fExperimentalEnergyLimit=0.; + G4double fHighEnergyLimit=0.; - G4bool isInitialised; - G4bool statCode; - G4int verboseLevel; + G4bool isInitialised=false; + G4bool statCode=false; + G4int verboseLevel=0; - G4String fTableFile; - G4DNACrossSectionDataSet* fTableData; - const std::vector* fpMaterialDensity; - const G4ParticleDefinition* fParticleDefinition; - G4VAtomDeexcitation* fAtomDeexcitation; + G4String fTableFile=""; + G4DNACrossSectionDataSet* fTableData=nullptr; + const std::vector* fpMaterialDensity=nullptr; + const G4ParticleDefinition* fParticleDefinition=nullptr; + G4VAtomDeexcitation* fAtomDeexcitation=nullptr; G4int RandomSelect(const G4Material* material, const G4ParticleDefinition*, diff --git a/source/processes/electromagnetic/dna/models/include/G4DNAELSEPAElasticModel.hh b/source/processes/electromagnetic/dna/models/include/G4DNAELSEPAElasticModel.hh index 974d6ac83c..c1adb7edf6 100644 --- a/source/processes/electromagnetic/dna/models/include/G4DNAELSEPAElasticModel.hh +++ b/source/processes/electromagnetic/dna/models/include/G4DNAELSEPAElasticModel.hh @@ -72,11 +72,11 @@ public: G4double maxEnergy); void SetMaximumEnergy (G4double input) - {highEnergyLimit = input; SetHighEnergyLimit(input);}; + {fhighEnergyLimit = input; SetHighEnergyLimit(input);}; void SetKillBelowThreshold (G4double threshold); - G4double GetKillBelowThreshold() {return killBelowEnergy;} + G4double GetKillBelowThreshold() {return fkillBelowEnergy_Au;} protected: @@ -84,21 +84,18 @@ protected: private: - G4int kScreeningFactor; - - const std::vector* fpMolDensity; + const std::vector* fpMolDensity=nullptr; std::vector kIntersectionEnergySR; - G4double killBelowEnergy; - G4double lowEnergyLimit; - G4double highEnergyLimit; + G4double fkillBelowEnergy_Au=0.; + G4double flowEnergyLimit=0.; + G4double fhighEnergyLimit=0.; - G4bool isInitialised; - G4int verboseLevel; + G4bool isInitialised=false; + G4int verboseLevel=0; - typedef std::map >MapZFile; - typedef std::map>MapZData; - MapZData tableZData; + G4DNACrossSectionDataSet* fpData_Au=nullptr; + G4DNACrossSectionDataSet* fpData_H2O=nullptr; G4double Theta(G4int Z, G4ParticleDefinition * aParticleDefinition, G4double k, @@ -149,8 +146,16 @@ private: std::map > eEdummyVecZ; - typedef std::map >> VecMapZ; - VecMapZ eCumZ; + typedef std::map > VecMap; + VecMap eCum_Au; + VecMap eCum_H2O; + + typedef std::map > TriDimensionMap; + TriDimensionMap fAngleData_Au; + TriDimensionMap fAngleData_H2O; + + std::vector eEdummyVec_Au; + std::vector eEdummyVec_H2O; G4DNAELSEPAElasticModel & operator=(const G4DNAELSEPAElasticModel &right); G4DNAELSEPAElasticModel(const G4DNAELSEPAElasticModel&); diff --git a/source/processes/electromagnetic/dna/models/include/G4DNAEventScheduler.hh b/source/processes/electromagnetic/dna/models/include/G4DNAEventScheduler.hh new file mode 100644 index 0000000000..d09cb2d1e3 --- /dev/null +++ b/source/processes/electromagnetic/dna/models/include/G4DNAEventScheduler.hh @@ -0,0 +1,124 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +#ifndef G4DNAEventScheduler_hh +#define G4DNAEventScheduler_hh 1 + +#include +#include +#include +#include +#include "globals.hh" +#include "G4ITModelHandler.hh" +#include "G4ITStepStatus.hh" +#include "G4ITTrackHolder.hh" +#include "G4VStateDependent.hh" +#include "G4ITReaction.hh" +#include "G4DNAEventSet.hh" +#include "G4DNAUpdateSystemModel.hh" +class G4VITStepModel; +class G4DNAGillespieDirectMethod; +class G4UserMeshAction; +class IEventScheduler +{ + public: + IEventScheduler() = default; + virtual ~IEventScheduler() = default; +}; + +class G4DNAEventScheduler : public IEventScheduler +{ + public: + using MolType = const G4MolecularConfiguration*; + using MapList = std::map; + using MapCounter = std::map; + G4DNAEventScheduler(const G4DNABoundingBox& boundingBox, G4int pixel); + ~G4DNAEventScheduler() override; + G4DNAEventScheduler(const G4DNAEventScheduler&) = delete; + G4DNAEventScheduler& operator=(const G4DNAEventScheduler& right) = delete; + void Initialize(); + void InitializeInMesh(); + void Voxelizing(); + void ReVoxelizing(G4int); + void SetEndTime(const G4double&); + G4double GetStartTime() const; + G4double GetEndTime() const; + [[maybe_unused]] G4double GetTimeStep() const; + [[maybe_unused]] void SetStartTime(G4double time); + + inline void SetVerbose(G4int verbose) { fVerbose = verbose; } + inline G4int GetVerbose() const; + void Stepping(); + void SetChangeMesh(G4bool change) { fSetChangeMesh = change; } + + void Reset(); + void ResetInMesh(); + void RunInMesh(); + void Run(); + + [[maybe_unused]] void AddTimeToRecord(const G4double& time); + + void RecordTime(); + void ClearAndReChargeCounter(); + void PrintRecordTime(); + void Stop(); + [[maybe_unused]] void SetMaxNbSteps(G4int); + std::map GetCounterMap() const; + G4DNAMesh* GetMesh() const; + G4int GetPixels() const; + void SetUserMeshAction(std::unique_ptr); + static G4bool CheckingReactionRadius(G4double resolution); + + private: + G4int fVerbose; + G4bool fInitialized; + G4double fStartTime; + G4double fEndTime; + G4int fStepNumber; + G4int fMaxStep; + G4bool fRunning; + G4double fTimeStep; + G4double fGlobalTime; + G4double fJumpingNumber; + G4double fReactionNumber; + G4int fPixel; + G4bool fIsChangeMesh; + G4bool fSetChangeMesh; + G4int fStepNumberInMesh; + G4double fInitialPixels; + + std::unique_ptr fpMesh; + std::unique_ptr fpGillespieReaction; + std::unique_ptr fpEventSet; + std::unique_ptr fpUpdateSystem; + std::unique_ptr fpUserMeshAction; + // an aternative Counter + + std::map fCounterMap; + std::set fTimeToRecord; + std::set::iterator fLastRecoredTime; +}; +#endif diff --git a/source/processes/electromagnetic/dna/models/include/G4DNAGillespieDirectMethod.hh b/source/processes/electromagnetic/dna/models/include/G4DNAGillespieDirectMethod.hh new file mode 100644 index 0000000000..f5ec304ab0 --- /dev/null +++ b/source/processes/electromagnetic/dna/models/include/G4DNAGillespieDirectMethod.hh @@ -0,0 +1,76 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +#ifndef G4DNAGillespieDirectMethod_hh +#define G4DNAGillespieDirectMethod_hh 1 +#include "globals.hh" +#include "G4DNAMesh.hh" +#include "G4Track.hh" +#include "G4Molecule.hh" +#include "G4MolecularConfiguration.hh" +#include "G4MoleculeTable.hh" +#include "G4ITTrackHolder.hh" +#include "G4DNAEventSet.hh" + +class G4DNAMolecularReactionTable; +class G4DNAMolecularReactionData; +class G4DNAScavengerMaterial; +class G4DNAGillespieDirectMethod +{ + public: + G4DNAGillespieDirectMethod(); + ~G4DNAGillespieDirectMethod(); + using MolType = const G4MolecularConfiguration*; + using Key = unsigned int; + using Index = G4Voxel::Index; + using JumpingData = std::pair; + using ReactionData = const G4DNAMolecularReactionData; + using EventIt = G4DNAEventSet::EventSet::iterator; + + G4double PropensityFunction(const Index& index, ReactionData* data); + G4double PropensityFunction(const Index& index, MolType moleType); + inline void SetVoxelMesh(G4DNAMesh& mesh) { fpMesh = &mesh; } + void SetTimeStep(const G4double& stepTime); + G4double Reaction(const Index& index); + G4double DiffusiveJumping(const Index& index); + G4double ComputeNumberInNode(const Index& index, MolType type); + G4double VolumeOfNode(const Index& index); + void Initialize(); + void CreateEvent(unsigned int key); + void SetEventSet(G4DNAEventSet*); + + private: + G4DNAMolecularReactionTable* fMolecularReactions; + G4DNAMesh* fpMesh; + G4double fTimeStep; + G4DNAEventSet* fpEventSet; + G4double fVerbose; + std::map fReactionDataMap; + std::map fJumpingDataMap; + G4bool FindScavenging(const Index& index, MolType, G4double&); + G4DNAScavengerMaterial* fpScavengerMaterial; +}; +#endif diff --git a/source/processes/electromagnetic/dna/models/include/G4DNAIRT.hh b/source/processes/electromagnetic/dna/models/include/G4DNAIRT.hh index 63d3f978e8..eecafc1c32 100644 --- a/source/processes/electromagnetic/dna/models/include/G4DNAIRT.hh +++ b/source/processes/electromagnetic/dna/models/include/G4DNAIRT.hh @@ -73,9 +73,9 @@ public: G4bool TestReactibility(const G4Track&, const G4Track&, - double , - bool ) override; - std::vector> FindReaction(G4ITReactionSet*, const double, const double, const bool) override; + G4double , + G4bool ) override; + std::vector> FindReaction(G4ITReactionSet*, const G4double, const G4double, const G4bool) override; std::unique_ptr MakeReaction(const G4Track&, const G4Track&) override; void SetReactionModel(G4VDNAReactionModel*); @@ -109,7 +109,6 @@ private: G4int fNx, fNy, fNz; G4int xiniIndex, yiniIndex, ziniIndex; G4int xendIndex, yendIndex, zendIndex; - }; #endif /* G4DNAIRT_HH_ */ diff --git a/source/processes/electromagnetic/dna/models/include/G4DNAIRT_geometries.hh b/source/processes/electromagnetic/dna/models/include/G4DNAIRT_geometries.hh new file mode 100644 index 0000000000..cbc5e28888 --- /dev/null +++ b/source/processes/electromagnetic/dna/models/include/G4DNAIRT_geometries.hh @@ -0,0 +1,118 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/* + * G4DNAIRT_geometries.hh + * + * Created on: Jul 23, 2019 + * Author: W. G. Shin + * J. Ramos-Mendez and B. Faddegon +*/ + +#ifndef G4DNAIRT_geometries_HH_ +#define G4DNAIRT_geometries_HH_ + + +#include "globals.hh" +#include "G4ThreeVector.hh" + +#include "G4DNAMolecularReaction.hh" +#include "G4DNAMolecularReactionTable.hh" +#include "G4MoleculeTable.hh" + +#include "G4VDNAReactionModel.hh" +#include "G4VITReactionProcess.hh" + +#include "G4ITReactionTable.hh" +#include "G4ITTrackHolder.hh" +#include "G4ITReaction.hh" + +#include "G4Molecule.hh" +#include "G4VITReactionProcess.hh" +#include "G4ParticleChange.hh" +#include "G4VDNAMolecularGeometry.hh" + +#include "AddClone_def.hh" +#include +#include + +class G4DNAMolecularReactionTable; +class G4VDNAReactionModel; +class G4ErrorFunction; + +class G4DNAIRT_geometries : public G4VITReactionProcess +{ +public: + + G4DNAIRT_geometries(); + explicit G4DNAIRT_geometries(G4VDNAReactionModel*); + ~G4DNAIRT_geometries() override; + G4DNAIRT_geometries(const G4DNAIRT_geometries& other) = delete; + G4DNAIRT_geometries& operator=(const G4DNAIRT_geometries& other) = delete; + + G4bool TestReactibility(const G4Track&, + const G4Track&, + G4double , + G4bool ) override; + std::vector> FindReaction(G4ITReactionSet*, const G4double, const G4double, const G4bool) override; + std::unique_ptr MakeReaction(const G4Track&, const G4Track&) override; + + void SetReactionModel(G4VDNAReactionModel*); + + void Initialize() override; + void SpaceBinning(); + void IRTSampling(); + void Sampling(G4Track*); + + G4double GetIndependentReactionTime(const G4MolecularConfiguration*, const G4MolecularConfiguration*, G4double); + G4int FindBin(G4int, G4double, G4double, G4double); + G4double SamplePDC(G4double , G4double ); + +protected: + const G4DNAMolecularReactionTable*& fMolReactionTable; + G4VDNAReactionModel* fpReactionModel; + +private: + G4ITTrackHolder* fTrackHolder; + G4ITReactionSet* fReactionSet; + G4ErrorFunction* erfc; + + std::map>>> spaceBinned; + std::vector> positionMap; + + G4double fRCutOff; + G4double timeMin; + G4double timeMax; + + G4double fXMin, fYMin, fZMin; + G4double fXMax, fYMax, fZMax; + G4int fNx, fNy, fNz; + G4int xiniIndex, yiniIndex, ziniIndex; + G4int xendIndex, yendIndex, zendIndex; + + G4VDNAMolecularGeometry* fGeometry; +}; + +#endif /* G4DNAIRT_geometries_HH_ */ diff --git a/source/processes/electromagnetic/dna/models/include/G4DNAIndependentReactionTimeStepper.hh b/source/processes/electromagnetic/dna/models/include/G4DNAIndependentReactionTimeStepper.hh index e92e30e4bb..808e267325 100644 --- a/source/processes/electromagnetic/dna/models/include/G4DNAIndependentReactionTimeStepper.hh +++ b/source/processes/electromagnetic/dna/models/include/G4DNAIndependentReactionTimeStepper.hh @@ -34,8 +34,6 @@ #include "G4KDTreeResult.hh" #include "G4IRTUtils.hh" #include "G4VReactionType.hh" -#include "G4SystemOfUnits.hh" -#include "G4PhysicalConstants.hh" #include #include diff --git a/source/processes/electromagnetic/dna/models/include/G4DNAQuinnPlasmonExcitationModel.hh b/source/processes/electromagnetic/dna/models/include/G4DNAQuinnPlasmonExcitationModel.hh index a409e7923b..5f9d26137b 100755 --- a/source/processes/electromagnetic/dna/models/include/G4DNAQuinnPlasmonExcitationModel.hh +++ b/source/processes/electromagnetic/dna/models/include/G4DNAQuinnPlasmonExcitationModel.hh @@ -75,16 +75,15 @@ protected: private: - G4bool statCode; + G4double fLowEnergyLimit=0.; + G4double fHighEnergyLimit=0.; - G4double fLowEnergyLimit; - G4double fHighEnergyLimit; - - G4bool isInitialised; - G4int verboseLevel; + G4bool isInitialised=false; + G4bool statCode=false; + G4int verboseLevel=0; G4int nValenceElectron[100]; - const std::vector* fpMaterialDensity; + const std::vector* fpMaterialDensity=nullptr; G4int GetNValenceElectron(G4int z); diff --git a/source/processes/electromagnetic/dna/models/include/G4DNARelativisticIonisationModel.hh b/source/processes/electromagnetic/dna/models/include/G4DNARelativisticIonisationModel.hh index edc7d02628..5cfb72c457 100755 --- a/source/processes/electromagnetic/dna/models/include/G4DNARelativisticIonisationModel.hh +++ b/source/processes/electromagnetic/dna/models/include/G4DNARelativisticIonisationModel.hh @@ -116,17 +116,17 @@ private: =(const G4DNARelativisticIonisationModel &right); G4DNARelativisticIonisationModel(const G4DNARelativisticIonisationModel&); - G4double fLowEnergyLimit; - G4double fHighEnergyLimit; + G4double fLowEnergyLimit=0.; + G4double fHighEnergyLimit=0.; - G4bool isInitialised; - G4bool statCode; - G4bool fasterCode; - G4int verboseLevel; + G4bool isInitialised=false; + G4bool statCode=false; + G4bool fasterCode=false; + G4int verboseLevel=0; - const std::vector* fMaterialDensity; - const G4ParticleDefinition* fParticleDefinition; - G4VAtomDeexcitation* fAtomDeexcitation; + const std::vector* fMaterialDensity=nullptr; + const G4ParticleDefinition* fParticleDefinition=nullptr; + G4VAtomDeexcitation* fAtomDeexcitation=nullptr; G4int RandomSelect(const G4Material* material, const G4ParticleDefinition*, diff --git a/examples/advanced/gammaray_telescope/include/GammaRayTelEMstdPhysics.hh b/source/processes/electromagnetic/dna/models/include/G4DNAUpdateSystemModel.hh similarity index 58% rename from examples/advanced/gammaray_telescope/include/GammaRayTelEMstdPhysics.hh rename to source/processes/electromagnetic/dna/models/include/G4DNAUpdateSystemModel.hh index 89375d1ae0..6465952f64 100644 --- a/examples/advanced/gammaray_telescope/include/GammaRayTelEMstdPhysics.hh +++ b/source/processes/electromagnetic/dna/models/include/G4DNAUpdateSystemModel.hh @@ -24,48 +24,42 @@ // ******************************************************************** // // -// -// -// ------------------------------------------------------------ -// GEANT 4 class header file -// Class Description: -// This class is an derived class of G4VPhysicsConstructor -// -// ------------------------------------------- -// History -// first version 12 Nov. 2000 by H.Kurashige -// ------------------------------------------------------------ -#ifndef GammaRayTelEMstdPhysics_h -#define GammaRayTelEMstdPhysics_h 1 +#ifndef G4DNAUPDATESYSTEMMODEL_HH +#define G4DNAUPDATESYSTEMMODEL_HH +#include "G4DNAMesh.hh" +#include "G4VUpdateSystemModel.hh" -#include "globals.hh" -#include "G4ios.hh" +class G4MolecularConfiguration; +class G4DNAMolecularReactionTable; +class G4DNAMolecularReactionData; -#include "G4VPhysicsConstructor.hh" - - -class GammaRayTelEMstdPhysics : public G4VPhysicsConstructor +class G4DNAUpdateSystemModel : public G4VUpdateSystemModel { - public: - GammaRayTelEMstdPhysics(const G4String& name ="Standard EM"); - virtual ~GammaRayTelEMstdPhysics(); + public: + using Index = G4Voxel::Index; + using MolType = const G4MolecularConfiguration*; + using JumpingData = std::pair; + using ReactionData = const G4DNAMolecularReactionData; - public: - // This method will be invoked in the Construct() method. - // each particle type will be instantiated - virtual void ConstructParticle(); - - // This method will be invoked in the Construct() method. - // each physics process will be instantiated and - // registered to the process manager of each particle type - virtual void ConstructProcess(); + G4DNAUpdateSystemModel(); + ~G4DNAUpdateSystemModel() override = default; + void UpdateSystem(const Index& index, const ReactionData& data); + void UpdateSystem(const Index& index, const JumpingData& data); + void KillMolecule(const Index& index, MolType type); + void CreateMolecule(const Index& index, MolType); + + void JumpTo(const Index& index, MolType type); + void JumpIn(const Index& index, MolType); + + void SetMesh(G4DNAMesh*); + void SetGlobalTime(const G4double& globalTime) { fGlobalTime = globalTime; } + void SetVerbose(G4int verbose) { fVerbose = verbose; } + + private: + G4DNAMesh* fpMesh; + G4int fVerbose; + G4double fGlobalTime; }; - -#endif - - - - - +#endif // G4DNAUPDATESYSTEMMODEL_HH diff --git a/examples/advanced/brachytherapy/include/BrachyAnalysisManager.hh b/source/processes/electromagnetic/dna/models/include/G4VUpdateSystemModel.hh similarity index 86% rename from examples/advanced/brachytherapy/include/BrachyAnalysisManager.hh rename to source/processes/electromagnetic/dna/models/include/G4VUpdateSystemModel.hh index 92313f8d5e..1b1876fe70 100644 --- a/examples/advanced/brachytherapy/include/BrachyAnalysisManager.hh +++ b/source/processes/electromagnetic/dna/models/include/G4VUpdateSystemModel.hh @@ -23,15 +23,14 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -/* -Author: Susanna Guatelli, susanna@uow.edu.au - -The class BrachyAnalysisManager creates and manages histograms and ntuples -*/ - -#ifndef BrachyAnalysisManager_HH -#define BrachyAnalysisManager_HH 1 -#include "g4root.hh" -#endif - +#ifndef G4VUPDATESYSTEMMODEL_HH +#define G4VUPDATESYSTEMMODEL_HH +class G4VUpdateSystemModel +{ + public: + G4VUpdateSystemModel() = default; + virtual ~G4VUpdateSystemModel() = default; + // virtual UpdateSystem() = 0; +}; +#endif // G4VUPDATESYSTEMMODEL_HH diff --git a/source/processes/electromagnetic/dna/models/sources.cmake b/source/processes/electromagnetic/dna/models/sources.cmake index f90f16a2e9..8ad28e0b52 100644 --- a/source/processes/electromagnetic/dna/models/sources.cmake +++ b/source/processes/electromagnetic/dna/models/sources.cmake @@ -23,6 +23,7 @@ geant4_add_module(G4emdna-models G4DNAELSEPAElasticModel.hh G4DNAIonElasticModel.hh G4DNAIRT.hh + G4DNAIRT_geometries.hh G4DNAIRTMoleculeEncounterStepper.hh G4DNAMeltonAttachmentModel.hh G4DNAMillerGreenExcitationModel.hh @@ -68,6 +69,11 @@ geant4_add_module(G4emdna-models G4DNAMakeReaction.hh G4DNAPartiallyDiffusionControlled.hh G4DNATotallyDiffusionControlled.hh + G4DNAUpdateSystemModel.hh + G4DNAGillespieDirectMethod.hh + G4VUpdateSystemModel.hh + G4DNAUpdateSystemModel.hh + G4DNAEventScheduler.hh SOURCES G4DNABornAngle.cc G4DNABornExcitationModel1.cc @@ -87,6 +93,7 @@ geant4_add_module(G4emdna-models G4DNAEmfietzoglouIonisationModel.cc G4DNAIonElasticModel.cc G4DNAIRT.cc + G4DNAIRT_geometries.cc G4DNAIRTMoleculeEncounterStepper.cc G4DNAMeltonAttachmentModel.cc G4DNAMillerGreenExcitationModel.cc @@ -130,7 +137,11 @@ geant4_add_module(G4emdna-models G4DNAIndependentReactionTimeStepper.cc G4DNAMakeReaction.cc G4DNAPartiallyDiffusionControlled.cc - G4DNATotallyDiffusionControlled.cc) + G4DNATotallyDiffusionControlled.cc + G4DNAUpdateSystemModel.cc + G4DNAGillespieDirectMethod.cc + G4DNAUpdateSystemModel.cc + G4DNAEventScheduler.cc) geant4_module_link_libraries(G4emdna-models PUBLIC diff --git a/source/processes/electromagnetic/dna/models/src/G4DNABornExcitationModel2.cc b/source/processes/electromagnetic/dna/models/src/G4DNABornExcitationModel2.cc index c5751c9d3c..4957faed54 100644 --- a/source/processes/electromagnetic/dna/models/src/G4DNABornExcitationModel2.cc +++ b/source/processes/electromagnetic/dna/models/src/G4DNABornExcitationModel2.cc @@ -100,7 +100,7 @@ void G4DNABornExcitationModel2::Initialise(const G4ParticleDefinition* particle, fParticleDefinition = particle; std::ostringstream fullFileName; - char *path = getenv("G4LEDATA"); + char *path = std::getenv("G4LEDATA"); if(G4String(path) == "") { @@ -130,17 +130,16 @@ void G4DNABornExcitationModel2::Initialise(const G4ParticleDefinition* particle, fTableData = new G4PhysicsTable(); fTableData->RetrievePhysicsTable(fullFileName.str().c_str(), true); + /* for(size_t level = 0; levelsize(); ++level) { //(*fTableData)(level)->ScaleVector(1,scaleFactor); - (*fTableData)(level)->SetSpline(true); } - + */ size_t finalBin_i = 2000; G4double E_min = fLowEnergy; G4double E_max = fHighEnergy; - fTotalXS = new G4PhysicsLogVector(E_min, E_max, finalBin_i); - fTotalXS->SetSpline(true); + fTotalXS = new G4PhysicsLogVector(E_min, E_max, finalBin_i, true); G4double energy; G4double finalXS; diff --git a/source/processes/electromagnetic/dna/models/src/G4DNABornIonisationModel2.cc b/source/processes/electromagnetic/dna/models/src/G4DNABornIonisationModel2.cc index 23e1ec841d..50d87e6707 100644 --- a/source/processes/electromagnetic/dna/models/src/G4DNABornIonisationModel2.cc +++ b/source/processes/electromagnetic/dna/models/src/G4DNABornIonisationModel2.cc @@ -128,7 +128,7 @@ void G4DNABornIonisationModel2::Initialise(const G4ParticleDefinition* particle, fParticleDef = particle; // Energy limits - char *path = getenv("G4LEDATA"); + char *path = std::getenv("G4LEDATA"); // *** diff --git a/source/processes/electromagnetic/dna/models/src/G4DNAELSEPAElasticModel.cc b/source/processes/electromagnetic/dna/models/src/G4DNAELSEPAElasticModel.cc index b250146d4b..8aa673d14a 100644 --- a/source/processes/electromagnetic/dna/models/src/G4DNAELSEPAElasticModel.cc +++ b/source/processes/electromagnetic/dna/models/src/G4DNAELSEPAElasticModel.cc @@ -69,20 +69,20 @@ G4VEmModel(nam), isInitialised(false) Z = G4lrint((*theElementVector)[0]->GetZ()); // Protection: only for GOLD if (Z==79){ - killBelowEnergy = 10. * eV; // Kills e- tracking - lowEnergyLimit = 0 * eV; // Must stay at zero for killing - highEnergyLimit = 1 * GeV; // Default - SetLowEnergyLimit (lowEnergyLimit); - SetHighEnergyLimit(highEnergyLimit); + fkillBelowEnergy_Au = 10. * eV; // Kills e- tracking + flowEnergyLimit = 0 * eV; // Must stay at zero for killing + fhighEnergyLimit = 1 * GeV; // Default + SetLowEnergyLimit (flowEnergyLimit); + SetHighEnergyLimit(fhighEnergyLimit); }else{ //continue; } }else{// Protection: H2O only is available if(material->GetName()=="G4_WATER"){ - lowEnergyLimit = 10. * eV; - highEnergyLimit = 1 * MeV; - SetLowEnergyLimit (lowEnergyLimit); - SetHighEnergyLimit(highEnergyLimit); + flowEnergyLimit = 10. * eV; + fhighEnergyLimit = 1 * MeV; + SetLowEnergyLimit (flowEnergyLimit); + SetHighEnergyLimit(fhighEnergyLimit); }else{ //continue; } @@ -93,8 +93,8 @@ G4VEmModel(nam), isInitialised(false) G4cout << "ELSEPA Elastic model is constructed for " << material->GetName() << G4endl << "Energy range: " - << lowEnergyLimit / eV << " eV - " - << highEnergyLimit / MeV << " MeV" + << flowEnergyLimit / eV << " eV - " + << fhighEnergyLimit / MeV << " MeV" << G4endl; } } @@ -102,23 +102,46 @@ G4VEmModel(nam), isInitialised(false) fParticleChangeForGamma = 0; fpMolDensity = 0; + + fpData_Au=nullptr; + fpData_H2O=nullptr; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4DNAELSEPAElasticModel::~G4DNAELSEPAElasticModel() { - std::map>::iterator posZ; - for (posZ = tableZData.begin(); posZ != tableZData.end(); ++posZ) - { - G4DNACrossSectionDataSet* table = posZ->second; - delete table; - } + //std::map>::iterator posZ; + //for (posZ = tableZData.begin(); posZ != tableZData.end(); ++posZ) + //{ + // G4DNACrossSectionDataSet* table = posZ->second; + // delete table; + //} + //for (posZ = tableZData_Au.begin(); posZ != tableZData_Au.end(); ++posZ) + //{ + // G4DNACrossSectionDataSet* table = posZ->second; + // delete table; + //} + //for (posZ = tableZData_H2O.begin(); posZ != tableZData_H2O.end(); ++posZ) + //{ + // G4DNACrossSectionDataSet* table = posZ->second; + // delete table; + //} - eEdummyVecZ.clear(); - eCumZ.clear(); - fAngleDataZ.clear(); + if(fpData_Au) delete fpData_Au; + if(fpData_H2O) delete fpData_H2O; + + //eEdummyVecZ.clear(); + //eCumZ.clear(); + //fAngleDataZ.clear(); + + eEdummyVec_Au.clear(); + eEdummyVec_H2O.clear(); + eCum_Au.clear(); + eCum_H2O.clear(); + fAngleData_Au.clear(); + fAngleData_H2O.clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -145,6 +168,13 @@ const G4DataVector& ) // UNIT OF TCS G4double scaleFactor = 1.*cm*cm; + //tableZData.clear(); + //tableZData_Au.clear(); + //tableZData_H2O.clear(); + + fpData_Au=nullptr; + fpData_H2O=nullptr; + for(G4int i=0; iLoadData(fileZElectron); - tableZData[Z] = tableZE; + //G4DNACrossSectionDataSet* tableZE = + // new G4DNACrossSectionDataSet + // (new G4LogLogInterpolation, eV,scaleFactor ); + //tableZE->LoadData(fileZElectron); + ////tableZData_Au[0] = tableZE; + //tableZData[Z] = tableZE; + + fpData_Au = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, + eV, + scaleFactor ); + fpData_Au->LoadData(fileZElectron); std::ostringstream eFullFileNameZ; char *path = getenv("G4LEDATA"); @@ -200,26 +236,38 @@ const G4DataVector& ) FatalException,"Missing data file for cumulated DCS"); return; } + + //eEdummyVecZ.clear(); + //eCumZ.clear(); + //fAngleDataZ.clear(); - eEdummyVecZ.clear(); - eCumZ.clear(); - fAngleDataZ.clear(); + eEdummyVec_Au.clear(); + eCum_Au.clear(); + fAngleData_Au.clear(); - eEdummyVecZ[Z].push_back(0.); + //eEdummyVecZ[Z].push_back(0.); + eEdummyVec_Au.push_back(0.); do { G4double eDummy; G4double cumDummy; eDiffCrossSectionZ>>eDummy>>cumDummy; - if (eDummy != eEdummyVecZ[Z].back()) + //if (eDummy != eEdummyVecZ[Z].back()) + if (eDummy != eEdummyVec_Au.back()) { - eEdummyVecZ[Z].push_back(eDummy); - eCumZ[Z][eDummy].push_back(0.); + + //eEdummyVecZ[Z].push_back(eDummy); + eEdummyVec_Au.push_back(eDummy); + //eCumZ[Z][eDummy].push_back(0.); + eCum_Au[eDummy].push_back(0.); } - eDiffCrossSectionZ>>fAngleDataZ[Z][eDummy][cumDummy]; - if (cumDummy != eCumZ[Z][eDummy].back()) + //eDiffCrossSectionZ>>fAngleDataZ[Z][eDummy][cumDummy]; + eDiffCrossSectionZ>>fAngleData_Au[eDummy][cumDummy]; + //if (cumDummy != eCumZ[Z][eDummy].back()) + if (cumDummy != eCum_Au[eDummy].back()) { - eCumZ[Z][eDummy].push_back(cumDummy); + //eCumZ[Z][eDummy].push_back(cumDummy); + eCum_Au[eDummy].push_back(cumDummy); } }while(!eDiffCrossSectionZ.eof()); } @@ -244,11 +292,17 @@ const G4DataVector& ) G4String fileZElectron("dna/sigma_elastic_e_elsepa_muffin"); - G4DNACrossSectionDataSet* tableZE = - new G4DNACrossSectionDataSet( - new G4LogLogInterpolation, eV,scaleFactor ); - tableZE->LoadData(fileZElectron); - tableZData[0] = tableZE; + //G4DNACrossSectionDataSet* tableZE = + // new G4DNACrossSectionDataSet( + // new G4LogLogInterpolation, eV,scaleFactor ); + //tableZE->LoadData(fileZElectron); + ////tableZData_H2O[0] = tableZE; + //tableZData[0] = tableZE; + + fpData_H2O = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, + eV, + scaleFactor ); + fpData_H2O->LoadData(fileZElectron); std::ostringstream eFullFileNameZ; @@ -274,25 +328,37 @@ const G4DataVector& ) FatalException, "Missing data file for cumulated DCS"); - eEdummyVecZ.clear(); - eCumZ.clear(); - fAngleDataZ.clear(); + //eEdummyVecZ.clear(); + //eCumZ.clear(); + //fAngleDataZ.clear(); - eEdummyVecZ[0].push_back(0.); + eEdummyVec_H2O.clear(); + eCum_H2O.clear(); + fAngleData_H2O.clear(); + + //eEdummyVecZ[0].push_back(0.); + eEdummyVec_H2O.push_back(0.); do { G4double eDummy; G4double cumDummy; eDiffCrossSectionZ>>eDummy>>cumDummy; - if (eDummy != eEdummyVecZ[0].back()) + //if (eDummy != eEdummyVecZ[0].back()) + if (eDummy != eEdummyVec_H2O.back()) { - eEdummyVecZ[0].push_back(eDummy); - eCumZ[0][eDummy].push_back(0.); + //eEdummyVecZ[0].push_back(eDummy); + eEdummyVec_H2O.push_back(eDummy); + //eCumZ[0][eDummy].push_back(0.); + eCum_H2O[eDummy].push_back(0.); + } + //eDiffCrossSectionZ>>fAngleDataZ[0][eDummy][cumDummy]; + eDiffCrossSectionZ>>fAngleData_H2O[eDummy][cumDummy]; + //if (cumDummy != eCumZ[0][eDummy].back()){ + if (cumDummy != eCum_H2O[eDummy].back()){ + //eCumZ[0][eDummy].push_back(cumDummy); + eCum_H2O[eDummy].push_back(cumDummy); } - eDiffCrossSectionZ>>fAngleDataZ[0][eDummy][cumDummy]; - if (cumDummy != eCumZ[0][eDummy].back()) - eCumZ[0][eDummy].push_back(cumDummy); }while(!eDiffCrossSectionZ.eof()); } } @@ -310,7 +376,10 @@ const G4DataVector& ) } } // Loop on couples + fParticleChangeForGamma = GetParticleChangeForGamma(); + fpMolDensity = 0; + isInitialised = true; } @@ -346,29 +415,34 @@ G4double G4DNAELSEPAElasticModel::CrossSectionPerVolume atomicNDensity = material->GetAtomicNumDensityVector()[0]; if(atomicNDensity!= 0.0) { - if (ekin < highEnergyLimit) + if (ekin < fhighEnergyLimit) { - if (ekin < killBelowEnergy) return DBL_MAX; + if (ekin < fkillBelowEnergy_Au) return DBL_MAX; - std::map< G4int,G4DNACrossSectionDataSet*, - std::less >::iterator pos; - pos = tableZData.find(Z); - - if (pos != tableZData.end()) - { - G4DNACrossSectionDataSet* table = pos->second; - if (table != 0) - { - // XS takes its 10 eV value below 10 eV for GOLD - if (ekin < 10*eV) sigma = table->FindValue(10*eV); - else sigma = table->FindValue(ekin); - } - } - else - { - G4Exception("G4DNAELSEPAElasticModel::ComputeCrossSectionPerVolume", - "em0006",FatalException,"Model not applicable to particle type."); - } + //std::map< G4int,G4DNACrossSectionDataSet*, + // std::less >::iterator pos; + ////pos = tableZData_Au.find(0); + //pos = tableZData.find(Z); + // + ////if (pos != tableZData_Au.end()) + //if (pos != tableZData.end()) + //{ + // G4DNACrossSectionDataSet* table = pos->second; + // if (table != 0) + // { + // // XS takes its 10 eV value below 10 eV for GOLD + // if (ekin < 10*eV) sigma = table->FindValue(10*eV); + // else sigma = table->FindValue(ekin); + // } + //} + //else + //{ + // G4Exception("G4DNAELSEPAElasticModel::ComputeCrossSectionPerVolume", + // "em0006",FatalException,"Model not applicable to particle type."); + //} + + if (ekin < 10*eV) sigma = fpData_Au->FindValue(10*eV); + else sigma = fpData_Au->FindValue(ekin); } } if (verboseLevel > 2) @@ -385,7 +459,7 @@ G4double G4DNAELSEPAElasticModel::CrossSectionPerVolume G4cout << "=== G4DNAELSEPAElasticModel - XS INFO END" << G4endl; } }else{ - fpMolDensity = + fpMolDensity = G4DNAMolecularMaterial::Instance()-> GetNumMolPerVolTableFor(G4Material::GetMaterial("G4_WATER")); atomicNDensity = (*fpMolDensity)[material->GetIndex()]; @@ -393,19 +467,23 @@ G4double G4DNAELSEPAElasticModel::CrossSectionPerVolume { if (ekin < HighEnergyLimit() && ekin >= LowEnergyLimit()) { - std::map< G4int,G4DNACrossSectionDataSet*, - std::less >::iterator pos; - pos = tableZData.find(0); // the data is stored as Z=0 - //SI : XS must not be zero - // otherwise sampling of secondaries method ignored - if (pos != tableZData.end()) - { - G4DNACrossSectionDataSet* table = pos->second; - if (table != 0) - { - sigma = table->FindValue(ekin); - } - } + //std::map< G4int,G4DNACrossSectionDataSet*, + //std::less >::iterator pos; + ////pos = tableZData_H2O.find(0); // the data is stored as Z=0 + //pos = tableZData.find(0); // the data is stored as Z=0 + ////SI : XS must not be zero + //// otherwise sampling of secondaries method ignored + ////if (pos != tableZData_H2O.end()) + //if (pos != tableZData.end()) + //{ + // G4DNACrossSectionDataSet* table = pos->second; + // if (table != 0) + // { + // sigma = table->FindValue(ekin); + // } + //} + + sigma = fpData_H2O->FindValue(ekin); } } if (verboseLevel > 2) @@ -449,7 +527,7 @@ void G4DNAELSEPAElasticModel::SampleSecondaries( if (nelm==1){// Protection: only for single element G4int Z = G4lrint((*theElementVector)[0]->GetZ()); if (Z!=79) return; - if (electronEnergy0 < killBelowEnergy) + if (electronEnergy0 < fkillBelowEnergy_Au) { fParticleChangeForGamma->SetProposedKineticEnergy(0.); fParticleChangeForGamma->ProposeMomentumDirection(G4ThreeVector(0,0,0)); @@ -458,7 +536,7 @@ void G4DNAELSEPAElasticModel::SampleSecondaries( return; } - if(electronEnergy0>= killBelowEnergy && electronEnergy0 < highEnergyLimit) + if(electronEnergy0>= fkillBelowEnergy_Au && electronEnergy0 < fhighEnergyLimit) { G4double cosTheta = 0; if (electronEnergy0>=10*eV){ @@ -528,20 +606,45 @@ G4double G4DNAELSEPAElasticModel::Theta(G4int Z, if (particleDefinition == G4Electron::ElectronDefinition()) { - std::vector::iterator e2 - = std::upper_bound(eEdummyVecZ[Z].begin(), - eEdummyVecZ[Z].end(), k); + //std::vector::iterator e2 + // = std::upper_bound(eEdummyVecZ[Z].begin(), + // eEdummyVecZ[Z].end(), k); + std::vector::iterator e2; + if(Z==0){ + e2 = std::upper_bound(eEdummyVec_H2O.begin(), + eEdummyVec_H2O.end(), k); + }else if (Z==79){ + e2 = std::upper_bound(eEdummyVec_Au.begin(), + eEdummyVec_Au.end(), k); + } + std::vector::iterator e1 = e2 - 1; - std::vector::iterator cum12 - = std::upper_bound(eCumZ[Z][(*e1)].begin(), - eCumZ[Z][(*e1)].end(),integrDiff); + //std::vector::iterator cum12 + // = std::upper_bound(eCumZ[Z][(*e1)].begin(), + // eCumZ[Z][(*e1)].end(),integrDiff); + std::vector::iterator cum12; + if(Z==0){ + cum12 = std::upper_bound(eCum_H2O[(*e1)].begin(), + eCum_H2O[(*e1)].end(),integrDiff); + }else if (Z==79){ + cum12 = std::upper_bound(eCum_Au[(*e1)].begin(), + eCum_Au[(*e1)].end(),integrDiff); + } std::vector::iterator cum11 = cum12 - 1; - std::vector::iterator cum22 - = std::upper_bound(eCumZ[Z][(*e2)].begin(), - eCumZ[Z][(*e2)].end(),integrDiff); + //std::vector::iterator cum22 + // = std::upper_bound(eCumZ[Z][(*e2)].begin(), + // eCumZ[Z][(*e2)].end(),integrDiff); + std::vector::iterator cum22; + if(Z==0){ + cum22 = std::upper_bound(eCum_H2O[(*e2)].begin(), + eCum_H2O[(*e2)].end(),integrDiff); + }else if(Z==79){ + cum22 = std::upper_bound(eCum_Au[(*e2)].begin(), + eCum_Au[(*e2)].end(),integrDiff); + } std::vector::iterator cum21 = cum22 - 1; @@ -553,10 +656,21 @@ G4double G4DNAELSEPAElasticModel::Theta(G4int Z, valuecum22 = *cum22; - a11 = fAngleDataZ[Z][valueE1][valuecum11]; - a12 = fAngleDataZ[Z][valueE1][valuecum12]; - a21 = fAngleDataZ[Z][valueE2][valuecum21]; - a22 = fAngleDataZ[Z][valueE2][valuecum22]; + //a11 = fAngleDataZ[Z][valueE1][valuecum11]; + //a12 = fAngleDataZ[Z][valueE1][valuecum12]; + //a21 = fAngleDataZ[Z][valueE2][valuecum21]; + //a22 = fAngleDataZ[Z][valueE2][valuecum22]; + if(Z==0){ + a11 = fAngleData_H2O[valueE1][valuecum11]; + a12 = fAngleData_H2O[valueE1][valuecum12]; + a21 = fAngleData_H2O[valueE2][valuecum21]; + a22 = fAngleData_H2O[valueE2][valuecum22]; + }else if (Z==79){ + a11 = fAngleData_Au[valueE1][valuecum11]; + a12 = fAngleData_Au[valueE1][valuecum12]; + a21 = fAngleData_Au[valueE2][valuecum21]; + a22 = fAngleData_Au[valueE2][valuecum22]; + } } @@ -694,7 +808,7 @@ G4double G4DNAELSEPAElasticModel::RandomizeCosTheta(G4int Z, G4double k) void G4DNAELSEPAElasticModel::SetKillBelowThreshold(G4double threshold) { - killBelowEnergy = threshold; + fkillBelowEnergy_Au = threshold; if (threshold < 10 * eV) { diff --git a/source/processes/electromagnetic/dna/models/src/G4DNAEventScheduler.cc b/source/processes/electromagnetic/dna/models/src/G4DNAEventScheduler.cc new file mode 100644 index 0000000000..b80b9defaf --- /dev/null +++ b/source/processes/electromagnetic/dna/models/src/G4DNAEventScheduler.cc @@ -0,0 +1,686 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +#include +#include "G4DNAEventScheduler.hh" +#include "G4DNAGillespieDirectMethod.hh" +#include "G4SystemOfUnits.hh" +#include "G4UnitsTable.hh" +#include "G4DNAUpdateSystemModel.hh" +#include "G4DNAMolecularReactionTable.hh" +#include "G4Timer.hh" +#include "G4Scheduler.hh" +#include "G4UserMeshAction.hh" +#include "G4MoleculeCounter.hh" +#include "G4DNAScavengerMaterial.hh" + +G4DNAEventScheduler::G4DNAEventScheduler(const G4DNABoundingBox& boundingBox, + G4int pixel) + : IEventScheduler() + , fVerbose(0) + , fInitialized(false) + , fStartTime(1 * ps) + , fEndTime(10000 * s) + , fStepNumber(0) + , fMaxStep(INT_MAX) + , fRunning(true) + , fTimeStep(DBL_MAX) + , fGlobalTime(fStartTime) + , fJumpingNumber(0) + , fReactionNumber(0) + , fPixel(pixel) + , fIsChangeMesh(false) + , fSetChangeMesh(true) + , fStepNumberInMesh(0) + , fInitialPixels(fPixel) + , fpMesh(new G4DNAMesh(boundingBox, fPixel)) + , fpGillespieReaction(new G4DNAGillespieDirectMethod()) + , fpEventSet(new G4DNAEventSet()) + , fpUpdateSystem(new G4DNAUpdateSystemModel()) + , fpUserMeshAction(nullptr) +{ + if(!CheckingReactionRadius(fpMesh->GetResolution())) + { + G4String WarMessage = "resolution is not good : " + + std::to_string(fpMesh->GetResolution() / nm); + G4Exception("G4DNAEventScheduler::InitializeInMesh()", "WrongResolution", + JustWarning, WarMessage); + } +} + +void G4DNAEventScheduler::ClearAndReChargeCounter() +{ + fCounterMap.clear(); + if(fTimeToRecord.empty()) + { + G4cout << "fTimeToRecord is empty " << G4endl; + } + fLastRecoredTime = fTimeToRecord.begin(); + + if(G4VMoleculeCounter::Instance()->InUse()) // copy from MoleculeCounter + { + G4MoleculeCounter::RecordedMolecules species; + species = G4MoleculeCounter::Instance()->GetRecordedMolecules(); + if(species.get() == nullptr) + { + return; + } + else if(species->empty()) + { + G4MoleculeCounter::Instance()->ResetCounter(); + return; + } + for(auto time_mol : fTimeToRecord) + { + if(time_mol > fStartTime) + { + continue; + } + + for(auto molecule : *species) + { + G4int n_mol = G4MoleculeCounter::Instance()->GetNMoleculesAtTime( + molecule, time_mol); + + if(n_mol < 0) + { + G4cerr << "G4DNAEventScheduler::ClearAndReChargeCounter() ::N " + "molecules not valid < 0 " + << G4endl; + G4Exception("", "N<0", FatalException, ""); + } + fCounterMap[time_mol][molecule] = n_mol; + } + + fLastRecoredTime++; + } + G4MoleculeCounter::Instance()->ResetCounter(); // reset + G4MoleculeCounter::Instance()->Use(false); // no more used + } +} + +[[maybe_unused]] void G4DNAEventScheduler::AddTimeToRecord(const G4double& time) +{ + if(fTimeToRecord.find(time) == fTimeToRecord.end()) + { + fTimeToRecord.insert(time); + } +} + +G4DNAEventScheduler::~G4DNAEventScheduler() = default; + +void G4DNAEventScheduler::Voxelizing() +{ + auto pMainList = G4ITTrackHolder::Instance()->GetMainList(); + std::map TrackKeyMap; + for(auto track : *pMainList) + { + auto molType = GetMolecule(track)->GetMolecularConfiguration(); + + auto pScavengerMaterial = dynamic_cast( + G4Scheduler::Instance()->GetScavengerMaterial()); + if(pScavengerMaterial != nullptr && + pScavengerMaterial->find(molType)) // avoid voxelize the scavenger + { + continue; + } + + auto key = fpMesh->GetKey(track->GetPosition()); + if(TrackKeyMap.find(key) != TrackKeyMap.end()) + { + std::map& TrackTypeMap = TrackKeyMap[key]; + if(TrackTypeMap.find(molType) != TrackTypeMap.end()) + { + TrackTypeMap[molType]++; + } + else + { + TrackTypeMap[molType] = 1; + } + } + else + { + TrackKeyMap[key][molType] = 1; + } + } + + for(auto& it : TrackKeyMap) + { + fpMesh->SetVoxelMapList(it.first, std::move(it.second)); + } +} + +void G4DNAEventScheduler::ReVoxelizing(G4int pixel) +{ + fPixel = pixel; + auto newMesh = new G4DNAMesh(fpMesh->GetBoundingBox(), fPixel); + + auto begin = fpMesh->begin(); + auto end = fpMesh->end(); + std::map TrackKeyMap; + for(; begin != end; begin++) + { + auto index = fpMesh->GetIndex(begin->first); + auto newKey = newMesh->GetKey(fpMesh->GetIndex(index, fPixel)); + auto node = begin->second; + // if (node == nullptr) continue; + if(TrackKeyMap.find(newKey) == TrackKeyMap.end()) + { + TrackKeyMap[newKey] = node->GetMapList(); + } + else + { + for(const auto& it : node->GetMapList()) + { + TrackKeyMap[newKey][it.first] += it.second; + } + if(fVerbose > 1) + { + G4cout << "key : " << begin->first << " index : " << index + << " new index : " << fpMesh->GetIndex(index, fPixel) + << " new key : " << newKey + << " number: " << node->GetMapList().begin()->second << G4endl; + } + } + } + fpMesh.reset(newMesh); + + for(auto& it : TrackKeyMap) + { + fpMesh->SetVoxelMapList(it.first, std::move(it.second)); + } +} +void G4DNAEventScheduler::Reset() +{ + // find another solultion + fGlobalTime = fEndTime; + + // + // RecordTime();//Last register for counter + + if(fVerbose > 0) + { + G4cout << "End Processing and reset Gird, ScavengerTable, EventSet for new " + "simulation!!!!" + << G4endl; + } + fInitialized = false; + fTimeStep = 0; + fStepNumber = 0; + fGlobalTime = fStartTime; + fRunning = true; + fReactionNumber = 0; + fJumpingNumber = 0; + + fpEventSet->RemoveEventSet(); + fpMesh->Reset(); +} + +void G4DNAEventScheduler::Initialize() +{ + if(!fInitialized) + { + fPixel = fInitialPixels; + fpMesh = std::make_unique(fpMesh->GetBoundingBox(), fPixel); + + // Scavenger(); + + auto pScavengerMaterial = dynamic_cast( + G4Scheduler::Instance()->GetScavengerMaterial()); + if(pScavengerMaterial == nullptr) + { + G4cout << "pScavengerMaterial == nullptr" << G4endl; + } + else + { + if(fVerbose > 1) + { + pScavengerMaterial->PrintInfo(); + } + } + + Voxelizing(); + fpGillespieReaction->SetVoxelMesh(*fpMesh); + fpGillespieReaction->SetEventSet(fpEventSet.get()); + fpGillespieReaction->SetTimeStep( + 0); // reset fTimeStep = 0 in fpGillespieReaction + fpGillespieReaction->Initialize(); + fpUpdateSystem->SetMesh(fpMesh.get()); + ClearAndReChargeCounter(); + fInitialized = true; + } + + if(fVerbose > 0) + { + fpUpdateSystem->SetVerbose(1); + } + + if(fVerbose > 2) + { + fpMesh->PrintMesh(); + } +} +void G4DNAEventScheduler::InitializeInMesh() +{ + if(fPixel <= 1) + { + fRunning = false; + return; + } + // TEST /3 + ReVoxelizing(fPixel / 2); // + // ReVoxelizing(fPixel/3);// + + fpGillespieReaction->SetVoxelMesh(*fpMesh); + fpUpdateSystem->SetMesh(fpMesh.get()); + fpGillespieReaction->Initialize(); +} + +void G4DNAEventScheduler::ResetInMesh() +{ + if(fVerbose > 0) + { + G4cout + << "*** End Processing In Mesh and reset Mesh, EventSet for new Mesh!!!!" + << G4endl; + } + fpEventSet->RemoveEventSet(); + fInitialized = false; + fIsChangeMesh = false; + fReactionNumber = 0; + fJumpingNumber = 0; + fStepNumberInMesh = 0; +} + +G4double G4DNAEventScheduler::GetStartTime() const { return fStartTime; } + +G4double G4DNAEventScheduler::GetEndTime() const { return fEndTime; } + +[[maybe_unused]] G4double G4DNAEventScheduler::GetTimeStep() const { return fTimeStep; } + +G4int G4DNAEventScheduler::GetVerbose() const { return fVerbose; } + +[[maybe_unused]] void G4DNAEventScheduler::SetMaxNbSteps(G4int max) { fMaxStep = max; } + +[[maybe_unused]] void G4DNAEventScheduler::SetStartTime(G4double time) +{ + fStartTime = time; +} + +void G4DNAEventScheduler::Stop() { fRunning = false; } +void G4DNAEventScheduler::Run() +{ + G4Timer localtimer; + if(fVerbose > 0) + { + localtimer.Start(); + G4cout << "***G4DNAEventScheduler::Run*** for Pixel : " << fPixel << G4endl; + } + while(fEndTime > fGlobalTime && fRunning) + { + RunInMesh(); + } + if(fVerbose > 0) + { + if(!fRunning) + { + G4cout << " StepNumber(" << fStepNumber << ") = MaxStep(" << fMaxStep + << ")" << G4endl; + } + else if(fEndTime <= fGlobalTime) + { + G4cout << " GlobalTime(" << fGlobalTime << ") > EndTime(" << fEndTime + << ")" + << " StepNumber : " << fStepNumber << G4endl; + } + localtimer.Stop(); + G4cout << "***G4DNAEventScheduler::Ending::" + << G4BestUnit(fGlobalTime, "Time") + << " Events left : " << fpEventSet->size() << G4endl; + if(fVerbose > 1) { + fpMesh->PrintMesh(); + } + G4cout << " Computing Time : " << localtimer << G4endl; + } + Reset(); +} + +void G4DNAEventScheduler::RunInMesh() +{ + if(!fInitialized) + { + InitializeInMesh(); + } + G4Timer localtimerInMesh; + // if (fVerbose > 0) + { + localtimerInMesh.Start(); + G4double C = 20; + G4double D = G4MoleculeTable::Instance() + ->GetConfiguration("H2O2") + ->GetDiffusionCoefficient(); + G4double transferTime = std::pow(fpMesh->GetResolution(), 2) * C / (6 * D); + G4cout << "***G4DNAEventScheduler::RunInMesh*** for Pixel : " << fPixel + << " transferTime : " << G4BestUnit(transferTime, "Time") << G4endl; + G4cout << " resolution : " << G4BestUnit(fpMesh->GetResolution(), "Length") + << G4endl; + } + + if(fVerbose > 2) + { + fpMesh->PrintMesh(); + } + + if(fpUserMeshAction != nullptr) + { + fpUserMeshAction->BeginOfMesh(fpMesh.get(), fGlobalTime); + } + + // if diffusive jumping is avaiable, EventSet is never empty + while(!fpEventSet->Empty() && !fIsChangeMesh && fEndTime > fGlobalTime) + { + Stepping(); + fGlobalTime = fTimeStep + fStartTime; + + if(fpUserMeshAction != nullptr) + { + fpUserMeshAction->InMesh(fpMesh.get(), fGlobalTime); + } + + if(fVerbose > 2) + { + G4cout << "fGlobalTime : " << G4BestUnit(fGlobalTime, "Time") + << " fTimeStep : " << G4BestUnit(fTimeStep, "Time") << G4endl; + } + + G4double C = 20; + G4double D = G4MoleculeTable::Instance() + ->GetConfiguration("H2O2") + ->GetDiffusionCoefficient(); + if(D == 0) + { + G4ExceptionDescription exceptionDescription; + exceptionDescription << "D == 0"; + G4Exception("G4DNAEventScheduler::RunInMesh", "G4DNAEventScheduler001", + FatalErrorInArgument, exceptionDescription); + } + G4double transferTime = std::pow(fpMesh->GetResolution(), 2) * C / (6 * D); + + // if(fStepNumberInMesh > 40000 && fPixel != 1) + if(transferTime < fTimeStep && + fPixel != 1) // dont change Mesj if fPixel == 1 + { + if(fVerbose > 1) + { + G4cout << " Pixels : " << fPixel << " resolution : " + << G4BestUnit(fpMesh->GetResolution(), "Length") + << " fStepNumberInMesh : " << fStepNumberInMesh + << " at fGlobalTime : " << G4BestUnit(fGlobalTime, "Time") + << " at fTimeStep : " << G4BestUnit(fTimeStep, "Time") + << " fReactionNumber : " << fReactionNumber + << " transferTime : " << G4BestUnit(transferTime, "Time") + << G4endl; + } + if(fSetChangeMesh) + { + fIsChangeMesh = true; + } + } + } + + if(fVerbose > 1) + { + localtimerInMesh.Stop(); + G4cout << "***G4DNAEventScheduler::Ending::" + << G4BestUnit(fGlobalTime, "Time") + << " Event left : " << fpEventSet->size() << G4endl; + G4cout << " Computing Time : " << localtimerInMesh << " Due to : "; + if(fpEventSet->Empty()) + { + G4cout << "EventSet is Empty" << G4endl; + } + else if(fIsChangeMesh) + { + G4cout << "Changing Mesh from : " << fPixel + << " pixels to : " << fPixel / 2 << " pixels" << G4endl; + G4cout << "Info : ReactionNumber : " << fReactionNumber + << " JumpingNumber : " << fJumpingNumber << G4endl; + } + else if(fEndTime > fGlobalTime) + { + G4cout << " GlobalTime(" << fGlobalTime << ") > EndTime(" << fEndTime + << ")" + << " StepNumber : " << fStepNumber << G4endl; + } + if(fVerbose > 2) + { + fpMesh->PrintMesh(); + } + G4cout << G4endl; + } + + if(fpUserMeshAction != nullptr) + { + fpUserMeshAction->EndOfMesh(fpMesh.get(), fGlobalTime); + } + ResetInMesh(); +} + +void G4DNAEventScheduler::Stepping() // this event loop +{ + fStepNumber < fMaxStep ? fStepNumber++ : fRunning = false; + + if(fpEventSet->size() > fpMesh->size()) + { + G4ExceptionDescription exceptionDescription; + exceptionDescription << "fpEventSet->size() > fpMesh->size()"; + G4Exception("G4DNAEventScheduler::Stepping", "G4DNAEventScheduler002", + FatalErrorInArgument, exceptionDescription); + }; + + auto selected = fpEventSet->begin(); + const auto& key = (*selected)->GetKey(); + auto index = fpMesh->GetIndex(key); + + if(fVerbose > 1) + { + G4cout << "G4DNAEventScheduler::Stepping()*********************************" + "*******" + << G4endl; + (*selected)->PrintEvent(); + } + + // get selected time step + fTimeStep = (*selected)->GetTime(); + + // selected data + auto pJumping = (*selected)->GetJumpingData(); + auto pReaction = (*selected)->GetReactionData(); + + fpUpdateSystem->SetGlobalTime(fTimeStep + + fStartTime); // this is just for printing + + if(pJumping == nullptr && pReaction == nullptr) + { + G4ExceptionDescription exceptionDescription; + exceptionDescription << "pJumping == nullptr && pReaction == nullptr"; + G4Exception("G4DNAEventScheduler::Stepping", "G4DNAEventScheduler003", + FatalErrorInArgument, exceptionDescription); + } + + fpGillespieReaction->SetTimeStep(fTimeStep); + + if(pJumping == nullptr) + { + fpUpdateSystem->UpdateSystem(index, *pReaction); + + fpEventSet->RemoveEvent(selected); + // create new event + fpGillespieReaction->CreateEvent(key); + fReactionNumber++; + + // recordTime in reaction + RecordTime(); + } + else if(pReaction == nullptr) + { + // dont change this + fpUpdateSystem->UpdateSystem(index, *pJumping); + auto jumpingKey = fpMesh->GetKey(pJumping->second); + fpEventSet->RemoveEvent(selected); + + // create new event + // should create Jumping before key + fpGillespieReaction->CreateEvent(jumpingKey); + fpGillespieReaction->CreateEvent(key); + + fJumpingNumber++; + } + if(fVerbose > 1) + { + G4cout << "G4DNAEventScheduler::Stepping::end " + "Print***********************************" + << G4endl; + G4cout << G4endl; + } + fStepNumberInMesh++; +} + +void G4DNAEventScheduler::SetEndTime(const G4double& endTime) +{ + fEndTime = endTime; +} + +void G4DNAEventScheduler::RecordTime() +{ + auto recordTime = *fLastRecoredTime; + if(fGlobalTime >= recordTime && fCounterMap[recordTime].empty()) + { + auto begin = fpMesh->begin(); + auto end = fpMesh->end(); + for(; begin != end; begin++) + { + auto node = begin->second; + if(node == nullptr) { + continue; + } + for(const auto& it : node->GetMapList()) + { + fCounterMap[recordTime][it.first] += it.second; + } + } + fLastRecoredTime++; + +#ifdef DEBUG + PrintRecordTime(); + G4MoleculeTable* pMoleculeTable = G4MoleculeTable::Instance(); + auto iter = pMoleculeTable->GetConfigurationIterator(); + iter.reset(); + while(iter()) + { + auto conf = iter.value(); + + G4cout << "GlobalTime : " << G4BestUnit(fGlobalTime, "Time") + << " recordTime : " << G4BestUnit(recordTime, "Time") << " " + << conf->GetName() + << " number : " << fCounterMap[recordTime][conf] + << " MoleculeCounter : " + << G4MoleculeCounter::Instance()->GetCurrentNumberOf(conf) + << G4endl; + + assert(G4MoleculeCounter::Instance()->GetCurrentNumberOf(conf) == + fCounterMap[recordTime][conf]); + } +#endif + } +} + +void G4DNAEventScheduler::PrintRecordTime() +{ + G4cout << "fCounterMap.size : " << fCounterMap.size() << G4endl; + + for(const auto& i : fCounterMap) + { + auto map = i.second; + auto begin = map.begin(); // + auto end = map.end(); // + for(; begin != end; begin++) + { + auto molecule = begin->first; + auto number = begin->second; + if(number == 0) + { + continue; + } + G4cout << "molecule : " << molecule->GetName() << " number : " << number + << G4endl; + } + } +} + +std::map +G4DNAEventScheduler::GetCounterMap() const +{ + return fCounterMap; +} + +void G4DNAEventScheduler::SetUserMeshAction( + std::unique_ptr pUserMeshAction) +{ + fpUserMeshAction = std::move(pUserMeshAction); +} + +G4DNAMesh* G4DNAEventScheduler::GetMesh() const { return fpMesh.get(); } + +G4int G4DNAEventScheduler::GetPixels() const { return fPixel; } + +G4bool G4DNAEventScheduler::CheckingReactionRadius(G4double resolution) +{ + auto pMolecularReactionTable = G4DNAMolecularReactionTable::Instance(); + auto reactionDataList = pMolecularReactionTable->GetVectorOfReactionData(); + if(reactionDataList.empty()) + { + G4cout << "reactionDataList.empty()" << G4endl; + return true; + } + else + { + for(auto it : reactionDataList) + { + if(it->GetEffectiveReactionRadius() >= resolution / CLHEP::pi) + { + G4cout << it->GetReactant1()->GetName() << " + " + << it->GetReactant2()->GetName() << G4endl; + G4cout << "G4DNAEventScheduler::ReactionRadius : " + << G4BestUnit(it->GetEffectiveReactionRadius(), "Length") + << G4endl; + G4cout << "resolution : " << G4BestUnit(resolution, "Length") << G4endl; + return false; + } + } + return true; + } +} \ No newline at end of file diff --git a/source/processes/electromagnetic/dna/models/src/G4DNAGillespieDirectMethod.cc b/source/processes/electromagnetic/dna/models/src/G4DNAGillespieDirectMethod.cc new file mode 100644 index 0000000000..37e5a971f4 --- /dev/null +++ b/source/processes/electromagnetic/dna/models/src/G4DNAGillespieDirectMethod.cc @@ -0,0 +1,344 @@ +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +#include "G4DNAMolecularReactionTable.hh" +#include "G4DNAGillespieDirectMethod.hh" +#include "Randomize.hh" +#include "G4PhysicalConstants.hh" +#include +#include +#include "G4DNAEventSet.hh" +#include "G4UnitsTable.hh" +#include "G4DNAScavengerMaterial.hh" +#include "G4Scheduler.hh" +#include + +G4DNAGillespieDirectMethod::G4DNAGillespieDirectMethod() + : fMolecularReactions(G4DNAMolecularReactionTable::Instance()) + , fpMesh(nullptr) + , fTimeStep(0) + , fpEventSet(nullptr) + , fVerbose(0) + , fpScavengerMaterial(nullptr) +{} + +G4DNAGillespieDirectMethod::~G4DNAGillespieDirectMethod() = default; + +void G4DNAGillespieDirectMethod::SetEventSet(G4DNAEventSet* pEventSet) +{ + fpEventSet = pEventSet; +} + +//#define DEBUG 1 + +G4double G4DNAGillespieDirectMethod::VolumeOfNode(const Index& index) +{ + auto LengthY = fpMesh->GetBoundingBox(index).Getyhi() - + fpMesh->GetBoundingBox(index).Getylo(); + auto LengthX = fpMesh->GetBoundingBox(index).Getxhi() - + fpMesh->GetBoundingBox(index).Getxlo(); + auto LengthZ = fpMesh->GetBoundingBox(index).Getzhi() - + fpMesh->GetBoundingBox(index).Getzlo(); + G4double V = LengthY * LengthX * LengthZ; + assert(V > 0); + return V; +} +G4double G4DNAGillespieDirectMethod::PropensityFunction(const Index& index, + MolType moleType) +{ + if(moleType->GetDiffusionCoefficient() == 0) + { + return 0.; + } + const auto& node = fpMesh->GetVoxelMapList(index); + G4double alpha = 0; + auto it = node.find(moleType); + if(it != node.end()) + { + auto LengthY = fpMesh->GetBoundingBox(index).Getyhi() - + fpMesh->GetBoundingBox(index).Getylo(); + G4double d = it->first->GetDiffusionCoefficient() / std::pow(LengthY, 2); + alpha = d * it->second; + +#ifdef DEBUG + G4cout << it->first->GetName() << " " << it->second + << " D : " << it->first->GetDiffusionCoefficient() + << " LengthY : " << LengthY << " PropensityFunction : " << alpha + << G4endl; +#endif + } + return alpha; +} + +G4double G4DNAGillespieDirectMethod::PropensityFunction(const Index& index, + ReactionData* data) +{ + G4double value; + auto ConfA = data->GetReactant1(); + auto ConfB = data->GetReactant2(); + G4double scavengerNumber = 0; + auto typeANumber = FindScavenging(index, ConfA, scavengerNumber) + ? scavengerNumber + : ComputeNumberInNode(index, ConfA); + + auto typeBNumber = FindScavenging(index, ConfB, scavengerNumber) + ? scavengerNumber + : ComputeNumberInNode(index, ConfB); + + if(typeANumber == 0 || typeBNumber == 0) + { + return 0; + } + + auto k = + data->GetObservedReactionRateConstant() / (Avogadro * VolumeOfNode(index)); + if(ConfA == ConfB) + { + value = typeANumber * (typeBNumber - 1) * k; + } + else + { + value = typeANumber * typeBNumber * k; + } + + if(value < 0) + { + G4cout << "G4DNAGillespieDirectMethod::PropensityFunction for : " + << ConfA->GetName() << "(" << typeANumber << ") + " + << ConfB->GetName() << "(" << typeBNumber + << ") : propensity : " << value + << " GetObservedReactionRateConstant : " + << data->GetObservedReactionRateConstant() + << " GetEffectiveReactionRadius : " + << G4BestUnit(data->GetEffectiveReactionRadius(), "Length") + << " k : " << k << " volume : " << VolumeOfNode(index) + << " Index : " << index << G4endl; + assert(false); + } + +#ifdef DEBUG + if(value > 0) + G4cout << "G4DNAGillespieDirectMethod::PropensityFunction for : " + << ConfA->GetName() << "(" << typeANumber << ") + " + << ConfB->GetName() << "(" << typeBNumber + << ") : propensity : " << value + << " Time to Reaction : " << G4BestUnit(timeToReaction, "Time") + << " k : " << k << " Index : " << index << G4endl; +#endif + + return value; +} + +void G4DNAGillespieDirectMethod::Initialize() +{ + // for Scavenger + fpScavengerMaterial = dynamic_cast( + G4Scheduler::Instance()->GetScavengerMaterial()); + + auto begin = fpMesh->begin(); + auto end = fpMesh->end(); + for(; begin != end; begin++) + { + auto key = begin->first; +#ifdef DEBUG + fpMesh->PrintVoxel(fpMesh->GetIndex(key)); +#endif + CreateEvent(key); + } +} + +void G4DNAGillespieDirectMethod::SetTimeStep(const G4double& stepTime) +{ + fTimeStep = stepTime; +} +void G4DNAGillespieDirectMethod::CreateEvent(unsigned int key) +{ + G4double r1 = G4UniformRand(); + G4double r2 = G4UniformRand(); + auto index = fpMesh->GetIndex(key); + G4double dAlpha0 = DiffusiveJumping(index); + G4double rAlpha0 = Reaction(index); + G4double alphaTotal = dAlpha0 + rAlpha0; + + if(alphaTotal == 0) + { + return; + } + auto timeStep = ((1.0 / (alphaTotal)) * std::log(1.0 / r1)) + fTimeStep; + +#ifdef DEBUG + G4cout << "r2 : " << r2 << " rAlpha0 : " << rAlpha0 + << " dAlpha0 : " << dAlpha0 << " rAlpha0 / (dAlpha0 + rAlpha0) : " + << rAlpha0 / (dAlpha0 + rAlpha0) << G4endl; +#endif + if(r2 < rAlpha0 / alphaTotal) + { + if(fVerbose > 1) + { + G4cout << "=>>>>reaction at : " << timeStep << " timeStep : " + << G4BestUnit(((1.0 / alphaTotal) * std::log(1.0 / r1)), "Time") + << G4endl; + } + auto rSelectedIter = fReactionDataMap.upper_bound(r2 * alphaTotal); + fpEventSet->CreateEvent(timeStep, key, rSelectedIter->second); + } + else if(dAlpha0 > 0) + { + if(fVerbose > 1) + { + G4cout << "=>>>>jumping at : " << timeStep << " timeStep : " + << G4BestUnit(((1.0 / alphaTotal) * std::log(1.0 / r1)), "Time") + << G4endl; + } + + auto dSelectedIter = fJumpingDataMap.upper_bound(r2 * alphaTotal - rAlpha0); + auto pDSelected = + std::make_unique>(dSelectedIter->second); + fpEventSet->CreateEvent(timeStep, key, std::move(pDSelected)); + } +#ifdef DEBUG + G4cout << G4endl; +#endif +} + +G4double G4DNAGillespieDirectMethod::Reaction(const Index& index) +{ + fReactionDataMap.clear(); + G4double alpha0 = 0; + auto dataList = fMolecularReactions->GetVectorOfReactionData(); + if(dataList.empty()) + { + G4cout << "MolecularReactionTable empty" << G4endl; + assert(false); + } + for(const auto& it : dataList) + { + auto propensity = PropensityFunction(index, it); + if(propensity == 0) + { + continue; + } + alpha0 += propensity; + fReactionDataMap[alpha0] = it; + } +#ifdef DEBUG + G4cout << "Reaction :alpha0 : " << alpha0 << G4endl; +#endif + return alpha0; +} + +G4double G4DNAGillespieDirectMethod::DiffusiveJumping(const Index& index) +{ + fJumpingDataMap.clear(); + G4double alpha0 = 0; + auto NeighboringVoxels = fpMesh->FindNeighboringVoxels(index); + if(NeighboringVoxels.empty()) + { + return 0; + } + auto iter = G4MoleculeTable::Instance()->GetConfigurationIterator(); + while(iter()) + { + const auto conf = iter.value(); + auto propensity = PropensityFunction(index, conf); + if(propensity == 0) + { + continue; + } + for(const auto& it_Neighbor : NeighboringVoxels) + { + alpha0 += propensity; + fJumpingDataMap[alpha0] = std::make_pair(conf, it_Neighbor); +#ifdef DEBUG + G4cout << "mole : " << conf->GetName() + << " number : " << ComputeNumberInNode(index, conf) + << " propensity : " << propensity << " alpha0 : " << alpha0 + << G4endl; +#endif + } + } +#ifdef DEBUG + G4cout << "DiffusiveJumping :alpha0 : " << alpha0 << G4endl; +#endif + return alpha0; +} + +G4double G4DNAGillespieDirectMethod::ComputeNumberInNode( + const Index& index, MolType type) // depend node ? +{ + if(type->GetDiffusionCoefficient() != 0) + { + const auto& node = fpMesh->GetVoxelMapList(index); + const auto& it = node.find(type); + return (it != node.end()) ? (it->second) : 0; + } + else + { + return 0; + } +} + +G4bool G4DNAGillespieDirectMethod::FindScavenging(const Index& index, + MolType moletype, + G4double& numberOfScavenger) +{ + numberOfScavenger = 0; + if(fpScavengerMaterial == nullptr) + { + return false; + } + auto volumeOfNode = VolumeOfNode(index); + if(G4MoleculeTable::Instance()->GetConfiguration("H2O") == moletype) + { + auto factor = Avogadro * volumeOfNode; + numberOfScavenger = factor; + return true; + } + + G4double totalNumber = + fpScavengerMaterial->GetNumberMoleculePerVolumeUnitForMaterialConf( + moletype); + if(totalNumber == 0) + { + return false; + } + else + { + G4double numberInDouble = + volumeOfNode * std::floor(totalNumber) / fpMesh->GetBoundingBox().Volume(); + auto numberInInterg = (int) (std::floor(numberInDouble)); + G4double ram = G4UniformRand(); + G4double change = numberInDouble - numberInInterg; + if(ram > change) + { + numberOfScavenger = numberInInterg; + } + else + { + numberOfScavenger = numberInInterg + 1; + } + return true; + } +} diff --git a/source/processes/electromagnetic/dna/models/src/G4DNAIRT.cc b/source/processes/electromagnetic/dna/models/src/G4DNAIRT.cc index 6950d81985..b2472b615c 100644 --- a/source/processes/electromagnetic/dna/models/src/G4DNAIRT.cc +++ b/source/processes/electromagnetic/dna/models/src/G4DNAIRT.cc @@ -52,7 +52,7 @@ G4VITReactionProcess(), fMolReactionTable(reference_cast(fpReactionTable)), fpReactionModel(nullptr), fTrackHolder(G4ITTrackHolder::Instance()), -fReactionSet(0) +fReactionSet(nullptr) { timeMin = G4Scheduler::Instance()->GetStartTime(); timeMax = G4Scheduler::Instance()->GetEndTime(); @@ -247,10 +247,11 @@ void G4DNAIRT::Sampling(G4Track* track){ for(size_t u=0; usize();u++){ if((*fReactionDatas)[u]->GetReactant2()->GetDiffusionCoefficient() == 0){ G4double kObs = (*fReactionDatas)[u]->GetObservedReactionRateConstant(); + if(kObs == 0) continue; G4double time = -(std::log(1.0 - G4UniformRand())/kObs) + globalTime; if( time < minTime && time >= globalTime && time < timeMax){ minTime = time; - index = (int) u; + index = (G4int)u; } } } @@ -277,18 +278,19 @@ G4double G4DNAIRT::GetIndependentReactionTime(const G4MolecularConfiguration* mo G4double irt = -1 * ps; G4double D = molA->GetDiffusionCoefficient() + molB->GetDiffusionCoefficient(); + if(D == 0) D += 1e-20*(m2/s); G4double rc = fReactionData->GetOnsagerRadius(); if ( reactionType == 0){ G4double sigma = fReactionData->GetEffectiveReactionRadius(); - if( rc != 0) r0 = -rc / (1-std::exp(rc/r0)); if(sigma > r0) return 0; // contact reaction + if( rc != 0) r0 = -rc / (1-std::exp(rc/r0)); G4double Winf = sigma/r0; G4double W = G4UniformRand(); - if ( W < Winf ) irt = (0.25/D) * std::pow( (r0-sigma)/erfc->erfcInv(r0*W/sigma), 2 ); + if ( W > 0 && W < Winf ) irt = (0.25/D) * std::pow( (r0-sigma)/erfc->erfcInv(r0*W/sigma), 2 ); return irt; } @@ -319,8 +321,8 @@ G4double G4DNAIRT::GetIndependentReactionTime(const G4MolecularConfiguration* mo Winf = sigma / r0 * kobs / kdif; if(Winf > G4UniformRand()) irt = SamplePDC(a,b)/D; - return irt; - } + return irt; + } return -1 * ps; } @@ -404,7 +406,7 @@ std::unique_ptr G4DNAIRT::MakeReaction(const G4Track& trackA G4double dt = globalTime - trackA.GetGlobalTime(); - if(dt != 0){ + if(dt != 0 && (D1 + D2) != 0 && r0 != 0){ G4double s12 = 2.0 * D1 * dt; G4double s22 = 2.0 * D2 * dt; if(s12 == 0) r2 = r1; @@ -415,6 +417,9 @@ std::unique_ptr G4DNAIRT::MakeReaction(const G4Track& trackA G4RandGauss::shoot(0, s12 + s22 * s22 / s12), G4RandGauss::shoot(0, s12 + s22 * s22 / s12)); + if(alpha == 0){ + return pChanges; + } S1.setPhi(rad * G4UniformRand() * 2.0 * CLHEP::pi); S1.setTheta(rad * std::acos(1.0 + 1./alpha * std::log(1.0 - G4UniformRand() * (1 - std::exp(-2.0 * alpha))))); @@ -441,6 +446,9 @@ std::unique_ptr G4DNAIRT::MakeReaction(const G4Track& trackA const G4double sqrD1 = D1 == 0. ? 0. : std::sqrt(D1); const G4double sqrD2 = D2 == 0. ? 0. : std::sqrt(D2); + if((sqrD1 + sqrD2) == 0){ + return pChanges; + } const G4double inv_numerator = 1./(sqrD1 + sqrD2); const G4ThreeVector reactionSite = sqrD2 * inv_numerator * trackA.GetPosition() + sqrD1 * inv_numerator * trackB.GetPosition(); @@ -487,9 +495,9 @@ std::unique_ptr G4DNAIRT::MakeReaction(const G4Track& trackA std::vector> G4DNAIRT::FindReaction( G4ITReactionSet* pReactionSet, - const double /*currentStepTime*/, - const double fGlobalTime, - const bool /*reachedUserStepTimeLimit*/) + const G4double /*currentStepTime*/, + const G4double fGlobalTime, + const G4bool /*reachedUserStepTimeLimit*/) { std::vector> fReactionInfo; fReactionInfo.clear(); @@ -528,8 +536,8 @@ std::vector> G4DNAIRT::FindReaction( G4bool G4DNAIRT::TestReactibility(const G4Track& /*trackA*/, const G4Track& /*trackB*/, - double /*currentStepTime*/, - bool /*userStepTimeLimit*/) /*const*/ + G4double /*currentStepTime*/, + G4bool /*userStepTimeLimit*/) /*const*/ { return true; } diff --git a/source/processes/electromagnetic/dna/models/src/G4DNAIRT_geometries.cc b/source/processes/electromagnetic/dna/models/src/G4DNAIRT_geometries.cc new file mode 100644 index 0000000000..e89817e2a4 --- /dev/null +++ b/source/processes/electromagnetic/dna/models/src/G4DNAIRT_geometries.cc @@ -0,0 +1,642 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +/* + * G4DNAIRT_geometries.cc + * + * Created on: Jul 23, 2019 + * Author: W. G. Shin + * J. Ramos-Mendez and B. Faddegon +*/ + + +#include "G4DNAIRT_geometries.hh" +#include "G4ErrorFunction.hh" +#include "G4SystemOfUnits.hh" +#include "G4PhysicalConstants.hh" +#include "Randomize.hh" +#include "G4DNAMolecularReactionTable.hh" +#include "G4MolecularConfiguration.hh" +#include "G4Molecule.hh" +#include "G4ITReactionChange.hh" +#include "G4ITTrackHolder.hh" +#include "G4ITReaction.hh" +#include "G4Scheduler.hh" +#include "G4MoleculeTable.hh" +#include "G4NavigationHistory.hh" +#include "G4DNAMolecularMaterial.hh" +#include "G4VDNAMolecularGeometry.hh" + +using namespace std; + +G4DNAIRT_geometries::G4DNAIRT_geometries() : +G4VITReactionProcess(), +fMolReactionTable(reference_cast(fpReactionTable)), +fpReactionModel(nullptr), +fTrackHolder(G4ITTrackHolder::Instance()), +fReactionSet(nullptr), +fGeometry(nullptr) +{ + timeMin = G4Scheduler::Instance()->GetStartTime(); + timeMax = G4Scheduler::Instance()->GetEndTime(); + + fXMin = 1e9*nm; + fYMin = 1e9*nm; + fZMin = 1e9*nm; + + fXMax = 0e0*nm; + fYMax = 0e0*nm; + fZMax = 0e0*nm; + + fNx = 0; + fNy = 0; + fNz = 0; + + xiniIndex = 0, yiniIndex = 0, ziniIndex = 0; + xendIndex = 0, yendIndex = 0, zendIndex = 0; + + fRCutOff = + 1.45 * nm + 2 * std::sqrt(8*9.46e9*nm*nm/s * timeMax); // 95% confidence level + + erfc = new G4ErrorFunction(); +} + + +G4DNAIRT_geometries::G4DNAIRT_geometries(G4VDNAReactionModel* pReactionModel) + : G4DNAIRT_geometries() +{ + fpReactionModel = pReactionModel; +} + +G4DNAIRT_geometries::~G4DNAIRT_geometries() +{ + delete erfc; +} + +void G4DNAIRT_geometries::Initialize(){ + + timeMin = G4Scheduler::Instance()->GetGlobalTime(); + timeMax = std::min(timeMin + G4Scheduler::Instance()->GetLimitingTimeStep(), + G4Scheduler::Instance()->GetEndTime()); + if(timeMin == 0) return; + + fTrackHolder = G4ITTrackHolder::Instance(); + if(fTrackHolder->GetMainList()->size() == 0) return; + + fReactionSet = G4ITReactionSet::Instance(); + fReactionSet->CleanAllReaction(); + fReactionSet->SortByTime(); + + spaceBinned.clear(); + positionMap.clear(); + + fRCutOff = + 1.45 * nm + 2 * std::sqrt(8*9.46e9*nm*nm/s * (timeMax - timeMin)); + + xiniIndex = 0; + yiniIndex = 0; + ziniIndex = 0; + xendIndex = 0; + yendIndex = 0; + zendIndex = 0; + + fXMin = 1e9*nm; + fYMin = 1e9*nm; + fZMin = 1e9*nm; + + fXMax = 0e0*nm; + fYMax = 0e0*nm; + fZMax = 0e0*nm; + + fNx = 0; + fNy = 0; + fNz = 0; + + fGeometry = fMolReactionTable->GetGeometry(); + + SpaceBinning(); // 1. binning the space + IRTSampling(); // 2. Sampling of the IRT + +} + +void G4DNAIRT_geometries::SpaceBinning(){ + G4double time_step = G4Scheduler::Instance()->GetPreviousTimeStep()*ps; + + auto it_begin = fTrackHolder->GetMainList()->begin(); + while(it_begin != fTrackHolder->GetMainList()->end()){ + + // for diffusion + G4double D = GetMolecule(*it_begin)->GetDiffusionCoefficient(); + G4double sqrt_2Dt = sqrt(2 * D * time_step); + + G4double x = G4RandGauss::shoot(0,sqrt_2Dt); + G4double y = G4RandGauss::shoot(0,sqrt_2Dt); + G4double z = G4RandGauss::shoot(0,sqrt_2Dt); + + G4ThreeVector position_ori = it_begin->GetPosition(); + G4ThreeVector position = position_ori + G4ThreeVector(x,y,z); + it_begin->SetPosition(position); + it_begin->SetGlobalTime(timeMax); + + if ( fXMin > position.x() ) fXMin = position.x(); + if ( fYMin > position.y() ) fYMin = position.y(); + if ( fZMin > position.z() ) fZMin = position.z(); + + if ( fXMax < position.x() ) fXMax = position.x(); + if ( fYMax < position.y() ) fYMax = position.y(); + if ( fZMax < position.z() ) fZMax = position.z(); + + ++it_begin; + } + + fNx = G4int((fXMax-fXMin)/fRCutOff) == 0 ? 1 : G4int((fXMax-fXMin)/fRCutOff); + fNy = G4int((fYMax-fYMin)/fRCutOff) == 0 ? 1 : G4int((fYMax-fYMin)/fRCutOff); + fNz = G4int((fZMax-fZMin)/fRCutOff) == 0 ? 1 : G4int((fZMax-fZMin)/fRCutOff); + +} + +void G4DNAIRT_geometries::IRTSampling(){ + + auto it_begin = fTrackHolder->GetMainList()->begin(); + while(it_begin != fTrackHolder->GetMainList()->end()){ + G4int I = FindBin(fNx, fXMin, fXMax, it_begin->GetPosition().x()); + G4int J = FindBin(fNy, fYMin, fYMax, it_begin->GetPosition().y()); + G4int K = FindBin(fNz, fZMin, fZMax, it_begin->GetPosition().z()); + + spaceBinned[I][J][K].push_back(*it_begin); + + Sampling(*it_begin); + ++it_begin; + } +} + +void G4DNAIRT_geometries::Sampling(G4Track* track){ + G4Molecule* molA = G4Molecule::GetMolecule(track); + const G4MolecularConfiguration* molConfA = molA->GetMolecularConfiguration(); + if(molConfA->GetDiffusionCoefficient() == 0) return; + + const vector* reactivesVector = + fMolReactionTable->CanReactWith(molConfA); + + if(reactivesVector == nullptr) return; + + G4double globalTime = G4Scheduler::Instance()->GetGlobalTime(); + G4double minTime = timeMax; + + xiniIndex = FindBin(fNx, fXMin, fXMax, track->GetPosition().x()-fRCutOff); + xendIndex = FindBin(fNx, fXMin, fXMax, track->GetPosition().x()+fRCutOff); + yiniIndex = FindBin(fNy, fYMin, fYMax, track->GetPosition().y()-fRCutOff); + yendIndex = FindBin(fNy, fYMin, fYMax, track->GetPosition().y()+fRCutOff); + ziniIndex = FindBin(fNz, fZMin, fZMax, track->GetPosition().z()-fRCutOff); + zendIndex = FindBin(fNz, fZMin, fZMax, track->GetPosition().z()+fRCutOff); + + for ( G4int ii = xiniIndex; ii <= xendIndex; ++ii ) { + for ( G4int jj = yiniIndex; jj <= yendIndex; ++jj ) { + for ( G4int kk = ziniIndex; kk <= zendIndex; ++kk ) { + + std::vector spaceBin = spaceBinned[ii][jj][kk]; + for ( G4int n = 0; n < (G4int)spaceBinned[ii][jj][kk].size(); ++n ) { + if(!spaceBin[n] || track == spaceBin[n]) continue; + if(spaceBin[n]->GetTrackStatus() == fStopButAlive) continue; + + G4Molecule* molB = G4Molecule::GetMolecule(spaceBin[n]); + if(!molB) continue; + + const G4MolecularConfiguration* molConfB = molB->GetMolecularConfiguration(); + if(molConfB->GetDiffusionCoefficient() == 0) continue; + + auto it = std::find(reactivesVector->begin(), reactivesVector->end(), molConfB); + if(it == reactivesVector->end()) continue; + + G4ThreeVector orgPosB = spaceBin[n]->GetPosition(); + G4double dt = track->GetGlobalTime() - spaceBin[n]->GetGlobalTime(); + G4ThreeVector newPosB = orgPosB; + + if(dt > 0){ + G4double sigma, x, y, z; + G4double diffusionCoefficient = G4Molecule::GetMolecule(spaceBin[n])->GetDiffusionCoefficient(); + + sigma = std::sqrt(2.0 * diffusionCoefficient * dt); + + x = G4RandGauss::shoot(0., 1.0)*sigma; + y = G4RandGauss::shoot(0., 1.0)*sigma; + z = G4RandGauss::shoot(0., 1.0)*sigma; + + newPosB = orgPosB + G4ThreeVector(x,y,z); + }else if(dt < 0) continue; + + G4double r0 = (newPosB - track->GetPosition()).mag(); + G4double irt = GetIndependentReactionTime(molConfA, + molConfB, + r0); + if(irt>=0 && irtGetName()<<" "<GetTrackID()<<'\t'<GetName()<<" "<GetTrackID()<<'\n'; +#endif + fReactionSet->AddReaction(irt,track,spaceBin[n]); + } + } + spaceBin.clear(); + } + } + } + +// Scavenging & first order reactions + + auto fReactionDatas = fMolReactionTable->GetReactionData(molConfA); + G4int index = -1; + + for(size_t u=0; usize();++u){ + auto molB = (*fReactionDatas)[u]->GetReactant2(); + if(molB == G4MoleculeTable::Instance()->GetConfiguration("H2O(B)") || + molB == G4MoleculeTable::Instance()->GetConfiguration("H3Op(B)") || + molB == G4MoleculeTable::Instance()->GetConfiguration("OHm(B)")){ + G4double kObs = (*fReactionDatas)[u]->GetObservedReactionRateConstant(); + if(kObs == 0) continue; + G4double time = -(std::log(1.0 - G4UniformRand())/kObs) + globalTime; + if( time < minTime && time >= globalTime && time < timeMax){ + minTime = time; + index = (G4int)u; + } + } + } + + if(index != -1){ +#ifdef DEBUG + G4cout<<"scavenged: "<GetName()<GetTrackID()<<'\n'; +#endif + G4Molecule* fakeMol = new G4Molecule((*fReactionDatas)[index]->GetReactant2()); + G4Track* fakeTrack = fakeMol->BuildTrack(globalTime,track->GetPosition()); + fTrackHolder->Push(fakeTrack); + fReactionSet->AddReaction(minTime, track, fakeTrack); + } + + + // DNA reactions + if(fGeometry == nullptr) return; + + const G4VTouchable* touchable = track->GetTouchable(); + if(touchable == nullptr) return; + + const G4LogicalVolume* logicalVolume = touchable->GetVolume()->GetLogicalVolume(); + + const G4ThreeVector& globalPos = track->GetPosition(); + const G4ThreeVector& localPos = touchable->GetHistory()->GetTopTransform().TransformPoint(globalPos); + + G4double D = GetMolecule(track)->GetDiffusionCoefficient(); + G4double time_step = abs(timeMax - timeMin); + G4double search_range = 2*sqrt(2*D*time_step); + + std::vector result_pv; + result_pv.clear(); + fGeometry->FindNearbyMolecules(logicalVolume, + localPos, + result_pv, + search_range); + + if(result_pv.empty()) return; + + for(auto physicalVolume : result_pv){ + const G4Material* material = physicalVolume->GetLogicalVolume()->GetMaterial(); + G4MolecularConfiguration* dna_molConf = + G4DNAMolecularMaterial::Instance()->GetMolecularConfiguration(material); + + auto it = std::find(reactivesVector->begin(), reactivesVector->end(), dna_molConf); + if(it == reactivesVector->end()) continue; + G4ThreeVector pos = physicalVolume->GetTranslation(); + + G4ThreeVector globalPos_DNA = touchable->GetHistory()->GetTopTransform().Inverse().TransformPoint(pos); + + G4double r0 = (pos - localPos).mag(); + G4double irt = GetIndependentReactionTime(molConfA,dna_molConf,r0); + + if(irt>=0 && irtBuildTrack(globalTime,globalPos_DNA); + DNATrack->SetTrackStatus(fAlive); + fTrackHolder->Push(DNATrack); + positionMap.push_back(std::make_pair(globalPos_DNA,DNATrack)); + }else{ + DNATrack = positionMap[index].second; + } + + irt += globalTime; + if(irt < minTime) minTime = irt; +#ifdef DEBUG + G4cout<GetName()<<" "<GetTrackID()<<'\t'<GetName()<<" "<GetTrackID()<<'\n'; +#endif + fReactionSet->AddReaction(irt,track,DNATrack); + } + } +} + + +G4double G4DNAIRT_geometries::GetIndependentReactionTime(const G4MolecularConfiguration* molA, const G4MolecularConfiguration* molB, G4double distance) { + const auto pMoleculeA = molA; + const auto pMoleculeB = molB; + auto fReactionData = fMolReactionTable->GetReactionData(pMoleculeA, pMoleculeB); + G4int reactionType = fReactionData->GetReactionType(); + G4double r0 = distance; + if(r0 == 0) r0 += 1e-3*nm; + G4double irt = -1 * ps; + G4double D = molA->GetDiffusionCoefficient() + + molB->GetDiffusionCoefficient(); + if(D == 0) D += 1e-20*(m2/s); + G4double rc = fReactionData->GetOnsagerRadius(); + + if ( reactionType == 0){ + G4double sigma = fReactionData->GetEffectiveReactionRadius(); + + if(sigma > r0) return 0; // contact reaction + if( rc != 0) r0 = -rc / (1-std::exp(rc/r0)); + + G4double Winf = sigma/r0; + G4double W = G4UniformRand(); + + if ( W > 0 && W < Winf ) irt = (0.25/D) * std::pow( (r0-sigma)/erfc->erfcInv(r0*W/sigma), 2 ); + + return irt; + } + else if ( reactionType == 1 ){ + G4double sigma = fReactionData->GetReactionRadius(); + G4double kact = fReactionData->GetActivationRateConstant(); + G4double kdif = fReactionData->GetDiffusionRateConstant(); + G4double kobs = fReactionData->GetObservedReactionRateConstant(); + + G4double a, b, Winf; + + if ( rc == 0 ) { + a = 1/sigma * kact / kobs; + b = (r0 - sigma) / 2; + } else { + G4double v = kact/Avogadro/(4*CLHEP::pi*pow(sigma,2) * exp(-rc / sigma)); + G4double alpha = v+rc*D/(pow(sigma,2)*(1-exp(-rc/sigma))); + a = 4*pow(sigma,2)*alpha/(D*pow(rc,2))*pow(sinh(rc/(2*sigma)),2); + b = rc/4*(cosh(rc/(2*r0))/sinh(rc/(2*r0))-cosh(rc/(2*sigma))/sinh(rc/(2*sigma))); + r0 = -rc/(1-std::exp(rc/r0)); + sigma = fReactionData->GetEffectiveReactionRadius(); + } + + if(sigma > r0){ + if(fReactionData->GetProbability() > G4UniformRand()) return 0; + else return irt; + } + Winf = sigma / r0 * kobs / kdif; + + if(Winf > G4UniformRand()) irt = SamplePDC(a,b)/D; + return irt; + } + + return -1 * ps; +} + +G4int G4DNAIRT_geometries::FindBin(G4int n, G4double xmin, G4double xmax, G4double value) { + + G4int bin = -1; + if ( value <= xmin ) + bin = 0; //1; + else if ( value >= xmax) //!(xmax < value) ) //value >= xmax ) + bin = n-1; //n; + else + bin = G4int( n * ( value - xmin )/( xmax - xmin ) ); //bin = 1 + G4int( n * ( value - xmin )/( xmax - xmin ) ); + + if ( bin < 0 ) bin = 0; + if ( bin >= n ) bin = n-1; + + return bin; +} + +G4double G4DNAIRT_geometries::SamplePDC(G4double a, G4double b) { + + G4double p = 2.0 * std::sqrt(2.0*b/a); + G4double q = 2.0 / std::sqrt(2.0*b/a); + G4double M = max(1.0/(a*a),3.0*b/a); + + G4double X, U, lambdax; + + G4int ntrials = 0; + while(1) { + + // Generate X + U = G4UniformRand(); + if ( U < p/(p + q * M) ) X = pow(U * (p + q * M) / 2, 2); + else X = pow(2/((1-U)*(p+q*M)/M),2); + + U = G4UniformRand(); + + lambdax = std::exp(-b*b/X) * ( 1.0 - a * std::sqrt(CLHEP::pi * X) * erfc->erfcx(b/std::sqrt(X) + a*std::sqrt(X))); + + if ((X <= 2.0*b/a && U <= lambdax) || + (X >= 2.0*b/a && U*M/X <= lambdax)) break; + + ntrials++; + + if ( ntrials > 10000 ){ + G4cout<<"Totally rejected"<<'\n'; + return -1.0; + } + } + return X; +} + +std::unique_ptr G4DNAIRT_geometries::MakeReaction(const G4Track& trackA, + const G4Track& trackB) +{ + + std::unique_ptr pChanges(new G4ITReactionChange()); + pChanges->Initialize(trackA, trackB); + + const auto pMoleculeA = GetMolecule(trackA)->GetMolecularConfiguration(); + const auto pMoleculeB = GetMolecule(trackB)->GetMolecularConfiguration(); + const auto pReactionData = fMolReactionTable->GetReactionData(pMoleculeA, pMoleculeB); + + G4double globalTime = G4Scheduler::Instance()->GetGlobalTime(); + G4double effectiveReactionRadius = pReactionData->GetEffectiveReactionRadius(); + + const G4double D1 = pMoleculeA->GetDiffusionCoefficient(); + const G4double D2 = pMoleculeB->GetDiffusionCoefficient(); + + G4ThreeVector r1 = trackA.GetPosition(); + G4ThreeVector r2 = trackB.GetPosition(); + + if(r1 == r2) r2 += G4ThreeVector(0,0,1e-3*nm); + + G4ThreeVector S1 = r1 - r2; + + G4double r0 = S1.mag(); + + S1.setMag(effectiveReactionRadius); + + G4double dt = globalTime - trackA.GetGlobalTime(); + + if(dt != 0 && (D1 + D2) != 0 && r0 != 0){ + G4double s12 = 2.0 * D1 * dt; + G4double s22 = 2.0 * D2 * dt; + if(s12 == 0) r2 = r1; + else if(s22 == 0) r1 = r2; + else{ + G4double alpha = effectiveReactionRadius * r0 / (2*(D1 + D2)*dt); + G4ThreeVector S2 = (r1 + (s12 / s22)*r2) + G4ThreeVector(G4RandGauss::shoot(0, s12 + s22 * s22 / s12), + G4RandGauss::shoot(0, s12 + s22 * s22 / s12), + G4RandGauss::shoot(0, s12 + s22 * s22 / s12)); + + S1.setPhi(rad * G4UniformRand() * 2.0 * CLHEP::pi); + S1.setTheta(rad * std::acos(1.0 + 1./alpha * std::log(1.0 - G4UniformRand() * (1 - std::exp(-2.0 * alpha))))); + + r1 = (D1 * S1 + D2 * S2) / (D1 + D2); + r2 = D2 * (S2 - S1) / (D1 + D2); + } + } + + auto pTrackA = const_cast(pChanges->GetTrackA()); + auto pTrackB = const_cast(pChanges->GetTrackB()); + + pTrackA->SetPosition(r1); + pTrackB->SetPosition(r2); + + pTrackA->SetGlobalTime(globalTime); + pTrackB->SetGlobalTime(globalTime); + + pTrackA->SetTrackStatus(fStopButAlive); + pTrackB->SetTrackStatus(fStopButAlive); + + const G4int nbProducts = pReactionData->GetNbProducts(); + + if(nbProducts){ + + const G4double sqrD1 = D1 == 0. ? 0. : std::sqrt(D1); + const G4double sqrD2 = D2 == 0. ? 0. : std::sqrt(D2); + const G4double inv_numerator = 1./(sqrD1 + sqrD2); + const G4ThreeVector reactionSite = sqrD2 * inv_numerator * trackA.GetPosition() + + sqrD1 * inv_numerator * trackB.GetPosition(); + + std::vector position; + + if(nbProducts == 1){ + position.push_back(reactionSite); + }else if(nbProducts == 2){ + position.push_back(trackA.GetPosition()); + position.push_back(trackB.GetPosition()); + }else if (nbProducts == 3){ + position.push_back(reactionSite); + position.push_back(trackA.GetPosition()); + position.push_back(trackB.GetPosition()); + } + + for(G4int u = 0; u < nbProducts; ++u){ + + auto product = new G4Molecule(pReactionData->GetProduct(u)); + auto productTrack = product->BuildTrack(globalTime, + position[u]); + + productTrack->SetTrackStatus(fAlive); + fTrackHolder->Push(productTrack); + + pChanges->AddSecondary(productTrack); + + G4int I = FindBin(fNx, fXMin, fXMax, position[u].x()); + G4int J = FindBin(fNy, fYMin, fYMax, position[u].y()); + G4int K = FindBin(fNz, fZMin, fZMax, position[u].z()); + + spaceBinned[I][J][K].push_back(productTrack); + + Sampling(productTrack); + } + } + + fTrackHolder->MergeSecondariesWithMainList(); + pChanges->KillParents(true); + return pChanges; +} + + +std::vector> G4DNAIRT_geometries::FindReaction( + G4ITReactionSet* pReactionSet, + const G4double /*currentStepTime*/, + const G4double fGlobalTime, + const G4bool /*reachedUserStepTimeLimit*/) +{ + std::vector> fReactionInfo; + fReactionInfo.clear(); + + if (pReactionSet == nullptr) + { + return fReactionInfo; + } + + auto fReactionsetInTime = pReactionSet->GetReactionsPerTime(); + assert(fReactionsetInTime.begin() != fReactionsetInTime.end()); + + auto it_begin = fReactionsetInTime.begin(); + while(it_begin != fReactionsetInTime.end()) + { + G4double irt = it_begin->get()->GetTime(); + + if(fGlobalTime < irt) break; + + pReactionSet->SelectThisReaction(*it_begin); + + G4Track* pTrackA = it_begin->get()->GetReactants().first; + G4Track* pTrackB = it_begin->get()->GetReactants().second; + auto pReactionChange = MakeReaction(*pTrackA, *pTrackB); + + if(pReactionChange){ + fReactionInfo.push_back(std::move(pReactionChange)); + } + + fReactionsetInTime = pReactionSet->GetReactionsPerTime(); + it_begin = fReactionsetInTime.begin(); + } + + return fReactionInfo; +} + +G4bool G4DNAIRT_geometries::TestReactibility(const G4Track& /*trackA*/, + const G4Track& /*trackB*/, + G4double /*currentStepTime*/, + G4bool /*userStepTimeLimit*/) /*const*/ +{ + return true; +} + +void G4DNAIRT_geometries::SetReactionModel(G4VDNAReactionModel* model) +{ + fpReactionModel = model; +} diff --git a/source/processes/electromagnetic/dna/models/src/G4DNAUpdateSystemModel.cc b/source/processes/electromagnetic/dna/models/src/G4DNAUpdateSystemModel.cc new file mode 100644 index 0000000000..0d8b163fe3 --- /dev/null +++ b/source/processes/electromagnetic/dna/models/src/G4DNAUpdateSystemModel.cc @@ -0,0 +1,275 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +#include "G4DNAUpdateSystemModel.hh" +#include "G4Molecule.hh" +#include "G4DNAMolecularReactionTable.hh" +#include "G4UnitsTable.hh" +#include "G4MoleculeCounter.hh" +#include "G4DNAScavengerMaterial.hh" +#include "G4Scheduler.hh" +G4DNAUpdateSystemModel::G4DNAUpdateSystemModel() + : G4VUpdateSystemModel() + , fpMesh(nullptr) + , fVerbose(0) + , fGlobalTime(DBL_MAX) +{} + +void G4DNAUpdateSystemModel::SetMesh(G4DNAMesh* pMesh) { fpMesh = pMesh; } +void G4DNAUpdateSystemModel::KillMolecule(const Index& index, MolType type) +{ + // kill normal molecule + auto& node = fpMesh->GetVoxelMapList(index); + auto iter = node.find(type); + if(iter != node.end()) + { + if(iter->second <= 0) + { + G4cout << "G4DNAUpdateSystemModel::KillMolecule::molecule : " + << type->GetName() << " index : " << index + << " number : " << iter->second << G4endl; + assert(false); + } + iter->second--; + if(G4VMoleculeCounter::Instance()->InUse()) + { + G4VMoleculeCounter::Instance()->RemoveAMoleculeAtTime(type, fGlobalTime); + } + } + else + { + auto pScavengerMaterial = dynamic_cast( + G4Scheduler::Instance()->GetScavengerMaterial()); + if(pScavengerMaterial != nullptr) + { + pScavengerMaterial->ReduceNumberMoleculePerVolumeUnitForMaterialConf( + type, fGlobalTime); + } + else + { + G4cout << "index : " << index << " " << type->GetName() << G4endl; + G4cout << "This molecule is not belong scavengers or particle-base" + << G4endl; + assert(false); + } + } +} + +void G4DNAUpdateSystemModel::JumpTo(const Index& index, MolType type) +{ + auto& node = fpMesh->GetVoxelMapList(index); + + auto iter = node.find(type); + if(iter != node.end()) + { + if(iter->second <= 0) + { + G4cout << "G4DNAUpdateSystemModel::KillMolecule::molecule : " + << type->GetName() << " index : " << index + << " number : " << iter->second << G4endl; + assert(false); + } + iter->second--; + } + else + { + G4cout << "index : " << index << " " << type->GetName() << G4endl; + G4cout << "This molecule is not belong particle-base" << G4endl; + assert(false); + } +} + +void G4DNAUpdateSystemModel::CreateMolecule(const Index& index, MolType type) +{ + // for scavenger + auto pScavengerMaterial = dynamic_cast( + G4Scheduler::Instance()->GetScavengerMaterial()); + if(pScavengerMaterial != nullptr && pScavengerMaterial->find(type)) + { + pScavengerMaterial->AddNumberMoleculePerVolumeUnitForMaterialConf( + type, fGlobalTime); + return; + } + // for molecule + auto& node = fpMesh->GetVoxelMapList(index); + auto iter = node.find(type); + if(iter != node.end()) + { + iter->second++; + } + else + { + node[type] = 1; + } + + if(G4VMoleculeCounter::Instance()->InUse()) + { + G4VMoleculeCounter::Instance()->AddAMoleculeAtTime(type, fGlobalTime); + } +} + +void G4DNAUpdateSystemModel::JumpIn(const Index& index, MolType type) +{ + // for molecule + auto& node = fpMesh->GetVoxelMapList(index); + auto iter = node.find(type); + if(iter != node.end()) + { + iter->second++; + } + else + { + node[type] = 1; + } +} + +void G4DNAUpdateSystemModel::UpdateSystem(const Index& index, + const ReactionData& data) +{ + auto reactant1 = data.GetReactant1(); + auto reactant2 = data.GetReactant2(); +#ifdef G4VERBOSE + if(fVerbose != 0) + { + G4cout << "At time : " << std::setw(7) << G4BestUnit(fGlobalTime, "Time") + << " Reaction : " << reactant1->GetName() << " + " + << reactant2->GetName() << " -> "; + } +#endif + const G4int nbProducts = data.GetNbProducts(); + if(nbProducts != 0) + { + for(size_t j = 0; j < (size_t) nbProducts; ++j) + { +#ifdef G4VERBOSE + if((fVerbose != 0) && j != 0) + { + G4cout << " + "; + } + if(fVerbose != 0) + { + G4cout << data.GetProduct(j)->GetName(); + // for test + // G4cout<<" fGlobalTime : "<InUse()) + if(fpMesh->GetNumberOfType(data.GetProduct(j)) != + G4MoleculeCounter::Instance()->GetCurrentNumberOf( + data.GetProduct(j))) + { + G4cout << "*********G4DNAUpdateSystemModel::DEBUG::GetNumberOfType(" + << data.GetProduct(j)->GetName() + << ") : " << fpMesh->GetNumberOfType(data.GetProduct(j)) + << G4endl; + G4cout << "G4MoleculeCounter::GetCurrentNumberOf (" + << data.GetProduct(j)->GetName() << ") : " + << G4MoleculeCounter::Instance()->GetCurrentNumberOf( + data.GetProduct(j)) + << G4endl; + G4MoleculeCounter::Instance()->Dump(); + throw; + } + +#endif + } + } + else + { +#ifdef G4VERBOSE + if(fVerbose != 0) + { + G4cout << "No product"; + // for test + // G4cout<<" fGlobalTime : "<InUse()) + if(fpMesh->GetNumberOfType(reactant1) != + G4MoleculeCounter::Instance()->GetCurrentNumberOf(reactant1)) + { + G4cout << "*********G4DNAUpdateSystemModel::DEBUG::GetNumberOfType(" + << reactant1->GetName() + << ") : " << fpMesh->GetNumberOfType(reactant1) << G4endl; + G4cout << "G4MoleculeCounter::GetCurrentNumberOf (" + << reactant1->GetName() << ") : " + << G4MoleculeCounter::Instance()->GetCurrentNumberOf(reactant1) + << G4endl; + G4MoleculeCounter::Instance()->Dump(); + throw; + } +#endif + KillMolecule(index, reactant2); +#ifdef DEBUG + + if(G4MoleculeCounter::Instance()->InUse()) + if(fpMesh->GetNumberOfType(reactant2) != + G4MoleculeCounter::Instance()->GetCurrentNumberOf(reactant2)) + { + G4cout << "*********G4DNAUpdateSystemModel::DEBUG::GetNumberOfType(" + << reactant2->GetName() + << ") : " << fpMesh->GetNumberOfType(reactant2) << G4endl; + G4cout << "G4MoleculeCounter::GetCurrentNumberOf (" + << reactant2->GetName() << ") : " + << G4MoleculeCounter::Instance()->GetCurrentNumberOf(reactant2) + << G4endl; + G4MoleculeCounter::Instance()->Dump(); + throw; + } +#endif +} + +void G4DNAUpdateSystemModel::UpdateSystem(const Index& index, + const JumpingData& data) +{ + auto reactant = std::get<0>(data); + auto JunpToIndex = std::get<1>(data); +#ifdef G4VERBOSE + if(fVerbose > 1) + { + G4cout << "At time : " << std::setw(7) << G4BestUnit(fGlobalTime, "Time") + << " Jumping : " << reactant->GetName() << " from " << index + << " -> " << JunpToIndex << G4endl; + } +#endif + JumpTo(index, reactant); + JumpIn(JunpToIndex, reactant); +} \ No newline at end of file diff --git a/source/processes/electromagnetic/dna/models/src/G4VLEPTSModel.cc b/source/processes/electromagnetic/dna/models/src/G4VLEPTSModel.cc index ef558b4a5f..6a5dcf3cf7 100644 --- a/source/processes/electromagnetic/dna/models/src/G4VLEPTSModel.cc +++ b/source/processes/electromagnetic/dna/models/src/G4VLEPTSModel.cc @@ -68,16 +68,13 @@ G4double G4VLEPTSModel::GetMeanFreePath(const G4Material* aMaterial, const G4ParticleDefinition* , G4double kineticEnergy ) { - G4double MeanFreePath; - G4bool isOutRange ; if( verboseLevel >= 3 ) G4cout << aMaterial->GetIndex() << " G4VLEPTSModel::GetMeanFreePath " << kineticEnergy << " > " << theHighestEnergyLimit << " < " << theLowestEnergyLimit << G4endl; if (kineticEnergy > theHighestEnergyLimit || kineticEnergy < theLowestEnergyLimit) MeanFreePath = DBL_MAX; else - MeanFreePath = (*theMeanFreePathTable)(aMaterial->GetIndex())-> - GetValue(kineticEnergy, isOutRange); + MeanFreePath = (*theMeanFreePathTable)(aMaterial->GetIndex())->Value(kineticEnergy); return MeanFreePath; } @@ -184,8 +181,8 @@ void G4VLEPTSModel::BuildMeanFreePathTable( const G4Material* aMaterial, std::ma G4PhysicsLogVector* ptrVector = new G4PhysicsLogVector(theLowestEnergyLimit, theHighestEnergyLimit, theNumbBinTable); for (G4int ii=0; ii < theNumbBinTable; ii++) { - LowEdgeEnergy = ptrVector->GetLowEdgeEnergy(ii); - if( verboseLevel >= 2 ) G4cout << GetName() << " " << ii << " LowEdgeEnergy " << LowEdgeEnergy << " > " << theLowestEnergyLimit << " < " << theHighestEnergyLimit << G4endl; + LowEdgeEnergy = ptrVector->Energy(ii); + if( verboseLevel >= 2 ) G4cout << GetName() << " " << ii << " Energy " << LowEdgeEnergy << " > " << theLowestEnergyLimit << " < " << theHighestEnergyLimit << G4endl; //- fValue = ComputeMFP(LowEdgeEnergy, material, aParticleName); fValue = 0.; if( LowEdgeEnergy >= theLowestEnergyLimit && diff --git a/source/processes/electromagnetic/dna/molecules/management/include/G4FakeParticleID.hh b/source/processes/electromagnetic/dna/molecules/management/include/G4FakeParticleID.hh index ebbd73be16..49c5ad787a 100644 --- a/source/processes/electromagnetic/dna/molecules/management/include/G4FakeParticleID.hh +++ b/source/processes/electromagnetic/dna/molecules/management/include/G4FakeParticleID.hh @@ -56,7 +56,7 @@ private : friend G4FakeParticleID operator -(const G4FakeParticleID& left,const int& right); int fValue; - static G4ThreadLocal int fLastValue; + inline static G4ThreadLocal int fLastValue = 999666999; public : diff --git a/source/processes/electromagnetic/dna/molecules/management/sources.cmake b/source/processes/electromagnetic/dna/molecules/management/sources.cmake index a947bf0abb..4ffae18003 100644 --- a/source/processes/electromagnetic/dna/molecules/management/sources.cmake +++ b/source/processes/electromagnetic/dna/molecules/management/sources.cmake @@ -18,7 +18,6 @@ geant4_add_module(G4emdna-molman G4VMolecularDissociationDisplacer.hh G4VMoleculeCounter.hh SOURCES - G4FakeParticleID.cc G4MolecularConfiguration.cc G4MolecularDissociationChannel.cc G4MolecularDissociationTable.cc diff --git a/source/processes/electromagnetic/dna/molecules/management/src/G4MolecularConfiguration.cc b/source/processes/electromagnetic/dna/molecules/management/src/G4MolecularConfiguration.cc index e92980410d..95d3d2624d 100644 --- a/source/processes/electromagnetic/dna/molecules/management/src/G4MolecularConfiguration.cc +++ b/source/processes/electromagnetic/dna/molecules/management/src/G4MolecularConfiguration.cc @@ -705,14 +705,6 @@ G4MolecularConfiguration::MoveOneElectron(G4int orbitToFree, const G4String& G4MolecularConfiguration::GetName() const { -// if (fName.isNull()) -// { -// fName = fMoleculeDefinition->GetName(); -// fName += "^"; -// // fName+= "{"; -// fName += G4UIcommand::ConvertToString(fDynCharge); -// // fName+= "}"; -// } return fName; } @@ -720,14 +712,6 @@ const G4String& G4MolecularConfiguration::GetName() const const G4String& G4MolecularConfiguration::GetFormatedName() const { -// if (fFormatedName.isNull()) -// { -// fFormatedName = fMoleculeDefinition->GetFormatedName(); -// fFormatedName += "^"; -// fFormatedName += "{"; -// fFormatedName += G4UIcommand::ConvertToString(fDynCharge); -// fFormatedName += "}"; -// } return fFormatedName; } diff --git a/source/processes/electromagnetic/dna/processes/include/G4DNAScavengerProcess.hh b/source/processes/electromagnetic/dna/processes/include/G4DNAScavengerProcess.hh new file mode 100644 index 0000000000..68b9bbd4be --- /dev/null +++ b/source/processes/electromagnetic/dna/processes/include/G4DNAScavengerProcess.hh @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +#ifndef G4DNASCAVENGERPROCESS_HH +#define G4DNASCAVENGERPROCESS_HH + +#include "G4VITProcess.hh" +class G4DNAMolecularReactionData; +class G4MolecularConfiguration; +class G4DNABoundingBox; +class G4DNAScavengerMaterial; +class G4DNAScavengerProcess : public G4VITProcess +{ + public: + using MolType = const G4MolecularConfiguration*; + using Data = const G4DNAMolecularReactionData; + explicit G4DNAScavengerProcess(const G4String& aName, + const G4DNABoundingBox& box, + G4ProcessType type = fDecay); + ~G4DNAScavengerProcess() override; + G4DNAScavengerProcess(const G4DNAScavengerProcess&) = delete; + G4DNAScavengerProcess& operator=(const G4DNAScavengerProcess&) = delete; + void StartTracking(G4Track*) override; + void SetReaction(MolType, Data* pData); + + public: + void BuildPhysicsTable(const G4ParticleDefinition&) override; + + G4double PostStepGetPhysicalInteractionLength( + const G4Track& track, G4double previousStepSize, + G4ForceCondition* condition) override; + + G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&) override; + + G4double AtRestGetPhysicalInteractionLength(const G4Track&, + G4ForceCondition*) override + { + return -1.0; + } + + G4VParticleChange* AtRestDoIt(const G4Track&, const G4Step&) override + { + return nullptr; + } + + // no operation in AlongStepDoIt + G4double AlongStepGetPhysicalInteractionLength(const G4Track&, G4double, + G4double, G4double&, + G4GPILSelection*) override + { + return -1.0; + } + + // no operation in AlongStepDoIt + G4VParticleChange* AlongStepDoIt(const G4Track&, const G4Step&) override + { + return nullptr; + } + + protected: + struct G4DNAScavengerProcessState : public G4ProcessState + { + G4DNAScavengerProcessState(); + ~G4DNAScavengerProcessState() override { ; } + G4double fPreviousTimeAtPreStepPoint; + G4bool fIsInGoodMaterial; + }; + + protected: + G4bool fIsInitialized; + G4double fReturnedValue; + G4ParticleChange fParticleChange; + const G4MolecularConfiguration* fpMolecularConfiguration; + std::map> + fConfMap; + std::vector fpMaterialVector; + MolType fpMaterialConf; + const G4DNABoundingBox* fpBoundingBox; + G4DNAScavengerMaterial* fpScavengerMaterial; + G4int fVerbose; +}; +#endif // FLASH1_G4DNASCAVENGERPROCESS_HH diff --git a/source/processes/electromagnetic/dna/processes/sources.cmake b/source/processes/electromagnetic/dna/processes/sources.cmake index c878fa9cd9..3775771210 100644 --- a/source/processes/electromagnetic/dna/processes/sources.cmake +++ b/source/processes/electromagnetic/dna/processes/sources.cmake @@ -21,6 +21,7 @@ geant4_add_module(G4emdna-processes G4DNARotExcitation.hh G4DNASecondOrderReaction.hh G4DNAVibExcitation.hh + G4DNAScavengerProcess.hh SOURCES G4DNAAttachment.cc G4DNABrownianTransportation.cc @@ -38,7 +39,8 @@ geant4_add_module(G4emdna-processes G4DNARotExcitation.cc G4DNAWaterDissociationDisplacer.cc G4DNASecondOrderReaction.cc - G4DNAVibExcitation.cc) + G4DNAVibExcitation.cc + G4DNAScavengerProcess.cc) geant4_module_link_libraries(G4emdna-processes PUBLIC diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAAttachment.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAAttachment.cc index 811079fac5..ebde04c14d 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAAttachment.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAAttachment.cc @@ -26,6 +26,7 @@ #include "G4DNAAttachment.hh" #include "G4LEPTSAttachmentModel.hh" +#include "G4LowEnergyEmProcessSubType.hh" #include "G4SystemOfUnits.hh" #include "G4Positron.hh" @@ -38,7 +39,7 @@ G4DNAAttachment::G4DNAAttachment(const G4String& processName, G4ProcessType type):G4VEmProcess (processName, type), isInitialised(false) { - SetProcessSubType(55); + SetProcessSubType(fLowEnergyAttachment); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNABrownianTransportation.cc b/source/processes/electromagnetic/dna/processes/src/G4DNABrownianTransportation.cc index d46b122eb9..8182a582fa 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNABrownianTransportation.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNABrownianTransportation.cc @@ -57,6 +57,7 @@ #include "G4ITNavigator.hh" #include "G4ITSafetyHelper.hh" // Not used yet #include "G4TrackingInformation.hh" +#include "G4LowEnergyEmProcessSubType.hh" using namespace std; @@ -126,7 +127,7 @@ G4DNABrownianTransportation::G4DNABrownianTransportation(const G4String& aName, fpState.reset(new G4ITBrownianState()); //ctor - SetProcessSubType(61); + SetProcessSubType(fLowEnergyBrownianTransportation); fNistWater = G4NistManager::Instance()->FindOrBuildMaterial("G4_WATER"); fpWaterDensity = 0; @@ -148,7 +149,7 @@ G4DNABrownianTransportation::G4DNABrownianTransportation(const G4DNABrownianTran G4ITTransportation(right) { //copy ctor - SetProcessSubType(61); + SetProcessSubType(fLowEnergyBrownianTransportation); fUseMaximumTimeBeforeReachingBoundary = right .fUseMaximumTimeBeforeReachingBoundary; fUseSchedulerMinTimeSteps = right.fUseSchedulerMinTimeSteps; diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAChargeDecrease.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAChargeDecrease.cc index 5cd4ad3934..3ea0c47f35 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAChargeDecrease.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAChargeDecrease.cc @@ -26,6 +26,7 @@ #include "G4DNAChargeDecrease.hh" #include "G4SystemOfUnits.hh" +#include "G4LowEnergyEmProcessSubType.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -35,7 +36,7 @@ G4DNAChargeDecrease::G4DNAChargeDecrease(const G4String& processName, G4ProcessType type) : G4VEmProcess(processName, type), isInitialised(false) { - SetProcessSubType(56); + SetProcessSubType(fLowEnergyChargeDecrease); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAChargeIncrease.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAChargeIncrease.cc index 1454d971f3..8f24fd805c 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAChargeIncrease.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAChargeIncrease.cc @@ -26,6 +26,7 @@ #include "G4DNAChargeIncrease.hh" #include "G4SystemOfUnits.hh" +#include "G4LowEnergyEmProcessSubType.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -35,7 +36,7 @@ G4DNAChargeIncrease::G4DNAChargeIncrease(const G4String& processName, G4ProcessType type) : G4VEmProcess(processName, type), isInitialised(false) { - SetProcessSubType(57); + SetProcessSubType(fLowEnergyChargeIncrease); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAElastic.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAElastic.cc index a6f3c4fb6a..079e882ec3 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAElastic.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAElastic.cc @@ -28,6 +28,7 @@ #include "G4DNAElastic.hh" #include "G4SystemOfUnits.hh" #include "G4Positron.hh" +#include "G4LowEnergyEmProcessSubType.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -36,7 +37,7 @@ using namespace std; G4DNAElastic::G4DNAElastic(const G4String& processName, G4ProcessType type) : G4VEmProcess(processName, type), isInitialised(false) { - SetProcessSubType(51); + SetProcessSubType(fLowEnergyElastic); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAElectronHoleRecombination.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAElectronHoleRecombination.cc index 12f1139e7a..dc49d8d593 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAElectronHoleRecombination.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAElectronHoleRecombination.cc @@ -43,6 +43,7 @@ #include "G4SystemOfUnits.hh" #include "G4VMoleculeCounter.hh" #include "G4Exp.hh" +#include "G4LowEnergyEmProcessSubType.hh" static G4double onsager_constant = e_squared / (4. * pi * epsilon0 * k_Boltzmann); @@ -117,7 +118,7 @@ void G4DNAElectronHoleRecombination::Create() enableAlongStepDoIt = false; enablePostStepDoIt = true; - SetProcessSubType(60); + SetProcessSubType(fLowEnergyTransportation); G4VITProcess::SetInstantiateProcessState(false); // ie G4DNAElectronHoleRecombination uses a state class diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAElectronSolvation.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAElectronSolvation.cc index 39d6b93ef0..aacf62daf6 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAElectronSolvation.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAElectronSolvation.cc @@ -38,12 +38,13 @@ #include "G4DNAElectronSolvation.hh" #include "G4Electron.hh" #include "G4DNAWaterExcitationStructure.hh" +#include "G4LowEnergyEmProcessSubType.hh" G4DNAElectronSolvation::G4DNAElectronSolvation(const G4String& processName, G4ProcessType type):G4VEmProcess (processName, type), isInitialised(false) { - SetProcessSubType(58); + SetProcessSubType(fLowEnergyElectronSolvation); } G4DNAElectronSolvation::~G4DNAElectronSolvation() diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAExcitation.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAExcitation.cc index 961bbe5cb9..e8281a8a91 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAExcitation.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAExcitation.cc @@ -28,6 +28,7 @@ #include "G4LEPTSExcitationModel.hh" #include "G4SystemOfUnits.hh" #include "G4Positron.hh" +#include "G4LowEnergyEmProcessSubType.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -37,7 +38,7 @@ G4DNAExcitation::G4DNAExcitation(const G4String& processName, G4ProcessType type) : G4VEmProcess(processName, type), isInitialised(false) { - SetProcessSubType(52); + SetProcessSubType(fLowEnergyExcitation); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAIonisation.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAIonisation.cc index d3da5d8dc8..b7d4f2a199 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAIonisation.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAIonisation.cc @@ -27,6 +27,7 @@ #include "G4DNAIonisation.hh" #include "G4LEPTSIonisationModel.hh" #include "G4SystemOfUnits.hh" +#include "G4LowEnergyEmProcessSubType.hh" //SEB #include "G4GenericIon.hh" @@ -40,7 +41,7 @@ G4DNAIonisation::G4DNAIonisation(const G4String& processName, G4ProcessType type) : G4VEmProcess(processName, type), isInitialised(false) { - SetProcessSubType(53); + SetProcessSubType(fLowEnergyIonisation); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAMolecularDissociation.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAMolecularDissociation.cc index b24a8cb8a9..9a81f8bb0f 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAMolecularDissociation.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAMolecularDissociation.cc @@ -43,6 +43,7 @@ #include "G4ParticleChange.hh" #include "G4ITTransportationManager.hh" #include "G4ITNavigator.hh" +#include "G4LowEnergyEmProcessSubType.hh" //______________________________________________________________________________ @@ -52,7 +53,7 @@ G4DNAMolecularDissociation(const G4String& processName, : G4VITRestDiscreteProcess(processName, type) { // set Process Sub Type - SetProcessSubType(59); // DNA sub-type + SetProcessSubType(fLowEnergyMolecularDecay); // DNA sub-type enableAlongStepDoIt = false; enablePostStepDoIt = true; enableAtRestDoIt = true; @@ -347,4 +348,4 @@ G4double G4DNAMolecularDissociation::GetMeanFreePath(const G4Track&, G4ForceCondition*) { return 0; -} \ No newline at end of file +} diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAPlasmonExcitation.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAPlasmonExcitation.cc index 8fc93571f7..f63796f537 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAPlasmonExcitation.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAPlasmonExcitation.cc @@ -32,6 +32,7 @@ #include "G4DNAPlasmonExcitation.hh" #include "G4SystemOfUnits.hh" +#include "G4LowEnergyEmProcessSubType.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -41,7 +42,7 @@ G4DNAPlasmonExcitation::G4DNAPlasmonExcitation(const G4String& processName, G4ProcessType type):G4VEmProcess (processName, type), isInitialised(false) { - //SetProcessSubType(56); //dousatsu temp + //SetProcessSubType(fLowEnergyChargeDecrease); //dousatsu temp } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAScavengerProcess.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAScavengerProcess.cc new file mode 100644 index 0000000000..541dc65518 --- /dev/null +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAScavengerProcess.cc @@ -0,0 +1,354 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +#include "G4DNAScavengerProcess.hh" +#include +#include +#include "G4Molecule.hh" +#include "G4DNAMolecularMaterial.hh" +#include "G4MolecularConfiguration.hh" +#include "G4UnitsTable.hh" +#include "G4TrackingInformation.hh" +#include "G4DNAMolecularReactionTable.hh" +#include "G4PhysicalConstants.hh" +#include "G4DNABoundingBox.hh" +#include "G4DNAScavengerMaterial.hh" +#include "G4MoleculeFinder.hh" +#include "G4Scheduler.hh" + +#ifndef State +# define State(theXInfo) (GetState()->theXInfo) +#endif +G4DNAScavengerProcess::G4DNAScavengerProcess(const G4String& aName, + const G4DNABoundingBox& box, + G4ProcessType type) + : G4VITProcess(aName, type) + , fpBoundingBox(&box) + , fpScavengerMaterial(nullptr) + , fVerbose(1) +{ + pParticleChange = &fParticleChange; + enableAtRestDoIt = false; + enableAlongStepDoIt = false; + enablePostStepDoIt = true; + SetProcessSubType(66); + G4VITProcess::SetInstantiateProcessState(false); + fIsInitialized = false; + fpMolecularConfiguration = nullptr; + fpMaterialConf = nullptr; + fProposesTimeStep = true; + fReturnedValue = DBL_MAX; + verboseLevel = 0; +} + +G4DNAScavengerProcess::~G4DNAScavengerProcess() +{ + for(auto& iter : fConfMap) + { + for(auto& iter2 : iter.second) + { + delete iter2.second; + } + } +} + +G4DNAScavengerProcess::G4DNAScavengerProcessState::G4DNAScavengerProcessState() + : G4ProcessState() +{ + fPreviousTimeAtPreStepPoint = -1; + fIsInGoodMaterial = false; +} +void G4DNAScavengerProcess::BuildPhysicsTable(const G4ParticleDefinition&) +{ + fpScavengerMaterial = dynamic_cast( + G4Scheduler::Instance()->GetScavengerMaterial()); + if(fpScavengerMaterial == nullptr) + { + return; + } + fIsInitialized = true; +} + +void G4DNAScavengerProcess::StartTracking(G4Track* track) +{ + G4VProcess::StartTracking(track); + G4VITProcess::fpState = std::make_shared(); + G4VITProcess::StartTracking(track); +} + +void G4DNAScavengerProcess::SetReaction(MolType molConf, Data* pData) +{ + if(fIsInitialized) + { + G4ExceptionDescription exceptionDescription; + exceptionDescription + << "G4DNASecondOrderReaction was already initialised. "; + exceptionDescription << "You cannot set a reaction after initialisation."; + G4Exception("G4DNASecondOrderReaction::SetReaction", + "G4DNASecondOrderReaction001", FatalErrorInArgument, + exceptionDescription); + } + auto materialConf = pData->GetReactant1() == molConf ? pData->GetReactant2() + : pData->GetReactant1(); + if(fVerbose > 0) + { + G4cout << "G4DNAScavengerProcess::SetReaction : " << molConf->GetName() + << " materialConf : " << materialConf->GetName() << G4endl; + } + fConfMap[molConf][materialConf] = pData; +} + +G4double G4DNAScavengerProcess::PostStepGetPhysicalInteractionLength( + const G4Track& track, G4double /*previousStepSize*/, + G4ForceCondition* pForceCond) +{ + G4Molecule* molecule = GetMolecule(track); + auto molConf = molecule->GetMolecularConfiguration(); + // reset + fpMolecularConfiguration = nullptr; + fpMaterialConf = nullptr; + + // this because process for moleculeDifinition not for configuration + // TODO: need change this + auto it = fConfMap.find(molConf); + if(it == fConfMap.end()) + { + return DBL_MAX; + } + + fpMolecularConfiguration = molConf; + auto MaterialMap = it->second; + + G4double r1 = G4UniformRand(); + std::map> + ReactionDataMap; + G4double alpha0 = 0; + + for(const auto& mat_it : MaterialMap) + { + auto matConf = mat_it.first; + G4double numMol = + fpScavengerMaterial->GetNumberMoleculePerVolumeUnitForMaterialConf( + matConf); + if(numMol == 0.0) // ie : not found + { + continue; + } + if(fVerbose > 1) + { + G4cout << " Material of " << matConf->GetName() << " : " << numMol + << G4endl; + } + // auto data = fReactionMap[mat_it]; + auto data = mat_it.second; + auto reactionRate = data->GetObservedReactionRateConstant(); //_const + G4double propensity = + numMol * reactionRate / (fpBoundingBox->Volume() * Avogadro); + auto reactionData = std::make_pair(mat_it.first, propensity); + if(propensity == 0) + { + continue; + } + alpha0 += propensity; + ReactionDataMap[alpha0] = reactionData; + } + if(alpha0 == 0) + { + if(State(fIsInGoodMaterial)) + { + ResetNumberOfInteractionLengthLeft(); + State(fIsInGoodMaterial) = false; + } + return DBL_MAX; + } + auto rSelectedIter = ReactionDataMap.upper_bound(r1 * alpha0); + + fpMaterialConf = rSelectedIter->second.first; + + State(fIsInGoodMaterial) = true; + G4double previousTimeStep(-1.); + + if(State(fPreviousTimeAtPreStepPoint) != -1) + { + previousTimeStep = + track.GetGlobalTime() - State(fPreviousTimeAtPreStepPoint); + } + + State(fPreviousTimeAtPreStepPoint) = track.GetGlobalTime(); + + // condition is set to "Not Forced" + *pForceCond = NotForced; + + if((previousTimeStep <= 0.0) || + (fpState->theNumberOfInteractionLengthLeft <= 0.0)) + { + ResetNumberOfInteractionLengthLeft(); + } + else if(previousTimeStep > 0.0) + { + SubtractNumberOfInteractionLengthLeft(previousTimeStep); + } + + fpState->currentInteractionLength = 1 / (rSelectedIter->second.second); + G4double value = DBL_MAX; + if(fpState->currentInteractionLength < DBL_MAX) + { + value = fpState->theNumberOfInteractionLengthLeft * + (fpState->currentInteractionLength); + } +#ifdef G4VERBOSE + if(verboseLevel > 2) + { + G4cout << "G4DNAScavengerProcess::PostStepGetPhysicalInteractionLength:: " + << molConf->GetName() << G4endl; + G4cout << "theNumberOfInteractionLengthLeft : " + << fpState->theNumberOfInteractionLengthLeft << G4endl; + G4cout << "currentInteractionLength : " << fpState->currentInteractionLength + << G4endl; + G4cout << "Material : " << fpMaterialConf->GetName() + << " ID: " << track.GetTrackID() + << " Track Time : " << track.GetGlobalTime() + << " name : " << molConf->GetName() + << " Track Position : " << track.GetPosition() + << " Returned time : " << G4BestUnit(value, "Time") << G4endl; + } +#endif + + if(value < fReturnedValue) + { + fReturnedValue = value; + } + + return value * -1; + // multiple by -1 to indicate to the tracking system that we are returning a + // time +} + +G4VParticleChange* G4DNAScavengerProcess::PostStepDoIt(const G4Track& track, + const G4Step& /*step*/) +{ + G4Molecule* molecule = GetMolecule(track); + auto molConf = molecule->GetMolecularConfiguration(); + if(fpMolecularConfiguration != molConf) + { + G4cout << "fpMolecularConfiguration : " + << fpMolecularConfiguration->GetName() + << " molConf : " << molConf->GetName() << G4endl; + + assert(false); + } + std::vector products; +#ifdef G4VERBOSE + if(verboseLevel > 1) + { + G4cout << "___________" << G4endl; + G4cout << ">>> Beginning of G4DNAScavengerProcess verbose" << G4endl; + G4cout << ">>> Returned value : " << G4BestUnit(fReturnedValue, "Time") + << G4endl; + G4cout << ">>> Time Step : " + << G4BestUnit(G4VScheduler::Instance()->GetTimeStep(), "Time") + << G4endl; + G4cout << ">>> Global Time : " + << G4BestUnit(G4VScheduler::Instance()->GetGlobalTime(), "Time") + << G4endl; + G4cout << ">>> Global Time Track : " + << G4BestUnit(track.GetGlobalTime(), "Time") << G4endl; + G4cout << ">>> Track Position : " << track.GetPosition() << G4endl; + G4cout << ">>> Reaction : " << molecule->GetName() << "(" + << track.GetTrackID() << ") + " << fpMaterialConf->GetName() + << G4endl; + G4cout << ">>> End of G4DNAScavengerProcess verbose <<<" << G4endl; + } +#endif + + G4double reactionTime = track.GetGlobalTime(); + auto data = fConfMap[fpMolecularConfiguration][fpMaterialConf]; + + auto nbSecondaries = data->GetNbProducts(); + + for(G4int j = 0; j < nbSecondaries; ++j) + { + auto pProduct = new G4Molecule(data->GetProduct(j)); + auto pProductTrack = + pProduct->BuildTrack(reactionTime, track.GetPosition()); + pProductTrack->SetTrackStatus(fAlive); + G4ITTrackHolder::Instance()->Push(pProductTrack); + G4MoleculeFinder::Instance()->Push(pProductTrack); + products.push_back(pProductTrack); + } + +#ifdef G4VERBOSE + if(fVerbose != 0) + { + G4cout << "At time : " << std::setw(7) << G4BestUnit(reactionTime, "Time") + << " Reaction : " << GetIT(track)->GetName() << " (" + << track.GetTrackID() << ") + " << fpMaterialConf->GetName() << " (" + << "B" + << ") -> "; + } +#endif + if(nbSecondaries > 0) + { + for(G4int i = 0; i < nbSecondaries; ++i) + { +#ifdef G4VERBOSE + if((fVerbose != 0) && i != 0) + { + G4cout << " + "; + } + + if(fVerbose != 0) + { + G4cout << GetIT(products.at(i))->GetName() << " (" + << products.at(i)->GetTrackID() << ")"; + } +#endif + } + } + else + { +#ifdef G4VERBOSE + if(fVerbose != 0) + { + G4cout << "No product"; + } +#endif + } +#ifdef G4VERBOSE + if(fVerbose != 0) + { + G4cout << G4endl; + } +#endif + + fReturnedValue = DBL_MAX; + fParticleChange.Initialize(track); + fParticleChange.ProposeTrackStatus(fStopAndKill); + fpScavengerMaterial->ReduceNumberMoleculePerVolumeUnitForMaterialConf( + fpMaterialConf, reactionTime); + State(fPreviousTimeAtPreStepPoint) = -1; + return &fParticleChange; +} diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNASecondOrderReaction.cc b/source/processes/electromagnetic/dna/processes/src/G4DNASecondOrderReaction.cc index ee2c1acd69..f37500a3e4 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNASecondOrderReaction.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNASecondOrderReaction.cc @@ -34,6 +34,7 @@ #include "G4DNADamage.hh" #include "G4UnitsTable.hh" #include "G4TrackingInformation.hh" +#include "G4LowEnergyEmProcessSubType.hh" #ifndef State #define State(theXInfo) (GetState()->theXInfo) @@ -46,7 +47,7 @@ void G4DNASecondOrderReaction::Create() enableAlongStepDoIt = false; enablePostStepDoIt = true; - SetProcessSubType(60); + SetProcessSubType(fLowEnergyTransportation); G4VITProcess::SetInstantiateProcessState(false); // meaning G4DNASecondOrderReaction contains a class inheriting from G4ProcessState diff --git a/source/processes/electromagnetic/dna/processes/src/G4DNAVibExcitation.cc b/source/processes/electromagnetic/dna/processes/src/G4DNAVibExcitation.cc index 1ba1fe01b9..26d77e3f9a 100644 --- a/source/processes/electromagnetic/dna/processes/src/G4DNAVibExcitation.cc +++ b/source/processes/electromagnetic/dna/processes/src/G4DNAVibExcitation.cc @@ -28,6 +28,7 @@ #include "G4LEPTSVibExcitationModel.hh" #include "G4SystemOfUnits.hh" #include "G4Positron.hh" +#include "G4LowEnergyEmProcessSubType.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -37,7 +38,7 @@ G4DNAVibExcitation::G4DNAVibExcitation(const G4String& processName, G4ProcessType type):G4VEmProcess (processName, type), isInitialised(false) { - SetProcessSubType(54); + SetProcessSubType(fLowEnergyVibrationalExcitation); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/dna/utils/include/G4DNAEventSet.hh b/source/processes/electromagnetic/dna/utils/include/G4DNAEventSet.hh new file mode 100644 index 0000000000..c9d39cf517 --- /dev/null +++ b/source/processes/electromagnetic/dna/utils/include/G4DNAEventSet.hh @@ -0,0 +1,124 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +#ifndef G4DNAEventSet_hh +#define G4DNAEventSet_hh 1 +#include +#include +#include +#include "G4Track.hh" +#include +#include "G4DNAMesh.hh" +#include +class G4DNAMolecularReactionTable; +class G4DNAMolecularReactionData; +class Event +{ + public: + using Index = G4Voxel::Index; + using MolType = const G4MolecularConfiguration*; + using JumpingData = std::pair; + using ReactionData = const G4DNAMolecularReactionData; + + // to test C++17 + // using Data = std::variant, ReactionData*> + using Data = std::pair, ReactionData*>; + + Event(G4double time, unsigned int key, ReactionData*); + Event(G4double time, unsigned int key, std::unique_ptr&&); + + virtual ~Event(); + G4double GetTime() const { return fTimeStep; } + unsigned int GetKey() const { return fKey; } + void PrintEvent() const; + + JumpingData* GetJumpingData() const { return std::get<0>(fData).get(); } + + ReactionData* GetReactionData() const { return std::get<1>(fData); } + + private: + G4double fTimeStep; + unsigned int fKey; + Data fData; +}; + +struct comparatorEventSet +{ + G4bool operator()(std::unique_ptr const& rhs, + std::unique_ptr const& lhs) const; +}; + +class IEventSet +{ + public: + IEventSet() = default; + ~IEventSet() = default; +}; + +class G4DNAEventSet : public IEventSet +{ + public: + using Key = unsigned int; + using EventSet = std::set, comparatorEventSet>; + using EventMap = std::map; + G4DNAEventSet(); + virtual ~G4DNAEventSet(); + + void CreateEvent(G4double time, Key index, + Event::ReactionData* pReactionData); + void CreateEvent(G4double time, Key index, + std::unique_ptr jum); + + void AddEvent(std::unique_ptr pEvent); + void RemoveEventSet() + { + fEventSet.clear(); + fEventMap.clear(); + } + void RemoveEventOfVoxel(const size_t& key); + + EventSet::iterator end() { return fEventSet.end(); } + EventSet::iterator begin() { return fEventSet.begin(); } + + EventSet::reverse_iterator rend() { return fEventSet.rend(); } + EventSet::reverse_iterator rbegin() { return fEventSet.rbegin(); } + + EventSet::const_iterator end() const { return fEventSet.end(); } + + EventSet::const_iterator begin() const { return fEventSet.begin(); } + + size_t size() { return fEventSet.size(); } + + G4bool Empty() { return fEventSet.empty(); } + + void RemoveEvent(EventSet::iterator iter); + [[maybe_unused]] void PrintEventSet(); + + private: + EventSet fEventSet; + EventMap fEventMap; +}; +#endif diff --git a/source/processes/electromagnetic/dna/utils/include/G4DNAMesh.hh b/source/processes/electromagnetic/dna/utils/include/G4DNAMesh.hh new file mode 100644 index 0000000000..9f181755ad --- /dev/null +++ b/source/processes/electromagnetic/dna/utils/include/G4DNAMesh.hh @@ -0,0 +1,156 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +#ifndef G4DNAMesh_hh +#define G4DNAMesh_hh 1 + +#include "globals.hh" +#include "G4DNABoundingBox.hh" +#include +#include +#include +#include +#include +#include +#include "G4MolecularConfiguration.hh" +#include "G4Track.hh" + +class G4Voxel +{ + public: + struct Index + { + Index() + : x(0) + , y(0) + , z(0) + {} + Index(int x0, int y0, int z0) + : x(x0) + , y(y0) + , z(z0) + {} + + friend std::ostream& operator<<(std::ostream& stream, const Index& rhs) + { + stream << "(" << rhs.x << ", " << rhs.y << ", " << rhs.z << ")"; + return stream; + } + G4bool operator==(const Index& rhs) const + { + return x == rhs.x && y == rhs.y && z == rhs.z; + } + G4bool operator!=(const Index& rhs) const + { + return x != rhs.x || y != rhs.y || z != rhs.z; + } + Index operator+(const Index& rhs) const + { + return { x + rhs.x, y + rhs.y, z + rhs.z }; + } + int x, y, z; + }; + using MolType = const G4MolecularConfiguration*; + using MapList = std::map; + + G4Voxel(MapList&& list, Index& index, G4DNABoundingBox&& box) + : fMapList(std::move(list)) + , fIndex(index) + , fBox(std::move(box)) + {} + + ~G4Voxel() = default; + + const Index& GetIndex() const { return fIndex; } + + MapList& GetMapList() { return fMapList; } + + void SetMapList(MapList&& mapList) { fMapList = std::move(mapList); } + + G4double GetVolume() const + { + auto xlo = fBox.Getxlo(); + auto ylo = fBox.Getylo(); + auto zlo = fBox.Getzlo(); + + auto xhi = fBox.Getxhi(); + auto yhi = fBox.Getyhi(); + auto zhi = fBox.Getzhi(); + + return (xhi - xlo) * (yhi - ylo) * (zhi - zlo); + } + + private: + MapList fMapList; + Index fIndex; + G4DNABoundingBox fBox; +}; + +class G4DNAMesh +{ + public: + using Index = G4Voxel::Index; + using Key = unsigned int; + using VoxelMap = std::map; + G4DNAMesh(const G4DNABoundingBox&, G4int); + ~G4DNAMesh(); + + Key GetKey(const G4ThreeVector& pos) const; + Index GetIndex(Key key) const; + Index GetIndex(const G4ThreeVector& position) const; + + G4Voxel* GetVoxel(Key key); + [[maybe_unused]] G4Voxel* GetVoxel(const Index& index); + size_t size() { return fMesh.size(); } + Index GetIndex(const Index& index, int) const; + std::vector FindVoxelNeighbors(const Index& index) const; + std::vector FindNeighboringVoxels(const Index& index) const; + void Reset(); + + G4Voxel::MapList& GetVoxelMapList(Key key); + G4Voxel::MapList& GetVoxelMapList(const Index& index); + + Key GetKey(const Index& index) const; + VoxelMap::iterator end() { return fMesh.end(); } + VoxelMap::iterator begin() { return fMesh.begin(); } + VoxelMap::const_iterator end() const { return fMesh.end(); } + VoxelMap::const_iterator begin() const { return fMesh.begin(); } + + void PrintMesh(); + void PrintVoxel(const Index& index); + const G4DNABoundingBox& GetBoundingBox() const; + G4DNABoundingBox GetBoundingBox(const Index& index); + G4int GetNumberOfType(G4Voxel::MolType type) const; + void SetVoxelMapList(const Key& key, G4Voxel::MapList&& mapList); + + G4double GetResolution() const; + + private: + VoxelMap fMesh; + const G4DNABoundingBox* fpBoundingMesh; + G4double fResolution; +}; +#endif diff --git a/source/processes/electromagnetic/dna/utils/include/G4DNAMolecularReactionTable.hh b/source/processes/electromagnetic/dna/utils/include/G4DNAMolecularReactionTable.hh index 4450332a6f..2e3f490f0e 100644 --- a/source/processes/electromagnetic/dna/utils/include/G4DNAMolecularReactionTable.hh +++ b/source/processes/electromagnetic/dna/utils/include/G4DNAMolecularReactionTable.hh @@ -48,6 +48,7 @@ #include "G4ITReactionTable.hh" #include "G4MolecularConfiguration.hh" #include "G4ReferenceCast.hh" +#include "G4VDNAMolecularGeometry.hh" #include #include #include @@ -208,6 +209,9 @@ public: void SetReaction(G4DNAMolecularReactionData*); + void SetGeometry(G4VDNAMolecularGeometry* geometry){fGeometry = geometry;}; + G4VDNAMolecularGeometry* GetGeometry() const; + Data* GetReactionData(Reactant*, Reactant*) const; Data* GetReactionData(const G4String&, const G4String&) const; @@ -238,6 +242,7 @@ public: protected: G4bool fVerbose; + G4VDNAMolecularGeometry* fGeometry; ReactionDataMap fReactionData; ReactivesMV fReactantsMV; ReactionDataMV fReactionDataMV; diff --git a/source/processes/electromagnetic/dna/utils/include/G4DNAScavengerMaterial.hh b/source/processes/electromagnetic/dna/utils/include/G4DNAScavengerMaterial.hh new file mode 100644 index 0000000000..cd60573133 --- /dev/null +++ b/source/processes/electromagnetic/dna/utils/include/G4DNAScavengerMaterial.hh @@ -0,0 +1,122 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +#ifndef G4DNASCAVENGERMATERIAL_HH +#define G4DNASCAVENGERMATERIAL_HH +#include "globals.hh" +#include "G4ios.hh" +#include +#include +#include "G4MoleculeCounter.hh" +#include "G4VScavengerMaterial.hh" +class G4Material; +class G4MolecularConfiguration; +class G4VChemistryWorld; + +using NbMoleculeAgainstTime = + std::map; + +class G4DNAScavengerMaterial : public G4VScavengerMaterial +{ + public: + using MolType = const G4MolecularConfiguration*; + using MaterialMap = std::map; + using ReactantList = std::vector; + using CounterMapType = std::map; + G4DNAScavengerMaterial() = default; + explicit G4DNAScavengerMaterial(G4VChemistryWorld*); + ~G4DNAScavengerMaterial() override = default; + G4DNAScavengerMaterial(const G4DNAScavengerMaterial& right) = delete; + G4DNAScavengerMaterial& operator=(const G4DNAScavengerMaterial&) = delete; + void Initialize(); + + void ReduceNumberMoleculePerVolumeUnitForMaterialConf(MolType, G4double); + void AddNumberMoleculePerVolumeUnitForMaterialConf(MolType, G4double); + G4double GetNumberMoleculePerVolumeUnitForMaterialConf(MolType) const; + + void AddAMoleculeAtTime(MolType, G4double time, + const G4ThreeVector* position = nullptr, + G4int number = 1); + void RemoveAMoleculeAtTime(MolType, G4double time, + const G4ThreeVector* position = nullptr, + G4int number = 1); + + void Reset() override; + + void PrintInfo(); + + MaterialMap::iterator end() { return fScavengerTable.end(); } + MaterialMap::iterator begin() { return fScavengerTable.begin(); } + size_t size() { return fScavengerTable.size(); } + + G4bool find(MolType type) + { + auto it = fScavengerTable.find(type); + if(it != fScavengerTable.end()) + { + return it->second > 0; + } + else + { + return false; + } + } + + void SetCounterAgainstTime() { fCounterAgainstTime = true; } + + std::vector GetScavengerList() const + { + std::vector output; + for(const auto& it : fScavengerTable) + { + output.push_back(it.first); + } + return output; + } + + void Dump(); + G4int GetNMoleculesAtTime(MolType molecule, G4double time); + G4bool SearchTimeMap(MolType molecule); + G4int SearchUpperBoundTime(G4double time, G4bool sameTypeOfMolecule); + + private: + G4VChemistryWorld* fpChemistryInfo; + G4bool fIsInitialized; + std::map fScavengerTable; + CounterMapType fCounterMap; + G4bool fCounterAgainstTime; + G4int fVerbose; + struct Search + { + Search() { fLowerBoundSet = false; } + CounterMapType::iterator fLastMoleculeSearched; + NbMoleculeAgainstTime::iterator fLowerBoundTime; + G4bool fLowerBoundSet; + }; + + std::unique_ptr fpLastSearch; +}; +#endif // G4DNASCAVENGERMATERIAL_HH diff --git a/source/visualization/VRML/src/G4VRML2.cc b/source/processes/electromagnetic/dna/utils/include/G4VChemistryWorld.hh similarity index 59% rename from source/visualization/VRML/src/G4VRML2.cc rename to source/processes/electromagnetic/dna/utils/include/G4VChemistryWorld.hh index 652ca8d993..3929e678eb 100644 --- a/source/visualization/VRML/src/G4VRML2.cc +++ b/source/processes/electromagnetic/dna/utils/include/G4VChemistryWorld.hh @@ -24,70 +24,57 @@ // ******************************************************************** // // -// -// G4VRML2.cc -// Satoshi Tanaka & Yasuhide Sawada -#ifndef WIN32 +#ifndef G4VCHEMISTRYWORLD_HH +#define G4VCHEMISTRYWORLD_HH -//=================// -#ifdef G4VIS_BUILD_VRML_DRIVER -//=================// - - -#include // sscanf -#include // getenv - -#include "G4VSceneHandler.hh" - -#include "G4VRML2.hh" -#include "G4VRML2SceneHandler.hh" -#include "G4VRML2Viewer.hh" - -#include "G4FRClient.hh" - - -G4VRML2::G4VRML2() : - G4VGraphicsSystem("VRML2", "VRML2", G4VGraphicsSystem::threeD) +#include +#include +class G4DNABoundingBox; +class G4Material; +class G4MolecularConfiguration; +class G4VChemistryWorld { - // port number - fPort = FR_VRML_DEFAULT_PORT; - char *pport = std::getenv(FR_VRML_PORT_ENV); - if (pport) { - sscanf(pport, "%d", &fPort); - } + public: + using MolType = const G4MolecularConfiguration*; + G4VChemistryWorld() = default; + virtual ~G4VChemistryWorld() = default; - // host name - fHostName = "localhost" ; // G4String::operator = ( const char* cs ) - char *phostname = std::getenv(FR_VRML_HOST_NAME_ENV); - if (phostname) { - fHostName = phostname; - } -} + virtual void ConstructChemistryBoundary() = 0; + virtual void ConstructChemistryComponents() = 0; -G4VRML2::~G4VRML2() -{ -} + std::map::iterator begin() + { + return fpChemicalComponent.begin(); + } + std::map::iterator end() + { + return fpChemicalComponent.end(); + } -G4VSceneHandler* G4VRML2::CreateSceneHandler(const G4String& name) -{ - G4VSceneHandler *p = NULL; + size_t size() + { + return fpChemicalComponent.size(); + } - p = new G4VRML2SceneHandler(*this, name); + std::map::const_iterator begin_const() + { + return fpChemicalComponent.begin(); + } - return p; -} + std::map::const_iterator end_const() + { + return fpChemicalComponent.end(); + } -G4VViewer* G4VRML2::CreateViewer(G4VSceneHandler& scene, const G4String& name) -{ - G4VViewer* pView = NULL; - - G4VRML2SceneHandler* pScene = (G4VRML2SceneHandler*)&scene; - pView = new G4VRML2Viewer(*pScene, name); - - return pView; -} + G4DNABoundingBox* GetChemistryBoundary() const + { + return fpChemistryBoundary.get(); + } + protected: + std::unique_ptr fpChemistryBoundary; + std::map fpChemicalComponent; +}; #endif -#endif //WIN32 diff --git a/source/processes/electromagnetic/dna/utils/sources.cmake b/source/processes/electromagnetic/dna/utils/sources.cmake index a9032cbc93..03aea8b949 100644 --- a/source/processes/electromagnetic/dna/utils/sources.cmake +++ b/source/processes/electromagnetic/dna/utils/sources.cmake @@ -28,7 +28,11 @@ geant4_add_module(G4emdna-utils # physchemIO G4VPhysChemIO.hh G4PhysChemIO.hh - G4IRTUtils.hh + G4IRTUtils.hh + G4DNAScavengerMaterial.hh + G4VChemistryWorld.hh + G4DNAMesh.hh + G4DNAEventSet.hh SOURCES G4DNAChemistryManager.cc G4DNACPA100LogLogInterpolation.cc @@ -54,7 +58,10 @@ geant4_add_module(G4emdna-utils # physchemIO G4VPhysChemIO.cc G4PhysChemIO.cc - G4IRTUtils.cc) + G4IRTUtils.cc + G4DNAScavengerMaterial.cc + G4DNAMesh.cc + G4DNAEventSet.cc) geant4_module_link_libraries(G4emdna-utils PUBLIC diff --git a/source/processes/electromagnetic/dna/utils/src/G4DNAEventSet.cc b/source/processes/electromagnetic/dna/utils/src/G4DNAEventSet.cc new file mode 100644 index 0000000000..aed4664e40 --- /dev/null +++ b/source/processes/electromagnetic/dna/utils/src/G4DNAEventSet.cc @@ -0,0 +1,127 @@ +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include +#include "G4DNAEventSet.hh" +#include "globals.hh" +#include "G4UnitsTable.hh" +#include "G4DNAMolecularReactionTable.hh" + +Event::Event(G4double time, unsigned int key, ReactionData* pReactionData) + : fTimeStep(time) + , fKey(key) + , fData(std::pair, ReactionData*>(nullptr, + pReactionData)) +{} + +Event::Event(G4double time, unsigned int key, + std::unique_ptr&& jumping) + : fTimeStep(time) + , fKey(key) + , fData(std::pair, ReactionData*>( + std::move(jumping), nullptr)) +{} + +Event::~Event() = default; + +void Event::PrintEvent() const +{ + G4cout << "****PrintEvent::TimeStep : " << G4BestUnit(fTimeStep, "Time") + << " key : " << fKey << " action : "; + if(std::get<0>(fData) == nullptr) + { + G4cout << std::get<1>(fData)->GetReactant1()->GetName() << " + " + << std::get<1>(fData)->GetReactant2()->GetName() << " -> " + << std::get<1>(fData)->GetProducts()->size() << G4endl; + } + else + { + G4cout << std::get<0>(fData)->first->GetName() << " jumping to " + << std::get<0>(fData)->second << G4endl; + } +} + +G4bool comparatorEventSet::operator()(std::unique_ptr const& rhs, + std::unique_ptr const& lhs) const +{ + return rhs->GetTime() < lhs->GetTime(); +} + +G4DNAEventSet::G4DNAEventSet() + : fEventSet(comparatorEventSet()) +{} + +void G4DNAEventSet::CreateEvent(G4double time, Key key, + Event::ReactionData* pReactionData) +{ + auto pEvent = std::make_unique(time, key, pReactionData); + AddEvent(std::move(pEvent)); +} + +void G4DNAEventSet::CreateEvent(G4double time, Key key, + std::unique_ptr jum) +{ + auto pEvent = std::make_unique(time, key, std::move(jum)); + AddEvent(std::move(pEvent)); +} + +void G4DNAEventSet::RemoveEventOfVoxel(const size_t& key) +{ + auto it = fEventMap.find(key); + if(it != fEventMap.end()) + { + fEventSet.erase(it->second); + fEventMap.erase(it); + } +} + +void G4DNAEventSet::RemoveEvent(EventSet::iterator iter) +{ + auto key = (*iter)->GetKey(); + RemoveEventOfVoxel(key); +} + +void G4DNAEventSet::AddEvent(std::unique_ptr pEvent) +{ + // idea is no 2 events in one key (or index) + auto key = pEvent->GetKey(); + RemoveEventOfVoxel(key); + auto it = fEventSet.emplace(std::move(pEvent)); + fEventMap[key] = std::get<0>(it); +} + +//_____________________________________________________________________________________ + +G4DNAEventSet::~G4DNAEventSet() { RemoveEventSet(); } + +[[maybe_unused]] void G4DNAEventSet::PrintEventSet() +{ + G4cout << "G4DNAEventSet::PrintEventSet()" << G4endl; + for(const auto& it : fEventSet) + { + (*it).PrintEvent(); + } + G4cout << "End PrintEventSet()" << G4endl; + G4cout << G4endl; +} \ No newline at end of file diff --git a/source/processes/electromagnetic/dna/utils/src/G4DNAMesh.cc b/source/processes/electromagnetic/dna/utils/src/G4DNAMesh.cc new file mode 100644 index 0000000000..eb90e9d55d --- /dev/null +++ b/source/processes/electromagnetic/dna/utils/src/G4DNAMesh.cc @@ -0,0 +1,351 @@ +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +#include "G4DNAMesh.hh" +#include +#include +#include + +G4DNAMesh::G4DNAMesh(const G4DNABoundingBox& boundingBox, G4int pixel) + : fpBoundingMesh(&boundingBox) + , fResolution((2 * boundingBox.halfSideLengthInY() / pixel)) +{} + +G4DNAMesh::~G4DNAMesh() { Reset(); } + +G4Voxel::MapList& G4DNAMesh::GetVoxelMapList(Key key) +{ + auto iter = fMesh.find(key); + if(iter == fMesh.end()) + { + G4Voxel::MapList maplist; + SetVoxelMapList(key, std::move(maplist)); + return GetVoxelMapList(key); + } + else + { + return iter->second->GetMapList(); + } +} + +G4Voxel::MapList& G4DNAMesh::GetVoxelMapList(const Index& index) +{ + auto key = GetKey(index); + return GetVoxelMapList(key); +} + +G4DNAMesh::Key G4DNAMesh::GetKey(const Index& index) const +{ + auto xmax = (unsigned int) (std::floor( + (fpBoundingMesh->Getxhi() - fpBoundingMesh->Getxlo()) / fResolution)); + auto ymax = (unsigned int) (std::floor( + (fpBoundingMesh->Getyhi() - fpBoundingMesh->Getylo()) / fResolution)); + return index.z * ymax * xmax + index.y * xmax + index.x; +} + +void G4DNAMesh::PrintMesh() +{ + G4cout << "*********PrintMesh::Size : " << fMesh.size() << G4endl; + auto iter = fMesh.begin(); + for(; iter != fMesh.end(); iter++) + { + auto index = iter->second->GetIndex(); + PrintVoxel(index); + } + G4cout << G4endl; +} +G4int G4DNAMesh::GetNumberOfType(G4Voxel::MolType type) const +{ + G4int output = 0; + auto iter = fMesh.begin(); + for(; iter != fMesh.end(); iter++) + { + auto node = dynamic_cast(iter->second); + if(node == nullptr) + { + continue; + } + auto it = node->GetMapList().find(type); + if(it != node->GetMapList().end()) + { + output += it->second; + } + } + return output; +} + +void G4DNAMesh::PrintVoxel(const Index& index) +{ + G4cout << "*********PrintVoxel::"; + G4cout << "key: " << GetKey(index) << " index : " << index + << " number of type : " << this->GetVoxelMapList(index).size() + << G4endl; + + for(const auto& it : this->GetVoxelMapList(index)) + { + G4cout << "_____________" << it.first->GetName() << " : " << it.second + << G4endl; + } + G4cout << G4endl; +} + +void G4DNAMesh::SetVoxelMapList(const Key& key, G4Voxel::MapList&& mapList) +{ + auto index = GetIndex(key); + auto pVoxel = fMesh[key]; + if(nullptr == pVoxel) + { + pVoxel = new G4Voxel(std::move(mapList), index, GetBoundingBox(index)); + fMesh[key] = pVoxel; + } + else + { + assert(pVoxel->GetMapList().empty()); // check if map list is empty + pVoxel->SetMapList(std::move(mapList)); + } +} + +G4Voxel::Index G4DNAMesh::GetIndex(const G4ThreeVector& position) const +{ + int dx = std::floor((position.x() - fpBoundingMesh->Getxlo()) / fResolution); + int dy = std::floor((position.y() - fpBoundingMesh->Getylo()) / fResolution); + int dz = std::floor((position.z() - fpBoundingMesh->Getzlo()) / fResolution); + assert(dx >= 0 && dy >= 0 && dz >= 0); + return G4Voxel::Index{ dx, dy, dz }; +} +G4Voxel::Index G4DNAMesh::GetIndex(const Index& index, int pixels) const +{ + int xmax = + std::floor((fpBoundingMesh->Getxhi() - fpBoundingMesh->Getxlo()) / fResolution); + int ymax = + std::floor((fpBoundingMesh->Getyhi() - fpBoundingMesh->Getylo()) / fResolution); + int zmax = + std::floor((fpBoundingMesh->Getzhi() - fpBoundingMesh->Getzlo()) / fResolution); + int dx = (int) (index.x * pixels / xmax); + int dy = (int) (index.y * pixels / ymax); + int dz = (int) (index.z * pixels / zmax); + assert(dx >= 0 && dy >= 0 && dz >= 0); + return Index{ dx, dy, dz }; +} + +G4DNABoundingBox G4DNAMesh::GetBoundingBox(const Index& index) +{ + auto xlo = fpBoundingMesh->Getxlo() + index.x * fResolution; + auto ylo = fpBoundingMesh->Getylo() + index.y * fResolution; + auto zlo = fpBoundingMesh->Getzlo() + index.z * fResolution; + + auto xhi = fpBoundingMesh->Getxlo() + (index.x + 1) * fResolution; + auto yhi = fpBoundingMesh->Getylo() + (index.y + 1) * fResolution; + auto zhi = fpBoundingMesh->Getzlo() + (index.z + 1) * fResolution; + return G4DNABoundingBox({ xhi, xlo, yhi, ylo, zhi, zlo }); +} + +G4Voxel::Index G4DNAMesh::GetIndex(Key key) const +{ + G4int xmax = + std::floor((fpBoundingMesh->Getxhi() - fpBoundingMesh->Getxlo()) / fResolution); + G4int ymax = + std::floor((fpBoundingMesh->Getyhi() - fpBoundingMesh->Getylo()) / fResolution); + G4int id = key; + G4int x_ = id % xmax; + id /= xmax; + G4int y_ = id % ymax; + id /= ymax; + G4int z_ = id; + + if(xmax != ymax) + { + G4cout << xmax << " " << ymax << " " << key << G4endl; + G4ExceptionDescription exceptionDescription; + exceptionDescription << "xmax != ymax"; + G4Exception("G4DNAMesh::GetIndex", "G4DNAMesh006", FatalErrorInArgument, + exceptionDescription); + } + + if(x_ < 0 || y_ < 0 || z_ < 0) + { + G4cout << xmax << " " << ymax << " " << key << G4endl; + G4cout << x_ << " " << y_ << " " << z_ << G4endl; + G4ExceptionDescription exceptionDescription; + exceptionDescription << "x_ < 0 || y_ < 0 || z_ < 0"; + G4Exception("G4DNAMesh::GetIndex", "G4DNAMesh005", FatalErrorInArgument, + exceptionDescription); + } + return Index{ x_, y_, z_ }; +} + +void G4DNAMesh::Reset() +{ + if(fMesh.empty()) + { + return; + } + for(auto iter : fMesh) // should use smart ptr + { + delete iter.second; + } + fMesh.clear(); +} + +const G4DNABoundingBox& G4DNAMesh::GetBoundingBox() const +{ + return *fpBoundingMesh; +} + +G4Voxel* G4DNAMesh::GetVoxel(Key key) +{ + auto it = fMesh.find(key); + if(it != fMesh.end()) + { + return it->second; + } + return nullptr; +} + +[[maybe_unused]] G4Voxel* G4DNAMesh::GetVoxel(const Index& index) +{ + return GetVoxel(GetKey(index)); +} + +std::vector // array is better ? +G4DNAMesh::FindVoxelNeighbors(const Index& index) const +{ + std::vector neighbors; + + auto xMax = (int) (std::floor( + (fpBoundingMesh->Getxhi() - fpBoundingMesh->Getxlo()) / fResolution)); + auto yMax = (int) (std::floor( + (fpBoundingMesh->Getyhi() - fpBoundingMesh->Getylo()) / fResolution)); + auto zMax = (int) (std::floor( + (fpBoundingMesh->Getzhi() - fpBoundingMesh->Getzlo()) / fResolution)); + + auto xmin = (index.x - 1) < 0 ? 0 : (index.x - 1); + auto ymin = (index.y - 1) < 0 ? 0 : (index.y - 1); + auto zmin = (index.z - 1) < 0 ? 0 : (index.z - 1); + + auto xmax = (index.x + 1) > xMax ? xMax : (index.x + 1); + auto ymax = (index.y + 1) > yMax ? yMax : (index.y + 1); + auto zmax = (index.z + 1) > zMax ? zMax : (index.z + 1); + for(int ix = xmin; ix <= xmax; ix++) + { + for(int iy = ymin; iy <= ymax; iy++) + { + for(int iz = zmin; iz <= zmax; iz++) + { + auto key = iz * yMax * xMax + iy * xMax + ix; + if(GetIndex(key) != index) + { // deleting the middle element + neighbors.push_back(GetIndex(key)); + } + } + } + } + if(neighbors.empty()) + { + G4ExceptionDescription exceptionDescription; + exceptionDescription << "neighbors.empty()"; + G4Exception("G4DNAMesh::FindVoxelNeighbors", "G4DNAMesh001", + FatalErrorInArgument, exceptionDescription); + } + + return neighbors; +} + +std::vector // array is better ? +G4DNAMesh::FindNeighboringVoxels(const Index& index) const +{ + std::vector neighbors; + // auto key = GetKey(index); + auto xMax = (int) (std::floor( + (fpBoundingMesh->Getxhi() - fpBoundingMesh->Getxlo()) / fResolution)); + auto yMax = (int) (std::floor( + (fpBoundingMesh->Getyhi() - fpBoundingMesh->Getylo()) / fResolution)); + auto zMax = (int) (std::floor( + (fpBoundingMesh->Getzhi() - fpBoundingMesh->Getzlo()) / fResolution)); + + if(index.x - 1 >= 0) + { + neighbors.emplace_back(Index(index.x - 1, index.y, index.z)); + } + if(index.y - 1 >= 0) + { + neighbors.emplace_back(Index(index.x, index.y - 1, index.z)); + } + if(index.z - 1 >= 0) + { + neighbors.emplace_back(Index(index.x, index.y, index.z - 1)); + } + if(index.x + 1 < xMax) + { + neighbors.emplace_back(Index(index.x + 1, index.y, index.z)); + } + if(index.y + 1 < yMax) + { + neighbors.emplace_back(Index(index.x, index.y + 1, index.z)); + } + if(index.z + 1 < zMax) + { + neighbors.emplace_back(Index(index.x, index.y, index.z + 1)); + } + +#ifdef DEBUG + G4cout << "Neighbors of : " << index << G4endl; + for(const auto& it : neighbors) + { + G4cout << it << G4endl; + } +#endif + + if(neighbors.size() > 6) + { + G4ExceptionDescription exceptionDescription; + exceptionDescription << "neighbors.size() > 6"; + G4Exception("G4DNAMesh::FindVoxelNeighbors", "G4DNAMesh002", + FatalErrorInArgument, exceptionDescription); + } + return neighbors; +} + +G4double G4DNAMesh::GetResolution() const { return fResolution; } + +G4DNAMesh::Key G4DNAMesh::GetKey(const G4ThreeVector& position) const +{ + if(!fpBoundingMesh->contains(position)) + { + G4ExceptionDescription exceptionDescription; + exceptionDescription << "the position: " << position + << " is not in the box"; + G4Exception("G4DNAMesh::GetKey", "G4DNAMesh010", FatalErrorInArgument, + exceptionDescription); + } + + auto dx = std::floor((position.x() - fpBoundingMesh->Getxlo()) / fResolution); + auto dy = std::floor((position.y() - fpBoundingMesh->Getylo()) / fResolution); + auto dz = std::floor((position.z() - fpBoundingMesh->Getzlo()) / fResolution); + auto xmax = + std::floor((fpBoundingMesh->Getxhi() - fpBoundingMesh->Getxlo()) / fResolution); + auto ymax = + std::floor((fpBoundingMesh->Getyhi() - fpBoundingMesh->Getylo()) / fResolution); + return dz * ymax * xmax + dy * xmax + dx; +} diff --git a/source/processes/electromagnetic/dna/utils/src/G4DNAMolecularReactionTable.cc b/source/processes/electromagnetic/dna/utils/src/G4DNAMolecularReactionTable.cc index 88cef811fc..7be12477b7 100644 --- a/source/processes/electromagnetic/dna/utils/src/G4DNAMolecularReactionTable.cc +++ b/source/processes/electromagnetic/dna/utils/src/G4DNAMolecularReactionTable.cc @@ -382,6 +382,7 @@ void G4DNAMolecularReactionTable::DeleteInstance() G4DNAMolecularReactionTable::G4DNAMolecularReactionTable() : G4ITReactionTable() , fVerbose(false) + , fGeometry(nullptr) , fpMessenger(new G4ReactionTableMessenger(this)) { } @@ -592,6 +593,11 @@ void G4DNAMolecularReactionTable::PrintTable(G4VDNAReactionModel* pReactionModel //______________________________________________________________________________ // Get/Set methods +G4VDNAMolecularGeometry* G4DNAMolecularReactionTable::GetGeometry() const +{ + return fGeometry; +} + G4DNAMolecularReactionTable::Data* G4DNAMolecularReactionTable::GetReactionData(Reactant* pReactant1, Reactant* pReactant2) const diff --git a/source/processes/electromagnetic/dna/utils/src/G4DNAScavengerMaterial.cc b/source/processes/electromagnetic/dna/utils/src/G4DNAScavengerMaterial.cc new file mode 100644 index 0000000000..81d28f794e --- /dev/null +++ b/source/processes/electromagnetic/dna/utils/src/G4DNAScavengerMaterial.cc @@ -0,0 +1,475 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +#include +#include "G4DNAScavengerMaterial.hh" +#include "G4StateManager.hh" +#include "G4DNAMolecularMaterial.hh" +#include "G4PhysicalConstants.hh" +#include "G4MolecularConfiguration.hh" +#include "G4SystemOfUnits.hh" +#include "G4DNABoundingBox.hh" +#include "G4VChemistryWorld.hh" +#include "G4Scheduler.hh" +#include "G4UnitsTable.hh" +#include "G4MoleculeTable.hh" + +using namespace std; + +//------------------------------------------------------------------------------ + +G4DNAScavengerMaterial::G4DNAScavengerMaterial( + G4VChemistryWorld* pChemistryInfo) + : G4VScavengerMaterial() + , fpChemistryInfo(pChemistryInfo) + , fIsInitialized(false) + , fCounterAgainstTime(false) + , fVerbose(0) +{ + Initialize(); +} + +//------------------------------------------------------------------------------ + +void G4DNAScavengerMaterial::Initialize() +{ + if(fIsInitialized) + { + return; + } + + if(fpChemistryInfo->size() == 0) + { + G4cout << "G4DNAScavengerMaterial existed but empty" << G4endl; + } + Reset(); + fIsInitialized = true; +} + +G4double G4DNAScavengerMaterial::GetNumberMoleculePerVolumeUnitForMaterialConf( + MolType matConf) const +{ + // no change these molecules + if(G4MoleculeTable::Instance()->GetConfiguration("H2O") == matConf) + { + G4ExceptionDescription exceptionDescription; + exceptionDescription << "matConf : "<GetName(); + G4Exception("G4DNAScavengerMaterial::GetNumberMoleculePerVolumeUnitForMaterialConf", "G4DNAScavengerMaterial001", + FatalErrorInArgument, exceptionDescription); + } + + auto iter = fScavengerTable.find(matConf); + if(iter == fScavengerTable.end()) + { + // G4cout<GetName()<second >= 1) + { + return (floor)(iter->second); + } + else + { + return 0; + } + } +} + +void G4DNAScavengerMaterial::ReduceNumberMoleculePerVolumeUnitForMaterialConf( + MolType matConf, G4double time) +{ + // no change these molecules + if(G4MoleculeTable::Instance()->GetConfiguration("H2O") == matConf || + G4MoleculeTable::Instance()->GetConfiguration("H3Op(B)") == + matConf || // suppose that pH is not changed during simu + G4MoleculeTable::Instance()->GetConfiguration("OHm(B)") == matConf) + { + // G4cout<<"moletype : "<GetName()<GetConfiguration("H2O") == matConf || + G4MoleculeTable::Instance()->GetConfiguration("H3Op(B)") == + matConf || // pH has no change + G4MoleculeTable::Instance()->GetConfiguration("OHm(B)") == matConf) + { + // G4cout<<"moletype : "<GetName()<GetChemistryBoundary(); + auto iter = fpChemistryInfo->begin(); + G4cout << "**************************************************************" + << G4endl; + for(; iter != fpChemistryInfo->end(); iter++) + { + auto containedConf = iter->first; + // auto concentration = iter->second; + auto concentration = + fScavengerTable[containedConf] / (Avogadro * pConfinedBox->Volume()); + G4cout << "Scavenger:" << containedConf->GetName() << " : " + << concentration / 1.0e-6 /*mm3 to L*/ << " (M) with : " + << fScavengerTable[containedConf] << " (molecules)" + << "in: " << pConfinedBox->Volume() / (um * um * um) << " (um3)" + << G4endl; + if(fScavengerTable[containedConf] < 1) + { + G4cout << "!!!!!!!!!!!!! this molecule has less one molecule for " + "considered volume" + << G4endl; + // assert(false); + } + if(fVerbose != 0) + { + Dump(); + } + } + G4cout << "**************************************************************" + << G4endl; +} + +void G4DNAScavengerMaterial::Reset() +{ + if(fpChemistryInfo == nullptr) + { + return; + } + + if(fpChemistryInfo->size() == 0) + { + return; + } + + fScavengerTable.clear(); + fCounterMap.clear(); + fpLastSearch.reset(nullptr); + + auto pConfinedBox = fpChemistryInfo->GetChemistryBoundary(); + auto iter = fpChemistryInfo->begin(); + for(; iter != fpChemistryInfo->end(); iter++) + { + auto containedConf = iter->first; + auto concentration = iter->second; + fScavengerTable[containedConf] = + floor(Avogadro * concentration * pConfinedBox->Volume()); + fCounterMap[containedConf][1 * picosecond] = + floor(Avogadro * concentration * pConfinedBox->Volume()); + } + PrintInfo(); +} + +//------------------------------------------------------------------------------ + +void G4DNAScavengerMaterial::AddAMoleculeAtTime( + MolType molecule, G4double time, const G4ThreeVector* /*position*/, + int number) +{ + if(fVerbose != 0) + { + G4cout << "G4DNAScavengerMaterial::AddAMoleculeAtTime : " + << molecule->GetName() << " at time : " << G4BestUnit(time, "Time") + << G4endl; + } + + auto counterMap_i = fCounterMap.find(molecule); + + if(counterMap_i == fCounterMap.end()) + { + fCounterMap[molecule][time] = number; + } + else if(counterMap_i->second.empty()) + { + counterMap_i->second[time] = number; + } + else + { + auto end = counterMap_i->second.rbegin(); + + if(end->first <= time || fabs(end->first - time) <= + G4::MoleculeCounter::TimePrecision::fPrecision) + { + G4double newValue = end->second + number; + counterMap_i->second[time] = newValue; + if(newValue != (floor)(fScavengerTable[molecule])) // protection + { + assert(false); + } + // G4cout<<" AddAMoleculeAtTime : "<GetName()<< " : + // "<GetName() << " is " + // << G4BestUnit(time, "Time") << " while " + // << " global time is " + // <<" end->first : "<first + // //<< + // G4BestUnit(G4Scheduler::Instance()->GetGlobalTime(), + // "Time") + // << G4endl; + // G4Exception("G4DNAScavengerMaterial::AddAMoleculeAtTime", + // "TIME_DONT_MATCH", + // FatalException, errMsg); + // } + } +} + +//------------------------------------------------------------------------------ + +void G4DNAScavengerMaterial::RemoveAMoleculeAtTime( + MolType pMolecule, G4double time, const G4ThreeVector* /*position*/, + int number) +{ + NbMoleculeAgainstTime& nbMolPerTime = fCounterMap[pMolecule]; + + if(fVerbose != 0) + { + auto it_ = nbMolPerTime.rbegin(); + G4cout << "G4DNAScavengerMaterial::RemoveAMoleculeAtTime : " + << pMolecule->GetName() << " at time : " << G4BestUnit(time, "Time") + + << " form : " << it_->second << G4endl; + } + + if(nbMolPerTime.empty()) + { + Dump(); + G4String errMsg = "You are trying to remove molecule " + + pMolecule->GetName() + + " from the counter while this kind of molecules has not " + "been registered yet"; + G4Exception("G4DNAScavengerMaterial::RemoveAMoleculeAtTime", "", + FatalErrorInArgument, errMsg); + + return; + } + else + { + auto it = nbMolPerTime.rbegin(); + + if(it == nbMolPerTime.rend()) + { + it--; + + G4String errMsg = "There was no " + pMolecule->GetName() + + " recorded at the time or even before the time asked"; + G4Exception("G4DNAScavengerMaterial::RemoveAMoleculeAtTime", "", + FatalErrorInArgument, errMsg); + } + + G4double finalN = it->second - number; + if(finalN < 0) + { + Dump(); + + G4cout << "fScavengerTable : " << pMolecule->GetName() << " : " + << (fScavengerTable[pMolecule]) << G4endl; + + G4ExceptionDescription errMsg; + errMsg << "After removal of " << number << " species of " + << " " << it->second << " " << pMolecule->GetName() + << " the final number at time " << G4BestUnit(time, "Time") + << " is less than zero and so not valid." << G4endl; + G4cout << " Global time is " + << G4BestUnit(G4Scheduler::Instance()->GetGlobalTime(), "Time") + << ". Previous selected time is " << G4BestUnit(it->first, "Time") + << G4endl; + G4Exception("G4DNAScavengerMaterial::RemoveAMoleculeAtTime", "N_INF_0", + FatalException, errMsg); + } + nbMolPerTime[time] = finalN; + + if(finalN != (floor)(fScavengerTable[pMolecule])) // protection + { + assert(false); + } + } +} + +void G4DNAScavengerMaterial::Dump() +{ + auto pConfinedBox = fpChemistryInfo->GetChemistryBoundary(); + auto V = pConfinedBox->Volume(); + for(auto it : fCounterMap) + { + auto pReactant = it.first; + + G4cout << " --- > For " << pReactant->GetName() << G4endl; + + for(auto it2 : it.second) + { + G4cout << " " << G4BestUnit(it2.first, "Time") << " " + << it2.second / (Avogadro * V * 1.0e-6 /*mm3 to L*/) << G4endl; + } + } +} + +int G4DNAScavengerMaterial::GetNMoleculesAtTime(MolType molecule, G4double time) +{ + if(!fCounterAgainstTime) + { + G4cout << "fCounterAgainstTime == false" << G4endl; + assert(false); + } + + G4bool sameTypeOfMolecule = SearchTimeMap(molecule); + return SearchUpperBoundTime(time, sameTypeOfMolecule); +} + +G4bool G4DNAScavengerMaterial::SearchTimeMap(MolType molecule) +{ + if(fpLastSearch == nullptr) + { + fpLastSearch = std::make_unique(); + } + else + { + if(fpLastSearch->fLowerBoundSet && + fpLastSearch->fLastMoleculeSearched->first == molecule) + { + return true; + } + } + + auto mol_it = fCounterMap.find(molecule); + fpLastSearch->fLastMoleculeSearched = mol_it; + + if(mol_it != fCounterMap.end()) + { + fpLastSearch->fLowerBoundTime = + fpLastSearch->fLastMoleculeSearched->second.end(); + fpLastSearch->fLowerBoundSet = true; + } + else + { + fpLastSearch->fLowerBoundSet = false; + } + + return false; +} + +//------------------------------------------------------------------------------ + +int G4DNAScavengerMaterial::SearchUpperBoundTime(G4double time, + G4bool sameTypeOfMolecule) +{ + auto mol_it = fpLastSearch->fLastMoleculeSearched; + if(mol_it == fCounterMap.end()) + { + return 0; + } + + NbMoleculeAgainstTime& timeMap = mol_it->second; + if(timeMap.empty()) + { + return 0; + } + + if(sameTypeOfMolecule) + { + if(fpLastSearch->fLowerBoundSet && + fpLastSearch->fLowerBoundTime != timeMap.end()) + { + if(fpLastSearch->fLowerBoundTime->first < time) + { + auto upperToLast = fpLastSearch->fLowerBoundTime; + upperToLast++; + + if(upperToLast == timeMap.end()) + { + return fpLastSearch->fLowerBoundTime->second; + } + + if(upperToLast->first > time) + { + return fpLastSearch->fLowerBoundTime->second; + } + } + } + } + + auto up_time_it = timeMap.upper_bound(time); + + if(up_time_it == timeMap.end()) + { + auto last_time = timeMap.rbegin(); + return last_time->second; + } + if(up_time_it == timeMap.begin()) + { + return 0; + } + + up_time_it--; + + fpLastSearch->fLowerBoundTime = up_time_it; + fpLastSearch->fLowerBoundSet = true; + + return fpLastSearch->fLowerBoundTime->second; +} \ No newline at end of file diff --git a/source/processes/electromagnetic/highenergy/History b/source/processes/electromagnetic/highenergy/History index a90a012a11..76cc2f0fd6 100644 --- a/source/processes/electromagnetic/highenergy/History +++ b/source/processes/electromagnetic/highenergy/History @@ -16,6 +16,19 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +20 October 21: V.Ivanchenko (emhighenergy-V10-07-06) +- G4AnnihiToMuPair - added option of tau+tau- pair production; + optimized computation of cross sections in compounds; + added process sub-type via enumerator + +16 August 2021: J.Hahnfeld (emhighenergy-V10-07-05) +- G4AnnihiToMuPair - return DBL_MAX if below threshold energy, + remember G4LossTableManager for correct deregistration in MT mode + +18 July 21: V.Ivanchenko (emhighenergy-V10-07-04) +- G4mplIonisationModel, G4mplIonisationWithDeltaModel - updated + according to change of G4VEmFluctuationModel signature + 15 May 21: V.Ivanchenko (emhighenergy-V10-07-03) - G4eeToHadrons - updated integral type diff --git a/source/processes/electromagnetic/highenergy/include/G4AnnihiToMuPair.hh b/source/processes/electromagnetic/highenergy/include/G4AnnihiToMuPair.hh index dc3bd69ee7..0135ed58d5 100644 --- a/source/processes/electromagnetic/highenergy/include/G4AnnihiToMuPair.hh +++ b/source/processes/electromagnetic/highenergy/include/G4AnnihiToMuPair.hh @@ -47,6 +47,7 @@ #include "G4VDiscreteProcess.hh" #include "globals.hh" +class G4LossTableManager; class G4ParticleDefinition; class G4Track; class G4Step; @@ -55,67 +56,69 @@ class G4Step; class G4AnnihiToMuPair : public G4VDiscreteProcess { - public: // with description +public: // with description - explicit G4AnnihiToMuPair(const G4String& processName ="AnnihiToMuPair", - G4ProcessType type = fElectromagnetic); + explicit G4AnnihiToMuPair(const G4String& processName ="AnnihiToMuPair", + G4ProcessType type = fElectromagnetic); - ~G4AnnihiToMuPair() override; + ~G4AnnihiToMuPair() override; - G4bool IsApplicable(const G4ParticleDefinition&) override; - // true for positron only. + G4bool IsApplicable(const G4ParticleDefinition&) override; + // true for positron only. - void BuildPhysicsTable(const G4ParticleDefinition&) override; - // here dummy, just calling PrintInfoDefinition - // the total cross section is calculated analytically + void BuildPhysicsTable(const G4ParticleDefinition&) override; + // here dummy, just calling PrintInfoDefinition + // the total cross section is calculated analytically - void PrintInfoDefinition(); - // Print few lines of informations about the process: validity range, - // origine ..etc.. - // Invoked by BuildPhysicsTable(). + void PrintInfoDefinition(); + // Print few lines of informations about the process: validity range, + // origine ..etc.. + // Invoked by BuildPhysicsTable(). - void SetCrossSecFactor(G4double fac); - // Set the factor to artificially increase the crossSection (default 1) + void SetCrossSecFactor(G4double fac); + // Set the factor to artificially increase the crossSection (default 1) - G4double GetCrossSecFactor() {return fCrossSecFactor;}; - // Get the factor to artificially increase the cross section + G4double GetCrossSecFactor() {return fCrossSecFactor;}; + // Get the factor to artificially increase the cross section - G4double CrossSectionPerVolume(G4double PositronEnergy, - const G4Material*); - // Compute total cross section + G4double CrossSectionPerVolume(G4double positronEnergy, const G4Material*); - G4double ComputeCrossSectionPerAtom(G4double PositronEnergy, - G4double AtomicZ); - // Compute total cross section + G4double ComputeCrossSectionPerElectron(const G4double energy); - G4double GetMeanFreePath(const G4Track& aTrack, - G4double previousStepSize, - G4ForceCondition* ) override; - // It returns the MeanFreePath of the process for the current track : - // (energy, material) - // The previousStepSize and G4ForceCondition* are not used. - // This function overloads a virtual function of the base class. - // It is invoked by the ProcessManager of the Particle. + G4double ComputeCrossSectionPerAtom(const G4double energy, const G4double Z); - G4VParticleChange* PostStepDoIt(const G4Track& aTrack, - const G4Step& aStep) override; - // It computes the final state of the process (at end of step), - // returned as a ParticleChange object. - // This function overloads a virtual function of the base class. - // It is invoked by the ProcessManager of the Particle. + G4double GetMeanFreePath(const G4Track& aTrack, + G4double previousStepSize, + G4ForceCondition* ) override; + // It returns the MeanFreePath of the process for the current track : + // (energy, material) + // The previousStepSize and G4ForceCondition* are not used. + // This function overloads a virtual function of the base class. + // It is invoked by the ProcessManager of the Particle. - // hide assignment operator as private - G4AnnihiToMuPair& operator=(const G4AnnihiToMuPair &right) = delete; - G4AnnihiToMuPair(const G4AnnihiToMuPair& ) = delete; + G4VParticleChange* PostStepDoIt(const G4Track& aTrack, + const G4Step& aStep) override; + // It computes the final state of the process (at end of step), + // returned as a ParticleChange object. + // This function overloads a virtual function of the base class. + // It is invoked by the ProcessManager of the Particle. - private: + // hide assignment operator as private + G4AnnihiToMuPair& operator=(const G4AnnihiToMuPair &right) = delete; + G4AnnihiToMuPair(const G4AnnihiToMuPair& ) = delete; - G4double fLowEnergyLimit; // Energy threshold of e+ - G4double fHighEnergyLimit; // Limit of validity of the model - G4double fCurrentSigma; // the last value of cross section per volume - G4double fCrossSecFactor; // factor to artificially increase - // the cross section, static to make sure - // to have single value +private: + + G4LossTableManager* fManager; + const G4ParticleDefinition* part1; + const G4ParticleDefinition* part2; + G4double fMass; + + G4double fLowEnergyLimit; // Energy threshold of e+ + G4double fHighEnergyLimit; // Limit of validity of the model + G4double fCurrentSigma; // the last value of cross section per volume + G4double fCrossSecFactor; // factor to increase the cross section + G4String fInfo = "e+e->mu+mu-"; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/highenergy/include/G4mplIonisationModel.hh b/source/processes/electromagnetic/highenergy/include/G4mplIonisationModel.hh index d53e13487c..4cc88c6c7a 100644 --- a/source/processes/electromagnetic/highenergy/include/G4mplIonisationModel.hh +++ b/source/processes/electromagnetic/highenergy/include/G4mplIonisationModel.hh @@ -80,14 +80,16 @@ public: G4double SampleFluctuations(const G4MaterialCutsCouple*, const G4DynamicParticle*, - G4double tmax, - G4double length, - G4double meanLoss) override; + const G4double tcut, + const G4double tmax, + const G4double length, + const G4double meanLoss) override; G4double Dispersion(const G4Material*, const G4DynamicParticle*, - G4double tmax, - G4double length) override; + const G4double tcut, + const G4double tmax, + const G4double length) override; void SetParticle(const G4ParticleDefinition* p); diff --git a/source/processes/electromagnetic/highenergy/include/G4mplIonisationWithDeltaModel.hh b/source/processes/electromagnetic/highenergy/include/G4mplIonisationWithDeltaModel.hh index ae997ff495..dad8d65dfa 100644 --- a/source/processes/electromagnetic/highenergy/include/G4mplIonisationWithDeltaModel.hh +++ b/source/processes/electromagnetic/highenergy/include/G4mplIonisationWithDeltaModel.hh @@ -94,14 +94,16 @@ public: virtual G4double SampleFluctuations(const G4MaterialCutsCouple*, const G4DynamicParticle*, - G4double tmax, - G4double length, - G4double meanLoss) override; + const G4double tcut, + const G4double tmax, + const G4double length, + const G4double meanLoss) override; virtual G4double Dispersion(const G4Material*, const G4DynamicParticle*, - G4double tmax, - G4double length) override; + const G4double tcut, + const G4double tmax, + const G4double length) override; virtual G4double MinEnergyCut(const G4ParticleDefinition*, const G4MaterialCutsCouple* couple) override; diff --git a/source/processes/electromagnetic/highenergy/src/G4AnnihiToMuPair.cc b/source/processes/electromagnetic/highenergy/src/G4AnnihiToMuPair.cc index f6d5363aba..c1197b0ec6 100644 --- a/source/processes/electromagnetic/highenergy/src/G4AnnihiToMuPair.cc +++ b/source/processes/electromagnetic/highenergy/src/G4AnnihiToMuPair.cc @@ -48,9 +48,12 @@ #include "G4Positron.hh" #include "G4MuonPlus.hh" #include "G4MuonMinus.hh" +#include "G4TauPlus.hh" +#include "G4TauMinus.hh" #include "G4Material.hh" #include "G4Step.hh" #include "G4LossTableManager.hh" +#include "G4Exp.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -60,23 +63,34 @@ G4AnnihiToMuPair::G4AnnihiToMuPair(const G4String& processName, G4ProcessType type):G4VDiscreteProcess (processName, type) { //e+ Energy threshold - const G4double Mu_massc2 = G4MuonPlus::MuonPlus()->GetPDGMass(); - fLowEnergyLimit = 2.*Mu_massc2*Mu_massc2/electron_mass_c2 - electron_mass_c2; + if(processName == "AnnihiToTauPair") { + SetProcessSubType(fAnnihilationToTauTau); + part1 = G4TauPlus::TauPlus(); + part2 = G4TauMinus::TauMinus(); + fInfo = "e+e->tau+tau-"; + } else { + SetProcessSubType(fAnnihilationToMuMu); + part1 = G4MuonPlus::MuonPlus(); + part2 = G4MuonMinus::MuonMinus(); + } + fMass = part1->GetPDGMass(); + fLowEnergyLimit = + 2.*fMass*fMass/CLHEP::electron_mass_c2 - CLHEP::electron_mass_c2; //model is ok up to 1000 TeV due to neglected Z-interference fHighEnergyLimit = 1000.*TeV; fCurrentSigma = 0.0; fCrossSecFactor = 1.; - SetProcessSubType(6); - G4LossTableManager::Instance()->Register(this); + fManager = G4LossTableManager::Instance(); + fManager->Register(this); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4AnnihiToMuPair::~G4AnnihiToMuPair() // (empty) destructor { - G4LossTableManager::Instance()->DeRegister(this); + fManager->DeRegister(this); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -89,8 +103,6 @@ G4bool G4AnnihiToMuPair::IsApplicable(const G4ParticleDefinition& particle) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4AnnihiToMuPair::BuildPhysicsTable(const G4ParticleDefinition&) -// Build cross section and mean free path tables -//here no tables, just calling PrintInfoDefinition { PrintInfoDefinition(); } @@ -101,49 +113,54 @@ void G4AnnihiToMuPair::SetCrossSecFactor(G4double fac) // Set the factor to artificially increase the cross section { fCrossSecFactor = fac; - G4cout << "The cross section for AnnihiToMuPair is artificially " - << "increased by the CrossSecFactor=" << fCrossSecFactor << G4endl; + //G4cout << "The cross section for AnnihiToMuPair is artificially " + // << "increased by the CrossSecFactor=" << fCrossSecFactor << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4double G4AnnihiToMuPair::ComputeCrossSectionPerAtom(G4double Epos, G4double Z) +G4double G4AnnihiToMuPair::ComputeCrossSectionPerElectron(const G4double e) // Calculates the microscopic cross section in GEANT4 internal units. // It gives a good description from threshold to 1000 GeV { - static const G4double Mmuon = G4MuonPlus::MuonPlus()->GetPDGMass(); - static const G4double Rmuon = CLHEP::elm_coupling/Mmuon; //classical particle radius - static const G4double Sig0 = CLHEP::pi*Rmuon*Rmuon/3.; //constant in crossSection - static const G4double pia = CLHEP::pi * CLHEP::fine_structure_const; // pi * alphaQED + G4double rmuon = CLHEP::elm_coupling/fMass; //classical particle radius + G4double sig0 = CLHEP::pi*rmuon*rmuon/3.; //constant in crossSection + const G4double pial = CLHEP::pi*CLHEP::fine_structure_const; // pi * alphaQED - G4double CrossSection = 0.; - if (Epos <= fLowEnergyLimit) return CrossSection; + if (e <= fLowEnergyLimit) return 0.0; - G4double xi = fLowEnergyLimit/Epos; - G4double piaxi = pia * sqrt(xi); - G4double SigmaEl = Sig0 * xi * (1.+xi/2.) * piaxi; - if( Epos>fLowEnergyLimit+1.e-5 ) SigmaEl /= (1.-std::exp( -piaxi/std::sqrt(1-xi) )); - CrossSection = SigmaEl*Z; // SigmaEl per electron * number of electrons per atom - return CrossSection; + const G4double xi = fLowEnergyLimit/e; + const G4double piaxi = pial * std::sqrt(xi); + G4double sigma = sig0 * xi * (1. + xi*0.5); + //G4cout << "### xi= " << xi << " piaxi=" << piaxi << G4endl; + + // argument of the exponent below 0.1 or above 10 + // Sigma per electron * number of electrons per atom + if(xi <= 1.0 - 100*piaxi*piaxi) { + sigma *= std::sqrt(1.0 - xi); + } else if( xi >= 1.0 - 0.01*piaxi*piaxi) { + sigma *= piaxi; + } else { + sigma *= piaxi/(1. - G4Exp( -piaxi/std::sqrt(1-xi) )); + } + //G4cout << "### sigma= " << sigma << G4endl; + return sigma; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4double G4AnnihiToMuPair::CrossSectionPerVolume(G4double PositronEnergy, +G4double G4AnnihiToMuPair::ComputeCrossSectionPerAtom(const G4double energy, + const G4double Z) +{ + return ComputeCrossSectionPerElectron(energy)*Z; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4AnnihiToMuPair::CrossSectionPerVolume(G4double energy, const G4Material* aMaterial) { - const G4ElementVector* theElementVector = aMaterial->GetElementVector(); - const G4double* NbOfAtomsPerVolume = aMaterial->GetVecNbOfAtomsPerVolume(); - - G4double SIGMA = 0.0; - - for ( size_t i=0 ; i < aMaterial->GetNumberOfElements() ; ++i ) - { - G4double AtomicZ = (*theElementVector)[i]->GetZ(); - SIGMA += NbOfAtomsPerVolume[i] * - ComputeCrossSectionPerAtom(PositronEnergy,AtomicZ); - } - return SIGMA; + return ComputeCrossSectionPerElectron(energy)*aMaterial->GetTotNbOfElectPerVolume(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -153,14 +170,14 @@ G4double G4AnnihiToMuPair::GetMeanFreePath(const G4Track& aTrack, // returns the positron mean free path in GEANT4 internal units { const G4DynamicParticle* aDynamicPositron = aTrack.GetDynamicParticle(); - G4double PositronEnergy = aDynamicPositron->GetTotalEnergy(); + G4double energy = aDynamicPositron->GetTotalEnergy(); const G4Material* aMaterial = aTrack.GetMaterial(); // cross section before step - fCurrentSigma = CrossSectionPerVolume(PositronEnergy, aMaterial); + fCurrentSigma = CrossSectionPerVolume(energy, aMaterial); // increase the CrossSection by CrossSecFactor (default 1) - return (fCurrentSigma > 0.0) ? 1.0/(fCurrentSigma*fCrossSecFactor) : 0.0; + return (fCurrentSigma > 0.0) ? 1.0/(fCurrentSigma*fCrossSecFactor) : DBL_MAX; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -172,11 +189,10 @@ G4VParticleChange* G4AnnihiToMuPair::PostStepDoIt(const G4Track& aTrack, // { aParticleChange.Initialize(aTrack); - static const G4double Mele=electron_mass_c2; - static const G4double Mmuon=G4MuonPlus::MuonPlus()->GetPDGMass(); // current Positron energy and direction, return if energy too low const G4DynamicParticle *aDynamicPositron = aTrack.GetDynamicParticle(); + const G4double Mele = CLHEP::electron_mass_c2; G4double Epos = aDynamicPositron->GetTotalEnergy(); G4double xs = CrossSectionPerVolume(Epos, aTrack.GetMaterial()); @@ -200,32 +216,32 @@ G4VParticleChange* G4AnnihiToMuPair::PostStepDoIt(const G4Track& aTrack, // generate phi // - G4double phi=2.*CLHEP::pi*G4UniformRand(); + G4double phi = 2.*CLHEP::pi*G4UniformRand(); - G4double Ecm = sqrt(0.5*Mele*(Epos+Mele)); - G4double Pcm = sqrt(Ecm*Ecm-Mmuon*Mmuon); - G4double beta = sqrt((Epos-Mele)/(Epos+Mele)); - G4double gamma = Ecm/Mele; // =sqrt((Epos+Mele)/(2.*Mele)); + G4double Ecm = std::sqrt(0.5*Mele*(Epos+Mele)); + G4double Pcm = std::sqrt(Ecm*Ecm - fMass*fMass); + G4double beta = std::sqrt((Epos-Mele)/(Epos+Mele)); + G4double gamma = Ecm/Mele; G4double Pt = Pcm*sint; // energy and momentum of the muons in the Lab // - G4double EmuPlus = gamma*( Ecm+cost*beta*Pcm); - G4double EmuMinus = gamma*( Ecm-cost*beta*Pcm); - G4double PmuPlusZ = gamma*(beta*Ecm+cost* Pcm); - G4double PmuMinusZ = gamma*(beta*Ecm-cost* Pcm); - G4double PmuPlusX = Pt*cos(phi); - G4double PmuPlusY = Pt*sin(phi); - G4double PmuMinusX =-Pt*cos(phi); - G4double PmuMinusY =-Pt*sin(phi); + G4double EmuPlus = gamma*(Ecm + cost*beta*Pcm); + G4double EmuMinus = gamma*(Ecm - cost*beta*Pcm); + G4double PmuPlusZ = gamma*(beta*Ecm + cost*Pcm); + G4double PmuMinusZ = gamma*(beta*Ecm - cost*Pcm); + G4double PmuPlusX = Pt*std::cos(phi); + G4double PmuPlusY = Pt*std::sin(phi); + G4double PmuMinusX =-PmuPlusX; + G4double PmuMinusY =-PmuPlusY; // absolute momenta - G4double PmuPlus = sqrt(Pt*Pt+PmuPlusZ *PmuPlusZ ); - G4double PmuMinus = sqrt(Pt*Pt+PmuMinusZ*PmuMinusZ); + G4double PmuPlus = std::sqrt(Pt*Pt+PmuPlusZ *PmuPlusZ ); + G4double PmuMinus = std::sqrt(Pt*Pt+PmuMinusZ*PmuMinusZ); // mu+ mu- directions for Positron in z-direction // G4ThreeVector - MuPlusDirection ( PmuPlusX/PmuPlus, PmuPlusY/PmuPlus, PmuPlusZ/PmuPlus ); + MuPlusDirection(PmuPlusX/PmuPlus, PmuPlusY/PmuPlus, PmuPlusZ/PmuPlus); G4ThreeVector MuMinusDirection(PmuMinusX/PmuMinus,PmuMinusY/PmuMinus,PmuMinusZ/PmuMinus); @@ -235,13 +251,14 @@ G4VParticleChange* G4AnnihiToMuPair::PostStepDoIt(const G4Track& aTrack, MuMinusDirection.rotateUz(PosiDirection); aParticleChange.SetNumberOfSecondaries(2); + // create G4DynamicParticle object for the particle1 - G4DynamicParticle* aParticle1= new G4DynamicParticle( - G4MuonPlus::MuonPlus(),MuPlusDirection,EmuPlus-Mmuon); + G4DynamicParticle* aParticle1 = + new G4DynamicParticle(part1, MuPlusDirection, EmuPlus-fMass); aParticleChange.AddSecondary(aParticle1); // create G4DynamicParticle object for the particle2 - G4DynamicParticle* aParticle2= new G4DynamicParticle( - G4MuonMinus::MuonMinus(),MuMinusDirection,EmuMinus-Mmuon); + G4DynamicParticle* aParticle2 = + new G4DynamicParticle(part2, MuMinusDirection, EmuMinus-fMass); aParticleChange.AddSecondary(aParticle2); // Kill the incident positron @@ -256,7 +273,7 @@ G4VParticleChange* G4AnnihiToMuPair::PostStepDoIt(const G4Track& aTrack, void G4AnnihiToMuPair::PrintInfoDefinition() { - G4String comments ="e+e->mu+mu- annihilation, atomic e- at rest, SubType=."; + G4String comments = fInfo + " annihilation, atomic e- at rest, SubType="; G4cout << G4endl << GetProcessName() << ": " << comments << GetProcessSubType() << G4endl; G4cout << " threshold at " << fLowEnergyLimit/CLHEP::GeV << " GeV" diff --git a/source/processes/electromagnetic/highenergy/src/G4mplIonisationModel.cc b/source/processes/electromagnetic/highenergy/src/G4mplIonisationModel.cc index 783573df1d..526f8d8a92 100644 --- a/source/processes/electromagnetic/highenergy/src/G4mplIonisationModel.cc +++ b/source/processes/electromagnetic/highenergy/src/G4mplIonisationModel.cc @@ -229,11 +229,12 @@ void G4mplIonisationModel::SampleSecondaries(std::vector*, G4double G4mplIonisationModel::SampleFluctuations( const G4MaterialCutsCouple* couple, const G4DynamicParticle* dp, - G4double tmax, - G4double length, - G4double meanLoss) + const G4double tcut, + const G4double tmax, + const G4double length, + const G4double meanLoss) { - G4double siga = Dispersion(couple->GetMaterial(),dp,tmax,length); + G4double siga = Dispersion(couple->GetMaterial(),dp,tcut,tmax,length); G4double loss = meanLoss; siga = std::sqrt(siga); G4double twomeanLoss = meanLoss + meanLoss; @@ -258,17 +259,16 @@ G4double G4mplIonisationModel::SampleFluctuations( G4double G4mplIonisationModel::Dispersion(const G4Material* material, const G4DynamicParticle* dp, - G4double tmax, - G4double length) + const G4double tcut, + const G4double tmax, + const G4double length) { G4double siga = 0.0; G4double tau = dp->GetKineticEnergy()/mass; if(tau > 0.0) { - G4double electronDensity = material->GetElectronDensity(); - G4double gam = tau + 1.0; - G4double invbeta2 = (gam*gam)/(tau * (tau+2.0)); - siga = (invbeta2 - 0.5) * twopi_mc2_rcl2 * tmax * length - * electronDensity * chargeSquare; + const G4double beta = dp->GetBeta(); + siga = (tmax/(beta*beta) - 0.5*tcut) * twopi_mc2_rcl2 * length + * material->GetElectronDensity() * chargeSquare; } return siga; } diff --git a/source/processes/electromagnetic/highenergy/src/G4mplIonisationWithDeltaModel.cc b/source/processes/electromagnetic/highenergy/src/G4mplIonisationWithDeltaModel.cc index 20eb8af349..fbb14064e4 100644 --- a/source/processes/electromagnetic/highenergy/src/G4mplIonisationWithDeltaModel.cc +++ b/source/processes/electromagnetic/highenergy/src/G4mplIonisationWithDeltaModel.cc @@ -326,13 +326,14 @@ G4mplIonisationWithDeltaModel::SampleSecondaries(vector* vdp G4double G4mplIonisationWithDeltaModel::SampleFluctuations( const G4MaterialCutsCouple* couple, const G4DynamicParticle* dp, - G4double tmax, - G4double length, - G4double meanLoss) + const G4double tcut, + const G4double tmax, + const G4double length, + const G4double meanLoss) { - G4double siga = Dispersion(couple->GetMaterial(),dp,tmax,length); + G4double siga = Dispersion(couple->GetMaterial(),dp,tcut,tmax,length); G4double loss = meanLoss; - siga = sqrt(siga); + siga = std::sqrt(siga); G4double twomeanLoss = meanLoss + meanLoss; if(twomeanLoss < siga) { @@ -356,17 +357,16 @@ G4double G4mplIonisationWithDeltaModel::SampleFluctuations( G4double G4mplIonisationWithDeltaModel::Dispersion(const G4Material* material, const G4DynamicParticle* dp, - G4double tmax, - G4double length) + const G4double tcut, + const G4double tmax, + const G4double length) { G4double siga = 0.0; G4double tau = dp->GetKineticEnergy()/mass; if(tau > 0.0) { - G4double electronDensity = material->GetElectronDensity(); - G4double gam = tau + 1.0; - G4double invbeta2 = (gam*gam)/(tau * (tau+2.0)); - siga = (invbeta2 - 0.5) * twopi_mc2_rcl2 * tmax * length - * electronDensity * chargeSquare; + const G4double beta = dp->GetBeta(); + siga = (tmax/(beta*beta) - 0.5*tcut) * twopi_mc2_rcl2 * length + * material->GetElectronDensity() * chargeSquare; } return siga; } diff --git a/source/processes/electromagnetic/lowenergy/History b/source/processes/electromagnetic/lowenergy/History index 41dedb8598..0ec8a5b04e 100644 --- a/source/processes/electromagnetic/lowenergy/History +++ b/source/processes/electromagnetic/lowenergy/History @@ -15,6 +15,62 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +25.11.2021 S. Guatelli, emlowen-V10-07-27 +- Added option to activate the ANSTO fluorescence radiation yield (Z < 93) + +18.11.2021 L.Pandola, emlowen-V10-07-26 +- Fix memory leak reported by Valgrind in Penelope models + +10.11.2021 S. Guatelli, emlowen-V10-07-25 +- included new PIXE data libraries following ANSTO + reccommendations +- included new classes to model the ANSTO ECPSSR cross sections + for protons and alpha particles + +04.11.2021 D.Lambert, emlowen-V10-07-24 +- G4MicroElecInelasticModel_new: fix delete pointer pb + in initialisation/destructor + +02.11.2021 Z.Li, emlowen-V10-07-23 +- G4LivermoreGammaConversionModel: code clean-up +- G4LivermoreComptonModel: code clean-up +- G4LivermorePhotoElectricModel: code clean-up + +01.11.2021 V.Ivanchenko, emlowen-V10-07-22 +- G4LivermorePolarizedRayleighModel - read data from the + $G4LEDATA/livermore directory; code clean-up +- G4LivermoreRayleighModel - code clean-up +- G4MicroElecCrossSectionDataSet_new, G4MicroElecElasticModel_new - + fixed headers +- G4LivermoreGammaConversionModelRC, G4LivermoreComptonModifiedModel + removed because are not used in any PhysicsList, example, or test + +15.10.2021 Z.li, emlowen-V10-07-21 +- G4LivermoreComptonModel, G4LivermoreGammaConversionModel, + G4LivermorePhotoElectricModel, G4LivermoreRayleighModel, + G4RayleighAngularGenerator: updated to use EPICS2017 data + +23.09.2021 A.Ribon, emlowen-V10-07-20 +- G4MicroElecSurface.cc : replaced hardwired process-sub-type 25 + with (already existing) fSurfaceReflection +- G4MicroElecElastic, G4MicroElecLOPhononScattering, G4MicroElecInelastic : + replaced hardwired process-sub-types 51 and 53 with new enum values + fLowEnergyElastic and fLowEnergyIonisation + +20.08.2021 V.Ivanchenko, emlowen-V10-07-19 +- G4PenelopeBremsstrahlungAngular, G4PenelopeBremsstrahlungFS, + G4PenelopeCrossSection, G4JAEAElasticScatteringModel, + G4JAEAPolarizedElasticScatteringModel - use optimal methods + of G4PhysicsVector + +04.08.2021 A.Ribon, emlowen-V10-07-18 +- G4LivermorePolarizedComptonModel : migrated to the new version of + G4PhysicsModelCatalog + +09.07.2021 V.Ivanchenko, emlowen-V10-07-17 +- G4AugerData - removed dead code +- G4VCrossSectionHandler, G4eIonisationParameters - use const + pointers to G4Element 31.05.2021 J.Allison, emlowen-V10-07-16 - G4LivermorePolarizedComptonModel: diff --git a/examples/advanced/underground_physics/include/DMXAnalysisManager.hh b/source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrKxsModel.hh similarity index 61% rename from examples/advanced/underground_physics/include/DMXAnalysisManager.hh rename to source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrKxsModel.hh index 85de92dda8..f3f38e7dfa 100644 --- a/examples/advanced/underground_physics/include/DMXAnalysisManager.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrKxsModel.hh @@ -22,28 +22,51 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// -// -// -// Author: Alex Howard (alexander.howard@cern.ch) -// +// // History: // ----------- -// 16 Jan 2002 Alex Howard Created -// 22 Oct 2009 Luciano Pandola Added TreeFactory, removed ntuple4 -// 31 May 2013 Luciano Pandola Migrated to g4analysis -// ------------------------------------------------------------------- +// 10 Nov 2021 S. Guatelli & S. Bakr - 1st implementation +// +// Class description +// ---------------- +// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas +// Based on the work of +// - S. Bakr et al. (2021) NIM B, 507:11–19. +// - S. Bakr et al (2018), NIMB B, 436: 285-291. +// --------------------------------------------------------------------------------------- -#ifndef DMXAnalysisManager_h -#define DMXAnalysisManager_h 1 +#ifndef G4ANSTOecpssrKxsModel_HH +#define G4ANSTOecpssrKxsModel_HH 1 -#include "g4root.hh" -//#include "g4xml.hh" -//#include "g4csv.hh" // can be used only with ntuples +#include "G4VecpssrKModel.hh" +#include "globals.hh" +#include + +class G4VDataSetAlgorithm; +class G4VEMDataSet; + +class G4ANSTOecpssrKxsModel : public G4VecpssrKModel + +{ +public: + + G4ANSTOecpssrKxsModel(); + + virtual ~G4ANSTOecpssrKxsModel(); + + G4double CalculateCrossSection (G4int zTarget, G4double massIncident, G4double energyIncident); + +private: + + G4ANSTOecpssrKxsModel(const G4ANSTOecpssrKxsModel&); + G4ANSTOecpssrKxsModel & operator = (const G4ANSTOecpssrKxsModel &right); + + G4VDataSetAlgorithm* interpolation; + + std::map< G4int , G4VEMDataSet* > protonDataSetMap; + std::map< G4int , G4VEMDataSet* > alphaDataSetMap; + std::map< G4int , G4VEMDataSet* > carbonDataSetMap; + +}; #endif - - - - - diff --git a/source/processes/electromagnetic/dna/molecules/management/src/G4FakeParticleID.cc b/source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrLixsModel.hh similarity index 51% rename from source/processes/electromagnetic/dna/molecules/management/src/G4FakeParticleID.cc rename to source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrLixsModel.hh index 49208a3d09..5c71e710a5 100644 --- a/source/processes/electromagnetic/dna/molecules/management/src/G4FakeParticleID.cc +++ b/source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrLixsModel.hh @@ -22,17 +22,58 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// -// -// Author: Mathieu Karamitros (kara (AT) cenbg . in2p3 . fr) -// +// // History: // ----------- -// 10 Oct 2011 M.Karamitros created -// -// ------------------------------------------------------------------- +// 10 Nov 2021 S. Guatelli & S. Bakr - 1st implementation +// +// Class description +// ---------------- +// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas +// Based on the work of +// - S. Bakr et al. (2021) NIM B, 507:11–19. +// - S. Bakr et al (2018), NIMB B, 436: 285-291. +// --------------------------------------------------------------------------------------- +#ifndef G4ANSTOecpssrLixsModel_HH +#define G4ANSTOecpssrLixsModel_HH 1 -#include "G4FakeParticleID.hh" +#include "G4VecpssrLiModel.hh" +#include "globals.hh" +#include -G4ThreadLocal int G4FakeParticleID::fLastValue(999666999); +class G4VDataSetAlgorithm; +class G4VEMDataSet; + +class G4ANSTOecpssrLixsModel : public G4VecpssrLiModel + +{ +public: + + G4ANSTOecpssrLixsModel(); + + virtual ~G4ANSTOecpssrLixsModel(); + + G4double CalculateL1CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident); + G4double CalculateL2CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident); + G4double CalculateL3CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident); +private: + + G4ANSTOecpssrLixsModel(const G4ANSTOecpssrLixsModel&); + G4ANSTOecpssrLixsModel & operator = (const G4ANSTOecpssrLixsModel &right); + + G4VDataSetAlgorithm* interpolation; + + std::map< G4int , G4VEMDataSet* > protonL1DataSetMap; + std::map< G4int , G4VEMDataSet* > protonL2DataSetMap; + std::map< G4int , G4VEMDataSet* > protonL3DataSetMap; + std::map< G4int , G4VEMDataSet* > alphaL1DataSetMap; + std::map< G4int , G4VEMDataSet* > alphaL2DataSetMap; + std::map< G4int , G4VEMDataSet* > alphaL3DataSetMap; + std::map< G4int , G4VEMDataSet* > carbonL1DataSetMap; + std::map< G4int , G4VEMDataSet* > carbonL2DataSetMap; + std::map< G4int , G4VEMDataSet* > carbonL3DataSetMap; + +}; + +#endif diff --git a/source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrMixsModel.hh b/source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrMixsModel.hh new file mode 100644 index 0000000000..6d6e136b77 --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/include/G4ANSTOecpssrMixsModel.hh @@ -0,0 +1,94 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// History: +// ----------- +// 10 Nov 2021 S. Guatelli & S. Bakr - 1st implementation +// +// Class description +// ---------------- +// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas +// Based on the work of +// - S. Bakr et al. (2021) NIM B, 507:11–19. +// - S. Bakr et al (2018), NIMB B, 436: 285-291. +// --------------------------------------------------------------------------------------- + +#ifndef G4ANSTOecpssrMixsModel_HH +#define G4ANSTOecpssrMixsModel_HH 1 + +#include "G4VecpssrMiModel.hh" +#include "globals.hh" +#include + +class G4VDataSetAlgorithm; +class G4VEMDataSet; + +class G4ANSTOecpssrMixsModel : public G4VecpssrMiModel + +{ +public: + + G4ANSTOecpssrMixsModel(); + + virtual ~G4ANSTOecpssrMixsModel(); + + G4double CalculateM1CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident); + G4double CalculateM2CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident); + G4double CalculateM3CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident); + G4double CalculateM4CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident); + G4double CalculateM5CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident); +private: + + G4double CalculateMiCrossSection (G4int zTarget, G4double massIncident, G4double energyIncident, G4int mShellId); + + G4ANSTOecpssrMixsModel(const G4ANSTOecpssrMixsModel&); + G4ANSTOecpssrMixsModel & operator = (const G4ANSTOecpssrMixsModel &right); + + G4VDataSetAlgorithm* interpolation; + + std::vector< std::map > protonMiXsVector; + std::vector< std::map > alphaMiXsVector; + std::vector< std::map > carbonMiXsVector; + + std::map< G4int , G4VEMDataSet* > protonM1DataSetMap; + std::map< G4int , G4VEMDataSet* > protonM2DataSetMap; + std::map< G4int , G4VEMDataSet* > protonM3DataSetMap; + std::map< G4int , G4VEMDataSet* > protonM4DataSetMap; + std::map< G4int , G4VEMDataSet* > protonM5DataSetMap; + + std::map< G4int , G4VEMDataSet* > alphaM1DataSetMap; + std::map< G4int , G4VEMDataSet* > alphaM2DataSetMap; + std::map< G4int , G4VEMDataSet* > alphaM3DataSetMap; + std::map< G4int , G4VEMDataSet* > alphaM4DataSetMap; + std::map< G4int , G4VEMDataSet* > alphaM5DataSetMap; + + std::map< G4int , G4VEMDataSet* > carbonM1DataSetMap; + std::map< G4int , G4VEMDataSet* > carbonM2DataSetMap; + std::map< G4int , G4VEMDataSet* > carbonM3DataSetMap; + std::map< G4int , G4VEMDataSet* > carbonM4DataSetMap; + std::map< G4int , G4VEMDataSet* > carbonM5DataSetMap; +}; + +#endif diff --git a/source/processes/electromagnetic/lowenergy/include/G4LivermoreComptonModel.hh b/source/processes/electromagnetic/lowenergy/include/G4LivermoreComptonModel.hh index eb1ad7cdba..c66a94db96 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4LivermoreComptonModel.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4LivermoreComptonModel.hh @@ -84,11 +84,12 @@ private: static G4ShellData* shellData; static G4DopplerProfile* profileData; - static const G4int maxZ = 99; - static G4PhysicsFreeVector* data[100]; - static const G4double ScatFuncFitParam[101][9]; + + static G4PhysicsFreeVector* data[101]; // 101 because Z range is 1-100 + static const G4double ScatFuncFitParam[101][16]; G4int verboseLevel; + G4int maxZ; G4bool isInitialised; }; diff --git a/source/processes/electromagnetic/lowenergy/include/G4LivermoreComptonModifiedModel.hh b/source/processes/electromagnetic/lowenergy/include/G4LivermoreComptonModifiedModel.hh deleted file mode 100644 index 9d7b0dd870..0000000000 --- a/source/processes/electromagnetic/lowenergy/include/G4LivermoreComptonModifiedModel.hh +++ /dev/null @@ -1,91 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Author: Sebastien Incerti -// 30 October 2008 -// on base of G4LowEnergyCompton developed by A.Forti and M.G.Pia -// -// Modified: -// -------- -// 30 May 2011 V Ivanchenko Migration to model design for deexcitation - -#ifndef G4LivermoreComptonModifiedModel_h -#define G4LivermoreComptonModifiedModel_h 1 - -#include "G4VEmModel.hh" -#include "G4ShellData.hh" -#include "G4DopplerProfile.hh" - -class G4ParticleChangeForGamma; -class G4VCrossSectionHandler; -class G4VAtomDeexcitation; -class G4VEMDataSet; - -class G4LivermoreComptonModifiedModel : public G4VEmModel -{ -public: - explicit G4LivermoreComptonModifiedModel(const G4ParticleDefinition* p = nullptr, - const G4String& nam = "LivermoreModifiedCompton"); - virtual ~G4LivermoreComptonModifiedModel(); - - void Initialise(const G4ParticleDefinition*, const G4DataVector&) override; - - G4double ComputeCrossSectionPerAtom( const G4ParticleDefinition*, - G4double kinEnergy, - G4double Z, - G4double A=0, - G4double cut=0, - G4double emax=DBL_MAX ) override; - - void SampleSecondaries(std::vector*, - const G4MaterialCutsCouple*, - const G4DynamicParticle*, - G4double tmin, - G4double maxEnergy) override; - - G4LivermoreComptonModifiedModel & operator=(const G4LivermoreComptonModifiedModel &right) = delete; - G4LivermoreComptonModifiedModel(const G4LivermoreComptonModifiedModel&) = delete; - -protected: - G4ParticleChangeForGamma* fParticleChange; - -private: - G4VEMDataSet* scatterFunctionData; - G4VCrossSectionHandler* crossSectionHandler; - - G4VAtomDeexcitation* fAtomDeexcitation; - - G4ShellData shellData; - G4DopplerProfile profileData; - - G4int verboseLevel; - G4bool isInitialised; - -}; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -#endif diff --git a/source/processes/electromagnetic/lowenergy/include/G4LivermoreGammaConversionModel.hh b/source/processes/electromagnetic/lowenergy/include/G4LivermoreGammaConversionModel.hh index bcd865018e..86d86682e9 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4LivermoreGammaConversionModel.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4LivermoreGammaConversionModel.hh @@ -69,14 +69,12 @@ public: private: void ReadData(size_t Z, const char* path = nullptr); + static G4PhysicsFreeVector* data[101]; // 101 because Z range is 1-100 + static G4double lowEnergyLimit; - G4ParticleChangeForGamma* fParticleChange; - - static const G4int maxZ =101; - static G4PhysicsFreeVector* data[maxZ]; // 101 because Z range is 1-100 - - static G4double lowEnergyLimit; G4int verboseLevel; + G4ParticleChangeForGamma* fParticleChange; + G4int maxZ; }; diff --git a/source/processes/electromagnetic/lowenergy/include/G4LivermoreGammaConversionModelRC.hh b/source/processes/electromagnetic/lowenergy/include/G4LivermoreGammaConversionModelRC.hh deleted file mode 100644 index 8c08e9f90a..0000000000 --- a/source/processes/electromagnetic/lowenergy/include/G4LivermoreGammaConversionModelRC.hh +++ /dev/null @@ -1,95 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Authors: G.Depaola & F.Longo -// - -#ifndef G4LivermoreGammaConversionModelRC_h -#define G4LivermoreGammaConversionModelRC_h 1 - -#include "G4VEmModel.hh" -#include "G4PhysicsFreeVector.hh" -#include "G4ProductionCutsTable.hh" - -class G4ParticleChangeForGamma; - -class G4LivermoreGammaConversionModelRC : public G4VEmModel -{ -public: - - explicit G4LivermoreGammaConversionModelRC(const G4ParticleDefinition* p = nullptr, - const G4String& nam = "LivermoreGammaConversionRC_1"); - virtual ~G4LivermoreGammaConversionModelRC(); - - void Initialise(const G4ParticleDefinition*, const G4DataVector&) override; - - void InitialiseLocal(const G4ParticleDefinition*, - G4VEmModel* masterModel) override; - - void InitialiseForElement(const G4ParticleDefinition*, G4int Z) override; - - G4double ComputeCrossSectionPerAtom( - const G4ParticleDefinition*, - G4double kinEnergy, - G4double Z, - G4double A=0, - G4double cut=0, - G4double emax=DBL_MAX) override; - - void SampleSecondaries(std::vector*, - const G4MaterialCutsCouple*, - const G4DynamicParticle*, - G4double tmin, - G4double maxEnergy) override; - - G4double MinPrimaryEnergy(const G4Material*, - const G4ParticleDefinition*, - G4double) override; - - G4LivermoreGammaConversionModelRC & operator=(const G4LivermoreGammaConversionModelRC &right) = delete; - G4LivermoreGammaConversionModelRC(const G4LivermoreGammaConversionModelRC&) = delete; - -private: - void ReadData(size_t Z, const char* path = 0); - G4double ScreenFunction1(G4double screenVariable); - G4double ScreenFunction2(G4double screenVariable); - G4double fbeta (G4double x); - G4double Dilog (G4double x); - - G4ParticleChangeForGamma* fParticleChange; - - static const G4int maxZ = 99; - static G4PhysicsFreeVector* data[100]; // 100 because Z range is 1-99 - - G4double lowEnergyLimit; - G4double smallEnergy; - G4int verboseLevel; - G4bool isInitialised; -}; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -#endif diff --git a/source/processes/electromagnetic/lowenergy/include/G4LivermorePhotoElectricModel.hh b/source/processes/electromagnetic/lowenergy/include/G4LivermorePhotoElectricModel.hh index b93d8f3a82..dc4e2fd9eb 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4LivermorePhotoElectricModel.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4LivermorePhotoElectricModel.hh @@ -96,12 +96,12 @@ private: const G4ParticleDefinition* theGamma; const G4ParticleDefinition* theElectron; - static G4PhysicsFreeVector* fCrossSection[99]; - static G4PhysicsFreeVector* fCrossSectionLE[99]; - static std::vector* fParamHigh[99]; - static std::vector* fParamLow[99]; - static G4int fNShells[99]; - static G4int fNShellsUsed[99]; + static G4PhysicsFreeVector* fCrossSection[101]; // 101 because Z range is 1-100 + static G4PhysicsFreeVector* fCrossSectionLE[101]; + static std::vector* fParamHigh[101]; + static std::vector* fParamLow[101]; + static G4int fNShells[101]; + static G4int fNShellsUsed[101]; static G4ElementData* fShellCrossSection; static G4Material* fWater; static G4double fWaterEnergyLimit; diff --git a/source/processes/electromagnetic/lowenergy/include/G4LivermorePolarizedComptonModel.hh b/source/processes/electromagnetic/lowenergy/include/G4LivermorePolarizedComptonModel.hh index 1d8627115b..6b87f8d9f6 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4LivermorePolarizedComptonModel.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4LivermorePolarizedComptonModel.hh @@ -98,7 +98,7 @@ private: G4int verboseLevel; G4bool isInitialised; - G4int fEntanglementModelIndex; + G4int fEntanglementModelID; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/lowenergy/include/G4LivermorePolarizedRayleighModel.hh b/source/processes/electromagnetic/lowenergy/include/G4LivermorePolarizedRayleighModel.hh index e0d902916a..e74f0125fb 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4LivermorePolarizedRayleighModel.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4LivermorePolarizedRayleighModel.hh @@ -36,15 +36,14 @@ #include "G4ParticleChangeForGamma.hh" #include "G4PhysicsFreeVector.hh" #include "G4ProductionCutsTable.hh" -#include "G4VEMDataSet.hh" -#include "G4CompositeEMDataSet.hh" class G4LivermorePolarizedRayleighModel : public G4VEmModel { public: - explicit G4LivermorePolarizedRayleighModel(const G4ParticleDefinition* p = nullptr, - const G4String& nam = "LivermorePolarizedRayleigh"); + explicit G4LivermorePolarizedRayleighModel( + const G4ParticleDefinition* p = nullptr, + const G4String& nam = "LivermorePolarizedRayleigh"); virtual ~G4LivermorePolarizedRayleighModel(); @@ -67,12 +66,13 @@ public: G4double tmin, G4double maxEnergy) override; - G4LivermorePolarizedRayleighModel & operator=(const G4LivermorePolarizedRayleighModel &right) = delete; + G4LivermorePolarizedRayleighModel & operator= + (const G4LivermorePolarizedRayleighModel &right) = delete; G4LivermorePolarizedRayleighModel(const G4LivermorePolarizedRayleighModel&) = delete; private: //cross sections - void ReadData(size_t Z, const char* path = 0); + void ReadData(size_t Z, const char* path = nullptr); // Polarization // Generates \f$cos \left ( \theta\right )\f$ of the scattered photon @@ -92,9 +92,10 @@ private: G4ThreeVector GetPhotonPolarization(const G4DynamicParticle& photon); G4ParticleChangeForGamma* fParticleChange; - static G4VEMDataSet* formFactorData; - static const G4int maxZ = 100; + + const G4int maxZ = 100; static G4PhysicsFreeVector* dataCS[101]; + static G4PhysicsFreeVector* formFactorData[101]; G4double lowEnergyLimit; G4int verboseLevel; diff --git a/source/processes/electromagnetic/lowenergy/include/G4LivermoreRayleighModel.hh b/source/processes/electromagnetic/lowenergy/include/G4LivermoreRayleighModel.hh index eb5da54eca..e7875d96af 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4LivermoreRayleighModel.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4LivermoreRayleighModel.hh @@ -70,12 +70,12 @@ private: void ReadData(size_t Z, const char* path = 0); G4ParticleChangeForGamma* fParticleChange; - - static const G4int maxZ = 100; - static G4PhysicsFreeVector* dataCS[101]; + + static G4PhysicsFreeVector* dataCS[101]; // 101 because Z range is 1-100 G4double lowEnergyLimit; G4int verboseLevel; + G4int maxZ; G4bool isInitialised; }; diff --git a/source/processes/electromagnetic/lowenergy/include/G4MicroElecCrossSectionDataSet_new.hh b/source/processes/electromagnetic/lowenergy/include/G4MicroElecCrossSectionDataSet_new.hh index b95c7c9d4b..e98592afb6 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4MicroElecCrossSectionDataSet_new.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4MicroElecCrossSectionDataSet_new.hh @@ -27,8 +27,8 @@ // Based on G4DNACrossSectionDataSet // -#ifndef G4MICROELECCROSSSECTIONDATASET_HH -#define G4MICROELECCROSSSECTIONDATASET_HH 1 +#ifndef G4MICROELECCROSSSECTIONDATASET_NEW_HH +#define G4MICROELECCROSSSECTIONDATASET_NEW_HH 1 #include #include "G4ShellEMDataSet.hh" diff --git a/source/processes/electromagnetic/lowenergy/include/G4MicroElecElasticModel_new.hh b/source/processes/electromagnetic/lowenergy/include/G4MicroElecElasticModel_new.hh index 779b852c5b..2d054411db 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4MicroElecElasticModel_new.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4MicroElecElasticModel_new.hh @@ -73,8 +73,8 @@ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef G4MICROELECELASTICMODEL_HH -#define G4MICROELECELASTICMODEL_HH 1 +#ifndef G4MICROELECELASTICMODEL_NEW_HH +#define G4MICROELECELASTICMODEL_NEW_HH 1 #include #include diff --git a/source/processes/electromagnetic/lowenergy/include/G4PenelopeOscillatorManager.hh b/source/processes/electromagnetic/lowenergy/include/G4PenelopeOscillatorManager.hh index 80a33042c6..ca796d00b3 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4PenelopeOscillatorManager.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4PenelopeOscillatorManager.hh @@ -104,11 +104,11 @@ public: G4PenelopeOscillatorManager& operator=(const G4PenelopeOscillatorManager& right) = delete; G4PenelopeOscillatorManager(const G4PenelopeOscillatorManager&) = delete; + ~G4PenelopeOscillatorManager(); protected: explicit G4PenelopeOscillatorManager(); - ~G4PenelopeOscillatorManager(); - + private: //create both tables simultaneously void CheckForTablesCreated(); diff --git a/source/processes/electromagnetic/lowenergy/sources.cmake b/source/processes/electromagnetic/lowenergy/sources.cmake index bc2eb53fff..838a855a80 100644 --- a/source/processes/electromagnetic/lowenergy/sources.cmake +++ b/source/processes/electromagnetic/lowenergy/sources.cmake @@ -3,6 +3,9 @@ # Define the Geant4 Module. geant4_add_module(G4emlowenergy PUBLIC_HEADERS + G4ANSTOecpssrKxsModel.hh + G4ANSTOecpssrLixsModel.hh + G4ANSTOecpssrMixsModel.hh G4AtomicDeexcitation.hh G4AtomicTransitionManager.hh G4AugerData.hh @@ -50,10 +53,8 @@ geant4_add_module(G4emlowenergy G4LinLogLogInterpolation.hh G4LivermoreBremsstrahlungModel.hh G4LivermoreComptonModel.hh - G4LivermoreComptonModifiedModel.hh G4LivermoreGammaConversion5DModel.hh G4LivermoreGammaConversionModel.hh - G4LivermoreGammaConversionModelRC.hh G4LivermoreIonisationCrossSection.hh G4LivermoreIonisationModel.hh G4LivermoreNuclearGammaConversionModel.hh @@ -121,6 +122,9 @@ geant4_add_module(G4emlowenergy G4VIonDEDXScalingAlgorithm.hh G4VLowEnergyModel.hh SOURCES + G4ANSTOecpssrKxsModel.cc + G4ANSTOecpssrLixsModel.cc + G4ANSTOecpssrMixsModel.cc G4AtomicDeexcitation.cc G4AtomicTransitionManager.cc G4AugerData.cc @@ -167,10 +171,8 @@ geant4_add_module(G4emlowenergy G4LinLogLogInterpolation.cc G4LivermoreBremsstrahlungModel.cc G4LivermoreComptonModel.cc - G4LivermoreComptonModifiedModel.cc G4LivermoreGammaConversion5DModel.cc G4LivermoreGammaConversionModel.cc - G4LivermoreGammaConversionModelRC.cc G4LivermoreIonisationCrossSection.cc G4LivermoreIonisationModel.cc G4LivermoreNuclearGammaConversionModel.cc diff --git a/source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrKxsModel.cc b/source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrKxsModel.cc new file mode 100644 index 0000000000..0b14d0e975 --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrKxsModel.cc @@ -0,0 +1,117 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// History: +// ----------- +// 10 Nov 2021 S. Guatelli & S. Bakr, Wollongong University - 1st implementation +// +// Class description +// ---------------- +// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas +// Based on the work of +// - S. Bakr et al. (2021) NIM B, 507:11–19. +// - S. Bakr et al (2018), NIMB B, 436: 285-291. +// --------------------------------------------------------------------------------------- + +#include +#include + +#include "G4ANSTOecpssrKxsModel.hh" + +#include "globals.hh" +#include "G4SystemOfUnits.hh" +#include "G4ios.hh" + +#include "G4EMDataSet.hh" +#include "G4LogLogInterpolation.hh" +#include "G4Proton.hh" +#include "G4Alpha.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4ANSTOecpssrKxsModel::G4ANSTOecpssrKxsModel() +{ + + G4cout << "Using ANSTO K Cross Sections! "<< G4endl; + + interpolation = new G4LogLogInterpolation(); + for (G4int i=6; i<93; i++) + { + protonDataSetMap[i] = new G4EMDataSet(i,interpolation); + protonDataSetMap[i]->LoadData("pixe_ANSTO/proton/k-"); + } + + for (G4int i=6; i<93; i++) + { + alphaDataSetMap[i] = new G4EMDataSet(i,interpolation); + alphaDataSetMap[i]->LoadData("pixe_ANSTO/alpha/k-"); + } + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4ANSTOecpssrKxsModel::~G4ANSTOecpssrKxsModel() +{ + protonDataSetMap.clear(); + alphaDataSetMap.clear(); + delete interpolation; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrKxsModel::CalculateCrossSection(G4int zTarget,G4double massIncident, G4double energyIncident) +{ + G4Proton* aProton = G4Proton::Proton(); + G4Alpha* aAlpha = G4Alpha::Alpha(); + G4double sigma = 0; + + if (massIncident == aProton->GetPDGMass()) + { + if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 5) { + + sigma = protonDataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > protonDataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + } + + else if (massIncident == aAlpha->GetPDGMass()) + { + if (energyIncident > 0.2*MeV && energyIncident < 40.*MeV && zTarget < 93 && zTarget > 5) { + + sigma = alphaDataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > alphaDataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + } + + else + { + sigma = 0.; + } + + // sigma is in internal units: it has been converted from + // the input file in barns bt the EmDataset + return sigma; +} diff --git a/source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrLixsModel.cc b/source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrLixsModel.cc new file mode 100644 index 0000000000..83ae3caedb --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrLixsModel.cc @@ -0,0 +1,207 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// History: +// ----------- +// 10 Nov 2021 S. Guatelli & S. Bakr, Wollongong University - 1st implementation +// +// Class description +// ---------------- +// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas +// Based on the work of +// - S. Bakr et al. (2021) NIM B, 507:11–19. +// - S. Bakr et al (2018), NIMB B, 436: 285-291. +// --------------------------------------------------------------------------------------- + +#include +#include + +#include "G4ANSTOecpssrLixsModel.hh" + +#include "globals.hh" +#include "G4SystemOfUnits.hh" +#include "G4ios.hh" + +#include "G4EMDataSet.hh" +#include "G4LinInterpolation.hh" +#include "G4Proton.hh" +#include "G4Alpha.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4ANSTOecpssrLixsModel::G4ANSTOecpssrLixsModel() +{ + G4cout << "Using ANSTO L Cross Sections! "<< G4endl; + + interpolation = new G4LinInterpolation(); + + for (G4int i=26; i<93; i++) + { + protonL1DataSetMap[i] = new G4EMDataSet(i,interpolation); + protonL1DataSetMap[i]->LoadData("pixe_ANSTO/proton/l1-"); + + protonL2DataSetMap[i] = new G4EMDataSet(i,interpolation); + protonL2DataSetMap[i]->LoadData("pixe_ANSTO/proton/l2-"); + + protonL3DataSetMap[i] = new G4EMDataSet(i,interpolation); + protonL3DataSetMap[i]->LoadData("pixe_ANSTO/proton/l3-"); + } + + for (G4int i=26; i<93; i++) + { + alphaL1DataSetMap[i] = new G4EMDataSet(i,interpolation); + alphaL1DataSetMap[i]->LoadData("pixe_ANSTO/alpha/l1-"); + + alphaL2DataSetMap[i] = new G4EMDataSet(i,interpolation); + alphaL2DataSetMap[i]->LoadData("pixe_ANSTO/alpha/l2-"); + + alphaL3DataSetMap[i] = new G4EMDataSet(i,interpolation); + alphaL3DataSetMap[i]->LoadData("pixe_ANSTO/alpha/l3-"); + } + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4ANSTOecpssrLixsModel::~G4ANSTOecpssrLixsModel() +{ + protonL1DataSetMap.clear(); + alphaL1DataSetMap.clear(); + + protonL2DataSetMap.clear(); + alphaL2DataSetMap.clear(); + + protonL3DataSetMap.clear(); + alphaL3DataSetMap.clear(); + + delete interpolation; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrLixsModel::CalculateL1CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident) +{ + G4Proton* aProton = G4Proton::Proton(); + G4Alpha* aAlpha = G4Alpha::Alpha(); + G4double sigma = 0; + + if (massIncident == aProton->GetPDGMass()) + { + + if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 25) { + + sigma = protonL1DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > protonL1DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + + else if (massIncident == aAlpha->GetPDGMass()) + { + + if (energyIncident > 0.2*MeV && energyIncident < 40.*MeV && zTarget < 93 && zTarget > 25) { + + sigma = alphaL1DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > alphaL1DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else + { + sigma = 0.; + } + } +} + // sigma is in internal units: it has been converted from + // the input file in barns bt the EmDataset + return sigma; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrLixsModel::CalculateL2CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident) +{ + G4Proton* aProton = G4Proton::Proton(); + G4Alpha* aAlpha = G4Alpha::Alpha(); + G4double sigma = 0; + + if (massIncident == aProton->GetPDGMass()) + { + if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 25) { + + sigma = protonL2DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > protonL2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + + else if (massIncident == aAlpha->GetPDGMass()) + { + if (energyIncident > 0.2*MeV && energyIncident < 40.*MeV && zTarget < 93 && zTarget > 25) { + + sigma = alphaL2DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > alphaL2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else + { + sigma = 0.; + } + } +} + // sigma is in internal units: it has been converted from + // the input file in barns bt the EmDataset + return sigma; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrLixsModel::CalculateL3CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident) +{ + G4Proton* aProton = G4Proton::Proton(); + G4Alpha* aAlpha = G4Alpha::Alpha(); + G4double sigma = 0; + + if (massIncident == aProton->GetPDGMass()) + { + if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 25) { + + sigma = protonL3DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > protonL3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + } + + else if (massIncident == aAlpha->GetPDGMass()) + { + if (energyIncident > 0.2*MeV && energyIncident < 40.*MeV && zTarget < 93 && zTarget > 25) { + + sigma = alphaL3DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > alphaL3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + } + + else + { + sigma = 0.; + } + + + // sigma is in internal units: it has been converted from + // the input file in barns bt the EmDataset + return sigma; +} diff --git a/source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrMixsModel.cc b/source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrMixsModel.cc new file mode 100644 index 0000000000..2b4e64acee --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/src/G4ANSTOecpssrMixsModel.cc @@ -0,0 +1,323 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// History: +// ----------- +// 10 Nov 2021 S. Guatelli & S. Bakr, Wollongong University - 1st implementation +// +// Class description +// ---------------- +// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas +// Based on the work of +// - S. Bakr et al. (2021) NIM B, 507:11–19. +// - S. Bakr et al (2018), NIMB B, 436: 285-291. +// --------------------------------------------------------------------------------------- + +#include +#include + +#include "globals.hh" +#include "G4ios.hh" +#include "G4SystemOfUnits.hh" + +#include "G4EMDataSet.hh" +#include "G4LinInterpolation.hh" +#include "G4Proton.hh" +#include "G4Alpha.hh" + +#include "G4ANSTOecpssrMixsModel.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4ANSTOecpssrMixsModel::G4ANSTOecpssrMixsModel() +{ + G4cout << "Using ANSTO M Cross Sections! "<< G4endl; + + interpolation = new G4LinInterpolation(); + + for (G4int i=67; i<93; i++) + { + protonM1DataSetMap[i] = new G4EMDataSet(i,interpolation); + protonM1DataSetMap[i]->LoadData("pixe_ANSTO/proton/m1-"); + + protonM2DataSetMap[i] = new G4EMDataSet(i,interpolation); + protonM2DataSetMap[i]->LoadData("pixe_ANSTO/proton/m2-"); + + protonM3DataSetMap[i] = new G4EMDataSet(i,interpolation); + protonM3DataSetMap[i]->LoadData("pixe_ANSTO/proton/m3-"); + + protonM4DataSetMap[i] = new G4EMDataSet(i,interpolation); + protonM4DataSetMap[i]->LoadData("pixe_ANSTO/proton/m4-"); + + protonM5DataSetMap[i] = new G4EMDataSet(i,interpolation); + protonM5DataSetMap[i]->LoadData("pixe_ANSTO/proton/m5-"); + } + + protonMiXsVector.push_back(protonM1DataSetMap); + protonMiXsVector.push_back(protonM2DataSetMap); + protonMiXsVector.push_back(protonM3DataSetMap); + protonMiXsVector.push_back(protonM4DataSetMap); + protonMiXsVector.push_back(protonM5DataSetMap); + + + for (G4int i=67; i<93; i++) + { + alphaM1DataSetMap[i] = new G4EMDataSet(i,interpolation); + alphaM1DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m1-"); + + alphaM2DataSetMap[i] = new G4EMDataSet(i,interpolation); + alphaM2DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m2-"); + + alphaM3DataSetMap[i] = new G4EMDataSet(i,interpolation); + alphaM3DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m3-"); + + alphaM4DataSetMap[i] = new G4EMDataSet(i,interpolation); + alphaM4DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m4-"); + + alphaM5DataSetMap[i] = new G4EMDataSet(i,interpolation); + alphaM5DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m5-"); + } + + alphaMiXsVector.push_back(alphaM1DataSetMap); + alphaMiXsVector.push_back(alphaM2DataSetMap); + alphaMiXsVector.push_back(alphaM3DataSetMap); + alphaMiXsVector.push_back(alphaM4DataSetMap); + alphaMiXsVector.push_back(alphaM5DataSetMap); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4ANSTOecpssrMixsModel::~G4ANSTOecpssrMixsModel() +{ + protonM1DataSetMap.clear(); + alphaM1DataSetMap.clear(); + + protonM2DataSetMap.clear(); + alphaM2DataSetMap.clear(); + + protonM3DataSetMap.clear(); + alphaM3DataSetMap.clear(); + + protonM4DataSetMap.clear(); + alphaM4DataSetMap.clear(); + + protonM5DataSetMap.clear(); + alphaM5DataSetMap.clear(); + + delete interpolation; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrMixsModel::CalculateMiCrossSection(G4int zTarget,G4double massIncident, G4double energyIncident, G4int mShellId) +{ + G4Proton* aProton = G4Proton::Proton(); + G4Alpha* aAlpha = G4Alpha::Alpha(); + G4double sigma = 0; + G4int mShellIndex = mShellId -1; + + if (massIncident == aProton->GetPDGMass()) + { + if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 66) { + + sigma = protonMiXsVector[mShellIndex][zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > protonMiXsVector[mShellIndex][zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + } + + else if (massIncident == aAlpha->GetPDGMass()) + { + if (energyIncident > 0.2*MeV && energyIncident < 10.*MeV && zTarget < 93 && zTarget > 66) { + + sigma = alphaMiXsVector[mShellIndex][zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > alphaMiXsVector[mShellIndex][zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + } + + else + { + sigma = 0.; + } + + + // sigma is in internal units: it has been converted from + // the input file in barns bt the EmDataset + return sigma; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrMixsModel::CalculateM1CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident) +{ + + // mShellId + return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 1); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrMixsModel::CalculateM2CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident) +{ + + // mShellId + return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 2); + + /* + + G4Proton* aProton = G4Proton::Proton(); + G4Alpha* aAlpha = G4Alpha::Alpha(); + G4double sigma = 0; + + if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) { + + if (massIncident == aProton->GetPDGMass()) + { + sigma = protonM2DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > protonM2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else if (massIncident == aAlpha->GetPDGMass()) + { + sigma = alphaM2DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > alphaM2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else + { + sigma = 0.; + } + } + + // sigma is in internal units: it has been converted from + // the input file in barns bt the EmDataset + return sigma; + */ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrMixsModel::CalculateM3CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident) +{ + + return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 3); + /* + + + G4Proton* aProton = G4Proton::Proton(); + G4Alpha* aAlpha = G4Alpha::Alpha(); + G4double sigma = 0; + + if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) { + + if (massIncident == aProton->GetPDGMass()) + { + sigma = protonM3DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > protonM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else if (massIncident == aAlpha->GetPDGMass()) + { + sigma = alphaM3DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > alphaM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else + { + sigma = 0.; + } + } + + // sigma is in internal units: it has been converted from + // the input file in barns bt the EmDataset + return sigma; + */ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrMixsModel::CalculateM4CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident) +{ + + return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 4); + /* + G4Proton* aProton = G4Proton::Proton(); + G4Alpha* aAlpha = G4Alpha::Alpha(); + G4double sigma = 0; + + if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) { + + if (massIncident == aProton->GetPDGMass()) + { + sigma = protonM3DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > protonM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else if (massIncident == aAlpha->GetPDGMass()) + { + sigma = alphaM3DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > alphaM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else + { + sigma = 0.; + } + } + + // sigma is in internal units: it has been converted from + // the input file in barns bt the EmDataset + return sigma; + */ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double G4ANSTOecpssrMixsModel::CalculateM5CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident) +{ + + return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 5); + /* + G4Proton* aProton = G4Proton::Proton(); + G4Alpha* aAlpha = G4Alpha::Alpha(); + G4double sigma = 0; + + if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) { + + if (massIncident == aProton->GetPDGMass()) + { + sigma = protonM3DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > protonM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else if (massIncident == aAlpha->GetPDGMass()) + { + sigma = alphaM3DataSetMap[zTarget]->FindValue(energyIncident/MeV); + if (sigma !=0 && energyIncident > alphaM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.; + } + else + { + sigma = 0.; + } + } + + // sigma is in internal units: it has been converted from + // the input file in barns bt the EmDataset + return sigma; + */ +} diff --git a/source/processes/electromagnetic/lowenergy/src/G4AtomicTransitionManager.cc b/source/processes/electromagnetic/lowenergy/src/G4AtomicTransitionManager.cc index ff322aff01..ada95a9043 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4AtomicTransitionManager.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4AtomicTransitionManager.cc @@ -283,8 +283,12 @@ void G4AtomicTransitionManager::Initialise() isInitialized = true; // Selection of fluorescence files - G4String fluoDirectory = (G4EmParameters::Instance()->BeardenFluoDir()? + + G4String fluoDirectory = "/fluor"; + + fluoDirectory = (G4EmParameters::Instance()->BeardenFluoDir()? "/fluor_Bearden":"/fluor"); + // infTableLimit is initialized to 6 because EADL lacks data for Z<=5 G4ShellData* shellManager = new G4ShellData; shellManager->LoadData(fluoDirectory+"/binding"); @@ -292,15 +296,23 @@ void G4AtomicTransitionManager::Initialise() // initialization of the data for auger effect augerData = new G4AugerData; + if (G4EmParameters::Instance()->ANSTOFluoDir()) + { + fluoDirectory = "/fluor_ANSTO"; + G4cout << "The ANSTO fluorescence radiation yields substitute the EADL data libraries" << G4endl; + } // Fills shellTable with the data from EADL, identities and binding // energies of shells for (G4int Z = zMin; Z<= zMax; ++Z) { + + if ((Z > 92) && (G4EmParameters::Instance()->ANSTOFluoDir())) fluoDirectory ="/fluor"; + std::vector vectorOfShells; size_t shellIndex = 0; size_t numberOfShells = shellManager->NumberOfShells(Z); - // G4cout << "For Z= " << Z << " " << numberOfShells << " shells" << G4endl; + // G4cout << fluoDirectory <<" For Z= " << Z << " " << numberOfShells << " shells" << G4endl; for (shellIndex = 0; shellIndexShellId(Z,shellIndex); @@ -315,8 +327,12 @@ void G4AtomicTransitionManager::Initialise() // Fills transitionTable with the data from EADL, identities, transition // energies and transition probabilities + if (G4EmParameters::Instance()->ANSTOFluoDir()) fluoDirectory = "/fluor_ANSTO"; + + for (G4int Znum= infTableLimit; Znum<=supTableLimit; ++Znum) { + if ((Znum > 92) && (G4EmParameters::Instance()->ANSTOFluoDir())) fluoDirectory ="/fluor"; G4FluoData* fluoManager = new G4FluoData(fluoDirectory); std::vector vectorOfTransitions; fluoManager->LoadData(Znum); diff --git a/source/processes/electromagnetic/lowenergy/src/G4AugerData.cc b/source/processes/electromagnetic/lowenergy/src/G4AugerData.cc index f7cbce7d30..89af39f109 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4AugerData.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4AugerData.cc @@ -26,7 +26,7 @@ // // // -// Author: Alfonso Mmantero (Alfonso.Mantero@ge.infn.it) +// Author: Alfonso Mantero (Alfonso.Mantero@ge.infn.it) // // History: // ----------- @@ -407,27 +407,7 @@ std::vector G4AugerData::LoadData(G4int Z) void G4AugerData::BuildAugerTransitionTable() { - const G4MaterialTable* materialTable = G4Material::GetMaterialTable(); - - G4int nMaterials = G4Material::GetNumberOfMaterials(); - - G4DataVector activeZ; - activeZ.clear(); - - for (G4int mLocal=0; mLocalGetElementVector(); - const size_t nElements = material->GetNumberOfElements(); - - for (size_t iEl=0; iElGetZ(); - if (!(activeZ.contains(Z))) { - activeZ.push_back(Z); - } - } - } - for (G4int element = 6; element < 100; element++) + for (G4int element = 6; element < 100; ++element) { augerTransitionTable.insert(trans_Table::value_type(element,LoadData(element))); } diff --git a/source/processes/electromagnetic/lowenergy/src/G4FluoData.cc b/source/processes/electromagnetic/lowenergy/src/G4FluoData.cc index ff3adae949..e5dd5005bc 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4FluoData.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4FluoData.cc @@ -40,7 +40,6 @@ #include "G4SystemOfUnits.hh" #include "G4DataVector.hh" #include "G4FluoTransition.hh" - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4FluoData::G4FluoData(const G4String& dir) { @@ -213,6 +212,7 @@ void G4FluoData::LoadData(G4int Z) ost << "/fl-tr-pr-"<<".dat"; } G4String name(ost.str()); + char* path = std::getenv("G4LEDATA"); if (!path) @@ -223,7 +223,12 @@ void G4FluoData::LoadData(G4int Z) } G4String pathString(path); + G4String dirFile = pathString + fluoDirectory + name; + + //G4cout << "G4FluoData:: LoadData() name: " << dirFile << G4endl; + + std::ifstream file(dirFile); std::filebuf* lsdp = file.rdbuf(); diff --git a/source/processes/electromagnetic/lowenergy/src/G4JAEAElasticScatteringModel.cc b/source/processes/electromagnetic/lowenergy/src/G4JAEAElasticScatteringModel.cc index ce7fe50220..530f2303b8 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4JAEAElasticScatteringModel.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4JAEAElasticScatteringModel.cc @@ -217,7 +217,7 @@ void G4JAEAElasticScatteringModel::ReadData(size_t Z, const char* path) dataCS[Z] = new G4PhysicsFreeVector(300,0.01,3.,/*spine=*/true); //Note that the total cross section and energy are converted to the internal units. for (G4int i=0;i<300;++i) - dataCS[Z]->PutValue(i,10.*i*1e-3,ES_Data[Z]->at(i)*1e-22); + dataCS[Z]->PutValues(i,10.*i*1e-3,ES_Data[Z]->at(i)*1e-22); // Activation of spline interpolation dataCS[Z] ->FillSecondDerivatives(); diff --git a/source/processes/electromagnetic/lowenergy/src/G4JAEAPolarizedElasticScatteringModel.cc b/source/processes/electromagnetic/lowenergy/src/G4JAEAPolarizedElasticScatteringModel.cc index c7e6f99e08..2072524e7d 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4JAEAPolarizedElasticScatteringModel.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4JAEAPolarizedElasticScatteringModel.cc @@ -201,7 +201,7 @@ void G4JAEAPolarizedElasticScatteringModel::ReadData(size_t Z, const char* path) dataCS[Z] = new G4PhysicsFreeVector(300,0.01,3.,/*spline=*/true); for (G4int i=0;i<300;++i) - dataCS[Z]->PutValue(i,10.*i*1e-3,Polarized_ES_Data[Z]->at(i)*1e-22); + dataCS[Z]->PutValues(i,10.*i*1e-3,Polarized_ES_Data[Z]->at(i)*1e-22); // Activation of spline interpolation dataCS[Z] ->FillSecondDerivatives(); diff --git a/source/processes/electromagnetic/lowenergy/src/G4LivermoreComptonModel.cc b/source/processes/electromagnetic/lowenergy/src/G4LivermoreComptonModel.cc index c3a06cd052..6c76e659f8 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4LivermoreComptonModel.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4LivermoreComptonModel.cc @@ -67,7 +67,7 @@ static const G4double ln10 = G4Log(10.); G4LivermoreComptonModel::G4LivermoreComptonModel(const G4ParticleDefinition*, const G4String& nam) - : G4VEmModel(nam),isInitialised(false) + : G4VEmModel(nam),maxZ(100),isInitialised(false) { verboseLevel=1 ; // Verbosity scale: @@ -91,16 +91,19 @@ G4LivermoreComptonModel::G4LivermoreComptonModel(const G4ParticleDefinition*, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4LivermoreComptonModel::~G4LivermoreComptonModel() -{ - if(IsMaster()) { +{ + if(IsMaster()) + { delete shellData; shellData = nullptr; delete profileData; profileData = nullptr; - for(G4int i=0; iGetTableSize(); - - for(G4int i=0; iGetMaterialCutsCouple(i)->GetMaterial(); - const G4ElementVector* theElementVector = material->GetElementVector(); - G4int nelm = material->GetNumberOfElements(); - - for (G4int j=0; jGetZ()); - if(Z < 1) { Z = 1; } - else if(Z > maxZ){ Z = maxZ; } + const G4ElementTable* elemTable = G4Element::GetElementTable(); + size_t numElems = (*elemTable).size(); + for(size_t ie = 0; ie < numElems; ++ie) + { + const G4Element* elem = (*elemTable)[ie]; + const G4int Z = std::min(maxZ, elem->GetZasInt()); - if( (!data[Z]) ) { ReadData(Z, path); } + if(data[Z] == nullptr) + { + ReadData(Z, path); } } // For Doppler broadening - if(!shellData) { + if(shellData == nullptr) { shellData = new G4ShellData(); shellData->SetOccupancyData(); G4String file = "/doppler/shell-doppler"; shellData->LoadData(file); } - if(!profileData) { profileData = new G4DopplerProfile(); } + if(profileData == nullptr) { profileData = new G4DopplerProfile(); } InitialiseElementSelectors(particle, cuts); } @@ -187,12 +184,12 @@ void G4LivermoreComptonModel::ReadData(size_t Z, const char* path) G4cout << "G4LivermoreComptonModel::ReadData()" << G4endl; } - if(data[Z]) { return; } + if(data[Z] != nullptr) { return; } const char* datadir = path; - if(!datadir) + if(datadir == nullptr) { datadir = std::getenv("G4LEDATA"); - if(!datadir) + if(datadir == nullptr) { G4Exception("G4LivermoreComptonModel::ReadData()", "em0006",FatalException, @@ -204,7 +201,12 @@ void G4LivermoreComptonModel::ReadData(size_t Z, const char* path) data[Z] = new G4PhysicsFreeVector(); std::ostringstream ost; - ost << datadir << "/livermore/comp/ce-cs-" << Z <<".dat"; + if(G4EmParameters::Instance()->LivermoreDataDir() == "livermore"){ + ost << datadir << "/livermore/comp/ce-cs-" << Z <<".dat"; + }else{ + ost << datadir << "/epics2017/comp/ce-cs-" << Z <<".dat"; + } + std::ifstream fin(ost.str().c_str()); if( !fin.is_open()) @@ -250,11 +252,11 @@ G4LivermoreComptonModel::ComputeCrossSectionPerAtom(const G4ParticleDefinition*, // if element was not initialised // do initialisation safely for MT mode - if(!pv) + if(pv == nullptr) { InitialiseForElement(0, intZ); pv = data[intZ]; - if(!pv) { return cs; } + if(pv == nullptr) { return cs; } } G4int n = pv->GetVectorLength() - 1; @@ -514,31 +516,45 @@ void G4LivermoreComptonModel::SampleSecondaries( } //This should never happen if(bindingE < 0.0) - G4Exception("G4LivermoreComptonModel::SampleSecondaries()", - "em2050",FatalException,"Negative local energy deposit"); + G4Exception("G4LivermoreComptonModel::SampleSecondaries()", "em2050", + FatalException, "Negative local energy deposit"); fParticleChange->ProposeLocalEnergyDeposit(bindingE); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4double +G4double G4LivermoreComptonModel::ComputeScatteringFunction(G4double x, G4int Z) { G4double value = Z; - if (x <= ScatFuncFitParam[Z][2]) { + if(x <= ScatFuncFitParam[Z][3]) + { + G4double lgq = G4Log(x) / ln10; - G4double lgq = G4Log(x)/ln10; - - if (lgq < ScatFuncFitParam[Z][1]) { - value = ScatFuncFitParam[Z][3] + lgq*ScatFuncFitParam[Z][4]; - } else { - value = ScatFuncFitParam[Z][5] + lgq*ScatFuncFitParam[Z][6] + - lgq*lgq*ScatFuncFitParam[Z][7] + lgq*lgq*lgq*ScatFuncFitParam[Z][8]; + if(lgq < ScatFuncFitParam[Z][1]) + { + value = ScatFuncFitParam[Z][4] + lgq * ScatFuncFitParam[Z][5]; } - value = G4Exp(value*ln10); + else if(lgq >= ScatFuncFitParam[Z][1] && lgq < ScatFuncFitParam[Z][2]) + { + value = ScatFuncFitParam[Z][6] + + lgq * (ScatFuncFitParam[Z][7] + + lgq * (ScatFuncFitParam[Z][8] + + lgq * (ScatFuncFitParam[Z][9] + + lgq * ScatFuncFitParam[Z][10]))); + } + else + { + value = ScatFuncFitParam[Z][11] + + lgq * (ScatFuncFitParam[Z][12] + + lgq * (ScatFuncFitParam[Z][13] + + lgq * (ScatFuncFitParam[Z][14] + + lgq * ScatFuncFitParam[Z][15]))); + } + value = G4Exp(value * ln10); } - //G4cout << " value= " << value << G4endl; + // G4cout << " value= " << value << G4endl; return value; } @@ -549,113 +565,114 @@ G4LivermoreComptonModel::InitialiseForElement(const G4ParticleDefinition*, G4int Z) { G4AutoLock l(&LivermoreComptonModelMutex); - if(!data[Z]) { ReadData(Z); } + if(data[Z] == nullptr) { ReadData(Z); } l.unlock(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//Fitting data to compute scattering function -const G4double G4LivermoreComptonModel::ScatFuncFitParam[101][9] = { -{ 0, 0., 0., 0., 0., 0., 0., 0., 0.}, -{ 1, 6.673, 1.49968E+08, -14.352, 1.999, -143.374, 50.787, -5.951, 0.2304418}, -{ 2, 6.500, 2.50035E+08, -14.215, 1.970, -53.649, 13.892, -0.948, 0.006996759}, -{ 3, 6.551, 3.99945E+08, -13.555, 1.993, -62.090, 21.462, -2.453, 0.093416}, -{ 4, 6.500, 5.00035E+08, -13.746, 1.998, -127.906, 46.491, -5.614, 0.2262103}, -{ 5, 6.500, 5.99791E+08, -13.800, 1.998, -131.153, 47.132, -5.619, 0.2233819}, -{ 6, 6.708, 6.99842E+08, -13.885, 1.999, -128.143, 45.379, -5.325, 0.2083009}, -{ 7, 6.685, 7.99834E+08, -13.885, 2.000, -131.048, 46.314, -5.421, 0.2114925}, -{ 8, 6.669, 7.99834E+08, -13.962, 2.001, -128.225, 44.818, -5.183, 0.1997155}, -{ 9, 6.711, 7.99834E+08, -13.999, 2.000, -122.112, 42.103, -4.796, 0.1819099}, -{ 10, 6.702, 7.99834E+08, -14.044, 1.999, -110.143, 37.225, -4.143, 0.1532094}, -{ 11, 6.425, 1.00000E+09, -13.423, 1.993, -41.137, 12.313, -1.152, 0.03384553}, -{ 12, 6.542, 1.00000E+09, -13.389, 1.997, -53.549, 17.420, -1.840, 0.06431849}, -{ 13, 6.570, 1.49968E+09, -13.401, 1.997, -66.243, 22.297, -2.460, 0.09045854}, -{ 14, 6.364, 1.49968E+09, -13.452, 1.999, -78.271, 26.757, -3.008, 0.1128195}, -{ 15, 6.500, 1.49968E+09, -13.488, 1.998, -85.069, 29.164, -3.291, 0.1239113}, -{ 16, 6.500, 1.49968E+09, -13.532, 1.998, -93.640, 32.274, -3.665, 0.1388633}, -{ 17, 6.500, 1.49968E+09, -13.584, 2.000, -98.534, 33.958, -3.857, 0.1461557}, -{ 18, 6.500, 1.49968E+09, -13.618, 1.999, -100.077, 34.379, -3.891, 0.1468902}, -{ 19, 6.500, 1.99986E+09, -13.185, 1.992, -53.819, 17.528, -1.851, 0.0648722}, -{ 20, 6.490, 1.99986E+09, -13.123, 1.993, -52.221, 17.169, -1.832, 0.06502094}, -{ 21, 6.498, 1.99986E+09, -13.157, 1.994, -55.365, 18.276, -1.961, 0.07002778}, -{ 22, 6.495, 1.99986E+09, -13.183, 1.994, -57.412, 18.957, -2.036, 0.07278856}, -{ 23, 6.487, 1.99986E+09, -13.216, 1.995, -58.478, 19.270, -2.065, 0.07362722}, -{ 24, 6.500, 1.99986E+09, -13.330, 1.997, -62.192, 20.358, -2.167, 0.07666583}, -{ 25, 6.488, 1.99986E+09, -13.277, 1.997, -58.007, 18.924, -2.003, 0.0704305}, -{ 26, 6.500, 5.00035E+09, -13.292, 1.997, -61.176, 20.067, -2.141, 0.0760269}, -{ 27, 6.500, 5.00035E+09, -13.321, 1.998, -61.909, 20.271, -2.159, 0.07653559}, -{ 28, 6.500, 5.00035E+09, -13.340, 1.998, -62.402, 20.391, -2.167, 0.07664243}, -{ 29, 6.500, 5.00035E+09, -13.439, 1.998, -67.305, 21.954, -2.331, 0.0823267}, -{ 30, 6.500, 5.00035E+09, -13.383, 1.999, -62.064, 20.136, -2.122, 0.07437589}, -{ 31, 6.500, 5.00035E+09, -13.349, 1.997, -61.068, 19.808, -2.086, 0.07307488}, -{ 32, 6.500, 5.00035E+09, -13.373, 1.999, -63.126, 20.553, -2.175, 0.07660222}, -{ 33, 6.500, 5.00035E+09, -13.395, 1.999, -65.674, 21.445, -2.278, 0.08054694}, -{ 34, 6.500, 5.00035E+09, -13.417, 1.999, -69.457, 22.811, -2.442, 0.08709536}, -{ 35, 6.500, 5.00035E+09, -13.442, 2.000, -72.283, 23.808, -2.558, 0.09156808}, -{ 36, 6.500, 5.00035E+09, -13.451, 1.998, -74.696, 24.641, -2.653, 0.09516597}, -{ 37, 6.500, 5.00035E+09, -13.082, 1.991, -46.235, 14.519, -1.458, 0.04837659}, -{ 38, 6.465, 5.00035E+09, -13.022, 1.993, -41.784, 13.065, -1.300, 0.04267703}, -{ 39, 6.492, 5.00035E+09, -13.043, 1.994, -44.609, 14.114, -1.429, 0.0479348}, -{ 40, 6.499, 5.00035E+09, -13.064, 1.994, -47.142, 15.019, -1.536, 0.0521347}, -{ 41, 6.384, 5.00035E+09, -13.156, 1.996, -53.114, 17.052, -1.766, 0.06079426}, -{ 42, 6.500, 5.00035E+09, -13.176, 1.996, -54.590, 17.550, -1.822, 0.06290335}, -{ 43, 6.500, 5.00035E+09, -13.133, 1.997, -51.272, 16.423, -1.694, 0.05806108}, -{ 44, 6.500, 5.00035E+09, -13.220, 1.996, -58.314, 18.839, -1.969, 0.0684608}, -{ 45, 6.500, 5.00035E+09, -13.246, 1.998, -59.674, 19.295, -2.020, 0.07037294}, -{ 46, 6.500, 5.00035E+09, -13.407, 1.999, -72.228, 23.693, -2.532, 0.09017969}, -{ 47, 6.500, 5.00035E+09, -13.277, 1.998, -60.890, 19.647, -2.053, 0.07138694}, -{ 48, 6.500, 5.00035E+09, -13.222, 1.998, -56.152, 18.002, -1.863, 0.06410123}, -{ 49, 6.500, 5.00035E+09, -13.199, 1.997, -56.208, 18.052, -1.872, 0.06456884}, -{ 50, 6.500, 5.00035E+09, -13.215, 1.998, -58.478, 18.887, -1.973, 0.06860356}, -{ 51, 6.500, 5.00035E+09, -13.230, 1.998, -60.708, 19.676, -2.066, 0.07225841}, -{ 52, 6.500, 7.99834E+09, -13.246, 1.998, -63.341, 20.632, -2.180, 0.0767412}, -{ 53, 6.500, 5.00035E+09, -13.262, 1.998, -66.339, 21.716, -2.310, 0.08191981}, -{ 54, 6.500, 7.99834E+09, -13.279, 1.998, -67.649, 22.151, -2.357, 0.08357825}, -{ 55, 6.500, 5.00035E+09, -12.951, 1.990, -45.302, 14.219, -1.423, 0.04712317}, -{ 56, 6.425, 5.00035E+09, -12.882, 1.992, -39.825, 12.363, -1.214, 0.03931009}, -{ 57, 6.466, 2.82488E+09, -12.903, 1.992, -38.952, 11.982, -1.160, 0.03681554}, -{ 58, 6.451, 5.00035E+09, -12.915, 1.993, -41.959, 13.118, -1.302, 0.04271291}, -{ 59, 6.434, 5.00035E+09, -12.914, 1.993, -40.528, 12.555, -1.230, 0.03971407}, -{ 60, 6.444, 5.00035E+09, -12.922, 1.992, -39.986, 12.329, -1.200, 0.03843737}, -{ 61, 6.414, 7.99834E+09, -12.930, 1.993, -42.756, 13.362, -1.327, 0.0436124}, -{ 62, 6.420, 7.99834E+09, -12.938, 1.992, -42.682, 13.314, -1.319, 0.04322509}, -{ 63, 6.416, 7.99834E+09, -12.946, 1.993, -42.399, 13.185, -1.301, 0.04243861}, -{ 64, 6.443, 7.99834E+09, -12.963, 1.993, -43.226, 13.475, -1.335, 0.04377341}, -{ 65, 6.449, 7.99834E+09, -12.973, 1.993, -43.232, 13.456, -1.330, 0.04347536}, -{ 66, 6.419, 7.99834E+09, -12.966, 1.993, -42.047, 12.990, -1.270, 0.04095499}, -{ 67, 6.406, 7.99834E+09, -12.976, 1.993, -42.405, 13.106, -1.283, 0.04146024}, -{ 68, 6.424, 7.99834E+09, -12.986, 1.993, -41.974, 12.926, -1.259, 0.040435}, -{ 69, 6.417, 7.99834E+09, -12.989, 1.993, -42.132, 12.967, -1.262, 0.04048908}, -{ 70, 6.405, 7.99834E+09, -13.000, 1.994, -42.582, 13.122, -1.280, 0.04119599}, -{ 71, 6.449, 7.99834E+09, -13.015, 1.994, -42.586, 13.115, -1.278, 0.04107587}, -{ 72, 6.465, 7.99834E+09, -13.030, 1.994, -43.708, 13.509, -1.324, 0.04286491}, -{ 73, 6.447, 7.99834E+09, -13.048, 1.996, -44.838, 13.902, -1.369, 0.04457132}, -{ 74, 6.452, 7.99834E+09, -13.073, 1.997, -45.545, 14.137, -1.395, 0.04553459}, -{ 75, 6.432, 7.99834E+09, -13.082, 1.997, -46.426, 14.431, -1.428, 0.04678218}, -{ 76, 6.439, 7.99834E+09, -13.100, 1.997, -47.513, 14.806, -1.471, 0.04842566}, -{ 77, 6.432, 7.99834E+09, -13.110, 1.997, -48.225, 15.042, -1.497, 0.04938364}, -{ 78, 6.500, 7.99834E+09, -13.185, 1.997, -53.256, 16.739, -1.687, 0.05645173}, -{ 79, 6.500, 7.99834E+09, -13.200, 1.997, -53.900, 16.946, -1.709, 0.05723134}, -{ 80, 6.500, 7.99834E+09, -13.156, 1.998, -49.801, 15.536, -1.547, 0.05103522}, -{ 81, 6.500, 7.99834E+09, -13.128, 1.997, -49.651, 15.512, -1.548, 0.05123203}, -{ 82, 6.500, 7.99834E+09, -13.134, 1.997, -51.021, 16.018, -1.609, 0.05364831}, -{ 83, 6.500, 7.99834E+09, -13.148, 1.998, -52.693, 16.612, -1.679, 0.05638698}, -{ 84, 6.500, 7.99834E+09, -13.161, 1.998, -54.415, 17.238, -1.754, 0.05935566}, -{ 85, 6.500, 7.99834E+09, -13.175, 1.998, -56.083, 17.834, -1.824, 0.06206068}, -{ 86, 6.500, 7.99834E+09, -13.189, 1.998, -57.860, 18.463, -1.898, 0.0649633}, -{ 87, 6.500, 7.99834E+09, -12.885, 1.990, -39.973, 12.164, -1.162, 0.0364598}, -{ 88, 6.417, 7.99834E+09, -12.816, 1.991, -34.591, 10.338, -0.956, 0.0287409}, -{ 89, 6.442, 7.99834E+09, -12.831, 1.992, -36.002, 10.867, -1.021, 0.03136835}, -{ 90, 6.463, 7.99834E+09, -12.850, 1.993, -37.660, 11.475, -1.095, 0.03435334}, -{ 91, 6.447, 7.99834E+09, -12.852, 1.993, -37.268, 11.301, -1.071, 0.0330539}, -{ 92, 6.439, 7.99834E+09, -12.858, 1.993, -37.695, 11.438, -1.085, 0.03376669}, -{ 93, 6.437, 1.00000E+10, -12.866, 1.993, -39.010, 11.927, -1.146, 0.03630848}, -{ 94, 6.432, 7.99834E+09, -12.862, 1.993, -37.192, 11.229, -1.057, 0.0325621}, -{ 95, 6.435, 7.99834E+09, -12.869, 1.993, -37.589, 11.363, -1.072, 0.03312393}, -{ 96, 6.449, 1.00000E+10, -12.886, 1.993, -39.573, 12.095, -1.162, 0.03680527}, -{ 97, 6.446, 1.00000E+10, -12.892, 1.993, -40.007, 12.242, -1.178, 0.03737377}, -{ 98, 6.421, 1.00000E+10, -12.887, 1.993, -39.509, 12.041, -1.152, 0.03629023}, -{ 99, 6.414, 1.00000E+10, -12.894, 1.993, -39.939, 12.183, -1.168, 0.03690464}, -{100, 6.412, 1.00000E+10, -12.900, 1.993, -39.973, 12.180, -1.166, 0.036773} - }; +//Fitting data to compute scattering function based on EPICS2017 +const G4double G4LivermoreComptonModel::ScatFuncFitParam[101][16] = { + {0, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, + {1, 6.000000000e+00, 7.087999300e+00, 1.499680000e+08, -1.435559123e+01, 2.000000043e+00, -3.925518125e+02, 2.434944521e+02, -5.784393623e+01, 6.160181204e+00, -2.461326602e-01, -1.649463594e+03, 8.121933215e+02, -1.498313316e+02, 1.227279742e+01, -3.765996345e-01}, + {2, 6.000000000e+00, 7.199000403e+00, 2.500350000e+08, -1.430103027e+01, 2.000000041e+00, 3.574019365e+02, -1.978574937e+02, 3.971327838e+01, -3.443224867e+00, 1.091825227e-01, -4.009960832e+02, 1.575831469e+02, -2.174763446e+01, 1.185163045e+00, -1.814503741e-02}, + {3, 6.000000000e+00, 7.301000136e+00, 3.999450000e+08, -1.357675458e+01, 2.000000074e+00, 7.051635443e+02, -4.223841786e+02, 9.318729225e+01, -9.002642767e+00, 3.220625771e-01, 1.524679907e+03, -7.851479582e+02, 1.509941052e+02, -1.285477984e+01, 4.089348830e-01}, + {4, 6.000000000e+00, 7.349500202e+00, 5.000350000e+08, -1.375202671e+01, 1.999999994e+00, -1.832909604e+02, 1.193997722e+02, -3.034328318e+01, 3.471545044e+00, -1.484222463e-01, 1.397476657e+03, -7.026416933e+02, 1.320720559e+02, -1.099824430e+01, 3.424610532e-01}, + {5, 6.000000000e+00, 7.388999972e+00, 5.997910000e+08, -1.380548571e+01, 2.000000004e+00, -2.334197545e+02, 1.467013466e+02, -3.574851109e+01, 3.925047955e+00, -1.616186492e-01, 6.784713308e+02, -3.419562074e+02, 6.433945831e+01, -5.354244209e+00, 1.663784966e-01}, + {6, 6.000000000e+00, 7.422500001e+00, 6.998420000e+08, -1.388639003e+01, 1.999999863e+00, -2.460254935e+02, 1.516613633e+02, -3.622024219e+01, 3.900099543e+00, -1.576557530e-01, -1.610185428e+02, 7.010907070e+01, -1.142375397e+01, 8.303365180e-01, -2.273786010e-02}, + {7, 6.000000000e+00, 7.451499931e+00, 7.998340000e+08, -1.388605429e+01, 1.999999612e+00, -3.054540719e+02, 1.877740247e+02, -4.440273010e+01, 4.718886370e+00, -1.881615004e-01, -2.263864349e+02, 1.017885461e+02, -1.716982752e+01, 1.292954622e+00, -3.668301946e-02}, + {8, 6.000000000e+00, 7.451499931e+00, 7.998340000e+08, -1.395860675e+01, 1.999999906e+00, -3.877174895e+02, 2.345831969e+02, -5.431822300e+01, 5.643262324e+00, -2.200840540e-01, -7.949384302e+02, 3.757293602e+02, -6.661741851e+01, 5.256265086e+00, -1.556986777e-01}, + {9, 6.000000000e+00, 7.451499931e+00, 7.998340000e+08, -1.400000063e+01, 2.000000106e+00, -2.939854827e+02, 1.784214589e+02, -4.168473845e+01, 4.377669850e+00, -1.724300716e-01, -1.169326170e+03, 5.545642014e+02, -9.863024948e+01, 7.801721240e+00, -2.315522357e-01}, + {10, 6.000000000e+00, 7.451499931e+00, 7.998340000e+08, -1.404575854e+01, 2.000000178e+00, -2.615701853e+02, 1.582596311e+02, -3.698114811e+01, 3.889093901e+00, -1.533613504e-01, -1.275287356e+03, 6.022076554e+02, -1.066410301e+02, 8.398773148e+00, -2.481899800e-01}, + {11, 6.000000000e+00, 7.500000000e+00, 1.000000000e+09, -1.344369665e+01, 1.999999860e+00, 1.112662501e+03, -6.807056448e+02, 1.545837472e+02, -1.548462180e+01, 5.785425068e-01, -1.007702307e+03, 4.699937040e+02, -8.220352105e+01, 6.396099420e+00, -1.867816054e-01}, + {12, 6.000000000e+00, 7.500000000e+00, 1.000000000e+09, -1.339794047e+01, 2.000000080e+00, 9.895649717e+02, -5.983228286e+02, 1.340681576e+02, -1.323046651e+01, 4.863434994e-01, -5.790532602e+02, 2.626052403e+02, -4.463548055e+01, 3.376239891e+00, -9.588786915e-02}, + {13, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.340893585e+01, 2.000000078e+00, 7.335256091e+02, -4.405291562e+02, 9.770954287e+01, -9.519317788e+00, 3.448067237e-01, -5.328832253e+02, 2.398514938e+02, -4.044557740e+01, 3.034597500e+00, -8.547410419e-02}, + {14, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.345593195e+01, 2.000000000e+00, 3.978691889e+02, -2.370975001e+02, 5.158692183e+01, -4.884868277e+00, 1.707270518e-01, -2.340256277e+02, 9.813362251e+01, -1.527892110e+01, 1.051070768e+00, -2.692716945e-02}, + {15, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.349485049e+01, 2.000000083e+00, 2.569833671e+02, -1.513623448e+02, 3.210087153e+01, -2.925756803e+00, 9.724379436e-02, -1.345727293e+01, -6.291081167e+00, 3.235960888e+00, -4.059236666e-01, 1.601245178e-02}, + {16, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.353760159e+01, 1.999999937e+00, 1.015293074e+02, -5.721639224e+01, 1.078607152e+01, -7.890593144e-01, 1.726056327e-02, 1.854818165e+02, -1.000803879e+02, 1.979815884e+01, -1.704221744e+00, 5.413372375e-02}, + {17, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.358502705e+01, 2.000000066e+00, -4.294163461e+01, 2.862162412e+01, -8.285972104e+00, 1.087745268e+00, -5.172153610e-02, 1.676674074e+02, -8.976414784e+01, 1.763329621e+01, -1.507161653e+00, 4.753277254e-02}, + {18, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.361978902e+01, 2.000000042e+00, -3.573422746e+01, 2.403066369e+01, -7.173617800e+00, 9.657608431e-01, -4.662317662e-02, 1.811925229e+02, -9.574636323e+01, 1.861940167e+01, -1.578810247e+00, 4.946799877e-02}, + {19, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.320760816e+01, 1.999999979e+00, 1.263152069e+02, -8.738932892e+01, 2.109042182e+01, -2.166733566e+00, 8.146018979e-02, 9.183312428e+01, -5.232836676e+01, 1.072450810e+01, -9.419512971e-01, 3.023884410e-02}, + {20, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.314266674e+01, 1.999999876e+00, 6.620218058e+02, -4.057504297e+02, 9.180787767e+01, -9.124184449e+00, 3.372518137e-01, 7.034138711e+01, -4.198325416e+01, 8.861351614e+00, -7.930506530e-01, 2.578454342e-02}, + {21, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.317392498e+01, 1.999999966e+00, 6.766093786e+02, -4.129087029e+02, 9.305090790e+01, -9.212128925e+00, 3.392408033e-01, 1.916559096e+01, -1.807294109e+01, 4.677205921e+00, -4.679350245e-01, 1.632115420e-02}, + {22, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.320065945e+01, 1.999999999e+00, 6.969823082e+02, -4.236620289e+02, 9.513714106e+01, -9.388294642e+00, 3.446942719e-01, -6.501317146e+01, 2.138553133e+01, -2.250998891e+00, 7.219326079e-02, 5.467529893e-04}, + {23, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.322914744e+01, 1.999999909e+00, 6.889749928e+02, -4.181421624e+02, 9.373529727e+01, -9.233142268e+00, 3.383772151e-01, -1.382770534e+02, 5.540647456e+01, -8.170017489e+00, 5.295569200e-01, -1.269556386e-02}, + {24, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.333724128e+01, 1.999999854e+00, 4.365566411e+02, -2.672774427e+02, 6.001631369e+01, -5.895458454e+00, 2.149710735e-01, -2.393534124e+02, 1.020845165e+02, -1.624744211e+01, 1.150387566e+00, -3.057723021e-02}, + {25, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.328399669e+01, 2.000000008e+00, 6.461381990e+02, -3.918546518e+02, 8.769548644e+01, -8.618784385e+00, 3.150660827e-01, -2.597409979e+02, 1.113332866e+02, -1.782124571e+01, 1.269519197e+00, -3.396126698e-02}, + {26, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.330103000e+01, 1.999999998e+00, 4.261007401e+02, -2.588846763e+02, 5.764613910e+01, -5.609660122e+00, 2.024165636e-01, -1.982896712e+02, 8.274273985e+01, -1.284074215e+01, 8.845687432e-01, -2.282143299e-02}, + {27, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.332790165e+01, 1.999999922e+00, 4.006816638e+02, -2.439311564e+02, 5.435031497e+01, -5.287693457e+00, 1.906696163e-01, -2.205075564e+02, 9.262919772e+01, -1.448909443e+01, 1.006686819e+00, -2.621294059e-02}, + {28, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.334678710e+01, 1.999999939e+00, 3.967750019e+02, -2.411866801e+02, 5.364872608e+01, -5.210295834e+00, 1.875525119e-01, -2.516823030e+02, 1.065117131e+02, -1.680533335e+01, 1.178363534e+00, -3.098194406e-02}, + {29, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.344369664e+01, 1.999999853e+00, 2.437671888e+02, -1.499592208e+02, 3.332221026e+01, -3.206587185e+00, 1.138639692e-01, -2.874130637e+02, 1.223381969e+02, -1.943178054e+01, 1.371979484e+00, -3.633119448e-02}, + {30, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.338721562e+01, 1.999999911e+00, 3.914867984e+02, -2.378147085e+02, 5.284517777e+01, -5.126420186e+00, 1.843322562e-01, -3.235063319e+02, 1.384252948e+02, -2.211844479e+01, 1.571300198e+00, -4.187323186e-02}, + {31, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.335654643e+01, 1.999999847e+00, 4.325820127e+02, -2.614587597e+02, 5.793273998e+01, -5.611190206e+00, 2.015836827e-01, -3.359152840e+02, 1.437507638e+02, -2.297457475e+01, 1.632470701e+00, -4.351215346e-02}, + {32, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.337675047e+01, 1.999999960e+00, 4.388195965e+02, -2.642662297e+02, 5.834159168e+01, -5.629419790e+00, 2.014339673e-01, -3.430730654e+02, 1.467102631e+02, -2.343160019e+01, 1.663765504e+00, -4.431369286e-02}, + {33, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.339794046e+01, 2.000000074e+00, 3.931399547e+02, -2.363700718e+02, 5.197696913e+01, -4.987097655e+00, 1.772567576e-01, -3.501570134e+02, 1.497141578e+02, -2.390888062e+01, 1.697503580e+00, -4.520887478e-02}, + {34, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.342021680e+01, 2.000000064e+00, 3.772588127e+02, -2.256347960e+02, 4.929790851e+01, -4.694628847e+00, 1.654667382e-01, -3.481053019e+02, 1.486490112e+02, -2.370745096e+01, 1.680991482e+00, -4.471064364e-02}, + {35, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.344369666e+01, 1.999999864e+00, 3.344685842e+02, -1.994816236e+02, 4.332267376e+01, -4.090542180e+00, 1.426839031e-01, -3.227660675e+02, 1.370301996e+02, -2.171543883e+01, 1.529681552e+00, -4.041331983e-02}, + {36, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.345593194e+01, 1.999999999e+00, 3.004054446e+02, -1.781334135e+02, 3.834850324e+01, -3.580074471e+00, 1.232168921e-01, -2.980827664e+02, 1.257508661e+02, -1.978792154e+01, 1.383723149e+00, -3.628014907e-02}, + {37, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.310790583e+01, 2.000000075e+00, -3.687188343e+01, 1.054409719e+01, -8.516586814e-01, 9.339751003e-03, 8.809383936e-04, -2.699384784e+02, 1.129635316e+02, -1.761447452e+01, 1.219971043e+00, -3.166503704e-02}, + {38, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.304095795e+01, 1.999999892e+00, 1.969969064e+02, -1.286503864e+02, 3.008431767e+01, -3.031946980e+00, 1.124456346e-01, -2.331258613e+02, 9.627987243e+01, -1.478515961e+01, 1.007215642e+00, -2.567873120e-02}, + {39, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.306048023e+01, 1.999999916e+00, 2.891710763e+02, -1.819536752e+02, 4.158265841e+01, -4.128940218e+00, 1.515168697e-01, -1.997404800e+02, 8.119476676e+01, -1.223426670e+01, 8.159269666e-01, -2.031079820e-02}, + {40, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.308092198e+01, 2.000000013e+00, 3.393782172e+02, -2.103908454e+02, 4.758278737e+01, -4.688308235e+00, 1.709723418e-01, -1.549247582e+02, 6.091403935e+01, -8.799307373e+00, 5.578963961e-01, -1.305663921e-02}, + {41, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.316749062e+01, 1.999999920e+00, 2.748604341e+02, -1.706429616e+02, 3.843757441e+01, -3.759045290e+00, 1.358263430e-01, -1.163607425e+02, 4.350905533e+01, -5.859305970e+00, 3.376426246e-01, -6.881281652e-03}, + {42, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.318708720e+01, 2.000000093e+00, 3.203285955e+02, -1.966282865e+02, 4.398204769e+01, -4.283031482e+00, 1.543480828e-01, -9.364181222e+01, 3.329814493e+01, -4.141689265e+00, 2.095170962e-01, -3.304665813e-03}, + {43, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.314266674e+01, 1.999999876e+00, 4.184977165e+02, -2.552902161e+02, 5.707764818e+01, -5.576436872e+00, 2.020184726e-01, -8.395646154e+01, 2.898228589e+01, -3.422356654e+00, 1.564059753e-01, -1.838508896e-03}, + {44, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.322914744e+01, 1.999999909e+00, 3.243555305e+02, -1.978255470e+02, 4.397580841e+01, -4.256142657e+00, 1.524431452e-01, -5.506292375e+01, 1.599310639e+01, -1.237152904e+00, -6.611574411e-03, 2.712232383e-03}, + {45, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.325181249e+01, 2.000000089e+00, 3.037823599e+02, -1.856628295e+02, 4.128167884e+01, -3.991656133e+00, 1.427469878e-01, -5.014186072e+01, 1.386962969e+01, -8.950806420e-01, -3.095321225e-02, 3.357984426e-03}, + {46, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.340893584e+01, 2.000000073e+00, 3.529797051e+02, -2.101512262e+02, 4.563946029e+01, -4.315279704e+00, 1.509248358e-01, -4.815922691e+01, 1.301508788e+01, -7.580854951e-01, -4.059091985e-02, 3.608993811e-03}, + {47, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.328399669e+01, 2.000000008e+00, 3.074953924e+02, -1.872462583e+02, 4.149827252e+01, -4.000811852e+00, 1.426973118e-01, -4.897188379e+01, 1.335300002e+01, -8.110051997e-01, -3.684788190e-02, 3.508156457e-03}, + {48, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.322914743e+01, 1.999999904e+00, 4.059717166e+02, -2.462737702e+02, 5.472040126e+01, -5.311320062e+00, 1.911670149e-01, -5.901534554e+01, 1.791385249e+01, -1.587065943e+00, 2.182673278e-02, 1.845559896e-03}, + {49, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.320760815e+01, 1.999999973e+00, 4.369774251e+02, -2.639721687e+02, 5.849617557e+01, -5.667842049e+00, 2.037342202e-01, -7.399698219e+01, 2.469785523e+01, -2.737881327e+00, 1.085351830e-01, -6.022720695e-04}, + {50, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.322184869e+01, 1.999999993e+00, 4.289361021e+02, -2.585593024e+02, 5.714058683e+01, -5.518600115e+00, 1.976499817e-01, -9.269047286e+01, 3.314422349e+01, -4.167341855e+00, 2.159629039e-01, -3.626802503e-03}, + {51, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.323657166e+01, 1.999999946e+00, 3.866985836e+02, -2.328379698e+02, 5.128884878e+01, -4.929614910e+00, 1.755331333e-01, -1.067869310e+02, 3.950715983e+01, -5.243321447e+00, 2.967791238e-01, -5.901223876e-03}, + {52, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.325181248e+01, 2.000000083e+00, 3.947511198e+02, -2.363799049e+02, 5.179393756e+01, -4.951603918e+00, 1.753404387e-01, -1.069681982e+02, 3.995521754e+01, -5.382071424e+00, 3.120248901e-01, -6.467957474e-03}, + {53, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.326760745e+01, 2.000000205e+00, 3.694394448e+02, -2.204699428e+02, 4.806381052e+01, -4.565474883e+00, 1.604614344e-01, -1.180749905e+02, 4.460080701e+01, -6.105217447e+00, 3.616537171e-01, -7.733059623e-03}, + {54, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.328399667e+01, 2.000000001e+00, 3.423943987e+02, -2.041330669e+02, 4.437639784e+01, -4.197363553e+00, 1.467594367e-01, -1.288973984e+02, 4.985324046e+01, -7.056041375e+00, 4.378018318e-01, -1.000965926e-02}, + {55, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.297881025e+01, 1.999999927e+00, -7.663422017e+01, 3.462700567e+01, -6.273553579e+00, 5.487612834e-01, -1.912897528e-02, -1.318428276e+02, 5.081036112e+01, -7.154907590e+00, 4.405355674e-01, -9.955685075e-03}, + {56, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.290657751e+01, 1.999999869e+00, 1.084179205e+02, -7.602229206e+01, 1.843754298e+01, -1.892451591e+00, 7.085434176e-02, -1.346311376e+02, 5.207427468e+01, -7.369834199e+00, 4.568138610e-01, -1.041859875e-02}, + {57, 6.000000000e+00, 7.725500002e+00, 2.824880000e+09, -1.292445241e+01, 1.999999898e+00, 2.995898890e+02, -1.889477671e+02, 4.336642429e+01, -4.330424108e+00, 1.599942758e-01, 5.503972208e+00, -1.227641064e+01, 3.699182312e+00, -3.884476060e-01, 1.375966896e-02}, + {58, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.293554133e+01, 1.999999890e+00, 1.709135500e+02, -1.120124681e+02, 2.615893820e+01, -2.624416758e+00, 9.674223967e-02, -1.375860132e+02, 5.337811974e+01, -7.586786386e+00, 4.730023198e-01, -1.087482303e-02}, + {59, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.293554133e+01, 1.999999890e+00, 1.214691988e+02, -8.336119630e+01, 1.996468944e+01, -2.032283439e+00, 7.562254632e-02, -1.631005912e+02, 6.472051894e+01, -9.476098737e+00, 6.127875286e-01, -1.475060958e-02}, + {60, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.294309494e+01, 1.999999967e+00, 1.302719596e+02, -8.835087414e+01, 2.101971144e+01, -2.131084478e+00, 7.908549730e-02, -1.692901279e+02, 6.742727614e+01, -9.920661139e+00, 6.453186854e-01, -1.564524492e-02}, + {61, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.295078139e+01, 1.999999905e+00, 1.127680235e+02, -7.782238836e+01, 1.865126163e+01, -1.895116816e+00, 7.030502833e-02, -2.059821608e+02, 8.384774285e+01, -1.267344799e+01, 8.502354115e-01, -2.135994609e-02}, + {62, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.295860692e+01, 1.999999936e+00, 1.203145109e+02, -8.212556537e+01, 1.956606386e+01, -1.981212240e+00, 7.333626288e-02, -2.158058793e+02, 8.810144391e+01, -1.336380022e+01, 9.000362964e-01, -2.270715579e-02}, + {63, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.296657573e+01, 1.999999918e+00, 1.212159597e+02, -8.256559477e+01, 1.964122173e+01, -1.986442056e+00, 7.345564343e-02, -2.278531434e+02, 9.336519465e+01, -1.422588608e+01, 9.627883381e-01, -2.441986614e-02}, + {64, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.298296617e+01, 1.999999921e+00, 1.689382403e+02, -1.099987696e+02, 2.551961464e+01, -2.543234152e+00, 9.313568005e-02, -2.282716670e+02, 9.348611199e+01, -1.423588448e+01, 9.628551072e-01, -2.440492772e-02}, + {65, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.299139910e+01, 1.999999880e+00, 1.724155378e+02, -1.120798437e+02, 2.598264738e+01, -2.588807295e+00, 9.481417896e-02, -2.322687147e+02, 9.517466656e+01, -1.450332749e+01, 9.817069914e-01, -2.490386807e-02}, + {66, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.298716240e+01, 1.999999941e+00, 1.286079419e+02, -8.646296410e+01, 2.039801258e+01, -2.050839207e+00, 7.549033493e-02, -2.420048480e+02, 9.935663043e+01, -1.517653800e+01, 1.029875015e+00, -2.619626869e-02}, + {67, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.299567846e+01, 1.999999971e+00, 1.182799697e+02, -8.043389241e+01, 1.908027783e+01, -1.923209794e+00, 7.087268462e-02, -2.464462609e+02, 1.012059056e+02, -1.546468270e+01, 1.049814070e+00, -2.671320158e-02}, + {68, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.300436459e+01, 1.999999966e+00, 1.150510247e+02, -7.859576077e+01, 1.868688175e+01, -1.885844183e+00, 6.954765052e-02, -2.457555063e+02, 1.007538481e+02, -1.536692833e+01, 1.041070997e+00, -2.643279207e-02}, + {69, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.300877391e+01, 2.000000000e+00, 1.266280406e+02, -8.514491730e+01, 2.007089332e+01, -2.015475088e+00, 7.409191965e-02, -2.492442707e+02, 1.021615320e+02, -1.557878384e+01, 1.055183253e+00, -2.678362279e-02}, + {70, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.301772826e+01, 1.999999912e+00, 1.224253568e+02, -8.281395858e+01, 1.958609738e+01, -1.970785167e+00, 7.255458061e-02, -2.488808342e+02, 1.018569466e+02, -1.550601866e+01, 1.048325396e+00, -2.655661748e-02}, + {71, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.303151733e+01, 2.000000051e+00, 1.862181262e+02, -1.199038630e+02, 2.763107534e+01, -2.742586837e+00, 1.001956495e-01, -2.403102476e+02, 9.796272016e+01, -1.484525920e+01, 9.987147871e-01, -2.516533876e-02}, + {72, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.304575796e+01, 2.000000081e+00, 2.297759959e+02, -1.448485621e+02, 3.295877082e+01, -3.245850428e+00, 1.179456377e-01, -2.282155654e+02, 9.249921555e+01, -1.392266984e+01, 9.297052139e-01, -2.323558576e-02}, + {73, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.306048022e+01, 1.999999910e+00, 2.646909006e+02, -1.647716545e+02, 3.719903613e+01, -3.645113853e+00, 1.319890617e-01, -2.165150972e+02, 8.722660467e+01, -1.303415548e+01, 8.633600348e-01, -2.138300143e-02}, + {74, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.308092196e+01, 2.000000008e+00, 2.251239174e+02, -1.414731209e+02, 3.206048507e+01, -3.142433101e+00, 1.135971917e-01, -2.070173544e+02, 8.296725365e+01, -1.231986936e+01, 8.102887128e-01, -1.990853407e-02}, + {75, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.309151488e+01, 1.999999984e+00, 2.627532736e+02, -1.629008146e+02, 3.661592385e+01, -3.571257833e+00, 1.286871297e-01, -1.945762063e+02, 7.740995255e+01, -1.139129234e+01, 7.415172466e-01, -1.800335280e-02}, + {76, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.310790581e+01, 2.000000068e+00, 2.644549626e+02, -1.637369900e+02, 3.675734857e+01, -3.580665992e+00, 1.288721975e-01, -1.725967865e+02, 6.755389456e+01, -9.737633351e+00, 6.184954292e-01, -1.457897448e-02}, + {77, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.311918599e+01, 1.999999933e+00, 2.677629012e+02, -1.650589135e+02, 3.690999414e+01, -3.582378706e+00, 1.284763849e-01, -1.584140848e+02, 6.122430396e+01, -8.680876005e+00, 5.402879020e-01, -1.241386995e-02}, + {78, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.319382006e+01, 2.000000009e+00, 2.420702029e+02, -1.484461630e+02, 3.292288306e+01, -3.162757529e+00, 1.121487556e-01, -1.319886050e+02, 4.940494114e+01, -6.702740089e+00, 3.934770465e-01, -8.336673895e-03}, + {79, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.320760814e+01, 1.999999969e+00, 2.346714957e+02, -1.439356552e+02, 3.189416251e+01, -3.059071523e+00, 1.082595858e-01, -1.130109430e+02, 4.093029258e+01, -5.286747014e+00, 2.885753389e-01, -5.428939868e-03}, + {80, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.316115147e+01, 2.000000093e+00, 2.747370538e+02, -1.689673404e+02, 3.771696324e+01, -3.655841153e+00, 1.309852214e-01, -9.001823908e+01, 3.066094857e+01, -3.570459523e+00, 1.613797666e-01, -1.901561361e-03}, + {81, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.313667715e+01, 2.000000002e+00, 3.142563781e+02, -1.916613838e+02, 4.259167223e+01, -4.119713271e+00, 1.474792530e-01, -7.642731867e+01, 2.462410146e+01, -2.566977318e+00, 8.741068396e-02, 1.388590928e-04}, + {82, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.314266674e+01, 1.999999876e+00, 3.509258060e+02, -2.125470710e+02, 4.702461797e+01, -4.535380912e+00, 1.620138781e-01, -5.173355302e+01, 1.362015056e+01, -7.321282362e-01, -4.826261322e-02, 3.892879264e-03}, + {83, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.315490164e+01, 1.999999944e+00, 3.399729483e+02, -2.056319770e+02, 4.539614689e+01, -4.366195994e+00, 1.554792165e-01, -4.131443229e+01, 8.986236911e+00, 3.924628986e-02, -1.052060828e-01, 5.466043586e-03}, + {84, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.316749062e+01, 1.999999920e+00, 3.640602841e+02, -2.190164327e+02, 4.815603439e+01, -4.616573783e+00, 1.639147626e-01, -3.256862965e+01, 5.115606198e+00, 6.800853161e-01, -1.522315744e-01, 6.756786448e-03}, + {85, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.318045630e+01, 2.000000044e+00, 3.766488275e+02, -2.257321142e+02, 4.947300991e+01, -4.728919006e+00, 1.674240471e-01, -2.300947210e+01, 8.615223509e-01, 1.388425307e+00, -2.045157608e-01, 8.200511055e-03}, + {86, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.319382005e+01, 2.000000006e+00, 3.443622947e+02, -2.064342780e+02, 4.516044966e+01, -4.302253084e+00, 1.516667044e-01, -5.399039282e+00, -7.002814559e+00, 2.702516748e+00, -3.018766003e-01, 1.089953798e-02}, + {87, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.291364147e+01, 2.000000217e+00, -3.706791591e+01, 1.118013187e+01, -1.057728859e+00, 3.312859839e-02, -3.138341244e-06, -3.451314336e+00, -7.779254134e+00, 2.816269849e+00, -3.090776388e-01, 1.106424389e-02}, + {88, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.284163724e+01, 1.999999954e+00, 6.125934670e+01, -4.855548659e+01, 1.248551381e+01, -1.323304763e+00, 5.060744172e-02, -6.021643455e+00, -6.580234329e+00, 2.607440108e+00, -2.929625239e-01, 1.059951856e-02}, + {89, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.285387248e+01, 2.000000090e+00, 1.350863292e+02, -9.126618691e+01, 2.169932948e+01, -2.201947573e+00, 8.186860720e-02, 1.937135880e+01, -1.787129621e+01, 4.485878662e+00, -4.315325969e-01, 1.442445798e-02}, + {90, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.286966604e+01, 1.999999970e+00, 1.784388998e+02, -1.161623817e+02, 2.702376618e+01, -2.704797298e+00, 9.957279361e-02, 2.216057166e+01, -1.904990091e+01, 4.671627339e+00, -4.444534802e-01, 1.475921763e-02}, + {91, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.287289489e+01, 1.999999951e+00, 1.368355213e+02, -9.179790820e+01, 2.169910915e+01, -2.190249857e+00, 8.102241740e-02, 4.516580666e+00, -1.118102949e+01, 3.357662550e+00, -3.470694353e-01, 1.205639951e-02}, + {92, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.287942629e+01, 2.000000032e+00, 1.427130850e+02, -9.499714618e+01, 2.234475916e+01, -2.247599931e+00, 8.291713193e-02, 1.341991149e+01, -1.518503354e+01, 4.030838171e+00, -3.972060658e-01, 1.345248084e-02}, + {93, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.288605524e+01, 1.999999761e+00, 2.341801100e+01, -2.506119713e+01, 7.023029272e+00, -7.610742531e-01, 2.903245750e-02, -3.575331738e+01, 7.276302226e+00, 1.906771859e-01, -1.059475755e-01, 5.184029625e-03}, + {94, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.288272835e+01, 1.999999941e+00, 1.287618322e+02, -8.721780968e+01, 2.073255323e+01, -2.100572716e+00, 7.794295578e-02, -2.307262580e+01, 1.113132278e+00, 1.305250601e+00, -1.948949139e-01, 7.829116438e-03}, + {95, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.288940956e+01, 1.999999880e+00, 1.334821220e+02, -8.985337775e+01, 2.127928526e+01, -2.150628571e+00, 7.965294640e-02, -3.518662723e+01, 6.514543434e+00, 4.030862442e-01, -1.279850170e-01, 5.970168353e-03}, + {96, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.290553004e+01, 2.000000198e+00, 4.545581472e+01, -3.771304300e+01, 9.729129321e+00, -1.017037014e+00, 3.807733199e-02, -4.973805034e+01, 1.342335334e+01, -8.221139917e-01, -3.176841835e-02, 3.146810827e-03}, + {97, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.291150963e+01, 2.000000019e+00, 4.689042092e+01, -3.843347264e+01, 9.859294531e+00, -1.027014690e+00, 3.834833665e-02, -4.657434145e+01, 1.204637835e+01, -5.982449163e-01, -4.786919243e-02, 3.579251285e-03}, + {98, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.290833198e+01, 1.999999824e+00, 1.337584189e+01, -1.907284620e+01, 5.691614909e+00, -6.307838734e-01, 2.430868142e-02, -5.573362773e+01, 1.615667599e+01, -1.288960621e+00, 3.655033732e-03, 2.140047522e-03}, + {99, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.291435263e+01, 1.999999988e+00, 1.376201293e+01, -1.919251815e+01, 5.693799461e+00, -6.287500644e-01, 2.416045199e-02, -4.914211254e+01, 1.314247998e+01, -7.739336035e-01, -3.530513333e-02, 3.241293077e-03}, + {100, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.292045700e+01, 2.000000004e+00, 1.277081775e+01, -1.854047224e+01, 5.534680382e+00, -6.118054153e-01, 2.349768815e-02, -5.074293980e+01, 1.383260974e+01, -8.858904786e-01, -2.718885953e-02, 3.019620454e-03} +}; +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... \ No newline at end of file diff --git a/source/processes/electromagnetic/lowenergy/src/G4LivermoreComptonModifiedModel.cc b/source/processes/electromagnetic/lowenergy/src/G4LivermoreComptonModifiedModel.cc deleted file mode 100644 index fda772a218..0000000000 --- a/source/processes/electromagnetic/lowenergy/src/G4LivermoreComptonModifiedModel.cc +++ /dev/null @@ -1,403 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// Author: Sebastien Incerti -// 30 October 2008 -// on base of G4LowEnergyCompton developed by A.Forti and M.G.Pia -// -// History: -// -------- -// 18 Apr 2009 V Ivanchenko Cleanup initialisation and generation of secondaries: -// - apply internal high-energy limit only in constructor -// - do not apply low-energy limit (default is 0) -// - remove GetMeanFreePath method and table -// - added protection against numerical problem in energy sampling -// - use G4ElementSelector -// 26 Dec 2010 V Ivanchenko Load data tables only once to avoid memory leak -// 30 May 2011 V Ivanchenko Migration to model design for deexcitation - -#include "G4LivermoreComptonModifiedModel.hh" -#include "G4PhysicalConstants.hh" -#include "G4SystemOfUnits.hh" -#include "G4Electron.hh" -#include "G4ParticleChangeForGamma.hh" -#include "G4LossTableManager.hh" -#include "G4VAtomDeexcitation.hh" -#include "G4AtomicShell.hh" -#include "G4CrossSectionHandler.hh" -#include "G4CompositeEMDataSet.hh" -#include "G4LogLogInterpolation.hh" -#include "G4Gamma.hh" -#include "G4Exp.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -using namespace std; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4LivermoreComptonModifiedModel::G4LivermoreComptonModifiedModel(const G4ParticleDefinition*, - const G4String& nam) - :G4VEmModel(nam),fParticleChange(nullptr), - scatterFunctionData(nullptr), - crossSectionHandler(nullptr),fAtomDeexcitation(nullptr), - isInitialised(false) -{ - verboseLevel=0 ; - // Verbosity scale: - // 0 = nothing - // 1 = warning for energy non-conservation - // 2 = details of energy budget - // 3 = calculation of cross sections, file openings, sampling of atoms - // 4 = entering in methods - - if( verboseLevel>0 ) - G4cout << "Livermore Modified Compton model is constructed " << G4endl; - - //Mark this model as "applicable" for atomic deexcitation - SetDeexcitationFlag(true); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4LivermoreComptonModifiedModel::~G4LivermoreComptonModifiedModel() -{ - delete crossSectionHandler; - delete scatterFunctionData; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -void G4LivermoreComptonModifiedModel::Initialise(const G4ParticleDefinition* particle, - const G4DataVector& cuts) -{ - if (verboseLevel > 2) { - G4cout << "Calling G4LivermoreComptonModifiedModel::Initialise()" << G4endl; - } - - if (crossSectionHandler) - { - crossSectionHandler->Clear(); - delete crossSectionHandler; - } - delete scatterFunctionData; - - // Reading of data files - all materials are read - crossSectionHandler = new G4CrossSectionHandler; - G4String crossSectionFile = "comp/ce-cs-"; - crossSectionHandler->LoadData(crossSectionFile); - - G4VDataSetAlgorithm* scatterInterpolation = new G4LogLogInterpolation; - G4String scatterFile = "comp/ce-sf-"; - scatterFunctionData = new G4CompositeEMDataSet(scatterInterpolation, 1., 1.); - scatterFunctionData->LoadData(scatterFile); - - // For Doppler broadening - shellData.SetOccupancyData(); - G4String file = "/doppler/shell-doppler"; - shellData.LoadData(file); - - InitialiseElementSelectors(particle,cuts); - - if (verboseLevel > 2) { - G4cout << "Loaded cross section files for Livermore Modified Compton model" << G4endl; - } - - if(isInitialised) { return; } - isInitialised = true; - - fParticleChange = GetParticleChangeForGamma(); - - fAtomDeexcitation = G4LossTableManager::Instance()->AtomDeexcitation(); - - if( verboseLevel>0 ) { - G4cout << "Livermore modified Compton model is initialized " << G4endl - << "Energy range: " - << LowEnergyLimit() / eV << " eV - " - << HighEnergyLimit() / GeV << " GeV" - << G4endl; - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4double G4LivermoreComptonModifiedModel::ComputeCrossSectionPerAtom( - const G4ParticleDefinition*, - G4double GammaEnergy, - G4double Z, G4double, - G4double, G4double) -{ - if (verboseLevel > 3) { - G4cout << "Calling ComputeCrossSectionPerAtom() of G4LivermoreComptonModifiedModel" << G4endl; - } - if (GammaEnergy < LowEnergyLimit()) - { return 0.0; } - - G4double cs = crossSectionHandler->FindValue(G4int(Z), GammaEnergy); - return cs; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -void G4LivermoreComptonModifiedModel::SampleSecondaries(std::vector* fvect, - const G4MaterialCutsCouple* couple, - const G4DynamicParticle* aDynamicGamma, - G4double, G4double) -{ - // The scattered gamma energy is sampled according to Klein - Nishina formula. - // then accepted or rejected depending on the Scattering Function multiplied - // by factor from Klein - Nishina formula. - // Expression of the angular distribution as Klein Nishina - // angular and energy distribution and Scattering fuctions is taken from - // D. E. Cullen "A simple model of photon transport" Nucl. Instr. Meth. - // Phys. Res. B 101 (1995). Method of sampling with form factors is different - // data are interpolated while in the article they are fitted. - // Reference to the article is from J. Stepanek New Photon, Positron - // and Electron Interaction Data for GEANT in Energy Range from 1 eV to 10 - // TeV (draft). - // The random number techniques of Butcher & Messel are used - // (Nucl Phys 20(1960),15). - - G4double photonEnergy0 = aDynamicGamma->GetKineticEnergy(); - - if (verboseLevel > 3) { - G4cout << "G4LivermoreComptonModifiedModel::SampleSecondaries() E(MeV)= " - << photonEnergy0/MeV << " in " << couple->GetMaterial()->GetName() - << G4endl; - } - - // do nothing below the threshold - // should never get here because the XS is zero below the limit - if (photonEnergy0 < LowEnergyLimit()) - return ; - - G4double e0m = photonEnergy0 / electron_mass_c2 ; - G4ParticleMomentum photonDirection0 = aDynamicGamma->GetMomentumDirection(); - - // Select randomly one element in the current material - const G4ParticleDefinition* particle = aDynamicGamma->GetDefinition(); - const G4Element* elm = SelectRandomAtom(couple,particle,photonEnergy0); - G4int Z = (G4int)elm->GetZ(); - - G4double epsilon0Local = 1. / (1. + 2. * e0m); - G4double epsilon0Sq = epsilon0Local * epsilon0Local; - G4double alpha1 = -G4Log(epsilon0Local); - G4double alpha2 = 0.5 * (1. - epsilon0Sq); - - G4double wlPhoton = h_Planck*c_light/photonEnergy0; - - // Sample the energy of the scattered photon - G4double epsilon; - G4double epsilonSq; - G4double oneCosT; - G4double sinT2; - G4double gReject; - - do - { - if ( alpha1/(alpha1+alpha2) > G4UniformRand()) - { - // std::pow(epsilon0Local,G4UniformRand()) - epsilon = G4Exp(-alpha1 * G4UniformRand()); - epsilonSq = epsilon * epsilon; - } - else - { - epsilonSq = epsilon0Sq + (1. - epsilon0Sq) * G4UniformRand(); - epsilon = std::sqrt(epsilonSq); - } - - oneCosT = (1. - epsilon) / ( epsilon * e0m); - sinT2 = oneCosT * (2. - oneCosT); - G4double x = std::sqrt(oneCosT/2.) / (wlPhoton/cm); - G4double scatteringFunction = scatterFunctionData->FindValue(x,Z-1); - gReject = (1. - epsilon * sinT2 / (1. + epsilonSq)) * scatteringFunction; - - } while(gReject < G4UniformRand()*Z); - - G4double cosTheta = 1. - oneCosT; - G4double sinTheta = std::sqrt (sinT2); - G4double phi = twopi * G4UniformRand() ; - G4double dirx = sinTheta * std::cos(phi); - G4double diry = sinTheta * std::sin(phi); - G4double dirz = cosTheta ; - - // Doppler broadening - Method based on: - // Y. Namito, S. Ban and H. Hirayama, - // "Implementation of the Doppler Broadening of a Compton-Scattered Photon - // into the EGS4 Code", NIM A 349, pp. 489-494, 1994 - - // Maximum number of sampling iterations - G4int maxDopplerIterations = 1000; - G4double bindingE = 0.; - G4double photonEoriginal = epsilon * photonEnergy0; - G4double photonE = -1.; - G4int iteration = 0; - G4double systemE = 0; - G4double ePAU = -1; - G4int shellIdx = 0; - G4double vel_c = 299792458; - G4double momentum_au_to_nat = 1.992851740*std::pow(10.,-24.); - G4double e_mass_kg = 9.10938188 * std::pow(10.,-31.); - G4double eMax = -1; - G4double Alpha=0; - do - { - ++iteration; - // Select shell based on shell occupancy - shellIdx = shellData.SelectRandomShell(Z); - bindingE = shellData.BindingEnergy(Z,shellIdx); - - // Randomly sample bound electron momentum - // (memento: the data set is in Atomic Units) - G4double pSample = profileData.RandomSelectMomentum(Z,shellIdx); - // Rescale from atomic units - - //Kinetic energy of target electron - // Reverse vector projection onto scattering vector - do { - Alpha = G4UniformRand()*pi/2.0; - } while(Alpha >= (pi/2.0)); - - ePAU = pSample / std::cos(Alpha); - - // Convert to SI and the calculate electron energy in natural units - G4double ePSI = ePAU * momentum_au_to_nat; - G4double u_temp = sqrt( ((ePSI*ePSI)*(vel_c*vel_c)) / ((e_mass_kg*e_mass_kg)*(vel_c*vel_c)+(ePSI*ePSI)))/vel_c; - G4double eEIncident = electron_mass_c2 / sqrt( 1 - (u_temp*u_temp)); - - //Total energy of the system - systemE = eEIncident+photonEnergy0; - - eMax = systemE - bindingE - electron_mass_c2; - G4double pDoppler = pSample * fine_structure_const; - G4double pDoppler2 = pDoppler * pDoppler; - G4double var2 = 1. + oneCosT * e0m; - G4double var3 = var2*var2 - pDoppler2; - G4double var4 = var2 - pDoppler2 * cosTheta; - G4double var = var4*var4 - var3 + pDoppler2 * var3; - if (var > 0.) - { - G4double varSqrt = std::sqrt(var); - G4double scale = photonEnergy0 / var3; - // Random select either root - if (G4UniformRand() < 0.5) { photonE = (var4 - varSqrt) * scale; } - else { photonE = (var4 + varSqrt) * scale; } - } - else - { - photonE = -1.; - } - } while ( iteration <= maxDopplerIterations && - (photonE < 0. || photonE > eMax ) ); - - // End of recalculation of photon energy with Doppler broadening - // Kinematics of the scattered electron - G4double eKineticEnergy = systemE - photonE - bindingE - electron_mass_c2; - - // protection against negative final energy: no e- is created - G4double eDirX = 0.0; - G4double eDirY = 0.0; - G4double eDirZ = 1.0; - - if(eKineticEnergy < 0.0) { - G4cout << "Error, kinetic energy of electron less than zero" << G4endl; - } - else{ - // Estimation of Compton electron polar angle taken from: - // The EGSnrc Code System: Monte Carlo Simulation of Electron and Photon Transport - // Eqn 2.2.25 Pg 42, NRCC Report PIRS-701 - G4double E_num = photonEnergy0 - photonE*cosTheta; - G4double E_dom = sqrt(photonEnergy0*photonEnergy0 + photonE*photonE -2*photonEnergy0*photonE*cosTheta); - G4double cosThetaE = E_num / E_dom; - G4double sinThetaE = -sqrt((1. - cosThetaE) * (1. + cosThetaE)); - - eDirX = sinThetaE * std::cos(phi); - eDirY = sinThetaE * std::sin(phi); - eDirZ = cosThetaE; - - G4ThreeVector eDirection(eDirX,eDirY,eDirZ); - eDirection.rotateUz(photonDirection0); - G4DynamicParticle* dp = new G4DynamicParticle (G4Electron::Electron(), - eDirection,eKineticEnergy) ; - fvect->push_back(dp); - } - - // Revert to original if maximum number of iterations threshold has been reached - if (iteration >= maxDopplerIterations) - { - photonE = photonEoriginal; - bindingE = 0.; - } - - // Update G4VParticleChange for the scattered photon - G4ThreeVector photonDirection1(dirx,diry,dirz); - photonDirection1.rotateUz(photonDirection0); - fParticleChange->ProposeMomentumDirection(photonDirection1) ; - - G4double photonEnergy1 = photonE; - - if (photonEnergy1 > 0.) - { - fParticleChange->SetProposedKineticEnergy(photonEnergy1) ; - - if (iteration < maxDopplerIterations) - { - G4ThreeVector eDirection(eDirX,eDirY,eDirZ); - eDirection.rotateUz(photonDirection0); - G4DynamicParticle* dp = new G4DynamicParticle (G4Electron::Electron(), - eDirection,eKineticEnergy) ; - fvect->push_back(dp); - } - } - else - { - photonEnergy1 = 0.; - fParticleChange->SetProposedKineticEnergy(0.) ; - fParticleChange->ProposeTrackStatus(fStopAndKill); - } - - // sample deexcitation - // - if(fAtomDeexcitation && iteration < maxDopplerIterations) { - G4int index = couple->GetIndex(); - if(fAtomDeexcitation->CheckDeexcitationActiveRegion(index)) { - size_t nbefore = fvect->size(); - G4AtomicShellEnumerator as = G4AtomicShellEnumerator(shellIdx); - const G4AtomicShell* shell = fAtomDeexcitation->GetAtomicShell(Z, as); - fAtomDeexcitation->GenerateParticles(fvect, shell, Z, index); - size_t nafter = fvect->size(); - if(nafter > nbefore) { - for (size_t i=nbefore; iGetKineticEnergy(); - } - } - } - } - if(bindingE < 0.0) { bindingE = 0.0; } - fParticleChange->ProposeLocalEnergyDeposit(bindingE); -} diff --git a/source/processes/electromagnetic/lowenergy/src/G4LivermoreGammaConversionModel.cc b/source/processes/electromagnetic/lowenergy/src/G4LivermoreGammaConversionModel.cc index 7457bad70a..b34da63e91 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4LivermoreGammaConversionModel.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4LivermoreGammaConversionModel.cc @@ -30,7 +30,7 @@ // // Modifications: Zhuxin Li@CENBG // 11 March 2020 -// derives from G4PairProductionRelModel +// derives from G4PairProductionRelModel // ------------------------------------------------------------------- #include "G4LivermoreGammaConversionModel.hh" @@ -51,20 +51,19 @@ namespace { G4Mutex LivermoreGammaConversionModelMutex = G4MUTEX_INITIALIZER; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -const G4int G4LivermoreGammaConversionModel::maxZ; G4double G4LivermoreGammaConversionModel::lowEnergyLimit = 2.*CLHEP::electron_mass_c2; G4PhysicsFreeVector* G4LivermoreGammaConversionModel::data[] = {nullptr}; G4LivermoreGammaConversionModel::G4LivermoreGammaConversionModel (const G4ParticleDefinition* p, const G4String& nam) -: G4PairProductionRelModel(p,nam),fParticleChange(nullptr) +: G4PairProductionRelModel(p,nam),fParticleChange(nullptr),maxZ(100) { verboseLevel = 0; // Verbosity scale for debugging purposes: - // 0 = nothing + // 0 = nothing // 1 = calculation of cross sections, file openings... // 2 = entering in methods - if(verboseLevel > 0) + if(verboseLevel > 0) { G4cout << "G4LivermoreGammaConversionModel is constructed " << G4endl; } @@ -75,10 +74,12 @@ G4LivermoreGammaConversionModel::G4LivermoreGammaConversionModel G4LivermoreGammaConversionModel::~G4LivermoreGammaConversionModel() { if(IsMaster()) { - for(G4int i=0; i 1) + if (verboseLevel > 1) { - G4cout << "Calling Initialise() of G4LivermoreGammaConversionModel." + G4cout << "Calling Initialise() of G4LivermoreGammaConversionModel." << G4endl << "Energy range: " << LowEnergyLimit() / MeV << " MeV - " - << HighEnergyLimit() / GeV << " GeV isMater: " << IsMaster() + << HighEnergyLimit() / GeV << " GeV isMater: " << IsMaster() << G4endl; } - if(!fParticleChange) { + if(fParticleChange == nullptr) { fParticleChange = GetParticleChangeForGamma(); } - - if(IsMaster()) + + if(IsMaster()) { // Initialise element selector InitialiseElementSelectors(particle, cuts); // Access to elements char* path = std::getenv("G4LEDATA"); - G4ProductionCutsTable* theCoupleTable = - G4ProductionCutsTable::GetProductionCutsTable(); - - G4int numOfCouples = theCoupleTable->GetTableSize(); - - for(G4int i=0; iGetMaterialCutsCouple(i); - SetCurrentCouple(couple); - const G4Material* mat = couple->GetMaterial(); - const G4ElementVector* theElementVector = mat->GetElementVector(); - G4int nelm = mat->GetNumberOfElements(); - - for (G4int j=0; jGetZasInt()); + if(data[Z] == nullptr) { - G4int Z = std::min((*theElementVector)[j]->GetZasInt(), maxZ); - if(!data[Z]) { ReadData(Z, path); } + ReadData(Z, path); } } } @@ -138,20 +131,20 @@ void G4LivermoreGammaConversionModel::Initialise( void G4LivermoreGammaConversionModel::ReadData(size_t Z, const char* path) { - if (verboseLevel > 1) + if (verboseLevel > 1) { - G4cout << "Calling ReadData() of G4LivermoreGammaConversionModel" + G4cout << "Calling ReadData() of G4LivermoreGammaConversionModel" << G4endl; } - if(data[Z]) { return; } - + if(data[Z]!= nullptr) { return; } + const char* datadir = path; - if(!datadir) + if(datadir == nullptr) { datadir = std::getenv("G4LEDATA"); - if(!datadir) + if(datadir == nullptr) { G4Exception("G4LivermoreGammaConversionModel::ReadData()", "em0006",FatalException, @@ -161,10 +154,15 @@ void G4LivermoreGammaConversionModel::ReadData(size_t Z, const char* path) } data[Z] = new G4PhysicsFreeVector(); std::ostringstream ost; - ost << datadir << "/epics2017/pair/pp-cs-" << Z <<".dat"; + if(G4EmParameters::Instance()->LivermoreDataDir() == "livermore"){ + ost << datadir << "/livermore/pair/pp-cs-" << Z <<".dat"; + }else{ + ost << datadir << "/epics2017/pair/pp-cs-" << Z <<".dat"; + } + std::ifstream fin(ost.str().c_str()); - - if( !fin.is_open()) + + if( !fin.is_open()) { G4ExceptionDescription ed; ed << "G4LivermoreGammaConversionModel data file <" << ost.str().c_str() @@ -173,15 +171,15 @@ void G4LivermoreGammaConversionModel::ReadData(size_t Z, const char* path) "em0003",FatalException, ed,"G4LEDATA version should be G4EMLOW6.27 or later."); return; - } - else + } + else { - - if(verboseLevel > 1) { G4cout << "File " << ost.str() + + if(verboseLevel > 1) { G4cout << "File " << ost.str() << " is opened by G4LivermoreGammaConversionModel" << G4endl;} - + data[Z]->Retrieve(fin, true); - } + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -190,34 +188,34 @@ G4double G4LivermoreGammaConversionModel::ComputeCrossSectionPerAtom( const G4ParticleDefinition* particle, G4double GammaEnergy, G4double Z, G4double, G4double, G4double) { - if (verboseLevel > 1) + if (verboseLevel > 1) { - G4cout << "G4LivermoreGammaConversionModel::ComputeCrossSectionPerAtom() Z= " + G4cout << "G4LivermoreGammaConversionModel::ComputeCrossSectionPerAtom() Z= " << Z << G4endl; } - if (GammaEnergy < lowEnergyLimit) { return 0.0; } + if (GammaEnergy < lowEnergyLimit) { return 0.0; } G4double xs = 0.0; - + G4int intZ = std::max(1, std::min(G4lrint(Z), maxZ)); G4PhysicsFreeVector* pv = data[intZ]; // if element was not initialised // do initialisation safely for MT mode - if(!pv) + if(pv == nullptr) { InitialiseForElement(particle, intZ); pv = data[intZ]; - if(!pv) { return xs; } + if(pv == nullptr) { return xs; } } // x-section is taken from the table - xs = pv->Value(GammaEnergy); + xs = pv->Value(GammaEnergy); if(verboseLevel > 0) { - G4cout << "*** Gamma conversion xs for Z=" << Z << " at energy E(MeV)=" + G4cout << "*** Gamma conversion xs for Z=" << Z << " at energy E(MeV)=" << GammaEnergy/MeV << " cs=" << xs/millibarn << " mb" << G4endl; } return xs; @@ -226,11 +224,11 @@ G4double G4LivermoreGammaConversionModel::ComputeCrossSectionPerAtom( //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4LivermoreGammaConversionModel::InitialiseForElement( - const G4ParticleDefinition*, + const G4ParticleDefinition*, G4int Z) { G4AutoLock l(&LivermoreGammaConversionModelMutex); - if(!data[Z]) { ReadData(Z); } + if(data[Z] == nullptr) { ReadData(Z); } l.unlock(); } diff --git a/source/processes/electromagnetic/lowenergy/src/G4LivermoreGammaConversionModelRC.cc b/source/processes/electromagnetic/lowenergy/src/G4LivermoreGammaConversionModelRC.cc deleted file mode 100644 index cd9d18be37..0000000000 --- a/source/processes/electromagnetic/lowenergy/src/G4LivermoreGammaConversionModelRC.cc +++ /dev/null @@ -1,587 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// Author: Sebastien Incerti -// 22 January 2012 -// on base of G4LivermoreGammaConversionModelRC (original version) -// and G4LivermoreRayleighModel (MT version) - -#include "G4LivermoreGammaConversionModelRC.hh" -#include "G4PhysicalConstants.hh" -#include "G4SystemOfUnits.hh" -#include "G4Log.hh" -#include "G4Electron.hh" -#include "G4Positron.hh" -#include "G4Gamma.hh" -#include "G4ParticleChangeForGamma.hh" -#include "G4Exp.hh" -#include "G4AutoLock.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -using namespace std; -namespace { G4Mutex LivermoreGammaConversionModelRCMutex = G4MUTEX_INITIALIZER; } - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4PhysicsFreeVector* G4LivermoreGammaConversionModelRC::data[] = {nullptr}; - -G4LivermoreGammaConversionModelRC::G4LivermoreGammaConversionModelRC -(const G4ParticleDefinition*, const G4String& nam) - :G4VEmModel(nam),smallEnergy(2.*MeV),isInitialised(false) -{ - fParticleChange = nullptr; - lowEnergyLimit = 2.0*electron_mass_c2; - - verboseLevel= 0; - // Verbosity scale for debugging purposes: - // 0 = nothing - // 1 = calculation of cross sections, file openings... - // 2 = entering in methods - if(verboseLevel > 0) - { - G4cout << "G4LivermoreGammaConversionModelRC is constructed " << G4endl; - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4LivermoreGammaConversionModelRC::~G4LivermoreGammaConversionModelRC() -{ - if(IsMaster()) { - for(G4int i=0; i 1) - { - G4cout << "Calling Initialise() of G4LivermoreGammaConversionModelRC." - << G4endl - << "Energy range: " - << LowEnergyLimit() / MeV << " MeV - " - << HighEnergyLimit() / GeV << " GeV" - << G4endl; - } - - if(IsMaster()) - { - // Initialise element selector - InitialiseElementSelectors(particle, cuts); - - // Access to elements - char* path = std::getenv("G4LEDATA"); - - G4ProductionCutsTable* theCoupleTable = - G4ProductionCutsTable::GetProductionCutsTable(); - - G4int numOfCouples = theCoupleTable->GetTableSize(); - - for(G4int i=0; iGetMaterialCutsCouple(i)->GetMaterial(); - const G4ElementVector* theElementVector = material->GetElementVector(); - G4int nelm = material->GetNumberOfElements(); - - for (G4int j=0; jGetZ(); - if(Z < 1) { Z = 1; } - else if(Z > maxZ) { Z = maxZ; } - if(!data[Z]) { ReadData(Z, path); } - } - } - } - if(isInitialised) { return; } - fParticleChange = GetParticleChangeForGamma(); - isInitialised = true; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -void G4LivermoreGammaConversionModelRC::InitialiseLocal( - const G4ParticleDefinition*, G4VEmModel* masterModel) -{ - SetElementSelectors(masterModel->GetElementSelectors()); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4double -G4LivermoreGammaConversionModelRC::MinPrimaryEnergy(const G4Material*, - const G4ParticleDefinition*, - G4double) -{ - return lowEnergyLimit; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -void G4LivermoreGammaConversionModelRC::ReadData(size_t Z, const char* path) -{ - if (verboseLevel > 1) - { - G4cout << "Calling ReadData() of G4LivermoreGammaConversionModelRC" - << G4endl; - } - - if(data[Z]) { return; } - - const char* datadir = path; - - if(!datadir) - { - datadir = std::getenv("G4LEDATA"); - if(!datadir) - { - G4Exception("G4LivermoreGammaConversionModelRC::ReadData()", - "em0006",FatalException, - "Environment variable G4LEDATA not defined"); - return; - } - } - - // - data[Z] = new G4PhysicsFreeVector(0,/*spline=*/true); - // - - std::ostringstream ost; - ost << datadir << "/livermore/pair/pp-cs-" << Z <<".dat"; - std::ifstream fin(ost.str().c_str()); - - if( !fin.is_open()) - { - G4ExceptionDescription ed; - ed << "G4LivermoreGammaConversionModelRC data file <" << ost.str().c_str() - << "> is not opened!" << G4endl; - G4Exception("G4LivermoreGammaConversionModelRC::ReadData()", - "em0003",FatalException, - ed,"G4LEDATA version should be G4EMLOW6.27 or later."); - return; - } - else - { - - if(verboseLevel > 3) { G4cout << "File " << ost.str() - << " is opened by G4LivermoreGammaConversionModelRC" << G4endl;} - - data[Z]->Retrieve(fin, true); - } - - // Activation of spline interpolation - data[Z] ->FillSecondDerivatives(); - -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4double -G4LivermoreGammaConversionModelRC::ComputeCrossSectionPerAtom(const G4ParticleDefinition*, - G4double GammaEnergy, - G4double Z, G4double, - G4double, G4double) -{ - if (verboseLevel > 1) - { - G4cout << "Calling ComputeCrossSectionPerAtom() of G4LivermoreGammaConversionModelRC" - << G4endl; - } - - if (GammaEnergy < lowEnergyLimit) { return 0.0; } - - G4double xs = 0.0; - - G4int intZ=G4int(Z); - - if(intZ < 1 || intZ > maxZ) { return xs; } - - G4PhysicsFreeVector* pv = data[intZ]; - - // if element was not initialised - // do initialisation safely for MT mode - if(!pv) - { - InitialiseForElement(0, intZ); - pv = data[intZ]; - if(!pv) { return xs; } - } - // x-section is taken from the table - xs = pv->Value(GammaEnergy); - - if(verboseLevel > 0) - { - G4int n = pv->GetVectorLength() - 1; - G4cout << "****** DEBUG: tcs value for Z=" << Z << " at energy (MeV)=" - << GammaEnergy/MeV << G4endl; - G4cout << " cs (Geant4 internal unit)=" << xs << G4endl; - G4cout << " -> first cs value in EADL data file (iu) =" << (*pv)[0] << G4endl; - G4cout << " -> last cs value in EADL data file (iu) =" << (*pv)[n] << G4endl; - G4cout << "*********************************************************" << G4endl; - } - - return xs; - -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -void G4LivermoreGammaConversionModelRC::SampleSecondaries( - std::vector* fvect, - const G4MaterialCutsCouple* couple, - const G4DynamicParticle* aDynamicGamma, - G4double, G4double) -{ - // The energies of the e+ e- secondaries are sampled using the Bethe - Heitler - // cross sections with Coulomb correction. A modified version of the random - // number techniques of Butcher & Messel is used (Nuc Phys 20(1960),15). - - // Note 1 : Effects due to the breakdown of the Born approximation at low - // energy are ignored. - // Note 2 : The differential cross section implicitly takes account of - // pair creation in both nuclear and atomic electron fields. However triplet - // prodution is not generated. - - if (verboseLevel > 1) { - G4cout << "Calling SampleSecondaries() of G4LivermoreGammaConversionModelRC" - << G4endl; - } - - G4double photonEnergy = aDynamicGamma->GetKineticEnergy(); - G4ParticleMomentum photonDirection = aDynamicGamma->GetMomentumDirection(); - - G4double epsilon ; - G4double epsilon0Local = electron_mass_c2 / photonEnergy ; - - G4double electronTotEnergy = 0.0; - G4double positronTotEnergy = 0.0; - G4double HardPhotonEnergy = 0.0; - - - // Do it fast if photon energy < 2. MeV - if (photonEnergy < smallEnergy ) - { - epsilon = epsilon0Local + (0.5 - epsilon0Local) * G4UniformRand(); - if (G4UniformRand() > 0.5) - { - electronTotEnergy = (1. - epsilon) * photonEnergy; - positronTotEnergy = epsilon * photonEnergy; - } - else - { - positronTotEnergy = (1. - epsilon) * photonEnergy; - electronTotEnergy = epsilon * photonEnergy; - } - } - else - { - // Select randomly one element in the current material - - const G4ParticleDefinition* particle = aDynamicGamma->GetDefinition(); - const G4Element* element = SelectRandomAtom(couple,particle,photonEnergy); - - if (element == 0) - { - G4cout << "G4LivermoreGammaConversionModelRC::SampleSecondaries - element = 0" - << G4endl; - return; - } - G4IonisParamElm* ionisation = element->GetIonisation(); - if (ionisation == 0) - { - G4cout << "G4LivermoreGammaConversionModelRC::SampleSecondaries - ionisation = 0" - << G4endl; - return; - } - - // Extract Coulomb factor for this Element - G4double fZ = 8. * (ionisation->GetlogZ3()); - if (photonEnergy > 50. * MeV) fZ += 8. * (element->GetfCoulomb()); - - // Limits of the screening variable - G4double screenFactor = 136. * epsilon0Local / (element->GetIonisation()->GetZ3()) ; - G4double screenMax = G4Exp ((42.24 - fZ)/8.368) - 0.952 ; - G4double screenMin = std::min(4.*screenFactor,screenMax) ; - - // Limits of the energy sampling - G4double epsilon1 = 0.5 - 0.5 * std::sqrt(1. - screenMin / screenMax) ; - G4double epsilonMin = std::max(epsilon0Local,epsilon1); - G4double epsilonRange = 0.5 - epsilonMin ; - - // Sample the energy rate of the created electron (or positron) - G4double screen; - G4double gReject ; - - G4double f10 = ScreenFunction1(screenMin) - fZ; - G4double f20 = ScreenFunction2(screenMin) - fZ; - G4double normF1 = std::max(f10 * epsilonRange * epsilonRange,0.); - G4double normF2 = std::max(1.5 * f20,0.); - - // Method for Radiative corrections - - G4double a=393.3750918, b=115.3070201, c=810.6428451, d=19.96497475, e=1016.874592, f=1.936685510, - gLocal=751.2140962, h=0.099751048, i=299.9466339, j=0.002057250, k=49.81034926; - G4double aa=-18.6371131, bb=-1729.95248, cc=9450.971186, dd=106336.0145, ee=55143.09287, ff=-117602.840, - gg=-721455.467, hh=693957.8635, ii=156266.1085, jj=533209.9347; - G4double Rechazo = 0.; - G4double logepsMin = log(epsilonMin); - G4double NormaRC = a + b*logepsMin + c/logepsMin + d*pow(logepsMin,2.) + e/pow(logepsMin,2.) + f*pow(logepsMin,3.) + - gLocal/pow(logepsMin,3.) + h*pow(logepsMin,4.) + i/pow(logepsMin,4.) + j*pow(logepsMin,5.) + - k/pow(logepsMin,5.); - - G4double HardPhotonThreshold = 0.08; - G4double r1, r2, r3, beta=0, gbeta, sigt = 582.068, sigh, rejet; - G4double cg = (11./2.)/(G4Exp(-11.*HardPhotonThreshold/2.)-G4Exp(-11./2.)); - - r1 = G4UniformRand(); - sigh = 1028.58*G4Exp(-HardPhotonThreshold/0.09033) + 136.63; // sigma hard - - if (r1 > 1.- sigh/sigt) { - r2 = G4UniformRand(); - rejet = 0.; - while (r2 > rejet) { - r3 = G4UniformRand(); - beta = (-2./11.)*log(G4Exp(-0.08*11./2.)-r3*11./(2.*cg)); - gbeta = G4Exp(-11.*beta/2.); - rejet = fbeta(beta)/(8000.*gbeta); - } - HardPhotonEnergy = beta * photonEnergy; - } - else{ - HardPhotonEnergy = 0.; - } - - photonEnergy -= HardPhotonEnergy; - - do - { - do - { - if (normF1 / (normF1 + normF2) > G4UniformRand() ) - { - epsilon = 0.5 - epsilonRange * std::pow(G4UniformRand(), 0.333333) ; - screen = screenFactor / (epsilon * (1. - epsilon)); - gReject = (ScreenFunction1(screen) - fZ) / f10 ; - } - else - { - epsilon = epsilonMin + epsilonRange * G4UniformRand(); - screen = screenFactor / (epsilon * (1 - epsilon)); - gReject = (ScreenFunction2(screen) - fZ) / f20 ; - } - } while ( gReject < G4UniformRand() ); - - - - if (G4UniformRand()>0.5) epsilon = (1. - epsilon); // Extención de Epsilon hasta 1. - - G4double logepsilon = log(epsilon); - G4double deltaP_R1 = 1. + (a + b*logepsilon + c/logepsilon + d*pow(logepsilon,2.) + e/pow(logepsilon,2.) + - f*pow(logepsilon,3.) + gLocal/pow(logepsilon,3.) + h*pow(logepsilon,4.) + i/pow(logepsilon,4.) + - j*pow(logepsilon,5.) + k/pow(logepsilon,5.))/100.; - G4double deltaP_R2 = 1.+((aa + cc*logepsilon + ee*pow(logepsilon,2.) + gg*pow(logepsilon,3.) + ii*pow(logepsilon,4.)) - / (1. + bb*logepsilon + dd*pow(logepsilon,2.) + ff*pow(logepsilon,3.) + hh*pow(logepsilon,4.) - + jj*pow(logepsilon,5.) ))/100.; - - if (epsilon <= 0.5) - { - Rechazo = deltaP_R1/NormaRC; - } - else - { - Rechazo = deltaP_R2/NormaRC; - } - } while (Rechazo < G4UniformRand() ); - - electronTotEnergy = (1. - epsilon) * photonEnergy; - positronTotEnergy = epsilon * photonEnergy; - - } // End of epsilon sampling - - - // Fix charges randomly - - // Scattered electron (positron) angles. ( Z - axis along the parent photon) - // Universal distribution suggested by L. Urban (Geant3 manual (1993) Phys211), - // derived from Tsai distribution (Rev. Mod. Phys. 49, 421 (1977) - G4double u; - const G4double a1 = 0.625; - G4double a2 = 3. * a1; - - if (0.25 > G4UniformRand()) - { - u = - G4Log(G4UniformRand() * G4UniformRand()) / a1 ; - } - else - { - u = - G4Log(G4UniformRand() * G4UniformRand()) / a2 ; - } - - G4double thetaEle = u*electron_mass_c2/electronTotEnergy; - G4double thetaPos = u*electron_mass_c2/positronTotEnergy; - G4double phi = twopi * G4UniformRand(); - - G4double dxEle= std::sin(thetaEle)*std::cos(phi),dyEle= std::sin(thetaEle)*std::sin(phi),dzEle=std::cos(thetaEle); - G4double dxPos=-std::sin(thetaPos)*std::cos(phi),dyPos=-std::sin(thetaPos)*std::sin(phi),dzPos=std::cos(thetaPos); - - // Kinematics of the created pair: - // the electron and positron are assumed to have a symetric angular - // distribution with respect to the Z axis along the parent photon - G4double electronKineEnergy = std::max(0.,electronTotEnergy - electron_mass_c2) ; - - G4ThreeVector electronDirection (dxEle, dyEle, dzEle); - electronDirection.rotateUz(photonDirection); - - G4DynamicParticle* particle1 = new G4DynamicParticle (G4Electron::Electron(), - electronDirection, - electronKineEnergy); - - // The e+ is always created - G4double positronKineEnergy = std::max(0.,positronTotEnergy - electron_mass_c2) ; - - G4ThreeVector positronDirection (dxPos, dyPos, dzPos); - positronDirection.rotateUz(photonDirection); - - // Create G4DynamicParticle object for the particle2 - G4DynamicParticle* particle2 = new G4DynamicParticle(G4Positron::Positron(), - positronDirection, - positronKineEnergy); - // Fill output vector - fvect->push_back(particle1); - fvect->push_back(particle2); - - if (HardPhotonEnergy > 0.) - { - G4double thetaHardPhoton = u*electron_mass_c2/HardPhotonEnergy; - phi = twopi * G4UniformRand(); - G4double dxHardP= std::sin(thetaHardPhoton)*std::cos(phi); - G4double dyHardP= std::sin(thetaHardPhoton)*std::sin(phi); - G4double dzHardP =std::cos(thetaHardPhoton); - - G4ThreeVector hardPhotonDirection (dxHardP, dyHardP, dzHardP); - hardPhotonDirection.rotateUz(photonDirection); - G4DynamicParticle* particle3 = new G4DynamicParticle (G4Gamma::Gamma(), - hardPhotonDirection, - HardPhotonEnergy); - fvect->push_back(particle3); - } - - // kill incident photon - fParticleChange->SetProposedKineticEnergy(0.); - fParticleChange->ProposeTrackStatus(fStopAndKill); - -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4double G4LivermoreGammaConversionModelRC::ScreenFunction1(G4double screenVariable) -{ - // Compute the value of the screening function 3*phi1 - phi2 - - G4double value; - if (screenVariable > 1.) - value = 42.24 - 8.368 * G4Log(screenVariable + 0.952); - else - value = 42.392 - screenVariable * (7.796 - 1.961 * screenVariable); - - return value; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4double G4LivermoreGammaConversionModelRC::ScreenFunction2(G4double screenVariable) -{ - // Compute the value of the screening function 1.5*phi1 - 0.5*phi2 - G4double value; - if (screenVariable > 1.) - value = 42.24 - 8.368 * G4Log(screenVariable + 0.952); - else - value = 41.405 - screenVariable * (5.828 - 0.8945 * screenVariable); - - return value; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4double G4LivermoreGammaConversionModelRC::fbeta(G4double x) -{ - // compute the probabililty distribution for hard photon - G4double gamma, eta, d, p1, p2, p3, p4, p5, p6, p7, ffbeta; - gamma = (1.-x)*(1.-x)/x; - eta = (1.-x)/(1.+x); - d = Dilog(1./x)-Dilog(x); - p1 = -1.*(25528.*pow(gamma,2) + 116044.* gamma +151556.)/105.; - p2 = 256.* pow(gamma,3) + 1092.* pow(gamma,2) +1260.*gamma + 420.; - p3 = (676.*pow(gamma,3) + 9877.*pow(gamma,2) + 58415.*gamma + 62160.)/105.; - p4 = 64.*pow(gamma,3) + 305.*pow(gamma,2) + 475.*gamma + 269. - 276./gamma; - p5 = (676.*pow(gamma,3) + 38109.*pow(gamma,2) + 211637.*gamma + 266660. - 53632./gamma)/105.; - p6 = 32.*pow(gamma,2) + 416.*gamma + 1310. +1184./gamma; - p7 = 128.*pow(gamma,3) + 802.*pow(gamma,2) + 1028.*gamma - 470. - 1184./gamma; - ffbeta = (1.-x) * (p1 + p2*pi*pi/6. + p3*log(gamma) + - p4*pow(log(x),2) + (p5 + p6*log(gamma))*eta*log(x) + p7*d*eta); - return ffbeta; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4double G4LivermoreGammaConversionModelRC::Dilog(G4double y) -{ - G4double fdilog = 0.0; - if (y <= 0.5) { - fdilog = pow(pi,2)/6. + (1.-y)*(log(1-y)-1.)+pow((1.-y),2)*((1./2.)*log(1.-y)-1./4.) - +pow((1.-y),3)*((1./3.)*log(1.-y)-1./9.)+pow((1.-y),4)*((1./4.)*log(1.-y)-1./16.); - } - if (0.5 < y && y < 2.) { - fdilog = 1.-y+pow((1.-y),2)/4.+pow((1.-y),3)/9.+pow((1.-y),4)/16.+ - pow((1.-y),5)/25.+pow((1.-y),6)/36.+pow((1.-y),7)/49.; - } - if (y >= 2.) { - fdilog = -pow(log(y),2)/2. - pow(pi,2)/6. + (log(y)+1.)/y + - (log(y)/2.+1./4.)/pow(y,2) + (log(y)/3.+1./9.)/pow(y,3); - } - return fdilog; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -void G4LivermoreGammaConversionModelRC::InitialiseForElement( - const G4ParticleDefinition*, - G4int Z) -{ - G4AutoLock l(&LivermoreGammaConversionModelRCMutex); - if(!data[Z]) { ReadData(Z); } - l.unlock(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/lowenergy/src/G4LivermorePhotoElectricModel.cc b/source/processes/electromagnetic/lowenergy/src/G4LivermorePhotoElectricModel.cc index 121df91a27..db359bf85b 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4LivermorePhotoElectricModel.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4LivermorePhotoElectricModel.cc @@ -68,7 +68,7 @@ using namespace std; G4LivermorePhotoElectricModel::G4LivermorePhotoElectricModel(const G4String& nam) : G4VEmModel(nam),fParticleChange(nullptr), fAtomDeexcitation(nullptr), - maxZ(99),nShellLimit(100),fDeexcitationActive(false),isInitialised(false) + maxZ(100),nShellLimit(100),fDeexcitationActive(false),isInitialised(false) { verboseLevel= 0; // Verbosity scale: @@ -99,18 +99,29 @@ G4LivermorePhotoElectricModel::G4LivermorePhotoElectricModel(const G4String& nam G4LivermorePhotoElectricModel::~G4LivermorePhotoElectricModel() { - if(IsMaster()) { + if(IsMaster()) + { delete fShellCrossSection; fShellCrossSection = nullptr; - for(G4int i=0; iGetTableSize(); - - for(G4int i=0; iGetMaterialCutsCouple(i); - const G4Material* material = couple->GetMaterial(); - const G4ElementVector* theElementVector = material->GetElementVector(); - G4int nelm = material->GetNumberOfElements(); - - for (G4int j=0; jGetZasInt()); - if(!fCrossSection[Z]) { ReadData(Z); } + if(fShellCrossSection == nullptr) { fShellCrossSection = new G4ElementData(); } + + const G4ElementTable* elemTable = G4Element::GetElementTable(); + size_t numElems = (*elemTable).size(); + for(size_t ie = 0; ie < numElems; ++ie) + { + const G4Element* elem = (*elemTable)[ie]; + const G4int Z = std::min(maxZ, elem->GetZasInt()); + if(fCrossSection[Z] == nullptr) + { + ReadData(Z); } } } @@ -217,11 +223,11 @@ G4double G4LivermorePhotoElectricModel::ComputeCrossSectionPerAtom( } G4double cs = 0.0; G4int Z = G4lrint(ZZ); - if(Z >= maxZ) { return cs; } + if(Z > maxZ) { return cs; } // if element was not initialised // do initialisation safely for MT mode - if(!fCrossSection[Z]) { InitialiseForElement(theGamma, Z); } + if(fCrossSection[Z] == nullptr) { InitialiseForElement(theGamma, Z); } //7: rows in the parameterization file; 5: number of parameters G4int idx = fNShells[Z]*7 - 5; @@ -308,10 +314,10 @@ G4LivermorePhotoElectricModel::SampleSecondaries( // Select the ionised shell in the current atom according to shell // cross sections // G4cout << "Select random shell Z= " << Z << G4endl; - if(Z >= maxZ) { Z = maxZ-1; } + if(Z > maxZ) { Z = maxZ; } // element was not initialised gamma should be absorbed - if(!fCrossSection[Z]) { + if(fCrossSection[Z] == nullptr) { fParticleChange->ProposeLocalEnergyDeposit(gammaEnergy); return; } @@ -495,7 +501,12 @@ const G4String& G4LivermorePhotoElectricModel::FindDirectoryPath() const char* path = std::getenv("G4LEDATA"); if (path) { std::ostringstream ost; - ost << path << "/livermore/phot_epics2014/"; + if(G4EmParameters::Instance()->LivermoreDataDir() =="livermore"){ + ost << path << "/livermore/phot_epics2014/"; + }else{ + ost << path << "/epics2017/phot/"; + } + fDataDirectory = ost.str(); } else { G4Exception("G4SeltzerBergerModel::FindDirectoryPath()","em0006", @@ -516,11 +527,11 @@ void G4LivermorePhotoElectricModel::ReadData(G4int Z) << G4endl; } - if(fCrossSection[Z]) { return; } + if(fCrossSection[Z]!= nullptr) { return; } - // spline for photoeffect total x-section above K-shell + // no spline for photoeffect total x-section above K-shell // but below the parameterized ones - fCrossSection[Z] = new G4PhysicsFreeVector(0,/*spline=*/true); + fCrossSection[Z] = new G4PhysicsFreeVector(); std::ostringstream ost; ost << FindDirectoryPath() << "pe-cs-" << Z <<".dat"; std::ifstream fin(ost.str().c_str()); @@ -698,10 +709,10 @@ void G4LivermorePhotoElectricModel::ReadData(G4int Z) G4double G4LivermorePhotoElectricModel::GetBindingEnergy(G4int Z, G4int shell) { - if(Z < 1 || Z >= maxZ) { return -1;} //If Z is out of the supported return 0 + if(Z < 1 || Z > maxZ) { return -1;} //If Z is out of the supported return 0 //If necessary load data for Z InitialiseForElement(theGamma, Z); - if(!fCrossSection[Z] || shell < 0 || shell >= fNShellsUsed[Z]) { return -1; } + if(fCrossSection[Z] == nullptr || shell < 0 || shell >= fNShellsUsed[Z]) { return -1; } if(Z>2) return fShellCrossSection->GetComponentDataByIndex(Z, shell)->Energy(0); @@ -714,10 +725,10 @@ G4double G4LivermorePhotoElectricModel::GetBindingEnergy(G4int Z, G4int shell) void G4LivermorePhotoElectricModel::InitialiseForElement( const G4ParticleDefinition*, G4int Z) { - if (!fCrossSection[Z]) { + if (fCrossSection[Z] == nullptr) { #ifdef G4MULTITHREADED G4MUTEXLOCK(&livPhotoeffMutex); - if (!fCrossSection[Z]) { + if (fCrossSection[Z] == nullptr) { #endif ReadData(Z); #ifdef G4MULTITHREADED diff --git a/source/processes/electromagnetic/lowenergy/src/G4LivermorePolarizedComptonModel.cc b/source/processes/electromagnetic/lowenergy/src/G4LivermorePolarizedComptonModel.cc index 59c81ac3c0..aafac953df 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4LivermorePolarizedComptonModel.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4LivermorePolarizedComptonModel.cc @@ -64,7 +64,7 @@ #include "G4Exp.hh" #include "G4Pow.hh" #include "G4LogLogInterpolation.hh" - +#include "G4PhysicsModelCatalog.hh" #include "G4EntanglementAuxInfo.hh" #include "G4eplusAnnihilationEntanglementClipBoard.hh" @@ -100,8 +100,7 @@ G4LivermorePolarizedComptonModel::G4LivermorePolarizedComptonModel(const G4Parti fParticleChange = nullptr; fAtomDeexcitation = nullptr; - fEntanglementModelIndex - = G4PhysicsModelCatalog::Register("G4GammaGammaEntanglement"); + fEntanglementModelID = G4PhysicsModelCatalog::GetModelID("model_GammaGammaEntanglement"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -468,7 +467,7 @@ void G4LivermorePolarizedComptonModel::SampleSecondaries(std::vectorGetCurrentTrack()->GetAuxiliaryTrackInformation(fEntanglementModelIndex); + = fParticleChange->GetCurrentTrack()->GetAuxiliaryTrackInformation(fEntanglementModelID); if (auxInfo) { const auto* entanglementAuxInfo = dynamic_cast(auxInfo); if (entanglementAuxInfo) { diff --git a/source/processes/electromagnetic/lowenergy/src/G4LivermorePolarizedRayleighModel.cc b/source/processes/electromagnetic/lowenergy/src/G4LivermorePolarizedRayleighModel.cc index 80fb9bef6b..3061f9aeae 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4LivermorePolarizedRayleighModel.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4LivermorePolarizedRayleighModel.cc @@ -54,13 +54,13 @@ namespace { G4Mutex LivermorePolarizedRayleighModelMutex = G4MUTEX_INITIALIZER; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4PhysicsFreeVector* G4LivermorePolarizedRayleighModel::dataCS[] = {nullptr}; -G4VEMDataSet* G4LivermorePolarizedRayleighModel::formFactorData = nullptr; +G4PhysicsFreeVector* G4LivermorePolarizedRayleighModel::formFactorData[] = {nullptr}; G4LivermorePolarizedRayleighModel::G4LivermorePolarizedRayleighModel(const G4ParticleDefinition*, const G4String& nam) :G4VEmModel(nam),fParticleChange(nullptr),isInitialised(false) { - lowEnergyLimit = 250 * eV; + lowEnergyLimit = 250 * CLHEP::eV; // verboseLevel= 0; // Verbosity scale: @@ -72,10 +72,9 @@ G4LivermorePolarizedRayleighModel::G4LivermorePolarizedRayleighModel(const G4Par if(verboseLevel > 0) { G4cout << "Livermore Polarized Rayleigh is constructed " << G4endl - << "Energy range: " - << LowEnergyLimit() / eV << " eV - " - << HighEnergyLimit() / GeV << " GeV" - << G4endl; + << "Energy range: " << LowEnergyLimit() / CLHEP::eV << " eV - " + << HighEnergyLimit() / CLHEP::GeV << " GeV" + << G4endl; } } @@ -83,17 +82,16 @@ G4LivermorePolarizedRayleighModel::G4LivermorePolarizedRayleighModel(const G4Par G4LivermorePolarizedRayleighModel::~G4LivermorePolarizedRayleighModel() { - if(IsMaster()) { - for(G4int i=0; iLoadData(formFactorFile); // Initialise element selector InitialiseElementSelectors(particle, cuts); // Access to elements char* path = std::getenv("G4LEDATA"); - G4ProductionCutsTable* theCoupleTable = - G4ProductionCutsTable::GetProductionCutsTable(); - G4int numOfCouples = theCoupleTable->GetTableSize(); - - for(G4int i=0; iGetMaterialCutsCouple(i); - const G4Material* material = couple->GetMaterial(); - const G4ElementVector* theElementVector = material->GetElementVector(); - G4int nelm = material->GetNumberOfElements(); - - for (G4int j=0; jGetZ()); - if(Z < 1) { Z = 1; } - else if(Z > maxZ) { Z = maxZ; } - if( (!dataCS[Z]) ) { ReadData(Z, path); } - } - } + auto elmTable = G4Element::GetElementTable(); + for (auto const & elm : *elmTable) { + G4int Z = std::min(elm->GetZasInt(), maxZ); + if( nullptr == dataCS[Z] ) { ReadData(Z, path); } + } } if(isInitialised) { return; } @@ -153,8 +131,8 @@ void G4LivermorePolarizedRayleighModel::Initialise(const G4ParticleDefinition* p //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -void G4LivermorePolarizedRayleighModel::InitialiseLocal(const G4ParticleDefinition*, - G4VEmModel* masterModel) +void G4LivermorePolarizedRayleighModel::InitialiseLocal( + const G4ParticleDefinition*, G4VEmModel* masterModel) { SetElementSelectors(masterModel->GetElementSelectors()); } @@ -163,20 +141,19 @@ void G4LivermorePolarizedRayleighModel::InitialiseLocal(const G4ParticleDefiniti void G4LivermorePolarizedRayleighModel::ReadData(size_t Z, const char* path) { - if (verboseLevel > 1) - { - G4cout << "Calling ReadData() of G4LivermoreRayleighModel" - << G4endl; - } + if (verboseLevel > 1) { + G4cout << "Calling ReadData() of G4LivermoreRayleighModel" + << G4endl; + } - if(dataCS[Z]) { return; } + if(nullptr != dataCS[Z]) { return; } const char* datadir = path; - if(!datadir) + if(nullptr == datadir) { datadir = std::getenv("G4LEDATA"); - if(!datadir) + if(nullptr == datadir) { G4Exception("G4LivermoreRayleighModelModel::ReadData()","em0006", FatalException, @@ -185,78 +162,96 @@ void G4LivermorePolarizedRayleighModel::ReadData(size_t Z, const char* path) } } dataCS[Z] = new G4PhysicsFreeVector(); + formFactorData[Z] = new G4PhysicsFreeVector(); std::ostringstream ostCS; ostCS << datadir << "/livermore/rayl/re-cs-" << Z <<".dat"; std::ifstream finCS(ostCS.str().c_str()); - if( !finCS .is_open() ) - { - G4ExceptionDescription ed; - ed << "G4LivermorePolarizedRayleighModel data file <" << ostCS.str().c_str() - << "> is not opened!" << G4endl; - G4Exception("G4LivermorePolarizedRayleighModel::ReadData()","em0003",FatalException, - ed,"G4LEDATA version should be G4EMLOW6.27 or later."); - return; - } - else - { - if(verboseLevel > 3) { - G4cout << "File " << ostCS.str() - << " is opened by G4LivermoreRayleighModel" << G4endl; - } - dataCS[Z]->Retrieve(finCS, true); - } - } + if( !finCS .is_open() ) { + G4ExceptionDescription ed; + ed << "G4LivermorePolarizedRayleighModel data file <" << ostCS.str().c_str() + << "> is not opened!" << G4endl; + G4Exception("G4LivermorePolarizedRayleighModel::ReadData()","em0003", + FatalException, + ed,"G4LEDATA version should be G4EMLOW6.27 or later."); + return; + } else { + if(verboseLevel > 3) { + G4cout << "File " << ostCS.str() + << " is opened by G4LivermoreRayleighModel" << G4endl; + } + dataCS[Z]->Retrieve(finCS, true); + } + + std::ostringstream ostFF; + ostFF << datadir << "/livermore/rayl/re-ff-" << Z <<".dat"; + std::ifstream finFF(ostFF.str().c_str()); + + if( !finFF.is_open() ) { + G4ExceptionDescription ed; + ed << "G4LivermorePolarizedRayleighModel data file <" << ostFF.str().c_str() + << "> is not opened!" << G4endl; + G4Exception("G4LivermorePolarizedRayleighModel::ReadData()","em0003", + FatalException, + ed,"G4LEDATA version should be G4EMLOW6.27 or later."); + return; + } else { + if(verboseLevel > 3) { + G4cout << "File " << ostFF.str() + << " is opened by G4LivermoreRayleighModel" << G4endl; + } + formFactorData[Z]->Retrieve(finFF, true); + } +} - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - G4double G4LivermorePolarizedRayleighModel::ComputeCrossSectionPerAtom( +G4double G4LivermorePolarizedRayleighModel::ComputeCrossSectionPerAtom( const G4ParticleDefinition*, G4double GammaEnergy, G4double Z, G4double, G4double, G4double) - { - if (verboseLevel > 1) - { - G4cout << "G4LivermoreRayleighModel::ComputeCrossSectionPerAtom()" - << G4endl; - } +{ + if (verboseLevel > 1) { + G4cout << "G4LivermoreRayleighModel::ComputeCrossSectionPerAtom()" + << G4endl; + } - if(GammaEnergy < lowEnergyLimit) { return 0.0; } + if(GammaEnergy < lowEnergyLimit) { return 0.0; } - G4double xs = 0.0; + G4double xs = 0.0; - G4int intZ = G4lrint(Z); - if(intZ < 1 || intZ > maxZ) { return xs; } + G4int intZ = G4lrint(Z); + if(intZ < 1 || intZ > maxZ) { return xs; } - G4PhysicsFreeVector* pv = dataCS[intZ]; + G4PhysicsFreeVector* pv = dataCS[intZ]; - // if element was not initialised - // do initialisation safely for MT mode - if(!pv) { - InitialiseForElement(0, intZ); - pv = dataCS[intZ]; - if(!pv) { return xs; } - } + // if element was not initialised + // do initialisation safely for MT mode + if(nullptr == pv) { + InitialiseForElement(0, intZ); + pv = dataCS[intZ]; + if(nullptr == pv) { return xs; } + } - G4int n = pv->GetVectorLength() - 1; - G4double e = GammaEnergy/MeV; - if(e >= pv->Energy(n)) { - xs = (*pv)[n]/(e*e); - } else if(e >= pv->Energy(0)) { - xs = pv->Value(e)/(e*e); - } - return xs; - } + G4int n = pv->GetVectorLength() - 1; + G4double e = GammaEnergy/MeV; + if(e >= pv->Energy(n)) { + xs = (*pv)[n]/(e*e); + } else if(e >= pv->Energy(0)) { + xs = pv->Value(e)/(e*e); + } + return xs; +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -void G4LivermorePolarizedRayleighModel::SampleSecondaries(std::vector* /*fvect*/, - const G4MaterialCutsCouple* couple, - const G4DynamicParticle* aDynamicGamma, - G4double, - G4double) +void G4LivermorePolarizedRayleighModel::SampleSecondaries( + std::vector*, + const G4MaterialCutsCouple* couple, + const G4DynamicParticle* aDynamicGamma, + G4double, G4double) { if (verboseLevel > 3) G4cout << "Calling SampleSecondaries() of G4LivermorePolarizedRayleighModel" << G4endl; @@ -265,10 +260,10 @@ void G4LivermorePolarizedRayleighModel::SampleSecondaries(std::vectorProposeTrackStatus(fStopAndKill); - fParticleChange->SetProposedKineticEnergy(0.); - fParticleChange->ProposeLocalEnergyDeposit(photonEnergy0); - return ; + fParticleChange->ProposeTrackStatus(fStopAndKill); + fParticleChange->SetProposedKineticEnergy(0.); + fParticleChange->ProposeLocalEnergyDeposit(photonEnergy0); + return; } G4ParticleMomentum photonDirection0 = aDynamicGamma->GetMomentumDirection(); @@ -276,11 +271,11 @@ void G4LivermorePolarizedRayleighModel::SampleSecondaries(std::vectorGetDefinition(); const G4Element* elm = SelectRandomAtom(couple,particle,photonEnergy0); - G4int Z = (G4int)elm->GetZ(); + G4int Z = elm->GetZasInt(); G4double outcomingPhotonCosTheta = GenerateCosTheta(photonEnergy0, Z); G4double outcomingPhotonPhi = GeneratePhi(outcomingPhotonCosTheta); - G4double beta=GeneratePolarizationAngle(); + G4double beta = GeneratePolarizationAngle(); // incomingPhoton reference frame: // z = versor parallel to the incomingPhotonDirection @@ -295,7 +290,8 @@ void G4LivermorePolarizedRayleighModel::SampleSecondaries(std::vectorProposeMomentumDirection(zPrime); fParticleChange->ProposePolarization(outcomingPhotonPolarization); fParticleChange->SetProposedKineticEnergy(photonEnergy0); - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -G4double G4LivermorePolarizedRayleighModel::GenerateCosTheta(G4double incomingPhotonEnergy, G4int zAtom) const +G4double G4LivermorePolarizedRayleighModel::GenerateCosTheta(G4double incomingPhotonEnergy, G4int Z) const { // d sigma k0 // --------- = r0^2 * pi * F^2(x, Z) * ( 2 - sin^2 theta) * std::sin (theta), x = ---- std::sin(theta/2) @@ -338,15 +334,16 @@ G4double G4LivermorePolarizedRayleighModel::GenerateCosTheta(G4double incomingPh // On pcgeant2 the time is ~ 1 s for k0 ~ 1 MeV on the oxygen element. A 100 GeV // event will take ~ 10 hours. // - // On the avarage the inner loop does 1.5 iterations before exiting - const G4double xFactor = (incomingPhotonEnergy*cm)/(h_Planck*c_light); + // On the avarage the inner loop does 1.5 iterations before exiting + const G4double xxfact = CLHEP::cm/(CLHEP::h_Planck*CLHEP::c_light); + const G4double xFactor = incomingPhotonEnergy*xxfact; G4double cosTheta; G4double fCosTheta; G4double x; G4double fValue; - if (incomingPhotonEnergy > 5.*MeV) + if (incomingPhotonEnergy > 5.*CLHEP::MeV) { cosTheta = 1.; } @@ -364,12 +361,12 @@ G4double G4LivermorePolarizedRayleighModel::GenerateCosTheta(G4double incomingPh x = xFactor*std::sqrt((1.-cosTheta)/2.); if (x > 1.e+005) - fValue = formFactorData->FindValue(x, zAtom-1); + fValue = formFactorData[Z]->Value(x); else - fValue = formFactorData->FindValue(0., zAtom-1); + fValue = formFactorData[Z]->Value(0.); - fValue/=zAtom; - fValue*=fValue; + fValue /= Z; + fValue *= fValue; } while(fValue < G4UniformRand()); } @@ -396,7 +393,7 @@ G4double G4LivermorePolarizedRayleighModel::GeneratePhi(G4double cosTheta) const do { - phi = twopi * G4UniformRand(); + phi = CLHEP::twopi * G4UniformRand(); cosPhi = std::cos(phi); phiProbability= 1. - sin2Theta*cosPhi*cosPhi; } @@ -431,7 +428,7 @@ G4ThreeVector G4LivermorePolarizedRayleighModel::GetPhotonPolarization(const G4D G4ThreeVector e1(photonMomentumDirection.orthogonal().unit()); G4ThreeVector e2(photonMomentumDirection.cross(e1).unit()); - G4double angle(G4UniformRand() * twopi); + G4double angle(G4UniformRand() * CLHEP::twopi); e1*=std::cos(angle); e2*=std::sin(angle); @@ -450,10 +447,10 @@ G4ThreeVector G4LivermorePolarizedRayleighModel::GetPhotonPolarization(const G4D //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void G4LivermorePolarizedRayleighModel::InitialiseForElement(const G4ParticleDefinition*, - G4int Z) - { - G4AutoLock l(&LivermorePolarizedRayleighModelMutex); - if(!dataCS[Z]) { ReadData(Z); } - l.unlock(); - } +void G4LivermorePolarizedRayleighModel::InitialiseForElement( + const G4ParticleDefinition*, G4int Z) +{ + G4AutoLock l(&LivermorePolarizedRayleighModelMutex); + if(nullptr == dataCS[Z]) { ReadData(Z); } + l.unlock(); +} diff --git a/source/processes/electromagnetic/lowenergy/src/G4LivermoreRayleighModel.cc b/source/processes/electromagnetic/lowenergy/src/G4LivermoreRayleighModel.cc index e1afb0ec68..80f39e5a24 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4LivermoreRayleighModel.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4LivermoreRayleighModel.cc @@ -31,6 +31,7 @@ #include "G4LivermoreRayleighModel.hh" #include "G4SystemOfUnits.hh" #include "G4RayleighAngularGenerator.hh" +#include "G4EmParameters.hh" #include "G4AutoLock.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -43,10 +44,10 @@ namespace { G4Mutex LivermoreRayleighModelMutex = G4MUTEX_INITIALIZER; } G4PhysicsFreeVector* G4LivermoreRayleighModel::dataCS[] = {nullptr}; G4LivermoreRayleighModel::G4LivermoreRayleighModel() - :G4VEmModel("LivermoreRayleigh"),isInitialised(false) + :G4VEmModel("LivermoreRayleigh"),maxZ(100),isInitialised(false) { fParticleChange = nullptr; - lowEnergyLimit = 10 * eV; + lowEnergyLimit = 10 * CLHEP::eV; SetAngularDistribution(new G4RayleighAngularGenerator()); @@ -67,11 +68,14 @@ G4LivermoreRayleighModel::G4LivermoreRayleighModel() G4LivermoreRayleighModel::~G4LivermoreRayleighModel() { - if(IsMaster()) { - for(G4int i=0; iGetTableSize(); - - for(G4int i=0; iGetZasInt()); + if(dataCS[Z] == nullptr) { - const G4MaterialCutsCouple* couple = - theCoupleTable->GetMaterialCutsCouple(i); - const G4Material* material = couple->GetMaterial(); - const G4ElementVector* theElementVector = material->GetElementVector(); - G4int nelm = material->GetNumberOfElements(); - - for (G4int j=0; jGetZasInt(); - if(Z < 1) { Z = 1; } - else if(Z > maxZ) { Z = maxZ; } - if( (!dataCS[Z]) ) { ReadData(Z, path); } - } + ReadData(Z, path); } + } } if(isInitialised) { return; } fParticleChange = GetParticleChangeForGamma(); @@ -141,14 +136,14 @@ void G4LivermoreRayleighModel::ReadData(size_t Z, const char* path) << G4endl; } - if(dataCS[Z]) { return; } + if(nullptr != dataCS[Z]) { return; } const char* datadir = path; - if(!datadir) + if(datadir == nullptr) { datadir = std::getenv("G4LEDATA"); - if(!datadir) + if(datadir == nullptr) { G4Exception("G4LivermoreRayleighModelModel::ReadData()","em0006", FatalException, @@ -159,7 +154,12 @@ void G4LivermoreRayleighModel::ReadData(size_t Z, const char* path) dataCS[Z] = new G4PhysicsFreeVector(); std::ostringstream ostCS; - ostCS << datadir << "/livermore/rayl/re-cs-" << Z <<".dat"; + if(G4EmParameters::Instance()->LivermoreDataDir() == "livermore"){ + ostCS << datadir << "/livermore/rayl/re-cs-" << Z <<".dat"; + }else{ + ostCS << datadir << "/epics2017/rayl/re-cs-" << Z <<".dat"; + } + std::ifstream finCS(ostCS.str().c_str()); if( !finCS .is_open() ) @@ -205,10 +205,10 @@ G4double G4LivermoreRayleighModel::ComputeCrossSectionPerAtom( // if element was not initialised // do initialisation safely for MT mode - if(!pv) { + if(nullptr == pv) { InitialiseForElement(0, intZ); pv = dataCS[intZ]; - if(!pv) { return xs; } + if(nullptr == pv) { return xs; } } G4int n = pv->GetVectorLength() - 1; @@ -219,7 +219,7 @@ G4double G4LivermoreRayleighModel::ComputeCrossSectionPerAtom( xs = pv->Value(e)/(e*e); } - if(verboseLevel > 0) + if(verboseLevel > 1) { G4cout << "****** DEBUG: tcs value for Z=" << Z << " at energy (MeV)=" << e << G4endl; @@ -268,7 +268,7 @@ G4LivermoreRayleighModel::InitialiseForElement(const G4ParticleDefinition*, G4int Z) { G4AutoLock l(&LivermoreRayleighModelMutex); - if(!dataCS[Z]) { ReadData(Z); } + if(nullptr == dataCS[Z]) { ReadData(Z); } l.unlock(); } diff --git a/source/processes/electromagnetic/lowenergy/src/G4MicroElecElastic.cc b/source/processes/electromagnetic/lowenergy/src/G4MicroElecElastic.cc index 2b3b475ae2..ee85fcc456 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4MicroElecElastic.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4MicroElecElastic.cc @@ -37,6 +37,7 @@ #include "G4MicroElecElastic.hh" #include "G4DummyModel.hh" #include "G4SystemOfUnits.hh" +#include "G4LowEnergyEmProcessSubType.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -46,7 +47,7 @@ G4MicroElecElastic::G4MicroElecElastic(const G4String& processName, G4ProcessType type):G4VEmProcess (processName, type), isInitialised(false) { - SetProcessSubType(51); + SetProcessSubType(fLowEnergyElastic); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/lowenergy/src/G4MicroElecInelastic.cc b/source/processes/electromagnetic/lowenergy/src/G4MicroElecInelastic.cc index 96b1052612..0866a13ede 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4MicroElecInelastic.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4MicroElecInelastic.cc @@ -47,6 +47,7 @@ #include "G4Proton.hh" #include "G4GenericIon.hh" #include "G4Alpha.hh" +#include "G4LowEnergyEmProcessSubType.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -56,7 +57,7 @@ G4MicroElecInelastic::G4MicroElecInelastic(const G4String& processName, G4ProcessType type) : G4VEmProcess (processName, type), isInitialised(false) { - SetProcessSubType(53); + SetProcessSubType(fLowEnergyIonisation); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/lowenergy/src/G4MicroElecInelasticModel_new.cc b/source/processes/electromagnetic/lowenergy/src/G4MicroElecInelasticModel_new.cc index 394881d2c3..5423770a09 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4MicroElecInelasticModel_new.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4MicroElecInelasticModel_new.cc @@ -373,9 +373,9 @@ void G4MicroElecInelasticModel_new::Initialise(const G4ParticleDefinition* parti eIncidentEnergyStorage[mat] = eTdummyVec; //Cleanup support vectors - delete eProbaShellMap; - delete eDiffCrossSectionData; - delete eNrjTransfData; + // delete eProbaShellMap; + // delete eDiffCrossSectionData; + // delete eNrjTransfData; } // *** PROTON @@ -476,10 +476,10 @@ void G4MicroElecInelasticModel_new::Initialise(const G4ParticleDefinition* parti pIncidentEnergyStorage[mat] = pTdummyVec; //Cleanup support vectors - delete pNrjTransfData; - delete eVecm; - delete pDiffCrossSectionData; - delete pProbaShellMap; + // delete pNrjTransfData; + // delete eVecm; + // delete pDiffCrossSectionData; + // delete pProbaShellMap; } tableTCS[mat] = tableData; } diff --git a/source/processes/electromagnetic/lowenergy/src/G4MicroElecLOPhononScattering.cc b/source/processes/electromagnetic/lowenergy/src/G4MicroElecLOPhononScattering.cc index 822b44da43..a6d6354454 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4MicroElecLOPhononScattering.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4MicroElecLOPhononScattering.cc @@ -57,6 +57,7 @@ #include "G4MicroElecLOPhononScattering.hh" #include "G4DummyModel.hh" #include "G4SystemOfUnits.hh" +#include "G4LowEnergyEmProcessSubType.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -67,7 +68,7 @@ G4MicroElecLOPhononScattering::G4MicroElecLOPhononScattering( :G4VEmProcess(processName, type), isInitialised(false) { - SetProcessSubType(51); + SetProcessSubType(fLowEnergyElastic); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/lowenergy/src/G4MicroElecSurface.cc b/source/processes/electromagnetic/lowenergy/src/G4MicroElecSurface.cc index 3ac36a227e..939d785fde 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4MicroElecSurface.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4MicroElecSurface.cc @@ -54,6 +54,7 @@ #include "G4PhysicalConstants.hh" #include "G4EmProcessSubType.hh" #include "G4GeometryTolerance.hh" +#include "G4EmProcessSubType.hh" #include "G4SystemOfUnits.hh" @@ -70,7 +71,7 @@ G4MicroElecSurface::G4MicroElecSurface(const G4String& processName,G4ProcessType } isInitialised=false; - SetProcessSubType(25); + SetProcessSubType(fSurfaceReflection); theStatus = UndefinedSurf; material1 = nullptr; diff --git a/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlungAngular.cc b/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlungAngular.cc index 53ad0395f7..ad0bfe88a7 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlungAngular.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlungAngular.cc @@ -89,9 +89,10 @@ void G4PenelopeBremsstrahlungAngular::ClearTables() for (auto j=fLorentzTables1->begin(); j != fLorentzTables1->end(); ++j) { G4PhysicsTable* tab = j->second; - //tab->clearAndDestroy(); + tab->clearAndDestroy(); delete tab; } + fLorentzTables1->clear(); delete fLorentzTables1; fLorentzTables1 = nullptr; } @@ -101,8 +102,10 @@ void G4PenelopeBremsstrahlungAngular::ClearTables() for (auto j=fLorentzTables2->begin(); j != fLorentzTables2->end(); ++j) { G4PhysicsTable* tab = j->second; + tab->clearAndDestroy(); delete tab; } + fLorentzTables2->clear(); delete fLorentzTables2; fLorentzTables2 = nullptr; } @@ -214,8 +217,8 @@ void G4PenelopeBremsstrahlungAngular::PrepareTables(const G4Material* material,G //fill vectors for (k=0;kPutValue(k,pZ[k],G4Log(fQQ1[k][i][j])); - QQ2vector->PutValue(k,pZ[k],fQQ2[k][i][j]); + QQ1vector->PutValues(k,pZ[k],G4Log(fQQ1[k][i][j])); + QQ2vector->PutValues(k,pZ[k],fQQ2[k][i][j]); } //Filled: now calculate derivatives QQ1vector->FillSecondDerivatives(); @@ -254,8 +257,8 @@ void G4PenelopeBremsstrahlungAngular::PrepareTables(const G4Material* material,G for (j=0;jPutValue(j,pK[j],G4Log(Q1[i][j])); //logarithmic - Q2vector->PutValue(j,pK[j],Q2[i][j]); + Q1vector->PutValues(j,pK[j],G4Log(Q1[i][j])); //logarithmic + Q2vector->PutValues(j,pK[j],Q2[i][j]); } for (j=0;jPutValue(i,betas[i],Q1E[i][j]); - thevec2->PutValue(i,betas[i],Q2E[i][j]); + thevec->PutValues(i,betas[i],Q1E[i][j]); + thevec2->PutValues(i,betas[i],Q2E[i][j]); } //Vectors are filled: calculate derivatives thevec->FillSecondDerivatives(); diff --git a/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlungFS.cc b/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlungFS.cc index cfcffcbb69..d7bf929b86 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlungFS.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlungFS.cc @@ -102,10 +102,11 @@ void G4PenelopeBremsstrahlungFS::ClearTables(G4bool isMaster) { for (auto& item : (*fReducedXSTable)) { - //G4PhysicsTable* tab = item.second; - //tab->clearAndDestroy(); - delete item.second; + G4PhysicsTable* tab = item.second; + tab->clearAndDestroy(); + delete tab; } + fReducedXSTable->clear(); delete fReducedXSTable; fReducedXSTable = nullptr; } @@ -114,10 +115,11 @@ void G4PenelopeBremsstrahlungFS::ClearTables(G4bool isMaster) { for (auto& item : (*fSamplingTable)) { - //G4PhysicsTable* tab = item.second; - // tab->clearAndDestroy(); - delete item.second; + G4PhysicsTable* tab = item.second; + tab->clearAndDestroy(); + delete tab; } + fSamplingTable->clear(); delete fSamplingTable; fSamplingTable = nullptr; } @@ -335,7 +337,7 @@ void G4PenelopeBremsstrahlungFS::BuildScaledXSTable(const G4Material* material, G4double aValue = (*tempMatrix)[ie*fNBinsX+ix]; if (aValue < 1e-20*millibarn) //protection against log(0) aValue = 1e-20*millibarn; - theVec->PutValue(ie+1,logene,G4Log(aValue)); + theVec->PutValues(ie+1,logene,G4Log(aValue)); } //Add fake point at 1 eV using an extrapolation with the derivative //at the first valid point (Penelope approach) @@ -343,7 +345,7 @@ void G4PenelopeBremsstrahlungFS::BuildScaledXSTable(const G4Material* material, G4double log1eV = G4Log(1*eV); G4double val1eV = (*theVec)[1]+derivative*(log1eV-theVec->Energy(1)); //fake point at very low energy - theVec->PutValue(0,log1eV,val1eV); + theVec->PutValues(0,log1eV,val1eV); } std::pair theKey = std::make_pair(material,cut); fReducedXSTable->insert(std::make_pair(theKey,thePhysicsTable)); @@ -555,7 +557,7 @@ void G4PenelopeBremsstrahlungFS::InitializeEnergySampling(const G4Material* mate (G4PhysicsFreeVector*) ((*thePhysicsTable)[ie]); //Fill the table G4double value = 0; //first value - theVec->PutValue(0,theXGrid[0],value); + theVec->PutValues(0,theXGrid[0],value); for (size_t ix=1;ixPutValue(ix,theXGrid[ix],value); + theVec->PutValues(ix,theXGrid[ix],value); } //fill the PB vector G4double xc = cut/theEGrid[ie]; @@ -587,7 +589,7 @@ void G4PenelopeBremsstrahlungFS::InitializeEnergySampling(const G4Material* mate G4double pbval = (xc<=1) ? GetMomentumIntegral(tempData,xc,-1) : GetMomentumIntegral(tempData,1.0,-1); - thePBvec->PutValue(ie,theEGrid[ie],pbval); + thePBvec->PutValues(ie,theEGrid[ie],pbval); delete[] tempData; } @@ -671,13 +673,13 @@ G4double G4PenelopeBremsstrahlungFS::SampleGammaEnergy(G4double energy,const G4M { G4double val = (*theVec1)[iloop]+(((*theVec2)[iloop]-(*theVec1)[iloop]))* (energy-theEGrid[eBin])/(theEGrid[eBin+1]-theEGrid[eBin]); - theTempVec->PutValue(iloop,theXGrid[iloop],val); + theTempVec->PutValues(iloop,theXGrid[iloop],val); } } else //first or last bin, no interpolation { for (size_t iloop=0;iloopPutValue(iloop,theXGrid[iloop],(*theVec1)[iloop]); + theTempVec->PutValues(iloop,theXGrid[iloop],(*theVec1)[iloop]); } //Start the game diff --git a/source/processes/electromagnetic/lowenergy/src/G4PenelopeCrossSection.cc b/source/processes/electromagnetic/lowenergy/src/G4PenelopeCrossSection.cc index ecb15352ed..11ede20393 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4PenelopeCrossSection.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4PenelopeCrossSection.cc @@ -39,6 +39,7 @@ #include "G4PhysicsFreeVector.hh" #include "G4DataVector.hh" #include "G4Exp.hh" +#include "G4Log.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo... G4PenelopeCrossSection::G4PenelopeCrossSection(size_t nPointsE,size_t nShells) : @@ -101,22 +102,22 @@ G4PenelopeCrossSection::~G4PenelopeCrossSection() //clean up tables if (fShellCrossSections) { - //fShellCrossSections->clearAndDestroy(); + fShellCrossSections->clearAndDestroy(); delete fShellCrossSections; } if (fShellNormalizedCrossSections) { - //fShellNormalizedCrossSections->clearAndDestroy(); + fShellNormalizedCrossSections->clearAndDestroy(); delete fShellNormalizedCrossSections; } if (fSoftCrossSections) { - //fSoftCrossSections->clearAndDestroy(); + fSoftCrossSections->clearAndDestroy(); delete fSoftCrossSections; } if (fHardCrossSections) { - //fHardCrossSections->clearAndDestroy(); + fHardCrossSections->clearAndDestroy(); delete fHardCrossSections; } } @@ -150,32 +151,32 @@ void G4PenelopeCrossSection::AddCrossSectionPoint(size_t binNumber,G4double ener //XS0 G4double val = G4Log(std::max(XS0,1e-42*cm2)); //avoid log(0) - theVector->PutValue(binNumber,logEne,val); + theVector->PutValues(binNumber,logEne,val); //XS1 theVector = (G4PhysicsFreeVector*) (*fSoftCrossSections)[1]; val = G4Log(std::max(XS1,1e-42*eV*cm2)); //avoid log(0) - theVector->PutValue(binNumber,logEne,val); + theVector->PutValues(binNumber,logEne,val); //XS2 theVector = (G4PhysicsFreeVector*) (*fSoftCrossSections)[2]; val = G4Log(std::max(XS2,1e-42*eV*eV*cm2)); //avoid log(0) - theVector->PutValue(binNumber,logEne,val); + theVector->PutValues(binNumber,logEne,val); //XH0 theVector = (G4PhysicsFreeVector*) (*fHardCrossSections)[0]; val = G4Log(std::max(XH0,1e-42*cm2)); //avoid log(0) - theVector->PutValue(binNumber,logEne,val); + theVector->PutValues(binNumber,logEne,val); //XH1 theVector = (G4PhysicsFreeVector*) (*fHardCrossSections)[1]; val = G4Log(std::max(XH1,1e-42*eV*cm2)); //avoid log(0) - theVector->PutValue(binNumber,logEne,val); + theVector->PutValues(binNumber,logEne,val); //XH2 theVector = (G4PhysicsFreeVector*) (*fHardCrossSections)[2]; val = G4Log(std::max(XH2,1e-42*eV*eV*cm2)); //avoid log(0) - theVector->PutValue(binNumber,logEne,val); + theVector->PutValues(binNumber,logEne,val); return; } @@ -216,7 +217,7 @@ void G4PenelopeCrossSection::AddShellCrossSectionPoint(size_t binNumber, } G4double logEne = G4Log(energy); G4double val = G4Log(std::max(xs,1e-42*cm2)); //avoid log(0) - theVector->PutValue(binNumber,logEne,val); + theVector->PutValues(binNumber,logEne,val); return; } @@ -447,7 +448,7 @@ void G4PenelopeCrossSection::NormalizeShellCrossSections() G4double previousValue = (*theFullVec)[i]; //log(XS) G4double logEnergy = theFullVec->GetLowEdgeEnergy(i); //log(XS/normFactor) = log(XS) - log(normFactor) - theVec->PutValue(i,logEnergy,previousValue-logNormFactor); + theVec->PutValues(i,logEnergy,previousValue-logNormFactor); } } fIsNormalized = true; diff --git a/source/processes/electromagnetic/lowenergy/src/G4PenelopePhotoElectricModel.cc b/source/processes/electromagnetic/lowenergy/src/G4PenelopePhotoElectricModel.cc index 7e307e1b5f..9fedc49138 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4PenelopePhotoElectricModel.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4PenelopePhotoElectricModel.cc @@ -104,7 +104,7 @@ G4PenelopePhotoElectricModel::~G4PenelopePhotoElectricModel() for(G4int i=0; i<=fMaxZ; ++i) { if(fLogAtomicShellXS[i]) { - //fLogAtomicShellXS[i]->clearAndDestroy(); + fLogAtomicShellXS[i]->clearAndDestroy(); delete fLogAtomicShellXS[i]; fLogAtomicShellXS[i] = nullptr; } diff --git a/source/processes/electromagnetic/lowenergy/src/G4RayleighAngularGenerator.cc b/source/processes/electromagnetic/lowenergy/src/G4RayleighAngularGenerator.cc index 37f19033b5..2c827e2487 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4RayleighAngularGenerator.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4RayleighAngularGenerator.cc @@ -143,131 +143,129 @@ G4RayleighAngularGenerator::SampleDirection(const G4DynamicParticle* dp, } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... - const G4double -G4RayleighAngularGenerator::PP0[101] = { 0, -0, 2., 5.21459, 10.2817, 3.66207, 3.63903, 3.71155, 36.5165, 3.43548, 3.40045, // 1-10 -2.87811, 3.35541, 3.21141, 2.95234, 3.02524, 126.146, 175.044, 162, 296.833, 300.994, // 11-20 -373.186, 397.823, 430.071, 483.293, 2.14885, 335.553, 505.422, 644.739, 737.017, 707.575, // 21-30 -3.8094, 505.957, 4.10347, 574.665, 15.5277, 10.0991, 4.95013, 16.3391, 6.20836, 3.52767, // 31-40 -2.7763, 2.19565, 12.2802, 965.741, 1011.09, 2.85583, 3.65673, 225.777, 1.95284, 15.775, // 41-50 -39.9006, 3.7927, 64.7339, 1323.91, 3.73723, 2404.54, 28.3408, 29.9869, 217.128, 71.7138, // 51-60 -255.42, 134.495, 3364.59, 425.326, 449.405, 184.046, 3109.04, 193.133, 3608.48, 152.967, // 61-70 -484.517, 422.591, 423.518, 393.404, 437.172, 432.356, 478.71, 455.097, 495.237, 417.8, // 71-80 -3367.95, 3281.71, 3612.56, 3368.73, 3407.46, 40.2866, 641.24, 826.44, 3579.13, 4916.44, // 81-90 -930.184, 887.945, 3490.96, 4058.6, 3068.1, 3898.32, 1398.34, 5285.18, 1, 872.368, // 91-100 + G4RayleighAngularGenerator::PP0[101] = {0, + -2.477067493e-06, 3.308728278e+00, 5.214590000e+00, 1.018853220e+01, 3.668594783e+00, 1.540100708e+01, 3.709326016e+00, 3.694224007e+00, 3.545302543e+00, 3.487912341e+00, // 1-10 + 3.407539119e+00, 3.387258718e+00, 3.230544865e+00, 3.013493175e+00, 2.572039815e+00, 1.792301548e+00, 1.701680300e+00, 1.601363893e+02, 2.968330000e+02, 3.065649816e+02, // 11-20 + 3.731860000e+02, 4.201934230e+02, 4.612920338e+02, 4.861184287e+02, 3.101874240e+02, 3.351026594e+02, 6.367362521e+02, 3.888087526e+02, 7.588301541e+02, 8.158625388e+02, // 21-30 + 4.773566612e+02, 5.084376201e+02, 5.413677298e+02, 5.744903249e+02, 3.743351693e+00, 1.009910000e+01, 6.816358014e+02, 7.187067112e+02, 7.580649444e+02, 4.414330698e+00, // 31-40 + 2.972874756e+00, 2.740289935e+00, 2.507487315e+00, 9.657410000e+02, 1.011090000e+03, 2.130702941e+00, 6.533143308e+00, 1.037000000e+03, 2.288698564e+00, 4.244459075e+00, // 41-50 + 6.127527681e+01, 3.792700000e+00, 4.798110886e+00, 1.312500008e+03, 1.889593891e+00, 2.404540000e+03, 3.352713210e+01, 3.721985093e+01, 1.800704938e+02, 1.752112119e+03, // 51-60 + 1.194981340e+02, 2.167522747e+02, 3.364590000e+03, 6.311743615e+01, 2.506979318e+02, 8.928490874e+01, 2.021000018e+03, 1.288577408e+02, 3.286469325e+03, 1.437863346e+02, // 61-70 + 1.431016078e+02, 1.359161828e+02, 3.670456078e+02, 3.934040000e+02, 3.175509489e+02, 3.262959885e+03, 3.021668154e+03, 3.252098480e+02, 3.477962301e+02, 3.363519614e+02, // 71-80 + 3.340399767e+02, 3.011038509e+03, 3.485497941e+02, 3.657731951e+02, 3.251994160e+03, 3.987097887e+02, 3.891269496e+03, 4.223467334e+02, 4.009941534e+02, 1.380789588e+00, // 81-90 + 2.791527615e+00, 3.755804160e+03, 4.863705847e+02, 5.464276392e+02, 7.089644571e+02, 7.445117785e+02, 2.037086948e+00, 1.065528514e+03, 1.133135197e+00, 3.269427358e+03 // 91-100 }; const G4double -G4RayleighAngularGenerator::PP1[101] = { 0, -1., 2., 3.7724, 2.17924, 11.9967, 17.7772, 23.5265, 23.797, 39.9937, 46.7748, // 1-10 -60, 68.6446, 81.7887, 98, 112, 128, 96.7939, 162, 61.5575, 96.4218, // 11-20 -65.4084, 83.3079, 96.2889, 90.123, 312, 338, 181.943, 94.3868, 54.5084, 132.819, // 21-30 -480, 512, 544, 578, 597.472, 647.993, 682.009, 722, 754.885, 799.974, // 31-40 -840, 882, 924, 968, 1012, 1058, 1104, 1151.95, 1199.05, 1250, // 41-50 -1300, 1352, 1404, 1458, 1512, 729.852, 1596.66, 1682, 1740, 1800, // 51-60 -1605.79, 1787.51, 603.151, 2048, 2112, 1993.95, 334.907, 2312, 885.149, 2337.19, // 61-70 -2036.48, 2169.41, 2241.49, 2344.6, 2812, 2888, 2964, 2918.04, 2882.97, 2938.74, // 71-80 -2716.13, 511.66, 581.475, 594.305, 672.232, 3657.71, 3143.76, 3045.56, 3666.7, 1597.84, // 81-90 -3428.87, 3681.22, 1143.31, 1647.17, 1444.9, 1894.33, 3309.12, 2338.59, 4900, 4856.61, // 91-100 + G4RayleighAngularGenerator::PP1[101] = {0, + 1.000002477e+00, 6.912717221e-01, 3.772400000e+00, 3.673669324e+00, 1.199955472e+01, 3.658311128e+00, 2.130780048e+01, 2.833297837e+01, 3.748184285e+01, 4.656971845e+01, // 1-10 + 5.759246095e+01, 6.861274506e+01, 8.376139862e+01, 9.799999987e+01, 1.104279602e+02, 1.279999999e+02, 1.439999998e+02, 1.620000000e+02, 6.155750000e+01, 9.069690514e+01, // 11-20 + 6.540840000e+01, 6.120116992e+01, 6.540487635e+01, 8.701154587e+01, 3.120000000e+02, 3.380000000e+02, 8.971041364e+01, 3.920000000e+02, 7.927032750e+01, 8.129623999e+01, // 21-30 + 4.800000000e+02, 5.120000000e+02, 5.440000000e+02, 5.780000000e+02, 6.119999952e+02, 6.479930000e+02, 6.839999993e+02, 7.219999975e+02, 7.600000000e+02, 7.999965590e+02, // 31-40 + 8.399999990e+02, 8.819999639e+02, 9.239993520e+02, 9.680000000e+02, 1.012000000e+03, 1.055869297e+03, 1.102904035e+03, 1.150000007e+02, 1.199999994e+03, 1.249999690e+03, // 41-50 + 1.300000000e+03, 1.352000000e+03, 1.400242211e+03, 1.455000001e+02, 1.511110411e+03, 7.298520000e+02, 1.624000000e+03, 1.644780150e+03, 1.739999988e+03, 1.800000000e+03, // 51-60 + 1.859999972e+03, 1.705247726e+03, 6.031510000e+02, 2.047999979e+03, 2.099526330e+03, 2.088715091e+03, 2.240000003e+02, 2.183146437e+03, 2.380000102e+02, 2.449999497e+03, // 61-70 + 2.519999640e+03, 2.591999669e+03, 2.317935577e+03, 2.344600000e+03, 2.811999969e+03, 2.378704485e+03, 2.614304773e+03, 3.041994341e+03, 3.065168794e+03, 3.092144649e+03, // 71-80 + 3.279999955e+03, 3.362000000e+03, 3.443996426e+03, 3.190843165e+03, 3.610058546e+02, 3.299292785e+03, 3.283959104e+03, 3.507767814e+03, 3.729069400e+03, 4.049999721e+03, // 81-90 + 4.139900637e+03, 4.761958553e+02, 3.838629680e+03, 3.871572368e+03, 4.511999370e+03, 3.863489473e+03, 4.703865705e+03, 4.801999723e+03, 4.899867488e+03, 4.999989627e+03 // 91-100 }; const G4double -G4RayleighAngularGenerator::PP2[101] = { 0, -0, 0, 0.0130091, 3.53906, 9.34125, 14.5838, 21.7619, 3.68644, 37.5709, 49.8248, // 1-10 -58.1219, 72, 83.9999, 95.0477, 109.975, 1.85351, 17.1623, 0, 2.60927, 2.58422, // 11-20 -2.4053, 2.86948, 2.63999, 2.58417, 310.851, 2.44683, 41.6348, 44.8739, 49.4746, 59.6053, // 21-30 -477.191, 6.04261, 540.897, 3.33531, 612, 637.908, 682.041, 705.661, 759.906, 796.498, // 31-40 -838.224, 879.804, 912.72, 2.25892, 1.90993, 1055.14, 1101.34, 926.275, 1200, 1234.23, // 41-50 -1261.1, 1348.21, 1340.27, 134.085, 1509.26, 1.60851, 1624, 1652.01, 1523.87, 1728.29, // 51-60 -1859.79, 1922, 1.25916, 1622.67, 1663.6, 2178, 1045.05, 2118.87, 267.371, 2409.84, // 61-70 -2520, 2592, 2664, 2738, 2375.83, 2455.64, 2486.29, 2710.86, 2862.79, 3043.46, // 71-80 -476.925, 2930.63, 2694.96, 3092.96, 3145.31, 3698, 3784, 3872, 675.166, 1585.71, // 81-90 -3921.95, 3894.83, 4014.73, 3130.23, 4512, 3423.35, 4701.53, 1980.23, 4900, 4271.02, // 91-100 + G4RayleighAngularGenerator::PP2[101] = {0, + 0.000000000e+00, 0.000000000e+00, 1.300910000e-02, 2.137798478e+00, 9.331850497e+00, 1.694068179e+01, 2.398287351e+01, 3.197279763e+01, 3.997285461e+01, 4.994236921e+01, // 1-10 + 5.999999993e+01, 7.199999622e+01, 8.200805651e+01, 9.498650695e+01, 1.120000000e+02, 1.262076986e+02, 1.432983199e+02, 1.863610653e+00, 2.609270000e+00, 2.738113251e+00, // 11-20 + 2.405300000e+00, 2.605407111e+00, 2.303089878e+00, 2.870025399e+00, 2.812575977e+00, 2.897340596e+00, 2.553334297e+00, 3.191247422e+00, 2.899518400e+00, 2.841221189e+00, // 21-30 + 3.643338776e+00, 3.562379948e+00, 3.632270214e+00, 3.509675162e+00, 6.092566531e+02, 6.379080000e+02, 3.364199322e+00, 3.293291322e+00, 2.935055634e+00, 7.955891103e+02, // 31-40 + 8.380271263e+02, 8.792597462e+02, 9.224931607e+02, 2.258920000e+00, 1.909930000e+00, 1.058000000e+03, 1.099562822e+03, 1.151999999e+03, 1.198711308e+03, 1.245755851e+03, // 41-50 + 1.239724724e+03, 1.348210000e+03, 1.403959678e+03, 1.457999992e+03, 1.511999996e+03, 1.608510000e+00, 1.591472868e+03, 1.681999999e+03, 1.560929519e+03, 4.788788135e+01, // 51-60 + 1.741501894e+03, 1.922000000e+03, 1.259160000e+00, 1.984882585e+03, 1.874775739e+03, 2.178000000e+03, 2.243999981e+03, 2.311995822e+03, 1.236530665e+03, 2.306214168e+03, // 61-70 + 2.377898752e+03, 2.456084148e+03, 2.644018816e+03, 2.738000000e+03, 2.495449082e+03, 1.343356300e+02, 2.930270735e+02, 2.716795811e+03, 2.828034975e+03, 2.971503390e+03, // 71-80 + 2.946960068e+03, 3.509614912e+02, 3.096453780e+03, 3.499383640e+03, 3.611999985e+03, 3.697997426e+03, 3.937713997e+02, 3.813885452e+03, 3.790936446e+03, 4.048619490e+03, // 81-90 + 4.138307836e+03, 4.231999985e+03, 4.323999735e+03, 4.417999993e+03, 3.804036173e+03, 4.607998748e+03, 4.703097208e+03, 3.736471763e+03, 4.899999376e+03, 1.730583016e+03 // 91-100 }; const G4double -G4RayleighAngularGenerator::PP3[101] = { 0, -1.53728e-16, 2.95909e-16, 1.95042e-15, 6.24521e-16, 4.69459e-17, 3.1394e-17, 2.38808e-17, 3.59428e-16, 1.2947e-17, 1.01182e-17, // 1-10 -6.99543e-18, 6.5138e-18, 5.24063e-18, 4.12831e-18, 4.22067e-18, 2.12802e-16, 3.27035e-16, 2.27705e-16, 1.86943e-15, 8.10577e-16, // 11-20 -1.80541e-15, 9.32266e-16, 5.93459e-16, 4.93049e-16, 5.03211e-19, 2.38223e-16, 4.5181e-16, 5.34468e-16, 5.16504e-16, 3.0641e-16, // 21-30 -1.24646e-18, 2.13805e-16, 1.21448e-18, 2.02122e-16, 5.91556e-18, 3.4609e-18, 1.39331e-18, 5.47242e-18, 1.71017e-18, 7.92438e-19, // 31-40 -4.72225e-19, 2.74825e-19, 4.02137e-18, 1.6662e-16, 1.68841e-16, 4.73202e-19, 7.28319e-19, 3.64382e-15, 1.53323e-19, 4.15409e-18, // 41-50 -7.91645e-18, 6.54036e-19, 1.04123e-17, 9.116e-17, 5.97268e-19, 1.23272e-15, 5.83259e-18, 5.42458e-18, 2.20137e-17, 1.19654e-17, // 51-60 -2.3481e-17, 1.53337e-17, 8.38225e-16, 3.40248e-17, 3.50901e-17, 1.95115e-17, 2.91803e-16, 1.98684e-17, 3.59425e-16, 1.54e-17, // 61-70 -3.04174e-17, 2.71295e-17, 2.6803e-17, 2.36469e-17, 2.56818e-17, 2.50364e-17, 2.6818e-17, 2.56229e-17, 2.7419e-17, 2.27442e-17, // 71-80 -1.38078e-15, 1.49595e-15, 1.20023e-16, 1.74446e-15, 1.82836e-15, 5.80108e-18, 3.02324e-17, 3.71029e-17, 1.01058e-16, 4.87707e-16, // 81-90 -4.18953e-17, 4.03182e-17, 1.11553e-16, 9.51125e-16, 2.57569e-15, 1.14294e-15, 2.98597e-15, 5.88714e-16, 1.46196e-20, 1.53226e-15, // 91-100 + G4RayleighAngularGenerator::PP3[101] = {0, + 1.325913011e-16, 4.871957764e-16, 1.950420000e-15, 3.995936773e-16, 4.732524874e-17, 5.469297930e-16, 2.375713373e-17, 1.810463731e-17, 1.336380641e-17, 1.052686533e-17, // 1-10 + 8.030444002e-18, 6.678303405e-18, 5.358234684e-18, 4.335725896e-18, 3.306051079e-18, 1.819679449e-18, 1.228045928e-18, 2.430163362e-16, 1.869430000e-15, 9.951691390e-16, // 11-20 + 1.805410000e-15, 1.568852030e-15, 1.464264654e-15, 4.939313750e-16, 2.361373681e-16, 2.319629775e-16, 4.429138015e-16, 2.283559073e-16, 3.210934122e-16, 2.876037822e-16, // 21-30 + 2.121922892e-16, 2.064234936e-16, 1.996479886e-16, 1.946742248e-16, 8.778017543e-19, 3.460900000e-18, 1.809840754e-16, 1.783125511e-16, 1.722338339e-16, 9.822789565e-19, // 31-40 + 4.605105770e-19, 3.816125471e-19, 3.017537476e-19, 1.666200000e-16, 1.688410000e-16, 1.839402998e-19, 1.246431543e-18, 9.807308372e-17, 1.932399654e-19, 6.865448303e-19, // 41-50 + 9.418934098e-18, 6.540360000e-19, 6.723352605e-19, 1.147797684e-16, 7.975389174e-20, 1.232720000e-15, 5.621737854e-18, 6.015501574e-18, 1.770592320e-17, 1.646956996e-16, // 51-60 + 1.285032193e-17, 1.897941915e-17, 8.382250000e-16, 8.047052107e-18, 1.953322654e-17, 1.048054550e-17, 1.547617945e-15, 1.315449339e-17, 2.966877317e-16, 1.381146328e-17, // 61-70 + 1.351358940e-17, 1.262062535e-17, 2.238342977e-17, 2.364690000e-17, 1.901461934e-17, 2.019852016e-16, 1.258732966e-16, 1.866062124e-17, 1.933265996e-17, 1.869942002e-17, // 71-80 + 1.842791671e-17, 1.006061314e-16, 1.845331171e-17, 1.903270841e-17, 9.716982760e-17, 2.023698895e-17, 1.689153339e-15, 2.047894466e-17, 1.932138801e-17, 1.971060876e-20, // 81-90 + 1.861376691e-19, 8.994366946e-17, 2.168855529e-17, 2.359136120e-17, 2.975661335e-17, 3.035334920e-17, 1.119247839e-19, 4.012940590e-17, 1.467159462e-20, 9.769616225e-17 // 91-100 }; const G4double -G4RayleighAngularGenerator::PP4[101] = { 0, -1.10561e-15, 3.50254e-16, 1.56836e-16, 7.86286e-15, 2.2706e-16, 7.28454e-16, 4.54123e-16, 8.03792e-17, 4.91833e-16, 1.45891e-16, // 1-10 -1.71829e-16, 3.90707e-15, 2.76487e-15, 4.345e-16, 6.80131e-16, 4.04186e-16, 8.95703e-17, 3.32136e-16, 1.3847e-17, 4.16869e-17, // 11-20 -1.37963e-17, 1.96187e-17, 2.93852e-17, 2.46581e-17, 4.49944e-16, 3.80311e-16, 1.62925e-15, 7.52449e-16, 9.45445e-16, 5.47652e-16, // 21-30 -6.89379e-16, 1.37078e-15, 1.22209e-15, 1.13856e-15, 9.06914e-16, 8.77868e-16, 9.70871e-16, 1.8532e-16, 1.69254e-16, 1.14059e-15, // 31-40 -7.90712e-16, 5.36611e-16, 8.27932e-16, 2.4329e-16, 5.82899e-16, 1.97595e-16, 1.96263e-16, 1.73961e-16, 1.62174e-16, 5.31143e-16, // 41-50 -5.29731e-16, 4.1976e-16, 4.91842e-16, 4.67937e-16, 4.32264e-16, 6.91046e-17, 1.62962e-16, 9.87241e-16, 1.04526e-15, 1.05819e-15, // 51-60 -1.10579e-16, 1.49116e-16, 4.61021e-17, 1.5143e-16, 1.53667e-16, 1.67844e-15, 2.7494e-17, 2.31253e-16, 2.27211e-15, 1.33401e-15, // 61-70 -9.02548e-16, 1.77743e-15, 1.76608e-15, 9.45054e-16, 1.06805e-16, 1.06085e-16, 1.01688e-16, 1.0226e-16, 7.7793e-16, 8.0166e-16, // 71-80 -9.18595e-17, 2.73428e-17, 3.01222e-17, 3.09814e-17, 3.39028e-17, 1.49653e-15, 1.19511e-15, 1.40408e-15, 2.37226e-15, 8.35973e-17, // 81-90 -1.4089e-15, 1.2819e-15, 4.96925e-17, 6.04886e-17, 7.39507e-17, 6.6832e-17, 1.09433e-16, 9.61804e-17, 1.38525e-16, 2.49104e-16, // 91-100 + G4RayleighAngularGenerator::PP4[101] = {0, + 1.105926652e-15, 2.260014406e-16, 1.568360000e-16, 7.604704395e-17, 2.874727277e-16, 3.180531750e-17, 3.632331994e-16, 2.720099679e-16, 1.197719851e-16, 1.079438057e-16, // 1-10 + 2.381852183e-15, 3.734413372e-15, 8.391867563e-17, 4.824902206e-16, 1.501401964e-16, 3.852331215e-16, 3.990595815e-16, 3.293279270e-16, 1.384700000e-17, 3.625981107e-17, // 11-20 + 1.379630000e-17, 9.139141296e-18, 1.872408780e-17, 2.203851185e-17, 2.682848134e-16, 2.769206296e-16, 2.418950951e-17, 2.841108885e-16, 1.400094487e-17, 1.387082935e-17, // 21-30 + 5.210034592e-16, 7.614492538e-16, 8.948178869e-16, 9.788323391e-16, 8.671211693e-16, 8.778680000e-16, 1.077256234e-15, 1.679640775e-15, 1.420854572e-15, 7.623342657e-16, // 31-40 + 6.465293663e-16, 3.854995461e-16, 4.894995857e-16, 2.432900000e-16, 5.828990000e-16, 1.609458606e-16, 2.173584371e-16, 1.795526101e-17, 9.530729189e-16, 2.344176851e-16, // 41-50 + 3.105865310e-16, 4.197600000e-16, 1.326321431e-16, 1.773261410e-17, 1.494954852e-16, 6.910460000e-17, 9.139538226e-16, 1.600844678e-16, 7.627976232e-16, 6.798418289e-16, // 51-60 + 7.097022036e-16, 1.115122840e-16, 4.610210000e-17, 7.337639645e-16, 3.348557496e-16, 1.736562533e-16, 1.915871639e-17, 1.931338908e-16, 1.974415886e-17, 2.054336404e-16, // 61-70 + 2.003109343e-16, 1.934498511e-16, 1.319008056e-15, 9.450540000e-16, 1.087303394e-16, 1.665148262e-15, 1.202328448e-15, 1.128331221e-15, 8.531572269e-16, 7.408838005e-16, // 71-80 + 1.158662950e-15, 1.374180788e-15, 8.566677765e-16, 9.492940536e-17, 1.870350513e-17, 9.491622217e-17, 8.928257029e-17, 9.336061303e-17, 9.334736660e-17, 4.790157134e-16, // 81-90 + 1.305399034e-16, 2.169990868e-17, 8.372799536e-17, 8.658930267e-17, 8.911500996e-16, 8.860103256e-17, 4.406306122e-16, 6.993638266e-16, 1.349886337e-16, 3.034949291e-16 // 91-100 }; const G4double -G4RayleighAngularGenerator::PP5[101] = { 0, -6.89413e-17, 2.11456e-17, 2.47782e-17, 7.01557e-17, 1.01544e-15, 1.76177e-16, 1.28191e-16, 1.80511e-17, 1.96803e-16, 3.16753e-16, // 1-10 -1.21362e-15, 6.6366e-17, 8.42625e-17, 1.01935e-16, 1.34162e-16, 1.87076e-18, 2.76259e-17, 1.2217e-16, 1.66059e-18, 1.76249e-18, // 11-20 -1.13734e-18, 1.58963e-18, 1.33987e-18, 1.18496e-18, 2.44536e-16, 6.69957e-19, 2.5667e-17, 2.62482e-17, 2.55816e-17, 2.6574e-17, // 21-30 -2.26522e-16, 2.17703e-18, 2.07434e-16, 8.8717e-19, 1.75583e-16, 1.81312e-16, 1.83716e-16, 2.58371e-15, 1.74416e-15, 1.7473e-16, // 31-40 -1.76817e-16, 1.74757e-16, 1.6739e-16, 2.68691e-19, 1.8138e-19, 1.60726e-16, 1.59441e-16, 1.36927e-16, 2.70127e-16, 1.63371e-16, // 41-50 -1.29776e-16, 1.49012e-16, 1.17301e-16, 1.67919e-17, 1.47596e-16, 1.14246e-19, 1.10392e-15, 1.58755e-16, 1.11706e-16, 1.80135e-16, // 51-60 -1.00213e-15, 9.44133e-16, 4.722e-20, 1.18997e-15, 1.16311e-15, 2.31716e-16, 1.86238e-15, 1.53632e-15, 2.45853e-17, 2.08069e-16, // 61-70 -1.08659e-16, 1.29019e-16, 1.24987e-16, 1.07865e-16, 1.03501e-15, 1.05211e-15, 9.38473e-16, 8.66912e-16, 9.3778e-17, 9.91467e-17, // 71-80 -2.58481e-17, 9.72329e-17, 9.77921e-16, 1.02928e-16, 1.01767e-16, 1.81276e-16, 1.07026e-16, 1.11273e-16, 3.25695e-17, 1.77629e-15, // 81-90 -1.18382e-16, 1.111e-16, 1.56996e-15, 8.45221e-17, 3.6783e-16, 1.20652e-16, 3.91104e-16, 3.52282e-15, 4.29979e-16, 1.28308e-16, // 91-100 + G4RayleighAngularGenerator::PP5[101] ={0, + 6.894128600e-17, 2.232031723e-17, 2.477820000e-17, 2.177967522e-15, 1.284829196e-15, 1.823111356e-16, 1.555489343e-16, 1.335924448e-16, 2.114259423e-16, 1.667587557e-16, // 1-10 + 5.490626359e-17, 6.721220587e-17, 2.797861959e-15, 1.006989227e-16, 4.970209967e-16, 2.167639187e-16, 2.319436556e-16, 1.141095767e-18, 1.660590000e-18, 1.909325187e-18, // 11-20 + 1.137340000e-18, 1.172666277e-18, 9.208052526e-19, 1.423664003e-18, 9.502898022e-19, 9.157542056e-19, 1.055368898e-18, 9.370568491e-19, 1.041778157e-18, 9.638088116e-19, // 21-30 + 1.000486545e-18, 8.890635605e-19, 8.866911360e-19, 8.345076503e-19, 1.886536486e-16, 1.813120000e-16, 6.659892285e-19, 6.086335346e-19, 4.868786350e-19, 1.636754844e-16, // 31-40 + 1.673069643e-16, 1.638573610e-16, 1.618391268e-16, 2.686910000e-19, 1.813800000e-19, 2.102345989e-16, 1.318039263e-16, 2.077093130e-16, 1.588911975e-16, 1.515458297e-16, // 41-50 + 1.080904532e-16, 1.490120000e-16, 2.463071192e-16, 5.939133658e-16, 3.046264790e-16, 1.142460000e-19, 1.562245161e-16, 9.001027117e-16, 1.078667444e-16, 7.294347496e-18, // 51-60 + 1.358154769e-16, 8.509795172e-16, 4.722000000e-20, 1.653557513e-16, 9.741638336e-17, 8.121141361e-16, 2.060180430e-16, 1.293242400e-15, 2.817685189e-15, 1.295140057e-15, // 61-70 + 1.325219469e-15, 1.361391001e-15, 1.166226381e-16, 1.078650000e-16, 8.154952090e-16, 1.184682586e-17, 1.781757642e-17, 1.042830884e-16, 9.653409394e-17, 9.620084329e-17, // 71-80 + 9.927188930e-17, 1.933919795e-17, 8.642866554e-17, 1.300494398e-15, 1.573438944e-15, 1.595960704e-15, 1.963662451e-17, 1.824165751e-15, 1.536213562e-15, 1.230473199e-16, // 81-90 + 4.609653396e-16, 1.503608663e-15, 9.130139990e-16, 8.950731342e-16, 8.843355368e-17, 9.314765075e-16, 1.311786759e-16, 9.206849025e-17, 3.169463543e-16, 2.154753688e-15 // 91-100 }; const G4double -G4RayleighAngularGenerator::PP6[101] = { 0, -6.57834, 3.91446, 7.59547, 10.707, 3.97317, 4.00593, 3.93206, 8.10644, 3.97743, 4.04641, // 1-10 -4.30202, 4.19399, 4.27399, 4.4169, 4.04829, 2.21745, 11.3523, 1.84976, 1.61905, 3.68297, // 11-20 -1.5704, 2.58852, 3.59827, 3.61633, 9.07174, 1.76738, 1.97272, 1.91032, 1.9838, 2.64286, // 21-30 -4.16296, 1.80149, 3.94257, 1.72731, 2.27523, 2.57383, 3.33453, 2.2361, 2.94376, 3.91332, // 31-40 -5.01832, 6.8016, 2.19508, 1.65926, 1.63781, 4.23097, 3.4399, 2.55583, 7.96814, 2.06573, // 41-50 -1.84175, 3.23516, 1.79129, 2.90259, 3.18266, 1.51305, 1.88361, 1.91925, 1.68033, 1.72078, // 51-60 -1.66246, 1.66676, 1.49394, 1.58924, 1.57558, 1.63307, 1.84447, 1.60296, 1.56719, 1.62166, // 61-70 -1.5753, 1.57329, 1.558, 1.57567, 1.55612, 1.54607, 1.53251, 1.51928, 1.50265, 1.52445, // 71-80 -1.4929, 1.51098, 2.52959, 1.42334, 1.41292, 2.0125, 1.45015, 1.43067, 2.6026, 1.39261, // 81-90 -1.38559, 1.37575, 2.53155, 2.51924, 1.32386, 2.31791, 2.47722, 1.33584, 9.60979, 6.84949, // 91-100 + G4RayleighAngularGenerator::PP6[101] = {0, + 5.245179284e+00, 3.941069622e+00, 7.595470000e+00, 1.556100268e+01, 3.958715820e+00, 1.006439332e+01, 3.947506567e+00, 3.911947451e+00, 3.960123395e+00, 3.995405309e+00, // 1-10 + 4.165369684e+00, 4.154784462e+00, 4.243106173e+00, 4.326072224e+00, 4.520737868e+00, 5.804915543e+00, 7.148125826e+00, 1.979899376e+00, 1.619050000e+00, 3.020461557e+00, // 11-20 + 1.570400000e+00, 1.595930653e+00, 1.592295792e+00, 3.539697537e+00, 1.823123604e+00, 1.823008934e+00, 3.108054801e+00, 1.802053625e+00, 3.315832610e+00, 3.438022820e+00, // 21-30 + 1.788357076e+00, 1.779735777e+00, 1.782694477e+00, 1.778454849e+00, 4.288820945e+00, 2.573830000e+00, 1.754405892e+00, 1.749703489e+00, 1.739317589e+00, 3.536923800e+00, // 31-40 + 4.992480078e+00, 5.353762609e+00, 5.983872882e+00, 1.659260000e+00, 1.637810000e+00, 7.594207497e+00, 2.760872072e+00, 2.996427458e+00, 6.765238189e+00, 3.358446915e+00, // 41-50 + 1.895332668e+00, 3.235160000e+00, 3.117412878e+00, 2.561242590e+00, 1.080139229e+01, 1.513050000e+00, 1.944567866e+00, 1.922906186e+00, 1.732857547e+00, 1.666739664e+00, // 51-60 + 1.735584396e+00, 1.700970330e+00, 1.493940000e+00, 1.789491004e+00, 1.668966729e+00, 1.722315051e+00, 1.564155879e+00, 1.679770510e+00, 1.660734791e+00, 1.650941092e+00, // 61-70 + 1.646594633e+00, 1.646361209e+00, 1.596899505e+00, 1.575670000e+00, 1.595800331e+00, 1.598706510e+00, 2.267574396e+00, 1.571022960e+00, 1.556511213e+00, 1.547150547e+00, // 71-80 + 1.539905529e+00, 2.445886590e+00, 1.521666588e+00, 1.514607927e+00, 2.418992922e+00, 1.489341220e+00, 1.445770175e+00, 1.477753418e+00, 1.473313627e+00, 1.034799940e+01, // 81-90 + 2.720221569e+00, 2.423181552e+00, 1.433800031e+00, 1.424989075e+00, 1.398959178e+00, 1.397503726e+00, 2.862849596e+00, 1.377034589e+00, 9.782799214e+00, 1.348300032e+00 // 91-100 }; const G4double -G4RayleighAngularGenerator::PP7[101] = { 0, -3.99983, 6.63093, 3.85593, 1.69342, 14.7911, 7.03995, 8.89527, 13.1929, 4.93354, 5.59461, // 1-10 -3.98033, 1.74578, 2.67629, 14.184, 8.88775, 13.1809, 4.51627, 13.7677, 9.53727, 4.04257, // 11-20 -7.88725, 5.78566, 4.08148, 4.18194, 7.96292, 8.38322, 3.31429, 13.106, 13.0857, 13.1053, // 21-30 -3.54708, 2.08567, 2.38131, 2.58162, 3.199, 3.20493, 3.19799, 1.88697, 1.80323, 3.15596, // 31-40 -4.10675, 5.68928, 3.93024, 11.2607, 4.86595, 12.1708, 12.2867, 9.29496, 1.61249, 5.0998, // 41-50 -5.25068, 6.67673, 5.82498, 6.12968, 6.94532, 1.71622, 1.63028, 3.34945, 2.84671, 2.66325, // 51-60 -2.73395, 1.93715, 1.72497, 2.74504, 2.71531, 1.52039, 1.58191, 1.61444, 2.67701, 1.51369, // 61-70 -2.60766, 1.46608, 1.49792, 2.49166, 2.84906, 2.80604, 2.92788, 2.76411, 2.59305, 2.5855, // 71-80 -2.80503, 1.4866, 1.46649, 1.45595, 1.44374, 1.54865, 2.45661, 2.43268, 1.35352, 1.35911, // 81-90 -2.26339, 2.26838, 1.35877, 1.37826, 1.3499, 1.36574, 1.33654, 1.33001, 1.37648, 4.28173, // 91-100 + G4RayleighAngularGenerator::PP7[101] ={0, + 3.999571467e+00, 3.991128282e+00, 3.855930000e+00, 3.954881255e+00, 1.209804865e+01, 3.984648146e+00, 1.159847718e+01, 1.208416029e+01, 7.793410191e+00, 7.050783546e+00, // 1-10 + 1.860829199e+00, 1.805395915e+00, 5.601066041e+00, 1.285317248e+01, 2.982331588e+00, 1.387872806e+01, 1.234603360e+01, 1.341537351e+01, 9.537270000e+00, 4.399859528e+00, // 11-20 + 7.887250000e+00, 1.010638153e+01, 5.125426065e+00, 4.529968522e+00, 1.295225813e+01, 1.125545587e+01, 3.469375224e+00, 9.019427119e+00, 4.422801993e+00, 4.231377923e+00, // 21-30 + 4.487670198e+00, 3.377601937e+00, 3.060634263e+00, 2.916013798e+00, 3.277148894e+00, 3.204930000e+00, 2.941802865e+00, 2.233026370e+00, 2.626492823e+00, 4.442039033e+00, // 31-40 + 4.924387077e+00, 7.722486735e+00, 6.373463850e+00, 1.126070000e+01, 4.865950000e+00, 1.666437783e+00, 1.165792401e+01, 1.832865314e+00, 3.197863589e+00, 1.108841018e+01, // 41-50 + 8.586125523e+00, 6.676730000e+00, 1.759586815e+00, 1.779094293e+00, 1.606067697e+00, 1.716220000e+00, 3.714794374e+00, 1.684962847e+00, 3.694058142e+00, 3.883036642e+00, // 51-60 + 3.616573408e+00, 2.616627730e+00, 1.724970000e+00, 3.214294756e+00, 6.048180604e+00, 1.644134456e+00, 1.645297046e+00, 1.638457907e+00, 1.632603379e+00, 1.628448343e+00, // 61-70 + 1.632630475e+00, 1.635873458e+00, 1.825704957e+00, 2.491660000e+00, 2.578788354e+00, 1.564697536e+00, 1.957756845e+00, 1.753512815e+00, 2.248102578e+00, 2.608650253e+00, // 71-80 + 1.775440582e+00, 1.577663847e+00, 2.371177051e+00, 2.470000483e+00, 1.508411013e+00, 2.464240407e+00, 2.506389292e+00, 2.470932595e+00, 2.409396196e+00, 4.479899308e+00, // 81-90 + 1.455793655e+00, 1.441149845e+00, 2.479382371e+00, 2.453619326e+00, 2.383185233e+00, 2.503014659e+00, 4.272318275e+00, 2.713400801e+00, 1.391715512e+00, 2.623357264e+00 // 91-100 }; const G4double -G4RayleighAngularGenerator::PP8[101] = { 0, -4, 4, 5.94686, 4.10265, 7.87177, 12.0509, 12.0472, 3.90597, 5.34338, 6.33072, // 1-10 -2.76777, 7.90099, 5.58323, 4.26372, 3.3005, 5.69179, 2.3698, 3.68167, 5.2807, 4.61212, // 11-20 -5.87809, 4.46207, 4.59278, 4.67584, 1.75212, 7.00575, 2.05428, 2.00415, 2.02048, 1.98413, // 21-30 -1.71725, 3.18743, 1.74231, 4.40997, 2.01626, 1.8622, 1.7544, 1.60332, 2.23338, 1.70932, // 31-40 -1.67223, 1.64655, 1.76198, 6.33416, 7.92665, 1.67835, 1.67408, 1.55895, 9.3642, 1.68776, // 41-50 -2.02167, 1.65401, 2.20616, 1.76498, 1.63064, 7.13771, 3.17033, 1.65236, 2.66943, 1.62703, // 51-60 -2.72469, 2.73686, 10.86, 2.76759, 2.69728, 1.62436, 2.76662, 1.48514, 1.57342, 1.61518, // 61-70 -3.18455, 2.73467, 2.72521, 2.786, 2.35611, 2.31574, 2.5787, 2.46877, 2.89052, 2.6478, // 71-80 -1.50419, 2.73998, 2.79809, 2.66207, 2.73089, 1.34835, 2.59656, 2.7006, 1.41867, 4.26255, // 81-90 -2.47985, 2.47126, 1.72573, 3.44856, 1.36451, 2.8715, 2.35731, 1.28196, 4.1224, 1.32633, // 91-100 + G4RayleighAngularGenerator::PP8[101] = {0, + 3.999988492e+00, 3.007894874e+00, 5.946860000e+00, 7.152304101e+00, 6.130363514e+00, 1.208178632e+01, 1.037802325e+01, 9.199988173e+00, 1.172397112e+01, 1.207012659e+01, // 1-10 + 1.115856859e+01, 7.827803195e+00, 2.641126114e+00, 4.312456794e+00, 1.198258924e+01, 2.176176802e+00, 2.039327000e+00, 7.141859323e+00, 5.280700000e+00, 4.469270053e+00, // 11-20 + 5.878090000e+00, 5.532784283e+00, 5.963337902e+00, 4.314887550e+00, 5.841459409e+00, 5.679735328e+00, 4.361061890e+00, 5.202026076e+00, 4.135817334e+00, 4.133917331e+00, // 21-30 + 4.551995537e+00, 4.677756013e+00, 4.528279561e+00, 4.498802330e+00, 1.774563576e+00, 1.862200000e+00, 4.622134764e+00, 4.695173427e+00, 5.128574495e+00, 1.782470135e+00, // 31-40 + 1.727732750e+00, 1.724150271e+00, 1.709518222e+00, 6.334160000e+00, 7.926650000e+00, 1.159184448e+01, 1.895174961e+00, 1.154752444e+01, 1.645989249e+00, 1.687530363e+00, // 41-50 + 2.409664359e+00, 1.654010000e+00, 1.134686144e+01, 4.793719850e+00, 9.632614374e+00, 7.137710000e+00, 1.705278976e+00, 3.589745289e+00, 2.650211489e+00, 1.847594729e+00, // 51-60 + 2.057911711e+00, 2.980049185e+00, 1.086000000e+01, 1.654657393e+00, 2.823690929e+00, 2.581116822e+00, 1.824902805e+00, 1.610400116e+00, 1.584768888e+00, 1.561632819e+00, // 61-70 + 1.536232590e+00, 1.520253937e+00, 2.701107185e+00, 2.786000000e+00, 2.677490471e+00, 1.613510248e+00, 1.574877874e+00, 2.478321094e+00, 2.578973774e+00, 2.530183017e+00, // 71-80 + 2.454130254e+00, 1.522182263e+00, 2.585541261e+00, 1.743698112e+00, 1.507618128e+00, 1.517673206e+00, 1.487198678e+00, 1.482431696e+00, 1.808266084e+00, 1.468787657e+00, // 81-90 + 4.518186694e+00, 1.690796964e+00, 2.458974369e+00, 2.416442577e+00, 2.505591266e+00, 2.315596171e+00, 1.421452131e+00, 2.563262017e+00, 5.323940741e+00, 2.366288037e+00 // 91-100 }; - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... diff --git a/source/processes/electromagnetic/lowenergy/src/G4ShellData.cc b/source/processes/electromagnetic/lowenergy/src/G4ShellData.cc index b38a3cf1a3..8a6fae982e 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4ShellData.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4ShellData.cc @@ -230,7 +230,7 @@ void G4ShellData::LoadData(const G4String& fileName) // Build the complete string identifying the file with the data set std::ostringstream ost; ost << fileName << ".dat"; - + // G4cout << fileName << G4endl; G4String name(ost.str()); char* path = std::getenv("G4LEDATA"); diff --git a/source/processes/electromagnetic/lowenergy/src/G4ShellEMDataSet.cc b/source/processes/electromagnetic/lowenergy/src/G4ShellEMDataSet.cc index 9d9546d069..d1f86c36b7 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4ShellEMDataSet.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4ShellEMDataSet.cc @@ -131,7 +131,9 @@ void G4ShellEMDataSet::SetEnergiesData(G4DataVector* energies, return; } - G4String msg = "component " + (G4String)componentId + " not found"; + G4String msg = "component "; + msg += static_cast(componentId); + msg += " not found"; G4Exception("G4ShellEMDataSet::SetEnergiesData()","em0008", FatalErrorInArgument ,msg); } @@ -151,7 +153,9 @@ void G4ShellEMDataSet::SetLogEnergiesData(G4DataVector* energies, return; } - G4String msg = "component " + (G4String)componentId + " not found"; + G4String msg = "component "; + msg += static_cast(componentId); + msg += " not found"; G4Exception("G4ShellEMDataSet::SetLogEnergiesData()","em0008", FatalErrorInArgument ,msg); } @@ -173,7 +177,7 @@ G4bool G4ShellEMDataSet::LoadData(const G4String& file) G4Exception("G4ShellEMDataSet::LoadData()", "em0003",FatalException, message); return 0; } - + G4DataVector* orig_shell_energies = 0; G4DataVector* orig_shell_data = 0; G4DataVector* log_shell_energies = 0; diff --git a/source/processes/electromagnetic/lowenergy/src/G4UAtomicDeexcitation.cc b/source/processes/electromagnetic/lowenergy/src/G4UAtomicDeexcitation.cc index 54e62e1ecc..53a63aedf3 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4UAtomicDeexcitation.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4UAtomicDeexcitation.cc @@ -129,6 +129,10 @@ void G4UAtomicDeexcitation::InitialiseForNewRun() { PIXEshellCS = new G4teoCrossSection(namePIXExsModel); } + else if(namePIXExsModel == "ECPSSR_ANSTO") + { + PIXEshellCS = new G4teoCrossSection(namePIXExsModel); + } else if(namePIXExsModel == "Empirical") { PIXEshellCS = new G4empCrossSection(namePIXExsModel); diff --git a/source/processes/electromagnetic/lowenergy/src/G4VCrossSectionHandler.cc b/source/processes/electromagnetic/lowenergy/src/G4VCrossSectionHandler.cc index 3256e56546..8bc6f7b41a 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4VCrossSectionHandler.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4VCrossSectionHandler.cc @@ -582,8 +582,7 @@ const G4Element* G4VCrossSectionHandler::SelectRandomElement(const G4MaterialCut // Special case: the material consists of one element if (nElements == 1) { - G4Element* element = (*elementVector)[0]; - return element; + return (*elementVector)[0]; } else { @@ -673,8 +672,7 @@ void G4VCrossSectionHandler::ActiveElements() for (G4int iEl=0; iElGetZ(); + G4double Z = (*elementVector)[iEl]->GetZ(); if (!(activeZ.contains(Z)) && Z >= zMin && Z <= zMax) { activeZ.push_back(Z); diff --git a/source/processes/electromagnetic/lowenergy/src/G4eIonisationParameters.cc b/source/processes/electromagnetic/lowenergy/src/G4eIonisationParameters.cc index 8caecaa985..ef87e8e559 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4eIonisationParameters.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4eIonisationParameters.cc @@ -164,8 +164,7 @@ void G4eIonisationParameters::LoadData() const size_t nElements = material->GetNumberOfElements(); for (size_t iEl=0; iElGetZ(); + G4double Z = (*elementVector)[iEl]->GetZ(); if (!(activeZ.contains(Z))) { activeZ.push_back(Z); } diff --git a/source/processes/electromagnetic/lowenergy/src/G4teoCrossSection.cc b/source/processes/electromagnetic/lowenergy/src/G4teoCrossSection.cc index 6a5b9d45f1..8733e45959 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4teoCrossSection.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4teoCrossSection.cc @@ -34,17 +34,21 @@ // 20 Oct 2011 ALF updated to take into account ECPSSR Form Factor // 09 Mar 2012 LP update methods // 09 Mar 2012 ALF update for M-shells Simulation -// +// 10 Nov 2021 S. Guatelli & S. Bakr Added ECPSSR form factor documented +// in Bakr et al, NIM B, vol. 436, pp:285-291, 2018 and +// called here ECPSSR_ANSTO #include "globals.hh" #include "G4teoCrossSection.hh" #include "G4Proton.hh" #include "G4ecpssrBaseKxsModel.hh" #include "G4ecpssrBaseLixsModel.hh" - #include "G4ecpssrFormFactorKxsModel.hh" #include "G4ecpssrFormFactorLixsModel.hh" #include "G4ecpssrFormFactorMixsModel.hh" +#include "G4ANSTOecpssrKxsModel.hh" +#include "G4ANSTOecpssrLixsModel.hh" +#include "G4ANSTOecpssrMixsModel.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4teoCrossSection::G4teoCrossSection(const G4String& nam) @@ -62,6 +66,12 @@ G4teoCrossSection::G4teoCrossSection(const G4String& nam) ecpssrShellLi = new G4ecpssrFormFactorLixsModel(); ecpssrShellMi = new G4ecpssrFormFactorMixsModel(); } + else if (nam == "ECPSSR_ANSTO") + { + ecpssrShellK = new G4ANSTOecpssrKxsModel(); + ecpssrShellLi = new G4ANSTOecpssrLixsModel(); + ecpssrShellMi = new G4ANSTOecpssrMixsModel(); + } else { G4cout << "G4teoCrossSection::G4teoCrossSection: ERROR " diff --git a/source/processes/electromagnetic/muons/History b/source/processes/electromagnetic/muons/History index e0d5cd0609..c1be43e8ae 100644 --- a/source/processes/electromagnetic/muons/History +++ b/source/processes/electromagnetic/muons/History @@ -16,6 +16,14 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +27 September 21: V.Ivanchenko (emmuons-V10-07-09) +- G4MuPairProduction, G4ePairProduction, G4MuBremsstrahlung + spline disabled + +12 April 21: V.Ivanchenko (emmuons-V10-07-08) +- G4TablesForExtrapolator - use local G4LossTableBuilder with + disabled base material flag + 24 April 21: V.Ivanchenko (emmuons-V10-07-07) - G4EnergyLossForExtrapolator, G4TablesForExtrapolator - added more thread safety for initialisation of the next runs diff --git a/source/processes/electromagnetic/muons/src/G4MuBremsstrahlung.cc b/source/processes/electromagnetic/muons/src/G4MuBremsstrahlung.cc index bb529f7885..5ae96b625f 100644 --- a/source/processes/electromagnetic/muons/src/G4MuBremsstrahlung.cc +++ b/source/processes/electromagnetic/muons/src/G4MuBremsstrahlung.cc @@ -79,6 +79,7 @@ G4MuBremsstrahlung::G4MuBremsstrahlung(const G4String& name) SetProcessSubType(fBremsstrahlung); SetSecondaryParticle(G4Gamma::Gamma()); SetIonisation(false); + SetSpline(false); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/muons/src/G4MuPairProduction.cc b/source/processes/electromagnetic/muons/src/G4MuPairProduction.cc index 3f811ceeef..1e480e74da 100644 --- a/source/processes/electromagnetic/muons/src/G4MuPairProduction.cc +++ b/source/processes/electromagnetic/muons/src/G4MuPairProduction.cc @@ -85,6 +85,7 @@ G4MuPairProduction::G4MuPairProduction(const G4String& name) SetProcessSubType(fPairProdByCharged); SetSecondaryParticle(G4Positron::Positron()); SetIonisation(false); + SetSpline(false); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/muons/src/G4TablesForExtrapolator.cc b/source/processes/electromagnetic/muons/src/G4TablesForExtrapolator.cc index 7b81013f86..69d8bff702 100644 --- a/source/processes/electromagnetic/muons/src/G4TablesForExtrapolator.cc +++ b/source/processes/electromagnetic/muons/src/G4TablesForExtrapolator.cc @@ -139,6 +139,7 @@ G4TablesForExtrapolator::~G4TablesForExtrapolator() delete mscElectron; } delete pcuts; + delete builder; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -226,8 +227,8 @@ void G4TablesForExtrapolator::Initialisation() invRangeProton = PrepareTable(invRangeProton); mscElectron = PrepareTable(mscElectron); - builder = G4LossTableManager::Instance()->GetTableBuilder(); - builder->InitialiseBaseMaterials(); + builder = new G4LossTableBuilder(true); + builder->SetBaseMaterialActive(false); if(verbose>1) { G4cout << "### G4TablesForExtrapolator Builds electron tables" diff --git a/source/processes/electromagnetic/muons/src/G4ePairProduction.cc b/source/processes/electromagnetic/muons/src/G4ePairProduction.cc index eeb8383d7b..9bd13a903e 100644 --- a/source/processes/electromagnetic/muons/src/G4ePairProduction.cc +++ b/source/processes/electromagnetic/muons/src/G4ePairProduction.cc @@ -61,6 +61,7 @@ G4ePairProduction::G4ePairProduction(const G4String& name) SetProcessSubType(fPairProdByCharged); SetSecondaryParticle(G4Positron::Positron()); SetIonisation(false); + SetSpline(false); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/pii/History b/source/processes/electromagnetic/pii/History index 89ec495821..b1d72e078d 100644 --- a/source/processes/electromagnetic/pii/History +++ b/source/processes/electromagnetic/pii/History @@ -16,6 +16,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +09-07-2021 V.Ivanchenko, tag empii-V10-07-01 + use const pointer to G4Element + 16-04-2021 B.Morgan, tag empii-V10-07-00 Migrate build to modular CMake API diff --git a/source/processes/electromagnetic/pii/src/G4PixeCrossSectionHandler.cc b/source/processes/electromagnetic/pii/src/G4PixeCrossSectionHandler.cc index dda8cef6e3..5232ef310e 100644 --- a/source/processes/electromagnetic/pii/src/G4PixeCrossSectionHandler.cc +++ b/source/processes/electromagnetic/pii/src/G4PixeCrossSectionHandler.cc @@ -591,8 +591,7 @@ void G4PixeCrossSectionHandler::ActiveElements() for (G4int iEl=0; iElGetZ(); + G4double Z = (*elementVector)[iEl]->GetZ(); if (!(activeZ.contains(Z)) && Z >= zMin && Z <= zMax) { activeZ.push_back(Z); diff --git a/source/processes/electromagnetic/polarisation/src/G4PolarizationMessenger.cc b/source/processes/electromagnetic/polarisation/src/G4PolarizationMessenger.cc index 378d6aecb5..fd4b626118 100644 --- a/source/processes/electromagnetic/polarisation/src/G4PolarizationMessenger.cc +++ b/source/processes/electromagnetic/polarisation/src/G4PolarizationMessenger.cc @@ -153,15 +153,15 @@ void G4PolarizationMessenger::SetNewValue(G4UIcommand* command, G4String volumeName = next(); G4double px = 0., py = 0., pz = 0.; G4String dvalue = next(); - if(!dvalue.isNull()) + if(!dvalue.empty()) { px = StoD(dvalue); dvalue = next(); - if(!dvalue.isNull()) + if(!dvalue.empty()) { py = StoD(dvalue); dvalue = next(); - if(!dvalue.isNull()) + if(!dvalue.empty()) pz = StoD(dvalue); } } diff --git a/source/processes/electromagnetic/standard/History b/source/processes/electromagnetic/standard/History index f24220aeec..4e36d870a7 100644 --- a/source/processes/electromagnetic/standard/History +++ b/source/processes/electromagnetic/standard/History @@ -14,6 +14,85 @@ and keep track of all category-tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +26 November 21: V.Ivanchenko (emstand-V10-07-28) +- G4PairProductionRelModel - reduce upper limit of parameterisation x-section + from 80 to 30 GeV + +09 November 21: V.Ivanchenko (emstand-V10-07-27) +- G4ionIonisation - minor clean-up +- G4IonICRU73Data - new data structure for ion ionisation data +- G4LindhardSorensenIonModel - use G4BraggIonModel, G4BetheBlochModel + and G4IonICRU73Data, do not apply corrections at the last step of + an ion +- G4BraggIonModel, G4BetheBlochModel - do not apply corrections at + the last step of an ion + +30 October 21: V.Ivanchenko (emstand-V10-07-26) +- G4BetheBlochModel, G4BraggIonModel, G4ionIonisation - use ion + corrections for all ions except alpha in order to fix #2440 + +12 October 21: V.Ivanchenko (emstand-V10-07-25) +- G4BetheBlochModel, G4BraggIonModel - improved usage of corrections + to ion dedx, code clean-up +- G4ionIonisation - use G4WaterStopping with spline enabled +- G4alphaIonisation - removed as obsolete + +07 Octoberber 21: V.Ivanchenko (emstand-V10-07-24) +- G4UniversalFluctuations - Laszlo Urban substantially simplified + sampling algorithm - less number of parameters, faster + computations, results are in statistical agreement with the + previous version of the code + +27 September 21: V.Ivanchenko (emstand-V10-07-23) +- G4BraggIonModel, G4BetheBlochModel - fixed computation of + dedx for alpha if ICRU90 data are used (problem #2414); + improved method signatures; code clean-up. +- G4hIonisation, G4ionIonisation - He3 dedx derived from alpha dedx; + pi, K, proton, pbar, GenericIon have own dedx and other tables; + other hadrons derived from K, protons, pbar; ions derived + from GenericIon +- G4ASTARStopping - improved method signatures +- CoulombScattering - disable spline + +31 August 21: J.Hahnfeld (emstand-V10-07-22) +- G4PEEffectFluoModel - optimize cross section computation with + reciprocals and Horners scheme + +27 August 21: V.Ivanchenko (emstand-V10-07-21) +- G4BraggModel, G4BraggIonModel - set lowest energy to 0.25 keV, + added protection to limit cut value by the lowest energy +- G4LinhardSorensenIonModel, G4ICRU73QOModel - added protection + to limit cut value by the lowest energy +- G4BetheBlochModel - minor clean-up + +26 August 21: V.Ivanchenko (emstand-V10-07-20) +- G4BetheBlochModel - critical fix of dEdx for protons and alpha + with scaled energy E>10 GeV for the case of use ICRU90 data. + Should fix #2414 + +20 August 21: V.Ivanchenko (emstand-V10-07-19) +- G4PAIModelData - use optimal methods to access G4PhysicsVector + +04 August 21: A.Ribon (emstand-V10-07-18) +- G4eplusAnnihilation : migrated to the new version of G4PhysicsModelCatalog + +18 July 21: V.Ivanchenko (emstand-V10-07-17) +- G4UniversalFluctuation, G4IonFluctuations, G4AtomaFluctuations, + G4PAIModel, G4PAIPhotModel - updated according to change + of G4VEmFluctuationModel signature + +16 July 21: V.Ivanchenko (emstand-V10-07-16) +- G4UniversalFluctuation - minor optimisation, code clean-up +- G4UrbanMscModel - use random arrays instead flat() method + to speed-up the code; use more const variables + +10 July 21: V.Ivanchenko (emstand-V10-07-15) +- G4BetheBlochModel, G4ESTARStopping, G4AtimaEnergyLossModel, + G4LindhardSorensenIonModel - fixed Coverity warnings by + initialisation of all variables in class constructors +- G4UrbanMscModel - do not apply energy correction at small + steps below 1% of a particle range + 24 May 21: J.Allison (emstand-V10-07-14) - G4eplusAnnihilation.cc: o Instantiate clip board only if Quantum Entanglement is requested. diff --git a/source/processes/electromagnetic/standard/include/G4ASTARStopping.hh b/source/processes/electromagnetic/standard/include/G4ASTARStopping.hh index 0aec3a9341..bbbb1b1a6a 100644 --- a/source/processes/electromagnetic/standard/include/G4ASTARStopping.hh +++ b/source/processes/electromagnetic/standard/include/G4ASTARStopping.hh @@ -88,7 +88,7 @@ private: void PrintWarning(G4int idx) const; - size_t nvectors; + G4int nvectors; G4double emin; std::vector materials; std::vector sdata; @@ -96,11 +96,11 @@ private: //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -inline G4int G4ASTARStopping:: GetIndex (const G4Material* mat) const +inline G4int G4ASTARStopping::GetIndex(const G4Material* mat) const { G4int idx = -1; - for (size_t i=0; iGetName()){ + for (G4int i=0; iGetName()) { idx = i; break; } @@ -128,7 +128,7 @@ inline G4double G4ASTARStopping::GetElectronicDEDX(G4int idx, G4double energy) const { G4double res = 0.0; - if (idx<0 || idx>= G4int(nvectors)) { PrintWarning(idx); } + if (idx<0 || idx >= nvectors) { PrintWarning(idx); } if(energy < emin) { res = (*(sdata[idx]))[0]*std::sqrt(energy/emin); } else { res = sdata[idx]->Value(energy); } return res; diff --git a/source/processes/electromagnetic/standard/include/G4AtimaEnergyLossModel.hh b/source/processes/electromagnetic/standard/include/G4AtimaEnergyLossModel.hh index 50bfc88350..71c734b8af 100644 --- a/source/processes/electromagnetic/standard/include/G4AtimaEnergyLossModel.hh +++ b/source/processes/electromagnetic/standard/include/G4AtimaEnergyLossModel.hh @@ -147,15 +147,14 @@ private: G4NistManager* nist; G4Pow* g4calc; - G4double mass; - G4double tlimit; - G4double spin; - G4double magMoment2; - G4double chargeSquare; - G4double ratio; - G4double formfact; - G4double corrFactor; - G4bool isIon; + G4double mass = 0.0; + G4double tlimit = DBL_MAX; + G4double spin = 0.0; + G4double magMoment2 = 0.0; + G4double chargeSquare = 1.0; + G4double ratio = 1.0; + G4double formfact = 0.0; + G4double corrFactor = 1.0; G4double MLN10; G4double atomic_mass_unit; G4double dedx_constant; @@ -163,6 +162,8 @@ private: G4double fine_structure; G4double domega2dx_constant; + G4bool isIon = false; + static G4double stepE; static G4double tableE[200]; static const G4double element_atomic_weights[110]; diff --git a/source/processes/electromagnetic/standard/include/G4AtimaFluctuations.hh b/source/processes/electromagnetic/standard/include/G4AtimaFluctuations.hh index cb59d52364..a014aa8241 100644 --- a/source/processes/electromagnetic/standard/include/G4AtimaFluctuations.hh +++ b/source/processes/electromagnetic/standard/include/G4AtimaFluctuations.hh @@ -67,15 +67,17 @@ public: // Sample fluctuations G4double SampleFluctuations(const G4MaterialCutsCouple*, const G4DynamicParticle*, - G4double tmax, - G4double length, - G4double meanLoss) override; + const G4double tcut, + const G4double tmax, + const G4double length, + const G4double meanLoss) override; // Compute dispertion G4double Dispersion(const G4Material*, const G4DynamicParticle*, - G4double tmax, - G4double length) override; + const G4double tcut, + const G4double tmax, + const G4double length) override; // Initialisation prerun void InitialiseMe(const G4ParticleDefinition*) override; diff --git a/source/processes/electromagnetic/standard/include/G4BetheBlochModel.hh b/source/processes/electromagnetic/standard/include/G4BetheBlochModel.hh index 0214abf9a0..e88694a82d 100644 --- a/source/processes/electromagnetic/standard/include/G4BetheBlochModel.hh +++ b/source/processes/electromagnetic/standard/include/G4BetheBlochModel.hh @@ -50,14 +50,12 @@ #ifndef G4BetheBlochModel_h #define G4BetheBlochModel_h 1 -#include - #include "G4VEmModel.hh" -#include "G4NistManager.hh" class G4EmCorrections; class G4ParticleChangeForLoss; class G4ICRU90StoppingData; +class G4NistManager; class G4BetheBlochModel : public G4VEmModel { @@ -118,8 +116,8 @@ public: G4double maxEnergy) override; // hide assignment operator - G4BetheBlochModel & operator=(const G4BetheBlochModel &right) = delete; - G4BetheBlochModel(const G4BetheBlochModel&) = delete; + G4BetheBlochModel & operator=(const G4BetheBlochModel &right) = delete; + G4BetheBlochModel(const G4BetheBlochModel&) = delete; protected: @@ -132,58 +130,35 @@ protected: private: - void SetupParameters(); + void SetupParameters(const G4ParticleDefinition* p); - inline void SetParticle(const G4ParticleDefinition* p); - - inline void SetGenericIon(const G4ParticleDefinition* p); - - const G4ParticleDefinition* particle; + const G4ParticleDefinition* particle = nullptr; const G4ParticleDefinition* theElectron; G4EmCorrections* corr; - G4ParticleChangeForLoss* fParticleChange; + G4ParticleChangeForLoss* fParticleChange = nullptr; G4NistManager* nist; - G4ICRU90StoppingData* fICRU90; - const G4Material* currentMaterial; - const G4Material* baseMaterial; + G4ICRU90StoppingData* fICRU90 = nullptr; + const G4Material* currentMaterial = nullptr; + const G4Material* baseMaterial = nullptr; - G4double mass; - G4double tlimit; - G4double spin; - G4double magMoment2; - G4double chargeSquare; - G4double ratio; - G4double formfact; + G4double mass = 0.0; + G4double tlimit = DBL_MAX; + G4double spin = 0.0; + G4double magMoment2 = 0.0; + G4double chargeSquare = 1.0; + G4double ratio = 1.0; + G4double formfact = 0.0; G4double twoln10; - G4double corrFactor; G4double fAlphaTlimit; G4double fProtonTlimit; - G4int iICRU90; - G4bool isIon; + G4int iICRU90 = -1; + G4bool isIon = false; + G4bool isAlpha = false; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -inline void G4BetheBlochModel::SetParticle(const G4ParticleDefinition* p) -{ - if(particle != p) { - particle = p; - if(p->GetBaryonNumber() > 3 || p->GetPDGCharge() > CLHEP::eplus) - { isIon = true; } - SetupParameters(); - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline void G4BetheBlochModel::SetGenericIon(const G4ParticleDefinition* p) -{ - if(p && p->GetParticleName() == "GenericIon") { isIon = true; } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - inline G4double G4BetheBlochModel::GetChargeSquareRatio() const { return chargeSquare; diff --git a/source/processes/electromagnetic/standard/include/G4BraggIonModel.hh b/source/processes/electromagnetic/standard/include/G4BraggIonModel.hh index 21176f41c9..3f6cb42f2a 100644 --- a/source/processes/electromagnetic/standard/include/G4BraggIonModel.hh +++ b/source/processes/electromagnetic/standard/include/G4BraggIonModel.hh @@ -47,8 +47,8 @@ // Class Description: // // Implementation of energy loss and delta-electron production -// by heavy slow charged particles using ICRU'49 and NIST evaluated data -// for He4 ions +// by heavy slow charged particles using ICRU'49, NIST, and ICRU90 +// evaluated data for alpha and protons // ------------------------------------------------------------------- // @@ -56,8 +56,6 @@ #ifndef G4BraggIonModel_h #define G4BraggIonModel_h 1 -#include - #include "G4VEmModel.hh" #include "G4ASTARStopping.hh" @@ -86,24 +84,24 @@ public: G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy); - + G4double ComputeCrossSectionPerAtom( const G4ParticleDefinition*, G4double kineticEnergy, G4double Z, G4double A, G4double cutEnergy, G4double maxEnergy) override; - + G4double CrossSectionPerVolume(const G4Material*, const G4ParticleDefinition*, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy) override; - + G4double ComputeDEDXPerVolume(const G4Material*, - const G4ParticleDefinition*, - G4double kineticEnergy, - G4double cutEnergy) override; + const G4ParticleDefinition*, + G4double kineticEnergy, + G4double cutEnergy) override; void SampleSecondaries(std::vector*, const G4MaterialCutsCouple*, @@ -111,7 +109,7 @@ public: G4double tmin, G4double maxEnergy) override; - // Compute ion charge + // Compute ion charge not applied to alpha G4double GetChargeSquareRatio(const G4ParticleDefinition*, const G4Material*, G4double kineticEnergy) override; @@ -139,60 +137,49 @@ private: void SetParticle(const G4ParticleDefinition* p); - G4double HeEffChargeSquare(G4double z, G4double kinEnergyInMeV) const; + G4double HeEffChargeSquare(const G4double z, + const G4double kinEnergyInMeV) const; - void HasMaterial(const G4Material* material); + G4int HasMaterial(const G4Material* material) const; - G4double StoppingPower(const G4Material* material, - G4double kineticEnergy); + G4double StoppingPower(const G4Material* material, + const G4double kinEnergy) const; - G4double ElectronicStoppingPower(G4double z, - G4double kineticEnergy) const; + G4double ElectronicStoppingPower(const G4double z, + const G4double kinEnergy) const; - G4double DEDX(const G4Material* material, G4double kineticEnergy); + G4double DEDX(const G4Material* material, const G4double kinEnergy); G4EmCorrections* corr = nullptr; const G4ParticleDefinition* particle = nullptr; - G4ParticleDefinition* theElectron = nullptr; + const G4ParticleDefinition* theElectron; G4ParticleChangeForLoss* fParticleChange = nullptr; G4ICRU90StoppingData* fICRU90 = nullptr; - const G4Material* currentMaterial = nullptr; - const G4Material* baseMaterial = nullptr; + const G4Material* currentMaterial = nullptr; + const G4Material* baseMaterial = nullptr; - static G4ASTARStopping* fASTAR; + static G4ASTARStopping* fASTAR; - G4double mass; - G4double spin; - G4double chargeSquare; - G4double massRate; - G4double ratio; - G4double lowestKinEnergy; + G4double mass = 0.0; + G4double spin = 0.0; + G4double chargeSquare = 1.0; + G4double effChargeSquare = 1.0; + G4double massRate = 1.0; + G4double ratio = 1.0; G4double HeMass; G4double massFactor; - G4double corrFactor = 1.0; G4double rateMassHe2p; G4double theZieglerFactor; + G4double lowestKinEnergy; G4int iMolecula = -1; // index in the molecula's table G4int iASTAR = -1; // index in ASTAR G4int iICRU90 = -1; G4bool isIon = false; + G4bool isAlpha = false; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -inline void G4BraggIonModel::SetParticle(const G4ParticleDefinition* p) -{ - particle = p; - mass = particle->GetPDGMass(); - spin = particle->GetPDGSpin(); - G4double q = particle->GetPDGCharge()/CLHEP::eplus; - chargeSquare = q*q; - massRate = mass/CLHEP::proton_mass_c2; - ratio = CLHEP::electron_mass_c2/mass; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - #endif diff --git a/source/processes/electromagnetic/standard/include/G4BraggModel.hh b/source/processes/electromagnetic/standard/include/G4BraggModel.hh index bb92816ae0..3df16fbd77 100644 --- a/source/processes/electromagnetic/standard/include/G4BraggModel.hh +++ b/source/processes/electromagnetic/standard/include/G4BraggModel.hh @@ -80,6 +80,9 @@ public: void Initialise(const G4ParticleDefinition*, const G4DataVector&) override; + G4double MinEnergyCut(const G4ParticleDefinition*, + const G4MaterialCutsCouple* couple) override; + G4double ComputeCrossSectionPerElectron( const G4ParticleDefinition*, G4double kineticEnergy, diff --git a/source/processes/electromagnetic/standard/include/G4ESTARStopping.hh b/source/processes/electromagnetic/standard/include/G4ESTARStopping.hh index 8cee0e3e80..f767e0c7b8 100644 --- a/source/processes/electromagnetic/standard/include/G4ESTARStopping.hh +++ b/source/processes/electromagnetic/standard/include/G4ESTARStopping.hh @@ -80,14 +80,13 @@ private: void Initialise(); - void AddData(const G4double* e, const G4double* s, G4int idx); + void AddData(const G4double* energy, const G4double* xs, G4int idx); - char* dirPath; - const G4Material* currentMaterial; + char* dirPath = nullptr; + const G4Material* currentMaterial = nullptr; - G4int type; - G4int matIndex; - G4double emin; + G4int type = 0; + G4int matIndex = -1; std::vector sdata; std::vector name; }; diff --git a/source/processes/electromagnetic/standard/include/G4IonFluctuations.hh b/source/processes/electromagnetic/standard/include/G4IonFluctuations.hh index a900ccc4fb..2693289b43 100644 --- a/source/processes/electromagnetic/standard/include/G4IonFluctuations.hh +++ b/source/processes/electromagnetic/standard/include/G4IonFluctuations.hh @@ -52,9 +52,9 @@ #include "G4VEmFluctuationModel.hh" #include "G4ParticleDefinition.hh" -#include "G4UniversalFluctuation.hh" class G4Pow; +class G4UniversalFluctuation; class G4IonFluctuations : public G4VEmFluctuationModel { @@ -68,15 +68,17 @@ public: // Sample fluctuations G4double SampleFluctuations(const G4MaterialCutsCouple*, const G4DynamicParticle*, - G4double tmax, - G4double length, - G4double meanLoss) override; + const G4double tcut, + const G4double tmax, + const G4double length, + const G4double meanLoss) override; // Compute dispertion G4double Dispersion(const G4Material*, const G4DynamicParticle*, - G4double tmax, - G4double length) override; + const G4double tcut, + const G4double tmax, + const G4double length) override; // Initialisation prerun void InitialiseMe(const G4ParticleDefinition*) override; @@ -94,25 +96,24 @@ private: G4double Factor(const G4Material*, G4double Zeff); G4double RelativisticFactor(const G4Material*, G4double Zeff); - G4UniversalFluctuation uniFluct; - const G4ParticleDefinition* particle; - - G4Pow* g4calc; + const G4ParticleDefinition* particle = nullptr; + G4UniversalFluctuation* uniFluct; + G4Pow* g4calc; G4double particleMass; - G4double charge; - G4double chargeSquare; - G4double effChargeSquare; + G4double charge = 1.0; + G4double chargeSquare = 1.0; + G4double effChargeSquare = 1.0; // data members to speed up the fluctuation calculation G4double parameter; G4double theBohrBeta2; - G4double minFraction; - G4double xmin; + G4double minFraction = 0.2; + G4double xmin = 0.2; G4double minLoss; // cash - G4double kineticEnergy; - G4double beta2; + G4double kineticEnergy = 0.0; + G4double beta2 = 0.0; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/standard/include/G4alphaIonisation.hh b/source/processes/electromagnetic/standard/include/G4IonICRU73Data.hh similarity index 52% rename from source/processes/electromagnetic/standard/include/G4alphaIonisation.hh rename to source/processes/electromagnetic/standard/include/G4IonICRU73Data.hh index c53a11f845..0161a85b5f 100644 --- a/source/processes/electromagnetic/standard/include/G4alphaIonisation.hh +++ b/source/processes/electromagnetic/standard/include/G4IonICRU73Data.hh @@ -23,84 +23,84 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // + +#ifndef G4IonICRU73Data_h +#define G4IonICRU73Data_h 1 + +//--------------------------------------------------------------------------- // -// ------------------------------------------------------------------- +// ClassName: G4IonICRU73Data // -// GEANT4 Class header file +// Description: Data on stopping power // +// Author: Vladimir Ivanchenko // -// File name: G4alphaIonisation -// -// Author: Vladimir Ivanchenko -// -// Creation date: 28.10.2009 -// -// Modifications: -// +// Creation date: 23.10.2021 // // Class Description: // -// This class manages the ionisation process for He ions. Effective charge, -// nuclear stopping power, energy loss corrections are taken into account. -// It inherites from G4VEnergyLossLoss. +// Container for parameterised data on ion stopping power // -// ------------------------------------------------------------------- -// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef G4alphaIonisation_h -#define G4alphaIonisation_h 1 - -#include "G4VEnergyLossProcess.hh" +#include +#include +#include "globals.hh" +class G4PhysicsLogVector; +class G4PhysicsFreeVector; class G4Material; -class G4alphaIonisation : public G4VEnergyLossProcess -{ -public: +class G4IonICRU73Data +{ +public: - explicit G4alphaIonisation(const G4String& name = "alphaIoni"); + explicit G4IonICRU73Data(); - ~G4alphaIonisation() override; + ~G4IonICRU73Data(); - G4bool IsApplicable(const G4ParticleDefinition& p) final; + // should be called before each run + void Initialise(); - // print documentation in html format - void ProcessDescription(std::ostream&) const override; + // Z - atomic number of the projectile + // e - energy per nucleon, loge = log(e) + G4double GetDEDX(const G4Material*, const G4int Z, + const G4double e, const G4double loge) const; // hide assignment operator - G4alphaIonisation & operator=(const G4alphaIonisation &right) = delete; - G4alphaIonisation(const G4alphaIonisation&) = delete; - -protected: - - void InitialiseEnergyLossProcess(const G4ParticleDefinition*, - const G4ParticleDefinition*) override; - - G4double MinPrimaryEnergy(const G4ParticleDefinition* p, - const G4Material*, G4double cut) final; - - inline G4double BetheBlochEnergyThreshold(); + G4IonICRU73Data & operator = (const G4IonICRU73Data &right) = delete; + G4IonICRU73Data(const G4IonICRU73Data&) = delete; private: - const G4ParticleDefinition* theParticle; + void ReadMaterialData(const G4String& name, G4bool type); - G4double mass; - G4double ratio; - G4double eth; + void ReadElementData(const G4Material* mat, G4bool type); - G4bool isInitialised; + G4PhysicsLogVector* FindOrBuildElementData(const G4int Z, + const G4int Z1, + G4bool useICRU90); + + G4PhysicsLogVector* RetrieveVector(std::ostringstream& in, + G4bool warn); + + G4double fEmin; + G4double fEmax; + + std::vector fMatIndex; + std::vector* fMatData[81] = {nullptr}; + G4PhysicsLogVector* fElmData[81][81] = {{nullptr}}; + G4PhysicsFreeVector* fVector = nullptr; + + G4int fNmat = 0; + G4int fNbins = 0; + G4int fNbinsPerDecade = 10; + G4int fVerbose = 0; + G4bool fSpline = false; + G4String fDataDirectory = ""; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline G4double G4alphaIonisation::BetheBlochEnergyThreshold() -{ - return eth; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/source/processes/electromagnetic/standard/include/G4LindhardSorensenIonModel.hh b/source/processes/electromagnetic/standard/include/G4LindhardSorensenIonModel.hh index ccdabec0ad..fce5e8253b 100644 --- a/source/processes/electromagnetic/standard/include/G4LindhardSorensenIonModel.hh +++ b/source/processes/electromagnetic/standard/include/G4LindhardSorensenIonModel.hh @@ -23,7 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// // ------------------------------------------------------------------- // // GEANT4 Class header file @@ -48,17 +47,18 @@ #ifndef G4LindhardSorensenIonModel_h #define G4LindhardSorensenIonModel_h 1 -#include +#include #include "G4VEmModel.hh" #include "G4NistManager.hh" #include "G4Threading.hh" -#include class G4EmCorrections; class G4ParticleChangeForLoss; class G4LindhardSorensenData; class G4BraggIonModel; +class G4BetheBlochModel; +class G4IonICRU73Data; class G4LindhardSorensenIonModel : public G4VEmModel { @@ -145,6 +145,7 @@ private: static const G4int MAXZION = 93; + static G4IonICRU73Data* fIonData; static G4LindhardSorensenData* lsdata; static std::vector* fact[MAXZION]; @@ -153,18 +154,21 @@ private: G4EmCorrections* corr; G4ParticleChangeForLoss* fParticleChange; G4NistManager* nist; - G4BraggIonModel* fBraggIonModel; + G4BraggIonModel* fBraggModel; + G4BetheBlochModel* fBBModel; - G4int Zin; - G4double mass; - G4double tlimit; - G4double spin; - G4double magMoment2; - G4double chargeSquare; - G4double charge; - G4double ratio; - G4double formfact; + G4int Zin = 1; + G4double mass = 0.0; + G4double tlimit = DBL_MAX; + G4double spin = 0.0; + G4double magMoment2 = 0.0; + G4double chargeSquare = 1.0; + G4double charge = 1.0; + G4double eRatio = 0.0; + G4double pRatio = 1.0; + G4double formfact = 0.0; G4double twoln10; + G4double fElimit; #ifdef G4MULTITHREADED static G4Mutex theLSMutex; diff --git a/source/processes/electromagnetic/standard/include/G4PAIModel.hh b/source/processes/electromagnetic/standard/include/G4PAIModel.hh index 822a357d7a..6bdf85b1e2 100644 --- a/source/processes/electromagnetic/standard/include/G4PAIModel.hh +++ b/source/processes/electromagnetic/standard/include/G4PAIModel.hh @@ -102,10 +102,12 @@ public: G4double SampleFluctuations(const G4MaterialCutsCouple*, const G4DynamicParticle*, - G4double, G4double, G4double) final; + const G4double, const G4double, + const G4double, const G4double) final; G4double Dispersion(const G4Material*, const G4DynamicParticle*, - G4double, G4double) final; + const G4double, const G4double, + const G4double) final; void DefineForRegion(const G4Region* r) final; diff --git a/source/processes/electromagnetic/standard/include/G4PAIPhotModel.hh b/source/processes/electromagnetic/standard/include/G4PAIPhotModel.hh index 6105a0e50a..1651550a96 100644 --- a/source/processes/electromagnetic/standard/include/G4PAIPhotModel.hh +++ b/source/processes/electromagnetic/standard/include/G4PAIPhotModel.hh @@ -97,10 +97,11 @@ public: G4double SampleFluctuations(const G4MaterialCutsCouple*, const G4DynamicParticle*, - G4double, G4double, G4double) final; + const G4double, const G4double, + const G4double, const G4double) final; G4double Dispersion(const G4Material*, const G4DynamicParticle*, - G4double, G4double) final; + const G4double, const G4double, const G4double) final; void DefineForRegion(const G4Region* r) final; diff --git a/source/processes/electromagnetic/standard/include/G4UniversalFluctuation.hh b/source/processes/electromagnetic/standard/include/G4UniversalFluctuation.hh index c0cbdc5856..6d89b50ce8 100644 --- a/source/processes/electromagnetic/standard/include/G4UniversalFluctuation.hh +++ b/source/processes/electromagnetic/standard/include/G4UniversalFluctuation.hh @@ -64,12 +64,13 @@ public: G4double SampleFluctuations(const G4MaterialCutsCouple*, const G4DynamicParticle*, - G4double, G4double, - G4double) override; + const G4double, const G4double, + const G4double, const G4double) override; G4double Dispersion(const G4Material*, const G4DynamicParticle*, - G4double, G4double) override; + const G4double, const G4double, + const G4double) override; void InitialiseMe(const G4ParticleDefinition*) final; @@ -77,6 +78,10 @@ public: void SetParticleAndCharge(const G4ParticleDefinition*, G4double q2) final; + // hide assignment operator + G4UniversalFluctuation & operator=(const G4UniversalFluctuation &right) = delete; + G4UniversalFluctuation(const G4UniversalFluctuation&) = delete; + private: inline void AddExcitation(CLHEP::HepRandomEngine* rndm, @@ -87,43 +92,31 @@ private: G4double eav, G4double esig2, G4double& eloss); - // hide assignment operator - G4UniversalFluctuation & operator=(const G4UniversalFluctuation &right) = delete; - G4UniversalFluctuation(const G4UniversalFluctuation&) = delete; + const G4ParticleDefinition* particle = nullptr; + const G4Material* lastMaterial = nullptr; - const G4ParticleDefinition* particle; - const G4Material* lastMaterial; - - G4double particleMass; + G4double particleMass = 0.0; // Derived quantities - G4double m_Inv_particleMass; - G4double m_massrate; - G4double chargeSquare; + G4double m_Inv_particleMass = DBL_MAX; + G4double m_massrate = DBL_MAX; + G4double chargeSquare = 1.0; // data members to speed up the fluctuation calculation - G4double ipotFluct; - G4double electronDensity; - - G4double f1Fluct; - G4double f2Fluct; - G4double e1Fluct; - G4double e2Fluct; - G4double e1LogFluct; - G4double e2LogFluct; - G4double ipotLogFluct; - G4double e0; - G4double esmall; + G4double ipotFluct = 0.0; + G4double ipotLogFluct = 0.0; + G4double e0 = 0.0; + G4double e1 = 0.0; - G4double e1,e2; - - G4double minNumberInteractionsBohr; + G4double minNumberInteractionsBohr = 10.0; G4double minLoss; - G4double nmaxCont; - G4double rate,a0,fw; + G4double nmaxCont = 8.0; + G4double rate = 0.56; + G4double fw = 5.0; + G4double a0 = 15.0; - G4int sizearray; - G4double* rndmarray; + G4int sizearray = 30; + G4double* rndmarray = nullptr; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -138,7 +131,7 @@ G4UniversalFluctuation::AddExcitation(CLHEP::HepRandomEngine* rndm, eav += ax*ex; esig2 += ax*ex*ex; } else { - G4int p = G4Poisson(ax); + const G4int p = G4Poisson(ax); if(p > 0) { eloss += ((p + 1) - 2.*rndm->flat())*ex; } } } diff --git a/source/processes/electromagnetic/standard/include/G4UrbanMscModel.hh b/source/processes/electromagnetic/standard/include/G4UrbanMscModel.hh index 0f84688c49..e377c5cafe 100644 --- a/source/processes/electromagnetic/standard/include/G4UrbanMscModel.hh +++ b/source/processes/electromagnetic/standard/include/G4UrbanMscModel.hh @@ -135,7 +135,7 @@ private: G4LossTableManager* theManager; G4double mass; - G4double charge,ChargeSquare; + G4double charge,chargeSquare; G4double masslimite,fr; G4double taubig; @@ -174,6 +174,7 @@ private: G4double tlow; G4double invmev; + G4double rndmarray[2]; struct mscData { G4double ecut, Zeff, Z23, sqrtZ; @@ -205,7 +206,7 @@ void G4UrbanMscModel::SetParticle(const G4ParticleDefinition* p) particle = p; mass = p->GetPDGMass(); charge = p->GetPDGCharge()/CLHEP::eplus; - ChargeSquare = charge*charge; + chargeSquare = charge*charge; } } @@ -233,10 +234,9 @@ G4double G4UrbanMscModel::SimpleScattering(G4double xmeanth, G4double x2meanth) G4double prob = (a+2.)*xmeanth/a; // sampling - G4double rdm = rndmEngineMod->flat(); - G4double cth = (rndmEngineMod->flat() < prob) - ? -1.+2.*G4Exp(G4Log(rdm)/(a+1.)) : -1.+2.*rdm; - return cth; + rndmEngineMod->flatArray(2, rndmarray); + return (rndmarray[1] < prob) ? + -1.+2.*G4Exp(G4Log(rndmarray[0])/(a+1.)) : -1.+2.*rndmarray[0]; } inline G4double G4UrbanMscModel::ComputeStepmin() @@ -257,6 +257,5 @@ inline G4double G4UrbanMscModel::ComputeTlimitmin() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - #endif diff --git a/source/processes/electromagnetic/standard/include/G4eplusAnnihilation.hh b/source/processes/electromagnetic/standard/include/G4eplusAnnihilation.hh index b7e345e0b2..57d3200c98 100644 --- a/source/processes/electromagnetic/standard/include/G4eplusAnnihilation.hh +++ b/source/processes/electromagnetic/standard/include/G4eplusAnnihilation.hh @@ -99,7 +99,7 @@ private: G4bool isInitialised = false; const G4ParticleDefinition* theGamma; const G4ParticleDefinition* theElectron; - G4int fEntanglementModelIndex; + G4int fEntanglementModelID; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/standard/sources.cmake b/source/processes/electromagnetic/standard/sources.cmake index 6536f96850..c870e7e91c 100644 --- a/source/processes/electromagnetic/standard/sources.cmake +++ b/source/processes/electromagnetic/standard/sources.cmake @@ -29,6 +29,7 @@ geant4_add_module(G4emstandard G4IonCoulombCrossSection.hh G4IonCoulombScatteringModel.hh G4IonFluctuations.hh + G4IonICRU73Data.hh G4KleinNishinaCompton.hh G4KleinNishinaModel.hh G4LindhardSorensenData.hh @@ -60,7 +61,6 @@ geant4_add_module(G4emstandard G4WentzelVIRelModel.hh G4WentzelVIRelXSection.hh G4XrayRayleighModel.hh - G4alphaIonisation.hh G4eBremsstrahlung.hh G4eBremParametrizedModel.hh G4eBremsstrahlungRelModel.hh @@ -106,6 +106,7 @@ geant4_add_module(G4emstandard G4IonCoulombCrossSection.cc G4IonCoulombScatteringModel.cc G4IonFluctuations.cc + G4IonICRU73Data.cc G4KleinNishinaCompton.cc G4KleinNishinaModel.cc G4LindhardSorensenData.cc @@ -135,7 +136,6 @@ geant4_add_module(G4emstandard G4WentzelVIRelModel.cc G4WentzelVIRelXSection.cc G4XrayRayleighModel.cc - G4alphaIonisation.cc G4eBremsstrahlung.cc G4eBremParametrizedModel.cc G4eBremsstrahlungRelModel.cc diff --git a/source/processes/electromagnetic/standard/src/G4ASTARStopping.cc b/source/processes/electromagnetic/standard/src/G4ASTARStopping.cc index 4b8dc43c79..daa5a38bfc 100644 --- a/source/processes/electromagnetic/standard/src/G4ASTARStopping.cc +++ b/source/processes/electromagnetic/standard/src/G4ASTARStopping.cc @@ -62,7 +62,7 @@ G4ASTARStopping::G4ASTARStopping() : nvectors(0), emin(CLHEP::keV) G4ASTARStopping::~G4ASTARStopping() { if(0 < nvectors) { - for(size_t i=0; iPutValues(i, T0[i], ((G4double)stop[i])*fac); + v->PutValues(i, T0[i], stop[i]*fac); } v->FillSecondDerivatives(); materials.push_back(mat); diff --git a/source/processes/electromagnetic/standard/src/G4AtimaEnergyLossModel.cc b/source/processes/electromagnetic/standard/src/G4AtimaEnergyLossModel.cc index 6c71d504ff..d89728806f 100644 --- a/source/processes/electromagnetic/standard/src/G4AtimaEnergyLossModel.cc +++ b/source/processes/electromagnetic/standard/src/G4AtimaEnergyLossModel.cc @@ -74,14 +74,11 @@ G4double G4AtimaEnergyLossModel::tableE[] = {0.0}; G4AtimaEnergyLossModel::G4AtimaEnergyLossModel(const G4ParticleDefinition*, const G4String& nam) : G4VEmModel(nam), - particle(nullptr), - tlimit(DBL_MAX), - isIon(false) + particle(nullptr) { g4calc = G4Pow::GetInstance(); fParticleChange = nullptr; theElectron = G4Electron::Electron(); - SetParticle(theElectron); corr = G4LossTableManager::Instance()->EmCorrections(); nist = G4NistManager::Instance(); SetLowEnergyLimit(2.0*MeV); diff --git a/source/processes/electromagnetic/standard/src/G4AtimaFluctuations.cc b/source/processes/electromagnetic/standard/src/G4AtimaFluctuations.cc index ac4d4a1cbc..759516bfe7 100644 --- a/source/processes/electromagnetic/standard/src/G4AtimaFluctuations.cc +++ b/source/processes/electromagnetic/standard/src/G4AtimaFluctuations.cc @@ -119,10 +119,11 @@ void G4AtimaFluctuations::InitialiseMe(const G4ParticleDefinition* part) G4double G4AtimaFluctuations::SampleFluctuations(const G4MaterialCutsCouple* couple, - const G4DynamicParticle* dp, - G4double tmax, - G4double length, - G4double meanLoss) + const G4DynamicParticle* dp, + const G4double tcut, + const G4double tmax, + const G4double length, + const G4double meanLoss) { // G4cout << "### meanLoss= " << meanLoss << G4endl; if(meanLoss <= minLoss) return meanLoss; @@ -133,7 +134,7 @@ G4AtimaFluctuations::SampleFluctuations(const G4MaterialCutsCouple* couple, // << " " << parameter << " " << charge << " " << particleMass << G4endl; const G4Material* material = couple->GetMaterial(); - G4double siga = Dispersion(material,dp,tmax,length); + G4double siga = Dispersion(material,dp,tcut,tmax,length); CLHEP::HepRandomEngine* rndmEngine = G4Random::getTheEngine(); //G4cout << "meanLoss= " << meanLoss << " loss= " << siga << G4endl; @@ -143,12 +144,13 @@ G4AtimaFluctuations::SampleFluctuations(const G4MaterialCutsCouple* couple, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4double G4AtimaFluctuations::Dispersion(const G4Material* mat, - const G4DynamicParticle* dp, - G4double, - G4double length) + const G4DynamicParticle* dp, + const G4double, const G4double, + const G4double length) { kineticEnergy = dp->GetKineticEnergy(); const G4ParticleDefinition* p = dp->GetDefinition(); + if(particle != p) { InitialiseMe(p); } G4double ap = p->GetPDGMass()/atomic_mass_unit; G4double zp = p->GetPDGCharge(); diff --git a/source/processes/electromagnetic/standard/src/G4BetheBlochModel.cc b/source/processes/electromagnetic/standard/src/G4BetheBlochModel.cc index 1df9cc2ea8..8649901293 100644 --- a/source/processes/electromagnetic/standard/src/G4BetheBlochModel.cc +++ b/source/processes/electromagnetic/standard/src/G4BetheBlochModel.cc @@ -59,6 +59,7 @@ #include "Randomize.hh" #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" +#include "G4NistManager.hh" #include "G4Electron.hh" #include "G4LossTableManager.hh" #include "G4EmCorrections.hh" @@ -75,23 +76,14 @@ using namespace std; G4BetheBlochModel::G4BetheBlochModel(const G4ParticleDefinition*, const G4String& nam) : G4VEmModel(nam), - particle(nullptr), - fICRU90(nullptr), - currentMaterial(nullptr), - baseMaterial(nullptr), - tlimit(DBL_MAX), twoln10(2.0*G4Log(10.0)), - fAlphaTlimit(CLHEP::GeV), - fProtonTlimit(10*CLHEP::GeV), - iICRU90(-1), - isIon(false) + fAlphaTlimit(1*CLHEP::GeV), + fProtonTlimit(10*CLHEP::GeV) { - fParticleChange = nullptr; theElectron = G4Electron::Electron(); - SetParticle(theElectron); corr = G4LossTableManager::Instance()->EmCorrections(); nist = G4NistManager::Instance(); - SetLowEnergyLimit(2.0*MeV); + SetLowEnergyLimit(2.0*CLHEP::MeV); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -104,8 +96,7 @@ G4BetheBlochModel::~G4BetheBlochModel() void G4BetheBlochModel::Initialise(const G4ParticleDefinition* p, const G4DataVector&) { - SetGenericIon(p); - SetParticle(p); + if(p != particle) { SetupParameters(p); } //G4cout << "G4BetheBlochModel::Initialise for " << p->GetParticleName() // << " isIon= " << isIon @@ -114,14 +105,20 @@ void G4BetheBlochModel::Initialise(const G4ParticleDefinition* p, // always false before the run SetDeexcitationFlag(false); - if(IsMaster() && G4EmParameters::Instance()->UseICRU90Data()) { - if(!fICRU90) { fICRU90 = nist->GetICRU90StoppingData(); } - else if(particle->GetPDGMass() < GeV) { fICRU90->Initialise(); } - } - + // initialisation once if(nullptr == fParticleChange) { + const G4String& pname = particle->GetParticleName(); + if(IsMaster() && G4EmParameters::Instance()->UseICRU90Data() && + (pname == "proton" || pname == "GenericIon" || pname == "alpha")) { + fICRU90 = nist->GetICRU90StoppingData(); + fICRU90->Initialise(); + } + if(particle->GetPDGCharge() > CLHEP::eplus || + pname == "GenericIon") { isIon = true; } + if(pname == "alpha") { isAlpha = true; } + fParticleChange = GetParticleChangeForLoss(); - if(UseAngularGeneratorFlag() && !GetAngularDistribution()) { + if(UseAngularGeneratorFlag() && nullptr == GetAngularDistribution()) { SetAngularDistribution(new G4DeltaAngle()); } } @@ -133,10 +130,9 @@ G4double G4BetheBlochModel::GetChargeSquareRatio(const G4ParticleDefinition* p, const G4Material* mat, G4double kineticEnergy) { - // this method is called only for ions - G4double q2 = corr->EffectiveChargeSquareRatio(p,mat,kineticEnergy); - corrFactor = q2*corr->EffectiveChargeCorrection(p,mat,kineticEnergy); - return corrFactor; + // this method is called only for ions, so no check if it is an ion + return + (!isAlpha) ? corr->EffectiveChargeSquareRatio(p,mat,kineticEnergy) : 1.0; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -145,30 +141,29 @@ G4double G4BetheBlochModel::GetParticleCharge(const G4ParticleDefinition* p, const G4Material* mat, G4double kineticEnergy) { - //G4cout<<"G4BetheBlochModel::GetParticleCharge e= "<GetParticleName() + << " q2=" << chargeSquare + << " inside " << material->GetName() << G4endl; + */ + if(nullptr != fICRU90 && kineticEnergy < fProtonTlimit) { if(material != currentMaterial) { currentMaterial = material; baseMaterial = material->GetBaseMaterial() @@ -275,24 +280,30 @@ G4double G4BetheBlochModel::ComputeDEDXPerVolume(const G4Material* material, iICRU90 = fICRU90->GetIndex(baseMaterial); } if(iICRU90 >= 0) { - G4double e = kineticEnergy*proton_mass_c2/mass; G4double dedx = 0.0; - if(chargeSquare > 1.1 && e < fAlphaTlimit) { - dedx = fICRU90->GetElectronicDEDXforAlpha(iICRU90, e) - *material->GetDensity()*0.25; - } else if(chargeSquare < 1.1 && e < fProtonTlimit) { - dedx = fICRU90->GetElectronicDEDXforProton(iICRU90, e) - *material->GetDensity(); + // only for alpha + if(isAlpha) { + if(kineticEnergy <= fAlphaTlimit) { + dedx = fICRU90->GetElectronicDEDXforAlpha(iICRU90, kineticEnergy); + } else { + const G4double e = kineticEnergy*CLHEP::proton_mass_c2/mass; + dedx = fICRU90->GetElectronicDEDXforProton(iICRU90, e)*chargeSquare; + } + } else { + dedx = fICRU90->GetElectronicDEDXforProton(iICRU90, kineticEnergy) + *chargeSquare; } + dedx *= material->GetDensity(); if(cutEnergy < tmax) { - dedx += (G4Log(xc) + (1.0 - xc)*beta2)*twopi_mc2_rcl2 - *eDensity/beta2; - return std::max(chargeSquare*dedx, 0.0); + dedx += (G4Log(xc) + (1.0 - xc)*beta2)*CLHEP::twopi_mc2_rcl2 + *(eDensity*chargeSquare/beta2); } - } + //G4cout << " iICRU90=" << iICRU90 << " dedx=" << dedx << G4endl; + if(dedx > 0.0) { return dedx; } + } } // general Bethe-Bloch formula - G4double dedx = G4Log(2.0*electron_mass_c2*bg2*cutEnergy/eexc2) + G4double dedx = G4Log(2.0*CLHEP::electron_mass_c2*bg2*cutEnergy/eexc2) - (1.0 + xc)*beta2; if(0.0 < spin) { @@ -308,7 +319,7 @@ G4double G4BetheBlochModel::ComputeDEDXPerVolume(const G4Material* material, dedx -= 2.0*corr->ShellCorrection(p,material,kineticEnergy); // now compute the total ionization loss - dedx *= twopi_mc2_rcl2*chargeSquare*eDensity/beta2; + dedx *= CLHEP::twopi_mc2_rcl2*chargeSquare*eDensity/beta2; //High order correction different for hadrons and ions if(isIon) { @@ -318,10 +329,10 @@ G4double G4BetheBlochModel::ComputeDEDXPerVolume(const G4Material* material, } dedx = std::max(dedx, 0.0); - - //G4cout << "E(MeV)= " << kineticEnergy/MeV << " dedx= " << dedx - // << " " << material->GetName() << G4endl; - + /* + G4cout << "E(MeV)= " << kineticEnergy/CLHEP::MeV << " dedx= " << dedx + << " " << material->GetName() << G4endl; + */ return dedx; } @@ -332,32 +343,30 @@ void G4BetheBlochModel::CorrectionsAlongStep(const G4MaterialCutsCouple* couple, const G4double& length, G4double& eloss) { + // no correction at the last step + const G4double preKinEnergy = dp->GetKineticEnergy(); + if(eloss >= preKinEnergy) { return; } + + const G4ParticleDefinition* p = dp->GetDefinition(); + if(p != particle) { SetupParameters(p); } if(isIon) { const G4Material* mat = couple->GetMaterial(); - const G4ParticleDefinition* p = dp->GetDefinition(); - const G4double preKinEnergy = dp->GetKineticEnergy(); - G4double e = preKinEnergy - eloss*0.5; - if(e < preKinEnergy*0.75) { e = preKinEnergy*0.75; } + G4double e = std::max(preKinEnergy - eloss*0.5, preKinEnergy*0.75); const G4double q2 = corr->EffectiveChargeSquareRatio(p,mat,e); GetModelOfFluctuations()->SetParticleAndCharge(p, q2); - G4double qfactor = q2*corr->EffectiveChargeCorrection(p,mat,e)/corrFactor; - - // no high order correction for ICRU90 data - baseMaterial = mat->GetBaseMaterial() ? mat->GetBaseMaterial() : mat; - G4double highOrder = 0.0; - if(!fICRU90 || fICRU90->GetIndex(baseMaterial) < 0) { - highOrder = length*corr->IonHighOrderCorrections(p,couple,e); - } - G4double elossnew = eloss*qfactor + highOrder; - eloss = std::max(std::min(elossnew,preKinEnergy),eloss*0.5); - /* + const G4double qfactor = + q2*corr->EffectiveChargeCorrection(p,mat,e)/chargeSquare; + const G4double highOrder = length*corr->IonHighOrderCorrections(p,couple,e); + const G4double elossnew = eloss*qfactor + highOrder; + /* G4cout << "G4BetheBlochModel::CorrectionsAlongStep: e= " << preKinEnergy - << " qfactor= " << qfactor - << " highOrder= " << highOrder << " (" + << " eloss=" << eloss << " elossnew=" << elossnew + << " qfactor= " << qfactor << " highOrder= " << highOrder << " (ratio=" << highOrder/eloss << ")" - " q2= " << q2 << " corrFactor= " << corrFactor << G4endl; + " q2= " << q2 << " chargeSquare= " << chargeSquare << G4endl; */ + eloss = elossnew; } } @@ -480,7 +489,7 @@ G4double G4BetheBlochModel::MaxSecondaryEnergy(const G4ParticleDefinition* pd, { // here particle type is checked for the case, // when this model is shared between particles - SetParticle(pd); + if(pd != particle) { SetupParameters(pd); } G4double tau = kinEnergy/mass; return 2.0*CLHEP::electron_mass_c2*tau*(tau + 2.) / (1. + 2.0*(tau + 1.)*ratio + ratio*ratio); diff --git a/source/processes/electromagnetic/standard/src/G4BraggIonModel.cc b/source/processes/electromagnetic/standard/src/G4BraggIonModel.cc index 53dadde6e0..884a03ab82 100644 --- a/source/processes/electromagnetic/standard/src/G4BraggIonModel.cc +++ b/source/processes/electromagnetic/standard/src/G4BraggIonModel.cc @@ -23,7 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// // ------------------------------------------------------------------- // // GEANT4 Class file @@ -79,17 +78,17 @@ G4ASTARStopping* G4BraggIonModel::fASTAR = nullptr; G4BraggIonModel::G4BraggIonModel(const G4ParticleDefinition* p, const G4String& nam) - : G4VEmModel(nam) + : G4VEmModel(nam), + theElectron(G4Electron::Electron()), + HeMass(3.727417*CLHEP::GeV), + theZieglerFactor(CLHEP::eV*CLHEP::cm2*1.0e-15), + lowestKinEnergy(0.25*CLHEP::keV) { SetHighEnergyLimit(2.0*CLHEP::MeV); - HeMass = 3.727417*CLHEP::GeV; - rateMassHe2p = HeMass/CLHEP::proton_mass_c2; - lowestKinEnergy = 1.0*CLHEP::keV/rateMassHe2p; - massFactor = 1000.*amu_c2/HeMass; - theZieglerFactor = CLHEP::eV*CLHEP::cm2*1.0e-15; - theElectron = G4Electron::Electron(); - corrFactor = 1.0; + rateMassHe2p = HeMass/CLHEP::proton_mass_c2; + massFactor = 1000.*CLHEP::amu_c2/HeMass; + if(nullptr != p) { SetParticle(p); } else { SetParticle(theElectron); } } @@ -108,32 +107,31 @@ void G4BraggIonModel::Initialise(const G4ParticleDefinition* p, { if(p != particle) { SetParticle(p); } - corrFactor = chargeSquare; - // always false before the run SetDeexcitationFlag(false); - if(IsMaster()) { - if(nullptr == fASTAR) { fASTAR = new G4ASTARStopping(); } - if(particle->GetPDGMass() < CLHEP::GeV) { fASTAR->Initialise(); } - if(G4EmParameters::Instance()->UseICRU90Data()) { - if(nullptr == fICRU90) { - fICRU90 = G4NistManager::Instance()->GetICRU90StoppingData(); - } else if(particle->GetPDGMass() < CLHEP::GeV) { fICRU90->Initialise(); } - } - } - + // initialise once if(nullptr == fParticleChange) { + const G4String& pname = particle->GetParticleName(); + if(IsMaster()) { + if(pname == "proton" || pname == "GenericIon" || pname == "alpha") { + if(nullptr == fASTAR) { fASTAR = new G4ASTARStopping(); } + fASTAR->Initialise(); + + if(G4EmParameters::Instance()->UseICRU90Data()) { + fICRU90 = G4NistManager::Instance()->GetICRU90StoppingData(); + fICRU90->Initialise(); + } + } + } + if(particle->GetPDGCharge() > CLHEP::eplus || pname == "GenericIon") { + isIon = true; + } + if(pname == "alpha") { isAlpha = true; } if(UseAngularGeneratorFlag() && nullptr == GetAngularDistribution()) { SetAngularDistribution(new G4DeltaAngle()); } - G4String pname = particle->GetParticleName(); - if(particle->GetParticleType() == "nucleus" && - pname != "deuteron" && pname != "triton" && - pname != "alpha+" && pname != "helium" && - pname != "hydrogen") { isIon = true; } - corr = G4LossTableManager::Instance()->EmCorrections(); fParticleChange = GetParticleChangeForLoss(); @@ -154,11 +152,8 @@ G4double G4BraggIonModel::GetChargeSquareRatio(const G4ParticleDefinition* p, const G4Material* mat, G4double kineticEnergy) { - //G4cout<<"G4BraggIonModel::GetChargeSquareRatio e= "<EffectiveChargeSquareRatio(p,mat,kineticEnergy); - corrFactor = q2*corr->EffectiveChargeCorrection(p,mat,kineticEnergy); - return corrFactor; + return + (!isAlpha) ? corr->EffectiveChargeSquareRatio(p,mat,kineticEnergy) : 1.0; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -167,9 +162,6 @@ G4double G4BraggIonModel::GetParticleCharge(const G4ParticleDefinition* p, const G4Material* mat, G4double kineticEnergy) { - //G4cout<<"G4BraggIonModel::GetParticleCharge e= "<GetParticleName() <* vdp, const G4MaterialCutsCouple* couple, const G4DynamicParticle* dp, - G4double xmin, + G4double minEnergy, G4double maxEnergy) { - G4double tmax = MaxSecondaryKinEnergy(dp); - G4double xmax = std::min(tmax, maxEnergy); + const G4double tmax = MaxSecondaryKinEnergy(dp); + const G4double xmax = std::min(tmax, maxEnergy); + const G4double xmin = std::max(lowestKinEnergy*massRate, minEnergy); if(xmin >= xmax) { return; } G4double kineticEnergy = dp->GetKineticEnergy(); - G4double energy = kineticEnergy + mass; - G4double energy2 = energy*energy; - G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; - G4double grej = 1.0; + const G4double energy = kineticEnergy + mass; + const G4double energy2 = energy*energy; + const G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; + const G4double grej = 1.0; G4double deltaKinEnergy, f; CLHEP::HepRandomEngine* rndmEngineMod = G4Random::getTheEngine(); @@ -385,10 +397,24 @@ G4double G4BraggIonModel::MaxSecondaryEnergy(const G4ParticleDefinition* pd, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void G4BraggIonModel::HasMaterial(const G4Material* mat) +void G4BraggIonModel::SetParticle(const G4ParticleDefinition* p) +{ + particle = p; + mass = particle->GetPDGMass(); + spin = particle->GetPDGSpin(); + G4double q = particle->GetPDGCharge()/CLHEP::eplus; + if(!isIon && q > 1.1) { isIon = true; } + effChargeSquare = chargeSquare = q*q; + massRate = mass/CLHEP::proton_mass_c2; + ratio = CLHEP::electron_mass_c2/mass; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4int G4BraggIonModel::HasMaterial(const G4Material* mat) const { const G4String& chFormula = mat->GetChemicalFormula(); - if(chFormula.empty()) { return; } + if(chFormula.empty()) { return -1; } // ICRU Report N49, 1993. Ziegler model for He. @@ -401,18 +427,17 @@ void G4BraggIonModel::HasMaterial(const G4Material* mat) // Search for the material in the table for (size_t i=0; iGetNumberOfElements())) { - G4double z = material->GetZ() ; + const G4double z = material->GetZ() ; ionloss = ElectronicStoppingPower( z, kineticEnergy ) ; } @@ -486,18 +512,20 @@ G4double G4BraggIonModel::StoppingPower(const G4Material* material, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4double G4BraggIonModel::ElectronicStoppingPower(G4double z, - G4double kineticEnergy) const +G4double +G4BraggIonModel::ElectronicStoppingPower(const G4double z, + const G4double kineticEnergy) const { G4double ionloss ; G4int i = std::min(std::max(G4lrint(z)-1,0),91); // index of atom - + //G4cout << "ElectronicStoppingPower z=" << z << " i=" << i + // << " E=" << kineticEnergy << G4endl; // The data and the fit from: // ICRU Report 49, 1993. Ziegler's type of parametrisations. // Proton kinetic energy for parametrisation (keV/amu) - // He energy in internal units of parametrisation formula (MeV) - G4double T = kineticEnergy*rateMassHe2p/MeV ; + //G4double T = kineticEnergy*rateMassHe2p/CLHEP::MeV; + G4double T = kineticEnergy/CLHEP::MeV; static const G4float a[92][5] = { { 0.35485f, 0.6456f, 6.01525f, 20.8933f, 4.3515f @@ -616,7 +644,7 @@ G4double G4BraggIonModel::ElectronicStoppingPower(G4double z, // Free electron gas model if ( T < 0.001 ) { G4double shigh = G4Log( 1.0 + x3*1000.0 + x4*0.001 )* x2*1000.0; - ionloss = slow*shigh*sqrt(T*1000.0) / (slow + shigh) ; + ionloss = slow*shigh*std::sqrt(T*1000.0) / (slow + shigh) ; // Main parametrisation } else { @@ -627,23 +655,24 @@ G4double G4BraggIonModel::ElectronicStoppingPower(G4double z, G4cout << "## " << i << ". T= " << T << " slow= " << slow << " a0= " << a[i][0] << " a1= " << a[i][1] << " shigh= " << shigh - << " dedx= " << ionloss << " q^2= " << HeEffChargeSquare(z, T*MeV) + << " dedx= " << ionloss << " q^2= " << HeEffChargeSquare(z, T) << G4endl; */ } ionloss = std::max(ionloss, 0.0); // He effective charge - ionloss /= HeEffChargeSquare(z, T); - + // ionloss /= effChargeSquare; + // G4cout << ionloss << G4endl; return ionloss; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double G4BraggIonModel::DEDX(const G4Material* material, - G4double kineticEnergy) + const G4double aEnergy) { + // aEnergy is energy of alpha G4double eloss = 0.0; // check DB if(material != currentMaterial) { @@ -652,55 +681,58 @@ G4double G4BraggIonModel::DEDX(const G4Material* material, ? material->GetBaseMaterial() : material; iASTAR = -1; iMolecula = -1; - iICRU90 = fICRU90 ? fICRU90->GetIndex(baseMaterial) : -1; + iICRU90 = (nullptr != fICRU90) ? fICRU90->GetIndex(baseMaterial) : -1; if(iICRU90 < 0) { iASTAR = fASTAR->GetIndex(baseMaterial); - if(iASTAR < 0) { HasMaterial(baseMaterial); } + if(iASTAR < 0) { iMolecula = HasMaterial(baseMaterial); } } - //G4cout << "%%% " <GetName() << " iMolecula= " - // << iMolecula << " iPSTAR= " << iPSTAR - // << " iICRU90= " << iICRU90<< G4endl; + /* + G4cout << "%%% " <GetName() << " iMolecula= " + << iMolecula << " iASTAR= " << iASTAR + << " iICRU90= " << iICRU90<< G4endl; + */ } + // ICRU90 if(iICRU90 >= 0) { - return fICRU90->GetElectronicDEDXforAlpha(iICRU90, kineticEnergy) - *material->GetDensity()/chargeSquare; + eloss = fICRU90->GetElectronicDEDXforAlpha(iICRU90, aEnergy); + if(eloss > 0.0) { return eloss*material->GetDensity(); } } + // ASTAR if( iASTAR >= 0 ) { - G4double T = kineticEnergy*rateMassHe2p; - G4int zeff = G4lrint(material->GetTotNbOfElectPerVolume()/ - material->GetTotNbOfAtomsPerVolume()); - return fASTAR->GetElectronicDEDX(iASTAR, T)*material->GetDensity()/ - HeEffChargeSquare(zeff, T/MeV); + eloss = fASTAR->GetElectronicDEDX(iASTAR, aEnergy); + /* + G4cout << "ASTAR: E=" << aEnergy + << " dedx=" << eloss*material->GetDensity() + << " " << particle->GetParticleName() << G4endl; + */ + if(eloss > 0.0) { return eloss*material->GetDensity(); } } const G4int numberOfElements = material->GetNumberOfElements(); const G4double* theAtomicNumDensityVector = - material->GetAtomicNumDensityVector(); + material->GetAtomicNumDensityVector(); if(iMolecula >= 0) { - eloss = StoppingPower(baseMaterial, kineticEnergy)* - material->GetDensity()/amu; + eloss = StoppingPower(baseMaterial, aEnergy)*material->GetDensity()/amu; // pure material } else if(1 == numberOfElements) { - G4double z = material->GetZ(); - eloss = ElectronicStoppingPower(z, kineticEnergy) + const G4double z = material->GetZ(); + eloss = ElectronicStoppingPower(z, aEnergy) * (material->GetTotNbOfAtomsPerVolume()); // Brugg's rule calculation } else { - const G4ElementVector* theElementVector = - material->GetElementVector() ; + const G4ElementVector* theElmVector = material->GetElementVector(); // loop for the elements in the material - for (G4int i=0; iGetZ(), kineticEnergy) - * theAtomicNumDensityVector[i]; + for (G4int i=0; iGetZ(), aEnergy) + * theAtomicNumDensityVector[i]; } } return eloss*theZieglerFactor; @@ -708,8 +740,9 @@ G4double G4BraggIonModel::DEDX(const G4Material* material, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4double G4BraggIonModel::HeEffChargeSquare(G4double z, - G4double kinEnergyHeInMeV) const +G4double +G4BraggIonModel::HeEffChargeSquare(const G4double z, + const G4double kinEnergyHeInMeV) const { // The aproximation of He effective charge from: // J.F.Ziegler, J.P. Biersack, U. Littmark diff --git a/source/processes/electromagnetic/standard/src/G4BraggModel.cc b/source/processes/electromagnetic/standard/src/G4BraggModel.cc index 49637f9866..f9c78b17f1 100644 --- a/source/processes/electromagnetic/standard/src/G4BraggModel.cc +++ b/source/processes/electromagnetic/standard/src/G4BraggModel.cc @@ -87,7 +87,7 @@ G4BraggModel::G4BraggModel(const G4ParticleDefinition* p, const G4String& nam) { SetHighEnergyLimit(2.0*CLHEP::MeV); - lowestKinEnergy = 1.0*CLHEP::keV; + lowestKinEnergy = 0.25*CLHEP::keV; theZieglerFactor = CLHEP::eV*CLHEP::cm2*1.0e-15; theElectron = G4Electron::Electron(); expStopPower125 = 0.0; @@ -101,7 +101,10 @@ G4BraggModel::G4BraggModel(const G4ParticleDefinition* p, const G4String& nam) G4BraggModel::~G4BraggModel() { - if(IsMaster()) { delete fPSTAR; fPSTAR = nullptr; } + if(IsMaster()) { + delete fPSTAR; + fPSTAR = nullptr; + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -153,6 +156,14 @@ G4double G4BraggModel::GetChargeSquareRatio(const G4ParticleDefinition* p, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4double G4BraggModel::MinEnergyCut(const G4ParticleDefinition*, + const G4MaterialCutsCouple* couple) +{ + return couple->GetMaterial()->GetIonisation()->GetMeanExcitationEnergy(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + G4double G4BraggModel::GetParticleCharge(const G4ParticleDefinition* p, const G4Material* mat, G4double kineticEnergy) @@ -166,17 +177,18 @@ G4double G4BraggModel::GetParticleCharge(const G4ParticleDefinition* p, G4double G4BraggModel::ComputeCrossSectionPerElectron( const G4ParticleDefinition* p, G4double kineticEnergy, - G4double cutEnergy, + G4double cut, G4double maxKinEnergy) { - G4double cross = 0.0; - G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); - G4double maxEnergy = std::min(tmax,maxKinEnergy); + G4double cross = 0.0; + const G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); + const G4double maxEnergy = std::min(tmax, maxKinEnergy); + const G4double cutEnergy = std::max(cut, lowestKinEnergy*massRate); if(cutEnergy < maxEnergy) { - G4double energy = kineticEnergy + mass; - G4double energy2 = energy*energy; - G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; + const G4double energy = kineticEnergy + mass; + const G4double energy2 = energy*energy; + const G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; cross = (maxEnergy - cutEnergy)/(cutEnergy*maxEnergy) - beta2*G4Log(maxEnergy/cutEnergy)/tmax; @@ -184,9 +196,8 @@ G4double G4BraggModel::ComputeCrossSectionPerElectron( cross *= CLHEP::twopi_mc2_rcl2*chargeSquare/beta2; } - // G4cout << "BR: e= " << kineticEnergy << " tmin= " << cutEnergy - // << " tmax= " << tmax << " cross= " << cross << G4endl; - + // G4cout << "BR: e= " << kineticEnergy << " tmin= " << cutEnergy + // << " tmax= " << tmax << " cross= " << cross << G4endl; return cross; } @@ -220,32 +231,26 @@ G4double G4BraggModel::CrossSectionPerVolume(const G4Material* material, G4double G4BraggModel::ComputeDEDXPerVolume(const G4Material* material, const G4ParticleDefinition* p, G4double kineticEnergy, - G4double cutEnergy) + G4double cut) { - G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); - G4double tkin = kineticEnergy/massRate; + const G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); + const G4double tkin = kineticEnergy/massRate; + const G4double cutEnergy = std::max(cut, lowestKinEnergy*massRate); G4double dedx = 0.0; if(tkin < lowestKinEnergy) { dedx = DEDX(material, lowestKinEnergy)*std::sqrt(tkin/lowestKinEnergy); } else { dedx = DEDX(material, tkin); + + if (cutEnergy < tmax) { + const G4double tau = kineticEnergy/mass; + const G4double x = cutEnergy/tmax; + + dedx += (G4Log(x)*(tau + 1.)*(tau + 1.)/(tau * (tau + 2.0)) + 1.0 - x) * + CLHEP::twopi_mc2_rcl2 * material->GetElectronDensity(); + } } - - if (cutEnergy < tmax) { - - G4double tau = kineticEnergy/mass; - G4double gam = tau + 1.0; - G4double bg2 = tau * (tau+2.0); - G4double beta2 = bg2/(gam*gam); - G4double x = cutEnergy/tmax; - - dedx += (G4Log(x) + (1.0 - x)*beta2) * CLHEP::twopi_mc2_rcl2 - * (material->GetElectronDensity())/beta2; - } - - // now compute the total ionization loss - dedx = std::max(dedx, 0.0) * chargeSquare; //G4cout << "E(MeV)= " << tkin/MeV << " dedx= " << dedx @@ -258,18 +263,19 @@ G4double G4BraggModel::ComputeDEDXPerVolume(const G4Material* material, void G4BraggModel::SampleSecondaries(std::vector* vdp, const G4MaterialCutsCouple* couple, const G4DynamicParticle* dp, - G4double xmin, + G4double minEnergy, G4double maxEnergy) { - G4double tmax = MaxSecondaryKinEnergy(dp); - G4double xmax = std::min(tmax, maxEnergy); + const G4double tmax = MaxSecondaryKinEnergy(dp); + const G4double xmax = std::min(tmax, maxEnergy); + const G4double xmin = std::max(lowestKinEnergy*massRate, minEnergy); if(xmin >= xmax) { return; } G4double kineticEnergy = dp->GetKineticEnergy(); - G4double energy = kineticEnergy + mass; - G4double energy2 = energy*energy; - G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; - G4double grej = 1.0; + const G4double energy = kineticEnergy + mass; + const G4double energy2 = energy*energy; + const G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; + const G4double grej = 1.0; G4double deltaKinEnergy, f; CLHEP::HepRandomEngine* rndmEngineMod = G4Random::getTheEngine(); diff --git a/source/processes/electromagnetic/standard/src/G4CoulombScattering.cc b/source/processes/electromagnetic/standard/src/G4CoulombScattering.cc index 74440c901e..78568669f9 100644 --- a/source/processes/electromagnetic/standard/src/G4CoulombScattering.cc +++ b/source/processes/electromagnetic/standard/src/G4CoulombScattering.cc @@ -63,6 +63,7 @@ G4CoulombScattering::G4CoulombScattering(const G4String& name) // G4cout << "G4CoulombScattering constructor "<< G4endl; SetBuildTableFlag(true); SetStartFromNullFlag(false); + SetSplineFlag(false); SetCrossSectionType(fEmOnePeak); SetSecondaryParticle(G4Proton::Proton()); SetProcessSubType(fCoulombScattering); diff --git a/source/processes/electromagnetic/standard/src/G4ESTARStopping.cc b/source/processes/electromagnetic/standard/src/G4ESTARStopping.cc index 2e11b78193..ab71fdaac8 100644 --- a/source/processes/electromagnetic/standard/src/G4ESTARStopping.cc +++ b/source/processes/electromagnetic/standard/src/G4ESTARStopping.cc @@ -51,13 +51,9 @@ G4ESTARStopping::G4ESTARStopping(const G4String& datatype) { - currentMaterial = 0; - matIndex = -1; - sdata.resize(280,nullptr); name.resize(280,""); - type = 0; if("basic" == datatype) { type = 1; } else if("long" == datatype) { type = 2; } @@ -98,6 +94,7 @@ G4double G4ESTARStopping::GetElectronicDEDX(G4int i, G4double energy) << i << " is out of range!" << G4endl; return res; } + G4double emin = sdata[i]->Energy(0); if(energy < emin) { res = (*(sdata[i]))[0]*std::sqrt(energy/emin); } else { res = sdata[i]->Value(energy); } return res; @@ -113,7 +110,6 @@ void G4ESTARStopping::Initialise() } static const G4double T0[25]={1.0E-03,3.0E-03,5.0E-03,9.0E-03,2.5E-02,4.5E-02,8.0E-02,.2,.4,.7,1.5,3.5,6.0,10.,30.,50.,90.,250.,450.,800.,2000.,4.0E+03,6.0E+03,8.0E+03,1.0E+04}; -emin = T0[0]*MeV; name[1]="G4_1,2-DICHLOROBENZENE"; static const G4double e1[25]={9.473E+01,4.632E+01,3.203E+01,2.063E+01,9.472,6.123,4.106,2.428,1.878,1.678,1.619,1.716,1.841,2.015,2.762,3.48,4.914,1.07E+01,1.799E+01,3.08E+01,7.487E+01,1.485E+02,2.221E+02,2.958E+02,3.695E+02}; diff --git a/source/processes/electromagnetic/standard/src/G4ICRU73QOModel.cc b/source/processes/electromagnetic/standard/src/G4ICRU73QOModel.cc index ae53f46244..e0bb62ce19 100644 --- a/source/processes/electromagnetic/standard/src/G4ICRU73QOModel.cc +++ b/source/processes/electromagnetic/standard/src/G4ICRU73QOModel.cc @@ -40,8 +40,6 @@ // // ------------------------------------------------------------------- // - - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -123,17 +121,18 @@ void G4ICRU73QOModel::Initialise(const G4ParticleDefinition* p, G4double G4ICRU73QOModel::ComputeCrossSectionPerElectron( const G4ParticleDefinition* p, G4double kineticEnergy, - G4double cutEnergy, + G4double cut, G4double maxKinEnergy) { - G4double cross = 0.0; - G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); - G4double maxEnergy = std::min(tmax,maxKinEnergy); + G4double cross = 0.0; + const G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); + const G4double maxEnergy = std::min(tmax, maxKinEnergy); + const G4double cutEnergy = std::max(cut, lowestKinEnergy*massRate); if(cutEnergy < maxEnergy) { - G4double energy = kineticEnergy + mass; - G4double energy2 = energy*energy; - G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; + const G4double energy = kineticEnergy + mass; + const G4double energy2 = energy*energy; + const G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; cross = (maxEnergy - cutEnergy)/(cutEnergy*maxEnergy) - beta2*G4Log(maxEnergy/cutEnergy)/tmax; @@ -177,27 +176,24 @@ G4double G4ICRU73QOModel::CrossSectionPerVolume( G4double G4ICRU73QOModel::ComputeDEDXPerVolume(const G4Material* material, const G4ParticleDefinition* p, G4double kineticEnergy, - G4double cutEnergy) + G4double cut) { SetParticle(p); - G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); - G4double tkin = kineticEnergy/massRate; + const G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); + const G4double tkin = kineticEnergy/massRate; + const G4double cutEnergy = std::max(cut, lowestKinEnergy*massRate); G4double dedx = 0.0; if(tkin > lowestKinEnergy) { dedx = DEDX(material, tkin); } else { dedx = DEDX(material, lowestKinEnergy)*sqrt(tkin/lowestKinEnergy); } if (cutEnergy < tmax) { - G4double tau = kineticEnergy/mass; - G4double gam = tau + 1.0; - G4double bg2 = tau * (tau+2.0); - G4double beta2 = bg2/(gam*gam); - G4double x = cutEnergy/tmax; - - dedx += chargeSquare*( G4Log(x) + (1.0 - x)*beta2 ) * twopi_mc2_rcl2 - * material->GetElectronDensity()/beta2; + const G4double tau = kineticEnergy/mass; + const G4double x = cutEnergy/tmax; + dedx += (G4Log(x)*(tau + 1.)*(tau + 1.)/(tau * (tau + 2.0)) + 1.0 - x) * + CLHEP::twopi_mc2_rcl2 *chargeSquare * material->GetElectronDensity(); } - if(dedx < 0.0) { dedx = 0.0; } + dedx = std::max(dedx, 0.0); return dedx; } @@ -219,7 +215,7 @@ G4double G4ICRU73QOModel::DEDX(const G4Material* material, for (G4int i=0; iGetZasInt(), kineticEnergy) + eloss += DEDXPerElement(element->GetZasInt(), kineticEnergy) * theAtomicNumDensityVector[i] * element->GetZ(); } return eloss; @@ -413,17 +409,18 @@ void G4ICRU73QOModel::CorrectionsAlongStep(const G4MaterialCutsCouple*, void G4ICRU73QOModel::SampleSecondaries(std::vector* vdp, const G4MaterialCutsCouple* couple, const G4DynamicParticle* dp, - G4double xmin, + G4double minEnergy, G4double maxEnergy) { - G4double tmax = MaxSecondaryKinEnergy(dp); - G4double xmax = std::min(tmax, maxEnergy); + const G4double tmax = MaxSecondaryKinEnergy(dp); + const G4double xmax = std::min(tmax, maxEnergy); + const G4double xmin = std::max(minEnergy, lowestKinEnergy*massRate); if(xmin >= xmax) { return; } G4double kineticEnergy = dp->GetKineticEnergy(); - G4double energy = kineticEnergy + mass; - G4double energy2 = energy*energy; - G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; + const G4double energy = kineticEnergy + mass; + const G4double energy2 = energy*energy; + const G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; G4double grej = 1.0; G4double deltaKinEnergy, f; diff --git a/source/processes/electromagnetic/standard/src/G4IonFluctuations.cc b/source/processes/electromagnetic/standard/src/G4IonFluctuations.cc index 8bb5c27e4a..1c3ed5c00c 100644 --- a/source/processes/electromagnetic/standard/src/G4IonFluctuations.cc +++ b/source/processes/electromagnetic/standard/src/G4IonFluctuations.cc @@ -55,6 +55,7 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... #include "G4IonFluctuations.hh" +#include "G4UniversalFluctuation.hh" #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" #include "Randomize.hh" @@ -71,19 +72,12 @@ using namespace std; G4IonFluctuations::G4IonFluctuations(const G4String& nam) : G4VEmFluctuationModel(nam), - particle(0), particleMass(CLHEP::proton_mass_c2), - charge(1.0), - chargeSquare(1.0), - effChargeSquare(1.0), parameter(10.0*CLHEP::MeV/CLHEP::proton_mass_c2), theBohrBeta2(50.0*keV/CLHEP::proton_mass_c2), - minFraction(0.2), - xmin(0.2), minLoss(0.001*CLHEP::eV) { - kineticEnergy = 0.0; - beta2 = 0.0; + uniFluct = new G4UniversalFluctuation(); g4calc = G4Pow::GetInstance(); } @@ -96,12 +90,11 @@ G4IonFluctuations::~G4IonFluctuations() void G4IonFluctuations::InitialiseMe(const G4ParticleDefinition* part) { - particle = part; - particleMass = part->GetPDGMass(); - charge = part->GetPDGCharge()/eplus; - chargeSquare = charge*charge; - effChargeSquare= chargeSquare; - uniFluct.InitialiseMe(part); + particle = part; + particleMass = part->GetPDGMass(); + charge = part->GetPDGCharge()/eplus; + effChargeSquare = chargeSquare = charge*charge; + uniFluct->InitialiseMe(part); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -109,9 +102,10 @@ void G4IonFluctuations::InitialiseMe(const G4ParticleDefinition* part) G4double G4IonFluctuations::SampleFluctuations(const G4MaterialCutsCouple* couple, const G4DynamicParticle* dp, - G4double tmax, - G4double length, - G4double meanLoss) + const G4double tcut, + const G4double tmax, + const G4double length, + const G4double meanLoss) { // G4cout << "### meanLoss= " << meanLoss << G4endl; if(meanLoss <= minLoss) return meanLoss; @@ -120,13 +114,13 @@ G4IonFluctuations::SampleFluctuations(const G4MaterialCutsCouple* couple, // << dp->GetKineticEnergy() // << " Elim(MeV)= " << parameter*charge*particleMass << G4endl; - // Vavilov fluctuations + // Vavilov fluctuations above energy threshold if(dp->GetKineticEnergy() > parameter*charge*particleMass) { - return uniFluct.SampleFluctuations(couple,dp,tmax,length,meanLoss); + return uniFluct->SampleFluctuations(couple,dp,tcut,tmax,length,meanLoss); } const G4Material* material = couple->GetMaterial(); - G4double siga = Dispersion(material,dp,tmax,length); + G4double siga = Dispersion(material,dp,tcut,tmax,length); G4double loss = meanLoss; //G4cout << "### siga= " << sqrt(siga) << " navr= " << navr << G4endl; @@ -143,7 +137,7 @@ G4IonFluctuations::SampleFluctuations(const G4MaterialCutsCouple* couple, G4double x3 = 1.0/(x*x*x); siga *= 0.25*(1.0 + x)*(x3 + (1.0/b2 - 0.5)/(1.0/beta2 - 0.5) ); } - siga = sqrt(siga); + siga = std::sqrt(siga); G4double sn = meanLoss/siga; G4double twomeanLoss = meanLoss + meanLoss; // G4cout << "siga= " << siga << " sn= " << sn << G4endl; @@ -176,29 +170,24 @@ G4IonFluctuations::SampleFluctuations(const G4MaterialCutsCouple* couple, G4double G4IonFluctuations::Dispersion(const G4Material* material, const G4DynamicParticle* dp, - G4double tmax, - G4double length) + const G4double tcut, + const G4double tmax, + const G4double length) { + if(dp->GetDefinition() != particle) { InitialiseMe(dp->GetDefinition()); } + + const G4double beta = dp->GetBeta(); kineticEnergy = dp->GetKineticEnergy(); - G4double etot = kineticEnergy + particleMass; - beta2 = kineticEnergy*(kineticEnergy + 2.*particleMass)/(etot*etot); + beta2 = beta*beta; - G4double electronDensity = material->GetElectronDensity(); - - /* - G4cout << "e= " << kineticEnergy << " m= " << particleMass - << " tmax= " << tmax << " l= " << length - << " q^2= " << effChargeSquare << " beta2=" << beta2<< G4endl; - */ - G4double siga = (1. - beta2*0.5)*tmax*length*electronDensity* - twopi_mc2_rcl2*chargeSquare/beta2; + G4double siga = (tmax/beta2 - 0.5*tcut)*CLHEP::twopi_mc2_rcl2*length* + material->GetElectronDensity()*effChargeSquare; // Low velocity - additional ion charge fluctuations according to // Q.Yang et al., NIM B61(1991)149-155. //G4cout << "sigE= " << sqrt(siga) << " charge= " << charge <GetIonisation()->GetZeffective(); - G4double fac = Factor(material, Z); // heavy ion correction @@ -208,16 +197,16 @@ G4double G4IonFluctuations::Dispersion(const G4Material* material, // if(f1 > 2.5) f1 = 2.5; // fac *= (1.0 + f1); - // taking into account the cut - G4double fac_cut = 1.0 + (fac - 1.0)*2.0*electron_mass_c2*beta2 + // taking into account the cutg + G4double fac_cut = 1.0 + (fac - 1.0)*2.0*CLHEP::electron_mass_c2*beta2 /(tmax*(1.0 - beta2)); if(fac_cut > 0.01 && fac > 0.01) { siga *= fac_cut; } - - //G4cout << "siga(keV)= " << sqrt(siga)/keV << " fac= " << fac - // << " f1= " << f1 << G4endl; - + /* + G4cout << "siga(keV)= " << sqrt(siga)/keV << " fac= " << fac + << " f1= " << fac_cut << G4endl; + */ return siga; } @@ -229,7 +218,7 @@ G4double G4IonFluctuations::Factor(const G4Material* material, G4double Z) // Q.Yang et al., NIM B61(1991)149-155. // Reduced energy in MeV/AMU - G4double energy = kineticEnergy *amu_c2/(particleMass*MeV) ; + G4double energy = kineticEnergy*CLHEP::amu_c2/(particleMass*CLHEP::MeV); // simple approximation for higher beta2 G4double s1 = RelativisticFactor(material, Z); @@ -349,9 +338,7 @@ G4double G4IonFluctuations::Factor(const G4Material* material, G4double Z) if( 0 > iz ) { iz = 0; } else if(95 < iz ) { iz = 95; } - // G4double ss = 1.0 + a[iz][0]*pow(energy,a[iz][1])+ - // + a[iz][2]*pow(energy,a[iz][3]); - G4double ss = 1.0 + a[iz][0]*g4calc->powA(energy,a[iz][1])+ + const G4double ss = 1.0 + a[iz][0]*g4calc->powA(energy,a[iz][1])+ + a[iz][2]*g4calc->powA(energy,a[iz][3]); // protection for the validity range for low beta @@ -386,7 +373,7 @@ G4double G4IonFluctuations::Factor(const G4Material* material, G4double Z) factor = charge * g4calc->A13(charge/Z); if( kStateGas == material->GetState() ) { - energy /= (charge * sqrt(charge)) ; + energy /= (charge * std::sqrt(charge)) ; if(1 == (material->GetNumberOfElements())) { i = 2 ; @@ -395,7 +382,7 @@ G4double G4IonFluctuations::Factor(const G4Material* material, G4double Z) } } else { - energy /= (charge * sqrt(charge*Z)) ; + energy /= (charge * std::sqrt(charge*Z)) ; i = 4 ; } } @@ -404,11 +391,10 @@ G4double G4IonFluctuations::Factor(const G4Material* material, G4double Z) G4double y = energy * b[i][3]; if(y <= 0.2) x *= (y*(1.0 - 0.5*y)); else x *= (1.0 - g4calc->expA(-y)); - // else x *= (1.0 - exp(-y)); y = energy - b[i][1]; - G4double s2 = factor * x * b[i][0] / (y*y + x*x); + const G4double s2 = factor * x * b[i][0] / (y*y + x*x); /* G4cout << "s1= " << s1 << " s2= " << s2 << " q^2= " << effChargeSquare << " e= " << energy << G4endl; @@ -425,9 +411,9 @@ G4double G4IonFluctuations::RelativisticFactor(const G4Material* mat, G4double I = mat->GetIonisation()->GetMeanExcitationEnergy(); // H.Geissel et al. NIM B, 195 (2002) 3. - G4double bF2= 2.0*eF/electron_mass_c2; + G4double bF2= 2.0*eF/CLHEP::electron_mass_c2; G4double f = 0.4*(1.0 - beta2)/((1.0 - 0.5*beta2)*Z); - if(beta2 > bF2) f *= G4Log(2.0*electron_mass_c2*beta2/I)*bF2/beta2; + if(beta2 > bF2) f *= G4Log(2.0*CLHEP::electron_mass_c2*beta2/I)*bF2/beta2; else f *= G4Log(4.0*eF/I); // G4cout << "f= " << f << " beta2= " << beta2 @@ -447,8 +433,8 @@ void G4IonFluctuations::SetParticleAndCharge(const G4ParticleDefinition* part, charge = part->GetPDGCharge()/eplus; chargeSquare = charge*charge; } - effChargeSquare = q2; - uniFluct.SetParticleAndCharge(part, q2); + effChargeSquare = q2; + uniFluct->SetParticleAndCharge(part, q2); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/standard/src/G4IonICRU73Data.cc b/source/processes/electromagnetic/standard/src/G4IonICRU73Data.cc new file mode 100644 index 0000000000..adc3bd29c2 --- /dev/null +++ b/source/processes/electromagnetic/standard/src/G4IonICRU73Data.cc @@ -0,0 +1,327 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +//--------------------------------------------------------------------------- +// +// GEANT4 Class file +// +// Description: Data on stopping power +// +// Author: Vladimir Ivanchenko +// +// Creation date: 23.10.2021 +// +//---------------------------------------------------------------------------- +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include +#include + +#include "G4IonICRU73Data.hh" +#include "G4SystemOfUnits.hh" +#include "G4PhysicsLogVector.hh" +#include "G4PhysicsFreeVector.hh" +#include "G4EmParameters.hh" +#include "G4ProductionCutsTable.hh" +#include "G4MaterialCutsCouple.hh" +#include "G4Material.hh" +#include "G4Element.hh" + +const G4String namesICRU73[31] = { +"G4_A-150_TISSUE" +"G4_ADIPOSE_TISSUE_ICRP" +"G4_AIR" +"G4_ALUMINUM_OXIDE" +"G4_BONE_COMPACT_ICRU" +"G4_BONE_CORTICAL_ICRP" +"G4_C-552" +"G4_CALCIUM_FLUORIDE" +"G4_CARBON_DIOXIDE" +"G4_KAPTON" +"G4_LITHIUM_FLUORIDE" +"G4_LITHIUM_TETRABORATE" +"G4_LUCITE" +"G4_METHANE" +"G4_MUSCLE_STRIATED_ICRU" +"G4_MYLAR" +"G4_NYLON-6-6" +"G4_PHOTO_EMULSION" +"G4_PLASTIC_SC_VINYLTOLUENE" +"G4_POLYCARBONATE" +"G4_POLYETHYLENE" +"G4_POLYSTYRENE" +"G4_PROPANE" +"G4_Pyrex_Glass" +"G4_SILICON_DIOXIDE" +"G4_SODIUM_IODIDE" +"G4_TEFLON" +"G4_TISSUE-METHANE" +"G4_TISSUE-PROPANE" +"G4_WATER" +"G4_WATER_VAPOR"}; +const G4String namesICRU90[3] = {"G4_AIR","G4_GRAPHITE","G4_WATER"}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4IonICRU73Data::G4IonICRU73Data() +{ + fEmin = 0.025*CLHEP::MeV; + fEmax = 2.5*CLHEP::MeV; + fNbins = fNbinsPerDecade*G4lrint(std::log10(fEmax/fEmin) + 0.000001); + fVector = new G4PhysicsFreeVector(fSpline); + for(G4int i=0; i<81; ++i) { + fMatData[i] = new std::vector; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4IonICRU73Data::~G4IonICRU73Data() +{ + delete fVector; + for(G4int i=0; i<81; ++i) { + auto v = fMatData[i]; + for(G4int j=0; jGetNumberOfElements()) { + G4int Z1 = (*(mat->GetElementVector()))[0]->GetZasInt(); + if(Z <= 80 && Z1 <= 80) { + v = fElmData[Z][Z1]; + } + } else { + G4int idx = fMatIndex[mat->GetIndex()]; + if(idx < fNmat && Z <= 80) { + v = (*(fMatData[Z]))[idx]; + } + } + G4double res = (nullptr != v) ? v->LogVectorValue(e, loge) : 0.0; + return res; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4IonICRU73Data::Initialise() +{ + // fill directory path + if(fDataDirectory.empty()) { + char* path = std::getenv("G4LEDATA"); + if (nullptr != path) { + std::ostringstream ost; + ost << path << "/ion_stopping_data/"; + fDataDirectory = ost.str(); + } else { + G4Exception("G4IonICRU73Data::Initialise(..)","em013", + FatalException, + "Environment variable G4LEDATA is not defined"); + } + } + + G4bool useICRU90 = G4EmParameters::Instance()->UseICRU90Data(); + size_t nmat = G4Material::GetNumberOfMaterials(); + fMatIndex.resize(nmat, -1); + + const G4ProductionCutsTable* theCoupleTable= + G4ProductionCutsTable::GetProductionCutsTable(); + size_t numOfCouples = theCoupleTable->GetTableSize(); + + for(size_t i=0; iGetMaterialCutsCouple(i); + const G4Material* mat = couple->GetMaterial(); + G4int idx = mat->GetIndex(); + if(fMatIndex[idx] == -1) { + G4String matname = mat->GetName(); + G4bool isOK = false; + if(1 == mat->GetNumberOfElements()) { + ReadElementData(mat, useICRU90); + isOK = true; + } + if(!isOK && useICRU90) { + for(G4int j=0; j<3; ++j) { + if(matname == namesICRU90[j]) { + ReadMaterialData(matname, true); + isOK = true; + fMatIndex[idx] = fNmat; + ++fNmat; + break; + } + } + } + if(!isOK) { + for(G4int j=0; j<31; ++j) { + if(matname == namesICRU73[j]) { + ReadMaterialData(matname, false); + isOK = true; + fMatIndex[idx] = fNmat; + ++fNmat; + break; + } + } + } + if(!isOK) { + ReadElementData(mat, useICRU90); + fMatIndex[idx] = fNmat; + ++fNmat; + } + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4IonICRU73Data::ReadMaterialData(const G4String& name, G4bool isICRU90) +{ + for(G4int Z=3; Z<81; ++Z) { + std::ostringstream ost; + ost << fDataDirectory << "icru"; + if(isICRU90 && Z <= 18) { ost << "90"; } + else { ost << "73"; } + ost << "/z" << Z << "_" << name << ".dat"; + G4PhysicsLogVector* v = RetrieveVector(ost, false); + (fMatData[Z])->push_back(v); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4IonICRU73Data::ReadElementData(const G4Material* mat, G4bool useICRU90) +{ + const G4ElementVector* elmv = mat->GetElementVector(); + const G4double* dens = mat->GetFractionVector(); + const G4int nelm = mat->GetNumberOfElements(); + for(G4int Z=3; Z<81; ++Z) { + if(1 == nelm) { + FindOrBuildElementData(Z, (*elmv)[0]->GetZasInt(), useICRU90); + } else { + G4PhysicsLogVector* v2 = nullptr; + for(G4int j=0; jGetZasInt(), useICRU90); + if(nullptr == v2) { break; } + } + // for one or more elements there is no data + if(nullptr == v2) { + fMatData[Z]->push_back(v2); + continue; + } + G4PhysicsLogVector* v = + new G4PhysicsLogVector(fEmin, fEmax, fNbins, fSpline); + for(G4int i=0; i<=fNbins; ++i) { + G4double dedx = 0; + for(G4int j=0; jGetZasInt(), useICRU90); + dedx += (*v1)[i]*dens[j]; + } + v->PutValue(i, dedx); + } + if(fSpline) { v->FillSecondDerivatives(); } + fMatData[Z]->push_back(v); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4PhysicsLogVector* +G4IonICRU73Data::FindOrBuildElementData(const G4int Z, const G4int Z1, + G4bool useICRU90) +{ + G4PhysicsLogVector* v = nullptr; + if(Z <= 80 && Z1 <= 80) { + v = fElmData[Z][Z1]; + if(nullptr == v) { + G4bool isICRU90 = (useICRU90 && Z <= 18 && + (Z1 == 1 || Z1 == 6 || Z1 == 7 || Z1 == 8)); + std::ostringstream ost; + ost << fDataDirectory << "icru"; + if(isICRU90) { ost << "90"; } + else { ost << "73"; } + ost << "/z" << Z << "_" << Z1 << ".dat"; + v = RetrieveVector(ost, false); + fElmData[Z][Z1] = v; + } + } + return v; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4PhysicsLogVector* +G4IonICRU73Data::RetrieveVector(std::ostringstream& ost, G4bool warn) +{ + G4PhysicsLogVector* v = nullptr; + std::ifstream filein(ost.str().c_str()); + if (!filein.is_open()) { + if(warn) { + G4ExceptionDescription ed; + ed << "Data file <" << ost.str().c_str() + << "> is not opened"; + G4Exception("G4IonICRU73Data::RetrieveVector(..)","em013", + FatalException, ed, "Check G4LEDATA"); + } + } else { + if(fVerbose > 0) { + G4cout << "File " << ost.str() + << " is opened by G4IonICRU73Data" << G4endl; + } + // retrieve data from DB + if(!fVector->Retrieve(filein, true)) { + G4ExceptionDescription ed; + ed << "Data file <" << ost.str().c_str() + << "> is not retrieved!"; + G4Exception("G4IonICRU73Data::RetrieveVector(..)","had015", + FatalException, ed, "Check G4LEDATA"); + } else { + if(fSpline) { fVector->FillSecondDerivatives(); } + v = new G4PhysicsLogVector(fEmin, fEmax, fNbins, fSpline); + for(G4int i=0; i<=fNbins; ++i) { + G4double e = v->Energy(i); + G4double dedx = fVector->Value(e); + v->PutValue(i, dedx); + } + const G4double fact = CLHEP::MeV * CLHEP::cm2 /( 0.001 * CLHEP::g); + v->ScaleVector(CLHEP::MeV, fact); + if(fSpline) { v->FillSecondDerivatives(); } + if(fVerbose > 1) { G4cout << *v << G4endl; } + } + } + return v; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/standard/src/G4LindhardSorensenIonModel.cc b/source/processes/electromagnetic/standard/src/G4LindhardSorensenIonModel.cc index 9ed68c0423..2440a80ba3 100644 --- a/source/processes/electromagnetic/standard/src/G4LindhardSorensenIonModel.cc +++ b/source/processes/electromagnetic/standard/src/G4LindhardSorensenIonModel.cc @@ -23,7 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// // ------------------------------------------------------------------- // // GEANT4 Class header file @@ -39,7 +38,6 @@ // ------------------------------------------------------------------- // - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -55,28 +53,30 @@ #include "G4DeltaAngle.hh" #include "G4LindhardSorensenData.hh" #include "G4BraggIonModel.hh" +#include "G4BetheBlochModel.hh" +#include "G4IonICRU73Data.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... using namespace std; G4LindhardSorensenData* G4LindhardSorensenIonModel::lsdata = nullptr; +G4IonICRU73Data* G4LindhardSorensenIonModel::fIonData = nullptr; std::vector* G4LindhardSorensenIonModel::fact[] = {nullptr}; G4LindhardSorensenIonModel::G4LindhardSorensenIonModel(const G4ParticleDefinition*, const G4String& nam) : G4VEmModel(nam), particle(nullptr), - tlimit(DBL_MAX), twoln10(2.0*G4Log(10.0)) { fParticleChange = nullptr; theElectron = G4Electron::Electron(); - SetParticle(theElectron); corr = G4LossTableManager::Instance()->EmCorrections(); nist = G4NistManager::Instance(); - fBraggIonModel = new G4BraggIonModel(); - SetLowEnergyLimit(2.0*MeV); + fBraggModel = new G4BraggIonModel(); + fBBModel = new G4BetheBlochModel(); + fElimit = 2.0*CLHEP::MeV; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -89,7 +89,8 @@ G4LindhardSorensenIonModel::~G4LindhardSorensenIonModel() void G4LindhardSorensenIonModel::Initialise(const G4ParticleDefinition* p, const G4DataVector& ptr) { - fBraggIonModel->Initialise(p, ptr); + fBraggModel->Initialise(p, ptr); + fBBModel->Initialise(p, ptr); SetParticle(p); //G4cout << "G4LindhardSorensenIonModel::Initialise for " // << p->GetParticleName() << G4endl; @@ -103,29 +104,35 @@ void G4LindhardSorensenIonModel::Initialise(const G4ParticleDefinition* p, SetAngularDistribution(new G4DeltaAngle()); } } - if(IsMaster() && nullptr == lsdata) { - lsdata = new G4LindhardSorensenData(); + if(IsMaster()) { + if(nullptr == lsdata) { + lsdata = new G4LindhardSorensenData(); + } + if(nullptr == fIonData) { + fIonData = new G4IonICRU73Data(); + } + fIonData->Initialise(); } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double -G4LindhardSorensenIonModel::GetChargeSquareRatio(const G4ParticleDefinition*, - const G4Material*, - G4double) +G4LindhardSorensenIonModel::GetChargeSquareRatio(const G4ParticleDefinition* p, + const G4Material* mat, + G4double kinEnergy) { - return chargeSquare; + return corr->EffectiveChargeSquareRatio(p,mat,kinEnergy); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double -G4LindhardSorensenIonModel::GetParticleCharge(const G4ParticleDefinition*, - const G4Material*, - G4double) +G4LindhardSorensenIonModel::GetParticleCharge(const G4ParticleDefinition* p, + const G4Material* mat, + G4double kinEnergy) { - return charge; + return corr->GetParticleCharge(p,mat,kinEnergy); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -137,8 +144,10 @@ void G4LindhardSorensenIonModel::SetupParameters() charge = particle->GetPDGCharge()*inveplus; Zin = G4lrint(std::abs(charge)); chargeSquare = charge*charge; - ratio = electron_mass_c2/mass; - static const G4double aMag = 1./(0.5*eplus*hbar_Planck*c_squared); + eRatio = CLHEP::electron_mass_c2/mass; + pRatio = CLHEP::proton_mass_c2/mass; + const G4double aMag = + 1./(0.5*CLHEP::eplus*CLHEP::hbar_Planck*CLHEP::c_squared); G4double magmom = particle->GetPDGMagneticMoment()*mass*aMag; magMoment2 = magmom*magmom - 1.0; G4double x = 0.8426*CLHEP::GeV; @@ -162,32 +171,19 @@ G4double G4LindhardSorensenIonModel::MinEnergyCut(const G4ParticleDefinition*, G4double G4LindhardSorensenIonModel::ComputeCrossSectionPerElectron( const G4ParticleDefinition* p, - G4double kineticEnergy, + G4double kinEnergy, G4double cutEnergy, G4double maxKinEnergy) { - G4double cross = 0.0; // take into account formfactor - G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); - G4double maxEnergy = std::min(tmax,maxKinEnergy); - if(cutEnergy < maxEnergy) { - - G4double totEnergy = kineticEnergy + mass; - G4double energy2 = totEnergy*totEnergy; - G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2; - - cross = (maxEnergy - cutEnergy)/(cutEnergy*maxEnergy) - - beta2*G4Log(maxEnergy/cutEnergy)/tmax; - - // +term for spin=1/2 particle - if( 0.0 < spin ) { cross += 0.5*(maxEnergy - cutEnergy)/energy2; } - - cross *= twopi_mc2_rcl2*chargeSquare/beta2; - } - - // G4cout << "BB: e= " << kineticEnergy << " tmin= " << cutEnergy - // << " tmax= " << tmax << " cross= " << cross << G4endl; - + G4double tmax = MaxSecondaryEnergy(p, kinEnergy); + G4double emax = std::min(tmax, maxKinEnergy); + G4double escaled = kinEnergy*pRatio; + G4double cross = (escaled <= fElimit) + ? fBraggModel->ComputeCrossSectionPerElectron(p,kinEnergy,cutEnergy,emax) + : fBBModel->ComputeCrossSectionPerElectron(p,kinEnergy,cutEnergy,emax); + // G4cout << "LS: e= " << kinEnergy << " tmin= " << cutEnergy + // << " tmax= " << maxEnergy << " cross= " << cross << G4endl; return cross; } @@ -219,77 +215,70 @@ G4double G4LindhardSorensenIonModel::CrossSectionPerVolume( //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double -G4LindhardSorensenIonModel::ComputeDEDXPerVolume(const G4Material* material, +G4LindhardSorensenIonModel::ComputeDEDXPerVolume(const G4Material* mat, const G4ParticleDefinition* p, - G4double kineticEnergy, + G4double kinEnergy, G4double cut) { // formfactor is taken into account in CorrectionsAlongStep(..) - G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); + G4double tmax = MaxSecondaryEnergy(p, kinEnergy); G4double cutEnergy = std::min(std::min(cut,tmax), tlimit); - G4double tau = kineticEnergy/mass; - G4double gam = tau + 1.0; - G4double bg2 = tau * (tau+2.0); - G4double beta2 = bg2/(gam*gam); - - G4double eexc = material->GetIonisation()->GetMeanExcitationEnergy(); - G4double eexc2 = eexc*eexc; - - G4double eDensity = material->GetElectronDensity(); - - G4double dedx = G4Log(2.0*electron_mass_c2*bg2*cutEnergy/eexc2) - - (1.0 + cutEnergy/tmax)*beta2; - - if(0.0 < spin) { - G4double del = 0.5*cutEnergy/(kineticEnergy + mass); - dedx += del*del; - } - - // density correction - G4double x = G4Log(bg2)/twoln10; - dedx -= material->GetIonisation()->DensityCorrection(x); - - // shell correction - dedx -= 2.0*corr->ShellCorrection(p,material,kineticEnergy); - - //High order correction different for hadrons and ions - dedx += 2.0*corr->BarkasCorrection(p,material,kineticEnergy); - dedx = std::max(dedx, 0.0); - - // now compute the total ionization loss - dedx *= twopi_mc2_rcl2*chargeSquare*eDensity/beta2; - - //G4cout << "E(MeV)= " << kineticEnergy/MeV << " dedx= " << dedx - // << " " << material->GetName() << G4endl; + G4double escaled = kinEnergy*pRatio; + G4double dedx = (escaled <= fElimit) + ? fBraggModel->ComputeDEDXPerVolume(mat, p, kinEnergy, cutEnergy) + : fBBModel->ComputeDEDXPerVolume(mat, p, kinEnergy, cutEnergy); + //G4cout << "E(MeV)=" << kinEnergy/MeV << " dedx=" << dedx + // << " " << material->GetName() << " Ecut(MeV)=" << cutEnergy << G4endl; return dedx; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void -G4LindhardSorensenIonModel::CorrectionsAlongStep(const G4MaterialCutsCouple* couple, - const G4DynamicParticle* dp, - const G4double& length, - G4double& eloss) +void G4LindhardSorensenIonModel::CorrectionsAlongStep( + const G4MaterialCutsCouple* couple, + const G4DynamicParticle* dp, + const G4double& length, + G4double& eloss) { + // no correction at the last step + const G4double preKinEnergy = dp->GetKineticEnergy(); + if(eloss >= preKinEnergy) { return; } + const G4ParticleDefinition* p = dp->GetDefinition(); - SetParticle(p); - G4double eDensity = couple->GetMaterial()->GetElectronDensity(); - G4double preKinEnergy = dp->GetKineticEnergy(); - G4double e = preKinEnergy - eloss*0.5; - GetModelOfFluctuations()->SetParticleAndCharge(p, chargeSquare); + const G4Material* mat = couple->GetMaterial(); + const G4double eDensity = mat->GetElectronDensity(); + const G4double e = std::max(preKinEnergy - eloss*0.5, preKinEnergy*0.75); + const G4double tmax = MaxSecondaryEnergy(p, e); + const G4double escaled = e*pRatio; + const G4double tau = e/mass; - G4double tau = e/mass; - G4double gam = tau + 1.0; - G4double beta2 = tau * (tau+2.0)/(gam*gam); - G4double deltaL0 = - 2.0*corr->BarkasCorrection (p, couple->GetMaterial(), e)*(charge-1.)/charge; - G4double deltaL = lsdata->GetDeltaL(Zin, gam); + G4double q2 = corr->EffectiveChargeSquareRatio(p, mat, e); + GetModelOfFluctuations()->SetParticleAndCharge(p, q2); + const G4int Z = std::max(80, p->GetAtomicNumber()); - G4double elossnew = - eloss + twopi_mc2_rcl2*chargeSquare*eDensity*(deltaL+deltaL0)*length/beta2; + G4double res; + if(escaled <= fElimit) { + res = fIonData->GetDEDX(mat, Z, escaled, G4Log(escaled)); + if(res > 0.0) { + G4double cut = couple->GetProductionCuts()->GetProductionCut(1); + if(cut < tmax) { + const G4double x = cut/tmax; + res += (G4Log(x)*(tau + 1.)*(tau + 1.)/(tau * (tau + 2.0)) + 1.0 - x) + *q2*CLHEP::twopi_mc2_rcl2*eDensity; + } + } else { + res = eloss*q2*corr->EffectiveChargeCorrection(p,mat,e)/chargeSquare; + } + } else { + const G4double gam = tau + 1.0; + const G4double beta2 = tau * (tau+2.0)/(gam*gam); + G4double deltaL0 = 2.0*corr->BarkasCorrection(p, mat, e)*(charge-1.)/charge; + G4double deltaL = lsdata->GetDeltaL(Zin, gam); + + res = eloss + + CLHEP::twopi_mc2_rcl2*q2*eDensity*(deltaL+deltaL0)*length/beta2; /* G4cout << "G4LindhardSorensenIonModel::CorrectionsAlongStep: E(GeV)= " << preKinEnergy/GeV << " eloss(MeV)= " << eloss @@ -297,10 +286,13 @@ G4LindhardSorensenIonModel::CorrectionsAlongStep(const G4MaterialCutsCouple* cou << " dL0= " << deltaL0 << " dL= " << deltaL << G4endl; */ - if(elossnew > preKinEnergy) { elossnew = preKinEnergy; } - else if(elossnew < 0.0) { elossnew = eloss*0.5; } - - eloss = elossnew; + } + if(res > preKinEnergy) { res = preKinEnergy; } + else if(res < 0.0) { res = eloss; } + //G4cout << "G4LindhardSorensenIonModel::CorrectionsAlongStep: E(GeV)=" + // << preKinEnergy/GeV << " eloss(MeV)=" << eloss + //<< " res(MeV)=" << res << G4endl; + eloss = res; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -384,15 +376,15 @@ void G4LindhardSorensenIonModel::SampleSecondaries( } else { G4double deltaMomentum = - sqrt(deltaKinEnergy * (deltaKinEnergy + 2.0*electron_mass_c2)); + std::sqrt(deltaKinEnergy * (deltaKinEnergy + 2.0*electron_mass_c2)); G4double cost = deltaKinEnergy * (totEnergy + electron_mass_c2) / (deltaMomentum * dp->GetTotalMomentum()); cost = std::min(cost, 1.0); - G4double sint = sqrt((1.0 - cost)*(1.0 + cost)); + G4double sint = std::sqrt((1.0 - cost)*(1.0 + cost)); - G4double phi = twopi*rndmEngineMod->flat(); + G4double phi = CLHEP::twopi*rndmEngineMod->flat(); - deltaDirection.set(sint*cos(phi),sint*sin(phi), cost) ; + deltaDirection.set(sint*std::cos(phi),sint*std::sin(phi), cost) ; deltaDirection.rotateUz(dp->GetMomentumDirection()); } /* @@ -431,7 +423,7 @@ G4LindhardSorensenIonModel::MaxSecondaryEnergy(const G4ParticleDefinition* pd, SetParticle(pd); G4double tau = kinEnergy/mass; return 2.0*CLHEP::electron_mass_c2*tau*(tau + 2.) / - (1. + 2.0*(tau + 1.)*ratio + ratio*ratio); + (1. + 2.0*(tau + 1.)*eRatio + eRatio*eRatio); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/standard/src/G4PAIModel.cc b/source/processes/electromagnetic/standard/src/G4PAIModel.cc index eda995554d..e75d2a9c74 100644 --- a/source/processes/electromagnetic/standard/src/G4PAIModel.cc +++ b/source/processes/electromagnetic/standard/src/G4PAIModel.cc @@ -322,10 +322,12 @@ void G4PAIModel::SampleSecondaries(std::vector* vdp, /////////////////////////////////////////////////////////////////////// -G4double G4PAIModel::SampleFluctuations( const G4MaterialCutsCouple* matCC, - const G4DynamicParticle* aParticle, - G4double tmax, G4double step, - G4double eloss) +G4double G4PAIModel::SampleFluctuations(const G4MaterialCutsCouple* matCC, + const G4DynamicParticle* aParticle, + const G4double tcut, + const G4double, + const G4double step, + const G4double eloss) { G4int coupleIndex = FindCoupleIndex(matCC); if(0 > coupleIndex) { return eloss; } @@ -342,7 +344,7 @@ G4double G4PAIModel::SampleFluctuations( const G4MaterialCutsCouple* matCC, G4double scaledTkin = Tkin*fRatio; G4double loss = fModelData->SampleAlongStepTransfer(coupleIndex, Tkin, - scaledTkin, tmax, + scaledTkin, tcut, step*fChargeSquare); // G4cout<<"PAIModel AlongStepLoss = "<GetIonisation()->GetF1fluct(); - f2Fluct = material->GetIonisation()->GetF2fluct(); - e1Fluct = material->GetIonisation()->GetEnergy1fluct(); - e2Fluct = material->GetIonisation()->GetEnergy2fluct(); - e1LogFluct = material->GetIonisation()->GetLogEnergy1fluct(); - e2LogFluct = material->GetIonisation()->GetLogEnergy2fluct(); ipotFluct = material->GetIonisation()->GetMeanExcitationEnergy(); ipotLogFluct = material->GetIonisation()->GetLogMeanExcEnergy(); e0 = material->GetIonisation()->GetEnergy0fluct(); - esmall = 0.5*sqrt(e0*ipotFluct); lastMaterial = material; } // very small step or low-density material - if(tmax <= e0) { return meanLoss; } + if(tcut <= e0) { return meanLoss; } // width correction for small cuts - const G4double scaling = std::min(1.+0.5*CLHEP::keV/tmax,1.50); + const G4double scaling = std::min(1.+0.5*CLHEP::keV/tcut,1.50); meanLoss /= scaling; - G4double a1(0.0), a2(0.0), a3(0.0); + G4double a1(0.0), a3(0.0); loss = 0.0; - e1 = e1Fluct; - e2 = e2Fluct; - - if(tmax > ipotFluct) { - G4double w2 = G4Log(2.*electron_mass_c2*beta2*gam2)-beta2; + e1 = ipotFluct; + if(tcut > ipotFluct) { + const G4double w2 = G4Log(2.*CLHEP::electron_mass_c2*beta2*gam2)-beta2; if(w2 > ipotLogFluct) { - if(w2 > e2LogFluct) { - const G4double C = meanLoss*(1.-rate)/(w2-ipotLogFluct); - a1 = C*f1Fluct*(w2-e1LogFluct)/e1Fluct; - a2 = C*f2Fluct*(w2-e2LogFluct)/e2Fluct; - } else { - a1 = meanLoss*(1.-rate)/e1; - } - if(a1 < a0) { - const G4double fwnow = 0.5+(fw-0.5)*sqrt(a1/a0); - a1 /= fwnow; - e1 *= fwnow; - } else { - a1 /= fw; - e1 = fw*e1Fluct; - } + const G4double C = meanLoss*(1.-rate)/(w2-ipotLogFluct); + a1 = C*(w2-ipotLogFluct)/ipotFluct; + } else { + a1 = meanLoss*(1.-rate)/e1; + } + if(a1 < a0) { + const G4double fwnow = fw*a1/a0; + a1 /= fwnow; + e1 *= fwnow; + } else { + a1 /= fw; + e1 *= fw; } } - G4double w1 = tmax/e0; - if(tmax > e0) { - a3 = rate*meanLoss*(tmax-e0)/(e0*tmax*G4Log(w1)); - if(a1+a2 <= 0.) { + const G4double w1 = tcut/e0; + if(tcut > e0) { + a3 = rate*meanLoss*(tcut-e0)/(e0*tcut*G4Log(w1)); + if(a1 <= 0.) { a3 /= rate; } } @@ -237,9 +205,6 @@ G4UniversalFluctuation::SampleFluctuations(const G4MaterialCutsCouple* couple, // excitation of type 1 if(a1 > 0.0) { AddExcitation(rndmEngineF, a1, e1, emean, loss, sig2e); } - // excitation of type 2 - if(a2 > 0.0) { AddExcitation(rndmEngineF, a2, e2, emean, loss, sig2e); } - if(sig2e > 0.0) { SampleGauss(rndmEngineF, emean, sig2e, loss); } // ionisation @@ -248,20 +213,19 @@ G4UniversalFluctuation::SampleFluctuations(const G4MaterialCutsCouple* couple, sig2e = 0.; G4double p3 = a3; G4double alfa = 1.; - if(a3 > nmaxCont) - { - alfa = w1*(nmaxCont+a3)/(w1*nmaxCont+a3); - const G4double alfa1 = alfa*G4Log(alfa)/(alfa-1.); - const G4double namean = a3*w1*(alfa-1.)/((w1-1.)*alfa); - emean += namean*e0*alfa1; - sig2e += e0*e0*namean*(alfa-alfa1*alfa1); - p3 = a3-namean; - } + if(a3 > nmaxCont) { + alfa = w1*(nmaxCont+a3)/(w1*nmaxCont+a3); + const G4double alfa1 = alfa*G4Log(alfa)/(alfa-1.); + const G4double namean = a3*w1*(alfa-1.)/((w1-1.)*alfa); + emean += namean*e0*alfa1; + sig2e += e0*e0*namean*(alfa-alfa1*alfa1); + p3 = a3-namean; + } - G4double w2 = alfa*e0; - if(tmax > w2) { - G4double w = (tmax-w2)/tmax; - G4int nnb = G4Poisson(p3); + const G4double w2 = alfa*e0; + if(tcut > w2) { + const G4double w = (tcut-w2)/tcut; + const G4int nnb = G4Poisson(p3); if(nnb > 0) { if(nnb > sizearray) { sizearray = nnb; @@ -274,11 +238,8 @@ G4UniversalFluctuation::SampleFluctuations(const G4MaterialCutsCouple* couple, } if(sig2e > 0.0) { SampleGauss(rndmEngineF, emean, sig2e, loss); } } - - loss *= scaling; - - return loss; - + //G4cout << "### loss=" << loss << " scaling=" << scaling << G4endl; + return loss*scaling; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -287,20 +248,14 @@ G4UniversalFluctuation::SampleFluctuations(const G4MaterialCutsCouple* couple, G4double G4UniversalFluctuation::Dispersion( const G4Material* material, const G4DynamicParticle* dp, - G4double tmax, - G4double length) + const G4double tcut, + const G4double tmax, + const G4double length) { if(dp->GetDefinition() != particle) { InitialiseMe(dp->GetDefinition()); } - - electronDensity = material->GetElectronDensity(); - const G4double beta = dp->GetBeta(); - const G4double beta2 = beta*beta; - - G4double siga = (1.0/beta2 - 0.5) * twopi_mc2_rcl2 * tmax * length - * electronDensity * chargeSquare; - - return siga; + return (tmax/(beta*beta) - 0.5*tcut) * CLHEP::twopi_mc2_rcl2 * length + * material->GetElectronDensity() * chargeSquare; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -310,12 +265,12 @@ G4UniversalFluctuation::SetParticleAndCharge(const G4ParticleDefinition* part, G4double q2) { if(part != particle) { - particle = part; - particleMass = part->GetPDGMass(); + particle = part; + particleMass = part->GetPDGMass(); // Derived quantities m_Inv_particleMass = 1.0 / particleMass; - m_massrate = electron_mass_c2 * m_Inv_particleMass; + m_massrate = CLHEP::electron_mass_c2 * m_Inv_particleMass; } chargeSquare = q2; } diff --git a/source/processes/electromagnetic/standard/src/G4UrbanMscModel.cc b/source/processes/electromagnetic/standard/src/G4UrbanMscModel.cc index 981b9cc739..ef6d6d3c37 100644 --- a/source/processes/electromagnetic/standard/src/G4UrbanMscModel.cc +++ b/source/processes/electromagnetic/standard/src/G4UrbanMscModel.cc @@ -73,8 +73,6 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -using namespace std; - std::vector G4UrbanMscModel::msc; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -82,25 +80,25 @@ std::vector G4UrbanMscModel::msc; G4UrbanMscModel::G4UrbanMscModel(const G4String& nam) : G4VMscModel(nam) { - masslimite = 0.6*MeV; + masslimite = 0.6*CLHEP::MeV; fr = 0.02; taubig = 8.0; tausmall = 1.e-16; taulim = 1.e-6; currentTau = taulim; - tlimitminfix = 0.01*nm; - tlimitminfix2 = 1.*nm; + tlimitminfix = 0.01*CLHEP::nm; + tlimitminfix2 = 1.*CLHEP::nm; stepmin = tlimitminfix; smallstep = 1.e10; currentRange = 0. ; rangeinit = 0.; - tlimit = 1.e10*mm; + tlimit = 1.e10*CLHEP::mm; tlimitmin = 10.*tlimitminfix; - tgeom = 1.e50*mm; - geombig = 1.e50*mm; - geommin = 1.e-3*mm; + tgeom = 1.e50*CLHEP::mm; + geombig = tgeom; + geommin = 1.e-3*CLHEP::mm; geomlimit = geombig; - presafety = 0.*mm; + presafety = 0.*CLHEP::mm; particle = nullptr; @@ -115,17 +113,17 @@ G4UrbanMscModel::G4UrbanMscModel(const G4String& nam) rangecut = geombig; drr = 0.35; - finalr = 10.*um; + finalr = 10.*CLHEP::um; tlow = 5.*CLHEP::keV; invmev = 1.0/CLHEP::MeV; skindepth = skin*stepmin; - mass = proton_mass_c2; - charge = ChargeSquare = 1.0; + mass = CLHEP::proton_mass_c2; + charge = chargeSquare = 1.0; currentKinEnergy = currentRadLength = lambda0 = lambdaeff = tPathLength - = zPathLength = par1 = par2 = par3 = 0; + = zPathLength = par1 = par2 = par3 = rndmarray[0] = rndmarray[1] = 0; currentLogKinEnergy = LOG_EKIN_MIN; idx = 0; @@ -169,8 +167,8 @@ void G4UrbanMscModel::Initialise(const G4ParticleDefinition* p, G4double G4UrbanMscModel::ComputeCrossSectionPerAtom( const G4ParticleDefinition* part, - G4double KineticEnergy, - G4double AtomicNumber,G4double, + G4double kinEnergy, + G4double atomicNumber,G4double, G4double, G4double) { static const G4double epsmin = 1.e-4 , epsmax = 1.e10; @@ -283,28 +281,28 @@ G4double G4UrbanMscModel::ComputeCrossSectionPerAtom( G4double sigma; SetParticle(part); - G4double Z23 = G4Pow::GetInstance()->Z23(G4lrint(AtomicNumber)); + G4double Z23 = G4Pow::GetInstance()->Z23(G4lrint(atomicNumber)); // correction if particle .ne. e-/e+ // compute equivalent kinetic energy // lambda depends on p*beta .... - G4double eKineticEnergy = KineticEnergy; + G4double eKineticEnergy = kinEnergy; - if(mass > electron_mass_c2) + if(mass > CLHEP::electron_mass_c2) { - G4double TAU = KineticEnergy/mass ; - G4double c = mass*TAU*(TAU+2.)/(electron_mass_c2*(TAU+1.)) ; - G4double w = c-2. ; - G4double tau = 0.5*(w+sqrt(w*w+4.*c)) ; - eKineticEnergy = electron_mass_c2*tau ; + G4double TAU = kinEnergy/mass ; + G4double c = mass*TAU*(TAU+2.)/(CLHEP::electron_mass_c2*(TAU+1.)) ; + G4double w = c-2.; + G4double tau = 0.5*(w+std::sqrt(w*w+4.*c)) ; + eKineticEnergy = CLHEP::electron_mass_c2*tau ; } - G4double eTotalEnergy = eKineticEnergy + electron_mass_c2 ; - G4double beta2 = eKineticEnergy*(eTotalEnergy+electron_mass_c2) + G4double eTotalEnergy = eKineticEnergy + CLHEP::electron_mass_c2 ; + G4double beta2 = eKineticEnergy*(eTotalEnergy+CLHEP::electron_mass_c2) /(eTotalEnergy*eTotalEnergy); - G4double bg2 = eKineticEnergy*(eTotalEnergy+electron_mass_c2) - /(electron_mass_c2*electron_mass_c2); + G4double bg2 = eKineticEnergy*(eTotalEnergy+CLHEP::electron_mass_c2) + /(CLHEP::electron_mass_c2*CLHEP::electron_mass_c2); static const G4double epsfactor = 2.*CLHEP::electron_mass_c2* CLHEP::electron_mass_c2*CLHEP::Bohr_radius*CLHEP::Bohr_radius @@ -315,21 +313,21 @@ G4double G4UrbanMscModel::ComputeCrossSectionPerAtom( else if(eps=0)&&(Zdat[iZ]>=AtomicNumber)) iZ -= 1; + while ((iZ>=0)&&(Zdat[iZ]>=atomicNumber)) { --iZ; } iZ = std::min(std::max(iZ, 0), 13); G4double ZZ1 = Zdat[iZ]; G4double ZZ2 = Zdat[iZ+1]; - G4double ratZ = (AtomicNumber-ZZ1)*(AtomicNumber+ZZ1)/ + G4double ratZ = (atomicNumber-ZZ1)*(atomicNumber+ZZ1)/ ((ZZ2-ZZ1)*(ZZ2+ZZ1)); static const G4double Tlim = 10.*CLHEP::MeV; @@ -364,11 +362,13 @@ G4double G4UrbanMscModel::ComputeCrossSectionPerAtom( iT = std::min(std::max(iT, 0), 20); // calculate betasquare values - G4double T = Tdat[iT], E = T + electron_mass_c2; - G4double b2small = T*(E+electron_mass_c2)/(E*E); + G4double T = Tdat[iT]; + G4double E = T + CLHEP::electron_mass_c2; + G4double b2small = T*(E+CLHEP::electron_mass_c2)/(E*E); - T = Tdat[iT+1]; E = T + electron_mass_c2; - G4double b2big = T*(E+electron_mass_c2)/(E*E); + T = Tdat[iT+1]; + E = T + CLHEP::electron_mass_c2; + G4double b2big = T*(E+CLHEP::electron_mass_c2)/(E*E); G4double ratb2 = (beta2-b2small)/(b2big-b2small); if (charge < 0.) @@ -379,11 +379,6 @@ G4double G4UrbanMscModel::ComputeCrossSectionPerAtom( c1 = celectron[iZ][iT+1]; c2 = celectron[iZ+1][iT+1]; - cc2 = c1+ratZ*(c2-c1); - - corr = cc1+ratb2*(cc2-cc1); - - sigma *= sigmafactor/corr; } else { @@ -393,29 +388,25 @@ G4double G4UrbanMscModel::ComputeCrossSectionPerAtom( c1 = cpositron[iZ][iT+1]; c2 = cpositron[iZ+1][iT+1]; - cc2 = c1+ratZ*(c2-c1); - - corr = cc1+ratb2*(cc2-cc1); - - sigma *= sigmafactor/corr; } + G4double cc2 = c1+ratZ*(c2-c1); + sigma *= sigmafactor/(cc1+ratb2*(cc2-cc1)); } else { c1 = bg2lim*sig0[iZ]*(1.+hecorr[iZ]*(beta2-beta2lim))/bg2; c2 = bg2lim*sig0[iZ+1]*(1.+hecorr[iZ+1]*(beta2-beta2lim))/bg2; - if((AtomicNumber >= ZZ1) && (AtomicNumber <= ZZ2)) + if((atomicNumber >= ZZ1) && (atomicNumber <= ZZ2)) sigma = c1+ratZ*(c2-c1) ; - else if(AtomicNumber < ZZ1) - sigma = AtomicNumber*AtomicNumber*c1/(ZZ1*ZZ1); - else if(AtomicNumber > ZZ2) - sigma = AtomicNumber*AtomicNumber*c2/(ZZ2*ZZ2); + else if(atomicNumber < ZZ1) + sigma = atomicNumber*atomicNumber*c1/(ZZ1*ZZ1); + else if(atomicNumber > ZZ2) + sigma = atomicNumber*atomicNumber*c2/(ZZ2*ZZ2); } // low energy correction based on theory - sigma *= 1.+0.30/(1.+sqrt(1000.*eKineticEnergy)); + sigma *= (1.+0.30/(1.+std::sqrt(1000.*eKineticEnergy))); return sigma; - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -822,39 +813,25 @@ G4UrbanMscModel::SampleScattering(const G4ThreeVector& oldDirection, G4double /*safety*/) { fDisplacement.set(0.0,0.0,0.0); - G4double kineticEnergy = currentKinEnergy; + G4double kinEnergy = currentKinEnergy; if (tPathLength > currentRange*dtrl) { - kineticEnergy = GetEnergy(particle,currentRange-tPathLength,couple); - } else { - kineticEnergy -= tPathLength*GetDEDX(particle,currentKinEnergy,couple, - currentLogKinEnergy); + kinEnergy = GetEnergy(particle,currentRange-tPathLength,couple); + } else if(tPathLength > currentRange*0.01) { + kinEnergy -= tPathLength*GetDEDX(particle,currentKinEnergy,couple, + currentLogKinEnergy); } - if((kineticEnergy <= eV) || (tPathLength <= tlimitminfix) || + if((kinEnergy <= CLHEP::eV) || (tPathLength <= tlimitminfix) || (tPathLength < tausmall*lambda0)) { return fDisplacement; } - G4double cth = SampleCosineTheta(tPathLength,kineticEnergy); + G4double cth = SampleCosineTheta(tPathLength,kinEnergy); // protection against 'bad' cth values if(std::abs(cth) >= 1.0) { return fDisplacement; } - /* - if(cth < 1.0 - 1000*tPathLength/lambda0 && cth < 0.5 && - kineticEnergy > 20*MeV) { - G4cout << "### G4UrbanMscModel::SampleScattering for " - << particle->GetParticleName() - << " E(MeV)= " << kineticEnergy/MeV - << " Step(mm)= " << tPathLength/mm - << " in " << CurrentCouple()->GetMaterial()->GetName() - << " CosTheta= " << cth << G4endl; - } - */ - G4double sth = sqrt((1.0 - cth)*(1.0 + cth)); - G4double phi = twopi*rndmEngineMod->flat(); - G4double dirx = sth*cos(phi); - G4double diry = sth*sin(phi); - - G4ThreeVector newDirection(dirx,diry,cth); + G4double sth = std::sqrt((1.0 - cth)*(1.0 + cth)); + G4double phi = CLHEP::twopi*rndmEngineMod->flat(); + G4ThreeVector newDirection(sth*std::cos(phi),sth*std::sin(phi),cth); newDirection.rotateUz(oldDirection); fParticleChange->ProposeMomentumDirection(newDirection); @@ -877,21 +854,19 @@ G4UrbanMscModel::SampleScattering(const G4ThreeVector& oldDirection, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength, - G4double KineticEnergy) + G4double kinEnergy) { - G4double cth = 1. ; + G4double cth = 1.0; G4double tau = trueStepLength/lambda0; - currentTau = tau; - lambdaeff = lambda0; - G4double lambda1 = GetTransportMeanFreePath(particle,KineticEnergy); + G4double lambda1 = GetTransportMeanFreePath(particle, kinEnergy); if(std::abs(lambda1 - lambda0) > lambda0*0.01 && lambda1 > 0.) { // mean tau value tau = trueStepLength*G4Log(lambda0/lambda1)/(lambda0-lambda1); } - currentTau = tau ; + currentTau = tau; lambdaeff = trueStepLength/currentTau; currentRadLength = couple->GetMaterial()->GetRadlen(); @@ -909,7 +884,7 @@ G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength, } // too large step of low-energy particle - G4double relloss = 1. - KineticEnergy/currentKinEnergy; + G4double relloss = 1. - kinEnergy/currentKinEnergy; static const G4double rellossmax= 0.50; if(relloss > rellossmax) { return SimpleScattering(xmeanth,x2meanth); @@ -917,12 +892,13 @@ G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength, // is step extreme small ? G4bool extremesmallstep = false; G4double tsmall = std::min(tlimitmin,lambdalimit); - G4double theta0 = 0.; + G4double theta0; if(trueStepLength > tsmall) { - theta0 = ComputeTheta0(trueStepLength,KineticEnergy); + theta0 = ComputeTheta0(trueStepLength,kinEnergy); } else { - theta0 = sqrt(trueStepLength/tsmall)*ComputeTheta0(tsmall,KineticEnergy); - extremesmallstep = true ; + theta0 = std::sqrt(trueStepLength/tsmall) + *ComputeTheta0(tsmall,kinEnergy); + extremesmallstep = true; } static const G4double onesixth = 1./6.; @@ -941,15 +917,15 @@ G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength, G4double x = theta2*(1.0 - theta2/12.); if(theta2 > numlim) { - G4double sth = 2*sin(0.5*theta0); + G4double sth = 2*std::sin(0.5*theta0); x = sth*sth; } // parameter for tail G4double ltau= G4Log(tau); - G4double u = extremesmallstep - ? G4Exp(G4Log(tsmall/lambda0)*onesixth) - : G4Exp(ltau*onesixth); + G4double u = !extremesmallstep ? G4Exp(ltau*onesixth) + : G4Exp(G4Log(tsmall/lambda0)*onesixth); + G4double xx = G4Log(lambdaeff/currentRadLength); G4double xsi = msc[idx]->coeffc1 + u*(msc[idx]->coeffc2+msc[idx]->coeffc3*u)+msc[idx]->coeffc4*xx; @@ -973,7 +949,6 @@ G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength, else if(std::abs(c-2.) < 0.001) { c = 2.001; } G4double c1 = c-1.; - G4double ea = G4Exp(-xsi); G4double eaa = 1.-ea ; G4double xmean1 = 1.-(1.-(1.+xsi)*ea)*x/eaa; @@ -1006,10 +981,11 @@ G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength, //G4cout << "c= " << c << " qprob= " << qprob << " eb1= " << eb1 // << " c1= " << c1 << " b1= " << b1 << " bx= " << bx << " eb1= " << eb1 // << G4endl; - if(rndmEngineMod->flat() < qprob) + rndmEngineMod->flatArray(2, rndmarray); + if(rndmarray[0] < qprob) { G4double var = 0; - if(rndmEngineMod->flat() < prob) { + if(rndmarray[1] < prob) { cth = 1.+G4Log(ea+rndmEngineMod->flat()*eaa)*x; } else { var = (1.0 - d)*rndmEngineMod->flat(); @@ -1020,48 +996,26 @@ G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength, cth = 1. + x*(c - xsi - c*G4Exp(-G4Log(var + d)/c1)); } } - /* - if(KineticEnergy > 5*GeV && cth < 0.9) { - G4cout << "G4UrbanMscModel::SampleCosineTheta: E(GeV)= " - << KineticEnergy/GeV - << " 1-cosT= " << 1 - cth - << " length(mm)= " << trueStepLength << " Zeff= " << Zeff - << " tau= " << tau - << " prob= " << prob << " var= " << var << G4endl; - G4cout << " c= " << c << " qprob= " << qprob << " eb1= " << eb1 - << " ebx= " << ebx - << " c1= " << c1 << " b= " << b << " b1= " << b1 - << " bx= " << bx << " d= " << d - << " ea= " << ea << " eaa= " << eaa << G4endl; - } - */ - } - else { - cth = -1.+2.*rndmEngineMod->flat(); - /* - if(KineticEnergy > 5*GeV) { - G4cout << "G4UrbanMscModel::SampleCosineTheta: E(GeV)= " - << KineticEnergy/GeV - << " length(mm)= " << trueStepLength << " Zeff= " << Zeff - << " qprob= " << qprob << G4endl; - } - */ + } else { + cth = -1.+2.*rndmarray[1]; } } - return cth ; + return cth; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double G4UrbanMscModel::ComputeTheta0(G4double trueStepLength, - G4double KineticEnergy) + G4double kinEnergy) { // for all particles take the width of the central part // from a parametrization similar to the Highland formula // ( Highland formula: Particle Physics Booklet, July 2002, eq. 26.10) - G4double invbetacp = std::sqrt((currentKinEnergy+mass)*(KineticEnergy+mass)/ - (currentKinEnergy*(currentKinEnergy+2.*mass)* - KineticEnergy*(KineticEnergy+2.*mass))); + G4double invbetacp = (kinEnergy+mass)/(kinEnergy*(kinEnergy+2.*mass)); + if(currentKinEnergy != kinEnergy) { + invbetacp = std::sqrt(invbetacp*(currentKinEnergy+mass)/ + (currentKinEnergy*(currentKinEnergy+2.*mass))); + } G4double y = trueStepLength/currentRadLength; if(particle == positron) @@ -1072,7 +1026,7 @@ G4double G4UrbanMscModel::ComputeTheta0(G4double trueStepLength, static const G4double e = 113.0; G4double corr; - G4double tau = std::sqrt(currentKinEnergy*KineticEnergy)/mass; + G4double tau = std::sqrt(currentKinEnergy*kinEnergy)/mass; G4double x = std::sqrt(tau*(tau+2.)/((tau+1.)*(tau+1.))); G4double a = 0.994-4.08e-3*Zeff; G4double b = 7.16+(52.6+365./Zeff)/Zeff; @@ -1109,7 +1063,7 @@ void G4UrbanMscModel::SampleDisplacement(G4double, G4double phi) // based on single scattering results // u = r/rmax : mean value - G4double rmax = sqrt((tPathLength-zPathLength)*(tPathLength+zPathLength)); + G4double rmax = std::sqrt((tPathLength-zPathLength)*(tPathLength+zPathLength)); if(rmax > 0.) { G4double r = 0.73*rmax; @@ -1119,9 +1073,10 @@ void G4UrbanMscModel::SampleDisplacement(G4double, G4double phi) // the same mean value than that obtained from the ss simulation static const G4double cbeta = 2.160; - static const G4double cbeta1 = 1.-G4Exp(-cbeta*CLHEP::pi); - G4double psi = -G4Log(1.-rndmEngineMod->flat()*cbeta1)/cbeta; - G4double Phi = (rndmEngineMod->flat() < 0.5) ? phi+psi : phi-psi; + static const G4double cbeta1 = 1. - G4Exp(-cbeta*CLHEP::pi); + rndmEngineMod->flatArray(2, rndmarray); + G4double psi = -G4Log(1. - rndmarray[0]*cbeta1)/cbeta; + G4double Phi = (rndmarray[1] < 0.5) ? phi+psi : phi-psi; fDisplacement.set(r*std::cos(Phi),r*std::sin(Phi),0.0); } } @@ -1131,7 +1086,8 @@ void G4UrbanMscModel::SampleDisplacement(G4double, G4double phi) void G4UrbanMscModel::SampleDisplacementNew(G4double, G4double phi) { // best sampling based on single scattering results - G4double rmax = sqrt((tPathLength-zPathLength)*(tPathLength+zPathLength)); + G4double rmax = + std::sqrt((tPathLength-zPathLength)*(tPathLength+zPathLength)); G4double r(0.0); G4double u(0.0); static const G4double reps = 5.e-3; @@ -1167,20 +1123,22 @@ void G4UrbanMscModel::SampleDisplacementNew(G4double, G4double phi) if(rndmEngineMod->flat() < wlow) { do { - u = G4Log(rwa1+rwa2*rndmEngineMod->flat())/ralpha1; + rndmEngineMod->flatArray(2, rndmarray); + u = G4Log(rwa1+rwa2*rndmarray[0])/ralpha1; uc = umax-u; rej = G4Exp(-ralpha2*uc)* (1.+ralpha*uc+ra1*uc*uc+ra2*uc*uc*uc+ra3*uc*uc*uc*uc); - } while (rejamax*rndmEngineMod->flat() > rej && ++count < 1000); + } while (rejamax*rndmarray[1] > rej && ++count < 1000); } else { do { - u = -G4Log(rwb1-rwb2*rndmEngineMod->flat())/rbeta1; + rndmEngineMod->flatArray(2, rndmarray); + u = -G4Log(rwb1-rwb2*rndmarray[0])/rbeta1; uc = u-umax; rej = G4Exp(-rbeta2*uc)* (1.+rbeta*uc+rb0*uc*uc+rb1*uc*uc*uc+rb2*uc*uc*uc*uc); - } while (rejbmax*rndmEngineMod->flat() > rej && ++count < 1000); + } while (rejbmax*rndmarray[1] > rej && ++count < 1000); } r = rmax*u; } @@ -1228,19 +1186,20 @@ void G4UrbanMscModel::SampleDisplacementNew(G4double, G4double phi) pw1[8]-G4Exp(-palpha1[8]*(Pi-peps)), pw1[9]-G4Exp(-palpha1[9]*(Pi-peps))}; - G4int iphi = u*10.; + G4int iphi = (G4int)(u*10.); if(iphi < 0) { iphi = 0; } else if(iphi > 9) { iphi = 9; } G4int count = 0; do { - v = -G4Log(pw1[iphi]-pw2[iphi]*rndmEngineMod->flat())/palpha1[iphi]; + rndmEngineMod->flatArray(2, rndmarray); + v = -G4Log(pw1[iphi]-pw2[iphi]*rndmarray[0])/palpha1[iphi]; rej = (G4Exp(-palpha[iphi]*v)* (1+pa1[iphi]*v+pa2[iphi]*v*v+pa3[iphi]*v*v*v)+pa4[iphi])/ G4Exp(-pw1[iphi]*v); } // Loop checking, 5-March-2018, Vladimir Ivanchenko - while (pejmax[iphi]*rndmEngineMod->flat() > rej && ++count < 1000); + while (pejmax[iphi]*rndmarray[1] > rej && ++count < 1000); G4double Phi = (rndmEngineMod->flat() < 0.5) ? phi+v : phi-v; fDisplacement.set(r*std::cos(Phi),r*std::sin(Phi),0.0); diff --git a/source/processes/electromagnetic/standard/src/G4alphaIonisation.cc b/source/processes/electromagnetic/standard/src/G4alphaIonisation.cc deleted file mode 100644 index dd459071ee..0000000000 --- a/source/processes/electromagnetic/standard/src/G4alphaIonisation.cc +++ /dev/null @@ -1,157 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// ------------------------------------------------------------------- -// -// GEANT4 Class file -// -// -// File name: G4alphaIonisation -// -// Author: Vladimir Ivanchenko -// -// Creation date: 28.10.2009 created from G4ionIonisation -// -// Modifications: -// -// -// -// ------------------------------------------------------------------- -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -#include "G4alphaIonisation.hh" - -#include "G4PhysicalConstants.hh" -#include "G4SystemOfUnits.hh" -#include "G4Electron.hh" -#include "G4Alpha.hh" -#include "G4BraggIonModel.hh" -#include "G4BetheBlochModel.hh" -#include "G4UnitsTable.hh" -#include "G4LossTableManager.hh" -#include "G4IonFluctuations.hh" -#include "G4UniversalFluctuation.hh" -#include "G4EmParameters.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -using namespace std; - -G4alphaIonisation::G4alphaIonisation(const G4String& name) - : G4VEnergyLossProcess(name), - theParticle(nullptr), - isInitialised(false) -{ - G4Exception("G4alphaIonisation::G4alphaIonisation","em0007",JustWarning, - " The process is not ready for use - incorrect results are expected"); - SetLinearLossLimit(0.02); - SetProcessSubType(fIonisation); - mass = 0.0; - ratio = 0.0; - eth = 8*CLHEP::MeV; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4alphaIonisation::~G4alphaIonisation() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4bool G4alphaIonisation::IsApplicable(const G4ParticleDefinition&) -{ - return true; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -G4double G4alphaIonisation::MinPrimaryEnergy(const G4ParticleDefinition*, - const G4Material*, - G4double cut) -{ - G4double x = 0.5*cut/electron_mass_c2; - G4double gam = x*ratio + std::sqrt((1. + x)*(1. + x*ratio*ratio)); - return mass*(gam - 1.0); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -void G4alphaIonisation::InitialiseEnergyLossProcess( - const G4ParticleDefinition* part, - const G4ParticleDefinition* bpart) -{ - if(!isInitialised) { - - theParticle = part; - G4String pname = part->GetParticleName(); - - // define base particle - const G4ParticleDefinition* theBaseParticle = nullptr; - if(bpart == nullptr) { - if(pname != "alpha") { theBaseParticle = G4Alpha::Alpha(); } - } else { theBaseParticle = bpart; } - - mass = part->GetPDGMass(); - ratio = mass/electron_mass_c2/mass; - - SetBaseParticle(theBaseParticle); - SetSecondaryParticle(G4Electron::Electron()); - - if (nullptr == EmModel(0)) { SetEmModel(new G4BraggIonModel()); } - - G4EmParameters* param = G4EmParameters::Instance(); - G4double emin = param->MinKinEnergy(); - EmModel(0)->SetLowEnergyLimit(emin); - - // model limit defined for alpha - eth = (EmModel(0)->HighEnergyLimit())*ratio; - EmModel(0)->SetHighEnergyLimit(eth); - AddEmModel(1, EmModel(0), new G4IonFluctuations()); - - if (nullptr == FluctModel()) { - SetFluctModel(new G4UniversalFluctuation()); - } - - if (nullptr == EmModel(1)) { SetEmModel(new G4BetheBlochModel()); } - EmModel(1)->SetLowEnergyLimit(eth); - EmModel(1)->SetHighEnergyLimit(param->MaxKinEnergy()); - AddEmModel(2, EmModel(1), FluctModel()); - - isInitialised = true; - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -void G4alphaIonisation::ProcessDescription(std::ostream& out) const -{ - out << " Alpha ionisation"; - G4VEnergyLossProcess::ProcessDescription(out); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/standard/src/G4eplusAnnihilation.cc b/source/processes/electromagnetic/standard/src/G4eplusAnnihilation.cc index 01c66de2e1..cf6cc62d88 100644 --- a/source/processes/electromagnetic/standard/src/G4eplusAnnihilation.cc +++ b/source/processes/electromagnetic/standard/src/G4eplusAnnihilation.cc @@ -77,8 +77,7 @@ G4eplusAnnihilation::G4eplusAnnihilation(const G4String& name) SetProcessSubType(fAnnihilation); enableAtRestDoIt = true; mainSecondaries = 2; - fEntanglementModelIndex = - G4PhysicsModelCatalog::Register("G4GammaGammaEntanglement"); + fEntanglementModelID = G4PhysicsModelCatalog::GetModelID("model_GammaGammaEntanglement"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -220,7 +219,7 @@ G4VParticleChange* G4eplusAnnihilation::AtRestDoIt(const G4Track& track, clipBoard->SetTrackB(t); } t->SetAuxiliaryTrackInformation - (fEntanglementModelIndex,new G4EntanglementAuxInfo(clipBoard)); + (fEntanglementModelID,new G4EntanglementAuxInfo(clipBoard)); } if (biasManager) { t->SetWeight(weight * biasManager->GetWeight(i)); @@ -230,15 +229,15 @@ G4VParticleChange* G4eplusAnnihilation::AtRestDoIt(const G4Track& track, pParticleChange->AddSecondary(t); // define type of secondary - if(i < mainSecondaries) { t->SetCreatorModelIndex(secID); } + if(i < mainSecondaries) { t->SetCreatorModelID(secID); } else if(i < num0) { if(p == theGamma) { - t->SetCreatorModelIndex(fluoID); + t->SetCreatorModelID(fluoID); } else { - t->SetCreatorModelIndex(augerID); + t->SetCreatorModelID(augerID); } } else { - t->SetCreatorModelIndex(biasID); + t->SetCreatorModelID(biasID); } /* G4cout << "Secondary(post step) has weight " << t->GetWeight() diff --git a/source/processes/electromagnetic/standard/src/G4hIonisation.cc b/source/processes/electromagnetic/standard/src/G4hIonisation.cc index 9040a75091..e0e86ad2c3 100644 --- a/source/processes/electromagnetic/standard/src/G4hIonisation.cc +++ b/source/processes/electromagnetic/standard/src/G4hIonisation.cc @@ -112,18 +112,21 @@ void G4hIonisation::InitialiseEnergyLossProcess( //G4cout << " G4hIonisation::InitialiseEnergyLossProcess " << pname // << " " << bpart << G4endl; - // standard base particles - if(part == bpart || pname == "proton" || - pname == "anti_proton" || - pname == "pi+" || pname == "pi-" || - pname == "kaon+" || pname == "kaon-" || pname == "GenericIon" - || pname == "He3" || pname == "alpha") - { - theBaseParticle = nullptr; - } - // select base particle - else if(bpart == nullptr) { + // define base particle + if(part == bpart) { + theBaseParticle = nullptr; + } else if(nullptr != bpart) { + theBaseParticle = bpart; + } else if(pname == "proton" || pname == "anti_proton" || + pname == "pi+" || pname == "pi-" || + pname == "kaon+" || pname == "kaon-" || + pname == "GenericIon" || pname == "alpha") { + // no base particles + theBaseParticle = nullptr; + + } else { + // select base particle if(part->GetPDGSpin() == 0.0) { if(q > 0.0) { theBaseParticle = G4KaonPlus::KaonPlus(); } else { theBaseParticle = G4KaonMinus::KaonMinus(); } @@ -131,10 +134,6 @@ void G4hIonisation::InitialiseEnergyLossProcess( if(q > 0.0) { theBaseParticle = G4Proton::Proton(); } else { theBaseParticle = G4AntiProton::AntiProton(); } } - - // base particle defined by interface - } else { - theBaseParticle = bpart; } SetBaseParticle(theBaseParticle); diff --git a/source/processes/electromagnetic/standard/src/G4ionIonisation.cc b/source/processes/electromagnetic/standard/src/G4ionIonisation.cc index ca6b518dce..b35f7cf162 100644 --- a/source/processes/electromagnetic/standard/src/G4ionIonisation.cc +++ b/source/processes/electromagnetic/standard/src/G4ionIonisation.cc @@ -66,6 +66,7 @@ #include "G4Electron.hh" #include "G4Proton.hh" #include "G4GenericIon.hh" +#include "G4Alpha.hh" #include "G4BraggModel.hh" #include "G4BraggIonModel.hh" #include "G4BetheBlochModel.hh" @@ -125,10 +126,18 @@ void G4ionIonisation::InitialiseEnergyLossProcess( // define base particle const G4ParticleDefinition* theBaseParticle = nullptr; + const G4int pdg = part->GetPDGEncoding(); - if(part == ion) { theBaseParticle = nullptr; } - else if(bpart == nullptr) { theBaseParticle = ion; } - else { theBaseParticle = bpart; } + // define base particle + if(part == bpart) { + theBaseParticle = nullptr; + } else if(nullptr != bpart) { + theBaseParticle = bpart; + } else if(part == ion || pdg == 1000020040) { + theBaseParticle = nullptr; + } else { + theBaseParticle = ion; + } SetBaseParticle(theBaseParticle); @@ -138,14 +147,15 @@ void G4ionIonisation::InitialiseEnergyLossProcess( EmModel(0)->SetLowEnergyLimit(param->MinKinEnergy()); // model limit defined for protons - eth = (EmModel(0)->HighEnergyLimit())*part->GetPDGMass()/proton_mass_c2; + eth = (EmModel(0)->HighEnergyLimit()) + *part->GetPDGMass()/CLHEP::proton_mass_c2; EmModel(0)->SetHighEnergyLimit(eth); if (nullptr == FluctModel()) { SetFluctModel(new G4IonFluctuations()); } AddEmModel(1, EmModel(0), FluctModel()); G4double emax = param->MaxKinEnergy(); - if(eth < emax) { + if(eth < 0.99*emax) { if (nullptr == EmModel(1)) { SetEmModel(new G4BetheBlochModel()); } EmModel(1)->SetLowEnergyLimit(eth); EmModel(1)->SetHighEnergyLimit(emax); @@ -156,9 +166,11 @@ void G4ionIonisation::InitialiseEnergyLossProcess( if(part == ion && (EmModel(1)->GetName() == "BetheBloch" || EmModel(1)->GetName() == "BetheBlochGasIon")) { stopDataActive = true; - G4WaterStopping ws(corr); + G4WaterStopping ws(corr, true); corr->SetIonisationModels(EmModel(0),EmModel(1)); } + } else { + EmModel(0)->SetHighEnergyLimit(emax); } isInitialised = true; } diff --git a/source/processes/electromagnetic/utils/History b/source/processes/electromagnetic/utils/History index c8397c36fd..6f37caa478 100644 --- a/source/processes/electromagnetic/utils/History +++ b/source/processes/electromagnetic/utils/History @@ -16,6 +16,89 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +19 November 21: V.Ivanchenko (emutils-V10-07-38) +- G4EmCalculator - fixed computation of dedx for He3 and alpha + (complete fix of #2440) + +10 November 21: S. Guatelli (emutils-V10-07-37) +- changed ANSTO parameters in UI interface commands + +30 October 21: V.Ivanchenko (emutils-V10-07-36) +- G4VEnergyLossProcess - exclude ion corrections only from d, t, alpha + in order to fix #2440 +- G4ionEffectiveCharge - return back limit on effective charge + from 0.5 to 1 (used in previous releases) + +25 October 21: V.Ivanchenko (emutils-V10-07-35) +- G4EmParameters - add ANSTO options for the atomic de-excitation; + removed obsolete AugerCascade() method +- G4EmLowEParameters, G4EmLowEParametersMessenger - added ANSTO + flag and UI commands + +20 October 21: V.Ivanchenko (emutils-V10-07-34) +- G4EmProcessSubType : added new type for annihilation to the tau pair + +12 October 21: V.Ivanchenko (emutils-V10-07-33) +- G4ionEffectiveCharge - code clean-up +- G4EmCorrections - do not use spline in various internal vectors, + because correction values are small and smooth, clean-up ion + correction computations +- G4VEnergyLossProcess - code clean-up for ions + +06 October 21: A.Ribon (emutils-V10-07-32) +- G4LowEnergyEmProcessSubType : added new enum values, corresponding + to numerical values used in G4PhysicsListHelper + +03 October 21: V.Ivanchenko (emutils-V10-07-31) +- G4VEmProcess, G4VEnergyLossProcess, G4VAtomDeexcitation, + G4LossTableBuilder - implemented updated numbering scheme for + secondary particle production, deprecate duplicate printout + of processes and models, move list of EM parameters printout + before printout on processes, code format improved + G4EmParameters, G4EmParametersMessenger - removed obsolete + methods, added protection agains duplicate printout + +23 September 21: A.Ribon (emutils-V10-07-30) +- G4LowEnergyEmProcessSubType : created new enum for low-energy + electromagnetic process sub-types + +16 September 21: V.Ivanchenko (emutils-V10-07-29) +- G4EmElementSelector - change computation for upper energy limit + fixing crashes in some applications + +30 August 21: D.Sawkey (emutils-V10-07-28) +- G4OpticalParameters - removed deprecated function declarations +- G4OpticalParameters, G4OpticalParametersMessenger - apply + clang-format style guidelines + +27 August 21: V.Ivanchenko (emutils-V10-07-27) +- G4LossTableBuilder - use updated interface to G4PhysicsVector +- G4EmElementSelector - change computation for corner cases +- G4VEnergyLossProcess - minor clean-up + +25 August 21: J.Hahnfeld (emutils-V10-07-26) +- G4EmParametersMessenger - correct default value for GeomFactor + +04 August 21: A.Ribon (emutils-V10-07-25) +- G4VEmProcess, G4VEnergyLossProcess, G4VAtomDeexcitation : migrated + to the new version of G4PhysicsModelCatalog + +18 July 21: V.Ivanchenko (emutils-V10-07-24) +- G4VEmFluctuationModel - changed interface - both cut value and + max energy transfer are parameters of main methods; this + is needed in order to fix problem #2390 +- G4VEnergyLossProcess, G4EmModelManager - adopted above interface + change + +11 July 21: V.Ivanchenko (emutils-V10-07-23) +- G4VEmProcess, G4VEnergyLossProcess, G4VMultipleScattering, + G4LossTableBuilder, G4VEmModel, G4VMscModel, G4LossTableManager + implement and use base material approach only if base materials + are defined, this should bring a minor speed-up of the code and little + reduction of memory; fixed problems for the case, when materials + are changed between runs +- G4LossTableBuilder - base material flag may be disabled + 08 June 21: V.Ivanchenko (emutils-V10-07-22) - G4VEmProcess, G4VEnergyLossProcess - fixed computation of cross section and rangle if base material approach is used; recover diff --git a/source/processes/electromagnetic/utils/include/G4DNAModelSubType.hh b/source/processes/electromagnetic/utils/include/G4DNAModelSubType.hh index 3379e90e55..aea678427e 100644 --- a/source/processes/electromagnetic/utils/include/G4DNAModelSubType.hh +++ b/source/processes/electromagnetic/utils/include/G4DNAModelSubType.hh @@ -41,12 +41,12 @@ enum G4DNAModelSubType { - fDNAUnknownModel = 0, - fRitchie1994eSolvation = 1, - fTerrisol1990eSolvation = 2, - fMeesungnoen2002eSolvation = 3, - fKreipl2009eSolvation = 4, - fMeesungnoensolid2002eSolvation = 5 + fDNAUnknownModel = 11000, + fRitchie1994eSolvation = 11001, + fTerrisol1990eSolvation = 11002, + fMeesungnoen2002eSolvation = 11003, + fKreipl2009eSolvation = 11004, + fMeesungnoensolid2002eSolvation = 11005 }; #endif diff --git a/source/processes/electromagnetic/utils/include/G4EmCorrections.hh b/source/processes/electromagnetic/utils/include/G4EmCorrections.hh index b54aa026c7..500409ed97 100644 --- a/source/processes/electromagnetic/utils/include/G4EmCorrections.hh +++ b/source/processes/electromagnetic/utils/include/G4EmCorrections.hh @@ -230,7 +230,7 @@ private: G4int nEtaK; G4int nEtaL; - G4int nbinCorr = 20; + G4int nbinCorr = 52; G4int numberOfElements = 0; // Ion stopping data diff --git a/source/processes/electromagnetic/utils/include/G4EmLowEParameters.hh b/source/processes/electromagnetic/utils/include/G4EmLowEParameters.hh index c3edee3f67..82daef98a6 100644 --- a/source/processes/electromagnetic/utils/include/G4EmLowEParameters.hh +++ b/source/processes/electromagnetic/utils/include/G4EmLowEParameters.hh @@ -72,6 +72,9 @@ public: void SetBeardenFluoDir(G4bool val); G4bool BeardenFluoDir() const; + void SetANSTOFluoDir(G4bool val); + G4bool ANSTOFluoDir() const; + void SetAuger(G4bool val); G4bool Auger() const; @@ -132,6 +135,7 @@ private: G4bool fluo; G4bool beardenFluoDir; + G4bool fANSTOFluoDir; G4bool auger; G4bool pixe; G4bool deexIgnoreCut; diff --git a/source/processes/electromagnetic/utils/include/G4EmLowEParametersMessenger.hh b/source/processes/electromagnetic/utils/include/G4EmLowEParametersMessenger.hh index 691d9c186e..42b23145d7 100644 --- a/source/processes/electromagnetic/utils/include/G4EmLowEParametersMessenger.hh +++ b/source/processes/electromagnetic/utils/include/G4EmLowEParametersMessenger.hh @@ -80,6 +80,7 @@ private: G4UIcmdWithABool* deCmd; G4UIcmdWithABool* dirFluoCmd; + G4UIcmdWithABool* dirFluoCmd1; G4UIcmdWithABool* auCmd; G4UIcmdWithABool* auCascadeCmd; G4UIcmdWithABool* pixeCmd; diff --git a/source/processes/electromagnetic/utils/include/G4EmParameters.hh b/source/processes/electromagnetic/utils/include/G4EmParameters.hh index e6a9b475c7..054905969a 100644 --- a/source/processes/electromagnetic/utils/include/G4EmParameters.hh +++ b/source/processes/electromagnetic/utils/include/G4EmParameters.hh @@ -89,7 +89,7 @@ public: // printing void StreamInfo(std::ostream& os) const; - void Dump() const; + void Dump(); friend std::ostream& operator<< (std::ostream& os, const G4EmParameters&); // boolean flags @@ -102,9 +102,6 @@ public: void SetLPM(G4bool val); G4bool LPM() const; - void SetSpline(G4bool val); - G4bool Spline() const; - void SetUseCutAsFinalRange(G4bool val); G4bool UseCutAsFinalRange() const; @@ -117,12 +114,13 @@ public: void SetBeardenFluoDir(G4bool val); G4bool BeardenFluoDir() const; - void SetAuger(G4bool val); - G4bool Auger() const; + void SetANSTOFluoDir(G4bool val); + G4bool ANSTOFluoDir() const; - // obsolete methods - void SetAugerCascade(G4bool val); - G4bool AugerCascade() const; + void SetAuger(G4bool val); + void SetAugerCascade(G4bool val) { SetAuger(val); }; + G4bool Auger() const; + G4bool AugerCascade() const { return Auger(); } void SetPixe(G4bool val); G4bool Pixe() const; @@ -145,8 +143,9 @@ public: void SetUseMottCorrection(G4bool val); G4bool UseMottCorrection() const; - void SetIntegral(G4bool) {}; - + void SetIntegral(G4bool val); + G4bool Integral() const; + void SetBirksActive(G4bool val); G4bool BirksActive() const; @@ -183,13 +182,14 @@ public: void SetRetrieveMuDataFromFile(G4bool v); // 5d - void SetOnIsolated(G4bool val); - G4bool OnIsolated() const; + void SetOnIsolated(G4bool val); + G4bool OnIsolated() const; - void ActivateDNA(); + void ActivateDNA(); + void SetIsPrintedFlag(G4bool val); + G4bool IsPrintLocked() const; // double parameters with values - void SetMinEnergy(G4double val); G4double MinKinEnergy() const; @@ -386,6 +386,7 @@ private: G4bool muhadLateralDisplacement; G4bool useAngGeneratorForIonisation; G4bool useMottCorrection; + G4bool integral; G4bool birks; G4bool fICRU90; G4bool gener; @@ -394,6 +395,7 @@ private: G4bool fMuDataFromFile; G4bool onIsolated; // 5d model conversion on free ions G4bool fDNA; + G4bool fIsPrinted; G4double minKinEnergy; G4double maxKinEnergy; diff --git a/source/processes/electromagnetic/utils/include/G4EmProcessSubType.hh b/source/processes/electromagnetic/utils/include/G4EmProcessSubType.hh index 5a5a2cca6c..60dbc4f32e 100644 --- a/source/processes/electromagnetic/utils/include/G4EmProcessSubType.hh +++ b/source/processes/electromagnetic/utils/include/G4EmProcessSubType.hh @@ -61,6 +61,7 @@ enum G4EmProcessSubType fGammaConversionToMuMu = 15, fGammaGeneralProcess = 16, fPositronGeneralProcess = 17, + fAnnihilationToTauTau = 18, fCerenkov = 21, fScintillation = 22, diff --git a/source/processes/electromagnetic/utils/include/G4EmSecondaryParticleType.hh b/source/processes/electromagnetic/utils/include/G4EmSecondaryParticleType.hh new file mode 100644 index 0000000000..d34edc1a9f --- /dev/null +++ b/source/processes/electromagnetic/utils/include/G4EmSecondaryParticleType.hh @@ -0,0 +1,73 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +//--------------------------------------------------------------- +// +// G4EmSecondaryParticleType.hh +// +// Class Description: +// This is an enumerator to define type of secondary according +// to G4PhysicsModelCatalog +// +// Author: Vladimir Ivanchenko +// +// Creation date: 30.09.2021 +// +//--------------------------------------------------------------- + +#ifndef G4EmSecondaryParticleType_h +#define G4EmSecondaryParticleType_h 1 + +enum G4EmSecondaryParticleType + { + _EM = 10000, + + _DeltaElectron = 10010, + _DeltaEBelowCut = 10011, + _PhotoElectron = 10012, + _ComptonElectron = 10013, + _TripletElectron = 10014, + + _Bremsstruhlung = 10020, + _SplitBremsstrahlung = 10021, + _ComptonGamma = 10022, + _Annihilation = 10023, + _TripletGamma = 10024, + _GammaGammaEntanglement = 10025, + + _PairProduction = 10030, + + _Fluorescence = 10040, + _GammaPIXE = 10041, + + _AugerElectron = 10050, + _ePIXE = 10051, + + _IonRecoil = 10060 + }; + +#endif + + diff --git a/source/processes/electromagnetic/utils/include/G4LossTableBuilder.hh b/source/processes/electromagnetic/utils/include/G4LossTableBuilder.hh index dd13ead553..b38c9b4233 100644 --- a/source/processes/electromagnetic/utils/include/G4LossTableBuilder.hh +++ b/source/processes/electromagnetic/utils/include/G4LossTableBuilder.hh @@ -72,13 +72,11 @@ public: // build range void BuildRangeTable(const G4PhysicsTable* dedxTable, - G4PhysicsTable* rangeTable, - G4bool useBM = false); + G4PhysicsTable* rangeTable); // build inverse range void BuildInverseRangeTable(const G4PhysicsTable* rangeTable, - G4PhysicsTable* invRangeTable, - G4bool useBM = false); + G4PhysicsTable* invRangeTable); // build a table requested by any model class G4PhysicsTable* BuildTableForModel(G4PhysicsTable* table, @@ -97,10 +95,14 @@ public: G4bool GetFlag(size_t idx); + G4bool GetBaseMaterialFlag(); + inline void SetSplineFlag(G4bool flag); inline void SetInitialisationFlag(G4bool flag); + inline void SetBaseMaterialActive(G4bool flag); + G4LossTableBuilder & operator=(const G4LossTableBuilder &right) = delete; G4LossTableBuilder(const G4LossTableBuilder&) = delete; @@ -110,6 +112,8 @@ private: G4bool splineFlag = true; G4bool isInitialized = false; + G4bool baseMatFlag = false; + G4bool isBaseMatActive = true; G4bool isMaster; static std::vector* theDensityFactor; @@ -130,6 +134,15 @@ inline void G4LossTableBuilder::SetInitialisationFlag(G4bool flag) isInitialized = flag; } +inline void G4LossTableBuilder::SetBaseMaterialActive(G4bool flag) +{ + isBaseMatActive = flag; + if(!flag) { + baseMatFlag = false; + isInitialized = false; + } +} + //....oooOO0OOooo.......oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/source/visualization/modeling/include/G4ScaleModel.hh b/source/processes/electromagnetic/utils/include/G4LowEnergyEmProcessSubType.hh similarity index 65% rename from source/visualization/modeling/include/G4ScaleModel.hh rename to source/processes/electromagnetic/utils/include/G4LowEnergyEmProcessSubType.hh index e8b2d296bd..d85a04b154 100644 --- a/source/visualization/modeling/include/G4ScaleModel.hh +++ b/source/processes/electromagnetic/utils/include/G4LowEnergyEmProcessSubType.hh @@ -24,42 +24,39 @@ // ******************************************************************** // // +//--------------------------------------------------------------- // -// -// John Allison 21st July 2001. +// G4LowEnergyEmProcessSubType.hh // // Class Description: +// This is an enumerator to define sub-type of electro-magnetic +// low-energy processes // -// Model which knows how to draw a scale. +// Creation date: 23.09.2021 +// Modifications: // -// For access to base class information, e.g., modeling parameters, -// use GetModelingParameters() inherited from G4VModel. See Class -// Description of the base class G4VModel. +//--------------------------------------------------------------- -#ifndef G4SCALEMODEL_HH -#define G4SCALEMODEL_HH +#ifndef G4LowEnergyEmProcessSubType_h +#define G4LowEnergyEmProcessSubType_h 1 -#include "G4VModel.hh" -#include "G4Scale.hh" - -class G4ScaleModel: public G4VModel { - -public: // With description - - G4ScaleModel (const G4Scale&); - - virtual ~G4ScaleModel (); - - virtual void DescribeYourselfTo (G4VGraphicsScene&); - // The main task of a model is to describe itself to the graphics scene. - -private: - - // Private copy contructor and assignment to forbid use... - G4ScaleModel (const G4ScaleModel&); - G4ScaleModel& operator = (const G4ScaleModel&); - - G4Scale fScale; +enum G4LowEnergyEmProcessSubType +{ + fLowEnergyElastic = 51, + fLowEnergyExcitation = 52, + fLowEnergyIonisation = 53, + fLowEnergyVibrationalExcitation = 54, + fLowEnergyAttachment = 55, + fLowEnergyChargeDecrease = 56, + fLowEnergyChargeIncrease = 57, + fLowEnergyElectronSolvation = 58, + fLowEnergyMolecularDecay = 59, + fLowEnergyTransportation = 60, + fLowEnergyBrownianTransportation = 61, + fLowEnergyDoubleIonisation = 62, + fLowEnergyDoubleCap = 63, + fLowEnergyIoniTransfer = 64, + fLowEnergyStaticMol = 65 }; #endif diff --git a/source/processes/electromagnetic/utils/include/G4OpticalParameters.hh b/source/processes/electromagnetic/utils/include/G4OpticalParameters.hh index 539a274605..ba7adf1278 100644 --- a/source/processes/electromagnetic/utils/include/G4OpticalParameters.hh +++ b/source/processes/electromagnetic/utils/include/G4OpticalParameters.hh @@ -41,8 +41,8 @@ // A utility static class, responsable for keeping parameters // for all optical physics processes and models. // -// It is initialized by the master thread but can be updated -// at any moment. Parameters may be used in run time or at +// It is initialized by the master thread but can be updated +// at any moment. Parameters may be used in run time or at // initialisation // // ------------------------------------------------------------------- @@ -60,41 +60,50 @@ class G4OpticalParametersMessenger; class G4StateManager; -enum G4OpticalProcessIndex { - kCerenkov, ///< Cerenkov process index - kScintillation, ///< Scintillation process index - kAbsorption, ///< Absorption process index - kRayleigh, ///< Rayleigh scattering process index - kMieHG, ///< Mie scattering process index - kBoundary, ///< Boundary process index - kWLS, ///< Wave Length Shifting process index - kWLS2, ///< Second Wave Length Shifting process index - kNoProcess ///< Number of processes, no selected process +enum G4OpticalProcessIndex +{ + kCerenkov, ///< Cerenkov process index + kScintillation, ///< Scintillation process index + kAbsorption, ///< Absorption process index + kRayleigh, ///< Rayleigh scattering process index + kMieHG, ///< Mie scattering process index + kBoundary, ///< Boundary process index + kWLS, ///< Wave Length Shifting process index + kWLS2, ///< Second Wave Length Shifting process index + kNoProcess ///< Number of processes, no selected process }; /// Return the name for a given optical process index -G4String G4OpticalProcessName(G4int ); +G4String G4OpticalProcessName(G4int); -inline -G4String G4OpticalProcessName(G4int processNumber) +inline G4String G4OpticalProcessName(G4int processNumber) { - switch ( processNumber ) { - case kCerenkov: return "Cerenkov"; - case kScintillation: return "Scintillation"; - case kAbsorption: return "OpAbsorption"; - case kRayleigh: return "OpRayleigh"; - case kMieHG: return "OpMieHG"; - case kBoundary: return "OpBoundary"; - case kWLS: return "OpWLS"; - case kWLS2: return "OpWLS2"; - default: return "NoProcess"; + switch(processNumber) + { + case kCerenkov: + return "Cerenkov"; + case kScintillation: + return "Scintillation"; + case kAbsorption: + return "OpAbsorption"; + case kRayleigh: + return "OpRayleigh"; + case kMieHG: + return "OpMieHG"; + case kBoundary: + return "OpBoundary"; + case kWLS: + return "OpWLS"; + case kWLS2: + return "OpWLS2"; + default: + return "NoProcess"; } } class G4OpticalParameters { -public: - + public: static G4OpticalParameters* Instance(); ~G4OpticalParameters(); @@ -104,7 +113,7 @@ public: // printing void StreamInfo(std::ostream& os) const; void Dump() const; - friend std::ostream& operator<< (std::ostream& os, const G4OpticalParameters&); + friend std::ostream& operator<<(std::ostream& os, const G4OpticalParameters&); void SetVerboseLevel(G4int); G4int GetVerboseLevel() const; @@ -113,88 +122,84 @@ public: G4bool GetProcessActivation(const G4String&) const; // Cerenkov - void SetCerenkovMaxPhotonsPerStep(G4int); - G4int GetCerenkovMaxPhotonsPerStep() const; - void SetCerenkovVerboseLevel(G4int); - G4int GetCerenkovVerboseLevel() const; + void SetCerenkovMaxPhotonsPerStep(G4int); + G4int GetCerenkovMaxPhotonsPerStep() const; + void SetCerenkovVerboseLevel(G4int); + G4int GetCerenkovVerboseLevel() const; void SetCerenkovMaxBetaChange(G4double); G4double GetCerenkovMaxBetaChange() const; - void SetCerenkovTrackSecondariesFirst(G4bool); - G4bool GetCerenkovTrackSecondariesFirst() const; - void SetCerenkovStackPhotons(G4bool); - G4bool GetCerenkovStackPhotons() const; + void SetCerenkovTrackSecondariesFirst(G4bool); + G4bool GetCerenkovTrackSecondariesFirst() const; + void SetCerenkovStackPhotons(G4bool); + G4bool GetCerenkovStackPhotons() const; // Scintillation - void SetScintYieldFactor(G4double); - G4double GetScintYieldFactor() const; - void SetScintExcitationRatio(G4double); - G4double GetScintExcitationRatio() const; - void SetScintByParticleType(G4bool); - G4bool GetScintByParticleType() const; - void SetScintTrackInfo(G4bool); - G4bool GetScintTrackInfo() const; - void SetScintTrackSecondariesFirst(G4bool); - G4bool GetScintTrackSecondariesFirst() const; - void SetScintFiniteRiseTime(G4bool); - G4bool GetScintFiniteRiseTime() const; - void SetScintStackPhotons(G4bool); - G4bool GetScintStackPhotons() const; - void SetScintVerboseLevel(G4int); - G4int GetScintVerboseLevel() const; - void SetScintEnhancedTimeConstants(G4bool); - G4bool GetScintEnhancedTimeConstants() const; + void SetScintByParticleType(G4bool); + G4bool GetScintByParticleType() const; + void SetScintTrackInfo(G4bool); + G4bool GetScintTrackInfo() const; + void SetScintTrackSecondariesFirst(G4bool); + G4bool GetScintTrackSecondariesFirst() const; + void SetScintFiniteRiseTime(G4bool); + G4bool GetScintFiniteRiseTime() const; + void SetScintStackPhotons(G4bool); + G4bool GetScintStackPhotons() const; + void SetScintVerboseLevel(G4int); + G4int GetScintVerboseLevel() const; + void SetScintEnhancedTimeConstants(G4bool); + G4bool GetScintEnhancedTimeConstants() const; // WLS void SetWLSTimeProfile(const G4String&); G4String GetWLSTimeProfile() const; - void SetWLSVerboseLevel(G4int); - G4int GetWLSVerboseLevel() const; + void SetWLSVerboseLevel(G4int); + G4int GetWLSVerboseLevel() const; // WLS2 void SetWLS2TimeProfile(const G4String&); G4String GetWLS2TimeProfile() const; - void SetWLS2VerboseLevel(G4int); - G4int GetWLS2VerboseLevel() const; + void SetWLS2VerboseLevel(G4int); + G4int GetWLS2VerboseLevel() const; // boundary - void SetBoundaryVerboseLevel(G4int); - G4int GetBoundaryVerboseLevel() const; + void SetBoundaryVerboseLevel(G4int); + G4int GetBoundaryVerboseLevel() const; void SetBoundaryInvokeSD(G4bool); G4bool GetBoundaryInvokeSD() const; // absorption - void SetAbsorptionVerboseLevel(G4int); - G4int GetAbsorptionVerboseLevel() const; + void SetAbsorptionVerboseLevel(G4int); + G4int GetAbsorptionVerboseLevel() const; // rayleigh - void SetRayleighVerboseLevel(G4int); - G4int GetRayleighVerboseLevel() const; + void SetRayleighVerboseLevel(G4int); + G4int GetRayleighVerboseLevel() const; // mie - void SetMieVerboseLevel(G4int); - G4int GetMieVerboseLevel() const; - -private: + void SetMieVerboseLevel(G4int); + G4int GetMieVerboseLevel() const; + private: G4OpticalParameters(); void Initialise(); G4bool IsLocked() const; void PrintWarning(G4ExceptionDescription& ed) const; + static G4OpticalParameters* theInstance; G4OpticalParametersMessenger* theMessenger; - G4StateManager* fStateManager; + G4StateManager* fStateManager; G4int verboseLevel; // Whether to activate each process - std::map processActivation; + std::map processActivation; // cerenkov///////////////// - G4bool cerenkovStackPhotons; - G4bool cerenkovTrackSecondariesFirst; - G4int cerenkovVerboseLevel; - G4int cerenkovMaxPhotons; + G4bool cerenkovStackPhotons; + G4bool cerenkovTrackSecondariesFirst; + G4int cerenkovVerboseLevel; + G4int cerenkovMaxPhotons; G4double cerenkovMaxBetaChange; // scintillation ///////////////// @@ -202,45 +207,44 @@ private: /// option to set a finite rise-time; Note: the G4Scintillation /// process expects the user to have set the constant material /// property SCINTILLATIONRISETIME{1,2,3} - G4bool scintFiniteRiseTime; + G4bool scintFiniteRiseTime; /// option to allow for the light yield to be a function of /// particle type and deposited energy in case of non-linear /// light emission in scintillators - G4bool scintByParticleType; + G4bool scintByParticleType; /// option to allow for G4ScintillationTrackInformation /// to be attached to a scintillation photon's track - G4bool scintTrackInfo; + G4bool scintTrackInfo; /// option to allow stacking of secondary Scintillation photons - G4bool scintStackPhotons; + G4bool scintStackPhotons; - G4int scintVerboseLevel; - G4bool scintTrackSecondariesFirst; + G4int scintVerboseLevel; + G4bool scintTrackSecondariesFirst; ///////////////// WLS G4String wlsTimeProfileName; - G4int wlsVerboseLevel; + G4int wlsVerboseLevel; ///////////////// WLS2 G4String wls2TimeProfileName; - G4int wls2VerboseLevel; + G4int wls2VerboseLevel; //////////////// absorption - G4int absorptionVerboseLevel; + G4int absorptionVerboseLevel; //////////////// rayleigh - G4int rayleighVerboseLevel; + G4int rayleighVerboseLevel; - //////////////// mie - G4int mieVerboseLevel; + //////////////// mie + G4int mieVerboseLevel; //////////////// boundary /// G4OpBoundaryProcess to call InvokeSD method - G4bool boundaryInvokeSD; - G4int boundaryVerboseLevel; - + G4bool boundaryInvokeSD; + G4int boundaryVerboseLevel; #ifdef G4MULTITHREADED static G4Mutex opticalParametersMutex; diff --git a/source/processes/electromagnetic/utils/include/G4OpticalParametersMessenger.hh b/source/processes/electromagnetic/utils/include/G4OpticalParametersMessenger.hh index 3eda6a903a..258114464f 100644 --- a/source/processes/electromagnetic/utils/include/G4OpticalParametersMessenger.hh +++ b/source/processes/electromagnetic/utils/include/G4OpticalParametersMessenger.hh @@ -58,97 +58,97 @@ class G4UIcommand; // Messenger class that defines commands for the optical physics -class G4OpticalParametersMessenger: public G4UImessenger +class G4OpticalParametersMessenger : public G4UImessenger { - public: + public: + G4OpticalParametersMessenger(G4OpticalParameters*); + virtual ~G4OpticalParametersMessenger(); - G4OpticalParametersMessenger(G4OpticalParameters*); - virtual ~G4OpticalParametersMessenger(); - - // methods - virtual void SetNewValue(G4UIcommand*, G4String); - -private: + // methods + virtual void SetNewValue(G4UIcommand*, G4String); + private: G4OpticalParametersMessenger() = delete; - G4OpticalParametersMessenger(const G4OpticalParametersMessenger& right) = delete; - G4OpticalParametersMessenger& operator=(const G4OpticalParametersMessenger& right) = delete; + G4OpticalParametersMessenger(const G4OpticalParametersMessenger& right) = + delete; + G4OpticalParametersMessenger& operator=( + const G4OpticalParametersMessenger& right) = delete; // data members /// associated class - G4OpticalParameters* params; + G4OpticalParameters* params; /// command directory - G4UIdirectory* fDir; - G4UIdirectory* fCerenkovDir; - G4UIdirectory* fScintDir; - G4UIdirectory* fWlsDir; - G4UIdirectory* fWls2Dir; - G4UIdirectory* fBoundaryDir; - G4UIdirectory* fMieDir; - G4UIdirectory* fAbsDir; - G4UIdirectory* fRaylDir; + G4UIdirectory* fDir; + G4UIdirectory* fCerenkovDir; + G4UIdirectory* fScintDir; + G4UIdirectory* fWlsDir; + G4UIdirectory* fWls2Dir; + G4UIdirectory* fBoundaryDir; + G4UIdirectory* fMieDir; + G4UIdirectory* fAbsDir; + G4UIdirectory* fRaylDir; /// selectOpProcess command - G4UIcommand* fActivateProcessCmd; + G4UIcommand* fActivateProcessCmd; /// setProcessVerbose command - G4UIcmdWithAnInteger* fVerboseCmd; + G4UIcmdWithAnInteger* fVerboseCmd; // Cerenkov // setCerenkovMaxPhotons command - G4UIcmdWithAnInteger* fCerenkovMaxPhotonsCmd; + G4UIcmdWithAnInteger* fCerenkovMaxPhotonsCmd; /// setCerenkovMaxBetaChange command - G4UIcmdWithADouble* fCerenkovMaxBetaChangeCmd; + G4UIcmdWithADouble* fCerenkovMaxBetaChangeCmd; /// setStackPhotons command - G4UIcmdWithABool* fCerenkovStackPhotonsCmd; + G4UIcmdWithABool* fCerenkovStackPhotonsCmd; - G4UIcmdWithABool* fCerenkovTrackSecondariesFirstCmd; - G4UIcmdWithAnInteger* fCerenkovVerboseLevelCmd; + G4UIcmdWithABool* fCerenkovTrackSecondariesFirstCmd; + G4UIcmdWithAnInteger* fCerenkovVerboseLevelCmd; // Scintillation /// setScintillationByParticleType command - G4UIcmdWithABool* fScintByParticleTypeCmd; + G4UIcmdWithABool* fScintByParticleTypeCmd; /// setScintillationTrackInfo command - G4UIcmdWithABool* fScintTrackInfoCmd; + G4UIcmdWithABool* fScintTrackInfoCmd; /// setStackPhotons command - G4UIcmdWithABool* fScintStackPhotonsCmd; + G4UIcmdWithABool* fScintStackPhotonsCmd; - G4UIcmdWithABool* fScintTrackSecondariesFirstCmd; + G4UIcmdWithABool* fScintTrackSecondariesFirstCmd; /// setFiniteRiseTime command - G4UIcmdWithABool* fScintFiniteRiseTimeCmd; + G4UIcmdWithABool* fScintFiniteRiseTimeCmd; - G4UIcmdWithAnInteger* fScintVerboseLevelCmd; + G4UIcmdWithAnInteger* fScintVerboseLevelCmd; // WLS /// setWLSTimeProfile command - G4UIcmdWithAString* fWLSTimeProfileCmd; - G4UIcmdWithAnInteger* fWLSVerboseLevelCmd; + G4UIcmdWithAString* fWLSTimeProfileCmd; + G4UIcmdWithAnInteger* fWLSVerboseLevelCmd; // WLS2 /// setWLS2TimeProfile command - G4UIcmdWithAString* fWLS2TimeProfileCmd; - G4UIcmdWithAnInteger* fWLS2VerboseLevelCmd; - + G4UIcmdWithAString* fWLS2TimeProfileCmd; + G4UIcmdWithAnInteger* fWLS2VerboseLevelCmd; + /// setInvokeSD command - G4UIcmdWithABool* fBoundaryInvokeSDCmd; - G4UIcmdWithAnInteger* fBoundaryVerboseLevelCmd; + G4UIcmdWithABool* fBoundaryInvokeSDCmd; + G4UIcmdWithAnInteger* fBoundaryVerboseLevelCmd; - G4UIcmdWithAnInteger* fAbsorptionVerboseLevelCmd; - G4UIcmdWithAnInteger* fRayleighVerboseLevelCmd; - G4UIcmdWithAnInteger* fMieVerboseLevelCmd; + G4UIcmdWithAnInteger* fAbsorptionVerboseLevelCmd; + G4UIcmdWithAnInteger* fRayleighVerboseLevelCmd; + G4UIcmdWithAnInteger* fMieVerboseLevelCmd; - G4UIcommand* fDumpCmd; + G4UIcommand* fDumpCmd; }; -#endif // G4OpticalParametersMessenger_h +#endif // G4OpticalParametersMessenger_h diff --git a/source/processes/electromagnetic/utils/include/G4VAtomDeexcitation.hh b/source/processes/electromagnetic/utils/include/G4VAtomDeexcitation.hh index ebb67b64d0..e0b0e9352e 100644 --- a/source/processes/electromagnetic/utils/include/G4VAtomDeexcitation.hh +++ b/source/processes/electromagnetic/utils/include/G4VAtomDeexcitation.hh @@ -126,8 +126,8 @@ public: // generation of deexcitation for given atom and shell vacancy // and material cut couple, which defines cut values void GenerateParticles(std::vector* secVect, - const G4AtomicShell*, - G4int Z, G4int coupleIndex); + const G4AtomicShell*, + G4int Z, G4int coupleIndex); // generation of deexcitation for given atom and shell vacancy virtual void GenerateParticles(std::vector* secVect, @@ -190,9 +190,6 @@ private: G4String name; - static G4int pixeIDg; - static G4int pixeIDe; - #ifdef G4MULTITHREADED static G4Mutex atomDeexcitationMutex; #endif diff --git a/source/processes/electromagnetic/utils/include/G4VEmFluctuationModel.hh b/source/processes/electromagnetic/utils/include/G4VEmFluctuationModel.hh index 69b68a05d7..2a49bbcc54 100644 --- a/source/processes/electromagnetic/utils/include/G4VEmFluctuationModel.hh +++ b/source/processes/electromagnetic/utils/include/G4VEmFluctuationModel.hh @@ -79,14 +79,16 @@ public: virtual G4double SampleFluctuations(const G4MaterialCutsCouple*, const G4DynamicParticle*, - G4double tmax, - G4double length, - G4double meanLoss) = 0; + const G4double tcut, + const G4double tmax, + const G4double length, + const G4double meanLoss) = 0; virtual G4double Dispersion(const G4Material*, const G4DynamicParticle*, - G4double tmax, - G4double length) = 0; + const G4double tcut, + const G4double tmax, + const G4double length) = 0; //------------------------------------------------------------------------ // Methods with standard implementation; may be overwritten if needed diff --git a/source/processes/electromagnetic/utils/include/G4VEmModel.hh b/source/processes/electromagnetic/utils/include/G4VEmModel.hh index e82f0ad40d..eae93d6a32 100644 --- a/source/processes/electromagnetic/utils/include/G4VEmModel.hh +++ b/source/processes/electromagnetic/utils/include/G4VEmModel.hh @@ -218,6 +218,10 @@ public: // add a region for the model virtual void DefineForRegion(const G4Region*); + // fill number of different type of secondaries after SampleSecondaries(...) + virtual void FillNumberOfSecondaries(G4int& numberOfTriplets, + G4int& numberOfRecoil); + // for automatic documentation virtual void ModelDescription(std::ostream& outFile) const; @@ -424,38 +428,39 @@ protected: const std::vector* theDensityFactor = nullptr; const std::vector* theDensityIdx = nullptr; - G4double inveplus; - G4double pFactor = 1.0; + G4double inveplus; + G4double pFactor = 1.0; private: - G4double lowLimit; - G4double highLimit; - G4double eMinActive = 0.0; - G4double eMaxActive = DBL_MAX; - G4double secondaryThreshold = DBL_MAX; - G4double polarAngleLimit; + G4double lowLimit; + G4double highLimit; + G4double eMinActive = 0.0; + G4double eMaxActive = DBL_MAX; + G4double secondaryThreshold = DBL_MAX; + G4double polarAngleLimit; - G4int nSelectors = 0; - G4int nsec = 5; + G4int nSelectors = 0; + G4int nsec = 5; protected: - size_t idxTable = 0; - G4bool lossFlucFlag = true; + size_t currentCoupleIndex = 0; + size_t basedCoupleIndex = 0; + G4bool lossFlucFlag = true; private: - G4bool theLPMflag = false; - G4bool flagDeexcitation = false; - G4bool flagForceBuildTable = false; - G4bool isMaster = true; + G4bool theLPMflag = false; + G4bool flagDeexcitation = false; + G4bool flagForceBuildTable = false; + G4bool isMaster = true; - G4bool localTable = true; - G4bool localElmSelectors = true; - G4bool useAngularGenerator = false; - G4bool useBaseMaterials = true; - G4bool isLocked = false; + G4bool localTable = true; + G4bool localElmSelectors = true; + G4bool useAngularGenerator = false; + G4bool useBaseMaterials = false; + G4bool isLocked = false; const G4String name; std::vector xsec; @@ -468,11 +473,14 @@ inline void G4VEmModel::SetCurrentCouple(const G4MaterialCutsCouple* ptr) { if(fCurrentCouple != ptr) { fCurrentCouple = ptr; + basedCoupleIndex = currentCoupleIndex = ptr->GetIndex(); pBaseMaterial = ptr->GetMaterial(); pFactor = 1.0; - if(useBaseMaterials && nullptr != pBaseMaterial->GetBaseMaterial()) { - pBaseMaterial = pBaseMaterial->GetBaseMaterial(); - pFactor = (*theDensityFactor)[(*theDensityIdx)[ptr->GetIndex()]]; + if(useBaseMaterials) { + basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex]; + if(nullptr != pBaseMaterial->GetBaseMaterial()) + pBaseMaterial = pBaseMaterial->GetBaseMaterial(); + pFactor = (*theDensityFactor)[currentCoupleIndex]; } } } diff --git a/source/processes/electromagnetic/utils/include/G4VEmProcess.hh b/source/processes/electromagnetic/utils/include/G4VEmProcess.hh index d943423f1b..6a360eb0d6 100644 --- a/source/processes/electromagnetic/utils/include/G4VEmProcess.hh +++ b/source/processes/electromagnetic/utils/include/G4VEmProcess.hh @@ -57,9 +57,10 @@ #include "G4UnitsTable.hh" #include "G4ParticleDefinition.hh" #include "G4ParticleChangeForGamma.hh" -#include "G4EmDataHandler.hh" #include "G4EmParameters.hh" +#include "G4EmDataHandler.hh" #include "G4EmTableType.hh" +#include "G4EmSecondaryParticleType.hh" class G4Step; class G4VEmModel; @@ -154,8 +155,8 @@ public: // It returns the cross section of the process per atom G4double ComputeCrossSectionPerAtom(G4double kineticEnergy, - G4double Z, G4double A=0., - G4double cut=0.0); + G4double Z, G4double A=0., + G4double cut=0.0); G4double MeanFreePath(const G4Track& track); @@ -241,7 +242,7 @@ public: G4bool flag = true); void ActivateSecondaryBiasing(const G4String& region, G4double factor, - G4double energyLimit); + G4double energyLimit); inline void SetEmMasterProcess(const G4VEmProcess*); @@ -251,6 +252,8 @@ public: inline void CurrentSetup(const G4MaterialCutsCouple*, G4double energy); + inline G4bool UseBaseMaterial() const; + // hide copy constructor and assignment operator G4VEmProcess(G4VEmProcess &) = delete; G4VEmProcess & operator=(const G4VEmProcess &right) = delete; @@ -262,8 +265,8 @@ public: protected: G4double GetMeanFreePath(const G4Track& track, - G4double previousStepSize, - G4ForceCondition* condition) override; + G4double previousStepSize, + G4ForceCondition* condition) override; G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*); @@ -307,6 +310,11 @@ protected: inline const G4Isotope* GetTargetIsotope() const; + // these two methods assume that vectors are initilized + // and idx is within vector length + inline G4int DensityIndex(G4int idx) const; + inline G4double DensityFactor(G4int idx) const; + private: void Clear(); @@ -369,11 +377,12 @@ protected: const G4Material* currentMaterial = nullptr; G4EmBiasingManager* biasManager = nullptr; std::vector* theEnergyOfCrossSectionMax = nullptr; - const std::vector* theDensityFactor = nullptr; - const std::vector* theDensityIdx = nullptr; private: + const std::vector* theDensityFactor = nullptr; + const std::vector* theDensityIdx = nullptr; + // ======== parameters ========= G4double minKinEnergy; G4double maxKinEnergy; @@ -402,18 +411,19 @@ private: protected: - G4int mainSecondaries = 100; - G4int secID = -1; - G4int fluoID = -1; - G4int augerID = -1; - G4int biasID = -1; - + G4int mainSecondaries = 1; + G4int secID = _EM; + G4int fluoID = _Fluorescence; + G4int augerID = _AugerElectron; + G4int biasID = _EM; + G4int tripletID = _TripletElectron; size_t currentCoupleIndex = 0; size_t basedCoupleIndex = 0; size_t coupleIdxLambda = 0; size_t idxLambda = 0; G4bool isTheMaster = true; + G4bool baseMat = false; private: @@ -481,14 +491,17 @@ inline G4double G4VEmProcess::GetElectronEnergyCut() inline void G4VEmProcess::DefineMaterial(const G4MaterialCutsCouple* couple) { if(couple != currentCouple) { - currentCouple = couple; - currentMaterial = couple->GetMaterial(); - baseMaterial = (currentMaterial->GetBaseMaterial()) - ? currentMaterial->GetBaseMaterial() : currentMaterial; - currentCoupleIndex = couple->GetIndex(); - basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex]; - fFactor = biasFactor*(*theDensityFactor)[currentCoupleIndex]; + currentCouple = couple; + baseMaterial = currentMaterial = couple->GetMaterial(); + basedCoupleIndex = currentCoupleIndex = couple->GetIndex(); + fFactor = biasFactor; mfpKinEnergy = DBL_MAX; + if(baseMat) { + basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex]; + if(nullptr != currentMaterial->GetBaseMaterial()) + baseMaterial = currentMaterial->GetBaseMaterial(); + fFactor *= (*theDensityFactor)[currentCoupleIndex]; + } } } @@ -557,7 +570,7 @@ inline G4double G4VEmProcess::GetCurrentLambda(G4double e) fLambdaEnergy = e; if(e >= minKinEnergyPrim) { fLambda = GetLambdaFromTablePrim(e); } else if(nullptr != theLambdaTable) { fLambda = GetLambdaFromTable(e); } - else if(nullptr != currentModel) { fLambda = ComputeCurrentLambda(e); } + else { fLambda = ComputeCurrentLambda(e); } fLambda *= fFactor; } return fLambda; @@ -572,7 +585,7 @@ inline G4double G4VEmProcess::GetCurrentLambda(G4double e, G4double loge) fLambdaEnergy = e; if(e >= minKinEnergyPrim) { fLambda = GetLambdaFromTablePrim(e, loge); } else if(nullptr != theLambdaTable) { fLambda = GetLambdaFromTable(e, loge); } - else if(nullptr != currentModel) { fLambda = ComputeCurrentLambda(e); } + else { fLambda = ComputeCurrentLambda(e); } fLambda *= fFactor; } return fLambda; @@ -631,13 +644,6 @@ inline G4double G4VEmProcess::MaxKinEnergy() const //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -inline G4double G4VEmProcess::PolarAngleLimit() const -{ - return theParameters->MscThetaLimit(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - inline G4double G4VEmProcess::CrossSectionBiasingFactor() const { return biasFactor; @@ -751,6 +757,27 @@ inline const G4Isotope* G4VEmProcess::GetTargetIsotope() const //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +inline G4int G4VEmProcess::DensityIndex(G4int idx) const +{ + return (*theDensityIdx)[idx]; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4double G4VEmProcess::DensityFactor(G4int idx) const +{ + return (*theDensityFactor)[idx]; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4bool G4VEmProcess::UseBaseMaterial() const +{ + return baseMat; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + inline const G4VEmModel* G4VEmProcess::GetCurrentModel() const { return currentModel; diff --git a/source/processes/electromagnetic/utils/include/G4VEnergyLossProcess.hh b/source/processes/electromagnetic/utils/include/G4VEnergyLossProcess.hh index 7cd5ee6e50..e22580bd43 100644 --- a/source/processes/electromagnetic/utils/include/G4VEnergyLossProcess.hh +++ b/source/processes/electromagnetic/utils/include/G4VEnergyLossProcess.hh @@ -59,6 +59,7 @@ #include "G4EmModelManager.hh" #include "G4ParticleChangeForLoss.hh" #include "G4EmTableType.hh" +#include "G4EmSecondaryParticleType.hh" #include "G4PhysicsTable.hh" #include "G4PhysicsVector.hh" @@ -153,15 +154,15 @@ public: // Store all PhysicsTable in files. // Return false in case of any fatal failure at I/O G4bool StorePhysicsTable(const G4ParticleDefinition*, - const G4String& directory, - G4bool ascii = false) override; + const G4String& directory, + G4bool ascii = false) override; // Retrieve all Physics from a files. // Return true if all the Physics Table are built. // Return false if any fatal failure. G4bool RetrievePhysicsTable(const G4ParticleDefinition*, - const G4String& directory, - G4bool ascii) override; + const G4String& directory, + G4bool ascii) override; private: @@ -196,7 +197,7 @@ public: // Access to cross section table G4double CrossSectionPerVolume(G4double kineticEnergy, - const G4MaterialCutsCouple* couple); + const G4MaterialCutsCouple* couple); G4double CrossSectionPerVolume(G4double kineticEnergy, const G4MaterialCutsCouple* couple, G4double logKineticEnergy); @@ -214,17 +215,18 @@ protected: // implementation of the pure virtual method G4double GetMeanFreePath(const G4Track& track, - G4double previousStepSize, - G4ForceCondition* condition) override; + G4double previousStepSize, + G4ForceCondition* condition) override; // implementation of the pure virtual method G4double GetContinuousStepLimit(const G4Track& track, - G4double previousStepSize, - G4double currentMinimumStep, - G4double& currentSafety) override; + G4double previousStepSize, + G4double currentMinimumStep, + G4double& currentSafety) override; // creation of an empty vector for cross sections for derived processes - G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*, G4double cut); + G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*, + G4double cut); inline size_t CurrentMaterialCutsCoupleIndex() const; @@ -379,6 +381,8 @@ public: inline G4PhysicsTable* LambdaTable() const; inline std::vector* TwoPeaksXS() const; + inline G4bool UseBaseMaterial() const; + //------------------------------------------------------------------------ // Run time method for simulation of ionisation //------------------------------------------------------------------------ @@ -408,15 +412,18 @@ private: inline G4double GetScaledRangeForScaledEnergy(G4double scaledKinE); inline G4double GetScaledRangeForScaledEnergy(G4double scaledKinE, G4double logScaledKinE); + inline G4double GetLimitScaledRangeForScaledEnergy(G4double scaledKinE); inline G4double GetLimitScaledRangeForScaledEnergy(G4double scaledKinE, - G4double logScaledKinE); + G4double logScaledKinE); + inline G4double ScaledKinEnergyForLoss(G4double range); inline G4double GetLambdaForScaledEnergy(G4double scaledKinE); inline G4double GetLambdaForScaledEnergy(G4double scaledKinE, G4double logScaledKinE); - void ComputeLambdaForScaledEnergy(G4double scaledKinE, G4double logScaledKinE); + void ComputeLambdaForScaledEnergy(G4double scaledKinE, + G4double logScaledKinE); G4bool IsRegionForCubcutProcessor(const G4Track& aTrack); @@ -495,47 +502,50 @@ protected: G4double preStepLogScaledEnergy = LOG_EKIN_MIN; G4double mfpKinEnergy = 0.0; - size_t currentCoupleIndex = 0; + size_t currentCoupleIndex = 0; private: - G4int nBins; - G4int nBinsCSDA; - G4int numberOfModels = 0; - G4int nSCoffRegions = 0; + G4int nBins; + G4int nBinsCSDA; + G4int numberOfModels = 0; + G4int nSCoffRegions = 0; + G4int secID = _DeltaElectron; + G4int tripletID = _TripletElectron; + G4int biasID = _DeltaEBelowCut; + G4int mainSecondaries = 1; - size_t basedCoupleIndex = 0; - size_t coupleIdxRange = 0; - size_t coupleIdxLambda = 0; - size_t idxDEDX = 0; - size_t idxDEDXunRestricted = 0; - size_t idxIonisation = 0; - size_t idxRange = 0; - size_t idxCSDA = 0; - size_t idxSecRange = 0; - size_t idxInverseRange = 0; - size_t idxLambda = 0; - G4int secID = -1; - G4int biasID = -1; + size_t basedCoupleIndex = 0; + size_t coupleIdxRange = 0; + size_t coupleIdxLambda = 0; + size_t idxDEDX = 0; + size_t idxDEDXunRestricted = 0; + size_t idxIonisation = 0; + size_t idxRange = 0; + size_t idxCSDA = 0; + size_t idxSecRange = 0; + size_t idxInverseRange = 0; + size_t idxLambda = 0; G4GPILSelection aGPILSelection; G4CrossSectionType fXSType = fEmIncreasing; - G4bool lossFluctuationFlag = true; - G4bool rndmStepFlag = false; - G4bool tablesAreBuilt = false; - G4bool spline = true; - G4bool isIon = false; - G4bool isIonisation = true; - G4bool useDeexcitation = false; - G4bool biasFlag = false; - G4bool weightFlag = false; - G4bool isMaster = true; - G4bool actLinLossLimit = false; - G4bool actLossFluc = false; - G4bool actBinning = false; - G4bool actMinKinEnergy = false; - G4bool actMaxKinEnergy = false; + G4bool lossFluctuationFlag = true; + G4bool rndmStepFlag = false; + G4bool tablesAreBuilt = false; + G4bool spline = true; + G4bool isIon = false; + G4bool isIonisation = true; + G4bool useDeexcitation = false; + G4bool biasFlag = false; + G4bool weightFlag = false; + G4bool isMaster = true; + G4bool baseMat = false; + G4bool actLinLossLimit = false; + G4bool actLossFluc = false; + G4bool actBinning = false; + G4bool actMinKinEnergy = false; + G4bool actMaxKinEnergy = false; std::vector secParticles; std::vector scTracks; @@ -573,12 +583,15 @@ G4VEnergyLossProcess::DefineMaterial(const G4MaterialCutsCouple* couple) if(couple != currentCouple) { currentCouple = couple; currentMaterial = couple->GetMaterial(); - currentCoupleIndex = couple->GetIndex(); - basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex]; - fFactor = chargeSqRatio*biasFactor*(*theDensityFactor)[currentCoupleIndex]; - reduceFactor = 1.0/(fFactor*massRatio); + basedCoupleIndex = currentCoupleIndex = couple->GetIndex(); + fFactor = chargeSqRatio*biasFactor; mfpKinEnergy = DBL_MAX; idxLambda = 0; + if(baseMat) { + basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex]; + fFactor *= (*theDensityFactor)[currentCoupleIndex]; + } + reduceFactor = 1.0/(fFactor*massRatio); } } @@ -996,6 +1009,13 @@ inline G4PhysicsTable* G4VEnergyLossProcess::LambdaTable() const //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +inline G4bool G4VEnergyLossProcess::UseBaseMaterial() const +{ + return baseMat; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + inline std::vector* G4VEnergyLossProcess::TwoPeaksXS() const { return fXSpeaks; diff --git a/source/processes/electromagnetic/utils/include/G4VMscModel.hh b/source/processes/electromagnetic/utils/include/G4VMscModel.hh index 5b471768b6..2ef393094e 100644 --- a/source/processes/electromagnetic/utils/include/G4VMscModel.hh +++ b/source/processes/electromagnetic/utils/include/G4VMscModel.hh @@ -148,6 +148,7 @@ public: inline G4double GetDEDX(const G4ParticleDefinition* part, G4double kineticEnergy, const G4MaterialCutsCouple* couple); + inline G4double GetDEDX(const G4ParticleDefinition* part, G4double kineticEnergy, const G4MaterialCutsCouple* couple, @@ -156,6 +157,7 @@ public: inline G4double GetRange(const G4ParticleDefinition* part, G4double kineticEnergy, const G4MaterialCutsCouple* couple); + inline G4double GetRange(const G4ParticleDefinition* part, G4double kineticEnergy, const G4MaterialCutsCouple* couple, @@ -169,6 +171,7 @@ public: inline G4double GetTransportMeanFreePath(const G4ParticleDefinition* part, G4double kinEnergy); + inline G4double GetTransportMeanFreePath(const G4ParticleDefinition* part, G4double kinEnergy, @@ -301,7 +304,7 @@ G4VMscModel::GetDEDX(const G4ParticleDefinition* part, G4double kinEnergy, const G4MaterialCutsCouple* couple) { G4double x; - if (ionisation) { + if (nullptr != ionisation) { x = ionisation->GetDEDX(kinEnergy, couple); } else { const G4double q = part->GetPDGCharge()*inveplus; @@ -317,7 +320,7 @@ G4VMscModel::GetDEDX(const G4ParticleDefinition* part, G4double kinEnergy, const G4MaterialCutsCouple* couple, G4double logKinEnergy) { G4double x; - if (ionisation) { + if (nullptr != ionisation) { x = ionisation->GetDEDX(kinEnergy, couple, logKinEnergy); } else { const G4double q = part->GetPDGCharge()*inveplus; @@ -329,14 +332,14 @@ G4VMscModel::GetDEDX(const G4ParticleDefinition* part, G4double kinEnergy, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... inline G4double -G4VMscModel::GetRange(const G4ParticleDefinition* part,G4double kinEnergy, +G4VMscModel::GetRange(const G4ParticleDefinition* part, G4double kinEnergy, const G4MaterialCutsCouple* couple) { //G4cout << "G4VMscModel::GetRange E(MeV)= " << kinEnergy << " " // << ionisation << " " << part->GetParticleName() // << G4endl; - localtkin = kinEnergy; - if (ionisation) { + localtkin = kinEnergy; + if (nullptr != ionisation) { localrange = ionisation->GetRange(kinEnergy, couple); } else { const G4double q = part->GetPDGCharge()*inveplus; @@ -355,8 +358,8 @@ G4VMscModel::GetRange(const G4ParticleDefinition* part,G4double kinEnergy, //G4cout << "G4VMscModel::GetRange E(MeV)= " << kinEnergy << " " // << ionisation << " " << part->GetParticleName() // << G4endl; - localtkin = kinEnergy; - if (ionisation) { + localtkin = kinEnergy; + if (nullptr != ionisation) { localrange = ionisation->GetRange(kinEnergy, couple, logKinEnergy); } else { const G4double q = part->GetPDGCharge()*inveplus; @@ -376,7 +379,7 @@ G4VMscModel::GetEnergy(const G4ParticleDefinition* part, //G4cout << "G4VMscModel::GetEnergy R(mm)= " << range << " " << ionisation // << " Rlocal(mm)= " << localrange << " Elocal(MeV)= " << localtkin // << G4endl; - if(ionisation) { e = ionisation->GetKineticEnergy(range, couple); } + if(nullptr != ionisation) { e = ionisation->GetKineticEnergy(range, couple); } else { e = localtkin; if(localrange > range) { @@ -410,12 +413,10 @@ G4VMscModel::GetTransportMeanFreePath(const G4ParticleDefinition* part, G4double ekin) { G4double x; - if (xSectionTable) { - const G4int idx = CurrentCouple()->GetIndex(); - x = (*xSectionTable)[idx]->Value(ekin, idxTable)/(ekin*ekin); + if (nullptr != xSectionTable) { + x = pFactor*(*xSectionTable)[basedCoupleIndex]->Value(ekin)/(ekin*ekin); } else { - x = CrossSectionPerVolume(CurrentCouple()->GetMaterial(), part, ekin, - 0.0, DBL_MAX); + x = pFactor*CrossSectionPerVolume(pBaseMaterial, part, ekin, 0.0, DBL_MAX); } return (x > 0.0) ? 1.0/x : DBL_MAX; } @@ -425,12 +426,10 @@ G4VMscModel::GetTransportMeanFreePath(const G4ParticleDefinition* part, G4double ekin, G4double logekin) { G4double x; - if (xSectionTable) { - const G4int idx = CurrentCouple()->GetIndex(); - x = (*xSectionTable)[idx]->LogVectorValue(ekin, logekin)/(ekin*ekin); + if (nullptr != xSectionTable) { + x = pFactor*(*xSectionTable)[basedCoupleIndex]->LogVectorValue(ekin, logekin)/(ekin*ekin); } else { - x = CrossSectionPerVolume(CurrentCouple()->GetMaterial(), part, ekin, - 0.0, DBL_MAX); + x = pFactor*CrossSectionPerVolume(pBaseMaterial, part, ekin, 0.0, DBL_MAX); } return (x > 0.0) ? 1.0/x : DBL_MAX; } @@ -438,4 +437,3 @@ G4VMscModel::GetTransportMeanFreePath(const G4ParticleDefinition* part, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - diff --git a/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh b/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh index acaed31add..0cd67c3bdd 100644 --- a/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh +++ b/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh @@ -207,6 +207,8 @@ public: inline G4double GeomFactor() const; inline G4double PolarAngleLimit() const; + + inline G4bool UseBaseMaterial() const; inline G4MscStepLimitType StepLimitType() const; inline void SetStepLimitType(G4MscStepLimitType val); @@ -250,7 +252,6 @@ private: G4SafetyHelper* safetyHelper = nullptr; const G4ParticleDefinition* firstParticle = nullptr; const G4ParticleDefinition* currParticle = nullptr; - // const G4ParticleDefinition* theGenericIon = nullptr; std::vector mscModels; @@ -284,6 +285,7 @@ private: G4bool isIon = false; G4bool fPositionChanged = false; G4bool isActive = false; + G4bool baseMat = false; }; // ======== Run time inline methods ================ @@ -390,4 +392,11 @@ G4VMultipleScattering::GetModelByIndex(G4int idx, G4bool ver) const //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +inline G4bool G4VMultipleScattering::UseBaseMaterial() const +{ + return baseMat; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + #endif diff --git a/source/processes/electromagnetic/utils/sources.cmake b/source/processes/electromagnetic/utils/sources.cmake index 7e4915dca0..8cbcb52227 100644 --- a/source/processes/electromagnetic/utils/sources.cmake +++ b/source/processes/electromagnetic/utils/sources.cmake @@ -25,10 +25,12 @@ geant4_add_module(G4emutils G4EmParametersMessenger.hh G4EmProcessSubType.hh G4EmSaturation.hh + G4EmSecondaryParticleType.hh G4EmTableType.hh G4EnergyLossTables.hh G4LossTableBuilder.hh G4LossTableManager.hh + G4LowEnergyEmProcessSubType.hh G4MscStepLimitType.hh G4NIELCalculator.hh G4NuclearFormfactorType.hh diff --git a/source/processes/electromagnetic/utils/src/G4EmCalculator.cc b/source/processes/electromagnetic/utils/src/G4EmCalculator.cc index 46b4954a05..f383537079 100644 --- a/source/processes/electromagnetic/utils/src/G4EmCalculator.cc +++ b/source/processes/electromagnetic/utils/src/G4EmCalculator.cc @@ -790,8 +790,7 @@ G4bool G4EmCalculator::UpdateParticle(const G4ParticleDefinition* p, && currentParticleName != "deuteron" && currentParticleName != "triton" && currentParticleName != "alpha+" - && currentParticleName != "helium" - && currentParticleName != "hydrogen" + && currentParticleName != "alpha" ) { isIon = true; massRatio = theGenericIon->GetPDGMass()/p->GetPDGMass(); @@ -1118,11 +1117,8 @@ G4VEnergyLossProcess* G4EmCalculator::FindEnergyLossProcess( if(p->GetParticleType() == "nucleus" && currentParticleName != "deuteron" && currentParticleName != "triton" - && currentParticleName != "He3" && currentParticleName != "alpha" && currentParticleName != "alpha+" - && currentParticleName != "helium" - && currentParticleName != "hydrogen" ) { part = theGenericIon; } elp = manager->GetEnergyLossProcess(part); diff --git a/source/processes/electromagnetic/utils/src/G4EmCorrections.cc b/source/processes/electromagnetic/utils/src/G4EmCorrections.cc index 6508145fb2..69ca80d8f2 100644 --- a/source/processes/electromagnetic/utils/src/G4EmCorrections.cc +++ b/source/processes/electromagnetic/utils/src/G4EmCorrections.cc @@ -113,10 +113,10 @@ G4Mutex G4EmCorrections::theCorrMutex = G4MUTEX_INITIALIZER; G4EmCorrections::G4EmCorrections(G4int verb) { - verbose = verb; - eth = 2.0*CLHEP::MeV; - eCorrMin = 25.*CLHEP::keV; - eCorrMax = 250.*CLHEP::MeV; + verbose = verb; + eth = 2.0*CLHEP::MeV; + eCorrMin = 25.*CLHEP::keV; + eCorrMax = 1.*CLHEP::GeV; ionTable = G4ParticleTable::GetParticleTable()->GetIonTable(); g4calc = G4Pow::GetInstance(); @@ -776,7 +776,7 @@ G4EmCorrections::EffectiveChargeCorrection(const G4ParticleDefinition* p, G4cout << "G4EmCorrections::EffectiveChargeCorrection: Zion= " << currentZ << " Aion= " << p->GetPDGMass()/amu_c2 << G4endl; } - massFactor = proton_mass_c2/p->GetPDGMass(); + massFactor = CLHEP::proton_mass_c2/p->GetPDGMass(); idx = -1; for(G4int i=0; iGetParticleName() << " in " << materialName[idx] << " Ion Z= " << Z << " A= " << A - << " massRatio= " << massRatio << G4endl; + << " massFactor= " << massFactor << G4endl; + G4cout << " Nbins=" << nbinCorr << " Emin(MeV)=" << eCorrMin + << " Emax(MeV)=" << eCorrMax << " ion: " + << ion->GetParticleName() << G4endl; } G4PhysicsLogVector* vv = - new G4PhysicsLogVector(eCorrMin,eCorrMax,nbinCorr,true); - G4double e, eion, dedx, dedx1; - G4double eth0 = v->Energy(0); - G4double escal = eth/massRatio; + new G4PhysicsLogVector(eCorrMin,eCorrMax,nbinCorr,false); + const G4double eth0 = v->Energy(0); + const G4double escal = eth/massFactor; G4double qe = - effCharge.EffectiveChargeSquareRatio(ion, curMaterial, escal); - G4double dedxt = - ionLEModel->ComputeDEDXPerVolume(curMaterial, p, eth, eth)*qe; - G4double dedx1t = - ionHEModel->ComputeDEDXPerVolume(curMaterial, p, eth, eth)*qe + effCharge.EffectiveChargeSquareRatio(curParticle, curMaterial, escal); + const G4double dedxt = + ionLEModel->ComputeDEDXPerVolume(curMaterial, gion, eth, eth)*qe; + const G4double dedx1t = + ionHEModel->ComputeDEDXPerVolume(curMaterial, gion, eth, eth)*qe + ComputeIonCorrections(curParticle, curMaterial, escal); - G4double rest = escal*(dedxt - dedx1t); - //G4cout << "Escal(MeV)= "<GetName() - // << G4endl; + /* + G4cout << "======== G4EmElementSelector for the " << model->GetName() + << G4endl; + for (G4int i=0; i<=nElmMinusOne; ++i) { + G4cout << "#### i=" << i << G4endl; + G4cout << (*xSections[i]) << G4endl; + } + */ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... -const G4Element* -G4EmElementSelector::SelectRandomAtom(const G4double e, const G4double loge) const +const G4Element* +G4EmElementSelector::SelectRandomAtom(const G4double e, + const G4double loge) const { const G4Element* element = (*theElementVector)[nElmMinusOne]; if (nElmMinusOne > 0) { // 1. Determine energy index (only once) - const size_t nBins = (xSections[0])->GetVectorLength(); // handle cases below/above the enrgy grid (by ekin, idx that gives a=0/1) // ekin = x[0] if e<=x[0] and idx will be 0 ^ a=0 => so y=y0 // ekin = x[N-1] if e>=x[N-1] and idx will be N-2 ^ a=1 => so y=y_{N-1} - const G4double ekin = std::max((xSections[0])->Energy(0), - std::min((xSections[0])->Energy(nBins-1),e)); - // compute the lower index of the bin (idx \in [0,N-2] will be guaranted) - const size_t idx = (xSections[0])->ComputeLogVectorBin(loge); - // 2. Do the linear interp.(robust for corner cases through ekin, idx and a) - const G4double x1 = (xSections[0])->Energy(idx); - const G4double x2 = (xSections[0])->Energy(idx+1); - // note: all corner cases of the previous methods are covered and eventually - // gives a=0/1 that results in y=y0\y_{N-1} if e<=x[0]/e>=x[N-1] or - // y=y_i/y_{i+1} if e=x[i+1] due to small numerical errors - - const G4double a = std::max(0., std::min(1., (ekin - x1)/(x2 - x1))); + G4double ekin = e; + std::size_t idx = 0; + if(e <= (xSections[0])->Energy(0)) { + ekin = (xSections[0])->Energy(0); + } else if(e < (xSections[0])->GetMaxEnergy()) { + idx = (xSections[0])->ComputeLogVectorBin(loge); + } else { + ekin = (xSections[0])->GetMaxEnergy(); + idx = (xSections[0])->GetVectorLength() - 2; + } + // 2. Do the linear interp.(corner cases are already excluded) + const G4double x1 = (xSections[0])->Energy(idx); + const G4double a = (ekin - x1)/((xSections[0])->Energy(idx+1) - x1); const G4double urnd = G4UniformRand(); for (G4int i = 0; i < nElmMinusOne; ++i) { const G4double y1 = (*xSections[i])[idx]; - const G4double y2 = (*xSections[i])[idx+1]; - if (urnd <= y1 + a*(y2-y1)) { + if (urnd <= y1 + a*((*xSections[i])[idx+1] - y1)) { element = (*theElementVector)[i]; break; } diff --git a/source/processes/electromagnetic/utils/src/G4EmLowEParameters.cc b/source/processes/electromagnetic/utils/src/G4EmLowEParameters.cc index bbf967ee5d..ad3e1282f2 100644 --- a/source/processes/electromagnetic/utils/src/G4EmLowEParameters.cc +++ b/source/processes/electromagnetic/utils/src/G4EmLowEParameters.cc @@ -69,6 +69,7 @@ void G4EmLowEParameters::Initialise() { fluo = false; beardenFluoDir = false; + fANSTOFluoDir = false; auger = false; pixe = false; deexIgnoreCut = false; @@ -105,6 +106,16 @@ G4bool G4EmLowEParameters::BeardenFluoDir() const return beardenFluoDir; } +void G4EmLowEParameters::SetANSTOFluoDir(G4bool val) +{ + fANSTOFluoDir = val; +} + +G4bool G4EmLowEParameters::ANSTOFluoDir() const +{ + return fANSTOFluoDir; +} + void G4EmLowEParameters::SetAuger(G4bool val) { auger = val; diff --git a/source/processes/electromagnetic/utils/src/G4EmLowEParametersMessenger.cc b/source/processes/electromagnetic/utils/src/G4EmLowEParametersMessenger.cc index 3be0275bd6..dde9791848 100644 --- a/source/processes/electromagnetic/utils/src/G4EmLowEParametersMessenger.cc +++ b/source/processes/electromagnetic/utils/src/G4EmLowEParametersMessenger.cc @@ -72,6 +72,13 @@ G4EmLowEParametersMessenger::G4EmLowEParametersMessenger(G4EmLowEParameters* ptr dirFluoCmd->AvailableForStates(G4State_PreInit,G4State_Init,G4State_Idle); dirFluoCmd->SetToBeBroadcasted(false); + dirFluoCmd1 = new G4UIcmdWithABool("/process/em/fluoANSTO",this); + dirFluoCmd1->SetGuidance("Enable/disable usage of ANSTO fluorescence files"); + dirFluoCmd1->SetParameterName("fluoANSTOFlag",true); + dirFluoCmd1->SetDefaultValue(false); + dirFluoCmd1->AvailableForStates(G4State_PreInit,G4State_Init,G4State_Idle); + dirFluoCmd1->SetToBeBroadcasted(false); + auCmd = new G4UIcmdWithABool("/process/em/auger",this); auCmd->SetGuidance("Enable/disable Auger electrons production"); auCmd->SetParameterName("augerFlag",true); @@ -124,7 +131,7 @@ G4EmLowEParametersMessenger::G4EmLowEParametersMessenger(G4EmLowEParameters* ptr pixeXsCmd = new G4UIcmdWithAString("/process/em/pixeXSmodel",this); pixeXsCmd->SetGuidance("The name of PIXE cross section"); pixeXsCmd->SetParameterName("pixeXS",true); - pixeXsCmd->SetCandidates("ECPSSR_Analytical Empirical ECPSSR_FormFactor"); + pixeXsCmd->SetCandidates("ECPSSR_Analytical Empirical ECPSSR_FormFactor ECPSSR_ANSTO"); pixeXsCmd->AvailableForStates(G4State_PreInit,G4State_Idle); pixeXsCmd->SetToBeBroadcasted(false); @@ -198,6 +205,7 @@ G4EmLowEParametersMessenger::~G4EmLowEParametersMessenger() { delete deCmd; delete dirFluoCmd; + delete dirFluoCmd1; delete auCmd; delete auCascadeCmd; delete pixeCmd; @@ -226,6 +234,9 @@ void G4EmLowEParametersMessenger::SetNewValue(G4UIcommand* command, } else if (command == dirFluoCmd) { theParameters->SetBeardenFluoDir(dirFluoCmd->GetNewBoolValue(newValue)); physicsModified = true; + } else if (command == dirFluoCmd1) { + theParameters->SetANSTOFluoDir(dirFluoCmd1->GetNewBoolValue(newValue)); + physicsModified = true; } else if (command == auCmd) { theParameters->SetAuger(auCmd->GetNewBoolValue(newValue)); physicsModified = true; diff --git a/source/processes/electromagnetic/utils/src/G4EmParameters.cc b/source/processes/electromagnetic/utils/src/G4EmParameters.cc index 4a27e17148..53703507a4 100644 --- a/source/processes/electromagnetic/utils/src/G4EmParameters.cc +++ b/source/processes/electromagnetic/utils/src/G4EmParameters.cc @@ -127,6 +127,7 @@ void G4EmParameters::Initialise() muhadLateralDisplacement = false; useAngGeneratorForIonisation = false; useMottCorrection = false; + integral = true; birks = false; fICRU90 = false; gener = false; @@ -135,6 +136,7 @@ void G4EmParameters::Initialise() fPolarisation = false; fMuDataFromFile = false; fDNA = false; + fIsPrinted = false; minKinEnergy = 0.1*CLHEP::keV; maxKinEnergy = 100.0*CLHEP::TeV; @@ -202,14 +204,6 @@ G4bool G4EmParameters::LPM() const return flagLPM; } -// are obsolete -void G4EmParameters::SetSpline(G4bool) -{} -G4bool G4EmParameters::Spline() const -{ - return true; -} - void G4EmParameters::SetUseCutAsFinalRange(G4bool val) { if(IsLocked()) { return; } @@ -254,6 +248,17 @@ G4bool G4EmParameters::BeardenFluoDir() const return fCParameters->BeardenFluoDir(); } +void G4EmParameters::SetANSTOFluoDir(G4bool val) +{ + if(IsLocked()) { return; } + fCParameters->SetANSTOFluoDir(val); +} + +G4bool G4EmParameters::ANSTOFluoDir() const +{ + return fCParameters->ANSTOFluoDir(); +} + void G4EmParameters::SetAuger(G4bool val) { if(IsLocked()) { return; } @@ -265,17 +270,6 @@ G4bool G4EmParameters::Auger() const return fCParameters->Auger(); } -// obsolete -void G4EmParameters::SetAugerCascade(G4bool val) -{ - SetAuger(val); -} - -G4bool G4EmParameters::AugerCascade() const -{ - return fCParameters->Auger(); -} - void G4EmParameters::SetPixe(G4bool val) { if(IsLocked()) { return; } @@ -353,6 +347,17 @@ G4bool G4EmParameters::UseMottCorrection() const return useMottCorrection; } +void G4EmParameters::SetIntegral(G4bool val) +{ + if(IsLocked()) { return; } + integral = val; +} + +G4bool G4EmParameters::Integral() const +{ + return integral; +} + void G4EmParameters::SetEnablePolarisation(G4bool val) { if(IsLocked()) { return; } @@ -482,6 +487,16 @@ void G4EmParameters::ActivateDNA() fDNA = true; } +void G4EmParameters::SetIsPrintedFlag(G4bool val) +{ + fIsPrinted = val; +} + +G4bool G4EmParameters::IsPrintLocked() const +{ + return fIsPrinted; +} + G4EmSaturation* G4EmParameters::GetEmSaturation() { if(nullptr == emSaturation) { @@ -1315,6 +1330,8 @@ void G4EmParameters::StreamInfo(std::ostream& os) const os << "Fluorescence enabled " <Fluo() << "\n"; os << "Fluorescence Bearden data files enabled " <BeardenFluoDir() << "\n"; + os << "Fluorescence ANSTO data files enabled " + <ANSTOFluoDir() << "\n"; os << "Auger electron cascade enabled " <Auger() << "\n"; os << "PIXE atomic de-excitation enabled " <Pixe() << "\n"; @@ -1342,8 +1359,10 @@ void G4EmParameters::StreamInfo(std::ostream& os) const os.precision(prec); } -void G4EmParameters::Dump() const +void G4EmParameters::Dump() { + if(fIsPrinted) return; + #ifdef G4MULTITHREADED G4MUTEXLOCK(&emParametersMutex); #endif diff --git a/source/processes/electromagnetic/utils/src/G4EmParametersMessenger.cc b/source/processes/electromagnetic/utils/src/G4EmParametersMessenger.cc index 9aa17c818b..cb66e4a11e 100644 --- a/source/processes/electromagnetic/utils/src/G4EmParametersMessenger.cc +++ b/source/processes/electromagnetic/utils/src/G4EmParametersMessenger.cc @@ -301,7 +301,7 @@ G4EmParametersMessenger::G4EmParametersMessenger(G4EmParameters* ptr) fgCmd->SetGuidance("Set GeomFactor parameter for msc processes"); fgCmd->SetParameterName("Fg",true); fgCmd->SetRange("Fg>0"); - fgCmd->SetDefaultValue(3.5); + fgCmd->SetDefaultValue(2.5); fgCmd->AvailableForStates(G4State_PreInit,G4State_Idle); fgCmd->SetToBeBroadcasted(false); @@ -583,6 +583,7 @@ void G4EmParametersMessenger::SetNewValue(G4UIcommand* command, } else if (command == ver2Cmd) { theParameters->SetWorkerVerbose(ver2Cmd->GetNewIntValue(newValue)); } else if (command == dumpCmd) { + theParameters->SetIsPrintedFlag(false); theParameters->Dump(); } else if (command == mscCmd || command == msc1Cmd) { G4MscStepLimitType msctype = fUseSafety; diff --git a/source/processes/electromagnetic/utils/src/G4LossTableBuilder.cc b/source/processes/electromagnetic/utils/src/G4LossTableBuilder.cc index abfd6761e0..2f5a8005cf 100644 --- a/source/processes/electromagnetic/utils/src/G4LossTableBuilder.cc +++ b/source/processes/electromagnetic/utils/src/G4LossTableBuilder.cc @@ -137,56 +137,66 @@ G4bool G4LossTableBuilder::GetFlag(size_t idx) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +G4bool G4LossTableBuilder::GetBaseMaterialFlag() +{ + if(theFlag->empty()) { InitialiseBaseMaterials(); } + return baseMatFlag; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + void G4LossTableBuilder::BuildDEDXTable(G4PhysicsTable* dedxTable, const std::vector& list) { InitialiseBaseMaterials(dedxTable); size_t n_processes = list.size(); - //G4cout << "Nproc= " << n_processes << " Ncoup= " - //<< dedxTable->size() << G4endl; if(1 >= n_processes) { return; } size_t nCouples = dedxTable->size(); + //G4cout << "Nproc= " << n_processes << " nCouples=" << nCouples << " Nv= " + // << dedxTable->size() << G4endl; if(0 >= nCouples) { return; } for (size_t i=0; i((*(list[0]))[i]); - if(nullptr != pv0) { - size_t npoints = pv0->GetVectorLength(); - G4PhysicsLogVector* pv = new G4PhysicsLogVector(*pv0); - for (size_t j=0; jPutValue(j, dedx); + if(pv0 == nullptr) { continue; } + size_t npoints = pv0->GetVectorLength(); + G4PhysicsLogVector* pv = new G4PhysicsLogVector(*pv0); + for (size_t j=0; jFillSecondDerivatives(); } - G4PhysicsTableHelper::SetPhysicsVector(dedxTable, i, pv); + pv->PutValue(j, dedx); } + if(splineFlag) { pv->FillSecondDerivatives(); } + G4PhysicsTableHelper::SetPhysicsVector(dedxTable, i, pv); } + //G4cout << "### G4LossTableBuilder::BuildDEDXTable " << G4endl; + //G4cout << *dedxTable << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void G4LossTableBuilder::BuildRangeTable(const G4PhysicsTable* dedxTable, - G4PhysicsTable* rangeTable, - G4bool useBM) + G4PhysicsTable* rangeTable) // Build range table from the energy loss table { - size_t nCouples = dedxTable->size(); + //G4cout << "### G4LossTableBuilder::BuildRangeTable: DEDX table" << G4endl; + //G4cout << *const_cast(dedxTable) << G4endl; + const std::size_t nCouples = dedxTable->size(); if(0 >= nCouples) { return; } - size_t n = 100; - G4double del = 1.0/(G4double)n; + const std::size_t n = 100; + const G4double del = 1.0/(G4double)n; - for (size_t i=0; i((*dedxTable)[i]); - if((pv == nullptr) || (useBM && !(*theFlag)[i])) { continue; } - size_t npoints = pv->GetVectorLength(); - size_t bin0 = 0; + if((pv == nullptr) || (isBaseMatActive && !(*theFlag)[i])) { continue; } + std::size_t npoints = pv->GetVectorLength(); + std::size_t bin0 = 0; G4double elow = pv->Energy(0); G4double ehigh = pv->Energy(npoints-1); G4double dedx1 = (*pv)[0]; @@ -196,7 +206,7 @@ void G4LossTableBuilder::BuildRangeTable(const G4PhysicsTable* dedxTable, // protection for specific cases dedx=0 if(dedx1 == 0.0) { - for (size_t k=1; kEnergy(k); dedx1 = (*pv)[k]; @@ -222,17 +232,18 @@ void G4LossTableBuilder::BuildRangeTable(const G4PhysicsTable* dedxTable, //G4cout << "range0= " << range << G4endl; v->PutValue(0,range); - for (size_t j=1; jEnergy(j); G4double de = (energy2 - energy1) * del; G4double energy = energy2 + de*0.5; G4double sum = 0.0; + std::size_t idx = j - 1; //G4cout << "j= " << j << " e1= " << energy1 << " e2= " << energy2 // << " n= " << n << G4endl; - for (size_t k=0; kValue(energy); + dedx1 = pv->Value(energy, idx); if(dedx1 > 0.0) { sum += de/dedx1; } } range += sum; @@ -242,30 +253,29 @@ void G4LossTableBuilder::BuildRangeTable(const G4PhysicsTable* dedxTable, if(splineFlag) { v->FillSecondDerivatives(); } G4PhysicsTableHelper::SetPhysicsVector(rangeTable, i, v); } + //G4cout << "### Range table" << G4endl; + //G4cout << *rangeTable << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void G4LossTableBuilder::BuildInverseRangeTable(const G4PhysicsTable* rangeTable, - G4PhysicsTable* invRangeTable, - G4bool useBM) + G4PhysicsTable* invRangeTable) // Build inverse range table from the energy loss table { - size_t nCouples = rangeTable->size(); + std::size_t nCouples = rangeTable->size(); if(0 >= nCouples) { return; } - for (size_t i=0; iGetVectorLength(); - G4double rlow = (*pv)[0]; - G4double rhigh = (*pv)[npoints-1]; + if((pv == nullptr) || (isBaseMatActive && !(*theFlag)[i])) { continue; } + std::size_t npoints = pv->GetVectorLength(); delete (*invRangeTable)[i]; - G4PhysicsFreeVector* v = new G4PhysicsFreeVector(npoints,rlow,rhigh,splineFlag); + G4PhysicsFreeVector* v = new G4PhysicsFreeVector(npoints,splineFlag); - for (size_t j=0; jEnergy(j); G4double r = (*pv)[j]; v->PutValues(j,r,e); @@ -274,6 +284,8 @@ G4LossTableBuilder::BuildInverseRangeTable(const G4PhysicsTable* rangeTable, G4PhysicsTableHelper::SetPhysicsVector(invRangeTable, i, v); } + //G4cout << "### Inverse range table" << G4endl; + //G4cout << *invRangeTable << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -283,63 +295,85 @@ void G4LossTableBuilder::InitialiseBaseMaterials(const G4PhysicsTable* table) if(!isMaster) { return; } const G4ProductionCutsTable* theCoupleTable= G4ProductionCutsTable::GetProductionCutsTable(); - size_t nCouples = theCoupleTable->GetTableSize(); - size_t nFlags = theFlag->size(); - if(isInitialized && nFlags == nCouples) { return; } + std::size_t nCouples = theCoupleTable->GetTableSize(); + std::size_t nFlags = theFlag->size(); + /* + G4cout << "### InitialiseBaseMaterials: nCouples=" << nCouples + << " nFlags=" << nFlags << " isInit:" << isInitialized + << " baseMat:" << baseMatFlag << G4endl; + */ + // define base material flag + if(isBaseMatActive && !baseMatFlag) { + for(std::size_t i=0; iGetMaterialCutsCouple(i)->GetMaterial()->GetBaseMaterial()) { + baseMatFlag = true; + isInitialized = false; + break; + } + } + } + if(nFlags != nCouples) { isInitialized = false; } + if(isInitialized) { return; } + + // reserve memory + theFlag->resize(nCouples, true); + if(nullptr == table) { return; } + + if(baseMatFlag) { + theDensityFactor->resize(nCouples,1.0); + theDensityIdx->resize(nCouples); + } + + // define default flag and index of used material cut couple + for(std::size_t i=0; iGetFlag(i); + if(baseMatFlag) { (*theDensityIdx)[i] = i; } + } isInitialized = true; - if(0 == nFlags) { - theDensityFactor->reserve(nCouples); - theDensityIdx->reserve(nCouples); - theFlag->reserve(nCouples); - } - for(size_t i=0; iGetFlag(i) : true; - } - for(size_t i=nFlags; iGetFlag(i) : true; - theDensityFactor->push_back(1.0); - theDensityIdx->push_back(i); - theFlag->push_back(yes); - } - // use base materials - for(size_t i=0; iGetMaterialCutsCouple(i); - auto pcuts = couple->GetProductionCuts(); - auto mat = couple->GetMaterial(); - auto bmat = mat->GetBaseMaterial(); + if(baseMatFlag) { + // use base materials + for(std::size_t i=0; iGetMaterialCutsCouple(i); + auto pcuts = couple->GetProductionCuts(); + auto mat = couple->GetMaterial(); + auto bmat = mat->GetBaseMaterial(); - // base material exists - find it and check if it can be reused - if(nullptr != bmat) { - for(size_t j=0; jGetMaterialCutsCouple(j); + // base material exists - find it and check if it can be reused + if(nullptr != bmat) { + for(std::size_t j=0; jGetMaterialCutsCouple(j); - if(bcouple->GetMaterial() == bmat && - bcouple->GetProductionCuts() == pcuts) { + if(bcouple->GetMaterial() == bmat && + bcouple->GetProductionCuts() == pcuts) { - // based couple exist in the same region - (*theDensityFactor)[i] = mat->GetDensity()/bmat->GetDensity(); - (*theDensityIdx)[i] = j; - (*theFlag)[i] = false; + // based couple exist in the same region + (*theDensityFactor)[i] = mat->GetDensity()/bmat->GetDensity(); + (*theDensityIdx)[i] = j; + (*theFlag)[i] = false; - // ensure that there will no double initialisation - (*theDensityFactor)[j] = 1.0; - (*theDensityIdx)[j] = j; - (*theFlag)[j] = true; - break; - } + // ensure that there will no double initialisation + (*theDensityFactor)[j] = 1.0; + (*theDensityIdx)[j] = j; + (*theFlag)[j] = true; + break; + } + } } } } /* + G4cout << "### G4LossTableBuilder::InitialiseBaseMaterials: flag=" + << baseMatFlag << G4endl; for(size_t i=0; iGetMaterialCutsCouple(i)->GetMaterial()->GetName() - << G4endl; + << " TableFlag= " << table->GetFlag(i) + << " " << (*table)[i] + << G4endl; } */ } @@ -364,17 +398,16 @@ G4LossTableBuilder::BuildTableForModel(G4PhysicsTable* aTable, } InitialiseBaseMaterials(table); G4int nbins = theParameters->NumberOfBinsPerDecade(); - G4bool useMB = model->UseBaseMaterials(); // Access to materials const G4ProductionCutsTable* theCoupleTable= G4ProductionCutsTable::GetProductionCutsTable(); - size_t numOfCouples = theCoupleTable->GetTableSize(); + std::size_t numOfCouples = theCoupleTable->GetTableSize(); G4PhysicsLogVector* aVector = nullptr; - for(size_t i=0; iGetFlag(i))) { + for(std::size_t i=0; iGetMaterialCutsCouple(i); @@ -413,8 +446,8 @@ G4LossTableBuilder::BuildTableForModel(G4PhysicsTable* aTable, << part->GetParticleName() << " and "<< model->GetName() << " " << table << G4endl; */ + //G4cout << *table << G4endl; return table; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - diff --git a/source/processes/electromagnetic/utils/src/G4LossTableManager.cc b/source/processes/electromagnetic/utils/src/G4LossTableManager.cc index 4abac90f39..8cc8d785cc 100644 --- a/source/processes/electromagnetic/utils/src/G4LossTableManager.cc +++ b/source/processes/electromagnetic/utils/src/G4LossTableManager.cc @@ -223,13 +223,14 @@ void G4LossTableManager::ResetParameters() verbose = theParameters->Verbose(); if(!isMaster) { verbose = theParameters->WorkerVerbose(); + } else { + if(verbose > 0) { theParameters->Dump(); } } - tableBuilder->SetSplineFlag(theParameters->Spline()); tableBuilder->SetInitialisationFlag(false); emCorrections->SetVerbose(verbose); - if(emConfigurator) { emConfigurator->SetVerbose(verbose); }; - if(emElectronIonPair) { emElectronIonPair->SetVerbose(verbose); }; - if(atomDeexcitation) { + if(nullptr != emConfigurator) { emConfigurator->SetVerbose(verbose); }; + if(nullptr != emElectronIonPair) { emElectronIonPair->SetVerbose(verbose); }; + if(nullptr != atomDeexcitation) { atomDeexcitation->SetVerboseLevel(verbose); atomDeexcitation->InitialiseAtomicDeexcitation(); } @@ -694,7 +695,10 @@ void G4LossTableManager::BuildPhysicsTable( } } - if (all_tables_are_built) { return; } + if (all_tables_are_built) { + theParameters->SetIsPrintedFlag(true); + return; + } // Build tables for given particle all_tables_are_built = true; @@ -714,7 +718,7 @@ void G4LossTableManager::BuildPhysicsTable( if(p == curr_proc && 0 == run && p->IsIonisationProcess()) { loss_map[aParticle] = p; //G4cout << "G4LossTableManager::BuildPhysicsTable: " - // << aParticle->GetParticleName() + // << aParticle->GetParticleName() // << " added to map " << p << G4endl; } } @@ -891,8 +895,8 @@ G4VEnergyLossProcess* G4LossTableManager::BuildTables( if(!invrange) invrange = G4PhysicsTableHelper::PreparePhysicsTable(invrange); inv_range_vector[iem] = invrange; - tableBuilder->BuildRangeTable(dedx, range, true); - tableBuilder->BuildInverseRangeTable(range, invrange, true); + tableBuilder->BuildRangeTable(dedx, range); + tableBuilder->BuildInverseRangeTable(range, invrange); // if(1CSDARangeTable(); if(!rCSDA) { rCSDA = G4PhysicsTableHelper::PreparePhysicsTable(rCSDA); } - tableBuilder->BuildRangeTable(dedxCSDA, rCSDA, true); + tableBuilder->BuildRangeTable(dedxCSDA, rCSDA); em->SetCSDARangeTable(rCSDA); } diff --git a/source/processes/electromagnetic/utils/src/G4OpticalParameters.cc b/source/processes/electromagnetic/utils/src/G4OpticalParameters.cc index 46774c33d6..624236617c 100644 --- a/source/processes/electromagnetic/utils/src/G4OpticalParameters.cc +++ b/source/processes/electromagnetic/utils/src/G4OpticalParameters.cc @@ -51,17 +51,19 @@ G4OpticalParameters* G4OpticalParameters::theInstance = nullptr; #ifdef G4MULTITHREADED - G4Mutex G4OpticalParameters::opticalParametersMutex = G4MUTEX_INITIALIZER; +G4Mutex G4OpticalParameters::opticalParametersMutex = G4MUTEX_INITIALIZER; #endif //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... G4OpticalParameters* G4OpticalParameters::Instance() { - if(nullptr == theInstance) { + if(nullptr == theInstance) + { #ifdef G4MULTITHREADED G4MUTEXLOCK(&opticalParametersMutex); - if(nullptr == theInstance) { + if(nullptr == theInstance) + { #endif static G4OpticalParameters manager; theInstance = &manager; @@ -75,10 +77,7 @@ G4OpticalParameters* G4OpticalParameters::Instance() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... -G4OpticalParameters::~G4OpticalParameters() -{ - delete theMessenger; -} +G4OpticalParameters::~G4OpticalParameters() { delete theMessenger; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... @@ -92,7 +91,8 @@ G4OpticalParameters::G4OpticalParameters() void G4OpticalParameters::SetDefaults() { - if(!IsLocked()) { + if(!IsLocked()) + { Initialise(); } } @@ -114,10 +114,10 @@ void G4OpticalParameters::Initialise() scintTrackSecondariesFirst = true; scintVerboseLevel = 0; - wlsTimeProfileName = "delta"; + wlsTimeProfileName = "delta"; wlsVerboseLevel = 0; - wls2TimeProfileName = "delta"; + wls2TimeProfileName = "delta"; wls2VerboseLevel = 0; absorptionVerboseLevel = 0; @@ -137,12 +137,14 @@ void G4OpticalParameters::Initialise() processActivation["OpWLS2"] = true; processActivation["Cerenkov"] = true; processActivation["Scintillation"] = true; - } void G4OpticalParameters::SetVerboseLevel(G4int val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } verboseLevel = val; SetCerenkovVerboseLevel(verboseLevel); SetScintVerboseLevel(verboseLevel); @@ -154,12 +156,10 @@ void G4OpticalParameters::SetVerboseLevel(G4int val) SetWLS2VerboseLevel(verboseLevel); } -G4int G4OpticalParameters::GetVerboseLevel() const -{ - return verboseLevel; -} +G4int G4OpticalParameters::GetVerboseLevel() const { return verboseLevel; } -void G4OpticalParameters::SetProcessActivation(const G4String& process, G4bool val) +void G4OpticalParameters::SetProcessActivation(const G4String& process, + G4bool val) { // Configure the physics constructor to use/not use a selected process. // This method can only be called in PreInit> phase (before execution of @@ -167,14 +167,20 @@ void G4OpticalParameters::SetProcessActivation(const G4String& process, G4bool v // and so it cannot be re-activated later in Idle> phase with the command // /process/activate. - if(IsLocked()) { return; } - if (processActivation[process] == val) return; + if(IsLocked()) + { + return; + } + if(processActivation[process] == val) + return; // processActivation keys defined at initialisation - if (processActivation.find(process) != processActivation.end()) { + if(processActivation.find(process) != processActivation.end()) + { processActivation[process] = val; } - else { + else + { G4ExceptionDescription ed; ed << "Process name " << process << " out of bounds."; G4Exception("G4OpticalParameters::SetProcessActivation()", "Optical013", @@ -183,11 +189,16 @@ void G4OpticalParameters::SetProcessActivation(const G4String& process, G4bool v } G4bool G4OpticalParameters::GetProcessActivation(const G4String& process) const -{ return processActivation.find(process)->second; } +{ + return processActivation.find(process)->second; +} void G4OpticalParameters::SetCerenkovStackPhotons(G4bool val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } cerenkovStackPhotons = val; } @@ -198,7 +209,10 @@ G4bool G4OpticalParameters::GetCerenkovStackPhotons() const void G4OpticalParameters::SetCerenkovVerboseLevel(G4int val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } cerenkovVerboseLevel = val; } @@ -209,7 +223,10 @@ G4int G4OpticalParameters::GetCerenkovVerboseLevel() const void G4OpticalParameters::SetCerenkovMaxPhotonsPerStep(G4int val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } cerenkovMaxPhotons = val; } @@ -220,7 +237,10 @@ G4int G4OpticalParameters::GetCerenkovMaxPhotonsPerStep() const void G4OpticalParameters::SetCerenkovMaxBetaChange(G4double val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } cerenkovMaxBetaChange = val; } @@ -231,7 +251,10 @@ G4double G4OpticalParameters::GetCerenkovMaxBetaChange() const void G4OpticalParameters::SetCerenkovTrackSecondariesFirst(G4bool val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } cerenkovTrackSecondariesFirst = val; } @@ -242,7 +265,10 @@ G4bool G4OpticalParameters::GetCerenkovTrackSecondariesFirst() const void G4OpticalParameters::SetScintByParticleType(G4bool val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } scintByParticleType = val; } @@ -253,18 +279,21 @@ G4bool G4OpticalParameters::GetScintByParticleType() const void G4OpticalParameters::SetScintTrackInfo(G4bool val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } scintTrackInfo = val; } -G4bool G4OpticalParameters::GetScintTrackInfo() const -{ - return scintTrackInfo; -} +G4bool G4OpticalParameters::GetScintTrackInfo() const { return scintTrackInfo; } void G4OpticalParameters::SetScintTrackSecondariesFirst(G4bool val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } scintTrackSecondariesFirst = val; } @@ -275,7 +304,10 @@ G4bool G4OpticalParameters::GetScintTrackSecondariesFirst() const void G4OpticalParameters::SetScintFiniteRiseTime(G4bool val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } scintFiniteRiseTime = val; } @@ -286,7 +318,10 @@ G4bool G4OpticalParameters::GetScintFiniteRiseTime() const void G4OpticalParameters::SetScintStackPhotons(G4bool val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } scintStackPhotons = val; } @@ -297,7 +332,10 @@ G4bool G4OpticalParameters::GetScintStackPhotons() const void G4OpticalParameters::SetScintVerboseLevel(G4int val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } scintVerboseLevel = val; } @@ -308,7 +346,10 @@ G4int G4OpticalParameters::GetScintVerboseLevel() const void G4OpticalParameters::SetWLSTimeProfile(const G4String& val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } wlsTimeProfileName = val; } @@ -319,7 +360,10 @@ G4String G4OpticalParameters::GetWLSTimeProfile() const void G4OpticalParameters::SetWLSVerboseLevel(G4int val) { - if(IsLocked()) {return; } + if(IsLocked()) + { + return; + } wlsVerboseLevel = val; } @@ -330,7 +374,10 @@ G4int G4OpticalParameters::GetWLSVerboseLevel() const void G4OpticalParameters::SetWLS2TimeProfile(const G4String& val) { - if(IsLocked()) { return; } + if(IsLocked()) + { + return; + } wls2TimeProfileName = val; } @@ -341,7 +388,10 @@ G4String G4OpticalParameters::GetWLS2TimeProfile() const void G4OpticalParameters::SetWLS2VerboseLevel(G4int val) { - if(IsLocked()) {return; } + if(IsLocked()) + { + return; + } wls2VerboseLevel = val; } @@ -352,7 +402,10 @@ G4int G4OpticalParameters::GetWLS2VerboseLevel() const void G4OpticalParameters::SetBoundaryVerboseLevel(G4int val) { - if(IsLocked()) {return;} + if(IsLocked()) + { + return; + } boundaryVerboseLevel = val; } @@ -363,7 +416,10 @@ G4int G4OpticalParameters::GetBoundaryVerboseLevel() const void G4OpticalParameters::SetBoundaryInvokeSD(G4bool val) { - if(IsLocked()) {return;} + if(IsLocked()) + { + return; + } boundaryInvokeSD = val; } @@ -374,7 +430,10 @@ G4bool G4OpticalParameters::GetBoundaryInvokeSD() const void G4OpticalParameters::SetAbsorptionVerboseLevel(G4int val) { - if(IsLocked()) {return;} + if(IsLocked()) + { + return; + } absorptionVerboseLevel = val; } @@ -385,7 +444,10 @@ G4int G4OpticalParameters::GetAbsorptionVerboseLevel() const void G4OpticalParameters::SetRayleighVerboseLevel(G4int val) { - if(IsLocked()) {return;} + if(IsLocked()) + { + return; + } rayleighVerboseLevel = val; } @@ -396,7 +458,10 @@ G4int G4OpticalParameters::GetRayleighVerboseLevel() const void G4OpticalParameters::SetMieVerboseLevel(G4int val) { - if(IsLocked()) {return;} + if(IsLocked()) + { + return; + } mieVerboseLevel = val; } @@ -413,31 +478,56 @@ void G4OpticalParameters::PrintWarning(G4ExceptionDescription& ed) const void G4OpticalParameters::StreamInfo(std::ostream& os) const { G4int prec = os.precision(5); - os << "=======================================================================" << "\n"; - os << "====== Optical Physics Parameters ========" << "\n"; - os << "=======================================================================" << "\n"; + os + << "=======================================================================" + << "\n"; + os + << "====== Optical Physics Parameters ========" + << "\n"; + os + << "=======================================================================" + << "\n"; - os << " Cerenkov process active: " << GetProcessActivation("Cerenkov") << "\n"; - os << " Cerenkov maximum photons per step: " << cerenkovMaxPhotons << "\n"; - os << " Cerenkov maximum beta change per step: " << cerenkovMaxBetaChange << " %\n"; - os << " Cerenkov stack photons: " << cerenkovStackPhotons << "\n"; - os << " Cerenkov track secondaries first: " << cerenkovTrackSecondariesFirst << "\n"; - os << " Scintillation process active: " << GetProcessActivation("Scintillation") << "\n"; - os << " Scintillation finite rise time: " << scintFiniteRiseTime << "\n"; - os << " Scintillation by particle type: " << scintByParticleType << "\n"; + os << " Cerenkov process active: " + << GetProcessActivation("Cerenkov") << "\n"; + os << " Cerenkov maximum photons per step: " << cerenkovMaxPhotons + << "\n"; + os << " Cerenkov maximum beta change per step: " << cerenkovMaxBetaChange + << " %\n"; + os << " Cerenkov stack photons: " << cerenkovStackPhotons + << "\n"; + os << " Cerenkov track secondaries first: " + << cerenkovTrackSecondariesFirst << "\n"; + os << " Scintillation process active: " + << GetProcessActivation("Scintillation") << "\n"; + os << " Scintillation finite rise time: " << scintFiniteRiseTime + << "\n"; + os << " Scintillation by particle type: " << scintByParticleType + << "\n"; os << " Scintillation record track info: " << scintTrackInfo << "\n"; os << " Scintillation stack photons: " << scintStackPhotons << "\n"; - os << " Scintillation track secondaries first: " << scintTrackSecondariesFirst << "\n"; - os << " WLS process active: " << GetProcessActivation("OpWLS") << "\n"; - os << " WLS time profile name: " << wlsTimeProfileName << "\n"; - os << " WLS2 process active: " << GetProcessActivation("OpWLS2") << "\n"; - os << " WLS2 time profile name: " << wls2TimeProfileName << "\n"; - os << " Boundary process active: " << GetProcessActivation("OpBoundary") << "\n"; + os << " Scintillation track secondaries first: " << scintTrackSecondariesFirst + << "\n"; + os << " WLS process active: " + << GetProcessActivation("OpWLS") << "\n"; + os << " WLS time profile name: " << wlsTimeProfileName + << "\n"; + os << " WLS2 process active: " + << GetProcessActivation("OpWLS2") << "\n"; + os << " WLS2 time profile name: " << wls2TimeProfileName + << "\n"; + os << " Boundary process active: " + << GetProcessActivation("OpBoundary") << "\n"; os << " Boundary invoke sensitive detector: " << boundaryInvokeSD << "\n"; - os << " Rayleigh process active: " << GetProcessActivation("OpRayleigh") << "\n"; - os << " MieHG process active: " << GetProcessActivation("OpMieHG") << "\n"; - os << " Absorption process active: " << GetProcessActivation("OpAbsorption") << "\n"; - os << "=======================================================================" << "\n"; + os << " Rayleigh process active: " + << GetProcessActivation("OpRayleigh") << "\n"; + os << " MieHG process active: " + << GetProcessActivation("OpMieHG") << "\n"; + os << " Absorption process active: " + << GetProcessActivation("OpAbsorption") << "\n"; + os + << "=======================================================================" + << "\n"; os.precision(prec); } @@ -452,7 +542,7 @@ void G4OpticalParameters::Dump() const #endif } -std::ostream& operator<< (std::ostream& os, const G4OpticalParameters& par) +std::ostream& operator<<(std::ostream& os, const G4OpticalParameters& par) { par.StreamInfo(os); return os; @@ -461,7 +551,7 @@ std::ostream& operator<< (std::ostream& os, const G4OpticalParameters& par) G4bool G4OpticalParameters::IsLocked() const { return (!G4Threading::IsMasterThread() || - (fStateManager->GetCurrentState() != G4State_PreInit && - fStateManager->GetCurrentState() != G4State_Init && - fStateManager->GetCurrentState() != G4State_Idle)); + (fStateManager->GetCurrentState() != G4State_PreInit && + fStateManager->GetCurrentState() != G4State_Init && + fStateManager->GetCurrentState() != G4State_Idle)); } diff --git a/source/processes/electromagnetic/utils/src/G4OpticalParametersMessenger.cc b/source/processes/electromagnetic/utils/src/G4OpticalParametersMessenger.cc index a5338e2c66..dc6767afc3 100644 --- a/source/processes/electromagnetic/utils/src/G4OpticalParametersMessenger.cc +++ b/source/processes/electromagnetic/utils/src/G4OpticalParametersMessenger.cc @@ -52,185 +52,230 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4OpticalParametersMessenger::G4OpticalParametersMessenger( - G4OpticalParameters* opticalParameters) + G4OpticalParameters* opticalParameters) : params(opticalParameters) { - G4bool toBeBroadcasted = false; - fDir = new G4UIdirectory("/process/optical/",toBeBroadcasted); - fDir->SetGuidance("Commands related to the optical physics simulation engine."); + G4bool toBeBroadcasted = false; + fDir = new G4UIdirectory("/process/optical/", toBeBroadcasted); + fDir->SetGuidance( + "Commands related to the optical physics simulation engine."); - fCerenkovDir = new G4UIdirectory("/process/optical/cerenkov/", toBeBroadcasted); - fCerenkovDir->SetGuidance("Cerenkov process commands"); - fScintDir = new G4UIdirectory("/process/optical/scintillation/", toBeBroadcasted); - fScintDir->SetGuidance("Scintillation process commands"); - fWlsDir = new G4UIdirectory("/process/optical/wls/", toBeBroadcasted); - fWlsDir->SetGuidance("Wave length shifting process commands"); - fWls2Dir = new G4UIdirectory("/process/optical/wls2/", toBeBroadcasted); - fWls2Dir->SetGuidance("Second Wave length shifting process commands"); - fBoundaryDir = new G4UIdirectory("/process/optical/boundary/", toBeBroadcasted); - fBoundaryDir->SetGuidance("Boundary scattering commands"); - fMieDir = new G4UIdirectory("/process/optical/mie/", toBeBroadcasted); - fMieDir->SetGuidance("Mie scattering process commands"); - fAbsDir = new G4UIdirectory("/process/optical/absorption/", toBeBroadcasted); - fAbsDir->SetGuidance("absorption process commands"); - fRaylDir = new G4UIdirectory("/process/optical/rayleigh/", toBeBroadcasted); - fRaylDir->SetGuidance("Rayleigh scattering commands"); + fCerenkovDir = + new G4UIdirectory("/process/optical/cerenkov/", toBeBroadcasted); + fCerenkovDir->SetGuidance("Cerenkov process commands"); + fScintDir = + new G4UIdirectory("/process/optical/scintillation/", toBeBroadcasted); + fScintDir->SetGuidance("Scintillation process commands"); + fWlsDir = new G4UIdirectory("/process/optical/wls/", toBeBroadcasted); + fWlsDir->SetGuidance("Wave length shifting process commands"); + fWls2Dir = new G4UIdirectory("/process/optical/wls2/", toBeBroadcasted); + fWls2Dir->SetGuidance("Second Wave length shifting process commands"); + fBoundaryDir = + new G4UIdirectory("/process/optical/boundary/", toBeBroadcasted); + fBoundaryDir->SetGuidance("Boundary scattering commands"); + fMieDir = new G4UIdirectory("/process/optical/mie/", toBeBroadcasted); + fMieDir->SetGuidance("Mie scattering process commands"); + fAbsDir = new G4UIdirectory("/process/optical/absorption/", toBeBroadcasted); + fAbsDir->SetGuidance("absorption process commands"); + fRaylDir = new G4UIdirectory("/process/optical/rayleigh/", toBeBroadcasted); + fRaylDir->SetGuidance("Rayleigh scattering commands"); - // general commands - fActivateProcessCmd= new G4UIcommand("/process/optical/processActivation", this); - fActivateProcessCmd->SetGuidance("Activate/deactivate the specified optical process"); - G4UIparameter* par = new G4UIparameter("proc_name",'s',false); - G4String candidates; - for ( G4int i=0; iSetParameterCandidates(candidates); - par->SetGuidance("the process name"); - fActivateProcessCmd->SetParameter(par); - par = new G4UIparameter("flag",'b',true); - par->SetDefaultValue(true); - par->SetGuidance("activation flag"); - fActivateProcessCmd->SetParameter(par); - fActivateProcessCmd->AvailableForStates(G4State_PreInit); + // general commands + fActivateProcessCmd = + new G4UIcommand("/process/optical/processActivation", this); + fActivateProcessCmd->SetGuidance( + "Activate/deactivate the specified optical process"); + G4UIparameter* par = new G4UIparameter("proc_name", 's', false); + G4String candidates; + for(G4int i = 0; i < kNoProcess; ++i) + { + candidates += G4OpticalProcessName(i); + candidates += G4String(" "); + } + par->SetParameterCandidates(candidates); + par->SetGuidance("the process name"); + fActivateProcessCmd->SetParameter(par); + par = new G4UIparameter("flag", 'b', true); + par->SetDefaultValue(true); + par->SetGuidance("activation flag"); + fActivateProcessCmd->SetParameter(par); + fActivateProcessCmd->AvailableForStates(G4State_PreInit); - fVerboseCmd = new G4UIcmdWithAnInteger("/process/optical/verbose", this); - fVerboseCmd->SetGuidance("Set default verbose level for optical processes"); - fVerboseCmd->SetParameterName("ver", true); - fVerboseCmd->SetDefaultValue(1); - fVerboseCmd->SetRange("ver>=0"); - fVerboseCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fVerboseCmd = new G4UIcmdWithAnInteger("/process/optical/verbose", this); + fVerboseCmd->SetGuidance("Set default verbose level for optical processes"); + fVerboseCmd->SetParameterName("ver", true); + fVerboseCmd->SetDefaultValue(1); + fVerboseCmd->SetRange("ver>=0"); + fVerboseCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fDumpCmd = new G4UIcommand("/process/optical/printParameters", this); - fDumpCmd->SetGuidance("Print all optical parameters."); + fDumpCmd = new G4UIcommand("/process/optical/printParameters", this); + fDumpCmd->SetGuidance("Print all optical parameters."); - // Cerenkov //////////////////// - fCerenkovMaxPhotonsCmd = new G4UIcmdWithAnInteger("/process/optical/cerenkov/setMaxPhotons", this); - fCerenkovMaxPhotonsCmd->SetGuidance("Set maximum number of photons per step"); - fCerenkovMaxPhotonsCmd->SetParameterName("CerenkovMaxPhotons", false); - fCerenkovMaxPhotonsCmd->SetRange("CerenkovMaxPhotons>=0"); - fCerenkovMaxPhotonsCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + // Cerenkov //////////////////// + fCerenkovMaxPhotonsCmd = + new G4UIcmdWithAnInteger("/process/optical/cerenkov/setMaxPhotons", this); + fCerenkovMaxPhotonsCmd->SetGuidance("Set maximum number of photons per step"); + fCerenkovMaxPhotonsCmd->SetParameterName("CerenkovMaxPhotons", false); + fCerenkovMaxPhotonsCmd->SetRange("CerenkovMaxPhotons>=0"); + fCerenkovMaxPhotonsCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fCerenkovMaxBetaChangeCmd = new G4UIcmdWithADouble("/process/optical/cerenkov/setMaxBetaChange", this); - fCerenkovMaxBetaChangeCmd->SetGuidance("Set maximum change of beta of parent particle per step"); - fCerenkovMaxBetaChangeCmd->SetParameterName("CerenkovMaxBetaChange", false); - fCerenkovMaxBetaChangeCmd->SetRange("CerenkovMaxBetaChange>=0"); - fCerenkovMaxBetaChangeCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fCerenkovMaxBetaChangeCmd = + new G4UIcmdWithADouble("/process/optical/cerenkov/setMaxBetaChange", this); + fCerenkovMaxBetaChangeCmd->SetGuidance( + "Set maximum change of beta of parent particle per step"); + fCerenkovMaxBetaChangeCmd->SetParameterName("CerenkovMaxBetaChange", false); + fCerenkovMaxBetaChangeCmd->SetRange("CerenkovMaxBetaChange>=0"); + fCerenkovMaxBetaChangeCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fCerenkovStackPhotonsCmd = new G4UIcmdWithABool("/process/optical/cerenkov/setStackPhotons", this); - fCerenkovStackPhotonsCmd->SetGuidance("Set whether or not to stack secondary Cerenkov photons"); - fCerenkovStackPhotonsCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fCerenkovStackPhotonsCmd = + new G4UIcmdWithABool("/process/optical/cerenkov/setStackPhotons", this); + fCerenkovStackPhotonsCmd->SetGuidance( + "Set whether or not to stack secondary Cerenkov photons"); + fCerenkovStackPhotonsCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fCerenkovTrackSecondariesFirstCmd = new G4UIcmdWithABool("/process/optical/cerenkov/setTrackSecondariesFirst", this); - fCerenkovTrackSecondariesFirstCmd->SetGuidance("Whether to track secondary Cerenkov photons before the primary."); - fCerenkovTrackSecondariesFirstCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fCerenkovTrackSecondariesFirstCmd = new G4UIcmdWithABool( + "/process/optical/cerenkov/setTrackSecondariesFirst", this); + fCerenkovTrackSecondariesFirstCmd->SetGuidance( + "Whether to track secondary Cerenkov photons before the primary."); + fCerenkovTrackSecondariesFirstCmd->AvailableForStates(G4State_PreInit, + G4State_Idle); - fCerenkovVerboseLevelCmd = new G4UIcmdWithAnInteger("/process/optical/cerenkov/verbose", this); - fCerenkovVerboseLevelCmd->SetGuidance("Verbose level for Cerenkov process."); - fCerenkovVerboseLevelCmd->SetParameterName("verbose", true); - fCerenkovVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); - fCerenkovVerboseLevelCmd->SetDefaultValue(2); - fCerenkovVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fCerenkovVerboseLevelCmd = + new G4UIcmdWithAnInteger("/process/optical/cerenkov/verbose", this); + fCerenkovVerboseLevelCmd->SetGuidance("Verbose level for Cerenkov process."); + fCerenkovVerboseLevelCmd->SetParameterName("verbose", true); + fCerenkovVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); + fCerenkovVerboseLevelCmd->SetDefaultValue(2); + fCerenkovVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - // Scintillation ////////////////////////// - fScintByParticleTypeCmd = new G4UIcmdWithABool("/process/optical/scintillation/setByParticleType", this); - fScintByParticleTypeCmd->SetGuidance("Activate/Inactivate scintillation process by particle type"); - fScintByParticleTypeCmd->SetParameterName("ScintillationByParticleTypeActivation", false); - fScintByParticleTypeCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + // Scintillation ////////////////////////// + fScintByParticleTypeCmd = new G4UIcmdWithABool( + "/process/optical/scintillation/setByParticleType", this); + fScintByParticleTypeCmd->SetGuidance( + "Activate/Inactivate scintillation process by particle type"); + fScintByParticleTypeCmd->SetParameterName( + "ScintillationByParticleTypeActivation", false); + fScintByParticleTypeCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fScintTrackInfoCmd = new G4UIcmdWithABool("/process/optical/scintillation/setTrackInfo", this); - fScintTrackInfoCmd->SetGuidance("Activate/Inactivate scintillation TrackInformation"); - fScintTrackInfoCmd->SetParameterName("ScintillationTrackInfo", false); - fScintTrackInfoCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fScintTrackInfoCmd = + new G4UIcmdWithABool("/process/optical/scintillation/setTrackInfo", this); + fScintTrackInfoCmd->SetGuidance( + "Activate/Inactivate scintillation TrackInformation"); + fScintTrackInfoCmd->SetParameterName("ScintillationTrackInfo", false); + fScintTrackInfoCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fScintFiniteRiseTimeCmd = new G4UIcmdWithABool("/process/optical/scintillation/setFiniteRiseTime", this); - fScintFiniteRiseTimeCmd->SetGuidance("Set option of a finite rise-time for G4Scintillation"); - fScintFiniteRiseTimeCmd->SetGuidance("If set, the G4Scintillation process expects the user to have set the"); - fScintFiniteRiseTimeCmd->SetGuidance("constant material property SCINTILLATIONRISETIME{1,2,3}"); - fScintFiniteRiseTimeCmd->SetParameterName("FiniteRiseTime", false); - fScintFiniteRiseTimeCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fScintFiniteRiseTimeCmd = new G4UIcmdWithABool( + "/process/optical/scintillation/setFiniteRiseTime", this); + fScintFiniteRiseTimeCmd->SetGuidance( + "Set option of a finite rise-time for G4Scintillation"); + fScintFiniteRiseTimeCmd->SetGuidance( + "If set, the G4Scintillation process expects the user to have set the"); + fScintFiniteRiseTimeCmd->SetGuidance( + "constant material property SCINTILLATIONRISETIME{1,2,3}"); + fScintFiniteRiseTimeCmd->SetParameterName("FiniteRiseTime", false); + fScintFiniteRiseTimeCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fScintStackPhotonsCmd = new G4UIcmdWithABool("/process/optical/scintillation/setStackPhotons", this); - fScintStackPhotonsCmd->SetGuidance("Set whether or not to stack secondary Scintillation photons"); - fScintStackPhotonsCmd->SetParameterName("ScintillationStackPhotons", true); - fScintStackPhotonsCmd->SetDefaultValue(true); - fScintStackPhotonsCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fScintStackPhotonsCmd = new G4UIcmdWithABool( + "/process/optical/scintillation/setStackPhotons", this); + fScintStackPhotonsCmd->SetGuidance( + "Set whether or not to stack secondary Scintillation photons"); + fScintStackPhotonsCmd->SetParameterName("ScintillationStackPhotons", true); + fScintStackPhotonsCmd->SetDefaultValue(true); + fScintStackPhotonsCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fScintTrackSecondariesFirstCmd = new G4UIcmdWithABool("/process/optical/scintillation/setTrackSecondariesFirst", this); - fScintTrackSecondariesFirstCmd->SetGuidance("Whether to track scintillation secondaries before primary."); - fScintTrackSecondariesFirstCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fScintTrackSecondariesFirstCmd = new G4UIcmdWithABool( + "/process/optical/scintillation/setTrackSecondariesFirst", this); + fScintTrackSecondariesFirstCmd->SetGuidance( + "Whether to track scintillation secondaries before primary."); + fScintTrackSecondariesFirstCmd->AvailableForStates(G4State_PreInit, + G4State_Idle); - fScintVerboseLevelCmd = new G4UIcmdWithAnInteger("/process/optical/scintillation/verbose", this); - fScintVerboseLevelCmd->SetGuidance("Verbose level for scintillation process."); - fScintVerboseLevelCmd->SetParameterName("verbose", true); - fScintVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); - fScintVerboseLevelCmd->AvailableForStates(G4State_Idle, G4State_PreInit); + fScintVerboseLevelCmd = + new G4UIcmdWithAnInteger("/process/optical/scintillation/verbose", this); + fScintVerboseLevelCmd->SetGuidance( + "Verbose level for scintillation process."); + fScintVerboseLevelCmd->SetParameterName("verbose", true); + fScintVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); + fScintVerboseLevelCmd->AvailableForStates(G4State_Idle, G4State_PreInit); - // WLS ////////////////////////////////// - fWLSTimeProfileCmd = new G4UIcmdWithAString("/process/optical/wls/setTimeProfile", this); - fWLSTimeProfileCmd->SetGuidance("Set the WLS time profile (delta or exponential)"); - fWLSTimeProfileCmd->SetParameterName("WLSTimeProfile", false); - fWLSTimeProfileCmd->SetCandidates("delta exponential"); - fWLSTimeProfileCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + // WLS ////////////////////////////////// + fWLSTimeProfileCmd = + new G4UIcmdWithAString("/process/optical/wls/setTimeProfile", this); + fWLSTimeProfileCmd->SetGuidance( + "Set the WLS time profile (delta or exponential)"); + fWLSTimeProfileCmd->SetParameterName("WLSTimeProfile", false); + fWLSTimeProfileCmd->SetCandidates("delta exponential"); + fWLSTimeProfileCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fWLSVerboseLevelCmd = new G4UIcmdWithAnInteger("/process/optical/wls/verbose", this); - fWLSVerboseLevelCmd->SetGuidance("Verbose level for WLS process."); - fWLSVerboseLevelCmd->SetParameterName("verbose", true); - fWLSVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); - fWLSVerboseLevelCmd->SetDefaultValue(1); - fWLSVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fWLSVerboseLevelCmd = + new G4UIcmdWithAnInteger("/process/optical/wls/verbose", this); + fWLSVerboseLevelCmd->SetGuidance("Verbose level for WLS process."); + fWLSVerboseLevelCmd->SetParameterName("verbose", true); + fWLSVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); + fWLSVerboseLevelCmd->SetDefaultValue(1); + fWLSVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - // WLS2 ////////////////////////////////// - fWLS2TimeProfileCmd = new G4UIcmdWithAString("/process/optical/wls2/setTimeProfile", this); - fWLS2TimeProfileCmd->SetGuidance("Set the WLS2 time profile (delta or exponential)"); - fWLS2TimeProfileCmd->SetParameterName("WLS2TimeProfile", false); - fWLS2TimeProfileCmd->SetCandidates("delta exponential"); - fWLS2TimeProfileCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + // WLS2 ////////////////////////////////// + fWLS2TimeProfileCmd = + new G4UIcmdWithAString("/process/optical/wls2/setTimeProfile", this); + fWLS2TimeProfileCmd->SetGuidance( + "Set the WLS2 time profile (delta or exponential)"); + fWLS2TimeProfileCmd->SetParameterName("WLS2TimeProfile", false); + fWLS2TimeProfileCmd->SetCandidates("delta exponential"); + fWLS2TimeProfileCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fWLS2VerboseLevelCmd = new G4UIcmdWithAnInteger("/process/optical/wls2/verbose", this); - fWLS2VerboseLevelCmd->SetGuidance("Verbose level for WLS2 process."); - fWLS2VerboseLevelCmd->SetParameterName("verbose", true); - fWLS2VerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); - fWLS2VerboseLevelCmd->SetDefaultValue(1); - fWLS2VerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fWLS2VerboseLevelCmd = + new G4UIcmdWithAnInteger("/process/optical/wls2/verbose", this); + fWLS2VerboseLevelCmd->SetGuidance("Verbose level for WLS2 process."); + fWLS2VerboseLevelCmd->SetParameterName("verbose", true); + fWLS2VerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); + fWLS2VerboseLevelCmd->SetDefaultValue(1); + fWLS2VerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - // boundary ////////////////////////////////////// - fBoundaryInvokeSDCmd = new G4UIcmdWithABool("/process/optical/boundary/setInvokeSD", this); - fBoundaryInvokeSDCmd->SetGuidance("Set option for calling InvokeSD in G4OpBoundaryProcess"); - fBoundaryInvokeSDCmd->SetParameterName("InvokeSD", false); - fBoundaryInvokeSDCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + // boundary ////////////////////////////////////// + fBoundaryInvokeSDCmd = + new G4UIcmdWithABool("/process/optical/boundary/setInvokeSD", this); + fBoundaryInvokeSDCmd->SetGuidance( + "Set option for calling InvokeSD in G4OpBoundaryProcess"); + fBoundaryInvokeSDCmd->SetParameterName("InvokeSD", false); + fBoundaryInvokeSDCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - fBoundaryVerboseLevelCmd = new G4UIcmdWithAnInteger("/process/optical/boundary/verbose", this); - fBoundaryVerboseLevelCmd->SetGuidance("Verbose level for boundary process."); - fBoundaryVerboseLevelCmd->SetParameterName("verbose", true); - fBoundaryVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); - fBoundaryVerboseLevelCmd->SetDefaultValue(1); - fBoundaryVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + fBoundaryVerboseLevelCmd = + new G4UIcmdWithAnInteger("/process/optical/boundary/verbose", this); + fBoundaryVerboseLevelCmd->SetGuidance("Verbose level for boundary process."); + fBoundaryVerboseLevelCmd->SetParameterName("verbose", true); + fBoundaryVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); + fBoundaryVerboseLevelCmd->SetDefaultValue(1); + fBoundaryVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - // absorption ////////////////////////////////////// - fAbsorptionVerboseLevelCmd = new G4UIcmdWithAnInteger("/process/optical/absorption/verbose", this); - fAbsorptionVerboseLevelCmd->SetGuidance("Verbose level for absorption process."); - fAbsorptionVerboseLevelCmd->SetParameterName("verbose", true); - fAbsorptionVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); - fAbsorptionVerboseLevelCmd->SetDefaultValue(1); - fAbsorptionVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + // absorption ////////////////////////////////////// + fAbsorptionVerboseLevelCmd = + new G4UIcmdWithAnInteger("/process/optical/absorption/verbose", this); + fAbsorptionVerboseLevelCmd->SetGuidance( + "Verbose level for absorption process."); + fAbsorptionVerboseLevelCmd->SetParameterName("verbose", true); + fAbsorptionVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); + fAbsorptionVerboseLevelCmd->SetDefaultValue(1); + fAbsorptionVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - // rayleigh ////////////////////////////////////// - fRayleighVerboseLevelCmd = new G4UIcmdWithAnInteger("/process/optical/rayleigh/verbose", this); - fRayleighVerboseLevelCmd->SetGuidance("Verbose level for Rayleigh process."); - fRayleighVerboseLevelCmd->SetParameterName("verbose", true); - fRayleighVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); - fRayleighVerboseLevelCmd->SetDefaultValue(1); - fRayleighVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + // rayleigh ////////////////////////////////////// + fRayleighVerboseLevelCmd = + new G4UIcmdWithAnInteger("/process/optical/rayleigh/verbose", this); + fRayleighVerboseLevelCmd->SetGuidance("Verbose level for Rayleigh process."); + fRayleighVerboseLevelCmd->SetParameterName("verbose", true); + fRayleighVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); + fRayleighVerboseLevelCmd->SetDefaultValue(1); + fRayleighVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); - // mie ////////////////////////////////////// - fMieVerboseLevelCmd = new G4UIcmdWithAnInteger("/process/optical/mie/verbose", this); - fMieVerboseLevelCmd->SetGuidance("Verbose level for Mie process."); - fMieVerboseLevelCmd->SetParameterName("verbose", true); - fMieVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); - fMieVerboseLevelCmd->SetDefaultValue(1); - fMieVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); + // mie ////////////////////////////////////// + fMieVerboseLevelCmd = + new G4UIcmdWithAnInteger("/process/optical/mie/verbose", this); + fMieVerboseLevelCmd->SetGuidance("Verbose level for Mie process."); + fMieVerboseLevelCmd->SetParameterName("verbose", true); + fMieVerboseLevelCmd->SetRange("verbose >= 0 && verbose <= 2"); + fMieVerboseLevelCmd->SetDefaultValue(1); + fMieVerboseLevelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); } G4OpticalParametersMessenger::~G4OpticalParametersMessenger() @@ -269,13 +314,14 @@ G4OpticalParametersMessenger::~G4OpticalParametersMessenger() } void G4OpticalParametersMessenger::SetNewValue(G4UIcommand* command, - G4String newValue) + G4String newValue) { // physics needs to be rebuilt for all commands G4bool physicsModified = true; /// Apply command to the associated object. - if (command == fActivateProcessCmd) { + if(command == fActivateProcessCmd) + { std::istringstream is(newValue.data()); G4String pn; G4String flag; @@ -283,85 +329,112 @@ void G4OpticalParametersMessenger::SetNewValue(G4UIcommand* command, G4bool value = G4UIcommand::ConvertToBool(flag); params->SetProcessActivation(pn, value); } - else if (command == fVerboseCmd) { + else if(command == fVerboseCmd) + { params->SetVerboseLevel(fVerboseCmd->GetNewIntValue(newValue)); } - else if (command == fDumpCmd) { + else if(command == fDumpCmd) + { params->Dump(); } - else if (command == fCerenkovMaxPhotonsCmd) { + else if(command == fCerenkovMaxPhotonsCmd) + { params->SetCerenkovMaxPhotonsPerStep( - fCerenkovMaxPhotonsCmd->GetNewIntValue(newValue)); - G4cout << "Cerenkov max photons: " << params->GetCerenkovMaxPhotonsPerStep() << G4endl; + fCerenkovMaxPhotonsCmd->GetNewIntValue(newValue)); + G4cout << "Cerenkov max photons: " << params->GetCerenkovMaxPhotonsPerStep() + << G4endl; } - else if (command == fCerenkovMaxBetaChangeCmd) { + else if(command == fCerenkovMaxBetaChangeCmd) + { params->SetCerenkovMaxBetaChange( - fCerenkovMaxBetaChangeCmd->GetNewDoubleValue(newValue)); + fCerenkovMaxBetaChangeCmd->GetNewDoubleValue(newValue)); } - else if (command == fCerenkovStackPhotonsCmd) { + else if(command == fCerenkovStackPhotonsCmd) + { params->SetCerenkovStackPhotons( - fCerenkovStackPhotonsCmd->GetNewBoolValue(newValue)); + fCerenkovStackPhotonsCmd->GetNewBoolValue(newValue)); } - else if (command == fCerenkovTrackSecondariesFirstCmd) { + else if(command == fCerenkovTrackSecondariesFirstCmd) + { params->SetCerenkovTrackSecondariesFirst( - fCerenkovTrackSecondariesFirstCmd->GetNewBoolValue(newValue)); + fCerenkovTrackSecondariesFirstCmd->GetNewBoolValue(newValue)); } - else if (command == fCerenkovVerboseLevelCmd) { + else if(command == fCerenkovVerboseLevelCmd) + { params->SetCerenkovVerboseLevel( - fCerenkovVerboseLevelCmd->GetNewIntValue(newValue)); + fCerenkovVerboseLevelCmd->GetNewIntValue(newValue)); } - else if (command == fScintByParticleTypeCmd) { + else if(command == fScintByParticleTypeCmd) + { params->SetScintByParticleType( - fScintByParticleTypeCmd->GetNewBoolValue(newValue)); + fScintByParticleTypeCmd->GetNewBoolValue(newValue)); } - else if (command == fScintTrackInfoCmd) { - params->SetScintTrackInfo( - fScintTrackInfoCmd->GetNewBoolValue(newValue)); + else if(command == fScintTrackInfoCmd) + { + params->SetScintTrackInfo(fScintTrackInfoCmd->GetNewBoolValue(newValue)); } - else if (command == fScintFiniteRiseTimeCmd) { + else if(command == fScintFiniteRiseTimeCmd) + { params->SetScintFiniteRiseTime( - fScintFiniteRiseTimeCmd->GetNewBoolValue(newValue)); + fScintFiniteRiseTimeCmd->GetNewBoolValue(newValue)); } - else if (command == fScintStackPhotonsCmd) { + else if(command == fScintStackPhotonsCmd) + { params->SetScintStackPhotons( - fScintStackPhotonsCmd->GetNewBoolValue(newValue)); + fScintStackPhotonsCmd->GetNewBoolValue(newValue)); } - else if (command == fScintTrackSecondariesFirstCmd) { + else if(command == fScintTrackSecondariesFirstCmd) + { params->SetScintTrackSecondariesFirst( - fScintTrackSecondariesFirstCmd->GetNewBoolValue(newValue)); + fScintTrackSecondariesFirstCmd->GetNewBoolValue(newValue)); } - else if (command == fScintVerboseLevelCmd) { + else if(command == fScintVerboseLevelCmd) + { params->SetScintVerboseLevel( - fScintVerboseLevelCmd->GetNewIntValue(newValue)); + fScintVerboseLevelCmd->GetNewIntValue(newValue)); } - else if (command == fWLSTimeProfileCmd) { + else if(command == fWLSTimeProfileCmd) + { params->SetWLSTimeProfile(newValue); } - else if (command == fWLSVerboseLevelCmd) { + else if(command == fWLSVerboseLevelCmd) + { params->SetWLSVerboseLevel(fWLSVerboseLevelCmd->GetNewIntValue(newValue)); } - else if (command == fWLS2TimeProfileCmd) { + else if(command == fWLS2TimeProfileCmd) + { params->SetWLS2TimeProfile(newValue); } - else if (command == fWLS2VerboseLevelCmd) { + else if(command == fWLS2VerboseLevelCmd) + { params->SetWLS2VerboseLevel(fWLS2VerboseLevelCmd->GetNewIntValue(newValue)); } - else if (command == fAbsorptionVerboseLevelCmd) { - params->SetAbsorptionVerboseLevel(fAbsorptionVerboseLevelCmd->GetNewIntValue(newValue)); + else if(command == fAbsorptionVerboseLevelCmd) + { + params->SetAbsorptionVerboseLevel( + fAbsorptionVerboseLevelCmd->GetNewIntValue(newValue)); } - else if (command == fRayleighVerboseLevelCmd) { - params->SetRayleighVerboseLevel(fRayleighVerboseLevelCmd->GetNewIntValue(newValue)); + else if(command == fRayleighVerboseLevelCmd) + { + params->SetRayleighVerboseLevel( + fRayleighVerboseLevelCmd->GetNewIntValue(newValue)); } - else if (command == fMieVerboseLevelCmd) { + else if(command == fMieVerboseLevelCmd) + { params->SetMieVerboseLevel(fMieVerboseLevelCmd->GetNewIntValue(newValue)); } - else if (command == fBoundaryVerboseLevelCmd) { - params->SetBoundaryVerboseLevel(fBoundaryVerboseLevelCmd->GetNewIntValue(newValue)); + else if(command == fBoundaryVerboseLevelCmd) + { + params->SetBoundaryVerboseLevel( + fBoundaryVerboseLevelCmd->GetNewIntValue(newValue)); } - else if (command == fBoundaryInvokeSDCmd) { - params->SetBoundaryInvokeSD(fBoundaryInvokeSDCmd->GetNewBoolValue(newValue)); + else if(command == fBoundaryInvokeSDCmd) + { + params->SetBoundaryInvokeSD( + fBoundaryInvokeSDCmd->GetNewBoolValue(newValue)); } - if (physicsModified) { + if(physicsModified) + { G4UImanager::GetUIpointer()->ApplyCommand("/run/physicsModified"); } } diff --git a/source/processes/electromagnetic/utils/src/G4VAtomDeexcitation.cc b/source/processes/electromagnetic/utils/src/G4VAtomDeexcitation.cc index 3b3a0f176a..5bcf41d65e 100644 --- a/source/processes/electromagnetic/utils/src/G4VAtomDeexcitation.cc +++ b/source/processes/electromagnetic/utils/src/G4VAtomDeexcitation.cc @@ -59,7 +59,7 @@ #include "G4ElementVector.hh" #include "Randomize.hh" #include "G4VParticleChange.hh" -#include "G4PhysicsModelCatalog.hh" +#include "G4EmSecondaryParticleType.hh" #include "G4Gamma.hh" #include "G4Log.hh" @@ -69,28 +69,11 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -G4int G4VAtomDeexcitation::pixeIDg = -1; -G4int G4VAtomDeexcitation::pixeIDe = -1; - G4VAtomDeexcitation::G4VAtomDeexcitation(const G4String& modname) : name(modname) { vdyn.reserve(5); theCoupleTable = nullptr; - G4String gg = "gammaPIXE"; - G4String ee = "e-PIXE"; - if(pixeIDg < 0) { -#ifdef G4MULTITHREADED - G4MUTEXLOCK(&atomDeexcitationMutex); - if(pixeIDg < 0) { -#endif - pixeIDg = G4PhysicsModelCatalog::Register(gg); - pixeIDe = G4PhysicsModelCatalog::Register(ee); -#ifdef G4MULTITHREADED - } - G4MUTEXUNLOCK(&atomDeexcitationMutex); -#endif - } gamma = G4Gamma::Gamma(); } @@ -121,9 +104,9 @@ void G4VAtomDeexcitation::InitialiseAtomicDeexcitation() // initialisation of flags and options // normally there is no locksed flags - if(!isActiveLocked) { isActive = theParameters->Fluo(); } - if(!isAugerLocked) { flagAuger = theParameters->Auger(); } - if(!isPIXELocked) { flagPIXE = theParameters->Pixe(); } + if(!isActiveLocked) { isActive = theParameters->Fluo(); } + if(!isAugerLocked) { flagAuger = theParameters->Auger(); } + if(!isPIXELocked) { flagPIXE = theParameters->Pixe(); } ignoreCuts = theParameters->DeexcitationIgnoreCut(); // Define list of regions @@ -153,8 +136,8 @@ void G4VAtomDeexcitation::InitialiseAtomicDeexcitation() const G4ProductionCuts* rpcuts = reg->GetProductionCuts(); if(0 < verbose) { G4cout << " " << activeRegions[j] - << " " << deRegions[j] << " " << AugerRegions[j] - << " " << PIXERegions[j] << G4endl; + << " " << deRegions[j] << " " << AugerRegions[j] + << " " << PIXERegions[j] << G4endl; } for(G4int i=0; i* v, - const G4AtomicShell* as, - G4int Z, G4int idx) +void G4VAtomDeexcitation::GenerateParticles(std::vector* v, + const G4AtomicShell* as, + G4int Z, G4int idx) { G4double gCut = DBL_MAX; if(ignoreCuts) { @@ -360,11 +343,10 @@ G4VAtomDeexcitation::AlongStepDeexcitation(std::vector& tracks, // defined secondary type if(dp->GetDefinition() == gamma) { - t->SetCreatorModelIndex(pixeIDg); + t->SetCreatorModelID(_GammaPIXE); } else { - t->SetCreatorModelIndex(pixeIDe); + t->SetCreatorModelID(_ePIXE); } - tracks.push_back(t); } else { delete dp; diff --git a/source/processes/electromagnetic/utils/src/G4VEmModel.cc b/source/processes/electromagnetic/utils/src/G4VEmModel.cc index 6921dbdaca..ad42348879 100644 --- a/source/processes/electromagnetic/utils/src/G4VEmModel.cc +++ b/source/processes/electromagnetic/utils/src/G4VEmModel.cc @@ -362,6 +362,15 @@ void G4VEmModel::DefineForRegion(const G4Region*) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4VEmModel::FillNumberOfSecondaries(G4int& numberOfTriplets, + G4int& numberOfRecoil) +{ + numberOfTriplets = 0; + numberOfRecoil = 0; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + G4double G4VEmModel::ChargeSquareRatio(const G4Track& track) { return GetChargeSquareRatio(track.GetParticleDefinition(), diff --git a/source/processes/electromagnetic/utils/src/G4VEmProcess.cc b/source/processes/electromagnetic/utils/src/G4VEmProcess.cc index 92b0e60b7c..2664e5e281 100644 --- a/source/processes/electromagnetic/utils/src/G4VEmProcess.cc +++ b/source/processes/electromagnetic/utils/src/G4VEmProcess.cc @@ -58,6 +58,7 @@ #include "G4EmDataHandler.hh" #include "G4PhysicsLogVector.hh" #include "G4VParticleChange.hh" +#include "G4PhysicsModelCatalog.hh" #include "G4ProductionCutsTable.hh" #include "G4Region.hh" #include "G4Gamma.hh" @@ -65,6 +66,10 @@ #include "G4Positron.hh" #include "G4PhysicsTableHelper.hh" #include "G4EmBiasingManager.hh" +#include "G4EmParameters.hh" +#include "G4EmProcessSubType.hh" +#include "G4LowEnergyEmProcessSubType.hh" +#include "G4DNAModelSubType.hh" #include "G4GenericIon.hh" #include "G4Log.hh" #include @@ -78,8 +83,8 @@ G4VEmProcess::G4VEmProcess(const G4String& name, G4ProcessType type): SetVerboseLevel(1); // Size of tables - minKinEnergy = 0.1*keV; - maxKinEnergy = 100.0*TeV; + minKinEnergy = 0.1*CLHEP::keV; + maxKinEnergy = 100.0*CLHEP::TeV; // default lambda factor logLambdaFactor = G4Log(lambdaFactor); @@ -99,18 +104,6 @@ G4VEmProcess::G4VEmProcess(const G4String& name, G4ProcessType type): G4LossTableBuilder* bld = lManager->GetTableBuilder(); theDensityFactor = bld->GetDensityFactors(); theDensityIdx = bld->GetCoupleIndexes(); - - if("phot" == GetProcessName() || "compt" == GetProcessName() - || "e-_G4DNAIonisation" == GetProcessName() - || "hydrogen_G4DNAIonisation" == GetProcessName() - || "helium_G4DNAIonisation" == GetProcessName() - || "alpha_G4DNAIonisation" == GetProcessName() - || "alpha+_G4DNAIonisation" == GetProcessName() - || "proton_G4DNAIonisation" == GetProcessName() - || "GenericIon_G4DNAIonisation" == GetProcessName() ) - { - mainSecondaries = 1; - } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -219,7 +212,7 @@ void G4VEmProcess::PreparePhysicsTable(const G4ParticleDefinition& part) if(nullptr == theData) { theData = new G4EmDataHandler(2); } if(fEmOnePeak == fXSType) { if(nullptr == theEnergyOfCrossSectionMax) { - theEnergyOfCrossSectionMax = new std::vector; + theEnergyOfCrossSectionMax = new std::vector; } size_t n = theCoupleTable->GetTableSize(); theEnergyOfCrossSectionMax->resize(n, DBL_MAX); @@ -232,6 +225,21 @@ void G4VEmProcess::PreparePhysicsTable(const G4ParticleDefinition& part) logLambdaFactor = G4Log(lambdaFactor); theParameters->DefineRegParamForEM(this); + // integral option may be disabled + if(!theParameters->Integral()) { fXSType = fEmNoIntegral; } + + // prepare tables + if(buildLambdaTable && isTheMaster){ + theLambdaTable = theData->MakeTable(0); + bld->InitialiseBaseMaterials(theLambdaTable); + } + // high energy table + if(isTheMaster && minKinEnergyPrim < maxKinEnergy){ + theLambdaTablePrim = theData->MakeTable(1); + bld->InitialiseBaseMaterials(theLambdaTablePrim); + } + baseMat = bld->GetBaseMaterialFlag(); + // initialisation of models numberOfModels = modelManager->NumberOfModels(); for(G4int i=0; iSetHighEnergyLimit(maxKinEnergy); } SetEmModel(mod); + mod->SetUseBaseMaterials(baseMat); } if(nullptr != lManager->AtomDeexcitation()) { @@ -251,38 +260,39 @@ void G4VEmProcess::PreparePhysicsTable(const G4ParticleDefinition& part) } fLambdaEnergy = 0.0; - theCuts = modelManager->Initialise(particle,secondaryParticle,1.0,verboseLevel); + theCuts = + modelManager->Initialise(particle,secondaryParticle,1.0,verboseLevel); theCutsGamma = theCoupleTable->GetEnergyCutsVector(idxG4GammaCut); theCutsElectron = theCoupleTable->GetEnergyCutsVector(idxG4ElectronCut); theCutsPositron = theCoupleTable->GetEnergyCutsVector(idxG4PositronCut); - // prepare tables - if(buildLambdaTable && isTheMaster){ - theLambdaTable = theData->MakeTable(0); - bld->InitialiseBaseMaterials(theLambdaTable); - } - // high energy table - if(isTheMaster && minKinEnergyPrim < maxKinEnergy){ - theLambdaTablePrim = theData->MakeTable(1); - bld->InitialiseBaseMaterials(theLambdaTablePrim); - } - bld->InitialiseBaseMaterials(); // forced biasing if(biasManager) { biasManager->Initialise(part,GetProcessName(),verboseLevel); - biasFlag = false; + biasFlag = false; } + // defined ID of secondary particles - G4String nam1 = GetProcessName(); - secID = G4PhysicsModelCatalog::Register(nam1); - if(100 > mainSecondaries) { - G4String nam2 = nam1 + "_fluo" ; - G4String nam3 = nam1 + "_auger"; - G4String nam4 = nam1 + "_split"; - fluoID = G4PhysicsModelCatalog::Register(nam2); - augerID = G4PhysicsModelCatalog::Register(nam3); - biasID = G4PhysicsModelCatalog::Register(nam4); - } + G4int stype = GetProcessSubType(); + if(stype == fAnnihilation) { + secID = _Annihilation; + tripletID = _TripletGamma; + } else if(stype == fGammaConversion) { + secID = _PairProduction; + mainSecondaries = 2; + } else if(stype == fPhotoElectricEffect) { + secID = _PhotoElectron; + } else if(stype == fComptonScattering) { + secID = _ComptonElectron; + } else if(stype >= fLowEnergyElastic) { + secID = fDNAUnknownModel; + } + if(1 < verboseLevel) { + G4cout << "### G4VEmProcess::PreparePhysicsTable() done for " + << GetProcessName() + << " and particle " << part.GetParticleName() + << " baseMat=" << baseMat << G4endl; + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -312,6 +322,7 @@ void G4VEmProcess::BuildPhysicsTable(const G4ParticleDefinition& part) theLambdaTable = masterProc->LambdaTable(); theLambdaTablePrim = masterProc->LambdaTablePrim(); theEnergyOfCrossSectionMax = masterProc->EnergyOfCrossSectionMax(); + baseMat = masterProc->UseBaseMaterial(); // local initialisation of models G4bool printing = true; @@ -320,6 +331,7 @@ void G4VEmProcess::BuildPhysicsTable(const G4ParticleDefinition& part) G4VEmModel* mod0= masterProc->GetModelByIndex(i, printing); //G4cout << i << ". " << mod << " " << mod0 << " " // << particle->GetParticleName() << G4endl; + mod->SetUseBaseMaterials(baseMat); mod->InitialiseLocal(particle, mod0); } // master thread @@ -329,6 +341,8 @@ void G4VEmProcess::BuildPhysicsTable(const G4ParticleDefinition& part) } } } + // protection against double printout + if(theParameters->IsPrintLocked()) { return; } // explicitly defined printout by particle name if(1 < verboseLevel || @@ -349,6 +363,7 @@ void G4VEmProcess::BuildPhysicsTable(const G4ParticleDefinition& part) G4cout << "### G4VEmProcess::BuildPhysicsTable() done for " << GetProcessName() << " and particle " << num + << " baseMat=" << baseMat << G4endl; } } @@ -555,7 +570,7 @@ G4double G4VEmProcess::PostStepGetPhysicalInteractionLength( SelectModel(scaledEnergy, currentCoupleIndex); /* G4cout << "PostStepGetPhysicalInteractionLength: idx= " << currentCoupleIndex - << " couple: " << currentCouple << G4endl; + << " couple: " << currentCouple << G4endl; */ if(!currentModel->IsActive(scaledEnergy)) { theNumberOfInteractionLengthLeft = -1.0; @@ -629,8 +644,8 @@ void G4VEmProcess::ComputeIntegralLambda(G4double e, G4double loge) const G4double epeak = (*theEnergyOfCrossSectionMax)[currentCoupleIndex]; if(e <= epeak) { if(e/lambdaFactor < mfpKinEnergy) { - mfpKinEnergy = e; - preStepLambda = GetCurrentLambda(e, loge); + mfpKinEnergy = e; + preStepLambda = GetCurrentLambda(e, loge); } } else if(e < mfpKinEnergy) { const G4double e1 = std::max(epeak, e*lambdaFactor); @@ -743,6 +758,11 @@ G4VParticleChange* G4VEmProcess::PostStepDoIt(const G4Track& track, fParticleChange.SetNumberOfSecondaries(num); G4double edep = fParticleChange.GetLocalEnergyDeposit(); G4double time = track.GetGlobalTime(); + + G4int n1(0), n2(0); + if(num > mainSecondaries) { + currentModel->FillNumberOfSecondaries(n1, n2); + } for (G4int i=0; iAddSecondary(t); // define type of secondary - if(i < mainSecondaries) { t->SetCreatorModelIndex(secID); } - else if(i < num0) { - if(p == theGamma) { - t->SetCreatorModelIndex(fluoID); - } else { - t->SetCreatorModelIndex(augerID); + if(i < mainSecondaries) { + t->SetCreatorModelID(secID); + if(GetProcessSubType() == fComptonScattering && p == theGamma) { + t->SetCreatorModelID(_ComptonGamma); } + } else if(i < mainSecondaries + n1) { + t->SetCreatorModelID(tripletID); + } else if(i < mainSecondaries + n1 + n2) { + t->SetCreatorModelID(_IonRecoil); } else { - t->SetCreatorModelIndex(biasID); + if(i < num0) { + if(p == theGamma) { + t->SetCreatorModelID(fluoID); + } else { + t->SetCreatorModelID(augerID); + } + } else { + t->SetCreatorModelID(secID); + } } /* G4cout << "Secondary(post step) has weight " << t->GetWeight() @@ -843,11 +873,11 @@ G4bool G4VEmProcess::StorePhysicsTable(const G4ParticleDefinition* part, if ( yes ) { if(0 < verboseLevel) { - G4cout << "Physics table prim is stored for " - << particle->GetParticleName() - << " and process " << GetProcessName() - << " in the directory <" << directory - << "> " << G4endl; + G4cout << "Physics table prim is stored for " + << particle->GetParticleName() + << " and process " << GetProcessName() + << " in the directory <" << directory + << "> " << G4endl; } } else { G4cout << "Fail to store Physics Table Prim for " @@ -892,9 +922,9 @@ G4bool G4VEmProcess::RetrievePhysicsTable(const G4ParticleDefinition* part, << G4endl; } if(splineFlag) { - for(auto & v : *theLambdaTable) { - if(nullptr != v) { v->FillSecondDerivatives(); } - } + for(auto & v : *theLambdaTable) { + if(nullptr != v) { v->FillSecondDerivatives(); } + } } } else { @@ -918,7 +948,7 @@ G4bool G4VEmProcess::RetrievePhysicsTable(const G4ParticleDefinition* part, << G4endl; } for(auto & v : *theLambdaTablePrim) { - if(nullptr != v) { v->FillSecondDerivatives(); } + if(nullptr != v) { v->FillSecondDerivatives(); } } } else { if (1 < verboseLevel) { @@ -1020,7 +1050,7 @@ void G4VEmProcess::FindLambdaMax() emax = e; } else { break; - } + } } } (*theEnergyOfCrossSectionMax)[i] = emax; @@ -1050,7 +1080,7 @@ G4VEmProcess::LambdaPhysicsVector(const G4MaterialCutsCouple* couple) G4PhysicsVector* newv = nullptr; if(nullptr == theLambdaTable) { newv = new G4PhysicsLogVector(minKinEnergy, maxKinEnergy, - nLambdaBins, splineFlag); + nLambdaBins, splineFlag); } else { newv = new G4PhysicsVector(*((*theLambdaTable)[basedCoupleIndex])); } @@ -1191,6 +1221,13 @@ G4VEmProcess::GetLambda(G4double kinEnergy, const G4MaterialCutsCouple* couple) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +G4double G4VEmProcess::PolarAngleLimit() const +{ + return theParameters->MscThetaLimit(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + void G4VEmProcess::PrintWarning(G4String tit, G4double val) { G4String ss = "G4VEmProcess::" + tit; diff --git a/source/processes/electromagnetic/utils/src/G4VEnergyLossProcess.cc b/source/processes/electromagnetic/utils/src/G4VEnergyLossProcess.cc index 944eeb5964..7052e7ece3 100644 --- a/source/processes/electromagnetic/utils/src/G4VEnergyLossProcess.cc +++ b/source/processes/electromagnetic/utils/src/G4VEnergyLossProcess.cc @@ -64,6 +64,7 @@ #include "G4DataVector.hh" #include "G4PhysicsLogVector.hh" #include "G4VParticleChange.hh" +#include "G4PhysicsModelCatalog.hh" #include "G4Gamma.hh" #include "G4Electron.hh" #include "G4Positron.hh" @@ -192,6 +193,7 @@ G4VEnergyLossProcess::~G4VEnergyLossProcess() fXSpeaks = nullptr; } } + secParticles.clear(); delete modelManager; delete biasManager; delete scoffRegions; @@ -237,9 +239,10 @@ void G4VEnergyLossProcess::SetEmModel(G4VEmModel* ptr, G4int) void G4VEnergyLossProcess::SetDynamicMassCharge(G4double massratio, G4double charge2ratio) { - massRatio = massratio; - logMassRatio = G4Log(massRatio); - fFactor = charge2ratio*biasFactor*(*theDensityFactor)[currentCoupleIndex]; + massRatio = massratio; + logMassRatio = G4Log(massRatio); + fFactor = charge2ratio*biasFactor; + if(baseMat) { fFactor *= (*theDensityFactor)[currentCoupleIndex]; } chargeSqRatio = charge2ratio; reduceFactor = 1.0/(fFactor*massRatio); } @@ -263,16 +266,15 @@ G4VEnergyLossProcess::PreparePhysicsTable(const G4ParticleDefinition& part) G4String pname = part.GetParticleName(); if(pname != "deuteron" && pname != "triton" && - pname != "alpha+" && pname != "helium" && - pname != "hydrogen") { + pname != "alpha+" && pname != "alpha") { - if(!theGenericIon) { + if(nullptr == theGenericIon) { theGenericIon = G4ParticleTable::GetParticleTable()->FindParticle("GenericIon"); } isIon = true; - if(theGenericIon && particle != theGenericIon) { - G4ProcessManager* pm = theGenericIon->GetProcessManager(); + if(particle != theGenericIon) { + G4ProcessManager* pm = theGenericIon->GetProcessManager(); G4ProcessVector* v = pm->GetAlongStepProcessVector(); size_t n = v->size(); for(size_t j=0; jFillStepFunction(particle, this); + // integral option may be disabled + if(!theParameters->Integral()) { fXSType = fEmNoIntegral; } + // parameters for scaling from the base particle if (nullptr != baseParticle) { massRatio = (baseParticle->GetPDGMass())/initialMass; @@ -373,13 +379,15 @@ G4VEnergyLossProcess::PreparePhysicsTable(const G4ParticleDefinition& part) G4PhysicsTableHelper::PreparePhysicsTable(theInverseRangeTable); } - const G4ProductionCutsTable* theCoupleTable= - G4ProductionCutsTable::GetProductionCutsTable(); - size_t n = theCoupleTable->GetTableSize(); - if(nullptr == fXSpeaks) { - fXSpeaks = new std::vector; + if(fXSType == fEmTwoPeaks) { + const G4ProductionCutsTable* theCoupleTable= + G4ProductionCutsTable::GetProductionCutsTable(); + size_t n = theCoupleTable->GetTableSize(); + if(nullptr == fXSpeaks) { + fXSpeaks = new std::vector; + } + fXSpeaks->resize(n, nullptr); } - fXSpeaks->resize(n, nullptr); } /* G4cout << "** G4VEnergyLossProcess::PreparePhysicsTable() for " @@ -398,12 +406,15 @@ G4VEnergyLossProcess::PreparePhysicsTable(const G4ParticleDefinition& part) } // defined ID of secondary particles - if(isMaster) { - G4String nam1 = GetProcessName(); - G4String nam4 = nam1 + "_split"; - secID = G4PhysicsModelCatalog::Register(nam1); - biasID = G4PhysicsModelCatalog::Register(nam4); - } + G4int stype = GetProcessSubType(); + if(stype == fBremsstrahlung) { + secID = _Bremsstruhlung; + biasID = _SplitBremsstrahlung; + } else if(stype == fPairProdByCharged) { + secID = _PairProduction; + mainSecondaries = 2; + } + baseMat = bld->GetBaseMaterialFlag(); // initialisation of models numberOfModels = modelManager->NumberOfModels(); @@ -416,6 +427,7 @@ G4VEnergyLossProcess::PreparePhysicsTable(const G4ParticleDefinition& part) if(mod->HighEnergyLimit() > maxKinEnergy) { mod->SetHighEnergyLimit(maxKinEnergy); } + mod->SetUseBaseMaterials(baseMat); SetEmModel(mod); } theCuts = modelManager->Initialise(particle, secondaryParticle, @@ -492,6 +504,7 @@ void G4VEnergyLossProcess::BuildPhysicsTable(const G4ParticleDefinition& part) SetLambdaTable(masterProcess->LambdaTable()); SetTwoPeaksXS(masterProcess->TwoPeaksXS()); isIonisation = masterProcess->IsIonisationProcess(); + baseMat = masterProcess->UseBaseMaterial(); tablesAreBuilt = true; // local initialisation of models @@ -499,6 +512,7 @@ void G4VEnergyLossProcess::BuildPhysicsTable(const G4ParticleDefinition& part) for(G4int i=0; iGetModelByIndex(i, printing); + mod->SetUseBaseMaterials(baseMat); mod->InitialiseLocal(particle, mod0); } lManager->LocalPhysicsTables(particle, this); @@ -507,6 +521,18 @@ void G4VEnergyLossProcess::BuildPhysicsTable(const G4ParticleDefinition& part) // needs to be done only once safetyHelper->InitialiseHelper(); } + // Added tracking cut to avoid tracking artifacts + // and identified deexcitation flag + if(isIonisation) { + atomDeexcitation = lManager->AtomDeexcitation(); + if(nullptr != atomDeexcitation) { + if(atomDeexcitation->IsPIXEActive()) { useDeexcitation = true; } + } + } + + // protection against double printout + if(theParameters->IsPrintLocked()) { return; } + // explicitly defined printout by particle name G4String num = part.GetParticleName(); if(1 < verboseLevel || @@ -516,21 +542,11 @@ void G4VEnergyLossProcess::BuildPhysicsTable(const G4ParticleDefinition& part) num == "pi+" || num == "pi-" || num == "kaon+" || num == "kaon-" || num == "alpha" || num == "anti_proton" || - num == "GenericIon"|| num == "alpha++" || - num == "alpha+" ))) + num == "GenericIon"|| num == "alpha+" ))) { StreamInfo(G4cout, part); } - // Added tracking cut to avoid tracking artifacts - // identify deexcitation flag - if(isIonisation) { - atomDeexcitation = lManager->AtomDeexcitation(); - if(nullptr != atomDeexcitation) { - if(atomDeexcitation->IsPIXEActive()) { useDeexcitation = true; } - } - } - /* G4cout << "** G4VEnergyLossProcess::BuildPhysicsTable() for " << GetProcessName() << " and " << particle->GetParticleName() @@ -546,8 +562,8 @@ void G4VEnergyLossProcess::BuildPhysicsTable(const G4ParticleDefinition& part) G4cout << "### G4VEnergyLossProcess::BuildPhysicsTable() done for " << GetProcessName() << " and particle " << part.GetParticleName(); - if(isIonisation) { G4cout << " isIonisation flag = 1"; } - G4cout << G4endl; + if(isIonisation) { G4cout << " isIonisation flag=1"; } + G4cout << " baseMat=" << baseMat << G4endl; } } @@ -749,7 +765,8 @@ void G4VEnergyLossProcess::StreamInfo(std::ostream& out, } if(2 < verboseLevel) { out << " DEDXTable address= " << theDEDXTable << G4endl; - if(nullptr != theDEDXTable && isIonisation) out << (*theDEDXTable) << G4endl; + if(nullptr != theDEDXTable && isIonisation) + out << (*theDEDXTable) << G4endl; out << "non restricted DEDXTable address= " << theDEDXunRestrictedTable << G4endl; if(nullptr != theDEDXunRestrictedTable && isIonisation) { @@ -810,27 +827,30 @@ G4bool G4VEnergyLossProcess::IsRegionForCubcutProcessor(const G4Track& aTrack) void G4VEnergyLossProcess::StartTracking(G4Track* track) { - /* - G4cout << track->GetDefinition()->GetParticleName() - << " e(MeV)= " << track->GetKineticEnergy() - << " baseParticle " << baseParticle << " proc " << this; - if(particle) G4cout << " " << particle->GetParticleName(); - G4cout << " isIon= " << isIon << " dedx " << theDEDXTable <GetDefinition()->GetParticleName() + << " e(MeV)= " << track->GetKineticEnergy(); + if(particle) G4cout << " " << particle->GetParticleName(); + if(baseParticle) G4cout << " basePart: " << baseParticle->GetParticleName(); + G4cout << " " << GetProcessName(); + if(isIon) G4cout << " isIon: Q=" << track->GetDefinition()->GetPDGCharge() + << " Qdyn=" << track->GetDynamicParticle()->GetCharge(); + G4cout << G4endl; */ // reset parameters for the new track theNumberOfInteractionLengthLeft = -1.0; mfpKinEnergy = DBL_MAX; + currentCouple = nullptr; // reset ion if(isIon) { - chargeSqRatio = 0.5; - const G4double newmass = track->GetDefinition()->GetPDGMass(); - if(baseParticle) { + if(nullptr != baseParticle) { massRatio = baseParticle->GetPDGMass()/newmass; logMassRatio = G4Log(massRatio); - } else if(theGenericIon) { - massRatio = proton_mass_c2/newmass; + } else if(nullptr != theGenericIon) { + massRatio = CLHEP::proton_mass_c2/newmass; logMassRatio = G4Log(massRatio); } else { massRatio = 1.0; @@ -864,13 +884,13 @@ G4double G4VEnergyLossProcess::AlongStepGetPhysicalInteractionLength( /* G4cout << GetProcessName() << ": e= " << preStepKinEnergy <<" range= "<GetName()<GetParticleName() == "e-")G4cout << (*theDEDXTable) <GetWeight() //<< ", kenergy " << t->GetKineticEnergy()/MeV << " MeV" <GetLogKineticEnergy(); G4double lx = GetLambdaForScaledEnergy(postStepScaledEnergy, - logFinalT + logMassRatio); + logFinalT + logMassRatio); lx = std::max(lx, 0.0); // cache cross section useful for the false interaction @@ -1364,6 +1387,11 @@ G4VParticleChange* G4VEnergyLossProcess::PostStepDoIt(const G4Track& track, fParticleChange.SetNumberOfSecondaries(num); G4double time = track.GetGlobalTime(); + G4int n1(0), n2(0); + if(num0 > mainSecondaries) { + currentModel->FillNumberOfSecondaries(n1, n2); + } + for (G4int i=0; iSetWeight(weight); } - if(i < num0) { t->SetCreatorModelIndex(secID); } - else { t->SetCreatorModelIndex(biasID); } + if(i < num0) { + t->SetCreatorModelID(secID); + } else if(i < num0 + n1) { + t->SetCreatorModelID(tripletID); + } else { + t->SetCreatorModelID(biasID); + } //G4cout << "Secondary(post step) has weight " << t->GetWeight() // << ", kenergy " << t->GetKineticEnergy()/MeV << " MeV" @@ -1531,11 +1564,11 @@ G4VEnergyLossProcess::RetrieveTable(const G4ParticleDefinition* part, if(aTable->ExistPhysicsTable(filename)) { if(G4PhysicsTableHelper::RetrievePhysicsTable(aTable,filename,ascii,spline)) { isRetrieved = true; - if(spline) { - for(auto & v : *aTable) { - if(nullptr != v) { v->FillSecondDerivatives(); } - } - } + if(spline) { + for(auto & v : *aTable) { + if(nullptr != v) { v->FillSecondDerivatives(); } + } + } if (0 < verboseLevel) { G4cout << tname << " table for " << part->GetParticleName() << " is Retrieved from <" << filename << ">" @@ -1567,10 +1600,10 @@ G4double G4VEnergyLossProcess::GetDEDXDispersion( G4double ekin = dp->GetKineticEnergy(); SelectModel(ekin*massRatio); G4double tmax = currentModel->MaxSecondaryKinEnergy(dp); - tmax = std::min(tmax,(*theCuts)[currentCoupleIndex]); + G4double tcut = std::min(tmax,(*theCuts)[currentCoupleIndex]); G4double d = 0.0; G4VEmFluctuationModel* fm = currentModel->GetModelOfFluctuations(); - if(nullptr != fm) { d = fm->Dispersion(currentMaterial,dp,tmax,length); } + if(nullptr != fm) { d = fm->Dispersion(currentMaterial,dp,tcut,tmax,length); } return d; } @@ -1589,10 +1622,9 @@ G4VEnergyLossProcess::CrossSectionPerVolume(G4double kineticEnergy, logKineticEnergy + logMassRatio); } else { SelectModel(kineticEnergy*massRatio); - cross = biasFactor*(*theDensityFactor)[currentCoupleIndex] - *(currentModel->CrossSectionPerVolume(currentMaterial, - particle, kineticEnergy, - (*theCuts)[currentCoupleIndex])); + cross = (!baseMat) ? biasFactor : biasFactor*(*theDensityFactor)[currentCoupleIndex]; + cross *= (currentModel->CrossSectionPerVolume(currentMaterial, particle, kineticEnergy, + (*theCuts)[currentCoupleIndex])); } return std::max(cross, 0.0); } @@ -1761,57 +1793,57 @@ void G4VEnergyLossProcess::SetLambdaTable(G4PhysicsTable* p) e1peak = e1deep = e2peak = e2deep = DBL_MAX; if(nullptr != pv) { size_t nb = pv->GetVectorLength(); - for (size_t j=0; jEnergy(j); - ss = (*pv)(j); - // find out 1st peak - if(e1peak == DBL_MAX) { - if(ss >= xs) { - xs = ss; - ee = e; - continue; - } else { - e1peak = ee; - xs1peak = xs; - } - } - // find out the deep - if(e1deep == DBL_MAX) { - if(ss <= xs) { - xs = ss; - ee = e; - continue; - } else { - e1deep = ee; - } - } - // find out 2nd peak - if(e2peak == DBL_MAX) { - if(ss >= xs) { - xs = ss; - ee = e; - continue; - } else { - e2peak = ee; - xs2peak = xs; - } - } - if(e2deep == DBL_MAX) { - if(ss <= xs) { - xs = ss; - ee = e; - continue; - } else { - e2deep = ee; - break; - } - } - } + for (size_t j=0; jEnergy(j); + ss = (*pv)(j); + // find out 1st peak + if(e1peak == DBL_MAX) { + if(ss >= xs) { + xs = ss; + ee = e; + continue; + } else { + e1peak = ee; + xs1peak = xs; + } + } + // find out the deep + if(e1deep == DBL_MAX) { + if(ss <= xs) { + xs = ss; + ee = e; + continue; + } else { + e1deep = ee; + } + } + // find out 2nd peak + if(e2peak == DBL_MAX) { + if(ss >= xs) { + xs = ss; + ee = e; + continue; + } else { + e2peak = ee; + xs2peak = xs; + } + } + if(e2deep == DBL_MAX) { + if(ss <= xs) { + xs = ss; + ee = e; + continue; + } else { + e2deep = ee; + break; + } + } + } } G4TwoPeaksXS* x = (*fXSpeaks)[i]; if(nullptr == x) { - x = new G4TwoPeaksXS(); - (*fXSpeaks)[i] = x; + x = new G4TwoPeaksXS(); + (*fXSpeaks)[i] = x; } x->e1peak = e1peak; x->e1deep = e1deep; @@ -1819,11 +1851,11 @@ void G4VEnergyLossProcess::SetLambdaTable(G4PhysicsTable* p) x->e2deep = e2deep; if(1 < verboseLevel) { - G4cout << "For " << particle->GetParticleName() - << " index= " << i << " data:\n" << " E1peak=" << e1peak - << " xs1= " << xs1peak << " E1deep=" << e1deep - << " E2peak=" << e2peak << " xs2=" << xs2peak - << " E2deep=" << e2deep << G4endl; + G4cout << "For " << particle->GetParticleName() + << " index= " << i << " data:\n" << " E1peak=" << e1peak + << " xs1= " << xs1peak << " E1deep=" << e1deep + << " E2peak=" << e2peak << " xs2=" << xs2peak + << " E2deep=" << e2deep << G4endl; } } // second loop using base materials @@ -1831,16 +1863,16 @@ void G4VEnergyLossProcess::SetLambdaTable(G4PhysicsTable* p) const G4PhysicsVector* pv = (*theLambdaTable)[i]; if (nullptr == pv) { G4int j = (*theDensityIdx)[i]; - G4TwoPeaksXS* x = (*fXSpeaks)[i]; - G4TwoPeaksXS* y = (*fXSpeaks)[j]; - if(nullptr == x) { - x = new G4TwoPeaksXS(); - (*fXSpeaks)[i] = x; - } - x->e1peak = y->e1peak; - x->e1deep = y->e1deep; - x->e2peak = y->e2peak; - x->e2deep = y->e2deep; + G4TwoPeaksXS* x = (*fXSpeaks)[i]; + G4TwoPeaksXS* y = (*fXSpeaks)[j]; + if(nullptr == x) { + x = new G4TwoPeaksXS(); + (*fXSpeaks)[i] = x; + } + x->e1peak = y->e1peak; + x->e1deep = y->e1deep; + x->e2peak = y->e2peak; + x->e2deep = y->e2deep; } } } diff --git a/source/processes/electromagnetic/utils/src/G4VMscModel.cc b/source/processes/electromagnetic/utils/src/G4VMscModel.cc index 28f76b3f1c..7febd18a58 100644 --- a/source/processes/electromagnetic/utils/src/G4VMscModel.cc +++ b/source/processes/electromagnetic/utils/src/G4VMscModel.cc @@ -65,7 +65,6 @@ G4VMscModel::G4VMscModel(const G4String& nam): steppingAlgorithm(fUseSafety) { dedx = 2.0*CLHEP::MeV*CLHEP::cm2/CLHEP::g; - SetUseBaseMaterials(false); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -90,33 +89,22 @@ G4VMscModel::GetParticleChangeForMSC(const G4ParticleDefinition* p) } else { change = new G4ParticleChangeForMSC(); } - if(nullptr != p) { + if(IsMaster() && nullptr != p) { - // table is never built for GenericIon - if(p->GetParticleName() == "GenericIon") { - if(nullptr != xSectionTable) { - xSectionTable->clearAndDestroy(); - delete xSectionTable; - xSectionTable = nullptr; - } - - // table is always built for low mass particles - } else if(p->GetPDGMass() < CLHEP::GeV || ForceBuildTableFlag()) { - // } else if(p->GetPDGMass() < 4.5*CLHEP::GeV || ForceBuildTableFlag()) { + // table is always built for low mass particles + if(p->GetParticleName() != "GenericIon" && + (p->GetPDGMass() < CLHEP::GeV || ForceBuildTableFlag()) ) { G4EmParameters* param = G4EmParameters::Instance(); - idxTable = 0; G4LossTableBuilder* builder = G4LossTableManager::Instance()->GetTableBuilder(); - if(IsMaster()) { - G4double emin = std::max(LowEnergyLimit(), LowEnergyActivationLimit()); - G4double emax = std::min(HighEnergyLimit(), HighEnergyActivationLimit()); - emin = std::max(emin, param->MinKinEnergy()); - emax = std::min(emax, param->MaxKinEnergy()); - if(emin < emax) { - xSectionTable = builder->BuildTableForModel(xSectionTable, this, p, - emin, emax, true); - } + G4double emin = std::max(LowEnergyLimit(), LowEnergyActivationLimit()); + G4double emax = std::min(HighEnergyLimit(), HighEnergyActivationLimit()); + emin = std::max(emin, param->MinKinEnergy()); + emax = std::min(emax, param->MaxKinEnergy()); + if(emin < emax) { + xSectionTable = builder->BuildTableForModel(xSectionTable, this, p, + emin, emax, true); } } } diff --git a/source/processes/electromagnetic/utils/src/G4VMultipleScattering.cc b/source/processes/electromagnetic/utils/src/G4VMultipleScattering.cc index 99d8363ae4..447ef16d08 100644 --- a/source/processes/electromagnetic/utils/src/G4VMultipleScattering.cc +++ b/source/processes/electromagnetic/utils/src/G4VMultipleScattering.cc @@ -77,6 +77,7 @@ #include "G4ParticleTable.hh" #include "G4ProcessVector.hh" #include "G4ProcessManager.hh" +#include "G4LossTableBuilder.hh" #include //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -190,6 +191,9 @@ G4VMultipleScattering::PreparePhysicsTable(const G4ParticleDefinition& part) << " and particle " << part.GetParticleName() << " Nmodels= " << mscModels.size() << " " << this << std::endl; */ + G4LossTableBuilder* bld = emManager->GetTableBuilder(); + baseMat = bld->GetBaseMaterialFlag(); + for(G4int i=0; iHighEnergyLimit(),theParameters->MaxKinEnergy()); msc->SetHighEnergyLimit(emax); + msc->SetUseBaseMaterials(baseMat); } modelManager->Initialise(firstParticle, G4Electron::Electron(), @@ -244,15 +249,19 @@ void G4VMultipleScattering::BuildPhysicsTable(const G4ParticleDefinition& part) << GetProcessName() << " and particle " << num << " Nmod= " << mscModels.size() << " NOT master" << std::endl; */ + baseMat = masterProcess->UseBaseMaterial(); for(G4int i=0; iGetModelByIndex(i); + msc->SetUseBaseMaterials(baseMat); msc->SetCrossSectionTable(msc0->GetCrossSectionTable(), false); msc->InitialiseLocal(firstParticle, msc0); } } } + // protection against double printout + if(theParameters->IsPrintLocked()) { return; } // explicitly defined printout by particle name if(1 < verboseLevel || @@ -339,12 +348,13 @@ G4double G4VMultipleScattering::AlongStepGetPhysicalInteractionLength( if(isIon) { ekin *= proton_mass_c2/track.GetParticleDefinition()->GetPDGMass(); } + const G4MaterialCutsCouple* couple = track.GetMaterialCutsCouple(); // select new model if(1 < numberOfModels) { - currentModel = static_cast( - SelectModel(ekin,track.GetMaterialCutsCouple()->GetIndex())); + currentModel = static_cast(SelectModel(ekin,couple->GetIndex())); } + currentModel->SetCurrentCouple(couple); // msc is active is model is active, energy above the limit, // and step size is above the limit; // if it is active msc may limit the step diff --git a/source/processes/electromagnetic/utils/src/G4ionEffectiveCharge.cc b/source/processes/electromagnetic/utils/src/G4ionEffectiveCharge.cc index 75f586a7ff..51265d1344 100644 --- a/source/processes/electromagnetic/utils/src/G4ionEffectiveCharge.cc +++ b/source/processes/electromagnetic/utils/src/G4ionEffectiveCharge.cc @@ -89,30 +89,28 @@ G4double G4ionEffectiveCharge::EffectiveCharge(const G4ParticleDefinition* p, lastKinEnergy = kineticEnergy; G4double mass = p->GetPDGMass(); - G4double charge = p->GetPDGCharge(); - G4double Zi = charge*inveplus; - + effCharge = p->GetPDGCharge(); + G4int Zi = G4lrint(effCharge*inveplus); chargeCorrection = 1.0; - effCharge = charge; // The aproximation of ion effective charge from: // J.F.Ziegler, J.P. Biersack, U. Littmark // The Stopping and Range of Ions in Matter, // Vol.1, Pergamon Press, 1985 // Fast ions or hadrons - G4double reducedEnergy = kineticEnergy * CLHEP::proton_mass_c2/mass ; + G4double reducedEnergy = kineticEnergy * CLHEP::proton_mass_c2/mass; //G4cout << "e= " << reducedEnergy << " Zi= " << Zi << " " //<< material->GetName() << G4endl; - if(Zi < 1.5 || reducedEnergy > Zi*energyHighLimit ) { - return charge; + if(Zi <= 1 || reducedEnergy > effCharge*energyHighLimit ) { + return effCharge; } - G4double z = material->GetIonisation()->GetZeffective(); + G4double z = material->GetIonisation()->GetZeffective(); reducedEnergy = std::max(reducedEnergy,energyLowLimit); // Helium ion case - if( Zi < 2.5 ) { + if( Zi <= 2 ) { static const G4double c[6] = {0.2865,0.1266,-0.001429,0.02402,-0.01135,0.001475}; @@ -132,13 +130,12 @@ G4double G4ionEffectiveCharge::EffectiveCharge(const G4ParticleDefinition* p, if(tq2 < 0.2) { tt *= (1.0 - tq2 + 0.5*tq2*tq2); } else { tt *= G4Exp(-tq2); } - effCharge = charge*(1.0 + tt) * std::sqrt(ex); + effCharge *= (1.0 + tt) * std::sqrt(ex); // Heavy ion case } else { - G4double y; - G4double zi13 = g4calc->A13(Zi); + G4double zi13 = g4calc->Z13(Zi); G4double zi23 = zi13*zi13; // v1 is ion velocity in vF unit @@ -147,24 +144,18 @@ G4double G4ionEffectiveCharge::EffectiveCharge(const G4ParticleDefinition* p, G4double vFsq = eF/energyBohr; G4double vF = std::sqrt(eF/energyBohr); - // Faster than Fermi velocity - if ( v1sq > 1.0 ) { - y = vF * std::sqrt(v1sq) * ( 1.0 + 0.2/v1sq ) / zi23 ; - + G4double y = ( v1sq > 1.0 ) + // Faster than Fermi velocity + ? vF * std::sqrt(v1sq) * ( 1.0 + 0.2/v1sq ) / zi23 // Slower than Fermi velocity - } else { - y = 0.692308 * vF * (1.0 + 0.666666*v1sq + v1sq*v1sq/15.0) / zi23 ; - } + : 0.692308 * vF * (1.0 + 0.666666*v1sq + v1sq*v1sq/15.0) / zi23; G4double y3 = G4Exp(0.3*G4Log(y)); // G4cout<<"y= "< GeneratePrimaryVertex(anEvent); -} + G4double GetStackFactor(G4double energy, G4double gamma, + G4double varAngle) override; + void ProcessDescription(std::ostream&) const override; + void DumpInfo() const override { ProcessDescription(G4cout); }; +}; + +#endif diff --git a/source/processes/electromagnetic/xrays/include/G4Scintillation.hh b/source/processes/electromagnetic/xrays/include/G4Scintillation.hh index 7972e417c3..68c8b2e312 100644 --- a/source/processes/electromagnetic/xrays/include/G4Scintillation.hh +++ b/source/processes/electromagnetic/xrays/include/G4Scintillation.hh @@ -187,6 +187,9 @@ class G4Scintillation : public G4VRestDiscreteProcess void DumpPhysicsTable() const; // Prints the fast and slow scintillation integral tables. + void SetVerboseLevel(G4int); + // sets verbosity + private: G4PhysicsTable* fIntegralTable1; @@ -215,27 +218,19 @@ class G4Scintillation : public G4VRestDiscreteProcess // emission time distribution when there is a finite rise time G4double sample_time(G4double tau1, G4double tau2); + G4int secID = -1; // creator modelID + }; //////////////////// // Inline methods //////////////////// -inline void G4Scintillation::SetTrackSecondariesFirst(const G4bool state) -{ - fTrackSecondariesFirst = state; -} - inline G4bool G4Scintillation::GetTrackSecondariesFirst() const { return fTrackSecondariesFirst; } -inline void G4Scintillation::SetFiniteRiseTime(const G4bool state) -{ - fFiniteRiseTime = state; -} - inline G4bool G4Scintillation::GetFiniteRiseTime() const { return fFiniteRiseTime; @@ -273,21 +268,11 @@ inline G4bool G4Scintillation::GetScintillationByParticleType() const return fScintillationByParticleType; } -inline void G4Scintillation::SetScintillationTrackInfo(const G4bool trackType) -{ - fScintillationTrackInfo = trackType; -} - inline G4bool G4Scintillation::GetScintillationTrackInfo() const { return fScintillationTrackInfo; } -inline void G4Scintillation::SetStackPhotons(const G4bool stackingFlag) -{ - fStackingFlag = stackingFlag; -} - inline G4bool G4Scintillation::GetStackPhotons() const { return fStackingFlag; } inline G4int G4Scintillation::GetNumPhotons() const { return fNumPhotons; } diff --git a/source/processes/electromagnetic/xrays/include/G4SynchrotronRadiation.hh b/source/processes/electromagnetic/xrays/include/G4SynchrotronRadiation.hh index a233ae140c..a8931f190d 100644 --- a/source/processes/electromagnetic/xrays/include/G4SynchrotronRadiation.hh +++ b/source/processes/electromagnetic/xrays/include/G4SynchrotronRadiation.hh @@ -90,6 +90,8 @@ class G4SynchrotronRadiation : public G4VDiscreteProcess G4bool FirstTime; G4bool FirstTime1; + + G4int secID = -1; // creator modelID }; ////////////////////////// INLINE METHODS ///////////////////////////// diff --git a/source/processes/electromagnetic/xrays/include/G4SynchrotronRadiationInMat.hh b/source/processes/electromagnetic/xrays/include/G4SynchrotronRadiationInMat.hh index d78b4ff5b6..1d7776c014 100644 --- a/source/processes/electromagnetic/xrays/include/G4SynchrotronRadiationInMat.hh +++ b/source/processes/electromagnetic/xrays/include/G4SynchrotronRadiationInMat.hh @@ -138,6 +138,8 @@ class G4SynchrotronRadiationInMat : public G4VDiscreteProcess G4int fRootNumber; G4int fVerboseLevel; + + G4int secID = -1; // creator modelID }; #endif // end of G4SynchrotronRadiationInMat.hh diff --git a/source/processes/electromagnetic/xrays/include/G4VXTRenergyLoss.hh b/source/processes/electromagnetic/xrays/include/G4VXTRenergyLoss.hh index 3cb6da07fd..a151d8457b 100644 --- a/source/processes/electromagnetic/xrays/include/G4VXTRenergyLoss.hh +++ b/source/processes/electromagnetic/xrays/include/G4VXTRenergyLoss.hh @@ -30,11 +30,11 @@ // method // // History: -// 06.10.05 V. Grichine first step to discrete process -// 15.01.02 V. Grichine first version +// 06.10.05 V. Grichine first step to discrete process +// 15.01.02 V. Grichine first version // 28.07.05, P.Gumplinger add G4ProcessType to constructor // 28.09.07, V.Ivanchenko general cleanup without change of algorithms -// +// 19.09.21, V. Grichine, set/get functions for angle anf energy ranges and number of bins #ifndef G4VXTRenergyLoss_h #define G4VXTRenergyLoss_h 1 @@ -140,18 +140,53 @@ class G4VXTRenergyLoss : public G4VDiscreteProcess G4double GetRandomAngle(G4double energyXTR, G4int iTkin); G4double GetAngleXTR(G4int iTR, G4double position, G4int iAngle); - G4double GetGamma() { return fGamma; }; - G4double GetEnergy() { return fEnergy; }; - G4double GetVarAngle() { return fVarAngle; }; + // set/get methods for class fields - void SetGamma(G4double gamma) { fGamma = gamma; }; - void SetEnergy(G4double energy) { fEnergy = energy; }; - void SetVarAngle(G4double varAngle) { fVarAngle = varAngle; }; - void SetAngleRadDistr(G4bool pAngleRadDistr) - { - fAngleRadDistr = pAngleRadDistr; - }; - void SetCompton(G4bool pC) { fCompton = pC; }; + void SetGamma(G4double gamma) { fGamma = gamma; }; + G4double GetGamma() { return fGamma; }; + void SetEnergy(G4double energy) { fEnergy = energy; }; + G4double GetEnergy() { return fEnergy; }; + void SetVarAngle(G4double varAngle) { fVarAngle = varAngle; }; + G4double GetVarAngle() { return fVarAngle; }; + void SetCompton(G4bool pC) { fCompton = pC; }; + G4bool GetCompton() { return fCompton; }; + + + + void SetAlphaGas(G4double ag){ fAlphaGas = ag;}; + G4double GetAlphaGas() { return fAlphaGas; }; + void SetAlphaPlate(G4double ap){ fAlphaPlate = ap;}; + G4double GetAlphaPlate() { return fAlphaPlate; }; + + void SetTheMinEnergyTR(G4double minetr){ fTheMinEnergyTR = minetr;}; + G4double GetTheMinEnergyTR() { return fTheMinEnergyTR; }; + void SetTheMaxEnergyTR(G4double maxetr){ fTheMaxEnergyTR = maxetr;}; + G4double GetTheMaxEnergyTR() { return fTheMaxEnergyTR; }; + + void SetMinEnergyTR(G4double minetr){ fMinEnergyTR = minetr;}; + G4double GetMinEnergyTR() { return fMinEnergyTR; }; + void SetMaxEnergyTR(G4double maxetr){ fMaxEnergyTR = maxetr;}; + G4double GetMaxEnergyTR() { return fMaxEnergyTR; }; + + void SetTheMinAngle(G4double minang){ fTheMinAngle = minang;}; + G4double GetTheMinAngle() { return fTheMinAngle; }; + void SetTheMaxAngle(G4double maxang){ fTheMaxAngle = maxang;}; + G4double GetTheMaxAngle() { return fTheMaxAngle; }; + + void SetMinThetaTR(G4double minatr){ fMinThetaTR = minatr;}; + G4double GetMinThetaTR() { return fMinThetaTR; }; + void SetMaxThetaTR(G4double maxatr){ fMaxThetaTR = maxatr;}; + G4double GetMaxThetaTR() { return fMaxThetaTR; }; + + // modes of XTR angle distribution + + void SetFastAngle(G4bool fatr){ fFastAngle = fatr;}; + G4bool GetFastAngle() { return fFastAngle; }; + void SetAngleRadDistr(G4bool fatr){ fAngleRadDistr = fatr;}; + G4bool GetAngleRadDistr() { return fAngleRadDistr; }; + + + G4PhysicsLogVector* GetProtonVector() { return fProtonEnergyVector; }; G4int GetTotBin() { return fTotBin; }; @@ -159,11 +194,14 @@ class G4VXTRenergyLoss : public G4VDiscreteProcess protected: // min TR energy - static constexpr G4double fTheMinEnergyTR = 1. * CLHEP::keV; + G4double fTheMinEnergyTR; // max TR energy - static constexpr G4double fTheMaxEnergyTR = 100. * CLHEP::keV; - static constexpr G4double fTheMinAngle = 1.e-3; // min theta of TR quanta - static constexpr G4double fTheMaxAngle = 1.e-2; // max theta of TR quanta + G4double fTheMaxEnergyTR; + G4double fTheMinAngle; // min theta of TR quanta + G4double fTheMaxAngle; // 1.e-4; // max theta of TR quanta + + // static const members + // min Tkin of proton in tables static constexpr G4double fMinProtonTkin = 100. * CLHEP::GeV; // max Tkin of proton in tables @@ -174,8 +212,8 @@ class G4VXTRenergyLoss : public G4VDiscreteProcess CLHEP::hbarc / CLHEP::electron_mass_c2; static constexpr G4double fCofTR = CLHEP::fine_structure_const / CLHEP::pi; - static constexpr G4int fBinTR = 200; // number of bins in TR vectors - static constexpr G4int fTotBin = 50; // number of bins in log scale + G4int fTotBin; // number of bins in log-gamma scale + G4int fBinTR; // number of bins in TR energy-angle vectors G4ParticleDefinition* fPtrGamma; // pointer to TR photon @@ -195,7 +233,7 @@ class G4VXTRenergyLoss : public G4VDiscreteProcess G4double fGammaTkinCut; // Tkin cut of TR photon in current mat. G4double fMinEnergyTR; // min TR energy in material G4double fMaxEnergyTR; // max TR energy in material - G4double fMaxThetaTR; // max theta of TR quanta + G4double fMinThetaTR, fMaxThetaTR; // min-max theta of TR quanta G4double fTotalDist; G4double fPlateThick; G4double fGasThick; @@ -203,7 +241,7 @@ class G4VXTRenergyLoss : public G4VDiscreteProcess G4double fAlphaGas; G4double fGamma; // current Lorentz factor G4double fEnergy; // energy and - G4double fVarAngle; // angle squared + G4double fVarAngle; // angle squared! G4double fLambda; G4double fSigma1; G4double fSigma2; // plasma energy Sq of matter1/2 @@ -213,8 +251,10 @@ class G4VXTRenergyLoss : public G4VDiscreteProcess G4int fPlateNumber; G4bool fExitFlux; - G4bool fAngleRadDistr; + G4bool fFastAngle, fAngleRadDistr; G4bool fCompton; + + G4int secID = -1; // creator modelID }; #endif diff --git a/source/processes/electromagnetic/xrays/sources.cmake b/source/processes/electromagnetic/xrays/sources.cmake index 17442aeb6e..42a5e45529 100644 --- a/source/processes/electromagnetic/xrays/sources.cmake +++ b/source/processes/electromagnetic/xrays/sources.cmake @@ -6,6 +6,7 @@ geant4_add_module(G4xrays G4Cerenkov.hh G4ForwardXrayTR.hh G4GammaXTRadiator.hh + G4GaussXTRadiator.hh G4RegularXTRadiator.hh G4Scintillation.hh G4ScintillationTrackInformation.hh @@ -24,6 +25,7 @@ geant4_add_module(G4xrays G4Cerenkov.cc G4ForwardXrayTR.cc G4GammaXTRadiator.cc + G4GaussXTRadiator.cc G4RegularXTRadiator.cc G4Scintillation.cc G4ScintillationTrackInformation.cc diff --git a/source/processes/electromagnetic/xrays/src/G4Cerenkov.cc b/source/processes/electromagnetic/xrays/src/G4Cerenkov.cc index 84cf7e20c4..e25d029eee 100644 --- a/source/processes/electromagnetic/xrays/src/G4Cerenkov.cc +++ b/source/processes/electromagnetic/xrays/src/G4Cerenkov.cc @@ -73,12 +73,14 @@ #include "G4SystemOfUnits.hh" #include "G4ThreeVector.hh" #include "Randomize.hh" +#include "G4PhysicsModelCatalog.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4Cerenkov::G4Cerenkov(const G4String& processName, G4ProcessType type) : G4VProcess(processName, type) , fNumPhotons(0) { + secID = G4PhysicsModelCatalog::GetModelID("model_Cerenkov"); SetProcessSubType(fCerenkov); thePhysicsTable = nullptr; @@ -110,7 +112,8 @@ void G4Cerenkov::ProcessDescription(std::ostream& out) const G4OpticalParameters* params = G4OpticalParameters::Instance(); out << "Maximum beta change per step: " << params->GetCerenkovMaxBetaChange(); out << "Maximum photons per step: " << params->GetCerenkovMaxPhotonsPerStep(); - out << "Track secondaries first: " << params->GetCerenkovTrackSecondariesFirst(); + out << "Track secondaries first: " + << params->GetCerenkovTrackSecondariesFirst(); out << "Stack photons: " << params->GetCerenkovStackPhotons(); out << "Verbose level: " << params->GetCerenkovVerboseLevel(); } @@ -155,12 +158,12 @@ void G4Cerenkov::BuildPhysicsTable(const G4ParticleDefinition&) // Retrieve vector of refraction indices for the material // from the material's optical properties table - G4Material* aMaterial = (*theMaterialTable)[i]; + G4Material* aMaterial = (*theMaterialTable)[i]; G4MaterialPropertiesTable* MPT = aMaterial->GetMaterialPropertiesTable(); if(MPT) { - cerenkovIntegral = new G4PhysicsFreeVector(); + cerenkovIntegral = new G4PhysicsFreeVector(); G4MaterialPropertyVector* refractiveIndex = MPT->GetProperty(kRINDEX); if(refractiveIndex) @@ -273,8 +276,8 @@ G4VParticleChange* G4Cerenkov::PostStepDoIt(const G4Track& aTrack, } //////////////////////////////////////////////////////////////// - G4double Pmin = Rindex->GetMinLowEdgeEnergy(); - G4double Pmax = Rindex->GetMaxLowEdgeEnergy(); + G4double Pmin = Rindex->Energy(0); + G4double Pmax = Rindex->GetMaxEnergy(); G4double dp = Pmax - Pmin; G4double nMax = Rindex->GetMaxValue(); @@ -369,6 +372,7 @@ G4VParticleChange* G4Cerenkov::PostStepDoIt(const G4Track& aTrack, aSecondaryTrack->SetTouchableHandle( aStep.GetPreStepPoint()->GetTouchableHandle()); aSecondaryTrack->SetParentID(aTrack.GetTrackID()); + aSecondaryTrack->SetCreatorModelID(secID); aParticleChange.AddSecondary(aSecondaryTrack); } @@ -454,9 +458,10 @@ G4double G4Cerenkov::PostStepGetPhysicalInteractionLength( particleType, kineticEnergy, couple); G4double Step = Range - RangeMin; - // If the step is smaller than 1e-15 mm, it may happen that the particle - // does not move. See bug 1992. - if(Step < 1.e-15 * mm) + // If the step is smaller than G4ThreeVector::getTolerance(), it may happen + // that the particle does not move. See bug 1992. + static const G4double minAllowedStep = G4ThreeVector::getTolerance(); + if(Step < minAllowedStep) return StepLimit; if(Step < StepLimit) @@ -512,22 +517,22 @@ G4double G4Cerenkov::GetAverageNumberOfPhotons( G4int materialIndex = aMaterial->GetIndex(); // Retrieve the Cerenkov Angle Integrals for this material - G4PhysicsFreeVector* CerenkovAngleIntegrals = - (G4PhysicsFreeVector*) ((*thePhysicsTable)(materialIndex)); + G4PhysicsVector* CerenkovAngleIntegrals = ((*thePhysicsTable)(materialIndex)); - if(!(CerenkovAngleIntegrals->IsFilledVectorExist())) + G4int length = CerenkovAngleIntegrals->GetVectorLength(); + if(0 == length) return 0.0; // Min and Max photon energies - G4double Pmin = Rindex->GetMinLowEdgeEnergy(); - G4double Pmax = Rindex->GetMaxLowEdgeEnergy(); + G4double Pmin = Rindex->Energy(0); + G4double Pmax = Rindex->GetMaxEnergy(); // Min and Max Refraction Indices G4double nMin = Rindex->GetMinValue(); G4double nMax = Rindex->GetMaxValue(); // Max Cerenkov Angle Integral - G4double CAImax = CerenkovAngleIntegrals->GetMaxValue(); + G4double CAImax = (*CerenkovAngleIntegrals)[length - 1]; G4double dp, ge; // If n(Pmax) < 1/Beta -- no photons generated @@ -571,18 +576,28 @@ G4double G4Cerenkov::GetAverageNumberOfPhotons( void G4Cerenkov::SetTrackSecondariesFirst(const G4bool state) { fTrackSecondariesFirst = state; + G4OpticalParameters::Instance()->SetCerenkovTrackSecondariesFirst( + fTrackSecondariesFirst); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4Cerenkov::SetMaxBetaChangePerStep(const G4double value) { fMaxBetaChange = value * CLHEP::perCent; + G4OpticalParameters::Instance()->SetCerenkovMaxBetaChange(fMaxBetaChange); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4Cerenkov::SetMaxNumPhotonsPerStep(const G4int NumPhotons) { fMaxPhotons = NumPhotons; + G4OpticalParameters::Instance()->SetCerenkovMaxPhotonsPerStep(fMaxPhotons); +} + +void G4Cerenkov::SetStackPhotons(const G4bool stackingFlag) +{ + fStackingFlag = stackingFlag; + G4OpticalParameters::Instance()->SetCerenkovStackPhotons(fStackingFlag); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -591,6 +606,13 @@ void G4Cerenkov::DumpPhysicsTable() const G4cout << "Dump Physics Table!" << G4endl; for(size_t i = 0; i < thePhysicsTable->entries(); ++i) { - ((G4PhysicsFreeVector*) (*thePhysicsTable)[i])->DumpValues(); + (*thePhysicsTable)[i]->DumpValues(); } } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4Cerenkov::SetVerboseLevel(G4int verbose) +{ + verboseLevel = verbose; + G4OpticalParameters::Instance()->SetCerenkovVerboseLevel(verboseLevel); +} diff --git a/source/processes/electromagnetic/xrays/src/G4ForwardXrayTR.cc b/source/processes/electromagnetic/xrays/src/G4ForwardXrayTR.cc index 4e34cb8925..de5c815960 100644 --- a/source/processes/electromagnetic/xrays/src/G4ForwardXrayTR.cc +++ b/source/processes/electromagnetic/xrays/src/G4ForwardXrayTR.cc @@ -44,6 +44,7 @@ #include "G4Poisson.hh" #include "G4ProductionCutsTable.hh" #include "G4SystemOfUnits.hh" +#include "G4PhysicsModelCatalog.hh" ////////////////////////////////////////////////////////////////////// // @@ -58,6 +59,7 @@ G4ForwardXrayTR::G4ForwardXrayTR(const G4String& matName1, const G4String& processName) : G4TransitionRadiation(processName) { + secID = G4PhysicsModelCatalog::GetModelID("model_XrayTR"); fPtrGamma = nullptr; fGammaCutInKineticEnergy = nullptr; fGammaTkinCut = fMinEnergyTR = fMaxEnergyTR = fMaxThetaTR = 0.0; @@ -532,7 +534,13 @@ G4VParticleChange* G4ForwardXrayTR::PostStepDoIt(const G4Track& aTrack, directionTR.rotateUz(particleDir); G4DynamicParticle* aPhotonTR = new G4DynamicParticle(G4Gamma::Gamma(), directionTR, energyTR); - aParticleChange.AddSecondary(aPhotonTR); + + // Create the G4Track + G4Track* aSecondaryTrack = new G4Track(aPhotonTR, aTrack.GetGlobalTime(), aTrack.GetPosition()); + aSecondaryTrack->SetTouchableHandle(aStep.GetPostStepPoint()->GetTouchableHandle()); + aSecondaryTrack->SetParentID(aTrack.GetTrackID()); + aSecondaryTrack->SetCreatorModelID(secID); + aParticleChange.AddSecondary(aSecondaryTrack); } } } @@ -607,7 +615,13 @@ G4VParticleChange* G4ForwardXrayTR::PostStepDoIt(const G4Track& aTrack, directionTR.rotateUz(particleDir); G4DynamicParticle* aPhotonTR = new G4DynamicParticle(G4Gamma::Gamma(), directionTR, energyTR); - aParticleChange.AddSecondary(aPhotonTR); + + // Create the G4Track + G4Track* aSecondaryTrack = new G4Track(aPhotonTR, aTrack.GetGlobalTime(), aTrack.GetPosition()); + aSecondaryTrack->SetTouchableHandle(aStep.GetPostStepPoint()->GetTouchableHandle()); + aSecondaryTrack->SetParentID(aTrack.GetTrackID()); + aSecondaryTrack->SetCreatorModelID(secID); + aParticleChange.AddSecondary(aSecondaryTrack); } } } diff --git a/source/processes/electromagnetic/xrays/src/G4GaussXTRadiator.cc b/source/processes/electromagnetic/xrays/src/G4GaussXTRadiator.cc new file mode 100644 index 0000000000..fbbbb4e4b3 --- /dev/null +++ b/source/processes/electromagnetic/xrays/src/G4GaussXTRadiator.cc @@ -0,0 +1,218 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// 19.09.21 V. Grichine, first version +// + +#include "G4GaussXTRadiator.hh" + +#include "G4PhysicalConstants.hh" + +//////////////////////////////////////////////////////////////////////////// +// Constructor, destructor + +G4GaussXTRadiator::G4GaussXTRadiator( + G4LogicalVolume* anEnvelope, G4double alphaPlate, G4double alphaGas, G4Material* foilMat, G4Material* gasMat, + G4double a, G4double b, G4int n, const G4String& processName) + : G4VXTRenergyLoss(anEnvelope, foilMat, gasMat, a, b, n, processName) +{ + if(verboseLevel > 0) + G4cout << "Gauss X-ray TR radiator EM process is called" + << G4endl; + + fAlphaPlate = alphaPlate; + fAlphaGas = alphaGas; // 1000; // +} + +/////////////////////////////////////////////////////////////////////////// +G4GaussXTRadiator::~G4GaussXTRadiator() {} + +/////////////////////////////////////////////////////////////////////////// +void G4GaussXTRadiator::ProcessDescription(std::ostream& out) const +{ + out << "Simulation of forward X-ray transition radiation generated by\n" + "relativistic charged particles crossing the interface between\n" + "two materials.\n"; +} + +/////////////////////////////////////////////////////////////////////////// +G4double G4GaussXTRadiator::SpectralXTRdEdx(G4double energy) +{ + G4double result, sum = 0., tmp, cof1, cof2, cofMin, cofPHC, theta2, theta2k; + G4int k, kMax, kMin; + + cofPHC = 4. * pi * hbarc; + tmp = (fSigma1 - fSigma2) / cofPHC / energy; + cof1 = fPlateThick * tmp; + cof2 = fGasThick * tmp; + + cofMin = energy * (fPlateThick + fGasThick) / fGamma / fGamma; + cofMin += (fPlateThick * fSigma1 + fGasThick * fSigma2) / energy; + cofMin /= cofPHC; + + theta2 = cofPHC / (energy * (fPlateThick + fGasThick)); + + kMin = G4int(cofMin); + if(cofMin > kMin) + kMin++; + + kMax = kMin + 49; + + if(verboseLevel > 2) + { + G4cout << cof1 << " " << cof2 << " " << cofMin << G4endl; + G4cout << "kMin = " << kMin << "; kMax = " << kMax << G4endl; + } + for(k = kMin; k <= kMax; ++k) + { + tmp = pi * fPlateThick * (k + cof2) / (fPlateThick + fGasThick); + result = (k - cof1) * (k - cof1) * (k + cof2) * (k + cof2); + if(k == kMin && kMin == G4int(cofMin)) + { + sum += + 0.5 * std::sin(tmp) * std::sin(tmp) * std::abs(k - cofMin) / result; + } + else + { + sum += std::sin(tmp) * std::sin(tmp) * std::abs(k - cofMin) / result; + } + theta2k = std::sqrt(theta2 * std::abs(k - cofMin)); + + if(verboseLevel > 2) + { + G4cout << k << " " << theta2k << " " + << std::sin(tmp) * std::sin(tmp) * std::abs(k - cofMin) / result + << " " << sum << G4endl; + } + } + result = 4. * (cof1 + cof2) * (cof1 + cof2) * sum / energy; + result *= fPlateNumber; + + return result; +} + +/////////////////////////////////////////////////////////////////////////// +// +// Approximation for radiator interference factor for the case of +// Gauss-distributed regular radiator. The plate and gas gap thicknesses are Gauss distributed with RMS +// sa and sb for plate and gas, respectively. +// The mean values of the plate and gas gap thicknesses +// are supposed to be about XTR formation zones. + + +G4double G4GaussXTRadiator::GetStackFactor(G4double energy, + G4double gamma, + G4double varAngle) +{ + G4double result, Qa, Qb, Q, Qn, aZa, bZb, aMa, bMb; + + G4double Ma, Mb, Za, Zb; + + G4double sa = fPlateThick/fAlphaPlate; + G4double sb = fGasThick/fAlphaGas; + + Za = GetPlateFormationZone(energy, gamma, varAngle); + + aZa = fPlateThick / Za ; + + Zb = GetGasFormationZone(energy, gamma, varAngle); + + bZb = fGasThick / Zb ; + + Ma = GetPlateLinearPhotoAbs(energy); + + aMa = fPlateThick * Ma; + + Mb = GetGasLinearPhotoAbs(energy); + + bMb = fGasThick * Mb; + + // Gauss fluctuation of gas gaps according to RMS = sb = b/fAlphaGas + + G4double gre, gim, pre, pim; + + pre = -0.5 * aMa - sa * sa * ( 4./ Za / Za - Ma*Ma )/8.; + + gre = -0.5 * bMb - sb * sb * ( 4./ Zb / Zb - Mb*Mb )/8.; + + pim = sa * sa * Ma/2./Za - aZa; + + gim = sb * sb * Mb/2./Zb - bZb; + + Qa = std::exp(pre); + + Qb = std::exp(gre); + + // Q = Qa * Qb; + + G4complex Ha( Qa * std::cos(pim), Qa * std::sin(pim) ); + + G4complex Hb( Qb * std::cos(gim), Qb * std::sin(gim) ); + + G4double hre, him, hnre, hnim; + + hre = pre + gre; + + him = pim + gim; + + G4double nn = G4double(fPlateNumber); + + hnre = nn*hre; + + hnim = nn*him; + + Q = std::exp(hre); + + Qn = std::exp(hnre); + + + // G4complex H = Ha * Hb; + + + G4complex H( Q * std::cos(him), Q * std::sin(him) ); + G4complex Hn( Qn * std::cos(hnim), Qn * std::sin(hnim) ); + + // G4complex Hs = conj(H); + + // G4double sigma, D; + + // sigma = aMa * fPlateThick + bMb * fGasThick; + + // D = 1.0 / ((1 - Q) * (1 - Q) + 4 * Q * std::sin(0.5 * (aZa + bZb)) * std::sin(0.5 * (aZa + bZb))); + + // G4complex F1 = ( 1.0 - Ha ) * ( 1.0 - Hb ) * ( 1.0 - Hs ) * G4double(fPlateNumber) * D; + + G4complex F1 = ( 1.0 - Ha ) * ( 1.0 - Hb ) * nn / ( 1. - H ); + + // G4complex F2 = ( 1.0 - Ha ) * ( 1.0 - Ha ) * Hb * ( 1.0 - Hs ) * ( 1.0 - Hs ) * (1.0 - std::exp( -0.5 * fPlateNumber * sigma) ) * D * D; + + G4complex F2 = ( 1.0 - Ha ) * ( 1.0 - Ha ) * Hb * ( 1. - Hn ) / ( 1. - H ) / ( 1. - H ); + + G4complex R = (F1 + F2) * OneInterfaceXTRdEdx(energy, gamma, varAngle); + + result = 2.0 * std::real(R); + + return result; +} diff --git a/source/processes/electromagnetic/xrays/src/G4Scintillation.cc b/source/processes/electromagnetic/xrays/src/G4Scintillation.cc index 53b9975319..58cce26daf 100644 --- a/source/processes/electromagnetic/xrays/src/G4Scintillation.cc +++ b/source/processes/electromagnetic/xrays/src/G4Scintillation.cc @@ -82,6 +82,7 @@ #include "G4SystemOfUnits.hh" #include "G4ThreeVector.hh" #include "Randomize.hh" +#include "G4PhysicsModelCatalog.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4Scintillation::G4Scintillation(const G4String& processName, @@ -93,6 +94,7 @@ G4Scintillation::G4Scintillation(const G4String& processName, , fEmSaturation(nullptr) , fNumPhotons(0) { + secID = G4PhysicsModelCatalog::GetModelID("model_Scintillation"); SetProcessSubType(fScintillation); #ifdef G4DEBUG_SCINTILLATION @@ -147,9 +149,9 @@ void G4Scintillation::ProcessDescription(std::ostream& out) const //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4bool G4Scintillation::IsApplicable(const G4ParticleDefinition& aParticleType) { - if (aParticleType.GetParticleName() == "opticalphoton") + if(aParticleType.GetParticleName() == "opticalphoton") return false; - if (aParticleType.IsShortLived()) + if(aParticleType.IsShortLived()) return false; return true; } @@ -218,7 +220,8 @@ void G4Scintillation::BuildPhysicsTable(const G4ParticleDefinition&) if(MPT) { - G4MaterialPropertyVector* MPV = MPT->GetProperty(kSCINTILLATIONCOMPONENT1); + G4MaterialPropertyVector* MPV = + MPT->GetProperty(kSCINTILLATIONCOMPONENT1); if(MPV) { // Retrieve the first intensity point in vector @@ -387,7 +390,6 @@ G4VParticleChange* G4Scintillation::PostStepDoIt(const G4Track& aTrack, G4double yield3 = 0.; G4double sum_yields = 0.; - if(fScintillationByParticleType) { MeanNumberOfPhotons = GetScintillationYieldByParticleType( @@ -406,8 +408,7 @@ G4VParticleChange* G4Scintillation::PostStepDoIt(const G4Track& aTrack, : 0.; // The default linear scintillation process // Units: [# scintillation photons / MeV] - MeanNumberOfPhotons = - MPT->GetConstProperty(kSCINTILLATIONYIELD); + MeanNumberOfPhotons = MPT->GetConstProperty(kSCINTILLATIONYIELD); // Birk's correction via fEmSaturation and specifying scintillation by // by particle type are physically mutually exclusive if(fEmSaturation) @@ -418,7 +419,6 @@ G4VParticleChange* G4Scintillation::PostStepDoIt(const G4Track& aTrack, } sum_yields = yield1 + yield2 + yield3; - if(MeanNumberOfPhotons > 10.) { G4double sigma = ResolutionScale * std::sqrt(MeanNumberOfPhotons); @@ -577,6 +577,7 @@ G4VParticleChange* G4Scintillation::PostStepDoIt(const G4Track& aTrack, secTrack->SetTouchableHandle( aStep.GetPreStepPoint()->GetTouchableHandle()); secTrack->SetParentID(aTrack.GetTrackID()); + secTrack->SetCreatorModelID(secID); if(fScintillationTrackInfo) secTrack->SetUserInformation( new G4ScintillationTrackInformation(scintType)); @@ -593,20 +594,6 @@ G4VParticleChange* G4Scintillation::PostStepDoIt(const G4Track& aTrack, return G4VRestDiscreteProcess::PostStepDoIt(aTrack, aStep); } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void G4Scintillation::SetScintillationByParticleType(const G4bool scintType) -{ - if(fEmSaturation && scintType) - { - G4Exception("G4Scintillation::SetScintillationByParticleType", "Scint02", - JustWarning, - "Redefinition: Birks Saturation is replaced by " - "ScintillationByParticleType!"); - RemoveSaturation(); - } - fScintillationByParticleType = scintType; -} - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double G4Scintillation::GetMeanFreePath(const G4Track&, G4double, G4ForceCondition* condition) @@ -866,3 +853,55 @@ void G4Scintillation::DumpPhysicsTable() const } } } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4Scintillation::SetTrackSecondariesFirst(const G4bool state) +{ + fTrackSecondariesFirst = state; + G4OpticalParameters::Instance()->SetScintTrackSecondariesFirst( + fTrackSecondariesFirst); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4Scintillation::SetFiniteRiseTime(const G4bool state) +{ + fFiniteRiseTime = state; + G4OpticalParameters::Instance()->SetScintFiniteRiseTime(fFiniteRiseTime); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4Scintillation::SetScintillationByParticleType(const G4bool scintType) +{ + if(fEmSaturation && scintType) + { + G4Exception("G4Scintillation::SetScintillationByParticleType", "Scint02", + JustWarning, + "Redefinition: Birks Saturation is replaced by " + "ScintillationByParticleType!"); + RemoveSaturation(); + } + fScintillationByParticleType = scintType; + G4OpticalParameters::Instance()->SetScintByParticleType( + fScintillationByParticleType); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4Scintillation::SetScintillationTrackInfo(const G4bool trackType) +{ + fScintillationTrackInfo = trackType; + G4OpticalParameters::Instance()->SetScintTrackInfo(fScintillationTrackInfo); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4Scintillation::SetStackPhotons(const G4bool stackingFlag) +{ + fStackingFlag = stackingFlag; + G4OpticalParameters::Instance()->SetScintStackPhotons(fStackingFlag); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4Scintillation::SetVerboseLevel(G4int verbose) +{ + verboseLevel = verbose; + G4OpticalParameters::Instance()->SetScintVerboseLevel(verboseLevel); +} diff --git a/source/processes/electromagnetic/xrays/src/G4SynchrotronRadiation.cc b/source/processes/electromagnetic/xrays/src/G4SynchrotronRadiation.cc index 741e71e446..f4c7bed556 100644 --- a/source/processes/electromagnetic/xrays/src/G4SynchrotronRadiation.cc +++ b/source/processes/electromagnetic/xrays/src/G4SynchrotronRadiation.cc @@ -47,6 +47,7 @@ #include "G4SystemOfUnits.hh" #include "G4TransportationManager.hh" #include "G4UnitsTable.hh" +#include "G4PhysicsModelCatalog.hh" /////////////////////////////////////////////////////////////////////// // Constructor @@ -60,6 +61,7 @@ G4SynchrotronRadiation::G4SynchrotronRadiation(const G4String& processName, fFieldPropagator = transportMgr->GetPropagatorInField(); + secID = G4PhysicsModelCatalog::GetModelID("model_SynRad"); SetProcessSubType(fSynchrotronRadiation); verboseLevel = 1; FirstTime = true; @@ -267,7 +269,6 @@ G4VParticleChange* G4SynchrotronRadiation::PostStepDoIt( gammaPolarization.z()); aParticleChange.SetNumberOfSecondaries(1); - aParticleChange.AddSecondary(aGamma); // Update the incident particle G4double newKinEnergy = kineticEnergy - energyOfSR; @@ -280,6 +281,14 @@ G4VParticleChange* G4SynchrotronRadiation::PostStepDoIt( { aParticleChange.ProposeEnergy(0.); } + + // Create the G4Track + G4Track* aSecondaryTrack = new G4Track(aGamma, trackData.GetGlobalTime(), trackData.GetPosition()); + aSecondaryTrack->SetTouchableHandle(stepData.GetPostStepPoint()->GetTouchableHandle()); + aSecondaryTrack->SetParentID(trackData.GetTrackID()); + aSecondaryTrack->SetCreatorModelID(secID); + aParticleChange.AddSecondary(aSecondaryTrack); + } } return G4VDiscreteProcess::PostStepDoIt(trackData, stepData); diff --git a/source/processes/electromagnetic/xrays/src/G4SynchrotronRadiationInMat.cc b/source/processes/electromagnetic/xrays/src/G4SynchrotronRadiationInMat.cc index 1b85373946..0f45f4d4cd 100644 --- a/source/processes/electromagnetic/xrays/src/G4SynchrotronRadiationInMat.cc +++ b/source/processes/electromagnetic/xrays/src/G4SynchrotronRadiationInMat.cc @@ -43,6 +43,7 @@ #include "G4PhysicalConstants.hh" #include "G4PropagatorInField.hh" #include "G4SystemOfUnits.hh" +#include "G4PhysicsModelCatalog.hh" const G4double G4SynchrotronRadiationInMat::fIntegralProbabilityOfSR[200] = { 1.000000e+00, 9.428859e-01, 9.094095e-01, 8.813971e-01, 8.565154e-01, @@ -104,6 +105,7 @@ G4SynchrotronRadiationInMat::G4SynchrotronRadiationInMat( G4TransportationManager::GetTransportationManager(); fFieldPropagator = transportMgr->GetPropagatorInField(); + secID = G4PhysicsModelCatalog::GetModelID("model_SynchrotronRadiation"); SetProcessSubType(fSynchrotronRadiation); CutInRange = GammaCutInKineticEnergyNow = ElectronCutInKineticEnergyNow = PositronCutInKineticEnergyNow = ParticleCutInKineticEnergyNow = fKsi = @@ -315,7 +317,6 @@ G4VParticleChange* G4SynchrotronRadiationInMat::PostStepDoIt( gammaPolarization.z()); aParticleChange.SetNumberOfSecondaries(1); - aParticleChange.AddSecondary(aGamma); // Update the incident particle G4double newKinEnergy = kineticEnergy - energyOfSR; @@ -340,6 +341,13 @@ G4VParticleChange* G4SynchrotronRadiationInMat::PostStepDoIt( aParticleChange.ProposeTrackStatus(fStopButAlive); } } + + // Create the G4Track + G4Track* aSecondaryTrack = new G4Track(aGamma, trackData.GetGlobalTime(), trackData.GetPosition()); + aSecondaryTrack->SetTouchableHandle(stepData.GetPostStepPoint()->GetTouchableHandle()); + aSecondaryTrack->SetParentID(trackData.GetTrackID()); + aSecondaryTrack->SetCreatorModelID(secID); + aParticleChange.AddSecondary(aSecondaryTrack); } else { diff --git a/source/processes/electromagnetic/xrays/src/G4VXTRenergyLoss.cc b/source/processes/electromagnetic/xrays/src/G4VXTRenergyLoss.cc index f2d28ea699..b296821d96 100644 --- a/source/processes/electromagnetic/xrays/src/G4VXTRenergyLoss.cc +++ b/source/processes/electromagnetic/xrays/src/G4VXTRenergyLoss.cc @@ -52,6 +52,7 @@ #include "G4VDiscreteProcess.hh" #include "G4VParticleChange.hh" #include "G4VSolid.hh" +#include "G4PhysicsModelCatalog.hh" //////////////////////////////////////////////////////////////////////////// // Constructor, destructor @@ -70,13 +71,30 @@ G4VXTRenergyLoss::G4VXTRenergyLoss(G4LogicalVolume* anEnvelope, , fGammaTkinCut(0.0) { verboseLevel = 1; + secID = G4PhysicsModelCatalog::GetModelID("model_XTRenergyLoss"); SetProcessSubType(fTransitionRadiation); fPtrGamma = nullptr; fMinEnergyTR = fMaxEnergyTR = fMaxThetaTR = fGamma = fEnergy = 0.0; fVarAngle = fLambda = fTotalDist = fPlateThick = fGasThick = 0.0; - fAlphaPlate = fAlphaGas = 0.0; + fAlphaPlate = 100.; + fAlphaGas = 40.; + fTheMinEnergyTR = CLHEP::keV * 1.; // 1.; // + fTheMaxEnergyTR = CLHEP::keV * 100.; // 40.; // + + fTheMinAngle = 1.e-8; // + fTheMaxAngle = 4.e-4; + + fTotBin = 50; // number of bins in log scale + fBinTR = 100; // number of bins in TR vectors + + // min/max angle2 in log-vectors + + fMinThetaTR = 3.0e-9; + fMaxThetaTR = 1.0e-4; + + // Proton energy vector initialization fProtonEnergyVector = new G4PhysicsLogVector(fMinProtonTkin, fMaxProtonTkin, fTotBin); @@ -97,6 +115,8 @@ G4VXTRenergyLoss::G4VXTRenergyLoss(G4LogicalVolume* anEnvelope, } // default is XTR dEdx, not flux after radiator fExitFlux = false; + // default angle distribution according numerical integration + fFastAngle = false; // no angle according sum of delta-functions by default fAngleRadDistr = true; fCompton = false; @@ -338,7 +358,11 @@ void G4VXTRenergyLoss::BuildEnergyTable() // Legendre96 or Legendre10 energySum += radiatorCof * fCofTR * - integral.Legendre10(this, &G4VXTRenergyLoss::SpectralXTRdEdx, + + // integral.Legendre10(this, &G4VXTRenergyLoss::SpectralXTRdEdx, + + integral.Legendre96(this, &G4VXTRenergyLoss::SpectralXTRdEdx, + energyVector->GetLowEdgeEnergy(iTR), energyVector->GetLowEdgeEnergy(iTR + 1)); @@ -366,14 +390,16 @@ void G4VXTRenergyLoss::BuildEnergyTable() ////////////////////////////////////////////////////////////////////////// // Bank of angle distributions for given energies (slow!) + void G4VXTRenergyLoss::BuildAngleForEnergyBank() { - if(this->GetProcessName() == "TranspRegXTRadiator" || - this->GetProcessName() == "TranspRegXTRmodel" || - this->GetProcessName() == "RegularXTRadiator" || - this->GetProcessName() == "RegularXTRmodel") + + if( ( this->GetProcessName() == "TranspRegXTRadiator" || + this->GetProcessName() == "TranspRegXTRmodel" || + this->GetProcessName() == "RegularXTRadiator" || + this->GetProcessName() == "RegularXTRmodel" ) && fFastAngle ) // ffastAngle=true! { - BuildAngleTable(); + BuildAngleTable(); // by sum of delta-functions return; } G4int i, iTkin, iTR; @@ -407,8 +433,6 @@ void G4VXTRenergyLoss::BuildAngleForEnergyBank() fGamma = 1.0 + (fProtonEnergyVector->GetLowEdgeEnergy(iTkin) / proton_mass_c2); - fMaxThetaTR = 25. * 2500.0 / (fGamma * fGamma); // theta^2 - if(fMaxThetaTR > fTheMaxAngle) fMaxThetaTR = fTheMaxAngle; else if(fMaxThetaTR < fTheMinAngle) @@ -420,8 +444,11 @@ void G4VXTRenergyLoss::BuildAngleForEnergyBank() { angleSum = 0.0; fEnergy = energyVector->GetLowEdgeEnergy(iTR); - G4PhysicsLinearVector* angleVector = - new G4PhysicsLinearVector(0.0, fMaxThetaTR, fBinTR); + + // log-vector to increase number of thin bins for small angles + G4PhysicsLogVector* angleVector = new G4PhysicsLogVector(fMinThetaTR, fMaxThetaTR, fBinTR); + + angleVector->PutValue(fBinTR - 1, angleSum); @@ -486,7 +513,7 @@ void G4VXTRenergyLoss::BuildAngleTable() fGamma = 1.0 + (fProtonEnergyVector->GetLowEdgeEnergy(iTkin) / proton_mass_c2); - fMaxThetaTR = 25. * 2500.0 / (fGamma * fGamma); // theta^2 + // fMaxThetaTR = 25. * 2500.0 / (fGamma * fGamma); // theta^2 if(fMaxThetaTR > fTheMaxAngle) fMaxThetaTR = fTheMaxAngle; @@ -560,7 +587,8 @@ G4PhysicsFreeVector* G4VXTRenergyLoss::GetAngleVector(G4double energy, G4int n) if(k == kMin && kMin == G4int(cofMin)) { - angleSum += 0.5 * tmp; + // angleSum += 0.5 * tmp; + angleSum += tmp; // ATLAS TB } else if(iTheta == n - 1) ; @@ -580,8 +608,9 @@ G4PhysicsFreeVector* G4VXTRenergyLoss::GetAngleVector(G4double energy, G4int n) } if(theta > 0.) { - angleSum += 0.5 * tmp; - theta = 0.; + // angleSum += 0.5 * tmp; + angleSum += 0.; // ATLAS TB + theta = 0.; } if(verboseLevel > 2) { @@ -632,7 +661,8 @@ void G4VXTRenergyLoss::BuildGlobalAngleTable() fGamma = 1.0 + (fProtonEnergyVector->GetLowEdgeEnergy(iTkin) / proton_mass_c2); - fMaxThetaTR = 25.0 / (fGamma * fGamma); // theta^2 + // fMaxThetaTR = 25.0 / (fGamma * fGamma); // theta^2 + // fMaxThetaTR = 1.e-4; // theta^2 if(fMaxThetaTR > fTheMaxAngle) fMaxThetaTR = fTheMaxAngle; @@ -642,7 +672,9 @@ void G4VXTRenergyLoss::BuildGlobalAngleTable() fMaxThetaTR = fTheMinAngle; } G4PhysicsLinearVector* angleVector = + // G4PhysicsLogVector* angleVector = new G4PhysicsLinearVector(0.0, fMaxThetaTR, fBinTR); + // new G4PhysicsLogVector(1.e-8, fMaxThetaTR, fBinTR); angleSum = 0.0; @@ -1425,6 +1457,7 @@ G4double G4VXTRenergyLoss::GetXTRenergy(G4int iPlace, G4double, G4int iTransfer) ///////////////////////////////////////////////////////////////////////// // Get XTR photon angle at given energy and Tkin + G4double G4VXTRenergyLoss::GetRandomAngle(G4double energyXTR, G4int iTkin) { G4int iTR, iAngle; @@ -1444,8 +1477,10 @@ G4double G4VXTRenergyLoss::GetRandomAngle(G4double energyXTR, G4int iTkin) --iTR; position = (*(*fAngleForEnergyTable)(iTR))(0) * G4UniformRand(); + // position = (*(*fAngleForEnergyTable)(iTR))(1) * G4UniformRand(); // ATLAS TB for(iAngle = 0;; ++iAngle) + // for(iAngle = 1;; ++iAngle) // ATLAS TB { if(position >= (*(*fAngleForEnergyTable)(iTR))(iAngle)) break; @@ -1457,12 +1492,14 @@ G4double G4VXTRenergyLoss::GetRandomAngle(G4double energyXTR, G4int iTkin) //////////////////////////////////////////////////////////////////////// // Returns approximate position of X-ray photon angle at given energy during // random sampling over integral energy distribution + G4double G4VXTRenergyLoss::GetAngleXTR(G4int iPlace, G4double position, G4int iTransfer) { G4double x1, x2, y1, y2, result; - if(iTransfer == 0) + if( iTransfer == 0 ) + // if( iTransfer == 1 ) // ATLAS TB { result = (*fAngleForEnergyTable)(iPlace)->GetLowEdgeEnergy(iTransfer); } @@ -1474,15 +1511,15 @@ G4double G4VXTRenergyLoss::GetAngleXTR(G4int iPlace, G4double position, x1 = (*fAngleForEnergyTable)(iPlace)->GetLowEdgeEnergy(iTransfer - 1); x2 = (*fAngleForEnergyTable)(iPlace)->GetLowEdgeEnergy(iTransfer); - if(x1 == x2) - result = x2; + if(x1 == x2) result = x2; else { - if(y1 == y2) - result = x1 + (x2 - x1) * G4UniformRand(); + if( y1 == y2 ) result = x1 + (x2 - x1) * G4UniformRand(); else { result = x1 + (position - y1) * (x2 - x1) / (y2 - y1); + // result = x1 + 0.1*(position - y1) * (x2 - x1) / (y2 - y1); // ATLAS TB + // result = x1 + 0.05*(position - y1) * (x2 - x1) / (y2 - y1); // ATLAS TB } } } diff --git a/source/processes/hadronic/cross_sections/History b/source/processes/hadronic/cross_sections/History index a19fc9790c..dbd789f292 100644 --- a/source/processes/hadronic/cross_sections/History +++ b/source/processes/hadronic/cross_sections/History @@ -14,6 +14,48 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +21 October 2021 - Alberto Ribon (hadr-cross-V10-07-21) +- G4IonsShenCrossSection : reintroduced this (old) ion-ion cross section + (that was removed in 10.7.ref03), as required by Vladimir Uzhinsky + for his nucleus-nucleus validation of NA61/SHINE experimental data + +06 October 2021 - Vladimir Grichine (hadr-cross-V10-07-20) +- G4ElNuclearSFcs - e-A XS according to structure function approach by corrections of CHIPS CS + +30 September 2021 - Vladimir Ivanchenko (hadr-cross-V10-07-19) +- G4GammaNuclearXS - fixed Coverity warnings +- G4PhotoNuclearCrossSection - code clean-up + +17 August 2021 - Vladimir Ivanchenko (hadr-cross-V10-07-18) +- G4GammaNuclearXS - Bogdan Kutsenko impruved isotope x-section + +16 August 2021 - Vladimir Ivanchenko (hadr-cross-V10-07-17) +- G4BGGNucleonElasticXS, G4BGGNucleonInelasticXS, + G4ComponentBarNucleonNucleusXsc, G4NucleonNuclearCrossSection, + G4CrossSectionDataSetRegistry, G4PhotoNuclearCrossSection - clean-up + +13 August 2021 - Vladimir Ivanchenko (hadr-cross-V10-07-16) +- G4IsotopeList - extended list of isotopes to cover all data for + neutrons, protons, and gamma. +- G4GammaNuclearXS - new version of the code (Bogdan Kutsenko, BINP, + CERN summer student program), which is based on IAEA/PD-2019. +- G4CrossSectionDataSetRegistry - improved debug printout and not use + CrossSectionFactory for XS. +- G4NeutronInelasticXS, G4NeutronElasticXS, G4NeutronCaptureXS - cleanup + +29 July 2021 - Vladimir Ivanchenko (hadr-cross-V10-07-15) +- G4IsotopeList - extended from Zmax=92 to Zmax=94; do not use zero + values for amin and amax for all Z; this is needed for + migration to the new dataset G4PARTICLEXS4.0 +- G4NeutronInelasticXS, G4NeutronElasticXS, G4NeutronCaptureXS, + G4ParticleInelasticXS, GammaNuclearXS : instead of check (amin[Z]==0) + use the check (amin[Z]==amax[Z]) + +12 July 2021 - Vladimir Ivanchenko (hadr-cross-V10-07-14) +- G4NeutronInelasticXS, G4NeutronElasticXS, G4NeutronCaptureXS, + G4ParticleInelasticXS, GammaNuclearXS : clean-up access to data +- G4NeutronCaptureXS - fixed bug in isotope data access + 30 May 2021 - Vladimir Ivanchenko (hadr-cross-V10-07-13) - G4UPiNuclearCrossSection - disable spline interpolation diff --git a/source/processes/hadronic/cross_sections/include/G4CrossSectionDataSetRegistry.hh b/source/processes/hadronic/cross_sections/include/G4CrossSectionDataSetRegistry.hh index b92fdc1558..893dd2e3f7 100644 --- a/source/processes/hadronic/cross_sections/include/G4CrossSectionDataSetRegistry.hh +++ b/source/processes/hadronic/cross_sections/include/G4CrossSectionDataSetRegistry.hh @@ -82,7 +82,7 @@ public: //clean the store G4VCrossSectionDataSet* GetCrossSectionDataSet(const G4String& name, - G4bool warning=true); + G4bool warning=false); G4VComponentCrossSection* GetComponentCrossSection(const G4String& name); diff --git a/source/processes/hadronic/cross_sections/include/G4ElNucleusSFcs.hh b/source/processes/hadronic/cross_sections/include/G4ElNucleusSFcs.hh new file mode 100644 index 0000000000..6d8d7db975 --- /dev/null +++ b/source/processes/hadronic/cross_sections/include/G4ElNucleusSFcs.hh @@ -0,0 +1,81 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// GEANT4 physics class: G4ElNucleusSFcs -- header file +// +// +// 30.09.21 V. Grichine eA inelastic cross section according to the structure function approach. +// The XS is calculated based on the corrected CHIPS XS. +// + +#ifndef G4ElNucleusSFcs_h +#define G4ElNucleusSFcs_h 1 + +#include "G4VCrossSectionDataSet.hh" +#include "G4DynamicParticle.hh" +#include "G4Element.hh" +#include "G4ParticleTable.hh" +#include "G4NucleiProperties.hh" +#include "G4NistManager.hh" +#include +#include "Randomize.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" +#include + +class G4ElectroNuclearCrossSection; + +class G4ElNucleusSFcs : public G4VCrossSectionDataSet +{ +public: + + G4ElNucleusSFcs(); + virtual ~G4ElNucleusSFcs(); + + static const char* Default_Name() {return "ElectronNucleusSFcs";} + + virtual void CrossSectionDescription(std::ostream&) const; + + virtual G4bool IsElementApplicable(const G4DynamicParticle*, G4int Z, + const G4Material*); + + virtual G4double GetIsoCrossSection(const G4DynamicParticle*, G4int Z, G4int A, + const G4Isotope* iso = nullptr, + const G4Element* elm = nullptr, + const G4Material* mat = nullptr ); + G4double ThresholdEnergy(); + + G4double GetRatio(G4int Z, G4int A); + +private: + + static const G4double fZZ[19]; + static const G4double fRR[19]; + + G4ElectroNuclearCrossSection* fCHIPScs; +}; + +#endif diff --git a/source/processes/hadronic/cross_sections/include/G4GammaNuclearXS.hh b/source/processes/hadronic/cross_sections/include/G4GammaNuclearXS.hh index 44bbd567f2..cff192dadb 100644 --- a/source/processes/hadronic/cross_sections/include/G4GammaNuclearXS.hh +++ b/source/processes/hadronic/cross_sections/include/G4GammaNuclearXS.hh @@ -31,12 +31,17 @@ // // File name: G4GammaNuclearXS // -// Author V.Ivantchenko, Geant4, 22 October 2020 +// Authors V.Ivantchenko, Geant4, 20 October 2020 +// B.Kutsenko, BINP/NSU, 10 August 2021 // - +// Modification + + // Class Description: // This is a base class for gamma-nuclear cross section based on -// data files from G4PARTICLEXSDATA data set +// data files from IAEA Evaluated Photonuclear Data Library (IAEA/PD-2019) +// https://www-nds.iaea.org/photonuclear/ +// Database review - https://www.sciencedirect.com/science/article/pii/S0090375219300699?via%3Dihub // Class Description - End #ifndef G4GammaNuclearXS_h @@ -44,13 +49,16 @@ #include "G4VCrossSectionDataSet.hh" #include "globals.hh" +#include "G4ElementData.hh" #include "G4PhysicsVector.hh" #include "G4Threading.hh" +#include "G4IsotopeList.hh" #include class G4DynamicParticle; class G4ParticleDefinition; class G4Element; +class G4VComponentCrossSection; class G4GammaNuclearXS final : public G4VCrossSectionDataSet { @@ -60,7 +68,7 @@ public: ~G4GammaNuclearXS() final; - static const char* Default_Name() {return "G4GammaNuclearXS";} + static const char* Default_Name() {return "GammaNuclearXS";} G4bool IsElementApplicable(const G4DynamicParticle*, G4int Z, const G4Material*) final; @@ -69,20 +77,25 @@ public: const G4Element*, const G4Material* mat) final; G4double GetElementCrossSection(const G4DynamicParticle*, - G4int Z, const G4Material* mat) final; + G4int Z, + const G4Material* mat = nullptr) final; G4double GetIsoCrossSection(const G4DynamicParticle*, G4int Z, G4int A, - const G4Isotope* iso, - const G4Element* elm, - const G4Material* mat) final; + const G4Isotope* iso = nullptr, + const G4Element* elm = nullptr, + const G4Material* mat = nullptr) final; const G4Isotope* SelectIsotope(const G4Element*, G4double kinEnergy, G4double logE) final; void BuildPhysicsTable(const G4ParticleDefinition&) final; - void CrossSectionDescription(std::ostream&) const final; + G4double IsoCrossSection(G4double ekin, G4int Z, G4int A); + G4double ElementCrossSection(G4double ekin, G4int Z); + + void CrossSectionDescription(std::ostream&) const final; + G4GammaNuclearXS & operator=(const G4GammaNuclearXS &right) = delete; G4GammaNuclearXS(const G4GammaNuclearXS&) = delete; @@ -96,16 +109,28 @@ private: inline G4PhysicsVector* GetPhysicsVector(G4int Z); + G4PhysicsVector* RetrieveVector(std::ostringstream& in, G4bool isElement, G4int Z); + G4VCrossSectionDataSet* ggXsection = nullptr; - const G4ParticleDefinition* gamma; + std::vector temp; + const G4ParticleDefinition* gamma; + G4bool isMaster = false; - static const G4int MAXZGAMMAN = 93; - static G4PhysicsVector* data[MAXZGAMMAN]; - static G4double coeff[MAXZGAMMAN]; + static const G4int MAXZGAMMAXS = 95; + static G4ElementData* data; + // Upper limit of the linear transition between IAEA database and CHIPS model + static const G4int rTransitionBound = 150.*CLHEP::MeV; + // The list of elements with non-linear parametrisation for better precision + const G4int freeVectorException[11] = {4, 6, 7, 8, 27, 39, 45, 65, 67, 69, 73}; + // CHIPS photonuclear model had a problem with high energy parametrisation + // for isotopes of H and He, coefficient is needed to connect isotope cross + // section with element cross-section on high energies. + static G4double coeff[3][3]; + static G4double xs150[MAXZGAMMAXS]; static G4String gDataDirectory; - + #ifdef G4MULTITHREADED static G4Mutex gNuclearXSMutex; #endif @@ -114,8 +139,12 @@ private: inline G4PhysicsVector* G4GammaNuclearXS::GetPhysicsVector(G4int Z) { - if(nullptr == data[Z]) { InitialiseOnFly(Z); } - return data[Z]; + G4PhysicsVector* pv = data->GetElementData(Z); + if(pv == nullptr) { + InitialiseOnFly(Z); + pv = data->GetElementData(Z); + } + return pv; } #endif diff --git a/source/visualization/FukuiRenderer/include/G4FukuiRendererViewer.hh b/source/processes/hadronic/cross_sections/include/G4IonsShenCrossSection.hh similarity index 52% rename from source/visualization/FukuiRenderer/include/G4FukuiRendererViewer.hh rename to source/processes/hadronic/cross_sections/include/G4IonsShenCrossSection.hh index ef5e3d2452..10b438feb6 100644 --- a/source/visualization/FukuiRenderer/include/G4FukuiRendererViewer.hh +++ b/source/processes/hadronic/cross_sections/include/G4IonsShenCrossSection.hh @@ -23,53 +23,62 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // + +#ifndef G4IonsShenCrossSection_h +#define G4IonsShenCrossSection_h // +// Class Description +// Implementation of formulas +// Shen et al. Nuc. Phys. A 491 130 (1989); +// Total Reaction Cross Section for Heavy-Ion Collisions +// +// Class Description - End +// 18-Sep-2003 First version is written by T. Koi +// 12-Nov-2003 Set upper limit at 10 GeV/n +// 12-Nov-2003 Insted of the lower limit, +// 0 is returned to a partilce with energy lowae than 10 MeV/n +// 15-Nov-2006 Change upper limit to 1 TeV/n +// However above 10GeV/n XS become constant. +// 23-Dec-2006 Isotope dependence added by D. Wright +// 19-Aug-2011 V.Ivanchenko move to new design and make x-section per element // -// -// Satoshi TANAKA, Fri Jun 28 12:10:14 JST 1996 -// FukuiRenderer viewer - opens window, hard copy, etc. -//=================// -#ifdef G4VIS_BUILD_DAWN_DRIVER -//=================// - - -#ifndef G4FUKUI_RENDERER_VIEWER_HH -#define G4FUKUI_RENDERER_VIEWER_HH - -#include "G4VViewer.hh" #include "globals.hh" +#include "G4Proton.hh" -class G4FukuiRendererSceneHandler ; - - -class G4FukuiRendererViewer: public G4VViewer { +#include "G4VCrossSectionDataSet.hh" +class G4IonsShenCrossSection : public G4VCrossSectionDataSet +{ public: - enum FRDEV {FRDEV_PS=1, FRDEV_XWIN=2, FRDEV_PS2=3, FRDEV_XWIN2=4, FRDEV_OPEN_GL=5, FRDEV_DEVICE_END=6} ; + G4IonsShenCrossSection(); - //----- constructor and destructor - G4FukuiRendererViewer (G4FukuiRendererSceneHandler& scene, const G4String& name); - virtual ~G4FukuiRendererViewer (); + virtual ~G4IonsShenCrossSection(); + + virtual + G4bool IsElementApplicable(const G4DynamicParticle* aDP, + G4int Z, const G4Material*); - //----- overriding base class methods - void SetView (); // Do nothing. SendViewParameters will do its job. - void ClearView (); - void DrawView (); - void ShowView (); + virtual + G4double GetElementCrossSection(const G4DynamicParticle*, + G4int Z, const G4Material*); - //---- methods inherent to this class - void Wait() ; - void SendViewParameters () ; + virtual + G4double GetIsoCrossSection(const G4DynamicParticle*, G4int Z, G4int A, + const G4Isotope* iso = 0, + const G4Element* elm = 0, + const G4Material* mat = 0); - void SendDevice( FRDEV dev ); - void SendDrawingStyle() ; + virtual void CrossSectionDescription(std::ostream&) const; private: + const G4double upperLimit; +// const G4double lowerLimit; + const G4double r0; - G4FukuiRendererSceneHandler& fSceneHandler; // Reference to Graphics Scene for this view. + G4double calEcmValue(const G4double, const G4double, const G4double); + G4double calCeValue(const G4double); }; #endif -#endif //G4VIS_BUILD_DAWN_DRIVER diff --git a/source/processes/hadronic/cross_sections/include/G4IsotopeList.hh b/source/processes/hadronic/cross_sections/include/G4IsotopeList.hh index 390d5ef9f7..9ba27c03ca 100644 --- a/source/processes/hadronic/cross_sections/include/G4IsotopeList.hh +++ b/source/processes/hadronic/cross_sections/include/G4IsotopeList.hh @@ -37,30 +37,30 @@ #define G4IsotopeList_h 1 static const G4int amin[] = { - 0, - 1, 3, 6, 9, 10, 12, 14, 16, 19, 20, //1-10 - 23, 24, 27, 28, 31, 32, 35, 36, 39, 40, //11-20 - 45, 46, 50, 50, 55, 54, 59, 58, 63, 64, //21-30 - 69, 70, 75, 0, 0, 78, 0, 0, 89, 90, //31-40 - 0, 92, 0, 0, 0, 102, 107, 106, 113, 112, //41-50 - 0, 0, 127, 0, 133, 130, 0, 0, 0, 0, //51-60 - 0, 0, 0, 152, 0, 0, 0, 0, 0, 168, //61-70 - 0, 0, 180, 180, 0, 0, 0, 190, 197, 0, //71-80 -203, 204, 209, 0, 0, 0, 0, 0, 0, 0, //81-90 - 0, 234}; + 0, + 1, 3, 6, 9, 10, 12, 14, 16, 19, 20, //1-10 + 23, 24, 27, 27, 31, 32, 35, 36, 39, 40, //11-20 + 45, 46, 50, 50, 55, 54, 59, 58, 63, 64, //21-30 + 69, 70, 75, 74, 79, 78, 85, 84, 89, 90, //31-40 + 93, 92, 98, 96, 103, 102, 107, 106, 113, 112, //41-50 + 121, 120, 127, 124, 133, 130, 138, 136, 141, 142, //51-60 + 145, 144, 151, 152, 158, 156, 165, 162, 169, 168, //61-70 + 175, 174, 180, 180, 185, 184, 191, 190, 197, 196, //71-80 + 203, 204, 209, 209, 210, 222, 223, 226, 227, 232, //81-90 + 231, 233, 237, 238}; static const G4int amax[] = { - 0, - 3, 4, 7, 9, 11, 13, 15, 18, 19, 22, //1-10 - 23, 26, 27, 30, 31, 36, 37, 40, 41, 48, //11-20 - 45, 50, 51, 54, 55, 58, 59, 64, 65, 70, //21-30 - 71, 76, 75, 0, 0, 86, 0, 0, 89, 96, //31-40 - 0, 100, 0, 0, 0, 110, 109, 116, 115, 124, //41-50 - 0, 0, 127, 0, 133, 138, 0, 0, 0, 0, //51-60 - 0, 0, 0, 160, 0, 0, 0, 0, 0, 176, //61-70 - 0, 0, 181, 186, 0, 0, 0, 198, 197, 0, //71-80 -205, 208, 209, 0, 0, 0, 0, 0, 0, 0, //81-90 - 0, 238}; + 0, + 3, 4, 7, 9, 11, 14, 15, 18, 19, 22, //1-10 + 23, 26, 27, 30, 31, 36, 37, 40, 41, 48, //11-20 + 45, 50, 51, 54, 55, 58, 59, 64, 65, 70, //21-30 + 71, 76, 75, 82, 81, 86, 87, 90, 89, 96, //31-40 + 94, 100, 98, 104, 103, 110, 109, 116, 115, 124, //41-50 + 123, 130, 129, 136, 137, 138, 139, 142, 141, 150, //51-60 + 145, 154, 153, 160, 159, 164, 165, 170, 169, 176, //61-70 + 176, 180, 181, 186, 187, 192, 193, 198, 197, 204, //71-80 + 205, 208, 209, 209, 210, 222, 223, 226, 227, 232, //81-90 + 231, 238, 237, 244}; static const G4double aeff[] = { 0., @@ -73,6 +73,6 @@ static const G4double aeff[] = { 144.913, 150.366, 151.964, 157.252, 158.925, 162.497, 164.93, 167.256, 168.934, 173.038, //61-70 174.967, 178.485, 180.948, 183.842, 186.207, 190.225, 192.216, 195.078, 196.967, 200.599, //71-80 204.383, 207.217, 208.98, 208.982, 209.987, 222.018, 223.02, 226.025, 227.028, 232.038, //81-90 - 231.036, 238.029}; + 231.036, 238.029, 237.048, 244.064}; #endif diff --git a/source/processes/hadronic/cross_sections/include/G4PhotoNuclearCrossSection.hh b/source/processes/hadronic/cross_sections/include/G4PhotoNuclearCrossSection.hh index a8accf20fd..04940c765e 100644 --- a/source/processes/hadronic/cross_sections/include/G4PhotoNuclearCrossSection.hh +++ b/source/processes/hadronic/cross_sections/include/G4PhotoNuclearCrossSection.hh @@ -79,30 +79,30 @@ private: // Body private: - G4int lastZ; // The last Z of calculated nucleus - G4double lastSig; // Last value of the Cross Section - G4double* lastGDR; // Pointer to the last array of GDR cross sections - G4double* lastHEN; // Pointer to the last array of HEn cross sections - G4double lastE; // Last used in the cross section Energy - G4double lastTH; // Last value of the Energy Threshold (A-dependent) - G4double lastSP; // Last value of the ShadowingPomeron (A-dependent) + G4int lastZ = 0; // The last Z of calculated nucleus + G4double lastSig = 0.0; // Last value of the Cross Section + G4double* lastGDR = nullptr; // Pointer to the last array of GDR cross sections + G4double* lastHEN = nullptr; // Pointer to the last array of HEn cross sections + G4double lastE = 0.0; // Last used in the cross section Energy + G4double lastTH = 0.0; // Last value of the Energy Threshold (A-dependent) + G4double lastSP = 0.0; // Last value of the ShadowingPomeron (A-dependent) // Vector of pointers to the GDRPhotonuclearCrossSection std::vector GDR; // store deuteron, triton, He3 XS - G4double* deuteron_GDR; - G4double* deuteron_HR; - G4double deuteron_TH; - G4double deuteron_SP; - G4double* triton_GDR; - G4double* triton_HR; - G4double triton_TH; - G4double triton_SP; - G4double* he3_GDR; - G4double* he3_HR; - G4double he3_TH; - G4double he3_SP; + G4double* deuteron_GDR = nullptr; + G4double* deuteron_HR = nullptr; + G4double deuteron_TH = 0.0; + G4double deuteron_SP = 0.0; + G4double* triton_GDR = nullptr; + G4double* triton_HR = nullptr; + G4double triton_TH = 0.0; + G4double triton_SP = 0.0; + G4double* he3_GDR = nullptr; + G4double* he3_HR = nullptr; + G4double he3_TH = 0.0; + G4double he3_SP = 0.0; // Vector of pointers to the HighEnPhotonuclearCrossSect std::vector HEN; diff --git a/source/processes/hadronic/cross_sections/sources.cmake b/source/processes/hadronic/cross_sections/sources.cmake index 13d0a4f215..29417e349e 100644 --- a/source/processes/hadronic/cross_sections/sources.cmake +++ b/source/processes/hadronic/cross_sections/sources.cmake @@ -37,6 +37,7 @@ geant4_add_module(G4hadronic_xsect G4CrossSectionElastic.hh G4CrossSectionFactory.hh G4CrossSectionInelastic.hh + G4ElNucleusSFcs.hh G4ElectroNuclearCrossSection.hh G4ElNeutrinoNucleusTotXsc.hh G4DiffElasticRatio.hh @@ -45,6 +46,7 @@ geant4_add_module(G4hadronic_xsect G4GammaNuclearXS.hh G4HadronNucleonXsc.hh G4HadronXSDataTable.hh + G4IonsShenCrossSection.hh G4IsotopeList.hh G4KokoulinMuonNuclearXS.hh G4NeutrinoElectronCcXsc.hh @@ -99,6 +101,7 @@ geant4_add_module(G4hadronic_xsect G4CrossSectionElastic.cc G4CrossSectionInelastic.cc G4DiffElasticRatio.cc + G4ElNucleusSFcs.cc G4ElectroNuclearCrossSection.cc G4ElNeutrinoNucleusTotXsc.cc G4EMDissociationCrossSection.cc @@ -106,6 +109,7 @@ geant4_add_module(G4hadronic_xsect G4GammaNuclearXS.cc G4HadronNucleonXsc.cc G4HadronXSDataTable.cc + G4IonsShenCrossSection.cc G4KokoulinMuonNuclearXS.cc G4NeutrinoElectronCcXsc.cc G4NeutrinoElectronNcXsc.cc diff --git a/source/processes/hadronic/cross_sections/src/G4BGGNucleonElasticXS.cc b/source/processes/hadronic/cross_sections/src/G4BGGNucleonElasticXS.cc index 4f328b4aaf..c7e3c3842c 100644 --- a/source/processes/hadronic/cross_sections/src/G4BGGNucleonElasticXS.cc +++ b/source/processes/hadronic/cross_sections/src/G4BGGNucleonElasticXS.cc @@ -166,7 +166,7 @@ G4BGGNucleonElasticXS::GetIsoCrossSection(const G4DynamicParticle* dp, void G4BGGNucleonElasticXS::BuildPhysicsTable(const G4ParticleDefinition& p) { - if(fNucleon) { return; } + if(nullptr != fNucleon) { return; } if(&p == theProton || &p == G4Neutron::Neutron()) { isProton = (theProton == &p); diff --git a/source/processes/hadronic/cross_sections/src/G4BGGNucleonInelasticXS.cc b/source/processes/hadronic/cross_sections/src/G4BGGNucleonInelasticXS.cc index 9a18605202..b54a38f3b0 100644 --- a/source/processes/hadronic/cross_sections/src/G4BGGNucleonInelasticXS.cc +++ b/source/processes/hadronic/cross_sections/src/G4BGGNucleonInelasticXS.cc @@ -176,7 +176,7 @@ G4BGGNucleonInelasticXS::GetIsoCrossSection(const G4DynamicParticle* dp, void G4BGGNucleonInelasticXS::BuildPhysicsTable(const G4ParticleDefinition& p) { - if(fNucleon) { return; } + if(nullptr != fNucleon) { return; } if(&p == theProton || &p == G4Neutron::Neutron()) { isProton = (theProton == &p); } else { @@ -281,8 +281,8 @@ G4double G4BGGNucleonInelasticXS::CoulombFactor(G4double kinEnergy, G4int Z) // from G4ProtonInelasticCrossSection if(res > 0.0) { - G4double ff1 = 5.6 - 0.016*aa; // slope of the drop at medium energies. - G4double ff2 = 1.37 + 1.37/aa; // start of the slope. + G4double ff1 = 5.6 - 0.016*aa; // slope of the drop at medium energies. + G4double ff2 = 1.37 + 1.37/aa; // start of the slope. G4double ff3 = 0.8 + 18./aa - 0.002*aa; // stephight res *= (1.0 + ff3*(1.0 - (1.0/(1+G4Exp(-ff1*(elog + ff2)))))); ff1 = 8. - 8./aa - 0.008*aa; // slope of the rise diff --git a/source/processes/hadronic/cross_sections/src/G4ComponentBarNucleonNucleusXsc.cc b/source/processes/hadronic/cross_sections/src/G4ComponentBarNucleonNucleusXsc.cc index d5872bb8a9..ee25aff785 100644 --- a/source/processes/hadronic/cross_sections/src/G4ComponentBarNucleonNucleusXsc.cc +++ b/source/processes/hadronic/cross_sections/src/G4ComponentBarNucleonNucleusXsc.cc @@ -65,7 +65,7 @@ G4ComponentBarNucleonNucleusXsc::G4ComponentBarNucleonNucleusXsc() G4ComponentBarNucleonNucleusXsc::~G4ComponentBarNucleonNucleusXsc() { - if(isMaster && thePData && theNData) { + if(isMaster && nullptr != thePData) { for(G4int i=0; i inst; instance = inst.Instance(); } @@ -116,23 +111,23 @@ void G4CrossSectionDataSetRegistry::Clean() void G4CrossSectionDataSetRegistry::Register(G4VCrossSectionDataSet* p) { - if(!p) { return; } + if(nullptr == p) { return; } for (auto xsec : xSections) { if(xsec == p) { return; } } //G4cout << "Register x-section #" << xSections.size() - //<< " " << p->GetName() << G4endl; + // << " " << p->GetName() << " " << p << G4endl; xSections.push_back(p); } void G4CrossSectionDataSetRegistry::DeRegister(G4VCrossSectionDataSet* p) { - if(!p) { return; } + if(nullptr == p) { return; } size_t n = xSections.size(); for (size_t i=0; iGetName() << std::endl; + //std::cout << "DeRegister x-section #" << i + // << " " << p->GetName() << " " << p << std::endl; xSections[i] = nullptr; return; } diff --git a/source/processes/hadronic/cross_sections/src/G4ElNucleusSFcs.cc b/source/processes/hadronic/cross_sections/src/G4ElNucleusSFcs.cc new file mode 100644 index 0000000000..4287deb501 --- /dev/null +++ b/source/processes/hadronic/cross_sections/src/G4ElNucleusSFcs.cc @@ -0,0 +1,166 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// + +#include + +#include "G4SystemOfUnits.hh" +#include "G4PhysicalConstants.hh" +#include "G4HadTmpUtil.hh" +#include "G4ElNucleusSFcs.hh" +#include "G4ElectroNuclearCrossSection.hh" + +// factory +#include "G4CrossSectionFactory.hh" +// +G4_DECLARE_XS_FACTORY(G4ElNucleusSFcs); + + +G4ElNucleusSFcs::G4ElNucleusSFcs():G4VCrossSectionDataSet(Default_Name()) +{ + fCHIPScs = new G4ElectroNuclearCrossSection(); +} + +G4ElNucleusSFcs::~G4ElNucleusSFcs() +{ + if( fCHIPScs != nullptr ) delete fCHIPScs; +} + +void +G4ElNucleusSFcs::CrossSectionDescription( std::ostream& outFile) const +{ + outFile << "G4ElNucleusSFcs provides the inelastic\n" + << "cross section for e- and e+ interactions with nuclei according to the structure function approach." + << "all energies.\n"; +} + +G4bool G4ElNucleusSFcs::IsElementApplicable( const G4DynamicParticle* aPart, G4int Z, const G4Material*) +{ + + G4double eKin = aPart->GetKineticEnergy(); + G4double thTkin = ThresholdEnergy(); + + return ( Z > 0 && Z < 120 && eKin > thTkin ); +} + + +G4double G4ElNucleusSFcs::GetIsoCrossSection( const G4DynamicParticle* aPart, G4int ZZ, G4int AA, const G4Isotope* , + const G4Element* , const G4Material* ) +{ + G4double xsc(0.), ratio(1.); + + xsc = fCHIPScs->GetElementCrossSection( aPart, ZZ, nullptr ); //, const G4Material*); + + ratio = GetRatio(ZZ,AA); + + if( ratio > 0. ) xsc /= ratio; + + return xsc; +} + +///////////////////////////////////////////////////////////////////////// +// +// Calculate ratio CHIPS-CS/SF-CS, averaged between 200 MeV and 100 GeV + +G4double G4ElNucleusSFcs::GetRatio( G4int Z, G4int A ) +{ + G4double ratio(1.); + + if ( Z == 1 && A == 1 ) return 1.51; + else if ( Z == 1 && A == 2 ) return 0.33; + else if ( Z == 1 && A == 3 ) return 0.27; + else if ( Z == 2 && A == 4 ) return 1.81; + else if ( Z == 6 && A == 12 ) return 2.26; + else if ( Z == 7 && A == 14 ) return 2.47; + else if ( Z == 8 && A == 16 ) return 2.61; + else if ( Z == 13 && A == 27 ) return 2.57; + else if ( Z == 14 && A == 28 ) return 2.49; + else if ( Z == 18 && A == 40 ) return 2.72; + else if ( Z == 22 && A == 48 ) return 2.71; + else if ( Z == 26 && A == 56 ) return 2.79; + else if ( Z == 29 && A == 64 ) return 2.78; + else if ( Z == 32 && A == 73 ) return 2.87; + else if ( Z == 42 && A == 96 ) return 3.02; + else if ( Z == 46 && A == 106 ) return 3.02; + else if ( Z == 47 && A == 108 ) return 2.99; + else if ( Z == 48 && A == 112 ) return 3.00; + else if ( Z == 74 && A == 184 ) return 3.44; + else if ( Z == 79 && A == 200 ) return 3.49; + else if ( Z == 82 && A == 207 ) return 3.48; + else if ( Z == 92 && A == 238 ) return 3.88; + else + { + G4int it(0), iMax(19); + G4double zz = G4double(Z); + + for ( it = 0; it < iMax; ++it ) if ( zz <= fZZ[it] ) break; + + if ( it == 0 ) return fRR[0]; + else if( it == iMax ) return fRR[iMax-1]; + else + { + G4double x1 = fZZ[it-1]; + G4double x2 = fZZ[it]; + G4double y1 = fRR[it-1]; + G4double y2 = fRR[it]; + + if( x1 >= x2 ) return fRR[it]; + else + { + G4double angle = (y2-y1)/(x2-x1); + ratio = y1 + ( zz - x1 )*angle; + } + } + } + return ratio; +} + +///////////////////////////////////////// + +G4double G4ElNucleusSFcs::ThresholdEnergy() +{ + G4double thTkin = 134.9766*CLHEP::MeV; // Pi0 threshold for the nucleon + + thTkin *= 1.3; // nucleon motion + + return thTkin; +} + +///////////////////////////////////////// + +const G4double G4ElNucleusSFcs::fZZ[19] = + { + 2., 6., 7., 8., 13., 14., 18., 22., 26., 29., + 32., 42., 46., 47., 48., 74., 79., 82., 92. + }; + +///////////////////////////////////////// + +const G4double G4ElNucleusSFcs::fRR[19] = + { + 1.81, 2.26, 2.47, 2.61, 2.57, 2.49, 2.72, 2.71, 2.79, 2.78, + 2.87, 3.02, 3.02, 2.99, 3., 3.44, 3.49, 3.48, 2.88 + }; diff --git a/source/processes/hadronic/cross_sections/src/G4GammaNuclearXS.cc b/source/processes/hadronic/cross_sections/src/G4GammaNuclearXS.cc index 8e9de1fae2..1532b09cee 100644 --- a/source/processes/hadronic/cross_sections/src/G4GammaNuclearXS.cc +++ b/source/processes/hadronic/cross_sections/src/G4GammaNuclearXS.cc @@ -30,34 +30,34 @@ // // File name: G4GammaNuclearXS // -// Author V.Ivantchenko, Geant4, 22 October 2020 +// Authors V.Ivantchenko, Geant4, 20 October 2020 +// B.Kutsenko, BINP/NSU, 10 August 2021 // // Modifications: // #include "G4GammaNuclearXS.hh" -#include "G4Gamma.hh" #include "G4DynamicParticle.hh" +#include "G4ThreeVector.hh" #include "G4ElementTable.hh" #include "G4Material.hh" #include "G4Element.hh" -#include "G4PhysicsLogVector.hh" +#include "G4PhysicsLinearVector.hh" #include "G4CrossSectionDataSetRegistry.hh" #include "G4PhotoNuclearCrossSection.hh" #include "Randomize.hh" #include "G4SystemOfUnits.hh" +#include "G4Gamma.hh" #include "G4IsotopeList.hh" #include #include +#include -// factory -#include "G4CrossSectionFactory.hh" -// -G4_DECLARE_XS_FACTORY(G4GammaNuclearXS); +G4ElementData* G4GammaNuclearXS::data = nullptr; -G4PhysicsVector* G4GammaNuclearXS::data[] = {nullptr}; -G4double G4GammaNuclearXS::coeff[] = {0.0}; +G4double G4GammaNuclearXS::coeff[3][3]; +G4double G4GammaNuclearXS::xs150[MAXZGAMMAXS] = {0.0}; G4String G4GammaNuclearXS::gDataDirectory = ""; #ifdef G4MULTITHREADED @@ -65,13 +65,13 @@ G4String G4GammaNuclearXS::gDataDirectory = ""; #endif G4GammaNuclearXS::G4GammaNuclearXS() - : G4VCrossSectionDataSet(Default_Name()), + : G4VCrossSectionDataSet(Default_Name()), gamma(G4Gamma::Gamma()) { // verboseLevel = 0; if(verboseLevel > 0){ G4cout << "G4GammaNuclearXS::G4GammaNuclearXS Initialise for Z < " - << MAXZGAMMAN << G4endl; + << MAXZGAMMAXS << G4endl; } ggXsection = G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet("PhotoNuclearXS"); if(ggXsection == nullptr) ggXsection = new G4PhotoNuclearCrossSection(); @@ -80,21 +80,18 @@ G4GammaNuclearXS::G4GammaNuclearXS() G4GammaNuclearXS::~G4GammaNuclearXS() { - if(isMaster) { - for(G4int i=0; iGetKineticEnergy(); - - G4int Z = (ZZ >= MAXZGAMMAN) ? MAXZGAMMAN - 1 : ZZ; - + const G4int Z = (ZZ >= MAXZGAMMAXS) ? MAXZGAMMAXS - 1 : ZZ; auto pv = GetPhysicsVector(Z); - if(pv == nullptr) { return xs; } - // G4cout << "G4GammaNuclearXS::GetCrossSection e= " << ekin - // << " Z= " << Z << G4endl; - if(ekin <= pv->GetMaxEnergy()) { - xs = pv->LogVectorValue(ekin, aParticle->GetLogKineticEnergy()); - } else { - xs = coeff[Z]*ggXsection->GetElementCrossSection(aParticle, Z, mat); + if(pv == nullptr) { + return ggXsection->GetElementCrossSection(aParticle, Z, mat); + } + const G4double emax = pv->GetMaxEnergy(); + const G4double ekin = aParticle->GetKineticEnergy(); + G4double xs = 0.0; + if(ekin <= emax) { + xs = pv->Value(ekin); + } else if(ekin >= rTransitionBound){ + xs = ggXsection->GetElementCrossSection(aParticle, Z, mat); + } else { + const G4double rxs = xs150[Z]; + const G4double lxs = pv->Value(emax); + xs = lxs + (ekin - emax)*(rxs - lxs)/(rTransitionBound-emax); } #ifdef G4VERBOSE @@ -141,33 +141,136 @@ G4GammaNuclearXS::GetElementCrossSection(const G4DynamicParticle* aParticle, return xs; } -G4double G4GammaNuclearXS::GetIsoCrossSection( - const G4DynamicParticle* aParticle, - G4int Z, G4int A, - const G4Isotope*, const G4Element*, - const G4Material* mat) +G4double +G4GammaNuclearXS::ElementCrossSection(G4double ekin, G4int ZZ) +{ + G4DynamicParticle theGamma(gamma, G4ThreeVector(1,0,0), ekin); + return GetElementCrossSection(&theGamma, ZZ); +} + +G4double +G4GammaNuclearXS::IsoCrossSection(G4double ekin, G4int ZZ, G4int A) { - return GetElementCrossSection(aParticle, Z, mat) * A/aeff[Z]; + G4DynamicParticle theGamma(gamma, G4ThreeVector(1,0,0), ekin); + return GetIsoCrossSection(&theGamma, ZZ, A); +} + +G4double G4GammaNuclearXS::GetIsoCrossSection( + const G4DynamicParticle* aParticle, + G4int ZZ, G4int A, + const G4Isotope*, const G4Element*, + const G4Material*) +{ + const G4int Z = (ZZ >= MAXZGAMMAXS) ? MAXZGAMMAXS - 1 : ZZ; + /* + G4cout << "IsoCrossSection Z= " << Z << " A= " << A + << " Amin= " << amin[Z] << " Amax= " << amax[Z] + << " E(MeV)= " << ekin << G4endl; + */ + auto pv = GetPhysicsVector(Z); + if(pv == nullptr) { + return ggXsection->GetIsoCrossSection(aParticle, Z, A); + } + const G4double ekin = aParticle->GetKineticEnergy(); + const G4double emax = pv->GetMaxEnergy(); + G4double xs = 0.0; + + // compute isotope cross section if applicable + if(amin[Z] < amax[Z] && A >= amin[Z] && A <= amax[Z] && + ekin < rTransitionBound) { + auto pviso = data->GetComponentDataByIndex(Z, A - amin[Z]); + // isotope file exists + if(nullptr != pviso) { + const G4double emaxiso = pviso->GetMaxEnergy(); + if(ekin <= emaxiso) { + xs = pviso->Value(ekin); + } else { + G4DynamicParticle + theGamma(gamma, G4ThreeVector(0,0,1.), rTransitionBound); + const G4double rxs = ggXsection->GetIsoCrossSection(&theGamma, Z, A); + const G4double lxs = pviso->Value(emaxiso); + xs = lxs + (ekin - emaxiso)*(rxs - lxs)/(rTransitionBound-emaxiso); + } +#ifdef G4VERBOSE + if(verboseLevel > 1) { + G4cout << "G4GammaNuclearXS::IsoXS: Z= " << Z << " A= " << A + << " Ekin(MeV)= " << ekin/CLHEP::MeV + << ", ElmXS(b)= " << xs/CLHEP::barn << G4endl; + } +#endif + return xs; + } + } + + // use element x-section + // for the hydrogen target there is no element data + if(ekin <= emax && Z != 1) { + xs = pv->Value(ekin)*A/aeff[Z]; + + // CHIPS for high energy and for the hydrogen target + } else if(ekin >= rTransitionBound || Z == 1) { + if(Z <= 2 && ekin > 10.*GeV) { + xs = coeff[Z][A - amin[Z]]* + ggXsection->GetElementCrossSection(aParticle, Z, 0); + } else { + xs = ggXsection->GetIsoCrossSection(aParticle, Z, A); + } + + // transition GDR to CHIPS + } else { + const G4double rxs = xs150[Z]; + const G4double lxs = pv->Value(emax)*A/aeff[Z]; + xs = lxs + (ekin - emax)*(rxs - lxs)/(rTransitionBound-emax); + } +#ifdef G4VERBOSE + if(verboseLevel > 1) { + G4cout << "G4GammaNuclearXS::IsoXS: Z= " << Z << " A= " << A + << " Ekin(MeV)= " << ekin/CLHEP::MeV + << ", ElmXS(b)= " << xs/CLHEP::barn << G4endl; + } +#endif + return xs; } const G4Isotope* G4GammaNuclearXS::SelectIsotope( - const G4Element* anElement, G4double, G4double) + const G4Element* anElement, G4double kinEnergy, G4double) { size_t nIso = anElement->GetNumberOfIsotopes(); const G4Isotope* iso = anElement->GetIsotope(0); - //G4cout << "SelectIsotope NIso= " << nIso << G4endl; if(1 == nIso) { return iso; } const G4double* abundVector = anElement->GetRelativeAbundanceVector(); G4double q = G4UniformRand(); G4double sum = 0.0; size_t j; + G4int Z = anElement->GetZasInt(); - // isotope wise cross section not used + // condition to use only isotope abundance + if(amax[Z] == amin[Z] || kinEnergy > rTransitionBound || Z >= MAXZGAMMAXS ) { + for (j=0; jGetIsotope(j); + break; + } + } + return iso; + } + // use isotope cross sections + size_t nn = temp.size(); + if(nn < nIso) { temp.resize(nIso, 0.); } + for (j=0; jGetN() + // << " abund= " << abundVector[j] << G4endl; + sum += abundVector[j]* + IsoCrossSection(kinEnergy, Z, anElement->GetIsotope(j)->GetN()); + temp[j] = sum; + } + sum *= q; + for (j = 0; j= sum) { iso = anElement->GetIsotope(j); break; } @@ -190,29 +293,40 @@ G4GammaNuclearXS::BuildPhysicsTable(const G4ParticleDefinition& p) FatalException, ed, ""); return; } - if(0. == coeff[0]) { + + if(nullptr == data) { #ifdef G4MULTITHREADED G4MUTEXLOCK(&gNuclearXSMutex); - if(0. == coeff[0]) { + if(nullptr == data) { #endif - coeff[0] = 1.0; isMaster = true; + data = new G4ElementData(); + data->SetName("PhotoNuclear"); FindDirectoryPath(); #ifdef G4MULTITHREADED } G4MUTEXUNLOCK(&gNuclearXSMutex); #endif } + // it is possible re-initialisation for the second run + // Upload data for elements used in geometry + const G4ElementTable* table = G4Element::GetElementTable(); if(isMaster) { - // Upload data for elements used in geometry - const G4ElementTable* table = G4Element::GetElementTable(); for ( auto & elm : *table ) { - G4int Z = std::max( 1, std::min( elm->GetZasInt(), MAXZGAMMAN-1) ); - if ( nullptr == data[Z] ) { Initialise(Z); } + G4int Z = std::max( 1, std::min( elm->GetZasInt(), MAXZGAMMAXS-1) ); + if ( nullptr == data->GetElementData(Z) ) { Initialise(Z); } } } + + // prepare isotope selection + size_t nIso = temp.size(); + for ( auto & elm : *table ) { + size_t n = elm->GetNumberOfIsotopes(); + if(n > nIso) { nIso = n; } + } + temp.resize(nIso, 0.0); } const G4String& G4GammaNuclearXS::FindDirectoryPath() @@ -221,7 +335,7 @@ const G4String& G4GammaNuclearXS::FindDirectoryPath() // build the complete string identifying the file with the data set if(gDataDirectory.empty()) { char* path = std::getenv("G4PARTICLEXSDATA"); - if (path) { + if (nullptr != path) { std::ostringstream ost; ost << path << "/gamma/inel"; gDataDirectory = ost.str(); @@ -238,7 +352,7 @@ void G4GammaNuclearXS::InitialiseOnFly(G4int Z) { #ifdef G4MULTITHREADED G4MUTEXLOCK(&gNuclearXSMutex); - if(data[Z] == nullptr) { + if(nullptr == data->GetElementData(Z)) { #endif Initialise(Z); #ifdef G4MULTITHREADED @@ -249,41 +363,74 @@ void G4GammaNuclearXS::InitialiseOnFly(G4int Z) void G4GammaNuclearXS::Initialise(G4int Z) { - if(data[Z] != nullptr) { return; } + if(nullptr != data->GetElementData(Z)) { return; } // upload data from file - data[Z] = new G4PhysicsLogVector(); - std::ostringstream ost; ost << FindDirectoryPath() << Z ; - std::ifstream filein(ost.str().c_str()); - if (!(filein)) { - G4ExceptionDescription ed; - ed << "Data file <" << ost.str().c_str() - << "> is not opened!"; - G4Exception("G4GammaNuclearXS::Initialise(..)","had014", - FatalException, ed, "Check G4PARTICLEXSDATA"); - return; + G4PhysicsVector* v = RetrieveVector(ost, true, Z); + + data->InitialiseForElement(Z, v); + /* + G4cout << "G4GammaNuclearXS::Initialise for Z= " << Z + << " A= " << Amean << " Amin= " << amin[Z] + << " Amax= " << amax[Z] << G4endl; + */ + // upload isotope data + G4DynamicParticle theGamma(gamma, G4ThreeVector(1,0,0), rTransitionBound); + xs150[Z] = ggXsection->GetElementCrossSection(&theGamma, Z, 0); + if(amax[Z] > amin[Z]) { + size_t nmax = (size_t)(amax[Z]-amin[Z]+1); + data->InitialiseForComponent(Z, nmax); + for(G4int A=amin[Z]; A<=amax[Z]; ++A) { + std::ostringstream ost1; + ost1 << gDataDirectory << Z << "_" << A; + G4PhysicsVector* v1 = RetrieveVector(ost1, false, Z); + data->AddComponent(Z, A, v1); + if(Z<=2){ + theGamma.SetKineticEnergy(10.*GeV); + G4double sig1 = ggXsection->GetIsoCrossSection(&theGamma, Z, A); + G4double sig2 = ggXsection->GetElementCrossSection(&theGamma, Z, 0); + if(sig2 > 0.) coeff[Z][A-amin[Z]]=(sig1/sig2); + else coeff[Z][A-amin[Z]]=1.; + } + } } - if(verboseLevel > 1) { - G4cout << "file " << ost.str() - << " is opened by G4GammaNuclearXS" << G4endl; - } - - // retrieve data from DB - if(!data[Z]->Retrieve(filein, true)) { - G4ExceptionDescription ed; - ed << "Data file <" << ost.str().c_str() - << "> is not retrieved!"; - G4Exception("G4GammaNuclearXS::Initialise(..)","had015", - FatalException, ed, "Check G4PARTICLEXSDATA"); - return; - } - // smooth transition - G4Material* mat(nullptr); - G4ThreeVector mom(0.0,0.0,1.0); - G4DynamicParticle dp(gamma, mom, data[Z]->GetMaxEnergy()); - G4double sig1 = (*(data[Z]))[data[Z]->GetVectorLength()-1]; - G4double sig2 = ggXsection->GetElementCrossSection(&dp, Z, mat); - coeff[Z] = (sig2 > 0.) ? sig1/sig2 : 1.0; } + +G4PhysicsVector* +G4GammaNuclearXS::RetrieveVector(std::ostringstream& ost, G4bool isElement, G4int Z) +{ + G4PhysicsVector* v = nullptr; + + std::ifstream filein(ost.str().c_str()); + if (!filein.is_open()) { + if(isElement) { + G4ExceptionDescription ed; + ed << "Data file <" << ost.str().c_str() + << "> is not opened!"; + G4Exception("G4GammaNuclearXS::RetrieveVector(..)","had014", + FatalException, ed, "Check G4PARTICLEXSDATA"); + } + } else { + if(verboseLevel > 1) { + G4cout << "File " << ost.str() + << " is opened by G4GammaNuclearXS" << G4endl; + } + // retrieve data from DB + if(std::find(std::begin(freeVectorException), std::end(freeVectorException), Z ) == std::end(freeVectorException) && isElement) { + v = new G4PhysicsLinearVector(); + } else { + v = new G4PhysicsVector(); + } + if(!v->Retrieve(filein, true)) { + G4ExceptionDescription ed; + ed << "Data file <" << ost.str().c_str() + << "> is not retrieved!"; + G4Exception("G4GammaNuclearXS::RetrieveVector(..)","had015", + FatalException, ed, "Check G4PARTICLEXSDATA"); + } + } + return v; +} + diff --git a/source/processes/hadronic/cross_sections/src/G4IonsShenCrossSection.cc b/source/processes/hadronic/cross_sections/src/G4IonsShenCrossSection.cc new file mode 100644 index 0000000000..52be7bdf48 --- /dev/null +++ b/source/processes/hadronic/cross_sections/src/G4IonsShenCrossSection.cc @@ -0,0 +1,166 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// 18-Sep-2003 First version is written by T. Koi +// 12-Nov-2003 Add energy check at lower side T. Koi +// 15-Nov-2006 Above 10GeV/n Cross Section become constant T. Koi (SLAC/SCCS) +// 23-Dec-2006 Isotope dependence adde by D. Wright +// 14-Mar-2011 Moved constructor, destructor and virtual methods to source by V.Ivanchenko +// 19-Aug-2011 V.Ivanchenko move to new design and make x-section per element +// + +#include "G4IonsShenCrossSection.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4DynamicParticle.hh" +#include "G4NucleiProperties.hh" +#include "G4HadTmpUtil.hh" +#include "G4NistManager.hh" + +G4IonsShenCrossSection::G4IonsShenCrossSection() + : G4VCrossSectionDataSet("IonsShen"), + upperLimit( 10*GeV ), +// lowerLimit( 10*MeV ), + r0 ( 1.1 ) +{} + +G4IonsShenCrossSection::~G4IonsShenCrossSection() +{} + +void +G4IonsShenCrossSection::CrossSectionDescription(std::ostream& outFile) const +{ + outFile << "G4IonsShenCrossSection calculates the total reaction cross\n" + << "section for nucleus-nucleus scattering using the Shen\n" + << "parameterization. It is valid for projectiles and targets of\n" + << "all Z, and projectile energies up to 1 TeV/n. Above 10 GeV/n" + << "the cross section is constant. Below 10 MeV/n zero cross\n" + << "is returned.\n"; +} + +G4bool G4IonsShenCrossSection::IsElementApplicable(const G4DynamicParticle* aDP, + G4int, const G4Material*) +{ + return (1 <= aDP->GetDefinition()->GetBaryonNumber()); +} + +G4double +G4IonsShenCrossSection::GetElementCrossSection(const G4DynamicParticle* aParticle, + G4int Z, + const G4Material*) +{ + G4int A = G4lrint(G4NistManager::Instance()->GetAtomicMassAmu(Z)); + return GetIsoCrossSection(aParticle, Z, A); +} + +G4double G4IonsShenCrossSection::GetIsoCrossSection(const G4DynamicParticle* aParticle, + G4int Zt, G4int At, + const G4Isotope*, + const G4Element*, + const G4Material*) + +{ + G4double xsection = 0.0; + + G4int Ap = aParticle->GetDefinition()->GetBaryonNumber(); + G4int Zp = G4lrint(aParticle->GetDefinition()->GetPDGCharge()/eplus); + G4double ke_per_N = aParticle->GetKineticEnergy() / Ap; + if ( ke_per_N > upperLimit ) { ke_per_N = upperLimit; } + + // Apply energy check, if less than lower limit then 0 value is returned + //if ( ke_per_N < lowerLimit ) { return xsection; } + + G4Pow* g4pow = G4Pow::GetInstance(); + + G4double cubicrAt = g4pow->Z13(At); + G4double cubicrAp = g4pow->Z13(Ap); + + G4double Rt = 1.12 * cubicrAt - 0.94 * ( 1.0 / cubicrAt ); + G4double Rp = 1.12 * cubicrAp - 0.94 * ( 1.0 / cubicrAp ); + + G4double r = Rt + Rp + 3.2; // in fm + G4double b = 1.0; // in MeV/fm + G4double targ_mass = G4NucleiProperties::GetNuclearMass(At, Zt); + + G4double proj_mass = aParticle->GetMass(); + G4double proj_momentum = aParticle->GetMomentum().mag(); + + G4double Ecm = calEcmValue (proj_mass, targ_mass, proj_momentum); + + G4double B = 1.44 * Zt * Zp / r - b * Rt * Rp / ( Rt + Rp ); + if(Ecm <= B) { return xsection; } + + G4double c = calCeValue ( ke_per_N / MeV ); + + G4double R1 = r0 * (cubicrAt + cubicrAp + 1.85*cubicrAt*cubicrAp/(cubicrAt + cubicrAp) - c); + + G4double R2 = 1.0 * ( At - 2 * Zt ) * Zp / ( Ap * At ); + + + G4double R3 = (0.176 / g4pow->A13(Ecm)) * cubicrAt * cubicrAp /(cubicrAt + cubicrAp); + + G4double R = R1 + R2 + R3; + + xsection = 10 * pi * R * R * ( 1 - B / Ecm ); + xsection = xsection * millibarn; // mulitply xsection by millibarn + + return xsection; +} + +G4double +G4IonsShenCrossSection::calEcmValue(const G4double mp, const G4double mt, + const G4double Plab) +{ + G4double Elab = std::sqrt ( mp * mp + Plab * Plab ); + G4double Ecm = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt ); + G4double Pcm = Plab * mt / Ecm; + G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp; + return KEcm; +} + + +G4double G4IonsShenCrossSection::calCeValue(const G4double ke) +{ + // Calculate c value + // This value is indepenent from projectile and target particle + // ke is projectile kinetic energy per nucleon in the Lab system + // with MeV unit + // fitting function is made by T. Koi + // There are no data below 30 MeV/n in Kox et al., + + G4double Ce; + G4double log10_ke = std::log10 ( ke ); + if (log10_ke > 1.5) + { + Ce = -10.0/std::pow(G4double(log10_ke), G4double(5)) + 2.0; + } + else + { + Ce = (-10.0/std::pow(G4double(1.5), G4double(5) ) + 2.0) / + std::pow(G4double(1.5) , G4double(3)) * std::pow(G4double(log10_ke), G4double(3)); + } + return Ce; +} + diff --git a/source/processes/hadronic/cross_sections/src/G4NeutronCaptureXS.cc b/source/processes/hadronic/cross_sections/src/G4NeutronCaptureXS.cc index 98d5e7b3a3..0015b6d7e4 100644 --- a/source/processes/hadronic/cross_sections/src/G4NeutronCaptureXS.cc +++ b/source/processes/hadronic/cross_sections/src/G4NeutronCaptureXS.cc @@ -49,11 +49,6 @@ #include "Randomize.hh" #include "G4Log.hh" -// factory -#include "G4CrossSectionFactory.hh" -// -G4_DECLARE_XS_FACTORY(G4NeutronCaptureXS); - G4ElementData* G4NeutronCaptureXS::data = nullptr; G4String G4NeutronCaptureXS::gDataDirectory = ""; @@ -158,8 +153,8 @@ G4double G4NeutronCaptureXS::IsoCrossSection(G4double eKin, G4double logE, auto pv = GetPhysicsVector(Z); if(pv == nullptr) { return xs; } - if(amin[Z] > 0 && A >= amin[Z] && A <= amax[Z]) { - G4PhysicsVector* pviso = data->GetComponentDataByID(Z, A - amin[Z]); + if(amin[Z] < amax[Z] && A >= amin[Z] && A <= amax[Z]) { + G4PhysicsVector* pviso = data->GetComponentDataByIndex(Z, A - amin[Z]); if(pviso != nullptr) { const G4double e1 = pviso->Energy(1); xs = (ekin >= e1) ? pviso->LogVectorValue(ekin, logEkin) @@ -207,7 +202,7 @@ G4NeutronCaptureXS::SelectIsotope(const G4Element* anElement, // is there isotope wise cross section? size_t j; - if(0 == amin[Z] || Z >= MAXZCAPTURE) { + if(amax[Z] == amin[Z] || Z >= MAXZCAPTURE) { for (j = 0; jSetName("NeutronCapture"); FindDirectoryPath(); #ifdef G4MULTITHREADED @@ -291,7 +286,7 @@ const G4String& G4NeutronCaptureXS::FindDirectoryPath() // build the complete string identifying the file with the data set if(gDataDirectory.empty()) { char* path = std::getenv("G4PARTICLEXSDATA"); - if (path) { + if (nullptr != path) { std::ostringstream ost; ost << path << "/neutron/cap"; gDataDirectory = ost.str(); @@ -328,8 +323,8 @@ void G4NeutronCaptureXS::Initialise(G4int Z) data->InitialiseForElement(Z, v); // upload isotope data - if(amin[Z] > 0) { - size_t nmax = (size_t)(amax[Z]-amin[Z]+1); + if(amin[Z] < amax[Z]) { + G4int nmax = amax[Z] - amin[Z] + 1; data->InitialiseForComponent(Z, nmax); for(G4int A=amin[Z]; A<=amax[Z]; ++A) { @@ -346,7 +341,7 @@ G4NeutronCaptureXS::RetrieveVector(std::ostringstream& ost, G4bool warn) { G4PhysicsLogVector* v = nullptr; std::ifstream filein(ost.str().c_str()); - if (!(filein)) { + if (!filein.is_open()) { if(warn) { G4ExceptionDescription ed; ed << "Data file <" << ost.str().c_str() diff --git a/source/processes/hadronic/cross_sections/src/G4NeutronElasticXS.cc b/source/processes/hadronic/cross_sections/src/G4NeutronElasticXS.cc index a8e7aa17d2..fae9cf0677 100644 --- a/source/processes/hadronic/cross_sections/src/G4NeutronElasticXS.cc +++ b/source/processes/hadronic/cross_sections/src/G4NeutronElasticXS.cc @@ -51,11 +51,6 @@ #include #include -// factory -#include "G4CrossSectionFactory.hh" -// -G4_DECLARE_XS_FACTORY(G4NeutronElasticXS); - G4PhysicsVector* G4NeutronElasticXS::data[] = {nullptr}; G4double G4NeutronElasticXS::coeff[] = {0.0}; G4String G4NeutronElasticXS::gDataDirectory = ""; @@ -108,7 +103,7 @@ G4bool G4NeutronElasticXS::IsIsoApplicable(const G4DynamicParticle*, G4int, G4int, const G4Element*, const G4Material*) { - return true; + return false; } G4double @@ -225,7 +220,7 @@ const G4String& G4NeutronElasticXS::FindDirectoryPath() // build the complete string identifying the file with the data set if(gDataDirectory.empty()) { char* path = std::getenv("G4PARTICLEXSDATA"); - if (path) { + if (nullptr != path) { std::ostringstream ost; ost << path << "/neutron/el"; gDataDirectory = ost.str(); @@ -261,7 +256,7 @@ void G4NeutronElasticXS::Initialise(G4int Z) std::ostringstream ost; ost << FindDirectoryPath() << Z ; std::ifstream filein(ost.str().c_str()); - if (!(filein)) { + if (!filein.is_open()) { G4ExceptionDescription ed; ed << "Data file <" << ost.str().c_str() << "> is not opened!"; diff --git a/source/processes/hadronic/cross_sections/src/G4NeutronInelasticXS.cc b/source/processes/hadronic/cross_sections/src/G4NeutronInelasticXS.cc index 2d0156e640..77ba8569b2 100644 --- a/source/processes/hadronic/cross_sections/src/G4NeutronInelasticXS.cc +++ b/source/processes/hadronic/cross_sections/src/G4NeutronInelasticXS.cc @@ -49,11 +49,6 @@ #include #include -// factory -#include "G4CrossSectionFactory.hh" -// -G4_DECLARE_XS_FACTORY(G4NeutronInelasticXS); - G4double G4NeutronInelasticXS::coeff[] = {1.0}; G4ElementData* G4NeutronInelasticXS::data = nullptr; G4String G4NeutronInelasticXS::gDataDirectory = ""; @@ -163,7 +158,7 @@ G4NeutronInelasticXS::IsoCrossSection(G4double ekin, G4double logekin, // compute isotope cross section if applicable const G4double emax = pv->GetMaxEnergy(); - if(ekin <= emax && amin[Z] > 0 && A >= amin[Z] && A <= amax[Z]) { + if(ekin <= emax && amin[Z] < amax[Z] && A >= amin[Z] && A <= amax[Z]) { auto pviso = data->GetComponentDataByIndex(Z, A - amin[Z]); if(pviso) { xs = pviso->LogVectorValue(ekin, logekin); @@ -216,7 +211,7 @@ const G4Isotope* G4NeutronInelasticXS::SelectIsotope( size_t j; // isotope wise cross section not available - if(0 == amin[Z] || Z >= MAXZINEL) { + if(amax[Z] == amin[Z] || Z >= MAXZINEL) { for (j=0; jSetName("NeutronInelastic"); FindDirectoryPath(); #ifdef G4MULTITHREADED @@ -303,7 +298,7 @@ const G4String& G4NeutronInelasticXS::FindDirectoryPath() // build the complete string identifying the file with the data set if(gDataDirectory.empty()) { char* path = std::getenv("G4PARTICLEXSDATA"); - if (path) { + if (nullptr != path) { std::ostringstream ost; ost << path << "/neutron/inel"; gDataDirectory = ost.str(); @@ -344,8 +339,8 @@ void G4NeutronInelasticXS::Initialise(G4int Z) << " Amax= " << amax[Z] << G4endl; */ // upload isotope data - if(amin[Z] > 0) { - size_t nmax = (size_t)(amax[Z]-amin[Z]+1); + if(amin[Z] < amax[Z]) { + G4int nmax = amax[Z] - amin[Z] + 1; data->InitialiseForComponent(Z, nmax); for(G4int A=amin[Z]; A<=amax[Z]; ++A) { @@ -369,7 +364,7 @@ G4NeutronInelasticXS::RetrieveVector(std::ostringstream& ost, G4bool warn) { G4PhysicsLogVector* v = nullptr; std::ifstream filein(ost.str().c_str()); - if (!(filein)) { + if (!filein.is_open()) { if(warn) { G4ExceptionDescription ed; ed << "Data file <" << ost.str().c_str() diff --git a/source/processes/hadronic/cross_sections/src/G4NucleonNuclearCrossSection.cc b/source/processes/hadronic/cross_sections/src/G4NucleonNuclearCrossSection.cc index 390410e7b5..229557ca82 100644 --- a/source/processes/hadronic/cross_sections/src/G4NucleonNuclearCrossSection.cc +++ b/source/processes/hadronic/cross_sections/src/G4NucleonNuclearCrossSection.cc @@ -39,11 +39,6 @@ #include "G4Proton.hh" #include "G4ComponentBarNucleonNucleusXsc.hh" -// factory -#include "G4CrossSectionFactory.hh" -// -G4_DECLARE_XS_FACTORY(G4NucleonNuclearCrossSection); - /////////////////////////////////////////////////////////////////////////////// G4NucleonNuclearCrossSection::G4NucleonNuclearCrossSection() diff --git a/source/processes/hadronic/cross_sections/src/G4ParticleInelasticXS.cc b/source/processes/hadronic/cross_sections/src/G4ParticleInelasticXS.cc index e191436aed..561dc0d8ae 100644 --- a/source/processes/hadronic/cross_sections/src/G4ParticleInelasticXS.cc +++ b/source/processes/hadronic/cross_sections/src/G4ParticleInelasticXS.cc @@ -191,7 +191,7 @@ G4ParticleInelasticXS::IsoCrossSection(G4double ekin, G4double logE, // compute isotope cross section if applicable const G4double emax = pv->GetMaxEnergy(); - if(ekin <= emax && amin[Z]>0 && A >= amin[Z] && A <= amax[Z]) { + if(ekin <= emax && amin[Z] < amax[Z] && A >= amin[Z] && A <= amax[Z]) { auto pviso = data[index]->GetComponentDataByIndex(Z, A - amin[Z]); if(pviso != nullptr) { xs = pviso->LogVectorValue(ekin, logE); @@ -247,7 +247,7 @@ const G4Isotope* G4ParticleInelasticXS::SelectIsotope( size_t j; // isotope wise cross section not available - if(0 == amin[Z] || Z >= MAXZINELP) { + if(amax[Z] == amin[Z] || Z >= MAXZINELP) { for (j=0; jSetName(particle->GetParticleName() + "Inelastic"); FindDirectoryPath(); #ifdef G4MULTITHREADED @@ -337,7 +337,7 @@ const G4String& G4ParticleInelasticXS::FindDirectoryPath() // build the complete string identifying the file with the data set if(gDataDirectory[index].empty()) { char* path = std::getenv("G4PARTICLEXSDATA"); - if (path) { + if (nullptr != path) { std::ostringstream ost; ost << path << "/" << particle->GetParticleName() << "/inel"; gDataDirectory[index] = ost.str(); @@ -380,8 +380,8 @@ void G4ParticleInelasticXS::Initialise(G4int Z) << " " << FindDirectoryPath() << G4endl; */ // upload isotope data - if(amin[Z] > 0) { - size_t nmax = (size_t)(amax[Z]-amin[Z]+1); + if(amin[Z] < amax[Z]) { + G4int nmax = amax[Z] - amin[Z] + 1; data[index]->InitialiseForComponent(Z, nmax); for(G4int A=amin[Z]; A<=amax[Z]; ++A) { @@ -412,7 +412,7 @@ G4ParticleInelasticXS::RetrieveVector(std::ostringstream& ost, G4bool warn) { G4PhysicsLogVector* v = nullptr; std::ifstream filein(ost.str().c_str()); - if (!(filein)) { + if (!filein.is_open()) { if(warn) { G4ExceptionDescription ed; ed << "Data file <" << ost.str().c_str() diff --git a/source/processes/hadronic/cross_sections/src/G4PhotoNuclearCrossSection.cc b/source/processes/hadronic/cross_sections/src/G4PhotoNuclearCrossSection.cc index 8dabe99abe..4c4f89563f 100644 --- a/source/processes/hadronic/cross_sections/src/G4PhotoNuclearCrossSection.cc +++ b/source/processes/hadronic/cross_sections/src/G4PhotoNuclearCrossSection.cc @@ -35,13 +35,6 @@ #include "G4PhotoNuclearCrossSection.hh" #include "G4SystemOfUnits.hh" -#include "G4HadTmpUtil.hh" - -// factory -#include "G4CrossSectionFactory.hh" -// -G4_DECLARE_XS_FACTORY(G4PhotoNuclearCrossSection); - static const G4double THmin=2.; // minimum Energy Threshold static const G4double dE=1.; // step for the GDR table @@ -1489,38 +1482,26 @@ static const G4double* SH[nHA]={ SH0,SH1,SH2,SH3,SH4,SH5,SH6,SH7,SH8,SH9,SH10,SH11,SH12,SH13}; - // Bug 2092 fix (ejc3) Init deuteron_GDR ptr to null G4PhotoNuclearCrossSection::G4PhotoNuclearCrossSection() - : G4VCrossSectionDataSet(Default_Name()), lastZ(0), lastSig(0), lastGDR(0), - lastHEN(0), lastE(0), lastTH(0), lastSP(0), - deuteron_GDR(0), deuteron_HR(0), deuteron_TH(0), deuteron_SP(0), - triton_GDR(0), triton_HR(0), triton_TH(0), triton_SP(0), - he3_GDR(0), he3_HR(0), he3_TH(0), he3_SP(0), + : G4VCrossSectionDataSet(Default_Name()), mNeut(G4NucleiProperties::GetNuclearMass(1,0)), mProt(G4NucleiProperties::GetNuclearMass(1,1)) { SetForAllAtomsAndEnergies(true); nistmngr = G4NistManager::Instance(); - for (G4int i = 0; i < 120; i++) { - GDR.push_back(0); - HEN.push_back(0); - spA.push_back(0); - eTH.push_back(0); - } + GDR.resize(120, nullptr); + HEN.resize(120, nullptr); + spA.resize(120, 0.0); + eTH.resize(120, 0.0); } G4PhotoNuclearCrossSection::~G4PhotoNuclearCrossSection() { - std::vector::iterator posi; - for (posi = GDR.begin(); posi < GDR.end(); posi++) - { delete [] *posi; } - GDR.clear(); - for (posi = HEN.begin(); posi < HEN.end(); posi++) - { delete [] *posi; } - HEN.clear(); + for (auto & ptr : GDR) { delete [] ptr; } + for (auto & ptr : HEN) { delete [] ptr; } } @@ -1542,7 +1523,6 @@ G4PhotoNuclearCrossSection::IsIsoApplicable(const G4DynamicParticle*, const G4Material*) { // explicitly allow deuterium and tritium -// if (Z == 1 && (A == 2 || A == 3) ) return true; if ((Z == 1 && A == 2) || (Z == 1 && A == 3) || (Z == 2 && A == 3) ) return true; return false; @@ -1565,19 +1545,19 @@ G4PhotoNuclearCrossSection::GetIsoCrossSection(const G4DynamicParticle* aPart, const G4Element*, const G4Material* mat) { - const G4double Energy = aPart->GetKineticEnergy()/MeV; + G4double Energy = aPart->GetKineticEnergy()/MeV; if (Energy < THmin) return 0.; G4double sigma; G4double lE; if (Z == 1 && A == 2) { // init the XS table if need be - if (deuteron_GDR == NULL) { + if (deuteron_GDR == nullptr) { deuteron_TH = ThresholdEnergy(1,1); // threshold calculation is correct deuteron_GDR = new G4double[nL]; // direct copies - for (G4int i = 0 ; i < nL ; i++) deuteron_GDR[i] = SL[0][i]; // A = 2 -> SL0 + for (G4int i = 0; i < nL; ++i) deuteron_GDR[i] = SL[0][i]; // A = 2 -> SL0 deuteron_HR = new G4double[nH]; - for (G4int i = 0 ; i < nH ; i++) deuteron_HR[i] = SH[1][i]; // A = 2 -> SH1 + for (G4int i = 0; i < nH; ++i) deuteron_HR[i] = SH[1][i]; // A = 2 -> SH1 deuteron_SP = 1; // as would be assigned for proton } if (Energy < deuteron_TH) { @@ -1593,12 +1573,12 @@ G4PhotoNuclearCrossSection::GetIsoCrossSection(const G4DynamicParticle* aPart, } } else if (Z == 1 && A == 3) { - if (triton_GDR == NULL) { + if (triton_GDR == nullptr) { triton_TH = ThresholdEnergy(1,2); triton_GDR = new G4double[nL]; // same as for deuteron since no A = 3 entry - for (G4int i = 0 ; i < nL ; i++) triton_GDR[i] = SL[0][i]; // A = 3 -> SL0 + for (G4int i = 0; i < nL; ++i) triton_GDR[i] = SL[0][i]; // A = 3 -> SL0 triton_HR = new G4double[nH]; - for (G4int i = 0 ; i < nH ; i++) triton_HR[i] = SH[2][i]; // A = 3 -> SH2 + for (G4int i = 0; i < nH; ++i) triton_HR[i] = SH[2][i]; // A = 3 -> SH2 triton_SP = 1; } if (Energy < triton_TH) { @@ -1614,12 +1594,12 @@ G4PhotoNuclearCrossSection::GetIsoCrossSection(const G4DynamicParticle* aPart, } } else if (Z == 2 && A == 3) { - if (he3_GDR == NULL) { + if (he3_GDR == nullptr) { he3_TH = ThresholdEnergy(2,1); - he3_GDR = new G4double[nL]; // same as for deuteron since no A = 3 entry - for (G4int i = 0 ; i < nL ; i++) he3_GDR[i] = SL[0][i]; // A = 3 -> SL0 + he3_GDR = new G4double[nL]; // same as for deuteron since no A = 3 entry + for (G4int i = 0 ; i < nL ; ++i) he3_GDR[i] = SL[0][i]; // A = 3 -> SL0 he3_HR = new G4double[nH]; - for (G4int i = 0 ; i < nH ; i++) he3_HR[i] = SH[2][i]; // A = 3 -> SH2 + for (G4int i = 0 ; i < nH ; ++i) he3_HR[i] = SH[2][i]; // A = 3 -> SH2 he3_SP = 2; } if (Energy < he3_TH) { @@ -1644,7 +1624,7 @@ G4PhotoNuclearCrossSection::GetIsoCrossSection(const G4DynamicParticle* aPart, // The main member function giving the gamma-A cross section -// (E in GeV, CS in mb) <-??????? GeV ??????? (WP) +// (E in MeV, CS in mb) G4double G4PhotoNuclearCrossSection::GetElementCrossSection(const G4DynamicParticle* aPart, G4int ZZ, const G4Material*) @@ -1667,7 +1647,7 @@ G4PhotoNuclearCrossSection::GetElementCrossSection(const G4DynamicParticle* aPar else { G4double Aa = nistmngr->GetAtomicMassAmu(ZZ); // average A - G4int N = (G4int)Aa - ZZ; + G4int N = static_cast(Aa) - ZZ; G4double lnA=G4Log(Aa); // The nucleus is not found in DB. It is new. if(Aa==1.) lastSP=1.; // The Reggeon shadowing (A=1) @@ -1714,7 +1694,7 @@ G4PhotoNuclearCrossSection::GetElementCrossSection(const G4DynamicParticle* aPar } // End of "sigma" calculation - if(sigma<0.) return 0.; + sigma = std::max(sigma, 0.); return sigma*millibarn; } @@ -1761,56 +1741,56 @@ G4PhotoNuclearCrossSection::EquLinearFit(G4double X, G4int N, const G4double X0, const G4double DX, const G4double* Y) { - if(DX<=0. || N<2) + if(DX<=0. || N<2) { - G4cout<<"***G4PhotoNuclearCrossSection::EquLinearFit: DX="<=nLA) k=nLA-1; // Extrapolation from the last bin (U) G4int k1=k-1; G4double xi=LA[k1]; G4double b=(a-xi)/(LA[k]-xi); - for(G4int q=0; q1.5) { @@ -1821,21 +1801,21 @@ G4PhotoNuclearCrossSection::GetFunctions(G4double a, G4double* y, G4double* z) } r=1; } - if(!h) // High Energy part is not filled + if(0 == h) // High Energy part is not filled { G4int k=0; - for(k=1; k=nHA) k=nHA-1; // Extrapolation from the last bin (Pu) + for(k=1; k=nHA) k=nHA-1; // Extrapolation from the last bin (Pu) G4int k1=k-1; G4double xi=HA[k1]; G4double b=(a-xi)/(HA[k]-xi); - for(G4int q=0; q epCheckLevels; G4bool levelsSetByProcess; diff --git a/source/processes/hadronic/management/include/G4HadronicProcessType.hh b/source/processes/hadronic/management/include/G4HadronicProcessType.hh index 06e65173b6..5d36b215ba 100644 --- a/source/processes/hadronic/management/include/G4HadronicProcessType.hh +++ b/source/processes/hadronic/management/include/G4HadronicProcessType.hh @@ -48,6 +48,7 @@ enum G4HadronicProcessType fHadronAtRest = 151, fLeptonAtRest = 152, fChargeExchange = 161, - fRadioactiveDecay = 210 + fRadioactiveDecay = 210, + fEMDissociation = 310 }; #endif diff --git a/source/processes/hadronic/management/src/G4HadronicProcess.cc b/source/processes/hadronic/management/src/G4HadronicProcess.cc index 2713aefc9e..0787282954 100644 --- a/source/processes/hadronic/management/src/G4HadronicProcess.cc +++ b/source/processes/hadronic/management/src/G4HadronicProcess.cc @@ -66,7 +66,6 @@ #include "G4VCrossSectionDataSet.hh" #include "G4NistManager.hh" -#include "G4PhysicsModelCatalog.hh" #include "G4VLeadingParticleBiasing.hh" #include "G4Exp.hh" @@ -119,7 +118,6 @@ void G4HadronicProcess::InitialiseLocal() { useIntegralXS = true; theLastCrossSection = 0.0; nICelectrons = 0; - idxIC = -1; G4HadronicProcess_debug_flag = false; levelsSetByProcess = false; epReportLevel = 0; @@ -414,10 +412,6 @@ G4HadronicProcess::FillResult(G4HadFinalState * aR, const G4Track & aT) // check secondaries nICelectrons = 0; - if(idxIC == -1) { - G4int idx = G4PhysicsModelCatalog::GetIndex("e-InternalConvertion"); - idxIC = -1 == idx ? -2 : idx; - } G4int nSec = aR->GetNumberOfSecondaries(); theTotalResult->SetNumberOfSecondaries(nSec); G4double time0 = aT.GetGlobalTime(); @@ -453,15 +447,14 @@ G4HadronicProcess::FillResult(G4HadFinalState * aR, const G4Track & aT) dynParticle->SetKineticEnergy(e); dynParticle->SetMass(mass); } - G4int idxModel = aR->GetSecondary(i)->GetCreatorModelType(); - //if(idxIC == idxModel) { ++nICelectrons; } + G4int idModel = aR->GetSecondary(i)->GetCreatorModelID(); if(part->GetPDGEncoding() == 11) { ++nICelectrons; } // time of interaction starts from zero + global time G4double time = std::max(aR->GetSecondary(i)->GetTime(), 0.0) + time0; G4Track* track = new G4Track(dynParticle, time, aT.GetPosition()); - track->SetCreatorModelIndex(idxModel); + track->SetCreatorModelID(idModel); G4double newWeight = fWeight*aR->GetSecondary(i)->GetWeight(); track->SetWeight(newWeight); track->SetTouchableHandle(aT.GetTouchableHandle()); diff --git a/source/processes/hadronic/management/src/G4HadronicProcessStore.cc b/source/processes/hadronic/management/src/G4HadronicProcessStore.cc index 4210c7965d..94066565a6 100644 --- a/source/processes/hadronic/management/src/G4HadronicProcessStore.cc +++ b/source/processes/hadronic/management/src/G4HadronicProcessStore.cc @@ -91,6 +91,9 @@ void G4HadronicProcessStore::Clean() delete itr; extraProcess.clear(); + m_map.clear(); + p_map.clear(); + n_extra = 0; n_proc = 0; } diff --git a/source/processes/hadronic/models/abla/GNUmakefile b/source/processes/hadronic/models/abla/GNUmakefile index 9dc2a10b1e..23f26f8655 100644 --- a/source/processes/hadronic/models/abla/GNUmakefile +++ b/source/processes/hadronic/models/abla/GNUmakefile @@ -26,6 +26,7 @@ CPPFLAGS += -I$(G4BASE)/geometry/management/include \ -I$(G4BASE)/processes/management/include \ -I$(G4BASE)/processes/hadronic/management/include \ -I$(G4BASE)/processes/hadronic/util/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/management/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/handler/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/evaporation/include \ -I$(G4BASE)/track/include \ diff --git a/source/processes/hadronic/models/abla/History b/source/processes/hadronic/models/abla/History index 79e877ff2a..3f55c19de0 100644 --- a/source/processes/hadronic/models/abla/History +++ b/source/processes/hadronic/models/abla/History @@ -15,6 +15,26 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +8 November 2021 - Jose Luis Rodriguez Sanchez (hadr-abla-V10-07-05) +----------------------------------------------------- +- Update of G4Abla for hypernuclei. + +27 October 2021 - Alberto Ribon (hadr-abla-V10-07-04) +----------------------------------------------------- +- G4AblaInterface : extended for hypernuclei. + (Thanks to Jose Luis Rodriguez Sanchez for extending the arguments of + the method G4Abla::DeexcitationAblaxx to the nucleus strangeness.) + +04 August 2021 - Alberto Ribon (hadr-abla-V10-07-03) +---------------------------------------------------- +- G4AblaInterface : set the model creator ID using the new version + of G4PhysicsModelCatalog. + +13 July 2021 - Alberto Ribon (hadr-abla-V10-07-02) +-------------------------------------------------- +- G4Abla : deleted array variables (problamb and Nblamb) with + array delete (instead of non-array delete), as suggested by Coverity. + 16 April 2021 - Ben Morgan (hadr-abla-V10-07-01) -------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/abla/include/G4AblaInterface.hh b/source/processes/hadronic/models/abla/include/G4AblaInterface.hh index 7db9fb69ca..42958ed61d 100644 --- a/source/processes/hadronic/models/abla/include/G4AblaInterface.hh +++ b/source/processes/hadronic/models/abla/include/G4AblaInterface.hh @@ -30,14 +30,11 @@ // Davide Mancusi, CEA (contact person INCL) // Aatos Heikkinen, HIP (project coordination) // -#define ABLAXX_IN_GEANT4_MODE 1 - -#include "globals.hh" #ifndef G4AblaInterface_hh #define G4AblaInterface_hh 1 -#ifdef ABLAXX_IN_GEANT4_MODE +#include "globals.hh" #include "G4VPreCompoundModel.hh" #include "G4ReactionProduct.hh" @@ -47,34 +44,44 @@ #include "G4Nucleus.hh" #include "G4Abla.hh" -class G4AblaInterface : public G4VPreCompoundModel { -public: - G4AblaInterface(); +class G4ExcitationHandler; + +class G4AblaInterface : public G4VPreCompoundModel +{ + public: + G4AblaInterface(G4ExcitationHandler* ptr = nullptr); virtual ~G4AblaInterface(); - virtual G4ReactionProductVector *DeExcite(G4Fragment &aFragment); + virtual G4ReactionProductVector* DeExcite(G4Fragment& aFragment); - virtual G4HadFinalState *ApplyYourself(G4HadProjectile const &, G4Nucleus &) { - return NULL; + virtual G4HadFinalState* ApplyYourself(G4HadProjectile const&, G4Nucleus&) + { +return nullptr; } + virtual void BuildPhysicsTable(const G4ParticleDefinition&) final; + + virtual void InitialiseModel() final; + virtual void ModelDescription(std::ostream& outFile) const; + virtual void DeExciteModelDescription(std::ostream& outFile) const; -private: - G4VarNtp *ablaResult; - G4Volant *volant; - G4Abla *theABLAModel; + private: + G4VarNtp* ablaResult; + G4Volant* volant; + G4Abla* theABLAModel; G4long eventNumber; + G4int secID; // Creator model ID for the secondaries created by ABLA + + G4bool isInitialised; /// \brief Convert an Abla particle to a G4DynamicParticle - G4ReactionProduct *toG4Particle(G4int A, G4int Z, G4int S, G4double kinE, G4double px, G4double py, G4double pz) const; + G4ReactionProduct* toG4Particle(G4int A, G4int Z, G4int S, G4double kinE, + G4double px, G4double py, G4double pz) const; /// \brief Convert A, Z and S to a G4ParticleDefinition - G4ParticleDefinition *toG4ParticleDefinition (G4int A, G4int Z, G4int S) const; - + G4ParticleDefinition* toG4ParticleDefinition(G4int A, G4int Z, G4int S) const; }; -#endif // ABLAXX_IN_GEANT4_MODE - #endif diff --git a/source/processes/hadronic/models/abla/src/G4Abla.cc b/source/processes/hadronic/models/abla/src/G4Abla.cc index ac9d123b68..0301794135 100644 --- a/source/processes/hadronic/models/abla/src/G4Abla.cc +++ b/source/processes/hadronic/models/abla/src/G4Abla.cc @@ -1318,8 +1318,8 @@ c Clear BU_TAB (array of multifragmentation products) EV_TAB[i][4] = VZOUT; } if(IMULTBU>200)std::cout << "IMULTBU>200 " << IMULTBU << std::endl; - delete problamb; - delete Nblamb; + delete[] problamb; + delete[] Nblamb; }// if(T_diff>0.1) // End of multi-fragmentation mult7777: @@ -7793,32 +7793,65 @@ G4double G4Abla::gethyperseparation(G4double A, G4double Z, G4int ny){ if(A<1.)return 1.e38; // For light nuclei we take experimental values // Journal of Physics G, Nucl Part Phys 32,363 (2006) - if(ny==1){ - if(Z==1 && A==4) return 2.04; - else if(Z==2 && A==4) return 2.39; - else if(Z==2 && A==5) return 3.12; - else if(Z==2 && A==6) return 4.18; - else if(Z==2 && A==7) return 5.23; - else if(Z==2 && A==8) return 7.16; - else if(Z==3 && A==6) return 4.50; - else if(Z==3 && A==7) return 5.58; - else if(Z==3 && A==8) return 6.80; - else if(Z==3 && A==9) return 8.50; - else if(Z==4 && A==7) return 5.16; - else if(Z==4 && A==8) return 6.84; - else if(Z==4 && A==9) return 6.71; - else if(Z==4 && A==10) return 9.11; - else if(Z==5 && A==9) return 8.29; - else if(Z==5 && A==10) return 8.89; - else if(Z==5 && A==11) return 10.24; - else if(Z==5 && A==12) return 11.37; - else if(Z==6 && A==12) return 10.76; - else if(Z==6 && A==13) return 11.69; - else if(Z==6 && A==14) return 12.17; - else if(Z==14 && A==28) return 16.0; - else if(Z==39 && A==89) return 22.1; - else if(Z==57 && A==139) return 23.8; - else if(Z==82 && A==208) return 26.5; + if (ny == 1) { + if (Z == 1 && A == 4) + return 2.04; + else if (Z == 2 && A == 4) + return 2.39; + else if (Z == 2 && A == 5) + return 3.12; + else if (Z == 2 && A == 6) + return 4.18; + else if (Z == 2 && A == 7) + return 5.23; + else if (Z == 2 && A == 8) + return 7.16; + else if (Z == 3 && A == 6) + return 4.50; + else if (Z == 3 && A == 7) + return 5.58; + else if (Z == 3 && A == 8) + return 6.80; + else if (Z == 3 && A == 9) + return 8.50; + else if (Z == 4 && A == 7) + return 5.16; + else if (Z == 4 && A == 8) + return 6.84; + else if (Z == 4 && A == 9) + return 6.71; + else if (Z == 4 && A == 10) + return 9.11; + else if (Z == 5 && A == 9) + return 8.29; + else if (Z == 5 && A == 10) + return 9.01; + else if (Z == 5 && A == 11) + return 10.29; + else if (Z == 5 && A == 12) + return 11.43; + else if (Z == 6 && A == 12) + return 10.95; + else if (Z == 6 && A == 13) + return 11.81; + else if (Z == 6 && A == 14) + return 12.50; + else if (Z == 7 && A == 14) + return 12.17; + else if (Z == 7 && A == 15) + return 13.59; + else if (Z == 8 && A == 16) + return 12.50; + else if (Z == 8 && A == 17) + return 13.59; + else if (Z == 14 && A == 28) + return 16.0; + else if (Z == 39 && A == 89) + return 22.1; + else if (Z == 57 && A == 139) + return 23.8; + else if (Z == 82 && A == 208) + return 26.5; }//ny==1 // For other nuclei we take Bethe-Weizsacker mass formula return gethyperbinding(A, Z, ny)-gethyperbinding(A-1., Z, ny-1); diff --git a/source/processes/hadronic/models/abla/src/G4AblaInterface.cc b/source/processes/hadronic/models/abla/src/G4AblaInterface.cc index 1bd99dc2e9..63e47d89ed 100644 --- a/source/processes/hadronic/models/abla/src/G4AblaInterface.cc +++ b/source/processes/hadronic/models/abla/src/G4AblaInterface.cc @@ -31,11 +31,9 @@ // Aatos Heikkinen, HIP (project coordination) // -#define ABLAXX_IN_GEANT4_MODE 1 - #include "globals.hh" - -#ifdef ABLAXX_IN_GEANT4_MODE +#include +#include #include "G4AblaInterface.hh" #include "G4ParticleDefinition.hh" @@ -45,92 +43,135 @@ #include "G4IonTable.hh" #include "G4SystemOfUnits.hh" #include "G4PhysicalConstants.hh" -#include -#include +#include "G4PhysicsModelCatalog.hh" +#include "G4ExcitationHandler.hh" +#include "G4HyperTriton.hh" +#include "G4HyperH4.hh" +#include "G4HyperAlpha.hh" +#include "G4DoubleHyperH4.hh" +#include "G4DoubleHyperDoubleNeutron.hh" +#include "G4HyperHe5.hh" -G4AblaInterface::G4AblaInterface() : - G4VPreCompoundModel(NULL, "ABLA"), +G4AblaInterface::G4AblaInterface(G4ExcitationHandler* ptr) : + G4VPreCompoundModel(ptr, "ABLAXX"), ablaResult(new G4VarNtp), volant(new G4Volant), theABLAModel(new G4Abla(volant, ablaResult)), - eventNumber(0) + eventNumber(0), + secID(-1), + isInitialised(false) { - theABLAModel->initEvapora(); - theABLAModel->SetParameters(); + secID = G4PhysicsModelCatalog::GetModelID("model_" + GetModelName()); + // G4cout << "### NEW PrecompoundModel " << this << G4endl; + if (!ptr) SetExcitationHandler(new G4ExcitationHandler); + InitialiseModel(); + G4cout << G4endl << "G4AblaInterface::InitialiseModel() was right." << G4endl; } -G4AblaInterface::~G4AblaInterface() { +G4AblaInterface::~G4AblaInterface() +{ delete volant; delete ablaResult; delete theABLAModel; + delete GetExcitationHandler(); } -G4ReactionProductVector *G4AblaInterface::DeExcite(G4Fragment &aFragment) { +void G4AblaInterface::BuildPhysicsTable(const G4ParticleDefinition&) +{ + InitialiseModel(); +} + +void G4AblaInterface::InitialiseModel() +{ + if (isInitialised) return; + isInitialised = true; + theABLAModel->initEvapora(); + theABLAModel->SetParameters(); + GetExcitationHandler()->Initialise(); +} + +G4ReactionProductVector *G4AblaInterface::DeExcite(G4Fragment& aFragment) { + if (!isInitialised) InitialiseModel(); + volant->clear(); ablaResult->clear(); const G4int ARem = aFragment.GetA_asInt(); const G4int ZRem = aFragment.GetZ_asInt(); + const G4int SRem = -aFragment.GetNumberOfLambdas(); // Strangeness = - (Number of lambdas) const G4double eStarRem = aFragment.GetExcitationEnergy() / MeV; - const G4double jRem = aFragment.GetAngularMomentum().mag() / hbar_Planck; - const G4LorentzVector &pRem = aFragment.GetMomentum(); - const G4double pxRem = pRem.x() / MeV; - const G4double pyRem = pRem.y() / MeV; - const G4double pzRem = pRem.z() / MeV; + const G4double jRem = aFragment.GetAngularMomentum().mag() / hbar_Planck; + const G4LorentzVector& pRem = aFragment.GetMomentum(); + const G4double pxRem = pRem.x() / MeV; + const G4double pyRem = pRem.y() / MeV; + const G4double pzRem = pRem.z() / MeV; eventNumber++; - theABLAModel->DeexcitationAblaxx(ARem, ZRem, - eStarRem, - jRem, - pxRem, - pyRem, - pzRem, - eventNumber); + theABLAModel->DeexcitationAblaxx(ARem, ZRem, eStarRem, jRem, pxRem, pyRem, + pzRem, eventNumber, SRem); - G4ReactionProductVector *result = new G4ReactionProductVector; + G4ReactionProductVector* result = new G4ReactionProductVector; - for(int j = 0; j < ablaResult->ntrack; ++j) { // Copy ABLA result to the EventInfo - - G4ReactionProduct *product = toG4Particle(ablaResult->avv[j], - ablaResult->zvv[j], - ablaResult->svv[j], - ablaResult->enerj[j], - ablaResult->pxlab[j], - ablaResult->pylab[j], - ablaResult->pzlab[j]); + for(int j = 0; j < ablaResult->ntrack; ++j) + { // Copy ABLA result to the EventInfo + G4ReactionProduct* product = + toG4Particle(ablaResult->avv[j], ablaResult->zvv[j], ablaResult->svv[j], + ablaResult->enerj[j], ablaResult->pxlab[j], + ablaResult->pylab[j], ablaResult->pzlab[j]); if(product) + { + product->SetCreatorModelID(secID); result->push_back(product); + } } return result; } G4ParticleDefinition *G4AblaInterface::toG4ParticleDefinition(G4int A, G4int Z, G4int S) const { - if (A == 1 && Z == 1 && S == 0) return G4Proton::Proton(); - else if(A == 1 && Z == 0 && S == 0) return G4Neutron::Neutron(); - else if(A == 1 && Z == 0 && S == -1) return G4Lambda::Lambda(); - else if(A == -1 && Z == 1 && S == 0) return G4PionPlus::PionPlus(); - else if(A == -1 && Z == -1 && S == 0) return G4PionMinus::PionMinus(); - else if(A == -1 && Z == 0 && S == 0) return G4PionZero::PionZero(); - else if(A == 0 && Z == 0 && S == 0) return G4Gamma::Gamma(); - else if(A == 2 && Z == 1 && S == 0) return G4Deuteron::Deuteron(); - else if(A == 3 && Z == 1 && S == 0) return G4Triton::Triton(); - else if(A == 3 && Z == 2 && S == 0) return G4He3::He3(); - else if(A == 4 && Z == 2 && S == 0) return G4Alpha::Alpha(); - else if(A > 0 && Z > 0 && A > Z) { // Returns ground state ion definition. - return G4IonTable::GetIonTable()->GetIon(Z, A, std::abs(S));//S is the number of lambdas - } else { // Error, unrecognized particle - G4cout << "Can't convert particle with A=" << A << ", Z=" << Z << ", S=" << S << " to G4ParticleDefinition, trouble ahead" << G4endl; + if (A == 1 && Z == 1 && S == 0 ) return G4Proton::Proton(); + else if(A == 1 && Z == 0 && S == 0 ) return G4Neutron::Neutron(); + else if(A == 1 && Z == 0 && S == -1) return G4Lambda::Lambda(); + else if(A == -1 && Z == 1 && S == 0 ) return G4PionPlus::PionPlus(); + else if(A == -1 && Z == -1 && S == 0 ) return G4PionMinus::PionMinus(); + else if(A == -1 && Z == 0 && S == 0 ) return G4PionZero::PionZero(); + else if(A == 0 && Z == 0 && S == 0 ) return G4Gamma::Gamma(); + else if(A == 2 && Z == 1 && S == 0 ) return G4Deuteron::Deuteron(); + else if(A == 3 && Z == 1 && S == 0 ) return G4Triton::Triton(); + else if(A == 3 && Z == 2 && S == 0 ) return G4He3::He3(); + else if(A == 3 && Z == 1 && S == -1) return G4HyperTriton::Definition(); + else if(A == 4 && Z == 2 && S == 0 ) return G4Alpha::Alpha(); + else if(A == 4 && Z == 1 && S == -1) return G4HyperH4::Definition(); + else if(A == 4 && Z == 2 && S == -1) return G4HyperAlpha::Definition(); + else if(A == 4 && Z == 1 && S == -2) return G4DoubleHyperH4::Definition(); + else if(A == 4 && Z == 0 && S == -2) return G4DoubleHyperDoubleNeutron::Definition(); + else if(A == 5 && Z == 2 && S == -1) return G4HyperHe5::Definition(); + else if(A > 0 && Z > 0 && A > Z ) + { // Returns ground state ion definition. + auto ionfromtable = G4IonTable::GetIonTable()->GetIon(Z, A, std::abs(S), 0); // S is the number of lambdas + if(ionfromtable) + return ionfromtable; + else + { + G4cout << "Can't convert particle with A=" << A << ", Z=" << Z << ", S=" << S + << " to G4ParticleDefinition, trouble ahead" << G4endl; + return 0; + } + } + else + { // Error, unrecognized particle + G4cout << "Can't convert particle with A=" << A << ", Z=" << Z << ", S=" << S + << " to G4ParticleDefinition, trouble ahead" << G4endl; return 0; } } -G4ReactionProduct *G4AblaInterface::toG4Particle(G4int A, G4int Z, G4int S, - G4double kinE, - G4double px, +G4ReactionProduct* G4AblaInterface::toG4Particle(G4int A, G4int Z, G4int S, + G4double kinE, G4double px, G4double py, G4double pz) const { - G4ParticleDefinition *def = toG4ParticleDefinition(A, Z, S); - if(def == 0) { // Check if we have a valid particle definition + G4ParticleDefinition* def = toG4ParticleDefinition(A, Z, S); + if(def == 0) + { // Check if we have a valid particle definition return 0; } @@ -138,30 +179,36 @@ G4ReactionProduct *G4AblaInterface::toG4Particle(G4int A, G4int Z, G4int S, const G4ThreeVector momentum(px, py, pz); const G4ThreeVector momentumDirection = momentum.unit(); G4DynamicParticle p(def, momentumDirection, energy); - G4ReactionProduct *r = new G4ReactionProduct(def); + G4ReactionProduct* r = new G4ReactionProduct(def); (*r) = p; return r; } -void G4AblaInterface::ModelDescription(std::ostream& outFile) const { - outFile << "ABLA++ does not provide an implementation of the ApplyYourself method!\n\n"; +void G4AblaInterface::ModelDescription(std::ostream& outFile) const +{ + outFile << "ABLA++ does not provide an implementation of the ApplyYourself method!\n\n"; } -void G4AblaInterface::DeExciteModelDescription(std::ostream& outFile) const { - outFile - << "ABLA++ is a statistical model for nuclear de-excitation. It simulates\n" - << "the gamma emission and the evaporation of neutrons, light charged particles\n" - << "and IMFs, as well as fission where applicable. The code included in Geant4\n" - << "is a C++ translation of the original Fortran code ABLA07. Although the model\n" - << "has been recently extended to hypernuclei by including the evaporation of lambda\n" - << "particles. More details about the physics are available in the\n" - << "Geant4 Physics Reference Manual and in the reference articles.\n\n" - << "References:\n" - << "(1) A. Kelic, M. V. Ricciardi, and K. H. Schmidt, in Proceedings of Joint\n" - << "ICTP-IAEA Advanced Workshop on Model Codes for Spallation Reactions,\n" - << "ICTP Trieste, Italy, 4–8 February 2008, edited by D. Filges, S. Leray, Y. Yariv,\n" - << "A. Mengoni, A. Stanculescu, and G. Mank (IAEA INDC(NDS)-530, Vienna, 2008), pp. 181–221.\n\n" - << "(2) J.L. Rodriguez-Sanchez, J.-C. David et al., Phys. Rev. C 98, 021602 (2018)\n\n"; +void G4AblaInterface::DeExciteModelDescription(std::ostream& outFile) const +{ + outFile + << "ABLA++ is a statistical model for nuclear de-excitation. It simulates\n" + << "the gamma emission and the evaporation of neutrons, light charged\n" + << "particles and IMFs, as well as fission where applicable. The code\n" + << "included in Geant4 is a C++ translation of the original Fortran\n" + << "code ABLA07. Although the model has been recently extended to\n" + << "hypernuclei by including the evaporation of lambda particles.\n" + << "More details about the physics are available in the Geant4\n" + << "Physics Reference Manual and in the reference articles.\n\n" + << "References:\n" + << "(1) A. Kelic, M. V. Ricciardi, and K. H. Schmidt, in Proceedings of " + "Joint\n" + << "ICTP-IAEA Advanced Workshop on Model Codes for Spallation Reactions,\n" + << "ICTP Trieste, Italy, 4–8 February 2008, edited by D. Filges, S. Leray, " + "Y. Yariv,\n" + << "A. Mengoni, A. Stanculescu, and G. Mank (IAEA INDC(NDS)-530, Vienna, " + "2008), pp. 181–221.\n\n" + << "(2) J.L. Rodriguez-Sanchez, J.-C. David et al., Phys. Rev. C 98, " + "021602 (2018)\n\n"; } -#endif // ABLAXX_IN_GEANT4_MODE diff --git a/source/processes/hadronic/models/abrasion/History b/source/processes/hadronic/models/abrasion/History index 7ab901fb78..64b4d32d24 100644 --- a/source/processes/hadronic/models/abrasion/History +++ b/source/processes/hadronic/models/abrasion/History @@ -13,6 +13,11 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +04-Aug-2021 Alberto Ribon (had-abrasion-V10-07-02) +-------------------------------------------------- +- G4WilsonAbrasionModel : migrated to the new version of + G4PhysicsModelCatalog + 16-Apr-2021 Ben Morgan (had-abrasion-V10-07-01) -------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/abrasion/include/G4WilsonAbrasionModel.hh b/source/processes/hadronic/models/abrasion/include/G4WilsonAbrasionModel.hh index 2905f83a7e..21da304676 100644 --- a/source/processes/hadronic/models/abrasion/include/G4WilsonAbrasionModel.hh +++ b/source/processes/hadronic/models/abrasion/include/G4WilsonAbrasionModel.hh @@ -81,9 +81,8 @@ class G4WilsonAbrasionModel : public G4HadronicInteraction G4WilsonAbrasionModel(G4ExcitationHandler*); ~G4WilsonAbrasionModel(); - G4WilsonAbrasionModel(const G4WilsonAbrasionModel& right); - - const G4WilsonAbrasionModel& operator=(G4WilsonAbrasionModel& right); + G4WilsonAbrasionModel(const G4WilsonAbrasionModel& right) = delete; + const G4WilsonAbrasionModel& operator=(G4WilsonAbrasionModel& right) = delete; virtual G4HadFinalState* ApplyYourself(const G4HadProjectile&, G4Nucleus&); void SetVerboseLevel(G4int); @@ -114,6 +113,7 @@ class G4WilsonAbrasionModel : public G4HadronicInteraction G4double B; G4double third; G4double fradius; + G4int secID; // Creator model ID for the secondaries created by this model }; inline void diff --git a/source/processes/hadronic/models/abrasion/src/G4WilsonAbrasionModel.cc b/source/processes/hadronic/models/abrasion/src/G4WilsonAbrasionModel.cc index 63ee4a038b..333585c966 100644 --- a/source/processes/hadronic/models/abrasion/src/G4WilsonAbrasionModel.cc +++ b/source/processes/hadronic/models/abrasion/src/G4WilsonAbrasionModel.cc @@ -111,9 +111,11 @@ #include "G4Exp.hh" #include "G4Pow.hh" +#include "G4PhysicsModelCatalog.hh" + G4WilsonAbrasionModel::G4WilsonAbrasionModel(G4bool useAblation1) - :G4HadronicInteraction("G4WilsonAbrasion") + : G4HadronicInteraction("G4WilsonAbrasion"), secID(-1) { // Send message to stdout to advise that the G4Abrasion model is being used. PrintWelcomeMessage(); @@ -150,6 +152,9 @@ G4WilsonAbrasionModel::G4WilsonAbrasionModel(G4bool useAblation1) fradius = 0.99; conserveEnergy = false; conserveMomentum = true; + + // Creator model ID for the secondaries created by this model + secID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); } void G4WilsonAbrasionModel::ModelDescription(std::ostream& outFile) const @@ -164,7 +169,8 @@ void G4WilsonAbrasionModel::ModelDescription(std::ostream& outFile) const << "projectile energies between 70 MeV/n and 10.1 GeV/n. \n"; } -G4WilsonAbrasionModel::G4WilsonAbrasionModel(G4ExcitationHandler* aExcitationHandler) +G4WilsonAbrasionModel::G4WilsonAbrasionModel(G4ExcitationHandler* aExcitationHandler) : + G4HadronicInteraction("G4WilsonAbrasion"), secID(-1) { // Send message to stdout to advise that the G4Abrasion model is being used. @@ -196,13 +202,16 @@ G4WilsonAbrasionModel::G4WilsonAbrasionModel(G4ExcitationHandler* aExcitationHan // npK, when mutiplied by the nuclear Fermi momentum, determines the range of // momentum over which the secondary nucleon momentum is sampled. // - r0sq = 0.0; //A.R. 14-Aug-2012 Coverity fix. + r0sq = 0.0; npK = 5.0; B = 10.0 * MeV; third = 1.0 / 3.0; fradius = 0.99; conserveEnergy = false; conserveMomentum = true; + + // Creator model ID for the secondaries created by this model + secID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); } //////////////////////////////////////////////////////////////////////////////// // @@ -616,9 +625,9 @@ G4HadFinalState *G4WilsonAbrasionModel::ApplyYourself ( G4DynamicParticle *secondary = new G4DynamicParticle((*iter)->GetDefinition(), (*iter)->GetTotalEnergy(), (*iter)->GetMomentum()); - theParticleChange.AddSecondary (secondary); // Added MHM 20050118 + theParticleChange.AddSecondary (secondary, secID); G4String particleName = (*iter)->GetDefinition()->GetParticleName(); - delete (*iter); // get rid of leftover particle def! // Added MHM 20050118 + delete (*iter); // get rid of leftover particle def! if (verboseLevel >= 2 && particleName.find("[",0) < particleName.size()) { G4cout <<"------------------------" <GetDefinition(), (*iter)->GetTotalEnergy(), (*iter)->GetMomentum()); - theParticleChange.AddSecondary (secondary); + theParticleChange.AddSecondary (secondary, secID); G4String particleName = (*iter)->GetDefinition()->GetParticleName(); - delete (*iter); // get rid of leftover particle def! // Added MHM 20050118 + delete (*iter); // get rid of leftover particle def! if (verboseLevel >= 2 && particleName.find("[",0) < particleName.size()) { G4cout <<"--------------------" <= 2) @@ -766,7 +775,7 @@ G4Fragment *G4WilsonAbrasionModel::GetAbradedNucleons (G4int Dabr, G4double A, G4double nucleonMass = typeNucleon->GetPDGMass(); G4double E = std::sqrt(p*p + nucleonMass*nucleonMass)-nucleonMass; dynamicNucleon = new G4DynamicParticle(typeNucleon,direction,E); - theParticleChange.AddSecondary (dynamicNucleon); + theParticleChange.AddSecondary (dynamicNucleon, secID); pabr += p*direction; } // diff --git a/source/processes/hadronic/models/binary_cascade/History b/source/processes/hadronic/models/binary_cascade/History index 79d5ef66a8..b878923925 100644 --- a/source/processes/hadronic/models/binary_cascade/History +++ b/source/processes/hadronic/models/binary_cascade/History @@ -13,6 +13,16 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +27-Oct-2021, Alberto Ribon had-binary-V10-07-03 +- G4GeneratorPrecompoundInterface : extended the method PropagateNuclNucl + to deal with projectile hypernuclei and anti-hypernuclei + +04-Aug-2021, Alberto Ribon had-binary-V10-07-02 +- G4BinaryCascade, G4BinaryLightIonReaction : migrated to the new + version of G4PhysicsModelCatalog +- G4GeneratorPrecompoundInterface : propagated the creator model ID + information + 16-Apr-2021, Ben Morgan had-binary-V10-07-01 - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/binary_cascade/include/G4BinaryCascade.hh b/source/processes/hadronic/models/binary_cascade/include/G4BinaryCascade.hh index c33c78753b..865ffd39c8 100644 --- a/source/processes/hadronic/models/binary_cascade/include/G4BinaryCascade.hh +++ b/source/processes/hadronic/models/binary_cascade/include/G4BinaryCascade.hh @@ -217,11 +217,6 @@ private: const G4ParticleDefinition * thePrimaryType; G4ThreeVector theMomentumTransfer; static G4int theBIC_ID; -#ifdef G4MULTITHREADED - static G4Mutex BICMutex; -#endif - - }; #endif diff --git a/source/processes/hadronic/models/binary_cascade/include/G4BinaryLightIonReaction.hh b/source/processes/hadronic/models/binary_cascade/include/G4BinaryLightIonReaction.hh index d0f4e8fae1..3fc9d95ad4 100644 --- a/source/processes/hadronic/models/binary_cascade/include/G4BinaryLightIonReaction.hh +++ b/source/processes/hadronic/models/binary_cascade/include/G4BinaryLightIonReaction.hh @@ -65,10 +65,6 @@ class G4BinaryLightIonReaction : public G4HadronicInteraction G4bool debug_G4BinaryLightIonReactionResults; static G4int theBLIR_ID; -#ifdef G4MULTITHREADED - static G4Mutex BLIRMutex; -#endif - }; inline void G4BinaryLightIonReaction::SetPrecompound(G4VPreCompoundModel* ptr) { diff --git a/source/processes/hadronic/models/binary_cascade/include/G4GeneratorPrecompoundInterface.hh b/source/processes/hadronic/models/binary_cascade/include/G4GeneratorPrecompoundInterface.hh index b53e70a205..ac61435023 100644 --- a/source/processes/hadronic/models/binary_cascade/include/G4GeneratorPrecompoundInterface.hh +++ b/source/processes/hadronic/models/binary_cascade/include/G4GeneratorPrecompoundInterface.hh @@ -108,6 +108,8 @@ private: const G4ParticleDefinition* ANTItriton; const G4ParticleDefinition* ANTIHe3; const G4ParticleDefinition* ANTIHe4; + + G4int secID; // Creator model ID }; inline diff --git a/source/processes/hadronic/models/binary_cascade/src/G4BinaryCascade.cc b/source/processes/hadronic/models/binary_cascade/src/G4BinaryCascade.cc index 7fc481b757..f348be1506 100644 --- a/source/processes/hadronic/models/binary_cascade/src/G4BinaryCascade.cc +++ b/source/processes/hadronic/models/binary_cascade/src/G4BinaryCascade.cc @@ -66,6 +66,8 @@ #include "G4ShortLivedConstructor.hh" #include +#include "G4PhysicsModelCatalog.hh" + // turn on general debugging info, and consistency checks //#define debug_G4BinaryCascade 1 @@ -109,10 +111,7 @@ #define _DebugEpConservation(val) #endif -#ifdef G4MULTITHREADED - G4Mutex G4BinaryCascade::BICMutex = G4MUTEX_INITIALIZER; -#endif - G4int G4BinaryCascade::theBIC_ID = -1; +G4int G4BinaryCascade::theBIC_ID = -1; // // C O N S T R U C T O R S A N D D E S T R U C T O R S @@ -165,18 +164,7 @@ G4VIntraNuclearTransportModel("Binary Cascade", ptr) currentInitialEnergy=initial_nuclear_mass=0.; massInNucleus=0.; theOuterRadius=0.; - if ( theBIC_ID == -1 ) { -#ifdef G4MULTITHREADED - G4MUTEXLOCK(&G4BinaryCascade::BICMutex); - if ( theBIC_ID == -1 ) { -#endif - theBIC_ID = G4PhysicsModelCatalog::Register("Binary Cascade"); -#ifdef G4MULTITHREADED - } - G4MUTEXUNLOCK(&G4BinaryCascade::BICMutex); -#endif - } - + theBIC_ID = G4PhysicsModelCatalog::GetModelID("model_G4BinaryCascade"); } G4BinaryCascade::~G4BinaryCascade() @@ -365,7 +353,7 @@ G4HadFinalState * G4BinaryCascade::ApplyYourself(const G4HadProjectile & aTrack, G4double time=(*iter)->GetFormationTime(); if(time < 0.0) { time = 0.0; } aNew.SetTime(timePrimary + time); - aNew.SetCreatorModelType((*iter)->GetCreatorModel()); + aNew.SetCreatorModelID((*iter)->GetCreatorModelID()); theParticleChange.AddSecondary(aNew); } @@ -976,7 +964,7 @@ G4ReactionProductVector * G4BinaryCascade::DeExcite() if ( theCapturedList.size() == 1 ) {i=theCapturedList.begin();} // Uzhi G4ReactionProduct * aNew = new G4ReactionProduct((*i)->GetDefinition()); aNew->SetTotalEnergy((*i)->GetDefinition()->GetPDGMass()); - aNew->SetCreatorModel(theBIC_ID); + aNew->SetCreatorModelID(theBIC_ID); aNew->SetMomentum(G4ThreeVector(0));// see boost for preCompoundProducts below.. precompoundProducts = new G4ReactionProductVector(); precompoundProducts->push_back(aNew); @@ -1070,7 +1058,7 @@ G4ReactionProductVector * G4BinaryCascade::DecayVoidNucleus() G4ReactionProduct * aNew = new G4ReactionProduct((*aNuc)->GetDefinition()); aNew->SetTotalEnergy((*aMom)->e()); aNew->SetMomentum((*aMom)->vect()); - aNew->SetCreatorModel(theBIC_ID); + aNew->SetCreatorModelID(theBIC_ID); result->push_back(aNew); delete *aMom; @@ -1087,7 +1075,7 @@ G4ReactionProductVector * G4BinaryCascade::DecayVoidNucleus() (*aNuc)->GetDefinition()); // Uzhi aNew->SetTotalEnergy((*aMom)->e()); // Uzhi aNew->SetMomentum((*aMom)->vect()); // Uzhi - aNew->SetCreatorModel(theBIC_ID); + aNew->SetCreatorModelID(theBIC_ID); result->push_back(aNew); // Uzhi delete *aMom; // Uzhi } // Uzhi @@ -1114,7 +1102,7 @@ G4ReactionProductVector * G4BinaryCascade::ProductsAddFinalState(G4ReactionProdu aNew->SetMomentum(kt->Get4Momentum().vect()); aNew->SetTotalEnergy(kt->Get4Momentum().e()); aNew->SetNewlyAdded(kt->IsParticipant()); - aNew->SetCreatorModel(theBIC_ID); + aNew->SetCreatorModelID(theBIC_ID); products->push_back(aNew); #ifdef debug_BIC_Propagate_finals @@ -2568,6 +2556,7 @@ G4Fragment * G4BinaryCascade::FindFragments() //GF fragment->SetNumberOfParticles(excitons-holes); fragment->SetNumberOfParticles(excitons); fragment->SetNumberOfCharged(zCaptured); + fragment->SetCreatorModelID(theBIC_ID); return fragment; } @@ -2731,7 +2720,7 @@ G4ReactionProductVector * G4BinaryCascade::Propagate1H1( G4ReactionProduct * aNew = new G4ReactionProduct(kt->GetDefinition()); aNew->SetMomentum(kt->Get4Momentum().vect()); aNew->SetTotalEnergy(kt->Get4Momentum().e()); - aNew->SetCreatorModel(theBIC_ID); + aNew->SetCreatorModelID(theBIC_ID); products->push_back(aNew); #ifdef debug_H1_BinaryCascade if (! kt->GetDefinition()->GetPDGStable() ) @@ -2906,7 +2895,7 @@ G4ReactionProductVector * G4BinaryCascade::FillVoidNucleusProducts(G4ReactionPro G4ReactionProduct * aNew = new G4ReactionProduct((*iter)->GetDefinition()); aNew->SetMomentum((*iter)->Get4Momentum().vect()); aNew->SetTotalEnergy((*iter)->Get4Momentum().e()); - aNew->SetCreatorModel(theBIC_ID); + aNew->SetCreatorModelID(theBIC_ID); Esecondaries +=(*iter)->Get4Momentum().e(); psecondaries +=(*iter)->Get4Momentum(); aNew->SetNewlyAdded(true); @@ -2930,8 +2919,7 @@ G4ReactionProductVector * G4BinaryCascade::FillVoidNucleusProducts(G4ReactionPro G4ReactionProduct * aNew = new G4ReactionProduct(atrack->GetDefinition()); aNew->SetMomentum(atrack->Get4Momentum().vect()); aNew->SetTotalEnergy(atrack->Get4Momentum().e()); - // FIXME: should take creator model from atrack: - // aNew->SetCreatorModel(atrack->GetCreatorModel()); + aNew->SetCreatorModelID(atrack->GetCreatorModelID()); Esecondaries +=atrack->Get4Momentum().e(); psecondaries +=atrack->Get4Momentum(); aNew->SetNewlyAdded(true); @@ -2960,7 +2948,7 @@ G4ReactionProductVector * G4BinaryCascade::FillVoidNucleusProducts(G4ReactionPro (*iter)->Update4Momentum((*iter)->Get4Momentum().vect()+transferCorrection); aNew->SetMomentum((*iter)->Get4Momentum().vect()); aNew->SetTotalEnergy((*iter)->Get4Momentum().e()); - aNew->SetCreatorModel(theBIC_ID); + aNew->SetCreatorModelID(theBIC_ID); Esecondaries +=(*iter)->Get4Momentum().e(); psecondaries +=(*iter)->Get4Momentum(); if ( (*iter)->IsParticipant() ) aNew->SetNewlyAdded(true); @@ -2974,7 +2962,7 @@ G4ReactionProductVector * G4BinaryCascade::FillVoidNucleusProducts(G4ReactionPro (*iter)->Update4Momentum((*iter)->Get4Momentum().vect()+transferCorrection); aNew->SetMomentum((*iter)->Get4Momentum().vect()); aNew->SetTotalEnergy((*iter)->Get4Momentum().e()); - aNew->SetCreatorModel(theBIC_ID); + aNew->SetCreatorModelID(theBIC_ID); Esecondaries +=(*iter)->Get4Momentum().e(); psecondaries +=(*iter)->Get4Momentum(); aNew->SetNewlyAdded(true); @@ -3033,7 +3021,7 @@ G4ReactionProductVector * G4BinaryCascade::FillVoidNucleusProducts(G4ReactionPro aNew->SetKineticEnergy(Ekinetic); aNew->SetMomentum(aNew->GetTotalMomentum() * ((*iter)->Get4Momentum().vect().unit())); aNew->SetNewlyAdded(true); - aNew->SetCreatorModel(theBIC_ID); + aNew->SetCreatorModelID(theBIC_ID); products->push_back(aNew); Esecondaries += aNew->GetTotalEnergy(); psecondaries += G4LorentzVector(aNew->GetMomentum(),aNew->GetTotalEnergy() ); @@ -3084,9 +3072,7 @@ G4ReactionProductVector * G4BinaryCascade::HighEnergyModelFSProducts(G4ReactionP aNew->SetMomentum((*iter)->Get4Momentum().vect()); aNew->SetTotalEnergy((*iter)->Get4Momentum().e()); aNew->SetNewlyAdded(true); - // FixMe: should take creator model from atrack: - // aNew->SetCreatorModel(atrack->GetCreatorModel()); - + aNew->SetCreatorModelID((*iter)->GetCreatorModelID()); //G4cout << " Particle Ekin " << aNew->GetKineticEnergy() << G4endl; products->push_back(aNew); } @@ -3111,8 +3097,7 @@ G4ReactionProductVector * G4BinaryCascade::HighEnergyModelFSProducts(G4ReactionP G4ReactionProduct * theNew = new G4ReactionProduct(fragment); theNew->SetMomentum(G4ThreeVector(0,0,0)); theNew->SetTotalEnergy(massInNucleus); - // FixMe: should take creator model from ???: - // aNew->SetCreatorModel(???->GetCreatorModel()); + theNew->SetCreatorModelID(theBIC_ID); //theNew->SetFormationTime(??0.??); //G4cout << " Nucleus (" << currentZ << ","<< currentA << "), mass "<< massInNucleus << G4endl; products->push_back(theNew); diff --git a/source/processes/hadronic/models/binary_cascade/src/G4BinaryLightIonReaction.cc b/source/processes/hadronic/models/binary_cascade/src/G4BinaryLightIonReaction.cc index 05a8804a2e..893994554b 100644 --- a/source/processes/hadronic/models/binary_cascade/src/G4BinaryLightIonReaction.cc +++ b/source/processes/hadronic/models/binary_cascade/src/G4BinaryLightIonReaction.cc @@ -43,12 +43,9 @@ #include "G4PreCompoundModel.hh" #include "G4HadronicInteractionRegistry.hh" #include "G4Log.hh" +#include "G4PhysicsModelCatalog.hh" -#ifdef G4MULTITHREADED - G4Mutex G4BinaryLightIonReaction::BLIRMutex = G4MUTEX_INITIALIZER; -#endif - G4int G4BinaryLightIonReaction::theBLIR_ID = -1; - +G4int G4BinaryLightIonReaction::theBLIR_ID = -1; //#define debug_G4BinaryLightIonReaction //#define debug_BLIR_finalstate @@ -69,19 +66,7 @@ G4BinaryLightIonReaction::G4BinaryLightIonReaction(G4VPreCompoundModel* ptr) } theModel = new G4BinaryCascade(theProjectileFragmentation); theHandler = theProjectileFragmentation->GetExcitationHandler(); - if ( theBLIR_ID == -1 ) { -#ifdef G4MULTITHREADED - G4MUTEXLOCK(&G4BinaryLightIonReaction::BLIRMutex); - if ( theBLIR_ID == -1 ) { -#endif - theBLIR_ID = G4PhysicsModelCatalog::Register("Binary Light Ion Reaction"); -#ifdef G4MULTITHREADED - } - G4MUTEXUNLOCK(&G4BinaryLightIonReaction::BLIRMutex); -#endif - } - - + theBLIR_ID = G4PhysicsModelCatalog::GetModelID("model_G4BinaryLightIonReaction"); debug_G4BinaryLightIonReactionResults=std::getenv("debug_G4BinaryLightIonReactionResults")!=0; } @@ -332,7 +317,8 @@ ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus & targetNucleus ) G4double time = 0; //(*iter)->GetCreationTime(); //if(time < 0.0) { time = 0.0; } aNew.SetTime(timePrimary + time); - aNew.SetCreatorModelType((*iter)->GetCreatorModel()); + //aNew.SetCreatorModelID((*iter)->GetCreatorModelID()); //AR-02Aug2021 : For some reasons, it does NOT work! + aNew.SetCreatorModelID(theBLIR_ID); theResult.AddSecondary(aNew); ptot += tmp; diff --git a/source/processes/hadronic/models/binary_cascade/src/G4GeneratorPrecompoundInterface.cc b/source/processes/hadronic/models/binary_cascade/src/G4GeneratorPrecompoundInterface.cc index 1e557b1f29..7a4ca6ff43 100644 --- a/source/processes/hadronic/models/binary_cascade/src/G4GeneratorPrecompoundInterface.cc +++ b/source/processes/hadronic/models/binary_cascade/src/G4GeneratorPrecompoundInterface.cc @@ -33,6 +33,10 @@ // // M.Kelsey, 28 Jul 2011 -- Replace loop to decay input secondaries // with new utility class, simplify cleanup loops +// +// A.Ribon, 27 Oct 2021 -- Extended the method PropagateNuclNucl +// to deal with projectile hypernuclei and anti-hypernuclei +// // ----------------------------------------------------------------------------- #include @@ -61,6 +65,20 @@ #include "G4AntiHe3.hh" #include "G4AntiAlpha.hh" +#include "G4HyperTriton.hh" +#include "G4HyperH4.hh" +#include "G4HyperAlpha.hh" +#include "G4HyperHe5.hh" +#include "G4DoubleHyperH4.hh" +#include "G4DoubleHyperDoubleNeutron.hh" + +#include "G4AntiHyperTriton.hh" +#include "G4AntiHyperH4.hh" +#include "G4AntiHyperAlpha.hh" +#include "G4AntiHyperHe5.hh" +#include "G4AntiDoubleHyperH4.hh" +#include "G4AntiDoubleHyperDoubleNeutron.hh" + #include "G4FragmentVector.hh" #include "G4ReactionProduct.hh" #include "G4ReactionProductVector.hh" @@ -69,6 +87,8 @@ #include "G4DecayKineticTracks.hh" #include "G4HadronicInteractionRegistry.hh" +#include "G4PhysicsModelCatalog.hh" +#include "G4HyperNucleiProperties.hh" //--------------------------------------------------------------------- #include "Randomize.hh" #include "G4Log.hh" @@ -76,7 +96,7 @@ //#define debugPrecoInt G4GeneratorPrecompoundInterface::G4GeneratorPrecompoundInterface(G4VPreCompoundModel* preModel) -: CaptureThreshold(70*MeV), DeltaM(5.0*MeV), DeltaR(0.0) + : CaptureThreshold(70*MeV), DeltaM(5.0*MeV), DeltaR(0.0), secID(-1) { proton = G4Proton::Proton(); neutron = G4Neutron::Neutron(); @@ -102,6 +122,8 @@ G4GeneratorPrecompoundInterface::G4GeneratorPrecompoundInterface(G4VPreCompoundM if(!pre) { pre = new G4PreCompoundModel(); } SetDeExcitation(pre); } + + secID = G4PhysicsModelCatalog::GetModelID("model_PRECO"); } G4GeneratorPrecompoundInterface::~G4GeneratorPrecompoundInterface() @@ -125,7 +147,7 @@ Propagate(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus) G4cout<<"Final stable particles number "<size()<GetMassNumber(); G4int aZ=theNucleus->GetCharge(); // G4double TargetNucleusMass = G4NucleiProperties::GetNuclearMass(anA, aZ); @@ -153,6 +175,7 @@ Propagate(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus) G4ReactionProduct * theNew = new G4ReactionProduct(part); theNew->SetMomentum(mom); theNew->SetTotalEnergy(e); + theNew->SetCreatorModelID((*iter)->GetCreatorModelID()); theTotalResult->push_back(theNew); Secondary4Momentum += (*iter)->Get4Momentum(); #ifdef debugPrecoInt @@ -164,6 +187,7 @@ Propagate(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus) G4ReactionProduct * theNew = new G4ReactionProduct(part); theNew->SetMomentum(mom); theNew->SetTotalEnergy(e); + theNew->SetCreatorModelID((*iter)->GetCreatorModelID()); theTotalResult->push_back(theNew); Secondary4Momentum += (*iter)->Get4Momentum(); #ifdef debugPrecoInt @@ -291,30 +315,32 @@ Propagate(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus) #endif } } - // Need to de-excite the remnant nucleus only if excitation energy > 0. - G4Fragment anInitialState(anA, aZ, exciton4Momentum); - anInitialState.SetNumberOfParticles(numberOfEx-numberOfHoles); - anInitialState.SetNumberOfCharged(numberOfCh); - anInitialState.SetNumberOfHoles(numberOfHoles); - G4ReactionProductVector * aPrecoResult = - theDeExcitation->DeExcite(anInitialState); - // fill pre-compound part into the result, and return + // Need to de-excite the remnant nucleus only if excitation energy > 0. + G4Fragment anInitialState(anA, aZ, exciton4Momentum); + anInitialState.SetNumberOfParticles(numberOfEx-numberOfHoles); + anInitialState.SetNumberOfCharged(numberOfCh); + anInitialState.SetNumberOfHoles(numberOfHoles); + anInitialState.SetCreatorModelID(secID); + + G4ReactionProductVector * aPrecoResult = + theDeExcitation->DeExcite(anInitialState); + // fill pre-compound part into the result, and return + #ifdef debugPrecoInt + G4cout<<"Target fragment number "<size()<size(); ++ll) + { + theTotalResult->push_back(aPrecoResult->operator[](ll)); #ifdef debugPrecoInt - G4cout<<"Target fragment number "<size()<size(); ++ll) - { - theTotalResult->push_back(aPrecoResult->operator[](ll)); - #ifdef debugPrecoInt - G4cout<<"Fragment "<operator[](ll)->GetDefinition()->GetParticleName()<<" " - <operator[](ll)->GetMomentum()<<" " - <operator[](ll)->GetTotalEnergy()<<" " - <operator[](ll)->GetDefinition()->GetPDGMass()<operator[](ll)->GetDefinition()->GetParticleName()<<" " + <operator[](ll)->GetMomentum()<<" " + <operator[](ll)->GetTotalEnergy()<<" " + <operator[](ll)->GetDefinition()->GetPDGMass()<GetMassNumber()<<" " - <GetCharge()<GetMassNumber()<<" " + <GetCharge()<<" (" + <GetNumberOfLambdas()<<")"<GetMassNumber()<<" " - <GetCharge()<GetCharge()<<" (" + <GetNumberOfLambdas()<<")"<size()<Get4Momentum()<<" " <Get4Momentum().mag()<GetMassNumber(); G4int aZ=theNucleus->GetCharge(); + //G4int aL=theNucleus->GetNumberOfLambdas(); // Should be 0 G4int numberOfEx = 0; G4int numberOfCh = 0; G4int numberOfHoles = 0; @@ -369,7 +398,7 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus G4double R = theNucleus->GetNuclearRadius(); G4LorentzVector Target4Momentum(0.,0.,0.,0.); - // loop over wounded target nucleus + // loop over the wounded target nucleus G4Nucleon * theCurrentNucleon = theNucleus->StartLoop() ? theNucleus->GetNextNucleon() : 0; while(theCurrentNucleon) /* Loop checking, 31.08.2015, G.Folger */ @@ -387,11 +416,11 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus } #ifdef debugPrecoInt - G4cout<<"Residual Target A Z E* 4mom "<GetDefinition()->GetBaryonNumber() < -1; @@ -400,6 +429,7 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus G4int anAb=theProjectileNucleus->GetMassNumber(); G4int aZb=theProjectileNucleus->GetCharge(); + G4int aLb=theProjectileNucleus->GetNumberOfLambdas(); // Non negative number of (anti-)lambdas in (anti-)nucleus G4int numberOfExB = 0; G4int numberOfChB = 0; G4int numberOfHolesB = 0; @@ -407,7 +437,7 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus G4double Rb = theProjectileNucleus->GetNuclearRadius(); G4LorentzVector Projectile4Momentum(0.,0.,0.,0.); - // loop over wounded projectile nucleus + // loop over the wounded projectile nucleus or anti-nucleus theCurrentNucleon = theProjectileNucleus->StartLoop() ? theProjectileNucleus->GetNextNucleon() : 0; while(theCurrentNucleon) /* Loop checking, 31.08.2015, G.Folger */ @@ -419,9 +449,11 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus if(!ProjectileIsAntiNucleus) { aZb -= G4int(theCurrentNucleon->GetDefinition()->GetPDGCharge()/ eplus + 0.1); + if (theCurrentNucleon->GetParticleType()==G4Lambda::Definition()) --aLb; } else { aZb += G4int(theCurrentNucleon->GetDefinition()->GetPDGCharge()/ eplus - 0.1); + if (theCurrentNucleon->GetParticleType()==G4AntiLambda::Definition()) --aLb; } exEnergyB += theCurrentNucleon->GetBindingEnergy(); Projectile4Momentum -=theCurrentNucleon->Get4Momentum(); @@ -435,8 +467,8 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus 0.3*G4double (numberOfHolesB + anAb); #ifdef debugPrecoInt - G4cout<<"Projectile residual A Z E* 4mom "<begin(); iter !=theSecondaries->end(); ++iter) { @@ -470,6 +509,7 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus G4ReactionProduct * theNew = new G4ReactionProduct(part); theNew->SetMomentum(aTrack4Momentum.vect()); theNew->SetTotalEnergy(aTrack4Momentum.e()); + theNew->SetCreatorModelID((*iter)->GetCreatorModelID()); theTotalResult->push_back(theNew); #ifdef debugPrecoInt SecondrNum++; @@ -564,6 +604,7 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus G4ReactionProduct * theNew = new G4ReactionProduct(part); theNew->SetMomentum(aTrack4Momentum.vect()); theNew->SetTotalEnergy(aTrack4Momentum.e()); + theNew->SetCreatorModelID((*iter)->GetCreatorModelID()); theTotalResult->push_back(theNew); #ifdef debugPrecoInt @@ -583,12 +624,13 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus //----------------------------------------------------- #ifdef debugPrecoInt - G4cout<<"Final target residual A Z E* 4mom "<GetMassNumber()) && (exEnergy <= 0.)) @@ -611,6 +653,7 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus anInitialState.SetNumberOfParticles(numberOfEx-numberOfHoles); anInitialState.SetNumberOfCharged(numberOfCh); anInitialState.SetNumberOfHoles(numberOfHoles); + anInitialState.SetCreatorModelID(secID); G4ReactionProductVector * aPrecoResult = theDeExcitation->DeExcite(anInitialState); @@ -639,14 +682,20 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus {Projectile4Momentum = GetPrimaryProjectile()->Get4Momentum();} #ifdef debugPrecoInt - G4cout<<"Final projectile residual A Z E* Pmom Pmag2 "< 0 ) { + fMass = G4HyperNucleiProperties::GetNuclearMass(anAb, aZb, aLb); + } else { + fMass = G4NucleiProperties::GetNuclearMass(anAb, aZb); + } G4double RemnMass=Projectile4Momentum.mag(); if(RemnMass < fMass) @@ -663,10 +712,11 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus Projectile4Momentum.boost(bstToCM); // Need to de-excite the remnant nucleus - G4Fragment anInitialState(anAb, aZb, Projectile4Momentum); + G4Fragment anInitialState(anAb, aZb, aLb, Projectile4Momentum); anInitialState.SetNumberOfParticles(numberOfExB-numberOfHolesB); anInitialState.SetNumberOfCharged(numberOfChB); anInitialState.SetNumberOfHoles(numberOfHolesB); + anInitialState.SetCreatorModelID(secID); G4ReactionProductVector * aPrecoResult = theDeExcitation->DeExcite(anInitialState); @@ -696,6 +746,22 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus else if(aFragment == He4) {LastFragment=G4AntiAlpha::AntiAlphaDefinition();} else {} + if (aLb > 0) { // Anti-hypernucleus + if (aFragment == G4HyperTriton::Definition()) { + LastFragment=G4AntiHyperTriton::Definition(); + } else if (aFragment == G4HyperH4::Definition()) { + LastFragment=G4AntiHyperH4::Definition(); + } else if (aFragment == G4HyperAlpha::Definition()) { + LastFragment=G4AntiHyperAlpha::Definition(); + } else if (aFragment == G4HyperHe5::Definition()) { + LastFragment=G4AntiHyperHe5::Definition(); + } else if (aFragment == G4DoubleHyperH4::Definition()) { + LastFragment=G4AntiDoubleHyperH4::Definition(); + } else if (aFragment == G4DoubleHyperDoubleNeutron::Definition()) { + LastFragment=G4AntiDoubleHyperDoubleNeutron::Definition(); + } + } + aPrecoResult->operator[](ll)->SetDefinitionAndUpdateE(LastFragment); } @@ -718,7 +784,13 @@ PropagateNuclNucl(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus void G4GeneratorPrecompoundInterface::MakeCoalescence(G4KineticTrackVector *tracks) { - + // This method replaces pairs of proton-neutron - in the case of nuclei - or + // antiproton-antineutron - in the case of anti-nuclei - which are close in + // momentum, with, respectively, deuterons and anti-deuterons. + // Note that in the case of hypernuclei or anti-hypernuclei, lambdas or anti-lambdas + // are not considered for coalescence because hyper-deuteron or anti-hyper-deuteron + // are assumed not to exist. + if (!tracks) return; G4double MassCut = deuteron->GetPDGMass() + DeltaM; // In MeV @@ -748,6 +820,7 @@ void G4GeneratorPrecompoundInterface::MakeCoalescence(G4KineticTrackVector *trac (trackP->GetFormationTime() + trackN->GetFormationTime())/2.0, (trackP->GetPosition() + trackN->GetPosition() )/2.0, ( Prot4Mom + Neut4Mom )); + aDeuteron->SetCreatorModelID(secID); tracks->push_back(aDeuteron); delete trackP; delete trackN; (*tracks)[i] = nullptr; (*tracks)[j] = nullptr; diff --git a/source/processes/hadronic/models/cascade/History b/source/processes/hadronic/models/cascade/History index 72bbb2729c..9b666400a6 100644 --- a/source/processes/hadronic/models/cascade/History +++ b/source/processes/hadronic/models/cascade/History @@ -14,8 +14,17 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- -17 May 2021 Jonathan Madsen (hadr-casc-V10-07-02) + 4 August 2021 Alberto Ribon (hadr-casc-V10-07-04) -------------------------------------------------- +- G4CascadeInterface : set the creator model ID for the secondaries + produced by Bertini model using the new version of G4PhysicsModelCatalog + +29 June 2021 Gabriele Cosmo (hadr-casc-V10-07-03) +------------------------------------------------- +- Fixed compilation warnings occurring when c++20 is enabled. + +17 May 2021 Jonathan Madsen (hadr-casc-V10-07-02) +------------------------------------------------- - Fixed TLS usage of G4CascadeChannelTables and G4CascadeParameters 16 April 2021 Ben Morgan (hadr-casc-V10-07-01) diff --git a/source/processes/hadronic/models/cascade/cascade/include/G4CascadeInterface.hh b/source/processes/hadronic/models/cascade/cascade/include/G4CascadeInterface.hh index 13499529ea..ae3cb61833 100644 --- a/source/processes/hadronic/models/cascade/cascade/include/G4CascadeInterface.hh +++ b/source/processes/hadronic/models/cascade/cascade/include/G4CascadeInterface.hh @@ -180,7 +180,8 @@ private: G4InuclElementaryParticle hadronTarget; G4InuclNuclei nucleusTarget; - + G4int secID; // Creator model ID for the secondaries + private: // Copying of modules is forbidden G4CascadeInterface(const G4CascadeInterface&); diff --git a/source/processes/hadronic/models/cascade/cascade/include/G4CascadeInterpolator.icc b/source/processes/hadronic/models/cascade/cascade/include/G4CascadeInterpolator.icc index 0767938e1a..b638193149 100644 --- a/source/processes/hadronic/models/cascade/cascade/include/G4CascadeInterpolator.icc +++ b/source/processes/hadronic/models/cascade/cascade/include/G4CascadeInterpolator.icc @@ -99,7 +99,7 @@ template G4double G4CascadeInterpolator:: interpolate(const G4double (&yb)[nBins]) const { // Treat boundary extrapolations specially, otherwise just truncate - G4int i = (lastVal<0) ? 0 : (lastVal>last) ? last-1 : G4int(lastVal); + G4int i = (lastVal<0) ? 0 : (lastVal>G4double(last)) ? last-1 : G4int(lastVal); G4double frac = lastVal - G4double(i); // May be <0 or >1 if extrapolating // Special case: if exactly on upper bin edge, just return value diff --git a/source/processes/hadronic/models/cascade/cascade/include/G4CascadeParamMessenger.icc b/source/processes/hadronic/models/cascade/cascade/include/G4CascadeParamMessenger.icc index 10961493ba..416db93e88 100644 --- a/source/processes/hadronic/models/cascade/cascade/include/G4CascadeParamMessenger.icc +++ b/source/processes/hadronic/models/cascade/cascade/include/G4CascadeParamMessenger.icc @@ -41,7 +41,7 @@ T* G4CascadeParamMessenger::CreateCommand(const G4String& cmd, // If input name begins with '/', treat as absolute path G4String path; - if (cmd(0) != '/' && cmdDir) path = cmdDir->GetCommandPath(); + if (cmd[0] != '/' && cmdDir) path = cmdDir->GetCommandPath(); path += cmd; T* theCmd = new T(path.c_str(), this); // must be G4UIcommand! diff --git a/source/processes/hadronic/models/cascade/cascade/src/G4CascadeInterface.cc b/source/processes/hadronic/models/cascade/cascade/src/G4CascadeInterface.cc index 734495478f..bb4d788b1f 100644 --- a/source/processes/hadronic/models/cascade/cascade/src/G4CascadeInterface.cc +++ b/source/processes/hadronic/models/cascade/cascade/src/G4CascadeInterface.cc @@ -134,6 +134,7 @@ #include "G4UnboundPN.hh" #include "G4Dineutron.hh" #include "G4Diproton.hh" +#include "G4PhysicsModelCatalog.hh" using namespace G4InuclParticleNames; @@ -149,7 +150,7 @@ G4CascadeInterface::G4CascadeInterface(const G4String& name) maximumTries(20), numberOfTries(0), collider(new G4InuclCollider), balance(new G4CascadeCheckBalance(name)), ltcollider(new G4LightTargetCollider), - bullet(0), target(0), output(new G4CollisionOutput) + bullet(0), target(0), output(new G4CollisionOutput), secID(-1) { // Set up global objects for master thread or sequential build if (G4Threading::IsMasterThread()) Initialize(); @@ -162,6 +163,8 @@ G4CascadeInterface::G4CascadeInterface(const G4String& name) usePreCompoundDeexcitation(); else useCascadeDeexcitation(); + + secID = G4PhysicsModelCatalog::GetModelID( "model_BertiniCascade" ); } G4CascadeInterface::~G4CascadeInterface() { @@ -590,7 +593,7 @@ void G4CascadeInterface::copyOutputToHadronicResult() { if (!particles.empty()) { particleIterator ipart = particles.begin(); for (; ipart != particles.end(); ipart++) { - theParticleChange.AddSecondary(makeDynamicParticle(*ipart)); + theParticleChange.AddSecondary(makeDynamicParticle(*ipart), secID); } } @@ -598,7 +601,7 @@ void G4CascadeInterface::copyOutputToHadronicResult() { if (!outgoingNuclei.empty()) { nucleiIterator ifrag = outgoingNuclei.begin(); for (; ifrag != outgoingNuclei.end(); ifrag++) { - theParticleChange.AddSecondary(makeDynamicParticle(*ifrag)); + theParticleChange.AddSecondary(makeDynamicParticle(*ifrag), secID); } } } @@ -622,6 +625,7 @@ G4ReactionProductVector* G4CascadeInterface::copyOutputToReactionProducts() { rp = new G4ReactionProduct; dp = makeDynamicParticle(*ipart); (*rp) = (*dp); // This does all the necessary copying + rp->SetCreatorModelID(secID); propResult->push_back(rp); delete dp; } @@ -634,6 +638,7 @@ G4ReactionProductVector* G4CascadeInterface::copyOutputToReactionProducts() { rp = new G4ReactionProduct; dp = makeDynamicParticle(*ifrag); (*rp) = (*dp); // This does all the necessary copying + rp->SetCreatorModelID(secID); propResult->push_back(rp); delete dp; } diff --git a/source/processes/hadronic/models/cascade/cascade/src/G4CascadeParamMessenger.cc b/source/processes/hadronic/models/cascade/cascade/src/G4CascadeParamMessenger.cc index 9099e56b5e..276c58361a 100644 --- a/source/processes/hadronic/models/cascade/cascade/src/G4CascadeParamMessenger.cc +++ b/source/processes/hadronic/models/cascade/cascade/src/G4CascadeParamMessenger.cc @@ -136,8 +136,8 @@ void G4CascadeParamMessenger::CreateDirectory(const char* path, // Directory path must be absolute, prepend "/" if ncessary G4String fullPath = path; - if (fullPath(0) != '/') fullPath.prepend("/"); - if (fullPath(fullPath.length()-1) != '/') fullPath.append("/"); + if (fullPath[0] != '/') fullPath.insert(0, "/"); + if (fullPath.back() != '/') fullPath.append("/"); // See if input path has already been registered G4UIcommand* foundPath = UIman->GetTree()->FindPath(fullPath); diff --git a/source/processes/hadronic/models/cascade/cascade/src/G4ElementaryParticleCollider.cc b/source/processes/hadronic/models/cascade/cascade/src/G4ElementaryParticleCollider.cc index 717a9621f0..d0835cdccf 100644 --- a/source/processes/hadronic/models/cascade/cascade/src/G4ElementaryParticleCollider.cc +++ b/source/processes/hadronic/models/cascade/cascade/src/G4ElementaryParticleCollider.cc @@ -454,18 +454,18 @@ G4ElementaryParticleCollider::generateSCMpionAbsorption(G4double etot_scm, G4int typeProduct = particle1->type() * particle2->type(); - if (typeProduct == pi0*diproton || typeProduct == pip*unboundPN || - typeProduct == gam*diproton) { + if (typeProduct == G4int(pi0)*G4int(diproton) || typeProduct == G4int(pip)*G4int(unboundPN) || + typeProduct == G4int(gam)*G4int(diproton)) { particle_kinds.push_back(pro); particle_kinds.push_back(pro); - } else if (typeProduct == pim*diproton || typeProduct == pip*dineutron || - typeProduct == pi0*unboundPN || typeProduct == gam*unboundPN) { + } else if (typeProduct == G4int(pim)*G4int(diproton) || typeProduct == G4int(pip)*G4int(dineutron) || + typeProduct == G4int(pi0)*G4int(unboundPN) || typeProduct == G4int(gam)*G4int(unboundPN)) { particle_kinds.push_back(pro); particle_kinds.push_back(neu); - } else if (typeProduct == pi0*dineutron || typeProduct == pim*unboundPN || - typeProduct == gam*dineutron) { + } else if (typeProduct == G4int(pi0)*G4int(dineutron) || typeProduct == G4int(pim)*G4int(unboundPN) || + typeProduct == G4int(gam)*G4int(dineutron)) { particle_kinds.push_back(neu); particle_kinds.push_back(neu); @@ -514,10 +514,10 @@ G4ElementaryParticleCollider::generateSCMmuonAbsorption(G4double etot_scm, G4int typeProduct = particle1->type() * particle2->type(); - if (typeProduct == mum*diproton) { + if (typeProduct == G4int(mum)*G4int(diproton)) { particle_kinds.push_back(pro); particle_kinds.push_back(neu); - } else if (typeProduct == mum*unboundPN) { + } else if (typeProduct == G4int(mum)*G4int(unboundPN)) { particle_kinds.push_back(neu); particle_kinds.push_back(neu); } else { diff --git a/source/processes/hadronic/models/coherent_elastic/History b/source/processes/hadronic/models/coherent_elastic/History index a4ff091997..bb70e6254c 100644 --- a/source/processes/hadronic/models/coherent_elastic/History +++ b/source/processes/hadronic/models/coherent_elastic/History @@ -14,6 +14,13 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +04 August 2021 - A.Ribon (hadr-cohe-V10-07-04) +-------------------------------------------------- +- G4HadronElastic, G4LEnp, G4LEpp, G4LEHadronProtonElastic, + G4NeutronElectronElModel, G4NeutrinoElectronNcModel, + G4ChargeExchange, G4LMsdGenerator : set the creator model ID for the + secondaries created, using the new version of G4PhysicsModelCatalog + 16 April 2021 - Ben Morgan (hadr-cohe-V10-07-03) -------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/coherent_elastic/include/G4ChargeExchange.hh b/source/processes/hadronic/models/coherent_elastic/include/G4ChargeExchange.hh index 5aa9a641ca..f739a1ea8c 100644 --- a/source/processes/hadronic/models/coherent_elastic/include/G4ChargeExchange.hh +++ b/source/processes/hadronic/models/coherent_elastic/include/G4ChargeExchange.hh @@ -55,6 +55,10 @@ public: explicit G4ChargeExchange(); ~G4ChargeExchange() override; + G4ChargeExchange( const G4ChargeExchange &right ) = delete; + const G4ChargeExchange & operator=( const G4ChargeExchange &right ) = delete; + G4bool operator==( const G4ChargeExchange &right ) const = delete; + G4bool operator!=( const G4ChargeExchange &right ) const = delete; G4HadFinalState* ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& targetNucleus) override; @@ -96,6 +100,8 @@ private: G4ParticleDefinition* theHe3; G4double lowestEnergyLimit; + + G4int secID; // Creator model ID for the secondaries created by this model }; inline void G4ChargeExchange::SetLowestEnergyLimit(G4double value) diff --git a/source/processes/hadronic/models/coherent_elastic/include/G4HadronElastic.hh b/source/processes/hadronic/models/coherent_elastic/include/G4HadronElastic.hh index 33649a0862..6b3388596e 100644 --- a/source/processes/hadronic/models/coherent_elastic/include/G4HadronElastic.hh +++ b/source/processes/hadronic/models/coherent_elastic/include/G4HadronElastic.hh @@ -75,6 +75,7 @@ public: protected: G4double pLocalTmax; + G4int secID; // Creator model ID for the recoil private: diff --git a/source/processes/hadronic/models/coherent_elastic/include/G4LMsdGenerator.hh b/source/processes/hadronic/models/coherent_elastic/include/G4LMsdGenerator.hh index ff58a65ce2..ba86da6a57 100644 --- a/source/processes/hadronic/models/coherent_elastic/include/G4LMsdGenerator.hh +++ b/source/processes/hadronic/models/coherent_elastic/include/G4LMsdGenerator.hh @@ -90,6 +90,7 @@ class G4LMsdGenerator : public G4HadronicInteraction // G4ParticleDefinition* fParticle; G4int fPDGencoding; + G4int secID; // Creator model ID for the secondaries created by this model static const G4double fMxBdata[23][2]; static const G4double fProbMx[60][2]; diff --git a/source/processes/hadronic/models/coherent_elastic/include/G4NeutronElectronElModel.hh b/source/processes/hadronic/models/coherent_elastic/include/G4NeutronElectronElModel.hh index 4ba14dc366..52c87f1c35 100644 --- a/source/processes/hadronic/models/coherent_elastic/include/G4NeutronElectronElModel.hh +++ b/source/processes/hadronic/models/coherent_elastic/include/G4NeutronElectronElModel.hh @@ -52,7 +52,7 @@ class G4NeutronElectronElModel : public G4HadronElastic { public: - G4NeutronElectronElModel(const G4String& name = "nu-e-elastic"); + G4NeutronElectronElModel(const G4String& name = "n-e-elastic"); virtual ~G4NeutronElectronElModel(); diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4ChargeExchange.cc b/source/processes/hadronic/models/coherent_elastic/src/G4ChargeExchange.cc index fdfafdac82..916caa5c1c 100644 --- a/source/processes/hadronic/models/coherent_elastic/src/G4ChargeExchange.cc +++ b/source/processes/hadronic/models/coherent_elastic/src/G4ChargeExchange.cc @@ -50,9 +50,10 @@ #include "G4Pow.hh" #include "G4HadronicParameters.hh" +#include "G4PhysicsModelCatalog.hh" -G4ChargeExchange::G4ChargeExchange() : G4HadronicInteraction("Charge Exchange") +G4ChargeExchange::G4ChargeExchange() : G4HadronicInteraction("Charge Exchange"), secID(-1) { SetMinEnergy( 0.0*GeV ); SetMaxEnergy( G4HadronicParameters::Instance()->GetMaxEnergy() ); @@ -88,6 +89,8 @@ G4ChargeExchange::G4ChargeExchange() : G4HadronicInteraction("Charge Exchange") theT = G4Triton::Triton(); theA = G4Alpha::Alpha(); theHe3 = G4He3::He3(); + + secID = G4PhysicsModelCatalog::GetModelID( "model_ChargeExchange" ); } G4ChargeExchange::~G4ChargeExchange() @@ -285,7 +288,7 @@ G4HadFinalState* G4ChargeExchange::ApplyYourself( theParticleChange.SetStatusChange(stopAndKill); theParticleChange.SetEnergyChange(0.0); G4DynamicParticle * aSec = new G4DynamicParticle(theSecondary, nlv1); - theParticleChange.AddSecondary(aSec); + theParticleChange.AddSecondary(aSec, secID); G4double erec = std::max(nlv0.e() - m21, 0.0); @@ -298,7 +301,7 @@ G4HadFinalState* G4ChargeExchange::ApplyYourself( aSec->SetKineticEnergy(0.0); } else if(erec > GetRecoilEnergyThreshold()) { aSec = new G4DynamicParticle(theRecoil, nlv0); - theParticleChange.AddSecondary(aSec); + theParticleChange.AddSecondary(aSec, secID); } else { theParticleChange.SetLocalEnergyDeposit(erec); } diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4HadronElastic.cc b/source/processes/hadronic/models/coherent_elastic/src/G4HadronElastic.cc index 0e3f08aa18..59da3b9eff 100644 --- a/source/processes/hadronic/models/coherent_elastic/src/G4HadronElastic.cc +++ b/source/processes/hadronic/models/coherent_elastic/src/G4HadronElastic.cc @@ -43,10 +43,11 @@ #include "G4Exp.hh" #include "G4Log.hh" #include "G4HadronicParameters.hh" +#include "G4PhysicsModelCatalog.hh" G4HadronElastic::G4HadronElastic(const G4String& name) - : G4HadronicInteraction(name) + : G4HadronicInteraction(name), secID(-1) { SetMinEnergy( 0.0*GeV ); SetMaxEnergy( G4HadronicParameters::Instance()->GetMaxEnergy() ); @@ -58,6 +59,8 @@ G4HadronElastic::G4HadronElastic(const G4String& name) theNeutron = G4Neutron::Neutron(); theDeuteron = G4Deuteron::Deuteron(); theAlpha = G4Alpha::Alpha(); + + secID = G4PhysicsModelCatalog::GetModelID( "model_" + name ); } G4HadronElastic::~G4HadronElastic() @@ -192,7 +195,7 @@ G4HadFinalState* G4HadronElastic::ApplyYourself( G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(Z,A,0.0); } G4DynamicParticle * aSec = new G4DynamicParticle(theDef, lv.vect().unit(), erec); - theParticleChange.AddSecondary(aSec); + theParticleChange.AddSecondary(aSec, secID); } else { theParticleChange.SetLocalEnergyDeposit(erec); } diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4LEHadronProtonElastic.cc b/source/processes/hadronic/models/coherent_elastic/src/G4LEHadronProtonElastic.cc index 5b2c0b7ace..206626c1cb 100644 --- a/source/processes/hadronic/models/coherent_elastic/src/G4LEHadronProtonElastic.cc +++ b/source/processes/hadronic/models/coherent_elastic/src/G4LEHadronProtonElastic.cc @@ -37,13 +37,14 @@ #include "G4SystemOfUnits.hh" #include "Randomize.hh" #include "G4ios.hh" - #include "G4Pow.hh" +#include "G4PhysicsModelCatalog.hh" G4LEHadronProtonElastic::G4LEHadronProtonElastic(): G4HadronElastic("G4LEHadronProtonElastic") { + secID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); SetMinEnergy(0.); SetMaxEnergy(20.*MeV); } @@ -241,7 +242,7 @@ G4LEHadronProtonElastic::ApplyYourself(const G4HadProjectile& aTrack, theParticleChange.SetMomentumChange(newP->GetMomentumDirection()); theParticleChange.SetEnergyChange(newP->GetKineticEnergy()); delete newP; - theParticleChange.AddSecondary(targetParticle); + theParticleChange.AddSecondary(targetParticle, secID); return &theParticleChange; } diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4LEnp.cc b/source/processes/hadronic/models/coherent_elastic/src/G4LEnp.cc index a29406c38b..fddf2706d9 100644 --- a/source/processes/hadronic/models/coherent_elastic/src/G4LEnp.cc +++ b/source/processes/hadronic/models/coherent_elastic/src/G4LEnp.cc @@ -41,10 +41,13 @@ #include "G4LEnpData.hh" #include "Randomize.hh" +#include "G4PhysicsModelCatalog.hh" + G4LEnp::G4LEnp(): G4HadronElastic("G4LEnp") // G4HadronicInteraction("G4LEnp") { + secID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); // theParticleChange.SetNumberOfSecondaries(1); // SetMinEnergy(10.*MeV); @@ -300,7 +303,7 @@ G4LEnp::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& targetNucleus) theParticleChange.SetMomentumChange(newP->GetMomentumDirection()); theParticleChange.SetEnergyChange(newP->GetKineticEnergy()); delete newP; - theParticleChange.AddSecondary(targetParticle); + theParticleChange.AddSecondary(targetParticle, secID); return &theParticleChange; } diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4LEpp.cc b/source/processes/hadronic/models/coherent_elastic/src/G4LEpp.cc index 87d474cd7f..c144174da1 100644 --- a/source/processes/hadronic/models/coherent_elastic/src/G4LEpp.cc +++ b/source/processes/hadronic/models/coherent_elastic/src/G4LEpp.cc @@ -38,8 +38,12 @@ // Initialization of static data arrays: #include "G4LEppData.hh" +#include "G4PhysicsModelCatalog.hh" + + G4LEpp::G4LEpp():G4HadronElastic("G4LEpp") { + secID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); SetMinEnergy(0.); SetMaxEnergy(5.*GeV); } @@ -234,7 +238,7 @@ G4LEpp::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& targetNucleus) delete newP; // Recoil particle - theParticleChange.AddSecondary(targetParticle); + theParticleChange.AddSecondary(targetParticle, secID); return &theParticleChange; } diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4LMsdGenerator.cc b/source/processes/hadronic/models/coherent_elastic/src/G4LMsdGenerator.cc index 4848abff2b..a7908243dd 100644 --- a/source/processes/hadronic/models/coherent_elastic/src/G4LMsdGenerator.cc +++ b/source/processes/hadronic/models/coherent_elastic/src/G4LMsdGenerator.cc @@ -40,14 +40,16 @@ #include "G4DecayKineticTracks.hh" #include "G4KineticTrackVector.hh" #include "G4Log.hh" +#include "G4PhysicsModelCatalog.hh" G4LMsdGenerator::G4LMsdGenerator(const G4String& name) - : G4HadronicInteraction(name) + : G4HadronicInteraction(name), secID(-1) { fPDGencoding = 0; - + secID = G4PhysicsModelCatalog::GetModelID( "model_LMsdGenerator" ); + // theParticleChange = new G4HadFinalState; } @@ -243,7 +245,7 @@ G4LMsdGenerator::ApplyYourself( const G4HadProjectile& aTrack, G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon( Z, A, 0.0 ); } G4DynamicParticle * aSec = new G4DynamicParticle( recoilDef, lvTarg); - theParticleChange.AddSecondary(aSec); + theParticleChange.AddSecondary(aSec, secID); } else if( eRecoil > 0.0 ) { @@ -275,7 +277,7 @@ G4LMsdGenerator::ApplyYourself( const G4HadProjectile& aTrack, // G4cout<<" "<GetDefinition()->GetParticleName()<<", "<Get4Momentum()<operator[](i); } delete ddktv; diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4NeutrinoElectronNcModel.cc b/source/processes/hadronic/models/coherent_elastic/src/G4NeutrinoElectronNcModel.cc index a9d86ff135..23ba096dc7 100644 --- a/source/processes/hadronic/models/coherent_elastic/src/G4NeutrinoElectronNcModel.cc +++ b/source/processes/hadronic/models/coherent_elastic/src/G4NeutrinoElectronNcModel.cc @@ -37,6 +37,7 @@ #include "Randomize.hh" #include "G4Electron.hh" #include "G4HadronicParameters.hh" +#include "G4PhysicsModelCatalog.hh" using namespace std; using namespace CLHEP; @@ -44,6 +45,8 @@ using namespace CLHEP; G4NeutrinoElectronNcModel::G4NeutrinoElectronNcModel(const G4String& name) : G4HadronElastic(name) { + secID = G4PhysicsModelCatalog::GetModelID( "model_" + name ); + SetMinEnergy( 0.0*GeV ); SetMaxEnergy( G4HadronicParameters::Instance()->GetMaxEnergy() ); SetLowestEnergyLimit(1.e-6*eV); @@ -54,7 +57,6 @@ G4NeutrinoElectronNcModel::G4NeutrinoElectronNcModel(const G4String& name) fSin2tW = 0.23129; // 0.2312; fCutEnergy = 0.; // default value - } @@ -137,7 +139,7 @@ G4HadFinalState* G4NeutrinoElectronNcModel::ApplyYourself( eP *= ePlab; G4LorentzVector lvt2( eP, eTkin + electron_mass_c2 ); G4DynamicParticle * aSec = new G4DynamicParticle( theElectron, lvt2 ); - theParticleChange.AddSecondary( aSec ); + theParticleChange.AddSecondary( aSec, secID ); G4LorentzVector lvp1 = aParticle->Get4Momentum(); G4LorentzVector lvt1(0.,0.,0.,electron_mass_c2); diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4NeutronElectronElModel.cc b/source/processes/hadronic/models/coherent_elastic/src/G4NeutronElectronElModel.cc index f0d4d05b67..4a0cff6fbe 100644 --- a/source/processes/hadronic/models/coherent_elastic/src/G4NeutronElectronElModel.cc +++ b/source/processes/hadronic/models/coherent_elastic/src/G4NeutronElectronElModel.cc @@ -40,6 +40,7 @@ #include "G4PhysicsTable.hh" #include "G4PhysicsLogVector.hh" #include "G4PhysicsFreeVector.hh" +#include "G4PhysicsModelCatalog.hh" using namespace std; @@ -48,6 +49,8 @@ using namespace CLHEP; G4NeutronElectronElModel::G4NeutronElectronElModel(const G4String& name) : G4HadronElastic(name) { + secID = G4PhysicsModelCatalog::GetModelID( "model_" + name ); + // neutron magneton squared fM = neutron_mass_c2; // neutron mass @@ -334,7 +337,7 @@ G4HadFinalState* G4NeutronElectronElModel::ApplyYourself( // G4cout<<"lvt2 = "<SetCreatorModelID(secID); } fragmentVector->push_back(fragment); } else { G4Fragment *fragment = new G4Fragment(lorentzVector,G4Proton::Proton()); + if (fragment != nullptr) { fragment->SetCreatorModelID(secID); } fragmentVector->push_back(fragment); } if (verboseLevel >= 2) @@ -394,6 +399,7 @@ G4FragmentVector *G4WilsonAblationModel::BreakItUp G4LorentzVector lorentzVector = G4LorentzVector(direction*p, e); lorentzVector.boost(-boost); G4Fragment* frag = new G4Fragment(AF, ZF, lorentzVector); + if (frag != nullptr) { frag->SetCreatorModelID(secID); } fragmentVector->push_back(frag); } delete resultNucleus; @@ -537,6 +543,7 @@ void G4WilsonAblationModel::SelectSecondariesByEvaporation if (ii >= nChannels) { ii = nChannels - 1; } G4FragmentVector *evaporationResult = theChannels1[ii]-> BreakUpFragment(intermediateNucleus); + if ((*evaporationResult)[0] != nullptr) { (*evaporationResult)[0]->SetCreatorModelID(secID); } fragmentVector->push_back((*evaporationResult)[0]); intermediateNucleus = (*evaporationResult)[1]; delete evaporationResult; @@ -578,7 +585,7 @@ void G4WilsonAblationModel::SelectSecondariesByDefault (G4ThreeVector boost) G4int Z = (G4int) (type->GetPDGCharge() + 1.0E-10); G4Fragment *fragment = new G4Fragment(A, Z, lorentzVector); - + if (fragment != nullptr) { fragment->SetCreatorModelID(secID); } fragmentVector->push_back(fragment); } } diff --git a/source/processes/hadronic/models/de_excitation/evaporation/include/G4EvaporationChannel.hh b/source/processes/hadronic/models/de_excitation/evaporation/include/G4EvaporationChannel.hh index 46091e069b..ae2b748dbc 100644 --- a/source/processes/hadronic/models/de_excitation/evaporation/include/G4EvaporationChannel.hh +++ b/source/processes/hadronic/models/de_excitation/evaporation/include/G4EvaporationChannel.hh @@ -71,6 +71,8 @@ private: G4int resA; G4int resZ; + G4int secID; // Creator model ID for the secondaries created by this model + G4double mass; G4double resMass; diff --git a/source/processes/hadronic/models/de_excitation/evaporation/include/G4UnstableFragmentBreakUp.hh b/source/processes/hadronic/models/de_excitation/evaporation/include/G4UnstableFragmentBreakUp.hh index 9800aeb32b..17fdf450fe 100644 --- a/source/processes/hadronic/models/de_excitation/evaporation/include/G4UnstableFragmentBreakUp.hh +++ b/source/processes/hadronic/models/de_excitation/evaporation/include/G4UnstableFragmentBreakUp.hh @@ -82,6 +82,8 @@ private: G4NuclearLevelData* fLevelData; G4int fVerbose; + + G4int fSecID; // Creator model ID for the secondaries created by this model }; #endif diff --git a/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationChannel.cc b/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationChannel.cc index 8da10cf559..003887e7c9 100644 --- a/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationChannel.cc +++ b/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationChannel.cc @@ -49,16 +49,19 @@ #include "Randomize.hh" #include "G4RandomDirection.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" G4EvaporationChannel::G4EvaporationChannel(G4int anA, G4int aZ, G4EvaporationProbability* aprob): G4VEvaporationChannel(), theA(anA), theZ(aZ), + secID(-1), theProbability(aprob), theCoulombBarrier(new G4CoulombBarrier(anA, aZ)) { resA = resZ = 0; + secID = G4PhysicsModelCatalog::GetModelID("model_G4EvaporationChannel"); mass = resMass = 0.0; evapMass = G4NucleiProperties::GetNuclearMass(theA, theZ); //G4cout << "G4EvaporationChannel: Z= " << theZ << " A= " << theA @@ -167,10 +170,12 @@ G4Fragment* G4EvaporationChannel::EmittedFragment(G4Fragment* theNucleus) lv.boost(lv0.boostVector()); G4Fragment* evFragment = new G4Fragment(theA, theZ, lv); + if(evFragment != nullptr) { evFragment->SetCreatorModelID(secID); } lv0 -= lv; theNucleus->SetZandA_asInt(resZ, resA); theNucleus->SetMomentum(lv0); - + theNucleus->SetCreatorModelID(secID); + //G4cout << "Residual: Z= " << resZ << " A= " << resA << " Eex= " // << theNucleus->GetExcitationEnergy() << G4endl; return evFragment; diff --git a/source/processes/hadronic/models/de_excitation/evaporation/src/G4UnstableFragmentBreakUp.cc b/source/processes/hadronic/models/de_excitation/evaporation/src/G4UnstableFragmentBreakUp.cc index c9857c33eb..c72f7bbd94 100644 --- a/source/processes/hadronic/models/de_excitation/evaporation/src/G4UnstableFragmentBreakUp.cc +++ b/source/processes/hadronic/models/de_excitation/evaporation/src/G4UnstableFragmentBreakUp.cc @@ -51,16 +51,18 @@ #include "G4NuclearLevelData.hh" #include "G4LevelManager.hh" #include "Randomize.hh" +#include "G4PhysicsModelCatalog.hh" const G4int G4UnstableFragmentBreakUp::Zfr[] = {0, 1, 1, 1, 2, 2}; const G4int G4UnstableFragmentBreakUp::Afr[] = {1, 1, 2, 3, 3, 4}; -G4UnstableFragmentBreakUp::G4UnstableFragmentBreakUp() : fVerbose(1) +G4UnstableFragmentBreakUp::G4UnstableFragmentBreakUp() : fVerbose(1), fSecID(-1) { fLevelData = G4NuclearLevelData::GetInstance(); for(G4int i=0; i<6; ++i) { masses[i] = G4NucleiProperties::GetNuclearMass(Afr[i], Zfr[i]); } + fSecID = G4PhysicsModelCatalog::GetModelID("model_G4UnstableFragmentBreakUp"); } G4UnstableFragmentBreakUp::~G4UnstableFragmentBreakUp() @@ -169,6 +171,7 @@ G4bool G4UnstableFragmentBreakUp::BreakUpChain(G4FragmentVector* results, mom2.boost(bst); frag = new G4Fragment(Afr[idx], Zfr[idx], mom2); frag->SetCreationTime(time); + frag->SetCreatorModelID(fSecID); results->push_back(frag); // residual @@ -178,6 +181,7 @@ G4bool G4UnstableFragmentBreakUp::BreakUpChain(G4FragmentVector* results, nucleus->SetZandA_asInt(Z, A); nucleus->SetMomentum(lv); + nucleus->SetCreatorModelID(fSecID); return true; } diff --git a/source/processes/hadronic/models/de_excitation/fermi_breakup/include/G4FermiBreakUpVI.hh b/source/processes/hadronic/models/de_excitation/fermi_breakup/include/G4FermiBreakUpVI.hh index ddc8527121..c8ac377985 100644 --- a/source/processes/hadronic/models/de_excitation/fermi_breakup/include/G4FermiBreakUpVI.hh +++ b/source/processes/hadronic/models/de_excitation/fermi_breakup/include/G4FermiBreakUpVI.hh @@ -84,6 +84,8 @@ private: G4int A; G4int spin; + G4int secID; // Creator model ID for the secondaries created by this model + G4double mass; G4double excitation; G4double tolerance; diff --git a/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiBreakUpVI.cc b/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiBreakUpVI.cc index c10c9a386e..1a4906a33c 100644 --- a/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiBreakUpVI.cc +++ b/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiBreakUpVI.cc @@ -36,6 +36,7 @@ #include "G4RandomDirection.hh" #include "G4PhysicalConstants.hh" #include "Randomize.hh" +#include "G4PhysicsModelCatalog.hh" G4FermiFragmentsPoolVI* G4FermiBreakUpVI::thePool = nullptr; @@ -44,11 +45,12 @@ G4Mutex G4FermiBreakUpVI::FermiBreakUpVIMutex = G4MUTEX_INITIALIZER; #endif G4FermiBreakUpVI::G4FermiBreakUpVI() - : theDecay(nullptr), rndmEngine(nullptr), maxZ(9), maxA(17) + : theDecay(nullptr), rndmEngine(nullptr), maxZ(9), maxA(17), secID(-1) { frag.reserve(10); lvect.reserve(10); Z = A = spin = 0; + secID = G4PhysicsModelCatalog::GetModelID("model_G4FermiBreakUpVI"); mass = elim = excitation = 0.0; tolerance = CLHEP::MeV; frag1 = frag2 = nullptr; @@ -142,6 +144,7 @@ void G4FermiBreakUpVI::BreakFragment(G4FragmentVector* theResult, G4Fragment* f = new G4Fragment(A, Z, lv0); f->SetSpin(0.5*spin); f->SetCreationTime(time); + f->SetCreatorModelID(secID); theResult->push_back(f); } // limit the loop diff --git a/source/processes/hadronic/models/de_excitation/fission/include/G4CompetitiveFission.hh b/source/processes/hadronic/models/de_excitation/fission/include/G4CompetitiveFission.hh index afbafaabbf..52a82c9527 100644 --- a/source/processes/hadronic/models/de_excitation/fission/include/G4CompetitiveFission.hh +++ b/source/processes/hadronic/models/de_excitation/fission/include/G4CompetitiveFission.hh @@ -116,7 +116,8 @@ private: G4bool myOwnLevelDensity; G4FissionParameters theParam; - + + G4int theSecID; // Creator model ID for the secondaries created by this model }; inline G4double G4CompetitiveFission::GetFissionBarrier(void) const diff --git a/source/processes/hadronic/models/de_excitation/fission/include/G4ParaFissionModel.hh b/source/processes/hadronic/models/de_excitation/fission/include/G4ParaFissionModel.hh deleted file mode 100644 index 0e46cfab90..0000000000 --- a/source/processes/hadronic/models/de_excitation/fission/include/G4ParaFissionModel.hh +++ /dev/null @@ -1,128 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -#ifndef G4ParaFissionModel_h -#define G4ParaFissionModel_h 1 - -#include "G4CompetitiveFission.hh" -#include "G4ExcitationHandler.hh" -#include "G4HadronicInteraction.hh" -#include "G4NucleiProperties.hh" -//#include "G4ParticleTable.hh" - -// Class Description -// Final state production model for (based on evaluated data -// libraries) description of neutron induced fission below 60 MeV; -// In case you need the fission fragments, use this model. -// To be used in your physics list in case you need this physics. -// In this case you want to register an object of this class with -// the corresponding process. - - -class G4ParaFissionModel : public G4HadronicInteraction -{ -public: - - G4ParaFissionModel() - { - SetMinEnergy( 0.0 ); - SetMaxEnergy( 60.*MeV ); - } - - virtual ~G4ParaFissionModel() {}; - - virtual G4HadFinalState* ApplyYourself(const G4HadProjectile& aTrack, - G4Nucleus& theNucleus) - { - theParticleChange.Clear(); - theParticleChange.SetStatusChange( stopAndKill ); - theParticleChange.SetEnergyChange( 0.0 ); - - // prepare the fragment - - G4int A = theNucleus.GetA_asInt(); - G4int Z = theNucleus.GetZ_asInt(); - G4double nucMass = G4NucleiProperties::GetNuclearMass(A, Z); - - G4int numberOfEx = aTrack.GetDefinition()->GetBaryonNumber(); - G4int numberOfCh = G4int(aTrack.GetDefinition()->GetPDGCharge() + 0.5); - G4int numberOfHoles = 0; - - A += numberOfEx; - Z += numberOfCh; - - G4LorentzVector v = aTrack.Get4Momentum() + G4LorentzVector(0.0,0.0,0.0,nucMass); - G4Fragment anInitialState(A,Z,v); - anInitialState.SetNumberOfExcitedParticle(numberOfEx,numberOfCh); - anInitialState.SetNumberOfHoles(0,0); - - // do the fission - G4FragmentVector * theFissionResult = theFission.BreakUp(anInitialState); - - // deexcite the fission fragments and fill result - - G4int ll = theFissionResult->size(); - for(G4int i=0; iGetExcitationEnergy() > keV) - { - theExcitationResult = theHandler.BreakItUp(*aFragment); - - // add secondaries - for(G4int j = 0; j < G4int(theExcitationResult->size()); j++) - { - G4ReactionProduct* rp0 = (*theExcitationResult)[j]; - G4DynamicParticle* p0 = - new G4DynamicParticle(rp0->GetDefinition(),rp0->GetMomentum()); - theParticleChange.AddSecondary(p0); - delete rp0; - } - delete theExcitationResult; - } - else - { - // add secondary - G4DynamicParticle* p0 = - new G4DynamicParticle(aFragment->GetParticleDefinition(), - aFragment->GetMomentum()); - theParticleChange.AddSecondary(p0); - } - delete aFragment; - } - - delete theFissionResult; - - return &theParticleChange; - } -private: - - G4CompetitiveFission theFission; - G4ExcitationHandler theHandler; - - G4HadFinalState theParticleChange; -}; -#endif diff --git a/source/processes/hadronic/models/de_excitation/fission/sources.cmake b/source/processes/hadronic/models/de_excitation/fission/sources.cmake index abbd2f7b88..192005e6fe 100644 --- a/source/processes/hadronic/models/de_excitation/fission/sources.cmake +++ b/source/processes/hadronic/models/de_excitation/fission/sources.cmake @@ -10,7 +10,6 @@ geant4_add_module(G4hadronic_deex_fission G4FissionLevelDensityParameterINCLXX.hh G4FissionParameters.hh G4FissionProbability.hh - G4ParaFissionModel.hh G4VFissionBarrier.hh SOURCES G4CompetitiveFission.cc @@ -25,10 +24,8 @@ geant4_add_module(G4hadronic_deex_fission geant4_module_link_libraries(G4hadronic_deex_fission PUBLIC G4globman - G4hadronic_deex_handler G4hadronic_deex_management G4hadronic_deex_util - G4hadronic_mgt G4hadronic_util G4partman PRIVATE diff --git a/source/processes/hadronic/models/de_excitation/fission/src/G4CompetitiveFission.cc b/source/processes/hadronic/models/de_excitation/fission/src/G4CompetitiveFission.cc index 50fb324564..823d6e9e44 100644 --- a/source/processes/hadronic/models/de_excitation/fission/src/G4CompetitiveFission.cc +++ b/source/processes/hadronic/models/de_excitation/fission/src/G4CompetitiveFission.cc @@ -45,8 +45,9 @@ #include "Randomize.hh" #include "G4RandomDirection.hh" #include "G4PhysicalConstants.hh" +#include "G4PhysicsModelCatalog.hh" -G4CompetitiveFission::G4CompetitiveFission() : G4VEvaporationChannel("fission") +G4CompetitiveFission::G4CompetitiveFission() : G4VEvaporationChannel("fission"), theSecID(-1) { theFissionBarrierPtr = new G4FissionBarrier; myOwnFissionBarrier = true; @@ -59,6 +60,8 @@ G4CompetitiveFission::G4CompetitiveFission() : G4VEvaporationChannel("fission") maxKineticEnergy = fissionBarrier = fissionProbability = 0.0; pairingCorrection = G4NuclearLevelData::GetInstance()->GetPairingCorrection(); + + theSecID = G4PhysicsModelCatalog::GetModelID("model_G4CompetitiveFission"); } G4CompetitiveFission::~G4CompetitiveFission() @@ -186,9 +189,11 @@ G4Fragment* G4CompetitiveFission::EmittedFragment(G4Fragment* theNucleus) // Create Fragments Fragment1 = new G4Fragment( A1, Z1, FourMomentum1); + if (Fragment1 != nullptr) { Fragment1->SetCreatorModelID(theSecID); } theNucleusMomentum -= FourMomentum1; theNucleus->SetZandA_asInt(Z2, A2); theNucleus->SetMomentum(theNucleusMomentum); + theNucleus->SetCreatorModelID(theSecID); return Fragment1; } diff --git a/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMChannel.hh b/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMChannel.hh index 6970d6200d..145bfcb714 100644 --- a/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMChannel.hh +++ b/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMChannel.hh @@ -114,6 +114,9 @@ private: G4VCoulombBarrier * theCoulombBarrierPtr; G4NuclearLevelData* fNucData; + + // For creator model ID of the secondaries created by this model + G4int secID; }; diff --git a/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMChannelVI.hh b/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMChannelVI.hh index 62dcb32ca5..0b89cb9f3c 100644 --- a/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMChannelVI.hh +++ b/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMChannelVI.hh @@ -68,7 +68,8 @@ private: G4int resZ; G4int fragA; G4int fragZ; - + G4int secID; // Creator model ID for the secondaries created by this model + G4double mass; G4double resMass; G4double evapMass; diff --git a/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMChannel.cc b/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMChannel.cc index 18622a59cd..e406a82677 100644 --- a/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMChannel.cc +++ b/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMChannel.cc @@ -44,6 +44,7 @@ #include "G4Log.hh" #include "G4Exp.hh" #include "G4RandomDirection.hh" +#include "G4PhysicsModelCatalog.hh" G4GEMChannel::G4GEMChannel(G4int theA, G4int theZ, const G4String & aName, G4GEMProbability * aEmissionStrategy) : @@ -52,7 +53,8 @@ G4GEMChannel::G4GEMChannel(G4int theA, G4int theZ, const G4String & aName, Z(theZ), EmissionProbability(0.0), MaximalKineticEnergy(-CLHEP::GeV), - theEvaporationProbabilityPtr(aEmissionStrategy) + theEvaporationProbabilityPtr(aEmissionStrategy), + secID(-1) { theCoulombBarrierPtr = new G4GEMCoulombBarrier(theA, theZ); theEvaporationProbabilityPtr->SetCoulomBarrier(theCoulombBarrierPtr); @@ -63,6 +65,7 @@ G4GEMChannel::G4GEMChannel(G4int theA, G4int theZ, const G4String & aName, fG4pow = G4Pow::GetInstance(); ResidualZ = ResidualA = 0; fNucData = G4NuclearLevelData::GetInstance(); + secID = G4PhysicsModelCatalog::GetModelID("model_G4GEMChannel"); } G4GEMChannel::~G4GEMChannel() @@ -137,10 +140,12 @@ G4Fragment* G4GEMChannel::EmittedFragment(G4Fragment* theNucleus) EvaporatedMomentum.boost(ResidualMomentum.boostVector()); evFragment = new G4Fragment(A, Z, EvaporatedMomentum); + if ( evFragment != nullptr ) { evFragment->SetCreatorModelID(secID); } ResidualMomentum -= EvaporatedMomentum; theNucleus->SetZandA_asInt(ResidualZ, ResidualA); theNucleus->SetMomentum(ResidualMomentum); - + theNucleus->SetCreatorModelID(secID); + return evFragment; } diff --git a/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMChannelVI.cc b/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMChannelVI.cc index fd7a3fb172..b78c4ca204 100644 --- a/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMChannelVI.cc +++ b/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMChannelVI.cc @@ -37,9 +37,10 @@ #include "G4LevelManager.hh" #include "G4NucleiProperties.hh" #include "G4RandomDirection.hh" +#include "G4PhysicsModelCatalog.hh" G4GEMChannelVI::G4GEMChannelVI(G4int theA, G4int theZ) - : A(theA), Z(theZ) + : A(theA), Z(theZ), secID(-1) { G4NuclearLevelData* nData = G4NuclearLevelData::GetInstance(); pairingCorrection = nData->GetPairingCorrection(); @@ -52,7 +53,8 @@ G4GEMChannelVI::G4GEMChannelVI(G4int theA, G4int theZ) fProbability = new G4GEMProbabilityVI(A, Z, lManager); resA = resZ = fragZ = fragA = 0; - mass = resMass = 0.0; + mass = resMass = 0.0; + secID = G4PhysicsModelCatalog::GetModelID("model_G4GEMChannelVI"); } G4GEMChannelVI::~G4GEMChannelVI() @@ -113,9 +115,11 @@ G4Fragment* G4GEMChannelVI::EmittedFragment(G4Fragment* theNucleus) evFragment->SetMomentum(lv); lv0 -= lv; } + if(evFragment != nullptr) { evFragment->SetCreatorModelID(secID); } theNucleus->SetZandA_asInt(resZ, resA); theNucleus->SetMomentum(lv0); - + theNucleus->SetCreatorModelID(secID); + return evFragment; } diff --git a/source/processes/hadronic/models/de_excitation/handler/src/G4ExcitationHandler.cc b/source/processes/hadronic/models/de_excitation/handler/src/G4ExcitationHandler.cc index 714515ae19..654d0ae8f4 100644 --- a/source/processes/hadronic/models/de_excitation/handler/src/G4ExcitationHandler.cc +++ b/source/processes/hadronic/models/de_excitation/handler/src/G4ExcitationHandler.cc @@ -81,6 +81,7 @@ #include "G4FermiBreakUpVI.hh" #include "G4NuclearLevelData.hh" #include "G4Pow.hh" +#include "G4PhysicsModelCatalog.hh" G4ExcitationHandler::G4ExcitationHandler() : icID(0),maxZForFermiBreakUp(9),maxAForFermiBreakUp(17), @@ -136,7 +137,7 @@ void G4ExcitationHandler::SetParameters() minEForMultiFrag = param->GetMinExPerNucleounForMF(); minExcitation = param->GetMinExcitation(); maxExcitation = param->GetPrecoHighEnergy(); - icID = param->GetInternalConversionID(); + icID = G4PhysicsModelCatalog::GetModelID("model_e-InternalConversion"); // allowing local debug printout fVerbose = std::max(fVerbose, param->GetVerbose()); @@ -501,7 +502,11 @@ G4ExcitationHandler::BreakItUp(const G4Fragment & theInitialState) theNew->SetMomentum(frag->GetMomentum().vect()); theNew->SetTotalEnergy(etot); theNew->SetFormationTime(frag->GetCreationTime()); - if(theKindOfFragment == theElectron) { theNew->SetCreatorModel(icID); } + if(theKindOfFragment == theElectron) { + theNew->SetCreatorModelID(icID); + } else { + theNew->SetCreatorModelID(frag->GetCreatorModelID()); + } theReactionProductVector->push_back(theNew); // fragment not found out ground state is created @@ -521,6 +526,7 @@ G4ExcitationHandler::BreakItUp(const G4Fragment & theInitialState) theNew->SetMomentum(mom); theNew->SetTotalEnergy(etot); theNew->SetFormationTime(frag->GetCreationTime()); + theNew->SetCreatorModelID(frag->GetCreatorModelID()); theReactionProductVector->push_back(theNew); if(fVerbose > 3) { G4cout << " ground state, energy corrected E(MeV)= " diff --git a/source/processes/hadronic/models/de_excitation/management/include/G4DeexPrecoParameters.hh b/source/processes/hadronic/models/de_excitation/management/include/G4DeexPrecoParameters.hh index 81cc4569c9..5b81db592f 100644 --- a/source/processes/hadronic/models/de_excitation/management/include/G4DeexPrecoParameters.hh +++ b/source/processes/hadronic/models/de_excitation/management/include/G4DeexPrecoParameters.hh @@ -91,8 +91,6 @@ public: inline G4double GetMinExPerNucleounForMF() const; - inline G4int GetInternalConversionID() const; - inline G4int GetMinZForPreco() const; inline G4int GetMinAForPreco() const; @@ -248,8 +246,6 @@ private: G4int fPrecoType; G4int fDeexType; - // Internal conversion model ID - G4int fInternalConversionID; G4int fTwoJMAX; // Preco model @@ -274,7 +270,6 @@ private: G4bool fLD; // use simple level density model G4bool fFD; // use transition to discrete level G4bool fIsomerFlag; // enable isomere production - G4bool fLocalVerbose; // is user set verbose for this module // type of a set of e-exitation channels G4DeexChannelType fDeexChannelType; @@ -339,11 +334,6 @@ inline G4double G4DeexPrecoParameters::GetMinExPerNucleounForMF() const return fMinExPerNucleounForMF; } -inline G4int G4DeexPrecoParameters::GetInternalConversionID() const -{ - return fInternalConversionID; -} - inline G4int G4DeexPrecoParameters::GetMinZForPreco() const { return fMinZForPreco; diff --git a/source/processes/hadronic/models/de_excitation/management/src/G4DeexPrecoParameters.cc b/source/processes/hadronic/models/de_excitation/management/src/G4DeexPrecoParameters.cc index 9f728ecad7..338d6fb487 100644 --- a/source/processes/hadronic/models/de_excitation/management/src/G4DeexPrecoParameters.cc +++ b/source/processes/hadronic/models/de_excitation/management/src/G4DeexPrecoParameters.cc @@ -75,7 +75,7 @@ void G4DeexPrecoParameters::SetDefaults() fPrecoType = 3; fDeexType = 3; fTwoJMAX = 10; - fVerbose = G4HadronicParameters::Instance()->GetVerboseLevel(); + fVerbose = 1; fNeverGoBack = false; fUseSoftCutoff = false; fUseCEM = true; @@ -89,10 +89,7 @@ void G4DeexPrecoParameters::SetDefaults() fLD = true; fFD = false; fIsomerFlag = true; - fLocalVerbose = false; fDeexChannelType = fCombined; - fInternalConversionID = - G4PhysicsModelCatalog::Register("e-InternalConvertion"); #ifdef G4MULTITHREADED G4MUTEXUNLOCK(&G4DeexPrecoParameters::deexPrecoMutex); #endif @@ -197,7 +194,6 @@ void G4DeexPrecoParameters::SetTwoJMAX(G4int n) void G4DeexPrecoParameters::SetVerbose(G4int n) { if(IsLocked()) { return; } - if( n != fVerbose ) { fLocalVerbose = true; } fVerbose = n; } @@ -326,8 +322,6 @@ std::ostream& G4DeexPrecoParameters::StreamInfo(std::ostream& os) const os << "Internal e- conversion flag " << fInternalConversion << "\n"; os << "Store e- internal conversion data " << fStoreAllLevels << "\n"; - os << "Electron internal conversion ID " - << fInternalConversionID << "\n"; os << "Correlated gamma emission flag " << fCorrelatedGamma << "\n"; os << "Max 2J for sampling of angular correlations " << fTwoJMAX << "\n"; os << "=======================================================================" << G4endl; @@ -338,7 +332,7 @@ std::ostream& G4DeexPrecoParameters::StreamInfo(std::ostream& os) const G4int G4DeexPrecoParameters::GetVerbose() const { G4int verb = G4HadronicParameters::Instance()->GetVerboseLevel(); - return (fLocalVerbose && verb > 0) ? fVerbose : verb; + return (verb > 0) ? std::max(fVerbose, verb) : verb; } void G4DeexPrecoParameters::Dump() const diff --git a/source/processes/hadronic/models/de_excitation/multifragmentation/include/G4StatMF.hh b/source/processes/hadronic/models/de_excitation/multifragmentation/include/G4StatMF.hh index d51a885750..37fcdfe412 100644 --- a/source/processes/hadronic/models/de_excitation/multifragmentation/include/G4StatMF.hh +++ b/source/processes/hadronic/models/de_excitation/multifragmentation/include/G4StatMF.hh @@ -81,7 +81,7 @@ private: G4VStatMFEnsemble * _theEnsemble; - + G4int _secID; // Creator model ID for the secondaries created by this model }; diff --git a/source/processes/hadronic/models/de_excitation/multifragmentation/src/G4StatMF.cc b/source/processes/hadronic/models/de_excitation/multifragmentation/src/G4StatMF.cc index e5646eb9fd..a470ef78b2 100644 --- a/source/processes/hadronic/models/de_excitation/multifragmentation/src/G4StatMF.cc +++ b/source/processes/hadronic/models/de_excitation/multifragmentation/src/G4StatMF.cc @@ -32,9 +32,12 @@ #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" #include "G4Pow.hh" +#include "G4PhysicsModelCatalog.hh" // Default constructor -G4StatMF::G4StatMF() : _theEnsemble(0) {} +G4StatMF::G4StatMF() : _theEnsemble(0), _secID(-1) { + _secID = G4PhysicsModelCatalog::GetModelID("model_G4StatMF"); +} // Destructor @@ -182,6 +185,7 @@ G4FragmentVector * G4StatMF::BreakItUp(const G4Fragment &theFragment) G4LorentzVector FourMom = (*i)->GetMomentum(); FourMom.boost(theFragment.GetMomentum().boostVector()); (*i)->SetMomentum(FourMom); + (*i)->SetCreatorModelID(_secID); } // garbage collection diff --git a/source/processes/hadronic/models/de_excitation/photon_evaporation/README-LevelGammaData b/source/processes/hadronic/models/de_excitation/photon_evaporation/README-LevelGammaData deleted file mode 100644 index 38762dbc2b..0000000000 --- a/source/processes/hadronic/models/de_excitation/photon_evaporation/README-LevelGammaData +++ /dev/null @@ -1,81 +0,0 @@ - -The photo-evaporation database contains nuclear deexcitation data starting -from a given nuclear level. Each file contains data for a given isotope, -identified by Z and A. - -The database must first be downloaded from - -http://geant4.web.cern.ch/geant4/support/download.shtml - -and stored in a local directory. The environment variable -G4LEVELGAMMADATA must then be set to point to this directory. - -************************************************** - -Each line describes a de-excitation *step* from a given energy level to a lower -one (which might be the ground state). It contains data for gamma de-excitation -and internal conversion. Notice that if multiple de-excitation -channels are allowed for the starting energy level, these channels will be -described in more lines (all having the same starting level). - - -Each line contains 17 columns: - -1) Energy of the starting nuclear level (keV) - As mentioned before, it is possible to have more lines describing the same - starting level, in the case where multiple de-excitation schemes are - allowed. - -2) Energy of the transition (keV) - This is the energy difference between the initial and the final level. - -3) Gamma transition probability (Ig in %) - Note1: if the probability is less than minProbability = 1e-8%, it is forced - to be 1e-8%. - Note2: see column 7 how total branching ratio is computed. - -4) Polarity - Spin-parity variation in the transition - [never used in real simulation] - -5) Level half-life (s) - -6) Angular Momentum - Spin of the initial level - [never used in real simulation] - -7) Total internal conversion coefficient : alpha = Ic/Ig - Note1: total transition is the sum of gamma de-excitation and internal - conversion. Therefore total branching ratio is proportional to - (1+alpha)*Ig - Note2: total branching ratios from a given level do not always sum up to - 100%. They are re-normalized internally. - Note3: relative probabilities for gamma de-excitation and internal conversion - are 1/(1+alpha) and alpha/(1+alpha) respectively - -8-17) Partial conversion probabilities for - K-shell - L1-3 shells - M1-5 shells - Outer shells (shellID = 9 is used, when applicable) - -Note: if the nuclear excitation energy does not match any of the known levels, - the *nearest* level is always considered. In G4RadioactiveDecay, - metastable states are treated correctly if the excitation energy is - within 2.0 keV of the values in $G4RADIOACTIVEDATA. - - For instance: take file $G4LEVELGAMMADATA/z28.a60 (Ni-60) - Co-60 radioactive decay populates the 1332.5080-keV level of - Ni-60 (0.12%) or the 2505.7480-keV level of Ni-60 (99.88%). - - Deexcitation from the 2505.7480-keV level is described in lines - 6-8 of $G4LEVELGAMMADATA/z28.a60 (Ni-60) - Here, internal conversion coefficients are negligeable (column 7) - Therefore the nucleus will release - 1) 347 keV with 7.6e-3% probability, ending up in the 2158-keV level - (following de-excitation hence takes place, lines 2-4 of the file) - 2) 1173 keV with 100% probability, ending up in the 1332-keV - excited state (following de-excitation hence takes place, line 1) - 3) 2505 keV with 2e-6% probability ending up in the ground state. - - diff --git a/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4NeutronRadCapture.hh b/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4NeutronRadCapture.hh index bdf27697a5..307209c414 100644 --- a/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4NeutronRadCapture.hh +++ b/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4NeutronRadCapture.hh @@ -66,7 +66,8 @@ private: G4NeutronRadCapture & operator=(const G4NeutronRadCapture &right) = delete; G4NeutronRadCapture(const G4NeutronRadCapture&) = delete; - G4int icID; + G4int icID; // creator model ID for electrons produced by internal conversion + G4int secID; // creator model ID for the other secondaries produced by this model const G4ParticleDefinition* electron; G4double lowestEnergyLimit; G4double minExcitation; diff --git a/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4PhotonEvaporation.hh b/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4PhotonEvaporation.hh index 04035cc4c0..9623a3dd12 100644 --- a/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4PhotonEvaporation.hh +++ b/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4PhotonEvaporation.hh @@ -126,6 +126,8 @@ private: G4int vShellNumber; size_t fIndex; + G4int fSecID; // Creator model ID for the secondaries created by this model + static G4float GREnergy[MAXGRDATA]; static G4float GRWidth[MAXGRDATA]; diff --git a/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4NeutronRadCapture.cc b/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4NeutronRadCapture.cc index 7a76676d60..da453b816f 100644 --- a/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4NeutronRadCapture.cc +++ b/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4NeutronRadCapture.cc @@ -51,6 +51,7 @@ #include "G4Alpha.hh" #include "G4RandomDirection.hh" #include "G4HadronicParameters.hh" +#include "G4PhysicsModelCatalog.hh" G4NeutronRadCapture::G4NeutronRadCapture() : G4HadronicInteraction("nRadCapture"), @@ -63,7 +64,7 @@ G4NeutronRadCapture::G4NeutronRadCapture() electron = G4Electron::Electron(); icID = -1; - + secID = -1; theTableOfIons = G4ParticleTable::GetParticleTable()->GetIonTable(); } @@ -78,8 +79,8 @@ void G4NeutronRadCapture::InitialiseModel() G4DeexPrecoParameters* param = G4NuclearLevelData::GetInstance()->GetParameters(); minExcitation = param->GetMinExcitation(); - icID = param->GetInternalConversionID(); - + icID = G4PhysicsModelCatalog::GetModelID("model_e-InternalConversion"); + secID = G4PhysicsModelCatalog::GetModelID("model_" + GetModelName()); photonEvaporation = new G4PhotonEvaporation(); photonEvaporation->Initialise(); photonEvaporation->SetICM(true); @@ -127,6 +128,7 @@ G4HadFinalState* G4NeutronRadCapture::ApplyYourself( G4HadSecondary* news = new G4HadSecondary(new G4DynamicParticle(G4Gamma::Gamma(), lv2)); news->SetTime(time); + news->SetCreatorModelID(secID); theParticleChange.AddSecondary(*news); delete news; @@ -146,6 +148,7 @@ G4HadFinalState* G4NeutronRadCapture::ApplyYourself( if(theDef) { news = new G4HadSecondary(new G4DynamicParticle(theDef, lab4mom)); news->SetTime(time); + news->SetCreatorModelID(secID); theParticleChange.AddSecondary(*news); delete news; } @@ -218,7 +221,11 @@ G4HadFinalState* G4NeutronRadCapture::ApplyYourself( G4double timeF = f->GetCreationTime(); if(timeF < 0.0) { timeF = 0.0; } news->SetTime(time + timeF); - if(theDef == electron) { news->SetCreatorModelType(icID); } + if(theDef == electron) { + news->SetCreatorModelID(icID); + } else { + news->SetCreatorModelID(secID); + } theParticleChange.AddSecondary(*news); delete news; delete f; diff --git a/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4PhotonEvaporation.cc b/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4PhotonEvaporation.cc index f1f061facb..3527672ef0 100644 --- a/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4PhotonEvaporation.cc +++ b/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4PhotonEvaporation.cc @@ -52,6 +52,7 @@ #include "G4Pow.hh" #include #include +#include "G4PhysicsModelCatalog.hh" G4float G4PhotonEvaporation::GREnergy[] = {0.0f}; G4float G4PhotonEvaporation::GRWidth[] = {0.0f}; @@ -62,7 +63,7 @@ G4Mutex G4PhotonEvaporation::PhotonEvaporationMutex = G4MUTEX_INITIALIZER; G4PhotonEvaporation::G4PhotonEvaporation(G4GammaTransition* p) : fLevelManager(nullptr), fTransition(p), fPolarization(nullptr), - fVerbose(1), fPoints(0), vShellNumber(-1), fIndex(0), + fVerbose(1), fPoints(0), vShellNumber(-1), fIndex(0), fSecID(-1), fMaxLifeTime(DBL_MAX), fICM(true), fRDM(false), fSampleTime(true), fCorrelatedGamma(false), fIsomerFlag(false), isInitialised(false) @@ -74,6 +75,7 @@ G4PhotonEvaporation::G4PhotonEvaporation(G4GammaTransition* p) if(!fTransition) { fTransition = new G4GammaTransition(); } theA = theZ = fCode = 0; + fSecID = G4PhysicsModelCatalog::GetModelID("model_G4PhotonEvaporation"); fLevelEnergyMax = fStep = fExcEnergy = fProbability = 0.0; for(G4int i=0; iSetCreatorModelID(fSecID); } + // remove G4NuclearPolarizaton when reach ground state if(fNucPStore && fPolarization && 0 == fIndex) { if(fVerbose > 3) { @@ -183,6 +187,7 @@ G4PhotonEvaporation::BreakItUp(const G4Fragment& nucleus) G4Fragment* aNucleus = new G4Fragment(nucleus); G4FragmentVector* products = new G4FragmentVector(); BreakUpChain(products, aNucleus); + aNucleus->SetCreatorModelID(fSecID); products->push_back(aNucleus); return products; } @@ -196,7 +201,7 @@ G4bool G4PhotonEvaporation::BreakUpChain(G4FragmentVector* products, << *nucleus << G4endl; } G4Fragment* gamma = nullptr; - fSampleTime = (fRDM) ? false : true; + fSampleTime = !fRDM; // start decay chain from unpolarized state if(fCorrelatedGamma) { @@ -208,7 +213,8 @@ G4bool G4PhotonEvaporation::BreakUpChain(G4FragmentVector* products, do { gamma = GenerateGamma(nucleus); - if(gamma) { + if(gamma) { + gamma->SetCreatorModelID(fSecID); products->push_back(gamma); if(fVerbose > 2) { G4cout << "G4PhotonEvaporation::BreakUpChain: " @@ -391,6 +397,8 @@ G4PhotonEvaporation::GenerateGamma(G4Fragment* nucleus) } } } + // if a level has no defined transitions + if(0 == ntrans) { isDiscrete = false; } if(fVerbose > 2) { G4int prec = G4cout.precision(4); G4cout << "GenerateGamma: Z= " << nucleus->GetZ_asInt() @@ -472,38 +480,28 @@ G4PhotonEvaporation::GenerateGamma(G4Fragment* nucleus) G4double ltime = fLevelManager->LifeTime(fIndex); if(ltime < 0.0 || (!fRDM && ltime > fMaxLifeTime)) { return result; } - // no transitions: force transition to the closest level - if(0 == ntrans) { - G4int ii = fIndex - 1; - for(; ii>0; --ii) { - const G4NucLevel* fl = fLevelManager->GetLevel(ii); - if(fl && 0 < fl->NumberOfTransitions()) { break; } - } - fIndex = ii; - } else { - size_t idx = 0; - if(1 < ntrans) { - idx = level->SampleGammaTransition(G4UniformRand()); - } - if(fVerbose > 2) { - G4cout << "Ntrans= " << ntrans << " idx= " << idx - << " ICM= " << fICM << " JP1= " << JP1 << G4endl; - } - G4double prob = (G4double)level->GammaProbability(idx); - // prob = 0 means that there is only internal conversion - if(fICM && prob < 1.0) { - G4double rndm = G4UniformRand(); - if(rndm > prob) { - isGamma = false; - rndm = (rndm - prob)/(1.0 - prob); - vShellNumber = level->SampleShell(idx, rndm); - } - } - // it is discrete transition with possible gamma correlation - ratio = level->MultipolarityRatio(idx); - multiP = level->TransitionType(idx); - fIndex = level->FinalExcitationIndex(idx); + size_t idx = 0; + if(1 < ntrans) { + idx = level->SampleGammaTransition(G4UniformRand()); } + if(fVerbose > 2) { + G4cout << "Ntrans= " << ntrans << " idx= " << idx + << " ICM= " << fICM << " JP1= " << JP1 << G4endl; + } + G4double prob = (G4double)level->GammaProbability(idx); + // prob = 0 means that there is only internal conversion + if(fICM && prob < 1.0) { + G4double rndm = G4UniformRand(); + if(rndm > prob) { + isGamma = false; + rndm = (rndm - prob)/(1.0 - prob); + vShellNumber = level->SampleShell(idx, rndm); + } + } + // it is discrete transition with possible gamma correlation + ratio = level->MultipolarityRatio(idx); + multiP = level->TransitionType(idx); + fIndex = level->FinalExcitationIndex(idx); JP2 = fLevelManager->SpinTwo(fIndex); // final energy and time diff --git a/source/processes/hadronic/models/em_dissociation/History b/source/processes/hadronic/models/em_dissociation/History index 1fdc087a71..3e211a79e2 100644 --- a/source/processes/hadronic/models/em_dissociation/History +++ b/source/processes/hadronic/models/em_dissociation/History @@ -14,6 +14,12 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +04 August 2021 - Alberto Ribon (hadr-emd-V10-07-02) +--------------------------------------------------- +- G4EMDissociation : set the creator model ID for secondaries created + by projectile and target diffraction, using the new version of + G4PhysicsModelCatalog + 16 April 2021 - Ben Morgan (hadr-emd-V10-07-01) -------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/em_dissociation/include/G4EMDissociation.hh b/source/processes/hadronic/models/em_dissociation/include/G4EMDissociation.hh index 3f3b8fe28d..8845da3400 100644 --- a/source/processes/hadronic/models/em_dissociation/include/G4EMDissociation.hh +++ b/source/processes/hadronic/models/em_dissociation/include/G4EMDissociation.hh @@ -79,11 +79,11 @@ class G4EMDissociation : public G4HadronicInteraction { public: G4EMDissociation(); - G4EMDissociation(const G4EMDissociation& emd); G4EMDissociation (G4ExcitationHandler *); ~G4EMDissociation (); - const G4EMDissociation& operator=(G4EMDissociation &right); + G4EMDissociation(const G4EMDissociation& emd) = delete; + const G4EMDissociation& operator=(G4EMDissociation &right) = delete; virtual G4HadFinalState* ApplyYourself(const G4HadProjectile&, G4Nucleus&); @@ -95,5 +95,7 @@ class G4EMDissociation : public G4HadronicInteraction G4bool handlerDefinedInternally; G4EMDissociationCrossSection* dissociationCrossSection; G4EMDissociationSpectrum* thePhotonSpectrum; + G4int secID_projectileDissociation; // Creator model ID for the secondaries created by projectile dissociation + G4int secID_targetDissociation; // Creator model ID for the secondaries created by target dissociation }; #endif diff --git a/source/processes/hadronic/models/em_dissociation/src/G4EMDissociation.cc b/source/processes/hadronic/models/em_dissociation/src/G4EMDissociation.cc index d3470fe780..4b70bed20b 100644 --- a/source/processes/hadronic/models/em_dissociation/src/G4EMDissociation.cc +++ b/source/processes/hadronic/models/em_dissociation/src/G4EMDissociation.cc @@ -74,9 +74,12 @@ #include "G4ReactionProductVector.hh" #include "Randomize.hh" #include "globals.hh" +#include "G4PhysicsModelCatalog.hh" -G4EMDissociation::G4EMDissociation():G4HadronicInteraction("EMDissociation") { - +G4EMDissociation::G4EMDissociation() : + G4HadronicInteraction("EMDissociation"), + secID_projectileDissociation(-1), secID_targetDissociation(-1) +{ // Send message to stdout to advise that the G4EMDissociation model is being // used. PrintWelcomeMessage(); @@ -98,9 +101,15 @@ G4EMDissociation::G4EMDissociation():G4HadronicInteraction("EMDissociation") { // Set the default verbose level to 0 - no output. verboseLevel = 0; + + // Creator model ID for the secondaries created by this model + secID_projectileDissociation = G4PhysicsModelCatalog::GetModelID( "model_projectile" + GetModelName() ); + secID_targetDissociation = G4PhysicsModelCatalog::GetModelID( "model_target" + GetModelName() ); } -G4EMDissociation::G4EMDissociation (G4ExcitationHandler *aExcitationHandler) +G4EMDissociation::G4EMDissociation (G4ExcitationHandler *aExcitationHandler) : + G4HadronicInteraction("EMDissociation"), + secID_projectileDissociation(-1), secID_targetDissociation(-1) { // Send message to stdout to advise that the G4EMDissociation model is being // used. @@ -119,6 +128,10 @@ G4EMDissociation::G4EMDissociation (G4ExcitationHandler *aExcitationHandler) SetMinEnergy(100.0*MeV); SetMaxEnergy(500.0*GeV); verboseLevel = 0; + + // Creator model ID for the secondaries created by this model + secID_projectileDissociation = G4PhysicsModelCatalog::GetModelID( "model_projectile" + GetModelName() ); + secID_targetDissociation = G4PhysicsModelCatalog::GetModelID( "model_target" + GetModelName() ); } @@ -197,7 +210,8 @@ G4HadFinalState *G4EMDissociation::ApplyYourself // Now sample whether the interaction involved EM dissociation of the projectile // or the target. - + + G4int secID = -1; // Creator model ID for the secondaries if (G4UniformRand() < totCrossSectionP / (totCrossSectionP + totCrossSectionT)) { @@ -207,6 +221,7 @@ G4HadFinalState *G4EMDissociation::ApplyYourself // which passed from the target nucleus ... this will be used to define the // excitation of the projectile. + secID = secID_projectileDissociation; mass = MP; if (G4UniformRand() < dissociationCrossSection-> GetWilsonProbabilityForProtonDissociation (AP, ZP)) @@ -253,7 +268,8 @@ G4HadFinalState *G4EMDissociation::ApplyYourself // proton or a neutron was ejected. Then determine the energy of the virtual // gamma ray which passed from the projectile nucleus ... this will be used to // define the excitation of the target. - + + secID = secID_targetDissociation; mass = MT; if (G4UniformRand() < dissociationCrossSection-> GetWilsonProbabilityForProtonDissociation (AT, ZT)) @@ -294,7 +310,7 @@ G4HadFinalState *G4EMDissociation::ApplyYourself G4ThreeVector v = pP.vect(); v.setMag(1.0); G4DynamicParticle *changedP = new G4DynamicParticle (definitionP, v, E*AP-Eg); - theParticleChange.AddSecondary (changedP); + theParticleChange.AddSecondary (changedP, secID); if (verboseLevel >= 2) { G4cout <<"Projectile change:" <= 2) { G4cout <<"Nucleon from the EMD process:" <DumpInfo(); @@ -369,7 +385,7 @@ G4HadFinalState *G4EMDissociation::ApplyYourself for (iter = products->begin(); iter != products->end(); ++iter) { secondary = new G4DynamicParticle((*iter)->GetDefinition(), (*iter)->GetTotalEnergy(), (*iter)->GetMomentum()); - theParticleChange.AddSecondary (secondary); + theParticleChange.AddSecondary (secondary, secID); } delete products; diff --git a/source/processes/hadronic/models/fission/History b/source/processes/hadronic/models/fission/History index f29fd061ec..4aee6904dd 100644 --- a/source/processes/hadronic/models/fission/History +++ b/source/processes/hadronic/models/fission/History @@ -14,6 +14,11 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +4 August 2021 Alberto Ribon (hadr-fission-V10-07-03) +---------------------------------------------------- +- G4LFission, G4FissionLibrary : set creator model ID for the + secondaries, using the new version of G4PhysicsModelCatalog + 16 April 2021 Ben Morgan (hadr-fission-V10-07-02) -------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/fission/include/G4FissionLibrary.hh b/source/processes/hadronic/models/fission/include/G4FissionLibrary.hh index 142492b27e..142c6f80d2 100644 --- a/source/processes/hadronic/models/fission/include/G4FissionLibrary.hh +++ b/source/processes/hadronic/models/fission/include/G4FissionLibrary.hh @@ -102,5 +102,7 @@ class G4FissionLibrary : public G4ParticleHPFinalState G4ParticleHPPhotonDist theFinalStatePhotons; G4ParticleHPFissionERelease theEnergyRelease; + + G4int secID; // Creator model ID for the secondaries created by this model }; #endif diff --git a/source/processes/hadronic/models/fission/include/G4LFission.hh b/source/processes/hadronic/models/fission/include/G4LFission.hh index 5a776dd532..192f17ce47 100644 --- a/source/processes/hadronic/models/fission/include/G4LFission.hh +++ b/source/processes/hadronic/models/fission/include/G4LFission.hh @@ -75,5 +75,6 @@ class G4LFission : public G4HadronicInteraction void init(); G4double spneut[10]; + G4int secID; // Creator model ID for the secondaries created by this model }; #endif diff --git a/source/processes/hadronic/models/fission/src/G4FissionLibrary.cc b/source/processes/hadronic/models/fission/src/G4FissionLibrary.cc index 60cf0f1d96..97860a07aa 100644 --- a/source/processes/hadronic/models/fission/src/G4FissionLibrary.cc +++ b/source/processes/hadronic/models/fission/src/G4FissionLibrary.cc @@ -62,12 +62,14 @@ #include "G4FissionLibrary.hh" #include "G4ParticleHPManager.hh" #include "G4SystemOfUnits.hh" +#include "G4PhysicsModelCatalog.hh" G4FissionLibrary::G4FissionLibrary() - : G4ParticleHPFinalState(), theIsotope(0), targetMass(0.0) + : G4ParticleHPFinalState(), theIsotope(0), targetMass(0.0), secID(-1) { hasXsec = false; fe=0; + secID = G4PhysicsModelCatalog::GetModelID( "model_G4LLNLFission" ); } G4FissionLibrary::~G4FissionLibrary() @@ -187,7 +189,7 @@ G4HadFinalState* G4FissionLibrary::ApplyYourself(const G4HadProjectile & theTrac momentum*fe->getNeutronDircosw(i)); it->SetMomentum( temp ); // it->SetGlobalTime(fe->getNeutronAge(i)*second); - theResult.Get()->AddSecondary(it); + theResult.Get()->AddSecondary(it, secID); // G4cout <<"G4FissionLibrary::ApplyYourself: energy of prompt neutron " << i << " = " << it->GetKineticEnergy()<SetMomentum(thePhoton->GetMomentum()); // it->SetGlobalTime(fe->getPhotonAge(i)*second); // G4cout <<"G4FissionLibrary::ApplyYourself: energy of prompt photon " << i << " = " << it->GetKineticEnergy()<AddSecondary(it); + theResult.Get()->AddSecondary(it, secID); delete thePhoton; } // G4cout <<"G4FissionLibrary::ApplyYourself: Number of secondaries = "<Getm(); + if ( aTarg.GetIsotope() != nullptr ) iM = aTarg.GetIsotope()->Getm(); G4DynamicParticle* dp = new G4DynamicParticle( aTrack.GetDefinition() , G4ThreeVector(0.,0.,1.) , aTrack.GetKineticEnergy() ); - G4bool lendIsOK = lend->HasData( dp , iZ , iA , iM , aTarg.GetIsotope() , NULL , aTrack.GetMaterial() ); + G4bool lendIsOK = lend->HasData( dp , iZ , iA , iM , aTarg.GetIsotope() , nullptr , aTrack.GetMaterial() ); delete dp; - G4HadronicInteraction* model=NULL; + G4HadronicInteraction* model = nullptr; if ( lendIsOK ) { //G4cout << "LEND is selected" << G4endl; model = lend; @@ -61,5 +63,14 @@ G4HadFinalState * G4LENDorBERTModel::ApplyYourself(const G4HadProjectile& aTrack model = bert; } - return model->ApplyYourself(aTrack,aTarg); + G4HadFinalState* result = model->ApplyYourself(aTrack,aTarg); + + // Assign the creator model ID to the secondaries + if ( result != nullptr ) { + for ( size_t i = 0; i < result->GetNumberOfSecondaries(); ++i ) { + result->GetSecondary( i )->SetCreatorModelID( secID ); + } + } + + return result; } diff --git a/source/processes/hadronic/models/im_r_matrix/README b/source/processes/hadronic/models/im_r_matrix/README deleted file mode 100644 index c90cf08088..0000000000 --- a/source/processes/hadronic/models/im_r_matrix/README +++ /dev/null @@ -1,2 +0,0 @@ -The tuning of resonances can still improve in a iteration on short-lived particles. - diff --git a/source/processes/hadronic/models/inclxx/History b/source/processes/hadronic/models/inclxx/History index bacdfe07c2..5b8b85e839 100644 --- a/source/processes/hadronic/models/inclxx/History +++ b/source/processes/hadronic/models/inclxx/History @@ -15,6 +15,26 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +09 November 2021 - Alberto Ribon (hadr-inclxx-V10-07-06) +------------------------------------------------------- +- G4INCLNuclearPotentialIsospin : improved nuclear potential for + Lambda particles, fixing crashes observed due to unphysical zero + Fermi momentum for these particles. + Changed made by Jean-Christophe David. + +27 October 2021 - Alberto Ribon (hadr-inclxx-V10-07-05) +------------------------------------------------------- +- G4INCLXXInterface : extended to projectile hypernuclei + +15 October 2021 - Jean-Christophe David (hadr-inclxx-V10-07-04) +--------------------------------------------------------------- +- Implementation of hypercluster emission + +04 August 2021 - Alberto Ribon (hadr-inclxx-V10-07-03) +------------------------------------------------------ +- G4INCLXXInterface : set creator model ID for secondaries, using the + new version of G4PhysicsModelCatalog + 16 April 2021 - Ben Morgan (hadr-inclxx-V10-07-02) -------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLBinaryCollisionAvatar.hh b/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLBinaryCollisionAvatar.hh index 6b5dc1e2a6..b7125e7f00 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLBinaryCollisionAvatar.hh +++ b/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLBinaryCollisionAvatar.hh @@ -79,10 +79,10 @@ namespace G4INCL { static G4double getCutNNSquared() { return cutNNSquared; } - /// \brief Get the bias + /// \brief Get the global bias factor static G4double getBias() { return bias; } - /// \brief Set the bias + /// \brief Set the global bias factor static void setBias(const G4double b) { bias=b; } private: diff --git a/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLCluster.hh b/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLCluster.hh index 31fff3d45f..244fc08e46 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLCluster.hh +++ b/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLCluster.hh @@ -69,7 +69,7 @@ namespace G4INCL { theS = S; setINCLMass(); if(createParticleSampler) - theParticleSampler = new ParticleSampler(A,Z); + theParticleSampler = new ParticleSampler(A,Z,S); } /** @@ -105,7 +105,7 @@ namespace G4INCL { particles.push_back(new Particle(**p)); } if(rhs.theParticleSampler) - theParticleSampler = new ParticleSampler(rhs.theA,rhs.theZ); + theParticleSampler = new ParticleSampler(rhs.theA,rhs.theZ,rhs.theS); else theParticleSampler = NULL; } diff --git a/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLParticleSampler.hh b/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLParticleSampler.hh index dcad3d810e..84e9e03267 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLParticleSampler.hh +++ b/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLParticleSampler.hh @@ -59,7 +59,7 @@ namespace G4INCL { * \param A the mass number * \param Z the charge number */ - ParticleSampler(const G4int A, const G4int Z); + ParticleSampler(const G4int A, const G4int Z, const G4int S); /// \brief Destructor ~ParticleSampler(); @@ -124,6 +124,9 @@ namespace G4INCL { /// \brief Charge number const G4int theZ; + /// \brief Strangeness number + const G4int theS; + /// \brief Array of pointers to the r-space CDF table InterpolationTable const *theRCDFTable[UnknownParticle]; diff --git a/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLStore.hh b/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLStore.hh index ba97e761fd..fc92cf92c3 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLStore.hh +++ b/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLStore.hh @@ -233,7 +233,7 @@ namespace G4INCL { ParticleList spectators; for(ParticleIter p=outgoing.begin(), e=outgoing.end(); p!=e; ++p) { if((*p)->isProjectileSpectator()) { -// assert((*p)->isNucleon()); +// assert((*p)->isNucleon() || (*p)->isLambda()); spectators.push_back(*p); // add them to the list we will return } } diff --git a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLBinaryCollisionAvatar.cc b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLBinaryCollisionAvatar.cc index c04a9d256e..6703e3d12c 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLBinaryCollisionAvatar.cc +++ b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLBinaryCollisionAvatar.cc @@ -184,7 +184,7 @@ namespace G4INCL { /** Bias apply for this reaction in order to get the same * ParticleBias for all stange particles. - * Can be reduced after because of the watchdog. + * Can be reduced after because of the safeguard. */ G4double bias_apply = 1.; if(bias != 1.) bias_apply = Particle::getBiasFromVector(Particle::MergeVectorBias(particle1,particle2)) * bias; diff --git a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLCascade.cc b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLCascade.cc index 5238cb8322..98212aafb1 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLCascade.cc +++ b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLCascade.cc @@ -148,10 +148,13 @@ namespace G4INCL { // Fill in the global information theGlobalInfo.At = theConfig->getTargetA(); theGlobalInfo.Zt = theConfig->getTargetZ(); + theGlobalInfo.St = theConfig->getTargetS(); const ParticleSpecies theSpecies = theConfig->getProjectileSpecies(); theGlobalInfo.Ap = theSpecies.theA; theGlobalInfo.Zp = theSpecies.theZ; + theGlobalInfo.Sp = theSpecies.theS; theGlobalInfo.Ep = theConfig->getProjectileKineticEnergy(); + theGlobalInfo.biasFactor = theConfig->getBias(); #endif fixedImpactParameter = theConfig->getImpactParameter(); diff --git a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLEtaNElasticChannel.cc b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLEtaNElasticChannel.cc index a945badb07..87365e7cc7 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLEtaNElasticChannel.cc +++ b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLEtaNElasticChannel.cc @@ -86,7 +86,7 @@ namespace G4INCL { // From Kamano else { - const G4double pi=std::acos(-1.0); + const G4double pi=std::acos(-1.0); G4double x1; G4double u1; G4double fteta; diff --git a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLNuclearDensityFactory.cc b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLNuclearDensityFactory.cc index 1d3833d075..1cb40bfafe 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLNuclearDensityFactory.cc +++ b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLNuclearDensityFactory.cc @@ -86,7 +86,7 @@ namespace G4INCL { const std::map::const_iterator mapEntry = rpCorrelationTableCache->find(nuclideID); if(mapEntry == rpCorrelationTableCache->end()) { - INCL_DEBUG("Creating r-p correlation function for " << ((t==Proton) ? "protons" : "neutrons") << " in A=" << A << ", Z=" << Z << std::endl); + INCL_DEBUG("Creating r-p correlation function for " << ((t==Proton) ? "protons" : ((t==Neutron) ? "neutrons" : "lambdas")) << " in A=" << A << ", Z=" << Z << std::endl); IFunction1D *rpCorrelationFunction; if(A > 19) { diff --git a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLNuclearPotentialIsospin.cc b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLNuclearPotentialIsospin.cc index 01d2de8ea8..54985b669e 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLNuclearPotentialIsospin.cc +++ b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLNuclearPotentialIsospin.cc @@ -105,9 +105,11 @@ namespace G4INCL { vSigmaZero = -16.; // hypothesis: same potential for each sigma vSigmaPlus = -16.; - vLambda = 28.; + vLambda = 30.; const G4double asy = (theA - 2.*theZ)/theA; - if(asy>0.11)vLambda = 56.549-678.73*asy+4905.35*std::pow(asy,2.)-9789.1*std::pow(asy,3.); // Jose Luis Rodriguez-Sanchez et al., Rapid Communication PRC + // Jose Luis Rodriguez-Sanchez et al., Rapid Communication PRC 98, 021602 (2018) + if (asy > 0.236) vLambda = 40.91; + else if (asy > 0.133) vLambda = 56.549 - 678.73*asy + 4905.35*asy*asy - 9789.1*asy*asy*asy; const G4double theLambdaSeparationEnergy = ParticleTable::getSeparationEnergy(Lambda,theA,theZ); diff --git a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLOmegaNToPiNChannel.cc b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLOmegaNToPiNChannel.cc index 9ae3503e9a..3c98e79a59 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLOmegaNToPiNChannel.cc +++ b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLOmegaNToPiNChannel.cc @@ -96,7 +96,7 @@ namespace G4INCL { omega->setEnergy(ee); G4double pn=std::sqrt(en*en-mn*mn); /*// test isotropy - const G4double pi=std::acos(-1.0); + const G4double pi=std::acos(-1.0); G4double x1; G4double u1; G4double fteta; diff --git a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLParticleSampler.cc b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLParticleSampler.cc index 05bf37d033..4613b02247 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLParticleSampler.cc +++ b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLParticleSampler.cc @@ -48,11 +48,12 @@ namespace G4INCL { - ParticleSampler::ParticleSampler(const G4int A, const G4int Z) : + ParticleSampler::ParticleSampler(const G4int A, const G4int Z, const G4int S) : sampleOneProton(&ParticleSampler::sampleOneParticleWithoutRPCorrelation), sampleOneNeutron(&ParticleSampler::sampleOneParticleWithoutRPCorrelation), theA(A), theZ(Z), + theS(S), theDensity(NULL), thePotential(NULL) { @@ -61,6 +62,7 @@ namespace G4INCL { std::fill(rpCorrelationCoefficient, rpCorrelationCoefficient + UnknownParticle, 1.); rpCorrelationCoefficient[Proton] = ParticleTable::getRPCorrelationCoefficient(Proton); rpCorrelationCoefficient[Neutron] = ParticleTable::getRPCorrelationCoefficient(Neutron); + rpCorrelationCoefficient[Lambda] = ParticleTable::getRPCorrelationCoefficient(Lambda); } ParticleSampler::~ParticleSampler() { @@ -108,6 +110,8 @@ namespace G4INCL { thePCDFTable[Proton] = NuclearDensityFactory::createPCDFTable(Proton, theA, theZ); theRCDFTable[Neutron] = NuclearDensityFactory::createRCDFTable(Neutron, theA, theZ); thePCDFTable[Neutron] = NuclearDensityFactory::createPCDFTable(Neutron, theA, theZ); + theRCDFTable[Lambda] = NuclearDensityFactory::createRCDFTable(Lambda, theA, theZ); + thePCDFTable[Lambda] = NuclearDensityFactory::createPCDFTable(Lambda, theA, theZ); } theList.resize(theA); @@ -116,9 +120,10 @@ namespace G4INCL { ParticleSamplerMethod sampleOneParticle = sampleOneProton; for(G4int i = 0; i < theA; ++i) { if(i == theZ) { // Nucleons [Z..A-1] are neutrons - type = Neutron; - sampleOneParticle = sampleOneNeutron; + type = Lambda; + sampleOneParticle = sampleOneNeutron; // hypothesis: Lambdas follow the same rules than neutrons } + if(i == theZ - theS) type = Neutron; Particle *p = (this->*sampleOneParticle)(type); p->setPosition(position + p->getPosition()); theList[i] = p; diff --git a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLPiNToEtaChannel.cc b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLPiNToEtaChannel.cc index 2fe3e42530..380faa2c4a 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLPiNToEtaChannel.cc +++ b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLPiNToEtaChannel.cc @@ -89,7 +89,7 @@ namespace G4INCL { G4double ECM=G4INCL::KinematicsUtils::totalEnergyInCM(particle1,particle2); - const G4double pi=std::acos(-1.0); + const G4double pi=std::acos(-1.0); G4double x1; G4double u1; G4double fteta; diff --git a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLProjectileRemnant.cc b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLProjectileRemnant.cc index 878ead0a04..460c1aed4d 100644 --- a/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLProjectileRemnant.cc +++ b/source/processes/hadronic/models/inclxx/incl_physics/src/G4INCLProjectileRemnant.cc @@ -74,14 +74,15 @@ namespace G4INCL { } void ProjectileRemnant::removeParticle(Particle * const p, const G4double theProjectileCorrection) { -// assert(p->isNucleon()); +// assert(p->isNucleon() || p->isLambda()); INCL_DEBUG("The following Particle is about to be removed from the ProjectileRemnant:" << '\n' << p->print() << "theProjectileCorrection=" << theProjectileCorrection << '\n'); - // Update A, Z, momentum and energy of the projectile remnant + // Update A, Z, S, momentum, and energy of the projectile remnant theA -= p->getA(); theZ -= p->getZ(); + theS -= p->getS(); ThreeVector const &oldMomentum = p->getMomentum(); const G4double oldEnergy = p->getEnergy(); diff --git a/source/processes/hadronic/models/inclxx/interface/include/G4INCLXXInterface.hh b/source/processes/hadronic/models/inclxx/interface/include/G4INCLXXInterface.hh index 614211ca73..bd8a082457 100644 --- a/source/processes/hadronic/models/inclxx/interface/include/G4INCLXXInterface.hh +++ b/source/processes/hadronic/models/inclxx/interface/include/G4INCLXXInterface.hh @@ -153,10 +153,10 @@ private: G4double toINCLKineticEnergy(G4HadProjectile const &) const; /// \brief Convert an INCL particle to a G4DynamicParticle - G4DynamicParticle *toG4Particle(G4int A, G4int Z, G4int PDGCode , G4double kinE, G4double px, G4double py, G4double pz) const; + G4DynamicParticle *toG4Particle(G4int A, G4int Z, G4int S, G4int PDGCode , G4double kinE, G4double px, G4double py, G4double pz) const; - /// \brief Convert A and Z to a G4ParticleDefinition - G4ParticleDefinition *toG4ParticleDefinition (G4int A, G4int Z, G4int PDGCode) const; + /// \brief Convert A, Z and S to a G4ParticleDefinition + G4ParticleDefinition *toG4ParticleDefinition (G4int A, G4int Z, G4int S, G4int PDGCode) const; /// \brief Rescale remnant momentum if necessary G4double remnant4MomentumScaling(G4double mass, @@ -184,6 +184,8 @@ private: G4VLevelDensityParameter *theINCLXXLevelDensity; G4FissionProbability *theINCLXXFissionProbability; + + G4int secID; // Creator model ID for the secondaries }; #endif diff --git a/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterface.cc b/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterface.cc index f98072df07..071f24eb10 100644 --- a/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterface.cc +++ b/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterface.cc @@ -55,6 +55,15 @@ #include "G4VEvaporationChannel.hh" #include "G4CompetitiveFission.hh" #include "G4FissionLevelDensityParameterINCLXX.hh" +#include "G4PhysicsModelCatalog.hh" + +#include "G4HyperNucleiProperties.hh" +#include "G4HyperTriton.hh" +#include "G4HyperH4.hh" +#include "G4HyperAlpha.hh" +#include "G4DoubleHyperH4.hh" +#include "G4DoubleHyperDoubleNeutron.hh" +#include "G4HyperHe5.hh" G4INCLXXInterface::G4INCLXXInterface(G4VPreCompoundModel * const aPreCompound) : G4VIntraNuclearTransportModel(G4INCLXXInterfaceStore::GetInstance()->getINCLXXVersionName()), @@ -66,7 +75,8 @@ G4INCLXXInterface::G4INCLXXInterface(G4VPreCompoundModel * const aPreCompound) : complainedAboutPreCompound(false), theIonTable(G4IonTable::GetIonTable()), theINCLXXLevelDensity(NULL), - theINCLXXFissionProbability(NULL) + theINCLXXFissionProbability(NULL), + secID(-1) { if(!thePreCompoundModel) { G4HadronicInteraction* p = @@ -111,6 +121,7 @@ G4INCLXXInterface::G4INCLXXInterface(G4VPreCompoundModel * const aPreCompound) : theBackupModel = new G4BinaryLightIonReaction; theBackupModelNucleon = new G4BinaryCascade; + secID = G4PhysicsModelCatalog::GetModelID( "model_INCLXXCascade" ); } G4INCLXXInterface::~G4INCLXXInterface() @@ -166,11 +177,13 @@ G4HadFinalState* G4INCLXXInterface::ApplyYourself(const G4HadProjectile& aTrack, const G4bool isIonTrack = trackDefinition->GetParticleType()==G4GenericIon::GenericIon()->GetParticleType(); const G4int trackA = trackDefinition->GetAtomicMass(); const G4int trackZ = (G4int) trackDefinition->GetPDGCharge(); + const G4int trackL = trackDefinition->GetNumberOfLambdasInHypernucleus(); const G4int nucleusA = theNucleus.GetA_asInt(); const G4int nucleusZ = theNucleus.GetZ_asInt(); // For reactions induced by weird projectiles (e.g. He2), bail out - if((isIonTrack && (trackZ<=0 || trackA<=trackZ)) || (nucleusA>1 && (nucleusZ<=0 || nucleusA<=nucleusZ))) { + if((isIonTrack && ((trackZ<=0 && trackL==0) || trackA<=trackZ)) || + (nucleusA>1 && (nucleusZ<=0 || nucleusA<=nucleusZ))) { theResult.Clear(); theResult.SetStatusChange(isAlive); theResult.SetEnergyChange(aTrack.GetKineticEnergy()); @@ -246,10 +259,10 @@ G4HadFinalState* G4INCLXXInterface::ApplyYourself(const G4HadProjectile& aTrack, if(oldProjectileDef != 0 && oldTargetDef != 0) { const G4int newTargetA = oldProjectileDef->GetAtomicMass(); const G4int newTargetZ = oldProjectileDef->GetAtomicNumber(); - + const G4int newTargetL = oldProjectileDef->GetNumberOfLambdasInHypernucleus(); if(newTargetA > 0 && newTargetZ > 0) { // This should give us the same energy per nucleon - theTargetNucleus = new G4Nucleus(newTargetA, newTargetZ); + theTargetNucleus = new G4Nucleus(newTargetA, newTargetZ, newTargetL); toInverseKinematics = new G4LorentzRotation(goodTrack4Momentum.boostVector()); G4LorentzVector theProjectile4Momentum(0.0, 0.0, 0.0, theNucleusMass); G4DynamicParticle swappedProjectileParticle(oldTargetDef, (*toInverseKinematics) * theProjectile4Momentum); @@ -311,8 +324,11 @@ G4HadFinalState* G4INCLXXInterface::ApplyYourself(const G4HadProjectile& aTrack, // The INCL model will be created at the first use theINCLModel = G4INCLXXInterfaceStore::GetInstance()->GetINCLModel(); - const G4INCL::EventInfo eventInfo = theINCLModel->processEvent(theSpecies, kineticEnergy, theTargetNucleus->GetA_asInt(), theTargetNucleus->GetZ_asInt(),0); - // eventIsOK = !eventInfo.transparent && nTries < maxTries; + const G4INCL::EventInfo eventInfo = theINCLModel->processEvent(theSpecies, kineticEnergy, + theTargetNucleus->GetA_asInt(), + theTargetNucleus->GetZ_asInt(), + -theTargetNucleus->GetL()); // Strangeness has opposite sign + // eventIsOK = !eventInfo.transparent && nTries < maxTries; // of the number of Lambdas eventIsOK = !eventInfo.transparent; if(eventIsOK) { @@ -326,14 +342,15 @@ G4HadFinalState* G4INCLXXInterface::ApplyYourself(const G4HadProjectile& aTrack, for(G4int i = 0; i < eventInfo.nParticles; ++i) { G4int A = eventInfo.A[i]; - G4int Z = eventInfo.Z[i]; - G4int PDGCode = eventInfo.PDGCode[i]; - // G4cout <<"INCL particle A = " << A << " Z = " << Z << G4endl; + G4int Z = eventInfo.Z[i]; + G4int S = eventInfo.S[i]; // Strangeness + G4int PDGCode = eventInfo.PDGCode[i]; + // G4cout <<"INCL particle A = " << A << " Z = " << Z << " S = " << S << G4endl; G4double kinE = eventInfo.EKin[i]; G4double px = eventInfo.px[i]; G4double py = eventInfo.py[i]; G4double pz = eventInfo.pz[i]; - G4DynamicParticle *p = toG4Particle(A, Z, PDGCode, kinE, px, py, pz); + G4DynamicParticle *p = toG4Particle(A, Z, S, PDGCode, kinE, px, py, pz); if(p != 0) { G4LorentzVector momentum = p->Get4Momentum(); @@ -348,7 +365,7 @@ G4HadFinalState* G4INCLXXInterface::ApplyYourself(const G4HadProjectile& aTrack, // Set the four-momentum of the reaction products p->Set4Momentum(momentum); fourMomentumOut += momentum; - theResult.AddSecondary(p); + theResult.AddSecondary(p, secID); } else { G4String message = "the model produced a particle that couldn't be converted to Geant4 particle."; @@ -359,7 +376,8 @@ G4HadFinalState* G4INCLXXInterface::ApplyYourself(const G4HadProjectile& aTrack, for(G4int i = 0; i < eventInfo.nRemnants; ++i) { const G4int A = eventInfo.ARem[i]; const G4int Z = eventInfo.ZRem[i]; - // G4cout <<"INCL particle A = " << A << " Z = " << Z << G4endl; + const G4int S = eventInfo.SRem[i]; + // G4cout <<"INCL particle A = " << A << " Z = " << Z << " S= " << S << G4endl; const G4double kinE = eventInfo.EKinRem[i]; const G4double px = eventInfo.pxRem[i]; const G4double py = eventInfo.pyRem[i]; @@ -370,23 +388,27 @@ G4HadFinalState* G4INCLXXInterface::ApplyYourself(const G4HadProjectile& aTrack, eventInfo.jzRem[i]*hbar_Planck ); const G4double excitationE = eventInfo.EStarRem[i]; - const G4double nuclearMass = G4NucleiProperties::GetNuclearMass(A, Z) + excitationE; - const G4double scaling = remnant4MomentumScaling(nuclearMass, - kinE, - px, py, pz); + G4double nuclearMass = excitationE; + if ( S == 0 ) { + nuclearMass += G4NucleiProperties::GetNuclearMass(A, Z); + } else { + // Assumed that the opposite of the strangeness of the remnant gives the number of Lambdas inside it + nuclearMass += G4HyperNucleiProperties::GetNuclearMass(A, Z, std::abs(S)); + } + const G4double scaling = remnant4MomentumScaling(nuclearMass, kinE, px, py, pz); G4LorentzVector fourMomentum(scaling * px, scaling * py, scaling * pz, nuclearMass + kinE); if(std::abs(scaling - 1.0) > 0.01) { std::stringstream ss; ss << "momentum scaling = " << scaling - << "\n Lorentz vector = " << fourMomentum - << ")\n A = " << A << ", Z = " << Z - << "\n E* = " << excitationE << ", nuclearMass = " << nuclearMass - << "\n remnant i=" << i << ", nRemnants=" << eventInfo.nRemnants - << "\n Reaction was: " << aTrack.GetKineticEnergy()/MeV - << "-MeV " << trackDefinition->GetParticleName() << " + " - << theIonTable->GetIonName(theNucleus.GetZ_asInt(), theNucleus.GetA_asInt(), 0) - << ", in " << (inverseKinematics ? "inverse" : "direct") << " kinematics."; + << "\n Lorentz vector = " << fourMomentum + << ")\n A = " << A << ", Z = " << Z << ", S = " << S + << "\n E* = " << excitationE << ", nuclearMass = " << nuclearMass + << "\n remnant i=" << i << ", nRemnants=" << eventInfo.nRemnants + << "\n Reaction was: " << aTrack.GetKineticEnergy()/MeV + << "-MeV " << trackDefinition->GetParticleName() << " + " + << theIonTable->GetIonName(theNucleus.GetZ_asInt(), theNucleus.GetA_asInt(), 0) + << ", in " << (inverseKinematics ? "inverse" : "direct") << " kinematics."; theInterfaceStore->EmitWarning(ss.str()); } @@ -400,8 +422,9 @@ G4HadFinalState* G4INCLXXInterface::ApplyYourself(const G4HadProjectile& aTrack, } fourMomentumOut += fourMomentum; - G4Fragment remnant(A, Z, fourMomentum); + G4Fragment remnant(A, Z, std::abs(S), fourMomentum); // Assumed that -strangeness gives the number of Lambdas remnant.SetAngularMomentum(spin); + remnant.SetCreatorModelID(secID); if(dumpRemnantInfo) { G4cerr << "G4INCLXX_DUMP_REMNANT: " << remnant << " spin: " << spin << G4endl; } @@ -478,7 +501,7 @@ G4HadFinalState* G4INCLXXInterface::ApplyYourself(const G4HadProjectile& aTrack, const G4ParticleDefinition *def = (*fragment)->GetDefinition(); if(def != 0) { G4DynamicParticle *theFragment = new G4DynamicParticle(def, (*fragment)->GetMomentum()); - theResult.AddSecondary(theFragment); + theResult.AddSecondary(theFragment, (*fragment)->GetCreatorModelID()); } } @@ -537,41 +560,46 @@ G4double G4INCLXXInterface::toINCLKineticEnergy(G4HadProjectile const &aTrack) c return aTrack.GetKineticEnergy(); } -G4ParticleDefinition *G4INCLXXInterface::toG4ParticleDefinition(G4int A, G4int Z, G4int PDGCode) const { - if(PDGCode == 2212) return G4Proton::Proton(); - else if(PDGCode == 2112) return G4Neutron::Neutron(); - else if(PDGCode == 211) return G4PionPlus::PionPlus(); - else if(PDGCode == 111) return G4PionZero::PionZero(); - else if(PDGCode == -211) return G4PionMinus::PionMinus(); +G4ParticleDefinition *G4INCLXXInterface::toG4ParticleDefinition(G4int A, G4int Z, G4int S, G4int PDGCode) const { + if (PDGCode == 2212) { return G4Proton::Proton(); + } else if(PDGCode == 2112) { return G4Neutron::Neutron(); + } else if(PDGCode == 211) { return G4PionPlus::PionPlus(); + } else if(PDGCode == 111) { return G4PionZero::PionZero(); + } else if(PDGCode == -211) { return G4PionMinus::PionMinus(); - else if(PDGCode == 221) return G4Eta::Eta(); - else if(PDGCode == 22) return G4Gamma::Gamma(); + } else if(PDGCode == 221) { return G4Eta::Eta(); + } else if(PDGCode == 22) { return G4Gamma::Gamma(); - else if(PDGCode == 3122) return G4Lambda::Lambda(); - else if(PDGCode == 3222) return G4SigmaPlus::SigmaPlus(); - else if(PDGCode == 3212) return G4SigmaZero::SigmaZero(); - else if(PDGCode == 3112) return G4SigmaMinus::SigmaMinus(); - else if(PDGCode == 321) return G4KaonPlus::KaonPlus(); - else if(PDGCode == -321) return G4KaonMinus::KaonMinus(); - else if(PDGCode == 130) return G4KaonZeroLong::KaonZeroLong(); - else if(PDGCode == 310) return G4KaonZeroShort::KaonZeroShort(); + } else if(PDGCode == 3122) { return G4Lambda::Lambda(); + } else if(PDGCode == 3222) { return G4SigmaPlus::SigmaPlus(); + } else if(PDGCode == 3212) { return G4SigmaZero::SigmaZero(); + } else if(PDGCode == 3112) { return G4SigmaMinus::SigmaMinus(); + } else if(PDGCode == 321) { return G4KaonPlus::KaonPlus(); + } else if(PDGCode == -321) { return G4KaonMinus::KaonMinus(); + } else if(PDGCode == 130) { return G4KaonZeroLong::KaonZeroLong(); + } else if(PDGCode == 310) { return G4KaonZeroShort::KaonZeroShort(); - else if(PDGCode == 1002) return G4Deuteron::Deuteron(); - else if(PDGCode == 1003) return G4Triton::Triton(); - else if(PDGCode == 2003) return G4He3::He3(); - else if(PDGCode == 2004) return G4Alpha::Alpha(); - else if(A > 0 && Z > 0 && A > Z) { // Returns ground state ion definition. No hyper-nucleus allows in Geant4 + } else if(PDGCode == 1002) { return G4Deuteron::Deuteron(); + } else if(PDGCode == 1003) { return G4Triton::Triton(); + } else if(PDGCode == 2003) { return G4He3::He3(); + } else if(PDGCode == 2004) { return G4Alpha::Alpha(); + } else if(S != 0) { // Assumed that -S gives the number of Lambdas + if (A == 3 && Z == 1 && S == -1 ) return G4HyperTriton::Definition(); + if (A == 4 && Z == 1 && S == -1 ) return G4HyperH4::Definition(); + if (A == 4 && Z == 2 && S == -1 ) return G4HyperAlpha::Definition(); + if (A == 4 && Z == 1 && S == -2 ) return G4DoubleHyperH4::Definition(); + if (A == 4 && Z == 0 && S == -2 ) return G4DoubleHyperDoubleNeutron::Definition(); + if (A == 5 && Z == 2 && S == -1 ) return G4HyperHe5::Definition(); + } else if(A > 0 && Z > 0 && A > Z) { // Returns ground state ion definition. return theIonTable->GetIon(Z, A, 0); - } else { // Error, unrecognized particle - return 0; } + return 0; // Error, unrecognized particle } -G4DynamicParticle *G4INCLXXInterface::toG4Particle(G4int A, G4int Z, G4int PDGCode, - G4double kinE, - G4double px, - G4double py, G4double pz) const { - const G4ParticleDefinition *def = toG4ParticleDefinition(A, Z, PDGCode); +G4DynamicParticle *G4INCLXXInterface::toG4Particle(G4int A, G4int Z, G4int S, G4int PDGCode, + G4double kinE, G4double px, + G4double py, G4double pz) const { + const G4ParticleDefinition *def = toG4ParticleDefinition(A, Z, S, PDGCode); if(def == 0) { // Check if we have a valid particle definition return 0; } diff --git a/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterfaceMessenger.cc b/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterfaceMessenger.cc index 00ec8735b2..c9c85c4ea7 100644 --- a/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterfaceMessenger.cc +++ b/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterfaceMessenger.cc @@ -113,7 +113,7 @@ G4INCLXXInterfaceMessenger::~G4INCLXXInterfaceMessenger() { void G4INCLXXInterfaceMessenger::SetNewValue(G4UIcommand *command, G4String newValues) { if(command==accurateNucleusCmd) { - newValues.toLower(); + G4StrUtil::to_lower(newValues); if(newValues=="projectile") { theINCLXXInterfaceStore->SetAccurateProjectile(true); } else if(newValues=="target") { diff --git a/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterfaceStore.cc b/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterfaceStore.cc index fe8ef99ff5..c5fe7512c2 100644 --- a/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterfaceStore.cc +++ b/source/processes/hadronic/models/inclxx/interface/src/G4INCLXXInterfaceStore.cc @@ -181,7 +181,7 @@ void G4INCLXXInterfaceStore::EmitWarning(const G4String &message) { void G4INCLXXInterfaceStore::EmitBigWarning(const G4String &message) const { // Disable the printing when global hadronic verbosity is zero // (which can be issued via the UI command "/process/had/verbose 0" ) - if ( G4HadronicParameters::Instance()->GetVerboseLevel() == 0 ) return; + if ( G4HadronicParameters::Instance()->GetVerboseLevel() == 0 ) return; G4cout << G4endl << "================================================================================" diff --git a/source/processes/hadronic/models/inclxx/utils/include/G4INCLGlobalInfo.hh b/source/processes/hadronic/models/inclxx/utils/include/G4INCLGlobalInfo.hh index 383fb1ce47..2943c7be0e 100644 --- a/source/processes/hadronic/models/inclxx/utils/include/G4INCLGlobalInfo.hh +++ b/source/processes/hadronic/models/inclxx/utils/include/G4INCLGlobalInfo.hh @@ -75,6 +75,7 @@ namespace G4INCL { Ep((Float_t)0.0), nShots(0), geometricCrossSection((Float_t)0.0), + biasFactor((Float_t)0.0), nTransparents(0), reactionCrossSection((Float_t)0.0), errorReactionCrossSection((Float_t)0.0), @@ -123,6 +124,8 @@ namespace G4INCL { Int_t nShots; /** \brief Geometric cross section */ Float_t geometricCrossSection; + /** \brief Bias factor */ + Float_t biasFactor; /** \brief Number of transparent shots */ Int_t nTransparents; /** \brief Calculated reaction cross section */ diff --git a/source/processes/hadronic/models/inclxx/utils/include/G4INCLParticleTable.hh b/source/processes/hadronic/models/inclxx/utils/include/G4INCLParticleTable.hh index 82eb5546ba..64bd8ef5be 100644 --- a/source/processes/hadronic/models/inclxx/utils/include/G4INCLParticleTable.hh +++ b/source/processes/hadronic/models/inclxx/utils/include/G4INCLParticleTable.hh @@ -103,6 +103,7 @@ namespace G4INCL { /// \brief Get the native INCL name of the ion std::string getName(const G4int A, const G4int Z); + std::string getName(const G4int A, const G4int Z, const G4int S); /// \brief Get the short INCL name of the ion std::string getShortName(const G4int A, const G4int Z); diff --git a/source/processes/hadronic/models/inclxx/utils/include/G4INCLRandom.hh b/source/processes/hadronic/models/inclxx/utils/include/G4INCLRandom.hh index ac40fa1e9b..59902677bd 100644 --- a/source/processes/hadronic/models/inclxx/utils/include/G4INCLRandom.hh +++ b/source/processes/hadronic/models/inclxx/utils/include/G4INCLRandom.hh @@ -177,8 +177,11 @@ namespace G4INCL { } result_type operator()() const { -// return shootInteger(max()); - return G4RandFlat::shootInt(INT_MAX); + #ifdef INCLXX_IN_GEANT4_MODE + return G4RandFlat::shootInt(INT_MAX); + #else + return shootInteger(max()); + #endif } }; diff --git a/source/processes/hadronic/models/inclxx/utils/src/G4INCLHFB.cc b/source/processes/hadronic/models/inclxx/utils/src/G4INCLHFB.cc index 428f055dcc..5ae4ddbcb2 100644 --- a/source/processes/hadronic/models/inclxx/utils/src/G4INCLHFB.cc +++ b/source/processes/hadronic/models/inclxx/utils/src/G4INCLHFB.cc @@ -52,10 +52,17 @@ namespace G4INCL { namespace { - G4ThreadLocal G4double radiusP[TableZSize][TableASize]; - G4ThreadLocal G4double radiusN[TableZSize][TableASize]; - G4ThreadLocal G4double diffusenessP[TableZSize][TableASize]; - G4ThreadLocal G4double diffusenessN[TableZSize][TableASize]; + #ifdef INCLXX_IN_GEANT4_MODE + G4ThreadLocal G4double radiusP[TableZSize][TableASize]; + G4ThreadLocal G4double radiusN[TableZSize][TableASize]; + G4ThreadLocal G4double diffusenessP[TableZSize][TableASize]; + G4ThreadLocal G4double diffusenessN[TableZSize][TableASize]; + #else + G4double radiusP[TableZSize][TableASize]; + G4double radiusN[TableZSize][TableASize]; + G4double diffusenessP[TableZSize][TableASize]; + G4double diffusenessN[TableZSize][TableASize]; + #endif void cleanTable(){ for(G4int i=0;i> theS; + if(parsingStream.fail()) { + // Couldn't parse the strange charge section + // Setting unknown particle species + (*this) = ParticleSpecies(UnknownParticle); + return; + } + theS *= (-1); + beginSecondSection = std::find_if(pS.begin()+1, pS.end(), predicate) - pS.begin(); // predicate == std::isdigit(G4int) in this case + firstSection = pS.substr(0, beginSecondSection); + secondSection = pS.substr(beginSecondSection, endFirstSection); + } // Parse the sections G4bool success; @@ -348,86 +364,86 @@ namespace G4INCL { G4int ParticleSpecies::getPDGCode() const { switch (theType) { - case Proton: - return 2212; - break; - case Neutron: - return 2112; - break; - case DeltaPlusPlus: - return 2224; - break; - case DeltaPlus: - return 2214; - break; - case DeltaZero: - return 2114; - break; - case DeltaMinus: - return 1114; - break; - case PiPlus: - return 211; - break; - case PiZero: - return 111; - break; - case PiMinus: - return -211; - break; - case Eta: - return 221; - break; - case Omega: - return 223; - break; - case EtaPrime: - return 331; - break; - case Photon: - return 22; - break; - case Lambda: - return 3122; - break; - case SigmaPlus: - return 3222; - break; - case SigmaZero: - return 3212; - break; - case SigmaMinus: - return 3112; - break; - case KPlus: - return 321; - break; - case KZero: - return 311; - break; - case KZeroBar: - return -311; - break; - case KShort: - return 310; - break; - case KLong: - return 130; - break; - case KMinus: - return -321; - break; - case Composite: - if(theA == 1 && theZ == 1 && theS == 0) return 2212; - else if(theA == 1 && theZ == 0 && theS == 0) return 2112; - else if(theA == 1 && theZ == 0 && theS == -1) return 3122; - else return theA+theZ*1000-theS*1e6; // Here -theS because hyper-nucleus -> theS < 0 - break; - default: - INCL_ERROR("ParticleSpecies::getPDGCode: Unknown particle type." << '\n'); - return 0; - break; - } + case Proton: + return 2212; + break; + case Neutron: + return 2112; + break; + case DeltaPlusPlus: + return 2224; + break; + case DeltaPlus: + return 2214; + break; + case DeltaZero: + return 2114; + break; + case DeltaMinus: + return 1114; + break; + case PiPlus: + return 211; + break; + case PiZero: + return 111; + break; + case PiMinus: + return -211; + break; + case Eta: + return 221; + break; + case Omega: + return 223; + break; + case EtaPrime: + return 331; + break; + case Photon: + return 22; + break; + case Lambda: + return 3122; + break; + case SigmaPlus: + return 3222; + break; + case SigmaZero: + return 3212; + break; + case SigmaMinus: + return 3112; + break; + case KPlus: + return 321; + break; + case KZero: + return 311; + break; + case KZeroBar: + return -311; + break; + case KShort: + return 310; + break; + case KLong: + return 130; + break; + case KMinus: + return -321; + break; + case Composite: + if(theA == 1 && theZ == 1 && theS == 0) return 2212; + else if(theA == 1 && theZ == 0 && theS == 0) return 2112; + else if(theA == 1 && theZ == 0 && theS == -1) return 3122; + else return theA+theZ*1000-theS*1e6; // Here -theS because hyper-nucleus -> theS < 0 + break; + default: + INCL_ERROR("ParticleSpecies::getPDGCode: Unknown particle type." << '\n'); + return 0; + break; + } } } diff --git a/source/processes/hadronic/models/inclxx/utils/src/G4INCLParticleTable.cc b/source/processes/hadronic/models/inclxx/utils/src/G4INCLParticleTable.cc index e51f3362a3..a00712ae40 100644 --- a/source/processes/hadronic/models/inclxx/utils/src/G4INCLParticleTable.cc +++ b/source/processes/hadronic/models/inclxx/utils/src/G4INCLParticleTable.cc @@ -529,15 +529,19 @@ namespace G4INCL { } std::string getShortName(const ParticleSpecies &s) { - if(s.theType==Composite) + if(s.theType==Composite && s.theS == 0) return getShortName(s.theA,s.theZ); + else if(s.theType==Composite) + return getName(s.theA,s.theZ,s.theS); else return getShortName(s.theType); } std::string getName(const ParticleSpecies &s) { - if(s.theType==Composite) + if(s.theType==Composite && s.theS == 0) return getName(s.theA,s.theZ); + else if(s.theType==Composite) + return getName(s.theA,s.theZ,s.theS); else return getName(s.theType); } @@ -548,6 +552,17 @@ namespace G4INCL { return stream.str(); } + std::string getName(const G4int A, const G4int Z, const G4int S) { + std::stringstream stream; + if(S >= 0) // S < 0 for hypernuclei + return getName(A, Z); + else if(S == -1) + stream << getElementName(Z) << "-" << A << "_" << "Lambda"; + else + stream << getElementName(Z) << "-" << A << "_" << S << "-Lambda"; + return stream.str(); + } + std::string getShortName(const G4int A, const G4int Z) { std::stringstream stream; stream << getElementName(Z); @@ -1206,7 +1221,7 @@ namespace G4INCL { } G4double getRPCorrelationCoefficient(const ParticleType t) { -// assert(t==Proton || t==Neutron); +// assert(t==Proton || t==Neutron || t==Lambda); return rpCorrelationCoefficient[t]; } diff --git a/source/processes/hadronic/models/lend/History b/source/processes/hadronic/models/lend/History index 10e0efe0c4..acca486a62 100644 --- a/source/processes/hadronic/models/lend/History +++ b/source/processes/hadronic/models/lend/History @@ -14,6 +14,12 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +4 August 2021 Alberto Ribon (hadr-lend-V10-07-02) +------------------------------------------------- +- G4LENDModel, G4LENDCapture, G4LENDElastic, G4LENDFission, G4LENDInelastic : + set creator model ID for secondaries, using the new version of + G4PhysicsModelCatalog + 16 April 2021 Ben Morgan (hadr-lend-V10-07-01) -------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/lend/include/G4LENDModel.hh b/source/processes/hadronic/models/lend/include/G4LENDModel.hh index 73e781492a..65b09d0d0f 100644 --- a/source/processes/hadronic/models/lend/include/G4LENDModel.hh +++ b/source/processes/hadronic/models/lend/include/G4LENDModel.hh @@ -83,6 +83,8 @@ class G4LENDModel : public G4HadronicInteraction G4ParticleDefinition* proj; G4LENDManager* lend_manager; std::map< G4int , G4LENDUsedTarget* > usedTarget_map; + + G4int secID; // Creator model ID for the secondaries created by this model }; #endif diff --git a/source/processes/hadronic/models/lend/src/G4LENDCapture.cc b/source/processes/hadronic/models/lend/src/G4LENDCapture.cc index 65e2c57f4b..c6dc09c5af 100644 --- a/source/processes/hadronic/models/lend/src/G4LENDCapture.cc +++ b/source/processes/hadronic/models/lend/src/G4LENDCapture.cc @@ -119,7 +119,7 @@ G4HadFinalState * G4LENDCapture::ApplyYourself(const G4HadProjectile& aTrack, G4 } */ - theResult->AddSecondary( theSec ); + theResult->AddSecondary( theSec, secID ); } } else @@ -150,7 +150,7 @@ G4HadFinalState * G4LENDCapture::ApplyYourself(const G4HadProjectile& aTrack, G4 theSec->SetDefinition( G4IonTable::GetIonTable()->GetIon( (*it)->GetZ_asInt() , (*it)->GetA_asInt() ) ); theSec->Set4Momentum( (*it)->GetMomentum() ); } - theResult->AddSecondary( theSec ); + theResult->AddSecondary( theSec, secID ); } delete products_from_PE; } @@ -160,7 +160,7 @@ G4HadFinalState * G4LENDCapture::ApplyYourself(const G4HadProjectile& aTrack, G4 G4DynamicParticle* residual = new G4DynamicParticle; residual->SetDefinition( G4IonTable::GetIonTable()->GetIon( iZ + ipZ , iA + ipA ) ); residual->SetMomentum( -p*MeV ); - theResult->AddSecondary( residual ); + theResult->AddSecondary( residual, secID ); } delete products; diff --git a/source/processes/hadronic/models/lend/src/G4LENDElastic.cc b/source/processes/hadronic/models/lend/src/G4LENDElastic.cc index 8e819d50b8..7726d984b0 100644 --- a/source/processes/hadronic/models/lend/src/G4LENDElastic.cc +++ b/source/processes/hadronic/models/lend/src/G4LENDElastic.cc @@ -142,7 +142,7 @@ G4HadFinalState * G4LENDElastic::ApplyYourself(const G4HadProjectile& aTrack, G4 theRecoil->SetDefinition( target_pd ); theRecoil->SetMomentum( theTarget.GetMomentum() ); - theResult->AddSecondary( theRecoil ); + theResult->AddSecondary( theRecoil, secID ); return theResult; diff --git a/source/processes/hadronic/models/lend/src/G4LENDFission.cc b/source/processes/hadronic/models/lend/src/G4LENDFission.cc index 01a1eeb664..1973f7bbbd 100644 --- a/source/processes/hadronic/models/lend/src/G4LENDFission.cc +++ b/source/processes/hadronic/models/lend/src/G4LENDFission.cc @@ -84,7 +84,7 @@ G4HadFinalState * G4LENDFission::ApplyYourself(const G4HadProjectile& aTrack, G4 theSec->SetMomentum( G4ThreeVector( (*products)[j].px*MeV , (*products)[j].py*MeV , (*products)[j].pz*MeV ) ); //G4cout << theSec->GetDefinition()->GetParticleName() << G4endl; - theResult->AddSecondary( theSec ); + theResult->AddSecondary( theSec, secID ); //Set time for delayed neutrons //Current implementation is a little tricky, if ( (*products)[j].birthTimeSec != 0 ) { diff --git a/source/processes/hadronic/models/lend/src/G4LENDInelastic.cc b/source/processes/hadronic/models/lend/src/G4LENDInelastic.cc index 2a5849d0fc..8b31ee747e 100644 --- a/source/processes/hadronic/models/lend/src/G4LENDInelastic.cc +++ b/source/processes/hadronic/models/lend/src/G4LENDInelastic.cc @@ -215,7 +215,7 @@ G4HadFinalState* G4LENDInelastic::ApplyYourself(const G4HadProjectile& aTrack, Psum += momentum; theSec->SetMomentum(momentum); // theResult->AddSecondary(theSec); - theParticleChange.AddSecondary(theSec); + theParticleChange.AddSecondary(theSec, secID); } G4int productM(0); @@ -234,7 +234,7 @@ G4HadFinalState* G4LENDInelastic::ApplyYourself(const G4HadProjectile& aTrack, Psum += momentum; theSec->SetMomentum(momentum); // theResult->AddSecondary(theSec); - theParticleChange.AddSecondary(theSec); + theParticleChange.AddSecondary(theSec, secID); } // Create heavy fragment if necessary to try to balance A, Z @@ -254,7 +254,7 @@ G4HadFinalState* G4LENDInelastic::ApplyYourself(const G4HadProjectile& aTrack, } theSec->SetMomentum(projMom - Psum); // theResult->AddSecondary(theSec); - theParticleChange.AddSecondary(theSec); + theParticleChange.AddSecondary(theSec, secID); } } // loop OK diff --git a/source/processes/hadronic/models/lend/src/G4LENDModel.cc b/source/processes/hadronic/models/lend/src/G4LENDModel.cc index 584a7c7d53..34c41a1e31 100644 --- a/source/processes/hadronic/models/lend/src/G4LENDModel.cc +++ b/source/processes/hadronic/models/lend/src/G4LENDModel.cc @@ -41,11 +41,12 @@ #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" #include "G4NistManager.hh" +#include "G4PhysicsModelCatalog.hh" double MyRNG(void*) { return G4Random::getTheEngine()->flat(); } G4LENDModel::G4LENDModel( G4String name ) -:G4HadronicInteraction( name ) + :G4HadronicInteraction( name ), secID(-1) { proj = NULL; //will be set in an inherited class @@ -62,6 +63,7 @@ G4LENDModel::G4LENDModel( G4String name ) lend_manager = G4LENDManager::GetInstance(); + secID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); } G4LENDModel::~G4LENDModel() diff --git a/source/processes/hadronic/models/lepto_nuclear/History b/source/processes/hadronic/models/lepto_nuclear/History index ca5cc17607..6157a50243 100644 --- a/source/processes/hadronic/models/lepto_nuclear/History +++ b/source/processes/hadronic/models/lepto_nuclear/History @@ -14,6 +14,17 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +04 August 2021 A. Ribon (hadr-lepnuc-V10-07-05) +-------------------------------------------------- +- G4ElectroVDNuclearModel, G4MuonVDNuclearModel, + G4NeutrinoElectronCcModel, G4NeutrinoNucleusModel, + G4ANuElNucleusCcModel, G4ANuElNucleusNcModel, + G4ANuMuNucleusCcModel, G4ANuMuNucleusNcModel, + G4NuElNucleusCcModel, G4NuElNucleusNcModel, + G4NuMuNucleusCcModel, G4NuMuNucleusNcModel : + set creator model ID for the secondaries, using the new version + of G4PhysicsModelCatalog + 12 May 2021 V. Grichine (hadr-lepnuc-V10-07-04) -------------------------------------------------- - Bug fixed in G4NeutrinoNucleusModel.cc, calls for QE ratio of muon/electron (anti-)neutrino updated diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4ANuElNucleusCcModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4ANuElNucleusCcModel.hh index 3bafb61a95..a8372542b8 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4ANuElNucleusCcModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4ANuElNucleusCcModel.hh @@ -56,7 +56,7 @@ class G4ANuElNucleusCcModel : public G4NeutrinoNucleusModel // G4HadronicIn { public: - G4ANuElNucleusCcModel(const G4String& name = "NuMuNucleCcModel"); + G4ANuElNucleusCcModel(const G4String& name = "ANuElNuclCcModel"); virtual ~G4ANuElNucleusCcModel(); diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4ANuElNucleusNcModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4ANuElNucleusNcModel.hh index 99b20fcb39..729fbee0f6 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4ANuElNucleusNcModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4ANuElNucleusNcModel.hh @@ -61,7 +61,7 @@ class G4ANuElNucleusNcModel : public G4NeutrinoNucleusModel { public: - G4ANuElNucleusNcModel(const G4String& name = "NuMuNuclNcModel"); + G4ANuElNucleusNcModel(const G4String& name = "ANuElNuclNcModel"); virtual ~G4ANuElNucleusNcModel(); diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4ANuMuNucleusCcModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4ANuMuNucleusCcModel.hh index a330ab7a60..508a79e24c 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4ANuMuNucleusCcModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4ANuMuNucleusCcModel.hh @@ -56,7 +56,7 @@ class G4ANuMuNucleusCcModel : public G4NeutrinoNucleusModel // G4HadronicIn { public: - G4ANuMuNucleusCcModel(const G4String& name = "ANuMuNucleCcModel"); + G4ANuMuNucleusCcModel(const G4String& name = "ANuMuNuclCcModel"); virtual ~G4ANuMuNucleusCcModel(); diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4ElectroVDNuclearModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4ElectroVDNuclearModel.hh index c81cc28d70..580aaa0c89 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4ElectroVDNuclearModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4ElectroVDNuclearModel.hh @@ -77,6 +77,8 @@ class G4ElectroVDNuclearModel : public G4HadronicInteraction G4LundStringFragmentation* theFragmentation; G4ExcitedStringDecay* theStringDecay; G4CascadeInterface* bert; + + G4int secID; // Creator model ID for the secondaries created by this model }; #endif diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4MuonVDNuclearModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4MuonVDNuclearModel.hh index 0ef2566bcf..690687c243 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4MuonVDNuclearModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4MuonVDNuclearModel.hh @@ -90,6 +90,8 @@ private: G4LundStringFragmentation* theFragmentation; G4ExcitedStringDecay* theStringDecay; G4CascadeInterface* bert; + + G4int secID; // Creator model ID for the secondaries created by this model }; #endif diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4NeutrinoElectronCcModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4NeutrinoElectronCcModel.hh index e2d357a8cf..8b68ef0bf4 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4NeutrinoElectronCcModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4NeutrinoElectronCcModel.hh @@ -50,7 +50,7 @@ class G4NeutrinoElectronCcModel : public G4HadronicInteraction { public: - G4NeutrinoElectronCcModel(const G4String& name = "nu-e-elastic"); + G4NeutrinoElectronCcModel(const G4String& name = "nu-e-inelastic"); virtual ~G4NeutrinoElectronCcModel(); @@ -86,6 +86,7 @@ private: G4double fSin2tW; // sin^2theta_Weinberg G4double fCutEnergy; // minimal recoil electron energy detected + G4int secID; // Creator model ID for the secondaries created by this model }; diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4NeutrinoNucleusModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4NeutrinoNucleusModel.hh index 0fd414fe2e..0ac315b541 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4NeutrinoNucleusModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4NeutrinoNucleusModel.hh @@ -180,9 +180,10 @@ protected: G4PreCompoundModel* fPreCompound; G4ExcitationHandler* fDeExcitation; - G4Nucleus* fRecoil; + G4int fSecID; // Creator model ID for the secondaries created by this model + static const G4int fResNumber; static const G4double fResMass[6]; // [fResNumber]; diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4NuElNucleusCcModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4NuElNucleusCcModel.hh index b97672eea3..3aacf8c2fc 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4NuElNucleusCcModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4NuElNucleusCcModel.hh @@ -56,7 +56,7 @@ class G4NuElNucleusCcModel : public G4NeutrinoNucleusModel // G4HadronicInt { public: - G4NuElNucleusCcModel(const G4String& name = "NuMuNucleCcModel"); + G4NuElNucleusCcModel(const G4String& name = "NuElNuclCcModel"); virtual ~G4NuElNucleusCcModel(); diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4NuElNucleusNcModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4NuElNucleusNcModel.hh index 449a82d883..cc6aaf4086 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4NuElNucleusNcModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4NuElNucleusNcModel.hh @@ -61,7 +61,7 @@ class G4NuElNucleusNcModel : public G4NeutrinoNucleusModel { public: - G4NuElNucleusNcModel(const G4String& name = "NuMuNuclNcModel"); + G4NuElNucleusNcModel(const G4String& name = "NuElNuclNcModel"); virtual ~G4NuElNucleusNcModel(); diff --git a/source/processes/hadronic/models/lepto_nuclear/include/G4NuMuNucleusCcModel.hh b/source/processes/hadronic/models/lepto_nuclear/include/G4NuMuNucleusCcModel.hh index 0384742953..d615d57567 100644 --- a/source/processes/hadronic/models/lepto_nuclear/include/G4NuMuNucleusCcModel.hh +++ b/source/processes/hadronic/models/lepto_nuclear/include/G4NuMuNucleusCcModel.hh @@ -56,7 +56,7 @@ class G4NuMuNucleusCcModel : public G4NeutrinoNucleusModel // G4HadronicInt { public: - G4NuMuNucleusCcModel(const G4String& name = "NuMuNucleCcModel"); + G4NuMuNucleusCcModel(const G4String& name = "NuMuNuclCcModel"); virtual ~G4NuMuNucleusCcModel(); diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4ANuElNucleusCcModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4ANuElNucleusCcModel.cc index e65a8ea791..1c127a2fa1 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4ANuElNucleusCcModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4ANuElNucleusCcModel.cc @@ -355,7 +355,7 @@ G4HadFinalState* G4ANuElNucleusCcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); return &theParticleChange; } @@ -393,7 +393,7 @@ G4HadFinalState* G4ANuElNucleusCcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); } // hadron part diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4ANuElNucleusNcModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4ANuElNucleusNcModel.cc index 21b0890d57..846039b952 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4ANuElNucleusNcModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4ANuElNucleusNcModel.cc @@ -333,7 +333,7 @@ G4HadFinalState* G4ANuElNucleusNcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); return &theParticleChange; } @@ -365,7 +365,7 @@ G4HadFinalState* G4ANuElNucleusNcModel::ApplyYourself( aLept = new G4DynamicParticle( theNuE, lv2 ); - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); } // hadron part diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4ANuMuNucleusCcModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4ANuMuNucleusCcModel.cc index de658c973d..281ec1488b 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4ANuMuNucleusCcModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4ANuMuNucleusCcModel.cc @@ -352,7 +352,7 @@ G4HadFinalState* G4ANuMuNucleusCcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); return &theParticleChange; } @@ -390,7 +390,7 @@ G4HadFinalState* G4ANuMuNucleusCcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); } // hadron part diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4ANuMuNucleusNcModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4ANuMuNucleusNcModel.cc index ccd18d76d5..a436d46edf 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4ANuMuNucleusNcModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4ANuMuNucleusNcModel.cc @@ -333,7 +333,7 @@ G4HadFinalState* G4ANuMuNucleusNcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); return &theParticleChange; } @@ -365,7 +365,7 @@ G4HadFinalState* G4ANuMuNucleusNcModel::ApplyYourself( aLept = new G4DynamicParticle( theANuMu, lv2 ); - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); } // hadron part diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4ElectroVDNuclearModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4ElectroVDNuclearModel.cc index ff4eb2e438..13ec05f8f1 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4ElectroVDNuclearModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4ElectroVDNuclearModel.cc @@ -58,10 +58,11 @@ #include "G4HadFinalState.hh" #include "G4HadronicInteractionRegistry.hh" +#include "G4PhysicsModelCatalog.hh" G4ElectroVDNuclearModel::G4ElectroVDNuclearModel() : G4HadronicInteraction("G4ElectroVDNuclearModel"), - leptonKE(0.0), photonEnergy(0.0), photonQ2(0.0) + leptonKE(0.0), photonEnergy(0.0), photonQ2(0.0), secID(-1) { SetMinEnergy(0.0); SetMaxEnergy(1*PeV); @@ -92,6 +93,9 @@ G4ElectroVDNuclearModel::G4ElectroVDNuclearModel() // Build Bertini model bert = new G4CascadeInterface(); + + // Creator model ID + secID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); } G4ElectroVDNuclearModel::~G4ElectroVDNuclearModel() @@ -227,6 +231,11 @@ G4ElectroVDNuclearModel::CalculateHadronicVertex(G4DynamicParticle* incident, delete incident; + // Assign the creator model ID to the secondaries + for ( size_t i = 0; i < hfs->GetNumberOfSecondaries(); ++i ) { + hfs->GetSecondary( i )->SetCreatorModelID( secID ); + } + // Copy secondaries from sub-model to model theParticleChange.AddSecondaries(hfs); } diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4MuonVDNuclearModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4MuonVDNuclearModel.cc index 95ee3d7bfe..188da694c3 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4MuonVDNuclearModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4MuonVDNuclearModel.cc @@ -53,6 +53,7 @@ #include "G4ElementData.hh" #include "G4Physics2DVector.hh" #include "G4Pow.hh" +#include "G4PhysicsModelCatalog.hh" const G4int G4MuonVDNuclearModel::zdat[] = {1, 4, 13, 29, 92}; const G4double G4MuonVDNuclearModel::adat[] = {1.01,9.01,26.98,63.55,238.03}; @@ -104,6 +105,9 @@ G4MuonVDNuclearModel::G4MuonVDNuclearModel() // Build Bertini cascade bert = new G4CascadeInterface(); + + // Creator model ID + secID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); } G4MuonVDNuclearModel::~G4MuonVDNuclearModel() @@ -297,6 +301,11 @@ G4MuonVDNuclearModel::CalculateHadronicVertex(G4DynamicParticle* incident, delete incident; + // Assign the creator model ID to the secondaries + for ( size_t i = 0; i < hfs->GetNumberOfSecondaries(); ++i ) { + hfs->GetSecondary( i )->SetCreatorModelID( secID ); + } + // Copy secondaries from sub-model to model theParticleChange.AddSecondaries(hfs); } diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4NeutrinoElectronCcModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4NeutrinoElectronCcModel.cc index 07618bbf34..e2231d8994 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4NeutrinoElectronCcModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4NeutrinoElectronCcModel.cc @@ -45,6 +45,7 @@ #include "G4MuonMinus.hh" #include "G4TauMinus.hh" #include "G4HadronicParameters.hh" +#include "G4PhysicsModelCatalog.hh" using namespace std; using namespace CLHEP; @@ -74,6 +75,8 @@ G4NeutrinoElectronCcModel::G4NeutrinoElectronCcModel(const G4String& name) fCutEnergy = 0.; // default value + // Creator model ID + secID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); } @@ -192,8 +195,8 @@ G4HadFinalState* G4NeutrinoElectronCcModel::ApplyYourself( { aLept = new G4DynamicParticle( theTauMinus, lvt2 ); } - if(aNu) { theParticleChange.AddSecondary( aNu ); } - if(aLept) { theParticleChange.AddSecondary( aLept ); } + if(aNu) { theParticleChange.AddSecondary( aNu, secID ); } + if(aLept) { theParticleChange.AddSecondary( aLept, secID ); } G4int Z = targetNucleus.GetZ_asInt(); Z *= 1; diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4NeutrinoNucleusModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4NeutrinoNucleusModel.cc index 42f6b7a314..6fd8551e3f 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4NeutrinoNucleusModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4NeutrinoNucleusModel.cc @@ -72,6 +72,7 @@ #include "G4MuonPlus.hh" #include "G4Nucleus.hh" #include "G4LorentzVector.hh" +#include "G4PhysicsModelCatalog.hh" using namespace std; using namespace CLHEP; @@ -107,7 +108,7 @@ G4double G4NeutrinoNucleusModel::fNuMuQdistrKR[50][51][50] = {{{1.0}}}; /////////////////////////////////////////// G4NeutrinoNucleusModel::G4NeutrinoNucleusModel(const G4String& name) - : G4HadronicInteraction(name) + : G4HadronicInteraction(name), fSecID(-1) { SetMinEnergy( 0.0*GeV ); SetMaxEnergy( 100.*TeV ); @@ -180,7 +181,9 @@ G4NeutrinoNucleusModel::G4NeutrinoNucleusModel(const G4String& name) fPDGencoding = 0; // unphysical as default fRecoil = nullptr; - + + // Creator model ID + fSecID = G4PhysicsModelCatalog::GetModelID( "model_" + GetModelName() ); } @@ -416,7 +419,7 @@ void G4NeutrinoNucleusModel::FinalMeson( G4LorentzVector & lvM, G4int, G4int pdg { G4ParticleDefinition* pd2 = G4ParticleTable::GetParticleTable()->FindParticle(pdg); G4DynamicParticle* dp2 = new G4DynamicParticle( pd2, lvM); - theParticleChange.AddSecondary( dp2 ); + theParticleChange.AddSecondary( dp2, fSecID ); } else // meson resonances { @@ -435,7 +438,7 @@ void G4NeutrinoNucleusModel::FinalMeson( G4LorentzVector & lvM, G4int, G4int pdg // G4cout<<" "<GetDefinition()->GetParticleName()<<", "<Get4Momentum()<operator[](i); } delete ddktv; @@ -511,7 +514,7 @@ void G4NeutrinoNucleusModel::FinalBarion( G4LorentzVector & lvB, G4int, G4int pd { G4ParticleDefinition* pd2 = G4ParticleTable::GetParticleTable()->FindParticle(pdg); G4DynamicParticle* dp2 = new G4DynamicParticle( pd2, lvN); - theParticleChange.AddSecondary( dp2 ); + theParticleChange.AddSecondary( dp2, fSecID ); } else // delta resonances @@ -530,7 +533,7 @@ void G4NeutrinoNucleusModel::FinalBarion( G4LorentzVector & lvB, G4int, G4int pd // G4cout<<" "<GetDefinition()->GetParticleName()<<", "<Get4Momentum()<operator[](i); } delete ddktv; @@ -582,7 +585,7 @@ void G4NeutrinoNucleusModel::RecoilDeexcitation( G4Fragment& fragment) { theParticleChange.AddSecondary(new G4DynamicParticle( (*iter)->GetDefinition(), (*iter)->GetTotalEnergy(), - (*iter)->GetMomentum() ) ); + (*iter)->GetMomentum() ), fSecID ); // delete prod; } // delete products; @@ -675,7 +678,7 @@ void G4NeutrinoNucleusModel::CoherentPion( G4LorentzVector & lvP, G4int pdgP, G4 G4ParticleDefinition* pd2 = G4ParticleTable::GetParticleTable()->FindParticle(pdg); G4DynamicParticle* dp2 = new G4DynamicParticle( pd2, lvN); - theParticleChange.AddSecondary( dp2 ); // coherent pion + theParticleChange.AddSecondary( dp2, fSecID ); // coherent pion // recoil nucleus @@ -708,7 +711,7 @@ void G4NeutrinoNucleusModel::CoherentPion( G4LorentzVector & lvP, G4int pdgP, G4 if( eTkin > eTh ) { G4DynamicParticle * aSec = new G4DynamicParticle( G4Proton::Proton(), lvTarg); - theParticleChange.AddSecondary(aSec); + theParticleChange.AddSecondary(aSec, fSecID); } else theParticleChange.SetLocalEnergyDeposit( eTkin ); } diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4NuElNucleusCcModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4NuElNucleusCcModel.cc index 9d8d4733c5..f5c0533c83 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4NuElNucleusCcModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4NuElNucleusCcModel.cc @@ -355,7 +355,7 @@ G4HadFinalState* G4NuElNucleusCcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); return &theParticleChange; } @@ -393,7 +393,7 @@ G4HadFinalState* G4NuElNucleusCcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); } // hadron part diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4NuElNucleusNcModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4NuElNucleusNcModel.cc index 42e875d161..659ad08c3e 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4NuElNucleusNcModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4NuElNucleusNcModel.cc @@ -333,7 +333,7 @@ G4HadFinalState* G4NuElNucleusNcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); return &theParticleChange; } @@ -365,7 +365,7 @@ G4HadFinalState* G4NuElNucleusNcModel::ApplyYourself( aLept = new G4DynamicParticle( theNuE, lv2 ); - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); } // hadron part diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4NuMuNucleusCcModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4NuMuNucleusCcModel.cc index 6806e10e32..cfd8232b8c 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4NuMuNucleusCcModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4NuMuNucleusCcModel.cc @@ -354,7 +354,7 @@ G4HadFinalState* G4NuMuNucleusCcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); return &theParticleChange; } @@ -393,7 +393,7 @@ G4HadFinalState* G4NuMuNucleusCcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); } // hadron part diff --git a/source/processes/hadronic/models/lepto_nuclear/src/G4NuMuNucleusNcModel.cc b/source/processes/hadronic/models/lepto_nuclear/src/G4NuMuNucleusNcModel.cc index 23d078886e..82fd7c88ac 100644 --- a/source/processes/hadronic/models/lepto_nuclear/src/G4NuMuNucleusNcModel.cc +++ b/source/processes/hadronic/models/lepto_nuclear/src/G4NuMuNucleusNcModel.cc @@ -333,7 +333,7 @@ G4HadFinalState* G4NuMuNucleusNcModel::ApplyYourself( theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); return &theParticleChange; } - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); return &theParticleChange; } @@ -365,7 +365,7 @@ G4HadFinalState* G4NuMuNucleusNcModel::ApplyYourself( aLept = new G4DynamicParticle( theNuMu, lv2 ); - theParticleChange.AddSecondary( aLept ); + theParticleChange.AddSecondary( aLept, fSecID ); } // hadron part diff --git a/source/processes/hadronic/models/particle_hp/History b/source/processes/hadronic/models/particle_hp/History index 36013b1e5e..ec50cb7720 100644 --- a/source/processes/hadronic/models/particle_hp/History +++ b/source/processes/hadronic/models/particle_hp/History @@ -14,6 +14,25 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +05 November 2021 Alberto Ribon (hadr-hpp-V10-07-11) +-------------------------------------------------- +Improvements made by Loic Thulliez and Eric Dumonteil (CEA Saclay): +- G4ParticleHPThermalScattering, G4ParticleHPElastic : corrected the + original treatment of the temperature interpolation when computing + the neutron final state, with the temperature interpolation performed + stochastically now. +- G4ParticleHPThermalScatteringNames : extended the list of materials + which can have thermal data libraries. + +22 October 2021 Alberto Ribon (hadr-hpp-V10-07-10) +------------------------------------------------- +- G4ParticleHPLabAngularEnergy : bug-fix made by Emilio Mendoza. + +04 August 2021 Alberto Ribon (hadr-hpp-V10-07-09) +------------------------------------------------- +- (affecting nearly all classes) : set creator model ID for secondaries, + using the new version of G4PhysicsModelCatalog + 23 May 2021 Dennis Wright (hadr-hpp-V10-07-08) ---------------------------------------------- - G4ParticleHPInelasticCompFS:::CompositeApply(): diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2AInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2AInelasticFS.hh index 9f0e5cb7b8..aeee1760c7 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2AInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2AInelasticFS.hh @@ -43,7 +43,7 @@ class G4ParticleHP2AInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP2AInelasticFS(){} + G4ParticleHP2AInelasticFS(); ~G4ParticleHP2AInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2N2AInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2N2AInelasticFS.hh index 0a842b06c8..c3435d444b 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2N2AInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2N2AInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHP2N2AInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP2N2AInelasticFS(){} + G4ParticleHP2N2AInelasticFS(); ~G4ParticleHP2N2AInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NAInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NAInelasticFS.hh index 1d61ce9ad1..3a1f3c2722 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NAInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NAInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHP2NAInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP2NAInelasticFS(){} + G4ParticleHP2NAInelasticFS(); ~G4ParticleHP2NAInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NDInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NDInelasticFS.hh index 283d86cc38..94ea8e9012 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NDInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NDInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHP2NDInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP2NDInelasticFS(){} + G4ParticleHP2NDInelasticFS(); ~G4ParticleHP2NDInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NInelasticFS.hh index 25ffd6b8d8..f1ac4aee32 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHP2NInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP2NInelasticFS(){} + G4ParticleHP2NInelasticFS(); ~G4ParticleHP2NInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NPInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NPInelasticFS.hh index 22b303df03..41102de2cc 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NPInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2NPInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHP2NPInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP2NPInelasticFS(){} + G4ParticleHP2NPInelasticFS(); ~G4ParticleHP2NPInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2PInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2PInelasticFS.hh index a408fd9c22..ba62265578 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2PInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP2PInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHP2PInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP2PInelasticFS(){} + G4ParticleHP2PInelasticFS(); ~G4ParticleHP2PInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3AInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3AInelasticFS.hh index 6b8d71474b..1088b08c2e 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3AInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3AInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHP3AInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP3AInelasticFS(){} + G4ParticleHP3AInelasticFS(); ~G4ParticleHP3AInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NAInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NAInelasticFS.hh index e50797b01e..8e151a0a79 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NAInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NAInelasticFS.hh @@ -43,7 +43,7 @@ class G4ParticleHP3NAInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP3NAInelasticFS(){} + G4ParticleHP3NAInelasticFS(); ~G4ParticleHP3NAInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NInelasticFS.hh index 20b913477e..dc3aa78a94 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NInelasticFS.hh @@ -43,7 +43,7 @@ class G4ParticleHP3NInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP3NInelasticFS(){} + G4ParticleHP3NInelasticFS(); ~G4ParticleHP3NInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NPInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NPInelasticFS.hh index 6e2b77abc7..8ca81a0537 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NPInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP3NPInelasticFS.hh @@ -43,7 +43,7 @@ class G4ParticleHP3NPInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP3NPInelasticFS(){} + G4ParticleHP3NPInelasticFS(); ~G4ParticleHP3NPInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP4NInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP4NInelasticFS.hh index 490852bfd8..fc66f273fb 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHP4NInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHP4NInelasticFS.hh @@ -43,7 +43,7 @@ class G4ParticleHP4NInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHP4NInelasticFS(){} + G4ParticleHP4NInelasticFS(); ~G4ParticleHP4NInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPAInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPAInelasticFS.hh index 2aa93f518c..e0ca0a7d55 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPAInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPAInelasticFS.hh @@ -43,7 +43,7 @@ class G4ParticleHPAInelasticFS : public G4ParticleHPInelasticCompFS { public: - G4ParticleHPAInelasticFS(){} + G4ParticleHPAInelasticFS(); ~G4ParticleHPAInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPCaptureFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPCaptureFS.hh index 1fcf9d5567..be15d8e255 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPCaptureFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPCaptureFS.hh @@ -43,12 +43,7 @@ class G4ParticleHPCaptureFS : public G4ParticleHPFinalState { public: - G4ParticleHPCaptureFS() - { - hasXsec = false; - hasExactMF6 = false; - targetMass = 0; - } + G4ParticleHPCaptureFS(); ~G4ParticleHPCaptureFS() { diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPD2AInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPD2AInelasticFS.hh index e8360532f1..c5d2ab8fa9 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPD2AInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPD2AInelasticFS.hh @@ -38,7 +38,7 @@ class G4ParticleHPD2AInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPD2AInelasticFS(){} + G4ParticleHPD2AInelasticFS(); ~G4ParticleHPD2AInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPDAInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPDAInelasticFS.hh index 639f89e385..cd6b37848e 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPDAInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPDAInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPDAInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPDAInelasticFS(){} + G4ParticleHPDAInelasticFS(); ~G4ParticleHPDAInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPDInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPDInelasticFS.hh index 050d058eea..514c9901bf 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPDInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPDInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPDInelasticFS : public G4ParticleHPInelasticCompFS { public: - G4ParticleHPDInelasticFS(){} + G4ParticleHPDInelasticFS(); ~G4ParticleHPDInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPElastic.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPElastic.hh index cbbe554ce1..c69a3283c1 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPElastic.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPElastic.hh @@ -54,6 +54,7 @@ class G4ParticleHPElastic : public G4HadronicInteraction ~G4ParticleHPElastic(); G4HadFinalState * ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aTargetNucleus); + G4HadFinalState * ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aTargetNucleus, G4bool isFromTSL); virtual const std::pair GetFatalEnergyCheckLevels() const; diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPElasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPElasticFS.hh index 2e87121f50..c0b40322f5 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPElasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPElasticFS.hh @@ -47,17 +47,7 @@ class G4ParticleHPElasticFS : public G4ParticleHPFinalState { public: - G4ParticleHPElasticFS() - { - hasXsec = false; - theCoefficients = 0; - theProbArray = 0; - - repFlag = 0; - tE_of_repFlag3 = 0.0; - targetMass = 0.0; - frameFlag = 0; - } + G4ParticleHPElasticFS(); ~G4ParticleHPElasticFS() { if(theCoefficients!=0) delete theCoefficients; diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPFinalState.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPFinalState.hh index 882588f535..2e577e0962 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPFinalState.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPFinalState.hh @@ -64,6 +64,8 @@ public: theProjectile = G4Neutron::Neutron(); theResult.Put( 0 ); + + secID = -1; } virtual ~G4ParticleHPFinalState() @@ -135,5 +137,6 @@ protected: G4int theNDLDataA; G4int theNDLDataM; + G4int secID; // Creator model ID for the secondaries created by this class or derived ones }; #endif diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPFissionFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPFissionFS.hh index 2fac788cb6..82fc0337d6 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPFissionFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPFissionFS.hh @@ -47,7 +47,7 @@ class G4ParticleHPFissionFS : public G4ParticleHPFinalState { public: - G4ParticleHPFissionFS(){ hasXsec = false; produceFissionFragments = false; } + G4ParticleHPFissionFS(); ~G4ParticleHPFissionFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition* ); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPHe3InelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPHe3InelasticFS.hh index a98a50a2c2..702cc0f138 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPHe3InelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPHe3InelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPHe3InelasticFS : public G4ParticleHPInelasticCompFS { public: - G4ParticleHPHe3InelasticFS(){} + G4ParticleHPHe3InelasticFS(); ~G4ParticleHPHe3InelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN2AInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN2AInelasticFS.hh index d9bc2049a9..1810d4e481 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN2AInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN2AInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPN2AInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPN2AInelasticFS(){} + G4ParticleHPN2AInelasticFS(); ~G4ParticleHPN2AInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN2PInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN2PInelasticFS.hh index 5cf22ee559..d56c2c0f18 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN2PInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN2PInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPN2PInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPN2PInelasticFS(){} + G4ParticleHPN2PInelasticFS(); ~G4ParticleHPN2PInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN3AInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN3AInelasticFS.hh index 89d66ccd06..bc4e0be2cb 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN3AInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPN3AInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPN3AInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPN3AInelasticFS(){} + G4ParticleHPN3AInelasticFS(); ~G4ParticleHPN3AInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNAInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNAInelasticFS.hh index 9e3b944b35..d5f92348b1 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNAInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNAInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPNAInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPNAInelasticFS(){} + G4ParticleHPNAInelasticFS(); ~G4ParticleHPNAInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPND2AInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPND2AInelasticFS.hh index 74f416e416..b23cfa6c78 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPND2AInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPND2AInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPND2AInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPND2AInelasticFS(){} + G4ParticleHPND2AInelasticFS(); ~G4ParticleHPND2AInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNDInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNDInelasticFS.hh index fd91a537b8..5871b65010 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNDInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNDInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPNDInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPNDInelasticFS(){} + G4ParticleHPNDInelasticFS(); ~G4ParticleHPNDInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNHe3InelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNHe3InelasticFS.hh index 479cf82493..84bda822ff 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNHe3InelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNHe3InelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPNHe3InelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPNHe3InelasticFS(){} + G4ParticleHPNHe3InelasticFS(); ~G4ParticleHPNHe3InelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNInelasticFS.hh index cfe47153de..d3c0ec81f4 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPNInelasticFS : public G4ParticleHPInelasticCompFS { public: - G4ParticleHPNInelasticFS(){} + G4ParticleHPNInelasticFS(); ~G4ParticleHPNInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNPAInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNPAInelasticFS.hh index 5f61806aab..af04e525ed 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNPAInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNPAInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPNPAInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPNPAInelasticFS(){} + G4ParticleHPNPAInelasticFS(); ~G4ParticleHPNPAInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNPInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNPInelasticFS.hh index 5600f3f810..ab5b05c41e 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNPInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNPInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPNPInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPNPInelasticFS(){} + G4ParticleHPNPInelasticFS(); ~G4ParticleHPNPInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNT2AInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNT2AInelasticFS.hh index a075e2409e..9ae5c409d1 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNT2AInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNT2AInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPNT2AInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPNT2AInelasticFS(){} + G4ParticleHPNT2AInelasticFS(); ~G4ParticleHPNT2AInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNTInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNTInelasticFS.hh index 438f7e1f3a..77fe9ba6ec 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNTInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNTInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPNTInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPNTInelasticFS(){} + G4ParticleHPNTInelasticFS(); ~G4ParticleHPNTInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNXInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNXInelasticFS.hh index af201346b2..bb454ceaeb 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNXInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPNXInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPNXInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPNXInelasticFS(){} + G4ParticleHPNXInelasticFS(); ~G4ParticleHPNXInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPAInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPAInelasticFS.hh index c21ba2deb2..b39a007160 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPAInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPAInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPPAInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPPAInelasticFS(){} + G4ParticleHPPAInelasticFS(); ~G4ParticleHPPAInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPDInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPDInelasticFS.hh index 327b59091b..48ca68ab20 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPDInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPDInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPPDInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPPDInelasticFS(){} + G4ParticleHPPDInelasticFS(); ~G4ParticleHPPDInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPInelasticFS.hh index c86138147f..ec3968458e 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPPInelasticFS : public G4ParticleHPInelasticCompFS { public: - G4ParticleHPPInelasticFS(){} + G4ParticleHPPInelasticFS(); ~G4ParticleHPPInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPTInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPTInelasticFS.hh index d0efa15143..429cdeed8d 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPTInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPPTInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPPTInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPPTInelasticFS(){} + G4ParticleHPPTInelasticFS(); ~G4ParticleHPPTInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPT2AInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPT2AInelasticFS.hh index 96d2b1d0c3..b2210e0c2a 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPT2AInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPT2AInelasticFS.hh @@ -38,7 +38,7 @@ class G4ParticleHPT2AInelasticFS : public G4ParticleHPInelasticBaseFS { public: - G4ParticleHPT2AInelasticFS(){} + G4ParticleHPT2AInelasticFS(); ~G4ParticleHPT2AInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPTInelasticFS.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPTInelasticFS.hh index b1ab5a2877..cdca0c1c52 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPTInelasticFS.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPTInelasticFS.hh @@ -42,7 +42,7 @@ class G4ParticleHPTInelasticFS : public G4ParticleHPInelasticCompFS { public: - G4ParticleHPTInelasticFS(){} + G4ParticleHPTInelasticFS(); ~G4ParticleHPTInelasticFS(){} void Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition*); G4HadFinalState * ApplyYourself(const G4HadProjectile & theTrack); diff --git a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPThermalScattering.hh b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPThermalScattering.hh index a713bf62f3..83b53c5902 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4ParticleHPThermalScattering.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4ParticleHPThermalScattering.hh @@ -67,6 +67,10 @@ struct E_P_E_isoAng std::vector < G4double > prob; std::vector < E_isoAng* > vE_isoAngle; G4double sum_of_probXdEs; // should be close to 1 + std::vector< G4double > secondary_energy_cdf; + std::vector< G4double > secondary_energy_pdf; + std::vector< G4double > secondary_energy_value; + G4int secondary_energy_cdf_size; E_P_E_isoAng() { energy=0.0; n=0; @@ -122,13 +126,17 @@ class G4ParticleHPThermalScattering : public G4HadronicInteraction G4ParticleHPElastic* theHPElastic; G4double getMu ( E_isoAng* ); + G4double getMu ( G4double rndm1 , G4double rndm2 , E_isoAng* anEPM ); std::pair< G4double , G4double > find_LH ( G4double , std::vector* ); G4double get_linear_interpolated ( G4double , std::pair < G4double , G4double > , std::pair < G4double , G4double > ); E_isoAng create_E_isoAng_from_energy( G4double , std::vector< E_isoAng* >* ); - G4double get_secondary_energy_from_E_P_E_isoAng ( G4double , E_P_E_isoAng* ); + G4double get_secondary_energy_from_E_P_E_isoAng ( G4double random , E_P_E_isoAng* anE_P_E_isoAng ); + + std::pair< G4double, G4double > sample_inelastic_E_mu( G4double pE , std::vector< E_P_E_isoAng* >* vNEP_EPM ); + std::pair< G4double, G4int > sample_inelastic_E( G4double rndm1 , G4double rndm2 , E_P_E_isoAng* anE_P_E_isoAng ); std::pair< G4double , E_isoAng > create_sE_and_EPM_from_pE_and_vE_P_E_isoAng ( G4double , G4double , std::vector < E_P_E_isoAng* >* ); diff --git a/source/processes/hadronic/models/particle_hp/include/G4WendtFissionFragmentGenerator.hh b/source/processes/hadronic/models/particle_hp/include/G4WendtFissionFragmentGenerator.hh index a8ad873785..fd0f0f8db3 100644 --- a/source/processes/hadronic/models/particle_hp/include/G4WendtFissionFragmentGenerator.hh +++ b/source/processes/hadronic/models/particle_hp/include/G4WendtFissionFragmentGenerator.hh @@ -65,5 +65,7 @@ private: G4ParticleHPNames fileNames; G4int Verbosity_; + + G4int secID; // Creator model ID for the fission fragments }; #endif diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2AInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2AInelasticFS.cc index 263a7d05fe..4e7954c700 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2AInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2AInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP2AInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP2AInelasticFS::G4ParticleHP2AInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP2AInelasticFS_F28" ); +} G4HadFinalState * G4ParticleHP2AInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2N2AInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2N2AInelasticFS.cc index 4a82053c5b..0e9cf9c7c1 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2N2AInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2N2AInelasticFS.cc @@ -33,6 +33,12 @@ #include "G4Nucleus.hh" #include "G4Neutron.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP2N2AInelasticFS::G4ParticleHP2N2AInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP2N2AInelasticFS_F12" ); +} G4HadFinalState * G4ParticleHP2N2AInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NAInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NAInelasticFS.cc index 87f0a944f3..1268b5f50f 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NAInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NAInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP2NAInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP2NAInelasticFS::G4ParticleHP2NAInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP2NAInelasticFS_F08" ); +} G4HadFinalState * G4ParticleHP2NAInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NDInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NDInelasticFS.cc index bda25ca87e..a060829e9a 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NDInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NDInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP2NDInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Deuteron.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP2NDInelasticFS::G4ParticleHP2NDInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP2NDInelasticFS_F03" ); +} G4HadFinalState * G4ParticleHP2NDInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NInelasticFS.cc index b9b3b086e3..cdae7c2be9 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP2NInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP2NInelasticFS::G4ParticleHP2NInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP2NInelasticFS_F04" ); +} G4HadFinalState * G4ParticleHP2NInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NPInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NPInelasticFS.cc index 7c4a0c9641..835c02b1a6 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NPInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2NPInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP2NPInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Proton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP2NPInelasticFS::G4ParticleHP2NPInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP2NPInelasticFS_F19" ); +} G4HadFinalState * G4ParticleHP2NPInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2PInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2PInelasticFS.cc index dbafb3e83b..7e97eca3dc 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2PInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP2PInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP2PInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Proton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP2PInelasticFS::G4ParticleHP2PInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP2PInelasticFS_F30" ); +} G4HadFinalState * G4ParticleHP2PInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3AInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3AInelasticFS.cc index 8aa7ef79fa..41ca3e7cd3 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3AInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3AInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP3AInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP3AInelasticFS::G4ParticleHP3AInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP3AInelasticFS_F29" ); +} G4HadFinalState * G4ParticleHP3AInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NAInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NAInelasticFS.cc index 6473053814..3be03b0ba8 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NAInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NAInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP3NAInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP3NAInelasticFS::G4ParticleHP3NAInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP3NAInelasticFS_F09" ); +} G4HadFinalState * G4ParticleHP3NAInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NInelasticFS.cc index 5e24fdc653..0f82d31ab8 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP3NInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP3NInelasticFS::G4ParticleHP3NInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP3NInelasticFS_F05" ); +} G4HadFinalState * G4ParticleHP3NInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NPInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NPInelasticFS.cc index 340f661e92..284d6bf5f0 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NPInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP3NPInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP3NPInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Proton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP3NPInelasticFS::G4ParticleHP3NPInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP3NPInelasticFS_F20" ); +} G4HadFinalState * G4ParticleHP3NPInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP4NInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP4NInelasticFS.cc index fcc16018d8..4d50ab5aaa 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHP4NInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHP4NInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHP4NInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHP4NInelasticFS::G4ParticleHP4NInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHP4NInelasticFS_F18" ); +} G4HadFinalState * G4ParticleHP4NInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPAInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPAInelasticFS.cc index 5dc4eb3496..b225880053 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPAInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPAInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHPAInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPAInelasticFS::G4ParticleHPAInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPAInelasticFS_F27" ); +} void G4ParticleHPAInelasticFS::Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition* projectile) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPCaptureFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPCaptureFS.cc index 20f43e5472..eb04d65346 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPCaptureFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPCaptureFS.cc @@ -46,6 +46,17 @@ #include "G4Fragment.hh" #include "G4IonTable.hh" #include "G4ParticleHPDataUsed.hh" +#include "G4PhysicsModelCatalog.hh" + + +G4ParticleHPCaptureFS::G4ParticleHPCaptureFS() + { + secID = G4PhysicsModelCatalog::GetModelID( "model_NeutronHPCapture" ); + hasXsec = false; + hasExactMF6 = false; + targetMass = 0; + } + G4HadFinalState * G4ParticleHPCaptureFS::ApplyYourself(const G4HadProjectile & theTrack) { @@ -205,7 +216,7 @@ //theOne->SetMomentum(theMomentum); theOne->SetMomentum(aMomentum); - theResult.Get()->AddSecondary(theOne); + theResult.Get()->AddSecondary(theOne, secID); } // Now fill in the gammas. @@ -215,7 +226,7 @@ G4DynamicParticle * theOne = new G4DynamicParticle; theOne->SetDefinition(thePhotons->operator[](i)->GetDefinition()); theOne->SetMomentum(thePhotons->operator[](i)->GetMomentum()); - theResult.Get()->AddSecondary(theOne); + theResult.Get()->AddSecondary(theOne, secID); delete thePhotons->operator[](i); } delete thePhotons; @@ -279,7 +290,7 @@ G4DynamicParticle * theOne = new G4DynamicParticle; theOne->SetDefinition( G4Gamma::Gamma() ); theOne->SetMomentum( tempVector ); - theResult.Get()->AddSecondary(theOne); + theResult.Get()->AddSecondary(theOne, secID); } // Add last photon @@ -289,7 +300,7 @@ G4ThreeVector lastPhoton = -p_photons.vect().unit()*vEPhoton.back(); p_photons += G4LorentzVector( lastPhoton , lastPhoton.mag() ); theOne->SetMomentum( lastPhoton ); - theResult.Get()->AddSecondary(theOne); + theResult.Get()->AddSecondary(theOne, secID); } //Add residual @@ -298,7 +309,7 @@ - p_photons.vect(); theOne->SetDefinition(aRecoil); theOne->SetMomentum( aMomentum ); - theResult.Get()->AddSecondary(theOne); + theResult.Get()->AddSecondary(theOne, secID); } //101203TK END diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPD2AInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPD2AInelasticFS.cc index e7f3bda67b..380a16bac4 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPD2AInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPD2AInelasticFS.cc @@ -33,6 +33,12 @@ #include "G4Nucleus.hh" #include "G4Alpha.hh" #include "G4Deuteron.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPD2AInelasticFS::G4ParticleHPD2AInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPD2AInelasticFS_F32" ); +} G4HadFinalState * G4ParticleHPD2AInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPDAInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPDAInelasticFS.cc index 3d3b76b910..b6d201501a 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPDAInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPDAInelasticFS.cc @@ -33,6 +33,12 @@ #include "G4Nucleus.hh" #include "G4Deuteron.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPDAInelasticFS::G4ParticleHPDAInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPDAInelasticFS_F36" ); +} G4HadFinalState * G4ParticleHPDAInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPDInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPDInelasticFS.cc index 733bda4ea7..2d568b7a45 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPDInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPDInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHPDInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Deuteron.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPDInelasticFS::G4ParticleHPDInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPDInelasticFS_F24" ); +} void G4ParticleHPDInelasticFS::Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition* projectile) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPElastic.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPElastic.cc index 23d24b490d..c4738f9616 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPElastic.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPElastic.cc @@ -37,118 +37,104 @@ #include "G4ParticleHPElasticFS.hh" #include "G4ParticleHPManager.hh" #include "G4Threading.hh" +#include "G4ParticleHPThermalBoost.hh" - G4ParticleHPElastic::G4ParticleHPElastic() - :G4HadronicInteraction("NeutronHPElastic") - ,theElastic(NULL) - ,numEle(0) - { - overrideSuspension = false; -/* - G4ParticleHPElasticFS * theFS = new G4ParticleHPElasticFS; - if(!std::getenv("G4NEUTRONHPDATA")) - throw G4HadronicException(__FILE__, __LINE__, "Please setenv G4NEUTRONHPDATA to point to the neutron cross-section files."); - dirName = std::getenv("G4NEUTRONHPDATA"); - G4String tString = "/Elastic"; - dirName = dirName + tString; -// G4cout <<"G4ParticleHPElastic::G4ParticleHPElastic testit "<::iterator - it = theElastic->begin() ; it != theElastic->end() ; it++ ) { - delete *it; - } - theElastic->clear(); - } - } - } - - #include "G4ParticleHPThermalBoost.hh" - - G4HadFinalState * G4ParticleHPElastic::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aNucleus ) - { - //if ( numEle < (G4int)G4Element::GetNumberOfElements() ) addChannelForNewElement(); +G4ParticleHPElastic::G4ParticleHPElastic() + : G4HadronicInteraction("NeutronHPElastic"), theElastic(nullptr), numEle(0) +{ + overrideSuspension = false; + SetMinEnergy(0.*eV); + SetMaxEnergy(20.*MeV); +} - G4ParticleHPManager::GetInstance()->OpenReactionWhiteBoard(); - const G4Material * theMaterial = aTrack.GetMaterial(); - G4int n = theMaterial->GetNumberOfElements(); - G4int index = theMaterial->GetElement(0)->GetIndex(); - if(n!=1) - { + +G4ParticleHPElastic::~G4ParticleHPElastic() +{ + //the vectror is shared among threads, only master deletes + if ( ! G4Threading::IsWorkerThread() ) { + if ( theElastic != nullptr ) { + for ( std::vector::iterator + it = theElastic->begin() ; it != theElastic->end() ; it++ ) { + delete *it; + } + theElastic->clear(); + } + } +} + + +G4HadFinalState * G4ParticleHPElastic::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aNucleus) +{ + return this->ApplyYourself(aTrack, aNucleus, 0); +} + + +//-------------------------------------------------------- +// New method added by L. Thulliez (CEA-Saclay) 2021/05/04 +//-------------------------------------------------------- +G4HadFinalState * G4ParticleHPElastic::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aNucleus, G4bool isFromTSL) +{ + G4ParticleHPManager::GetInstance()->OpenReactionWhiteBoard(); + const G4Material * theMaterial = aTrack.GetMaterial(); + G4int n = theMaterial->GetNumberOfElements(); + G4int index = theMaterial->GetElement(0)->GetIndex(); + + if ( ! isFromTSL ) { + if ( n != 1 ) { + G4int i; + G4double* xSec = new G4double[n]; + G4double sum=0; + const G4double * NumAtomsPerVolume = theMaterial->GetVecNbOfAtomsPerVolume(); + G4double rWeight; + G4ParticleHPThermalBoost aThermalE; + for ( i = 0; i < n; i++ ) { + index = theMaterial->GetElement(i)->GetIndex(); + rWeight = NumAtomsPerVolume[i]; + xSec[i] = ((*theElastic)[index])->GetXsec(aThermalE.GetThermalEnergy(aTrack, + theMaterial->GetElement(i), + theMaterial->GetTemperature())); + xSec[i] *= rWeight; + sum+=xSec[i]; + } + G4double random = G4UniformRand(); + G4double running = 0; + for ( i = 0; i < n; i++ ) { + running += xSec[i]; + index = theMaterial->GetElement(i)->GetIndex(); + if ( sum == 0 || random <= running/sum ) break; + } + delete [] xSec; + } + } else { G4int i; - G4double* xSec = new G4double[n]; - G4double sum=0; - const G4double * NumAtomsPerVolume = theMaterial->GetVecNbOfAtomsPerVolume(); - G4double rWeight; - G4ParticleHPThermalBoost aThermalE; - for (i=0; iGetElement(i)->GetIndex(); - rWeight = NumAtomsPerVolume[i]; - //xSec[i] = theElastic[index].GetXsec(aThermalE.GetThermalEnergy(aTrack, - xSec[i] = ((*theElastic)[index])->GetXsec(aThermalE.GetThermalEnergy(aTrack, - theMaterial->GetElement(i), - theMaterial->GetTemperature())); - xSec[i] *= rWeight; - sum+=xSec[i]; + if ( n != 1 ) { + for ( i = 0; i < n; i++ ) { + if ( aNucleus.GetZ_asInt() == (G4int)(theMaterial->GetElement(i)->GetZ()) ) { + index = theMaterial->GetElement(i)->GetIndex(); + } + } } - G4double random = G4UniformRand(); - G4double running = 0; - for (i=0; iGetElement(i)->GetIndex(); - //if(random<=running/sum) break; - if( sum == 0 || random <= running/sum ) break; - } - delete [] xSec; - // it is element-wise initialised. - } - //G4HadFinalState* finalState = theElastic[index].ApplyYourself(aTrack); - G4HadFinalState* finalState = ((*theElastic)[index])->ApplyYourself(aTrack); - if (overrideSuspension) finalState->SetStatusChange(isAlive); + } + + G4HadFinalState* finalState = ((*theElastic)[index])->ApplyYourself(aTrack); + if (overrideSuspension) finalState->SetStatusChange(isAlive); + + // Overwrite target parameters + aNucleus.SetParameters(G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargA(),G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargZ()); + const G4Element* target_element = (*G4Element::GetElementTable())[index]; + const G4Isotope* target_isotope=nullptr; + G4int iele = target_element->GetNumberOfIsotopes(); + for ( G4int j = 0 ; j != iele ; j++ ) { + target_isotope=target_element->GetIsotope( j ); + if ( target_isotope->GetN() == G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargA() ) break; + } + aNucleus.SetIsotope( target_isotope ); + + G4ParticleHPManager::GetInstance()->CloseReactionWhiteBoard(); + return finalState; +} - //Overwrite target parameters - aNucleus.SetParameters(G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargA(),G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargZ()); - const G4Element* target_element = (*G4Element::GetElementTable())[index]; - const G4Isotope* target_isotope=NULL; - G4int iele = target_element->GetNumberOfIsotopes(); - for ( G4int j = 0 ; j != iele ; j++ ) { - target_isotope=target_element->GetIsotope( j ); - if ( target_isotope->GetN() == G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargA() ) break; - } - //G4cout << "Target Material of this reaction is " << theMaterial->GetName() << G4endl; - //G4cout << "Target Element of this reaction is " << target_element->GetName() << G4endl; - //G4cout << "Target Isotope of this reaction is " << target_isotope->GetName() << G4endl; - aNucleus.SetIsotope( target_isotope ); - - G4ParticleHPManager::GetInstance()->CloseReactionWhiteBoard(); - return finalState; - } const std::pair G4ParticleHPElastic::GetFatalEnergyCheckLevels() const { @@ -156,30 +142,19 @@ const std::pair G4ParticleHPElastic::GetFatalEnergyCheckLeve return std::pair(10*perCent,DBL_MAX); } -/* -void G4ParticleHPElastic::addChannelForNewElement() -{ - G4ParticleHPElasticFS* theFS = new G4ParticleHPElasticFS; - for ( G4int i = numEle ; i < (G4int)G4Element::GetNumberOfElements() ; i++ ) - { - G4cout << "G4ParticleHPElastic Prepairing Data for the new element of " << (*(G4Element::GetElementTable()))[i]->GetName() << G4endl; - theElastic.push_back( new G4ParticleHPChannel ); - (*theElastic[i]).Init((*(G4Element::GetElementTable()))[i], dirName); - while(!(*theElastic[i]).Register(theFS)) ; - } - delete theFS; - numEle = (G4int)G4Element::GetNumberOfElements(); -} -*/ G4int G4ParticleHPElastic::GetVerboseLevel() const { return G4ParticleHPManager::GetInstance()->GetVerboseLevel(); } + + void G4ParticleHPElastic::SetVerboseLevel( G4int newValue ) { G4ParticleHPManager::GetInstance()->SetVerboseLevel(newValue); } + + void G4ParticleHPElastic::BuildPhysicsTable(const G4ParticleDefinition&) { @@ -189,7 +164,7 @@ void G4ParticleHPElastic::BuildPhysicsTable(const G4ParticleDefinition&) if ( G4Threading::IsMasterThread() ) { - if ( theElastic == NULL ) theElastic = new std::vector; + if ( theElastic == nullptr ) theElastic = new std::vector; if ( numEle == (G4int)G4Element::GetNumberOfElements() ) return; @@ -216,6 +191,8 @@ void G4ParticleHPElastic::BuildPhysicsTable(const G4ParticleDefinition&) } numEle = G4Element::GetNumberOfElements(); } + + void G4ParticleHPElastic::ModelDescription(std::ostream& outFile) const { outFile << "High Precision model based on Evaluated Nuclear Data Files (ENDF) for inelastic reaction of neutrons below 20MeV\n"; diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPElasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPElasticFS.cc index 958a891924..6d7128e52b 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPElasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPElasticFS.cc @@ -50,6 +50,22 @@ #include "G4ParticleHPDataUsed.hh" #include "G4Pow.hh" #include "zlib.h" +#include "G4PhysicsModelCatalog.hh" + + +G4ParticleHPElasticFS::G4ParticleHPElasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_NeutronHPElastic" ); + + hasXsec = false; + theCoefficients = 0; + theProbArray = 0; + + repFlag = 0; + tE_of_repFlag3 = 0.0; + targetMass = 0.0; + frameFlag = 0; +} void G4ParticleHPElasticFS::Init(G4double A, G4double Z, G4int M, G4String& dirName, G4String&, @@ -367,7 +383,7 @@ G4ParticleHPElasticFS::ApplyYourself(const G4HadProjectile& theTrack) theRecoil->SetDefinition(G4IonTable::GetIonTable()->GetIon(static_cast(theBaseZ), static_cast(theBaseA), 0) ); theRecoil->SetMomentum(theTarget.GetMomentum()); - theResult.Get()->AddSecondary(theRecoil); + theResult.Get()->AddSecondary(theRecoil, secID); // Postpone the tracking of the primary neutron theResult.Get()->SetStatusChange(suspend); diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPFinalState.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPFinalState.cc index 190ab59a3d..861cf1a766 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPFinalState.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPFinalState.cc @@ -272,7 +272,7 @@ void G4ParticleHPFinalState::adjust_final_state ( G4LorentzVector init_4p_lab ) nSecondaries += 1; G4DynamicParticle* res = new G4DynamicParticle ( resi_pd , dif_4p.v() ); - theResult.Get()->AddSecondary ( res ); + theResult.Get()->AddSecondary ( res, secID ); p4 = res->Get4Momentum(); if ( slow > p4.beta() ) @@ -293,7 +293,7 @@ void G4ParticleHPFinalState::adjust_final_state ( G4LorentzVector init_4p_lab ) { nSecondaries += 1; G4DynamicParticle* one = new G4DynamicParticle ( oneMoreSec_pd , dif_4p.v() ); - theResult.Get()->AddSecondary ( one ); + theResult.Get()->AddSecondary ( one, secID ); p4 = one->Get4Momentum(); if ( slow > p4.beta() ) { @@ -314,7 +314,7 @@ void G4ParticleHPFinalState::adjust_final_state ( G4LorentzVector init_4p_lab ) { nSecondaries += 1; - theResult.Get()->AddSecondary ( new G4DynamicParticle ( G4Gamma::Gamma() , dif_4p.v() ) ); + theResult.Get()->AddSecondary ( new G4DynamicParticle ( G4Gamma::Gamma() , dif_4p.v() ), secID ); } else @@ -356,8 +356,8 @@ void G4ParticleHPFinalState::adjust_final_state ( G4LorentzVector init_4p_lab ) G4ThreeVector dir( std::sin(std::acos(costh))*std::cos(phi), std::sin(std::acos(costh))*std::sin(phi), costh); - theResult.Get()->AddSecondary ( new G4DynamicParticle ( G4Gamma::Gamma() , e1*dir ) ); - theResult.Get()->AddSecondary ( new G4DynamicParticle ( G4Gamma::Gamma() , -e1*dir ) ); + theResult.Get()->AddSecondary ( new G4DynamicParticle ( G4Gamma::Gamma() , e1*dir ), secID ); + theResult.Get()->AddSecondary ( new G4DynamicParticle ( G4Gamma::Gamma() , -e1*dir ), secID ); } else { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPFissionFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPFissionFS.cc index 7b52b46e53..29140b12c7 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPFissionFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPFissionFS.cc @@ -39,6 +39,16 @@ #include "G4DynamicParticleVector.hh" #include "G4ParticleHPFissionERelease.hh" #include "G4IonTable.hh" +#include "G4PhysicsModelCatalog.hh" + + + G4ParticleHPFissionFS::G4ParticleHPFissionFS() + { + secID = G4PhysicsModelCatalog::GetModelID( "model_NeutronHPFission" ); + hasXsec = false; + produceFissionFragments = false; + } + void G4ParticleHPFissionFS::Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition* projectile ) { @@ -189,7 +199,7 @@ //if(thePhotons!=0) nPhotons = thePhotons->size(); for(i=0; isize(); i++) { - theResult.Get()->AddSecondary(theNeutrons->operator[](i)); + theResult.Get()->AddSecondary(theNeutrons->operator[](i), secID); } delete theNeutrons; @@ -200,7 +210,7 @@ { G4double time = -G4Log(G4UniformRand())/theDecayConstants[i]; time += theTrack.GetGlobalTime(); - theResult.Get()->AddSecondary(theDelayed->operator[](i)); + theResult.Get()->AddSecondary(theDelayed->operator[](i), secID); theResult.Get()->GetSecondary(theResult.Get()->GetNumberOfSecondaries()-1)->SetTime(time); } delete theDelayed; @@ -218,7 +228,7 @@ G4int i0; for(i0=0; i0AddSecondary(theNeutrons->operator[](i0)); + theResult.Get()->AddSecondary(theNeutrons->operator[](i0), secID); } //G4cout << "delayed" << G4endl; @@ -236,7 +246,7 @@ } time += theTrack.GetGlobalTime(); - theResult.Get()->AddSecondary(theNeutrons->operator[](i0)); + theResult.Get()->AddSecondary(theNeutrons->operator[](i0), secID); theResult.Get()->GetSecondary(theResult.Get()->GetNumberOfSecondaries()-1)->SetTime(time); } delete theNeutrons; @@ -249,7 +259,7 @@ nPhotons = thePhotons->size(); for(i=0; iAddSecondary(thePhotons->operator[](i)); + theResult.Get()->AddSecondary(thePhotons->operator[](i), secID); } delete thePhotons; } @@ -306,8 +316,8 @@ G4double EB = ER - EA; G4DynamicParticle* dpA = new G4DynamicParticle( pdA , direction , EA); G4DynamicParticle* dpB = new G4DynamicParticle( pdB , -direction , EB); - theResult.Get()->AddSecondary(dpA); - theResult.Get()->AddSecondary(dpB); + theResult.Get()->AddSecondary(dpA, secID); + theResult.Get()->AddSecondary(dpB, secID); } //TKWORK 120531 END diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPHe3InelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPHe3InelasticFS.cc index bb594bf922..2aa9514da4 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPHe3InelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPHe3InelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHPHe3InelasticFS.hh" #include "G4Nucleus.hh" #include "G4He3.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPHe3InelasticFS::G4ParticleHPHe3InelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPHe3InelasticFS_F26" ); +} void G4ParticleHPHe3InelasticFS::Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition* projectile) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPInelasticBaseFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPInelasticBaseFS.cc index 7bc222c331..49ac7305ac 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPInelasticBaseFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPInelasticBaseFS.cc @@ -286,7 +286,7 @@ void G4ParticleHPInelasticBaseFS::BaseApply(const G4HadProjectile & theTrack, aPart->SetDefinition(aSec->GetDefinition()); aPart->SetMomentum(aSec->GetMomentum()); delete aSec; - theResult.Get()->AddSecondary(aPart); + theResult.Get()->AddSecondary(aPart, secID); #ifdef G4PHPDEBUG if( std::getenv("G4ParticleHPDebug")) G4cout << this << " G4ParticleHPInelasticBaseFS::BaseApply NoFSData add secondary " << aPart->GetParticleDefinition()->GetParticleName() << " E= " << aPart->GetKineticEnergy() << " NSECO " << theResult.Get()->GetNumberOfSecondaries() << G4endl; #endif @@ -614,7 +614,7 @@ void G4ParticleHPInelasticBaseFS::BaseApply(const G4HadProjectile & theTrack, theSec = new G4DynamicParticle; theSec->SetDefinition(tmpHadrons->operator[](i)->GetDefinition()); theSec->SetMomentum(tmpHadrons->operator[](i)->GetMomentum()); - theResult.Get()->AddSecondary(theSec); + theResult.Get()->AddSecondary(theSec, secID); #ifdef G4PHPDEBUG if( std::getenv("G4ParticleHPDebug")) G4cout << this << " G4ParticleHPInelasticBaseFS::BaseApply add secondary2 " << theSec->GetParticleDefinition()->GetParticleName() << " E= " << theSec->GetKineticEnergy() << " NSECO " << theResult.Get()->GetNumberOfSecondaries() << G4endl; #endif @@ -631,7 +631,7 @@ void G4ParticleHPInelasticBaseFS::BaseApply(const G4HadProjectile & theTrack, theSec = new G4DynamicParticle; theSec->SetDefinition(thePhotons->operator[](i)->GetDefinition()); theSec->SetMomentum(thePhotons->operator[](i)->GetMomentum()); - theResult.Get()->AddSecondary(theSec); + theResult.Get()->AddSecondary(theSec, secID); #ifdef G4PHPDEBUG if( std::getenv("G4ParticleHPDebug")) G4cout << this << " G4ParticleHPInelasticBaseFS::BaseApply add secondary3 " << theSec->GetParticleDefinition()->GetParticleName() << " E= " << theSec->GetKineticEnergy() << " NSECO " << theResult.Get()->GetNumberOfSecondaries() << G4endl; #endif diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPInelasticCompFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPInelasticCompFS.cc index d32041c604..2360c125e2 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPInelasticCompFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPInelasticCompFS.cc @@ -698,7 +698,7 @@ void G4ParticleHPInelasticCompFS::CompositeApply(const G4HadProjectile& theTrack theSec = new G4DynamicParticle; theSec->SetDefinition(aHadron.GetDefinition()); theSec->SetMomentum(aHadron.GetMomentum()); - theResult.Get()->AddSecondary(theSec); + theResult.Get()->AddSecondary(theSec, secID); #ifdef G4PHPDEBUG if( std::getenv("G4ParticleHPDebug")) G4cout << this << " G4ParticleHPInelasticCompFS::BaseApply add secondary1 " << theSec->GetParticleDefinition()->GetParticleName() << " E= " << theSec->GetKineticEnergy() << " NSECO " << theResult.Get()->GetNumberOfSecondaries() << G4endl; #endif @@ -726,7 +726,7 @@ void G4ParticleHPInelasticCompFS::CompositeApply(const G4HadProjectile& theTrack theSec = new G4DynamicParticle; theSec->SetDefinition(theResidual.GetDefinition()); theSec->SetMomentum(theResidual.GetMomentum()-totalPhotonMomentum); - theResult.Get()->AddSecondary(theSec); + theResult.Get()->AddSecondary(theSec, secID); #ifdef G4PHPDEBUG if( std::getenv("G4ParticleHPDebug")) G4cout << this << " G4ParticleHPInelasticCompFS::BaseApply add secondary2 " << theSec->GetParticleDefinition()->GetParticleName() << " E= " << theSec->GetKineticEnergy() << " NSECO " << theResult.Get()->GetNumberOfSecondaries() << G4endl; #endif @@ -738,7 +738,7 @@ void G4ParticleHPInelasticCompFS::CompositeApply(const G4HadProjectile& theTrack theSec = new G4DynamicParticle; theSec->SetDefinition(theParticles->operator[](i0)->GetDefinition()); theSec->SetMomentum(theParticles->operator[](i0)->GetMomentum()); - theResult.Get()->AddSecondary(theSec); + theResult.Get()->AddSecondary(theSec, secID); #ifdef G4PHPDEBUG if( std::getenv("G4ParticleHPDebug")) G4cout << this << " G4ParticleHPInelasticCompFS::BaseApply add secondary3 " << theSec->GetParticleDefinition()->GetParticleName() << " E= " << theSec->GetKineticEnergy() << " NSECO " << theResult.Get()->GetNumberOfSecondaries() << G4endl; #endif @@ -766,7 +766,7 @@ void G4ParticleHPInelasticCompFS::CompositeApply(const G4HadProjectile& theTrack theSec = new G4DynamicParticle; theSec->SetDefinition(theResidual.GetDefinition()); theSec->SetMomentum(theResidual.GetMomentum()); - theResult.Get()->AddSecondary(theSec); + theResult.Get()->AddSecondary(theSec, secID); #ifdef G4PHPDEBUG if( std::getenv("G4ParticleHPDebug")) G4cout << this << " G4ParticleHPInelasticCompFS::BaseApply add secondary4 " << theSec->GetParticleDefinition()->GetParticleName() << " E= " << theSec->GetKineticEnergy() << " NSECO " << theResult.Get()->GetNumberOfSecondaries() << G4endl; #endif @@ -783,7 +783,7 @@ void G4ParticleHPInelasticCompFS::CompositeApply(const G4HadProjectile& theTrack theSec->SetDefinition( thePhotons->operator[](i)->GetDefinition() ); //But never cause real effect at least with G4NDL3.13 TK theSec->SetMomentum(thePhotons->operator[](i)->GetMomentum()); - theResult.Get()->AddSecondary(theSec); + theResult.Get()->AddSecondary(theSec, secID); #ifdef G4PHPDEBUG if( std::getenv("G4ParticleHPDebug")) G4cout << this << " G4ParticleHPInelasticCompFS::BaseApply add secondary5 " << theSec->GetParticleDefinition()->GetParticleName() << " E= " << theSec->GetKineticEnergy() << " NSECO " << theResult.Get()->GetNumberOfSecondaries() << G4endl; #endif @@ -895,7 +895,7 @@ G4bool G4ParticleHPInelasticCompFS::use_nresp71_model( const G4ParticleDefinitio for ( G4int j=0; j<4; j++ ) { theProds[j].Lorentz(theProds[j], -1.*theTarget); - theResult.Get()->AddSecondary(new G4DynamicParticle(theProds[j].GetDefinition(), theProds[j].GetMomentum())); + theResult.Get()->AddSecondary(new G4DynamicParticle(theProds[j].GetDefinition(), theProds[j].GetMomentum()), secID); } /*G4double EN0 = theNeutron.GetKineticEnergy(); @@ -936,7 +936,7 @@ G4bool G4ParticleHPInelasticCompFS::use_nresp71_model( const G4ParticleDefinitio { // Returning to the system of reference where the target was in motion. theProds[j].Lorentz(theProds[j], -1.*theTarget); - theResult.Get()->AddSecondary(new G4DynamicParticle(theProds[j].GetDefinition(), theProds[j].GetMomentum())); + theResult.Get()->AddSecondary(new G4DynamicParticle(theProds[j].GetDefinition(), theProds[j].GetMomentum()), secID); } // Killing the primary neutron. diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPLabAngularEnergy.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPLabAngularEnergy.cc index 7ee23a622e..a4e186dd5e 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPLabAngularEnergy.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPLabAngularEnergy.cc @@ -30,6 +30,8 @@ // 080808 Bug fix in serching mu bin and index for theBuff2b by T. Koi // // P. Arce, June-2014 Conversion neutron_hp to particle_hp +// +// E. Mendoza, Nov. 2020 - bug fix // #include "G4ParticleHPLabAngularEnergy.hh" #include "G4PhysicalConstants.hh" @@ -118,98 +120,76 @@ G4ReactionProduct * G4ParticleHPLabAngularEnergy::Sample(G4double anEnergy, G4do it = i; if ( anEnergy < theEnergies[i] ) break; } - //080808 - //if ( it == 0 || it == nEnergies-1 ) // it marks the energy bin - if ( it == 0 ) // it marks the energy bin - { - G4cout << "080808 Something unexpected is happen in G4ParticleHPLabAngularEnergy " << G4endl; - // integrate the prob for each costh, and select theta. - G4double * running = new G4double [nCosTh[it]]; - running[0]=0; - for(i=0;i we do not extrapolate to low energies, we extrapolate to high energies (??) + { + //Do not sample between incident neutron energies: + //--------------------------------------------------------- + //CosTheta: + G4ParticleHPVector theThVec; + theThVec.SetInterpolationManager(theSecondManager[it]); + for(i=0; i0.99 && massCode<1.01){theThVec.Dump();} G4double random = (theThVec.GetY(theThVec.GetVectorLength()-1) -theThVec.GetY(0)) *G4UniformRand(); + G4cout<<" -- "< "< // #include +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPNInelasticFS::G4ParticleHPNInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPNInelasticFS_F01" ); +} void G4ParticleHPNInelasticFS::Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition* projectile) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNPAInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNPAInelasticFS.cc index fa701cef1a..20e966c0e8 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNPAInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNPAInelasticFS.cc @@ -33,6 +33,12 @@ #include "G4Nucleus.hh" #include "G4Alpha.hh" #include "G4Proton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPNPAInelasticFS::G4ParticleHPNPAInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPNPAInelasticFS_F22" ); +} G4HadFinalState * G4ParticleHPNPAInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNPInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNPInelasticFS.cc index b760431f21..aa45389c7a 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNPInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNPInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHPNPInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Proton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPNPInelasticFS::G4ParticleHPNPInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPNPInelasticFS_F10" ); +} G4HadFinalState * G4ParticleHPNPInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNT2AInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNT2AInelasticFS.cc index 3301225c5d..301be75e31 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNT2AInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNT2AInelasticFS.cc @@ -33,6 +33,12 @@ #include "G4Nucleus.hh" #include "G4Alpha.hh" #include "G4Triton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPNT2AInelasticFS::G4ParticleHPNT2AInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPNT2AInelasticFS_F17" ); +} G4HadFinalState * G4ParticleHPNT2AInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNTInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNTInelasticFS.cc index 2a27ee8315..68b49a720f 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNTInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNTInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHPNTInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Triton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPNTInelasticFS::G4ParticleHPNTInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPNTInelasticFS_F14" ); +} G4HadFinalState * G4ParticleHPNTInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNXInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNXInelasticFS.cc index aff40c585d..4301c17585 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNXInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPNXInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHPNXInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPNXInelasticFS::G4ParticleHPNXInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPNXInelasticFS_F02" ); +} G4HadFinalState * G4ParticleHPNXInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPAInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPAInelasticFS.cc index db3d443a5c..c42852c439 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPAInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPAInelasticFS.cc @@ -33,6 +33,12 @@ #include "G4Nucleus.hh" #include "G4Alpha.hh" #include "G4Proton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPPAInelasticFS::G4ParticleHPPAInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPPAInelasticFS_F31" ); +} G4HadFinalState * G4ParticleHPPAInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPDInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPDInelasticFS.cc index 4918fc2aae..b0b1ac1e7b 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPDInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPDInelasticFS.cc @@ -33,6 +33,12 @@ #include "G4Nucleus.hh" #include "G4Proton.hh" #include "G4Deuteron.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPPDInelasticFS::G4ParticleHPPDInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPPDInelasticFS_F34" ); +} G4HadFinalState * G4ParticleHPPDInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPInelasticFS.cc index 89ba8e2e4d..8cbf0a0929 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHPPInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Proton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPPInelasticFS::G4ParticleHPPInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPPInelasticFS_F23" ); +} void G4ParticleHPPInelasticFS::Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition* projectile) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPTInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPTInelasticFS.cc index ae7c96b230..b226c30503 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPTInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPPTInelasticFS.cc @@ -32,6 +32,12 @@ #include "G4ParticleHPPTInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Triton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPPTInelasticFS::G4ParticleHPPTInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPPTInelasticFS_F35" ); +} G4HadFinalState * G4ParticleHPPTInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPT2AInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPT2AInelasticFS.cc index 275c3d46ca..64ab8e1637 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPT2AInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPT2AInelasticFS.cc @@ -31,6 +31,12 @@ #include "G4ParticleHPT2AInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Alpha.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPT2AInelasticFS::G4ParticleHPT2AInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPT2AInelasticFS_F33" ); +} G4HadFinalState * G4ParticleHPT2AInelasticFS::ApplyYourself(const G4HadProjectile & theTrack) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPTInelasticFS.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPTInelasticFS.cc index fd049346b5..900bc65ae7 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPTInelasticFS.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPTInelasticFS.cc @@ -31,6 +31,12 @@ #include "G4ParticleHPTInelasticFS.hh" #include "G4Nucleus.hh" #include "G4Triton.hh" +#include "G4PhysicsModelCatalog.hh" + +G4ParticleHPTInelasticFS::G4ParticleHPTInelasticFS() +{ + secID = G4PhysicsModelCatalog::GetModelID( "model_G4ParticleHPTInelasticFS_F25" ); +} void G4ParticleHPTInelasticFS::Init (G4double A, G4double Z, G4int M, G4String & dirName, G4String & aFSType, G4ParticleDefinition* projectile) { diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPThermalScattering.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPThermalScattering.cc index d9033811ac..76b041bb10 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPThermalScattering.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPThermalScattering.cc @@ -55,9 +55,9 @@ G4ParticleHPThermalScattering::G4ParticleHPThermalScattering() :G4HadronicInteraction("NeutronHPThermalScattering") -,coherentFSs(NULL) -,incoherentFSs(NULL) -,inelasticFSs(NULL) +,coherentFSs(nullptr) +,incoherentFSs(nullptr) +,inelasticFSs(nullptr) { theHPElastic = new G4ParticleHPElastic(); @@ -70,79 +70,74 @@ G4ParticleHPThermalScattering::G4ParticleHPThermalScattering() } - G4ParticleHPThermalScattering::~G4ParticleHPThermalScattering() { delete theHPElastic; } - void G4ParticleHPThermalScattering::clearCurrentFSData() { - -if ( incoherentFSs != NULL ) { - for ( std::map < G4int , std::map < G4double , std::vector < E_isoAng* >* >* >::iterator it = incoherentFSs->begin() ; it != incoherentFSs->end() ; it++ ) - { - std::map < G4double , std::vector < E_isoAng* >* >::iterator itt; - for ( itt = it->second->begin() ; itt != it->second->end() ; itt++ ) + if ( incoherentFSs != nullptr ) { + for ( std::map < G4int , std::map < G4double , std::vector < E_isoAng* >* >* >::iterator it = incoherentFSs->begin() ; it != incoherentFSs->end() ; it++ ) { - std::vector< E_isoAng* >::iterator ittt; - for ( ittt = itt->second->begin(); ittt != itt->second->end() ; ittt++ ) + std::map < G4double , std::vector < E_isoAng* >* >::iterator itt; + for ( itt = it->second->begin() ; itt != it->second->end() ; itt++ ) { - delete *ittt; - } - delete itt->second; - } - delete it->second; - } -} - -if ( coherentFSs != NULL ) { - for ( std::map < G4int , std::map < G4double , std::vector < std::pair< G4double , G4double >* >* >* >::iterator it = coherentFSs->begin() ; it != coherentFSs->end() ; it++ ) - { - std::map < G4double , std::vector < std::pair< G4double , G4double >* >* >::iterator itt; - for ( itt = it->second->begin() ; itt != it->second->end() ; itt++ ) - { - std::vector < std::pair< G4double , G4double >* >::iterator ittt; - for ( ittt = itt->second->begin(); ittt != itt->second->end() ; ittt++ ) - { - delete *ittt; - } - delete itt->second; - } - delete it->second; - } -} - -if ( inelasticFSs != NULL ) { - for ( std::map < G4int , std::map < G4double , std::vector < E_P_E_isoAng* >* >* >::iterator it = inelasticFSs->begin() ; it != inelasticFSs->end() ; it++ ) - { - std::map < G4double , std::vector < E_P_E_isoAng* >* >::iterator itt; - for ( itt = it->second->begin() ; itt != it->second->end() ; itt++ ) - { - std::vector < E_P_E_isoAng* >::iterator ittt; - for ( ittt = itt->second->begin(); ittt != itt->second->end() ; ittt++ ) - { - std::vector < E_isoAng* >::iterator it4; - for ( it4 = (*ittt)->vE_isoAngle.begin() ; it4 != (*ittt)->vE_isoAngle.end() ; it4++ ) + std::vector< E_isoAng* >::iterator ittt; + for ( ittt = itt->second->begin(); ittt != itt->second->end() ; ittt++ ) { - delete *it4; + delete *ittt; } - delete *ittt; + delete itt->second; } - delete itt->second; + delete it->second; } - delete it->second; } + + if ( coherentFSs != nullptr ) { + for ( std::map < G4int , std::map < G4double , std::vector < std::pair< G4double , G4double >* >* >* >::iterator it = coherentFSs->begin() ; it != coherentFSs->end() ; it++ ) + { + std::map < G4double , std::vector < std::pair< G4double , G4double >* >* >::iterator itt; + for ( itt = it->second->begin() ; itt != it->second->end() ; itt++ ) + { + std::vector < std::pair< G4double , G4double >* >::iterator ittt; + for ( ittt = itt->second->begin(); ittt != itt->second->end() ; ittt++ ) + { + delete *ittt; + } + delete itt->second; + } + delete it->second; + } + } + + if ( inelasticFSs != nullptr ) { + for ( std::map < G4int , std::map < G4double , std::vector < E_P_E_isoAng* >* >* >::iterator it = inelasticFSs->begin() ; it != inelasticFSs->end() ; it++ ) + { + std::map < G4double , std::vector < E_P_E_isoAng* >* >::iterator itt; + for ( itt = it->second->begin() ; itt != it->second->end() ; itt++ ) + { + std::vector < E_P_E_isoAng* >::iterator ittt; + for ( ittt = itt->second->begin(); ittt != itt->second->end() ; ittt++ ) + { + std::vector < E_isoAng* >::iterator it4; + for ( it4 = (*ittt)->vE_isoAngle.begin() ; it4 != (*ittt)->vE_isoAngle.end() ; it4++ ) + { + delete *it4; + } + delete *ittt; + } + delete itt->second; + } + delete it->second; + } + } + + incoherentFSs = nullptr; + coherentFSs = nullptr; + inelasticFSs = nullptr; } - incoherentFSs = NULL; - coherentFSs = NULL; - inelasticFSs = NULL; - -} - - void G4ParticleHPThermalScattering::BuildPhysicsTable(const G4ParticleDefinition& particle) { buildPhysicsTable(); @@ -150,7 +145,6 @@ void G4ParticleHPThermalScattering::BuildPhysicsTable(const G4ParticleDefinition } - std::map < G4double , std::vector < std::pair< G4double , G4double >* >* >* G4ParticleHPThermalScattering::readACoherentFSDATA( G4String name ) { @@ -196,7 +190,6 @@ std::map < G4double , std::vector < std::pair< G4double , G4double >* >* >* G4Pa } - std::map < G4double , std::vector < E_P_E_isoAng* >* >* G4ParticleHPThermalScattering::readAnInelasticFSDATA ( G4String name ) { std::map < G4double , std::vector < E_P_E_isoAng* >* >* anT_E_P_E_isoAng = new std::map < G4double , std::vector < E_P_E_isoAng* >* >; @@ -226,8 +219,7 @@ std::map < G4double , std::vector < E_P_E_isoAng* >* >* G4ParticleHPThermalScatt } - -E_P_E_isoAng* G4ParticleHPThermalScattering::readAnE_P_E_isoAng( std::istream* file ) +E_P_E_isoAng* G4ParticleHPThermalScattering::readAnE_P_E_isoAng( std::istream* file ) // for inelastic { E_P_E_isoAng* aData = new E_P_E_isoAng; @@ -265,20 +257,32 @@ E_P_E_isoAng* G4ParticleHPThermalScattering::readAnE_P_E_isoAng( std::istream* f // Calcuate sum_of_provXdEs G4double total = 0; + aData->secondary_energy_cdf.push_back(0.); for ( G4int i = 0 ; i < aData->n - 1 ; i++ ) { G4double E_L = aData->vE_isoAngle[i]->energy/eV; G4double E_H = aData->vE_isoAngle[i+1]->energy/eV; G4double dE = E_H - E_L; - total += ( ( aData->prob[i] ) * dE ); + G4double pdf = (aData->prob[i] + aData->prob[i+1] )/2. * dE; + total += ( pdf ); + aData->secondary_energy_cdf.push_back( total ); + aData->secondary_energy_pdf.push_back( pdf ); + aData->secondary_energy_value.push_back( E_L ); } + aData->sum_of_probXdEs = total; + // Normalize CDF + aData->secondary_energy_cdf_size = (G4int)aData->secondary_energy_cdf.size(); + for ( G4int i = 0; i < aData->secondary_energy_cdf_size; ++i ) + { + aData->secondary_energy_cdf[i] /= total; + } + return aData; } - std::map < G4double , std::vector < E_isoAng* >* >* G4ParticleHPThermalScattering::readAnIncoherentFSDATA ( G4String name ) { std::map < G4double , std::vector < E_isoAng* >* >* T_E = new std::map < G4double , std::vector < E_isoAng* >* >; @@ -306,7 +310,6 @@ std::map < G4double , std::vector < E_isoAng* >* >* G4ParticleHPThermalScatterin } - E_isoAng* G4ParticleHPThermalScattering::readAnE_isoAng( std::istream* file ) { E_isoAng* aData = new E_isoAng; @@ -333,7 +336,6 @@ E_isoAng* G4ParticleHPThermalScattering::readAnE_isoAng( std::istream* file ) } - G4HadFinalState* G4ParticleHPThermalScattering::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aNucleus ) { @@ -345,7 +347,7 @@ G4HadFinalState* G4ParticleHPThermalScattering::ApplyYourself(const G4HadProject G4bool findThermalElement = false; G4int ielement; - const G4Element* theElement = NULL; + const G4Element* theElement = nullptr; for ( G4int i = 0; i < n ; i++ ) { theElement = theMaterial->GetElement(i); @@ -353,9 +355,9 @@ G4HadFinalState* G4ParticleHPThermalScattering::ApplyYourself(const G4HadProject if ( aNucleus.GetZ_asInt() == (G4int)(theElement->GetZ() + 0.5 ) ) { //Check Applicability of Thermal Scattering - if ( getTS_ID( NULL , theElement ) != -1 ) + if ( getTS_ID( nullptr , theElement ) != -1 ) { - ielement = getTS_ID( NULL , theElement ); + ielement = getTS_ID( nullptr , theElement ); findThermalElement = true; break; } @@ -372,7 +374,6 @@ G4HadFinalState* G4ParticleHPThermalScattering::ApplyYourself(const G4HadProject { // Select Reaction (Inelastic, coherent, incoherent) - const G4ParticleDefinition* pd = aTrack.GetDefinition(); G4DynamicParticle* dp = new G4DynamicParticle ( pd , aTrack.Get4Momentum() ); G4double total = theXSection->GetCrossSection( dp , theElement , theMaterial ); @@ -428,33 +429,20 @@ G4HadFinalState* G4ParticleHPThermalScattering::ApplyYourself(const G4HadProject tempLH.first = itm->first; } - G4double rand_for_sE = G4UniformRand(); + G4double sE=0., mu=1.0; + + // New Geant4 method - Stochastic temperature interpolation of the final state + // (continuous temperature interpolation was used previously) + std::pair< G4double , G4double > secondaryParam; + G4double rand_temp = G4UniformRand(); + if ( rand_temp < (aTemp-tempLH.first)/(tempLH.second - tempLH.first) ) + secondaryParam = sample_inelastic_E_mu( aTrack.GetKineticEnergy() , vNEP_EPM_TH ); + else + secondaryParam = sample_inelastic_E_mu( aTrack.GetKineticEnergy() , vNEP_EPM_TL ); - std::pair< G4double , E_isoAng > TL = create_sE_and_EPM_from_pE_and_vE_P_E_isoAng ( rand_for_sE , aTrack.GetKineticEnergy() , vNEP_EPM_TL ); - std::pair< G4double , E_isoAng > TH = create_sE_and_EPM_from_pE_and_vE_P_E_isoAng ( rand_for_sE , aTrack.GetKineticEnergy() , vNEP_EPM_TH ); - - G4double sE; - sE = get_linear_interpolated ( aTemp , std::pair < G4double , G4double > ( tempLH.first , TL.first ) , std::pair < G4double , G4double > ( tempLH.second , TH.first ) ); - - G4double mu=1.0; - E_isoAng anE_isoAng; - if ( TL.second.n == TH.second.n ) - { - anE_isoAng.energy = sE; - anE_isoAng.n = TL.second.n; - for ( G4int i=0 ; i < anE_isoAng.n ; i++ ) - { - G4double angle; - angle = get_linear_interpolated ( aTemp , std::pair< G4double , G4double > ( tempLH.first , TL.second.isoAngle[ i ] ) , std::pair< G4double , G4double > ( tempLH.second , TH.second.isoAngle[ i ] ) ); - anE_isoAng.isoAngle.push_back( angle ); - } - mu = getMu( &anE_isoAng ); - - } else { - //TL.second.n != TH.second.n - throw G4HadronicException(__FILE__, __LINE__, "A problem is found in Thermal Scattering Data! Do not yet supported"); - } - + sE = secondaryParam.first; + mu = secondaryParam.second; + //set theParticleChange.SetEnergyChange( sE ); G4double phi = CLHEP::twopi*G4UniformRand(); @@ -483,8 +471,8 @@ G4HadFinalState* G4ParticleHPThermalScattering::ApplyYourself(const G4HadProject // // For T_L anEPM_TL and T_H anEPM_TH // - std::vector< std::pair< G4double , G4double >* >* pvE_p_TL = NULL; - std::vector< std::pair< G4double , G4double >* >* pvE_p_TH = NULL; + std::vector< std::pair< G4double , G4double >* >* pvE_p_TL = nullptr; + std::vector< std::pair< G4double , G4double >* >* pvE_p_TH = nullptr; if ( tempLH.first != 0.0 && tempLH.second != 0.0 ) { @@ -519,13 +507,20 @@ G4HadFinalState* G4ParticleHPThermalScattering::ApplyYourself(const G4HadProject std::vector< G4double > vp_T; G4int n1 = pvE_p_TL->size(); + + // New Geant4 method - Stochastic interpolation of the final state + std::vector< std::pair< G4double , G4double >* >* pvE_p_T_sampled; + G4double rand_temp = G4UniformRand(); + if ( rand_temp < (aTemp-tempLH.first)/(tempLH.second - tempLH.first) ) + pvE_p_T_sampled = pvE_p_TH; + else + pvE_p_T_sampled = pvE_p_TL; //171005 fix bug, contribution from H.N. TRAN@CEA for ( G4int i=0 ; i < n1 ; i++ ) { - if ( (*pvE_p_TL)[i]->first != (*pvE_p_TH)[i]->first ) throw G4HadronicException(__FILE__, __LINE__, "A problem is found in Thermal Scattering Data!"); - vE_T.push_back ( (*pvE_p_TL)[i]->first ); - vp_T.push_back ( get_linear_interpolated ( aTemp , std::pair< G4double , G4double > ( tempLH.first , (*pvE_p_TL)[i]->second ) , std::pair< G4double , G4double > ( tempLH.second , (*pvE_p_TL)[i]->second ) ) ); + vE_T.push_back ( (*pvE_p_T_sampled)[i]->first ); + vp_T.push_back ( (*pvE_p_T_sampled)[i]->second ); } G4int j = 0; @@ -611,23 +606,16 @@ G4HadFinalState* G4ParticleHPThermalScattering::ApplyYourself(const G4HadProject // E_isoAng for aTemp and aTrack.GetKineticEnergy() G4double mu=1.0; - E_isoAng anEPM_T_E; - - if ( anEPM_TL_E.n == anEPM_TH_E.n ) - { - anEPM_T_E.n = anEPM_TL_E.n; - for ( G4int i=0 ; i < anEPM_TL_E.n ; i++ ) - { - G4double angle; - angle = get_linear_interpolated ( aTemp , std::pair< G4double , G4double > ( tempLH.first , anEPM_TL_E.isoAngle[ i ] ) , std::pair< G4double , G4double > ( tempLH.second , anEPM_TH_E.isoAngle[ i ] ) ); - anEPM_T_E.isoAngle.push_back( angle ); - } - mu = getMu ( &anEPM_T_E ); - - } else { - // anEPM_TL_E.n != anEPM_TH_E.n - throw G4HadronicException(__FILE__, __LINE__, "A problem is found in Thermal Scattering Data! Do not yet supported"); - } + + // New Geant4 method - Stochastic interpolation of the final state + E_isoAng anEPM_T_E_sampled; + G4double rand_temp = G4UniformRand(); + if ( rand_temp < (aTemp-tempLH.first)/(tempLH.second - tempLH.first) ) + anEPM_T_E_sampled = anEPM_TH_E; + else + anEPM_T_E_sampled = anEPM_TL_E; + + mu = getMu ( &anEPM_T_E_sampled ); // Set Final State theParticleChange.SetEnergyChange( aTrack.GetKineticEnergy() ); // No energy change in Elastic @@ -645,12 +633,178 @@ G4HadFinalState* G4ParticleHPThermalScattering::ApplyYourself(const G4HadProject { // Not thermal element // Neutron HP will handle - return theHPElastic -> ApplyYourself( aTrack, aNucleus ); + return theHPElastic -> ApplyYourself( aTrack, aNucleus, 1); // L. Thulliez 2021/05/04 (CEA-Saclay) } } +//********************************************************** +// Geant4 new algorithm +//********************************************************** + +//-------------------------------------------------- +// New method added by L. Thulliez 2021 (CEA-Saclay) +//-------------------------------------------------- +std::pair< G4double , G4int> G4ParticleHPThermalScattering:: +sample_inelastic_E( G4double rndm1, G4double rndm2, E_P_E_isoAng* anE_P_E_isoAng ) +{ + G4int i=0; + G4double sE_value=0; + + for ( ; i < anE_P_E_isoAng->secondary_energy_cdf_size-1 ; ++i ) + { + if ( rndm1 >= anE_P_E_isoAng->secondary_energy_cdf[i] && + rndm1 < anE_P_E_isoAng->secondary_energy_cdf[i+1] ) + { + G4double sE_value_i = anE_P_E_isoAng->secondary_energy_value[i]; + G4double sE_pdf_i = anE_P_E_isoAng->secondary_energy_pdf[i]; + G4double sE_value_i1 = anE_P_E_isoAng->secondary_energy_value[i+1]; + G4double sE_pdf_i1 = anE_P_E_isoAng->secondary_energy_pdf[i+1]; + + G4double lambda = 0; + G4double alpha = (sE_pdf_i1 - sE_pdf_i) / (sE_pdf_i1 + sE_pdf_i); + G4double rndm = rndm1; + + if ( std::fabs(alpha) < 1E-8 ) + { + lambda = rndm2; + } + else + { + G4double beta = 2 * sE_pdf_i / (sE_pdf_i1 + sE_pdf_i); + rndm = rndm2; + G4double gamma = -rndm; + G4double delta = beta*beta - 4*alpha*gamma; + + if ( delta < 0 && std::fabs(delta) < 1.E-8 ) delta = 0; + + lambda = -beta + std::sqrt(delta); + lambda = lambda/(2 * alpha); + + if ( lambda > 1 ) lambda = 1; + else if ( lambda < 0 ) lambda = 0; + } + + sE_value = sE_value_i + lambda * (sE_value_i1 - sE_value_i); + + break; + } + } + + return std::pair< G4double , G4int >( sE_value , i ); +} + + +//-------------------------------------------------- +// New method added by L. Thulliez 2021 (CEA-Saclay) +//-------------------------------------------------- +std::pair< G4double , G4double > G4ParticleHPThermalScattering:: +sample_inelastic_E_mu( G4double pE , std::vector< E_P_E_isoAng* >* vNEP_EPM ) +{ + // Sample primary energy bin + std::map< G4double , G4int > map_energy; + map_energy.clear(); + std::vector< G4double > v_energy; + v_energy.clear(); + std::vector< E_P_E_isoAng* >::iterator itv; + G4int i = 0; + for ( itv = vNEP_EPM->begin(); itv != vNEP_EPM->end(); ++itv ) + { + v_energy.push_back( (*itv)->energy ); + map_energy.insert( std::pair< G4double , G4int >( (*itv)->energy , i ) ); + i++; + } + + std::pair< G4double , G4double > energyLH = find_LH( pE , &v_energy ); + + std::vector< E_P_E_isoAng* > pE_P_E_isoAng_limit(2, nullptr); + + if ( energyLH.first != 0.0 && energyLH.second != 0.0 ) + { + pE_P_E_isoAng_limit[0] = (*vNEP_EPM)[ map_energy.find ( energyLH.first )->second ]; + pE_P_E_isoAng_limit[1] = (*vNEP_EPM)[ map_energy.find ( energyLH.second )->second ]; + } + else if ( energyLH.first == 0.0 ) + { + pE_P_E_isoAng_limit[0] = (*vNEP_EPM)[ 0 ]; + pE_P_E_isoAng_limit[1] = (*vNEP_EPM)[ 1 ]; + } + if ( energyLH.second == 0.0 ) + { + pE_P_E_isoAng_limit[1] = (*vNEP_EPM).back(); + itv = vNEP_EPM->end(); + itv--; + itv--; + pE_P_E_isoAng_limit[0] = *itv; + } + + // Compute interpolation factor of the incident neutron energy + G4double factor = (energyLH.second - pE) / (energyLH.second - energyLH.first); + + if ( (energyLH.second - pE) <= 0. && std::fabs(pE/energyLH.second - 1) < 1E-11 ) factor = 0.; + if ( (energyLH.first - pE) >= 0. && std::fabs(energyLH.first / pE - 1) < 1E-11 ) factor = 1.; + + G4double rndm1 = G4UniformRand(); + G4double rndm2 = G4UniformRand(); + + // Sample secondary neutron energy + std::pair< G4double , G4int > sE_lower = sample_inelastic_E( rndm1, rndm2, pE_P_E_isoAng_limit[0] ); + std::pair< G4double , G4int > sE_upper = sample_inelastic_E( rndm1, rndm2, pE_P_E_isoAng_limit[1] ); + G4double sE = factor * sE_lower.first + (1 - factor) * sE_upper.first; + sE = sE * eV; + + // Sample cosine knowing the secondary neutron energy + rndm1 = G4UniformRand(); + rndm2 = G4UniformRand(); + G4double mu_lower = getMu( rndm1, rndm2, pE_P_E_isoAng_limit[0]->vE_isoAngle[sE_lower.second] ); + G4double mu_upper = getMu( rndm1, rndm2, pE_P_E_isoAng_limit[1]->vE_isoAngle[sE_upper.second] ); + G4double mu = factor * mu_lower + (1 - factor) * mu_upper; + + return std::pair< G4double , G4double >( sE , mu ); +} + + +//-------------------------------------------------- +// New method added by L. Thulliez 2021 (CEA-Saclay) +//-------------------------------------------------- +G4double G4ParticleHPThermalScattering::getMu( G4double rndm1, G4double rndm2, E_isoAng* anEPM ) +{ + G4double result = 0.0; + + G4int in = int ( rndm1 * ( (*anEPM).n ) ); + + if ( in != 0 ) + { + G4double mu_l = (*anEPM).isoAngle[ in-1 ]; + G4double mu_h = (*anEPM).isoAngle[ in ]; + result = ( mu_h - mu_l ) * ( rndm1*((*anEPM).n) - in ) + mu_l; + } + else + { + G4double x = rndm1 * (*anEPM).n; + G4double ratio = 0.5; + if ( x <= ratio ) + { + G4double mu_l = -1; + G4double mu_h = (*anEPM).isoAngle[ 0 ]; + result = ( mu_h - mu_l ) * rndm2 + mu_l; + } + else + { + G4double mu_l = (*anEPM).isoAngle[ (*anEPM).n - 1 ]; + G4double mu_h = 1; + result = ( mu_h - mu_l ) * rndm2 + mu_l; + } + } + + return result; +} + + +//********************************************************** +// Geant4 previous algorithm +//********************************************************** G4double G4ParticleHPThermalScattering::getMu( E_isoAng* anEPM ) { @@ -686,8 +840,7 @@ G4double G4ParticleHPThermalScattering::getMu( E_isoAng* anEPM ) } } return result; -} - +} std::pair < G4double , G4double > G4ParticleHPThermalScattering::find_LH ( G4double x , std::vector< G4double >* aVector ) @@ -726,7 +879,6 @@ std::pair < G4double , G4double > G4ParticleHPThermalScattering::find_LH ( G4do } - G4double G4ParticleHPThermalScattering::get_linear_interpolated ( G4double x , std::pair< G4double , G4double > Low , std::pair< G4double , G4double > High ) { G4double y=0.0; @@ -744,7 +896,6 @@ G4double G4ParticleHPThermalScattering::get_linear_interpolated ( G4double x , s } - E_isoAng G4ParticleHPThermalScattering::create_E_isoAng_from_energy(G4double energy, std::vector* vEPM) @@ -818,10 +969,8 @@ G4ParticleHPThermalScattering::create_E_isoAng_from_energy(G4double energy, } - G4double G4ParticleHPThermalScattering::get_secondary_energy_from_E_P_E_isoAng ( G4double random , E_P_E_isoAng* anE_P_E_isoAng ) { - G4double secondary_energy = 0.0; G4int n = anE_P_E_isoAng->n; @@ -864,90 +1013,84 @@ G4double G4ParticleHPThermalScattering::get_secondary_energy_from_E_P_E_isoAng ( } - std::pair< G4double , E_isoAng > G4ParticleHPThermalScattering::create_sE_and_EPM_from_pE_and_vE_P_E_isoAng ( G4double rand_for_sE , G4double pE , std::vector < E_P_E_isoAng* >* vNEP_EPM ) { + std::map< G4double , G4int > map_energy; + map_energy.clear(); + std::vector< G4double > v_energy; + v_energy.clear(); + std::vector< E_P_E_isoAng* >::iterator itv; + G4int i = 0; + for ( itv = vNEP_EPM->begin(); itv != vNEP_EPM->end(); itv++ ) + { + v_energy.push_back( (*itv)->energy ); + map_energy.insert( std::pair < G4double , G4int > ( (*itv)->energy , i ) ); + i++; + } + + std::pair < G4double , G4double > energyLH = find_LH ( pE , &v_energy ); - std::map< G4double , G4int > map_energy; - map_energy.clear(); - std::vector< G4double > v_energy; - v_energy.clear(); - std::vector< E_P_E_isoAng* >::iterator itv; - G4int i = 0; - for ( itv = vNEP_EPM->begin(); itv != vNEP_EPM->end(); itv++ ) - { - v_energy.push_back( (*itv)->energy ); - map_energy.insert( std::pair < G4double , G4int > ( (*itv)->energy , i ) ); - i++; - } - - std::pair < G4double , G4double > energyLH = find_LH ( pE , &v_energy ); + E_P_E_isoAng* pE_P_E_isoAng_EL = 0; + E_P_E_isoAng* pE_P_E_isoAng_EH = 0; - E_P_E_isoAng* pE_P_E_isoAng_EL = 0; - E_P_E_isoAng* pE_P_E_isoAng_EH = 0; + if ( energyLH.first != 0.0 && energyLH.second != 0.0 ) + { + pE_P_E_isoAng_EL = (*vNEP_EPM)[ map_energy.find ( energyLH.first )->second ]; + pE_P_E_isoAng_EH = (*vNEP_EPM)[ map_energy.find ( energyLH.second )->second ]; + } + else if ( energyLH.first == 0.0 ) + { + pE_P_E_isoAng_EL = (*vNEP_EPM)[ 0 ]; + pE_P_E_isoAng_EH = (*vNEP_EPM)[ 1 ]; + } + if ( energyLH.second == 0.0 ) + { + pE_P_E_isoAng_EH = (*vNEP_EPM).back(); + itv = vNEP_EPM->end(); + itv--; + itv--; + pE_P_E_isoAng_EL = *itv; + } - if ( energyLH.first != 0.0 && energyLH.second != 0.0 ) - { - pE_P_E_isoAng_EL = (*vNEP_EPM)[ map_energy.find ( energyLH.first )->second ]; - pE_P_E_isoAng_EH = (*vNEP_EPM)[ map_energy.find ( energyLH.second )->second ]; - } - else if ( energyLH.first == 0.0 ) - { - pE_P_E_isoAng_EL = (*vNEP_EPM)[ 0 ]; - pE_P_E_isoAng_EH = (*vNEP_EPM)[ 1 ]; - } - if ( energyLH.second == 0.0 ) - { - pE_P_E_isoAng_EH = (*vNEP_EPM).back(); - itv = vNEP_EPM->end(); - itv--; - itv--; - pE_P_E_isoAng_EL = *itv; - } + G4double sE; + G4double sE_L; + G4double sE_H; + sE_L = get_secondary_energy_from_E_P_E_isoAng ( rand_for_sE , pE_P_E_isoAng_EL ); + sE_H = get_secondary_energy_from_E_P_E_isoAng ( rand_for_sE , pE_P_E_isoAng_EH ); - G4double sE; - G4double sE_L; - G4double sE_H; - + sE = get_linear_interpolated ( pE , std::pair < G4double , G4double > ( energyLH.first , sE_L ) , std::pair < G4double , G4double > ( energyLH.second , sE_H ) ); - sE_L = get_secondary_energy_from_E_P_E_isoAng ( rand_for_sE , pE_P_E_isoAng_EL ); - sE_H = get_secondary_energy_from_E_P_E_isoAng ( rand_for_sE , pE_P_E_isoAng_EH ); + + E_isoAng E_isoAng_L = create_E_isoAng_from_energy ( sE , &(pE_P_E_isoAng_EL->vE_isoAngle) ); + E_isoAng E_isoAng_H = create_E_isoAng_from_energy ( sE , &(pE_P_E_isoAng_EH->vE_isoAngle) ); - sE = get_linear_interpolated ( pE , std::pair < G4double , G4double > ( energyLH.first , sE_L ) , std::pair < G4double , G4double > ( energyLH.second , sE_H ) ); - - - E_isoAng E_isoAng_L = create_E_isoAng_from_energy ( sE , &(pE_P_E_isoAng_EL->vE_isoAngle) ); - E_isoAng E_isoAng_H = create_E_isoAng_from_energy ( sE , &(pE_P_E_isoAng_EH->vE_isoAngle) ); - - E_isoAng anE_isoAng; - //For defeating warning message from compiler - anE_isoAng.n = 1; - anE_isoAng.energy = sE; //never used - if ( E_isoAng_L.n == E_isoAng_H.n ) - { - anE_isoAng.n = E_isoAng_L.n; - for ( G4int j=0 ; j < anE_isoAng.n ; j++ ) - { - G4double angle; - angle = get_linear_interpolated ( sE , std::pair< G4double , G4double > ( sE_L , E_isoAng_L.isoAngle[ j ] ) , std::pair< G4double , G4double > ( sE_H , E_isoAng_H.isoAngle[ j ] ) ); - anE_isoAng.isoAngle.push_back( angle ); - } - } - else - { - //G4cout << "Do not Suuport yet." << G4endl; - throw G4HadronicException(__FILE__, __LINE__, "Unexpected values!"); - } - - + E_isoAng anE_isoAng; + //For defeating warning message from compiler + anE_isoAng.n = 1; + anE_isoAng.energy = sE; //never used + if ( E_isoAng_L.n == E_isoAng_H.n ) + { + anE_isoAng.n = E_isoAng_L.n; + for ( G4int j=0 ; j < anE_isoAng.n ; j++ ) + { + G4double angle; + angle = get_linear_interpolated ( sE , std::pair< G4double , G4double > ( sE_L , E_isoAng_L.isoAngle[ j ] ) , std::pair< G4double , G4double > ( sE_H , E_isoAng_H.isoAngle[ j ] ) ); + anE_isoAng.isoAngle.push_back( angle ); + } + } + else + { + //G4cout << "Do not Suuport yet." << G4endl; + throw G4HadronicException(__FILE__, __LINE__, "Unexpected values!"); + } return std::pair< G4double , E_isoAng >( sE , anE_isoAng); } + void G4ParticleHPThermalScattering::buildPhysicsTable() { - //Is rebuild of physics table a necessity if ( nMaterial == G4Material::GetMaterialTable()->size() && nElement == G4Element::GetElementTable()->size() ) { return; @@ -1019,7 +1162,7 @@ void G4ParticleHPThermalScattering::buildPhysicsTable() // << material->GetName() << " " << element->GetName() // << " as internal thermal scattering id of " << ts_ID_of_this_geometry << "." << G4endl; - dic.insert( std::pair < std::pair < const G4Material* , const G4Element* > , G4int > ( std::pair < const G4Material* , const G4Element* > ( (G4Material*)NULL , element ) , ts_ID_of_this_geometry ) ); + dic.insert( std::pair < std::pair < const G4Material* , const G4Element* > , G4int > ( std::pair < const G4Material* , const G4Element* > ( (G4Material*)nullptr , element ) , ts_ID_of_this_geometry ) ); } } } @@ -1028,7 +1171,7 @@ void G4ParticleHPThermalScattering::buildPhysicsTable() G4cout << "Neutron HP Thermal Scattering: Following material-element pairs or elements are registered." << G4endl; for ( std::map < std::pair < const G4Material* , const G4Element* > , G4int >::iterator it = dic.begin() ; it != dic.end() ; it++ ) { - if ( it->first.first != NULL ) + if ( it->first.first != nullptr ) { G4cout << "Material " << it->first.first->GetName() << " - Element " << it->first.second->GetName() << ", internal thermal scattering id " << it->second << G4endl; } @@ -1050,9 +1193,9 @@ void G4ParticleHPThermalScattering::buildPhysicsTable() clearCurrentFSData(); - if ( coherentFSs == NULL ) coherentFSs = new std::map < G4int , std::map < G4double , std::vector < std::pair< G4double , G4double >* >* >* >; - if ( incoherentFSs == NULL ) incoherentFSs = new std::map < G4int , std::map < G4double , std::vector < E_isoAng* >* >* >; - if ( inelasticFSs == NULL ) inelasticFSs = new std::map < G4int , std::map < G4double , std::vector < E_P_E_isoAng* >* >* >; + if ( coherentFSs == nullptr ) coherentFSs = new std::map < G4int , std::map < G4double , std::vector < std::pair< G4double , G4double >* >* >* >; + if ( incoherentFSs == nullptr ) incoherentFSs = new std::map < G4int , std::map < G4double , std::vector < E_isoAng* >* >* >; + if ( inelasticFSs == nullptr ) inelasticFSs = new std::map < G4int , std::map < G4double , std::vector < E_P_E_isoAng* >* >* >; G4String dirName; if ( !std::getenv( "G4NEUTRONHPDATA" ) ) @@ -1099,12 +1242,14 @@ G4int G4ParticleHPThermalScattering::getTS_ID ( const G4Material* material , con return result; } + const std::pair G4ParticleHPThermalScattering::GetFatalEnergyCheckLevels() const { //return std::pair(10*perCent,10*GeV); return std::pair(10*perCent,DBL_MAX); } + void G4ParticleHPThermalScattering::AddUserThermalScatteringFile( G4String nameG4Element , G4String filename) { names.AddThermalElement( nameG4Element , filename ); @@ -1127,6 +1272,7 @@ G4bool G4ParticleHPThermalScattering::check_E_isoAng( E_isoAng* anE_IsoAng ) return result; } + void G4ParticleHPThermalScattering::ModelDescription(std::ostream& outFile) const { outFile << "High Precision model based on thermal scattering data in\n" diff --git a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPThermalScatteringNames.cc b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPThermalScatteringNames.cc index e723fdb902..5cbfacd571 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4ParticleHPThermalScatteringNames.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4ParticleHPThermalScatteringNames.cc @@ -42,34 +42,62 @@ #include "G4ElementTable.hh" //#include "G4ParticleHPData.hh" + G4ParticleHPThermalScatteringNames::G4ParticleHPThermalScatteringNames() { - names.insert ( std::pair < G4String , G4String > ( "TS_Aluminium_Metal" , "al_metal" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_Beryllium_Metal" , "be_metal" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_Be_of_Beryllium_Oxide" , "be_beo" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_C_of_Graphite" , "graphite" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_D_of_Heavy_Water" , "d_heavy_water" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Water" , "h_water" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Zirconium_Hydride" , "h_zrh" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Polyethylene" , "h_polyethylene" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_Iron_Metal" , "fe_metal" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_O_of_Uranium_Dioxide" , "o_uo2" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_O_of_Beryllium_Oxide" , "o_beo" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_U_of_Uranium_Dioxide" , "u_uo2" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_Zr_of_Zirconium_Hydride" , "zr_zrh" ) ); - - - names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Para_Hydrogen" , "h_para_h2" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Ortho_Hydrogen" , "h_ortho_h2" ) ); - - names.insert ( std::pair < G4String , G4String > ( "TS_D_of_Para_Deuterium" , "d_para_d2" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_D_of_Ortho_Deuterium" , "d_ortho_d2" ) ); - - names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Liquid_Methane", "h_l_ch4" ) ); - names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Solid_Methane", "h_s_ch4" ) ); - - //names.insert ( std::pair < G4String , G4String > ( "TS_Benzene", "benzen" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_Aluminium_Metal" , "al_metal" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_Beryllium_Metal" , "be_metal" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_Be_of_Beryllium_Oxide" , "be_beo" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_C_of_Graphite" , "graphite" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_D_of_Heavy_Water" , "d_heavy_water" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Water" , "h_water" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Zirconium_Hydride" , "h_zrh" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Polyethylene" , "h_polyethylene" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_Iron_Metal" , "fe_metal" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_O_of_Uranium_Dioxide" , "o_uo2" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_O_of_Beryllium_Oxide" , "o_beo" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_U_of_Uranium_Dioxide" , "u_uo2" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_U235_of_Uranium_Dioxide" , "u235_uo2" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_U238_of_Uranium_Dioxide" , "u238_uo2" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_Zr_of_Zirconium_Hydride" , "zr_zrh" ) ); // ENDF-B71 + names.insert ( std::pair < G4String , G4String > ( "TS_Zr90_of_Zirconium_Hydride" , "zr90_zrh" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Zr91_of_Zirconium_Hydride" , "zr91_zrh" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Zr92_of_Zirconium_Hydride" , "zr92_zrh" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Zr94_of_Zirconium_Hydride" , "zr94_zrh" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Zr96_of_Zirconium_Hydride" , "zr96_zrh" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Para_Hydrogen" , "h_para_h2" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Ortho_Hydrogen" , "h_ortho_h2" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_D_of_Para_Deuterium" , "d_para_d2" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_D_of_Ortho_Deuterium" , "d_ortho_d2" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Liquid_Methane", "h_l_ch4" ) ); + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Solid_Methane", "h_s_ch4" ) ); + // 26/03/2021 - Added by L. Thulliez (CEA-Saclay) + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Ice", "h_ice" ) ); // ENDF-B80 & JEFF-3.3 + names.insert ( std::pair < G4String , G4String > ( "TS_O_of_Ice", "o_ice" ) ); // ENDF-B80 & JEFF-3.3 + names.insert ( std::pair < G4String , G4String > ( "TS_C_of_Graphite_Porosity_30percent" , "graphite_30p" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_C_of_Graphite_Porosity_10percent" , "graphite_10p" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_PolymethylMethacrylate", "h_c5o2h8" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Al_of_Sapphir", "al_al2o3" ) ); // JEFF-3.3 + names.insert ( std::pair < G4String , G4String > ( "TS_O_of_Sapphir", "o_al2o3" ) ); // JEFF-3.3 + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Mesitylene_phaseII", "h_mesitylene_phaseII" ) ); // JEFF-3.3 + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_Toluene", "h_toluene" ) ); // JEFF-3.3 + names.insert ( std::pair < G4String , G4String > ( "TS_N_of_UN", "n_un" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_U235_of_UN", "u235_un" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_U238_of_UN", "u238_un" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_H_of_YH2", "h_yh2" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Y_of_YH2", "y_yh2" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_C_of_SiC", "c_sic" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Si28_of_SiC", "si28_sic" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Si29_of_SiC", "si29_sic" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Si30_of_SiC", "si30_sic" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Si28_of_SiO2_beta", "si28_sio2_beta" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Si29_of_SiO2_beta", "si29_sio2_beta" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Si30_of_SiO2_beta", "si30_sio2_beta" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Si28_of_SiO2_alpha", "si28_sio2_alpha" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Si29_of_SiO2_alpha", "si29_sio2_alpha" ) ); // ENDF-B80 + names.insert ( std::pair < G4String , G4String > ( "TS_Si30_of_SiO2_alpha", "si30_sio2_alpha" ) ); // ENDF-B80 + //--- nist_names.insert ( std::pair < std::pair < G4String , G4String > , G4String > ( std::pair < G4String , G4String > ( "G4_BERYLLIUM_OXIDE" , "Be" ) , "be_beo" ) ); nist_names.insert ( std::pair < std::pair < G4String , G4String > , G4String > ( std::pair < G4String , G4String > ( "G4_BERYLLIUM_OXIDE" , "O" ) , "o_beo" ) ); @@ -78,16 +106,15 @@ G4ParticleHPThermalScatteringNames::G4ParticleHPThermalScatteringNames() nist_names.insert ( std::pair < std::pair < G4String , G4String > , G4String > ( std::pair < G4String , G4String > ( "G4_URANIUM_OXIDE" , "O" ) , "o_uo2" ) ); nist_names.insert ( std::pair < std::pair < G4String , G4String > , G4String > ( std::pair < G4String , G4String > ( "G4_URANIUM_OXIDE" , "U" ) , "u_uo2" ) ); nist_names.insert ( std::pair < std::pair < G4String , G4String > , G4String > ( std::pair < G4String , G4String > ( "G4_WATER" , "H" ) , "h_water" ) ); - - //nist_names.insert ( std::pair < std::pair < G4String , G4String > , G4String > ( std::pair < G4String , G4String > ( "G4_BENZENE" , "H" ) , "benzen" ) ); - //nist_names.insert ( std::pair < std::pair < G4String , G4String > , G4String > ( std::pair < G4String , G4String > ( "G4_BENZENE" , "C" ) , "benzen" ) ); } + G4ParticleHPThermalScatteringNames::~G4ParticleHPThermalScatteringNames() { ; } + G4bool G4ParticleHPThermalScatteringNames::IsThisThermalElement( G4String aname) { G4bool result = false; @@ -95,6 +122,7 @@ G4bool G4ParticleHPThermalScatteringNames::IsThisThermalElement( G4String aname) return result; } + G4bool G4ParticleHPThermalScatteringNames::IsThisThermalElement( G4String material , G4String element ) { G4bool result = false; diff --git a/source/processes/hadronic/models/particle_hp/src/G4WendtFissionFragmentGenerator.cc b/source/processes/hadronic/models/particle_hp/src/G4WendtFissionFragmentGenerator.cc index 03c8d229f9..3ed87a327d 100644 --- a/source/processes/hadronic/models/particle_hp/src/G4WendtFissionFragmentGenerator.cc +++ b/source/processes/hadronic/models/particle_hp/src/G4WendtFissionFragmentGenerator.cc @@ -35,6 +35,8 @@ #include "G4FFGDebuggingMacros.hh" #include "G4WendtFissionFragmentGenerator.hh" +#include "G4PhysicsModelCatalog.hh" + G4ThreadLocal G4WendtFissionFragmentGenerator* G4WendtFissionFragmentGenerator::instance = NULL; G4WendtFissionFragmentGenerator:: @@ -42,6 +44,9 @@ G4WendtFissionFragmentGenerator() { // Set the default verbosity Verbosity_ = G4FFGDefaultValues::Verbosity; + + // Set the creator model ID + secID = G4PhysicsModelCatalog::GetModelID( "model_NeutronHPFission" ); } /* G4WendtFissionFragmentGenerator* G4WendtFissionFragmentGenerator:: @@ -90,7 +95,7 @@ G4FFG_FUNCTIONENTER__ for(unsigned int i = 0; i < finalParticles->size(); ++i) { - finalState->AddSecondary((*finalParticles)[i]); + finalState->AddSecondary((*finalParticles)[i], secID); } } diff --git a/source/processes/hadronic/models/parton_string/diffraction/History b/source/processes/hadronic/models/parton_string/diffraction/History index 2fe45cf122..2a4fb0b88f 100644 --- a/source/processes/hadronic/models/parton_string/diffraction/History +++ b/source/processes/hadronic/models/parton_string/diffraction/History @@ -14,7 +14,23 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- -16-Apr-2021 B, Morgan (hadr-string-diff-V10-07-01) +10-Nov-2021 A. Ribon (hadr-string-diff-V10-07-04) +- G4FTFModel, G4FTFParticipants : Vladimir Uzhinsky interface extension + of these two classes to provide the following information: + number of projectile spectator nucleons, number of target spectator + nucleons, number of nucleon-nucleon collisions, and impact parameter + (in the latter case, there is also the possibility - switched off by + default - to set the range from which to sample the square of the + impact parameter). + +27-Oct-2021 A. Ribon (hadr-string-diff-V10-07-03) +- G4FTFModel : extended for projectile hypernuclei and anti-hypernuclei. + +13-Jul-2021 A. Ribon (hadr-string-diff-V10-07-02) +- G4FTFParameters : improved initialization in the constructor of + G4FTFParamCollection, as suggested by Coverity. + +16-Apr-2021 B. Morgan (hadr-string-diff-V10-07-01) - Migrate build to modular CMake API 13-Apr-2021 A. Ribon (hadr-string-diff-V10-07-00) diff --git a/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFModel.hh b/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFModel.hh index 03c249169e..4126e405bc 100644 --- a/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFModel.hh +++ b/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFModel.hh @@ -74,6 +74,16 @@ class G4FTFModel : public G4VPartonStringModel { G4bool operator==( const G4FTFModel& right ) const = delete; G4bool operator!=( const G4FTFModel& right ) const = delete; + void SetImpactParameter( const G4double b_value ); + G4double GetImpactParameter() const; + void SetBminBmax( const G4double bmin_value, const G4double bmax_value ); + G4bool SampleBinInterval() const; + G4double GetBmin() const; + G4double GetBmax() const; + G4int GetNumberOfProjectileSpectatorNucleons() const; + G4int GetNumberOfTargetSpectatorNucleons() const; + G4int GetNumberOfNNcollisions() const; + protected: void Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProjectile ) override; @@ -95,7 +105,7 @@ class G4FTFModel : public G4VPartonStringModel { // The "AdjustNucleons" method uses the following struct and 3 new utility methods: struct CommonVariables { G4int TResidualMassNumber = 0, TResidualCharge = 0, PResidualMassNumber = 0, - PResidualCharge = 0; + PResidualCharge = 0, PResidualLambdaNumber = 0; G4double SqrtS = 0.0, S = 0.0, SumMasses = 0.0, TResidualExcitationEnergy = 0.0, TResidualMass = 0.0, TNucleonMass = 0.0, PResidualExcitationEnergy = 0.0, PResidualMass = 0.0, PNucleonMass = 0.0, @@ -182,12 +192,21 @@ class G4FTFModel : public G4VPartonStringModel { G4LorentzVector ProjectileResidual4Momentum; G4int ProjectileResidualMassNumber; G4int ProjectileResidualCharge; + G4int ProjectileResidualLambdaNumber; // Number of (anti-)lambdas for projectile (anti-)hypernucleus G4double ProjectileResidualExcitationEnergy; G4LorentzVector TargetResidual4Momentum; G4int TargetResidualMassNumber; G4int TargetResidualCharge; G4double TargetResidualExcitationEnergy; + + G4double Bimpact; + G4bool BinInterval; + G4double Bmin; + G4double Bmax; + G4int NumberOfProjectileSpectatorNucleons; + G4int NumberOfTargetSpectatorNucleons; + G4int NumberOfNNcollisions; }; inline G4V3DNucleus* G4FTFModel::GetWoundedNucleus() const { @@ -202,5 +221,44 @@ inline G4V3DNucleus* G4FTFModel::GetProjectileNucleus() const { return theParticipants.GetProjectileNucleus(); } -#endif +inline void G4FTFModel::SetImpactParameter( const G4double b_value ) { + Bimpact = b_value; +} +inline G4double G4FTFModel::GetImpactParameter() const { + return Bimpact; +} + +inline void G4FTFModel::SetBminBmax( const G4double bmin_value, const G4double bmax_value ) { + BinInterval = false; + if ( bmin_value < 0.0 || bmax_value < 0.0 || bmax_value < bmin_value ) return; + BinInterval = true; + Bmin = bmin_value; + Bmax = bmax_value; +} + +inline G4bool G4FTFModel::SampleBinInterval() const { + return BinInterval; +} + +inline G4double G4FTFModel::GetBmin() const { + return Bmin; +} + +inline G4double G4FTFModel::GetBmax() const { + return Bmax; +} + +inline G4int G4FTFModel::GetNumberOfProjectileSpectatorNucleons() const { + return NumberOfProjectileSpectatorNucleons; +} + +inline G4int G4FTFModel::GetNumberOfTargetSpectatorNucleons() const { + return NumberOfTargetSpectatorNucleons; +} + +inline G4int G4FTFModel::GetNumberOfNNcollisions() const { + return NumberOfNNcollisions; +} + +#endif diff --git a/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFParameters.hh b/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFParameters.hh index 627027acf1..884ad803d6 100644 --- a/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFParameters.hh +++ b/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFParameters.hh @@ -272,9 +272,6 @@ class G4FTFParamCollection { // ... while for mesons it's 1GeV**2 double fMaxPt2ofNuclearDestruct; // D=9GeV**2 - private: - - void Reset(); }; diff --git a/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFParticipants.hh b/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFParticipants.hh index 8d8cb7d85d..97151ce994 100644 --- a/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFParticipants.hh +++ b/source/processes/hadronic/models/parton_string/diffraction/include/G4FTFParticipants.hh @@ -57,6 +57,22 @@ class G4FTFParticipants : public G4VParticipants { G4bool operator!=( const G4FTFParticipants& right ) const = delete; G4FTFParticipants( const G4FTFParticipants& right ) = delete; + // New methods to get/set the impact parameter. + // (Note: to get the impact parameter in fermi units, do: + // GetImpactParameter() / fermi ) + // By default, SampleBinInterval() is false and therefore the sampling of + // the impact parameter is done as usual by FTF taking into account the + // radius of target nucleus, and, in the case of nucleus-nucleus collisions, + // also of radius of the projectile nucleus; if, instead, SampleBinInterval() + // is true, then the square of the impact parameter is drawn from a flat + // distribution in the specified interval [Bmin2, Bmax2]. + void SetImpactParameter( const G4double b_value ); + G4double GetImpactParameter() const; + void SetBminBmax( const G4double bmin_value, const G4double bmax_value ); + G4bool SampleBinInterval() const; + G4double GetBmin2() const; // Minimum value of the square of the impact parameter + G4double GetBmax2() const; // Maximum value of the square of the impact parameter + void GetList( const G4ReactionProduct& thePrimary, G4FTFParameters* theParameters ); void StartLoop(); G4bool Next(); @@ -66,10 +82,44 @@ class G4FTFParticipants : public G4VParticipants { void Clean(); private: + G4double Bimpact; + G4bool BinInterval; + G4double Bmin2; + G4double Bmax2; + std::vector< G4InteractionContent* > theInteractions; G4int currentInteraction; }; + +inline void G4FTFParticipants::SetImpactParameter( const G4double b_value ) { + Bimpact = b_value; +} + +inline G4double G4FTFParticipants::GetImpactParameter() const { + return Bimpact; +} + +inline void G4FTFParticipants::SetBminBmax( const G4double bmin_value, const G4double bmax_value ) { + BinInterval = false; + if ( bmin_value < 0.0 || bmax_value < 0.0 || bmax_value < bmin_value ) return; + BinInterval = true; + Bmin2 = bmin_value * bmin_value; + Bmax2 = bmax_value * bmax_value; +} + +inline G4bool G4FTFParticipants::SampleBinInterval() const { + return BinInterval; +} + +inline G4double G4FTFParticipants::GetBmin2() const { + return Bmin2; +} + +inline G4double G4FTFParticipants::GetBmax2() const { + return Bmax2; +} + inline void G4FTFParticipants::StartLoop() { currentInteraction = -1; } diff --git a/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFModel.cc b/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFModel.cc index ebde978979..59646efb9a 100644 --- a/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFModel.cc +++ b/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFModel.cc @@ -52,7 +52,7 @@ #include "G4ParticleTable.hh" #include "G4IonTable.hh" #include "G4KineticTrack.hh" - +#include "G4HyperNucleiProperties.hh" #include "G4Exp.hh" #include "G4Log.hh" @@ -92,6 +92,7 @@ G4FTFModel::G4FTFModel( const G4String& modelName ) : ProjectileResidual4Momentum = tmp; ProjectileResidualMassNumber = 0; ProjectileResidualCharge = 0; + ProjectileResidualLambdaNumber = 0; ProjectileResidualExcitationEnergy = 0.0; TargetResidual4Momentum = tmp; @@ -99,6 +100,14 @@ G4FTFModel::G4FTFModel( const G4String& modelName ) : TargetResidualCharge = 0; TargetResidualExcitationEnergy = 0.0; + Bimpact = -1.0; + BinInterval = false; + Bmin = 0.0; + Bmax = 0.0; + NumberOfProjectileSpectatorNucleons = 0; + NumberOfTargetSpectatorNucleons = 0; + NumberOfNNcollisions = 0; + SetEnergyMomentumCheckLevels( 2.0*perCent, 150.0*MeV ); } @@ -173,9 +182,10 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj G4LorentzVector tmp( 0.0, 0.0, 0.0, 0.0 ); ProjectileResidualMassNumber = 0; ProjectileResidualCharge = 0; + ProjectileResidualLambdaNumber = 0; ProjectileResidualExcitationEnergy = 0.0; ProjectileResidual4Momentum = tmp; - + TargetResidualMassNumber = aNucleus.GetA_asInt(); TargetResidualCharge = aNucleus.GetZ_asInt(); TargetResidualExcitationEnergy = 0.0; @@ -187,9 +197,9 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj if ( std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ) <= 1 ) { // Projectile is a hadron : meson or baryon - PlabPerParticle = theProjectile.GetMomentum().z(); ProjectileResidualMassNumber = std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ); ProjectileResidualCharge = G4int( theProjectile.GetDefinition()->GetPDGCharge() ); + PlabPerParticle = theProjectile.GetMomentum().z(); ProjectileResidualExcitationEnergy = 0.0; //G4double ProjectileResidualMass = theProjectile.GetMass(); ProjectileResidual4Momentum.setVect( theProjectile.GetMomentum() ); @@ -201,40 +211,41 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj } } else { if ( theProjectile.GetDefinition()->GetBaryonNumber() > 1 ) { - // Projectile is a nucleus - theParticipants.InitProjectileNucleus(theProjectile.GetDefinition()->GetBaryonNumber(), - G4int(theProjectile.GetDefinition()->GetPDGCharge())); + // Projectile is a nucleus ProjectileResidualMassNumber = theProjectile.GetDefinition()->GetBaryonNumber(); ProjectileResidualCharge = G4int( theProjectile.GetDefinition()->GetPDGCharge() ); - PlabPerParticle = theProjectile.GetMomentum().z() / - theProjectile.GetDefinition()->GetBaryonNumber(); + ProjectileResidualLambdaNumber = theProjectile.GetDefinition()->GetNumberOfLambdasInHypernucleus(); + PlabPerParticle = theProjectile.GetMomentum().z() / ProjectileResidualMassNumber; if ( PlabPerParticle < LowEnergyLimit ) { HighEnergyInter = false; } else { HighEnergyInter = true; } + theParticipants.InitProjectileNucleus( ProjectileResidualMassNumber, ProjectileResidualCharge, + ProjectileResidualLambdaNumber ); } else if ( theProjectile.GetDefinition()->GetBaryonNumber() < -1 ) { // Projectile is an anti-nucleus - theParticipants.InitProjectileNucleus( - std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ), - std::abs( G4int( theProjectile.GetDefinition()->GetPDGCharge() ) ) ); + ProjectileResidualMassNumber = std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ); + ProjectileResidualCharge = std::abs( G4int( theProjectile.GetDefinition()->GetPDGCharge() ) ); + ProjectileResidualLambdaNumber = theProjectile.GetDefinition()->GetNumberOfAntiLambdasInAntiHypernucleus(); + PlabPerParticle = theProjectile.GetMomentum().z() / ProjectileResidualMassNumber; + if ( PlabPerParticle < LowEnergyLimit ) { + HighEnergyInter = false; + } else { + HighEnergyInter = true; + } + theParticipants.InitProjectileNucleus( ProjectileResidualMassNumber, ProjectileResidualCharge, + ProjectileResidualLambdaNumber ); theParticipants.GetProjectileNucleus()->StartLoop(); G4Nucleon* aNucleon; while ( ( aNucleon = theParticipants.GetProjectileNucleus()->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */ - if ( aNucleon->GetDefinition() == G4Proton::Proton() ) { - aNucleon->SetParticleType( G4AntiProton::AntiProton() ); - } else if ( aNucleon->GetDefinition() == G4Neutron::Neutron() ) { - aNucleon->SetParticleType( G4AntiNeutron::AntiNeutron() ); - } - } - ProjectileResidualMassNumber = std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ); - ProjectileResidualCharge = std::abs( G4int(theProjectile.GetDefinition()->GetPDGCharge()) ); - PlabPerParticle = theProjectile.GetMomentum().z() / - std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ); - if ( PlabPerParticle < LowEnergyLimit ) { - HighEnergyInter = false; - } else { - HighEnergyInter = true; + if ( aNucleon->GetDefinition() == G4Proton::Definition() ) { + aNucleon->SetParticleType( G4AntiProton::Definition() ); + } else if ( aNucleon->GetDefinition() == G4Neutron::Definition() ) { + aNucleon->SetParticleType( G4AntiNeutron::Definition() ); + } else if ( aNucleon->GetDefinition() == G4Lambda::Definition() ) { + aNucleon->SetParticleType( G4AntiLambda::Definition() ); + } } } @@ -247,19 +258,14 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj ProjectileResidual4Momentum.setE( theProjectile.GetTotalEnergy() ); } - // Init target nucleus + // Init target nucleus (assumed to be never a hypernucleus) theParticipants.Init( aNucleus.GetA_asInt(), aNucleus.GetZ_asInt() ); - //theParticipants.Init( aNucleus.GetA_asInt(), 0 ); // For h+neutron - /* - if ( theParameters != 0 ) delete theParameters; - theParameters = new G4FTFParameters( theProjectile.GetDefinition(), aNucleus.GetA_asInt(), - aNucleus.GetZ_asInt(), PlabPerParticle ); - */ + NumberOfProjectileSpectatorNucleons = std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ); + NumberOfTargetSpectatorNucleons = aNucleus.GetA_asInt(); + NumberOfNNcollisions = 0; // reset/recalculate everything for the new interaction - // - theParameters->InitForInteraction( theProjectile.GetDefinition(), aNucleus.GetA_asInt(), aNucleus.GetZ_asInt(), PlabPerParticle ); @@ -282,6 +288,8 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj // (i.e. G4HadronElasticProcess). if ( std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ) <= 1 && aNucleus.GetA_asInt() < 2 ) theParameters->SetProbabilityOfElasticScatt( 0.0 ); + + if ( SampleBinInterval() ) theParticipants.SetBminBmax( GetBmin(), GetBmax() ); } @@ -295,6 +303,9 @@ G4ExcitedStringVector* G4FTFModel::GetStrings() { G4ExcitedStringVector* theStrings = new G4ExcitedStringVector; theParticipants.GetList( theProjectile, theParameters ); + + SetImpactParameter( theParticipants.GetImpactParameter() ); + StoreInvolvedNucleon(); G4bool Success( true ); @@ -381,7 +392,6 @@ G4ExcitedStringVector* G4FTFModel::GetStrings() { #ifdef debugFTFmodel G4cout << "End of FTF. Go to fragmentation" << G4endl << "To continue - enter 1, to stop - ^C" << G4endl; - //G4int Uzhi; G4cin >> Uzhi; #endif theParticipants.Clean(); @@ -549,9 +559,7 @@ void G4FTFModel::ReggeonCascade() { G4bool G4FTFModel::PutOnMassShell() { G4bool isProjectileNucleus = false; - if ( GetProjectileNucleus() ) { - isProjectileNucleus = true; - } + if ( GetProjectileNucleus() ) isProjectileNucleus = true; #ifdef debugPutOnMassShell G4cout << "PutOnMassShell start " << G4endl; @@ -561,9 +569,7 @@ G4bool G4FTFModel::PutOnMassShell() { #endif G4LorentzVector Pprojectile( theProjectile.GetMomentum(), theProjectile.GetTotalEnergy() ); - if ( Pprojectile.z() < 0.0 ) { - return false; - } + if ( Pprojectile.z() < 0.0 ) return false; G4bool isOk = true; @@ -612,9 +618,7 @@ G4bool G4FTFModel::PutOnMassShell() { << PrResidualMass/GeV << " " << TargetResidualMass/GeV << " GeV" << G4endl; #endif - if ( SqrtS < SumMasses ) { - return false; // It is impossible to simulate after putting nuclear nucleons on mass-shell. - } + if ( SqrtS < SumMasses ) return false; // It is impossible to simulate after putting nuclear nucleons on mass-shell // Try to consider also the excitation energy of the residual nucleus, if this is // possible, with the available energy; otherwise, set the excitation energy to zero. @@ -630,16 +634,12 @@ G4bool G4FTFModel::PutOnMassShell() { if ( SqrtS < SumMasses ) { SumMasses = savedSumMasses; - if ( isProjectileNucleus ) { - ProjectileResidualExcitationEnergy = 0.0; - } + if ( isProjectileNucleus ) ProjectileResidualExcitationEnergy = 0.0; TargetResidualExcitationEnergy = 0.0; } TargetResidualMass += TargetResidualExcitationEnergy; - if ( isProjectileNucleus ) { - PrResidualMass += ProjectileResidualExcitationEnergy; - } + if ( isProjectileNucleus ) PrResidualMass += ProjectileResidualExcitationEnergy; #ifdef debugPutOnMassShell if ( isProjectileNucleus ) { @@ -657,9 +657,8 @@ G4bool G4FTFModel::PutOnMassShell() { TheInvolvedNucleonsOfProjectile, SumMasses ); } if ( theTargetNucleus->GetMassNumber() != 1 ) { - isOk = isOk && - GenerateDeltaIsobar( SqrtS, NumberOfInvolvedNucleonsOfTarget, - TheInvolvedNucleonsOfTarget, SumMasses ); + isOk = isOk && GenerateDeltaIsobar( SqrtS, NumberOfInvolvedNucleonsOfTarget, + TheInvolvedNucleonsOfTarget, SumMasses ); } if ( ! isOk ) return false; @@ -672,9 +671,7 @@ G4bool G4FTFModel::PutOnMassShell() { G4LorentzRotation toCms( -1*Psum.boostVector() ); G4LorentzVector Ptmp = toCms*Pprojectile; - if ( Ptmp.pz() <= 0.0 ) { // "String" moving backwards in c.m.s., abort collision! - return false; - } + if ( Ptmp.pz() <= 0.0 ) return false; // "String" moving backwards in c.m.s., abort collision! G4LorentzRotation toLab( toCms.inverse() ); @@ -688,9 +685,7 @@ G4bool G4FTFModel::PutOnMassShell() { // Ascribing of the involved nucleons Pt and Xminus G4double DcorP = 0.0; - if ( isProjectileNucleus ) { - DcorP = theParameters->GetDofNuclearDestruction() / thePrNucleus->GetMassNumber(); - } + if ( isProjectileNucleus ) DcorP = theParameters->GetDofNuclearDestruction() / thePrNucleus->GetMassNumber(); G4double DcorT = theParameters->GetDofNuclearDestruction() / theTargetNucleus->GetMassNumber(); G4double AveragePt2 = theParameters->GetPt2ofNuclearDestruction(); G4double maxPtSquare = theParameters->GetMaxPt2ofNuclearDestruction(); @@ -738,19 +733,16 @@ G4bool G4FTFModel::PutOnMassShell() { TheInvolvedNucleonsOfProjectile, M2proj ); } // Sampling of kinematical properties of target nucleons - isOk = isOk && - SamplingNucleonKinematics( AveragePt2, maxPtSquare, DcorT, - theTargetNucleus, PtargetResidual, - TargetResidualMass, TargetResidualMassNumber, - NumberOfInvolvedNucleonsOfTarget, - TheInvolvedNucleonsOfTarget, M2target ); - + isOk = isOk && SamplingNucleonKinematics( AveragePt2, maxPtSquare, DcorT, + theTargetNucleus, PtargetResidual, + TargetResidualMass, TargetResidualMassNumber, + NumberOfInvolvedNucleonsOfTarget, + TheInvolvedNucleonsOfTarget, M2target ); #ifdef debugPutOnMassShell G4cout << "SqrtS, Mp+Mt, Mp, Mt " << SqrtS/GeV << " " << ( std::sqrt( M2proj ) + std::sqrt( M2target) )/GeV << " " << std::sqrt( M2proj )/GeV << " " << std::sqrt( M2target )/GeV << G4endl; #endif - if ( ! isOk ) return false; } while ( ( SqrtS < std::sqrt( M2proj ) + std::sqrt( M2target ) ) && NumberOfTries < maxNumberOfInnerLoops ); /* Loop checking, 10.08.2015, A.Ribon */ @@ -766,10 +758,9 @@ G4bool G4FTFModel::PutOnMassShell() { TheInvolvedNucleonsOfProjectile, WminusTarget, WplusProjectile, OuterSuccess ); } - isOk = isOk && - CheckKinematics( S, SqrtS, M2proj, M2target, YtargetNucleus, false, - NumberOfInvolvedNucleonsOfTarget, TheInvolvedNucleonsOfTarget, - WminusTarget, WplusProjectile, OuterSuccess ); + isOk = isOk && CheckKinematics( S, SqrtS, M2proj, M2target, YtargetNucleus, false, + NumberOfInvolvedNucleonsOfTarget, TheInvolvedNucleonsOfTarget, + WminusTarget, WplusProjectile, OuterSuccess ); if ( ! isOk ) return false; } while ( ( ! OuterSuccess ) && ++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */ @@ -859,7 +850,7 @@ G4bool G4FTFModel::ExciteParticipants() { G4cout << "G4FTFModel::ExciteParticipants() " << G4endl; #endif - G4bool Success( false ); //Uzhi Aug.2019 + G4bool Success( false ); G4int MaxNumOfInelCollisions = G4int( theParameters->GetMaxNumberOfCollisions() ); if ( MaxNumOfInelCollisions > 0 ) { // Plab > Pbound, normal application of FTF is possible G4double ProbMaxNumber = theParameters->GetMaxNumberOfCollisions() - MaxNumOfInelCollisions; @@ -876,7 +867,7 @@ G4bool G4FTFModel::ExciteParticipants() { G4int CurrentInteraction( 0 ); theParticipants.StartLoop(); - G4bool InnerSuccess( true ); //Uzhi Aug.2019 + G4bool InnerSuccess( true ); while ( theParticipants.Next() ) { /* Loop checking, 10.08.2015, A.Ribon */ CurrentInteraction++; const G4InteractionContent& collision = theParticipants.GetInteraction(); @@ -908,7 +899,7 @@ G4bool G4FTFModel::ExciteParticipants() { TargetNucleon, Annihilation ); if ( ! Result ) continue; } - InnerSuccess = theElastic->ElasticScattering( projectile, target, theParameters ); //Uzhi Aug.2019 + InnerSuccess = theElastic->ElasticScattering( projectile, target, theParameters ); } else if ( G4UniformRand() > theParameters->GetProbabilityOfAnnihilation() ) { // Inelastic scattering @@ -933,7 +924,8 @@ G4bool G4FTFModel::ExciteParticipants() { // if ( ! Result ) continue; //} if ( theExcitation->ExciteParticipants( projectile, target, theParameters, theElastic ) ) { - InnerSuccess = true; //Uzhi Aug.2019 + InnerSuccess = true; + NumberOfNNcollisions++; #ifdef debugBuildString G4cout << "FTF excitation Successfull " << G4endl; // G4cout << "After pro " << projectile->Get4Momentum() << " " @@ -942,7 +934,7 @@ G4bool G4FTFModel::ExciteParticipants() { // << target->Get4Momentum().mag() << G4endl; #endif } else { - InnerSuccess = theElastic->ElasticScattering( projectile, target, theParameters ); //Uzhi Aug.2019 + InnerSuccess = theElastic->ElasticScattering( projectile, target, theParameters ); #ifdef debugBuildString G4cout << "FTF excitation Non InnerSuccess of Elastic scattering " << InnerSuccess << G4endl; @@ -958,7 +950,7 @@ G4bool G4FTFModel::ExciteParticipants() { // TargetNucleon, Annihilation ); // if ( ! Result) continue; //} - InnerSuccess = theElastic->ElasticScattering( projectile, target, theParameters ); //Uzhi Aug.2019 + InnerSuccess = theElastic->ElasticScattering( projectile, target, theParameters ); } } else { // Annihilation @@ -966,6 +958,8 @@ G4bool G4FTFModel::ExciteParticipants() { G4cout << "Annihilation" << G4endl; #endif + NumberOfNNcollisions++; + // Skipping possible interactions of the annihilated nucleons while ( theParticipants.Next() ) { /* Loop checking, 10.08.2015, A.Ribon */ G4InteractionContent& acollision = theParticipants.GetInteraction(); @@ -989,7 +983,7 @@ G4bool G4FTFModel::ExciteParticipants() { } G4VSplitableHadron* AdditionalString = 0; if ( theAnnihilation->Annihilate( projectile, target, AdditionalString, theParameters ) ) { - InnerSuccess = true; //Uzhi Aug.2019 + InnerSuccess = true; #ifdef debugBuildString G4cout << "Annihilation successfull. " << "*AdditionalString " << AdditionalString << G4endl; @@ -1017,7 +1011,7 @@ G4bool G4FTFModel::ExciteParticipants() { } } - if( InnerSuccess ) Success = true; //Uzhi Aug.2019 + if( InnerSuccess ) Success = true; #ifdef debugBuildString G4cout << "----------------------------- Final properties " << G4endl @@ -1122,8 +1116,9 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon, #ifdef debugAdjust G4cout << "Proj res Init " << ProjectileResidual4Momentum << G4endl << "Targ res Init " << TargetResidual4Momentum << G4endl - << "ProjectileResidualMassNumber ProjectileResidualCharge " - << ProjectileResidualMassNumber << " " << ProjectileResidualCharge << G4endl + << "ProjectileResidualMassNumber ProjectileResidualCharge (ProjectileResidualLambdaNumber)" + << ProjectileResidualMassNumber << " " << ProjectileResidualCharge + << " (" << ProjectileResidualLambdaNumber << ") " << G4endl << "TargetResidualMassNumber TargetResidualCharge " << TargetResidualMassNumber << " " << TargetResidualCharge << G4endl; #endif @@ -1197,8 +1192,6 @@ G4int G4FTFModel::AdjustNucleonsAlgorithm_beforeSampling( G4int interactionCase, common.TResidualMassNumber = TargetResidualMassNumber - 1; common.TResidualCharge = TargetResidualCharge - G4int( TargetNucleon->GetDefinition()->GetPDGCharge() ); - //common.TResidualExcitationEnergy = TargetResidualExcitationEnergy - // + ExcitationEnergyPerWoundedNucleon; common.TResidualExcitationEnergy = TargetResidualExcitationEnergy - ExcitationEnergyPerWoundedNucleon*G4Log( G4UniformRand() ); if ( common.TResidualMassNumber <= 1 ) { @@ -1219,8 +1212,6 @@ G4int G4FTFModel::AdjustNucleonsAlgorithm_beforeSampling( G4int interactionCase, common.TResidualMassNumber = ProjectileResidualMassNumber - 1; common.TResidualCharge = ProjectileResidualCharge - std::abs( G4int(ProjectileNucleon->GetDefinition()->GetPDGCharge()) ); - //common.TResidualExcitationEnergy = ProjectileResidualExcitationEnergy - // + ExcitationEnergyPerWoundedNucleon; common.TResidualExcitationEnergy = ProjectileResidualExcitationEnergy - ExcitationEnergyPerWoundedNucleon*G4Log( G4UniformRand() ); if ( common.TResidualMassNumber <= 1 ) { @@ -1243,23 +1234,30 @@ G4int G4FTFModel::AdjustNucleonsAlgorithm_beforeSampling( G4int interactionCase, common.PResidualMassNumber = ProjectileResidualMassNumber - 1; common.PResidualCharge = ProjectileResidualCharge - std::abs( G4int(ProjectileNucleon->GetDefinition()->GetPDGCharge()) ); - //common.PResidualExcitationEnergy = ProjectileResidualExcitationEnergy - // + ExcitationEnergyPerWoundedNucleon; + common.PResidualLambdaNumber = ProjectileResidualLambdaNumber; + if ( ProjectileNucleon->GetDefinition() == G4Lambda::Definition() || + ProjectileNucleon->GetDefinition() == G4AntiLambda::Definition() ) { + --common.PResidualLambdaNumber; + } common.PResidualExcitationEnergy = ProjectileResidualExcitationEnergy - ExcitationEnergyPerWoundedNucleon*G4Log( G4UniformRand() ); if ( common.PResidualMassNumber <= 1 ) { common.PResidualExcitationEnergy = 0.0; } if ( common.PResidualMassNumber != 0 ) { - common.PResidualMass = G4ParticleTable::GetParticleTable()->GetIonTable() - ->GetIonMass( common.PResidualCharge, common.PResidualMassNumber ); + if ( common.PResidualLambdaNumber > 0 ) { + common.PResidualMass = G4HyperNucleiProperties::GetNuclearMass( common.PResidualMassNumber, + common.PResidualCharge, + common.PResidualLambdaNumber ); + } else { + common.PResidualMass = G4ParticleTable::GetParticleTable()->GetIonTable() + ->GetIonMass( common.PResidualCharge, common.PResidualMassNumber ); + } } common.PNucleonMass = ProjectileNucleon->GetDefinition()->GetPDGMass(); // On-shell (anti-)nucleon mass common.TResidualMassNumber = TargetResidualMassNumber - 1; common.TResidualCharge = TargetResidualCharge - G4int( TargetNucleon->GetDefinition()->GetPDGCharge() ); - //common.TResidualExcitationEnergy = TargetResidualExcitationEnergy - // + ExcitationEnergyPerWoundedNucleon; common.TResidualExcitationEnergy = TargetResidualExcitationEnergy - ExcitationEnergyPerWoundedNucleon*G4Log( G4UniformRand() ); if ( common.TResidualMassNumber <= 1 ) { @@ -1442,11 +1440,13 @@ G4int G4FTFModel::AdjustNucleonsAlgorithm_beforeSampling( G4int interactionCase, if ( interactionCase == 2 ) { ProjectileResidualMassNumber = common.TResidualMassNumber; ProjectileResidualCharge = common.TResidualCharge; + ProjectileResidualLambdaNumber = 0; // The target nucleus and its residual are never hypernuclei ProjectileResidualExcitationEnergy = common.TResidualExcitationEnergy; common.Ptmp.setE( common.TResidualMass + ProjectileResidualExcitationEnergy ); } else { ProjectileResidualMassNumber = common.PResidualMassNumber; ProjectileResidualCharge = common.PResidualCharge; + ProjectileResidualLambdaNumber = common.PResidualLambdaNumber; ProjectileResidualExcitationEnergy = common.PResidualExcitationEnergy; //---AR-Jul2019 : To avoid unphysical projectile (anti-)fragments at rest, use the // saved original momentum of the anti-baryon (instead of setting 0). @@ -2007,10 +2007,12 @@ void G4FTFModel::BuildStrings( G4ExcitedStringVector* strings ) { if ( primaries[ahadron]->GetStatus() == 0 ) { theExcitation->CreateStrings( primaries[ ahadron ], isProjectile, FirstString, SecondString, theParameters ); + NumberOfProjectileSpectatorNucleons--; } else if ( primaries[ahadron]->GetStatus() == 1 && primaries[ahadron]->GetSoftCollisionCount() != 0 ) { theExcitation->CreateStrings( primaries[ ahadron ], isProjectile, FirstString, SecondString, theParameters ); + NumberOfProjectileSpectatorNucleons--; } else if ( primaries[ahadron]->GetStatus() == 1 && primaries[ahadron]->GetSoftCollisionCount() == 0 ) { G4LorentzVector ParticleMomentum=primaries[ahadron]->Get4Momentum(); @@ -2026,6 +2028,7 @@ void G4FTFModel::BuildStrings( G4ExcitedStringVector* strings ) { primaries[ahadron]->GetPosition(), ParticleMomentum ); FirstString = new G4ExcitedString( aTrack ); + NumberOfProjectileSpectatorNucleons--; } else { G4cout << "Something wrong in FTF Model Build String" << G4endl; } @@ -2089,6 +2092,7 @@ void G4FTFModel::BuildStrings( G4ExcitedStringVector* strings ) { theExcitation->CreateStrings( TheInvolvedNucleonsOfProjectile[ ahadron ]->GetSplitableHadron(), isProjectile, FirstString, SecondString, theParameters ); + NumberOfProjectileSpectatorNucleons--; } else if ( aProjectile->GetStatus() == 1 && aProjectile->GetSoftCollisionCount() != 0 ) { // Nucleon took part in diffractive interaction @@ -2099,6 +2103,7 @@ void G4FTFModel::BuildStrings( G4ExcitedStringVector* strings ) { theExcitation->CreateStrings( TheInvolvedNucleonsOfProjectile[ ahadron ]->GetSplitableHadron(), isProjectile, FirstString, SecondString, theParameters ); + NumberOfProjectileSpectatorNucleons--; } else if ( aProjectile->GetStatus() == 1 && aProjectile->GetSoftCollisionCount() == 0 && HighEnergyInter ) { // Nucleon was considered as a paricipant of an interaction, @@ -2139,6 +2144,7 @@ void G4FTFModel::BuildStrings( G4ExcitedStringVector* strings ) { G4cout << " Strings are build for involved nucleon." << G4endl; #endif + if ( aProjectile->GetStatus() == 2 ) NumberOfProjectileSpectatorNucleons--; } else { #ifdef debugBuildString @@ -2177,6 +2183,7 @@ void G4FTFModel::BuildStrings( G4ExcitedStringVector* strings ) { if ( aNucleon->GetStatus() == 0 ) { // A nucleon took part in non-diffractive interaction theExcitation->CreateStrings( aNucleon, isProjectile, FirstString, SecondString, theParameters ); + NumberOfTargetSpectatorNucleons--; #ifdef debugBuildString G4cout << " 1 case A string is build" << G4endl; @@ -2191,6 +2198,8 @@ void G4FTFModel::BuildStrings( G4ExcitedStringVector* strings ) { G4cout << " 2 case A string is build, nucleon was excited." << G4endl; #endif + NumberOfTargetSpectatorNucleons--; + } else if ( aNucleon->GetStatus() == 1 && aNucleon->GetSoftCollisionCount() == 0 && HighEnergyInter ) { // A nucleon was considered as a participant but due to annihilation @@ -2234,6 +2243,8 @@ void G4FTFModel::BuildStrings( G4ExcitedStringVector* strings ) { G4cout << "5 case A string is build" << G4endl; #endif + if ( aNucleon->GetStatus() == 2 ) NumberOfTargetSpectatorNucleons--; + } else { #ifdef debugBuildString @@ -2652,6 +2663,7 @@ ComputeNucleusProperties( G4V3DNucleus* nucleus, // input paramete // In this first evaluation of sumMasses, the excitation energy of the residual nucleus // (residualExcitationEnergy, estimated by adding a constant value to each involved // nucleon) is not taken into account. + G4int residualNumberOfLambdas = 0; // Projectile nucleus and its residual can be a hypernucleus G4Nucleon* aNucleon = 0; nucleus->StartLoop(); while ( ( aNucleon = nucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */ @@ -2671,11 +2683,16 @@ ComputeNucleusProperties( G4V3DNucleus* nucleus, // input paramete residualCharge -= std::abs( G4int( aNucleon->GetDefinition()->GetPDGCharge() ) ); } else { // Spectator nucleons residualMomentum += aNucleon->Get4Momentum(); + if ( aNucleon->GetDefinition() == G4Lambda::Definition() || + aNucleon->GetDefinition() == G4AntiLambda::Definition() ) { + ++residualNumberOfLambdas; + } } } #ifdef debugPutOnMassShell G4cout << "ExcitationEnergyPerWoundedNucleon " << ExcitationEnergyPerWoundedNucleon << G4endl - << "\t Residual Charge, MassNumber " << residualCharge << " " << residualMassNumber + << "\t Residual Charge, MassNumber (LambdaNumber" << residualCharge << " " + << residualMassNumber << " (" << residualNumberOfLambdas << ") " << G4endl << "\t Initial Momentum " << nucleusMomentum << G4endl << "\t Residual Momentum " << residualMomentum << G4endl; #endif @@ -2685,8 +2702,13 @@ ComputeNucleusProperties( G4V3DNucleus* nucleus, // input paramete residualMass = 0.0; residualExcitationEnergy = 0.0; } else { - residualMass = G4ParticleTable::GetParticleTable()->GetIonTable()-> - GetIonMass( residualCharge, residualMassNumber ); + if ( residualNumberOfLambdas > 0 ) { + residualMass = G4HyperNucleiProperties::GetNuclearMass( residualMassNumber, residualCharge, + residualNumberOfLambdas ); + } else { + residualMass = G4ParticleTable::GetParticleTable()->GetIonTable()-> + GetIonMass( residualCharge, residualMassNumber ); + } if ( residualMassNumber == 1 ) { residualExcitationEnergy = 0.0; } @@ -2731,6 +2753,9 @@ GenerateDeltaIsobar( const G4double sqrtS, // input parameter if ( G4UniformRand() < probDeltaIsobar && numberOfDeltas < maxNumberOfDeltas ) { numberOfDeltas++; if ( ! involvedNucleons[i] ) continue; + // Skip any eventual lambda (that can be present in a projectile hypernucleus) + if ( involvedNucleons[i]->GetDefinition() == G4Lambda::Definition() || + involvedNucleons[i]->GetDefinition() == G4AntiLambda::Definition() ) continue; G4VSplitableHadron* splitableHadron = involvedNucleons[i]->GetSplitableHadron(); G4double massNuc = std::sqrt( sqr( splitableHadron->GetDefinition()->GetPDGMass() ) + splitableHadron->Get4Momentum().perp2() ); @@ -2791,7 +2816,7 @@ SamplingNucleonKinematics( G4double averagePt2, // input param << " lv= " << pResidual << G4endl; #endif - if ( ! nucleus || numberOfInvolvedNucleons < 1) return false; + if ( ! nucleus || numberOfInvolvedNucleons < 1 ) return false; if ( residualMassNumber == 0 && numberOfInvolvedNucleons == 1 ) { dCor = 0.0; @@ -2801,7 +2826,7 @@ SamplingNucleonKinematics( G4double averagePt2, // input param G4bool success = true; G4double SumMasses = residualMass; - G4double invN = 1.0/(G4double)numberOfInvolvedNucleons; + G4double invN = 1.0 / (G4double)numberOfInvolvedNucleons; // to avoid problems due to precision lost a tolerance is added const G4double eps = 1.e-10; @@ -2870,7 +2895,7 @@ SamplingNucleonKinematics( G4double averagePt2, // input param if ( xSum < -eps || xSum > 1.0 + eps ) success = false; if ( ! success ) continue; - G4double delta = ( residualMassNumber == 0 ) ? std::min(xSum - 1.0, 0.0)*invN : 0.0; + G4double delta = ( residualMassNumber == 0 ) ? std::min( xSum - 1.0, 0.0 )*invN : 0.0; xSum = 1.0; mass2 = 0.0; @@ -2891,21 +2916,19 @@ SamplingNucleonKinematics( G4double averagePt2, // input param break; } } - x = std::min(1.0, std::max(x, eps)); + x = std::min( 1.0, std::max(x, eps) ); mass2 += sqr( aNucleon->Get4Momentum().e() ) / x; - G4LorentzVector tmp( aNucleon->Get4Momentum().px(), - aNucleon->Get4Momentum().py(), + G4LorentzVector tmp( aNucleon->Get4Momentum().px(), aNucleon->Get4Momentum().py(), x, aNucleon->Get4Momentum().e() ); aNucleon->SetMomentum( tmp ); } if ( ! success ) continue; - xSum = std::min(1.0, std::max(xSum, eps)); + xSum = std::min( 1.0, std::max(xSum, eps) ); - if ( residualMassNumber > 0 ) { - mass2 += ( sqr( residualMass ) + pResidual.perp2() ) / xSum; - } + if ( residualMassNumber > 0 ) mass2 += ( sqr( residualMass ) + pResidual.perp2() ) / xSum; + #ifdef debugPutOnMassShell G4cout << "success: " << success << " Mt(GeV)= " << std::sqrt( mass2 )/GeV << G4endl; diff --git a/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFParameters.cc b/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFParameters.cc index 24fbc7262b..c69de50ada 100644 --- a/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFParameters.cc +++ b/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFParameters.cc @@ -1113,20 +1113,8 @@ G4FTFSettingDefaultHDP FTFDefaultsHDP; G4FTFParamCollection::G4FTFParamCollection() { + // zero out everything - Reset(); // zero out everything - - // - // keep the 2 parameters below fixed for now (i.e. do not take them from HDP) - // - fNuclearProjDestructP2 = 4.0; - fNuclearProjDestructP3 = 2.1; - -} - - -void G4FTFParamCollection::Reset() -{ // parameters of excitation // Proc=0 --> Qexchg w/o excitation @@ -1147,12 +1135,27 @@ void G4FTFParamCollection::Reset() fProc1Atop = 0.; fProc1Ymin = 0.; - // Proc=2 & Proc=3 for ( AbsProjectileBaryonNumber > 1 || NumberOfTargetNucleons > 1 ) - // Do NOT do anything as it's set once and for all !!! - fProjDiffDissociation = false; fTgtDiffDissociation = false; + // Proc=2 --> Projectile diffraction + fProc2A1 = 0.; + fProc2B1 = 0.; + fProc2A2 = 0.; + fProc2B2 = 0.; + fProc2A3 = 0.; + fProc2Atop = 0.; + fProc2Ymin = 0.; + + // Proc=3 --> Target diffraction + fProc3A1 = 0.; + fProc3B1 = 0.; + fProc3A2 = 0.; + fProc3B2 = 0.; + fProc3A3 = 0.; + fProc3Atop = 0.; + fProc3Ymin = 0.; + // Proc=4 --> Qexchg w/additional multiplier in excitation fProc4A1 = 0.; fProc4B1 = 0.; @@ -1178,7 +1181,9 @@ void G4FTFParamCollection::Reset() // COMMONs fNuclearProjDestructP1 = 0.; + fNuclearProjDestructP1_NBRNDEP = false; fNuclearTgtDestructP1 = 0.; + fNuclearTgtDestructP1_ADEP = false; fNuclearProjDestructP2 = 0.; fNuclearProjDestructP3 = 0.; fNuclearTgtDestructP2 = 0.; @@ -1193,8 +1198,13 @@ void G4FTFParamCollection::Reset() fExciEnergyPerWoundedNucleon = 0.; fDofNuclearDestruct = 0.; fMaxPt2ofNuclearDestruct = 0.; - - return; + + // + // keep the 2 parameters below fixed for now (i.e. do not take them from HDP) + // + fNuclearProjDestructP2 = 4.0; + fNuclearProjDestructP3 = 2.1; + } //============================================================================ diff --git a/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFParticipants.cc b/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFParticipants.cc index 971bfeafff..92ef8c375a 100644 --- a/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFParticipants.cc +++ b/source/processes/hadronic/models/parton_string/diffraction/src/G4FTFParticipants.cc @@ -49,6 +49,7 @@ #include "G4FTFParameters.hh" #include "G4DiffractiveSplitableHadron.hh" #include "G4VSplitableHadron.hh" +#include "G4PhysicalConstants.hh" //============================================================================ @@ -58,7 +59,11 @@ //============================================================================ -G4FTFParticipants::G4FTFParticipants() : currentInteraction( -1 ) {} +G4FTFParticipants::G4FTFParticipants() : Bimpact( 0.0 ), BinInterval( false ), + Bmin2( -1.0 ), Bmax2( -1.0 ), + currentInteraction( -1 ) +{} + //============================================================================ @@ -87,6 +92,7 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary, if ( theProjectileNucleus == nullptr ) { // Hadron-nucleus or anti-baryon-nucleus interactions G4double impactX( 0.0 ), impactY( 0.0 ); + G4double B( 0.0 ), B2( 0.0 ); G4VSplitableHadron* primarySplitable = new G4DiffractiveSplitableHadron( thePrimary ); @@ -94,20 +100,29 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary, G4cout << "Hadron-nucleus or anti-baryon-nucleus interactions" << G4endl; #endif - G4double xyradius; - xyradius = theNucleus->GetOuterRadius() + deltaxy; // Range of impact parameter sampling + G4double xyradius = theNucleus->GetOuterRadius() + deltaxy; // Range of impact parameter sampling const G4int maxNumberOfLoops = 1000; G4int loopCounter = 0; do { std::pair< G4double, G4double > theImpactParameter; - theImpactParameter = theNucleus->ChooseImpactXandY( xyradius ); - impactX = theImpactParameter.first; - impactY = theImpactParameter.second; + if ( SampleBinInterval() ) { + B2 = GetBmin2() + G4UniformRand() * ( GetBmax2() - GetBmin2() ); + B = B2 > 0.0 ? std::sqrt( B2 ) : 0.0; + G4double Phi = twopi * G4UniformRand(); + impactX = B * std::cos( Phi ); + impactY = B * std::sin( Phi ); + SetImpactParameter( B ); + } else { + theImpactParameter = theNucleus->ChooseImpactXandY( xyradius ); + impactX = theImpactParameter.first; + impactY = theImpactParameter.second; + SetImpactParameter( std::sqrt( sqr(impactX) + sqr(impactY) ) ); + } #ifdef debugFTFparticipant - G4cout << "New interaction list," << " b= " + G4cout << "New interaction list," << " b[fm]= " << std::sqrt( sqr(impactX ) + sqr( impactY ) )/fermi << G4endl; #endif @@ -168,8 +183,8 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary, } #ifdef debugFTFparticipant - G4cout << "Number of Hit nucleons " << theInteractions.size() << "\t Bx " << impactX/fermi - << "\t By " << impactY/fermi << "\t B " + G4cout << "Number of Hit nucleons " << theInteractions.size() << "\t Bx[fm] " << impactX/fermi + << "\t By[fm] " << impactY/fermi << "\t B[fm] " << std::sqrt( sqr( impactX ) + sqr( impactY ) )/fermi << G4endl << G4endl; #endif @@ -187,23 +202,33 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary, //G4cout<GetOuterRadius()/fermi<<" "<GetOuterRadius()/fermi<<" "<GetOuterRadius() + // Range of impact parameter sampling - theNucleus->GetOuterRadius() + deltaxy; + // Range of impact parameter sampling + G4double xyradius = theProjectileNucleus->GetOuterRadius() + theNucleus->GetOuterRadius() + deltaxy; G4double impactX( 0.0 ), impactY( 0.0 ); + G4double B( 0.0 ), B2( 0.0 ); const G4int maxNumberOfLoops = 1000; G4int loopCounter = 0; do { std::pair< G4double, G4double > theImpactParameter; - theImpactParameter = theNucleus->ChooseImpactXandY( xyradius ); - impactX = theImpactParameter.first; - impactY = theImpactParameter.second; + if ( SampleBinInterval() ) { + B2 = GetBmin2() + G4UniformRand() * ( GetBmax2() - GetBmin2() ); + B = B2 > 0.0 ? std::sqrt( B2 ) : 0.0; // In G4 internal units (mm) + G4double Phi = twopi * G4UniformRand(); + impactX = B * std::cos( Phi ); + impactY = B * std::sin( Phi ); + SetImpactParameter( B ); + } else { + theImpactParameter = theNucleus->ChooseImpactXandY( xyradius ); + impactX = theImpactParameter.first; + impactY = theImpactParameter.second; + SetImpactParameter( std::sqrt( sqr(impactX) + sqr(impactY) ) ); + } #ifdef debugFTFparticipant - G4cout << "New interaction list, " << "b " + G4cout << "New interaction list, " << "b[fm] " << std::sqrt( sqr( impactX ) + sqr( impactY ) )/fermi << G4endl; #endif @@ -240,7 +265,7 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary, G4cout << G4endl << "An Interaction has happend" << G4endl << "Proj N mom " << PrNuclN << " " << ProjectileNucleon->Get4Momentum() << "-------------" << G4endl << "Targ N mom " << TrNuclN << " " << TargetNucleon->Get4Momentum() << G4endl - << "PrN TrN Z coords " << ProjectileNucleon->GetPosition().z()/fermi + << "PrN TrN Z coords [fm]" << ProjectileNucleon->GetPosition().z()/fermi << " " << TargetNucleon->GetPosition().z()/fermi << " " << ProjectileNucleon->GetPosition().z()/fermi + TargetNucleon->GetPosition().z()/fermi << G4endl; @@ -272,7 +297,7 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary, anInteraction->SetStatus( 1 ); #ifdef debugFTFparticipant - G4cout << "Part anInteraction->GetInteractionTime() " + G4cout << "Part anInteraction->GetInteractionTime() [fm] " << anInteraction->GetInteractionTime()/fermi << G4endl << "Splitable Pr* Tr* " << ProjectileSplitable << " " << TargetSplitable << G4endl; @@ -310,8 +335,8 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary, #ifdef debugFTFparticipant G4cout << G4endl << "Number of primary collisions " << theInteractions.size() - << "\t Bx " << impactX/fermi << "\t By " << impactY/fermi - << "\t B " << std::sqrt( sqr( impactX ) + sqr( impactY ) )/fermi << G4endl + << "\t Bx[fm] " << impactX/fermi << "\t By[fm] " << impactY/fermi + << "\t B[fm] " << std::sqrt( sqr( impactX ) + sqr( impactY ) )/fermi << G4endl << "FTF participant End. #######################" << G4endl << G4endl; #endif return; diff --git a/source/processes/hadronic/models/parton_string/management/History b/source/processes/hadronic/models/parton_string/management/History index 5b5946cb17..0454c579d7 100644 --- a/source/processes/hadronic/models/parton_string/management/History +++ b/source/processes/hadronic/models/parton_string/management/History @@ -14,7 +14,11 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- -16-Apr-2021 Ben Morgan hadr-partonstring-mgt-V10-07-01 +27-Oct-2021 A. Ribon hadr-partonstring-mgt-V10-07-02 +- G4VParticipants, G4VPartonStringModel : extended for projectile + hypernuclei and anti-hypernuclei + +16-Apr-2021 B. Morgan hadr-partonstring-mgt-V10-07-01 - Migrate build to modular CMake API 13-Apr-2021 A. Ribon hadr-partonstring-mgt-V10-07-00 diff --git a/source/processes/hadronic/models/parton_string/management/include/G4VParticipants.hh b/source/processes/hadronic/models/parton_string/management/include/G4VParticipants.hh index 3efdf19b1e..5107c233c8 100644 --- a/source/processes/hadronic/models/parton_string/management/include/G4VParticipants.hh +++ b/source/processes/hadronic/models/parton_string/management/include/G4VParticipants.hh @@ -58,7 +58,8 @@ class G4VParticipants virtual void SetNucleus(G4V3DNucleus* aNucleus); virtual G4V3DNucleus* GetWoundedNucleus() const; - virtual void InitProjectileNucleus(G4int theZ, G4int theA); + virtual void InitProjectileNucleus(G4int theZ, G4int theA, + G4int numberOfLambdasOrAntiLambdas = 0); virtual void SetProjectileNucleus(G4V3DNucleus* aNucleus); virtual G4V3DNucleus* GetProjectileNucleus() const; diff --git a/source/processes/hadronic/models/parton_string/management/src/G4VParticipants.cc b/source/processes/hadronic/models/parton_string/management/src/G4VParticipants.cc index 7d0e338d0a..40736846d7 100644 --- a/source/processes/hadronic/models/parton_string/management/src/G4VParticipants.cc +++ b/source/processes/hadronic/models/parton_string/management/src/G4VParticipants.cc @@ -64,12 +64,13 @@ void G4VParticipants::SetNucleus(G4V3DNucleus * aNucleus) theNucleus = aNucleus; } -void G4VParticipants::InitProjectileNucleus(G4int theA, G4int theZ) +void G4VParticipants::InitProjectileNucleus(G4int theA, G4int theZ, + G4int numberOfLambdasOrAntiLambdas) { if ( theProjectileNucleus == nullptr ) theProjectileNucleus = new G4Fancy3DNucleus(); - theProjectileNucleus->Init(theA, theZ); + theProjectileNucleus->Init(theA, theZ, numberOfLambdasOrAntiLambdas); theProjectileNucleus->SortNucleonsDecZ(); } diff --git a/source/processes/hadronic/models/parton_string/management/src/G4VPartonStringModel.cc b/source/processes/hadronic/models/parton_string/management/src/G4VPartonStringModel.cc index 99942e526a..3b2a90fd11 100644 --- a/source/processes/hadronic/models/parton_string/management/src/G4VPartonStringModel.cc +++ b/source/processes/hadronic/models/parton_string/management/src/G4VPartonStringModel.cc @@ -161,9 +161,9 @@ G4KineticTrackVector * G4VPartonStringModel::Scatter(const G4Nucleus &theNucleus #ifdef debug_heavyHadrons // Check charm and bottom numbers of the projectile: G4int count_charm_projectile = thePrimary.GetDefinition()->GetQuarkContent( 4 ) - - thePrimary.GetDefinition()->GetAntiQuarkContent( 4 ); + thePrimary.GetDefinition()->GetAntiQuarkContent( 4 ); G4int count_bottom_projectile = thePrimary.GetDefinition()->GetQuarkContent( 5 ) - - thePrimary.GetDefinition()->GetAntiQuarkContent( 5 ); + thePrimary.GetDefinition()->GetAntiQuarkContent( 5 ); G4int count_charm_strings = 0, count_bottom_strings = 0; G4int count_charm_hadrons = 0, count_bottom_hadrons = 0; #endif @@ -250,40 +250,57 @@ G4KineticTrackVector * G4VPartonStringModel::Scatter(const G4Nucleus &theNucleus G4double ExcitationEt(0.), ExcitationEp(0.); #endif + // We assume that the target nucleus is never a hypernucleus, whereas + // the projectile nucleus can be a light hypernucleus or anti-hypernucleus. + G4V3DNucleus * ProjResNucleus = GetProjectileNucleus(); G4int numberProtonProjectileResidual( 0 ), numberNeutronProjectileResidual( 0 ); + G4int numberLambdaProjectileResidual( 0 ); if(ProjResNucleus != 0) { theNuclNucleon = ProjResNucleus->StartLoop() ? ProjResNucleus->GetNextNucleon() : nullptr; G4int numberProtonProjectileHits( 0 ), numberNeutronProjectileHits( 0 ); + G4int numberLambdaProjectileHits( 0 ); while( theNuclNucleon ) { if(theNuclNucleon->AreYouHit()) { G4LorentzVector tmp=toLab*theNuclNucleon->Get4Momentum(); + const G4ParticleDefinition* def = theNuclNucleon->GetDefinition(); #ifdef debug_PartonStringModel ProjectileResidual4Momentum += tmp; hitsP++; - if ( theNuclNucleon->GetDefinition() == G4Proton::Proton() ) ++charged_hitsP; + if ( def == G4Proton::Definition() || def == G4AntiProton::Definition() ) ++charged_hitsP; ExcitationEp +=theNuclNucleon->GetBindingEnergy(); #endif theNuclNucleon->SetMomentum(tmp); - if ( theNuclNucleon->GetDefinition() == G4Proton::Proton() ) ++numberProtonProjectileHits; - if ( theNuclNucleon->GetDefinition() == G4Neutron::Neutron() ) ++numberNeutronProjectileHits; + if ( def == G4Proton::Definition() || def == G4AntiProton::Definition() ) ++numberProtonProjectileHits; + if ( def == G4Neutron::Definition() || def == G4AntiNeutron::Definition() ) ++numberNeutronProjectileHits; + if ( def == G4Lambda::Definition() || def == G4AntiLambda::Definition() ) ++numberLambdaProjectileHits; } theNuclNucleon = ProjResNucleus->GetNextNucleon(); } + G4int numberLambdaProjectile = 0; + if ( thePrimary.GetDefinition()->IsHypernucleus() ) { + numberLambdaProjectile = thePrimary.GetDefinition()->GetNumberOfLambdasInHypernucleus(); + } else if ( thePrimary.GetDefinition()->IsAntiHypernucleus() ) { + numberLambdaProjectile = thePrimary.GetDefinition()->GetNumberOfAntiLambdasInAntiHypernucleus(); + } #ifdef debug_PartonStringModel - G4cout<<"Projectile residual A, Z and E* " + G4cout<<"Projectile residual A, Z (numberOfLambdasOrAntiLambdas) and E* " <GetBaryonNumber() - hitsP<<" " - <GetPDGCharge() - charged_hitsP<<" " + <GetPDGCharge() - charged_hitsP<<" (" + << numberLambdaProjectile - numberLambdaProjectileHits << ") " <GetPDGCharge() - numberProtonProjectileHits; - numberNeutronProjectileResidual = thePrimary.GetDefinition()->GetBaryonNumber() - - thePrimary.GetDefinition()->GetPDGCharge() - numberNeutronProjectileHits; + numberProtonProjectileResidual = std::max( std::abs( G4int( thePrimary.GetDefinition()->GetPDGCharge() ) ) - + numberProtonProjectileHits, 0 ); + numberLambdaProjectileResidual = std::max( numberLambdaProjectile - numberLambdaProjectileHits, 0 ); + numberNeutronProjectileResidual = std::max( std::abs( thePrimary.GetDefinition()->GetBaryonNumber() ) - + std::abs( G4int( thePrimary.GetDefinition()->GetPDGCharge() ) ) - + numberLambdaProjectile - numberNeutronProjectileHits, 0 ); } G4V3DNucleus * ResNucleus = GetWoundedNucleus(); @@ -335,8 +352,24 @@ G4KineticTrackVector * G4VPartonStringModel::Scatter(const G4Nucleus &theNucleus //G4cout << "***UNPHYSICAL TARGET RESIDUAL*** Z=" << numberProtonTargetResidual // << " ; N=" << numberNeutronTargetResidual; } + // The projectile residual can be a hypernucleus or anti-hypernucleus: + // only the following combinations are currently allowed in Geant4: + // p-n-lambda (hypertriton), p-n-n-lambda (hyperH4), p-p-n-lambda (hyperAlpha), + // p-p-n-n-lambda (hyperHe5), n-n-lambda-lambda (doublehyperdoubleneutron), + // p-n-lambda-lambda (doubleHyperH4) if ( ( numberProtonProjectileResidual > 3 && numberNeutronProjectileResidual == 0 ) || - ( numberProtonProjectileResidual == 0 && numberNeutronProjectileResidual > 1 ) ) { + ( numberProtonProjectileResidual == 0 && numberNeutronProjectileResidual > 1 && + numberLambdaProjectileResidual == 0 ) || + ( numberProtonProjectileResidual == 0 && numberNeutronProjectileResidual <= 1 && + numberLambdaProjectileResidual > 0 ) || + ( numberProtonProjectileResidual == 0 && numberNeutronProjectileResidual > 2 && + numberLambdaProjectileResidual > 0 ) || + ( numberLambdaProjectileResidual > 2 ) || + ( numberProtonProjectileResidual > 0 && numberNeutronProjectileResidual == 0 && + numberLambdaProjectileResidual > 0 ) || + ( numberProtonProjectileResidual > 1 && numberNeutronProjectileResidual > 1 && + numberLambdaProjectileResidual > 1 ) + ) { unphysicalResidual = true; //G4cout << "***UNPHYSICAL PROJECTILE RESIDUAL*** Z=" << numberProtonProjectileResidual // << " ; N=" << numberNeutronProjectileResidual; diff --git a/source/processes/hadronic/models/parton_string/qgsm/History b/source/processes/hadronic/models/parton_string/qgsm/History index e6bd21bbd7..7d58902bbd 100644 --- a/source/processes/hadronic/models/parton_string/qgsm/History +++ b/source/processes/hadronic/models/parton_string/qgsm/History @@ -14,6 +14,10 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +13-Jul-2021 Alberto Ribon (hadr-qgsm-V10-07-02) +- G4QGSParticipants : improved initialization in the constructors, + as suggested by Coverity. + 16-Apr-2021 Ben Morgan (hadr-qgsm-V10-07-01) - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/parton_string/qgsm/src/G4QGSParticipants.cc b/source/processes/hadronic/models/parton_string/qgsm/src/G4QGSParticipants.cc index 3b66e46fe3..a3c1cd2464 100644 --- a/source/processes/hadronic/models/parton_string/qgsm/src/G4QGSParticipants.cc +++ b/source/processes/hadronic/models/parton_string/qgsm/src/G4QGSParticipants.cc @@ -46,13 +46,27 @@ // Promoting model parameters from local variables class properties G4ThreadLocal G4int G4QGSParticipants_NPart = 0; -G4QGSParticipants::G4QGSParticipants() : theDiffExcitaton(), - ModelMode(SOFT), - nCutMax(7),ThresholdParameter(0.000*GeV), - QGSMThreshold(3*GeV),theNucleonRadius(1.5*fermi),alpha(-0.5),beta(2.5) +G4QGSParticipants::G4QGSParticipants() + : theDiffExcitaton(), ModelMode(SOFT), nCutMax(7), + ThresholdParameter(0.0*GeV), QGSMThreshold(3.0*GeV), + theNucleonRadius(1.5*fermi), theCurrentVelocity(G4ThreeVector()), + theProjectileSplitable(nullptr), Regge(nullptr), + InteractionMode(ALL), alpha(-0.5), beta(2.5), sigmaPt(0.0), + NumberOfInvolvedNucleonsOfTarget(0), NumberOfInvolvedNucleonsOfProjectile(0), + ProjectileResidual4Momentum(G4LorentzVector()), ProjectileResidualMassNumber(0), + ProjectileResidualCharge(0), ProjectileResidualExcitationEnergy(0.0), + TargetResidual4Momentum(G4LorentzVector()), TargetResidualMassNumber(0), + TargetResidualCharge(0), TargetResidualExcitationEnergy(0.0), + CofNuclearDestruction(0.0), R2ofNuclearDestruction(0.0), + ExcitationEnergyPerWoundedNucleon(0.0), DofNuclearDestruction(0.0), + Pt2ofNuclearDestruction(0.0), MaxPt2ofNuclearDestruction(0.0) { + for (size_t i=0; i < 250; ++i) { + TheInvolvedNucleonsOfTarget[i] = nullptr; + TheInvolvedNucleonsOfProjectile[i] = nullptr; + } // Parameters setting - SetCofNuclearDestruction(1.); + SetCofNuclearDestruction( 1.0 ); SetR2ofNuclearDestruction( 1.5*fermi*fermi ); SetDofNuclearDestruction( 0.3 ); SetPt2ofNuclearDestruction( 0.075*GeV*GeV ); @@ -63,10 +77,36 @@ G4QGSParticipants::G4QGSParticipants() : theDiffExcitaton(), } G4QGSParticipants::G4QGSParticipants(const G4QGSParticipants &right) -: G4VParticipants(),ModelMode(right.ModelMode), nCutMax(right.nCutMax), - ThresholdParameter(right.ThresholdParameter), QGSMThreshold(right.QGSMThreshold), - theNucleonRadius(right.theNucleonRadius) -{} + : G4VParticipants(), ModelMode(right.ModelMode), nCutMax(right.nCutMax), + ThresholdParameter(right.ThresholdParameter), + QGSMThreshold(right.QGSMThreshold), + theNucleonRadius(right.theNucleonRadius), + theCurrentVelocity(right.theCurrentVelocity), + theProjectileSplitable(right.theProjectileSplitable), + Regge(right.Regge), InteractionMode(right.InteractionMode), + alpha(right.alpha), beta(right.beta), sigmaPt(right.sigmaPt), + NumberOfInvolvedNucleonsOfTarget(right.NumberOfInvolvedNucleonsOfTarget), + NumberOfInvolvedNucleonsOfProjectile(right.NumberOfInvolvedNucleonsOfProjectile), + ProjectileResidual4Momentum(right.ProjectileResidual4Momentum), + ProjectileResidualMassNumber(right.ProjectileResidualMassNumber), + ProjectileResidualCharge(right.ProjectileResidualCharge), + ProjectileResidualExcitationEnergy(right.ProjectileResidualExcitationEnergy), + TargetResidual4Momentum(right.TargetResidual4Momentum), + TargetResidualMassNumber(right.TargetResidualMassNumber), + TargetResidualCharge(right.TargetResidualCharge), + TargetResidualExcitationEnergy(right.TargetResidualExcitationEnergy), + CofNuclearDestruction(right.CofNuclearDestruction), + R2ofNuclearDestruction(right.R2ofNuclearDestruction), + ExcitationEnergyPerWoundedNucleon(right.ExcitationEnergyPerWoundedNucleon), + DofNuclearDestruction(right.DofNuclearDestruction), + Pt2ofNuclearDestruction(right.Pt2ofNuclearDestruction), + MaxPt2ofNuclearDestruction(right.MaxPt2ofNuclearDestruction) +{ + for (size_t i=0; i < 250; ++i) { + TheInvolvedNucleonsOfTarget[i] = right.TheInvolvedNucleonsOfTarget[i]; + TheInvolvedNucleonsOfProjectile[i] = right.TheInvolvedNucleonsOfProjectile[i]; + } +} G4QGSParticipants::~G4QGSParticipants() {} diff --git a/source/processes/hadronic/models/pre_equilibrium/History b/source/processes/hadronic/models/pre_equilibrium/History index a3401861dc..918e34a4b3 100644 --- a/source/processes/hadronic/models/pre_equilibrium/History +++ b/source/processes/hadronic/models/pre_equilibrium/History @@ -14,6 +14,24 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +01-November-2021 V.Ivanchenko hadr-pre-V10-07-05 +- G4LowEIonFragmentation - fixed main memory leak reported by Coverity + +01-October-2021 V.Ivanchenko hadr-pre-V10-07-04 +- G4LowEIonFragmentation - fixed minor memory leak at exit +- G4PreCompoundModel - removed obsolete methods; improved code format; + fixed minor memory leak at exit +- G4PreCompound* classes - improved formats and add C++11 keywords + +30-September-2021 V.Ivanchenko hadr-pre-V10-07-03 +- G4LowEIonFragmentation - fixed Coverity warning and clean-up + +04-August-2021 A. Ribon hadr-pre-V10-07-02 +- G4PreCompoundModel, G4LowEGammaNuclearModel : migrated to the new version + of G4PhysicsModelCatalog +- G4PreCompoundEmission, G4LowEIonFragmentation : set creator model ID + for secondaries, using the new version of G4PhysicsModelCatalog + 16-April-2021 B. Morgan hadr-pre-V10-07-01 - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4LowEGammaNuclearModel.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4LowEGammaNuclearModel.hh index fa231ae498..51daca3d27 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4LowEGammaNuclearModel.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4LowEGammaNuclearModel.hh @@ -65,6 +65,7 @@ private: G4PreCompoundModel* fPreco; G4LorentzVector lab4mom; + G4int secID; // Creator model ID for the secondaries created by this model }; #endif diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4LowEIonFragmentation.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4LowEIonFragmentation.hh index cb93e25bd6..d4ad55baf6 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4LowEIonFragmentation.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4LowEIonFragmentation.hh @@ -50,14 +50,12 @@ class G4LowEIonFragmentation : public G4HadronicInteraction { public: - G4LowEIonFragmentation(G4ExcitationHandler * const value); - - G4LowEIonFragmentation(); + G4LowEIonFragmentation(G4ExcitationHandler * const value = nullptr); virtual ~G4LowEIonFragmentation(); - virtual G4HadFinalState * ApplyYourself(const G4HadProjectile & thePrimary, - G4Nucleus & theNucleus); + G4HadFinalState * ApplyYourself(const G4HadProjectile & thePrimary, + G4Nucleus & theNucleus) override; inline G4double GetCrossSection() { @@ -67,26 +65,24 @@ public: return area*hits/(static_cast(totalTries)*CLHEP::millibarn); } + G4LowEIonFragmentation(const G4LowEIonFragmentation &) = delete; + const G4LowEIonFragmentation& operator= + (const G4LowEIonFragmentation &right) = delete; + G4bool operator==(const G4LowEIonFragmentation &right) const = delete; + G4bool operator!=(const G4LowEIonFragmentation &right) const = delete; + private: - - G4LowEIonFragmentation(const G4LowEIonFragmentation &); - const G4LowEIonFragmentation& operator=(const G4LowEIonFragmentation &right); - G4bool operator==(const G4LowEIonFragmentation &right) const; - G4bool operator!=(const G4LowEIonFragmentation &right) const; - - // Members G4HadFinalState theResult; const G4ParticleDefinition* proton; - G4PreCompoundModel * theModel; - G4ExcitationHandler * theHandler; + G4PreCompoundModel * theModel = nullptr; + G4ExcitationHandler * theHandler = nullptr; -private: - - G4int hits; - G4int totalTries; - G4double area; + G4int hits = 0; + G4int totalTries = 1; + G4int secID = -1; // ID for the secondaries created by this model + G4double area = 0.0; }; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundAlpha.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundAlpha.hh index 18e9d5b8db..01f637ee4d 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundAlpha.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundAlpha.hh @@ -46,23 +46,24 @@ public: virtual ~G4PreCompoundAlpha(); - virtual G4double GetRj(G4int NumberParticles, G4int NumberCharged) const; + G4PreCompoundAlpha(const G4PreCompoundAlpha &right) = delete; + const G4PreCompoundAlpha& + operator= (const G4PreCompoundAlpha &right) = delete; + G4bool operator==(const G4PreCompoundAlpha &right) const = delete; + G4bool operator!=(const G4PreCompoundAlpha &right) const = delete; - virtual G4double FactorialFactor(G4int N, G4int P) const; +protected: - virtual G4double CoalescenceFactor(G4int A) const; + G4double GetRj(G4int NumberParticles, G4int NumberCharged) const override; - virtual G4double GetAlpha() const; + G4double FactorialFactor(G4int N, G4int P) const override; + + G4double CoalescenceFactor(G4int A) const override; + + G4double GetAlpha() const override; private: - // operators - G4PreCompoundAlpha(const G4PreCompoundAlpha &right); - const G4PreCompoundAlpha& - operator= (const G4PreCompoundAlpha &right); - G4bool operator==(const G4PreCompoundAlpha &right) const; - G4bool operator!=(const G4PreCompoundAlpha &right) const; - G4AlphaCoulombBarrier theAlphaCoulombBarrier; }; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundDeuteron.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundDeuteron.hh index 38ebace3fd..ca6887a945 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundDeuteron.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundDeuteron.hh @@ -44,24 +44,25 @@ public: G4PreCompoundDeuteron(); - ~G4PreCompoundDeuteron(); + virtual ~G4PreCompoundDeuteron(); - virtual G4double GetRj(G4int NumberParticles, G4int NumberCharged) const; - - virtual G4double FactorialFactor(G4int N, G4int P) const; - - virtual G4double CoalescenceFactor(G4int A) const; - - virtual G4double GetAlpha() const; - -private: - - // operators - G4PreCompoundDeuteron(const G4PreCompoundDeuteron &right); + G4PreCompoundDeuteron(const G4PreCompoundDeuteron &right) = delete; const G4PreCompoundDeuteron& - operator= (const G4PreCompoundDeuteron &right); - G4bool operator==(const G4PreCompoundDeuteron &right) const; - G4bool operator!=(const G4PreCompoundDeuteron &right) const; + operator= (const G4PreCompoundDeuteron &right) = delete; + G4bool operator==(const G4PreCompoundDeuteron &right) const = delete; + G4bool operator!=(const G4PreCompoundDeuteron &right) const = delete; + +protected: + + G4double GetRj(G4int NumberParticles, G4int NumberCharged) const override; + + G4double FactorialFactor(G4int N, G4int P) const override; + + G4double CoalescenceFactor(G4int A) const override; + + G4double GetAlpha() const override; + +private: G4DeuteronCoulombBarrier theDeuteronCoulombBarrier; }; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundEmission.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundEmission.hh index e25e800898..3bdefa62c6 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundEmission.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundEmission.hh @@ -97,6 +97,8 @@ private: // Momentum of emitted fragment G4ThreeVector theFinalMomentum; G4bool fUseAngularGenerator; + + G4int fModelID; }; inline G4double diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundEmissionFactory.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundEmissionFactory.hh index efddf19624..c981e81f5e 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundEmissionFactory.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundEmissionFactory.hh @@ -23,8 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// -// #ifndef G4PreCompoundEmissionFactory_hh #define G4PreCompoundEmissionFactory_hh @@ -38,18 +36,16 @@ public: G4PreCompoundEmissionFactory(); virtual ~G4PreCompoundEmissionFactory(); + G4PreCompoundEmissionFactory(const G4PreCompoundEmissionFactory&) = delete; + const G4PreCompoundEmissionFactory & operator= + (const G4PreCompoundEmissionFactory & val) = delete; + G4bool operator==(const G4PreCompoundEmissionFactory & val) const = delete; + G4bool operator!=(const G4PreCompoundEmissionFactory & val) const = delete; + protected: virtual std::vector * CreateFragmentVector(); -private: - - G4PreCompoundEmissionFactory(const G4PreCompoundEmissionFactory & ); - const G4PreCompoundEmissionFactory & operator= - (const G4PreCompoundEmissionFactory & val); - G4bool operator==(const G4PreCompoundEmissionFactory & val) const; - G4bool operator!=(const G4PreCompoundEmissionFactory & val) const; - }; #endif diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundFragment.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundFragment.hh index 71492c2114..359507ea74 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundFragment.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundFragment.hh @@ -55,37 +55,32 @@ public: // Calculates the total (integrated over kinetic energy) emission // probability of a fragment - G4double CalcEmissionProbability(const G4Fragment & aFragment); + G4double CalcEmissionProbability(const G4Fragment & aFragment) override; - G4double SampleKineticEnergy(const G4Fragment & aFragment); + G4double SampleKineticEnergy(const G4Fragment & aFragment) override; -protected: - - virtual G4double GetAlpha() const = 0; - - virtual G4double GetBeta() const = 0; - - G4double CrossSection(G4double ekin) const; - - virtual G4double - ProbabilityDistributionFunction(G4double K, - const G4Fragment & aFragment) = 0; - -private: - // This method performs integration for probability function over - // fragment kinetic energy - G4double IntegrateEmissionProbability(G4double Low, G4double Up, - const G4Fragment & aFragment); - - G4double GetOpt0(G4double ekin) const; - - // operators G4PreCompoundFragment(const G4PreCompoundFragment &right) = delete; const G4PreCompoundFragment& operator= (const G4PreCompoundFragment &right) = delete; G4bool operator==(const G4PreCompoundFragment &right) const = delete; G4bool operator!=(const G4PreCompoundFragment &right) const = delete; +protected: + + G4double CrossSection(G4double ekin) const; + + virtual G4double + ProbabilityDistributionFunction(G4double ekin, + const G4Fragment & aFragment) = 0; + +private: + // This method performs integration for probability function over + // fragment kinetic energy + G4double IntegrateEmissionProbability(G4double low, G4double up, + const G4Fragment & aFragment); + + G4double GetOpt0(G4double ekin) const; + G4int index; G4double muu; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundHe3.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundHe3.hh index 504be2398a..fe796ce4bb 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundHe3.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundHe3.hh @@ -46,23 +46,24 @@ public: virtual ~G4PreCompoundHe3(); - virtual G4double GetRj(G4int NumberParticles, G4int NumberCharged) const; + G4PreCompoundHe3(const G4PreCompoundHe3 &right) = delete; + const G4PreCompoundHe3& + operator= (const G4PreCompoundHe3 &right) = delete; + G4bool operator==(const G4PreCompoundHe3 &right) const = delete; + G4bool operator!=(const G4PreCompoundHe3 &right) const = delete; - virtual G4double FactorialFactor(G4int N, G4int P) const; +protected: - virtual G4double CoalescenceFactor(G4int A) const; + G4double GetRj(G4int NumberParticles, G4int NumberCharged) const override; - virtual G4double GetAlpha() const; + G4double FactorialFactor(G4int N, G4int P) const override; + + G4double CoalescenceFactor(G4int A) const override; + + G4double GetAlpha() const override; private: - // operators - G4PreCompoundHe3(const G4PreCompoundHe3 &right); - const G4PreCompoundHe3& - operator= (const G4PreCompoundHe3 &right); - G4bool operator==(const G4PreCompoundHe3 &right) const; - G4bool operator!=(const G4PreCompoundHe3 &right) const; - G4He3CoulombBarrier theHe3CoulombBarrier; }; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundIon.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundIon.hh index b7bc2dbbcc..a7f0d63efe 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundIon.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundIon.hh @@ -47,31 +47,27 @@ public: virtual ~G4PreCompoundIon(); + G4PreCompoundIon(const G4PreCompoundIon &right) = delete; + const G4PreCompoundIon& operator = + (const G4PreCompoundIon &right) = delete; + G4bool operator==(const G4PreCompoundIon &right) const = delete; + G4bool operator!=(const G4PreCompoundIon &right) const = delete; + protected: + G4double ProbabilityDistributionFunction(G4double eKin, + const G4Fragment&) override; + + G4double GetBeta() const override; + virtual G4double GetRj(G4int NumberParticles, G4int NumberCharged) const = 0; - - virtual G4double GetBeta() const; - virtual G4double - ProbabilityDistributionFunction(G4double eKin, - const G4Fragment& aFragment); - virtual G4double FactorialFactor(G4int N, G4int P) const = 0; virtual G4double CoalescenceFactor(G4int A) const = 0; private: - // default constructor - G4PreCompoundIon(); - // operators - G4PreCompoundIon(const G4PreCompoundIon &right); - const G4PreCompoundIon& - operator= (const G4PreCompoundIon &right); - G4bool operator==(const G4PreCompoundIon &right) const; - G4bool operator!=(const G4PreCompoundIon &right) const; - G4double fact; }; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundModel.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundModel.hh index af14a7f352..0aa337dde6 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundModel.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundModel.hh @@ -79,69 +79,46 @@ public: virtual void ModelDescription(std::ostream& outFile) const final; virtual void DeExciteModelDescription(std::ostream& outFile) const final; - //====== obsolete Set methods ======= - void UseHETCEmission(); - void UseDefaultEmission(); - void UseGNASHTransition(); - void UseDefaultTransition(); - - //for cross section selection - void SetOPTxs(G4int opt); - - //for the rest of external choices - void UseSICB(); - void UseNGB(); - void UseSCO(); - void UseCEMtr(); - //====================================== - private: inline void PerformEquilibriumEmission(const G4Fragment & aFragment, - G4ReactionProductVector * theResult) const; - - void PrintWarning(const G4String& mname); + G4ReactionProductVector * result) const; G4PreCompoundModel(const G4PreCompoundModel &) = delete; const G4PreCompoundModel& operator=(const G4PreCompoundModel &right) = delete; G4bool operator==(const G4PreCompoundModel &right) const = delete; G4bool operator!=(const G4PreCompoundModel &right) const = delete; - //============== - // Data Members - //============== - - G4PreCompoundEmission* theEmission; - G4VPreCompoundTransitions* theTransition; - G4NuclearLevelData* fNuclData; + G4PreCompoundEmission* theEmission = nullptr; + G4VPreCompoundTransitions* theTransition = nullptr; + G4NuclearLevelData* fNuclData = nullptr; const G4ParticleDefinition* proton; const G4ParticleDefinition* neutron; - G4double fLowLimitExc; - G4double fHighLimitExc; + G4double fLowLimitExc = 0.0; + G4double fHighLimitExc = DBL_MAX; - //for the rest of external choices - G4bool useSCO; - G4bool isInitialised; - G4bool isActive; + G4bool useSCO = false; + G4bool isInitialised = false; + G4bool isActive = true; - G4int minZ; - G4int minA; + G4int minZ = 3; + G4int minA = 5; + G4int modelID = -1; G4HadFinalState theResult; - }; -inline void -G4PreCompoundModel::PerformEquilibriumEmission(const G4Fragment & aFragment, - G4ReactionProductVector * Result) const +inline void G4PreCompoundModel::PerformEquilibriumEmission( + const G4Fragment & aFragment, + G4ReactionProductVector * result) const { - G4ReactionProductVector* theEquilibriumResult = + G4ReactionProductVector* deexResult = GetExcitationHandler()->BreakItUp(aFragment); - Result->insert(Result->end(),theEquilibriumResult->begin(), theEquilibriumResult->end()); - delete theEquilibriumResult; + result->insert(result->end(),deexResult->begin(), deexResult->end()); + delete deexResult; } #endif diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundNeutron.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundNeutron.hh index 0b13e37036..703a0be2d5 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundNeutron.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundNeutron.hh @@ -46,21 +46,22 @@ public: virtual ~G4PreCompoundNeutron(); - virtual G4double GetRj(G4int NumberParticles, G4int NumberCharged) const; + G4PreCompoundNeutron(const G4PreCompoundNeutron &right) = delete; + const G4PreCompoundNeutron& + operator= (const G4PreCompoundNeutron &right) = delete; + G4bool operator==(const G4PreCompoundNeutron &right) const = delete; + G4bool operator!=(const G4PreCompoundNeutron &right) const = delete; - virtual G4double GetAlpha() const; +protected: - virtual G4double GetBeta() const; + G4double GetRj(G4int NumberParticles, G4int NumberCharged) const override; + + G4double GetAlpha() const override; + + G4double GetBeta() const override; private: - // operators - G4PreCompoundNeutron(const G4PreCompoundNeutron &right); - const G4PreCompoundNeutron& - operator= (const G4PreCompoundNeutron &right); - G4bool operator==(const G4PreCompoundNeutron &right) const; - G4bool operator!=(const G4PreCompoundNeutron &right) const; - G4NeutronCoulombBarrier theNeutronCoulombBarrier; }; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundNucleon.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundNucleon.hh index 29b8de2879..bb1d14c6e6 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundNucleon.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundNucleon.hh @@ -45,25 +45,19 @@ public: G4VCoulombBarrier * aCoulombBarrier); virtual ~G4PreCompoundNucleon(); - + + G4PreCompoundNucleon(const G4PreCompoundNucleon &right) = delete; + const G4PreCompoundNucleon& + operator= (const G4PreCompoundNucleon &right) = delete; + G4bool operator==(const G4PreCompoundNucleon &right) const = delete; + G4bool operator!=(const G4PreCompoundNucleon &right) const = delete; + protected: + G4double ProbabilityDistributionFunction(G4double eKin, + const G4Fragment&) override; virtual G4double - ProbabilityDistributionFunction(G4double eKin, - const G4Fragment& aFragment); - - virtual G4double - GetRj(G4int NumberParticles, G4int NumberCharged) const = 0; - -private: - - G4PreCompoundNucleon(); - G4PreCompoundNucleon(const G4PreCompoundNucleon &right); - const G4PreCompoundNucleon& - operator= (const G4PreCompoundNucleon &right); - G4bool operator==(const G4PreCompoundNucleon &right) const; - G4bool operator!=(const G4PreCompoundNucleon &right) const; - + GetRj(G4int NumberParticles, G4int NumberCharged) const = 0; }; #endif diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundProton.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundProton.hh index 2d9f245b19..e95931275f 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundProton.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundProton.hh @@ -46,21 +46,22 @@ public: virtual ~G4PreCompoundProton(); - virtual G4double GetRj(G4int NumberParticles, G4int NumberCharged) const; + G4PreCompoundProton(const G4PreCompoundProton &right) = delete; + const G4PreCompoundProton& + operator= (const G4PreCompoundProton &right) = delete; + G4bool operator==(const G4PreCompoundProton &right) const = delete; + G4bool operator!=(const G4PreCompoundProton &right) const = delete; - virtual G4double GetAlpha() const; +protected: - virtual G4double GetBeta() const; + G4double GetRj(G4int NumberParticles, G4int NumberCharged) const override; + + G4double GetAlpha() const override; + + G4double GetBeta() const override; private: - // operators - G4PreCompoundProton(const G4PreCompoundProton &right); - const G4PreCompoundProton& - operator= (const G4PreCompoundProton &right); - G4bool operator==(const G4PreCompoundProton &right) const; - G4bool operator!=(const G4PreCompoundProton &right) const; - G4ProtonCoulombBarrier theProtonCoulombBarrier; }; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundTransitions.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundTransitions.hh index eb84cd4543..29dbe7929a 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundTransitions.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundTransitions.hh @@ -55,16 +55,17 @@ public: virtual ~G4PreCompoundTransitions(); - virtual G4double CalculateProbability(const G4Fragment & aFragment); + G4double CalculateProbability(const G4Fragment & aFragment) override; - virtual void PerformTransition(G4Fragment & aFragment); + virtual void PerformTransition(G4Fragment & aFragment) override; + + G4PreCompoundTransitions(const G4PreCompoundTransitions &) = delete; + const G4PreCompoundTransitions& operator= + (const G4PreCompoundTransitions &right) = delete; + G4bool operator==(const G4PreCompoundTransitions &right) const = delete; + G4bool operator!=(const G4PreCompoundTransitions &right) const = delete; private: - - G4PreCompoundTransitions(const G4PreCompoundTransitions &); - const G4PreCompoundTransitions& operator=(const G4PreCompoundTransitions &right); - G4bool operator==(const G4PreCompoundTransitions &right) const; - G4bool operator!=(const G4PreCompoundTransitions &right) const; const G4ParticleDefinition* proton; G4NuclearLevelData* fNuclData; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundTriton.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundTriton.hh index aa229c15e6..7d13f74c6a 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundTriton.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4PreCompoundTriton.hh @@ -46,23 +46,25 @@ public: virtual ~G4PreCompoundTriton(); - virtual G4double GetRj(G4int NumberParticles, G4int NumberCharged) const; + G4PreCompoundTriton(const G4PreCompoundTriton &right) = delete; + const G4PreCompoundTriton& + operator= (const G4PreCompoundTriton &right) = delete; + G4bool operator==(const G4PreCompoundTriton &right) const = delete; + G4bool operator!=(const G4PreCompoundTriton &right) const = delete; - virtual G4double FactorialFactor(G4int N, G4int P) const; +protected: - virtual G4double CoalescenceFactor(G4int A) const; + G4double GetRj(G4int NumberParticles, G4int NumberCharged) const override; - virtual G4double GetAlpha() const; + G4double FactorialFactor(G4int N, G4int P) const override; + + G4double CoalescenceFactor(G4int A) const override; + + G4double GetAlpha() const override; private: // operators - G4PreCompoundTriton(const G4PreCompoundTriton &right); - const G4PreCompoundTriton& - operator= (const G4PreCompoundTriton &right); - G4bool operator==(const G4PreCompoundTriton &right) const; - G4bool operator!=(const G4PreCompoundTriton &right) const; - G4TritonCoulombBarrier theTritonCoulombBarrier; }; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundEmissionFactory.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundEmissionFactory.hh index bbe3b4bb48..2817422044 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundEmissionFactory.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundEmissionFactory.hh @@ -43,35 +43,25 @@ public: inline std::vector * GetFragmentVector(); + G4VPreCompoundEmissionFactory(const G4VPreCompoundEmissionFactory&) = delete; + const G4VPreCompoundEmissionFactory & operator= + (const G4VPreCompoundEmissionFactory & val) = delete; + G4bool operator==(const G4VPreCompoundEmissionFactory & val) const = delete; + G4bool operator!=(const G4VPreCompoundEmissionFactory & val) const = delete; + protected: virtual std::vector * CreateFragmentVector() = 0; private: - G4VPreCompoundEmissionFactory(const G4VPreCompoundEmissionFactory & ); - const G4VPreCompoundEmissionFactory & operator= - (const G4VPreCompoundEmissionFactory & val); - G4bool operator==(const G4VPreCompoundEmissionFactory & val) const; - G4bool operator!=(const G4VPreCompoundEmissionFactory & val) const; - - std::vector * fragvector; - - struct DeleteFragment - { - template - void operator()(const T* ptr) const - { - delete ptr; - } - }; - + std::vector * fragvector = nullptr; }; inline std::vector * G4VPreCompoundEmissionFactory::GetFragmentVector() { - if (fragvector == 0) { fragvector = CreateFragmentVector(); } + if (fragvector == nullptr) { fragvector = CreateFragmentVector(); } return fragvector; } diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundFragment.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundFragment.hh index dd3af7d3d3..083912e1f5 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundFragment.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundFragment.hh @@ -114,6 +114,12 @@ public: //for superimposed Coulomb Barrier for inverse cross sections inline void UseSICB(G4bool); + G4VPreCompoundFragment(const G4VPreCompoundFragment &right) = delete; + const G4VPreCompoundFragment& + operator= (const G4VPreCompoundFragment &right) = delete; + G4bool operator==(const G4VPreCompoundFragment &right) const = delete; + G4bool operator!=(const G4VPreCompoundFragment &right) const = delete; + protected: virtual G4double GetAlpha() const = 0; @@ -122,16 +128,6 @@ protected: private: - G4VPreCompoundFragment(const G4VPreCompoundFragment &right) = delete; - const G4VPreCompoundFragment& - operator= (const G4VPreCompoundFragment &right) = delete; - G4bool operator==(const G4VPreCompoundFragment &right) const = delete; - G4bool operator!=(const G4VPreCompoundFragment &right) const = delete; - - // ============= - // Data members - // ============= - const G4ParticleDefinition* particle; G4VCoulombBarrier * theCoulombBarrierPtr; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundTransitions.hh b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundTransitions.hh index 32e5673ab1..1205db1580 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundTransitions.hh +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/include/G4VPreCompoundTransitions.hh @@ -56,12 +56,11 @@ public: //for use of CEM transition probabilities (if useCEMtr=true, defaut false) inline void UseCEMtr(G4bool use){useCEMtr=use;} -private: - - G4VPreCompoundTransitions(const G4VPreCompoundTransitions &); - const G4VPreCompoundTransitions& operator=(const G4VPreCompoundTransitions &right); - G4bool operator==(const G4VPreCompoundTransitions &right) const; - G4bool operator!=(const G4VPreCompoundTransitions &right) const; + G4VPreCompoundTransitions(const G4VPreCompoundTransitions &) = delete; + const G4VPreCompoundTransitions& operator= + (const G4VPreCompoundTransitions &right) = delete; + G4bool operator==(const G4VPreCompoundTransitions &right) const = delete; + G4bool operator!=(const G4VPreCompoundTransitions &right) const = delete; protected: @@ -87,5 +86,4 @@ protected: return TransitionProb3; } - #endif diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4LowEGammaNuclearModel.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4LowEGammaNuclearModel.cc index d7789b7180..c8ba0a78bd 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4LowEGammaNuclearModel.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4LowEGammaNuclearModel.cc @@ -42,10 +42,12 @@ #include "G4HadronicInteractionRegistry.hh" #include "G4PreCompoundModel.hh" #include "G4ThreeVector.hh" +#include "G4PhysicsModelCatalog.hh" G4LowEGammaNuclearModel::G4LowEGammaNuclearModel() - : G4HadronicInteraction("GammaNPreco"),lab4mom(0.,0.,0.,0.) + : G4HadronicInteraction("GammaNPreco"),lab4mom(0.,0.,0.,0.), secID(-1) { + secID = G4PhysicsModelCatalog::GetModelID("model_" + GetModelName()); SetMinEnergy( 0.0*CLHEP::GeV ); SetMaxEnergy( G4HadronicParameters::Instance()->GetMaxEnergy() ); @@ -76,6 +78,8 @@ G4HadFinalState* G4LowEGammaNuclearModel::ApplyYourself( G4Fragment frag(A, Z, lab4mom); + frag.SetCreatorModelID(secID); + if (verboseLevel > 1) { G4cout << "G4LowEGammaNuclearModel::ApplyYourself initial G4Fragmet:" << G4endl; @@ -99,7 +103,7 @@ G4HadFinalState* G4LowEGammaNuclearModel::ApplyYourself( G4HadSecondary* news = new G4HadSecondary( new G4DynamicParticle((*res)[i]->GetDefinition(), dir, ekin)); news->SetTime((*res)[i]->GetTOF()); - news->SetCreatorModelType((*res)[i]->GetCreatorModel()); + news->SetCreatorModelID(secID); theParticleChange.AddSecondary(*news); if (verboseLevel > 1) { G4cout << i << ". " << (*res)[i]->GetDefinition()->GetParticleName() diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4LowEIonFragmentation.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4LowEIonFragmentation.cc index 96871597ea..d58c368479 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4LowEIonFragmentation.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4LowEIonFragmentation.cc @@ -44,30 +44,20 @@ #include "G4Fancy3DNucleus.hh" #include "G4Proton.hh" #include "G4NucleiProperties.hh" +#include "G4PhysicsModelCatalog.hh" G4LowEIonFragmentation::G4LowEIonFragmentation(G4ExcitationHandler * const value) + : G4HadronicInteraction("LowEIonPreco") { theHandler = value; theModel = new G4PreCompoundModel(theHandler); proton = G4Proton::Proton(); - hits = 0; - totalTries = 1; - area = 0.0; -} - -G4LowEIonFragmentation::G4LowEIonFragmentation() -{ - theHandler = new G4ExcitationHandler; - theModel = new G4PreCompoundModel(theHandler); - proton = G4Proton::Proton(); - hits = 0; - totalTries = 1; - area = 0.0; + secID = G4PhysicsModelCatalog::GetModelID("model_" + GetModelName()); } G4LowEIonFragmentation::~G4LowEIonFragmentation() { - delete theModel; + theResult.Clear(); } G4HadFinalState * G4LowEIonFragmentation:: @@ -85,7 +75,8 @@ ApplyYourself(const G4HadProjectile & thePrimary, G4Nucleus & theNucleus) // Get Projectile A, Z G4int aProjectileA = thePrimary.GetDefinition()->GetBaryonNumber(); - G4int aProjectileZ = G4lrint(thePrimary.GetDefinition()->GetPDGCharge()/eplus); + G4int aProjectileZ = + G4lrint(thePrimary.GetDefinition()->GetPDGCharge()/eplus); // Get Maximum radius of both @@ -116,7 +107,8 @@ ApplyYourself(const G4HadProjectile & thePrimary, G4Nucleus & theNucleus) } // Loop checking, 05-Aug-2015, Vladimir Ivanchenko while(x*x + y*y > 1); - impactParameter = std::sqrt(x*x+y*y)*(targetOuterRadius+projectileOuterRadius); + impactParameter = std::sqrt(x*x+y*y)* + (targetOuterRadius+projectileOuterRadius); ++totalTries; area = pi*(targetOuterRadius+projectileOuterRadius)* (targetOuterRadius+projectileOuterRadius); @@ -179,7 +171,6 @@ ApplyYourself(const G4HadProjectile & thePrimary, G4Nucleus & theNucleus) aTargetZ+chargedFromProjectile, fragment4Momentum); // M.A. Cortes fix - //anInitialState.SetNumberOfParticles(particlesFromProjectile); anInitialState.SetNumberOfExcitedParticle(particlesFromProjectile + particlesFromTarget, chargedFromProjectile @@ -188,16 +179,17 @@ ApplyYourself(const G4HadProjectile & thePrimary, G4Nucleus & theNucleus) chargedFromProjectile + chargedFromTarget); G4double time = thePrimary.GetGlobalTime(); anInitialState.SetCreationTime(time); + anInitialState.SetCreatorModelID(secID); // Fragment the Fragment using Pre-compound G4ReactionProductVector* thePreCompoundResult = theModel->DeExcite(anInitialState); // De-excite the projectile using ExcitationHandler - G4ReactionProductVector * theExcitationResult = 0; + G4ReactionProductVector * theExcitationResult = nullptr; if(particlesFromProjectile < aProjectileA) { - G4LorentzVector residual4Momentum(momentum*(1.0-w), projTotEnergy*(1.0-w)); + G4LorentzVector residual4Momentum(momentum*(1.0-w), projTotEnergy*(1.0-w)); G4Fragment initialState2(aProjectileA-particlesFromProjectile, aProjectileZ-chargedFromProjectile, @@ -210,32 +202,32 @@ ApplyYourself(const G4HadProjectile & thePrimary, G4Nucleus & theNucleus) initialState2.SetNumberOfExcitedParticle(pinit,cinit); initialState2.SetNumberOfHoles(pinit,cinit); initialState2.SetCreationTime(time); + initialState2.SetCreatorModelID(secID); theExcitationResult = theHandler->BreakItUp(initialState2); } // Fill the particle change and clear intermediate vectors - G4int nexc = 0; - G4int npre = 0; - if(theExcitationResult) { nexc = theExcitationResult->size(); } - if(thePreCompoundResult) { npre = thePreCompoundResult->size();} + G4int nexc = (nullptr != theExcitationResult) ? + theExcitationResult->size() : 0; + G4int npre = (nullptr != thePreCompoundResult) ? + thePreCompoundResult->size() : 0; - if(nexc > 0) { - for(G4int k=0; kGetDefinition(), - p->GetMomentum())); - delete p; - } + for(G4int k=0; kGetDefinition(), p->GetMomentum())); + secondary.SetTime(p->GetTOF()); + secondary.SetCreatorModelID(secID); + theResult.AddSecondary(secondary); + delete p; } - - if(npre > 0) { - for(G4int k=0; kGetDefinition(), - p->GetMomentum())); - delete p; - } + for(G4int k=0; kGetDefinition(), p->GetMomentum())); + secondary.SetTime(p->GetTOF()); + secondary.SetCreatorModelID(secID); + theResult.AddSecondary(secondary); + delete p; } delete thePreCompoundResult; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundAlpha.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundAlpha.cc index 2093da80d4..26000b362c 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundAlpha.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundAlpha.cc @@ -53,12 +53,13 @@ G4PreCompoundAlpha::~G4PreCompoundAlpha() G4double G4PreCompoundAlpha::FactorialFactor(G4int N, G4int P) const { - return G4double((N-4)*(P-3)*(N-3)*(P-2))*G4double((N-2)*(P-1)*(N-1)*P)/144.0; + return static_cast(((N-4)*(P-3)*(N-3)*(P-2))*((N-2)*(P-1)*(N-1)*P)) + /144.0; } G4double G4PreCompoundAlpha::CoalescenceFactor(G4int A) const { - return 4096.0/G4double(A*A*A); + return 4096.0/static_cast(A*A*A); } G4double G4PreCompoundAlpha::GetAlpha() const @@ -88,9 +89,9 @@ G4double G4PreCompoundAlpha::GetRj(G4int nParticles, G4int nCharged) const G4double rj = 0.0; if(nCharged >=2 && (nParticles-nCharged) >=2 ) { G4double denominator = - G4double(nParticles*(nParticles-1)*(nParticles-2)*(nParticles-3)); - rj = 6.0*nCharged*(nCharged-1)*(nParticles-nCharged)*(nParticles-nCharged-1) - /denominator; + (nParticles*(nParticles-1))*((nParticles-2)*(nParticles-3)); + rj = (6.0*nCharged*(nCharged-1))* + ((nParticles-nCharged)*(nParticles-nCharged-1))/denominator; } return rj; } diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundDeuteron.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundDeuteron.cc index ddc301bfe8..8b30961b1f 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundDeuteron.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundDeuteron.cc @@ -52,19 +52,19 @@ G4PreCompoundDeuteron::~G4PreCompoundDeuteron() G4double G4PreCompoundDeuteron::FactorialFactor(G4int N, G4int P) const { - return G4double((N-1)*(N-2)*(P-1)*P)*0.5; + return static_cast((N-1)*(N-2)*(P-1)*P)*0.5; } G4double G4PreCompoundDeuteron::CoalescenceFactor(G4int A) const { - return 16.0/G4double(A); + return 16.0/static_cast(A); } G4double G4PreCompoundDeuteron::GetRj(G4int nParticles, G4int nCharged) const { G4double rj = 0.0; if(nCharged >=1 && (nParticles-nCharged) >=1) { - G4double denominator = G4double(nParticles*(nParticles-1)); + G4double denominator = (nParticles*(nParticles-1)); rj = 2*nCharged*(nParticles-nCharged)/denominator; } return rj; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundEmission.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundEmission.cc index 8e65434947..d4b69d8d17 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundEmission.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundEmission.cc @@ -54,6 +54,8 @@ #include "G4HadronicException.hh" #include "G4NuclearLevelData.hh" #include "G4DeexPrecoParameters.hh" +#include "G4PhysicsModelCatalog.hh" + G4PreCompoundEmission::G4PreCompoundEmission() { @@ -65,6 +67,7 @@ G4PreCompoundEmission::G4PreCompoundEmission() G4DeexPrecoParameters* param = fNuclData->GetParameters(); fFermiEnergy = param->GetFermiEnergy(); fUseAngularGenerator = param->UseAngularGen(); + fModelID = G4PhysicsModelCatalog::GetModelID("model_PRECO"); } G4PreCompoundEmission::~G4PreCompoundEmission() @@ -167,6 +170,10 @@ G4PreCompoundEmission::PerformEmission(G4Fragment & aFragment) // Create a G4ReactionProduct G4ReactionProduct * MyRP = thePreFragment->GetReactionProduct(); + // Set the creator model ID + aFragment.SetCreatorModelID(fModelID); + if (MyRP != nullptr) MyRP->SetCreatorModelID(fModelID); + return MyRP; } @@ -210,7 +217,7 @@ void G4PreCompoundEmission::AngularDistribution( G4double Eeff = ekin + Bemission + fFermiEnergy; if(ekin > DBL_MIN && Eeff > DBL_MIN) { - G4double zeta = std::max(1.0,9.3/std::sqrt(ekin/MeV)); + G4double zeta = std::max(1.0,9.3/std::sqrt(ekin/CLHEP::MeV)); // This should be the projectile energy. If I would know which is // the projectile (proton, neutron) I could remove the binding energy. @@ -221,7 +228,7 @@ void G4PreCompoundEmission::AngularDistribution( an = 3*std::sqrt((ProjEnergy+fFermiEnergy)*Eeff)/(zeta*Eav); G4int ne = aFragment.GetNumberOfExcitons() - 1; - if ( ne > 1 ) { an /= (G4double)ne; } + if ( ne > 1 ) { an /= static_cast(ne); } // protection of exponent if ( an > 10. ) { an = 10.; } @@ -260,7 +267,6 @@ G4double G4PreCompoundEmission::rho(G4int p, G4int h, G4double gg, { // 25.02.2010 V.Ivanchenko added more protections G4double Aph = (p*p + h*h + p - 3.0*h)/(4.0*gg); - // G4double alpha = (p*p + h*h)/(2.0*gg); if ( E - Aph < 0.0) { return 0.0; } @@ -285,7 +291,7 @@ G4double G4PreCompoundEmission::rho(G4int p, G4int h, G4double gg, Eeff -= Ef; if(Eeff < 0.0) { break; } t1 *= -1.; - t2 *= (G4double)(h+1-j)/(G4double)j; + t2 *= static_cast(h+1-j)/static_cast(j); logt3 = (p+h-1) * G4Log( Eeff) + logConst; if(logt3 > logmax) { logt3 = logmax; } tot += t1*t2*G4Exp(logt3); diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundEmissionFactory.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundEmissionFactory.cc index 441aa5b47b..caedfcb539 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundEmissionFactory.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundEmissionFactory.cc @@ -23,7 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// #include "G4PreCompoundEmissionFactory.hh" diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundFragment.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundFragment.cc index a5c4dd8758..38b63204e9 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundFragment.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundFragment.cc @@ -88,8 +88,9 @@ IntegrateEmissionProbability(G4double low, G4double up, { static const G4double den = 1.0/CLHEP::MeV; G4double del = (up - low); - G4int nbins = std::max(4,(G4int)(del*den)); - del /= (G4double)nbins; + G4int nbins = del*den; + nbins = std::max(nbins, 4); + del /= static_cast(nbins); G4double e = low + 0.5*del; probmax = ProbabilityDistributionFunction(e, aFragment); //G4cout << " 0. e= " << e << " y= " << probmax << G4endl; @@ -102,7 +103,7 @@ IntegrateEmissionProbability(G4double low, G4double up, probmax = std::max(probmax, y); sum += y; if(y < sum*0.01) { break; } - //G4cout << " " << i << ". e= " << e << " y= " << y << " sum= " << sum << G4endl; + //G4cout <<" "<UseHETC()) { theEmission->SetHETCModel(); } - //else { theEmission->SetDefaultModel(); } theEmission->SetOPTxs(param->GetPrecoModelType()); if(param->UseGNASH()) { theTransition = new G4GNASHTransitions; } @@ -168,28 +167,25 @@ G4PreCompoundModel::ApplyYourself(const G4HadProjectile & thePrimary, anInitialState.SetNumberOfExcitedParticle(2, 1); anInitialState.SetNumberOfHoles(1,0); anInitialState.SetCreationTime(thePrimary.GetGlobalTime()); + anInitialState.SetCreatorModelID(modelID); // call excitation handler - G4ReactionProductVector * result = DeExcite(anInitialState); + G4ReactionProductVector* result = DeExcite(anInitialState); // fill particle change theResult.Clear(); theResult.SetStatusChange(stopAndKill); - for(G4ReactionProductVector::iterator i= result->begin(); - i != result->end(); ++i) - { - G4DynamicParticle * aNewDP = - new G4DynamicParticle((*i)->GetDefinition(), - (*i)->GetTotalEnergy(), - (*i)->GetMomentum()); - G4HadSecondary aNew = G4HadSecondary(aNewDP); - G4double time=(*i)->GetFormationTime(); - if(time < 0.0) { time = 0.0; } - aNew.SetTime(timePrimary + time); - aNew.SetCreatorModelType((*i)->GetCreatorModel()); - delete (*i); - theResult.AddSecondary(aNew); - } + for(auto const & prod : *result) { + G4DynamicParticle * aNewDP = new G4DynamicParticle(prod->GetDefinition(), + prod->GetTotalEnergy(), + prod->GetMomentum()); + G4HadSecondary aNew = G4HadSecondary(aNewDP); + G4double time = std::max(prod->GetFormationTime(), 0.0); + aNew.SetTime(timePrimary + time); + aNew.SetCreatorModelID(prod->GetCreatorModelID()); + delete prod; + theResult.AddSecondary(aNew); + } delete result; //return the filled particle change @@ -262,7 +258,8 @@ G4ReactionProductVector* G4PreCompoundModel::DeExcite(G4Fragment& aFragment) // JMQ: WARNING: CalculateProbability MUST be called prior to Get!! // (O values would be returned otherwise) - G4double transProbability = theTransition->CalculateProbability(aFragment); + G4double transProbability = + theTransition->CalculateProbability(aFragment); G4double P1 = theTransition->GetTransitionProb1(); G4double P2 = theTransition->GetTransitionProb2(); G4double P3 = theTransition->GetTransitionProb3(); @@ -279,9 +276,9 @@ G4ReactionProductVector* G4PreCompoundModel::DeExcite(G4Fragment& aFragment) //G4cout<<"#4 EquilibriumEmission"<GetTotalProbability(aFragment); - + } + G4double emissionProbability = + theEmission->GetTotalProbability(aFragment); //G4cout<<"#1 TotalEmissionProbability="<GetLevelDensity(theFragZ, theFragA, U); G4double g1 = sixoverpi2*fNucData->GetLevelDensity(theResZ, theResA, 0.0); - G4double A0 = G4double(P*P+H*H+P-3*H)/(4.0*g0); + G4double A0 = (P*P+H*H+P-3*H)/(4.0*g0); G4double A1 = (A0 - 0.5*P)/g1; G4double E0 = U - A0; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundTransitions.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundTransitions.cc index d1b9367b9d..ddabbbf363 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundTransitions.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundTransitions.cc @@ -185,7 +185,7 @@ CalculateProbability(const G4Fragment & aFragment) // Transition probability for \Delta n = 0 (at F(p,h) = 0) TransitionProb3 = std::max(0.0,((N+1)*(P*(P-1) + 4*P*H + H*(H-1)))*x1 - /G4double(N)); + /static_cast(N)); } } } @@ -249,7 +249,7 @@ void G4PreCompoundTransitions::PerformTransition(G4Fragment & result) // With weight Z/A, number of charged particles is increased with +1 G4int A = result.GetA_asInt() - Npart; G4int Z = result.GetZ_asInt() - Ncharged; - if((Z == A) || (Z > 0 && G4int(A*G4UniformRand()) <= Z)) + if((Z == A) || (Z > 0 && G4lrint(A*G4UniformRand()) <= Z)) { result.SetNumberOfCharged(Ncharged+deltaN); } diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundTriton.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundTriton.cc index 5af591e7dc..990bbb0feb 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundTriton.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundTriton.cc @@ -53,21 +53,20 @@ G4PreCompoundTriton::~G4PreCompoundTriton() G4double G4PreCompoundTriton::FactorialFactor(G4int N, const G4int P) const { - return G4double((N-3)*(P-2)*(N-2)*(P-1)*(N-1)*P)/12.0; + return static_cast(((N-3)*(P-2)*(N-2))*((P-1)*(N-1)*P))/12.0; } G4double G4PreCompoundTriton::CoalescenceFactor(G4int A) const { - return 243.0/G4double(A*A); + return 243.0/static_cast(A*A); } G4double G4PreCompoundTriton::GetRj(G4int nParticles, G4int nCharged) const { G4double rj = 0.0; if(nCharged >= 1 && (nParticles-nCharged) >= 2) { - G4double denominator = - G4double(nParticles*(nParticles-1)*(nParticles-2)); - rj = G4double(3*nCharged*(nParticles-nCharged)*(nParticles-nCharged-1)) + G4double denominator = (nParticles*(nParticles-1)*(nParticles-2)); + rj = (3*nCharged*(nParticles-nCharged)*(nParticles-nCharged-1)) /denominator; } return rj; diff --git a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4VPreCompoundEmissionFactory.cc b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4VPreCompoundEmissionFactory.cc index 716fdce2de..361fe71d8c 100644 --- a/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4VPreCompoundEmissionFactory.cc +++ b/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4VPreCompoundEmissionFactory.cc @@ -29,15 +29,14 @@ #include "G4VPreCompoundEmissionFactory.hh" G4VPreCompoundEmissionFactory::G4VPreCompoundEmissionFactory() - : fragvector(nullptr) {} G4VPreCompoundEmissionFactory::~G4VPreCompoundEmissionFactory() { - if (fragvector != nullptr) - std::for_each(fragvector->begin(), fragvector->end(), - DeleteFragment()); - delete fragvector; + if (fragvector != nullptr) { + for(auto const & ptr : *fragvector) { delete ptr; } + delete fragvector; + } } diff --git a/source/processes/hadronic/models/qmd/History b/source/processes/hadronic/models/qmd/History index b2d29762e3..85c1c42d38 100644 --- a/source/processes/hadronic/models/qmd/History +++ b/source/processes/hadronic/models/qmd/History @@ -13,6 +13,19 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +04 August 2021 Alberto Ribon (hadr-qmd-V10-07-03) +------------------------------------------------- +- G4QMDReaction : migrated to the new version of G4PhysicsModelCatalog + (Note that this erases the second fix made by Dennis in the previous tag) + +21 July 2021 Dennis Wright (hadr-qmd-V10-07-02) +----------------------------------------------- +- two fixes found by Jeonghyeok Park: + G4QMDNucleus::CalEnergyAndAngularMomentumInCM : move constant hbc + outside of sqrt in angular momentum calculation + + G4QMDReaction::ApplyYourself : remove creator process ID + 16 April 2021 Ben Morgan (hadr-qmd-V10-07-01) -------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/qmd/include/G4QMDReaction.hh b/source/processes/hadronic/models/qmd/include/G4QMDReaction.hh index f03afbd92d..56b592c210 100644 --- a/source/processes/hadronic/models/qmd/include/G4QMDReaction.hh +++ b/source/processes/hadronic/models/qmd/include/G4QMDReaction.hh @@ -130,6 +130,7 @@ class G4QMDReaction : public G4HadronicInteraction G4bool gem; G4bool frag; + G4int secID; // Creator model ID for the secondaries }; #endif diff --git a/source/processes/hadronic/models/qmd/src/G4QMDNucleus.cc b/source/processes/hadronic/models/qmd/src/G4QMDNucleus.cc index fae0ff48b8..c7668508e3 100644 --- a/source/processes/hadronic/models/qmd/src/G4QMDNucleus.cc +++ b/source/processes/hadronic/models/qmd/src/G4QMDNucleus.cc @@ -196,7 +196,7 @@ void G4QMDNucleus::CalEnergyAndAngularMomentumInCM() //G4cout << "rcm " << i << " " << rcm[i] << G4endl; } -// Angluar momentum +// Angular momentum G4ThreeVector rl ( 0.0 ); for ( G4int i= 0; i < n ; i++ ) @@ -204,8 +204,10 @@ void G4QMDNucleus::CalEnergyAndAngularMomentumInCM() rl += rcm[i].cross ( pcm[i] ); } - jj = int ( std::sqrt ( rl*rl / hbc ) + 0.5 ); +// DHW: move hbc outside of sqrt to get correct units +// jj = int ( std::sqrt ( rl*rl / hbc ) + 0.5 ); + jj = int (std::sqrt(rl*rl)/hbc + 0.5); // kinetic energy per nucleon in CM diff --git a/source/processes/hadronic/models/qmd/src/G4QMDReaction.cc b/source/processes/hadronic/models/qmd/src/G4QMDReaction.cc index 96efcadace..c5854b4b09 100644 --- a/source/processes/hadronic/models/qmd/src/G4QMDReaction.cc +++ b/source/processes/hadronic/models/qmd/src/G4QMDReaction.cc @@ -48,6 +48,7 @@ #include "G4VCrossSectionDataSet.hh" #include "G4CrossSectionInelastic.hh" #include "G4ComponentGGNuclNuclXsc.hh" +#include "G4PhysicsModelCatalog.hh" G4QMDReaction::G4QMDReaction() @@ -58,6 +59,7 @@ G4QMDReaction::G4QMDReaction() , envelopF ( 1.05 ) // 10% for Peripheral reactions , gem ( true ) , frag ( false ) +, secID( -1 ) { theXS = new G4CrossSectionInelastic( new G4ComponentGGNuclNuclXsc ); pipElNucXS = new G4BGGPionElasticXS(G4PionPlus::PionPlus() ); @@ -95,6 +97,8 @@ G4QMDReaction::G4QMDReaction() coulomb_collision_rz_targ = 0.0; coulomb_collision_px_targ = 0.0; coulomb_collision_pz_targ = 0.0; + + secID = G4PhysicsModelCatalog::GetModelID( "model_QMDModel" ); } @@ -679,8 +683,8 @@ G4HadFinalState* G4QMDReaction::ApplyYourself( const G4HadProjectile & projectil { //G4cout << "Particle : " << theParticleChange.GetSecondary(i)->GetParticle()->GetParticleDefinition()->GetParticleName() << G4endl; //G4cout << "KEnergy : " << theParticleChange.GetSecondary(i)->GetParticle()->GetKineticEnergy() << G4endl; - //G4cout << "KEnergy : " << theParticleChange.GetSecondary(i)->GetCreatorModelType() << G4endl; - theParticleChange.GetSecondary(i)->SetCreatorModelType(1111); + //G4cout << "modelID : " << theParticleChange.GetSecondary(i)->GetCreatorModelID() << G4endl; + theParticleChange.GetSecondary(i)->SetCreatorModelID(secID); } return &theParticleChange; diff --git a/source/processes/hadronic/models/quasi_elastic/History b/source/processes/hadronic/models/quasi_elastic/History index d8889e8c81..41d3293029 100644 --- a/source/processes/hadronic/models/quasi_elastic/History +++ b/source/processes/hadronic/models/quasi_elastic/History @@ -14,6 +14,10 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +13-Jul-2021, A. Ribon hadr-qelastic-V10-07-02 +- G4QuasiElRatios : initialize the logarithmic table lastLRatio, + as suggested by Coverity. + 16-Apr-2021, B. Morgan hadr-qelastic-V10-07-01 - Migrate build to modular CMake API diff --git a/source/processes/hadronic/models/quasi_elastic/src/G4QuasiElRatios.cc b/source/processes/hadronic/models/quasi_elastic/src/G4QuasiElRatios.cc index ec86c95aa5..d4ad3a72ba 100644 --- a/source/processes/hadronic/models/quasi_elastic/src/G4QuasiElRatios.cc +++ b/source/processes/hadronic/models/quasi_elastic/src/G4QuasiElRatios.cc @@ -191,7 +191,9 @@ G4double G4QuasiElRatios::GetQF2IN_Ratio(G4double m_s, G4int A) lastTRatio[j]=CalcQF2IN_Ratio(sv,A); } lastLRatio=new G4double[mls]; // Create the logarithmic Table - if(m_s>sma) // Initialize the logarithmic Table + // Initialize the logarithmic Table + for(G4int j=0; jsma) { G4double ls=G4Log(m_s); lastKRatio = static_cast((ls-lsi)/dls)+1; // MaxBin to be initialized in LogTaB diff --git a/source/processes/hadronic/models/radioactive_decay/History b/source/processes/hadronic/models/radioactive_decay/History index cc64c2ab7e..21d7b1e746 100644 --- a/source/processes/hadronic/models/radioactive_decay/History +++ b/source/processes/hadronic/models/radioactive_decay/History @@ -14,6 +14,47 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +29 October 2021 Vladimir Ivanchenko radioactive_decay-V10-07-13 +--------------------------------------------------------------- +- G4RadioactiveDecay - updated printout of parameters according + to the recent modifications in atomic de-excitation module + +11 October 2021 Alberto Ribon radioactive_decay-V10-07-12 +--------------------------------------------------------- +- Included github Pull Request #26 by "mirguest" (Tao), aimed to + improve the branching ratio consistency in radioactive decays, + by replacing hardwired radioactive-decay-mode numbers with + corresponding enum values. + Modified classes: G4RadioactiveDecayMode, G4RadioactiveDecay, + G4Radioactivation. + +7 October 2021 Dennis Wright radioactive_decay-V10-07-11 +-------------------------------------------------------- +- remove obsolete classes G4RadioactiveDecayBase and + G4RadioactiveDecayBaseMessenger + +1 October 2021 Ben Morgan radioactive_decay-V10-07-10 +----------------------------------------------------- +- Use proper enum interface for G4String::strip + +12 August 2021 Dennis Wright radioactive_decay-V10-07-09 +-------------------------------------------------------- +- Next to last step in RadioactiveDecay code migration + create G4RadioactiveDecay.hh, .cc, G4RadioactiveDecayMessenger.hh, .cc + to eventually replace G4RadioactiveDecayBase.hh, .cc, + G4RadioactiveDecayBaseMessenger.hh, .cc + Code in new files is identical except for class name changes + + G4Radioactivation.hh, .cc: replace base class G4RadioactiveDecayBase + with G4RadioactiveDecay + + update sources.cmake to add new files + +04 August 2021 Alberto Ribon radioactive_decay-V10-07-08 +-------------------------------------------------------- +- G4RadioactiveDecayBase : migrated to the new approach of + creator model ID, using the new version of G4PhysicsModelCatalog + 21 May 2021 Dennis Wright radioactive_decay-V10-07-07 ----------------------------------------------------- - remove G4RadioactiveDecay.hh, .cc diff --git a/source/processes/hadronic/models/radioactive_decay/README_RDM b/source/processes/hadronic/models/radioactive_decay/README_RDM deleted file mode 100644 index 037a0bb1b5..0000000000 --- a/source/processes/hadronic/models/radioactive_decay/README_RDM +++ /dev/null @@ -1,38 +0,0 @@ - -This README file provides instructions for reading the radioactive decay -schemes in the files zXX.aYYY found in the directory RadioactiveDecay3.2 -(most recent version). This directory, as well as previous versions, is -available from the Geant4 download page - -http://geant4.web.cern.ch/geant4/support/download.shtml - -under the Data files heading. In order to use the radioactive decay module -correctly, you must download and unpack the above directory in your local -area, and set the environment variable - -G4RADIOACTIVEDATA - -to point to it. - -************************************************************************** -In each of the files, lines beginning with either a 'W' or a '#' are -comments. - -Lines beginning with a 'P' are headers, each of which describes a level of -the nucleus. The first number is the excitation energy in keV, the second -is the half life in seconds. Indented lines under the 'P' lines are decay -modes for that excitation. There are two type of records here, -distinguished by the number of columns. - -If there are 3 columns only, this is a header which describes all decays of -that type from this level. The first column is the decay mode, the second -column is zero, and the third column in the branching ratio to this mode, -as a fraction of unity. Therefore, the third columns of all the 3-column -records under a given 'P' line should sum to 1.0. - -If there are four columns, this is a record which describes a subset of the -decay type, specific to a given lower level in the daughter species. The -first column is the decay type, the second column is the excitation level -of the daughter (in keV), and the third column is the branching ratio as a -percentage (! note... not a fraction of unity) of the total branching ratio -which came from the 3-column record for this decay. diff --git a/source/processes/hadronic/models/radioactive_decay/include/G4Radioactivation.hh b/source/processes/hadronic/models/radioactive_decay/include/G4Radioactivation.hh index 268f4baafd..2dd0a0c478 100644 --- a/source/processes/hadronic/models/radioactive_decay/include/G4Radioactivation.hh +++ b/source/processes/hadronic/models/radioactive_decay/include/G4Radioactivation.hh @@ -26,7 +26,7 @@ #ifndef G4Radioactivation_h #define G4Radioactivation_h 1 -#include "G4RadioactiveDecayBase.hh" +#include "G4RadioactiveDecay.hh" #include #include @@ -52,7 +52,7 @@ typedef std::vector G4RadioactiveDecayRates; typedef std::map DecayTableMap; -class G4Radioactivation : public G4RadioactiveDecayBase +class G4Radioactivation : public G4RadioactiveDecay { public: // with description diff --git a/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayBase.hh b/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecay.hh similarity index 94% rename from source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayBase.hh rename to source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecay.hh index 7e32161bb4..de0721a92c 100644 --- a/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayBase.hh +++ b/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecay.hh @@ -25,7 +25,7 @@ // //////////////////////////////////////////////////////////////////////////////// // // -// File: G4RadioactiveDecayBase.hh // +// File: G4RadioactiveDecay.hh // // Author: D.H. Wright (SLAC) // // Date: 9 August 2017 // // Description: version the G4RadioactiveDecay process by F. Lei and // @@ -36,9 +36,8 @@ // // //////////////////////////////////////////////////////////////////////////////// -#ifndef G4RadioactiveDecayBase_h -#define G4RadioactiveDecayBase_h 1 - +#ifndef G4RadioactiveDecay_h +#define G4RadioactiveDecay_h 1 #include #include @@ -55,13 +54,13 @@ #include "G4RadioactiveDecayMode.hh" class G4Fragment; -class G4RadioactiveDecayBaseMessenger; +class G4RadioactiveDecayMessenger; class G4PhotonEvaporation; typedef std::map DecayTableMap; -class G4RadioactiveDecayBase : public G4VRestDiscreteProcess +class G4RadioactiveDecay : public G4VRestDiscreteProcess { // class description @@ -75,8 +74,8 @@ class G4RadioactiveDecayBase : public G4VRestDiscreteProcess public: // with description - G4RadioactiveDecayBase(const G4String& processName="RadioactiveDecayBase"); - ~G4RadioactiveDecayBase(); + G4RadioactiveDecay(const G4String& processName="RadioactiveDecay"); + ~G4RadioactiveDecay(); virtual void ProcessDescription(std::ostream& outFile) const; @@ -181,7 +180,7 @@ class G4RadioactiveDecayBase : public G4VRestDiscreteProcess // ParticleChange for decay process G4ParticleChangeForRadDecay fParticleChangeForRadDecay; - G4RadioactiveDecayBaseMessenger* theRadioactiveDecayBaseMessenger; + G4RadioactiveDecayMessenger* theRadioactiveDecayMessenger; G4PhotonEvaporation* photonEvaporation; std::vector ValidVolumes; @@ -199,8 +198,8 @@ class G4RadioactiveDecayBase : public G4VRestDiscreteProcess void StreamInfo(std::ostream& os, const G4String& endline); - G4RadioactiveDecayBase(const G4RadioactiveDecayBase &right); - G4RadioactiveDecayBase& operator=(const G4RadioactiveDecayBase &right); + G4RadioactiveDecay(const G4RadioactiveDecay& right); + G4RadioactiveDecay& operator=(const G4RadioactiveDecay& right); G4NucleusLimits theNucleusLimits; diff --git a/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayBaseMessenger.hh b/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayMessenger.hh similarity index 88% rename from source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayBaseMessenger.hh rename to source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayMessenger.hh index 51804b5247..d7a3fc31e5 100644 --- a/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayBaseMessenger.hh +++ b/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayMessenger.hh @@ -23,12 +23,12 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifndef G4RadioactiveDecayBaseMessenger_h -#define G4RadioactiveDecayBaseMessenger_h 1 +#ifndef G4RadioactiveDecayMessenger_h +#define G4RadioactiveDecayMessenger_h 1 //////////////////////////////////////////////////////////////////////////////// // // -// File: G4RadioactiveDecayBaseMessenger.hh // +// File: G4RadioactiveDecayMessenger.hh // // Author: D.H. Wright (SLAC) // // Date: 29 August 2017 // // Description: messenger class for the non-biased version of // @@ -49,21 +49,21 @@ #include "G4UIcmdWithoutParameter.hh" #include "globals.hh" -#include "G4RadioactiveDecayBase.hh" +#include "G4RadioactiveDecay.hh" #include "G4UIcmdWithNucleusLimits.hh" -class G4RadioactiveDecayBase; +class G4RadioactiveDecay; -class G4RadioactiveDecayBaseMessenger: public G4UImessenger +class G4RadioactiveDecayMessenger: public G4UImessenger { public: //with description - G4RadioactiveDecayBaseMessenger(G4RadioactiveDecayBase* theRadioactiveDecayContainer); - ~G4RadioactiveDecayBaseMessenger(); + G4RadioactiveDecayMessenger(G4RadioactiveDecay* theRadioactiveDecayContainer); + ~G4RadioactiveDecayMessenger(); void SetNewValue (G4UIcommand *command, G4String newValues); private: - G4RadioactiveDecayBase* theRadioactiveDecayContainer; + G4RadioactiveDecay* theRadioactiveDecayContainer; G4UIdirectory* rdmDirectory; G4UIcmdWithNucleusLimits* nucleuslimitsCmd; diff --git a/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayMode.hh b/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayMode.hh index cc15814676..5d4f70379f 100644 --- a/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayMode.hh +++ b/source/processes/hadronic/models/radioactive_decay/include/G4RadioactiveDecayMode.hh @@ -63,11 +63,14 @@ #include "globals.hh" //////////////////////////////////////////////////////////////////////////////// // -enum G4RadioactiveDecayMode - {RDM_ERROR=-1, IT=0, BetaMinus=1, BetaPlus=2, KshellEC=3, LshellEC=4, - MshellEC=5, NshellEC=6, Alpha=7, Proton=8, Neutron=9, SpFission=10, - BDProton=11, BDNeutron=12, Beta2Minus=13, Beta2Plus=14, Proton2=15, - Neutron2=16, Triton=17}; +enum G4RadioactiveDecayMode { + RDM_ERROR=-1, IT=0, BetaMinus=1, BetaPlus=2, + KshellEC=3, LshellEC=4, MshellEC=5, NshellEC=6, + Alpha=7, Proton=8, Neutron=9, SpFission=10, + BDProton=11, BDNeutron=12, Beta2Minus=13, Beta2Plus=14, + Proton2=15, Neutron2=16, Triton=17, + G4RadioactiveDecayModeSize // Note: the value G4RadioactiveDecayModeSize must remain the last one! +}; std::istream &operator >> (std::istream &s, G4RadioactiveDecayMode &q); diff --git a/source/processes/hadronic/models/radioactive_decay/sources.cmake b/source/processes/hadronic/models/radioactive_decay/sources.cmake index e50c054924..1509444f90 100644 --- a/source/processes/hadronic/models/radioactive_decay/sources.cmake +++ b/source/processes/hadronic/models/radioactive_decay/sources.cmake @@ -16,8 +16,8 @@ geant4_add_module(G4hadronic_radioactivedecay G4NuclearDecay.hh G4NucleusLimits.hh G4ProtonDecay.hh - G4RadioactiveDecayBase.hh - G4RadioactiveDecayBaseMessenger.hh + G4RadioactiveDecay.hh + G4RadioactiveDecayMessenger.hh G4Radioactivation.hh G4RadioactivationMessenger.hh G4RadioactiveDecayMode.hh @@ -41,8 +41,8 @@ geant4_add_module(G4hadronic_radioactivedecay G4NuclearDecay.cc G4NucleusLimits.cc G4ProtonDecay.cc - G4RadioactiveDecayBase.cc - G4RadioactiveDecayBaseMessenger.cc + G4RadioactiveDecay.cc + G4RadioactiveDecayMessenger.cc G4Radioactivation.cc G4RadioactivationMessenger.cc G4RadioactiveDecayMode.cc diff --git a/source/processes/hadronic/models/radioactive_decay/src/G4Radioactivation.cc b/source/processes/hadronic/models/radioactive_decay/src/G4Radioactivation.cc index ca5f33ed3c..2954b52705 100644 --- a/source/processes/hadronic/models/radioactive_decay/src/G4Radioactivation.cc +++ b/source/processes/hadronic/models/radioactive_decay/src/G4Radioactivation.cc @@ -91,7 +91,7 @@ using namespace CLHEP; G4Radioactivation::G4Radioactivation(const G4String& processName) - : G4RadioactiveDecayBase(processName) + : G4RadioactiveDecay(processName) { #ifdef G4VERBOSE if (GetVerboseLevel() > 1) { @@ -317,7 +317,7 @@ G4double G4Radioactivation::GetMeanLifeTime(const G4Track& theTrack, // to decay immediately. // In analogue mode it returns the particle's mean-life. G4double meanlife = 0.; - if (AnalogueMC) meanlife = G4RadioactiveDecayBase::GetMeanLifeTime(theTrack, 0); + if (AnalogueMC) meanlife = G4RadioactiveDecay::GetMeanLifeTime(theTrack, 0); return meanlife; } @@ -412,7 +412,7 @@ CalculateChainsFromParent(const G4ParticleDefinition& theParentNucleus) G4double TaoPlus; G4int nS = 0; // Running index of first decay in a given generation G4int nT = nEntry; // Total number of decays accumulated over entire history - const G4int nMode = 12; + const G4int nMode = G4RadioactiveDecayModeSize; G4double brs[nMode]; // theIonTable = @@ -495,65 +495,90 @@ CalculateChainsFromParent(const G4ParticleDefinition& theParentNucleus) } // Combine decay channels (loop i) - brs[2] = brs[2]+brs[3]+brs[4]+brs[5]+brs[6]; // Combine beta+ and EC - brs[3] = brs[4] = brs[5] = brs[6] = 0.0; + brs[BetaPlus] = brs[BetaPlus]+brs[KshellEC]+brs[LshellEC]+brs[MshellEC]+brs[NshellEC]; // Combine beta+ and EC + brs[KshellEC] = brs[LshellEC] = brs[MshellEC] = brs[NshellEC] = 0.0; for (G4int i = 0; i < nMode; i++) { // loop over decay modes if (brs[i] > 0.) { switch (i) { - case 0: + case IT: // Decay mode is isomeric transition - theITChannel = new G4ITDecay(aParentNucleus, brs[0], 0.0, 0.0, + theITChannel = new G4ITDecay(aParentNucleus, brs[IT], 0.0, 0.0, photonEvaporation); summedDecayTable->Insert(theITChannel); break; - case 1: + case BetaMinus: // Decay mode is beta- - theBetaMinusChannel = new G4BetaMinusDecay(aParentNucleus, brs[1], + theBetaMinusChannel = new G4BetaMinusDecay(aParentNucleus, brs[BetaMinus], 0.*MeV, 0.*MeV, noFloat, allowed); summedDecayTable->Insert(theBetaMinusChannel); break; - case 2: + case BetaPlus: // Decay mode is beta+ + EC. - theBetaPlusChannel = new G4BetaPlusDecay(aParentNucleus, brs[2], + theBetaPlusChannel = new G4BetaPlusDecay(aParentNucleus, brs[BetaPlus], 0.*MeV, 0.*MeV, noFloat, allowed); summedDecayTable->Insert(theBetaPlusChannel); break; - case 7: + case Alpha: // Decay mode is alpha. - theAlphaChannel = new G4AlphaDecay(aParentNucleus, brs[7], 0.*MeV, + theAlphaChannel = new G4AlphaDecay(aParentNucleus, brs[Alpha], 0.*MeV, 0.*MeV, noFloat); summedDecayTable->Insert(theAlphaChannel); break; - case 8: + case Proton: // Decay mode is proton. - theProtonChannel = new G4ProtonDecay(aParentNucleus, brs[8], 0.*MeV, + theProtonChannel = new G4ProtonDecay(aParentNucleus, brs[Proton], 0.*MeV, 0.*MeV, noFloat); summedDecayTable->Insert(theProtonChannel); break; - case 9: + case Neutron: // Decay mode is neutron. - theNeutronChannel = new G4NeutronDecay(aParentNucleus, brs[9], 0.*MeV, + theNeutronChannel = new G4NeutronDecay(aParentNucleus, brs[Neutron], 0.*MeV, 0.*MeV, noFloat); summedDecayTable->Insert(theNeutronChannel); break; - case 10: + case SpFission: // Decay mode is spontaneous fission - theFissionChannel = new G4SFDecay(aParentNucleus, brs[10], 0.*MeV, + theFissionChannel = new G4SFDecay(aParentNucleus, brs[SpFission], 0.*MeV, 0.*MeV, noFloat); summedDecayTable->Insert(theFissionChannel); break; - case 11: + + case BDProton: + // Not yet implemented + break; + + case BDNeutron: + // Not yet implemented + break; + + case Beta2Minus: + // Not yet implemented + break; + + case Beta2Plus: + // Not yet implemented + break; + + case Proton2: + // Not yet implemented + break; + + case Neutron2: + // Not yet implemented + break; + + case Triton: // Decay mode is Triton. - theTritonChannel = new G4TritonDecay(aParentNucleus, brs[9], 0.*MeV, + theTritonChannel = new G4TritonDecay(aParentNucleus, brs[Triton], 0.*MeV, 0.*MeV, noFloat); summedDecayTable->Insert(theTritonChannel); break; @@ -861,7 +886,7 @@ G4Radioactivation::DecayIt(const G4Track& theTrack, const G4Step&) } else { // Data found. Try to decay nucleus if (AnalogueMC) { - G4RadioactiveDecayBase::DecayAnalog(theTrack); + G4RadioactiveDecay::DecayAnalog(theTrack); } else { // Proceed with decay using variance reduction diff --git a/source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecayBase.cc b/source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecay.cc similarity index 89% rename from source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecayBase.cc rename to source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecay.cc index 8b4ce256c5..4f6b597030 100644 --- a/source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecayBase.cc +++ b/source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecay.cc @@ -25,7 +25,7 @@ // //////////////////////////////////////////////////////////////////////////////// // // -// File: G4RadioactiveDecayBase.cc // +// File: G4RadioactiveDecay.cc // // Author: D.H. Wright (SLAC) // // Date: 9 August 2017 // // Description: version the G4RadioactiveDecay process by F. Lei and // @@ -36,8 +36,8 @@ // // //////////////////////////////////////////////////////////////////////////////// -#include "G4RadioactiveDecayBase.hh" -#include "G4RadioactiveDecayBaseMessenger.hh" +#include "G4RadioactiveDecay.hh" +#include "G4RadioactiveDecayMessenger.hh" #include "G4SystemOfUnits.hh" #include "G4DynamicParticle.hh" @@ -89,24 +89,26 @@ #include #include +#include "G4PhysicsModelCatalog.hh" + using namespace CLHEP; -const G4double G4RadioactiveDecayBase::levelTolerance = 10.0*eV; -const G4ThreeVector G4RadioactiveDecayBase::origin(0.,0.,0.); +const G4double G4RadioactiveDecay::levelTolerance = 10.0*eV; +const G4ThreeVector G4RadioactiveDecay::origin(0.,0.,0.); #ifdef G4MULTITHREADED #include "G4AutoLock.hh" -G4Mutex G4RadioactiveDecayBase::radioactiveDecayMutex = G4MUTEX_INITIALIZER; -DecayTableMap* G4RadioactiveDecayBase::master_dkmap = 0; +G4Mutex G4RadioactiveDecay::radioactiveDecayMutex = G4MUTEX_INITIALIZER; +DecayTableMap* G4RadioactiveDecay::master_dkmap = 0; -G4int& G4RadioactiveDecayBase::NumberOfInstances() +G4int& G4RadioactiveDecay::NumberOfInstances() { static G4int numberOfInstances = 0; return numberOfInstances; } #endif -G4RadioactiveDecayBase::G4RadioactiveDecayBase(const G4String& processName) +G4RadioactiveDecay::G4RadioactiveDecay(const G4String& processName) : G4VRestDiscreteProcess(processName, fDecay), isInitialised(false), forceDecayDirection(0.,0.,0.), forceDecayHalfAngle(0.*deg), dirPath(""), verboseLevel(1), @@ -114,14 +116,14 @@ G4RadioactiveDecayBase::G4RadioactiveDecayBase(const G4String& processName) { #ifdef G4VERBOSE if (GetVerboseLevel() > 1) { - G4cout << "G4RadioactiveDecayBase constructor: processName = " << processName + G4cout << "G4RadioactiveDecay constructor: processName = " << processName << G4endl; } #endif SetProcessSubType(fRadioactiveDecay); - theRadioactiveDecayBaseMessenger = new G4RadioactiveDecayBaseMessenger(this); + theRadioactiveDecayMessenger = new G4RadioactiveDecayMessenger(this); pParticleChange = &fParticleChangeForRadDecay; // Set up photon evaporation for use in G4ITDecay @@ -153,7 +155,7 @@ G4RadioactiveDecayBase::G4RadioactiveDecayBase(const G4String& processName) // Instantiate the map of decay tables #ifdef G4MULTITHREADED - G4AutoLock lk(&G4RadioactiveDecayBase::radioactiveDecayMutex); + G4AutoLock lk(&G4RadioactiveDecay::radioactiveDecayMutex); NumberOfInstances()++; if(!master_dkmap) master_dkmap = new DecayTableMap; #endif @@ -169,7 +171,7 @@ G4RadioactiveDecayBase::G4RadioactiveDecayBase(const G4String& processName) G4HadronicProcessStore::Instance()->RegisterExtraProcess(this); } -void G4RadioactiveDecayBase::ProcessDescription(std::ostream& outFile) const +void G4RadioactiveDecay::ProcessDescription(std::ostream& outFile) const { outFile << "The radioactive decay process (G4RadioactiveDecay) handles the\n" << "alpha, beta+, beta-, electron capture and isomeric transition\n" @@ -179,9 +181,9 @@ void G4RadioactiveDecayBase::ProcessDescription(std::ostream& outFile) const } -G4RadioactiveDecayBase::~G4RadioactiveDecayBase() +G4RadioactiveDecay::~G4RadioactiveDecay() { - delete theRadioactiveDecayBaseMessenger; + delete theRadioactiveDecayMessenger; delete photonEvaporation; for (DecayTableMap::iterator i = dkmap->begin(); i != dkmap->end(); i++) { delete i->second; @@ -189,7 +191,7 @@ G4RadioactiveDecayBase::~G4RadioactiveDecayBase() dkmap->clear(); delete dkmap; #ifdef G4MULTITHREADED - G4AutoLock lk(&G4RadioactiveDecayBase::radioactiveDecayMutex); + G4AutoLock lk(&G4RadioactiveDecay::radioactiveDecayMutex); --NumberOfInstances(); if(NumberOfInstances()==0) { @@ -203,7 +205,7 @@ G4RadioactiveDecayBase::~G4RadioactiveDecayBase() } -G4bool G4RadioactiveDecayBase::IsApplicable(const G4ParticleDefinition& aParticle) +G4bool G4RadioactiveDecay::IsApplicable(const G4ParticleDefinition& aParticle) { // All particles other than G4Ions, are rejected by default if (((const G4Ions*)(&aParticle))->GetExcitationEnergy() > 0.) {return true;} @@ -225,7 +227,7 @@ G4bool G4RadioactiveDecayBase::IsApplicable(const G4ParticleDefinition& aParticl return true; } -G4DecayTable* G4RadioactiveDecayBase::GetDecayTable(const G4ParticleDefinition* aNucleus) +G4DecayTable* G4RadioactiveDecay::GetDecayTable(const G4ParticleDefinition* aNucleus) { G4String key = aNucleus->GetParticleName(); DecayTableMap::iterator table_ptr = dkmap->find(key); @@ -241,7 +243,7 @@ G4DecayTable* G4RadioactiveDecayBase::GetDecayTable(const G4ParticleDefinition* } -void G4RadioactiveDecayBase::SelectAVolume(const G4String& aVolume) +void G4RadioactiveDecay::SelectAVolume(const G4String& aVolume) { G4LogicalVolumeStore* theLogicalVolumes = G4LogicalVolumeStore::GetInstance(); G4LogicalVolume* volume = nullptr; @@ -261,13 +263,13 @@ void G4RadioactiveDecayBase::SelectAVolume(const G4String& aVolume) ed << aVolume << " is not a valid logical volume name." << " Decay not activated for it." << G4endl; - G4Exception("G4RadioactiveDecayBase::SelectAVolume()", "HAD_RDM_300", + G4Exception("G4RadioactiveDecay::SelectAVolume()", "HAD_RDM_300", JustWarning, ed); } } -void G4RadioactiveDecayBase::DeselectAVolume(const G4String& aVolume) +void G4RadioactiveDecay::DeselectAVolume(const G4String& aVolume) { G4LogicalVolumeStore* theLogicalVolumes = G4LogicalVolumeStore::GetInstance(); G4LogicalVolume* volume = nullptr; @@ -288,7 +290,7 @@ void G4RadioactiveDecayBase::DeselectAVolume(const G4String& aVolume) { G4ExceptionDescription ed; ed << aVolume << " is not in the list. No action taken." << G4endl; - G4Exception("G4RadioactiveDecayBase::DeselectAVolume()", "HAD_RDM_300", + G4Exception("G4RadioactiveDecay::DeselectAVolume()", "HAD_RDM_300", JustWarning, ed); } } @@ -297,13 +299,13 @@ void G4RadioactiveDecayBase::DeselectAVolume(const G4String& aVolume) G4ExceptionDescription ed; ed << aVolume << " is not a valid logical volume name. No action taken." << G4endl; - G4Exception("G4RadioactiveDecayBase::DeselectAVolume()", "HAD_RDM_300", + G4Exception("G4RadioactiveDecay::DeselectAVolume()", "HAD_RDM_300", JustWarning, ed); } } -void G4RadioactiveDecayBase::SelectAllVolumes() +void G4RadioactiveDecay::SelectAllVolumes() { G4LogicalVolumeStore* theLogicalVolumes = G4LogicalVolumeStore::GetInstance(); G4LogicalVolume* volume = nullptr; @@ -326,7 +328,7 @@ void G4RadioactiveDecayBase::SelectAllVolumes() } -void G4RadioactiveDecayBase::DeselectAllVolumes() +void G4RadioactiveDecay::DeselectAllVolumes() { ValidVolumes.clear(); isAllVolumesMode=false; @@ -342,7 +344,7 @@ void G4RadioactiveDecayBase::DeselectAllVolumes() // // //////////////////////////////////////////////////////////////////////////////// -G4double G4RadioactiveDecayBase::GetMeanLifeTime(const G4Track& theTrack, +G4double G4RadioactiveDecay::GetMeanLifeTime(const G4Track& theTrack, G4ForceCondition*) { G4double meanlife = 0.; @@ -378,8 +380,8 @@ G4double G4RadioactiveDecayBase::GetMeanLifeTime(const G4Track& theTrack, // // //////////////////////////////////////////////////////////////////////////////// -G4double G4RadioactiveDecayBase::GetMeanFreePath (const G4Track& aTrack, G4double, - G4ForceCondition*) +G4double G4RadioactiveDecay::GetMeanFreePath(const G4Track& aTrack, G4double, + G4ForceCondition*) { const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle(); const G4ParticleDefinition* aParticleDef = aParticle->GetDefinition(); @@ -443,7 +445,7 @@ G4double G4RadioactiveDecayBase::GetMeanFreePath (const G4Track& aTrack, G4doubl // // //////////////////////////////////////////////////////////////////////////////// -void G4RadioactiveDecayBase::BuildPhysicsTable(const G4ParticleDefinition&) +void G4RadioactiveDecay::BuildPhysicsTable(const G4ParticleDefinition&) { if (!isInitialised) { isInitialised = true; @@ -463,7 +465,7 @@ void G4RadioactiveDecayBase::BuildPhysicsTable(const G4ParticleDefinition&) //////////////////////////////////////////////////////////////////////////////// void -G4RadioactiveDecayBase::StreamInfo(std::ostream& os, const G4String& endline) +G4RadioactiveDecay::StreamInfo(std::ostream& os, const G4String& endline) { G4DeexPrecoParameters* deex = G4NuclearLevelData::GetInstance()->GetParameters(); @@ -490,12 +492,12 @@ G4RadioactiveDecayBase::StreamInfo(std::ostream& os, const G4String& endline) << emparam->Fluo() << endline; os << "Auger electron emission enabled " << emparam->Auger() << endline; - os << "Auger cascade enabled " - << emparam->AugerCascade() << endline; os << "Check EM cuts disabled for atomic de-excitation " << emparam->DeexcitationIgnoreCut() << endline; os << "Use Bearden atomic level energies " << emparam->BeardenFluoDir() << endline; + os << "Use ANSTO fluorescence model " + << emparam->ANSTOFluoDir() << endline; os << "Threshold for very long decay time at rest " << fThresholdForVeryLongDecayTime/CLHEP::ns << " ns" << endline; os << "======================================================================" @@ -512,7 +514,7 @@ G4RadioactiveDecayBase::StreamInfo(std::ostream& os, const G4String& endline) //////////////////////////////////////////////////////////////////////////////// G4DecayTable* -G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucleus) +G4RadioactiveDecay::LoadDecayTable(const G4ParticleDefinition& theParentNucleus) { // Generate input data file name using Z and A of the parent nucleus // file containing radioactive decay data. @@ -524,7 +526,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl ((const G4Ions*)(&theParentNucleus))->GetFloatLevelBase(); #ifdef G4MULTITHREADED - G4AutoLock lk(&G4RadioactiveDecayBase::radioactiveDecayMutex); + G4AutoLock lk(&G4RadioactiveDecay::radioactiveDecayMutex); G4String key = theParentNucleus.GetParticleName(); DecayTableMap::iterator master_table_ptr = master_dkmap->find(key); @@ -552,7 +554,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl if (DecaySchemeFile.good()) { // Initialize variables used for reading in radioactive decay data G4bool floatMatch(false); - const G4int nMode = 12; + const G4int nMode = G4RadioactiveDecayModeSize; G4double modeTotalBR[nMode] = {0.0}; G4double modeSumBR[nMode]; for (G4int i = 0; i < nMode; i++) { @@ -589,7 +591,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl } inputLine = inputChars; - inputLine = inputLine.strip(1); + G4StrUtil::rstrip(inputLine); if (inputChars[0] != '#' && inputLine.length() != 0) { std::istringstream tmpStream(inputLine); @@ -631,39 +633,39 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl } break; case BetaMinus: - modeTotalBR[1] = decayModeTotal; break; + modeTotalBR[BetaMinus] = decayModeTotal; break; case BetaPlus: - modeTotalBR[2] = decayModeTotal; break; + modeTotalBR[BetaPlus] = decayModeTotal; break; case KshellEC: - modeTotalBR[3] = decayModeTotal; break; + modeTotalBR[KshellEC] = decayModeTotal; break; case LshellEC: - modeTotalBR[4] = decayModeTotal; break; + modeTotalBR[LshellEC] = decayModeTotal; break; case MshellEC: - modeTotalBR[5] = decayModeTotal; break; + modeTotalBR[MshellEC] = decayModeTotal; break; case NshellEC: - modeTotalBR[6] = decayModeTotal; break; + modeTotalBR[NshellEC] = decayModeTotal; break; case Alpha: - modeTotalBR[7] = decayModeTotal; break; + modeTotalBR[Alpha] = decayModeTotal; break; case Proton: - modeTotalBR[8] = decayModeTotal; break; + modeTotalBR[Proton] = decayModeTotal; break; case Neutron: - modeTotalBR[9] = decayModeTotal; break; - case BDProton: - break; - case BDNeutron: - break; - case Beta2Minus: - break; - case Beta2Plus: - break; - case Proton2: - break; - case Neutron2: - break; + modeTotalBR[Neutron] = decayModeTotal; break; case SpFission: - modeTotalBR[10] = decayModeTotal; break; + modeTotalBR[SpFission] = decayModeTotal; break; + case BDProton: + /* Not yet implemented */ break; + case BDNeutron: + /* Not yet implemented */ break; + case Beta2Minus: + /* Not yet implemented */ break; + case Beta2Plus: + /* Not yet implemented */ break; + case Proton2: + /* Not yet implemented */ break; + case Neutron2: + /* Not yet implemented */ break; case Triton: - modeTotalBR[11] = decayModeTotal; break; + modeTotalBR[Triton] = decayModeTotal; break; case RDM_ERROR: default: @@ -695,7 +697,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // aBetaMinusChannel->DumpNuclearInfo(); // aBetaMinusChannel->SetHLThreshold(halflifethreshold); theDecayTable->Insert(aBetaMinusChannel); - modeSumBR[1] += b; + modeSumBR[BetaMinus] += b; } break; @@ -707,7 +709,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // aBetaPlusChannel->DumpNuclearInfo(); // aBetaPlusChannel->SetHLThreshold(halflifethreshold); theDecayTable->Insert(aBetaPlusChannel); - modeSumBR[2] += b; + modeSumBR[BetaPlus] += b; } break; @@ -720,7 +722,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // aKECChannel->SetHLThreshold(halflifethreshold); aKECChannel->SetARM(applyARM); theDecayTable->Insert(aKECChannel); - modeSumBR[3] += b; + modeSumBR[KshellEC] += b; } break; @@ -733,7 +735,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // aLECChannel->SetHLThreshold(halflifethreshold); aLECChannel->SetARM(applyARM); theDecayTable->Insert(aLECChannel); - modeSumBR[4] += b; + modeSumBR[LshellEC] += b; } break; @@ -746,7 +748,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // aMECChannel->SetHLThreshold(halflifethreshold); aMECChannel->SetARM(applyARM); theDecayTable->Insert(aMECChannel); - modeSumBR[5] += b; + modeSumBR[MshellEC] += b; } break; @@ -759,7 +761,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // aNECChannel->SetHLThreshold(halflifethreshold); aNECChannel->SetARM(applyARM); theDecayTable->Insert(aNECChannel); - modeSumBR[6] += b; + modeSumBR[NshellEC] += b; } break; @@ -771,7 +773,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // anAlphaChannel->DumpNuclearInfo(); // anAlphaChannel->SetHLThreshold(halflifethreshold); theDecayTable->Insert(anAlphaChannel); - modeSumBR[7] += b; + modeSumBR[Alpha] += b; } break; @@ -783,7 +785,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // aProtonChannel->DumpNuclearInfo(); // aProtonChannel->SetHLThreshold(halflifethreshold); theDecayTable->Insert(aProtonChannel); - modeSumBR[8] += b; + modeSumBR[Proton] += b; } break; @@ -795,34 +797,10 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // aNeutronChannel->DumpNuclearInfo(); // aNeutronChannel->SetHLThreshold(halflifethreshold); theDecayTable->Insert(aNeutronChannel); - modeSumBR[9] += b; + modeSumBR[Neutron] += b; } break; - case BDProton: - // Not yet implemented - // G4cout << " beta-delayed proton decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; - break; - case BDNeutron: - // Not yet implemented - // G4cout << " beta-delayed neutron decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; - break; - case Beta2Minus: - // Not yet implemented - // G4cout << " Double beta- decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; - break; - case Beta2Plus: - // Not yet implemented - // G4cout << " Double beta+ decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; - break; - case Proton2: - // Not yet implemented - // G4cout << " Double proton decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; - break; - case Neutron2: - // Not yet implemented - // G4cout << " Double beta- decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; - break; case SpFission: { G4SFDecay* aSpontFissChannel = @@ -830,9 +808,40 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl new G4SFDecay(&theParentNucleus, b, c*MeV, a*MeV, daughterFloatLevel); theDecayTable->Insert(aSpontFissChannel); - modeSumBR[10] += b; + modeSumBR[SpFission] += b; } break; + + case BDProton: + // Not yet implemented + // G4cout << " beta-delayed proton decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; + break; + + case BDNeutron: + // Not yet implemented + // G4cout << " beta-delayed neutron decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; + break; + + case Beta2Minus: + // Not yet implemented + // G4cout << " Double beta- decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; + break; + + case Beta2Plus: + // Not yet implemented + // G4cout << " Double beta+ decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; + break; + + case Proton2: + // Not yet implemented + // G4cout << " Double proton decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; + break; + + case Neutron2: + // Not yet implemented + // G4cout << " Double beta- decay, a = " << a << ", b = " << b << ", c = " << c << G4endl; + break; + case Triton: { G4TritonDecay* aTritonChannel = @@ -841,7 +850,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl // anAlphaChannel->DumpNuclearInfo(); // anAlphaChannel->SetHLThreshold(halflifethreshold); theDecayTable->Insert(aTritonChannel); - modeSumBR[11] += b; + modeSumBR[Triton] += b; } break; @@ -899,7 +908,7 @@ G4RadioactiveDecayBase::LoadDecayTable(const G4ParticleDefinition& theParentNucl } void -G4RadioactiveDecayBase::AddUserDecayDataFile(G4int Z, G4int A, G4String filename) +G4RadioactiveDecay::AddUserDecayDataFile(G4int Z, G4int A, G4String filename) { if (Z < 1 || A < 2) G4cout << "Z and A not valid!" << G4endl; @@ -910,7 +919,7 @@ G4RadioactiveDecayBase::AddUserDecayDataFile(G4int Z, G4int A, G4String filename } else { G4ExceptionDescription ed; ed << filename << " does not exist! " << G4endl; - G4Exception("G4RadioactiveDecayBase::AddUserDecayDataFile()", "HAD_RDM_001", + G4Exception("G4RadioactiveDecay::AddUserDecayDataFile()", "HAD_RDM_001", FatalException, ed); } } @@ -922,7 +931,7 @@ G4RadioactiveDecayBase::AddUserDecayDataFile(G4int Z, G4int A, G4String filename //////////////////////////////////////////////////////////////////////////////// G4VParticleChange* -G4RadioactiveDecayBase::DecayIt(const G4Track& theTrack, const G4Step&) +G4RadioactiveDecay::DecayIt(const G4Track& theTrack, const G4Step&) { // Initialize G4ParticleChange object, get particle details and decay table fParticleChangeForRadDecay.Initialize(theTrack); @@ -1089,7 +1098,7 @@ G4RadioactiveDecayBase::DecayIt(const G4Track& theTrack, const G4Step&) } -void G4RadioactiveDecayBase::DecayAnalog(const G4Track& theTrack) +void G4RadioactiveDecay::DecayAnalog(const G4Track& theTrack) { const G4DynamicParticle* theParticle = theTrack.GetDynamicParticle(); const G4ParticleDefinition* theParticleDef = theParticle->GetDefinition(); @@ -1170,23 +1179,29 @@ void G4RadioactiveDecayBase::DecayAnalog(const G4Track& theTrack) products->IsChecked(); } - for (G4int index = 0; index < numberOfSecondaries; index++) { - G4Track* secondary = new G4Track(products->PopProducts(), finalGlobalTime, - theTrack.GetPosition() ); - secondary->SetWeight(theTrack.GetWeight()); - secondary->SetCreatorModelIndex(theRadDecayMode); - //Change for atomics relaxation - if (theRadDecayMode == IT && index>0){ - if (index == numberOfSecondaries-1) secondary->SetCreatorModelIndex(IT); - else secondary->SetCreatorModelIndex(30); - } - else if (theRadDecayMode >= KshellEC && theRadDecayMode <= NshellEC - && index SetCreatorModelIndex(30); + const G4int modelID_forIT = G4PhysicsModelCatalog::GetModelID( "model_RDM_IT" ); + G4int modelID = modelID_forIT + 10*theRadDecayMode; + const G4int modelID_forAtomicRelaxation = + G4PhysicsModelCatalog::GetModelID( "model_RDM_AtomicRelaxation" ); + for ( G4int index = 0; index < numberOfSecondaries; ++index ) { + G4Track* secondary = new G4Track( products->PopProducts(), finalGlobalTime, + theTrack.GetPosition() ); + secondary->SetWeight( theTrack.GetWeight() ); + secondary->SetCreatorModelID( modelID ); + // Change for atomics relaxation + if ( theRadDecayMode == IT && index > 0 ) { + if ( index == numberOfSecondaries-1 ) { + secondary->SetCreatorModelID( modelID_forIT ); + } else { + secondary->SetCreatorModelID( modelID_forAtomicRelaxation) ; + } + } else if ( theRadDecayMode >= KshellEC && theRadDecayMode <= NshellEC && + index < numberOfSecondaries-1 ) { + secondary->SetCreatorModelID( modelID_forAtomicRelaxation ); } secondary->SetGoodForTrackingFlag(); - secondary->SetTouchableHandle(theTrack.GetTouchableHandle()); - fParticleChangeForRadDecay.AddSecondary(secondary); + secondary->SetTouchableHandle( theTrack.GetTouchableHandle() ); + fParticleChangeForRadDecay.AddSecondary( secondary ); } delete products; @@ -1202,7 +1217,7 @@ void G4RadioactiveDecayBase::DecayAnalog(const G4Track& theTrack) G4DecayProducts* -G4RadioactiveDecayBase::DoDecay(const G4ParticleDefinition& theParticleDef) +G4RadioactiveDecay::DoDecay(const G4ParticleDefinition& theParticleDef) { G4DecayProducts* products = 0; G4DecayTable* theDecayTable = GetDecayTable(&theParticleDef); @@ -1241,7 +1256,8 @@ G4RadioactiveDecayBase::DoDecay(const G4ParticleDefinition& theParticleDef) // Apply directional bias for "visible" daughters (e+-, gamma, n, p, alpha) -void G4RadioactiveDecayBase::CollimateDecay(G4DecayProducts* products) { +void G4RadioactiveDecay::CollimateDecay(G4DecayProducts* products) { + if (origin == forceDecayDirection) return; // No collimation requested if (180.*deg == forceDecayHalfAngle) return; if (0 == products || 0 == products->entries()) return; @@ -1270,7 +1286,7 @@ void G4RadioactiveDecayBase::CollimateDecay(G4DecayProducts* products) { } } -void G4RadioactiveDecayBase::CollimateDecayProduct(G4DynamicParticle* daughter) { +void G4RadioactiveDecay::CollimateDecayProduct(G4DynamicParticle* daughter) { #ifdef G4VERBOSE if (GetVerboseLevel() > 1) { G4cout << "CollimateDecayProduct for daughter " @@ -1285,7 +1301,7 @@ void G4RadioactiveDecayBase::CollimateDecayProduct(G4DynamicParticle* daughter) // Choose random direction within collimation cone -G4ThreeVector G4RadioactiveDecayBase::ChooseCollimationDirection() const { +G4ThreeVector G4RadioactiveDecay::ChooseCollimationDirection() const { if (origin == forceDecayDirection) return origin; // Don't do collimation if (forceDecayHalfAngle == 180.*deg) return origin; diff --git a/source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecayBaseMessenger.cc b/source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecayMessenger.cc similarity index 96% rename from source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecayBaseMessenger.cc rename to source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecayMessenger.cc index 1e2b7b4372..2e212293d4 100644 --- a/source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecayBaseMessenger.cc +++ b/source/processes/hadronic/models/radioactive_decay/src/G4RadioactiveDecayMessenger.cc @@ -26,7 +26,7 @@ //////////////////////////////////////////////////////////////////////////////// // // -// File: G4RadioactiveDecayBaseMessenger.cc // +// File: G4RadioactiveDecayMessenger.cc // // Author: D.H. Wright (SLAC) // // Date: 29 August 2017 // // Description: messenger class for the non-biased version of // @@ -35,14 +35,14 @@ // // //////////////////////////////////////////////////////////////////////////////// -#include "G4RadioactiveDecayBaseMessenger.hh" +#include "G4RadioactiveDecayMessenger.hh" #include "G4NuclearLevelData.hh" #include #include "G4HadronicException.hh" -G4RadioactiveDecayBaseMessenger::G4RadioactiveDecayBaseMessenger -(G4RadioactiveDecayBase* theRadioactiveDecayContainer1) +G4RadioactiveDecayMessenger::G4RadioactiveDecayMessenger +(G4RadioactiveDecay* theRadioactiveDecayContainer1) :theRadioactiveDecayContainer(theRadioactiveDecayContainer1) { rdmDirectory = new G4UIdirectory("/process/had/rdm/"); @@ -144,7 +144,7 @@ G4RadioactiveDecayBaseMessenger::G4RadioactiveDecayBaseMessenger } -G4RadioactiveDecayBaseMessenger::~G4RadioactiveDecayBaseMessenger () +G4RadioactiveDecayMessenger::~G4RadioactiveDecayMessenger () { delete rdmDirectory; delete nucleuslimitsCmd; @@ -164,7 +164,7 @@ G4RadioactiveDecayBaseMessenger::~G4RadioactiveDecayBaseMessenger () void -G4RadioactiveDecayBaseMessenger::SetNewValue(G4UIcommand *command, G4String newValues) +G4RadioactiveDecayMessenger::SetNewValue(G4UIcommand *command, G4String newValues) { if ( command == nucleuslimitsCmd ) { theRadioactiveDecayContainer-> diff --git a/source/processes/hadronic/models/theo_high_energy/History b/source/processes/hadronic/models/theo_high_energy/History index de297dfaa7..27c06d0fa5 100644 --- a/source/processes/hadronic/models/theo_high_energy/History +++ b/source/processes/hadronic/models/theo_high_energy/History @@ -14,6 +14,11 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +04-Aug-2021, Alberto Ribon (had-theo-HE-V10-07-03) +- G4TheoFSGenerator, G4QuasiElasticChannel, G4CRCoalescence : + set creator model ID for the secondaries, using the new version of + G4PhysicsModelCatalog + 04-Jun-2021, Alberto Ribon (had-theo-HE-V10-07-02) - G4TheoFSGenerator : added accessor (i.e. "Get") methods for the corresponding setter methods (i.e. "Set", already existing). diff --git a/source/processes/hadronic/models/theo_high_energy/include/G4CRCoalescence.hh b/source/processes/hadronic/models/theo_high_energy/include/G4CRCoalescence.hh index 40112b9b66..93f7c4fe83 100644 --- a/source/processes/hadronic/models/theo_high_energy/include/G4CRCoalescence.hh +++ b/source/processes/hadronic/models/theo_high_energy/include/G4CRCoalescence.hh @@ -111,7 +111,9 @@ class G4CRCoalescence : public G4HadronicInteraction { G4double p2x, G4double p2y, G4double p2z, G4double m2 ); G4double fP0_d; // Coalescence parameter for deuterons - G4double fP0_dbar; // Coalescence parameter for antideuterons + G4double fP0_dbar; // Coalescence parameter for antideuterons + + G4int secID; // Creator model ID for the secondaries created by this model }; #endif diff --git a/source/processes/hadronic/models/theo_high_energy/include/G4QuasiElasticChannel.hh b/source/processes/hadronic/models/theo_high_energy/include/G4QuasiElasticChannel.hh index 8645af90be..d7df15d5be 100644 --- a/source/processes/hadronic/models/theo_high_energy/include/G4QuasiElasticChannel.hh +++ b/source/processes/hadronic/models/theo_high_energy/include/G4QuasiElasticChannel.hh @@ -68,6 +68,7 @@ class G4QuasiElasticChannel : public G4HadronicInteraction private: G4QuasiElRatios* theQuasiElastic; G4V3DNucleus* the3DNucleus; + G4int secID; // Creator model ID for the secondaries created by this model }; #endif diff --git a/source/processes/hadronic/models/theo_high_energy/include/G4TheoFSGenerator.hh b/source/processes/hadronic/models/theo_high_energy/include/G4TheoFSGenerator.hh index 20c5b21f6d..1cea0d19fd 100644 --- a/source/processes/hadronic/models/theo_high_energy/include/G4TheoFSGenerator.hh +++ b/source/processes/hadronic/models/theo_high_energy/include/G4TheoFSGenerator.hh @@ -84,6 +84,7 @@ class G4TheoFSGenerator : public G4HadronicInteraction G4HadFinalState * theParticleChange; G4QuasiElasticChannel * theQuasielastic; G4CRCoalescence * theCosmicCoalescence; + G4int theStringModelID; }; diff --git a/source/processes/hadronic/models/theo_high_energy/src/G4CRCoalescence.cc b/source/processes/hadronic/models/theo_high_energy/src/G4CRCoalescence.cc index ee65440f18..56628e25bf 100644 --- a/source/processes/hadronic/models/theo_high_energy/src/G4CRCoalescence.cc +++ b/source/processes/hadronic/models/theo_high_energy/src/G4CRCoalescence.cc @@ -76,10 +76,13 @@ #include "G4CRCoalescence.hh" #include "G4ReactionProduct.hh" #include "G4IonTable.hh" +#include "G4PhysicsModelCatalog.hh" G4CRCoalescence::G4CRCoalescence() : G4HadronicInteraction("G4CRCoalescence" ), - fP0_d( 0.0 ), fP0_dbar( 0.0 ) {} + fP0_d( 0.0 ), fP0_dbar( 0.0 ), secID( -1 ) { + secID = G4PhysicsModelCatalog::GetModelID( "model_G4CRCoalescence" ); +} G4CRCoalescence::~G4CRCoalescence() {} @@ -238,6 +241,7 @@ void G4CRCoalescence::PushDeuteron( const G4ThreeVector &p1, const G4ThreeVector finaldeut->SetMomentum( psum ); finaldeut->SetTotalEnergy( totalEnergy ); finaldeut->SetMass( massd ); + finaldeut->SetCreatorModelID( secID ); result->push_back( finaldeut ); } else { G4ParticleDefinition* antideuteron = G4ParticleTable::GetParticleTable()->FindAntiParticle( "deuteron" ); @@ -249,6 +253,7 @@ void G4CRCoalescence::PushDeuteron( const G4ThreeVector &p1, const G4ThreeVector finalantideut->SetMomentum( psum ); finalantideut->SetTotalEnergy( totalEnergy ); finalantideut->SetMass( massd ); + finalantideut->SetCreatorModelID( secID ); result->push_back( finalantideut ); } } diff --git a/source/processes/hadronic/models/theo_high_energy/src/G4QuasiElasticChannel.cc b/source/processes/hadronic/models/theo_high_energy/src/G4QuasiElasticChannel.cc index 933420c8ef..91b7430cb5 100644 --- a/source/processes/hadronic/models/theo_high_energy/src/G4QuasiElasticChannel.cc +++ b/source/processes/hadronic/models/theo_high_energy/src/G4QuasiElasticChannel.cc @@ -54,6 +54,7 @@ #include "G4QuasiElRatios.hh" #include "globals.hh" #include +#include "G4PhysicsModelCatalog.hh" //#define debug_scatter @@ -61,7 +62,9 @@ G4QuasiElasticChannel::G4QuasiElasticChannel() : G4HadronicInteraction("QuasiElastic"), theQuasiElastic(new G4QuasiElRatios), - the3DNucleus(new G4Fancy3DNucleus) { + the3DNucleus(new G4Fancy3DNucleus), + secID(-1) { + secID = G4PhysicsModelCatalog::GetModelID( "model_QuasiElastic" ); } G4QuasiElasticChannel::~G4QuasiElasticChannel() @@ -165,16 +168,19 @@ G4KineticTrackVector * G4QuasiElasticChannel::Scatter(G4Nucleus &theNucleus, G4KineticTrackVector * ktv = new G4KineticTrackVector(); G4KineticTrack * sPrim=new G4KineticTrack(thePrimary.GetDefinition(), 0.,G4ThreeVector(0), scatteredHadron4Mom); + sPrim->SetCreatorModelID( secID ); ktv->push_back(sPrim); if (result.first.e() > 0.) { G4KineticTrack * sNuc=new G4KineticTrack(pDef, 0.,G4ThreeVector(0), result.first); + sNuc->SetCreatorModelID( secID ); ktv->push_back(sNuc); } if(resZ || resA==1) // For the only neutron or for tnuclei with Z>0 { G4KineticTrack * rNuc=new G4KineticTrack(resDef, 0.,G4ThreeVector(0), residualNucleus4Mom); + rNuc->SetCreatorModelID( secID ); ktv->push_back(rNuc); } else // The residual nucleus consists of only neutrons @@ -184,6 +190,7 @@ G4KineticTrackVector * G4QuasiElasticChannel::Scatter(G4Nucleus &theNucleus, { G4KineticTrack* rNuc=new G4KineticTrack(resDef, 0.,G4ThreeVector(0), residualNucleus4Mom); + rNuc->SetCreatorModelID( secID ); ktv->push_back(rNuc); } } diff --git a/source/processes/hadronic/models/theo_high_energy/src/G4TheoFSGenerator.cc b/source/processes/hadronic/models/theo_high_energy/src/G4TheoFSGenerator.cc index d982cfbb6c..21add6e85c 100644 --- a/source/processes/hadronic/models/theo_high_energy/src/G4TheoFSGenerator.cc +++ b/source/processes/hadronic/models/theo_high_energy/src/G4TheoFSGenerator.cc @@ -44,8 +44,10 @@ G4TheoFSGenerator::G4TheoFSGenerator(const G4String& name) , theTransport(nullptr), theHighEnergyGenerator(nullptr) , theQuasielastic(nullptr) , theCosmicCoalescence(nullptr) + , theStringModelID(-1) { theParticleChange = new G4HadFinalState; + theStringModelID = G4PhysicsModelCatalog::GetModelID( "model_" + name ); } G4TheoFSGenerator::~G4TheoFSGenerator() @@ -113,7 +115,7 @@ G4HadFinalState * G4TheoFSGenerator::ApplyYourself(const G4HadProjectile & thePr new G4DynamicParticle(ptr->GetDefinition(), ptr->Get4Momentum().e(), ptr->Get4Momentum().vect()); - theParticleChange->AddSecondary(aNew); + theParticleChange->AddSecondary(aNew, ptr->GetCreatorModelID()); delete ptr; } delete result; @@ -123,7 +125,6 @@ G4HadFinalState * G4TheoFSGenerator::ApplyYourself(const G4HadProjectile & thePr theParticleChange->SetStatusChange(isAlive); theParticleChange->SetEnergyChange(thePrimary.GetKineticEnergy()); theParticleChange->SetMomentumChange(thePrimary.Get4Momentum().vect().unit()); - } return theParticleChange; } @@ -133,6 +134,11 @@ G4HadFinalState * G4TheoFSGenerator::ApplyYourself(const G4HadProjectile & thePr G4KineticTrackVector * theInitialResult = theHighEnergyGenerator->Scatter(theNucleus, aPart); + // Assign the creator model ID + for ( auto & ptr : *theInitialResult ) { + ptr->SetCreatorModelID( theStringModelID ); + } + //#define DEBUG_initial_result #ifdef DEBUG_initial_result G4double E_out(0); @@ -245,7 +251,7 @@ G4HadFinalState * G4TheoFSGenerator::ApplyYourself(const G4HadProjectile & thePr G4HadSecondary aNew = G4HadSecondary(aNewDP); G4double time = std::max(ptr->GetFormationTime(), 0.0); aNew.SetTime(timePrimary + time); - aNew.SetCreatorModelType(ptr->GetCreatorModel()); + aNew.SetCreatorModelID(ptr->GetCreatorModelID()); theParticleChange->AddSecondary(aNew); delete ptr; } diff --git a/source/processes/hadronic/processes/History b/source/processes/hadronic/processes/History index d8a55474ec..c5a7e0fd04 100644 --- a/source/processes/hadronic/processes/History +++ b/source/processes/hadronic/processes/History @@ -15,6 +15,11 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +04 August 2021 Alberto Ribon (hadr-proc-V10-07-06) +-------------------------------------------------- +- G4HadronElasticProcess : set the creator model ID for the elastic recoil, + using the new version of the G4PhysicsModelCatalog + 16 April 2021 Ben Morgan (hadr-proc-V10-07-05) ------------------------------------------------ - Migrate build to modular CMake API diff --git a/source/processes/hadronic/processes/src/G4HadronElasticProcess.cc b/source/processes/hadronic/processes/src/G4HadronElasticProcess.cc index aa4a258ec9..41d7bb2761 100644 --- a/source/processes/hadronic/processes/src/G4HadronElasticProcess.cc +++ b/source/processes/hadronic/processes/src/G4HadronElasticProcess.cc @@ -41,6 +41,7 @@ #include "G4HadronicException.hh" #include "G4HadronicInteraction.hh" #include "G4VCrossSectionRatio.hh" +#include "G4PhysicsModelCatalog.hh" G4HadronElasticProcess::G4HadronElasticProcess(const G4String& pName) : G4HadronicProcess(pName, fHadronElastic), @@ -121,6 +122,8 @@ G4HadronElasticProcess::PostStepDoIt(const G4Track& track, result->SetTrafoToLab(theProj.GetTrafoToLab()); ClearNumberOfInteractionLengthLeft(); + // The following method of the base class takes care also of setting + // the creator model ID for the secondaries that are created FillResult(result, track); if (epReportLevel != 0) { @@ -234,6 +237,8 @@ G4HadronElasticProcess::PostStepDoIt(const G4Track& track, track.GetPosition()); t->SetWeight(weight); t->SetTouchableHandle(track.GetTouchableHandle()); + G4int secID = G4PhysicsModelCatalog::GetModelID( "model_" + hadi->GetModelName() ); + if ( secID > 0 ) t->SetCreatorModelID(secID); theTotalResult->AddSecondary(t); } else { diff --git a/source/processes/hadronic/stopping/History b/source/processes/hadronic/stopping/History index 33c9d7ee55..a7f9ad535d 100644 --- a/source/processes/hadronic/stopping/History +++ b/source/processes/hadronic/stopping/History @@ -14,6 +14,16 @@ code and to keep track of all tags. * Please list in reverse chronological order (last date on top) --------------------------------------------------------------- +04 August 2021 A. Ribon (hadr-stopping-V10-07-07) + -------------------------------------------------------------------- +- G4MuonicAtomDecay, G4HadronStoppingProcess : migrated to the new + version of G4PhysicsModelCatalog + +09 July 2021 V.Ivanchenko (hadr-stopping-V10-07-06) + -------------------------------------------------------------------- +- G4ElementSelector, G4HadronStoppingProcess - use const pointer + to G4Element + 16 April 2021 B. Morgan (hadr-stopping-V10-07-05) -------------------------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/hadronic/stopping/include/G4ElementSelector.hh b/source/processes/hadronic/stopping/include/G4ElementSelector.hh index dd2ae71595..8f02c776ab 100644 --- a/source/processes/hadronic/stopping/include/G4ElementSelector.hh +++ b/source/processes/hadronic/stopping/include/G4ElementSelector.hh @@ -65,7 +65,7 @@ public: virtual ~G4ElementSelector(); - virtual G4Element* SelectZandA(const G4Track& track, G4Nucleus*); + virtual const G4Element* SelectZandA(const G4Track& track, G4Nucleus*); private: diff --git a/source/processes/hadronic/stopping/src/G4ElementSelector.cc b/source/processes/hadronic/stopping/src/G4ElementSelector.cc index ff7622f575..e1d5f5cdc7 100644 --- a/source/processes/hadronic/stopping/src/G4ElementSelector.cc +++ b/source/processes/hadronic/stopping/src/G4ElementSelector.cc @@ -55,7 +55,7 @@ G4ElementSelector::~G4ElementSelector() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -G4Element* +const G4Element* G4ElementSelector::SelectZandA(const G4Track& track, G4Nucleus* target) { // Fermi-Teller Z-low of mu- capture and exceptions @@ -75,7 +75,7 @@ G4ElementSelector::SelectZandA(const G4Track& track, G4Nucleus* target) G4double sum = 0.0; for (i=0; i < numberOfElements; ++i) { - G4int Z = G4lrint((*theElementVector)[i]->GetZ()); + G4int Z = (*theElementVector)[i]->GetZasInt(); // Halogens if( (9 == Z) || (17 == Z) || (35 == Z) || (53 == Z) || (85 == Z) ) { @@ -98,8 +98,8 @@ G4ElementSelector::SelectZandA(const G4Track& track, G4Nucleus* target) } } - G4Element* elm = (*theElementVector)[i]; - G4int Z = G4lrint(elm->GetZ()); + const G4Element* elm = (*theElementVector)[i]; + G4int Z = elm->GetZasInt(); // select isotope const G4IsotopeVector* isv = elm->GetIsotopeVector(); diff --git a/source/processes/hadronic/stopping/src/G4HadronStoppingProcess.cc b/source/processes/hadronic/stopping/src/G4HadronStoppingProcess.cc index df5a129653..643a5fda44 100644 --- a/source/processes/hadronic/stopping/src/G4HadronStoppingProcess.cc +++ b/source/processes/hadronic/stopping/src/G4HadronStoppingProcess.cc @@ -98,9 +98,9 @@ void G4HadronStoppingProcess::PreparePhysicsTable(const G4ParticleDefinition& p) { G4HadronicProcessStore::Instance()->RegisterParticleForExtraProcess(this,&p); - emcID = G4PhysicsModelCatalog::Register(G4String((GetProcessName() + "_EMCascade"))); - ncID = G4PhysicsModelCatalog::Register(G4String((GetProcessName() + "_NuclearCapture"))); - dioID = G4PhysicsModelCatalog::Register(G4String((GetProcessName() + "_DIO"))); + emcID = G4PhysicsModelCatalog::GetModelID(G4String("model_" + (GetProcessName() + "_EMCascade"))); + ncID = G4PhysicsModelCatalog::GetModelID(G4String("model_" + (GetProcessName() + "_NuclearCapture"))); + dioID = G4PhysicsModelCatalog::GetModelID(G4String("model_" + (GetProcessName() + "_DIO"))); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -137,7 +137,7 @@ G4VParticleChange* G4HadronStoppingProcess::AtRestDoIt(const G4Track& track, theTotalResult->Initialize(track); G4Nucleus* nucleus = GetTargetNucleusPointer(); - G4Element* elm = fElementSelector->SelectZandA(track, nucleus); + const G4Element* elm = fElementSelector->SelectZandA(track, nucleus); G4HadFinalState* result = 0; thePro.Initialise(track); @@ -275,13 +275,13 @@ G4VParticleChange* G4HadronStoppingProcess::AtRestDoIt(const G4Track& track, track.GetPosition()); t->SetWeight(w*sec->GetWeight()); - // use SetCreatorModelIndex to "label" the track + // use SetCreatorModelID to "label" the track if (iSetCreatorModelIndex(emcID); + t->SetCreatorModelID(emcID); } else if (nuclearCapture) { - t->SetCreatorModelIndex(ncID); + t->SetCreatorModelID(ncID); } else { - t->SetCreatorModelIndex(dioID); + t->SetCreatorModelID(dioID); } t->SetTouchableHandle(track.GetTouchableHandle()); diff --git a/source/processes/hadronic/stopping/src/G4MuonicAtomDecay.cc b/source/processes/hadronic/stopping/src/G4MuonicAtomDecay.cc index 3b7d3650f5..75f99dbd5f 100644 --- a/source/processes/hadronic/stopping/src/G4MuonicAtomDecay.cc +++ b/source/processes/hadronic/stopping/src/G4MuonicAtomDecay.cc @@ -520,7 +520,7 @@ void G4MuonicAtomDecay::FillResult(G4HadFinalState * aR, const G4Track & aT) G4Track* track = new G4Track(aR->GetSecondary(i)->GetParticle(), time, aT.GetPosition()); - track->SetCreatorModelIndex(aR->GetSecondary(i)->GetCreatorModelType()); + track->SetCreatorModelID(aR->GetSecondary(i)->GetCreatorModelID()); G4double newWeight = weight*aR->GetSecondary(i)->GetWeight(); // G4cout << "#### ParticleDebug " // < & GetNucleons(); G4int GetMassNumber(); G4double GetMass(); G4int GetCharge(); + G4int GetNumberOfLambdas(); // Non-negative number of Lambdas (for hypernuclei) or anti-Lambdas (for anti-hypernuclei) G4double GetNuclearRadius(); G4double GetNuclearRadius(const G4double maxRelativeDensity); G4double GetOuterRadius(); @@ -103,13 +104,13 @@ class G4Fancy3DNucleus : public G4V3DNucleus G4int myA; G4int myZ; + G4int myL; // Non-negative number of Lambdas (for hypernuclei) or anti-Lambdas (for anti-hypernuclei) std::vector theNucleons; G4int currentNucleon; G4VNuclearDensity * theDensity; G4FermiMomentum theFermi; -//const G4double nucleondistance; // Uzhi Dec. 2017 - G4double nucleondistance; // Uzhi Dec. 2017 + G4double nucleondistance; G4double excitationEnergy; std::vector places; // For selecting locations @@ -128,6 +129,12 @@ inline G4int G4Fancy3DNucleus::GetMassNumber() { return myA; } + +inline G4int G4Fancy3DNucleus::GetNumberOfLambdas() +{ + return myL; +} + inline G4double G4Fancy3DNucleus::AddExcitationEnergy(G4double anE) { excitationEnergy +=anE; diff --git a/source/processes/hadronic/util/include/G4Fragment.hh b/source/processes/hadronic/util/include/G4Fragment.hh index 6a7451e7f8..9bce4520f4 100644 --- a/source/processes/hadronic/util/include/G4Fragment.hh +++ b/source/processes/hadronic/util/include/G4Fragment.hh @@ -43,6 +43,7 @@ // removed not needed 'const'; removed old debug staff and unused // private methods; add comments and reorder methods for // better reading +// 27.10.2021 A.Ribon extension for hypernuclei. #ifndef G4Fragment_h #define G4Fragment_h 1 @@ -53,6 +54,7 @@ #include "G4ThreeVector.hh" #include "G4NuclearPolarization.hh" #include "G4NucleiProperties.hh" +#include "G4HyperNucleiProperties.hh" #include "G4Proton.hh" #include "G4Neutron.hh" #include @@ -80,6 +82,9 @@ public: // A,Z and 4-momentum - main constructor for fragment G4Fragment(G4int A, G4int Z, const G4LorentzVector& aMomentum, G4bool warning=true); + // A,Z,numberOfLambdas and 4-momentum + G4Fragment(G4int A, G4int Z, G4int numberOfLambdas, const G4LorentzVector& aMomentum, G4bool warning=true); + // 4-momentum and pointer to G4particleDefinition (for gammas, e-) G4Fragment(const G4LorentzVector& aMomentum, const G4ParticleDefinition* aParticleDefinition); @@ -101,7 +106,11 @@ public: inline G4int GetZ_asInt() const; inline G4int GetA_asInt() const; inline void SetZandA_asInt(G4int Znew, G4int Anew); - + + inline G4int GetNumberOfLambdas() const; + inline void SetNumberOfLambdas(G4int numberOfLambdas); + // Non-negative number of lambdas/anti-lambdas inside the nucleus/anti-nucleus + inline G4double GetExcitationEnergy() const; inline void SetExcEnergyAndMomentum(G4double eexc, const G4LorentzVector&); @@ -112,15 +121,15 @@ public: inline const G4LorentzVector& GetMomentum() const; inline void SetMomentum(const G4LorentzVector& value); - // computation of mass for any Z and A - inline G4double ComputeGroundStateMass(G4int Z, G4int A) const; + // computation of mass for any Z, A and numberOfLambdas + inline G4double ComputeGroundStateMass(G4int Z, G4int A, G4int numberOfLambdas = 0) const; // extra methods inline G4double GetSpin() const; inline void SetSpin(G4double value); - inline G4int GetCreatorModelType() const; - inline void SetCreatorModelType(G4int value); + inline G4int GetCreatorModelID() const; + inline void SetCreatorModelID(G4int value); // obsolete methods @@ -185,6 +194,8 @@ private: G4int theA; G4int theZ; + + G4int theL; // Non-negative number of lambdas/anti-lambdas inside the nucleus/anti-nucleus G4double theExcitationEnergy; @@ -245,14 +256,16 @@ inline void G4Fragment::CalculateExcitationEnergy(G4bool warning) } inline G4double -G4Fragment::ComputeGroundStateMass(G4int Z, G4int A) const +G4Fragment::ComputeGroundStateMass(G4int Z, G4int A, G4int numberOfLambdas) const { - return G4NucleiProperties::GetNuclearMass(A, Z); + if ( numberOfLambdas <= 0 ) return G4NucleiProperties::GetNuclearMass(A, Z); + else return G4HyperNucleiProperties::GetNuclearMass(A, Z, numberOfLambdas); } inline void G4Fragment::CalculateGroundStateMass() { - theGroundStateMass = G4NucleiProperties::GetNuclearMass(theA, theZ); + if ( theL <= 0 ) theGroundStateMass = G4NucleiProperties::GetNuclearMass(theA, theZ); + else theGroundStateMass = G4HyperNucleiProperties::GetNuclearMass(theA, theZ, theL); } inline G4int G4Fragment::GetA_asInt() const @@ -272,6 +285,17 @@ inline void G4Fragment::SetZandA_asInt(G4int Znew, G4int Anew) CalculateGroundStateMass(); } +inline G4int G4Fragment::GetNumberOfLambdas() const +{ + return theL; +} + +inline void G4Fragment::SetNumberOfLambdas(G4int numberOfLambdas) +{ + theL = std::max( numberOfLambdas, 0 ); // Cannot be negative + CalculateGroundStateMass(); +} + inline G4double G4Fragment::GetExcitationEnergy() const { return theExcitationEnergy; @@ -396,12 +420,12 @@ inline void G4Fragment::SetNumberOfElectrons(G4int value) numberOfShellElectrons = value; } -inline G4int G4Fragment::GetCreatorModelType() const +inline G4int G4Fragment::GetCreatorModelID() const { return creatorModel; } -inline void G4Fragment::SetCreatorModelType(G4int value) +inline void G4Fragment::SetCreatorModelID(G4int value) { creatorModel = value; } diff --git a/source/processes/hadronic/util/include/G4HadSecondary.hh b/source/processes/hadronic/util/include/G4HadSecondary.hh index 8f22048804..5877c3f316 100644 --- a/source/processes/hadronic/util/include/G4HadSecondary.hh +++ b/source/processes/hadronic/util/include/G4HadSecondary.hh @@ -45,8 +45,8 @@ public: inline void SetWeight(G4double aW) {theWeight= aW;} inline void SetTime(G4double aT) {theTime = aT;} inline G4double GetTime() const {return theTime;} - inline void SetCreatorModelType(G4int idx) {theCreatorModel = idx;} - inline G4int GetCreatorModelType() const {return theCreatorModel;} + inline void SetCreatorModelID(G4int id) {theCreatorModel = id;} + inline G4int GetCreatorModelID() const {return theCreatorModel;} private: diff --git a/source/processes/hadronic/util/include/G4HadronicParameters.hh b/source/processes/hadronic/util/include/G4HadronicParameters.hh index e3726e5049..ee9ed90de1 100644 --- a/source/processes/hadronic/util/include/G4HadronicParameters.hh +++ b/source/processes/hadronic/util/include/G4HadronicParameters.hh @@ -107,6 +107,11 @@ class G4HadronicParameters { // Baryons and mesons with c- and b- quarks may be enabled/disabled // This flag is used both by EM and hadronic physics constructors + G4bool EnableHyperNuclei() const; + void SetEnableHyperNuclei( G4bool val ); + // Light hyper-nuclei may be enabled/disabled + // This flag is used both by EM and hadronic physics constructors + G4bool ApplyFactorXS() const; void SetApplyFactorXS( G4bool val ); // Flag enabling cross section factor definition @@ -149,6 +154,7 @@ class G4HadronicParameters { G4int fVerboseLevel = 1; G4bool fEnableBC = false; + G4bool fEnableHyperNuclei = false; G4bool fApplyFactorXS = false; G4bool fEnableCRCoalescence = false; }; @@ -212,6 +218,10 @@ inline G4bool G4HadronicParameters::EnableBCParticles() const { return fEnableBC; } +inline G4bool G4HadronicParameters::EnableHyperNuclei() const { + return fEnableHyperNuclei; +} + inline G4bool G4HadronicParameters::ApplyFactorXS() const { return fApplyFactorXS; } diff --git a/source/processes/hadronic/util/include/G4KineticTrack.hh b/source/processes/hadronic/util/include/G4KineticTrack.hh index 7e209b55d3..3324bddcd7 100644 --- a/source/processes/hadronic/util/include/G4KineticTrack.hh +++ b/source/processes/hadronic/util/include/G4KineticTrack.hh @@ -123,6 +123,8 @@ class G4KineticTrack : public G4VKineticNucleon void SetProjectilePotential(const G4double aPotential); G4double GetProjectilePotential() const; + void SetCreatorModelID(G4int id); + G4int GetCreatorModelID() const; private: @@ -186,6 +188,8 @@ public: CascadeState theStateToNucleus; G4double theProjectilePotential; + + G4int theCreatorModel; }; // extern G4Allocator theKTAllocator; @@ -422,6 +426,17 @@ G4double G4KineticTrack::GetProjectilePotential() const return theProjectilePotential; } +inline +void G4KineticTrack::SetCreatorModelID(G4int id) +{ + theCreatorModel = id; +} +inline +G4int G4KineticTrack::GetCreatorModelID() const +{ + return theCreatorModel; +} + #endif diff --git a/source/processes/hadronic/util/include/G4Nucleon.hh b/source/processes/hadronic/util/include/G4Nucleon.hh index c58e48d901..6b944d160d 100644 --- a/source/processes/hadronic/util/include/G4Nucleon.hh +++ b/source/processes/hadronic/util/include/G4Nucleon.hh @@ -42,10 +42,10 @@ #include "G4ParticleDefinition.hh" #include "G4Proton.hh" #include "G4Neutron.hh" - -#include "G4AntiProton.hh" // Uzhi Feb. 2011 -#include "G4AntiNeutron.hh" // Uzhi Feb. 2011 - +#include "G4Lambda.hh" +#include "G4AntiProton.hh" +#include "G4AntiNeutron.hh" +#include "G4AntiLambda.hh" #include "G4VKineticNucleon.hh" //#include "G4VSplitableHadron.hh" @@ -74,11 +74,13 @@ class G4Nucleon : public G4VKineticNucleon inline void SetBindingEnergy(G4double anEnergy) {theBindingE = anEnergy;} inline G4double GetBindingEnergy() const {return theBindingE;} - inline void SetParticleType(G4Proton * aProton) {theParticleType = aProton;} - inline void SetParticleType(G4Neutron *aNeutron){theParticleType = aNeutron;} + inline void SetParticleType(G4Proton* aProton) {theParticleType = aProton;} + inline void SetParticleType(G4Neutron* aNeutron){theParticleType = aNeutron;} + inline void SetParticleType(G4Lambda* aLambda) {theParticleType = aLambda;} - inline void SetParticleType(G4AntiProton * aAntiProton) {theParticleType =aAntiProton;} - inline void SetParticleType(G4AntiNeutron *aAntiNeutron){theParticleType =aAntiNeutron;} + inline void SetParticleType(G4AntiProton* aAntiProton) {theParticleType = aAntiProton;} + inline void SetParticleType(G4AntiNeutron* aAntiNeutron){theParticleType = aAntiNeutron;} + inline void SetParticleType(G4AntiLambda* aAntiLambda) {theParticleType = aAntiLambda;} inline const G4ParticleDefinition* GetParticleType() const {return theParticleType;} virtual const G4ParticleDefinition* GetDefinition() const {return theParticleType;} diff --git a/source/processes/hadronic/util/include/G4Nucleus.hh b/source/processes/hadronic/util/include/G4Nucleus.hh index 3dde0f69ca..166363271e 100644 --- a/source/processes/hadronic/util/include/G4Nucleus.hh +++ b/source/processes/hadronic/util/include/G4Nucleus.hh @@ -30,7 +30,8 @@ // M.G. Pia, 2 Oct 1998: modified GetFermiMomentum (original design was // the source of memory leaks) // G.Folger, spring 2010: add integer A/Z interface - +// A. Ribon, autumn 2021: extended to hypernuclei + #ifndef G4Nucleus_h #define G4Nucleus_h 1 // Class Description @@ -52,8 +53,8 @@ class G4Nucleus public: G4Nucleus(); - G4Nucleus(const G4double A, const G4double Z); - G4Nucleus(const G4int A, const G4int Z); + G4Nucleus(const G4double A, const G4double Z, const G4int numberOfLambdas = 0); + G4Nucleus(const G4int A, const G4int Z, const G4int numberOfLambdas = 0); G4Nucleus(const G4Material* aMaterial); ~G4Nucleus(); @@ -66,6 +67,7 @@ class G4Nucleus if (this != &right) { theA=right.theA; theZ=right.theZ; + theL=right.theL; aEff=right.aEff; zEff=right.zEff; fIsotope = right.fIsotope; @@ -91,21 +93,9 @@ class G4Nucleus void ChooseParameters( const G4Material *aMaterial ); - void SetParameters( const G4double A, const G4double Z ); - void SetParameters( const G4int A, const G4int Z ); + void SetParameters( const G4double A, const G4double Z, const G4int numberOfLambdas = 0 ); + void SetParameters( const G4int A, const G4int Z, const G4int numberOfLambdas = 0 ); -/* -#ifndef G4Hadr_Nucleus_IntegerAZ -//deprecated Jan 2010, GF - inline G4double GetN() const - { return aEff; } - - inline G4double GetZ() const - { return zEff; } -#endif -//to be replaced by new -*/ - inline G4int GetA_asInt() const { return theA; } @@ -114,7 +104,9 @@ class G4Nucleus inline G4int GetZ_asInt() const { return theZ; } -//... \GF + + inline G4int GetL() const // Number of Lambdas (in the case of a hypernucleus) + { return theL; } inline const G4Isotope* GetIsotope() { return fIsotope; } @@ -125,6 +117,7 @@ class G4Nucleus if(iso) { theZ = iso->GetZ(); theA = iso->GetN(); + theL = 0; aEff = theA; zEff = theZ; } @@ -132,9 +125,9 @@ class G4Nucleus G4DynamicParticle *ReturnTargetParticle() const; - G4double AtomicMass( const G4double A, const G4double Z ) const; - G4double AtomicMass( const G4int A, const G4int Z ) const; - + G4double AtomicMass( const G4double A, const G4double Z, const G4int numberOfLambdas = 0 ) const; + G4double AtomicMass( const G4int A, const G4int Z, const G4int numberOfLambdas = 0 ) const; + G4double GetThermalPz( const G4double mass, const G4double temp ) const; G4ReactionProduct GetThermalNucleus(G4double aMass, G4double temp=-1) const; @@ -192,6 +185,7 @@ class G4Nucleus G4int theA; G4int theZ; + G4int theL; // Number of Lambdas (in the case of hypernucleus) G4double aEff; // effective atomic weight G4double zEff; // effective atomic number diff --git a/source/processes/hadronic/util/include/G4ReactionProduct.hh b/source/processes/hadronic/util/include/G4ReactionProduct.hh index 996203b16d..b154670b7d 100644 --- a/source/processes/hadronic/util/include/G4ReactionProduct.hh +++ b/source/processes/hadronic/util/include/G4ReactionProduct.hh @@ -162,10 +162,10 @@ class G4ReactionProduct inline G4int GetSide() const { return side; } - inline void SetCreatorModel( const G4int mod ) + inline void SetCreatorModelID( const G4int mod ) { theCreatorModel = mod; } - inline G4int GetCreatorModel() const + inline G4int GetCreatorModelID() const { return theCreatorModel; } inline void SetNewlyAdded( const G4bool f ) diff --git a/source/processes/hadronic/util/include/G4V3DNucleus.hh b/source/processes/hadronic/util/include/G4V3DNucleus.hh index db859c240a..39d046a23d 100644 --- a/source/processes/hadronic/util/include/G4V3DNucleus.hh +++ b/source/processes/hadronic/util/include/G4V3DNucleus.hh @@ -51,13 +51,14 @@ class G4V3DNucleus G4bool operator!=(const G4V3DNucleus &right) const; public: - virtual void Init(G4int theA, G4int theZ) = 0; + virtual void Init(G4int theA, G4int theZ, G4int numberOfLambdas = 0) = 0; virtual G4bool StartLoop() = 0; virtual G4Nucleon * GetNextNucleon() = 0; virtual const std::vector & GetNucleons() = 0; virtual G4int GetMassNumber() = 0; virtual G4double GetMass() = 0; virtual G4int GetCharge() = 0; + virtual G4int GetNumberOfLambdas() = 0; virtual G4double GetNuclearRadius() = 0; virtual G4double GetNuclearRadius(const G4double maxRelativeDensity) = 0; virtual G4double GetOuterRadius() = 0; diff --git a/source/processes/hadronic/util/src/G4DecayKineticTracks.cc b/source/processes/hadronic/util/src/G4DecayKineticTracks.cc index 4cea6bf8f6..74a9f9efe5 100644 --- a/source/processes/hadronic/util/src/G4DecayKineticTracks.cc +++ b/source/processes/hadronic/util/src/G4DecayKineticTracks.cc @@ -52,8 +52,14 @@ void G4DecayKineticTracks::Decay(G4KineticTrackVector *tracks) const { // Select decay of current track, put daughters at end of vector daughters = track->GetDefinition()->IsShortLived() ? track->Decay() : 0; - + if (daughters) { + // Assign to the daughters the creator model ID of their parent + for (size_t k=0; ksize(); ++k) { + G4KineticTrack* aDaughter = (*daughters)[k]; + if (aDaughter) aDaughter->SetCreatorModelID(track->GetCreatorModelID()); + } + tracks->insert(tracks->end(), daughters->begin(), daughters->end()); delete track; // Remove parent track delete daughters; diff --git a/source/processes/hadronic/util/src/G4DecayStrongResonances.cc b/source/processes/hadronic/util/src/G4DecayStrongResonances.cc index f94b74bf1b..312137d03c 100644 --- a/source/processes/hadronic/util/src/G4DecayStrongResonances.cc +++ b/source/processes/hadronic/util/src/G4DecayStrongResonances.cc @@ -73,6 +73,7 @@ G4DecayStrongResonances::Propagate(G4KineticTrackVector* theSecondaries, it->SetMass(aSecondary->GetDefinition()->GetPDGMass()); it->SetTotalEnergy(aSecondary->Get4Momentum().t()); it->SetMomentum(aSecondary->Get4Momentum().vect()); + it->SetCreatorModelID(aSecondary->GetCreatorModelID()); delete aSecondary; try { theResult->push_back(it); } catch(...){ diff --git a/source/processes/hadronic/util/src/G4Fancy3DNucleus.cc b/source/processes/hadronic/util/src/G4Fancy3DNucleus.cc index 72701ac769..28751cc55a 100644 --- a/source/processes/hadronic/util/src/G4Fancy3DNucleus.cc +++ b/source/processes/hadronic/util/src/G4Fancy3DNucleus.cc @@ -42,6 +42,7 @@ #include "G4NuclearFermiDensity.hh" #include "G4NuclearShellModelDensity.hh" #include "G4NucleiProperties.hh" +#include "G4HyperNucleiProperties.hh" #include "G4Nucleon.hh" #include "G4SystemOfUnits.hh" #include "Randomize.hh" @@ -57,7 +58,7 @@ #include "G4PhysicalConstants.hh" G4Fancy3DNucleus::G4Fancy3DNucleus() - : myA(0), myZ(0), theNucleons(250), currentNucleon(-1), theDensity(0), + : myA(0), myZ(0), myL(0), theNucleons(250), currentNucleon(-1), theDensity(0), nucleondistance(0.8*fermi),excitationEnergy(0.), places(250), momentum(250), fermiM(250), testSums(250) { @@ -69,17 +70,17 @@ G4Fancy3DNucleus::~G4Fancy3DNucleus() } #if defined(NON_INTEGER_A_Z) -void G4Fancy3DNucleus::Init(G4double theA, G4double theZ) +void G4Fancy3DNucleus::Init(G4double theA, G4double theZ, G4int numberOfLambdas) { G4int intZ = G4int(theZ); G4int intA= ( G4UniformRand()>theA-G4int(theA) ) ? G4int(theA) : G4int(theA)+1; // forward to integer Init() - Init(intA, intZ); + Init(intA, intZ, std::max(numberOfLambdas, 0)); } #endif -void G4Fancy3DNucleus::Init(G4int theA, G4int theZ) +void G4Fancy3DNucleus::Init(G4int theA, G4int theZ, G4int numberOfLambdas) { currentNucleon=-1; theNucleons.clear(); @@ -90,10 +91,14 @@ void G4Fancy3DNucleus::Init(G4int theA, G4int theZ) testSums.clear(); myZ = theZ; - myA= theA; + myA = theA; + myL = std::max(numberOfLambdas, 0); // Cannot be negative excitationEnergy=0; theNucleons.resize(myA); // Pre-loads vector with empty elements + + // For simplicity, we neglect eventual Lambdas in the nucleus as far as the + // density of nucler levels and the Fermi level are concerned. if(theDensity) delete theDensity; if ( myA < 17 ) { @@ -197,9 +202,10 @@ G4double G4Fancy3DNucleus::GetOuterRadius() G4double G4Fancy3DNucleus::GetMass() { - return myZ*G4Proton::Proton()->GetPDGMass() + - (myA-myZ)*G4Neutron::Neutron()->GetPDGMass() - - BindingEnergy(); + if ( myL <= 0 ) return myZ*G4Proton::Proton()->GetPDGMass() + + (myA-myZ)*G4Neutron::Neutron()->GetPDGMass() - + BindingEnergy(); + else return G4HyperNucleiProperties::GetNuclearMass(myA, myZ, myL); } @@ -273,22 +279,28 @@ const G4VNuclearDensity * G4Fancy3DNucleus::GetNuclearDensity() const void G4Fancy3DNucleus::ChooseNucleons() { - G4int protons=0,nucleons=0; - - while (nucleons < myA ) /* Loop checking, 30-Oct-2015, G.Folger */ - { - if ( protons < myZ && G4UniformRand() < (G4double)(myZ-protons)/(G4double)(myA-nucleons) ) - { - protons++; - theNucleons[nucleons++].SetParticleType(G4Proton::Proton()); - } - else if ( (nucleons-protons) < (myA-myZ) ) - { - theNucleons[nucleons++].SetParticleType(G4Neutron::Neutron()); - } - else G4cout << "G4Fancy3DNucleus::ChooseNucleons not efficient" << G4endl; - } - return; + G4int protons=0, nucleons=0, lambdas=0; + G4double probProton = ( G4double(myZ) )/( G4double(myA) ); + G4double probLambda = myL > 0 ? ( G4double(myL) )/( G4double(myA) ) : 0.0; + while ( nucleons < myA ) { /* Loop checking, 30-Oct-2015, G.Folger */ + G4double rnd = G4UniformRand(); + if ( rnd < probProton ) { + if ( protons < myZ ) { + protons++; + theNucleons[nucleons++].SetParticleType(G4Proton::Proton()); + } + } else if ( rnd < probProton + probLambda ) { + if ( lambdas < myL ) { + lambdas++; + theNucleons[nucleons++].SetParticleType(G4Lambda::Lambda()); + } + } else { + if ( (nucleons - protons - lambdas) < (myA - myZ - myL) ) { + theNucleons[nucleons++].SetParticleType(G4Neutron::Neutron()); + } + } + } + return; } void G4Fancy3DNucleus::ChoosePositions() diff --git a/source/processes/hadronic/util/src/G4Fragment.cc b/source/processes/hadronic/util/src/G4Fragment.cc index 143c0aba5b..9189c790e1 100644 --- a/source/processes/hadronic/util/src/G4Fragment.cc +++ b/source/processes/hadronic/util/src/G4Fragment.cc @@ -36,6 +36,7 @@ // inline to source // 25.09.2010 M. Kelsey -- Change "setprecision" to "setwidth" in printout, // add null pointer check. +// 27.10.2021 A.Ribon extension for hypernuclei. #include "G4Fragment.hh" #include "G4HadronicException.hh" @@ -54,6 +55,7 @@ const G4double G4Fragment::minFragExcitation = 10.*CLHEP::eV; G4Fragment::G4Fragment() : theA(0), theZ(0), + theL(0), theExcitationEnergy(0.0), theGroundStateMass(0.0), theMomentum(G4LorentzVector(0,0,0,0)), @@ -74,6 +76,7 @@ G4Fragment::G4Fragment() : G4Fragment::G4Fragment(const G4Fragment &right) : theA(right.theA), theZ(right.theZ), + theL(right.theL), theExcitationEnergy(right.theExcitationEnergy), theGroundStateMass(right.theGroundStateMass), theMomentum(right.theMomentum), @@ -96,6 +99,32 @@ G4Fragment::~G4Fragment() G4Fragment::G4Fragment(G4int A, G4int Z, const G4LorentzVector& aMomentum, G4bool warning) : theA(A), theZ(Z), + theL(0), + theExcitationEnergy(0.0), + theGroundStateMass(0.0), + theMomentum(aMomentum), + thePolarization(nullptr), + creatorModel(-1), + numberOfParticles(0), + numberOfCharged(0), + numberOfHoles(0), + numberOfChargedHoles(0), + numberOfShellElectrons(0), + xLevel(0), + theParticleDefinition(nullptr), + spin(0.0), + theCreationTime(0.0) +{ + if(theA > 0) { + CalculateGroundStateMass(); + CalculateExcitationEnergy(warning); + } +} + +G4Fragment::G4Fragment(G4int A, G4int Z, G4int numberOfLambdas, const G4LorentzVector& aMomentum, G4bool warning) : + theA(A), + theZ(Z), + theL(std::max(numberOfLambdas,0)), theExcitationEnergy(0.0), theGroundStateMass(0.0), theMomentum(aMomentum), @@ -122,6 +151,7 @@ G4Fragment::G4Fragment(const G4LorentzVector& aMomentum, const G4ParticleDefinition * aParticleDefinition) : theA(0), theZ(0), + theL(0), theExcitationEnergy(0.0), theMomentum(aMomentum), thePolarization(nullptr), @@ -150,6 +180,7 @@ G4Fragment & G4Fragment::operator=(const G4Fragment &right) if (this != &right) { theA = right.theA; theZ = right.theZ; + theL = right.theL; theExcitationEnergy = right.theExcitationEnergy; theGroundStateMass = right.theGroundStateMass; theMomentum = right.theMomentum; @@ -184,7 +215,8 @@ std::ostream& operator << (std::ostream &out, const G4Fragment &theFragment) out.setf(std::ios::floatfield); out << "Fragment: A = " << std::setw(3) << theFragment.theA - << ", Z = " << std::setw(3) << theFragment.theZ ; + << ", Z = " << std::setw(3) << theFragment.theZ + << ", numberOfLambdas = " << std::setw(3) << theFragment.theL ; out.setf(std::ios::scientific,std::ios::floatfield); // Store user's precision setting and reset to (3) here: back-compatibility @@ -193,8 +225,8 @@ std::ostream& operator << (std::ostream &out, const G4Fragment &theFragment) out << std::setprecision(3) << ", U = " << theFragment.GetExcitationEnergy()/CLHEP::MeV << " MeV "; - if(theFragment.GetCreatorModelType() >= 0) { - out << " creatorModelType= " << theFragment.GetCreatorModelType(); + if(theFragment.GetCreatorModelID() >= 0) { + out << " creatorModelID= " << theFragment.GetCreatorModelID(); } if(theFragment.GetCreationTime() > 0.0) { out << " Time= " << theFragment.GetCreationTime()/CLHEP::ns << " ns"; diff --git a/source/processes/hadronic/util/src/G4HadronicParameters.cc b/source/processes/hadronic/util/src/G4HadronicParameters.cc index 662a5a0690..ae655789d6 100644 --- a/source/processes/hadronic/util/src/G4HadronicParameters.cc +++ b/source/processes/hadronic/util/src/G4HadronicParameters.cc @@ -101,6 +101,7 @@ void G4HadronicParameters::SetMinEnergyTransitionFTF_Cascade( const G4double val } } + void G4HadronicParameters::SetMaxEnergyTransitionFTF_Cascade( const G4double val ) { if ( ! IsLocked() && val > fMinEnergyTransitionFTF_Cascade ) { fMaxEnergyTransitionFTF_Cascade = val; @@ -120,12 +121,16 @@ void G4HadronicParameters::SetMaxEnergyTransitionQGS_FTF( const G4double val ) { } } - void G4HadronicParameters::SetEnableBCParticles( G4bool val ) { if ( ! IsLocked() ) fEnableBC = val; } +void G4HadronicParameters::SetEnableHyperNuclei( G4bool val ) { + if ( ! IsLocked() ) fEnableHyperNuclei = val; +} + + void G4HadronicParameters::SetVerboseLevel( const G4int val ) { if ( ! IsLocked() && val >= 0 ) fVerboseLevel = val; } diff --git a/source/processes/hadronic/util/src/G4KineticTrack.cc b/source/processes/hadronic/util/src/G4KineticTrack.cc index 65db852780..c35a617aa2 100644 --- a/source/processes/hadronic/util/src/G4KineticTrack.cc +++ b/source/processes/hadronic/util/src/G4KineticTrack.cc @@ -78,7 +78,8 @@ G4KineticTrack::G4KineticTrack() : theDaughterMass(0), theDaughterWidth(0), theStateToNucleus(undefined), - theProjectilePotential(0) + theProjectilePotential(0), + theCreatorModel(-1) { //////////////// // DEBUG // @@ -117,7 +118,7 @@ G4KineticTrack::G4KineticTrack(const G4KineticTrack &right) : G4VKineticNucleon( theDaughterWidth = 0; theStateToNucleus=right.theStateToNucleus; theProjectilePotential=right.theProjectilePotential; - + theCreatorModel = right.GetCreatorModelID(); //////////////// // DEBUG // //////////////// @@ -146,7 +147,8 @@ G4KineticTrack::G4KineticTrack(const G4ParticleDefinition* aDefinition, theTotal4Momentum(a4Momentum), theNucleon(0), theStateToNucleus(undefined), - theProjectilePotential(0) + theProjectilePotential(0), + theCreatorModel(-1) { if(G4KaonZero::KaonZero() == theDefinition || G4AntiKaonZero::AntiKaonZero() == theDefinition) @@ -412,8 +414,8 @@ G4KineticTrack::G4KineticTrack(const G4ParticleDefinition* aDefinition, } G4KineticTrack::G4KineticTrack(G4Nucleon * nucleon, - const G4ThreeVector& aPosition, - const G4LorentzVector& a4Momentum) + const G4ThreeVector& aPosition, + const G4LorentzVector& a4Momentum) : theDefinition(nucleon->GetDefinition()), theFormationTime(0), thePosition(aPosition), @@ -426,7 +428,8 @@ G4KineticTrack::G4KineticTrack(G4Nucleon * nucleon, theDaughterMass(0), theDaughterWidth(0), theStateToNucleus(undefined), - theProjectilePotential(0) + theProjectilePotential(0), + theCreatorModel(-1) { theFermi3Momentum.setE(0); Set4Momentum(a4Momentum); @@ -458,6 +461,7 @@ G4KineticTrack& G4KineticTrack::operator=(const G4KineticTrack& right) nChannels = right.GetnChannels(); theActualWidth = new G4double[nChannels]; for (G4int i = 0; i < nChannels; ++i) theActualWidth[i] = right.theActualWidth[i]; + theCreatorModel = right.GetCreatorModelID(); } return *this; } @@ -694,7 +698,9 @@ G4KineticTrackVector* G4KineticTrack::Decay() // // Create the kinetic track List associated to the decay products -// +// +// For the decay products of hadronic resonances, we assign as creator model ID +// the same as their parent G4LorentzRotation toMoving(Get4Momentum().boostVector()); G4DynamicParticle* theDynamicParticle; G4double formationTime = 0.0; @@ -713,10 +719,12 @@ G4KineticTrackVector* G4KineticTrack::Decay() momentumBalanceCMS += theDynamicParticle->Get4Momentum(); momentum = toMoving*theDynamicParticle->Get4Momentum(); energyMomentumBalance -= momentum; - theDecayProductList->push_back(new G4KineticTrack (aProduct, + G4KineticTrack* aDaughter = new G4KineticTrack (aProduct, formationTime, position, - momentum)); + momentum); + if (aDaughter != nullptr) aDaughter->SetCreatorModelID(GetCreatorModelID()); + theDecayProductList->push_back(aDaughter); delete theDynamicParticle; } delete theDecayProducts; diff --git a/source/processes/hadronic/util/src/G4Nucleus.cc b/source/processes/hadronic/util/src/G4Nucleus.cc index 2e7f93d457..de560adfdf 100644 --- a/source/processes/hadronic/util/src/G4Nucleus.cc +++ b/source/processes/hadronic/util/src/G4Nucleus.cc @@ -25,20 +25,21 @@ // // // - // original by H.P. Wellisch - // modified by J.L. Chuma, TRIUMF, 19-Nov-1996 - // last modified: 27-Mar-1997 - // J.P.Wellisch: 23-Apr-97: minor simplifications - // modified by J.L.Chuma 24-Jul-97 to set the total momentum in Cinema and - // EvaporationEffects - // modified by J.L.Chuma 21-Oct-97 put std::abs() around the totalE^2-mass^2 - // in calculation of total momentum in - // Cinema and EvaporationEffects - // Chr. Volcker, 10-Nov-1997: new methods and class variables. - // HPW added utilities for low energy neutron transport. (12.04.1998) - // M.G. Pia, 2 Oct 1998: modified GetFermiMomentum to avoid memory leaks - // G.Folger, spring 2010: add integer A/Z interface - // A. Ribon, 6 August 2015: migrated to G4Exp and G4Log. +// original by H.P. Wellisch +// modified by J.L. Chuma, TRIUMF, 19-Nov-1996 +// last modified: 27-Mar-1997 +// J.P.Wellisch: 23-Apr-97: minor simplifications +// modified by J.L.Chuma 24-Jul-97 to set the total momentum in Cinema and +// EvaporationEffects +// modified by J.L.Chuma 21-Oct-97 put std::abs() around the totalE^2-mass^2 +// in calculation of total momentum in +// Cinema and EvaporationEffects +// Chr. Volcker, 10-Nov-1997: new methods and class variables. +// HPW added utilities for low energy neutron transport. (12.04.1998) +// M.G. Pia, 2 Oct 1998: modified GetFermiMomentum to avoid memory leaks +// G.Folger, spring 2010: add integer A/Z interface +// A. Ribon, summer 2015: migrated to G4Exp and G4Log +// A. Ribon, autumn 2021: extended to hypernuclei #include "G4Nucleus.hh" #include "G4NucleiProperties.hh" @@ -46,13 +47,13 @@ #include "G4SystemOfUnits.hh" #include "Randomize.hh" #include "G4HadronicException.hh" - #include "G4Exp.hh" #include "G4Log.hh" +#include "G4HyperNucleiProperties.hh" + - G4Nucleus::G4Nucleus() - : theA(0), theZ(0), aEff(0.0), zEff(0) + : theA(0), theZ(0), theL(0), aEff(0.0), zEff(0) { pnBlackTrackEnergy = 0.0; dtaBlackTrackEnergy = 0.0; @@ -65,9 +66,9 @@ G4Nucleus::G4Nucleus() fIsotope = 0; } -G4Nucleus::G4Nucleus( const G4double A, const G4double Z ) +G4Nucleus::G4Nucleus( const G4double A, const G4double Z, const G4int numberOfLambdas ) { - SetParameters( A, Z ); + SetParameters( A, Z, std::max(numberOfLambdas, 0) ); pnBlackTrackEnergy = 0.0; dtaBlackTrackEnergy = 0.0; pnBlackTrackEnergyfromAnnihilation = 0.0; @@ -79,9 +80,9 @@ G4Nucleus::G4Nucleus( const G4double A, const G4double Z ) fIsotope = 0; } -G4Nucleus::G4Nucleus( const G4int A, const G4int Z ) +G4Nucleus::G4Nucleus( const G4int A, const G4int Z, const G4int numberOfLambdas ) { - SetParameters( A, Z ); + SetParameters( A, Z, std::max(numberOfLambdas, 0) ); pnBlackTrackEnergy = 0.0; dtaBlackTrackEnergy = 0.0; pnBlackTrackEnergyfromAnnihilation = 0.0; @@ -109,36 +110,128 @@ G4Nucleus::G4Nucleus( const G4Material *aMaterial ) G4Nucleus::~G4Nucleus() {} -G4ReactionProduct G4Nucleus:: -GetBiasedThermalNucleus(G4double aMass, G4ThreeVector aVelocity, G4double temp) const + +//------------------------------------------------------------------------------------------------- +// SVT (Sampling of the Velocity of the Target nucleus) method, L. Thulliez (CEA-Saclay) 2021/05/04 +//------------------------------------------------------------------------------------------------- +G4ReactionProduct +G4Nucleus::GetBiasedThermalNucleus(G4double aMass, G4ThreeVector aVelocity, G4double temp) const { - G4double velMag = aVelocity.mag(); + // If E_neutron <= 400*kB*T (400 is a common value encounter in MC neutron transport code) + // Then apply the Sampling ot the Velocity of the Target (SVT) method + // Else consider the target nucleus being without motion + G4double E_threshold = 400.0*8.617333262E-11*temp; // 400*kBoltzman*T + G4double E_neutron = 0.5*aVelocity.mag2()*G4Neutron::Neutron()->GetPDGMass(); // E=0.5*m*v2 + G4ReactionProduct result; - G4double value = 0; - G4double random = 1; - G4double norm = 3.*std::sqrt(k_Boltzmann*temp*aMass*G4Neutron::Neutron()->GetPDGMass()); - norm /= G4Neutron::Neutron()->GetPDGMass(); - norm *= 5.; - norm += velMag; - norm /= velMag; - const G4int maxNumberOfLoops = 1000000; - G4int loopCounter = -1; - while ( (value/norm= maxNumberOfLoops ) { - G4ExceptionDescription ed; - ed << " Failed sampling after maxNumberOfLoops attempts : forced exit! " << G4endl; - G4Exception( " G4Nucleus::GetBiasedThermalNucleus ", "HAD_NUCLEUS_001", JustWarning, ed ); - result = GetThermalNucleus(aMass, temp); + result.SetMass(aMass*G4Neutron::Neutron()->GetPDGMass()); + + if ( E_neutron <= E_threshold ) { + + // Beta = sqrt(m/2kT) + G4double beta = std::sqrt(result.GetMass()/(2.*8.617333262E-11*temp)); // kT E-5[eV] mass E-11[MeV] => beta in [m/s]-1 + + // Neutron speed vn + G4double vN_norm = aVelocity.mag(); + G4double vN_norm2 = vN_norm*vN_norm; + G4double y = beta*vN_norm; + + // Normalize neutron velocity + aVelocity = (1./vN_norm)*aVelocity; + + // Sample target speed + G4double x2; + G4double randThreshold; + G4double vT_norm, vT_norm2, mu; //theta, val1, val2, + G4double acceptThreshold; + G4double vRelativeSpeed; + G4double cdf0 = 2./(2.+std::sqrt(CLHEP::pi)*y); + + do { + // Sample the target velocity vT in the laboratory frame + if ( G4UniformRand() < cdf0 ) { + // Sample in C45 from https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-9721.pdf + x2 = -std::log(G4UniformRand()*G4UniformRand()); + } else { + // Sample in C61 from https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-9721.pdf + G4double ampl = std::cos(CLHEP::pi/2.0 * G4UniformRand()); + x2 = -std::log(G4UniformRand()) - std::log(G4UniformRand())*ampl*ampl; + } + + vT_norm = std::sqrt(x2)/beta; + vT_norm2 = vT_norm*vT_norm; + + // Sample cosine between the incident neutron and the target in the laboratory frame + mu = 2*G4UniformRand() - 1; + + // Define acceptance threshold + vRelativeSpeed = std::sqrt(vN_norm2 + vT_norm2 - 2*vN_norm*vT_norm*mu); + acceptThreshold = vRelativeSpeed/(vN_norm + vT_norm); + randThreshold = G4UniformRand(); + } while ( randThreshold >= acceptThreshold ); + + // Get target nucleus direction from the neutron direction and the relative angle between target nucleus and neutron (mu) + G4double cosTh = mu; + G4ThreeVector uNorm = aVelocity; + + G4double sinTh = std::sqrt(1. - cosTh*cosTh); + + // Sample randomly the phi angle between the neutron veloicty and the target velocity + G4double phi = CLHEP::twopi*G4UniformRand(); + G4double sinPhi = std::sin(phi); + G4double cosPhi = std::cos(phi); + + // Find orthogonal vector to aVelocity - solve equation xx' + yy' + zz' = 0 + G4ThreeVector ortho(1,1,1); + if ( uNorm[0] ) ortho[0] = -(uNorm[1]+uNorm[2])/uNorm[0]; + else if ( uNorm[1] ) ortho[1] = -(uNorm[0]+uNorm[2])/uNorm[1]; + else if ( uNorm[2] ) ortho[2] = -(uNorm[0]+uNorm[1])/uNorm[2]; + + // Normalize the vector + ortho = (1/ortho.mag())*ortho; + + // Find vector to draw a plan perpendicular to uNorm (i.e neutron velocity) with vectors ortho & orthoComp + G4ThreeVector orthoComp( uNorm[1]*ortho[2] - ortho[1]*uNorm[2], + uNorm[2]*ortho[0] - ortho[2]*uNorm[0], + uNorm[0]*ortho[1] - ortho[0]*uNorm[1] ); + + // Find the direction of the target velocity in the laboratory frame + G4ThreeVector directionTarget( cosTh*uNorm[0] + sinTh*(cosPhi*orthoComp[0] + sinPhi*ortho[0]), + cosTh*uNorm[1] + sinTh*(cosPhi*orthoComp[1] + sinPhi*ortho[1]), + cosTh*uNorm[2] + sinTh*(cosPhi*orthoComp[2] + sinPhi*ortho[2]) ); + + // Normalize directionTarget + directionTarget = (1/directionTarget.mag())*directionTarget; + + // Set momentum + G4double px = result.GetMass()*vT_norm*directionTarget[0]; + G4double py = result.GetMass()*vT_norm*directionTarget[1]; + G4double pz = result.GetMass()*vT_norm*directionTarget[2]; + result.SetMomentum(px, py, pz); + + G4double tMom = std::sqrt(px*px+py*py+pz*pz); + G4double tEtot = std::sqrt((tMom+result.GetMass())*(tMom+result.GetMass()) + - 2.*tMom*result.GetMass()); + + if ( tEtot/result.GetMass() - 1. > 0.001 ) { + // use relativistic energy for higher energies + result.SetTotalEnergy(tEtot); + } else { + // use p**2/2M for lower energies (to preserve precision?) + result.SetKineticEnergy(tMom*tMom/(2.*result.GetMass())); + } + + } else { // target nucleus considered as being without motion + + result.SetMomentum(0., 0., 0.); + result.SetKineticEnergy(0.); + } + return result; } + G4ReactionProduct G4Nucleus::GetThermalNucleus(G4double targetMass, G4double temp) const { @@ -176,7 +269,7 @@ G4Nucleus::ChooseParameters(const G4Material* aMaterial) const G4ElementVector* theElementVector = aMaterial->GetElementVector(); G4double running(0); // G4Element* element(0); - G4Element* element = (*theElementVector)[aMaterial->GetNumberOfElements()-1]; + const G4Element* element = (*theElementVector)[aMaterial->GetNumberOfElements()-1]; for (unsigned int i = 0; i < aMaterial->GetNumberOfElements(); ++i) { running += aMaterial->GetVecNbOfAtomsPerVolume()[i]; @@ -197,22 +290,25 @@ G4Nucleus::ChooseParameters(const G4Material* aMaterial) } theA=element->GetIsotope(iso)->GetN(); theZ=element->GetIsotope(iso)->GetZ(); + theL=0; aEff=theA; zEff=theZ; } else { aEff = element->GetN(); zEff = element->GetZ(); theZ = G4int(zEff + 0.5); - theA = G4int(aEff + 0.5); + theA = G4int(aEff + 0.5); + theL=0; } } void -G4Nucleus::SetParameters(G4double A, G4double Z) +G4Nucleus::SetParameters( const G4double A, const G4double Z, const G4int numberOfLambdas ) { theZ = G4lrint(Z); - theA = G4lrint(A); + theA = G4lrint(A); + theL = std::max(numberOfLambdas, 0); if (theA<1 || theZ<0 || theZ>theA) { throw G4HadronicException(__FILE__, __LINE__, "G4Nucleus::SetParameters called with non-physical parameters"); @@ -222,11 +318,13 @@ G4Nucleus::SetParameters(G4double A, G4double Z) fIsotope = 0; } + void -G4Nucleus::SetParameters(G4int A, const G4int Z ) +G4Nucleus::SetParameters( const G4int A, const G4int Z, const G4int numberOfLambdas ) { theZ = Z; - theA = A; + theA = A; + theL = std::max(numberOfLambdas, 0); if( theA<1 || theZ<0 || theZ>theA ) { throw G4HadronicException(__FILE__, __LINE__, @@ -237,219 +335,238 @@ G4Nucleus::SetParameters(G4int A, const G4int Z ) fIsotope = 0; } - G4DynamicParticle * - G4Nucleus::ReturnTargetParticle() const - { - // choose a proton or a neutron as the target particle - - G4DynamicParticle *targetParticle = new G4DynamicParticle; - if( G4UniformRand() < zEff/aEff ) - targetParticle->SetDefinition( G4Proton::Proton() ); - else - targetParticle->SetDefinition( G4Neutron::Neutron() ); - return targetParticle; + +G4DynamicParticle * +G4Nucleus::ReturnTargetParticle() const +{ + // choose a proton or a neutron (or a lamba if a hypernucleus) as the target particle + G4DynamicParticle *targetParticle = new G4DynamicParticle; + const G4double rnd = G4UniformRand(); + if ( rnd < zEff/aEff ) { + targetParticle->SetDefinition( G4Proton::Proton() ); + } else if ( rnd < (zEff + theL*1.0)/aEff ) { + targetParticle->SetDefinition( G4Lambda::Lambda() ); + } else { + targetParticle->SetDefinition( G4Neutron::Neutron() ); } + return targetParticle; +} + - G4double - G4Nucleus::AtomicMass( const G4double A, const G4double Z ) const - { - // Now returns (atomic mass - electron masses) +G4double +G4Nucleus::AtomicMass( const G4double A, const G4double Z, const G4int numberOfLambdas ) const +{ + // Now returns (atomic mass - electron masses) + if ( numberOfLambdas > 0 ) { + return G4HyperNucleiProperties::GetNuclearMass(G4int(A), G4int(Z), numberOfLambdas); + } else { return G4NucleiProperties::GetNuclearMass(A, Z); } +} + - G4double - G4Nucleus::AtomicMass( const G4int A, const G4int Z ) const - { - // Now returns (atomic mass - electron masses) +G4double +G4Nucleus::AtomicMass( const G4int A, const G4int Z, const G4int numberOfLambdas ) const +{ + // Now returns (atomic mass - electron masses) + if ( numberOfLambdas > 0 ) { + return G4HyperNucleiProperties::GetNuclearMass(A, Z, numberOfLambdas); + } else { return G4NucleiProperties::GetNuclearMass(A, Z); } +} - G4double - G4Nucleus::GetThermalPz( const G4double mass, const G4double temp ) const - { - G4double result = G4RandGauss::shoot(); - result *= std::sqrt(k_Boltzmann*temp*mass); // Das ist impuls (Pz), - // nichtrelativistische rechnung - // Maxwell verteilung angenommen - return result; - } - G4double - G4Nucleus::EvaporationEffects( G4double kineticEnergy ) - { - // derived from original FORTRAN code EXNU by H. Fesefeldt (10-Dec-1986) - // - // Nuclear evaporation as function of atomic number - // and kinetic energy (MeV) of primary particle - // - // returns kinetic energy (MeV) - // - if( aEff < 1.5 ) - { - pnBlackTrackEnergy = dtaBlackTrackEnergy = 0.0; - return 0.0; - } - G4double ek = kineticEnergy/GeV; - G4float ekin = std::min( 4.0, std::max( 0.1, ek ) ); - const G4float atno = std::min( 120., aEff ); - const G4float gfa = 2.0*((aEff-1.0)/70.)*G4Exp(-(aEff-1.0)/70.); - // - // 0.35 value at 1 GeV - // 0.05 value at 0.1 GeV - // - G4float cfa = std::max( 0.15, 0.35 + ((0.35-0.05)/2.3)*G4Log(ekin) ); - G4float exnu = 7.716 * cfa * G4Exp(-cfa) - * ((atno-1.0)/120.)*G4Exp(-(atno-1.0)/120.); - G4float fpdiv = std::max( 0.5, 1.0-0.25*ekin*ekin ); - // - // pnBlackTrackEnergy is the kinetic energy (in GeV) available for - // proton/neutron black track particles - // dtaBlackTrackEnergy is the kinetic energy (in GeV) available for - // deuteron/triton/alpha black track particles - // - pnBlackTrackEnergy = exnu*fpdiv; - dtaBlackTrackEnergy = exnu*(1.0-fpdiv); - - if( G4int(zEff+0.1) != 82 ) - { - G4double ran1 = -6.0; - G4double ran2 = -6.0; - for( G4int i=0; i<12; ++i ) - { - ran1 += G4UniformRand(); - ran2 += G4UniformRand(); - } - pnBlackTrackEnergy *= 1.0 + ran1*gfa; - dtaBlackTrackEnergy *= 1.0 + ran2*gfa; - } - pnBlackTrackEnergy = std::max( 0.0, pnBlackTrackEnergy ); - dtaBlackTrackEnergy = std::max( 0.0, dtaBlackTrackEnergy ); - while( pnBlackTrackEnergy+dtaBlackTrackEnergy >= ek ) /* Loop checking, 02.11.2015, A.Ribon */ - { - pnBlackTrackEnergy *= 1.0 - 0.5*G4UniformRand(); - dtaBlackTrackEnergy *= 1.0 - 0.5*G4UniformRand(); - } -// G4cout << "EvaporationEffects "<= ekOrg/GeV) { - pnBlackTrackEnergyfromAnnihilation *= ekOrg/GeV/blackSum; - dtaBlackTrackEnergyfromAnnihilation *= ekOrg/GeV/blackSum; - } - - return (pnBlackTrackEnergyfromAnnihilation+dtaBlackTrackEnergyfromAnnihilation)*GeV; + pnBlackTrackEnergy *= 1.0 + ran1*gfa; + dtaBlackTrackEnergy *= 1.0 + ran2*gfa; } - - G4double - G4Nucleus::Cinema( G4double kineticEnergy ) + pnBlackTrackEnergy = std::max( 0.0, pnBlackTrackEnergy ); + dtaBlackTrackEnergy = std::max( 0.0, dtaBlackTrackEnergy ); + while( pnBlackTrackEnergy+dtaBlackTrackEnergy >= ek ) /* Loop checking, 02.11.2015, A.Ribon */ { - // derived from original FORTRAN code CINEMA by H. Fesefeldt (14-Oct-1987) - // - // input: kineticEnergy (MeV) - // returns modified kinetic energy (MeV) - // - static const G4double expxu = 82.; // upper bound for arg. of exp - static const G4double expxl = -expxu; // lower bound for arg. of exp - - G4double ek = kineticEnergy/GeV; - G4double ekLog = G4Log( ek ); - G4double aLog = G4Log( aEff ); - G4double em = std::min( 1.0, 0.2390 + 0.0408*aLog*aLog ); - G4double temp1 = -ek * std::min( 0.15, 0.0019*aLog*aLog*aLog ); - G4double temp2 = G4Exp( std::max( expxl, std::min( expxu, -(ekLog-em)*(ekLog-em)*2.0 ) ) ); - G4double result = 0.0; - if( std::abs( temp1 ) < 1.0 ) - { - if( temp2 > 1.0e-10 )result = temp1*temp2; - } - else result = temp1*temp2; - if( result < -ek )result = -ek; - return result*GeV; + pnBlackTrackEnergy *= 1.0 - 0.5*G4UniformRand(); + dtaBlackTrackEnergy *= 1.0 - 0.5*G4UniformRand(); + } + //G4cout << "EvaporationEffects "<= ekOrg/GeV) { + pnBlackTrackEnergyfromAnnihilation *= ekOrg/GeV/blackSum; + dtaBlackTrackEnergyfromAnnihilation *= ekOrg/GeV/blackSum; } - // - // methods for class G4Nucleus ... by Christian Volcker - // + return (pnBlackTrackEnergyfromAnnihilation+dtaBlackTrackEnergyfromAnnihilation)*GeV; +} - G4ThreeVector G4Nucleus::GetFermiMomentum() - { - // chv: .. we assume zero temperature! - - // momentum is equally distributed in each phasespace volume dpx, dpy, dpz. - G4double ranflat1= - G4RandFlat::shoot((G4double)0.,(G4double)fermiMomentum); - G4double ranflat2= - G4RandFlat::shoot((G4double)0.,(G4double)fermiMomentum); - G4double ranflat3= - G4RandFlat::shoot((G4double)0.,(G4double)fermiMomentum); - G4double ranmax = (ranflat1>ranflat2? ranflat1: ranflat2); - ranmax = (ranmax>ranflat3? ranmax : ranflat3); - - // Isotropic momentum distribution - G4double costheta = 2.*G4UniformRand() - 1.0; - G4double sintheta = std::sqrt(1.0 - costheta*costheta); - G4double phi = 2.0*pi*G4UniformRand(); - - G4double pz=costheta*ranmax; - G4double px=sintheta*std::cos(phi)*ranmax; - G4double py=sintheta*std::sin(phi)*ranmax; - G4ThreeVector p(px,py,pz); - return p; - } - G4ReactionProductVector* G4Nucleus::Fragmentate() +G4double +G4Nucleus::Cinema( G4double kineticEnergy ) +{ + // derived from original FORTRAN code CINEMA by H. Fesefeldt (14-Oct-1987) + // + // input: kineticEnergy (MeV) + // returns modified kinetic energy (MeV) + // + static const G4double expxu = 82.; // upper bound for arg. of exp + static const G4double expxl = -expxu; // lower bound for arg. of exp + + G4double ek = kineticEnergy/GeV; + G4double ekLog = G4Log( ek ); + G4double aLog = G4Log( aEff ); + G4double em = std::min( 1.0, 0.2390 + 0.0408*aLog*aLog ); + G4double temp1 = -ek * std::min( 0.15, 0.0019*aLog*aLog*aLog ); + G4double temp2 = G4Exp( std::max( expxl, std::min( expxu, -(ekLog-em)*(ekLog-em)*2.0 ) ) ); + G4double result = 0.0; + if( std::abs( temp1 ) < 1.0 ) { - // needs implementation! - return NULL; + if( temp2 > 1.0e-10 )result = temp1*temp2; } + else result = temp1*temp2; + if( result < -ek )result = -ek; + return result*GeV; +} + + +G4ThreeVector G4Nucleus::GetFermiMomentum() +{ + // chv: .. we assume zero temperature! + + // momentum is equally distributed in each phasespace volume dpx, dpy, dpz. + G4double ranflat1= + G4RandFlat::shoot((G4double)0.,(G4double)fermiMomentum); + G4double ranflat2= + G4RandFlat::shoot((G4double)0.,(G4double)fermiMomentum); + G4double ranflat3= + G4RandFlat::shoot((G4double)0.,(G4double)fermiMomentum); + G4double ranmax = (ranflat1>ranflat2? ranflat1: ranflat2); + ranmax = (ranmax>ranflat3? ranmax : ranflat3); + + // Isotropic momentum distribution + G4double costheta = 2.*G4UniformRand() - 1.0; + G4double sintheta = std::sqrt(1.0 - costheta*costheta); + G4double phi = 2.0*pi*G4UniformRand(); + + G4double pz=costheta*ranmax; + G4double px=sintheta*std::cos(phi)*ranmax; + G4double py=sintheta*std::sin(phi)*ranmax; + G4ThreeVector p(px,py,pz); + return p; +} - void G4Nucleus::AddMomentum(const G4ThreeVector aMomentum) - { - momentum+=(aMomentum); - } + +G4ReactionProductVector* G4Nucleus::Fragmentate() +{ + // needs implementation! + return nullptr; +} - void G4Nucleus::AddExcitationEnergy( G4double anEnergy ) - { - excitationEnergy+=anEnergy; - } + +void G4Nucleus::AddMomentum(const G4ThreeVector aMomentum) +{ + momentum+=(aMomentum); +} + + +void G4Nucleus::AddExcitationEnergy( G4double anEnergy ) +{ + excitationEnergy+=anEnergy; +} /* end of file */ diff --git a/source/processes/hadronic/util/src/G4SampleResonance.cc b/source/processes/hadronic/util/src/G4SampleResonance.cc index 6c40ee436a..da1522f471 100644 --- a/source/processes/hadronic/util/src/G4SampleResonance.cc +++ b/source/processes/hadronic/util/src/G4SampleResonance.cc @@ -62,23 +62,51 @@ G4double G4SampleResonance::GetMinimumMass(const G4ParticleDefinition* p) const const G4DecayTable* theDecays = p->GetDecayTable(); const G4int nDecays = theDecays->entries(); + // To find the minimum mass of the resonance, consider only the + // decay channels whose branching ratio is above a given threshold. + // This is needed to avoid that rare and light decay channels + // (e.g. e+ e-) can set a very small minimum mass of the resonance. + // In the case that no channel with branching ratio above the + // threshold has been found, consider the channel with the highest + // branching ratio (whatever its values). + // Note that this solution works also when rare decays are artificially + // enhanced if both of the following conditions hold: + // 1. The enhanced rare decays have branching ratios below the threshold + // 2. The decay with the highest branching ratio is a "natural" decay, + // i.e. not a rare decay which has been artificially enhanced. + const G4double thresholdChannelProbability = 0.10; + G4double foundChannelAboveThresholdProbability = false; + G4double minMassMostProbableChannel = 0.0; + G4double highestChannelProbability = 0.0; for (G4int i=0; iGetDecayChannel(i); - const G4int nDaughters = aDecay->GetNumberOfDaughters(); - - G4double minChannelMass = 0; - - for (G4int j=0; jGetBR(); + if (decayBr > std::min(highestChannelProbability, thresholdChannelProbability)) { + const G4int nDaughters = aDecay->GetNumberOfDaughters(); + G4double minChannelMass = 0; + for (G4int j=0; j(aDecay)->GetDaughter(j); G4double minMass = GetMinimumMass(aDaughter); if (!minMass) minMass = DBL_MAX; // exclude gamma channel; minChannelMass+=minMass; - } - // G4cout << "channel mass for the above is " << minChannelMass/MeV << G4endl; - if (minChannelMass < minResonanceMass) minResonanceMass = minChannelMass; - + } + if (decayBr > highestChannelProbability) + { + highestChannelProbability = decayBr; + minMassMostProbableChannel = minChannelMass; + } + if (decayBr > thresholdChannelProbability) + { + foundChannelAboveThresholdProbability = true; + if (minChannelMass < minResonanceMass) minResonanceMass = minChannelMass; + } + } + } + if ( ! foundChannelAboveThresholdProbability ) { + minResonanceMass = minMassMostProbableChannel; } // replace this as soon as the compiler supports mutable!! G4SampleResonance* self = const_cast(this); diff --git a/source/processes/management/History b/source/processes/management/History index eecdb1ca2a..c8842a25a2 100644 --- a/source/processes/management/History +++ b/source/processes/management/History @@ -16,6 +16,18 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +- Oct 4, 2021 Alberto Ribon (procman-V10-07-04) +- G4NoProcess : added the method IsApplicable(), returning false, because + this process should not be set to any particle. + (Thanks to Makoto Asai for the suggestion.) + +- Sep 21, 2021 Alberto Ribon (procman-V10-07-03) +- G4NoProcess : introduced a new class (proposed and written by K. Genser) + representing an empty process, which is not assigned to any particle, + and used only in the method G4SteppingManager::InvokeAtRestDoItProcs + for stable ions at rest (to avoid that Radioactive Decay appears as + process defining their last step, which can mislead users). + - May 02, 2021 John Allison (procman-V10-07-02) - Introduce the following files for implementation of quantum entanglement: G4EntanglementAuxInfo.hh diff --git a/source/processes/management/include/G4NoProcess.hh b/source/processes/management/include/G4NoProcess.hh new file mode 100644 index 0000000000..8c61eee749 --- /dev/null +++ b/source/processes/management/include/G4NoProcess.hh @@ -0,0 +1,85 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// + +#ifndef G4NoProcess_h +#define G4NoProcess_h 1 + +#include "G4VProcess.hh" + +class G4NoProcess : public G4VProcess { + public: + + G4NoProcess() : G4VProcess( "NoProcess", fGeneral ) {}; + + virtual ~G4NoProcess() {}; + + // This process should not be set to any particle + virtual G4bool IsApplicable(const G4ParticleDefinition&) override { return false; } + + // no operations in any GPIL or DoIt + virtual G4double PostStepGetPhysicalInteractionLength( + const G4Track&, + G4double, + G4ForceCondition* + ) override { return -1.0; }; + + virtual G4VParticleChange* PostStepDoIt( + const G4Track& , + const G4Step& + ) override {return nullptr;}; + + virtual G4double AtRestGetPhysicalInteractionLength( + const G4Track& , + G4ForceCondition* + ) override { return -1.0; }; + + virtual G4VParticleChange* AtRestDoIt( + const G4Track& , + const G4Step& + ) override {return nullptr;}; + + virtual G4double AlongStepGetPhysicalInteractionLength( + const G4Track&, + G4double , + G4double , + G4double& , + G4GPILSelection* + ) override { return -1.0; }; + + virtual G4VParticleChange* AlongStepDoIt( + const G4Track& , + const G4Step& + ) override {return nullptr;}; + + private: + + // hide copy constr and assignment operator as private + G4NoProcess(G4NoProcess&); + G4NoProcess& operator=(const G4NoProcess& right); + +}; + +#endif diff --git a/source/processes/management/sources.cmake b/source/processes/management/sources.cmake index f9e46499d9..91918e387f 100644 --- a/source/processes/management/sources.cmake +++ b/source/processes/management/sources.cmake @@ -5,6 +5,7 @@ geant4_add_module(G4procman PUBLIC_HEADERS G4EntanglementAuxInfo.hh G4eplusAnnihilationEntanglementClipBoard.hh + G4NoProcess.hh G4ParticleTypes.hh G4ProcTblElement.hh G4ProcTblElement.icc diff --git a/source/processes/management/src/G4ProcessTableMessenger.cc b/source/processes/management/src/G4ProcessTableMessenger.cc index bd3633a8fa..2901dea6fa 100644 --- a/source/processes/management/src/G4ProcessTableMessenger.cc +++ b/source/processes/management/src/G4ProcessTableMessenger.cc @@ -214,7 +214,7 @@ G4ProcessTableMessenger::SetNewValue(G4UIcommand* command, G4String newValue) // check 2nd argument currentProcessTypeName = G4String(next()); - if (currentProcessTypeName.isNull()) currentProcessTypeName = "all"; + if (currentProcessTypeName.empty()) currentProcessTypeName = "all"; G4bool isProcName = false; G4bool isAll = false; type = -1; @@ -416,7 +416,7 @@ void G4ProcessTableMessenger::SetNumberOfProcessType() for (idx = 0; idx < 1000 ; ++idx ) { G4String typeName = G4VProcess::GetProcessTypeName(G4ProcessType(idx)); - isFoundEndMark = typeName.contains("---"); + isFoundEndMark = G4StrUtil::contains(typeName, "---"); if ( isFoundEndMark ) break; } if ( isFoundEndMark ) diff --git a/source/processes/optical/History b/source/processes/optical/History index 7c9b4df652..b1aadd0703 100644 --- a/source/processes/optical/History +++ b/source/processes/optical/History @@ -16,6 +16,20 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +21 Oct 21: D. Sawkey (op-V10-07-05) +- G4OpBoundaryProcess - rename variables: class start with f; lowercase + - make comparison to nullptr explicit + - remove unneeded intermediate variable + - refactor Davis LUT calculation + +21 Oct 21: D. Sawkey (op-V10-07-04) +- G4OpBoundaryProcess - on StepTooSmall, propose velocity corresponding to + material of post step point. Addresses bug 2438. + +19 Oct 21: D. Sawkey (op-V10-07-03) +- all process classes - update G4OpticalParameters when process + parameters updated directly. Addresses bug 2425. + 21 May 21: D. Sawkey (op-V10-07-02) - G4OpBoundaryProcess: make some variables local and initialize them properly. Addresses bug 2364. diff --git a/source/processes/optical/include/G4OpAbsorption.hh b/source/processes/optical/include/G4OpAbsorption.hh index 8c409ae415..62228748ac 100644 --- a/source/processes/optical/include/G4OpAbsorption.hh +++ b/source/processes/optical/include/G4OpAbsorption.hh @@ -73,6 +73,8 @@ class G4OpAbsorption : public G4VDiscreteProcess virtual void Initialise(); + void SetVerboseLevel(G4int); + private: G4OpAbsorption(const G4OpAbsorption& right) = delete; G4OpAbsorption& operator=(const G4OpAbsorption& right) = delete; diff --git a/source/processes/optical/include/G4OpBoundaryProcess.hh b/source/processes/optical/include/G4OpBoundaryProcess.hh index 2e210f4a78..6323e94f28 100644 --- a/source/processes/optical/include/G4OpBoundaryProcess.hh +++ b/source/processes/optical/include/G4OpBoundaryProcess.hh @@ -64,10 +64,10 @@ #ifndef G4OpBoundaryProcess_h #define G4OpBoundaryProcess_h 1 +#include "G4OpticalPhoton.hh" +#include "G4OpticalSurface.hh" #include "G4RandomTools.hh" #include "G4VDiscreteProcess.hh" -#include "G4OpticalSurface.hh" -#include "G4OpticalPhoton.hh" enum G4OpBoundaryProcessStatus { @@ -144,6 +144,8 @@ class G4OpBoundaryProcess : public G4VDiscreteProcess virtual void Initialise(); + void SetVerboseLevel(G4int); + private: G4OpBoundaryProcess(const G4OpBoundaryProcess& right) = delete; G4OpBoundaryProcess& operator=(const G4OpBoundaryProcess& right) = delete; @@ -180,53 +182,46 @@ class G4OpBoundaryProcess : public G4VDiscreteProcess // Invoke SD for post step point if the photon is 'detected' G4bool InvokeSD(const G4Step* step); - G4double thePhotonMomentum; + G4ThreeVector fOldMomentum; + G4ThreeVector fOldPolarization; - G4ThreeVector OldMomentum; - G4ThreeVector OldPolarization; + G4ThreeVector fNewMomentum; + G4ThreeVector fNewPolarization; - G4ThreeVector NewMomentum; - G4ThreeVector NewPolarization; + G4ThreeVector fGlobalNormal; + G4ThreeVector fFacetNormal; - G4ThreeVector theGlobalNormal; - G4ThreeVector theFacetNormal; + G4Material* fMaterial1; + G4Material* fMaterial2; - G4Material* Material1; - G4Material* Material2; - - G4OpticalSurface* OpticalSurface; + G4OpticalSurface* fOpticalSurface; G4MaterialPropertyVector* fRealRIndexMPV; G4MaterialPropertyVector* fImagRIndexMPV; + G4Physics2DVector* fDichroicVector; - G4double Rindex1; - G4double Rindex2; + G4double fPhotonMomentum; + G4double fRindex1; + G4double fRindex2; - G4double sint1; + G4double fSint1; - G4OpBoundaryProcessStatus theStatus; + G4double fReflectivity; + G4double fEfficiency; + G4double fTransmittance; + G4double fSurfaceRoughness; - G4OpticalSurfaceModel theModel; + G4double fProb_sl, fProb_ss, fProb_bs; + G4double fCarTolerance; - G4OpticalSurfaceFinish theFinish; + G4OpBoundaryProcessStatus fStatus; + G4OpticalSurfaceModel fModel; + G4OpticalSurfaceFinish fFinish; - G4double theReflectivity; - G4double theEfficiency; - G4double theTransmittance; - - G4double theSurfaceRoughness; - - G4double prob_sl, prob_ss, prob_bs; - - G4int iTE, iTM; - - G4double kCarTolerance; - - size_t idx, idy; - G4Physics2DVector* DichroicVector; - - G4bool fInvokeSD; + G4int f_iTE, f_iTM; + size_t idx_dichroicX = 0; + size_t idx_dichroicY = 0; size_t idx_rindex1 = 0; size_t idx_rindex_surface = 0; size_t idx_reflect = 0; @@ -239,6 +234,8 @@ class G4OpBoundaryProcess : public G4VDiscreteProcess size_t idx_groupvel = 0; size_t idx_rrindex = 0; size_t idx_irindex = 0; + + G4bool fInvokeSD; }; //////////////////// @@ -247,7 +244,7 @@ class G4OpBoundaryProcess : public G4VDiscreteProcess inline G4bool G4OpBoundaryProcess::G4BooleanRand(const G4double prob) const { - /* Returns a random boolean variable with the specified probability */ + // Returns a random boolean variable with the specified probability return (G4UniformRand() < prob); } @@ -259,84 +256,80 @@ inline G4bool G4OpBoundaryProcess::IsApplicable( inline G4OpBoundaryProcessStatus G4OpBoundaryProcess::GetStatus() const { - return theStatus; + return fStatus; } -inline void G4OpBoundaryProcess::SetInvokeSD(G4bool flag) { fInvokeSD = flag; } - inline void G4OpBoundaryProcess::ChooseReflection() { G4double rand = G4UniformRand(); - if(rand >= 0.0 && rand < prob_ss) + if(rand < fProb_ss) { - theStatus = SpikeReflection; - theFacetNormal = theGlobalNormal; + fStatus = SpikeReflection; + fFacetNormal = fGlobalNormal; } - else if(rand >= prob_ss && rand <= prob_ss + prob_sl) + else if(rand < fProb_ss + fProb_sl) { - theStatus = LobeReflection; + fStatus = LobeReflection; } - else if(rand > prob_ss + prob_sl && rand < prob_ss + prob_sl + prob_bs) + else if(rand < fProb_ss + fProb_sl + fProb_bs) { - theStatus = BackScattering; + fStatus = BackScattering; } else { - theStatus = LambertianReflection; + fStatus = LambertianReflection; } } inline void G4OpBoundaryProcess::DoAbsorption() { - theStatus = Absorption; + fStatus = Absorption; - if(G4BooleanRand(theEfficiency)) + if(G4BooleanRand(fEfficiency)) { // EnergyDeposited =/= 0 means: photon has been detected - theStatus = Detection; - aParticleChange.ProposeLocalEnergyDeposit(thePhotonMomentum); + fStatus = Detection; + aParticleChange.ProposeLocalEnergyDeposit(fPhotonMomentum); } else { aParticleChange.ProposeLocalEnergyDeposit(0.0); } - NewMomentum = OldMomentum; - NewPolarization = OldPolarization; + fNewMomentum = fOldMomentum; + fNewPolarization = fOldPolarization; aParticleChange.ProposeTrackStatus(fStopAndKill); } inline void G4OpBoundaryProcess::DoReflection() { - if(theStatus == LambertianReflection) + if(fStatus == LambertianReflection) { - NewMomentum = G4LambertianRand(theGlobalNormal); - theFacetNormal = (NewMomentum - OldMomentum).unit(); + fNewMomentum = G4LambertianRand(fGlobalNormal); + fFacetNormal = (fNewMomentum - fOldMomentum).unit(); } - else if(theFinish == ground) + else if(fFinish == ground) { - theStatus = LobeReflection; - if(fRealRIndexMPV && fImagRIndexMPV) + fStatus = LobeReflection; + if(!fRealRIndexMPV || !fImagRIndexMPV) { - // + fFacetNormal = GetFacetNormal(fOldMomentum, fGlobalNormal); } - else - { - theFacetNormal = GetFacetNormal(OldMomentum, theGlobalNormal); - } - G4double PdotN = OldMomentum * theFacetNormal; - NewMomentum = OldMomentum - (2. * PdotN) * theFacetNormal; + // else + // complex ref. index to be implemented + fNewMomentum = + fOldMomentum - (2. * fOldMomentum * fFacetNormal * fFacetNormal); } else { - theStatus = SpikeReflection; - theFacetNormal = theGlobalNormal; - G4double PdotN = OldMomentum * theFacetNormal; - NewMomentum = OldMomentum - (2. * PdotN) * theFacetNormal; + fStatus = SpikeReflection; + fFacetNormal = fGlobalNormal; + fNewMomentum = + fOldMomentum - (2. * fOldMomentum * fFacetNormal * fFacetNormal); } - G4double EdotN = OldPolarization * theFacetNormal; - NewPolarization = -OldPolarization + (2. * EdotN) * theFacetNormal; + fNewPolarization = + -fOldPolarization + (2. * fOldPolarization * fFacetNormal * fFacetNormal); } #endif /* G4OpBoundaryProcess_h */ diff --git a/source/processes/optical/include/G4OpMieHG.hh b/source/processes/optical/include/G4OpMieHG.hh index 364f25ef14..92003a85ac 100644 --- a/source/processes/optical/include/G4OpMieHG.hh +++ b/source/processes/optical/include/G4OpMieHG.hh @@ -65,6 +65,8 @@ class G4OpMieHG : public G4VDiscreteProcess virtual void PreparePhysicsTable(const G4ParticleDefinition&) override; virtual void Initialise(); + void SetVerboseLevel(G4int); + private: G4OpMieHG(const G4OpMieHG& right) = delete; G4OpMieHG& operator=(const G4OpMieHG& right) = delete; diff --git a/source/processes/optical/include/G4OpRayleigh.hh b/source/processes/optical/include/G4OpRayleigh.hh index 3653991d33..0f02b1c7ee 100644 --- a/source/processes/optical/include/G4OpRayleigh.hh +++ b/source/processes/optical/include/G4OpRayleigh.hh @@ -82,6 +82,8 @@ class G4OpRayleigh : public G4VDiscreteProcess virtual void PreparePhysicsTable(const G4ParticleDefinition&) override; virtual void Initialise(); + void SetVerboseLevel(G4int); + protected: G4PhysicsTable* thePhysicsTable; diff --git a/source/processes/optical/include/G4OpWLS.hh b/source/processes/optical/include/G4OpWLS.hh index 839e1d4c7e..2fe0d6956c 100644 --- a/source/processes/optical/include/G4OpWLS.hh +++ b/source/processes/optical/include/G4OpWLS.hh @@ -84,6 +84,8 @@ class G4OpWLS : public G4VDiscreteProcess virtual void PreparePhysicsTable(const G4ParticleDefinition&) override; virtual void Initialise(); + void SetVerboseLevel(G4int); + protected: G4VWLSTimeGeneratorProfile* WLSTimeGeneratorProfile; G4PhysicsTable* theIntegralTable; diff --git a/source/processes/optical/include/G4OpWLS2.hh b/source/processes/optical/include/G4OpWLS2.hh index 4681ffe57e..fbf1f5dd00 100644 --- a/source/processes/optical/include/G4OpWLS2.hh +++ b/source/processes/optical/include/G4OpWLS2.hh @@ -84,6 +84,8 @@ class G4OpWLS2 : public G4VDiscreteProcess virtual void PreparePhysicsTable(const G4ParticleDefinition&) override; virtual void Initialise(); + void SetVerboseLevel(G4int); + protected: G4VWLSTimeGeneratorProfile* WLSTimeGeneratorProfile; G4PhysicsTable* theIntegralTable; diff --git a/source/processes/optical/src/G4OpAbsorption.cc b/source/processes/optical/src/G4OpAbsorption.cc index 878a552c3c..c2bbb48567 100644 --- a/source/processes/optical/src/G4OpAbsorption.cc +++ b/source/processes/optical/src/G4OpAbsorption.cc @@ -119,3 +119,10 @@ G4double G4OpAbsorption::GetMeanFreePath(const G4Track& aTrack, G4double, return attLength; } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4OpAbsorption::SetVerboseLevel(G4int verbose) +{ + verboseLevel = verbose; + G4OpticalParameters::Instance()->SetAbsorptionVerboseLevel(verboseLevel); +} diff --git a/source/processes/optical/src/G4OpBoundaryProcess.cc b/source/processes/optical/src/G4OpBoundaryProcess.cc index 0b6baf21ed..ed287a2d20 100644 --- a/source/processes/optical/src/G4OpBoundaryProcess.cc +++ b/source/processes/optical/src/G4OpBoundaryProcess.cc @@ -73,19 +73,19 @@ // //////////////////////////////////////////////////////////////////////// +#include "G4OpBoundaryProcess.hh" + #include "G4ios.hh" -#include "G4SystemOfUnits.hh" -#include "G4PhysicalConstants.hh" -#include "G4OpProcessSubType.hh" #include "G4GeometryTolerance.hh" -#include "G4VSensitiveDetector.hh" -#include "G4ParallelWorldProcess.hh" -#include "G4TransportationManager.hh" #include "G4LogicalBorderSurface.hh" #include "G4LogicalSkinSurface.hh" - +#include "G4OpProcessSubType.hh" #include "G4OpticalParameters.hh" -#include "G4OpBoundaryProcess.hh" +#include "G4ParallelWorldProcess.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" +#include "G4TransportationManager.hh" +#include "G4VSensitiveDetector.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4OpBoundaryProcess::G4OpBoundaryProcess(const G4String& processName, @@ -100,30 +100,29 @@ G4OpBoundaryProcess::G4OpBoundaryProcess(const G4String& processName, } SetProcessSubType(fOpBoundary); - theStatus = Undefined; - theModel = glisur; - theFinish = polished; - theReflectivity = 1.; - theEfficiency = 0.; - theTransmittance = 0.; - theSurfaceRoughness = 0.; - prob_sl = 0.; - prob_ss = 0.; - prob_bs = 0.; + fStatus = Undefined; + fModel = glisur; + fFinish = polished; + fReflectivity = 1.; + fEfficiency = 0.; + fTransmittance = 0.; + fSurfaceRoughness = 0.; + fProb_sl = 0.; + fProb_ss = 0.; + fProb_bs = 0.; - fRealRIndexMPV = nullptr; - fImagRIndexMPV = nullptr; - Material1 = nullptr; - Material2 = nullptr; - OpticalSurface = nullptr; - kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance(); + fRealRIndexMPV = nullptr; + fImagRIndexMPV = nullptr; + fMaterial1 = nullptr; + fMaterial2 = nullptr; + fOpticalSurface = nullptr; + fCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance(); - iTE = iTM = 0; - thePhotonMomentum = 0.; - Rindex1 = Rindex2 = 1.; - sint1 = 0.; - idx = idy = 0; - DichroicVector = nullptr; + f_iTE = f_iTM = 0; + fPhotonMomentum = 0.; + fRindex1 = fRindex2 = 1.; + fSint1 = 0.; + fDichroicVector = nullptr; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -147,7 +146,7 @@ void G4OpBoundaryProcess::Initialise() G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, const G4Step& aStep) { - theStatus = Undefined; + fStatus = Undefined; aParticleChange.Initialize(aTrack); aParticleChange.ProposeVelocity(aTrack.GetVelocity()); @@ -156,19 +155,17 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, // G4ParallelWorldProcess! const G4Step* pStep = &aStep; const G4Step* hStep = G4ParallelWorldProcess::GetHyperStep(); - if(hStep) + if(hStep != nullptr) pStep = hStep; - G4bool isOnBoundary = - (pStep->GetPostStepPoint()->GetStepStatus() == fGeomBoundary); - if(isOnBoundary) + if(pStep->GetPostStepPoint()->GetStepStatus() == fGeomBoundary) { - Material1 = pStep->GetPreStepPoint()->GetMaterial(); - Material2 = pStep->GetPostStepPoint()->GetMaterial(); + fMaterial1 = pStep->GetPreStepPoint()->GetMaterial(); + fMaterial2 = pStep->GetPostStepPoint()->GetMaterial(); } else { - theStatus = NotAtBoundary; + fStatus = NotAtBoundary; if(verboseLevel > 1) BoundaryProcessVerbose(); return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); @@ -180,30 +177,38 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, if(verboseLevel > 1) { G4cout << " Photon at Boundary! " << G4endl; - if(thePrePV) + if(thePrePV != nullptr) G4cout << " thePrePV: " << thePrePV->GetName() << G4endl; - if(thePostPV) + if(thePostPV != nullptr) G4cout << " thePostPV: " << thePostPV->GetName() << G4endl; } - if(aTrack.GetStepLength() <= kCarTolerance) + if(aTrack.GetStepLength() <= fCarTolerance) { - theStatus = StepTooSmall; + fStatus = StepTooSmall; if(verboseLevel > 1) BoundaryProcessVerbose(); + + G4MaterialPropertyVector* groupvel = + fMaterial2->GetMaterialPropertiesTable()->GetProperty(kGROUPVEL); + if(groupvel != nullptr) + { + aParticleChange.ProposeVelocity( + groupvel->Value(fPhotonMomentum, idx_groupvel)); + } return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); } const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle(); - thePhotonMomentum = aParticle->GetTotalMomentum(); - OldMomentum = aParticle->GetMomentumDirection(); - OldPolarization = aParticle->GetPolarization(); + fPhotonMomentum = aParticle->GetTotalMomentum(); + fOldMomentum = aParticle->GetMomentumDirection(); + fOldPolarization = aParticle->GetPolarization(); if(verboseLevel > 1) { - G4cout << " Old Momentum Direction: " << OldMomentum << G4endl - << " Old Polarization: " << OldPolarization << G4endl; + G4cout << " Old Momentum Direction: " << fOldMomentum << G4endl + << " Old Polarization: " << fOldPolarization << G4endl; } G4ThreeVector theGlobalPoint = pStep->GetPostStepPoint()->GetPosition(); @@ -213,11 +218,11 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, G4int hNavId = G4ParallelWorldProcess::GetHypNavigatorID(); auto iNav = G4TransportationManager::GetTransportationManager() ->GetActiveNavigatorsIterator(); - theGlobalNormal = (iNav[hNavId])->GetGlobalExitNormal(theGlobalPoint, &valid); + fGlobalNormal = (iNav[hNavId])->GetGlobalExitNormal(theGlobalPoint, &valid); if(valid) { - theGlobalNormal = -theGlobalNormal; + fGlobalNormal = -fGlobalNormal; } else { @@ -229,11 +234,11 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, "Invalid Surface Normal - Geometry must return valid surface normal"); } - if(OldMomentum * theGlobalNormal > 0.0) + if(fOldMomentum * fGlobalNormal > 0.0) { #ifdef G4OPTICAL_DEBUG G4ExceptionDescription ed; - ed << " G4OpBoundaryProcess/PostStepDoIt(): theGlobalNormal points in a " + ed << " G4OpBoundaryProcess/PostStepDoIt(): fGlobalNormal points in a " "wrong direction. " << G4endl << " The momentum of the photon arriving at interface (oldMomentum)" @@ -241,9 +246,9 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, << " So it MUST have dot < 0 with the normal that Exits the new " "volume (globalNormal)." << G4endl << " >> The dot product of oldMomentum and global Normal is " - << OldMomentum * theGlobalNormal << G4endl - << " Old Momentum (during step) = " << OldMomentum << G4endl - << " Global Normal (Exiting New Vol) = " << theGlobalNormal << G4endl + << fOldMomentum * fGlobalNormal << G4endl + << " Old Momentum (during step) = " << fOldMomentum << G4endl + << " Global Normal (Exiting New Vol) = " << fGlobalNormal << G4endl << G4endl; G4Exception("G4OpBoundaryProcess::PostStepDoIt", "OpBoun02", EventMustBeAborted, // Or JustWarning to see if it happens @@ -252,103 +257,93 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, "Invalid Surface Normal - Geometry must return valid surface " "normal pointing in the right direction"); #else - theGlobalNormal = -theGlobalNormal; + fGlobalNormal = -fGlobalNormal; #endif } - G4MaterialPropertyVector* RindexMPV = nullptr; - G4MaterialPropertiesTable* MPT = Material1->GetMaterialPropertiesTable(); - if(MPT) + G4MaterialPropertyVector* rIndexMPV = nullptr; + G4MaterialPropertiesTable* MPT = fMaterial1->GetMaterialPropertiesTable(); + if(MPT != nullptr) { - RindexMPV = MPT->GetProperty(kRINDEX); + rIndexMPV = MPT->GetProperty(kRINDEX); + } + if(rIndexMPV != nullptr) + { + fRindex1 = rIndexMPV->Value(fPhotonMomentum, idx_rindex1); } else { - theStatus = NoRINDEX; + fStatus = NoRINDEX; if(verboseLevel > 1) BoundaryProcessVerbose(); - aParticleChange.ProposeLocalEnergyDeposit(thePhotonMomentum); + aParticleChange.ProposeLocalEnergyDeposit(fPhotonMomentum); aParticleChange.ProposeTrackStatus(fStopAndKill); return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); } - if(RindexMPV) - { - Rindex1 = RindexMPV->Value(thePhotonMomentum, idx_rindex1); - } - else - { - theStatus = NoRINDEX; - if(verboseLevel > 1) - BoundaryProcessVerbose(); - aParticleChange.ProposeLocalEnergyDeposit(thePhotonMomentum); - aParticleChange.ProposeTrackStatus(fStopAndKill); - return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); - } + fReflectivity = 1.; + fEfficiency = 0.; + fTransmittance = 0.; + fSurfaceRoughness = 0.; + fModel = glisur; + fFinish = polished; + G4SurfaceType type = dielectric_dielectric; - theReflectivity = 1.; - theEfficiency = 0.; - theTransmittance = 0.; - theSurfaceRoughness = 0.; - theModel = glisur; - theFinish = polished; - G4SurfaceType type = dielectric_dielectric; + rIndexMPV = nullptr; + fOpticalSurface = nullptr; - RindexMPV = nullptr; - OpticalSurface = nullptr; - G4LogicalSurface* Surface = + G4LogicalSurface* surface = G4LogicalBorderSurface::GetSurface(thePrePV, thePostPV); - - if(Surface == nullptr) + if(surface == nullptr) { if(thePostPV->GetMotherLogical() == thePrePV->GetLogicalVolume()) { - Surface = G4LogicalSkinSurface::GetSurface(thePostPV->GetLogicalVolume()); - if(Surface == nullptr) + surface = G4LogicalSkinSurface::GetSurface(thePostPV->GetLogicalVolume()); + if(surface == nullptr) { - Surface = + surface = G4LogicalSkinSurface::GetSurface(thePrePV->GetLogicalVolume()); } } else { - Surface = G4LogicalSkinSurface::GetSurface(thePrePV->GetLogicalVolume()); - if(Surface == nullptr) + surface = G4LogicalSkinSurface::GetSurface(thePrePV->GetLogicalVolume()); + if(surface == nullptr) { - Surface = + surface = G4LogicalSkinSurface::GetSurface(thePostPV->GetLogicalVolume()); } } } - if(Surface) + if(surface != nullptr) { - OpticalSurface = - dynamic_cast(Surface->GetSurfaceProperty()); + fOpticalSurface = + dynamic_cast(surface->GetSurfaceProperty()); } - if(OpticalSurface) + if(fOpticalSurface != nullptr) { - type = OpticalSurface->GetType(); - theModel = OpticalSurface->GetModel(); - theFinish = OpticalSurface->GetFinish(); + type = fOpticalSurface->GetType(); + fModel = fOpticalSurface->GetModel(); + fFinish = fOpticalSurface->GetFinish(); G4MaterialPropertiesTable* sMPT = - OpticalSurface->GetMaterialPropertiesTable(); - if(sMPT) + fOpticalSurface->GetMaterialPropertiesTable(); + if(sMPT != nullptr) { - if(theFinish == polishedbackpainted || theFinish == groundbackpainted) + if(fFinish == polishedbackpainted || fFinish == groundbackpainted) { - RindexMPV = sMPT->GetProperty(kRINDEX); - if(RindexMPV) + rIndexMPV = sMPT->GetProperty(kRINDEX); + if(rIndexMPV != nullptr) { - Rindex2 = RindexMPV->Value(thePhotonMomentum, idx_rindex_surface); + fRindex2 = rIndexMPV->Value(fPhotonMomentum, idx_rindex_surface); } else { - theStatus = NoRINDEX; + fStatus = NoRINDEX; if(verboseLevel > 1) BoundaryProcessVerbose(); - aParticleChange.ProposeLocalEnergyDeposit(thePhotonMomentum); + aParticleChange.ProposeLocalEnergyDeposit(fPhotonMomentum); aParticleChange.ProposeTrackStatus(fStopAndKill); return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); } @@ -356,12 +351,12 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, fRealRIndexMPV = sMPT->GetProperty(kREALRINDEX); fImagRIndexMPV = sMPT->GetProperty(kIMAGINARYRINDEX); - iTE = iTM = 1; + f_iTE = f_iTM = 1; G4MaterialPropertyVector* pp; if((pp = sMPT->GetProperty(kREFLECTIVITY))) { - theReflectivity = pp->Value(thePhotonMomentum, idx_reflect); + fReflectivity = pp->Value(fPhotonMomentum, idx_reflect); } else if(fRealRIndexMPV && fImagRIndexMPV) { @@ -370,95 +365,95 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, if((pp = sMPT->GetProperty(kEFFICIENCY))) { - theEfficiency = pp->Value(thePhotonMomentum, idx_eff); + fEfficiency = pp->Value(fPhotonMomentum, idx_eff); } if((pp = sMPT->GetProperty(kTRANSMITTANCE))) { - theTransmittance = pp->Value(thePhotonMomentum, idx_trans); + fTransmittance = pp->Value(fPhotonMomentum, idx_trans); } if(sMPT->ConstPropertyExists(kSURFACEROUGHNESS)) { - theSurfaceRoughness = sMPT->GetConstProperty(kSURFACEROUGHNESS); + fSurfaceRoughness = sMPT->GetConstProperty(kSURFACEROUGHNESS); } - if(theModel == unified) + if(fModel == unified) { - prob_sl = (pp = sMPT->GetProperty(kSPECULARLOBECONSTANT)) - ? pp->Value(thePhotonMomentum, idx_lobe) - : 0.; - prob_ss = (pp = sMPT->GetProperty(kSPECULARSPIKECONSTANT)) - ? pp->Value(thePhotonMomentum, idx_spike) - : 0.; - prob_bs = (pp = sMPT->GetProperty(kBACKSCATTERCONSTANT)) - ? pp->Value(thePhotonMomentum, idx_back) - : 0.; + fProb_sl = (pp = sMPT->GetProperty(kSPECULARLOBECONSTANT)) + ? pp->Value(fPhotonMomentum, idx_lobe) + : 0.; + fProb_ss = (pp = sMPT->GetProperty(kSPECULARSPIKECONSTANT)) + ? pp->Value(fPhotonMomentum, idx_spike) + : 0.; + fProb_bs = (pp = sMPT->GetProperty(kBACKSCATTERCONSTANT)) + ? pp->Value(fPhotonMomentum, idx_back) + : 0.; } } // end of if(sMPT) - else if(theFinish == polishedbackpainted || theFinish == groundbackpainted) + else if(fFinish == polishedbackpainted || fFinish == groundbackpainted) { - aParticleChange.ProposeLocalEnergyDeposit(thePhotonMomentum); + aParticleChange.ProposeLocalEnergyDeposit(fPhotonMomentum); aParticleChange.ProposeTrackStatus(fStopAndKill); return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); } - } // end of if(OpticalSurface) + } // end of if(fOpticalSurface) // DIELECTRIC-DIELECTRIC if(type == dielectric_dielectric) { - if(theFinish == polished || theFinish == ground) + if(fFinish == polished || fFinish == ground) { - if(Material1 == Material2) + if(fMaterial1 == fMaterial2) { - theStatus = SameMaterial; + fStatus = SameMaterial; if(verboseLevel > 1) BoundaryProcessVerbose(); return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); } - MPT = Material2->GetMaterialPropertiesTable(); - if(MPT) + MPT = fMaterial2->GetMaterialPropertiesTable(); + if(MPT != nullptr) { - RindexMPV = MPT->GetProperty(kRINDEX); + rIndexMPV = MPT->GetProperty(kRINDEX); } - if(RindexMPV) + if(rIndexMPV != nullptr) { - Rindex2 = RindexMPV->Value(thePhotonMomentum, idx_rindex2); + fRindex2 = rIndexMPV->Value(fPhotonMomentum, idx_rindex2); } else { - theStatus = NoRINDEX; + fStatus = NoRINDEX; if(verboseLevel > 1) BoundaryProcessVerbose(); - aParticleChange.ProposeLocalEnergyDeposit(thePhotonMomentum); + aParticleChange.ProposeLocalEnergyDeposit(fPhotonMomentum); aParticleChange.ProposeTrackStatus(fStopAndKill); return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); } } - if(theFinish == polishedbackpainted || theFinish == groundbackpainted) + if(fFinish == polishedbackpainted || fFinish == groundbackpainted) { DielectricDielectric(); } else { G4double rand = G4UniformRand(); - if(rand > theReflectivity + theTransmittance) + if(rand > fReflectivity + fTransmittance) { DoAbsorption(); } - else if(rand > theReflectivity) + else if(rand > fReflectivity) { - theStatus = Transmission; - NewMomentum = OldMomentum; - NewPolarization = OldPolarization; + fStatus = Transmission; + fNewMomentum = fOldMomentum; + fNewPolarization = fOldPolarization; } else { - if(theFinish == polishedfrontpainted) + if(fFinish == polishedfrontpainted) { DoReflection(); } - else if(theFinish == groundfrontpainted) + else if(fFinish == groundfrontpainted) { - theStatus = LambertianReflection; + fStatus = LambertianReflection; DoReflection(); } else @@ -492,31 +487,31 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); } - NewMomentum = NewMomentum.unit(); - NewPolarization = NewPolarization.unit(); + fNewMomentum = fNewMomentum.unit(); + fNewPolarization = fNewPolarization.unit(); if(verboseLevel > 1) { - G4cout << " New Momentum Direction: " << NewMomentum << G4endl - << " New Polarization: " << NewPolarization << G4endl; + G4cout << " New Momentum Direction: " << fNewMomentum << G4endl + << " New Polarization: " << fNewPolarization << G4endl; BoundaryProcessVerbose(); } - aParticleChange.ProposeMomentumDirection(NewMomentum); - aParticleChange.ProposePolarization(NewPolarization); + aParticleChange.ProposeMomentumDirection(fNewMomentum); + aParticleChange.ProposePolarization(fNewPolarization); - if(theStatus == FresnelRefraction || theStatus == Transmission) + if(fStatus == FresnelRefraction || fStatus == Transmission) { G4MaterialPropertyVector* groupvel = - Material2->GetMaterialPropertiesTable()->GetProperty(kGROUPVEL); - if(groupvel) + fMaterial2->GetMaterialPropertiesTable()->GetProperty(kGROUPVEL); + if(groupvel != nullptr) { aParticleChange.ProposeVelocity( - groupvel->Value(thePhotonMomentum, idx_groupvel)); + groupvel->Value(fPhotonMomentum, idx_groupvel)); } } - if(theStatus == Detection && fInvokeSD) + if(fStatus == Detection && fInvokeSD) InvokeSD(pStep); return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); } @@ -525,95 +520,95 @@ G4VParticleChange* G4OpBoundaryProcess::PostStepDoIt(const G4Track& aTrack, void G4OpBoundaryProcess::BoundaryProcessVerbose() const { G4cout << " *** "; - if(theStatus == Undefined) + if(fStatus == Undefined) G4cout << "Undefined"; - else if(theStatus == Transmission) + else if(fStatus == Transmission) G4cout << "Transmission"; - else if(theStatus == FresnelRefraction) + else if(fStatus == FresnelRefraction) G4cout << "FresnelRefraction"; - else if(theStatus == FresnelReflection) + else if(fStatus == FresnelReflection) G4cout << "FresnelReflection"; - else if(theStatus == TotalInternalReflection) + else if(fStatus == TotalInternalReflection) G4cout << "TotalInternalReflection"; - else if(theStatus == LambertianReflection) + else if(fStatus == LambertianReflection) G4cout << "LambertianReflection"; - else if(theStatus == LobeReflection) + else if(fStatus == LobeReflection) G4cout << "LobeReflection"; - else if(theStatus == SpikeReflection) + else if(fStatus == SpikeReflection) G4cout << "SpikeReflection"; - else if(theStatus == BackScattering) + else if(fStatus == BackScattering) G4cout << "BackScattering"; - else if(theStatus == PolishedLumirrorAirReflection) + else if(fStatus == PolishedLumirrorAirReflection) G4cout << "PolishedLumirrorAirReflection"; - else if(theStatus == PolishedLumirrorGlueReflection) + else if(fStatus == PolishedLumirrorGlueReflection) G4cout << "PolishedLumirrorGlueReflection"; - else if(theStatus == PolishedAirReflection) + else if(fStatus == PolishedAirReflection) G4cout << "PolishedAirReflection"; - else if(theStatus == PolishedTeflonAirReflection) + else if(fStatus == PolishedTeflonAirReflection) G4cout << "PolishedTeflonAirReflection"; - else if(theStatus == PolishedTiOAirReflection) + else if(fStatus == PolishedTiOAirReflection) G4cout << "PolishedTiOAirReflection"; - else if(theStatus == PolishedTyvekAirReflection) + else if(fStatus == PolishedTyvekAirReflection) G4cout << "PolishedTyvekAirReflection"; - else if(theStatus == PolishedVM2000AirReflection) + else if(fStatus == PolishedVM2000AirReflection) G4cout << "PolishedVM2000AirReflection"; - else if(theStatus == PolishedVM2000GlueReflection) + else if(fStatus == PolishedVM2000GlueReflection) G4cout << "PolishedVM2000GlueReflection"; - else if(theStatus == EtchedLumirrorAirReflection) + else if(fStatus == EtchedLumirrorAirReflection) G4cout << "EtchedLumirrorAirReflection"; - else if(theStatus == EtchedLumirrorGlueReflection) + else if(fStatus == EtchedLumirrorGlueReflection) G4cout << "EtchedLumirrorGlueReflection"; - else if(theStatus == EtchedAirReflection) + else if(fStatus == EtchedAirReflection) G4cout << "EtchedAirReflection"; - else if(theStatus == EtchedTeflonAirReflection) + else if(fStatus == EtchedTeflonAirReflection) G4cout << "EtchedTeflonAirReflection"; - else if(theStatus == EtchedTiOAirReflection) + else if(fStatus == EtchedTiOAirReflection) G4cout << "EtchedTiOAirReflection"; - else if(theStatus == EtchedTyvekAirReflection) + else if(fStatus == EtchedTyvekAirReflection) G4cout << "EtchedTyvekAirReflection"; - else if(theStatus == EtchedVM2000AirReflection) + else if(fStatus == EtchedVM2000AirReflection) G4cout << "EtchedVM2000AirReflection"; - else if(theStatus == EtchedVM2000GlueReflection) + else if(fStatus == EtchedVM2000GlueReflection) G4cout << "EtchedVM2000GlueReflection"; - else if(theStatus == GroundLumirrorAirReflection) + else if(fStatus == GroundLumirrorAirReflection) G4cout << "GroundLumirrorAirReflection"; - else if(theStatus == GroundLumirrorGlueReflection) + else if(fStatus == GroundLumirrorGlueReflection) G4cout << "GroundLumirrorGlueReflection"; - else if(theStatus == GroundAirReflection) + else if(fStatus == GroundAirReflection) G4cout << "GroundAirReflection"; - else if(theStatus == GroundTeflonAirReflection) + else if(fStatus == GroundTeflonAirReflection) G4cout << "GroundTeflonAirReflection"; - else if(theStatus == GroundTiOAirReflection) + else if(fStatus == GroundTiOAirReflection) G4cout << "GroundTiOAirReflection"; - else if(theStatus == GroundTyvekAirReflection) + else if(fStatus == GroundTyvekAirReflection) G4cout << "GroundTyvekAirReflection"; - else if(theStatus == GroundVM2000AirReflection) + else if(fStatus == GroundVM2000AirReflection) G4cout << "GroundVM2000AirReflection"; - else if(theStatus == GroundVM2000GlueReflection) + else if(fStatus == GroundVM2000GlueReflection) G4cout << "GroundVM2000GlueReflection"; - else if(theStatus == Absorption) + else if(fStatus == Absorption) G4cout << "Absorption"; - else if(theStatus == Detection) + else if(fStatus == Detection) G4cout << "Detection"; - else if(theStatus == NotAtBoundary) + else if(fStatus == NotAtBoundary) G4cout << "NotAtBoundary"; - else if(theStatus == SameMaterial) + else if(fStatus == SameMaterial) G4cout << "SameMaterial"; - else if(theStatus == StepTooSmall) + else if(fStatus == StepTooSmall) G4cout << "StepTooSmall"; - else if(theStatus == NoRINDEX) + else if(fStatus == NoRINDEX) G4cout << "NoRINDEX"; - else if(theStatus == Dichroic) + else if(fStatus == Dichroic) G4cout << "Dichroic Transmission"; G4cout << " ***" << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ThreeVector G4OpBoundaryProcess::GetFacetNormal( - const G4ThreeVector& Momentum, const G4ThreeVector& Normal) const + const G4ThreeVector& momentum, const G4ThreeVector& normal) const { G4ThreeVector facetNormal; - if(theModel == unified || theModel == LUT || theModel == DAVIS) + if(fModel == unified || fModel == LUT || fModel == DAVIS) { /* This function codes alpha to a random value taken from the distribution p(alpha) = g(alpha; 0, sigma_alpha)*std::sin(alpha), @@ -621,35 +616,35 @@ G4ThreeVector G4OpBoundaryProcess::GetFacetNormal( gaussian distribution with mean 0 and standard deviation sigma_alpha. */ G4double sigma_alpha = 0.0; - if(OpticalSurface) - sigma_alpha = OpticalSurface->GetSigmaAlpha(); + if(fOpticalSurface) + sigma_alpha = fOpticalSurface->GetSigmaAlpha(); if(sigma_alpha == 0.0) { - return Normal; + return normal; } G4double f_max = std::min(1.0, 4. * sigma_alpha); - G4double alpha, phi, sinAlpha; //, cosPhi, sinPhi; + G4double alpha, phi, sinAlpha; do { // Loop checking, 13-Aug-2015, Peter Gumplinger do { // Loop checking, 13-Aug-2015, Peter Gumplinger - alpha = G4RandGauss::shoot(0.0, sigma_alpha); - } while(G4UniformRand() * f_max > std::sin(alpha) || alpha >= halfpi); + alpha = G4RandGauss::shoot(0.0, sigma_alpha); + sinAlpha = std::sin(alpha); + } while(G4UniformRand() * f_max > sinAlpha || alpha >= halfpi); - phi = G4UniformRand() * twopi; - sinAlpha = std::sin(alpha); + phi = G4UniformRand() * twopi; facetNormal.set(sinAlpha * std::cos(phi), sinAlpha * std::sin(phi), std::cos(alpha)); - facetNormal.rotateUz(Normal); - } while(Momentum * facetNormal >= 0.0); + facetNormal.rotateUz(normal); + } while(momentum * facetNormal >= 0.0); } else { G4double polish = 1.0; - if(OpticalSurface) - polish = OpticalSurface->GetPolish(); + if(fOpticalSurface) + polish = fOpticalSurface->GetPolish(); if(polish < 1.0) { do @@ -660,14 +655,14 @@ G4ThreeVector G4OpBoundaryProcess::GetFacetNormal( smear.setX(2. * G4UniformRand() - 1.); smear.setY(2. * G4UniformRand() - 1.); smear.setZ(2. * G4UniformRand() - 1.); - } while(smear.mag() > 1.0); - facetNormal = Normal + (1. - polish) * smear; - } while(Momentum * facetNormal >= 0.0); + } while(smear.mag2() > 1.0); + facetNormal = normal + (1. - polish) * smear; + } while(momentum * facetNormal >= 0.0); facetNormal = facetNormal.unit(); } else { - facetNormal = Normal; + facetNormal = normal; } } return facetNormal; @@ -677,24 +672,24 @@ G4ThreeVector G4OpBoundaryProcess::GetFacetNormal( void G4OpBoundaryProcess::DielectricMetal() { G4int n = 0; - G4double rand, EdotN; - G4ThreeVector A_trans, A_paral; + G4double rand; + G4ThreeVector A_trans; do { ++n; rand = G4UniformRand(); - if(rand > theReflectivity && n == 1) + if(rand > fReflectivity && n == 1) { - if(rand > theReflectivity + theTransmittance) + if(rand > fReflectivity + fTransmittance) { DoAbsorption(); } else { - theStatus = Transmission; - NewMomentum = OldMomentum; - NewPolarization = OldPolarization; + fStatus = Transmission; + fNewMomentum = fOldMomentum; + fNewPolarization = fOldPolarization; } break; } @@ -705,14 +700,14 @@ void G4OpBoundaryProcess::DielectricMetal() if(n > 1) { CalculateReflectivity(); - if(!G4BooleanRand(theReflectivity)) + if(!G4BooleanRand(fReflectivity)) { DoAbsorption(); break; } } } - if(theModel == glisur || theFinish == polished) + if(fModel == glisur || fFinish == polished) { DoReflection(); } @@ -720,93 +715,91 @@ void G4OpBoundaryProcess::DielectricMetal() { if(n == 1) ChooseReflection(); - if(theStatus == LambertianReflection) + if(fStatus == LambertianReflection) { DoReflection(); } - else if(theStatus == BackScattering) + else if(fStatus == BackScattering) { - NewMomentum = -OldMomentum; - NewPolarization = -OldPolarization; + fNewMomentum = -fOldMomentum; + fNewPolarization = -fOldPolarization; } else { - if(theStatus == LobeReflection) + if(fStatus == LobeReflection) { - if(fRealRIndexMPV && fImagRIndexMPV) + if(!fRealRIndexMPV || !fImagRIndexMPV) { - // - } - else - { - theFacetNormal = GetFacetNormal(OldMomentum, theGlobalNormal); + fFacetNormal = GetFacetNormal(fOldMomentum, fGlobalNormal); } + //else + // case of complex rindex needs to be implemented } - NewMomentum = - OldMomentum - 2. * OldMomentum * theFacetNormal * theFacetNormal; - EdotN = OldPolarization * theFacetNormal; + fNewMomentum = + fOldMomentum - 2. * fOldMomentum * fFacetNormal * fFacetNormal; - A_trans = (sint1 > 0.0) ? OldMomentum.cross(theFacetNormal).unit() - : OldPolarization; - A_paral = NewMomentum.cross(A_trans).unit(); - - if(iTE > 0 && iTM > 0) + if(f_iTE > 0 && f_iTM > 0) { - NewPolarization = -OldPolarization + (2. * EdotN) * theFacetNormal; + fNewPolarization = + -fOldPolarization + + (2. * fOldPolarization * fFacetNormal * fFacetNormal); } - else if(iTE > 0) + else if(f_iTE > 0) { - NewPolarization = -A_trans; + A_trans = (fSint1 > 0.0) ? fOldMomentum.cross(fFacetNormal).unit() + : fOldPolarization; + fNewPolarization = -A_trans; } - else if(iTM > 0) + else if(f_iTM > 0) { - NewPolarization = -A_paral; + fNewPolarization = + -fNewMomentum.cross(A_trans).unit(); // = -A_paral } } } - OldMomentum = NewMomentum; - OldPolarization = NewPolarization; + fOldMomentum = fNewMomentum; + fOldPolarization = fNewPolarization; } // Loop checking, 13-Aug-2015, Peter Gumplinger - } while(NewMomentum * theGlobalNormal < 0.0); + } while(fNewMomentum * fGlobalNormal < 0.0); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4OpBoundaryProcess::DielectricLUT() { G4int thetaIndex, phiIndex; - G4double AngularDistributionValue, thetaRad, phiRad, EdotN; - G4ThreeVector PerpendicularVectorTheta, PerpendicularVectorPhi; + G4double angularDistVal, thetaRad, phiRad; + G4ThreeVector perpVectorTheta, perpVectorPhi; - theStatus = G4OpBoundaryProcessStatus( - G4int(theFinish) + (G4int(NoRINDEX) - G4int(groundbackpainted))); + fStatus = G4OpBoundaryProcessStatus( + G4int(fFinish) + (G4int(NoRINDEX) - G4int(groundbackpainted))); - G4int thetaIndexMax = OpticalSurface->GetThetaIndexMax(); - G4int phiIndexMax = OpticalSurface->GetPhiIndexMax(); + G4int thetaIndexMax = fOpticalSurface->GetThetaIndexMax(); + G4int phiIndexMax = fOpticalSurface->GetPhiIndexMax(); G4double rand; do { rand = G4UniformRand(); - if(rand > theReflectivity) + if(rand > fReflectivity) { - if(rand > theReflectivity + theTransmittance) + if(rand > fReflectivity + fTransmittance) { DoAbsorption(); } else { - theStatus = Transmission; - NewMomentum = OldMomentum; - NewPolarization = OldPolarization; + fStatus = Transmission; + fNewMomentum = fOldMomentum; + fNewPolarization = fOldPolarization; } break; } else { // Calculate Angle between Normal and Photon Momentum - G4double anglePhotonToNormal = OldMomentum.angle(-theGlobalNormal); + G4double anglePhotonToNormal = fOldMomentum.angle(-fGlobalNormal); // Round to closest integer: LBNL model array has 91 values G4int angleIncident = G4lrint(anglePhotonToNormal / CLHEP::deg); @@ -817,160 +810,158 @@ void G4OpBoundaryProcess::DielectricLUT() thetaIndex = G4RandFlat::shootInt(thetaIndexMax - 1); phiIndex = G4RandFlat::shootInt(phiIndexMax - 1); // Find probability with the new indeces from LUT - AngularDistributionValue = OpticalSurface->GetAngularDistributionValue( + angularDistVal = fOpticalSurface->GetAngularDistributionValue( angleIncident, thetaIndex, phiIndex); // Loop checking, 13-Aug-2015, Peter Gumplinger - } while(!G4BooleanRand(AngularDistributionValue)); + } while(!G4BooleanRand(angularDistVal)); - thetaRad = (-90 + 4 * thetaIndex) * pi / 180.; - phiRad = (-90 + 5 * phiIndex) * pi / 180.; + thetaRad = G4double(-90 + 4 * thetaIndex) * pi / 180.; + phiRad = G4double(-90 + 5 * phiIndex) * pi / 180.; // Rotate Photon Momentum in Theta, then in Phi - NewMomentum = -OldMomentum; + fNewMomentum = -fOldMomentum; - PerpendicularVectorTheta = NewMomentum.cross(theGlobalNormal); - if(PerpendicularVectorTheta.mag() < kCarTolerance) + perpVectorTheta = fNewMomentum.cross(fGlobalNormal); + if(perpVectorTheta.mag() < fCarTolerance) { - PerpendicularVectorTheta = NewMomentum.orthogonal(); + perpVectorTheta = fNewMomentum.orthogonal(); } - NewMomentum = NewMomentum.rotate(anglePhotonToNormal - thetaRad, - PerpendicularVectorTheta); - PerpendicularVectorPhi = PerpendicularVectorTheta.cross(NewMomentum); - NewMomentum = NewMomentum.rotate(-phiRad, PerpendicularVectorPhi); + fNewMomentum = + fNewMomentum.rotate(anglePhotonToNormal - thetaRad, perpVectorTheta); + perpVectorPhi = perpVectorTheta.cross(fNewMomentum); + fNewMomentum = fNewMomentum.rotate(-phiRad, perpVectorPhi); // Rotate Polarization too: - theFacetNormal = (NewMomentum - OldMomentum).unit(); - EdotN = OldPolarization * theFacetNormal; - NewPolarization = -OldPolarization + (2. * EdotN) * theFacetNormal; + fFacetNormal = (fNewMomentum - fOldMomentum).unit(); + fNewPolarization = -fOldPolarization + + (2. * fOldPolarization * fFacetNormal * fFacetNormal); } // Loop checking, 13-Aug-2015, Peter Gumplinger - } while(NewMomentum * theGlobalNormal <= 0.0); + } while(fNewMomentum * fGlobalNormal <= 0.0); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4OpBoundaryProcess::DielectricLUTDAVIS() { G4int angindex, random, angleIncident; - G4double ReflectivityValue, elevation, azimuth, EdotN; + G4double reflectivityValue, elevation, azimuth; G4double anglePhotonToNormal; - G4int LUTbin = OpticalSurface->GetLUTbins(); + G4int lutbin = fOpticalSurface->GetLUTbins(); G4double rand = G4UniformRand(); + G4double sinEl; + G4ThreeVector u, vNorm, w; + do { - anglePhotonToNormal = OldMomentum.angle(-theGlobalNormal); + anglePhotonToNormal = fOldMomentum.angle(-fGlobalNormal); // Davis model has 90 reflection bins: round down angleIncident = G4lint(anglePhotonToNormal / CLHEP::deg); - ReflectivityValue = OpticalSurface->GetReflectivityLUTValue(angleIncident); + reflectivityValue = fOpticalSurface->GetReflectivityLUTValue(angleIncident); - if(rand > ReflectivityValue) + if(rand > reflectivityValue) { - if(theEfficiency > 0.) + if(fEfficiency > 0.) { DoAbsorption(); break; } else { - theStatus = Transmission; + fStatus = Transmission; if(angleIncident <= 0.01) { - NewMomentum = OldMomentum; + fNewMomentum = fOldMomentum; break; } do { - random = G4RandFlat::shootInt(1, LUTbin + 1); + random = G4RandFlat::shootInt(1, lutbin + 1); angindex = - (((random * 2) - 1)) + angleIncident * LUTbin * 2 + 3640000; + (((random * 2) - 1)) + angleIncident * lutbin * 2 + 3640000; azimuth = - OpticalSurface->GetAngularDistributionValueLUT(angindex - 1); - elevation = OpticalSurface->GetAngularDistributionValueLUT(angindex); + fOpticalSurface->GetAngularDistributionValueLUT(angindex - 1); + elevation = fOpticalSurface->GetAngularDistributionValueLUT(angindex); } while(elevation == 0. && azimuth == 0.); - NewMomentum = -OldMomentum; - - G4ThreeVector v = theGlobalNormal.cross(-NewMomentum); - G4ThreeVector vNorm = v / v.mag(); - G4ThreeVector u = vNorm.cross(theGlobalNormal); - - u = u *= (std::sin(elevation) * std::cos(azimuth)); - v = vNorm *= (std::sin(elevation) * std::sin(azimuth)); - G4ThreeVector w = theGlobalNormal *= (std::cos(elevation)); - NewMomentum = G4ThreeVector(u + v + w); + sinEl = std::sin(elevation); + vNorm = (fGlobalNormal.cross(fOldMomentum)).unit(); + u = vNorm.cross(fGlobalNormal) * (sinEl * std::cos(azimuth)); + vNorm *= (sinEl * std::sin(azimuth)); + // fGlobalNormal shouldn't be modified here + w = (fGlobalNormal *= std::cos(elevation)); + fNewMomentum = u + vNorm + w; // Rotate Polarization too: - theFacetNormal = (NewMomentum - OldMomentum).unit(); - EdotN = OldPolarization * theFacetNormal; - NewPolarization = -OldPolarization + (2. * EdotN) * theFacetNormal; + fFacetNormal = (fNewMomentum - fOldMomentum).unit(); + fNewPolarization = -fOldPolarization + (2. * fOldPolarization * + fFacetNormal * fFacetNormal); } } else { - theStatus = LobeReflection; + fStatus = LobeReflection; if(angleIncident == 0) { - NewMomentum = -OldMomentum; + fNewMomentum = -fOldMomentum; break; } do { - random = G4RandFlat::shootInt(1, LUTbin + 1); - angindex = (((random * 2) - 1)) + (angleIncident - 1) * LUTbin * 2; + random = G4RandFlat::shootInt(1, lutbin + 1); + angindex = (((random * 2) - 1)) + (angleIncident - 1) * lutbin * 2; - azimuth = OpticalSurface->GetAngularDistributionValueLUT(angindex - 1); - elevation = OpticalSurface->GetAngularDistributionValueLUT(angindex); + azimuth = fOpticalSurface->GetAngularDistributionValueLUT(angindex - 1); + elevation = fOpticalSurface->GetAngularDistributionValueLUT(angindex); } while(elevation == 0. && azimuth == 0.); - NewMomentum = -OldMomentum; + sinEl = std::sin(elevation); + vNorm = (fGlobalNormal.cross(fOldMomentum)).unit(); + u = vNorm.cross(fGlobalNormal) * (sinEl * std::cos(azimuth)); + vNorm *= (sinEl * std::sin(azimuth)); + // fGlobalNormal shouldn't be modified here + w = (fGlobalNormal *= std::cos(elevation)); - G4ThreeVector v = theGlobalNormal.cross(-NewMomentum); - G4ThreeVector vNorm = v / v.mag(); - G4ThreeVector u = vNorm.cross(theGlobalNormal); - - u = u *= (std::sin(elevation) * std::cos(azimuth)); - v = vNorm *= (std::sin(elevation) * std::sin(azimuth)); - G4ThreeVector w = theGlobalNormal *= (std::cos(elevation)); - - NewMomentum = G4ThreeVector(u + v + w); + fNewMomentum = u + vNorm + w; // Rotate Polarization too: (needs revision) - NewPolarization = OldPolarization; + fNewPolarization = fOldPolarization; } - } while(NewMomentum * theGlobalNormal <= 0.0); + } while(fNewMomentum * fGlobalNormal <= 0.0); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4OpBoundaryProcess::DielectricDichroic() { // Calculate Angle between Normal and Photon Momentum - G4double anglePhotonToNormal = OldMomentum.angle(-theGlobalNormal); + G4double anglePhotonToNormal = fOldMomentum.angle(-fGlobalNormal); // Round it to closest integer G4double angleIncident = std::floor(180. / pi * anglePhotonToNormal + 0.5); - if(!DichroicVector) + if(!fDichroicVector) { - if(OpticalSurface) - DichroicVector = OpticalSurface->GetDichroicVector(); + if(fOpticalSurface) + fDichroicVector = fOpticalSurface->GetDichroicVector(); } - if(DichroicVector) + if(fDichroicVector) { - G4double wavelength = h_Planck * c_light / thePhotonMomentum; - theTransmittance = - DichroicVector->Value(wavelength / nm, angleIncident, idx, idy) * perCent; + G4double wavelength = h_Planck * c_light / fPhotonMomentum; + fTransmittance = fDichroicVector->Value(wavelength / nm, angleIncident, + idx_dichroicX, idx_dichroicY) * + perCent; // G4cout << "wavelength: " << std::floor(wavelength/nm) // << "nm" << G4endl; // G4cout << "Incident angle: " << angleIncident << "deg" << G4endl; // G4cout << "Transmittance: " - // << std::floor(theTransmittance/perCent) << "%" << G4endl; + // << std::floor(fTransmittance/perCent) << "%" << G4endl; } else { @@ -982,153 +973,147 @@ void G4OpBoundaryProcess::DielectricDichroic() "A dichroic surface must have an associated G4Physics2DVector"); } - if(!G4BooleanRand(theTransmittance)) + if(!G4BooleanRand(fTransmittance)) { // Not transmitted, so reflect - if(theModel == glisur || theFinish == polished) + if(fModel == glisur || fFinish == polished) { DoReflection(); } else { ChooseReflection(); - if(theStatus == LambertianReflection) + if(fStatus == LambertianReflection) { DoReflection(); } - else if(theStatus == BackScattering) + else if(fStatus == BackScattering) { - NewMomentum = -OldMomentum; - NewPolarization = -OldPolarization; + fNewMomentum = -fOldMomentum; + fNewPolarization = -fOldPolarization; } else { G4double PdotN, EdotN; do { - if(theStatus == LobeReflection) + if(fStatus == LobeReflection) { - theFacetNormal = GetFacetNormal(OldMomentum, theGlobalNormal); + fFacetNormal = GetFacetNormal(fOldMomentum, fGlobalNormal); } - PdotN = OldMomentum * theFacetNormal; - NewMomentum = OldMomentum - (2. * PdotN) * theFacetNormal; + PdotN = fOldMomentum * fFacetNormal; + fNewMomentum = fOldMomentum - (2. * PdotN) * fFacetNormal; // Loop checking, 13-Aug-2015, Peter Gumplinger - } while(NewMomentum * theGlobalNormal <= 0.0); + } while(fNewMomentum * fGlobalNormal <= 0.0); - EdotN = OldPolarization * theFacetNormal; - NewPolarization = -OldPolarization + (2. * EdotN) * theFacetNormal; + EdotN = fOldPolarization * fFacetNormal; + fNewPolarization = -fOldPolarization + (2. * EdotN) * fFacetNormal; } } } else { - theStatus = Dichroic; - NewMomentum = OldMomentum; - NewPolarization = OldPolarization; + fStatus = Dichroic; + fNewMomentum = fOldMomentum; + fNewPolarization = fOldPolarization; } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4OpBoundaryProcess::DielectricDielectric() { - G4bool Inside = false; - G4bool Swap = false; + G4bool inside = false; + G4bool swap = false; - if(theFinish == polished) + if(fFinish == polished) { - theFacetNormal = theGlobalNormal; + fFacetNormal = fGlobalNormal; } else { - theFacetNormal = GetFacetNormal(OldMomentum, theGlobalNormal); + fFacetNormal = GetFacetNormal(fOldMomentum, fGlobalNormal); } - G4double cost1 = -OldMomentum * theFacetNormal; + G4double cost1 = -fOldMomentum * fFacetNormal; G4double cost2 = 0.; G4double sint2 = 0.; - G4bool SurfaceRoughnessCriterionPass = true; - if(theSurfaceRoughness != 0. && Rindex1 > Rindex2) + G4bool surfaceRoughnessCriterionPass = true; + if(fSurfaceRoughness != 0. && fRindex1 > fRindex2) { - G4double wavelength = h_Planck * c_light / thePhotonMomentum; - G4double SurfaceRoughnessCriterion = std::exp(-std::pow( - (4. * pi * theSurfaceRoughness * Rindex1 * cost1 / wavelength), 2)); - SurfaceRoughnessCriterionPass = G4BooleanRand(SurfaceRoughnessCriterion); + G4double wavelength = h_Planck * c_light / fPhotonMomentum; + G4double surfaceRoughnessCriterion = std::exp(-std::pow( + (4. * pi * fSurfaceRoughness * fRindex1 * cost1 / wavelength), 2)); + surfaceRoughnessCriterionPass = G4BooleanRand(surfaceRoughnessCriterion); } leap: - G4bool Through = false; - G4bool Done = false; + G4bool through = false; + G4bool done = false; - G4double EdotN; G4ThreeVector A_trans, A_paral, E1pp, E1pl; G4double E1_perp, E1_parl; - G4double s1, s2, E2_perp, E2_parl, E2_total, TransCoeff; + G4double s1, s2, E2_perp, E2_parl, E2_total, transCoeff; G4double E2_abs, C_parl, C_perp; G4double alpha; do { - if(Through) + if(through) { - Swap = !Swap; - Through = false; - theGlobalNormal = -theGlobalNormal; - G4SwapPtr(Material1, Material2); - G4SwapObj(&Rindex1, &Rindex2); + swap = !swap; + through = false; + fGlobalNormal = -fGlobalNormal; + G4SwapPtr(fMaterial1, fMaterial2); + G4SwapObj(&fRindex1, &fRindex2); } - if(theFinish == polished) + if(fFinish == polished) { - theFacetNormal = theGlobalNormal; + fFacetNormal = fGlobalNormal; } else { - theFacetNormal = GetFacetNormal(OldMomentum, theGlobalNormal); + fFacetNormal = GetFacetNormal(fOldMomentum, fGlobalNormal); } - // PdotN = OldMomentum * theFacetNormal; - EdotN = OldPolarization * theFacetNormal; - - cost1 = -OldMomentum * theFacetNormal; - if(std::abs(cost1) < 1.0 - kCarTolerance) + cost1 = -fOldMomentum * fFacetNormal; + if(std::abs(cost1) < 1.0 - fCarTolerance) { - sint1 = std::sqrt(1. - cost1 * cost1); - sint2 = sint1 * Rindex1 / Rindex2; // *** Snell's Law *** - // this isn't a sine as we might - // expect from the name; can be > 1 + fSint1 = std::sqrt(1. - cost1 * cost1); + sint2 = fSint1 * fRindex1 / fRindex2; // *** Snell's Law *** + // this isn't a sine as we might expect from the name; can be > 1 } else { - sint1 = 0.0; - sint2 = 0.0; + fSint1 = 0.0; + sint2 = 0.0; } // TOTAL INTERNAL REFLECTION if(sint2 >= 1.0) { - Swap = false; + swap = false; - theStatus = TotalInternalReflection; - if(!SurfaceRoughnessCriterionPass) - theStatus = LambertianReflection; - if(theModel == unified && theFinish != polished) + fStatus = TotalInternalReflection; + if(!surfaceRoughnessCriterionPass) + fStatus = LambertianReflection; + if(fModel == unified && fFinish != polished) ChooseReflection(); - if(theStatus == LambertianReflection) + if(fStatus == LambertianReflection) { DoReflection(); } - else if(theStatus == BackScattering) + else if(fStatus == BackScattering) { - NewMomentum = -OldMomentum; - NewPolarization = -OldPolarization; + fNewMomentum = -fOldMomentum; + fNewPolarization = -fOldPolarization; } else { - // PdotN = OldMomentum * theFacetNormal; - NewMomentum = - OldMomentum - 2. * OldMomentum * theFacetNormal * theFacetNormal; - EdotN = OldPolarization * theFacetNormal; - NewPolarization = -OldPolarization + (2. * EdotN) * theFacetNormal; + fNewMomentum = + fOldMomentum - 2. * fOldMomentum * fFacetNormal * fFacetNormal; + fNewPolarization = -fOldPolarization + (2. * fOldPolarization * + fFacetNormal * fFacetNormal); } } // NOT TIR @@ -1144,80 +1129,80 @@ leap: cost2 = -std::sqrt(1. - sint2 * sint2); } - if(sint1 > 0.0) + if(fSint1 > 0.0) { - A_trans = (OldMomentum.cross(theFacetNormal)).unit(); - E1_perp = OldPolarization * A_trans; + A_trans = (fOldMomentum.cross(fFacetNormal)).unit(); + E1_perp = fOldPolarization * A_trans; E1pp = E1_perp * A_trans; - E1pl = OldPolarization - E1pp; + E1pl = fOldPolarization - E1pp; E1_parl = E1pl.mag(); } else { - A_trans = OldPolarization; + A_trans = fOldPolarization; // Here we Follow Jackson's conventions and set the parallel // component = 1 in case of a ray perpendicular to the surface E1_perp = 0.0; E1_parl = 1.0; } - s1 = Rindex1 * cost1; - E2_perp = 2. * s1 * E1_perp / (Rindex1 * cost1 + Rindex2 * cost2); - E2_parl = 2. * s1 * E1_parl / (Rindex2 * cost1 + Rindex1 * cost2); + s1 = fRindex1 * cost1; + E2_perp = 2. * s1 * E1_perp / (fRindex1 * cost1 + fRindex2 * cost2); + E2_parl = 2. * s1 * E1_parl / (fRindex2 * cost1 + fRindex1 * cost2); E2_total = E2_perp * E2_perp + E2_parl * E2_parl; - s2 = Rindex2 * cost2 * E2_total; + s2 = fRindex2 * cost2 * E2_total; - if(theTransmittance > 0.) - TransCoeff = theTransmittance; + if(fTransmittance > 0.) + transCoeff = fTransmittance; else if(cost1 != 0.0) - TransCoeff = s2 / s1; + transCoeff = s2 / s1; else - TransCoeff = 0.0; + transCoeff = 0.0; // NOT TIR: REFLECTION - if(!G4BooleanRand(TransCoeff)) + if(!G4BooleanRand(transCoeff)) { - Swap = false; - theStatus = FresnelReflection; + swap = false; + fStatus = FresnelReflection; - if(!SurfaceRoughnessCriterionPass) - theStatus = LambertianReflection; - if(theModel == unified && theFinish != polished) + if(!surfaceRoughnessCriterionPass) + fStatus = LambertianReflection; + if(fModel == unified && fFinish != polished) ChooseReflection(); - if(theStatus == LambertianReflection) + if(fStatus == LambertianReflection) { DoReflection(); } - else if(theStatus == BackScattering) + else if(fStatus == BackScattering) { - NewMomentum = -OldMomentum; - NewPolarization = -OldPolarization; + fNewMomentum = -fOldMomentum; + fNewPolarization = -fOldPolarization; } else { - NewMomentum = - OldMomentum - 2. * OldMomentum * theFacetNormal * theFacetNormal; - if(sint1 > 0.0) + fNewMomentum = + fOldMomentum - 2. * fOldMomentum * fFacetNormal * fFacetNormal; + if(fSint1 > 0.0) { // incident ray oblique - E2_parl = Rindex2 * E2_parl / Rindex1 - E1_parl; + E2_parl = fRindex2 * E2_parl / fRindex1 - E1_parl; E2_perp = E2_perp - E1_perp; E2_total = E2_perp * E2_perp + E2_parl * E2_parl; - A_paral = (NewMomentum.cross(A_trans)).unit(); + A_paral = (fNewMomentum.cross(A_trans)).unit(); E2_abs = std::sqrt(E2_total); C_parl = E2_parl / E2_abs; C_perp = E2_perp / E2_abs; - NewPolarization = C_parl * A_paral + C_perp * A_trans; + fNewPolarization = C_parl * A_paral + C_perp * A_trans; } else { // incident ray perpendicular - if(Rindex2 > Rindex1) + if(fRindex2 > fRindex1) { - NewPolarization = -OldPolarization; + fNewPolarization = -fOldPolarization; } else { - NewPolarization = OldPolarization; + fNewPolarization = fOldPolarization; } } } @@ -1225,77 +1210,77 @@ leap: // NOT TIR: TRANSMISSION else { - Inside = !Inside; - Through = true; - theStatus = FresnelRefraction; + inside = !inside; + through = true; + fStatus = FresnelRefraction; - if(sint1 > 0.0) + if(fSint1 > 0.0) { // incident ray oblique - alpha = cost1 - cost2 * (Rindex2 / Rindex1); - NewMomentum = (OldMomentum + alpha * theFacetNormal).unit(); - A_paral = (NewMomentum.cross(A_trans)).unit(); - E2_abs = std::sqrt(E2_total); - C_parl = E2_parl / E2_abs; - C_perp = E2_perp / E2_abs; + alpha = cost1 - cost2 * (fRindex2 / fRindex1); + fNewMomentum = (fOldMomentum + alpha * fFacetNormal).unit(); + A_paral = (fNewMomentum.cross(A_trans)).unit(); + E2_abs = std::sqrt(E2_total); + C_parl = E2_parl / E2_abs; + C_perp = E2_perp / E2_abs; - NewPolarization = C_parl * A_paral + C_perp * A_trans; + fNewPolarization = C_parl * A_paral + C_perp * A_trans; } else { // incident ray perpendicular - NewMomentum = OldMomentum; - NewPolarization = OldPolarization; + fNewMomentum = fOldMomentum; + fNewPolarization = fOldPolarization; } } } - OldMomentum = NewMomentum.unit(); - OldPolarization = NewPolarization.unit(); + fOldMomentum = fNewMomentum.unit(); + fOldPolarization = fNewPolarization.unit(); - if(theStatus == FresnelRefraction) + if(fStatus == FresnelRefraction) { - Done = (NewMomentum * theGlobalNormal <= 0.0); + done = (fNewMomentum * fGlobalNormal <= 0.0); } else { - Done = (NewMomentum * theGlobalNormal >= -kCarTolerance); + done = (fNewMomentum * fGlobalNormal >= -fCarTolerance); } // Loop checking, 13-Aug-2015, Peter Gumplinger - } while(!Done); + } while(!done); - if(Inside && !Swap) + if(inside && !swap) { - if(theFinish == polishedbackpainted || theFinish == groundbackpainted) + if(fFinish == polishedbackpainted || fFinish == groundbackpainted) { G4double rand = G4UniformRand(); - if(rand > theReflectivity + theTransmittance) + if(rand > fReflectivity + fTransmittance) { DoAbsorption(); } - else if(rand > theReflectivity) + else if(rand > fReflectivity) { - theStatus = Transmission; - NewMomentum = OldMomentum; - NewPolarization = OldPolarization; + fStatus = Transmission; + fNewMomentum = fOldMomentum; + fNewPolarization = fOldPolarization; } else { - if(theStatus != FresnelRefraction) + if(fStatus != FresnelRefraction) { - theGlobalNormal = -theGlobalNormal; + fGlobalNormal = -fGlobalNormal; } else { - Swap = !Swap; - G4SwapPtr(Material1, Material2); - G4SwapObj(&Rindex1, &Rindex2); + swap = !swap; + G4SwapPtr(fMaterial1, fMaterial2); + G4SwapObj(&fRindex1, &fRindex2); } - if(theFinish == groundbackpainted) - theStatus = LambertianReflection; + if(fFinish == groundbackpainted) + fStatus = LambertianReflection; DoReflection(); - theGlobalNormal = -theGlobalNormal; - OldMomentum = NewMomentum; + fGlobalNormal = -fGlobalNormal; + fOldMomentum = fNewMomentum; goto leap; } @@ -1314,24 +1299,20 @@ G4double G4OpBoundaryProcess::GetMeanFreePath(const G4Track&, G4double, //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double G4OpBoundaryProcess::GetIncidentAngle() { - G4double PdotN = OldMomentum * theFacetNormal; - G4double magP = OldMomentum.mag(); - G4double magN = theFacetNormal.mag(); - G4double incidentangle = pi - std::acos(PdotN / (magP * magN)); - - return incidentangle; + return pi - std::acos(fOldMomentum * fFacetNormal / + (fOldMomentum.mag() * fFacetNormal.mag())); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double G4OpBoundaryProcess::GetReflectivity(G4double E1_perp, G4double E1_parl, G4double incidentangle, - G4double RealRindex, - G4double ImaginaryRindex) + G4double realRindex, + G4double imaginaryRindex) { - G4complex Reflectivity, Reflectivity_TE, Reflectivity_TM; - G4complex N1(Rindex1, 0.), N2(RealRindex, ImaginaryRindex); - G4complex CosPhi; + G4complex reflectivity, reflectivity_TE, reflectivity_TM; + G4complex N1(fRindex1, 0.), N2(realRindex, imaginaryRindex); + G4complex cosPhi; G4complex u(1., 0.); // unit number 1 @@ -1340,106 +1321,106 @@ G4double G4OpBoundaryProcess::GetReflectivity(G4double E1_perp, G4complex denominatorTE, denominatorTM; G4complex rTM, rTE; - G4MaterialPropertiesTable* MPT = Material1->GetMaterialPropertiesTable(); + G4MaterialPropertiesTable* MPT = fMaterial1->GetMaterialPropertiesTable(); G4MaterialPropertyVector* ppR = MPT->GetProperty(kREALRINDEX); G4MaterialPropertyVector* ppI = MPT->GetProperty(kIMAGINARYRINDEX); if(ppR && ppI) { - G4double RRindex = ppR->Value(thePhotonMomentum, idx_rrindex); - G4double IRindex = ppI->Value(thePhotonMomentum, idx_irindex); - N1 = G4complex(RRindex, IRindex); + G4double rRindex = ppR->Value(fPhotonMomentum, idx_rrindex); + G4double iRindex = ppI->Value(fPhotonMomentum, idx_irindex); + N1 = G4complex(rRindex, iRindex); } // Following two equations, rTM and rTE, are from: "Introduction To Modern // Optics" written by Fowles - CosPhi = std::sqrt(u - ((std::sin(incidentangle) * std::sin(incidentangle)) * + cosPhi = std::sqrt(u - ((std::sin(incidentangle) * std::sin(incidentangle)) * (N1 * N1) / (N2 * N2))); - numeratorTE = N1 * std::cos(incidentangle) - N2 * CosPhi; - denominatorTE = N1 * std::cos(incidentangle) + N2 * CosPhi; + numeratorTE = N1 * std::cos(incidentangle) - N2 * cosPhi; + denominatorTE = N1 * std::cos(incidentangle) + N2 * cosPhi; rTE = numeratorTE / denominatorTE; - numeratorTM = N2 * std::cos(incidentangle) - N1 * CosPhi; - denominatorTM = N2 * std::cos(incidentangle) + N1 * CosPhi; + numeratorTM = N2 * std::cos(incidentangle) - N1 * cosPhi; + denominatorTM = N2 * std::cos(incidentangle) + N1 * cosPhi; rTM = numeratorTM / denominatorTM; - // This is my calculaton for reflectivity on a metalic surface + // This is my (PG) calculaton for reflectivity on a metallic surface // depending on the fraction of TE and TM polarization // when TE polarization, E1_parl=0 and E1_perp=1, R=abs(rTE)^2 and // when TM polarization, E1_parl=1 and E1_perp=0, R=abs(rTM)^2 - Reflectivity_TE = (rTE * conj(rTE)) * (E1_perp * E1_perp) / + reflectivity_TE = (rTE * conj(rTE)) * (E1_perp * E1_perp) / (E1_perp * E1_perp + E1_parl * E1_parl); - Reflectivity_TM = (rTM * conj(rTM)) * (E1_parl * E1_parl) / + reflectivity_TM = (rTM * conj(rTM)) * (E1_parl * E1_parl) / (E1_perp * E1_perp + E1_parl * E1_parl); - Reflectivity = Reflectivity_TE + Reflectivity_TM; + reflectivity = reflectivity_TE + reflectivity_TM; do { - if(G4UniformRand() * real(Reflectivity) > real(Reflectivity_TE)) + if(G4UniformRand() * real(reflectivity) > real(reflectivity_TE)) { - iTE = -1; + f_iTE = -1; } else { - iTE = 1; + f_iTE = 1; } - if(G4UniformRand() * real(Reflectivity) > real(Reflectivity_TM)) + if(G4UniformRand() * real(reflectivity) > real(reflectivity_TM)) { - iTM = -1; + f_iTM = -1; } else { - iTM = 1; + f_iTM = 1; } // Loop checking, 13-Aug-2015, Peter Gumplinger - } while(iTE < 0 && iTM < 0); + } while(f_iTE < 0 && f_iTM < 0); - return real(Reflectivity); + return real(reflectivity); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4OpBoundaryProcess::CalculateReflectivity() { - G4double RealRindex = fRealRIndexMPV->Value(thePhotonMomentum, idx_rrindex); - G4double ImaginaryRindex = - fImagRIndexMPV->Value(thePhotonMomentum, idx_irindex); + G4double realRindex = fRealRIndexMPV->Value(fPhotonMomentum, idx_rrindex); + G4double imaginaryRindex = + fImagRIndexMPV->Value(fPhotonMomentum, idx_irindex); // calculate FacetNormal - if(theFinish == ground) + if(fFinish == ground) { - theFacetNormal = GetFacetNormal(OldMomentum, theGlobalNormal); + fFacetNormal = GetFacetNormal(fOldMomentum, fGlobalNormal); } else { - theFacetNormal = theGlobalNormal; + fFacetNormal = fGlobalNormal; } - G4double cost1 = -OldMomentum * theFacetNormal; - if(std::abs(cost1) < 1.0 - kCarTolerance) + G4double cost1 = -fOldMomentum * fFacetNormal; + if(std::abs(cost1) < 1.0 - fCarTolerance) { - sint1 = std::sqrt(1. - cost1 * cost1); + fSint1 = std::sqrt(1. - cost1 * cost1); } else { - sint1 = 0.0; + fSint1 = 0.0; } G4ThreeVector A_trans, A_paral, E1pp, E1pl; G4double E1_perp, E1_parl; - if(sint1 > 0.0) + if(fSint1 > 0.0) { - A_trans = (OldMomentum.cross(theFacetNormal)).unit(); - E1_perp = OldPolarization * A_trans; + A_trans = (fOldMomentum.cross(fFacetNormal)).unit(); + E1_perp = fOldPolarization * A_trans; E1pp = E1_perp * A_trans; - E1pl = OldPolarization - E1pp; + E1pl = fOldPolarization - E1pp; E1_parl = E1pl.mag(); } else { - A_trans = OldPolarization; + A_trans = fOldPolarization; // Here we Follow Jackson's conventions and we set the parallel // component = 1 in case of a ray perpendicular to the surface E1_perp = 0.0; @@ -1450,19 +1431,33 @@ void G4OpBoundaryProcess::CalculateReflectivity() // calculate the reflectivity depending on incident angle, // polarization and complex refractive - theReflectivity = GetReflectivity(E1_perp, E1_parl, incidentangle, RealRindex, - ImaginaryRindex); + fReflectivity = GetReflectivity(E1_perp, E1_parl, incidentangle, realRindex, + imaginaryRindex); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4bool G4OpBoundaryProcess::InvokeSD(const G4Step* pStep) { G4Step aStep = *pStep; - aStep.AddTotalEnergyDeposit(thePhotonMomentum); + aStep.AddTotalEnergyDeposit(fPhotonMomentum); G4VSensitiveDetector* sd = aStep.GetPostStepPoint()->GetSensitiveDetector(); - if(sd) + if(sd != nullptr) return sd->Hit(&aStep); else return false; } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +inline void G4OpBoundaryProcess::SetInvokeSD(G4bool flag) +{ + fInvokeSD = flag; + G4OpticalParameters::Instance()->SetBoundaryInvokeSD(fInvokeSD); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4OpBoundaryProcess::SetVerboseLevel(G4int verbose) +{ + verboseLevel = verbose; + G4OpticalParameters::Instance()->SetBoundaryVerboseLevel(verboseLevel); +} diff --git a/source/processes/optical/src/G4OpMieHG.cc b/source/processes/optical/src/G4OpMieHG.cc index 29a5e464d2..7d521f7cfc 100644 --- a/source/processes/optical/src/G4OpMieHG.cc +++ b/source/processes/optical/src/G4OpMieHG.cc @@ -182,3 +182,10 @@ G4double G4OpMieHG::GetMeanFreePath(const G4Track& aTrack, G4double, } return attLength; } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4OpMieHG::SetVerboseLevel(G4int verbose) +{ + verboseLevel = verbose; + G4OpticalParameters::Instance()->SetMieVerboseLevel(verboseLevel); +} diff --git a/source/processes/optical/src/G4OpRayleigh.cc b/source/processes/optical/src/G4OpRayleigh.cc index b5537cd624..af4dfb5cba 100644 --- a/source/processes/optical/src/G4OpRayleigh.cc +++ b/source/processes/optical/src/G4OpRayleigh.cc @@ -307,3 +307,10 @@ G4PhysicsFreeVector* G4OpRayleigh::CalculateRayleighMeanFreePaths( return rayleighMFPs; } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4OpRayleigh::SetVerboseLevel(G4int verbose) +{ + verboseLevel = verbose; + G4OpticalParameters::Instance()->SetRayleighVerboseLevel(verboseLevel); +} diff --git a/source/processes/optical/src/G4OpWLS.cc b/source/processes/optical/src/G4OpWLS.cc index 21bb6ca9d0..a27c81c086 100644 --- a/source/processes/optical/src/G4OpWLS.cc +++ b/source/processes/optical/src/G4OpWLS.cc @@ -332,4 +332,12 @@ void G4OpWLS::UseTimeProfile(const G4String name) G4Exception("G4OpWLS::UseTimeProfile", "em0202", FatalException, "generator does not exist"); } + G4OpticalParameters::Instance()->SetWLSTimeProfile(name); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4OpWLS::SetVerboseLevel(G4int verbose) +{ + verboseLevel = verbose; + G4OpticalParameters::Instance()->SetWLSVerboseLevel(verboseLevel); } diff --git a/source/processes/optical/src/G4OpWLS2.cc b/source/processes/optical/src/G4OpWLS2.cc index d20db45097..b0d6ff3dd3 100644 --- a/source/processes/optical/src/G4OpWLS2.cc +++ b/source/processes/optical/src/G4OpWLS2.cc @@ -336,4 +336,12 @@ void G4OpWLS2::UseTimeProfile(const G4String name) G4Exception("G4OpWLS::UseTimeProfile", "em0202", FatalException, "generator does not exist"); } + G4OpticalParameters::Instance()->SetWLSTimeProfile(name); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void G4OpWLS2::SetVerboseLevel(G4int verbose) +{ + verboseLevel = verbose; + G4OpticalParameters::Instance()->SetWLS2VerboseLevel(verboseLevel); } diff --git a/source/processes/scoring/History b/source/processes/scoring/History index de8dffabfb..35ad4d1132 100644 --- a/source/processes/scoring/History +++ b/source/processes/scoring/History @@ -16,6 +16,10 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +September 23, 2021, Alberto Ribon (procscore-V10-07-01) +- G4ParallelWorldProcess.cc : replaced hardwired process sub-type "491" + with new enum value PARALLEL_WORLD_PROCESS. + April 16, 2021, Ben Morgan (procscore-V10-07-00) - Migrate build to modular CMake API diff --git a/source/processes/scoring/src/G4ParallelWorldProcess.cc b/source/processes/scoring/src/G4ParallelWorldProcess.cc index d34bee3eb8..7a85b24b94 100644 --- a/source/processes/scoring/src/G4ParallelWorldProcess.cc +++ b/source/processes/scoring/src/G4ParallelWorldProcess.cc @@ -44,6 +44,7 @@ #include "G4Material.hh" #include "G4ProductionCuts.hh" #include "G4ProductionCutsTable.hh" +#include "G4TransportationProcessType.hh" #include "G4SDManager.hh" #include "G4VSensitiveDetector.hh" @@ -62,7 +63,7 @@ G4ParallelWorldProcess(const G4String& processName,G4ProcessType theType) fNavigatorID(-1),fFieldTrack('0'),fGhostSafety(0.),fOnBoundary(false), layeredMaterialFlag(false) { - SetProcessSubType(491); + SetProcessSubType(PARALLEL_WORLD_PROCESS); if(!fpHyperStep) fpHyperStep = new G4Step(); iParallelWorld = ++nParallelWorlds; diff --git a/source/processes/solidstate/channeling/History b/source/processes/solidstate/channeling/History index 4b37d8bcb6..74766ebdb4 100644 --- a/source/processes/solidstate/channeling/History +++ b/source/processes/solidstate/channeling/History @@ -16,6 +16,11 @@ committal in the SVN repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +4 August 2021 Alberto Ribon channeling-V10-07-01 +----------------------------------------------------- +- G4Channeling, G4ChannelingOptrChangeCrossSection : migrated to the + new version of G4PhysicsModelCatalog + 16 April 2021 Ben Morgan channeling-V10-07-00 ----------------------------------------------------- - Migrate build to modular CMake API diff --git a/source/processes/solidstate/channeling/src/G4Channeling.cc b/source/processes/solidstate/channeling/src/G4Channeling.cc index 5acee4ab87..bcb5be1b85 100644 --- a/source/processes/solidstate/channeling/src/G4Channeling.cc +++ b/source/processes/solidstate/channeling/src/G4Channeling.cc @@ -32,20 +32,17 @@ #include "G4TouchableHistory.hh" #include "G4SystemOfUnits.hh" #include "G4LambdacPlus.hh" +#include "G4PhysicsModelCatalog.hh" G4Channeling::G4Channeling(): G4VDiscreteProcess("channeling"), -fChannelingID(-1), +fChannelingID(G4PhysicsModelCatalog::GetModelID("model_channeling")), fTimeStepMin(0.), fTimeStepMax(0.), fTransverseVariationMax(2.E-2 * CLHEP::angstrom), -k010(G4ThreeVector(0.,1.,0.)){ - fChannelingID = G4PhysicsModelCatalog::GetIndex("channeling"); - if(fChannelingID == -1){ - fChannelingID = G4PhysicsModelCatalog::Register("channeling"); - } - fSpin = G4ThreeVector(0.,0.,0.); -} +k010(G4ThreeVector(0.,1.,0.)), +fSpin(G4ThreeVector(0.,0.,0.)) +{} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/solidstate/channeling/src/G4ChannelingOptrChangeCrossSection.cc b/source/processes/solidstate/channeling/src/G4ChannelingOptrChangeCrossSection.cc index 83888090fc..1f2e364bcd 100644 --- a/source/processes/solidstate/channeling/src/G4ChannelingOptrChangeCrossSection.cc +++ b/source/processes/solidstate/channeling/src/G4ChannelingOptrChangeCrossSection.cc @@ -37,13 +37,14 @@ #include "G4ChannelingTrackData.hh" #include "G4EmProcessSubType.hh" +#include "G4PhysicsModelCatalog.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4ChannelingOptrChangeCrossSection::G4ChannelingOptrChangeCrossSection(G4String particleName, G4String name) :G4VBiasingOperator(name), -fChannelingID(-1), +fChannelingID(G4PhysicsModelCatalog::GetModelID("model_channeling")), fSetup(true){ fParticleToBias = G4ParticleTable::GetParticleTable()->FindParticle(particleName); @@ -181,9 +182,6 @@ G4ChannelingOptrChangeCrossSection::ProposeOccurenceBiasingOperation(const G4Tra G4double analogXS = 1./analogInteractionLength; - if(fChannelingID==-1){ - fChannelingID = G4PhysicsModelCatalog::GetIndex("channeling"); - } G4ChannelingTrackData* trackdata = (G4ChannelingTrackData*)(track->GetAuxiliaryTrackInformation(fChannelingID)); if(trackdata==nullptr) return 0; diff --git a/source/processes/solidstate/phonon/README b/source/processes/solidstate/phonon/README deleted file mode 100644 index d32249805c..0000000000 --- a/source/processes/solidstate/phonon/README +++ /dev/null @@ -1,38 +0,0 @@ - -Contains processes for phonon propagation and interaction in materials. - -G4LatticeManager: Singleton (TLS) for logical and physical lattices - associated with materials and volumes. - -G4LatticeReader: Driver to create logical lattices by reading in - configuration files and velocity map tables. NOTE: This class will - be moved to source/materials/ once Release 10.0 is deployed. - -The lattice data files should be stored under $G4LATTICEDATA (set to -"./CrystalMaps" by default, to support the extended example). The -configuration and velocity map files for a given material should be stored -in a subdirectory with that material's name (e.g., "Ge"). - -Documentation for the lattice configuration files will be expanded in the -future. - -G4VPhononProcess: Virtual base class for all processes below, providing - some utility functions. - -G4PhononDownconversion: Process to convert single longitudinal phonons - either into pairs of two transverse phonons, or to emit a transverse - phonon. - -G4PhononReflection: Placeholder process to reflect phonons off of crystal - surfaces. Currently phonons are absorbed, or converted to hits. - -G4PhononScattering: Process to scatter phonons off the surrounding - lattice. Currently handles "transportation" as well, but each - scatter destroys the phonon and creates a new one. - -G4PhononPolarization: Enum with conversion functions to map the three - phonon particle definitions onto internal codes (L=0, TS=1, TF=2). - -G4PhononTrackMap: Singleton (TLS) map file to connect tracks with - wavevectors. for temporary use until wavevector is added to G4Track - as a data member, after Release 10.0. diff --git a/source/processes/solidstate/phonon/src/G4LatticeReader.cc b/source/processes/solidstate/phonon/src/G4LatticeReader.cc index 26d5ce4126..f87fe8895e 100644 --- a/source/processes/solidstate/phonon/src/G4LatticeReader.cc +++ b/source/processes/solidstate/phonon/src/G4LatticeReader.cc @@ -113,9 +113,9 @@ G4bool G4LatticeReader::OpenFile(const G4String& filename) { } // Extract path from filename to use in finding .ssv map files - size_t lastdir = filepath.last('/'); + size_t lastdir = filepath.rfind('/'); if (lastdir == std::string::npos) fMapPath = "."; // No path at all - else fMapPath = filepath(0,lastdir); + else fMapPath = filepath.substr(0,lastdir); return true; } @@ -138,8 +138,8 @@ G4bool G4LatticeReader::ProcessToken() { if (verboseLevel>1) G4cout << " ProcessToken " << fToken << G4endl; - fToken.toLower(); - if (fToken.contains('#')) return SkipComments(); // Ignore rest of line + G4StrUtil::to_lower(fToken); + if (G4StrUtil::contains(fToken, '#')) return SkipComments(); // Ignore rest of line if (fToken == "vdir") return ProcessNMap(); // Direction vector map if (fToken == "vg") return ProcessMap(); // Velocity magnitudes if (fToken == "dyn") return ProcessConstants(); // Dynamical parameters @@ -214,7 +214,7 @@ G4bool G4LatticeReader::ReadMapInfo() { fMap = fMapPath + "/" + fMap; // Convert string code (L,ST,LT) to polarization index - fsPol.toLower(); + G4StrUtil::to_lower(fsPol); fPol = ( (fsPol=="l") ? 0 : // Longitudinal (fsPol=="st") ? 1 : // Slow-transverse (fsPol=="ft") ? 2 : // Fast-transverse diff --git a/source/processes/transportation/History b/source/processes/transportation/History index 54808435f8..ec33c1ab37 100644 --- a/source/processes/transportation/History +++ b/source/processes/transportation/History @@ -16,6 +16,12 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Sep 23rd 2021, Alberto Ribon transport-V10-07-03 +---------------------------- +- Added PARALLEL_WORLD_PROCESS to G4TransportationProcessType + (to avoid hardwired value "491" in the constructor of class + G4ParallelWorldProcess). + Apr 16th 2021, Ben Morgan transport-V10-07-02 ------------------------- - Migrate build to modular CMake API diff --git a/source/processes/transportation/include/G4TransportationProcessType.hh b/source/processes/transportation/include/G4TransportationProcessType.hh index e576fa25a6..9ab1be437d 100644 --- a/source/processes/transportation/include/G4TransportationProcessType.hh +++ b/source/processes/transportation/include/G4TransportationProcessType.hh @@ -46,6 +46,7 @@ enum G4TransportationProcessType // following processes belong to 'General' type STEP_LIMITER = 401, USER_SPECIAL_CUTS = 402, - NEUTRON_KILLER = 403 + NEUTRON_KILLER = 403, + PARALLEL_WORLD_PROCESS = 491 }; #endif diff --git a/source/readout/History b/source/readout/History index 9e0ffc35a2..267fe384de 100644 --- a/source/readout/History +++ b/source/readout/History @@ -16,6 +16,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +October 18, 2021 B. Morgan (readout-V10-07-01) +- Use std::string member functions from G4String in place of synonyms + April 1, 2021 B. Morgan (readout-V10-07-00) - Migrate build to modular CMake API diff --git a/source/readout/src/G4DCtable.cc b/source/readout/src/G4DCtable.cc index 5bba52a37a..845de52ed7 100644 --- a/source/readout/src/G4DCtable.cc +++ b/source/readout/src/G4DCtable.cc @@ -45,7 +45,7 @@ G4int G4DCtable::Registor(G4String DMname,G4String DCname) G4int G4DCtable::GetCollectionID(G4String DCname) const { G4int i = -1; - if(DCname.index("/")==std::string::npos) // DCname only + if(DCname.find("/")==std::string::npos) // DCname only { for(int j=0;j set_userInitialization(new MyDetectorConstruction); - // Physics List - runManager-> set_userInitialization(new MyPhysicsList); - // Primary Generator - runManager->set_userAction(new MyPrimaryGeneratorAction); - - // Optiolnal classes ----------------------- - // User Actions - runManager->set_userAction(new MyRunAction); - runManager->set_userAction(new MyEventAction); - runManager->set_userAction(new MyStackingAction); - runManager->set_userAction(new MyTrackingAction); - runManager->set_userAction(new MySteppingAction); - - - // Define (G)UI terminal for interactive mode - G4UIsession * session = new G4UIterminal; - - // User interactions - session->sessionStart(); - - // Termination - delete session; - delete runManager; - return 0; -} - - First of all, user must create the RunManager. The RunManager controles - run sequence by receiving messages from the user via UIsession. - The following are a part of commands for run controle; - /run/initialize * Initialize G4 kernel. - /run/beamOn * Start a Run. - /run/verbose * Set the verbose level of G4RunManager. - /run/abort * Abort current run processing. - For example, event loop will start by using "/run/beamOn" commands. - - In order to execute simulation, user must provide geometrical - configuration of his own detector. In addition information of - primary events must be given with a list of particle types and - processes for them. - - So, user must provide his own classes derived from the following - three abstract classes by implementing their pure virtual functions - and register those user classes to the RunManager. - - G4VUserDetectorConstruction - Detector Geometry, Materials - pure virtual functions - G4VPhysicalVolume* construct() - - construct detectors; - normally implemented to serve as the entry point - for the tree of methods describing solids, volumes, - materials and sensitive detectors. - - G4VUserPhysicsList - Particle types and Processes - pure virtual functions - void constructParticle() - - construct particles; - normally implemented to select desired particle types. - void constructPhysics() - - construct procesess; - normally implemented to select desired physics processes - for each particle types and register them to the ProcessManager. - void setCuts(G4double aValue) - - sets a cut value; - normally implemented to set cut value in range for all - particle types. - - G4VUserPrimaryGeneratorAction - Event Generator selection - pure virtual functions - void generatePrimaries(G4Event* anEvent) - - generate a event with primary particles - normally implemented to select the desired event generation - mechanism, such as the ParticleGun or the PYTHIA interface. - - In addition to the above mandatory classes, there are 5 user classes - to customize the default functionality of GEANT4 simulation. - - G4UserRunAction - Actions for each Run - G4UserEventAction - Actions for each Event - G4UserStackingAction - Tracks Stacking selection - G4UserTrackingAction - Actions for each Track - G4UserSteppingAction - Actions for each Step - - The virtual functions belonging to the classes above are: - - G4UserRunAction - void beginOfRunAction(G4Run*) - - void endOfRunAction(G4Run*) - - G4UserEventAction - void beginOfEventAction(G4Event*) - - void endOfEventAction(G4Event*) - - G4UserStackingAction - G4ClassificationOfNewTrack - classifyNewTrack(G4Track *const) - - void newStage() - - void prepareNewEvent() - - G4UserTrackingAction - void preUserTrackingAction() - - void postUserTrackingAction() - - G4UserSteppingAction - void userSteppingAction() - - Finally, more details can be found in the header files and in the source - code relative to the classes outlined above. - - - - - - diff --git a/source/run/include/G4RunManager.hh b/source/run/include/G4RunManager.hh index 7f1ef83ffc..f3d4e01fca 100644 --- a/source/run/include/G4RunManager.hh +++ b/source/run/include/G4RunManager.hh @@ -464,7 +464,7 @@ class G4RunManager inline void SetRandomNumberStoreDir(const G4String& dir) { G4String dirStr = dir; - if(dirStr(dirStr.length() - 1) != '/') + if(dirStr.back() != '/') dirStr += "/"; #ifndef WIN32 G4String shellCmd = "mkdir -p "; diff --git a/source/run/include/G4VUserPhysicsList.hh b/source/run/include/G4VUserPhysicsList.hh index f93a854887..61b688e500 100644 --- a/source/run/include/G4VUserPhysicsList.hh +++ b/source/run/include/G4VUserPhysicsList.hh @@ -51,6 +51,7 @@ #include "G4VUPLSplitter.hh" #include "G4Threading.hh" +#include "G4PhysicsModelCatalog.hh" class G4UserPhysicsListMessenger; class G4PhysicsListHelper; @@ -222,7 +223,11 @@ class G4VUserPhysicsList void RemoveProcessManager(); // Remove and delete ProcessManagers for all particles in the - // Particle Table. Function invoked from RunManager. + // Particle Table. + + void RemoveTrackingManager(); + // Remove and delete TrackingManagers for all particles in the + // Particle Table. void AddProcessManager(G4ParticleDefinition* newParticle, G4ProcessManager* newManager = nullptr); @@ -318,6 +323,8 @@ inline void G4VUserPhysicsList::Construct() G4cout << "G4VUserPhysicsList::Construct()" << G4endl; #endif + if ( G4Threading::IsMasterThread() ) G4PhysicsModelCatalog::Initialize(); + InitializeProcessManager(); #ifdef G4VERBOSE diff --git a/source/run/sources.cmake b/source/run/sources.cmake index 7d62b0fdd9..f6edb9230f 100644 --- a/source/run/sources.cmake +++ b/source/run/sources.cmake @@ -90,6 +90,7 @@ geant4_module_link_libraries(G4run G4emutils G4geometrymng G4graphics_reps + G4hadronic_mgt G4hadronic_util G4hepnumerics G4hits @@ -97,6 +98,7 @@ geant4_module_link_libraries(G4run G4magneticfield G4materials G4navigation + G4optical G4procman G4scoring G4specsolids diff --git a/source/run/src/G4AdjointSimManager.cc b/source/run/src/G4AdjointSimManager.cc index 69d19e8b02..6d89524e2e 100644 --- a/source/run/src/G4AdjointSimManager.cc +++ b/source/run/src/G4AdjointSimManager.cc @@ -480,7 +480,7 @@ void G4AdjointSimManager::RegisterAtEndOfAdjointTrack() last_fwd_part_name = aPartDef->GetParticleName(); - last_fwd_part_name.remove(0, 4); + last_fwd_part_name.erase(0, 4); last_fwd_part_PDGEncoding = G4ParticleTable::GetParticleTable() ->FindParticle(last_fwd_part_name) diff --git a/source/run/src/G4PhysicsListHelper.cc b/source/run/src/G4PhysicsListHelper.cc index bd6046a1ae..1244883b9a 100644 --- a/source/run/src/G4PhysicsListHelper.cc +++ b/source/run/src/G4PhysicsListHelper.cc @@ -45,6 +45,15 @@ #include "G4ProcessManager.hh" +#include "G4ProcessType.hh" +#include "G4TransportationProcessType.hh" +#include "G4DecayProcessType.hh" +#include "G4EmProcessSubType.hh" +#include "G4LowEnergyEmProcessSubType.hh" +#include "G4OpProcessSubType.hh" +#include "G4HadronicProcessType.hh" + + G4ThreadLocal G4PhysicsListHelper* G4PhysicsListHelper::pPLHelper = nullptr; // -------------------------------------------------------------------- @@ -622,9 +631,12 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() { G4PhysicsListOrderingParameter tmp; + // NOTE: please use enum values, rather than numerical values, + // for both the processType and processSubType below. + tmp.processTypeName = "Transportation"; - tmp.processType = 1; - tmp.processSubType = 91; + tmp.processType = fTransportation; + tmp.processSubType = TRANSPORTATION; tmp.ordering[0] = -1; tmp.ordering[1] = 0; tmp.ordering[2] = 0; @@ -633,8 +645,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "CoupleTrans"; - tmp.processType = 1; - tmp.processSubType = 92; + tmp.processType = fTransportation; + tmp.processSubType = COUPLED_TRANSPORTATION; tmp.ordering[0] = -1; tmp.ordering[1] = 0; tmp.ordering[2] = 0; @@ -643,8 +655,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "CoulombScat"; - tmp.processType = 2; - tmp.processSubType = 1; + tmp.processType = fElectromagnetic; + tmp.processSubType = fCoulombScattering; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -653,8 +665,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Ionisation"; - tmp.processType = 2; - tmp.processSubType = 2; + tmp.processType = fElectromagnetic; + tmp.processSubType = fIonisation; tmp.ordering[0] = -1; tmp.ordering[1] = 2; tmp.ordering[2] = 2; @@ -663,8 +675,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Brems"; - tmp.processType = 2; - tmp.processSubType = 3; + tmp.processType = fElectromagnetic; + tmp.processSubType = fBremsstrahlung; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 3; @@ -673,8 +685,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "PairProdCharged"; - tmp.processType = 2; - tmp.processSubType = 4; + tmp.processType = fElectromagnetic; + tmp.processSubType = fPairProdByCharged; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 4; @@ -683,8 +695,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Annih"; - tmp.processType = 2; - tmp.processSubType = 5; + tmp.processType = fElectromagnetic; + tmp.processSubType = fAnnihilation; tmp.ordering[0] = 5; tmp.ordering[1] = -1; tmp.ordering[2] = 5; @@ -693,8 +705,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "AnnihToMuMu"; - tmp.processType = 2; - tmp.processSubType = 6; + tmp.processType = fElectromagnetic; + tmp.processSubType = fAnnihilationToMuMu; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 6; @@ -703,8 +715,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "AnnihToHad"; - tmp.processType = 2; - tmp.processSubType = 7; + tmp.processType = fElectromagnetic; + tmp.processSubType = fAnnihilationToHadrons; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 7; @@ -713,8 +725,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "NuclearStopp"; - tmp.processType = 2; - tmp.processSubType = 8; + tmp.processType = fElectromagnetic; + tmp.processSubType = fNuclearStopping; tmp.ordering[0] = -1; tmp.ordering[1] = 8; tmp.ordering[2] = -1; @@ -723,8 +735,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "ElectronSuper"; - tmp.processType = 2; - tmp.processSubType = 9; + tmp.processType = fElectromagnetic; + tmp.processSubType = fElectronGeneralProcess; tmp.ordering[0] = -1; tmp.ordering[1] = 1; tmp.ordering[2] = 1; @@ -733,8 +745,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Msc"; - tmp.processType = 2; - tmp.processSubType = 10; + tmp.processType = fElectromagnetic; + tmp.processSubType = fMultipleScattering; tmp.ordering[0] = -1; tmp.ordering[1] = 1; tmp.ordering[2] = -1; @@ -743,8 +755,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Rayleigh"; - tmp.processType = 2; - tmp.processSubType = 11; + tmp.processType = fElectromagnetic; + tmp.processSubType = fRayleigh; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -753,8 +765,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "PhotoElectric"; - tmp.processType = 2; - tmp.processSubType = 12; + tmp.processType = fElectromagnetic; + tmp.processSubType = fPhotoElectricEffect; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -763,8 +775,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Compton"; - tmp.processType = 2; - tmp.processSubType = 13; + tmp.processType = fElectromagnetic; + tmp.processSubType = fComptonScattering; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -773,8 +785,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Conv"; - tmp.processType = 2; - tmp.processSubType = 14; + tmp.processType = fElectromagnetic; + tmp.processSubType = fGammaConversion; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -783,8 +795,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "ConvToMuMu"; - tmp.processType = 2; - tmp.processSubType = 15; + tmp.processType = fElectromagnetic; + tmp.processSubType = fGammaConversionToMuMu; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -793,8 +805,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "GammaSuper"; - tmp.processType = 2; - tmp.processSubType = 16; + tmp.processType = fElectromagnetic; + tmp.processSubType = fGammaGeneralProcess; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -803,8 +815,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "PositronSuper"; - tmp.processType = 2; - tmp.processSubType = 17; + tmp.processType = fElectromagnetic; + tmp.processSubType = fPositronGeneralProcess; tmp.ordering[0] = 1; tmp.ordering[1] = 1; tmp.ordering[2] = 1; @@ -813,8 +825,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Cerenkov"; - tmp.processType = 2; - tmp.processSubType = 21; + tmp.processType = fElectromagnetic; + tmp.processSubType = fCerenkov; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -823,8 +835,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Scintillation"; - tmp.processType = 2; - tmp.processSubType = 22; + tmp.processType = fElectromagnetic; + tmp.processSubType = fScintillation; tmp.ordering[0] = 9999; tmp.ordering[1] = -1; tmp.ordering[2] = 9999; @@ -833,8 +845,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "SynchRad"; - tmp.processType = 2; - tmp.processSubType = 23; + tmp.processType = fElectromagnetic; + tmp.processSubType = fSynchrotronRadiation; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -843,8 +855,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "TransRad"; - tmp.processType = 2; - tmp.processSubType = 24; + tmp.processType = fElectromagnetic; + tmp.processSubType = fTransitionRadiation; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -853,8 +865,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "SurfaceRefl"; - tmp.processType = 2; - tmp.processSubType = 25; + tmp.processType = fElectromagnetic; + tmp.processSubType = fSurfaceReflection; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -863,8 +875,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "OpAbsorb"; - tmp.processType = 3; - tmp.processSubType = 31; + tmp.processType = fOptical; + tmp.processSubType = fOpAbsorption; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -873,8 +885,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "OpBoundary"; - tmp.processType = 3; - tmp.processSubType = 32; + tmp.processType = fOptical; + tmp.processSubType = fOpBoundary; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -883,8 +895,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "OpRayleigh"; - tmp.processType = 3; - tmp.processSubType = 33; + tmp.processType = fOptical; + tmp.processSubType = fOpRayleigh; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -893,8 +905,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "OpWLS"; - tmp.processType = 3; - tmp.processSubType = 34; + tmp.processType = fOptical; + tmp.processSubType = fOpWLS; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -903,8 +915,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "OpMieHG"; - tmp.processType = 3; - tmp.processSubType = 35; + tmp.processType = fOptical; + tmp.processSubType = fOpMieHG; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -913,8 +925,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "OpWLS2"; - tmp.processType = 3; - tmp.processSubType = 36; + tmp.processType = fOptical; + tmp.processSubType = fOpWLS2; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -923,8 +935,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAElastic"; - tmp.processType = 2; - tmp.processSubType = 51; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyElastic; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -933,8 +945,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAExcit"; - tmp.processType = 2; - tmp.processSubType = 52; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyExcitation; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -943,8 +955,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAIonisation"; - tmp.processType = 2; - tmp.processSubType = 53; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyIonisation; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -953,8 +965,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAVibExcit"; - tmp.processType = 2; - tmp.processSubType = 54; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyVibrationalExcitation; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -963,8 +975,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAAttachment"; - tmp.processType = 2; - tmp.processSubType = 55; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyAttachment; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -973,8 +985,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAChargeDec"; - tmp.processType = 2; - tmp.processSubType = 56; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyChargeDecrease; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -983,8 +995,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAChargeInc"; - tmp.processType = 2; - tmp.processSubType = 57; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyChargeIncrease; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -993,8 +1005,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAElecSolv"; - tmp.processType = 2; - tmp.processSubType = 58; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyElectronSolvation; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1003,8 +1015,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAMolecDecay"; - tmp.processType = 6; - tmp.processSubType = 59; + tmp.processType = fDecay; + tmp.processSubType = fLowEnergyMolecularDecay; tmp.ordering[0] = 1000; tmp.ordering[1] = -1; tmp.ordering[2] = -1; @@ -1013,8 +1025,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "ITTransport"; - tmp.processType = 1; - tmp.processSubType = 60; + tmp.processType = fTransportation; + tmp.processSubType = fLowEnergyTransportation; tmp.ordering[0] = -1; tmp.ordering[1] = 0; tmp.ordering[2] = 0; @@ -1023,8 +1035,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNABrownTrans"; - tmp.processType = 1; - tmp.processSubType = 61; + tmp.processType = fTransportation; + tmp.processSubType = fLowEnergyBrownianTransportation; tmp.ordering[0] = -1; tmp.ordering[1] = 0; tmp.ordering[2] = 0; @@ -1033,8 +1045,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNADoubleIoni"; - tmp.processType = 2; - tmp.processSubType = 62; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyDoubleIonisation; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1043,8 +1055,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNADoubleCap"; - tmp.processType = 2; - tmp.processSubType = 63; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyDoubleCap; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1053,8 +1065,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAIoniTransfer"; - tmp.processType = 2; - tmp.processSubType = 64; + tmp.processType = fElectromagnetic; + tmp.processSubType = fLowEnergyIoniTransfer; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1063,8 +1075,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DNAStaticMol"; - tmp.processType = 9; - tmp.processSubType = 65; + tmp.processType = fUserDefined; + tmp.processSubType = fLowEnergyStaticMol; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1073,8 +1085,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable +=1; tmp.processTypeName = "HadElastic"; - tmp.processType = 4; - tmp.processSubType = 111; + tmp.processType = fHadronic; + tmp.processSubType = fHadronElastic; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1083,8 +1095,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "HadInelastic"; - tmp.processType = 4; - tmp.processSubType = 121; + tmp.processType = fHadronic; + tmp.processSubType = fHadronInelastic; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1093,8 +1105,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "HadCapture"; - tmp.processType = 4; - tmp.processSubType = 131; + tmp.processType = fHadronic; + tmp.processSubType = fCapture; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1103,8 +1115,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "MuAtomCapture"; - tmp.processType = 4; - tmp.processSubType = 132; + tmp.processType = fHadronic; + tmp.processSubType = fMuAtomicCapture; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1113,8 +1125,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "HadFission"; - tmp.processType = 4; - tmp.processSubType = 141; + tmp.processType = fHadronic; + tmp.processSubType = fFission; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1123,8 +1135,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "HadAtRest"; - tmp.processType = 4; - tmp.processSubType = 151; + tmp.processType = fHadronic; + tmp.processSubType = fHadronAtRest; tmp.ordering[0] = 1000; tmp.ordering[1] = -1; tmp.ordering[2] = -1; @@ -1133,8 +1145,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "HadCEX"; - tmp.processType = 4; - tmp.processSubType = 161; + tmp.processType = fHadronic; + tmp.processSubType = fChargeExchange; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1143,8 +1155,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "Decay"; - tmp.processType = 6; - tmp.processSubType = 201; + tmp.processType = fDecay; + tmp.processSubType = DECAY; tmp.ordering[0] = 1000; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1153,8 +1165,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DecayWSpin"; - tmp.processType = 6; - tmp.processSubType = 202; + tmp.processType = fDecay; + tmp.processSubType = DECAY_WithSpin; tmp.ordering[0] = 1000; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1163,8 +1175,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DecayPiSpin"; - tmp.processType = 6; - tmp.processSubType = 203; + tmp.processType = fDecay; + tmp.processSubType = DECAY_PionMakeSpin; tmp.ordering[0] = 1000; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1173,8 +1185,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DecayRadio"; - tmp.processType = 6; - tmp.processSubType = 210; + tmp.processType = fDecay; + tmp.processSubType = DECAY_Radioactive; tmp.ordering[0] = 1000; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1183,8 +1195,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DecayUnKnown"; - tmp.processType = 6; - tmp.processSubType = 211; + tmp.processType = fDecay; + tmp.processSubType = DECAY_Unknown; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1193,8 +1205,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DecayMuAtom"; - tmp.processType = 6; - tmp.processSubType = 221; + tmp.processType = fDecay; + tmp.processSubType = DECAY_MuAtom; tmp.ordering[0] = 1000; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1203,8 +1215,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "DecayExt"; - tmp.processType = 6; - tmp.processSubType = 231; + tmp.processType = fDecay; + tmp.processSubType = DECAY_External; tmp.ordering[0] = 1000; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1213,8 +1225,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "StepLimiter"; - tmp.processType = 7; - tmp.processSubType = 401; + tmp.processType = fGeneral; + tmp.processSubType = STEP_LIMITER; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1223,8 +1235,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "UsrSepcCuts"; - tmp.processType = 7; - tmp.processSubType = 402; + tmp.processType = fGeneral; + tmp.processSubType = USER_SPECIAL_CUTS; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1233,8 +1245,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "NeutronKiller"; - tmp.processType = 7; - tmp.processSubType = 403; + tmp.processType = fGeneral; + tmp.processSubType = NEUTRON_KILLER; tmp.ordering[0] = -1; tmp.ordering[1] = -1; tmp.ordering[2] = 1000; @@ -1243,8 +1255,8 @@ void G4PhysicsListHelper::ReadInDefaultOrderingParameter() sizeOfTable += 1; tmp.processTypeName = "ParallelWorld"; - tmp.processType = 10; - tmp.processSubType = 491; + tmp.processType = fParallel; + tmp.processSubType = PARALLEL_WORLD_PROCESS; tmp.ordering[0] = 9900; tmp.ordering[1] = 1; tmp.ordering[2] = 9900; diff --git a/source/run/src/G4RunManager.cc b/source/run/src/G4RunManager.cc index ef24d59849..567ee88988 100644 --- a/source/run/src/G4RunManager.cc +++ b/source/run/src/G4RunManager.cc @@ -870,7 +870,7 @@ void G4RunManager::rndmSaveThisEvent() void G4RunManager::RestoreRandomNumberStatus(const G4String& fileN) { G4String fileNameWithDirectory; - if(fileN.index("/") == std::string::npos) + if(fileN.find("/") == std::string::npos) { fileNameWithDirectory = randomNumberStatusDir + fileN; } diff --git a/source/run/src/G4RunMessenger.cc b/source/run/src/G4RunMessenger.cc index 1cc25e8f19..cdc6ddbc7a 100644 --- a/source/run/src/G4RunMessenger.cc +++ b/source/run/src/G4RunMessenger.cc @@ -620,7 +620,7 @@ void G4RunMessenger::SetNewValue(G4UIcommand* command, G4String newValue) G4int idx = 0; G4long seeds[100]; G4String vl; - while(!(vl = next()).isNull()) + while(!(vl = next()).empty()) { seeds[idx] = StoL(vl); ++idx; diff --git a/source/run/src/G4UserWorkerThreadInitialization.cc b/source/run/src/G4UserWorkerThreadInitialization.cc index 0c2b076d0a..f76c5a915a 100644 --- a/source/run/src/G4UserWorkerThreadInitialization.cc +++ b/source/run/src/G4UserWorkerThreadInitialization.cc @@ -117,6 +117,10 @@ SetupRNGEngine(const CLHEP::HepRandomEngine* aNewRNG) const { retRNG = new CLHEP::RanecuEngine; } + if(dynamic_cast(aNewRNG)) + { + retRNG = new CLHEP::RanluxppEngine; + } if(dynamic_cast(aNewRNG)) { const CLHEP::Ranlux64Engine* theRNG = @@ -152,7 +156,7 @@ SetupRNGEngine(const CLHEP::HepRandomEngine* aNewRNG) const G4ExceptionDescription msg; msg << " Unknown type of RNG Engine - " << G4endl << " Can cope only with HepJamesRandom, MixMaxRng, Ranecu, Ranlux64," - << " MTwistEngine, DualRand, Ranlux or Ranshi." << G4endl + << " Ranlux++, MTwistEngine, DualRand, Ranlux or Ranshi." << G4endl << " Cannot clone this type of RNG engine, as required for this thread" << G4endl << " Aborting " << G4endl; G4Exception("G4UserWorkerThreadInitialization::SetupRNGEngine()", diff --git a/source/run/src/G4VModularPhysicsList.cc b/source/run/src/G4VModularPhysicsList.cc index a2b661901e..bec4b16779 100644 --- a/source/run/src/G4VModularPhysicsList.cc +++ b/source/run/src/G4VModularPhysicsList.cc @@ -56,13 +56,12 @@ G4VModularPhysicsList::G4VModularPhysicsList() // -------------------------------------------------------------------- G4VModularPhysicsList::~G4VModularPhysicsList() { - for(auto itr = G4MT_physicsVector->cbegin(); - itr != G4MT_physicsVector->cend(); ++itr) - { - delete(*itr); + if(G4MT_physicsVector != nullptr) + { + for(auto & ptr : *G4MT_physicsVector) { delete ptr; } + delete G4MT_physicsVector; + G4MT_physicsVector = nullptr; } - G4MT_physicsVector->clear(); - delete G4MT_physicsVector; } // -------------------------------------------------------------------- @@ -70,6 +69,7 @@ G4VModularPhysicsList::G4VModularPhysicsList(const G4VModularPhysicsList& right) : G4VUserPhysicsList(right) { g4vmplInstanceID = G4VMPLsubInstanceManager.CreateSubInstance(); + G4MT_physicsVector = nullptr; } // -------------------------------------------------------------------- @@ -99,14 +99,10 @@ G4VModularPhysicsList& G4VModularPhysicsList::operator=( verboseLevel = right.verboseLevel; if(G4MT_physicsVector != nullptr) - { - for(auto itr = G4MT_physicsVector->cbegin(); - itr != G4MT_physicsVector->cend(); ++itr) - { - delete(*itr); - } - G4MT_physicsVector->clear(); + { + for(auto & ptr : *G4MT_physicsVector) { delete ptr; } delete G4MT_physicsVector; + G4MT_physicsVector = nullptr; } g4vmplInstanceID = G4VMPLsubInstanceManager.CreateSubInstance(); } diff --git a/source/run/src/G4VUserPhysicsList.cc b/source/run/src/G4VUserPhysicsList.cc index 2d262e2e65..cd3353949b 100644 --- a/source/run/src/G4VUserPhysicsList.cc +++ b/source/run/src/G4VUserPhysicsList.cc @@ -28,15 +28,9 @@ // Original author: H.Kurashige (Kobe University), 9 January 1998 // -------------------------------------------------------------------- -#include -#include - #include "G4PhysicsListHelper.hh" #include "G4VUserPhysicsList.hh" -#include "G4VEnergyLossProcess.hh" -#include "G4VMultipleScattering.hh" - #include "G4Material.hh" #include "G4MaterialCutsCouple.hh" #include "G4ParticleDefinition.hh" @@ -50,9 +44,14 @@ #include "G4UImanager.hh" #include "G4UnitsTable.hh" #include "G4UserPhysicsListMessenger.hh" +#include "G4VTrackingManager.hh" #include "G4ios.hh" #include "globals.hh" +#include +#include +#include + // This static member is thread local. For each thread, it holds the array // size of G4VUPLData instances. // @@ -127,6 +126,7 @@ void G4VUserPhysicsList::InitializeWorker() void G4VUserPhysicsList::TerminateWorker() { RemoveProcessManager(); + RemoveTrackingManager(); delete G4MT_theMessenger; G4MT_theMessenger = nullptr; } @@ -138,6 +138,7 @@ G4VUserPhysicsList::~G4VUserPhysicsList() G4MT_theMessenger = nullptr; RemoveProcessManager(); + RemoveTrackingManager(); // invoke DeleteAllParticle theParticleTable->DeleteAllParticles(); @@ -321,6 +322,39 @@ void G4VUserPhysicsList::RemoveProcessManager() #endif } +// -------------------------------------------------------------------- +void G4VUserPhysicsList::RemoveTrackingManager() +{ + // One tracking manager may be registered for multiple particles, make sure + // to delete every object only once. + std::unordered_set trackingManagers; + + // loop over all particles in G4ParticleTable + theParticleIterator->reset(); + while((*theParticleIterator)()) + { + G4ParticleDefinition* particle = theParticleIterator->value(); + if (auto *trackingManager = particle->GetTrackingManager()) + { +#ifdef G4VERBOSE + if(verboseLevel > 2) + { + G4cout << "G4VUserPhysicsList::RemoveTrackingManager: "; + G4cout << "remove TrackingManager from "; + G4cout << particle->GetParticleName() << G4endl; + } +#endif + trackingManagers.insert(trackingManager); + particle->SetTrackingManager(nullptr); + } + } + + for (G4VTrackingManager *tm : trackingManagers) + { + delete tm; + } +} + // -------------------------------------------------------------------- void G4VUserPhysicsList::SetCuts() { @@ -609,6 +643,18 @@ void G4VUserPhysicsList::BuildPhysicsTable() // -------------------------------------------------------------------- void G4VUserPhysicsList::BuildPhysicsTable(G4ParticleDefinition* particle) { + if (auto *trackingManager = particle->GetTrackingManager()) + { + if(verboseLevel > 2) + { + G4cout << "G4VUserPhysicsList::BuildPhysicsTable " + << "Calculate Physics Table for " << particle->GetParticleName() + << " via custom TrackingManager" << G4endl; + } + trackingManager->BuildPhysicsTable(*particle); + return; + } + // Change in order to share physics tables for two kind of process. if(particle->GetMasterProcessManager() == nullptr) @@ -741,6 +787,12 @@ void G4VUserPhysicsList::BuildPhysicsTable(G4ParticleDefinition* particle) // -------------------------------------------------------------------- void G4VUserPhysicsList::PreparePhysicsTable(G4ParticleDefinition* particle) { + if (auto *trackingManager = particle->GetTrackingManager()) + { + trackingManager->PreparePhysicsTable(*particle); + return; + } + if(!(particle->GetMasterProcessManager())) { return; @@ -875,7 +927,7 @@ G4bool G4VUserPhysicsList::StorePhysicsTable(const G4String& directory) { G4bool ascii = fStoredInAscii; G4String dir = directory; - if(dir.isNull()) + if(dir.empty()) dir = directoryPhysicsTable; else directoryPhysicsTable = dir; @@ -927,7 +979,7 @@ G4bool G4VUserPhysicsList::StorePhysicsTable(const G4String& directory) void G4VUserPhysicsList::SetPhysicsTableRetrieved(const G4String& directory) { fRetrievePhysicsTable = true; - if(!directory.isNull()) + if(!directory.empty()) { directoryPhysicsTable = directory; } diff --git a/source/tasking/History b/source/tasking/History index 4580f9411a..689c828d2f 100644 --- a/source/tasking/History +++ b/source/tasking/History @@ -16,6 +16,10 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +September 10th, 2021 Gabriele Cosmo (tasking-V10-07-06) +- Added new Ranlux++ engine to the list of supported random engines in + G4UserTaskThreadInitialization. Requires CLHEP-2.4.5.1. + June 6th, 2021 Jonathan Madsen (tasking-V10-07-05) - Check for valid threadPool pointer in G4TaskRunManager::RequestWorkersProcessCommandsStack() diff --git a/source/tasking/README.md b/source/tasking/README.md deleted file mode 100644 index e06b9860bc..0000000000 --- a/source/tasking/README.md +++ /dev/null @@ -1,226 +0,0 @@ -# Geant4 Tasking - -This directory contains a Geant4 run manager which uses a tasking system for the G4Event loop. -This tasking system is fully compatible with TBB if `GEANT4_USE_TBB=ON` is specified when -configuring CMake. The default behavior, however, is to submit the tasks to an internal -thread-pool and task-queue. - -## G4TaskRunManager - -`G4TaskRunManager` multiply inherits from `G4MTRunManager` and `PTL::TaskRunManager`. -`PTL::TaskRunManager` holds the thread-pool instance, the size of the thread-pool, -and the default task-queue. The constructor of `G4TaskRunManager` takes a `G4VUserTaskQueue` -pointer (can be nullptr), a boolean for whether to use TBB if available, and a grainsize. - -### Concepts - -#### Grainsize - -> Environment Variable: `G4FORCE_GRAINSIZE=N` - -The grainsize is essentially the number of tasks. If set to 0, the default grainsize -will be `poolSize` and each thread will get `numEvents / poolSize` events. -If the grainsize is set to 1, then _all the events_ will be submitted as one task (i.e. be -processed serially by one thread in the pool). If the grainsize is set to 50 and there are 500 events, -then 50 tasks of 10 events will be submitted. - -#### Events Per Tasks - -> Environment Variable: `G4FORCE_EVENTS_PER_TASK=N` - -Sometimes is easier to specify the number of events in a task instead of the grainsize. -If the events-per-task is set to 10 and there are 500 events, -then 50 tasks of 10 events will be submitted. - -### Default Constructor - -```cpp - G4TaskRunManager(G4VUserTaskQueue* = nullptr, bool useTBB = false, G4int grainsize = 0); -``` - -## G4RunManagerFactory - -An enumeration `G4RunManagerType` and a function `G4RunManagerFactory::CreateRunManager(...)` -was added to `"G4RunManagerFactory.hh"` to simplify the selection of the various run managers. -The first parameter is either one of the enumerated `G4RunManagerType` or a string identifier - -| Enumeration | String ID | Class | -| ------------------------------- | ----------- | ------------------- | -| `G4RunManagerType::Serial` | `"Serial"` | `G4RunManager` | -| `G4RunManagerType::MT` | `"MT"` | `G4MTRunManager` | -| `G4RunManagerType::Tasking` | `"Tasking"` | `G4TaskRunManager` | -| `G4RunManagerType::TBB` | `"TBB"` | `G4TaskRunManager` | -| `G4RunManagerType::Default` | `"Default"` | Environment setting | -| `G4RunManagerType::SerialOnly` | `"Serial"` | `G4RunManager` | -| `G4RunManagerType::MTOnly` | `"MT"` | `G4MTRunManager` | -| `G4RunManagerType::TaskingOnly` | `"Tasking"` | `G4TaskRunManager` | -| `G4RunManagerType::TBBOnly` | `"TBB"` | `G4TaskRunManager` | - - -The `Default` enumeration value will defer to the following environment variable `G4RUN_MANAGER_TYPE` -if specified and will default to `"MT"` if MT is supported and serial if MT is not supported. -If the `G4FORCE_RUN_MANAGER_TYPE` environment variable is set, this variable will override the -value passed to the `CreateRunManager` function unless `G4RunManagerType` matches one of the `Only` -values. In this case, the environment variable is ignored and the run manager will be ``. - -| Environment Variable | Options | Description | -| -------------------------- | ---------------------------------------- | -------------------------------------------------------------------------------------- | -| `G4RUN_MANAGER_TYPE` | `"Serial"`, `"MT"`, `"Tasking"`, `"TBB"` | Only applicable when `G4RunManagerType::Default` is used | -| `G4FORCE_RUN_MANAGER_TYPE` | `"Serial"`, `"MT"`, `"Tasking"`, `"TBB"` | Will override explicitly specifed `G4RunManagerType` if application allows and fail if type is not available | - -## Creating the G4RunManager - -- The `G4RunManagerFactory::CreateRunManager(...)` function takes either `G4RunManagerType` enumerated type or string to specify the desired G4RunManager - - If a string is used, regex matching is used which is case-insensitive - - Returns a `G4RunManager*` - - Various overloads exist which just reorder passing in: - - `int numberOfThreads` - executes `G4MTRunManager::SetNumberOfThreads(numberOfThreads)` before returning if > 0 - - default: `0` - - `bool fail_if_unavail` - will cause a runtime failure if requested type is not available with Geant4 build - - default: `true` - - `G4VTaskQueue*` - a task-queue manager - - default: `nullptr` - -```cpp -#include "G4RunManagerFactory.hh" - -int main() -{ - // specify {Serial, MT, Tasking, TBB} as the default, can be overridden - // with "G4FORCE_RUN_MANAGER_TYPE" env variable - auto* runmanager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Serial); - auto* runmanager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::MT); - auto* runmanager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Tasking); - auto* runmanager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::TBB); - - // specify {Serial, MT, Tasking, TBB} as the required type, cannot be overridden - // with "G4FORCE_RUN_MANAGER_TYPE" env variable - auto* runmanager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::SerialOnly); - auto* runmanager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::MTOnly); - auto* runmanager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::TaskingOnly); - auto* runmanager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::TBBOnly); - - // defer to "G4RUN_MANAGER_TYPE" env variable and default to MT if - // env variable is not set - auto* runmanager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default); - - // same as above - auto* runmanager = G4RunManagerFactory::CreateRunManager(); -} -``` - -## Using the Tasking System - -With G4TaskRunManager, Geant4 events will be launched asynchronously as tasks. These tasks are -placed into a queue until one of the thread in the pool is available to execute the task. Users can -take advantage of this system to load-balance expensive sub-event calculations which might have -previously resulted in serial bottlenecks. For example, if an application needs to do extensive event -analysis on electrons and thread #1 ends up with 10x as many of these events, the other threads -might finish their G4Run significantly eariler and be idle while thread #1 has a lot of work. -Tasking allows these analysis calculations to be offload back into the queue so that other -threads can contribute to their completion. - -### Option 1 - Submit Directly to Thread-Pool - -- To execute the function `foo(int, double)` asynchronously: - -```cpp -// get the task manager -auto* task_manager = G4TaskRunManager::GetTaskManager(); - -// submit task to thread-pool and receive a future for when the result is need -std::future _fvoid = task_manager->async(foo, 1, 1.0); -std::future _fint = task_manager->async(bar, 1.0); - -// wait for task to execute -_fvoid.wait(); -_fint.wait(); - -// get the result (if non-void) -auto result = _fint.get(); -``` - -### Option 2 - Submit to task-group - -- Obtain a pointer to the thread-pool instance -- Create a `task_group` object where `T` is the return type of all the functions in the group - - If `T` is non-void, you must provide a join functor who return type and first argument are both references - to the joined type and the second argument is type `T`, e.g. `task_group` can provide a join functor - with `vector&` as the return type and `T` as the second argument or `int&` as the return and first argument - and `int` as the second argument - - If `T` is void, the join functor is optional and can be treated as a final synchronization operation after - all the tasks have been completed. - -> NOTE: The join functor for task-groups are called sequentially on the thread that is -> waiting on `task_group::join()` member function. - -#### Global Definitions for Examples - -```cpp -// obtain thread-pool instance from task manager -static auto* thread_pool = G4TaskRunManager::GetThreadPool(); - -// trivial int function which just returns value passed -int foo(int v) { return v; } - -// function which launches CUDA kernel -void bar(int v) -{ - cuda_bar<<<512, 1>>>(v); -} -``` - -#### Example with non-void return types from tasks - -```cpp -// put all return values from tasks into an array -auto join_vec = [](std::vector& lhs, int rhs) { lhs.push_back(rhs); return lhs; }; - -// sum the values returned by tasks -auto sum_int = [](int& lhs, int rhs) { return lhs += rhs; }; - -// task group which applies 'join_vec' to all task return values -task_group vec_tg(join_vec, thread_pool); -// task group with applies 'sum_int' to all task return values -task_group sum_tg(sum_int, thread_pool); - -// submit work to task-groups -vec_tg.exec(foo, 1); -vec_tg.exec(foo, 2); -sum_tg.exec(foo, 1); -sum_tg.exec(foo, 2); - -// produces std::vector{ 1, 2 }; -auto vec_result = vec_tg.join(); - -// produces 1 + 2 = 3 -auto sum_result = sum_tg.join(); -``` - -#### Example with void return type from tasks - -```cpp -// wait for the GPU to finish -auto sync = []() { cudaDeviceSynchronize(); }; - -// task group which applies 'sync' after all tasks have been executed -task_group gpu_tg(sync, thread_pool); -// generic task group w/o a join functor -task_group general_tg(thread_pool); - -// submit work to task-groups -gpu_tg.exec(bar, 1); -gpu_tg.exec(bar, 2); -general_tg.exec(bar, 1); -general_tg.exec(bar, 2); - -// 'sync()' will get called after all tasks in group have executed -// (i.e. return from 'bar' function). 'sync' will then block until -// all GPU work has been completed -gpu_tg.join(); - -// will block only until all tasks in group have been executed -// (i.e. returned from 'bar' function) -generic_tg.join(); - -``` diff --git a/source/tasking/src/G4UserTaskThreadInitialization.cc b/source/tasking/src/G4UserTaskThreadInitialization.cc index f52bfae17c..31ea163111 100644 --- a/source/tasking/src/G4UserTaskThreadInitialization.cc +++ b/source/tasking/src/G4UserTaskThreadInitialization.cc @@ -92,6 +92,8 @@ void G4UserTaskThreadInitialization::SetupRNGEngine( retRNG = new CLHEP::RanecuEngine; if(dynamic_cast(aNewRNG)) retRNG = new CLHEP::Ranlux64Engine; + if(dynamic_cast(aNewRNG)) + retRNG = new CLHEP::RanluxppEngine; if(dynamic_cast(aNewRNG)) retRNG = new CLHEP::MTwistEngine; if(dynamic_cast(aNewRNG)) @@ -109,7 +111,7 @@ void G4UserTaskThreadInitialization::SetupRNGEngine( G4ExceptionDescription msg; msg << " Unknown type of RNG Engine - " << G4endl << " Can cope only with HepJamesRandom, MixMaxRng, Ranecu, Ranlux64," - << " MTwistEngine, DualRand, Ranlux or Ranshi." << G4endl + << " Ranlux++, MTwistEngine, DualRand, Ranlux or Ranshi." << G4endl << " Cannot clone this type of RNG engine, as required for this thread" << G4endl << " Aborting... " << G4endl; G4Exception("G4UserTaskInitializition::SetupRNGEngine()", "Run0122", diff --git a/source/track/History b/source/track/History index 572494438b..52ec7dccf7 100644 --- a/source/track/History +++ b/source/track/History @@ -16,7 +16,19 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +- September 28, 2021 J. Hahnfeld (track-V10-07-06) +- G4ParticleChangeForMSC, G4ParticleChangeForTransport: Disable debugFlag + +- September 22, 2021 G. Amadio (track-V10-07-05) +- G4Step: avoid accessing G4Track data via long pointer chains. +- September 8, 2021 D. Sawkey (track-V10-07-04) +- G4Track: get material property using int (enum) rather than string + +- August 4, 2021 A. Ribon (track-V10-07-03) + G4Track : migrated to the new version of G4PhysicsModelCatalog. + - April 28, 2021 M. Maire (track-V10-07-02) G4VParticleChange::DumpInfo(), G4ParticleChange::DumpInfo(): adjust printout format diff --git a/source/track/include/G4Step.icc b/source/track/include/G4Step.icc index 39909dba57..52daa71d60 100644 --- a/source/track/include/G4Step.icc +++ b/source/track/include/G4Step.icc @@ -154,45 +154,53 @@ inline void G4Step::SetTrack(G4Track* value) inline void G4Step::InitializeStep(G4Track* aValue) { + fpTrack = aValue; + fpTrack->SetStepLength(0.); + // Initialize G4Step attributes fStepLength = 0.; fTotalEnergyDeposit = 0.; fNonIonizingEnergyDeposit = 0.; - fpTrack = aValue; - fpTrack->SetStepLength(0.); nSecondaryByLastStep = 0; // Initialize G4StepPoint attributes. // To avoid the circular dependency between G4Track, G4Step // and G4StepPoint, G4Step has to manage the copy actions. - fpPreStepPoint->SetPosition(fpTrack->GetPosition()); - fpPreStepPoint->SetGlobalTime(fpTrack->GetGlobalTime()); - fpPreStepPoint->SetLocalTime(fpTrack->GetLocalTime()); - fpPreStepPoint->SetProperTime(fpTrack->GetProperTime()); - fpPreStepPoint->SetMomentumDirection(fpTrack->GetMomentumDirection()); - fpPreStepPoint->SetKineticEnergy(fpTrack->GetKineticEnergy()); - fpPreStepPoint->SetTouchableHandle(fpTrack->GetTouchableHandle()); - fpPreStepPoint->SetMaterial( - fpTrack->GetTouchable()->GetVolume()->GetLogicalVolume()->GetMaterial()); - fpPreStepPoint->SetMaterialCutsCouple(fpTrack->GetTouchable() - ->GetVolume() - ->GetLogicalVolume() - ->GetMaterialCutsCouple()); - fpPreStepPoint->SetSensitiveDetector(fpTrack->GetTouchable() - ->GetVolume() - ->GetLogicalVolume() - ->GetSensitiveDetector()); - fpPreStepPoint->SetPolarization(fpTrack->GetPolarization()); - fpPreStepPoint->SetSafety(0.); - fpPreStepPoint->SetStepStatus(fUndefined); + // + fpPreStepPoint->SetSafety(0.0); fpPreStepPoint->SetProcessDefinedStep(0); - fpPreStepPoint->SetMass(fpTrack->GetDynamicParticle()->GetMass()); - fpPreStepPoint->SetCharge(fpTrack->GetDynamicParticle()->GetCharge()); - fpPreStepPoint->SetWeight(fpTrack->GetWeight()); + fpPreStepPoint->SetStepStatus(fUndefined); - // Set Velocity - // should be placed after SetMaterial for preStep point + // G4Track properties + + fpPreStepPoint->SetWeight(fpTrack->GetWeight()); + fpPreStepPoint->SetPosition(fpTrack->GetPosition()); + fpPreStepPoint->SetLocalTime(fpTrack->GetLocalTime()); + fpPreStepPoint->SetGlobalTime(fpTrack->GetGlobalTime()); + + // G4Track properties (via G4DynamicParticle) + + auto pParticle = fpTrack->GetDynamicParticle(); + + fpPreStepPoint->SetMass(pParticle->GetMass()); + fpPreStepPoint->SetCharge(pParticle->GetCharge()); + fpPreStepPoint->SetProperTime(pParticle->GetProperTime()); + fpPreStepPoint->SetKineticEnergy(pParticle->GetKineticEnergy()); + fpPreStepPoint->SetMomentumDirection(pParticle->GetMomentumDirection()); + fpPreStepPoint->SetPolarization(pParticle->GetPolarization()); + + // G4Track properties (via G4LogicalVolume) + + auto lvol = fpTrack->GetTouchable()->GetVolume()->GetLogicalVolume(); + + fpPreStepPoint->SetTouchableHandle(fpTrack->GetTouchableHandle()); + + fpPreStepPoint->SetMaterial(lvol->GetMaterial()); + fpPreStepPoint->SetMaterialCutsCouple(lvol->GetMaterialCutsCouple()); + fpPreStepPoint->SetSensitiveDetector(lvol->GetSensitiveDetector()); + + // SetVelocity() must be called after SetMaterial() for fpPreStepPoint. fpPreStepPoint->SetVelocity(fpTrack->CalculateVelocity()); (*fpPostStepPoint) = (*fpPreStepPoint); @@ -206,16 +214,16 @@ inline void G4Step::UpdateTrack() fpTrack->SetPosition(fpPostStepPoint->GetPosition()); fpTrack->SetGlobalTime(fpPostStepPoint->GetGlobalTime()); fpTrack->SetLocalTime(fpPostStepPoint->GetLocalTime()); - fpTrack->SetProperTime(fpPostStepPoint->GetProperTime()); - // energy, momentum, polarization - fpTrack->SetMomentumDirection(fpPostStepPoint->GetMomentumDirection()); - fpTrack->SetKineticEnergy(fpPostStepPoint->GetKineticEnergy()); - fpTrack->SetPolarization(fpPostStepPoint->GetPolarization()); - // mass charge + // mass, charge, proper time G4DynamicParticle* pParticle = (G4DynamicParticle*) (fpTrack->GetDynamicParticle()); pParticle->SetMass(fpPostStepPoint->GetMass()); pParticle->SetCharge(fpPostStepPoint->GetCharge()); + pParticle->SetProperTime(fpPostStepPoint->GetProperTime()); + // energy, momentum, polarization + pParticle->SetMomentumDirection(fpPostStepPoint->GetMomentumDirection()); + pParticle->SetKineticEnergy(fpPostStepPoint->GetKineticEnergy()); + pParticle->SetPolarization(fpPostStepPoint->GetPolarization()); // step length fpTrack->SetStepLength(fStepLength); // NextTouchable is updated diff --git a/source/track/include/G4Track.hh b/source/track/include/G4Track.hh index 02baf9f672..242c5efb8b 100644 --- a/source/track/include/G4Track.hh +++ b/source/track/include/G4Track.hh @@ -226,11 +226,14 @@ class G4Track const G4VProcess* GetCreatorProcess() const; void SetCreatorProcess(const G4VProcess* aValue); - inline void SetCreatorModelIndex(G4int idx); - - inline const G4String& GetCreatorModelName() const; - - inline G4int GetCreatorModelID() const; + inline void SetCreatorModelID(const G4int id); + inline G4int GetCreatorModelID() const; + inline G4int GetCreatorModelIndex() const; + inline const G4String GetCreatorModelName() const; + // Identification of the physics model that created the track: + // each of the three information (ID, index, name) is unique + // (the model ID and its name are supposed to be used in Geant4 + // code, whereas the index is meant for plotting in user code) G4double GetWeight() const; void SetWeight(G4double aValue); @@ -240,13 +243,13 @@ class G4Track void SetUserInformation(G4VUserTrackInformation* aValue) const; // User information - void SetAuxiliaryTrackInformation(G4int idx, + void SetAuxiliaryTrackInformation(G4int id, G4VAuxiliaryTrackInformation* info) const; - G4VAuxiliaryTrackInformation* GetAuxiliaryTrackInformation(G4int idx) const; + G4VAuxiliaryTrackInformation* GetAuxiliaryTrackInformation(G4int id) const; inline std::map* GetAuxiliaryTrackInformationMap() const; - void RemoveAuxiliaryTrackInformation(G4int idx); + void RemoveAuxiliaryTrackInformation(G4int id); void RemoveAuxiliaryTrackInformation(G4String& name); // Note: G4VAuxiliaryTrackInformation object itself is *NOT* deleted @@ -311,8 +314,8 @@ class G4Track G4int fCurrentStepNumber = 0; // Total steps number up to now - G4int fCreatorModelIndex = -1; - // Index of the physics model which created the track + G4int fCreatorModelID = -1; + // ID of the physics model which created the track G4int fParentID = 0; G4int fTrackID = 0; diff --git a/source/track/include/G4Track.icc b/source/track/include/G4Track.icc index 72c9fa5c4f..7a2dc07015 100644 --- a/source/track/include/G4Track.icc +++ b/source/track/include/G4Track.icc @@ -398,19 +398,24 @@ inline void G4Track::SetCreatorProcess(const G4VProcess* aValue) fpCreatorProcess = aValue; } -inline void G4Track::SetCreatorModelIndex(G4int idx) +inline void G4Track::SetCreatorModelID(const G4int id) { - fCreatorModelIndex = idx; -} - -inline const G4String& G4Track::GetCreatorModelName() const -{ - return G4PhysicsModelCatalog::GetModelName(fCreatorModelIndex); + fCreatorModelID = id; } inline G4int G4Track::GetCreatorModelID() const { - return fCreatorModelIndex; + return fCreatorModelID; +} + +inline G4int G4Track::GetCreatorModelIndex() const +{ + return G4PhysicsModelCatalog::GetModelIndex(fCreatorModelID); +} + +inline const G4String G4Track::GetCreatorModelName() const +{ + return G4PhysicsModelCatalog::GetModelNameFromID(fCreatorModelID); } // flag for "Below Threshold" diff --git a/source/track/src/G4ParticleChangeForGamma.cc b/source/track/src/G4ParticleChangeForGamma.cc index 42ecca2940..ae25286cab 100644 --- a/source/track/src/G4ParticleChangeForGamma.cc +++ b/source/track/src/G4ParticleChangeForGamma.cc @@ -41,6 +41,7 @@ G4ParticleChangeForGamma::G4ParticleChangeForGamma() : G4VParticleChange() { theSteppingControlFlag = NormalCondition; + // Disable flag that is enabled in G4VParticleChange if G4VERBOSE. debugFlag = false; } diff --git a/source/track/src/G4ParticleChangeForLoss.cc b/source/track/src/G4ParticleChangeForLoss.cc index 7041ae74f2..fb727f0d3f 100644 --- a/source/track/src/G4ParticleChangeForLoss.cc +++ b/source/track/src/G4ParticleChangeForLoss.cc @@ -42,6 +42,7 @@ G4ParticleChangeForLoss::G4ParticleChangeForLoss() , lowEnergyLimit(1.0 * eV) { theSteppingControlFlag = NormalCondition; + // Disable flag that is enabled in G4VParticleChange if G4VERBOSE. debugFlag = false; } diff --git a/source/track/src/G4ParticleChangeForMSC.cc b/source/track/src/G4ParticleChangeForMSC.cc index 098862eace..dc0ee4ba3c 100644 --- a/source/track/src/G4ParticleChangeForMSC.cc +++ b/source/track/src/G4ParticleChangeForMSC.cc @@ -40,6 +40,8 @@ G4ParticleChangeForMSC::G4ParticleChangeForMSC() : G4VParticleChange() { + // Disable flag that is enabled in G4VParticleChange if G4VERBOSE. + debugFlag = false; } // -------------------------------------------------------------------- diff --git a/source/track/src/G4ParticleChangeForTransport.cc b/source/track/src/G4ParticleChangeForTransport.cc index e784555f1a..d4dbe81b39 100644 --- a/source/track/src/G4ParticleChangeForTransport.cc +++ b/source/track/src/G4ParticleChangeForTransport.cc @@ -39,6 +39,8 @@ G4ParticleChangeForTransport::G4ParticleChangeForTransport() : G4ParticleChange() { + // Disable flag that is enabled in G4VParticleChange if G4VERBOSE. + debugFlag = false; } // -------------------------------------------------------------------- diff --git a/source/track/src/G4Track.cc b/source/track/src/G4Track.cc index 1e757ca31f..cf3757cd63 100644 --- a/source/track/src/G4Track.cc +++ b/source/track/src/G4Track.cc @@ -32,7 +32,6 @@ #include "G4Track.hh" #include "G4PhysicalConstants.hh" #include "G4VAuxiliaryTrackInformation.hh" -#include "G4PhysicsModelCatalog.hh" #include #include @@ -104,6 +103,9 @@ G4Track& G4Track::operator=(const G4Track& right) // CurrentStepNumber is set to be 0 fCurrentStepNumber = 0; + // Creator model ID + fCreatorModelID = right.fCreatorModelID; + // velocity information fVelocity = right.fVelocity; @@ -174,7 +176,7 @@ G4double G4Track::CalculateVelocityForOpticalPhoton() const { groupvel = nullptr; if(mat->GetMaterialPropertiesTable() != nullptr) - groupvel = mat->GetMaterialPropertiesTable()->GetProperty("GROUPVEL"); + groupvel = mat->GetMaterialPropertiesTable()->GetProperty(kGROUPVEL); update_groupvel = true; } prev_mat = mat; @@ -200,7 +202,7 @@ G4double G4Track::CalculateVelocityForOpticalPhoton() const } // -------------------------------------------------------------------- -void G4Track::SetAuxiliaryTrackInformation(G4int idx, +void G4Track::SetAuxiliaryTrackInformation(G4int id, G4VAuxiliaryTrackInformation* info) const { if(fpAuxiliaryTrackInformationMap == nullptr) @@ -208,23 +210,23 @@ void G4Track::SetAuxiliaryTrackInformation(G4int idx, fpAuxiliaryTrackInformationMap = new std::map; } - if(idx < 0 || idx >= G4PhysicsModelCatalog::Entries()) + if(G4PhysicsModelCatalog::GetModelIndex(id) < 0) { G4ExceptionDescription ED; - ED << "Process/model index <" << idx << "> is invalid."; + ED << "Process/model ID <" << id << "> is invalid."; G4Exception("G4VAuxiliaryTrackInformation::G4VAuxiliaryTrackInformation()", "TRACK0982", FatalException, ED); } - (*fpAuxiliaryTrackInformationMap)[idx] = info; + (*fpAuxiliaryTrackInformationMap)[id] = info; } // -------------------------------------------------------------------- G4VAuxiliaryTrackInformation* -G4Track::GetAuxiliaryTrackInformation(G4int idx) const +G4Track::GetAuxiliaryTrackInformation(G4int id) const { if(fpAuxiliaryTrackInformationMap == nullptr) return nullptr; - auto itr = fpAuxiliaryTrackInformationMap->find(idx); + auto itr = fpAuxiliaryTrackInformationMap->find(id); if(itr == fpAuxiliaryTrackInformationMap->cend()) return nullptr; else @@ -232,12 +234,12 @@ G4Track::GetAuxiliaryTrackInformation(G4int idx) const } // -------------------------------------------------------------------- -void G4Track::RemoveAuxiliaryTrackInformation(G4int idx) +void G4Track::RemoveAuxiliaryTrackInformation(G4int id) { - if(fpAuxiliaryTrackInformationMap != nullptr - && idx >= 0 && idx < G4PhysicsModelCatalog::Entries()) + if(fpAuxiliaryTrackInformationMap != nullptr && + fpAuxiliaryTrackInformationMap->find(id) != fpAuxiliaryTrackInformationMap->cend()) { - fpAuxiliaryTrackInformationMap->erase(idx); + fpAuxiliaryTrackInformationMap->erase(id); } } @@ -246,8 +248,8 @@ void G4Track::RemoveAuxiliaryTrackInformation(G4String& name) { if(fpAuxiliaryTrackInformationMap != nullptr) { - G4int idx = G4PhysicsModelCatalog::GetIndex(name); - RemoveAuxiliaryTrackInformation(idx); + G4int id = G4PhysicsModelCatalog::GetModelID(name); + RemoveAuxiliaryTrackInformation(id); } } diff --git a/source/track/src/G4VParticleChange.cc b/source/track/src/G4VParticleChange.cc index dea7204701..d545a08782 100644 --- a/source/track/src/G4VParticleChange.cc +++ b/source/track/src/G4VParticleChange.cc @@ -43,7 +43,7 @@ G4VParticleChange::G4VParticleChange() : theSizeOftheListOfSecondaries(G4TrackFastVectorSize) { #ifdef G4VERBOSE - // activate CHeckIt if in VERBOSE mode + // activate CheckIt if in VERBOSE mode debugFlag = true; #endif theListOfSecondaries = new G4TrackFastVector(); diff --git a/source/tracking/History b/source/tracking/History index 8bd1d9242e..fad2c04a5d 100644 --- a/source/tracking/History +++ b/source/tracking/History @@ -15,7 +15,41 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- - + +October 25, 2021 B.Morgan (tracking-V10-07-19) +- Use G4StrUtil functions replacing deprecated G4String member functions + +October 13, 2021 J. Hahnfeld (tracking-V10-07-18) +- Introduce G4VTrackingManager, an interface for custom tracking + managers specialized for one or a small number of particle types + +September 21, 2021 A. Ribon (tracking-V10-07-17) +- G4SteppingManager : Added a new, private member variable, corresponding + to a pointer to a G4NoProcess instance, and used it in the method + InvokeAtRestDoItProcs() to flag a stable ion at rest. + This avoids the otherwise confusing (but correct and harmless) + information that Radioactive Decay is the process defining the + last step of a stable ion at rest. + +August 13, 2021 M. Asai (tracking-V10-07-16) +- G4SteppingManager2.cc : Making sure Transportation limits the step + if a volume boundary in a parallel world is co-limiting the step. + Addressing to Bugzilla Report #2240. + +August 4, 2021 A. Ribon (tracking-V10-07-15) +- G4RichTrajectory : migrated to the new version of G4PhysicsModelCatalog. + +July 15, 2021 A. Ribon (tracking-V10-07-14) +- G4SteppingVerboseWithUnits.cc : forgotten corresponding fix + done below (tracking-V10-07-13) for G4SteppingVerbose. + +July 12, 2021 A. Ribon (tracking-V10-07-13) +- G4SteppingVerbose.cc : fixed bug that wrongly put the "Forced" + label in the print-out information of non-forced processes, + and vice versa, omitting it for real forced processes. + Obviously, simulation results were not impacted by this bug, + but the print-out was confusing and misleading. + June 21, 2021 M. Asai (tracking-V10-07-12) - G4SteppingVerbose.hh : add explicit virtual keyward to all virtual methods. diff --git a/source/tracking/include/G4SteppingManager.hh b/source/tracking/include/G4SteppingManager.hh index 355ffe3ee4..fb5242da85 100644 --- a/source/tracking/include/G4SteppingManager.hh +++ b/source/tracking/include/G4SteppingManager.hh @@ -53,6 +53,7 @@ #include "G4LogicalVolume.hh" // Include from 'geometry' #include "G4VPhysicalVolume.hh" // Include from 'geometry' #include "G4ProcessManager.hh" // Include from 'processes' +#include "G4NoProcess.hh" // Include from 'processes' #include "G4Track.hh" // Include from 'tracking' #include "G4TrackVector.hh" // Include from 'tracking' @@ -266,6 +267,10 @@ class G4SteppingManager // DefinePhysicalStepLength(). To pass these information to // the method Verbose, they are kept at here. Need a more // elegant mechanism. + + G4NoProcess const* fNoProcess = nullptr; + // Used in the InvokeAtRestDoItProcs() method to flag the process + // of any stable ion at rest. }; //******************************************************************* diff --git a/source/tracking/include/G4VTrackingManager.hh b/source/tracking/include/G4VTrackingManager.hh new file mode 100644 index 0000000000..823d01f03e --- /dev/null +++ b/source/tracking/include/G4VTrackingManager.hh @@ -0,0 +1,71 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// G4VTrackingManager +// +// Class description: +// +// Interface class for implementing a custom tracking manager that is +// specialized for stepping one or a small number of particle types. +// +// Original author: Jonas Hahnfeld, 2021 + +#ifndef G4VTrackingManager_hh +#define G4VTrackingManager_hh 1 + +class G4ParticleDefinition; +class G4Track; + +//////////////////////// +class G4VTrackingManager +//////////////////////// +{ + + public: + virtual ~G4VTrackingManager() {} + + virtual void BuildPhysicsTable(const G4ParticleDefinition&) {} + // Messaged by the Particle definition whenever cross-section tables have + // to be rebuilt (i.e. if new materials have been defined). + + virtual void PreparePhysicsTable(const G4ParticleDefinition&) {} + // Messaged by the Particle definition whenever cross-section tables have + // to be prepared for rebuild (i.e. if new materials have been defined). + + virtual void HandOverOneTrack(G4Track* aTrack) = 0; + // Invoking this function, a G4Track given by the argument will be + // handed over to this tracking manager. It may be tracked immediately + // or processing may be deferred to a later time, at the latest when + // calling FlushEvent(). + + virtual void FlushEvent() {} + // Signal that all tracks in the current event have been finished and + // this manager should process all tracks that may have been deferred. + // When called via this method, the tracking manager may stack new + // secondaries which will be tracked afterwards. + +}; + +#endif diff --git a/source/tracking/sources.cmake b/source/tracking/sources.cmake index dbd2bc3346..8bd69d236a 100644 --- a/source/tracking/sources.cmake +++ b/source/tracking/sources.cmake @@ -22,6 +22,7 @@ geant4_add_module(G4tracking G4UserTrackingAction.hh G4MultiTrackingAction.hh G4VSteppingVerbose.hh + G4VTrackingManager.hh G4VTrajectory.hh G4VTrajectoryPoint.hh trkgdefs.hh diff --git a/source/tracking/src/G4AdjointTrackingAction.cc b/source/tracking/src/G4AdjointTrackingAction.cc index 24269f20ac..0e95775f49 100644 --- a/source/tracking/src/G4AdjointTrackingAction.cc +++ b/source/tracking/src/G4AdjointTrackingAction.cc @@ -54,7 +54,7 @@ G4AdjointTrackingAction::~G4AdjointTrackingAction() void G4AdjointTrackingAction::PreUserTrackingAction(const G4Track* aTrack) { G4String partType = aTrack->GetParticleDefinition()->GetParticleType(); - if (partType.contains(G4String("adjoint"))) + if (G4StrUtil::contains(partType, "adjoint")) { is_adjoint_tracking_mode = true; theAdjointSteppingAction->SetPrimWeight(aTrack->GetWeight()); @@ -94,7 +94,7 @@ void G4AdjointTrackingAction::PostUserTrackingAction(const G4Track* aTrack) last_cos_th = last_direction.z(); G4ParticleDefinition* aPartDef= theAdjointSteppingAction->GetLastPartDef(); last_fwd_part_name= aPartDef->GetParticleName(); - last_fwd_part_name.remove(0,4); + last_fwd_part_name.erase(0,4); last_fwd_part_PDGEncoding=G4ParticleTable::GetParticleTable() ->FindParticle(last_fwd_part_name)->GetPDGEncoding(); last_ekin = theAdjointSteppingAction->GetLastEkin(); diff --git a/source/tracking/src/G4RichTrajectory.cc b/source/tracking/src/G4RichTrajectory.cc index 4fe05b7972..25fbf8a098 100644 --- a/source/tracking/src/G4RichTrajectory.cc +++ b/source/tracking/src/G4RichTrajectory.cc @@ -44,6 +44,7 @@ #include "G4UIcommand.hh" #include "G4UnitsTable.hh" #include "G4VProcess.hh" +#include "G4PhysicsModelCatalog.hh" //#define G4ATTDEBUG #ifdef G4ATTDEBUG @@ -284,7 +285,7 @@ std::vector* G4RichTrajectory::CreateAttValues() const values->push_back (G4AttValue("CMID",G4UIcommand::ConvertToString(fCreatorModelID),"")); const G4String& creatorModelName = - G4PhysicsModelCatalog::GetModelName(fCreatorModelID); + G4PhysicsModelCatalog::GetModelNameFromID(fCreatorModelID); values->push_back(G4AttValue("CMN",creatorModelName,"")); } else diff --git a/source/tracking/src/G4SteppingManager.cc b/source/tracking/src/G4SteppingManager.cc index 12ebc12618..a2a8135d03 100644 --- a/source/tracking/src/G4SteppingManager.cc +++ b/source/tracking/src/G4SteppingManager.cc @@ -93,6 +93,8 @@ G4SteppingManager::G4SteppingManager() physIntLength = DBL_MAX; kCarTolerance = 0.5*G4GeometryTolerance::GetInstance() ->GetSurfaceTolerance(); + + fNoProcess = new G4NoProcess; } /////////////////////////////////////// diff --git a/source/tracking/src/G4SteppingManager2.cc b/source/tracking/src/G4SteppingManager2.cc index a54e9f3ef6..4309c6b647 100644 --- a/source/tracking/src/G4SteppingManager2.cc +++ b/source/tracking/src/G4SteppingManager2.cc @@ -210,6 +210,7 @@ void G4SteppingManager::DefinePhysicalStepLength() // proposedSafety = DBL_MAX; G4double safetyProposedToAndByProcess = proposedSafety; + G4bool delegateToTransportation = false; for(std::size_t kp=0; kpGetPostStepPoint()->SetProcessDefinedStep(fCurrentProcess); } + else if(fCurrentProcess->GetProcessType()==fParallel) + { // a parallel world is proposing the shortest but expecting Transportation + // to win. + delegateToTransportation = true; + } // Transportation is assumed to be the last process in the vector - // - if(kp == MAXofAlongStepLoops-1) { fStepStatus = fGeomBoundary; } + // Transportation is winning + if(kp == MAXofAlongStepLoops-1) + { + fStepStatus = fGeomBoundary; + delegateToTransportation = false; + } } // Make sure to check the safety, even if Step is not limited @@ -259,6 +269,11 @@ void G4SteppingManager::DefinePhysicalStepLength() safetyProposedToAndByProcess = proposedSafety; } } + if(delegateToTransportation) + { + fStepStatus = fGeomBoundary; + fStep->GetPostStepPoint()->SetProcessDefinedStep(fCurrentProcess); + } } ////////////////////////////////////////////////////// @@ -315,102 +330,115 @@ void G4SteppingManager::InvokeAtRestDoItProcs() fStep->SetStepLength( 0. ); // the particle has stopped fTrack->SetStepLength( 0. ); - // invoke selected process - // - for(std::size_t np=0; npAtRestDoIt(*fTrack, *fStep); - - // Set the current process as a process which defined this Step length // - fStep->GetPostStepPoint()->SetProcessDefinedStep(fCurrentProcess); - - // Update Step + // Note: DoItVector has inverse order against GetPhysIntVector + // and SelectedAtRestDoItVector. // - fParticleChange->UpdateStepForAtRest(fStep); - - // Now Store the secondaries from ParticleChange to SecondaryList - - G4Track* tempSecondaryTrack; - G4int num2ndaries; - - num2ndaries = fParticleChange->GetNumberOfSecondaries(); - - for(G4int DSecLoop=0; DSecLoop< num2ndaries; ++DSecLoop) + if( (*fSelectedAtRestDoItVector)[MAXofAtRestLoops-np-1] != InActivated) { - tempSecondaryTrack = fParticleChange->GetSecondary(DSecLoop); - - if(tempSecondaryTrack->GetDefinition()->GetApplyCutsFlag()) - { - ApplyProductionCut(tempSecondaryTrack); - } - - // Set parentID - tempSecondaryTrack->SetParentID( fTrack->GetTrackID() ); - - // Set the process pointer which created this track - tempSecondaryTrack->SetCreatorProcess( fCurrentProcess ); - - // If this 2ndry particle has 'zero' kinetic energy, make sure - // it invokes a rest process at the beginning of the tracking + fCurrentProcess = (*fAtRestDoItVector)[np]; + fParticleChange = fCurrentProcess->AtRestDoIt(*fTrack, *fStep); + + // Set the current process as a process which defined this Step length // - if(tempSecondaryTrack->GetKineticEnergy() <= DBL_MIN) + fStep->GetPostStepPoint()->SetProcessDefinedStep(fCurrentProcess); + + // Update Step + // + fParticleChange->UpdateStepForAtRest(fStep); + + // Now Store the secondaries from ParticleChange to SecondaryList + + G4Track* tempSecondaryTrack; + G4int num2ndaries; + + num2ndaries = fParticleChange->GetNumberOfSecondaries(); + + for(G4int DSecLoop=0; DSecLoop< num2ndaries; ++DSecLoop) { - G4ProcessManager* pm = tempSecondaryTrack->GetDefinition() - ->GetProcessManager(); - if(pm == nullptr) + tempSecondaryTrack = fParticleChange->GetSecondary(DSecLoop); + + if(tempSecondaryTrack->GetDefinition()->GetApplyCutsFlag()) { - G4ExceptionDescription ED; - ED << "A track without proper process manager is pushed\n" - << "into the track stack.\n" - << " Particle name : " - << tempSecondaryTrack->GetDefinition()->GetParticleName() - << " -- "; - if(tempSecondaryTrack->GetParentID()<0) + ApplyProductionCut(tempSecondaryTrack); + } + + // Set parentID + tempSecondaryTrack->SetParentID( fTrack->GetTrackID() ); + + // Set the process pointer which created this track + tempSecondaryTrack->SetCreatorProcess( fCurrentProcess ); + + // If this 2ndry particle has 'zero' kinetic energy, make sure + // it invokes a rest process at the beginning of the tracking + // + if(tempSecondaryTrack->GetKineticEnergy() <= DBL_MIN) + { + G4ProcessManager* pm = tempSecondaryTrack->GetDefinition() + ->GetProcessManager(); + if(pm == nullptr) { - ED << "created by a primary particle generator."; + G4ExceptionDescription ED; + ED << "A track without proper process manager is pushed\n" + << "into the track stack.\n" + << " Particle name : " + << tempSecondaryTrack->GetDefinition()->GetParticleName() + << " -- "; + if(tempSecondaryTrack->GetParentID()<0) + { + ED << "created by a primary particle generator."; + } + else + { + const G4VProcess* vp = tempSecondaryTrack->GetCreatorProcess(); + if(vp != nullptr) + { ED << "created by " << vp->GetProcessName() << "."; } + else + { ED << "creaded by unknown process."; } + } + G4Exception("G4SteppingManager::InvokeAtRestDoItProcs()", + "Tracking10051", FatalException, ED); + } + if (pm->GetAtRestProcessVector()->entries()>0) + { + tempSecondaryTrack->SetTrackStatus( fStopButAlive ); + fSecondary->push_back( tempSecondaryTrack ); + ++fN2ndariesAtRestDoIt; } else { - const G4VProcess* vp = tempSecondaryTrack->GetCreatorProcess(); - if(vp != nullptr) - { ED << "created by " << vp->GetProcessName() << "."; } - else - { ED << "creaded by unknown process."; } + delete tempSecondaryTrack; } - G4Exception("G4SteppingManager::InvokeAtRestDoItProcs()", - "Tracking10051", FatalException, ED); - } - if (pm->GetAtRestProcessVector()->entries()>0) - { - tempSecondaryTrack->SetTrackStatus( fStopButAlive ); - fSecondary->push_back( tempSecondaryTrack ); - ++fN2ndariesAtRestDoIt; } else { - delete tempSecondaryTrack; + fSecondary->push_back( tempSecondaryTrack ); + ++fN2ndariesAtRestDoIt; } - } - else - { - fSecondary->push_back( tempSecondaryTrack ); - ++fN2ndariesAtRestDoIt; - } - } //end of loop on secondary + } //end of loop on secondary - // clear ParticleChange - fParticleChange->Clear(); + // clear ParticleChange + fParticleChange->Clear(); + + } // if(fSelectedAtRestDoItVector[np] != InActivated){ + } // for(std::size_t np=0; npGetPostStepPoint()->SetProcessDefinedStep( fNoProcess ); + } // if(shortestLifeTime < 1.0e+100) - } // if(fSelectedAtRestDoItVector[np] != InActivated){ - } // for(std::size_t np=0; npUpdateTrack(); fTrack->SetTrackStatus( fStopAndKill ); diff --git a/source/tracking/src/G4SteppingVerbose.cc b/source/tracking/src/G4SteppingVerbose.cc index d1ea215024..7bec79d99c 100644 --- a/source/tracking/src/G4SteppingVerbose.cc +++ b/source/tracking/src/G4SteppingVerbose.cc @@ -84,7 +84,7 @@ void G4SteppingVerbose::AtRestDoItInvoked() for(std::size_t np=0; npGetProcessName() << " (Forced)" << G4endl; } - else if ( (*fSelectedAtRestDoItVector)[npGPIL] == 1 ) + else if ( (*fSelectedAtRestDoItVector)[npGPIL] == G4ForceCondition::NotForced ) { ++npt; ptProcManager = (*fAtRestDoItVector)[np]; @@ -217,7 +217,7 @@ void G4SteppingVerbose::PostStepDoItAllDone() for(std::size_t np=0; npGetProcessName() << " (Forced)" << G4endl; } - else if ( (*fSelectedPostStepDoItVector)[npGPIL] == 1) + else if ( (*fSelectedPostStepDoItVector)[npGPIL] == G4ForceCondition::NotForced ) { ++npt; ptProcManager = (*fPostStepDoItVector)[np]; diff --git a/source/tracking/src/G4SteppingVerboseWithUnits.cc b/source/tracking/src/G4SteppingVerboseWithUnits.cc index 1884518975..e42532550a 100644 --- a/source/tracking/src/G4SteppingVerboseWithUnits.cc +++ b/source/tracking/src/G4SteppingVerboseWithUnits.cc @@ -190,7 +190,7 @@ void G4SteppingVerboseWithUnits::AtRestDoItInvoked() for(std::size_t np=0; npGetProcessName() << " (Forced)" << G4endl; } - else if ( (*fSelectedAtRestDoItVector)[npGPIL] == 1 ) + else if ( (*fSelectedAtRestDoItVector)[npGPIL] == G4ForceCondition::NotForced ) { ++npt; ptProcManager = (*fAtRestDoItVector)[np]; @@ -319,7 +319,7 @@ void G4SteppingVerboseWithUnits::PostStepDoItAllDone() for(std::size_t np=0; npGetProcessName() << " (Forced)" << G4endl; } - else if ( (*fSelectedPostStepDoItVector)[npGPIL] == 1) + else if ( (*fSelectedPostStepDoItVector)[npGPIL] == G4ForceCondition::NotForced ) { ++npt; ptProcManager = (*fPostStepDoItVector)[np]; diff --git a/source/tracking/src/G4TrackingMessenger.cc b/source/tracking/src/G4TrackingMessenger.cc index 1bf01dc663..fde340b38a 100644 --- a/source/tracking/src/G4TrackingMessenger.cc +++ b/source/tracking/src/G4TrackingMessenger.cc @@ -162,5 +162,5 @@ G4String G4TrackingMessenger::GetCurrentValue(G4UIcommand* command) return StoreTrajectoryCmd ->ConvertToString(trackingManager->GetStoreTrajectory()); } - return G4String('\0'); + return G4String(1,'\0'); } diff --git a/source/visualization/CMakeLists.txt b/source/visualization/CMakeLists.txt index 416d30812e..91db38d4de 100644 --- a/source/visualization/CMakeLists.txt +++ b/source/visualization/CMakeLists.txt @@ -28,3 +28,8 @@ endif() if(GEANT4_USE_TOOLSSG) add_subdirectory(ToolsSG) endif() + +# VTK is optional depending on user selection +if(GEANT4_USE_VTK) + add_subdirectory(Vtk) +endif() \ No newline at end of file diff --git a/source/visualization/FukuiRenderer/History b/source/visualization/FukuiRenderer/History index 2f6fdcd386..77108d6677 100644 --- a/source/visualization/FukuiRenderer/History +++ b/source/visualization/FukuiRenderer/History @@ -19,6 +19,9 @@ committal in the CVS repository ! History file for visualization/FukuiRenderer sub-category --------------------------------------------------------- +26 August 2021 Ben Morgan (DAWN-V10-07-02) +- Remove obsolete network FukuiRenderer driver + 07 June 2021 John Allison (DAWN-V10-07-01) - Fix hidden function warning. diff --git a/source/visualization/FukuiRenderer/README b/source/visualization/FukuiRenderer/README deleted file mode 100644 index 136d819dbb..0000000000 --- a/source/visualization/FukuiRenderer/README +++ /dev/null @@ -1,30 +0,0 @@ -<< Portability >> - -Compilation of DAWN-file and DAWN-network drivers -are confirmed at the following platforms: - - Linux, DEC, HP, AIX, Solaris, IRIX - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/visualization/FukuiRenderer/include/G4DAWNFILE.hh b/source/visualization/FukuiRenderer/include/G4DAWNFILE.hh index b4572fe680..c2a17d63c0 100644 --- a/source/visualization/FukuiRenderer/include/G4DAWNFILE.hh +++ b/source/visualization/FukuiRenderer/include/G4DAWNFILE.hh @@ -33,23 +33,19 @@ #include "G4VGraphicsSystem.hh" - //----- prototype -class G4VSceneHandler ; - - //----------------------------// - //----- class G4DAWNFILE -----// - //----------------------------// -class G4DAWNFILE: public G4VGraphicsSystem { - -public: - G4DAWNFILE (); - virtual ~G4DAWNFILE (); - G4VSceneHandler* CreateSceneHandler (const G4String& name = ""); - G4VViewer* CreateViewer (G4VSceneHandler&, const G4String& name = ""); - -private: - +//----- prototype +class G4VSceneHandler; +//----------------------------// +//----- class G4DAWNFILE -----// +//----------------------------// +class G4DAWNFILE : public G4VGraphicsSystem +{ + public: + G4DAWNFILE(); + virtual ~G4DAWNFILE(); + G4VSceneHandler* CreateSceneHandler(const G4String& name = ""); + G4VViewer* CreateViewer(G4VSceneHandler&, const G4String& name = ""); }; #endif diff --git a/source/visualization/FukuiRenderer/include/G4DAWNFILESceneHandler.hh b/source/visualization/FukuiRenderer/include/G4DAWNFILESceneHandler.hh index 27f22d49ee..a01ea1c6e6 100644 --- a/source/visualization/FukuiRenderer/include/G4DAWNFILESceneHandler.hh +++ b/source/visualization/FukuiRenderer/include/G4DAWNFILESceneHandler.hh @@ -37,193 +37,139 @@ #include "G4FRofstream.hh" #include "G4FRConst.hh" - -class G4VisAttributes ; +class G4VisAttributes; class G4DAWNFILE; - - //----- -class G4DAWNFILESceneHandler: public G4VSceneHandler { - +//----- +class G4DAWNFILESceneHandler : public G4VSceneHandler +{ friend class G4DAWNFILEViewer; -public: + public: + //----- constructor and destructor + G4DAWNFILESceneHandler(G4DAWNFILE& system, const G4String& name = ""); + virtual ~G4DAWNFILESceneHandler(); - //----- constructor and destructor - G4DAWNFILESceneHandler (G4DAWNFILE& system, const G4String& name = ""); - virtual ~G4DAWNFILESceneHandler (); - - //----- overriding base class methods + //----- overriding base class methods using G4VSceneHandler::AddPrimitive; - void AddPrimitive (const G4Polyline& line); - void AddPrimitive (const G4Polyhedron& p); - void AddPrimitive (const G4Text&); - void AddPrimitive (const G4Circle&); - void AddPrimitive (const G4Square&); + void AddPrimitive(const G4Polyline& line); + void AddPrimitive(const G4Polyhedron& p); + void AddPrimitive(const G4Text&); + void AddPrimitive(const G4Circle&); + void AddPrimitive(const G4Square&); - void BeginPrimitives (const G4Transform3D& objectTransformation); - void EndPrimitives (); + void BeginPrimitives(const G4Transform3D& objectTransformation); + void EndPrimitives(); using G4VSceneHandler::AddSolid; - void AddSolid ( const G4Box& box ); - void AddSolid ( const G4Cons& cons ); - void AddSolid ( const G4Tubs& tubs ); - void AddSolid ( const G4Trd& trd ); - void AddSolid ( const G4Trap& trap ); - void AddSolid ( const G4Sphere& sphere ); - void AddSolid ( const G4Para& para ); - void AddSolid ( const G4Torus& torus ); - void AddSolid ( const G4VSolid& solid ); + void AddSolid(const G4Box& box); + void AddSolid(const G4Cons& cons); + void AddSolid(const G4Tubs& tubs); + void AddSolid(const G4Trd& trd); + void AddSolid(const G4Trap& trap); + void AddSolid(const G4Sphere& sphere); + void AddSolid(const G4Para& para); + void AddSolid(const G4Torus& torus); + void AddSolid(const G4VSolid& solid); void ClearTransientStore(); // Used for triggering detector re-drawing. - //----- public methods inherent to this class - void FRBeginModeling () ; - void FREndModeling () ; - G4bool FRIsInModeling () { return FRflag_in_modeling ; } + //----- public methods inherent to this class + void FRBeginModeling(); + void FREndModeling(); + G4bool FRIsInModeling() { return FRflag_in_modeling; } - G4bool IsSavingG4Prim ( void ) { return flag_saving_g4_prim ; } - void BeginSavingG4Prim( void ); - void EndSavingG4Prim ( void ) ; - void SetG4PrimFileName() ; + G4bool IsSavingG4Prim(void) { return flag_saving_g4_prim; } + void BeginSavingG4Prim(void); + void EndSavingG4Prim(void); + void SetG4PrimFileName(); - G4DAWNFILE& GetSystem () { return fSystem ; } - void SendBoundingBox ( void ); - const char* GetG4PrimFileName () { return fG4PrimFileName ; } + G4DAWNFILE& GetSystem() { return fSystem; } + void SendBoundingBox(void); + const char* GetG4PrimFileName() { return fG4PrimFileName; } + private: + //----- Utilities etc (common to DAWN and DAWNFILE drivers ) + G4bool SendVisAttributes(const G4VisAttributes* pAV); + G4bool IsVisible(void); + void SendTransformedCoordinates(void); + void SendPhysVolName(void); + void SendNdiv(void); -private: + //----- public methods common to DAWN and DAWNFILE drivers + public: + void SendStr(const char* char_string); + void SendStrInt(const char* char_string, G4int ival); + void SendStrInt3(const char* char_string, G4int ival1, G4int ival2, + G4int ival3); + void SendStrInt4(const char* char_string, G4int ival1, G4int ival2, + G4int ival3, G4int ival4); + void SendStrDouble(const char* char_string, G4double dval); + void SendStrDouble2(const char* char_string, G4double dval1, G4double dval2); + void SendStrDouble3(const char* char_string, G4double dval1, G4double dval2, + G4double dval3); - //----- Utilities etc (common to DAWN and DAWNFILE drivers ) - G4bool SendVisAttributes ( const G4VisAttributes* pAV ); - G4bool IsVisible ( void ) ; - void SendTransformedCoordinates( void ) ; - void SendPhysVolName ( void ) ; - void SendNdiv ( void ) ; + void SendStrDouble4(const char* char_string, G4double dval1, G4double dval2, + G4double dval3, G4double dval4); - //----- public methods common to DAWN and DAWNFILE drivers -public: - void SendStr ( const char* char_string ) ; - void SendStrInt( const char* char_string , - G4int ival ); - void SendStrInt3( const char* char_string , - G4int ival1 , - G4int ival2 , - G4int ival3 ); - void SendStrInt4( const char* char_string , - G4int ival1 , - G4int ival2 , - G4int ival3 , - G4int ival4 ); - void SendStrDouble( const char* char_string , - G4double dval ); - void SendStrDouble2( const char* char_string , - G4double dval1 , - G4double dval2 ); - void SendStrDouble3( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 ); + void SendStrDouble5(const char* char_string, G4double dval1, G4double dval2, + G4double dval3, G4double dval4, G4double dval5); - void SendStrDouble4( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 ); + void SendStrDouble6(const char* char_string, G4double dval1, G4double dval2, + G4double dval3, G4double dval4, G4double dval5, + G4double dval6); - void SendStrDouble5( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 ); + void SendStrDouble7(const char* char_string, G4double dval1, G4double dval2, + G4double dval3, G4double dval4, G4double dval5, + G4double dval6, G4double dval7); - void SendStrDouble6( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 ); + void SendStrDouble11(const char* char_string, G4double dval1, G4double dval2, + G4double dval3, G4double dval4, G4double dval5, + G4double dval6, G4double dval7, G4double dval8, + G4double dval9, G4double dval10, G4double dval11); - void SendStrDouble7( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 , - G4double dval7 ); + void SendIntDouble3(G4int ival, G4double dval1, G4double dval2, + G4double dval3); + void SendInt3Str(G4int ival1, G4int ival2, G4int ival3, + const char* char_string); + void SendInt4Str(G4int ival1, G4int ival2, G4int ival3, G4int ival4, + const char* char_string); - void SendStrDouble11( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 , - G4double dval7 , - G4double dval8 , - G4double dval9 , - G4double dval10 , - G4double dval11 ) ; + void SendStrDouble3Str(const char* char_string1, G4double dval1, + G4double dval2, G4double dval3, + const char* char_string2); - void SendIntDouble3( G4int ival , - G4double dval1 , - G4double dval2 , - G4double dval3 ); - void SendInt3Str( G4int ival1 , - G4int ival2 , - G4int ival3 , - const char* char_string ); - void SendInt4Str( G4int ival1 , - G4int ival2 , - G4int ival3 , - G4int ival4 , - const char* char_string ); + void SendStrDouble6Str(const char* char_string1, G4double dval1, + G4double dval2, G4double dval3, G4double dval4, + G4double dval5, G4double dval6, + const char* char_string2); - void SendStrDouble3Str( const char* char_string1 , - G4double dval1 , - G4double dval2 , - G4double dval3 , - const char* char_string2 ); + void SendInt(G4int val); + void SendDouble(G4double val); - void SendStrDouble6Str( const char* char_string1 , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 , - const char* char_string2 ); + private: + G4DAWNFILE& fSystem; // Graphics system for this scene. + static G4int fSceneIdCount; - void SendInt ( G4int val ); - void SendDouble( G4double val ); + G4FRofstream fPrimDest; // defined here + G4bool FRflag_in_modeling; + // true: FR_BEGIN_MODELING has sent to DAWN, and + // FR_END_MODELING has not sent yet. + // false: otherwise + // + // FRflag_in_modeling is set to "true" + // in FRBeginModeling(), and to "false" + // in FREndModeling(). -private: - G4DAWNFILE& fSystem; // Graphics system for this scene. - static G4int fSceneIdCount; + G4bool flag_saving_g4_prim; - G4FRofstream fPrimDest ; // defined here - G4bool FRflag_in_modeling ; - // true: FR_BEGIN_MODELING has sent to DAWN, and - // FR_END_MODELING has not sent yet. - // false: otherwise - // - // FRflag_in_modeling is set to "true" - // in FRBeginModeling(), and to "false" - // in FREndModeling(). + const int COMMAND_BUF_SIZE; - G4bool flag_saving_g4_prim ; + char fG4PrimDestDir[256]; + char fG4PrimFileName[256]; + G4int fMaxFileNum; - const int COMMAND_BUF_SIZE ; - - char fG4PrimDestDir [256] ; - char fG4PrimFileName[256] ; - G4int fMaxFileNum ; - - G4int fPrec, fPrec2 ; - + G4int fPrec, fPrec2; }; #endif diff --git a/source/visualization/FukuiRenderer/include/G4DAWNFILEViewer.hh b/source/visualization/FukuiRenderer/include/G4DAWNFILEViewer.hh index f15ff9d670..be7a068695 100644 --- a/source/visualization/FukuiRenderer/include/G4DAWNFILEViewer.hh +++ b/source/visualization/FukuiRenderer/include/G4DAWNFILEViewer.hh @@ -34,37 +34,45 @@ #include "G4VViewer.hh" #include "globals.hh" -class G4DAWNFILESceneHandler ; +class G4DAWNFILESceneHandler; -class G4DAWNFILEViewer: public G4VViewer { +class G4DAWNFILEViewer : public G4VViewer +{ + enum FRDEV + { + FRDEV_PS = 1, + FRDEV_XWIN = 2, + FRDEV_PS2 = 3, + FRDEV_XWIN2 = 4, + FRDEV_OPEN_GL = 5, + FRDEV_DEVICE_END = 6 + }; - enum FRDEV {FRDEV_PS=1, FRDEV_XWIN=2, FRDEV_PS2=3, FRDEV_XWIN2=4, FRDEV_OPEN_GL=5, FRDEV_DEVICE_END=6} ; + public: + //----- constructor and destructor + G4DAWNFILEViewer(G4DAWNFILESceneHandler& scene, const G4String& name = ""); + virtual ~G4DAWNFILEViewer(); -public: - //----- constructor and destructor - G4DAWNFILEViewer (G4DAWNFILESceneHandler& scene, const G4String& name = ""); - virtual ~G4DAWNFILEViewer (); + //----- overriding base class methods + void SetView(); // Do nothing. SendViewParameters will do its job. + void ClearView(); + void DrawView(); + void ShowView(); - //----- overriding base class methods - void SetView (); // Do nothing. SendViewParameters will do its job. - void ClearView (); - void DrawView (); - void ShowView (); + //---- methods inherent to this class + void SendViewParameters(); + const char* GetG4PrimViewer() { return fG4PrimViewer; } + const char* GetG4PrimViewerInvocation() { return fG4PrimViewerInvocation; } + const char* GetPSViewer() { return fPSViewer; } + void SendDrawingStyleToDAWNGUI(std::ostream& out); - //---- methods inherent to this class - void SendViewParameters () ; - const char* GetG4PrimViewer () { return fG4PrimViewer ;} - const char* GetG4PrimViewerInvocation() { return fG4PrimViewerInvocation ;} - const char* GetPSViewer () { return fPSViewer ;} - void SendDrawingStyleToDAWNGUI( std::ostream& out ) ; - -private: - G4DAWNFILESceneHandler& fSceneHandler; // Reference to Graphics Scene for this view. - - char fG4PrimViewer [32] ; - char fG4PrimViewerInvocation[64] ; - char fPSViewer [32] ; + private: + G4DAWNFILESceneHandler& + fSceneHandler; // Reference to Graphics Scene for this view. + char fG4PrimViewer[32]; + char fG4PrimViewerInvocation[64]; + char fPSViewer[32]; }; #endif diff --git a/source/visualization/FukuiRenderer/include/G4FRClientServer.hh b/source/visualization/FukuiRenderer/include/G4FRClientServer.hh deleted file mode 100644 index 1fef65847f..0000000000 --- a/source/visualization/FukuiRenderer/include/G4FRClientServer.hh +++ /dev/null @@ -1,141 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// Satoshi TANAKA, Wed Jul 3 14:13:52 JST 1996 -//////////////////////////////// -///// G4FRClientServer.h ///// -//////////////////////////////// - -//=================// -#if defined (G4VIS_BUILD_DAWN_DRIVER) || defined (G4VIS_USE_DAWN) -//=================// - - -#if !defined G4FR_CLIENT_SERVER_H -#define G4FR_CLIENT_SERVER_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include"G4ios.hh" - - -//----- constants -const char FR_ENV_SERVER_HOST_NAME[] = "G4DAWN_HOST_NAME" ; -const char FR_ENV_NAMED_PIPE_CONNECTION[] = "G4DAWN_NAMED_PIPE" ; - - //-----------------------------------// - //----- class G4FRClientServer -----// - //-----------------------------------// - -class G4FRClientServer { - public: - enum { SEND_BUFMAX = 1024 , RECV_BUFMAX = 1024 }; - enum { SUN_PATH_MAX = 16 }; - - protected: - const char TERMINATOR ; - const char END_OF_LINE; - char SUN_PATH[ SUN_PATH_MAX ]; - int PORT_NUMBER ; - int fSocketFd ; - - char fReceivedMessage [ RECV_BUFMAX ]; - char fSendingMessage [ SEND_BUFMAX ]; - - protected: - - void Err( const char* message ) { perror(message) ;} - void SetSendingMessage( const char* message ) - { strcpy( fSendingMessage, message );} - void Send() ; // send command in fSendingMessage - - public: - //----- Server - int AcceptUnix(){ return 0;} // made unfunctioned - int AcceptINET(){ return 0 ;} // made unfunctioned - - //----- Client - int ConnectUnix(); - int ConnectINET(); - - //----- Common to server and client - - //---------- (1) - G4FRClientServer ( char terminator = '.' , - char end_line = '\n' ) ; - virtual ~G4FRClientServer () {;} - void SetSunPath( const char* sun_path ) - { strcpy ( SUN_PATH, sun_path ); } - void SetPortNumber( int port_num ) - { PORT_NUMBER = port_num ; } - void IncrementPortNumber( int incr = 1 ) - { PORT_NUMBER += incr ; } - const char* GetSendingMessage() const - { return fSendingMessage ;} - int GetSendingMessageLength() const - { return strlen(fSendingMessage) ;} - void SetReceivedMessage( const char* message ) - { strcpy( fReceivedMessage, message );} - const char* GetReceivedMessage() const - { return fReceivedMessage ;} - int GetReceivedMessageLength() const - { return strlen(fReceivedMessage) ;} - int GetSofd() const { return fSocketFd ; } - int GetPortNumber () const { return PORT_NUMBER ; } - void ClearReceivedMessage () - { memset(fReceivedMessage, '\0', RECV_BUFMAX) ; } - - int IsTerminator(char ch ) { return ( ch == TERMINATOR ); } - char GetTerminator() const { return TERMINATOR ; } - int IsEndOfLine (char ch ) { return ( ch == END_OF_LINE ); } - char GetEndOfLine() const { return END_OF_LINE ; } - void DisConnect(); - void Clear(); - void WaitSendBack( const char* command_string ) ; - - //---------- (2) send and receive - virtual void Send ( const char* message ) ; - virtual void SendLine ( const char* message ) ; - // Add END_OF_LINE if the message does not - // Terminate with it. And then send the message. - virtual void Receive() ; - virtual void ReceiveLine() ; - -}; // G4FRClientServer - - -#endif -#endif //G4VIS_BUILD_DAWN_DRIVER - diff --git a/source/visualization/FukuiRenderer/include/G4FRConst.hh b/source/visualization/FukuiRenderer/include/G4FRConst.hh index 683677a3df..bc34e4aa34 100644 --- a/source/visualization/FukuiRenderer/include/G4FRConst.hh +++ b/source/visualization/FukuiRenderer/include/G4FRConst.hh @@ -30,166 +30,166 @@ ///// G4FRConst.hh ///// /////////////////////////////////// -#if !defined G4_FR_COMMAND_LIST_HH +#ifndef G4_FR_COMMAND_LIST_HH #define G4_FR_COMMAND_LIST_HH - //----- Header comment -const char FR_G4_PRIM_HEADER [] = "##G4.PRIM-FORMAT-2.4" ; -//const char FR_PHYSICAL_VOLUME_NAME [] = "#/PhysicalVolumeName" ; -const char FR_PHYSICAL_VOLUME_NAME [] = "#/PVName" ; +//----- Header comment +const char FR_G4_PRIM_HEADER[] = "##G4.PRIM-FORMAT-2.4"; +// const char FR_PHYSICAL_VOLUME_NAME [] = "#/PhysicalVolumeName" ; +const char FR_PHYSICAL_VOLUME_NAME[] = "#/PVName"; - //----- Execution control (beginning with !) -const char FR_GUI [] = "!GraphicalUserInterface" ; -const char FR_DEVICE [] = "!Device" ; -const char FR_SET_CAMERA [] = "!SetCamera" ; -const char FR_OPEN_DEVICE [] = "!OpenDevice" ; -const char FR_CLOSE_DEVICE [] = "!CloseDevice" ; -const char FR_DRAW_ALL [] = "!DrawAll" ; -const char FR_CLEAR_DATA [] = "!ClearData" ; -const char FR_QUIT [] = "!Quit" ; -const char FR_DISCONNECT_DAWND [] = "!DisconnectDawnd" ; -const char FR_TERMINATE_DAWND [] = "!TerminateDawnd" ; -const char FR_SAVE [] = "!Save" ; -const char FR_END_SAVE [] = "!EndSave" ; -const char FR_WAIT [] = "!Wait" ; -const char FR_PAUSE [] = "!Pause" ; +//----- Execution control (beginning with !) +const char FR_GUI[] = "!GraphicalUserInterface"; +const char FR_DEVICE[] = "!Device"; +const char FR_SET_CAMERA[] = "!SetCamera"; +const char FR_OPEN_DEVICE[] = "!OpenDevice"; +const char FR_CLOSE_DEVICE[] = "!CloseDevice"; +const char FR_DRAW_ALL[] = "!DrawAll"; +const char FR_CLEAR_DATA[] = "!ClearData"; +const char FR_QUIT[] = "!Quit"; +const char FR_DISCONNECT_DAWND[] = "!DisconnectDawnd"; +const char FR_TERMINATE_DAWND[] = "!TerminateDawnd"; +const char FR_SAVE[] = "!Save"; +const char FR_END_SAVE[] = "!EndSave"; +const char FR_WAIT[] = "!Wait"; +const char FR_PAUSE[] = "!Pause"; - //----- Drawing Style -const char FR_WIREFRAME [] = "/Wireframe" ; -const char FR_SURFACE [] = "/Surface" ; -const char FR_LINES [] = "/Lines" ; +//----- Drawing Style +const char FR_WIREFRAME[] = "/Wireframe"; +const char FR_SURFACE[] = "/Surface"; +const char FR_LINES[] = "/Lines"; - //----- Begin and End of Modeling -const char FR_BEGIN_MODELING [] = "!BeginModeling" ; -const char FR_END_MODELING [] = "!EndModeling" ; +//----- Begin and End of Modeling +const char FR_BEGIN_MODELING[] = "!BeginModeling"; +const char FR_END_MODELING[] = "!EndModeling"; - //----- Bounding box -const char FR_BOUNDING_BOX [] = "/BoundingBox" ; -const char FR_BOUNDING_BOX_UNIT [] = "/BoundingBox -0.5 -0.5 -0.5 0.5 0.5 0.5" ; +//----- Bounding box +const char FR_BOUNDING_BOX[] = "/BoundingBox"; +const char FR_BOUNDING_BOX_UNIT[] = "/BoundingBox -0.5 -0.5 -0.5 0.5 0.5 0.5"; - //----- Number of divising curved surface -const int FR_DEFALUT_NDIV_VALUE = 24 ; +//----- Number of divising curved surface +const int FR_DEFALUT_NDIV_VALUE = 24; -const char FR_NDIV [] = "/Ndiv" ; -const char FR_NDIV_DEFAULT [] = "/Ndiv 24" ; -const char FR_NDIV_3 [] = "/Ndiv 3" ; -const char FR_NDIV_4 [] = "/Ndiv 4" ; -const char FR_NDIV_8 [] = "/Ndiv 8" ; -const char FR_NDIV_16 [] = "/Ndiv 16" ; -const char FR_NDIV_24 [] = "/Ndiv 24" ; -const char FR_NDIV_48 [] = "/Ndiv 48" ; -const char FR_NDIV_96 [] = "/Ndiv 96" ; +const char FR_NDIV[] = "/Ndiv"; +const char FR_NDIV_DEFAULT[] = "/Ndiv 24"; +const char FR_NDIV_3[] = "/Ndiv 3"; +const char FR_NDIV_4[] = "/Ndiv 4"; +const char FR_NDIV_8[] = "/Ndiv 8"; +const char FR_NDIV_16[] = "/Ndiv 16"; +const char FR_NDIV_24[] = "/Ndiv 24"; +const char FR_NDIV_48[] = "/Ndiv 48"; +const char FR_NDIV_96[] = "/Ndiv 96"; - //----- Camera information -const char FR_CAMERA_POSITION[] = "/CameraPosition" ; -const char FR_CAMERA_POSITION_DEFAULT[] = "/CameraPosition 100000.0 0.0 0.0" ; - // see from far upward position -const char FR_TARGET_POINT [] = "/TargetPoint"; -const char FR_ZOOM_FACTOR [] = "/ZoomFactor"; -const char FR_SCALE [] = "/Scale"; -const char FR_FOCAL_DISTANCE [] = "/FocalDistance"; +//----- Camera information +const char FR_CAMERA_POSITION[] = "/CameraPosition"; +const char FR_CAMERA_POSITION_DEFAULT[] = "/CameraPosition 100000.0 0.0 0.0"; +// see from far upward position +const char FR_TARGET_POINT[] = "/TargetPoint"; +const char FR_ZOOM_FACTOR[] = "/ZoomFactor"; +const char FR_SCALE[] = "/Scale"; +const char FR_FOCAL_DISTANCE[] = "/FocalDistance"; - //----- Body coordinate information -const char FR_BASE_VECTOR [] = "/BaseVector" ; - // Give e1 and e2. Then e3 is calculated. -const char FR_BASE_VECTOR_DEFAULT [] = "/BaseVector 1.0 0.0 0.0 0.0 1.0 0.0" ; -const char FR_ORIGIN [] = "/Origin" ; -const char FR_ORIGIN_DEFAULT [] = "/Origin 0.0 0.0 0.0" ; +//----- Body coordinate information +const char FR_BASE_VECTOR[] = "/BaseVector"; +// Give e1 and e2. Then e3 is calculated. +const char FR_BASE_VECTOR_DEFAULT[] = "/BaseVector 1.0 0.0 0.0 0.0 1.0 0.0"; +const char FR_ORIGIN[] = "/Origin"; +const char FR_ORIGIN_DEFAULT[] = "/Origin 0.0 0.0 0.0"; - //----- Attribute information -const char FR_DIFFUSE_RGB [] = "/DiffuseRGB" ; - // old name of /ColorRGB +//----- Attribute information +const char FR_DIFFUSE_RGB[] = "/DiffuseRGB"; +// old name of /ColorRGB -const char FR_COLOR_RGB [] = "/ColorRGB" ; -const char FR_COLOR_RGB_DEFAULT [] = "/ColorRGB 1.0 1.0 1.0" ; -const char FR_COLOR_RGB_WHITE [] = "/ColorRGB 1.0 1.0 1.0" ; +const char FR_COLOR_RGB[] = "/ColorRGB"; +const char FR_COLOR_RGB_DEFAULT[] = "/ColorRGB 1.0 1.0 1.0"; +const char FR_COLOR_RGB_WHITE[] = "/ColorRGB 1.0 1.0 1.0"; -const char FR_COLOR_RGB_RED [] = "/ColorRGB 1.0 0.0 0.0" ; -const char FR_COLOR_RGB_GREEN [] = "/ColorRGB 0.0 1.0 0.0" ; -const char FR_COLOR_RGB_BLUE [] = "/ColorRGB 0.0 0.0 1.0" ; +const char FR_COLOR_RGB_RED[] = "/ColorRGB 1.0 0.0 0.0"; +const char FR_COLOR_RGB_GREEN[] = "/ColorRGB 0.0 1.0 0.0"; +const char FR_COLOR_RGB_BLUE[] = "/ColorRGB 0.0 0.0 1.0"; -const char FR_COLOR_RGB_CYAN [] = "/ColorRGB 0.0 1.0 1.0" ; -const char FR_COLOR_RGB_MAGENTA [] = "/ColorRGB 1.0 0.0 1.0" ; -const char FR_COLOR_RGB_YELLOW [] = "/ColorRGB 1.0 1.0 0.0" ; +const char FR_COLOR_RGB_CYAN[] = "/ColorRGB 0.0 1.0 1.0"; +const char FR_COLOR_RGB_MAGENTA[] = "/ColorRGB 1.0 0.0 1.0"; +const char FR_COLOR_RGB_YELLOW[] = "/ColorRGB 1.0 1.0 0.0"; -const char FR_SPECULAR_RGB [] = "/SpecularRGB" ; -const char FR_SPECULAR_RGB_DEFAULT [] = "/SpecularRGB 1.0 1.0 1.0" ; -const char FR_SPECULAR_RGB_WHITE [] = "/SpecularRGB 1.0 1.0 1.0" ; +const char FR_SPECULAR_RGB[] = "/SpecularRGB"; +const char FR_SPECULAR_RGB_DEFAULT[] = "/SpecularRGB 1.0 1.0 1.0"; +const char FR_SPECULAR_RGB_WHITE[] = "/SpecularRGB 1.0 1.0 1.0"; -const char FR_PHONG_POWER [] = "/PhongPower" ; -const char FR_PHONG_POWER_DEFAULT [] = "/PhongPower 3" ; +const char FR_PHONG_POWER[] = "/PhongPower"; +const char FR_PHONG_POWER_DEFAULT[] = "/PhongPower 3"; -const char FR_TRANSPARENCY [] = "/Transparency" ; -const char FR_TRANSPARENCY_ON [] = "/Transparency 1 " ; // transparent -const char FR_TRANSPARENCY_OFF [] = "/Transparency 0 " ; // non-transparent +const char FR_TRANSPARENCY[] = "/Transparency"; +const char FR_TRANSPARENCY_ON[] = "/Transparency 1 "; // transparent +const char FR_TRANSPARENCY_OFF[] = "/Transparency 0 "; // non-transparent -const char FR_FORCE_WIREFRAME [] = "/ForceWireframe" ; -const char FR_FORCE_WIREFRAME_ON [] = "/ForceWireframe 1" ; -const char FR_FORCE_WIREFRAME_OFF [] = "/ForceWireframe 0" ; +const char FR_FORCE_WIREFRAME[] = "/ForceWireframe"; +const char FR_FORCE_WIREFRAME_ON[] = "/ForceWireframe 1"; +const char FR_FORCE_WIREFRAME_OFF[] = "/ForceWireframe 0"; -const char FR_VISIBILITY [] = "/Visibility" ; -const char FR_VISIBILITY_ON [] = "/Visibility 1" ; // visible -const char FR_VISIBILITY_OFF [] = "/Visibility 0" ; // invisible +const char FR_VISIBILITY[] = "/Visibility"; +const char FR_VISIBILITY_ON[] = "/Visibility 1"; // visible +const char FR_VISIBILITY_OFF[] = "/Visibility 0"; // invisible - //----- 3D Primitives -const char FR_POLYHEDRON [] = "/Polyhedron" ; -const char FR_VERTEX [] = "/Vertex" ; -const char FR_FACET [] = "/Facet" ; -const char FR_END_POLYHEDRON [] = "/EndPolyhedron" ; +//----- 3D Primitives +const char FR_POLYHEDRON[] = "/Polyhedron"; +const char FR_VERTEX[] = "/Vertex"; +const char FR_FACET[] = "/Facet"; +const char FR_END_POLYHEDRON[] = "/EndPolyhedron"; -const char FR_BOX [] = "/Box" ; -const char FR_BOX_UNIT [] = "/Box 0.5 0.5 0.5" ; // dx, dy, dz +const char FR_BOX[] = "/Box"; +const char FR_BOX_UNIT[] = "/Box 0.5 0.5 0.5"; // dx, dy, dz -const char FR_COLUMN [] = "/Column" ; -const char FR_COLUMN_UNIT [] = "/Column 0.5 0.5" ; // R dz +const char FR_COLUMN[] = "/Column"; +const char FR_COLUMN_UNIT[] = "/Column 0.5 0.5"; // R dz -const char FR_POLYLINE [] = "/Polyline" ; -const char FR_PL_VERTEX [] = "/PLVertex" ; -const char FR_PL_VERTEX_OLD [] = "PLVertex" ; -const char FR_END_POLYLINE [] = "/EndPolyline" ; +const char FR_POLYLINE[] = "/Polyline"; +const char FR_PL_VERTEX[] = "/PLVertex"; +const char FR_PL_VERTEX_OLD[] = "PLVertex"; +const char FR_END_POLYLINE[] = "/EndPolyline"; -const char FR_TRD [] = "/Trd" ; - // /Trd dx1 dx2 dy1 dy2 dz ; -const char FR_TRAP [] = "/Trap" ; - // /Trap dz theta phi h1 bl1 tl1 alpha1 h2 bl2 tl2 alpha2 -const char FR_TUBS [] = "/Tubs" ; - // /Tubs rmin rmax dz sphi dphi -const char FR_CONS [] = "/Cons" ; - // /Cons rmin1 rmax1 rmin2 rmax2 dz sphi dphi -const char FR_SPHERE [] = "/Sphere" ; - // /Sphere R -const char FR_SPHERE_SEG [] = "/SphereSeg" ; - // /SphereSeg rmin rmax s_theta d_theta s_phi d_phi -const char FR_PARA [] = "/Parallelepiped" ; - // /Parallelepiped dx dy dz tanAlpha tanTheta_cosPhi tanTheta_sinPhi -const char FR_PCON [] = "/PolyCone" ; - // /PolyCone sphi dphi nz z[nz] rmin[nz] rmax[nz] -const char FR_PGON [] = "/PolyGon" ; - // /PolyGon sphi dphi ndiv nz z[nz] rmin[nz] rmax[nz] -const char FR_TORUS [] = "/Torus" ; - // /PolyGon sphi dphi ndiv nz z[nz] rmin[nz] rmax[nz] +const char FR_TRD[] = "/Trd"; +// /Trd dx1 dx2 dy1 dy2 dz ; +const char FR_TRAP[] = "/Trap"; +// /Trap dz theta phi h1 bl1 tl1 alpha1 h2 bl2 tl2 alpha2 +const char FR_TUBS[] = "/Tubs"; +// /Tubs rmin rmax dz sphi dphi +const char FR_CONS[] = "/Cons"; +// /Cons rmin1 rmax1 rmin2 rmax2 dz sphi dphi +const char FR_SPHERE[] = "/Sphere"; +// /Sphere R +const char FR_SPHERE_SEG[] = "/SphereSeg"; +// /SphereSeg rmin rmax s_theta d_theta s_phi d_phi +const char FR_PARA[] = "/Parallelepiped"; +// /Parallelepiped dx dy dz tanAlpha tanTheta_cosPhi tanTheta_sinPhi +const char FR_PCON[] = "/PolyCone"; +// /PolyCone sphi dphi nz z[nz] rmin[nz] rmax[nz] +const char FR_PGON[] = "/PolyGon"; +// /PolyGon sphi dphi ndiv nz z[nz] rmin[nz] rmax[nz] +const char FR_TORUS[] = "/Torus"; +// /PolyGon sphi dphi ndiv nz z[nz] rmin[nz] rmax[nz] //----- Marks I (arg: x y z half_size_3d) -const char FR_FONT_NAME [] = "/FontName" ; +const char FR_FONT_NAME[] = "/FontName"; //----- Marks I (arg: x y z half_size_3d) -const char FR_MARK_CIRCLE_2D [] = "/MarkCircle2D" ; -const char FR_MARK_SQUARE_2D [] = "/MarkSquare2D" ; -const char FR_MARK_TEXT_2D [] = "/MarkText2D" ; - // /MarkText2D x y z size_world x_offset_world y_offset_world string +const char FR_MARK_CIRCLE_2D[] = "/MarkCircle2D"; +const char FR_MARK_SQUARE_2D[] = "/MarkSquare2D"; +const char FR_MARK_TEXT_2D[] = "/MarkText2D"; +// /MarkText2D x y z size_world x_offset_world y_offset_world string //----- Marks II (arg: x y z half_size_2d) -const char FR_MARK_CIRCLE_2DS [] = "/MarkCircle2DS" ; -const char FR_MARK_SQUARE_2DS [] = "/MarkSquare2DS" ; -const char FR_MARK_TEXT_2DS [] = "/MarkText2DS" ; - // /MarkText2DS x y z size_pt x_offset_pt y_offset_pt string +const char FR_MARK_CIRCLE_2DS[] = "/MarkCircle2DS"; +const char FR_MARK_SQUARE_2DS[] = "/MarkSquare2DS"; +const char FR_MARK_TEXT_2DS[] = "/MarkText2DS"; +// /MarkText2DS x y z size_pt x_offset_pt y_offset_pt string //----- Text -const char FR_TEXT_2DS [] = "/Text2DS" ; +const char FR_TEXT_2DS[] = "/Text2DS"; //----- For DAWNCUT -const char FR_CLIPPING_PLANE [] = "/ClippingPlane" ; - // /ClippingPlaneMarkCross2D a b c d - // for plane ax + by + cz + d = 0 +const char FR_CLIPPING_PLANE[] = "/ClippingPlane"; +// /ClippingPlaneMarkCross2D a b c d +// for plane ax + by + cz + d = 0 #endif diff --git a/source/visualization/FukuiRenderer/include/G4FRFeatures.hh b/source/visualization/FukuiRenderer/include/G4FRFeatures.hh deleted file mode 100644 index 587a1f27af..0000000000 --- a/source/visualization/FukuiRenderer/include/G4FRFeatures.hh +++ /dev/null @@ -1,58 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -#if !defined G4_FR_FEATURES_HH -#define G4_FR_FEATURES_HH - - -const char FR_DAWN_FEATURES[] = "High quality technical renderer.\ -\n Features: exact hidden line, hidden surface algorithms.\ -\n high (unlimited) resolution.\ -\n renders to PostScript for viewing and/or hardcopy.\ -\n remote rendering.\ -\n off-line rendering.\ -\n graphical user interface.\ -\n connection via TCP/IP socket or named pipe Fukui Renderer DAWN.\ -\n Disadvantages: compute intensive, takes time (use a fast graphics\ -\n system, such as OpenGL, to select view, then copy\ -\n to this renderer - /vis~/copy/view, /vis~/set/view)."; - - -const char FR_DAWNFILE_FEATURES[] ="High quality technical renderer.\ -\n Features: exact hidden line, hidden surface algorithms.\ -\n high (unlimited) resolution.\ -\n renders to PostScript for viewing and/or hardcopy.\ -\n remote rendering.\ -\n off-line rendering.\ -\n graphical user interface.\ -\n connection via g4.prim file to Fukui Renderer DAWN,\ -\n DAVID (DAwn's Visual Intersection Debugger, etc.\ -\n Disadvantages: compute intensive, takes time (use a fast graphics\ -\n system, such as OpenGL, to select view, then copy\ -\n to this renderer - /vis~/copy/view, /vis~/set/view)."; - -#endif diff --git a/source/visualization/FukuiRenderer/include/G4FRSceneFunc.icc b/source/visualization/FukuiRenderer/include/G4FRSceneFunc.icc index 0f836d1ee2..2496c4475b 100644 --- a/source/visualization/FukuiRenderer/include/G4FRSceneFunc.icc +++ b/source/visualization/FukuiRenderer/include/G4FRSceneFunc.icc @@ -34,1552 +34,1490 @@ //========== AddPrimitive() functions ==========// -//----- Add polyline -void G4FRSCENEHANDLER::AddPrimitive (const G4Polyline& polyline) +//----- Add polyline +void G4FRSCENEHANDLER::AddPrimitive(const G4Polyline& polyline) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive\n"; -#endif - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4FRSCENEHANDLER::AddPrimitive (const G4Polyline&)", - "dawn0001", JustWarning, - "2D polylines not implemented. Ignored."); - } - return; - } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive\n"; +#endif + if(fProcessing2D) + { + static G4bool warned = false; + if(!warned) + { + warned = true; + G4Exception("G4FRSCENEHANDLER::AddPrimitive (const G4Polyline&)", + "dawn0001", JustWarning, + "2D polylines not implemented. Ignored."); + } + return; + } + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- local working variables - G4int nPoints = polyline.size (); - G4int i ; - const G4VisAttributes* pVA = - fpViewer->GetApplicableVisAttributes ( polyline.GetVisAttributes() ); + //----- local working variables + G4int nPoints = polyline.size(); + G4int i; + const G4VisAttributes* pVA = + fpViewer->GetApplicableVisAttributes(polyline.GetVisAttributes()); - //----- skip drawing invisible primitive - if( pVA ){ - if( !(pVA->IsVisible()) ) { return ; } - } + //----- skip drawing invisible primitive + if(pVA) + { + if(!(pVA->IsVisible())) + { + return; + } + } - //----- Attributes - if(!SendVisAttributes( pVA ) ) { - SendStr( FR_COLOR_RGB_RED ); // color - } + //----- Attributes + if(!SendVisAttributes(pVA)) + { + SendStr(FR_COLOR_RGB_RED); // color + } - //----- send coordinates to Fukui Renderer - SendTransformedCoordinates(); + //----- send coordinates to Fukui Renderer + SendTransformedCoordinates(); - //----- send beginning of polyline - SendStr( FR_POLYLINE ); + //----- send beginning of polyline + SendStr(FR_POLYLINE); - //----- vertices on polyline - for ( i = 0; i < nPoints; i++ ) { - SendStrDouble3( FR_PL_VERTEX , \ - polyline[i].x(), \ - polyline[i].y(), \ - polyline[i].z() ); - } + //----- vertices on polyline + for(i = 0; i < nPoints; i++) + { + SendStrDouble3(FR_PL_VERTEX, polyline[i].x(), polyline[i].y(), + polyline[i].z()); + } - //----- send ending of polyline - SendStr( FR_END_POLYLINE ); - -} // G4FRSCENEHANDLER::AddPrimitive (polyline) + //----- send ending of polyline + SendStr(FR_END_POLYLINE); +} // G4FRSCENEHANDLER::AddPrimitive (polyline) //----- Add text -void G4FRSCENEHANDLER::AddPrimitive ( const G4Text& text ) +void G4FRSCENEHANDLER::AddPrimitive(const G4Text& text) { - //----- + //----- #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive( G4Text )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive( G4Text )\n"; #endif - //----- Initialize DAWN IF NECESSARY - FRBeginModeling(); + //----- Initialize DAWN IF NECESSARY + FRBeginModeling(); - //----- send color - const G4Color& color = GetTextColor (text) ; - SendStrDouble3( FR_COLOR_RGB , - color.GetRed (), - color.GetGreen(), - color.GetBlue () ); + //----- send color + const G4Color& color = GetTextColor(text); + SendStrDouble3(FR_COLOR_RGB, color.GetRed(), color.GetGreen(), + color.GetBlue()); - //----- send body coordinates - SendTransformedCoordinates(); + //----- send body coordinates + SendTransformedCoordinates(); - //----- Calc size - MarkerSizeType size_type; - G4double fontsize = GetMarkerDiameter( text , size_type ); + //----- Calc size + MarkerSizeType size_type; + G4double fontsize = GetMarkerDiameter(text, size_type); - //----- Calc position - const G4Point3D& position = text.GetPosition () ; + //----- Calc position + const G4Point3D& position = text.GetPosition(); - //----- offset - G4double x_offset = text.GetXOffset(); - G4double y_offset = text.GetYOffset(); + //----- offset + G4double x_offset = text.GetXOffset(); + G4double y_offset = text.GetYOffset(); - //----- get string to be visualized and Calc its length - const char* vis_text = text.GetText(); - const int STR_LENGTH = strlen ( vis_text ); + //----- get string to be visualized and Calc its length + const char* vis_text = text.GetText(); + const int STR_LENGTH = strlen(vis_text); - //----- create buffer and copy the string there - int MAX_STR_LENGTH = COMMAND_BUF_SIZE - 100 ; - if ( MAX_STR_LENGTH <= 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "ERROR (FukuiRenderer) : Not enough buffer size for data transferring." << G4endl; - G4cout << " G4Text Visualization is aborted" << G4endl; - } - return ; - } - char* buf = new char [ (MAX_STR_LENGTH + 1) ] ; - if ( MAX_STR_LENGTH >= STR_LENGTH ) { - strcpy ( buf, vis_text ) ; - } else { - strncpy ( buf, vis_text, MAX_STR_LENGTH ) ; - } + //----- create buffer and copy the string there + int MAX_STR_LENGTH = COMMAND_BUF_SIZE - 100; + if(MAX_STR_LENGTH <= 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "ERROR (FukuiRenderer) : Not enough buffer size for data " + "transferring." + << G4endl; + G4cout << " G4Text Visualization is aborted" + << G4endl; + } + return; + } + char* buf = new char[(MAX_STR_LENGTH + 1)]; + if(MAX_STR_LENGTH >= STR_LENGTH) + { + strcpy(buf, vis_text); + } + else + { + strncpy(buf, vis_text, MAX_STR_LENGTH); + } - //----- select string command for 3D drawing - char text_command[32]; - switch (size_type) { - case world: - strcpy ( text_command, FR_MARK_TEXT_2D ); - break; - case screen: - default: - strcpy ( text_command, FR_MARK_TEXT_2DS ); - break; - } + //----- select string command for 3D drawing + char text_command[32]; + switch(size_type) + { + case world: + strcpy(text_command, FR_MARK_TEXT_2D); + break; + case screen: + default: + strcpy(text_command, FR_MARK_TEXT_2DS); + break; + } - //----- Send string command - if (fProcessing2D) { - // Map -1= G4VisManager::errors) - G4cout << "***** AddPrimitive( G4Circle )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive( G4Circle )\n"; #endif - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4FRSCENEHANDLER::AddPrimitive (const G4Circle&)", - "dawn0002", JustWarning, - "2D circles not implemented. Ignored."); - } - return; - } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + if(fProcessing2D) + { + static G4bool warned = false; + if(!warned) + { + warned = true; + G4Exception("G4FRSCENEHANDLER::AddPrimitive (const G4Circle&)", + "dawn0002", JustWarning, + "2D circles not implemented. Ignored."); + } + return; + } + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- send color - fpVisAttribs = mark_circle.GetVisAttributes(); - const G4Color& color = GetColor () ; - SendStrDouble3( FR_COLOR_RGB , - color.GetRed (), - color.GetGreen(), - color.GetBlue () ); + //----- send color + fpVisAttribs = mark_circle.GetVisAttributes(); + const G4Color& color = GetColor(); + SendStrDouble3(FR_COLOR_RGB, color.GetRed(), color.GetGreen(), + color.GetBlue()); - //----- send body coordinates - SendTransformedCoordinates(); + //----- send body coordinates + SendTransformedCoordinates(); - //----- Calc position - const G4Point3D& position = mark_circle.GetPosition () ; + //----- Calc position + const G4Point3D& position = mark_circle.GetPosition(); - //----- Calc size - MarkerSizeType size_type; - G4double size = GetMarkerRadius( mark_circle , size_type ); + //----- Calc size + MarkerSizeType size_type; + G4double size = GetMarkerRadius(mark_circle, size_type); - //----- send mark - switch (size_type) { - case world: - SendStrDouble4( FR_MARK_CIRCLE_2D, \ - position.x() , position.y() , position.z(), size ); - break; - default: - case screen: - SendStrDouble4( FR_MARK_CIRCLE_2DS, \ - position.x() , position.y() , position.z(), size ); - break; - } - -} // G4FRSCENEHANDLER::AddPrimitive ( mark_circle ) + //----- send mark + switch(size_type) + { + case world: + SendStrDouble4(FR_MARK_CIRCLE_2D, position.x(), position.y(), + position.z(), size); + break; + default: + case screen: + SendStrDouble4(FR_MARK_CIRCLE_2DS, position.x(), position.y(), + position.z(), size); + break; + } +} // G4FRSCENEHANDLER::AddPrimitive ( mark_circle ) //----- Add square -void G4FRSCENEHANDLER::AddPrimitive (const G4Square& mark_square ) +void G4FRSCENEHANDLER::AddPrimitive(const G4Square& mark_square) { - //----- + //----- #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive( G4Square )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive( G4Square )\n"; #endif - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4FRSCENEHANDLER::AddPrimitive (const G4Square&)", - "dawn0003", JustWarning, - "2D squares not implemented. Ignored."); - } - return; - } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + if(fProcessing2D) + { + static G4bool warned = false; + if(!warned) + { + warned = true; + G4Exception("G4FRSCENEHANDLER::AddPrimitive (const G4Square&)", + "dawn0003", JustWarning, + "2D squares not implemented. Ignored."); + } + return; + } + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- send color - fpVisAttribs = mark_square.GetVisAttributes(); - const G4Color& color = GetColor () ; - SendStrDouble3( FR_COLOR_RGB , - color.GetRed (), - color.GetGreen(), - color.GetBlue () ); + //----- send color + fpVisAttribs = mark_square.GetVisAttributes(); + const G4Color& color = GetColor(); + SendStrDouble3(FR_COLOR_RGB, color.GetRed(), color.GetGreen(), + color.GetBlue()); - //----- send body coordinates - SendTransformedCoordinates(); + //----- send body coordinates + SendTransformedCoordinates(); - //----- Calc position - const G4Point3D& position = mark_square.GetPosition () ; + //----- Calc position + const G4Point3D& position = mark_square.GetPosition(); - //----- Calc size - MarkerSizeType size_type; - G4double size = GetMarkerRadius( mark_square , size_type ); + //----- Calc size + MarkerSizeType size_type; + G4double size = GetMarkerRadius(mark_square, size_type); - //----- send mark - switch (size_type) { - case world: - SendStrDouble4( FR_MARK_SQUARE_2D, \ - position.x() , position.y() , position.z(), size ); - break; - default: - case screen: - SendStrDouble4( FR_MARK_SQUARE_2DS, \ - position.x() , position.y() , position.z(), size ); - break; - } - -} // G4FRSCENEHANDLER::AddPrimitive ( mark_square ) + //----- send mark + switch(size_type) + { + case world: + SendStrDouble4(FR_MARK_SQUARE_2D, position.x(), position.y(), + position.z(), size); + break; + default: + case screen: + SendStrDouble4(FR_MARK_SQUARE_2DS, position.x(), position.y(), + position.z(), size); + break; + } +} // G4FRSCENEHANDLER::AddPrimitive ( mark_square ) //----- Add polyhedron -void G4FRSCENEHANDLER::AddPrimitive ( const G4Polyhedron& polyhedron ) +void G4FRSCENEHANDLER::AddPrimitive(const G4Polyhedron& polyhedron) { - //----- + //----- #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive( G4Polyhedron )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive( G4Polyhedron )\n"; #endif - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4FRSCENEHANDLER::AddPrimitive (const G4Polyhedron&)", - "dawn0004", JustWarning, - "2D polyhedrons not implemented. Ignored."); + if(fProcessing2D) + { + static G4bool warned = false; + if(!warned) + { + warned = true; + G4Exception("G4FRSCENEHANDLER::AddPrimitive (const G4Polyhedron&)", + "dawn0004", JustWarning, + "2D polyhedrons not implemented. Ignored."); + } + return; + } + + if(polyhedron.GetNoFacets() == 0) + return; + + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); + + //----- Attributes + if(!SendVisAttributes( + fpViewer->GetApplicableVisAttributes(polyhedron.GetVisAttributes()))) + { + SendStr(FR_COLOR_RGB_RED); // color + } + + //----- Coordinates + SendTransformedCoordinates(); + + //----- Brep data + + //---------- (1) Declare beginning of Brep data + SendStr(FR_POLYHEDRON); + + //---------- (2) Vertex block + for(G4int i = 1, j = polyhedron.GetNoVertices(); j; j--, i++) + { + G4Point3D point = polyhedron.GetVertex(i); + SendStrDouble3(FR_VERTEX, point.x(), point.y(), point.z()); + } + + //---------- (3) Facet block + for(G4int f = polyhedron.GetNoFacets(); f; f--) + { + G4int notLastEdge; + G4int index = -1; // initialization + G4int edgeFlag = 1; + // G4int preedgeFlag = 1; Not used - comment out to prevent warnings (JA). + G4int work[4], i = 0; + do + { + // preedgeFlag = edgeFlag; Not used - comment out to prevent warnings + // (JA). + notLastEdge = polyhedron.GetNextVertexIndex(index, edgeFlag); + work[i++] = index; + } while(notLastEdge); + switch(i) + { + case 3: + SendStrInt3(FR_FACET, work[0], work[1], work[2]); + break; + case 4: + SendStrInt4(FR_FACET, work[0], work[1], work[2], work[3]); + break; + default: + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::AddPrimitive(G4Polyhedron)\n"; + G4PhysicalVolumeModel* pPVModel = + dynamic_cast(fpModel); + if(pPVModel) + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "Volume " << pPVModel->GetCurrentPV()->GetName() + << ", Solid " + << pPVModel->GetCurrentLV()->GetSolid()->GetName() << " (" + << pPVModel->GetCurrentLV()->GetSolid()->GetEntityType(); + G4cout << "\nG4Polyhedron facet with " << i << " edges" << G4endl; } - return; - } + } + } - if (polyhedron.GetNoFacets() == 0) return; + //---------- (4) Declare ending of Brep data + SendStr(FR_END_POLYHEDRON); - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); +} // G4FRSCENEHANDLER::AddPrimitive (polyhedron) - //----- Attributes - if(!SendVisAttributes( fpViewer->GetApplicableVisAttributes - (polyhedron.GetVisAttributes() ) ) ) { - SendStr( FR_COLOR_RGB_RED ); // color - } - - //----- Coordinates - SendTransformedCoordinates(); - - //----- Brep data - - //---------- (1) Declare beginning of Brep data - SendStr(FR_POLYHEDRON); - - //---------- (2) Vertex block - for (G4int i = 1, j = polyhedron.GetNoVertices(); j; j--, i++){ - G4Point3D point = polyhedron.GetVertex(i); - SendStrDouble3( FR_VERTEX, point.x (), point.y (), point.z ()); - } - - //---------- (3) Facet block - for (G4int f = polyhedron.GetNoFacets(); f; f--){ - G4int notLastEdge; - G4int index = -1; // initialization - G4int edgeFlag = 1; - //G4int preedgeFlag = 1; Not used - comment out to prevent warnings (JA). - G4int work[4], i = 0; - do { - //preedgeFlag = edgeFlag; Not used - comment out to prevent warnings (JA). - notLastEdge = polyhedron.GetNextVertexIndex(index, edgeFlag); - work[i++] = index; - }while (notLastEdge); - switch (i){ - case 3: - SendStrInt3(FR_FACET, work[0], work[1], work[2] ); - break; - case 4: - SendStrInt4(FR_FACET, work[0], work[1], work[2], work[3] ); - break; - default: - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << - "ERROR G4FRSCENEHANDLER::AddPrimitive(G4Polyhedron)\n"; - G4PhysicalVolumeModel* pPVModel = - dynamic_cast(fpModel); - if (pPVModel) - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << - "Volume " << pPVModel->GetCurrentPV()->GetName() << - ", Solid " << pPVModel->GetCurrentLV()->GetSolid()->GetName() << - " (" << pPVModel->GetCurrentLV()->GetSolid()->GetEntityType(); - G4cout << - "\nG4Polyhedron facet with " << i << " edges" << G4endl; - } - } - } - - //---------- (4) Declare ending of Brep data - SendStr(FR_END_POLYHEDRON); - -} // G4FRSCENEHANDLER::AddPrimitive (polyhedron) - - -//----- -void G4FRSCENEHANDLER::SendNdiv ( void ) +//----- +void G4FRSCENEHANDLER::SendNdiv(void) { -////////////////////////////////////////////////// -//#if defined DEBUG_FR_SCENE -// G4cout << "***** SendNdiv() (/Ndiv)" << G4endl; -//#endif -////////////////////////////////////////////////// + ////////////////////////////////////////////////// + //#if defined DEBUG_FR_SCENE + // G4cout << "***** SendNdiv() (/Ndiv)" << G4endl; + //#endif + ////////////////////////////////////////////////// - //----- local - G4int num_division = FR_DEFALUT_NDIV_VALUE ; + //----- local + G4int num_division = FR_DEFALUT_NDIV_VALUE; - //----- number used for dividing a curved surface, Ndiv - // if ( GetModel() ) { ?? Why test for model. Can be zero. JA ?? - const G4VisAttributes* pVisAttribs = - fpViewer -> GetApplicableVisAttributes (fpVisAttribs); - num_division = GetNoOfSides(pVisAttribs); - // } else { + //----- number used for dividing a curved surface, Ndiv + // if ( GetModel() ) { ?? Why test for model. Can be zero. JA ?? + const G4VisAttributes* pVisAttribs = + fpViewer->GetApplicableVisAttributes(fpVisAttribs); + num_division = GetNoOfSides(pVisAttribs); + // } else { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "WARNING: GetNoOfSides() failed. " ; - G4cout << "The default value " << num_division ; - G4cout << " is assigned." << G4endl; - } + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "WARNING: GetNoOfSides() failed. "; + G4cout << "The default value " << num_division; + G4cout << " is assigned." << G4endl; + } #endif - //} + //} - //---------- Error recovery for too small Ndiv - num_division = ( num_division < 3 ? 3 : num_division ); - -////////////////////////////////////////////////// -//#if defined DEBUG_FR_SCENE -// G4cout << "Ndiv = " << num_division << G4endl; -//#endif -////////////////////////////////////////////////// - - //----- Send resultant Ndiv - this->SendStrInt( FR_NDIV, num_division ); + //---------- Error recovery for too small Ndiv + num_division = (num_division < 3 ? 3 : num_division); + ////////////////////////////////////////////////// + //#if defined DEBUG_FR_SCENE + // G4cout << "Ndiv = " << num_division << G4endl; + //#endif + ////////////////////////////////////////////////// + //----- Send resultant Ndiv + this->SendStrInt(FR_NDIV, num_division); } -//----- -void G4FRSCENEHANDLER::FREndModeling () +//----- +void G4FRSCENEHANDLER::FREndModeling() { - //----- + //----- #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** FREndModeling (called)" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** FREndModeling (called)" << G4endl; #endif - if( FRIsInModeling() ) { - + if(FRIsInModeling()) + { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "***** FREndModeling (started) " ; - G4cout << "(/EndModeling, /DrawAll, /CloseDevice)" << G4endl; - } + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "***** FREndModeling (started) "; + G4cout << "(/EndModeling, /DrawAll, /CloseDevice)" << G4endl; + } #endif - SendStr( "#--------------------" ); + SendStr("#--------------------"); - //----- !EndModeling - SendStr( FR_END_MODELING ); + //----- !EndModeling + SendStr(FR_END_MODELING); - //----- !DrawAll - SendStr( FR_DRAW_ALL ); + //----- !DrawAll + SendStr(FR_DRAW_ALL); - //----- !CloseDevice - SendStr( FR_CLOSE_DEVICE ); + //----- !CloseDevice + SendStr(FR_CLOSE_DEVICE); - //----- End saving data to g4.prim - EndSavingG4Prim() ; + //----- End saving data to g4.prim + EndSavingG4Prim(); - //------ Reset flag - FRflag_in_modeling = false ; - } + //------ Reset flag + FRflag_in_modeling = false; + } } - -//----- -void G4FRSCENEHANDLER::BeginPrimitives (const G4Transform3D& objectTransformation) +//----- +void G4FRSCENEHANDLER::BeginPrimitives( + const G4Transform3D& objectTransformation) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** BeginPrimitives \n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** BeginPrimitives \n"; #endif FRBeginModeling(); - G4VSceneHandler::BeginPrimitives (objectTransformation); + G4VSceneHandler::BeginPrimitives(objectTransformation); } - -//----- -void G4FRSCENEHANDLER::EndPrimitives () +//----- +void G4FRSCENEHANDLER::EndPrimitives() { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** EndPrimitives \n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** EndPrimitives \n"; #endif - G4VSceneHandler::EndPrimitives (); + G4VSceneHandler::EndPrimitives(); } - //========== AddSolid() functions ==========// //----- Add box -void G4FRSCENEHANDLER::AddSolid( const G4Box& box ) +void G4FRSCENEHANDLER::AddSolid(const G4Box& box) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid ( box )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid ( box )\n"; #endif - //----- skip drawing invisible primitive - if( !IsVisible() ) { return ; } + //----- skip drawing invisible primitive + if(!IsVisible()) + { + return; + } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- Send Name - SendPhysVolName(); + //----- Send Name + SendPhysVolName(); - //----- Send Ndiv - // SendNdiv(); + //----- Send Ndiv + // SendNdiv(); - //----- Attributes - if(!SendVisAttributes - ( fpViewer->GetApplicableVisAttributes( fpVisAttribs ) ) ) { - SendStr( FR_COLOR_RGB_GREEN ); // color - } + //----- Attributes + if(!SendVisAttributes(fpViewer->GetApplicableVisAttributes(fpVisAttribs))) + { + SendStr(FR_COLOR_RGB_GREEN); // color + } - //----- parameters (half lengths of box) - G4double dx = box.GetXHalfLength (); - G4double dy = box.GetYHalfLength (); - G4double dz = box.GetZHalfLength (); - - //----- send coordinates to Fukui Renderer - SendTransformedCoordinates(); + //----- parameters (half lengths of box) + G4double dx = box.GetXHalfLength(); + G4double dy = box.GetYHalfLength(); + G4double dz = box.GetZHalfLength(); - //----- send box to Fukui Renderer - SendStrDouble3( FR_BOX, dx, dy, dz ); + //----- send coordinates to Fukui Renderer + SendTransformedCoordinates(); -} // void G4FRSCENEHANDLER::AddSolid( const G4Box& box ) + //----- send box to Fukui Renderer + SendStrDouble3(FR_BOX, dx, dy, dz); +} // void G4FRSCENEHANDLER::AddSolid( const G4Box& box ) //----- Add tubes -void -G4FRSCENEHANDLER::AddSolid( const G4Tubs& tubes ) +void G4FRSCENEHANDLER::AddSolid(const G4Tubs& tubes) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid ( tubes )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid ( tubes )\n"; #endif - //----- skip drawing invisible primitive - if( !IsVisible() ) { return ; } + //----- skip drawing invisible primitive + if(!IsVisible()) + { + return; + } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- Send Name - SendPhysVolName(); + //----- Send Name + SendPhysVolName(); - //----- Send Ndiv - SendNdiv(); + //----- Send Ndiv + SendNdiv(); - //----- Attributes - if(!SendVisAttributes - ( fpViewer->GetApplicableVisAttributes( fpVisAttribs ) ) ) { - SendStr( FR_COLOR_RGB_BLUE ); // color - } + //----- Attributes + if(!SendVisAttributes(fpViewer->GetApplicableVisAttributes(fpVisAttribs))) + { + SendStr(FR_COLOR_RGB_BLUE); // color + } - //----- parameters - const G4double R = tubes.GetOuterRadius() ; // outside radius - const G4double r = tubes.GetInnerRadius() ; // inside radius - const G4double dz = tubes.GetZHalfLength() ; // half length in z - const G4double sphi = tubes.GetStartPhiAngle() ; // starting angle - const G4double dphi = tubes.GetDeltaPhiAngle() ; // angle width + //----- parameters + const G4double R = tubes.GetOuterRadius(); // outside radius + const G4double r = tubes.GetInnerRadius(); // inside radius + const G4double dz = tubes.GetZHalfLength(); // half length in z + const G4double sphi = tubes.GetStartPhiAngle(); // starting angle + const G4double dphi = tubes.GetDeltaPhiAngle(); // angle width - //----- send coordinates to Fukui Renderer - SendTransformedCoordinates(); - - //----- send tubes to Fukui Renderer - SendStrDouble5( FR_TUBS, r, R, dz , sphi, dphi ); - -} // void G4FRSCENEHANDLER::AddSolid( const G4Tubs& ) + //----- send coordinates to Fukui Renderer + SendTransformedCoordinates(); + //----- send tubes to Fukui Renderer + SendStrDouble5(FR_TUBS, r, R, dz, sphi, dphi); +} // void G4FRSCENEHANDLER::AddSolid( const G4Tubs& ) //----- Add cons -void -G4FRSCENEHANDLER::AddSolid( const G4Cons& cons ) +void G4FRSCENEHANDLER::AddSolid(const G4Cons& cons) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid ( cons )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid ( cons )\n"; #endif - //----- skip drawing invisible primitive - if( !IsVisible() ) { return ; } + //----- skip drawing invisible primitive + if(!IsVisible()) + { + return; + } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- Send Name - SendPhysVolName(); + //----- Send Name + SendPhysVolName(); - //----- Send Ndiv - SendNdiv(); + //----- Send Ndiv + SendNdiv(); - //----- Attributes - if(!SendVisAttributes - ( fpViewer->GetApplicableVisAttributes( fpVisAttribs ) ) ) { - SendStr( FR_COLOR_RGB_CYAN ); // color - } + //----- Attributes + if(!SendVisAttributes(fpViewer->GetApplicableVisAttributes(fpVisAttribs))) + { + SendStr(FR_COLOR_RGB_CYAN); // color + } - //----- parameters - const G4double r1 = cons.GetInnerRadiusMinusZ() ; // inside radius at -dz - const G4double R1 = cons.GetOuterRadiusMinusZ() ; // outside radius at -dz - const G4double r2 = cons.GetInnerRadiusPlusZ() ; // inside radius at +dz - const G4double R2 = cons.GetOuterRadiusPlusZ() ; // outside radius at +dz - const G4double dz = cons.GetZHalfLength () ; // half length in z - const G4double sphi = cons.GetStartPhiAngle() ; // starting angle - const G4double dphi = cons.GetDeltaPhiAngle() ; // angle width + //----- parameters + const G4double r1 = cons.GetInnerRadiusMinusZ(); // inside radius at -dz + const G4double R1 = cons.GetOuterRadiusMinusZ(); // outside radius at -dz + const G4double r2 = cons.GetInnerRadiusPlusZ(); // inside radius at +dz + const G4double R2 = cons.GetOuterRadiusPlusZ(); // outside radius at +dz + const G4double dz = cons.GetZHalfLength(); // half length in z + const G4double sphi = cons.GetStartPhiAngle(); // starting angle + const G4double dphi = cons.GetDeltaPhiAngle(); // angle width - //----- send coordinates to Fukui Renderer - SendTransformedCoordinates(); + //----- send coordinates to Fukui Renderer + SendTransformedCoordinates(); - //----- send cons to Fukui Renderer - SendStrDouble7( FR_CONS, r1, R1, r2, R2, dz , sphi, dphi ); - -}// G4FRSCENEHANDLER::AddSolid( cons ) + //----- send cons to Fukui Renderer + SendStrDouble7(FR_CONS, r1, R1, r2, R2, dz, sphi, dphi); +} // G4FRSCENEHANDLER::AddSolid( cons ) //----- Add trd -void G4FRSCENEHANDLER::AddSolid ( const G4Trd& trd ) +void G4FRSCENEHANDLER::AddSolid(const G4Trd& trd) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid ( trd )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid ( trd )\n"; #endif - //----- skip drawing invisible primitive - if( !IsVisible() ) { return ; } + //----- skip drawing invisible primitive + if(!IsVisible()) + { + return; + } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- Send Name - SendPhysVolName(); + //----- Send Name + SendPhysVolName(); - //----- Send Ndiv - // SendNdiv(); + //----- Send Ndiv + // SendNdiv(); - //----- Attributes - if(!SendVisAttributes - ( fpViewer->GetApplicableVisAttributes( fpVisAttribs ) ) ) { - SendStr( FR_COLOR_RGB_MAGENTA ); // color - } + //----- Attributes + if(!SendVisAttributes(fpViewer->GetApplicableVisAttributes(fpVisAttribs))) + { + SendStr(FR_COLOR_RGB_MAGENTA); // color + } - //----- parameters - G4double dx1 = trd.GetXHalfLength1 (); - G4double dx2 = trd.GetXHalfLength2 (); - G4double dy1 = trd.GetYHalfLength1 (); - G4double dy2 = trd.GetYHalfLength2 (); - G4double dz = trd.GetZHalfLength (); - - //----- send coordinates to Fukui Renderer - SendTransformedCoordinates(); + //----- parameters + G4double dx1 = trd.GetXHalfLength1(); + G4double dx2 = trd.GetXHalfLength2(); + G4double dy1 = trd.GetYHalfLength1(); + G4double dy2 = trd.GetYHalfLength2(); + G4double dz = trd.GetZHalfLength(); - //----- send trd to Fukui Renderer - SendStrDouble5( FR_TRD, dx1, dx2, dy1, dy2, dz ); + //----- send coordinates to Fukui Renderer + SendTransformedCoordinates(); -} // G4FRSCENEHANDLER::AddSolid ( trd ) + //----- send trd to Fukui Renderer + SendStrDouble5(FR_TRD, dx1, dx2, dy1, dy2, dz); +} // G4FRSCENEHANDLER::AddSolid ( trd ) //----- Add sphere -void G4FRSCENEHANDLER::AddSolid ( const G4Sphere& sphere ) +void G4FRSCENEHANDLER::AddSolid(const G4Sphere& sphere) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid ( sphere )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid ( sphere )\n"; #endif - //----- skip drawing invisible primitive - if( !IsVisible() ) { return ; } + //----- skip drawing invisible primitive + if(!IsVisible()) + { + return; + } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- Send Name - SendPhysVolName(); + //----- Send Name + SendPhysVolName(); - //----- Send Ndiv - SendNdiv(); + //----- Send Ndiv + SendNdiv(); - //----- Attributes - if(!SendVisAttributes - ( fpViewer->GetApplicableVisAttributes( fpVisAttribs ) ) ) { - SendStr( FR_COLOR_RGB_YELLOW ); // color - } + //----- Attributes + if(!SendVisAttributes(fpViewer->GetApplicableVisAttributes(fpVisAttribs))) + { + SendStr(FR_COLOR_RGB_YELLOW); // color + } - //----- parameters -// const G4double rmin = sphere.GetInnerRadius(); - const G4double rmax = sphere.GetOuterRadius(); -// const G4double sphi = sphere.GetStartPhiAngle(); - const G4double dphi = sphere.GetDeltaPhiAngle(); -// const G4double stheta = sphere.GetStartThetaAngle(); - const G4double dtheta = sphere.GetDeltaThetaAngle(); + //----- parameters + // const G4double rmin = sphere.GetInnerRadius(); + const G4double rmax = sphere.GetOuterRadius(); + // const G4double sphi = sphere.GetStartPhiAngle(); + const G4double dphi = sphere.GetDeltaPhiAngle(); + // const G4double stheta = sphere.GetStartThetaAngle(); + const G4double dtheta = sphere.GetDeltaThetaAngle(); - //----- send coordinates to Fukui Renderer - SendTransformedCoordinates(); + //----- send coordinates to Fukui Renderer + SendTransformedCoordinates(); - //----- send sphere to Fukui Renderer - const G4double PI_minus = 0.9999 * CLHEP::pi ; - const G4double PI2_minus = 1.9999 * CLHEP::pi ; - if( dphi > PI2_minus && dtheta > PI_minus ) { - //----- full sphere - SendStrDouble ( FR_SPHERE, rmax ); - } else { + //----- send sphere to Fukui Renderer + const G4double PI_minus = 0.9999 * CLHEP::pi; + const G4double PI2_minus = 1.9999 * CLHEP::pi; + if(dphi > PI2_minus && dtheta > PI_minus) + { + //----- full sphere + SendStrDouble(FR_SPHERE, rmax); + } + else + { + //----- call AddPrimitives( G4Polyhedron ) + //...... For sphere "segment", + //...... G4Polyhedron is used for visualization. + //...... Visualization attributes and + //...... local coordinates are resent and overwritten. + G4VSceneHandler::AddSolid(sphere); - //----- call AddPrimitives( G4Polyhedron ) - //...... For sphere "segment", - //...... G4Polyhedron is used for visualization. - //...... Visualization attributes and - //...... local coordinates are resent and overwritten. - G4VSceneHandler::AddSolid( sphere ) ; - -//////////////////////////////////////////////////////////////// -// //----- sphere segment -// SendStrDouble6( FR_SPHERE_SEG, rmin, rmax, stheta, dtheta, sphi, dphi ); -//////////////////////////////////////////////////////////////// - - } - -} // G4FRSCENEHANDLER::AddSolid ( sphere ) + //////////////////////////////////////////////////////////////// + // //----- sphere segment + // SendStrDouble6( FR_SPHERE_SEG, rmin, rmax, stheta, dtheta, sphi, dphi + //); + //////////////////////////////////////////////////////////////// + } +} // G4FRSCENEHANDLER::AddSolid ( sphere ) //----- Add para -void G4FRSCENEHANDLER::AddSolid (const G4Para& para) +void G4FRSCENEHANDLER::AddSolid(const G4Para& para) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid ( para )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid ( para )\n"; #endif - //----- skip drawing invisible primitive - if( !IsVisible() ) { return ; } + //----- skip drawing invisible primitive + if(!IsVisible()) + { + return; + } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- Send Name - SendPhysVolName(); + //----- Send Name + SendPhysVolName(); - //----- Send Ndiv - // SendNdiv(); + //----- Send Ndiv + // SendNdiv(); - //----- Attributes - if(!SendVisAttributes - ( fpViewer->GetApplicableVisAttributes( fpVisAttribs ) ) ) { - SendStr( FR_COLOR_RGB_RED ); // color - } + //----- Attributes + if(!SendVisAttributes(fpViewer->GetApplicableVisAttributes(fpVisAttribs))) + { + SendStr(FR_COLOR_RGB_RED); // color + } - //----- local - const G4double epsilon = 1.0e-5 ; + //----- local + const G4double epsilon = 1.0e-5; - //----- parameters preprocessing - G4double cosTheta = para.GetSymAxis().z() ; - if( cosTheta < epsilon ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "WARNING from FukuiRenderer (DAWN) driver:" << G4endl; - G4cout << " Invalid parameter for parallelepiped." << G4endl; - G4cout << " Drawing is skipped." << G4endl; - } - return ; - } - G4double tanTheta_cosPhi_cosTheta = para.GetSymAxis().x() ; - G4double tanTheta_sinPhi_cosTheta = para.GetSymAxis().y() ; + //----- parameters preprocessing + G4double cosTheta = para.GetSymAxis().z(); + if(cosTheta < epsilon) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "WARNING from FukuiRenderer (DAWN) driver:" << G4endl; + G4cout << " Invalid parameter for parallelepiped." << G4endl; + G4cout << " Drawing is skipped." << G4endl; + } + return; + } + G4double tanTheta_cosPhi_cosTheta = para.GetSymAxis().x(); + G4double tanTheta_sinPhi_cosTheta = para.GetSymAxis().y(); - //----- parameters - G4double dx = para.GetXHalfLength (); - G4double dy = para.GetYHalfLength (); - G4double dz = para.GetZHalfLength (); - G4double tanAlpha = para.GetTanAlpha(); - G4double tanTheta_cosPhi = tanTheta_cosPhi_cosTheta / cosTheta ; - G4double tanTheta_sinPhi = tanTheta_sinPhi_cosTheta / cosTheta ; + //----- parameters + G4double dx = para.GetXHalfLength(); + G4double dy = para.GetYHalfLength(); + G4double dz = para.GetZHalfLength(); + G4double tanAlpha = para.GetTanAlpha(); + G4double tanTheta_cosPhi = tanTheta_cosPhi_cosTheta / cosTheta; + G4double tanTheta_sinPhi = tanTheta_sinPhi_cosTheta / cosTheta; - //----- send coordinates to Fukui Renderer - SendTransformedCoordinates(); + //----- send coordinates to Fukui Renderer + SendTransformedCoordinates(); - //----- send data to Fukui Renderer - SendStrDouble6 ( FR_PARA, dx, dy, dz, tanAlpha, tanTheta_cosPhi, tanTheta_sinPhi ); - -} // G4FRSCENEHANDLER::AddSolid ( para ) + //----- send data to Fukui Renderer + SendStrDouble6(FR_PARA, dx, dy, dz, tanAlpha, tanTheta_cosPhi, + tanTheta_sinPhi); +} // G4FRSCENEHANDLER::AddSolid ( para ) //----- Add trap -void G4FRSCENEHANDLER::AddSolid (const G4Trap& trap) +void G4FRSCENEHANDLER::AddSolid(const G4Trap& trap) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid ( trap )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid ( trap )\n"; #endif - //----- skip drawing invisible primitive - if( !IsVisible() ) { return ; } + //----- skip drawing invisible primitive + if(!IsVisible()) + { + return; + } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- Send Name - SendPhysVolName(); + //----- Send Name + SendPhysVolName(); - //----- Send Ndiv - // SendNdiv(); + //----- Send Ndiv + // SendNdiv(); - //----- Attributes - if(!SendVisAttributes - ( fpViewer->GetApplicableVisAttributes( fpVisAttribs ) ) ) { - SendStr( FR_COLOR_RGB_GREEN ); // color - } + //----- Attributes + if(!SendVisAttributes(fpViewer->GetApplicableVisAttributes(fpVisAttribs))) + { + SendStr(FR_COLOR_RGB_GREEN); // color + } - //----- local - const G4double epsilon = 1.0e-5 ; + //----- local + const G4double epsilon = 1.0e-5; - //----- parameters preprocessing - G4double cosTheta = trap.GetSymAxis().z() ; - if( cosTheta < epsilon ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "WARNING from FukuiRenderer (DAWN) driver:" << G4endl; - G4cout << " Invalid parameter for trap, 1" << G4endl; - G4cout << " Drawing is skipped." << G4endl; - } - return ; - } + //----- parameters preprocessing + G4double cosTheta = trap.GetSymAxis().z(); + if(cosTheta < epsilon) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "WARNING from FukuiRenderer (DAWN) driver:" << G4endl; + G4cout << " Invalid parameter for trap, 1" << G4endl; + G4cout << " Drawing is skipped." << G4endl; + } + return; + } - G4double nx = trap.GetSymAxis().x() ; - G4double ny = trap.GetSymAxis().y() ; + G4double nx = trap.GetSymAxis().x(); + G4double ny = trap.GetSymAxis().y(); - //----- parameters (half lengths of box) - G4double dz = trap.GetZHalfLength (); - G4double theta = std::acos( cosTheta ) ; - G4double phi; - if ( ny==0. && nx ==0.) { - phi = 0.; // std::atan2(0.,0.) gives undefined value of phi - } else { - phi = std::atan2( ny, nx ) ; if( phi < 0. ) { phi += CLHEP::twopi ; } - // -PI < std::atan() < PI - } -///////////////////////////////////////////////// -// G4double phi = std::atan2( ny, nx ) ; -// if( phi < 0.0 ) { phi += CLHEP::twopi ; } -// // -PI < std::atan() < PI -///////////////////////////////////////////////// + //----- parameters (half lengths of box) + G4double dz = trap.GetZHalfLength(); + G4double theta = std::acos(cosTheta); + G4double phi; + if(ny == 0. && nx == 0.) + { + phi = 0.; // std::atan2(0.,0.) gives undefined value of phi + } + else + { + phi = std::atan2(ny, nx); + if(phi < 0.) + { + phi += CLHEP::twopi; + } + // -PI < std::atan() < PI + } + ///////////////////////////////////////////////// + // G4double phi = std::atan2( ny, nx ) ; + // if( phi < 0.0 ) { phi += CLHEP::twopi ; } + // // -PI < std::atan() < PI + ///////////////////////////////////////////////// - G4double h1 = trap.GetYHalfLength1 (); - G4double bl1 = trap.GetXHalfLength1 (); - G4double tl1 = trap.GetXHalfLength2 (); - G4double alpha1 = std::atan( trap.GetTanAlpha1()) ; - G4double h2 = trap.GetYHalfLength2 (); - G4double bl2 = trap.GetXHalfLength3 (); - G4double tl2 = trap.GetXHalfLength4 (); - G4double alpha2 = std::atan( trap.GetTanAlpha2()) ; + G4double h1 = trap.GetYHalfLength1(); + G4double bl1 = trap.GetXHalfLength1(); + G4double tl1 = trap.GetXHalfLength2(); + G4double alpha1 = std::atan(trap.GetTanAlpha1()); + G4double h2 = trap.GetYHalfLength2(); + G4double bl2 = trap.GetXHalfLength3(); + G4double tl2 = trap.GetXHalfLength4(); + G4double alpha2 = std::atan(trap.GetTanAlpha2()); - //----- send coordinates to Fukui Renderer - SendTransformedCoordinates(); + //----- send coordinates to Fukui Renderer + SendTransformedCoordinates(); - //----- Change sign of alpha for compatibility - // with the DAWN format - G4double alpha_sign = -1.0 ; - alpha1 *= alpha_sign ; alpha2 *= alpha_sign ; + //----- Change sign of alpha for compatibility + // with the DAWN format + G4double alpha_sign = -1.0; + alpha1 *= alpha_sign; + alpha2 *= alpha_sign; - //----- send box to Fukui Renderer - SendStrDouble11( FR_TRAP , - dz , - theta , - phi , - h1 , - bl1 , - tl1 , - alpha1 , - h2 , - bl2 , - tl2 , - alpha2 ); - -} // G4FRSCENEHANDLER::AddSolid (const G4Trap& trap) + //----- send box to Fukui Renderer + SendStrDouble11(FR_TRAP, dz, theta, phi, h1, bl1, tl1, alpha1, h2, bl2, tl2, + alpha2); +} // G4FRSCENEHANDLER::AddSolid (const G4Trap& trap) //----- Add torus -void -G4FRSCENEHANDLER::AddSolid( const G4Torus& torus ) +void G4FRSCENEHANDLER::AddSolid(const G4Torus& torus) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid ( torus )\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid ( torus )\n"; #endif - //----- skip drawing invisible primitive - if( !IsVisible() ) { return ; } + //----- skip drawing invisible primitive + if(!IsVisible()) + { + return; + } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- Send Name - SendPhysVolName(); + //----- Send Name + SendPhysVolName(); - //----- Send Ndiv - SendNdiv(); + //----- Send Ndiv + SendNdiv(); - //----- Attributes - if(!SendVisAttributes - ( fpViewer->GetApplicableVisAttributes( fpVisAttribs ) ) ) { - SendStr( FR_COLOR_RGB_BLUE ); // color - } + //----- Attributes + if(!SendVisAttributes(fpViewer->GetApplicableVisAttributes(fpVisAttribs))) + { + SendStr(FR_COLOR_RGB_BLUE); // color + } - //----- parameters - const G4double r = torus.GetRmin() ; - const G4double R = torus.GetRmax() ; - const G4double t = torus.GetRtor() ; - const G4double sphi = torus.GetSPhi() ; - const G4double dphi = torus.GetDPhi() ; + //----- parameters + const G4double r = torus.GetRmin(); + const G4double R = torus.GetRmax(); + const G4double t = torus.GetRtor(); + const G4double sphi = torus.GetSPhi(); + const G4double dphi = torus.GetDPhi(); - //----- send coordinates to Fukui Renderer - SendTransformedCoordinates(); - - //----- send torus to Fukui Renderer - SendStrDouble5( FR_TORUS, r, R, t , sphi, dphi ); - -} // void G4FRSCENEHANDLER::AddSolid( const G4Torus& ) + //----- send coordinates to Fukui Renderer + SendTransformedCoordinates(); + //----- send torus to Fukui Renderer + SendStrDouble5(FR_TORUS, r, R, t, sphi, dphi); +} // void G4FRSCENEHANDLER::AddSolid( const G4Torus& ) //----- Add a shape which is not treated above -void G4FRSCENEHANDLER::AddSolid ( const G4VSolid& solid ) +void G4FRSCENEHANDLER::AddSolid(const G4VSolid& solid) { - //----- skip drawing invisible primitive - if( !IsVisible() ) { return ; } + //----- skip drawing invisible primitive + if(!IsVisible()) + { + return; + } - //----- Initialize Fukui Renderer IF NECESSARY - FRBeginModeling(); + //----- Initialize Fukui Renderer IF NECESSARY + FRBeginModeling(); - //----- Send Name - SendPhysVolName() ; + //----- Send Name + SendPhysVolName(); - //----- Send Ndiv - // SendNdiv(); + //----- Send Ndiv + // SendNdiv(); - //----- Send a primitive - G4VSceneHandler::AddSolid( solid ) ; + //----- Send a primitive + G4VSceneHandler::AddSolid(solid); -} //G4FRSCENEHANDLER::AddSolid ( const G4VSolid& ) +} // G4FRSCENEHANDLER::AddSolid ( const G4VSolid& ) - -//----- -G4bool -G4FRSCENEHANDLER::SendVisAttributes ( const G4VisAttributes* pAV ) +//----- +G4bool G4FRSCENEHANDLER::SendVisAttributes(const G4VisAttributes* pAV) { - // Have a look at G4VSceneHandler::GetDrawingStyle (const G4Visible&). (John) - G4bool status = true ; // initialization - const G4double ALPHA_MIN = 0.001 ; // min of alpha factor of color + G4bool status = true; // initialization + const G4double ALPHA_MIN = 0.001; // min of alpha factor of color - if( pAV == NULL ) { - // No attribute is given. - // Do nothing. Status is "fail". - status = false ; - - } else { - // Send attributes. Status is "success". - status = true ; + if(pAV == NULL) + { + // No attribute is given. + // Do nothing. Status is "fail". + status = false; + } + else + { + // Send attributes. Status is "success". + status = true; const G4Color& color = pAV->GetColor(); - SendStrDouble3( FR_COLOR_RGB, - color.GetRed (), - color.GetGreen(), - color.GetBlue () ); - if ( color.GetAlpha() < ALPHA_MIN ) { - SendStr( FR_FORCE_WIREFRAME_ON ) ; - } - else if ( pAV->IsForceDrawingStyle () && - (pAV->GetForcedDrawingStyle () == G4VisAttributes::wireframe)) { - SendStr( FR_FORCE_WIREFRAME_ON ) ; - } else { - SendStr( FR_FORCE_WIREFRAME_OFF ) ; + SendStrDouble3(FR_COLOR_RGB, color.GetRed(), color.GetGreen(), + color.GetBlue()); + if(color.GetAlpha() < ALPHA_MIN) + { + SendStr(FR_FORCE_WIREFRAME_ON); } - } + else if(pAV->IsForceDrawingStyle() && + (pAV->GetForcedDrawingStyle() == G4VisAttributes::wireframe)) + { + SendStr(FR_FORCE_WIREFRAME_ON); + } + else + { + SendStr(FR_FORCE_WIREFRAME_OFF); + } + } - return status ; + return status; -} // G4FRSCENEHANDLER::SendVisAttributes () +} // G4FRSCENEHANDLER::SendVisAttributes () - -//----- +//----- G4bool G4FRSCENEHANDLER::IsVisible() { - //----- - G4bool visibility = true ; + //----- + G4bool visibility = true; - //----- - const G4VisAttributes* pVisAttribs = - fpViewer->GetApplicableVisAttributes( fpVisAttribs ); + //----- + const G4VisAttributes* pVisAttribs = + fpViewer->GetApplicableVisAttributes(fpVisAttribs); - //----- - if( ( std::getenv( FR_ENV_CULL_INVISIBLE_OBJECTS ) != NULL ) && \ - ( strcmp( std::getenv( FR_ENV_CULL_INVISIBLE_OBJECTS ),"0" ) ) && \ - ( pVisAttribs ) ) - { - visibility = pVisAttribs->IsVisible(); - } + //----- + if((std::getenv(FR_ENV_CULL_INVISIBLE_OBJECTS) != NULL) && + (strcmp(std::getenv(FR_ENV_CULL_INVISIBLE_OBJECTS), "0")) && (pVisAttribs)) + { + visibility = pVisAttribs->IsVisible(); + } - //----- - return visibility ; + //----- + return visibility; -} // G4FRSCENEHANDLER::IsVisible() +} // G4FRSCENEHANDLER::IsVisible() - -//----- -void G4FRSCENEHANDLER::SendBoundingBox( void ) +//----- +void G4FRSCENEHANDLER::SendBoundingBox(void) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** SendBoundingBox () (/BoundingBox)" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** SendBoundingBox () (/BoundingBox)" << G4endl; #endif - //----- (1A) CALC bounding box of the bounding sphere - const G4VisExtent& extent = GetScene()->GetExtent(); - const G4Point3D& center = extent.GetExtentCenter(); - const G4double radius = extent.GetExtentRadius(); + //----- (1A) CALC bounding box of the bounding sphere + const G4VisExtent& extent = GetScene()->GetExtent(); + const G4Point3D& center = extent.GetExtentCenter(); + const G4double radius = extent.GetExtentRadius(); - G4double xmin = center.x() - radius ; - G4double ymin = center.y() - radius ; - G4double zmin = center.z() - radius ; + G4double xmin = center.x() - radius; + G4double ymin = center.y() - radius; + G4double zmin = center.z() - radius; - G4double xmax = center.x() + radius ; - G4double ymax = center.y() + radius ; - G4double zmax = center.z() + radius ; + G4double xmax = center.x() + radius; + G4double ymax = center.y() + radius; + G4double zmax = center.z() + radius; -//////////////////////////////////////////// -// G4double xmin = extent.GetXmin (); -// G4double ymin = extent.GetYmin (); -// G4double zmin = extent.GetZmin (); -// G4double xmax = extent.GetXmax (); -// G4double ymax = extent.GetYmax (); -// G4double zmax = extent.GetZmax (); -//////////////////////////////////////////// + //////////////////////////////////////////// + // G4double xmin = extent.GetXmin (); + // G4double ymin = extent.GetYmin (); + // G4double zmin = extent.GetZmin (); + // G4double xmax = extent.GetXmax (); + // G4double ymax = extent.GetYmax (); + // G4double zmax = extent.GetZmax (); + //////////////////////////////////////////// - //----- (1B) SEND bounding box - SendStrDouble6( FR_BOUNDING_BOX, - xmin, ymin, zmin, - xmax, ymax, zmax ); + //----- (1B) SEND bounding box + SendStrDouble6(FR_BOUNDING_BOX, xmin, ymin, zmin, xmax, ymax, zmax); -} // G4FRSCENEHANDLER::SendBoundingBox() +} // G4FRSCENEHANDLER::SendBoundingBox() - -//----- -void -G4FRSCENEHANDLER::SendTransformedCoordinates() +//----- +void G4FRSCENEHANDLER::SendTransformedCoordinates() { - //----- coord info - G4Point3D zero ( 0.0 , 0.0 , 0.0 ); - G4Point3D x1 ( 1.0 , 0.0 , 0.0 ); - G4Point3D y1 ( 0.0 , 1.0 , 0.0 ); - G4Vector3D x_unit_vec( 1.0 , 0.0 , 0.0 ); - G4Vector3D y_unit_vec( 0.0 , 1.0 , 0.0 ); + //----- coord info + G4Point3D zero(0.0, 0.0, 0.0); + G4Point3D x1(1.0, 0.0, 0.0); + G4Point3D y1(0.0, 1.0, 0.0); + G4Vector3D x_unit_vec(1.0, 0.0, 0.0); + G4Vector3D y_unit_vec(0.0, 1.0, 0.0); - //----- transformed origin - zero.transform( fObjectTransformation ); + //----- transformed origin + zero.transform(fObjectTransformation); - //----- transformed base vectors - x1.transform( fObjectTransformation ); - x_unit_vec = x1 - zero ; - y1.transform( fObjectTransformation ); - y_unit_vec = y1 - zero ; + //----- transformed base vectors + x1.transform(fObjectTransformation); + x_unit_vec = x1 - zero; + y1.transform(fObjectTransformation); + y_unit_vec = y1 - zero; - //----- send transformed origin - SendStrDouble3( FR_ORIGIN , (zero.x()), (zero.y()), (zero.z()) ) ; + //----- send transformed origin + SendStrDouble3(FR_ORIGIN, (zero.x()), (zero.y()), (zero.z())); - //----- send transformed base vectors - SendStrDouble6( FR_BASE_VECTOR , \ - (x_unit_vec.x()), (x_unit_vec.y()), (x_unit_vec.z()) , \ - (y_unit_vec.x()), (y_unit_vec.y()), (y_unit_vec.z()) ) ; + //----- send transformed base vectors + SendStrDouble6(FR_BASE_VECTOR, (x_unit_vec.x()), (x_unit_vec.y()), + (x_unit_vec.z()), (y_unit_vec.x()), (y_unit_vec.y()), + (y_unit_vec.z())); -} // G4FRSCENEHANDLER::SendTransformedCoordinates() +} // G4FRSCENEHANDLER::SendTransformedCoordinates() - -//----- -void G4FRSCENEHANDLER::SendPhysVolName ( void ) +//----- +void G4FRSCENEHANDLER::SendPhysVolName(void) { - // Local - G4int i ; + // Local + G4int i; - // Current Model - const G4VModel* pv_model = GetModel(); - if (!pv_model) { return ; } + // Current Model + const G4VModel* pv_model = GetModel(); + if(!pv_model) + { + return; + } - G4PhysicalVolumeModel* pPVModel = - dynamic_cast(fpModel); - if (!pPVModel) { return ; } + G4PhysicalVolumeModel* pPVModel = + dynamic_cast(fpModel); + if(!pPVModel) + { + return; + } - // Current Physical volume name - G4String pv_name = pPVModel->GetCurrentTag() ; + // Current Physical volume name + G4String pv_name = pPVModel->GetCurrentTag(); - // Current depth of volume - G4int cur_depth = pPVModel->GetCurrentDepth() ; + // Current depth of volume + G4int cur_depth = pPVModel->GetCurrentDepth(); - // Make a string to be sent - // e.g. experimental_Hall.1, where "1" is the copy number - G4String name_comment ( FR_PHYSICAL_VOLUME_NAME ); - name_comment += " " ; + // Make a string to be sent + // e.g. experimental_Hall.1, where "1" is the copy number + G4String name_comment(FR_PHYSICAL_VOLUME_NAME); + name_comment += " "; - for ( i = 0 ; i < cur_depth; i++) { - // Make tree - name_comment += " " ; - } - name_comment += pv_name ; + for(i = 0; i < cur_depth; i++) + { + // Make tree + name_comment += " "; + } + name_comment += pv_name; - // Send physical volume name - SendStr ( "#--------------------" ); - SendStr ( name_comment ); + // Send physical volume name + SendStr("#--------------------"); + SendStr(name_comment); -} // G4FRSCENEHANDLER::SendPhysVolName () +} // G4FRSCENEHANDLER::SendPhysVolName () - -//----- -void G4FRSCENEHANDLER::SendStr( const char* char_string ) +//----- +void G4FRSCENEHANDLER::SendStr(const char* char_string) { - fPrimDest.SendLine( char_string ); -} - - -//----- -void G4FRSCENEHANDLER::SendStrInt( const char* char_string , - G4int ival ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%s %d", char_string , ival ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt(), 1\n" ; - } - SendStr( command ); - delete [] command ; -} // G4FRSCENEHANDLER::SendStrInt() - - -//----- -void -G4FRSCENEHANDLER::SendStrInt3( const char* char_string , - G4int ival1 , - G4int ival2 , - G4int ival3 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = \ - sprintf( command, "%s %d %d %d", char_string , ival1, ival2, ival3 ) ; - - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt3(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrInt3() - - -//----- -void -G4FRSCENEHANDLER::SendStrInt4( const char* char_string , - G4int ival1 , - G4int ival2 , - G4int ival3 , - G4int ival4 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = \ - sprintf( command, "%s %d %d %d %d", char_string , ival1, ival2, ival3, ival4 ) ; - - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt4(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrInt4() - -//----- -void G4FRSCENEHANDLER::SendStrDouble( const char* char_string , - G4double dval ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%s %*.*g", \ - char_string , \ - fPrec2, fPrec, dval ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrDouble() - - -//----- -void -G4FRSCENEHANDLER::SendStrDouble2( const char* char_string , - G4double dval1 , - G4double dval2 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%s %*.*g %*.*g", char_string , \ - fPrec2, fPrec, dval1, \ - fPrec2, fPrec, dval2 ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble2(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrDouble2() - - -//----- -void -G4FRSCENEHANDLER::SendStrDouble3( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%s %*.*g %*.*g %*.*g", \ - char_string , \ - fPrec2, fPrec, dval1, \ - fPrec2, fPrec, dval2, \ - fPrec2, fPrec, dval3 ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble3(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrDouble3() - - -//----- -void -G4FRSCENEHANDLER::SendStrDouble4( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%s %*.*g %*.*g %*.*g %*.*g", \ - char_string , \ - fPrec2, fPrec, dval1, \ - fPrec2, fPrec, dval2, \ - fPrec2, fPrec, dval3, \ - fPrec2, fPrec, dval4) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble4(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrDouble4() - - -//----- -void -G4FRSCENEHANDLER::SendStrDouble5( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%s %*.*g %*.*g %*.*g %*.*g %*.*g", \ - char_string , \ - fPrec2, fPrec, dval1, \ - fPrec2, fPrec, dval2, \ - fPrec2, fPrec, dval3, \ - fPrec2, fPrec, dval4, \ - fPrec2, fPrec, dval5 ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble5(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrDouble5() - - -//----- -void -G4FRSCENEHANDLER::SendStrDouble6( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%s %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g", \ - char_string , \ - fPrec2, fPrec, dval1, \ - fPrec2, fPrec, dval2, \ - fPrec2, fPrec, dval3, \ - fPrec2, fPrec, dval4, \ - fPrec2, fPrec, dval5, \ - fPrec2, fPrec, dval6 ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble6(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrDouble6() - - -//----- -void -G4FRSCENEHANDLER::SendStrDouble7( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 , - G4double dval7 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%s %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g", \ - char_string , \ - fPrec2, fPrec, dval1,\ - fPrec2, fPrec, dval2,\ - fPrec2, fPrec, dval3,\ - fPrec2, fPrec, dval4,\ - fPrec2, fPrec, dval5,\ - fPrec2, fPrec, dval6,\ - fPrec2, fPrec, dval7 ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble7(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrDouble7() - - -//----- -void -G4FRSCENEHANDLER::SendStrDouble11( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 , - G4double dval7 , - G4double dval8 , - G4double dval9 , - G4double dval10 , - G4double dval11 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%s %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g", \ - char_string ,\ - fPrec2, fPrec, dval1, \ - fPrec2, fPrec, dval2, \ - fPrec2, fPrec, dval3, \ - fPrec2, fPrec, dval4, \ - fPrec2, fPrec, dval5, \ - fPrec2, fPrec, dval6, \ - fPrec2, fPrec, dval7, \ - fPrec2, fPrec, dval8, \ - fPrec2, fPrec, dval9, \ - fPrec2, fPrec, dval10,\ - fPrec2, fPrec, dval11 ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble11(), 1\n" ; - } - SendStr( command ); - delete [] command ; - -} // G4FRSCENEHANDLER::SendStrDouble11() - - -//----- -void -G4FRSCENEHANDLER::SendIntDouble3( G4int ival , - G4double dval1 , - G4double dval2 , - G4double dval3 ) -{ - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; - - num_char = sprintf( command, "%d %*.*g %*.*g %*.*g", \ - ival , \ - fPrec2, fPrec, dval1, \ - fPrec2, fPrec, dval2, \ - fPrec2, fPrec, dval3 ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendIntDouble3(),1\n" ; - } - SendStr( command ); - delete [] command ; + fPrimDest.SendLine(char_string); } -//----- -void -G4FRSCENEHANDLER::SendInt3Str( G4int ival1 , - G4int ival2 , - G4int ival3 , - const char* char_string ) +//----- +void G4FRSCENEHANDLER::SendStrInt(const char* char_string, G4int ival) { - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; - num_char = sprintf( command, "%d %d %d %s", \ - ival1, ival2, ival3, char_string ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendInt3Str(),1\n" ; - } - SendStr( command ); - delete [] command ; + num_char = sprintf(command, "%s %d", char_string, ival); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt(), 1\n"; + } + SendStr(command); + delete[] command; +} // G4FRSCENEHANDLER::SendStrInt() + +//----- +void G4FRSCENEHANDLER::SendStrInt3(const char* char_string, G4int ival1, + G4int ival2, G4int ival3) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = + sprintf(command, "%s %d %d %d", char_string, ival1, ival2, ival3); + + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt3(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrInt3() + +//----- +void G4FRSCENEHANDLER::SendStrInt4(const char* char_string, G4int ival1, + G4int ival2, G4int ival3, G4int ival4) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf(command, "%s %d %d %d %d", char_string, ival1, ival2, + ival3, ival4); + + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt4(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrInt4() + +//----- +void G4FRSCENEHANDLER::SendStrDouble(const char* char_string, G4double dval) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf(command, "%s %*.*g", char_string, fPrec2, fPrec, dval); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrDouble() + +//----- +void G4FRSCENEHANDLER::SendStrDouble2(const char* char_string, G4double dval1, + G4double dval2) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf(command, "%s %*.*g %*.*g", char_string, fPrec2, fPrec, + dval1, fPrec2, fPrec, dval2); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble2(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrDouble2() + +//----- +void G4FRSCENEHANDLER::SendStrDouble3(const char* char_string, G4double dval1, + G4double dval2, G4double dval3) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf(command, "%s %*.*g %*.*g %*.*g", char_string, fPrec2, + fPrec, dval1, fPrec2, fPrec, dval2, fPrec2, fPrec, dval3); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble3(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrDouble3() + +//----- +void G4FRSCENEHANDLER::SendStrDouble4(const char* char_string, G4double dval1, + G4double dval2, G4double dval3, + G4double dval4) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf(command, "%s %*.*g %*.*g %*.*g %*.*g", char_string, + fPrec2, fPrec, dval1, fPrec2, fPrec, dval2, fPrec2, fPrec, + dval3, fPrec2, fPrec, dval4); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble4(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrDouble4() + +//----- +void G4FRSCENEHANDLER::SendStrDouble5(const char* char_string, G4double dval1, + G4double dval2, G4double dval3, + G4double dval4, G4double dval5) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = + sprintf(command, "%s %*.*g %*.*g %*.*g %*.*g %*.*g", char_string, + fPrec2, fPrec, dval1, fPrec2, fPrec, dval2, fPrec2, fPrec, dval3, + fPrec2, fPrec, dval4, fPrec2, fPrec, dval5); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble5(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrDouble5() + +//----- +void G4FRSCENEHANDLER::SendStrDouble6(const char* char_string, G4double dval1, + G4double dval2, G4double dval3, + G4double dval4, G4double dval5, + G4double dval6) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf(command, "%s %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g", + char_string, fPrec2, fPrec, dval1, fPrec2, fPrec, dval2, + fPrec2, fPrec, dval3, fPrec2, fPrec, dval4, fPrec2, fPrec, + dval5, fPrec2, fPrec, dval6); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble6(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrDouble6() + +//----- +void G4FRSCENEHANDLER::SendStrDouble7(const char* char_string, G4double dval1, + G4double dval2, G4double dval3, + G4double dval4, G4double dval5, + G4double dval6, G4double dval7) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf(command, "%s %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g", + char_string, fPrec2, fPrec, dval1, fPrec2, fPrec, dval2, + fPrec2, fPrec, dval3, fPrec2, fPrec, dval4, fPrec2, fPrec, + dval5, fPrec2, fPrec, dval6, fPrec2, fPrec, dval7); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble7(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrDouble7() + +//----- +void G4FRSCENEHANDLER::SendStrDouble11(const char* char_string, G4double dval1, + G4double dval2, G4double dval3, + G4double dval4, G4double dval5, + G4double dval6, G4double dval7, + G4double dval8, G4double dval9, + G4double dval10, G4double dval11) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf( + command, + "%s %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g", + char_string, fPrec2, fPrec, dval1, fPrec2, fPrec, dval2, fPrec2, fPrec, + dval3, fPrec2, fPrec, dval4, fPrec2, fPrec, dval5, fPrec2, fPrec, dval6, + fPrec2, fPrec, dval7, fPrec2, fPrec, dval8, fPrec2, fPrec, dval9, fPrec2, + fPrec, dval10, fPrec2, fPrec, dval11); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble11(), 1\n"; + } + SendStr(command); + delete[] command; + +} // G4FRSCENEHANDLER::SendStrDouble11() + +//----- +void G4FRSCENEHANDLER::SendIntDouble3(G4int ival, G4double dval1, + G4double dval2, G4double dval3) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf(command, "%d %*.*g %*.*g %*.*g", ival, fPrec2, fPrec, + dval1, fPrec2, fPrec, dval2, fPrec2, fPrec, dval3); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendIntDouble3(),1\n"; + } + SendStr(command); + delete[] command; } -//----- -void -G4FRSCENEHANDLER::SendInt4Str( G4int ival1 , - G4int ival2 , - G4int ival3 , - G4int ival4 , - const char* char_string ) +//----- +void G4FRSCENEHANDLER::SendInt3Str(G4int ival1, G4int ival2, G4int ival3, + const char* char_string) { - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; - num_char = sprintf( command, "%d %d %d %d %s", \ - ival1, ival2, ival3, ival4, char_string ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendInt4Str(),1\n" ; - } - SendStr( command ); - delete [] command ; + num_char = sprintf(command, "%d %d %d %s", ival1, ival2, ival3, char_string); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendInt3Str(),1\n"; + } + SendStr(command); + delete[] command; } -//----- -void -G4FRSCENEHANDLER::SendStrDouble3Str( const char* char_string1 , - G4double dval1 , - G4double dval2 , - G4double dval3 , - const char* char_string2 ) +//----- +void G4FRSCENEHANDLER::SendInt4Str(G4int ival1, G4int ival2, G4int ival3, + G4int ival4, const char* char_string) { - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; - num_char = sprintf( command, "%s %*.*g %*.*g %*.*g %s", \ - char_string1,\ - fPrec2, fPrec, dval1 , \ - fPrec2, fPrec, dval2 , \ - fPrec2, fPrec, dval3 , \ - char_string2 ); - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble6Str(), 1\n" ; - } - SendStr( command ); - delete [] command ; + num_char = + sprintf(command, "%d %d %d %d %s", ival1, ival2, ival3, ival4, char_string); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendInt4Str(),1\n"; + } + SendStr(command); + delete[] command; +} -} - - -//----- -void -G4FRSCENEHANDLER::SendStrDouble6Str( const char* char_string1 , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 , - const char* char_string2 ) +//----- +void G4FRSCENEHANDLER::SendStrDouble3Str(const char* char_string1, + G4double dval1, G4double dval2, + G4double dval3, + const char* char_string2) { - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; - num_char = sprintf( command, "%s %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %s", \ - char_string1,\ - fPrec2, fPrec, dval1 , \ - fPrec2, fPrec, dval2 , \ - fPrec2, fPrec, dval3 , \ - fPrec2, fPrec, dval4 , \ - fPrec2, fPrec, dval5 , \ - fPrec2, fPrec, dval6, \ - char_string2 ); - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble6Str(), 1\n" ; - } - SendStr( command ); - delete [] command ; + num_char = + sprintf(command, "%s %*.*g %*.*g %*.*g %s", char_string1, fPrec2, fPrec, + dval1, fPrec2, fPrec, dval2, fPrec2, fPrec, dval3, char_string2); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble6Str(), 1\n"; + } + SendStr(command); + delete[] command; +} -} - - -//----- -void G4FRSCENEHANDLER::SendInt( G4int val ) +//----- +void G4FRSCENEHANDLER::SendStrDouble6Str(const char* char_string1, + G4double dval1, G4double dval2, + G4double dval3, G4double dval4, + G4double dval5, G4double dval6, + const char* char_string2) { - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; - num_char = sprintf( command, "%d", val ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt(), 1\n" ; - } - SendStr( command ); - delete [] command ; -} // G4FRSCENEHANDLER::SendStrInt() + num_char = sprintf(command, "%s %*.*g %*.*g %*.*g %*.*g %*.*g %*.*g %s", + char_string1, fPrec2, fPrec, dval1, fPrec2, fPrec, dval2, + fPrec2, fPrec, dval3, fPrec2, fPrec, dval4, fPrec2, fPrec, + dval5, fPrec2, fPrec, dval6, char_string2); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrDouble6Str(), 1\n"; + } + SendStr(command); + delete[] command; +} - -//----- -void G4FRSCENEHANDLER::SendDouble( G4double val ) +//----- +void G4FRSCENEHANDLER::SendInt(G4int val) { - //----- make command char_string and send - G4int num_char ; - char* command = new char [ COMMAND_BUF_SIZE ]; + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; - num_char = sprintf( command, "%*.*g", fPrec2, fPrec, val ) ; - if( num_char < 0 ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt(), 1\n" ; - } - SendStr( command ); - delete [] command ; -} // G4FRSCENEHANDLER::SendStrInt() + num_char = sprintf(command, "%d", val); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt(), 1\n"; + } + SendStr(command); + delete[] command; +} // G4FRSCENEHANDLER::SendStrInt() -//----- -void G4FRSCENEHANDLER::ClearTransientStore() +//----- +void G4FRSCENEHANDLER::SendDouble(G4double val) +{ + //----- make command char_string and send + G4int num_char; + char* command = new char[COMMAND_BUF_SIZE]; + + num_char = sprintf(command, "%*.*g", fPrec2, fPrec, val); + if(num_char < 0) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "ERROR G4FRSCENEHANDLER::SendStrInt(), 1\n"; + } + SendStr(command); + delete[] command; +} // G4FRSCENEHANDLER::SendStrInt() + +//----- +void G4FRSCENEHANDLER::ClearTransientStore() { // This is typically called after an update and before drawing hits // of the next event. To simulate the clearing of "transients" // (hits, etc.) the detector is redrawn... - if (fpViewer) { - fpViewer -> SetView (); - fpViewer -> ClearView (); - fpViewer -> DrawView (); + if(fpViewer) + { + fpViewer->SetView(); + fpViewer->ClearView(); + fpViewer->DrawView(); } } - diff --git a/source/visualization/FukuiRenderer/include/G4FRofstream.hh b/source/visualization/FukuiRenderer/include/G4FRofstream.hh index e1f478d83c..acc0a560c6 100644 --- a/source/visualization/FukuiRenderer/include/G4FRofstream.hh +++ b/source/visualization/FukuiRenderer/include/G4FRofstream.hh @@ -25,100 +25,92 @@ // // // + +#ifndef G4_FR_OFSTREAM_HH +#define G4_FR_OFSTREAM_HH + #include -#if !defined G4_FR_OFSTREAM_HH -#define G4_FR_OFSTREAM_HH - - #include "globals.hh" -///////////////////// -//typedef int G4bool ; -//#define false 0 ; -//#define true 1 ; -//////////////////// - -class G4FRofstream { +class G4FRofstream +{ + public: + enum + { + SEND_BUFMAX = 1024 + }; public: - enum { SEND_BUFMAX = 1024 }; + // constructors + G4FRofstream() { flag_file_open = false; } + G4FRofstream(const char* filename); - public: - - // constructors - G4FRofstream () { flag_file_open = false ; } - G4FRofstream ( const char* filename ) ; + // destructor + virtual ~G4FRofstream(); - // destructor - virtual ~G4FRofstream (); + // open and close + void Open(const char* filename); + void Close(); + G4bool IsOpen() { return flag_file_open; } - // open and close - void Open ( const char* filename ); - void Close() ; - G4bool IsOpen() { return flag_file_open ;} + // utilities + void SendLine(const char* string); // save string with new line - // utilities - void SendLine( const char* string ) ; // save string with new line - - // static functions - static G4bool DoesFileExist( const char* filename ) ; + // static functions + static G4bool DoesFileExist(const char* filename); protected: - G4bool flag_file_open ; - std::ofstream fout ; -} ; + G4bool flag_file_open; + std::ofstream fout; +}; - -inline void G4FRofstream::Open ( const char* filename ) -{ - if( !IsOpen() ) { - fout.open( filename ) ; - flag_file_open = true ; - } +inline void G4FRofstream::Open(const char* filename) +{ + if(!IsOpen()) + { + fout.open(filename); + flag_file_open = true; + } } - -inline void G4FRofstream::Close () -{ - if( IsOpen() ) { - fout.close(); - flag_file_open = false ; - } +inline void G4FRofstream::Close() +{ + if(IsOpen()) + { + fout.close(); + flag_file_open = false; + } } -inline void G4FRofstream::SendLine ( const char* message ) +inline void G4FRofstream::SendLine(const char* message) { - if ( IsOpen() ) { - fout << message << G4endl; - } + if(IsOpen()) + { + fout << message << G4endl; + } } - -inline G4bool G4FRofstream::DoesFileExist ( const char* filename ) +inline G4bool G4FRofstream::DoesFileExist(const char* filename) { - G4bool status = false ; + G4bool status = false; - std::ifstream fout_tmp( filename ) ; - if( fout_tmp ) { status = true ; } - fout_tmp.close(); + std::ifstream fout_tmp(filename); + if(fout_tmp) + { + status = true; + } + fout_tmp.close(); - return status ; + return status; } - -inline -G4FRofstream::G4FRofstream ( const char* filename ) +inline G4FRofstream::G4FRofstream(const char* filename) { - flag_file_open = false ; - Open( filename ); -} - -inline -G4FRofstream::~G4FRofstream () -{ - Close() ; -} + flag_file_open = false; + Open(filename); +} +inline G4FRofstream::~G4FRofstream() { Close(); } #endif diff --git a/source/visualization/FukuiRenderer/include/G4FukuiRenderer.hh b/source/visualization/FukuiRenderer/include/G4FukuiRenderer.hh deleted file mode 100644 index 90f98f895a..0000000000 --- a/source/visualization/FukuiRenderer/include/G4FukuiRenderer.hh +++ /dev/null @@ -1,82 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// -// Satoshi TANAKA -// Fukui Renderer factory. - -//=================// -#if defined (G4VIS_BUILD_DAWN_DRIVER) || defined (G4VIS_USE_DAWN) -//=================// - -#ifndef G4FUKUI_RENDERER_HH -#define G4FUKUI_RENDERER_HH - -#include "G4VGraphicsSystem.hh" -#include "G4FRClientServer.hh" - - //----- prototype -class G4VSceneHandler ; - - //---------------------------------// - //----- class G4FukuiRenderer -----// - //---------------------------------// -class G4FukuiRenderer: public G4VGraphicsSystem { - -public: - G4FukuiRenderer (); - virtual ~G4FukuiRenderer (); - G4VSceneHandler* CreateSceneHandler (const G4String& name = ""); - G4VViewer* CreateViewer (G4VSceneHandler&, const G4String& name = ""); - - G4FRClientServer& GetPrimDest() { return fPrimDest ; } - - //----- inter-process communication - enum { IP_UNIX, IP_INET }; - enum { FR_MAX_PORT_INCR = 10 }; - G4bool IsUnixDomain() const { return (fIPMode == G4FukuiRenderer::IP_UNIX); } - G4bool IsInetDomain() const { return (fIPMode == G4FukuiRenderer::IP_INET); } - void UseInetDomainAuto(); - void UseInetDomain(); - void UseBSDUnixDomainAuto(); - void ConnectPort( int max_port_incr = FR_MAX_PORT_INCR); - - G4bool IsGUIMode (void) { return flag_use_gui ; } - G4bool IsConnected (void) { return flag_connected ; } - -public: - //----- inter-process communication - G4FRClientServer fPrimDest ; - -private: - int fIPMode ; - G4bool flag_use_gui ; - G4int flag_connected ; -}; - -#endif -#endif //G4VIS_BUILD_DAWN_DRIVER diff --git a/source/visualization/FukuiRenderer/include/G4FukuiRendererSceneHandler.hh b/source/visualization/FukuiRenderer/include/G4FukuiRendererSceneHandler.hh deleted file mode 100644 index a6179981c5..0000000000 --- a/source/visualization/FukuiRenderer/include/G4FukuiRendererSceneHandler.hh +++ /dev/null @@ -1,238 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// -// Satoshi TANAKA, Fri Jun 28 11:19:19 JST 1996 - - -//=================// -#ifdef G4VIS_BUILD_DAWN_DRIVER -//=================// - - -#ifndef G4FUKUI_RENDERER_SCENE_HANDLER_HH -#define G4FUKUI_RENDERER_SCENE_HANDLER_HH - -#include "globals.hh" - -#include "G4VSceneHandler.hh" - -#include "G4FRClientServer.hh" -#include "G4FRConst.hh" - -class G4VisAttributes ; -class G4FukuiRenderer; - - //----- -class G4FukuiRendererSceneHandler: public G4VSceneHandler { - -public: - - //----- constructor and destructor - G4FukuiRendererSceneHandler (G4FukuiRenderer& system, const G4String& name = ""); - virtual ~G4FukuiRendererSceneHandler (); - - //----- overriding base class methods - using G4VSceneHandler::AddPrimitive; - void AddPrimitive (const G4Polyline& line); - void AddPrimitive (const G4Polyhedron& p); - void AddPrimitive (const G4Text&); - void AddPrimitive (const G4Circle&); - void AddPrimitive (const G4Square&); - - void BeginPrimitives (const G4Transform3D& objectTransformation); - void EndPrimitives (); - - using G4VSceneHandler::AddSolid; - void AddSolid ( const G4Box& box ); - void AddSolid ( const G4Cons& cons ); - void AddSolid ( const G4Tubs& tubs ); - void AddSolid ( const G4Trd& trd ); - void AddSolid ( const G4Trap& trap ); - void AddSolid ( const G4Sphere& sphere ); - void AddSolid ( const G4Para& para ); - void AddSolid ( const G4Torus& torus ); - void AddSolid ( const G4VSolid& solid ); - - void ClearTransientStore(); // Used for triggering detector re-drawing. - - //----- methods inherent to this class - void FRBeginModeling () ; - void FREndModeling () ; - G4bool FRIsInModeling () { return FRflag_in_modeling ; } - - G4bool IsSavingG4Prim ( void ) { return flag_saving_g4_prim ; } - void BeginSavingG4Prim( void ) - { - if( !IsSavingG4Prim() ) - { - SendStr( FR_SAVE ) ; - SendStr( FR_G4_PRIM_HEADER ) ; - flag_saving_g4_prim = true ; - } - } - void EndSavingG4Prim ( void ) - { if( IsSavingG4Prim() ) { SendStr( FR_END_SAVE ); flag_saving_g4_prim = false ; } } - - G4FRClientServer& GetPrimDest () { return fPrimDest ; } - G4FukuiRenderer& GetSystem () { return fSystem ; } - void SendBoundingBox ( void ); - -private: - - //----- Utilities etc - G4bool SendVisAttributes ( const G4VisAttributes* pAV ); - G4bool IsVisible ( void ) ; - void SendTransformedCoordinates( void ) ; - void SendPhysVolName ( void ) ; - void SendNdiv ( void ) ; - -public: - - void SendStr ( const char* char_string ) ; - void SendStrInt( const char* char_string , - G4int ival ); - void SendStrInt3( const char* char_string , - G4int ival1 , - G4int ival2 , - G4int ival3 ); - void SendStrInt4( const char* char_string , - G4int ival1 , - G4int ival2 , - G4int ival3 , - G4int ival4 ); - void SendStrDouble( const char* char_string , - G4double dval ); - void SendStrDouble2( const char* char_string , - G4double dval1 , - G4double dval2 ); - void SendStrDouble3( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 ); - - void SendStrDouble4( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 ); - - void SendStrDouble5( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 ); - - void SendStrDouble6( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 ); - - void SendStrDouble7( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 , - G4double dval7 ); - - void SendStrDouble11( const char* char_string , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 , - G4double dval7 , - G4double dval8 , - G4double dval9 , - G4double dval10 , - G4double dval11 ) ; - - void SendIntDouble3( G4int ival , - G4double dval1 , - G4double dval2 , - G4double dval3 ); - void SendInt3Str( G4int ival1 , - G4int ival2 , - G4int ival3 , - const char* char_string ); - void SendInt4Str( G4int ival1 , - G4int ival2 , - G4int ival3 , - G4int ival4 , - const char* char_string ); - - void SendStrDouble3Str( const char* char_string1 , - G4double dval1 , - G4double dval2 , - G4double dval3 , - const char* char_string2 ); - - void SendStrDouble6Str( const char* char_string1 , - G4double dval1 , - G4double dval2 , - G4double dval3 , - G4double dval4 , - G4double dval5 , - G4double dval6 , - const char* char_string2 ); - - void SendInt ( G4int val ); - void SendDouble( G4double val ); - - - -private: - G4FukuiRenderer& fSystem; // Graphics system for this scene. - static G4int fSceneIdCount; - - G4FRClientServer& fPrimDest ; // defined in G4FukuiRenderer - G4bool FRflag_in_modeling ; - // true: FR_BEGIN_MODELING has sent to DAWN, and - // FR_END_MODELING has not sent yet. - // false: otherwise - // - // FRflag_in_modeling is set to "true" - // in FRBeginModeling(), and to "false" - // in FREndModeling(). - - G4bool flag_saving_g4_prim ; - - const int COMMAND_BUF_SIZE ; - - G4int fPrec, fPrec2 ; - -}; - -#endif -#endif //G4VIS_BUILD_DAWN_DRIVER diff --git a/source/visualization/FukuiRenderer/include/G4VisFeaturesOfDAWNFILE.hh b/source/visualization/FukuiRenderer/include/G4VisFeaturesOfDAWNFILE.hh index 5a09deaad6..d056f9b2a7 100644 --- a/source/visualization/FukuiRenderer/include/G4VisFeaturesOfDAWNFILE.hh +++ b/source/visualization/FukuiRenderer/include/G4VisFeaturesOfDAWNFILE.hh @@ -30,6 +30,6 @@ #include "globals.hh" -G4String G4VisFeaturesOfDAWNFILE (); +G4String G4VisFeaturesOfDAWNFILE(); #endif diff --git a/source/visualization/FukuiRenderer/include/G4VisFeaturesOfFukuiRenderer.hh b/source/visualization/FukuiRenderer/include/G4VisFeaturesOfFukuiRenderer.hh deleted file mode 100644 index bdad5ecc6b..0000000000 --- a/source/visualization/FukuiRenderer/include/G4VisFeaturesOfFukuiRenderer.hh +++ /dev/null @@ -1,37 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// - -#ifndef G4VISFEATURESOFFUKUIRENDERER_HH -#define G4VISFEATURESOFFUKUIRENDERER_HH - -#include "globals.hh" - -G4String G4VisFeaturesOfFukuiRenderer (); - -#endif diff --git a/source/visualization/FukuiRenderer/sources.cmake b/source/visualization/FukuiRenderer/sources.cmake index b7385f1b9e..bbde505e76 100644 --- a/source/visualization/FukuiRenderer/sources.cmake +++ b/source/visualization/FukuiRenderer/sources.cmake @@ -1,50 +1,20 @@ # - G4FR module build definition -# Module has optional sources -# List those always built -set(G4VIS_DAWN_MODULE_HEADERS - G4DAWNFILE.hh - G4DAWNFILESceneHandler.hh - G4DAWNFILEViewer.hh - G4FRConst.hh - G4FRFeatures.hh - G4FRSceneFunc.icc - G4FRofstream.hh - G4VisFeaturesOfDAWNFILE.hh - G4VisFeaturesOfFukuiRenderer.hh) - -set(G4VIS_DAWN_MODULE_SOURCES - G4DAWNFILE.cc - G4DAWNFILESceneHandler.cc - G4DAWNFILEViewer.cc - G4VisFeaturesOfDAWNFILE.cc - G4VisFeaturesOfFukuiRenderer.cc) - -# DAWN Network driver only built if user selected -if(GEANT4_USE_NETWORKDAWN) - list(APPEND G4VIS_DAWN_MODULE_HEADERS - G4FRClientServer.hh - G4FukuiRenderer.hh - G4FukuiRendererSceneHandler.hh - G4FukuiRendererViewer.hh) - - list(APPEND G4VIS_DAWN_MODULE_SOURCES - G4FRClientServer.cc - G4FukuiRenderer.cc - G4FukuiRendererSceneHandler.cc - G4FukuiRendererViewer.cc) - - # To activate the Fukui Renderer Network component, we need an - # extra compile definition - add_definitions(-DG4VIS_BUILD_DAWN_DRIVER) -endif() - # Define the Geant4 Module. geant4_add_module(G4FR PUBLIC_HEADERS - ${G4VIS_DAWN_MODULE_HEADERS} + G4DAWNFILE.hh + G4DAWNFILESceneHandler.hh + G4DAWNFILEViewer.hh + G4FRConst.hh + G4FRSceneFunc.icc + G4FRofstream.hh + G4VisFeaturesOfDAWNFILE.hh SOURCES - ${G4VIS_DAWN_MODULE_SOURCES}) + G4DAWNFILE.cc + G4DAWNFILESceneHandler.cc + G4DAWNFILEViewer.cc + G4VisFeaturesOfDAWNFILE.cc) geant4_module_link_libraries(G4FR PUBLIC diff --git a/source/visualization/FukuiRenderer/src/G4DAWNFILE.cc b/source/visualization/FukuiRenderer/src/G4DAWNFILE.cc index 951332d1d5..efecb891df 100644 --- a/source/visualization/FukuiRenderer/src/G4DAWNFILE.cc +++ b/source/visualization/FukuiRenderer/src/G4DAWNFILE.cc @@ -28,46 +28,39 @@ // Satoshi TANAKA // DAWNFILE factory. - //#define DEBUG_FR_SYSTEM - #include "G4DAWNFILE.hh" #define __G_ANSI_C__ -//#include "G4VisFeaturesOfDAWNFILE.hh" -#include "G4FRFeatures.hh" +#include "G4VisFeaturesOfDAWNFILE.hh" #include "G4VSceneHandler.hh" #include "G4DAWNFILESceneHandler.hh" #include "G4DAWNFILEViewer.hh" #include "G4FRConst.hh" - - //----- G4DAWNFILE, constructor -G4DAWNFILE::G4DAWNFILE (): - G4VGraphicsSystem ("DAWNFILE", - "DAWNFILE", - FR_DAWNFILE_FEATURES, - G4VGraphicsSystem::fileWriter) +//----- G4DAWNFILE, constructor +G4DAWNFILE::G4DAWNFILE() + : G4VGraphicsSystem("DAWNFILE", "DAWNFILE", G4VisFeaturesOfDAWNFILE(), + G4VGraphicsSystem::fileWriter) {} - //----- G4DAWNFILE, destructor -G4DAWNFILE::~G4DAWNFILE () -{} +//----- G4DAWNFILE, destructor +G4DAWNFILE::~G4DAWNFILE() {} - - //----- G4DAWNFILE::CreateSceneHandler (const G4String& name) -G4VSceneHandler* G4DAWNFILE::CreateSceneHandler (const G4String& name) +//----- G4DAWNFILE::CreateSceneHandler (const G4String& name) +G4VSceneHandler* G4DAWNFILE::CreateSceneHandler(const G4String& name) { - G4VSceneHandler* p = new G4DAWNFILESceneHandler (*this, name); - return p; + G4VSceneHandler* p = new G4DAWNFILESceneHandler(*this, name); + return p; } - //----- G4DAWNFILE::CreateViewer () -G4VViewer* G4DAWNFILE::CreateViewer (G4VSceneHandler& scene, const G4String& name) +//----- G4DAWNFILE::CreateViewer () +G4VViewer* G4DAWNFILE::CreateViewer(G4VSceneHandler& scene, + const G4String& name) { - G4VViewer* pView = - new G4DAWNFILEViewer ((G4DAWNFILESceneHandler&) scene, name); - return pView; + G4VViewer* pView = + new G4DAWNFILEViewer((G4DAWNFILESceneHandler&) scene, name); + return pView; } diff --git a/source/visualization/FukuiRenderer/src/G4DAWNFILESceneHandler.cc b/source/visualization/FukuiRenderer/src/G4DAWNFILESceneHandler.cc index c773299427..a9972566ce 100644 --- a/source/visualization/FukuiRenderer/src/G4DAWNFILESceneHandler.cc +++ b/source/visualization/FukuiRenderer/src/G4DAWNFILESceneHandler.cc @@ -28,12 +28,11 @@ // Satoshi TANAKA // DAWNFILE scene. - #define __G_ANSI_C__ // #define DEBUG_FR_SCENE - //----- header files +//----- header files #include #include #include @@ -65,243 +64,251 @@ #include "G4VPhysicalVolume.hh" //----- constants -const char FR_ENV_CULL_INVISIBLE_OBJECTS [] = "G4DAWN_CULL_INVISIBLE_OBJECTS"; -const char G4PRIM_FILE_HEADER [] = "g4_"; -const char DEFAULT_G4PRIM_FILE_NAME[] = "g4_0000.prim"; - -// const int FR_MAX_FILE_NUM = 1 ; -// const int FR_MAX_FILE_NUM = 5 ; -// const int FR_MAX_FILE_NUM = 10 ; -// const int FR_MAX_FILE_NUM = 15 ; -// const int FR_MAX_FILE_NUM = 20 ; - const int FR_MAX_FILE_NUM = 100 ; - +const char FR_ENV_CULL_INVISIBLE_OBJECTS[] = "G4DAWN_CULL_INVISIBLE_OBJECTS"; +const char G4PRIM_FILE_HEADER[] = "g4_"; +const char DEFAULT_G4PRIM_FILE_NAME[] = "g4_0000.prim"; +const int FR_MAX_FILE_NUM = 100; /////////////////////////// // Driver-dependent part // /////////////////////////// - - //----- G4DAWNFILESceneHandler, constructor -G4DAWNFILESceneHandler::G4DAWNFILESceneHandler (G4DAWNFILE& system, const G4String& name): -G4VSceneHandler (system, fSceneIdCount++, name) , -fSystem (system) , -fPrimDest () , -FRflag_in_modeling (false) , -flag_saving_g4_prim (false) , -COMMAND_BUF_SIZE (G4FRofstream::SEND_BUFMAX), -fPrec (9), fPrec2 (16) +//----- G4DAWNFILESceneHandler, constructor +G4DAWNFILESceneHandler::G4DAWNFILESceneHandler(G4DAWNFILE& system, + const G4String& name) + : G4VSceneHandler(system, fSceneIdCount++, name) + , fSystem(system) + , fPrimDest() + , FRflag_in_modeling(false) + , flag_saving_g4_prim(false) + , COMMAND_BUF_SIZE(G4FRofstream::SEND_BUFMAX) + , fPrec(9) + , fPrec2(16) { - // g4.prim filename and its directory - if ( std::getenv( "G4DAWNFILE_DEST_DIR" ) == NULL ) { - strcpy( fG4PrimDestDir , "" ) ; // output dir - strcpy( fG4PrimFileName, DEFAULT_G4PRIM_FILE_NAME ); // filename - } else { - strcpy( fG4PrimDestDir , std::getenv( "G4DAWNFILE_DEST_DIR" ) ); // output dir - strcpy( fG4PrimFileName, DEFAULT_G4PRIM_FILE_NAME ); // filename - } - - // maximum number of g4.prim files in the dest directory - fMaxFileNum = FR_MAX_FILE_NUM ; // initialization - if ( std::getenv( "G4DAWNFILE_MAX_FILE_NUM" ) != NULL ) { - - sscanf( std::getenv("G4DAWNFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum ) ; + // g4.prim filename and its directory + if(std::getenv("G4DAWNFILE_DEST_DIR") == NULL) + { + strcpy(fG4PrimDestDir, ""); // output dir + strcpy(fG4PrimFileName, DEFAULT_G4PRIM_FILE_NAME); // filename + } + else + { + strcpy(fG4PrimDestDir, std::getenv("G4DAWNFILE_DEST_DIR")); // output dir + strcpy(fG4PrimFileName, DEFAULT_G4PRIM_FILE_NAME); // filename + } - } else { - fMaxFileNum = FR_MAX_FILE_NUM ; - } - if( fMaxFileNum < 1 ) { fMaxFileNum = 1 ; } + // maximum number of g4.prim files in the dest directory + fMaxFileNum = FR_MAX_FILE_NUM; // initialization + if(std::getenv("G4DAWNFILE_MAX_FILE_NUM") != NULL) + { + sscanf(std::getenv("G4DAWNFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum); + } + else + { + fMaxFileNum = FR_MAX_FILE_NUM; + } + if(fMaxFileNum < 1) + { + fMaxFileNum = 1; + } + //----- precision control + if(std::getenv("G4DAWNFILE_PRECISION") != NULL) + { + sscanf(std::getenv("G4DAWNFILE_PRECISION"), "%d", &fPrec); + } + else + { + fPrec = 9; + } + fPrec2 = fPrec + 7; +} - //----- precision control - if( std::getenv( "G4DAWNFILE_PRECISION" ) != NULL ) { - sscanf( std::getenv("G4DAWNFILE_PRECISION"), "%d", &fPrec ) ; - } else { - fPrec = 9 ; - } - fPrec2 = fPrec + 7 ; - -} - - - //----- G4DAWNFILESceneHandler, destructor -G4DAWNFILESceneHandler::~G4DAWNFILESceneHandler () +//----- G4DAWNFILESceneHandler, destructor +G4DAWNFILESceneHandler::~G4DAWNFILESceneHandler() { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** ~G4DAWNFILESceneHandler" << G4endl; -#endif - if (fPrimDest.IsOpen()) - { - //----- End of modeling - // !EndModeling, !DrawAll, !CloseDevice, - // close g4.prim - FREndModeling(); - } + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** ~G4DAWNFILESceneHandler" << G4endl; +#endif + if(fPrimDest.IsOpen()) + { + //----- End of modeling + // !EndModeling, !DrawAll, !CloseDevice, + // close g4.prim + FREndModeling(); + } } //----- -void G4DAWNFILESceneHandler::SetG4PrimFileName() +void G4DAWNFILESceneHandler::SetG4PrimFileName() { - // g4_0000.prim, g4_0001.prim, ..., g4_MAX_FILE_INDEX.prim - const int MAX_FILE_INDEX = fMaxFileNum - 1 ; + // g4_0000.prim, g4_0001.prim, ..., g4_MAX_FILE_INDEX.prim + const int MAX_FILE_INDEX = fMaxFileNum - 1; - // dest directory (null if no environmental variables is set) - strcpy ( fG4PrimFileName, fG4PrimDestDir) ; + // dest directory (null if no environmental variables is set) + strcpy(fG4PrimFileName, fG4PrimDestDir); - // create full path name (default) - strcat ( fG4PrimFileName, DEFAULT_G4PRIM_FILE_NAME ); + // create full path name (default) + strcat(fG4PrimFileName, DEFAULT_G4PRIM_FILE_NAME); - // Automatic updation of file names - for( int i = 0 ; i < fMaxFileNum ; i++) { + // Automatic updation of file names + for(int i = 0; i < fMaxFileNum; i++) + { + // Message in the final execution + if(i == MAX_FILE_INDEX) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "===========================================" << G4endl; + G4cout << "WARNING MESSAGE from DAWNFILE driver: " << G4endl; + G4cout << " This file name is the final one in the " << G4endl; + G4cout << " automatic updation of the output file name." << G4endl; + G4cout << " You may overwrite existing files, i.e. " << G4endl; + G4cout << " g4_XXXX.prim and g4_XXXX.eps " << G4endl; + G4cout << "===========================================" << G4endl; + } + } - // Message in the final execution - if( i == MAX_FILE_INDEX ) - { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "===========================================" << G4endl; - G4cout << "WARNING MESSAGE from DAWNFILE driver: " << G4endl; - G4cout << " This file name is the final one in the " << G4endl; - G4cout << " automatic updation of the output file name." << G4endl; - G4cout << " You may overwrite existing files, i.e. " << G4endl; - G4cout << " g4_XXXX.prim and g4_XXXX.eps " << G4endl; - G4cout << "===========================================" << G4endl; - } - } + // re-determine file name as G4DAWNFILE_DEST_DIR/g4_XXXX.prim + std::ostringstream filename; + filename << fG4PrimDestDir << G4PRIM_FILE_HEADER << std::setw(4) + << std::setfill('0') << i << ".prim"; + strncpy(fG4PrimFileName, filename.str().c_str(), + sizeof(fG4PrimFileName) - 1); + fG4PrimFileName[sizeof(fG4PrimFileName) - 1] = '\0'; - // re-determine file name as G4DAWNFILE_DEST_DIR/g4_XXXX.prim - std::ostringstream filename; filename - << fG4PrimDestDir << G4PRIM_FILE_HEADER - << std::setw(4) << std::setfill('0') << i << ".prim"; - strncpy(fG4PrimFileName,filename.str().c_str(),sizeof(fG4PrimFileName)-1); - fG4PrimFileName[sizeof(fG4PrimFileName)-1] = '\0'; + // check validity of the file name + std::ifstream fin; + fin.open(fG4PrimFileName); + if(!fin) + { + // new file + fin.close(); + break; + } + else + { + // already exists (try next) + fin.close(); + } - // check validity of the file name - std::ifstream fin ; - fin.open(fG4PrimFileName) ; - if(!fin) { - // new file - fin.close(); - break; - } else { - // already exists (try next) - fin.close(); - } + } // for - } // for - - G4cout << "=========================================== " << G4endl; - G4cout << "Output file: " << fG4PrimFileName << G4endl; - G4cout << "Destination directory (current dir if NULL): " << fG4PrimDestDir << G4endl; - G4cout << "Maximal number of files in the destination directory: " << fMaxFileNum << G4endl; - G4cout << "Note: " << G4endl; - G4cout << " * The maximal number is customizable as: " << G4endl; - G4cout << " % setenv G4DAWNFILE_MAX_FILE_NUM number " << G4endl; - G4cout << " * The destination directory is customizable as:" << G4endl; - G4cout << " % setenv G4DAWNFILE_DEST_DIR dir_name/ " << G4endl; - G4cout << " ** Do not forget \"/\" at the end of the " << G4endl; - G4cout << " dir_name, e.g. \"./tmp/\". " << G4endl; - G4cout << "=========================================== " << G4endl; - -} // G4DAWNFILESceneHandler::SetG4PrimFileName() + G4cout << "=========================================== " << G4endl; + G4cout << "Output file: " << fG4PrimFileName << G4endl; + G4cout << "Destination directory (current dir if NULL): " << fG4PrimDestDir + << G4endl; + G4cout << "Maximal number of files in the destination directory: " + << fMaxFileNum << G4endl; + G4cout << "Note: " << G4endl; + G4cout << " * The maximal number is customizable as: " << G4endl; + G4cout << " % setenv G4DAWNFILE_MAX_FILE_NUM number " << G4endl; + G4cout << " * The destination directory is customizable as:" << G4endl; + G4cout << " % setenv G4DAWNFILE_DEST_DIR dir_name/ " << G4endl; + G4cout << " ** Do not forget \"/\" at the end of the " << G4endl; + G4cout << " dir_name, e.g. \"./tmp/\". " << G4endl; + G4cout << "=========================================== " << G4endl; +} // G4DAWNFILESceneHandler::SetG4PrimFileName() //----- -void G4DAWNFILESceneHandler::BeginSavingG4Prim( void ) +void G4DAWNFILESceneHandler::BeginSavingG4Prim(void) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** BeginSavingG4Prim (called)\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** BeginSavingG4Prim (called)\n"; #endif - if( !IsSavingG4Prim() ) - { + if(!IsSavingG4Prim()) + { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "***** (started) " ; - G4cout << "(open g4.prim, ##)" << G4endl; - } + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "***** (started) "; + G4cout << "(open g4.prim, ##)" << G4endl; + } #endif - SetG4PrimFileName() ; // result set to fG4PrimFileName - fPrimDest.Open(fG4PrimFileName) ; + SetG4PrimFileName(); // result set to fG4PrimFileName + fPrimDest.Open(fG4PrimFileName); - SendStr( FR_G4_PRIM_HEADER ) ; - flag_saving_g4_prim = true ; - } + SendStr(FR_G4_PRIM_HEADER); + flag_saving_g4_prim = true; + } } -void G4DAWNFILESceneHandler::EndSavingG4Prim ( void ) +void G4DAWNFILESceneHandler::EndSavingG4Prim(void) { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** EndSavingG4Prim (called)\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** EndSavingG4Prim (called)\n"; #endif - if( IsSavingG4Prim() ) - { + if(IsSavingG4Prim()) + { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** (started) (close g4.prim)" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** (started) (close g4.prim)" << G4endl; #endif - fPrimDest.Close() ; - flag_saving_g4_prim = false ; - } + fPrimDest.Close(); + flag_saving_g4_prim = false; + } } - -//----- -void G4DAWNFILESceneHandler::FRBeginModeling( void ) +//----- +void G4DAWNFILESceneHandler::FRBeginModeling(void) { - if( !FRIsInModeling() ) - { + if(!FRIsInModeling()) + { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4DAWNFILESceneHandler::FRBeginModeling (called & started)" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout + << "***** G4DAWNFILESceneHandler::FRBeginModeling (called & started)" + << G4endl; #endif - //----- Send saving command and heading comment - BeginSavingG4Prim(); + //----- Send saving command and heading comment + BeginSavingG4Prim(); - //----- Send bounding box command - SendBoundingBox(); + //----- Send bounding box command + SendBoundingBox(); - //----- send SET_CAMERA command + //----- send SET_CAMERA command #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** (!SetCamera in FRBeginModeling())" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** (!SetCamera in FRBeginModeling())" << G4endl; #endif - SendStr( FR_SET_CAMERA ); + SendStr(FR_SET_CAMERA); - //----- open device + //----- open device #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** (!OpenDevice in FRBeginModeling())" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** (!OpenDevice in FRBeginModeling())" << G4endl; #endif - SendStr( FR_OPEN_DEVICE ); + SendStr(FR_OPEN_DEVICE); - //----- begin sending primitives + //----- begin sending primitives #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** (!BeginModeling in FRBeginModeling())" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** (!BeginModeling in FRBeginModeling())" << G4endl; #endif - SendStr( FR_BEGIN_MODELING ); FRflag_in_modeling = true ; - - } // if - -} + SendStr(FR_BEGIN_MODELING); + FRflag_in_modeling = true; + } // if +} ///////////////////////////////////////// // Common to DAWN and DAWNFILE drivers // ///////////////////////////////////////// -#define G4FRSCENEHANDLER G4DAWNFILESceneHandler +#define G4FRSCENEHANDLER G4DAWNFILESceneHandler #include "G4FRSceneFunc.icc" -#undef G4FRSCENEHANDLER +#undef G4FRSCENEHANDLER ////////////////////// // static variables // ////////////////////// - //----- static variables -G4int G4DAWNFILESceneHandler::fSceneIdCount = 0; +//----- static variables +G4int G4DAWNFILESceneHandler::fSceneIdCount = 0; diff --git a/source/visualization/FukuiRenderer/src/G4DAWNFILEViewer.cc b/source/visualization/FukuiRenderer/src/G4DAWNFILEViewer.cc index b072c62eb0..4b6fa07711 100644 --- a/source/visualization/FukuiRenderer/src/G4DAWNFILEViewer.cc +++ b/source/visualization/FukuiRenderer/src/G4DAWNFILEViewer.cc @@ -28,9 +28,8 @@ // Satoshi TANAKA // DAWNFILE view - opens window, hard copy, etc. - #define __G_ANSI_C__ -#define G4DAWNFILE_STRUCTURE_PRIORITY 1. +#define G4DAWNFILE_STRUCTURE_PRIORITY 1. // #define DEBUG_FR_VIEW @@ -52,332 +51,331 @@ #include "G4DAWNFILESceneHandler.hh" #include "G4DAWNFILEViewer.hh" +//----- constants +const char FR_ENV_MULTI_WINDOW[] = "G4DAWN_MULTI_WINDOW"; +const char FR_ENV_MULTI_WINDOW2[] = "G4DAWNFILE_MULTI_WINDOW"; - - //----- constants -const char FR_ENV_MULTI_WINDOW [] = "G4DAWN_MULTI_WINDOW" ; -const char FR_ENV_MULTI_WINDOW2[] = "G4DAWNFILE_MULTI_WINDOW" ; - - //----- G4DAWNFILEViewer, constructor -G4DAWNFILEViewer::G4DAWNFILEViewer (G4DAWNFILESceneHandler& sceneHandler, - const G4String& name): - G4VViewer (sceneHandler, - sceneHandler.IncrementViewCount (), - name), - fSceneHandler (sceneHandler) +//----- G4DAWNFILEViewer, constructor +G4DAWNFILEViewer::G4DAWNFILEViewer(G4DAWNFILESceneHandler& sceneHandler, + const G4String& name) + : G4VViewer(sceneHandler, sceneHandler.IncrementViewCount(), name) + , fSceneHandler(sceneHandler) { - // Set a g4.prim-file viewer - strcpy( fG4PrimViewer, "dawn" ); - if( std::getenv( "G4DAWNFILE_VIEWER" ) != NULL ) { - strcpy( fG4PrimViewer, std::getenv( "G4DAWNFILE_VIEWER" ) ) ; - } + // Set a g4.prim-file viewer + strcpy(fG4PrimViewer, "dawn"); + if(std::getenv("G4DAWNFILE_VIEWER") != NULL) + { + strcpy(fG4PrimViewer, std::getenv("G4DAWNFILE_VIEWER")); + } - // string for viewer invocation - if ( !strcmp( fG4PrimViewer, "NONE" ) ) { - - strcpy( fG4PrimViewerInvocation, "" ); - } else { - - strcpy( fG4PrimViewerInvocation, fG4PrimViewer ); - strcat( fG4PrimViewerInvocation, " "); - strcat( fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName() ); - } - - // Set a PostScript Viewer -// strcpy( fPSViewer, "ghostview" ); - strcpy( fPSViewer, "gv" ); - if( std::getenv( "G4DAWNFILE_PS_VIEWER" ) != NULL ) { - strcpy( fPSViewer, std::getenv( "G4DAWNFILE_PS_VIEWER" ) ) ; - } + // string for viewer invocation + if(!strcmp(fG4PrimViewer, "NONE")) + { + strcpy(fG4PrimViewerInvocation, ""); + } + else + { + strcpy(fG4PrimViewerInvocation, fG4PrimViewer); + strcat(fG4PrimViewerInvocation, " "); + strcat(fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName()); + } + // Set a PostScript Viewer + // strcpy( fPSViewer, "ghostview" ); + strcpy(fPSViewer, "gv"); + if(std::getenv("G4DAWNFILE_PS_VIEWER") != NULL) + { + strcpy(fPSViewer, std::getenv("G4DAWNFILE_PS_VIEWER")); + } } - //----- G4DAWNFILEViewer, destructor -G4DAWNFILEViewer::~G4DAWNFILEViewer () -{} +//----- G4DAWNFILEViewer, destructor +G4DAWNFILEViewer::~G4DAWNFILEViewer() {} - //----- G4DAWNFILEViewer::SetView () -void G4DAWNFILEViewer::SetView () +//----- G4DAWNFILEViewer::SetView () +void G4DAWNFILEViewer::SetView() { #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) G4cout << "***** G4DAWNFILEViewer::SetView(): No effects" << G4endl; -#endif -// Do nothing, since DAWN is running as a different process. -// SendViewParameters () will do this job instead. +#endif + // Do nothing, since DAWN is running as a different process. + // SendViewParameters () will do this job instead. } - - //----- G4DAWNFILEViewer::ClearView() -void -G4DAWNFILEViewer::ClearView( void ) +//----- G4DAWNFILEViewer::ClearView() +void G4DAWNFILEViewer::ClearView(void) { #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4DAWNFILEViewer::ClearView (): No effects " << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** G4DAWNFILEViewer::ClearView (): No effects " << G4endl; #endif - if (fSceneHandler.fPrimDest.IsOpen()) { - fSceneHandler.fPrimDest.Close(); - // Re-open with same filename... - fSceneHandler.fPrimDest.Open(fSceneHandler.fG4PrimFileName); - fSceneHandler.SendStr( FR_G4_PRIM_HEADER ); - fSceneHandler.FRflag_in_modeling = false; - fSceneHandler.FRBeginModeling(); - } + if(fSceneHandler.fPrimDest.IsOpen()) + { + fSceneHandler.fPrimDest.Close(); + // Re-open with same filename... + fSceneHandler.fPrimDest.Open(fSceneHandler.fG4PrimFileName); + fSceneHandler.SendStr(FR_G4_PRIM_HEADER); + fSceneHandler.FRflag_in_modeling = false; + fSceneHandler.FRBeginModeling(); + } } - - //----- G4DAWNFILEViewer::DrawView () -void G4DAWNFILEViewer::DrawView () +//----- G4DAWNFILEViewer::DrawView () +void G4DAWNFILEViewer::DrawView() { #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4DAWNFILEViewer::DrawView () " << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** G4DAWNFILEViewer::DrawView () " << G4endl; #endif - //----- - fSceneHandler.FRBeginModeling() ; + //----- + fSceneHandler.FRBeginModeling(); - //----- Always visit G4 kernel - NeedKernelVisit (); - - //----- Draw - ProcessView () ; + //----- Always visit G4 kernel + NeedKernelVisit(); -} // G4DAWNFILEViewer::DrawView () + //----- Draw + ProcessView(); +} // G4DAWNFILEViewer::DrawView () - - //----- G4DAWNFILEViewer::ShowView() -void G4DAWNFILEViewer::ShowView( void ) +//----- G4DAWNFILEViewer::ShowView() +void G4DAWNFILEViewer::ShowView(void) { #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4DAWNFILEViewer::ShowView () " << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** G4DAWNFILEViewer::ShowView () " << G4endl; #endif - if( fSceneHandler.FRIsInModeling() ) - { - //----- End of modeling - // !EndModeling, !DrawAll, !CloseDevice, - // close g4.prim - fSceneHandler.FREndModeling(); + if(fSceneHandler.FRIsInModeling()) + { + //----- End of modeling + // !EndModeling, !DrawAll, !CloseDevice, + // close g4.prim + fSceneHandler.FREndModeling(); - //----- Output DAWN GUI file - SendViewParameters(); + //----- Output DAWN GUI file + SendViewParameters(); - //----- string for viewer invocation - if ( !strcmp( fG4PrimViewer, "NONE" ) ) { - - strcpy( fG4PrimViewerInvocation, "" ); - } else { + //----- string for viewer invocation + if(!strcmp(fG4PrimViewer, "NONE")) + { + strcpy(fG4PrimViewerInvocation, ""); + } + else + { + strcpy(fG4PrimViewerInvocation, fG4PrimViewer); + strcat(fG4PrimViewerInvocation, " "); + strcat(fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName()); + } - strcpy( fG4PrimViewerInvocation, fG4PrimViewer ); - strcat( fG4PrimViewerInvocation, " "); - strcat( fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName() ); - } + //----- Invoke DAWN + G4cout << G4endl; + if(false == G4FRofstream::DoesFileExist(fSceneHandler.GetG4PrimFileName())) + { + G4cout << "ERROR: Failed to generate file "; + G4cout << fSceneHandler.GetG4PrimFileName() << G4endl; + } + else if(strcmp(GetG4PrimViewerInvocation(), "")) + { + G4cout << "File " << fSceneHandler.GetG4PrimFileName(); + G4cout << " is generated." << G4endl; + G4cout << GetG4PrimViewerInvocation() << G4endl; + int iErr = system(GetG4PrimViewerInvocation()); + if(iErr != 0) + { + G4ExceptionDescription ed; + ed << "Error " << iErr << " when calling system with \"" + << GetG4PrimViewerInvocation() << "\"."; + G4Exception("G4DAWNFILEViewer::ShowView()", "dawn0005", JustWarning, + ed); + } + } + else + { // no view, i.e., only file generation + G4cout << "File " << fSceneHandler.GetG4PrimFileName(); + G4cout << " is generated." << G4endl; + G4cout << "No viewer is invoked." << G4endl; + } + } +} // G4DAWNFILEViewer::ShowView() - //----- Invoke DAWN - G4cout << G4endl ; - if( false == G4FRofstream::DoesFileExist( fSceneHandler.GetG4PrimFileName() ) ) - { - G4cout << "ERROR: Failed to generate file "; - G4cout << fSceneHandler.GetG4PrimFileName() << G4endl; - - } else if( strcmp( GetG4PrimViewerInvocation(), "" ) ) - { - G4cout << "File " << fSceneHandler.GetG4PrimFileName() ; - G4cout << " is generated." << G4endl; - G4cout << GetG4PrimViewerInvocation() << G4endl; - int iErr = system( GetG4PrimViewerInvocation() ); - if ( iErr != 0) { - G4ExceptionDescription ed; - ed << "Error " << iErr - << " when calling system with \"" << GetG4PrimViewerInvocation() - << "\"."; - G4Exception("G4DAWNFILEViewer::ShowView()", - "dawn0005", JustWarning, ed); - } - - } else { // no view, i.e., only file generation - G4cout << "File " << fSceneHandler.GetG4PrimFileName() ; - G4cout << " is generated." << G4endl; - G4cout << "No viewer is invoked." << G4endl; - } - - } - -} // G4DAWNFILEViewer::ShowView() - - - //----- G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI( std::ostream& out ) -void G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI( std::ostream& out ) +//----- G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI( std::ostream& out ) +void G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI(std::ostream& out) { -/////////////////////// -//#if defined DEBUG_FR_VIEW -// G4cout << "***** G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI()" << G4endl; -//#endif -////////////////////// + /////////////////////// + //#if defined DEBUG_FR_VIEW + // G4cout << "***** G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI()" << G4endl; + //#endif + ////////////////////// - G4int style = fVP.GetDrawingStyle(); + G4int style = fVP.GetDrawingStyle(); - enum { FR_WIREFRAME_STYLE = 1, FR_WF_STORED_STYLE = 2, - FR_HID_STYLE = 3, FR_HID2_STYLE = 4, - FR_HID3_STYLE = 5, FR_DRAWING_MODE_END_STYLE = 6 }; + enum + { + FR_WIREFRAME_STYLE = 1, + FR_WF_STORED_STYLE = 2, + FR_HID_STYLE = 3, + FR_HID2_STYLE = 4, + FR_HID3_STYLE = 5, + FR_DRAWING_MODE_END_STYLE = 6 + }; - switch( style ) - { - case G4ViewParameters::wireframe: - out << FR_WIREFRAME_STYLE << G4endl; - break; - case G4ViewParameters::hlr: - out << FR_HID2_STYLE << G4endl; // LINE - break; - case G4ViewParameters::hsr: - case G4ViewParameters::hlhsr: - out << FR_HID_STYLE << G4endl; // SURFACE - break; - default: - out << FR_WIREFRAME_STYLE << G4endl; - break; - } + switch(style) + { + case G4ViewParameters::wireframe: + out << FR_WIREFRAME_STYLE << G4endl; + break; + case G4ViewParameters::hlr: + out << FR_HID2_STYLE << G4endl; // LINE + break; + case G4ViewParameters::hsr: + case G4ViewParameters::hlhsr: + out << FR_HID_STYLE << G4endl; // SURFACE + break; + default: + out << FR_WIREFRAME_STYLE << G4endl; + break; + } -} // G4DAWNFILEViewer::SendDrawingStyle() +} // G4DAWNFILEViewer::SendDrawingStyle() - - -//----- -void G4DAWNFILEViewer::SendViewParameters () +//----- +void G4DAWNFILEViewer::SendViewParameters() { // Calculates view representation based on extent of object being // viewed and (initial) direction of camera. (Note: it can change // later due to user interaction via visualization system's GUI.) #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "***** G4DAWNFILEViewer::SendViewParameters() "; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "***** G4DAWNFILEViewer::SendViewParameters() "; G4cout << "(GUI parameters)" << G4endl; } -#endif +#endif - //----- Magic number to decide camera distance automatically - const G4double HOW_FAR = 1000.0 ; // to define "infinity" - const G4double MIN_HALF_ANGLE = 0.01 ; - const G4double MAX_HALF_ANGLE = 0.499 * pi ; + //----- Magic number to decide camera distance automatically + const G4double HOW_FAR = 1000.0; // to define "infinity" + const G4double MIN_HALF_ANGLE = 0.01; + const G4double MAX_HALF_ANGLE = 0.499 * pi; - //----- CALC camera distance - //..... Note: Camera cannot enter inside object - G4double camera_distance ; - G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius(); + //----- CALC camera distance + //..... Note: Camera cannot enter inside object + G4double camera_distance; + G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius(); - G4double half_view_angle = std::fabs ( fVP.GetFieldHalfAngle () ) ; - if( half_view_angle > MAX_HALF_ANGLE ) { - half_view_angle = MAX_HALF_ANGLE ; - } + G4double half_view_angle = std::fabs(fVP.GetFieldHalfAngle()); + if(half_view_angle > MAX_HALF_ANGLE) + { + half_view_angle = MAX_HALF_ANGLE; + } - if( half_view_angle < MIN_HALF_ANGLE ) { - //----- infinity (or ortho projection) - camera_distance = radius * HOW_FAR ; - } else { - //----- Calc camera distance from half view angle - camera_distance = radius / std::sin ( half_view_angle ); - camera_distance -= fVP.GetDolly(); - } + if(half_view_angle < MIN_HALF_ANGLE) + { + //----- infinity (or ortho projection) + camera_distance = radius * HOW_FAR; + } + else + { + //----- Calc camera distance from half view angle + camera_distance = radius / std::sin(half_view_angle); + camera_distance -= fVP.GetDolly(); + } - if ( camera_distance < radius ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "WARNING from DAWNFILE driver:" << G4endl; - G4cout << " Camera cannot enter inside objects" << G4endl; - } - camera_distance = radius ; - } + if(camera_distance < radius) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "WARNING from DAWNFILE driver:" << G4endl; + G4cout << " Camera cannot enter inside objects" << G4endl; + } + camera_distance = radius; + } - //----- CALC camera direction - const G4Vector3D& camera_direction \ - = fVP.GetViewpointDirection().unit(); - const G4double v_angle = (180.0 / pi) * camera_direction.theta() ; - const G4double h_angle = (180.0 / pi) * camera_direction.phi () ; + //----- CALC camera direction + const G4Vector3D& camera_direction = fVP.GetViewpointDirection().unit(); + const G4double v_angle = (180.0 / pi) * camera_direction.theta(); + const G4double h_angle = (180.0 / pi) * camera_direction.phi(); + //########### Generation of the file .DAWN.history for DAWN GUI + //----- + std::ofstream gui_out(".DAWN_1.history"); - //########### Generation of the file .DAWN.history for DAWN GUI - //----- - std::ofstream gui_out (".DAWN_1.history") ; + // ######### P1 - // ######### P1 + //----- camera position + gui_out << camera_distance << G4endl; + gui_out << v_angle << G4endl; + gui_out << h_angle << G4endl; + gui_out << "0" << G4endl; // auto target - //----- camera position - gui_out << camera_distance << G4endl; - gui_out << v_angle << G4endl ; - gui_out << h_angle << G4endl ; - gui_out << "0" << G4endl ; // auto target + //----- target point + const G4Point3D& target_point = + fSceneHandler.GetScene()->GetStandardTargetPoint() + + fVP.GetCurrentTargetPoint(); + gui_out << target_point.x() << G4endl; + gui_out << target_point.y() << G4endl; + gui_out << target_point.z() << G4endl; - //----- target point - const G4Point3D& target_point - = fSceneHandler.GetScene()->GetStandardTargetPoint() - + fVP.GetCurrentTargetPoint(); - gui_out << target_point.x() << G4endl ; - gui_out << target_point.y() << G4endl ; - gui_out << target_point.z() << G4endl ; + //----- Magnification + const G4double zoom_factor = fVP.GetZoomFactor(); + if(half_view_angle < MIN_HALF_ANGLE) + { + gui_out << zoom_factor << G4endl; + } + else + { + const G4double FR_HALF_SCREEN_SIZE = 0.5; + G4double focal_distance = FR_HALF_SCREEN_SIZE / std::tan(half_view_angle); + focal_distance *= zoom_factor; - //----- Magnification - const G4double zoom_factor = fVP.GetZoomFactor(); - if( half_view_angle < MIN_HALF_ANGLE ) { + gui_out << "fd" << focal_distance << G4endl; + } + SendDrawingStyleToDAWNGUI(gui_out); // gui_out, viewing mode + gui_out << "0.001" << G4endl; // 3D Tolerance + gui_out << "0" << G4endl; // not display parameters - gui_out << zoom_factor << G4endl; + // ######### P2 + gui_out << 1 << G4endl; // Source light + gui_out << 1 << G4endl; + gui_out << 1 << G4endl; + gui_out << 0.5 << G4endl; // Ambient light + gui_out << 0.5 << G4endl; + gui_out << 0.5 << G4endl; + gui_out << 19.0 << G4endl; // Light direction (Polar) + gui_out << 71.0 << G4endl; // Light direction (Azimuthal) - } else { - const G4double FR_HALF_SCREEN_SIZE = 0.5 ; - G4double focal_distance \ - = FR_HALF_SCREEN_SIZE / std::tan( half_view_angle ); - focal_distance *= zoom_factor ; + // ######### P3 + gui_out << 0.1 << G4endl; // Real edge width + gui_out << 0.1 << G4endl; // outline width + gui_out << 0.1 << G4endl; // aux edge width + gui_out << 3 << G4endl; // aux edge style + gui_out << 70.0 << G4endl; // aux-edge threshold angle + gui_out << 0.1 << G4endl; // line width + gui_out << 0 << G4endl; // haloing + gui_out << 1 << G4endl; // Dashed edged for back faces - gui_out << "fd" << focal_distance << G4endl; - - } - SendDrawingStyleToDAWNGUI( gui_out ) ; // gui_out, viewing mode - gui_out << "0.001" << G4endl ; // 3D Tolerance - gui_out << "0" << G4endl ; // not display parameters - - - // ######### P2 - gui_out << 1 << G4endl; // Source light - gui_out << 1 << G4endl; - gui_out << 1 << G4endl; - gui_out << 0.5 << G4endl; // Ambient light - gui_out << 0.5 << G4endl; - gui_out << 0.5 << G4endl; - gui_out << 19.0 << G4endl; // Light direction (Polar) - gui_out << 71.0 << G4endl; // Light direction (Azimuthal) - - // ######### P3 - gui_out << 0.1 << G4endl; // Real edge width - gui_out << 0.1 << G4endl; // outline width - gui_out << 0.1 << G4endl; // aux edge width - gui_out << 3 << G4endl; // aux edge style - gui_out << 70.0<< G4endl; // aux-edge threshold angle - gui_out << 0.1 << G4endl; // line width - gui_out << 0 << G4endl; // haloing - gui_out << 1 << G4endl; // Dashed edged for back faces - - //######### P4 - //----- drawing device + //######### P4 + //----- drawing device // enum {PS=1, XWIN=2, PS2=3, XWIN2=4, OPEN_GL=5, DEVICE_END=6}; - if( ( ( std::getenv( FR_ENV_MULTI_WINDOW ) != NULL ) && \ - ( strcmp( std::getenv( FR_ENV_MULTI_WINDOW ),"0" ) ) ) || \ - ( ( std::getenv( FR_ENV_MULTI_WINDOW2 ) != NULL ) && \ - ( strcmp( std::getenv( FR_ENV_MULTI_WINDOW2 ),"0" ) ) ) ) - { - gui_out << 2 << G4endl; // OpenWindow - } else { - gui_out << 1 << G4endl; // Invoke PS viewer - } + if(((std::getenv(FR_ENV_MULTI_WINDOW) != NULL) && + (strcmp(std::getenv(FR_ENV_MULTI_WINDOW), "0"))) || + ((std::getenv(FR_ENV_MULTI_WINDOW2) != NULL) && + (strcmp(std::getenv(FR_ENV_MULTI_WINDOW2), "0")))) + { + gui_out << 2 << G4endl; // OpenWindow + } + else + { + gui_out << 1 << G4endl; // Invoke PS viewer + } - gui_out << GetPSViewer() << G4endl; // PS viewer - gui_out << 1 << G4endl ; // Do not add showpage - gui_out << 0 << G4endl ; // Non-append mode + gui_out << GetPSViewer() << G4endl; // PS viewer + gui_out << 1 << G4endl; // Do not add showpage + gui_out << 0 << G4endl; // Non-append mode - gui_out.close(); - //########### end of generating file .DAWN.history - - -} + gui_out.close(); + //########### end of generating file .DAWN.history +} diff --git a/source/visualization/FukuiRenderer/src/G4FRClientServer.cc b/source/visualization/FukuiRenderer/src/G4FRClientServer.cc deleted file mode 100644 index 1927f3dd46..0000000000 --- a/source/visualization/FukuiRenderer/src/G4FRClientServer.cc +++ /dev/null @@ -1,319 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// Satoshi TANAKA, Wed Jul 3 14:14:29 JST 1996 -//////////////////////////////// -///// G4FRClientServer.cc ///// -//////////////////////////////// - - -//=================// -#ifdef G4VIS_BUILD_DAWN_DRIVER -//=================// - -#include "G4VisManager.hh" -#include "G4FRClientServer.hh" - -// #define DEBUG_CLIENT_SERVER - -#include - - //----- const -const char DEFAULT_SUN_PATH[] = "FR_TMP3" ; -const int DEFAULT_PORT_NUMBER = 40701 ; -//const char FR_ENV_SERVER_HOST_NAME[] = "G4DAWN_HOST_NAME" ; // moved to .hh -const int MAX_CONNECT_TRIAL = 10 ; -const char FR_DEFAULT_HOST_NAME[] = "localhost" ; - - //----- G4FRClientServer::G4FRClientServer () -G4FRClientServer::G4FRClientServer ( char terminator , char end_line ) : - TERMINATOR ( terminator ) , - END_OF_LINE( end_line ) , - fSocketFd ( -1 ) -{ - SetSunPath ( DEFAULT_SUN_PATH ) ; // for Unix domain - SetPortNumber ( DEFAULT_PORT_NUMBER ) ; - ClearReceivedMessage () ; -} - - - //----- G4FRClientServer::ConnectUnix() -int G4FRClientServer::ConnectUnix() -{ - //----- local - int flag_connected = 0 ; - struct sockaddr_un server_address ; - - //----- make socket - fSocketFd = socket( AF_UNIX, SOCK_STREAM, 0 ); - if( fSocketFd < 0 ) { Err("G4FRClientServer::ConnectUnix(),socket"); } - - //----- set server address - memset( (char *)&server_address, '\0', sizeof(server_address)) ; - server_address.sun_family = AF_UNIX ; - strcpy( server_address.sun_path, SUN_PATH ); - - //----- connection - int connection_status = -1 ; - int num_trial = 0 ; - while( connection_status < 0 && num_trial <= MAX_CONNECT_TRIAL ) { - num_trial++ ; - connection_status = connect( fSocketFd, (struct sockaddr * )(&server_address), sizeof( server_address ) ) ; - if( connection_status <0 ) - { -#if defined DEBUG_CLIENT_SERVER - Err("G4FRClientServer::ConnectUnix(),connect => RETRY"); -#endif - flag_connected = 0 ; - } else { - flag_connected = 1 ; - break ; - } - - sleep(1); - - } // while(connection_status...) - - //----- return status of connection - return flag_connected ; - -} // G4FRClientServer::ConnectUnix() - - - //----- G4FRClientServer::Receive() -void G4FRClientServer::Receive() -{ - //----- - ClearReceivedMessage () ; - if( recv( fSocketFd, fReceivedMessage, G4FRClientServer::RECV_BUFMAX , 0 ) < 0 ) - { - Err("G4FRClientServer::Receive(), recv"); - } - -#if defined DEBUG_CLIENT_SERVER - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << ">>>>> receivedMessage = " << fReceivedMessage << G4endl; -#endif - -} - - - //----- G4FRClientServer::ReceiveLine() -void G4FRClientServer::ReceiveLine() -{ - //----- local - char buf[1]; - int index = 0 ; - - //----- receive a line (until newline) - memset(fReceivedMessage, '\0', RECV_BUFMAX) ; - while( read( fSocketFd, buf, 1 ) == 1 ) { - fReceivedMessage[index++] = buf[0]; - if( IsEndOfLine(buf[0]) ) { break ;} - } -} // G4FRClientServer::ReceiveLine() - - - //----- G4FRClientServer::Send() -void G4FRClientServer::Send() -{ - if( send( fSocketFd, fSendingMessage, strlen(fSendingMessage) , 0 ) < 0 ) - { - Err("G4FRClientServer::Send(), send"); - } - -#if defined DEBUG_CLIENT_SERVER - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "<<<<< SentMessage = " << fSendingMessage << G4endl; -#endif - -} // G4FRClientServer::Send() - - - //----- G4FRClientServer::Send( message ) -void G4FRClientServer::Send( const char* message ) -{ - this->SetSendingMessage( message ) ; - this->Send(); - -} // G4FRClientServer::Send( message ) - - - //----- G4FRClientServer::SendLine() -void G4FRClientServer::SendLine( const char* message ) -{ - //----- local - int smsg_length ; - - //----- set message to sending buf - this->SetSendingMessage( message ) ; - smsg_length = GetSendingMessageLength() ; - - //----- add newline if necessary - if( !IsEndOfLine( fSendingMessage[ (smsg_length - 1)] ) ) { - fSendingMessage[ smsg_length ] = GetEndOfLine() ; - fSendingMessage[ (smsg_length +1) ] = '\0' ; - smsg_length = GetSendingMessageLength(); - } - - //----- send - this->Send(); - -}// G4FRClientServer::SendLine() - - - //----- G4FRClientServer::DisConnect() -void G4FRClientServer::DisConnect() -{ - //----- close connection - if( shutdown(fSocketFd,2) < 0 ) { - Err("G4FRClientServer::DisConnect,shutdown"); - } - close( fSocketFd ); - - this->Clear(); -} - - - - //----- G4FRClientServer::Clear() -void G4FRClientServer::Clear() -{ - unlink(SUN_PATH) ; - fSocketFd = -1 ; -} - - - //----- G4FRClientServer::ConnectINET() -int G4FRClientServer::ConnectINET() -{ - //----- local - int flag_connected = 0 ; - sockaddr_in server_address ; - char server_hostname[32] ; - hostent* server_host_p ; - - //----- make socket - fSocketFd = socket( AF_INET, SOCK_STREAM, 0 ); - if( fSocketFd < 0 ) { -#if defined DEBUG_CLIENT_SERVER - Err("G4FRClientServer::ConnectINET(),socket"); -#endif - } - - //----- get IP address of server from its name - if( std::getenv( FR_ENV_SERVER_HOST_NAME ) != NULL ) - { - //----- get server name - strcpy( server_hostname, std::getenv( FR_ENV_SERVER_HOST_NAME ) ); - - //----- get IP address of server from its name, - //..... reading /etc/hosts - server_host_p = gethostbyname( server_hostname ) ; - - //----- If the host specified by FR_ENV_SERVER_HOST_NAME - //..... is not written in /etc/hosts, - //...... server host is set to the same as the - //...... client host - if( !server_host_p ) { -#if defined DEBUG_CLIENT_SERVER - Err("G4FRClientServer::ConnectINET(), gethostbyname"); -#endif - server_host_p = gethostbyname( FR_DEFAULT_HOST_NAME ) ; - } - - } else { - server_host_p = gethostbyname( FR_DEFAULT_HOST_NAME ) ; - } - - - -// #if defined DEBUG_CLIENT_SERVER - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** Trying connection to " << server_hostname << G4endl; -// #endif - - - //----- connection and binding - memset( (char *)&server_address, '\0', sizeof(server_address)) ; - // clear server_address - server_address.sin_family = AF_INET ; - server_address.sin_port = htons( PORT_NUMBER ); - memcpy( (char *)(&server_address.sin_addr ), - (char *)( server_host_p->h_addr ), - server_host_p->h_length ); - - int connection_status = -1 ; - int num_trial = 0 ; - while( connection_status < 0 && num_trial <= MAX_CONNECT_TRIAL ) { - num_trial++ ; - connection_status = connect( fSocketFd, (struct sockaddr * )(&server_address), sizeof( server_address ) ) ; - if( connection_status <0 ) - { -#if defined DEBUG_CLIENT_SERVER - Err("G4FRClientServer::ConnectINET(),connect => RETRY"); -#endif - flag_connected = 0 ; - } else { - flag_connected = 1 ; - break ; - } - - sleep(1); - - } // while(connection_status...) - - //----- return status of connection - return flag_connected ; - -} // G4FRClientServer::ConnectINET() - - - //----- G4FRClientServer::WaitSendBack() -void G4FRClientServer::WaitSendBack( const char* command_string ) -{ - //----- wait for sending back - while(1) { - this->ReceiveLine(); - - if( !strncmp( this->GetReceivedMessage(), \ - command_string , \ - (strlen(command_string)) ) ) - { - break; - } else { - sleep(2); - } - - } // while - - //----- clear buffer to receive message - this->ClearReceivedMessage(); - -} // G4FRClientServer::WaitSendBack() - -#endif // G4VIS_BUILD_DAWN_DRIVER diff --git a/source/visualization/FukuiRenderer/src/G4FukuiRenderer.cc b/source/visualization/FukuiRenderer/src/G4FukuiRenderer.cc deleted file mode 100644 index 4ecc1363fc..0000000000 --- a/source/visualization/FukuiRenderer/src/G4FukuiRenderer.cc +++ /dev/null @@ -1,271 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// -// Satoshi TANAKA -// FukuiRenderer factory. - -//=================// -#ifdef G4VIS_BUILD_DAWN_DRIVER -//=================// - -//#define DEBUG_FR_SYSTEM - - -#include "G4FukuiRenderer.hh" - -#define __G_ANSI_C__ - -#include "G4VisManager.hh" -//#include "G4VisFeaturesOfFukuiRenderer.hh" -#include "G4VSceneHandler.hh" -#include "G4FukuiRendererSceneHandler.hh" -#include "G4FukuiRendererViewer.hh" -#include "G4FRClientServer.hh" -#include "G4FRConst.hh" -#include "G4FRFeatures.hh" - - //----- constant -const int FR_DEFAULT_CONNECTION_TIME = 5 ; -const char FR_ENV_CONNECTION_TIME [] = "G4DAWN_CONNECTION_TIME"; -const char FR_ENV_DAWN_GUI_ALWAYS [] = "G4DAWN_GUI_ALWAYS"; - - //----- G4FukuiRenderer, constructor -G4FukuiRenderer::G4FukuiRenderer (): - G4VGraphicsSystem ("FukuiRenderer", - "DAWN", - FR_DAWNFILE_FEATURES, - G4VGraphicsSystem::threeD), - fPrimDest() , - fIPMode( G4FukuiRenderer::IP_UNIX ), - flag_use_gui (false) , - flag_connected (0) -{ - //----- sorting of objects - if( ( std::getenv( FR_ENV_DAWN_GUI_ALWAYS ) != NULL ) && \ - ( strcmp( std::getenv( FR_ENV_DAWN_GUI_ALWAYS ),"0" ) ) ) - { - flag_use_gui = true ; - } -} - - - //----- G4FukuiRenderer, destructor -G4FukuiRenderer::~G4FukuiRenderer () -{ - if( flag_connected ) { - //----- Terminate FukuiRenderer - fPrimDest.SendLine( FR_TERMINATE_DAWND ) ; - - //----- disconnection - fPrimDest.DisConnect(); - flag_connected = 0 ; - } -} - - //----- G4FukuiRenderer::CreateSceneHandler () -G4VSceneHandler* G4FukuiRenderer::CreateSceneHandler (const G4String& name) -{ - G4VSceneHandler* p = new G4FukuiRendererSceneHandler (*this, name); - - if(!flag_connected) { delete p ; p = NULL ; } - - return p; -} - - //----- G4FukuiRenderer::CreateViewer () -G4VViewer* G4FukuiRenderer::CreateViewer (G4VSceneHandler& scene, const G4String& name) -{ - if(!flag_connected) return NULL; - G4VViewer* pView = - new G4FukuiRendererViewer ((G4FukuiRendererSceneHandler&) scene, name); - return pView; -} - - //----- G4FukuiRenderer::UseInetDomainAuto() -void G4FukuiRenderer::UseInetDomainAuto() -{ - int pid ; - -#if defined DEBUG_FR_SYSTEM - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** Unix Inet Domain (AUTO mode)" << G4endl; -#endif - fIPMode = G4FukuiRenderer::IP_UNIX ; - - if( ( pid = fork() ) == 0 ) { // child - if ( execlp ( "dawn", "dawn", "-G" , (char *)0 ) < 0 ) - { - perror("dawn") ; - } - } else { // parent - - //----- Set waiting time to ensure connection - int connection_time = FR_DEFAULT_CONNECTION_TIME ; - if( std::getenv( FR_ENV_CONNECTION_TIME ) != NULL ) { - int sscanf_status = \ - sscanf( std::getenv( FR_ENV_CONNECTION_TIME ), "%d", &connection_time) ; - if ( sscanf_status == EOF ) { - connection_time = FR_DEFAULT_CONNECTION_TIME ; - } - } - - - //----- Wait for starting up of FukuiRenderer - sleep(connection_time); - - //----- establish connection - this->ConnectPort(); - } - - if(!flag_connected) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** ERROR: Connection failed" << G4endl; - } - else { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "***** GEANT4 is connected to FukuiRenderer DAWN "; - G4cout << "in the same host" << G4endl; - } - } - -} // G4FukuiRenderer::UseInetDomainAuto() - - - //----- G4FukuiRenderer::UseInetDomain() -void -G4FukuiRenderer::UseInetDomain() -{ -#if defined DEBUG_FR_SYSTEM - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** INET Domain " << G4endl; -#endif - fIPMode = G4FukuiRenderer::IP_INET ; - - this->ConnectPort(); - - if(!flag_connected) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** ERROR: Connection failed" << G4endl; - } - else { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "GEANT4 is connected to FukuiRenderer DAWN via socket" ; - G4cout << G4endl; - } - } - -} // G4FukuiRenderer::UseInetDomain() - -void -G4FukuiRenderer::ConnectPort( int max_port_incr ) -{ - //----- establish connection - int connect_trial = 0 ; - while(1) { - if ( ++connect_trial > max_port_incr ) { - this->flag_connected = 0 ; - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "***** INET Connection failed." << G4endl; - G4cout << " Maybe, you have not invoked DAWN yet," << G4endl; - G4cout << " or too many DAWN's are already running" << G4endl; - G4cout << " in the server host." << G4endl; - } - fPrimDest.IncrementPortNumber( (- FR_MAX_PORT_INCR) ); - return ; - } else if ( fPrimDest.ConnectINET() ) { - // INET domain connection is established - this->flag_connected = 1 ; - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "***** GEANT4 is connected to port " ; - G4cout << fPrimDest.GetPortNumber() ; - G4cout << " of server" << G4endl; - } - break ; - } else { - // Connection failed. Try the next port. - this->flag_connected = 0 ; - fPrimDest.IncrementPortNumber(); - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "***** GEANT4 incremented targeting port to " ; - G4cout << fPrimDest.GetPortNumber() << G4endl; - } - - } // if-elseif-else - - } // while (1) -} - - - //----- G4FukuiRenderer::UseBSDUnixDomainAuto() -void G4FukuiRenderer::UseBSDUnixDomainAuto() -{ - int pid ; - -#if defined DEBUG_FR_SYSTEM - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** UseBSDUnixDomainAuto " << G4endl; -#endif - fIPMode = G4FukuiRenderer::IP_UNIX ; // Unix domain - - if( ( pid = fork() ) == 0 ) { // child - if ( execlp ( "dawn", "dawn", "-g" , (char *)0 ) < 0 ) - { - perror("dawn") ; - } - } else { // parent - - //----- Sleep for a while to make sure that - //..... FukuiRenderer is ready - int connection_time = FR_DEFAULT_CONNECTION_TIME ; - if( std::getenv( FR_ENV_CONNECTION_TIME ) != NULL ) { - int sscanf_status = \ - sscanf( std::getenv( FR_ENV_CONNECTION_TIME ), "%d", &connection_time) ; - if ( sscanf_status == EOF ) { connection_time = FR_DEFAULT_CONNECTION_TIME ;} - } - sleep(connection_time); - - //----- connect GEANT4 to FukuiRenderer - this->flag_connected = fPrimDest.ConnectUnix(); - - //----- display status - if(!flag_connected) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** ERROR: Connection failed" << G4endl; - } else { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "*** GEANT4 is connected to FukuiRenderer DAWN "; - G4cout << "in the same host" << G4endl; - } - } - - } // if--else - -}// G4FukuiRenderer::UseBSDUnixDomainAuto() - - -#endif // G4VIS_BUILD_DAWN_DRIVER diff --git a/source/visualization/FukuiRenderer/src/G4FukuiRendererSceneHandler.cc b/source/visualization/FukuiRenderer/src/G4FukuiRendererSceneHandler.cc deleted file mode 100644 index d1b9caf165..0000000000 --- a/source/visualization/FukuiRenderer/src/G4FukuiRendererSceneHandler.cc +++ /dev/null @@ -1,214 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// -// Satoshi TANAKA, Fri Jun 28 11:34:24 JST 1996 -// FukuiRenderer scene. - - -//=================// -#ifdef G4VIS_BUILD_DAWN_DRIVER -//=================// - - -#define __G_ANSI_C__ - -// #define DEBUG_FR_SCENE - - //----- header files -#include -#include -#include "globals.hh" -#include "G4VisManager.hh" -#include "G4FRConst.hh" -#include "G4FukuiRenderer.hh" -#include "G4FukuiRendererSceneHandler.hh" -#include "G4FukuiRendererViewer.hh" -#include "G4Point3D.hh" -#include "G4VisAttributes.hh" -#include "G4Scene.hh" -#include "G4Transform3D.hh" -#include "G4Polyhedron.hh" -#include "G4Box.hh" -#include "G4Cons.hh" -#include "G4Polyline.hh" -#include "G4Trd.hh" -#include "G4Tubs.hh" -#include "G4Trap.hh" -#include "G4Torus.hh" -#include "G4Sphere.hh" -#include "G4Para.hh" -#include "G4Text.hh" -#include "G4Circle.hh" -#include "G4Square.hh" -#include "G4VPhysicalVolume.hh" - -//----- constants -const char FR_ENV_CULL_INVISIBLE_OBJECTS [] = "G4DAWN_CULL_INVISIBLE_OBJECTS"; -const char FR_ENV_MULTI_WINDOW[] = "G4DAWN_MULTI_WINDOW" ; - -/////////////////////////// -// Driver-dependent part // -/////////////////////////// - - - //----- G4FukuiRendererSceneHandler, constructor -G4FukuiRendererSceneHandler::G4FukuiRendererSceneHandler (G4FukuiRenderer& system, - const G4String& name): -G4VSceneHandler (system, fSceneIdCount++, name) , -fSystem (system) , -fPrimDest (system.GetPrimDest() ) , -FRflag_in_modeling (false) , -flag_saving_g4_prim (false) , -COMMAND_BUF_SIZE (G4FRClientServer::SEND_BUFMAX), -fPrec (9), fPrec2 (16) -{ - - //----- Connection to FukuiRenderer is set in the first scene - if( !fSystem.IsConnected() ) - { - if ( std::getenv( FR_ENV_NAMED_PIPE_CONNECTION ) != NULL &&\ - strcmp( std::getenv( FR_ENV_NAMED_PIPE_CONNECTION ), "0" ) ) - { - // Invoke DAWN locally and make connection - // via named pipe (not supported in AIX etc) - fSystem.UseBSDUnixDomainAuto(); - } else if( std::getenv( FR_ENV_SERVER_HOST_NAME ) == NULL ) - { - // Invoke DAWN locally and make connection - // via socket - fSystem.UseInetDomainAuto(); - } else { - // Connect to remote DAWN via socket - fSystem.UseInetDomain(); - } - } - - //----- precision control - if( std::getenv( "G4DAWN_PRECISION" ) != NULL ) { - sscanf( std::getenv("G4DAWN_PRECISION"), "%d", &fPrec ) ; - } else { - fPrec = 9 ; - } - fPrec2 = fPrec + 7 ; - -} // G4FukuiRendererSceneHandler, constructor - - - //----- G4FukuiRendererSceneHandler, destructor -G4FukuiRendererSceneHandler::~G4FukuiRendererSceneHandler () -{ -#if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** ~G4FukuiRendererSceneHandler" << G4endl; -#endif -} - -//----- -void G4FukuiRendererSceneHandler::FRBeginModeling( void ) -{ - if( !FRIsInModeling() ) - { -#if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererSceneHandler::FRBeginModeling (called & started)" << G4endl; -#endif - - //----- Begin Saving g4.prim file - // open g4.prim, ## - BeginSavingG4Prim(); - - //----- Send Bounding Box - // /BoundingBox - SendBoundingBox(); - - //----- drawing device - // !Device - // (Note: Not saved in g4.prim) - if( ( std::getenv( FR_ENV_MULTI_WINDOW ) != NULL ) && \ - ( strcmp( std::getenv( FR_ENV_MULTI_WINDOW ),"0" ) ) ) - { - ((G4FukuiRendererViewer*)fpViewer)->SendDevice( G4FukuiRendererViewer::FRDEV_XWIN ) ; - } else { - ((G4FukuiRendererViewer*)fpViewer)->SendDevice( G4FukuiRendererViewer::FRDEV_PS ) ; - } - - //----- drawing style - // /WireFrame, /Surface etc - // (Note: Not saved in g4.prim) - ((G4FukuiRendererViewer*)fpViewer)->SendDrawingStyle() ; - - //----- set view parameters - // /CameraPosition, /TargetPoint, - // /ZoomFactor, /FocalDistance, - // !GraphicalUserInterface - ((G4FukuiRendererViewer*)fpViewer)->SendViewParameters(); - - //----- send SET_CAMERA command - // !SetCamera -#if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** (!SetCamera in FRBeginModeling())" << G4endl; -#endif - SendStr( FR_SET_CAMERA ); - - //----- open device - // !OpenDevice -#if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** (!OpenDevice in FRBeginModeling())" << G4endl; -#endif - SendStr( FR_OPEN_DEVICE ); - - //----- begin sending primitives - // !BeginModeling -#if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** (!BeginModeling in FRBeginModeling())" << G4endl; -#endif - SendStr( FR_BEGIN_MODELING ); FRflag_in_modeling = true ; - - } // if - -} - -///////////////////////////////////////// -// Common to DAWN and DAWNFILE drivers // -///////////////////////////////////////// - -#define G4FRSCENEHANDLER G4FukuiRendererSceneHandler -#include "G4FRSceneFunc.icc" -#undef G4FRSCENEHANDLER - -////////////////////// -// static variables // -////////////////////// - - //----- static variables -G4int G4FukuiRendererSceneHandler::fSceneIdCount = 0; - -#endif // G4VIS_BUILD_DAWN_DRIVER diff --git a/source/visualization/FukuiRenderer/src/G4FukuiRendererViewer.cc b/source/visualization/FukuiRenderer/src/G4FukuiRendererViewer.cc deleted file mode 100644 index cc0ff94b04..0000000000 --- a/source/visualization/FukuiRenderer/src/G4FukuiRendererViewer.cc +++ /dev/null @@ -1,311 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// -// Satoshi TANAKA, Fri Jun 28 12:09:11 JST 1996 -// FukuiRenderer view - opens window, hard copy, etc. - - -//=================// -#ifdef G4VIS_BUILD_DAWN_DRIVER -//=================// - -#define __G_ANSI_C__ -#define G4FukuiRenderer_STRUCTURE_PRIORITY 1. - -// #define DEBUG_FR_VIEW - -#include "G4ios.hh" -#include -#include -#include - -#include "G4VisManager.hh" -#include "G4Scene.hh" -#include "G4Vector3D.hh" -#include "G4VisExtent.hh" -#include "G4LogicalVolume.hh" -#include "G4VSolid.hh" -#include "G4PhysicalConstants.hh" - -#include "G4FRConst.hh" -#include "G4FukuiRenderer.hh" -#include "G4FukuiRendererSceneHandler.hh" -#include "G4FukuiRendererViewer.hh" - - -//----- Constructor -G4FukuiRendererViewer::G4FukuiRendererViewer (G4FukuiRendererSceneHandler& sceneHandler, - const G4String& name): - G4VViewer (sceneHandler, - sceneHandler.IncrementViewCount (), - name), - fSceneHandler (sceneHandler) -{} - -//----- Destructor -G4FukuiRendererViewer::~G4FukuiRendererViewer () -{} - -//----- -void G4FukuiRendererViewer::SetView () -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererViewer::SetView(): No effects" << G4endl; -#endif -// Do nothing, since DAWN is running as a different process. -// SendViewParameters () will do this job instead. -} - -//----- -void -G4FukuiRendererViewer::ClearView( void ) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererViewer::ClearView (): No effects " << G4endl; -#endif - -} - - -//----- -void G4FukuiRendererViewer::DrawView () -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererViewer::DrawView () " << G4endl; -#endif - - //----- Begin modeling 3D - fSceneHandler.FRBeginModeling(); - - //----- Always visit G4 kernel - NeedKernelVisit (); - - //----- Draw - ProcessView () ; - -} - - -//----- -void G4FukuiRendererViewer::ShowView( void ) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererViewer::ShowView () " << G4endl; -#endif - - if( fSceneHandler.FRIsInModeling() ) - { - //----- End of modeling - // !EndModeling, !DrawAll, !CloseDevice, - // close g4.prim - fSceneHandler.FREndModeling(); - - //----- Wait user clicks drawing Area - this->Wait(); - } - -} - - -//----- -void G4FukuiRendererViewer::Wait() -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererViewer::Wait () : Begin" << G4endl; -#endif - fSceneHandler.SendStr ( FR_WAIT ); - fSceneHandler.GetPrimDest().WaitSendBack( FR_WAIT ); -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererViewer::Wait () : end" << G4endl; -#endif - -} - - -//----- -void -G4FukuiRendererViewer::SendDevice( FRDEV dev ) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererViewer::SendDevice() " << G4endl; -#endif - - // enum {PS=1, XWIN=2, PS2=3, XWIN2=4, OPEN_GL=5, DEVICE_END=6}; - - if( dev >= FRDEV_PS && dev < FRDEV_DEVICE_END ) { - fSceneHandler.SendStrInt ( FR_DEVICE, dev ); - } -} - - -//----- -void G4FukuiRendererViewer::SendDrawingStyle() -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererViewer::SendDrawingStyle() " << G4endl; -#endif - - G4int style = fVP.GetDrawingStyle(); - - switch( style ) - { - case G4ViewParameters::wireframe: - fSceneHandler.SendStr( FR_WIREFRAME ); - break; - case G4ViewParameters::hlr: - fSceneHandler.SendStr( FR_LINES ); - break; - case G4ViewParameters::hsr: - case G4ViewParameters::hlhsr: - fSceneHandler.SendStr( FR_SURFACE ); - break; - default: - fSceneHandler.SendStr( FR_WIREFRAME ); - break; - } - -} - - -//----- -void G4FukuiRendererViewer::SendViewParameters () -{ - // Calculates view representation based on extent of object being - // viewed and (initial) direction of camera. (Note: it can change - // later due to user interaction via visualization system's GUI.) - -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4FukuiRendererViewer::SendViewParameters()" << G4endl; -#endif - - //----- Magic number to decide camera distance automatically - const G4double HOW_FAR = 1000.0 ; // to define "infinity" - const G4double MIN_HALF_ANGLE = 0.01 ; - const G4double MAX_HALF_ANGLE = 0.499 * pi ; - - //----- (2A) CALC camera distance - //..... Note: Camera cannot enter inside object - G4double camera_distance ; - G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius(); - - G4double half_view_angle = std::fabs ( fVP.GetFieldHalfAngle () ) ; - if( half_view_angle > MAX_HALF_ANGLE ) { - half_view_angle = MAX_HALF_ANGLE ; - } - - if( half_view_angle < MIN_HALF_ANGLE ) { - //----- infinity (or ortho projection) - camera_distance = radius * HOW_FAR ; - } else { - //----- Calc camera distance from half view angle - camera_distance = radius / std::sin ( half_view_angle ); - camera_distance -= fVP.GetDolly(); - } - - if ( camera_distance < radius ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "WARNING from FukuiRenderer (DAWN) driver:" << G4endl; - G4cout << " Camera cannot enter inside objects" << G4endl; - } - camera_distance = radius ; - } - - //----- (3A) CALC camera direction - const G4Vector3D& camera_direction \ - = fVP.GetViewpointDirection().unit(); - const G4double v_angle = (180.0 / pi) * camera_direction.theta() ; - const G4double h_angle = (180.0 / pi) * camera_direction.phi () ; - - //----- (2B), (3B) SEND camera position - fSceneHandler.SendStrDouble3( FR_CAMERA_POSITION, - camera_distance, - v_angle, - h_angle ); - - //----- (4A) CALC target point - const G4Point3D& target_point - = fSceneHandler.GetScene()->GetStandardTargetPoint() - + fVP.GetCurrentTargetPoint(); - - //----- (4B) SEND target point - fSceneHandler.SendStrDouble3( FR_TARGET_POINT, - target_point.x(), - target_point.y(), - target_point.z() ); - - //----- (5A) CALC zoom factor - const G4double zoom_factor = fVP.GetZoomFactor(); - - //----- (5B) SEND zoom factor or focal length - if( half_view_angle < MIN_HALF_ANGLE ) { - - const G4Point3D& std_target_point \ - = fSceneHandler.GetScene()->GetStandardTargetPoint(); - - fSceneHandler.SendStrDouble4( FR_ZOOM_FACTOR, - zoom_factor , - std_target_point.x(), - std_target_point.y(), - std_target_point.z()); - // Note that target point, camera position, - // and bounding box have already been sent above. - // The std_target_point is necessary to - // Calc focal distance from the zoom factor. - } else { - const G4double FR_HALF_SCREEN_SIZE = 0.5 ; - G4double focal_distance \ - = FR_HALF_SCREEN_SIZE / std::tan( half_view_angle ); - focal_distance *= zoom_factor ; - fSceneHandler.SendStrDouble ( FR_FOCAL_DISTANCE, focal_distance ); - } - - //----- INVOKE GUI: not executed in the default setting - if( fSceneHandler.GetSystem().IsGUIMode() ) { - //----- send GUI command - fSceneHandler.SendStr( FR_GUI ); - - //----- wait the same command is sent back: - //..... This avoids to send many data before - //..... GUI session is over. - fSceneHandler.GetPrimDest().WaitSendBack( FR_GUI ); - } - -} - -#endif // G4VIS_BUILD_DAWN_DRIVER - - diff --git a/source/visualization/FukuiRenderer/src/G4VisFeaturesOfDAWNFILE.cc b/source/visualization/FukuiRenderer/src/G4VisFeaturesOfDAWNFILE.cc index 86923c69d5..9e5b6cde2b 100644 --- a/source/visualization/FukuiRenderer/src/G4VisFeaturesOfDAWNFILE.cc +++ b/source/visualization/FukuiRenderer/src/G4VisFeaturesOfDAWNFILE.cc @@ -27,6 +27,8 @@ // #include "G4VisFeaturesOfDAWNFILE.hh" +//clang-format off + G4String G4VisFeaturesOfDAWNFILE () { return "High quality technical renderer." diff --git a/source/visualization/FukuiRenderer/src/G4VisFeaturesOfFukuiRenderer.cc b/source/visualization/FukuiRenderer/src/G4VisFeaturesOfFukuiRenderer.cc deleted file mode 100644 index 1838a62922..0000000000 --- a/source/visualization/FukuiRenderer/src/G4VisFeaturesOfFukuiRenderer.cc +++ /dev/null @@ -1,44 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// - -#include "G4VisFeaturesOfFukuiRenderer.hh" - -G4String G4VisFeaturesOfFukuiRenderer () { - return - "High quality technical renderer." - "\n Features: exact hidden line, hidden surface algorithms." - "\n high (unlimited) resolution." - "\n renders to PostScript for viewing and/or hardcopy." - "\n remote rendering." - "\n off-line rendering." - "\n graphical user interface." - "\n Disadvantages: compute intensive, takes time (use a fast graphics" - "\n system, such as OpenGL, to select view, then copy" - "\n to this renderer - /vis~/copy/view, /vis~/set/view)."; -} diff --git a/source/visualization/GNUmakefile b/source/visualization/GNUmakefile index bcd1673dba..0d107689ed 100644 --- a/source/visualization/GNUmakefile +++ b/source/visualization/GNUmakefile @@ -56,10 +56,10 @@ ifdef G4VIS_BUILD_QT3D_DRIVER SUBDIRS += Qt3D SUBLIBS += G4visQt3D endif -#ifdef G4VIS_BUILD_TOOLSSG_DRIVER +ifdef G4VIS_BUILD_TOOLSSG_DRIVER SUBDIRS += ToolsSG SUBLIBS += G4ToolsSG -#endif +endif endif #G4VIS_BUILD .PHONY: granular obj glob global clean diff --git a/source/visualization/HepRep/History b/source/visualization/HepRep/History index 8c53c49dc1..936ed23998 100644 --- a/source/visualization/HepRep/History +++ b/source/visualization/HepRep/History @@ -18,6 +18,17 @@ committal in the CVS repository ! History file for visualization/HepRep sub-category -------------------------------------------------- +27 August 2021 Ben Morgan (vis-HepRep-V10-07-04) +- Remove obsolete HepRep(WIRED) driver and associated files + +30 June 2021 John Allison (vis-HepRep-V10-07-03) +- Requires greps-V10-07-09, modeling-V10-07-11 and visman-V10-07-11. +- Revise vis models. See visualization/modeling/History for more details. +- Consequent changes: + o AddPrimitive(const G4Scale&) has been removed from all scene handlers. + +29 June 2021 Gabriele Cosmo (vis-HepRep-V10-07-02) +- Fixed compilation error in G4HepRepSceneHandler when c++20 is enabled. 07 June 2021 John Allison (vis-HepRep-V10-07-01) - Fix hidden function warning. diff --git a/source/visualization/HepRep/README b/source/visualization/HepRep/README deleted file mode 100644 index 2c3dfba5f3..0000000000 --- a/source/visualization/HepRep/README +++ /dev/null @@ -1,152 +0,0 @@ -This G4 Graphics Driver creates a HepRep File suitable for viewing -by the HepRApp, Wired4 or FRED Event Display clients. -It requires no external packages. - -The HepRep graphics format is further described at -http://www.slac.stanford.edu/~perl/heprep/ - - -Two different drivers are available for either HepRep1 or HepRep2. - - -Driver: HepRepFile ------------------- -The version of HepRep produced by this driver is HepRep Version 1. - -Writes files with file extension .heprep. - -First file is written to current directory and is named G4Data0.heprep. -Subsequent files increment the number, as in G4Data1.heprep, G4Data2.heprep... - -To specify a different output file directory (instead of current directory), -set G4HEPREPFILE_DIR - -To specify a different output file name (instead of G4Data), -set G4HEPREPFILE_NAME - -To repeatedly overwrite the same output file (instead of having incremental -numbers at the end of the file name), -set G4HEPREPFILE_OVERWRITE - -By default, invisible objects are not culled but are left in the heprep file -with their visibility initially set to false (so that you can subsequently -choose to make them visible from within the heprep browser). -To force culling of invisible objects, -set G44HEPREPFILE_CULL - -View the file using the HepRApp HepRep Browser, available from: -http://www.slac.stanford.edu/~perl/HepRApp - -HepRApp can read xml files in zipped format as well as unzipped, -so you can save space by applying gzip to the xml file. -This will reduce the file to about five percent of its original size. - -Joseph Perl -15 November 2007 - - -Driver: HepRepXML ------------------ -The version of HepRep produced by this driver is HepRep Version 2. - -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. - -You can view the files using the WIRED 4 Event Display, available from: - -http://wired4.freehep.org - -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 such as: -.heprep.zip, .heprep.gz, .heprep, .bheprep.zip, .bheprep.gz or .bheprep -use for instance: - -/vis/scene/create filename.bheprep.zip - - -(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 - - -To select the driver, where the file if not create by scene is set to -G4HepRepOutput.heprep.zip, use: - -/vis/open HepRepXML - - -(Optional) To write a geometry, use: - -/vis/viewer/flush - - -(Optional) To signal a change in geometry (to be written with the next event), use: - -/vis/viewer/refresh - - -To write 10 events (and geometries), use: - -/run/beamOn 10 - - -(Optional) To accumulate multiple (5) G4 events into one HepRep event, use: -/vis/scene/endOfEventAction accumulate -/run/beamOn 5 -/vis/viewer/update - - -(Optional) To add attributes to each point on a trajectory, use: -/vis/heprep/addPointAttributes 1 -Be aware that this may increase the size of the output dramatically. - - -(Optional) You may use the commands: -/vis/viewer/zoom to set an initial zoom factor -/vis/viewer/set/viewpointThetaPhi to set an initial view point -/vis/heprep/setCoordinateSystem uvw 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 - - -(Optional) To close the file, remove the SceneHandler, use: - -/vis/sceneHandler/remove scene-handler-0 - - -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. - -1 June 2005 -Mark.Donszelmann@slac.stanford.edu diff --git a/source/visualization/HepRep/include/G4HepRepFile.hh b/source/visualization/HepRep/include/G4HepRepFile.hh index fd14f8e43d..5aaa3b4500 100644 --- a/source/visualization/HepRep/include/G4HepRepFile.hh +++ b/source/visualization/HepRep/include/G4HepRepFile.hh @@ -25,7 +25,7 @@ // // // -// +// // John Allison 5th April 2001 // A graphics system to dump geometry hierarchy. @@ -37,14 +37,15 @@ // HepRep #include "G4HepRepFileXMLWriter.hh" -class G4HepRepFile: public G4VGraphicsSystem { -public: +class G4HepRepFile : public G4VGraphicsSystem +{ + public: G4HepRepFile(); virtual ~G4HepRepFile(); G4VSceneHandler* CreateSceneHandler(const G4String& name = ""); - G4VViewer* CreateViewer (G4VSceneHandler&, const G4String& name = ""); + G4VViewer* CreateViewer(G4VSceneHandler&, const G4String& name = ""); - G4HepRepFileXMLWriter *GetHepRepXMLWriter(); + G4HepRepFileXMLWriter* GetHepRepXMLWriter(); }; #endif diff --git a/source/visualization/HepRep/include/G4HepRepFileSceneHandler.hh b/source/visualization/HepRep/include/G4HepRepFileSceneHandler.hh index 595e4b2933..7bda3b88ef 100644 --- a/source/visualization/HepRep/include/G4HepRepFileSceneHandler.hh +++ b/source/visualization/HepRep/include/G4HepRepFileSceneHandler.hh @@ -55,11 +55,10 @@ class G4LogicalVolume; class G4ModelingParameters; class G4VisTrajContext; -class G4HepRepFileSceneHandler: public G4VSceneHandler { - -public: - G4HepRepFileSceneHandler(G4VGraphicsSystem& system, - const G4String& name); +class G4HepRepFileSceneHandler : public G4VSceneHandler +{ + public: + G4HepRepFileSceneHandler(G4VGraphicsSystem& system, const G4String& name); virtual ~G4HepRepFileSceneHandler(); //////////////////////////////////////////////////////////////// @@ -80,9 +79,9 @@ public: void AddSolid(const G4VSolid&); using G4VSceneHandler::AddCompound; - void AddCompound (const G4VTrajectory&); + void AddCompound(const G4VTrajectory&); void InitTrajectory(); - void AddCompound (const G4VHit&); + void AddCompound(const G4VHit&); void InitHit(); // void PreAddSolid(const G4Transform3D& objectTransformation, @@ -114,28 +113,27 @@ public: void BeginModeling(); void EndModeling(); - + void BeginPrimitives2D(const G4Transform3D& objectTransformation); void EndPrimitives2D(); ////////////////////////////////////////////////////////////// // Administration functions. - //void ClearStore (); - void ClearTransientStore (); + // void ClearStore (); + void ClearTransientStore(); //////////////////////////////////////////////////////////////// // Required... - G4HepRepFileXMLWriter *GetHepRepXMLWriter(); + G4HepRepFileXMLWriter* GetHepRepXMLWriter(); -protected: - static G4int fSceneIdCount; // Counter for HepRep scene handlers. + protected: + static G4int fSceneIdCount; // Counter for HepRep scene handlers. -private: - G4HepRepFileXMLWriter *hepRepXMLWriter; - void AddHepRepInstance(const char* primName, - const G4Visible visible); + private: + G4HepRepFileXMLWriter* hepRepXMLWriter; + void AddHepRepInstance(const char* primName, const G4Visible visible); void CheckFileOpen(); int fileCounter; G4bool haveVisible; @@ -146,18 +144,17 @@ private: G4bool doneInitTraj; G4bool drawingHit; G4bool doneInitHit; - + const G4VisTrajContext* trajContext; - + std::vector* trajAttValues; - std::map* trajAttDefs; + std::map* trajAttDefs; std::vector* hitAttValues; - std::map* hitAttDefs; - + std::map* hitAttDefs; + #ifdef G4HEPREPFILEDEBUG void PrintThings(); #endif - }; #endif diff --git a/source/visualization/HepRep/include/G4HepRepFileViewer.hh b/source/visualization/HepRep/include/G4HepRepFileViewer.hh index 7e5842282a..c53c2c4276 100644 --- a/source/visualization/HepRep/include/G4HepRepFileViewer.hh +++ b/source/visualization/HepRep/include/G4HepRepFileViewer.hh @@ -25,7 +25,7 @@ // // // -// +// // John Allison 5th April 2001 // A base class for a dummy viewer to dump geometry hierarchy. @@ -39,17 +39,18 @@ #include "G4HepRepFileXMLWriter.hh" #include "G4HepRepFileSceneHandler.hh" -class G4HepRepFileViewer: public G4VViewer { -public: - G4HepRepFileViewer(G4VSceneHandler&,const G4String& name); +class G4HepRepFileViewer : public G4VViewer +{ + public: + G4HepRepFileViewer(G4VSceneHandler&, const G4String& name); virtual ~G4HepRepFileViewer(); void SetView(); void ClearView(); void DrawView(); void ShowView(); -private: - G4HepRepFileXMLWriter *hepRepXMLWriter; + private: + G4HepRepFileXMLWriter* hepRepXMLWriter; }; #endif diff --git a/source/visualization/HepRep/include/G4HepRepFileXMLWriter.hh b/source/visualization/HepRep/include/G4HepRepFileXMLWriter.hh index a8cd5fcadb..f9794b7fa4 100644 --- a/source/visualization/HepRep/include/G4HepRepFileXMLWriter.hh +++ b/source/visualization/HepRep/include/G4HepRepFileXMLWriter.hh @@ -49,7 +49,7 @@ class G4HepRepFileXMLWriter { -public: + public: G4HepRepFileXMLWriter(); void addType(const char* name, int newTypeDepth); @@ -57,27 +57,19 @@ public: void addPrimitive(); void addPoint(double x, double y, double z); - void addAttDef(const char* name, - const char* desc, - const char* type, - const char* extra); + void addAttDef(const char* name, const char* desc, const char* type, + const char* extra); - void addAttValue(const char* name, - const char* value); + void addAttValue(const char* name, const char* value); - void addAttValue(const char* name, - double value); + void addAttValue(const char* name, double value); - void addAttValue(const char* name, - int value); + void addAttValue(const char* name, int value); - void addAttValue(const char* name, - bool value); + void addAttValue(const char* name, bool value); - void addAttValue(const char* name, - double value1, - double value2, - double value3); + void addAttValue(const char* name, double value1, double value2, + double value3); void open(const char* filespec); void close(); @@ -89,8 +81,8 @@ public: bool inType[50]; bool inInstance[50]; char* prevTypeName[50]; - -private: + + private: std::ofstream fout; void init(); diff --git a/source/visualization/HepRep/include/G4HepRepMessenger.hh b/source/visualization/HepRep/include/G4HepRepMessenger.hh index 5aa2373caf..5540eaaa81 100644 --- a/source/visualization/HepRep/include/G4HepRepMessenger.hh +++ b/source/visualization/HepRep/include/G4HepRepMessenger.hh @@ -37,71 +37,71 @@ #include "G4UIcommand.hh" #include "G4ThreeVector.hh" -class G4HepRepMessenger : public G4UImessenger { - - public: - static G4HepRepMessenger* GetInstance(); // Singleton constructor. - virtual ~G4HepRepMessenger(); +class G4HepRepMessenger : public G4UImessenger +{ + public: + static G4HepRepMessenger* GetInstance(); // Singleton constructor. + virtual ~G4HepRepMessenger(); - virtual G4String GetCurrentValue(G4UIcommand * command); - virtual void SetNewValue(G4UIcommand * command, G4String newValue); - - // Used by HepRepFile - virtual G4String getFileDir(); - virtual G4String getFileName(); - virtual G4bool getOverwrite(); - virtual G4bool getCullInvisibles(); - virtual G4bool renderCylAsPolygons(); - virtual G4double getScale(); - virtual G4ThreeVector getCenter(); - - // Used by HepRepXML - virtual G4String getEventNumberSuffix(); - virtual G4bool appendGeometry(); - virtual G4bool addPointAttributes(); - virtual G4bool useSolids(); - virtual G4bool writeInvisibles(); + virtual G4String GetCurrentValue(G4UIcommand* command); + virtual void SetNewValue(G4UIcommand* command, G4String newValue); - private: - G4HepRepMessenger(); // Private constructor. - static G4HepRepMessenger* fpInstance; - - G4UIdirectory* heprepDirectory; - - G4String fileDir; - G4UIcmdWithAString* setFileDirCommand; - - G4String fileName; - G4UIcmdWithAString* setFileNameCommand; - - G4bool overwrite; - G4UIcmdWithABool* setOverwriteCommand; - - G4bool cullInvisibles; - G4UIcmdWithABool* setCullInvisiblesCommand; - - G4bool cylAsPolygons; - G4UIcmdWithABool* renderCylAsPolygonsCommand; - - G4double scale; - G4UIcmdWithADouble* setScaleCommand; - - G4ThreeVector center; - G4UIcmdWith3VectorAndUnit* setCenterCommand; - - G4String suffix; - G4UIcmdWithAString* setEventNumberSuffixCommand; - - G4bool geometry; - G4UIcmdWithABool* appendGeometryCommand; + // Used by HepRepFile + virtual G4String getFileDir(); + virtual G4String getFileName(); + virtual G4bool getOverwrite(); + virtual G4bool getCullInvisibles(); + virtual G4bool renderCylAsPolygons(); + virtual G4double getScale(); + virtual G4ThreeVector getCenter(); - G4bool pointAttributes; - G4UIcmdWithABool* addPointAttributesCommand; + // Used by HepRepXML + virtual G4String getEventNumberSuffix(); + virtual G4bool appendGeometry(); + virtual G4bool addPointAttributes(); + virtual G4bool useSolids(); + virtual G4bool writeInvisibles(); - G4bool solids; - G4UIcmdWithABool* useSolidsCommand; - - G4bool invisibles; + private: + G4HepRepMessenger(); // Private constructor. + static G4HepRepMessenger* fpInstance; + + G4UIdirectory* heprepDirectory; + + G4String fileDir; + G4UIcmdWithAString* setFileDirCommand; + + G4String fileName; + G4UIcmdWithAString* setFileNameCommand; + + G4bool overwrite; + G4UIcmdWithABool* setOverwriteCommand; + + G4bool cullInvisibles; + G4UIcmdWithABool* setCullInvisiblesCommand; + + G4bool cylAsPolygons; + G4UIcmdWithABool* renderCylAsPolygonsCommand; + + G4double scale; + G4UIcmdWithADouble* setScaleCommand; + + G4ThreeVector center; + G4UIcmdWith3VectorAndUnit* setCenterCommand; + + G4String suffix; + G4UIcmdWithAString* setEventNumberSuffixCommand; + + G4bool geometry; + G4UIcmdWithABool* appendGeometryCommand; + + G4bool pointAttributes; + G4UIcmdWithABool* addPointAttributesCommand; + + G4bool solids; + G4UIcmdWithABool* useSolidsCommand; + + G4bool invisibles; }; #endif diff --git a/source/visualization/HepRep/include/G4HepRepSceneHandler.hh b/source/visualization/HepRep/include/G4HepRepSceneHandler.hh deleted file mode 100644 index 4a472121cc..0000000000 --- a/source/visualization/HepRep/include/G4HepRepSceneHandler.hh +++ /dev/null @@ -1,225 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// - -/** - * @author Mark Donszelmann - */ - -#ifndef G4HEPREPSCENEHANDLER_HH -#define G4HEPREPSCENEHANDLER_HH 1 - -#include "globals.hh" -#include -#include -#include -#include - -// HepRep -#include "HEPREP/HepRep.h" - -//G4 -#include "G4Box.hh" -#include "G4Cons.hh" -#include "G4Tubs.hh" -#include "G4Trd.hh" -#include "G4Trap.hh" -#include "G4Sphere.hh" -#include "G4Para.hh" -#include "G4Torus.hh" -#include "G4Polycone.hh" -#include "G4Polyhedra.hh" - -#include "G4VGraphicsSystem.hh" -#include "G4VSceneHandler.hh" -#include "G4Visible.hh" -#include "G4Material.hh" -#include "G4LogicalVolume.hh" -#include "G4PhysicalVolumeModel.hh" - -class G4HepRepSceneHandler: public G4VSceneHandler { - - public: - G4HepRepSceneHandler (G4VGraphicsSystem& system, const G4String& name = ""); - virtual ~G4HepRepSceneHandler (); - - void AddSolid (const G4Box& box); - void AddSolid (const G4Cons& cons); - void AddSolid (const G4Tubs& tubs); - void AddSolid (const G4Trd& trd); - void AddSolid (const G4Trap& trap); - void AddSolid (const G4Sphere& sphere); - void AddSolid (const G4Para& para); - void AddSolid (const G4Torus& torus); - void AddSolid (const G4Polycone& polycone); - void AddSolid (const G4Polyhedra& polyhedra); - void AddSolid (const G4Orb& orb); - void AddSolid (const G4Ellipsoid& ellipsoid); - void AddSolid (const G4TessellatedSolid& tess); - void AddSolid (const G4VSolid& solid); - - using G4VSceneHandler::AddCompound; - void AddCompound (const G4VTrajectory&); - void AddCompound (const G4VHit& hit); - - void PreAddSolid (const G4Transform3D& objectTransformation, const G4VisAttributes& visAttribs); - void PostAddSolid (); - - void AddPrimitive (const G4Polyline&); - void AddPrimitive (const G4Text&); - void AddPrimitive (const G4Circle&); - void AddPrimitive (const G4Square&); - void AddPrimitive (const G4Polyhedron&); - - void AddPrimitive (const G4Polymarker&); - void AddPrimitive (const G4Scale& scale); - - void BeginPrimitives (const G4Transform3D& objectTransformation); - void EndPrimitives (); - void BeginModeling (); - void EndModeling (); - - void openHepRep(); - bool closeHepRep(bool final = false); - void openFile(G4String name); - void closeFile(); - - private: - G4HepRepSceneHandler (const G4HepRepSceneHandler&); - G4HepRepSceneHandler& operator= (const G4HepRepSceneHandler&); - static G4int sceneIdCount; - - G4Transform3D transform; - - std::ostream* out; - HEPREP::HepRepFactory* factory; - HEPREP::HepRepWriter* writer; - - // Methods - G4bool dontWrite(); - - void setColor (HEPREP::HepRepAttribute *attribute, const G4Color& color, - const G4String& key = G4String("Color")); - G4Color getColorFor (const G4Visible& visible); - G4Color getColorFor (const G4VSolid& solid); - - void setVisibility (HEPREP::HepRepAttribute *attribute, const G4VSolid& solid); - void setLine (HEPREP::HepRepAttribute *attribute, const G4VSolid& solid); - - void setVisibility (HEPREP::HepRepAttribute *attribute, const G4Visible& visible); - void setLine (HEPREP::HepRepAttribute *attribute, const G4Visible& visible); - - void setMarker (HEPREP::HepRepAttribute *attribute, const G4VMarker& marker); - - inline void setAttribute (HEPREP::HepRepAttribute* attribute, G4String name, char* value) { - setAttribute(attribute, name, G4String(value)); - } - void setAttribute (HEPREP::HepRepAttribute* attribute, G4String name, G4String value); - void setAttribute (HEPREP::HepRepAttribute* attribute, G4String name, bool value); - void setAttribute (HEPREP::HepRepAttribute* attribute, G4String name, double value); - void setAttribute (HEPREP::HepRepAttribute* attribute, G4String name, int value); - void setAttribute (HEPREP::HepRepAttribute* attribute, G4String name, double red, double green, double blue, double alpha); - - bool isEventData(); - - void open(G4String name); - void close(); - - void writeLayers(HEPREP::HepRep* heprep); - - void addAttributes(HEPREP::HepRepInstance* instance, HEPREP::HepRepType* type); - - void addAttDefs(HEPREP::HepRepDefinition* definition, const std::map* attDefs); - void addAttVals(HEPREP::HepRepAttribute* attribute, const std::map* attDefs, std::vector* attValues); - - void addTopLevelAttributes(HEPREP::HepRepType* type); - - HEPREP::HepRepInstance* getGeometryOrEventInstance(HEPREP::HepRepType* type); - - // Returns the particular instance/type or if not created, creates them and adds them to the HepRep - HEPREP::HepRep* getHepRep(); - HEPREP::HepRep* getHepRepGeometry(); - HEPREP::HepRepInstanceTree* getGeometryInstanceTree(); - HEPREP::HepRepInstance* getGeometryInstance(G4LogicalVolume* volume, G4Material* material, int depth); - HEPREP::HepRepInstance* getGeometryInstance(G4String volumeName, int depth); - HEPREP::HepRepInstance* getGeometryRootInstance(); - HEPREP::HepRepTypeTree* getGeometryTypeTree(); - HEPREP::HepRepType* getGeometryType(G4String volumeName, int depth); - HEPREP::HepRepType* getGeometryRootType(); - HEPREP::HepRepInstanceTree* getEventInstanceTree(); - HEPREP::HepRepInstance* getEventInstance(); - HEPREP::HepRepTypeTree* getEventTypeTree(); - HEPREP::HepRepType* getEventType(); - HEPREP::HepRepType* getTrajectoryType (); - HEPREP::HepRepType* getHitType (); - HEPREP::HepRepType* getCalHitType (); - HEPREP::HepRepType* getCalHitFaceType (); - - G4String getFullTypeName(G4String volumeName, int depth); - G4String getParentTypeName(int currentDepth); - - // initialized Member Variables - G4String geometryLayer, eventLayer, calHitLayer; - G4String trajectoryLayer, hitLayer; - G4String rootVolumeName; - - G4String baseName; - G4String eventNumberPrefix; - G4String eventNumberSuffix; - G4int eventNumber; - G4int eventNumberWidth; - G4String extension; - G4bool writeBinary; - G4bool writeZip; - G4bool writeGZ; - G4bool writeMultipleFiles; - const G4VHit* currentHit; - const G4VTrajectory* currentTrack; - - // DO NOT USE member vars directly, use get methods. - HEPREP::HepRep* _heprep; - HEPREP::HepRep* _heprepGeometry; - HEPREP::HepRepInstanceTree* _geometryInstanceTree; - std::vector _geometryInstance; - HEPREP::HepRepInstance* _geometryRootInstance; - HEPREP::HepRepTypeTree* _geometryTypeTree; - std::vector _geometryTypeName; - std::map _geometryType; - HEPREP::HepRepType* _geometryRootType; - HEPREP::HepRepInstanceTree* _eventInstanceTree; - HEPREP::HepRepInstance* _eventInstance; - HEPREP::HepRepTypeTree* _eventTypeTree; - HEPREP::HepRepType* _eventType; - HEPREP::HepRepType* _trajectoryType; - HEPREP::HepRepType* _hitType; - HEPREP::HepRepType* _calHitType; - HEPREP::HepRepType* _calHitFaceType; - - std::map materialState; -}; - -#endif - diff --git a/source/visualization/HepRep/include/HEPREP/HasHepRep.h b/source/visualization/HepRep/include/HEPREP/HasHepRep.h deleted file mode 100644 index 7a8c7b0303..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HasHepRep.h +++ /dev/null @@ -1,34 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HASHEPREP_H -#define HEPREP_HASHEPREP_H 1 - -// Copyright 2000-2005, FreeHEP. - -namespace HEPREP { - -class HepRep; - -/** - * The HasHepRep interface. - * - * @author Mark Donszelmann - */ -class HasHepRep { - -public: - /// Destructor. - virtual ~HasHepRep() { /* nop */; } - - /** - * Returns the associated HepRep to this object. - * - */ - virtual HepRep & getHepRep() = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HASHEPREP_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRep.h b/source/visualization/HepRep/include/HEPREP/HepRep.h deleted file mode 100644 index 6828444609..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRep.h +++ /dev/null @@ -1,210 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREP_H -#define HEPREP_HEPREP_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include -#include - -// Include all other HepRep header files here for convenience -#include "HEPREP/HasHepRep.h" -#include "HEPREP/HepRepAction.h" -#include "HEPREP/HepRepAttDef.h" -#include "HEPREP/HepRepAttribute.h" -#include "HEPREP/HepRepAttributeListener.h" -#include "HEPREP/HepRepAttValue.h" -#include "HEPREP/HepRepConstants.h" -#include "HEPREP/HepRepDefinition.h" -#include "HEPREP/HepRepFactory.h" -#include "HEPREP/HepRepFrameListener.h" -#include "HEPREP/HepRepInstance.h" -#include "HEPREP/HepRepInstanceTree.h" -#include "HEPREP/HepRepIterator.h" -#include "HEPREP/HepRepPoint.h" -#include "HEPREP/HepRepSelectFilter.h" -#include "HEPREP/HepRepTreeID.h" -#include "HEPREP/HepRepType.h" -#include "HEPREP/HepRepTypeTree.h" -#include "HEPREP/HepRepWriter.h" - -namespace HEPREP { - -class HepRepAction; -class HepRepInstanceTree; -class HepRepSelectFilter; -class HepRepTypeTree; - -/** - * The HepRep interface. - * - * Any of these methods may throw a UnsupportedOperationException in Java. - * - * This interface is NOT final yet. - * - * @author Mark Donszelmann - */ -class HepRep { - -public: - /// Destructor. - virtual ~HepRep() { /* nop */; } - - /** - * Add a layer to the list of layers in this heprep. - * The layer is added to the back of the list. - * - * @param layer name of layer to be added to the back of the list. - */ - virtual void addLayer(std::string layer) = 0; - - /** - * Returns the list of layers. - * - * @return the known layer names, in the order back-to-front. - */ - virtual std::vector getLayerOrder() = 0; - - /** - * Add a typetree to this heprep. - * - * @param typeTree to be added. - */ - virtual void addTypeTree(HepRepTypeTree * typeTree) = 0; - - /** - * Remove a typetree from this heprep. - * - * @param typeTree to be removed. - */ - virtual void removeTypeTree(HepRepTypeTree * typeTree) = 0; - - /** - * Returns the collection of all typetrees of this heprep. - * - * @return collection of HepRepTypeTrees. - */ - virtual std::vector getTypeTreeList() = 0; - - /** - * Returns a named and versioned typetree. - * - * @param name name of the typetree. - * @param version version of the typetree. - * @return named and versioned HepRepTypeTree. - */ - virtual HepRepTypeTree * getTypeTree(std::string name, std::string version) = 0; - - /** - * Searches for a named type in any of the typetrees. - * The first occurrence found is returned. - * - * @param name name of type. - * @return named HepRepType. - */ -// HepRepType* getType(String name); - /** - * Adds an instancetree to this heprep. - * - * @param instanceTree to be added. - */ - virtual void addInstanceTree(HepRepInstanceTree * instanceTree) = 0; - - /** - * Overlays an instancetree to this heprep, overriding attributes and adding children. - * - * @param instanceTree to be overlaid. - */ - virtual void overlayInstanceTree(HepRepInstanceTree * instanceTree) = 0; - - /** - * Remove an instanectree from this heprep. - * - * @param instanceTree to be removed. - */ - virtual void removeInstanceTree(HepRepInstanceTree * instanceTree) = 0; - - /** - * Returns a collection of instancetrees. - * - * @return collection of HepRepInstanceTrees. - */ - virtual std::vector getInstanceTreeList() = 0; - - /** - * Returns a named and versioned instancetree. - * FIXME: doc is incorrect here, should only return TOP of the tree. Filling - * in should be done by getInstances calls. - *

      - * This tree needs to be added to the heprep afterwards. - * - * @param name name of the instancetree. - * @param version version of the instancetree. - * @return HepRepIntanceTree - */ - virtual HepRepInstanceTree * getInstanceTreeTop(std::string name, std::string version) = 0; - - /** - * Returns a named and versioned instancetree for a list of typenames. - *

      - * This tree needs to be added to the heprep afterwards. - * - * @param name name of the instancetree. - * @param version version of the instancetree. - * @param typeNames a list of typenames for which we need instancetrees. - * @return HepRepIntanceTree - */ - virtual HepRepInstanceTree * getInstances(std::string name, std::string version, std::vector typeNames) = 0; - - /** - * Returns a named and versioned instancetree for a list of typenames - * after executing some action and for specific filters. - * - * This tree needs to be added to the heprep afterwards. - *

      - * The inversion effect of invertAtts depends on the values of - * GetDrawAtts and GetNonDrawAtts as follows: - *

        - *
      • GetDrawAtts GetNonDrawAtts effect of InvertAtts - *
      • FALSE FALSE all Attributes specified will be downloaded - *
      • TRUE FALSE Draw Attributes specified will be omitted, NonDraw Attributes specified will be included - *
      • FALSE TRUE Draw Attributes specified will be included, NonDraw Attributes specified will be omitted - *
      • TRUE TRUE all Attributes specified will be omitted - *
      - * - * @param name name of the instancetree. - * @param version version of the instancetree. - * @param typeNames a list of typenames for which we need instancetrees. - * @param actions execute this list of actions before returning. - * @param getPoints include the HepRepPoints in the instance tree. - * @param getDrawAtts include the Draw attributes in the instance tree. - * @param getNonDrawAtts include the Non-Draw attributes in the instance tree. - * @param invertAtts list of attributes to be included or not depending on getDrawAtts and getNonDrawAtts. - * @return HepRepIntanceTree - */ - virtual HepRepInstanceTree * getInstancesAfterAction(std::string name, std::string version, std::vector typeNames, std::vector actions, bool getPoints, bool getDrawAtts, bool getNonDrawAtts, std::vector invertAtts) = 0; - - /** - * Returns last exception thrown and clears it. Useful for implementations without - * exception handling. - * - * @return last exception and clears it. - */ - virtual std::string checkForException() = 0; - - /** - * Returns a deep copy of the heprep, with all its attached trees, where - * instances are filtered using a HepRepSelectFilter. - * - * @param filter to be used for filtering instances. - * @return copy of heprep. - */ - virtual HepRep * copy(HepRepSelectFilter * filter = NULL) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREP_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepAction.h b/source/visualization/HepRep/include/HEPREP/HepRepAction.h deleted file mode 100644 index 8aeac39619..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepAction.h +++ /dev/null @@ -1,49 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPACTION_H -#define HEPREP_HEPREPACTION_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include - -namespace HEPREP { - -/** - * HepRepAction interface. - * - * @author Mark Donszelmann - */ -class HepRepAction { - -public: - /// Destructor. - virtual ~HepRepAction() { /* nop */; } - - /** - * Returns name of this action. - * - * @return name of this action. - */ - virtual std::string getName() = 0; - - /** - * Returns expression associated with this action. - * - * @return expression of this action. - */ - virtual std::string getExpression() = 0; - - /** - * Returns a deep copy of this action. - * - * @return copy of this action. - */ - virtual HepRepAction * copy() = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPACTION_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepAttDef.h b/source/visualization/HepRep/include/HEPREP/HepRepAttDef.h deleted file mode 100644 index 84ca9af477..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepAttDef.h +++ /dev/null @@ -1,70 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPATTDEF_H -#define HEPREP_HEPREPATTDEF_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include - -namespace HEPREP { - -/** - * HepRepAttDef interface. - * - * @author Mark Donszelmann - */ -class HepRepAttDef { - -public: - /// Destructor. - virtual ~HepRepAttDef() { /* nop */; } - - /** - * Returns the mixed case name of this attdef. - * - * @return name. - */ - virtual std::string getName() = 0; - - /** - * Returns the lowercased name of this attdef. - * - * @return lowercased name. - */ - virtual std::string getLowerCaseName() = 0; - - /** - * Returns a description of this attdef. - * - * @return description. - */ - virtual std::string getDescription() = 0; - - /** - * Returns category of this attdef. - * - * @return category. - */ - virtual std::string getCategory() = 0; - - /** - * Returns any extra information of this attdef. - * - * @return extra info. - */ - virtual std::string getExtra() = 0; - - /** - * Returns a deep copy of this attdef. - * - * @return copy of this attdef. - */ - virtual HepRepAttDef * copy() = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPATTDEF_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepAttValue.h b/source/visualization/HepRep/include/HEPREP/HepRepAttValue.h deleted file mode 100644 index 34f65cbb10..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepAttValue.h +++ /dev/null @@ -1,129 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPATTVALUE_H -#define HEPREP_HEPREPATTVALUE_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include -#include - -#include "HEPREP/Types.h" - -namespace HEPREP { - -/** - * HepRepAttValue interface. - * - * @author Mark Donszelmann - */ -class HepRepAttValue { - -public: - /// Destructor. - virtual ~HepRepAttValue() { /* nop */; } - - /** - * Returns name of the attvalue. - * - * @return Capitalized Name. - */ - virtual std::string getName() = 0; - - /** - * Returns lowercased name of the attvalue. - * - * @return Lowercased Name. - */ - virtual std::string getLowerCaseName() = 0; - - /** - * Returns type of the attvalue, defined in HepRepConstants with names TYPE_xxx. - * - * @return type. - */ - virtual int getType() = 0; - - /** - * Returns the Java-like name for the type of this attvalue. - * - * @return type name. - */ - virtual std::string getTypeName() = 0; - - /** - * Returns the flag bits for showing this attvalue as a label, defined in HepRepConstants with names SHOW_xxx. - * - * @return flag bits if should be shown as label. - */ - virtual int showLabel() = 0; - - /** - * Returns value as string. - * - * @return value as string (if type is string). - */ - virtual std::string getString() = 0; - - /** - * Returns value as lowercase string. - * - * @return value as string (if type is string). - */ - virtual std::string getLowerCaseString() = 0; - - /** - * Returns value as string. - * - * @return value (of any type) in string format. - */ - virtual std::string getAsString() = 0; - - /** - * Returns value as Color. - * - * @return value as Color. - */ - virtual std::vector getColor() = 0; - - /** - * Returns value as long. - * - * @return value as long. - */ - virtual int64 getLong() = 0; - - /** - * Returns value as int. - * - * @return value as integer. - */ - virtual int getInteger() = 0; - - /** - * Returns value as double. - * - * @return value as double. - */ - virtual double getDouble() = 0; - - /** - * Returns value as boolean. - * - * @return value as boolean. - */ - virtual bool getBoolean() = 0; - - /** - * Returns a deep copy of this attvalue. - * - * @return copy of this attvalue. - */ - virtual HepRepAttValue * copy() = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPATTVALUE_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepAttribute.h b/source/visualization/HepRep/include/HEPREP/HepRepAttribute.h deleted file mode 100644 index 935499b93c..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepAttribute.h +++ /dev/null @@ -1,153 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPATTRIBUTE_H -#define HEPREP_HEPREPATTRIBUTE_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include -#include -#include - -#include "HEPREP/Types.h" - -#include "HEPREP/HepRepConstants.h" - -namespace HEPREP { - -class HepRepAttValue; - -/** - * HepRepAttribute interface. - * - * @author Mark Donszelmann - */ -class HepRepAttribute { - -public: - /// Destructor. - virtual ~HepRepAttribute() { /* nop */; } - - /** - * Adds an attValue. - * - * @param attValue to be added. - */ - virtual void addAttValue(HepRepAttValue * attValue) = 0; - - - /** - * Adds a char* attValue as a String. - * This call should be mapped to addAttValue(std::string, std::string, int); and necessary - * because C++ converts char* into bool and would thus call addAttValue(std::string, bool, int) - * for a call such as addAttValue("drawAs", "Cylinder", 0); - * - * @param key name of attValue - * @param value value of attValue - * @param showLabel show this as label - */ - virtual void addAttValue(std::string key, char* value, int showLabel = HepRepConstants::SHOW_NONE) = 0; - /** - * Adds an attValue. - * - * @param key name of attValue - * @param value value of attValue - * @param showLabel show this as label - */ - virtual void addAttValue(std::string key, std::string value, int showLabel = HepRepConstants::SHOW_NONE) = 0; - - /** - * Adds an attValue. - * - * @param key name of attValue - * @param value value of attValue - * @param showLabel show this as label - */ - virtual void addAttValue(std::string key, int64 value, int showLabel = HepRepConstants::SHOW_NONE) = 0; - - /** - * Adds an attValue. - * - * @param key name of attValue - * @param value value of attValue - * @param showLabel show this as label - */ - virtual void addAttValue(std::string key, int value, int showLabel = HepRepConstants::SHOW_NONE) = 0; - - /** - * Adds an attValue. - * - * @param key name of attValue - * @param value value of attValue - * @param showLabel show this as label - */ - virtual void addAttValue(std::string key, double value, int showLabel = HepRepConstants::SHOW_NONE) = 0; - - /** - * Adds an attValue. - * - * @param key name of attValue - * @param value value of attValue - * @param showLabel show this as label - */ - virtual void addAttValue(std::string key, bool value, int showLabel = HepRepConstants::SHOW_NONE) = 0; - - /** - * Adds a Color attValue. - * - * @param key name of attValue - * @param value value of attValue - * @param showLabel show this as label - */ - virtual void addAttValue(std::string key, std::vector value, int showLabel = HepRepConstants::SHOW_NONE) = 0; - - /** - * Adds a Color attValue. - * - * @param key name of attValue - * @param red color - * @param green color - * @param blue color - * @param alpha value - * @param showLabel show this as label - */ - virtual void addAttValue(std::string key, double red, double green, double blue, double alpha = 1.0, int showLabel = HepRepConstants::SHOW_NONE) = 0; - - /** - * Remove the attvalue named by key. - * - * @param key name of the attValue to be removed. - * @return removed HepRepAttValue, or null if not removed. - */ - virtual HepRepAttValue * removeAttValue(std::string key) = 0; - - /** - * Returns the attValue specified by name. This attValue is normally searched - * on the node itself and then on its type, moving up the typetree. - * - * @param name of attribute value. - * @return attribute value. - */ - virtual HepRepAttValue * getAttValue(std::string name) = 0; - - /** - * Returns a collection of all attribute values from this node. - * - * @return collection of HepRepAttValues. - */ - virtual std::set getAttValuesFromNode() = 0; - - /** - * Returns a named attribute value from this node. - * - * @param lowerCaseName name in all lowercase. - * @return corresponding HepRepAttValue. - */ - virtual HepRepAttValue * getAttValueFromNode(std::string lowerCaseName) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPATTRIBUTE_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepAttributeListener.h b/source/visualization/HepRep/include/HEPREP/HepRepAttributeListener.h deleted file mode 100644 index 0c95cc1e94..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepAttributeListener.h +++ /dev/null @@ -1,103 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPATTRIBUTELISTENER_H -#define HEPREP_HEPREPATTRIBUTELISTENER_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include -#include - -namespace HEPREP { - -class HepRepInstance; - -/** - * HepRepAttributeListener interface. The implementor is called back for changes - * of attributes while using the HepRepIterator to iterate over all the HepRepInstances. - * - * All names are lowercased. - * - * @author Mark Donszelmann - */ -class HepRepAttributeListener { - -public: - /// Destructor. - virtual ~HepRepAttributeListener() { /* nop */; } - - /** - * Called if attribute key changes its value. - * - * @param instance instance for which this attribute is set. - * @param key name of the changed attribute. - * @param value value of the changed attribute. - * @param lowerCaseValue lower case value of the changed attribute. - * @param showLabel value of showLabel. - */ - virtual void setAttribute(HepRepInstance * instance, std::string key, std::string value, std::string lowerCaseValue, int showLabel) = 0; - - /** - * Called if attribute key changes its value. - * - * @param instance instance for which this attribute is set. - * @param key name of the changed attribute. - * @param value value of the changed attribute. - * @param showLabel value of showLabel. - */ - virtual void setAttribute(HepRepInstance * instance, std::string key, std::vector value, int showLabel) = 0; - - /** - * Called if attribute key changes its value. - * - * @param instance instance for which this attribute is set. - * @param key name of the changed attribute. - * @param value value of the changed attribute. - * @param showLabel value of showLabel. - */ - virtual void setAttribute(HepRepInstance * instance, std::string key, long value, int showLabel) = 0; - - /** - * Called if attribute key changes its value. - * - * @param instance instance for which this attribute is set. - * @param key name of the changed attribute. - * @param value value of the changed attribute. - * @param showLabel value of showLabel. - */ - virtual void setAttribute(HepRepInstance * instance, std::string key, int value, int showLabel) = 0; - - /** - * Called if attribute key changes its value. - * - * @param instance instance for which this attribute is set. - * @param key name of the changed attribute. - * @param value value of the changed attribute. - * @param showLabel value of showLabel. - */ - virtual void setAttribute(HepRepInstance * instance, std::string key, double value, int showLabel) = 0; - - /** - * Called if attribute key changes its value. - * - * @param instance instance for which this attribute is set. - * @param key name of the changed attribute. - * @param value value of the changed attribute. - * @param showLabel value of showLabel. - */ - virtual void setAttribute(HepRepInstance * instance, std::string key, bool value, int showLabel) = 0; - - /** - * Called if attribute key is removed from the attribute set. - * - * @param instance instance for which this attribute is set. - * @param key name of the removed attribute. - */ - virtual void removeAttribute(HepRepInstance * instance, std::string key) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPATTRIBUTELISTENER_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepConstants.h b/source/visualization/HepRep/include/HEPREP/HepRepConstants.h deleted file mode 100644 index db6da0dc22..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepConstants.h +++ /dev/null @@ -1,36 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPCONSTANTS_H -#define HEPREP_HEPREPCONSTANTS_H 1 - -// Copyright 2000-2005, FreeHEP. - -namespace HEPREP { - -/** - * Constants for HepRep interfaces. - * - * @author Mark Donszelmann - */ -class HepRepConstants { - -public: - /// Destructor. - virtual ~HepRepConstants() { /* nop */; } - - /** - * Defines constants for type - */ - enum { TYPE_UNKNOWN = -1, TYPE_STRING = 1, TYPE_COLOR = 2, TYPE_LONG = 10, TYPE_INT = 11, TYPE_DOUBLE = 20, TYPE_BOOLEAN = 30 }; - - /** - * Defines constants for showLabel - */ - enum { SHOW_NONE = 0x0000, SHOW_NAME = 0x0001, SHOW_DESC = 0x0002, SHOW_VALUE = 0x0004, SHOW_EXTRA = 0x0008 }; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPCONSTANTS_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepDefinition.h b/source/visualization/HepRep/include/HEPREP/HepRepDefinition.h deleted file mode 100644 index fd76591f2c..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepDefinition.h +++ /dev/null @@ -1,74 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPDEFINITION_H -#define HEPREP_HEPREPDEFINITION_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include -#include - -#include "HEPREP/HepRepAttribute.h" - -namespace HEPREP { - -class HepRepAttDef; - -/** - * HepRepDefinition interface. - * - * @author Mark Donszelmann - * - */ -class HepRepDefinition : virtual public HepRepAttribute { - -public: - /// Destructor. - virtual ~HepRepDefinition() { /* nop */; } - - /** - * Adds an attdef. - * - * @param name name of the definition. - * @param desc description of the definition. - * @param category category of the definition. - * @param extra extra info of the definition. - */ - virtual void addAttDef(std::string name, std::string desc, std::string category, std::string extra) = 0; - - /** - * Adds an attdef. - * - * @param attDef to be added. - */ - virtual void addAttDef(HepRepAttDef * attDef) = 0; - - /** - * Return a named attribute definition searched on this node and any parent nodes. - * - * @param name of attribute definition. - * @return attribute definition. - */ - virtual HepRepAttDef * getAttDef(std::string name) = 0; - - /** - * Returns a collection of all attribute definitions defined on this node. - * - * @return collection of attributes definitions. - */ - virtual std::set getAttDefsFromNode() = 0; - - /** - * Returns a named attribute definition defined on this node. - * - * @param lowerCaseName name of the attribute in lower case. - * @return attribute definition. - */ - virtual HepRepAttDef * getAttDefFromNode(std::string lowerCaseName) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPDEFINITION_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepFactory.h b/source/visualization/HepRep/include/HEPREP/HepRepFactory.h deleted file mode 100644 index d8a1141ac3..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepFactory.h +++ /dev/null @@ -1,148 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPFACTORY_H -#define HEPREP_HEPREPFACTORY_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include -#include - -namespace HEPREP { - -class HepRep; -class HepRepAction; -class HepRepInstance; -class HepRepInstanceTree; -class HepRepPoint; -class HepRepReader; -class HepRepTreeID; -class HepRepType; -class HepRepTypeTree; -class HepRepWriter; - -/** - * HepRepFactory interface. - * - * @author Mark Donszelmann - */ -class HepRepFactory { - -public: - /// Destructor. - virtual ~HepRepFactory() { /* nop */; } - - /** - * Creates a HepRepReader from a stream. - * - * @param in input stream. - */ - virtual HepRepReader * createHepRepReader(std::istream * in) = 0; - - /** - * Creates a HepRepReader from a file name. - * - * @param inputFileName file name. - */ - virtual HepRepReader * createHepRepReader(std::string inputFileName) = 0; - - /** - * Creates a HepRepWriter. - * - * @param out output stream. - * @param randomAccess create a writer in a format that will allow random access (may be ignored). - * @param compress create a writer that uses compression (may be ignored). - */ - virtual HepRepWriter * createHepRepWriter(std::ostream * out, bool randomAccess, bool compress) = 0; - - /** - * Creates a HepRepPoint. - * - * @param instance to add the point to. - * @param x x coordinate of point. - * @param y y coordinate of point. - * @param z z coordinate of point. - */ - virtual HepRepPoint * createHepRepPoint(HepRepInstance * instance, double x, double y, double z) = 0; - - /** - * Creates a HepRepInstance. - * - * @parent to add the instance to. - * @type type the associated type. - */ - virtual HepRepInstance * createHepRepInstance(HepRepInstance * parent, HepRepType * type) = 0; - - /** - * Creates a HepRepInstance. - * - * @parent to add the instance to. - * @type type the associated type. - */ - virtual HepRepInstance * createHepRepInstance(HepRepInstanceTree * parent, HepRepType * type) = 0; - - /** - * Creates a HepRepTreeID. - * - * @param name of the treeID. - * @param version of the treeID. - * @param qualifier of the treeID. - */ - virtual HepRepTreeID * createHepRepTreeID(std::string name, std::string version, std::string qualifier = "top-level") = 0; - - /** - * Creates a HepRepAction. - * - * @param name of the action. - * @param expression of the action. - */ - virtual HepRepAction * createHepRepAction(std::string name, std::string expression) = 0; - - /** - * Creates a HepRepInstanceTree. - *

      - * The tree needs to be added to the HepRep. - * - * @param name of the instancetree. - * @param version of the instancetree. - * @param typeTree associated typetree. - */ - virtual HepRepInstanceTree * createHepRepInstanceTree(std::string name, std::string version, HepRepTreeID * typeTree) = 0; - - /** - * Creates a HepRepType. - * - * @param parent to add this type to. - * @param name of the type to create. - */ - virtual HepRepType * createHepRepType(HepRepTypeTree * parent, std::string name) = 0; - - /** - * Creates a HepRepType. - * - * @param parent to add this type to. - * @param name of the type to create. - */ - virtual HepRepType * createHepRepType(HepRepType * parent, std::string name) = 0; - - /** - * Creates a HepRepTypeTree. - *

      - * The tree needs to be added to the HepRep. - * - * @param treeID to name the tree being created. - */ - virtual HepRepTypeTree * createHepRepTypeTree(HepRepTreeID * treeID) = 0; - - /** - * Creates a HepRep. - * - */ - virtual HepRep * createHepRep() = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPFACTORY_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepFrameListener.h b/source/visualization/HepRep/include/HEPREP/HepRepFrameListener.h deleted file mode 100644 index 8e0a62bf04..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepFrameListener.h +++ /dev/null @@ -1,34 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPFRAMELISTENER_H -#define HEPREP_HEPREPFRAMELISTENER_H 1 - -// Copyright 2004-2005, FreeHEP. - -namespace HEPREP { - -/** - * HepRepFrameListener interface. The implementor is called back for changes in - * drawing in or out of the frame layer. - * - * @author Mark Donszelmann - */ -class HepRepFrameListener { - -public: - /// Destructor. - virtual ~HepRepFrameListener() { /* nop */; } - - /** - * Called if we switch from a normal layer to a frame layer, and back. - * - * @param inFrame true if in a frame layer - */ - virtual void setFrameLayer(bool inFrame) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPFRAMELISTENER_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepInstance.h b/source/visualization/HepRep/include/HEPREP/HepRepInstance.h deleted file mode 100644 index 2085a88246..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepInstance.h +++ /dev/null @@ -1,138 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPINSTANCE_H -#define HEPREP_HEPREPINSTANCE_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include - -#include "HEPREP/HepRepAttribute.h" - -namespace HEPREP { - -class HepRepInstanceTree; -class HepRepPoint; -class HepRepSelectFilter; -class HepRepType; -class HepRepTypeTree; - -/** - * HepRepInstance interface. - * - * @author Mark Donszelmann - */ -class HepRepInstance : virtual public HepRepAttribute { - -public: - /// Destructor. - virtual ~HepRepInstance() { /* nop */; } - - /** - * Overlays the instance on the current instance. - * - * Attributes of the instance override or are added to the current instance. - * Sub-instances of the instance are added only if the current instance has no sub-instances. - * Points of the instance are added only if the current instance has no points. - */ - virtual void overlay(HepRepInstance * instance) = 0; - - /** - * Adds an sub-instance to this instance. - * - * @param instance sub-instance. - */ - virtual void addInstance(HepRepInstance * instance) = 0; - - /** - * Removes a sub-instance from this instance. - * - * @param instance sub-instance. - */ - virtual void removeInstance(HepRepInstance * instance) = 0; - - /** - * Returns a collection of all sub-instances this instance keeps. - * - * @return collection of HepRepInstances. - */ - virtual std::vector getInstances() = 0; - - /** - * Returns the associated type for this instance. - * - * @return associated HepRepType. - */ - virtual HepRepType * getType() = 0; - - /** - * Adds a point to this instance. - * - * @param point to be added. - */ - virtual void addPoint(HepRepPoint * point) = 0; - - /** - * Returns a collection of all points this instance keeps. - * - * @return collection of HepRepPoints. - */ - virtual std::vector getPoints() = 0; - - /** - * Fills a double[3][n] array with the coordinates of all points, if - * none of the points have any attributes defined on them. - * The actual number of points filled is returned. In case the number - * of points is larger than n, or if any points have attributes, -1 is returned. - * One could then call getPoint(). - * - * @see #getPoints() - * - * @param xyz a double[3][n] array to be filled with points. - * @return number of points filled in xyz, or -1 in case of error or non-implementation. - * - * ONLY in JAVA - */ - /** - * Returns true if this instance has a frame. Speedy access for iterator. - * - * ONLY in JAVA - */ - /** - * Returns String layername. Speedy access for iterator. - * - * ONLY in JAVA - */ - /** - * Returns the parent of this instance. - * - * @return parent of instance, or null if top-level. - */ - virtual HepRepInstance * getSuperInstance() = 0; - - /** - * Returns a deep copy of this instance. - * - * @param typeTree needed to find the associated type. - * @param parent to which the copy is added. - * @param filter run on all instances before copying. - * @return copy of this instance. - */ - virtual HepRepInstance * copy(HepRepTypeTree * typeTree, HepRepInstance * parent, HepRepSelectFilter * filter = NULL) = 0; - - /** - * Returns a deep copy of this instance. - * - * @param typeTree needed to find the associated type. - * @param parent to which the copy is added. - * @param filter run on all instances before copying. - * @return copy of this instance. - */ - virtual HepRepInstance * copy(HepRepTypeTree * typeTree, HepRepInstanceTree * parent, HepRepSelectFilter * filter = NULL) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPINSTANCE_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepInstanceTree.h b/source/visualization/HepRep/include/HEPREP/HepRepInstanceTree.h deleted file mode 100644 index a5e4350029..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepInstanceTree.h +++ /dev/null @@ -1,92 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPINSTANCETREE_H -#define HEPREP_HEPREPINSTANCETREE_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include - -#include "HEPREP/HepRepTreeID.h" - -namespace HEPREP { - -class HepRepInstance; -class HepRepSelectFilter; -class HepRepTreeID; -class HepRepTypeTree; - -/** - * HepRepInstanceTree interface. - * - * @author Mark Donszelmann - */ -class HepRepInstanceTree : virtual public HepRepTreeID { - -public: - /// Destructor. - virtual ~HepRepInstanceTree() { /* nop */; } - - /** - * Overlays the instance tree on the current tree. - * - * The list of instances of the instanceTree has to be the same as the current tree. - */ - virtual void overlay(HepRepInstanceTree * instanceTree) = 0; - - /** - * Adds an instance to this instancetree. - * - * @param instance to be added. - */ - virtual void addInstance(HepRepInstance * instance) = 0; - - /** - * Removes an instance from this instancetree. - * - * @param instance to be removed. - */ - virtual void removeInstance(HepRepInstance * instance) = 0; - - /** - * Returns a collection of instances. - * - * @return collection of HepRepInstances. - */ - virtual std::vector getInstances() = 0; - - /** - * Adds a related instance tree to this instancetree. - * - * @param instanceTree related instancetree. - */ - virtual void addInstanceTree(HepRepTreeID * instanceTree) = 0; - - /** - * Returns a collection of associated instance trees. - * - * @return collection of HepRepTreeIDs. - */ - virtual std::vector getInstanceTreeList() = 0; - - /** - * Returns the associated typetree. - * - * @return TreeID of the associated typetree. - */ - virtual HepRepTreeID * getTypeTree() = 0; - - /** - * Returns a deep copy of this instancetree. - * - * @param filter to filter the instances. - * @return copy of this instancetree. - */ - virtual HepRepInstanceTree * copy(HepRepTypeTree * typeTree, HepRepSelectFilter * filter = NULL) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPINSTANCETREE_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepIterator.h b/source/visualization/HepRep/include/HEPREP/HepRepIterator.h deleted file mode 100644 index 87130aee50..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepIterator.h +++ /dev/null @@ -1,87 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPITERATOR_H -#define HEPREP_HEPREPITERATOR_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include - -namespace HEPREP { - -class HepRepAttributeListener; -class HepRepFrameListener; -class HepRepInstance; - -/** - * HepRepIterator interface. - * - * @author Mark Donszelmann - */ -class HepRepIterator { - -public: - /// Destructor. - virtual ~HepRepIterator() { /* nop */; } - - /** - * Signals if there is a next instance to iterate to. - * - * @return true if next() can be called. - */ - virtual bool hasNext() = 0; - - /** - * Returns next instance. - * - * @return next HepRepInstance. - */ - virtual HepRepInstance * nextInstance() = 0; - - /** - * Adds a listener to be informed about attribute changes while iterating. - * - * @param listener to be added. - */ - virtual void addHepRepAttributeListener(std::string name, HepRepAttributeListener * listener) = 0; - - /** - * Removes a listener. - * - * @param listener to be removed. - */ - virtual void removeHepRepAttributeListener(std::string name, HepRepAttributeListener * listener) = 0; - - /** - * Adds a listener to be informed about attribute changes while iterating. - * - * @param listener to be added. - */ - virtual void addHepRepFrameListener(HepRepFrameListener * listener) = 0; - - /** - * Removes a listener. - * - * @param listener to be removed. - */ - virtual void removeHepRepFrameListener(HepRepFrameListener * listener) = 0; - - /** - * Returns true if the current instance, just delivered by nextInstance(), is to be drawn as a frame. - */ - virtual bool drawAsFrame() = 0; - - /** - * Returns the attValue for key at the current point of iteration. - * - * @param key name of the attribute to be looked up. - * @return value associated to name at this point in the iteration. - */ -// HepRepAttValue* getAttValue(String key); -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPITERATOR_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepPoint.h b/source/visualization/HepRep/include/HEPREP/HepRepPoint.h deleted file mode 100644 index 84e06d046f..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepPoint.h +++ /dev/null @@ -1,168 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPPOINT_H -#define HEPREP_HEPREPPOINT_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include - -#include "HEPREP/HepRepAttribute.h" - -namespace HEPREP { - -class HepRepInstance; - -/** - * HepRepPoint interface. The HepRepMath class can be used to deal with the conversions. - * - * @author Mark Donszelmann - */ -class HepRepPoint : virtual public HepRepAttribute { - -public: - /// Destructor. - virtual ~HepRepPoint() { /* nop */; } - - /** - * Returns coordinate with respect to vertex at (0, 0, 0). - * - * @return dx-coordinate - */ - virtual double getX() = 0; - - /** - * Returns coordinate with respect to vertex at (0, 0, 0). - * - * @return dy-coordinate - */ - virtual double getY() = 0; - - /** - * Returns coordinate with respect to vertex at (0, 0, 0). - * - * @return dz-coordinate - */ - virtual double getZ() = 0; - - /** - * Returns coordinate with respect to vertex at (0, 0, 0). - * - * @return rho = std::sqrt(dx2+dy2); - */ - virtual double getRho() = 0; - - /** - * Returns coordinate with respect to vertex at (0, 0, 0). - * - * @return phi = std::atan2(dy, dx); - */ - virtual double getPhi() = 0; - - /** - * Returns coordinate with respect to vertex at (0, 0, 0). - * - * @return theta = std::atan2(rho, dx); - */ - virtual double getTheta() = 0; - - /** - * Returns coordinate with respect to vertex at (0, 0, 0). - * - * @return r = std::sqrt(dx2+dy2+dz2); - */ - virtual double getR() = 0; - - /** - * Returns coordinate with respect to vertex at (0, 0, 0). - * - * @return eta = -0.5*clog((1.-ct)/(1.+ct)), where ct = .cos(getTheta(dx, dy, dz)); - */ - virtual double getEta() = 0; - - /** - * Returns coordinate with respect to vertex at (xVertex, yVertex, zVertex). - * - * @return dx-coordinate - */ - virtual double getX(double xVertex, double yVertex, double zVertex) = 0; - - /** - * Returns coordinate with respect to vertex at (xVertex, yVertex, zVertex). - * - * @return dy-coordinate - */ - virtual double getY(double xVertex, double yVertex, double zVertex) = 0; - - /** - * Returns coordinate with respect to vertex at (xVertex, yVertex, zVertex). - * - * @return dz-coordinate - */ - virtual double getZ(double xVertex, double yVertex, double zVertex) = 0; - - /** - * Returns coordinate with respect to vertex at (xVertex, yVertex, zVertex). - * - * @return rho = std::sqrt(dx2+dy2); - */ - virtual double getRho(double xVertex, double yVertex, double zVertex) = 0; - - /** - * Returns coordinate with respect to vertex at (xVertex, yVertex, zVertex). - * - * @return phi = std::atan2(dy, dx); - */ - virtual double getPhi(double xVertex, double yVertex, double zVertex) = 0; - - /** - * Returns coordinate with respect to vertex at (xVertex, yVertex, zVertex). - * - * @return theta = std::atan2(rho, dx); - */ - virtual double getTheta(double xVertex, double yVertex, double zVertex) = 0; - - /** - * Returns coordinate with respect to vertex at (xVertex, yVertex, zVertex). - * - * @return r = std::sqrt(dx2+dy2+dz2); - */ - virtual double getR(double xVertex, double yVertex, double zVertex) = 0; - - /** - * Returns coordinate with respect to vertex at (xVertex, yVertex, zVertex). - * - * @return eta = -0.5*clog((1.-ct)/(1.+ct)), where ct = .cos(getTheta(dx, dy, dz)); - */ - virtual double getEta(double xVertex, double yVertex, double zVertex) = 0; - - /** - * Returns coordinate with respect to vertex at (0, 0, 0). - * - * @param xyz list of three coordinates which are filled and returned. - * If null, a new list of three coordinates is allocated. - * @return list of 3 coordinates. - */ - virtual std::vector * getXYZ(std::vector * xyz) = 0; - - /** - * Returns associated instance (parent). - * - * @return HepRepInstance. - */ - virtual HepRepInstance * getInstance() = 0; - - /** - * Returns a deep copy of this point. - * - * @param parent to add the copy to. - * @return copy of this point. - */ - virtual HepRepPoint * copy(HepRepInstance * parent) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPPOINT_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepReader.h b/source/visualization/HepRep/include/HEPREP/HepRepReader.h deleted file mode 100644 index 67f872c472..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepReader.h +++ /dev/null @@ -1,124 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPREADER_H -#define HEPREP_HEPREPREADER_H 1 - -// Copyright 2002-2004, Freehep. - -#include -#include - -namespace HEPREP { - -class HepRep; - -/** - * HepRepReader interface. - * - * @author Mark Donszelmann - */ -class HepRepReader { - -public: - /// Destructor. - virtual ~HepRepReader() { /* nop */; } - - /** - * Returns a property (if set in the heprep.properties file). - * - * @param key property name - * @param defaultValue value if property not found - */ - virtual std::string getProperty(std::string key, std::string defaultValue) = 0; - - /** - * Closes the reader and its underlying stream. - * - * @return false in case of a stream problem. - */ - virtual bool close() = 0; - - /** - * Allows random access. - * - * @return true if this reader provides random access - */ - virtual bool hasRandomAccess() = 0; - - /** - * Reads a HepRep by name (random access only). - * - * @param name for the heprep to be read. - * @return heprep. - */ - virtual HepRep * read(std::string name) = 0; - - /** - * Returns the current entry name (random acces only). - * - * @return name of the current entry or null if not supported. - */ - virtual std::string entryName() = 0; - - /** - * Returns a list of names of available entries (random rccess only). - * Zip files may contain instructions to skip a number of files. These files - * will not be included in the entries. - * - * @return list of entrynames or null if not supported. - */ - virtual std::vector entryNames() = 0; - - /** - * Allows for sequential access. - * - * @return true if sequential access is possible. - */ - virtual bool hasSequentialAccess() = 0; - - /** - * Resets a sequential HepRep reader. - * - * @return false in case of a stream problem. - */ - virtual bool reset() = 0; - - /** - * Returns the (estimated) number of HepReps in the reader. - * Zip files may contain instructions to skip a number of files. These files - * will not be included in the estimate. - * - * @return number of HepReps, or -1 if cannot be calculated. - */ - virtual int size() = 0; - - /** - * Skips a number of HepReps in the reader. - * Zip files may contain instructions to skip a number of files. These files - * will not be included in the count to be skipped. - * - * @param n number of HepReps to be skipped. - * @return number of HepReps skipped. - */ - virtual int skip(int n) = 0; - - /** - * Is there a next heprep. - * - * @return true if the next heprep is available. - */ - virtual bool hasNext() = 0; - - /** - * Reads the next HepRep from the Reader. - * - * @return heprep. - */ - virtual HepRep * next() = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPREADER_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepSelectFilter.h b/source/visualization/HepRep/include/HEPREP/HepRepSelectFilter.h deleted file mode 100644 index 2e7bed0caf..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepSelectFilter.h +++ /dev/null @@ -1,36 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPSELECTFILTER_H -#define HEPREP_HEPREPSELECTFILTER_H 1 - -// Copyright 2000-2005, FreeHEP. - -namespace HEPREP { - -class HepRepInstance; - -/** - * HepRepSelectFilter interface used in copying HepReps. - * - * @author Mark Donszelmann - */ -class HepRepSelectFilter { - -public: - /// Destructor. - virtual ~HepRepSelectFilter() { /* nop */; } - - /** - * Selects if the given instance will pass. - * - * @param instance to be checked. - * @return true if instance passes. - */ - virtual bool select(HepRepInstance * instance) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPSELECTFILTER_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepTreeID.h b/source/visualization/HepRep/include/HEPREP/HepRepTreeID.h deleted file mode 100644 index ed34c27f40..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepTreeID.h +++ /dev/null @@ -1,64 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPTREEID_H -#define HEPREP_HEPREPTREEID_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include - -namespace HEPREP { - -/** - * HepRepTreeID interface. - * - * @author Mark Donszelmann - */ -class HepRepTreeID { - -public: - /// Destructor. - virtual ~HepRepTreeID() { /* nop */; } - - /** - * Returns the name of this treeID. - * - * @return name of treeID. - */ - virtual std::string getName() = 0; - - /** - * Returns the version of this treeID. - * - * @return version of treeID. - */ - virtual std::string getVersion() = 0; - - /** - * Returns the qualifier that qualifies the relation that this treeID has with what it refers to. - * - * @return qualifier. - */ - virtual std::string getQualifier() = 0; - - /** - * Sets the qualifier that qualifies the relation that this treeID has with what it refers to. - * - * @param qualifier to be set. - */ - virtual void setQualifier(std::string qualifier) = 0; - - /** - * Returns a deep copy of this treeID. - * - * @return copy of this treeID. - * @throws CloneNotSupportedException if copying is not possible. - */ -// HepRepTreeID* copy() throws CloneNotSupportedException; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPTREEID_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepType.h b/source/visualization/HepRep/include/HEPREP/HepRepType.h deleted file mode 100644 index 3237e8db64..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepType.h +++ /dev/null @@ -1,109 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPTYPE_H -#define HEPREP_HEPREPTYPE_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include -#include - -#include "HEPREP/HepRepDefinition.h" - -namespace HEPREP { - -/** - * HepRepType interface. - * - * @author Mark Donszelmann - */ -class HepRepType : virtual public HepRepDefinition { - -public: - /// Destructor. - virtual ~HepRepType() { /* nop */; } - - /** - * Adds a sub-type to this type. - * - * @param type sub-type to be added. - */ - virtual void addType(HepRepType * type) = 0; - - /** - * Returns the name of this type. - * This is the full name if one uses flat-types, and the node name if one - * uses hierarchical typenames. It is the name supplied at construction of the type. - * - * @return name of type. - * @see #getFullName() - */ - virtual std::string getName() = 0; - - /** - * Returns the full name of this type. - * The full name is constructed from the root of the typeTree (without the typeTreeName) - * by concatenating all the node names separated by slashes "/". For example: - * Geometry/InnerDetector/Sector24/Wire20 - * - * @return full name of type. - * @see #getName() - */ - virtual std::string getFullName() = 0; - - /** - * Returns the description of this type. - * - * @return description of type. - */ - virtual std::string getDescription() = 0; - - /** - * Sets the description of this type. - * - * @param infoURL - */ - virtual void setDescription(std::string description) = 0; - - /** - * Returns the information URL of this type. - * - * @return info URL of type. - */ - virtual std::string getInfoURL() = 0; - - /** - * Sets the information URL of this type. - * - * @param infoURL - */ - virtual void setInfoURL(std::string infoURL) = 0; - - /** - * Returns the parent of this type. - * - * @return parent of type, or null if top-level. - */ - virtual HepRepType * getSuperType() = 0; - - /** - * Returns a collection of all the sub-types of this type. - * - * @return collection of HepRepTypes. - */ - virtual std::vector getTypeList() = 0; - - /** - * Returns a deep copy of this type. - * - * @param parent to which this copy is added. - * @return copy of this type. - */ - virtual HepRepType * copy(HepRepType * parent) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPTYPE_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepTypeTree.h b/source/visualization/HepRep/include/HEPREP/HepRepTypeTree.h deleted file mode 100644 index 1822513f60..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepTypeTree.h +++ /dev/null @@ -1,66 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPTYPETREE_H -#define HEPREP_HEPREPTYPETREE_H 1 - -// Copyright 2000-2005, FreeHEP. - -#include -#include - -#include "HEPREP/HepRepTreeID.h" - -namespace HEPREP { - -class HepRepType; - -/** - * HepRepTypeTree interface. - * - * @author Mark Donszelmann - */ -class HepRepTypeTree : virtual public HepRepTreeID { - -public: - /// Destructor. - virtual ~HepRepTypeTree() { /* nop */; } - - /** - * Adds a type to this typetree. - * - * @param type to be added. - */ - virtual void addType(HepRepType * type) = 0; - - /** - * Returns a collection of all types in this tree. - * - * @return collection of HepRepTypes. - */ - virtual std::vector getTypeList() = 0; - - /** - * Returns type - */ - virtual HepRepType * getType(std::string fullName) = 0; - - /** - * Returns a deep copy of this typetree. - * - * @return copy of this typetree. - */ - virtual HepRepTypeTree * copy() = 0; - -// -// To be enable in g++ 3.0 -// using HepRep::HepRepTreeID::copy; -// To be disabled in g++ 3.0 -// HepRepTreeID * copy(); -// -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPTYPETREE_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepViewer.h b/source/visualization/HepRep/include/HEPREP/HepRepViewer.h deleted file mode 100644 index ae6b200af8..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepViewer.h +++ /dev/null @@ -1,34 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPVIEWER_H -#define HEPREP_HEPREPVIEWER_H 1 - -// Copyright 2000-2005, FreeHEP. - -namespace HEPREP { - -class HepRep; - -/** - * The HepRepViewer interface. - * - * @author Mark Donszelmann - */ -class HepRepViewer { - -public: - /// Destructor. - virtual ~HepRepViewer() { /* nop */; } - - /** - * Display a heprep - * - */ - virtual void display(HepRep heprep) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPVIEWER_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepWriter.h b/source/visualization/HepRep/include/HEPREP/HepRepWriter.h deleted file mode 100644 index beee54ff54..0000000000 --- a/source/visualization/HepRep/include/HEPREP/HepRepWriter.h +++ /dev/null @@ -1,163 +0,0 @@ -// -*- C++ -*- -// AID-GENERATED -// ========================================================================= -// This class was generated by AID - Abstract Interface Definition -// DO NOT MODIFY, but use the org.freehep.aid.Aid utility to regenerate it. -// ========================================================================= -#ifndef HEPREP_HEPREPWRITER_H -#define HEPREP_HEPREPWRITER_H 1 - -// Copyright 2002-2005, Freehep. - -#include -#include - -namespace HEPREP { - -class HepRep; -class HepRepAction; -class HepRepAttDef; -class HepRepAttValue; -class HepRepAttribute; -class HepRepDefinition; -class HepRepInstance; -class HepRepInstanceTree; -class HepRepPoint; -class HepRepTreeID; -class HepRepType; -class HepRepTypeTree; - -/** - * HepRepWriter interface. - * - * @author Mark Donszelmann - */ -class HepRepWriter { - -public: - /// Destructor. - virtual ~HepRepWriter() { /* nop */; } - - /** - * Adds a property, to be written to the HepRep file when closed. - * - * @param key - * @param value - * @return false in case of a stream problem. - */ - virtual bool addProperty(std::string key, std::string value) = 0; - - /** - * Closes the writer and its underlying stream. - * - * @return false in case of a stream problem. - */ - virtual bool close() = 0; - - /** - * Writes a HepRep. - * - * @param heprep to be written. - * @param name for the heprep to be written (for tagged access), may be ommited. - * @return false in case of a stream problem. - */ - virtual bool write(HepRep * heprep, std::string name) = 0; - - /** - * Writes the layerOrder. - * - * @param layerOrder to be written. - * @return false in case of a stream problem. - */ - virtual bool write(std::vector layerOrder) = 0; - - /** - * Writes a HepRepTypeTree. - * - * @param typeTree to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepTypeTree * typeTree) = 0; - - /** - * Writes a HepRepType. - * - * @param type to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepType * type) = 0; - - /** - * Writes a HepRepTreeID. - * - * @param treeID to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepTreeID * treeID) = 0; - - /** - * Writes a HepRepAction. - * - * @param action to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepAction * action) = 0; - - /** - * Writes a HepRepInstanceTree. - * - * @param instanceTree to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepInstanceTree * instanceTree) = 0; - - /** - * Writes a HepRepInstance. - * - * @param instance to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepInstance * instance) = 0; - - /** - * Writes a HepRepPoint. - * - * @param point to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepPoint * point) = 0; - - /** - * Writes a HepRepAttribute. - * - * @param attribute to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepAttribute * attribute) = 0; - - /** - * Writes a HepRepDefinition. - * - * @param definition to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepDefinition * definition) = 0; - - /** - * Writes a HepRepAttValue. - * - * @param attValue to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepAttValue * attValue) = 0; - - /** - * Writes a HepRepAttDef. - * - * @param attDef to be written. - * @return false in case of a stream problem. - */ - virtual bool write(HepRepAttDef * attDef) = 0; -}; // class -} // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPWRITER_H */ diff --git a/source/visualization/HepRep/include/HEPREP/Types.h b/source/visualization/HepRep/include/HEPREP/Types.h deleted file mode 100644 index 927355244b..0000000000 --- a/source/visualization/HepRep/include/HEPREP/Types.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef HEPREP_TYPES_H -#define HEPREP_TYPES_H 1 - -namespace HEPREP { - -#if defined(WIN32) && !defined(GNU_GCC) - -// WIN32 and NOT GNU_GCC -typedef long int32; -typedef __int64 int64; -#define HEPREP_INT32_FORMAT "%d" -#define HEPREP_INT64_FORMAT "%ld" - -#else // other than WIN32-MSVC -#if defined(_LP64) - -// 64 Bit Platforms -typedef int int32; -typedef long int64; -#define HEPREP_INT32_FORMAT "%d" -#define HEPREP_INT64_FORMAT "%ld" - -#else - -// 32-Bit Platforms -typedef long int32; -typedef long long int64; -#define HEPREP_INT32_FORMAT "%ld" -#define HEPREP_INT64_FORMAT "%lld" - -#endif // 32-Bit Platforms -#endif // other than WIN32-MSVC - -} // namespace HEPREP - -#endif diff --git a/source/visualization/HepRep/include/HEPREP/freehep-heprep.version b/source/visualization/HepRep/include/HEPREP/freehep-heprep.version deleted file mode 100644 index 4a1029d13b..0000000000 --- a/source/visualization/HepRep/include/HEPREP/freehep-heprep.version +++ /dev/null @@ -1 +0,0 @@ -source = freehep-heprep-2.0.1 \ No newline at end of file diff --git a/source/visualization/HepRep/include/README b/source/visualization/HepRep/include/README deleted file mode 100644 index ea3533e33c..0000000000 --- a/source/visualization/HepRep/include/README +++ /dev/null @@ -1,23 +0,0 @@ -Apart from the heprep1 files: - -G4HepRepFile.hh -G4HepRepFileSceneHandler.hh -G4HepRepFileViewer.hh -G4HepRepFileXMLWriter.hh - -and heprep2 files: - -G4HepRep.hh -G4HepRepSceneHandler.hh -G4HepRepMessenger.hh -G4HepRepViewer.hh - -the other sources are copies from the FreeHEP library -(java.freehep.org) and are maintained there. - -The files starting with G4 are geant4 compliant, the others may not be. - -Changes made here may be overwritten. - -4 May 2005 -Mark Donszelmann diff --git a/source/visualization/HepRep/include/cheprep/AbstractXMLWriter.h b/source/visualization/HepRep/include/cheprep/AbstractXMLWriter.h deleted file mode 100644 index 6c2234e530..0000000000 --- a/source/visualization/HepRep/include/cheprep/AbstractXMLWriter.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef ABSTRACTXMLWRITER_H -#define ABSTRACTXMLWRITER_H 1 - -#include "cheprep/config.h" - -#include - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - class AbstractXMLWriter { - - public: - AbstractXMLWriter(std::string aDefaultNameSpace) : defaultNameSpace(aDefaultNameSpace) { - } - virtual ~AbstractXMLWriter() { - } - - virtual void openTag(std::string ns, std::string name) = 0; - virtual void printTag(std::string ns, std::string name) = 0; - virtual void setAttribute(std::string ns, std::string name, std::string value) = 0; - virtual void setAttribute(std::string ns, std::string name, double value) = 0; - - virtual void close() = 0; - virtual void openDoc(std::string version = "1.0", std::string encoding = "", bool standalone = false) = 0; - virtual void closeDoc(bool force = false) = 0; - virtual void openTag(std::string name) = 0; - virtual void closeTag() = 0; - virtual void printTag(std::string name) = 0; - virtual void setAttribute(std::string name, char* value) = 0; - virtual void setAttribute(std::string name, std::string value) = 0; - virtual void setAttribute(std::string name, std::vector value) = 0; - virtual void setAttribute(std::string name, int64 value) = 0; - virtual void setAttribute(std::string name, int value) = 0; - virtual void setAttribute(std::string name, bool value) = 0; - virtual void setAttribute(std::string name, double value) = 0; - - protected: - std::string defaultNameSpace; - }; - -} // cheprep - -#endif // ABSTRACTXMLWRITER_H diff --git a/source/visualization/HepRep/include/cheprep/BHepRepWriter.h b/source/visualization/HepRep/include/cheprep/BHepRepWriter.h deleted file mode 100644 index a94c394a8c..0000000000 --- a/source/visualization/HepRep/include/cheprep/BHepRepWriter.h +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_BHEPREPWRITER_H -#define CHEPREP_BHEPREPWRITER_H - -#include "cheprep/config.h" - -#include -#include -#include -#include - -#include "cheprep/AbstractXMLWriter.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - class BHepRepWriter : public AbstractXMLWriter { - - public: - - BHepRepWriter(std::ostream& os); - virtual ~BHepRepWriter(); - - void close(); - void openDoc(std::string version = "BinaryHepRep/1.0", std::string encoding = "UTF-8", bool standalone = false); - void closeDoc(bool force = false); - void openTag(std::string name); - void closeTag(); - void printTag(std::string name); - void setAttribute(std::string name, char* value); - void setAttribute(std::string name, std::string value); - void setAttribute(std::string name, std::vector value); - void setAttribute(std::string name, int64 value); - void setAttribute(std::string name, int value); - void setAttribute(std::string name, bool value); - void setAttribute(std::string name, double value); - - // - // Can be removed when we can properly inherit those (since names are equal to overloaded ones). - // - void openTag(std::string ns, std::string name) { - openTag(ns == defaultNameSpace ? name : ns.append(":").append(name)); - } - void printTag(std::string ns, std::string name) { - printTag(ns == defaultNameSpace ? name : ns.append(":").append(name)); - } - void setAttribute(std::string ns, std::string name, std::string value) { - setAttribute(ns.append(":").append(name), value); - } - void setAttribute(std::string ns, std::string name, double value) { - setAttribute(ns.append(":").append(name), value); - } - - private: - static const unsigned char WBXML_VERSION = 0x03; - static const unsigned char UNKNOWN_PID = 0x01; - static const unsigned char UTF8 = 0x6a; - - // standard tags - static const unsigned char SWITCH_PAGE = 0x00; - static const unsigned char END = 0x01; - static const unsigned char ENTITY = 0x02; - static const unsigned char STR_I = 0x03; - static const unsigned char LITERAL = 0x04; - - static const unsigned char CONTENT = 0x40; - static const unsigned char EXT_I_0 = 0x40; - static const unsigned char EXT_I_1 = 0x41; - static const unsigned char EXT_I_2 = 0x42; - static const unsigned char PI = 0x43; - static const unsigned char LITERAL_C = 0x44; - - static const unsigned char ATTRIBUTE = 0x80; - static const unsigned char EXT_T_0 = 0x80; - static const unsigned char EXT_T_1 = 0x81; - static const unsigned char EXT_T_2 = 0x82; - static const unsigned char STR_T = 0x83; - static const unsigned char LITERAL_A = 0x84; - - static const unsigned char EXT_0 = 0xC0; - static const unsigned char EXT_1 = 0xC1; - static const unsigned char EXT_2 = 0xC2; - static const unsigned char OPAQUE = 0xC3; - static const unsigned char LITERAL_AC = 0xC4; - - // our own extensions - static const unsigned char STR_D = EXT_I_0; - static const unsigned char STR_R = EXT_T_0; - - // class definitions - static std::map tags; - static std::map attributes; - static std::map values; - - // outputstream variables - std::ostream& os; - bool singlePrecision; - bool isBigEndian; - - // document variables - std::map stringValues; - - // tag variables - std::map stringAttributes; - std::map > colorAttributes; - std::map longAttributes; - std::map intAttributes; - std::map booleanAttributes; - std::map doubleAttributes; - - // point array - std::vector points; - - // methods - void writeTag(std::string name, bool content = false); - void writePoints(); - void writeStringDefine(std::string s); - void writeMultiByteInt(unsigned int ui); - void writeReal(double ui); - void writeLong(int64 i); - void writeInt(int i); - void writeByte(unsigned char b); - void writeString(std::string s); - }; - -} // cheprep - -#endif // CHEPREP_BHEPREPWRITER_H diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRep.h b/source/visualization/HepRep/include/cheprep/DefaultHepRep.h deleted file mode 100644 index 62022fed3c..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRep.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREP_H -#define CHEPREP_DEFAULTHEPREP_H 1 - -#include "cheprep/config.h" - -#include -#include -#include - -#include "HEPREP/HepRep.h" -#include "HEPREP/HepRepSelectFilter.h" -#include "HEPREP/HepRepWriter.h" -#include "HEPREP/HepRepType.h" -#include "HEPREP/HepRepTypeTree.h" -#include "HEPREP/HepRepInstanceTree.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRep : public virtual HEPREP::HepRep { - - private: - std::vector layers; - std::vector typeTrees; - std::vector instanceTrees; - - public: - DefaultHepRep(); - ~DefaultHepRep(); - - HEPREP::HepRep* copy(HEPREP::HepRepSelectFilter* filter); - std::vector getLayerOrder(); - void addLayer(std::string layer); - void addTypeTree(HEPREP::HepRepTypeTree* typeTree); - void removeTypeTree(HEPREP::HepRepTypeTree* typeTree); - HEPREP::HepRepTypeTree* getTypeTree(std::string name, std::string version); - std::vector getTypeTreeList(); - void addInstanceTree(HEPREP::HepRepInstanceTree* instanceTree); - void overlayInstanceTree(HEPREP::HepRepInstanceTree * instanceTree); - void removeInstanceTree(HEPREP::HepRepInstanceTree* instanceTree); - HEPREP::HepRepInstanceTree* getInstanceTreeTop(std::string name, std::string version); - HEPREP::HepRepInstanceTree* getInstances(std::string name, std::string version, - std::vector typeNames); - HEPREP::HepRepInstanceTree* getInstancesAfterAction( - std::string name, - std::string version, - std::vector typeNames, - std::vector actions, - bool getPoints, - bool getDrawAtts, - bool getNonDrawAtts, - std::vector invertAtts); - std::string checkForException(); - std::vector getInstanceTreeList(); -}; - -} // cheprep - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepAction.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepAction.h deleted file mode 100644 index 900d9a45e3..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepAction.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPACTION_H -#define CHEPREP_DEFAULTHEPREPACTION_H 1 - -#include "cheprep/config.h" - -#include - -#include "HEPREP/HepRepAction.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepAction : public virtual HEPREP::HepRepAction { - - private: - std::string name; - std::string expression; - - public: - DefaultHepRepAction(std::string name, std::string expression); - ~DefaultHepRepAction(); - - std::string getName(); - std::string getExpression(); - HEPREP::HepRepAction* copy(); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepAttDef.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepAttDef.h deleted file mode 100644 index 5a9e8cb978..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepAttDef.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPATTDEF_H -#define CHEPREP_DEFAULTHEPREPATTDEF_H 1 - -#include "cheprep/config.h" - -#include - -#include "HEPREP/HepRepAttDef.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepAttDef : public virtual HEPREP::HepRepAttDef { - - private: - std::string name, desc, category, extra; - - public: - DefaultHepRepAttDef(std::string name, std::string desc, std::string category, std::string extra); - ~DefaultHepRepAttDef(); - - HEPREP::HepRepAttDef* copy(); - std::string getName(); - std::string getLowerCaseName(); - std::string getDescription(); - std::string getCategory(); - std::string getExtra(); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepAttValue.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepAttValue.h deleted file mode 100644 index 7b5a9a3fa2..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepAttValue.h +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPATTVALUE_H -#define CHEPREP_DEFAULTHEPREPATTVALUE_H 1 - -#include "cheprep/config.h" - -#include - -#include "HEPREP/HepRepAttValue.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepAttValue : public virtual HEPREP::HepRepAttValue { - - private: - enum { LABELSTRINGS_LEN = 4 }; - std::string name; - int type; - - // values implemented as separate items, so that they do not take up unnecessary space for an Object - // only ONE of these is filled - std::string stringValue; - int64 longValue; - double doubleValue; - bool booleanValue; - std::vector colorValue; - - int showLabelValue; - static std::string labelStrings[LABELSTRINGS_LEN]; - - void init(); - - public: - DefaultHepRepAttValue(std::string name, std::string value, int showLabel); - DefaultHepRepAttValue(std::string name, int64 value, int showLabel); - DefaultHepRepAttValue(std::string name, int value, int showLabel); - DefaultHepRepAttValue(std::string name, double value, int showLabel); - DefaultHepRepAttValue(std::string name, bool value, int showLabel); - DefaultHepRepAttValue(std::string name, std::vector value, int showLabel); - ~DefaultHepRepAttValue(); - - HEPREP::HepRepAttValue* copy(); - - std::string getName(); - std::string getLowerCaseName(); - int getType(); - std::string getTypeName(); - int showLabel(); - std::string getString(); - std::string getLowerCaseString(); - int64 getLong(); - int getInteger(); - double getDouble(); - bool getBoolean(); - std::vector getColor(); - - std::string getAsString(); - static std::string getAsString(std::vector c); - static std::string getAsString(int i); - static std::string getAsString(int64 i); - static std::string getAsString(double d); - static std::string getAsString(bool b); - - std::string toShowLabel(); - static std::string toShowLabel(int showLabel); -}; - -} // cheprep - - -#endif - diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepAttribute.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepAttribute.h deleted file mode 100644 index 0cb56ccc89..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepAttribute.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPATTRIBUTE_H -#define CHEPREP_DEFAULTHEPREPATTRIBUTE_H 1 - -#include "cheprep/config.h" - -#include -#include -#include -#include - -#include "HEPREP/HepRepAttribute.h" -#include "HEPREP/HepRepAttValue.h" -#include "HEPREP/HepRepConstants.h" -#include "HEPREP/HepRepWriter.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepAttribute : public virtual HEPREP::HepRepAttribute { - - private: - std::map attValues; - - public: - DefaultHepRepAttribute(); - ~DefaultHepRepAttribute(); - - std::set getAttValuesFromNode(); - void addAttValue(HEPREP::HepRepAttValue* hepRepAttValue); - void addAttValue(std::string key, char *value, int showLabel); - void addAttValue(std::string key, std::string value, int showLabel); - void addAttValue(std::string key, int value, int showLabel); - void addAttValue(std::string key, int64 value, int showLabel); - void addAttValue(std::string key, double value, int showLabel); - void addAttValue(std::string key, bool value, int showLabel); - void addAttValue(std::string key, std::vector value, int showLabel); - void addAttValue(std::string key, double red, double green, double blue, double alpha, int showLabel); - HEPREP::HepRepAttValue* getAttValueFromNode(std::string lowerCaseName); - HEPREP::HepRepAttValue* removeAttValue(std::string key); - - HEPREP::HepRepAttValue* getAttValue(std::string name) = 0; -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepDefinition.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepDefinition.h deleted file mode 100644 index 0317065a4b..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepDefinition.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPDEFINITION_H -#define CHEPREP_DEFAULTHEPREPDEFINITION_H 1 - -#include "cheprep/config.h" - -#include -#include -#include - -#include "HEPREP/HepRepDefinition.h" -#include "HEPREP/HepRepWriter.h" - -#include "DefaultHepRepAttribute.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepDefinition : public DefaultHepRepAttribute, public virtual HEPREP::HepRepDefinition { - - private: - std::map attDefs; - - public: - DefaultHepRepDefinition(); - ~DefaultHepRepDefinition(); - - void addAttDef(HEPREP::HepRepAttDef* hepRepAttDef); - void addAttDef(std::string name, std::string desc, std::string type, std::string extra); - std::set getAttDefsFromNode(); - HEPREP::HepRepAttDef* getAttDefFromNode(std::string lowerCaseName); - - HEPREP::HepRepAttDef* getAttDef(std::string name) = 0; - HEPREP::HepRepAttValue* getAttValue(std::string name) = 0; -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepFactory.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepFactory.h deleted file mode 100644 index 4854059a42..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepFactory.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPFACTORY_H -#define CHEPREP_DEFAULTHEPREPFACTORY_H 1 - -#include "cheprep/config.h" - -#include -#include - -#include "HEPREP/HepRep.h" -#include "HEPREP/HepRepFactory.h" -#include "HEPREP/HepRepReader.h" -#include "HEPREP/HepRepWriter.h" -#include "HEPREP/HepRepPoint.h" -#include "HEPREP/HepRepInstance.h" -#include "HEPREP/HepRepInstanceTree.h" -#include "HEPREP/HepRepTreeID.h" -#include "HEPREP/HepRepAction.h" -#include "HEPREP/HepRepType.h" -#include "HEPREP/HepRepTypeTree.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepFactory : public virtual HEPREP::HepRepFactory { - - public: - DefaultHepRepFactory(); - ~DefaultHepRepFactory(); - -// static HEPREP::HepRepFactory* create(); - HEPREP::HepRepReader* createHepRepReader (std::istream* in); - HEPREP::HepRepReader* createHepRepReader (std::string filename); - HEPREP::HepRepWriter* createHepRepWriter (std::ostream* out, bool randomAccess, bool compress); - HEPREP::HepRepPoint* createHepRepPoint (HEPREP::HepRepInstance* instance, - double x, double y, double z); - HEPREP::HepRepInstance* createHepRepInstance (HEPREP::HepRepInstance* parent, HEPREP::HepRepType* type); - HEPREP::HepRepInstance* createHepRepInstance (HEPREP::HepRepInstanceTree* parent, HEPREP::HepRepType* type); - HEPREP::HepRepTreeID* createHepRepTreeID (std::string name, std::string version, std::string qualifier = "top-level"); - HEPREP::HepRepAction* createHepRepAction (std::string name, std::string expression); - HEPREP::HepRepInstanceTree* createHepRepInstanceTree (std::string name, std::string version, - HEPREP::HepRepTreeID* typeTreeID); - HEPREP::HepRepType* createHepRepType (HEPREP::HepRepType* parent, std::string name); - HEPREP::HepRepType* createHepRepType (HEPREP::HepRepTypeTree* parent, std::string name); - HEPREP::HepRepTypeTree* createHepRepTypeTree (HEPREP::HepRepTreeID* treeID); - HEPREP::HepRep* createHepRep (); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepInstance.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepInstance.h deleted file mode 100644 index f030af03da..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepInstance.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPINSTANCE_H -#define CHEPREP_DEFAULTHEPREPINSTANCE_H 1 - -#include "cheprep/config.h" - -#include -#include - -#include "HEPREP/HepRep.h" -#include "HEPREP/HepRepSelectFilter.h" -#include "HEPREP/HepRepInstanceTree.h" -#include "HEPREP/HepRepInstance.h" -#include "HEPREP/HepRepWriter.h" -#include "HEPREP/HepRepType.h" -#include "HEPREP/HepRepPoint.h" -#include "HEPREP/HepRepAttValue.h" - -#include "DefaultHepRepAttribute.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepInstance : public DefaultHepRepAttribute, public virtual HEPREP::HepRepInstance { - - private: - HEPREP::HepRepInstance* parent; - HEPREP::HepRepType* type; - std::vector points; - std::vector instances; - - public: - DefaultHepRepInstance(HEPREP::HepRepInstance* parent, HEPREP::HepRepType* type); - DefaultHepRepInstance(HEPREP::HepRepInstanceTree* parent, HEPREP::HepRepType* type); - ~DefaultHepRepInstance(); - - void overlay(HEPREP::HepRepInstance * instance); - HEPREP::HepRepInstance* copy(HEPREP::HepRepTypeTree* typeTree, HEPREP::HepRepInstance* parent, HEPREP::HepRepSelectFilter* filter); - HEPREP::HepRepInstance* copy(HEPREP::HepRepTypeTree* typeTree, HEPREP::HepRepInstanceTree* parent, HEPREP::HepRepSelectFilter* filter); - HEPREP::HepRepType* getType(); - void addPoint(HEPREP::HepRepPoint* point); - std::vector getPoints(); - HEPREP::HepRepInstance* getSuperInstance(); - void addInstance(HEPREP::HepRepInstance* instance); - void removeInstance(HEPREP::HepRepInstance* instance); - std::vector getInstances(); - - HEPREP::HepRepAttValue* getAttValue(std::string name); - - void *getParent() { return parent; } -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepInstanceTree.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepInstanceTree.h deleted file mode 100644 index c476eb448a..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepInstanceTree.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPINSTANCETREE_H -#define CHEPREP_DEFAULTHEPREPINSTANCETREE_H 1 - -#include "cheprep/config.h" - -#include -#include -#include - -#include "HEPREP/HepRep.h" -#include "HEPREP/HepRepSelectFilter.h" -#include "HEPREP/HepRepInstanceTree.h" -#include "HEPREP/HepRepInstance.h" -#include "HEPREP/HepRepWriter.h" -#include "HEPREP/HepRepTreeID.h" - -#include "DefaultHepRepTreeID.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepInstanceTree : public DefaultHepRepTreeID, public virtual HEPREP::HepRepInstanceTree { - - private: - HEPREP::HepRepTreeID* typeTree; - std::vector instances; - std::vector instanceTrees; - - public: - DefaultHepRepInstanceTree(std::string name, std::string version, HEPREP::HepRepTreeID* typeTree); - ~DefaultHepRepInstanceTree(); - - void overlay(HEPREP::HepRepInstanceTree * instanceTree); - HEPREP::HepRepInstanceTree* copy(HEPREP::HepRepTypeTree* typeTree, HEPREP::HepRepSelectFilter* filter); - void addInstance(HEPREP::HepRepInstance* instance); - void removeInstance(HEPREP::HepRepInstance* instance); - std::vector getInstances(); - void addInstanceTree(HEPREP::HepRepTreeID* treeID); - HEPREP::HepRepTreeID* getTypeTree(); - std::vector getInstanceTreeList(); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepPoint.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepPoint.h deleted file mode 100644 index 5dd98933d4..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepPoint.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPPOINT_H -#define CHEPREP_DEFAULTHEPREPPOINT_H 1 - -#include "cheprep/config.h" - -#include -#include - -#include "HEPREP/HepRepInstance.h" -#include "HEPREP/HepRepWriter.h" -#include "HEPREP/HepRepAttValue.h" -#include "HEPREP/HepRepPoint.h" - -#include "DefaultHepRepAttribute.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepPoint : public DefaultHepRepAttribute, public virtual HEPREP::HepRepPoint { - - private: - HEPREP::HepRepInstance* instance; - - protected: - double x, y, z; - - public: - DefaultHepRepPoint(HEPREP::HepRepInstance* instance, double x, double y, double z); - ~DefaultHepRepPoint(); - - HEPREP::HepRepInstance* getInstance(); - - HEPREP::HepRepAttValue* getAttValue(std::string lowerCaseName); - - HEPREP::HepRepPoint* copy(HEPREP::HepRepInstance* parent); - double getX(); - double getY(); - double getZ(); - std::vector* getXYZ(std::vector* xyz); - double getRho(); - double getPhi(); - double getTheta(); - double getR(); - double getEta(); - double getX(double xVertex, double yVertex, double zVertex); - double getY(double xVertex, double yVertex, double zVertex); - double getZ(double xVertex, double yVertex, double zVertex); - double getRho(double xVertex, double yVertex, double zVertex); - double getPhi(double xVertex, double yVertex, double zVertex); - double getTheta(double xVertex, double yVertex, double zVertex); - double getR(double xVertex, double yVertex, double zVertex); - double getEta(double xVertex, double yVertex, double zVertex); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepTreeID.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepTreeID.h deleted file mode 100644 index 9f37087bdd..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepTreeID.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPTREEID_H -#define CHEPREP_DEFAULTHEPREPTREEID_H 1 - -#include "cheprep/config.h" - -#include - -#include "HEPREP/HepRepTreeID.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepTreeID : public virtual HEPREP::HepRepTreeID { - - private: - std::string name; - std::string version; - std::string qualifier; - - public: - DefaultHepRepTreeID(std::string name, std::string version, std::string qualifier = "top_level"); - ~DefaultHepRepTreeID(); - - std::string getQualifier(); - void setQualifier(std::string qualifier); - std::string getName(); - std::string getVersion(); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepType.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepType.h deleted file mode 100644 index 67040ceaa5..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepType.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPTYPE_H -#define CHEPREP_DEFAULTHEPREPTYPE_H 1 - -#include "cheprep/config.h" - -#include -#include -#include - -#include "HEPREP/HepRep.h" -#include "HEPREP/HepRepType.h" -#include "HEPREP/HepRepAttDef.h" -#include "HEPREP/HepRepAttValue.h" -#include "HEPREP/HepRepWriter.h" - -#include "DefaultHepRepDefinition.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepType : public DefaultHepRepDefinition, public virtual HEPREP::HepRepType { - - private: - HEPREP::HepRepType* parent; - std::vector types; - std::string name; - std::string description; - std::string infoURL; - - public: - DefaultHepRepType(HEPREP::HepRepType* parent, std::string name); - DefaultHepRepType(HEPREP::HepRepTypeTree* parent, std::string name); - ~DefaultHepRepType(); - - HEPREP::HepRepType* getSuperType(); - HEPREP::HepRepAttDef* getAttDef(std::string name); - HEPREP::HepRepAttValue* getAttValue(std::string name); - HEPREP::HepRepType* copy(HEPREP::HepRepType* parent); - std::string getName(); - std::string getFullName(); - std::string getDescription(); - void setDescription(std::string description); - std::string getInfoURL(); - void setInfoURL(std::string infoURL); - void addType(HEPREP::HepRepType* type); - std::vector getTypeList(); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DefaultHepRepTypeTree.h b/source/visualization/HepRep/include/cheprep/DefaultHepRepTypeTree.h deleted file mode 100644 index a8c3177054..0000000000 --- a/source/visualization/HepRep/include/cheprep/DefaultHepRepTypeTree.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFAULTHEPREPTYPETREE_H -#define CHEPREP_DEFAULTHEPREPTYPETREE_H 1 - -#include "cheprep/config.h" - -#include -#include -#include - -#include "HEPREP/HepRep.h" -#include "HEPREP/HepRepTypeTree.h" -#include "HEPREP/HepRepType.h" -#include "HEPREP/HepRepWriter.h" -#include "HEPREP/HepRepTreeID.h" - -#include "DefaultHepRepTreeID.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class DefaultHepRepTypeTree : public DefaultHepRepTreeID, public virtual HEPREP::HepRepTypeTree { - - private: - std::vector types; - - public: - DefaultHepRepTypeTree(HEPREP::HepRepTreeID* typeTree); - ~DefaultHepRepTypeTree(); - - HEPREP::HepRepTypeTree* copy(); - void addType(HEPREP::HepRepType* type); - std::vector getTypeList(); - HEPREP::HepRepType* getType(std::string name); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/DeflateOutputStreamBuffer.h b/source/visualization/HepRep/include/cheprep/DeflateOutputStreamBuffer.h deleted file mode 100644 index 3a031f325d..0000000000 --- a/source/visualization/HepRep/include/cheprep/DeflateOutputStreamBuffer.h +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_DEFLATEOUTPUTSTREAMBUF_H -#define CHEPREP_DEFLATEOUTPUTSTREAMBUF_H - -#include -#include -#include -#include - -#ifndef CHEPREP_NO_ZLIB -#include -#endif // CHEPREP_NO_ZLIB - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - class DeflateOutputStreamBuffer : public std::streambuf { - - public: - - DeflateOutputStreamBuffer(std::streambuf *buffer); - - void init(bool compress); - void finish(); - - virtual ~DeflateOutputStreamBuffer(); - - - protected: - int overflow(int c = EOF); - -#ifndef CHEPREP_NO_ZLIB - bool flushOut(); -#endif // CHEPREP_NO_ZLIB - - inline void putUI(unsigned int ui) { - unsigned char* ucp = reinterpret_cast(&ui); - unsigned int i = (static_cast(ucp[ 3 ]) << 24) + - (static_cast(ucp[ 2 ]) << 16) + - (static_cast(ucp[ 1 ]) << 8 ) + - (static_cast(ucp[ 0 ])); - buffer->sputn(reinterpret_cast(&i), sizeof(unsigned int)); - } - - inline void putUS(unsigned short us) { - unsigned char* ucp = reinterpret_cast(&us); - unsigned short s = (static_cast(ucp[ 1 ]) << 8 ) + - (static_cast(ucp[ 0 ])); - buffer->sputn(reinterpret_cast(&s), sizeof(unsigned short)); - } - - inline void putUB(unsigned char ub) { - buffer->sputc(ub); - } - - inline void putS(const std::string s) { - buffer->sputn(s.c_str(), s.length()); - } - - inline std::streampos pos() { - std::ostream os(buffer); - return os.tellp(); - } - - inline unsigned int getSize() { - return size; - } - - inline unsigned int getCRC() { - return crc; - } - - private: - static unsigned long crctable[256]; - std::streambuf *buffer; - - unsigned int crc; - unsigned int size; - -#ifndef CHEPREP_NO_ZLIB - static const unsigned int inSize = 1000; - static const unsigned int outSize = 1000; - z_stream zStream; - bool zStreamOpen; - - std::vector in; - std::vector out; -#endif // CHEPREP_NO_ZLIB -}; - - -} // cheprep - - - -#endif // CHEPREP_DEFLATEOUTPUTSTREAMBUF_H diff --git a/source/visualization/HepRep/include/cheprep/GZIPOutputStream.h b/source/visualization/HepRep/include/cheprep/GZIPOutputStream.h deleted file mode 100644 index 0e934daf1e..0000000000 --- a/source/visualization/HepRep/include/cheprep/GZIPOutputStream.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_GZIPOUTPUTSTREAM_H -#define CHEPREP_GZIPOUTPUTSTREAM_H - -#include - -#include "cheprep/GZIPOutputStreamBuffer.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - class GZIPOutputStream : public std::ostream { - - public: - - GZIPOutputStream(std::ostream &os); - - void setFilename(const std::string &filename); - void setComment(const std::string &comment); - - void close(); - - virtual ~GZIPOutputStream(); - - private: - GZIPOutputStreamBuffer *buffer; - }; - -} // cheprep. - -#endif // CHEPREP_GZIPOUTPUTSTREAM_H diff --git a/source/visualization/HepRep/include/cheprep/GZIPOutputStreamBuffer.h b/source/visualization/HepRep/include/cheprep/GZIPOutputStreamBuffer.h deleted file mode 100644 index b90fb5b343..0000000000 --- a/source/visualization/HepRep/include/cheprep/GZIPOutputStreamBuffer.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_GZIPOUTPUTSTREAMBUF_H -#define CHEPREP_GZIPOUTPUTSTREAMBUF_H - -#include - -#include "cheprep/DeflateOutputStreamBuffer.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - class GZIPOutputStreamBuffer : public DeflateOutputStreamBuffer { - - public: - - GZIPOutputStreamBuffer( std::streambuf *outbuf ); - - int overflow(int); - - void setFilename( const std::string &filename ); - void setComment( const std::string &comment ); - - void close() ; - - virtual ~GZIPOutputStreamBuffer() ; - - private: - void writeHeader(); - void writeTrailer(); - - std::string filename; - std::string comment; - bool open; - }; - - -} // cheprep - -#endif // CHEPREP_GZIPOUTPUTSTREAMBUF_H diff --git a/source/visualization/HepRep/include/cheprep/IndentPrintWriter.h b/source/visualization/HepRep/include/cheprep/IndentPrintWriter.h deleted file mode 100644 index 071297d212..0000000000 --- a/source/visualization/HepRep/include/cheprep/IndentPrintWriter.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_INDENTPRINTWRITER_H -#define CHEPREP_INDENTPRINTWRITER_H 1 - -#include "cheprep/config.h" - -#include -#include - -/** - * A PrintWriter that keeps track of an indentation level - * and indents the output appropriately. - * - * Warning: Only print and println methods taking strings have been overriden, - * print, println methods taking other arguments may not be indented properly. - * - * @author Mark Donszelmann - */ -namespace cheprep { - -class IndentPrintWriter { - - public: - IndentPrintWriter(std::ostream* out, int level = 0); - virtual ~IndentPrintWriter(); - - void close(); - IndentPrintWriter& operator<< (const std::string & s); - IndentPrintWriter& operator<< (std::ostream& (*pf)(std::ostream&)); - void println(const std::string & s); - void print(const std::string & s); - void println(); - void indent(); - void outdent(); - int getIndent() const; - void setIndent(const int level); - std::string getIndentString() const; - void setIndentString(const std::string & indentString); - - private: - void doIndent(); - - std::ostream* out; - bool closed; - int indentLevel; - bool indented; - std::string indentString; -}; - -} // cheprep - - -#endif - diff --git a/source/visualization/HepRep/include/cheprep/XMLHepRepFactory.h b/source/visualization/HepRep/include/cheprep/XMLHepRepFactory.h deleted file mode 100644 index 4cdb52a9e4..0000000000 --- a/source/visualization/HepRep/include/cheprep/XMLHepRepFactory.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef XMLHEPREPFACTORY_H -#define XMLHEPREPFACTORY_H 1 - -#include -#include - -#include "HEPREP/HepRepReader.h" -#include "HEPREP/HepRepWriter.h" - -#include "DefaultHepRepFactory.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class XMLHepRepFactory : public DefaultHepRepFactory { - - public: - XMLHepRepFactory(); - ~XMLHepRepFactory(); - - HEPREP::HepRepReader* createHepRepReader (std::istream* in); - HEPREP::HepRepReader* createHepRepReader (std::string filename); - HEPREP::HepRepWriter* createHepRepWriter (std::ostream* out, bool randomAccess, bool compress); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/XMLHepRepWriter.h b/source/visualization/HepRep/include/cheprep/XMLHepRepWriter.h deleted file mode 100644 index bbf5145656..0000000000 --- a/source/visualization/HepRep/include/cheprep/XMLHepRepWriter.h +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_XMLHEPREPWRITER_H -#define CHEPREP_XMLHEPREPWRITER_H 1 - -#include "cheprep/config.h" - -#include -#include -#include -#include -#include -#include - -#include "HEPREP/HepRep.h" -#include "HEPREP/HepRepFactory.h" -#include "HEPREP/HepRepWriter.h" -#include "HEPREP/HepRepPoint.h" -#include "HEPREP/HepRepInstance.h" -#include "HEPREP/HepRepInstanceTree.h" -#include "HEPREP/HepRepTreeID.h" -#include "HEPREP/HepRepAction.h" -#include "HEPREP/HepRepType.h" -#include "HEPREP/HepRepTypeTree.h" -#include "HEPREP/HepRepAttDef.h" -#include "HEPREP/HepRepAttValue.h" -#include "HEPREP/HepRepAttribute.h" - -#include "cheprep/AbstractXMLWriter.h" -#include "cheprep/ZipOutputStream.h" -#include "cheprep/GZIPOutputStream.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class XMLHepRepWriter : public virtual HEPREP::HepRepWriter { - - private: - std::ostream *out; - bool compress; - std::string nameSpace; - AbstractXMLWriter *xml; - cheprep::ZipOutputStream *zip; - cheprep::GZIPOutputStream *gz; - std::map properties; - - public: - XMLHepRepWriter(std::ostream* out, bool randomAccess, bool compress); - ~XMLHepRepWriter(); - - bool addProperty(std::string key, std::string value); - bool close(); - bool write(HEPREP::HepRep* heprep, std::string name); - bool write(std::vector layers); - bool write(HEPREP::HepRepTypeTree* typeTree); - bool write(HEPREP::HepRepType* type); - bool write(HEPREP::HepRepTreeID* treeID); - bool write(HEPREP::HepRepAction* action); - bool write(HEPREP::HepRepInstanceTree* instanceTree); - bool write(HEPREP::HepRepInstance* instance); - bool write(HEPREP::HepRepPoint* point); - bool write(HEPREP::HepRepAttribute* attribute); - bool write(HEPREP::HepRepDefinition* definition); - bool write(HEPREP::HepRepAttValue* attValue); - bool write(HEPREP::HepRepAttDef* attDef); -}; - -} // cheprep - - -#endif diff --git a/source/visualization/HepRep/include/cheprep/XMLWriter.h b/source/visualization/HepRep/include/cheprep/XMLWriter.h deleted file mode 100644 index e530f18391..0000000000 --- a/source/visualization/HepRep/include/cheprep/XMLWriter.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_XMLWRITER_H -#define CHEPREP_XMLWRITER_H 1 - -#include "cheprep/config.h" - -#include -#include -#include -#include -#include - -#include "cheprep/AbstractXMLWriter.h" -#include "cheprep/IndentPrintWriter.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -class XMLWriter : public AbstractXMLWriter { - - public: - XMLWriter(std::ostream* out, std::string indentString = " ", std::string defaultNameSpace = ""); - virtual ~XMLWriter(); - void close(); - void openDoc(std::string version = "1.0", std::string encoding = "", bool standalone = false); - void referToDTD(std::string name, std::string pid, std::string ref); - void referToDTD(std::string name, std::string system); - void closeDoc(bool force = false); - void printComment(std::string comment); - void printPlain(std::string text); - void print(std::string text); - void println(std::string text); - void openTag(std::string name); - void closeTag(); - void printTag(std::string name); - void setAttribute(std::string name, char* value); - void setAttribute(std::string name, std::string value); - void setAttribute(std::string name, std::vector value); - void setAttribute(std::string name, int64 value); - void setAttribute(std::string name, int value); - void setAttribute(std::string name, bool value); - void setAttribute(std::string name, double value); - void printAttributes(int tagLength); - std::string normalize(std::string s); - std::string normalizeText(std::string s); - void checkNameValid(std::string s); - - // - // Can be removed when we can properly inherit those (since names are equal to overloaded ones). - // - void openTag(std::string ns, std::string name) { - openTag(ns == defaultNameSpace ? name : ns.append(":").append(name)); - } - void printTag(std::string ns, std::string name) { - printTag(ns == defaultNameSpace ? name : ns.append(":").append(name)); - } - void setAttribute(std::string ns, std::string name, std::string value) { - setAttribute(ns.append(":").append(name), value); - } - void setAttribute(std::string ns, std::string name, double value) { - setAttribute(ns.append(":").append(name), value); - } - - - - protected: - bool closed; - IndentPrintWriter* writer; - - private: - std::string dtdName; - std::map attributes; - std::stack openTags; -}; - -} // cheprep - -#endif diff --git a/source/visualization/HepRep/include/cheprep/ZipEntry.h b/source/visualization/HepRep/include/cheprep/ZipEntry.h deleted file mode 100644 index bf7c0c7c65..0000000000 --- a/source/visualization/HepRep/include/cheprep/ZipEntry.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_ZIPENTRY_H -#define CHEPREP_ZIPENTRY_H - -#include -#include - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - class ZipEntry { - - public: - - std::string name; - int method; - int date; - int time; - unsigned int crc; - unsigned int size; - unsigned int csize; - long offset; - long data; - - ZipEntry() { - } - - virtual ~ZipEntry() { - } - }; - -} // cheprep - -#endif // CHEPREP_ZIPENTRY_H diff --git a/source/visualization/HepRep/include/cheprep/ZipOutputStream.h b/source/visualization/HepRep/include/cheprep/ZipOutputStream.h deleted file mode 100644 index c0356457f0..0000000000 --- a/source/visualization/HepRep/include/cheprep/ZipOutputStream.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_ZIPOUTPUTSTREAM_H -#define CHEPREP_ZIPOUTPUTSTREAM_H - -#include -#include -#include - - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - class ZipOutputStreamBuffer; - - class ZipOutputStream : public std::ostream { - - public: - - ZipOutputStream(std::ostream& os); - - void closeEntry(); - - void close(); - - void putNextEntry(const std::string& name, bool compress); - - void setComment(const std::string& comment); - - virtual ~ZipOutputStream(); - - private: - ZipOutputStreamBuffer* buffer; - }; - -} // cheprep - -#endif // CHEPREP_ZIPOUTPUTSTREAM_H diff --git a/source/visualization/HepRep/include/cheprep/ZipOutputStreamBuffer.h b/source/visualization/HepRep/include/cheprep/ZipOutputStreamBuffer.h deleted file mode 100644 index 7add18b69d..0000000000 --- a/source/visualization/HepRep/include/cheprep/ZipOutputStreamBuffer.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_ZIPOUTPUTSTREAMBUFFER_H -#define CHEPREP_ZIPOUTPUTSTREAMBUFFER_H - -#include -#include -#include - -#include "cheprep/DeflateOutputStreamBuffer.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - class ZipEntry; - - class ZipOutputStreamBuffer : public DeflateOutputStreamBuffer { - - public: - - ZipOutputStreamBuffer(std::streambuf* buffer); - - int overflow(int c); - - void closeEntry(); - - void close(); - - void putNextEntry(const std::string& name, bool compress); - - void setMethod(int method); - - void setComment(const std::string& comment); - - virtual ~ZipOutputStreamBuffer(); - - private: - std::string comment; - - bool closed; - ZipEntry* entry; - std::vector* entries; - - static const unsigned int LOCSIG = 0x04034b50; - static const unsigned int EXTSIG = 0x08074b50; - static const unsigned int CENSIG = 0x02014b50; - static const unsigned int ENDSIG = 0x06054b50; - - static const unsigned int VERSIONMADE = 0x0014; - static const unsigned int VERSIONEXTRACT = 0x0014; - static const unsigned int GENFLAG = 0x0008; - }; - -} // cheprep - -#endif // CHEPREP_ZIPOUTPUTSTREAMBUFFER_H diff --git a/source/visualization/HepRep/include/cheprep/config.h b/source/visualization/HepRep/include/cheprep/config.h deleted file mode 100644 index 98f86ef5b5..0000000000 --- a/source/visualization/HepRep/include/cheprep/config.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright FreeHEP, 2005. -#ifndef CHEPREP_CONFIG_H -#define CHEPREP_CONFIG_H 1 - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -#if defined(WIN32) && !defined(GNU_GCC) - -// WIN32 and NOT GNU_GCC -typedef __int64 int64; -typedef unsigned __int64 uint64; -#define CHEPREP_INT64_FORMAT "%lld" -#define CHEPREP_UINT64_FORMAT "%llu" - -#else // other than WIN32-MSVC -#if defined(_LP64) - -// 64 Bit Platforms -typedef long int64; -typedef unsigned long uint64; -#define CHEPREP_INT64_FORMAT "%ld" -#define CHEPREP_UINT64_FORMAT "%uld" - -#else - -// 32-Bit Platforms -typedef long long int64; -typedef unsigned long long uint64; -#define CHEPREP_INT64_FORMAT "%lld" -#define CHEPREP_UINT64_FORMAT "%ulld" - -#endif // 32-Bit Platforms -#endif // other than WIN32-MSVC - -} // namespace cheprep - -#ifdef WIN32 -#ifndef GNU_GCC -// Disable warning C4786: identifier was truncated to '255' characters in the debug information - #pragma warning ( disable : 4786 ) -// Disable warning C4250: inherits via dominance - #pragma warning ( disable : 4250 ) -#ifdef VC6 -// FIX for KB 168440 - VC6 -// Stream Operator << Cannot Handle __int64 Type - #include - - inline std::ostream& operator<<(std::ostream& os, __int64 i ) { - char buf[20]; - sprintf(buf,"%I64d", i ); - os << buf; - return os; - } -#endif // VC6 -#endif // GNU_GCC -#endif // WIN32 - - -#endif // CHEPREP_CONFIG_H diff --git a/source/visualization/HepRep/include/cheprep/freehep-cheprep.version b/source/visualization/HepRep/include/cheprep/freehep-cheprep.version deleted file mode 100644 index 20c7f1855e..0000000000 --- a/source/visualization/HepRep/include/cheprep/freehep-cheprep.version +++ /dev/null @@ -1 +0,0 @@ -source = freehep-cheprep-2.0.5 \ No newline at end of file diff --git a/source/visualization/HepRep/sources.cmake b/source/visualization/HepRep/sources.cmake index b5a6cbb5f5..87a7eba7ef 100644 --- a/source/visualization/HepRep/sources.cmake +++ b/source/visualization/HepRep/sources.cmake @@ -3,46 +3,17 @@ # Define the Geant4 Module. geant4_add_module(G4visHepRep PUBLIC_HEADERS - G4HepRep.hh G4HepRepFile.hh G4HepRepFileSceneHandler.hh G4HepRepFileViewer.hh G4HepRepFileXMLWriter.hh G4HepRepMessenger.hh - G4HepRepSceneHandler.hh - G4HepRepViewer.hh SOURCES - BHepRepWriter.cc - DefaultHepRep.cc - DefaultHepRepAction.cc - DefaultHepRepAttDef.cc - DefaultHepRepAttValue.cc - DefaultHepRepAttribute.cc - DefaultHepRepDefinition.cc - DefaultHepRepFactory.cc - DefaultHepRepInstance.cc - DefaultHepRepInstanceTree.cc - DefaultHepRepPoint.cc - DefaultHepRepTreeID.cc - DefaultHepRepType.cc - DefaultHepRepTypeTree.cc - DeflateOutputStreamBuffer.cc - G4HepRep.cc G4HepRepFile.cc G4HepRepFileSceneHandler.cc G4HepRepFileViewer.cc G4HepRepFileXMLWriter.cc - G4HepRepMessenger.cc - G4HepRepSceneHandler.cc - G4HepRepViewer.cc - GZIPOutputStream.cc - GZIPOutputStreamBuffer.cc - IndentPrintWriter.cc - XMLHepRepFactory.cc - XMLHepRepWriter.cc - XMLWriter.cc - ZipOutputStream.cc - ZipOutputStreamBuffer.cc) + G4HepRepMessenger.cc) geant4_module_link_libraries(G4visHepRep PUBLIC @@ -57,9 +28,6 @@ geant4_module_link_libraries(G4visHepRep G4graphics_reps PRIVATE G4hepgeometry - G4hits - G4UIcommon - G4tracking - ${ZLIB_LIBRARIES}) + G4tracking) # List any source specific properties here diff --git a/source/visualization/HepRep/src/BHepRepWriter.cc b/source/visualization/HepRep/src/BHepRepWriter.cc deleted file mode 100644 index 55f1d080cb..0000000000 --- a/source/visualization/HepRep/src/BHepRepWriter.cc +++ /dev/null @@ -1,544 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/config.h" - -#include -#include - -#include "cheprep/BHepRepWriter.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - // class variables - std::map BHepRepWriter::tags; - std::map BHepRepWriter::attributes; - std::map BHepRepWriter::values; - - BHepRepWriter::BHepRepWriter( std::ostream& ostrm) - : AbstractXMLWriter("heprep"), - os(ostrm), - singlePrecision(true) { - - // resolve endiannes - union { long l; char c[sizeof (long)]; } u; - u.l = 1; - isBigEndian = (u.c[sizeof (long) - 1] == 1); - -// std::cout << "Host is " << (isBigEndian ? "Big-Endian" : "Little-Endian") << "." << std::endl; - - if (tags.size() <= 0) { - // tags - tags["heprep"] = 0x05; - tags["attdef"] = 0x06; - tags["attvalue"] = 0x07; - tags["instance"] = 0x08; - tags["treeid"] = 0x09; - tags["action"] = 0x0a; - tags["instancetree"] = 0x0b; - tags["type"] = 0x0c; - tags["typetree"] = 0x0d; - tags["layer"] = 0x0e; - tags["point"] = 0x0f; - } - - if (attributes.size() <= 0) { - // attribute names - attributes["version"] = 0x05; - attributes["xmlns"] = 0x06; - attributes["xmlns:xsi"] = 0x07; - attributes["xsi:schemaLocation"] = 0x08; - - attributes["valueString"] = 0x10; - attributes["valueColor"] = 0x11; - attributes["valueLong"] = 0x12; - attributes["valueInt"] = 0x13; - attributes["valueBoolean"] = 0x14; - attributes["valueDouble"] = 0x15; - - attributes["name"] = 0x20; - attributes["type"] = 0x22; - attributes["showlabel"] = 0x23; - attributes["desc"] = 0x24; - attributes["category"] = 0x25; - attributes["extra"] = 0x26; - attributes["x"] = 0x27; - attributes["y"] = 0x28; - attributes["z"] = 0x29; - attributes["qualifier"] = 0x2a; - attributes["expression"] = 0x2b; - attributes["typetreename"] = 0x2c; - attributes["typetreeversion"] = 0x2d; - attributes["order"] = 0x2e; - - // for PI - attributes["eof"] = 0x7f; - } - - if (values.size() <= 0) { - // attribute values - values["drawas"] = 0x85; - values["drawasoptions"] = 0x86; - values["visibility"] = 0x87; - - values["label"] = 0x88; - - values["fontname"] = 0x89; - values["fontstyle"] = 0x8a; - values["fontsize"] = 0x8b; - values["fontcolor"] = 0x8c; - values["fonthasframe"] = 0x8d; - values["fontframecolor"] = 0x8e; - values["fontframewidth"] = 0x8f; - values["fonthasbanner"] = 0x90; - values["fontbannercolor"] = 0x91; - - values["color"] = 0x92; - values["framecolor"] = 0x93; - values["layer"] = 0x94; - values["markname"] = 0x95; - values["marksize"] = 0x96; - values["marksizemultiplier"] = 0x97; - values["marktype"] = 0x98; - values["hasframe"] = 0x99; - values["framecolor"] = 0x9a; - values["framewidth"] = 0x9b; - - values["linestyle"] = 0x9c; - values["linewidth"] = 0x9d; - values["linewidthmultiplier"] = 0x9e; - values["linehasarrow"] = 0x9f; - - values["fillcolor"] = 0xa0; - values["filltype"] = 0xa1; - values["fill"] = 0xa2; - - values["radius"] = 0xa3; - values["phi"] = 0xa4; - values["theta"] = 0xa5; - values["omega"] = 0xa6; - values["radius1"] = 0xa7; - values["radius2"] = 0xa8; - values["radius3"] = 0xa9; - values["curvature"] = 0xaa; - values["flylength"] = 0xab; - values["faces"] = 0xac; - - values["text"] = 0xad; - values["hpos"] = 0xae; - values["vpos"] = 0xaf; - values["halign"] = 0xb0; - values["valign"] = 0xb1; - - values["ispickable"] = 0xb2; - values["showparentvalues"] = 0xb3; - values["pickparent"] = 0xb4; - - // attvalue values - values["false"] = 0xd0; - values["true"] = 0xd1; - - values["point"] = 0xd2; - values["line"] = 0xd3; - values["helix"] = 0xd4; - values["polygon"] = 0xd5; - values["circle"] = 0xd6; - values["curve"] = 0xd7; - values["ellipse"] = 0xd8; - values["ellipsoid"] = 0xd9; - values["prism"] = 0xda; - values["cylinder"] = 0xdb; - values["ellipseprism"] = 0xdc; - values["text"] = 0xdd; - - values["nonzero"] = 0xde; - values["evenodd"] = 0xdf; - - values["circle"] = 0xe0; - values["box"] = 0xe1; - values["uptriangle"] = 0xe2; - values["dntriangle"] = 0xe3; - values["diamond"] = 0xe4; - values["cross"] = 0xe5; - values["star"] = 0xe6; - values["plus"] = 0xe7; - values["hline"] = 0xe8; - values["vline"] = 0xe9; - - values["solid"] = 0xea; - values["dotted"] = 0xeb; - values["dashed"] = 0xec; - values["dotdash"] = 0xed; - - values["none"] = 0xee; - values["start"] = 0xef; - values["end"] = 0xf0; - values["both"] = 0xf1; - - values["serif"] = 0xf2; - values["sansserif"] = 0xf3; - values["monotype"] = 0xf4; - values["symbol"] = 0xf5; - - values["plain"] = 0xf6; - values["bold"] = 0xf7; - values["italic"] = 0xf8; - - values["top"] = 0xf9; - values["baseline"] = 0xfa; - values["center"] = 0xfb; - values["bottom"] = 0xfc; - - values["left"] = 0xfd; - values["right"] = 0xfe; - - values["default"] = 0xff; - } - } - - BHepRepWriter::~BHepRepWriter() { - } - - void BHepRepWriter::close() { - } - - void BHepRepWriter::openDoc(std::string version, std::string /* encoding */, bool /* standalone */) { - stringValues.clear(); - - // header - writeByte(WBXML_VERSION); - writeMultiByteInt(UNKNOWN_PID); - writeMultiByteInt(UTF8); - - version = "BinaryHepRep/1.0"; - - // string table - writeMultiByteInt(version.length()+1); - - // BHepRep Header (as part of the string table) - writeString(version); - - } - - void BHepRepWriter::closeDoc(bool /* force */) { - writeByte(PI); - writeByte(attributes["eof"]); - writeByte(END); - } - - void BHepRepWriter::openTag(std::string name) { - writeTag(name, true); - } - - void BHepRepWriter::closeTag() { - writePoints(); - writeByte(END); - } - - void BHepRepWriter::printTag(std::string name) { - writeTag(name); - } - - void BHepRepWriter::writeTag(std::string tagName, bool hasContent) { - std::string s = tagName; - std::transform(s.begin(), s.end(), s.begin(), (int(*)(int)) tolower); - - // find tag - if (tags.count(s) <= 0) { - std::cerr << "Cannot find tag '" << s << "' in tags table." << std::endl; - return; - } - - // write tag - bool isPoint = (s == "point"); - bool hasAttributes = (stringAttributes.size() > 0) || (doubleAttributes.size() > (unsigned int)(isPoint ? 3 : 0)); - - if (!hasAttributes && isPoint) { - // store the point for the future - points.push_back(doubleAttributes["x"]); - points.push_back(doubleAttributes["y"]); - points.push_back(doubleAttributes["z"]); - return; - } - - writePoints(); - writeByte(tags[s] | ((hasContent || isPoint) ? CONTENT : 0x00) | (hasAttributes ? ATTRIBUTE : 0x00)); - - // write attributes - if (hasAttributes) { - // write string attributes - for (std::map::iterator i = stringAttributes.begin(); i != stringAttributes.end(); i++) { - std::string name = i->first; - std::string value = i->second; - - // write ATTRSTART - writeByte(attributes[name]); - std::string v = value; - std::transform(v.begin(), v.end(), v.begin(), (int(*)(int)) tolower); - if (values.count(v) > 0) { - // write ATTRVALUE - writeByte(values[v]); - } else { - if (stringValues.count(value) <= 0) { - // define this new string - writeStringDefine(value); - int index = stringValues.size(); - stringValues[value] = index; - } else { - // write string ref - writeByte(STR_R); - writeMultiByteInt(stringValues[value]); - } - } - } - stringAttributes.clear(); - - // write color attributes - for (std::map >::iterator i = colorAttributes.begin(); i != colorAttributes.end(); i++) { - std::string name = i->first; - std::vector value = i->second; - // write ATTRSTART - writeByte(attributes[name]); - // write OPAQUE - writeByte(OPAQUE); - writeMultiByteInt(value.size()); - writeByte((int)(value[0] * 0xff) & 0xff); - writeByte((int)(value[1] * 0xff) & 0xff); - writeByte((int)(value[2] * 0xff) & 0xff); - if (value.size() > 3) writeByte((int)(value[3] * 0xff) & 0xff); - } - colorAttributes.clear(); - - // write long attributes - for (std::map::iterator i = longAttributes.begin(); i != longAttributes.end(); i++) { - std::string name = i->first; - int64 value = i->second; - // write ATTRSTART - writeByte(attributes[name]); - // write OPAQUE - writeByte(OPAQUE); - writeMultiByteInt(8); - writeLong(value); - } - longAttributes.clear(); - - // write int attributes - for (std::map::iterator i = intAttributes.begin(); i != intAttributes.end(); i++) { - std::string name = i->first; - int value = i->second; - // write ATTRSTART - writeByte(attributes[name]); - // write OPAQUE - writeByte(OPAQUE); - writeMultiByteInt(4); - writeInt(value); - } - intAttributes.clear(); - - // write boolean attributes - for (std::map::iterator i = booleanAttributes.begin(); i != booleanAttributes.end(); i++) { - std::string name = i->first; - bool value = i->second; - // write ATTRSTART - writeByte(attributes[name]); - // write ATTRVALUE - writeByte(value ? values["true"] : values["false"]); - } - booleanAttributes.clear(); - - // write double attributes - for (std::map::iterator i = doubleAttributes.begin(); i != doubleAttributes.end(); i++) { - std::string name = i->first; - double value = i->second; - if (!isPoint && (name != "x") && (name != "y") && (name != "z")) { - // write ATTRSTART - writeByte(attributes[name]); - // write OPAQUE - writeByte(OPAQUE); - writeMultiByteInt(singlePrecision ? 4 : 8); - writeReal(value); - } - } - doubleAttributes.clear(); - - // end of attributes - writeByte(END); - } - - if (s == "point") { - writeByte(OPAQUE); - writeMultiByteInt(singlePrecision ? 12 : 24); - writeReal(doubleAttributes["x"]); - writeReal(doubleAttributes["y"]); - writeReal(doubleAttributes["z"]); - } - - if (isPoint && !hasContent) { - // end this tag - writeByte(END); - } - } - - void BHepRepWriter::writePoints() { - if (points.size() <= 0) return; - - writeByte(tags["point"] | CONTENT); - writeByte(OPAQUE); - writeMultiByteInt(points.size()*(singlePrecision ? 4 : 8)); - for (std::vector::iterator i = points.begin(); i != points.end(); ) { - writeReal(*i++); - writeReal(*i++); - writeReal(*i++); - } - writeByte(END); - - points.clear(); - } - - void BHepRepWriter::setAttribute(std::string name, char* value) { - setAttribute(name, (std::string)value); - } - - void BHepRepWriter::setAttribute(std::string name, std::string value) { - if (name == "value") name = name.append("String"); - - // make sure the attribute name is defined - if (attributes.count(name) <= 0) { - std::cerr << "Cannot find attribute name '" << name << "' in attributes table, skipped." << std::endl; - return; - } - - stringAttributes[name] = value; - } - - void BHepRepWriter::setAttribute(std::string name, std::vector value) { - if (name == "value") name = name.append("Color"); - - // make sure the attribute name is defined - if (attributes.count(name) <= 0) { - std::cerr << "Cannot find attribute name '" << name << "' in attributes table, skipped." << std::endl; - return; - } - - colorAttributes[name] = value; - } - - void BHepRepWriter::setAttribute(std::string name, int64 value) { - if (name == "value") name = name.append("Long"); - - // make sure the attribute name is defined - if (attributes.count(name) <= 0) { - std::cerr << "Cannot find attribute name '" << name << "' in attributes table, skipped." << std::endl; - return; - } - - longAttributes[name] = value; - } - - void BHepRepWriter::setAttribute(std::string name, int value) { - if (name == "value") name = name.append("Int"); - - // make sure the attribute name is defined - if (attributes.count(name) <= 0) { - std::cerr << "Cannot find attribute name '" << name << "' in attributes table, skipped." << std::endl; - return; - } - - intAttributes[name] = value; - } - - void BHepRepWriter::setAttribute(std::string name, bool value) { - if (name == "value") name = name.append("Boolean"); - - // make sure the attribute name is defined - if (attributes.count(name) <= 0) { - std::cerr << "Cannot find attribute name '" << name << "' in attributes table, skipped." << std::endl; - return; - } - - booleanAttributes[name] = value; - } - - void BHepRepWriter::setAttribute(std::string name, double value) { - if (name == "value") name = name.append("Double"); - - // make sure the attribute name is defined - if (attributes.count(name) <= 0) { - std::cerr << "Cannot find attribute name '" << name << "' in attributes table, skipped." << std::endl; - return; - } - - doubleAttributes[name] = value; - } - - void BHepRepWriter::writeStringDefine(std::string s) { - writeByte(STR_D); - writeString(s); - } - - void BHepRepWriter::writeMultiByteInt(unsigned int ui) { - unsigned char buf[5]; - int idx = 0; - - do { - buf[idx++] = (unsigned char) (ui & 0x7f); - ui = ui >> 7; - } - while (ui != 0); - - while (idx > 1) { - writeByte(buf[--idx] | 0x80); - } - writeByte(buf[0]); - } - - void BHepRepWriter::writeReal(double d) { - if (singlePrecision) { - union { - int i; - float f; - } u; - u.f = (float)d; - writeInt(u.i); - } else { - union { - int64 i; - double d; - } u; - u.d = d; - - writeLong(u.i); - } - } - - void BHepRepWriter::writeLong(int64 i) { - // write network-order - os.put((i >> 56) & 0xff); - os.put((i >> 48) & 0xff); - os.put((i >> 40) & 0xff); - os.put((i >> 32) & 0xff); - os.put((i >> 24) & 0xff); - os.put((i >> 16) & 0xff); - os.put((i >> 8) & 0xff); - os.put((i ) & 0xff); - } - - void BHepRepWriter::writeInt(int i) { - // write network-order - os.put((i >> 24) & 0xff); - os.put((i >> 16) & 0xff); - os.put((i >> 8) & 0xff); - os.put((i ) & 0xff); - } - - void BHepRepWriter::writeByte(unsigned char b) { - os.put((char)b); - } - - void BHepRepWriter::writeString(std::string s) { - os << s; - os.put(0); - } -} // cheprep diff --git a/source/visualization/HepRep/src/DefaultHepRep.cc b/source/visualization/HepRep/src/DefaultHepRep.cc deleted file mode 100644 index 334ead73f0..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRep.cc +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/DefaultHepRep.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRep::DefaultHepRep() { -} - -DefaultHepRep::~DefaultHepRep() { - for (vector::iterator i1 = typeTrees.begin(); i1 != typeTrees.end(); i1++) { - delete (*i1); - } - for (vector::iterator i2 = instanceTrees.begin(); i2 != instanceTrees.end(); i2++) { - delete (*i2); - } -} - -HepRep* DefaultHepRep::copy(HepRepSelectFilter*) { - cerr << "DefaultHepRep::copy(HepRepSelectFilter*) not implemented." << endl; - return NULL; -} - -vector DefaultHepRep::getLayerOrder() { - return layers; -} - -void DefaultHepRep::addLayer(string layer) { - layers.push_back(layer); -} - -void DefaultHepRep::addTypeTree(HepRepTypeTree* typeTree) { - // FIXME check if already exist - typeTrees.push_back(typeTree); -} - -void DefaultHepRep::removeTypeTree(HepRepTypeTree*) { - cerr << "DefaultHepRep::removeTypeTree(HepRepTypeTree*) not implemented." << endl; -} - -HepRepTypeTree* DefaultHepRep::getTypeTree(string, string) { - cerr << "DefaultHepRep::getTypeTree(string, string) not implemented." << endl; - return NULL; -} - -vector DefaultHepRep::getTypeTreeList() { - return typeTrees; -} - -void DefaultHepRep::addInstanceTree(HepRepInstanceTree* instanceTree) { - // FIXME check if already exist - instanceTrees.push_back(instanceTree); -} - -void DefaultHepRep::overlayInstanceTree(HepRepInstanceTree *) { - cerr << "DefaultHepRep::overlayInstanceTree(HepRepInstanceTree * instanceTree) not implemented." << endl; -} - -void DefaultHepRep::removeInstanceTree(HepRepInstanceTree*) { - cerr << "DefaultHepRep::removeInstanceTree(HepRepInstanceTree*) not implemented." << endl; -} - -HepRepInstanceTree* DefaultHepRep::getInstanceTreeTop(string, string) { - cerr << "DefaultHepRep::getInstanceTreeTop(string, string) not implemented." << endl; - return NULL; -} - -HepRepInstanceTree* DefaultHepRep::getInstances(string, string, - vector) { - cerr << "DefaultHepRep::getInstances(string, string, vector) not implemented." << endl; - return NULL; -} - -HepRepInstanceTree* DefaultHepRep::getInstancesAfterAction( - string, - string, - vector, - vector, - bool, - bool, - bool, - vector) { - cerr << "DefaultHepRep::getInstancesAfterAction(string, string, vector, vector, bool, bool, bool, vector) not implemented." << endl; - return NULL; -} - -string DefaultHepRep::checkForException() { - return NULL; -} - -vector DefaultHepRep::getInstanceTreeList() { - return instanceTrees; -} - -} // cheprep - diff --git a/source/visualization/HepRep/src/DefaultHepRepAction.cc b/source/visualization/HepRep/src/DefaultHepRepAction.cc deleted file mode 100644 index 3d14c2f935..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepAction.cc +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include - -#include "cheprep/DefaultHepRepAction.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepAction::DefaultHepRepAction(string aName, string anExpression) - : name(aName), expression(anExpression) { -} - -DefaultHepRepAction::~DefaultHepRepAction() { -} - -string DefaultHepRepAction::getName() { - return name; -} - -string DefaultHepRepAction::getExpression() { - return expression; -} - -HepRepAction* DefaultHepRepAction::copy() { - return new DefaultHepRepAction(name, expression); -} - -} // cheprep - diff --git a/source/visualization/HepRep/src/DefaultHepRepAttDef.cc b/source/visualization/HepRep/src/DefaultHepRepAttDef.cc deleted file mode 100644 index 04fcbef11f..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepAttDef.cc +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include -#include -#include -#include - -#include "cheprep/DefaultHepRepAttDef.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepAttDef::DefaultHepRepAttDef(string aName, string aDesc, string aCategory, string anExtra) - : name(aName), desc(aDesc), category(aCategory), extra(anExtra) { -} - -DefaultHepRepAttDef::~DefaultHepRepAttDef() { -} - -HepRepAttDef* DefaultHepRepAttDef::copy() { - return new DefaultHepRepAttDef(name, desc, category, extra); -} - -string DefaultHepRepAttDef::getName() { - return name; -} - -string DefaultHepRepAttDef::getLowerCaseName() { - string s = name; - transform(s.begin(), s.end(), s.begin(), (int(*)(int)) tolower); - return s; -} - -string DefaultHepRepAttDef::getDescription() { - return desc; -} - -string DefaultHepRepAttDef::getCategory() { - return category; -} - -string DefaultHepRepAttDef::getExtra() { - return extra; -} - -} // cheprep diff --git a/source/visualization/HepRep/src/DefaultHepRepAttValue.cc b/source/visualization/HepRep/src/DefaultHepRepAttValue.cc deleted file mode 100644 index be3a1f3406..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepAttValue.cc +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/config.h" - -#include -#include -#include -#include -#include -#include - -#include "HEPREP/HepRepConstants.h" - -#include "cheprep/DefaultHepRepAttValue.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -std::string DefaultHepRepAttValue::labelStrings[LABELSTRINGS_LEN]; - -DefaultHepRepAttValue::DefaultHepRepAttValue(string aName, string aValue, int aShowLabel) - : name(aName) - , type(HepRepConstants::TYPE_STRING) - , stringValue(aValue) - , longValue(0) - , doubleValue(0.) - , booleanValue(false) - , showLabelValue(aShowLabel) - { - init(); - } - -DefaultHepRepAttValue::DefaultHepRepAttValue(string aName, int64 aValue, int aShowLabel) - : name(aName) - , type(HepRepConstants::TYPE_LONG) - , longValue(aValue) - , doubleValue(0.) - , booleanValue(false) - , showLabelValue(aShowLabel) - { - init(); - } - -DefaultHepRepAttValue::DefaultHepRepAttValue(string aName, int aValue, int aShowLabel) - : name(aName) - , type(HepRepConstants::TYPE_INT) - , longValue(aValue) - , doubleValue(0.) - , booleanValue(false) - , showLabelValue(aShowLabel) - { - init(); - } - -DefaultHepRepAttValue::DefaultHepRepAttValue(string aName, double aValue, int aShowLabel) - : name(aName) - , type(HepRepConstants::TYPE_DOUBLE) - , longValue(0) - , doubleValue(aValue) - , booleanValue(false) - , showLabelValue(aShowLabel) - { - init(); - } - -DefaultHepRepAttValue::DefaultHepRepAttValue(string aName, bool aValue, int aShowLabel) - : name(aName) - , type(HepRepConstants::TYPE_BOOLEAN) - , longValue(0) - , doubleValue(0.) - , booleanValue(aValue) - , showLabelValue(aShowLabel) - { - init(); - } - -DefaultHepRepAttValue::DefaultHepRepAttValue(string aName, vector aValue, int aShowLabel) - : name(aName) - , type(HepRepConstants::TYPE_COLOR) - , longValue(0) - , doubleValue(0.) - , booleanValue(false) - , colorValue(aValue) - , showLabelValue(aShowLabel) - { - init(); - } - -DefaultHepRepAttValue::~DefaultHepRepAttValue() { -} - -void DefaultHepRepAttValue::init() { - labelStrings[0] = "NAME"; - labelStrings[1] = "DESC"; - labelStrings[2] = "VALUE"; - labelStrings[3] = "EXTRA"; -} - -HepRepAttValue* DefaultHepRepAttValue::copy() { - // Coverity issues warnings here. It looks to me (JA) that "return" is - // missing on severeal lines. - switch(type) { -// case HepRepConstants::TYPE_COLOR: new DefaultHepRepAttValue(name, colorValue, showLabelValue); -// case HepRepConstants::TYPE_STRING: new DefaultHepRepAttValue(name, stringValue, showLabelValue); -// case HepRepConstants::TYPE_LONG: new DefaultHepRepAttValue(name, longValue, showLabelValue); -// case HepRepConstants::TYPE_INT: new DefaultHepRepAttValue(name, (int)longValue, showLabelValue); -// case HepRepConstants::TYPE_DOUBLE: new DefaultHepRepAttValue(name, doubleValue, showLabelValue); -// case HepRepConstants::TYPE_BOOLEAN: new DefaultHepRepAttValue(name, booleanValue, showLabelValue); - case HepRepConstants::TYPE_COLOR: return new DefaultHepRepAttValue(name, colorValue, showLabelValue); - case HepRepConstants::TYPE_STRING: return new DefaultHepRepAttValue(name, stringValue, showLabelValue); - case HepRepConstants::TYPE_LONG: return new DefaultHepRepAttValue(name, longValue, showLabelValue); - case HepRepConstants::TYPE_INT: return new DefaultHepRepAttValue(name, (int)longValue, showLabelValue); - case HepRepConstants::TYPE_DOUBLE: return new DefaultHepRepAttValue(name, doubleValue, showLabelValue); - case HepRepConstants::TYPE_BOOLEAN: return new DefaultHepRepAttValue(name, booleanValue, showLabelValue); - default: return new DefaultHepRepAttValue(name, "Unknown type stored in HepRepAttDef", showLabelValue); - } -} - -string DefaultHepRepAttValue::getName() { - return name; -} - -string DefaultHepRepAttValue::getLowerCaseName() { - string s = name; - transform(s.begin(), s.end(), s.begin(), (int(*)(int)) tolower); - return s; -} - -int DefaultHepRepAttValue::getType() { - return type; -} - -string DefaultHepRepAttValue::getTypeName() { - switch(type) { - case HepRepConstants::TYPE_COLOR: return("Color"); - case HepRepConstants::TYPE_STRING: return("String"); - case HepRepConstants::TYPE_LONG: return("long"); - case HepRepConstants::TYPE_INT: return("int"); - case HepRepConstants::TYPE_DOUBLE: return("double"); - case HepRepConstants::TYPE_BOOLEAN: return("boolean"); - default: return "Unknown type stored in HepRepAttDef"; - } -} - -int DefaultHepRepAttValue::showLabel() { - return showLabelValue; -} - -string DefaultHepRepAttValue::getString() { - if (type != HepRepConstants::TYPE_STRING) cerr << "Trying to access AttValue '" << getName() << "' as 'string'" << endl; - return stringValue; -} - -string DefaultHepRepAttValue::getLowerCaseString() { - if (type != HepRepConstants::TYPE_STRING) cerr << "Trying to access AttValue '" << getName() << "' as 'string'" << endl; - string s = stringValue; - transform(s.begin(), s.end(), s.begin(), (int(*)(int)) tolower); - return s; -} - -int64 DefaultHepRepAttValue::getLong() { - if (type != HepRepConstants::TYPE_LONG) cerr << "Trying to access AttValue '" << getName() << "' as 'long'" << endl; - return longValue; -} - -int DefaultHepRepAttValue::getInteger() { - if (type != HepRepConstants::TYPE_INT) cerr << "Trying to access AttValue '" << getName() << "' as 'int'" << endl; - return (int64)longValue; -} - -double DefaultHepRepAttValue::getDouble() { - if (type != HepRepConstants::TYPE_DOUBLE) cerr << "Trying to access AttValue '" << getName() << "' as 'double'" << endl; - return doubleValue; -} - -bool DefaultHepRepAttValue::getBoolean() { - if (type != HepRepConstants::TYPE_BOOLEAN) cerr << "Trying to access AttValue '" << getName() << "' as 'boolean'" << endl; - return booleanValue; -} - -vector DefaultHepRepAttValue::getColor() { - if (type != HepRepConstants::TYPE_COLOR) cerr << "Trying to access AttValue '" << getName() << "' as 'color'" << endl; - return colorValue; -} - - -string DefaultHepRepAttValue::getAsString() { - switch(type) { - case HepRepConstants::TYPE_COLOR: return getAsString(getColor()); - case HepRepConstants::TYPE_STRING: return getString(); - case HepRepConstants::TYPE_LONG: return getAsString(getLong()); - case HepRepConstants::TYPE_INT: return getAsString(getInteger()); - case HepRepConstants::TYPE_DOUBLE: return getAsString(getDouble()); - case HepRepConstants::TYPE_BOOLEAN: return getAsString(getBoolean()); - default: return "Unknown typecode"; - } -} - -string DefaultHepRepAttValue::getAsString(vector c) { - char buffer[40]; - sprintf(buffer, "%4.2f, %4.2f, %4.2f, %4.2f", - c[0], - c[1], - c[2], - (c.size() > 3) ? c[3] : 1.0); - return buffer; -} - -string DefaultHepRepAttValue::getAsString(int i) { - char buffer[40]; - sprintf(buffer, "%d", i); - return buffer; -} - -string DefaultHepRepAttValue::getAsString(int64 i) { - char buffer[40]; - sprintf(buffer, CHEPREP_INT64_FORMAT, i); - return buffer; -} - -// NOTE: keep at %g rather than %lg for backward compatibility -string DefaultHepRepAttValue::getAsString(double d) { - char buffer[40]; - sprintf(buffer, "%g", d); - return buffer; -} - -string DefaultHepRepAttValue::getAsString(bool b) { - return b ? "true" : "false"; -} - - - - -string DefaultHepRepAttValue::toShowLabel() { - return toShowLabel(showLabel()); -} - - -string DefaultHepRepAttValue::toShowLabel(int showLabel) { - string label = ""; - bool first = true; - if (showLabel == HepRepConstants::SHOW_NONE) { - label = "NONE"; - } else { - for (int i=0; i<16; i++) { - if (((showLabel >> i) & 0x0001) == 0x0001) { - if (first) { - first = false; - } else { - label.append(", "); - } - if (i < LABELSTRINGS_LEN) { - label.append(labelStrings[i]); - } else { - char hex[20]; - sprintf(hex, "%0x", 1 << i); - label.append(hex); - } - } - } - } - return label; -} - -} // cheprep diff --git a/source/visualization/HepRep/src/DefaultHepRepAttribute.cc b/source/visualization/HepRep/src/DefaultHepRepAttribute.cc deleted file mode 100644 index 908ffce99b..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepAttribute.cc +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/config.h" - -#include -#include - -#include "cheprep/DefaultHepRepAttribute.h" -#include "cheprep/DefaultHepRepAttValue.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - -DefaultHepRepAttribute::DefaultHepRepAttribute() { -} - -DefaultHepRepAttribute::~DefaultHepRepAttribute() { - for (map::iterator i = attValues.begin(); i != attValues.end(); i++) { - delete (*i).second; - } -} - -set DefaultHepRepAttribute::getAttValuesFromNode() { - set attSet; - for (map::iterator i = attValues.begin(); i != attValues.end(); i++) { - if ((*i).first != "layer") attSet.insert((*i).second); - } - return attSet; -} - -void DefaultHepRepAttribute::addAttValue(HepRepAttValue* hepRepAttValue) { - string lowerCaseName = hepRepAttValue->getLowerCaseName(); - if (attValues[lowerCaseName] != NULL) delete attValues[lowerCaseName]; - attValues[lowerCaseName] = hepRepAttValue; -} - -void DefaultHepRepAttribute::addAttValue(string key, char *value, int showLabel) { - addAttValue(key, (std::string)value, showLabel); -} - -void DefaultHepRepAttribute::addAttValue(string key, string value, int showLabel) { - addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); -} - -void DefaultHepRepAttribute::addAttValue(string key, int64 value, int showLabel) { - addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); -} - -void DefaultHepRepAttribute::addAttValue(string key, int value, int showLabel) { - addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); -} - -void DefaultHepRepAttribute::addAttValue(string key, double value, int showLabel) { - addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); -} - -void DefaultHepRepAttribute::addAttValue(string key, bool value, int showLabel) { - addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); -} - -void DefaultHepRepAttribute::addAttValue(string key, vector value, int showLabel) { - addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); -} - -void DefaultHepRepAttribute::addAttValue(string key, double red, double green, double blue, double alpha, int showLabel) { - vector color; - color.push_back(red); - color.push_back(green); - color.push_back(blue); - color.push_back(alpha); - addAttValue(new DefaultHepRepAttValue(key, color, showLabel)); -} - -HepRepAttValue* DefaultHepRepAttribute::getAttValueFromNode(string name) { - string s = name; - transform(s.begin(), s.end(), s.begin(), (int(*)(int)) tolower); - return (attValues.count(s) > 0) ? attValues[s] : NULL; -} - -HepRepAttValue* DefaultHepRepAttribute::removeAttValue(string name) { - string s = name; - transform(s.begin(), s.end(), s.begin(), (int(*)(int)) tolower); - HepRepAttValue* attValue = attValues[s]; - attValues.erase(s); - return attValue; -} - - -} // cheprep diff --git a/source/visualization/HepRep/src/DefaultHepRepDefinition.cc b/source/visualization/HepRep/src/DefaultHepRepDefinition.cc deleted file mode 100644 index 8767a5c3cf..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepDefinition.cc +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/DefaultHepRepDefinition.h" -#include "cheprep/DefaultHepRepAttDef.h" - -#include -#include - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepDefinition::DefaultHepRepDefinition() - : DefaultHepRepAttribute() { -} - -DefaultHepRepDefinition::~DefaultHepRepDefinition() { - set list = getAttDefsFromNode(); - for (set::iterator i1 = list.begin(); i1 != list.end(); i1++) { - delete (*i1); - } -} - -set DefaultHepRepDefinition::getAttDefsFromNode() { - set attSet; - for (map::iterator i = attDefs.begin(); i != attDefs.end(); i++) { - attSet.insert((*i).second); - } - return attSet; -} - -void DefaultHepRepDefinition::addAttDef(HepRepAttDef* hepRepAttDef) { - string lowerCaseName = hepRepAttDef->getLowerCaseName(); - if (attDefs[lowerCaseName] != NULL) delete attDefs[lowerCaseName]; - attDefs[lowerCaseName] = hepRepAttDef; -} - -void DefaultHepRepDefinition::addAttDef(string name, string desc, string type, string extra) { - addAttDef(new DefaultHepRepAttDef(name, desc, type, extra)); -} - -HepRepAttDef* DefaultHepRepDefinition::getAttDefFromNode(string name) { - string s = name; - transform(s.begin(), s.end(), s.begin(), (int(*)(int)) tolower); - return (attDefs.count(s) > 0) ? attDefs[s] : NULL; -} - -} // cheprep diff --git a/source/visualization/HepRep/src/DefaultHepRepFactory.cc b/source/visualization/HepRep/src/DefaultHepRepFactory.cc deleted file mode 100644 index 09d8432f39..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepFactory.cc +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include -#include - -#include "cheprep/DefaultHepRepFactory.h" -#include "cheprep/DefaultHepRepPoint.h" -#include "cheprep/DefaultHepRepInstance.h" -#include "cheprep/DefaultHepRepInstanceTree.h" -#include "cheprep/DefaultHepRepType.h" -#include "cheprep/DefaultHepRepTypeTree.h" -#include "cheprep/DefaultHepRep.h" -#include "cheprep/DefaultHepRepAction.h" -#include "cheprep/DefaultHepRepTreeID.h" - -using namespace std; -using namespace HEPREP; - - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepFactory::DefaultHepRepFactory() { -} - -DefaultHepRepFactory::~DefaultHepRepFactory() { -} - -HepRepReader* DefaultHepRepFactory::createHepRepReader (istream*) { - cerr << "DefaultHepRepFactory::createHepRepReader not implemented" << endl; - return NULL; -} - -HepRepReader* DefaultHepRepFactory::createHepRepReader (std::string) { - cerr << "DefaultHepRepFactory::createHepRepReader not implemented" << endl; - return NULL; -} - -HepRepWriter* DefaultHepRepFactory::createHepRepWriter(ostream*, bool, bool) { - cerr << "DefaultHepRepFactory::createHepRepWriter not implemented" << endl; - return NULL; -} - -HepRepPoint* DefaultHepRepFactory::createHepRepPoint (HepRepInstance* instance, - double x, double y, double z) { - return new DefaultHepRepPoint(instance, x, y, z); -} - -HepRepInstance* DefaultHepRepFactory::createHepRepInstance (HepRepInstance* parent, HepRepType* type) { - return new DefaultHepRepInstance(parent, type); -} - -HepRepInstance* DefaultHepRepFactory::createHepRepInstance (HepRepInstanceTree* parent, HepRepType* type) { - return new DefaultHepRepInstance(parent, type); -} - -HepRepTreeID* DefaultHepRepFactory::createHepRepTreeID (string name, string version, string qualifier) { - return new DefaultHepRepTreeID(name, version, qualifier); -} - -HepRepAction* DefaultHepRepFactory::createHepRepAction (string name, string expression) { - return new DefaultHepRepAction(name, expression); -} - -HepRepInstanceTree* DefaultHepRepFactory::createHepRepInstanceTree (string name, string version, - HepRepTreeID* typeTreeID) { - return new DefaultHepRepInstanceTree(name, version, typeTreeID); -} - -HepRepType* DefaultHepRepFactory::createHepRepType (HepRepType* parent, string name) { - return new DefaultHepRepType(parent, name); -} - -HepRepType* DefaultHepRepFactory::createHepRepType (HepRepTypeTree* parent, string name) { - return new DefaultHepRepType(parent, name); -} - -HepRepTypeTree* DefaultHepRepFactory::createHepRepTypeTree (HepRepTreeID* treeID) { - return new DefaultHepRepTypeTree(treeID); -} - -HepRep* DefaultHepRepFactory::createHepRep () { - return new DefaultHepRep(); -} - -} // cheprep - diff --git a/source/visualization/HepRep/src/DefaultHepRepInstance.cc b/source/visualization/HepRep/src/DefaultHepRepInstance.cc deleted file mode 100644 index a0b78af45d..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepInstance.cc +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include - -#include "cheprep/DefaultHepRepInstance.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepInstance::DefaultHepRepInstance(HepRepInstance* instance, HepRepType* heprepType) - : DefaultHepRepAttribute(), parent(instance), type(heprepType) { - - if (type == NULL) cerr << "HepRepInstance cannot be created without a HepRepType." << endl; - parent->addInstance(this); -} - -DefaultHepRepInstance::DefaultHepRepInstance(HepRepInstanceTree* instanceTree, HepRepType* heprepType) - : DefaultHepRepAttribute(), parent(NULL), type(heprepType) { - - if (type == NULL) cerr << "HepRepInstance cannot be created without a HepRepType." << endl; - instanceTree->addInstance(this); -} - -DefaultHepRepInstance::~DefaultHepRepInstance() { - parent = NULL; - type = NULL; - for (vector::iterator i1 = instances.begin(); i1 != instances.end(); i1++) { - delete (*i1); - } - for (vector::iterator i2 = points.begin(); i2 != points.end(); i2++) { - delete (*i2); - } -} - -void DefaultHepRepInstance::overlay(HepRepInstance *) { - cerr << "DefaultHepRepInstance::overlay(HepRepInstance * instance) not implemented." << endl; -} - -HepRepInstance* DefaultHepRepInstance::copy(HepRepTypeTree*, HepRepInstance*, HepRepSelectFilter*) { - cerr << "DefaultHepRepInstance::copy(HepRepTypeTree*, HepRepInstance*, HepRepSelectFilter*) not implemented." << endl; - return NULL; -} - -HepRepInstance* DefaultHepRepInstance::copy(HepRepTypeTree*, HepRepInstanceTree*, HepRepSelectFilter*) { - cerr << "DefaultHepRepInstance::copy(HepRepTypeTree*, HepRepInstanceTree*, HepRepSelectFilter*) not implemented." << endl; - return NULL; -} - -HepRepType* DefaultHepRepInstance::getType() { - return type; -} - -void DefaultHepRepInstance::addPoint(HepRepPoint* point) { - points.push_back(point); -} - -vector DefaultHepRepInstance::getPoints() { - return points; -} - -HepRepInstance* DefaultHepRepInstance::getSuperInstance() { - return parent; -} - -void DefaultHepRepInstance::addInstance(HepRepInstance* instance) { - instances.push_back(instance); -} - -void DefaultHepRepInstance::removeInstance(HepRepInstance*) { - cerr << "DefaultHepRepInstance::removeInstance(HepRepInstance*) not implemented." << endl; -} - -vector DefaultHepRepInstance::getInstances() { - return instances; -} - -HepRepAttValue* DefaultHepRepInstance::getAttValue(string name) { - HepRepAttValue* value = getAttValueFromNode(name); - return (value != NULL) ? value : type->getAttValue(name); -} - -} // cheprep diff --git a/source/visualization/HepRep/src/DefaultHepRepInstanceTree.cc b/source/visualization/HepRep/src/DefaultHepRepInstanceTree.cc deleted file mode 100644 index a4cbcf2166..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepInstanceTree.cc +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/DefaultHepRepInstanceTree.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepInstanceTree::DefaultHepRepInstanceTree(string aName, string aVersion, HepRepTreeID* aTypeTree) - : DefaultHepRepTreeID(aName, aVersion), typeTree(aTypeTree) { -} - -DefaultHepRepInstanceTree::~DefaultHepRepInstanceTree() { - for (vector::iterator i1 = instances.begin(); i1 != instances.end(); i1++) { - delete (*i1); - } - instances.clear(); -} - -void DefaultHepRepInstanceTree::overlay(HepRepInstanceTree *) { - cerr << "DefaultHepRepInstanceTree::overlay(HepRepInstanceTree * instanceTree) not implemented." << endl; -} - -HepRepInstanceTree* DefaultHepRepInstanceTree::copy(HepRepTypeTree*, HepRepSelectFilter*) { - cerr << "DefaultHepRepInstanceTree::copy(HepRepTypeTree*, HepRepSelectFilter*) not implemented." << endl; - return NULL; -} - -void DefaultHepRepInstanceTree::addInstance(HepRepInstance* instance) { - instances.push_back(instance); -} - -void DefaultHepRepInstanceTree::removeInstance(HepRepInstance*) { - cerr << "DefaultHepRepInstanceTree::removeInstance(HepRepInstance*) not implemented." << endl; -} - -vector DefaultHepRepInstanceTree::getInstances() { - return instances; -} - -void DefaultHepRepInstanceTree::addInstanceTree(HepRepTreeID* treeID) { - instanceTrees.push_back(treeID); -} - -HepRepTreeID* DefaultHepRepInstanceTree::getTypeTree() { - return typeTree; -} - -vector DefaultHepRepInstanceTree::getInstanceTreeList() { - return instanceTrees; -} - -} // cheprep - diff --git a/source/visualization/HepRep/src/DefaultHepRepPoint.cc b/source/visualization/HepRep/src/DefaultHepRepPoint.cc deleted file mode 100644 index fbac21d63a..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepPoint.cc +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include -#include -#include - -#include "cheprep/DefaultHepRepPoint.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepPoint::DefaultHepRepPoint(HepRepInstance* inst, double xx, double yy, double zz) - : DefaultHepRepAttribute(), instance(inst), x(xx), y(yy), z(zz) { - - if (instance == NULL) { - cerr << "HepRepPoints cannot be created without a HepRepInstance." << endl; - } else { - instance->addPoint(this); - } -} - -DefaultHepRepPoint::~DefaultHepRepPoint() { -} - -HepRepInstance* DefaultHepRepPoint::getInstance() { - return instance; -} - -HepRepAttValue* DefaultHepRepPoint::getAttValue(string lowerCaseName) { - HepRepAttValue* value = getAttValueFromNode(lowerCaseName); - return (value != NULL) ? value : instance->getAttValue(lowerCaseName); -} - -HepRepPoint* DefaultHepRepPoint::copy(HepRepInstance* inst) { - return new DefaultHepRepPoint(inst, x, y, z); -} - -double DefaultHepRepPoint::getX() { - return x; -} - -double DefaultHepRepPoint::getY() { - return y; -} - -double DefaultHepRepPoint::getZ() { - return z; -} - -vector* DefaultHepRepPoint::getXYZ(vector* xyz) { - (*xyz)[0] = x; - (*xyz)[1] = y; - (*xyz)[2] = z; - return xyz; -} - -double DefaultHepRepPoint::getRho() { - return sqrt(x*x + y*y); -} - -double DefaultHepRepPoint::getPhi() { - return atan2(y, x); -} - -double DefaultHepRepPoint::getTheta() { - return atan2(getRho(), z); -} - -double DefaultHepRepPoint::getR() { - double r = getRho(); - return sqrt(r*r + z*z); -} - -double DefaultHepRepPoint::getEta() { - double ct = cos(getTheta()); - return -0.5*log((1.-ct)/(1.+ct)); -} - -double DefaultHepRepPoint::getX(double xVertex, double, double) { - return x - xVertex; -} - -double DefaultHepRepPoint::getY(double, double yVertex, double) { - return y - yVertex; -} - -double DefaultHepRepPoint::getZ(double, double, double zVertex) { - return z - zVertex; -} - -double DefaultHepRepPoint::getRho(double xVertex, double yVertex, double zVertex) { - double dx = getX(xVertex, yVertex, zVertex); - double dy = getY(xVertex, yVertex, zVertex); - return sqrt(dx*dx + dy*dy); -} - -double DefaultHepRepPoint::getPhi(double xVertex, double yVertex, double zVertex) { - return atan2(getY(xVertex, yVertex, zVertex), getX(xVertex, yVertex, zVertex)); -} - -double DefaultHepRepPoint::getTheta(double xVertex, double yVertex, double zVertex) { - return atan2(getRho(xVertex, yVertex, zVertex), getZ(xVertex, yVertex, zVertex)); -} - -double DefaultHepRepPoint::getR(double xVertex, double yVertex, double zVertex) { - double dr = getRho(xVertex, yVertex, zVertex); - double dz = getZ(xVertex, yVertex, zVertex); - return sqrt(dr*dr + dz*dz); -} - -double DefaultHepRepPoint::getEta(double xVertex, double yVertex, double zVertex) { - double ct = cos(getTheta(xVertex, yVertex, zVertex)); - return -0.5*log((1.-ct)/(1.+ct)); -} - - -} // cheprep - diff --git a/source/visualization/HepRep/src/DefaultHepRepTreeID.cc b/source/visualization/HepRep/src/DefaultHepRepTreeID.cc deleted file mode 100644 index 3d375b4abc..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepTreeID.cc +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include - -#include "cheprep/DefaultHepRepTreeID.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepTreeID::DefaultHepRepTreeID(string aName, string aVersion, string aQualifier) - : name(aName), version(aVersion), qualifier(aQualifier) { -} - -DefaultHepRepTreeID::~DefaultHepRepTreeID() { -} - -string DefaultHepRepTreeID::getQualifier() { - return qualifier; -} - -void DefaultHepRepTreeID::setQualifier(string qual) { - this->qualifier = qual; -} - -string DefaultHepRepTreeID::getName() { - return name; -} - -string DefaultHepRepTreeID::getVersion() { - return version; -} - -} // cheprep diff --git a/source/visualization/HepRep/src/DefaultHepRepType.cc b/source/visualization/HepRep/src/DefaultHepRepType.cc deleted file mode 100644 index 5bbd9aa6c0..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepType.cc +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/DefaultHepRepType.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepType::DefaultHepRepType(HepRepType* parentType, string typeName) - : DefaultHepRepDefinition(), parent(parentType), name(typeName) { - this->description = "No Description"; - this->infoURL = "No Info URL"; - - // HepRepTypes are sometimes used without a parent (top-level) - if (parent != NULL) { - parent->addType(this); - } -} - -DefaultHepRepType::DefaultHepRepType(HepRepTypeTree* parentTypeTree, string typeName) - : DefaultHepRepDefinition(), parent(NULL), name(typeName) { - this->description = "No Description"; - this->infoURL = "No Info URL"; - - parentTypeTree->addType(this); -} - -DefaultHepRepType::~DefaultHepRepType() { - for (vector::iterator i1 = types.begin(); i1 != types.end(); i1++) { - delete (*i1); - } -} - -HepRepType* DefaultHepRepType::getSuperType() { - return parent; -} - -HepRepAttDef* DefaultHepRepType::getAttDef(string defName) { - HepRepAttDef* def = NULL; - HepRepType* type = this; - while ((def == NULL) && (type != NULL)) { - def = type->getAttDefFromNode(defName); - type = type->getSuperType(); - } - if (def == NULL) { - cerr << "ERROR: No HepRepDefaults, trying to get definition for: " << defName << endl; - // FIXME, no HepRepDefaults - } - return def; -} - -/** - * searched for a value with given name. Search up the type tree if needed. - */ -HepRepAttValue* DefaultHepRepType::getAttValue(string attName) { - HepRepAttValue* value = NULL; - HepRepType* type = this; - while ((value == NULL) && (type != NULL)) { - value = type->getAttValueFromNode(attName); - type = type->getSuperType(); - } - if (value == NULL) { - cerr << "ERROR: No HepRepDefaults, trying to get value for: " << attName << endl; - // FIXME, no HepRepDefaults - } - return value; -} - -HepRepType* DefaultHepRepType::copy(HepRepType*) { - cerr << "DefaultHepRepType::copy(HepRepType*) not implemented." << endl; - return NULL; -} - -string DefaultHepRepType::getName() { - return name; -} - -string DefaultHepRepType::getFullName() { - return (getSuperType() == NULL) ? getName() : getSuperType()->getFullName() + "/" + getName(); -} - -string DefaultHepRepType::getDescription() { - return description; -} - -void DefaultHepRepType::setDescription(string desc) { - this->description = desc; -} - -string DefaultHepRepType::getInfoURL() { - return infoURL; -} - -void DefaultHepRepType::setInfoURL(string info) { - this->infoURL = info; -} - -void DefaultHepRepType::addType(HepRepType* type) { - // FIXME should check if type already exists - types.push_back(type); -} - -vector DefaultHepRepType::getTypeList() { - return types; -} - - -} // cheprep diff --git a/source/visualization/HepRep/src/DefaultHepRepTypeTree.cc b/source/visualization/HepRep/src/DefaultHepRepTypeTree.cc deleted file mode 100644 index 0a17204bec..0000000000 --- a/source/visualization/HepRep/src/DefaultHepRepTypeTree.cc +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include - -#include "cheprep/DefaultHepRepTypeTree.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -DefaultHepRepTypeTree::DefaultHepRepTypeTree(HepRepTreeID* typeTree) - : DefaultHepRepTreeID(typeTree->getName(), typeTree->getVersion()) { - delete typeTree; -} - -DefaultHepRepTypeTree::~DefaultHepRepTypeTree() { - for (vector::iterator i1 = types.begin(); i1 != types.end(); i1++) { - delete (*i1); - } -} - -HepRepTypeTree* DefaultHepRepTypeTree::copy() { - cerr << "DefaultHepRepTypeTree::copy() not implemented." << endl; - return NULL; -} - -void DefaultHepRepTypeTree::addType(HepRepType* type) { - // FIXME should check if type already exists - types.push_back(type); -} - -vector DefaultHepRepTypeTree::getTypeList() { - return types; -} - -HepRepType* DefaultHepRepTypeTree::getType(string /*typeName*/) { - cerr << "DefaultHepRepTypeTree::getType(string) not implemented." << endl; - return NULL; -} - -} // cheprep diff --git a/source/visualization/HepRep/src/DeflateOutputStreamBuffer.cc b/source/visualization/HepRep/src/DeflateOutputStreamBuffer.cc deleted file mode 100644 index 2fe0c2f7bb..0000000000 --- a/source/visualization/HepRep/src/DeflateOutputStreamBuffer.cc +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/DeflateOutputStreamBuffer.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - using namespace std; - - unsigned long DeflateOutputStreamBuffer::crctable[] = { - 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL, - 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L, - 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L, - 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L, - 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL, - 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L, - 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL, - 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L, - 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L, - 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL, - 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L, - 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L, - 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L, - 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL, - 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L, - 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL, - 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL, - 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L, - 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L, - 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L, - 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL, - 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L, - 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL, - 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L, - 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L, - 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL, - 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L, - 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L, - 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L, - 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL, - 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L, - 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL, - 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL, - 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L, - 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L, - 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L, - 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL, - 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L, - 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL, - 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L, - 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L, - 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL, - 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L, - 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L, - 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L, - 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL, - 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L, - 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL, - 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL, - 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L, - 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L, - 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L, - 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL, - 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L, - 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL, - 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L, - 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L, - 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL, - 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L, - 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L, - 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L, - 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL, - 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L, - 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL - }; - - DeflateOutputStreamBuffer::DeflateOutputStreamBuffer(streambuf *aBuffer) - : buffer(aBuffer) - , crc(0) - , size(0) -#ifndef CHEPREP_NO_ZLIB - , zStreamOpen(false) - , in(inSize) - , out(outSize) -#endif // CHEPREP_NO_ZLIB - { - -#ifndef CHEPREP_NO_ZLIB - zStream.zalloc = Z_NULL; - zStream.zfree = Z_NULL; - zStream.opaque = Z_NULL; - zStream.msg = 0; - zStream.next_in = 0; - zStream.next_out = 0; - zStream.state = 0; -#endif // CHEPREP_NO_ZLIB - } - -#ifndef CHEPREP_NO_ZLIB - void DeflateOutputStreamBuffer::init(bool compress) { - - if (compress) { - if (zStreamOpen) return; - - zStream.next_in = reinterpret_cast(&(in[0])); - zStream.avail_in = 0 ; - - zStream.next_out = reinterpret_cast(&(out[0])); - zStream.avail_out = out.size(); - - if (deflateInit2(&zStream, 6, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY ) != Z_OK) { - cerr << "ERROR: deflateInit2 failed" << endl; - } else { - zStreamOpen = true; - setp(&(in[0]), &(in[0])+inSize); - } - } -#else - void DeflateOutputStreamBuffer::init(bool /*compress*/) { -#endif // CHEPREP_NO_ZLIB - - crc = 0; - size = 0; - } - - void DeflateOutputStreamBuffer::finish() { - -#ifndef CHEPREP_NO_ZLIB - if (zStreamOpen) { - - overflow() ; - - zStream.next_out = reinterpret_cast(&(out[0])); - zStream.avail_out = outSize; - - int err = Z_OK ; - while ( err == Z_OK ) { - if (zStream.avail_out == 0) { - flushOut(); - } - err = deflate(&zStream, Z_FINISH); - } - - flushOut() ; - - if (err != Z_STREAM_END) { - cerr << "ERROR: deflation failed" << endl; - } - - if (deflateEnd(&zStream) != Z_OK) { - cerr << "ERROR: deflateEnd failed" << endl; - } - - zStreamOpen = false ; - } -#endif // CHEPREP_NO_ZLIB - } - - DeflateOutputStreamBuffer::~DeflateOutputStreamBuffer() { - } - - -#ifndef CHEPREP_NO_ZLIB - #define DO1 crc = crctable[(crc ^ (*buf++)) & 0xff] ^ (crc >> 8) - #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 -#endif // CHEPREP_NO_ZLIB - - - int DeflateOutputStreamBuffer::overflow(int c) { - -#ifndef CHEPREP_NO_ZLIB - if (zStreamOpen) { - zStream.avail_in = pptr() - pbase() ; - zStream.next_in = reinterpret_cast(&(in[0])); - - int len = zStream.avail_in; - unsigned char* buf = zStream.next_in; - - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - crc = crc ^ 0xffffffffUL; - - size += zStream.avail_in; - - zStream.next_out = reinterpret_cast(&(out[0])); - zStream.avail_out = outSize ; - - int err = Z_OK ; - while ((zStream.avail_in > 0 || zStream.avail_out == 0) && err == Z_OK) { - if (zStream.avail_out == 0 ) { - flushOut(); - } - err = deflate(&zStream, Z_NO_FLUSH); - } - - flushOut(); - - setp(&(in[0]), &(in[0]) + inSize); - - if ((err != Z_OK) && (err != Z_STREAM_END)) { - cerr << "ERROR: deflation failed" << endl; - return EOF ; - } - - if ( c != EOF ) { - *pptr() = c ; - pbump(1); - } - - return 0 ; - } else { -#endif // CHEPREP_NO_ZLIB - crc = crc ^ 0xffffffffUL; - crc = crctable[(crc ^ c) & 0xff] ^ (crc >> 8); - crc = crc ^ 0xffffffffUL; - size++; - return buffer->sputc((char)c); -#ifndef CHEPREP_NO_ZLIB - } -#endif // CHEPREP_NO_ZLIB - } - - -#ifndef CHEPREP_NO_ZLIB - bool DeflateOutputStreamBuffer::flushOut() { - int deflatedCount = outSize - zStream.avail_out; - int byteCount = buffer->sputn(&(out[0]), deflatedCount); - - zStream.next_out = reinterpret_cast(&(out[0])); - zStream.avail_out = outSize ; - - return deflatedCount == byteCount ; - } -#endif // CHEPREP_NO_ZLIB - -} // cheprep diff --git a/source/visualization/HepRep/src/G4HepRep.cc b/source/visualization/HepRep/src/G4HepRep.cc deleted file mode 100644 index b7303fdd80..0000000000 --- a/source/visualization/HepRep/src/G4HepRep.cc +++ /dev/null @@ -1,87 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// - -/** - * We allow only one HepRep Scene handler and one attached Viewer. - * The sceneHandler associates with the output file - * - * @author Mark Donszelmann - */ - -//G4 -#include "G4Types.hh" -#include "G4HepRepViewer.hh" -#include "G4HepRepSceneHandler.hh" -#include "G4HepRepMessenger.hh" - -//This -#include "G4HepRep.hh" - -using namespace HEPREP; -using namespace std; - -G4HepRep::G4HepRep () - : G4VGraphicsSystem ("G4HepRep", - "HepRepXML", - "HepRep Generic Driver for XML, RMI and CORBA", - G4VGraphicsSystem::fileWriter), - sceneHandler(NULL), - viewer(NULL) { - G4HepRepMessenger::GetInstance(); -} - -G4HepRep::~G4HepRep () { -} - -G4VSceneHandler* G4HepRep::CreateSceneHandler (const G4String& name) { - if (sceneHandler != NULL) { - cout << "G4HepRep::CreateSceneHandler: Cannot create more than one G4HepRepSceneHandler" << endl; - return NULL; - } - sceneHandler = new G4HepRepSceneHandler (*this, name); - return sceneHandler; -} - -G4VViewer* G4HepRep::CreateViewer (G4VSceneHandler& scene, const G4String& name) { - if (viewer != NULL) { - cout << "G4HepRep::CreateViewer: Cannot create more than one G4HepRepViewer" << endl; - return NULL; - } - viewer = new G4HepRepViewer ((G4HepRepSceneHandler&)scene, name); - return viewer; -} - -void G4HepRep::removeSceneHandler() { - // actual deletion is done in VisManager - sceneHandler = NULL; -} - -void G4HepRep::removeViewer() { - // actual deletion is done in VisManager - viewer = NULL; -} - diff --git a/source/visualization/HepRep/src/G4HepRepFile.cc b/source/visualization/HepRep/src/G4HepRepFile.cc index 50de9ae6b7..b282e11168 100644 --- a/source/visualization/HepRep/src/G4HepRepFile.cc +++ b/source/visualization/HepRep/src/G4HepRepFile.cc @@ -24,12 +24,12 @@ // ******************************************************************** // // -// +// // Joseph Perl 1 October 2001 // A graphics system to dump geometry hierarchy to the // HepRep graphics format (HepRep version 1). -//HepRep +// HepRep #include "G4HepRepFileXMLWriter.hh" #include "G4HepRepFile.hh" @@ -39,48 +39,50 @@ static G4HepRepFileXMLWriter* hepRepXMLWriter; -G4HepRepFile::G4HepRepFile(): - G4VGraphicsSystem("G4HepRepFile", - "HepRepFile", - "A HepRep (format 1) ascii file driver", - G4VGraphicsSystem::fileWriter) { - G4HepRepMessenger::GetInstance(); - hepRepXMLWriter = new G4HepRepFileXMLWriter(); -} - -G4HepRepFile::~G4HepRepFile() +G4HepRepFile::G4HepRepFile() + : G4VGraphicsSystem("G4HepRepFile", "HepRepFile", + "A HepRep (format 1) ascii file driver", + G4VGraphicsSystem::fileWriter) { - delete hepRepXMLWriter; + G4HepRepMessenger::GetInstance(); + hepRepXMLWriter = new G4HepRepFileXMLWriter(); } -G4VSceneHandler* G4HepRepFile::CreateSceneHandler(const G4String& name) { +G4HepRepFile::~G4HepRepFile() { delete hepRepXMLWriter; } + +G4VSceneHandler* G4HepRepFile::CreateSceneHandler(const G4String& name) +{ G4VSceneHandler* pScene = new G4HepRepFileSceneHandler(*this, name); return pScene; } G4VViewer* G4HepRepFile::CreateViewer(G4VSceneHandler& scene, - const G4String& name) { + const G4String& name) +{ G4VViewer* pView = new G4HepRepFileViewer((G4HepRepFileSceneHandler&) scene, name); - if (pView) { - if (pView->GetViewId() < 0) { - G4cout << - "G4HepRepFile::CreateViewer: ERROR flagged by negative" - " view id in G4HepRepFileViewer creation." - "\n Destroying view and returning null pointer." - << G4endl; + if(pView) + { + if(pView->GetViewId() < 0) + { + G4cout << "G4HepRepFile::CreateViewer: ERROR flagged by negative" + " view id in G4HepRepFileViewer creation." + "\n Destroying view and returning null pointer." + << G4endl; delete pView; pView = 0; } } - else { - G4cout << - "G4HepRepFile::CreateViewer: ERROR: null pointer on new G4HepRepFileViewer." - << G4endl; + else + { + G4cout << "G4HepRepFile::CreateViewer: ERROR: null pointer on new " + "G4HepRepFileViewer." + << G4endl; } return pView; } -G4HepRepFileXMLWriter* G4HepRepFile::GetHepRepXMLWriter () { - return hepRepXMLWriter; +G4HepRepFileXMLWriter* G4HepRepFile::GetHepRepXMLWriter() +{ + return hepRepXMLWriter; } diff --git a/source/visualization/HepRep/src/G4HepRepFileSceneHandler.cc b/source/visualization/HepRep/src/G4HepRepFileSceneHandler.cc index 7f98c8d617..b6e47cd0e7 100644 --- a/source/visualization/HepRep/src/G4HepRepFileSceneHandler.cc +++ b/source/visualization/HepRep/src/G4HepRepFileSceneHandler.cc @@ -60,1541 +60,1665 @@ #include "G4VisTrajContext.hh" #include "G4VTrajectoryModel.hh" -//HepRep +// HepRep #include "G4HepRepFileXMLWriter.hh" G4int G4HepRepFileSceneHandler::fSceneIdCount = 0; // Counter for HepRep scene handlers. G4HepRepFileSceneHandler::G4HepRepFileSceneHandler(G4VGraphicsSystem& system, - const G4String& name): -G4VSceneHandler(system, fSceneIdCount++, name) + const G4String& name) + : G4VSceneHandler(system, fSceneIdCount++, name) { - hepRepXMLWriter = ((G4HepRepFile*)(&system))->GetHepRepXMLWriter(); - fileCounter = 0; - - inPrimitives2D = false; - warnedAbout3DText = false; - warnedAbout2DMarkers = false; - haveVisible = false; - drawingTraj = false; - doneInitTraj = false; - drawingHit = false; - doneInitHit = false; - trajContext = 0; - trajAttValues = 0; - trajAttDefs = 0; - hitAttValues = 0; - hitAttDefs = 0; -} + hepRepXMLWriter = ((G4HepRepFile*) (&system))->GetHepRepXMLWriter(); + fileCounter = 0; + inPrimitives2D = false; + warnedAbout3DText = false; + warnedAbout2DMarkers = false; + haveVisible = false; + drawingTraj = false; + doneInitTraj = false; + drawingHit = false; + doneInitHit = false; + trajContext = 0; + trajAttValues = 0; + trajAttDefs = 0; + hitAttValues = 0; + hitAttDefs = 0; +} G4HepRepFileSceneHandler::~G4HepRepFileSceneHandler() {} +void G4HepRepFileSceneHandler::BeginModeling() +{ + G4VisManager* visManager = G4VisManager::GetInstance(); + const G4VTrajectoryModel* model = visManager->CurrentTrajDrawModel(); + trajContext = &model->GetContext(); -void G4HepRepFileSceneHandler::BeginModeling() { - G4VisManager* visManager = G4VisManager::GetInstance(); - const G4VTrajectoryModel* model = visManager->CurrentTrajDrawModel(); - trajContext = & model->GetContext(); - - G4VSceneHandler::BeginModeling(); // Required: see G4VSceneHandler.hh. + G4VSceneHandler::BeginModeling(); // Required: see G4VSceneHandler.hh. } - -void G4HepRepFileSceneHandler::EndModeling() { - G4VSceneHandler::EndModeling(); // Required: see G4VSceneHandler.hh. +void G4HepRepFileSceneHandler::EndModeling() +{ + G4VSceneHandler::EndModeling(); // Required: see G4VSceneHandler.hh. } -void G4HepRepFileSceneHandler::BeginPrimitives2D -(const G4Transform3D& objectTransformation) { +void G4HepRepFileSceneHandler::BeginPrimitives2D( + const G4Transform3D& objectTransformation) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileSceneHandler::BeginPrimitives2D() " << G4endl; + G4cout << "G4HepRepFileSceneHandler::BeginPrimitives2D() " << G4endl; #endif - inPrimitives2D = true; - G4VSceneHandler::BeginPrimitives2D(objectTransformation); + inPrimitives2D = true; + G4VSceneHandler::BeginPrimitives2D(objectTransformation); } -void G4HepRepFileSceneHandler::EndPrimitives2D () { +void G4HepRepFileSceneHandler::EndPrimitives2D() +{ #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileSceneHandler::EndPrimitives2D() " << G4endl; + G4cout << "G4HepRepFileSceneHandler::EndPrimitives2D() " << G4endl; #endif - G4VSceneHandler::EndPrimitives2D(); - inPrimitives2D = false; + G4VSceneHandler::EndPrimitives2D(); + inPrimitives2D = false; } - #ifdef G4HEPREPFILEDEBUG -void G4HepRepFileSceneHandler::PrintThings() { - G4cout << - " with transformation " - << fObjectTransformation; - G4PhysicalVolumeModel* pPVModel = - dynamic_cast(fpModel); - if (pPVModel) { - G4VPhysicalVolume* pCurrentPV = pPVModel->GetCurrentPV(); - G4LogicalVolume* pCurrentLV = pPVModel->GetCurrentLV(); - G4int currentDepth = pPVModel->GetCurrentDepth(); - G4cout << - "\n current physical volume: " - << pCurrentPV->GetName() << - "\n current logical volume: " - << pCurrentLV->GetName() << - "\n current depth of geometry tree: " - << currentDepth; - } - G4cout << G4endl; +void G4HepRepFileSceneHandler::PrintThings() +{ + G4cout << " with transformation " << fObjectTransformation; + G4PhysicalVolumeModel* pPVModel = + dynamic_cast(fpModel); + if(pPVModel) + { + G4VPhysicalVolume* pCurrentPV = pPVModel->GetCurrentPV(); + G4LogicalVolume* pCurrentLV = pPVModel->GetCurrentLV(); + G4int currentDepth = pPVModel->GetCurrentDepth(); + G4cout << "\n current physical volume: " << pCurrentPV->GetName() + << "\n current logical volume: " << pCurrentLV->GetName() + << "\n current depth of geometry tree: " << currentDepth; + } + G4cout << G4endl; } #endif - -void G4HepRepFileSceneHandler::AddSolid(const G4Box& box) { +void G4HepRepFileSceneHandler::AddSolid(const G4Box& box) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Box& box) called for " - << box.GetName() - << G4endl; - PrintThings(); + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Box& box) called for " + << box.GetName() << G4endl; + PrintThings(); #endif - - if (drawingTraj) - return; - - if (drawingHit) - InitHit(); - - haveVisible = false; - AddHepRepInstance("Prism", NULL); - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - // Get and check applicable vis attributes. - fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - hepRepXMLWriter->addPrimitive(); - - G4double dx = box.GetXHalfLength(); - G4double dy = box.GetYHalfLength(); - G4double dz = box.GetZHalfLength(); - - G4Point3D vertex1(G4Point3D( dx, dy,-dz)); - G4Point3D vertex2(G4Point3D( dx,-dy,-dz)); - G4Point3D vertex3(G4Point3D(-dx,-dy,-dz)); - G4Point3D vertex4(G4Point3D(-dx, dy,-dz)); - G4Point3D vertex5(G4Point3D( dx, dy, dz)); - G4Point3D vertex6(G4Point3D( dx,-dy, dz)); - G4Point3D vertex7(G4Point3D(-dx,-dy, dz)); - G4Point3D vertex8(G4Point3D(-dx, dy, dz)); - - vertex1 = (fObjectTransformation) * vertex1; - vertex2 = (fObjectTransformation) * vertex2; - vertex3 = (fObjectTransformation) * vertex3; - vertex4 = (fObjectTransformation) * vertex4; - vertex5 = (fObjectTransformation) * vertex5; - vertex6 = (fObjectTransformation) * vertex6; - vertex7 = (fObjectTransformation) * vertex7; - vertex8 = (fObjectTransformation) * vertex8; - - hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); - hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); - hepRepXMLWriter->addPoint(vertex3.x(), vertex3.y(), vertex3.z()); - hepRepXMLWriter->addPoint(vertex4.x(), vertex4.y(), vertex4.z()); - hepRepXMLWriter->addPoint(vertex5.x(), vertex5.y(), vertex5.z()); - hepRepXMLWriter->addPoint(vertex6.x(), vertex6.y(), vertex6.z()); - hepRepXMLWriter->addPoint(vertex7.x(), vertex7.y(), vertex7.z()); - hepRepXMLWriter->addPoint(vertex8.x(), vertex8.y(), vertex8.z()); + + if(drawingTraj) + return; + + if(drawingHit) + InitHit(); + + haveVisible = false; + AddHepRepInstance("Prism", NULL); + + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + + // Get and check applicable vis attributes. + fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + hepRepXMLWriter->addPrimitive(); + + G4double dx = box.GetXHalfLength(); + G4double dy = box.GetYHalfLength(); + G4double dz = box.GetZHalfLength(); + + G4Point3D vertex1(G4Point3D(dx, dy, -dz)); + G4Point3D vertex2(G4Point3D(dx, -dy, -dz)); + G4Point3D vertex3(G4Point3D(-dx, -dy, -dz)); + G4Point3D vertex4(G4Point3D(-dx, dy, -dz)); + G4Point3D vertex5(G4Point3D(dx, dy, dz)); + G4Point3D vertex6(G4Point3D(dx, -dy, dz)); + G4Point3D vertex7(G4Point3D(-dx, -dy, dz)); + G4Point3D vertex8(G4Point3D(-dx, dy, dz)); + + vertex1 = (fObjectTransformation) *vertex1; + vertex2 = (fObjectTransformation) *vertex2; + vertex3 = (fObjectTransformation) *vertex3; + vertex4 = (fObjectTransformation) *vertex4; + vertex5 = (fObjectTransformation) *vertex5; + vertex6 = (fObjectTransformation) *vertex6; + vertex7 = (fObjectTransformation) *vertex7; + vertex8 = (fObjectTransformation) *vertex8; + + hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); + hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); + hepRepXMLWriter->addPoint(vertex3.x(), vertex3.y(), vertex3.z()); + hepRepXMLWriter->addPoint(vertex4.x(), vertex4.y(), vertex4.z()); + hepRepXMLWriter->addPoint(vertex5.x(), vertex5.y(), vertex5.z()); + hepRepXMLWriter->addPoint(vertex6.x(), vertex6.y(), vertex6.z()); + hepRepXMLWriter->addPoint(vertex7.x(), vertex7.y(), vertex7.z()); + hepRepXMLWriter->addPoint(vertex8.x(), vertex8.y(), vertex8.z()); } - -void G4HepRepFileSceneHandler::AddSolid(const G4Cons& cons) { +void G4HepRepFileSceneHandler::AddSolid(const G4Cons& cons) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Cons& cons) called for " - << cons.GetName() - << G4endl; - PrintThings(); + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Cons& cons) called for " + << cons.GetName() << G4endl; + PrintThings(); #endif - - // HepRApp does not correctly represent the end faces of cones at - // non-standard angles, let the base class convert these solids to polygons. - G4RotationMatrix r = fObjectTransformation.getRotation(); - G4bool linedUpWithAnAxis = (std::fabs(r.phiX())<=.001 || - std::fabs(r.phiY())<=.001 || - std::fabs(r.phiZ())<=.001 || - std::fabs(r.phiX()-pi)<=.001 || - std::fabs(r.phiY()-pi)<=.001 || - std::fabs(r.phiZ()-pi)<=.001); - //G4cout << "Angle X:" << r.phiX() << ", Angle Y:" << r.phiY() << ", Angle Z:" << r.phiZ() << G4endl; - //G4cout << "linedUpWithAnAxis:" << linedUpWithAnAxis << G4endl; - - // HepRep does not have a primitive for a cut cone, - // so if this cone is cut, let the base class convert this - // solid to polygons. - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - if (cons.GetDeltaPhiAngle() < twopi || !linedUpWithAnAxis || messenger->renderCylAsPolygons()) - { - G4VSceneHandler::AddSolid(cons); // Invoke default action. - } else { - - if (drawingTraj) - return; - - if (drawingHit) - InitHit(); - haveVisible = false; - AddHepRepInstance("Cylinder", NULL); - - // Get and check applicable vis attributes. - fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - G4Point3D vertex1(G4Point3D( 0., 0., -cons.GetZHalfLength())); - G4Point3D vertex2(G4Point3D( 0., 0., cons.GetZHalfLength())); - - vertex1 = (fObjectTransformation) * vertex1; - vertex2 = (fObjectTransformation) * vertex2; - - // Outer cylinder. - hepRepXMLWriter->addPrimitive(); - hepRepXMLWriter->addAttValue("Radius1",messenger->getScale() * cons.GetOuterRadiusMinusZ()); - hepRepXMLWriter->addAttValue("Radius2",messenger->getScale() * cons.GetOuterRadiusPlusZ()); - hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); - hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); - - // Inner cylinder. - hepRepXMLWriter->addPrimitive(); - hepRepXMLWriter->addAttValue("Radius1",messenger->getScale() * cons.GetInnerRadiusMinusZ()); - hepRepXMLWriter->addAttValue("Radius2",messenger->getScale() * cons.GetInnerRadiusPlusZ()); - hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); - hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); - } + // HepRApp does not correctly represent the end faces of cones at + // non-standard angles, let the base class convert these solids to polygons. + G4RotationMatrix r = fObjectTransformation.getRotation(); + G4bool linedUpWithAnAxis = + (std::fabs(r.phiX()) <= .001 || std::fabs(r.phiY()) <= .001 || + std::fabs(r.phiZ()) <= .001 || std::fabs(r.phiX() - pi) <= .001 || + std::fabs(r.phiY() - pi) <= .001 || std::fabs(r.phiZ() - pi) <= .001); + // G4cout << "Angle X:" << r.phiX() << ", Angle Y:" << r.phiY() << ", Angle + // Z:" << r.phiZ() << G4endl; G4cout << "linedUpWithAnAxis:" << + // linedUpWithAnAxis << G4endl; + + // HepRep does not have a primitive for a cut cone, + // so if this cone is cut, let the base class convert this + // solid to polygons. + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + if(cons.GetDeltaPhiAngle() < twopi || !linedUpWithAnAxis || + messenger->renderCylAsPolygons()) + { + G4VSceneHandler::AddSolid(cons); // Invoke default action. + } + else + { + if(drawingTraj) + return; + + if(drawingHit) + InitHit(); + + haveVisible = false; + AddHepRepInstance("Cylinder", NULL); + + // Get and check applicable vis attributes. + fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + G4Point3D vertex1(G4Point3D(0., 0., -cons.GetZHalfLength())); + G4Point3D vertex2(G4Point3D(0., 0., cons.GetZHalfLength())); + + vertex1 = (fObjectTransformation) *vertex1; + vertex2 = (fObjectTransformation) *vertex2; + + // Outer cylinder. + hepRepXMLWriter->addPrimitive(); + hepRepXMLWriter->addAttValue("Radius1", messenger->getScale() * + cons.GetOuterRadiusMinusZ()); + hepRepXMLWriter->addAttValue("Radius2", messenger->getScale() * + cons.GetOuterRadiusPlusZ()); + hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); + hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); + + // Inner cylinder. + hepRepXMLWriter->addPrimitive(); + hepRepXMLWriter->addAttValue("Radius1", messenger->getScale() * + cons.GetInnerRadiusMinusZ()); + hepRepXMLWriter->addAttValue("Radius2", messenger->getScale() * + cons.GetInnerRadiusPlusZ()); + hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); + hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); + } } - -void G4HepRepFileSceneHandler::AddSolid(const G4Tubs& tubs) { +void G4HepRepFileSceneHandler::AddSolid(const G4Tubs& tubs) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Tubs& tubs) called for " - << tubs.GetName() - << G4endl; - PrintThings(); + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Tubs& tubs) called for " + << tubs.GetName() << G4endl; + PrintThings(); #endif - - // HepRApp does not correctly represent the end faces of cylinders at - // non-standard angles, let the base class convert these solids to polygons. - G4RotationMatrix r = fObjectTransformation.getRotation(); - G4bool linedUpWithAnAxis = (std::fabs(r.phiX())<=.001 || - std::fabs(r.phiY())<=.001 || - std::fabs(r.phiZ())<=.001 || - std::fabs(r.phiX()-pi)<=.001 || - std::fabs(r.phiY()-pi)<=.001 || - std::fabs(r.phiZ()-pi)<=.001); - //G4cout << "Angle X:" << r.phiX() << ", Angle Y:" << r.phiY() << ", Angle Z:" << r.phiZ() << G4endl; - //G4cout << "linedUpWithAnAxis:" << linedUpWithAnAxis << G4endl; - - // HepRep does not have a primitive for a cut cylinder, - // so if this cylinder is cut, let the base class convert this - // solid to polygons. - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - if (tubs.GetDeltaPhiAngle() < twopi || !linedUpWithAnAxis || messenger->renderCylAsPolygons()) - { - G4VSceneHandler::AddSolid(tubs); // Invoke default action. - } else { - - if (drawingTraj) - return; - - if (drawingHit) - InitHit(); - haveVisible = false; - AddHepRepInstance("Cylinder", NULL); - - // Get and check applicable vis attributes. - fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - G4Point3D vertex1(G4Point3D( 0., 0., -tubs.GetZHalfLength())); - G4Point3D vertex2(G4Point3D( 0., 0., tubs.GetZHalfLength())); - - vertex1 = (fObjectTransformation) * vertex1; - vertex2 = (fObjectTransformation) * vertex2; - - // Outer cylinder. - hepRepXMLWriter->addPrimitive(); - hepRepXMLWriter->addAttValue("Radius1", messenger->getScale() * tubs.GetOuterRadius()); - hepRepXMLWriter->addAttValue("Radius2", messenger->getScale() * tubs.GetOuterRadius()); - hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); - hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); - - // Inner cylinder. - if (tubs.GetInnerRadius() != 0.) { - hepRepXMLWriter->addPrimitive(); - hepRepXMLWriter->addAttValue("Radius1", messenger->getScale() * tubs.GetInnerRadius()); - hepRepXMLWriter->addAttValue("Radius2", messenger->getScale() * tubs.GetInnerRadius()); - hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); - hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); - } - } + // HepRApp does not correctly represent the end faces of cylinders at + // non-standard angles, let the base class convert these solids to polygons. + G4RotationMatrix r = fObjectTransformation.getRotation(); + G4bool linedUpWithAnAxis = + (std::fabs(r.phiX()) <= .001 || std::fabs(r.phiY()) <= .001 || + std::fabs(r.phiZ()) <= .001 || std::fabs(r.phiX() - pi) <= .001 || + std::fabs(r.phiY() - pi) <= .001 || std::fabs(r.phiZ() - pi) <= .001); + // G4cout << "Angle X:" << r.phiX() << ", Angle Y:" << r.phiY() << ", Angle + // Z:" << r.phiZ() << G4endl; G4cout << "linedUpWithAnAxis:" << + // linedUpWithAnAxis << G4endl; + + // HepRep does not have a primitive for a cut cylinder, + // so if this cylinder is cut, let the base class convert this + // solid to polygons. + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + if(tubs.GetDeltaPhiAngle() < twopi || !linedUpWithAnAxis || + messenger->renderCylAsPolygons()) + { + G4VSceneHandler::AddSolid(tubs); // Invoke default action. + } + else + { + if(drawingTraj) + return; + + if(drawingHit) + InitHit(); + + haveVisible = false; + AddHepRepInstance("Cylinder", NULL); + + // Get and check applicable vis attributes. + fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + G4Point3D vertex1(G4Point3D(0., 0., -tubs.GetZHalfLength())); + G4Point3D vertex2(G4Point3D(0., 0., tubs.GetZHalfLength())); + + vertex1 = (fObjectTransformation) *vertex1; + vertex2 = (fObjectTransformation) *vertex2; + + // Outer cylinder. + hepRepXMLWriter->addPrimitive(); + hepRepXMLWriter->addAttValue("Radius1", + messenger->getScale() * tubs.GetOuterRadius()); + hepRepXMLWriter->addAttValue("Radius2", + messenger->getScale() * tubs.GetOuterRadius()); + hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); + hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); + + // Inner cylinder. + if(tubs.GetInnerRadius() != 0.) + { + hepRepXMLWriter->addPrimitive(); + hepRepXMLWriter->addAttValue("Radius1", messenger->getScale() * + tubs.GetInnerRadius()); + hepRepXMLWriter->addAttValue("Radius2", messenger->getScale() * + tubs.GetInnerRadius()); + hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); + hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); + } + } } - -void G4HepRepFileSceneHandler::AddSolid(const G4Trd& trd) { +void G4HepRepFileSceneHandler::AddSolid(const G4Trd& trd) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Trd& trd) called for " - << trd.GetName() - << G4endl; - PrintThings(); + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Trd& trd) called for " + << trd.GetName() << G4endl; + PrintThings(); #endif - - if (drawingTraj) - return; - - if (drawingHit) - InitHit(); - - haveVisible = false; - AddHepRepInstance("Prism", NULL); - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - // Get and check applicable vis attributes. - fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - hepRepXMLWriter->addPrimitive(); - - G4double dx1 = trd.GetXHalfLength1(); - G4double dy1 = trd.GetYHalfLength1(); - G4double dx2 = trd.GetXHalfLength2(); - G4double dy2 = trd.GetYHalfLength2(); - G4double dz = trd.GetZHalfLength(); - - G4Point3D vertex1(G4Point3D( dx1, dy1,-dz)); - G4Point3D vertex2(G4Point3D( dx1,-dy1,-dz)); - G4Point3D vertex3(G4Point3D(-dx1,-dy1,-dz)); - G4Point3D vertex4(G4Point3D(-dx1, dy1,-dz)); - G4Point3D vertex5(G4Point3D( dx2, dy2, dz)); - G4Point3D vertex6(G4Point3D( dx2,-dy2, dz)); - G4Point3D vertex7(G4Point3D(-dx2,-dy2, dz)); - G4Point3D vertex8(G4Point3D(-dx2, dy2, dz)); - - vertex1 = (fObjectTransformation) * vertex1; - vertex2 = (fObjectTransformation) * vertex2; - vertex3 = (fObjectTransformation) * vertex3; - vertex4 = (fObjectTransformation) * vertex4; - vertex5 = (fObjectTransformation) * vertex5; - vertex6 = (fObjectTransformation) * vertex6; - vertex7 = (fObjectTransformation) * vertex7; - vertex8 = (fObjectTransformation) * vertex8; - - hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); - hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); - hepRepXMLWriter->addPoint(vertex3.x(), vertex3.y(), vertex3.z()); - hepRepXMLWriter->addPoint(vertex4.x(), vertex4.y(), vertex4.z()); - hepRepXMLWriter->addPoint(vertex5.x(), vertex5.y(), vertex5.z()); - hepRepXMLWriter->addPoint(vertex6.x(), vertex6.y(), vertex6.z()); - hepRepXMLWriter->addPoint(vertex7.x(), vertex7.y(), vertex7.z()); - hepRepXMLWriter->addPoint(vertex8.x(), vertex8.y(), vertex8.z()); + + if(drawingTraj) + return; + + if(drawingHit) + InitHit(); + + haveVisible = false; + AddHepRepInstance("Prism", NULL); + + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + + // Get and check applicable vis attributes. + fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + hepRepXMLWriter->addPrimitive(); + + G4double dx1 = trd.GetXHalfLength1(); + G4double dy1 = trd.GetYHalfLength1(); + G4double dx2 = trd.GetXHalfLength2(); + G4double dy2 = trd.GetYHalfLength2(); + G4double dz = trd.GetZHalfLength(); + + G4Point3D vertex1(G4Point3D(dx1, dy1, -dz)); + G4Point3D vertex2(G4Point3D(dx1, -dy1, -dz)); + G4Point3D vertex3(G4Point3D(-dx1, -dy1, -dz)); + G4Point3D vertex4(G4Point3D(-dx1, dy1, -dz)); + G4Point3D vertex5(G4Point3D(dx2, dy2, dz)); + G4Point3D vertex6(G4Point3D(dx2, -dy2, dz)); + G4Point3D vertex7(G4Point3D(-dx2, -dy2, dz)); + G4Point3D vertex8(G4Point3D(-dx2, dy2, dz)); + + vertex1 = (fObjectTransformation) *vertex1; + vertex2 = (fObjectTransformation) *vertex2; + vertex3 = (fObjectTransformation) *vertex3; + vertex4 = (fObjectTransformation) *vertex4; + vertex5 = (fObjectTransformation) *vertex5; + vertex6 = (fObjectTransformation) *vertex6; + vertex7 = (fObjectTransformation) *vertex7; + vertex8 = (fObjectTransformation) *vertex8; + + hepRepXMLWriter->addPoint(vertex1.x(), vertex1.y(), vertex1.z()); + hepRepXMLWriter->addPoint(vertex2.x(), vertex2.y(), vertex2.z()); + hepRepXMLWriter->addPoint(vertex3.x(), vertex3.y(), vertex3.z()); + hepRepXMLWriter->addPoint(vertex4.x(), vertex4.y(), vertex4.z()); + hepRepXMLWriter->addPoint(vertex5.x(), vertex5.y(), vertex5.z()); + hepRepXMLWriter->addPoint(vertex6.x(), vertex6.y(), vertex6.z()); + hepRepXMLWriter->addPoint(vertex7.x(), vertex7.y(), vertex7.z()); + hepRepXMLWriter->addPoint(vertex8.x(), vertex8.y(), vertex8.z()); } - -void G4HepRepFileSceneHandler::AddSolid(const G4Trap& trap) { +void G4HepRepFileSceneHandler::AddSolid(const G4Trap& trap) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Trap& trap) called for " - << trap.GetName() - << G4endl; - PrintThings(); + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Trap& trap) called for " + << trap.GetName() << G4endl; + PrintThings(); #endif - G4VSceneHandler::AddSolid(trap); // Invoke default action. + G4VSceneHandler::AddSolid(trap); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddSolid(const G4Sphere& sphere) { +void G4HepRepFileSceneHandler::AddSolid(const G4Sphere& sphere) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Sphere& sphere) called for " - << sphere.GetName() - << G4endl; - PrintThings(); + G4cout + << "G4HepRepFileSceneHandler::AddSolid(const G4Sphere& sphere) called for " + << sphere.GetName() << G4endl; + PrintThings(); #endif - G4VSceneHandler::AddSolid(sphere); // Invoke default action. + G4VSceneHandler::AddSolid(sphere); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddSolid(const G4Para& para) { +void G4HepRepFileSceneHandler::AddSolid(const G4Para& para) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Para& para) called for " - << para.GetName() - << G4endl; - PrintThings(); + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Para& para) called for " + << para.GetName() << G4endl; + PrintThings(); #endif - G4VSceneHandler::AddSolid(para); // Invoke default action. + G4VSceneHandler::AddSolid(para); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddSolid(const G4Torus& torus) { +void G4HepRepFileSceneHandler::AddSolid(const G4Torus& torus) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Torus& torus) called for " - << torus.GetName() - << G4endl; - PrintThings(); + G4cout + << "G4HepRepFileSceneHandler::AddSolid(const G4Torus& torus) called for " + << torus.GetName() << G4endl; + PrintThings(); #endif - G4VSceneHandler::AddSolid(torus); // Invoke default action. + G4VSceneHandler::AddSolid(torus); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddSolid(const G4Polycone& polycone) { +void G4HepRepFileSceneHandler::AddSolid(const G4Polycone& polycone) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Polycone& polycone) called for " - << polycone.GetName() - << G4endl; + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Polycone& polycone) " + "called for " + << polycone.GetName() << G4endl; PrintThings(); #endif G4VSceneHandler::AddSolid(polycone); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddSolid(const G4Polyhedra& polyhedra) { +void G4HepRepFileSceneHandler::AddSolid(const G4Polyhedra& polyhedra) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Polyhedra& polyhedra) called for " - << polyhedra.GetName() - << G4endl; + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Polyhedra& polyhedra) " + "called for " + << polyhedra.GetName() << G4endl; PrintThings(); #endif G4VSceneHandler::AddSolid(polyhedra); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddSolid(const G4Orb& orb) { +void G4HepRepFileSceneHandler::AddSolid(const G4Orb& orb) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Orb& orb) called for " - << orb.GetName() - << G4endl; + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Orb& orb) called for " + << orb.GetName() << G4endl; PrintThings(); #endif G4VSceneHandler::AddSolid(orb); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddSolid(const G4Ellipsoid& ellipsoid) { +void G4HepRepFileSceneHandler::AddSolid(const G4Ellipsoid& ellipsoid) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Ellipsoid& ellipsoid) called for " - << ellipsoid.GetName() - << G4endl; + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4Ellipsoid& ellipsoid) " + "called for " + << ellipsoid.GetName() << G4endl; PrintThings(); #endif G4VSceneHandler::AddSolid(ellipsoid); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddSolid(const G4TessellatedSolid& tess) { +void G4HepRepFileSceneHandler::AddSolid(const G4TessellatedSolid& tess) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4TessellatedSolid& ) called for " - << tess.GetName() - << G4endl; + G4cout << "G4HepRepFileSceneHandler::AddSolid(const G4TessellatedSolid& ) " + "called for " + << tess.GetName() << G4endl; PrintThings(); #endif G4VSceneHandler::AddSolid(tess); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddSolid(const G4VSolid& solid) { +void G4HepRepFileSceneHandler::AddSolid(const G4VSolid& solid) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddSolid(const G4Solid& solid) called for " - << solid.GetName() - << G4endl; - PrintThings(); + G4cout + << "G4HepRepFileSceneHandler::AddSolid(const G4Solid& solid) called for " + << solid.GetName() << G4endl; + PrintThings(); #endif - G4VSceneHandler::AddSolid(solid); // Invoke default action. + G4VSceneHandler::AddSolid(solid); // Invoke default action. } - -void G4HepRepFileSceneHandler::AddCompound (const G4VTrajectory& traj) { +void G4HepRepFileSceneHandler::AddCompound(const G4VTrajectory& traj) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileSceneHandler::AddCompound(const G4VTrajectory&) " << G4endl; + G4cout << "G4HepRepFileSceneHandler::AddCompound(const G4VTrajectory&) " + << G4endl; #endif - - G4TrajectoriesModel* pTrModel = - dynamic_cast(fpModel); - if (!pTrModel) G4Exception - ("G4HepRepFileSceneHandler::AddCompound(const G4VTrajectory&)", - "vis-HepRep0001", FatalException, "Not a G4TrajectoriesModel."); - - // Pointers to hold trajectory attribute values and definitions. - std::vector* rawTrajAttValues = traj.CreateAttValues(); - trajAttValues = - new std::vector; - trajAttDefs = - new std::map; - - // Iterators to use with attribute values and definitions. - std::vector::iterator iAttVal; - std::map::const_iterator iAttDef; - G4int i; - - // Get trajectory attributes and definitions in standard HepRep style - // (uniform units, 3Vectors decomposed). - if (rawTrajAttValues) { - G4bool error = G4AttCheck(rawTrajAttValues, - traj.GetAttDefs()).Standard(trajAttValues,trajAttDefs); - if (error) { - G4cout << "G4HepRepFileSceneHandler::AddCompound(traj):" - "\nERROR found during conversion to standard trajectory attributes." - << G4endl; - } -#ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddCompound(traj): standardised attributes:\n" - << G4AttCheck(trajAttValues,trajAttDefs) << G4endl; -#endif - delete rawTrajAttValues; - } - - // Open the HepRep output file if it is not already open. - CheckFileOpen(); - - // Add the Event Data Type if it hasn't already been added. - if (strcmp("Event Data",hepRepXMLWriter->prevTypeName[0])!=0) { - hepRepXMLWriter->addType("Event Data",0); - hepRepXMLWriter->addInstance(); - } - - // Add the Trajectories Type. - G4String previousName = hepRepXMLWriter->prevTypeName[1]; - hepRepXMLWriter->addType("Trajectories",1); - - // If this is the first trajectory of this event, - // specify attribute values common to all trajectories. - if (strcmp("Trajectories",previousName)!=0) { - hepRepXMLWriter->addAttValue("Layer",100); - - // Take all Trajectory attDefs from first trajectory. - // Would rather be able to get these attDefs without needing a reference from any - // particular trajectory, but don't know how to do that. - // Write out trajectory attribute definitions. - if (trajAttValues && trajAttDefs) { - for (iAttVal = trajAttValues->begin(); - iAttVal != trajAttValues->end(); ++iAttVal) { - iAttDef = trajAttDefs->find(iAttVal->GetName()); - if (iAttDef != trajAttDefs->end()) { - // Protect against incorrect use of Category. Anything value other than the - // standard ones will be considered to be in the physics category. - G4String category = iAttDef->second.GetCategory(); - if (strcmp(category,"Draw")!=0 && - strcmp(category,"Physics")!=0 && - strcmp(category,"Association")!=0 && - strcmp(category,"PickAction")!=0) - category = "Physics"; - hepRepXMLWriter->addAttDef(iAttVal->GetName(), iAttDef->second.GetDesc(), - category, iAttDef->second.GetExtra()); - } - } - } - - // Take all TrajectoryPoint attDefs from first point of first trajectory. - // Would rather be able to get these attDefs without needing a reference from any - // particular point, but don't know how to do that. - if ((trajContext->GetDrawStepPts() || trajContext->GetDrawAuxPts()) - && traj.GetPointEntries()>0) { - G4VTrajectoryPoint* aTrajectoryPoint = traj.GetPoint(0); - - // Pointers to hold trajectory point attribute values and definitions. - std::vector* rawPointAttValues = aTrajectoryPoint->CreateAttValues(); - std::vector* pointAttValues = - new std::vector; - std::map* pointAttDefs = - new std::map; - - // Get first trajectory point's attributes and definitions in standard HepRep style - // (uniform units, 3Vectors decomposed). - if (rawPointAttValues) { - G4bool error = G4AttCheck(rawPointAttValues, - aTrajectoryPoint->GetAttDefs()).Standard(pointAttValues,pointAttDefs); - if (error) { - G4cout << "G4HepRepFileSceneHandler::AddCompound(traj):" - "\nERROR found during conversion to standard first point attributes." << G4endl; - } - - // Write out point attribute definitions. - if (pointAttValues && pointAttDefs) { - for (iAttVal = pointAttValues->begin(); - iAttVal != pointAttValues->end(); ++iAttVal) { - iAttDef = - pointAttDefs->find(iAttVal->GetName()); - if (iAttDef != pointAttDefs->end()) { - // Protect against incorrect use of Category. Anything value other than the - // standard ones will be considered to be in the physics category. - G4String category = iAttDef->second.GetCategory(); - if (strcmp(category,"Draw")!=0 && - strcmp(category,"Physics")!=0 && - strcmp(category,"Association")!=0 && - strcmp(category,"PickAction")!=0) - category = "Physics"; - // Do not write out the Aux or Pos attribute. Aux does not conform to the HepRep rule - // that each object can have only one instance of a given AttValue. - // Both of these attributes are redundant to actual position information of the point. - if (strcmp(iAttVal->GetName(),"Aux-X")!=0 && - strcmp(iAttVal->GetName(),"Aux-Y")!=0 && - strcmp(iAttVal->GetName(),"Aux-Z")!=0 && - strcmp(iAttVal->GetName(),"Pos-X")!=0 && - strcmp(iAttVal->GetName(),"Pos-Y")!=0 && - strcmp(iAttVal->GetName(),"Pos-Z")!=0) - hepRepXMLWriter->addAttDef(iAttVal->GetName(), iAttDef->second.GetDesc(), - category, iAttDef->second.GetExtra()); - } - } - } - delete rawPointAttValues; - } - - // Clean up point attributes. - if (pointAttValues) - delete pointAttValues; - if (pointAttDefs) - delete pointAttDefs; - } - } // end of special treatment for when this is the first trajectory. - - // Now that we have written out all of the attributes that are based on the - // trajectory's particulars, call base class to deconstruct trajectory into polyline and/or points - // (or nothing if trajectory is to be filtered out). - // If base class calls for drawing points, no points will actually be drawn there since we - // instead need to do point drawing from here (in order to obtain the points attributes, - // not available from AddPrimitive(...point). Instead, such a call will just serve to set the - // flag that tells us that point drawing was requested for this trajectory (depends on several - // factors including trajContext and filtering). - drawingTraj = true; - doneInitTraj = false; - G4VSceneHandler::AddCompound(traj); - drawingTraj = false; - - // Draw step points. - if (trajContext->GetDrawStepPts()) { - if (!doneInitTraj) - InitTrajectory(); - // Create Trajectory Points as a subType of Trajectories. - // Note that we should create this heprep type even if there are no actual points. - // This allows the user to tell that points don't exist (admittedly odd) rather - // than that they were omitted by the drawing mode. - previousName = hepRepXMLWriter->prevTypeName[2]; - hepRepXMLWriter->addType("Trajectory Step Points",2); - float redness; - float greenness; - float blueness; - G4int markSize; - G4bool visible; - G4bool square; - G4Colour colour = trajContext->GetStepPtsColour(); - redness = colour.GetRed(); - greenness = colour.GetGreen(); - blueness = colour.GetBlue(); - markSize = (G4int) trajContext->GetStepPtsSize(); - visible = (G4int) trajContext->GetStepPtsVisible(); - square = (trajContext->GetStepPtsType()==G4Polymarker::squares); + G4TrajectoriesModel* pTrModel = dynamic_cast(fpModel); + if(!pTrModel) + G4Exception("G4HepRepFileSceneHandler::AddCompound(const G4VTrajectory&)", + "vis-HepRep0001", FatalException, "Not a G4TrajectoriesModel."); - // Avoiding drawing anything black on black. - if (redness==0. && greenness==0. && blueness==0.) { - redness = 1.; - greenness = 1.; - blueness = 1.; - } - - // Specify attributes common to all trajectory points. - if (strcmp("Trajectory Step Points",previousName)!=0) { - hepRepXMLWriter->addAttValue("DrawAs","Point"); - hepRepXMLWriter->addAttValue("MarkColor", redness, greenness, blueness); - hepRepXMLWriter->addAttValue("MarkSize",markSize); - hepRepXMLWriter->addAttValue("Layer",110); - hepRepXMLWriter->addAttValue("Visibility",visible); - if (square) - hepRepXMLWriter->addAttValue("MarkName","square"); - else - hepRepXMLWriter->addAttValue("MarkName","dot"); - } - - // Loop over all points on this trajectory. - for (i = 0; i < traj.GetPointEntries(); i++) { - G4VTrajectoryPoint* aTrajectoryPoint = traj.GetPoint(i); - - // Each point is a separate instance of the type Trajectory Points. - hepRepXMLWriter->addInstance(); - - // Pointers to hold trajectory point attribute values and definitions. - std::vector* rawPointAttValues = aTrajectoryPoint->CreateAttValues(); - std::vector* pointAttValues = - new std::vector; - std::map* pointAttDefs = - new std::map; - - // Get trajectory point attributes and definitions in standard HepRep style - // (uniform units, 3Vectors decomposed). - if (rawPointAttValues) { - G4bool error = G4AttCheck(rawPointAttValues, - aTrajectoryPoint->GetAttDefs()).Standard(pointAttValues,pointAttDefs); - if (error) { - G4cout << "G4HepRepFileSceneHandler::AddCompound(traj):" - "\nERROR found during conversion to standard point attributes." << G4endl; - } - - // Write out point attribute values. - if (pointAttValues) { - for (iAttVal = pointAttValues->begin(); - iAttVal != pointAttValues->end(); ++iAttVal) - // Do not write out the Aux or Pos attribute. Aux does not conform to the HepRep rule - // that each object can have only one instance of a given AttValue. - // Both of these attributes are redundant to actual position information of the point. - if (strcmp(iAttVal->GetName(),"Aux-X")!=0 && - strcmp(iAttVal->GetName(),"Aux-Y")!=0 && - strcmp(iAttVal->GetName(),"Aux-Z")!=0 && - strcmp(iAttVal->GetName(),"Pos-X")!=0 && - strcmp(iAttVal->GetName(),"Pos-Y")!=0 && - strcmp(iAttVal->GetName(),"Pos-Z")!=0) - hepRepXMLWriter->addAttValue(iAttVal->GetName(), iAttVal->GetValue()); - } - } - - // Clean up point attributes. - delete pointAttDefs; - delete pointAttValues; - delete rawPointAttValues; + // Pointers to hold trajectory attribute values and definitions. + std::vector* rawTrajAttValues = traj.CreateAttValues(); + trajAttValues = new std::vector; + trajAttDefs = new std::map; - // Each trajectory point is made of a single primitive, a point. - hepRepXMLWriter->addPrimitive(); - G4Point3D vertex = aTrajectoryPoint->GetPosition(); - hepRepXMLWriter->addPoint(vertex.x(), vertex.y(), vertex.z()); - } - } - - // Draw Auxiliary Points - if (trajContext->GetDrawAuxPts()) { - if (!doneInitTraj) - InitTrajectory(); - // Create Trajectory Points as a subType of Trajectories. - // Note that we should create this heprep type even if there are no actual points. - // This allows the user to tell that points don't exist (admittedly odd) rather - // than that they were omitted by the drawing mode. - previousName = hepRepXMLWriter->prevTypeName[2]; - hepRepXMLWriter->addType("Trajectory Auxiliary Points",2); + // Iterators to use with attribute values and definitions. + std::vector::iterator iAttVal; + std::map::const_iterator iAttDef; + G4int i; - float redness; - float greenness; - float blueness; - G4int markSize; - G4bool visible; - G4bool square; - G4Colour colour = trajContext->GetAuxPtsColour(); - redness = colour.GetRed(); - greenness = colour.GetGreen(); - blueness = colour.GetBlue(); - markSize = (G4int) trajContext->GetAuxPtsSize(); - visible = (G4int) trajContext->GetAuxPtsVisible(); - square = (trajContext->GetAuxPtsType()==G4Polymarker::squares); - - // Avoiding drawing anything black on black. - if (redness==0. && greenness==0. && blueness==0.) { - redness = 1.; - greenness = 1.; - blueness = 1.; - } - - // Specify attributes common to all trajectory points. - if (strcmp("Trajectory Auxiliary Points",previousName)!=0) { - hepRepXMLWriter->addAttValue("DrawAs","Point"); - hepRepXMLWriter->addAttValue("MarkColor", redness, greenness, blueness); - hepRepXMLWriter->addAttValue("MarkSize",markSize); - hepRepXMLWriter->addAttValue("Layer",110); - hepRepXMLWriter->addAttValue("Visibility",visible); - if (square) - hepRepXMLWriter->addAttValue("MarkName","Square"); - else - hepRepXMLWriter->addAttValue("MarkName","Dot"); - } - - // Loop over all points on this trajectory. - for (i = 0; i < traj.GetPointEntries(); i++) { - G4VTrajectoryPoint* aTrajectoryPoint = traj.GetPoint(i); - - // Each point is a separate instance of the type Trajectory Points. - hepRepXMLWriter->addInstance(); - - // Pointers to hold trajectory point attribute values and definitions. - std::vector* rawPointAttValues = aTrajectoryPoint->CreateAttValues(); - std::vector* pointAttValues = - new std::vector; - std::map* pointAttDefs = - new std::map; - - // Get trajectory point attributes and definitions in standard HepRep style - // (uniform units, 3Vectors decomposed). - if (rawPointAttValues) { - G4bool error = G4AttCheck(rawPointAttValues, - aTrajectoryPoint->GetAttDefs()).Standard(pointAttValues,pointAttDefs); - if (error) { - G4cout << "G4HepRepFileSceneHandler::AddCompound(traj):" - "\nERROR found during conversion to standard point attributes." << G4endl; - } - - // Write out point attribute values. - if (pointAttValues) { - for (iAttVal = pointAttValues->begin(); - iAttVal != pointAttValues->end(); ++iAttVal) - // Do not write out the Aux or Pos attribute. Aux does not conform to the HepRep rule - // that each object can have only one instance of a given AttValue. - // Both of these attributes are redundant to actual position information of the point. - if (strcmp(iAttVal->GetName(),"Aux-X")!=0 && - strcmp(iAttVal->GetName(),"Aux-Y")!=0 && - strcmp(iAttVal->GetName(),"Aux-Z")!=0 && - strcmp(iAttVal->GetName(),"Pos-X")!=0 && - strcmp(iAttVal->GetName(),"Pos-Y")!=0 && - strcmp(iAttVal->GetName(),"Pos-Z")!=0) - hepRepXMLWriter->addAttValue(iAttVal->GetName(), iAttVal->GetValue()); - } - } - - // Clean up point attributes. - delete pointAttDefs; - delete pointAttValues; - delete rawPointAttValues; - - // Each trajectory point is made of a single primitive, a point. - G4Point3D vertex = aTrajectoryPoint->GetPosition(); - - // Loop over auxiliary points associated with this Trajectory Point. - const std::vector* auxiliaries = aTrajectoryPoint->GetAuxiliaryPoints(); - if (0 != auxiliaries) { - for (size_t iAux=0; iAuxsize(); ++iAux) { - const G4ThreeVector auxPos((*auxiliaries)[iAux]); - hepRepXMLWriter->addPrimitive(); - hepRepXMLWriter->addPoint(auxPos.x(), auxPos.y(), auxPos.z()); - } - } - } - } -} - - -void G4HepRepFileSceneHandler::AddCompound (const G4VHit& hit) { -#ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileSceneHandler::AddCompound(G4VHit&) " << G4endl; -#endif - - // Pointers to hold hit attribute values and definitions. - std::vector* rawHitAttValues = hit.CreateAttValues(); - hitAttValues = - new std::vector; - hitAttDefs = - new std::map; - - // Iterators to use with attribute values and definitions. - std::vector::iterator iAttVal; - std::map::const_iterator iAttDef; - - // Get hit attributes and definitions in standard HepRep style - // (uniform units, 3Vectors decomposed). - if (rawHitAttValues) { - G4bool error = G4AttCheck(rawHitAttValues, - hit.GetAttDefs()).Standard(hitAttValues,hitAttDefs); - if (error) { - G4cout << "G4HepRepFileSceneHandler::AddCompound(hit):" - "\nERROR found during conversion to standard hit attributes." - << G4endl; - } -#ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddCompound(hit): standardised attributes:\n" - << G4AttCheck(hitAttValues,hitAttDefs) << G4endl; -#endif - delete rawHitAttValues; - } - - // Open the HepRep output file if it is not already open. - CheckFileOpen(); - - // Add the Event Data Type if it hasn't already been added. - if (strcmp("Event Data",hepRepXMLWriter->prevTypeName[0])!=0) { - hepRepXMLWriter->addType("Event Data",0); - hepRepXMLWriter->addInstance(); - } - - // Find out the current HitType. - G4String hitType = "Hits"; - if (hitAttValues) { - G4bool found = false; - for (iAttVal = hitAttValues->begin(); - iAttVal != hitAttValues->end() && !found; ++iAttVal) { - if (strcmp(iAttVal->GetName(),"HitType")==0) { - hitType = iAttVal->GetValue(); - found = true; - } - } - } - - // Add the Hits Type. - G4String previousName = hepRepXMLWriter->prevTypeName[1]; - hepRepXMLWriter->addType(hitType,1); - - // If this is the first hit of this event, - // specify attribute values common to all hits. - if (strcmp(hitType,previousName)!=0) { - hepRepXMLWriter->addAttValue("Layer",130); - - // Take all Hit attDefs from first hit. - // Would rather be able to get these attDefs without needing a reference from any - // particular hit, but don't know how to do that. - // Write out hit attribute definitions. - if (hitAttValues && hitAttDefs) { - for (iAttVal = hitAttValues->begin(); - iAttVal != hitAttValues->end(); ++iAttVal) { - iAttDef = hitAttDefs->find(iAttVal->GetName()); - if (iAttDef != hitAttDefs->end()) { - // Protect against incorrect use of Category. Anything value other than the - // standard ones will be considered to be in the physics category. - G4String category = iAttDef->second.GetCategory(); - if (strcmp(category,"Draw")!=0 && - strcmp(category,"Physics")!=0 && - strcmp(category,"Association")!=0 && - strcmp(category,"PickAction")!=0) - category = "Physics"; - hepRepXMLWriter->addAttDef(iAttVal->GetName(), iAttDef->second.GetDesc(), - category, iAttDef->second.GetExtra()); - } - } - } - } // end of special treatment for when this is the first hit. - - // Now that we have written out all of the attributes that are based on the - // hit's particulars, call base class to deconstruct hit into a primitives. - drawingHit = true; - doneInitHit = false; - G4VSceneHandler::AddCompound(hit); // Invoke default action. - drawingHit = false; -} - - -void G4HepRepFileSceneHandler::InitTrajectory() { - if (!doneInitTraj) { - // For every trajectory, add an instance of Type Trajectory. - hepRepXMLWriter->addInstance(); - - // Write out the trajectory's attribute values. - if (trajAttValues) { - std::vector::iterator iAttVal; - for (iAttVal = trajAttValues->begin(); - iAttVal != trajAttValues->end(); ++iAttVal) - hepRepXMLWriter->addAttValue(iAttVal->GetName(), iAttVal->GetValue()); - delete trajAttValues; - } - - // Clean up trajectory attributes. - if (trajAttDefs) - delete trajAttDefs; - - doneInitTraj = true; - } -} - - -void G4HepRepFileSceneHandler::InitHit() { - if (!doneInitHit) { - // For every hit, add an instance of Type Hit. - hepRepXMLWriter->addInstance(); - - // Write out the hit's attribute values. - if (hitAttValues) { - std::vector::iterator iAttVal; - for (iAttVal = hitAttValues->begin(); - iAttVal != hitAttValues->end(); ++iAttVal) - hepRepXMLWriter->addAttValue(iAttVal->GetName(), iAttVal->GetValue()); - delete hitAttValues; - } - - // Clean up hit attributes. - if (hitAttDefs) - delete hitAttDefs; - - doneInitHit = true; - } -} - - -void G4HepRepFileSceneHandler::AddPrimitive(const G4Polyline& polyline) { -#ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddPrimitive(const G4Polyline& polyline) called:" - "\n polyline: " << polyline - << G4endl; - PrintThings(); -#endif - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - if (inPrimitives2D) { - if (!warnedAbout2DMarkers) { - G4cout << "HepRepFile does not currently support 2D lines." << G4endl; - warnedAbout2DMarkers = true; - } - return; + // Get trajectory attributes and definitions in standard HepRep style + // (uniform units, 3Vectors decomposed). + if(rawTrajAttValues) + { + G4bool error = G4AttCheck(rawTrajAttValues, traj.GetAttDefs()) + .Standard(trajAttValues, trajAttDefs); + if(error) + { + G4cout + << "G4HepRepFileSceneHandler::AddCompound(traj):" + "\nERROR found during conversion to standard trajectory attributes." + << G4endl; } - - if (drawingTraj) - InitTrajectory(); - - if (drawingHit) - InitHit(); - - haveVisible = true; - AddHepRepInstance("Line", polyline); - - hepRepXMLWriter->addPrimitive(); - - for (size_t i=0; i < polyline.size(); i++) { - G4Point3D vertex = (fObjectTransformation) * polyline[i]; - hepRepXMLWriter->addPoint(vertex.x(), vertex.y(), vertex.z()); - } -} - - - -void G4HepRepFileSceneHandler::AddPrimitive (const G4Polymarker& line) { #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddPrimitive(const G4Polymarker& line) called" - << G4endl; - PrintThings(); + G4cout << "G4HepRepFileSceneHandler::AddCompound(traj): standardised " + "attributes:\n" + << G4AttCheck(trajAttValues, trajAttDefs) << G4endl; #endif - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - if (inPrimitives2D) { - if (!warnedAbout2DMarkers) { - G4cout << "HepRepFile does not currently support 2D lines." << G4endl; - warnedAbout2DMarkers = true; - } - return; + delete rawTrajAttValues; + } + + // Open the HepRep output file if it is not already open. + CheckFileOpen(); + + // Add the Event Data Type if it hasn't already been added. + if(strcmp("Event Data", hepRepXMLWriter->prevTypeName[0]) != 0) + { + hepRepXMLWriter->addType("Event Data", 0); + hepRepXMLWriter->addInstance(); + } + + // Add the Trajectories Type. + G4String previousName = hepRepXMLWriter->prevTypeName[1]; + hepRepXMLWriter->addType("Trajectories", 1); + + // If this is the first trajectory of this event, + // specify attribute values common to all trajectories. + if(strcmp("Trajectories", previousName) != 0) + { + hepRepXMLWriter->addAttValue("Layer", 100); + + // Take all Trajectory attDefs from first trajectory. + // Would rather be able to get these attDefs without needing a reference + // from any particular trajectory, but don't know how to do that. Write out + // trajectory attribute definitions. + if(trajAttValues && trajAttDefs) + { + for(iAttVal = trajAttValues->begin(); iAttVal != trajAttValues->end(); + ++iAttVal) + { + iAttDef = trajAttDefs->find(iAttVal->GetName()); + if(iAttDef != trajAttDefs->end()) + { + // Protect against incorrect use of Category. Anything value other + // than the standard ones will be considered to be in the physics + // category. + G4String category = iAttDef->second.GetCategory(); + if(strcmp(category, "Draw") != 0 && + strcmp(category, "Physics") != 0 && + strcmp(category, "Association") != 0 && + strcmp(category, "PickAction") != 0) + category = "Physics"; + hepRepXMLWriter->addAttDef(iAttVal->GetName(), + iAttDef->second.GetDesc(), category, + iAttDef->second.GetExtra()); + } + } } - - MarkerSizeType sizeType; - G4double size = GetMarkerSize (line, sizeType); - if (sizeType==world) - size = 4.; - - if (drawingTraj) - return; - - if (drawingHit) - InitHit(); - - haveVisible = true; - AddHepRepInstance("Point", line); - - hepRepXMLWriter->addAttValue("MarkName", "Dot"); - hepRepXMLWriter->addAttValue("MarkSize", (G4int) size); - - hepRepXMLWriter->addPrimitive(); - - for (size_t i=0; i < line.size(); i++) { - G4Point3D vertex = (fObjectTransformation) * line[i]; - hepRepXMLWriter->addPoint(vertex.x(), vertex.y(), vertex.z()); - } -} + // Take all TrajectoryPoint attDefs from first point of first trajectory. + // Would rather be able to get these attDefs without needing a reference + // from any particular point, but don't know how to do that. + if((trajContext->GetDrawStepPts() || trajContext->GetDrawAuxPts()) && + traj.GetPointEntries() > 0) + { + G4VTrajectoryPoint* aTrajectoryPoint = traj.GetPoint(0); -void G4HepRepFileSceneHandler::AddPrimitive(const G4Text& text) { -#ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddPrimitive(const G4Text& text) called:" - "\n text: " << text.GetText() - << G4endl; - PrintThings(); -#endif - - if (!inPrimitives2D) { - if (!warnedAbout3DText) { - G4cout << "HepRepFile does not currently support 3D text." << G4endl; - G4cout << "HepRep browsers can directly display text attributes on request." << G4endl; - G4cout << "See Application Developers Guide for how to attach attributes to viewable objects." << G4endl; - warnedAbout3DText = true; - } - return; + // Pointers to hold trajectory point attribute values and definitions. + std::vector* rawPointAttValues = + aTrajectoryPoint->CreateAttValues(); + std::vector* pointAttValues = new std::vector; + std::map* pointAttDefs = + new std::map; + + // Get first trajectory point's attributes and definitions in standard + // HepRep style (uniform units, 3Vectors decomposed). + if(rawPointAttValues) + { + G4bool error = + G4AttCheck(rawPointAttValues, aTrajectoryPoint->GetAttDefs()) + .Standard(pointAttValues, pointAttDefs); + if(error) + { + G4cout << "G4HepRepFileSceneHandler::AddCompound(traj):" + "\nERROR found during conversion to standard first point " + "attributes." + << G4endl; + } + + // Write out point attribute definitions. + if(pointAttValues && pointAttDefs) + { + for(iAttVal = pointAttValues->begin(); + iAttVal != pointAttValues->end(); ++iAttVal) + { + iAttDef = pointAttDefs->find(iAttVal->GetName()); + if(iAttDef != pointAttDefs->end()) + { + // Protect against incorrect use of Category. Anything value + // other than the standard ones will be considered to be in the + // physics category. + G4String category = iAttDef->second.GetCategory(); + if(strcmp(category, "Draw") != 0 && + strcmp(category, "Physics") != 0 && + strcmp(category, "Association") != 0 && + strcmp(category, "PickAction") != 0) + category = "Physics"; + // Do not write out the Aux or Pos attribute. Aux does not + // conform to the HepRep rule that each object can have only one + // instance of a given AttValue. Both of these attributes are + // redundant to actual position information of the point. + if(strcmp(iAttVal->GetName(), "Aux-X") != 0 && + strcmp(iAttVal->GetName(), "Aux-Y") != 0 && + strcmp(iAttVal->GetName(), "Aux-Z") != 0 && + strcmp(iAttVal->GetName(), "Pos-X") != 0 && + strcmp(iAttVal->GetName(), "Pos-Y") != 0 && + strcmp(iAttVal->GetName(), "Pos-Z") != 0) + hepRepXMLWriter->addAttDef(iAttVal->GetName(), + iAttDef->second.GetDesc(), category, + iAttDef->second.GetExtra()); + } + } + } + delete rawPointAttValues; + } + + // Clean up point attributes. + if(pointAttValues) + delete pointAttValues; + if(pointAttDefs) + delete pointAttDefs; } - - MarkerSizeType sizeType; - G4double size = GetMarkerSize (text, sizeType); - if (sizeType==world) - size = 12.; - - haveVisible = true; - AddHepRepInstance("Text", text); - - hepRepXMLWriter->addAttValue("VAlign", "Top"); - hepRepXMLWriter->addAttValue("HAlign", "Left"); - hepRepXMLWriter->addAttValue("FontName", "Arial"); - hepRepXMLWriter->addAttValue("FontStyle", "Plain"); - hepRepXMLWriter->addAttValue("FontSize", (G4int) size); - hepRepXMLWriter->addAttValue("FontHasBanner", "TRUE"); - hepRepXMLWriter->addAttValue("FontBannerColor", "0,0,0"); - - const G4Colour& colour = GetTextColour(text); - float redness = colour.GetRed(); - float greenness = colour.GetGreen(); - float blueness = colour.GetBlue(); - - // Avoiding drawing anything black on black. - if (redness==0. && greenness==0. && blueness==0.) { - redness = 1.; - greenness = 1.; - blueness = 1.; - } - hepRepXMLWriter->addAttValue("FontColor",redness,greenness,blueness); - - hepRepXMLWriter->addPrimitive(); - - hepRepXMLWriter->addAttValue("Text", text.GetText()); - hepRepXMLWriter->addAttValue("VPos", .99-text.GetYOffset()); - hepRepXMLWriter->addAttValue("HPos", text.GetXOffset()); -} + } // end of special treatment for when this is the first trajectory. + // Now that we have written out all of the attributes that are based on the + // trajectory's particulars, call base class to deconstruct trajectory into + // polyline and/or points (or nothing if trajectory is to be filtered out). If + // base class calls for drawing points, no points will actually be drawn there + // since we instead need to do point drawing from here (in order to obtain the + // points attributes, not available from AddPrimitive(...point). Instead, + // such a call will just serve to set the flag that tells us that point + // drawing was requested for this trajectory (depends on several factors + // including trajContext and filtering). + drawingTraj = true; + doneInitTraj = false; + G4VSceneHandler::AddCompound(traj); + drawingTraj = false; -void G4HepRepFileSceneHandler::AddPrimitive(const G4Circle& circle) { -#ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddPrimitive(const G4Circle& circle) called:" - "\n radius: " << circle.GetWorldRadius() - << G4endl; - PrintThings(); -#endif - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - if (inPrimitives2D) { - if (!warnedAbout2DMarkers) { - G4cout << "HepRepFile does not currently support 2D circles." << G4endl; - warnedAbout2DMarkers = true; - } - return; + // Draw step points. + if(trajContext->GetDrawStepPts()) + { + if(!doneInitTraj) + InitTrajectory(); + // Create Trajectory Points as a subType of Trajectories. + // Note that we should create this heprep type even if there are no actual + // points. This allows the user to tell that points don't exist (admittedly + // odd) rather than that they were omitted by the drawing mode. + previousName = hepRepXMLWriter->prevTypeName[2]; + hepRepXMLWriter->addType("Trajectory Step Points", 2); + + float redness; + float greenness; + float blueness; + G4int markSize; + G4bool visible; + G4bool square; + G4Colour colour = trajContext->GetStepPtsColour(); + redness = colour.GetRed(); + greenness = colour.GetGreen(); + blueness = colour.GetBlue(); + markSize = (G4int) trajContext->GetStepPtsSize(); + visible = (G4int) trajContext->GetStepPtsVisible(); + square = (trajContext->GetStepPtsType() == G4Polymarker::squares); + + // Avoiding drawing anything black on black. + if(redness == 0. && greenness == 0. && blueness == 0.) + { + redness = 1.; + greenness = 1.; + blueness = 1.; } - - MarkerSizeType sizeType; - G4double size = GetMarkerSize (circle, sizeType); - if (sizeType==world) - size = 4.; - - if (drawingTraj) - return; - - if (drawingHit) - InitHit(); - - haveVisible = true; - AddHepRepInstance("Point", circle); - - hepRepXMLWriter->addAttValue("MarkName", "Dot"); - hepRepXMLWriter->addAttValue("MarkSize", (G4int) size); - - hepRepXMLWriter->addPrimitive(); - - G4Point3D center = (fObjectTransformation) * circle.GetPosition(); - hepRepXMLWriter->addPoint(center.x(), center.y(), center.z()); -} - -void G4HepRepFileSceneHandler::AddPrimitive(const G4Square& square) { -#ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddPrimitive(const G4Square& square) called:" - "\n side: " << square.GetWorldRadius() - << G4endl; - PrintThings(); -#endif - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - if (inPrimitives2D) { - if (!warnedAbout2DMarkers) { - G4cout << "HepRepFile does not currently support 2D squares." << G4endl; - warnedAbout2DMarkers = true; - } - return; + // Specify attributes common to all trajectory points. + if(strcmp("Trajectory Step Points", previousName) != 0) + { + hepRepXMLWriter->addAttValue("DrawAs", "Point"); + hepRepXMLWriter->addAttValue("MarkColor", redness, greenness, blueness); + hepRepXMLWriter->addAttValue("MarkSize", markSize); + hepRepXMLWriter->addAttValue("Layer", 110); + hepRepXMLWriter->addAttValue("Visibility", visible); + if(square) + hepRepXMLWriter->addAttValue("MarkName", "square"); + else + hepRepXMLWriter->addAttValue("MarkName", "dot"); } - - MarkerSizeType sizeType; - G4double size = GetMarkerSize (square, sizeType); - if (sizeType==world) - size = 4.; - - if (drawingTraj) - return; - - if (drawingHit) - InitHit(); - - haveVisible = true; - AddHepRepInstance("Point", square); - - hepRepXMLWriter->addAttValue("MarkName", "Square"); - hepRepXMLWriter->addAttValue("MarkSize", (G4int) size); - - hepRepXMLWriter->addPrimitive(); - - G4Point3D center = (fObjectTransformation) * square.GetPosition(); - hepRepXMLWriter->addPoint(center.x(), center.y(), center.z()); + + // Loop over all points on this trajectory. + for(i = 0; i < traj.GetPointEntries(); i++) + { + G4VTrajectoryPoint* aTrajectoryPoint = traj.GetPoint(i); + + // Each point is a separate instance of the type Trajectory Points. + hepRepXMLWriter->addInstance(); + + // Pointers to hold trajectory point attribute values and definitions. + std::vector* rawPointAttValues = + aTrajectoryPoint->CreateAttValues(); + std::vector* pointAttValues = new std::vector; + std::map* pointAttDefs = + new std::map; + + // Get trajectory point attributes and definitions in standard HepRep + // style (uniform units, 3Vectors decomposed). + if(rawPointAttValues) + { + G4bool error = + G4AttCheck(rawPointAttValues, aTrajectoryPoint->GetAttDefs()) + .Standard(pointAttValues, pointAttDefs); + if(error) + { + G4cout + << "G4HepRepFileSceneHandler::AddCompound(traj):" + "\nERROR found during conversion to standard point attributes." + << G4endl; + } + + // Write out point attribute values. + if(pointAttValues) + { + for(iAttVal = pointAttValues->begin(); + iAttVal != pointAttValues->end(); ++iAttVal) + // Do not write out the Aux or Pos attribute. Aux does not conform + // to the HepRep rule that each object can have only one instance of + // a given AttValue. Both of these attributes are redundant to + // actual position information of the point. + if(strcmp(iAttVal->GetName(), "Aux-X") != 0 && + strcmp(iAttVal->GetName(), "Aux-Y") != 0 && + strcmp(iAttVal->GetName(), "Aux-Z") != 0 && + strcmp(iAttVal->GetName(), "Pos-X") != 0 && + strcmp(iAttVal->GetName(), "Pos-Y") != 0 && + strcmp(iAttVal->GetName(), "Pos-Z") != 0) + hepRepXMLWriter->addAttValue(iAttVal->GetName(), + iAttVal->GetValue()); + } + } + + // Clean up point attributes. + delete pointAttDefs; + delete pointAttValues; + delete rawPointAttValues; + + // Each trajectory point is made of a single primitive, a point. + hepRepXMLWriter->addPrimitive(); + G4Point3D vertex = aTrajectoryPoint->GetPosition(); + hepRepXMLWriter->addPoint(vertex.x(), vertex.y(), vertex.z()); + } + } + + // Draw Auxiliary Points + if(trajContext->GetDrawAuxPts()) + { + if(!doneInitTraj) + InitTrajectory(); + // Create Trajectory Points as a subType of Trajectories. + // Note that we should create this heprep type even if there are no actual + // points. This allows the user to tell that points don't exist (admittedly + // odd) rather than that they were omitted by the drawing mode. + previousName = hepRepXMLWriter->prevTypeName[2]; + hepRepXMLWriter->addType("Trajectory Auxiliary Points", 2); + + float redness; + float greenness; + float blueness; + G4int markSize; + G4bool visible; + G4bool square; + G4Colour colour = trajContext->GetAuxPtsColour(); + redness = colour.GetRed(); + greenness = colour.GetGreen(); + blueness = colour.GetBlue(); + markSize = (G4int) trajContext->GetAuxPtsSize(); + visible = (G4int) trajContext->GetAuxPtsVisible(); + square = (trajContext->GetAuxPtsType() == G4Polymarker::squares); + + // Avoiding drawing anything black on black. + if(redness == 0. && greenness == 0. && blueness == 0.) + { + redness = 1.; + greenness = 1.; + blueness = 1.; + } + + // Specify attributes common to all trajectory points. + if(strcmp("Trajectory Auxiliary Points", previousName) != 0) + { + hepRepXMLWriter->addAttValue("DrawAs", "Point"); + hepRepXMLWriter->addAttValue("MarkColor", redness, greenness, blueness); + hepRepXMLWriter->addAttValue("MarkSize", markSize); + hepRepXMLWriter->addAttValue("Layer", 110); + hepRepXMLWriter->addAttValue("Visibility", visible); + if(square) + hepRepXMLWriter->addAttValue("MarkName", "Square"); + else + hepRepXMLWriter->addAttValue("MarkName", "Dot"); + } + + // Loop over all points on this trajectory. + for(i = 0; i < traj.GetPointEntries(); i++) + { + G4VTrajectoryPoint* aTrajectoryPoint = traj.GetPoint(i); + + // Each point is a separate instance of the type Trajectory Points. + hepRepXMLWriter->addInstance(); + + // Pointers to hold trajectory point attribute values and definitions. + std::vector* rawPointAttValues = + aTrajectoryPoint->CreateAttValues(); + std::vector* pointAttValues = new std::vector; + std::map* pointAttDefs = + new std::map; + + // Get trajectory point attributes and definitions in standard HepRep + // style (uniform units, 3Vectors decomposed). + if(rawPointAttValues) + { + G4bool error = + G4AttCheck(rawPointAttValues, aTrajectoryPoint->GetAttDefs()) + .Standard(pointAttValues, pointAttDefs); + if(error) + { + G4cout + << "G4HepRepFileSceneHandler::AddCompound(traj):" + "\nERROR found during conversion to standard point attributes." + << G4endl; + } + + // Write out point attribute values. + if(pointAttValues) + { + for(iAttVal = pointAttValues->begin(); + iAttVal != pointAttValues->end(); ++iAttVal) + // Do not write out the Aux or Pos attribute. Aux does not conform + // to the HepRep rule that each object can have only one instance of + // a given AttValue. Both of these attributes are redundant to + // actual position information of the point. + if(strcmp(iAttVal->GetName(), "Aux-X") != 0 && + strcmp(iAttVal->GetName(), "Aux-Y") != 0 && + strcmp(iAttVal->GetName(), "Aux-Z") != 0 && + strcmp(iAttVal->GetName(), "Pos-X") != 0 && + strcmp(iAttVal->GetName(), "Pos-Y") != 0 && + strcmp(iAttVal->GetName(), "Pos-Z") != 0) + hepRepXMLWriter->addAttValue(iAttVal->GetName(), + iAttVal->GetValue()); + } + } + + // Clean up point attributes. + delete pointAttDefs; + delete pointAttValues; + delete rawPointAttValues; + + // Each trajectory point is made of a single primitive, a point. + G4Point3D vertex = aTrajectoryPoint->GetPosition(); + + // Loop over auxiliary points associated with this Trajectory Point. + const std::vector* auxiliaries = + aTrajectoryPoint->GetAuxiliaryPoints(); + if(0 != auxiliaries) + { + for(size_t iAux = 0; iAux < auxiliaries->size(); ++iAux) + { + const G4ThreeVector auxPos((*auxiliaries)[iAux]); + hepRepXMLWriter->addPrimitive(); + hepRepXMLWriter->addPoint(auxPos.x(), auxPos.y(), auxPos.z()); + } + } + } + } } - -void G4HepRepFileSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) { +void G4HepRepFileSceneHandler::AddCompound(const G4VHit& hit) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) called." - << G4endl; - PrintThings(); + G4cout << "G4HepRepFileSceneHandler::AddCompound(G4VHit&) " << G4endl; #endif - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - if(polyhedron.GetNoFacets()==0)return; - - if (drawingTraj) - return; - - if (drawingHit) - InitHit(); - - haveVisible = true; - AddHepRepInstance("Polygon", polyhedron); - - G4Normal3D surfaceNormal; - G4Point3D vertex; - - G4bool notLastFace; - do { - hepRepXMLWriter->addPrimitive(); - notLastFace = polyhedron.GetNextNormal (surfaceNormal); - - G4int edgeFlag = 1; - G4bool notLastEdge; - do { - notLastEdge = polyhedron.GetNextVertex (vertex, edgeFlag); - vertex = (fObjectTransformation) * vertex; - hepRepXMLWriter->addPoint(vertex.x(), vertex.y(), vertex.z()); - } while (notLastEdge); - } while (notLastFace); + + // Pointers to hold hit attribute values and definitions. + std::vector* rawHitAttValues = hit.CreateAttValues(); + hitAttValues = new std::vector; + hitAttDefs = new std::map; + + // Iterators to use with attribute values and definitions. + std::vector::iterator iAttVal; + std::map::const_iterator iAttDef; + + // Get hit attributes and definitions in standard HepRep style + // (uniform units, 3Vectors decomposed). + if(rawHitAttValues) + { + G4bool error = G4AttCheck(rawHitAttValues, hit.GetAttDefs()) + .Standard(hitAttValues, hitAttDefs); + if(error) + { + G4cout << "G4HepRepFileSceneHandler::AddCompound(hit):" + "\nERROR found during conversion to standard hit attributes." + << G4endl; + } +#ifdef G4HEPREPFILEDEBUG + G4cout << "G4HepRepFileSceneHandler::AddCompound(hit): standardised " + "attributes:\n" + << G4AttCheck(hitAttValues, hitAttDefs) << G4endl; +#endif + delete rawHitAttValues; + } + + // Open the HepRep output file if it is not already open. + CheckFileOpen(); + + // Add the Event Data Type if it hasn't already been added. + if(strcmp("Event Data", hepRepXMLWriter->prevTypeName[0]) != 0) + { + hepRepXMLWriter->addType("Event Data", 0); + hepRepXMLWriter->addInstance(); + } + + // Find out the current HitType. + G4String hitType = "Hits"; + if(hitAttValues) + { + G4bool found = false; + for(iAttVal = hitAttValues->begin(); + iAttVal != hitAttValues->end() && !found; ++iAttVal) + { + if(strcmp(iAttVal->GetName(), "HitType") == 0) + { + hitType = iAttVal->GetValue(); + found = true; + } + } + } + + // Add the Hits Type. + G4String previousName = hepRepXMLWriter->prevTypeName[1]; + hepRepXMLWriter->addType(hitType, 1); + + // If this is the first hit of this event, + // specify attribute values common to all hits. + if(strcmp(hitType, previousName) != 0) + { + hepRepXMLWriter->addAttValue("Layer", 130); + + // Take all Hit attDefs from first hit. + // Would rather be able to get these attDefs without needing a reference + // from any particular hit, but don't know how to do that. Write out hit + // attribute definitions. + if(hitAttValues && hitAttDefs) + { + for(iAttVal = hitAttValues->begin(); iAttVal != hitAttValues->end(); + ++iAttVal) + { + iAttDef = hitAttDefs->find(iAttVal->GetName()); + if(iAttDef != hitAttDefs->end()) + { + // Protect against incorrect use of Category. Anything value other + // than the standard ones will be considered to be in the physics + // category. + G4String category = iAttDef->second.GetCategory(); + if(strcmp(category, "Draw") != 0 && + strcmp(category, "Physics") != 0 && + strcmp(category, "Association") != 0 && + strcmp(category, "PickAction") != 0) + category = "Physics"; + hepRepXMLWriter->addAttDef(iAttVal->GetName(), + iAttDef->second.GetDesc(), category, + iAttDef->second.GetExtra()); + } + } + } + } // end of special treatment for when this is the first hit. + + // Now that we have written out all of the attributes that are based on the + // hit's particulars, call base class to deconstruct hit into a primitives. + drawingHit = true; + doneInitHit = false; + G4VSceneHandler::AddCompound(hit); // Invoke default action. + drawingHit = false; } +void G4HepRepFileSceneHandler::InitTrajectory() +{ + if(!doneInitTraj) + { + // For every trajectory, add an instance of Type Trajectory. + hepRepXMLWriter->addInstance(); -G4HepRepFileXMLWriter *G4HepRepFileSceneHandler::GetHepRepXMLWriter() { - return hepRepXMLWriter; + // Write out the trajectory's attribute values. + if(trajAttValues) + { + std::vector::iterator iAttVal; + for(iAttVal = trajAttValues->begin(); iAttVal != trajAttValues->end(); + ++iAttVal) + hepRepXMLWriter->addAttValue(iAttVal->GetName(), iAttVal->GetValue()); + delete trajAttValues; + } + + // Clean up trajectory attributes. + if(trajAttDefs) + delete trajAttDefs; + + doneInitTraj = true; + } } +void G4HepRepFileSceneHandler::InitHit() +{ + if(!doneInitHit) + { + // For every hit, add an instance of Type Hit. + hepRepXMLWriter->addInstance(); + + // Write out the hit's attribute values. + if(hitAttValues) + { + std::vector::iterator iAttVal; + for(iAttVal = hitAttValues->begin(); iAttVal != hitAttValues->end(); + ++iAttVal) + hepRepXMLWriter->addAttValue(iAttVal->GetName(), iAttVal->GetValue()); + delete hitAttValues; + } + + // Clean up hit attributes. + if(hitAttDefs) + delete hitAttDefs; + + doneInitHit = true; + } +} + +void G4HepRepFileSceneHandler::AddPrimitive(const G4Polyline& polyline) +{ +#ifdef G4HEPREPFILEDEBUG + G4cout << "G4HepRepFileSceneHandler::AddPrimitive(const G4Polyline& " + "polyline) called:" + "\n polyline: " + << polyline << G4endl; + PrintThings(); +#endif + + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + if(inPrimitives2D) + { + if(!warnedAbout2DMarkers) + { + G4cout << "HepRepFile does not currently support 2D lines." << G4endl; + warnedAbout2DMarkers = true; + } + return; + } + + if(drawingTraj) + InitTrajectory(); + + if(drawingHit) + InitHit(); + + haveVisible = true; + AddHepRepInstance("Line", polyline); + + hepRepXMLWriter->addPrimitive(); + + for(size_t i = 0; i < polyline.size(); i++) + { + G4Point3D vertex = (fObjectTransformation) *polyline[i]; + hepRepXMLWriter->addPoint(vertex.x(), vertex.y(), vertex.z()); + } +} + +void G4HepRepFileSceneHandler::AddPrimitive(const G4Polymarker& line) +{ +#ifdef G4HEPREPFILEDEBUG + G4cout + << "G4HepRepFileSceneHandler::AddPrimitive(const G4Polymarker& line) called" + << G4endl; + PrintThings(); +#endif + + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + if(inPrimitives2D) + { + if(!warnedAbout2DMarkers) + { + G4cout << "HepRepFile does not currently support 2D lines." << G4endl; + warnedAbout2DMarkers = true; + } + return; + } + + MarkerSizeType sizeType; + G4double size = GetMarkerSize(line, sizeType); + if(sizeType == world) + size = 4.; + + if(drawingTraj) + return; + + if(drawingHit) + InitHit(); + + haveVisible = true; + AddHepRepInstance("Point", line); + + hepRepXMLWriter->addAttValue("MarkName", "Dot"); + hepRepXMLWriter->addAttValue("MarkSize", (G4int) size); + + hepRepXMLWriter->addPrimitive(); + + for(size_t i = 0; i < line.size(); i++) + { + G4Point3D vertex = (fObjectTransformation) *line[i]; + hepRepXMLWriter->addPoint(vertex.x(), vertex.y(), vertex.z()); + } +} + +void G4HepRepFileSceneHandler::AddPrimitive(const G4Text& text) +{ +#ifdef G4HEPREPFILEDEBUG + G4cout << "G4HepRepFileSceneHandler::AddPrimitive(const G4Text& text) called:" + "\n text: " + << text.GetText() << G4endl; + PrintThings(); +#endif + + if(!inPrimitives2D) + { + if(!warnedAbout3DText) + { + G4cout << "HepRepFile does not currently support 3D text." << G4endl; + G4cout + << "HepRep browsers can directly display text attributes on request." + << G4endl; + G4cout << "See Application Developers Guide for how to attach attributes " + "to viewable objects." + << G4endl; + warnedAbout3DText = true; + } + return; + } + + MarkerSizeType sizeType; + G4double size = GetMarkerSize(text, sizeType); + if(sizeType == world) + size = 12.; + + haveVisible = true; + AddHepRepInstance("Text", text); + + hepRepXMLWriter->addAttValue("VAlign", "Top"); + hepRepXMLWriter->addAttValue("HAlign", "Left"); + hepRepXMLWriter->addAttValue("FontName", "Arial"); + hepRepXMLWriter->addAttValue("FontStyle", "Plain"); + hepRepXMLWriter->addAttValue("FontSize", (G4int) size); + hepRepXMLWriter->addAttValue("FontHasBanner", "TRUE"); + hepRepXMLWriter->addAttValue("FontBannerColor", "0,0,0"); + + const G4Colour& colour = GetTextColour(text); + float redness = colour.GetRed(); + float greenness = colour.GetGreen(); + float blueness = colour.GetBlue(); + + // Avoiding drawing anything black on black. + if(redness == 0. && greenness == 0. && blueness == 0.) + { + redness = 1.; + greenness = 1.; + blueness = 1.; + } + hepRepXMLWriter->addAttValue("FontColor", redness, greenness, blueness); + + hepRepXMLWriter->addPrimitive(); + + hepRepXMLWriter->addAttValue("Text", text.GetText()); + hepRepXMLWriter->addAttValue("VPos", .99 - text.GetYOffset()); + hepRepXMLWriter->addAttValue("HPos", text.GetXOffset()); +} + +void G4HepRepFileSceneHandler::AddPrimitive(const G4Circle& circle) +{ +#ifdef G4HEPREPFILEDEBUG + G4cout + << "G4HepRepFileSceneHandler::AddPrimitive(const G4Circle& circle) called:" + "\n radius: " + << circle.GetWorldRadius() << G4endl; + PrintThings(); +#endif + + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + if(inPrimitives2D) + { + if(!warnedAbout2DMarkers) + { + G4cout << "HepRepFile does not currently support 2D circles." << G4endl; + warnedAbout2DMarkers = true; + } + return; + } + + MarkerSizeType sizeType; + G4double size = GetMarkerSize(circle, sizeType); + if(sizeType == world) + size = 4.; + + if(drawingTraj) + return; + + if(drawingHit) + InitHit(); + + haveVisible = true; + AddHepRepInstance("Point", circle); + + hepRepXMLWriter->addAttValue("MarkName", "Dot"); + hepRepXMLWriter->addAttValue("MarkSize", (G4int) size); + + hepRepXMLWriter->addPrimitive(); + + G4Point3D center = (fObjectTransformation) *circle.GetPosition(); + hepRepXMLWriter->addPoint(center.x(), center.y(), center.z()); +} + +void G4HepRepFileSceneHandler::AddPrimitive(const G4Square& square) +{ +#ifdef G4HEPREPFILEDEBUG + G4cout + << "G4HepRepFileSceneHandler::AddPrimitive(const G4Square& square) called:" + "\n side: " + << square.GetWorldRadius() << G4endl; + PrintThings(); +#endif + + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + if(inPrimitives2D) + { + if(!warnedAbout2DMarkers) + { + G4cout << "HepRepFile does not currently support 2D squares." << G4endl; + warnedAbout2DMarkers = true; + } + return; + } + + MarkerSizeType sizeType; + G4double size = GetMarkerSize(square, sizeType); + if(sizeType == world) + size = 4.; + + if(drawingTraj) + return; + + if(drawingHit) + InitHit(); + + haveVisible = true; + AddHepRepInstance("Point", square); + + hepRepXMLWriter->addAttValue("MarkName", "Square"); + hepRepXMLWriter->addAttValue("MarkSize", (G4int) size); + + hepRepXMLWriter->addPrimitive(); + + G4Point3D center = (fObjectTransformation) *square.GetPosition(); + hepRepXMLWriter->addPoint(center.x(), center.y(), center.z()); +} + +void G4HepRepFileSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) +{ +#ifdef G4HEPREPFILEDEBUG + G4cout << "G4HepRepFileSceneHandler::AddPrimitive(const G4Polyhedron& " + "polyhedron) called." + << G4endl; + PrintThings(); +#endif + + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + if(polyhedron.GetNoFacets() == 0) + return; + + if(drawingTraj) + return; + + if(drawingHit) + InitHit(); + + haveVisible = true; + AddHepRepInstance("Polygon", polyhedron); + + G4Normal3D surfaceNormal; + G4Point3D vertex; + + G4bool notLastFace; + do + { + hepRepXMLWriter->addPrimitive(); + notLastFace = polyhedron.GetNextNormal(surfaceNormal); + + G4int edgeFlag = 1; + G4bool notLastEdge; + do + { + notLastEdge = polyhedron.GetNextVertex(vertex, edgeFlag); + vertex = (fObjectTransformation) *vertex; + hepRepXMLWriter->addPoint(vertex.x(), vertex.y(), vertex.z()); + } while(notLastEdge); + } while(notLastFace); +} + +G4HepRepFileXMLWriter* G4HepRepFileSceneHandler::GetHepRepXMLWriter() +{ + return hepRepXMLWriter; +} void G4HepRepFileSceneHandler::AddHepRepInstance(const char* primName, - const G4Visible visible) { + const G4Visible visible) +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddHepRepInstance called." - << G4endl; + G4cout << "G4HepRepFileSceneHandler::AddHepRepInstance called." << G4endl; #endif - - // Open the HepRep output file if it is not already open. - CheckFileOpen(); - - G4VPhysicalVolume* pCurrentPV = 0; - G4LogicalVolume* pCurrentLV = 0; - G4int currentDepth = 0; - G4PhysicalVolumeModel* pPVModel = dynamic_cast(fpModel); - if (pPVModel) { - pCurrentPV = pPVModel->GetCurrentPV(); - pCurrentLV = pPVModel->GetCurrentLV(); - currentDepth = pPVModel->GetCurrentDepth(); - } - -#ifdef G4HEPREPFILEDEBUG - G4cout << - "pCurrentPV:" << pCurrentPV << ", readyForTransients:" << fReadyForTransients - << G4endl; -#endif - - if (drawingTraj || drawingHit) { - // In this case, HepRep type, layer and instance were already created - // in the AddCompound method. - } - else if (fReadyForTransients) { - if (strcmp("Event Data",hepRepXMLWriter->prevTypeName[0])!=0) { - hepRepXMLWriter->addType("Event Data",0); - hepRepXMLWriter->addInstance(); - } - - // Applications have the option of either calling AddSolid(G4VTrajectory&) and - // AddSolid(G4VHits&), or of just decomposing these into simpler primitives. - // In the former case, drawing will be handled above and will include setting of - // physics attributes. - // In the latter case, which is an older style of working, we end up drawing the - // trajectories and hits here, where we have no access to physics attributes. - // We receive primitives here. We can figure out that these are transients, but we - // have to guess exactly what these transients represent. - // We assume the primitives are being used as in G4VTrajectory, hence we assume: - // Lines are Trajectories - // Squares that come after we've seen trajectories are Auxiliary Points - // Circles that come after we've seen trajectories are Step Points - // Other primitives are Hits - - int layer; - - if (strcmp("Text",primName)==0) { - hepRepXMLWriter->addType("EventID",1); - } else { - if (strcmp("Line",primName)==0) { - hepRepXMLWriter->addType("TransientPolylines",1); - layer = 100; - } else { - if (strcmp(hepRepXMLWriter->prevTypeName[1],"TransientPolylines")==0 && - strcmp("Square",primName)==0) - { - hepRepXMLWriter->addType("AuxiliaryPoints",2); - layer = 110; - } else { - if (strcmp(hepRepXMLWriter->prevTypeName[1],"TransientPolylines")==0 && - strcmp("Circle",primName)==0) - { - hepRepXMLWriter->addType("StepPoints",2); - layer = 120; - } else { - hepRepXMLWriter->addType("Hits",1); - layer = 130; - } - } - } - hepRepXMLWriter->addAttValue("Layer",layer); - } - - hepRepXMLWriter->addInstance(); - - // Handle Type declaration for Axes, Ruler, etc. - } else if (pCurrentPV==0) { - if (strcmp("AxesEtc",hepRepXMLWriter->prevTypeName[0])!=0) { - hepRepXMLWriter->addType("AxesEtc",0); - hepRepXMLWriter->addInstance(); - } - - int layer; - - if (strcmp("Text",primName)==0) { - hepRepXMLWriter->addType("Text",1); - } else { - if (strcmp("Line",primName)==0) { - hepRepXMLWriter->addType("Polylines",1); - layer = 100; - } else { - hepRepXMLWriter->addType("Points",1); - layer = 130; - } - hepRepXMLWriter->addAttValue("Layer",layer); - } - - hepRepXMLWriter->addInstance(); - - // Handle Type declaration for Detector Geometry, - // replacing G4's top geometry level name "worldPhysical" with the - // name "Detector Geometry". - } else { - //G4cout << "CurrentDepth" << currentDepth << G4endl; - //G4cout << "currentName" << pCurrentPV->GetName() << G4endl; - if (strcmp("Detector Geometry",hepRepXMLWriter->prevTypeName[0])!=0) { - //G4cout << "Adding Det Geom type" << G4endl; - hepRepXMLWriter->addType("Detector Geometry",0); - hepRepXMLWriter->addInstance(); - } - - // Re-insert any layers of the hierarchy that were removed by G4's culling process. - // Don't bother checking if same type name as last instance. - if(strcmp(hepRepXMLWriter->prevTypeName[currentDepth+1],pCurrentPV->GetName())!=0) { - //G4cout << "Looking for mother of:" << pCurrentLV->GetName() << G4endl; - typedef G4PhysicalVolumeModel::G4PhysicalVolumeNodeID PVNodeID; - typedef std::vector PVPath; - const PVPath& drawnPVPath = pPVModel->GetDrawnPVPath(); - PVPath::const_reverse_iterator ri = ++drawnPVPath.rbegin(); - G4int drawnMotherDepth; - if (ri != drawnPVPath.rend()) { - // This volume has a mother. - drawnMotherDepth = ri->GetNonCulledDepth(); - //G4cout << "drawnMotherDepth" << drawnMotherDepth << G4endl; - } else { - // This volume has no mother. Must be a top level volume. - drawnMotherDepth = -1; - //G4cout << "Mother must be very top" << G4endl; - } - - while (drawnMotherDepth < (currentDepth-1)) { - G4String culledParentName = "Culled parent of " + pCurrentPV->GetName(); - //G4cout << "Inserting culled layer " << culledParentName << " at depth:" << drawnMotherDepth+2 << G4endl; - hepRepXMLWriter->addType(culledParentName, drawnMotherDepth+2); - hepRepXMLWriter->addInstance(); - drawnMotherDepth ++; - } - } - - // Add the HepRepType for the current volume. - hepRepXMLWriter->addType(pCurrentPV->GetName(),currentDepth+1); - hepRepXMLWriter->addInstance(); - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (fpVisAttribs && (fpVisAttribs->IsVisible()==0) && messenger->getCullInvisibles()) - return; - - // Additional attributes. - hepRepXMLWriter->addAttValue("Layer",hepRepXMLWriter->typeDepth); - hepRepXMLWriter->addAttValue("LVol", pCurrentLV->GetName()); - G4Region* region = pCurrentLV->GetRegion(); - G4String regionName = region? region->GetName(): G4String("No region"); - hepRepXMLWriter->addAttValue("Region", regionName); - hepRepXMLWriter->addAttValue("RootRegion", pCurrentLV->IsRootRegion()); - hepRepXMLWriter->addAttValue("Solid", pCurrentLV->GetSolid()->GetName()); - hepRepXMLWriter->addAttValue("EType", pCurrentLV->GetSolid()->GetEntityType()); - G4Material * material = pPVModel->GetCurrentMaterial(); - G4String matName = material? material->GetName(): G4String("No material"); - hepRepXMLWriter->addAttValue("Material", matName); - G4double matDensity = material? material->GetDensity(): 0.; - hepRepXMLWriter->addAttValue("Density", matDensity*m3/kg); - G4State matState = material? material->GetState(): kStateUndefined; - hepRepXMLWriter->addAttValue("State", matState); - G4double matRadlen = material? material->GetRadlen(): 0.; - hepRepXMLWriter->addAttValue("Radlen", matRadlen/m); - } - - hepRepXMLWriter->addAttValue("DrawAs",primName); - - // Handle color and visibility attributes. - float redness; - float greenness; - float blueness; - G4bool isVisible; - - if (fpVisAttribs || haveVisible) { - G4Colour colour; - - if (fpVisAttribs) { - colour = fpVisAttribs->GetColour(); - isVisible = fpVisAttribs->IsVisible(); - } else { - colour = visible.GetVisAttributes()->GetColour(); - isVisible = fpViewer-> - GetApplicableVisAttributes(visible.GetVisAttributes())->IsVisible(); - } - redness = colour.GetRed(); - greenness = colour.GetGreen(); - blueness = colour.GetBlue(); - - // Avoiding drawing anything black on black. - if (redness==0. && greenness==0. && blueness==0.) { - redness = 1.; - greenness = 1.; - blueness = 1.; - } - } else { + // Open the HepRep output file if it is not already open. + CheckFileOpen(); + + G4VPhysicalVolume* pCurrentPV = 0; + G4LogicalVolume* pCurrentLV = 0; + G4int currentDepth = 0; + G4PhysicalVolumeModel* pPVModel = + dynamic_cast(fpModel); + if(pPVModel) + { + pCurrentPV = pPVModel->GetCurrentPV(); + pCurrentLV = pPVModel->GetCurrentLV(); + currentDepth = pPVModel->GetCurrentDepth(); + } + #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::AddHepRepInstance using default colour." - << G4endl; + G4cout << "pCurrentPV:" << pCurrentPV + << ", readyForTransients:" << fReadyForTransients << G4endl; #endif - redness = 1.; - greenness = 1.; - blueness = 1.; - isVisible = true; - } - - if (strcmp(primName,"Point")==0) - hepRepXMLWriter->addAttValue("MarkColor",redness,greenness,blueness); - else - hepRepXMLWriter->addAttValue("LineColor",redness,greenness,blueness); - - hepRepXMLWriter->addAttValue("Visibility",isVisible); + + if(drawingTraj || drawingHit) + { + // In this case, HepRep type, layer and instance were already created + // in the AddCompound method. + } + else if(fReadyForTransients) + { + if(strcmp("Event Data", hepRepXMLWriter->prevTypeName[0]) != 0) + { + hepRepXMLWriter->addType("Event Data", 0); + hepRepXMLWriter->addInstance(); + } + + // Applications have the option of either calling AddSolid(G4VTrajectory&) + // and AddSolid(G4VHits&), or of just decomposing these into simpler + // primitives. In the former case, drawing will be handled above and will + // include setting of physics attributes. In the latter case, which is an + // older style of working, we end up drawing the trajectories and hits here, + // where we have no access to physics attributes. We receive primitives + // here. We can figure out that these are transients, but we have to guess + // exactly what these transients represent. We assume the primitives are + // being used as in G4VTrajectory, hence we assume: Lines are Trajectories + // Squares that come after we've seen trajectories are Auxiliary Points + // Circles that come after we've seen trajectories are Step Points + // Other primitives are Hits + + int layer; + + if(strcmp("Text", primName) == 0) + { + hepRepXMLWriter->addType("EventID", 1); + } + else + { + if(strcmp("Line", primName) == 0) + { + hepRepXMLWriter->addType("TransientPolylines", 1); + layer = 100; + } + else + { + if(strcmp(hepRepXMLWriter->prevTypeName[1], "TransientPolylines") == + 0 && + strcmp("Square", primName) == 0) + { + hepRepXMLWriter->addType("AuxiliaryPoints", 2); + layer = 110; + } + else + { + if(strcmp(hepRepXMLWriter->prevTypeName[1], "TransientPolylines") == + 0 && + strcmp("Circle", primName) == 0) + { + hepRepXMLWriter->addType("StepPoints", 2); + layer = 120; + } + else + { + hepRepXMLWriter->addType("Hits", 1); + layer = 130; + } + } + } + hepRepXMLWriter->addAttValue("Layer", layer); + } + + hepRepXMLWriter->addInstance(); + + // Handle Type declaration for Axes, Ruler, etc. + } + else if(pCurrentPV == 0) + { + if(strcmp("AxesEtc", hepRepXMLWriter->prevTypeName[0]) != 0) + { + hepRepXMLWriter->addType("AxesEtc", 0); + hepRepXMLWriter->addInstance(); + } + + int layer; + + if(strcmp("Text", primName) == 0) + { + hepRepXMLWriter->addType("Text", 1); + } + else + { + if(strcmp("Line", primName) == 0) + { + hepRepXMLWriter->addType("Polylines", 1); + layer = 100; + } + else + { + hepRepXMLWriter->addType("Points", 1); + layer = 130; + } + hepRepXMLWriter->addAttValue("Layer", layer); + } + + hepRepXMLWriter->addInstance(); + + // Handle Type declaration for Detector Geometry, + // replacing G4's top geometry level name "worldPhysical" with the + // name "Detector Geometry". + } + else + { + // G4cout << "CurrentDepth" << currentDepth << G4endl; + // G4cout << "currentName" << pCurrentPV->GetName() << G4endl; + if(strcmp("Detector Geometry", hepRepXMLWriter->prevTypeName[0]) != 0) + { + // G4cout << "Adding Det Geom type" << G4endl; + hepRepXMLWriter->addType("Detector Geometry", 0); + hepRepXMLWriter->addInstance(); + } + + // Re-insert any layers of the hierarchy that were removed by G4's culling + // process. Don't bother checking if same type name as last instance. + if(strcmp(hepRepXMLWriter->prevTypeName[currentDepth + 1], + pCurrentPV->GetName()) != 0) + { + // G4cout << "Looking for mother of:" << pCurrentLV->GetName() << G4endl; + typedef G4PhysicalVolumeModel::G4PhysicalVolumeNodeID PVNodeID; + typedef std::vector PVPath; + const PVPath& drawnPVPath = pPVModel->GetDrawnPVPath(); + PVPath::const_reverse_iterator ri = ++drawnPVPath.rbegin(); + G4int drawnMotherDepth; + if(ri != drawnPVPath.rend()) + { + // This volume has a mother. + drawnMotherDepth = ri->GetNonCulledDepth(); + // G4cout << "drawnMotherDepth" << drawnMotherDepth << G4endl; + } + else + { + // This volume has no mother. Must be a top level volume. + drawnMotherDepth = -1; + // G4cout << "Mother must be very top" << G4endl; + } + + while(drawnMotherDepth < (currentDepth - 1)) + { + G4String culledParentName = "Culled parent of " + pCurrentPV->GetName(); + // G4cout << "Inserting culled layer " << culledParentName << " at + // depth:" << drawnMotherDepth+2 << G4endl; + hepRepXMLWriter->addType(culledParentName, drawnMotherDepth + 2); + hepRepXMLWriter->addInstance(); + drawnMotherDepth++; + } + } + + // Add the HepRepType for the current volume. + hepRepXMLWriter->addType(pCurrentPV->GetName(), currentDepth + 1); + hepRepXMLWriter->addInstance(); + + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + + if(fpVisAttribs && (fpVisAttribs->IsVisible() == 0) && + messenger->getCullInvisibles()) + return; + + // Additional attributes. + hepRepXMLWriter->addAttValue("Layer", hepRepXMLWriter->typeDepth); + hepRepXMLWriter->addAttValue("LVol", pCurrentLV->GetName()); + G4Region* region = pCurrentLV->GetRegion(); + G4String regionName = region ? region->GetName() : G4String("No region"); + hepRepXMLWriter->addAttValue("Region", regionName); + hepRepXMLWriter->addAttValue("RootRegion", pCurrentLV->IsRootRegion()); + hepRepXMLWriter->addAttValue("Solid", pCurrentLV->GetSolid()->GetName()); + hepRepXMLWriter->addAttValue("EType", + pCurrentLV->GetSolid()->GetEntityType()); + G4Material* material = pPVModel->GetCurrentMaterial(); + G4String matName = material ? material->GetName() : G4String("No material"); + hepRepXMLWriter->addAttValue("Material", matName); + G4double matDensity = material ? material->GetDensity() : 0.; + hepRepXMLWriter->addAttValue("Density", matDensity * m3 / kg); + G4State matState = material ? material->GetState() : kStateUndefined; + hepRepXMLWriter->addAttValue("State", matState); + G4double matRadlen = material ? material->GetRadlen() : 0.; + hepRepXMLWriter->addAttValue("Radlen", matRadlen / m); + } + + hepRepXMLWriter->addAttValue("DrawAs", primName); + + // Handle color and visibility attributes. + float redness; + float greenness; + float blueness; + G4bool isVisible; + + if(fpVisAttribs || haveVisible) + { + G4Colour colour; + + if(fpVisAttribs) + { + colour = fpVisAttribs->GetColour(); + isVisible = fpVisAttribs->IsVisible(); + } + else + { + colour = visible.GetVisAttributes()->GetColour(); + isVisible = + fpViewer->GetApplicableVisAttributes(visible.GetVisAttributes()) + ->IsVisible(); + } + + redness = colour.GetRed(); + greenness = colour.GetGreen(); + blueness = colour.GetBlue(); + + // Avoiding drawing anything black on black. + if(redness == 0. && greenness == 0. && blueness == 0.) + { + redness = 1.; + greenness = 1.; + blueness = 1.; + } + } + else + { +#ifdef G4HEPREPFILEDEBUG + G4cout + << "G4HepRepFileSceneHandler::AddHepRepInstance using default colour." + << G4endl; +#endif + redness = 1.; + greenness = 1.; + blueness = 1.; + isVisible = true; + } + + if(strcmp(primName, "Point") == 0) + hepRepXMLWriter->addAttValue("MarkColor", redness, greenness, blueness); + else + hepRepXMLWriter->addAttValue("LineColor", redness, greenness, blueness); + + hepRepXMLWriter->addAttValue("Visibility", isVisible); } - -void G4HepRepFileSceneHandler::CheckFileOpen() { +void G4HepRepFileSceneHandler::CheckFileOpen() +{ #ifdef G4HEPREPFILEDEBUG - G4cout << - "G4HepRepFileSceneHandler::CheckFileOpen called." - << G4endl; + G4cout << "G4HepRepFileSceneHandler::CheckFileOpen called." << G4endl; #endif - - if (!hepRepXMLWriter->isOpen) { - G4String newFileSpec; - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (messenger->getOverwrite()) { - newFileSpec = messenger->getFileDir()+messenger->getFileName()+".heprep"; - } else { - newFileSpec = messenger->getFileDir()+messenger->getFileName()+G4UIcommand::ConvertToString(fileCounter)+".heprep"; - } - - G4cout << "HepRepFile writing to " << newFileSpec << G4endl; - - hepRepXMLWriter->open(newFileSpec); - - if (!messenger->getOverwrite()) - fileCounter++; - - hepRepXMLWriter->addAttDef("Generator", "HepRep Data Generator", "Physics",""); - G4String versionString = G4Version; - versionString = versionString.substr(1,versionString.size()-2); - versionString = " Geant4 version " + versionString + " " + G4Date; - hepRepXMLWriter->addAttValue("Generator", versionString); - - hepRepXMLWriter->addAttDef("LVol", "Logical Volume", "Physics",""); - hepRepXMLWriter->addAttDef("Region", "Cuts Region", "Physics",""); - hepRepXMLWriter->addAttDef("RootRegion", "Root Region", "Physics",""); - hepRepXMLWriter->addAttDef("Solid", "Solid Name", "Physics",""); - hepRepXMLWriter->addAttDef("EType", "Entity Type", "Physics",""); - hepRepXMLWriter->addAttDef("Material", "Material Name", "Physics",""); - hepRepXMLWriter->addAttDef("Density", "Material Density", "Physics","kg/m3"); - hepRepXMLWriter->addAttDef("State", "Material State", "Physics",""); - hepRepXMLWriter->addAttDef("Radlen", "Material Radiation Length", "Physics","m"); - } + if(!hepRepXMLWriter->isOpen) + { + G4String newFileSpec; + + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + + if(messenger->getOverwrite()) + { + newFileSpec = + messenger->getFileDir() + messenger->getFileName() + ".heprep"; + } + else + { + newFileSpec = messenger->getFileDir() + messenger->getFileName() + + G4UIcommand::ConvertToString(fileCounter) + ".heprep"; + } + + G4cout << "HepRepFile writing to " << newFileSpec << G4endl; + + hepRepXMLWriter->open(newFileSpec); + + if(!messenger->getOverwrite()) + fileCounter++; + + hepRepXMLWriter->addAttDef("Generator", "HepRep Data Generator", "Physics", + ""); + G4String versionString = G4Version; + versionString = versionString.substr(1, versionString.size() - 2); + versionString = " Geant4 version " + versionString + " " + G4Date; + hepRepXMLWriter->addAttValue("Generator", versionString); + + hepRepXMLWriter->addAttDef("LVol", "Logical Volume", "Physics", ""); + hepRepXMLWriter->addAttDef("Region", "Cuts Region", "Physics", ""); + hepRepXMLWriter->addAttDef("RootRegion", "Root Region", "Physics", ""); + hepRepXMLWriter->addAttDef("Solid", "Solid Name", "Physics", ""); + hepRepXMLWriter->addAttDef("EType", "Entity Type", "Physics", ""); + hepRepXMLWriter->addAttDef("Material", "Material Name", "Physics", ""); + hepRepXMLWriter->addAttDef("Density", "Material Density", "Physics", + "kg/m3"); + hepRepXMLWriter->addAttDef("State", "Material State", "Physics", ""); + hepRepXMLWriter->addAttDef("Radlen", "Material Radiation Length", "Physics", + "m"); + } } - -void G4HepRepFileSceneHandler::ClearTransientStore() { - // This is typically called after an update and before drawing hits - // of the next event. To simulate the clearing of "transients" - // (hits, etc.) the detector is redrawn... - if (fpViewer) { - fpViewer -> SetView(); - fpViewer -> ClearView(); - fpViewer -> DrawView(); - } +void G4HepRepFileSceneHandler::ClearTransientStore() +{ + // This is typically called after an update and before drawing hits + // of the next event. To simulate the clearing of "transients" + // (hits, etc.) the detector is redrawn... + if(fpViewer) + { + fpViewer->SetView(); + fpViewer->ClearView(); + fpViewer->DrawView(); + } } diff --git a/source/visualization/HepRep/src/G4HepRepFileViewer.cc b/source/visualization/HepRep/src/G4HepRepFileViewer.cc index e906861108..1bd0a6c3e5 100644 --- a/source/visualization/HepRep/src/G4HepRepFileViewer.cc +++ b/source/visualization/HepRep/src/G4HepRepFileViewer.cc @@ -30,48 +30,52 @@ #include "G4HepRepFileSceneHandler.hh" -//HepRep +// HepRep #include "G4HepRepFileXMLWriter.hh" -G4HepRepFileViewer::G4HepRepFileViewer -(G4VSceneHandler& sceneHandler, const G4String& name): - G4VViewer(sceneHandler, sceneHandler.IncrementViewCount(), name) { - hepRepXMLWriter = ((G4HepRepFileSceneHandler*)(&sceneHandler))->GetHepRepXMLWriter(); +G4HepRepFileViewer::G4HepRepFileViewer(G4VSceneHandler& sceneHandler, + const G4String& name) + : G4VViewer(sceneHandler, sceneHandler.IncrementViewCount(), name) +{ + hepRepXMLWriter = + ((G4HepRepFileSceneHandler*) (&sceneHandler))->GetHepRepXMLWriter(); // Make changes to view parameters for HepRep... fVP.SetCulling(false); fDefaultVP.SetCulling(false); } -G4HepRepFileViewer::~G4HepRepFileViewer() { - ShowView (); -} +G4HepRepFileViewer::~G4HepRepFileViewer() { ShowView(); } -void G4HepRepFileViewer::SetView() { +void G4HepRepFileViewer::SetView() +{ #ifdef G4HEPREPFILEDEBUG G4cout << "G4HepRepFileViewer::SetView() called.=" << G4endl; #endif } -void G4HepRepFileViewer::ClearView() { +void G4HepRepFileViewer::ClearView() +{ #ifdef G4HEPREPFILEDEBUG G4cout << "G4HepRepFileViewer::ClearView() called." << G4endl; #endif } -void G4HepRepFileViewer::DrawView() { +void G4HepRepFileViewer::DrawView() +{ #ifdef G4HEPREPFILEDEBUG G4cout << "G4HepRepFileViewer::DrawView() called." << G4endl; #endif - NeedKernelVisit (); // Always need to visit G4 kernel. - ProcessView (); + NeedKernelVisit(); // Always need to visit G4 kernel. + ProcessView(); } -void G4HepRepFileViewer::ShowView () { +void G4HepRepFileViewer::ShowView() +{ #ifdef G4HEPREPFILEDEBUG G4cout << "G4HepRepFileViewer::ShowView" << G4endl; #endif G4VViewer::ShowView(); - - if (hepRepXMLWriter->isOpen) + + if(hepRepXMLWriter->isOpen) hepRepXMLWriter->close(); } diff --git a/source/visualization/HepRep/src/G4HepRepFileXMLWriter.cc b/source/visualization/HepRep/src/G4HepRepFileXMLWriter.cc index 277dac3aa9..b7e5c7afb7 100644 --- a/source/visualization/HepRep/src/G4HepRepFileXMLWriter.cc +++ b/source/visualization/HepRep/src/G4HepRepFileXMLWriter.cc @@ -55,38 +55,40 @@ void G4HepRepFileXMLWriter::init() typeDepth = -1; int i = -1; - while (i++<49) { + while(i++ < 49) + { prevTypeName[i] = new char[1]; - strcpy(prevTypeName[i],""); + strcpy(prevTypeName[i], ""); - inType[i] = false; + inType[i] = false; inInstance[i] = false; } inPrimitive = false; - inPoint = false; + inPoint = false; } -void G4HepRepFileXMLWriter::addType(const char* name,int newTypeDepth) +void G4HepRepFileXMLWriter::addType(const char* name, int newTypeDepth) { - if (fout.good()) + if(fout.good()) { // Flatten structure if it exceeds maximum allowed typeDepth of 49. - if (newTypeDepth > 49) + if(newTypeDepth > 49) newTypeDepth = 49; - if (newTypeDepth < 0) + if(newTypeDepth < 0) newTypeDepth = 0; // Insert any layers that are missing from the hierarchy (protects against // callers that skip from, say, layer 1 to layer 3 with no layer 2). - while (typeDepth < (newTypeDepth-1)) { + while(typeDepth < (newTypeDepth - 1)) + { addType("Layer Inserted by G4HepRepFileXMLWriter", typeDepth + 1); addInstance(); } // If moving closer to the root, close previously open types. - while (newTypeDepth" - << G4endl; + << G4endl; typeDepth = newTypeDepth; } - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addType No file is currently open." << G4endl; + G4cout << "G4HepRepFileXMLWriter:addType No file is currently open." + << G4endl; #endif } } void G4HepRepFileXMLWriter::addInstance() { - if (fout.good()) + if(fout.good()) { - if (inType[typeDepth]) + if(inType[typeDepth]) { endInstance(); inInstance[typeDepth] = true; indent(); fout << "" << G4endl; - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addInstance No HepRep Type is currently open" << G4endl; + G4cout + << "G4HepRepFileXMLWriter:addInstance No HepRep Type is currently open" + << G4endl; #endif } - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addInstance No file is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addInstance No file is currently open" + << G4endl; #endif } } void G4HepRepFileXMLWriter::addPrimitive() { - if (fout.good()) + if(fout.good()) { - if (inInstance[typeDepth]) + if(inInstance[typeDepth]) { endPrimitive(); inPrimitive = true; indent(); fout << "" << G4endl; - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addPrimitive No HepRep Instance is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addPrimitive No HepRep Instance is " + "currently open" + << G4endl; #endif } - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addPrimitive No file is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addPrimitive No file is currently open" + << G4endl; #endif } } void G4HepRepFileXMLWriter::addPoint(double x, double y, double z) { - if (fout.good()) + if(fout.good()) { - if (inPrimitive) + if(inPrimitive) { endPoint(); inPoint = true; indent(); - - // Include scale and center values - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - G4double scale = messenger->getScale(); - G4ThreeVector center = messenger->getCenter(); - G4double xNew = scale * ( x - center.x()); - G4double yNew = scale * ( y - center.y()); - G4double zNew = scale * ( z - center.z()); - - fout << "" << G4endl; - } else { + + // Include scale and center values + G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); + G4double scale = messenger->getScale(); + G4ThreeVector center = messenger->getCenter(); + G4double xNew = scale * (x - center.x()); + G4double yNew = scale * (y - center.y()); + G4double zNew = scale * (z - center.z()); + + fout << "" << G4endl; + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addPoint No HepRep Primitive is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addPoint No HepRep Primitive is " + "currently open" + << G4endl; #endif } - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addPoint No file is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addPoint No file is currently open" + << G4endl; #endif } } -void G4HepRepFileXMLWriter::addAttDef(const char* name, - const char* desc, - const char* type, - const char* extra) +void G4HepRepFileXMLWriter::addAttDef(const char* name, const char* desc, + const char* type, const char* extra) { - if (fout.good()) + if(fout.good()) { indent(); - fout << " " << G4endl; - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addAttDef No file is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addAttDef No file is currently open" + << G4endl; #endif } } // Four methods to fill attValues -void G4HepRepFileXMLWriter::addAttValue (const char* name, - const char* value) +void G4HepRepFileXMLWriter::addAttValue(const char* name, const char* value) { - if (fout.good()) + if(fout.good()) { indent(); - fout << " " << G4endl; - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" + << G4endl; #endif } } -void G4HepRepFileXMLWriter::addAttValue (const char* name, - double value) +void G4HepRepFileXMLWriter::addAttValue(const char* name, double value) { - if (fout.good()) + if(fout.good()) { indent(); - fout << " " << G4endl; - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" + << G4endl; #endif } } -void G4HepRepFileXMLWriter::addAttValue (const char* name, - int value) +void G4HepRepFileXMLWriter::addAttValue(const char* name, int value) { - if (fout.good()) + if(fout.good()) { indent(); - fout << " " << G4endl; - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" + << G4endl; #endif } } -void G4HepRepFileXMLWriter::addAttValue (const char* name, - bool value) +void G4HepRepFileXMLWriter::addAttValue(const char* name, bool value) { - if (fout.good()) + if(fout.good()) { indent(); - fout << " " << G4endl; else fout << " value=\"False\"/>" << G4endl; - } else { + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" + << G4endl; #endif } } -void G4HepRepFileXMLWriter::addAttValue (const char* name, - double value1, - double value2, - double value3) +void G4HepRepFileXMLWriter::addAttValue(const char* name, double value1, + double value2, double value3) { - if (fout.good()) + if(fout.good()) { - int redness = int(value1*255.); - int greenness = int(value2*255.); - int blueness = int(value3*255.); + int redness = int(value1 * 255.); + int greenness = int(value2 * 255.); + int blueness = int(value3 * 255.); indent(); - fout << " " << G4endl; - } else { + fout << " value=\"" << redness << "," << greenness << "," << blueness + << "\"/>" << G4endl; + } + else + { #ifdef G4HEPREPFILEDEBUG - G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" << G4endl; + G4cout << "G4HepRepFileXMLWriter:addAttValue No file is currently open" + << G4endl; #endif } } void G4HepRepFileXMLWriter::open(const char* fileSpec) { - if (isOpen) + if(isOpen) close(); - + fout.open(fileSpec); - - if (fout.good()) { + + if(fout.good()) + { fout << "" << G4endl; - fout << "" << G4endl; - + fout << "" + << G4endl; + isOpen = true; init(); - } else { - G4cout << "G4HepRepFileXMLWriter:open Unable to write to file " << fileSpec << G4endl; + } + else + { + G4cout << "G4HepRepFileXMLWriter:open Unable to write to file " << fileSpec + << G4endl; } } @@ -322,11 +374,14 @@ void G4HepRepFileXMLWriter::close() // Close any remaining open Types endTypes(); - if (fout.good()) { + if(fout.good()) + { fout << "" << G4endl; - fout.close( ); + fout.close(); isOpen = false; - } else { + } + else + { G4cout << "G4HepRepFileXMLWriter:close No file is currently open" << G4endl; } } @@ -334,8 +389,8 @@ void G4HepRepFileXMLWriter::close() void G4HepRepFileXMLWriter::endTypes() { // Close any remaining open Types - while(typeDepth>-1) - endType(); + while(typeDepth > -1) + endType(); } void G4HepRepFileXMLWriter::endType() @@ -344,15 +399,15 @@ void G4HepRepFileXMLWriter::endType() indent(); fout << "" << G4endl; inType[typeDepth] = false; - delete [] prevTypeName[typeDepth]; + delete[] prevTypeName[typeDepth]; prevTypeName[typeDepth] = new char[1]; - strcpy(prevTypeName[typeDepth],""); + strcpy(prevTypeName[typeDepth], ""); typeDepth--; } void G4HepRepFileXMLWriter::endInstance() { - if (inInstance[typeDepth]) + if(inInstance[typeDepth]) { endPrimitive(); indent(); @@ -363,7 +418,7 @@ void G4HepRepFileXMLWriter::endInstance() void G4HepRepFileXMLWriter::endPrimitive() { - if (inPrimitive) + if(inPrimitive) { endPoint(); indent(); @@ -374,7 +429,7 @@ void G4HepRepFileXMLWriter::endPrimitive() void G4HepRepFileXMLWriter::endPoint() { - if (inPoint) + if(inPoint) { indent(); fout << "" << G4endl; @@ -384,19 +439,20 @@ void G4HepRepFileXMLWriter::endPoint() void G4HepRepFileXMLWriter::indent() { - if (fout.good()) + if(fout.good()) { int i = 0; - while (inType[i] && i<12) { + while(inType[i] && i < 12) + { fout << " "; - if (inInstance[i]) + if(inInstance[i]) fout << " "; i++; } - if (inPrimitive) + if(inPrimitive) fout << " "; - if (inPoint) + if(inPoint) fout << " "; } } diff --git a/source/visualization/HepRep/src/G4HepRepMessenger.cc b/source/visualization/HepRep/src/G4HepRepMessenger.cc index d0601d72d7..63f7514795 100644 --- a/source/visualization/HepRep/src/G4HepRepMessenger.cc +++ b/source/visualization/HepRep/src/G4HepRepMessenger.cc @@ -26,244 +26,302 @@ // #include "G4HepRepMessenger.hh" -G4HepRepMessenger* -G4HepRepMessenger::fpInstance = 0; +G4HepRepMessenger* G4HepRepMessenger::fpInstance = 0; -G4HepRepMessenger* -G4HepRepMessenger::GetInstance() +G4HepRepMessenger* G4HepRepMessenger::GetInstance() { - if (!fpInstance) fpInstance = new G4HepRepMessenger; - return fpInstance; + if(!fpInstance) + fpInstance = new G4HepRepMessenger; + return fpInstance; } -G4HepRepMessenger::G4HepRepMessenger() : - fileDir(""), - fileName("G4Data"), - overwrite(false), - cullInvisibles(false), - cylAsPolygons(false), - scale(1.), - suffix (""), - geometry(true), - pointAttributes(false), - solids(true), - invisibles(true) { +G4HepRepMessenger::G4HepRepMessenger() + : fileDir("") + , fileName("G4Data") + , overwrite(false) + , cullInvisibles(false) + , cylAsPolygons(false) + , scale(1.) + , suffix("") + , geometry(true) + , pointAttributes(false) + , solids(true) + , invisibles(true) +{ + heprepDirectory = new G4UIdirectory("/vis/heprep/"); + heprepDirectory->SetGuidance("HepRep commands."); - heprepDirectory = new G4UIdirectory("/vis/heprep/"); - heprepDirectory->SetGuidance("HepRep commands."); - - setFileDirCommand = new G4UIcmdWithAString("/vis/heprep/setFileDir", this); - setFileDirCommand->SetGuidance("Set directory for output."); - setFileDirCommand->SetGuidance("This command is used by HepRepFile, not by HepRepXML."); - setFileDirCommand->SetParameterName("directory",false); - if ( std::getenv( "G4HEPREPFILE_DIR" ) == NULL ) { - setFileDirCommand->SetDefaultValue(""); - } else { - setFileDirCommand->SetDefaultValue(std::getenv("G4HEPREPFILE_DIR")); - fileDir = std::getenv("G4HEPREPFILE_DIR"); - } - setFileDirCommand->AvailableForStates(G4State_Idle); - - setFileNameCommand = new G4UIcmdWithAString("/vis/heprep/setFileName", this); - setFileNameCommand->SetGuidance("Set file name for output."); - setFileNameCommand->SetGuidance("This command is used by HepRepFile, not by HepRepXML."); - setFileNameCommand->SetParameterName("directory",false); - if ( std::getenv( "G4HEPREPFILE_NAME" ) == NULL ) { - setFileNameCommand->SetDefaultValue("G4Data"); - } else { - setFileNameCommand->SetDefaultValue(std::getenv("G4HEPREPFILE_NAME")); - fileName = std::getenv("G4HEPREPFILE_NAME"); - } - setFileNameCommand->AvailableForStates(G4State_Idle); + setFileDirCommand = new G4UIcmdWithAString("/vis/heprep/setFileDir", this); + setFileDirCommand->SetGuidance("Set directory for output."); + setFileDirCommand->SetGuidance( + "This command is used by HepRepFile, not by HepRepXML."); + setFileDirCommand->SetParameterName("directory", false); + if(std::getenv("G4HEPREPFILE_DIR") == NULL) + { + setFileDirCommand->SetDefaultValue(""); + } + else + { + setFileDirCommand->SetDefaultValue(std::getenv("G4HEPREPFILE_DIR")); + fileDir = std::getenv("G4HEPREPFILE_DIR"); + } + setFileDirCommand->AvailableForStates(G4State_Idle); - setOverwriteCommand = new G4UIcmdWithABool("/vis/heprep/setOverwrite", this); - setOverwriteCommand->SetGuidance("Set true to write all output to exact same file name."); - setOverwriteCommand->SetGuidance("Set false to increment the file name for each new output."); - setOverwriteCommand->SetGuidance("This command is used by HepRepFile, not by HepRepXML."); - setOverwriteCommand->SetParameterName("flag",false); - if ( std::getenv( "G4HEPREPFILE_OVERWRITE" ) == NULL ) { - setOverwriteCommand->SetDefaultValue(false); - } else { - setOverwriteCommand->SetDefaultValue(std::getenv("G4HEPREPFILE_OVERWRITE")); - overwrite = setOverwriteCommand->ConvertToBool(std::getenv("G4HEPREPFILE_OVERWRITE")); - } - setOverwriteCommand->AvailableForStates(G4State_Idle); - - setCullInvisiblesCommand = new G4UIcmdWithABool("/vis/heprep/setCullInvisibles", this); - setCullInvisiblesCommand->SetGuidance("Remove invisible objects from output file."); - setCullInvisiblesCommand->SetGuidance("This command is used by HepRepFile, not by HepRepXML."); - setCullInvisiblesCommand->SetParameterName("flag",false); - if ( std::getenv( "G4HEPREPFILE_CULL" ) == NULL ) { - setCullInvisiblesCommand->SetDefaultValue(false); - } else { - setCullInvisiblesCommand->SetDefaultValue(std::getenv("G4HEPREPFILE_CULL")); - cullInvisibles = setCullInvisiblesCommand->ConvertToBool(std::getenv("G4HEPREPFILE_CULL")); - } - setCullInvisiblesCommand->AvailableForStates(G4State_Idle); - - renderCylAsPolygonsCommand = new G4UIcmdWithABool("/vis/heprep/renderCylAsPolygons", this); - renderCylAsPolygonsCommand->SetGuidance("Render cylinders and cones as polygons."); - renderCylAsPolygonsCommand->SetGuidance("This command is used by HepRepFile, not by HepRepXML."); - renderCylAsPolygonsCommand->SetParameterName("flag",false); - renderCylAsPolygonsCommand->SetDefaultValue(false); - renderCylAsPolygonsCommand->AvailableForStates(G4State_Idle); - - setScaleCommand = new G4UIcmdWithADouble("/vis/heprep/scale",this); - setScaleCommand->SetGuidance("Re-Scale coordinates."); - setScaleCommand->SetParameterName("Scale",true); - setScaleCommand->SetDefaultValue(1.); - setScaleCommand->SetRange("Scale > 0"); - - setCenterCommand = new G4UIcmdWith3VectorAndUnit("/vis/heprep/center",this); - setCenterCommand->SetGuidance("Re-Center coordinates."); - setCenterCommand->SetParameterName("CenterX","CenterY","CenterZ",true); - setCenterCommand->SetDefaultValue(G4ThreeVector(0.,0.,0.)); - setCenterCommand->SetDefaultUnit("m"); - - setEventNumberSuffixCommand = new G4UIcmdWithAString("/vis/heprep/setEventNumberSuffix", this); - setEventNumberSuffixCommand->SetGuidance("Write separate event files, appended with given suffix."); - setEventNumberSuffixCommand->SetGuidance("Define the suffix with a pattern such as '-0000'."); - setEventNumberSuffixCommand->SetGuidance("This command is used by HepRepXML, not by HepRepFile."); - setEventNumberSuffixCommand->SetParameterName("suffix",false); - setEventNumberSuffixCommand->SetDefaultValue(""); - setEventNumberSuffixCommand->AvailableForStates(G4State_Idle); - - appendGeometryCommand = new G4UIcmdWithABool("/vis/heprep/appendGeometry", this); - appendGeometryCommand->SetGuidance("Appends copy of geometry to every event."); - appendGeometryCommand->SetGuidance("This command is used by HepRepXML, not by HepRepFile."); - appendGeometryCommand->SetParameterName("flag",false); - appendGeometryCommand->SetDefaultValue(true); - appendGeometryCommand->AvailableForStates(G4State_Idle); + setFileNameCommand = new G4UIcmdWithAString("/vis/heprep/setFileName", this); + setFileNameCommand->SetGuidance("Set file name for output."); + setFileNameCommand->SetGuidance( + "This command is used by HepRepFile, not by HepRepXML."); + setFileNameCommand->SetParameterName("directory", false); + if(std::getenv("G4HEPREPFILE_NAME") == NULL) + { + setFileNameCommand->SetDefaultValue("G4Data"); + } + else + { + setFileNameCommand->SetDefaultValue(std::getenv("G4HEPREPFILE_NAME")); + fileName = std::getenv("G4HEPREPFILE_NAME"); + } + setFileNameCommand->AvailableForStates(G4State_Idle); - addPointAttributesCommand = new G4UIcmdWithABool("/vis/heprep/addPointAttributes", this); - addPointAttributesCommand->SetGuidance("Adds point attributes to the points of trajectories."); - addPointAttributesCommand->SetGuidance("This command is used by HepRepXML, not by HepRepFile."); - addPointAttributesCommand->SetParameterName("flag",false); - addPointAttributesCommand->SetDefaultValue(false); - addPointAttributesCommand->AvailableForStates(G4State_Idle); - - useSolidsCommand = new G4UIcmdWithABool("/vis/heprep/useSolids", this); - useSolidsCommand->SetGuidance("Use HepRep Solids, rather than Geant4 Primitives."); - useSolidsCommand->SetGuidance("This command is used by HepRepXML, not by HepRepFile.."); - useSolidsCommand->SetParameterName("flag",false); - useSolidsCommand->SetDefaultValue(true); - useSolidsCommand->AvailableForStates(G4State_Idle); + setOverwriteCommand = new G4UIcmdWithABool("/vis/heprep/setOverwrite", this); + setOverwriteCommand->SetGuidance( + "Set true to write all output to exact same file name."); + setOverwriteCommand->SetGuidance( + "Set false to increment the file name for each new output."); + setOverwriteCommand->SetGuidance( + "This command is used by HepRepFile, not by HepRepXML."); + setOverwriteCommand->SetParameterName("flag", false); + if(std::getenv("G4HEPREPFILE_OVERWRITE") == NULL) + { + setOverwriteCommand->SetDefaultValue(false); + } + else + { + setOverwriteCommand->SetDefaultValue(std::getenv("G4HEPREPFILE_OVERWRITE")); + overwrite = + setOverwriteCommand->ConvertToBool(std::getenv("G4HEPREPFILE_OVERWRITE")); + } + setOverwriteCommand->AvailableForStates(G4State_Idle); + + setCullInvisiblesCommand = + new G4UIcmdWithABool("/vis/heprep/setCullInvisibles", this); + setCullInvisiblesCommand->SetGuidance( + "Remove invisible objects from output file."); + setCullInvisiblesCommand->SetGuidance( + "This command is used by HepRepFile, not by HepRepXML."); + setCullInvisiblesCommand->SetParameterName("flag", false); + if(std::getenv("G4HEPREPFILE_CULL") == NULL) + { + setCullInvisiblesCommand->SetDefaultValue(false); + } + else + { + setCullInvisiblesCommand->SetDefaultValue(std::getenv("G4HEPREPFILE_CULL")); + cullInvisibles = + setCullInvisiblesCommand->ConvertToBool(std::getenv("G4HEPREPFILE_CULL")); + } + setCullInvisiblesCommand->AvailableForStates(G4State_Idle); + + renderCylAsPolygonsCommand = + new G4UIcmdWithABool("/vis/heprep/renderCylAsPolygons", this); + renderCylAsPolygonsCommand->SetGuidance( + "Render cylinders and cones as polygons."); + renderCylAsPolygonsCommand->SetGuidance( + "This command is used by HepRepFile, not by HepRepXML."); + renderCylAsPolygonsCommand->SetParameterName("flag", false); + renderCylAsPolygonsCommand->SetDefaultValue(false); + renderCylAsPolygonsCommand->AvailableForStates(G4State_Idle); + + setScaleCommand = new G4UIcmdWithADouble("/vis/heprep/scale", this); + setScaleCommand->SetGuidance("Re-Scale coordinates."); + setScaleCommand->SetParameterName("Scale", true); + setScaleCommand->SetDefaultValue(1.); + setScaleCommand->SetRange("Scale > 0"); + + setCenterCommand = new G4UIcmdWith3VectorAndUnit("/vis/heprep/center", this); + setCenterCommand->SetGuidance("Re-Center coordinates."); + setCenterCommand->SetParameterName("CenterX", "CenterY", "CenterZ", true); + setCenterCommand->SetDefaultValue(G4ThreeVector(0., 0., 0.)); + setCenterCommand->SetDefaultUnit("m"); + + setEventNumberSuffixCommand = + new G4UIcmdWithAString("/vis/heprep/setEventNumberSuffix", this); + setEventNumberSuffixCommand->SetGuidance( + "Write separate event files, appended with given suffix."); + setEventNumberSuffixCommand->SetGuidance( + "Define the suffix with a pattern such as '-0000'."); + setEventNumberSuffixCommand->SetGuidance( + "This command is used by HepRepXML, not by HepRepFile."); + setEventNumberSuffixCommand->SetParameterName("suffix", false); + setEventNumberSuffixCommand->SetDefaultValue(""); + setEventNumberSuffixCommand->AvailableForStates(G4State_Idle); + + appendGeometryCommand = + new G4UIcmdWithABool("/vis/heprep/appendGeometry", this); + appendGeometryCommand->SetGuidance( + "Appends copy of geometry to every event."); + appendGeometryCommand->SetGuidance( + "This command is used by HepRepXML, not by HepRepFile."); + appendGeometryCommand->SetParameterName("flag", false); + appendGeometryCommand->SetDefaultValue(true); + appendGeometryCommand->AvailableForStates(G4State_Idle); + + addPointAttributesCommand = + new G4UIcmdWithABool("/vis/heprep/addPointAttributes", this); + addPointAttributesCommand->SetGuidance( + "Adds point attributes to the points of trajectories."); + addPointAttributesCommand->SetGuidance( + "This command is used by HepRepXML, not by HepRepFile."); + addPointAttributesCommand->SetParameterName("flag", false); + addPointAttributesCommand->SetDefaultValue(false); + addPointAttributesCommand->AvailableForStates(G4State_Idle); + + useSolidsCommand = new G4UIcmdWithABool("/vis/heprep/useSolids", this); + useSolidsCommand->SetGuidance( + "Use HepRep Solids, rather than Geant4 Primitives."); + useSolidsCommand->SetGuidance( + "This command is used by HepRepXML, not by HepRepFile.."); + useSolidsCommand->SetParameterName("flag", false); + useSolidsCommand->SetDefaultValue(true); + useSolidsCommand->AvailableForStates(G4State_Idle); } -G4HepRepMessenger::~G4HepRepMessenger() { - delete setFileDirCommand; - delete setFileNameCommand; - delete setOverwriteCommand; - delete setCullInvisiblesCommand; - delete renderCylAsPolygonsCommand; - delete setScaleCommand; - delete setCenterCommand; - delete setEventNumberSuffixCommand; - delete appendGeometryCommand; - delete addPointAttributesCommand; - delete useSolidsCommand; - delete heprepDirectory; +G4HepRepMessenger::~G4HepRepMessenger() +{ + delete setFileDirCommand; + delete setFileNameCommand; + delete setOverwriteCommand; + delete setCullInvisiblesCommand; + delete renderCylAsPolygonsCommand; + delete setScaleCommand; + delete setCenterCommand; + delete setEventNumberSuffixCommand; + delete appendGeometryCommand; + delete addPointAttributesCommand; + delete useSolidsCommand; + delete heprepDirectory; } -G4String G4HepRepMessenger::GetCurrentValue(G4UIcommand * command) { - if (command==setFileDirCommand) { - return fileDir; - } else if (command==setFileNameCommand) { - return fileName; - } else if (command==setOverwriteCommand) { - return overwrite; - } else if (command==setCullInvisiblesCommand) { - return cullInvisibles; - } else if (command==renderCylAsPolygonsCommand) { - return renderCylAsPolygonsCommand->ConvertToString(cylAsPolygons); - } else if (command==setScaleCommand) { - return setScaleCommand->ConvertToString(scale); - } else if (command==setCenterCommand) { - return setCenterCommand->ConvertToString(center,"m"); - } else if (command==setEventNumberSuffixCommand) { - return suffix; - } else if (command==appendGeometryCommand) { - return appendGeometryCommand->ConvertToString(geometry); - } else if (command==addPointAttributesCommand) { - return addPointAttributesCommand->ConvertToString(pointAttributes); - } else if (command==useSolidsCommand) { - return useSolidsCommand->ConvertToString(solids); - } else { - return ""; - } -} - -void G4HepRepMessenger::SetNewValue(G4UIcommand * command, G4String newValue) { - if (command==setFileDirCommand) { - fileDir = newValue; - } else if (command==setFileNameCommand) { - fileName = newValue; - } else if (command==setOverwriteCommand) { - overwrite = setOverwriteCommand->GetNewBoolValue(newValue); - } else if (command==setCullInvisiblesCommand) { - cullInvisibles = setCullInvisiblesCommand->GetNewBoolValue(newValue); - } else if (command==renderCylAsPolygonsCommand) { - cylAsPolygons = renderCylAsPolygonsCommand->GetNewBoolValue(newValue); - } else if (command==setScaleCommand) { - scale = setScaleCommand->GetNewDoubleValue(newValue); - } else if (command==setCenterCommand) { - center = setCenterCommand->GetNew3VectorValue(newValue); - } else if (command==setEventNumberSuffixCommand) { - suffix = newValue; - } else if (command==appendGeometryCommand) { - geometry = appendGeometryCommand->GetNewBoolValue(newValue); - } else if (command==addPointAttributesCommand) { - pointAttributes = addPointAttributesCommand->GetNewBoolValue(newValue); - } else if (command==useSolidsCommand) { - solids = useSolidsCommand->GetNewBoolValue(newValue); - } -} - -G4String G4HepRepMessenger::getFileDir() { +G4String G4HepRepMessenger::GetCurrentValue(G4UIcommand* command) +{ + if(command == setFileDirCommand) + { return fileDir; -} - -G4String G4HepRepMessenger::getFileName() { + } + else if(command == setFileNameCommand) + { return fileName; -} - -G4bool G4HepRepMessenger::getOverwrite() { - return overwrite; -} - -G4bool G4HepRepMessenger::getCullInvisibles() { - return cullInvisibles; -} - -G4bool G4HepRepMessenger::renderCylAsPolygons() { - return cylAsPolygons; -} - -G4double G4HepRepMessenger::getScale() { - return scale; -} - -G4ThreeVector G4HepRepMessenger::getCenter() { - return center; -} - -G4String G4HepRepMessenger::getEventNumberSuffix() { + } + else if(command == setOverwriteCommand) + { + return G4UIcommand::ConvertToString(overwrite); + } + else if(command == setCullInvisiblesCommand) + { + return G4UIcommand::ConvertToString(cullInvisibles); + } + else if(command == renderCylAsPolygonsCommand) + { + return renderCylAsPolygonsCommand->ConvertToString(cylAsPolygons); + } + else if(command == setScaleCommand) + { + return setScaleCommand->ConvertToString(scale); + } + else if(command == setCenterCommand) + { + return setCenterCommand->ConvertToString(center, "m"); + } + else if(command == setEventNumberSuffixCommand) + { return suffix; + } + else if(command == appendGeometryCommand) + { + return appendGeometryCommand->ConvertToString(geometry); + } + else if(command == addPointAttributesCommand) + { + return addPointAttributesCommand->ConvertToString(pointAttributes); + } + else if(command == useSolidsCommand) + { + return useSolidsCommand->ConvertToString(solids); + } + else + { + return ""; + } } -G4bool G4HepRepMessenger::appendGeometry() { - return geometry; +void G4HepRepMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if(command == setFileDirCommand) + { + fileDir = newValue; + } + else if(command == setFileNameCommand) + { + fileName = newValue; + } + else if(command == setOverwriteCommand) + { + overwrite = setOverwriteCommand->GetNewBoolValue(newValue); + } + else if(command == setCullInvisiblesCommand) + { + cullInvisibles = setCullInvisiblesCommand->GetNewBoolValue(newValue); + } + else if(command == renderCylAsPolygonsCommand) + { + cylAsPolygons = renderCylAsPolygonsCommand->GetNewBoolValue(newValue); + } + else if(command == setScaleCommand) + { + scale = setScaleCommand->GetNewDoubleValue(newValue); + } + else if(command == setCenterCommand) + { + center = setCenterCommand->GetNew3VectorValue(newValue); + } + else if(command == setEventNumberSuffixCommand) + { + suffix = newValue; + } + else if(command == appendGeometryCommand) + { + geometry = appendGeometryCommand->GetNewBoolValue(newValue); + } + else if(command == addPointAttributesCommand) + { + pointAttributes = addPointAttributesCommand->GetNewBoolValue(newValue); + } + else if(command == useSolidsCommand) + { + solids = useSolidsCommand->GetNewBoolValue(newValue); + } } -G4bool G4HepRepMessenger::addPointAttributes() { - return pointAttributes; -} +G4String G4HepRepMessenger::getFileDir() { return fileDir; } -G4bool G4HepRepMessenger::useSolids() { - return solids; -} +G4String G4HepRepMessenger::getFileName() { return fileName; } -G4bool G4HepRepMessenger::writeInvisibles() { - return invisibles; -} +G4bool G4HepRepMessenger::getOverwrite() { return overwrite; } +G4bool G4HepRepMessenger::getCullInvisibles() { return cullInvisibles; } + +G4bool G4HepRepMessenger::renderCylAsPolygons() { return cylAsPolygons; } + +G4double G4HepRepMessenger::getScale() { return scale; } + +G4ThreeVector G4HepRepMessenger::getCenter() { return center; } + +G4String G4HepRepMessenger::getEventNumberSuffix() { return suffix; } + +G4bool G4HepRepMessenger::appendGeometry() { return geometry; } + +G4bool G4HepRepMessenger::addPointAttributes() { return pointAttributes; } + +G4bool G4HepRepMessenger::useSolids() { return solids; } + +G4bool G4HepRepMessenger::writeInvisibles() { return invisibles; } diff --git a/source/visualization/HepRep/src/G4HepRepSceneHandler.cc b/source/visualization/HepRep/src/G4HepRepSceneHandler.cc deleted file mode 100644 index 8ff24822dc..0000000000 --- a/source/visualization/HepRep/src/G4HepRepSceneHandler.cc +++ /dev/null @@ -1,1761 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// - -/** - * @author Mark Donszelmann - */ - -#include - -#include "globals.hh" -#include -#include -// NOTE not available on Solaris 5.2 and Linux g++ 2.95.2 -// #include -#include -#include -#include -#include - -//HepRep -#include "HEPREP/HepRep.h" -#include "G4HepRepMessenger.hh" - -//G4 -#include "G4PhysicalConstants.hh" -#include "G4Vector3D.hh" -#include "G4Version.hh" -#include "G4Types.hh" -#include "G4Point3D.hh" -#include "G4Normal3D.hh" -#include "G4Polyline.hh" -#include "G4Polymarker.hh" -#include "G4Polyhedron.hh" -#include "G4Circle.hh" -#include "G4Square.hh" -#include "G4Text.hh" -#include "G4VPhysicalVolume.hh" -#include "G4VisAttributes.hh" -#include "G4VSolid.hh" -#include "G4VTrajectory.hh" -#include "G4VTrajectoryPoint.hh" -#include "G4VHit.hh" -#include "G4Scene.hh" -#include "G4Material.hh" -#include "G4AttDef.hh" -#include "G4AttValue.hh" -#include "G4AttCheck.hh" - -// CHepRep -#include "cheprep/XMLHepRepFactory.h" - -// This -#include "G4HepRep.hh" -#include "G4HepRepSceneHandler.hh" -#include "G4HepRepViewer.hh" - - -using namespace HEPREP; -using namespace cheprep; -using namespace std; - -G4int G4HepRepSceneHandler::sceneIdCount = 0; - -//#define LDEBUG 1 -//#define SDEBUG 1 -//#define PDEBUG 1 - -G4HepRepSceneHandler::G4HepRepSceneHandler (G4VGraphicsSystem& system, const G4String& name) - : G4VSceneHandler (system, sceneIdCount++, name), - out (0), - geometryLayer ("Geometry"), - eventLayer ("Event"), - calHitLayer ("CalHit"), - trajectoryLayer ("Trajectory"), - hitLayer ("Hit"), - rootVolumeName ("Geometry"), - baseName (""), - eventNumberPrefix (""), - eventNumberSuffix (""), - eventNumber (1), - eventNumberWidth (-1), - extension (""), - writeBinary (false), - writeZip (false), - writeGZ (false), - writeMultipleFiles (false), - currentHit (NULL), - currentTrack (NULL), - _heprep (NULL), - _heprepGeometry (NULL) -{ - -#ifdef LDEBUG - cout << "G4HepRepSceneHandler::G4HepRepSceneHandler: " << system << endl; -#endif - - materialState[kStateSolid] = G4String("Solid"); - materialState[kStateLiquid] = G4String("Liquid"); - materialState[kStateGas] = G4String("Gas"); - materialState[kStateUndefined] = G4String("Undefined"); - - factory = new XMLHepRepFactory(); - writer = NULL; - - // opening of file deferred to closeHepRep(); - openHepRep(); -} - - -G4HepRepSceneHandler::~G4HepRepSceneHandler () { -#ifdef LDEBUG - cout << "G4HepRepSceneHandler::~G4HepRepSceneHandler() " << endl; -#endif - close(); - - delete factory; - factory = NULL; - - G4HepRep* pHepRepSystem = dynamic_cast(GetGraphicsSystem()); - if (pHepRepSystem) pHepRepSystem->removeSceneHandler(); -} - - -void G4HepRepSceneHandler::open(G4String name) { - if (writer != NULL) return; - - if (name == "stdout") { -#ifdef LDEBUG - cout << "G4HepRepSceneHandler::Open() stdout" << endl; -#endif - writer = factory->createHepRepWriter(&cout, false, false); - out = NULL; - baseName = name; - eventNumberPrefix = ""; - eventNumberSuffix = ""; - extension = ""; - writeBinary = false; - writeZip = false; - writeGZ = false; - writeMultipleFiles = false; - eventNumber = 0; - eventNumberWidth = 0; - } else if (name == "stderr") { -#ifdef LDEBUG - cout << "G4HepRepSceneHandler::Open() stderr" << endl; -#endif - writer = factory->createHepRepWriter(&cerr, false, false); - out = NULL; - baseName = name; - eventNumberPrefix = ""; - eventNumberSuffix = ""; - extension = ""; - writeBinary = false; - writeZip = false; - writeGZ = false; - writeMultipleFiles = false; - eventNumber = 0; - eventNumberWidth = 0; - } else { -#ifdef LDEBUG - cout << "G4HepRepSceneHandler::Open() " << name << endl; -#endif - if (eventNumberWidth < 0) { - // derive filename(s) - // check for extensions - const unsigned int numberOfExtensions = 8; - string ext[numberOfExtensions] = {".heprep", ".heprep.xml", ".heprep.zip", ".heprep.gz", - ".bheprep", ".bheprep.xml", ".bheprep.zip", ".bheprep.gz"}; - unsigned int i=0; - while (i < numberOfExtensions) { - int dot = name.size() - ext[i].size(); - if ((dot >= 0) && - (name.substr(dot, ext[i].size()) == ext[i])) break; - i++; - } - - if (i != numberOfExtensions) { - extension = ext[i]; - writeBinary = i >= (numberOfExtensions/2); - writeZip = (i == 2) || (i == 6); - writeGZ = (i == 3) || (i == 7); - - int dot = name.length() - extension.length(); - baseName = (dot >= 0) ? name.substr(0, dot) : ""; - - } else { - // Default for no extension - extension = ".heprep.zip"; - writeBinary = false; - writeZip = true; - writeGZ = false; - baseName = name; - } - - writeMultipleFiles = false; - int startDigit = -1; int endDigit = -1; - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - string suffix = messenger->getEventNumberSuffix(); - if (suffix != "") { - // look for 0000 pattern in suffix - endDigit = suffix.length()-1; - while (endDigit >= 0) { - if (isdigit(suffix.at(endDigit))) break; - endDigit--; - } - if (endDigit < 0) { - cerr << "/vis/heprep/appendEventNumberSuffix contains no digits" << endl; - } else { - writeMultipleFiles = true; - startDigit = endDigit; - while (startDigit >= 0) { - if (!isdigit(suffix.at(startDigit))) break; - startDigit--; - } - startDigit++; - } - } - - if (writeMultipleFiles) { - eventNumberPrefix = suffix.substr(0, startDigit); - eventNumber = atoi(suffix.substr(startDigit, endDigit).c_str()); - eventNumberWidth = endDigit +1 - startDigit; - eventNumberSuffix = suffix.substr(endDigit+1); - } else { - // open single file here - openFile(baseName+extension); - - eventNumber = 1; - eventNumberWidth = 10; - eventNumberPrefix = ""; - eventNumberSuffix = ""; - } - } - } -} - - -void G4HepRepSceneHandler::openHepRep() { -#ifdef LDEBUG - cout << "G4HepRepSceneHandler::OpenHepRep() " << endl; -#endif - - if (_heprep != NULL) return; - - // all done on demand, once pointers are set to NULL - _heprepGeometry = NULL; - _geometryInstanceTree = NULL; - _geometryRootInstance = NULL; - _geometryInstance.clear(); - _geometryTypeTree = NULL; - _geometryRootType = NULL; - _geometryTypeName.clear(); - _geometryType.clear(); - _eventInstanceTree = NULL; - _eventInstance = NULL; - _eventTypeTree = NULL; - _eventType = NULL; - _trajectoryType = NULL; - _hitType = NULL; - _calHitType = NULL; - _calHitFaceType = NULL; -} - - -/** - * Returns true if the HepRep was (already) closed, false if the HepRep is still open - */ -bool G4HepRepSceneHandler::closeHepRep(bool final) { - if (_heprep == NULL) return true; - -#ifdef LDEBUG - cout << "G4HepRepSceneHandler::CloseHepRep() start" << endl; -#endif - - // if this is the final close, then there should not be any event pending to be written. - if (final) { - if (_eventInstanceTree != NULL) { - cerr << "WARNING: you probably used '/vis/viewer/endOfEventAction accumulate' and " - << "forgot to call /vis/viewer/update before exit. No event written." << endl; - } - } else { - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - // add geometry to the heprep if there is an event (separate geometries are written - // using DrawView() called from /vis/viewer/flush) - if (_eventInstanceTree != NULL) { - GetCurrentViewer()->DrawView(); - - // couple geometry - - if ( messenger->appendGeometry()) { - // couple geometry to event if geometry was written - if ((_geometryInstanceTree != NULL)) { - getEventInstanceTree()->addInstanceTree(getGeometryInstanceTree()); - } - } else { - char name[128]; - if (writeMultipleFiles) { - sprintf(name, "%s%s%s#%s", baseName.c_str(), "-geometry", extension.c_str(), "G4GeometryData"); - } else { - sprintf(name, "%s%s#%s", "geometry", (writeBinary ? ".bheprep" : ".heprep"), "G4GeometryData"); - } - getEventInstanceTree()->addInstanceTree(factory->createHepRepTreeID(name, "1.0")); - } - } - - // force inclusion of all subtypes of event - if (_eventInstanceTree != NULL) { - getEventType(); - getTrajectoryType(); - getHitType(); - getCalHitType(); - getCalHitFaceType(); - } - - // Give this HepRep all of the layer order info for both geometry and event, - // since these will both end up in a single HepRep. - writeLayers(_heprepGeometry); - writeLayers(_heprep); - - // open heprep file - if (writer == NULL) { - open((GetScene() == NULL) ? G4String("G4HepRepOutput.heprep.zip") : GetScene()->GetName()); - } - - // write out separate geometry - if (! messenger->appendGeometry() && (_heprepGeometry != NULL)) { - if (writeMultipleFiles) { - char fileName[128]; - sprintf(fileName, "%s%s%s", baseName.c_str(), "-geometry", extension.c_str()); - openFile(G4String(fileName)); - } - - char name[128]; - sprintf(name, "%s%s", "geometry", (writeBinary ? ".bheprep" : ".heprep")); - if (!writeMultipleFiles) { - writer->addProperty("RecordLoop.ignore", name); - } - - writer->write(_heprepGeometry, G4String(name)); - - delete _heprepGeometry; - _heprepGeometry = NULL; - - if (writeMultipleFiles) closeFile(); - } - - if (writeMultipleFiles) { -// NOTE: does not work on Solaris 5.2 and Linux 2.95.2 -// stringstream fileName; -// fileName << baseName << eventNumberPrefix << setw(eventNumberWidth) << setfill('0') << eventNumber << eventNumberSuffix << extension; -// openFile(fileName.str()); -// Use instead: - char fileName[128]; - char fileFormat[128]; - sprintf(fileFormat, "%s%d%s", "%s%s%0", eventNumberWidth, "d%s%s"); - sprintf(fileName, fileFormat, baseName.c_str(), eventNumberPrefix.c_str(), eventNumber, eventNumberSuffix.c_str(), extension.c_str()); - openFile(G4String(fileName)); - } - - // write out the heprep -// NOTE: does not work on Solaris 5.2 and Linux 2.95.2 -// stringstream eventName; -// eventName << "event-" << setw(eventNumberWidth) << setfill('0') << eventNumber << (writeBinary ? ".bheprep" : ".heprep"); -// writer->write(_heprep, eventName.str()); -// Use instead: - char eventName[128]; - char eventFormat[128]; - sprintf(eventFormat, "%s%d%s%s", "event-%0", eventNumberWidth, "d", (writeBinary ? ".bheprep" : ".heprep")); - sprintf(eventName, eventFormat, eventNumber); - if (writer) writer->write(_heprep, G4String(eventName)); - - eventNumber++; - } - - delete _heprep; - _heprep = NULL; - - if (writeMultipleFiles) closeFile(); - - return true; -} - - -void G4HepRepSceneHandler::close() { - -#ifdef LDEBUG - cout << "G4HepRepSceneHandler::Close() " << endl; -#endif - - if (writer == NULL) return; - - if (!writeMultipleFiles) { - closeHepRep(true); - closeFile(); - } - - G4HepRepViewer* viewer = dynamic_cast(GetCurrentViewer()); - viewer->reset(); -} - -void G4HepRepSceneHandler::openFile(G4String name) { - out = new ofstream(name.c_str(), std::ios::out | std::ios::binary ); - writer = factory->createHepRepWriter(out, writeZip, writeZip || writeGZ); -} - -void G4HepRepSceneHandler::closeFile() { - writer->close(); - delete writer; - writer = NULL; - - delete out; - out = NULL; -} - -void G4HepRepSceneHandler::writeLayers(HepRep* heprep) { - if (heprep == NULL) return; - heprep->addLayer(geometryLayer); - heprep->addLayer(eventLayer); - heprep->addLayer(calHitLayer); - heprep->addLayer(trajectoryLayer); - heprep->addLayer(hitLayer); -} - -void G4HepRepSceneHandler::BeginModeling() { -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::BeginModeling() " << endl; -#endif - G4VSceneHandler::BeginModeling(); -} - - -void G4HepRepSceneHandler::EndModeling() { -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::EndModeling() " << endl; -#endif - G4VSceneHandler::EndModeling(); -} - -void G4HepRepSceneHandler::AddSolid(const G4Box& box) { -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::AddSolid(const G4Box& box)" << endl; -#endif - - if (dontWrite()) return; - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (! messenger->useSolids()) { - G4VSceneHandler::AddSolid(box); - return; - } - - G4double dx = box.GetXHalfLength(); - G4double dy = box.GetYHalfLength(); - G4double dz = box.GetZHalfLength(); - - G4Point3D vertex1(G4Point3D( dx, dy,-dz)); - G4Point3D vertex2(G4Point3D( dx,-dy,-dz)); - G4Point3D vertex3(G4Point3D(-dx,-dy,-dz)); - G4Point3D vertex4(G4Point3D(-dx, dy,-dz)); - G4Point3D vertex5(G4Point3D( dx, dy, dz)); - G4Point3D vertex6(G4Point3D( dx,-dy, dz)); - G4Point3D vertex7(G4Point3D(-dx,-dy, dz)); - G4Point3D vertex8(G4Point3D(-dx, dy, dz)); - - vertex1 = (transform) * vertex1; - vertex2 = (transform) * vertex2; - vertex3 = (transform) * vertex3; - vertex4 = (transform) * vertex4; - vertex5 = (transform) * vertex5; - vertex6 = (transform) * vertex6; - vertex7 = (transform) * vertex7; - vertex8 = (transform) * vertex8; - - HepRepInstance* instance = getGeometryOrEventInstance(getCalHitType()); - addAttributes(instance, getCalHitType()); - - setAttribute(instance, "DrawAs", G4String("Prism")); - - setVisibility(instance, box); - setLine(instance, box); - setColor(instance, getColorFor(box)); - - factory->createHepRepPoint(instance, vertex1.x(), vertex1.y(), vertex1.z()); - factory->createHepRepPoint(instance, vertex2.x(), vertex2.y(), vertex2.z()); - factory->createHepRepPoint(instance, vertex3.x(), vertex3.y(), vertex3.z()); - factory->createHepRepPoint(instance, vertex4.x(), vertex4.y(), vertex4.z()); - factory->createHepRepPoint(instance, vertex5.x(), vertex5.y(), vertex5.z()); - factory->createHepRepPoint(instance, vertex6.x(), vertex6.y(), vertex6.z()); - factory->createHepRepPoint(instance, vertex7.x(), vertex7.y(), vertex7.z()); - factory->createHepRepPoint(instance, vertex8.x(), vertex8.y(), vertex8.z()); -} - - -void G4HepRepSceneHandler::AddSolid(const G4Cons& cons) { -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::AddSolid(const G4Cons& cons)" << endl; -#endif - - if (dontWrite()) return; - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (! messenger->useSolids() || (cons.GetDeltaPhiAngle() < twopi)) { - G4VSceneHandler::AddSolid(cons); - return; - } - - G4PhysicalVolumeModel* pPVModel = - dynamic_cast(fpModel); - if (!pPVModel) { - G4VSceneHandler::AddSolid(cons); - return; - } - - G4LogicalVolume* pCurrentLV = pPVModel->GetCurrentLV(); - G4int currentDepth = pPVModel->GetCurrentDepth(); - G4Material* pCurrentMaterial = pPVModel->GetCurrentMaterial(); - - G4Point3D vertex1(G4Point3D( 0., 0., cons.GetZHalfLength())); - G4Point3D vertex2(G4Point3D( 0., 0.,-cons.GetZHalfLength())); - - vertex1 = (transform) * vertex1; - vertex2 = (transform) * vertex2; - - HepRepInstance* instance = getGeometryInstance(pCurrentLV, pCurrentMaterial, currentDepth); - setAttribute(instance, "DrawAs", G4String("Cylinder")); - - setVisibility(instance, cons); - setLine(instance, cons); - setColor(instance, getColorFor(cons)); - - HepRepType* type = getGeometryType(pCurrentLV->GetName(), currentDepth); - - // Outer cylinder. - HepRepInstance* outer = factory->createHepRepInstance(instance, type); - outer->addAttValue("pickParent",true); - outer->addAttValue("showParentAttributes",true); - - HepRepPoint* op1 = factory->createHepRepPoint(outer, vertex1.x(), vertex1.y(), vertex1.z()); - op1->addAttValue("Radius",cons.GetOuterRadiusPlusZ()); - - HepRepPoint* op2 = factory->createHepRepPoint(outer, vertex2.x(), vertex2.y(), vertex2.z()); - op2->addAttValue("Radius",cons.GetOuterRadiusMinusZ()); - - // Inner cylinder. - HepRepInstance* inner = factory->createHepRepInstance(instance, type); - inner->addAttValue("pickParent",true); - inner->addAttValue("showParentAttributes",true); - - HepRepPoint* ip1 = factory->createHepRepPoint(inner, vertex1.x(), vertex1.y(), vertex1.z()); - ip1->addAttValue("Radius",cons.GetInnerRadiusPlusZ()); - - HepRepPoint* ip2 = factory->createHepRepPoint(inner, vertex2.x(), vertex2.y(), vertex2.z()); - ip2->addAttValue("Radius",cons.GetInnerRadiusMinusZ()); -} - - -void G4HepRepSceneHandler::AddSolid(const G4Tubs& tubs) { -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::AddSolid(const G4Tubs& tubs)" << endl; -#endif - - if (dontWrite()) return; - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (! messenger->useSolids() || (tubs.GetDeltaPhiAngle() < twopi)) { - G4VSceneHandler::AddSolid(tubs); - return; - } - - G4PhysicalVolumeModel* pPVModel = - dynamic_cast(fpModel); - if (!pPVModel) { - G4VSceneHandler::AddSolid(tubs); - return; - } - - G4LogicalVolume* pCurrentLV = pPVModel->GetCurrentLV(); - G4int currentDepth = pPVModel->GetCurrentDepth(); - G4Material* pCurrentMaterial = pPVModel->GetCurrentMaterial(); - - G4Point3D vertex1(G4Point3D( 0., 0., tubs.GetZHalfLength())); - G4Point3D vertex2(G4Point3D( 0., 0.,-tubs.GetZHalfLength())); - - vertex1 = (transform) * vertex1; - vertex2 = (transform) * vertex2; - - HepRepInstance* instance = getGeometryInstance(pCurrentLV, pCurrentMaterial, currentDepth); - setAttribute(instance, "DrawAs", G4String("Cylinder")); - - setVisibility(instance, tubs); - setLine(instance, tubs); - setColor(instance, getColorFor(tubs)); - - HepRepType* type = getGeometryType(pCurrentLV->GetName(), currentDepth); - - // Outer cylinder. - HepRepInstance* outer = factory->createHepRepInstance(instance, type); - outer->addAttValue("Radius",tubs.GetOuterRadius()); - outer->addAttValue("pickParent",true); - outer->addAttValue("showParentAttributes",true); - factory->createHepRepPoint(outer, vertex1.x(), vertex1.y(), vertex1.z()); - factory->createHepRepPoint(outer, vertex2.x(), vertex2.y(), vertex2.z()); - - // Inner cylinder. - if (tubs.GetInnerRadius() > 0.) { - HepRepInstance* inner = factory->createHepRepInstance(instance, type); - inner->addAttValue("Radius",tubs.GetInnerRadius()); - inner->addAttValue("pickParent",true); - inner->addAttValue("showParentAttributes",true); - factory->createHepRepPoint(inner, vertex1.x(), vertex1.y(), vertex1.z()); - factory->createHepRepPoint(inner, vertex2.x(), vertex2.y(), vertex2.z()); - } -} - - -void G4HepRepSceneHandler::AddSolid(const G4Trd& trd) { -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::AddSolid(const G4Trd& trd)" << endl; -#endif - if (dontWrite()) return; - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - if (! messenger->useSolids()) { - G4VSceneHandler::AddSolid(trd); - return; - } - - G4double dx1 = trd.GetXHalfLength1(); - G4double dy1 = trd.GetYHalfLength1(); - G4double dx2 = trd.GetXHalfLength2(); - G4double dy2 = trd.GetYHalfLength2(); - G4double dz = trd.GetZHalfLength(); - - G4Point3D vertex1(G4Point3D( dx1, dy1,-dz)); - G4Point3D vertex2(G4Point3D( dx1,-dy1,-dz)); - G4Point3D vertex3(G4Point3D(-dx1,-dy1,-dz)); - G4Point3D vertex4(G4Point3D(-dx1, dy1,-dz)); - G4Point3D vertex5(G4Point3D( dx2, dy2, dz)); - G4Point3D vertex6(G4Point3D( dx2,-dy2, dz)); - G4Point3D vertex7(G4Point3D(-dx2,-dy2, dz)); - G4Point3D vertex8(G4Point3D(-dx2, dy2, dz)); - - vertex1 = (transform) * vertex1; - vertex2 = (transform) * vertex2; - vertex3 = (transform) * vertex3; - vertex4 = (transform) * vertex4; - vertex5 = (transform) * vertex5; - vertex6 = (transform) * vertex6; - vertex7 = (transform) * vertex7; - vertex8 = (transform) * vertex8; - - HepRepInstance* instance = getGeometryOrEventInstance(getCalHitType()); - - addAttributes(instance, getCalHitType()); - - setAttribute(instance, "DrawAs", G4String("Prism")); - - setVisibility(instance, trd); - setLine(instance, trd); - setColor(instance, getColorFor(trd)); - - factory->createHepRepPoint(instance, vertex1.x(), vertex1.y(), vertex1.z()); - factory->createHepRepPoint(instance, vertex2.x(), vertex2.y(), vertex2.z()); - factory->createHepRepPoint(instance, vertex3.x(), vertex3.y(), vertex3.z()); - factory->createHepRepPoint(instance, vertex4.x(), vertex4.y(), vertex4.z()); - factory->createHepRepPoint(instance, vertex5.x(), vertex5.y(), vertex5.z()); - factory->createHepRepPoint(instance, vertex6.x(), vertex6.y(), vertex6.z()); - factory->createHepRepPoint(instance, vertex7.x(), vertex7.y(), vertex7.z()); - factory->createHepRepPoint(instance, vertex8.x(), vertex8.y(), vertex8.z()); -} - -void G4HepRepSceneHandler::AddSolid (const G4Trap& trap) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid (trap); -} - -void G4HepRepSceneHandler::AddSolid (const G4Sphere& sphere) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid (sphere); -} - -void G4HepRepSceneHandler::AddSolid (const G4Para& para) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid (para); -} - -void G4HepRepSceneHandler::AddSolid (const G4Torus& torus) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid (torus); -} - -void G4HepRepSceneHandler::AddSolid (const G4Polycone& polycone) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid (polycone); -} - -void G4HepRepSceneHandler::AddSolid (const G4Polyhedra& polyhedra) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid (polyhedra); -} - -void G4HepRepSceneHandler::AddSolid (const G4Orb& orb) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid (orb); -} - -void G4HepRepSceneHandler::AddSolid (const G4Ellipsoid& ellipsoid) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid (ellipsoid); -} - -void G4HepRepSceneHandler::AddSolid (const G4TessellatedSolid& tess) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid (tess); -} - -void G4HepRepSceneHandler::AddSolid (const G4VSolid& solid) { - if (dontWrite()) return; - G4VSceneHandler::AddSolid(solid); -} - - -void G4HepRepSceneHandler::AddPrimitive (const G4Polyline& line) { - -#ifdef PDEBUG - cout << "G4HepRepSceneHandler::AddPrimitive(G4Polyline&) " << line.size() << endl; -#endif - if (dontWrite()) return; - - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4HepRepSceneHandler::AddPrimitive (const G4Polyline&)", - "vis-HepRep1001", JustWarning, - "2D polylines not implemented. Ignored."); - } - return; - } - - HepRepInstance* instance = factory->createHepRepInstance(getEventInstance(), getTrajectoryType()); - - addAttributes(instance, getTrajectoryType()); - - fpVisAttribs = line.GetVisAttributes(); - setColor(instance, GetColor()); - - setVisibility(instance, line); - - setLine(instance, line); - - for (size_t i=0; i < line.size(); i++) { - G4Point3D vertex = transform * line[i]; - factory->createHepRepPoint(instance, vertex.x(), vertex.y(), vertex.z()); - } -} - - -void G4HepRepSceneHandler::AddPrimitive (const G4Polymarker& line) { - -#ifdef PDEBUG - cout << "G4HepRepSceneHandler::AddPrimitive(G4Polymarker&) " << line.size() << endl; -#endif - if (dontWrite()) return; - - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4HepRepSceneHandler::AddPrimitive (const G4Polymarker&)", - "vis-HepRep1002", JustWarning, - "2D polymarkers not implemented. Ignored."); - } - return; - } - - HepRepInstance* instance = factory->createHepRepInstance(getEventInstance(), getHitType()); - - addAttributes(instance, getHitType()); - - fpVisAttribs = line.GetVisAttributes(); - setColor(instance, GetColor()); - - setVisibility(instance, line); - - setMarker(instance, line); - - // Default MarkName is set to Circle for this Type. - int mtype = line.GetMarkerType(); - - // Cannot be case statement since line.xxx is not a constant - if (mtype == line.dots) { - setAttribute(instance, "Fill", true); - setColor(instance, GetColor(), G4String("FillColor")); - } else if (mtype == line.circles) { - } else if (mtype == line.squares) { - setAttribute(instance, "MarkName", G4String("Box")); - } else { - // line.line + default - setAttribute(instance, "MarkName", G4String("Plus")); - } - - for (size_t i=0; i < line.size(); i++) { - G4Point3D vertex = transform * line[i]; - factory->createHepRepPoint(instance, vertex.x(), vertex.y(), vertex.z()); - } -} - - -void G4HepRepSceneHandler::AddPrimitive (const G4Circle& circle) { -#ifdef PDEBUG - cout << "G4HepRepSceneHandler::AddPrimitive(G4Circle&) " << endl; -#endif - if (dontWrite()) return; - - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4HepRepSceneHandler::AddPrimitive (const G4Circle&)", - "vis-HepRep1003", JustWarning, - "2D circles not implemented. Ignored."); - } - return; - } - - HepRepInstance* instance = factory->createHepRepInstance(getEventInstance(), getHitType()); - - addAttributes(instance, getHitType()); - - G4Point3D center = transform * circle.GetPosition(); - - fpVisAttribs = circle.GetVisAttributes(); - setColor (instance, GetColor()); - - setVisibility(instance, circle); - - setMarker(instance, circle); - - factory->createHepRepPoint(instance, center.x(), center.y(), center.z()); -} - - -void G4HepRepSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { - -#ifdef PDEBUG - cout << "G4HepRepSceneHandler::AddPrimitive(G4Polyhedron&) " << endl; -#endif - if (dontWrite()) return; - - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4HepRepSceneHandler::AddPrimitive (const G4Polyhedron&)", - "vis-HepRep1004", JustWarning, - "2D polyhedra not implemented. Ignored."); - } - return; - } - - G4Normal3D surfaceNormal; - G4Point3D vertex; - - if (polyhedron.GetNoFacets()==0) return; - - HepRepInstance* instance = getGeometryOrEventInstance(getCalHitType()); - - addAttributes(instance, getCalHitType()); - - setVisibility(instance, polyhedron); - - G4int currentDepth = 0; - G4PhysicalVolumeModel* pPVModel = - dynamic_cast(fpModel); - if (pPVModel) currentDepth = pPVModel->GetCurrentDepth(); - - G4bool notLastFace; - do { - HepRepInstance* face; - if (isEventData()) { - face = factory->createHepRepInstance(instance, getCalHitFaceType()); - } else { - face = getGeometryInstance("*Face", currentDepth+1); - setAttribute(face, "PickParent", true); - setAttribute(face, "DrawAs", G4String("Polygon")); - } - - setLine(face, polyhedron); - fpVisAttribs = polyhedron.GetVisAttributes(); - setColor(face, GetColor()); - if (isEventData()) setColor(face, GetColor(), G4String("FillColor")); - - notLastFace = polyhedron.GetNextNormal (surfaceNormal); - - G4int edgeFlag = 1; - G4bool notLastEdge; - do { - notLastEdge = polyhedron.GetNextVertex (vertex, edgeFlag); - vertex = transform * vertex; - factory->createHepRepPoint(face, vertex.x(), vertex.y(), vertex.z()); - } while (notLastEdge); - } while (notLastFace); -} - - -void G4HepRepSceneHandler::AddPrimitive (const G4Text&) { -#ifdef PDEBUG - cout << "G4HepRepSceneHandler::AddPrimitive(G4Text&) " << endl; -#endif - if (dontWrite()) return; - - /*** You may need this - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4HepRepSceneHandler::AddPrimitive (const G4Text&)", - "vis-HepRep1005", JustWarning, - "2D text not implemented. Ignored."); - } - return; - } - ***/ - - cout << "G4HepRepSceneHandler::AddPrimitive G4Text : not yet implemented. " << endl; -} - - -void G4HepRepSceneHandler::AddPrimitive (const G4Square& square) { -#ifdef PDEBUG - cout << "G4HepRepSceneHandler::AddPrimitive(G4Square&) " << endl; -#endif - if (dontWrite()) return; - - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4HepRepSceneHandler::AddPrimitive (const G4Square&)", - "vis-HepRep1006", JustWarning, - "2D squares not implemented. Ignored."); - } - return; - } - - HepRepInstance* instance = factory->createHepRepInstance(getEventInstance(), getHitType()); - - addAttributes(instance, getHitType()); - - G4Point3D center = transform * square.GetPosition(); - - setColor (instance, getColorFor(square)); - - setVisibility(instance, square); - - setMarker(instance, square); - - factory->createHepRepPoint(instance, center.x(), center.y(), center.z()); -} - -void G4HepRepSceneHandler::AddPrimitive (const G4Scale& scale) { - if (dontWrite()) return; - G4VSceneHandler::AddPrimitive(scale); -} - -void G4HepRepSceneHandler::AddCompound (const G4VTrajectory& trajectory) { -#ifdef PDEBUG - cout << "G4HepRepSceneHandler::AddCompound(G4VTrajectory&) " << endl; -#endif - if (dontWrite()) return; - - currentTrack = &trajectory; - G4VSceneHandler::AddCompound(trajectory); - currentTrack = NULL; -} - - -void G4HepRepSceneHandler::AddCompound (const G4VHit& hit) { -#ifdef PDEBUG - cout << "G4HepRepSceneHandler::AddCompound(G4VHit&) " << endl; -#endif - if (dontWrite()) return; - - currentHit = &hit; - G4VSceneHandler::AddCompound(hit); - currentHit = NULL; -} - -void G4HepRepSceneHandler::PreAddSolid (const G4Transform3D& objectTransformation, - const G4VisAttributes& visAttribs) { - - G4VSceneHandler::PreAddSolid (objectTransformation, visAttribs); - - transform = objectTransformation; -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::PreAddSolid(G4Transform3D&, G4VisAttributes&)" << endl; -#endif -} - - -void G4HepRepSceneHandler::PostAddSolid () { -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::PostAddSolid()" << endl; -#endif - G4VSceneHandler::PostAddSolid(); -} - - -void G4HepRepSceneHandler::BeginPrimitives (const G4Transform3D& objectTransformation) { -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::BeginPrimitives(G4Transform3D&)" << endl; -#endif - - G4VSceneHandler::BeginPrimitives (objectTransformation); - transform = objectTransformation; -} - - -void G4HepRepSceneHandler::EndPrimitives () { -#ifdef SDEBUG - cout << "G4HepRepSceneHandler::EndPrimitives" << endl; -#endif - G4VSceneHandler::EndPrimitives (); -} - - -G4bool G4HepRepSceneHandler::dontWrite() { - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - return !( messenger->writeInvisibles() || (fpVisAttribs ? (bool)fpVisAttribs->IsVisible() : true)); -} - -void G4HepRepSceneHandler::setColor (HepRepAttribute *attribute, - const G4Color& color, - const G4String& key) { -#ifdef CDEBUG - cout << "G4HepRepSceneHandler::setColor : red : " << color.GetRed () << - " green : " << color.GetGreen () << - " blue : " << color.GetBlue () << endl; -#endif - - setAttribute(attribute, key, color.GetRed(), color.GetGreen(), color.GetBlue(), color.GetAlpha()); -} - -G4Color G4HepRepSceneHandler::getColorFor (const G4VSolid& /* solid */) { - // fpVisAttribs has been set for solids. - return GetColor(); -} - -G4Color G4HepRepSceneHandler::getColorFor (const G4Visible& visible) { - fpVisAttribs = visible.GetVisAttributes(); - return GetColor(); -} - -void G4HepRepSceneHandler::setVisibility (HepRepAttribute *attribute, const G4VSolid& /* solid */) { - setAttribute(attribute, "Visibility", (fpVisAttribs ? (bool)fpVisAttribs->IsVisible() : true)); -} - -void G4HepRepSceneHandler::setVisibility ( HepRepAttribute *attribute, const G4Visible& visible) { - const G4VisAttributes* atts = visible.GetVisAttributes(); - - setAttribute(attribute, "Visibility", (atts && (atts->IsVisible()==0)) ? false : true); -} - -void G4HepRepSceneHandler::setLine (HepRepAttribute *attribute, const G4VSolid& /* solid*/) { - setAttribute(attribute, "LineWidth", 1.0); -} - -void G4HepRepSceneHandler::setLine (HepRepAttribute *attribute, const G4Visible& visible) { - const G4VisAttributes* atts = visible.GetVisAttributes(); - - setAttribute(attribute, "LineWidth", (atts != NULL) ? atts->GetLineWidth() : 1.0); - - if (atts != NULL) { - switch (atts->GetLineStyle()) { - case G4VisAttributes::dotted: - setAttribute(attribute, "LineStyle", G4String("Dotted")); - break; - case G4VisAttributes::dashed: - setAttribute(attribute, "LineStyle", G4String("Dashed")); - break; - case G4VisAttributes::unbroken: - default: - break; - } - } -} - -void G4HepRepSceneHandler::setMarker (HepRepAttribute *attribute, const G4VMarker& marker) { - MarkerSizeType markerType; - G4double size = GetMarkerRadius( marker , markerType ); - - setAttribute(attribute, "MarkSize", size); - - if (markerType == screen) setAttribute(attribute, "MarkType", G4String("Symbol")); - if (marker.GetFillStyle() == G4VMarker::noFill) { - setAttribute(attribute, "Fill", false); - } else { - fpVisAttribs = marker.GetVisAttributes(); - setColor(attribute, GetColor(), G4String("FillColor")); - } -} - -void G4HepRepSceneHandler::addAttributes(HepRepInstance* instance, HepRepType* type) { - if (currentHit) { - vector* hitAttValues = currentHit->CreateAttValues(); - const map* hitAttDefs = currentHit->GetAttDefs(); - - addAttDefs(getHitType(), hitAttDefs); - - // these attValues are non-standard, so can only be added when we have the attDef. - type->addAttValue("LVol", G4String("")); - type->addAttValue("HitType", G4String("")); - type->addAttValue("ID", -1); - type->addAttValue("Column", -1); - type->addAttValue("Row", -1); - type->addAttValue("Energy", 0.0); - type->addAttValue("Pos", G4String("")); - - addAttVals(instance, hitAttDefs, hitAttValues); - - delete hitAttValues; - - } else if (currentTrack) { - vector* trajectoryAttValues = currentTrack->CreateAttValues(); - const map* trajectoryAttDefs = currentTrack->GetAttDefs(); - - addAttDefs(type, trajectoryAttDefs); - - // these attValues are non-standard, so can only be added when we have the attDef. - type->addAttValue("Ch", 0.0); - type->addAttValue("Color", 1.0, 1.0, 1.0, 1.0); - type->addAttValue("ID", -1); - type->addAttValue("IMom", G4String("")); - type->addAttValue("IMag", 0.0); - type->addAttValue("PDG", -1); - type->addAttValue("PN", G4String("")); - type->addAttValue("PID", -1); - - addAttVals(instance, trajectoryAttDefs, trajectoryAttValues); - - delete trajectoryAttValues; - - } -} - -void G4HepRepSceneHandler::setAttribute(HepRepAttribute* attribute, G4String name, G4String value) { - HepRepAttValue* attValue = attribute->getAttValue(name); - if ((attValue == NULL) || (attValue->getString() != value)) { - HepRepPoint* point = dynamic_cast(attribute); - if (point != NULL) { - if (point->getInstance()->getAttValueFromNode(name) == NULL) { - attribute = point->getInstance(); - } - } - - HepRepInstance* instance = dynamic_cast(attribute); - if (instance != NULL) { - // look for definition on type (node only) - if (instance->getType()->getAttValueFromNode(name) == NULL) { - attribute = instance->getType(); - } - } - - attribute->addAttValue(name, value); - } -} - -void G4HepRepSceneHandler::setAttribute(HepRepAttribute* attribute, G4String name, bool value) { - HepRepAttValue* attValue = attribute->getAttValue(name); - if ((attValue == NULL) || (attValue->getBoolean() != value)) { - HepRepPoint* point = dynamic_cast(attribute); - if (point != NULL) { - if (point->getInstance()->getAttValueFromNode(name) == NULL) { - attribute = point->getInstance(); - } - } - - HepRepInstance* instance = dynamic_cast(attribute); - if (instance != NULL) { - // look for definition on type (node only) - if (instance->getType()->getAttValueFromNode(name) == NULL) { - attribute = instance->getType(); - } - } - - attribute->addAttValue(name, value); - } -} - -void G4HepRepSceneHandler::setAttribute(HepRepAttribute* attribute, G4String name, double value) { - HepRepAttValue* attValue = attribute->getAttValue(name); - if ((attValue == NULL) || (attValue->getDouble() != value)) { - HepRepPoint* point = dynamic_cast(attribute); - if (point != NULL) { - if (point->getInstance()->getAttValueFromNode(name) == NULL) { - attribute = point->getInstance(); - } - } - - HepRepInstance* instance = dynamic_cast(attribute); - if (instance != NULL) { - // look for definition on type (node only) - if (instance->getType()->getAttValueFromNode(name) == NULL) { - attribute = instance->getType(); - } - } - - attribute->addAttValue(name, value); - } -} - -void G4HepRepSceneHandler::setAttribute(HepRepAttribute* attribute, G4String name, int value) { - HepRepAttValue* attValue = attribute->getAttValue(name); - if ((attValue == NULL) || (attValue->getInteger() != value)) { - HepRepPoint* point = dynamic_cast(attribute); - if (point != NULL) { - if (point->getInstance()->getAttValueFromNode(name) == NULL) { - attribute = point->getInstance(); - } - } - - HepRepInstance* instance = dynamic_cast(attribute); - if (instance != NULL) { - // look for definition on type (node only) - if (instance->getType()->getAttValueFromNode(name) == NULL) { - attribute = instance->getType(); - } - } - - attribute->addAttValue(name, value); - } -} - -void G4HepRepSceneHandler::setAttribute(HepRepAttribute* attribute, G4String name, double red, double green, double blue, double alpha) { - HepRepAttValue* attValue = attribute->getAttValue(name); - vector color; - if (attValue != NULL) color = attValue->getColor(); - if ((color.size() == 0) || - (color[0] != red) || - (color[1] != green) || - (color[2] != blue) || - ((color.size() > 3) && (color[3] != alpha))) { - - HepRepPoint* point = dynamic_cast(attribute); - if (point != NULL) { - if (point->getInstance()->getAttValueFromNode(name) == NULL) { - attribute = point->getInstance(); - } - } - - HepRepInstance* instance = dynamic_cast(attribute); - if (instance != NULL) { - // look for definition on type (node only) - if (instance->getType()->getAttValueFromNode(name) == NULL) { - attribute = instance->getType(); - } - } - - attribute->addAttValue(name, red, green, blue, alpha); - } -} - -void G4HepRepSceneHandler::addAttDefs(HepRepDefinition* definition, const map* attDefs) { - if (attDefs == NULL) return; - - // Specify additional attribute definitions. - map::const_iterator attDefIterator = attDefs->begin(); - while (attDefIterator != attDefs->end()) { - definition->addAttDef(attDefIterator->first, attDefIterator->second.GetDesc(), - attDefIterator->second.GetCategory(), attDefIterator->second.GetExtra()); - attDefIterator++; - } -} - -void G4HepRepSceneHandler::addAttVals(HepRepAttribute* attribute, const map* attDefs, vector* attValues) { - if (attValues == NULL) return; - - // Copy the instance's G4AttValues to HepRepAttValues. - for (vector::iterator attValIterator = attValues->begin(); attValIterator != attValues->end(); attValIterator++) { - G4String name = attValIterator->GetName(); - - HepRepPoint* point = dynamic_cast(attribute); - if ((name == "Pos") && (point != NULL)) { - G4String pos = attValIterator->GetValue(); -// cout << "Pos* " << pos << endl; - int is = 0; - int in = 0; - int im = 0; - G4String unit; - for (unsigned int i=0; igetX(); - im = (int)(std::log10(factor)+((factor < 1) ? -0.5 : 0.5)); -// cout << factor << ", " << im << endl; - } else if (in == 3) { - // unit - unit = pos.substr(is, i-is); - if (unit == G4String("mum")) { - im += -6; - } else if (unit == G4String("mm")) { - im += -3; - } else if (unit == G4String("cm")) { - im += -2; - } else if (unit == G4String("m")) { - im += 0; - } else if (unit == G4String("km")) { - im += 3; - } else { - cerr << "HepRepSceneHandler: Unrecognized Unit: '" << unit << "'" << endl; - } - } - is = i+1; - in++; - } - } - switch(im) { - case -6: - unit = G4String("mum"); - break; - case -3: - unit = G4String("mm"); - break; - case -2: - unit = G4String("cm"); - break; - case 0: - unit = G4String("m"); - break; - case 3: - unit = G4String("km"); - break; - default: - cerr << "HepRepSceneHandler: No valid unit found for im: " << im << endl; - unit = G4String("*im"); - break; - } -// cout << "U: " << unit << endl; - setAttribute(attribute, G4String("PointUnit"), unit); - continue; - } - - // NTP already in points being written - if (name == "NTP") continue; - - // find type of attribute using def - const map::const_iterator attDefIterator = attDefs->find(name); - G4String type = attDefIterator->second.GetValueType(); - - // set based on type - if ((type == "G4double") || (type == "double")) { - setAttribute(attribute, attValIterator->GetName(), atof(attValIterator->GetValue())); - } else if ((type == "G4int") || (type == "int")) { - setAttribute(attribute, attValIterator->GetName(), atoi(attValIterator->GetValue())); - } else { // G4String, string and others - setAttribute(attribute, attValIterator->GetName(), attValIterator->GetValue()); - } - } -} - - -bool G4HepRepSceneHandler::isEventData () { - G4PhysicalVolumeModel* pPVModel = - dynamic_cast(fpModel); - return !pPVModel || fReadyForTransients || currentHit || currentTrack; -} - -void G4HepRepSceneHandler::addTopLevelAttributes(HepRepType* type) { - - // Some non-standard attributes - type->addAttDef( "Generator", "Generator of the file", "General", ""); - type->addAttValue("Generator", G4String("Geant4")); - - type->addAttDef( "GeneratorVersion", "Version of the Generator", "General", ""); - G4String versionString = G4Version; - versionString = versionString.substr(1,versionString.size()-2); - versionString = " Geant4 version " + versionString + " " + G4Date; - type->addAttValue("GeneratorVersion", versionString); - - const G4ViewParameters parameters = GetCurrentViewer()->GetViewParameters(); - const G4Vector3D& viewPointDirection = parameters.GetViewpointDirection(); - type->addAttDef( "ViewTheta", "Theta of initial suggested viewpoint", "Draw", "rad"); - type->addAttValue("ViewTheta", viewPointDirection.theta()); - - type->addAttDef( "ViewPhi", "Phi of initial suggested viewpoint", "Draw", "rad"); - type->addAttValue("ViewPhi", viewPointDirection.phi()); - - type->addAttDef( "ViewScale", "Scale of initial suggested viewpoint", "Draw", ""); - type->addAttValue("ViewScale", parameters.GetZoomFactor()); - -// FIXME, no way to set these - type->addAttDef( "ViewTranslateX", "Translate in X of initial suggested viewpoint", "Draw", ""); - type->addAttValue("ViewTranslateX", 0.0); - - type->addAttDef( "ViewTranslateY", "Translate in Y of initial suggested viewpoint", "Draw", ""); - type->addAttValue("ViewTranslateY", 0.0); - - type->addAttDef( "ViewTranslateZ", "Translate in Z of initial suggested viewpoint", "Draw", ""); - type->addAttValue("ViewTranslateZ", 0.0); - - type->addAttDef( "PointUnit", "Length", "Physics", ""); - type->addAttValue("PointUnit", G4String("m")); - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - - type->addAttDef( "UseSolids", "Use HepRep Solids rather than Geant4 Primitives", "Draw", ""); - type->addAttValue("UseSolids", messenger->useSolids()); - - type->addAttDef( "WriteInvisibles", "Write Invisible Objects", "Draw", ""); - type->addAttValue("WriteInvisibles", messenger->writeInvisibles()); -} - - -HepRepInstance* G4HepRepSceneHandler::getGeometryOrEventInstance(HepRepType* type) { - if (isEventData()) { - return factory->createHepRepInstance(getEventInstance(), type); - } else { - G4PhysicalVolumeModel* pPVModel = - dynamic_cast(fpModel); - assert(pPVModel); // To keep Coverity happy. - G4LogicalVolume* pCurrentLV = pPVModel->GetCurrentLV(); - G4int currentDepth = pPVModel->GetCurrentDepth(); - G4Material* pCurrentMaterial = pPVModel->GetCurrentMaterial(); - return getGeometryInstance(pCurrentLV, pCurrentMaterial, currentDepth); - } -} - -HepRep* G4HepRepSceneHandler::getHepRep() { - if (_heprep == NULL) { - // Create the HepRep that holds the Trees. - _heprep = factory->createHepRep(); - } - return _heprep; -} - -HepRep* G4HepRepSceneHandler::getHepRepGeometry() { - if (_heprepGeometry == NULL) { - // Create the HepRep that holds the Trees. - _heprepGeometry = factory->createHepRep(); - } - return _heprepGeometry; -} - -HepRepInstanceTree* G4HepRepSceneHandler::getGeometryInstanceTree() { - if (_geometryInstanceTree == NULL) { - // Create the Geometry InstanceTree. - _geometryInstanceTree = factory->createHepRepInstanceTree("G4GeometryData", "1.0", getGeometryTypeTree()); - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - if ( messenger->appendGeometry()) { - getHepRep()->addInstanceTree(_geometryInstanceTree); - } else { - getHepRepGeometry()->addInstanceTree(_geometryInstanceTree); - } - } - return _geometryInstanceTree; -} - -HepRepInstance* G4HepRepSceneHandler::getGeometryRootInstance() { - if (_geometryRootInstance == NULL) { - // Create the top level Geometry Instance. - _geometryRootInstance = factory->createHepRepInstance(getGeometryInstanceTree(), getGeometryRootType()); - } - return _geometryRootInstance; -} - -HepRepInstance* G4HepRepSceneHandler::getGeometryInstance(G4LogicalVolume* volume, G4Material* material, int depth) { - HepRepInstance* instance = getGeometryInstance(volume->GetName(), depth); - - setAttribute(instance, "LVol", volume->GetName()); - G4Region* region = volume->GetRegion(); - G4String regionName = region? region->GetName(): G4String("No region"); - setAttribute(instance, "Region", regionName); - setAttribute(instance, "RootRegion", volume->IsRootRegion()); - setAttribute(instance, "Solid", volume->GetSolid()->GetName()); - setAttribute(instance, "EType", volume->GetSolid()->GetEntityType()); - G4String matName = material? material->GetName(): G4String("No material"); - setAttribute(instance, "Material", matName ); - G4double matDensity = material? material->GetDensity(): 0.; - setAttribute(instance, "Density", matDensity); - G4double matRadlen = material? material->GetRadlen(): 0.; - setAttribute(instance, "Radlen", matRadlen); - - G4State matState = material? material->GetState(): kStateUndefined; - G4String state = materialState[matState]; - setAttribute(instance, "State", state); - - return instance; -} - -HepRepInstance* G4HepRepSceneHandler::getGeometryInstance(G4String volumeName, int depth) { - // no extra checks since these are done in the geometryType already - - // adjust depth, also pop the current instance - while ((int)_geometryInstance.size() > depth) { - _geometryInstance.pop_back(); - } - - // get parent - HepRepInstance* parent = (_geometryInstance.empty()) ? getGeometryRootInstance() : _geometryInstance.back(); - - // get type - HepRepType* type = getGeometryType(volumeName, depth); - - // create instance - HepRepInstance* instance = factory->createHepRepInstance(parent, type); - _geometryInstance.push_back(instance); - - return instance; -} - -HepRepTypeTree* G4HepRepSceneHandler::getGeometryTypeTree() { - if (_geometryTypeTree == NULL) { - // Create the Geometry TypeTree. - HepRepTreeID* geometryTreeID = factory->createHepRepTreeID("G4GeometryTypes", "1.0"); - _geometryTypeTree = factory->createHepRepTypeTree(geometryTreeID); - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - if ( messenger->appendGeometry()) { - getHepRep()->addTypeTree(_geometryTypeTree); - } else { - getHepRepGeometry()->addTypeTree(_geometryTypeTree); - } - } - return _geometryTypeTree; -} - -HepRepType* G4HepRepSceneHandler::getGeometryRootType() { - if (_geometryRootType == NULL) { - // Create the top level Geometry Type. - _geometryRootType = factory->createHepRepType(getGeometryTypeTree(), rootVolumeName); - _geometryRootType->addAttValue("Layer", geometryLayer); - - // Add attdefs used by all geometry types. - _geometryRootType->addAttDef ("LVol", "Logical Volume", "Physics",""); - _geometryRootType->addAttValue("LVol", G4String("")); - _geometryRootType->addAttDef ("Region", "Cuts Region", "Physics",""); - _geometryRootType->addAttValue("Region", G4String("")); - _geometryRootType->addAttDef ("RootRegion", "Root Region", "Physics",""); - _geometryRootType->addAttValue("RootRegion", false); - _geometryRootType->addAttDef ("Solid", "Solid Name", "Physics",""); - _geometryRootType->addAttValue("Solid", G4String("")); - _geometryRootType->addAttDef ("EType", "Entity Type", "Physics",""); - _geometryRootType->addAttValue("EType", G4String("G4Box")); - _geometryRootType->addAttDef ("Material", "Material Name", "Physics",""); - _geometryRootType->addAttValue("Material", G4String("Air")); - _geometryRootType->addAttDef ("Density", "Material Density", "Physics",""); - _geometryRootType->addAttValue("Density", 0.0); - _geometryRootType->addAttDef ("State", "Material State", "Physics",""); - _geometryRootType->addAttValue("State", G4String("Gas")); - _geometryRootType->addAttDef ("Radlen", "Material Radiation Length", "Physics",""); - _geometryRootType->addAttValue("Radlen", 0.0); - - // add defaults for Geometry - _geometryRootType->addAttValue("Color", 0.8, 0.8, 0.8, 1.0); - _geometryRootType->addAttValue("Visibility", true); - _geometryRootType->addAttValue("FillColor", 0.8, 0.8, 0.8, 1.0); - _geometryRootType->addAttValue("LineWidth", 1.0); - _geometryRootType->addAttValue("DrawAs", G4String("Polygon")); - _geometryRootType->addAttValue("PickParent", false); - _geometryRootType->addAttValue("ShowParentAttributes", true); - - _geometryRootType->addAttValue("MarkSizeMultiplier", 4.0); - _geometryRootType->addAttValue("LineWidthMultiplier", 1.0); - - addTopLevelAttributes(_geometryRootType); - - _geometryType["/"+_geometryRootType->getName()] = _geometryRootType; - } - return _geometryRootType; -} - -HepRepType* G4HepRepSceneHandler::getGeometryType(G4String volumeName, int depth) { - // make sure we have a root - getGeometryRootType(); - - // construct the full name for this volume - G4String name = getFullTypeName(volumeName, depth); - - // lookup type and create if necessary - HepRepType* type = _geometryType[name]; - if (type == NULL) { - G4String parentName = getParentTypeName(depth); - HepRepType* parentType = _geometryType[parentName]; - // HepRep uses hierarchical names - type = factory->createHepRepType(parentType, volumeName); - _geometryType[name] = type; - } - return type; -} - -G4String G4HepRepSceneHandler::getFullTypeName(G4String volumeName, int depth) { - // check for name depth - if (depth > (int)_geometryTypeName.size()) { - // there is a problem, book this type under problems - G4String problem = "HierarchyProblem"; - if (_geometryType["/"+problem] == NULL) { - // HepRep uses hierarchical names - HepRepType* type = factory->createHepRepType(getGeometryRootType(), problem); - _geometryType["/"+problem] = type; - } - return "/" + problem + "/" + volumeName; - } - - // adjust name depth, also pop the current volumeName - while ((int)_geometryTypeName.size() > depth) { - _geometryTypeName.pop_back(); - } - - // construct full name and push it - G4String name = (_geometryTypeName.empty()) ? G4String("/"+rootVolumeName) : _geometryTypeName.back(); - name = name + "/" + volumeName; - _geometryTypeName.push_back(name); - return name; -} - -G4String G4HepRepSceneHandler::getParentTypeName(int depth) { - return (depth >= 1) ? _geometryTypeName[depth-1] : G4String("/"+rootVolumeName); -} - -HepRepInstanceTree* G4HepRepSceneHandler::getEventInstanceTree() { - if (_eventInstanceTree == NULL) { - // Create the Event InstanceTree. - _eventInstanceTree = factory->createHepRepInstanceTree("G4EventData", "1.0", getEventTypeTree()); - getHepRep()->addInstanceTree(_eventInstanceTree); - } - return _eventInstanceTree; -} - -HepRepInstance* G4HepRepSceneHandler::getEventInstance() { - if (_eventInstance == NULL) { - // Create the top level Event Instance. - _eventInstance = factory->createHepRepInstance(getEventInstanceTree(), getEventType()); - } - return _eventInstance; -} - -HepRepTypeTree* G4HepRepSceneHandler::getEventTypeTree() { - if (_eventTypeTree == NULL) { - // Create the Event TypeTree. - HepRepTreeID* eventTreeID = factory->createHepRepTreeID("G4EventTypes", "1.0"); - _eventTypeTree = factory->createHepRepTypeTree(eventTreeID); - getHepRep()->addTypeTree(_eventTypeTree); - } - - return _eventTypeTree; -} - -HepRepType* G4HepRepSceneHandler::getEventType() { - if (_eventType == NULL) { - // Create the top level Event Type. - _eventType = factory->createHepRepType(getEventTypeTree(), "Event"); - _eventType->addAttValue("Layer", eventLayer); - - // add defaults for Events - _eventType->addAttValue("Visibility", true); - _eventType->addAttValue("Color", 1.0, 1.0, 1.0, 1.0); - _eventType->addAttValue("FillColor", 1.0, 1.0, 1.0, 1.0); - _eventType->addAttValue("LineWidth", 1.0); - _eventType->addAttValue("HasFrame", true); - _eventType->addAttValue("PickParent", false); - _eventType->addAttValue("ShowParentAttributes", false); - - _eventType->addAttValue("MarkSizeMultiplier", 4.0); - _eventType->addAttValue("LineWidthMultiplier", 1.0); - - addTopLevelAttributes(_eventType); - } - - return _eventType; -} - -HepRepType* G4HepRepSceneHandler::getTrajectoryType() { - if (_trajectoryType == NULL) { - _trajectoryType = factory->createHepRepType(getEventType(), "Trajectory"); - - _trajectoryType->addAttValue("Layer", trajectoryLayer); - _trajectoryType->addAttValue("DrawAs", G4String("Line")); - - _trajectoryType->addAttValue("LineWidthMultiplier", 2.0); - - // attributes to draw the points of a track as markers. - _trajectoryType->addAttValue("MarkName", G4String("Box")); - _trajectoryType->addAttValue("MarkSize", 4); - _trajectoryType->addAttValue("MarkType", G4String("Symbol")); - _trajectoryType->addAttValue("Fill", true); - } - return _trajectoryType; -} - -HepRepType* G4HepRepSceneHandler::getHitType() { - if (_hitType == NULL) { - _hitType = factory->createHepRepType(getEventType(), "Hit"); - _hitType->addAttValue("Layer", hitLayer); - _hitType->addAttValue("DrawAs", G4String("Point")); - _hitType->addAttValue("MarkName", G4String("Box")); - _hitType->addAttValue("MarkSize", 4.0); - _hitType->addAttValue("MarkType", G4String("Symbol")); - _hitType->addAttValue("Fill", true); - } - return _hitType; -} - -HepRepType* G4HepRepSceneHandler::getCalHitType() { - if (_calHitType == NULL) { - _calHitType = factory->createHepRepType(getEventType(), "CalHit"); - _calHitType->addAttValue("Layer", calHitLayer); - _calHitType->addAttValue("Fill", true); - _calHitType->addAttValue("DrawAs", G4String("Polygon")); - } - return _calHitType; -} - -HepRepType* G4HepRepSceneHandler::getCalHitFaceType() { - if (_calHitFaceType == NULL) { - _calHitFaceType = factory->createHepRepType(getCalHitType(), "CalHitFace"); - _calHitFaceType->addAttValue("PickParent", true); - } - return _calHitFaceType; -} - diff --git a/source/visualization/HepRep/src/G4HepRepViewer.cc b/source/visualization/HepRep/src/G4HepRepViewer.cc deleted file mode 100644 index b869003a15..0000000000 --- a/source/visualization/HepRep/src/G4HepRepViewer.cc +++ /dev/null @@ -1,130 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// - -/** - * @author Mark Donszelmann - */ - -//HepRep -#include "HEPREP/HepRep.h" - -//G4 -#include "G4Types.hh" -//#include "G4VInteractorManager.hh" -#include "G4Scene.hh" -#include "G4HepRep.hh" -#include "G4HepRepMessenger.hh" -#include "G4HepRepSceneHandler.hh" -//This -#include "G4HepRepViewer.hh" - -using namespace HEPREP; -using namespace std; - -G4HepRepViewer::G4HepRepViewer (G4VSceneHandler& sceneHandler, const G4String& name) - : G4VViewer (sceneHandler, sceneHandler.IncrementViewCount(), name), - geometryIncluded(false) { - -#ifdef SDEBUG - cout << "G4HepRepViewer::G4HepRepViewer " << name << endl; -#endif - - // Make changes to view parameters for HepRep... - fVP.SetCulling(false); - fDefaultVP.SetCulling(false); -} - - - -G4HepRepViewer::~G4HepRepViewer () { -#ifdef SDEBUG - cout << "G4HepRepViewer::~G4HepRepViewer" << endl; -#endif - G4HepRep* pHepRepSystem = - dynamic_cast(GetSceneHandler()->GetGraphicsSystem()); - if (pHepRepSystem) pHepRepSystem->removeViewer(); -} - - -void G4HepRepViewer::ClearView () { -#ifdef SDEBUG - cout << "G4HepRepViewer::ClearView" << endl; -#endif -} - -void G4HepRepViewer::SetView () { -#ifdef SDEBUG - cout << "G4HepRepViewer::SetView" << endl; -#endif -} - - -/* NOTE: - /run/beamOn calls ShowView for every event (unless accumulate is set) - /vis/viewer/flush calls /vis/viewer/refresh followed by /vis/viewer/update - /vis/viewer/refresh calls SetView, ClearView, DrawView - /vis/viewer/update calls ShowView -*/ -void G4HepRepViewer::DrawView () { -#ifdef SDEBUG - cout << "G4HepRepViewer::DrawView" << endl; -#endif - if (!geometryIncluded) { - // draws the geometry - NeedKernelVisit(); - ProcessView(); - geometryIncluded = true; - } -} - -void G4HepRepViewer::ShowView () { -#ifdef SDEBUG - cout << "G4HepRepViewer::ShowView" << endl; -#endif - G4VViewer::ShowView(); - - G4HepRepSceneHandler* sceneHandler = dynamic_cast(GetSceneHandler()); - if (sceneHandler) { - if (sceneHandler->closeHepRep()) { - sceneHandler->openHepRep(); - - G4HepRepMessenger* messenger = G4HepRepMessenger::GetInstance(); - if (messenger->appendGeometry()) geometryIncluded = false; - } - } -} - -void G4HepRepViewer::FinishView () { -#ifdef SDEBUG - cout << "G4HepRepViewer::FinishView" << endl; -#endif - G4VViewer::FinishView(); -} - -void G4HepRepViewer::reset() { - geometryIncluded = false; -} diff --git a/source/visualization/HepRep/src/GZIPOutputStream.cc b/source/visualization/HepRep/src/GZIPOutputStream.cc deleted file mode 100644 index aa4bf9079f..0000000000 --- a/source/visualization/HepRep/src/GZIPOutputStream.cc +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/GZIPOutputStreamBuffer.h" -#include "cheprep/GZIPOutputStream.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - using namespace std; - - GZIPOutputStream::GZIPOutputStream(ostream &os) - : std::ostream(NULL) { - - buffer = new GZIPOutputStreamBuffer(os.rdbuf()); - init(buffer); - } - - - void GZIPOutputStream::setFilename(const string &filename) { - buffer->setFilename(filename); - } - - void GZIPOutputStream::setComment(const string &comment) { - buffer->setComment(comment); - } - - void GZIPOutputStream::close() { - buffer->close(); - } - - - GZIPOutputStream::~GZIPOutputStream() { - delete buffer; - } - -} // cheprep diff --git a/source/visualization/HepRep/src/GZIPOutputStreamBuffer.cc b/source/visualization/HepRep/src/GZIPOutputStreamBuffer.cc deleted file mode 100644 index 92e17157f4..0000000000 --- a/source/visualization/HepRep/src/GZIPOutputStreamBuffer.cc +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/GZIPOutputStreamBuffer.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - using namespace std; - - GZIPOutputStreamBuffer::GZIPOutputStreamBuffer( streambuf *aBuffer) - : DeflateOutputStreamBuffer(aBuffer), - open(false) { - - init(true); - } - - void GZIPOutputStreamBuffer::setFilename( const string &name ) { - filename = name ; - } - - void GZIPOutputStreamBuffer::setComment( const string &c ) { - comment = c ; - } - - void GZIPOutputStreamBuffer::close() { - if (!open) return; - - finish(); - writeTrailer(); - - open = false ; - } - - GZIPOutputStreamBuffer::~GZIPOutputStreamBuffer() { - close() ; - } - - int GZIPOutputStreamBuffer::overflow( int c ) { - if (!open) { - writeHeader(); - open = true; - } - return DeflateOutputStreamBuffer::overflow( c ) ; - } - - void GZIPOutputStreamBuffer::writeHeader() { - unsigned char flag = 0x00; - flag |= (filename == "") ? 0x00 : 0x08; - flag |= (comment == "") ? 0x00 : 0x10; - - putUB(0x1f); // Magic # - putUB(0x8b); // Magic # - putUB(0x08); // Deflater.DEFLATED - putUB(flag); // FLG - putUI(0x00000000); // MTIME - putUB(0x00); // XFLG - putUB(0x00); // OS - - if (filename != "") { - putS(filename); // Filename - putUB(0x00); - } - - if (comment != "") { - putS(comment); // Comment - putUB(0x00); - } - } - - void GZIPOutputStreamBuffer::writeTrailer() { - putUI(getCRC()); - putUI(getSize()); - } - -} // cheprep diff --git a/source/visualization/HepRep/src/IndentPrintWriter.cc b/source/visualization/HepRep/src/IndentPrintWriter.cc deleted file mode 100644 index 6f200773a2..0000000000 --- a/source/visualization/HepRep/src/IndentPrintWriter.cc +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include - -#include "cheprep/IndentPrintWriter.h" - -using namespace std; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -IndentPrintWriter::IndentPrintWriter(ostream* outstream, int level) - : out(outstream), - closed(false), - indentLevel(level), - indented(false), - indentString(" ") { -} - -IndentPrintWriter::~IndentPrintWriter() { -} - -void IndentPrintWriter::close() { - if (!closed) { - out->flush(); - closed = true; - } -} - -IndentPrintWriter& IndentPrintWriter::operator<< (const std::string & s) { - if (!indented) doIndent(); - *out << s; - return *this; -} - -IndentPrintWriter& IndentPrintWriter::operator<< (ostream& (*)(ostream&)) { - *out << endl; - indented = false; - return *this; -} - -void IndentPrintWriter::println(const string & s) { - *this << s << endl; -} - -void IndentPrintWriter::print(const string & s) { - *this << s; -} - -void IndentPrintWriter::println() { - *out << endl; - indented = false; -} - -void IndentPrintWriter::doIndent() { - for (int i=0; i -#include - -#include "cheprep/XMLHepRepWriter.h" -#include "cheprep/XMLHepRepFactory.h" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - -XMLHepRepFactory::XMLHepRepFactory() { -} - -XMLHepRepFactory::~XMLHepRepFactory() { -} - -HepRepReader* XMLHepRepFactory::createHepRepReader (istream*) { - cerr << "XMLHepRepFactory::createHepRepReader not implemented" << endl; - return NULL; -} - -HepRepReader* XMLHepRepFactory::createHepRepReader (std::string) { - cerr << "XMLHepRepFactory::createHepRepReader not implemented" << endl; - return NULL; -} - -HepRepWriter* XMLHepRepFactory::createHepRepWriter(ostream* out, bool randomAccess, bool compress) { - return new XMLHepRepWriter(out, randomAccess, compress); -} - -} // cheprep - diff --git a/source/visualization/HepRep/src/XMLHepRepWriter.cc b/source/visualization/HepRep/src/XMLHepRepWriter.cc deleted file mode 100644 index 44c5f95a91..0000000000 --- a/source/visualization/HepRep/src/XMLHepRepWriter.cc +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/XMLHepRepWriter.h" -#include "cheprep/XMLWriter.h" -#include "cheprep/BHepRepWriter.h" - -#include "cheprep/DefaultHepRepInstance.h" -#include "cheprep/DefaultHepRepAttValue.h" - -#define NAMESPACE "heprep" - -using namespace std; -using namespace HEPREP; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -XMLHepRepWriter::XMLHepRepWriter(ostream* os, bool randomAccess, bool useCompression) - : out(os), - compress(useCompression), - xml(0) { - - this->nameSpace = NAMESPACE; - - if (randomAccess) { - zip = new ZipOutputStream(*os); - out = zip; - gz = NULL; - } else { - zip = NULL; - if (useCompression) { -#ifndef CHEPREP_NO_ZLIB - gz = new GZIPOutputStream(*os); - out = gz; -#else - cerr << "WARNING: the .gz output stream you are creating will be a plain file," << endl; - cerr << "since compression support (ZLIB) was not compiled into the library." << endl; - cerr << "To add ZLIB support, you need to undefine CHEPREP_NO_ZLIB." << endl; - gz = NULL; -#endif - } else { - gz = NULL; - } - } -} - -XMLHepRepWriter::~XMLHepRepWriter() { - delete gz; - delete zip; -} - -bool XMLHepRepWriter::addProperty(std::string key, std::string value) { - properties[key] = value; - return true; -} - -bool XMLHepRepWriter::close() { - if (zip != NULL) { - zip->putNextEntry("heprep.properties", true); - - map::iterator i = properties.begin(); - while (i != properties.end()) { - *zip << (*i).first << "=" << (*i).second << endl; - i++; - } - zip->closeEntry(); - zip->close(); - } - - if (gz != NULL) { - gz->close(); - } - return true; -} - -bool XMLHepRepWriter::write(HepRep* heprep, string name) { - if (zip != NULL) { - zip->putNextEntry(name, compress); - } - - if (name.rfind(".bheprep") == name.length()-8) { - xml = new BHepRepWriter(*out); - } else { - xml = new XMLWriter(out, " ", NAMESPACE); - } - - xml->openDoc(); - xml->setAttribute("version", (string)"2.0"); - xml->setAttribute("xmlns", (string)"http://java.freehep.org/schemas/heprep/2.0"); - xml->setAttribute("xmlns", "xsi", "http://www.w3.org/2001/XMLSchema-instance"); - xml->setAttribute("xsi", "schemaLocation", "http://java.freehep.org/schemas/heprep/2.0 http://java.freehep.org/schemas/heprep/2.0/HepRep.xsd"); - xml->openTag(nameSpace, "heprep"); - write(heprep->getLayerOrder()); - vector typeTreeSet = heprep->getTypeTreeList(); - for (vector::iterator i1=typeTreeSet.begin(); i1 != typeTreeSet.end(); i1++) { - write(*i1); - } - vector instanceTreeSet = heprep->getInstanceTreeList(); - for (vector::iterator i2=instanceTreeSet.begin(); i2 != instanceTreeSet.end(); i2++) { - write(*i2); - } - xml->closeTag(); - xml->closeDoc(); -// xml->close(); - delete xml; - - if (zip != NULL) { - zip->closeEntry(); - } - - return true; -} - -bool XMLHepRepWriter::write(vector layers) { - string layerOrder = ""; - bool comma = false; - for (vector::iterator i=layers.begin(); i != layers.end(); i++) { - if (comma) { - layerOrder.append(", "); - } - layerOrder.append(*i); - comma = true; - } - xml->setAttribute("order", layerOrder); - xml->printTag(nameSpace, "layer"); - return true; -} - -bool XMLHepRepWriter::write(HepRepTypeTree* typeTree) { - xml->setAttribute("name", typeTree->getName()); - xml->setAttribute("version", typeTree->getVersion()); - xml->openTag(nameSpace, "typetree"); - - vector types = typeTree->getTypeList(); - for (vector::iterator i=types.begin(); i != types.end(); i++) { - write(*i); - } - - xml->closeTag(); - return true; -} - -bool XMLHepRepWriter::write(HepRepType* type) { - xml->setAttribute("name", type->getName()); - xml->openTag(nameSpace, "type"); - write((HepRepDefinition*)type); - write((HepRepAttribute*)type); - - vector types = type->getTypeList(); - for (vector::iterator i=types.begin(); i != types.end(); i++) { - write(*i); - } - xml->closeTag(); - return true; -} - -bool XMLHepRepWriter::write(HepRepTreeID* treeID) { - xml->setAttribute("qualifier", treeID->getQualifier()); - xml->setAttribute("name", treeID->getName()); - xml->setAttribute("version", treeID->getVersion()); - xml->printTag(nameSpace, "treeid"); - return true; -} - -bool XMLHepRepWriter::write(HepRepAction* action) { - xml->setAttribute("name", action->getName()); - xml->setAttribute("expression", action->getExpression()); - xml->printTag(nameSpace, "action"); - return true; -} - -bool XMLHepRepWriter::write(HepRepInstanceTree* instanceTree) { - xml->setAttribute("name", instanceTree->getName()); - xml->setAttribute("version", instanceTree->getVersion()); - xml->setAttribute("typetreename", instanceTree->getTypeTree()->getName()); - xml->setAttribute("typetreeversion", instanceTree->getTypeTree()->getVersion()); - xml->openTag(nameSpace, "instancetree"); - // refs - vector instanceTreeSet = instanceTree->getInstanceTreeList(); - for (vector::iterator i1=instanceTreeSet.begin(); i1 != instanceTreeSet.end(); i1++) { - write(*i1); - } - - // instances - vector instanceList = instanceTree->getInstances(); - for (vector::iterator i2=instanceList.begin(); i2 != instanceList.end(); i2++) { - write(*i2); - } - xml->closeTag(); - return true; -} - -bool XMLHepRepWriter::write(HepRepInstance* instance) { - // FIXME FREEHEP-356 - xml->setAttribute("type", instance->getType()->getFullName()); - xml->openTag(nameSpace, "instance"); - write((HepRepAttribute*)instance); - - vector pointList = instance->getPoints(); - for (vector::iterator i1=pointList.begin(); i1 != pointList.end(); i1++) { - write(*i1); - } - - vector instanceList = instance->getInstances(); - for (vector::iterator i2=instanceList.begin(); i2 != instanceList.end(); i2++) { - write(*i2); - } - xml->closeTag(); - return true; -} - -bool XMLHepRepWriter::write(HepRepPoint* point) { - xml->setAttribute("x", point->getX()); - xml->setAttribute("y", point->getY()); - xml->setAttribute("z", point->getZ()); - if (point->getAttValuesFromNode().size() != 0) { - xml->openTag(nameSpace, "point"); - write((HepRepAttribute*)point); - xml->closeTag(); - } else { - xml->printTag(nameSpace, "point"); - } - return true; -} - -bool XMLHepRepWriter::write(HepRepAttribute* attribute) { - // BUG FIX. Do something special for layers, because these do not end - // up in the normal iteration. - HepRepAttValue* layerAtt = attribute->getAttValueFromNode("layer"); - if (layerAtt != NULL) write(layerAtt); - - set attSet = attribute->getAttValuesFromNode(); - for (set::iterator i=attSet.begin(); i != attSet.end(); i++) { - write(*i); - } - return true; -} - -bool XMLHepRepWriter::write(HepRepDefinition* definition) { - set list = definition->getAttDefsFromNode(); - for (set::iterator i=list.begin(); i != list.end(); i++) { - write(*i); - } - return true; -} - -bool XMLHepRepWriter::write(HepRepAttValue* attValue) { - string name = attValue->getName(); - - xml->setAttribute("name", name); - - switch(attValue->getType()) { - default: xml->setAttribute("value", attValue->getAsString()); - break; - case HepRepConstants::TYPE_STRING: xml->setAttribute("value", attValue->getString()); - break; - case HepRepConstants::TYPE_LONG: xml->setAttribute("value", attValue->getLong()); - break; - case HepRepConstants::TYPE_INT: xml->setAttribute("value", attValue->getInteger()); - break; - case HepRepConstants::TYPE_DOUBLE: xml->setAttribute("value", attValue->getDouble()); - break; - case HepRepConstants::TYPE_BOOLEAN: xml->setAttribute("value", attValue->getBoolean()); - break; - case HepRepConstants::TYPE_COLOR: xml->setAttribute("value", attValue->getColor()); - } - - if (attValue->showLabel() != HepRepConstants::SHOW_NONE) { - xml->setAttribute("showlabel", attValue->showLabel()); - } - - xml->printTag(nameSpace, "attvalue"); - return true; -} - -bool XMLHepRepWriter::write(HepRepAttDef* attDef) { - xml->setAttribute("name", attDef->getName()); - xml->setAttribute("desc", attDef->getDescription()); - xml->setAttribute("category", attDef->getCategory()); - xml->setAttribute("extra", attDef->getExtra()); - xml->printTag(nameSpace, "attdef"); - return true; -} - -} // cheprep - diff --git a/source/visualization/HepRep/src/XMLWriter.cc b/source/visualization/HepRep/src/XMLWriter.cc deleted file mode 100644 index ad4cc37827..0000000000 --- a/source/visualization/HepRep/src/XMLWriter.cc +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include "cheprep/config.h" - -#include - -#include "cheprep/DefaultHepRepAttValue.h" -#include "cheprep/XMLWriter.h" - -using namespace std; - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - -XMLWriter::XMLWriter(ostream* out, string indentString, string aDefaultNameSpace) - : AbstractXMLWriter(aDefaultNameSpace) { - writer = new IndentPrintWriter(out); - writer->setIndentString(indentString); - closed = false; - dtdName = ""; -} - -XMLWriter::~XMLWriter() { - writer->close(); - delete writer; -} - -void XMLWriter::close() { - closeDoc(); - writer->close(); -} - -void XMLWriter::openDoc(string version, string encoding, bool standalone) { - string indentString = writer->getIndentString(); - writer->setIndentString(indentString); - -// if (!XMLCharacterProperties.validVersionNum(version)) throw new RuntimeException("Invalid version number: "+version); - *writer << ""; - *writer << endl; - writer->setIndentString(indentString); -} - -void XMLWriter::referToDTD(string name, string pid, string ref) { - if (dtdName != "") { - cerr << "XMLWriter::ReferToDTD cannot be called twice" << endl; - } - dtdName = name; - *writer << "" << endl; -} - -void XMLWriter::referToDTD(string name, string system) { - if (dtdName != "") { - cerr << "XMLWriter::ReferToDTD cannot be called twice"; - } - dtdName = name; - *writer << "" << endl; -} - -void XMLWriter::closeDoc(bool force) { - if (!closed) { - if (!openTags.empty()) { - if (!force) cerr << "Not all tags were closed before closing XML document:" << endl; - while (!openTags.empty()) { - if (force) { - closeTag(); - } else { - cerr << " " << endl; - openTags.pop(); - } - } - } - closed = true; - } -} - -void XMLWriter::printComment(string comment) { - if (comment.find("--") != string::npos) { - cerr << "XMLWriter::printComment '--' sequence not allowed in comment" << endl; - } - *writer << "" << endl; -} - -void XMLWriter::printPlain(string text) { - *writer << text.c_str(); -} - -void XMLWriter::print(string text) { - *writer << normalizeText(text).c_str(); -} - -void XMLWriter::println(string text) { - print(text); - *writer << endl; -} - -void XMLWriter::openTag(string name) { - checkNameValid(name); - if (openTags.empty() && dtdName.compare("") && dtdName.compare(name)) { - cerr << "XMLWriter::openTag(), First tag: '" << name << "' not equal to DTD id: '" << dtdName << "'" << endl; - } - *writer << "<" << name.c_str(); - printAttributes(name.length()); - *writer << ">" << endl; - writer->indent(); - openTags.push(name); -} - -void XMLWriter::closeTag() { - if (openTags.empty()) { - writer->close(); - cerr << "XMLWriter::closeTag(), No open tags" << endl; - } - string name = openTags.top(); - openTags.pop(); - writer->outdent(); - *writer << "" << endl; -} - -void XMLWriter::printTag(string name) { - checkNameValid(name); - *writer << "<" << name.c_str(); - printAttributes(name.length()); - *writer << "/>" << endl; -} - -void XMLWriter::setAttribute(string name, char* value) { - setAttribute(name, (string)value); -} - -void XMLWriter::setAttribute(string name, string value) { - attributes[name] = value; - // NOTE: never set type here -} - -void XMLWriter::setAttribute(std::string name, std::vector value) { - if (name == "value") setAttribute("type", (std::string)"Color"); - setAttribute(name, DefaultHepRepAttValue::getAsString(value)); -} - -void XMLWriter::setAttribute(std::string name, int64 value) { - if (name == "value") setAttribute("type", (std::string)"long"); - setAttribute(name, DefaultHepRepAttValue::getAsString(value)); -} - -void XMLWriter::setAttribute(std::string name, int value) { - if (name == "showlabel") { - string label = DefaultHepRepAttValue::toShowLabel(value); - setAttribute("showlabel", label); - } else { - if (name == "value") setAttribute("type", (std::string)"int"); - setAttribute(name, DefaultHepRepAttValue::getAsString(value)); - } -} - -void XMLWriter::setAttribute(std::string name, bool value) { - if (name == "value") setAttribute("type", (std::string)"boolean"); - setAttribute(name, DefaultHepRepAttValue::getAsString(value)); -} - -void XMLWriter::setAttribute(string name, double value) { - if (name == "value") setAttribute("type", (std::string)"double"); - setAttribute(name, DefaultHepRepAttValue::getAsString(value)); -} - -void XMLWriter::printAttributes(int tagLength) { - int width = tagLength + 1; - bool extraIndent = false; - for (map::iterator i = attributes.begin(); i != attributes.end(); i++) { - string key = i->first; - checkNameValid(key); - string value = normalize(i->second); - int length = key.length() + value.length() + 3; - if (width > 0 && width + length + 2*writer->getIndent() > 60) { - width = 0; - *writer << endl; - if (!extraIndent) { - writer->indent(); - extraIndent = true; - } - } else { - width += length; - *writer << " "; - } - *writer << key.c_str() << "=\"" << value.c_str() << "\""; - } - attributes.clear(); - if (extraIndent) writer->outdent(); -} - -string XMLWriter::normalize(string s) { - string str = ""; - char buffer[20]; - - int len = s.length(); - for (int i = 0; i < len; i++) { - char ch = s[i]; - switch (ch) { - case '<': { - str.append("<"); - break; - } - case '>': { - str.append(">"); - break; - } - case '&': { - str.append("&"); - break; - } - case '"': { - str.append("""); - break; - } - case '\r': - case '\n': { - sprintf(buffer, "&#%ud", ch); - str.append(buffer); - str.append(";"); - break; - } - default: { -// if (ch > 0x00FF) { -// sprintf(buffer, "&#x%4.4x", ch); -// str.append(buffer); -// str.append(";"); -// } else { - str.append(&ch, 1); -// } - } - } - } - - return str; -} - -string XMLWriter::normalizeText(string s) { - string str = ""; - - int len = s.length(); - for (int i = 0; i < len; i++) { - char ch = s[i]; - switch (ch) { - case '<': { - str.append("<"); - break; - } - case '>': { - str.append(">"); - break; - } - case '&': { - str.append("&"); - break; - } - default: { -// if (ch > 0x00FF) { -// sprintf(buffer, "&#x%4.4x", ch); -// str.append(buffer); -// str.append(";"); -// } else { - str.append(&ch, 1); -// } - } - } - } - return str; -} - -void XMLWriter::checkNameValid(string) { -// Could be added. -// if (!XMLCharacterProperties.validName(s)) throw new RuntimeException("Invalid name: "+s); -} - - -} // cheprep diff --git a/source/visualization/HepRep/src/ZipOutputStream.cc b/source/visualization/HepRep/src/ZipOutputStream.cc deleted file mode 100644 index a7ffd658b0..0000000000 --- a/source/visualization/HepRep/src/ZipOutputStream.cc +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include -#include -#include - -#include "cheprep/ZipOutputStreamBuffer.h" -#include "cheprep/ZipOutputStream.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - ZipOutputStream::ZipOutputStream(std::ostream& os) : std::ostream(0) { - buffer = new ZipOutputStreamBuffer(os.rdbuf()); - - init(buffer); - } - - void ZipOutputStream::closeEntry() { - buffer->closeEntry(); - } - - - void ZipOutputStream::close() { - buffer->close(); - } - - void ZipOutputStream::putNextEntry(const std::string& name, bool compress) { - buffer->putNextEntry(name, compress); - } - - void ZipOutputStream::setComment(const std::string& comment ) { - buffer->setComment(comment); - } - - ZipOutputStream::~ZipOutputStream() { - close(); - delete buffer; - } - -} // cheprep diff --git a/source/visualization/HepRep/src/ZipOutputStreamBuffer.cc b/source/visualization/HepRep/src/ZipOutputStreamBuffer.cc deleted file mode 100644 index f282caad98..0000000000 --- a/source/visualization/HepRep/src/ZipOutputStreamBuffer.cc +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright FreeHEP, 2005. - -#include -#include -#include - -#include "cheprep/ZipOutputStream.h" -#include "cheprep/ZipOutputStreamBuffer.h" -#include "cheprep/ZipEntry.h" - -/** - * @author Mark Donszelmann - */ -namespace cheprep { - - ZipOutputStreamBuffer::ZipOutputStreamBuffer(std::streambuf* aBuffer) - : DeflateOutputStreamBuffer(aBuffer), - comment("") { - - closed = false; - entry = NULL; - - entries = new std::vector(); - } - - int ZipOutputStreamBuffer::overflow(int c) { - return DeflateOutputStreamBuffer::overflow(c); - } - - void ZipOutputStreamBuffer::closeEntry() { - if (closed) return; - if (entry == NULL) return; - - finish(); - - entry->crc = getCRC(); - // NOTE: pos()::operator- is ambiguous on gcc 4.0, so convert to long first - entry->csize = (long)pos() - entry->data; - entry->size = getSize(); - putUI(EXTSIG); - putUI(entry->crc); // crc - putUI(entry->csize); // compressed size - putUI(entry->size); // uncompressed size - entry = NULL; - } - - - void ZipOutputStreamBuffer::close() { - if (closed) return; - closeEntry(); - - long dirStart = pos(); - for (std::vector::iterator i=entries->begin(); i != entries->end(); i++) { - entry = *i; - putUI(CENSIG); - putUS(VERSIONMADE); // made by version - putUS(VERSIONEXTRACT); // extraction version - putUS(GENFLAG); // general purpose bit flag - putUS(entry->method); // compression method - putUS(entry->time); // time - putUS(entry->date); // date - putUI(entry->crc); // crc - putUI(entry->csize); // compressed size - putUI(entry->size); // uncompressed size - putUS(entry->name.length()); // file name length - putUS(0); // extra field length - putUS(0); // file comment length - putUS(0); // disk number start - putUS(0); // internal file attributes - putUI(0); // external file attributes - putUI(entry->offset); // relative offset of local file header - putS(entry->name); // file name - - // delete entry - delete entry; - entry = NULL; - } - // NOTE: pos()::operator- is ambiguous on gcc 4.0, so convert to long first - long dirSize = (long)pos() - dirStart; - putUI(ENDSIG); - putUS(0); // number of this disk - putUS(0); // number of the disk with the start of central directory - putUS(entries->size()); // total number of entries in the central directory of this disk - putUS(entries->size()); // total number of entries in the central directory - putUI(dirSize); // size of the central directory - putUI(dirStart); // offset of the start of central directory with respect to the starting disk number - putUS(comment.length()); // .ZIP file comment length - putS(comment); // .ZIP file comment - - delete entries; - entries = NULL; - closed = true; - } - - void ZipOutputStreamBuffer::putNextEntry(const std::string& name, bool compress) { - if (closed) return; - - closeEntry(); - -#ifdef CHEPREP_NO_ZLIB - compress = false; -#endif - init(compress); - - entry = new ZipEntry(); - entries->push_back(entry); - - entry->name = name; - entry->method = compress ? 8 : 0; - - time_t ltime; - time( <ime ); - struct tm *utc = gmtime( <ime ); - entry->date = (utc->tm_year - 80) << 9 | (utc->tm_mon + 1) << 5 | utc->tm_mday; - entry->time = utc->tm_hour << 11 | utc->tm_min << 5 | utc->tm_sec >> 1; - - entry->offset = (long)pos(); - putUI(LOCSIG); // signature - putUS(VERSIONEXTRACT); // extraction version - putUS(GENFLAG); // general purpose bit flag - putUS(entry->method); // compression method - putUS(entry->time); // time - putUS(entry->date); // date - putUI(0x00000000); // crc ATEND - putUI(0x00000000); // compressed size ATEND - putUI(0x00000000); // uncompressed size ATEND - putUS(entry->name.length()); // file name length - putUS(0); // extra field length - putS(entry->name); // file name - entry->data = (long)pos(); - entry->crc = 0; - } - - void ZipOutputStreamBuffer::setComment(const std::string& c) { - if (closed) return; - comment = c; - } - - ZipOutputStreamBuffer::~ZipOutputStreamBuffer() { - close(); - } - -} // cheprep diff --git a/source/visualization/History b/source/visualization/History index af530ed0b0..bc7cd41049 100644 --- a/source/visualization/History +++ b/source/visualization/History @@ -12,9 +12,9 @@ and keep track of all category-tags. It DOES NOT substitute the CVS log-message one should put at every committal in the CVS repository ! - ************************************************************* - * Note that modeling and test have their own History files. * - ************************************************************* + ********************************************************* + * Note that sub-categories have their own History files * + ********************************************************* ---------------------------------------------------------- * Reverse chronological order (last date on top), please * @@ -23,6 +23,261 @@ committal in the CVS repository ! History file for visualization category --------------------------------------- +14 November 2021 John Allison (vis-V10-07-15) +- Category tag, comprising: + - DAWN-V10-07-02 + - vis-HepRep-V10-07-04 + - opengl-V10-07-25 + - openinventor-V10-07-06 + - visQt3D-V10-07-12 + - raytracer-V10-07-05 + - vis_toolssg-V10-07-16 + - vistree-V10-07-03 + - VRML-V10-07-03 + - visVtk-V10-07-03 + - visexternals-V10-07-04 + - gMocren-V10-07-02 + - visman-V10-07-28 + - modeling-V10-07-16 + - vistest-V10-07-00 +- Major features: + - New ToolsSG driver, including "in-app plotting". + - New primitive, G4Plotter. + - New Vtk driver. + - New Open Inventor Qt driver. + - Continuing development of Qt3D driver. + - Remove obsolete drivers: HepRep(WIRED), network FukuiRenderer, + VRML1 and network VRML2. + - Introduce "special mesh rendering" for 3D rectangular nested + parameterisations. + - Implemented only in OGL and Qt3D: + - As one coloured dot per cell randomly placed in the cell. + - Introduce /vis/scene/add/localAxes and /vis/touchable/localAxes. + +12 November 2021 - Ben Morgan +- Retire G4VIS_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system: + - opengl-V10-07-24 + - openinventor-V10-07-05 + - visQt3D-V10-07-11 + - raytracer-V10-07-04 + - vis_toolssg-V10-07-15 + +11 November 2021 John Allison +- visman-V10-07-28: Protect pointers in G4VisManager::GeometryHasChanged. + +08 November 2021 - Ben Morgan +- Retire G4UI/G4INTY_... preprocessor symbols: + - opengl-V10-07-24 + - openinventor-V10-07-05 + - visQt3D-V10-07-11 + - vis_toolssg-V10-07-14 + - vistree-V10-07-03 + - VRML-V10-07-03 + - visVtk-V10-07-03 + +07 November 2021 John Allison +- visman-V10-07-27: Introduce GetColour(const G4Visible&). + +05 November 2021 John Allison +- modeling-V10-07-16: Fix bug in calculation of extent of G4PhysicalVolumeModel. + +05 November 2021 Guy Barrand +- Remove G4VisPlotMessenger.hh. + - visman-V10-07-26 + - vis_toolssg-V10-07-13 + +03 November 2021 Guy Barrand +- visman-V10-07-25: Improve plotting. +- vis_toolssg-V10-07-12: Handle local list of styles. + +02 November 2021 Gabriele Cosmo +- visman-V10-07-24: Fix Windows static issue in G4VVisCommand. + +31 October 2021 Gabriele Cosmo (vis-V10-07-14) +- Fixed GNUmake dependencies in management and ToolsGS modules. + +30 October 2021 John Allison +- visman-V10-07-23: + - Introduce nicknames for TSG and Vtk. + - Sort /vis/ commands in alphabetical order. + +30 October 2021 John Allison +- opengl-V10-07-23: Fix G4OpenGLStoredXmViewer destructor: + +25 October 2021 Guy Barrand +- modeling-V10-07-15: Introduce G4Plotter. +- visman-V10-07-22: Introduce AddPrimitive(const G4Plotter&) and /vis/plotter/. +- vis_toolssg-V10-07-11: More development. +- Add "using G4VSceneHandler::AddPrimitive;" appropriately: + - opengl-V10-07-22 + - raytracer-V10-07-04 + - vistree-V10-07-03 + +25 October 2021 Ben Morgan (vis-V10-07-13) +- Use G4StrUtil functions replacing deprecated G4String member functions + +22 October 2021 Guy Barrand +- vis_toolssg-V10-07-10: Further development. + +20 October 2021 Gabriele Cosmo +- visQt3D-V10-07-10: Fix broken dependency in GNUmakefile. + +18 October 2021 John Allison +- visQt3D-V10-07-09: Introduce AddCompound(const G4Mesh&). + +18 October 2021 Ben Morgan (vis-V10-07-12) +- Use std::string member functions from G4String in place of synonyms + +15 October 2021 John Allison +- visVtk-V10-07-02: Implement G4VtkQt::IsUISessionCompatible. + +13 October 2021 Guy Barrand +- vis_toolssg-V10-07-09: Following g4tools-V10-07-07. + +12 October 2021 Ben Morgan +- vis_toolssg-V10-07-08: Xt backend does not depend on Xm. + +10 October 2021 John Allison (vis-V10-07-11) +- Coverity fixes and other minor improvements +- modeling-V10-07-14: + - As a result of Coverity warnings, improve the health of... + - G4PhysicalVolumeModel: + - Clean up tempVisAtts in case of found G4Mesh. + - Hold current transform as object, not as a pointer. + - G4TouchablePropertiesScene.cc: + - Migrate to the above. +- visman-V10-07-21: + - G4VisCommandsCompound.cc, G4VisCommandOpen, G4VisCommandSceneHandlerCreate: + - Improve reporting of unrecognised graphics system. + - G4VisCommandsTouchable.cc: + - Migrate to modeling-V10-07-14: +- vistree-V10-07-02: + - Migrate to modeling-V10-07-14: + +04 October 2021 - Stewart Boogert / Laurie Nevay (vis-V10-07-10) +- visVtk-V10-07-01: Add VtkQt and VtkNative visualisation drivers + +30 September 2021 John Allison +- raytracer-V10-07-03: Fix instantiation of G4The(MT)RayTracer. + +27 September 2021 Pedro Arce +- gMocren-V10-07-02: Use G4PhantomParameterisation::GetNoVoxels. + +24 September 2021 John Allison +- raytracer-V10-07-02: Make RayTracerX viewers "auto refresh". + +21 September 2021 Guilherme Amadio +- opengl-V10-07-21: Fix C++20 warnings from GCC 11.2.0. + +06 September 2021 John Allison +- opengl-V10-07-20: Make jpg default for OpenGL Qt viewers. + +02 September 2021 John Allison +- visman-V10-07-20: Preserve view parameters of any existing viewer and + use them in the creation of a new viewer. + +01 September 2021 John Allison +- vis_toolssg-V10-07-07: Store default background in view parameters. + +01 September 2021 John Allison +- visQt3D-V10-07-08: Add some protections. + +27 August 2021 Ben Morgan +- visman-V10-07-19: G4VisExecutive: Remove obsolete drivers. +- vis-HepRep-V10-07-04: Remove obsolete HepRep(WIRED) driver. + +26 August 2021 Ben Morgan +- visman-V10-07-18: G4VisExecutive: Remove obsolete drivers. +- DAWN-V10-07-02: Remove obsolete network FukuiRenderer driver. +- VRML-V10-07-03: Remove obsolete VRML1 and network VRML2 drivers. + +25 August 2021 John Allison +- VRML-V10-07-02: + - Introduce environment variables G4VRMLFILE_HEADER and G4VRMLFILE_FILE_NAME. + +22 August 2021 John Allison +- visQt3D-V10-07-07: Fix the problem of drawing from the vis sub-thread. + +20 August 2021 John Allison +- visQt3D-V10-07-06: Minor updates. + +18 August 2021 Laurent Garnier +- visexternals-V10-07-04: Fix issues with GL lib. +- visexternals-V10-07-03: Fix DBL_MAX issue. + +09 August 2021 John Allison (vis-V10-07-09) +- Update vis category History file (and fix a few typos in other Histories). + +06 August 2021 Laurent Garnier +- visexternals-V10-07-02: Migrate gl2ps to 1.4.2. + +01 August 2021 John Allison +- opengl-V10-07-19: Fix text alignment issue on Qt. + +31 July 2021 John Allison +- visman-V10-07-17: Improve warning messages. + +20 July 2021 John Allison +- opengl-V10-07-18: Remove /vis/ogl/printEPS. + o This command is covered by the more versatile /vis/ogl/export. + +19 July 2021 John Allison +- opengl-V10-07-17: Use C++17 [[fallthrough]] instead of // fallthrough. + +18 July 2021 John Allison +- visman-V10-07-16: Use C++17 [[fallthrough]] instead of // fallthrough. + +17 July 2021 John Allison +- opengl-V10-07-16: Prepare for removing /vis/ogl/printEPS. + +15 July 2021 John Allison +- visman-V10-07-15: Prepare for removing /vis/ogl/printEPS. +- vistest-V10-07-00: Prepare for removing /vis/ogl/printEPS. +- vistest-V10-07-00: Replace /vis/ogl/printEPS with /vis/ogl/export. + +13 July 2021 John Allison +- opengl-V10-07-15: Increase the default display list limit to 10 million. + +12 July 2021 John Allison +- visman-V10-07-14: Implement /vis/scene/removeModel. +- opengl-V10-07-14: Speed up drawing - comment out glXWaitGL(). + +09 July 2021 John Allison +- visman-V10-07-13: Add Special Mesh Rendering parameters to /vis/viewer/save. + +08 July 2021 John Allison +- opengl-V10-07-13: Improve handling of cutaways. + +06 July 2021 John Allison +- modeling-V10-07-13: Fix bug in G4AxesModel name. +- visman-V10-07-12: Miscellaneous small improvements and fixes. + +05 July 2021 John Allison +- modeling-V10-07-12: Miscellaneous small improvements and fixes. +- opengl-V10-07-12: Improve description of models for Qt scene tree. + +30 June 2021 John Allison (vis-V10-07-08) +- Requires greps-V10-07-09. +- Revise vis models. See modeling-V10-07-11 for more details. +- Includes: + - modeling-V10-07-11 + - visman-V10-07-11 + - vis-HepRep-V10-07-03 + - raytracer-V10-07-01 + - vis_toolssg-V10-07-06 +- Consequent changes: + o AddPrimitive(const G4Scale&) has been removed from all scene handlers. + o Draw(const G4Scale&) has been removed from G4VisManager. + o /vis/scene/add/scale reimplemented with G4CallBackModel. + o All commands using G4CallBackModel follow interface change. + +29 June 2021 Gabriele Cosmo +- vis-HepRep-V10-07-02: Fix C++20 compilation error. + +15 June 2021 John Allison +- modeling-V10-07-10: Fix touchables bug. + 07 June 2021 John Allison (vis-V10-07-07) - Introduce "Special Mesh Rendering": o New commands: diff --git a/source/visualization/OpenGL/GNUmakefile b/source/visualization/OpenGL/GNUmakefile index b61fc64c6e..5c9d9bba0d 100644 --- a/source/visualization/OpenGL/GNUmakefile +++ b/source/visualization/OpenGL/GNUmakefile @@ -54,5 +54,79 @@ CPPFLAGS += -I$(G4BASE)/event/include CPPFLAGS += -I$(G4BASE)/run/include CPPFLAGS += -I$(G4BASE)/tasking/include +# Locally adjust source list before including common.gmk +sources := $(addprefix src/,G4OpenGLImmediateViewer.cc \ + G4OpenGLImmediateSceneHandler.cc \ + G4OpenGLViewer.cc \ + G4OpenGLStoredViewer.cc \ + G4OpenGLStoredSceneHandler.cc \ + G4OpenGLFontBaseStore.cc \ + G4OpenGLSceneHandler.cc \ + G4OpenGLViewerMessenger.cc \ + G4OpenGLTransform3D.cc \ + G4VisFeaturesOfOpenGL.cc) + +ifdef G4VIS_BUILD_OPENGLX_DRIVER + sources += $(addprefix src/,\ + G4OpenGLImmediateX.cc \ + G4OpenGLImmediateXViewer.cc \ + G4OpenGLStoredX.cc \ + G4OpenGLStoredXViewer.cc \ + G4OpenGLXViewer.cc) +endif + +ifdef G4VIS_BUILD_OPENGLXM_DRIVER + sources += $(addprefix src/,\ + G4OpenGLImmediateXm.cc \ + G4OpenGLImmediateXmViewer.cc \ + G4OpenGLStoredXm.cc \ + G4OpenGLStoredXmViewer.cc \ + G4OpenGLXm.cc \ + G4OpenGLXmBox.cc \ + G4OpenGLXmConvenienceRoutines.cc \ + G4OpenGLXmFourArrowButtons.cc \ + G4OpenGLXmFramedBox.cc \ + G4OpenGLXmMainMenubarCallbacks.cc \ + G4OpenGLXmPanningCallbacks.cc \ + G4OpenGLXmPushButton.cc \ + G4OpenGLXmRadioButton.cc \ + G4OpenGLXmRotationCallbacks.cc \ + G4OpenGLXmSeparator.cc \ + G4OpenGLXmSliderBar.cc \ + G4OpenGLXmStyleCallbacks.cc \ + G4OpenGLXmTextField.cc \ + G4OpenGLXmTopLevelShell.cc \ + G4OpenGLXmViewer.cc \ + G4OpenGLXmViewerMessenger.cc \ + G4OpenGLXmVWidgetComponent.cc \ + G4OpenGLXmVWidgetContainer.cc \ + G4OpenGLXmVWidgetObject.cc \ + G4OpenGLXmVWidgetShell.cc \ + G4OpenGLXmWindowHandlingCallbacks.cc) +endif + +ifdef G4VIS_BUILD_OPENGLQT_DRIVER + sources += $(addprefix src/, \ + G4OpenGLImmediateQt.cc \ + G4OpenGLImmediateQtViewer.cc \ + G4OpenGLQt.cc \ + G4OpenGLQtExportDialog.cc \ + G4OpenGLQtMovieDialog.cc \ + G4OpenGLVboDrawer.cc \ + G4OpenGLQtViewer.cc \ + G4OpenGLStoredQt.cc \ + G4OpenGLStoredQtSceneHandler.cc \ + G4OpenGLStoredQtViewer.cc) +endif + +ifdef G4VIS_BUILD_OPENGLWIN32_DRIVER + sources += $(addprefix src/, \ + G4OpenGLImmediateWin32.cc \ + G4OpenGLImmediateWin32Viewer.cc \ + G4OpenGLStoredWin32.cc \ + G4OpenGLStoredWin32Viewer.cc \ + G4OpenGLWin32Viewer.cc) +endif + include $(G4INSTALL)/config/moc.gmk include $(G4INSTALL)/config/common.gmk diff --git a/source/visualization/OpenGL/History b/source/visualization/OpenGL/History index ccd9375af1..0687cc0b1a 100644 --- a/source/visualization/OpenGL/History +++ b/source/visualization/OpenGL/History @@ -16,6 +16,123 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +12 November 2021 - Ben Morgan (opengl-V10-07-25) +- Retire G4VIS_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +8 November 2021 - Ben Morgan (opengl-V10-07-24) +- Retire G4UI/G4INTY_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +30 October 2021 John Allison (opengl-V10-07-23) +- G4OpenGLStoredXmViewer destructor: + No need to RemoveViewerFromList - this is done in the G4VViewer base class. + +25 October 2021 Guy Barrand (opengl-V10-07-22) +- G4OpenGLImmediateSceneHandler.hh: idem as below. +- G4OpenGLStoredSceneHandler.hh: idem as below. +- G4OpenGLSceneHandler.hh: to quiet g++ about "AddPrimitive(G4Plotter&)", have: + using G4VSceneHandler::AddPrimitive; + +21 September 2021 Guilherme Amadio (opengl-V10-07-21) +- G4OpenGLViewer: + o Fix C++20 warnings from GCC 11.2.0. + +06 September 2021 John Allison (opengl-V10-07-20) +- G4OpenGLImmediateQtViewer.cc and G4OpenGLStoredQtViewer.cc: + o Set jpg as default export format for Qt viewers. + . For use with /vis/ogl/export. + . jpg is only available for Qt viewers - pdf is the default for + other OpenGL viewers. + . jpg is more faithful than pdf. For example, pdf, which uses gl2ps, + is not good with transparency. Also gl2ps does not do text. + . For complicated images - detectors of many tracks - gl2ps creates + *huge* files. I have seen some 1000x bigger than the equivalent jpg. + +01 August 2021 John Allison (opengl-V10-07-19) +- G4OpenGLQtViewer::DrawText: + o Fix text alignment issue with a fudge factor. + o Specialise fudge factor for __APPLE__. It seems only Mac has this + problem. Maybe it's to do with the retina display. Maybe Qt keeps + it's own pixel size. + +20 July 2021 John Allison (opengl-V10-07-18) +- G4OpenGLViewerMessenger: + o Remove /vis/ogl/printEPS. + o This command is covered by the more versatile /vis/ogl/export. + +19 July 2021 John Allison (opengl-V10-07-17) +- G4OpenGLSceneHandler.cc: + o Use C++17 [[fallthrough]] instead of // fallthrough in switch statements. + +17 July 2021 John Allison (opengl-V10-07-16) +- Rationalise image exporting in preparation for removing /vis/ogl/printEPS. + o G4OpenGLViewer: + . Subsume the code in printEPS into exportImage, thereby allowing + the removal of the former function. exportImage is the "primary" + function, called by the printEPS and export commands and callback + functions. It calls printEPS, and is the only function to do so, so + to rationalise and avoid confusion, move all the code to exportImage. + o G4OpenGLXmViewer::print_callback: + . Call exportImage instead of printEPS. + +13 July 2021 John Allison (opengl-V10-07-15) +- G4OpenGLStoredSceneHandler.cc, G4OpenGLViewerMessenger.cc: + o Increase the default display list limit to 10 million. + o The default OpenGL display list limit was 50,000, an archaic value + from the days when memory was much more limited than is typical today. + This MR increases the default value to 10 million, easily accommodated + by modern RAM and GPU memory. + o The number can be changed with /vis/ogl/displayListLimit, either to + increase it further or lower it, subject to a lower limit of 10,000. + +12 July 2021 John Allison (opengl-V10-07-14) +- G4OpenGLImmediateXViewer::FinishView() +- G4OpenGLImmediateXmViewer::FinishView() +- G4OpenGLStoredXViewer::FinishView() +- G4OpenGLStoredXmViewer::FinishView() +- G4OpenGLXViewer::ShowView() +- G4OpenGLXmViewer::ShowView() + o Comment out glXWaitGL(). + . Wait for effects of all previous OpenGL commands to be propagated + before progressing. + . Commented out July 2021 - slows rendering down in some cases and I + don't see any adverse effects. + +08 July 2021 John Allison (opengl-V10-07-13) +- G4OpenGLSceneHandler.cc: + o Disable (comment out) backface culling. +- G4OpenGLStoredViewer.cc and G4OpenGLStoredQtViewer.cc: + o Suppress kernel visit (no longer needed) for cutaway drawing. +- Note 1: Section and Cutaway can reveal back-facing faces. If backface culling + is implemented, the image can look strange because the back-facing faces are + not there. As described above, we have disabled (commented out) backface + culling. It seems not to affect performance - in fact, performance seems to + improve it. Maybe the feature is archaic and modern GPUs are simply more + efficient if backface culling is not requested. +- Note 2: In G4OpenGLStored(Qt)Viewer::CompareForKernelVisit we decide if a + "kernel visit" (which involves a reconstruction of the graphical database + from the Geant4 kernel) is required on a change of view parameters. Simple + rotating and zooming does not require a kernel visit, but more sophisticated + parameters may. In G4OpenGLSceneHandler we implement cutaways using + OpenGL cut planes, so now we have disabled backface culling, we do NOT need + to visit the kernel. This is the change that makes a huge speed up when + a user requests cutaways. + +05 July 2021 John Allison (opengl-V10-07-12) +- G4OpenGLQtViewer: + o Use modelShortName instead of modelDescription for TreeWidgetItem + for nonPVmodel. + +30 June 2021 John Allison (opengl-V10-07-11) +- Requires greps-V10-07-09, modeling-V10-07-11 and visman-V10-07-11. +- Revise vis models. See visualization/modeling/History for more details. +- Consequent changes: + o AddPrimitive(const G4Scale&) has been removed from all scene handlers. + +29 June 2021 Gabriele Cosmo (opengl-V10-07-10) +- Fixed compilation error in G4OpenGLXmConvenienceRoutines when c++20 is enabled. + 07 June 2021 John Allison (opengl-V10-07-09) - Requires greps-V10-07-07 (new method AddCompound (const G4Mesh&)). - Requires modeling-V10-07-09 (new class G4Mesh). diff --git a/source/visualization/OpenGL/include/G4OpenGL.hh b/source/visualization/OpenGL/include/G4OpenGL.hh index a88203efc8..c17b5eb2cd 100644 --- a/source/visualization/OpenGL/include/G4OpenGL.hh +++ b/source/visualization/OpenGL/include/G4OpenGL.hh @@ -26,7 +26,6 @@ // // G.Barrand. -#if defined (G4VIS_BUILD_OPENGL_DRIVER) || defined (G4VIS_USE_OPENGL) #ifndef G4OpenGL_h #define G4OpenGL_h @@ -90,5 +89,3 @@ #define G4OPENGL_FLT_BIG 1.e20 #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLImmediateQtViewer.hh b/source/visualization/OpenGL/include/G4OpenGLImmediateQtViewer.hh index d328b29aa6..67cb748e28 100644 --- a/source/visualization/OpenGL/include/G4OpenGLImmediateQtViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLImmediateQtViewer.hh @@ -29,8 +29,6 @@ // Class G4OpenGLImmediateQtViewer : a class derived from // G4OpenGLQtViewer and G4OpenGLImmediateViewer. -#if defined (G4VIS_BUILD_OPENGLQT_DRIVER) || defined (G4VIS_USE_OPENGLQT) - #ifndef G4OPENGLIMMEDIATEQTVIEWER_HH #define G4OPENGLIMMEDIATEQTVIEWER_HH @@ -75,5 +73,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLImmediateSceneHandler.hh b/source/visualization/OpenGL/include/G4OpenGLImmediateSceneHandler.hh index c93815b767..f698f84d19 100644 --- a/source/visualization/OpenGL/include/G4OpenGLImmediateSceneHandler.hh +++ b/source/visualization/OpenGL/include/G4OpenGLImmediateSceneHandler.hh @@ -29,8 +29,6 @@ // Andrew Walkden 10th February 1997 // G4OpenGLImmediateSceneHandler - no Display lists. -#if defined (G4VIS_BUILD_OPENGL_DRIVER) || defined (G4VIS_USE_OPENGL) - #ifndef G4OPENGLIMMEDIATESCENEHANDLER_HH #define G4OPENGLIMMEDIATESCENEHANDLER_HH @@ -51,12 +49,12 @@ public: void EndPrimitives2D (); void BeginModeling (); void EndModeling (); + using G4VSceneHandler::AddPrimitive; void AddPrimitive (const G4Polyline&); void AddPrimitive (const G4Polymarker&); void AddPrimitive (const G4Text& text); void AddPrimitive (const G4Circle&); void AddPrimitive (const G4Square&); - void AddPrimitive (const G4Scale& scale); void AddPrimitive (const G4Polyhedron&); protected: @@ -73,5 +71,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLImmediateViewer.hh b/source/visualization/OpenGL/include/G4OpenGLImmediateViewer.hh index 0d9854e618..48e8a09f4b 100644 --- a/source/visualization/OpenGL/include/G4OpenGLImmediateViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLImmediateViewer.hh @@ -31,8 +31,6 @@ // an OpenGL viewer, for inheritance by // derived (X, Xm...) classes. -#if defined (G4VIS_BUILD_OPENGL_DRIVER) || defined (G4VIS_USE_OPENGL) - #ifndef G4OPENGLIMMEDIATEVIEWER_HH #define G4OPENGLIMMEDIATEVIEWER_HH @@ -50,5 +48,3 @@ public: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLImmediateWin32Viewer.hh b/source/visualization/OpenGL/include/G4OpenGLImmediateWin32Viewer.hh index 7194e024b6..77e824cda9 100644 --- a/source/visualization/OpenGL/include/G4OpenGLImmediateWin32Viewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLImmediateWin32Viewer.hh @@ -29,8 +29,6 @@ // Class G4OpenGLImmediateWin32Viewer : a class derived from // G4OpenGLWin32Viewer and G4OpenGLImmediateViewer. -#if defined (G4VIS_BUILD_OPENGLWIN32_DRIVER) || defined (G4VIS_USE_OPENGLWIN32) - #ifndef G4OpenGLIMMEDIATEWIN32VIEWER_HH #define G4OpenGLIMMEDIATEWIN32VIEWER_HH @@ -53,5 +51,3 @@ public: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLImmediateXViewer.hh b/source/visualization/OpenGL/include/G4OpenGLImmediateXViewer.hh index 5f43794fbb..cd641b0e53 100644 --- a/source/visualization/OpenGL/include/G4OpenGLImmediateXViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLImmediateXViewer.hh @@ -30,8 +30,6 @@ // Class G4OpenGLImmediateXViewer : a class derived from G4OpenGLXViewer and // G4OpenGLImmediateViewer. -#if defined (G4VIS_BUILD_OPENGLX_DRIVER) || defined (G4VIS_USE_OPENGLX) - #ifndef G4OpenGLIMMEDIATEXVIEWER_HH #define G4OpenGLIMMEDIATEXVIEWER_HH @@ -55,5 +53,3 @@ public: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLImmediateXmViewer.hh b/source/visualization/OpenGL/include/G4OpenGLImmediateXmViewer.hh index 34c885070a..6694a69e89 100644 --- a/source/visualization/OpenGL/include/G4OpenGLImmediateXmViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLImmediateXmViewer.hh @@ -30,8 +30,6 @@ // G4OpenGLXmViewer : Class derived from G4OpenGLXViewer, to provide // (Motif) widget OpenGL functionality for GEANT4. -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLIMMEDIATEXMVIEWER_HH #define G4OPENGLIMMEDIATEXMVIEWER_HH @@ -56,5 +54,3 @@ public: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLQtExportDialog.hh b/source/visualization/OpenGL/include/G4OpenGLQtExportDialog.hh index b22baf265d..66a186de23 100644 --- a/source/visualization/OpenGL/include/G4OpenGLQtExportDialog.hh +++ b/source/visualization/OpenGL/include/G4OpenGLQtExportDialog.hh @@ -27,8 +27,6 @@ // // -#if defined (G4VIS_BUILD_OPENGLQT_DRIVER) || defined (G4VIS_USE_OPENGLQT) - #ifndef G4OPENGLQTEXPORTDIALOG_HH #define G4OPENGLQTEXPORTDIALOG_HH @@ -121,5 +119,3 @@ class G4OpenGLQtExportDialog : public QDialog }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLQtMovieDialog.hh b/source/visualization/OpenGL/include/G4OpenGLQtMovieDialog.hh index ffc22be2f6..9b4bff162d 100644 --- a/source/visualization/OpenGL/include/G4OpenGLQtMovieDialog.hh +++ b/source/visualization/OpenGL/include/G4OpenGLQtMovieDialog.hh @@ -27,8 +27,6 @@ // // -#if defined (G4VIS_BUILD_OPENGLQT_DRIVER) || defined (G4VIS_USE_OPENGLQT) - #ifndef G4OPENGLQTMOVIEDIALOG_HH #define G4OPENGLQTMOVIEDIALOG_HH @@ -89,5 +87,3 @@ private Q_SLOTS : }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLQtViewer.hh b/source/visualization/OpenGL/include/G4OpenGLQtViewer.hh index 06a90e449b..87179ce122 100644 --- a/source/visualization/OpenGL/include/G4OpenGLQtViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLQtViewer.hh @@ -31,8 +31,6 @@ // // 30/06/2014 : M.Kelsey : Change QPixmap objects to pointers -#if defined (G4VIS_BUILD_OPENGLQT_DRIVER) || defined (G4VIS_USE_OPENGLQT) - #ifndef G4OPENGLQTVIEWER_HH #define G4OPENGLQTVIEWER_HH @@ -433,5 +431,3 @@ private Q_SLOTS : }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLSceneHandler.hh b/source/visualization/OpenGL/include/G4OpenGLSceneHandler.hh index 1221d1b419..b3acfd1729 100644 --- a/source/visualization/OpenGL/include/G4OpenGLSceneHandler.hh +++ b/source/visualization/OpenGL/include/G4OpenGLSceneHandler.hh @@ -30,8 +30,6 @@ // OpenGL scene handler - base for immediate mode and stored mode classes to // inherit from. -#if defined (G4VIS_BUILD_OPENGL_DRIVER) || defined (G4VIS_USE_OPENGL) - #ifndef G4OPENGLSCENEHANDLER_HH #define G4OPENGLSCENEHANDLER_HH @@ -54,6 +52,7 @@ public: virtual void EndPrimitives (); virtual void BeginPrimitives2D (const G4Transform3D& objectTransformation); virtual void EndPrimitives2D (); + using G4VSceneHandler::AddPrimitive; void AddPrimitive (const G4Polyline&); void AddPrimitive (const G4Polymarker&); void AddPrimitive (const G4Text&); @@ -61,7 +60,6 @@ public: void AddPrimitive (const G4Square&); void AddPrimitivesCircle (const std::vector &); void AddPrimitivesSquare (const std::vector &); - void AddPrimitive (const G4Scale&); void AddPrimitive (const G4Polyhedron&); void PreAddSolid (const G4Transform3D& objectTransformation, @@ -182,5 +180,3 @@ protected: #include "G4OpenGLSceneHandler.icc" #endif // G4OPENGLSCENEHANDLER_HH - -#endif // G4VIS_BUILD_OPENGL_DRIVER diff --git a/source/visualization/OpenGL/include/G4OpenGLStoredQtSceneHandler.hh b/source/visualization/OpenGL/include/G4OpenGLStoredQtSceneHandler.hh index 934540d092..47e5c4b4bf 100644 --- a/source/visualization/OpenGL/include/G4OpenGLStoredQtSceneHandler.hh +++ b/source/visualization/OpenGL/include/G4OpenGLStoredQtSceneHandler.hh @@ -28,8 +28,6 @@ // // Laurent Garnier 27th October 2011 -#if defined (G4VIS_BUILD_OPENGLQT_DRIVER) || defined (G4VIS_USE_OPENGLQT) - #ifndef G4OPENGLSTOREDQTSCENEHANDLER_HH #define G4OPENGLSTOREDQTSCENEHANDLER_HH @@ -57,5 +55,3 @@ public: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLStoredQtViewer.hh b/source/visualization/OpenGL/include/G4OpenGLStoredQtViewer.hh index 6d95d964c6..18b3798a03 100644 --- a/source/visualization/OpenGL/include/G4OpenGLStoredQtViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLStoredQtViewer.hh @@ -29,8 +29,6 @@ // Class G4OpenGLStoredQtViewer : a class derived from // G4OpenGLQtViewer and G4OpenGLStoredViewer. -#if defined (G4VIS_BUILD_OPENGLQT_DRIVER) || defined (G4VIS_USE_OPENGLQT) - #ifndef G4OPENGLSTOREDQTVIEWER_HH #define G4OPENGLSTOREDQTVIEWER_HH @@ -86,5 +84,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLStoredSceneHandler.hh b/source/visualization/OpenGL/include/G4OpenGLStoredSceneHandler.hh index 0517148625..08fb05542e 100644 --- a/source/visualization/OpenGL/include/G4OpenGLStoredSceneHandler.hh +++ b/source/visualization/OpenGL/include/G4OpenGLStoredSceneHandler.hh @@ -29,8 +29,6 @@ // Andrew Walkden 10th February 1997 // G4OpenGLStoredSceneHandler - creates OpenGL Display lists. -#if defined (G4VIS_BUILD_OPENGL_DRIVER) || defined (G4VIS_USE_OPENGL) - #ifndef G4OPENGLSTOREDSCENEHANDLER_HH #define G4OPENGLSTOREDSCENEHANDLER_HH @@ -56,12 +54,12 @@ public: void EndPrimitives2D (); void BeginModeling (); void EndModeling (); + using G4VSceneHandler::AddPrimitive; void AddPrimitive (const G4Polyline&); void AddPrimitive (const G4Polymarker&); void AddPrimitive (const G4Circle&); void AddPrimitive (const G4Square&); void AddPrimitive (const G4Text&); - void AddPrimitive (const G4Scale&); void AddPrimitive (const G4Polyhedron&); void ClearStore (); void ClearTransientStore (); @@ -151,5 +149,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLStoredViewer.hh b/source/visualization/OpenGL/include/G4OpenGLStoredViewer.hh index 8cf8cfaba9..acfbba82d2 100644 --- a/source/visualization/OpenGL/include/G4OpenGLStoredViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLStoredViewer.hh @@ -31,8 +31,6 @@ // an OpenGL viewer, for inheritance by // derived (X, Xm...) classes. -#if defined (G4VIS_BUILD_OPENGL_DRIVER) || defined (G4VIS_USE_OPENGL) - #ifndef G4OPENGLSTOREDVIEWER_HH #define G4OPENGLSTOREDVIEWER_HH @@ -74,5 +72,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLStoredWin32Viewer.hh b/source/visualization/OpenGL/include/G4OpenGLStoredWin32Viewer.hh index 9bfc9db09d..7c3701f840 100644 --- a/source/visualization/OpenGL/include/G4OpenGLStoredWin32Viewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLStoredWin32Viewer.hh @@ -29,8 +29,6 @@ // Class G4OpenGLStoredWin32Viewer : a class derived from // G4OpenGLWin32Viewer and G4OpenGLStoredViewer. -#if defined (G4VIS_BUILD_OPENGLWIN32_DRIVER) || defined (G4VIS_USE_OPENGLWIN32) - #ifndef G4OPENGLSTOREDWIN32VIEWER_HH #define G4OPENGLSTOREDWIN32VIEWER_HH @@ -53,5 +51,3 @@ public: #endif -#endif - diff --git a/source/visualization/OpenGL/include/G4OpenGLStoredXViewer.hh b/source/visualization/OpenGL/include/G4OpenGLStoredXViewer.hh index 84df579892..ffadb1958a 100644 --- a/source/visualization/OpenGL/include/G4OpenGLStoredXViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLStoredXViewer.hh @@ -30,8 +30,6 @@ // Class G4OpenGLStoredXViewer : a class derived from G4OpenGLXViewer and // G4OpenGLStoredViewer. -#if defined (G4VIS_BUILD_OPENGLX_DRIVER) || defined (G4VIS_USE_OPENGLX) - #ifndef G4OPENGLSTOREDXVIEWER_HH #define G4OPENGLSTOREDXVIEWER_HH @@ -52,6 +50,3 @@ public: }; #endif - -#endif - diff --git a/source/visualization/OpenGL/include/G4OpenGLStoredXmViewer.hh b/source/visualization/OpenGL/include/G4OpenGLStoredXmViewer.hh index 4e61c314d4..eb539b654a 100644 --- a/source/visualization/OpenGL/include/G4OpenGLStoredXmViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLStoredXmViewer.hh @@ -30,8 +30,6 @@ // Class G4OpenGLStoredXmViewer : a class derived from G4OpenGLXmViewer // and G4OpenGLStoredViewer. -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OpenGLSTOREDXMVIEWER_HH #define G4OpenGLSTOREDXMVIEWER_HH @@ -53,5 +51,3 @@ public: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLTransform3D.hh b/source/visualization/OpenGL/include/G4OpenGLTransform3D.hh index f4ec7a6ce8..3b4481ac75 100644 --- a/source/visualization/OpenGL/include/G4OpenGLTransform3D.hh +++ b/source/visualization/OpenGL/include/G4OpenGLTransform3D.hh @@ -30,8 +30,6 @@ // G4OpenGLTransform3D provides OpenGL style transformation matrix // from G4Transform3D. -#if defined (G4VIS_BUILD_OPENGL_DRIVER) || defined (G4VIS_USE_OPENGL) - #ifndef G4OPENGLTRANSFORM3D_HH #define G4OPENGLTRANSFORM3D_HH @@ -47,5 +45,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLViewer.hh b/source/visualization/OpenGL/include/G4OpenGLViewer.hh index 9dfa592ad7..4539e77edc 100644 --- a/source/visualization/OpenGL/include/G4OpenGLViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLViewer.hh @@ -29,8 +29,6 @@ // Andrew Walkden 27th March 1996 // OpenGL viewer - opens window, hard copy, etc. -#if defined (G4VIS_BUILD_OPENGL_DRIVER) || defined (G4VIS_USE_OPENGL) - #ifndef G4OPENGLVIEWER_HH #define G4OPENGLVIEWER_HH @@ -108,12 +106,9 @@ class G4OpenGLViewer: virtual public G4VViewer { public: void ClearView (); void ClearViewWithoutFlush (); -//////////////////////////////Vectored PostScript production functions/// - bool printEPS(); - virtual bool exportImage(std::string name="", int width=-1, int height=-1); + virtual bool exportImage(std::string name="", int width=-1, int height=-1); bool setExportImageFormat(std::string format,bool quiet = false); - // change the export image format according to thoses available for the current viewer #ifdef G4OPENGL_VERSION_2 @@ -282,5 +277,3 @@ protected : }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLViewerMessenger.hh b/source/visualization/OpenGL/include/G4OpenGLViewerMessenger.hh index 3a376111c1..971f722a22 100644 --- a/source/visualization/OpenGL/include/G4OpenGLViewerMessenger.hh +++ b/source/visualization/OpenGL/include/G4OpenGLViewerMessenger.hh @@ -53,7 +53,6 @@ private: G4UIdirectory* fpDirectory; G4UIcommand* fpCommandExport; G4UIcommand* fpCommandFlushAt; - G4UIcmdWithoutParameter* fpCommandPrintEPS; G4UIdirectory* fpDirectorySet; G4UIcmdWithAnInteger* fpCommandDisplayListLimit; diff --git a/source/visualization/OpenGL/include/G4OpenGLWin32Viewer.hh b/source/visualization/OpenGL/include/G4OpenGLWin32Viewer.hh index 7d9595f5da..a0dfeb87ff 100644 --- a/source/visualization/OpenGL/include/G4OpenGLWin32Viewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLWin32Viewer.hh @@ -29,8 +29,6 @@ // G4OpenGLWin32Viewer : Class to provide WindowsNT specific // functionality for OpenGL in GEANT4 -#if defined (G4VIS_BUILD_OPENGLWIN32_DRIVER) || defined (G4VIS_USE_OPENGLWIN32) - #ifndef G4OPENGLWIN32VIEWER_HH #define G4OPENGLWIN32VIEWER_HH @@ -74,5 +72,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXViewer.hh b/source/visualization/OpenGL/include/G4OpenGLXViewer.hh index 4300b806ef..50380fbc16 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXViewer.hh @@ -30,8 +30,6 @@ // G4OpenGLXViewer : Class to provide XWindows specific // functionality for OpenGL in GEANT4 -#if defined (G4VIS_BUILD_OPENGLX_DRIVER) || defined (G4VIS_USE_OPENGLX) - #ifndef G4OPENGLXVIEWER_HH #define G4OPENGLXVIEWER_HH @@ -111,5 +109,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmBox.hh b/source/visualization/OpenGL/include/G4OpenGLXmBox.hh index 07bbe35563..b510ad0368 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmBox.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmBox.hh @@ -28,8 +28,6 @@ // //Box container class -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMBOX_HH #define G4OPENGLXMBOX_HH @@ -68,5 +66,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmFourArrowButtons.hh b/source/visualization/OpenGL/include/G4OpenGLXmFourArrowButtons.hh index b0ab6527a3..b8b55ac29a 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmFourArrowButtons.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmFourArrowButtons.hh @@ -28,8 +28,6 @@ // //Four arrow buttons class. Inherits from G4OpenGLXmVWidgetComponent -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMFOURARROWBUTTONS_HH #define G4OPENGLXMFOURARROWBUTTONS_HH @@ -64,5 +62,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmFramedBox.hh b/source/visualization/OpenGL/include/G4OpenGLXmFramedBox.hh index 400e3e46ea..b153b31cc3 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmFramedBox.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmFramedBox.hh @@ -29,8 +29,6 @@ //Framed box container class //Inherits from G4OpenGLXmBox -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMFRAMEDBOX_HH #define G4OPENGLXMFRAMEDBOX_HH @@ -58,5 +56,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmPushButton.hh b/source/visualization/OpenGL/include/G4OpenGLXmPushButton.hh index 4e75e425dc..81cc1894b9 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmPushButton.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmPushButton.hh @@ -28,8 +28,6 @@ // //Push button class. Inherits from G4OpenGLXmVWidgetComponent -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMPUSHBUTTON_HH #define G4OPENGLXMPUSHBUTTON_HH @@ -61,5 +59,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmRadioButton.hh b/source/visualization/OpenGL/include/G4OpenGLXmRadioButton.hh index 78911e528b..040aedada3 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmRadioButton.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmRadioButton.hh @@ -28,8 +28,6 @@ // //Radio button class. Inherits from G4OpenGLXmVWidgetComponent -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMRADIOBUTTON_HH #define G4OPENGLXMRADIOBUTTON_HH @@ -65,5 +63,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmResources.hh b/source/visualization/OpenGL/include/G4OpenGLXmResources.hh index efb5cfd658..fc4a12ed8f 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmResources.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmResources.hh @@ -28,8 +28,6 @@ // // Default resources file for GEANT4 OpenGL Motif windows. -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMRESOURCES_HH #define G4OPENGLXMRESOURCES_HH @@ -43,5 +41,3 @@ static String fallbackResources[] = { }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmSeparator.hh b/source/visualization/OpenGL/include/G4OpenGLXmSeparator.hh index 3b80974f2a..c6a1743eeb 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmSeparator.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmSeparator.hh @@ -28,8 +28,6 @@ // //Separator class. Inherits from G4OpenGLXmVWidgetComponent -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMSEPARATOR_HH #define G4OPENGLXMSEPARATOR_HH @@ -56,5 +54,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmSliderBar.hh b/source/visualization/OpenGL/include/G4OpenGLXmSliderBar.hh index 7f44f6f85e..91046bd703 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmSliderBar.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmSliderBar.hh @@ -28,8 +28,6 @@ // //Slider bar class. Inherits from G4OpenGLXmVWidgetComponent -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMSLIDERBAR_HH #define G4OPENGLXMSLIDERBAR_HH @@ -92,5 +90,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmTextField.hh b/source/visualization/OpenGL/include/G4OpenGLXmTextField.hh index 8b494ec035..2df19f2097 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmTextField.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmTextField.hh @@ -28,8 +28,6 @@ // //Text field class. Inherits from G4OpenGLXmVWidgetComponent -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMTEXTFIELD_HH #define G4OPENGLXMTEXTFIELD_HH @@ -69,5 +67,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmTopLevelShell.hh b/source/visualization/OpenGL/include/G4OpenGLXmTopLevelShell.hh index 3b9cd6e435..e1e424846c 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmTopLevelShell.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmTopLevelShell.hh @@ -28,8 +28,6 @@ // //Top level shell class -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMTOPLEVELSHELL_HH #define G4OPENGLXMTOPLEVELSHELL_HH @@ -60,5 +58,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmVWidgetComponent.hh b/source/visualization/OpenGL/include/G4OpenGLXmVWidgetComponent.hh index fc9057c11a..2ed82cf24d 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmVWidgetComponent.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmVWidgetComponent.hh @@ -28,8 +28,6 @@ // //Base class for all Motif component widgets -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMVWIDGETCOMPONENT_HH #define G4OPENGLXMVWIDGETCOMPONENT_HH @@ -54,5 +52,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmVWidgetContainer.hh b/source/visualization/OpenGL/include/G4OpenGLXmVWidgetContainer.hh index 4d3a7b2995..86ba52960e 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmVWidgetContainer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmVWidgetContainer.hh @@ -28,8 +28,6 @@ // //Base class for all Motif container widgets -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMVWIDGETCONTAINER_HH #define G4OPENGLXMVWIDGETCONTAINER_HH @@ -56,5 +54,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmVWidgetObject.hh b/source/visualization/OpenGL/include/G4OpenGLXmVWidgetObject.hh index 5b1754a3ac..2048a99908 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmVWidgetObject.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmVWidgetObject.hh @@ -28,8 +28,6 @@ // //Virtual base class for all Motif widgets. -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMVWIDGETOBJECT_HH #define G4OPENGLXMVWIDGETOBJECT_HH @@ -60,5 +58,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmVWidgetShell.hh b/source/visualization/OpenGL/include/G4OpenGLXmVWidgetShell.hh index af2dbac444..a08adc4316 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmVWidgetShell.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmVWidgetShell.hh @@ -28,8 +28,6 @@ // //Base class for all Motif window widgets (shells) -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMVWIDGETSHELL_HH #define G4OPENGLXMVWIDGETSHELL_HH @@ -52,5 +50,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmViewer.hh b/source/visualization/OpenGL/include/G4OpenGLXmViewer.hh index d4f385f44a..e139de8e60 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmViewer.hh @@ -30,8 +30,6 @@ // G4OpenGLXmViewer : Class derived from G4OpenGLXViewer, to provide // (Motif) widget OpenGL functionality for GEANT4. -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMVIEWER_HH #define G4OPENGLXMVIEWER_HH @@ -369,6 +367,4 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLXmViewerMessenger.hh b/source/visualization/OpenGL/include/G4OpenGLXmViewerMessenger.hh index 5ea9338154..d49f904cc6 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXmViewerMessenger.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXmViewerMessenger.hh @@ -25,8 +25,6 @@ // // -#if defined (G4VIS_BUILD_OPENGLXM_DRIVER) || defined (G4VIS_USE_OPENGLXM) - #ifndef G4OPENGLXMVIEWERMESSENGER_HH #define G4OPENGLXMVIEWERMESSENGER_HH @@ -59,6 +57,3 @@ private: }; #endif - -#endif - diff --git a/source/visualization/OpenGL/sources.cmake b/source/visualization/OpenGL/sources.cmake index 2a9fc9b750..fc82c9a7ec 100644 --- a/source/visualization/OpenGL/sources.cmake +++ b/source/visualization/OpenGL/sources.cmake @@ -31,8 +31,6 @@ set(G4VIS_MODULE_OPENGL_SOURCES G4VisFeaturesOfOpenGL.cc ) -add_definitions(-DG4VIS_BUILD_OPENGL_DRIVER) - #---------------------------------------------------------------------------- # Add X11 OpenGL Support if requested # @@ -51,7 +49,7 @@ if(GEANT4_USE_OPENGL_X11) G4OpenGLStoredXViewer.cc G4OpenGLXViewer.cc) - # Add the compile definitions needed for the X11 component + # Add the compile definitions needed for the X11 component (G4OpenGL.hh, G4OpenGLViewer.cc) add_definitions(-DG4VIS_BUILD_OPENGLX_DRIVER) # Add in X11 libraries, plus Xmu library @@ -128,9 +126,8 @@ if(GEANT4_USE_XM) add_definitions(-DG4VIS_BUILD_OPENGLX_DRIVER) endif() - # Add the compile definitions needed for the Xm component, remembering - # to add those for the UI part as well!!! - add_definitions(-DG4VIS_BUILD_OPENGLXM_DRIVER -DG4INTY_BUILD_XT -DG4UI_BUILD_XM_SESSION) + # Add the compile definitions needed for the Xm component (G4OpenGL.hh, G4OpenGLViewer.cc) + add_definitions(-DG4VIS_BUILD_OPENGLXM_DRIVER) # Add in Xm, X11 libraries, plus Xmu library set(G4VIS_MODULE_OPENGL_LINK_LIBRARIES Motif::Xm X11::SM X11::ICE X11::X11 X11::Xext X11::Xmu ${G4VIS_MODULE_OPENGL_LINK_LIBRARIES}) @@ -169,9 +166,8 @@ if(GEANT4_USE_QT) G4OpenGLStoredQtSceneHandler.cc G4OpenGLStoredQtViewer.cc) - # Add the definitions - # Argh.. Have to remember about INTY and UI because of their use... - add_definitions(-DG4VIS_BUILD_OPENGLQT_DRIVER -DG4INTY_BUILD_QT -DG4UI_BUILD_QT_SESSION) + # Add the definitions (G4OpenGL.hh, G4OpenGLViewer.cc) + add_definitions(-DG4VIS_BUILD_OPENGLQT_DRIVER) # Add in Qt libraries list(APPEND G4VIS_MODULE_OPENGL_LINK_LIBRARIES Qt5::OpenGL Qt5::Gui Qt5::PrintSupport Qt5::Widgets OpenGL::GL) @@ -198,7 +194,7 @@ if(GEANT4_USE_OPENGL_WIN32) G4OpenGLWin32Viewer.cc ) - # Add the compile definitions + # Add the compile definitions (G4OpenGL.hh, G4OpenGLViewer.cc) add_definitions(-DG4VIS_BUILD_OPENGLWIN32_DRIVER) list(APPEND G4VIS_MODULE_OPENGL_LINK_LIBRARIES OpenGL::GL) endif() diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateQt.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateQt.cc index 0c7ece47fb..112b32a64a 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateQt.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateQt.cc @@ -28,8 +28,6 @@ // // OpenGLImmediateQt graphics system factory. -#ifdef G4VIS_BUILD_OPENGLQT_DRIVER - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLSceneHandler.hh" @@ -75,5 +73,3 @@ G4VViewer* G4OpenGLImmediateQt::CreateViewer } return pView; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateQtViewer.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateQtViewer.cc index f79f3b5f5a..286637f81a 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateQtViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateQtViewer.cc @@ -29,8 +29,6 @@ // Class G4OpenGLImmediateQtViewer : a class derived from G4OpenGLQtViewer and // G4OpenGLImmediateViewer. -#ifdef G4VIS_BUILD_OPENGLQT_DRIVER - #include "G4OpenGLImmediateQtViewer.hh" #include "G4OpenGLImmediateSceneHandler.hh" @@ -147,6 +145,9 @@ void G4OpenGLImmediateQtViewer::initializeGL () { // and update it immediatly before wait for SessionStart() (batch mode) // QCoreApplication::sendPostedEvents () ; + + // Set jpg as default export format for Qt viewer + setExportImageFormat("jpg"); } @@ -344,4 +345,3 @@ void G4OpenGLImmediateQtViewer::ShowView ( fHasToRepaint = true; activateWindow(); } -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateSceneHandler.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateSceneHandler.cc index 5aeebdfdb1..8823445394 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateSceneHandler.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateSceneHandler.cc @@ -30,8 +30,6 @@ // OpenGL immediate scene - draws immediately to buffer // (saving space on server). -#ifdef G4VIS_BUILD_OPENGL_DRIVER - #include "G4OpenGLImmediateSceneHandler.hh" #include "G4OpenGLViewer.hh" @@ -41,7 +39,6 @@ #include "G4Text.hh" #include "G4Circle.hh" #include "G4Square.hh" -#include "G4Scale.hh" #include "G4Polyhedron.hh" #include "G4AttHolder.hh" @@ -189,14 +186,6 @@ void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Square& square) } } -void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Scale& scale) -{ - G4bool furtherprocessing = AddPrimitivePreamble(scale); - if (furtherprocessing) { - G4OpenGLSceneHandler::AddPrimitive(scale); - } -} - void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { // Note: colour is still handled in @@ -297,5 +286,3 @@ void G4OpenGLImmediateSceneHandler::ClearTransientStore () } G4int G4OpenGLImmediateSceneHandler::fSceneIdCount = 0; - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateViewer.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateViewer.cc index 604d7f8ad0..5d3af95e5b 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateViewer.cc @@ -31,8 +31,6 @@ // an OpenGL view, for inheritance by // derived (X, Xm...) classes. -#ifdef G4VIS_BUILD_OPENGL_DRIVER - #include "G4OpenGLImmediateViewer.hh" #include "G4OpenGLImmediateSceneHandler.hh" @@ -65,5 +63,3 @@ void G4OpenGLImmediateViewer::ProcessView () if (cutawayUnion) glDisable (GL_CLIP_PLANE2); } } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateWin32.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateWin32.cc index f856f1ff98..3fb41c5f54 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateWin32.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateWin32.cc @@ -28,8 +28,6 @@ // // OpenGLImmediateWin32 graphics system factory. -#ifdef G4VIS_BUILD_OPENGLWIN32_DRIVER - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLSceneHandler.hh" @@ -75,5 +73,3 @@ G4VViewer* G4OpenGLImmediateWin32::CreateViewer } return pView; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateWin32Viewer.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateWin32Viewer.cc index 062020ddc6..4fb62e9f6f 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateWin32Viewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateWin32Viewer.cc @@ -29,8 +29,6 @@ // Class G4OpenGLImmediateWin32Viewer : a class derived from G4OpenGLWin32Viewer and // G4OpenGLImmediateViewer. -#ifdef G4VIS_BUILD_OPENGLWIN32_DRIVER - #include "G4OpenGLImmediateWin32Viewer.hh" #include "G4OpenGLImmediateSceneHandler.hh" @@ -112,5 +110,3 @@ void G4OpenGLImmediateWin32Viewer::FinishView ( ::DispatchMessage (&event); } } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateX.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateX.cc index 3effc1a876..c1360efba4 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateX.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateX.cc @@ -29,8 +29,6 @@ // Andrew Walkden 27th March 1996 // OpenGL graphics system factory. -#ifdef G4VIS_BUILD_OPENGLX_DRIVER - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLSceneHandler.hh" @@ -75,5 +73,3 @@ G4VViewer* G4OpenGLImmediateX::CreateViewer (G4VSceneHandler& scene, } return pView; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateXViewer.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateXViewer.cc index db80a31d75..cef4fa28d2 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateXViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateXViewer.cc @@ -30,8 +30,6 @@ // Class G4OpenGLImmediateXViewer : a class derived from G4OpenGLXViewer and // G4OpenGLImmediateViewer. -#ifdef G4VIS_BUILD_OPENGLX_DRIVER - #include "G4OpenGLImmediateXViewer.hh" #include "G4OpenGLImmediateSceneHandler.hh" @@ -98,9 +96,9 @@ void G4OpenGLImmediateXViewer::DrawView () { } void G4OpenGLImmediateXViewer::FinishView () { - glXWaitGL (); //Wait for effects of all previous OpenGL commands to - //be propogated before progressing. +// glXWaitGL (); //Wait for effects of all previous OpenGL commands to + //be propagated before progressing. +// JA: Commented out July 2021 - slows rendering down in some cases and I +// don't see any adverse effects. glFlush (); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateXm.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateXm.cc index 655c9aa339..76c4b6177a 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateXm.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateXm.cc @@ -29,8 +29,6 @@ // Andrew Walkden 10th February 1997 // OpenGL graphics system factory. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLSceneHandler.hh" @@ -77,5 +75,3 @@ G4VViewer* G4OpenGLImmediateXm::CreateViewer (G4VSceneHandler& scene, } return pView; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateXmViewer.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateXmViewer.cc index b469fd11b1..04e548ce22 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateXmViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateXmViewer.cc @@ -30,8 +30,6 @@ // Class G4OpenGLImmediateXmViewer : a class derived from G4OpenGLXmViewer // and G4OpenGLImmediateViewer. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLImmediateXmViewer.hh" #include "G4OpenGLImmediateSceneHandler.hh" @@ -108,9 +106,9 @@ void G4OpenGLImmediateXmViewer::FinishView () { #ifdef G4DEBUG_VIS_OGL printf("G4OpenGLImmediateXmViewer::FinishView : \n"); #endif - glXWaitGL (); //Wait for effects of all previous OpenGL commands to - //be propogated before progressing. +// glXWaitGL (); //Wait for effects of all previous OpenGL commands to + //be propagated before progressing. +// JA: Commented out July 2021 - slows rendering down in some cases and I +// don't see any adverse effects. glFlush (); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLQt.cc b/source/visualization/OpenGL/src/G4OpenGLQt.cc index 433bf2a8e9..7c1fe43b69 100644 --- a/source/visualization/OpenGL/src/G4OpenGLQt.cc +++ b/source/visualization/OpenGL/src/G4OpenGLQt.cc @@ -28,8 +28,6 @@ // John Allison 27th October 2012 // Base class for OpenGLImmediate/StoredQt graphics system factories. -#ifdef G4VIS_BUILD_OPENGLQT_DRIVER - #include "G4OpenGLQt.hh" #include "G4UIQt.hh" @@ -73,5 +71,3 @@ G4bool G4OpenGLQt::IsUISessionCompatible () const } return isCompatible; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLQtExportDialog.cc b/source/visualization/OpenGL/src/G4OpenGLQtExportDialog.cc index 5c3b857871..5d9463bdc3 100644 --- a/source/visualization/OpenGL/src/G4OpenGLQtExportDialog.cc +++ b/source/visualization/OpenGL/src/G4OpenGLQtExportDialog.cc @@ -27,8 +27,6 @@ // // -#ifdef G4VIS_BUILD_OPENGLQT_DRIVER - #include "G4OpenGLQtExportDialog.hh" #include @@ -333,6 +331,3 @@ void G4OpenGLQtExportDialog:: textHeightChanged( G4OpenGLQtExportDialog::~G4OpenGLQtExportDialog() { } - - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLQtMovieDialog.cc b/source/visualization/OpenGL/src/G4OpenGLQtMovieDialog.cc index 304fe1e6f3..d1530b1014 100644 --- a/source/visualization/OpenGL/src/G4OpenGLQtMovieDialog.cc +++ b/source/visualization/OpenGL/src/G4OpenGLQtMovieDialog.cc @@ -27,8 +27,6 @@ // // -#ifdef G4VIS_BUILD_OPENGLQT_DRIVER - #include "G4OpenGLQtViewer.hh" // should be first in case we include // some boost SIGNAL/SLOT library #include "G4OpenGLQtMovieDialog.hh" @@ -466,5 +464,3 @@ void G4OpenGLQtMovieDialog::setRecordingInfos(QString txt) { void G4OpenGLQtMovieDialog::enabledApplyButton() { fButtonStartPause->setEnabled(true); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLQtViewer.cc b/source/visualization/OpenGL/src/G4OpenGLQtViewer.cc index 3897afe8f0..227c49cc7f 100644 --- a/source/visualization/OpenGL/src/G4OpenGLQtViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLQtViewer.cc @@ -29,8 +29,6 @@ // 27/06/2003 : G.Barrand : implementation (at last !). // 30/06/2014 : M.Kelsey : Change QPixmap objects to pointers -#ifdef G4VIS_BUILD_OPENGLQT_DRIVER - #include "G4LogicalVolumeStore.hh" #include "G4PhysicalVolumeStore.hh" #include "G4VisCommandsGeometrySet.hh" @@ -556,11 +554,11 @@ void G4OpenGLQtViewer::createPopupMenu() { fMouseZoomOutAction = mMouseAction->addAction("Zoom out", fSignalMapperMouse, SLOT(map())); fMouseZoomInAction = mMouseAction->addAction("Zoom in", fSignalMapperMouse, SLOT(map())); #else - fMouseRotateAction = mMouseAction->addAction("Rotate", this, [=](){ this->toggleMouseAction(1); }); - fMouseMoveAction = mMouseAction->addAction("Move", this, [=](){ this->toggleMouseAction(2); }); - fMousePickAction = mMouseAction->addAction("Pick", this, [=](){ this->toggleMouseAction(3); }); - fMouseZoomOutAction = mMouseAction->addAction("Zoom out", this, [=](){ this->toggleMouseAction(4); }); - fMouseZoomInAction = mMouseAction->addAction("Zoom in", this, [=](){ this->toggleMouseAction(5); }); + fMouseRotateAction = mMouseAction->addAction("Rotate", this, [this](){ this->toggleMouseAction(1); }); + fMouseMoveAction = mMouseAction->addAction("Move", this, [this](){ this->toggleMouseAction(2); }); + fMousePickAction = mMouseAction->addAction("Pick", this, [this](){ this->toggleMouseAction(3); }); + fMouseZoomOutAction = mMouseAction->addAction("Zoom out", this, [this](){ this->toggleMouseAction(4); }); + fMouseZoomInAction = mMouseAction->addAction("Zoom in", this, [this](){ this->toggleMouseAction(5); }); #endif QAction *shortcutsAction = mMouseAction->addAction("Show shortcuts"); @@ -602,8 +600,8 @@ void G4OpenGLQtViewer::createPopupMenu() { } #else // no more radioAction, not realy useful and could be confusing to use context menu and icon at the same time - fProjectionOrtho = mProjection->addAction("Orthographic", this, [=](){ this->toggleProjection(1); }); - fProjectionPerspective = mProjection->addAction("Perspective", this, [=](){ this->toggleProjection(2); }); + fProjectionOrtho = mProjection->addAction("Orthographic", this, [this](){ this->toggleProjection(1); }); + fProjectionPerspective = mProjection->addAction("Perspective", this, [this](){ this->toggleProjection(2); }); #endif // === Drawing Menu === QMenu *mDrawing = mStyle->addMenu("&Drawing"); @@ -625,10 +623,10 @@ void G4OpenGLQtViewer::createPopupMenu() { fSignalMapperSurface->setMapping(fDrawingSurfaceRemoval,3); fSignalMapperSurface->setMapping(fDrawingLineSurfaceRemoval,4); #else - fDrawingWireframe = mDrawing->addAction("Wireframe", this, [=](){ this->toggleSurfaceAction(1); }); - fDrawingLineRemoval = mDrawing->addAction("Hidden line removal", this, [=](){ this->toggleSurfaceAction(2); }); - fDrawingSurfaceRemoval = mDrawing->addAction("Hidden Surface removal", this, [=](){ this->toggleSurfaceAction(3); }); - fDrawingLineSurfaceRemoval = mDrawing->addAction("Hidden line and surface removal", this, [=](){ this->toggleSurfaceAction(4); }); + fDrawingWireframe = mDrawing->addAction("Wireframe", this, [this](){ this->toggleSurfaceAction(1); }); + fDrawingLineRemoval = mDrawing->addAction("Hidden line removal", this, [this](){ this->toggleSurfaceAction(2); }); + fDrawingSurfaceRemoval = mDrawing->addAction("Hidden Surface removal", this, [this](){ this->toggleSurfaceAction(3); }); + fDrawingLineSurfaceRemoval = mDrawing->addAction("Hidden line and surface removal", this, [this](){ this->toggleSurfaceAction(4); }); #endif fDrawingWireframe->setCheckable(true); @@ -2831,7 +2829,7 @@ void G4OpenGLQtViewer::DrawText(const G4Text& g4text) // Calculate move for centre and right adjustment QFontMetrics* f = new QFontMetrics (font); #if QT_VERSION > 0x050110 - G4double span = f->boundingRect(textCString[0]).width(); + G4double span = f->boundingRect(textCString).width(); #else G4double span = f->width(textCString); #endif @@ -2846,6 +2844,15 @@ void G4OpenGLQtViewer::DrawText(const G4Text& g4text) xmove += g4text.GetXOffset(); ymove += g4text.GetYOffset(); + // xmove, ymove in pixels - or are they? +#ifdef __APPLE__ + const G4double fudgeFactor = 2.; +#else + const G4double fudgeFactor = 1.; +#endif + xmove *= fudgeFactor; + ymove *= fudgeFactor; + qGLW->renderText ((position.x()+(2*xmove)/getWinWidth()), (position.y()+(2*ymove)/getWinHeight()), @@ -3409,7 +3416,7 @@ void G4OpenGLQtViewer::addNonPVSceneTreeElement( } if (!alreadyPresent) { createTreeWidgetItem(tmpFullPath, - QString(modelDescription.c_str()), + modelShortName, 0, // currentPVCopyNb currentPOIndex, "", @@ -4624,7 +4631,7 @@ void G4OpenGLQtViewer::updatePickInfosWidget(int aX, int aY) { #else std::cout << pickCoutButton->text().toStdString() << " "<< fPickInfosWidget->layout()->count()-1<< std::endl; int tmp = fPickInfosWidget->layout()->count()-1; - connect(pickCoutButton, &QPushButton::clicked , [=](){ this->toggleSceneTreeComponentPickingCout(tmp);}); + connect(pickCoutButton, &QPushButton::clicked , [this, tmp](){ this->toggleSceneTreeComponentPickingCout(tmp);}); #endif } } @@ -4760,7 +4767,7 @@ QString G4OpenGLQtViewer::GetCommandParameterList ( for( G4int i_thParameter=0; i_thParameterGetParameter(i_thParameter); txt += "\nParameter : " + QString((char*)(param->GetParameterName()).data()) + "\n"; - if( ! param->GetParameterGuidance().isNull() ) + if( ! param->GetParameterGuidance().empty() ) txt += QString((char*)(param->GetParameterGuidance()).data())+ "\n" ; txt += " Parameter type : " + QString(QChar(param->GetParameterType())) + "\n"; if(param->IsOmittable()){ @@ -4770,13 +4777,13 @@ QString G4OpenGLQtViewer::GetCommandParameterList ( } if( param->GetCurrentAsDefault() ) { txt += " Default value : taken from the current value\n"; - } else if( ! param->GetDefaultValue().isNull() ) { + } else if( ! param->GetDefaultValue().empty() ) { txt += " Default value : " + QString((char*)(param->GetDefaultValue()).data())+ "\n"; } - if( ! param->GetParameterRange().isNull() ) { + if( ! param->GetParameterRange().empty() ) { txt += " Parameter range : " + QString((char*)(param->GetParameterRange()).data())+ "\n"; } - if( ! param->GetParameterCandidates().isNull() ) { + if( ! param->GetParameterCandidates().empty() ) { txt += " Candidates : " + QString((char*)(param->GetParameterCandidates()).data())+ "\n"; } } @@ -4913,4 +4920,3 @@ p.end(); picture.save(fname, "svg"); } */ -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLSceneHandler.cc b/source/visualization/OpenGL/src/G4OpenGLSceneHandler.cc index 2798bac58a..f4791c04df 100644 --- a/source/visualization/OpenGL/src/G4OpenGLSceneHandler.cc +++ b/source/visualization/OpenGL/src/G4OpenGLSceneHandler.cc @@ -31,7 +31,6 @@ // OpenGL immediate scene - draws immediately to buffer // (saving space on server). -#ifdef G4VIS_BUILD_OPENGL_DRIVER # include "G4OpenGLSceneHandler.hh" # include "G4OpenGLViewer.hh" @@ -195,8 +194,8 @@ void G4OpenGLSceneHandler::ScaledFlush() break; case eachPrimitive: // This is equivalent to numeric with fEntitiesFlushInterval == 1. - fEntitiesFlushInterval = 1; // fallthrough - // Fall through to NthPrimitive. + fEntitiesFlushInterval = 1; + [[fallthrough]]; // Fall through to NthPrimitive. case NthPrimitive: { // Encapsulate in scope {} brackets to satisfy Windows. static G4int primitivesWaitingToBeFlushed = 0; @@ -249,8 +248,8 @@ void G4OpenGLSceneHandler::ScaledFlush() break; case eachPrimitive: // This is equivalent to NthPrimitive with fEntitiesFlushInterval == 1. - fEntitiesFlushInterval = 1; // fallthrough - // Fall through to NthPrimitive. + fEntitiesFlushInterval = 1; + [[fallthrough]]; // Fall through to NthPrimitive. case NthPrimitive: { // Encapsulate in scope {} brackets to satisfy Windows. static G4int primitivesWaitingToBeFlushed = 0; @@ -432,15 +431,15 @@ void G4OpenGLSceneHandler::AddPrimitive (const G4Polymarker& polymarker) //filled = false; break; case G4VMarker::hashed: - if (!hashedWarned) { // fallthrough + if (!hashedWarned) { G4cout << "Hashed fill style in G4OpenGLSceneHandler." << "\n Not implemented. Using G4VMarker::filled." << G4endl; hashedWarned = true; - } // fallthrough + } // Maybe use //glPolygonStipple (fStippleMaskHashed); - // Drop through to filled... + [[fallthrough]]; // Drop through to filled... case G4VMarker::filled: glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); //filled = true; @@ -456,8 +455,8 @@ void G4OpenGLSceneHandler::AddPrimitive (const G4Polymarker& polymarker) switch (polymarker.GetMarkerType()) { default: case G4Polymarker::dots: - size = 1.; // fallthrough - // Drop through to circles + size = 1.; + [[fallthrough]]; // Fall through to circles case G4Polymarker::circles: nSides = GetNoOfSides(fpVisAttribs); startPhi = 0.; @@ -568,11 +567,6 @@ void G4OpenGLSceneHandler::AddPrimitive (const G4Square& square) { G4OpenGLSceneHandler::AddPrimitive(oneSquare); } -void G4OpenGLSceneHandler::AddPrimitive (const G4Scale& scale) -{ - G4VSceneHandler::AddPrimitive(scale); -} - //Method for handling G4Polyhedron objects for drawing solids. void G4OpenGLSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { @@ -639,20 +633,20 @@ void G4OpenGLSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { // Transparent... glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); - glDisable (GL_CULL_FACE); + //glDisable (GL_CULL_FACE); glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); } else { // Opaque... if (clipping) { glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); - glDisable (GL_CULL_FACE); + //glDisable (GL_CULL_FACE); glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); } else { glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); - glEnable (GL_CULL_FACE); - glCullFace (GL_BACK); + //glEnable (GL_CULL_FACE); + //glCullFace (GL_BACK); glPolygonMode (GL_FRONT, GL_LINE); } } @@ -667,7 +661,7 @@ void G4OpenGLSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { #ifndef G4OPENGL_VERSION_2 glEnable(GL_COLOR_MATERIAL); #endif - glDisable (GL_CULL_FACE); + //glDisable (GL_CULL_FACE); glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); } else { // Opaque... @@ -675,15 +669,15 @@ void G4OpenGLSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { if (clipping) { glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); - glDisable (GL_CULL_FACE); + //glDisable (GL_CULL_FACE); glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); } else { glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); #ifndef G4OPENGL_VERSION_2 glEnable(GL_COLOR_MATERIAL); #endif - glEnable (GL_CULL_FACE); - glCullFace (GL_BACK); + //glEnable (GL_CULL_FACE); + //glCullFace (GL_BACK); glPolygonMode (GL_FRONT, GL_FILL); } } @@ -695,7 +689,7 @@ void G4OpenGLSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { default: glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL); //??? was GL_ALWAYS - glDisable (GL_CULL_FACE); + //glDisable (GL_CULL_FACE); glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); break; } @@ -826,17 +820,17 @@ void G4OpenGLSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { if (isTransparent) { // Transparent... glDepthMask (GL_FALSE); // Make depth buffer read-only. - glDisable (GL_CULL_FACE); + //glDisable (GL_CULL_FACE); glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); } else { // Opaque... glDepthMask (GL_TRUE); // Make depth buffer writable (default). if (clipping) { - glDisable (GL_CULL_FACE); + //glDisable (GL_CULL_FACE); glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); } else { - glEnable (GL_CULL_FACE); - glCullFace (GL_BACK); + //glEnable (GL_CULL_FACE); + //glCullFace (GL_BACK); glPolygonMode (GL_FRONT, GL_FILL); } } @@ -906,16 +900,16 @@ void G4OpenGLSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { glDepthFunc (GL_LEQUAL); // to make sure line gets drawn. if (isTransparent) { // Transparent... - glDisable (GL_CULL_FACE); + //glDisable (GL_CULL_FACE); glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); } else { // Opaque... if (clipping) { - glDisable (GL_CULL_FACE); + //glDisable (GL_CULL_FACE); glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); } else { - glEnable (GL_CULL_FACE); - glCullFace (GL_BACK); + //glEnable (GL_CULL_FACE); + //glCullFace (GL_BACK); glPolygonMode (GL_FRONT, GL_LINE); } } @@ -1416,5 +1410,3 @@ void G4OpenGLSceneHandler::drawVBOArray(std::vector vertices) { glDeleteBuffers(1,&fVertexBufferObject); } #endif - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredQt.cc b/source/visualization/OpenGL/src/G4OpenGLStoredQt.cc index 0b2267cdd6..b44ea1d489 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredQt.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredQt.cc @@ -28,8 +28,6 @@ // // OpenGLStoredQt graphics system factory. -#ifdef G4VIS_BUILD_OPENGLQT_DRIVER - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLSceneHandler.hh" @@ -74,5 +72,3 @@ G4VViewer* G4OpenGLStoredQt::CreateViewer } return pView; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredQtSceneHandler.cc b/source/visualization/OpenGL/src/G4OpenGLStoredQtSceneHandler.cc index 314b2153a6..acfae08620 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredQtSceneHandler.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredQtSceneHandler.cc @@ -28,8 +28,6 @@ // // Laurent Garnier 27th October 2011 -#ifdef G4VIS_BUILD_OPENGLQT_DRIVER - #include "G4OpenGLStoredQtSceneHandler.hh" #include "G4PhysicalVolumeModel.hh" @@ -170,5 +168,3 @@ void G4OpenGLStoredQtSceneHandler::SetScene(G4Scene* pScene){ } G4VSceneHandler::SetScene(pScene); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredQtViewer.cc b/source/visualization/OpenGL/src/G4OpenGLStoredQtViewer.cc index 47a8576d42..4695558903 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredQtViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredQtViewer.cc @@ -29,8 +29,6 @@ // Class G4OpenGLStoredQtViewer : a class derived from G4OpenGLQtViewer and // G4OpenGLStoredViewer. -#ifdef G4VIS_BUILD_OPENGLQT_DRIVER - #include "G4OpenGLStoredQtViewer.hh" #include "G4OpenGLStoredSceneHandler.hh" @@ -103,6 +101,8 @@ void G4OpenGLStoredQtViewer::initializeGL () { // Set the component visible // setVisible(true) ; + // Set jpg as default export format for Qt viewer + setExportImageFormat("jpg"); } G4bool G4OpenGLStoredQtViewer::CompareForKernelVisit(G4ViewParameters& lastVP) @@ -121,13 +121,15 @@ G4bool G4OpenGLStoredQtViewer::CompareForKernelVisit(G4ViewParameters& lastVP) (lastVP.IsCullingCovered () != fVP.IsCullingCovered ()) || (lastVP.GetCBDAlgorithmNumber() != fVP.GetCBDAlgorithmNumber()) || + // Note: Section and Cutaway can reveal back-facing faces. If + // backface culling is implemented, the image can look strange because + // the back-facing faces are not there. For the moment, we have disabled + // (commented out) backface culling (it seems not to affect performance - + // in fact, performance seems to improve), so there is no problem. (lastVP.IsSection () != fVP.IsSection ()) || - // Section (DCUT) implemented locally. But still need to visit - // kernel if status changes so that back plane culling can be - // switched. - (lastVP.IsCutaway () != fVP.IsCutaway ()) || - // Cutaways implemented locally. But still need to visit kernel - // if status changes so that back plane culling can be switched. + // Section (DCUT) is NOT implemented locally so we need to visit the kernel. + // (lastVP.IsCutaway () != fVP.IsCutaway ()) || + // Cutaways are implemented locally so we do not need to visit the kernel. (lastVP.IsExplode () != fVP.IsExplode ()) || (lastVP.GetNoOfSides () != fVP.GetNoOfSides ()) || (lastVP.GetGlobalMarkerScale() != fVP.GetGlobalMarkerScale()) || @@ -451,5 +453,3 @@ G4Colour& c, size_t poIndex) { c = getColorForPoIndex(poIndex); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredSceneHandler.cc b/source/visualization/OpenGL/src/G4OpenGLStoredSceneHandler.cc index b5d9ed236c..784ef38dd5 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredSceneHandler.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredSceneHandler.cc @@ -29,8 +29,6 @@ // Andrew Walkden 10th February 1997 // OpenGL stored scene - creates OpenGL display lists. -#ifdef G4VIS_BUILD_OPENGL_DRIVER - #include "G4OpenGLStoredSceneHandler.hh" #include "G4PhysicalVolumeModel.hh" @@ -54,7 +52,7 @@ G4int G4OpenGLStoredSceneHandler::fSceneIdCount = 0; G4int G4OpenGLStoredSceneHandler::fDisplayListId = 0; G4bool G4OpenGLStoredSceneHandler::fMemoryForDisplayLists = true; -G4int G4OpenGLStoredSceneHandler::fDisplayListLimit = 50000; +G4int G4OpenGLStoredSceneHandler::fDisplayListLimit = 1e7; G4OpenGLStoredSceneHandler::PO::PO(): fDisplayListId(0), @@ -535,12 +533,6 @@ void G4OpenGLStoredSceneHandler::AddPrimitive (const G4Square& square) } } -void G4OpenGLStoredSceneHandler::AddPrimitive (const G4Scale& scale) -{ - // Let base class split into primitives. - G4OpenGLSceneHandler::AddPrimitive(scale); -} - void G4OpenGLStoredSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) { // Note: colour is still handled in @@ -638,6 +630,3 @@ void G4OpenGLStoredSceneHandler::ClearTransientStore () fpViewer -> DrawView (); } } - - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredViewer.cc b/source/visualization/OpenGL/src/G4OpenGLStoredViewer.cc index 1ce8365c45..74a2444516 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredViewer.cc @@ -31,8 +31,6 @@ // an OpenGL view, for inheritance by // derived (X, Xm...) classes. -#ifdef G4VIS_BUILD_OPENGL_DRIVER - #include "G4OpenGLStoredViewer.hh" #include "G4PhysicalConstants.hh" @@ -78,13 +76,15 @@ G4bool G4OpenGLStoredViewer::CompareForKernelVisit(G4ViewParameters& lastVP) { (lastVP.IsCullingCovered () != fVP.IsCullingCovered ()) || (lastVP.GetCBDAlgorithmNumber() != fVP.GetCBDAlgorithmNumber()) || + // Note: Section and Cutaway can reveal back-facing faces. If + // backface culling is implemented, the image can look strange because + // the back-facing faces are not there. For the moment, we have disabled + // (commented out) backface culling (it seems not to affect performance - + // in fact, performance seems to improve), so there is no problem. (lastVP.IsSection () != fVP.IsSection ()) || - // Section (DCUT) implemented locally. But still need to visit - // kernel if status changes so that back plane culling can be - // switched. - (lastVP.IsCutaway () != fVP.IsCutaway ()) || - // Cutaways implemented locally. But still need to visit kernel - // if status changes so that back plane culling can be switched. + // Section (DCUT) is NOT implemented locally so we need to visit the kernel. + // (lastVP.IsCutaway () != fVP.IsCutaway ()) || + // Cutaways are implemented locally so we do not need to visit the kernel. (lastVP.IsExplode () != fVP.IsExplode ()) || (lastVP.GetNoOfSides () != fVP.GetNoOfSides ()) || (lastVP.GetGlobalMarkerScale() != fVP.GetGlobalMarkerScale()) || @@ -491,5 +491,3 @@ void G4OpenGLStoredViewer::AddPrimitiveForASingleFrame(const G4Circle& circle) fG4OpenGLStoredSceneHandler.G4OpenGLStoredSceneHandler::AddPrimitive(circle); fG4OpenGLStoredSceneHandler.fMemoryForDisplayLists = memoryForDisplayListsKeep; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredWin32.cc b/source/visualization/OpenGL/src/G4OpenGLStoredWin32.cc index d188ab26cf..66623b1ca3 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredWin32.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredWin32.cc @@ -29,8 +29,6 @@ // OpenGLStoredWin32 graphics system factory. -#ifdef G4VIS_BUILD_OPENGLWIN32_DRIVER - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLSceneHandler.hh" @@ -74,6 +72,3 @@ G4VViewer* G4OpenGLStoredWin32::CreateViewer } return pView; } - -#endif - diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredWin32Viewer.cc b/source/visualization/OpenGL/src/G4OpenGLStoredWin32Viewer.cc index 5023edb8a5..5fd54e7dad 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredWin32Viewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredWin32Viewer.cc @@ -29,8 +29,6 @@ // Class G4OpenGLStoredWin32Viewer : a class derived from G4OpenGLWin32Viewer and // G4OpenGLStoredViewer. -#ifdef G4VIS_BUILD_OPENGLWIN32_DRIVER - #include "G4OpenGLStoredWin32Viewer.hh" #include "G4OpenGLStoredSceneHandler.hh" @@ -134,5 +132,3 @@ void G4OpenGLStoredWin32Viewer::FinishView ( ::DispatchMessage (&event); } } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredX.cc b/source/visualization/OpenGL/src/G4OpenGLStoredX.cc index 0c44587f34..d9a8bf223a 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredX.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredX.cc @@ -30,8 +30,6 @@ // OpenGL graphics system factory. -#ifdef G4VIS_BUILD_OPENGLX_DRIVER - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLStoredSceneHandler.hh" @@ -75,6 +73,3 @@ G4VViewer* G4OpenGLStoredX::CreateViewer (G4VSceneHandler& scene, } return pView; } - -#endif - diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredXViewer.cc b/source/visualization/OpenGL/src/G4OpenGLStoredXViewer.cc index 8f0761a93c..a46b40004f 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredXViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredXViewer.cc @@ -30,8 +30,6 @@ // Class G4OpenGLStoredXViewer : a class derived from G4OpenGLXViewer and // G4OpenGLStoredViewer. -#ifdef G4VIS_BUILD_OPENGLX_DRIVER - #include "G4OpenGLStoredXViewer.hh" #include "G4OpenGLStoredSceneHandler.hh" @@ -135,8 +133,11 @@ void G4OpenGLStoredXViewer::FinishView () { #ifdef G4DEBUG_VIS_OGL printf("G4OpenGLStoredXViewer::FinishView\n"); #endif - glXWaitGL (); //Wait for effects of all previous OpenGL commands to - //be propogated before progressing. + +// glXWaitGL (); //Wait for effects of all previous OpenGL commands to + //be propagated before progressing. +// JA: Commented out July 2021 - slows rendering down in some cases and I +// don't see any adverse effects. #ifdef G4DEBUG_VIS_OGL printf("G4OpenGLStoredXViewer::FinishView flush \n"); @@ -147,5 +148,3 @@ void G4OpenGLStoredXViewer::FinishView () { glGetIntegerv(GL_RENDER_MODE, &renderMode); if (renderMode == GL_RENDER) glXSwapBuffers (dpy, win); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredXm.cc b/source/visualization/OpenGL/src/G4OpenGLStoredXm.cc index d4f74aaffa..b6d8fad7ad 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredXm.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredXm.cc @@ -29,8 +29,6 @@ // Andrew Walkden 10th February 1997 // OpenGL graphics system factory. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLStoredSceneHandler.hh" @@ -73,5 +71,3 @@ G4VViewer* G4OpenGLStoredXm::CreateViewer (G4VSceneHandler& scene, const G4Strin } return pView; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredXmViewer.cc b/source/visualization/OpenGL/src/G4OpenGLStoredXmViewer.cc index 029c4c5144..5477bd69e3 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredXmViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredXmViewer.cc @@ -30,8 +30,6 @@ // Class G4OpenGLStoredXmViewer : a class derived from G4OpenGLXmViewer // and G4OpenGLStoredViewer. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLStoredXmViewer.hh" #include "G4OpenGLStoredSceneHandler.hh" @@ -57,9 +55,8 @@ G4OpenGLStoredXmViewer (G4OpenGLStoredSceneHandler& sceneHandler, } } -G4OpenGLStoredXmViewer::~G4OpenGLStoredXmViewer () { - GetSceneHandler()->RemoveViewerFromList(this); -} +G4OpenGLStoredXmViewer::~G4OpenGLStoredXmViewer () +{} void G4OpenGLStoredXmViewer::Initialise () { @@ -138,8 +135,10 @@ void G4OpenGLStoredXmViewer::DrawView () { } void G4OpenGLStoredXmViewer::FinishView () { - glXWaitGL (); //Wait for effects of all previous OpenGL commands to +// glXWaitGL (); //Wait for effects of all previous OpenGL commands to //be propogated before progressing. +// JA: Commented out July 2021 - slows rendering down in some cases and I +// don't see any adverse effects. #ifdef G4DEBUG_VIS_OGL printf("G4OpenGLStoredXmViewer::FinishView () flush \n"); @@ -150,5 +149,3 @@ void G4OpenGLStoredXmViewer::FinishView () { glGetIntegerv(GL_RENDER_MODE, &renderMode); if (renderMode == GL_RENDER) glXSwapBuffers (dpy, win); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLTransform3D.cc b/source/visualization/OpenGL/src/G4OpenGLTransform3D.cc index b35bee7c8a..750f559855 100644 --- a/source/visualization/OpenGL/src/G4OpenGLTransform3D.cc +++ b/source/visualization/OpenGL/src/G4OpenGLTransform3D.cc @@ -30,8 +30,6 @@ // G4OpenGLTransform3D provides OpenGL style transformation matrix // from G4Transform3D. -#ifdef G4VIS_BUILD_OPENGL_DRIVER - #include "G4OpenGLTransform3D.hh" G4OpenGLTransform3D::G4OpenGLTransform3D (const G4Transform3D &t) @@ -47,5 +45,3 @@ G4OpenGLTransform3D::G4OpenGLTransform3D (const G4Transform3D &t) } m[15] = 1.; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLViewer.cc b/source/visualization/OpenGL/src/G4OpenGLViewer.cc index f24620ff55..d0f8b8a51b 100644 --- a/source/visualization/OpenGL/src/G4OpenGLViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLViewer.cc @@ -29,8 +29,6 @@ // Andrew Walkden 27th March 1996 // OpenGL view - opens window, hard copy, etc. -#ifdef G4VIS_BUILD_OPENGL_DRIVER - #include "G4ios.hh" #include #include "G4OpenGLViewer.hh" @@ -628,42 +626,6 @@ GLubyte* G4OpenGLViewer::grabPixels return buffer; } -bool G4OpenGLViewer::printEPS() { - bool res; - - // Change the LC_NUMERIC value in order to have "." separtor and not "," - // This case is only useful for French, Canadien... - size_t len = strlen(setlocale(LC_NUMERIC,NULL)); - char* oldLocale = (char*)(malloc(len+1)); - if(oldLocale!=NULL) strncpy(oldLocale,setlocale(LC_NUMERIC,NULL),len); - setlocale(LC_NUMERIC,"C"); - - if (((fExportImageFormat == "eps") || (fExportImageFormat == "ps")) && (!fVectoredPs)) { - res = printNonVectoredEPS(); - } else { - res = printVectoredEPS(); - } - - // restore the local - if (oldLocale) { - setlocale(LC_NUMERIC,oldLocale); - free(oldLocale); - } - - if (res == false) { - G4cerr << "Error saving file... " << getRealPrintFilename().c_str() << G4endl; - } else { - G4cout << "File " << getRealPrintFilename().c_str() << " size: " << getRealExportWidth() << "x" << getRealExportHeight() << " has been saved " << G4endl; - - // increment index if necessary - if ( fExportFilenameIndex != -1) { - fExportFilenameIndex++; - } - } - - return res; -} - bool G4OpenGLViewer::printVectoredEPS() { return printGl2PS(); } @@ -884,7 +846,40 @@ bool G4OpenGLViewer::exportImage(std::string name, int width, int height) { setExportImageFormat(fExportImageFormat,true); // will display a message if this format is not correct for the current viewer return false; } - return printEPS(); + + bool res; + + // Change the LC_NUMERIC value in order to have "." separtor and not "," + // This case is only useful for French, Canadien... + size_t len = strlen(setlocale(LC_NUMERIC,NULL)); + char* oldLocale = (char*)(malloc(len+1)); + if(oldLocale!=NULL) strncpy(oldLocale,setlocale(LC_NUMERIC,NULL),len); + setlocale(LC_NUMERIC,"C"); + + if (((fExportImageFormat == "eps") || (fExportImageFormat == "ps")) && (!fVectoredPs)) { + res = printNonVectoredEPS(); + } else { + res = printVectoredEPS(); + } + + // restore the local + if (oldLocale) { + setlocale(LC_NUMERIC,oldLocale); + free(oldLocale); + } + + if (res == false) { + G4cerr << "Error saving file... " << getRealPrintFilename().c_str() << G4endl; + } else { + G4cout << "File " << getRealPrintFilename().c_str() << " size: " << getRealExportWidth() << "x" << getRealExportHeight() << " has been saved " << G4endl; + + // increment index if necessary + if ( fExportFilenameIndex != -1) { + fExportFilenameIndex++; + } + } + + return res; } @@ -1517,5 +1512,3 @@ G4String G4OpenGLViewerPickMap::print() { } return txt.str(); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLViewerMessenger.cc b/source/visualization/OpenGL/src/G4OpenGLViewerMessenger.cc index 72862a5f03..7f4efeddd3 100644 --- a/source/visualization/OpenGL/src/G4OpenGLViewerMessenger.cc +++ b/source/visualization/OpenGL/src/G4OpenGLViewerMessenger.cc @@ -25,8 +25,6 @@ // // -#ifdef G4VIS_BUILD_OPENGL_DRIVER - #include "G4OpenGLViewerMessenger.hh" #include "G4OpenGLViewer.hh" @@ -116,16 +114,6 @@ G4OpenGLViewerMessenger::G4OpenGLViewerMessenger() parameterFlushAt->SetDefaultValue(100); fpCommandFlushAt->SetParameter(parameterFlushAt); - fpCommandPrintEPS = - new G4UIcmdWithoutParameter("/vis/ogl/printEPS", this); - fpCommandPrintEPS->SetGuidance("Print Encapsulated PostScript file."); - fpCommandPrintEPS->SetGuidance - ("See \"/vis/ogl/export\" for other file formats."); - fpCommandPrintEPS->SetGuidance - ("Generates files with names G4OpenGL_viewer-name_nnnn.eps, where nnnn is a" - "\nsequence number, starting at 0000." - "\nCan be \"vectored\" or \"pixmap\" - see \"/vis/ogl/set/printMode\"."); - fpDirectorySet = new G4UIdirectory ("/vis/ogl/set/"); fpDirectorySet->SetGuidance("G4OpenGLViewer set commands."); @@ -134,7 +122,7 @@ G4OpenGLViewerMessenger::G4OpenGLViewerMessenger() fpCommandDisplayListLimit->SetGuidance ("Set/reset display list number of primitive limit (to avoid memory exhaustion)."); fpCommandDisplayListLimit->SetParameterName("limit", omitable = true); - fpCommandDisplayListLimit->SetDefaultValue(50000); + fpCommandDisplayListLimit->SetDefaultValue(1e7); fpCommandDisplayListLimit->SetRange("limit>=10000"); fpCommandExportFormat = @@ -197,7 +185,6 @@ G4OpenGLViewerMessenger::~G4OpenGLViewerMessenger () delete fpCommandExportFormat; delete fpCommandDisplayListLimit; delete fpDirectorySet; - delete fpCommandPrintEPS; delete fpCommandFlushAt; delete fpCommandExport; delete fpDirectory; @@ -299,16 +286,6 @@ void G4OpenGLViewerMessenger::SetNewValue return; } - if (command == fpCommandPrintEPS) - { - pOGLViewer->setExportImageFormat("eps",true); - pOGLViewer->exportImage(); - - if (pOGLViewer->fVP.IsAutoRefresh()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/refresh"); - return; - } - if (command == fpCommandPrintFilename) { G4String name; @@ -384,5 +361,3 @@ void G4OpenGLViewerMessenger::SetNewValue return; } } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLWin32Viewer.cc b/source/visualization/OpenGL/src/G4OpenGLWin32Viewer.cc index 75a23a840b..ed5685d355 100644 --- a/source/visualization/OpenGL/src/G4OpenGLWin32Viewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLWin32Viewer.cc @@ -28,8 +28,6 @@ // // 27/06/2003 : G.Barrand : implementation (at last !). -#ifdef G4VIS_BUILD_OPENGLWIN32_DRIVER - #include "G4OpenGLWin32Viewer.hh" #include "G4VViewer.hh" #include "G4VSceneHandler.hh" @@ -484,4 +482,3 @@ void G4OpenGLWin32Viewer::SetZoom( } } -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXViewer.cc b/source/visualization/OpenGL/src/G4OpenGLXViewer.cc index 53b6dfeb44..72a2167c9b 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXViewer.cc @@ -30,8 +30,6 @@ // G4OpenGLXViewer : Class to provide XWindows specific // functionality for OpenGL in GEANT4 -#ifdef G4VIS_BUILD_OPENGLX_DRIVER - #include "G4OpenGLXViewer.hh" #include "G4OpenGLSceneHandler.hh" @@ -108,8 +106,12 @@ void G4OpenGLXViewer::ShowView () { // G4int thread_id = G4Threading::G4GetThreadId(); // G4cout << "G4OpenGLXViewer::ShowView: thread " << thread_id << G4endl; #endif - glXWaitGL (); //Wait for effects of all previous OpenGL commands to + +// glXWaitGL (); //Wait for effects of all previous OpenGL commands to //be propagated before progressing. +// JA: Commented out July 2021 - slows rendering down in some cases and I +// don't see any adverse effects. + glFlush (); if (fVP.IsPicking()) { @@ -548,6 +550,4 @@ G4OpenGLXViewer::~G4OpenGLXViewer () { XFlush (dpy); } } - - -#endif + \ No newline at end of file diff --git a/source/visualization/OpenGL/src/G4OpenGLXm.cc b/source/visualization/OpenGL/src/G4OpenGLXm.cc index 1a4c528c22..00a76daa97 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXm.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXm.cc @@ -28,8 +28,6 @@ // John Allison 16th July 2015 // Base class for OpenGLImmediate/StoredXm graphics system factories. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXm.hh" #include "G4UImanager.hh" @@ -70,5 +68,3 @@ G4bool G4OpenGLXm::IsUISessionCompatible () const return isCompatible; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmBox.cc b/source/visualization/OpenGL/src/G4OpenGLXmBox.cc index f705a3a4d5..3ad6796ca5 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmBox.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmBox.cc @@ -27,8 +27,6 @@ // //Box container class -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmFramedBox.hh" #include "G4OpenGLXmBox.hh" #include "G4OpenGLXmVWidgetComponent.hh" @@ -104,5 +102,3 @@ void G4OpenGLXmBox::SetName (const char* n) { name = n; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmConvenienceRoutines.cc b/source/visualization/OpenGL/src/G4OpenGLXmConvenienceRoutines.cc index bae3e428b4..41a7b0e5ba 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmConvenienceRoutines.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmConvenienceRoutines.cc @@ -34,8 +34,6 @@ // // See G4OpenGLXmConvenienceRoutines.hh for more information. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewer.hh" #include @@ -526,9 +524,7 @@ void G4OpenGLXmViewer::get_text_callback (Widget w, XmNvalue, &string, NULL); -// sscanf (string, "%s", txt); - std::istringstream iss(string); - iss >> txt; + strcpy(txt, string); } G4bool G4OpenGLXmViewer::get_boolean_userData (Widget w) @@ -544,10 +540,3 @@ G4int G4OpenGLXmViewer::get_int_userData (Widget w) XtVaGetValues (w,XmNuserData,&userData,NULL); return (G4int)(unsigned long)userData; } - -#endif - - - - - diff --git a/source/visualization/OpenGL/src/G4OpenGLXmFourArrowButtons.cc b/source/visualization/OpenGL/src/G4OpenGLXmFourArrowButtons.cc index 60275ef0f5..2a57d98b08 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmFourArrowButtons.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmFourArrowButtons.cc @@ -27,8 +27,6 @@ // //Four arrow buttons class. Inherits from G4OpenGLXmVWidgetComponent -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmVWidgetComponent.hh" #include "G4OpenGLXmVWidgetContainer.hh" #include "G4OpenGLXmFourArrowButtons.hh" @@ -219,5 +217,3 @@ Widget* G4OpenGLXmFourArrowButtons::GetPointerToWidget () { return &arrow_form; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmFramedBox.cc b/source/visualization/OpenGL/src/G4OpenGLXmFramedBox.cc index d0f1da2fe3..3c22aabcb5 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmFramedBox.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmFramedBox.cc @@ -27,8 +27,6 @@ // //Framed box container class -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmBox.hh" #include "G4OpenGLXmFramedBox.hh" #include "G4OpenGLXmVWidgetComponent.hh" @@ -99,5 +97,3 @@ void G4OpenGLXmFramedBox::AddYourselfTo (G4OpenGLXmVWidgetShell* window) NULL); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmMainMenubarCallbacks.cc b/source/visualization/OpenGL/src/G4OpenGLXmMainMenubarCallbacks.cc index 63690682ce..c5f244f502 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmMainMenubarCallbacks.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmMainMenubarCallbacks.cc @@ -35,8 +35,6 @@ // See G4OpenGLXmMainMenubarCallbacks.hh for more information. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewer.hh" #include "G4Xt.hh" @@ -578,5 +576,3 @@ void G4OpenGLXmViewer::update_panels_callback (Widget, pView->fpdolly_slider->SetMinValue (pView->dolly_low); } } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmPanningCallbacks.cc b/source/visualization/OpenGL/src/G4OpenGLXmPanningCallbacks.cc index cb4fe0b4e1..66e2e74fed 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmPanningCallbacks.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmPanningCallbacks.cc @@ -34,8 +34,6 @@ // camera positions by equal amounts). // Zoom callback is also here. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewer.hh" #include "G4VSceneHandler.hh" #include @@ -241,7 +239,3 @@ void G4OpenGLXmViewer::set_pan_sens_callback (Widget w, pView->fPan_sens = (G4double)((cbs->value) / ten_to_the_dp); } - -#endif - - diff --git a/source/visualization/OpenGL/src/G4OpenGLXmPushButton.cc b/source/visualization/OpenGL/src/G4OpenGLXmPushButton.cc index 39f5ab853f..42c2af055c 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmPushButton.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmPushButton.cc @@ -27,8 +27,6 @@ // //Push button class. Inherits from G4OpenGLXmVWidgetComponent -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmVWidgetComponent.hh" #include "G4OpenGLXmVWidgetContainer.hh" #include "G4OpenGLXmPushButton.hh" @@ -104,7 +102,3 @@ Widget* G4OpenGLXmPushButton::GetPointerToWidget () { return &button; } - -#endif - - diff --git a/source/visualization/OpenGL/src/G4OpenGLXmRadioButton.cc b/source/visualization/OpenGL/src/G4OpenGLXmRadioButton.cc index 89f9e6f9ca..55189f1080 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmRadioButton.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmRadioButton.cc @@ -27,8 +27,6 @@ // //Radio button class. Inherits from G4OpenGLXmVWidgetComponent -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmVWidgetComponent.hh" #include "G4OpenGLXmVWidgetContainer.hh" #include "G4OpenGLXmRadioButton.hh" @@ -107,5 +105,3 @@ Widget* G4OpenGLXmRadioButton::GetPointerToWidget () { return &button; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmRotationCallbacks.cc b/source/visualization/OpenGL/src/G4OpenGLXmRotationCallbacks.cc index f6f6a27ac1..0a4aafbc97 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmRotationCallbacks.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmRotationCallbacks.cc @@ -32,8 +32,6 @@ // elements of the control panel to // rotate the view. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewer.hh" #include "G4PhysicalConstants.hh" @@ -322,4 +320,3 @@ void G4OpenGLXmViewer::reset_callback (Widget w, pView->zoom_high = 10.0; } -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmSeparator.cc b/source/visualization/OpenGL/src/G4OpenGLXmSeparator.cc index d3beb176ea..6b001ac2af 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmSeparator.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmSeparator.cc @@ -27,8 +27,6 @@ // //Separator class. Inherits from G4OpenGLXmVWidgetComponent -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmVWidgetComponent.hh" #include "G4OpenGLXmVWidgetContainer.hh" #include "G4OpenGLXmSeparator.hh" @@ -80,5 +78,3 @@ Widget* G4OpenGLXmSeparator::GetPointerToWidget () { return &line; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmSliderBar.cc b/source/visualization/OpenGL/src/G4OpenGLXmSliderBar.cc index 51db15d535..dfdfd057be 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmSliderBar.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmSliderBar.cc @@ -27,8 +27,6 @@ // //Slider bar class. Inherits from G4OpenGLXmVWidgetComponent -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmVWidgetComponent.hh" #include "G4OpenGLXmVWidgetContainer.hh" #include "G4OpenGLXmSliderBar.hh" @@ -223,5 +221,3 @@ Widget* G4OpenGLXmSliderBar::GetPointerToWidget () { return &sliderbar; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmStyleCallbacks.cc b/source/visualization/OpenGL/src/G4OpenGLXmStyleCallbacks.cc index 64d0cb64cc..371b42a33a 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmStyleCallbacks.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmStyleCallbacks.cc @@ -32,8 +32,6 @@ // elements of the control panel to // determine how to visualize the view. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewer.hh" #include "G4SystemOfUnits.hh" @@ -296,6 +294,3 @@ void G4OpenGLXmViewer::projection_callback (Widget w, pView->ClearView (); pView->DrawView (); } - -#endif - diff --git a/source/visualization/OpenGL/src/G4OpenGLXmTextField.cc b/source/visualization/OpenGL/src/G4OpenGLXmTextField.cc index 12705af0ab..ec4cacf2a7 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmTextField.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmTextField.cc @@ -27,8 +27,6 @@ // //Text field class. Inherits from G4OpenGLXmVWidgetComponent -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewer.hh" #include "G4OpenGLXmVWidgetComponent.hh" #include "G4OpenGLXmVWidgetContainer.hh" @@ -183,5 +181,3 @@ Widget* G4OpenGLXmTextField::GetPointerToWidget () { return &text_field; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmTopLevelShell.cc b/source/visualization/OpenGL/src/G4OpenGLXmTopLevelShell.cc index a453803ddb..aa1d608776 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmTopLevelShell.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmTopLevelShell.cc @@ -27,8 +27,6 @@ // //Top level shell class -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewer.hh" #include "G4OpenGLXmTopLevelShell.hh" #include "G4OpenGLXmVWidgetContainer.hh" @@ -121,5 +119,3 @@ char* G4OpenGLXmTopLevelShell::GetName () { return name; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmVWidgetComponent.cc b/source/visualization/OpenGL/src/G4OpenGLXmVWidgetComponent.cc index 44ab7e4fd2..afc6ce6946 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmVWidgetComponent.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmVWidgetComponent.cc @@ -27,8 +27,6 @@ // //Base class for all Motif component widgets -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmVWidgetComponent.hh" G4OpenGLXmVWidgetComponent::G4OpenGLXmVWidgetComponent () @@ -36,5 +34,3 @@ G4OpenGLXmVWidgetComponent::G4OpenGLXmVWidgetComponent () G4OpenGLXmVWidgetComponent::~G4OpenGLXmVWidgetComponent () {} - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmVWidgetContainer.cc b/source/visualization/OpenGL/src/G4OpenGLXmVWidgetContainer.cc index 677731cc02..62ad7eeeae 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmVWidgetContainer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmVWidgetContainer.cc @@ -27,8 +27,6 @@ // //Base class for all Motif container widgets -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmVWidgetContainer.hh" G4OpenGLXmVWidgetContainer::G4OpenGLXmVWidgetContainer () @@ -36,5 +34,3 @@ G4OpenGLXmVWidgetContainer::G4OpenGLXmVWidgetContainer () G4OpenGLXmVWidgetContainer::~G4OpenGLXmVWidgetContainer () {} - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmVWidgetObject.cc b/source/visualization/OpenGL/src/G4OpenGLXmVWidgetObject.cc index 00b826b557..15c2904d9a 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmVWidgetObject.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmVWidgetObject.cc @@ -27,8 +27,6 @@ // //Virtual base class for all Motif widgets. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewer.hh" #include "G4OpenGLXmVWidgetObject.hh" @@ -55,5 +53,3 @@ void G4OpenGLXmVWidgetObject::ProcesspView () bgnd = pView->bgnd; top = pView->toplevel; } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmVWidgetShell.cc b/source/visualization/OpenGL/src/G4OpenGLXmVWidgetShell.cc index d533d18599..b5edd0a91f 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmVWidgetShell.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmVWidgetShell.cc @@ -27,8 +27,6 @@ // //Base class for all Motif shell widgets -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmVWidgetShell.hh" G4OpenGLXmVWidgetShell::G4OpenGLXmVWidgetShell () @@ -36,5 +34,3 @@ G4OpenGLXmVWidgetShell::G4OpenGLXmVWidgetShell () G4OpenGLXmVWidgetShell::~G4OpenGLXmVWidgetShell () {} - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmViewer.cc b/source/visualization/OpenGL/src/G4OpenGLXmViewer.cc index 220ebcb3ae..6f3d003553 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmViewer.cc @@ -30,8 +30,6 @@ // G4OpenGLXmViewer : Class derived from G4OpenGLXViewer, to provide // (Motif) widget OpenGL functionality for GEANT4. -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "globals.hh" #include "G4OpenGLXmViewer.hh" @@ -58,8 +56,11 @@ void G4OpenGLXmViewer::ShowView () { - glXWaitGL (); //Wait for effects of all previous OpenGL commands to +// glXWaitGL (); //Wait for effects of all previous OpenGL commands to //be propagated before progressing. +// JA: Commented out July 2021 - slows rendering down in some cases and I +// don't see any adverse effects. + glFlush (); G4Xt::getInstance () -> SecondaryLoop (); @@ -861,5 +862,3 @@ G4OpenGLXmViewer::~G4OpenGLXmViewer () ******************************/ } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmViewerMessenger.cc b/source/visualization/OpenGL/src/G4OpenGLXmViewerMessenger.cc index 804bddd099..1ae5b3cb9f 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmViewerMessenger.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmViewerMessenger.cc @@ -25,8 +25,6 @@ // // -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewerMessenger.hh" #include "G4SystemOfUnits.hh" @@ -275,5 +273,3 @@ void G4OpenGLXmViewerMessenger::SetNewValue G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/rebuild"); } - -#endif diff --git a/source/visualization/OpenGL/src/G4OpenGLXmWindowHandlingCallbacks.cc b/source/visualization/OpenGL/src/G4OpenGLXmWindowHandlingCallbacks.cc index 93a0f55f44..ad62cf413c 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmWindowHandlingCallbacks.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmWindowHandlingCallbacks.cc @@ -31,8 +31,6 @@ // (Motif) widgets to use. // in handling (Xm) windows -#ifdef G4VIS_BUILD_OPENGLXM_DRIVER - #include "G4OpenGLXmViewer.hh" void G4OpenGLXmViewer::resize_callback (Widget w, @@ -71,7 +69,7 @@ void G4OpenGLXmViewer::print_callback (Widget, XtPointer) { G4OpenGLXViewer* pView = (G4OpenGLXmViewer*) clientData; - pView->printEPS(); + pView->exportImage(); } void G4OpenGLXmViewer::set_print_colour_callback (Widget w, @@ -99,5 +97,3 @@ void G4OpenGLXmViewer::set_print_style_callback (Widget w, G4cout << "`Produce vectored PostScript ?' set to : " << pView->fPrintColour; } - -#endif diff --git a/source/visualization/OpenInventor/GNUmakefile b/source/visualization/OpenInventor/GNUmakefile index 0cf409f6bc..9fdefc1e06 100644 --- a/source/visualization/OpenInventor/GNUmakefile +++ b/source/visualization/OpenInventor/GNUmakefile @@ -37,6 +37,54 @@ CPPFLAGS += -I$(G4BASE)/global/HEPRandom/include CPPFLAGS += -I$(G4BASE)/tracking/include CPPFLAGS += -I$(G4BASE)/digits_hits/hits/include +# Locally adjust source list before including common.gmk +sources := $(addprefix src/, \ + G4OpenInventor.cc \ + G4OpenInventorSceneHandler.cc \ + G4OpenInventorTransform3D.cc \ + G4OpenInventorViewer.cc \ + G4VisFeaturesOfOpenInventor.cc \ + SbPainter.cc \ + SbPainterPS.cc \ + SoAlternateRepAction.cc \ + SoBox.cc \ + SoCons.cc \ + SoCounterAction.cc \ + SoDetectorTreeKit.cc \ + SoGL2PSAction.cc \ + SoImageWriter.cc \ + SoMarkerSet.cc \ + SoPolyhedron.cc \ + SoStyleCache.cc \ + SoTrap.cc \ + SoTrd.cc \ + SoTubs.cc) + +ifdef G4VIS_BUILD_OIX_DRIVER + sources += $(addprefix src/, \ + G4OpenInventorXt.cc \ + G4OpenInventorXtExaminerViewer.cc \ + G4OpenInventorXtExaminerViewerMessenger.cc \ + G4OpenInventorXtExtended.cc \ + G4OpenInventorXtExtendedViewer.cc \ + G4OpenInventorXtViewer.cc \ + wheelmouse.cc) +endif + +ifdef G4VIS_BUILD_OIQT_DRIVER + sources += $(addprefix src/, \ + G4OpenInventorQt.cc \ + G4OpenInventorQtExaminerViewer.cc \ + G4OpenInventorQtViewer.cc \ + G4SoQt.cc) +endif + +ifdef G4VIS_BUILD_OIWIN32_DRIVER + sources += $(addprefix src/, \ + G4OpenInventorWin.cc \ + G4OpenInventorWinViewer.cc) +endif + include $(G4INSTALL)/config/common.gmk debug: diff --git a/source/visualization/OpenInventor/History b/source/visualization/OpenInventor/History index b628dd3e03..aa38a20e69 100644 --- a/source/visualization/OpenInventor/History +++ b/source/visualization/OpenInventor/History @@ -18,6 +18,13 @@ committal in the CVS repository ! History file for visualization/OpenInventor ------------------------------------------- +12 November 2021 - Ben Morgan (openinventor-V10-07-06) +- Retire G4VIS_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +8 November 2021 - Ben Morgan (openinventor-V10-07-05) +- Retire G4UI/G4INTY_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system 07 June 2021 John Allison (openinventor-v10-07-04) - Requires greps-V10-07-07 (new method AddCompound (const G4Mesh&)). diff --git a/source/visualization/OpenInventor/README.OIXExtendedViewer b/source/visualization/OpenInventor/README.OIXExtendedViewer deleted file mode 100644 index 0e79431205..0000000000 --- a/source/visualization/OpenInventor/README.OIXExtendedViewer +++ /dev/null @@ -1,186 +0,0 @@ -Extended OI Xt viewer -===================== -INCOMPLETE DRAFT - -G4OpenInventorXtExaminerViewer is based on and is -a plug-in replacement for SoXtExaminerViewer which -is a base class viewer provided by the SoXt (Coin3d) -library. SoXtExaminerViewer is the normal viewer -that you get when doing /vis/open OIX. -These viewers depend on X, Xt and Xm and so are -limited to UNIX/MAC and will not run on native -Windows. - -The SoXtExaminerViewer is instantiated by -G4OpenInventorXtViewer. This has been temporarily -disabled and has been replaced by an instantiation -of G4OpenInventorXtExaminerViewer, together with -some additional configuration. The intention -is to find a suitable mechanism to allow a choice -of viewer (standard or extended) at run time. - -No modifications to user code or to any other -Geant4 categories are required to use the extended -viewer. Many of the implemented features are made -possible by the SCENE GRAPH technology in Open -Inventor which stores the scene elements and -associated information in a structured way. - -Features -======== - -Reference Path navigation -------------------------- - -Most of the new features are concerned with navigation -along a "reference path" which is a piecewise -linear path through the world. The reference path -can be any particle trajectory, chosen as follows: - - The application can attach a "reference trajectory" - attribute to a particular trajectory. - - If there is no such designated trajectory, the viewer - chooses the longest trajectory as the initial reference - path. - - Any other trajectory can be selected as the reference - by selecting it with the mouse. - - Elements are assigned a "distance" along the reference - path, based on the perpendicular from the element's - placement coordinates to the path. Elements are then - sorted by distance and the list is displayed in an - auxiliary window of the viewer. NOTE: at present - the path is not extrapolated at the ends, so elements - "before" or "after" the path are assigned distances - of 0 or the total path length respectively. This - will be generalized in future. - -Reference path navigation controls: - - Select an element from the list: navigate along the - path to the element's "location" (distance along - the path. - - L,R,U,D refer to the arrow keys. - - Shift-L and Shift-R: navigate to the previous or next - element on the path (with wraparound). - - L and R: rotate 90 degrees around the vertical axis - - U and D: rotate 90 degrees around the path - - Ctrl-L and Ctrl-R: rotate 90 degrees around the horizontal axis - - All these keys have a "repeat" function for continuous motion. - - The rotation keys put the camera in a definite orientation. - The Shift-L and Shift-R keys can be used to "fly" along the - path in whatever orientation is in effect. - NOTE: if this appears to be "stuck", try switching from - orthonormal camera to perspective camera ("cube" viewer button). - - Tools / Go to start of reference path: useful if you get lost - - Tools / Invert reference path: flips the direction of travel - and the distance readout - - -Reference path animation - - This is a special mode which flys the camera steadily along the - path, without wraparound. Special controls are: - - Tools / Animate Ref Particle: start animation mode - - Page-Up: increase speed - Page-Down: decrease speed - U: raise camera - D: lower camera - ESC: exit animation mode - - For suitable geometries the U and D keys can be used to - get "Star Wars" style fly-over and fly-under effects. - -Bookmarks - - At any time, the viewpoint and other camera parameters can - be saved in a file as a labelled "bookmark". - The view can then be restored later in the current run or - in another run. - - The default name for the bookmark file is ".bookmarkFile" - The first time a viewpoint is saved, this file will be - created if it does not already exist. When the viewer - is first opened, it will automatically read this file - if present and load the viewpoints into the left-hand - panel of the viewer's auxiliary window. - - Controls: - - Select viewpoint from list: restore this view - - Right-arrow VIEWER button: go to next viewpoint - Left-arrow VIEWER button: go to next viewpoint - - "Floppy Disk" button: save current view. - The user can type in a label for the view, - or use the default label provided. - - File / Open Viewpoint File: loads an existing bookmark file - File / New Viewpoint File: creates a new bookmark file for - saving subsequent views - - -Special Picking Modes - - "Console" VIEWER button: enable brief trajectory picking and - mouse-over element readout - For trajectories, the list of all trajectory points is - replaced by the first and last point only, allowing easier - identification of the particle without scrolling back. - Passing the mouse over an element will give a readout - of the volume name, material, and position on the - reference path. - - "Star" VIEWER button: select new reference path - The cursor will change to a small cross (+) - after which a trajectory can be selected to become - the new reference path. - -Convenience feature - - Escape from viewer without using the mouse: - In addition to the File / Escape menu item, pressing the "e" - key on the keyboard will exit from the viewer's X event loop. - The viewer becomes inactive and control returns to the - Geant4 UI prompt. - -Prototype only: - - File / Save-Load Ref Coords: status to be determined - - File / Save-Load Scene Graph: this saves the current scene graph, - (whatever is being viewed and navigated in the viewer) - including the geometry, camera, lighting information, into a - file which can be read back, thus returning to a previous - viewing "experience". This only partially works and some - or all of the geometry may be missing. Geant4-specific - scene elements may be lacking a "save" method. - -Known problems: - - Viewer occasionally hangs in an unknown state. - Usually can be "cleared" by trying various viewer buttons - or menu items. Last resort: escape to the G4 prompt and - run more events. Viewer will usually be o.k. afterwards. - - Unpredictable mode-switching behaviour: switching between - orthonormal and perspective camera may give wierd results. - Navigation may appear "stuck" with orthonormal camera. - - Both the standard and extended viewers can crash the - executable or even the X server if they are pushed - too far (e.g. by excessive zooming). diff --git a/source/visualization/OpenInventor/include/G4OpenInventorQt.hh b/source/visualization/OpenInventor/include/G4OpenInventorQt.hh index 3d000b90c5..a1e44642b3 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorQt.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorQt.hh @@ -29,8 +29,6 @@ #ifndef G4OPENINVENTORQT_HH #define G4OPENINVENTORQT_HH -#if defined (G4VIS_BUILD_OIQT_DRIVER) || defined (G4VIS_USE_OIQT) - #include "G4OpenInventor.hh" class G4OpenInventorQt: public G4OpenInventor { @@ -45,5 +43,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorQtExaminerViewer.hh b/source/visualization/OpenInventor/include/G4OpenInventorQtExaminerViewer.hh index 5a5776933a..14613c271d 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorQtExaminerViewer.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorQtExaminerViewer.hh @@ -30,9 +30,6 @@ #ifndef G4OPENINVENTORQTEXAMINERVIEWER_HH #define G4OPENINVENTORQTEXAMINERVIEWER_HH -#if defined (G4VIS_BUILD_OIQT_DRIVER) || defined (G4VIS_USE_OIQT) - - // Set up notification of event processing #include "G4VStateDependent.hh" @@ -466,6 +463,4 @@ protected: }; -#endif - #endif /* G4OPENINVENTORQTEXAMINERVIEWER_HH */ diff --git a/source/visualization/OpenInventor/include/G4OpenInventorQtViewer.hh b/source/visualization/OpenInventor/include/G4OpenInventorQtViewer.hh index 615fa2e4ad..8b8a41bf2e 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorQtViewer.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorQtViewer.hh @@ -29,8 +29,6 @@ #ifndef G4OPENINVENTORQTVIEWER_HH #define G4OPENINVENTORQTVIEWER_HH -#if defined (G4VIS_BUILD_OIQT_DRIVER) || defined (G4VIS_USE_OIQT) - // Inheritance : #include "G4OpenInventorViewer.hh" @@ -117,5 +115,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.hh b/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.hh index 8b352e8dd5..d73e190d88 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.hh @@ -33,8 +33,6 @@ #ifndef G4OPENINVENTORSCENEHANDLER_HH #define G4OPENINVENTORSCENEHANDLER_HH -#if defined (G4VIS_BUILD_OI_DRIVER) || defined (G4VIS_USE_OI) - // Inheritance : #include "G4VSceneHandler.hh" @@ -99,5 +97,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorTransform3D.hh b/source/visualization/OpenInventor/include/G4OpenInventorTransform3D.hh index 7ded3753f4..e95559a0bc 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorTransform3D.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorTransform3D.hh @@ -33,8 +33,6 @@ #ifndef G4OPENINVENTORTRANSFORM3D_HH #define G4OPENINVENTORTRANSFORM3D_HH -#if defined (G4VIS_BUILD_OI_DRIVER) || defined (G4VIS_USE_OI) - #include "G4Transform3D.hh" class SbMatrix; @@ -48,5 +46,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorViewer.hh b/source/visualization/OpenInventor/include/G4OpenInventorViewer.hh index 96850b82c5..7ef3c1dea2 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorViewer.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorViewer.hh @@ -28,8 +28,6 @@ #ifndef G4OPENINVENTORVIEWER_HH #define G4OPENINVENTORVIEWER_HH -#if defined (G4VIS_BUILD_OI_DRIVER) || defined (G4VIS_USE_OI) - // Inheritance : #include "G4VViewer.hh" @@ -104,5 +102,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorWinViewer.hh b/source/visualization/OpenInventor/include/G4OpenInventorWinViewer.hh index 34d9ea12da..5efc16f845 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorWinViewer.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorWinViewer.hh @@ -32,8 +32,6 @@ #ifndef G4OPENINVENTORWINVIEWER_HH #define G4OPENINVENTORWINVIEWER_HH -#if defined (G4VIS_BUILD_OI_DRIVER) || defined (G4VIS_USE_OI) - // Inheritance : #include "G4OpenInventorViewer.hh" @@ -62,5 +60,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorXtExaminerViewerMessenger.hh b/source/visualization/OpenInventor/include/G4OpenInventorXtExaminerViewerMessenger.hh index 0d98adcf2b..2bdff4d346 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorXtExaminerViewerMessenger.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorXtExaminerViewerMessenger.hh @@ -23,8 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -#if defined (G4VIS_BUILD_OIX_DRIVER) || defined (G4VIS_USE_OIX) - #ifndef G4OPENINVENTORXTEXAMINERVIEWERMESSENGER_HH #define G4OPENINVENTORXTEXAMINERVIEWERMESSENGER_HH @@ -50,5 +48,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorXtExtendedViewer.hh b/source/visualization/OpenInventor/include/G4OpenInventorXtExtendedViewer.hh index 1dd02377e4..12465ecfa2 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorXtExtendedViewer.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorXtExtendedViewer.hh @@ -32,8 +32,6 @@ #ifndef G4OPENINVENTORXTEXTENDEDVIEWER_HH #define G4OPENINVENTORXTEXTENDEDVIEWER_HH -#if defined (G4VIS_BUILD_OI_DRIVER) || defined (G4VIS_USE_OI) - // Inheritance : #include "G4OpenInventorViewer.hh" @@ -86,5 +84,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorXtViewer.hh b/source/visualization/OpenInventor/include/G4OpenInventorXtViewer.hh index f15aadd2b0..9e4712314c 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorXtViewer.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorXtViewer.hh @@ -32,8 +32,6 @@ #ifndef G4OPENINVENTORXTVIEWER_HH #define G4OPENINVENTORXTVIEWER_HH -#if defined (G4VIS_BUILD_OI_DRIVER) || defined (G4VIS_USE_OI) - // Inheritance : #include "G4OpenInventorViewer.hh" @@ -79,5 +77,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/G4SoQt.hh b/source/visualization/OpenInventor/include/G4SoQt.hh index 5ab8b45633..43ab084cae 100644 --- a/source/visualization/OpenInventor/include/G4SoQt.hh +++ b/source/visualization/OpenInventor/include/G4SoQt.hh @@ -29,8 +29,6 @@ #ifndef G4SOQT_HH #define G4SOQT_HH -#if defined (G4VIS_BUILD_OIQT_DRIVER) || defined (G4VIS_USE_OIQT) - #include "G4VInteractorManager.hh" class QWidget; @@ -71,5 +69,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/OpenInventor/include/HEPVis/SbGL.h b/source/visualization/OpenInventor/include/HEPVis/SbGL.h index ed6b1d8dbf..87349885fc 100644 --- a/source/visualization/OpenInventor/include/HEPVis/SbGL.h +++ b/source/visualization/OpenInventor/include/HEPVis/SbGL.h @@ -33,6 +33,8 @@ // Needs setting based on choice of driver // Apple system for SoQt on Apple // Native otherwise (Apple Framework) +// NOTE: This header is private to the OI category, and the OI lib can only be built in one mode +// so rhis can be simplified.... #if defined(__APPLE__) && (!defined(G4VIS_BUILD_OIX_DRIVER) || !defined(G4VIS_USE_OIX_DRIVER)) #include #include diff --git a/source/visualization/OpenInventor/sources.cmake b/source/visualization/OpenInventor/sources.cmake index 2ab463f57c..dbd30c7194 100644 --- a/source/visualization/OpenInventor/sources.cmake +++ b/source/visualization/OpenInventor/sources.cmake @@ -39,7 +39,6 @@ set(G4VIS_MODULE_OPENINVENTOR_SOURCES ) set(G4VIS_MODULE_OPENINVENTOR_LINK_LIBRARIES Coin::Coin) -add_definitions(-DG4VIS_BUILD_OI_DRIVER) #---------------------------------------------------------------------------- # UNIX Only (Xt) sources @@ -72,7 +71,6 @@ if(GEANT4_USE_INVENTOR_XT) wheelmouse.cc) # Add the definitions for SoXt - add_definitions(-DG4INTY_BUILD_XT) add_definitions(-DG4VIS_BUILD_OIX_DRIVER) # SoXt Library and others @@ -101,12 +99,6 @@ if(GEANT4_USE_INVENTOR_QT) G4OpenInventorQtViewer.cc G4SoQt.cc) - # Add the definitions - # Argh.. Have to remember about INTY and UI because of their use... - add_definitions(-DG4VIS_BUILD_OIQT_DRIVER) - add_definitions(-DG4INTY_BUILD_QT) - add_definitions(-DG4UI_BUILD_QT_SESSION) - # Add libraries list(APPEND G4VIS_MODULE_OPENINVENTOR_LINK_LIBRARIES SoQt::SoQt @@ -132,10 +124,6 @@ if(GEANT4_USE_INVENTOR_WIN) G4OpenInventorWinViewer.cc ) - # Add the definitions for SoWin - add_definitions(-DG4INTY_BUILD_WIN32) - add_definitions(-DG4VIS_BUILD_OIWIN32_DRIVER) - # SoWin Library list(APPEND G4VIS_MODULE_OPENINVENTOR_LINK_LIBRARIES SoWin::SoWin OpenGL::GL) endif() diff --git a/source/visualization/OpenInventor/src/G4OpenInventor.cc b/source/visualization/OpenInventor/src/G4OpenInventor.cc index 2018283b67..d42fc8a863 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventor.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventor.cc @@ -25,8 +25,6 @@ // // // -#ifdef G4VIS_BUILD_OI_DRIVER - // this : #include "G4OpenInventor.hh" @@ -115,5 +113,3 @@ G4bool G4OpenInventor::IsUISessionCompatible () const return isCompatible; } - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorQt.cc b/source/visualization/OpenInventor/src/G4OpenInventorQt.cc index 7c049263e4..8e54812206 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorQt.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorQt.cc @@ -26,8 +26,6 @@ // // Frederick Jones TRIUMF 30 NOV 2017 -#ifdef G4VIS_BUILD_OIQT_DRIVER - // this : #include "G4OpenInventorQt.hh" @@ -99,5 +97,3 @@ G4VViewer* G4OpenInventorQt::CreateViewer(G4VSceneHandler& scene, return pView; } - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorQtExaminerViewer.cc b/source/visualization/OpenInventor/src/G4OpenInventorQtExaminerViewer.cc index b6bc4b98a4..c7ccbeee63 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorQtExaminerViewer.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorQtExaminerViewer.cc @@ -26,8 +26,6 @@ // Frederick Jones TRIUMF 07 January 2018 -#ifdef G4VIS_BUILD_OIQT_DRIVER - #include "G4OpenInventorQtExaminerViewer.hh" #include "ui_OIQtListsDialog.h" @@ -2651,13 +2649,6 @@ G4OpenInventorQtExaminerViewer::FileOpenBookmarkCB() QStringList filenameinlist = filedialog.selectedFiles(); QString filenamein = filenameinlist[0]; - // Note null string and empty string are different - // if (filenamein.isNull()) { - // G4cout << "Input file name is NULL" << G4endl; - // return; - // } - // G4cout << "Input file name is " << qPrintable(filenamein) << G4endl; - char* filename = new char[filenamein.size()+1]; filename = strdup(qPrintable(filenamein)); // G4cout << "char[] file name is " << filename << G4endl; @@ -4122,6 +4113,3 @@ G4bool HookEventProcState::Notify(G4ApplicationState requestedState) if (requestedState == G4State_EventProc) viewer->newEvents = true; return true; } - - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorQtViewer.cc b/source/visualization/OpenInventor/src/G4OpenInventorQtViewer.cc index 158e2ccdd2..e4e9d6b206 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorQtViewer.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorQtViewer.cc @@ -25,8 +25,6 @@ // Frederick Jones TRIUMF 07 November 2017 -#ifdef G4VIS_BUILD_OIQT_DRIVER - // this : #include "G4OpenInventorQtViewer.hh" @@ -405,6 +403,3 @@ void G4OpenInventorQtViewer::EtcSceneGraphStatsCB() // G4cout << "G4OIQtViewer: Etc: Scene Graph Stats CALLBACK" << G4endl; SceneGraphStatistics(); } - - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorSceneHandler.cc b/source/visualization/OpenInventor/src/G4OpenInventorSceneHandler.cc index 2f2b468d8e..f5639c0c9c 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorSceneHandler.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorSceneHandler.cc @@ -28,7 +28,6 @@ // // Jeff Kallenbach 01 Aug 1996 // OpenInventor stored scene - creates OpenInventor display lists. -#ifdef G4VIS_BUILD_OI_DRIVER // this : #include "G4OpenInventorSceneHandler.hh" @@ -838,4 +837,3 @@ void G4OpenInventorSceneHandler::AddTransform(const G4Point3D& translation) delete sbMatrix; fCurrentSeparator->addChild(matrixTransform); } -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorTransform3D.cc b/source/visualization/OpenInventor/src/G4OpenInventorTransform3D.cc index db7ee56cb7..a168c31004 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorTransform3D.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorTransform3D.cc @@ -31,8 +31,6 @@ // from G4Transform3D. // gb 22 Nov 2004 : use SbMatrix instead of SoSFMatrix. -#ifdef G4VIS_BUILD_OI_DRIVER - // this : #include "G4OpenInventorTransform3D.hh" @@ -67,5 +65,3 @@ SbMatrix* G4OpenInventorTransform3D::GetSbMatrix () const { m[12],m[13],m[14],m[15]); return tm; } - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorViewer.cc b/source/visualization/OpenInventor/src/G4OpenInventorViewer.cc index 9c7630533e..eef2898fd1 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorViewer.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorViewer.cc @@ -29,8 +29,6 @@ // can update the view parameters, irrespective of any changes to the // camera type. -#ifdef G4VIS_BUILD_OI_DRIVER - // this : #include "G4OpenInventorViewer.hh" @@ -790,5 +788,3 @@ Controls on an Inventor examiner viewer are :\n\ return ""; } } - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorWin.cc b/source/visualization/OpenInventor/src/G4OpenInventorWin.cc index 7baaa45ef7..23247848e0 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorWin.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorWin.cc @@ -27,8 +27,6 @@ // // OpenInventor graphics system factory. -#ifdef G4VIS_BUILD_OIWIN32_DRIVER - // this : #include "G4OpenInventorWin.hh" @@ -68,6 +66,3 @@ G4VViewer* G4OpenInventorWin::CreateViewer (G4VSceneHandler& scene, const G4Stri G4OpenInventorSceneHandler* pScene = (G4OpenInventorSceneHandler*)&scene; return new G4OpenInventorWinViewer (*pScene, name); } - - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorWinViewer.cc b/source/visualization/OpenInventor/src/G4OpenInventorWinViewer.cc index f4682d0512..c0934b23d2 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorWinViewer.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorWinViewer.cc @@ -34,8 +34,6 @@ * gb 14 November 2004 : inherit G4OpenInventorViewer. */ -#ifdef G4VIS_BUILD_OIWIN32_DRIVER - // this : #include "G4OpenInventorWinViewer.hh" @@ -323,5 +321,3 @@ LRESULT CALLBACK G4OpenInventorWinViewer::WindowProc ( return (::DefWindowProc(aWindow,aMessage,aWParam,aLParam)); } } - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorXt.cc b/source/visualization/OpenInventor/src/G4OpenInventorXt.cc index 5fe6dd96bb..ddc625b68b 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorXt.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorXt.cc @@ -29,8 +29,6 @@ // Jeff Kallenbach 01 Aug 1996 // OpenInventor graphics system factory. -#ifdef G4VIS_BUILD_OIX_DRIVER - // this : #include "G4OpenInventorXt.hh" @@ -101,6 +99,3 @@ G4VViewer* G4OpenInventorXt::CreateViewer (G4VSceneHandler& scene, const G4Strin G4OpenInventorSceneHandler* pScene = (G4OpenInventorSceneHandler*)&scene; return new G4OpenInventorXtViewer (*pScene, name); } - - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorXtExaminerViewer.cc b/source/visualization/OpenInventor/src/G4OpenInventorXtExaminerViewer.cc index 1487625688..0b706b1f73 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorXtExaminerViewer.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorXtExaminerViewer.cc @@ -27,8 +27,6 @@ // Open Inventor Xt Extended Viewer - 30 Oct 2012 // Rastislav Ondrasek, Pierre-Luc Gagnon, Frederick Jones TRIUMF -#ifdef G4VIS_BUILD_OIX_DRIVER - #include #include #include @@ -4940,5 +4938,3 @@ G4bool HookEventProcState::Notify(G4ApplicationState requiredState) } return true; } - -#endif // G4VIS_BUILD_OIX_DRIVER diff --git a/source/visualization/OpenInventor/src/G4OpenInventorXtExaminerViewerMessenger.cc b/source/visualization/OpenInventor/src/G4OpenInventorXtExaminerViewerMessenger.cc index 6b776d40d8..c8aa9d6940 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorXtExaminerViewerMessenger.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorXtExaminerViewerMessenger.cc @@ -23,8 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -#ifdef G4VIS_BUILD_OIX_DRIVER - #include "G4OpenInventorXtExaminerViewerMessenger.hh" #include "G4OpenInventorXtExaminerViewer.hh" @@ -101,5 +99,3 @@ void G4OpenInventorXtExaminerViewerMessenger:: if (lookahead > 0) pViewer->pathLookahead = lookahead; } } - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorXtExtended.cc b/source/visualization/OpenInventor/src/G4OpenInventorXtExtended.cc index 3e2470219a..cf4681bbf7 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorXtExtended.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorXtExtended.cc @@ -32,8 +32,6 @@ // Extended driver based on G4OpenInventorXt.hh // Uses G4OpenInventorXtExaminerViewer. -#ifdef G4VIS_BUILD_OIX_DRIVER - // this : #include "G4OpenInventorXtExtended.hh" @@ -110,6 +108,3 @@ G4VViewer* G4OpenInventorXtExtended::CreateViewer (G4VSceneHandler& scene, const G4OpenInventorSceneHandler* pScene = (G4OpenInventorSceneHandler*)&scene; return new G4OpenInventorXtExtendedViewer (*pScene, name); } - - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorXtExtendedViewer.cc b/source/visualization/OpenInventor/src/G4OpenInventorXtExtendedViewer.cc index f9f9ed3c6e..0bca674b6e 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorXtExtendedViewer.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorXtExtendedViewer.cc @@ -37,8 +37,6 @@ * gb 14 November 2004 : inherit G4OpenInventorViewer. */ -#ifdef G4VIS_BUILD_OIX_DRIVER - // this : #include "G4OpenInventorXtExtendedViewer.hh" @@ -426,5 +424,3 @@ void G4OpenInventorXtExtendedViewer::HelpCbk( XtManageChild(This->fHelpForm); XmTextSetString(This->fHelpText,(char*)This->Help().c_str()); } - -#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorXtViewer.cc b/source/visualization/OpenInventor/src/G4OpenInventorXtViewer.cc index b6180271e6..4c40c52b65 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorXtViewer.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorXtViewer.cc @@ -37,8 +37,6 @@ * gb 14 November 2004 : inherit G4OpenInventorViewer. */ -#ifdef G4VIS_BUILD_OIX_DRIVER - // this : #include "G4OpenInventorXtViewer.hh" @@ -373,5 +371,3 @@ void G4OpenInventorXtViewer::HelpCbk( XtManageChild(This->fHelpForm); XmTextSetString(This->fHelpText,(char*)This->Help().c_str()); } - -#endif diff --git a/source/visualization/OpenInventor/src/G4SoQt.cc b/source/visualization/OpenInventor/src/G4SoQt.cc index ac95e45203..e34aa43c8f 100644 --- a/source/visualization/OpenInventor/src/G4SoQt.cc +++ b/source/visualization/OpenInventor/src/G4SoQt.cc @@ -26,8 +26,6 @@ // // F.W. Jones 05012018 -#ifdef G4VIS_BUILD_OIQT_DRIVER - #include #include @@ -166,5 +164,3 @@ bool G4SoQt::IsExternalApp() { return externalApp; } - -#endif diff --git a/source/visualization/OpenInventor/src/SbPainter.cc b/source/visualization/OpenInventor/src/SbPainter.cc index 4a1e72596b..d3c1342119 100644 --- a/source/visualization/OpenInventor/src/SbPainter.cc +++ b/source/visualization/OpenInventor/src/SbPainter.cc @@ -23,7 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OI_DRIVER /*----------------------------HEPVis----------------------------------------*/ /* */ @@ -75,5 +74,3 @@ void SbPainter::enableEdges( { fEdges = aValue; } - -#endif diff --git a/source/visualization/OpenInventor/src/SbPainterPS.cc b/source/visualization/OpenInventor/src/SbPainterPS.cc index d84e2b3ff2..92b14d1537 100644 --- a/source/visualization/OpenInventor/src/SbPainterPS.cc +++ b/source/visualization/OpenInventor/src/SbPainterPS.cc @@ -23,8 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OI_DRIVER - /*----------------------------HEPVis----------------------------------------*/ /* */ /* Node: SbPainterPS */ @@ -1051,5 +1049,3 @@ double ConvertRGB_ToGrey( { return (0.30 * a_red + 0.59 * a_green + 0.11 * a_blue); } - -#endif diff --git a/source/visualization/OpenInventor/src/SoAlternateRepAction.cc b/source/visualization/OpenInventor/src/SoAlternateRepAction.cc index d65f9f13ed..3865af405b 100644 --- a/source/visualization/OpenInventor/src/SoAlternateRepAction.cc +++ b/source/visualization/OpenInventor/src/SoAlternateRepAction.cc @@ -23,8 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OI_DRIVER - // this : #include @@ -149,5 +147,3 @@ void SoAlternateRepAction::nodeAction( } } - -#endif diff --git a/source/visualization/OpenInventor/src/SoBox.cc b/source/visualization/OpenInventor/src/SoBox.cc index aaafdbea18..35c6adb715 100644 --- a/source/visualization/OpenInventor/src/SoBox.cc +++ b/source/visualization/OpenInventor/src/SoBox.cc @@ -34,8 +34,6 @@ /* */ /*--------------------------------------------------------------------------*/ -#ifdef G4VIS_BUILD_OI_DRIVER - // this : #include "HEPVis/nodes/SoBox.h" @@ -280,5 +278,3 @@ void SoBox::generateAlternateRep() { void SoBox::clearAlternateRep() { alternateRep.setValue(NULL); } - -#endif diff --git a/source/visualization/OpenInventor/src/SoCons.cc b/source/visualization/OpenInventor/src/SoCons.cc index 5a58a0ec4f..c97f117749 100644 --- a/source/visualization/OpenInventor/src/SoCons.cc +++ b/source/visualization/OpenInventor/src/SoCons.cc @@ -34,8 +34,6 @@ /* */ /*--------------------------------------------------------------------------*/ -#ifdef G4VIS_BUILD_OI_DRIVER - // this : #include "HEPVis/nodes/SoCons.h" @@ -444,5 +442,3 @@ void SoCons::generateAlternateRep() { void SoCons::clearAlternateRep() { alternateRep.setValue(NULL); } - -#endif diff --git a/source/visualization/OpenInventor/src/SoCounterAction.cc b/source/visualization/OpenInventor/src/SoCounterAction.cc index 8890ffd8a5..92dee23a9e 100644 --- a/source/visualization/OpenInventor/src/SoCounterAction.cc +++ b/source/visualization/OpenInventor/src/SoCounterAction.cc @@ -23,7 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OI_DRIVER /*----------------------------HEPVis----------------------------------------*/ /* */ @@ -105,5 +104,3 @@ void SoCounterAction::setType(const SoType aType,SbBool aCheckDerived) { int SoCounterAction::getCount() const { return fCount; } - -#endif diff --git a/source/visualization/OpenInventor/src/SoDetectorTreeKit.cc b/source/visualization/OpenInventor/src/SoDetectorTreeKit.cc index 5d29ff0b47..e3c5766d3c 100644 --- a/source/visualization/OpenInventor/src/SoDetectorTreeKit.cc +++ b/source/visualization/OpenInventor/src/SoDetectorTreeKit.cc @@ -34,8 +34,6 @@ /* */ /*---------------------------------------------------------------------------*/ -#ifdef G4VIS_BUILD_OI_DRIVER - // this : #include "HEPVis/nodekits/SoDetectorTreeKit.h" @@ -241,5 +239,3 @@ void SoDetectorTreeKit::doAction( SO_ALTERNATEREP_DO_ACTION(aAction) SoBaseKit::doAction(aAction); } - -#endif diff --git a/source/visualization/OpenInventor/src/SoGL2PSAction.cc b/source/visualization/OpenInventor/src/SoGL2PSAction.cc index 5ddb7c87ec..da803775a7 100644 --- a/source/visualization/OpenInventor/src/SoGL2PSAction.cc +++ b/source/visualization/OpenInventor/src/SoGL2PSAction.cc @@ -23,7 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OI_DRIVER /*----------------------------HEPVis----------------------------------------*/ /* */ @@ -163,5 +162,3 @@ void SoGL2PSAction::beginTraversal( SoGLRenderAction::beginTraversal(aNode); } } - -#endif diff --git a/source/visualization/OpenInventor/src/SoImageWriter.cc b/source/visualization/OpenInventor/src/SoImageWriter.cc index f342d004ce..16e145ae7c 100644 --- a/source/visualization/OpenInventor/src/SoImageWriter.cc +++ b/source/visualization/OpenInventor/src/SoImageWriter.cc @@ -23,7 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OI_DRIVER /*----------------------------HEPVis----------------------------------------*/ /* */ @@ -346,5 +345,3 @@ int getRGB( aBlue = *pimag;pimag++; return 1; } - -#endif diff --git a/source/visualization/OpenInventor/src/SoMarkerSet.cc b/source/visualization/OpenInventor/src/SoMarkerSet.cc index 6ddd5527be..4286c6f3b5 100644 --- a/source/visualization/OpenInventor/src/SoMarkerSet.cc +++ b/source/visualization/OpenInventor/src/SoMarkerSet.cc @@ -23,7 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OI_DRIVER /*----------------------------HEPVis----------------------------------------*/ /* */ @@ -791,5 +790,3 @@ GLubyte* getBitmap( } return bitmap; } - -#endif diff --git a/source/visualization/OpenInventor/src/SoPolyhedron.cc b/source/visualization/OpenInventor/src/SoPolyhedron.cc index 3ac330f8f0..e7c8a865e9 100644 --- a/source/visualization/OpenInventor/src/SoPolyhedron.cc +++ b/source/visualization/OpenInventor/src/SoPolyhedron.cc @@ -23,8 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OI_DRIVER - /*----------------------------HEPVis----------------------------------------*/ /* */ /* Node: SoPolyhedron */ @@ -555,5 +553,3 @@ void Geant4_SoPolyhedron::doAction( SO_ALTERNATEREP_DO_ACTION(aAction) SoShape::doAction(aAction); } - -#endif diff --git a/source/visualization/OpenInventor/src/SoStyleCache.cc b/source/visualization/OpenInventor/src/SoStyleCache.cc index 5e03b92c71..6cb5e0be82 100644 --- a/source/visualization/OpenInventor/src/SoStyleCache.cc +++ b/source/visualization/OpenInventor/src/SoStyleCache.cc @@ -23,8 +23,6 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OI_DRIVER - /*----------------------------HEPVis----------------------------------------*/ /* */ /* Node: SoStyleCache */ @@ -208,5 +206,3 @@ SoResetTransform* SoStyleCache::getResetTransform( { return fResetTransform; } - -#endif diff --git a/source/visualization/OpenInventor/src/SoTrap.cc b/source/visualization/OpenInventor/src/SoTrap.cc index cbd6b04ed3..ac8e0cdb67 100644 --- a/source/visualization/OpenInventor/src/SoTrap.cc +++ b/source/visualization/OpenInventor/src/SoTrap.cc @@ -35,8 +35,6 @@ /* */ /*---------------------------------------------------------------------------*/ -#ifdef G4VIS_BUILD_OI_DRIVER - // this : #include "HEPVis/nodes/SoTrap.h" @@ -411,5 +409,3 @@ void SoTrap::generateAlternateRep() { void SoTrap::clearAlternateRep() { alternateRep.setValue(NULL); } - -#endif diff --git a/source/visualization/OpenInventor/src/SoTrd.cc b/source/visualization/OpenInventor/src/SoTrd.cc index e2d8934a53..163fba5e3c 100644 --- a/source/visualization/OpenInventor/src/SoTrd.cc +++ b/source/visualization/OpenInventor/src/SoTrd.cc @@ -34,8 +34,6 @@ /* */ /*--------------------------------------------------------------------------*/ -#ifdef G4VIS_BUILD_OI_DRIVER - #include #include @@ -345,5 +343,3 @@ void SoTrd::generateAlternateRep() { void SoTrd::clearAlternateRep() { alternateRep.setValue(NULL); } - -#endif diff --git a/source/visualization/OpenInventor/src/SoTubs.cc b/source/visualization/OpenInventor/src/SoTubs.cc index 68bfef25e9..90878a8e99 100644 --- a/source/visualization/OpenInventor/src/SoTubs.cc +++ b/source/visualization/OpenInventor/src/SoTubs.cc @@ -34,8 +34,6 @@ /* */ /*--------------------------------------------------------------------------*/ -#ifdef G4VIS_BUILD_OI_DRIVER - // this : #include "HEPVis/nodes/SoTubs.h" @@ -471,5 +469,3 @@ void SoTubs::generateAlternateRep() { void SoTubs::clearAlternateRep() { alternateRep.setValue(NULL); } - -#endif diff --git a/source/visualization/OpenInventor/src/wheelmouse.cc b/source/visualization/OpenInventor/src/wheelmouse.cc index 8a56002011..c42cb9bf4d 100644 --- a/source/visualization/OpenInventor/src/wheelmouse.cc +++ b/source/visualization/OpenInventor/src/wheelmouse.cc @@ -22,8 +22,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef G4VIS_BUILD_OIX_DRIVER - #include #include #include @@ -143,5 +141,3 @@ void xmAddMouseEventHandler(Widget w) #if defined(__cplusplus) || defined(c_plusplus) } #endif - -#endif // G4VIS_BUILD_OIX_DRIVER diff --git a/source/visualization/Qt3D/GNUmakefile b/source/visualization/Qt3D/GNUmakefile index 31afb8cbfe..842b642bda 100644 --- a/source/visualization/Qt3D/GNUmakefile +++ b/source/visualization/Qt3D/GNUmakefile @@ -21,6 +21,7 @@ CPPFLAGS += -I$(G4BASE)/visualization/management/include CPPFLAGS += -I$(G4BASE)/visualization/modeling/include CPPFLAGS += -I$(G4BASE)/global/management/include CPPFLAGS += -I$(G4BASE)/global/HEPGeometry/include +CPPFLAGS += -I$(G4BASE)/global/HEPRandom/include CPPFLAGS += -I$(G4BASE)/graphics_reps/include CPPFLAGS += -I$(G4BASE)/intercoms/include CPPFLAGS += -I$(G4BASE)/interfaces/common/include diff --git a/source/visualization/Qt3D/History b/source/visualization/Qt3D/History index e7e7a9534a..52a32234aa 100644 --- a/source/visualization/Qt3D/History +++ b/source/visualization/Qt3D/History @@ -18,6 +18,37 @@ committal in the CVS repository ! History file for visualization/Qt3D sub-category ----------------------------------------------- +12 November 2021 - Ben Morgan (visQt3D-V10-07-12) +- Retire G4VIS_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +8 November 2021 - Ben Morgan (visQt3D-V10-07-11) +- Retire G4UI/G4INTY_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +20 October 2021 Gabriele Cosmo (visQt3D-V10-07-10) +- Fixed broken dependency in GNUmakefile... + +18 October 2021 John Allison (visQt3D-V10-07-09) +- G4Qt3DSceneHandler: + - Introduce AddCompound(const G4Mesh&). + - This copies G4OpenGLSceneHandler. + - Subsequently it may be refined for Qt3D - but works well for now. + +01 September 2021 John Allison (visQt3D-V10-07-08) +- G4Qt3DSceneHandler.cc: + o Raise G4Exception if no available node. +- G4Qt3DViewer.cc: + o Protect against illegal call to show() - it may only be called from + the master thread. + +22 August 2021 John Allison (visQt3D-V10-07-07) +- Fix the problem of drawing from the vis sub-thread. + +20 August 2021 John Allison (visQt3D-V10-07-06) +- Minor updates - optional debug printing, etc. +- Revert to black background. +- Add G4Qt3DViewer::MovingToVisSubThread and MovingToMasterThread. 07 June 2021 John Allison (visQt3D-V10-07-05) - Requires greps-V10-07-07 (new method AddCompound (const G4Mesh&)). diff --git a/source/visualization/Qt3D/include/G4Qt3D.hh b/source/visualization/Qt3D/include/G4Qt3D.hh index c656c5c056..979d0a024c 100644 --- a/source/visualization/Qt3D/include/G4Qt3D.hh +++ b/source/visualization/Qt3D/include/G4Qt3D.hh @@ -25,8 +25,6 @@ // // John Allison 17th June 2019 -#if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) - #ifndef G4QT3D_HH #define G4QT3D_HH @@ -42,5 +40,3 @@ public: }; #endif - -#endif // #if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) diff --git a/source/visualization/Qt3D/include/G4Qt3DQEntity.hh b/source/visualization/Qt3D/include/G4Qt3DQEntity.hh index dc631ee1be..28f67ca97d 100644 --- a/source/visualization/Qt3D/include/G4Qt3DQEntity.hh +++ b/source/visualization/Qt3D/include/G4Qt3DQEntity.hh @@ -25,8 +25,6 @@ // // John Allison, 30th August 2020 -#if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) - #ifndef G4QT3DQENTITY_HH #define G4QT3DQENTITY_HH @@ -47,5 +45,3 @@ private: }; #endif - -#endif // #if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) diff --git a/source/visualization/Qt3D/include/G4Qt3DSceneHandler.hh b/source/visualization/Qt3D/include/G4Qt3DSceneHandler.hh index 93217b0291..7cfed94887 100644 --- a/source/visualization/Qt3D/include/G4Qt3DSceneHandler.hh +++ b/source/visualization/Qt3D/include/G4Qt3DSceneHandler.hh @@ -25,8 +25,6 @@ // // John Allison 17th June 2019 -#if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) - #ifndef G4QT3DSCENEHANDLER_HH #define G4QT3DSCENEHANDLER_HH @@ -67,6 +65,8 @@ public: void AddPrimitive(const G4Square&); void AddPrimitive(const G4Polyhedron&); + void AddCompound(const G4Mesh&); + void ClearStore (); void ClearTransientStore (); @@ -85,5 +85,3 @@ protected: }; #endif - -#endif // #if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) diff --git a/source/visualization/Qt3D/include/G4Qt3DUtils.hh b/source/visualization/Qt3D/include/G4Qt3DUtils.hh index 2379b289dd..c282a9c009 100644 --- a/source/visualization/Qt3D/include/G4Qt3DUtils.hh +++ b/source/visualization/Qt3D/include/G4Qt3DUtils.hh @@ -25,8 +25,6 @@ // // John Allison, 18th July 2020 -#if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) - #ifndef G4QT3DUTILS_HH #define G4QT3DUTILS_HH @@ -59,5 +57,3 @@ void PrintQObjectTree } // namespace G4Qt3DUtils #endif - -#endif // #if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) diff --git a/source/visualization/Qt3D/include/G4Qt3DViewer.hh b/source/visualization/Qt3D/include/G4Qt3DViewer.hh index 53a97bc8ab..71a3b82740 100644 --- a/source/visualization/Qt3D/include/G4Qt3DViewer.hh +++ b/source/visualization/Qt3D/include/G4Qt3DViewer.hh @@ -25,8 +25,6 @@ // // John Allison 17th June 2019 -#if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) - #ifndef G4QT3DVIEWER_HH #define G4QT3DVIEWER_HH @@ -49,7 +47,9 @@ public: void ShowView(); void FinishView(); + void MovingToVisSubThread(); void SwitchToVisSubThread(); + void MovingToMasterThread(); void SwitchToMasterThread(); protected: @@ -77,5 +77,3 @@ protected: }; #endif - -#endif // #if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) diff --git a/source/visualization/Qt3D/sources.cmake b/source/visualization/Qt3D/sources.cmake index b9b56b5243..e8351fdcc7 100644 --- a/source/visualization/Qt3D/sources.cmake +++ b/source/visualization/Qt3D/sources.cmake @@ -14,8 +14,7 @@ geant4_add_module(G4visQt3D G4Qt3DUtils.cc G4Qt3DViewer.cc) -geant4_module_compile_definitions(G4visQt3D - PRIVATE G4INTY_BUILD_QT G4UI_BUILD_QT_SESSION G4VIS_BUILD_QT3D_DRIVER) +geant4_module_compile_definitions(G4visQt3D PRIVATE G4VIS_BUILD_QT3D_DRIVER) geant4_module_link_libraries(G4visQt3D PUBLIC diff --git a/source/visualization/Qt3D/src/G4Qt3D.cc b/source/visualization/Qt3D/src/G4Qt3D.cc index e3d7780cfc..0ca600ad88 100644 --- a/source/visualization/Qt3D/src/G4Qt3D.cc +++ b/source/visualization/Qt3D/src/G4Qt3D.cc @@ -25,8 +25,6 @@ // // John Allison 17th June 2019 -#if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) - #include "G4Qt3D.hh" #include "G4Qt3DSceneHandler.hh" #include "G4Qt3DViewer.hh" @@ -99,5 +97,3 @@ G4bool G4Qt3D::IsUISessionCompatible () const } return isCompatible; } - -#endif // #if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) diff --git a/source/visualization/Qt3D/src/G4Qt3DSceneHandler.cc b/source/visualization/Qt3D/src/G4Qt3DSceneHandler.cc index bcadbb6197..f96c9c73f5 100644 --- a/source/visualization/Qt3D/src/G4Qt3DSceneHandler.cc +++ b/source/visualization/Qt3D/src/G4Qt3DSceneHandler.cc @@ -25,8 +25,6 @@ // // John Allison 17th June 2019 -#if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) - #include "G4Qt3DSceneHandler.hh" #include "G4PhysicalVolumeModel.hh" @@ -43,6 +41,10 @@ #include "G4Polyhedron.hh" #include "G4Scene.hh" #include "G4Threading.hh" +#include "G4Mesh.hh" +#include "G4PseudoScene.hh" +#include "G4VisManager.hh" +#include "Randomize.hh" #include "G4Qt3DViewer.hh" #include "G4Qt3DUtils.hh" @@ -117,12 +119,8 @@ void G4Qt3DSceneHandler::EstablishG4Qt3DQEntities() } G4Qt3DQEntity* G4Qt3DSceneHandler::CreateNewNode() -{ // Create a G4Qt3DQEntity node suitable for next solid or primitive - - // Avoid Qt errors in MT mode - see G4Qt3DViewer::SwitchToMasterThread -#ifdef G4MULTITHREADED - if (!G4Threading::IsMasterThread()) return nullptr; -#endif +{ + // Create a G4Qt3DQEntity node suitable for next solid or primitive G4Qt3DQEntity* newNode = nullptr; @@ -265,11 +263,20 @@ void G4Qt3DSceneHandler::AddPrimitive(const G4Polyline& polyline) << G4endl; #endif - auto currentNode = CreateNewNode(); - if (!currentNode) return; // Node not available - if (polyline.size() == 0) return; + auto currentNode = CreateNewNode(); + if (!currentNode) { + static G4bool first = true; + if (first) { + first = false; + G4Exception("G4Qt3DSceneHandler::AddPrimitive(const G4Polyline&)", + "qt3d-0003", JustWarning, + "No available node!"); + } + return; + } + fpVisAttribs = fpViewer->GetApplicableVisAttributes(polyline.GetVisAttributes()); auto transform = G4Qt3DUtils::CreateQTransformFrom(fObjectTransformation); @@ -323,7 +330,7 @@ void G4Qt3DSceneHandler::AddPrimitive(const G4Polyline& polyline) polylineEntity->addComponent(material); auto renderer = new Qt3DRender::QGeometryRenderer; - renderer->setObjectName("polyhedronWireframeRenderer"); + renderer->setObjectName("polylineWireframeRenderer"); renderer->setGeometry(polylineGeometry); renderer->setVertexCount(2*nLines); renderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::Lines); @@ -332,11 +339,20 @@ void G4Qt3DSceneHandler::AddPrimitive(const G4Polyline& polyline) void G4Qt3DSceneHandler::AddPrimitive (const G4Polymarker& polymarker) { - auto currentNode = CreateNewNode(); - if (!currentNode) return; // Node not available - if (polymarker.size() == 0) return; + auto currentNode = CreateNewNode(); + if (!currentNode) { + static G4bool first = true; + if (first) { + first = false; + G4Exception("G4Qt3DSceneHandler::AddPrimitive(const G4Polymarker&)", + "qt3d-0003", JustWarning, + "No available node!"); + } + return; + } + fpVisAttribs = fpViewer->GetApplicableVisAttributes(polymarker.GetVisAttributes()); switch (polymarker.GetMarkerType()) { @@ -416,15 +432,17 @@ void G4Qt3DSceneHandler::AddPrimitive (const G4Polymarker& polymarker) radius =circle.GetWorldRadius(); } else { // Screen-size or none // Not figured out how to do screen-size, so use scene extent - const G4double scale = 200.; // Roughly pixles per scene + const G4double scale = 200.; // Roughly pixels per scene radius = circle.GetScreenRadius()*fpScene->GetExtent().GetExtentRadius()/scale; } sphereMesh->setRadius(radius); +// sphereMesh->setInstanceCount(polymarker.size()); // Not undertood instancing yet - for (size_t iPoint = 0; iPoint < polymarker.size (); iPoint++) { +// auto currentEntity = new Qt3DCore::QEntity(currentNode); // Not undertood instancing yet + for (size_t iPoint = 0; iPoint < polymarker.size(); iPoint++) { auto position = fObjectTransformation*G4Translate3D(polymarker[iPoint]); auto transform = G4Qt3DUtils::CreateQTransformFrom(position); - auto currentEntity = new Qt3DCore::QEntity(currentNode); + auto currentEntity = new Qt3DCore::QEntity(currentNode); // Not undertood instancing yet currentEntity->addComponent(material); currentEntity->addComponent(transform); currentEntity->addComponent(sphereMesh); @@ -455,7 +473,7 @@ void G4Qt3DSceneHandler::AddPrimitive (const G4Polymarker& polymarker) boxMesh->setYExtent(side); boxMesh->setZExtent(side); - for (size_t iPoint = 0; iPoint < polymarker.size (); iPoint++) { + for (size_t iPoint = 0; iPoint < polymarker.size(); iPoint++) { auto position = fObjectTransformation*G4Translate3D(polymarker[iPoint]); auto transform = G4Qt3DUtils::CreateQTransformFrom(position); auto currentEntity = new Qt3DCore::QEntity(currentNode); @@ -468,25 +486,36 @@ void G4Qt3DSceneHandler::AddPrimitive (const G4Polymarker& polymarker) } } -void G4Qt3DSceneHandler::AddPrimitive(const G4Text& /*text*/) { #ifdef G4QT3DDEBUG +void G4Qt3DSceneHandler::AddPrimitive(const G4Text& text) { G4cout << "G4Qt3DSceneHandler::AddPrimitive(const G4Text& text) called.\n" << text << G4endl; +#else +void G4Qt3DSceneHandler::AddPrimitive(const G4Text& /*text*/) { #endif static G4bool first = true; if (first) { first = false; - G4Exception("G4Qt3DSceneHandler::AddPrimitive(const G4Text& text)", + G4Exception("G4Qt3DSceneHandler::AddPrimitive(const G4Text&)", "qt3D-0002", JustWarning, "Text drawing doesn't work yet"); } // OK. Not working, but let it execute, which it does without error. /* But it crashes after /vis/viewer/rebuild!!! auto currentNode = CreateNewNode(); - if (!currentNode) return; // Node not available + if (!currentNode) { + static G4bool first = true; + if (first) { + first = false; + G4Exception("G4Qt3DSceneHandler::AddPrimitive(const G4Text&)", + "qt3d-0003", JustWarning, + "No available node!"); + } + return; + } fpVisAttribs = fpViewer->GetApplicableVisAttributes(text.GetVisAttributes()); @@ -555,7 +584,16 @@ void G4Qt3DSceneHandler::AddPrimitive(const G4Circle& circle) #endif auto currentNode = CreateNewNode(); - if (!currentNode) return; // Node not available + if (!currentNode) { + static G4bool first = true; + if (first) { + first = false; + G4Exception("G4Qt3DSceneHandler::AddPrimitive(const G4Circle&)", + "qt3d-0003", JustWarning, + "No available node!"); + } + return; + } fpVisAttribs = fpViewer->GetApplicableVisAttributes(circle.GetVisAttributes()); @@ -613,7 +651,16 @@ void G4Qt3DSceneHandler::AddPrimitive(const G4Square& square) #endif auto currentNode = CreateNewNode(); - if (!currentNode) return; // Node not available + if (!currentNode) { + static G4bool first = true; + if (first) { + first = false; + G4Exception("G4Qt3DSceneHandler::AddPrimitive(const G4Square&)", + "qt3d-0003", JustWarning, + "No available node!"); + } + return; + } fpVisAttribs = fpViewer->GetApplicableVisAttributes(square.GetVisAttributes()); @@ -649,7 +696,16 @@ void G4Qt3DSceneHandler::AddPrimitive(const G4Square& square) void G4Qt3DSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) { auto currentNode = CreateNewNode(); - if (!currentNode) return; // Node not available + if (!currentNode) { + static G4bool first = true; + if (first) { + first = false; + G4Exception("G4Qt3DSceneHandler::AddPrimitive(const G4Polyhedron&)", + "qt3d-0003", JustWarning, + "No available node!"); + } + return; + } if (polyhedron.GetNoFacets() == 0) return; @@ -994,6 +1050,119 @@ void G4Qt3DSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) } } +void G4Qt3DSceneHandler::AddCompound(const G4Mesh& mesh) +{ + // Special mesh rendering + // Limited to rectangular 3-deep meshes + if (mesh.GetMeshType() != G4Mesh::rectangle || + mesh.GetMeshDepth() != 3) { + G4VSceneHandler::AddCompound(mesh); + } + + auto container = mesh.GetContainerVolume(); + + static G4bool firstPrint = true; + G4VisManager::Verbosity verbosity = G4VisManager::GetVerbosity(); + G4bool print = firstPrint && verbosity >= G4VisManager::confirmations; + + if (print) { + G4cout + << "Special case drawing of G4VNestedParameterisation in G4OpenGLSceneHandler" + << '\n' << mesh + << G4endl; + } + + // Instantiate a temporary G4PhysicalVolumeModel + G4ModelingParameters tmpMP; + tmpMP.SetCulling(true); // This avoids drawing transparent... + tmpMP.SetCullingInvisible(true); // ... or invisble volumes. + const G4bool useFullExtent = true; // To avoid calculating the extent + G4PhysicalVolumeModel tmpPVModel + (container, + G4PhysicalVolumeModel::UNLIMITED, + G4Transform3D(), + &tmpMP, + useFullExtent); + + // Instantiate a pseudo scene so that we can make a "private" descent + // into the nested parameterisation and fill a multimap... + std::multimap positionByColour; + G4double halfX = 0., halfY = 0., halfZ = 0.; + struct PseudoScene: public G4PseudoScene { + PseudoScene + (G4PhysicalVolumeModel* pvModel // input...the following are outputs + , std::multimap& positionByColour + , G4double& halfX, G4double& halfY, G4double& halfZ) + : fpPVModel(pvModel) + , fPositionByColour(positionByColour) + , fHalfX(halfX), fHalfY(halfY), fHalfZ(halfZ) + {} + using G4PseudoScene::AddSolid; // except for... + void AddSolid(const G4Box& box) { + const G4Colour& colour = fpPVModel->GetCurrentLV()->GetVisAttributes()->GetColour(); + const G4ThreeVector& position = fpCurrentObjectTransformation->getTranslation(); + fPositionByColour.insert(std::make_pair(colour,position)); + fHalfX = box.GetXHalfLength(); + fHalfY = box.GetYHalfLength(); + fHalfZ = box.GetZHalfLength(); + } + G4PhysicalVolumeModel* fpPVModel; + std::multimap& fPositionByColour; + G4double &fHalfX, &fHalfY, &fHalfZ; + } + pseudoScene(&tmpPVModel,positionByColour,halfX,halfY,halfZ); + + // Make private descent into the nested parameterisation + tmpPVModel.DescribeYourselfTo(pseudoScene); + + // Make list of found colours + std::set setOfColours; + for (const auto& entry: positionByColour) { + setOfColours.insert(entry.first); + } + + if (print) { + for (const auto& colour: setOfColours) { + G4cout << "setOfColours: " << colour << G4endl; + } + } + + // Draw as dots + BeginPrimitives (mesh.GetTransform()); + G4int nDotsTotal = 0; + for (const auto& colour: setOfColours) { + G4int nDots = 0; + G4Polymarker dots; + dots.SetVisAttributes(G4Colour(colour)); + dots.SetMarkerType(G4Polymarker::dots); + dots.SetSize(G4VMarker::screen,1.); + dots.SetInfo(container->GetName()); + const auto range = positionByColour.equal_range(colour); + for (auto posByCol = range.first; posByCol != range.second; ++posByCol) { + const G4double x = posByCol->second.getX() + (2.*G4UniformRand()-1.)*halfX; + const G4double y = posByCol->second.getY() + (2.*G4UniformRand()-1.)*halfY; + const G4double z = posByCol->second.getZ() + (2.*G4UniformRand()-1.)*halfZ; + dots.push_back(G4ThreeVector(x,y,z)); + ++nDots; + } + AddPrimitive(dots); + if (print) { + G4cout + << "Number of dots for colour " << colour + << ": " << nDots << G4endl; + } + nDotsTotal += nDots; + } + if (print) { + G4cout << "Total number of dots: " << nDotsTotal << G4endl; + } + EndPrimitives (); + + firstPrint = false; + + return; +} + void G4Qt3DSceneHandler::ClearStore () { G4Qt3DUtils::delete_components_and_children_of_entity_recursively(fpQt3DScene); @@ -1004,5 +1173,3 @@ void G4Qt3DSceneHandler::ClearTransientStore () { G4Qt3DUtils::delete_components_and_children_of_entity_recursively(fpTransientObjects); } - -#endif // #if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) diff --git a/source/visualization/Qt3D/src/G4Qt3DUtils.cc b/source/visualization/Qt3D/src/G4Qt3DUtils.cc index ca09d060a6..20a9ccab56 100644 --- a/source/visualization/Qt3D/src/G4Qt3DUtils.cc +++ b/source/visualization/Qt3D/src/G4Qt3DUtils.cc @@ -25,8 +25,6 @@ // // John Allison, 18th July 2020 -#if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) - #include "G4Qt3DUtils.hh" #include "G4Qt3DQEntity.hh" @@ -150,12 +148,14 @@ void G4Qt3DUtils::PrintQObjectTree if (where.length()) logFile << "\n===== QObjectTree at " << where << std::endl; static G4int iDep = -1; ++iDep; - const auto* g4node = dynamic_cast(node); G4String nodeName = node->objectName().toStdString(); if (nodeName == "") nodeName = "X"; for (G4int i = 0; i < iDep; ++i) logFile << " "; logFile << (void*)node << ": " - << "Node at depth " << iDep << ": " << nodeName << ": "; + << "Node at depth " << iDep << ": " << nodeName << ": " + << "thread: " << node->thread() << ": " + << "parent: " << node->parent() << ": "; + const auto* g4node = dynamic_cast(node); if (g4node) { logFile << g4node->GetPVNodeID() << std::endl; } else { @@ -178,5 +178,3 @@ void G4Qt3DUtils::PrintQObjectTree return; } #endif - -#endif // #if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) diff --git a/source/visualization/Qt3D/src/G4Qt3DViewer.cc b/source/visualization/Qt3D/src/G4Qt3DViewer.cc index 168568ec62..84a628730f 100644 --- a/source/visualization/Qt3D/src/G4Qt3DViewer.cc +++ b/source/visualization/Qt3D/src/G4Qt3DViewer.cc @@ -25,8 +25,6 @@ // // John Allison 17th June 2019 -#if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) - #include "G4Qt3DViewer.hh" #include "G4Qt3DSceneHandler.hh" @@ -54,10 +52,6 @@ void G4Qt3DViewer::Initialise() fVP.SetAutoRefresh(true); fDefaultVP.SetAutoRefresh(true); - // Background is white (not figured out how to change it) so... - fVP.SetDefaultColour(G4Colour::Black()); - fDefaultVP.SetDefaultColour(G4Colour::Black()); - auto UI = G4UImanager::GetUIpointer(); auto uiQt = dynamic_cast(UI->GetG4UIWindow()); if (!uiQt) { @@ -67,6 +61,9 @@ void G4Qt3DViewer::Initialise() return; } fUIWidget = QWidget::createWindowContainer(this); + fUIWidget->setMinimumSize(QSize(200, 100)); + fUIWidget->setMaximumSize(screen()->size()); +// fUIWidget->setFocusPolicy(Qt::NoFocus); //?? uiQt->AddTabWidget(fUIWidget,QString(fName)); setRootEntity(fQt3DSceneHandler.fpQt3DScene); @@ -77,6 +74,9 @@ G4Qt3DViewer::~G4Qt3DViewer() void G4Qt3DViewer::SetView() { + // Background colour + defaultFrameGraph()->setClearColor(G4Qt3DUtils::ConvertToQColor(fVP.GetBackgroundColour())); + // Get radius of scene, etc. // Note that this procedure properly takes into account zoom, dolly and pan. const G4Point3D targetPoint @@ -154,60 +154,77 @@ void G4Qt3DViewer::DrawView() void G4Qt3DViewer::ShowView() { - show(); + // show() may only be called from master thread + if (G4Threading::IsMasterThread()) { + show(); + } + // The way Qt seems to work, we don't seem to need a show() anyway, but + // we'll leave it in - it seems not to have any effect, good or bad. } void G4Qt3DViewer::FinishView() { - show(); + if (G4Threading::IsMasterThread()) { + show(); + } +} + +namespace { + QThread* masterQThread = nullptr; + QThread* visSubThreadQThread = nullptr; +} + +# include + +void G4Qt3DViewer::MovingToVisSubThread() +{ +#ifdef G4QT3DDEBUG + G4cout << "G4Qt3DViewer::MovingToVisSubThread" << G4endl; +#endif + // Still on master thread but vis thread has been launched + // Make note of master QThread + masterQThread = QThread::currentThread(); + // Wait until SwitchToVisSubThread has found vis sub-thread QThread + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + // Move relevant stuff to vis sub-thread QThread + auto p1 = fQt3DSceneHandler.fpQt3DScene->parent(); + auto p2 = p1->parent(); + p2->moveToThread(visSubThreadQThread); } void G4Qt3DViewer::SwitchToVisSubThread() { -// fUIWidget->moveToThread(QThread::currentThread()); -// moveToThread(QThread::currentThread()); -// fQt3DSceneHandler.fpQt3DScene->moveToThread(QThread::currentThread()); -// fQt3DSceneHandler.fpTransientObjects->moveToThread(QThread::currentThread()); #ifdef G4QT3DDEBUG -// G4cout -// << "G4Qt3DViewer::SwitchToVisSubThread: (void*)fQt3DSceneHandler.fpQt3DScene: " -// << (void*)fQt3DSceneHandler.fpQt3DScene -// << G4endl; + G4cout << "G4Qt3DViewer::SwitchToVisSubThread" << G4endl; #endif + // On vis sub-thread before any drawing + // Make note of vis-subthread QThread for MovingToVisSubThread + visSubThreadQThread = QThread::currentThread(); + // Wait until SwitchToVisSubThread has moved stuff + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); +} + +void G4Qt3DViewer::MovingToMasterThread() +{ +#ifdef G4QT3DDEBUG + G4cout << "G4Qt3DViewer::MovingToMasterThread" << G4endl; +#endif + // On vis sub-thread just before exit + // Move relevant stuff to master QThread. + auto p1 = fQt3DSceneHandler.fpQt3DScene->parent(); + auto p2 = p1->parent(); + p2->moveToThread(masterQThread); + // Zero - will be different next run + visSubThreadQThread = nullptr; } void G4Qt3DViewer::SwitchToMasterThread() { -// fUIWidget->moveToThread(QThread::currentThread()); -// moveToThread(QThread::currentThread()); -// fQt3DSceneHandler.fpQt3DScene->moveToThread(QThread::currentThread()); -// fQt3DSceneHandler.fpTransientObjects->moveToThread(QThread::currentThread()); #ifdef G4QT3DDEBUG -// G4cout -// << "G4Qt3DViewer::SwitchToMasterThread: (void*)fQt3DSceneHandler.fpQt3DScene: " -// << (void*)fQt3DSceneHandler.fpQt3DScene -// << G4endl; -#endif - -#ifdef G4MULTITHREADED - if (G4Threading::IsMultithreadedApplication()) { - // I have not figured out how to draw during a run. In fact, even attempting - // to fill nodes gives the error "Cannot create children for a parent that - // is in a different thread." So instead draw events from kept events. - // - // Setting fNeedKernelVisit=true causes scene deletion and a complete rebuild, - // including trajectories, hits, etc. from kept events. - // - // Clearly this is a limitation because even if you run 1000 events you only - // get those kept (default 100), and even worse, if end-if-event-action is - // "refresh", you only get one event (the last I think). - // - // Also, strictly, there is no need to rebuid run-duration models (detector), - // but a complete rebuild is the easiest way (already imeplemented). - fNeedKernelVisit = true; - DrawView(); // Draw trajectories, etc., from kept events - } + G4cout << "G4Qt3DViewer::SwitchToMasterThread" << G4endl; #endif + // On master thread after vis sub-thread has terminated + // Nothing to do } void G4Qt3DViewer::KernelVisitDecision () { @@ -366,5 +383,3 @@ void G4Qt3DViewer::wheelEvent(QWheelEvent* ev) SetView(); DrawView(); } - -#endif // #if defined (G4VIS_BUILD_QT3D_DRIVER) || defined (G4VIS_USE_QT3D) diff --git a/source/visualization/RayTracer/GNUmakefile b/source/visualization/RayTracer/GNUmakefile index 293a9e0724..d7de742789 100644 --- a/source/visualization/RayTracer/GNUmakefile +++ b/source/visualization/RayTracer/GNUmakefile @@ -52,4 +52,29 @@ CPPFLAGS += -I$(G4BASE)/processes/cuts/include CPPFLAGS += -I$(G4BASE)/processes/scoring/include CPPFLAGS += -I$(G4BASE)/materials/include +# Locally adjust source list before including common.gmk +sources := $(addprefix src/,G4RTJpegCoder.cc \ + G4RTJpegMaker.cc \ + G4RTMessenger.cc \ + G4RTOutBitStream.cc \ + G4RTPrimaryGeneratorAction.cc \ + G4RTRun.cc \ + G4RTRunAction.cc \ + G4RTSimpleScanner.cc \ + G4RTSteppingAction.cc \ + G4RTTrackingAction.cc \ + G4RTWorkerInitialization.cc \ + G4RayTracer.cc \ + G4RayTracerSceneHandler.cc \ + G4RayTracerViewer.cc \ + G4RayTrajectory.cc \ + G4RayTrajectoryPoint.cc \ + G4TheMTRayTracer.cc \ + G4TheRayTracer.cc \ + G4VRTScanner.cc) + +ifdef G4VIS_BUILD_RAYTRACERX_DRIVER + sources += src/G4RayTracerX.cc src/G4RayTracerXViewer.cc src/G4RTXScanner.cc +endif + include $(G4INSTALL)/config/common.gmk diff --git a/source/visualization/RayTracer/History b/source/visualization/RayTracer/History index 7d90f5cb36..de024e1697 100644 --- a/source/visualization/RayTracer/History +++ b/source/visualization/RayTracer/History @@ -23,6 +23,46 @@ committal in the CVS repository ! History file for Ray Tracer category --------------------------------------- +18 November 2021 John Allison (raytracer-V10-07-06) +- G4RayTracer.cc: Coverity fix: un-initialised data member. + +12 November 2021 - Ben Morgan (raytracer-V10-07-05) +- Retire G4VIS_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +25 October 2021 Guy Barrand (raytracer-V10-07-04) +- G4RayTracerSceneHandler.hh: to quiet g++ about "AddPrimitive(G4Plotter&)", have: + using G4VSceneHandler::AddPrimitive; + +30 September 2021 John Allison (raytracer-V10-07-03) +- Remove instantiation of G4The(MT)RayTracer from G4RayTracer. + - G4RayTracer is/should be a "pure factory". Its job is to instantiate + a scene handler or viewer on request. G4The(MT)RayTracer should/need + only be instantiated when the viewer is instantiated. + - It is somewhat complicated by the need(?) for G4TheMTRayTracer to be + a singleton - is that really required? Cannot G4RTRun simply get the + current ray tracer? Anyway, singleton nature is preserved. + +24 September 2021 John Allison (raytracer-V10-07-02) +- Make RayTracerX viewers "auto refresh". + - This means the ray tracer will start tracing immediately on opening + (`/vis/open RayTracerX`) and on any change of view parameters. + - In the past it was thought better to refresh manually, to give opportunity + of adjusting the view first, but with the introduction of using the + view parameters of the previously existing viewer (visman-V10-07-20), + it is easy to choose a view with an OpenGL viewer, say, then simply open + the ray tracer viewer. + - Also, with the advent of multithreading, ray tracing is faster, so + adjusting and re-viewing is less tedious. + - This only affects RayTracerX - plain RayTracer is not affected. + - You may switch this feature off with `/vis/viewer/set/auto-refresh false`. + +30 June 2021 John Allison (raytracer-V10-07-01) +- Requires greps-V10-07-09, modeling-V10-07-11 and visman-V10-07-11. +- Revise vis models. See visualization/modeling/History for more details. +- Consequent changes: + o AddPrimitive(const G4Scale&) has been removed from all scene handlers. + 15th April 2021 Ben Morgan (raytracer-V10-07-00) - Migrate to modular CMake build diff --git a/source/visualization/RayTracer/README b/source/visualization/RayTracer/README deleted file mode 100644 index 608fb3db7d..0000000000 --- a/source/visualization/RayTracer/README +++ /dev/null @@ -1,82 +0,0 @@ - -G4RayTracer version 1.0 (29/Jan/00) - -1. Introduction - - G4RayTracer is a "ray tracing" package which uses Geant4 kernel mechanism -of tracking/navigation. It visualizes any kinds of solids that Geant4 -kernel can navigate. - -2. Building a library - - G4RayTracer is one of visualization driver which Geant4 supports. To build -a library of G4RayTracer (library name G4RayTracer), set an environment -variable G4VIS_BUILD_RAYTRACER_DRIVER. - - $ setenv G4VIS_BUILD_RAYTRACER_DRIVER 1 - -3. Using G4RayTracer - - To use G4RayTracer, set an environment variable G4VIS_USE_RAYTRACER. - - $ setenv G4VIS_USE_RAYTRACER 1 - -Also, G4RayTracer has to be registored to the user's concrete VisManager. -Refer an example given in - geant4/source/visualization/management/include/MyVisManager.cc. - -4. Notes - -a) G4RayTracer generates JPEG file(s). To visualize these files, use your -local program such as NetScape or xview, etc. - -b) The eye position must be inside of the defined world volume. If you want -to draw your detector setup from very far position, you need to enlarge -your world volume. - -c) G4RayTracer ignores volumes without G4VisAttributes, volumes which are -set as "forced wire frame", and volumes which are set as "invisible". - -d) In case you get unexpected figure, check - d.1) eye position and target position are properly set, - d.2) light direction is properly set (note light direction is from - illumination light source to the objects), - d.3) span angle (given by angle for 100 pixels) is reasonable, - d.4) there is no surrounding volume(s) without transparency. - -e) G4RayTracer can be executed ONLY AT "Idle" state. - -5. Basic UI commands - -a) /vis/rayTracer/eyePosition x y z unit - eye position - -b) /vis/rayTracer/target x y z unit - target position - in default it is set to the origine - -c) /vis/rayTracer/lightDirection ex ey ez - vector of the illuminating light (need not to be a unit vector) - note light direction is from illumination light source to the objects - -d) /vis/rayTracer/column nColumn - number of holizontal pixels - in default 640 pixels - -e) /vis/rayTracer/row nRow - number of virtical pixels - in default 640 pixels - -f) /vis/rayTracer/span angle unit - angle for 100 pixels - in default 5 degree - -g) /vis/rayTracer/trace fileName - execution of G4RayTracer - "fileName" is the out put JPEG file name - in default "g4RayTracer.jpeg" - NOTE THAT THIS COMMAND IS AVAILABLE ONLY AT IDLE STATE - - - - diff --git a/source/visualization/RayTracer/include/G4RTXScanner.hh b/source/visualization/RayTracer/include/G4RTXScanner.hh index d3bd891c11..6cfba70fd8 100644 --- a/source/visualization/RayTracer/include/G4RTXScanner.hh +++ b/source/visualization/RayTracer/include/G4RTXScanner.hh @@ -27,8 +27,6 @@ // // -#ifdef G4VIS_BUILD_RAYTRACERX_DRIVER - #ifndef G4RTXScanner_H #define G4RTXScanner_H 1 @@ -87,5 +85,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/RayTracer/include/G4RayTracerSceneHandler.hh b/source/visualization/RayTracer/include/G4RayTracerSceneHandler.hh index 3e6f69c24f..a1a9830953 100644 --- a/source/visualization/RayTracer/include/G4RayTracerSceneHandler.hh +++ b/source/visualization/RayTracer/include/G4RayTracerSceneHandler.hh @@ -50,13 +50,13 @@ public: {BuildVisAttsMap(solid);} // Required pure virtual functions, not used in Ray Tracer. + using G4VSceneHandler::AddPrimitive; void AddPrimitive(const G4Polyline&){} void AddPrimitive(const G4Text&){} void AddPrimitive(const G4Circle&){} void AddPrimitive(const G4Square&){} void AddPrimitive(const G4Polyhedron&){} void AddPrimitive(const G4Polymarker&){} - void AddPrimitive(const G4Scale&){} void ClearStore (); diff --git a/source/visualization/RayTracer/include/G4RayTracerX.hh b/source/visualization/RayTracer/include/G4RayTracerX.hh index 5dc1804ed8..aedc9806f1 100644 --- a/source/visualization/RayTracer/include/G4RayTracerX.hh +++ b/source/visualization/RayTracer/include/G4RayTracerX.hh @@ -28,8 +28,6 @@ // // John Allison 11th September 2003 -#if defined (G4VIS_BUILD_RAYTRACERX_DRIVER) || (G4VIS_USE_RAYTRACERX) - #ifndef G4RAYTRACERX_HH #define G4RAYTRACERX_HH @@ -51,4 +49,3 @@ class G4RayTracerX : public G4VGraphicsSystem }; #endif -#endif diff --git a/source/visualization/RayTracer/include/G4RayTracerXViewer.hh b/source/visualization/RayTracer/include/G4RayTracerXViewer.hh index b83cf031bf..fdfad8515b 100644 --- a/source/visualization/RayTracer/include/G4RayTracerXViewer.hh +++ b/source/visualization/RayTracer/include/G4RayTracerXViewer.hh @@ -27,8 +27,6 @@ // John Allison 17th March 2000 -#ifdef G4VIS_BUILD_RAYTRACERX_DRIVER - #ifndef G4RAYTRACERXVIEWER_HH #define G4RAYTRACERXVIEWER_HH @@ -42,5 +40,3 @@ public: }; #endif - -#endif diff --git a/source/visualization/RayTracer/include/G4TheMTRayTracer.hh b/source/visualization/RayTracer/include/G4TheMTRayTracer.hh index 3582658ccf..53365184a4 100644 --- a/source/visualization/RayTracer/include/G4TheMTRayTracer.hh +++ b/source/visualization/RayTracer/include/G4TheMTRayTracer.hh @@ -88,6 +88,10 @@ class G4TheMTRayTracer : public G4TheRayTracer // here or if SetScanner is not invoked before Trace(), a default // G4RTSimpleScanner will be used. + static G4TheMTRayTracer* Instance(); + static G4TheMTRayTracer* Instance + (G4VFigureFileMaker* figMaker,G4VRTScanner* scanner); + public: virtual ~G4TheMTRayTracer(); diff --git a/source/visualization/RayTracer/include/G4TheRayTracer.hh b/source/visualization/RayTracer/include/G4TheRayTracer.hh index 1be5dce9f2..48cad2f5d9 100644 --- a/source/visualization/RayTracer/include/G4TheRayTracer.hh +++ b/source/visualization/RayTracer/include/G4TheRayTracer.hh @@ -122,9 +122,9 @@ class G4TheRayTracer protected: G4RayShooter * theRayShooter; - G4VFigureFileMaker * theFigMaker; + static G4VFigureFileMaker * theFigMaker; G4RTMessenger * theMessenger; - G4VRTScanner * theScanner; + static G4VRTScanner * theScanner; G4EventManager * theEventManager; diff --git a/source/visualization/RayTracer/sources.cmake b/source/visualization/RayTracer/sources.cmake index b8311260bd..7b9cfca04e 100644 --- a/source/visualization/RayTracer/sources.cmake +++ b/source/visualization/RayTracer/sources.cmake @@ -62,10 +62,6 @@ if(GEANT4_USE_RAYTRACER_X11) G4RayTracerXViewer.cc G4RTXScanner.cc) - # Add source properties and additional LINK_LIBRARIES here - # Must use G4VIS_BUILD_RAYTRACERX_DRIVER define - add_definitions(-DG4VIS_BUILD_RAYTRACERX_DRIVER) - # The X11 Libraries list(APPEND G4VIS_RAYTRACER_MODULE_LINK_LIBRARIES X11::SM X11::ICE X11::X11 X11::Xext X11::Xmu) endif() diff --git a/source/visualization/RayTracer/src/G4RTXScanner.cc b/source/visualization/RayTracer/src/G4RTXScanner.cc index 2000507226..b4b93ccdcf 100644 --- a/source/visualization/RayTracer/src/G4RTXScanner.cc +++ b/source/visualization/RayTracer/src/G4RTXScanner.cc @@ -27,8 +27,6 @@ // // -#ifdef G4VIS_BUILD_RAYTRACERX_DRIVER - #include "G4RTXScanner.hh" #include "G4TheRayTracer.hh" @@ -236,5 +234,3 @@ void G4RTXScanner::Draw XFlush(display); } - -#endif diff --git a/source/visualization/RayTracer/src/G4RayTracer.cc b/source/visualization/RayTracer/src/G4RayTracer.cc index 92e49e394f..aafdd31ab9 100644 --- a/source/visualization/RayTracer/src/G4RayTracer.cc +++ b/source/visualization/RayTracer/src/G4RayTracer.cc @@ -29,29 +29,18 @@ #include "G4RayTracerFeatures.hh" #include "G4RayTracerSceneHandler.hh" #include "G4RayTracerViewer.hh" -#ifdef G4MULTITHREADED -#include "G4TheMTRayTracer.hh" -#else -#include "G4TheRayTracer.hh" -#endif G4RayTracer::G4RayTracer(): G4VGraphicsSystem("RayTracer", "RayTracer", RAYTRACER_FEATURES, G4VGraphicsSystem::threeD) +, theRayTracer(nullptr) { -#ifdef G4MULTITHREADED - theRayTracer = new G4TheMTRayTracer; // Establish default ray tracer. -#else - theRayTracer = new G4TheRayTracer; // Establish default ray tracer. -#endif } G4RayTracer::~G4RayTracer() -{ - delete theRayTracer; -} +{} G4VSceneHandler* G4RayTracer::CreateSceneHandler (const G4String& name) { G4VSceneHandler* pScene = new G4RayTracerSceneHandler (*this, name); diff --git a/source/visualization/RayTracer/src/G4RayTracerViewer.cc b/source/visualization/RayTracer/src/G4RayTracerViewer.cc index 3516321183..da7fdb27fb 100644 --- a/source/visualization/RayTracer/src/G4RayTracerViewer.cc +++ b/source/visualization/RayTracer/src/G4RayTracerViewer.cc @@ -35,7 +35,13 @@ #include "G4VSceneHandler.hh" #include "G4Scene.hh" +#ifdef G4MULTITHREADED +#include "G4TheMTRayTracer.hh" +#else #include "G4TheRayTracer.hh" +#endif +#include "G4RTJpegMaker.hh" +#include "G4RTSimpleScanner.hh" #include "G4UImanager.hh" G4RayTracerViewer::G4RayTracerViewer @@ -44,7 +50,12 @@ G4RayTracerViewer::G4RayTracerViewer G4TheRayTracer* aTracer) : G4VViewer(sceneHandler, sceneHandler.IncrementViewCount(), name) , fFileCount(0) -, theTracer(aTracer) +#ifdef G4MULTITHREADED +#include "G4TheMTRayTracer.hh" +, theTracer(aTracer? aTracer: G4TheMTRayTracer::Instance(new G4RTJpegMaker, new G4RTSimpleScanner)) +#else +, theTracer(aTracer? aTracer: new G4TheRayTracer(new G4RTJpegMaker, new G4RTSimpleScanner)) +#endif { if (!theTracer) { G4cerr << "G4RayTracerViewer::Initialise: No tracer" << G4endl; diff --git a/source/visualization/RayTracer/src/G4RayTracerX.cc b/source/visualization/RayTracer/src/G4RayTracerX.cc index 9f8d129421..693b1eed56 100644 --- a/source/visualization/RayTracer/src/G4RayTracerX.cc +++ b/source/visualization/RayTracer/src/G4RayTracerX.cc @@ -28,8 +28,6 @@ // // -#ifdef G4VIS_BUILD_RAYTRACERX_DRIVER - #include "G4RayTracerX.hh" #include "G4RayTracerFeatures.hh" #include "G4RayTracerSceneHandler.hh" @@ -71,5 +69,3 @@ G4VViewer* G4RayTracerX::CreateViewer (G4VSceneHandler& sceneHandler, } return pViewer; } - -#endif diff --git a/source/visualization/RayTracer/src/G4RayTracerXViewer.cc b/source/visualization/RayTracer/src/G4RayTracerXViewer.cc index e1f27b1c00..e2a884a904 100644 --- a/source/visualization/RayTracer/src/G4RayTracerXViewer.cc +++ b/source/visualization/RayTracer/src/G4RayTracerXViewer.cc @@ -25,8 +25,6 @@ // // -#ifdef G4VIS_BUILD_RAYTRACERX_DRIVER - #include "G4RayTracerXViewer.hh" #include "G4VSceneHandler.hh" @@ -51,6 +49,9 @@ void G4RayTracerXViewer::Initialise() { G4RayTracerViewer::Initialise(); + fVP.SetAutoRefresh(true); + fDefaultVP.SetAutoRefresh(true); + // Set up X Window... G4RTXScanner* theXScanner = (G4RTXScanner*)theTracer->GetScanner(); if (!theXScanner->GetXWindow(fName,fVP)) { @@ -59,5 +60,3 @@ void G4RayTracerXViewer::Initialise() { return; } } - -#endif diff --git a/source/visualization/RayTracer/src/G4TheMTRayTracer.cc b/source/visualization/RayTracer/src/G4TheMTRayTracer.cc index 8f070587c4..cbbd5467dd 100644 --- a/source/visualization/RayTracer/src/G4TheMTRayTracer.cc +++ b/source/visualization/RayTracer/src/G4TheMTRayTracer.cc @@ -63,6 +63,23 @@ G4TheMTRayTracer::G4TheMTRayTracer(G4VFigureFileMaker* figMaker, theRTRunAction = 0; } +G4TheMTRayTracer* G4TheMTRayTracer::Instance() +{ + if (theInstance) return theInstance; + else return new G4TheMTRayTracer; +} + +G4TheMTRayTracer* G4TheMTRayTracer::Instance +(G4VFigureFileMaker* figMaker,G4VRTScanner* scanner) +{ + if (theInstance) { + theFigMaker=figMaker; + theScanner=scanner; + return theInstance; + } + else return new G4TheMTRayTracer(figMaker,scanner); +} + G4TheMTRayTracer::~G4TheMTRayTracer() { if(theRTWorkerInitialization) diff --git a/source/visualization/RayTracer/src/G4TheRayTracer.cc b/source/visualization/RayTracer/src/G4TheRayTracer.cc index 2c54802636..389a4bbc28 100644 --- a/source/visualization/RayTracer/src/G4TheRayTracer.cc +++ b/source/visualization/RayTracer/src/G4TheRayTracer.cc @@ -54,6 +54,9 @@ #include "G4ProductionCutsTable.hh" #include "G4VVisManager.hh" +G4VFigureFileMaker * G4TheRayTracer::theFigMaker = 0; +G4VRTScanner * G4TheRayTracer::theScanner = 0; + G4TheRayTracer::G4TheRayTracer(G4VFigureFileMaker* figMaker, G4VRTScanner* scanner) { diff --git a/source/visualization/ToolsSG/GNUmakefile b/source/visualization/ToolsSG/GNUmakefile index 268a59e7ab..fae3dff39a 100644 --- a/source/visualization/ToolsSG/GNUmakefile +++ b/source/visualization/ToolsSG/GNUmakefile @@ -28,20 +28,24 @@ CPPFLAGS += -I$(G4BASE)/geometry/solids/specific/include CPPFLAGS += -I$(G4BASE)/tracking/include CPPFLAGS += -I$(G4BASE)/digits_hits/hits/include +# Locally adjust source list before including common.gmk +sources := src/G4ToolsSGSceneHandler.cc + ifdef G4VIS_BUILD_TOOLSSG_X11_GLES_DRIVER - CPPFLAGS += -DG4VIS_BUILD_TOOLSSG_X11_GLES_DRIVER + sources += src/G4ToolsSGX11GLES.cc endif ifdef G4VIS_BUILD_TOOLSSG_WINDOWS_GLES_DRIVER - CPPFLAGS += -DG4VIS_BUILD_TOOLSSG_WINDOWS_GLES_DRIVER + sources += src/G4ToolsSGWindowsGLES.cc endif ifdef G4VIS_BUILD_TOOLSSG_XT_GLES_DRIVER - CPPFLAGS += -DG4VIS_BUILD_TOOLSSG_XT_GLES_DRIVER + sources += src/G4ToolsSGXtGLES.cc endif ifdef G4VIS_BUILD_TOOLSSG_QT_GLES_DRIVER - CPPFLAGS += -DG4VIS_BUILD_TOOLSSG_QT_GLES_DRIVER + sources += src/G4ToolsSGQtGLES.cc src/G4ToolsSGQtViewer.cc endif +include $(G4INSTALL)/config/moc.gmk include $(G4INSTALL)/config/common.gmk diff --git a/source/visualization/ToolsSG/History b/source/visualization/ToolsSG/History index dcc99e6c20..49c837a006 100644 --- a/source/visualization/ToolsSG/History +++ b/source/visualization/ToolsSG/History @@ -20,7 +20,107 @@ History file for visualization ToolsSG category - a vis driver based on g4tools scene graph logic. See geant4/source/analysis/g4tools/tools.license ------------------------------------------------ -07 June 2021 John Allison (vis_toolsg-V10-07-05) +13 November 2021 - John Allison (vis_toolssg-V10-07-16) +- G4ToolsSGSceneHandler.cc: Bug fix: + - In AddPrimitive, use preferred GetColour(a_polyline) instead of GetColour(). + - Similarly for a_polymarker and a_polyhedron. + - If the vis attributes pointer is not up to date, GetColour() picks up + the colour of the previous object! + - GetColour() will probably be deprecated in future! It's use is + misleading - see visman-V10-07-27. + +12 November 2021 - Ben Morgan (vis_toolssg-V10-07-15) +- Retire G4VIS_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +8 November 2021 - Ben Morgan (vis_toolssg-V10-07-14) +- Retire G4UI/G4INTY_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +05 November 2021 Guy Barrand (vis_toolssg-V10-07-13) +- G4ToolsSGSceneHandler: SetPlotterHistograms(): revisit + in order that, from an int histogram hid given by a user (and + passed to a G4Plotter), the address of the tools::histo, managed by G4/analysis, + is retrieved by using a /analysis/h/get command so that the + histo is copied in a tools::sg::plottable managed by a tools::sg::plotter. + This way of doing secures the relationship tools::sg::plotter, managed by G4/vis + relative to the histo, managed by G4/analysis. + This overall way of doing permits to have the commands: + /vis/plotter/add/h1,h2 + managed back in G4/vis, and then avoids to instrument + G4/examples and user code with the templated G4VisPlotMessenger + which is no more needed. + +03 November 2021 Guy Barrand (vis_toolssg-V10-07-12) +- G4ToolsSGSceneHandler: changes to deal with the changes + in management/G4PlotterManager that handles a local list of styles. + +25 October 2021 Guy Barrand (vis_toolssg-V10-07-11) +- src/G4ToolsSGQtViewer.cc, sources.cmake: Linux: it permits to have cmake doing the + "mocing" of G4ToolsSGQtViewer.hh. (Strangely not needed on my mac). +- include/G4ToolsSGQtViewer.hh: handle a Qt "destroy" signal/slot to properly + delete the G4ToolsSGViewer from the G4ToolsSGSceneHandler in case a user + delete the viewer QWidget in the G4UIQt tab container widget. +- include/G4ToolsSGViewer.hh: FinishView: handle the update of plotters + (tools::sg::plots nodes) if any in the scene graph. Done by using + fSGSceneHandler.TouchPlotters() +- remove G4ToolsSGExport.hh. Now done by using tools/sg/write_paper. +- G4ToolsSGSceneHandler.hh,.cc: have a /vis/tsg/plotter/printParameters. To + print available style parameters of the tools::sg::plotter node. +- G4ToolsSGSceneHandler.hh,.cc: plotting logic. Mainly implement AddPrimitive(G4Plotter) + by handling a tools::sg::plots node in the scene graph. Have code to attach histograms + and setup styles + +22 October 2021 Guy Barrand (vis_toolssg-V10-07-10) +- ToolsSG/History: change vis_toolsg to vis_toolssg in tags. +- include/G4ToolsSGQtViewer.hh: remove ShowView, FinishView: the below modification + permits to rely on the parent ShowView, FinishView. (No more need to have code + to handle the "in tab" case). +- include/G4ToolsSGQtViewer.hh/Initialise: enforce a Qt show() to be able + to retreive the true QGLWidget size at startup. +- include/G4ToolsSGQtViewer.hh: __APPLE__: implement a SetView to enforce a + fVP.SetGlobalMarkerScale(2); + so that 2D text have a similar size than other drivers and platforms. +- include/G4ToolsSGViewer.hh: handle a /vis/tsg/export command to + produce "paper" output files. +- include/G4ToolsSGViewer.hh: ShowView calls FinishView. +- include/G4ToolsSGViewer.hh: handle a scene graph so that camera and lighting nodes + belong to the viewer. +- G4ToolsSGSceneHandler.cc: AddPrimitives : use G4VSceneHandler::GetColour(), GetTextColour() + instead of the viewer vis attributs ones. +- G4ToolsSGSceneHandler.hh,.cc: revisit the scene graph logic so that camera and lighting + nodes be handled by G4ToolsSGViewer. + +13 October 2021 Guy Barrand (vis_toolssg-V10-07-09) +- Following g4tools-V10-07-07. +- for 2D text with freetype; have a mechanism to handle embedded fonts. + Have the font lato_regular.ttf embedded in the C++ file: + tools/sg/font/lato_regular_ttf + The embedding of a .ttf file is done by using 'xxd -i' on a UNIX. + With this in place, usage of the env variable TOOLS_FONT_PATH is no more + needed for 2D freetype text to find the lato_regular font at run time. +- handle G4/vis lightening. Use a tools::sg::torche. +- for 2D: handle mouse resize of the viewer (Qt,Xt,X11,Windows). +- handle transparency. Cowork with modifs in: + tools/sg[GL_viewer,atb_vertices,render_action] +- G4ToolsSGViewer, G4ToolsSGSceneHandler: revisit the scene graph organization + to handle 2D text +- handle 2D graphics. Cowork with modifs in: + tools/sg/[text_freetype_marker,text_hershey_marker] to avoid text squashing. + +12 October 2021 Ben Morgan (vis_toolssg-V10-07-08) +- Xt backend does not depend on Xm + +01 September 2021 John Allison (vis_toolssg-V10-07-07) +- Store default background in view parameters. + +30 June 2021 John Allison (vis_toolssg-V10-07-06) +- Requires greps-V10-07-09, modeling-V10-07-11 and visman-V10-07-11. +- Revise vis models. See visualization/modeling/History for more details. +- Consequent changes: + o AddPrimitive(const G4Scale&) has been removed from all scene handlers. + +07 June 2021 John Allison (vis_toolssg-V10-07-05) - Requires greps-V10-07-07 (new method AddCompound (const G4Mesh&)). - Requires modeling-V10-07-09 (new class G4Mesh). - Requires visman-V10-07-10 (new default method and new commands). @@ -30,24 +130,24 @@ g4tools scene graph logic. See geant4/source/analysis/g4tools/tools.license 28 May 2021 Ben Morgan (vis_toolssg-V10-07-04) - Migrate to modular CMake build -27 May 2021 John Allison (vis_toolsg-V10-07-03) +27 May 2021 John Allison (vis_toolssg-V10-07-03) - AddPrimitive(const G4Polyhedron&): o Minor improvement to error message in the case of unexpected number of edges. -23 May 2021 John Allison (vis_toolsg-V10-07-02) +23 May 2021 John Allison (vis_toolssg-V10-07-02) - Corrections to cmake files for freetype fonts: o Move freetype setup from CMakeLists.txt to sources.cmake. - G4ToolsSGSceneHandler.cc: Remove redundant comments. -14 May 2021 Guy Barrand (vis_toolsg-V10-07-01) +14 May 2021 Guy Barrand (vis_toolssg-V10-07-01) - cosmetic/style improvements: o 0 => nullptr. o have '= default' for some destructors. o G4ToolsSGNode.hh : have public cpstor and operator=. o G4ToolsSGViewer.hh : rm #ifdef G4TOOLSSG_DEBUG code. -05 May 2021 Guy Barrand (vis_toolsg-V10-07-00) +05 May 2021 Guy Barrand (vis_toolssg-V10-07-00) - Requires cmake-V10-07-15, visman-V10-07-06 and externals-V10-07-02. - First committal of a tools_sg driver (Guy Barrand). o Four (mutually exclusive) options: diff --git a/source/visualization/ToolsSG/include/G4ToolsSGNode.hh b/source/visualization/ToolsSG/include/G4ToolsSGNode.hh index b23c3e632c..aa8abd1743 100644 --- a/source/visualization/ToolsSG/include/G4ToolsSGNode.hh +++ b/source/visualization/ToolsSG/include/G4ToolsSGNode.hh @@ -25,8 +25,6 @@ // // John Allison, 6th October 2020 -#if defined (G4VIS_BUILD_TOOLSSG_DRIVER) || defined (G4VIS_USE_TOOLSSG) - #ifndef G4TOOLSSGNODE_HH #define G4TOOLSSGNODE_HH @@ -56,5 +54,3 @@ private: }; #endif - -#endif diff --git a/source/visualization/ToolsSG/include/G4ToolsSGQtGLES.hh b/source/visualization/ToolsSG/include/G4ToolsSGQtGLES.hh index e14453495c..3525d31583 100644 --- a/source/visualization/ToolsSG/include/G4ToolsSGQtGLES.hh +++ b/source/visualization/ToolsSG/include/G4ToolsSGQtGLES.hh @@ -25,8 +25,6 @@ // // Guy Barrand 12th March 2021 -#if defined (G4VIS_BUILD_TOOLSSG_QT_GLES_DRIVER) || defined (G4VIS_USE_TOOLSSG_QT_GLES) - #ifndef G4TOOLSSGQTGLES_HH #define G4TOOLSSGQTGLES_HH @@ -53,5 +51,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/ToolsSG/include/G4ToolsSGQtViewer.hh b/source/visualization/ToolsSG/include/G4ToolsSGQtViewer.hh index 9f8f9fb686..729508a3ec 100644 --- a/source/visualization/ToolsSG/include/G4ToolsSGQtViewer.hh +++ b/source/visualization/ToolsSG/include/G4ToolsSGQtViewer.hh @@ -25,36 +25,56 @@ // // Guy Barrand 8th April 2021 -#if defined (G4VIS_BUILD_TOOLSSG_QT_GLES_DRIVER) || defined (G4VIS_USE_TOOLSSG_QT_GLES) - #ifndef G4TOOLSSGQTVIEWER_HH #define G4TOOLSSGQTVIEWER_HH #include "G4ToolsSGViewer.hh" -#include - #include "G4Qt.hh" #include "G4UIQt.hh" #include "G4UImanager.hh" +#include + +#include + +class G4ToolsSGQtDestroyCallback : public QObject { + Q_OBJECT +public: + G4ToolsSGQtDestroyCallback(G4VViewer* a_viewer):fViewer(a_viewer) {} + virtual ~G4ToolsSGQtDestroyCallback() {} +private: + G4ToolsSGQtDestroyCallback(const G4ToolsSGQtDestroyCallback&); + G4ToolsSGQtDestroyCallback& operator=(const G4ToolsSGQtDestroyCallback&); +public slots: + void execute(){ + //::printf("debug : G4ToolsSGQtDestroyCallback::execute\n"); + delete fViewer; + } +private: + G4VViewer* fViewer; +}; + class G4ToolsSGQtViewer : public G4ToolsSGViewer { typedef G4ToolsSGViewer parent; public: G4ToolsSGQtViewer(tools::Qt::session& a_session,G4ToolsSGSceneHandler& a_scene_handler, const G4String& a_name) :parent(a_session,a_scene_handler,a_name) - ,fInTab(false) ,fSGQWidget(nullptr) - {} - virtual ~G4ToolsSGQtViewer() = default; + ,fDestroyCallback(0) + { + fDestroyCallback = new G4ToolsSGQtDestroyCallback(this); + } + virtual ~G4ToolsSGQtViewer() { + delete fDestroyCallback; //it will remove the below signal/slot connection. + } protected: - G4ToolsSGQtViewer(const G4ToolsSGQtViewer& a_from):parent(a_from),fInTab(false){} + G4ToolsSGQtViewer(const G4ToolsSGQtViewer& a_from):parent(a_from){} G4ToolsSGQtViewer& operator=(const G4ToolsSGQtViewer&) {return *this;} public: virtual void Initialise() { if(fSGQWidget) return; //done. parent::Initialise(); - fInTab = false; if(!fSGViewer) { G4cerr << "G4ToolsSGQtViewer::Initialise: ERROR: G4ToolsSGQtViewer has no tools::Qt::sg_viewer." << G4endl; return; @@ -64,45 +84,48 @@ public: G4cerr << "G4ToolsSGQtViewer::Initialise: ERROR: tools::Qt::sg_viewer has no QWidget shell." << G4endl; return; } - + {G4UImanager* ui = G4UImanager::GetUIpointer(); G4UIsession* session = ui->GetG4UIWindow(); G4UIQt* uiQt = session? dynamic_cast(session) :nullptr; if(uiQt) { G4Qt* interactorManager = G4Qt::getInstance (); if (!interactorManager->IsExternalApp()) { - uiQt->AddTabWidget(fSGQWidget,QString(GetName())); - fInTab = true; fSGViewer->set_own_shell(false); + uiQt->AddTabWidget(fSGQWidget,QString(GetName())); + QObject::connect(fSGQWidget,SIGNAL(destroyed()),fDestroyCallback,SLOT(execute())); + + QMainWindow* main_window = uiQt->GetMainWindow(); + if(main_window) { + main_window->show(); + interactorManager->FlushAndWaitExecution(); + } } }} fSGViewer->enable_keyboard_focus(); } - virtual void ShowView() { - if(fInTab) { - if(!fSGViewer) return; - fSGViewer->win_render(); - fSGSession.sync(); - } else { - parent::ShowView(); - } - } - - virtual void FinishView() { - if(fInTab) { - if(!fSGViewer) return; - fSGViewer->win_render(); - fSGSession.sync(); - } else { - parent::FinishView(); + + virtual void SetView() { +#ifdef __APPLE__ + if(fSGQWidget && fSGViewer) { + if( (2*fSGQWidget->width() == int(fSGViewer->width())) && + (2*fSGQWidget->height() == int(fSGViewer->height())) ){ + // With Qt/Cocoa, the received size in + // tools::sg::glarea::resizeGL is twice the QWidget::[width(),height()]! + // In general it does not pose problem, except when rendering 2D texts. + // In order to have similar sizes than other platforms, we have to double + // their pixel heights. + fVP.SetGlobalMarkerScale(2); + } } +#endif + parent::SetView(); } + protected: - bool fInTab; QWidget* fSGQWidget; + G4ToolsSGQtDestroyCallback* fDestroyCallback; }; #endif - -#endif diff --git a/source/visualization/ToolsSG/include/G4ToolsSGSceneHandler.hh b/source/visualization/ToolsSG/include/G4ToolsSGSceneHandler.hh index 17696c0893..31a9fdca40 100644 --- a/source/visualization/ToolsSG/include/G4ToolsSGSceneHandler.hh +++ b/source/visualization/ToolsSG/include/G4ToolsSGSceneHandler.hh @@ -25,66 +25,91 @@ // // John Allison 6th October 2020 -#if defined (G4VIS_BUILD_TOOLSSG_DRIVER) || defined (G4VIS_USE_TOOLSSG) - #ifndef G4TOOLSSGSCENEHANDLER_HH #define G4TOOLSSGSCENEHANDLER_HH #include "G4VSceneHandler.hh" +#include "G4VVisCommand.hh" + #include -namespace tools {namespace sg {class separator;}} +#include + +namespace tools {namespace sg {class base_freetype;}} +namespace tools {namespace sg {class plots;}} + class G4ToolsSGNode; class G4ToolsSGSceneHandler: public G4VSceneHandler { typedef G4VSceneHandler parent; public: - G4ToolsSGSceneHandler(G4VGraphicsSystem& system,const G4String& name); - virtual ~G4ToolsSGSceneHandler(); -protected: - //G4ToolsSGSceneHandler(const G4ToolsSGSceneHandler& a_from):parent(a_from){} - G4ToolsSGSceneHandler& operator=(const G4ToolsSGSceneHandler&){return *this;} -public: - - void PreAddSolid(const G4Transform3D& objectTransformation, - const G4VisAttributes&); - void PostAddSolid(); - - void BeginPrimitives2D(const G4Transform3D& objectTransformation); - void EndPrimitives2D(); - - void BeginPrimitives(const G4Transform3D& objectTransformation); - void EndPrimitives(); - virtual void AddPrimitive(const G4Polyline&); - virtual void AddPrimitive(const G4Scale&); virtual void AddPrimitive(const G4Text&); virtual void AddPrimitive(const G4Circle&); virtual void AddPrimitive(const G4Square&); virtual void AddPrimitive(const G4Polymarker&); virtual void AddPrimitive(const G4Polyhedron&); - - void ClearStore (); - void ClearTransientStore (); + virtual void AddPrimitive(const G4Plotter&); -public: - tools::sg::separator* ToolsSGScene() {return fpToolsSGScene;} + virtual void ClearStore (); + virtual void ClearTransientStore (); + + G4ToolsSGSceneHandler(G4VGraphicsSystem& system,const G4String& name); + virtual ~G4ToolsSGSceneHandler(); + + tools::sg::separator& GetTransient2DObjects() {return fpTransient2DObjects;} + tools::sg::separator& GetPersistent2DObjects() {return fpPersistent2DObjects;} + tools::sg::separator& GetTransient3DObjects() {return fpTransient3DObjects;} + tools::sg::separator& GetPersistent3DObjects() {return fpPersistent3DObjects;} + + void TouchPlotters(tools::sg::node&); + +protected: + G4ToolsSGSceneHandler(const G4ToolsSGSceneHandler&); + G4ToolsSGSceneHandler& operator=(const G4ToolsSGSceneHandler&){return *this;} + protected: - + void CreateSG(); void EstablishBaseNodes(); - tools::sg::separator* GetOrCreateNode(); // For next solid or primitive - static G4int fSceneIdCount; // Counter for Qt3D scene handlers. + void SetPlotterHistograms(tools::sg::plots&); + + static G4int fSceneIdCount; + + tools::sg::separator fpTransient2DObjects; + tools::sg::separator fpPersistent2DObjects; + + tools::sg::separator fpTransient3DObjects; + tools::sg::separator fpPersistent3DObjects; - tools::sg::separator* fpToolsSGScene; - tools::sg::separator* fpTransientObjects; - tools::sg::separator* fpPersistentObjects; std::vector fpPhysicalVolumeObjects; // Multiple worlds + tools::sg::base_freetype* fFreetypeNode; + + using Region_h1 = std::pair; + using Region_h2 = std::pair; + std::vector fRegionH1s; + std::vector fRegionH2s; + + class Messenger: public G4VVisCommand { + public: + static void Create() {static Messenger s_messenger;} + virtual void SetNewValue(G4UIcommand*,G4String); + private: + Messenger() { + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + print_plotter_params = new G4UIcommand("/vis/tsg/plotter/printParameters", this); + print_plotter_params->SetGuidance("Print available tools::sg::plotter parameters."); + } + virtual ~Messenger() { + delete print_plotter_params; + } + G4UIcommand* print_plotter_params; + }; + }; #endif - -#endif diff --git a/source/visualization/ToolsSG/include/G4ToolsSGViewer.hh b/source/visualization/ToolsSG/include/G4ToolsSGViewer.hh index 15b9621c97..d0f18aec71 100644 --- a/source/visualization/ToolsSG/include/G4ToolsSGViewer.hh +++ b/source/visualization/ToolsSG/include/G4ToolsSGViewer.hh @@ -25,8 +25,6 @@ // // John Allison 6th October 2019 -#if defined (G4VIS_BUILD_TOOLSSG_DRIVER) || defined (G4VIS_USE_TOOLSSG) - #ifndef G4TOOLSSGVIEWER_HH #define G4TOOLSSGVIEWER_HH @@ -34,16 +32,20 @@ #include "G4ToolsSGSceneHandler.hh" #include "G4Scene.hh" +#include "G4VVisCommand.hh" #include #include -#include #include #include +#include #include #include #include +#include +#include + template class G4ToolsSGViewer : public G4VViewer, tools::sg::device_interactor { typedef G4VViewer parent; @@ -125,12 +127,16 @@ public: ,fMousePressedX(0) ,fMousePressedY(0) { - //::printf("debug : G4ToolsSGViewer::G4ToolsSGViewer.\n"); + //::printf("debug : G4ToolsSGViewer::G4ToolsSGViewer: %lu, %s\n",this,a_name.c_str()); + Messenger::Create(); } virtual ~G4ToolsSGViewer() { + //::printf("debug : G4ToolsSGViewer::~G4ToolsSGViewer: %lu\n",this); + //WARNING : nodes may refer f_gl2ps_mgr, f_zb_mgr (to handle gstos (for GPU) or textures), then + // we have to delete them first. + fSGViewer->sg().clear(); delete fSGViewer; - //::printf("debug : G4ToolsSGViewer::~G4ToolsSGViewer.\n"); } protected: G4ToolsSGViewer(const G4ToolsSGViewer& a_from) @@ -166,8 +172,6 @@ public: G4cerr << "G4ToolsSGViewer::Initialise : SG_VIEWER::has_window() failed." << G4endl; return; } - - fSGViewer->set_clear_color(0.3,0.3,0.3,1); fSGViewer->set_device_interactor(this); } @@ -178,7 +182,7 @@ public: G4cerr << "G4ToolsSGViewer::SetView : no G4Scene.." << G4endl; return; } - + ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// @@ -206,16 +210,27 @@ public: G4cerr << "G4ToolsSGViewer::SetView : null size viewer area." << G4endl; return; } - //::printf("debug : GB : SetView : 1-001 : %g %g %g : %g %g %g : h %g : %g %g\n", - // targetPoint.x(),targetPoint.y(),targetPoint.z(), - // cameraPosition.x(),cameraPosition.y(),cameraPosition.z(),top-bottom,pnear,pfar); - + + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + /* + G4cout << "debug : 0002 : radius " << radius << std::endl; + G4cout << "debug : cameraDistance : " << cameraDistance << std::endl; + G4cout << "debug : fieldHalfAngle : " << fVP.GetFieldHalfAngle() << std::endl; + G4cout << "debug : zoomFactor : " << fVP.GetZoomFactor() << std::endl; + G4cout << "debug : up : " << up.x() << " " << up.y() << " " << up.z() << std::endl; + G4cout << "debug : targetPoint : " << targetPoint.x() << " " << targetPoint.y() << " " << targetPoint.z() << std::endl; + G4cout << "debug : cameraPosition : " << cameraPosition.x() << " " << cameraPosition.y() << " " << cameraPosition.z() << std::endl; + G4cout << "debug : camera : znear " << pnear << ", zfar " << pfar << std::endl; + */ ////////////////////////////////////////////////////////// /// create scene graph /////////////////////////////////// ////////////////////////////////////////////////////////// // Set projection, then create the tools::sg camera node : tools::sg::base_camera* _camera = nullptr; if (fVP.GetFieldHalfAngle() <= 0.) { + //G4cout << "debug : camera : ortho : top " << top << " bottom " << bottom << " top-bottom " << top-bottom << std::endl; if((top-bottom)<=0) { fSGViewer->set_clear_color(0.3,0.3,0.3,1); G4cerr << "G4ToolsSGViewer::SetView : for ortho camera, (top-bottom)<=0." << G4endl; @@ -225,6 +240,7 @@ public: ortho_camera->height.value(float(top-bottom)); _camera = ortho_camera; } else { + //G4cout << "debug : camera : perspec : heightAngle " << float(2*fVP.GetFieldHalfAngle()) << std::endl; tools::sg::perspective* perspective_camera = new tools::sg::perspective; perspective_camera->height_angle.value(float(2*fVP.GetFieldHalfAngle())); _camera = perspective_camera; @@ -238,24 +254,15 @@ public: _camera->zfar.value(float(pfar)); _camera->look_at(dir,tools::vec3f(up.x(),up.y(),up.z())); //same logic as in G4OpenInventorViewer. - - tools::sg::separator* sep = new tools::sg::separator; - sep->add(_camera); - {tools::sg::head_light* light = new tools::sg::head_light; - //light->direction = tools::vec3f(1,-1,-10); - light->direction = tools::vec3f(0,0,-1); - light->on = true; - sep->add(light);} + /* + const G4Vector3D& lightDirection = fVP.GetLightpointDirection(); + G4cout << "debug : lightDirection : " << lightDirection.x() << " " << lightDirection.y() << " " << lightDirection.z() << std::endl; + const G4Vector3D& actualLightDirection = fVP.GetActualLightpointDirection(); + G4cout << "debug : actualLightDirection : " << actualLightDirection.x() << " " << actualLightDirection.y() << " " << actualLightDirection.z() << std::endl; + */ - {tools::sg::blend* blend = new tools::sg::blend; - blend->on = true; //to handle transparency. - sep->add(blend);} - - sep->add(new tools::sg::noderef(*fSGSceneHandler.ToolsSGScene())); - - fSGViewer->sg().clear(); - fSGViewer->sg().add(sep); //give sep ownership to the viewer. + CreateSG(_camera,fVP.GetActualLightpointDirection()); {G4Color background = fVP.GetBackgroundColour (); fSGViewer->set_clear_color(float(background.GetRed()),float(background.GetBlue()),float(background.GetBlue()),1);} @@ -275,21 +282,17 @@ public: FinishView (); // Flush streams and/or swap buffers. } - virtual void ShowView() { - if(!fSGViewer) return; - fSGViewer->show(); - fSGViewer->win_render(); - fSGSession.sync(); - } + virtual void ShowView() {FinishView();} virtual void FinishView() { - if(!fSGViewer) return; - fSGViewer->show(); - fSGViewer->win_render(); - fSGSession.sync(); + if(fSGViewer) { + fSGSceneHandler.TouchPlotters(fSGViewer->sg()); + fSGViewer->show(); + fSGViewer->win_render(); + fSGSession.sync(); + } } - #ifdef G4MULTITHREADED virtual void SwitchToVisSubThread() {} @@ -380,6 +383,109 @@ protected: // void mouseReleaseEvent (MouseEvent*); // void wheelEvent (WheelEvent*); +protected: + void CreateSG(tools::sg::base_camera* a_camera,const G4Vector3D& a_light_dir) { + tools::sg::group& _parent = fSGViewer->sg(); + _parent.clear(); + + /////////////////////////////////////////////////// + /// 2D scene graph: /////////////////////////////// + /////////////////////////////////////////////////// + tools::sg::separator* scene_2D = new tools::sg::separator; + _parent.add(scene_2D); + scene_2D->add(new tools::sg::noderef(fSGSceneHandler.GetTransient2DObjects())); + scene_2D->add(new tools::sg::noderef(fSGSceneHandler.GetPersistent2DObjects())); + + /////////////////////////////////////////////////// + /// 3D scene graph: /////////////////////////////// + /////////////////////////////////////////////////// + tools::sg::separator* scene_3D = new tools::sg::separator; + _parent.add(scene_3D); + + scene_3D->add(a_camera); + + {tools::sg::torche* light = new tools::sg::torche; + light->on = true; + light->direction = tools::vec3f(-a_light_dir.x(),-a_light_dir.y(),-a_light_dir.z()); + scene_3D->add(light);} + + {tools::sg::blend* blend = new tools::sg::blend; + blend->on = true; //to handle transparency. + scene_3D->add(blend);} + + scene_3D->add(new tools::sg::noderef(fSGSceneHandler.GetTransient3DObjects())); + scene_3D->add(new tools::sg::noderef(fSGSceneHandler.GetPersistent3DObjects())); + } + + void Export(const G4String& a_format,const G4String& a_file) { + if(!fSGViewer) return; + const G4Colour& back_color = fVP.GetBackgroundColour(); + if(!write_paper(G4cout,f_gl2ps_mgr,f_zb_mgr,0,0, + float(back_color.GetRed()),float(back_color.GetGreen()),float(back_color.GetBlue()),float(back_color.GetAlpha()), + fSGViewer->sg(), + fSGViewer->width(),fSGViewer->height(),a_file,a_format)) { + G4cout << "G4ToolsSGViewer::Export: write_paper() failed." << G4endl; + return; + } + } + +protected: + class Messenger: public G4VVisCommand { + public: + static void Create() {static Messenger s_messenger;} + private: + Messenger() { + G4UIparameter* parameter; + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + write_scene = new G4UIcommand("/vis/tsg/export", this); + write_scene->SetGuidance("Write the content of the current viewer in a file at various formats."); + write_scene->SetGuidance("Default file is out.eps and default format is gl2ps_eps."); + write_scene->SetGuidance("Available formats are:"); + write_scene->SetGuidance("- gl2ps_eps: gl2ps producing eps"); + write_scene->SetGuidance("- gl2ps_ps: gl2ps producing ps"); + write_scene->SetGuidance("- gl2ps_pdf: gl2ps producing pdf"); + write_scene->SetGuidance("- gl2ps_svg: gl2ps producing svg"); + write_scene->SetGuidance("- gl2ps_tex: gl2ps producing tex"); + write_scene->SetGuidance("- gl2ps_pgf: gl2ps producing pgf"); + write_scene->SetGuidance("- zb_ps: tools::sg offscreen zbuffer put in a PostScript file."); + + parameter = new G4UIparameter("format",'s',true); + parameter->SetDefaultValue("gl2ps_eps"); + write_scene->SetParameter (parameter); + + parameter = new G4UIparameter("file",'s',true); + parameter->SetDefaultValue("out.eps"); + write_scene->SetParameter (parameter); + } + virtual ~Messenger() { + delete write_scene; + } + public: + virtual void SetNewValue(G4UIcommand* a_cmd,G4String a_value) { + G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity(); + G4VViewer* viewer = fpVisManager -> GetCurrentViewer (); + if (!viewer) { + if (verbosity >= G4VisManager::errors) G4cerr << "ERROR: No current viewer." << G4endl; + return; + } + G4ToolsSGViewer* tsg_viewer = dynamic_cast(viewer); + if(!tsg_viewer) { + G4cout << "G4ToolsSGViewer::SetNewValue:" + << " current viewer is not a G4ToolsSGViewer." << G4endl; + return; + } + std::vector args; + tools::double_quotes_tokenize(a_value,args); + if(args.size()!=a_cmd->GetParameterEntries()) return; + if(a_cmd==write_scene) { + tsg_viewer->Export(args[0],args[1]); + } + } + private: + G4UIcommand* write_scene; + }; + protected: SG_SESSION& fSGSession; G4ToolsSGSceneHandler& fSGSceneHandler; @@ -390,8 +496,10 @@ protected: G4bool fKeyShift; G4bool fMousePressed; G4double fMousePressedX, fMousePressedY; + + tools::sg::zb_manager f_zb_mgr; + tools::sg::gl2ps_manager f_gl2ps_mgr; + }; #endif - -#endif diff --git a/source/visualization/ToolsSG/include/G4ToolsSGWindowsGLES.hh b/source/visualization/ToolsSG/include/G4ToolsSGWindowsGLES.hh index 9930ebc2b9..71ece7d960 100644 --- a/source/visualization/ToolsSG/include/G4ToolsSGWindowsGLES.hh +++ b/source/visualization/ToolsSG/include/G4ToolsSGWindowsGLES.hh @@ -25,8 +25,6 @@ // // Guy Barrand 6th March 2021 -#if defined (G4VIS_BUILD_TOOLSSG_WINDOWS_GLES_DRIVER) || defined (G4VIS_USE_TOOLSSG_WINDOWS_GLES) - #ifndef G4TOOLSSGWINDOWSGLES_HH #define G4TOOLSSGWINDOWSGLES_HH @@ -53,5 +51,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/ToolsSG/include/G4ToolsSGX11GLES.hh b/source/visualization/ToolsSG/include/G4ToolsSGX11GLES.hh index a1821517e4..8eccad93b3 100644 --- a/source/visualization/ToolsSG/include/G4ToolsSGX11GLES.hh +++ b/source/visualization/ToolsSG/include/G4ToolsSGX11GLES.hh @@ -25,8 +25,6 @@ // // Guy Barrand 12th March 2021 -#if defined (G4VIS_BUILD_TOOLSSG_X11_GLES_DRIVER) || defined (G4VIS_USE_TOOLSSG_X11_GLES) - #ifndef G4TOOLSSGX11GLES_HH #define G4TOOLSSGX11GLES_HH @@ -53,5 +51,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/ToolsSG/include/G4ToolsSGXtGLES.hh b/source/visualization/ToolsSG/include/G4ToolsSGXtGLES.hh index 0d9b389212..3dd2c0b545 100644 --- a/source/visualization/ToolsSG/include/G4ToolsSGXtGLES.hh +++ b/source/visualization/ToolsSG/include/G4ToolsSGXtGLES.hh @@ -25,8 +25,6 @@ // // Guy Barrand 12th March 2021 -#if defined (G4VIS_BUILD_TOOLSSG_XT_GLES_DRIVER) || defined (G4VIS_USE_TOOLSSG_XT_GLES) - #ifndef G4TOOLSSGXTGLES_HH #define G4TOOLSSGXTGLES_HH @@ -53,5 +51,3 @@ protected: }; #endif - -#endif diff --git a/source/visualization/ToolsSG/sources.cmake b/source/visualization/ToolsSG/sources.cmake index 68a7e3f2c2..f4bb5a8b86 100644 --- a/source/visualization/ToolsSG/sources.cmake +++ b/source/visualization/ToolsSG/sources.cmake @@ -12,8 +12,6 @@ set(G4VIS_MODULE_TOOLSSG_SOURCES G4ToolsSGSceneHandler.cc ) -add_definitions(-DG4VIS_BUILD_TOOLSSG_DRIVER) - # X11 sources/links if selected if(GEANT4_USE_TOOLSSG_X11_GLES) list(APPEND G4VIS_MODULE_TOOLSSG_HEADERS @@ -24,8 +22,6 @@ if(GEANT4_USE_TOOLSSG_X11_GLES) G4ToolsSGX11GLES.cc ) - add_definitions(-DG4VIS_BUILD_TOOLSSG_X11_GLES_DRIVER) - list(APPEND G4VIS_MODULE_TOOLSSG_LINK_LIBRARIES X11::SM X11::ICE X11::X11 X11::Xext X11::Xmu) if(APPLE) list(APPEND G4VIS_MODULE_TOOLSSG_LINK_LIBRARIES XQuartzGL::GL) @@ -46,11 +42,7 @@ if(GEANT4_USE_TOOLSSG_XT_GLES) add_definitions(-DTOOLS_USE_GL_GL_H) - add_definitions(-DG4VIS_BUILD_TOOLSSG_XT_GLES_DRIVER) - - add_definitions(-DG4INTY_BUILD_XT) - - list(APPEND G4VIS_MODULE_TOOLSSG_LINK_LIBRARIES Motif::Xm X11::SM X11::ICE X11::X11 X11::Xext X11::Xmu ${G4VIS_MODULE_TOOLSSG_LINK_LIBRARIES}) + list(APPEND G4VIS_MODULE_TOOLSSG_LINK_LIBRARIES X11::SM X11::ICE X11::X11 X11::Xext X11::Xmu ${G4VIS_MODULE_TOOLSSG_LINK_LIBRARIES}) if(APPLE) list(APPEND G4VIS_MODULE_TOOLSSG_LINK_LIBRARIES XQuartzGL::GL) else() @@ -67,12 +59,9 @@ if(GEANT4_USE_TOOLSSG_QT_GLES) list(APPEND G4VIS_MODULE_TOOLSSG_SOURCES G4ToolsSGQtGLES.cc + G4ToolsSGQtViewer.cc ) - add_definitions(-DG4VIS_BUILD_TOOLSSG_QT_GLES_DRIVER) - - add_definitions(-DG4INTY_BUILD_QT -DG4UI_BUILD_QT_SESSION) - list(APPEND G4VIS_MODULE_TOOLSSG_LINK_LIBRARIES Qt5::OpenGL Qt5::Gui Qt5::PrintSupport Qt5::Widgets OpenGL::GL) endif() @@ -87,8 +76,6 @@ if(GEANT4_USE_TOOLSSG_WINDOWS_GLES) G4ToolsSGWindowsGLES.cc ) - add_definitions(-DG4VIS_BUILD_TOOLSSG_WINDOWS_GLES_DRIVER) - list(APPEND G4VIS_MODULE_TOOLSSG_LINK_LIBRARIES OpenGL::GL) endif() diff --git a/source/visualization/ToolsSG/src/G4ToolsSGQtGLES.cc b/source/visualization/ToolsSG/src/G4ToolsSGQtGLES.cc index f28d479301..55378798e3 100644 --- a/source/visualization/ToolsSG/src/G4ToolsSGQtGLES.cc +++ b/source/visualization/ToolsSG/src/G4ToolsSGQtGLES.cc @@ -25,8 +25,6 @@ // // Guy Barrand 12th March 2021 -#ifdef G4VIS_BUILD_TOOLSSG_QT_GLES_DRIVER - #include "G4ToolsSGQtGLES.hh" // @@ -127,5 +125,3 @@ G4bool G4ToolsSGQtGLES::IsUISessionCompatible () const // } return isCompatible; } - -#endif diff --git a/source/visualization/ToolsSG/src/G4ToolsSGQtViewer.cc b/source/visualization/ToolsSG/src/G4ToolsSGQtViewer.cc new file mode 100644 index 0000000000..807bddf642 --- /dev/null +++ b/source/visualization/ToolsSG/src/G4ToolsSGQtViewer.cc @@ -0,0 +1,4 @@ + +#include "G4ToolsSGQtViewer.hh" +#include "moc_G4ToolsSGQtViewer.cpp" + diff --git a/source/visualization/ToolsSG/src/G4ToolsSGSceneHandler.cc b/source/visualization/ToolsSG/src/G4ToolsSGSceneHandler.cc index 28165df564..fc572d8061 100644 --- a/source/visualization/ToolsSG/src/G4ToolsSGSceneHandler.cc +++ b/source/visualization/ToolsSG/src/G4ToolsSGSceneHandler.cc @@ -25,10 +25,10 @@ // // John Allison 6th October 2020 -#ifdef G4VIS_BUILD_TOOLSSG_DRIVER - #include "G4ToolsSGSceneHandler.hh" +#include "G4ToolsSGNode.hh" + #include "G4TransportationManager.hh" #include "G4Polyline.hh" #include "G4Polymarker.hh" @@ -36,8 +36,7 @@ #include "G4Square.hh" #include "G4Polyhedron.hh" #include "G4Text.hh" - -//#define G4TOOLSSG_DEBUG +#include "G4PlotterManager.hh" #include #include @@ -46,13 +45,28 @@ #include #include #ifdef TOOLS_USE_FREETYPE -#include +#include #include +#include +#include +#include #else +#include #include #endif -#include "G4ToolsSGNode.hh" +//for plotting: +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -61,27 +75,35 @@ G4int G4ToolsSGSceneHandler::fSceneIdCount = 0; G4ToolsSGSceneHandler::G4ToolsSGSceneHandler (G4VGraphicsSystem& system, const G4String& name) :parent(system, fSceneIdCount++, name) +,fFreetypeNode(0) { -#ifdef G4TOOLSSG_DEBUG - G4cout << "G4ToolsSGSceneHandler::G4ToolsSGSceneHandler called" << G4endl; -#endif - fpToolsSGScene = new tools::sg::separator; + //::printf("debug : G4ToolsSGSceneHandler : %lu, %s\n",this,name.c_str()); EstablishBaseNodes(); +#if defined(TOOLS_USE_FREETYPE) + fFreetypeNode = new tools::sg::text_freetype(); + fFreetypeNode->add_embedded_font(tools::sg::font_lato_regular_ttf(),tools::font::lato_regular_ttf); + fFreetypeNode->add_embedded_font(tools::sg::font_roboto_bold_ttf(),tools::font::roboto_bold_ttf); +#else + fFreetypeNode = new tools::sg::dummy_freetype(); +#endif + Messenger::Create(); } G4ToolsSGSceneHandler::~G4ToolsSGSceneHandler() { - delete fpToolsSGScene; + //::printf("debug : ~G4ToolsSGSceneHandler : %lu\n",this); + //WARNING : nodes may refer graphics managers (as tools/sg/[GL_manager,gl2ps_manager,zb_manager] + // used by viewers) to handle gstos (for GPU) or textures, then we have to delete them first. + // It is assumed that we pass here BEFORE the attached/managed viewers are deleted. + fpTransient2DObjects.clear(); + fpPersistent2DObjects.clear(); + fpTransient3DObjects.clear(); + fpPersistent3DObjects.clear(); + delete fFreetypeNode; } void G4ToolsSGSceneHandler::EstablishBaseNodes() { - fpTransientObjects = new tools::sg::separator; - fpToolsSGScene->add(fpTransientObjects); - - fpPersistentObjects = new tools::sg::separator; - fpToolsSGScene->add(fpPersistentObjects); - // Physical volume objects for each world hang from POs G4TransportationManager* transportationManager = G4TransportationManager::GetTransportationManager (); size_t nWorlds = transportationManager->GetNoWorlds(); @@ -90,7 +112,7 @@ void G4ToolsSGSceneHandler::EstablishBaseNodes() for (size_t i = 0; i < nWorlds; ++i, ++iterWorld) { G4VPhysicalVolume* _world = (*iterWorld); auto entity = new G4ToolsSGNode; - fpPersistentObjects->add(entity); + fpPersistent3DObjects.add(entity); entity->SetPVNodeID(G4PhysicalVolumeModel::G4PhysicalVolumeNodeID(_world)); fpPhysicalVolumeObjects[i] = entity; } @@ -106,15 +128,15 @@ tools::sg::separator* G4ToolsSGSceneHandler::GetOrCreateNode() if (fReadyForTransients) { // All transients hang from this node tools::sg::separator* sep = new tools::sg::separator; - fpTransientObjects->add(sep); + fpTransient3DObjects.add(sep); return sep; } - G4PhysicalVolumeModel* pPVModel = dynamic_cast(fpModel); + auto* pPVModel = dynamic_cast(fpModel); if (!pPVModel) { // Persistent objects (e.g., axes) tools::sg::separator* sep = new tools::sg::separator; - fpPersistentObjects->add(sep); + fpPersistent3DObjects.add(sep); return sep; } @@ -172,88 +194,65 @@ tools::sg::separator* G4ToolsSGSceneHandler::GetOrCreateNode() return node; } -void G4ToolsSGSceneHandler::PreAddSolid -(const G4Transform3D& objectTransformation, - const G4VisAttributes& visAttribs) -{ - parent::PreAddSolid(objectTransformation, visAttribs); +void G4ToolsSGSceneHandler::ClearStore () +{ + fpTransient2DObjects.clear(); + fpPersistent2DObjects.clear(); + fpTransient3DObjects.clear(); + fpPersistent3DObjects.clear(); + EstablishBaseNodes(); } -void G4ToolsSGSceneHandler::PostAddSolid() +void G4ToolsSGSceneHandler::ClearTransientStore () { - parent::PostAddSolid(); -} - -void G4ToolsSGSceneHandler::BeginPrimitives2D(const G4Transform3D& objectTransformation) -{ - // The x,y coordinates of the primitives passed to AddPrimitive are - // intrepreted as screen coordinates, -1 < x,y < 1. The - // z-coordinate is ignored. - static G4bool first = true; - if (first) { - first = false; - G4Exception("G4ToolsSGSceneHandler::BeginPrimitives2D", "ToolsSG-0001", - JustWarning, - "2D drawing not yet implemented"); - } - parent::BeginPrimitives2D (objectTransformation); -} - -void G4ToolsSGSceneHandler::EndPrimitives2D () -{ - parent::EndPrimitives2D (); -} - -void G4ToolsSGSceneHandler::BeginPrimitives(const G4Transform3D& objectTransformation) -{ - parent::BeginPrimitives(objectTransformation); -} - -void G4ToolsSGSceneHandler::EndPrimitives () -{ - parent::EndPrimitives (); + fpTransient2DObjects.clear(); + fpTransient3DObjects.clear(); } void G4ToolsSGSceneHandler::AddPrimitive(const G4Polyline& a_polyline) { -#ifdef G4TOOLSSG_DEBUG - G4cout << "debug : G4ToolsSGSceneHandler::AddPrimitive(const G4Polyline&) : \n" << a_polyline << G4endl; -#endif + //G4cout << "debug : G4ToolsSGSceneHandler::AddPrimitive(const G4Polyline&) : \n" << a_polyline << G4endl; if (a_polyline.size() == 0) return; - auto currentNode = GetOrCreateNode(); - if (!currentNode) return; // Node not available + tools::sg::separator* parentNode = 0; + if(fProcessing2D) { + parentNode = new tools::sg::separator; + if (fReadyForTransients) { + fpTransient2DObjects.add(parentNode); + } else { + fpPersistent2DObjects.add(parentNode); + } - fpVisAttribs = fpViewer->GetApplicableVisAttributes(a_polyline.GetVisAttributes()); + } else { + parentNode = GetOrCreateNode(); + if(!parentNode) return; - // Transformation - {tools::sg::matrix* mtx = new tools::sg::matrix; - G4Transform3D& elem = fObjectTransformation; - mtx->mtx.value().set_matrix(elem(0,0),elem(0,1),elem(0,2),elem(0,3), - elem(1,0),elem(1,1),elem(1,2),elem(1,3), - elem(2,0),elem(2,1),elem(2,2),elem(2,3), - 0, 0, 0, 1); - currentNode->add(mtx);} + tools::sg::matrix* mtx = new tools::sg::matrix; + G4Transform3D& elem = fObjectTransformation; + mtx->mtx.value().set_matrix(elem(0,0),elem(0,1),elem(0,2),elem(0,3), + elem(1,0),elem(1,1),elem(1,2),elem(1,3), + elem(2,0),elem(2,1),elem(2,2),elem(2,3), + 0, 0, 0, 1); + parentNode->add(mtx); + } - // Material (colour, etc.) - {const auto& colour = GetColour(); + {const auto& colour = GetColour(a_polyline); tools::sg::rgba* mat = new tools::sg::rgba(); mat->color = tools::colorf(float(colour.GetRed()), float(colour.GetGreen()), float(colour.GetBlue()), float(colour.GetAlpha())); - currentNode->add(mat);} + parentNode->add(mat);} {tools::sg::draw_style* ds = new tools::sg::draw_style; ds->style = tools::sg::draw_lines; ds->line_width = 1; - currentNode->add(ds);} + parentNode->add(ds);} - // Geometry : tools::sg::vertices* vtxs = new tools::sg::vertices; vtxs->mode = tools::gl::line_strip(); //polyline - currentNode->add(vtxs); + parentNode->add(vtxs); {for (size_t i = 0; i < a_polyline.size(); ++i) { vtxs->add(float(a_polyline[i].x()),float(a_polyline[i].y()),float(a_polyline[i].z())); @@ -261,20 +260,14 @@ void G4ToolsSGSceneHandler::AddPrimitive(const G4Polyline& a_polyline) } -void G4ToolsSGSceneHandler::AddPrimitive (const G4Scale& a_scale) {parent::AddPrimitive(a_scale);} - void G4ToolsSGSceneHandler::AddPrimitive (const G4Polymarker& a_polymarker) { -#ifdef G4TOOLSSG_DEBUG - ::printf("debug G4ToolsSGSceneHandler::AddPrimitive(const G4Polymarker&) : %lu, type %d\n", - a_polymarker.size(),a_polymarker.GetMarkerType()); -#endif + //::printf("debug G4ToolsSGSceneHandler::AddPrimitive(const G4Polymarker&) : %lu, type %d\n", + // a_polymarker.size(),a_polymarker.GetMarkerType()); if (a_polymarker.size() == 0) return; auto currentNode = GetOrCreateNode(); if (!currentNode) return; // Node not available - fpVisAttribs = fpViewer->GetApplicableVisAttributes(a_polymarker.GetVisAttributes()); - // Transformation {tools::sg::matrix* mtx = new tools::sg::matrix; G4Transform3D& elem = fObjectTransformation; @@ -284,8 +277,7 @@ void G4ToolsSGSceneHandler::AddPrimitive (const G4Polymarker& a_polymarker) 0, 0, 0, 1); currentNode->add(mtx);} - // Material (colour, etc.) - {const auto& colour = GetColour(); + {const auto& colour = GetColour(a_polymarker); tools::sg::rgba* mat = new tools::sg::rgba(); mat->color = tools::colorf(float(colour.GetRed()), @@ -319,24 +311,6 @@ void G4ToolsSGSceneHandler::AddPrimitive (const G4Polymarker& a_polymarker) markers->add(float(a_polymarker[i].x()),float(a_polymarker[i].y()),float(a_polymarker[i].z())); } currentNode->add(markers);} - /* - G4Circle circle (a_polymarker); - G4double radius; - if (circle.GetSizeType() == G4VMarker::world ) { - radius = circle.GetWorldRadius(); - } else { // Screen-size or none - // Not figured out how to do screen-size, so use scene extent - const G4double scale = 200.; // Roughly pixles per scene - radius = circle.GetScreenRadius()*fpScene->GetExtent().GetExtentRadius()/scale; - } - for (size_t iPoint = 0; iPoint < a_polymarker.size (); iPoint++) { - auto position = fObjectTransformation*G4Translate3D(a_polymarker[iPoint]); - auto node = new G4ToolsSGNode(currentNode); - //node->addComponent(material); - //node->addComponent(position); - //node->addComponent(sphere); // Sphere of given radius - } - */ }break; case G4Polymarker::squares:{ //::printf("debug : GB : Add Markers : +++++++++++++++++++++++++++++++++++++++++++ : square\n"); @@ -347,78 +321,66 @@ void G4ToolsSGSceneHandler::AddPrimitive (const G4Polymarker& a_polymarker) markers->add(float(a_polymarker[i].x()),float(a_polymarker[i].y()),float(a_polymarker[i].z())); } currentNode->add(markers);} - /* - G4Square square (a_polymarker); - G4double side; - if (square.GetSizeType() == G4VMarker::world ) { - side = square.GetWorldDiameter(); - } else { // Screen-size or none - // Not figured out how to do screen-size, so use scene extent - const G4double scale = 200.; // Roughly pixles per scene - side = square.GetScreenDiameter()*fpScene->GetExtent().GetExtentRadius()/scale; - } - for (size_t iPoint = 0; iPoint < a_polymarker.size (); iPoint++) { - auto position = fObjectTransformation*G4Translate3D(a_polymarker[iPoint]); - auto node = new G4ToolsSGNode(currentNode); - //node->addComponent(material); - //node->addComponent(position); - //node->addComponent(box); // Cube of given side - } - */ }break; } } void G4ToolsSGSceneHandler::AddPrimitive(const G4Text& a_text) { - //static G4bool first = true; - //if (first) { - // first = false; - // G4Exception("G4ToolsSGSceneHandler::AddPrimitive(const G4Text& text)", - // "ToolsSG-0002", JustWarning, - // "Text drawing not yet implemented"); - //} -#ifdef G4TOOLSSG_DEBUG - ::printf("debug : G4ToolsSGSceneHandler::AddPrimitive(const G4Text&) : \"%s\"\n",a_text.GetText().c_str()); -#endif - - auto currentNode = GetOrCreateNode(); - if (!currentNode) return; // Node not available - - fpVisAttribs = fpViewer->GetApplicableVisAttributes(a_text.GetVisAttributes()); - + //::printf("debug : G4ToolsSGSceneHandler::AddPrimitive(const G4Text&) : 000 : \"%s\"\n",a_text.GetText().c_str()); + //::printf("debug : G4ToolsSGSceneHandler::AddPrimitive(const G4Text&) : 2D ? %d\n",fProcessing2D); auto pos = a_text.GetPosition(); //::printf("debug : Add Text : pos %g %g %g\n",pos.x(),pos.y(),pos.z()); - // Transformation - {tools::sg::matrix* mtx = new tools::sg::matrix; - auto elem = fObjectTransformation*G4Translate3D(a_text.GetPosition()); - //G4Transform3D& elem = fObjectTransformation*G4Translate3D(a_text.GetPosition()); - mtx->mtx.value().set_matrix(elem(0,0),elem(0,1),elem(0,2),elem(0,3), - elem(1,0),elem(1,1),elem(1,2),elem(1,3), - elem(2,0),elem(2,1),elem(2,2),elem(2,3), - 0, 0, 0, 1); - currentNode->add(mtx);} + tools::sg::separator* parentNode = 0; + if(fProcessing2D) { + parentNode = new tools::sg::separator; + if (fReadyForTransients) { + fpTransient2DObjects.add(parentNode); + } else { + fpPersistent2DObjects.add(parentNode); + } - // Material (colour, etc.) - {const auto& colour = GetColour(); + tools::sg::matrix* mtx = new tools::sg::matrix; + mtx->set_translate(pos.x(),pos.y(),pos.z()); + parentNode->add(mtx); + + } else { + parentNode = GetOrCreateNode(); + if (!parentNode) return; + + tools::sg::matrix* mtx = new tools::sg::matrix; + auto elem = fObjectTransformation*G4Translate3D(pos); + mtx->mtx.value().set_matrix(elem(0,0),elem(0,1),elem(0,2),elem(0,3), + elem(1,0),elem(1,1),elem(1,2),elem(1,3), + elem(2,0),elem(2,1),elem(2,2),elem(2,3), + 0, 0, 0, 1); + parentNode->add(mtx); + } + + MarkerSizeType sizeType; + G4double size = GetMarkerSize(a_text, sizeType); + + {const auto& colour = GetTextColour(a_text); tools::sg::rgba* mat = new tools::sg::rgba(); mat->color = tools::colorf(float(colour.GetRed()), float(colour.GetGreen()), float(colour.GetBlue()), float(colour.GetAlpha())); - currentNode->add(mat);} - + parentNode->add(mat);} + #ifdef TOOLS_USE_FREETYPE tools::sg::text_freetype_marker* text = new tools::sg::text_freetype_marker; + text->add_embedded_font(tools::sg::font_lato_regular_ttf(),tools::font::lato_regular_ttf); text->font = tools::sg::font_lato_regular_ttf(); text->front_face = tools::sg::winding_cw; - text->modeling = tools::sg::font_pixmap; +//text->modeling = tools::sg::font_pixmap; //problem with Qt/GL. It slows rendering! #else tools::sg::text_hershey_marker* text = new tools::sg::text_hershey_marker; //text->encoding.value(a_encoding); #endif + text->height = float(size); //pixels text->strings.add(a_text.GetText()); {switch (a_text.GetLayout()) { default: @@ -433,24 +395,8 @@ void G4ToolsSGSceneHandler::AddPrimitive(const G4Text& a_text) break; }} //text->vjust.value(a_vjust); - currentNode->add(text); - - /* - //text.GetText(), text.GetXOffset(), etc. + parentNode->add(text); - MarkerSizeType sizeType; - G4double size = GetMarkerSize (text, sizeType); - switch (sizeType) { - default: - case screen: - // Draw in screen coordinates. OK. - break; - case world: - // Draw in world coordinates. Not implemented. Use size = 20. - size = 20.; - break; - } - */ } void G4ToolsSGSceneHandler::AddPrimitive(const G4Circle& a_circle) @@ -460,33 +406,6 @@ void G4ToolsSGSceneHandler::AddPrimitive(const G4Circle& a_circle) oneCircle.SetMarkerType(G4Polymarker::circles); // Call this AddPrimitive to avoid re-doing sub-class code. G4ToolsSGSceneHandler::AddPrimitive(oneCircle); - - /* - auto currentNode = GetOrCreateNode(); - if (!currentNode) return; // Node not available - - fpVisAttribs = fpViewer->GetApplicableVisAttributes(circle.GetVisAttributes()); - - auto circleNode = new G4ToolsSGNode(currentNode); - - // Transformation - auto position = fObjectTransformation*G4Translate3D(circle.GetPosition()); - //circleNode->addComponent(position); - - // Material (colour, etc.) - const auto& colour = fpVisAttribs->GetColour(); - //circleNode->addComponent(colour); - - G4double radius; - if (circle.GetSizeType() == G4VMarker::world ) { - radius =circle.GetWorldRadius(); - } else { // Screen-size or none - // Not figured out how to do screen-size, so use scene extent - const G4double scale = 200.; // Roughly pixles per scene - radius = circle.GetScreenRadius()*fpScene->GetExtent().GetExtentRadius()/scale; - } - //circleNode->addComponent(sphere); // Of given radius - */ } void G4ToolsSGSceneHandler::AddPrimitive(const G4Square& a_square) @@ -496,42 +415,13 @@ void G4ToolsSGSceneHandler::AddPrimitive(const G4Square& a_square) oneSquare.SetMarkerType(G4Polymarker::squares); // Call this AddPrimitive to avoid re-doing sub-class code. G4ToolsSGSceneHandler::AddPrimitive(oneSquare); - - /* - auto currentNode = GetOrCreateNode(); - if (!currentNode) return; // Node not available - - fpVisAttribs = fpViewer->GetApplicableVisAttributes(square.GetVisAttributes()); - - auto squareNode = new G4ToolsSGNode(currentNode); - - // Transformation - auto position = fObjectTransformation*G4Translate3D(square.GetPosition()); - //squareNode->addComponent(position); - - // Material (colour, etc.) - const auto& colour = fpVisAttribs->GetColour(); - //squareNode->addComponent(colour); - - G4double side; - if (square.GetSizeType() == G4VMarker::world ) { - side = square.GetWorldDiameter(); - } else { // Screen-size or none - // Not figured out how to do screen-size, so use scene extent - const G4double scale = 200.; // Roughly pixles per scene - side = square.GetScreenDiameter()*fpScene->GetExtent().GetExtentRadius()/scale; - } - //squareNode->addComponent(cube); // Of given side - */ } void G4ToolsSGSceneHandler::AddPrimitive(const G4Polyhedron& a_polyhedron) { if (a_polyhedron.GetNoFacets() == 0) return; -#ifdef G4TOOLSSG_DEBUG - ::printf("debug : G4ToolsSGSceneHandler::AddPrimitive(const G4Polyhedron&) : %d\n",a_polyhedron.GetNoFacets()); -#endif + //::printf("debug : G4ToolsSGSceneHandler::AddPrimitive(const G4Polyhedron&) : %d\n",a_polyhedron.GetNoFacets()); fpVisAttribs = fpViewer->GetApplicableVisAttributes(a_polyhedron.GetVisAttributes()); @@ -630,8 +520,7 @@ void G4ToolsSGSceneHandler::AddPrimitive(const G4Polyhedron& a_polyhedron) 0, 0, 0, 1); sep->add(mtx);} - // Material (colour, etc.) - {const auto& colour = fpVisAttribs->GetColour(); + {const auto& colour = GetColour(a_polyhedron); tools::sg::rgba* mat = new tools::sg::rgba(); mat->color = tools::colorf(float(colour.GetRed()), @@ -681,15 +570,262 @@ void G4ToolsSGSceneHandler::AddPrimitive(const G4Polyhedron& a_polyhedron) } } -void G4ToolsSGSceneHandler::ClearStore () -{ - fpToolsSGScene->clear(); - EstablishBaseNodes(); +//plotting: +inline void SetRegionStyles(tools::xml::styles& a_styles, + tools::sg::plots& a_plots, + tools::sg::plotter& a_plotter, + const G4String& a_style) { + if(a_style=="reset") { + a_plotter.reset_style(true); + a_plots.touch(); //to apply indirectly plots::set_plotter_layout() on _plotter. + } else if( (a_style=="inlib_default")|| (a_style=="default")) { + tools::sg::set_inlib_default_style(G4cout,a_styles.cmaps(),a_plotter,tools::sg::font_hershey()); + } else if(a_style=="ROOT_default") { + tools::sg::set_ROOT_default_style(G4cout,a_styles.cmaps(),a_plotter,tools::sg::font_roboto_bold_ttf()); + } else if(a_style=="hippodraw") { + tools::sg::set_hippodraw_style(G4cout,a_styles.cmaps(),a_plotter,tools::sg::font_lato_regular_ttf()); + } else { + tools::sg::style_from_res(a_styles,a_style,a_plotter,false); + } } -void G4ToolsSGSceneHandler::ClearTransientStore () -{ - fpTransientObjects->clear(); +inline tools::xml::styles::style_t* find_style(tools::xml::styles& a_styles,const std::string& a_name) { + tools_vforit(tools::xml::styles::named_style_t,a_styles.named_styles(),it){ + if((*it).first==a_name) return &((*it).second); + } + return 0; } -#endif +inline void SetPlotterStyles(tools::sg::plots& a_plots, + const std::vector& a_plotter_styles, + const std::vector& a_region_styles) { + + G4PlotterManager::Styles& _styles = G4PlotterManager::GetInstance().GetStyles(); + + tools::xml::styles _tools_styles(G4cout); + _tools_styles.add_colormap("default",tools::sg::style_default_colormap()); + _tools_styles.add_colormap("ROOT",tools::sg::style_ROOT_colormap()); + + {tools_vforcit(G4PlotterManager::NamedStyle,_styles,it) { + tools::xml::styles::style_t _tools_style; + tools_vforcit(G4PlotterManager::StyleItem,(*it).second,its) { + const G4String& param = (*its).first; + if(param.find('.')==std::string::npos) { + const G4String& value = (*its).second; + _tools_style.push_back(tools::xml::styles::style_item_t(param,value)); + } + } + _tools_styles.add_style((*it).first,_tools_style); + }} + + // sub styles: + {tools_vforcit(G4PlotterManager::NamedStyle,_styles,it) { + tools_vforcit(G4PlotterManager::StyleItem,(*it).second,its) { + const G4String& param = (*its).first; + std::string::size_type pos = param.rfind('.'); + if(pos!=std::string::npos) { + std::string sub_style = (*it).first+"."+param.substr(0,pos); + G4String parameter = param.substr(pos+1,param.size()-pos); + const G4String& value = (*its).second; + tools::xml::styles::style_t* _tools_style = find_style(_tools_styles,sub_style); + if(_tools_style) { + _tools_style->push_back(tools::xml::styles::style_item_t(parameter,value)); + } else { + tools::xml::styles::style_t _tools_style_2; + _tools_style_2.push_back(tools::xml::styles::style_item_t(parameter,value)); + _tools_styles.add_style(sub_style,_tools_style_2); + } + } + } + }} + + {unsigned int number = a_plots.number(); + for(unsigned int index=0;index& a_region_parameters) { + // parameter/field examples : + // title_automated + // title + // bins_style.0.color + // x_axis.divisions + // x_axis.line_style.color + // background_style.back_color + tools_vforcit(G4Plotter::RegionParameter,a_region_parameters,it) { + tools::sg::plotter* _plotter = a_plots.find_plotter((*it).first); + if(_plotter) { + const G4String& parameter = (*it).second.first; + const G4String& value = (*it).second.second; + tools::sg::field* fd = _plotter->find_field_by_name(parameter); + if(!fd) fd = _plotter->find_field_by_name(_plotter->s_cls()+"."+parameter); + if(fd) {if(fd->s2value(value)) continue;} + // look for sf_enum for which value is given with a string, or + // for sf for which value given with true/false, or + // for a style, for example: bins_style.0.color: + if(!_plotter->set_from_string(G4cout,a_cmaps,parameter,value)) { + G4cout << "G4ToolsSGSceneHandler::SetPlotterParameters: plotter.set_from_string() failed for field " + << tools::sout(parameter) << ", and value " << tools::sout(value) << "." + << std::endl; + } + } + } +} + +#include "G4UImanager.hh" + +void G4ToolsSGSceneHandler::SetPlotterHistograms(tools::sg::plots& a_plots) { + a_plots.clear(); + G4UImanager* UI = G4UImanager::GetUIpointer(); + if(UI==NULL) return; + {tools_vforcit(Region_h1,fRegionH1s,it) { + tools::sg::plotter* _plotter = a_plots.find_plotter((*it).first); + if(_plotter) { + int hid = (*it).second; + std::ostringstream os; + os << hid; + std::string cmd("/analysis/h1/get "); + cmd += std::string(os.str()); + G4int status = UI->ApplyCommand(cmd.c_str()); + if(status==G4UIcommandStatus::fCommandSucceeded) { + G4String hexString = UI->GetCurrentValues("/analysis/h1/get"); + if(hexString.size()) { + void* ptr; + std::istringstream is(hexString); + is >> ptr; + tools::histo::h1d* _h = (tools::histo::h1d*)ptr; + tools::sg::plottable* p = new tools::sg::h1d2plot_cp(*_h); + _plotter->add_plottable(p); //give ownership of p to sg::plotter. + } + } + } + }} + {tools_vforcit(Region_h2,fRegionH2s,it) { + tools::sg::plotter* _plotter = a_plots.find_plotter((*it).first); + if(_plotter) { + int hid = (*it).second; + std::ostringstream os; + os << hid; + std::string cmd("/analysis/h2/get "); + cmd += std::string(os.str()); + G4int status = UI->ApplyCommand(cmd.c_str()); + if(status==G4UIcommandStatus::fCommandSucceeded) { + G4String hexString = UI->GetCurrentValues("/analysis/h2/get"); + if(hexString.size()) { + void* ptr; + std::istringstream is(hexString); + is >> ptr; + tools::histo::h2d* _h = (tools::histo::h2d*)ptr; + tools::sg::plottable* p = new tools::sg::h2d2plot_cp(*_h); + _plotter->add_plottable(p); //give ownership of p to sg::plotter. + } + } + } + }} +} + +class plots_cbk : public tools::sg::ecbk { + TOOLS_CBK(plots_cbk,plots_cbk,tools::sg::ecbk) +public: + virtual tools::sg::return_action action() { + if(const tools::sg::size_event* sz_evt = tools::sg::event_cast(*m_event)){ + m_plots.adjust_size(sz_evt->width(),sz_evt->height()); + m_event_action->set_done(true); + return tools::sg::return_to_render; + } + return tools::sg::return_none; + } +public: + plots_cbk(tools::sg::plots& a_plots) + :parent() + ,m_plots(a_plots) + {} + virtual ~plots_cbk(){} +public: + plots_cbk(const plots_cbk& a_from) + :parent(a_from) + ,m_plots(a_from.m_plots) + {} + plots_cbk& operator=(const plots_cbk& a_from){ + parent::operator=(a_from); + return *this; + } +protected: + tools::sg::plots& m_plots; +}; + +void G4ToolsSGSceneHandler::TouchPlotters(tools::sg::node& a_sg) { + tools::sg::search_action sa(G4cout); + const tools::sg::search_action::paths_t& paths = tools::sg::find_paths(sa,a_sg); + tools_vforcit(tools::sg::path_t,paths,it) { + tools::sg::plots* _plots = tools::sg::tail(*it); + if(_plots) { + SetPlotterHistograms(*_plots); + } + } +} + +void G4ToolsSGSceneHandler::AddPrimitive(const G4Plotter& a_plotter) +{ +//G4cout << "debug : G4ToolsSGSceneHandler::AddPrimitive : 004" << std::endl; + if(!fpViewer) return; + + auto currentNode = GetOrCreateNode(); + if (!currentNode) return; // Node not available + + currentNode->add(new tools::sg::light_off()); + + tools::sg::plots* _plots = new tools::sg::plots(*fFreetypeNode); + currentNode->add(_plots); + + _plots->view_border = false; + _plots->set_regions(a_plotter.GetColumns(),a_plotter.GetRows()); + + {tools::sg::event_dispatcher* dpt = new tools::sg::event_dispatcher; + dpt->add_callback(new plots_cbk(*_plots)); + currentNode->add(dpt);} + + SetPlotterStyles(*_plots,a_plotter.GetStyles(),a_plotter.GetRegionStyles()); + + tools::sg::cmaps_t _cmaps; + _cmaps["default"] = tools::sg::style_default_colormap(); + _cmaps["ROOT"] = tools::sg::style_ROOT_colormap(); + + SetPlotterParameters(_cmaps,*_plots,a_plotter.GetRegionParameters()); + + fRegionH1s = a_plotter.GetRegionH1s(); + fRegionH2s = a_plotter.GetRegionH2s(); + + SetPlotterHistograms(*_plots); +} + +void G4ToolsSGSceneHandler::Messenger::SetNewValue(G4UIcommand* a_cmd,G4String) { + G4VSceneHandler* pSceneHandler = fpVisManager->GetCurrentSceneHandler(); + if (!pSceneHandler) { + G4cout << "G4ToolsSGSceneHandler::Messenger::SetNewValue: no current sceneHandler. Please create one." << G4endl; + return; + } + auto* tsg_scene_handler = dynamic_cast(pSceneHandler); + if(!tsg_scene_handler) { + G4cout << "G4ToolsSGSceneHandler::Messenger::SetNewValue: current sceneHandler not a G4ToolsSGSceneHandler." << G4endl; + return; + } + if(a_cmd==print_plotter_params) { + tools::sg::dummy_freetype _ttf; + tools::sg::plotter _plotter(_ttf); + _plotter.print_available_customization(G4cout); + } +} diff --git a/source/visualization/ToolsSG/src/G4ToolsSGWindowsGLES.cc b/source/visualization/ToolsSG/src/G4ToolsSGWindowsGLES.cc index 55127101d5..3b067479d6 100644 --- a/source/visualization/ToolsSG/src/G4ToolsSGWindowsGLES.cc +++ b/source/visualization/ToolsSG/src/G4ToolsSGWindowsGLES.cc @@ -25,7 +25,6 @@ // // Guy Barrand 6th March 2021 -#ifdef G4VIS_BUILD_TOOLSSG_WINDOWS_GLES_DRIVER #include "G4ToolsSGWindowsGLES.hh" @@ -113,5 +112,3 @@ G4bool G4ToolsSGWindowsGLES::IsUISessionCompatible () const // } return isCompatible; } - -#endif diff --git a/source/visualization/ToolsSG/src/G4ToolsSGX11GLES.cc b/source/visualization/ToolsSG/src/G4ToolsSGX11GLES.cc index 68c6bdb96a..6d6d6e06bf 100644 --- a/source/visualization/ToolsSG/src/G4ToolsSGX11GLES.cc +++ b/source/visualization/ToolsSG/src/G4ToolsSGX11GLES.cc @@ -25,8 +25,6 @@ // // Guy Barrand 12th March 2021 -#ifdef G4VIS_BUILD_TOOLSSG_X11_GLES_DRIVER - #include "G4ToolsSGX11GLES.hh" #include "G4ToolsSGViewer.hh" @@ -115,5 +113,3 @@ G4bool G4ToolsSGX11GLES::IsUISessionCompatible () const // } return isCompatible; } - -#endif diff --git a/source/visualization/ToolsSG/src/G4ToolsSGXtGLES.cc b/source/visualization/ToolsSG/src/G4ToolsSGXtGLES.cc index 99b8f43611..a3dfd9696d 100644 --- a/source/visualization/ToolsSG/src/G4ToolsSGXtGLES.cc +++ b/source/visualization/ToolsSG/src/G4ToolsSGXtGLES.cc @@ -25,8 +25,6 @@ // // Guy Barrand 12th March 2021 -#ifdef G4VIS_BUILD_TOOLSSG_XT_GLES_DRIVER - #include "G4ToolsSGXtGLES.hh" #include "G4ToolsSGViewer.hh" @@ -137,5 +135,3 @@ G4bool G4ToolsSGXtGLES::IsUISessionCompatible () const // } return isCompatible; } - -#endif diff --git a/source/visualization/Tree/History b/source/visualization/Tree/History index b83734ab4c..fde0701d41 100644 --- a/source/visualization/Tree/History +++ b/source/visualization/Tree/History @@ -23,6 +23,21 @@ committal in the CVS repository ! History file for visualization/Tree sub-category ------------------------------------------------ + +25 October 2021 Guy Barrand (vistree-V10-07-03) +- G4VTreeSceneHandler.hh: to quiet g++ about "AddPrimitive(G4Plotter&)", have: + using G4VSceneHandler::AddPrimitive; + +10 October 2021 John Allison (vistree-V10-07-02) +- Migrate to modeling-V10-07-14: + - G4PhysicalVolumeModel: Hold current transform as object, not as a pointer. + +30 June 2021 John Allison (vistree-V10-07-01) +- Requires greps-V10-07-09, modeling-V10-07-11 and visman-V10-07-11. +- Revise vis models. See visualization/modeling/History for more details. +- Consequent changes: + o AddPrimitive(const G4Scale&) has been removed from all scene handlers. + 14 April 2021 Ben Morgan (vistree-V10-07-00) - Migrate to modular CMake build diff --git a/source/visualization/Tree/include/G4VTreeSceneHandler.hh b/source/visualization/Tree/include/G4VTreeSceneHandler.hh index 41d1ec7f65..c4b6fc3e3c 100644 --- a/source/visualization/Tree/include/G4VTreeSceneHandler.hh +++ b/source/visualization/Tree/include/G4VTreeSceneHandler.hh @@ -57,13 +57,13 @@ public: //////////////////////////////////////////////////////////////// // Functions not used but required by the abstract interface. + using G4VSceneHandler::AddPrimitive; virtual void AddPrimitive (const G4Polyline&) {} virtual void AddPrimitive (const G4Text&) {} virtual void AddPrimitive (const G4Circle&) {} virtual void AddPrimitive (const G4Square&) {} virtual void AddPrimitive (const G4Polyhedron&) {} virtual void AddPrimitive (const G4Polymarker&) {} - virtual void AddPrimitive (const G4Scale&) {} virtual void BeginModeling(); virtual void EndModeling(); diff --git a/source/visualization/Tree/src/G4ASCIITreeSceneHandler.cc b/source/visualization/Tree/src/G4ASCIITreeSceneHandler.cc index f8d0e0d9c7..fbb30451b9 100644 --- a/source/visualization/Tree/src/G4ASCIITreeSceneHandler.cc +++ b/source/visualization/Tree/src/G4ASCIITreeSceneHandler.cc @@ -414,8 +414,8 @@ void G4ASCIITreeSceneHandler::RequestPrimitives(const G4VSolid& solid) { if (detail >= 7) { G4Polyhedron* polyhedron = solid.GetPolyhedron(); fRestOfLine << "\nLocal polyhedron coordinates:\n" << *polyhedron; - G4Transform3D* transform = pPVModel->GetCurrentTransform(); - polyhedron->Transform(*transform); + const G4Transform3D& transform = pPVModel->GetCurrentTransform(); + polyhedron->Transform(transform); fRestOfLine << "\nGlobal polyhedron coordinates:\n" << *polyhedron; } diff --git a/source/visualization/VRML/History b/source/visualization/VRML/History index 3d03b3f653..0b2fed5b55 100644 --- a/source/visualization/VRML/History +++ b/source/visualization/VRML/History @@ -19,6 +19,15 @@ committal in the CVS repository ! History file for visualization/VRML sub-category ------------------------------------------------ +26 August 2021 Ben Morgan (VRML-V10-07-03) +- Remove obsolete VRML1 and network VRML2 drivers + +25 August 2021 John Allison (VRML-V10-07-02) +- VRML*FILE drivers: + o Introduce environment variables G4VRMLFILE_HEADER and G4VRMLFILE_FILE_NAME + to allow the user to change the defaults. Also improve messaging to + inform the user of this possibility. + 07 June 2021 John Allison (VRML-V10-07-01) - Fix hidden function warning. diff --git a/source/visualization/VRML/g4vrmlview/Makefile b/source/visualization/VRML/g4vrmlview/Makefile deleted file mode 100644 index 2f2b3a5872..0000000000 --- a/source/visualization/VRML/g4vrmlview/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -INSTALL_DIR = "/usr/local/javaclass" - -JAVAC = javac - -g4vrmlview.class: g4vrmlview.java - $(JAVAC) g4vrmlview.java - $(JAVAC) g4mini.java - -install: - @if [ ! -d $(INSTALL_DIR) ] ; then mkdir $(INSTALL_DIR) ;fi - cp g4vrmlview.class $(INSTALL_DIR) - cp g4vrmlviewThread.class $(INSTALL_DIR) - -clean: - rm -f *.class - rm -f \#* *~ *.bak - -wrlclean: - rm -f g4.wrl g4_*.wrl - diff --git a/source/visualization/VRML/g4vrmlview/README b/source/visualization/VRML/g4vrmlview/README deleted file mode 100644 index 8cafb9ff7f..0000000000 --- a/source/visualization/VRML/g4vrmlview/README +++ /dev/null @@ -1,222 +0,0 @@ - ----- How to visualize Geant4 simulation ----- - ----- with VRML-network drivers and g4vrmlview ----- - - November 04, 1999 - - Satoshi Tanaka and Yasuhide Sawada - Fukui University, Japan - tanaka@i1nws1.fuis.fukui-u.ac.jp - ------------------------- -Section 1: Introduction ------------------------- - -This is a document to explain how to perform Geant4 -"remote" visualization with VRML. You can visualize Geant4 -simulation on your WWW browser. -You have to prepare the following softwares beforehand: - - (1) Geant4 - (2) g4vrmlview, a small java software included in the Geant4 package - - geant4/source/visualization/VRML/g4vrmlview/ - - Or you can also obtain it from our ftp site: - - ftp://i1nws2.fuis.fukui-u.ac.jp/pub/graphics - /fukui_graphics_system/g4vrmlview_VERSION.tar.gz - - - (3) VRML browser, e.g., vrweb, VRMLview, etc - - ------------------------------------------------ -Section 2: What is the Geant4 VRML-network drivers? ------------------------------------------------ - - Geant4 VRML-network drivers are included in visualization category of - the Geant4 package: - - geant4/source/visualization/VRML/ - - The VRML-network drivers work as follows: - - (1) Convert 3D data of Geant4 simulation into VRML 1.0/2.0 codes. - (2) Send the generated VRML codes to another process of "g4vrmlview", - running at either local or remote host. - - (Note: For local visualization, use the VRML-file drivers, - which can be invoked with the following commands: - - ..... - - Idle> /vis/sceneHandler/create VRML1FILE - - for VRML 1.0 and - - Idle> /vis/sceneHandler/create VRML2FILE - - for VRML 2.0. - - ------------------------------------------------------------------------- -Section 3: Environmental variables to customize the VRML-network drivers ------------------------------------------------------------------------- - - You can customize the VRML-network drivers by setting environmental - variables at Geant4 host, i.e., the host where Geant4 runs: - - Geant4_host % setenv G4VRML_PORT port_number - Geant4_host % setenv G4VRML_HOST_NAME host_name - - The default port number is 40801, and the default host name - is "localhost". You need not define the environmental - variables if you use the default values. - - ---------------------------------- -Section 4: What is g4vrmlview? ---------------------------------- - -g4vrmlview is a software written in java. -It works as follows: - - (1) Receive VRML codes from a VRML-network driver of Geant4 - via local or wide-area network. - (2) Save the received VRML codes to a local file named "g4.wrl" etc. - (3) Invoke a VRML viewer, which is specified at the command line, - automatically. - --------------------------------------- -Section 5: How to install g4vrmlview --------------------------------------- - - You need JDK1.1 to install g4vrmlview. - The installation can be done by doing the following steps: - - (1) % cd g4vrmlview - (2) Edit Makefile and set a proper directory name to variable - "INSTALL_DIR". The default setting is: - - INSTALL_DIR = "/usr/local/javaclass" - - Later, java classes (g4vrmlview.class etc) are installed - to the directory specified by the variable INSTALL_DIR. - - (3) Set the environmental variable "CLASSPATH" in .cshrc etc. - (This step can be skipped in some platforms.) - For example, if JDK1.1.1 is installed in the directory - "/usr/local/dev/jdk1.1.1" and you want to install g4vrmlview - into "/usr/local/javaclass", then the variable CLASSPATH - should be defined as: - - # java in Unix (.cshrc) - setenv CLASSPATH .:/usr/local/dev/jdk1.1.1/lib/classes.zip:\ - /usr/local/javaclass - - Similarly, in Windows NT/95, if JDK.1.1 is installed in - the directory "C:\jdk1.1.1" and you want to install g4vrmlview - into C:\dev\javaclass, you should add the following lines to - AUTOEXEC.BAT: - - # java in Windows NT/95 (autoexec.bat) - SET CLASSPATH = .;C:\jdk1.1.1\lib\classes.zip;C:\dev\javaclass - - (4) % make clean - (5) % make - - (6) Test created java classes using g4mini. - You can do it using two separate windows, - instead of using two separate hosts. - Here we assume that we use windows named "window_1" - and "window_2", and use the VRML browser "vrweb". - - window_1 % java g4vrmlview vrweb - Waiting for requests at port 40801 ... - - window_2 % java g4vrmlview vrweb - % java g4mini - Usage: java g4mini src_file server_hostname - - window_2 % java g4mini sample.wrl localhost - - The test is successful if you see pictures on the VRML browser. - - Now you can use g4vrmlview if the class path of java is, - explicitly or implicitly set to the current directory. - Go on to the next step if you want to install g4vrmlview into - a public place. - - Here you have to become root if you do not have permission - to INSTALL_DIR. If the directory INSTALL_DIR does not exist, - it will be created automatically. - - (5) % make install - - --------------------------------------- -Section 6: How to use g4vrmlview --------------------------------------- - - (1) Invoke g4vrmlview at the host where g4vrmlview runs, - say, "VRML_host". For example, - - VRML_host% java g4vrmlview VRML_browser_name - - where the last argument is a name of your favorite VRML browser. - - (2) Invoke Geant4 at the host, where Geant4 runs, say, Geant4_host. - For example, - - Geant4_host% exampleN03 - - ..... - - Idel> /vis/sceneHandler/create VRML1 - - for VRML 1.0 and - - Idel> /vis/sceneHandler/create VRML2 - - for VRML 2.0. - - ---------------------------------------- -Section 7: More notes on g4vrmlview ---------------------------------------- - - (1) Format of invoking g4vrmlview: - - % java g4vrmlview VRML_browser_name [port_number] - - VRML_browser_name: - "netscape", "vrweb", etc, - or "NONE" to suppress invoking VRML browser - - port_number: - The default port number is 40801. - If you have set the environmental variable - "G4VRML_PORT" at Geant4 host, - you have to give the same port number. - For example, - - Geant4_host % setenv G4VRML_PORT 40802 - VRML_host % java g4vrmlview netscape 40802 - - (2) Auto increment of port number: - If the port number 40801 is already in use, it is - automatically incremented one by one up to 40810. - - (3) Multiple thread: - g4vrmlview is a multi-thread software. - It can accept data from plural Geant4 at the same time. - - (4) Saving VRML codes to files: - VRML codes sent from Geant4 is saved to a file named - "g4.wrl". If g4.wrl already exists, the file name is - incremented to g4_2.wrl. Similarly the file name is - incremented to g4_3.wrl, g4_4.wrl, etc. - The files are created in the directory where you invoked g4vrmlview. - - -===== End of document ===== diff --git a/source/visualization/VRML/g4vrmlview/g4mini.java b/source/visualization/VRML/g4vrmlview/g4mini.java deleted file mode 100644 index c5dea7f71e..0000000000 --- a/source/visualization/VRML/g4vrmlview/g4mini.java +++ /dev/null @@ -1,81 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -import java.io.*; -import java.net.*; - -public class g4mini -{ - public static void main( String[] args ) - { - try{ - - // port number - final int DEFALUT_PORT_NO = 40801 ; - int portNo = DEFALUT_PORT_NO ; - - // argument checking - if( args.length != 2 ) - { - System.out.println( "Usage: java g4mini src_file server_hostname"); - return ; - } - String src = args[0]; - String server = args[1]; - - // open connection - Socket socket = new Socket( server, portNo ) ; - - // get input stream from file - BufferedReader br - = new BufferedReader ( new FileReader ( src ) ) ; - - // get output stream to socket - BufferedWriter bw - = new BufferedWriter ( new OutputStreamWriter ( socket.getOutputStream() ) ) ; - - // file ==> socket - String line ; - while ( (line = br.readLine()) != null ) - { - bw.write( line ); - bw.newLine() ; - bw.flush () ; - } - - // close streams - br.close(); - bw.close(); - socket.close() ; - } - - catch( Exception e ) - { - System.out.println( e.toString() ); - } - } // main -} diff --git a/source/visualization/VRML/g4vrmlview/g4vrmlview.java b/source/visualization/VRML/g4vrmlview/g4vrmlview.java deleted file mode 100644 index 4d514e29e2..0000000000 --- a/source/visualization/VRML/g4vrmlview/g4vrmlview.java +++ /dev/null @@ -1,245 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -import java.io.*; -import java.net.*; - -//------------------// -// class g4vrmlview // -// ( main() ) // -//------------------// -public class g4vrmlview -{ - public static void main( String[] args ) - { - try{ - // CONST - final String VERSION = "1.00" ; - final String DATE = "August 19, 1997"; - - final int PORT_NO = 40801 ; - final String OUTPUT_FILE_HEAD = "g4" ; - final String OUTPUT_FILE_EXT = "wrl" ; - final int MAX_TRIAL = 10 ; - - // local - int portNo = PORT_NO ; - - // argument checking - if( args.length != 1 && args.length != 2 ) - { - System.out.println( "-------------------------------"); - System.out.println( " G4VRMLView version " + VERSION ); - System.out.println( " " + DATE ); - System.out.println( "-------------------------------"); - System.out.println( "Usage: java g4vrmlview browser_name [port_number]"); - System.out.println( " Browser_name: netscape, vrweb, etc, or NONE"); - return ; - } - - // VRML browser - String browser = new String ( args[0] ) ; - - // port number - if( args.length == 2 ) - { - portNo = Integer.parseInt( args[1] ); - } - - // make a server socket - ServerSocket ss = null ; - for ( int i = 0 ; i < MAX_TRIAL ; i++ ) - { - try - { - ss = new ServerSocket( portNo ); - System.out.println( "Waiting for requests at port " +portNo + " ..."); - break ; - } - catch ( Exception e ) - { - portNo++ ; - if( i >= MAX_TRIAL ) - { - System.out.println( "Sockets are not available."); - return ; - } - } - } // for - - - // open connection and invoke thread - int nSpawn = 0 ; - while( true ) - { - Socket socket = ss.accept(); nSpawn++ ; - - System.out.println( "Connection accepted by thread " + nSpawn ); - - ( new g4vrmlviewThread( socket, OUTPUT_FILE_HEAD, OUTPUT_FILE_EXT , browser )).start() ; - - } // while - - } - catch ( Exception e ) - { - System.out.println( e.toString() ); - } - } // main() - -} // g4vrmlview - - -//------------------------// -// class g4vrmlviewThread // -//------------------------// -class g4vrmlviewThread extends Thread -{ - private final String NONE = "NONE" ; // no browser - private Socket m_socket ; - private String m_outputFile ; - private String m_browser ; - - // constuctor - public g4vrmlviewThread( Socket socket , - String outputFileHead , - String outputFileExt , - String browser ) - { - m_socket = socket ; - SetOutputFileName ( outputFileHead , outputFileExt ); - m_browser = new String ( browser ); - } - - private void SetOutputFileName( String outputFileHead, - String outputFileExt ) - { - // temporary file name - String outputFile_tmp - = new String ( outputFileHead + - "." + - outputFileExt ) ; - - // for modification of temporary filename - int n = 1 ; - - // make a non-existing filename - while ( true ) - { - File file = new File ( outputFile_tmp ); - - if ( !file.exists() ) - { - break ; - } else { - - outputFile_tmp - = new String ( outputFileHead + - "_" + - (n++) + - "." + - outputFileExt ); - } - - } // while - - // set decided filename to data field - m_outputFile = new String ( outputFile_tmp ); - - } // g4vrmlviewThread::setOutputFileName() - - - // run () - public void run () - { - try{ - // get input stream from socket - BufferedReader br - = new BufferedReader ( new InputStreamReader ( m_socket.getInputStream() ) ) ; - - // get output stream to file - BufferedWriter bw - = new BufferedWriter ( new FileWriter ( m_outputFile ) ) ; - - // socket ==> file - String line ; - while ( (line = br.readLine()) != null ) - { - bw.write( line ); - bw.newLine() ; - bw.flush () ; - } - System.out.println( "VRML data is saved to file " +m_outputFile ); - - // close streams and socket - br.close(); - bw.close(); - m_socket.close() ; - - // invoke browser - if( !m_browser.equals(NONE) ) - { - try - { - - File file = new File ( m_outputFile ); - - // visualize created VRML file with browser - if ( file.exists() ) - { - String outputFileAbs = new String ( file.getAbsolutePath() ) ; - String[] command = { m_browser, outputFileAbs }; - System.out.println( "Command: " + command[0] + " " + command[1] ); - - Process exec_process = null ; - - Runtime runtime = Runtime.getRuntime(); - exec_process = runtime.exec( command ); - exec_process.waitFor() ; - } else { - System.out.println( "Error: Failed to open file" + m_outputFile ); - } - } - catch ( Exception e ) - { - System.out.println( e.toString() ); - } - - } - else - { - System.out.println( "No browser was invoked" ); - } - - } - catch( Exception e ) - { - System.out.println( e.toString() ); - } - } // run() - -} // g4vrmlviewThread diff --git a/source/visualization/VRML/g4vrmlview/sample.wrl b/source/visualization/VRML/g4vrmlview/sample.wrl deleted file mode 100644 index 5ba37a5cb9..0000000000 --- a/source/visualization/VRML/g4vrmlview/sample.wrl +++ /dev/null @@ -1,700 +0,0 @@ -#VRML V1.0 ascii -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 - } - DEF box_WBox_10 Separator { - Material { - diffuseColor 1 1 1 - } - Cube { - width 12000 - height 24000 - depth 20000 - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 0 1 - } - DEF box_WSBox_11 Separator { - Material { - diffuseColor 1 0 0 - } - Cube { - width 3200 - height 1300 - depth 3200 - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 0 1 - } - DEF box_WSWBox_12 Separator { - Material { - diffuseColor 0 1 0 - } - Cube { - width 3180 - height 1280 - depth 3180 - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 400 0 1 - } - DEF box_WSSBox_13 Separator { - Material { - diffuseColor 0 0 1 - } - Cube { - width 3180 - height 2 - depth 3180 - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 460 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 520 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 580 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 640 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 700 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 760 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 820 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 880 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 940 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1060 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1120 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1180 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1240 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1300 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1360 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1420 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1480 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1540 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1600 0 1 - } - USE box_WSSBox_13 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 -1220 1 - } - DEF tubs_CUTubsR_14 Separator { - ShapeHints { - vertexOrdering COUNTERCLOCKWISE - shapeType SOLID - faceType CONVEX - } - Material { - diffuseColor 1 1 1 - } - Coordinate3 { - point [ - 1512.5 1512.5 305, - 1069.5 1852.43 305, - 553.614 2066.12 305, - 1.30972e-13 2139 305, - 1512.5 1512.5 -305, - 1069.5 1852.43 -305, - 553.614 2066.12 -305, - 1.30972e-13 2139 -305, - 1234.86 1234.86 305, - 873.18 1512.39 305, - 451.991 1686.85 305, - 1.0693e-13 1746.36 305, - 1234.86 1234.86 -305, - 873.18 1512.39 -305, - 451.991 1686.85 -305, - 1.0693e-13 1746.36 -305, - ] - } - IndexedFaceSet { - coordIndex [ - 0, 4, 5, 1, -1, - 1, 5, 6, 2, -1, - 2, 6, 7, 3, -1, - 12, 8, 9, 13, -1, - 13, 9, 10, 14, -1, - 14, 10, 11, 15, -1, - 8, 0, 1, 9, -1, - 9, 1, 2, 10, -1, - 10, 2, 3, 11, -1, - 4, 12, 13, 5, -1, - 5, 13, 14, 6, -1, - 6, 14, 15, 7, -1, - 0, 8, 12, 4, -1, - 7, 15, 11, 3, -1, - ] - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 -1220 1 - } - DEF tubs_CRTubsR_15 Separator { - ShapeHints { - vertexOrdering COUNTERCLOCKWISE - shapeType SOLID - faceType CONVEX - } - Material { - diffuseColor 1 1 1 - } - Coordinate3 { - point [ - 1505.43 1505.43 305, - 1064.5 1843.77 305, - 551.026 2056.46 305, - 1.30359e-13 2129 305, - 1505.43 1505.43 -305, - 1064.5 1843.77 -305, - 551.026 2056.46 -305, - 1.30359e-13 2129 -305, - 1234.86 1234.86 305, - 873.18 1512.39 305, - 451.991 1686.85 305, - 1.0693e-13 1746.36 305, - 1234.86 1234.86 -305, - 873.18 1512.39 -305, - 451.991 1686.85 -305, - 1.0693e-13 1746.36 -305, - ] - } - IndexedFaceSet { - coordIndex [ - 0, 4, 5, 1, -1, - 1, 5, 6, 2, -1, - 2, 6, 7, 3, -1, - 12, 8, 9, 13, -1, - 13, 9, 10, 14, -1, - 14, 10, 11, 15, -1, - 8, 0, 1, 9, -1, - 9, 1, 2, 10, -1, - 10, 2, 3, 11, -1, - 4, 12, 13, 5, -1, - 5, 13, 14, 6, -1, - 6, 14, 15, 7, -1, - 0, 8, 12, 4, -1, - 7, 15, 11, 3, -1, - ] - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 -1220 1 - } - DEF tubs_CUTubsL_16 Separator { - ShapeHints { - vertexOrdering COUNTERCLOCKWISE - shapeType SOLID - faceType CONVEX - } - Material { - diffuseColor 1 1 1 - } - Coordinate3 { - point [ - 1.30972e-13 2139 305, - -553.614 2066.12 305, - -1069.5 1852.43 305, - -1512.5 1512.5 305, - 1.30972e-13 2139 -305, - -553.614 2066.12 -305, - -1069.5 1852.43 -305, - -1512.5 1512.5 -305, - 1.0693e-13 1746.36 305, - -451.991 1686.85 305, - -873.18 1512.39 305, - -1234.86 1234.86 305, - 1.0693e-13 1746.36 -305, - -451.991 1686.85 -305, - -873.18 1512.39 -305, - -1234.86 1234.86 -305, - ] - } - IndexedFaceSet { - coordIndex [ - 0, 4, 5, 1, -1, - 1, 5, 6, 2, -1, - 2, 6, 7, 3, -1, - 12, 8, 9, 13, -1, - 13, 9, 10, 14, -1, - 14, 10, 11, 15, -1, - 8, 0, 1, 9, -1, - 9, 1, 2, 10, -1, - 10, 2, 3, 11, -1, - 4, 12, 13, 5, -1, - 5, 13, 14, 6, -1, - 6, 14, 15, 7, -1, - 0, 8, 12, 4, -1, - 7, 15, 11, 3, -1, - ] - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 -1220 1 - } - DEF tubs_CRTubsL_17 Separator { - ShapeHints { - vertexOrdering COUNTERCLOCKWISE - shapeType SOLID - faceType CONVEX - } - Material { - diffuseColor 1 1 1 - } - Coordinate3 { - point [ - 1.30359e-13 2129 305, - -551.026 2056.46 305, - -1064.5 1843.77 305, - -1505.43 1505.43 305, - 1.30359e-13 2129 -305, - -551.026 2056.46 -305, - -1064.5 1843.77 -305, - -1505.43 1505.43 -305, - 1.0693e-13 1746.36 305, - -451.991 1686.85 305, - -873.18 1512.39 305, - -1234.86 1234.86 305, - 1.0693e-13 1746.36 -305, - -451.991 1686.85 -305, - -873.18 1512.39 -305, - -1234.86 1234.86 -305, - ] - } - IndexedFaceSet { - coordIndex [ - 0, 4, 5, 1, -1, - 1, 5, 6, 2, -1, - 2, 6, 7, 3, -1, - 12, 8, 9, 13, -1, - 13, 9, 10, 14, -1, - 14, 10, 11, 15, -1, - 8, 0, 1, 9, -1, - 9, 1, 2, 10, -1, - 10, 2, 3, 11, -1, - 4, 12, 13, 5, -1, - 5, 13, 14, 6, -1, - 6, 14, 15, 7, -1, - 0, 8, 12, 4, -1, - 7, 15, 11, 3, -1, - ] - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 -610 1 - } - USE tubs_CUTubsR_14 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 -610 1 - } - USE tubs_CRTubsR_15 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 -610 1 - } - USE tubs_CUTubsL_16 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 -610 1 - } - USE tubs_CRTubsL_17 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 0 1 - } - USE tubs_CUTubsR_14 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 0 1 - } - USE tubs_CRTubsR_15 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 0 1 - } - USE tubs_CUTubsL_16 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 0 1 - } - USE tubs_CRTubsL_17 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 610 1 - } - USE tubs_CUTubsR_14 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 610 1 - } - USE tubs_CRTubsR_15 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 610 1 - } - USE tubs_CUTubsL_16 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 610 1 - } - USE tubs_CRTubsL_17 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 1220 1 - } - USE tubs_CUTubsR_14 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 1220 1 - } - USE tubs_CRTubsR_15 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 1220 1 - } - USE tubs_CUTubsL_16 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 1000 1220 1 - } - USE tubs_CRTubsL_17 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 4100 0 1 - } - DEF box_muCh_18 Separator { - Material { - diffuseColor 1 1 1 - } - Cube { - width 8000 - height 200 - depth 8000 - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 4250 0 1 - } - DEF box_muFe_19 Separator { - Material { - diffuseColor 1 1 1 - } - Cube { - width 8000 - height 100 - depth 8000 - } - } -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 4400 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 4550 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 4700 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 4850 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 5000 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 5150 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 5300 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 5450 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 5550 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 5700 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 5850 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 5950 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 6100 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 6250 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 6350 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 6500 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 6650 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 6750 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 6900 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 7050 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 7150 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 7300 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 7450 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 7550 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 7700 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 7850 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 7950 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 8100 0 1 - } - USE box_muCh_18 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 8250 0 1 - } - USE box_muFe_19 -} -Separator { - MatrixTransform { - matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 8350 0 1 - } - USE box_muFe_19 -} -#End of file. diff --git a/source/visualization/VRML/include/G4FRClient.hh b/source/visualization/VRML/include/G4FRClient.hh deleted file mode 100644 index 71230c2d9a..0000000000 --- a/source/visualization/VRML/include/G4FRClient.hh +++ /dev/null @@ -1,71 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4FRClient.hh -// Yasuhide Sawada and Satoshi Tanaka - -#ifndef WIN32 - -#ifdef G4VIS_BUILD_VRML_DRIVER - -#ifndef G4_FR_CLIENT_HH -#define G4_FR_CLIENT_HH - -#include "globals.hh" - -class FRClient; - -class G4FRClient { - // G4FRClient can SEND only! -public: - G4FRClient(); - virtual ~G4FRClient(); - - G4bool connect(const char *hostname, G4int port); - void close(); - - G4int getPort() const; - - G4bool isConnected() const { return connected; } - G4bool is_open () const { return connected; } - - G4FRClient& operator << (G4int); - G4FRClient& operator << (G4double); - G4FRClient& operator << (const char *); - G4FRClient& operator << (G4FRClient& (*)(G4FRClient&)); -private: - FRClient *fFRClient; - G4bool connected; - G4int fPort; -}; - -//manipulator -//G4FRClient& endl(G4FRClient&); - -#endif //G4_FR_CLIENT_HH -#endif //G4VIS_BUILD_VRML_DRIVER -#endif //WIN32 diff --git a/source/visualization/VRML/include/G4VRML1.hh b/source/visualization/VRML/include/G4VRML1.hh deleted file mode 100644 index 886eaaa910..0000000000 --- a/source/visualization/VRML/include/G4VRML1.hh +++ /dev/null @@ -1,68 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML1.hh -// Yasuhide Sawada and Satoshi Tanaka - -#ifndef WIN32 - -#if defined (G4VIS_BUILD_VRML_DRIVER) || defined (G4VIS_USE_VRML) - -#ifndef G4VRML1_HH -#define G4VRML1_HH - -#include "G4VGraphicsSystem.hh" -#include "FRClient.h" - -class G4VSceneHandler; - -//#define FR_VRML_DEFAULT_PORT 40801 -//#define FR_VRML_PORT_ENV "FR_VRML_PORT" -//#define FR_VRML_HOST_NAME_ENV "FR_VRML_HOST_NAME" - -#include "G4VRMLNetConfig.hh" - -class G4VRML1: public G4VGraphicsSystem { -public: - G4VRML1(); - virtual ~G4VRML1(); - G4VSceneHandler* CreateSceneHandler(const G4String& name = ""); - G4VViewer* CreateViewer(G4VSceneHandler&, const G4String& name = ""); - -public: - const G4String& getHostName() { return fHostName; } - G4int getPort() { return fPort; } - -private: - G4String fHostName; - G4int fPort; - -}; - -#endif //G4VRML1_HH -#endif //G4VIS_BUILD_VRML_DRIVER -#endif //WIN32 diff --git a/source/visualization/VRML/include/G4VRML1FileSceneHandler.hh b/source/visualization/VRML/include/G4VRML1FileSceneHandler.hh deleted file mode 100644 index 9869438504..0000000000 --- a/source/visualization/VRML/include/G4VRML1FileSceneHandler.hh +++ /dev/null @@ -1,121 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML1FileSceneHandler.hh -// Satoshi Tanaka & Yasuhide Sawada - -#ifndef G4VRML1FILE_SCENE_HANDLER_HH -#define G4VRML1FILE_SCENE_HANDLER_HH - -#include - -#include "globals.hh" -#include "G4LogicalVolume.hh" -#include "G4VSceneHandler.hh" - - -class G4VRML1File; -class G4VisAttributes; - -class G4VRML1FileSceneHandler: public G4VSceneHandler { - - friend class G4VRML1FileViewer; - -// methods (public) -public: - G4VRML1FileSceneHandler(G4VRML1File& system, const G4String& name = ""); - virtual ~G4VRML1FileSceneHandler(); - - using G4VSceneHandler::AddSolid; - void AddSolid(const G4Box&); - void AddSolid(const G4Cons&); - void AddSolid(const G4Tubs&); - void AddSolid(const G4Trd&); - void AddSolid(const G4Trap&); - void AddSolid(const G4Sphere&); - void AddSolid(const G4Para&); - void AddSolid(const G4Torus&); - void AddSolid(const G4VSolid&); - - using G4VSceneHandler::AddCompound; - - void BeginPrimitives(const G4Transform3D& objectTransformation); - void EndPrimitives(); - - using G4VSceneHandler::AddPrimitive; - void AddPrimitive(const G4Polyline&); - void AddPrimitive(const G4Polyhedron&); - void AddPrimitive(const G4Text&); - void AddPrimitive(const G4Circle&); - void AddPrimitive(const G4Square&); - - void ClearTransientStore(); // Used for triggering detector re-drawing. - - void BeginModeling(); - void EndModeling(); - - void VRMLBeginModeling(); - void VRMLEndModeling(); - - void connectPort(); - void closePort(); - -// methods (private) -private: - - void SendMaterialNode( const G4VisAttributes* pAV ); // NEW NEW NEW - void SendMaterialNode(); - void SendMatrixTransformNode(const G4Transform3D &); - void SendCubeNode(G4double, G4double, G4double); - void SendCylinderNode(G4double, G4double); - void SendSphereNode(G4double); - - void SendMarkerColor ( const G4VMarker& mark ) ; - void SendMarkerWorldPosition ( const G4VMarker& mark ) ; - G4double GetMarkerHalfSize ( const G4VMarker& mark ) ; - - G4bool isConnected () { return fFlagDestOpen ; } - -// data -private: - char fVRMLFileDestDir[256] ; - char fVRMLFileName[256] ; - - G4String fCurrentDEF; - - G4VRML1File& fSystem; // Graphics system for this scene. - std::ofstream fDest ; - G4bool fFlagDestOpen ; - - G4int fMaxFileNum ; - - static G4int fSceneIdCount; - -}; - -#endif //G4VRML1FILE_SCENE_HANDLER_HH - diff --git a/source/visualization/VRML/include/G4VRML1SceneHandler.hh b/source/visualization/VRML/include/G4VRML1SceneHandler.hh deleted file mode 100644 index 1fbed42be4..0000000000 --- a/source/visualization/VRML/include/G4VRML1SceneHandler.hh +++ /dev/null @@ -1,118 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML1SceneHandler.hh -// Yasuhide Sawada & Satoshi Tanaka - -#ifndef WIN32 - - -#ifdef G4VIS_BUILD_VRML_DRIVER - -#ifndef G4VRML1_SCENE_HANDLER_HH -#define G4VRML1_SCENE_HANDLER_HH - - -#include "globals.hh" -#include "G4LogicalVolume.hh" -#include "G4VSceneHandler.hh" - -#include "G4FRClient.hh" - -class G4VRML1; -class G4VisAttributes; - -class G4VRML1SceneHandler: public G4VSceneHandler { - - enum { MAX_CONNECTION_TRIAL = 10 } ; - -// methods (public) -public: - G4VRML1SceneHandler(G4VRML1& system, const G4String& name = ""); - virtual ~G4VRML1SceneHandler(); - - using G4VSceneHandler::AddSolid; - void AddSolid(const G4Box&); - void AddSolid(const G4Cons&); - void AddSolid(const G4Tubs&); - void AddSolid(const G4Trd&); - void AddSolid(const G4Trap&); - void AddSolid(const G4Sphere&); - void AddSolid(const G4Para&); - void AddSolid(const G4Torus&); - void AddSolid(const G4VSolid&); - - using G4VSceneHandler::AddCompound; - - void BeginPrimitives(const G4Transform3D& objectTransformation); - void EndPrimitives(); - - using G4VSceneHandler::AddPrimitive; - void AddPrimitive(const G4Polyline&); - void AddPrimitive(const G4Polyhedron&); - void AddPrimitive(const G4Text&); - void AddPrimitive(const G4Circle&); - void AddPrimitive(const G4Square&); - - void ClearTransientStore(); // Used for triggering detector re-drawing. - - void BeginModeling(); - void EndModeling(); - - void VRMLBeginModeling(); - void VRMLEndModeling(); - - void connectPort(int max_trial = MAX_CONNECTION_TRIAL ); - void closePort(); - -// methods (private) -private: - void SendMaterialNode( const G4VisAttributes* pAV ); - void SendMaterialNode(); - void SendMatrixTransformNode(const G4Transform3D &); - void SendCubeNode(G4double, G4double, G4double); - void SendCylinderNode(G4double, G4double); - void SendSphereNode(G4double); - - void SendMarkerColor ( const G4VMarker& mark ) ; - void SendMarkerWorldPosition ( const G4VMarker& mark ) ; - G4double GetMarkerHalfSize ( const G4VMarker& mark ) ; - -// data -private: - G4String fCurrentDEF; - - G4VRML1& fSystem; // Graphics system for this scene. - G4FRClient fDest ; - - static G4int fSceneIdCount; - -}; - -#endif //G4VRML1_SCENE_HH -#endif //G4VIS_BUILD_VRML_DRIVER -#endif //WIN32 diff --git a/source/visualization/VRML/include/G4VRML2.hh b/source/visualization/VRML/include/G4VRML2.hh deleted file mode 100644 index c817099872..0000000000 --- a/source/visualization/VRML/include/G4VRML2.hh +++ /dev/null @@ -1,67 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML2.hh -// Satoshi Tanaka and Yasuhide Sawada - -#ifndef WIN32 - -#if defined (G4VIS_BUILD_VRML_DRIVER) || defined (G4VIS_USE_VRML) - -#ifndef G4VRML2_HH -#define G4VRML2_HH - -#include "G4VGraphicsSystem.hh" -#include "FRClient.h" - -class G4VSceneHandler; - -#include "G4VRMLNetConfig.hh" - //#define FR_VRML_DEFAULT_PORT 40801 - //#define FR_VRML_PORT_ENV "FR_VRML_PORT" - //#define FR_VRML_HOST_NAME_ENV "FR_VRML_HOST_NAME" - -class G4VRML2: public G4VGraphicsSystem { -public: - G4VRML2(); - virtual ~G4VRML2(); - G4VSceneHandler* CreateSceneHandler(const G4String& name = ""); - G4VViewer* CreateViewer(G4VSceneHandler&, const G4String& name = ""); - -public: - const G4String& getHostName() { return fHostName; } - G4int getPort() { return fPort; } - -private: - G4String fHostName; - G4int fPort; - -}; - -#endif //G4VRML2_HH -#endif //G4VIS_BUILD_VRML_DRIVER -#endif //WIN32 diff --git a/source/visualization/VRML/include/G4VRML2File.hh b/source/visualization/VRML/include/G4VRML2File.hh index 139be55833..a40b1053aa 100644 --- a/source/visualization/VRML/include/G4VRML2File.hh +++ b/source/visualization/VRML/include/G4VRML2File.hh @@ -35,13 +35,13 @@ class G4VSceneHandler; -class G4VRML2File: public G4VGraphicsSystem { -public: - G4VRML2File(); - virtual ~G4VRML2File(); - G4VSceneHandler* CreateSceneHandler(const G4String& name = ""); - G4VViewer* CreateViewer(G4VSceneHandler&, const G4String& name = ""); - +class G4VRML2File : public G4VGraphicsSystem +{ + public: + G4VRML2File(); + virtual ~G4VRML2File(); + G4VSceneHandler* CreateSceneHandler(const G4String& name = ""); + G4VViewer* CreateViewer(G4VSceneHandler&, const G4String& name = ""); }; -#endif //G4VRML2FILE_HH +#endif // G4VRML2FILE_HH diff --git a/source/visualization/VRML/include/G4VRML2FileSceneHandler.hh b/source/visualization/VRML/include/G4VRML2FileSceneHandler.hh index 889dce892d..86296e63df 100644 --- a/source/visualization/VRML/include/G4VRML2FileSceneHandler.hh +++ b/source/visualization/VRML/include/G4VRML2FileSceneHandler.hh @@ -37,94 +37,89 @@ #include "G4LogicalVolume.hh" #include "G4VSceneHandler.hh" - class G4VRML2File; class G4VisAttributes; -class G4VRML2FileSceneHandler: public G4VSceneHandler { - +class G4VRML2FileSceneHandler : public G4VSceneHandler +{ friend class G4VRML2FileViewer; -// methods (public) -public: - G4VRML2FileSceneHandler(G4VRML2File& system, const G4String& name = ""); - virtual ~G4VRML2FileSceneHandler(); + // methods (public) + public: + G4VRML2FileSceneHandler(G4VRML2File& system, const G4String& name = ""); + virtual ~G4VRML2FileSceneHandler(); - using G4VSceneHandler::AddSolid; - void AddSolid(const G4Box&); - void AddSolid(const G4Cons&); - void AddSolid(const G4Tubs&); - void AddSolid(const G4Trd&); - void AddSolid(const G4Trap&); - void AddSolid(const G4Sphere&); - void AddSolid(const G4Para&); - void AddSolid(const G4Torus&); - void AddSolid(const G4VSolid&); + using G4VSceneHandler::AddSolid; + void AddSolid(const G4Box&); + void AddSolid(const G4Cons&); + void AddSolid(const G4Tubs&); + void AddSolid(const G4Trd&); + void AddSolid(const G4Trap&); + void AddSolid(const G4Sphere&); + void AddSolid(const G4Para&); + void AddSolid(const G4Torus&); + void AddSolid(const G4VSolid&); - using G4VSceneHandler::AddCompound; + using G4VSceneHandler::AddCompound; - void BeginPrimitives(const G4Transform3D& objectTransformation); - void EndPrimitives(); + void BeginPrimitives(const G4Transform3D& objectTransformation); + void EndPrimitives(); - using G4VSceneHandler::AddPrimitive; - void AddPrimitive(const G4Polyline&); - void AddPrimitive(const G4Polyhedron&); - void AddPrimitive(const G4Text&); - void AddPrimitive(const G4Circle&); - void AddPrimitive(const G4Square&); + using G4VSceneHandler::AddPrimitive; + void AddPrimitive(const G4Polyline&); + void AddPrimitive(const G4Polyhedron&); + void AddPrimitive(const G4Text&); + void AddPrimitive(const G4Circle&); + void AddPrimitive(const G4Square&); - void ClearTransientStore(); // Used for triggering detector re-drawing. + void ClearTransientStore(); // Used for triggering detector re-drawing. - void BeginModeling(); - void EndModeling(); + void BeginModeling(); + void EndModeling(); - void VRMLBeginModeling(); - void VRMLEndModeling(); + void VRMLBeginModeling(); + void VRMLEndModeling(); - void connectPort(); - void closePort(); + void connectPort(); + void closePort(); -// methods (private) -private: + // methods (private) + private: + void SendMaterialNode(const G4VisAttributes* pAV); + void SendMaterialNode(); - void SendMaterialNode ( const G4VisAttributes* pAV ); - void SendMaterialNode (); + void SendLineColor(const G4VisAttributes* pAV); + void SendMarkerColor(const G4VMarker& mark); + void SendMarkerWorldPosition(const G4VMarker& mark); - void SendLineColor ( const G4VisAttributes* pAV ); - void SendMarkerColor ( const G4VMarker& mark ) ; - void SendMarkerWorldPosition ( const G4VMarker& mark ) ; + G4double GetMarkerHalfSize(const G4VMarker& mark); + void GetMarkerWorldPosition(const G4VMarker& mark, double* pX, double* pY, + double* pZ); - G4double GetMarkerHalfSize ( const G4VMarker& mark ) ; - void GetMarkerWorldPosition ( const G4VMarker& mark , - double* pX , - double* pY , - double* pZ ) ; + G4bool isConnected() { return fFlagDestOpen; } - G4bool isConnected () { return fFlagDestOpen ; } + G4bool IsPVPickable() { return fPVPickable; } + void SetPVPickability(G4bool on_off) { fPVPickable = on_off; } + G4double SetPVTransparency(); + G4double GetPVTransparency() { return fPVTransparency; } - G4bool IsPVPickable () { return fPVPickable ;} - void SetPVPickability ( G4bool on_off ) { fPVPickable = on_off ;} - G4double SetPVTransparency () ; - G4double GetPVTransparency () { return fPVTransparency ; } + // data + private: + char fVRMLFileDestDir[256]; + char fVRMLFileName[256]; -// data -private: - char fVRMLFileDestDir[256] ; - char fVRMLFileName[256] ; + G4VRML2File& fSystem; // Graphics system for this scene. + G4bool fFlagDestOpen; - G4VRML2File& fSystem; // Graphics system for this scene. - G4bool fFlagDestOpen ; + G4int fMaxFileNum; - G4int fMaxFileNum ; + G4bool fPVPickable; + G4double fPVTransparency; - G4bool fPVPickable ; - G4double fPVTransparency ; - - static G4int fSceneIdCount; - -public: - std::ofstream fDest ; + static G4int fSceneIdCount; + public: + std::ofstream fDest; }; -#endif //G4VRML2FILE_SCENE_HANDLER_HH +#endif // G4VRML2FILE_SCENE_HANDLER_HH diff --git a/source/visualization/VRML/include/G4VRML2FileViewer.hh b/source/visualization/VRML/include/G4VRML2FileViewer.hh index 13472cbcc0..8e0831978e 100644 --- a/source/visualization/VRML/include/G4VRML2FileViewer.hh +++ b/source/visualization/VRML/include/G4VRML2FileViewer.hh @@ -37,25 +37,27 @@ class G4VRML2FileSceneHandler; -class G4VRML2FileViewer: public G4VViewer { -public: - G4VRML2FileViewer(G4VRML2FileSceneHandler& scene, const G4String& name = ""); - virtual ~G4VRML2FileViewer(); - void ClearView(); - void DrawView(); - void ShowView(); - void FinishView(); -private: - void SetView(); // Do nothing. SendViewParameters will do its job. - void SendViewParameters () ; +class G4VRML2FileViewer : public G4VViewer +{ + public: + G4VRML2FileViewer(G4VRML2FileSceneHandler& scene, const G4String& name = ""); + virtual ~G4VRML2FileViewer(); + void ClearView(); + void DrawView(); + void ShowView(); + void FinishView(); -private: - G4VRML2FileSceneHandler& fSceneHandler; // Reference to Graphics Scene for this view. - std::ofstream& fDest ; + private: + void SetView(); // Do nothing. SendViewParameters will do its job. + void SendViewParameters(); - G4double fViewHalfAngle ; - G4double fsin_VHA ; + private: + G4VRML2FileSceneHandler& + fSceneHandler; // Reference to Graphics Scene for this view. + std::ofstream& fDest; + G4double fViewHalfAngle; + G4double fsin_VHA; }; -#endif //G4VRML2FILE_VIEWER_HH +#endif // G4VRML2FILE_VIEWER_HH diff --git a/source/visualization/VRML/include/G4VRML2SceneHandler.hh b/source/visualization/VRML/include/G4VRML2SceneHandler.hh deleted file mode 100644 index f1379bd8ec..0000000000 --- a/source/visualization/VRML/include/G4VRML2SceneHandler.hh +++ /dev/null @@ -1,127 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML2SceneHandler.hh -// Satoshi Tanaka & Yasuhide Sawada - -#ifndef WIN32 - -#ifdef G4VIS_BUILD_VRML_DRIVER - -#ifndef G4VRML2_SCENE_HANDLER_HH -#define G4VRML2_SCENE_HANDLER_HH - -#include "globals.hh" -#include "G4LogicalVolume.hh" -#include "G4VSceneHandler.hh" - -#include "G4FRClient.hh" - -class G4VRML2; -class G4VisAttributes; - -class G4VRML2SceneHandler: public G4VSceneHandler { - - enum { MAX_CONNECTION_TRIAL = 10 } ; - -// methods (public) -public: - G4VRML2SceneHandler(G4VRML2& system, const G4String& name = ""); - virtual ~G4VRML2SceneHandler(); - - using G4VSceneHandler::AddSolid; - void AddSolid(const G4Box&); - void AddSolid(const G4Cons&); - void AddSolid(const G4Tubs&); - void AddSolid(const G4Trd&); - void AddSolid(const G4Trap&); - void AddSolid(const G4Sphere&); - void AddSolid(const G4Para&); - void AddSolid(const G4Torus&); - void AddSolid(const G4VSolid&); - - using G4VSceneHandler::AddCompound; - - void BeginPrimitives(const G4Transform3D& objectTransformation); - void EndPrimitives(); - - using G4VSceneHandler::AddPrimitive; - void AddPrimitive(const G4Polyline&); - void AddPrimitive(const G4Polyhedron&); - void AddPrimitive(const G4Text&); - void AddPrimitive(const G4Circle&); - void AddPrimitive(const G4Square&); - - void ClearTransientStore(); // Used for triggering detector re-drawing. - - void BeginModeling(); - void EndModeling(); - - void VRMLBeginModeling(); - void VRMLEndModeling(); - - void connectPort(int max_trial = MAX_CONNECTION_TRIAL ); - void closePort(); - -// methods (private) -private: - void SendMaterialNode ( const G4VisAttributes* pAV ); - void SendMaterialNode (); - - void SendLineColor ( const G4VisAttributes* pAV ); - void SendMarkerColor ( const G4VMarker& mark ) ; - void SendMarkerWorldPosition ( const G4VMarker& mark ) ; - - G4double GetMarkerHalfSize ( const G4VMarker& mark ) ; - void GetMarkerWorldPosition ( const G4VMarker& mark , - double* pX , - double* pY , - double* pZ ) ; - - G4bool IsPVPickable () { return fPVPickable ;} - void SetPVPickability ( G4bool on_off ) { fPVPickable = on_off ;} - G4double SetPVTransparency () ; - G4double GetPVTransparency () { return fPVTransparency ; } - -// data -private: - - G4VRML2& fSystem; // Graphics system for this scene. - - G4bool fPVPickable ; - G4double fPVTransparency ; - - static G4int fSceneIdCount; - -public: - G4FRClient fDest ; - -}; - -#endif //G4VRML2_SCENE_HH -#endif //G4VIS_BUILD_VRML_DRIVER -#endif //WIN32 diff --git a/source/visualization/VRML/include/G4VRML2Viewer.hh b/source/visualization/VRML/include/G4VRML2Viewer.hh deleted file mode 100644 index 05ece3aaf8..0000000000 --- a/source/visualization/VRML/include/G4VRML2Viewer.hh +++ /dev/null @@ -1,67 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML2Viewer.hh -// Satoshi Tanaka & Yasuhide Sawada - -#ifndef WIN32 - -#ifdef G4VIS_BUILD_VRML_DRIVER - -#ifndef G4VRML2_VIEWER_HH -#define G4VRML2_VIEWER_HH - -#include "G4VViewer.hh" -#include "globals.hh" - -#include "G4FRClient.hh" - -class G4VRML2SceneHandler; - -class G4VRML2Viewer: public G4VViewer { -public: - G4VRML2Viewer(G4VRML2SceneHandler& scene, const G4String& name = ""); - virtual ~G4VRML2Viewer(); - void ClearView(); - void DrawView(); - void ShowView(); - void FinishView(); -private: - void SetView(); // Do nothing. SendViewParameters will do its job. - void SendViewParameters () ; - -private: - G4VRML2SceneHandler& fSceneHandler; // Reference to Graphics Scene for this view. - G4FRClient& fDest ; - - G4double fViewHalfAngle ; - G4double fsin_VHA ; -}; - -#endif //G4VRML2_VIEW_HH -#endif //G4VIS_BUILD_VRML_DRIVER -#endif //WIN32 diff --git a/source/visualization/VRML/include/G4VRMLNetConfig.hh b/source/visualization/VRML/include/G4VRMLNetConfig.hh deleted file mode 100644 index d7dc737fcf..0000000000 --- a/source/visualization/VRML/include/G4VRMLNetConfig.hh +++ /dev/null @@ -1,44 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRMLNetConfig.hh -// Satoshi Tanaka - -#ifndef WIN32 - -#ifdef G4VIS_BUILD_VRML_DRIVER - -#ifndef G4VRML_NET_CONFIG_HH -#define G4VRML_NET_CONFIG_HH - -const int FR_VRML_DEFAULT_PORT = 40801 ; -const char FR_VRML_PORT_ENV [] = "G4VRML_PORT" ; -const char FR_VRML_HOST_NAME_ENV[] = "G4VRML_HOST_NAME" ; - -#endif // G4VRML_NET_CONFIG_HH -#endif // G4VIS_BUILD_VRML_DRIVER -#endif //WIN32 diff --git a/source/visualization/VRML/sources.cmake b/source/visualization/VRML/sources.cmake index 772ea8182f..133b46534c 100644 --- a/source/visualization/VRML/sources.cmake +++ b/source/visualization/VRML/sources.cmake @@ -1,58 +1,16 @@ # - G4VRML module build definition -# Module has optional sources -# List those always built -set(G4VIS_VRML_MODULE_HEADERS - G4VRML1File.hh - G4VRML1FileSceneHandler.hh - G4VRML1FileViewer.hh - G4VRML2File.hh - G4VRML2FileSceneHandler.hh - G4VRML2FileViewer.hh) - -set(G4VIS_VRML_MODULE_SOURCES - G4VRML1File.cc - G4VRML1FileSceneHandler.cc - G4VRML1FileViewer.cc - G4VRML1SceneHandlerFunc.icc - G4VRML2File.cc - G4VRML2FileSceneHandler.cc - G4VRML2FileViewer.cc - G4VRML2SceneHandlerFunc.icc) - -# VRML Network drivers only if user selected -if(GEANT4_USE_NETWORKVRML) - list(APPEND G4VIS_VRML_MODULE_HEADERS - FRClient.h - G4FRClient.hh - G4VRML1.hh - G4VRML1SceneHandler.hh - G4VRML1Viewer.hh - G4VRML2.hh - G4VRML2SceneHandler.hh - G4VRML2Viewer.hh - G4VRMLNetConfig.hh) - - list(APPEND G4VIS_VRML_MODULE_SOURCES - FRClient.cc - G4FRClient.cc - G4VRML1.cc - G4VRML1SceneHandler.cc - G4VRML1Viewer.cc - G4VRML2.cc - G4VRML2SceneHandler.cc - G4VRML2Viewer.cc) - - # Add extra needed defs here - add_definitions(-DG4VIS_BUILD_VRML_DRIVER) -endif() - # Define the Geant4 Module. geant4_add_module(G4VRML PUBLIC_HEADERS - ${G4VIS_VRML_MODULE_HEADERS} + G4VRML2File.hh + G4VRML2FileSceneHandler.hh + G4VRML2FileViewer.hh SOURCES - ${G4VIS_VRML_MODULE_SOURCES}) + G4VRML2File.cc + G4VRML2FileSceneHandler.cc + G4VRML2FileViewer.cc + G4VRML2SceneHandlerFunc.icc) geant4_module_link_libraries(G4VRML PUBLIC diff --git a/source/visualization/VRML/src/FRClient.cc b/source/visualization/VRML/src/FRClient.cc deleted file mode 100644 index 6cd2d4059a..0000000000 --- a/source/visualization/VRML/src/FRClient.cc +++ /dev/null @@ -1,158 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// FRClient.cc -// FukuiRenderer Client -// Yasuhide Sawada & Satoshi Tanaka - - -//=================// -#ifndef WIN32 -//=================// - - -//=================// -#ifdef G4VIS_BUILD_VRML_DRIVER -//=================// - - -#include "G4ios.hh" -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "G4VisManager.hh" -#include "FRClient.h" - -FRClient::FRClient() -{ - fd = -1; - create(); -} - -FRClient::~FRClient() -{ - close(); -} - -int FRClient::create() -{ - /* stream socket */ - fd = socket(AF_INET, SOCK_STREAM, 0); - if (fd < 0) - fputs("error: socket.\n", stderr); - return fd; -} - - - -int FRClient::connect(const char *hostname, int port_) -{ - // local variables - struct sockaddr_in sa; - struct hostent *hp; - - // set port ( sa.sin_family, sa.sin_port ) - port = port_; // Store port number to data member - memset( (char *)&sa, '\0', sizeof(sa)) ; - sa.sin_family = AF_INET; - sa.sin_port = htons(port); - - // set server host ( sa.sin_addr ) - if (hostname == NULL) { - hostname = "localhost"; - // reset arg - } - hp = gethostbyname(hostname) ; - if ( !hp ) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "ERROR: gethostbyname() failed" << G4endl; - return -1; - } - - memcpy( (char * )&sa.sin_addr, (char * )hp->h_addr, hp->h_length ); - - // make connection to server - if (::connect(fd, (struct sockaddr *)&sa, sizeof(sa)) == -1) { - fputs("error: connect\n", stderr); - return -1; - } - - // return file descripter (data member) - return fd; -} - - - -int FRClient::send(const char *sendbuf) -{ - int len = strlen(sendbuf); - - if (::send(fd, sendbuf, len, 0) < 0) { - fputs("error: Send()\n", stderr); - len = -1; - } - return len; -} - -int FRClient::receive(char *recvbuf) -{ - int len; - - memset(recvbuf, '\0', FRSendLength + 1); - len = ::recv(fd, recvbuf, FRSendLength, 0); - if(len < 0) { - fputs("error: Receive()\n", stderr); - len = -1; - } - return len; -} - -int FRClient::close() -{ - /* - shutdown :argument '2' means shutdown both send and receive. - */ - if (::shutdown(fd, 2) < 0) { - fputs("error: shutdown\n", stderr); - return -1; - } - ::close(fd); - return 0; -} - -#endif //G4VIS_BUILD_VRML_DRIVER - -#endif // WIN32 diff --git a/source/visualization/VRML/src/G4FRClient.cc b/source/visualization/VRML/src/G4FRClient.cc deleted file mode 100644 index 9ca9995125..0000000000 --- a/source/visualization/VRML/src/G4FRClient.cc +++ /dev/null @@ -1,123 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4FRClient.cc -// Yasuhide Sawada & Satoshi Tanaka - - -//=================// -#ifndef WIN32 -//=================// - - -//=================// -#ifdef G4VIS_BUILD_VRML_DRIVER -//=================// - - -#include -#include "G4FRClient.hh" -#include "FRClient.h" - -G4FRClient::G4FRClient() -{ - fFRClient = NULL; - fPort = -1; - connected = false; -} - -G4FRClient::~G4FRClient() -{ - if (connected) - this->close(); -} - -G4bool G4FRClient::connect(const char *hostname, G4int port) -{ - if (connected) - return false; - - delete fFRClient; - fFRClient = new FRClient(); - - fPort = port; - connected = (fFRClient->connect(hostname, port) < 0) ? false : true ; - - return connected; -} - -void G4FRClient::close() -{ - delete fFRClient; - fFRClient = NULL; - connected = false; -} - -G4int G4FRClient::getPort() const -{ - return fPort; -} - -G4FRClient& G4FRClient::operator << (G4int val) -{ - char buf[64]; - sprintf(buf, "%d", val); - fFRClient->send(buf); - return *this; -} - -G4FRClient& G4FRClient::operator << (G4double val) -{ - char buf[64]; - sprintf(buf, "%g", val); - fFRClient->send(buf); - return *this; -} - -G4FRClient& G4FRClient::operator << (const char *pval) -{ - fFRClient->send(pval); - return *this; -} - -G4FRClient& G4FRClient::operator << (G4FRClient& (*func)(G4FRClient&)) -{ - return func(*this); -} - -//////////////////////////////////////// -////manipulator -//G4FRClient& endl(G4FRClient& c) -//{ -// return c << "\n"; -//} -/////////////////////////////////////// - -#endif //G4VIS_BUILD_VRML_DRIVER - -#endif //WIN32 - diff --git a/source/visualization/VRML/src/G4VRML1FileSceneHandler.cc b/source/visualization/VRML/src/G4VRML1FileSceneHandler.cc deleted file mode 100644 index ac17ab63b8..0000000000 --- a/source/visualization/VRML/src/G4VRML1FileSceneHandler.cc +++ /dev/null @@ -1,227 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML1FileSceneHandler.cc -// Satoshi Tanaka & Yasuhide Sawada - - -//#define DEBUG_FR_SCENE - -#include -#include -#include -#include -#include -#include - -#include "globals.hh" -#include "G4VisManager.hh" -#include "G4Scene.hh" -#include "G4VPhysicalVolume.hh" -#include "G4LogicalVolume.hh" -#include "G4Point3D.hh" -#include "G4VisAttributes.hh" -#include "G4Polyhedron.hh" -#include "G4Box.hh" -#include "G4Cons.hh" -#include "G4Polyline.hh" -#include "G4Trd.hh" -#include "G4Tubs.hh" -#include "G4Trap.hh" -#include "G4Para.hh" -#include "G4Torus.hh" -#include "G4Sphere.hh" -#include "G4Text.hh" -#include "G4Circle.hh" -#include "G4Square.hh" - -#include "G4VRML1FileSceneHandler.hh" -#include "G4VRML1FileViewer.hh" -#include "G4VRML1File.hh" - -// CONST - -const char WRL_FILE_HEADER [] = "g4_"; -const char DEFAULT_WRL_FILE_NAME[] = "g4.wrl"; -const char ENV_VRML_VIEWER [] = "G4VRMLFILE_VIEWER"; -const char NO_VRML_VIEWER [] = "NONE"; -const char VRMLFILE_DEST_DIR [] = "G4VRMLFILE_DEST_DIR"; -const int DEFAULT_MAX_WRL_FILE_NUM = 100 ; - -G4VRML1FileSceneHandler::G4VRML1FileSceneHandler(G4VRML1File& system, const G4String& name) : - G4VSceneHandler(system, fSceneIdCount++, name), - fSystem(system), - fDest() , - fFlagDestOpen( false ) -{ - fCurrentDEF = ""; - strcpy(fVRMLFileName, ""); - - if ( std::getenv( VRMLFILE_DEST_DIR ) == NULL ) { - strcpy( fVRMLFileDestDir, "" ); - } else { - strcpy( fVRMLFileDestDir, std::getenv( VRMLFILE_DEST_DIR ) ); - } - - // maximum number of g4.wrl files in the dest directory - fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM ; // initialization - if ( std::getenv( "G4VRMLFILE_MAX_FILE_NUM" ) != NULL ) { - - sscanf( std::getenv("G4VRMLFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum ) ; - - } else { - fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM ; - } - if( fMaxFileNum < 1 ) { fMaxFileNum = 1; } - -} - - -G4VRML1FileSceneHandler::~G4VRML1FileSceneHandler() -{ -#if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** ~G4VRML1FileSceneHandler" << G4endl; -#endif - VRMLEndModeling(); -} - - -#define G4VRML1SCENEHANDLER G4VRML1FileSceneHandler -#define IS_CONNECTED this->isConnected() -#include "G4VRML1SceneHandlerFunc.icc" -#undef IS_CONNECTED -#undef G4VRML1SCENEHANDLER - - -void G4VRML1FileSceneHandler::connectPort() -{ - // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_INDEX.wrl - const int MAX_FILE_INDEX = fMaxFileNum - 1 ; - - // dest directory (null if no environmental variables is set) - strcpy ( fVRMLFileName, fVRMLFileDestDir) ; - - // create (full) path name (default) - strcat ( fVRMLFileName, DEFAULT_WRL_FILE_NAME ); - - // Determine VRML file name - for( int i = 0 ; i < fMaxFileNum ; i++) { - - // Message in the final execution - if( i == MAX_FILE_INDEX ) - { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "===========================================" << G4endl; - G4cout << "WARNING MESSAGE from VRML1FILE driver: " << G4endl; - G4cout << " This file name is the final one in the " << G4endl; - G4cout << " automatic updation of the output file name." << G4endl; - G4cout << " You may overwrite existing files, i.e. " << G4endl; - G4cout << " g4_XX.wrl. " << G4endl; - G4cout << "===========================================" << G4endl; - } - } - - // re-determine file name as G4VRMLFILE_DEST_DIR/g4_XX.wrl - std::ostringstream filename; - filename - << fVRMLFileDestDir << WRL_FILE_HEADER - << std::setw(2) << std::setfill('0') << i << ".wrl"; - strncpy(fVRMLFileName,filename.str().c_str(),sizeof(fVRMLFileName)-1); - fVRMLFileName[sizeof(fVRMLFileName)-1] = '\0'; - - // check validity of the file name - std::ifstream fin ; - fin.open(fVRMLFileName) ; - if(!fin) { - // new file - fin.close(); - break; - } else { - // already exists (try next) - fin.close(); - } - - - } // for - - // open a VRML 1.0 file with determined file name - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "===========================================" << G4endl; - G4cout << "Output VRML 1.0 file: " << fVRMLFileName << G4endl; - G4cout << "Maximum number of files in the destination directory: " << fMaxFileNum << G4endl; - G4cout << " (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM) " << G4endl; - G4cout << "===========================================" << G4endl; - } - fDest.open(fVRMLFileName) ; fFlagDestOpen = true ; -} - - -void G4VRML1FileSceneHandler::closePort() -{ - char command[256] ; - char viewer [256] ; - strcpy( viewer, NO_VRML_VIEWER ); // initialization - if( std::getenv( ENV_VRML_VIEWER ) ) { - strcpy( viewer, std::getenv( ENV_VRML_VIEWER ) ) ; - } - - // close VRML file - fDest.close(); fFlagDestOpen = false ; - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "*** VRML 1.0 File " << fVRMLFileName << " is generated." << G4endl; - - - // Invoke viewer - - if ( !strcmp(viewer, NO_VRML_VIEWER )) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "MESSAGE from VRML1FILE driver:" << G4endl; - G4cout << " Set an environmental variable " ; - G4cout << ENV_VRML_VIEWER << G4endl; - G4cout << " if you want to visualize the generated VRML file" << G4endl; - G4cout << " automatically. For example, " << G4endl; - G4cout << " setenv " << ENV_VRML_VIEWER << " vrweb " << G4endl; - } - } else { - std::ostringstream ossCommand; - ossCommand << viewer << ' ' << fVRMLFileName; - strncpy(command,ossCommand.str().c_str(),sizeof(command)-1); - command[sizeof(command)-1] = '\0'; - int iErr = system( command ); - if ( iErr != 0 ) { - G4ExceptionDescription ed; - ed << "Error " << iErr - << " when calling system with \"" << command - << "\"."; - G4Exception("G4VRML1FileSceneHandler::closePort()", - "VRML-1006", JustWarning, ed); - } - } -} - -G4int G4VRML1FileSceneHandler::fSceneIdCount = 0; diff --git a/source/visualization/VRML/src/G4VRML1FileViewer.cc b/source/visualization/VRML/src/G4VRML1FileViewer.cc deleted file mode 100644 index 6f3f1f256a..0000000000 --- a/source/visualization/VRML/src/G4VRML1FileViewer.cc +++ /dev/null @@ -1,105 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRMLView.cc -// Satoshi Tanaka & Yasuhide Sawada - - -//#define DEBUG_FR_VIEW - -#include "G4VisManager.hh" -#include "G4Scene.hh" -#include "G4VRML1FileViewer.hh" -#include "G4VRML1FileSceneHandler.hh" -#include "G4VRML1File.hh" -#include "G4ios.hh" - -G4VRML1FileViewer::G4VRML1FileViewer(G4VRML1FileSceneHandler& sceneHandler, - const G4String& name) : - G4VViewer(sceneHandler, - sceneHandler.IncrementViewCount(), - name), - fSceneHandler(sceneHandler) -{} - -G4VRML1FileViewer::~G4VRML1FileViewer() -{} - -void G4VRML1FileViewer::SetView() -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1FileViewer::SetView(): No effects" << G4endl; -#endif -} - -void G4VRML1FileViewer::DrawView() -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1FileViewer::DrawView()" << G4endl; -#endif - - fSceneHandler.VRMLBeginModeling(); - - // Here is a minimal DrawView() function. - NeedKernelVisit(); - ProcessView(); - FinishView(); -} - -void G4VRML1FileViewer::ClearView(void) -{ - #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1File1View::ClearView()" << G4endl; - #endif - if(fSceneHandler.fFlagDestOpen) { - fSceneHandler.fDest.close(); - // Re-open with same filename... - fSceneHandler.fDest.open(fSceneHandler.fVRMLFileName); - fSceneHandler.fDest << "#VRML V1.0 ascii" << "\n"; - fSceneHandler.fDest << "# Generated by VRML 1.0 driver of GEANT4\n" << "\n"; - } -} - -void G4VRML1FileViewer::ShowView(void) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1FileViewer::ShowView()" << G4endl; -#endif - fSceneHandler.VRMLEndModeling(); -} - -void G4VRML1FileViewer::FinishView(void) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1FileViewer::FinishView(): No effects" << G4endl; -#endif -} diff --git a/source/visualization/VRML/src/G4VRML1SceneHandler.cc b/source/visualization/VRML/src/G4VRML1SceneHandler.cc deleted file mode 100644 index 3fdd82dd24..0000000000 --- a/source/visualization/VRML/src/G4VRML1SceneHandler.cc +++ /dev/null @@ -1,142 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML1SceneHandler.cc -// Yasuhide Sawada and Satoshi Tanaka - -#ifndef WIN32 - -//=================// -#ifdef G4VIS_BUILD_VRML_DRIVER -//=================// - - -//#define DEBUG_FR_SCENE - -#include -#include - -#include "globals.hh" -#include "G4VisManager.hh" -#include "G4VPhysicalVolume.hh" -#include "G4LogicalVolume.hh" -#include "G4Point3D.hh" -#include "G4Scene.hh" -#include "G4VisAttributes.hh" -#include "G4Polyhedron.hh" -#include "G4Box.hh" -#include "G4Cons.hh" -#include "G4Polyline.hh" -#include "G4Trd.hh" -#include "G4Tubs.hh" -#include "G4Trap.hh" -#include "G4Para.hh" -#include "G4Torus.hh" -#include "G4Sphere.hh" -#include "G4Text.hh" -#include "G4Circle.hh" -#include "G4Square.hh" - -#include "G4VRML1SceneHandler.hh" -#include "G4VRML1Viewer.hh" -#include "G4VRML1.hh" - - - -G4VRML1SceneHandler::G4VRML1SceneHandler(G4VRML1& system, const G4String& name) : - G4VSceneHandler(system, fSceneIdCount++, name), - fSystem(system), - fDest() -{ - fCurrentDEF = ""; -} - - -G4VRML1SceneHandler::~G4VRML1SceneHandler() -{ -#if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** ~G4VRML1SceneHandler" << G4endl; -#endif -} - - - -#define G4VRML1SCENEHANDLER G4VRML1SceneHandler -#define IS_CONNECTED fDest.isConnected() -#include "G4VRML1SceneHandlerFunc.icc" -#undef IS_CONNECTED -#undef G4VRML1SCENEHANDLER - - -void G4VRML1SceneHandler::connectPort(G4int max_trial) -{ - G4int trial = 0 ; - int port = fSystem.getPort(); - for (trial = 0; !fDest.isConnected()&& trial < max_trial; trial++, port++ ) { - if (fDest.connect( (const char * )fSystem.getHostName(), port)) { - // INET domain connection is established - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "*** GEANT4 is connected to port "; - G4cout << fDest.getPort(); - G4cout << " of server " << fSystem.getHostName() << G4endl; - } - break; - } else { - // Connection failed. Try the next port. - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "*** GEANT4 incremented targeting port to "; - G4cout << port << G4endl; - } - } - - sleep (1); - - } // for - - if (!fDest.isConnected()) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "*** INET Connection failed. " << G4endl; - G4cout << " Maybe, you have not invoked viewer g4vrmlview yet, " << G4endl; - G4cout << " or too many viewers are already running in the " << G4endl; - G4cout << " server host(" << fSystem.getHostName() << "). " << G4endl; - } - } -} - -void G4VRML1SceneHandler::closePort() -{ - fDest.close(); - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "*** INET Connection closed. " << G4endl; -} - - -G4int G4VRML1SceneHandler::fSceneIdCount = 0; - -#endif -#endif diff --git a/source/visualization/VRML/src/G4VRML1SceneHandlerFunc.icc b/source/visualization/VRML/src/G4VRML1SceneHandlerFunc.icc deleted file mode 100644 index 1c3e575112..0000000000 --- a/source/visualization/VRML/src/G4VRML1SceneHandlerFunc.icc +++ /dev/null @@ -1,747 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML1SceneHandlerFunc.icc -// Satoshi Tanaka & Yasuhide Sawada - -#include - -#include "G4VisManager.hh" - -//#define DEBUG_SCENE_FUNC - -// MACRO -#define ADDTHIS_WITH_NAME(Solid) \ - fCurrentDEF = #Solid "_" + Solid.GetName(); \ - RequestPrimitives(Solid); \ - fCurrentDEF = ""; - -// End of MACRO - -void G4VRML1SCENEHANDLER::AddSolid(const G4Trd& trd) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid trd" << "\n" ; -#endif - VRMLBeginModeling () ; - ADDTHIS_WITH_NAME(trd) -} - -void G4VRML1SCENEHANDLER::AddSolid(const G4Trap& trap) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid trap" << "\n" ; -#endif - VRMLBeginModeling () ; - ADDTHIS_WITH_NAME(trap) -} - -void G4VRML1SCENEHANDLER::AddSolid(const G4Para& para) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid para" << "\n" ; -#endif - VRMLBeginModeling () ; - ADDTHIS_WITH_NAME(para) -} - -void G4VRML1SCENEHANDLER::AddSolid(const G4Torus& torus ) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid torus" << "\n" ; -#endif - VRMLBeginModeling () ; - ADDTHIS_WITH_NAME(torus) -} - - -void G4VRML1SCENEHANDLER::AddSolid(const G4VSolid& vsolid) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid vsolid" << "\n" ; -#endif - VRMLBeginModeling () ; - ADDTHIS_WITH_NAME(vsolid) -} - -void G4VRML1SCENEHANDLER::AddSolid(const G4Tubs& tubs) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid tubs" << "\n" ; -#endif - VRMLBeginModeling () ; - - // set current name - fCurrentDEF = "tubs_" + tubs.GetName(); - - // Get data - const G4double R = tubs.GetOuterRadius(); // outside radius - const G4double r = tubs.GetInnerRadius(); // inside radius - const G4double dz = tubs.GetZHalfLength(); // half length in z - const G4double dp = tubs.GetDeltaPhiAngle(); // angle interval - - // Send data - if ( r == 0.0 && dp >= 360. * CLHEP::deg ) { - // Send a built-in VRML node (Cylinder) - fDest << "Separator {" << "\n"; - SendMatrixTransformNode( fObjectTransformation ); - - fDest << "\t" << "DEF " << fCurrentDEF << " Separator {" << "\n"; - SendMaterialNode(); - SendCylinderNode(R, dz * 2); - fDest << "\t" << "}" << "\n"; // DEF Separator - fDest << "}" << "\n"; // Separator - } else { - // call AddPrimitive(Polyhedron) - RequestPrimitives(tubs); - } - - // reset current name to null - fCurrentDEF = ""; -} - - -void G4VRML1SCENEHANDLER::AddSolid(const G4Cons& cons) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid cons" << "\n" ; -#endif - VRMLBeginModeling () ; - - // set current name - fCurrentDEF = "cons_" + cons.GetName(); - - // Get data - const G4double r1 = cons.GetInnerRadiusMinusZ(); // inside radius at -dz - const G4double R1 = cons.GetOuterRadiusMinusZ(); // outside radius at -dz - const G4double r2 = cons.GetInnerRadiusPlusZ(); // inside radius at +dz - const G4double R2 = cons.GetOuterRadiusPlusZ(); // outside radius at +dz - const G4double dz = cons.GetZHalfLength(); // half length in z - //const G4double sp = cons.GetStartPhiAngle(); // starting angle - const G4double dp = cons.GetDeltaPhiAngle(); // angle width - - // Send data - if ( r1 == 0.0 && r2 == 0.0 && R1 == R2 && dp >= 360. * CLHEP::deg) { - // Send a built-in VRML node (Cylinder) - fDest << "Separator {" << "\n"; - SendMatrixTransformNode( fObjectTransformation ); - - fDest << "\t" << "DEF " << fCurrentDEF << " Separator {" << "\n"; - SendMaterialNode(); - SendCylinderNode(R1, dz * 2); - fDest << "\t" << "}" << "\n"; // DEF Separator - fDest << "}" << "\n"; // Separator - } else { - // call AddPrimitive(Polyhedron) - RequestPrimitives(cons); - } - - // reset current name to null - fCurrentDEF = ""; -} - -void G4VRML1SCENEHANDLER::AddSolid(const G4Box& box) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid box" << "\n" ; -#endif - VRMLBeginModeling () ; - - // set current name - fCurrentDEF = "box_" + box.GetName(); - - // Send a built-in VRML node (Cube) - fDest << "Separator {" << "\n"; - - //fDest << "\t" << "renderCulling ON" << "\n"; - SendMatrixTransformNode( fObjectTransformation ); - - fDest << "\t" << "DEF " << fCurrentDEF << " Separator {" << "\n"; - SendMaterialNode(); - SendCubeNode(box.GetXHalfLength() * 2, box.GetYHalfLength() * 2, box.GetZHalfLength() * 2); - fDest << "\t" << "}" << "\n"; // DEF Separator - - fDest << "}" << "\n"; // Separator - - // reset current name to null - fCurrentDEF = ""; -} - - -void G4VRML1SCENEHANDLER::AddSolid(const G4Sphere& sphere) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid sphere" << "\n" ; -#endif - VRMLBeginModeling () ; - - // set current name - fCurrentDEF = "sphere_" + sphere.GetName(); - - // Get data - G4double dphi = sphere.GetDeltaPhiAngle () ; - G4double dtheta = sphere.GetDeltaThetaAngle() ; - G4double rmax = sphere.GetOuterRadius () ; - G4double rmin = sphere.GetInnerRadius () ; - - // Send data - if ( (dphi >= 360. * CLHEP::deg) && (dtheta >= 180. * CLHEP::deg) && (rmin == 0.0) ) { - // Send a built-in VRML node (Sphere) - fDest << "Separator {" << "\n"; - SendMatrixTransformNode( fObjectTransformation ); - - fDest << "\t" << "DEF " << fCurrentDEF << " Separator {" << "\n"; - SendMaterialNode(); - SendSphereNode( rmax ); - fDest << "\t" << "}" << "\n"; // DEF Separator - fDest << "}" << "\n"; // Separator - } else { - // call AddPrimitive(Polyhedron) - RequestPrimitives( sphere ); - } - - // reset current name to null - fCurrentDEF = ""; -} - -void G4VRML1SCENEHANDLER::AddPrimitive(const G4Polyline& polyline) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive polyline" << "\n" ; -#endif - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML1SCENEHANDLER::AddPrimitive (const G4Polyline&)", - "VRML-1001", JustWarning, - "2D polylines not implemented. Ignored."); - } - return; - } - - VRMLBeginModeling () ; - - fDest << "Separator {" << "\n"; - - SendMatrixTransformNode (fObjectTransformation ); - - SendMaterialNode( polyline.GetVisAttributes() ); - - fDest << "\t" << "Coordinate3 {" << "\n"; - fDest << "\t\t" << "point [" << "\n"; - G4int e, i; - for (i = 0, e = polyline.size(); e; i++, e--) { - fDest << "\t\t\t"; - fDest << polyline[i].x() << " "; - fDest << polyline[i].y() << " "; - fDest << polyline[i].z() << "," << "\n"; - } - fDest << "\t\t" << "]" << "\n"; - fDest << "\t" << "}" << "\n"; // Coordinate3 - - fDest << "\t" << "IndexedLineSet {" << "\n"; - fDest << "\t\t" << "coordIndex ["; - for (i = 0, e = polyline.size(); e; i++, e--) { - if (i % 10 == 0) - fDest << "\n" << "\t\t\t"; - fDest << i << ", "; - } - fDest << "-1" << "\n"; - fDest << "\t\t" << "]" << "\n"; - fDest << "\t" << "}" << "\n"; // IndexedLineSet - - fDest << "}" << "\n"; // Separator -} - -void G4VRML1SCENEHANDLER::AddPrimitive(const G4Polyhedron& polyhedron) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive(G4Polyhedron)" << "\n"; -#endif - - if (polyhedron.GetNoFacets() == 0) return; - - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML1SCENEHANDLER::AddPrimitive (const G4Polyhedron&)", - "VRML-1002", JustWarning, - "2D polyhedra not implemented. Ignored."); - } - return; - } - - VRMLBeginModeling () ; - - fDest << "Separator {" << "\n"; - - SendMatrixTransformNode( fObjectTransformation ); - - fDest << "\t"; - if (fCurrentDEF != "") - fDest << "DEF " << fCurrentDEF << " "; - - fDest << "Separator {" << "\n"; - - //fDest << "\t\t" << "renderCulling ON" << "\n"; - - fDest << "\t\t" << "ShapeHints {" << "\n"; - fDest << "\t\t\t" << "vertexOrdering COUNTERCLOCKWISE" << "\n"; - fDest << "\t\t\t" << "shapeType SOLID" << "\n"; - fDest << "\t\t\t" << "faceType CONVEX" << "\n"; - fDest << "\t\t" << "}" << "\n"; - - SendMaterialNode(); - - fDest << "\t\t" << "Coordinate3 {" << "\n"; - fDest << "\t\t\t" << "point [" << "\n"; - G4int i, j; - for (i = 1, j = polyhedron.GetNoVertices(); j; j--, i++) { - G4Point3D point = polyhedron.GetVertex(i); - fDest << "\t\t\t\t"; - fDest << point.x() << " "; - fDest << point.y() << " "; - fDest << point.z() << "," << "\n"; - } - fDest << "\t\t\t" << "]" << "\n"; - fDest << "\t\t" << "}" << "\n"; // Coordinate3 - - fDest << "\t\t" << "IndexedFaceSet {" << "\n"; - fDest << "\t\t\t" << "coordIndex [" << "\n"; - - // facet loop - G4int f; - for (f = polyhedron.GetNoFacets(); f; f--) { - - // edge loop - G4bool notLastEdge; - G4int index = -1, edgeFlag = 1; - fDest << "\t\t\t\t"; - do { - notLastEdge = polyhedron.GetNextVertexIndex(index, edgeFlag); - fDest << index - 1 << ", "; - } while (notLastEdge); - fDest << "-1," << "\n"; - } - fDest << "\t\t\t" << "]" << "\n"; - fDest << "\t\t" << "}" << "\n"; // IndexFaceSet - - fDest << "\t" << "}" << "\n"; // (DEF) Separator - fDest << "}" << "\n"; // Separator - -} - -void G4VRML1SCENEHANDLER::AddPrimitive( const G4Text& ) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive text" << "\n" ; -#endif - /*** You might need this - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML1SCENEHANDLER::AddPrimitive (const G4Text&)", - "VRML-1003", JustWarning, - "2D text not implemented. Ignored."); - } - return; - } - ***/ - - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << - "***** void G4VRML1SCENEHANDLER::AddPrimitive( const G4Text& text )" - " not implemented yet." - << "\n"; - - VRMLBeginModeling () ; -} - -void G4VRML1SCENEHANDLER::AddPrimitive( const G4Circle& circle ) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive circle" << "\n" ; -#endif - - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML1SCENEHANDLER::AddPrimitive (const G4Circle&)", - "VRML-1004", JustWarning, - "2D circles not implemented. Ignored."); - } - return; - } - - VRMLBeginModeling () ; - - // begin sending a mark - fDest << "Separator {" << "\n"; - - // send color - SendMarkerColor ( circle ) ; - - // position - SendMarkerWorldPosition ( circle ) ; - - // Calc size - G4double size = GetMarkerHalfSize ( circle ); - - // send shape with size - fDest << "\t" << "Sphere {" << "\n"; - fDest << "\t\t" << "radius " << size << "\n"; - fDest << "\t" << "}" << "\n"; - - // end sending a mark - fDest << "}" << "\n"; // Separator -} - - -void G4VRML1SCENEHANDLER::AddPrimitive(const G4Square& square) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive square" << "\n" ; -#endif - - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML1SCENEHANDLER::AddPrimitive (const G4Square&)", - "VRML-1005", JustWarning, - "2D squares not implemented. Ignored."); - } - return; - } - - VRMLBeginModeling () ; - - // begin sending a mark - fDest << "Separator {" << "\n"; - - // send color - SendMarkerColor ( square ); - - // position - SendMarkerWorldPosition ( square ); - - // Calc size - G4double size = GetMarkerHalfSize ( square ); - size *= 2.; - - // send shape with size - fDest << "\t" << "Cube {" << "\n"; - fDest << "\t\t" << "width " << size << "\n"; - fDest << "\t\t" << "height " << size << "\n"; - fDest << "\t\t" << "depth " << size << "\n"; - fDest << "\t" << "}" << "\n"; - - // end sending a mark - fDest << "}" << "\n"; // Separator -} - -void G4VRML1SCENEHANDLER::BeginModeling() -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** BeginModeling " << "\n" ; -#endif - G4VSceneHandler::BeginModeling(); -} - -void G4VRML1SCENEHANDLER::EndModeling() -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** EndModeling " << "\n" ; -#endif - G4VSceneHandler::EndModeling(); -} - -void G4VRML1SCENEHANDLER::BeginPrimitives(const G4Transform3D& objectTransformation) -{ - G4VSceneHandler::BeginPrimitives (objectTransformation); -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** BeginPrimitives " << "\n" ; -#endif - VRMLBeginModeling(); -} - -void G4VRML1SCENEHANDLER::EndPrimitives() -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** EndPrimitives " << "\n" ; -#endif - G4VSceneHandler::EndPrimitives(); -} - -void G4VRML1SCENEHANDLER::SendMaterialNode( const G4VisAttributes* pVA ) -{ -// const double TRANSPARENCY = 0.9 ; - const double TRANSPARENCY = 0.5 ; - - if (!pVA) - return; - - const G4Color& color = pVA->GetColor(); - - fDest << "\t\t" << "Material {" << "\n"; - - if (pVA->IsForceDrawingStyle() && - (pVA->GetForcedDrawingStyle() == G4VisAttributes::wireframe)) { - fDest << "\t\t\t" << "transparency " << TRANSPARENCY << "\n"; - } - - fDest << "\t\t\t" << "diffuseColor"; - fDest << " " << color.GetRed(); - fDest << " " << color.GetGreen(); - fDest << " " << color.GetBlue(); - fDest << "\n"; - fDest << "\t\t" << "}" << "\n"; -} - - -void G4VRML1SCENEHANDLER::SendMaterialNode() -{ - SendMaterialNode - ( fpViewer->GetApplicableVisAttributes (fpVisAttribs) ); -} - - -void G4VRML1SCENEHANDLER::SendMatrixTransformNode(const G4Transform3D& trans) -{ - G4Point3D B (0.0, 0.0, 0.0); - - G4Point3D x1 (1.0, 0.0, 0.0); - G4Point3D y1 (0.0, 1.0, 0.0); - - G4Vector3D e1 (1.0, 0.0, 0.0); - G4Vector3D e2 (0.0, 1.0, 0.0); - G4Vector3D e3 (0.0, 0.0, 1.0); - - //----- transformed origin of body coord - B.transform(trans); - - //----- transformed base vectors of body coord - x1.transform(trans); - e1 = x1 - B; - - y1.transform(trans); - e2 = y1 - B; - - e3 = e1.cross(e2); - - e1 = e1.unit(); // normalize again for accuracy - e2 = e2.unit(); // - e3 = e3.unit(); // - - fDest << "\t" << "MatrixTransform {" << "\n"; - fDest << "\t\t" << "matrix "; - fDest << e1.x() << " " << e1.y() << " " << e1.z() << " 0 "; - fDest << e2.x() << " " << e2.y() << " " << e2.z() << " 0 "; - fDest << e3.x() << " " << e3.y() << " " << e3.z() << " 0 "; - fDest << B.x() << " " << B.y() << " " << B.z() << " 1" << "\n"; - fDest << "\t" << "}" << "\n"; -} - -void G4VRML1SCENEHANDLER::SendCubeNode(G4double w, G4double h, G4double d) -{ - fDest << "\t\t" << "Cube {" << "\n"; - fDest << "\t\t\t" << "width " << w << "\n"; - fDest << "\t\t\t" << "height " << h << "\n"; - fDest << "\t\t\t" << "depth " << d << "\n"; - fDest << "\t\t" << "}" << "\n"; -} - -void G4VRML1SCENEHANDLER::SendCylinderNode(G4double R, G4double h) -{ - fDest << "\t\t" << "Transform {" << "\n"; - fDest << "\t\t\t" << "rotation 1 0 0 " << (90. * CLHEP::deg) << "\n"; - fDest << "\t\t" << "}" << "\n"; - - fDest << "\t\t" << "Cylinder {" << "\n"; - fDest << "\t\t\t" << "radius " << R << "\n"; - fDest << "\t\t\t" << "height " << h << "\n"; - fDest << "\t\t" << "}" << "\n"; -} - -void G4VRML1SCENEHANDLER::SendSphereNode(G4double R) -{ - fDest << "\t\t" << "Sphere {" << "\n"; - fDest << "\t\t\t" << "radius " << R << "\n"; - fDest << "\t\t" << "}" << "\n"; -} - -void G4VRML1SCENEHANDLER::VRMLBeginModeling() -{ - if (!IS_CONNECTED ) { -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** VRMLBeginModeling() (started)" << "\n" ; -#endif - this->connectPort(); - fDest << "#VRML V1.0 ascii" << "\n"; - fDest << "# Generated by VRML 1.0 driver of GEANT4\n" << "\n"; - } -} - -void G4VRML1SCENEHANDLER::VRMLEndModeling() -{ - if ( IS_CONNECTED ) { -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** VRMLEndModeling() (started)" << "\n" ; -#endif - - fDest << "#End of file." << "\n"; - this->closePort(); - } -} - -void G4VRML1SCENEHANDLER::SendMarkerColor ( const G4VMarker& marker ) -{ - fpVisAttribs = marker.GetVisAttributes(); - const G4Color& color = GetColor(); - - fDest << "\t" << "Material {" << "\n"; - fDest << "\t\t"; - fDest << "ambientColor [] "; - fDest << "specularColor [] "; - fDest << "\t\t" << "diffuseColor"; - fDest << " " << color.GetRed(); - fDest << " " << color.GetGreen(); - fDest << " " << color.GetBlue(); - fDest << "\n"; - fDest << "\t\t" << "emissiveColor"; - fDest << " " << color.GetRed(); - fDest << " " << color.GetGreen(); - fDest << " " << color.GetBlue(); - fDest << "\n"; - fDest << "\t" << "}" << "\n"; -} - -void -G4VRML1SCENEHANDLER::SendMarkerWorldPosition ( const G4VMarker& mark ) -{ - G4Point3D point = mark.GetPosition(); - - SendMatrixTransformNode( fObjectTransformation ); - - fDest << "\t\t" << "Transform {" << "\n"; - fDest << "\t\t\t" << "translation "; - fDest << point.x() << " " << point.y() << " " << point.z() << "\n"; - fDest << "\t\t" << "}" << "\n" ; -} - - -G4double G4VRML1SCENEHANDLER::GetMarkerHalfSize ( const G4VMarker& mark ) -{ - //----- return value ( marker radius in 3d units) - G4double size = 1.0 ; // initialization - - //----- parameters to calculate 3d size from 2d size - const double HALF_SCREEN_SIZE_2D = 300.0 ; // pixels - double zoom_factor = fpViewer->GetViewParameters().GetZoomFactor() ; - if ( zoom_factor <= 0.0 ) { zoom_factor = 1.0 ; } - double extent_radius_3d = GetScene()->GetExtent().GetExtentRadius() ; - if ( extent_radius_3d <= 0.0 ) { extent_radius_3d = 1.0 ; } - - //----- get marker radius in 3D units - if ( mark.GetWorldSize() > 0.0 ) { - // get mark radius in 3D units - size = 0.5 * mark.GetWorldSize() ; - - } else if ( mark.GetScreenSize() > 0.0 ) { - // local - double mark_radius_2d = 0.5 * mark.GetScreenSize() ; - - // get mark radius in 3D units - size \ - = extent_radius_3d * ( mark_radius_2d / HALF_SCREEN_SIZE_2D ); - size *= zoom_factor ; - - } else { - // local - double mark_radius_2d \ - = fpViewer->GetViewParameters().GetDefaultMarker().GetScreenSize(); - mark_radius_2d *= 0.1 ; // Magic number? - - // get mark radius in 3D units - size \ - = extent_radius_3d * ( mark_radius_2d / HALF_SCREEN_SIZE_2D ); - size *= zoom_factor ; - } - - //----- global rescaling - size *= fpViewer->GetViewParameters().GetGlobalMarkerScale(); - - //----- return size - return size ; - -} - -void G4VRML1SCENEHANDLER::ClearTransientStore() -{ - // This is typically called after an update and before drawing hits - // of the next event. To simulate the clearing of "transients" - // (hits, etc.) the detector is redrawn... - if (fpViewer) { - fpViewer -> SetView (); - fpViewer -> ClearView (); - fpViewer -> DrawView (); - } -} - - -// #undef ADDTHIS_WITH_NAME(Solid) -// #undef MAKE_NAME(Solid) -// End of file. diff --git a/source/visualization/VRML/src/G4VRML1Viewer.cc b/source/visualization/VRML/src/G4VRML1Viewer.cc deleted file mode 100644 index a9382b49cd..0000000000 --- a/source/visualization/VRML/src/G4VRML1Viewer.cc +++ /dev/null @@ -1,104 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRMLView.cc -// Yasuhide Sawada & Satoshi Tanaka - -#ifndef WIN32 - -//=================// -#ifdef G4VIS_BUILD_VRML_DRIVER -//=================// - - -//#define DEBUG_FR_VIEW - -#include "G4VisManager.hh" - -#include "G4Scene.hh" -#include "G4VRML1Viewer.hh" -#include "G4VRML1SceneHandler.hh" -#include "G4VRML1.hh" -#include "G4ios.hh" - -G4VRML1Viewer::G4VRML1Viewer(G4VRML1SceneHandler& scene, const G4String& name) : - G4VViewer(scene, scene.IncrementViewCount(), name), fSceneHandler(scene) -{} - -G4VRML1Viewer::~G4VRML1Viewer() -{} - -void G4VRML1Viewer::SetView() -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1Viewer::SetView(): No effects" << G4endl; -#endif -} - -void G4VRML1Viewer::DrawView() -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1Viewer::DrawView()" << G4endl; -#endif - - fSceneHandler.VRMLBeginModeling(); - - // Here is a minimal DrawView() function. - NeedKernelVisit(); - ProcessView(); - FinishView(); -} - -void G4VRML1Viewer::ClearView(void) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1Viewer::ClearView(): No effects" << G4endl; -#endif -} - -void G4VRML1Viewer::ShowView(void) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1Viewer::ShowView()" << G4endl; -#endif - fSceneHandler.VRMLEndModeling(); -} - -void G4VRML1Viewer::FinishView(void) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML1Viewer::FinishView(): No effects" << G4endl; -#endif -} - -#endif -#endif //WIN32 diff --git a/source/visualization/VRML/src/G4VRML2File.cc b/source/visualization/VRML/src/G4VRML2File.cc index 56b607a5f7..24c752d719 100644 --- a/source/visualization/VRML/src/G4VRML2File.cc +++ b/source/visualization/VRML/src/G4VRML2File.cc @@ -28,8 +28,8 @@ // G4VRML2File.cc // Satoshi Tanaka & Yasuhide Sawada -#include // sscanf -#include // getenv +#include // sscanf +#include // getenv #include "G4VSceneHandler.hh" @@ -37,35 +37,28 @@ #include "G4VRML2FileSceneHandler.hh" #include "G4VRML2FileViewer.hh" -#include "G4FRClient.hh" +G4VRML2File::G4VRML2File() + : G4VGraphicsSystem("VRML2FILE", "VRML2FILE", G4VGraphicsSystem::fileWriter) +{} +G4VRML2File::~G4VRML2File() {} -G4VRML2File::G4VRML2File() : - G4VGraphicsSystem("VRML2FILE", "VRML2FILE", G4VGraphicsSystem::fileWriter -) +G4VSceneHandler* G4VRML2File::CreateSceneHandler(const G4String& name) { + G4VSceneHandler* p = NULL; + + p = new G4VRML2FileSceneHandler(*this, name); + + return p; } -G4VRML2File::~G4VRML2File() +G4VViewer* G4VRML2File::CreateViewer(G4VSceneHandler& scene, + const G4String& name) { -} - - -G4VSceneHandler* G4VRML2File::CreateSceneHandler(const G4String& name) -{ - G4VSceneHandler *p = NULL; - - p = new G4VRML2FileSceneHandler(*this, name); - - return p; -} - -G4VViewer* G4VRML2File::CreateViewer(G4VSceneHandler& scene, const G4String& name) -{ - G4VViewer* pView = NULL; - - G4VRML2FileSceneHandler* pScene = (G4VRML2FileSceneHandler*)&scene; - pView = new G4VRML2FileViewer(*pScene, name); - - return pView; + G4VViewer* pView = NULL; + + G4VRML2FileSceneHandler* pScene = (G4VRML2FileSceneHandler*) &scene; + pView = new G4VRML2FileViewer(*pScene, name); + + return pView; } diff --git a/source/visualization/VRML/src/G4VRML2FileSceneHandler.cc b/source/visualization/VRML/src/G4VRML2FileSceneHandler.cc index bfee8ee76c..8a045e45a1 100644 --- a/source/visualization/VRML/src/G4VRML2FileSceneHandler.cc +++ b/source/visualization/VRML/src/G4VRML2FileSceneHandler.cc @@ -28,7 +28,6 @@ // G4VRML2FileSceneHandler.cc // Satoshi Tanaka & Yasuhide Sawada - //#define DEBUG_FR_SCENE #include @@ -63,179 +62,214 @@ // CONST -const char WRL_FILE_HEADER [] = "g4_"; -const char DEFAULT_WRL_FILE_NAME[] = "g4.wrl"; -const char ENV_VRML_VIEWER [] = "G4VRMLFILE_VIEWER"; -const char NO_VRML_VIEWER [] = "NONE"; -const char VRMLFILE_DEST_DIR [] = "G4VRMLFILE_DEST_DIR"; -const int DEFAULT_MAX_WRL_FILE_NUM = 100 ; +const char WRL_FILE_HEADER[] = "g4_"; +const char ENV_WRL_FILE_HEADER[] = "G4VRMLFILE_HEADER"; +const char ENV_WRL_FILE_NAME[] = "G4VRMLFILE_FILE_NAME"; +const char ENV_VRML_VIEWER[] = "G4VRMLFILE_VIEWER"; +const char NO_VRML_VIEWER[] = "NONE"; +const char VRMLFILE_DEST_DIR[] = "G4VRMLFILE_DEST_DIR"; +const int DEFAULT_MAX_WRL_FILE_NUM = 100; - -G4VRML2FileSceneHandler::G4VRML2FileSceneHandler(G4VRML2File& system, const G4String& name) : - G4VSceneHandler(system, fSceneIdCount++, name), - fSystem(system), - fFlagDestOpen( false ), - fPVPickable ( false ), - fDest() +G4VRML2FileSceneHandler::G4VRML2FileSceneHandler(G4VRML2File& system, + const G4String& name) + : G4VSceneHandler(system, fSceneIdCount++, name) + , fSystem(system) + , fFlagDestOpen(false) + , fPVPickable(false) + , fDest() { - // output file name - strcpy(fVRMLFileName, ""); + // output file name + strcpy(fVRMLFileName, ""); - // destination directory - if ( std::getenv( VRMLFILE_DEST_DIR ) == NULL ) { - strcpy( fVRMLFileDestDir, "" ); - } else { - strcpy( fVRMLFileDestDir, std::getenv( VRMLFILE_DEST_DIR ) ); - } + // destination directory + if(std::getenv(VRMLFILE_DEST_DIR) == NULL) + { + strcpy(fVRMLFileDestDir, ""); + } + else + { + strcpy(fVRMLFileDestDir, std::getenv(VRMLFILE_DEST_DIR)); + } + // maximum number of g4.prim files in the dest directory + fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM; // initialization + if(std::getenv("G4VRMLFILE_MAX_FILE_NUM") != NULL) + { + sscanf(std::getenv("G4VRMLFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum); + } + else + { + fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM; + } + if(fMaxFileNum < 1) + { + fMaxFileNum = 1; + } - // maximum number of g4.prim files in the dest directory - fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM ; // initialization - if ( std::getenv( "G4VRMLFILE_MAX_FILE_NUM" ) != NULL ) { - - sscanf( std::getenv("G4VRMLFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum ) ; + // PV name pickability + if(std::getenv("G4VRML_PV_PICKABLE") != NULL) + { + int is_pickable; + sscanf(std::getenv("G4VRML_PV_PICKABLE"), "%d", &is_pickable); - } else { - fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM ; - } - if( fMaxFileNum < 1 ) { fMaxFileNum = 1; } - - - // PV name pickability - if( std::getenv( "G4VRML_PV_PICKABLE" ) != NULL ) { - - int is_pickable ; - sscanf( std::getenv("G4VRML_PV_PICKABLE"), "%d", &is_pickable ) ; - - if ( is_pickable ) { SetPVPickability ( true ) ; } - } - - // PV Transparency - SetPVTransparency (); + if(is_pickable) + { + SetPVPickability(true); + } + } + // PV Transparency + SetPVTransparency(); } - G4VRML2FileSceneHandler::~G4VRML2FileSceneHandler() { #if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** ~G4VRML2FileSceneHandler" << G4endl; -#endif - VRMLEndModeling(); + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** ~G4VRML2FileSceneHandler" << G4endl; +#endif + VRMLEndModeling(); } - -#define G4VRML2SCENEHANDLER G4VRML2FileSceneHandler -#define IS_CONNECTED this->isConnected() +#define G4VRML2SCENEHANDLER G4VRML2FileSceneHandler +#define IS_CONNECTED this->isConnected() #include "G4VRML2SceneHandlerFunc.icc" -#undef IS_CONNECTED -#undef G4VRML2SCENEHANDLER - +#undef IS_CONNECTED +#undef G4VRML2SCENEHANDLER void G4VRML2FileSceneHandler::connectPort() { - // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_INDEX.wrl - const int MAX_FILE_INDEX = fMaxFileNum - 1 ; + // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_INDEX.wrl + const int MAX_FILE_INDEX = fMaxFileNum - 1; - // dest directory (null if no environmental variables is set) - strcpy ( fVRMLFileName, fVRMLFileDestDir) ; + // dest directory (null if no environmental variables is set) + strcpy(fVRMLFileName, fVRMLFileDestDir); + // add filename if environment variable supplied + if(std::getenv(ENV_WRL_FILE_NAME)) + { + strcat(fVRMLFileName, std::getenv(ENV_WRL_FILE_NAME)); + } + else + { + // Determine VRML file name + for(int i = 0; i < fMaxFileNum; i++) + { + // Message in the final execution + if(i == MAX_FILE_INDEX) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "===========================================" << G4endl; + G4cout << "WARNING MESSAGE from VRML2FILE driver: " << G4endl; + G4cout << " This file name is the final one in the " << G4endl; + G4cout << " automatic updation of the output file name." << G4endl; + G4cout << " You may overwrite existing files, i.e. " << G4endl; + G4cout << " g4_XX.wrl. " << G4endl; + G4cout << "===========================================" << G4endl; + } + } - // create full path name (default) - strcat ( fVRMLFileName, DEFAULT_WRL_FILE_NAME ); + // re-determine file name as G4VRMLFILE_DEST_DIR/g4_XX.wrl + std::ostringstream filename; + filename << fVRMLFileDestDir; + if(std::getenv(ENV_WRL_FILE_HEADER) == NULL) + { + filename << WRL_FILE_HEADER; + } + else + { + filename << std::getenv(ENV_WRL_FILE_HEADER) << '_'; + } + filename << std::setw(2) << std::setfill('0') << i << ".wrl"; + strncpy(fVRMLFileName, filename.str().c_str(), sizeof(fVRMLFileName) - 1); + fVRMLFileName[sizeof(fVRMLFileName) - 1] = '\0'; - // Determine VRML file name - for( int i = 0 ; i < fMaxFileNum ; i++) { + // check validity of the file name + std::ifstream fin; + fin.open(fVRMLFileName); + if(!fin) + { + // new file + fin.close(); + break; + } + else + { + // already exists (try next) + fin.close(); + } - // Message in the final execution - if( i == MAX_FILE_INDEX ) - { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "===========================================" << G4endl; - G4cout << "WARNING MESSAGE from VRML2FILE driver: " << G4endl; - G4cout << " This file name is the final one in the " << G4endl; - G4cout << " automatic updation of the output file name." << G4endl; - G4cout << " You may overwrite existing files, i.e. " << G4endl; - G4cout << " g4_XX.wrl. " << G4endl; - G4cout << "===========================================" << G4endl; - } - } + } // for + } - // re-determine file name as G4VRMLFILE_DEST_DIR/g4_XX.wrl - std::ostringstream filename; - filename - << fVRMLFileDestDir << WRL_FILE_HEADER - << std::setw(2) << std::setfill('0') << i << ".wrl"; - strncpy(fVRMLFileName,filename.str().c_str(),sizeof(fVRMLFileName)-1); - fVRMLFileName[sizeof(fVRMLFileName)-1] = '\0'; - - // check validity of the file name - std::ifstream fin ; - fin.open(fVRMLFileName) ; - if(!fin) { - // new file - fin.close(); - break; - } else { - // already exists (try next) - fin.close(); - } - - } // for - - // open a VRML 2.0 file with determined file name - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "===========================================" << G4endl; - G4cout << "Output VRML 2.0 file: " << fVRMLFileName << G4endl; - G4cout << "Maximum number of files in the destination directory: " << fMaxFileNum << G4endl; - G4cout << " (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM) " << G4endl; - G4cout << "===========================================" << G4endl; - } - fDest.open(fVRMLFileName) ; fFlagDestOpen = true ; + // open a VRML 2.0 file with determined file name + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "===========================================" << G4endl; + G4cout << "Output VRML 2.0 file: " << fVRMLFileName << G4endl; + G4cout << "Maximum number of files in the destination directory: " + << fMaxFileNum << G4endl; + G4cout << " (Customizable with the environment variable: " + "G4VRMLFILE_MAX_FILE_NUM) " + << G4endl; + G4cout << "===========================================" << G4endl; + } + fDest.open(fVRMLFileName); + fFlagDestOpen = true; } - void G4VRML2FileSceneHandler::closePort() { - char command[256] ; - char viewer [256] ; - strcpy( viewer, NO_VRML_VIEWER ); // initialization - if( std::getenv( ENV_VRML_VIEWER ) ) { - strcpy( viewer, std::getenv( ENV_VRML_VIEWER ) ) ; - } + char command[256]; + char viewer[256]; + strcpy(viewer, NO_VRML_VIEWER); // initialization + if(std::getenv(ENV_VRML_VIEWER)) + { + strcpy(viewer, std::getenv(ENV_VRML_VIEWER)); + } - // close VRML file - fDest.close(); fFlagDestOpen = false ; - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "*** VRML 2.0 File " << fVRMLFileName << " is generated." << G4endl; + // close VRML file + fDest.close(); + fFlagDestOpen = false; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "*** VRML 2.0 File " << fVRMLFileName << " is generated." + << G4endl; - - // Invoke viewer + // Invoke viewer - if ( !strcmp(viewer, NO_VRML_VIEWER )) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "MESSAGE from VRML2FILE driver:" << G4endl; - G4cout << " Set an environmental variable " ; - G4cout << ENV_VRML_VIEWER << G4endl; - G4cout << " if you want to visualize the generated VRML file" << G4endl; - G4cout << " automatically. For example, " << G4endl; - G4cout << " setenv " << ENV_VRML_VIEWER << " vrwave " << G4endl; - } - } else { - std::ostringstream ossCommand; - ossCommand << viewer << ' ' << fVRMLFileName; - strncpy(command,ossCommand.str().c_str(),sizeof(command)-1); - command[sizeof(command)-1] = '\0'; - int iErr = system( command ); - if ( iErr != 0 ) { - G4ExceptionDescription ed; - ed << "Error " << iErr - << " when calling system with \"" << command - << "\"."; - G4Exception("G4VRML2FileSceneHandler::closePort()", - "VRML-2006", JustWarning, ed); - } - } + if(!strcmp(viewer, NO_VRML_VIEWER)) + { + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + { + G4cout << "MESSAGE from VRML2FILE driver:" << G4endl; + G4cout << " Set an environmental variable "; + G4cout << ENV_VRML_VIEWER << G4endl; + G4cout << " if you want to visualize the generated VRML file" + << G4endl; + G4cout << " automatically. For example, " << G4endl; + G4cout << " setenv " << ENV_VRML_VIEWER << " vrwave " << G4endl; + G4cout << "ALSO you may change the file header with " + << ENV_WRL_FILE_HEADER << G4endl; + G4cout << " or the whole filename with " << ENV_WRL_FILE_NAME + << G4endl; + } + } + else + { + std::ostringstream ossCommand; + ossCommand << viewer << ' ' << fVRMLFileName; + strncpy(command, ossCommand.str().c_str(), sizeof(command) - 1); + command[sizeof(command) - 1] = '\0'; + int iErr = system(command); + if(iErr != 0) + { + G4ExceptionDescription ed; + ed << "Error " << iErr << " when calling system with \"" << command + << "\"."; + G4Exception("G4VRML2FileSceneHandler::closePort()", "VRML-2006", + JustWarning, ed); + } + } } G4int G4VRML2FileSceneHandler::fSceneIdCount = 0; diff --git a/source/visualization/VRML/src/G4VRML2FileViewer.cc b/source/visualization/VRML/src/G4VRML2FileViewer.cc index dead820085..4f5abe4219 100644 --- a/source/visualization/VRML/src/G4VRML2FileViewer.cc +++ b/source/visualization/VRML/src/G4VRML2FileViewer.cc @@ -28,7 +28,6 @@ // G4VRML2FileViewer.cc // Satoshi Tanaka & Yasuhide Sawada - //#define DEBUG_FR_VIEW #include @@ -42,116 +41,119 @@ #include "G4ios.hh" G4VRML2FileViewer::G4VRML2FileViewer(G4VRML2FileSceneHandler& sceneHandler, - const G4String& name) : - G4VViewer(sceneHandler, - sceneHandler.IncrementViewCount(), - name), - fSceneHandler(sceneHandler), - fDest(sceneHandler.fDest) + const G4String& name) + : G4VViewer(sceneHandler, sceneHandler.IncrementViewCount(), name) + , fSceneHandler(sceneHandler) + , fDest(sceneHandler.fDest) { fViewHalfAngle = 30. * deg; - fsin_VHA = std::sin ( fViewHalfAngle ) ; + fsin_VHA = std::sin(fViewHalfAngle); } -G4VRML2FileViewer::~G4VRML2FileViewer() -{} +G4VRML2FileViewer::~G4VRML2FileViewer() {} void G4VRML2FileViewer::SetView() { #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2FileViewer::SetView(): No effects" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** G4VRML2FileViewer::SetView(): No effects" << G4endl; #endif -// Do nothing, since VRML a browser is running as a different process. -// SendViewParameters () will do this job instead. - + // Do nothing, since VRML a browser is running as a different process. + // SendViewParameters () will do this job instead. } void G4VRML2FileViewer::DrawView() { #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2FileViewer::DrawView()" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** G4VRML2FileViewer::DrawView()" << G4endl; #endif - fSceneHandler.VRMLBeginModeling() ; + fSceneHandler.VRMLBeginModeling(); - // Viewpoint node - SendViewParameters(); + // Viewpoint node + SendViewParameters(); - // Here is a minimal DrawView() function. - NeedKernelVisit(); - ProcessView(); - FinishView(); + // Here is a minimal DrawView() function. + NeedKernelVisit(); + ProcessView(); + FinishView(); } void G4VRML2FileViewer::ClearView(void) { #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2File1View::ClearView()" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** G4VRML2File1View::ClearView()" << G4endl; #endif - if(fSceneHandler.fFlagDestOpen) { + if(fSceneHandler.fFlagDestOpen) + { fSceneHandler.fDest.close(); // Re-open with same filename... fSceneHandler.fDest.open(fSceneHandler.fVRMLFileName); - fSceneHandler.fDest << "#VRML V2.0 utf8" << "\n"; - fSceneHandler.fDest << "# Generated by VRML 2.0 driver of GEANT4\n" << "\n"; + fSceneHandler.fDest << "#VRML V2.0 utf8" + << "\n"; + fSceneHandler.fDest << "# Generated by VRML 2.0 driver of GEANT4\n" + << "\n"; } } void G4VRML2FileViewer::ShowView(void) { #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2FileViewer::ShowView()" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** G4VRML2FileViewer::ShowView()" << G4endl; #endif - fSceneHandler.VRMLEndModeling(); + fSceneHandler.VRMLEndModeling(); } void G4VRML2FileViewer::FinishView(void) { #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2FileViewer::FinishView(): No effects" << G4endl; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** G4VRML2FileViewer::FinishView(): No effects" << G4endl; #endif } -void G4VRML2FileViewer::SendViewParameters () +void G4VRML2FileViewer::SendViewParameters() { // Calculates view representation based on extent of object being // viewed and (initial) direction of camera. (Note: it can change // later due to user interaction via visualization system's GUI.) #if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2FileViewer::SendViewParameters()\n"; -#endif + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** G4VRML2FileViewer::SendViewParameters()\n"; +#endif - // error recovery - if ( fsin_VHA < 1.0e-6 ) { return ; } + // error recovery + if(fsin_VHA < 1.0e-6) + { + return; + } - // camera distance - G4double extent_radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius(); - G4double camera_distance = extent_radius / fsin_VHA ; + // camera distance + G4double extent_radius = + fSceneHandler.GetScene()->GetExtent().GetExtentRadius(); + G4double camera_distance = extent_radius / fsin_VHA; - // camera position on Z axis - const G4Point3D& target_point - = fSceneHandler.GetScene()->GetStandardTargetPoint() - + fVP.GetCurrentTargetPoint(); - G4double E_z = target_point.z() + camera_distance; - G4Point3D E(0.0, 0.0, E_z ); - - // VRML codes are generated below - fDest << G4endl; - fDest << "#---------- CAMERA" << G4endl; - fDest << "Viewpoint {" << G4endl; - fDest << "\t" << "position " ; - fDest << E.x() << " " ; - fDest << E.y() << " " ; - fDest << E.z() << G4endl ; - fDest << "}" << G4endl; - fDest << G4endl; + // camera position on Z axis + const G4Point3D& target_point = + fSceneHandler.GetScene()->GetStandardTargetPoint() + + fVP.GetCurrentTargetPoint(); + G4double E_z = target_point.z() + camera_distance; + G4Point3D E(0.0, 0.0, E_z); + // VRML codes are generated below + fDest << G4endl; + fDest << "#---------- CAMERA" << G4endl; + fDest << "Viewpoint {" << G4endl; + fDest << "\t" + << "position "; + fDest << E.x() << " "; + fDest << E.y() << " "; + fDest << E.z() << G4endl; + fDest << "}" << G4endl; + fDest << G4endl; } diff --git a/source/visualization/VRML/src/G4VRML2SceneHandler.cc b/source/visualization/VRML/src/G4VRML2SceneHandler.cc deleted file mode 100644 index 6371051a43..0000000000 --- a/source/visualization/VRML/src/G4VRML2SceneHandler.cc +++ /dev/null @@ -1,155 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML2SceneHandler.cc -// Satoshi Tanaka & Yasuhide Sawada - -#ifndef WIN32 - - -//=================// -#ifdef G4VIS_BUILD_VRML_DRIVER -//=================// - - -//#define DEBUG_FR_SCENE - -#include -#include -#include - -#include "globals.hh" -#include "G4VisManager.hh" - -#include "G4VPhysicalVolume.hh" -#include "G4LogicalVolume.hh" -#include "G4Point3D.hh" -#include "G4VModel.hh" -#include "G4Scene.hh" -#include "G4VisAttributes.hh" -#include "G4Polyhedron.hh" -#include "G4Box.hh" -#include "G4Cons.hh" -#include "G4Polyline.hh" -#include "G4Trd.hh" -#include "G4Tubs.hh" -#include "G4Text.hh" -#include "G4Circle.hh" -#include "G4Square.hh" - -#include "G4VRML2SceneHandler.hh" -#include "G4VRML2Viewer.hh" -#include "G4VRML2.hh" - - - -G4VRML2SceneHandler::G4VRML2SceneHandler(G4VRML2& system, const G4String& name) : - G4VSceneHandler(system, fSceneIdCount++, name), - fSystem(system), - fPVPickable ( false ), - fDest() -{ - - // PV name pickability - if( std::getenv( "G4VRML_PV_PICKABLE" ) != NULL ) { - - int is_pickable ; - sscanf( std::getenv("G4VRML_PV_PICKABLE"), "%d", &is_pickable ) ; - - if ( is_pickable ) { SetPVPickability ( true ) ; } - } - - // PV Transparency - SetPVTransparency (); - -} - - -G4VRML2SceneHandler::~G4VRML2SceneHandler() -{ -#if defined DEBUG_FR_SCENE - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** ~G4VRML2SceneHandler" << G4endl; -#endif -} - - - -#define G4VRML2SCENEHANDLER G4VRML2SceneHandler -#define IS_CONNECTED fDest.isConnected() -#include "G4VRML2SceneHandlerFunc.icc" -#undef IS_CONNECTED -#undef G4VRML2SCENEHANDLER - - -void G4VRML2SceneHandler::connectPort(G4int max_trial) -{ - G4int trial = 0 ; - int port = fSystem.getPort(); - for (trial = 0; !fDest.isConnected()&& trial < max_trial; trial++, port++ ) { - if (fDest.connect( (const char * )fSystem.getHostName(), port)) { - // INET domain connection is established - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "*** GEANT4 is connected to port "; - G4cout << fDest.getPort(); - G4cout << " of server " << fSystem.getHostName() << G4endl; - } - break; - } else { - // Connection failed. Try the next port. - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "*** GEANT4 incremented targeting port to "; - G4cout << port << G4endl; - } - } - - sleep (1); - - } // for - - if (!fDest.isConnected()) { - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { - G4cout << "*** INET Connection failed. " << G4endl; - G4cout << " Maybe, you have not invoked viewer g4vrmlview yet, " << G4endl; - G4cout << " or too many viewers are already running in the " << G4endl; - G4cout << " server host(" << fSystem.getHostName() << "). " << G4endl; - } - } -} - -void G4VRML2SceneHandler::closePort() -{ - fDest.close(); - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "*** INET Connection closed. " << G4endl; -} - - -G4int G4VRML2SceneHandler::fSceneIdCount = 0; - -#endif -#endif //WIN32 diff --git a/source/visualization/VRML/src/G4VRML2SceneHandlerFunc.icc b/source/visualization/VRML/src/G4VRML2SceneHandlerFunc.icc index b522d1e6fd..7e99cc191d 100644 --- a/source/visualization/VRML/src/G4VRML2SceneHandlerFunc.icc +++ b/source/visualization/VRML/src/G4VRML2SceneHandlerFunc.icc @@ -37,710 +37,871 @@ void G4VRML2SCENEHANDLER::AddSolid(const G4Trd& trd) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid trd" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid trd" + << "\n"; #endif - VRMLBeginModeling () ; - G4VSceneHandler::AddSolid(trd); + VRMLBeginModeling(); + G4VSceneHandler::AddSolid(trd); } void G4VRML2SCENEHANDLER::AddSolid(const G4Trap& trap) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid trap" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid trap" + << "\n"; #endif - VRMLBeginModeling () ; - G4VSceneHandler::AddSolid(trap); + VRMLBeginModeling(); + G4VSceneHandler::AddSolid(trap); } void G4VRML2SCENEHANDLER::AddSolid(const G4Para& para) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid para" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid para" + << "\n"; #endif - VRMLBeginModeling () ; - G4VSceneHandler::AddSolid(para); + VRMLBeginModeling(); + G4VSceneHandler::AddSolid(para); } -void G4VRML2SCENEHANDLER::AddSolid(const G4Torus& torus ) +void G4VRML2SCENEHANDLER::AddSolid(const G4Torus& torus) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid torus" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid torus" + << "\n"; #endif - VRMLBeginModeling () ; - G4VSceneHandler::AddSolid(torus); + VRMLBeginModeling(); + G4VSceneHandler::AddSolid(torus); } - void G4VRML2SCENEHANDLER::AddSolid(const G4VSolid& vsolid) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid vsolid" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid vsolid" + << "\n"; #endif - VRMLBeginModeling () ; - G4VSceneHandler::AddSolid(vsolid); + VRMLBeginModeling(); + G4VSceneHandler::AddSolid(vsolid); } void G4VRML2SCENEHANDLER::AddSolid(const G4Tubs& tubs) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid tubs" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid tubs" + << "\n"; #endif - VRMLBeginModeling () ; - G4VSceneHandler::AddSolid(tubs) ; - + VRMLBeginModeling(); + G4VSceneHandler::AddSolid(tubs); } - void G4VRML2SCENEHANDLER::AddSolid(const G4Cons& cons) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid cons" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid cons" + << "\n"; #endif - VRMLBeginModeling () ; - G4VSceneHandler::AddSolid(cons) ; + VRMLBeginModeling(); + G4VSceneHandler::AddSolid(cons); } void G4VRML2SCENEHANDLER::AddSolid(const G4Box& box) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid box" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid box" + << "\n"; #endif - VRMLBeginModeling () ; - G4VSceneHandler::AddSolid(box) ; + VRMLBeginModeling(); + G4VSceneHandler::AddSolid(box); } - void G4VRML2SCENEHANDLER::AddSolid(const G4Sphere& sphere) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddSolid sphere" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddSolid sphere" + << "\n"; #endif - VRMLBeginModeling () ; - G4VSceneHandler::AddSolid(sphere) ; + VRMLBeginModeling(); + G4VSceneHandler::AddSolid(sphere); } void G4VRML2SCENEHANDLER::AddPrimitive(const G4Polyline& polyline) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive polyline" << "\n" ; -#endif + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive polyline" + << "\n"; +#endif - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML2SCENEHANDLER::AddPrimitive (const G4Polyline&)", - "VRML-2001", JustWarning, - "2D polylines not implemented. Ignored."); - } - return; - } + if(fProcessing2D) + { + static G4bool warned = false; + if(!warned) + { + warned = true; + G4Exception("G4VRML2SCENEHANDLER::AddPrimitive (const G4Polyline&)", + "VRML-2001", JustWarning, + "2D polylines not implemented. Ignored."); + } + return; + } - VRMLBeginModeling () ; + VRMLBeginModeling(); - // VRML codes are generated below + // VRML codes are generated below - fDest << "#---------- POLYLINE" << "\n"; - fDest << "Shape {" << "\n"; + fDest << "#---------- POLYLINE" + << "\n"; + fDest << "Shape {" + << "\n"; - SendLineColor ( polyline.GetVisAttributes() ); + SendLineColor(polyline.GetVisAttributes()); - fDest << "\t" << "geometry IndexedLineSet {" << "\n"; + fDest << "\t" + << "geometry IndexedLineSet {" + << "\n"; - fDest << "\t\t" << "coord Coordinate {" << "\n"; - fDest << "\t\t\t" << "point [" << "\n"; - G4int e, i; - for (i = 0, e = polyline.size(); e; i++, e--) { + fDest << "\t\t" + << "coord Coordinate {" + << "\n"; + fDest << "\t\t\t" + << "point [" + << "\n"; + G4int e, i; + for(i = 0, e = polyline.size(); e; i++, e--) + { + G4Point3D point = polyline[i]; + point.transform(fObjectTransformation); - G4Point3D point = polyline[i]; - point.transform( fObjectTransformation ); + fDest << "\t\t\t\t"; + fDest << point.x() << " "; + fDest << point.y() << " "; + fDest << point.z() << "," + << "\n"; - fDest << "\t\t\t\t"; - fDest << point.x() << " "; - fDest << point.y() << " "; - fDest << point.z() << "," << "\n"; + } // for - } // for + fDest << "\t\t\t" + << "]" + << "\n"; // point + fDest << "\t\t" + << "}" + << "\n"; // coord - fDest << "\t\t\t" << "]" << "\n"; // point - fDest << "\t\t" << "}" << "\n"; // coord + fDest << "\t\t" + << "coordIndex ["; + for(i = 0, e = polyline.size(); e; i++, e--) + { + if(i % 10 == 0) + fDest << "\n" + << "\t\t\t"; + fDest << i << ", "; + } + fDest << "-1" + << "\n"; + fDest << "\t\t" + << "]" + << "\n"; // coordIndex + fDest << "\t" + << "}" + << "\n"; // geometry IndexedLineSet - fDest << "\t\t" << "coordIndex ["; - for (i = 0, e = polyline.size(); e; i++, e--) { - if (i % 10 == 0) - fDest << "\n" << "\t\t\t"; - fDest << i << ", "; - } - fDest << "-1" << "\n"; - fDest << "\t\t" << "]" << "\n"; // coordIndex - fDest << "\t" << "}" << "\n"; // geometry IndexedLineSet - - fDest << "}" << "\n"; // Shape + fDest << "}" + << "\n"; // Shape } - void G4VRML2SCENEHANDLER::AddPrimitive(const G4Polyhedron& polyhedron) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive(G4Polyhedron)" << "\n"; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive(G4Polyhedron)" + << "\n"; #endif - if (polyhedron.GetNoFacets() == 0) return; + if(polyhedron.GetNoFacets() == 0) + return; - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML2SCENEHANDLER::AddPrimitive (const G4Polyhedron&)", - "VRML-2002", JustWarning, - "2D polyhedra not implemented. Ignored."); - } - return; - } + if(fProcessing2D) + { + static G4bool warned = false; + if(!warned) + { + warned = true; + G4Exception("G4VRML2SCENEHANDLER::AddPrimitive (const G4Polyhedron&)", + "VRML-2002", JustWarning, + "2D polyhedra not implemented. Ignored."); + } + return; + } - VRMLBeginModeling () ; + VRMLBeginModeling(); - // Transparency checking: If completely transparent, skip drawing - if ( GetPVTransparency() > 0.99 ) { return ; } + // Transparency checking: If completely transparent, skip drawing + if(GetPVTransparency() > 0.99) + { + return; + } - // Current Model - const G4VModel* pv_model = GetModel(); - G4String pv_name = "No model"; - if (pv_model) pv_name = pv_model->GetCurrentTag() ; + // Current Model + const G4VModel* pv_model = GetModel(); + G4String pv_name = "No model"; + if(pv_model) + pv_name = pv_model->GetCurrentTag(); - // VRML codes are generated below + // VRML codes are generated below - fDest << "#---------- SOLID: " << pv_name << "\n"; + fDest << "#---------- SOLID: " << pv_name << "\n"; - if ( IsPVPickable() ) { + if(IsPVPickable()) + { + fDest << "Anchor {" + << "\n"; + fDest << " description " + << "\"" << pv_name << "\"" + << "\n"; + fDest << " url \"\" " + << "\n"; + fDest << " children [" + << "\n"; + } - fDest << "Anchor {" << "\n"; - fDest << " description " << "\"" << pv_name << "\"" << "\n"; - fDest << " url \"\" " << "\n"; - fDest << " children [" << "\n"; - } + fDest << "\t"; + fDest << "Shape {" + << "\n"; - fDest << "\t"; fDest << "Shape {" << "\n"; + SendMaterialNode(); - SendMaterialNode(); + fDest << "\t\t" + << "geometry IndexedFaceSet {" + << "\n"; - fDest << "\t\t" << "geometry IndexedFaceSet {" << "\n"; + fDest << "\t\t\t" + << "coord Coordinate {" + << "\n"; + fDest << "\t\t\t\t" + << "point [" + << "\n"; + G4int i, j; + for(i = 1, j = polyhedron.GetNoVertices(); j; j--, i++) + { + G4Point3D point = polyhedron.GetVertex(i); - fDest << "\t\t\t" << "coord Coordinate {" << "\n"; - fDest << "\t\t\t\t" << "point [" << "\n"; - G4int i, j; - for (i = 1, j = polyhedron.GetNoVertices(); j; j--, i++) { - G4Point3D point = polyhedron.GetVertex(i); + point.transform(fObjectTransformation); - point.transform( fObjectTransformation ); + fDest << "\t\t\t\t\t"; + fDest << point.x() << " "; + fDest << point.y() << " "; + fDest << point.z() << "," + << "\n"; + } + fDest << "\t\t\t\t" + << "]" + << "\n"; // point + fDest << "\t\t\t" + << "}" + << "\n"; // coord - fDest << "\t\t\t\t\t"; - fDest << point.x() << " "; - fDest << point.y() << " "; - fDest << point.z() << "," << "\n"; - } - fDest << "\t\t\t\t" << "]" << "\n"; // point - fDest << "\t\t\t" << "}" << "\n"; // coord + fDest << "\t\t\t" + << "coordIndex [" + << "\n"; - fDest << "\t\t\t" << "coordIndex [" << "\n"; + // facet loop + G4int f; + for(f = polyhedron.GetNoFacets(); f; f--) + { + // edge loop + G4bool notLastEdge; + G4int index = -1, edgeFlag = 1; + fDest << "\t\t\t\t"; + do + { + notLastEdge = polyhedron.GetNextVertexIndex(index, edgeFlag); + fDest << index - 1 << ", "; + } while(notLastEdge); + fDest << "-1," + << "\n"; + } + fDest << "\t\t\t" + << "]" + << "\n"; // coordIndex - // facet loop - G4int f; - for (f = polyhedron.GetNoFacets(); f; f--) { + fDest << "\t\t\t" + << "solid FALSE" + << "\n"; // draw backfaces - // edge loop - G4bool notLastEdge; - G4int index = -1, edgeFlag = 1; - fDest << "\t\t\t\t"; - do { - notLastEdge = polyhedron.GetNextVertexIndex(index, edgeFlag); - fDest << index - 1 << ", "; - } while (notLastEdge); - fDest << "-1," << "\n"; - } - fDest << "\t\t\t" << "]" << "\n"; // coordIndex - - fDest << "\t\t\t" << "solid FALSE" << "\n"; // draw backfaces - - fDest << "\t\t" << "}" << "\n"; // IndexFaceSet - fDest << "\t" << "}" << "\n"; // Shape - - if ( IsPVPickable() ) { - fDest << " ]" << "\n"; // children - fDest << "}" << "\n"; // Anchor - } - -} - -void G4VRML2SCENEHANDLER::AddPrimitive( const G4Text& ) -{ -#if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive text" << "\n" ; -#endif - /*** You might need this - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML2SCENEHANDLER::AddPrimitive (const G4Text&)", - "VRML-2003", JustWarning, - "2D text not implemented. Ignored."); - } - return; - } - ***/ - - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << - "***** void G4VRML2SCENEHANDLER::AddPrimitive( const G4Text& text )" - " not implemented yet." - << "\n"; - - VRMLBeginModeling () ; + fDest << "\t\t" + << "}" + << "\n"; // IndexFaceSet + fDest << "\t" + << "}" + << "\n"; // Shape + if(IsPVPickable()) + { + fDest << " ]" + << "\n"; // children + fDest << "}" + << "\n"; // Anchor + } } -void G4VRML2SCENEHANDLER::AddPrimitive( const G4Circle& circle ) +void G4VRML2SCENEHANDLER::AddPrimitive(const G4Text&) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive circle" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive text" + << "\n"; +#endif + /*** You might need this + if (fProcessing2D) { + static G4bool warned = false; + if (!warned) { + warned = true; + G4Exception + ("G4VRML2SCENEHANDLER::AddPrimitive (const G4Text&)", + "VRML-2003", JustWarning, + "2D text not implemented. Ignored."); + } + return; + } + ***/ + + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout + << "***** void G4VRML2SCENEHANDLER::AddPrimitive( const G4Text& text )" + " not implemented yet." + << "\n"; + + VRMLBeginModeling(); +} + +void G4VRML2SCENEHANDLER::AddPrimitive(const G4Circle& circle) +{ +#if defined DEBUG_SCENE_FUNC + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive circle" + << "\n"; #endif - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML2SCENEHANDLER::AddPrimitive (const G4Circle&)", - "VRML-2004", JustWarning, - "2D circles not implemented. Ignored."); - } - return; - } + if(fProcessing2D) + { + static G4bool warned = false; + if(!warned) + { + warned = true; + G4Exception("G4VRML2SCENEHANDLER::AddPrimitive (const G4Circle&)", + "VRML-2004", JustWarning, + "2D circles not implemented. Ignored."); + } + return; + } - VRMLBeginModeling () ; + VRMLBeginModeling(); - // Information -// const char* info = NULL ; - const char* info = circle.GetInfo() ; + // Information + // const char* info = NULL ; + const char* info = circle.GetInfo(); - // Position and half size of circle - G4double X, Y, Z ; GetMarkerWorldPosition( circle, &X, &Y, &Z ) ; - G4double radius = GetMarkerHalfSize ( circle ); + // Position and half size of circle + G4double X, Y, Z; + GetMarkerWorldPosition(circle, &X, &Y, &Z); + G4double radius = GetMarkerHalfSize(circle); - // VRML codes are generated below - fDest << "#---------- 3D MARKER (Circle)" << "\n"; - fDest << "Anchor {" << "\n"; + // VRML codes are generated below + fDest << "#---------- 3D MARKER (Circle)" + << "\n"; + fDest << "Anchor {" + << "\n"; - if( circle.GetInfo().isNull() ) { - fDest << " description " << "\"(" << X << " " ; - fDest << Y << " " ; - fDest << Z << ")\"" << "\n"; - } else { - fDest << " description " << "\"" << info << "\"" << "\n"; - } + if(circle.GetInfo().empty()) + { + fDest << " description " + << "\"(" << X << " "; + fDest << Y << " "; + fDest << Z << ")\"" + << "\n"; + } + else + { + fDest << " description " + << "\"" << info << "\"" + << "\n"; + } + fDest << " url \"\" " + << "\n"; - fDest << " url \"\" " << "\n"; + fDest << " children [" + << "\n"; - fDest << " children [" << "\n"; + fDest << " Transform {" + << "\n"; - fDest << " Transform {" << "\n"; + fDest << " translation "; + fDest << X << " " << Y << " " << Z << "\n"; - fDest << " translation "; - fDest << X << " " << Y << " " << Z << "\n"; + fDest << " children [" + << "\n"; - fDest << " children [" << "\n"; + fDest << "\t" + << "Shape {" + << "\n"; - fDest << "\t" << "Shape {" << "\n"; + SendMarkerColor(circle); - SendMarkerColor( circle ); + // send shape with size + fDest << "\t\t" + << "geometry Sphere {" + << "\n"; + fDest << "\t\t\t" + << "radius " << radius << "\n"; + fDest << "\t\t" + << "}" + << "\n"; - // send shape with size - fDest << "\t\t" << "geometry Sphere {" << "\n"; - fDest << "\t\t\t" << "radius " << radius << "\n"; - fDest << "\t\t" << "}" << "\n"; + fDest << "\t" + << "}" + << "\n"; // Shape - fDest << "\t" << "}" << "\n"; // Shape - - fDest << " ]" << "\n"; // children - fDest << " }" << "\n"; // Transform - - fDest << " ]" << "\n"; // children - fDest << "}" << "\n"; // Anchor + fDest << " ]" + << "\n"; // children + fDest << " }" + << "\n"; // Transform + fDest << " ]" + << "\n"; // children + fDest << "}" + << "\n"; // Anchor } void G4VRML2SCENEHANDLER::AddPrimitive(const G4Square& square) { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** AddPrimitive square" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** AddPrimitive square" + << "\n"; #endif - if (fProcessing2D) { - static G4bool warned = false; - if (!warned) { - warned = true; - G4Exception - ("G4VRML2SCENEHANDLER::AddPrimitive (const G4Square&)", - "VRML-2005", JustWarning, - "2D squares not implemented. Ignored."); - } - return; - } + if(fProcessing2D) + { + static G4bool warned = false; + if(!warned) + { + warned = true; + G4Exception("G4VRML2SCENEHANDLER::AddPrimitive (const G4Square&)", + "VRML-2005", JustWarning, + "2D squares not implemented. Ignored."); + } + return; + } - VRMLBeginModeling () ; + VRMLBeginModeling(); - // Information -// const char* info = NULL ; - const char* info = square.GetInfo() ; + // Information + // const char* info = NULL ; + const char* info = square.GetInfo(); - // Position and size of square - G4double X, Y, Z ; GetMarkerWorldPosition ( square, &X, &Y, &Z ) ; - G4double radius = GetMarkerHalfSize ( square ); - G4double diameter = 2.0 * radius ; + // Position and size of square + G4double X, Y, Z; + GetMarkerWorldPosition(square, &X, &Y, &Z); + G4double radius = GetMarkerHalfSize(square); + G4double diameter = 2.0 * radius; - // VRML codes are generated below - fDest << "#---------- 3D MARKER (Square)" << "\n"; - fDest << "Anchor {" << "\n"; + // VRML codes are generated below + fDest << "#---------- 3D MARKER (Square)" + << "\n"; + fDest << "Anchor {" + << "\n"; - if( square.GetInfo().isNull() ) { - fDest << " description " << "\"(" << X << " " ; - fDest << Y << " " ; - fDest << Z << ")\"" << "\n"; - } else { - fDest << " description " << "\"" << info << "\"" << "\n"; - } + if(square.GetInfo().empty()) + { + fDest << " description " + << "\"(" << X << " "; + fDest << Y << " "; + fDest << Z << ")\"" + << "\n"; + } + else + { + fDest << " description " + << "\"" << info << "\"" + << "\n"; + } - fDest << " url \"\" " << "\n"; + fDest << " url \"\" " + << "\n"; - fDest << " children [" << "\n"; + fDest << " children [" + << "\n"; - fDest << " Transform {" << "\n"; + fDest << " Transform {" + << "\n"; - fDest << " translation "; - fDest << X << " " << Y << " " << Z << "\n"; + fDest << " translation "; + fDest << X << " " << Y << " " << Z << "\n"; - fDest << " children [" << "\n"; + fDest << " children [" + << "\n"; - fDest << "\t" << "Shape {" << "\n"; + fDest << "\t" + << "Shape {" + << "\n"; - SendMarkerColor( square ); + SendMarkerColor(square); - // send shape with size - fDest << "\t\t" << "geometry Box {" << "\n"; - fDest << "\t\t\t" << "size " << diameter << " " ; - fDest << diameter << " " ; - fDest << diameter << "\n" ; - fDest << "\t\t" << "}" << "\n"; + // send shape with size + fDest << "\t\t" + << "geometry Box {" + << "\n"; + fDest << "\t\t\t" + << "size " << diameter << " "; + fDest << diameter << " "; + fDest << diameter << "\n"; + fDest << "\t\t" + << "}" + << "\n"; - fDest << "\t" << "}" << "\n"; // Shape + fDest << "\t" + << "}" + << "\n"; // Shape - fDest << " ]" << "\n"; // children - fDest << " }" << "\n"; // Transform - - fDest << " ]" << "\n"; // children - fDest << "}" << "\n"; // Anchor + fDest << " ]" + << "\n"; // children + fDest << " }" + << "\n"; // Transform + fDest << " ]" + << "\n"; // children + fDest << "}" + << "\n"; // Anchor } void G4VRML2SCENEHANDLER::BeginModeling() { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** BeginModeling" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** BeginModeling" + << "\n"; #endif - G4VSceneHandler::BeginModeling(); - + G4VSceneHandler::BeginModeling(); } void G4VRML2SCENEHANDLER::EndModeling() { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** EndModeling " << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** EndModeling " + << "\n"; #endif - G4VSceneHandler::EndModeling(); + G4VSceneHandler::EndModeling(); } -void G4VRML2SCENEHANDLER::BeginPrimitives(const G4Transform3D& objectTransformation) +void G4VRML2SCENEHANDLER::BeginPrimitives( + const G4Transform3D& objectTransformation) { - G4VSceneHandler::BeginPrimitives (objectTransformation); + G4VSceneHandler::BeginPrimitives(objectTransformation); #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** BeginPrimitives " << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** BeginPrimitives " + << "\n"; #endif - VRMLBeginModeling(); + VRMLBeginModeling(); } void G4VRML2SCENEHANDLER::EndPrimitives() { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** EndPrimitives " << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** EndPrimitives " + << "\n"; #endif G4VSceneHandler::EndPrimitives(); } -void G4VRML2SCENEHANDLER::SendMaterialNode( const G4VisAttributes* pVA ) +void G4VRML2SCENEHANDLER::SendMaterialNode(const G4VisAttributes* pVA) { - // Initialization of drawing parameters - G4bool flagWF = false ; - G4double TRANSPARENCY = GetPVTransparency() ; + // Initialization of drawing parameters + G4bool flagWF = false; + G4double TRANSPARENCY = GetPVTransparency(); - // Wireframe or not - const G4ViewParameters& cur_view_param = fpViewer -> GetViewParameters (); - if (pVA) { - if (pVA->IsForceDrawingStyle() && - (pVA->GetForcedDrawingStyle() == G4VisAttributes::wireframe)) - { - // wireframe style is assigned to this object - flagWF = true ; + // Wireframe or not + const G4ViewParameters& cur_view_param = fpViewer->GetViewParameters(); + if(pVA) + { + if(pVA->IsForceDrawingStyle() && + (pVA->GetForcedDrawingStyle() == G4VisAttributes::wireframe)) + { + // wireframe style is assigned to this object + flagWF = true; + } + else if(cur_view_param.GetDrawingStyle() == G4ViewParameters::wireframe) + { + // current viewing style is wireframe + flagWF = true; + } + } - } else if ( cur_view_param.GetDrawingStyle() == G4ViewParameters::wireframe ) - { - // current viewing style is wireframe - flagWF = true ; - } - } + // VRML codes are generated below + if(!pVA) + { + // Error recovery: Use default values of VRML browser + fDest << "\t\t"; + fDest << "appearance Appearance { material Material {} }"; + fDest << "\n"; + } + else + { + const G4Color& color = pVA->GetColor(); - // VRML codes are generated below - if (!pVA) { - - // Error recovery: Use default values of VRML browser - fDest << "\t\t" ; - fDest << "appearance Appearance { material Material {} }"; - fDest << "\n"; - - } else { + fDest << "\t\t" + << "appearance Appearance {" + << "\n"; + fDest << "\t\t\t" + << "material Material {" + << "\n"; - const G4Color& color = pVA->GetColor(); + // diffuse color + fDest << "\t\t\t\t" + << "diffuseColor "; + fDest << color.GetRed() << " "; + fDest << color.GetGreen() << " "; + fDest << color.GetBlue() << "\n"; - fDest << "\t\t" << "appearance Appearance {" << "\n"; - fDest << "\t\t\t" << "material Material {" << "\n"; + // emmisive color + // fDest << "\t\t\t\t" << "emissiveColor "; + // fDest << color.GetRed() << " " ; + // fDest << color.GetGreen() << " " ; + // fDest << color.GetBlue() << "\n"; + // - // diffuse color - fDest << "\t\t\t\t" << "diffuseColor "; - fDest << color.GetRed() << " " ; - fDest << color.GetGreen() << " " ; - fDest << color.GetBlue() << "\n"; - - // emmisive color - // fDest << "\t\t\t\t" << "emissiveColor "; - // fDest << color.GetRed() << " " ; - // fDest << color.GetGreen() << " " ; - //fDest << color.GetBlue() << "\n"; - // - - // wireframe is expressed as transparency - if ( flagWF ) - { - fDest << "\t\t\t\t" << "transparency " << TRANSPARENCY << "\n"; - } - - fDest << "\t\t\t" << "}" << "\n"; // material - fDest << "\t\t" << "}" << "\n"; // appearance - } + // wireframe is expressed as transparency + if(flagWF) + { + fDest << "\t\t\t\t" + << "transparency " << TRANSPARENCY << "\n"; + } + fDest << "\t\t\t" + << "}" + << "\n"; // material + fDest << "\t\t" + << "}" + << "\n"; // appearance + } } - void G4VRML2SCENEHANDLER::SendMaterialNode() { - SendMaterialNode - ( fpViewer->GetApplicableVisAttributes (fpVisAttribs) ); + SendMaterialNode(fpViewer->GetApplicableVisAttributes(fpVisAttribs)); } - void G4VRML2SCENEHANDLER::VRMLBeginModeling() { - if (!IS_CONNECTED ) { + if(!IS_CONNECTED) + { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** VRMLBeginModeling (started)" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** VRMLBeginModeling (started)" + << "\n"; #endif - this->connectPort(); - fDest << "#VRML V2.0 utf8" << "\n"; - fDest << "# Generated by VRML 2.0 driver of GEANT4\n" << "\n"; - } + this->connectPort(); + fDest << "#VRML V2.0 utf8" + << "\n"; + fDest << "# Generated by VRML 2.0 driver of GEANT4\n" + << "\n"; + } } void G4VRML2SCENEHANDLER::VRMLEndModeling() { - if ( IS_CONNECTED ) { + if(IS_CONNECTED) + { #if defined DEBUG_SCENE_FUNC - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** VRMLEndModeling (started)" << "\n" ; + if(G4VisManager::GetVerbosity() >= G4VisManager::errors) + G4cout << "***** VRMLEndModeling (started)" + << "\n"; #endif - fDest << "#End of file." << "\n"; - this->closePort(); - } + fDest << "#End of file." + << "\n"; + this->closePort(); + } } -void G4VRML2SCENEHANDLER::SendMarkerColor ( const G4VMarker& marker ) +void G4VRML2SCENEHANDLER::SendMarkerColor(const G4VMarker& marker) { - fpVisAttribs = marker.GetVisAttributes(); - const G4Color& color = GetColor(); - - fDest << "\t\t" << "appearance Appearance {" << "\n"; - fDest << "\t\t\t" << "material Material {" << "\n"; - fDest << "\t\t\t\t" << "diffuseColor "; - fDest << color.GetRed() << " " ; - fDest << color.GetGreen() << " " ; - fDest << color.GetBlue() << "\n"; - fDest << "\t\t\t\t" << "emissiveColor "; - fDest << color.GetRed() << " " ; - fDest << color.GetGreen() << " " ; - fDest << color.GetBlue() << "\n"; - fDest << "\t\t\t" << "}" << "\n"; // material - fDest << "\t\t" << "}" << "\n"; // appearance + fpVisAttribs = marker.GetVisAttributes(); + const G4Color& color = GetColor(); + fDest << "\t\t" + << "appearance Appearance {" + << "\n"; + fDest << "\t\t\t" + << "material Material {" + << "\n"; + fDest << "\t\t\t\t" + << "diffuseColor "; + fDest << color.GetRed() << " "; + fDest << color.GetGreen() << " "; + fDest << color.GetBlue() << "\n"; + fDest << "\t\t\t\t" + << "emissiveColor "; + fDest << color.GetRed() << " "; + fDest << color.GetGreen() << " "; + fDest << color.GetBlue() << "\n"; + fDest << "\t\t\t" + << "}" + << "\n"; // material + fDest << "\t\t" + << "}" + << "\n"; // appearance } -void -G4VRML2SCENEHANDLER::SendMarkerWorldPosition ( const G4VMarker& mark ) +void G4VRML2SCENEHANDLER::SendMarkerWorldPosition(const G4VMarker& mark) { - G4Point3D point = mark.GetPosition(); + G4Point3D point = mark.GetPosition(); - point.transform( fObjectTransformation ); - - fDest << " translation "; - fDest << point.x() << " " << point.y() << " " << point.z() << "\n"; + point.transform(fObjectTransformation); + fDest << " translation "; + fDest << point.x() << " " << point.y() << " " << point.z() << "\n"; } -void G4VRML2SCENEHANDLER::GetMarkerWorldPosition ( const G4VMarker& mark , - double* pX , - double* pY , - double* pZ ) +void G4VRML2SCENEHANDLER::GetMarkerWorldPosition(const G4VMarker& mark, + double* pX, double* pY, + double* pZ) { - G4Point3D point = mark.GetPosition(); + G4Point3D point = mark.GetPosition(); - point.transform( fObjectTransformation ); + point.transform(fObjectTransformation); - *pX = point.x() ; - *pY = point.y() ; - *pZ = point.z() ; + *pX = point.x(); + *pY = point.y(); + *pZ = point.z(); } -G4double G4VRML2SCENEHANDLER::GetMarkerHalfSize ( const G4VMarker& mark ) +G4double G4VRML2SCENEHANDLER::GetMarkerHalfSize(const G4VMarker& mark) { - //----- return value ( marker radius in 3d units) - G4double size = 1.0 ; // initialization + //----- return value ( marker radius in 3d units) + G4double size = 1.0; // initialization - //----- parameters to calculate 3d size from 2d size - const double HALF_SCREEN_SIZE_2D = 300.0 ; // pixels - double zoom_factor = fpViewer->GetViewParameters().GetZoomFactor() ; - if ( zoom_factor <= 0.0 ) { zoom_factor = 1.0 ; } - double extent_radius_3d = GetScene()->GetExtent().GetExtentRadius() ; - if ( extent_radius_3d <= 0.0 ) { extent_radius_3d = 1.0 ; } + //----- parameters to calculate 3d size from 2d size + const double HALF_SCREEN_SIZE_2D = 300.0; // pixels + double zoom_factor = fpViewer->GetViewParameters().GetZoomFactor(); + if(zoom_factor <= 0.0) + { + zoom_factor = 1.0; + } + double extent_radius_3d = GetScene()->GetExtent().GetExtentRadius(); + if(extent_radius_3d <= 0.0) + { + extent_radius_3d = 1.0; + } - //----- get marker radius in 3D units - if ( mark.GetWorldSize() > 0.0 ) { + //----- get marker radius in 3D units + if(mark.GetWorldSize() > 0.0) + { + // get mark radius in 3D units + size = 0.5 * mark.GetWorldSize(); + } + else if(mark.GetScreenSize() > 0.0) + { + // local + double mark_radius_2d = 0.5 * mark.GetScreenSize(); - // get mark radius in 3D units - size = 0.5 * mark.GetWorldSize() ; + // get mark radius in 3D units + size = extent_radius_3d * (mark_radius_2d / HALF_SCREEN_SIZE_2D); + size *= zoom_factor; + } + else + { + // local + double mark_radius_2d = + fpViewer->GetViewParameters().GetDefaultMarker().GetScreenSize(); + mark_radius_2d *= 0.1; // Magic number? - } else if ( mark.GetScreenSize() > 0.0 ) { + // get mark radius in 3D units + size = extent_radius_3d * (mark_radius_2d / HALF_SCREEN_SIZE_2D); + size *= zoom_factor; + } - // local - double mark_radius_2d = 0.5 * mark.GetScreenSize() ; + //----- global rescaling + size *= fpViewer->GetViewParameters().GetGlobalMarkerScale(); - // get mark radius in 3D units - size \ - = extent_radius_3d * ( mark_radius_2d / HALF_SCREEN_SIZE_2D ); - size *= zoom_factor ; - - } else { - // local - double mark_radius_2d \ - = fpViewer->GetViewParameters().GetDefaultMarker().GetScreenSize(); - mark_radius_2d *= 0.1 ; // Magic number? - - // get mark radius in 3D units - size \ - = extent_radius_3d * ( mark_radius_2d / HALF_SCREEN_SIZE_2D ); - size *= zoom_factor ; - } - - //----- global rescaling - size *= fpViewer->GetViewParameters().GetGlobalMarkerScale(); - - //----- return size - return size ; - -} - -void G4VRML2SCENEHANDLER::SendLineColor ( const G4VisAttributes* pVA ) -{ - const G4Color& color = pVA->GetColor(); - - - fDest << "\t" << "appearance Appearance {" << "\n"; - fDest << "\t\t" << "material Material {" << "\n"; - fDest << "\t\t\t" << "diffuseColor "; - fDest << color.GetRed() << " " ; - fDest << color.GetGreen() << " " ; - fDest << color.GetBlue() << "\n"; - fDest << "\t\t\t" << "emissiveColor "; - fDest << color.GetRed() << " " ; - fDest << color.GetGreen() << " " ; - fDest << color.GetBlue() << "\n"; - fDest << "\t\t" << "}" << "\n"; // material - fDest << "\t" << "}" << "\n"; // appearance + //----- return size + return size; } -G4double G4VRML2SCENEHANDLER::SetPVTransparency () +void G4VRML2SCENEHANDLER::SendLineColor(const G4VisAttributes* pVA) { + const G4Color& color = pVA->GetColor(); - G4double TRANSPARENCY = 0.7 ; // initialization - - if( std::getenv( "G4VRML_TRANSPARENCY" ) != NULL ) { - - // get a value from the env value -// sscanf( getenv("G4VRML_TRANSPARENCY"), "%lg", &TRANSPARENCY ) ; - std::istringstream iss( std::getenv("G4VRML_TRANSPARENCY") ); - iss >> TRANSPARENCY; - - // truncation - TRANSPARENCY = std::fabs ( TRANSPARENCY ) ; - if ( TRANSPARENCY > 1.0 ) { TRANSPARENCY = 1.0 ; } - } - - fPVTransparency = TRANSPARENCY ; - - return fPVTransparency ; + fDest << "\t" + << "appearance Appearance {" + << "\n"; + fDest << "\t\t" + << "material Material {" + << "\n"; + fDest << "\t\t\t" + << "diffuseColor "; + fDest << color.GetRed() << " "; + fDest << color.GetGreen() << " "; + fDest << color.GetBlue() << "\n"; + fDest << "\t\t\t" + << "emissiveColor "; + fDest << color.GetRed() << " "; + fDest << color.GetGreen() << " "; + fDest << color.GetBlue() << "\n"; + fDest << "\t\t" + << "}" + << "\n"; // material + fDest << "\t" + << "}" + << "\n"; // appearance } +G4double G4VRML2SCENEHANDLER::SetPVTransparency() +{ + G4double TRANSPARENCY = 0.7; // initialization -void G4VRML2SCENEHANDLER::ClearTransientStore() + if(std::getenv("G4VRML_TRANSPARENCY") != NULL) + { + // get a value from the env value + // sscanf( getenv("G4VRML_TRANSPARENCY"), "%lg", &TRANSPARENCY ) ; + std::istringstream iss(std::getenv("G4VRML_TRANSPARENCY")); + iss >> TRANSPARENCY; + + // truncation + TRANSPARENCY = std::fabs(TRANSPARENCY); + if(TRANSPARENCY > 1.0) + { + TRANSPARENCY = 1.0; + } + } + + fPVTransparency = TRANSPARENCY; + + return fPVTransparency; +} + +void G4VRML2SCENEHANDLER::ClearTransientStore() { // This is typically called after an update and before drawing hits // of the next event. To simulate the clearing of "transients" // (hits, etc.) the detector is redrawn... - if (fpViewer) { - fpViewer -> SetView (); - fpViewer -> ClearView (); - fpViewer -> DrawView (); + if(fpViewer) + { + fpViewer->SetView(); + fpViewer->ClearView(); + fpViewer->DrawView(); } } - // End of file. diff --git a/source/visualization/VRML/src/G4VRML2Viewer.cc b/source/visualization/VRML/src/G4VRML2Viewer.cc deleted file mode 100644 index 5601b2bd00..0000000000 --- a/source/visualization/VRML/src/G4VRML2Viewer.cc +++ /dev/null @@ -1,158 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// G4VRML2Viewer.cc -// Satoshi Tanaka & Yasuhide Sawada - -#ifndef WIN32 - -//=================// -#ifdef G4VIS_BUILD_VRML_DRIVER -//=================// - - -//#define DEBUG_FR_VIEW - -#include - -#include "G4VisManager.hh" -#include "G4Scene.hh" -#include "G4VRML2Viewer.hh" -#include "G4VRML2SceneHandler.hh" -#include "G4VRML2.hh" -#include "G4ios.hh" - -G4VRML2Viewer::G4VRML2Viewer(G4VRML2SceneHandler& sceneHandler, const G4String& name) : - G4VViewer(sceneHandler, - sceneHandler.IncrementViewCount(), - name), - fSceneHandler(sceneHandler), - fDest(sceneHandler.fDest) -{ - fViewHalfAngle = 0.5 * 0.785398 ; // 0.5 * 45*deg - fsin_VHA = std::sin ( fViewHalfAngle ) ; -} - -G4VRML2Viewer::~G4VRML2Viewer() -{} - -void G4VRML2Viewer::SetView() -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2Viewer::SetView(): No effects" << G4endl; -#endif - -// Do nothing, since VRML a browser is running as a different process. -// SendViewParameters () will do this job instead. - -} - - -void G4VRML2Viewer::DrawView() -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2Viewer::DrawView()" << G4endl; -#endif - fSceneHandler.VRMLBeginModeling() ; - - // Viewpoint node - SendViewParameters(); - - // Here is a minimal DrawView() function. - NeedKernelVisit(); - ProcessView(); - FinishView(); -} - -void G4VRML2Viewer::ClearView(void) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2Viewer::ClearView(): No effects" << G4endl; -#endif -} - -void G4VRML2Viewer::ShowView(void) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2Viewer::ShowView()" << G4endl; -#endif - fSceneHandler.VRMLEndModeling(); -} - -void G4VRML2Viewer::FinishView(void) -{ -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2Viewer::FinishView(): No effects" << G4endl; -#endif -} - -void G4VRML2Viewer::SendViewParameters () -{ - // Calculates view representation based on extent of object being - // viewed and (initial) direction of camera. (Note: it can change - // later due to user interaction via visualization system's GUI.) - -#if defined DEBUG_FR_VIEW - if (G4VisManager::GetVerbosity() >= G4VisManager::errors) - G4cout << "***** G4VRML2Viewer::SendViewParameters()\n"; -#endif - // error recovery - if ( fsin_VHA < 1.0e-6 ) { return ; } - - // camera distance - G4double extent_radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius(); - G4double camera_distance = extent_radius / fsin_VHA ; - - // camera position on Z axis - const G4Point3D& target_point - = fSceneHandler.GetScene()->GetStandardTargetPoint() - + fVP.GetCurrentTargetPoint(); - G4double E_z = target_point.z() + camera_distance; - G4Point3D E(0.0, 0.0, E_z ); - - // VRML codes are generated below - fDest << "\n"; - fDest << "#---------- CAMERA" << "\n"; - fDest << "Viewpoint {" << "\n"; - fDest << "\t" << "position " ; - fDest << E.x() << " " ; - fDest << E.y() << " " ; - fDest << E.z() << "\n" ; - fDest << "}" << "\n"; - fDest << "\n"; - -} - - - -#endif -#endif //WIN32 diff --git a/source/visualization/Vtk/CMakeLists.txt b/source/visualization/Vtk/CMakeLists.txt new file mode 100644 index 0000000000..bd3f958a7e --- /dev/null +++ b/source/visualization/Vtk/CMakeLists.txt @@ -0,0 +1,4 @@ +# - G4visVtk category build + +geant4_global_library_target(COMPONENTS sources.cmake) + diff --git a/examples/extended/parameterisations/gflash/gflasha/History b/source/visualization/Vtk/History similarity index 51% rename from examples/extended/parameterisations/gflash/gflasha/History rename to source/visualization/Vtk/History index d01e38ef87..ec96e91cbd 100644 --- a/examples/extended/parameterisations/gflash/gflasha/History +++ b/source/visualization/Vtk/History @@ -4,26 +4,24 @@ Geant4 - an Object-Oriented Toolkit for Simulation in HEP ========================================================= - History file - ------------ + Category History file + --------------------- This file should be used by G4 developers and category coordinators to briefly summarize all major modifications introduced in the code and keep track of all category-tags. -It DOES NOT substitute the CVS log-message one should put at every -committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- -10-Nov-2020 B. Morgan (exgflasha-V10-06-00) -- Migration to G4RunManagerFactory. +History file for visualization/Vtk sub-category +----------------------------------------------- +8 November 2021 - Ben Morgan (visVtk-V10-07-03) +- Retire G4UI/G4INTY_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system -28-Oct-2019 I. Hrivnacova (exgflasha-V10-05-01) -- Fixed formatting in .README.txt and Doxygen warnings - -22-Oct-2019 I.Semeniouk (exgflasha-V10-05-00) -- Example demonstrating usage 'gflash' shower parameterisation - in homogeneous calorimeter. This example allow compared shower - profiles from fast simulation with full simulation. +15 October 2021 John Allison (visVtk-V10-07-02) +- Implement G4VtkQt::IsUISessionCompatible. +04 October 2021 Stewart Boogert / Laurie Nevay (visVtk-V10-07-01) +- Operational VTK viewer (VtkNative and VtkQt) \ No newline at end of file diff --git a/source/visualization/VRML/include/G4VRML1File.hh b/source/visualization/Vtk/include/G4Vtk.hh similarity index 80% rename from source/visualization/VRML/include/G4VRML1File.hh rename to source/visualization/Vtk/include/G4Vtk.hh index f134aa10db..2d1a82168b 100644 --- a/source/visualization/VRML/include/G4VRML1File.hh +++ b/source/visualization/Vtk/include/G4Vtk.hh @@ -25,23 +25,22 @@ // // // -// G4VRML1File.hh -// Satoshi Tanaka & Yasuhide Sawada +// +// John Allison 5th April 2001 +// A template for a simplest possible graphics driver. +//?? Lines beginning like this require specialisation for your driver. -#ifndef G4VRML1FILE_HH -#define G4VRML1FILE_HH +#ifndef G4VTK_HH +#define G4VTK_HH #include "G4VGraphicsSystem.hh" -class G4VSceneHandler; - -class G4VRML1File: public G4VGraphicsSystem { +class G4Vtk: public G4VGraphicsSystem { public: - G4VRML1File(); - virtual ~G4VRML1File(); - G4VSceneHandler* CreateSceneHandler(const G4String& name = ""); - G4VViewer* CreateViewer(G4VSceneHandler&, const G4String& name = ""); - + G4Vtk(); + virtual ~G4Vtk(); + G4VSceneHandler* CreateSceneHandler(const G4String& name = ""); + G4VViewer* CreateViewer (G4VSceneHandler&, const G4String& name = ""); }; -#endif //G4VRML1File_HH +#endif diff --git a/source/visualization/VRML/include/G4VRML1Viewer.hh b/source/visualization/Vtk/include/G4VtkMessenger.hh similarity index 72% rename from source/visualization/VRML/include/G4VRML1Viewer.hh rename to source/visualization/Vtk/include/G4VtkMessenger.hh index b9973662d9..427e90d0e7 100644 --- a/source/visualization/VRML/include/G4VRML1Viewer.hh +++ b/source/visualization/Vtk/include/G4VtkMessenger.hh @@ -22,39 +22,35 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// -// -// -// G4VRML1Viewer.hh -// Satoshi Tanaka & Yasuhide Sawada -#ifndef WIN32 +#ifndef G4GVTKMESSENGER_HH +#define G4GVTKMESSENGER_HH 1 -#ifdef G4VIS_BUILD_VRML_DRIVER +#include "G4UImessenger.hh" +#include -#ifndef G4VRML1_VIEWER_HH -#define G4VRML1_VIEWER_HH +class G4UIdirectory; +class G4UIcmdWithABool; +class G4UIcmdWithAString; +class G4UIcommand; +class G4UIcmdWithoutParameter; -#include "G4VViewer.hh" -#include "globals.hh" +class G4VtkMessenger : public G4UImessenger { -class G4VRML1SceneHandler; - -class G4VRML1Viewer: public G4VViewer { public: - G4VRML1Viewer(G4VRML1SceneHandler& scene, const G4String& name = ""); - virtual ~G4VRML1Viewer(); - void ClearView(); - void DrawView(); - void ShowView(); - void FinishView(); -private: - void SetView(); + + static G4VtkMessenger* GetInstance(); + virtual ~G4VtkMessenger(); + + virtual G4String GetCurrentValue(G4UIcommand * command); + virtual void SetNewValue(G4UIcommand * command, G4String newValue); private: - G4VRML1SceneHandler& fSceneHandler; // Reference to Graphics Scene for this view. + static G4VtkMessenger* fpInstance; + G4VtkMessenger(); + G4UIdirectory* fpDirectory; + G4UIcommand* fpCommandExport; + G4UIcmdWithABool* fpCommandWarnings; }; -#endif //G4VRML1_VIEW_HH -#endif //G4VIS_BUILD_VRML_DRIVER -#endif //WIN32 +#endif \ No newline at end of file diff --git a/source/analysis/factory/include/g4analysis.hh b/source/visualization/Vtk/include/G4VtkQt.hh similarity index 83% rename from source/analysis/factory/include/g4analysis.hh rename to source/visualization/Vtk/include/G4VtkQt.hh index b8d54564fd..8909054c6b 100644 --- a/source/analysis/factory/include/g4analysis.hh +++ b/source/visualization/Vtk/include/G4VtkQt.hh @@ -22,25 +22,20 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// -// Author: Ivana Hrivnacova, 10/09/2019 (ivana@ipno.in2p3.fr) -#ifndef g4analysis_h -#define g4analysis_h 1 +#ifndef G4VTKQT_HH +#define G4VTKQT_HH -#include "globals.hh" -#include "g4analysis_defs.hh" +#include "G4VGraphicsSystem.hh" -namespace G4Analysis -{ - -G4ToolsAnalysisManager* ManagerInstance(const G4String& outputType); - -} +class G4VtkQt: public G4VGraphicsSystem { +public: + G4VtkQt(); + virtual ~G4VtkQt(); + G4VSceneHandler* CreateSceneHandler(const G4String& name = ""); + G4VViewer* CreateViewer (G4VSceneHandler&, const G4String& name = ""); + G4bool IsUISessionCompatible () const; +}; #endif - - - - diff --git a/source/visualization/VRML/include/FRClient.h b/source/visualization/Vtk/include/G4VtkQtSceneHandler.hh similarity index 78% rename from source/visualization/VRML/include/FRClient.h rename to source/visualization/Vtk/include/G4VtkQtSceneHandler.hh index 0e6fa93a3b..16cad3dc47 100644 --- a/source/visualization/VRML/include/FRClient.h +++ b/source/visualization/Vtk/include/G4VtkQtSceneHandler.hh @@ -22,41 +22,28 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// -// -// -// FRClient.h -// FukuiRenderer Client -// Yasuhide Sawada & Satoshi Tanaka + +#ifndef G4VTKQTSCENEHANDLER_HH +#define G4VTKQTSCENEHANDLER_HH -#ifndef WIN32 +#include "G4VSceneHandler.hh" -#ifdef G4VIS_BUILD_VRML_DRIVER +#include +#include -#ifndef FR_CLIENT_H -#define FR_CLIENT_H +#include "G4VtkQtViewer.hh" +#include "G4VtkSceneHandler.hh" -#define FRSendLength 256 +class G4VtkQtSceneHandler: public G4VtkSceneHandler { + friend class G4VtkQtViewer; -class FRClient { public: - FRClient(); - virtual ~FRClient(); + G4VtkQtSceneHandler(G4VGraphicsSystem& system, const G4String& name); + virtual ~G4VtkQtSceneHandler(); - int create(); - int connect(const char *hostname, int port); - - int send(const char *sendbuf); - int receive(char *recvbuf); - - int close(); protected: - int fd; - int port; + static G4int fSceneIdCount; // Counter for Vtk scene handlers. }; -#endif //FR_CLIENT_H -#endif //G4VIS_BUILD_VRML_DRIVER -#endif //WIN32 - +#endif diff --git a/source/visualization/HepRep/include/G4HepRepViewer.hh b/source/visualization/Vtk/include/G4VtkQtViewer.hh similarity index 76% rename from source/visualization/HepRep/include/G4HepRepViewer.hh rename to source/visualization/Vtk/include/G4VtkQtViewer.hh index e88c024021..ba2bfb85dd 100644 --- a/source/visualization/HepRep/include/G4HepRepViewer.hh +++ b/source/visualization/Vtk/include/G4VtkQtViewer.hh @@ -22,36 +22,31 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// -// -/** - * @author Mark Donszelmann - */ +#ifndef G4VTKQTVIEWER_HH +#define G4VTKQTVIEWER_HH -#ifndef G4HEPREPVIEWER_HH -#define G4HEPREPVIEWER_HH 1 +// #define G4VTKDEBUG // Comment this out to suppress debug code. -// HepRep -#include "HEPREP/HepRep.h" - -// Geant4 #include "G4VViewer.hh" -class G4HepRepViewer: public G4VViewer { - public: - G4HepRepViewer (G4VSceneHandler& scene, const G4String& name = ""); - virtual ~G4HepRepViewer (); - void SetView (); - void ClearView (); - void DrawView (); - void ShowView (); - void FinishView (); +class G4UIManager; +class G4UIQt; - void reset(); - - private: - bool geometryIncluded; +#include "QVTKOpenGLNativeWidget.h" +#include "G4VtkViewer.hh" + +class G4VtkQtViewer: public QVTKOpenGLNativeWidget, public G4VtkViewer { +public: + G4VtkQtViewer(G4VSceneHandler &, const G4String &name); + virtual ~G4VtkQtViewer(); + void Initialise(); + virtual void CreateMainWindow(QVTKOpenGLNativeWidget*, const QString&); + void FinishView(); + + private: + + G4UIQt* fUiQt; }; #endif diff --git a/source/visualization/Vtk/include/G4VtkSceneHandler.hh b/source/visualization/Vtk/include/G4VtkSceneHandler.hh new file mode 100644 index 0000000000..7cc9e84c47 --- /dev/null +++ b/source/visualization/Vtk/include/G4VtkSceneHandler.hh @@ -0,0 +1,171 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// +// +// John Allison 5th April 2001 +// A template for a simplest possible graphics driver. +//?? Lines or sections marked like this require specialisation for your driver. + +#ifndef G4VTKSCENEHANDLER_HH +#define G4VTKSCENEHANDLER_HH + + +#include "G4VSceneHandler.hh" + +#include +#include + +#include "G4VtkViewer.hh" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra-semi" +#include "vtkSmartPointer.h" +#include "vtkPolyData.h" +#include "vtkLine.h" +#include "vtkNamedColors.h" +#include "vtkProperty.h" +#include "vtkTextProperty.h" +#include "vtkPolyDataMapper.h" +#include "vtkActor.h" +#include "vtkFollower.h" +#include "vtkTextActor.h" +#include "vtkBillboardTextActor3D.h" +#include "vtkRegularPolygonSource.h" +#include "vtkSphereSource.h" +#include "vtkFeatureEdges.h" +#include "vtkCleanPolyData.h" +#include "vtkPolyDataNormals.h" +#include "vtkGlyph2D.h" +#include "vtkGlyph3D.h" +#include "vtkVertexGlyphFilter.h" +#include "vtkMatrix4x4.h" +#include "vtkDoubleArray.h" +#include "vtkPointData.h" +#include "vtkTriangleFilter.h" +#include "vtkTensorGlyph.h" +#include "vtkTensorGlyphColor.h" +#include "vtkScalarsToColors.h" +#include "vtkImageData.h" +#include "vtkVolume.h" +#include "vtkOpenGLGPUVolumeRayCastMapper.h" +#pragma GCC diagnostic pop + +class G4VtkSceneHandler: public G4VSceneHandler { + friend class G4VtkViewer; + +public: + G4VtkSceneHandler(G4VGraphicsSystem& system, const G4String& name); + virtual ~G4VtkSceneHandler() = default; + + //////////////////////////////////////////////////////////////// + // Required implementation of pure virtual functions... + + void AddPrimitive(const G4Polyline&); + void AddPrimitive(const G4Text&); + void AddPrimitive(const G4Circle&); + void AddPrimitive(const G4Square&); + void AddPrimitive(const G4Polyhedron&); + void AddPrimitiveTensorGlyph(const G4Polyhedron&); + void AddPrimitiveBakedTransform(const G4Polyhedron&); + + // Further optional AddPrimitive methods. Explicitly invoke base + // class methods if not otherwise defined to avoid warnings about + // hiding of base class methods. + void AddPrimitive(const G4Polymarker& polymarker) + { +#ifdef G4VTKDEBUG + G4cout << "=================================" << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polymarker& polymarker) called." << G4endl; +#endif + G4VSceneHandler::AddPrimitive (polymarker); + } + /* + void AddPrimitive(const G4Scale& scale) + { +#ifdef G4VTKDEBUG + G4cout << "=================================" << G4endl; + G4cout << "G4VtkSceneHandler::AddScale(const G4Scale& scale) called." << +G4endl; #endif G4VSceneHandler::AddPrimitive(scale); + } + */ + + void AddSolid(const G4Box& box); + void AddCompound(const G4Mesh& mesh); + + void Modified(); + void Clear(); + + protected: + static G4int fSceneIdCount; // Counter for Vtk scene handlers. + + // maps for polylines + std::map polylineVisAttributesMap; + std::map> polylineDataMap; + std::map> polylineLineMap; + std::map> polylinePolyDataMap; + std::map> polylinePolyDataMapperMap; + std::map> polylinePolyDataActorMap; + + // maps for circles + std::map circleVisAttributesMap; + std::map> circleDataMap; + std::map> circlePolyDataMap; + std::map> circleFilterMap; + std::map> circlePolyDataMapperMap; + std::map> circlePolyDataActorMap; + + // maps for squares + std::map squareVisAttributesMap; + std::map> squareDataMap; + std::map> squarePolyDataMap; + std::map> squareFilterMap; + std::map> squarePolyDataMapperMap; + std::map> squarePolyDataActorMap; + + // map for polyhedra + std::map polyhedronVisAttributesMap; + std::map> polyhedronDataMap; + std::map> polyhedronPolyMap; + std::map> polyhedronPolyDataMap; + std::map polyhedronPolyDataCountMap; + + // map for polyhedra instances + std::map> instancePositionMap; + std::map> instanceRotationMap; + std::map> instanceColoursMap; + std::map> instancePolyDataMap; + std::map> instanceTensorGlyphMap; + std::map> instanceActorMap; + + +private: +#ifdef G4VTKDEBUG + void PrintThings(); +#endif + +}; + +#endif diff --git a/source/visualization/Vtk/include/G4VtkViewer.hh b/source/visualization/Vtk/include/G4VtkViewer.hh new file mode 100644 index 0000000000..ba770c1a89 --- /dev/null +++ b/source/visualization/Vtk/include/G4VtkViewer.hh @@ -0,0 +1,193 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// +// +// John Allison 5th April 2001 +// A template for a simplest possible graphics driver. +//?? Lines or sections marked like this require specialisation for your driver. + +#ifndef G4VTKVIEWER_HH +#define G4VTKVIEWER_HH + +// #define G4VTKDEBUG // Comment this out to suppress debug code. + +#include "G4VViewer.hh" + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra-semi" +#include "vtkObject.h" +#include "vtkAutoInit.h" +#include "vtkCamera.h" +#include "vtkLight.h" +#include "vtkRenderer.h" +#include "vtkRenderWindow.h" +#include "vtkRenderWindowInteractor.h" +#include "vtkInteractorStyleTrackballCamera.h" +#include "vtkInteractorStyleTerrain.h" +#include "vtkTextActor.h" +#pragma GCC diagnostic pop + +VTK_MODULE_INIT(vtkRenderingOpenGL2) +VTK_MODULE_INIT(vtkInteractionStyle); +VTK_MODULE_INIT(vtkRenderingFreeType) + +class vtkGeant4Callback : public vtkCommand +{ +public: + static vtkGeant4Callback* New() {return new vtkGeant4Callback;} + + vtkGeant4Callback() { fVP = nullptr; } + void SetGeant4ViewParameters(G4ViewParameters *VP) { fVP = VP;} + void SetVtkInitialValues(G4double parallelScaleIn, G4double cameraDistanceIn) + { + parallelScale = parallelScaleIn; + cameraDistance = cameraDistanceIn; + } + virtual void Execute(vtkObject *caller, unsigned long, void*) + { + vtkRenderer *ren = reinterpret_cast(caller); + vtkCamera *cam = ren->GetActiveCamera(); + //G4cout << cam->GetFocalPoint()[0] << " " << cam->GetFocalPoint()[1] << " " << cam->GetFocalPoint()[2] << G4endl; + // + // G4cout << cam->GetPosition()[0] << " " << cam->GetPosition()[1] << " " << cam->GetPosition()[2] << G4endl; + + auto cp = cam->GetPosition(); + auto fp = cam->GetFocalPoint(); + auto ud = cam->GetViewUp(); + + fVP->SetCurrentTargetPoint(G4Point3D(fp[0],fp[1],fp[2])); + fVP->SetViewpointDirection((G4Point3D(cp[0],cp[1],cp[2]) - + G4Point3D(fp[0],fp[1],fp[2])).unit()); + fVP->SetUpVector(G4Vector3D(ud[0],ud[1], ud[2])); + + if(cam->GetParallelProjection()) { + fVP->SetZoomFactor(parallelScale/cam->GetParallelScale()); + } + else { + auto cd = std::sqrt(std::pow(cp[0]-fp[0],2) + + std::pow(cp[1]-cp[1],2) + + std::pow(cp[2]-cp[2],2)); + fVP->SetZoomFactor(cameraDistance/cd); + } + } + +protected: + G4ViewParameters *fVP; + G4double parallelScale; + G4double cameraDistance; +}; + +class vtkInfoCallback : public vtkCommand +{ +public: + static vtkInfoCallback *New() { return new vtkInfoCallback; } + + vtkInfoCallback() { + t1 = std::chrono::steady_clock::now(); + t2 = std::chrono::steady_clock::now(); + } + void SetTextActor(vtkTextActor *txt) { this->TextActor = txt; } + + virtual void Execute(vtkObject *caller, unsigned long, void*) + { + vtkRenderer *ren = reinterpret_cast(caller); + int nActors = ren->GetActors()->GetNumberOfItems(); + vtkCamera *cam = ren->GetActiveCamera(); + if(!cam) return; + + double *pos = cam->GetPosition(); + double *foc = cam->GetFocalPoint(); + double viewAngle = cam->GetViewAngle(); + double distance = cam->GetDistance(); + double parallelScale = cam->GetParallelScale(); + + if(!pos) return; + + // Get current time + t2 = std::chrono::steady_clock::now(); + + // Frame rate calculation + std::chrono::duration tdiff = t2-t1; + t1 = t2; + float fps = 1.0/tdiff.count(); + + // String for display + sprintf(this->TextBuff,"camera position : %.1f %.1f %.1f \n" + "camera focal point : %.1f %.1f %.1f \n" + "view angle : %.1f\n" + "distance : %.1f\n" + "parallel scale : %.1f\n" + "number actors : %i\n" + "fps : %.1f",pos[0], pos[1], pos[2], foc[0], foc[1], foc[2], viewAngle, distance, parallelScale, nActors, fps); + if(this->TextActor) { + this->TextActor->SetInput(this->TextBuff); + } + } +protected: + vtkTextActor *TextActor; + char TextBuff[256]; + std::chrono::time_point t1; + std::chrono::time_point t2; +}; + +class G4VtkViewer: public G4VViewer { + public: + G4VtkViewer(G4VSceneHandler&, const G4String& name); + void Initialise(); + virtual ~G4VtkViewer(); + + void SetView(); + void ClearView(); + void DrawView(); + void ShowView(); + void FinishView(); + + void DrawViewHUD(); + void DrawShadows(); + + void ExportScreenShot(G4String, G4String); + void ExportOBJScene(G4String); + void ExportVRMLScene(G4String ); + void ExportVTPScene(G4String ); + + void ExportView(){}; + void SetGeant4View(){}; + + vtkNew infoTextActor; + vtkNew infoCallback; + vtkNew geant4Callback; + vtkSmartPointer light; + vtkNew camera; + vtkNew renderer; + vtkRenderWindow* _renderWindow; + vtkRenderWindowInteractor* renderWindowInteractor; + + private: + G4bool firstSetView = true; +}; + +#endif diff --git a/source/visualization/Vtk/include/vtkTensorGlyphColor.h b/source/visualization/Vtk/include/vtkTensorGlyphColor.h new file mode 100644 index 0000000000..9053156a4a --- /dev/null +++ b/source/visualization/Vtk/include/vtkTensorGlyphColor.h @@ -0,0 +1,261 @@ +/*========================================================================= + + Program: Visualization Toolkit + Module: vtkTensorGlyphColor.h + + Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen + All rights reserved. + See Copyright.txt or http://www.kitware.com/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ +/** + * @class vtkTensorGlyphColor + * @brief scale and orient glyph(s) according to eigenvalues and eigenvectors of symmetrical part of tensor + * + * vtkTensorGlyphColor is a filter that copies a geometric representation + * (specified as polygonal data) to every input point. The geometric + * representation, or glyph, can be scaled and/or rotated according to + * the tensor at the input point. Scaling and rotation is controlled + * by the eigenvalues/eigenvectors of the symmetrical part of the tensor + * as follows: + * For each tensor, the eigenvalues (and associated eigenvectors) are sorted + * to determine the major, medium, and minor eigenvalues/eigenvectors. + * The eigenvalue decomposition only makes sense for symmetric tensors, + * hence the need to only consider the symmetric part of the tensor, which is + * 1/2 (T + T.transposed()). + * + * If the boolean variable ThreeGlyphs is not set the major eigenvalue + * scales the glyph in the x-direction, the medium in the y-direction, + * and the minor in the z-direction. Then, the glyph is rotated so + * that the glyph's local x-axis lies along the major eigenvector, + * y-axis along the medium eigenvector, and z-axis along the minor. + * + * If the boolean variable ThreeGlyphs is set three glyphs are produced, + * each of them oriented along an eigenvector and scaled according to the + * corresponding eigenvector. + * + * If the boolean variable Symmetric is set each glyph is mirrored (2 or 6 + * glyphs will be produced) + * + * The x-axis of the source glyph will correspond to the eigenvector + * on output. Point (0,0,0) in the source will be placed in the data point. + * Variable Length will normally correspond to the distance from the + * origin to the tip of the source glyph along the x-axis, + * but can be changed to produce other results when Symmetric is on, + * e.g. glyphs that do not touch or that overlap. + * + * Please note that when Symmetric is false it will generally be better + * to place the source glyph from (-0.5,0,0) to (0.5,0,0), i.e. centred + * at the origin. When symmetric is true the placement from (0,0,0) to + * (1,0,0) will generally be more convenient. + * + * A scale factor is provided to control the amount of scaling. Also, you + * can turn off scaling completely if desired. The boolean variable + * ClampScaling controls the maximum scaling (in conjunction with + * MaxScaleFactor.) This is useful in certain applications where + * singularities or large order of magnitude differences exist in + * the eigenvalues. + * + * If the boolean variable ColorGlyphs is set to true the glyphs are + * colored. The glyphs can be colored using the input scalars + * (SetColorModeToScalars), which is the default, or colored using the + * eigenvalues (SetColorModeToEigenvalues). + * + * Another instance variable, ExtractEigenvalues, has been provided to + * control extraction of eigenvalues/eigenvectors. If this boolean is + * false, then eigenvalues/eigenvectors are not extracted, and the + * columns of the tensor are taken as the eigenvectors (the norm of + * column, always positive, is the eigenvalue). This allows + * additional capability over the vtkGlyph3D object. That is, the + * glyph can be oriented in three directions instead of one. + * + * @par Thanks: + * Thanks to Jose Paulo Moitinho de Almeida for enhancements. + * + * @sa + * vtkGlyph3D vtkPointLoad vtkHyperStreamline +*/ + +#ifndef vtkTensorGlyphColor_h +#define vtkTensorGlyphColor_h + +#include "vtkFiltersCoreModule.h" // For export macro +#include "vtkPolyDataAlgorithm.h" + +class VTKFILTERSCORE_EXPORT vtkTensorGlyphColor : public vtkPolyDataAlgorithm +{ +public: + vtkTypeMacro(vtkTensorGlyphColor,vtkPolyDataAlgorithm) + void PrintSelf(ostream& os, vtkIndent indent) override; + + /** + * Construct object with scaling on and scale factor 1.0. Eigenvalues are + * extracted, glyphs are colored with input scalar data, and logarithmic + * scaling is turned off. + */ + static vtkTensorGlyphColor *New(); + + //@{ + /** + * Specify the geometry to copy to each point. + * Note that this method does not connect the pipeline. The algorithm will + * work on the input data as it is without updating the producer of the data. + * See SetSourceConnection for connecting the pipeline. + */ + void SetSourceData(vtkPolyData *source); + vtkPolyData *GetSource(); + //@} + + //@{ + /** + * Specify a source object at a specified table location. New style. + * Source connection is stored in port 1. This method is equivalent + * to SetInputConnection(1, id, outputPort). + */ + void SetSourceConnection(int id, vtkAlgorithmOutput* algOutput); + void SetSourceConnection(vtkAlgorithmOutput* algOutput) + { + this->SetSourceConnection(0, algOutput); + } + //@} + + //@{ + /** + * Turn on/off scaling of glyph with eigenvalues. + */ + vtkSetMacro(Scaling,vtkTypeBool); + vtkGetMacro(Scaling,vtkTypeBool); + vtkBooleanMacro(Scaling,vtkTypeBool); + //@} + + //@{ + /** + * Specify scale factor to scale object by. (Scale factor always affects + * output even if scaling is off.) + */ + vtkSetMacro(ScaleFactor,double); + vtkGetMacro(ScaleFactor,double); + //@} + + //@{ + /** + * Turn on/off drawing three glyphs + */ + vtkSetMacro(ThreeGlyphs,vtkTypeBool); + vtkGetMacro(ThreeGlyphs,vtkTypeBool); + vtkBooleanMacro(ThreeGlyphs,vtkTypeBool); + //@} + + //@{ + /** + * Turn on/off drawing a mirror of each glyph + */ + vtkSetMacro(Symmetric,vtkTypeBool); + vtkGetMacro(Symmetric,vtkTypeBool); + vtkBooleanMacro(Symmetric,vtkTypeBool); + //@} + + //@{ + /** + * Set/Get the distance, along x, from the origin to the end of the + * source glyph. It is used to draw the symmetric glyphs. + */ + vtkSetMacro(Length,double); + vtkGetMacro(Length,double); + //@} + + //@{ + /** + * Turn on/off extraction of eigenvalues from tensor. + */ + vtkSetMacro(ExtractEigenvalues,vtkTypeBool); + vtkBooleanMacro(ExtractEigenvalues,vtkTypeBool); + vtkGetMacro(ExtractEigenvalues,vtkTypeBool); + //@} + + //@{ + /** + * Turn on/off coloring of glyph with input scalar data or + * eigenvalues. If false, or input scalar data not present, then the + * scalars from the source object are passed through the filter. + */ + vtkSetMacro(ColorGlyphs,vtkTypeBool); + vtkGetMacro(ColorGlyphs,vtkTypeBool); + vtkBooleanMacro(ColorGlyphs,vtkTypeBool); + //@} + + enum + { + COLOR_BY_SCALARS, + COLOR_BY_EIGENVALUES + }; + + //@{ + /** + * Set the color mode to be used for the glyphs. This can be set to + * use the input scalars (default) or to use the eigenvalues at the + * point. If ThreeGlyphs is set and the eigenvalues are chosen for + * coloring then each glyph is colored by the corresponding + * eigenvalue and if not set the color corresponding to the largest + * eigenvalue is chosen. The recognized values are: + * COLOR_BY_SCALARS = 0 (default) + * COLOR_BY_EIGENVALUES = 1 + */ + vtkSetClampMacro(ColorMode, int, COLOR_BY_SCALARS, COLOR_BY_EIGENVALUES); + vtkGetMacro(ColorMode, int); + void SetColorModeToScalars() + {this->SetColorMode(COLOR_BY_SCALARS);}; + void SetColorModeToEigenvalues() + {this->SetColorMode(COLOR_BY_EIGENVALUES);}; + //@} + + //@{ + /** + * Turn on/off scalar clamping. If scalar clamping is on, the ivar + * MaxScaleFactor is used to control the maximum scale factor. (This is + * useful to prevent uncontrolled scaling near singularities.) + */ + vtkSetMacro(ClampScaling,vtkTypeBool); + vtkGetMacro(ClampScaling,vtkTypeBool); + vtkBooleanMacro(ClampScaling,vtkTypeBool); + //@} + + //@{ + /** + * Set/Get the maximum allowable scale factor. This value is compared to the + * combination of the scale factor times the eigenvalue. If less, the scale + * factor is reset to the MaxScaleFactor. The boolean ClampScaling has to + * be "on" for this to work. + */ + vtkSetMacro(MaxScaleFactor,double); + vtkGetMacro(MaxScaleFactor,double); + //@} + +protected: + vtkTensorGlyphColor(); + ~vtkTensorGlyphColor() override; + + int RequestUpdateExtent(vtkInformation *, vtkInformationVector **, vtkInformationVector *) override; + int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) override; + int FillInputPortInformation(int port, vtkInformation *info) override; + + vtkTypeBool Scaling; // Determine whether scaling of geometry is performed + double ScaleFactor; // Scale factor to use to scale geometry + vtkTypeBool ExtractEigenvalues; // Boolean controls eigenfunction extraction + vtkTypeBool ColorGlyphs; // Boolean controls coloring with input scalar data + int ColorMode; // The coloring mode to use for the glyphs. + vtkTypeBool ClampScaling; // Boolean controls whether scaling is clamped. + double MaxScaleFactor; // Maximum scale factor (ScaleFactor*eigenvalue) + vtkTypeBool ThreeGlyphs; // Boolean controls drawing 1 or 3 glyphs + vtkTypeBool Symmetric; // Boolean controls drawing a "mirror" of each glyph + double Length; // Distance, in x, from the origin to the end of the glyph +private: + vtkTensorGlyphColor(const vtkTensorGlyphColor&) = delete; + void operator=(const vtkTensorGlyphColor&) = delete; +}; + +#endif diff --git a/source/visualization/Vtk/sources.cmake b/source/visualization/Vtk/sources.cmake new file mode 100644 index 0000000000..303e87ec87 --- /dev/null +++ b/source/visualization/Vtk/sources.cmake @@ -0,0 +1,73 @@ +#------------------------------------------------------------------------------ +# sources.cmake +# Module : G4visVtk +# Package: Geant4.src.G4visualization.G4visQt3D +# +# Sources description for a library. +# Lists the sources and headers of the code explicitely. +# Lists include paths needed. +# Lists the internal granular and global dependencies of the library. +# Source specific properties should be added at the end. +# +# Generated on : 24/9/2010 +# +# +#------------------------------------------------------------------------------ + +# +# Define the Geant4 Module. +# + +set(G4VIS_MODULE_VTK_HEADERS + G4Vtk.hh + G4VtkMessenger.hh + G4VtkSceneHandler.hh + G4VtkViewer.hh + vtkTensorGlyphColor.h) + +set(G4VIS_MODULE_VTK_SOURCES + G4Vtk.cc + G4VtkMessenger.cc + G4VtkSceneHandler.cc + G4VtkViewer.cc + vtkTensorGlyphColor.cxx) + +set(G4VIS_MODULE_VTK_DEFINITIONS + -DG4VIS_USE_VTK) + +if(GEANT4_USE_QT) + list(APPEND G4VIS_MODULE_VTK_HEADERS + G4VtkQt.hh + G4VtkQtSceneHandler.hh + G4VtkQtViewer.hh) + + list(APPEND G4VIS_MODULE_VTK_SOURCES + G4VtkQt.cc + G4VtkQtSceneHandler.cc + G4VtkQtViewer.cc) + + list(APPEND G4VIS_MODULE_VTK_DEFINITIONS -DG4VIS_USE_VTK_QT) +endif() + +add_definitions(${G4VIS_MODULE_VTK_DEFINITIONS}) + +geant4_add_module(G4visVtk + PUBLIC_HEADERS ${G4VIS_MODULE_VTK_HEADERS} + SOURCES ${G4VIS_MODULE_VTK_SOURCES}) + +geant4_module_compile_definitions(G4visVtk PRIVATE ${G4VIS_MODULE_VTK_DEFINITIONS}) +geant4_module_compile_definitions(G4UIcommon PRIVATE ${G4VIS_MODULE_VTK_DEFINITIONS}) + +geant4_module_link_libraries(G4visVtk + PUBLIC + G4modeling + G4globman + G4hepgeometry + G4vis_management + ${VTK_LIBRARIES} + PRIVATE + G4graphics_reps + G4UIbasic + G4UIcommon) + + diff --git a/examples/advanced/gammaray_telescope/src/GammaRayTelGeneralPhysics.cc b/source/visualization/Vtk/src/G4Vtk.cc similarity index 58% rename from examples/advanced/gammaray_telescope/src/GammaRayTelGeneralPhysics.cc rename to source/visualization/Vtk/src/G4Vtk.cc index 8dafcf394c..d99f3550b1 100644 --- a/examples/advanced/gammaray_telescope/src/GammaRayTelGeneralPhysics.cc +++ b/source/visualization/Vtk/src/G4Vtk.cc @@ -24,46 +24,45 @@ // ******************************************************************** // // +// // +// John Allison 5th April 2001 +// A template for a simplest possible graphics driver. +//?? Lines or sections marked like this require specialisation for your driver. -#include "GammaRayTelGeneralPhysics.hh" +#include "G4Vtk.hh" +#include "G4VtkSceneHandler.hh" +#include "G4VtkViewer.hh" +#include "G4VtkMessenger.hh" -#include "globals.hh" -#include "G4ios.hh" -#include - -GammaRayTelGeneralPhysics::GammaRayTelGeneralPhysics(const G4String& name) - : G4VPhysicsConstructor(name) +G4Vtk::G4Vtk(): G4VGraphicsSystem("VtkNative","VTKN","Vtk with native windowing", + G4VGraphicsSystem::noFunctionality) { + G4VtkMessenger::GetInstance(); } -GammaRayTelGeneralPhysics::~GammaRayTelGeneralPhysics() -{ +G4Vtk::~G4Vtk() {} + +G4VSceneHandler* G4Vtk::CreateSceneHandler(const G4String& name) { + G4VSceneHandler* pScene = new G4VtkSceneHandler(*this, name); + return pScene; } -#include "G4ProcessManager.hh" - -void GammaRayTelGeneralPhysics::ConstructParticle() -{ - -} - -void GammaRayTelGeneralPhysics::ConstructProcess() -{ - // Add Decay Process - auto particleIterator=GetParticleIterator(); - particleIterator->reset(); - while( (*particleIterator)() ){ - G4ParticleDefinition* particle = particleIterator->value(); - G4ProcessManager* pmanager = particle->GetProcessManager(); - if (fDecayProcess.IsApplicable(*particle) && !particle->IsShortLived()) { - pmanager ->AddProcess(&fDecayProcess); - // set ordering for PostStepDoIt and AtRestDoIt - pmanager ->SetProcessOrdering(&fDecayProcess, idxPostStep); - pmanager ->SetProcessOrdering(&fDecayProcess, idxAtRest); +G4VViewer* G4Vtk::CreateViewer(G4VSceneHandler& scene, + const G4String& name) { + G4VViewer* pView = new G4VtkViewer((G4VtkSceneHandler&) scene, name); + if (pView) { + if (pView->GetViewId() < 0) { + G4cerr << "G4Vtk::CreateViewer: ERROR flagged by negative" + " view id in G4VtkViewer creation." + "\n Destroying view and returning null pointer." + << G4endl; + delete pView; + pView = 0; } } + else { + G4cerr << "G4Vtk::CreateViewer: ERROR: null pointer on new G4VtkViewer." << G4endl; + } + return pView; } - - - diff --git a/source/visualization/Vtk/src/G4VtkMessenger.cc b/source/visualization/Vtk/src/G4VtkMessenger.cc new file mode 100644 index 0000000000..c4e1df0a66 --- /dev/null +++ b/source/visualization/Vtk/src/G4VtkMessenger.cc @@ -0,0 +1,131 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** + +#include "G4VtkMessenger.hh" +#include "G4VtkViewer.hh" + +#include "G4UIdirectory.hh" +#include "G4UIcmdWithABool.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithoutParameter.hh" +#include "G4UIcommand.hh" +#include "G4Tokenizer.hh" + +#include "G4VisManager.hh" + +#include "vtkObject.h" + +G4VtkMessenger* G4VtkMessenger::fpInstance = nullptr; + +G4VtkMessenger* G4VtkMessenger::GetInstance() +{ + if (!fpInstance) fpInstance = new G4VtkMessenger; + return fpInstance; +} + +G4VtkMessenger::G4VtkMessenger() { + G4bool omitable; + + fpDirectory = new G4UIdirectory("/vis/vtk/"); + fpDirectory->SetGuidance("G4VtkViewer commands."); + + // Export command + fpCommandExport = new G4UIcommand("/vis/vtk/export", this); + fpCommandExport->SetGuidance ("Export a screenshot or OBJ file of current Vtk viewer"); + + // File type for export + auto parameterExport = new G4UIparameter ("name", 's', omitable = true); + fpCommandExport->SetGuidance ("File type (jpg,tiff,eps,ps,obj,vrml)"); + fpCommandExport->SetParameter(parameterExport); + + // File name for export + parameterExport = new G4UIparameter ("name", 's', omitable = true); + fpCommandExport->SetGuidance ("File name"); + fpCommandExport->SetParameter(parameterExport); + + // Vtk warnings output + fpCommandWarnings = new G4UIcmdWithABool("/vis/vtk/warnings", this); + fpCommandExport->SetGuidance ("Enable (True) or disable (False) VTK warnings"); +} + +G4VtkMessenger::~G4VtkMessenger() +{ + delete fpDirectory; + delete fpCommandExport; + delete fpCommandWarnings; +} +G4String G4VtkMessenger::GetCurrentValue(G4UIcommand * /*command*/) { + return G4String(); +} + +void G4VtkMessenger::SetNewValue(G4UIcommand *command, G4String newValue) +{ + + G4VisManager* pVisManager = G4VisManager::GetInstance(); + + G4VViewer* pViewer = pVisManager->GetCurrentViewer(); + if (!pViewer) { + G4cout << "G4VtkMessenger::SetNewValue: No current viewer.\n" + << "\"/vis/open\", or similar, to get one." + << G4endl; + return; + } + + auto* pVtkViewer = dynamic_cast(pViewer); + if (!pVtkViewer) { + G4cout << "G4OpenGLViewerMessenger::SetNewValue: Current viewer is not of type VTK. \n" + << "(It is \"" + << pViewer->GetName() + << "\".)\n" + << "Use \"/vis/viewer/select\" or \"/vis/open\"." + << G4endl; + return; + } + + if (command == fpCommandExport) + { + G4String format, name; + + std::istringstream iss(newValue); + iss >> format >> name; + + if(format == "jpg" || format == "tiff" || + format == "png" || format == "bmp" || + format == "pnm" || format == "ps") + pVtkViewer->ExportScreenShot(name, format); + else if(format == "obj") + pVtkViewer->ExportOBJScene(name); + else if(format == "vrml") + pVtkViewer->ExportVRMLScene(name); + else if(format == "vtp") + pVtkViewer->ExportVTPScene(name); + else + G4cout << "Unknown /vis/vtk/export file format" << G4endl; + } + else if (command == fpCommandWarnings) + { + vtkObject::GlobalWarningDisplayOff(); + } +} \ No newline at end of file diff --git a/source/visualization/Vtk/src/G4VtkQt.cc b/source/visualization/Vtk/src/G4VtkQt.cc new file mode 100644 index 0000000000..205978e40e --- /dev/null +++ b/source/visualization/Vtk/src/G4VtkQt.cc @@ -0,0 +1,90 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** + +#include "G4VtkQt.hh" +#include "G4VtkQtSceneHandler.hh" +#include "G4VtkQtViewer.hh" + +#include "G4UIQt.hh" +#include "G4UImanager.hh" +#include "G4UIbatch.hh" + +G4VtkQt::G4VtkQt(): G4VGraphicsSystem("VtkQt","VTKQt","VTK with Qt", + G4VGraphicsSystem::noFunctionality) +{} + +G4VtkQt::~G4VtkQt() {} + +G4VSceneHandler* G4VtkQt::CreateSceneHandler(const G4String& name) { + G4VSceneHandler* pScene = new G4VtkQtSceneHandler(*this, name); + return pScene; +} + +G4VViewer* G4VtkQt::CreateViewer(G4VSceneHandler& scene, + const G4String& name) { + G4VViewer* pView = new G4VtkQtViewer((G4VtkQtSceneHandler&) scene, name); + if (pView) { + if (pView->GetViewId() < 0) { + G4cerr << "G4VtkQt::CreateViewer: ERROR flagged by negative" + " view id in G4VtkViewer creation." + "\n Destroying view and returning null pointer." + << G4endl; + delete pView; + pView = nullptr; + } + } + else { + G4cerr << "G4Vtk::CreateViewer: ERROR: null pointer on new G4VtkViewer." << G4endl; + } + return pView; +} + +G4bool G4VtkQt::IsUISessionCompatible () const +{ + G4bool isCompatible = false; + G4UImanager* ui = G4UImanager::GetUIpointer(); + G4UIsession* session = ui->GetSession(); + + // If session is a batch session, it may be: + // a) this is a batch job (the user has not instantiated any UI session); + // b) we are currently processing a UI command, in which case the UI + // manager creates a temporary batch session and to find out if there is + // a genuine UI session that the user has instantiated we must drill + // down through previous sessions to a possible non-batch session. + while (G4UIbatch* batch = dynamic_cast(session)) { + session = batch->GetPreviousSession(); + } + + // Qt windows are only appropriate in a Qt session. + if (session) { + // If non-zero, this is the originating non-batch session + // The user has instantiated a UI session... + if (dynamic_cast(session)) { + // ...and it's a G4UIQt session, which is OK. + isCompatible = true; + } + } + return isCompatible; +} diff --git a/examples/advanced/purging_magnet/include/PurgMagAnalysisManager.hh b/source/visualization/Vtk/src/G4VtkQtSceneHandler.cc similarity index 70% rename from examples/advanced/purging_magnet/include/PurgMagAnalysisManager.hh rename to source/visualization/Vtk/src/G4VtkQtSceneHandler.cc index 2fd7e7628e..403a82dc0d 100644 --- a/examples/advanced/purging_magnet/include/PurgMagAnalysisManager.hh +++ b/source/visualization/Vtk/src/G4VtkQtSceneHandler.cc @@ -22,31 +22,32 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// -// Code developed by: -// S.Larsson -// -// ************************************ -// * * -// * PurgMagAnalysisManager.hh * -// * * -// ************************************ -// -// -#ifndef G4PROCESSTESTANALYSIS_HH -#define G4PROCESSTESTANALYSIS_HH - -//!Uncomment #include to switch to ROOT or XML output file -//#include "g4root.hh" -//#include "g4xml.hh" - -//! Default here is a CSV file -#include "g4csv.hh" - - -#endif +#include "G4VtkQtSceneHandler.hh" +#include "G4PhysicalVolumeModel.hh" +#include "G4LogicalVolumeModel.hh" +#include "G4VPhysicalVolume.hh" +#include "G4LogicalVolume.hh" +#include "G4Polyline.hh" +#include "G4Text.hh" +#include "G4Circle.hh" +#include "G4Square.hh" +#include "G4Polyhedron.hh" +#include "G4UnitsTable.hh" +#include "G4SystemOfUnits.hh" +#include "G4Material.hh" +#include "G4Box.hh" + +G4int G4VtkQtSceneHandler::fSceneIdCount = 0; +// Counter for XXX scene handlers. + +G4VtkQtSceneHandler::G4VtkQtSceneHandler(G4VGraphicsSystem& system, + const G4String& name) : + G4VtkSceneHandler(system, name) +{} + +G4VtkQtSceneHandler::~G4VtkQtSceneHandler() {} diff --git a/source/visualization/VRML/src/G4VRML1.cc b/source/visualization/Vtk/src/G4VtkQtViewer.cc similarity index 50% rename from source/visualization/VRML/src/G4VRML1.cc rename to source/visualization/Vtk/src/G4VtkQtViewer.cc index 2f4eee9e59..c8e4cd1d3e 100644 --- a/source/visualization/VRML/src/G4VRML1.cc +++ b/source/visualization/Vtk/src/G4VtkQtViewer.cc @@ -22,73 +22,67 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// -// -// -// G4VRML1.cc -// Yasuhide Sawada & Satoshi Tanaka - -#ifndef WIN32 - -//=================// -#ifdef G4VIS_BUILD_VRML_DRIVER -//=================// - - -#include // sscanf -#include // getenv #include "G4VSceneHandler.hh" -#include "G4VRML1.hh" -#include "G4VRML1SceneHandler.hh" -#include "G4VRML1Viewer.hh" +#include "G4VtkQtViewer.hh" +#include "G4VtkQtSceneHandler.hh" -#include "G4FRClient.hh" +#include "G4UImanager.hh" +#include "G4UIQt.hh" +#include "G4Qt.hh" +#include +#include "vtkVersion.h" +#include "vtkNew.h" +#include "vtkNamedColors.h" +#include "vtkCylinderSource.h" +#include "vtkPolyDataMapper.h" +#include "vtkProperty.h" +#include "vtkCamera.h" +#include "vtkActor.h" +#include "vtkRenderer.h" +#include "vtkGenericOpenGLRenderWindow.h" -G4VRML1::G4VRML1() : - G4VGraphicsSystem("VRML1", "VRML1", G4VGraphicsSystem::threeD) -{ - // port number - fPort = FR_VRML_DEFAULT_PORT; - char *pport = std::getenv(FR_VRML_PORT_ENV); - if (pport) { - sscanf(pport, "%d", &fPort); - } - - // host name - fHostName = "localhost" ; // G4String::operator = ( const char* cs ) - char *phostname = std::getenv(FR_VRML_HOST_NAME_ENV); - if (phostname) { - fHostName = phostname; - } +G4VtkQtViewer::G4VtkQtViewer (G4VSceneHandler& sceneHandler, const G4String& name) : + G4VtkViewer(sceneHandler, name) { } -G4VRML1::~G4VRML1() +G4VtkQtViewer::~G4VtkQtViewer() {} + +void G4VtkQtViewer::Initialise() { -} + CreateMainWindow(this, QString(GetName())); + // Specific GL render window and interactor for Qt + _renderWindow = vtkGenericOpenGLRenderWindow::New(); + renderWindowInteractor = vtkRenderWindowInteractor::New(); -G4VSceneHandler* G4VRML1::CreateSceneHandler(const G4String& name) -{ - G4VSceneHandler *p = NULL; - - p = new G4VRML1SceneHandler(*this, name); - - return p; -} - -G4VViewer* G4VRML1::CreateViewer(G4VSceneHandler& scene, const G4String& name) -{ - G4VViewer* pView = NULL; - - G4VRML1SceneHandler* pScene = (G4VRML1SceneHandler*)&scene; - pView = new G4VRML1Viewer(*pScene, name); - - return pView; -} - -#endif + _renderWindow->AddRenderer(renderer); +#if VTK_MAJOR_VERSION == 8 + this->SetRenderWindow(_renderWindow); +#else + this->setRenderWindow(_renderWindow); #endif + // Set callback to match VTK parameters to Geant4 + geant4Callback->SetGeant4ViewParameters(&fVP); + renderer->AddObserver(vtkCommand::EndEvent, geant4Callback); +} + +void G4VtkQtViewer::CreateMainWindow(QVTKOpenGLNativeWidget *vtkWidget, + const QString& name) { + // G4Qt* interactorManager = G4Qt::getInstance (); + G4UImanager* UI = G4UImanager::GetUIpointer(); + fUiQt = static_cast (UI->GetG4UIWindow()); + fUiQt->AddTabWidget((QWidget*)vtkWidget,name); +} + +void G4VtkQtViewer::FinishView() +{ + G4VtkViewer::FinishView(); + // force a widget repaint as there should already + // be a rendered buffer when visualiser starts up + // paintGL(); + // repaint(); +} \ No newline at end of file diff --git a/source/visualization/Vtk/src/G4VtkSceneHandler.cc b/source/visualization/Vtk/src/G4VtkSceneHandler.cc new file mode 100644 index 0000000000..cc3c9ef12a --- /dev/null +++ b/source/visualization/Vtk/src/G4VtkSceneHandler.cc @@ -0,0 +1,876 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// +// +// John Allison 5th April 2001 +// A template for a simplest possible graphics driver. +//?? Lines or sections marked like this require specialisation for your driver. + +#include "G4VtkSceneHandler.hh" + +#include "G4PhysicalVolumeModel.hh" +#include "G4LogicalVolumeModel.hh" +#include "G4VPhysicalVolume.hh" +#include "G4LogicalVolume.hh" +#include "G4Polyline.hh" +#include "G4Text.hh" +#include "G4Circle.hh" +#include "G4Square.hh" +#include "G4Polyhedron.hh" +#include "G4Mesh.hh" +#include "G4PseudoScene.hh" +#include "G4UnitsTable.hh" + +#include "G4SystemOfUnits.hh" +#include "G4Material.hh" +#include "G4Box.hh" + +#include + +namespace std +{ + inline void hash_combine(std::size_t) {} + + template + inline void hash_combine(std::size_t &seed, const T &v, Rest... rest) { + std::hash hasher; + seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + std::hash_combine(seed, rest...); + } + + template<> struct hash { + std::size_t operator()(const G4VisAttributes &va) const { + using std::size_t; + using std::hash; + + std::size_t h = 0; + + std::hash_combine(h,va.IsVisible()); + std::hash_combine(h,va.IsDaughtersInvisible()); + std::hash_combine(h,va.GetColour().GetRed()); + std::hash_combine(h,va.GetColour().GetGreen()); + std::hash_combine(h,va.GetColour().GetBlue()); + std::hash_combine(h,va.GetColour().GetAlpha()); + std::hash_combine(h,static_cast(va.GetLineStyle())); + + return h; + } + }; + + template<> struct hash { + std::size_t operator()(const G4Polyhedron &ph) const { + using std::size_t; + using std::hash; + + G4bool notLastFace; + G4Point3D vertex[4]; + G4int edgeFlag[4]; + G4Normal3D normals[4]; + G4int nEdges; + + std::size_t h = 0; + + do { + notLastFace = ph.GetNextFacet(nEdges, vertex, edgeFlag, normals); + + for (int i = 0; i < nEdges; i++) { + std::size_t hx = std::hash()(vertex[i].x()); + std::size_t hy = std::hash()(vertex[i].y()); + std::size_t hz = std::hash()(vertex[i].z()); + std::hash_combine(h,hx); + std::hash_combine(h,hy); + std::hash_combine(h,hz); + } + } while (notLastFace); + + return h; + } + }; +} + +G4int G4VtkSceneHandler::fSceneIdCount = 0; +// Counter for XXX scene handlers. + +G4VtkSceneHandler::G4VtkSceneHandler(G4VGraphicsSystem& system, + const G4String& name) : + G4VSceneHandler(system, fSceneIdCount++, name) +{} + +#ifdef G4VTKDEBUG +void G4VtkSceneHandler::PrintThings() { + G4cout << " with transformation " << fObjectTransformation.xx() << G4endl; + if (fpModel) { + G4cout << " from " << fpModel->GetCurrentDescription() + << " (tag " << fpModel->GetCurrentTag() + << ')'; + } + else { + G4cout << "(not from a model)"; + } + G4PhysicalVolumeModel* pPVModel = dynamic_cast(fpModel); + if (pPVModel) { + G4cout << "\n current physical volume: " << pPVModel->GetCurrentPV()->GetName() + << "\n current logical volume : " << pPVModel->GetCurrentLV()->GetName() // There might be a problem with the LV pointer if this is a G4LogicalVolumeModel + << "\n current depth of geometry tree: " << pPVModel->GetCurrentDepth(); + } + G4cout << G4endl; +} +#endif + +void G4VtkSceneHandler::AddPrimitive(const G4Polyline& polyline) { + + G4VSceneHandler::MarkerSizeType sizeType; + // GetMarkerSize(text,sizeType); + if(fProcessing2D) {sizeType = screen;} + else {sizeType = world;} + + // Get vis attributes - pick up defaults if none. + const G4VisAttributes* pVA = fpViewer -> GetApplicableVisAttributes(polyline.GetVisAttributes()); + G4Color colour = pVA->GetColour(); + G4double opacity = colour.GetAlpha(); + G4double lineWidth = pVA->GetLineWidth(); + +#ifdef G4VTKDEBUG + G4cout << "=================================" << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyline& polyline) called> vis hash: " << sizeType << " " << std::hash{}(*pVA) << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyline& polyline) called> sizeType: " << sizeType << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyline& polyline) called> isVisible: " << pVA->IsVisible() << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyline& polyline) called> isDaughtersInvisible: " << pVA->IsDaughtersInvisible() << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyline& polyline) called> colour: " << colour.GetRed() << " " << colour.GetGreen() << " " << colour.GetBlue() << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyline& polyline) called> alpha: " << colour.GetAlpha() << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyline& polyline) called> lineWidth: " << lineWidth << G4endl; +#endif + + if(sizeType == world) { + std::size_t hash = std::hash{}(*pVA); + if (polylineVisAttributesMap.find(hash) == polylineVisAttributesMap.end()) { + polylineVisAttributesMap.insert(std::pair(hash, pVA)); + + vtkSmartPointer data = vtkSmartPointer::New(); + vtkSmartPointer lines = vtkSmartPointer::New(); + vtkSmartPointer polyData = vtkSmartPointer::New(); + vtkSmartPointer mapper = vtkSmartPointer::New(); + vtkSmartPointer actor = vtkSmartPointer::New(); + + polyData->SetPoints(data); + polyData->SetLines(lines); + mapper->SetInputData(polyData); + actor->SetMapper(mapper); + + // Setup actor and mapper + actor->GetProperty()->SetLineWidth(lineWidth); + actor->GetProperty()->SetColor(colour.GetRed(), colour.GetGreen(), + colour.GetBlue()); + actor->GetProperty()->SetOpacity(opacity); + actor->SetVisibility(1); + // actor->GetProperty()->BackfaceCullingOn(); + // actor->GetProperty()->FrontfaceCullingOn(); + + auto pVtkViewer = dynamic_cast(fpViewer); + pVtkViewer->renderer->AddActor(actor); + + polylineDataMap.insert( + std::pair>(hash, data)); + polylineLineMap.insert( + std::pair>(hash, lines)); + polylinePolyDataMap.insert( + std::pair>(hash, polyData)); + polylinePolyDataMapperMap.insert( + std::pair>(hash, + mapper)); + polylinePolyDataActorMap.insert( + std::pair>(hash, actor)); + } + + // Data data + const size_t nLines = polyline.size(); + + for (size_t i = 0; i < nLines; ++i) { + auto id = polylineDataMap[hash]->InsertNextPoint(polyline[i].x(), + polyline[i].y(), + polyline[i].z()); + if (i < nLines - 1) { + vtkSmartPointer line = vtkSmartPointer::New(); + line->GetPointIds()->SetId(0, id); + line->GetPointIds()->SetId(1, id + 1); + polylineLineMap[hash]->InsertNextCell(line); + } + } + } + else if (sizeType == screen ) { + + } +} + +void G4VtkSceneHandler::AddPrimitive(const G4Text& text) { + + G4VSceneHandler::MarkerSizeType sizeType; + if(fProcessing2D) {sizeType = screen;} + else {sizeType = world;} + + const G4VisAttributes* pVA = fpViewer -> GetApplicableVisAttributes(text.GetVisAttributes()); + G4Color colour = pVA->GetColour(); + G4double opacity = colour.GetAlpha(); + // G4Text::Layout layout = text.GetLayout(); + // G4double xOffset = text.GetXOffset(); + // G4double yOffset = text.GetYOffset(); + + double x = text.GetPosition().x(); + double y = text.GetPosition().y(); + double z = text.GetPosition().z(); + +#ifdef G4VTKDEBUG + G4cout << "=================================" << G4endl; + G4cout << "G4VtkSeneHandler::AddPrimitive(const G4Text& text) called> text: " << text.GetText() << " sizeType:" << sizeType << " " << fProcessing2D << G4endl; + G4cout << "G4VtkSeneHandler::AddPrimitive(const G4Text& text) called> colour: " << colour.GetRed() << " " << colour.GetBlue() << " " << colour.GetGreen() << G4endl; + G4cout << "G4VtkSeneHandler::AddPrimitive(const G4Text& text) called> alpha: " << colour.GetAlpha() << G4endl; + G4cout << "G4VtkSeneHandler::AddPrimitive(const G4Text& text) called> position: " << x << " " << y << " " << z << G4endl; +#endif + + switch (sizeType) { + default: + case (screen): { + vtkSmartPointer actor = vtkSmartPointer::New(); + actor->SetInput(text.GetText().c_str()); + actor->GetPositionCoordinate()->SetCoordinateSystemToNormalizedViewport(); + // actor->SetTextScaleModeToViewport(); + actor->SetPosition((x+1.)/2.0, (y+1.)/2.); + actor->GetTextProperty()->SetFontSize(text.GetScreenSize()); + actor->GetTextProperty()->SetColor(colour.GetRed(), colour.GetBlue(), colour.GetGreen()); + actor->GetTextProperty()->SetOpacity(opacity); + + auto *pVtkViewer = dynamic_cast(fpViewer); + pVtkViewer->renderer->AddActor(actor); + break; + } + case world: { + vtkSmartPointer actor = vtkSmartPointer::New(); + actor->SetInput(text.GetText().c_str()); + actor->SetPosition(x, y, z); + actor->GetTextProperty()->SetFontSize(text.GetScreenSize()); + actor->GetTextProperty()->SetColor(colour.GetRed(), colour.GetBlue(), colour.GetGreen()); + actor->GetTextProperty()->SetOpacity(opacity); + + auto *pVtkViewer = dynamic_cast(fpViewer); + pVtkViewer->renderer->AddActor(actor); + break; + } + } +} + +void G4VtkSceneHandler::AddPrimitive(const G4Circle& circle) { + + MarkerSizeType sizeType; + G4double size= GetMarkerSize(circle, sizeType); + if(fProcessing2D) {sizeType = screen;} + else {sizeType = world;} + + // Get vis attributes - pick up defaults if none. + const G4VisAttributes *pVA = fpViewer->GetApplicableVisAttributes(circle.GetVisAttributes()); + G4Color colour = pVA->GetColour(); + G4double opacity = colour.GetAlpha(); + // G4bool isVisible = pVA->IsVisible(); + +#ifdef G4VTKDEBUG + G4cout << "=================================" << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Circle& circle) called> " << " radius:" << size << " sizeType:" << sizeType << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Circle& circle) called> colour: " << colour.GetRed() << " " << colour.GetBlue() << " " << colour.GetGreen() << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Circle& circle) called> alpha: " << colour.GetAlpha() << G4endl; +#endif + + if (sizeType == world) { + std::size_t hash = std::hash{}(*pVA); + if (circleVisAttributesMap.find(hash) == circleVisAttributesMap.end()) { + circleVisAttributesMap.insert(std::pair(hash, pVA)); + + vtkSmartPointer data = vtkSmartPointer::New(); + vtkSmartPointer polyData = vtkSmartPointer::New(); + vtkSmartPointer filter = vtkSmartPointer::New(); + vtkSmartPointer mapper = vtkSmartPointer::New(); + vtkSmartPointer actor = vtkSmartPointer::New(); + + polyData->SetPoints(data); + filter->SetInputData(polyData); + mapper->SetInputConnection(filter->GetOutputPort()); + actor->SetMapper(mapper); + + // Setup actor and mapper + actor->GetProperty()->SetColor(colour.GetRed(), colour.GetGreen(), colour.GetBlue()); + actor->GetProperty()->SetOpacity(opacity); + actor->SetVisibility(1); + actor->GetProperty()->SetRenderPointsAsSpheres(true); + actor->GetProperty()->SetPointSize(size*5); + + auto *pVtkViewer = dynamic_cast(fpViewer); + pVtkViewer->renderer->AddActor(actor); + + circleDataMap.insert(std::pair>(hash, data)); + circlePolyDataMap.insert(std::pair>(hash, polyData)); + circleFilterMap.insert(std::pair>(hash, filter)); + circlePolyDataMapperMap.insert(std::pair>(hash, mapper)); + circlePolyDataActorMap.insert(std::pair>(hash, actor)); + } + + // Data data point + const CLHEP::HepRotation rot = fObjectTransformation.getRotation(); + G4Point3D posPrime = rot*circle.GetPosition(); + circleDataMap[hash]->InsertNextPoint(fObjectTransformation.dx() + posPrime.x(), + fObjectTransformation.dy() + posPrime.y(), + fObjectTransformation.dz() + posPrime.z()); + } + else if (sizeType == screen) { + + } +} + +void G4VtkSceneHandler::AddPrimitive(const G4Square& square) { + + MarkerSizeType sizeType; + G4double size = GetMarkerSize (square, sizeType); + + // Get vis attributes - pick up defaults if none. + const G4VisAttributes* pVA = fpViewer -> GetApplicableVisAttributes(square.GetVisAttributes()); + G4Color colour = pVA->GetColour(); + G4double opacity = colour.GetAlpha(); + // G4bool isVisible = pVA->IsVisible(); + + // Draw in world coordinates. + vtkSmartPointer polygonSource = vtkSmartPointer::New(); + polygonSource->SetNumberOfSides(4); + polygonSource->SetRadius(size); + + +#ifdef G4VTKDEBUG + G4cout << "=================================" << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Square& square) called" << G4endl; + G4cout << square.GetPosition().x() << " " << square.GetPosition().y() << " " << square.GetPosition().z() << G4endl; + //PrintThings(); +#endif + + if (sizeType == world) { + std::size_t hash = std::hash{}(*pVA); + if (squareVisAttributesMap.find(hash) == squareVisAttributesMap.end()) { + squareVisAttributesMap.insert(std::pair(hash, pVA)); + + vtkSmartPointer data = vtkSmartPointer::New(); + vtkSmartPointer polyData = vtkSmartPointer::New(); + vtkSmartPointer filter = vtkSmartPointer::New(); + vtkSmartPointer mapper = vtkSmartPointer::New(); + vtkSmartPointer actor = vtkSmartPointer::New(); + + polyData->SetPoints(data); + filter->SetInputData(polyData); + mapper->SetInputConnection(filter->GetOutputPort()); + actor->SetMapper(mapper); + + // Setup actor and mapper + actor->GetProperty()->SetColor(colour.GetRed(), colour.GetGreen(), colour.GetBlue()); + actor->GetProperty()->SetOpacity(opacity); + actor->SetVisibility(1); + actor->GetProperty()->SetPointSize(size*5); + + auto *pVtkViewer = dynamic_cast(fpViewer); + pVtkViewer->renderer->AddActor(actor); + + squareDataMap.insert(std::pair>(hash, data)); + squarePolyDataMap.insert(std::pair>(hash, polyData)); + squareFilterMap.insert(std::pair>(hash, filter)); + squarePolyDataMapperMap.insert(std::pair>(hash, mapper)); + squarePolyDataActorMap.insert(std::pair>(hash, actor)); + } + + // Data data point + const CLHEP::HepRotation rot = fObjectTransformation.getRotation(); + G4Point3D posPrime = rot*square.GetPosition(); + squareDataMap[hash]->InsertNextPoint(fObjectTransformation.dx() + posPrime.x(), + fObjectTransformation.dy() + posPrime.y(), + fObjectTransformation.dz() + posPrime.z()); + } + else if (sizeType == screen) { + + } +} +void G4VtkSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) { + AddPrimitiveTensorGlyph(polyhedron); +} + +void G4VtkSceneHandler::AddPrimitiveTensorGlyph(const G4Polyhedron& polyhedron) { + // only have a single polydata object for each LV but bake in the PV + // transformation so clippers and cutters can be implemented + + //Get colour, etc.. + if (polyhedron.GetNoFacets() == 0) {return;} + + // Get vis attributes - pick up defaults if none. + const G4VisAttributes *pVA = fpViewer->GetApplicableVisAttributes(polyhedron.GetVisAttributes()); + G4Color colour = pVA->GetColour(); + // G4bool isVisible = pVA->IsVisible(); + // G4double lineWidth = pVA->GetLineWidth(); + // G4VisAttributes::LineStyle lineStyle = pVA->GetLineStyle(); + + // G4double lineWidthScale = drawing_style.GetGlobalLineWidthScale(); + + // Get view parameters that the user can force through the vis attributes, thereby over-riding the current view parameter. + G4ViewParameters::DrawingStyle drawing_style = GetDrawingStyle(pVA); + //G4bool isAuxEdgeVisible = GetAuxEdgeVisible (pVA); + +#ifdef G4VTKDEBUG + G4cout << "=================================" << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) called> " << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) called> colour:" << colour.GetRed() << " " << colour.GetBlue() << " " << colour.GetGreen() << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) called> alpha:" << colour.GetAlpha() << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) called> lineWidth:" << lineWidth << G4endl; + G4cout << "G4VtkSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) called> lineStyle:" << lineStyle << G4endl; +#endif + + //std::size_t vhash = std::hash{}(*pVA); + + std::size_t vhash = 0; + std::hash_combine(vhash,static_cast(drawing_style)); + + std::size_t phash = std::hash{}(polyhedron); + + std::size_t hash = 0; + std::hash_combine(hash, phash); + std::hash_combine(hash, vhash); + + if (polyhedronPolyDataMap.find(hash) == polyhedronPolyDataMap.end()) { + + vtkSmartPointer points = vtkSmartPointer::New(); + vtkSmartPointer polys = vtkSmartPointer::New(); + vtkSmartPointer polydata = vtkSmartPointer::New(); + + G4bool notLastFace; + int iVert = 0; + do { + G4Point3D vertex[4]; + G4int edgeFlag[4]; + G4Normal3D normals[4]; + G4int nEdges; + notLastFace = polyhedron.GetNextFacet(nEdges, vertex, edgeFlag, normals); + + vtkSmartPointer poly = vtkSmartPointer::New(); + // loop over vertices + for (int i = 0; i < nEdges; i++) { + points->InsertNextPoint(vertex[i].x(), vertex[i].y(), vertex[i].z()); + poly->InsertNextId(iVert); + iVert++; + } + polys->InsertNextCell(poly); + + } while (notLastFace); + + polydata->SetPoints(points); + polydata->SetPolys(polys); + + polyhedronDataMap.insert(std::pair>(hash, points)); + polyhedronPolyMap.insert(std::pair>(hash, polys)); + polyhedronPolyDataMap.insert(std::pair>(hash, polydata)); + polyhedronPolyDataCountMap.insert(std::pair(hash, 0)); + + vtkSmartPointer instancePosition = vtkSmartPointer::New(); + vtkSmartPointer instanceRotation = vtkSmartPointer::New(); + vtkSmartPointer instanceColors = vtkSmartPointer::New(); + vtkSmartPointer instanceMapper = vtkSmartPointer::New(); + vtkSmartPointer instanceActor = vtkSmartPointer::New(); + instanceColors->SetName("colors"); + + instanceColors->SetNumberOfComponents(4); + instanceRotation->SetNumberOfComponents(9); + + vtkSmartPointer instancePolyData = vtkSmartPointer::New(); + instancePolyData->SetPoints(instancePosition); + instancePolyData->GetPointData()->SetTensors(instanceRotation); + instancePolyData->GetPointData()->SetVectors(instanceColors); + instancePolyData->GetPointData()->SetScalars(instanceColors); + + vtkSmartPointer filterClean = vtkSmartPointer::New(); + filterClean->PointMergingOn(); + filterClean->AddInputData(polydata); + + vtkSmartPointer filterTriangle = vtkSmartPointer::New(); + filterTriangle->SetInputConnection(filterClean->GetOutputPort()); + + vtkSmartPointer filterNormals = vtkSmartPointer::New(); + filterNormals->SetFeatureAngle(45); + filterNormals->SetInputConnection(filterTriangle->GetOutputPort()); + + vtkSmartPointer filterEdge = vtkSmartPointer::New(); + filterEdge->SetFeatureEdges(1); + filterEdge->SetManifoldEdges(0); + filterEdge->SetBoundaryEdges(0); + filterEdge->SetFeatureAngle(45); // TODO need to have a function and command to set this + filterEdge->SetInputConnection(filterTriangle->GetOutputPort()); + + vtkSmartPointer tensorGlyph = vtkSmartPointer::New(); + tensorGlyph->SetInputData(instancePolyData); + tensorGlyph->SetSourceConnection(filterNormals->GetOutputPort()); + tensorGlyph->ColorGlyphsOn(); + tensorGlyph->ScalingOff(); + tensorGlyph->ThreeGlyphsOff(); + tensorGlyph->ExtractEigenvaluesOff(); + tensorGlyph->SetColorModeToScalars(); + tensorGlyph->Update(); + + instanceMapper->SetInputData(tensorGlyph->GetOutput()); + instanceMapper->SetColorModeToDirectScalars(); + + instanceActor->SetMapper(instanceMapper); + // instanceActor->GetProperty()->SetLineWidth(10); + instanceActor->SetVisibility(1); + + if(drawing_style == G4ViewParameters::hsr) { + + } + + if(drawing_style == G4ViewParameters::hlr) { + } + + if(drawing_style == G4ViewParameters::wireframe) { + instanceActor->GetProperty()->SetRepresentationToWireframe(); + } + + auto *pVtkViewer = dynamic_cast(fpViewer); + pVtkViewer->renderer->AddActor(instanceActor); + + instancePositionMap.insert(std::pair>(hash, instancePosition)); + instanceRotationMap.insert(std::pair>(hash, instanceRotation)); + instanceColoursMap.insert(std::pair>(hash, instanceColors)); + instancePolyDataMap.insert(std::pair>(hash,instancePolyData)); + instanceActorMap.insert(std::pair>(hash, instanceActor)); + instanceTensorGlyphMap.insert(std::pair>(hash, tensorGlyph)); + } + + polyhedronPolyDataCountMap[hash]++; + + double red = colour.GetRed(); + double green = colour.GetGreen(); + double blue = colour.GetBlue(); + double alpha = colour.GetAlpha(); + + instanceColoursMap[hash]->InsertNextTuple4(red, green, blue, alpha); + + instancePositionMap[hash]->InsertNextPoint(fObjectTransformation.dx(), + fObjectTransformation.dy(), + fObjectTransformation.dz()); + + G4Transform3D fInvObjTrans = fObjectTransformation.inverse(); + + instanceRotationMap[hash]->InsertNextTuple9(fInvObjTrans.xx(), fInvObjTrans.xy(),fInvObjTrans.xz(), + fInvObjTrans.yx(), fInvObjTrans.yy(),fInvObjTrans.yz(), + fInvObjTrans.zx(), fInvObjTrans.zy(),fInvObjTrans.zz()); + +} + +void G4VtkSceneHandler::AddPrimitiveBakedTransform(const G4Polyhedron& polyhedron) +{ + // only have a single polydata object for each LV but bake in the PV + // transformation so clippers and cutters can be implemented + AddPrimitiveTensorGlyph(polyhedron); +} +void G4VtkSceneHandler::Modified() { + for (auto it = polylineDataMap.begin(); it != polylineDataMap.end(); it++) + { + it->second->Modified(); + } + + for (auto it = polylineLineMap.begin(); it != polylineLineMap.end(); it++) + { + it->second->Modified(); + } + for (auto it = circleDataMap.begin(); it != circleDataMap.end(); it++) + { + it->second->Modified(); + } + + for (auto it = squareDataMap.begin(); it != squareDataMap.end(); it++) + { + it->second->Modified(); + } + + for(auto it = instancePositionMap.begin(); it != instancePositionMap.end(); it++) + { + it->second->Modified(); + } + + for(auto it = instanceRotationMap.begin(); it != instanceRotationMap.end(); it++) + { + it->second->Modified(); + } + + for(auto it = instanceColoursMap.begin(); it != instanceColoursMap.end(); it++) + { + it->second->Modified(); + } + + for(auto it = instancePolyDataMap.begin(); it != instancePolyDataMap.end(); it++) + { + it->second->Modified(); + } + + for(auto it = instanceActorMap.begin(); it != instanceActorMap.end(); it++) + { + it->second->Modified(); + } + + for(auto it = instanceTensorGlyphMap.begin(); it != instanceTensorGlyphMap.end(); it++) + { + it->second->Update(); + } + +#ifdef G4VTKDEBUG + G4cout << "G4VtkSceneHandler::Modified() polyline styles: " << polylineVisAttributesMap.size() << G4endl; + for (auto it = polylineLineMap.begin(); it != polylineLineMap.end(); it++) + { + G4cout << "G4VtkSceneHandler::Modified() polyline segments: " + << it->second->GetNumberOfCells() << G4endl; + } + G4cout << "G4VtkSceneHandler::Modified() circle styles: " << circleVisAttributesMap.size() << G4endl; + for (auto it = circleDataMap.begin(); it != circleDataMap.end(); it++) + { + G4cout << "G4VtkSceneHandler::Modified() circles: " + << it->second->GetNumberOfPoints() << G4endl; + } + + G4cout << "G4VtkSceneHandler::Modified() square styles: " << squareVisAttributesMap.size() << G4endl; + for (auto it = squareDataMap.begin(); it != squareDataMap.end(); it++) + { + G4cout << "G4VtkSceneHanler::Modified() squares: " + << it->second->GetNumberOfPoints() << G4endl; + } + + G4cout << "G4VtkSceneHandler::Modified() unique polyhedra: " << polyhedronDataMap.size() << G4endl; + + int nPlacements = 0; + int nCells = 0; + for (auto it = polyhedronPolyDataMap.begin(); it != polyhedronPolyDataMap.end(); it++) { + G4cout << "G4VtkSceneHandler::Modified() polyhedronPolyData: " << it->second->GetPoints()->GetNumberOfPoints() << " " << it->second->GetPolys()->GetNumberOfCells() << " " << polyhedronPolyDataCountMap[it->first] <second->GetPolys()->GetNumberOfCells()*polyhedronPolyDataCountMap[it->first]; + nPlacements += polyhedronPolyDataCountMap[it->first]; + } + G4cout << "G4VtkSceneHandler::Modified() polyhedronPolyData: " << nPlacements << " " << nCells << G4endl; +#endif +} + +void G4VtkSceneHandler::Clear() { + + polylineVisAttributesMap.clear(); + polylineDataMap.clear(); + polylineLineMap.clear(); + polylinePolyDataMap.clear(); + polylinePolyDataMapperMap.clear(); + polylinePolyDataActorMap.clear(); + + for (auto& v : polylineDataMap) + {v.second->Reset();} + for (auto& v : polylineLineMap) + {v.second->Reset();} + + circleVisAttributesMap.clear(); + circleDataMap.clear(); + circlePolyDataMap.clear(); + circleFilterMap.clear(); + circlePolyDataMapperMap.clear(); + circlePolyDataActorMap.clear(); + + squareVisAttributesMap.clear(); + squareDataMap.clear(); + squarePolyDataMap.clear(); + squareFilterMap.clear(); + squarePolyDataMapperMap.clear(); + squarePolyDataActorMap.clear(); + + for (auto& v : squareDataMap) + {v.second->Reset();} + + polyhedronVisAttributesMap.clear(); + polyhedronDataMap.clear(); + polyhedronPolyMap.clear(); + polyhedronPolyDataMap.clear(); + polyhedronPolyDataCountMap.clear(); + + instancePositionMap.clear(); + instanceRotationMap.clear(); + instanceColoursMap.clear(); + instancePolyDataMap.clear(); + instanceTensorGlyphMap.clear(); + instanceActorMap.clear(); +} + +void G4VtkSceneHandler::AddSolid (const G4Box& box) { + + G4VSceneHandler::AddSolid(box); + +#if 0 + return; + + const G4VModel* pv_model = GetModel(); + if (!pv_model) { return ; } + + G4PhysicalVolumeModel* pPVModel = dynamic_cast(fpModel); + if (!pPVModel) { return ; } + + //-- debug information + if(1) { + G4VPhysicalVolume *pv = pPVModel->GetCurrentPV(); + G4LogicalVolume *lv = pv->GetLogicalVolume(); + G4cout << "name=" << box.GetName() << " volumeType=" << pv->VolumeType() << " pvName=" << pv->GetName() << " lvName=" << lv->GetName() << " multiplicity=" << pv->GetMultiplicity() << " isparametrised=" << pv->IsParameterised() << " isreplicated=" << pv->IsReplicated() << " parametrisation=" << pv->GetParameterisation() << G4endl; + } + + if(0) { + G4Material *mat = pPVModel->GetCurrentMaterial(); + G4String name = mat->GetName(); + G4double dens = mat->GetDensity()/(g/cm3); + G4int copyNo = pPVModel->GetCurrentPV()->GetCopyNo(); + G4int depth = pPVModel->GetCurrentDepth(); + G4cout << " name : " << box.GetName() << G4endl; + G4cout << " copy no.: " << copyNo << G4endl; + G4cout << " depth : " << depth << G4endl; + G4cout << " density : " << dens << " [g/cm3]" << G4endl; + G4cout << " location: " << pPVModel->GetCurrentPV()->GetObjectTranslation() << G4endl; + G4cout << " Multiplicity : " << pPVModel->GetCurrentPV()->GetMultiplicity() << G4endl; + G4cout << " Is replicated? : " << pPVModel->GetCurrentPV()->IsReplicated() << G4endl; + G4cout << " Is parameterised? : " << pPVModel->GetCurrentPV()->IsParameterised() << G4endl; + G4cout << " top phys. vol. name : " << pPVModel->GetTopPhysicalVolume()->GetName() << G4endl; + } +#endif +} + +void G4VtkSceneHandler::AddCompound(const G4Mesh& mesh) +{ +#ifdef G4VTKDEBUG + G4cout << "G4VtkSceneHandler::AddCompound" << G4endl; +#endif + + if(mesh.GetMeshType() != G4Mesh::rectangle || mesh.GetMeshDepth() != 3) + { + G4VSceneHandler::AddCompound(mesh); + } + + auto container = mesh.GetContainerVolume(); + auto rep1 = container->GetLogicalVolume()->GetDaughter(0); + auto rep2 = rep1->GetLogicalVolume()->GetDaughter(0); + auto rep3 = rep2->GetLogicalVolume()->GetDaughter(0); + + EAxis rep1_axis, rep2_axis, rep3_axis; + G4int rep1_nReplicas, rep2_nReplicas, rep3_nReplicas; + G4double rep1_width, rep2_width, rep3_width; + G4double rep1_offset, rep2_offset, rep3_offset; + G4bool rep1_consuming, rep2_consuming, rep3_consuming; + + rep1->GetReplicationData(rep1_axis,rep1_nReplicas, rep1_width, rep1_offset, rep1_consuming); + rep2->GetReplicationData(rep2_axis,rep2_nReplicas, rep2_width, rep2_offset, rep2_consuming); + rep3->GetReplicationData(rep3_axis,rep3_nReplicas, rep3_width, rep3_offset, rep3_consuming); + + // Instantiate a temporary G4PhysicalVolumeModel + G4ModelingParameters tmpMP; + tmpMP.SetCulling(false); // This avoids drawing transparent... + tmpMP.SetCullingInvisible(false); // ... or invisble volumes. + const G4bool useFullExtent = false; // To avoid calculating the extent + + G4PhysicalVolumeModel tmpPVModel(container, G4PhysicalVolumeModel::UNLIMITED, + G4Transform3D(), &tmpMP, useFullExtent); + + // Instantiate a pseudo scene so that we can make a "private" descent and fill vtkImageData + vtkSmartPointer imagedata = vtkSmartPointer::New(); + imagedata->SetDimensions(rep1_nReplicas+1,rep2_nReplicas+1,rep3_nReplicas+1); + imagedata->SetSpacing(rep1_width,rep2_width,rep2_width); + imagedata->SetOrigin(0,0,0); + imagedata->AllocateScalars(VTK_DOUBLE, 1); + + G4double halfX = 0., halfY = 0., halfZ = 0.; + struct PseudoScene : public G4PseudoScene + { + PseudoScene( + G4PhysicalVolumeModel* pvModel, // input...the following are output + vtkImageData *vtkId, + G4int nx, G4int ny, G4int nz, + G4double& halfX, G4double& halfY, G4double& halfZ) : fpPVModel(pvModel) + , fVtkId(vtkId) + , fNx(nx) + , fNy(ny) + , fNz(nz) + , fHalfX(halfX) + , fHalfY(halfY) + , fHalfZ(halfZ) + {} + using G4PseudoScene::AddSolid; // except for... + void AddSolid(const G4Box& box) + { + const G4Colour& colour = fpPVModel->GetCurrentLV()->GetVisAttributes()->GetColour(); + // G4double density = fpPVModel->GetCurrentLV()->GetMaterial()->GetDensity(); + const G4ThreeVector& position = fpCurrentObjectTransformation->getTranslation(); + fHalfX = box.GetXHalfLength(); + fHalfY = box.GetYHalfLength(); + fHalfZ = box.GetZHalfLength(); + fVtkId->SetScalarComponentFromDouble(int(position.x()/(2*fHalfX))+fNx, + int(position.y()/(2*fHalfY))+fNy, + int(position.z()/(2*fHalfZ))+fNz, + 0, + (colour.GetRed() + colour.GetBlue() + colour.GetGreen())/3.0); + } + G4PhysicalVolumeModel* fpPVModel; + vtkImageData *fVtkId; + G4int fNx, fNy, fNz; + G4double &fHalfX, &fHalfY, &fHalfZ; + } + // construct the pseudoScene + pseudoScene(&tmpPVModel, imagedata, rep1_nReplicas, rep2_nReplicas, rep3_nReplicas, halfX, halfY, halfZ); + + // Make private descent into the nested parameterisation + tmpPVModel.DescribeYourselfTo(pseudoScene); + + vtkSmartPointer volumeMapper = vtkSmartPointer::New(); + volumeMapper->SetInputData(imagedata); + + vtkNew volume; + volume->SetMapper(volumeMapper); + + vtkSmartPointer vtkMatrix = vtkSmartPointer::New(); + + vtkMatrix->SetElement(0,0,fObjectTransformation.xx()); + vtkMatrix->SetElement(0,1,fObjectTransformation.xy()); + vtkMatrix->SetElement(0,2,fObjectTransformation.xz()); + + vtkMatrix->SetElement(1,0,fObjectTransformation.yx()); + vtkMatrix->SetElement(1,1,fObjectTransformation.yy()); + vtkMatrix->SetElement(1,2,fObjectTransformation.yz()); + + vtkMatrix->SetElement(2,0,fObjectTransformation.zx()); + vtkMatrix->SetElement(2,1,fObjectTransformation.zy()); + vtkMatrix->SetElement(2,2,fObjectTransformation.zz()); + + vtkMatrix->SetElement(3,0, fObjectTransformation.dx()); + vtkMatrix->SetElement(3,1, fObjectTransformation.dy()); + vtkMatrix->SetElement(3,2, fObjectTransformation.dz()); + vtkMatrix->SetElement(3,3, 1); + + volume->SetUserMatrix(vtkMatrix); + + auto *pVtkViewer = dynamic_cast(fpViewer); + pVtkViewer->renderer->AddVolume(volume); +} diff --git a/source/visualization/Vtk/src/G4VtkViewer.cc b/source/visualization/Vtk/src/G4VtkViewer.cc new file mode 100644 index 0000000000..f04de7674f --- /dev/null +++ b/source/visualization/Vtk/src/G4VtkViewer.cc @@ -0,0 +1,399 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// +// +// John Allison 5th April 2001 +// A template for a simplest possible graphics driver. +//?? Lines or sections marked like this require specialisation for your driver. + +#include "G4VtkViewer.hh" + +#include "G4VSceneHandler.hh" +#include "G4VtkSceneHandler.hh" + +#include "vtkRendererCollection.h" +#include "vtkLightCollection.h" + +#include "vtkWindowToImageFilter.h" +#include "vtkImageWriter.h" +#include "vtkBMPWriter.h" +#include "vtkJPEGWriter.h" +#include "vtkPNGWriter.h" +#include "vtkPNMWriter.h" +#include "vtkTIFFWriter.h" +#include "vtkPostScriptWriter.h" +#include "vtkOBJExporter.h" +#include "vtkVRMLExporter.h" +#include "vtkSingleVTPExporter.h" + +#include "vtkShadowMapPass.h" +#include "vtkShadowMapBakerPass.h" +#include "vtkSequencePass.h" +#include "vtkCameraPass.h" +#include "vtkRenderPass.h" +#include "vtkRenderPassCollection.h" + +#include "vtkOpenGLRenderer.h" + +G4VtkViewer::G4VtkViewer(G4VSceneHandler& sceneHandler, const G4String& name) + : G4VViewer(sceneHandler, sceneHandler.IncrementViewCount(), name) +{ + // Set default and current view parameters + fVP.SetAutoRefresh(true); + fDefaultVP.SetAutoRefresh(true); +} + +void G4VtkViewer::Initialise() +{ + _renderWindow = vtkRenderWindow::New(); + renderWindowInteractor = vtkRenderWindowInteractor::New(); + +#ifdef G4VTKDEBUG + G4cout << "G4VtkViewer::G4VtkViewer" << G4endl; + + G4cout << "G4VtkViewer::G4VtkViewer> " << fVP.GetWindowSizeHintX() << " " + << fVP.GetWindowSizeHintY() << G4endl; + G4cout << "G4VtkViewer::G4VtkViewer> " << fVP.GetWindowLocationHintX() << " " + << fVP.GetWindowLocationHintY() << G4endl; +#endif + + _renderWindow->SetSize(fVP.GetWindowSizeHintX(), fVP.GetWindowSizeHintY()); + _renderWindow->SetPosition(fVP.GetWindowLocationHintX(), + fVP.GetWindowLocationHintY()); + _renderWindow->SetWindowName("Vtk viewer"); + + _renderWindow->AddRenderer(renderer); + renderWindowInteractor->SetRenderWindow(_renderWindow); + + // TODO proper camera parameter settings + camera->SetPosition(0, 0, 1000); + camera->SetFocalPoint(0, 0, 0); + renderer->SetActiveCamera(camera); + + //renderer->SetUseHiddenLineRemoval(1); // TODO needs to be an option + //renderer->SetUseShadows(1); // TODO needs to be an option + + // Set callback to match VTK parameters to Geant4 + geant4Callback->SetGeant4ViewParameters(&fVP); + renderer->AddObserver(vtkCommand::EndEvent, geant4Callback); + + vtkSmartPointer style = + vtkSmartPointer::New(); + renderWindowInteractor->SetInteractorStyle(style); + + // DrawShadows(); +} + +G4VtkViewer::~G4VtkViewer() {} + +void G4VtkViewer::SetView() { + + // background colour + const G4Colour backgroundColour = fVP.GetBackgroundColour(); + renderer->SetBackground(backgroundColour.GetRed(), backgroundColour.GetGreen(), backgroundColour.GetBlue()); + + // target and camera positions + G4double radius = fSceneHandler.GetExtent().GetExtentRadius(); + if(radius <= 0.) + {radius = 1.;} + G4double cameraDistance = fVP.GetCameraDistance(radius); + G4Point3D viewpointDirection = fVP.GetViewpointDirection(); + G4Point3D targetPoint = fVP.GetCurrentTargetPoint(); + G4Point3D cameraPosition = + targetPoint + viewpointDirection.unit() * cameraDistance; + renderer->GetActiveCamera()->SetFocalPoint(targetPoint.x(), + targetPoint.y(), + targetPoint.z()); + renderer->GetActiveCamera()->SetPosition(cameraPosition.x(), + cameraPosition.y(), + cameraPosition.z()); + renderer->GetActiveCamera()->SetParallelScale(cameraDistance); + + // need to set camera distance and parallel scale on first set view + if(firstSetView) + { + geant4Callback->SetVtkInitialValues(cameraDistance, cameraDistance); + firstSetView = false; + } + + // projection type and view angle and zoom factor + G4double fieldHalfAngle = fVP.GetFieldHalfAngle(); + G4double zoomFactor = fVP.GetZoomFactor(); + vtkCamera* activeCamera = renderer->GetActiveCamera(); + if(fieldHalfAngle == 0) { + activeCamera->SetParallelProjection(1); + activeCamera->SetParallelScale(activeCamera->GetParallelScale()/zoomFactor); + } + else { + activeCamera->SetParallelProjection(0); + activeCamera->SetViewAngle(2*fieldHalfAngle/M_PI*180); + activeCamera->SetPosition(cameraPosition.x()/zoomFactor, + cameraPosition.y()/zoomFactor, + cameraPosition.z()/zoomFactor); + } + + // camera roll + // renderer->GetActiveCamera()->SetRoll(0); + + // camera up direction + const G4Vector3D upVector = fVP.GetUpVector(); + renderer->GetActiveCamera()->SetViewUp(upVector.x(), + upVector.y(), + upVector.z()); + + // Light + const G4Vector3D lightDirection = fVP.GetLightpointDirection(); + G4bool lightsMoveWithCamera = fVP.GetLightsMoveWithCamera(); + G4Vector3D lightPosition = + targetPoint + lightDirection.unit() * cameraDistance; + + vtkLightCollection* currentLights = renderer->GetLights(); + if (currentLights->GetNumberOfItems() != 0) + { + auto currentLight = dynamic_cast(currentLights->GetItemAsObject(0)); + if (currentLight) + { + currentLight->SetPosition(lightPosition.x(), + lightPosition.y(), + lightPosition.z()); + if (lightsMoveWithCamera) + {currentLight->SetLightTypeToCameraLight();} + else + {currentLight->SetLightTypeToSceneLight();} + } + } + + // Rotation style + G4ViewParameters::RotationStyle rotationStyle = fVP.GetRotationStyle(); + if (rotationStyle == G4ViewParameters::RotationStyle::freeRotation) { + vtkSmartPointer style = + vtkSmartPointer::New(); + renderWindowInteractor->SetInteractorStyle(style); + } + else if(rotationStyle == G4ViewParameters::RotationStyle::constrainUpDirection) { + // camera->SetViewUp(upVector.x(), upVector.y(), upVector.z()); + vtkSmartPointer style = + vtkSmartPointer::New(); + renderWindowInteractor->SetInteractorStyle(style); + } +} + +void G4VtkViewer::ClearView() { + vtkActorCollection *actors = renderer->GetActors(); + vtkActor *actor = actors->GetLastActor(); + + while(actor) { +#ifdef G4VTKDEBUG + G4cout << "G4VtkViewer::ClearView() remove actor " << actor << G4endl; +#endif + renderer->RemoveActor(actor); + actor = actors->GetLastActor(); + } + + vtkPropCollection *props = renderer->GetViewProps(); + vtkProp *prop = props->GetLastProp(); + + while(prop) { +#ifdef G4VTKDEBUG + G4cout << "G4VtkViewer::ClearView() remove prop " << prop << G4endl; +#endif + renderer->RemoveViewProp(prop); + prop = props->GetLastProp(); + } + + G4VtkSceneHandler& fVtkSceneHandler = + dynamic_cast(fSceneHandler); + fVtkSceneHandler.Clear(); +} + +void G4VtkViewer::DrawView() { + // First, a view should decide when to re-visit the G4 kernel. + // Sometimes it might not be necessary, e.g., if the scene is stored + // in a graphical database (e.g., OpenGL's display lists) and only + // the viewing angle has changed. But graphics systems without a + // graphical database will always need to visit the G4 kernel. + + NeedKernelVisit(); // Default is - always visit G4 kernel. + // Note: this routine sets the fNeedKernelVisit flag of *all* the + // views of the scene. + + ProcessView(); // The basic logic is here. + + // Add HUD + DrawViewHUD(); + + // ...before finally... + FinishView(); // Flush streams and/or swap buffers. +} + +void G4VtkViewer::DrawViewHUD() +{ + // make sure text is always visible + G4Colour colour = fVP.GetBackgroundColour(); + infoTextActor->GetTextProperty()->SetColor(std::fmod(colour.GetRed() + 0.5, 1.0), + std::fmod(colour.GetGreen() + 0.5, 1.0), + std::fmod(colour.GetBlue() + 0.5, 1.0)); + infoTextActor->GetTextProperty()->SetFontSize(20); + infoCallback->SetTextActor(infoTextActor); + renderer->AddObserver(vtkCommand::EndEvent, infoCallback); + renderer->AddActor(infoTextActor); +} + +void G4VtkViewer::DrawShadows() +{ + _renderWindow->SetMultiSamples(0); + + vtkNew shadows; + vtkNew seq; + + vtkNew passes; + passes->AddItem(shadows->GetShadowMapBakerPass()); + passes->AddItem(shadows); + seq->SetPasses(passes); + + vtkNew cameraP; + cameraP->SetDelegatePass(seq); + + // tell the renderer to use our render pass pipeline + vtkOpenGLRenderer* glrenderer = dynamic_cast(renderer.GetPointer()); + glrenderer->SetPass(cameraP); +} + +void G4VtkViewer::ShowView() +{ +#ifdef G4VTKDEBUG + G4cout << "G4VtkViewer::ShowView() called." << G4endl; + // static_cast(fSceneHandler).PrintStores(); +#endif + + G4VtkSceneHandler& fVtkSceneHandler = + dynamic_cast(fSceneHandler); + fVtkSceneHandler.Modified(); + + infoTextActor->GetTextProperty()->SetFontSize(28); + G4Colour colour = fVP.GetBackgroundColour(); + + // make sure text is always visible + infoTextActor->GetTextProperty()->SetColor(std::fmod(colour.GetRed() + 0.5, 1.0), + std::fmod(colour.GetGreen() + 0.5, 1.0), + std::fmod(colour.GetBlue() + 0.5, 1.0)); + infoTextActor->GetTextProperty()->SetFontSize(20); + infoCallback->SetTextActor(infoTextActor); + renderer->AddObserver(vtkCommand::EndEvent, infoCallback); + geant4Callback->SetGeant4ViewParameters(&fVP); + renderer->AddObserver(vtkCommand::EndEvent, geant4Callback); + renderer->AddActor(infoTextActor); + + _renderWindow->Render(); + renderWindowInteractor->Initialize(); + renderWindowInteractor->Start(); +} + +void G4VtkViewer::FinishView() +{ + G4VtkSceneHandler& fVtkSceneHandler = + dynamic_cast(fSceneHandler); + fVtkSceneHandler.Modified(); + + _renderWindow->Render(); +} + +void G4VtkViewer::ExportScreenShot(G4String path, G4String format) +{ + + vtkImageWriter *imWriter = nullptr; + + if(format == "bmp") { + imWriter = vtkBMPWriter::New(); + } + else if (format == "jpg") { + imWriter = vtkJPEGWriter::New(); + } + else if (format == "pnm") { + imWriter = vtkPNMWriter::New(); + } + else if (format == "png") { + imWriter = vtkPNGWriter::New(); + } + else if (format == "tiff") { + imWriter = vtkTIFFWriter::New(); + } + else if (format == "ps") { + imWriter = vtkPostScriptWriter::New(); + } + else { + imWriter = vtkPNGWriter::New(); + } + + _renderWindow->Render(); + + vtkSmartPointer winToImage = vtkSmartPointer::New(); + winToImage->SetInput(_renderWindow); + winToImage->SetScale(1); + if(format == "ps") + { + winToImage->SetInputBufferTypeToRGB(); + winToImage->ReadFrontBufferOff(); + winToImage->Update(); + } + else + {winToImage->SetInputBufferTypeToRGBA();} + + imWriter->SetFileName((path+"."+format).c_str()); + imWriter->SetInputConnection(winToImage->GetOutputPort()); + imWriter->Write(); +} + +void G4VtkViewer::ExportOBJScene(G4String path) +{ + vtkSmartPointer _rw1 = vtkSmartPointer::New(); + _rw1->AddRenderer(_renderWindow->GetRenderers()->GetFirstRenderer()); + vtkSmartPointer exporter = vtkSmartPointer::New(); + exporter->SetRenderWindow(_rw1); + exporter->SetFilePrefix(path.c_str()); + exporter->Write(); +} + +void G4VtkViewer::ExportVRMLScene(G4String path) +{ + vtkSmartPointer _rw1 = vtkSmartPointer::New(); + _rw1->AddRenderer(_renderWindow->GetRenderers()->GetFirstRenderer()); + vtkSmartPointer exporter = vtkSmartPointer::New(); + exporter->SetRenderWindow(_rw1); + exporter->SetFileName((path+".vrml").c_str()); + exporter->Write(); +} + +void G4VtkViewer::ExportVTPScene(G4String path) +{ + vtkSmartPointer _rw1 = vtkSmartPointer::New(); + _rw1->AddRenderer(_renderWindow->GetRenderers()->GetFirstRenderer()); + vtkSmartPointer exporter = vtkSmartPointer::New(); + exporter->SetRenderWindow(_rw1); + exporter->SetFileName((path+".vtp").c_str()); + exporter->Write(); +} diff --git a/source/visualization/Vtk/src/vtkTensorGlyphColor.cxx b/source/visualization/Vtk/src/vtkTensorGlyphColor.cxx new file mode 100644 index 0000000000..7a5e71d3a8 --- /dev/null +++ b/source/visualization/Vtk/src/vtkTensorGlyphColor.cxx @@ -0,0 +1,565 @@ +/*========================================================================= + + Program: Visualization Toolkit + Module: vtkTensorGlyphColor.cxx + + Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen + All rights reserved. + See Copyright.txt or http://www.kitware.com/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ +#include "vtkTensorGlyphColor.h" + +#include "vtkStreamingDemandDrivenPipeline.h" +#include "vtkCell.h" +#include "vtkCellArray.h" +#include "vtkDataSet.h" +#include "vtkExecutive.h" +#include "vtkFloatArray.h" +#include "vtkDoubleArray.h" +#include "vtkMath.h" +#include "vtkInformation.h" +#include "vtkInformationVector.h" +#include "vtkObjectFactory.h" +#include "vtkPointData.h" +#include "vtkPolyData.h" +#include "vtkTransform.h" + +vtkStandardNewMacro(vtkTensorGlyphColor) + +// Construct object with scaling on and scale factor 1.0. Eigenvalues are +// extracted, glyphs are colored with input scalar data, and logarithmic +// scaling is turned off. +vtkTensorGlyphColor::vtkTensorGlyphColor() +{ + this->Scaling = 1; + this->ScaleFactor = 1.0; + this->ExtractEigenvalues = 1; + this->ColorGlyphs = 1; + this->ColorMode = COLOR_BY_SCALARS; + this->ClampScaling = 0; + this->MaxScaleFactor = 100; + this->ThreeGlyphs = 0; + this->Symmetric = 0; + this->Length = 1.0; + + this->SetNumberOfInputPorts(2); + + // by default, process active point tensors + this->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, + vtkDataSetAttributes::TENSORS); + + // by default, process active point scalars + this->SetInputArrayToProcess(1, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, + vtkDataSetAttributes::SCALARS); +} + +//---------------------------------------------------------------------------- +vtkTensorGlyphColor::~vtkTensorGlyphColor() = default; + +//---------------------------------------------------------------------------- +int vtkTensorGlyphColor::RequestUpdateExtent( + vtkInformation *vtkNotUsed(request), + vtkInformationVector **inputVector, + vtkInformationVector *outputVector) +{ + // get the info objects + vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); + vtkInformation *sourceInfo = inputVector[1]->GetInformationObject(0); + vtkInformation *outInfo = outputVector->GetInformationObject(0); + + if (sourceInfo) + { + sourceInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER(), + 0); + sourceInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES(), + 1); + sourceInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(), + 0); + } + + inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER(), + outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER())); + inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES(), + outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES())); + inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(), + outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS())); + inInfo->Set(vtkStreamingDemandDrivenPipeline::EXACT_EXTENT(), 1); + + return 1; +} + +//---------------------------------------------------------------------------- +int vtkTensorGlyphColor::RequestData( + vtkInformation *vtkNotUsed(request), + vtkInformationVector **inputVector, + vtkInformationVector *outputVector) +{ + // get the info objects + vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); + vtkInformation *sourceInfo = inputVector[1]->GetInformationObject(0); + vtkInformation *outInfo = outputVector->GetInformationObject(0); + + // get the input and output + vtkDataSet *input = vtkDataSet::SafeDownCast( + inInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkPolyData *source = vtkPolyData::SafeDownCast( + sourceInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkPolyData *output = vtkPolyData::SafeDownCast( + outInfo->Get(vtkDataObject::DATA_OBJECT())); + + vtkDataArray *inTensors; + double tensor[9]; + vtkDataArray *inScalars; + vtkIdType numPts, numSourcePts, numSourceCells, inPtId, i; + int j; + vtkPoints *sourcePts; + vtkDataArray *sourceNormals; + vtkCellArray *sourceCells, *cells; + vtkPoints *newPts; + vtkFloatArray *newScalars=nullptr; + vtkFloatArray *newNormals=nullptr; + double x[3], s; + vtkTransform *trans; + vtkCell *cell; + vtkIdList *cellPts; + int npts; + vtkIdType *pts; + vtkIdType ptIncr, cellId; + vtkIdType subIncr; + int numDirs, dir, eigen_dir, symmetric_dir; + vtkMatrix4x4 *matrix; + double *m[3], w[3], *v[3]; + double m0[3], m1[3], m2[3]; + double v0[3], v1[3], v2[3]; + double xv[3], yv[3], zv[3]; + double maxScale; + + numDirs = (this->ThreeGlyphs?3:1)*(this->Symmetric+1); + + // set up working matrices + m[0] = m0; m[1] = m1; m[2] = m2; + v[0] = v0; v[1] = v1; v[2] = v2; + + vtkDebugMacro(<<"Generating tensor glyphs"); + + vtkPointData *outPD = output->GetPointData(); + inTensors = this->GetInputArrayToProcess(0, inputVector); + inScalars = this->GetInputArrayToProcess(1, inputVector); + numPts = input->GetNumberOfPoints(); + + if ( !inTensors || numPts < 1 ) + { + vtkErrorMacro(<<"No data to glyph!"); + return 1; + } + + pts = new vtkIdType[source->GetMaxCellSize()]; + trans = vtkTransform::New(); + matrix = vtkMatrix4x4::New(); + + // + // Allocate storage for output PolyData + // + sourcePts = source->GetPoints(); + numSourcePts = sourcePts->GetNumberOfPoints(); + numSourceCells = source->GetNumberOfCells(); + + newPts = vtkPoints::New(); + newPts->Allocate(numDirs*numPts*numSourcePts); + + // Setting up for calls to PolyData::InsertNextCell() + if ( (sourceCells=source->GetVerts())->GetNumberOfCells() > 0 ) + { + cells = vtkCellArray::New(); + cells->Allocate(numDirs*numPts*sourceCells->GetSize()); + output->SetVerts(cells); + cells->Delete(); + } + if ( (sourceCells=this->GetSource()->GetLines())->GetNumberOfCells() > 0 ) + { + cells = vtkCellArray::New(); + cells->Allocate(numDirs*numPts*sourceCells->GetSize()); + output->SetLines(cells); + cells->Delete(); + } + if ( (sourceCells=this->GetSource()->GetPolys())->GetNumberOfCells() > 0 ) + { + cells = vtkCellArray::New(); + cells->Allocate(numDirs*numPts*sourceCells->GetSize()); + output->SetPolys(cells); + cells->Delete(); + } + if ( (sourceCells=this->GetSource()->GetStrips())->GetNumberOfCells() > 0 ) + { + cells = vtkCellArray::New(); + cells->Allocate(numDirs*numPts*sourceCells->GetSize()); + output->SetStrips(cells); + cells->Delete(); + } + + // only copy scalar data through + vtkPointData *pd = this->GetSource()->GetPointData(); + // generate scalars if eigenvalues are chosen or if scalars exist. + if (this->ColorGlyphs && + ((this->ColorMode == COLOR_BY_EIGENVALUES) || + (inScalars && (this->ColorMode == COLOR_BY_SCALARS)) ) ) + { + newScalars = vtkFloatArray::New(); + newScalars->SetNumberOfComponents(4); + newScalars->Allocate(numDirs*numPts*numSourcePts); + if (this->ColorMode == COLOR_BY_EIGENVALUES) + { + newScalars->SetName("MaxEigenvalue"); + } + else + { + newScalars->SetName(inScalars->GetName()); + } + } + else + { + outPD->CopyAllOff(); + outPD->CopyScalarsOn(); + outPD->CopyAllocate(pd,numDirs*numPts*numSourcePts); + } + if ( (sourceNormals = pd->GetNormals()) ) + { + newNormals = vtkFloatArray::New(); + newNormals->SetNumberOfComponents(3); + newNormals->SetName("Normals"); + newNormals->Allocate(numDirs*3*numPts*numSourcePts); + } + // + // First copy all topology (transformation independent) + // + for (inPtId=0; inPtId < numPts; inPtId++) + { + ptIncr = numDirs * inPtId * numSourcePts; + for (cellId=0; cellId < numSourceCells; cellId++) + { + cell = this->GetSource()->GetCell(cellId); + cellPts = cell->GetPointIds(); + npts = cellPts->GetNumberOfIds(); + for (dir=0; dir < numDirs; dir++) + { + // This variable may be removed, but that + // will not improve readability + subIncr = ptIncr + dir*numSourcePts; + for (i=0; i < npts; i++) + { + pts[i] = cellPts->GetId(i) + subIncr; + } + output->InsertNextCell(cell->GetCellType(),npts,pts); + } + } + } + // + // Traverse all Input points, transforming glyph at Source points + // + trans->PreMultiply(); + + for (inPtId=0; inPtId < numPts; inPtId++) + { + ptIncr = numDirs * inPtId * numSourcePts; + + // Translation is postponed + // Symmetric tensor support + inTensors->GetTuple(inPtId, tensor); + if (inTensors->GetNumberOfComponents() == 6) + { + vtkMath::TensorFromSymmetricTensor(tensor); + } + + // compute orientation vectors and scale factors from tensor + if ( this->ExtractEigenvalues ) // extract appropriate eigenfunctions + { + // We are interested in the symmetrical part of the tensor only, since + // eigenvalues are real if and only if the matrice of reals is symmetrical + for (j=0; j<3; j++) + { + for (i=0; i<3; i++) + { + m[i][j] = 0.5 * (tensor[i + 3 * j] + tensor[j + 3 * i]); + } + } + vtkMath::Jacobi(m, w, v); + + //copy eigenvectors + xv[0] = v[0][0]; xv[1] = v[1][0]; xv[2] = v[2][0]; + yv[0] = v[0][1]; yv[1] = v[1][1]; yv[2] = v[2][1]; + zv[0] = v[0][2]; zv[1] = v[1][2]; zv[2] = v[2][2]; + } + else //use tensor columns as eigenvectors + { + for (i=0; i<3; i++) + { + xv[i] = tensor[i]; + yv[i] = tensor[i+3]; + zv[i] = tensor[i+6]; + } + w[0] = vtkMath::Normalize(xv); + w[1] = vtkMath::Normalize(yv); + w[2] = vtkMath::Normalize(zv); + } + + // compute scale factors + w[0] *= this->ScaleFactor; + w[1] *= this->ScaleFactor; + w[2] *= this->ScaleFactor; + + if ( this->ClampScaling ) + { + for (maxScale=0.0, i=0; i<3; i++) + { + if ( maxScale < fabs(w[i]) ) + { + maxScale = fabs(w[i]); + } + } + if ( maxScale > this->MaxScaleFactor ) + { + maxScale = this->MaxScaleFactor / maxScale; + for (i=0; i<3; i++) + { + w[i] *= maxScale; //preserve overall shape of glyph + } + } + } + + // normalization is postponed + + // make sure scale is okay (non-zero) and scale data + for (maxScale=0.0, i=0; i<3; i++) + { + if ( w[i] > maxScale ) + { + maxScale = w[i]; + } + } + if ( maxScale == 0.0 ) + { + maxScale = 1.0; + } + for (i=0; i<3; i++) + { + if ( w[i] == 0.0 ) + { + w[i] = maxScale * 1.0e-06; + } + } + + // Now do the real work for each "direction" + + for (dir=0; dir < numDirs; dir++) + { + eigen_dir = dir%(this->ThreeGlyphs?3:1); + symmetric_dir = dir/(this->ThreeGlyphs?3:1); + + // Remove previous scales ... + trans->Identity(); + + // translate Source to Input point + input->GetPoint(inPtId, x); + trans->Translate(x[0], x[1], x[2]); + + // normalized eigenvectors rotate object for eigen direction 0 + matrix->Element[0][0] = xv[0]; + matrix->Element[0][1] = yv[0]; + matrix->Element[0][2] = zv[0]; + matrix->Element[1][0] = xv[1]; + matrix->Element[1][1] = yv[1]; + matrix->Element[1][2] = zv[1]; + matrix->Element[2][0] = xv[2]; + matrix->Element[2][1] = yv[2]; + matrix->Element[2][2] = zv[2]; + trans->Concatenate(matrix); + + if (eigen_dir == 1) + { + trans->RotateZ(90.0); + } + + if (eigen_dir == 2) + { + trans->RotateY(-90.0); + } + + if (this->ThreeGlyphs) + { + trans->Scale(w[eigen_dir], this->ScaleFactor, this->ScaleFactor); + } + else + { + trans->Scale(w[0], w[1], w[2]); + } + + // Mirror second set to the symmetric position + if (symmetric_dir == 1) + { + trans->Scale(-1.,1.,1.); + } + + // if the eigenvalue is negative, shift to reverse direction. + // The && is there to ensure that we do not change the + // old behaviour of vtkTensorGlyphColors (which only used one dir), + // in case there is an oriented glyph, e.g. an arrow. + if (w[eigen_dir] < 0 && numDirs > 1) + { + trans->Translate(-this->Length, 0., 0.); + } + + // multiply points (and normals if available) by resulting + // matrix + trans->TransformPoints(sourcePts,newPts); + + // Apply the transformation to a series of points, + // and append the results to outPts. + if ( newNormals ) + { + // a negative determinant means the transform turns the + // glyph surface inside out, and its surface normals all + // point inward. The following scale corrects the surface + // normals to point outward. + if (trans->GetMatrix()->Determinant() < 0) + { + trans->Scale(-1.0,-1.0,-1.0); + } + trans->TransformNormals(sourceNormals,newNormals); + } + + // Copy point data from source + if ( this->ColorGlyphs && inScalars && + (this->ColorMode == COLOR_BY_SCALARS) ) + { + for (i=0; i < numSourcePts; i++) + { + auto st = inScalars->GetTuple(inPtId); + newScalars->InsertTuple4(ptIncr+i,st[0],st[1],st[2],st[3]); + } + } + else if (this->ColorGlyphs && + (this->ColorMode == COLOR_BY_EIGENVALUES) ) + { + // If ThreeGlyphs is false we use the first (largest) + // eigenvalue as scalar. + s = w[eigen_dir]; + for (i=0; i < numSourcePts; i++) + { + newScalars->InsertTuple(ptIncr+i, &s); + } + } + else + { + for (i=0; i < numSourcePts; i++) + { + outPD->CopyData(pd,i,ptIncr+i); + } + } + ptIncr += numSourcePts; + } + } + vtkDebugMacro(<<"Generated " << numPts <<" tensor glyphs"); + // + // Update output and release memory + // + delete [] pts; + + output->SetPoints(newPts); + newPts->Delete(); + + if ( newScalars ) + { + int idx = outPD->AddArray(newScalars); + outPD->SetActiveAttribute(idx, vtkDataSetAttributes::SCALARS); + newScalars->Delete(); + } + + if ( newNormals ) + { + outPD->SetNormals(newNormals); + newNormals->Delete(); + } + + output->Squeeze(); + trans->Delete(); + matrix->Delete(); + + return 1; +} + +//---------------------------------------------------------------------------- +void vtkTensorGlyphColor::SetSourceConnection(int id, vtkAlgorithmOutput* algOutput) +{ + if (id < 0) + { + vtkErrorMacro("Bad index " << id << " for source."); + return; + } + + int numConnections = this->GetNumberOfInputConnections(1); + if (id < numConnections) + { + this->SetNthInputConnection(1, id, algOutput); + } + else if (id == numConnections && algOutput) + { + this->AddInputConnection(1, algOutput); + } + else if (algOutput) + { + vtkWarningMacro("The source id provided is larger than the maximum " + "source id, using " << numConnections << " instead."); + this->AddInputConnection(1, algOutput); + } +} + +//---------------------------------------------------------------------------- +void vtkTensorGlyphColor::SetSourceData(vtkPolyData *source) +{ + this->SetInputData(1, source); +} + +//---------------------------------------------------------------------------- +vtkPolyData *vtkTensorGlyphColor::GetSource() +{ + if (this->GetNumberOfInputConnections(1) < 1) + { + return nullptr; + } + return vtkPolyData::SafeDownCast(this->GetExecutive()->GetInputData(1, 0)); +} + +//---------------------------------------------------------------------------- +int vtkTensorGlyphColor::FillInputPortInformation(int port, vtkInformation *info) +{ + if (port == 1) + { + info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkPolyData"); + return 1; + } + info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkDataSet"); + return 1; +} + +//---------------------------------------------------------------------------- +void vtkTensorGlyphColor::PrintSelf(ostream& os, vtkIndent indent) +{ + this->Superclass::PrintSelf(os,indent); + + os << indent << "Source: " << this->GetSource() << "\n"; + os << indent << "Scaling: " << (this->Scaling ? "On\n" : "Off\n"); + os << indent << "Scale Factor: " << this->ScaleFactor << "\n"; + os << indent << "Extract Eigenvalues: " << (this->ExtractEigenvalues ? "On\n" : "Off\n"); + os << indent << "Color Glyphs: " << (this->ColorGlyphs ? "On\n" : "Off\n"); + os << indent << "Color Mode: " << this->ColorMode << endl; + os << indent << "Clamp Scaling: " << (this->ClampScaling ? "On\n" : "Off\n"); + os << indent << "Max Scale Factor: " << this->MaxScaleFactor << "\n"; + os << indent << "Three Glyphs: " << (this->ThreeGlyphs ? "On\n" : "Off\n"); + os << indent << "Symmetric: " << (this->Symmetric ? "On\n" : "Off\n"); + os << indent << "Length: " << this->Length << "\n"; +} diff --git a/source/visualization/externals/History b/source/visualization/externals/History index c4117aa130..5cf47ec409 100644 --- a/source/visualization/externals/History +++ b/source/visualization/externals/History @@ -17,6 +17,18 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +18 August 2021 Laurent Garnier (visexternals-V10-07-04) +- Fix issues with GL lib when building X11 AND Qt. GL libs should be include only once + +18 August 2021 Laurent Garnier (visexternals-V10-07-03) +- Fix issues in PDF generation due to remplacement by DBL_MAX introduced in visexternals-V10-07-02 + +06 August 2021 Laurent Garnier (visexternals-V10-07-02) +- Migrate gl2ps to 1.4.2 +- Patch lines: + 4452-4495-4520: Replace ~1UL by DBL_MAX + 4133: Add break statement + 14 April 2021 Ben Morgan (visexternals-V10-07-01) - Migrate gl2ps build to modular CMake system diff --git a/source/visualization/externals/gl2ps/History b/source/visualization/externals/gl2ps/History index 58310af446..de986525b2 100644 --- a/source/visualization/externals/gl2ps/History +++ b/source/visualization/externals/gl2ps/History @@ -15,6 +15,13 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +12 November 2021 Ben Morgan (visexternalsgl2ps-V10-07-01) +- Retire G4VIS_... preprocessor symbols in toolkit build, only required + by obsolete GNUmake system + +15 July 2021 Laurent Garnier (visexternalsgl2ps-V10-07-00) +- Migrate gl2ps to 1.4.2 + 23 September 2020 Ben Morgan (visexternalsgl2ps-V10-06-03) - Remove remianing include_directories diff --git a/source/visualization/externals/gl2ps/include/gl2ps.h b/source/visualization/externals/gl2ps/include/gl2ps.h index f855580ff6..87677f6584 100644 --- a/source/visualization/externals/gl2ps/include/gl2ps.h +++ b/source/visualization/externals/gl2ps/include/gl2ps.h @@ -26,7 +26,7 @@ /* * GL2PS, an OpenGL to PostScript Printing Library - * Copyright (C) 1999-2017 C. Geuzaine + * Copyright (C) 1999-2020 C. Geuzaine * * This program is free software; you can redistribute it and/or * modify it under the terms of either: @@ -59,8 +59,8 @@ * Please report all bugs and problems to . */ -#ifndef __GL2PS_H__ -#define __GL2PS_H__ +#ifndef GL2PS_H +#define GL2PS_H #include #include @@ -73,7 +73,9 @@ # pragma warning(disable:4127) # pragma warning(disable:4996) # endif -# define NOMINMAX +# if !defined(NOMINMAX) +# define NOMINMAX +# endif # include # undef NOMINMAX # if defined(GL2PSDLL) @@ -89,18 +91,10 @@ # define GL2PSDLL_API #endif -#if defined(HAVE_OPENGL_GL_H) +#if defined(__APPLE__) || defined(HAVE_OPENGL_GL_H) # include #else -# if defined(__APPLE__) -# ifdef GL2PS_USE_GL_GL_H -# include -# else -# include -# endif -# else -# include -# endif +# include #endif /* Support for compressed PostScript/PDF/SVG and for embedded PNG @@ -121,14 +115,14 @@ #define GL2PS_MAJOR_VERSION 1 #define GL2PS_MINOR_VERSION 4 -#define GL2PS_PATCH_VERSION 0 +#define GL2PS_PATCH_VERSION 2 #define GL2PS_EXTRA_VERSION "" #define GL2PS_VERSION (GL2PS_MAJOR_VERSION + \ 0.01 * GL2PS_MINOR_VERSION + \ 0.0001 * GL2PS_PATCH_VERSION) -#define GL2PS_COPYRIGHT "(C) 1999-2017 C. Geuzaine" +#define GL2PS_COPYRIGHT "(C) 1999-2020 C. Geuzaine" /* Output file formats (the values and the ordering are important!) */ @@ -172,6 +166,7 @@ #define GL2PS_NO_BLENDING (1<<11) #define GL2PS_TIGHT_BOUNDING_BOX (1<<12) #define GL2PS_NO_OPENGL_CONTEXT (1<<13) +#define GL2PS_NO_TEX_FONTSIZE (1<<14) /* Arguments for gl2psEnable/gl2psDisable */ @@ -180,7 +175,6 @@ #define GL2PS_LINE_STIPPLE 3 #define GL2PS_BLEND 4 - /* Arguments for gl2psLineCap/Join */ #define GL2PS_LINE_CAP_BUTT 0 @@ -250,6 +244,9 @@ GL2PSDLL_API GLint gl2psTextOpt(const char *str, const char *fontname, GL2PSDLL_API GLint gl2psTextOptColor(const char *str, const char *fontname, GLshort fontsize, GLint align, GLfloat angle, GL2PSrgba color); +GL2PSDLL_API GLint gl2psTextOptColorBL(const char *str, const char *fontname, + GLshort fontsize, GLint align, GLfloat angle, + GL2PSrgba color, GLfloat blx, GLfloat bly); GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str); GL2PSDLL_API GLint gl2psSpecialColor(GLint format, const char *str, GL2PSrgba rgba); GL2PSDLL_API GLint gl2psDrawPixels(GLsizei width, GLsizei height, @@ -262,6 +259,7 @@ GL2PSDLL_API GLint gl2psLineCap(GLint value); GL2PSDLL_API GLint gl2psLineJoin(GLint value); GL2PSDLL_API GLint gl2psLineWidth(GLfloat value); GL2PSDLL_API GLint gl2psBlendFunc(GLenum sfactor, GLenum dfactor); +GL2PSDLL_API GLint gl2psSorting(GLint mode); /* referenced in the documentation, but not fully documented */ GL2PSDLL_API GLint gl2psForceRasterPos(GL2PSvertex *vert); @@ -279,9 +277,11 @@ GL2PSDLL_API GLint gl2psDrawImageMap(GLsizei width, GLsizei height, GL2PSDLL_API const char *gl2psGetFileExtension(GLint format); GL2PSDLL_API const char *gl2psGetFormatDescription(GLint format); GL2PSDLL_API GLint gl2psGetFileFormat(); +GL2PSDLL_API GLint gl2psSetTexScaling(GLfloat scaling); #if defined(__cplusplus) } #endif -#endif /* __GL2PS_H__ */ +#endif + diff --git a/source/visualization/externals/gl2ps/sources.cmake b/source/visualization/externals/gl2ps/sources.cmake index 50c763ce06..725befbedc 100644 --- a/source/visualization/externals/gl2ps/sources.cmake +++ b/source/visualization/externals/gl2ps/sources.cmake @@ -1,18 +1,11 @@ # - G4gl2ps module build definition -# We need to add definitions depending on what GL drivers are built -if(GEANT4_USE_OPENGL) - add_definitions(-DG4VIS_BUILD_OPENGL_DRIVER) -endif() - -if(GEANT4_USE_INVENTOR) - add_definitions(-DG4VIS_BUILD_OI_DRIVER) -endif() - # Link to appropriate GL library for the platform/drivers being built set(G4GL2PS_GL_LIBRARIES OpenGL::GL) if(APPLE AND (GEANT4_USE_OPENGL_X11 OR GEANT4_USE_INVENTOR_XT OR GEANT4_USE_XM)) - set(G4GL2PS_GL_LIBRARIES XQuartzGL::GL) + if(NOT GEANT4_USE_QT) + set(G4GL2PS_GL_LIBRARIES XQuartzGL::GL) + endif() endif() # Define the Geant module diff --git a/source/visualization/externals/gl2ps/src/G4OpenGL2PSAction.cc b/source/visualization/externals/gl2ps/src/G4OpenGL2PSAction.cc index 91e9822da8..8636fcbbaa 100644 --- a/source/visualization/externals/gl2ps/src/G4OpenGL2PSAction.cc +++ b/source/visualization/externals/gl2ps/src/G4OpenGL2PSAction.cc @@ -27,15 +27,6 @@ // // -#ifdef G4VIS_BUILD_OPENGL_DRIVER - #define G4VIS_BUILD_OPENGL_GL2PS -#endif -#ifdef G4VIS_BUILD_OI_DRIVER - #define G4VIS_BUILD_OPENGL_GL2PS -#endif - -#ifdef G4VIS_BUILD_OPENGL_GL2PS - #include "G4OpenGL2PSAction.hh" #include @@ -207,8 +198,3 @@ void G4OpenGL2PSAction::setExportImageFormat(unsigned int type){ // Could not change the file type at this step. Please change it before enableFileWriting() } } - - - - -#endif diff --git a/source/visualization/externals/gl2ps/src/gl2ps.cc b/source/visualization/externals/gl2ps/src/gl2ps.cc index 9d46087778..befa090b96 100644 --- a/source/visualization/externals/gl2ps/src/gl2ps.cc +++ b/source/visualization/externals/gl2ps/src/gl2ps.cc @@ -23,18 +23,10 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -#ifdef G4VIS_BUILD_OPENGL_DRIVER -#define G4VIS_BUILD_OPENGL_GL2PS -#endif -#ifdef G4VIS_BUILD_OI_DRIVER -#define G4VIS_BUILD_OPENGL_GL2PS -#endif - -#ifdef G4VIS_BUILD_OPENGL_GL2PS /* * GL2PS, an OpenGL to PostScript Printing Library - * Copyright (C) 1999-2017 C. Geuzaine + * Copyright (C) 1999-2020 C. Geuzaine * * This program is free software; you can redistribute it and/or * modify it under the terms of either: @@ -74,10 +66,12 @@ #include #include #include -#include +#include +#include -#define GL2PS_HAVE_ZLIB +#if defined(GL2PS_HAVE_ZLIB) #include +#endif #if defined(GL2PS_HAVE_LIBPNG) #include @@ -142,9 +136,9 @@ typedef enum { typedef GLfloat GL2PSplane[4]; -typedef struct _GL2PSbsptree2d GL2PSbsptree2d; +typedef struct GL2PSbsptree2d_ GL2PSbsptree2d; -struct _GL2PSbsptree2d { +struct GL2PSbsptree2d_ { GL2PSplane plane; GL2PSbsptree2d *front, *back; }; @@ -154,9 +148,9 @@ typedef struct { char *array; } GL2PSlist; -typedef struct _GL2PSbsptree GL2PSbsptree; +typedef struct GL2PSbsptree_ GL2PSbsptree; -struct _GL2PSbsptree { +struct GL2PSbsptree_ { GL2PSplane plane; GL2PSlist *primitives; GL2PSbsptree *front, *back; @@ -186,9 +180,9 @@ typedef struct { GLfloat *pixels; } GL2PSimage; -typedef struct _GL2PSimagemap GL2PSimagemap; +typedef struct GL2PSimagemap_ GL2PSimagemap; -struct _GL2PSimagemap { +struct GL2PSimagemap_ { GL2PSimage *image; GL2PSimagemap *next; }; @@ -197,7 +191,7 @@ typedef struct { GLshort type, numverts; GLushort pattern; char boundary, offset, culled; - GLint factor, linecap, linejoin; + GLint factor, linecap, linejoin, sortid; GLfloat width, ofactor, ounits; GL2PSvertex *verts; union { @@ -262,6 +256,9 @@ typedef struct { /* for image map list */ GL2PSimagemap *imagemap_head; GL2PSimagemap *imagemap_tail; + + /* for TEX scaling */ + GLfloat tex_scaling; } GL2PScontext; typedef struct { @@ -633,6 +630,15 @@ static void gl2psListSort(GL2PSlist *list, qsort(list->array, list->n, list->size, fcmp); } +/* Must be a list of GL2PSprimitives. */ +static void gl2psListAssignSortIds(GL2PSlist *list) +{ + GLint i; + for(i = 0; i < gl2psListNbr(list); i++){ + (*(GL2PSprimitive**)gl2psListPointer(list, i))->sortid = i; + } +} + static void gl2psListAction(GL2PSlist *list, void (*action)(void *data)) { GLint i; @@ -736,9 +742,9 @@ static GLboolean gl2psSameColorThreshold(int n, GL2PSrgba rgba[], if(n < 2) return GL_TRUE; for(i = 1; i < n; i++){ - if(std::fabs(rgba[0][0] - rgba[i][0]) > threshold[0] || - std::fabs(rgba[0][1] - rgba[i][1]) > threshold[1] || - std::fabs(rgba[0][2] - rgba[i][2]) > threshold[2]) + if(std::fabs(rgba[0][0] - rgba[i][0]) > threshold[0] || + std::fabs(rgba[0][1] - rgba[i][1]) > threshold[1] || + std::fabs(rgba[0][2] - rgba[i][2]) > threshold[2]) return GL_FALSE; } @@ -886,7 +892,8 @@ static void gl2psConvertPixmapToPNG(GL2PSimage *pixmap, GL2PSlist *png) static GLint gl2psAddText(GLint type, const char *str, const char *fontname, GLshort fontsize, GLint alignment, GLfloat angle, - GL2PSrgba color) + GL2PSrgba color, GLboolean setblpos, + GLfloat blx, GLfloat bly) { GLfloat pos[4]; GL2PSprimitive *prim; @@ -911,11 +918,16 @@ static GLint gl2psAddText(GLint type, const char *str, const char *fontname, prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = (GLshort)type; prim->boundary = 0; - prim->numverts = 1; - prim->verts = (GL2PSvertex*)gl2psMalloc(sizeof(GL2PSvertex)); + prim->numverts = setblpos ? 2 : 1; + prim->verts = (GL2PSvertex*)gl2psMalloc(sizeof(GL2PSvertex) * prim->numverts); prim->verts[0].xyz[0] = pos[0]; prim->verts[0].xyz[1] = pos[1]; prim->verts[0].xyz[2] = pos[2]; + if (setblpos) { + prim->verts[1].xyz[0] = blx; + prim->verts[1].xyz[1] = bly; + prim->verts[1].xyz[2] = 0; + } prim->culled = 0; prim->offset = 0; prim->ofactor = 0.0; @@ -1485,7 +1497,8 @@ static int gl2psCompareDepth(const void *a, const void *b) return 1; } else{ - return 0; + /* Ensure that initial ordering is preserved when depths match. */ + return q->sortid < w->sortid ? -1 : 1; } } @@ -2310,7 +2323,7 @@ static void gl2psParseFeedbackBuffer(GLint used) GLboolean boundary; GLint i, sizeoffloat, count, v, vtot, offset = 0, factor = 0, auxindex = 0; GLint lcap = 0, ljoin = 0; - GLfloat lwidth = 1.0F, psize = 1.0F, ofactor = 0.0F, ounits = 0.0F; + GLfloat lwidth = 1.0F, psize = 1.0F, ofactor = 0.0F, ounits = 0.0F; GLfloat *current; GL2PSvertex vertices[3]; GL2PSprimitive *prim; @@ -2432,12 +2445,12 @@ static void gl2psParseFeedbackBuffer(GLint used) case GL2PS_LINE_CAP_TOKEN : current += 2; used -= 2; - lcap = current[1]; + lcap = (GLint)current[1]; break; case GL2PS_LINE_JOIN_TOKEN : current += 2; used -= 2; - ljoin = current[1]; + ljoin = (GLint)current[1]; break; case GL2PS_LINE_WIDTH_TOKEN : current += 2; @@ -2790,13 +2803,13 @@ static void gl2psPrintPostScriptHeader(void) gl2psPrintf("%%%%Title: %s\n" "%%%%Creator: GL2PS %d.%d.%d%s, %s\n" "%%%%For: %s\n" - "%%%%CreationDate: \n" + "%%%%CreationDate: %s" "%%%%LanguageLevel: 3\n" "%%%%DocumentData: Clean7Bit\n" "%%%%Pages: 1\n", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, - gl2ps->producer); + gl2ps->producer, ctime(&now)); if(gl2ps->format == GL2PS_PS){ gl2psPrintf("%%%%Orientation: %s\n" @@ -3350,6 +3363,7 @@ static void gl2psPrintTeXHeader(void) char name[256]; time_t now; int i; + GLfloat s; if(gl2ps->filename && strlen(gl2ps->filename) < 256){ for(i = (int)strlen(gl2ps->filename) - 1; i >= 0; i--){ @@ -3371,19 +3385,22 @@ static void gl2psPrintTeXHeader(void) "%% Title: %s\n" "%% Creator: GL2PS %d.%d.%d%s, %s\n" "%% For: %s\n" - "%% CreationDate: %s\n", + "%% CreationDate: %s", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); + s = gl2ps->tex_scaling; + if(s <= 0.) s = 1.; fprintf(gl2ps->stream, - "\\setlength{\\unitlength}{1pt}\n" + "\\setlength{\\unitlength}{%gpt}\n" "\\begin{picture}(0,0)\n" - "\\includegraphics{%s}\n" + "\\includegraphics[scale=%g]{%s}\n" "\\end{picture}%%\n" "%s\\begin{picture}(%d,%d)(0,0)\n", - name, (gl2ps->options & GL2PS_LANDSCAPE) ? "\\rotatebox{90}{" : "", - (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); + s, s, name, + (gl2ps->options & GL2PS_LANDSCAPE) ? "\\rotatebox{90}{" : "", + (int)(gl2ps->viewport[2]), (int)(gl2ps->viewport[3])); } static void gl2psPrintTeXPrimitive(void *data) @@ -3394,10 +3411,12 @@ static void gl2psPrintTeXPrimitive(void *data) switch(prim->type){ case GL2PS_TEXT : - fprintf(gl2ps->stream, "\\fontsize{%d}{0}\n\\selectfont", - prim->data.text->fontsize); + if(!(gl2ps->options & GL2PS_NO_TEX_FONTSIZE)) + fprintf(gl2ps->stream, "\\fontsize{%d}{0}\\selectfont", + prim->data.text->fontsize); fprintf(gl2ps->stream, "\\put(%g,%g)", - prim->verts[0].xyz[0], prim->verts[0].xyz[1]); + prim->verts[0].xyz[0], + prim->verts[0].xyz[1]); if(prim->data.text->angle) fprintf(gl2ps->stream, "{\\rotatebox{%g}", prim->data.text->angle); fprintf(gl2ps->stream, "{\\makebox(0,0)"); @@ -3592,6 +3611,43 @@ static void gl2psPutPDFText(GL2PSstring *text, int cnt, GLfloat x, GLfloat y) } } +/* + This is used for producing aligned text in PDF. (x, y) is the anchor for the + aligned text, (xbl, ybl) is the bottom left corner. Rotation happens + around (x, y).*/ +static void gl2psPutPDFTextBL(GL2PSstring *text, int cnt, GLfloat x, GLfloat y, + GLfloat xbl, GLfloat ybl) +{ + if(text->angle == 0.0F){ + gl2ps->streamlength += gl2psPrintf + ("BT\n" + "/F%d %d Tf\n" + "%f %f Td\n" + "(%s) Tj\n" + "ET\n", + cnt, text->fontsize, xbl, ybl, text->str); + } + else{ + GLfloat a, ca, sa; + GLfloat pi = 3.141593F; + GLfloat i = std::atan2(y - ybl, x - xbl); + GLfloat r = std::sqrt((y - ybl) * (y - ybl) + (x - xbl) * (x - xbl)); + + a = (GLfloat)(pi * text->angle / 180.0F); + sa = (GLfloat)sin(a); + ca = (GLfloat)cos(a); + gl2ps->streamlength += gl2psPrintf + ("BT\n" + "/F%d %d Tf\n" + "%f %f %f %f %f %f Tm\n" + "(%s) Tj\n" + "ET\n", + cnt, text->fontsize, + ca, sa, -sa, ca, + xbl + r * (std::cos(i) - std::cos(i + a)), ybl + r * (std::sin(i) - std::sin(i+a)), text->str); + } +} + static void gl2psPutPDFSpecial(int prim, int sec, GL2PSstring *text) { gl2ps->streamlength += gl2psPrintf("/GS%d%d gs\n", prim, sec); @@ -3974,8 +4030,16 @@ static void gl2psPDFgroupListWriteMainStream(void) for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2ps->streamlength += gl2psPrintPDFFillColor(prim->verts[0].rgba); - gl2psPutPDFText(prim->data.text, gro->fontno, prim->verts[0].xyz[0], - prim->verts[0].xyz[1]); + if (prim->numverts == 2) { + gl2psPutPDFTextBL(prim->data.text, gro->fontno, prim->verts[0].xyz[0], + prim->verts[0].xyz[1], + prim->verts[1].xyz[0], + prim->verts[1].xyz[1]); + } + else { + gl2psPutPDFText(prim->data.text, gro->fontno, prim->verts[0].xyz[0], + prim->verts[0].xyz[1]); + } } break; case GL2PS_SPECIAL: @@ -4378,7 +4442,7 @@ static int gl2psPrintPDFShaderStreamDataCoord(GL2PSvertex *vertex, int offs = 0; unsigned long imap; GLfloat diff; - double dmax = (double) ~1UL; + double dmax = (double) ULONG_MAX; char edgeflag = 0; /* FIXME: temp bux fix for 64 bit archs: */ @@ -4421,7 +4485,7 @@ static int gl2psPrintPDFShaderStreamDataRGB(GL2PSvertex *vertex, { int offs = 0; unsigned long imap; - double dmax = (double) ~1UL; + double dmax = (double) ULONG_MAX; /* FIXME: temp bux fix for 64 bit archs: */ if(sizeof(unsigned long) == 8) dmax = dmax - 2048.; @@ -4446,7 +4510,7 @@ static int gl2psPrintPDFShaderStreamDataAlpha(GL2PSvertex *vertex, { int offs = 0; unsigned long imap; - double dmax = (double) ~1UL; + double dmax = (double) ULONG_MAX; /* FIXME: temp bux fix for 64 bit archs: */ if(sizeof(unsigned long) == 8) dmax = dmax - 2048.; @@ -5081,13 +5145,13 @@ static void gl2psPrintSVGHeader(void) gl2psPrintf("\n"); gl2psPrintf("\n", + " width=\"%dpt\" height=\"%dpt\" viewBox=\"%d %d %d %d\">\n", width, height, x, y, width, height); gl2psPrintf("%s\n", gl2ps->title); gl2psPrintf("\n"); gl2psPrintf("Creator: GL2PS %d.%d.%d%s, %s\n" "For: %s\n" - "CreationDate: %s\n", + "CreationDate: %s", GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); gl2psPrintf("\n"); @@ -5203,11 +5267,7 @@ static void gl2psEndSVGLine(void) } } -#if defined(GL2PS_HAVE_LIBPNG) static void gl2psPrintSVGPixmap(GLfloat x, GLfloat y, GL2PSimage *pixmap) -#else -static void gl2psPrintSVGPixmap(GLfloat, GLfloat, GL2PSimage* ) -#endif { #if defined(GL2PS_HAVE_LIBPNG) GL2PSlist *png; @@ -5240,6 +5300,7 @@ static void gl2psPrintSVGPixmap(GLfloat, GLfloat, GL2PSimage* ) gl2psPrintf("\"/>\n"); gl2psListDelete(png); #else + (void) x; (void) y; (void) pixmap; /* not used */ gl2psMsg(GL2PS_WARNING, "GL2PS must be compiled with PNG support in " "order to embed images in SVG streams"); #endif @@ -5250,8 +5311,8 @@ static void gl2psPrintSVGPrimitive(void *data) GL2PSprimitive *prim; GL2PSxyz xyz[4]; GL2PSrgba rgba[4]; - char col[32] = ""; - char lcap[7] = "", ljoin[7] = ""; + char col[32]; + char lcap[7], ljoin[7]; int newline; prim = *(GL2PSprimitive**)data; @@ -5527,10 +5588,10 @@ static void gl2psPrintPGFHeader(void) "%% Title: %s\n" "%% Creator: GL2PS %d.%d.%d%s, %s\n" "%% For: %s\n" - "%% CreationDate: \n", + "%% CreationDate: %s", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, - gl2ps->producer); + gl2ps->producer, ctime(&now)); fprintf(gl2ps->stream, "\\begin{pgfpicture}\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ @@ -5700,12 +5761,12 @@ static void gl2psPrintPGFPrimitive(void *data) prim->verts[0].rgba[0], prim->verts[0].rgba[1], prim->verts[0].rgba[2], prim->data.text->str); - fprintf(gl2ps->stream, "}{}{\\pgfusepath{discard}}}"); + fprintf(gl2ps->stream, "}{}{\\pgfusepath{discard}}"); if(prim->data.text->angle) fprintf(gl2ps->stream, "}"); - fprintf(gl2ps->stream, "\n"); + fprintf(gl2ps->stream, "\n}\n"); break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text @@ -5871,6 +5932,7 @@ static GLint gl2psPrintPrimitives(void) gl2psListReset(gl2ps->primitives); break; case GL2PS_SIMPLE_SORT : + gl2psListAssignSortIds(gl2ps->primitives); gl2psListSort(gl2ps->primitives, gl2psCompareDepth); if(gl2ps->options & GL2PS_OCCLUSION_CULL){ gl2psListActionInverse(gl2ps->primitives, gl2psAddInImageTree); @@ -6126,6 +6188,8 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer, gl2ps->buffersize = 0; } + gl2ps->tex_scaling = 1.; + return GL2PS_SUCCESS; } @@ -6179,34 +6243,70 @@ GL2PSDLL_API GLint gl2psEndViewport(void) return res; } +GL2PSDLL_API GLint gl2psSorting(GLint mode) +{ + GLint res; + + if(!gl2ps) return GL2PS_UNINITIALIZED; + + switch(mode){ + case GL2PS_NO_SORT : + case GL2PS_SIMPLE_SORT : + case GL2PS_BSP_SORT : + gl2ps->sort = mode; + res = GL2PS_SUCCESS; + break; + default : + gl2psMsg(GL2PS_ERROR, "Unknown sorting algorithm: %d", mode); + gl2psFree(gl2ps); + gl2ps = NULL; + res = GL2PS_ERROR; + } + + return res; +} + GL2PSDLL_API GLint gl2psTextOptColor(const char *str, const char *fontname, GLshort fontsize, GLint alignment, GLfloat angle, GL2PSrgba color) { return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, - color); + color, GL_FALSE, 0, 0); +} + +/** + * This version of gl2psTextOptColor is used to go around the + * fact that PDF does not support text alignment. The extra parameters + * (blx, bly) represent the bottom left corner of the text bounding box. + */ +GL2PSDLL_API GLint gl2psTextOptColorBL(const char *str, const char *fontname, + GLshort fontsize, GLint alignment, GLfloat angle, + GL2PSrgba color, GLfloat blx, GLfloat bly) +{ + return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, + color, GL_TRUE, blx, bly); } GL2PSDLL_API GLint gl2psTextOpt(const char *str, const char *fontname, GLshort fontsize, GLint alignment, GLfloat angle) { - return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, NULL); + return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, NULL, GL_FALSE, 0, 0); } GL2PSDLL_API GLint gl2psText(const char *str, const char *fontname, GLshort fontsize) { return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, GL2PS_TEXT_BL, 0.0F, - NULL); + NULL, GL_FALSE, 0, 0); } GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str) { - return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, NULL); + return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, NULL, GL_FALSE, 0, 0); } GL2PSDLL_API GLint gl2psSpecialColor(GLint format, const char *str, GL2PSrgba rgba) { - return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, rgba); + return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, rgba, GL_FALSE, 0, 0); } GL2PSDLL_API GLint gl2psDrawPixels(GLsizei width, GLsizei height, @@ -6507,6 +6607,10 @@ GL2PSDLL_API const char *gl2psGetFormatDescription(GLint format) GL2PSDLL_API GLint gl2psGetFileFormat() { + if(!gl2ps) { + return GL2PS_UNINITIALIZED; + } + return gl2ps->format; } @@ -6528,4 +6632,14 @@ GL2PSDLL_API GLint gl2psForceRasterPos(GL2PSvertex *vert) return GL2PS_SUCCESS; } -#endif + +GL2PSDLL_API GLint gl2psSetTexScaling(GLfloat scaling) +{ + + if(!gl2ps) { + return GL2PS_UNINITIALIZED; + } + gl2ps->tex_scaling = scaling; + + return GL2PS_SUCCESS; +} diff --git a/source/visualization/gMocren/History b/source/visualization/gMocren/History index 8acc78ed3c..6765cf8c99 100644 --- a/source/visualization/gMocren/History +++ b/source/visualization/gMocren/History @@ -18,6 +18,8 @@ committal in the CVS repository ! History file for visualization/gMocren sub-category --------------------------------------------------- +27 September 2021 Pedro Arce (gMocren-V10-07-02) +- Use updated interface from geomnav to use G4PhantomParameterisation::GetNoVoxels instead of GetNoVoxel 07 June 2021 John Allison (gMocren-V10-07-01) - Fix hidden function warning. diff --git a/source/visualization/gMocren/README b/source/visualization/gMocren/README deleted file mode 100644 index a8efab8161..0000000000 --- a/source/visualization/gMocren/README +++ /dev/null @@ -1,13 +0,0 @@ -//-- gMocren-file driver --// - -Oct. 12, 2009 : Akinori Kimura - Beta release. - It supports a geometry constructed with G4PhantomParameterisation or - G4VNestedParameterisation and a hits collection based on G4VHits, - primitive scorer or the interactive scorer. - -Apr. 1, 2009 : Akinori Kimura - - First version of the gMocren-file driver. - This is a prototype, not a release version. - diff --git a/source/visualization/gMocren/src/G4GMocrenFileSceneHandler.cc b/source/visualization/gMocren/src/G4GMocrenFileSceneHandler.cc index ae9f7bff04..3b139604a0 100644 --- a/source/visualization/gMocren/src/G4GMocrenFileSceneHandler.cc +++ b/source/visualization/gMocren/src/G4GMocrenFileSceneHandler.cc @@ -1194,9 +1194,9 @@ void G4GMocrenFileSceneHandler::AddSolid( const G4Box& box ) ; } - kNestedVolumeDimension[0] = phantomPara->GetNoVoxelX(); - kNestedVolumeDimension[1] = phantomPara->GetNoVoxelY(); - kNestedVolumeDimension[2] = phantomPara->GetNoVoxelZ(); + kNestedVolumeDimension[0] = phantomPara->GetNoVoxelsX(); + kNestedVolumeDimension[1] = phantomPara->GetNoVoxelsY(); + kNestedVolumeDimension[2] = phantomPara->GetNoVoxelsZ(); kNestedVolumeDirAxis[0] = 0; kNestedVolumeDirAxis[1] = 1; kNestedVolumeDirAxis[2] = 2; diff --git a/source/visualization/management/GNUmakefile b/source/visualization/management/GNUmakefile index 0cb4785552..5f768febaf 100644 --- a/source/visualization/management/GNUmakefile +++ b/source/visualization/management/GNUmakefile @@ -10,7 +10,7 @@ endif # For debug mode # CPPFLAGS += -DG4DEBUG_VIS_MANAGEMENT -GLOBLIBS = libG4modeling.lib +GLOBLIBS = libG4modeling.lib libG4tools.lib GLOBLIBS += libG4tasking.lib libG4run.lib libG4event.lib GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib @@ -22,6 +22,7 @@ include $(G4INSTALL)/config/G4VIS_BUILD.gmk CPPFLAGS += -I$(G4BASE)/visualization/management/include CPPFLAGS += -I$(G4BASE)/visualization/modeling/include +CPPFLAGS += -I$(G4BASE)/externals/g4tools/include CPPFLAGS += -I$(G4BASE)/graphics_reps/include CPPFLAGS += -I$(G4BASE)/global/management/include CPPFLAGS += -I$(G4BASE)/global/HEPGeometry/include diff --git a/source/visualization/management/History b/source/visualization/management/History index be84971c39..c7c7f5fa61 100644 --- a/source/visualization/management/History +++ b/source/visualization/management/History @@ -25,6 +25,188 @@ committal in the CVS repository ! History file for visualization management sub-category ------------------------------------------------------ +11 November 2021 John Allison (visman-V10-07-28) +- G4VisManager.cc: + - Bug exposed by G03. + - Protect null pointers in GeometryHasChanged when called before any + scenes, scene handlers or viewers had been created. + +07 November 2021 John Allison (visman-V10-07-27) +- G4VSceneHandler: + - Introduce GetColour (const G4Visible&). + - This makes no assumptions about the validity of data member fpVisAttribs. + - If the G4Visible has no vis attributes, i.e., the pointer is null, + the colour is obtained from the default view parameters of the + current viewer. + - It is safer than GetColour () (no arguments), which might be deprecated + in future. + - Add explanatory comment regarding view destruction in RemoveViewerFromList. +- G4Scene.cc: + - Remove misleading comments. +- G4VisCommansCompound.cc: + - /vis/drawTree: Invoke /vis/viewer/reset to ensure culling is off, so that + all volumes are printed. + +05 November 2021 Guy Barrand (visman-V10-07-26) +- suppress G4VisPlotMessenger.hh. The relationship G4/analysis + versus G4/visualization is going to be done by using G4/commands. +- sources.cmake: remove G4VisPlotMessenger.hh. +- G4VisCommandsPlotter, G4VisManager.cc: have now the commands: + /vis/plotter/add/h1 + /vis/plotter/add/h2 + managed here (and no more in G4VisPlotMessenger). + +03 November 2021 Guy Barrand (visman-V10-07-25) +- G4PlotterManager: have: + /vis/plotter/style/select + /vis/plotter/style/add + /vis/plotter/style/remove + commands to be able to create styles from G4 commands. + To handle properly these commands, a local list of + styles is managed (do not use the tools::xml::styles + for this). +- G4PlotterManager: remove the: + /vis/plotter/style/load + command and the logic to define a style through an + XML file. It then removes a dependancy toward expat. +- sources.cmake: since expat is no more used, remove: + ${EXPAT_LIBRARIES} + +02 November 2021 Gabriele Cosmo (visman-V10-07-24) +- G4VVisCommand: move static functions to be not inline, to support Windows DLL + builds. Added GetVisManager() accessor. +- G4VisPlotMessenger: use GetVisManager() accessor instead of static pointer + in inline method AddRegionHistogram(). + +30 October 2021 John Allison (visman-V10-07-23) +- G4VisExecutive.icc: + - Introduce additional nicknames: + - "TSG" for the selected ToolsSG driver. + - "VTK_NATIVE" for the G4Vtk driver. + - "Vtk" and "VTK" for the selected Vtk driver. + - So now the names (and nicknames) are, for example: + - TOOLSSG_QT_GLES (TSG_QT_GLES, TSG) + - VtkNative (VTKN, VTK_NATIVE) + - VtkQt (VTKQt, Vtk, VTK) +- G4VisManager.cc: + - Invoke G4UIdirectory::Sort() for /vis/. + - Command names now appear in alphabetical order. + - Sort() was recently introduced in intercoms-V10-07-14. + - By default, sorting is propagated to subdirectories, but this may + be intercepted by Sort(false) on the subdirectory. + - Protect against nullptr in SetCurrentViewer(). + - Fix a bug which prevented the number of events to be kept being set + to zero. +- G4VSceneHandler.hh: + - Remove redundant forward declarations. + - Tidy AddPrimitive section. +- G4VSceneHandler.cc: + - Reset current viewer to nullptr after RemoveViewerFromList. + - Improve warning messages in the default AddPrimitive (const G4Plotter&). + +25 October 2021 Guy Barrand (visman-V10-07-22) +- sources.cmake: declare to cmake: + G4VisCommandsPlotter.hh,.cc + G4PlotterManager.hh,.cc + G4VisPlotMessenger.hh + Have G4tools in the module dependencies (mainly to have -I toward g4tools/include/tools). + Because G4PlotterManager.cc uses expat to load an XML style file, have also: + ${EXPAT_LIBRARIES} +- include/G4VisPlotMessenger.hh: a template pure header messenger for the commands: + /vis/plotter/add/h1 + /vis/plotter/add/h2 + This file is intended to be used in user code and does the connection of the + G4/vis/plotting with G4/analysis that manages the histograms. (Done in this way, + it avoids a strong relationship between the vis and analysis categories). +- include/G4VSceneHandler.hh,.cc: default implementation of AddPrimitive(G4Plotter). +- G4VisManager.cc: declare the /vis/scene/add/plotter along the /vis/plotter commands. +- G4VisCommandsSceneAdd.hh,.cc: /vis/scene/add/plotter command. +- G4VisCommandsPlotter.hh,.cc: new files: have commands: + /vis/plotter/create + /vis/plotter/setLayout + /vis/plotter/addStyle + /vis/plotter/addRegionStyle + /vis/plotter/addRegionParameter + /vis/plotter/clear + /vis/plotter/clearRegion + /vis/plotter/list +- G4PlotterManager.hh,.cc: new files: a singleton to handle named G4Plotter instances + and the commands: + /vis/plotter/style/load + /vis/plotter/style/list + /vis/plotter/style/print + +10 October 2021 John Allison (visman-V10-07-21) +- G4VisCommandsCompound.cc, G4VisCommandOpen, G4VisCommandSceneHandlerCreate: + - Improve reporting of unrecognised graphics system. +- G4VisCommandsTouchable.cc: Migrate to modeling-V10-07-14: + - G4PhysicalVolumeModel: Hold current transform as object, not as a pointer. + +02 September 2021 John Allison (visman-V10-07-20) +- G4VVisCommand, G4VisCommandsSceneHandler and G4VisCommandsViewer: + o Preserve view parameters of any existing viewer and use them in + the creation of a new viewer. + o So if the user requests a new viewer of the same or a new graphics + system, the upcoming view will inherit the view parameters of + the previously existing viewer. + o The idea is that it makes the response a command /vis/viewer/open + (or /vis/viewer/create) more natural. (Hitherto, it might have + opened a virgin viewer without any reference to what the user had + previously specified.) + o The first /vis/open in not affected. + +27 August 2021 Ben Morgan (visman-V10-07-19) +- Remove obsolete HepRep(WIRED) driver + +26 August 2021 Ben Morgan (visman-V10-07-18) +- G4VisExecutive: + o Remove obsolete VRML1 and network VRML2 drivers + o Remove obsolete network FukuiRenderer driver + +31 July 2021 John Allison (visman-V10-07-17) +- G4Scene: Remove misleading warning message. + o AddRunDurationModel: Allow multiple models fo the same name, but + different parameters, to be added without warning. + +18 July 2021 John Allison (visman-V10-07-16) +- G4VSceneHandler.cc: + o Use C++17 [[fallthrough]] instead of // fallthrough in switch statement. + +15 July 2021 John Allison (visman-V10-07-15) +- G4VisCommands.cc: + o Replace /vis/ogl/printEPS with /vis/ogl/export in guidance. + +12 July 2021 John Allison (visman-V10-07-14) +- G4VisCommandsScene: + o Implement /vis/scene/removeModel. + +09 July 2021 John Allison (visman-V10-07-13) +- G4ViewParameters.cc: + o Add Special Mesh Rendering parameters to /vis/viewer/save. + +06 July 2021 John Allison (visman-V10-07-12) +- G4VSceneHandler.cc: + o Add code for drawing the extents of models in a scene. + . For debug only; commented out. +- G4VViewer.cc: + o Trap request to set touchable of a physical volume no longer in the + physical volume store and issue message. +- G4ViewParameters: + o Fix Coverity warning. +- G4VVisCommandGeometrySet.cc: + o Recalculate extent of any physical volume model in run duration lists + after any /vis/geometry command (the scene's extent might have been + changed by the command). + +30 June 2021 John Allison (visman-V10-07-11) +- Requires greps-V10-07-09 and modeling-V10-07-11. +- Revise vis models. See visualization/modeling/History for more details. +- Consequent changes: + o AddPrimitive(const G4Scale&) has been removed from all scene handlers. + o Draw(const G4Scale&) has been removed from G4VisManager. + o /vis/scene/add/scale reimplemented with G4CallBackModel. + o All commands using G4CallBackModel follow interface change. + 07 June 2021 John Allison (visman-V10-07-10) - G4VSceneHandler: o Implement a default AddCompound (const G4Mesh&). diff --git a/source/visualization/management/include/G4PlotterManager.hh b/source/visualization/management/include/G4PlotterManager.hh new file mode 100644 index 0000000000..e673c33591 --- /dev/null +++ b/source/visualization/management/include/G4PlotterManager.hh @@ -0,0 +1,136 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Guy Barrand 12 October 2021 +// + +#ifndef G4PLOTTERMANAGER_HH +#define G4PLOTTERMANAGER_HH + +#include "G4Plotter.hh" +#include "G4UImessenger.hh" + +#include +#include + +class G4PlotterManager { +public: + static G4PlotterManager& GetInstance (); + G4Plotter& GetPlotter(const G4String& a_name); + void List() const; + + using StyleItem = std::pair; + using Style = std::vector; + using NamedStyle = std::pair; + using Styles = std::vector; + const Styles& GetStyles() const {return fStyles;} + Styles& GetStyles() {return fStyles;} + +private: + G4PlotterManager(); + virtual ~G4PlotterManager(); + G4PlotterManager (const G4PlotterManager&); + G4PlotterManager& operator = (const G4PlotterManager&); + + void ListStyles() const; + Style* FindStyle(const G4String& name); + void SelectStyle(const G4String& style); + void RemoveStyle(const G4String& name); + void PrintStyle(const G4String&) const; + void AddStyleParameter(const G4String& param,const G4String& value); + + typedef std::pair NamedPlotter; + std::vector fPlotters; + + G4String fCurrentStyle; + Styles fStyles; + + class Messenger: public G4UImessenger { + public: + Messenger(G4PlotterManager& aPlotterManager):fPlotterManager(aPlotterManager) { + G4UIparameter* parameter; + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + remove_style = new G4UIcommand("/vis/plotter/style/remove",this); + remove_style->SetGuidance("Remove a named style."); + + parameter = new G4UIparameter("name",'s',false); + remove_style->SetParameter(parameter); + + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + select_style = new G4UIcommand("/vis/plotter/style/select",this); + select_style->SetGuidance("Select a named style for further style/add commands."); + select_style->SetGuidance("If not existing, the named style is created."); + + parameter = new G4UIparameter("name",'s',false); + select_style->SetParameter(parameter); + + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + add_style_parameter = new G4UIcommand("/vis/plotter/style/add",this); + add_style_parameter->SetGuidance("Add a (parameter,value) to the current named style."); + + parameter = new G4UIparameter("parameter",'s',false); + add_style_parameter->SetParameter (parameter); + + parameter = new G4UIparameter("value",'s',false); + add_style_parameter->SetParameter (parameter); + + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + list_styles = new G4UIcommand("/vis/plotter/style/list", this); + list_styles->SetGuidance("List known not embedded styles."); + + ////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////// + print_style = new G4UIcommand("/vis/plotter/style/print", this); + print_style->SetGuidance("Print a style."); + + parameter = new G4UIparameter("style",'s',false); + print_style->SetParameter (parameter); + } + virtual ~Messenger() { + delete remove_style; + delete select_style; + delete add_style_parameter; + delete list_styles; + delete print_style; + } + virtual void SetNewValue(G4UIcommand*,G4String); + private: + G4PlotterManager& fPlotterManager; + G4UIcommand* remove_style; + G4UIcommand* select_style; + G4UIcommand* add_style_parameter; + G4UIcommand* list_styles; + G4UIcommand* print_style; + }; + + Messenger* fMessenger; +}; + +#endif diff --git a/source/visualization/management/include/G4VSceneHandler.hh b/source/visualization/management/include/G4VSceneHandler.hh index 859d5ce4ee..d4c01f7120 100644 --- a/source/visualization/management/include/G4VSceneHandler.hh +++ b/source/visualization/management/include/G4VSceneHandler.hh @@ -45,18 +45,8 @@ #include "G4THitsMap.hh" class G4Scene; -class G4VViewer; -class G4Colour; -class G4Visible; -class G4ModelingParameters; -class G4VModel; class G4VGraphicsSystem; -class G4LogicalVolume; -class G4VPhysicalVolume; -class G4Material; -class G4Event; class G4AttHolder; -class G4DisplacedSolid; class G4VSceneHandler: public G4VGraphicsScene { @@ -194,15 +184,14 @@ public: // With description // } virtual void AddPrimitive (const G4Polyline&) = 0; - virtual void AddPrimitive (const G4Scale&); - // Default implementation in this class but can be over-ridden. virtual void AddPrimitive (const G4Text&) = 0; virtual void AddPrimitive (const G4Circle&) = 0; virtual void AddPrimitive (const G4Square&) = 0; virtual void AddPrimitive (const G4Polymarker&); - // Default implementation in this class but can be over-ridden. virtual void AddPrimitive (const G4Polyhedron&) = 0; - + virtual void AddPrimitive (const G4Plotter&); + + // Other virtual functions virtual const G4VisExtent& GetExtent() const; ////////////////////////////////////////////////////////////// @@ -236,9 +225,20 @@ public: // With description ////////////////////////////////////////////////////////////// // Public utility functions. - const G4Colour& GetColour (); + const G4Colour& GetColour (); // To be deprecated? const G4Colour& GetColor (); // Returns colour - checks fpVisAttribs and gets applicable colour. + // Assumes fpVisAttribs point to the G4VisAttributes of the current object. + // If the pointer is null, the colour is obtained from the default view + // parameters of the current viewer. + + const G4Colour& GetColour (const G4Visible&); + const G4Colour& GetColor (const G4Visible&); + // Returns colour, or viewer default colour. + // Makes no assumptions about the validity of data member fpVisAttribs. + // If the G4Visible has no vis attributes, i.e., the pointer is null, + // the colour is obtained from the default view parameters of the + // current viewer. const G4Colour& GetTextColour (const G4Text&); const G4Colour& GetTextColor (const G4Text&); diff --git a/source/visualization/management/include/G4VSceneHandler.icc b/source/visualization/management/include/G4VSceneHandler.icc index bf3b11826f..46f4c29a10 100644 --- a/source/visualization/management/include/G4VSceneHandler.icc +++ b/source/visualization/management/include/G4VSceneHandler.icc @@ -129,16 +129,14 @@ inline void G4VSceneHandler::SetObjectTransformation (const G4Transform3D& t) { fObjectTransformation = t; } -inline const G4Colour& G4VSceneHandler::GetColour () { - fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); - const G4Colour& colour = fpVisAttribs -> GetColour (); - return colour; -} - inline const G4Colour& G4VSceneHandler::GetColor () { return GetColour (); } +inline const G4Colour& G4VSceneHandler::GetColor (const G4Visible& visible) { + return GetColour (visible); +} + inline const G4Colour& G4VSceneHandler::GetTextColor (const G4Text& text) { return GetTextColour (text); } diff --git a/source/visualization/management/include/G4VUserVisAction.hh b/source/visualization/management/include/G4VUserVisAction.hh index bce6dbcb88..4c7f2f23ac 100644 --- a/source/visualization/management/include/G4VUserVisAction.hh +++ b/source/visualization/management/include/G4VUserVisAction.hh @@ -53,20 +53,17 @@ class G4VUserVisAction public: // With description G4VUserVisAction() : fpSceneHandler(nullptr) - , fpTransform(nullptr) , fpMP(nullptr) {} virtual ~G4VUserVisAction() {} virtual void Draw() = 0; - void operator()(G4VGraphicsScene& scene, const G4Transform3D& trans, const G4ModelingParameters* pMP) { + void operator()(G4VGraphicsScene& scene, const G4ModelingParameters* pMP) { fpSceneHandler = &scene; - fpTransform = &trans; fpMP = pMP; Draw(); } protected: G4VGraphicsScene* fpSceneHandler; - const G4Transform3D* fpTransform; const G4ModelingParameters* fpMP; }; diff --git a/source/visualization/management/include/G4VVisCommand.hh b/source/visualization/management/include/G4VVisCommand.hh index 57cb90aac7..aca49f9830 100644 --- a/source/visualization/management/include/G4VVisCommand.hh +++ b/source/visualization/management/include/G4VVisCommand.hh @@ -52,11 +52,11 @@ public: G4VVisCommand (); virtual ~G4VVisCommand (); - static void SetVisManager (G4VisManager* pVisManager) - {fpVisManager = pVisManager;} + static G4VisManager* GetVisManager (); - static const G4Colour& GetCurrentTextColour() - {return fCurrentTextColour;} + static void SetVisManager (G4VisManager* pVisManager); + + static const G4Colour& GetCurrentTextColour(); protected: @@ -114,6 +114,14 @@ protected: G4double& value); // Return false if there's a problem + void CopyMostViewParameters + (G4ViewParameters& target, const G4ViewParameters& from); + // Copy view parameters except for autoRefresh and background... + + void CopyCameraParameters + (G4ViewParameters& target, const G4ViewParameters& from); + // Copy view parameters pertaining only to camera + // Other utilities void CheckSceneAndNotifyHandlers (G4Scene* = nullptr); @@ -147,6 +155,13 @@ protected: static G4PhysicalVolumeModel::TouchableProperties fCurrentTouchableProperties; static G4VisExtent fCurrentExtentForField; static std::vector fCurrrentPVFindingsForField; + + // When we create a new viewer we would like to use the view parameters of + // the existing viewer if there was one. This has to be checked at the + // creation of a new viewer and *also* at the creation of a new scene + // handler. + static G4bool fThereWasAViewer; // True if there was a viewer + static G4ViewParameters fVPExistingViewer; // Its view parameters }; #endif diff --git a/source/visualization/management/include/G4VisCommandModelCreate.hh b/source/visualization/management/include/G4VisCommandModelCreate.hh index 9085fb7ce9..e6948d9ce7 100644 --- a/source/visualization/management/include/G4VisCommandModelCreate.hh +++ b/source/visualization/management/include/G4VisCommandModelCreate.hh @@ -123,7 +123,7 @@ G4VisCommandModelCreate::GetCurrentValue(G4UIcommand*) template void G4VisCommandModelCreate::SetNewValue(G4UIcommand*, G4String newName) { - if (newName.isNull()) newName = NextName(); + if (newName.empty()) newName = NextName(); assert (0 != fpFactory); diff --git a/environments/g4py/tests/g4pytest/ezgeom/EzDetectorConstruction.hh b/source/visualization/management/include/G4VisCommandsPlotter.hh similarity index 60% rename from environments/g4py/tests/g4pytest/ezgeom/EzDetectorConstruction.hh rename to source/visualization/management/include/G4VisCommandsPlotter.hh index 19a717dc2c..a644b417b7 100644 --- a/environments/g4py/tests/g4pytest/ezgeom/EzDetectorConstruction.hh +++ b/source/visualization/management/include/G4VisCommandsPlotter.hh @@ -23,30 +23,40 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // -// ==================================================================== -// EzDetectorConstruction.hh +// /vis/scene/plotter commands - Guy Barrand September 2021. // -// 2005 Q -// ==================================================================== -#ifndef EZ_DETECTOR_CONSTRUCTION_H -#define EZ_DETECTOR_CONSTRUCTION_H -#include "G4VUserDetectorConstruction.hh" +#ifndef G4VISCOMMANDSPLOTTER_HH +#define G4VISCOMMANDSPLOTTER_HH -// ==================================================================== -// -// class definition -// -// ==================================================================== - -class EzDetectorConstruction : public G4VUserDetectorConstruction { - -public: - EzDetectorConstruction(); - ~EzDetectorConstruction(); - - virtual G4VPhysicalVolume* Construct(); +#include "G4VVisCommand.hh" +#define G4VIS_COMMAND_PLOTTER_HEADER(a__cmd)\ +class G4VisCommandPlotter##a__cmd: public G4VVisCommand {\ +public:\ + G4VisCommandPlotter##a__cmd ();\ + virtual ~G4VisCommandPlotter##a__cmd ();\ + G4String GetCurrentValue (G4UIcommand*) {return "";}\ + void SetNewValue (G4UIcommand* command, G4String newValue);\ +private:\ + G4VisCommandPlotter##a__cmd (const G4VisCommandPlotter##a__cmd&);\ + G4VisCommandPlotter##a__cmd& operator = (const G4VisCommandPlotter##a__cmd&);\ +\ + G4UIcommand* fpCommand;\ }; +G4VIS_COMMAND_PLOTTER_HEADER(Create) +G4VIS_COMMAND_PLOTTER_HEADER(SetLayout) +G4VIS_COMMAND_PLOTTER_HEADER(AddStyle) +G4VIS_COMMAND_PLOTTER_HEADER(AddRegionStyle) +G4VIS_COMMAND_PLOTTER_HEADER(AddRegionParameter) +G4VIS_COMMAND_PLOTTER_HEADER(Clear) +G4VIS_COMMAND_PLOTTER_HEADER(ClearRegion) +G4VIS_COMMAND_PLOTTER_HEADER(List) + +G4VIS_COMMAND_PLOTTER_HEADER(AddRegionH1) +G4VIS_COMMAND_PLOTTER_HEADER(AddRegionH2) + +#undef G4VIS_COMMAND_PLOTTER_HEADER + #endif diff --git a/source/visualization/management/include/G4VisCommandsScene.hh b/source/visualization/management/include/G4VisCommandsScene.hh index b7befebc89..64fcf81331 100644 --- a/source/visualization/management/include/G4VisCommandsScene.hh +++ b/source/visualization/management/include/G4VisCommandsScene.hh @@ -125,6 +125,19 @@ private: G4UIcommand* fpCommand; }; +class G4VisCommandSceneRemoveModel: public G4VVisCommandScene { +public: + G4VisCommandSceneRemoveModel (); + virtual ~G4VisCommandSceneRemoveModel (); + G4String GetCurrentValue (G4UIcommand* command); + void SetNewValue (G4UIcommand* command, G4String newValue); +private: + G4VisCommandSceneRemoveModel (const G4VisCommandSceneRemoveModel&); + G4VisCommandSceneRemoveModel& operator = + (const G4VisCommandSceneRemoveModel&); + G4UIcommand* fpCommand; +}; + class G4VisCommandSceneSelect: public G4VVisCommandScene { public: G4VisCommandSceneSelect (); diff --git a/source/visualization/management/include/G4VisCommandsSceneAdd.hh b/source/visualization/management/include/G4VisCommandsSceneAdd.hh index e889fc5ad1..c84f1993cb 100644 --- a/source/visualization/management/include/G4VisCommandsSceneAdd.hh +++ b/source/visualization/management/include/G4VisCommandsSceneAdd.hh @@ -68,7 +68,7 @@ private: Arrow2D(G4double x1, G4double y1, G4double x2, G4double y2, G4double width, const G4Colour& colour); - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters* fpMp); + void operator()(G4VGraphicsScene&, const G4ModelingParameters* fpMp); G4Polyline fShaftPolyline; G4Polyline fHeadPolyline; G4double fWidth; @@ -105,7 +105,7 @@ private: const G4String& date): fpVisManager(vm), fSize(size), fX(x), fY(y), fLayout(layout), fDate(date) {} - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*); + void operator()(G4VGraphicsScene&, const G4ModelingParameters*); G4VisManager* fpVisManager; G4Timer fTimer; G4int fSize; @@ -143,7 +143,7 @@ private: G4double x, G4double y, G4Text::Layout layout): fForWhat(w), fpVisManager(vm), fSize(size), fX(x), fY(y), fLayout(layout) {} - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*); + void operator()(G4VGraphicsScene&, const G4ModelingParameters*); ForWhat fForWhat; G4VisManager* fpVisManager; G4int fSize; @@ -166,7 +166,7 @@ private: Extent(G4double xmin, G4double xmax, G4double ymin, G4double ymax, G4double zmin, G4double zmax); - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*); + void operator()(G4VGraphicsScene&, const G4ModelingParameters*); G4VisExtent fExtent; }; G4UIcommand* fpCommand; @@ -196,7 +196,7 @@ private: struct Frame { Frame(G4double size, G4double width, const G4Colour& colour): fSize(size), fWidth(width), fColour(colour) {} - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*); + void operator()(G4VGraphicsScene&, const G4ModelingParameters*); G4double fSize; G4double fWidth; G4Colour fColour; @@ -254,7 +254,7 @@ private: Line(G4double x1, G4double y1, G4double z1, G4double x2, G4double y2, G4double z2, G4double width, const G4Colour& colour); - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*); + void operator()(G4VGraphicsScene&, const G4ModelingParameters*); G4Polyline fPolyline; G4double fWidth; G4Colour fColour; @@ -275,7 +275,7 @@ private: Line2D(G4double x1, G4double y1, G4double x2, G4double y2, G4double width, const G4Colour& colour); - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*); + void operator()(G4VGraphicsScene&, const G4ModelingParameters*); G4Polyline fPolyline; G4double fWidth; G4Colour fColour; @@ -320,11 +320,10 @@ private: // Direction of outward-facing normal to front face of logo. enum Direction {X, minusX, Y, minusY, Z, minusZ}; struct G4Logo { - G4Logo(G4double height, const G4VisAttributes&); + G4Logo(G4double height, const G4VisAttributes&, const G4Transform3D&); ~G4Logo(); - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*); + void operator()(G4VGraphicsScene&, const G4ModelingParameters*); private: - G4VisAttributes fVisAtts; G4Polyhedron *fpG, *fp4; }; G4UIcommand* fpCommand; @@ -345,7 +344,7 @@ private: G4double x, G4double y, G4Text::Layout layout): fpVisManager(vm), fSize(size), fX(x), fY(y), fLayout(layout) {} - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*); + void operator()(G4VGraphicsScene&, const G4ModelingParameters*); G4VisManager* fpVisManager; G4int fSize; G4double fX, fY; @@ -387,6 +386,35 @@ public: private: G4VisCommandSceneAddScale (const G4VisCommandSceneAddScale&); G4VisCommandSceneAddScale& operator = (const G4VisCommandSceneAddScale&); + struct Scale { + enum Direction {x, y, z}; + Scale (const G4VisAttributes& visAttribs, + G4double length, const G4Transform3D&, + const G4String& annotation, G4double annotationSize, + const G4Colour& annotationColour + ); + // This creates a representation of annotated line in the specified + // direction with tick marks at the end. If autoPlacing is true it + // is required to be centred at the front, right, bottom corner of + // the world space, comfortably outside the existing bounding + // box/sphere so that existing objects do not obscure it. Otherwise + // it is required to be drawn with mid-point at (xmid, ymid, zmid). + // Annotation size is size of text labels in pixels. + // + // The auto placing algorithm might be: + // x = xmin + (1 + comfort) * (xmax - xmin) + // y = ymin - comfort * (ymax - ymin) + // z = zmin + (1 + comfort) * (zmax - zmin) + // if direction == x then (x - length,y,z) to (x,y,z) + // if direction == y then (x,y,z) to (x,y + length,z) + // if direction == z then (x,y,z - length) to (x,y,z) + ~Scale(); + void operator()(G4VGraphicsScene&,const G4ModelingParameters*); + private: + G4VisAttributes fVisAtts; + G4Polyline fScaleLine, fTick11, fTick12, fTick21, fTick22; + G4Text fText; + }; G4UIcommand* fpCommand; }; @@ -413,7 +441,7 @@ private: G4VisCommandSceneAddText2D& operator = (const G4VisCommandSceneAddText2D&); struct G4Text2D { G4Text2D(const G4Text&); - void operator()(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*); + void operator()(G4VGraphicsScene&, const G4ModelingParameters*); private: G4Text fText; }; @@ -460,4 +488,16 @@ private: G4UIcommand* fpCommand; }; +class G4VisCommandSceneAddPlotter: public G4VVisCommandScene { +public: + G4VisCommandSceneAddPlotter (); + virtual ~G4VisCommandSceneAddPlotter (); + G4String GetCurrentValue (G4UIcommand* command); + void SetNewValue (G4UIcommand* command, G4String newValue); +private: + G4VisCommandSceneAddPlotter (const G4VisCommandSceneAddPlotter&); + G4VisCommandSceneAddPlotter& operator = (const G4VisCommandSceneAddPlotter&); + G4UIcommand* fpCommand; +}; + #endif diff --git a/source/visualization/management/include/G4VisExecutive.icc b/source/visualization/management/include/G4VisExecutive.icc index bab6dcb4a9..3f00c9ba33 100644 --- a/source/visualization/management/include/G4VisExecutive.icc +++ b/source/visualization/management/include/G4VisExecutive.icc @@ -25,7 +25,7 @@ // // // -// +// // John Allison 24th January 1998. #ifndef G4VISEXECUTIVE_ICC @@ -36,23 +36,16 @@ // Not needing external packages or libraries... #include "G4ASCIITree.hh" #include "G4DAWNFILE.hh" -#include "G4HepRep.hh" #include "G4HepRepFile.hh" #include "G4RayTracer.hh" #include "G4HitFilterFactories.hh" #include "G4DigiFilterFactories.hh" #include "G4TrajectoryFilterFactories.hh" #include "G4TrajectoryModelFactories.hh" -#include "G4VRML1File.hh" #include "G4VRML2File.hh" #include "G4GMocrenFile.hh" // Needing external packages or libraries... - -#ifdef G4VIS_USE_DAWN -#include "G4FukuiRenderer.hh" -#endif - #ifdef G4VIS_USE_OPENGLX #include "G4OpenGLImmediateX.hh" #include "G4OpenGLStoredX.hh" @@ -90,11 +83,6 @@ #include "G4RayTracerX.hh" #endif -#ifdef G4VIS_USE_VRML -#include "G4VRML1.hh" -#include "G4VRML2.hh" -#endif - #ifdef G4VIS_USE_QT3D #include "G4Qt3D.hh" #endif @@ -115,6 +103,14 @@ #include "G4ToolsSGQtGLES.hh" #endif +#ifdef G4VIS_USE_VTK +#include "G4Vtk.hh" +#endif + +#ifdef G4VIS_USE_VTK_QT +#include "G4VtkQt.hh" +#endif + // The inline keyword prevents the compiler making an external // reference even though they cannot actually be inlined since they // are virtual functions. This prevents a "multiple definition" error @@ -135,32 +131,20 @@ G4VisExecutive::RegisterGraphicsSystems () { // Graphics Systems not needing external packages or libraries... RegisterGraphicsSystem (new G4ASCIITree); RegisterGraphicsSystem (new G4DAWNFILE); - RegisterGraphicsSystem (new G4HepRep); RegisterGraphicsSystem (new G4HepRepFile); RegisterGraphicsSystem (new G4RayTracer); - RegisterGraphicsSystem (new G4VRML1File); RegisterGraphicsSystem (new G4VRML2File); RegisterGraphicsSystem (new G4GMocrenFile); // Graphics systems needing external packages or libraries... - -#ifdef G4VIS_USE_DAWN - RegisterGraphicsSystem (new G4FukuiRenderer); -#endif - -#ifdef G4VIS_USE_VRML - RegisterGraphicsSystem (new G4VRML1); - RegisterGraphicsSystem (new G4VRML2); -#endif - // Register OGL family of drivers with their normal names, // super-abbreviated names and fallback names where approproiate. #ifdef G4VIS_USE_OPENGLQT G4VGraphicsSystem* ogliqt = new G4OpenGLImmediateQt; G4VGraphicsSystem* oglsqt = new G4OpenGLStoredQt; - RegisterGraphicsSystem (ogliqt); - RegisterGraphicsSystem (oglsqt); + RegisterGraphicsSystem(ogliqt); + RegisterGraphicsSystem(oglsqt); ogliqt->AddNickname("OGLI"); oglsqt->AddNickname("OGL"); oglsqt->AddNickname("OGLS"); @@ -169,107 +153,144 @@ G4VisExecutive::RegisterGraphicsSystems () { #ifdef G4VIS_USE_OPENGLXM G4VGraphicsSystem* oglixm = new G4OpenGLImmediateXm; G4VGraphicsSystem* oglsxm = new G4OpenGLStoredXm; - RegisterGraphicsSystem (oglixm); - RegisterGraphicsSystem (oglsxm); -#ifdef G4VIS_USE_OPENGLQT + RegisterGraphicsSystem(oglixm); + RegisterGraphicsSystem(oglsxm); +# ifdef G4VIS_USE_OPENGLQT oglixm->AddNickname("OGLIQt_FALLBACK"); oglsxm->AddNickname("OGLSQt_FALLBACK"); -#else +# else oglixm->AddNickname("OGLI"); oglsxm->AddNickname("OGL"); oglsxm->AddNickname("OGLS"); -#endif +# endif #endif #ifdef G4VIS_USE_OPENGLX G4VGraphicsSystem* oglix = new G4OpenGLImmediateX; G4VGraphicsSystem* oglsx = new G4OpenGLStoredX; - RegisterGraphicsSystem (oglix); - RegisterGraphicsSystem (oglsx); -#ifdef G4VIS_USE_OPENGLQT + RegisterGraphicsSystem(oglix); + RegisterGraphicsSystem(oglsx); +# ifdef G4VIS_USE_OPENGLQT oglix->AddNickname("OGLIQt_FALLBACK"); oglsx->AddNickname("OGLSQt_FALLBACK"); -#endif -#ifdef G4VIS_USE_OPENGLXM +# endif +# ifdef G4VIS_USE_OPENGLXM oglix->AddNickname("OGLIXm_FALLBACK"); oglsx->AddNickname("OGLSXm_FALLBACK"); -#endif -#if defined (G4VIS_USE_OPENGLQT) || (G4VIS_USE_OPENGLXM) -#else +# endif +# if defined(G4VIS_USE_OPENGLQT) || (G4VIS_USE_OPENGLXM) +# else oglix->AddNickname("OGLI"); oglsx->AddNickname("OGL"); oglsx->AddNickname("OGLS"); -#endif +# endif #endif #ifdef G4VIS_USE_OPENGLWIN32 G4VGraphicsSystem* ogliwin32 = new G4OpenGLImmediateWin32; G4VGraphicsSystem* oglswin32 = new G4OpenGLStoredWin32; - RegisterGraphicsSystem (ogliwin32); - RegisterGraphicsSystem (oglswin32); -#ifdef G4VIS_USE_OPENGLQT + RegisterGraphicsSystem(ogliwin32); + RegisterGraphicsSystem(oglswin32); +# ifdef G4VIS_USE_OPENGLQT ogliwin32->AddNickname("OGLIQt_FALLBACK"); oglswin32->AddNickname("OGLSQt_FALLBACK"); -#else +# else ogliwin32->AddNickname("OGLI"); oglswin32->AddNickname("OGL"); oglswin32->AddNickname("OGLS"); -#endif +# endif #endif // Register OI graphics system with super-abbreviated nickname #ifdef G4VIS_USE_OI - G4VGraphicsSystem* oi = 0; -#ifdef G4VIS_USE_OIX + G4VGraphicsSystem* oi = 0; +# ifdef G4VIS_USE_OIX oi = new G4OpenInventorX; -#elif defined(G4VIS_USE_OIQT) +# elif defined(G4VIS_USE_OIQT) oi = new G4OpenInventorQt; -#elif defined(G4VIS_USE_OIWIN32) +# elif defined(G4VIS_USE_OIWIN32) oi = new G4OpenInventorWin32; -#endif - if (oi) { - RegisterGraphicsSystem (oi); +# endif + if(oi) + { + RegisterGraphicsSystem(oi); oi->AddNickname("OI"); } #endif // The new, extended OI is registered separately for now. #ifdef G4VIS_USE_OIX - RegisterGraphicsSystem (new G4OpenInventorXtExtended); + RegisterGraphicsSystem(new G4OpenInventorXtExtended); #endif #ifdef G4VIS_USE_RAYTRACERX - RegisterGraphicsSystem (new G4RayTracerX); + RegisterGraphicsSystem(new G4RayTracerX); #endif #ifdef G4VIS_USE_QT3D - RegisterGraphicsSystem (new G4Qt3D); + RegisterGraphicsSystem(new G4Qt3D); #endif #ifdef G4VIS_USE_TOOLSSG_X11_GLES - RegisterGraphicsSystem (new G4ToolsSGX11GLES); + G4VGraphicsSystem* tsg_x11_gles = new G4ToolsSGX11GLES; + RegisterGraphicsSystem(tsg_x11_gles); #endif #ifdef G4VIS_USE_TOOLSSG_WINDOWS_GLES - RegisterGraphicsSystem (new G4ToolsSGWindowsGLES); + G4VGraphicsSystem* tsg_windows_gles = new G4ToolsSGWindowsGLES; + RegisterGraphicsSystem(tsg_windows_gles); #endif #ifdef G4VIS_USE_TOOLSSG_XT_GLES - RegisterGraphicsSystem (new G4ToolsSGXtGLES); + G4VGraphicsSystem* tsg_xt_gles = new G4ToolsSGXtGLES; + RegisterGraphicsSystem(tsg_xt_gles); #endif #ifdef G4VIS_USE_TOOLSSG_QT_GLES - RegisterGraphicsSystem (new G4ToolsSGQtGLES); + G4VGraphicsSystem* tsg_qt_gles = new G4ToolsSGQtGLES; + RegisterGraphicsSystem(tsg_qt_gles); #endif +#ifdef G4VIS_USE_TOOLSSG_QT_GLES + tsg_qt_gles->AddNickname("TSG"); +#elif defined(G4VIS_USE_TOOLSSG_XT_GLES) + tsg_xt_gles->AddNickname("TSG"); +#elif defined(G4VIS_USE_TOOLSSG_X11_GLES) + tsg_x11_gles->AddNickname("TSG"); +#elif defined(G4VIS_USE_TOOLSSG_WINDOWS_GLES) + tsg_windows_gles->AddNickname("TSG"); +#endif + +#ifdef G4VIS_USE_VTK + G4Vtk* vtkN = new G4Vtk(); + RegisterGraphicsSystem(vtkN); + vtkN->AddNickname("VTK_NATIVE"); +# ifdef G4VIS_USE_VTK_QT + // Comment out for now until we understand behaviour with a terminal session. + // vtkN->AddNickname("VtkQt_FALLBACK"); +# endif +#endif + +#ifdef G4VIS_USE_VTK_QT + G4VtkQt* vtkQt = new G4VtkQt(); + RegisterGraphicsSystem(vtkQt); +#endif + +#ifdef G4VIS_USE_VTK_QT + vtkQt->AddNickname("Vtk"); + vtkQt->AddNickname("VTK"); +#elif defined(G4VIS_USE_VTK) + vtkN->AddNickname("Vtk"); + vtkN->AddNickname("VTK"); +#endif } // See comments about inlining above. -inline void +inline void G4VisExecutive::RegisterModelFactories() { // Trajectory draw models - RegisterModelFactory(new G4TrajectoryGenericDrawerFactory()); + RegisterModelFactory(new G4TrajectoryGenericDrawerFactory()); RegisterModelFactory(new G4TrajectoryDrawByAttributeFactory()); RegisterModelFactory(new G4TrajectoryDrawByChargeFactory()); RegisterModelFactory(new G4TrajectoryDrawByOriginVolumeFactory()); diff --git a/source/visualization/management/include/G4VisFilterManager.hh b/source/visualization/management/include/G4VisFilterManager.hh index 838b0ff008..74d04833ef 100644 --- a/source/visualization/management/include/G4VisFilterManager.hh +++ b/source/visualization/management/include/G4VisFilterManager.hh @@ -166,8 +166,7 @@ G4VisFilterManager::SetMode(const G4String& mode) { bool result(false); - G4String myMode(mode); - myMode.toLower(); + G4String myMode = G4StrUtil::to_lower_copy(mode); if (myMode == "soft") {result = true; SetMode(FilterMode::Soft);} else if (myMode == "hard") {result = true; SetMode(FilterMode::Hard);} @@ -214,7 +213,7 @@ G4VisFilterManager::Print(std::ostream& ostr, const G4String& name) const typename std::vector::const_iterator iterFilter = fFilterList.begin(); while (iterFilter != fFilterList.end()) { - if (!name.isNull()) { + if (!name.empty()) { if ((*iterFilter)->Name() == name) (*iterFilter)->PrintAll(ostr); } else { diff --git a/source/visualization/management/include/G4VisListManager.hh b/source/visualization/management/include/G4VisListManager.hh index 7d25575935..ae052457f1 100644 --- a/source/visualization/management/include/G4VisListManager.hh +++ b/source/visualization/management/include/G4VisListManager.hh @@ -122,7 +122,7 @@ G4VisListManager::Print(std::ostream& ostr, const G4String& name) const ostr<<" Current: "<Name()<::const_iterator iter = fMap.find(name); diff --git a/source/visualization/management/include/G4VisManager.hh b/source/visualization/management/include/G4VisManager.hh index 8cc7bbeb8d..8fb384e7b9 100644 --- a/source/visualization/management/include/G4VisManager.hh +++ b/source/visualization/management/include/G4VisManager.hh @@ -239,9 +239,6 @@ public: // With description void Draw (const G4Polymarker&, const G4Transform3D& objectTransformation = G4Transform3D()); - void Draw (const G4Scale&, - const G4Transform3D& objectTransformation = G4Transform3D()); - void Draw (const G4Square&, const G4Transform3D& objectTransformation = G4Transform3D()); diff --git a/source/visualization/management/sources.cmake b/source/visualization/management/sources.cmake index 6d90bbff9b..f0c87c5bf3 100644 --- a/source/visualization/management/sources.cmake +++ b/source/visualization/management/sources.cmake @@ -28,6 +28,7 @@ geant4_add_module(G4vis_management G4VisCommandsSet.hh G4VisCommandsScene.hh G4VisCommandsSceneAdd.hh + G4VisCommandsPlotter.hh G4VisCommandsSceneHandler.hh G4VisCommandsTouchable.hh G4VisCommandsTouchableSet.hh @@ -42,6 +43,7 @@ geant4_add_module(G4vis_management G4VisManager.icc G4VisModelManager.hh G4VisStateDependent.hh + G4PlotterManager.hh SOURCES G4GraphicsSystemList.cc G4Scene.cc @@ -61,6 +63,7 @@ geant4_add_module(G4vis_management G4VisCommandsSet.cc G4VisCommandsScene.cc G4VisCommandsSceneAdd.cc + G4VisCommandsPlotter.cc G4VisCommandsSceneHandler.cc G4VisCommandsTouchable.cc G4VisCommandsTouchableSet.cc @@ -68,7 +71,8 @@ geant4_add_module(G4vis_management G4VisCommandsViewerDefault.cc G4VisCommandsViewerSet.cc G4VisManager.cc - G4VisStateDependent.cc) + G4VisStateDependent.cc + G4PlotterManager.cc) geant4_module_link_libraries(G4vis_management PUBLIC @@ -78,6 +82,7 @@ geant4_module_link_libraries(G4vis_management G4globman G4intercoms G4hits + G4tools PRIVATE G4csg G4detutils diff --git a/source/visualization/management/src/G4PlotterManager.cc b/source/visualization/management/src/G4PlotterManager.cc new file mode 100644 index 0000000000..f103edd4d9 --- /dev/null +++ b/source/visualization/management/src/G4PlotterManager.cc @@ -0,0 +1,144 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// Guy Barrand 12 October 2021 +// + +#include "G4PlotterManager.hh" +#include "G4ios.hh" + +#include +#include + +#include //it uses expat. + +G4PlotterManager& G4PlotterManager::GetInstance () { + static G4PlotterManager s_instance; + return s_instance; +} + +G4PlotterManager::G4PlotterManager():fMessenger(0) { + fMessenger = new Messenger(*this); +} + +G4PlotterManager::~G4PlotterManager() { + delete fMessenger; +} + +G4Plotter& G4PlotterManager::GetPlotter(const G4String& a_name) { + tools_vforit(NamedPlotter,fPlotters,it) { + if((*it).first==a_name) { + return (*it).second; + } + } + fPlotters.push_back(NamedPlotter(a_name,G4Plotter())); + return fPlotters.back().second; +} + +void G4PlotterManager::List() const { + tools_vforcit(NamedPlotter,fPlotters,it) { + G4cout << (*it).first << G4endl; + } +} + +////////////////////////////////////////////////////////////////// +/// styles: ////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////// + +void G4PlotterManager::ListStyles() const { + tools_vforcit(NamedStyle,fStyles,it) { + G4cout << (*it).first << G4endl; + } +} + +G4PlotterManager::Style* G4PlotterManager::FindStyle(const G4String& a_name) { + tools_vforit(NamedStyle,fStyles,it){ + if((*it).first==a_name) return &((*it).second); + } + return 0; +} + +void G4PlotterManager::SelectStyle(const G4String& a_name) { + if(!FindStyle(a_name)) { + fStyles.push_back(NamedStyle(a_name,Style())); + } + fCurrentStyle = a_name; +} + +void G4PlotterManager::RemoveStyle(const G4String& a_name) { + tools_vforit(NamedStyle,fStyles,it) { + if((*it).first==a_name) { + fStyles.erase(it); + if(fCurrentStyle==a_name) fCurrentStyle.clear(); + return; + } + } +} + +void G4PlotterManager::PrintStyle(const G4String& a_name) const { + tools_vforcit(NamedStyle,fStyles,it) { + if((*it).first==a_name) { + G4cout << (*it).first << ":" << G4endl; + tools_vforcit(StyleItem,(*it).second,its) { + G4cout << " " << (*its).first << " " << (*its).second << G4endl; + } + } + } +} + +void G4PlotterManager::AddStyleParameter(const G4String& a_parameter,const G4String& a_value) { + Style* _style = FindStyle(fCurrentStyle); + if(!_style) { + G4cout << "G4PlotterManager::AddStyleParameter: style " << fCurrentStyle << " not found." << G4endl; + return; + } + tools_vforit(StyleItem,(*_style),it) { + if((*it).first==a_parameter) { + (*it).second = a_value; + return; + } + } + _style->push_back(StyleItem(a_parameter,a_value)); +} + +void G4PlotterManager::Messenger::SetNewValue(G4UIcommand* a_cmd,G4String a_value) { + std::vector args; + tools::double_quotes_tokenize(a_value,args); + if(args.size()!=a_cmd->GetParameterEntries()) return; + if(a_cmd==select_style) { + fPlotterManager.SelectStyle(args[0]); + } else if(a_cmd==add_style_parameter) { + fPlotterManager.AddStyleParameter(args[0],args[1]); + } else if(a_cmd==remove_style) { + fPlotterManager.RemoveStyle(args[0]); + } else if(a_cmd==list_styles) { + G4cout << "default (embedded)." << G4endl; + G4cout << "ROOT_default (embedded)." << G4endl; + G4cout << "hippodraw (embedded)." << G4endl; + fPlotterManager.ListStyles(); + } else if(a_cmd==print_style) { + fPlotterManager.PrintStyle(args[0]); + } +} diff --git a/source/visualization/management/src/G4Scene.cc b/source/visualization/management/src/G4Scene.cc index 6cc2de88d9..6d56ac2966 100644 --- a/source/visualization/management/src/G4Scene.cc +++ b/source/visualization/management/src/G4Scene.cc @@ -47,53 +47,6 @@ G4Scene::G4Scene (const G4String& name): G4Scene::~G4Scene () {} -G4bool G4Scene::AddRunDurationModel (G4VModel* pModel, G4bool warn) -{ - std::vector::const_iterator i; - for (i = fRunDurationModelList.begin (); - i != fRunDurationModelList.end (); ++i) { - if (pModel -> GetGlobalDescription () == - i->fpModel->GetGlobalDescription ()) break; - } - if (i != fRunDurationModelList.end ()) { - if (warn) { - G4cout << "G4Scene::AddRunDurationModel: model \"" - << pModel -> GetGlobalDescription () - << "\"\n is already in the run-duration list of scene \"" - << fName - << "\"." - << G4endl; - } - return false; - } - - for (i = fRunDurationModelList.begin (); - i != fRunDurationModelList.end (); ++i) { - if (pModel -> GetGlobalTag () == - i->fpModel->GetGlobalTag ()) break; - } - if (i != fRunDurationModelList.end ()) { - if (warn) { - G4cout - << "G4Scene::AddRunDurationModel: The tag \"" - << pModel->GetGlobalTag() - << "\"\n duplicates one already in scene \"" - << fName - << - "\".\n This may be intended but if not, you may inspect the scene with" - "\n \"/vis/scene/list\" and deactivate unwanted models with" - "\n \"/vis/scene/activateModel\". Or create a new scene." - << G4endl; - } - } - - fRunDurationModelList.push_back (Model(pModel)); - - CalculateExtent (); - - return true; -} - namespace { void PrintInvalidModel(const G4VModel* model) { @@ -113,8 +66,8 @@ void G4Scene::CalculateExtent () for (size_t i = 0; i < fRunDurationModelList.size(); i++) { if (fRunDurationModelList[i].fActive) { G4VModel* model = fRunDurationModelList[i].fpModel; - if (model -> Validate()) { // Validates and also recomputes extent. - const G4VisExtent& thisExtent = model -> GetTransformedExtent (); + if (model -> Validate()) { + const G4VisExtent& thisExtent = model -> GetExtent (); if (thisExtent != G4VisExtent::GetNullExtent()) { boundingExtentScene.AccrueBoundingExtent(thisExtent); } @@ -127,8 +80,8 @@ void G4Scene::CalculateExtent () for (size_t i = 0; i < fEndOfEventModelList.size(); i++) { if (fEndOfEventModelList[i].fActive) { G4VModel* model = fEndOfEventModelList[i].fpModel; - if (model -> Validate()) { // Validates and also recomputes extent. - const G4VisExtent& thisExtent = model -> GetTransformedExtent (); + if (model -> Validate()) { + const G4VisExtent& thisExtent = model -> GetExtent (); if (thisExtent != G4VisExtent::GetNullExtent()) { boundingExtentScene.AccrueBoundingExtent(thisExtent); } @@ -141,8 +94,8 @@ void G4Scene::CalculateExtent () for (size_t i = 0; i < fEndOfRunModelList.size(); i++) { if (fEndOfRunModelList[i].fActive) { G4VModel* model = fEndOfRunModelList[i].fpModel; - if (model -> Validate()) { // Validates and also recomputes extent. - const G4VisExtent& thisExtent = model -> GetTransformedExtent (); + if (model -> Validate()) { + const G4VisExtent& thisExtent = model -> GetExtent (); if (thisExtent != G4VisExtent::GetNullExtent()) { boundingExtentScene.AccrueBoundingExtent(thisExtent); } @@ -202,6 +155,30 @@ G4bool G4Scene::AddWorldIfEmpty (G4bool warn) { return successful; } +G4bool G4Scene::AddRunDurationModel (G4VModel* pModel, G4bool warn) +{ + std::vector::const_iterator i; + for (i = fRunDurationModelList.begin (); + i != fRunDurationModelList.end (); ++i) { + if (pModel -> GetGlobalDescription () == + i->fpModel->GetGlobalDescription ()) break; + } + if (i != fRunDurationModelList.end ()) { + if (warn) { + G4cout << "G4Scene::AddRunDurationModel: model \"" + << pModel -> GetGlobalDescription () + << "\"\n is already in the run-duration list of scene \"" + << fName + << "\"." + << G4endl; + } + return false; + } + fRunDurationModelList.push_back (Model(pModel)); + CalculateExtent (); + return true; +} + G4bool G4Scene::AddEndOfEventModel (G4VModel* pModel, G4bool warn) { G4int i, nModels = fEndOfEventModelList.size (); for (i = 0; i < nModels; i++) { diff --git a/source/visualization/management/src/G4VSceneHandler.cc b/source/visualization/management/src/G4VSceneHandler.cc index 080263b302..d8208ee305 100644 --- a/source/visualization/management/src/G4VSceneHandler.cc +++ b/source/visualization/management/src/G4VSceneHandler.cc @@ -43,7 +43,6 @@ #include "G4VPhysicalVolume.hh" #include "G4Material.hh" #include "G4Polyline.hh" -#include "G4Scale.hh" #include "G4Text.hh" #include "G4Circle.hh" #include "G4Square.hh" @@ -456,110 +455,6 @@ void G4VSceneHandler::AddViewerToList (G4VViewer* pViewer) { fViewerList.push_back (pViewer); } -void G4VSceneHandler::AddPrimitive (const G4Scale& scale) { - - const G4double margin(0.01); - // Fractional margin - ensures scale is comfortably inside viewing - // volume. - const G4double oneMinusMargin (1. - margin); - - const G4VisExtent& sceneExtent = fpScene->GetExtent(); - - // Useful constants... - const G4double length(scale.GetLength()); - const G4double halfLength(length / 2.); - const G4double tickLength(length / 20.); - const G4double piBy2(halfpi); - - // Get size of scene... - const G4double xmin = sceneExtent.GetXmin(); - const G4double xmax = sceneExtent.GetXmax(); - const G4double ymin = sceneExtent.GetYmin(); - const G4double ymax = sceneExtent.GetYmax(); - const G4double zmin = sceneExtent.GetZmin(); - const G4double zmax = sceneExtent.GetZmax(); - - // Create (empty) polylines having the same vis attributes... - G4Polyline scaleLine, tick11, tick12, tick21, tick22; - G4VisAttributes visAtts(*scale.GetVisAttributes()); // Long enough life. - scaleLine.SetVisAttributes(&visAtts); - tick11.SetVisAttributes(&visAtts); - tick12.SetVisAttributes(&visAtts); - tick21.SetVisAttributes(&visAtts); - tick22.SetVisAttributes(&visAtts); - - // Add points to the polylines to represent an scale parallel to the - // x-axis centred on the origin... - G4Point3D r1(G4Point3D(-halfLength, 0., 0.)); - G4Point3D r2(G4Point3D( halfLength, 0., 0.)); - scaleLine.push_back(r1); - scaleLine.push_back(r2); - G4Point3D ticky(0., tickLength, 0.); - G4Point3D tickz(0., 0., tickLength); - tick11.push_back(r1 + ticky); - tick11.push_back(r1 - ticky); - tick12.push_back(r1 + tickz); - tick12.push_back(r1 - tickz); - tick21.push_back(r2 + ticky); - tick21.push_back(r2 - ticky); - tick22.push_back(r2 + tickz); - tick22.push_back(r2 - tickz); - G4Point3D textPosition(0., tickLength, 0.); - - // Transform appropriately... - - G4Transform3D transformation; - if (scale.GetAutoPlacing()) { - G4Transform3D rotation; - switch (scale.GetDirection()) { - case G4Scale::x: - break; - case G4Scale::y: - rotation = G4RotateZ3D(piBy2); - break; - case G4Scale::z: - rotation = G4RotateY3D(piBy2); - break; - } - G4double sxmid; - G4double symid; - G4double szmid; - sxmid = xmin + oneMinusMargin * (xmax - xmin); - symid = ymin + margin * (ymax - ymin); - szmid = zmin + oneMinusMargin * (zmax - zmin); - switch (scale.GetDirection()) { - case G4Scale::x: - sxmid -= halfLength; - break; - case G4Scale::y: - symid += halfLength; - break; - case G4Scale::z: - szmid -= halfLength; - break; - } - G4Translate3D translation(sxmid, symid, szmid); - transformation = translation * rotation; - } else { - if (fpModel) transformation = fpModel->GetTransformation(); - } - - // Draw... - // We would like to call BeginPrimitives(transformation) here but - // calling BeginPrimitives from within an AddPrimitive is not - // allowed! So we have to do our own transformation... - AddPrimitive(scaleLine.transform(transformation)); - AddPrimitive(tick11.transform(transformation)); - AddPrimitive(tick12.transform(transformation)); - AddPrimitive(tick21.transform(transformation)); - AddPrimitive(tick22.transform(transformation)); - G4Text text(scale.GetAnnotation(),textPosition.transform(transformation)); - G4VisAttributes va(G4VVisCommand::GetCurrentTextColour()); - text.SetVisAttributes(va); - text.SetScreenSize(scale.GetAnnotationSize()); - AddPrimitive(text); -} - void G4VSceneHandler::AddPrimitive (const G4Polymarker& polymarker) { switch (polymarker.GetMarkerType()) { default: @@ -596,7 +491,17 @@ void G4VSceneHandler::AddPrimitive (const G4Polymarker& polymarker) { } void G4VSceneHandler::RemoveViewerFromList (G4VViewer* pViewer) { - fViewerList.remove(pViewer); + fViewerList.remove(pViewer); // Does nothing if already removed + // And reset current viewer + auto visManager = G4VisManager::GetInstance(); + visManager->SetCurrentViewer(nullptr); +} + + +void G4VSceneHandler::AddPrimitive (const G4Plotter&) { + G4cerr << "WARNING: Plotter not implemented for " << fSystem.GetName() << G4endl; + G4cerr << " Open a plotter-aware graphics system or remove plotter with" << G4endl; + G4cerr << " /vis/scene/removeModel Plotter" << G4endl; } void G4VSceneHandler::SetScene (G4Scene* pScene) { @@ -657,7 +562,8 @@ void G4VSceneHandler::RequestPrimitives (const G4VSolid& solid) G4cerr << G4endl; } } - } // fallthrough + } + [[fallthrough]]; case G4ViewParameters::cloud: { @@ -684,6 +590,25 @@ void G4VSceneHandler::RequestPrimitives (const G4VSolid& solid) } } +//namespace { +// void DrawExtent(const G4VModel* pModel) +// { +// // Show extent boxes - debug only, OGLSX only (OGLSQt problem?) +// if (pModel->GetExtent() != G4VisExtent::GetNullExtent()) { +// const auto& extent = pModel->GetExtent(); +// const auto& centre = extent.GetExtentCenter(); +// const auto& position = G4Translate3D(centre); +// const auto& dx = (extent.GetXmax()-extent.GetXmin())/2.; +// const auto& dy = (extent.GetYmax()-extent.GetYmin())/2.; +// const auto& dz = (extent.GetZmax()-extent.GetZmin())/2.; +// auto visAtts = G4VisAttributes(); +// visAtts.SetForceWireframe(); +// G4Box extentBox("Extent",dx,dy,dz); +// G4VisManager::GetInstance()->Draw(extentBox,visAtts,position); +// } +// } +//} + void G4VSceneHandler::ProcessScene() { // Assumes graphics database store has already been cleared if @@ -735,19 +660,11 @@ void G4VSceneHandler::ProcessScene() if(runDurationModelList[i].fActive) { fpModel = runDurationModelList[i].fpModel; - // Note: this is not the place to apply the transformation - // pModel->GetTransformation(). The model must take care of - // the required transformation itself - thus the models components - // have already been transformed. The model could receive the - // transformation in its constructor, e.g., G4PhysicalVolumeModel, or - // handle it in the model's SetTransformation, e.g., in G4AxesModel - // (relatively simple) or in G4ArrowModel (quite complicated) - see - // G4VModel.hh. This avoids having to transform the components perhaps - // multiple times. The reasons for this are mainly to do with how we - // implement G4PhysicalVolumeModel. - // See also /vis/scene/add/logo. fpModel->SetModelingParameters(pMP); fpModel->DescribeYourselfTo(*this); + // To see the extents of each model represented as wireframe boxes, + // uncomment the next line and DrawExtent in namespace above + // DrawExtent(fpModel); fpModel->SetModelingParameters(0); } } @@ -1074,15 +991,24 @@ void G4VSceneHandler::LoadAtts(const G4Visible& visible, G4AttHolder* holder) } } -const G4Colour& G4VSceneHandler::GetTextColour (const G4Text& text) { - const G4VisAttributes* pVA = text.GetVisAttributes (); - if (!pVA) { - return G4VVisCommand::GetCurrentTextColour(); - } - const G4Colour& colour = pVA -> GetColour (); +const G4Colour& G4VSceneHandler::GetColour () { + fpVisAttribs = fpViewer->GetApplicableVisAttributes(fpVisAttribs); + const G4Colour& colour = fpVisAttribs -> GetColour (); return colour; } +const G4Colour& G4VSceneHandler::GetColour (const G4Visible& visible) { + auto pVA = visible.GetVisAttributes(); + if (!pVA) pVA = fpViewer->GetViewParameters().GetDefaultVisAttributes(); + return pVA->GetColour(); +} + +const G4Colour& G4VSceneHandler::GetTextColour (const G4Text& text) { + auto pVA = text.GetVisAttributes(); + if (!pVA) pVA = fpViewer->GetViewParameters().GetDefaultTextVisAttributes(); + return pVA->GetColour(); +} + G4double G4VSceneHandler::GetLineWidth(const G4VisAttributes* pVisAttribs) { G4double lineWidth = pVisAttribs->GetLineWidth(); diff --git a/source/visualization/management/src/G4VViewer.cc b/source/visualization/management/src/G4VViewer.cc index d7704aea60..164fb61eaf 100644 --- a/source/visualization/management/src/G4VViewer.cc +++ b/source/visualization/management/src/G4VViewer.cc @@ -38,6 +38,7 @@ #include "G4VGraphicsSystem.hh" #include "G4VSceneHandler.hh" #include "G4Scene.hh" +#include "G4PhysicalVolumeStore.hh" #include "G4VPhysicalVolume.hh" #include "G4Transform3D.hh" #include "G4UImanager.hh" @@ -57,8 +58,8 @@ fNeedKernelVisit (true) else { fName = name; } - fShortName = fName (0, fName.find (' ')); - fShortName.strip (); + fShortName = fName.substr(0, fName.find (' ')); + G4StrUtil::strip(fShortName); fVP = G4VisManager::GetInstance()->GetDefaultViewParameters(); fDefaultVP = fVP; @@ -70,8 +71,8 @@ G4VViewer::~G4VViewer () { void G4VViewer::SetName (const G4String& name) { fName = name; - fShortName = fName (0, fName.find (' ')); - fShortName.strip (); + fShortName = fName.substr(0, fName.find (' ')); + G4StrUtil::strip(fShortName); } void G4VViewer::NeedKernelVisit () { @@ -125,10 +126,19 @@ void G4VViewer::SetTouchable { // Set the touchable for /vis/touchable/set/... commands. std::ostringstream oss; + const auto& pvStore = G4PhysicalVolumeStore::GetInstance(); for (const auto& pvNodeId: fullPath) { - oss - << ' ' << pvNodeId.GetPhysicalVolume()->GetName() - << ' ' << pvNodeId.GetCopyNo(); + const auto& pv = pvNodeId.GetPhysicalVolume(); + auto iterator = find(pvStore->begin(),pvStore->end(),pv); + if (iterator == pvStore->end()) { + G4ExceptionDescription ed; + ed << "Volume no longer in physical volume store."; + G4Exception("G4VViewer::SetTouchable", "visman0501", JustWarning, ed); + } else { + oss + << ' ' << pvNodeId.GetPhysicalVolume()->GetName() + << ' ' << pvNodeId.GetCopyNo(); + } } G4UImanager::GetUIpointer()->ApplyCommand("/vis/set/touchable" + oss.str()); } diff --git a/source/visualization/management/src/G4VVisCommand.cc b/source/visualization/management/src/G4VVisCommand.cc index 9dc5662bb4..5ddda97e90 100644 --- a/source/visualization/management/src/G4VVisCommand.cc +++ b/source/visualization/management/src/G4VVisCommand.cc @@ -48,12 +48,29 @@ G4double G4VVisCommand::fCurrentLineWidth = 1.; // pixels G4PhysicalVolumeModel::TouchableProperties G4VVisCommand::fCurrentTouchableProperties; G4VisExtent G4VVisCommand::fCurrentExtentForField; std::vector G4VVisCommand::fCurrrentPVFindingsForField; +G4bool G4VVisCommand::fThereWasAViewer = false; +G4ViewParameters G4VVisCommand::fVPExistingViewer; G4VVisCommand::G4VVisCommand () {} G4VVisCommand::~G4VVisCommand () {} -G4VisManager* G4VVisCommand::fpVisManager = 0; +G4VisManager* G4VVisCommand::fpVisManager = nullptr; + +G4VisManager* G4VVisCommand::GetVisManager () +{ + return fpVisManager; +} + +void G4VVisCommand::SetVisManager (G4VisManager* pVisManager) +{ + fpVisManager = pVisManager; +} + +const G4Colour& G4VVisCommand::GetCurrentTextColour() +{ + return fCurrentTextColour; +} G4String G4VVisCommand::ConvertToString (G4double x, G4double y, const char * unitName) @@ -284,10 +301,9 @@ void G4VVisCommand::InterpolateViews currentViewer->SetViewParameters(*vp); currentViewer->RefreshView(); if (exportString == "export" && - currentViewer->GetName().contains("OpenGL")) { + G4StrUtil::contains(currentViewer->GetName(), "OpenGL")) { G4UImanager::GetUIpointer()->ApplyCommand("/vis/ogl/export"); } - // File-writing viewers need to close the file currentViewer->ShowView(); if (waitTimePerPointmilliseconds > 0) std::this_thread::sleep_for(std::chrono::milliseconds(waitTimePerPointmilliseconds)); @@ -354,3 +370,29 @@ void G4VVisCommand::DrawExtent(const G4VisExtent& extent) } } } + +void G4VVisCommand::CopyMostViewParameters +(G4ViewParameters& target, const G4ViewParameters& from) +{ + // Copy view parameters except for autoRefresh and background... + auto targetAutoRefresh = target.IsAutoRefresh(); + auto targetBackground = target.GetBackgroundColour(); + target = from; + target.SetAutoRefresh(targetAutoRefresh); + target.SetBackgroundColour(targetBackground); +} + +void G4VVisCommand::CopyCameraParameters +(G4ViewParameters& target, const G4ViewParameters& from) +{ + // Copy view parameters pertaining only to camera + target.SetViewpointDirection (from.GetViewpointDirection()); + target.SetLightpointDirection (from.GetLightpointDirection()); + target.SetLightsMoveWithCamera(from.GetLightsMoveWithCamera()); + target.SetUpVector (from.GetUpVector()); + target.SetFieldHalfAngle (from.GetFieldHalfAngle()); + target.SetZoomFactor (from.GetZoomFactor()); + target.SetScaleFactor (from.GetScaleFactor()); + target.SetCurrentTargetPoint (from.GetCurrentTargetPoint()); + target.SetDolly (from.GetDolly()); +} diff --git a/source/visualization/management/src/G4ViewParameters.cc b/source/visualization/management/src/G4ViewParameters.cc index e06c7a55ac..bd3568049c 100644 --- a/source/visualization/management/src/G4ViewParameters.cc +++ b/source/visualization/management/src/G4ViewParameters.cc @@ -100,7 +100,8 @@ G4ViewParameters::G4ViewParameters (): fDisplayLightFrontT(0.), fDisplayLightFrontRed(0.), fDisplayLightFrontGreen(1.), - fDisplayLightFrontBlue(0.) + fDisplayLightFrontBlue(0.), + fSpecialMeshRendering(false) { // Pick up default no of sides from G4Polyhedron. // Note that this parameter is variously called: @@ -451,6 +452,18 @@ G4String G4ViewParameters::DrawingStyleCommands() const oss << "\n/vis/viewer/set/numberOfCloudPoints " << fNumberOfCloudPoints; + oss << "\n/vis/viewer/set/specialMeshRendering "; + if (fSpecialMeshRendering) { + oss << "true"; + } else { + oss << "false"; + } + + oss << "\n/vis/viewer/set/specialMeshVolumes"; + for (const auto& volume : fSpecialMeshVolumes) { + oss << ' ' << volume.GetName() << ' ' << volume.GetCopyNo(); + } + oss << std::endl; return oss.str(); diff --git a/source/visualization/management/src/G4VisCommands.cc b/source/visualization/management/src/G4VisCommands.cc index 5f44a995c5..bb6e1bf222 100644 --- a/source/visualization/management/src/G4VisCommands.cc +++ b/source/visualization/management/src/G4VisCommands.cc @@ -254,7 +254,7 @@ G4VisCommandReviewKeptEvents::G4VisCommandReviewKeptEvents () "\nevent." "\nUseful commands might be:" "\n \"/vis/viewer/...\" to change the view (zoom, set/viewpoint,...)." - "\n \"/vis/oglx/printEPS\" to get hard copy." + "\n \"/vis/ogl/export\" to get hard copy." "\n \"/vis/open\" to get alternative viewer." "\n \"/vis/abortReviewKeptEvents\", then \"cont[inue]\", to abort."); fpCommand -> SetParameterName("macro-file-name", omitable=true); @@ -352,7 +352,7 @@ void G4VisCommandReviewKeptEvents::SetNewValue (G4UIcommand*, G4String newValue) " Useful commands might be:" "\n \"/vis/scene/add/trajectories\" if not already added." "\n \"/vis/viewer/...\" to change the view (zoom, set/viewpoint,...)." - "\n \"/vis/oglx/printEPS\" to get hard copy." + "\n \"/vis/ogl/export\" to get hard copy." "\n \"/vis/open\" to get alternative viewer." "\n \"/vis/abortReviewKeptEvents\", then \"cont[inue]\", to abort." << G4endl; diff --git a/source/visualization/management/src/G4VisCommandsCompound.cc b/source/visualization/management/src/G4VisCommandsCompound.cc index 21d27380be..b758a441be 100644 --- a/source/visualization/management/src/G4VisCommandsCompound.cc +++ b/source/visualization/management/src/G4VisCommandsCompound.cc @@ -76,7 +76,7 @@ void G4VisCommandDrawTree::SetNewValue(G4UIcommand*, G4String newValue) { // built-in. The HepRApp offline browser also has a tree browser // built in. - if (!system.contains("Tree")) { + if (!G4StrUtil::contains(system, "Tree")) { system = "ATree"; } @@ -85,6 +85,7 @@ void G4VisCommandDrawTree::SetNewValue(G4UIcommand*, G4String newValue) { G4VSceneHandler* keepSceneHandler = fpVisManager->GetCurrentSceneHandler(); G4VViewer* keepViewer = fpVisManager->GetCurrentViewer(); G4VisManager::Verbosity keepVisVerbosity = fpVisManager->GetVerbosity(); + G4bool keepAbleness = fpVisManager->GetConcreteInstance()? true: false; G4UImanager* UImanager = G4UImanager::GetUIpointer(); G4int keepUIVerbose = UImanager->GetVerboseLevel(); @@ -94,8 +95,6 @@ void G4VisCommandDrawTree::SetNewValue(G4UIcommand*, G4String newValue) { newVerbose = 2; UImanager->SetVerboseLevel(newVerbose); - G4bool keepAbleness = fpVisManager->GetConcreteInstance()? true: false; - auto errorCode = UImanager->ApplyCommand(G4String("/vis/open " + system)); if (errorCode == 0) { if (!keepAbleness) { // Enable temporarily @@ -103,6 +102,7 @@ void G4VisCommandDrawTree::SetNewValue(G4UIcommand*, G4String newValue) { UImanager->ApplyCommand("/vis/enable"); fpVisManager->SetVerboseLevel(keepVisVerbosity); } + UImanager->ApplyCommand("/vis/viewer/reset"); UImanager->ApplyCommand(G4String("/vis/drawVolume " + pvname)); UImanager->ApplyCommand("/vis/viewer/flush"); if (!keepAbleness) { // Disable again @@ -360,7 +360,8 @@ G4VisCommandOpen::~G4VisCommandOpen() { delete fpCommand; } -void G4VisCommandOpen::SetNewValue (G4UIcommand* command, G4String newValue) { +void G4VisCommandOpen::SetNewValue (G4UIcommand* command, G4String newValue) +{ G4String systemName, windowSizeHint; std::istringstream is(newValue); is >> systemName >> windowSizeHint; @@ -371,21 +372,42 @@ void G4VisCommandOpen::SetNewValue (G4UIcommand* command, G4String newValue) { fpVisManager->GetVerbosity() >= G4VisManager::confirmations) newVerbose = 2; UImanager->SetVerboseLevel(newVerbose); + auto errorCode = UImanager->ApplyCommand(G4String("/vis/sceneHandler/create " + systemName)); - if (errorCode != 0) { + if (errorCode) { G4ExceptionDescription ed; ed << "sub-command \"/vis/sceneHandler/create\" failed."; command->CommandFailed(errorCode,ed); - goto restore; + goto finish; } errorCode = UImanager->ApplyCommand(G4String("/vis/viewer/create ! ! " + windowSizeHint)); - if (errorCode != 0) { + if (errorCode) { G4ExceptionDescription ed; ed << "sub-command \"/vis/viewer/create\" failed."; command->CommandFailed(errorCode,ed); - goto restore; + goto finish; } -restore: UImanager->SetVerboseLevel(keepVerbose); + +finish: + if (errorCode) { + std::set candidates; + for (const auto gs: fpVisManager -> GetAvailableGraphicsSystems()) { + // Just list nicknames, but exclude FALLBACK nicknames + for (const auto& nickname: gs->GetNicknames()) { + if (!G4StrUtil::contains(nickname, "FALLBACK")) { + candidates.insert(nickname); + } + } + } + G4ExceptionDescription ed; + ed << "Invoked command has failed - see above. Available graphics systems are (short names):\n "; + for (const auto& candidate: candidates) { + ed << ' ' << candidate; + }; + command->CommandFailed(errorCode,ed); + } + + UImanager->SetVerboseLevel(keepVerbose); } ////////////// /vis/specify /////////////////////////////////////// diff --git a/source/visualization/management/src/G4VisCommandsGeometrySet.cc b/source/visualization/management/src/G4VisCommandsGeometrySet.cc index ababa33516..556174ea1a 100644 --- a/source/visualization/management/src/G4VisCommandsGeometrySet.cc +++ b/source/visualization/management/src/G4VisCommandsGeometrySet.cc @@ -59,6 +59,17 @@ void G4VVisCommandGeometrySet::Set } return; } + // Recalculate extent of any physical volume model in run duration lists + for (const auto& scene : fpVisManager->GetSceneList()) { + const auto& runDurationModelList = scene->GetRunDurationModelList(); + for (const auto& sceneModel : runDurationModelList) { + auto model = sceneModel.fpModel; + auto pvModel = dynamic_cast(model); + if (pvModel) pvModel->CalculateExtent(); + } + // And re-calculate the scene's extent + scene->CalculateExtent(); + } if (fpVisManager->GetCurrentViewer()) { G4UImanager::GetUIpointer()->ApplyCommand("/vis/scene/notifyHandlers"); } diff --git a/source/visualization/management/src/G4VisCommandsPlotter.cc b/source/visualization/management/src/G4VisCommandsPlotter.cc new file mode 100644 index 0000000000..8be4819a22 --- /dev/null +++ b/source/visualization/management/src/G4VisCommandsPlotter.cc @@ -0,0 +1,398 @@ +// +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** +// +// +// /vis/plotter commands - Guy Barrand October 2021. + +#include "G4VisCommandsPlotter.hh" + +#include "G4PlotterManager.hh" + +#include + +#include + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/create ////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterCreate::G4VisCommandPlotterCreate () { + fpCommand = new G4UIcommand("/vis/plotter/create", this); + fpCommand->SetGuidance("Create a named G4Plotter."); + + G4UIparameter* parameter; + parameter = new G4UIparameter("name",'s',false); + fpCommand->SetParameter (parameter); +} + +G4VisCommandPlotterCreate::~G4VisCommandPlotterCreate () {delete fpCommand;} + +void G4VisCommandPlotterCreate::SetNewValue (G4UIcommand*, G4String newValue) +{ + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(newValue); + _plotter.Reset(); + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if(pScene) CheckSceneAndNotifyHandlers (pScene); +} + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/setLayout /////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterSetLayout::G4VisCommandPlotterSetLayout () { + fpCommand = new G4UIcommand("/vis/plotter/setLayout", this); + fpCommand->SetGuidance("Set plotter grid layout."); + + G4UIparameter* parameter; + parameter = new G4UIparameter("plotter",'s',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("columns",'i',true); + parameter->SetDefaultValue(1); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("rows",'i',true); + parameter->SetDefaultValue(1); + fpCommand->SetParameter (parameter); +} + +G4VisCommandPlotterSetLayout::~G4VisCommandPlotterSetLayout () {delete fpCommand;} + +void G4VisCommandPlotterSetLayout::SetNewValue (G4UIcommand*, G4String newValue) +{ + G4String plotter; + G4int cols,rows; + std::istringstream is(newValue); + is >> plotter >> cols >> rows; + + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(plotter); + _plotter.SetLayout(cols,rows); + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if(pScene) CheckSceneAndNotifyHandlers (pScene); +} + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/addStyle //////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterAddStyle::G4VisCommandPlotterAddStyle () { + fpCommand = new G4UIcommand("/vis/plotter/addStyle", this); + fpCommand->SetGuidance("Add a style for a plotter."); + fpCommand->SetGuidance("It is applied on all regions/plots of the plotter."); + fpCommand->SetGuidance("default, ROOT_default, hippodraw are known embedded styles."); + fpCommand->SetGuidance("reset is a keyword used to reset regions style."); + + G4UIparameter* parameter; + parameter = new G4UIparameter("plotter",'s',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("style",'s',true); + parameter->SetDefaultValue("default"); + fpCommand->SetParameter (parameter); +} + +G4VisCommandPlotterAddStyle::~G4VisCommandPlotterAddStyle () {delete fpCommand;} + +void G4VisCommandPlotterAddStyle::SetNewValue (G4UIcommand*, G4String newValue) +{ + G4String plotter; + G4String style; + std::istringstream is(newValue); + is >> plotter >> style; + + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(plotter); + _plotter.AddStyle(style); + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if(pScene) CheckSceneAndNotifyHandlers (pScene); +} + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/addRegionStyle ////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterAddRegionStyle::G4VisCommandPlotterAddRegionStyle () { + fpCommand = new G4UIcommand("/vis/plotter/addRegionStyle", this); + fpCommand->SetGuidance("Add a style to be applied on a region."); + fpCommand->SetGuidance("default, ROOT_default, hippodraw are known embedded styles."); + fpCommand->SetGuidance("reset is a keyword used to reset a region style."); + + G4UIparameter* parameter; + parameter = new G4UIparameter("plotter",'s',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("region",'i',false); +//parameter->SetDefaultValue(0); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("style",'s',true); + parameter->SetDefaultValue("default"); + fpCommand->SetParameter (parameter); +} + +G4VisCommandPlotterAddRegionStyle::~G4VisCommandPlotterAddRegionStyle () {delete fpCommand;} + +void G4VisCommandPlotterAddRegionStyle::SetNewValue (G4UIcommand*, G4String newValue) +{ + G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity(); + + G4String plotter; + int region; + G4String style; + std::istringstream is(newValue); + is >> plotter >> region >> style; + if(region<0) { + if (verbosity >= G4VisManager::errors) { + G4cerr << "ERROR: bad region index " << region << "." << G4endl; + } + return; + } + + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(plotter); + _plotter.AddRegionStyle(region,style); + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if(pScene) CheckSceneAndNotifyHandlers (pScene); +} + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/addRegionParameter ////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterAddRegionParameter::G4VisCommandPlotterAddRegionParameter () { + fpCommand = new G4UIcommand("/vis/plotter/addRegionParameter", this); + fpCommand->SetGuidance("Add a parameter to be set on a region."); + + G4UIparameter* parameter; + parameter = new G4UIparameter("plotter",'s',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("region",'i',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("parameter",'s',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("value",'s',false); + fpCommand->SetParameter (parameter); +} + +G4VisCommandPlotterAddRegionParameter::~G4VisCommandPlotterAddRegionParameter () {delete fpCommand;} + +void G4VisCommandPlotterAddRegionParameter::SetNewValue (G4UIcommand* command, G4String newValue) +{ + G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity(); + + std::vector args; + tools::double_quotes_tokenize(newValue, args); + if ( args.size() != command->GetParameterEntries() ) { // check consistency. + if (verbosity >= G4VisManager::errors) { + G4cerr << "ERROR: tokenize value problem." << G4endl; + } + return; + } + + std::string plotter = args[0]; + int region = G4UIcommand::ConvertToInt(args[1].c_str()); + std::string parameter = args[2]; + std::string value = args[3]; + if(region<0) { + if (verbosity >= G4VisManager::errors) { + G4cerr << "ERROR: bad region index " << region << "." << G4endl; + } + return; + } + + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(plotter); + _plotter.AddRegionParameter(region,parameter,value); + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if(pScene) CheckSceneAndNotifyHandlers (pScene); +} + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/clear /////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterClear::G4VisCommandPlotterClear () { + fpCommand = new G4UIcommand("/vis/plotter/clear", this); + fpCommand->SetGuidance("Remove plottables from all regions."); + + G4UIparameter* parameter; + parameter = new G4UIparameter("plotter",'s',false); + fpCommand->SetParameter (parameter); +} + +G4VisCommandPlotterClear::~G4VisCommandPlotterClear () {delete fpCommand;} + +void G4VisCommandPlotterClear::SetNewValue (G4UIcommand*, G4String newValue) +{ + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(newValue); + _plotter.Clear(); + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if(pScene) CheckSceneAndNotifyHandlers (pScene); +} + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/clearRegion ///////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterClearRegion::G4VisCommandPlotterClearRegion () { + fpCommand = new G4UIcommand("/vis/plotter/clearRegion", this); + fpCommand->SetGuidance("Remove plottables a region."); + + G4UIparameter* parameter; + parameter = new G4UIparameter("plotter",'s',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("region",'i',false); +//parameter->SetDefaultValue(0); + fpCommand->SetParameter (parameter); +} + +G4VisCommandPlotterClearRegion::~G4VisCommandPlotterClearRegion () {delete fpCommand;} + +void G4VisCommandPlotterClearRegion::SetNewValue (G4UIcommand*, G4String newValue) +{ + G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity(); + + G4String plotter; + int region; + std::istringstream is(newValue); + is >> plotter >> region; + if(region<0) { + if (verbosity >= G4VisManager::errors) { + G4cerr << "ERROR: bad region index " << region << "." << G4endl; + } + return; + } + + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(plotter); + _plotter.ClearRegion(region); + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if(pScene) CheckSceneAndNotifyHandlers (pScene); +} + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/list //////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterList::G4VisCommandPlotterList () { + fpCommand = new G4UIcommand("/vis/plotter/list", this); + fpCommand->SetGuidance("List plotters in the scene."); +} + +G4VisCommandPlotterList::~G4VisCommandPlotterList () {delete fpCommand;} + +void G4VisCommandPlotterList::SetNewValue (G4UIcommand*, G4String) +{ + G4PlotterManager::GetInstance().List(); +} + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/add/h1 ////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterAddRegionH1::G4VisCommandPlotterAddRegionH1 () { + fpCommand = new G4UIcommand("/vis/plotter/add/h1", this); + fpCommand->SetGuidance("Attach a 1D histogram to a plotter region."); + + G4UIparameter* parameter; + parameter = new G4UIparameter("histo",'i',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("plotter",'s',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("region",'i',true); + parameter->SetDefaultValue(0); + fpCommand->SetParameter (parameter); +} + +G4VisCommandPlotterAddRegionH1::~G4VisCommandPlotterAddRegionH1 () {delete fpCommand;} + +void G4VisCommandPlotterAddRegionH1::SetNewValue (G4UIcommand*, G4String newValue) +{ + G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity(); + + int hid; + G4String plotter; + int region; + std::istringstream is(newValue); + is >> hid >> plotter >> region; + + if(region<0) { + if (verbosity >= G4VisManager::errors) { + G4cerr << "ERROR: bad region index " << region << "." << G4endl; + } + return; + } + + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(plotter); + _plotter.AddRegionH1(region,hid); + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if(pScene) CheckSceneAndNotifyHandlers (pScene); +} + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/plotter/add/h2 ////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandPlotterAddRegionH2::G4VisCommandPlotterAddRegionH2 () { + fpCommand = new G4UIcommand("/vis/plotter/add/h2", this); + fpCommand->SetGuidance("Attach a 2D histogram to a plotter region."); + + G4UIparameter* parameter; + parameter = new G4UIparameter("histo",'i',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("plotter",'s',false); + fpCommand->SetParameter (parameter); + + parameter = new G4UIparameter("region",'i',true); + parameter->SetDefaultValue(0); + fpCommand->SetParameter (parameter); +} + +G4VisCommandPlotterAddRegionH2::~G4VisCommandPlotterAddRegionH2 () {delete fpCommand;} + +void G4VisCommandPlotterAddRegionH2::SetNewValue (G4UIcommand*, G4String newValue) +{ + G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity(); + + int hid; + G4String plotter; + int region; + std::istringstream is(newValue); + is >> hid >> plotter >> region; + + if(region<0) { + if (verbosity >= G4VisManager::errors) { + G4cerr << "ERROR: bad region index " << region << "." << G4endl; + } + return; + } + + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(plotter); + _plotter.AddRegionH2(region,hid); + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if(pScene) CheckSceneAndNotifyHandlers (pScene); +} + diff --git a/source/visualization/management/src/G4VisCommandsScene.cc b/source/visualization/management/src/G4VisCommandsScene.cc index 8dc3b49251..105c9339b6 100644 --- a/source/visualization/management/src/G4VisCommandsScene.cc +++ b/source/visualization/management/src/G4VisCommandsScene.cc @@ -630,7 +630,7 @@ void G4VisCommandSceneNotifyHandlers::SetNewValue (G4UIcommand*, std::istringstream is (newValue); is >> sceneName >> refresh_flush; G4bool flush = false; - if (refresh_flush(0) == 'f') flush = true; + if (refresh_flush[0] == 'f') flush = true; const G4SceneList& sceneList = fpVisManager -> GetSceneList (); G4SceneHandlerList& sceneHandlerList = @@ -772,6 +772,111 @@ void G4VisCommandSceneNotifyHandlers::SetNewValue (G4UIcommand*, } } +////////////// /vis/scene/removeModel //////////////////////////// + +G4VisCommandSceneRemoveModel::G4VisCommandSceneRemoveModel () { + G4bool omitable; + fpCommand = new G4UIcommand ("/vis/scene/removeModel", this); + fpCommand -> SetGuidance("Remove model."); + fpCommand -> SetGuidance + ("Attempts to match search string to name of model - use unique sub-string."); + fpCommand -> SetGuidance + ("Use \"/vis/scene/list\" to see model names."); + G4UIparameter* parameter; + parameter = new G4UIparameter ("search-string", 's', omitable = false); + fpCommand -> SetParameter (parameter); +} + +G4VisCommandSceneRemoveModel::~G4VisCommandSceneRemoveModel () { + delete fpCommand; +} + +G4String G4VisCommandSceneRemoveModel::GetCurrentValue(G4UIcommand*) { + return ""; +} + +void G4VisCommandSceneRemoveModel::SetNewValue (G4UIcommand*, + G4String newValue) { + + G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity(); + + G4String searchString; + std::istringstream is (newValue); + is >> searchString; + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if (!pScene) { + if (verbosity >= G4VisManager::errors) { + G4cerr << "ERROR: No current scene. Please create one." << G4endl; + } + return; + } + + G4VSceneHandler* pSceneHandler = fpVisManager->GetCurrentSceneHandler(); + if (!pSceneHandler) { + if (verbosity >= G4VisManager::errors) { + G4cerr << "ERROR: No current sceneHandler. Please create one." << G4endl; + } + return; + } + + G4bool any = false; + + std::vector& runDurationModelList = + pScene->SetRunDurationModelList(); + for (size_t i = 0; i < runDurationModelList.size(); i++) { + const G4String& modelName = + runDurationModelList[i].fpModel->GetGlobalDescription(); + if (modelName.find(searchString) != std::string::npos) { + runDurationModelList.erase(runDurationModelList.begin()+i); + any = true; + if (verbosity >= G4VisManager::warnings) { + G4cout << "Model \"" << modelName << "\" removed." << G4endl; + } + break; // Allow only one model at a time to be removed. + } + } + + std::vector& endOfEventModelList = + pScene->SetEndOfEventModelList(); + for (size_t i = 0; i < endOfEventModelList.size(); i++) { + const G4String& modelName = + endOfEventModelList[i].fpModel->GetGlobalDescription(); + if (modelName.find(searchString) != std::string::npos) { + endOfEventModelList.erase(endOfEventModelList.begin()+i); + any = true; + if (verbosity >= G4VisManager::warnings) { + G4cout << "Model \"" << modelName << "\" removed." << G4endl; + } + break; // Allow only one model at a time to be removed. + } + } + + std::vector& endOfRunModelList = + pScene->SetEndOfRunModelList(); + for (size_t i = 0; i < endOfRunModelList.size(); i++) { + const G4String& modelName = + endOfRunModelList[i].fpModel->GetGlobalDescription(); + if (modelName.find(searchString) != std::string::npos) { + endOfRunModelList.erase(endOfRunModelList.begin()+i); + any = true; + if (verbosity >= G4VisManager::warnings) { + G4cout << "Model \"" << modelName << "\" removed." << G4endl; + } + break; // Allow only one model at a time to be removed. + } + } + + if (!any) { + if (verbosity >= G4VisManager::warnings) { + G4cout << "WARNING: No match found." << G4endl; + } + return; + } + + CheckSceneAndNotifyHandlers (pScene); +} + ////////////// /vis/scene/select /////////////////////////////////////// G4VisCommandSceneSelect::G4VisCommandSceneSelect () { @@ -874,7 +979,7 @@ void G4VisCommandSceneShowExtents::SetNewValue (G4UIcommand*, G4String) { G4cout << "\n Active: "; else G4cout << "\n Inactive: "; G4VModel* pModel = pCurrentScene -> GetRunDurationModelList()[i].fpModel; - const G4VisExtent& transformedExtent = pModel -> GetTransformedExtent(); + const G4VisExtent& transformedExtent = pModel -> GetExtent(); G4cout << pModel -> GetGlobalDescription () << "\n" << transformedExtent; DrawExtent(transformedExtent); @@ -889,7 +994,7 @@ void G4VisCommandSceneShowExtents::SetNewValue (G4UIcommand*, G4String) { G4cout << "\n Active: "; else G4cout << "\n Inactive: "; G4VModel* pModel = pCurrentScene -> GetEndOfEventModelList()[i].fpModel; - const G4VisExtent& transformedExtent = pModel -> GetTransformedExtent(); + const G4VisExtent& transformedExtent = pModel -> GetExtent(); G4cout << pModel -> GetGlobalDescription () << "\n" << transformedExtent; DrawExtent(transformedExtent); @@ -904,7 +1009,7 @@ void G4VisCommandSceneShowExtents::SetNewValue (G4UIcommand*, G4String) { G4cout << "\n Active: "; else G4cout << "\n Inactive: "; G4VModel* pModel = pCurrentScene -> GetEndOfRunModelList()[i].fpModel; - const G4VisExtent& transformedExtent = pModel -> GetTransformedExtent(); + const G4VisExtent& transformedExtent = pModel -> GetExtent(); G4cout << pModel -> GetGlobalDescription () << "\n" << transformedExtent; DrawExtent(transformedExtent); diff --git a/source/visualization/management/src/G4VisCommandsSceneAdd.cc b/source/visualization/management/src/G4VisCommandsSceneAdd.cc index 6ec2e18b7e..960d51f59e 100644 --- a/source/visualization/management/src/G4VisCommandsSceneAdd.cc +++ b/source/visualization/management/src/G4VisCommandsSceneAdd.cc @@ -40,10 +40,10 @@ #include "G4MagneticFieldModel.hh" #include "G4PSHitsModel.hh" #include "G4TrajectoriesModel.hh" -#include "G4ScaleModel.hh" #include "G4TextModel.hh" #include "G4ArrowModel.hh" #include "G4AxesModel.hh" +#include "G4PlotterModel.hh" #include "G4PhysicalVolumesSearchScene.hh" #include "G4ParticleTable.hh" #include "G4ParticleDefinition.hh" @@ -78,6 +78,7 @@ #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" #include "G4GeneralParticleSourceData.hh" +#include "G4PlotterManager.hh" #include @@ -245,7 +246,7 @@ G4VisCommandSceneAddArrow2D::Arrow2D::Arrow2D } void G4VisCommandSceneAddArrow2D::Arrow2D::operator() - (G4VGraphicsScene& sceneHandler, const G4Transform3D&, const G4ModelingParameters*) + (G4VGraphicsScene& sceneHandler, const G4ModelingParameters*) { sceneHandler.BeginPrimitives2D(); sceneHandler.AddPrimitive(fShaftPolyline); @@ -433,9 +434,9 @@ void G4VisCommandSceneAddDate::SetNewValue (G4UIcommand*, G4String newValue) is.getline(remainder, NREMAINDER); dateString += remainder; G4Text::Layout layout = G4Text::right; - if (layoutString(0) == 'l') layout = G4Text::left; - else if (layoutString(0) == 'c') layout = G4Text::centre; - else if (layoutString(0) == 'r') layout = G4Text::right; + if (layoutString[0] == 'l') layout = G4Text::left; + else if (layoutString[0] == 'c') layout = G4Text::centre; + else if (layoutString[0] == 'r') layout = G4Text::right; Date* date = new Date(fpVisManager, size, x, y, layout, dateString); G4VModel* model = @@ -458,7 +459,7 @@ void G4VisCommandSceneAddDate::SetNewValue (G4UIcommand*, G4String newValue) } void G4VisCommandSceneAddDate::Date::operator() - (G4VGraphicsScene& sceneHandler, const G4Transform3D&, const G4ModelingParameters*) + (G4VGraphicsScene& sceneHandler, const G4ModelingParameters*) { G4String time; if (fDate == "-") { @@ -675,9 +676,9 @@ void G4VisCommandSceneAddEventID::SetNewValue (G4UIcommand*, G4String newValue) is >> size >> x >> y >> layoutString; G4Text::Layout layout = G4Text::right; - if (layoutString(0) == 'l') layout = G4Text::left; - else if (layoutString(0) == 'c') layout = G4Text::centre; - else if (layoutString(0) == 'r') layout = G4Text::right; + if (layoutString[0] == 'l') layout = G4Text::left; + else if (layoutString[0] == 'c') layout = G4Text::centre; + else if (layoutString[0] == 'r') layout = G4Text::right; // For End of Event (only for reviewing kept events one by one) EventID* eoeEventID @@ -713,7 +714,7 @@ void G4VisCommandSceneAddEventID::SetNewValue (G4UIcommand*, G4String newValue) } void G4VisCommandSceneAddEventID::EventID::operator() -(G4VGraphicsScene& sceneHandler, const G4Transform3D&, const G4ModelingParameters* mp) +(G4VGraphicsScene& sceneHandler, const G4ModelingParameters* mp) { G4RunManager* runManager = G4RunManagerFactory::GetMasterRunManager(); if(!runManager) @@ -863,7 +864,7 @@ fExtent(xmin,xmax,ymin,ymax,zmin,zmax) {} void G4VisCommandSceneAddExtent::Extent::operator() -(G4VGraphicsScene&, const G4Transform3D&, const G4ModelingParameters*) +(G4VGraphicsScene&, const G4ModelingParameters*) {} ////////////// /vis/scene/add/frame /////////////////////////////////////// @@ -926,7 +927,7 @@ void G4VisCommandSceneAddFrame::SetNewValue (G4UIcommand*, G4String newValue) } void G4VisCommandSceneAddFrame::Frame::operator() - (G4VGraphicsScene& sceneHandler, const G4Transform3D&, const G4ModelingParameters*) + (G4VGraphicsScene& sceneHandler, const G4ModelingParameters*) { G4Polyline frame; frame.push_back(G4Point3D( fSize, fSize, 0.)); @@ -1148,7 +1149,7 @@ G4VisCommandSceneAddLine::Line::Line } void G4VisCommandSceneAddLine::Line::operator() - (G4VGraphicsScene& sceneHandler, const G4Transform3D&, const G4ModelingParameters*) + (G4VGraphicsScene& sceneHandler, const G4ModelingParameters*) { sceneHandler.BeginPrimitives(); sceneHandler.AddPrimitive(fPolyline); @@ -1233,7 +1234,7 @@ G4VisCommandSceneAddLine2D::Line2D::Line2D } void G4VisCommandSceneAddLine2D::Line2D::operator() - (G4VGraphicsScene& sceneHandler, const G4Transform3D&, const G4ModelingParameters*) + (G4VGraphicsScene& sceneHandler, const G4ModelingParameters*) { sceneHandler.BeginPrimitives2D(); sceneHandler.AddPrimitive(fPolyline); @@ -1320,8 +1321,7 @@ void G4VisCommandSceneAddLocalAxes::SetNewValue (G4UIcommand*, if (5.*length < lengthMax) length *= 5.; else if (2.*length < lengthMax) length *= 2.; - const auto& axesModel = new G4AxesModel(0.,0.,0.,length); - axesModel->SetTransformation(transform); + const auto& axesModel = new G4AxesModel(0.,0.,0.,length,transform); axesModel->SetGlobalTag("LocalAxesModel"); std::ostringstream oss; oss << "Local Axes for " << findings.fpFoundPV->GetName() @@ -1626,11 +1626,11 @@ void G4VisCommandSceneAddLogo::SetNewValue (G4UIcommand*, G4String newValue) { } G4double userHeight, red, green, blue, xmid, ymid, zmid; - G4String userHeightUnit, direction, auto_manual, positionUnit; + G4String userHeightUnit, direction, placement, positionUnit; std::istringstream is (newValue); is >> userHeight >> userHeightUnit >> direction >> red >> green >> blue - >> auto_manual + >> placement >> xmid >> ymid >> zmid >> positionUnit; G4double height = userHeight; @@ -1656,13 +1656,13 @@ void G4VisCommandSceneAddLogo::SetNewValue (G4UIcommand*, G4String newValue) { else if (vp.z() > vp.x() && vp.z() > vp.y()) logoDirection = Z; else if (vp.z() < vp.x() && vp.z() < vp.y()) logoDirection = minusZ; } - else if (direction(0) == 'x') logoDirection = X; - else if (direction(0) == 'y') logoDirection = Y; - else if (direction(0) == 'z') logoDirection = Z; - else if (direction(0) == '-') { - if (direction(1) == 'x') logoDirection = minusX; - else if (direction(1) == 'y') logoDirection = minusY; - else if (direction(1) == 'z') logoDirection = minusZ; + else if (direction[0] == 'x') logoDirection = X; + else if (direction[0] == 'y') logoDirection = Y; + else if (direction[0] == 'z') logoDirection = Z; + else if (direction[0] == '-') { + if (direction[1] == 'x') logoDirection = minusX; + else if (direction[1] == 'y') logoDirection = minusY; + else if (direction[1] == 'z') logoDirection = minusZ; } else { if (verbosity >= G4VisManager::errors) { G4cerr << "ERROR: Unrecogniseed direction: \"" @@ -1671,7 +1671,7 @@ void G4VisCommandSceneAddLogo::SetNewValue (G4UIcommand*, G4String newValue) { } } - G4bool autoPlacing = false; if (auto_manual == "auto") autoPlacing = true; + G4bool autoPlacing = false; if (placement == "auto") autoPlacing = true; // Parameters read and interpreted. // Current scene extent @@ -1802,19 +1802,16 @@ void G4VisCommandSceneAddLogo::SetNewValue (G4UIcommand*, G4String newValue) { G4VisAttributes visAtts(G4Colour(red, green, blue)); visAtts.SetForceSolid(true); // Always solid. - G4Logo* logo = new G4Logo(height,visAtts); + G4Logo* logo = new G4Logo(height,visAtts,transform); G4VModel* model = new G4CallbackModel(logo); model->SetType("G4Logo"); model->SetGlobalTag("G4Logo"); model->SetGlobalDescription("G4Logo: " + newValue); - model->SetTransformation(transform); - // Note: it is the responsibility of the model to act upon this, but - // the extent is in local coordinates... G4double& h = height; G4double h2 = h/2.; G4VisExtent extent(-h,h,-h2,h2,-h2,h2); - model->SetExtent(extent); + model->SetExtent(extent.Transform(transform)); // This extent gets "added" to existing scene extent in // AddRunDurationModel below. const G4String& currentSceneName = pScene -> GetName (); @@ -1838,8 +1835,7 @@ void G4VisCommandSceneAddLogo::SetNewValue (G4UIcommand*, G4String newValue) { } G4VisCommandSceneAddLogo::G4Logo::G4Logo -(G4double height, const G4VisAttributes& visAtts): - fVisAtts(visAtts) +(G4double height, const G4VisAttributes& visAtts, const G4Transform3D& transform) { const G4double& h = height; const G4double h2 = 0.5 * h; // Half height. @@ -1884,8 +1880,9 @@ G4VisCommandSceneAddLogo::G4Logo::G4Logo G4Box bG("bG",w2,ro2,d2); G4UnionSolid logoG("logoG",&tG,&bG,G4Translate3D(ri+w2,-ro2,0.)); fpG = logoG.CreatePolyhedron(); - fpG->SetVisAttributes(&fVisAtts); + fpG->SetVisAttributes(visAtts); fpG->Transform(G4Translate3D(-0.55*h,0.,0.)); + fpG->Transform(transform); // 4... G4Box b1("b1",h2,h2,d2); @@ -1908,8 +1905,9 @@ G4VisCommandSceneAddLogo::G4Logo::G4Logo fp4 = new G4Polyhedron(); fp4->createPolyhedron(nNodes,nFaces,xyz,faces); */ - fp4->SetVisAttributes(&fVisAtts); + fp4->SetVisAttributes(visAtts); fp4->Transform(G4Translate3D(0.55*h,0.,0.)); + fp4->Transform(transform); } G4VisCommandSceneAddLogo::G4Logo::~G4Logo() { @@ -1918,8 +1916,8 @@ G4VisCommandSceneAddLogo::G4Logo::~G4Logo() { } void G4VisCommandSceneAddLogo::G4Logo::operator() - (G4VGraphicsScene& sceneHandler, const G4Transform3D& transform, const G4ModelingParameters*) { - sceneHandler.BeginPrimitives(transform); + (G4VGraphicsScene& sceneHandler, const G4ModelingParameters*) { + sceneHandler.BeginPrimitives(); sceneHandler.AddPrimitive(*fpG); sceneHandler.AddPrimitive(*fp4); sceneHandler.EndPrimitives(); @@ -1977,9 +1975,9 @@ void G4VisCommandSceneAddLogo2D::SetNewValue (G4UIcommand*, G4String newValue) std::istringstream is(newValue); is >> size >> x >> y >> layoutString; G4Text::Layout layout = G4Text::right; - if (layoutString(0) == 'l') layout = G4Text::left; - else if (layoutString(0) == 'c') layout = G4Text::centre; - else if (layoutString(0) == 'r') layout = G4Text::right; + if (layoutString[0] == 'l') layout = G4Text::left; + else if (layoutString[0] == 'c') layout = G4Text::centre; + else if (layoutString[0] == 'r') layout = G4Text::right; Logo2D* logo2D = new Logo2D(fpVisManager, size, x, y, layout); G4VModel* model = @@ -2002,7 +2000,7 @@ void G4VisCommandSceneAddLogo2D::SetNewValue (G4UIcommand*, G4String newValue) } void G4VisCommandSceneAddLogo2D::Logo2D::operator() - (G4VGraphicsScene& sceneHandler, const G4Transform3D&, const G4ModelingParameters*) + (G4VGraphicsScene& sceneHandler, const G4ModelingParameters*) { G4Text text("Geant4", G4Point3D(fX, fY, 0.)); text.SetScreenSize(fSize); @@ -2158,7 +2156,22 @@ G4VisCommandSceneAddScale::G4VisCommandSceneAddScale () { fpCommand -> SetGuidance ("If \"placement\" is \"auto\", scale is placed at bottom left of current view." "\n Otherwise placed at (xmid,ymid,zmid)."); - fpCommand -> SetGuidance (G4Scale::GetGuidanceString()); + fpCommand -> SetGuidance + ("An annotated line in the specified direction with tick marks at the" + "\nend. If autoPlacing is true it is required to be centred at the" + "\nfront, right, bottom corner of the world space, comfortably outside" + "\nthe existing bounding box/sphere so that existing objects do not" + "\nobscure it. Otherwise it is required to be drawn with mid-point at" + "\n(xmid, ymid, zmid)." + "\n" + "\nThe auto placing algorithm is (approx):" + "\n x = xmin + (1 + comfort) * (xmax - xmin);" + "\n y = ymin - comfort * (ymax - ymin);" + "\n z = zmin + (1 + comfort) * (zmax - zmin);" + "\n if direction == x then (x - length,y,z) to (x,y,z);" + "\n if direction == y then (x,y,z) to (x,y + length,z);" + "\n if direction == z then (x,y,z - length) to (x,y,z);" + ); G4UIparameter* parameter; parameter = new G4UIparameter ("length", 'd', omitable = true); parameter->SetDefaultValue (1.); @@ -2228,11 +2241,11 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { } G4double userLength, red, green, blue, xmid, ymid, zmid; - G4String userLengthUnit, direction, auto_manual, positionUnit; + G4String userLengthUnit, direction, placement, positionUnit; std::istringstream is (newValue); is >> userLength >> userLengthUnit >> direction >> red >> green >> blue - >> auto_manual + >> placement >> xmid >> ymid >> zmid >> positionUnit; G4double length = userLength; @@ -2251,9 +2264,9 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { G4double unit = G4UIcommand::ValueOf(positionUnit); xmid *= unit; ymid *= unit; zmid *= unit; - G4Scale::Direction scaleDirection (G4Scale::x); - if (direction(0) == 'y') scaleDirection = G4Scale::y; - if (direction(0) == 'z') scaleDirection = G4Scale::z; + Scale::Direction scaleDirection (Scale::x); + if (direction[0] == 'y') scaleDirection = Scale::y; + if (direction[0] == 'z') scaleDirection = Scale::z; G4VViewer* pViewer = fpVisManager->GetCurrentViewer(); if (!pViewer) { @@ -2274,22 +2287,22 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { if (direction == "auto") { // Takes cue from viewer. if (std::abs(vp.x()) > std::abs(vp.y()) && std::abs(vp.x()) > std::abs(vp.z())) { // x viewpoint - if (std::abs(up.y()) > std::abs(up.z())) scaleDirection = G4Scale::z; - else scaleDirection = G4Scale::y; + if (std::abs(up.y()) > std::abs(up.z())) scaleDirection = Scale::z; + else scaleDirection = Scale::y; } else if (std::abs(vp.y()) > std::abs(vp.x()) && std::abs(vp.y()) > std::abs(vp.z())) { // y viewpoint - if (std::abs(up.x()) > std::abs(up.z())) scaleDirection = G4Scale::z; - else scaleDirection = G4Scale::x; + if (std::abs(up.x()) > std::abs(up.z())) scaleDirection = Scale::z; + else scaleDirection = Scale::x; } else if (std::abs(vp.z()) > std::abs(vp.x()) && std::abs(vp.z()) > std::abs(vp.y())) { // z viewpoint - if (std::abs(up.y()) > std::abs(up.x())) scaleDirection = G4Scale::x; - else scaleDirection = G4Scale::y; + if (std::abs(up.y()) > std::abs(up.x())) scaleDirection = Scale::x; + else scaleDirection = Scale::y; } } - G4bool autoPlacing = false; if (auto_manual == "auto") autoPlacing = true; + G4bool autoPlacing = false; if (placement == "auto") autoPlacing = true; // Parameters read and interpreted. // Useful constants, etc... @@ -2315,16 +2328,17 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { << G4endl; } } + // Test existing scene for room... G4bool room = true; switch (scaleDirection) { - case G4Scale::x: + case Scale::x: if (freeLengthFraction * (xmax - xmin) < length) room = false; break; - case G4Scale::y: + case Scale::y: if (freeLengthFraction * (ymax - ymin) < length) room = false; break; - case G4Scale::z: + case Scale::z: if (freeLengthFraction * (zmax - zmin) < length) room = false; break; } @@ -2348,22 +2362,8 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { } } - // Let's go ahead a construct a scale and a scale model. Since the - // placing is done here, this G4Scale is *not* auto-placed... - G4Scale scale(length, annotation, scaleDirection, - false, xmid, ymid, zmid, - fCurrentTextSize); - G4VisAttributes visAttr(G4Colour(red, green, blue)); - scale.SetVisAttributes(visAttr); - G4VModel* model = new G4ScaleModel(scale); - G4String globalDescription = model->GetGlobalDescription(); - globalDescription += " (" + newValue + ")"; - model->SetGlobalDescription(globalDescription); - // Now figure out the extent... // - // From the G4Scale.hh: - // // This creates a representation of annotated line in the specified // direction with tick marks at the end. If autoPlacing is true it // is required to be centred at the front, right, bottom corner of @@ -2379,8 +2379,6 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { // if direction == y then (x,y,z) to (x,y + length,z) // if direction == z then (x,y,z - length) to (x,y,z) // - // End of clip from G4Scale.hh: - // // Implement this in two parts. Here, use the scale's extent to // "expand" the scene's extent. Then rendering - in // G4VSceneHandler::AddPrimitive(const G4Scale&) - simply has to @@ -2395,7 +2393,7 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { const G4double yComfort = comfort * (ymax - ymin); const G4double zComfort = comfort * (zmax - zmin); switch (scaleDirection) { - case G4Scale::x: + case Scale::x: if (vp.z() > 0.) { sxmid = xmax + xComfort; symid = ymin - yComfort; @@ -2406,7 +2404,7 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { szmid = zmax + zComfort; } break; - case G4Scale::y: + case Scale::y: if (vp.x() > 0.) { sxmid = xmin - xComfort; symid = ymax + yComfort; @@ -2417,7 +2415,7 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { szmid = zmin - zComfort; } break; - case G4Scale::z: + case Scale::z: if (vp.x() > 0.) { sxmid = xmax + xComfort; symid = ymin - yComfort; @@ -2431,78 +2429,47 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { } } - /* Old code - kept for future reference. - G4double sxmid(xmid), symid(ymid), szmid(zmid); - if (autoPlacing) { - sxmid = xmin + onePlusComfort * (xmax - xmin); - symid = ymin - comfort * (ymax - ymin); - szmid = zmin + onePlusComfort * (zmax - zmin); - switch (scaleDirection) { - case G4Scale::x: - sxmid -= halfLength; - break; - case G4Scale::y: - symid += halfLength; - break; - case G4Scale::z: - szmid -= halfLength; - break; - } - } - */ - - /* sxmin, etc., not actually used. Comment out to prevent compiler - warnings but keep in case need in future. Extract transform and - scaleExtent into reduced code below. - G4double sxmin(sxmid), sxmax(sxmid); - G4double symin(symid), symax(symid); - G4double szmin(szmid), szmax(szmid); G4Transform3D transform; - G4VisExtent scaleExtent; + const G4double h = halfLength; + const G4double t = h/5.; + G4VisExtent scaleExtent(-h,h,-t,t,-t,t); switch (scaleDirection) { - case G4Scale::x: - sxmin = sxmid - halfLength; - sxmax = sxmid + halfLength; - scaleExtent = G4VisExtent(-halfLength,halfLength,0,0,0,0); + case Scale::x: break; - case G4Scale::y: - symin = symid - halfLength; - symax = symid + halfLength; + case Scale::y: transform = G4RotateZ3D(halfpi); - scaleExtent = G4VisExtent(0,0,-halfLength,halfLength,0,0); break; - case G4Scale::z: - szmin = szmid - halfLength; - szmax = szmid + halfLength; + case Scale::z: transform = G4RotateY3D(halfpi); - scaleExtent = G4VisExtent(0,0,0,0,-halfLength,halfLength); - break; - } - */ - G4Transform3D transform; - G4VisExtent scaleExtent; - switch (scaleDirection) { - case G4Scale::x: - scaleExtent = G4VisExtent(-halfLength,halfLength,0,0,0,0); - break; - case G4Scale::y: - transform = G4RotateZ3D(halfpi); - scaleExtent = G4VisExtent(0,0,-halfLength,halfLength,0,0); - break; - case G4Scale::z: - transform = G4RotateY3D(halfpi); - scaleExtent = G4VisExtent(0,0,0,0,-halfLength,halfLength); break; } transform = G4Translate3D(sxmid,symid,szmid) * transform; - ///////// G4VisExtent scaleExtent(sxmin, sxmax, symin, symax, szmin, szmax); + scaleExtent = scaleExtent.Transform(transform); - model->SetTransformation(transform); - // Note: it is the responsibility of the model to act upon this, but - // the extent is in local coordinates... + G4Colour colour(red, green, blue); + if (direction == "auto") { + switch (scaleDirection) { + case Scale::x: + colour = G4Colour::Red(); + break; + case Scale::y: + colour = G4Colour::Green(); + break; + case Scale::z: + colour = G4Colour::Blue(); + break; + } + } + G4VisAttributes visAttr(colour); + + Scale* scale = new Scale + (visAttr, length, transform, + annotation, fCurrentTextSize, colour); + G4VModel* model = new G4CallbackModel(scale); + model->SetType("Scale"); + model->SetGlobalTag("Scale"); + model->SetGlobalDescription("Scale: " + newValue); model->SetExtent(scaleExtent); - // This extent gets "added" to existing scene extent in - // AddRunDurationModel below. const G4String& currentSceneName = pScene -> GetName (); G4bool successful = pScene -> AddRunDurationModel (model, warn); @@ -2523,6 +2490,68 @@ void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) { CheckSceneAndNotifyHandlers (pScene); } +G4VisCommandSceneAddScale::Scale::Scale + (const G4VisAttributes& visAtts, + G4double length, const G4Transform3D& transform, + const G4String& annotation, G4double annotationSize, + const G4Colour& annotationColour): +fVisAtts(visAtts) +{ + // Useful constants... + const G4double halfLength(length / 2.); + const G4double tickLength(length / 20.); + + // Create (empty) polylines having the same vis attributes... + // (OK to pass address since fVisAtts is long lived.) + fScaleLine.SetVisAttributes(&fVisAtts); + fTick11.SetVisAttributes(&fVisAtts); + fTick12.SetVisAttributes(&fVisAtts); + fTick21.SetVisAttributes(&fVisAtts); + fTick22.SetVisAttributes(&fVisAtts); + + // Add points to the polylines to represent a scale parallel to the + // x-axis centred on the origin... + G4Point3D r1(G4Point3D(-halfLength, 0., 0.)); + G4Point3D r2(G4Point3D( halfLength, 0., 0.)); + fScaleLine.push_back(r1); + fScaleLine.push_back(r2); + G4Point3D ticky(0., tickLength, 0.); + G4Point3D tickz(0., 0., tickLength); + fTick11.push_back(r1 + ticky); + fTick11.push_back(r1 - ticky); + fTick12.push_back(r1 + tickz); + fTick12.push_back(r1 - tickz); + fTick21.push_back(r2 + ticky); + fTick21.push_back(r2 - ticky); + fTick22.push_back(r2 + tickz); + fTick22.push_back(r2 - tickz); + // ...and transform to chosen position and orientation + fScaleLine.transform(transform); + fTick11.transform(transform); + fTick12.transform(transform); + fTick21.transform(transform); + fTick22.transform(transform); + // Similarly for annotation + G4Point3D textPosition(0., tickLength, 0.); + textPosition.transform(transform); + fText = G4Text(annotation,textPosition); + fText.SetVisAttributes(annotationColour); + fText.SetScreenSize(annotationSize); +} + +void G4VisCommandSceneAddScale::Scale::operator() +(G4VGraphicsScene& sceneHandler,const G4ModelingParameters*) +{ + // Draw... + sceneHandler.BeginPrimitives(); + sceneHandler.AddPrimitive(fScaleLine); + sceneHandler.AddPrimitive(fTick11); + sceneHandler.AddPrimitive(fTick12); + sceneHandler.AddPrimitive(fTick21); + sceneHandler.AddPrimitive(fTick22); + sceneHandler.AddPrimitive(fText); + sceneHandler.EndPrimitives(); +} ////////////// /vis/scene/add/text ////////////////////////////////// @@ -2716,8 +2745,8 @@ G4VisCommandSceneAddText2D::G4Text2D::G4Text2D(const G4Text& text): {} void G4VisCommandSceneAddText2D::G4Text2D::operator() - (G4VGraphicsScene& sceneHandler, const G4Transform3D& transform, const G4ModelingParameters*) { - sceneHandler.BeginPrimitives2D(transform); + (G4VGraphicsScene& sceneHandler, const G4ModelingParameters*) { + sceneHandler.BeginPrimitives2D(); sceneHandler.AddPrimitive(fText); sceneHandler.EndPrimitives2D(); } @@ -3297,3 +3326,49 @@ void G4VisCommandSceneAddVolume::SetNewValue (G4UIcommand*, CheckSceneAndNotifyHandlers(pScene); } + +///////////////////////////////////////////////////////////////////////////// +////////////// /vis/scene/add/plotter /////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +G4VisCommandSceneAddPlotter::G4VisCommandSceneAddPlotter () { + fpCommand = new G4UIcommand("/vis/scene/add/plotter", this); + fpCommand -> SetGuidance ("Add a plotter to current scene."); + + G4UIparameter* parameter; + parameter = new G4UIparameter ("plotter", 's',false); + fpCommand->SetParameter(parameter); +} + +G4VisCommandSceneAddPlotter::~G4VisCommandSceneAddPlotter () {delete fpCommand;} + +G4String G4VisCommandSceneAddPlotter::GetCurrentValue (G4UIcommand*) {return "";} + +void G4VisCommandSceneAddPlotter::SetNewValue (G4UIcommand*, G4String newValue) +{ + G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity(); + G4bool warn(verbosity >= G4VisManager::warnings); + + G4Scene* pScene = fpVisManager->GetCurrentScene(); + if (!pScene) { + if (verbosity >= G4VisManager::errors) { + G4cerr << "ERROR: No current scene. Please create one." << G4endl; + } + return; + } + + G4Plotter& _plotter = G4PlotterManager::GetInstance().GetPlotter(newValue); + + G4VModel* model = new G4PlotterModel(_plotter); + + const G4String& currentSceneName = pScene -> GetName (); + G4bool successful = pScene -> AddRunDurationModel (model, warn); + if (successful) { + if (verbosity >= G4VisManager::confirmations) { + G4cout << "Arrow has been added to scene \"" << currentSceneName << "\"." << G4endl; + } + } + else G4VisCommandsSceneAddUnsuccessful(verbosity); + + CheckSceneAndNotifyHandlers (pScene); +} + diff --git a/source/visualization/management/src/G4VisCommandsSceneHandler.cc b/source/visualization/management/src/G4VisCommandsSceneHandler.cc index 58bdd9181f..4db106e362 100644 --- a/source/visualization/management/src/G4VisCommandsSceneHandler.cc +++ b/source/visualization/management/src/G4VisCommandsSceneHandler.cc @@ -153,10 +153,11 @@ G4VisCommandSceneHandlerCreate::G4VisCommandSceneHandlerCreate (): fId (0) { const G4String& name = gs -> GetName (); candidates += name + ' '; for (const auto& nickname: gs -> GetNicknames ()) { + if (G4StrUtil::contains(nickname, "FALLBACK")) continue; if (nickname != name) candidates += nickname + ' '; } } - candidates = candidates.strip (); + G4StrUtil::strip(candidates); parameter -> SetParameterCandidates(candidates); fpCommand -> SetParameter (parameter); parameter = new G4UIparameter @@ -223,14 +224,14 @@ void G4VisCommandSceneHandlerCreate::SetNewValue (G4UIcommand* command, G4bool found = false; for (iGS = 0; iGS < nSystems; iGS++) { const auto& gs = gsl[iGS]; - if (graphicsSystem.compareTo(gs->GetName(), G4String::ignoreCase) == 0) { + if (G4StrUtil::icompare(graphicsSystem, gs->GetName()) == 0) { found = true; break; // Match found } else { const auto& nicknames = gs->GetNicknames(); for (size_t i = 0; i < nicknames.size(); ++i) { const auto& nickname = nicknames[i]; - if (graphicsSystem.compareTo (nickname, G4String::ignoreCase) == 0) { + if (G4StrUtil::icompare(graphicsSystem, nickname) == 0) { found = true; break; // Match found } @@ -247,7 +248,7 @@ void G4VisCommandSceneHandlerCreate::SetNewValue (G4UIcommand* command, for (const auto gs: fpVisManager -> GetAvailableGraphicsSystems()) { // Just list nicknames, but exclude FALLBACK nicknames for (const auto& nickname: gs->GetNicknames()) { - if (!nickname.contains("FALLBACK")) { + if (!G4StrUtil::contains(nickname, "FALLBACK")) { candidates.insert(nickname); } } @@ -278,7 +279,7 @@ void G4VisCommandSceneHandlerCreate::SetNewValue (G4UIcommand* command, const auto& nicknames = gsl[iGS]->GetNicknames(); for (size_t i = 0; i < nicknames.size(); ++i) { const auto& nickname = nicknames[i]; - if (fallbackNickname.compareTo (nickname, G4String::ignoreCase) == 0) { + if (G4StrUtil::icompare(fallbackNickname, nickname) == 0) { fallback = true; break; // Match found } @@ -312,18 +313,6 @@ void G4VisCommandSceneHandlerCreate::SetNewValue (G4UIcommand* command, << G4endl; } - // Set current graphics system in preparation for - // creating scene handler. - fpVisManager -> SetCurrentGraphicsSystem (pSystem); - if (verbosity >= G4VisManager::confirmations) { - G4cout << "Graphics system set to " - << pSystem -> GetName () - << " (" - << pSystem -> GetNickname () - << ')' - << G4endl; - } - // Now deal with name of scene handler. G4String nextName = NextName (); if (newName == "") { @@ -345,6 +334,24 @@ void G4VisCommandSceneHandlerCreate::SetNewValue (G4UIcommand* command, } } + // If there is an existing viewer, store its view parameters + if (fpVisManager->GetCurrentViewer()) { + fThereWasAViewer = true; + fVPExistingViewer = fpVisManager->GetCurrentViewer()->GetViewParameters(); + } + + // Set current graphics system in preparation for + // creating scene handler. + fpVisManager -> SetCurrentGraphicsSystem (pSystem); + if (verbosity >= G4VisManager::confirmations) { + G4cout << "Graphics system set to " + << pSystem -> GetName () + << " (" + << pSystem -> GetNickname () + << ')' + << G4endl; + } + //Create scene handler. fpVisManager -> CreateSceneHandler (newName); if (fpVisManager -> GetCurrentSceneHandler () -> GetName () != newName) { @@ -364,8 +371,15 @@ void G4VisCommandSceneHandlerCreate::SetNewValue (G4UIcommand* command, if (verbosity >= G4VisManager::confirmations) G4cout << "New scene handler \"" << newName << "\" created." << G4endl; - if (fpVisManager -> GetCurrentScene ()) - G4UImanager::GetUIpointer () -> ApplyCommand ("/vis/sceneHandler/attach"); + if (fpVisManager -> GetCurrentScene ()) { + auto errorCode = G4UImanager::GetUIpointer () -> ApplyCommand ("/vis/sceneHandler/attach"); + if (errorCode) { + G4ExceptionDescription ed; + ed << "sub-command \"/vis/sceneHandler/attach\" failed."; + command->CommandFailed(errorCode,ed); + return; + } + } } ////////////// /vis/sceneHandler/list /////////////////////////////////////// diff --git a/source/visualization/management/src/G4VisCommandsSet.cc b/source/visualization/management/src/G4VisCommandsSet.cc index 4a840d8795..3649af27ac 100644 --- a/source/visualization/management/src/G4VisCommandsSet.cc +++ b/source/visualization/management/src/G4VisCommandsSet.cc @@ -416,7 +416,7 @@ void G4VisCommandSetTouchable::SetNewValue (G4UIcommand*, G4String newValue) { G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity(); - if (newValue.isNull()) { + if (newValue.empty()) { fCurrentTouchableProperties = G4PhysicalVolumeModel::TouchableProperties(); if (verbosity >= G4VisManager::confirmations) { G4cout << diff --git a/source/visualization/management/src/G4VisCommandsTouchable.cc b/source/visualization/management/src/G4VisCommandsTouchable.cc index f2c8c5b3f1..4462789696 100644 --- a/source/visualization/management/src/G4VisCommandsTouchable.cc +++ b/source/visualization/management/src/G4VisCommandsTouchable.cc @@ -301,8 +301,8 @@ void G4VisCommandsTouchable::SetNewValue G4Polyhedron* polyhedron = properties.fpTouchablePV->GetLogicalVolume()->GetSolid()->GetPolyhedron(); G4cout << "\nLocal polyhedron coordinates:\n" << *polyhedron; - G4Transform3D* transform = tempPVModel.GetCurrentTransform(); - polyhedron->Transform(*transform); + const G4Transform3D& transform = tempPVModel.GetCurrentTransform(); + polyhedron->Transform(transform); G4cout << "\nGlobal polyhedron coordinates:\n" << *polyhedron; } else { G4cout << "Touchable not found." << G4endl; @@ -382,8 +382,7 @@ void G4VisCommandsTouchable::SetNewValue G4double length = std::pow(10,intLog10LengthMax); if (5.*length < lengthMax) length *= 5.; else if (2.*length < lengthMax) length *= 2.; - G4AxesModel axesModel(0.,0.,0.,length); - axesModel.SetTransformation(transform); + G4AxesModel axesModel(0.,0.,0.,length,transform); axesModel.SetGlobalTag("LocalAxesModel"); axesModel.DescribeYourselfTo(*fpVisManager->GetCurrentSceneHandler()); diff --git a/source/visualization/management/src/G4VisCommandsViewer.cc b/source/visualization/management/src/G4VisCommandsViewer.cc index 4fd3628d10..ca508d8d34 100644 --- a/source/visualization/management/src/G4VisCommandsViewer.cc +++ b/source/visualization/management/src/G4VisCommandsViewer.cc @@ -610,8 +610,8 @@ void G4VisCommandViewerClone::SetNewValue (G4UIcommand*, G4String newValue) { originalName += c; while (is.get(c) && c != ' ') {originalName += c;} } - originalName = originalName.strip (G4String::both, ' '); - originalName = originalName.strip (G4String::both, '"'); + G4StrUtil::strip(originalName, ' '); + G4StrUtil::strip(originalName, '"'); G4VViewer* originalViewer = fpVisManager -> GetViewer (originalName); if (!originalViewer) { @@ -632,8 +632,8 @@ void G4VisCommandViewerClone::SetNewValue (G4UIcommand*, G4String newValue) { cloneName += c; while (is.get(c) && c != ' ') {cloneName += c;} } - cloneName = cloneName.strip (G4String::both, ' '); - cloneName = cloneName.strip (G4String::both, '"'); + G4StrUtil::strip(cloneName, ' '); + G4StrUtil::strip(cloneName, '"'); G4bool errorWhileNaming = false; if (cloneName == "none") { @@ -873,16 +873,7 @@ void G4VisCommandViewerCopyViewFrom::SetNewValue (G4UIcommand*, G4String newValu // Copy camera-specific view parameters G4ViewParameters vp = currentViewer->GetViewParameters(); - const G4ViewParameters& fromVP = fromViewer->GetViewParameters(); - vp.SetViewpointDirection (fromVP.GetViewpointDirection()); - vp.SetLightpointDirection (fromVP.GetLightpointDirection()); - vp.SetLightsMoveWithCamera(fromVP.GetLightsMoveWithCamera()); - vp.SetUpVector (fromVP.GetUpVector()); - vp.SetFieldHalfAngle (fromVP.GetFieldHalfAngle()); - vp.SetZoomFactor (fromVP.GetZoomFactor()); - vp.SetScaleFactor (fromVP.GetScaleFactor()); - vp.SetCurrentTargetPoint (fromVP.GetCurrentTargetPoint()); - vp.SetDolly (fromVP.GetDolly()); + CopyCameraParameters(vp, fromViewer->GetViewParameters()); SetViewParameters(currentViewer, vp); if (verbosity >= G4VisManager::confirmations) { @@ -979,8 +970,8 @@ void G4VisCommandViewerCreate::SetNewValue (G4UIcommand* command, G4String newVa newName += c; while (is.get(c) && c != ' ') {newName += c;} } - newName = newName.strip (G4String::both, ' '); - newName = newName.strip (G4String::both, '"'); + G4StrUtil::strip(newName, ' '); + G4StrUtil::strip(newName, '"'); // Now get window size hint... is >> windowSizeHintString; @@ -1041,6 +1032,17 @@ void G4VisCommandViewerCreate::SetNewValue (G4UIcommand* command, G4String newVa } } + // If there was an existing viewer, use its view parameters + if (fThereWasAViewer) { + // OK, we're going to use its view parameters below + } else { + // There wasn't one...but if there now is... + if (fpVisManager->GetCurrentViewer()) { + fThereWasAViewer = true; + fVPExistingViewer = fpVisManager->GetCurrentViewer()->GetViewParameters(); + } + } + // WindowSizeHint and XGeometryString are picked up from the vis // manager in the G4VViewer constructor. In G4VisManager, after Viewer // creation, we will store theses parameters in G4ViewParameters. @@ -1048,7 +1050,13 @@ void G4VisCommandViewerCreate::SetNewValue (G4UIcommand* command, G4String newVa fpVisManager -> CreateViewer (newName,windowSizeHintString); G4VViewer* newViewer = fpVisManager -> GetCurrentViewer (); + if (newViewer && newViewer -> GetName () == newName) { + if (fThereWasAViewer) { + G4ViewParameters vp = newViewer->GetViewParameters(); + CopyMostViewParameters(vp, fVPExistingViewer); + fpVisManager->GetCurrentViewer()->SetViewParameters(vp); + } if (verbosity >= G4VisManager::confirmations) { G4cout << "New viewer \"" << newName << "\" created." << G4endl; } @@ -1344,7 +1352,7 @@ void G4VisCommandViewerInterpolate::SetNewValue (G4UIcommand*, G4String newValue // Assume user has specified a Unix "glob" pattern in leaf // Default pattern is *.g4view, which translates to ^.*\\.g4view // Convert pattern into a regexp - G4String regexp_pattern('^'); + G4String regexp_pattern("^"); for (size_t i = 0; i < pattern.length(); ++i) { if (pattern[i] == '.') { regexp_pattern += "\\."; @@ -1918,7 +1926,7 @@ void G4VisCommandViewerSave::SetNewValue (G4UIcommand*, G4String newValue) { WriteCommands(G4cout,vp,stp); } else { // Write to file - but add extension if not prescribed - if (!filename.contains('.')) { + if (!G4StrUtil::contains(filename, '.')) { // No extension supplied - add .g4view filename += ".g4view"; } diff --git a/source/visualization/management/src/G4VisCommandsViewerSet.cc b/source/visualization/management/src/G4VisCommandsViewerSet.cc index 7d4dd5a038..082d98e080 100644 --- a/source/visualization/management/src/G4VisCommandsViewerSet.cc +++ b/source/visualization/management/src/G4VisCommandsViewerSet.cc @@ -697,11 +697,8 @@ void G4VisCommandsViewerSet::SetNewValue } return; } - // Copy view parameters except for autoRefresh... - G4bool currentAutoRefresh = - currentViewer->GetViewParameters().IsAutoRefresh(); - vp = fromViewer->GetViewParameters(); - vp.SetAutoRefresh(currentAutoRefresh); + // Copy view parameters except for autoRefresh and background... + CopyMostViewParameters(vp, fromViewer->GetViewParameters()); // Concatenate any private vis attributes modifiers... const std::vector* privateVAMs = fromViewer->GetPrivateVisAttributesModifiers(); @@ -1182,9 +1179,9 @@ void G4VisCommandsViewerSet::SetNewValue std::istringstream is (newValue); is >> choice >> x >> y >> z >> unit >> nx >> ny >> nz; G4int iSelector = -1; - if (choice.compareTo("off",G4String::ignoreCase) == 0 || + if (G4StrUtil::icompare(choice, "off") == 0 || !G4UIcommand::ConvertToBool(choice)) iSelector = 0; - if (choice.compareTo("on",G4String::ignoreCase) == 0 || + if (G4StrUtil::icompare(choice, "on") == 0 || G4UIcommand::ConvertToBool(choice)) iSelector = 1; if (iSelector < 0) { if (verbosity >= G4VisManager::errors) { @@ -1234,7 +1231,7 @@ void G4VisCommandsViewerSet::SetNewValue else if (command == fpCommandSpecialMeshVolumes) { std::vector requestedMeshes; - if (newValue.isNull()) { + if (newValue.empty()) { vp.SetSpecialMeshVolumes(requestedMeshes); // Empty list } else { // Algorithm from Josuttis p.476. diff --git a/source/visualization/management/src/G4VisManager.cc b/source/visualization/management/src/G4VisManager.cc index 900ab9413e..6d881eb14a 100644 --- a/source/visualization/management/src/G4VisManager.cc +++ b/source/visualization/management/src/G4VisManager.cc @@ -38,6 +38,7 @@ #include "G4VisCommandsSet.hh" #include "G4VisCommandsScene.hh" #include "G4VisCommandsSceneAdd.hh" +#include "G4VisCommandsPlotter.hh" #include "G4VisCommandsSceneHandler.hh" #include "G4VisCommandsTouchable.hh" #include "G4VisCommandsTouchableSet.hh" @@ -189,8 +190,10 @@ G4VisManager::G4VisManager (const G4String& verbosityString): // Make top level command directory... // Vis commands should *not* be broadcast to threads (2nd argument). - G4UIcommand* directory = new G4UIdirectory ("/vis/",false); + auto directory = new G4UIdirectory ("/vis/",false); directory -> SetGuidance ("Visualization commands."); + // Request commands in name order + directory -> Sort(); // Ordering propagates to sub-directories fDirectoryList.push_back (directory); // Instantiate *basic* top level commands so that they can be used @@ -206,7 +209,6 @@ G4VisManager::~G4VisManager() { G4UImanager* UImanager = G4UImanager::GetUIpointer(); UImanager->SetCoutDestination(nullptr); - fpInstance = 0; size_t i; for (i = 0; i < fSceneList.size (); ++i) { delete fSceneList[i]; @@ -236,6 +238,7 @@ G4VisManager::~G4VisManager() delete fpHitFilterMgr; delete fpTrajFilterMgr; delete fpTrajDrawModelMgr; + fpInstance = 0; } G4VisManager* G4VisManager::GetInstance () { @@ -512,6 +515,7 @@ void G4VisManager::RegisterMessengers () { RegisterMessenger(new G4VisCommandSceneEndOfRunAction); RegisterMessenger(new G4VisCommandSceneList); RegisterMessenger(new G4VisCommandSceneNotifyHandlers); + RegisterMessenger(new G4VisCommandSceneRemoveModel); RegisterMessenger(new G4VisCommandSceneSelect); RegisterMessenger(new G4VisCommandSceneShowExtents); @@ -536,6 +540,7 @@ void G4VisManager::RegisterMessengers () { RegisterMessenger(new G4VisCommandSceneAddLogo); RegisterMessenger(new G4VisCommandSceneAddLogo2D); RegisterMessenger(new G4VisCommandSceneAddMagneticField); + RegisterMessenger(new G4VisCommandSceneAddPlotter); RegisterMessenger(new G4VisCommandSceneAddPSHits); RegisterMessenger(new G4VisCommandSceneAddScale); RegisterMessenger(new G4VisCommandSceneAddText); @@ -544,6 +549,17 @@ void G4VisManager::RegisterMessengers () { RegisterMessenger(new G4VisCommandSceneAddUserAction); RegisterMessenger(new G4VisCommandSceneAddVolume); + RegisterMessenger(new G4VisCommandPlotterCreate); + RegisterMessenger(new G4VisCommandPlotterSetLayout); + RegisterMessenger(new G4VisCommandPlotterAddStyle); + RegisterMessenger(new G4VisCommandPlotterAddRegionStyle); + RegisterMessenger(new G4VisCommandPlotterAddRegionParameter); + RegisterMessenger(new G4VisCommandPlotterClear); + RegisterMessenger(new G4VisCommandPlotterClearRegion); + RegisterMessenger(new G4VisCommandPlotterList); + RegisterMessenger(new G4VisCommandPlotterAddRegionH1); + RegisterMessenger(new G4VisCommandPlotterAddRegionH2); + directory = new G4UIdirectory ("/vis/sceneHandler/"); directory -> SetGuidance ("Operations on Geant4 scene handlers."); fDirectoryList.push_back (directory); @@ -955,12 +971,6 @@ void G4VisManager::Draw (const G4Polymarker& polymarker, DrawT (polymarker, objectTransform); } -void G4VisManager::Draw (const G4Scale& scale, - const G4Transform3D& objectTransform) -{ - DrawT (scale, objectTransform); -} - void G4VisManager::Draw (const G4Square& square, const G4Transform3D& objectTransform) { @@ -1306,12 +1316,17 @@ void G4VisManager::GeometryHasChanged () { << "\n Use \"/vis/scene/add/volume\" or create a new scene." << G4endl; } - fpSceneHandler->ClearTransientStore(); - fpSceneHandler->ClearStore(); - fpViewer->NeedKernelVisit(); - fpViewer->SetView(); - fpViewer->ClearView(); - fpViewer->FinishView(); + // Clean up + if (fpSceneHandler) { + fpSceneHandler->ClearTransientStore(); + fpSceneHandler->ClearStore(); + if (fpViewer) { + fpViewer->NeedKernelVisit(); + fpViewer->SetView(); + fpViewer->ClearView(); + fpViewer->FinishView(); + } + } } } @@ -1570,6 +1585,13 @@ void G4VisManager::SetCurrentSceneHandler (G4VSceneHandler* pSceneHandler) { void G4VisManager::SetCurrentViewer (G4VViewer* pViewer) { fpViewer = pViewer; + if (fpViewer == nullptr) { + if (fVerbosity >= confirmations) { + G4cout << "G4VisManager::SetCurrentViewer: current viewer pointer zeroed " + << G4endl; + } + return; + } if (fVerbosity >= confirmations) { G4cout << "G4VisManager::SetCurrentViewer: viewer now " << pViewer -> GetName () @@ -2132,7 +2154,7 @@ void G4VisManager::EndOfEvent () G4int maxNumberOfKeptEvents = fpScene->GetMaxNumberOfKeptEvents(); - if (maxNumberOfKeptEvents > 0 && + if (maxNumberOfKeptEvents >= 0 && fNKeepRequests >= maxNumberOfKeptEvents) { fEventKeepingSuspended = true; @@ -2343,9 +2365,8 @@ void G4VisManager::ResetTransientsDrawnFlags() } G4String G4VisManager::ViewerShortName (const G4String& viewerName) const { - G4String viewerShortName (viewerName); - viewerShortName = viewerShortName (0, viewerShortName.find (' ')); - return viewerShortName.strip (); + G4String viewerShortName = viewerName.substr(0, viewerName.find (' ')); + return G4StrUtil::strip_copy(viewerShortName); } G4VViewer* G4VisManager::GetViewer (const G4String& viewerName) const { @@ -2388,15 +2409,15 @@ G4String G4VisManager::VerbosityString(Verbosity verbosity) { G4VisManager::Verbosity G4VisManager::GetVerbosityValue(const G4String& verbosityString) { - G4String ss(verbosityString); ss.toLower(); + G4String ss = G4StrUtil::to_lower_copy(verbosityString); Verbosity verbosity; - if (ss(0) == 'q') verbosity = quiet; - else if (ss(0) == 's') verbosity = startup; - else if (ss(0) == 'e') verbosity = errors; - else if (ss(0) == 'w') verbosity = warnings; - else if (ss(0) == 'c') verbosity = confirmations; - else if (ss(0) == 'p') verbosity = parameters; - else if (ss(0) == 'a') verbosity = all; + if (ss[0] == 'q') verbosity = quiet; + else if (ss[0] == 's') verbosity = startup; + else if (ss[0] == 'e') verbosity = errors; + else if (ss[0] == 'w') verbosity = warnings; + else if (ss[0] == 'c') verbosity = confirmations; + else if (ss[0] == 'p') verbosity = parameters; + else if (ss[0] == 'a') verbosity = all; else { G4int intVerbosity; std::istringstream is(ss); diff --git a/source/visualization/modeling/History b/source/visualization/modeling/History index 5e7581728b..abd7084f10 100644 --- a/source/visualization/modeling/History +++ b/source/visualization/modeling/History @@ -19,6 +19,67 @@ committal in the CVS repository ! History file for visualization/modeling --------------------------------------- +05 November 2021 John Allison (modeling-V10-07-16) +- Fix bug in G4PhysicalVolumeModel::CalculateExtent. + - The extent was being calculated solely in the reference frame of the + top physical volume. It needs to be transformed into the global + coordinate system. + - This impacts views that contain more than one top physical volume, e.g: + - if you `/vis/drawVolume ` to an already existing + scene; + - if you `/vis/viewer/centreOn ` or + `/vis/viewer/centreOn /reg-exp/` (similarly `centreAndZoomInOn`) + that identify more than one touchable with that name. + +25 October 2021 Guy Barrand (modeling-V10-07-15) +- sources.cmake: declare G4PlotterModel.hh,.cc. +- G4PlotterModel.hh,.cc: a model to handle a G4Plotter in a scene. +- G4PseudoScene.hh: default implementation of AddPrimitive(const G4Plotter&). + +10 October 2021 John Allison (modeling-V10-07-14) +- As a result of Coverity warnings, improve the health of... + - G4PhysicalVolumeModel: + - Clean up tempVisAtts in case of found G4Mesh. + - Hold current transform as object, not as a pointer. + - G4TouchablePropertiesScene.cc: + - Migrate to the above. + +06 July 2021 John Allison (modeling-V10-07-13) +- G4AxesModel.cc: + o Fix model name (somehow forgot to set name, so it picked up a default + name from the base class). + +05 July 2021 John Allison (modeling-V10-07-12) +- G4PhysicalVolumeModel: + o Make CalculateExtent a public function. + o G4PhysicalVolumeModel::Validate: + . Avoid crash if volume no longer in physical volume store. + . Improve warning message. + +30 June 2021 John Allison (modeling-V10-07-11) +- Requires greps-V10-07-09. +- Revise vis models. + o Over time, the vis models have sprouted some inconsistencies. This + is an attempt to rationalise them. The most significant model - used + in all applications to draw the detector - is G4PhysicaVolumeModel. To + handle all the options, G4PhysicalVolumeModel takes care of the + transformation of any primitives that it generates. It ignores the + transformation available in the base class, G4VModel. This revision + brings all models in line with this policy. + o This implies the following: + . The data member G4VModel::fTransform and accessors are removed; + . Those models that need to keep a transformation now have their own + fTransform. + o Note: This may also fix some Coverity warnings. + o At the same time, we remove G4Scale and G4ScaleModel. G4Scale is an + anomaly. It is not a "primitive" (obviously), but somehow, from the long + distant past, it was implemented as though it was. These classes have been + removed and /vis/scene/add/scale reimplemented with G4CallBackModel. + 15 June 2021 John Allison (modeling-V10-07-10) - G4PhysicalVolumeModel.cc: o Move fFullPVPath.push_back earlier - fixes vis touchables bug. diff --git a/source/visualization/modeling/README b/source/visualization/modeling/README deleted file mode 100644 index 1a02c17078..0000000000 --- a/source/visualization/modeling/README +++ /dev/null @@ -1,6 +0,0 @@ -Modeling -======= - -The idea is to put GEANT4-aware but user-enviroment-independent code -here. It introduces the concept of a G4VModel. - diff --git a/source/visualization/modeling/include/G4ArrowModel.hh b/source/visualization/modeling/include/G4ArrowModel.hh index 2a60bfdbf2..2590a03655 100644 --- a/source/visualization/modeling/include/G4ArrowModel.hh +++ b/source/visualization/modeling/include/G4ArrowModel.hh @@ -52,12 +52,11 @@ public: // With description G4double x2, G4double y2, G4double z2, G4double width, const G4Colour& colour, const G4String& description = "", - G4int lineSegmentsPerCircle = 6); + G4int lineSegmentsPerCircle = 6, + const G4Transform3D& transform = G4Transform3D()); virtual ~G4ArrowModel (); - void SetTransformation (const G4Transform3D& transform) override; - void DescribeYourselfTo (G4VGraphicsScene&) override; // The main task of a model is to describe itself to the graphics scene. @@ -69,9 +68,7 @@ private: G4Polyhedron* fpShaftPolyhedron; G4Polyhedron* fpHeadPolyhedron; - - G4Polyhedron* fpShaftPolyhedronOrig; - G4Polyhedron* fpHeadPolyhedronOrig; + G4Transform3D fTransform; }; #endif diff --git a/source/visualization/modeling/include/G4AttValueFilterT.hh b/source/visualization/modeling/include/G4AttValueFilterT.hh index 64a4d7f9a1..f0e6540b78 100644 --- a/source/visualization/modeling/include/G4AttValueFilterT.hh +++ b/source/visualization/modeling/include/G4AttValueFilterT.hh @@ -113,7 +113,7 @@ template G4bool G4AttValueFilterT::GetValidElement(const G4AttValue& attValue, G4String& element) const { - T value; + T value{}; G4String input = attValue.GetValue(); if (!G4ConversionUtils::Convert(input, value)) ConversionErrorPolicy::ReportError(input, "Invalid format. Was the input data formatted correctly ?"); @@ -141,7 +141,7 @@ template G4bool G4AttValueFilterT::Accept(const G4AttValue& attValue) const { - T value; + T value{}; G4String input = attValue.GetValue(); if (!G4ConversionUtils::Convert(input, value)) ConversionErrorPolicy::ReportError(input, "Invalid format. Was the input data formatted correctly ?"); @@ -163,8 +163,8 @@ template void G4AttValueFilterT::LoadIntervalElement(const G4String& input) { - T min; - T max; + T min{}; + T max{}; if (!G4ConversionUtils::Convert(input, min, max)) ConversionErrorPolicy::ReportError(input, "Invalid format. Was the input data formatted correctly ?"); @@ -176,7 +176,7 @@ template void G4AttValueFilterT::LoadSingleValueElement(const G4String& input) { - T output; + T output{}; if (!G4ConversionUtils::Convert(input, output)) ConversionErrorPolicy::ReportError(input, "Invalid format. Was the input data formatted correctly ?"); diff --git a/source/visualization/modeling/include/G4AttributeFilterT.hh b/source/visualization/modeling/include/G4AttributeFilterT.hh index 84d6bc4b88..607216a894 100644 --- a/source/visualization/modeling/include/G4AttributeFilterT.hh +++ b/source/visualization/modeling/include/G4AttributeFilterT.hh @@ -100,7 +100,7 @@ G4bool G4AttributeFilterT::Evaluate(const T& object) const { // Return true (i.e., do not filter out) if attribute name has not yet been set. - if (fAttName.isNull()) return true; + if (fAttName.empty()) return true; // ...or required attribute value has not yet been set if (fConfigVect.size() == 0) return true; diff --git a/source/visualization/modeling/include/G4AxesModel.hh b/source/visualization/modeling/include/G4AxesModel.hh index 15f8887443..a91510370e 100644 --- a/source/visualization/modeling/include/G4AxesModel.hh +++ b/source/visualization/modeling/include/G4AxesModel.hh @@ -51,12 +51,25 @@ public: // With description const G4String& colourString = "auto", const G4String& description = "", G4bool withAnnotation = true, - G4double textSize = 10. + G4double textSize = 10., + const G4Transform3D& transform = G4Transform3D() ); - + + // Alternative short constructor + G4AxesModel + (G4double x0, G4double y0, G4double z0, G4double length, + const G4Transform3D& transform = G4Transform3D() + ); + virtual ~G4AxesModel (); - void SetTransformation (const G4Transform3D& transform) override; + void Construct + (G4double x0, G4double y0, G4double z0, G4double length, + G4double arrowWidth, const G4String& colourString, + const G4String& description, + G4bool withAnnotation, + G4double textSize, + const G4Transform3D& transform); void DescribeYourselfTo (G4VGraphicsScene&) override; // The main task of a model is to describe itself to the graphics scene. @@ -71,6 +84,7 @@ private: *fXAxisModel, *fXLabelModel, *fXAnnotationModel, *fYAxisModel, *fYLabelModel, *fYAnnotationModel, *fZAxisModel, *fZLabelModel, *fZAnnotationModel; + G4Transform3D fTransform; }; #endif diff --git a/source/visualization/modeling/include/G4CallbackModel.hh b/source/visualization/modeling/include/G4CallbackModel.hh index 3f32b214b2..e5ad207598 100644 --- a/source/visualization/modeling/include/G4CallbackModel.hh +++ b/source/visualization/modeling/include/G4CallbackModel.hh @@ -59,7 +59,7 @@ template class G4CallbackModel: public G4VModel { fFunction(function) {} ~G4CallbackModel() {} void DescribeYourselfTo(G4VGraphicsScene& sceneHandler) { - (*fFunction)(sceneHandler, fTransform, fpMP); + (*fFunction)(sceneHandler, fpMP); } protected: diff --git a/source/visualization/modeling/include/G4DigiModel.hh b/source/visualization/modeling/include/G4DigiModel.hh index a7d99ead81..e37080f751 100644 --- a/source/visualization/modeling/include/G4DigiModel.hh +++ b/source/visualization/modeling/include/G4DigiModel.hh @@ -48,7 +48,7 @@ class G4DigiModel: public G4VModel { public: // With description G4DigiModel (); - + virtual ~G4DigiModel (); virtual void DescribeYourselfTo (G4VGraphicsScene&); diff --git a/source/visualization/modeling/include/G4PhysicalVolumeModel.hh b/source/visualization/modeling/include/G4PhysicalVolumeModel.hh index fabfebbcc0..f83c5c1c8a 100644 --- a/source/visualization/modeling/include/G4PhysicalVolumeModel.hh +++ b/source/visualization/modeling/include/G4PhysicalVolumeModel.hh @@ -177,6 +177,9 @@ public: // With description G4int GetCurrentDepth() const {return fCurrentDepth;} // Current depth in geom. hierarchy. + const G4Transform3D& GetTransformation() const {return fTransform;} + // Initial transformation + G4VPhysicalVolume* GetCurrentPV() const {return fpCurrentPV;} // Current physical volume. @@ -189,7 +192,7 @@ public: // With description G4Material* GetCurrentMaterial() const {return fpCurrentMaterial;} // Current material. - G4Transform3D* GetCurrentTransform() const {return fpCurrentTransform;} + const G4Transform3D& GetCurrentTransform() const {return fCurrentTransform;} // Current transform. const std::vector& GetBaseFullPVPath() const @@ -251,6 +254,8 @@ public: // With description void CurtailDescent() const {fCurtailDescent = true;} // Curtail descent of current branch. + void CalculateExtent (); + protected: void VisitGeometryAndGetVisReps (G4VPhysicalVolume*, @@ -271,8 +276,6 @@ protected: const G4VisAttributes* pVisAttribs, G4VGraphicsScene& sceneHandler); - void CalculateExtent (); - ///////////////////////////////////////////////////////// // Data members... @@ -282,12 +285,13 @@ protected: G4int fRequestedDepth; // Requested depth of geom. hierarchy search. G4bool fUseFullExtent; // ...if requested. + G4Transform3D fTransform; // Initial transform G4int fCurrentDepth; // Current depth of geom. hierarchy. G4VPhysicalVolume* fpCurrentPV; // Current physical volume. G4int fCurrentPVCopyNo; // Current copy number. G4LogicalVolume* fpCurrentLV; // Current logical volume. - G4Material* fpCurrentMaterial; // Current material. - G4Transform3D* fpCurrentTransform; // Current transform. + G4Material* fpCurrentMaterial; // Current material. + G4Transform3D fCurrentTransform; // Current transform. std::vector fBaseFullPVPath; // Base. May be empty. std::vector fFullPVPath; // Starts from base. std::vector fDrawnPVPath; // Omits culled volumes. diff --git a/source/visualization/VRML/include/G4VRML1FileViewer.hh b/source/visualization/modeling/include/G4PlotterModel.hh similarity index 74% rename from source/visualization/VRML/include/G4VRML1FileViewer.hh rename to source/visualization/modeling/include/G4PlotterModel.hh index b6615b59e9..050c33d33f 100644 --- a/source/visualization/VRML/include/G4VRML1FileViewer.hh +++ b/source/visualization/modeling/include/G4PlotterModel.hh @@ -23,32 +23,29 @@ // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // +// Guy Barrand 25th September 2021 // -// -// G4VRML1FileViewer.hh -// Satoshi Tanaka and Yasuhide Sawada -#ifndef G4VRML1FILE_VIEWER_HH -#define G4VRML1FILE_VIEWER_HH +#ifndef G4PLOTTERMODEL_HH +#define G4PLOTTERMODEL_HH -#include "G4VViewer.hh" -#include "globals.hh" +#include "G4VModel.hh" -class G4VRML1FileSceneHandler; +#include "G4Plotter.hh" -class G4VRML1FileViewer: public G4VViewer { +class G4PlotterModel: public G4VModel { public: - G4VRML1FileViewer(G4VRML1FileSceneHandler& scene, const G4String& name = ""); - virtual ~G4VRML1FileViewer(); - void ClearView(); - void DrawView(); - void ShowView(); - void FinishView(); -private: - void SetView(); + G4PlotterModel(G4Plotter& plotter,const G4String& global_description = "",const G4Transform3D& transform = G4Transform3D()); + virtual ~G4PlotterModel () = default; + void DescribeYourselfTo (G4VGraphicsScene&) override; + G4Plotter& plotter() {return fPlotter;} private: - G4VRML1FileSceneHandler& fSceneHandler; // Reference to Graphics Scene for this view. + G4PlotterModel (const G4PlotterModel&); + G4PlotterModel& operator = (const G4PlotterModel&); + + G4Plotter& fPlotter; + G4Transform3D fTransform; }; -#endif //G4VRML1File_VIEW_HH +#endif diff --git a/source/visualization/modeling/include/G4PseudoScene.hh b/source/visualization/modeling/include/G4PseudoScene.hh index ba95af227d..16e16bdf3c 100644 --- a/source/visualization/modeling/include/G4PseudoScene.hh +++ b/source/visualization/modeling/include/G4PseudoScene.hh @@ -87,13 +87,14 @@ public: void BeginPrimitives2D (const G4Transform3D&) {} void EndPrimitives2D () {} void AddPrimitive (const G4Polyline&) {} - void AddPrimitive (const G4Scale&) {} void AddPrimitive (const G4Text&) {} void AddPrimitive (const G4Circle&) {} void AddPrimitive (const G4Square&) {} void AddPrimitive (const G4Polymarker&) {} void AddPrimitive (const G4Polyhedron&) {} + void AddPrimitive (const G4Plotter&) {} + protected: virtual void ProcessVolume (const G4VSolid&); diff --git a/source/visualization/modeling/include/G4TextModel.hh b/source/visualization/modeling/include/G4TextModel.hh index 24155d16c2..4600f88f9d 100644 --- a/source/visualization/modeling/include/G4TextModel.hh +++ b/source/visualization/modeling/include/G4TextModel.hh @@ -46,12 +46,10 @@ class G4TextModel: public G4VModel { public: // With description - G4TextModel (const G4Text&); + G4TextModel (const G4Text&, const G4Transform3D& = G4Transform3D()); virtual ~G4TextModel (); - void SetTransformation (const G4Transform3D& transform) override; - void DescribeYourselfTo (G4VGraphicsScene&) override; // The main task of a model is to describe itself to the graphics scene. @@ -62,7 +60,6 @@ private: G4TextModel& operator = (const G4TextModel&); G4Text fG4Text; - G4Text fG4TextOrig; }; diff --git a/source/visualization/modeling/include/G4VModel.hh b/source/visualization/modeling/include/G4VModel.hh index e9d7d71bc5..9ed2ab5b5d 100644 --- a/source/visualization/modeling/include/G4VModel.hh +++ b/source/visualization/modeling/include/G4VModel.hh @@ -36,22 +36,12 @@ // to a scene handler. A scene is a collection of models. // A special case is made for G4PhysicalVolumeModel - a non-null pointer // is to be returned by G4PhysicalVolumeModel::GetG4PhysicalVolumeModel(). -// -// The model must take care of the required transformation itself - thus the -// models components should be transformed before delivering to the scene -// handler. The model could receive the transformation in its constructor, -// e.g., G4PhysicalVolumeModel, or handle it in the model's SetTransformation, -// e.g., in G4AxesModel (relatively simple) or in G4ArrowModel (quite -// complicated). This avoids having to transform the components perhaps -// multiple times. The reasons for this are mainly to do with how we implement -// G4PhysicalVolumeModel #ifndef G4VMODEL_HH #define G4VMODEL_HH #include "globals.hh" #include "G4VisExtent.hh" -#include "G4Transform3D.hh" class G4VGraphicsScene; class G4ModelingParameters; @@ -64,9 +54,7 @@ public: // With description friend std::ostream& operator << (std::ostream& os, const G4VModel&); - G4VModel - (const G4Transform3D& modelTransformation = G4Transform3D(), - const G4ModelingParameters* = 0); + G4VModel(const G4ModelingParameters* = 0); virtual ~G4VModel (); @@ -89,27 +77,18 @@ public: // With description const G4VisExtent& GetExtent () const; // Extent of visible objects in local coordinate system. - const G4VisExtent& GetTransformedExtent () const; - // Extent of visible objects in transformed coordinate system. - const G4String& GetGlobalDescription () const; // A description which does not change and lasts the life of the model. const G4String& GetGlobalTag () const; // A tag which does not change and lasts the life of the model. - const G4Transform3D& GetTransformation () const; - // Model transformation, i.e., position and orientation of model in - // world. It is the responsibility of the model to apply this - // transformation before passing items to the graphics scene. - // Set methods for above... void SetModelingParameters (const G4ModelingParameters*); void SetExtent (const G4VisExtent&); void SetType (const G4String&); void SetGlobalDescription (const G4String&); void SetGlobalTag (const G4String&); - virtual void SetTransformation (const G4Transform3D&); virtual G4bool Validate (G4bool warn = true); // Validate, but allow internal changes (hence non-const function). @@ -120,7 +99,6 @@ protected: G4String fGlobalTag; G4String fGlobalDescription; G4VisExtent fExtent; - G4Transform3D fTransform; const G4ModelingParameters* fpMP; private: diff --git a/source/visualization/modeling/include/G4VModel.icc b/source/visualization/modeling/include/G4VModel.icc index 1c4986e4e7..19c9ebbe37 100644 --- a/source/visualization/modeling/include/G4VModel.icc +++ b/source/visualization/modeling/include/G4VModel.icc @@ -49,10 +49,6 @@ inline const G4VisExtent& G4VModel::GetExtent () const { return fExtent; } -inline const G4Transform3D& G4VModel::GetTransformation () const { - return fTransform; -} - inline void G4VModel::SetModelingParameters (const G4ModelingParameters* pMP) { fpMP = pMP; } diff --git a/source/visualization/modeling/sources.cmake b/source/visualization/modeling/sources.cmake index 2177ac7e3e..df313def75 100644 --- a/source/visualization/modeling/sources.cmake +++ b/source/visualization/modeling/sources.cmake @@ -19,6 +19,7 @@ geant4_add_module(G4modeling G4HitsModel.hh G4LogicalVolumeModel.hh G4MagneticFieldModel.hh + G4PlotterModel.hh G4Mesh.hh G4ModelApplyCommandsT.hh G4ModelColourMap.hh @@ -34,7 +35,6 @@ geant4_add_module(G4modeling G4PhysicalVolumeSearchScene.hh G4PhysicalVolumesSearchScene.hh G4PseudoScene.hh - G4ScaleModel.hh G4TextModel.hh G4TouchablePropertiesScene.hh G4TouchableUtils.hh @@ -75,6 +75,7 @@ geant4_add_module(G4modeling G4HitsModel.cc G4LogicalVolumeModel.cc G4MagneticFieldModel.cc + G4PlotterModel.cc G4Mesh.cc G4ModelingParameters.cc G4NullModel.cc @@ -84,7 +85,6 @@ geant4_add_module(G4modeling G4PhysicalVolumeSearchScene.cc G4PhysicalVolumesSearchScene.cc G4PseudoScene.cc - G4ScaleModel.cc G4TextModel.cc G4TouchablePropertiesScene.cc G4TouchableUtils.cc diff --git a/source/visualization/modeling/src/G4ArrowModel.cc b/source/visualization/modeling/src/G4ArrowModel.cc index b24dc2b7b5..503772e81f 100644 --- a/source/visualization/modeling/src/G4ArrowModel.cc +++ b/source/visualization/modeling/src/G4ArrowModel.cc @@ -46,8 +46,6 @@ G4ArrowModel::~G4ArrowModel () { delete fpHeadPolyhedron; delete fpShaftPolyhedron; - delete fpHeadPolyhedronOrig; - delete fpShaftPolyhedronOrig; } G4ArrowModel::G4ArrowModel @@ -55,11 +53,11 @@ G4ArrowModel::G4ArrowModel G4double x2, G4double y2, G4double z2, G4double width, const G4Colour& colour, const G4String& description, - G4int lineSegmentsPerCircle) + G4int lineSegmentsPerCircle, + const G4Transform3D& transform) : fpShaftPolyhedron(nullptr) , fpHeadPolyhedron(nullptr) -, fpShaftPolyhedronOrig(nullptr) -, fpHeadPolyhedronOrig(nullptr) +, fTransform(transform) { fType = "G4ArrowModel"; fGlobalTag = fType; @@ -127,33 +125,10 @@ G4ArrowModel::G4ArrowModel G4Polyhedron::SetNumberOfRotationSteps(tempN); } -void G4ArrowModel::SetTransformation (const G4Transform3D& transform) -{ - fTransform = transform; // A new transform - - if (fpShaftPolyhedron) { - if (fpShaftPolyhedronOrig == nullptr) { // Must be first time - fpShaftPolyhedronOrig = new G4Polyhedron(*fpShaftPolyhedron); - } - delete fpShaftPolyhedron; // Has transformation of old transfrom - fpShaftPolyhedron = new G4Polyhedron(*fpShaftPolyhedronOrig); - fpShaftPolyhedron->Transform(fTransform); - } - - if (fpHeadPolyhedron) { - if (fpHeadPolyhedronOrig == nullptr) { // Must be first time - fpHeadPolyhedronOrig = new G4Polyhedron(*fpHeadPolyhedron); - } - delete fpHeadPolyhedron; // Has transformation of old transfrom - fpHeadPolyhedron = new G4Polyhedron(*fpHeadPolyhedronOrig); - fpHeadPolyhedron->Transform(fTransform); - } -} - void G4ArrowModel::DescribeYourselfTo (G4VGraphicsScene& sceneHandler) { if (fpShaftPolyhedron && fpHeadPolyhedron) { - sceneHandler.BeginPrimitives(); + sceneHandler.BeginPrimitives(fTransform); sceneHandler.AddPrimitive(*fpShaftPolyhedron); sceneHandler.AddPrimitive(*fpHeadPolyhedron); sceneHandler.EndPrimitives(); diff --git a/source/visualization/modeling/src/G4AxesModel.cc b/source/visualization/modeling/src/G4AxesModel.cc index 830147e1c3..31d6a0c7e3 100644 --- a/source/visualization/modeling/src/G4AxesModel.cc +++ b/source/visualization/modeling/src/G4AxesModel.cc @@ -58,18 +58,52 @@ G4AxesModel::G4AxesModel G4double arrowWidth, const G4String& colourString, const G4String& description, G4bool withAnnotation, - G4double textSize): - fXAxisModel(0), - fXLabelModel(0), - fXAnnotationModel(0), - fYAxisModel(0), - fYLabelModel(0), - fYAnnotationModel(0), - fZAxisModel(0), - fZLabelModel(0), - fZAnnotationModel(0) + G4double textSize, + const G4Transform3D& transform) { - fType = "G4AxesModel"; + Construct + (x0,y0,z0,length,arrowWidth, + colourString,description,withAnnotation,textSize, + transform); +} + +// Alternative short constructor +G4AxesModel::G4AxesModel +(G4double x0, G4double y0, G4double z0, G4double length, + const G4Transform3D& transform) +{ + G4double arrowWidth = 1.; + const G4String& colourString = "auto"; + const G4String& description = ""; + G4bool withAnnotation = true; + G4double textSize = 10.; + Construct + (x0,y0,z0,length,arrowWidth, + colourString,description,withAnnotation,textSize, + transform); +} + +void G4AxesModel::Construct +(G4double x0, G4double y0, G4double z0, G4double length, + G4double arrowWidth, const G4String& colourString, + const G4String& description, + G4bool withAnnotation, + G4double textSize, + const G4Transform3D& transform) +{ + fXAxisModel = nullptr; + fXLabelModel = nullptr; + fXAnnotationModel = nullptr; + fYAxisModel = nullptr; + fYLabelModel = nullptr; + fYAnnotationModel = nullptr; + fZAxisModel = nullptr; + fZLabelModel = nullptr; + fZAnnotationModel = nullptr; + + fTransform = transform; + + fType = "Axes"; fGlobalTag = fType; fGlobalDescription = fType + ": " + description; fExtent = G4VisExtent @@ -93,12 +127,14 @@ G4AxesModel::G4AxesModel G4Text* text = 0; G4VisAttributes* va = 0; + G4int lineSegmentsPerCircle = 6; G4Colour xColour(colour); if (autoColour) xColour = G4Colour::Red(); fXAxisModel = new G4ArrowModel (x0, y0, z0, x0+length, y0, z0, arrowWidth, - xColour, "x-axis: " + description); + xColour, "x-axis: " + description, + lineSegmentsPerCircle, fTransform); if (withAnnotation) { text = new G4Text("x",G4Point3D(x0+1.05*length, y0, z0)); text->SetScreenSize(textSize); @@ -106,7 +142,7 @@ G4AxesModel::G4AxesModel text->SetLayout(G4Text::centre); va = new G4VisAttributes(xColour); text->SetVisAttributes(va); - fXLabelModel = new G4TextModel(*text); + fXLabelModel = new G4TextModel(*text,fTransform); delete text; text = new G4Text(annotation,G4Point3D(x0+0.8*length, y0, z0)); text->SetScreenSize(textSize); @@ -114,7 +150,7 @@ G4AxesModel::G4AxesModel text->SetLayout(G4Text::centre); va = new G4VisAttributes(xColour); text->SetVisAttributes(va); - fXAnnotationModel = new G4TextModel(*text); + fXAnnotationModel = new G4TextModel(*text,fTransform); delete text; } @@ -122,7 +158,8 @@ G4AxesModel::G4AxesModel if (autoColour) yColour = G4Colour::Green(); fYAxisModel = new G4ArrowModel (x0, y0, z0, x0, y0+length, z0, arrowWidth, - yColour, "y-axis: " + description); + yColour, "y-axis: " + description, + lineSegmentsPerCircle, fTransform); if (withAnnotation) { text = new G4Text("y",G4Point3D(x0, y0+1.05*length, z0)); text->SetScreenSize(textSize); @@ -130,7 +167,7 @@ G4AxesModel::G4AxesModel text->SetLayout(G4Text::centre); va = new G4VisAttributes(yColour); text->SetVisAttributes(va); - fYLabelModel = new G4TextModel(*text); + fYLabelModel = new G4TextModel(*text,fTransform); delete text; text = new G4Text(annotation,G4Point3D(x0, y0+0.8*length, z0)); text->SetScreenSize(textSize); @@ -138,7 +175,7 @@ G4AxesModel::G4AxesModel text->SetLayout(G4Text::centre); va = new G4VisAttributes(yColour); text->SetVisAttributes(va); - fYAnnotationModel = new G4TextModel(*text); + fYAnnotationModel = new G4TextModel(*text,fTransform); delete text; } @@ -146,7 +183,8 @@ G4AxesModel::G4AxesModel if (autoColour) zColour = G4Colour::Blue(); fZAxisModel = new G4ArrowModel (x0, y0, z0, x0, y0, z0+length, arrowWidth, - zColour, "z-axis: " + description); + zColour, "z-axis: " + description, + lineSegmentsPerCircle, fTransform); if (withAnnotation) { text = new G4Text("z",G4Point3D(x0, y0, z0+1.05*length)); text->SetScreenSize(textSize); @@ -154,7 +192,7 @@ G4AxesModel::G4AxesModel text->SetLayout(G4Text::centre); va = new G4VisAttributes(zColour); text->SetVisAttributes(va); - fZLabelModel = new G4TextModel(*text); + fZLabelModel = new G4TextModel(*text,fTransform); delete text; text = new G4Text(annotation,G4Point3D(x0, y0, z0+0.8*length)); text->SetScreenSize(textSize); @@ -162,28 +200,11 @@ G4AxesModel::G4AxesModel text->SetLayout(G4Text::centre); va = new G4VisAttributes(zColour); text->SetVisAttributes(va); - fZAnnotationModel = new G4TextModel(*text); + fZAnnotationModel = new G4TextModel(*text,fTransform); delete text; } } -void G4AxesModel::SetTransformation (const G4Transform3D& transform) -{ - fTransform = transform; - - if (fXAxisModel) fXAxisModel-> SetTransformation(fTransform); - if (fXLabelModel) fXLabelModel-> SetTransformation(fTransform); - if (fXAnnotationModel) fXAnnotationModel->SetTransformation(fTransform); - - if (fYAxisModel) fYAxisModel-> SetTransformation(fTransform); - if (fYLabelModel) fYLabelModel-> SetTransformation(fTransform); - if (fYAnnotationModel) fYAnnotationModel->SetTransformation(fTransform); - - if (fZAxisModel) fZAxisModel-> SetTransformation(fTransform); - if (fZLabelModel) fZLabelModel-> SetTransformation(fTransform); - if (fZAnnotationModel) fZAnnotationModel->SetTransformation(fTransform); -} - void G4AxesModel::DescribeYourselfTo (G4VGraphicsScene& sceneHandler) { if (fXAxisModel) fXAxisModel-> DescribeYourselfTo(sceneHandler); diff --git a/source/visualization/modeling/src/G4NullModel.cc b/source/visualization/modeling/src/G4NullModel.cc index 2da367aaf1..e17fe9627b 100644 --- a/source/visualization/modeling/src/G4NullModel.cc +++ b/source/visualization/modeling/src/G4NullModel.cc @@ -33,7 +33,7 @@ #include "G4NullModel.hh" G4NullModel::G4NullModel (const G4ModelingParameters* pMP): - G4VModel (G4Transform3D(), pMP) {} + G4VModel (pMP) {} G4NullModel::~G4NullModel () {} diff --git a/source/visualization/modeling/src/G4PhysicalVolumeModel.cc b/source/visualization/modeling/src/G4PhysicalVolumeModel.cc index 0b32470760..989e1ac7f4 100644 --- a/source/visualization/modeling/src/G4PhysicalVolumeModel.cc +++ b/source/visualization/modeling/src/G4PhysicalVolumeModel.cc @@ -63,21 +63,22 @@ namespace { G4PhysicalVolumeModel::G4PhysicalVolumeModel (G4VPhysicalVolume* pVPV , G4int requestedDepth - , const G4Transform3D& modelTransformation + , const G4Transform3D& modelTransform , const G4ModelingParameters* pMP , G4bool useFullExtent , const std::vector& baseFullPVPath) -: G4VModel (modelTransformation,pMP) +: G4VModel (pMP) , fpTopPV (pVPV) , fTopPVCopyNo (pVPV? pVPV->GetCopyNo(): 0) , fRequestedDepth (requestedDepth) , fUseFullExtent (useFullExtent) +, fTransform (modelTransform) , fCurrentDepth (0) , fpCurrentPV (fpTopPV) , fCurrentPVCopyNo (fpTopPV? fpTopPV->GetCopyNo(): 0) , fpCurrentLV (fpTopPV? fpTopPV->GetLogicalVolume(): 0) , fpCurrentMaterial (fpCurrentLV? fpCurrentLV->GetMaterial(): 0) -, fpCurrentTransform (const_cast(&modelTransformation)) +, fCurrentTransform (modelTransform) , fBaseFullPVPath (baseFullPVPath) , fAbort (false) , fCurtailDescent (false) @@ -172,6 +173,7 @@ void G4PhysicalVolumeModel::CalculateExtent () if (radius < 0.) { // Nothing in the scene - revert to top extent fExtent = fpTopPV -> GetLogicalVolume () -> GetSolid () -> GetExtent (); } + fExtent.Transform(fTransform); } void G4PhysicalVolumeModel::DescribeYourselfTo @@ -394,7 +396,7 @@ void G4PhysicalVolumeModel::DescribeAndDescend // Create a nodeID for use below - note the "drawn" flag is true G4int copyNo = fpCurrentPV->GetCopyNo(); auto nodeID = G4PhysicalVolumeNodeID - (fpCurrentPV,copyNo,fCurrentDepth,*fpCurrentTransform); + (fpCurrentPV,copyNo,fCurrentDepth,fCurrentTransform); // Update full path of physical volumes... fFullPVPath.push_back(nodeID); @@ -412,7 +414,7 @@ void G4PhysicalVolumeModel::DescribeAndDescend // not be accumulated. G4Transform3D theNewAT (theAT); if (fCurrentDepth != 0) theNewAT = theAT * theLT; - fpCurrentTransform = &theNewAT; + fCurrentTransform = theNewAT; const G4VisAttributes* pVisAttribs = pLV->GetVisAttributes(); // If the volume does not have any vis attributes, create it. @@ -584,6 +586,7 @@ void G4PhysicalVolumeModel::DescribeAndDescend sceneHandler.AddCompound(mesh); fFullPVPath.pop_back(); fDrawnPVPath.pop_back(); + delete tempVisAtts; // Needs cleaning up (Coverity warning!!) return; } // else continue processing } @@ -713,6 +716,7 @@ continue_processing: } } + // Clean up delete tempVisAtts; // Reset for normal descending of next volume at this level... @@ -840,10 +844,9 @@ G4bool G4PhysicalVolumeModel::Validate (G4bool warn) auto iterator = find(pvStore->begin(),pvStore->end(),fpTopPV); if (iterator == pvStore->end()) { if (warn) { - G4cerr << - "G4PhysicalVolumeModel::Validate(): No volume of name \"" - << fpTopPV->GetName() << "\" exists." - << G4endl; + G4ExceptionDescription ed; + ed << "Attempt to validate a volume that is no longer in the physical volume store."; + G4Exception("G4PhysicalVolumeModel::Validate", "modeling0015", JustWarning, ed); } return false; } else { @@ -1005,7 +1008,7 @@ std::vector* G4PhysicalVolumeModel::CreateCurrentAttValues() const const G4ThreeVector& localTranslation = fpCurrentPV->GetTranslation(); oss.str(""); oss << '\n' << G4Transform3D(localRotation,localTranslation); values->push_back(G4AttValue("LocalTrans", oss.str(),"")); - oss.str(""); oss << '\n' << *fpCurrentTransform; + oss.str(""); oss << '\n' << fCurrentTransform; values->push_back(G4AttValue("GlobalTrans", oss.str(),"")); G4String matName = fpCurrentMaterial? fpCurrentMaterial->GetName(): G4String("No material"); values->push_back(G4AttValue("Material", matName,"")); diff --git a/source/visualization/modeling/src/G4PhysicalVolumesSearchScene.cc b/source/visualization/modeling/src/G4PhysicalVolumesSearchScene.cc index 504f9ec34c..3cb2a090a5 100644 --- a/source/visualization/modeling/src/G4PhysicalVolumesSearchScene.cc +++ b/source/visualization/modeling/src/G4PhysicalVolumesSearchScene.cc @@ -101,7 +101,7 @@ G4PhysicalVolumesSearchScene::Matcher::Matcher(const G4String& requiredMatch) fRequiredMatch = requiredMatch; } } - if (fRequiredMatch.isNull()) { + if (fRequiredMatch.empty()) { G4Exception ("G4PhysicalVolumesSearchScene::Matcher::Matcher", "modeling0013", JustWarning, "Required match is null"); diff --git a/source/visualization/modeling/src/G4ScaleModel.cc b/source/visualization/modeling/src/G4PlotterModel.cc similarity index 64% rename from source/visualization/modeling/src/G4ScaleModel.cc rename to source/visualization/modeling/src/G4PlotterModel.cc index 31a5450f07..cde1fb354e 100644 --- a/source/visualization/modeling/src/G4ScaleModel.cc +++ b/source/visualization/modeling/src/G4PlotterModel.cc @@ -22,39 +22,32 @@ // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** -// -// -// // -// John Allison 21st July 2001. -// Model which knows how to draw scale. +// Guy Barrand 25th September 2021 -#include "G4ScaleModel.hh" +#include "G4PlotterModel.hh" -#include "G4ModelingParameters.hh" #include "G4VGraphicsScene.hh" -G4ScaleModel::~G4ScaleModel () {} - -G4ScaleModel::G4ScaleModel (const G4Scale& scale): fScale(scale) { - fType = "G4ScaleModel"; - fGlobalTag = "G4ScaleModel: " + fScale.GetAnnotation(); - switch (fScale.GetDirection()) { - case G4Scale::x: - fGlobalTag += " x"; - break; - case G4Scale::y: - fGlobalTag += " y"; - break; - case G4Scale::z: - fGlobalTag += " z"; - break; - } - fGlobalDescription = fGlobalTag; +G4PlotterModel::G4PlotterModel(G4Plotter& a_plotter,const G4String& description,const G4Transform3D& a_transform) +:fPlotter(a_plotter),fTransform(a_transform) +{ + fType = "G4PlotterModel"; + fGlobalTag = fType; + fGlobalDescription = fType + ": " + description; + // Have the extent so that the viewer will have an ortho camera + // with a height of 1 in order to map the tools::sg::plots height of 1: + // radius = sqrt(half_x*half_x+half_y*half_y+half_z*half_z); + // radius = sqrt(3*half*half) + // half = sqrt(radius*radius/3) + double radius = 0.5; + double half = ::sqrt(radius*radius/3.0); + fExtent = G4VisExtent(-half,half,-half,half,-half,half); //x,y,z min/max. } -void G4ScaleModel::DescribeYourselfTo (G4VGraphicsScene& sceneHandler) { - sceneHandler.BeginPrimitives (); - sceneHandler.AddPrimitive (fScale); - sceneHandler.EndPrimitives (); +void G4PlotterModel::DescribeYourselfTo (G4VGraphicsScene& sceneHandler) +{ + sceneHandler.BeginPrimitives(fTransform); + sceneHandler.AddPrimitive(fPlotter); + sceneHandler.EndPrimitives(); } diff --git a/source/visualization/modeling/src/G4TextModel.cc b/source/visualization/modeling/src/G4TextModel.cc index e455c481fb..f6808890c6 100644 --- a/source/visualization/modeling/src/G4TextModel.cc +++ b/source/visualization/modeling/src/G4TextModel.cc @@ -39,9 +39,8 @@ G4TextModel::~G4TextModel () {} -G4TextModel::G4TextModel (const G4Text& g4Text) +G4TextModel::G4TextModel (const G4Text& g4Text, const G4Transform3D& transform) : fG4Text(g4Text) -, fG4TextOrig(g4Text) { fType = "G4TextModel"; std::ostringstream oss; @@ -51,12 +50,7 @@ G4TextModel::G4TextModel (const G4Text& g4Text) << " with offsets " << g4Text.GetXOffset() << ',' << g4Text.GetYOffset(); fGlobalTag = oss.str(); fGlobalDescription = fGlobalTag; -} -void G4TextModel::SetTransformation (const G4Transform3D& transform) -{ - fTransform = transform; - fG4Text = fG4TextOrig; fG4Text.SetPosition(fG4Text.GetPosition()+transform.getTranslation()); } diff --git a/source/visualization/modeling/src/G4TouchablePropertiesScene.cc b/source/visualization/modeling/src/G4TouchablePropertiesScene.cc index f69e11c744..75600275c8 100644 --- a/source/visualization/modeling/src/G4TouchablePropertiesScene.cc +++ b/source/visualization/modeling/src/G4TouchablePropertiesScene.cc @@ -67,7 +67,7 @@ void G4TouchablePropertiesScene::ProcessVolume (const G4VSolid& /*solid*/) { fFoundTouchableProperties.fTouchablePath = fRequiredTouchable; fFoundTouchableProperties.fpTouchablePV = fpSearchPVModel->GetCurrentPV(); fFoundTouchableProperties.fCopyNo = fpSearchPVModel->GetCurrentPVCopyNo(); - fFoundTouchableProperties.fTouchableGlobalTransform = *fpSearchPVModel->GetCurrentTransform(); + fFoundTouchableProperties.fTouchableGlobalTransform = fpSearchPVModel->GetCurrentTransform(); fFoundTouchableProperties.fTouchableBaseFullPVPath = fpSearchPVModel->GetFullPVPath(); // Base path is one down from found PV fFoundTouchableProperties.fTouchableBaseFullPVPath.pop_back(); diff --git a/source/visualization/modeling/src/G4TrajectoryDrawByAttribute.cc b/source/visualization/modeling/src/G4TrajectoryDrawByAttribute.cc index 60e5d3c888..4e099659f8 100644 --- a/source/visualization/modeling/src/G4TrajectoryDrawByAttribute.cc +++ b/source/visualization/modeling/src/G4TrajectoryDrawByAttribute.cc @@ -62,7 +62,7 @@ G4TrajectoryDrawByAttribute::Draw(const G4VTrajectory& object, const G4bool& /*visible*/) const { // Return if attribute name has not been set. Just print one warning - if (fAttName.isNull()) { + if (fAttName.empty()) { if (!fWarnedMissingAttribute) { G4ExceptionDescription ed; diff --git a/source/visualization/modeling/src/G4TrajectoryDrawByEncounteredVolume.cc b/source/visualization/modeling/src/G4TrajectoryDrawByEncounteredVolume.cc index 57180db029..bc806d446b 100644 --- a/source/visualization/modeling/src/G4TrajectoryDrawByEncounteredVolume.cc +++ b/source/visualization/modeling/src/G4TrajectoryDrawByEncounteredVolume.cc @@ -62,7 +62,7 @@ G4TrajectoryDrawByEncounteredVolume::Draw(const G4VTrajectory& traj, const G4boo std::vector::const_iterator iAtt; for (iAtt = attValues->begin(); iAtt != attValues->end(); ++iAtt) { if (iAtt->GetName() == "PostVPath" && - iAtt->GetValue().contains(soughtPVName)) break; + G4StrUtil::contains(iAtt->GetValue(), soughtPVName)) break; } if (iAtt != attValues->end()) { // Required value found fMap.GetColour(soughtPVName, colour); diff --git a/source/visualization/modeling/src/G4TrajectoryEncounteredVolumeFilter.cc b/source/visualization/modeling/src/G4TrajectoryEncounteredVolumeFilter.cc index f02169dbae..0ca8d97b26 100644 --- a/source/visualization/modeling/src/G4TrajectoryEncounteredVolumeFilter.cc +++ b/source/visualization/modeling/src/G4TrajectoryEncounteredVolumeFilter.cc @@ -56,7 +56,7 @@ G4TrajectoryEncounteredVolumeFilter::Evaluate(const G4VTrajectory& traj) const std::vector::const_iterator iAtt; for (iAtt = attValues->begin(); iAtt != attValues->end(); ++iAtt) { if (iAtt->GetName() == "PostVPath" && - iAtt->GetValue().contains(pvname)) break; + G4StrUtil::contains(iAtt->GetValue(),pvname)) break; } if (iAtt != attValues->end()) { // Required value found return true; // First found pvname determines selection. diff --git a/source/visualization/modeling/src/G4VModel.cc b/source/visualization/modeling/src/G4VModel.cc index e056da7abb..8764823da2 100644 --- a/source/visualization/modeling/src/G4VModel.cc +++ b/source/visualization/modeling/src/G4VModel.cc @@ -34,12 +34,10 @@ #include "G4RotationMatrix.hh" #include "G4ModelingParameters.hh" -G4VModel::G4VModel (const G4Transform3D& modelTransformation, - const G4ModelingParameters* pMP): +G4VModel::G4VModel (const G4ModelingParameters* pMP): fType ("Other"), fGlobalTag ("Empty"), fGlobalDescription ("Empty"), - fTransform (modelTransformation), fpMP (pMP) {} @@ -55,17 +53,6 @@ G4String G4VModel::GetCurrentDescription () const { return fGlobalDescription; } -const G4VisExtent& G4VModel::GetTransformedExtent () const { - static G4VisExtent transformedExtent; - transformedExtent = fExtent; - transformedExtent.Transform(fTransform); - return transformedExtent; -} - -void G4VModel::SetTransformation (const G4Transform3D& transform) { - fTransform = transform; -} - G4bool G4VModel::Validate (G4bool) { return true; } @@ -77,15 +64,5 @@ std::ostream& operator << (std::ostream& os, const G4VModel& model) { if (mp) os << "\n " << *mp; else os << " none."; os << "\n Extent: " << model.fExtent; - os << "\n Transformation: "; - os << "\n Rotation: "; - G4RotationMatrix rotation = model.fTransform.getRotation (); - os << rotation.thetaX() << ", " - << rotation.phiX() << ", " - << rotation.thetaY() << ", " - << rotation.phiY() << ", " - << rotation.thetaZ() << ", " - << rotation.phiZ(); - os << "\n Translation: " << model.fTransform.getTranslation (); return os; }

      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∋Li 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�|ODCj~R=}eLnH@^xfIn>kP){fUwDQGR?)s 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%0At)<@d+O8>ReWJU0}$cW-&`-oLzbsn0JmIJ>fP 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 G#rYrT3XxL) diff --git a/examples/advanced/ChargeExchangeMC/doc/CexmcUsersManual.pdf b/examples/advanced/ChargeExchangeMC/doc/CexmcUsersManual.pdf deleted file mode 100644 index 07098bd8d4fe0325e2a292413c37c4515f53c0bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544235 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�=UJVHI!Cahmg@qysDs|YT`36OPh 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�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

- - - - - - - diff --git a/environments/MOMO/momo-src.jar b/environments/MOMO/momo-src.jar deleted file mode 100644 index 1b0d4922089d96baf0271e9df9399d22fbd7a858..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532895 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ŅkLz6J+qKwNly3yT^}Tl0)AZ1MPqC|58p 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